summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.hgignore1
-rw-r--r--doc/contributions.txt20
-rw-r--r--indra/cmake/APR.cmake9
-rw-r--r--indra/cmake/Boost.cmake12
-rw-r--r--indra/cmake/CARes.cmake1
-rw-r--r--indra/cmake/Copy3rdPartyLibs.cmake4
-rw-r--r--indra/cmake/GStreamer010Plugin.cmake1
-rw-r--r--indra/cmake/GoogleBreakpad.cmake19
-rw-r--r--indra/cmake/LLAddBuildTest.cmake43
-rw-r--r--indra/cmake/LLSharedLibs.cmake17
-rw-r--r--indra/cmake/LLTestCommand.cmake17
-rw-r--r--indra/cmake/PulseAudio.cmake28
-rw-r--r--indra/cmake/Variables.cmake31
-rw-r--r--indra/integration_tests/llui_libtest/llwidgetreg.cpp2
-rw-r--r--indra/lib/python/indra/util/llmanifest.py14
-rw-r--r--indra/linux_crash_logger/CMakeLists.txt11
-rw-r--r--indra/linux_crash_logger/llcrashloggerlinux.cpp1
-rw-r--r--indra/linux_updater/CMakeLists.txt11
-rw-r--r--indra/llaudio/CMakeLists.txt12
-rw-r--r--indra/llaudio/llaudioengine.cpp13
-rw-r--r--indra/llaudio/llaudioengine.h13
-rw-r--r--indra/llaudio/llaudioengine_fmod.cpp92
-rw-r--r--indra/llaudio/llaudioengine_fmod.h7
-rw-r--r--indra/llaudio/llaudioengine_openal.cpp10
-rw-r--r--indra/llaudio/llaudioengine_openal.h24
-rw-r--r--indra/llaudio/llstreamingaudio_fmod.cpp2
-rw-r--r--indra/llaudio/llwindgen.h165
-rw-r--r--indra/llcharacter/llanimationstates.cpp162
-rw-r--r--indra/llcharacter/llanimationstates.h286
-rw-r--r--indra/llcharacter/llcharacter.cpp25
-rw-r--r--indra/llcharacter/llcharacter.h20
-rw-r--r--indra/llcharacter/lleditingmotion.cpp2
-rw-r--r--indra/llcharacter/llkeyframemotion.cpp7
-rw-r--r--indra/llcharacter/llkeyframewalkmotion.cpp249
-rw-r--r--indra/llcharacter/llkeyframewalkmotion.h8
-rw-r--r--indra/llcharacter/llmotioncontroller.cpp29
-rw-r--r--indra/llcharacter/llmotioncontroller.h5
-rw-r--r--indra/llcharacter/llmultigesture.cpp4
-rw-r--r--indra/llcharacter/llvisualparam.cpp2
-rw-r--r--indra/llcommon/CMakeLists.txt8
-rw-r--r--indra/llcommon/llapp.cpp231
-rw-r--r--indra/llcommon/llapp.h27
-rw-r--r--indra/llcommon/llapr.cpp11
-rw-r--r--indra/llcommon/llapr.h8
-rw-r--r--indra/llcommon/llassettype.cpp86
-rw-r--r--indra/llcommon/llassettype.h3
-rw-r--r--indra/llcommon/llchat.h8
-rw-r--r--indra/llcommon/llcommonutils.cpp61
-rw-r--r--indra/llcommon/llcommonutils.h56
-rw-r--r--indra/llcommon/llcursortypes.cpp3
-rw-r--r--indra/llcommon/llcursortypes.h3
-rw-r--r--indra/llcommon/lldate.cpp23
-rw-r--r--indra/llcommon/llerror.cpp26
-rw-r--r--indra/llcommon/llerror.h2
-rw-r--r--indra/llcommon/lleventtimer.cpp95
-rw-r--r--indra/llcommon/lleventtimer.h60
-rw-r--r--indra/llcommon/llfasttimer.h24
-rw-r--r--indra/llcommon/llfasttimer_class.cpp120
-rw-r--r--indra/llcommon/llinstancetracker.cpp20
-rw-r--r--indra/llcommon/llinstancetracker.h69
-rw-r--r--indra/llcommon/lllivefile.cpp2
-rw-r--r--indra/llcommon/llprocessor.cpp2803
-rw-r--r--indra/llcommon/llprocessor.h169
-rw-r--r--indra/llcommon/llqueuedthread.cpp5
-rw-r--r--indra/llcommon/llsdserialize_xml.cpp15
-rw-r--r--indra/llcommon/llstring.cpp121
-rw-r--r--indra/llcommon/llstring.h26
-rw-r--r--indra/llcommon/llsys.cpp108
-rw-r--r--indra/llcommon/llsys.h4
-rw-r--r--indra/llcommon/llthread.h2
-rw-r--r--indra/llcommon/lltimer.cpp59
-rw-r--r--indra/llcommon/lltimer.h22
-rw-r--r--indra/llcommon/lluri.cpp3
-rw-r--r--indra/llcommon/lluuid.cpp162
-rw-r--r--indra/llcommon/lluuid.h1
-rw-r--r--indra/llcommon/llversionserver.h6
-rw-r--r--indra/llcommon/llversionviewer.h4
-rw-r--r--indra/llcommon/llworkerthread.cpp38
-rw-r--r--indra/llcommon/llworkerthread.h3
-rw-r--r--indra/llcommon/tests/llerror_test.cpp9
-rw-r--r--indra/llcommon/tests/llinstancetracker_test.cpp28
-rw-r--r--indra/llcommon/tests/llprocessor_test.cpp67
-rwxr-xr-xindra/llcrashlogger/llcrashlogger.cpp55
-rw-r--r--indra/llimage/CMakeLists.txt2
-rw-r--r--indra/llimage/llimage.cpp34
-rw-r--r--indra/llimage/llimage.h14
-rw-r--r--indra/llimage/llimagedimensionsinfo.cpp139
-rw-r--r--indra/llimage/llimagedimensionsinfo.h139
-rw-r--r--indra/llimage/llimagepng.cpp20
-rw-r--r--indra/llimage/llimagepng.h3
-rw-r--r--indra/llimage/llimageworker.cpp11
-rw-r--r--indra/llinventory/CMakeLists.txt2
-rw-r--r--indra/llinventory/llinventory.cpp108
-rw-r--r--indra/llinventory/llinventory.h301
-rw-r--r--indra/llinventory/llinventorydefines.cpp37
-rw-r--r--indra/llinventory/llinventorydefines.h106
-rw-r--r--indra/llinventory/llinventorytype.cpp4
-rw-r--r--indra/llinventory/llinventorytype.h1
-rw-r--r--indra/llinventory/llparcel.cpp2
-rw-r--r--indra/llinventory/llparcel.h4
-rw-r--r--indra/llinventory/llpermissions.cpp2
-rw-r--r--indra/llinventory/llpermissions.h32
-rw-r--r--indra/llmath/llmath.h15
-rw-r--r--indra/llmath/llvolume.cpp202
-rw-r--r--indra/llmath/llvolume.h4
-rw-r--r--indra/llmath/tests/mathmisc_test.cpp2
-rw-r--r--indra/llmath/v2math.h9
-rw-r--r--indra/llmessage/llares.cpp6
-rw-r--r--indra/llmessage/llassetstorage.cpp133
-rw-r--r--indra/llmessage/llassetstorage.h9
-rw-r--r--indra/llmessage/llcachename.cpp4
-rw-r--r--indra/llmessage/llcurl.cpp36
-rw-r--r--indra/llmessage/llcurl.h12
-rw-r--r--indra/llmessage/llhttpassetstorage.cpp8
-rw-r--r--indra/llmessage/llhttpassetstorage.h5
-rw-r--r--indra/llmessage/llhttpclient.cpp21
-rw-r--r--indra/llmessage/llhttpclient.h11
-rw-r--r--indra/llmessage/llinstantmessage.cpp1
-rw-r--r--indra/llmessage/llinstantmessage.h1
-rw-r--r--indra/llmessage/lltemplatemessagebuilder.cpp2
-rw-r--r--indra/llmessage/lltemplatemessagereader.cpp5
-rw-r--r--indra/llmessage/lltransfersourceasset.cpp51
-rw-r--r--indra/llmessage/lltransfersourceasset.h20
-rw-r--r--indra/llmessage/llurlrequest.cpp51
-rw-r--r--indra/llmessage/llurlrequest.h68
-rw-r--r--indra/llmessage/message_prehash.cpp2
-rw-r--r--indra/llmessage/tests/llareslistener_test.cpp2
-rw-r--r--indra/llplugin/CMakeLists.txt19
-rw-r--r--indra/llplugin/llpluginclassmedia.cpp77
-rw-r--r--indra/llplugin/llpluginclassmedia.h23
-rw-r--r--indra/llplugin/llpluginclassmediaowner.h2
-rw-r--r--indra/llplugin/llplugincookiestore.cpp669
-rw-r--r--indra/llplugin/llplugincookiestore.h125
-rw-r--r--indra/llplugin/llpluginmessagepipe.cpp128
-rw-r--r--indra/llplugin/llpluginmessagepipe.h9
-rw-r--r--indra/llplugin/llpluginprocesschild.cpp102
-rw-r--r--indra/llplugin/llpluginprocesschild.h7
-rw-r--r--indra/llplugin/llpluginprocessparent.cpp461
-rw-r--r--indra/llplugin/llpluginprocessparent.h37
-rw-r--r--indra/llplugin/slplugin/CMakeLists.txt20
-rw-r--r--indra/llplugin/slplugin/slplugin.cpp105
-rw-r--r--indra/llplugin/slplugin/slplugin_info.plist4
-rw-r--r--indra/llplugin/tests/llplugincookiestore_test.cpp211
-rw-r--r--indra/llrender/llfontfreetype.cpp32
-rw-r--r--indra/llrender/llfontfreetype.h2
-rw-r--r--indra/llrender/llfontgl.cpp87
-rw-r--r--indra/llrender/llfontregistry.cpp2
-rw-r--r--indra/llrender/llimagegl.cpp48
-rw-r--r--indra/llrender/llimagegl.h2
-rw-r--r--indra/llrender/llrender.cpp179
-rw-r--r--indra/llrender/llrender.h23
-rw-r--r--indra/llrender/llrendersphere.cpp86
-rw-r--r--indra/llrender/llrendersphere.h4
-rw-r--r--indra/llui/CMakeLists.txt16
-rw-r--r--indra/llui/llaccordionctrl.cpp267
-rw-r--r--indra/llui/llaccordionctrl.h64
-rw-r--r--indra/llui/llaccordionctrltab.cpp460
-rw-r--r--indra/llui/llaccordionctrltab.h65
-rw-r--r--indra/llui/llbutton.cpp60
-rw-r--r--indra/llui/llbutton.h31
-rw-r--r--indra/llui/llcombobox.cpp69
-rw-r--r--indra/llui/llcombobox.h36
-rw-r--r--indra/llui/llconsole.cpp62
-rw-r--r--indra/llui/llconsole.h11
-rw-r--r--indra/llui/lldockablefloater.cpp8
-rw-r--r--indra/llui/lldockcontrol.cpp41
-rw-r--r--indra/llui/lldockcontrol.h5
-rw-r--r--indra/llui/lldraghandle.cpp7
-rw-r--r--indra/llui/lldraghandle.h3
-rw-r--r--indra/llui/lleditmenuhandler.cpp7
-rw-r--r--indra/llui/lleditmenuhandler.h2
-rw-r--r--indra/llui/llfiltereditor.cpp1
-rw-r--r--indra/llui/llflatlistview.cpp332
-rw-r--r--indra/llui/llflatlistview.h87
-rw-r--r--indra/llui/llfloater.cpp169
-rw-r--r--indra/llui/llfloater.h26
-rw-r--r--indra/llui/llfloaterreg.cpp26
-rw-r--r--indra/llui/llfloaterreg.h5
-rw-r--r--indra/llui/llfocusmgr.cpp51
-rw-r--r--indra/llui/llfocusmgr.h10
-rw-r--r--indra/llui/llhandle.h7
-rw-r--r--indra/llui/lliconctrl.h1
-rw-r--r--indra/llui/llkeywords.cpp136
-rw-r--r--indra/llui/llkeywords.h32
-rw-r--r--indra/llui/lllayoutstack.cpp43
-rw-r--r--indra/llui/lllayoutstack.h10
-rw-r--r--indra/llui/lllineeditor.cpp396
-rw-r--r--indra/llui/lllineeditor.h33
-rw-r--r--indra/llui/llloadingindicator.cpp133
-rw-r--r--indra/llui/llloadingindicator.h93
-rw-r--r--indra/llui/llmenugl.cpp66
-rw-r--r--indra/llui/llmenugl.h12
-rw-r--r--indra/llui/llmodaldialog.cpp6
-rw-r--r--indra/llui/llmultifloater.cpp27
-rw-r--r--indra/llui/llmultifloater.h1
-rw-r--r--indra/llui/llmultisliderctrl.cpp9
-rw-r--r--indra/llui/llnotifications.cpp204
-rw-r--r--indra/llui/llnotifications.h108
-rw-r--r--indra/llui/llpanel.cpp20
-rw-r--r--indra/llui/llpanel.h10
-rw-r--r--indra/llui/llradiogroup.cpp8
-rw-r--r--indra/llui/llresizebar.cpp5
-rw-r--r--indra/llui/llresizehandle.cpp86
-rw-r--r--indra/llui/llscrollingpanellist.cpp28
-rw-r--r--indra/llui/llscrollingpanellist.h6
-rw-r--r--indra/llui/llscrolllistcell.cpp4
-rw-r--r--indra/llui/llscrolllistcell.h5
-rw-r--r--indra/llui/llscrolllistctrl.cpp45
-rw-r--r--indra/llui/llscrolllistctrl.h40
-rw-r--r--indra/llui/llsearcheditor.cpp16
-rw-r--r--indra/llui/llsearcheditor.h2
-rw-r--r--indra/llui/llsliderctrl.cpp10
-rw-r--r--indra/llui/llsliderctrl.h2
-rw-r--r--indra/llui/llspinctrl.cpp16
-rw-r--r--indra/llui/llspinctrl.h1
-rw-r--r--indra/llui/lltabcontainer.cpp209
-rw-r--r--indra/llui/lltabcontainer.h34
-rw-r--r--indra/llui/lltextbase.cpp493
-rw-r--r--indra/llui/lltextbase.h51
-rw-r--r--indra/llui/lltexteditor.cpp355
-rw-r--r--indra/llui/lltexteditor.h23
-rw-r--r--indra/llui/lltextparser.cpp40
-rw-r--r--indra/llui/lltextparser.h15
-rw-r--r--indra/llui/lltextutil.cpp79
-rw-r--r--indra/llui/lltextutil.h72
-rw-r--r--indra/llui/lltextvalidate.cpp302
-rw-r--r--indra/llui/lltextvalidate.h63
-rw-r--r--indra/llui/lltooltip.cpp6
-rw-r--r--indra/llui/lltooltip.h5
-rw-r--r--indra/llui/llui.cpp172
-rw-r--r--indra/llui/llui.h18
-rw-r--r--indra/llui/lluicolortable.cpp29
-rw-r--r--indra/llui/lluicolortable.h9
-rw-r--r--indra/llui/lluictrlfactory.cpp5
-rw-r--r--indra/llui/lluifwd.h1
-rw-r--r--indra/llui/lluiimage.h1
-rw-r--r--indra/llui/llurlaction.cpp17
-rw-r--r--indra/llui/llurlaction.h3
-rw-r--r--indra/llui/llurlentry.cpp169
-rw-r--r--indra/llui/llurlentry.h33
-rw-r--r--indra/llui/llurlmatch.cpp3
-rw-r--r--indra/llui/llurlmatch.h7
-rw-r--r--indra/llui/llurlregistry.cpp16
-rw-r--r--indra/llui/llview.cpp76
-rw-r--r--indra/llui/llview.h7
-rw-r--r--indra/llui/llviewborder.cpp58
-rw-r--r--indra/llui/llviewborder.h3
-rw-r--r--indra/llui/tests/llurlentry_test.cpp26
-rw-r--r--indra/llui/tests/llurlmatch_test.cpp30
-rw-r--r--indra/llvfs/lldir.cpp48
-rw-r--r--indra/llvfs/lldir.h4
-rw-r--r--indra/llvfs/lldir_mac.cpp2
-rw-r--r--indra/llvfs/lllfsthread.cpp6
-rw-r--r--indra/llwindow/CMakeLists.txt1
-rw-r--r--indra/llwindow/lldragdropwin32.cpp3
-rw-r--r--indra/llwindow/llwindow.h6
-rw-r--r--indra/llwindow/llwindowmacosx.cpp80
-rw-r--r--indra/llwindow/llwindowmacosx.h7
-rw-r--r--indra/llwindow/llwindowsdl.cpp169
-rw-r--r--indra/llwindow/llwindowsdl.h15
-rw-r--r--indra/llwindow/llwindowwin32.cpp125
-rw-r--r--indra/llwindow/llwindowwin32.h8
-rw-r--r--indra/llxuixml/llinitparam.cpp48
-rw-r--r--indra/llxuixml/llinitparam.h183
-rw-r--r--indra/llxuixml/llxuiparser.cpp36
-rw-r--r--indra/lscript/lscript_compile/lscript_tree.cpp17
-rw-r--r--indra/lscript/lscript_compile/lscript_tree.h4
-rw-r--r--indra/lscript/lscript_execute/lscript_execute.cpp2
-rw-r--r--indra/mac_crash_logger/llcrashloggermac.cpp83
-rw-r--r--indra/mac_updater/CMakeLists.txt14
-rw-r--r--indra/mac_updater/mac_updater.cpp57
-rw-r--r--indra/media_plugins/CMakeLists.txt4
-rw-r--r--indra/media_plugins/example/media_plugin_example.cpp26
-rw-r--r--indra/media_plugins/gstreamer010/CMakeLists.txt6
-rw-r--r--indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp126
-rw-r--r--indra/media_plugins/quicktime/media_plugin_quicktime.cpp66
-rw-r--r--indra/media_plugins/webkit/CMakeLists.txt40
-rw-r--r--indra/media_plugins/webkit/dummy_volume_catcher.cpp63
-rw-r--r--indra/media_plugins/webkit/linux_volume_catcher.cpp468
-rw-r--r--indra/media_plugins/webkit/linux_volume_catcher_pa_syms.inc21
-rw-r--r--indra/media_plugins/webkit/linux_volume_catcher_paglib_syms.inc6
-rw-r--r--indra/media_plugins/webkit/mac_volume_catcher.cpp273
-rw-r--r--indra/media_plugins/webkit/media_plugin_webkit.cpp484
-rw-r--r--indra/media_plugins/webkit/volume_catcher.h59
-rw-r--r--indra/media_plugins/webkit/windows_volume_catcher.cpp122
-rw-r--r--indra/media_plugins/winmmshim/CMakeLists.txt34
-rw-r--r--indra/media_plugins/winmmshim/forwarding_api.cpp1460
-rw-r--r--indra/media_plugins/winmmshim/forwarding_api.h395
-rw-r--r--indra/media_plugins/winmmshim/winmm.def218
-rw-r--r--indra/media_plugins/winmmshim/winmm_shim.cpp194
-rw-r--r--indra/newview/CMakeLists.txt252
-rw-r--r--indra/newview/English.lproj/InfoPlist.strings4
-rw-r--r--indra/newview/Info-SecondLife.plist30
-rw-r--r--indra/newview/app_settings/CA.pem3316
-rw-r--r--indra/newview/app_settings/ignorable_dialogs.xml11
-rw-r--r--indra/newview/app_settings/keywords.ini1
-rw-r--r--indra/newview/app_settings/logcontrol.xml3
-rw-r--r--indra/newview/app_settings/low_graphics.xml2
-rw-r--r--indra/newview/app_settings/settings.xml1236
-rw-r--r--indra/newview/app_settings/settings_per_account.xml81
-rw-r--r--indra/newview/character/avatar_lad.xml266
-rw-r--r--indra/newview/cursors_mac/UI_CURSOR_TOOLBUY.tifbin0 -> 59044 bytes
-rw-r--r--indra/newview/cursors_mac/UI_CURSOR_TOOLOPEN.tifbin0 -> 58560 bytes
-rw-r--r--indra/newview/cursors_mac/UI_CURSOR_TOOLSIT.tifbin0 -> 58464 bytes
-rw-r--r--indra/newview/featuretable.txt20
-rw-r--r--indra/newview/featuretable_linux.txt14
-rw-r--r--indra/newview/featuretable_mac.txt14
-rw-r--r--indra/newview/featuretable_solaris.txt1
-rw-r--r--indra/newview/generate_breakpad_symbols.py135
-rw-r--r--indra/newview/gpu_table.txt94
-rw-r--r--indra/newview/installers/darwin/release-dmg/_DS_Storebin12292 -> 12292 bytes
-rw-r--r--indra/newview/installers/windows/install_icon.icobin25214 -> 367958 bytes
-rw-r--r--indra/newview/installers/windows/installer_template.nsi6
-rw-r--r--indra/newview/installers/windows/uninstall_icon.icobin25214 -> 367958 bytes
-rw-r--r--indra/newview/linux_tools/client-readme.txt9
-rwxr-xr-xindra/newview/linux_tools/wrapper.sh10
-rw-r--r--indra/newview/llagent.cpp3183
-rw-r--r--indra/newview/llagent.h358
-rw-r--r--indra/newview/llagentaccess.cpp11
-rw-r--r--indra/newview/llagentaccess.h1
-rw-r--r--indra/newview/llagentcamera.cpp2852
-rw-r--r--indra/newview/llagentcamera.h401
-rw-r--r--indra/newview/llagentlistener.cpp5
-rw-r--r--indra/newview/llagentui.cpp36
-rw-r--r--indra/newview/llagentui.h4
-rw-r--r--indra/newview/llagentwearables.cpp1599
-rw-r--r--indra/newview/llagentwearables.h141
-rw-r--r--indra/newview/llagentwearablesfetch.cpp574
-rw-r--r--indra/newview/llagentwearablesfetch.h118
-rw-r--r--indra/newview/llappearancemgr.cpp2037
-rw-r--r--indra/newview/llappearancemgr.h220
-rw-r--r--indra/newview/llappviewer.cpp497
-rw-r--r--indra/newview/llappviewer.h6
-rw-r--r--indra/newview/llappviewerlinux.cpp228
-rw-r--r--indra/newview/llappviewerlinux.h1
-rw-r--r--indra/newview/llappviewermacosx.cpp83
-rw-r--r--indra/newview/llappviewermacosx.h1
-rw-r--r--indra/newview/llappviewerwin32.cpp75
-rw-r--r--indra/newview/llappviewerwin32.h1
-rw-r--r--indra/newview/llassetuploadresponders.cpp15
-rw-r--r--indra/newview/llassetuploadresponders.h2
-rw-r--r--indra/newview/llaudiosourcevo.cpp4
-rw-r--r--indra/newview/llavataractions.cpp298
-rw-r--r--indra/newview/llavataractions.h24
-rw-r--r--indra/newview/llavatariconctrl.cpp5
-rw-r--r--indra/newview/llavatarlist.cpp174
-rw-r--r--indra/newview/llavatarlist.h55
-rw-r--r--indra/newview/llavatarlistitem.cpp60
-rw-r--r--indra/newview/llavatarlistitem.h10
-rw-r--r--indra/newview/llavatarpropertiesprocessor.cpp5
-rw-r--r--indra/newview/llavatarpropertiesprocessor.h2
-rw-r--r--indra/newview/llbottomtray.cpp717
-rw-r--r--indra/newview/llbottomtray.h213
-rw-r--r--indra/newview/llbuycurrencyhtml.cpp165
-rw-r--r--indra/newview/llbuycurrencyhtml.h57
-rw-r--r--indra/newview/llcallfloater.cpp128
-rw-r--r--indra/newview/llcallfloater.h22
-rw-r--r--indra/newview/llcallingcard.cpp21
-rw-r--r--indra/newview/llchannelmanager.cpp61
-rw-r--r--indra/newview/llchannelmanager.h5
-rw-r--r--indra/newview/llchatbar.cpp15
-rw-r--r--indra/newview/llchathistory.cpp270
-rw-r--r--indra/newview/llchathistory.h4
-rw-r--r--indra/newview/llchatitemscontainerctrl.cpp14
-rw-r--r--indra/newview/llchatitemscontainerctrl.h3
-rw-r--r--indra/newview/llchiclet.cpp236
-rw-r--r--indra/newview/llchiclet.h75
-rw-r--r--indra/newview/llclassifiedstatsresponder.cpp24
-rw-r--r--indra/newview/llclassifiedstatsresponder.h3
-rw-r--r--indra/newview/llcloud.cpp22
-rw-r--r--indra/newview/llcofwearables.cpp616
-rw-r--r--indra/newview/llcofwearables.h118
-rw-r--r--indra/newview/llcolorswatch.cpp8
-rw-r--r--indra/newview/llcolorswatch.h2
-rw-r--r--indra/newview/llcompilequeue.cpp26
-rw-r--r--indra/newview/llcompilequeue.h12
-rw-r--r--indra/newview/llcurrencyuimanager.cpp4
-rw-r--r--indra/newview/lldateutil.cpp35
-rw-r--r--indra/newview/lldateutil.h23
-rw-r--r--indra/newview/lldebugview.cpp2
-rw-r--r--indra/newview/lldrawable.cpp24
-rw-r--r--indra/newview/lldrawpool.cpp5
-rw-r--r--indra/newview/lldrawpoolalpha.cpp9
-rw-r--r--indra/newview/lldrawpoolavatar.cpp8
-rw-r--r--indra/newview/lldrawpoolbump.cpp11
-rw-r--r--indra/newview/lldrawpooltree.cpp17
-rw-r--r--indra/newview/lldriverparam.cpp23
-rw-r--r--indra/newview/lldriverparam.h4
-rw-r--r--indra/newview/lldynamictexture.cpp2
-rw-r--r--indra/newview/lldynamictexture.h13
-rw-r--r--indra/newview/lleventpoll.cpp2
-rw-r--r--indra/newview/llexpandabletextbox.cpp11
-rw-r--r--indra/newview/llexpandabletextbox.h2
-rw-r--r--indra/newview/llface.cpp135
-rw-r--r--indra/newview/llface.h7
-rw-r--r--indra/newview/llfasttimerview.cpp29
-rw-r--r--indra/newview/llfasttimerview.h4
-rw-r--r--indra/newview/llfavoritesbar.cpp68
-rw-r--r--indra/newview/llfeaturemanager.cpp149
-rw-r--r--indra/newview/llfeaturemanager.h6
-rw-r--r--indra/newview/llfilteredwearablelist.cpp100
-rw-r--r--indra/newview/llfilteredwearablelist.h71
-rw-r--r--indra/newview/llflexibleobject.cpp15
-rw-r--r--indra/newview/llfloaterabout.cpp36
-rw-r--r--indra/newview/llfloateranimpreview.cpp10
-rw-r--r--indra/newview/llfloateranimpreview.h2
-rw-r--r--indra/newview/llfloaterauction.cpp3
-rw-r--r--indra/newview/llfloateravatarpicker.cpp101
-rw-r--r--indra/newview/llfloateravatarpicker.h14
-rw-r--r--indra/newview/llfloateravatartextures.cpp120
-rw-r--r--indra/newview/llfloaterbeacons.cpp10
-rw-r--r--indra/newview/llfloaterbulkpermission.cpp9
-rw-r--r--indra/newview/llfloaterbulkpermission.h4
-rw-r--r--indra/newview/llfloaterbuy.cpp19
-rw-r--r--indra/newview/llfloaterbuy.h2
-rw-r--r--indra/newview/llfloaterbuycontents.cpp13
-rw-r--r--indra/newview/llfloaterbuycontents.h2
-rw-r--r--indra/newview/llfloaterbuycurrency.cpp3
-rw-r--r--indra/newview/llfloaterbuycurrencyhtml.cpp128
-rw-r--r--indra/newview/llfloaterbuycurrencyhtml.h65
-rw-r--r--indra/newview/llfloaterbuyland.cpp37
-rw-r--r--indra/newview/llfloatercamera.cpp325
-rw-r--r--indra/newview/llfloatercamera.h71
-rw-r--r--indra/newview/llfloaterchat.cpp2
-rw-r--r--indra/newview/llfloaterchatterbox.cpp2
-rw-r--r--indra/newview/llfloaterevent.cpp356
-rw-r--r--indra/newview/llfloaterevent.h97
-rw-r--r--indra/newview/llfloaterfriends.cpp2
-rw-r--r--indra/newview/llfloatergesture.cpp99
-rw-r--r--indra/newview/llfloatergesture.h2
-rw-r--r--indra/newview/llfloatergodtools.cpp64
-rw-r--r--indra/newview/llfloatergodtools.h5
-rw-r--r--indra/newview/llfloatergroupinvite.cpp2
-rw-r--r--indra/newview/llfloatergroupinvite.h2
-rw-r--r--indra/newview/llfloaterhardwaresettings.cpp7
-rw-r--r--indra/newview/llfloaterhud.cpp3
-rw-r--r--indra/newview/llfloaterimagepreview.cpp49
-rw-r--r--indra/newview/llfloaterimagepreview.h7
-rw-r--r--indra/newview/llfloaterinventory.cpp43
-rw-r--r--indra/newview/llfloaterinventory.h5
-rw-r--r--indra/newview/llfloaterlagmeter.cpp26
-rw-r--r--indra/newview/llfloaterlagmeter.h2
-rw-r--r--indra/newview/llfloaterland.cpp148
-rw-r--r--indra/newview/llfloaterland.h11
-rw-r--r--indra/newview/llfloatermap.cpp43
-rw-r--r--indra/newview/llfloatermap.h4
-rw-r--r--indra/newview/llfloatermediasettings.cpp8
-rw-r--r--indra/newview/llfloaternamedesc.cpp4
-rw-r--r--indra/newview/llfloaternotificationsconsole.cpp26
-rw-r--r--indra/newview/llfloateropenobject.cpp4
-rw-r--r--indra/newview/llfloaterpay.cpp2
-rw-r--r--indra/newview/llfloaterpreference.cpp389
-rw-r--r--indra/newview/llfloaterpreference.h13
-rw-r--r--indra/newview/llfloaterproperties.cpp32
-rw-r--r--indra/newview/llfloaterregioninfo.cpp16
-rw-r--r--indra/newview/llfloaterregioninfo.h8
-rw-r--r--indra/newview/llfloaterreporter.cpp19
-rw-r--r--indra/newview/llfloaterreporter.h2
-rw-r--r--indra/newview/llfloaterscriptdebug.cpp8
-rw-r--r--indra/newview/llfloaterscriptlimits.cpp138
-rw-r--r--indra/newview/llfloaterscriptlimits.h49
-rw-r--r--indra/newview/llfloatersearch.cpp13
-rw-r--r--indra/newview/llfloatersellland.cpp17
-rw-r--r--indra/newview/llfloatersnapshot.cpp3
-rw-r--r--indra/newview/llfloatertools.cpp31
-rw-r--r--indra/newview/llfloatertools.h4
-rw-r--r--indra/newview/llfloatertopobjects.cpp11
-rw-r--r--indra/newview/llfloatertopobjects.h2
-rw-r--r--indra/newview/llfloatertos.cpp50
-rw-r--r--indra/newview/llfloatertos.h5
-rw-r--r--indra/newview/llfloateruipreview.cpp19
-rw-r--r--indra/newview/llfloaterurlentry.cpp8
-rw-r--r--indra/newview/llfloatervoicedevicesettings.cpp41
-rw-r--r--indra/newview/llfloatervoiceeffect.cpp288
-rw-r--r--indra/newview/llfloatervoiceeffect.h78
-rw-r--r--indra/newview/llfloaterwater.cpp2
-rw-r--r--indra/newview/llfloaterwindlight.cpp2
-rw-r--r--indra/newview/llfloaterworldmap.cpp45
-rw-r--r--indra/newview/llfloaterworldmap.h3
-rw-r--r--indra/newview/llfolderview.cpp154
-rw-r--r--indra/newview/llfolderview.h20
-rw-r--r--indra/newview/llfoldervieweventlistener.h4
-rw-r--r--indra/newview/llfolderviewitem.cpp467
-rw-r--r--indra/newview/llfolderviewitem.h14
-rw-r--r--indra/newview/llfriendcard.cpp46
-rw-r--r--indra/newview/llfriendcard.h4
-rw-r--r--indra/newview/llgesturemgr.cpp101
-rw-r--r--indra/newview/llgesturemgr.h8
-rw-r--r--indra/newview/llgiveinventory.cpp553
-rw-r--r--indra/newview/llgiveinventory.h100
-rw-r--r--indra/newview/llglsandbox.cpp117
-rw-r--r--indra/newview/llgroupactions.cpp13
-rw-r--r--indra/newview/llgroupactions.h5
-rw-r--r--indra/newview/llgrouplist.cpp38
-rw-r--r--indra/newview/llgrouplist.h19
-rw-r--r--indra/newview/llgroupmgr.cpp82
-rw-r--r--indra/newview/llgroupmgr.h22
-rw-r--r--indra/newview/llhudeffectlookat.cpp5
-rw-r--r--indra/newview/llhudeffectpointat.cpp3
-rw-r--r--indra/newview/llhudobject.cpp1
-rw-r--r--indra/newview/llhudrender.cpp16
-rw-r--r--indra/newview/llhudtext.cpp2
-rw-r--r--indra/newview/llimfloater.cpp215
-rw-r--r--indra/newview/llimfloater.h15
-rw-r--r--indra/newview/llimfloatercontainer.cpp102
-rw-r--r--indra/newview/llimfloatercontainer.h9
-rw-r--r--indra/newview/llimpanel.cpp14
-rw-r--r--indra/newview/llimview.cpp264
-rw-r--r--indra/newview/llimview.h46
-rw-r--r--indra/newview/llinspect.cpp21
-rw-r--r--indra/newview/llinspect.h1
-rw-r--r--indra/newview/llinspectavatar.cpp48
-rw-r--r--indra/newview/llinspectobject.cpp6
-rw-r--r--indra/newview/llinspectremoteobject.cpp4
-rw-r--r--indra/newview/llinventorybridge.cpp2239
-rw-r--r--indra/newview/llinventorybridge.h559
-rw-r--r--indra/newview/llinventoryfilter.cpp113
-rw-r--r--indra/newview/llinventoryfilter.h20
-rw-r--r--indra/newview/llinventoryfunctions.cpp746
-rw-r--r--indra/newview/llinventoryfunctions.h366
-rw-r--r--indra/newview/llinventoryicon.cpp181
-rw-r--r--indra/newview/llinventoryicon.h105
-rw-r--r--indra/newview/llinventoryitemslist.cpp522
-rw-r--r--indra/newview/llinventoryitemslist.h294
-rw-r--r--indra/newview/llinventorymodel.cpp1155
-rw-r--r--indra/newview/llinventorymodel.h894
-rw-r--r--indra/newview/llinventorymodelbackgroundfetch.cpp638
-rw-r--r--indra/newview/llinventorymodelbackgroundfetch.h108
-rw-r--r--indra/newview/llinventoryobserver.cpp562
-rw-r--r--indra/newview/llinventoryobserver.h276
-rw-r--r--indra/newview/llinventorypanel.cpp257
-rw-r--r--indra/newview/llinventorypanel.h71
-rw-r--r--indra/newview/lljoystickbutton.cpp186
-rw-r--r--indra/newview/lljoystickbutton.h40
-rw-r--r--indra/newview/lllandmarkactions.cpp5
-rw-r--r--indra/newview/lllistcontextmenu.cpp125
-rw-r--r--indra/newview/lllistcontextmenu.h84
-rw-r--r--indra/newview/lllocaltextureobject.cpp1
-rw-r--r--indra/newview/lllocationhistory.cpp8
-rw-r--r--indra/newview/lllocationhistory.h27
-rw-r--r--indra/newview/lllocationinputctrl.cpp251
-rw-r--r--indra/newview/lllocationinputctrl.h28
-rw-r--r--indra/newview/lllogchat.cpp128
-rw-r--r--indra/newview/llloginhandler.cpp208
-rw-r--r--indra/newview/llloginhandler.h11
-rw-r--r--indra/newview/lllogininstance.cpp88
-rw-r--r--indra/newview/lllogininstance.h7
-rw-r--r--indra/newview/llmachineid.cpp269
-rw-r--r--indra/newview/llmachineid.h56
-rw-r--r--indra/newview/llmanip.cpp19
-rw-r--r--indra/newview/llmaniprotate.cpp40
-rw-r--r--indra/newview/llmanipscale.cpp17
-rw-r--r--indra/newview/llmaniptranslate.cpp23
-rw-r--r--indra/newview/llmediactrl.cpp127
-rw-r--r--indra/newview/llmediactrl.h10
-rwxr-xr-xindra/newview/llmediadataclient.h2
-rw-r--r--indra/newview/llmenucommands.cpp4
-rw-r--r--indra/newview/llmimetypes.cpp16
-rw-r--r--indra/newview/llmimetypes.h4
-rw-r--r--indra/newview/llmorphview.cpp51
-rw-r--r--indra/newview/llmoveview.cpp103
-rw-r--r--indra/newview/llmoveview.h7
-rw-r--r--indra/newview/llmutelist.cpp78
-rw-r--r--indra/newview/llmutelist.h13
-rw-r--r--indra/newview/llnamelistctrl.cpp54
-rw-r--r--indra/newview/llnamelistctrl.h6
-rw-r--r--indra/newview/llnavigationbar.cpp81
-rw-r--r--indra/newview/llnearbychat.cpp57
-rw-r--r--indra/newview/llnearbychat.h2
-rw-r--r--indra/newview/llnearbychatbar.cpp126
-rw-r--r--indra/newview/llnearbychatbar.h7
-rw-r--r--indra/newview/llnearbychathandler.cpp120
-rw-r--r--indra/newview/llnetmap.cpp28
-rw-r--r--indra/newview/llnetmap.h4
-rw-r--r--indra/newview/llnotificationalerthandler.cpp6
-rw-r--r--indra/newview/llnotificationhandler.h53
-rw-r--r--indra/newview/llnotificationhandlerutil.cpp294
-rw-r--r--indra/newview/llnotificationofferhandler.cpp55
-rw-r--r--indra/newview/llnotificationstorage.cpp227
-rw-r--r--indra/newview/llnotificationstorage.h65
-rw-r--r--indra/newview/llnotificationtiphandler.cpp34
-rw-r--r--indra/newview/lloutfitobserver.cpp147
-rw-r--r--indra/newview/lloutfitobserver.h99
-rw-r--r--indra/newview/lloutfitslist.cpp750
-rw-r--r--indra/newview/lloutfitslist.h197
-rw-r--r--indra/newview/lloutputmonitorctrl.cpp22
-rw-r--r--indra/newview/lloutputmonitorctrl.h12
-rw-r--r--indra/newview/lloverlaybar.cpp2
-rw-r--r--indra/newview/llpanelavatar.cpp128
-rw-r--r--indra/newview/llpanelavatar.h12
-rw-r--r--indra/newview/llpanelblockedlist.cpp15
-rw-r--r--indra/newview/llpanelblockedlist.h2
-rw-r--r--indra/newview/llpanelclassified.cpp585
-rw-r--r--indra/newview/llpanelclassified.h118
-rw-r--r--indra/newview/llpanelcontents.cpp3
-rw-r--r--indra/newview/llpaneleditwearable.cpp1007
-rw-r--r--indra/newview/llpaneleditwearable.h74
-rw-r--r--indra/newview/llpanelface.cpp20
-rw-r--r--indra/newview/llpanelgenerictip.cpp51
-rw-r--r--indra/newview/llpanelgenerictip.h57
-rw-r--r--indra/newview/llpanelgroup.cpp125
-rw-r--r--indra/newview/llpanelgroup.h11
-rw-r--r--indra/newview/llpanelgroupgeneral.cpp39
-rw-r--r--indra/newview/llpanelgroupgeneral.h3
-rw-r--r--indra/newview/llpanelgroupinvite.cpp50
-rw-r--r--indra/newview/llpanelgroupinvite.h6
-rw-r--r--indra/newview/llpanelgrouplandmoney.cpp5
-rw-r--r--indra/newview/llpanelgroupnotices.cpp37
-rw-r--r--indra/newview/llpanelgrouproles.cpp136
-rw-r--r--indra/newview/llpanelgrouproles.h12
-rw-r--r--indra/newview/llpanelimcontrolpanel.cpp30
-rw-r--r--indra/newview/llpanelimcontrolpanel.h3
-rw-r--r--indra/newview/llpanellandaudio.cpp7
-rw-r--r--indra/newview/llpanellandmarkinfo.cpp70
-rw-r--r--indra/newview/llpanellandmarks.cpp426
-rw-r--r--indra/newview/llpanellandmarks.h22
-rw-r--r--indra/newview/llpanellandmedia.cpp17
-rw-r--r--indra/newview/llpanellogin.cpp584
-rw-r--r--indra/newview/llpanellogin.h28
-rw-r--r--indra/newview/llpanelmaininventory.cpp92
-rw-r--r--indra/newview/llpanelmaininventory.h9
-rw-r--r--indra/newview/llpanelme.cpp27
-rw-r--r--indra/newview/llpanelme.h1
-rw-r--r--indra/newview/llpanelnearbymedia.cpp1243
-rw-r--r--indra/newview/llpanelnearbymedia.h189
-rw-r--r--indra/newview/llpanelobjectinventory.cpp439
-rw-r--r--indra/newview/llpanelobjectinventory.h6
-rw-r--r--indra/newview/llpanelonlinestatus.cpp60
-rw-r--r--indra/newview/llpanelonlinestatus.h53
-rw-r--r--indra/newview/llpaneloutfitedit.cpp932
-rw-r--r--indra/newview/llpaneloutfitedit.h229
-rw-r--r--indra/newview/llpaneloutfitsinventory.cpp574
-rw-r--r--indra/newview/llpaneloutfitsinventory.h42
-rw-r--r--indra/newview/llpanelpeople.cpp109
-rw-r--r--indra/newview/llpanelpeople.h8
-rw-r--r--indra/newview/llpanelpeoplemenus.cpp113
-rw-r--r--indra/newview/llpanelpeoplemenus.h31
-rw-r--r--indra/newview/llpanelpermissions.cpp8
-rw-r--r--indra/newview/llpanelpick.cpp18
-rw-r--r--indra/newview/llpanelpick.h2
-rw-r--r--indra/newview/llpanelpicks.cpp207
-rw-r--r--indra/newview/llpanelpicks.h50
-rw-r--r--indra/newview/llpanelplaceinfo.cpp2
-rw-r--r--indra/newview/llpanelplaceprofile.cpp14
-rw-r--r--indra/newview/llpanelplaces.cpp54
-rw-r--r--indra/newview/llpanelplaces.h4
-rw-r--r--indra/newview/llpanelplacestab.cpp6
-rw-r--r--indra/newview/llpanelplacestab.h3
-rw-r--r--indra/newview/llpanelprimmediacontrols.cpp37
-rw-r--r--indra/newview/llpanelprimmediacontrols.h17
-rw-r--r--indra/newview/llpanelprofile.cpp10
-rw-r--r--indra/newview/llpanelteleporthistory.cpp60
-rw-r--r--indra/newview/llpanelteleporthistory.h8
-rw-r--r--indra/newview/llpaneltiptoast.cpp69
-rw-r--r--indra/newview/llpaneltiptoast.h57
-rw-r--r--indra/newview/llpaneltopinfobar.cpp426
-rw-r--r--indra/newview/llpaneltopinfobar.h159
-rw-r--r--indra/newview/llpanelvoiceeffect.cpp169
-rw-r--r--indra/newview/llpanelvoiceeffect.h73
-rw-r--r--indra/newview/llpanelvolumepulldown.cpp16
-rw-r--r--indra/newview/llpanelvolumepulldown.h2
-rw-r--r--indra/newview/llparticipantlist.cpp400
-rw-r--r--indra/newview/llparticipantlist.h27
-rw-r--r--indra/newview/llplacesinventorybridge.cpp13
-rw-r--r--indra/newview/llplacesinventorybridge.h38
-rw-r--r--indra/newview/llplacesinventorypanel.cpp43
-rw-r--r--indra/newview/llplacesinventorypanel.h2
-rw-r--r--indra/newview/llpopupview.cpp238
-rw-r--r--indra/newview/llpopupview.h67
-rw-r--r--indra/newview/llpreview.cpp9
-rw-r--r--indra/newview/llpreviewanim.cpp25
-rw-r--r--indra/newview/llpreviewgesture.cpp87
-rw-r--r--indra/newview/llpreviewgesture.h8
-rw-r--r--indra/newview/llpreviewnotecard.cpp48
-rw-r--r--indra/newview/llpreviewnotecard.h5
-rw-r--r--indra/newview/llpreviewscript.cpp20
-rw-r--r--indra/newview/llpreviewsound.cpp2
-rw-r--r--indra/newview/llpreviewtexture.cpp138
-rw-r--r--indra/newview/llprogressview.cpp29
-rw-r--r--indra/newview/llprogressview.h2
-rw-r--r--indra/newview/llrecentpeople.cpp2
-rw-r--r--indra/newview/llrecentpeople.h2
-rw-r--r--indra/newview/llrootview.h1
-rw-r--r--indra/newview/llsaveoutfitcombobtn.cpp98
-rw-r--r--indra/newview/llsaveoutfitcombobtn.h60
-rw-r--r--indra/newview/llscreenchannel.cpp95
-rw-r--r--indra/newview/llscreenchannel.h6
-rw-r--r--indra/newview/llscriptfloater.cpp405
-rw-r--r--indra/newview/llscriptfloater.h75
-rw-r--r--indra/newview/llscrollingpanelparam.cpp51
-rw-r--r--indra/newview/llscrollingpanelparam.h8
-rw-r--r--indra/newview/llsearchcombobox.cpp1
-rw-r--r--indra/newview/llsecapi.cpp197
-rw-r--r--indra/newview/llsecapi.h498
-rw-r--r--indra/newview/llsechandler_basic.cpp1665
-rw-r--r--indra/newview/llsechandler_basic.h296
-rw-r--r--indra/newview/llselectmgr.cpp127
-rw-r--r--indra/newview/llselectmgr.h19
-rw-r--r--indra/newview/llsidepanelappearance.cpp339
-rw-r--r--indra/newview/llsidepanelappearance.h37
-rw-r--r--indra/newview/llsidepanelinventory.cpp52
-rw-r--r--indra/newview/llsidepanelinventory.h10
-rw-r--r--indra/newview/llsidepaneliteminfo.cpp34
-rw-r--r--indra/newview/llsidepaneltaskinfo.cpp54
-rw-r--r--indra/newview/llsidepaneltaskinfo.h8
-rw-r--r--indra/newview/llsidetray.cpp30
-rw-r--r--indra/newview/llsidetray.h12
-rw-r--r--indra/newview/llslurl.cpp505
-rw-r--r--indra/newview/llslurl.h154
-rw-r--r--indra/newview/llspatialpartition.cpp3
-rw-r--r--indra/newview/llspatialpartition.h1
-rw-r--r--indra/newview/llspeakbutton.cpp10
-rw-r--r--indra/newview/llspeakers.cpp148
-rw-r--r--indra/newview/llspeakers.h51
-rw-r--r--indra/newview/llspeakingindicatormanager.cpp55
-rw-r--r--indra/newview/llspeakingindicatormanager.h24
-rw-r--r--indra/newview/llsplitbutton.cpp7
-rw-r--r--indra/newview/llstartup.cpp954
-rw-r--r--indra/newview/llstartup.h26
-rw-r--r--indra/newview/llstatusbar.cpp191
-rw-r--r--indra/newview/llstatusbar.h11
-rw-r--r--indra/newview/llstylemap.cpp6
-rw-r--r--indra/newview/llsurface.cpp3
-rw-r--r--indra/newview/llsyswellwindow.cpp256
-rw-r--r--indra/newview/llsyswellwindow.h43
-rw-r--r--indra/newview/llteleporthistory.cpp34
-rw-r--r--indra/newview/llteleporthistory.h4
-rw-r--r--indra/newview/llteleporthistorystorage.cpp7
-rw-r--r--indra/newview/lltexglobalcolor.cpp2
-rw-r--r--indra/newview/lltexlayer.cpp379
-rw-r--r--indra/newview/lltexlayer.h370
-rw-r--r--indra/newview/lltexlayerparams.cpp10
-rw-r--r--indra/newview/lltexlayerparams.h17
-rw-r--r--indra/newview/lltexturecache.cpp529
-rw-r--r--indra/newview/lltexturecache.h24
-rw-r--r--indra/newview/lltexturectrl.cpp76
-rw-r--r--indra/newview/lltexturectrl.h6
-rw-r--r--indra/newview/lltexturefetch.cpp327
-rw-r--r--indra/newview/lltexturefetch.h17
-rw-r--r--indra/newview/lltextureview.cpp256
-rw-r--r--indra/newview/lltextureview.h4
-rw-r--r--indra/newview/lltoast.cpp248
-rw-r--r--indra/newview/lltoast.h69
-rw-r--r--indra/newview/lltoastalertpanel.cpp110
-rw-r--r--indra/newview/lltoastgroupnotifypanel.cpp5
-rw-r--r--indra/newview/lltoastimpanel.cpp43
-rw-r--r--indra/newview/lltoastnotifypanel.cpp366
-rw-r--r--indra/newview/lltoastnotifypanel.h63
-rw-r--r--indra/newview/lltoastpanel.cpp34
-rw-r--r--indra/newview/lltoastpanel.h10
-rw-r--r--indra/newview/lltoolbar.cpp27
-rw-r--r--indra/newview/lltoolcomp.cpp3
-rw-r--r--indra/newview/lltooldraganddrop.cpp980
-rw-r--r--indra/newview/lltooldraganddrop.h32
-rw-r--r--indra/newview/lltoolfocus.cpp55
-rw-r--r--indra/newview/lltoolgrab.cpp71
-rw-r--r--indra/newview/lltoolgun.cpp3
-rw-r--r--indra/newview/lltoolmgr.cpp19
-rw-r--r--indra/newview/lltoolmorph.cpp101
-rw-r--r--indra/newview/lltoolmorph.h10
-rw-r--r--indra/newview/lltoolpie.cpp102
-rw-r--r--indra/newview/lltoolplacer.cpp6
-rw-r--r--indra/newview/lltoolselect.cpp7
-rw-r--r--indra/newview/lltracker.cpp12
-rw-r--r--indra/newview/lluploaddialog.cpp2
-rw-r--r--indra/newview/llurl.cpp6
-rw-r--r--indra/newview/llurl.h1
-rw-r--r--indra/newview/llurldispatcher.cpp225
-rw-r--r--indra/newview/llurldispatcher.h19
-rw-r--r--indra/newview/llurllineeditorctrl.cpp9
-rw-r--r--indra/newview/llurllineeditorctrl.h2
-rw-r--r--indra/newview/llviewerassetstorage.cpp9
-rw-r--r--indra/newview/llviewerassetstorage.h4
-rw-r--r--indra/newview/llviewerattachmenu.cpp139
-rw-r--r--indra/newview/llviewerattachmenu.h43
-rw-r--r--indra/newview/llvieweraudio.cpp23
-rw-r--r--indra/newview/llviewercamera.cpp13
-rw-r--r--indra/newview/llviewerchat.cpp3
-rw-r--r--indra/newview/llviewercontrol.cpp61
-rw-r--r--indra/newview/llviewerdisplay.cpp37
-rw-r--r--indra/newview/llviewerfloaterreg.cpp16
-rw-r--r--indra/newview/llviewerfoldertype.cpp93
-rw-r--r--indra/newview/llviewerfoldertype.h2
-rw-r--r--indra/newview/llviewerinventory.cpp243
-rw-r--r--indra/newview/llviewerinventory.h22
-rw-r--r--indra/newview/llviewerjointmesh.cpp2
-rw-r--r--indra/newview/llviewerjoystick.cpp9
-rw-r--r--indra/newview/llviewerkeyboard.cpp97
-rw-r--r--indra/newview/llviewermedia.cpp916
-rw-r--r--indra/newview/llviewermedia.h175
-rw-r--r--indra/newview/llviewermediafocus.cpp90
-rw-r--r--indra/newview/llviewermediafocus.h5
-rw-r--r--indra/newview/llviewermenu.cpp804
-rw-r--r--indra/newview/llviewermenu.h3
-rw-r--r--indra/newview/llviewermenufile.cpp151
-rw-r--r--indra/newview/llviewermessage.cpp977
-rw-r--r--indra/newview/llviewermessage.h37
-rw-r--r--indra/newview/llviewernetwork.cpp764
-rw-r--r--indra/newview/llviewernetwork.h172
-rw-r--r--indra/newview/llviewerobject.cpp75
-rw-r--r--indra/newview/llviewerobject.h6
-rw-r--r--indra/newview/llviewerobjectlist.cpp196
-rw-r--r--indra/newview/llviewerobjectlist.h35
-rw-r--r--indra/newview/llviewerparcelmedia.cpp61
-rw-r--r--indra/newview/llviewerparcelmediaautoplay.cpp19
-rw-r--r--indra/newview/llviewerparcelmediaautoplay.h2
-rw-r--r--indra/newview/llviewerparcelmgr.cpp22
-rw-r--r--indra/newview/llviewerparceloverlay.cpp6
-rw-r--r--indra/newview/llviewerregion.cpp69
-rw-r--r--indra/newview/llviewerregion.h5
-rw-r--r--indra/newview/llviewerstats.cpp17
-rw-r--r--indra/newview/llviewertexteditor.cpp7
-rw-r--r--indra/newview/llviewertexture.cpp608
-rw-r--r--indra/newview/llviewertexture.h32
-rw-r--r--indra/newview/llviewertexturelist.cpp16
-rw-r--r--indra/newview/llviewervisualparam.cpp6
-rw-r--r--indra/newview/llviewervisualparam.h2
-rw-r--r--indra/newview/llviewerwindow.cpp1225
-rw-r--r--indra/newview/llviewerwindow.h27
-rw-r--r--indra/newview/llvoavatar.cpp625
-rw-r--r--indra/newview/llvoavatar.h67
-rw-r--r--indra/newview/llvoavatardefines.cpp64
-rw-r--r--indra/newview/llvoavatardefines.h8
-rw-r--r--indra/newview/llvoavatarself.cpp611
-rw-r--r--indra/newview/llvoavatarself.h71
-rw-r--r--indra/newview/llvoclouds.cpp4
-rw-r--r--indra/newview/llvograss.cpp4
-rw-r--r--indra/newview/llvoicechannel.cpp91
-rw-r--r--indra/newview/llvoicechannel.h9
-rw-r--r--indra/newview/llvoiceclient.cpp7160
-rw-r--r--indra/newview/llvoiceclient.h1084
-rw-r--r--indra/newview/llvoicevivox.cpp7879
-rw-r--r--indra/newview/llvoicevivox.h1053
-rw-r--r--indra/newview/llvoinventorylistener.h2
-rw-r--r--indra/newview/llvopartgroup.cpp4
-rw-r--r--indra/newview/llvosky.cpp5
-rw-r--r--indra/newview/llvotextbubble.cpp3
-rw-r--r--indra/newview/llvotree.cpp48
-rw-r--r--indra/newview/llvotree.h1
-rw-r--r--indra/newview/llvovolume.cpp145
-rw-r--r--indra/newview/llvovolume.h6
-rw-r--r--indra/newview/llvowlsky.cpp2
-rw-r--r--indra/newview/llwaterparammanager.cpp3
-rw-r--r--indra/newview/llwearable.cpp218
-rw-r--r--indra/newview/llwearable.h13
-rw-r--r--indra/newview/llwearableitemslist.cpp768
-rw-r--r--indra/newview/llwearableitemslist.h382
-rw-r--r--indra/newview/llwearablelist.cpp7
-rw-r--r--indra/newview/llwearablelist.h8
-rw-r--r--indra/newview/llwearabletype.cpp138
-rw-r--r--indra/newview/llwearabletype.h78
-rw-r--r--indra/newview/llweb.cpp36
-rw-r--r--indra/newview/llweb.h4
-rw-r--r--indra/newview/llwindebug.cpp912
-rw-r--r--indra/newview/llwindebug.h75
-rw-r--r--indra/newview/llworld.cpp47
-rw-r--r--indra/newview/llworld.h4
-rw-r--r--indra/newview/llworldmap.h1
-rw-r--r--indra/newview/llworldmapmessage.cpp3
-rw-r--r--indra/newview/llworldmapview.cpp75
-rw-r--r--indra/newview/llworldmipmap.cpp5
-rw-r--r--indra/newview/llworldview.cpp67
-rw-r--r--indra/newview/llxmlrpclistener.cpp18
-rw-r--r--indra/newview/llxmlrpctransaction.cpp119
-rw-r--r--indra/newview/llxmlrpctransaction.h3
-rw-r--r--indra/newview/macview_Prefix.h1
-rw-r--r--indra/newview/pipeline.cpp164
-rw-r--r--indra/newview/pipeline.h16
-rw-r--r--indra/newview/res-sdl/ll_icon.BMPbin5174 -> 262198 bytes
-rw-r--r--indra/newview/res-sdl/toolbuy.BMPbin0 -> 3126 bytes
-rw-r--r--indra/newview/res-sdl/toolopen.BMPbin0 -> 3126 bytes
-rw-r--r--indra/newview/res-sdl/toolsit.BMPbin0 -> 3126 bytes
-rw-r--r--indra/newview/res/ll_icon.icobin364590 -> 367958 bytes
-rw-r--r--indra/newview/res/ll_icon.pngbin73845 -> 29561 bytes
-rw-r--r--indra/newview/res/resource.h4
-rw-r--r--indra/newview/res/toolbuy.curbin0 -> 4286 bytes
-rw-r--r--indra/newview/res/toolopen.curbin0 -> 4286 bytes
-rw-r--r--indra/newview/res/toolsit.curbin0 -> 4286 bytes
-rw-r--r--indra/newview/res/viewerRes.rc35
-rw-r--r--indra/newview/secondlife.icnsbin135209 -> 180809 bytes
-rw-r--r--indra/newview/skins/default/colors.xml32
-rw-r--r--indra/newview/skins/default/html/da/loading/loading.html20
-rw-r--r--indra/newview/skins/default/html/de/loading/loading.html20
-rw-r--r--indra/newview/skins/default/html/en-us/loading/loading.html18
-rw-r--r--indra/newview/skins/default/html/es/loading/loading.html20
-rw-r--r--indra/newview/skins/default/html/fr/loading/loading.html20
-rw-r--r--indra/newview/skins/default/html/hu/loading/loading.html20
-rw-r--r--indra/newview/skins/default/html/it/loading/loading.html20
-rw-r--r--indra/newview/skins/default/html/ja/loading/loading.html20
-rw-r--r--indra/newview/skins/default/html/nl/loading/loading.html20
-rw-r--r--indra/newview/skins/default/html/pl/loading/loading.html20
-rw-r--r--indra/newview/skins/default/html/pt/loading/loading.html20
-rw-r--r--indra/newview/skins/default/html/ru/loading/loading.html20
-rw-r--r--indra/newview/skins/default/html/tr/loading/loading.html20
-rw-r--r--indra/newview/skins/default/html/uk/loading/loading.html20
-rw-r--r--indra/newview/skins/default/html/zh/loading/loading.html20
-rw-r--r--indra/newview/skins/default/textures/avatar_thumb_bkgrnd.pngbin0 -> 17692 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_Off.pngbin700 -> 49285 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_On.pngbin754 -> 50855 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_Off.pngbin959 -> 50394 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_On.pngbin1087 -> 50127 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_Off.pngbin945 -> 49268 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_On.pngbin1049 -> 50209 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Mouselook_View_Off.pngbin0 -> 51189 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Mouselook_View_On.pngbin0 -> 53113 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Movement_Down_Off.pngbin419 -> 51706 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Movement_Down_On.pngbin417 -> 50907 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Movement_Left_Off.pngbin0 -> 51016 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Movement_Left_On.pngbin0 -> 51806 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Movement_Right_Off.pngbin0 -> 49845 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Movement_Right_On.pngbin0 -> 50161 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Movement_Up_Off.pngbin371 -> 53763 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Movement_Up_On.pngbin370 -> 51965 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Object_View_Off.pngbin0 -> 55000 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/Object_View_On.pngbin0 -> 51183 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/PanOrbit_Disabled.pngbin0 -> 50975 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/PanOrbit_Off.pngbin0 -> 51539 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/PanOrbit_Over.pngbin0 -> 54713 bytes
-rw-r--r--indra/newview/skins/default/textures/bottomtray/PanOrbit_Press.pngbin0 -> 51053 bytes
-rw-r--r--indra/newview/skins/default/textures/containers/Toolbar_Left_Flash.pngbin0 -> 356 bytes
-rw-r--r--indra/newview/skins/default/textures/containers/Toolbar_Middle_Flash.pngbin0 -> 316 bytes
-rw-r--r--indra/newview/skins/default/textures/containers/Toolbar_Right_Flash.pngbin0 -> 428 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/DownArrow_Off.pngbin0 -> 217 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Edit_Wrench.pngbin0 -> 724 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Female.pngbin0 -> 309 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Generic_Group.pngbin3354 -> 1523 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Generic_Group_Large.pngbin2282 -> 7061 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Hierarchy_View_Disabled.pngbin0 -> 178 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Hierarchy_View_On.pngbin0 -> 183 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_Link.pngbin0 -> 2857 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_LostClosed.pngbin0 -> 3033 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_LostOpen.pngbin0 -> 3223 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_Object_Multi.pngbin0 -> 774 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_Shoe.pngbin276 -> 54133 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_SysClosed.pngbin0 -> 3153 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_SysOpen.pngbin0 -> 3251 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_TrashClosed.pngbin0 -> 2978 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Inv_TrashOpen.pngbin0 -> 2970 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/List_View_Disabled.pngbin0 -> 158 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/List_View_On.pngbin0 -> 160 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Locked_Icon.pngbin0 -> 306 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Male.pngbin0 -> 302 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Progress_1.pngbin464 -> 470 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Progress_10.pngbin461 -> 461 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Progress_11.pngbin471 -> 475 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Progress_12.pngbin457 -> 455 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Progress_2.pngbin461 -> 453 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Progress_3.pngbin487 -> 454 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Progress_4.pngbin466 -> 454 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Progress_5.pngbin477 -> 468 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Progress_6.pngbin460 -> 462 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Progress_7.pngbin483 -> 469 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Progress_8.pngbin467 -> 454 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Progress_9.pngbin483 -> 469 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/SL_Logo.pngbin973 -> 3999 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Search_Icon.pngbin0 -> 552 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Shirt_Large.pngbin0 -> 471 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Shop.pngbin0 -> 647 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/UpArrow_Off.pngbin0 -> 219 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/back_arrow_off.pngbin0 -> 3775 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/back_arrow_over.pngbin0 -> 3792 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/back_arrow_press.pngbin0 -> 3844 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/object_icon.pngbin0 -> 410 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/unknown_icon.pngbin0 -> 884 bytes
-rw-r--r--indra/newview/skins/default/textures/map_infohub.tgabin1068 -> 1068 bytes
-rw-r--r--indra/newview/skins/default/textures/navbar/BuyArrow_Over.pngbin2956 -> 294 bytes
-rw-r--r--indra/newview/skins/default/textures/navbar/BuyArrow_Press.pngbin2949 -> 294 bytes
-rw-r--r--indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Off.pngbin228 -> 749 bytes
-rw-r--r--indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Selected.pngbin291 -> 790 bytes
-rw-r--r--indra/newview/skins/default/textures/textures.xml299
-rw-r--r--indra/newview/skins/default/textures/widgets/bevel_background.pngbin0 -> 365 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/buy_off.pngbin0 -> 399 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/buy_over.pngbin0 -> 415 bytes
-rw-r--r--indra/newview/skins/default/textures/widgets/buy_press.pngbin0 -> 461 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/Dragbar.pngbin0 -> 348 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/Flyout_Pointer_Up.pngbin0 -> 260 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/Icon_Gear_Background.pngbin373 -> 370 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/Icon_Gear_Foreground.pngbin373 -> 371 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/Icon_Gear_Over.pngbin279 -> 293 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/Icon_Gear_Press.pngbin396 -> 365 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/Volume_Background.pngbin0 -> 589 bytes
-rw-r--r--indra/newview/skins/default/textures/windows/Wearables_Divider.pngbin0 -> 97 bytes
-rw-r--r--indra/newview/skins/default/textures/world/BeaconArrow.pngbin1965 -> 994 bytes
-rw-r--r--indra/newview/skins/default/xui/da/floater_about.xml11
-rw-r--r--indra/newview/skins/default/xui/da/floater_about_land.xml64
-rw-r--r--indra/newview/skins/default/xui/da/floater_animation_preview.xml51
-rw-r--r--indra/newview/skins/default/xui/da/floater_avatar_textures.xml70
-rw-r--r--indra/newview/skins/default/xui/da/floater_beacons.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_build_options.xml4
-rw-r--r--indra/newview/skins/default/xui/da/floater_bulk_perms.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_buy_currency.xml4
-rw-r--r--indra/newview/skins/default/xui/da/floater_buy_currency_html.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_buy_land.xml255
-rw-r--r--indra/newview/skins/default/xui/da/floater_camera.xml14
-rw-r--r--indra/newview/skins/default/xui/da/floater_color_picker.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_customize.xml121
-rw-r--r--indra/newview/skins/default/xui/da/floater_day_cycle_options.xml41
-rw-r--r--indra/newview/skins/default/xui/da/floater_event.xml72
-rw-r--r--indra/newview/skins/default/xui/da/floater_god_tools.xml17
-rw-r--r--indra/newview/skins/default/xui/da/floater_help_browser.xml7
-rw-r--r--indra/newview/skins/default/xui/da/floater_im.xml6
-rw-r--r--indra/newview/skins/default/xui/da/floater_im_container.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_image_preview.xml20
-rw-r--r--indra/newview/skins/default/xui/da/floater_incoming_call.xml6
-rw-r--r--indra/newview/skins/default/xui/da/floater_inventory.xml8
-rw-r--r--indra/newview/skins/default/xui/da/floater_live_lsleditor.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_lsl_guide.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_map.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_media_browser.xml18
-rw-r--r--indra/newview/skins/default/xui/da/floater_moveview.xml49
-rw-r--r--indra/newview/skins/default/xui/da/floater_outfit_save_as.xml11
-rw-r--r--indra/newview/skins/default/xui/da/floater_outgoing_call.xml12
-rw-r--r--indra/newview/skins/default/xui/da/floater_pay_object.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_preferences.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_preview_gesture.xml3
-rw-r--r--indra/newview/skins/default/xui/da/floater_preview_notecard.xml6
-rw-r--r--indra/newview/skins/default/xui/da/floater_preview_texture.xml7
-rw-r--r--indra/newview/skins/default/xui/da/floater_publish_classified.xml15
-rw-r--r--indra/newview/skins/default/xui/da/floater_report_abuse.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_script_limits.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_script_preview.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_select_key.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_settings_debug.xml8
-rw-r--r--indra/newview/skins/default/xui/da/floater_snapshot.xml89
-rw-r--r--indra/newview/skins/default/xui/da/floater_sys_well.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_texture_ctrl.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_tools.xml68
-rw-r--r--indra/newview/skins/default/xui/da/floater_top_objects.xml63
-rw-r--r--indra/newview/skins/default/xui/da/floater_tos.xml16
-rw-r--r--indra/newview/skins/default/xui/da/floater_voice_controls.xml17
-rw-r--r--indra/newview/skins/default/xui/da/floater_water.xml4
-rw-r--r--indra/newview/skins/default/xui/da/floater_wearable_save_as.xml8
-rw-r--r--indra/newview/skins/default/xui/da/floater_whitelist_entry.xml2
-rw-r--r--indra/newview/skins/default/xui/da/floater_windlight_options.xml148
-rw-r--r--indra/newview/skins/default/xui/da/floater_window_size.xml17
-rw-r--r--indra/newview/skins/default/xui/da/floater_world_map.xml59
-rw-r--r--indra/newview/skins/default/xui/da/inspect_avatar.xml2
-rw-r--r--indra/newview/skins/default/xui/da/language_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/da/menu_attachment_other.xml2
-rw-r--r--indra/newview/skins/default/xui/da/menu_attachment_self.xml3
-rw-r--r--indra/newview/skins/default/xui/da/menu_avatar_other.xml2
-rw-r--r--indra/newview/skins/default/xui/da/menu_avatar_self.xml13
-rw-r--r--indra/newview/skins/default/xui/da/menu_bottomtray.xml5
-rw-r--r--indra/newview/skins/default/xui/da/menu_edit.xml12
-rw-r--r--indra/newview/skins/default/xui/da/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml4
-rw-r--r--indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml3
-rw-r--r--indra/newview/skins/default/xui/da/menu_inv_offer_chiclet.xml4
-rw-r--r--indra/newview/skins/default/xui/da/menu_inventory.xml11
-rw-r--r--indra/newview/skins/default/xui/da/menu_login.xml19
-rw-r--r--indra/newview/skins/default/xui/da/menu_mini_map.xml4
-rw-r--r--indra/newview/skins/default/xui/da/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/da/menu_object.xml13
-rw-r--r--indra/newview/skins/default/xui/da/menu_participant_list.xml19
-rw-r--r--indra/newview/skins/default/xui/da/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/default/xui/da/menu_people_nearby.xml3
-rw-r--r--indra/newview/skins/default/xui/da/menu_people_nearby_multiselect.xml1
-rw-r--r--indra/newview/skins/default/xui/da/menu_profile_overflow.xml7
-rw-r--r--indra/newview/skins/default/xui/da/menu_save_outfit.xml5
-rw-r--r--indra/newview/skins/default/xui/da/menu_script_chiclet.xml4
-rw-r--r--indra/newview/skins/default/xui/da/menu_viewer.xml111
-rw-r--r--indra/newview/skins/default/xui/da/notifications.xml373
-rw-r--r--indra/newview/skins/default/xui/da/outfit_accordion_tab.xml4
-rw-r--r--indra/newview/skins/default/xui/da/panel_adhoc_control_panel.xml16
-rw-r--r--indra/newview/skins/default/xui/da/panel_avatar_list_item.xml1
-rw-r--r--indra/newview/skins/default/xui/da/panel_block_list_sidetray.xml6
-rw-r--r--indra/newview/skins/default/xui/da/panel_body_parts_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/da/panel_bodyparts_list_button_bar.xml5
-rw-r--r--indra/newview/skins/default/xui/da/panel_bottomtray.xml40
-rw-r--r--indra/newview/skins/default/xui/da/panel_bottomtray_lite.xml8
-rw-r--r--indra/newview/skins/default/xui/da/panel_classified_info.xml49
-rw-r--r--indra/newview/skins/default/xui/da/panel_clothing_list_button_bar.xml5
-rw-r--r--indra/newview/skins/default/xui/da/panel_clothing_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/da/panel_cof_wearables.xml8
-rw-r--r--indra/newview/skins/default/xui/da/panel_deletable_wearable_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/da/panel_dummy_clothing_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_classified.xml19
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_eyes.xml8
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_gloves.xml8
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_hair.xml14
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_jacket.xml8
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_pants.xml8
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_pick.xml5
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_profile.xml5
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_shape.xml34
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_shirt.xml8
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_shoes.xml8
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_skin.xml14
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_skirt.xml8
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_socks.xml8
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_tattoo.xml1
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_underpants.xml8
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_undershirt.xml8
-rw-r--r--indra/newview/skins/default/xui/da/panel_edit_wearable.xml11
-rw-r--r--indra/newview/skins/default/xui/da/panel_friends.xml2
-rw-r--r--indra/newview/skins/default/xui/da/panel_group_control_panel.xml20
-rw-r--r--indra/newview/skins/default/xui/da/panel_group_general.xml25
-rw-r--r--indra/newview/skins/default/xui/da/panel_group_info_sidetray.xml43
-rw-r--r--indra/newview/skins/default/xui/da/panel_group_invite.xml11
-rw-r--r--indra/newview/skins/default/xui/da/panel_group_land_money.xml110
-rw-r--r--indra/newview/skins/default/xui/da/panel_group_list_item.xml1
-rw-r--r--indra/newview/skins/default/xui/da/panel_group_notices.xml5
-rw-r--r--indra/newview/skins/default/xui/da/panel_group_notify.xml2
-rw-r--r--indra/newview/skins/default/xui/da/panel_group_roles.xml4
-rw-r--r--indra/newview/skins/default/xui/da/panel_im_control_panel.xml36
-rw-r--r--indra/newview/skins/default/xui/da/panel_inventory_item.xml4
-rw-r--r--indra/newview/skins/default/xui/da/panel_landmark_info.xml1
-rw-r--r--indra/newview/skins/default/xui/da/panel_landmarks.xml4
-rw-r--r--indra/newview/skins/default/xui/da/panel_login.xml22
-rw-r--r--indra/newview/skins/default/xui/da/panel_main_inventory.xml76
-rw-r--r--indra/newview/skins/default/xui/da/panel_me.xml4
-rw-r--r--indra/newview/skins/default/xui/da/panel_media_settings_general.xml6
-rw-r--r--indra/newview/skins/default/xui/da/panel_media_settings_permissions.xml9
-rw-r--r--indra/newview/skins/default/xui/da/panel_media_settings_security.xml6
-rw-r--r--indra/newview/skins/default/xui/da/panel_my_profile.xml58
-rw-r--r--indra/newview/skins/default/xui/da/panel_navigation_bar.xml9
-rw-r--r--indra/newview/skins/default/xui/da/panel_nearby_chat_bar.xml6
-rw-r--r--indra/newview/skins/default/xui/da/panel_nearby_media.xml65
-rw-r--r--indra/newview/skins/default/xui/da/panel_notes.xml4
-rw-r--r--indra/newview/skins/default/xui/da/panel_online_status.xml2
-rw-r--r--indra/newview/skins/default/xui/da/panel_online_status_toast.xml2
-rw-r--r--indra/newview/skins/default/xui/da/panel_outfit_edit.xml45
-rw-r--r--indra/newview/skins/default/xui/da/panel_outfits_inventory.xml17
-rw-r--r--indra/newview/skins/default/xui/da/panel_outfits_inventory_gear_default.xml4
-rw-r--r--indra/newview/skins/default/xui/da/panel_people.xml31
-rw-r--r--indra/newview/skins/default/xui/da/panel_place_profile.xml28
-rw-r--r--indra/newview/skins/default/xui/da/panel_places.xml12
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_advanced.xml45
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_alerts.xml6
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_chat.xml25
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_general.xml21
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml11
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_privacy.xml5
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_setup.xml25
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_sound.xml19
-rw-r--r--indra/newview/skins/default/xui/da/panel_prim_media_controls.xml61
-rw-r--r--indra/newview/skins/default/xui/da/panel_profile.xml64
-rw-r--r--indra/newview/skins/default/xui/da/panel_region_covenant.xml4
-rw-r--r--indra/newview/skins/default/xui/da/panel_region_estate.xml11
-rw-r--r--indra/newview/skins/default/xui/da/panel_region_general.xml24
-rw-r--r--indra/newview/skins/default/xui/da/panel_region_general_layout.xml43
-rw-r--r--indra/newview/skins/default/xui/da/panel_region_texture.xml12
-rw-r--r--indra/newview/skins/default/xui/da/panel_script_limits_my_avatar.xml16
-rw-r--r--indra/newview/skins/default/xui/da/panel_script_limits_region_memory.xml20
-rw-r--r--indra/newview/skins/default/xui/da/panel_side_tray.xml25
-rw-r--r--indra/newview/skins/default/xui/da/panel_status_bar.xml6
-rw-r--r--indra/newview/skins/default/xui/da/panel_teleport_history.xml4
-rw-r--r--indra/newview/skins/default/xui/da/panel_teleport_history_item.xml4
-rw-r--r--indra/newview/skins/default/xui/da/panel_world_map.xml6
-rw-r--r--indra/newview/skins/default/xui/da/sidepanel_appearance.xml15
-rw-r--r--indra/newview/skins/default/xui/da/sidepanel_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/da/sidepanel_item_info.xml57
-rw-r--r--indra/newview/skins/default/xui/da/sidepanel_task_info.xml92
-rw-r--r--indra/newview/skins/default/xui/da/strings.xml854
-rw-r--r--indra/newview/skins/default/xui/da/teleport_strings.xml3
-rw-r--r--indra/newview/skins/default/xui/de/floater_about.xml12
-rw-r--r--indra/newview/skins/default/xui/de/floater_about_land.xml67
-rw-r--r--indra/newview/skins/default/xui/de/floater_animation_preview.xml55
-rw-r--r--indra/newview/skins/default/xui/de/floater_avatar_picker.xml29
-rw-r--r--indra/newview/skins/default/xui/de/floater_avatar_textures.xml12
-rw-r--r--indra/newview/skins/default/xui/de/floater_beacons.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_build_options.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_bulk_perms.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_buy_currency.xml10
-rw-r--r--indra/newview/skins/default/xui/de/floater_buy_land.xml282
-rw-r--r--indra/newview/skins/default/xui/de/floater_buy_object.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_camera.xml29
-rw-r--r--indra/newview/skins/default/xui/de/floater_color_picker.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_customize.xml114
-rw-r--r--indra/newview/skins/default/xui/de/floater_day_cycle_options.xml34
-rw-r--r--indra/newview/skins/default/xui/de/floater_env_settings.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_event.xml69
-rw-r--r--indra/newview/skins/default/xui/de/floater_gesture.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_god_tools.xml35
-rw-r--r--indra/newview/skins/default/xui/de/floater_hardware_settings.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_help_browser.xml11
-rw-r--r--indra/newview/skins/default/xui/de/floater_im.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_im_session.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_image_preview.xml22
-rw-r--r--indra/newview/skins/default/xui/de/floater_incoming_call.xml8
-rw-r--r--indra/newview/skins/default/xui/de/floater_inspect.xml6
-rw-r--r--indra/newview/skins/default/xui/de/floater_inventory.xml8
-rw-r--r--indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_live_lsleditor.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_lsl_guide.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_map.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_media_browser.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_mem_leaking.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_moveview.xml10
-rw-r--r--indra/newview/skins/default/xui/de/floater_openobject.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_outfit_save_as.xml7
-rw-r--r--indra/newview/skins/default/xui/de/floater_outgoing_call.xml9
-rw-r--r--indra/newview/skins/default/xui/de/floater_pay.xml6
-rw-r--r--indra/newview/skins/default/xui/de/floater_pay_object.xml12
-rw-r--r--indra/newview/skins/default/xui/de/floater_postcard.xml10
-rw-r--r--indra/newview/skins/default/xui/de/floater_preferences.xml6
-rw-r--r--indra/newview/skins/default/xui/de/floater_preview_animation.xml8
-rw-r--r--indra/newview/skins/default/xui/de/floater_preview_gesture.xml8
-rw-r--r--indra/newview/skins/default/xui/de/floater_preview_sound.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_preview_texture.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_publish_classified.xml15
-rw-r--r--indra/newview/skins/default/xui/de/floater_region_info.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_report_abuse.xml15
-rw-r--r--indra/newview/skins/default/xui/de/floater_script_preview.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_sell_land.xml16
-rw-r--r--indra/newview/skins/default/xui/de/floater_snapshot.xml96
-rw-r--r--indra/newview/skins/default/xui/de/floater_stats.xml6
-rw-r--r--indra/newview/skins/default/xui/de/floater_sys_well.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_telehub.xml8
-rw-r--r--indra/newview/skins/default/xui/de/floater_texture_ctrl.xml4
-rw-r--r--indra/newview/skins/default/xui/de/floater_tools.xml31
-rw-r--r--indra/newview/skins/default/xui/de/floater_tos.xml23
-rw-r--r--indra/newview/skins/default/xui/de/floater_url_entry.xml8
-rw-r--r--indra/newview/skins/default/xui/de/floater_voice_controls.xml9
-rw-r--r--indra/newview/skins/default/xui/de/floater_voice_effect.xml29
-rw-r--r--indra/newview/skins/default/xui/de/floater_water.xml6
-rw-r--r--indra/newview/skins/default/xui/de/floater_wearable_save_as.xml8
-rw-r--r--indra/newview/skins/default/xui/de/floater_whitelist_entry.xml2
-rw-r--r--indra/newview/skins/default/xui/de/floater_windlight_options.xml6
-rw-r--r--indra/newview/skins/default/xui/de/floater_world_map.xml17
-rw-r--r--indra/newview/skins/default/xui/de/inspect_avatar.xml4
-rw-r--r--indra/newview/skins/default/xui/de/inspect_group.xml2
-rw-r--r--indra/newview/skins/default/xui/de/inspect_object.xml12
-rw-r--r--indra/newview/skins/default/xui/de/language_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/de/menu_attachment_other.xml4
-rw-r--r--indra/newview/skins/default/xui/de/menu_attachment_self.xml1
-rw-r--r--indra/newview/skins/default/xui/de/menu_avatar_other.xml4
-rw-r--r--indra/newview/skins/default/xui/de/menu_avatar_self.xml9
-rw-r--r--indra/newview/skins/default/xui/de/menu_cof_attachment.xml4
-rw-r--r--indra/newview/skins/default/xui/de/menu_cof_body_part.xml5
-rw-r--r--indra/newview/skins/default/xui/de/menu_cof_clothing.xml7
-rw-r--r--indra/newview/skins/default/xui/de/menu_cof_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/de/menu_edit.xml12
-rw-r--r--indra/newview/skins/default/xui/de/menu_hide_navbar.xml1
-rw-r--r--indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/de/menu_inspect_object_gear.xml2
-rw-r--r--indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml1
-rw-r--r--indra/newview/skins/default/xui/de/menu_inv_offer_chiclet.xml4
-rw-r--r--indra/newview/skins/default/xui/de/menu_inventory.xml10
-rw-r--r--indra/newview/skins/default/xui/de/menu_inventory_add.xml2
-rw-r--r--indra/newview/skins/default/xui/de/menu_land.xml2
-rw-r--r--indra/newview/skins/default/xui/de/menu_login.xml14
-rw-r--r--indra/newview/skins/default/xui/de/menu_mini_map.xml2
-rw-r--r--indra/newview/skins/default/xui/de/menu_object.xml14
-rw-r--r--indra/newview/skins/default/xui/de/menu_outfit_gear.xml26
-rw-r--r--indra/newview/skins/default/xui/de/menu_outfit_tab.xml9
-rw-r--r--indra/newview/skins/default/xui/de/menu_participant_list.xml3
-rw-r--r--indra/newview/skins/default/xui/de/menu_people_groups.xml2
-rw-r--r--indra/newview/skins/default/xui/de/menu_people_nearby.xml4
-rw-r--r--indra/newview/skins/default/xui/de/menu_people_nearby_multiselect.xml3
-rw-r--r--indra/newview/skins/default/xui/de/menu_people_nearby_view_sort.xml4
-rw-r--r--indra/newview/skins/default/xui/de/menu_people_recent_view_sort.xml2
-rw-r--r--indra/newview/skins/default/xui/de/menu_profile_overflow.xml5
-rw-r--r--indra/newview/skins/default/xui/de/menu_save_outfit.xml5
-rw-r--r--indra/newview/skins/default/xui/de/menu_script_chiclet.xml4
-rw-r--r--indra/newview/skins/default/xui/de/menu_viewer.xml104
-rw-r--r--indra/newview/skins/default/xui/de/menu_wearable_list_item.xml13
-rw-r--r--indra/newview/skins/default/xui/de/mime_types.xml8
-rw-r--r--indra/newview/skins/default/xui/de/notifications.xml341
-rw-r--r--indra/newview/skins/default/xui/de/outfit_accordion_tab.xml4
-rw-r--r--indra/newview/skins/default/xui/de/panel_block_list_sidetray.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_bottomtray.xml5
-rw-r--r--indra/newview/skins/default/xui/de/panel_bottomtray_lite.xml8
-rw-r--r--indra/newview/skins/default/xui/de/panel_classified_info.xml53
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_alpha.xml12
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_classified.xml29
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_eyes.xml8
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_gloves.xml8
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_hair.xml14
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_jacket.xml12
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_pants.xml8
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_pick.xml7
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_profile.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_shape.xml40
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_shirt.xml8
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_shoes.xml8
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_skin.xml14
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_skirt.xml8
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_socks.xml8
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_tattoo.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_underpants.xml8
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_undershirt.xml8
-rw-r--r--indra/newview/skins/default/xui/de/panel_edit_wearable.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_friends.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_group_general.xml31
-rw-r--r--indra/newview/skins/default/xui/de/panel_group_info_sidetray.xml45
-rw-r--r--indra/newview/skins/default/xui/de/panel_group_invite.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_group_land_money.xml193
-rw-r--r--indra/newview/skins/default/xui/de/panel_group_notices.xml4
-rw-r--r--indra/newview/skins/default/xui/de/panel_group_notify.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_group_roles.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_groups.xml4
-rw-r--r--indra/newview/skins/default/xui/de/panel_im_control_panel.xml5
-rw-r--r--indra/newview/skins/default/xui/de/panel_inventory_item.xml4
-rw-r--r--indra/newview/skins/default/xui/de/panel_landmark_info.xml3
-rw-r--r--indra/newview/skins/default/xui/de/panel_landmarks.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_login.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_main_inventory.xml34
-rw-r--r--indra/newview/skins/default/xui/de/panel_me.xml4
-rw-r--r--indra/newview/skins/default/xui/de/panel_media_settings_permissions.xml9
-rw-r--r--indra/newview/skins/default/xui/de/panel_media_settings_security.xml3
-rw-r--r--indra/newview/skins/default/xui/de/panel_my_profile.xml7
-rw-r--r--indra/newview/skins/default/xui/de/panel_navigation_bar.xml11
-rw-r--r--indra/newview/skins/default/xui/de/panel_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_nearby_chat_bar.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_nearby_media.xml65
-rw-r--r--indra/newview/skins/default/xui/de/panel_notes.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_online_status.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_online_status_toast.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_outfit_edit.xml39
-rw-r--r--indra/newview/skins/default/xui/de/panel_outfits_inventory.xml7
-rw-r--r--indra/newview/skins/default/xui/de/panel_people.xml20
-rw-r--r--indra/newview/skins/default/xui/de/panel_picks.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_place_profile.xml31
-rw-r--r--indra/newview/skins/default/xui/de/panel_places.xml11
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_advanced.xml47
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_alerts.xml8
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_chat.xml20
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_general.xml14
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_privacy.xml8
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_setup.xml19
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_sound.xml17
-rw-r--r--indra/newview/skins/default/xui/de/panel_profile.xml8
-rw-r--r--indra/newview/skins/default/xui/de/panel_profile_view.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_covenant.xml12
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_debug.xml4
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_estate.xml18
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_general.xml26
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_general_layout.xml4
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_terrain.xml6
-rw-r--r--indra/newview/skins/default/xui/de/panel_region_texture.xml24
-rw-r--r--indra/newview/skins/default/xui/de/panel_script_limits_my_avatar.xml5
-rw-r--r--indra/newview/skins/default/xui/de/panel_script_limits_region_memory.xml18
-rw-r--r--indra/newview/skins/default/xui/de/panel_side_tray.xml20
-rw-r--r--indra/newview/skins/default/xui/de/panel_stand_stop_flying.xml2
-rw-r--r--indra/newview/skins/default/xui/de/panel_status_bar.xml9
-rw-r--r--indra/newview/skins/default/xui/de/panel_voice_effect.xml15
-rw-r--r--indra/newview/skins/default/xui/de/panel_world_map.xml6
-rw-r--r--indra/newview/skins/default/xui/de/role_actions.xml4
-rw-r--r--indra/newview/skins/default/xui/de/sidepanel_inventory.xml8
-rw-r--r--indra/newview/skins/default/xui/de/sidepanel_task_info.xml11
-rw-r--r--indra/newview/skins/default/xui/de/strings.xml371
-rw-r--r--indra/newview/skins/default/xui/de/teleport_strings.xml5
-rw-r--r--indra/newview/skins/default/xui/en/alert_line_editor.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_about.xml15
-rw-r--r--indra/newview/skins/default/xui/en/floater_about_land.xml126
-rw-r--r--indra/newview/skins/default/xui/en/floater_animation_preview.xml182
-rw-r--r--indra/newview/skins/default/xui/en/floater_avatar_textures.xml207
-rw-r--r--indra/newview/skins/default/xui/en/floater_buy_currency.xml12
-rw-r--r--indra/newview/skins/default/xui/en/floater_buy_currency_html.xml27
-rw-r--r--indra/newview/skins/default/xui/en/floater_buy_land.xml25
-rw-r--r--indra/newview/skins/default/xui/en/floater_buy_object.xml7
-rw-r--r--indra/newview/skins/default/xui/en/floater_camera.xml281
-rw-r--r--indra/newview/skins/default/xui/en/floater_color_picker.xml3
-rw-r--r--indra/newview/skins/default/xui/en/floater_critical.xml14
-rw-r--r--indra/newview/skins/default/xui/en/floater_customize.xml692
-rw-r--r--indra/newview/skins/default/xui/en/floater_day_cycle_options.xml63
-rw-r--r--indra/newview/skins/default/xui/en/floater_env_settings.xml12
-rw-r--r--indra/newview/skins/default/xui/en/floater_event.xml314
-rw-r--r--indra/newview/skins/default/xui/en/floater_god_tools.xml21
-rw-r--r--indra/newview/skins/default/xui/en/floater_hardware_settings.xml22
-rw-r--r--indra/newview/skins/default/xui/en/floater_help_browser.xml14
-rw-r--r--indra/newview/skins/default/xui/en/floater_im.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_im_container.xml20
-rw-r--r--indra/newview/skins/default/xui/en/floater_im_session.xml17
-rw-r--r--indra/newview/skins/default/xui/en/floater_image_preview.xml30
-rw-r--r--indra/newview/skins/default/xui/en/floater_incoming_call.xml10
-rw-r--r--indra/newview/skins/default/xui/en/floater_inspect.xml12
-rw-r--r--indra/newview/skins/default/xui/en/floater_inventory.xml16
-rw-r--r--indra/newview/skins/default/xui/en/floater_joystick.xml154
-rw-r--r--indra/newview/skins/default/xui/en/floater_land_holdings.xml12
-rw-r--r--indra/newview/skins/default/xui/en/floater_live_lsleditor.xml8
-rw-r--r--indra/newview/skins/default/xui/en/floater_map.xml17
-rw-r--r--indra/newview/skins/default/xui/en/floater_media_browser.xml10
-rw-r--r--indra/newview/skins/default/xui/en/floater_moveview.xml182
-rw-r--r--indra/newview/skins/default/xui/en/floater_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_outfit_save_as.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_outgoing_call.xml19
-rw-r--r--indra/newview/skins/default/xui/en/floater_perm_prefs.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_postcard.xml14
-rw-r--r--indra/newview/skins/default/xui/en/floater_preferences.xml11
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_gesture.xml76
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_notecard.xml17
-rw-r--r--indra/newview/skins/default/xui/en/floater_preview_texture.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_publish_classified.xml82
-rw-r--r--indra/newview/skins/default/xui/en/floater_region_info.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_report_abuse.xml7
-rw-r--r--indra/newview/skins/default/xui/en/floater_script.xml10
-rw-r--r--indra/newview/skins/default/xui/en/floater_script_debug_panel.xml3
-rw-r--r--indra/newview/skins/default/xui/en/floater_search.xml19
-rw-r--r--indra/newview/skins/default/xui/en/floater_sell_land.xml4
-rw-r--r--indra/newview/skins/default/xui/en/floater_snapshot.xml20
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_inspectors.xml9
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_text_editor.xml14
-rw-r--r--indra/newview/skins/default/xui/en/floater_test_widgets.xml8
-rw-r--r--indra/newview/skins/default/xui/en/floater_tools.xml395
-rw-r--r--indra/newview/skins/default/xui/en/floater_tos.xml9
-rw-r--r--indra/newview/skins/default/xui/en/floater_ui_preview.xml5
-rw-r--r--indra/newview/skins/default/xui/en/floater_voice_controls.xml63
-rw-r--r--indra/newview/skins/default/xui/en/floater_voice_effect.xml115
-rw-r--r--indra/newview/skins/default/xui/en/floater_water.xml109
-rw-r--r--indra/newview/skins/default/xui/en/floater_wearable_save_as.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_windlight_options.xml741
-rw-r--r--indra/newview/skins/default/xui/en/floater_world_map.xml75
-rw-r--r--indra/newview/skins/default/xui/en/inspect_avatar.xml2
-rw-r--r--indra/newview/skins/default/xui/en/inspect_group.xml6
-rw-r--r--indra/newview/skins/default/xui/en/inspect_object.xml49
-rw-r--r--indra/newview/skins/default/xui/en/inspector_info_ctrl.xml9
-rw-r--r--indra/newview/skins/default/xui/en/main_view.xml74
-rw-r--r--indra/newview/skins/default/xui/en/menu_attachment_other.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_attachment_self.xml137
-rw-r--r--indra/newview/skins/default/xui/en/menu_avatar_other.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_avatar_self.xml28
-rw-r--r--indra/newview/skins/default/xui/en/menu_bottomtray.xml44
-rw-r--r--indra/newview/skins/default/xui/en/menu_cof_attachment.xml13
-rw-r--r--indra/newview/skins/default/xui/en/menu_cof_body_part.xml33
-rw-r--r--indra/newview/skins/default/xui/en/menu_cof_clothing.xml56
-rw-r--r--indra/newview/skins/default/xui/en/menu_cof_gear.xml13
-rw-r--r--indra/newview/skins/default/xui/en/menu_edit.xml89
-rw-r--r--indra/newview/skins/default/xui/en/menu_group_plus.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_hide_navbar.xml19
-rw-r--r--indra/newview/skins/default/xui/en/menu_inspect_avatar_gear.xml10
-rw-r--r--indra/newview/skins/default/xui/en/menu_inspect_self_gear.xml12
-rw-r--r--indra/newview/skins/default/xui/en/menu_inv_offer_chiclet.xml19
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory.xml24
-rw-r--r--indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml19
-rw-r--r--indra/newview/skins/default/xui/en/menu_login.xml139
-rw-r--r--indra/newview/skins/default/xui/en/menu_object.xml46
-rw-r--r--indra/newview/skins/default/xui/en/menu_outfit_gear.xml191
-rw-r--r--indra/newview/skins/default/xui/en/menu_outfit_tab.xml72
-rw-r--r--indra/newview/skins/default/xui/en/menu_participant_list.xml195
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_groups.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_nearby.xml23
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml10
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_picks.xml15
-rw-r--r--indra/newview/skins/default/xui/en/menu_places_gear_folder.xml9
-rw-r--r--indra/newview/skins/default/xui/en/menu_profile_overflow.xml38
-rw-r--r--indra/newview/skins/default/xui/en/menu_save_outfit.xml22
-rw-r--r--indra/newview/skins/default/xui/en/menu_script_chiclet.xml19
-rw-r--r--indra/newview/skins/default/xui/en/menu_topinfobar.xml51
-rw-r--r--indra/newview/skins/default/xui/en/menu_url_agent.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_url_group.xml2
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml835
-rw-r--r--indra/newview/skins/default/xui/en/menu_wearable_list_item.xml76
-rw-r--r--indra/newview/skins/default/xui/en/mime_types.xml38
-rw-r--r--indra/newview/skins/default/xui/en/mime_types_linux.xml38
-rw-r--r--indra/newview/skins/default/xui/en/mime_types_mac.xml36
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml620
-rw-r--r--indra/newview/skins/default/xui/en/outfit_accordion_tab.xml24
-rw-r--r--indra/newview/skins/default/xui/en/panel_active_object_row.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_adhoc_control_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_avatar_list_item.xml3
-rw-r--r--indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml20
-rw-r--r--indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml105
-rw-r--r--indra/newview/skins/default/xui/en/panel_bodyparts_list_button_bar.xml36
-rw-r--r--indra/newview/skins/default/xui/en/panel_bottomtray.xml489
-rw-r--r--indra/newview/skins/default/xui/en/panel_chat_header.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_classified_info.xml300
-rw-r--r--indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_clothing_list_button_bar.xml37
-rw-r--r--indra/newview/skins/default/xui/en/panel_clothing_list_item.xml137
-rw-r--r--indra/newview/skins/default/xui/en/panel_cof_wearables.xml72
-rw-r--r--indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml73
-rw-r--r--indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml83
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_alpha.xml123
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_classified.xml216
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_eyes.xml63
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_gloves.xml64
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_hair.xml63
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_jacket.xml71
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_pants.xml62
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_pick.xml69
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_profile.xml50
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_shape.xml128
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_shirt.xml58
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_shoes.xml62
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_skin.xml75
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_skirt.xml62
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_socks.xml62
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_tattoo.xml60
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_underpants.xml62
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_undershirt.xml62
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_wearable.xml180
-rw-r--r--indra/newview/skins/default/xui/en/panel_generic_tip.xml23
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_control_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_general.xml96
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml285
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_invite.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_land_money.xml10
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_notices.xml38
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_roles.xml15
-rw-r--r--indra/newview/skins/default/xui/en/panel_im_control_panel.xml57
-rw-r--r--indra/newview/skins/default/xui/en/panel_instant_message.xml10
-rw-r--r--indra/newview/skins/default/xui/en/panel_inventory_item.xml51
-rw-r--r--indra/newview/skins/default/xui/en/panel_landmark_info.xml61
-rw-r--r--indra/newview/skins/default/xui/en/panel_landmarks.xml99
-rw-r--r--indra/newview/skins/default/xui/en/panel_login.xml35
-rw-r--r--indra/newview/skins/default/xui/en/panel_main_inventory.xml628
-rw-r--r--indra/newview/skins/default/xui/en/panel_me.xml8
-rw-r--r--indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml9
-rw-r--r--indra/newview/skins/default/xui/en/panel_my_profile.xml24
-rw-r--r--indra/newview/skins/default/xui/en/panel_navigation_bar.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml13
-rw-r--r--indra/newview/skins/default/xui/en/panel_nearby_media.xml408
-rw-r--r--indra/newview/skins/default/xui/en/panel_notes.xml34
-rw-r--r--indra/newview/skins/default/xui/en/panel_notification.xml16
-rw-r--r--indra/newview/skins/default/xui/en/panel_notifications_channel.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_online_status.xml35
-rw-r--r--indra/newview/skins/default/xui/en/panel_online_status_toast.xml35
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfit_edit.xml520
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfits_inventory.xml156
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfits_list.xml27
-rw-r--r--indra/newview/skins/default/xui/en/panel_people.xml400
-rw-r--r--indra/newview/skins/default/xui/en/panel_pick_info.xml44
-rw-r--r--indra/newview/skins/default/xui/en/panel_pick_list_item.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_picks.xml49
-rw-r--r--indra/newview/skins/default/xui/en/panel_place_profile.xml100
-rw-r--r--indra/newview/skins/default/xui/en/panel_places.xml82
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_advanced.xml65
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_alerts.xml8
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_chat.xml70
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_general.xml53
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml127
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_privacy.xml49
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_setup.xml100
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_sound.xml408
-rw-r--r--indra/newview/skins/default/xui/en/panel_prim_media_controls.xml10
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile.xml54
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile_view.xml19
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_covenant.xml1
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_estate.xml42
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_general.xml47
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_general_layout.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_region_texture.xml232
-rw-r--r--indra/newview/skins/default/xui/en/panel_script_ed.xml3
-rw-r--r--indra/newview/skins/default/xui/en/panel_scrolling_param.xml66
-rw-r--r--indra/newview/skins/default/xui/en/panel_side_tray.xml7
-rw-r--r--indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml8
-rw-r--r--indra/newview/skins/default/xui/en/panel_status_bar.xml81
-rw-r--r--indra/newview/skins/default/xui/en/panel_teleport_history.xml72
-rw-r--r--indra/newview/skins/default/xui/en/panel_toast.xml37
-rw-r--r--indra/newview/skins/default/xui/en/panel_topinfo_bar.xml102
-rw-r--r--indra/newview/skins/default/xui/en/panel_voice_effect.xml33
-rw-r--r--indra/newview/skins/default/xui/en/panel_volume_pulldown.xml19
-rw-r--r--indra/newview/skins/default/xui/en/panel_world_map.xml8
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_appearance.xml118
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_inventory.xml45
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_item_info.xml125
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_task_info.xml26
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml236
-rw-r--r--indra/newview/skins/default/xui/en/teleport_strings.xml3
-rw-r--r--indra/newview/skins/default/xui/en/widgets/accordion.xml18
-rw-r--r--indra/newview/skins/default/xui/en/widgets/button.xml5
-rw-r--r--indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/color_swatch.xml3
-rw-r--r--indra/newview/skins/default/xui/en/widgets/combo_box.xml3
-rw-r--r--indra/newview/skins/default/xui/en/widgets/expandable_text.xml3
-rw-r--r--indra/newview/skins/default/xui/en/widgets/filter_editor.xml4
-rw-r--r--indra/newview/skins/default/xui/en/widgets/flat_list_view.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/flyout_button.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/inspector.xml15
-rw-r--r--indra/newview/skins/default/xui/en/widgets/line_editor.xml1
-rw-r--r--indra/newview/skins/default/xui/en/widgets/loading_indicator.xml8
-rw-r--r--indra/newview/skins/default/xui/en/widgets/location_input.xml11
-rw-r--r--indra/newview/skins/default/xui/en/widgets/panel.xml2
-rw-r--r--indra/newview/skins/default/xui/en/widgets/panel_camera_item.xml70
-rw-r--r--indra/newview/skins/default/xui/en/widgets/search_editor.xml10
-rw-r--r--indra/newview/skins/default/xui/en/widgets/slider_bar.xml3
-rw-r--r--indra/newview/skins/default/xui/en/widgets/tab_container.xml13
-rw-r--r--indra/newview/skins/default/xui/en/widgets/talk_button.xml3
-rw-r--r--indra/newview/skins/default/xui/en/widgets/text.xml3
-rw-r--r--indra/newview/skins/default/xui/en/widgets/text_editor.xml3
-rw-r--r--indra/newview/skins/default/xui/en/widgets/texture_picker.xml3
-rw-r--r--indra/newview/skins/default/xui/en/widgets/tool_tip.xml5
-rw-r--r--indra/newview/skins/default/xui/es/floater_about.xml72
-rw-r--r--indra/newview/skins/default/xui/es/floater_about_land.xml486
-rw-r--r--indra/newview/skins/default/xui/es/floater_activeim.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_animation_preview.xml224
-rw-r--r--indra/newview/skins/default/xui/es/floater_auction.xml14
-rw-r--r--indra/newview/skins/default/xui/es/floater_avatar_picker.xml53
-rw-r--r--indra/newview/skins/default/xui/es/floater_avatar_textures.xml72
-rw-r--r--indra/newview/skins/default/xui/es/floater_beacons.xml24
-rw-r--r--indra/newview/skins/default/xui/es/floater_build_options.xml7
-rw-r--r--indra/newview/skins/default/xui/es/floater_bulk_perms.xml64
-rw-r--r--indra/newview/skins/default/xui/es/floater_bumps.xml27
-rw-r--r--indra/newview/skins/default/xui/es/floater_buy_contents.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_buy_currency.xml81
-rw-r--r--indra/newview/skins/default/xui/es/floater_buy_currency_html.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_buy_land.xml293
-rw-r--r--indra/newview/skins/default/xui/es/floater_buy_object.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_camera.xml24
-rw-r--r--indra/newview/skins/default/xui/es/floater_color_picker.xml9
-rw-r--r--indra/newview/skins/default/xui/es/floater_customize.xml230
-rw-r--r--indra/newview/skins/default/xui/es/floater_day_cycle_options.xml12
-rw-r--r--indra/newview/skins/default/xui/es/floater_env_settings.xml10
-rw-r--r--indra/newview/skins/default/xui/es/floater_event.xml72
-rw-r--r--indra/newview/skins/default/xui/es/floater_gesture.xml30
-rw-r--r--indra/newview/skins/default/xui/es/floater_god_tools.xml126
-rw-r--r--indra/newview/skins/default/xui/es/floater_hardware_settings.xml16
-rw-r--r--indra/newview/skins/default/xui/es/floater_help_browser.xml9
-rw-r--r--indra/newview/skins/default/xui/es/floater_im.xml6
-rw-r--r--indra/newview/skins/default/xui/es/floater_im_container.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_im_session.xml9
-rw-r--r--indra/newview/skins/default/xui/es/floater_image_preview.xml22
-rw-r--r--indra/newview/skins/default/xui/es/floater_incoming_call.xml33
-rw-r--r--indra/newview/skins/default/xui/es/floater_inspect.xml17
-rw-r--r--indra/newview/skins/default/xui/es/floater_inventory.xml59
-rw-r--r--indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml80
-rw-r--r--indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml8
-rw-r--r--indra/newview/skins/default/xui/es/floater_joystick.xml34
-rw-r--r--indra/newview/skins/default/xui/es/floater_lagmeter.xml219
-rw-r--r--indra/newview/skins/default/xui/es/floater_land_holdings.xml6
-rw-r--r--indra/newview/skins/default/xui/es/floater_live_lsleditor.xml19
-rw-r--r--indra/newview/skins/default/xui/es/floater_lsl_guide.xml6
-rw-r--r--indra/newview/skins/default/xui/es/floater_map.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_media_browser.xml8
-rw-r--r--indra/newview/skins/default/xui/es/floater_media_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/es/floater_mem_leaking.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_moveview.xml82
-rw-r--r--indra/newview/skins/default/xui/es/floater_mute_object.xml13
-rw-r--r--indra/newview/skins/default/xui/es/floater_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_openobject.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_outfit_save_as.xml12
-rw-r--r--indra/newview/skins/default/xui/es/floater_outgoing_call.xml40
-rw-r--r--indra/newview/skins/default/xui/es/floater_pay.xml30
-rw-r--r--indra/newview/skins/default/xui/es/floater_pay_object.xml31
-rw-r--r--indra/newview/skins/default/xui/es/floater_perm_prefs.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_postcard.xml14
-rw-r--r--indra/newview/skins/default/xui/es/floater_preferences.xml16
-rw-r--r--indra/newview/skins/default/xui/es/floater_preview_animation.xml7
-rw-r--r--indra/newview/skins/default/xui/es/floater_preview_classified.xml6
-rw-r--r--indra/newview/skins/default/xui/es/floater_preview_event.xml6
-rw-r--r--indra/newview/skins/default/xui/es/floater_preview_gesture.xml66
-rw-r--r--indra/newview/skins/default/xui/es/floater_preview_gesture_info.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_preview_gesture_shortcut.xml15
-rw-r--r--indra/newview/skins/default/xui/es/floater_preview_gesture_steps.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_preview_notecard.xml18
-rw-r--r--indra/newview/skins/default/xui/es/floater_preview_sound.xml7
-rw-r--r--indra/newview/skins/default/xui/es/floater_preview_texture.xml40
-rw-r--r--indra/newview/skins/default/xui/es/floater_publish_classified.xml15
-rw-r--r--indra/newview/skins/default/xui/es/floater_report_abuse.xml103
-rw-r--r--indra/newview/skins/default/xui/es/floater_script_debug_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_script_limits.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_script_preview.xml5
-rw-r--r--indra/newview/skins/default/xui/es/floater_script_queue.xml17
-rw-r--r--indra/newview/skins/default/xui/es/floater_script_search.xml12
-rw-r--r--indra/newview/skins/default/xui/es/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/es/floater_select_key.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_sell_land.xml125
-rw-r--r--indra/newview/skins/default/xui/es/floater_settings_debug.xml12
-rw-r--r--indra/newview/skins/default/xui/es/floater_snapshot.xml96
-rw-r--r--indra/newview/skins/default/xui/es/floater_stats.xml71
-rw-r--r--indra/newview/skins/default/xui/es/floater_sys_well.xml9
-rw-r--r--indra/newview/skins/default/xui/es/floater_telehub.xml15
-rw-r--r--indra/newview/skins/default/xui/es/floater_texture_ctrl.xml14
-rw-r--r--indra/newview/skins/default/xui/es/floater_tools.xml578
-rw-r--r--indra/newview/skins/default/xui/es/floater_top_objects.xml77
-rw-r--r--indra/newview/skins/default/xui/es/floater_tos.xml17
-rw-r--r--indra/newview/skins/default/xui/es/floater_voice_controls.xml28
-rw-r--r--indra/newview/skins/default/xui/es/floater_voice_effect.xml29
-rw-r--r--indra/newview/skins/default/xui/es/floater_water.xml28
-rw-r--r--indra/newview/skins/default/xui/es/floater_wearable_save_as.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_whitelist_entry.xml9
-rw-r--r--indra/newview/skins/default/xui/es/floater_windlight_options.xml21
-rw-r--r--indra/newview/skins/default/xui/es/floater_window_size.xml17
-rw-r--r--indra/newview/skins/default/xui/es/floater_world_map.xml121
-rw-r--r--indra/newview/skins/default/xui/es/inspect_avatar.xml21
-rw-r--r--indra/newview/skins/default/xui/es/inspect_group.xml22
-rw-r--r--indra/newview/skins/default/xui/es/inspect_object.xml41
-rw-r--r--indra/newview/skins/default/xui/es/inspect_remote_object.xml13
-rw-r--r--indra/newview/skins/default/xui/es/language_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/es/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/default/xui/es/menu_attachment_self.xml13
-rw-r--r--indra/newview/skins/default/xui/es/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/default/xui/es/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/default/xui/es/menu_avatar_self.xml30
-rw-r--r--indra/newview/skins/default/xui/es/menu_bottomtray.xml17
-rw-r--r--indra/newview/skins/default/xui/es/menu_cof_attachment.xml4
-rw-r--r--indra/newview/skins/default/xui/es/menu_cof_body_part.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_cof_clothing.xml7
-rw-r--r--indra/newview/skins/default/xui/es/menu_cof_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_edit.xml12
-rw-r--r--indra/newview/skins/default/xui/es/menu_favorites.xml10
-rw-r--r--indra/newview/skins/default/xui/es/menu_gesture_gear.xml10
-rw-r--r--indra/newview/skins/default/xui/es/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_hide_navbar.xml6
-rw-r--r--indra/newview/skins/default/xui/es/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/es/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/default/xui/es/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/default/xui/es/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml19
-rw-r--r--indra/newview/skins/default/xui/es/menu_inspect_object_gear.xml17
-rw-r--r--indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml9
-rw-r--r--indra/newview/skins/default/xui/es/menu_inv_offer_chiclet.xml4
-rw-r--r--indra/newview/skins/default/xui/es/menu_inventory.xml37
-rw-r--r--indra/newview/skins/default/xui/es/menu_inventory_add.xml32
-rw-r--r--indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml14
-rw-r--r--indra/newview/skins/default/xui/es/menu_land.xml9
-rw-r--r--indra/newview/skins/default/xui/es/menu_landmark.xml7
-rw-r--r--indra/newview/skins/default/xui/es/menu_login.xml22
-rw-r--r--indra/newview/skins/default/xui/es/menu_mini_map.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_navbar.xml11
-rw-r--r--indra/newview/skins/default/xui/es/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/default/xui/es/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/es/menu_object.xml27
-rw-r--r--indra/newview/skins/default/xui/es/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_outfit_gear.xml26
-rw-r--r--indra/newview/skins/default/xui/es/menu_outfit_tab.xml9
-rw-r--r--indra/newview/skins/default/xui/es/menu_participant_list.xml21
-rw-r--r--indra/newview/skins/default/xui/es/menu_people_friends_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/es/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/default/xui/es/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_people_nearby.xml13
-rw-r--r--indra/newview/skins/default/xui/es/menu_people_nearby_multiselect.xml9
-rw-r--r--indra/newview/skins/default/xui/es/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/es/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/es/menu_picks.xml8
-rw-r--r--indra/newview/skins/default/xui/es/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_place.xml7
-rw-r--r--indra/newview/skins/default/xui/es/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_places_gear_folder.xml15
-rw-r--r--indra/newview/skins/default/xui/es/menu_places_gear_landmark.xml18
-rw-r--r--indra/newview/skins/default/xui/es/menu_profile_overflow.xml12
-rw-r--r--indra/newview/skins/default/xui/es/menu_save_outfit.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_script_chiclet.xml4
-rw-r--r--indra/newview/skins/default/xui/es/menu_slurl.xml2
-rw-r--r--indra/newview/skins/default/xui/es/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/es/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/default/xui/es/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/default/xui/es/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/default/xui/es/menu_url_group.xml6
-rw-r--r--indra/newview/skins/default/xui/es/menu_url_http.xml7
-rw-r--r--indra/newview/skins/default/xui/es/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/default/xui/es/menu_url_map.xml6
-rw-r--r--indra/newview/skins/default/xui/es/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/default/xui/es/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/default/xui/es/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/default/xui/es/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/default/xui/es/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/default/xui/es/menu_viewer.xml489
-rw-r--r--indra/newview/skins/default/xui/es/menu_wearable_list_item.xml13
-rw-r--r--indra/newview/skins/default/xui/es/mime_types_linux.xml217
-rw-r--r--indra/newview/skins/default/xui/es/mime_types_mac.xml217
-rw-r--r--indra/newview/skins/default/xui/es/notifications.xml2248
-rw-r--r--indra/newview/skins/default/xui/es/outfit_accordion_tab.xml4
-rw-r--r--indra/newview/skins/default/xui/es/panel_active_object_row.xml9
-rw-r--r--indra/newview/skins/default/xui/es/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/default/xui/es/panel_avatar_list_item.xml26
-rw-r--r--indra/newview/skins/default/xui/es/panel_block_list_sidetray.xml10
-rw-r--r--indra/newview/skins/default/xui/es/panel_body_parts_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/es/panel_bodyparts_list_button_bar.xml5
-rw-r--r--indra/newview/skins/default/xui/es/panel_bottomtray.xml49
-rw-r--r--indra/newview/skins/default/xui/es/panel_bottomtray_lite.xml8
-rw-r--r--indra/newview/skins/default/xui/es/panel_classified_info.xml53
-rw-r--r--indra/newview/skins/default/xui/es/panel_clothing_list_button_bar.xml5
-rw-r--r--indra/newview/skins/default/xui/es/panel_clothing_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/es/panel_cof_wearables.xml8
-rw-r--r--indra/newview/skins/default/xui/es/panel_deletable_wearable_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/es/panel_dummy_clothing_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_alpha.xml10
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_classified.xml48
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_eyes.xml11
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_gloves.xml12
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_hair.xml14
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_jacket.xml13
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_pants.xml12
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_pick.xml31
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_profile.xml94
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_shape.xml26
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_shirt.xml12
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_shoes.xml12
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_skin.xml16
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_skirt.xml12
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_socks.xml12
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_tattoo.xml9
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_underpants.xml12
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_undershirt.xml12
-rw-r--r--indra/newview/skins/default/xui/es/panel_edit_wearable.xml107
-rw-r--r--indra/newview/skins/default/xui/es/panel_friends.xml10
-rw-r--r--indra/newview/skins/default/xui/es/panel_group_control_panel.xml17
-rw-r--r--indra/newview/skins/default/xui/es/panel_group_general.xml102
-rw-r--r--indra/newview/skins/default/xui/es/panel_group_info_sidetray.xml35
-rw-r--r--indra/newview/skins/default/xui/es/panel_group_invite.xml29
-rw-r--r--indra/newview/skins/default/xui/es/panel_group_land_money.xml139
-rw-r--r--indra/newview/skins/default/xui/es/panel_group_list_item.xml5
-rw-r--r--indra/newview/skins/default/xui/es/panel_group_notices.xml44
-rw-r--r--indra/newview/skins/default/xui/es/panel_group_notify.xml8
-rw-r--r--indra/newview/skins/default/xui/es/panel_group_roles.xml171
-rw-r--r--indra/newview/skins/default/xui/es/panel_im_control_panel.xml29
-rw-r--r--indra/newview/skins/default/xui/es/panel_inventory_item.xml4
-rw-r--r--indra/newview/skins/default/xui/es/panel_landmark_info.xml38
-rw-r--r--indra/newview/skins/default/xui/es/panel_landmarks.xml14
-rw-r--r--indra/newview/skins/default/xui/es/panel_login.xml61
-rw-r--r--indra/newview/skins/default/xui/es/panel_main_inventory.xml28
-rw-r--r--indra/newview/skins/default/xui/es/panel_me.xml7
-rw-r--r--indra/newview/skins/default/xui/es/panel_media_settings_general.xml32
-rw-r--r--indra/newview/skins/default/xui/es/panel_media_settings_permissions.xml29
-rw-r--r--indra/newview/skins/default/xui/es/panel_media_settings_security.xml12
-rw-r--r--indra/newview/skins/default/xui/es/panel_my_profile.xml35
-rw-r--r--indra/newview/skins/default/xui/es/panel_navigation_bar.xml18
-rw-r--r--indra/newview/skins/default/xui/es/panel_nearby_chat.xml9
-rw-r--r--indra/newview/skins/default/xui/es/panel_nearby_chat_bar.xml5
-rw-r--r--indra/newview/skins/default/xui/es/panel_nearby_media.xml65
-rw-r--r--indra/newview/skins/default/xui/es/panel_notes.xml23
-rw-r--r--indra/newview/skins/default/xui/es/panel_online_status.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_online_status_toast.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_outfit_edit.xml41
-rw-r--r--indra/newview/skins/default/xui/es/panel_outfits_inventory.xml13
-rw-r--r--indra/newview/skins/default/xui/es/panel_outfits_inventory_gear_default.xml9
-rw-r--r--indra/newview/skins/default/xui/es/panel_people.xml64
-rw-r--r--indra/newview/skins/default/xui/es/panel_pick_info.xml16
-rw-r--r--indra/newview/skins/default/xui/es/panel_picks.xml20
-rw-r--r--indra/newview/skins/default/xui/es/panel_place_profile.xml111
-rw-r--r--indra/newview/skins/default/xui/es/panel_places.xml16
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_advanced.xml43
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_alerts.xml18
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_chat.xml43
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_general.xml125
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml214
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_privacy.xml46
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_setup.xml61
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_sound.xml73
-rw-r--r--indra/newview/skins/default/xui/es/panel_prim_media_controls.xml79
-rw-r--r--indra/newview/skins/default/xui/es/panel_profile.xml40
-rw-r--r--indra/newview/skins/default/xui/es/panel_profile_view.xml16
-rw-r--r--indra/newview/skins/default/xui/es/panel_region_covenant.xml10
-rw-r--r--indra/newview/skins/default/xui/es/panel_region_debug.xml22
-rw-r--r--indra/newview/skins/default/xui/es/panel_region_estate.xml13
-rw-r--r--indra/newview/skins/default/xui/es/panel_region_general.xml32
-rw-r--r--indra/newview/skins/default/xui/es/panel_region_general_layout.xml43
-rw-r--r--indra/newview/skins/default/xui/es/panel_region_texture.xml10
-rw-r--r--indra/newview/skins/default/xui/es/panel_script_ed.xml43
-rw-r--r--indra/newview/skins/default/xui/es/panel_script_limits_my_avatar.xml16
-rw-r--r--indra/newview/skins/default/xui/es/panel_script_limits_region_memory.xml20
-rw-r--r--indra/newview/skins/default/xui/es/panel_side_tray.xml29
-rw-r--r--indra/newview/skins/default/xui/es/panel_side_tray_tab_caption.xml5
-rw-r--r--indra/newview/skins/default/xui/es/panel_stand_stop_flying.xml6
-rw-r--r--indra/newview/skins/default/xui/es/panel_status_bar.xml57
-rw-r--r--indra/newview/skins/default/xui/es/panel_teleport_history.xml18
-rw-r--r--indra/newview/skins/default/xui/es/panel_teleport_history_item.xml4
-rw-r--r--indra/newview/skins/default/xui/es/panel_voice_effect.xml15
-rw-r--r--indra/newview/skins/default/xui/es/panel_world_map.xml12
-rw-r--r--indra/newview/skins/default/xui/es/role_actions.xml243
-rw-r--r--indra/newview/skins/default/xui/es/sidepanel_appearance.xml14
-rw-r--r--indra/newview/skins/default/xui/es/sidepanel_inventory.xml13
-rw-r--r--indra/newview/skins/default/xui/es/sidepanel_item_info.xml73
-rw-r--r--indra/newview/skins/default/xui/es/sidepanel_task_info.xml129
-rw-r--r--indra/newview/skins/default/xui/es/strings.xml3336
-rw-r--r--indra/newview/skins/default/xui/es/teleport_strings.xml25
-rw-r--r--indra/newview/skins/default/xui/fr/floater_about.xml25
-rw-r--r--indra/newview/skins/default/xui/fr/floater_about_land.xml88
-rw-r--r--indra/newview/skins/default/xui/fr/floater_animation_preview.xml51
-rw-r--r--indra/newview/skins/default/xui/fr/floater_avatar_picker.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_avatar_textures.xml74
-rw-r--r--indra/newview/skins/default/xui/fr/floater_beacons.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_bulk_perms.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/floater_buy_currency.xml11
-rw-r--r--indra/newview/skins/default/xui/fr/floater_buy_currency_html.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_buy_land.xml257
-rw-r--r--indra/newview/skins/default/xui/fr/floater_camera.xml14
-rw-r--r--indra/newview/skins/default/xui/fr/floater_color_picker.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_customize.xml178
-rw-r--r--indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml43
-rw-r--r--indra/newview/skins/default/xui/fr/floater_env_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/floater_event.xml69
-rw-r--r--indra/newview/skins/default/xui/fr/floater_gesture.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/floater_god_tools.xml15
-rw-r--r--indra/newview/skins/default/xui/fr/floater_help_browser.xml11
-rw-r--r--indra/newview/skins/default/xui/fr/floater_im.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_image_preview.xml20
-rw-r--r--indra/newview/skins/default/xui/fr/floater_inspect.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_inventory.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/floater_joystick.xml26
-rw-r--r--indra/newview/skins/default/xui/fr/floater_lagmeter.xml18
-rw-r--r--indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/floater_lsl_guide.xml9
-rw-r--r--indra/newview/skins/default/xui/fr/floater_map.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_media_browser.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/floater_mem_leaking.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/floater_moveview.xml46
-rw-r--r--indra/newview/skins/default/xui/fr/floater_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_notification.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_outfit_save_as.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/floater_outgoing_call.xml9
-rw-r--r--indra/newview/skins/default/xui/fr/floater_pay_object.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/floater_perm_prefs.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_postcard.xml12
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preferences.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preview_animation.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preview_gesture.xml12
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preview_gesture_shortcut.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preview_notecard.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preview_sound.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_preview_texture.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/floater_publish_classified.xml15
-rw-r--r--indra/newview/skins/default/xui/fr/floater_report_abuse.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/floater_script_preview.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_sell_land.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_settings_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_snapshot.xml89
-rw-r--r--indra/newview/skins/default/xui/fr/floater_sys_well.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/floater_telehub.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/floater_tools.xml33
-rw-r--r--indra/newview/skins/default/xui/fr/floater_tos.xml23
-rw-r--r--indra/newview/skins/default/xui/fr/floater_url_entry.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/floater_voice_controls.xml3
-rw-r--r--indra/newview/skins/default/xui/fr/floater_water.xml15
-rw-r--r--indra/newview/skins/default/xui/fr/floater_wearable_save_as.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/floater_windlight_options.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/floater_world_map.xml54
-rw-r--r--indra/newview/skins/default/xui/fr/inspect_avatar.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/inspect_remote_object.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/language_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/menu_attachment_other.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/menu_attachment_self.xml3
-rw-r--r--indra/newview/skins/default/xui/fr/menu_avatar_other.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/menu_avatar_self.xml17
-rw-r--r--indra/newview/skins/default/xui/fr/menu_bottomtray.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/menu_edit.xml12
-rw-r--r--indra/newview/skins/default/xui/fr/menu_group_plus.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml3
-rw-r--r--indra/newview/skins/default/xui/fr/menu_inv_offer_chiclet.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/menu_inventory.xml14
-rw-r--r--indra/newview/skins/default/xui/fr/menu_inventory_add.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/menu_land.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/menu_login.xml14
-rw-r--r--indra/newview/skins/default/xui/fr/menu_mini_map.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/menu_object.xml12
-rw-r--r--indra/newview/skins/default/xui/fr/menu_participant_list.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/menu_people_nearby.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/menu_people_nearby_multiselect.xml1
-rw-r--r--indra/newview/skins/default/xui/fr/menu_profile_overflow.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/menu_save_outfit.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/menu_script_chiclet.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/menu_viewer.xml90
-rw-r--r--indra/newview/skins/default/xui/fr/mime_types_linux.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/mime_types_mac.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/notifications.xml276
-rw-r--r--indra/newview/skins/default/xui/fr/outfit_accordion_tab.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_audio_device.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_body_parts_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_bodyparts_list_button_bar.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/panel_bottomtray.xml28
-rw-r--r--indra/newview/skins/default/xui/fr/panel_bottomtray_lite.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/panel_classified_info.xml49
-rw-r--r--indra/newview/skins/default/xui/fr/panel_clothing_list_button_bar.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/panel_clothing_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_cof_wearables.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/panel_deletable_wearable_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_dummy_clothing_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_alpha.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_classified.xml29
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_eyes.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_gloves.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_hair.xml14
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_jacket.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_pants.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_pick.xml9
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_profile.xml12
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_shape.xml34
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_shirt.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_shoes.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_skin.xml18
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_skirt.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_socks.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_tattoo.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_underpants.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_undershirt.xml10
-rw-r--r--indra/newview/skins/default/xui/fr/panel_edit_wearable.xml21
-rw-r--r--indra/newview/skins/default/xui/fr/panel_friends.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_group_control_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_group_general.xml31
-rw-r--r--indra/newview/skins/default/xui/fr/panel_group_info_sidetray.xml43
-rw-r--r--indra/newview/skins/default/xui/fr/panel_group_land_money.xml110
-rw-r--r--indra/newview/skins/default/xui/fr/panel_group_notices.xml23
-rw-r--r--indra/newview/skins/default/xui/fr/panel_group_roles.xml18
-rw-r--r--indra/newview/skins/default/xui/fr/panel_groups.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_im_control_panel.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/panel_inventory_item.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_landmark_info.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/panel_landmarks.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_login.xml18
-rw-r--r--indra/newview/skins/default/xui/fr/panel_main_inventory.xml76
-rw-r--r--indra/newview/skins/default/xui/fr/panel_me.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_media_settings_general.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_media_settings_permissions.xml15
-rw-r--r--indra/newview/skins/default/xui/fr/panel_media_settings_security.xml3
-rw-r--r--indra/newview/skins/default/xui/fr/panel_my_profile.xml9
-rw-r--r--indra/newview/skins/default/xui/fr/panel_navigation_bar.xml9
-rw-r--r--indra/newview/skins/default/xui/fr/panel_nearby_chat.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_nearby_chat_bar.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_nearby_media.xml65
-rw-r--r--indra/newview/skins/default/xui/fr/panel_notes.xml8
-rw-r--r--indra/newview/skins/default/xui/fr/panel_online_status.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_online_status_toast.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_outfit_edit.xml45
-rw-r--r--indra/newview/skins/default/xui/fr/panel_outfits_inventory.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_people.xml32
-rw-r--r--indra/newview/skins/default/xui/fr/panel_place_profile.xml87
-rw-r--r--indra/newview/skins/default/xui/fr/panel_places.xml11
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml49
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_alerts.xml4
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_chat.xml20
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_general.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml28
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_setup.xml21
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_sound.xml17
-rw-r--r--indra/newview/skins/default/xui/fr/panel_prim_media_controls.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_profile.xml14
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_covenant.xml13
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_debug.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_estate.xml14
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_general.xml28
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_general_layout.xml14
-rw-r--r--indra/newview/skins/default/xui/fr/panel_region_texture.xml18
-rw-r--r--indra/newview/skins/default/xui/fr/panel_script_limits_my_avatar.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/panel_script_limits_region_memory.xml16
-rw-r--r--indra/newview/skins/default/xui/fr/panel_side_tray.xml18
-rw-r--r--indra/newview/skins/default/xui/fr/panel_status_bar.xml5
-rw-r--r--indra/newview/skins/default/xui/fr/panel_world_map.xml6
-rw-r--r--indra/newview/skins/default/xui/fr/role_actions.xml16
-rw-r--r--indra/newview/skins/default/xui/fr/sidepanel_appearance.xml11
-rw-r--r--indra/newview/skins/default/xui/fr/sidepanel_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/sidepanel_task_info.xml45
-rw-r--r--indra/newview/skins/default/xui/fr/strings.xml517
-rw-r--r--indra/newview/skins/default/xui/fr/teleport_strings.xml5
-rw-r--r--indra/newview/skins/default/xui/it/floater_about.xml27
-rw-r--r--indra/newview/skins/default/xui/it/floater_about_land.xml138
-rw-r--r--indra/newview/skins/default/xui/it/floater_activeim.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_animation_preview.xml113
-rw-r--r--indra/newview/skins/default/xui/it/floater_auction.xml6
-rw-r--r--indra/newview/skins/default/xui/it/floater_avatar_picker.xml8
-rw-r--r--indra/newview/skins/default/xui/it/floater_avatar_textures.xml72
-rw-r--r--indra/newview/skins/default/xui/it/floater_beacons.xml12
-rw-r--r--indra/newview/skins/default/xui/it/floater_build_options.xml10
-rw-r--r--indra/newview/skins/default/xui/it/floater_bulk_perms.xml26
-rw-r--r--indra/newview/skins/default/xui/it/floater_buy_contents.xml3
-rw-r--r--indra/newview/skins/default/xui/it/floater_buy_currency.xml26
-rw-r--r--indra/newview/skins/default/xui/it/floater_buy_currency_html.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_buy_land.xml271
-rw-r--r--indra/newview/skins/default/xui/it/floater_buy_object.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_camera.xml31
-rw-r--r--indra/newview/skins/default/xui/it/floater_color_picker.xml6
-rw-r--r--indra/newview/skins/default/xui/it/floater_customize.xml180
-rw-r--r--indra/newview/skins/default/xui/it/floater_day_cycle_options.xml12
-rw-r--r--indra/newview/skins/default/xui/it/floater_device_settings.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_event.xml72
-rw-r--r--indra/newview/skins/default/xui/it/floater_gesture.xml20
-rw-r--r--indra/newview/skins/default/xui/it/floater_god_tools.xml17
-rw-r--r--indra/newview/skins/default/xui/it/floater_hardware_settings.xml5
-rw-r--r--indra/newview/skins/default/xui/it/floater_help_browser.xml9
-rw-r--r--indra/newview/skins/default/xui/it/floater_hud.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_im.xml6
-rw-r--r--indra/newview/skins/default/xui/it/floater_im_container.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_im_session.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_image_preview.xml20
-rw-r--r--indra/newview/skins/default/xui/it/floater_incoming_call.xml20
-rw-r--r--indra/newview/skins/default/xui/it/floater_inventory.xml10
-rw-r--r--indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_joystick.xml18
-rw-r--r--indra/newview/skins/default/xui/it/floater_lagmeter.xml6
-rw-r--r--indra/newview/skins/default/xui/it/floater_land_holdings.xml6
-rw-r--r--indra/newview/skins/default/xui/it/floater_live_lsleditor.xml4
-rw-r--r--indra/newview/skins/default/xui/it/floater_lsl_guide.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_map.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_media_browser.xml8
-rw-r--r--indra/newview/skins/default/xui/it/floater_media_settings.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_mem_leaking.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_moveview.xml72
-rw-r--r--indra/newview/skins/default/xui/it/floater_mute_object.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_outfit_save_as.xml12
-rw-r--r--indra/newview/skins/default/xui/it/floater_outgoing_call.xml30
-rw-r--r--indra/newview/skins/default/xui/it/floater_pay.xml6
-rw-r--r--indra/newview/skins/default/xui/it/floater_pay_object.xml8
-rw-r--r--indra/newview/skins/default/xui/it/floater_perm_prefs.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_postcard.xml4
-rw-r--r--indra/newview/skins/default/xui/it/floater_preferences.xml12
-rw-r--r--indra/newview/skins/default/xui/it/floater_preview_animation.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_preview_gesture.xml11
-rw-r--r--indra/newview/skins/default/xui/it/floater_preview_gesture_info.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_preview_gesture_shortcut.xml6
-rw-r--r--indra/newview/skins/default/xui/it/floater_preview_gesture_steps.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_preview_notecard.xml12
-rw-r--r--indra/newview/skins/default/xui/it/floater_preview_sound.xml6
-rw-r--r--indra/newview/skins/default/xui/it/floater_preview_texture.xml23
-rw-r--r--indra/newview/skins/default/xui/it/floater_publish_classified.xml15
-rw-r--r--indra/newview/skins/default/xui/it/floater_region_info.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_report_abuse.xml18
-rw-r--r--indra/newview/skins/default/xui/it/floater_script_limits.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_script_preview.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_script_queue.xml8
-rw-r--r--indra/newview/skins/default/xui/it/floater_search.xml6
-rw-r--r--indra/newview/skins/default/xui/it/floater_select_key.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_sell_land.xml28
-rw-r--r--indra/newview/skins/default/xui/it/floater_settings_debug.xml10
-rw-r--r--indra/newview/skins/default/xui/it/floater_snapshot.xml97
-rw-r--r--indra/newview/skins/default/xui/it/floater_stats.xml78
-rw-r--r--indra/newview/skins/default/xui/it/floater_sys_well.xml6
-rw-r--r--indra/newview/skins/default/xui/it/floater_telehub.xml4
-rw-r--r--indra/newview/skins/default/xui/it/floater_texture_ctrl.xml12
-rw-r--r--indra/newview/skins/default/xui/it/floater_tools.xml200
-rw-r--r--indra/newview/skins/default/xui/it/floater_top_objects.xml69
-rw-r--r--indra/newview/skins/default/xui/it/floater_tos.xml16
-rw-r--r--indra/newview/skins/default/xui/it/floater_voice_controls.xml25
-rw-r--r--indra/newview/skins/default/xui/it/floater_voice_effect.xml29
-rw-r--r--indra/newview/skins/default/xui/it/floater_water.xml4
-rw-r--r--indra/newview/skins/default/xui/it/floater_wearable_save_as.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_whitelist_entry.xml4
-rw-r--r--indra/newview/skins/default/xui/it/floater_windlight_options.xml34
-rw-r--r--indra/newview/skins/default/xui/it/floater_window_size.xml17
-rw-r--r--indra/newview/skins/default/xui/it/floater_world_map.xml72
-rw-r--r--indra/newview/skins/default/xui/it/inspect_avatar.xml14
-rw-r--r--indra/newview/skins/default/xui/it/inspect_group.xml12
-rw-r--r--indra/newview/skins/default/xui/it/inspect_object.xml23
-rw-r--r--indra/newview/skins/default/xui/it/inspect_remote_object.xml2
-rw-r--r--indra/newview/skins/default/xui/it/language_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/it/menu_attachment_other.xml12
-rw-r--r--indra/newview/skins/default/xui/it/menu_attachment_self.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_avatar_icon.xml2
-rw-r--r--indra/newview/skins/default/xui/it/menu_avatar_other.xml10
-rw-r--r--indra/newview/skins/default/xui/it/menu_avatar_self.xml19
-rw-r--r--indra/newview/skins/default/xui/it/menu_bottomtray.xml13
-rw-r--r--indra/newview/skins/default/xui/it/menu_cof_attachment.xml4
-rw-r--r--indra/newview/skins/default/xui/it/menu_cof_body_part.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_cof_clothing.xml7
-rw-r--r--indra/newview/skins/default/xui/it/menu_cof_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_edit.xml12
-rw-r--r--indra/newview/skins/default/xui/it/menu_favorites.xml4
-rw-r--r--indra/newview/skins/default/xui/it/menu_gesture_gear.xml4
-rw-r--r--indra/newview/skins/default/xui/it/menu_group_plus.xml2
-rw-r--r--indra/newview/skins/default/xui/it/menu_hide_navbar.xml3
-rw-r--r--indra/newview/skins/default/xui/it/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/it/menu_imchiclet_group.xml2
-rw-r--r--indra/newview/skins/default/xui/it/menu_imchiclet_p2p.xml2
-rw-r--r--indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml12
-rw-r--r--indra/newview/skins/default/xui/it/menu_inspect_object_gear.xml12
-rw-r--r--indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_inv_offer_chiclet.xml4
-rw-r--r--indra/newview/skins/default/xui/it/menu_inventory.xml65
-rw-r--r--indra/newview/skins/default/xui/it/menu_inventory_add.xml44
-rw-r--r--indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml14
-rw-r--r--indra/newview/skins/default/xui/it/menu_land.xml8
-rw-r--r--indra/newview/skins/default/xui/it/menu_landmark.xml6
-rw-r--r--indra/newview/skins/default/xui/it/menu_login.xml31
-rw-r--r--indra/newview/skins/default/xui/it/menu_mini_map.xml2
-rw-r--r--indra/newview/skins/default/xui/it/menu_navbar.xml6
-rw-r--r--indra/newview/skins/default/xui/it/menu_nearby_chat.xml8
-rw-r--r--indra/newview/skins/default/xui/it/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/it/menu_object.xml23
-rw-r--r--indra/newview/skins/default/xui/it/menu_outfit_gear.xml26
-rw-r--r--indra/newview/skins/default/xui/it/menu_outfit_tab.xml9
-rw-r--r--indra/newview/skins/default/xui/it/menu_participant_list.xml21
-rw-r--r--indra/newview/skins/default/xui/it/menu_people_friends_view_sort.xml6
-rw-r--r--indra/newview/skins/default/xui/it/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/default/xui/it/menu_people_nearby.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_people_nearby_multiselect.xml3
-rw-r--r--indra/newview/skins/default/xui/it/menu_people_nearby_view_sort.xml10
-rw-r--r--indra/newview/skins/default/xui/it/menu_people_recent_view_sort.xml6
-rw-r--r--indra/newview/skins/default/xui/it/menu_picks.xml2
-rw-r--r--indra/newview/skins/default/xui/it/menu_picks_plus.xml4
-rw-r--r--indra/newview/skins/default/xui/it/menu_place.xml6
-rw-r--r--indra/newview/skins/default/xui/it/menu_place_add_button.xml2
-rw-r--r--indra/newview/skins/default/xui/it/menu_places_gear_folder.xml12
-rw-r--r--indra/newview/skins/default/xui/it/menu_places_gear_landmark.xml18
-rw-r--r--indra/newview/skins/default/xui/it/menu_profile_overflow.xml7
-rw-r--r--indra/newview/skins/default/xui/it/menu_save_outfit.xml5
-rw-r--r--indra/newview/skins/default/xui/it/menu_script_chiclet.xml4
-rw-r--r--indra/newview/skins/default/xui/it/menu_teleport_history_gear.xml2
-rw-r--r--indra/newview/skins/default/xui/it/menu_teleport_history_item.xml2
-rw-r--r--indra/newview/skins/default/xui/it/menu_text_editor.xml4
-rw-r--r--indra/newview/skins/default/xui/it/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/default/xui/it/menu_url_group.xml6
-rw-r--r--indra/newview/skins/default/xui/it/menu_url_http.xml4
-rw-r--r--indra/newview/skins/default/xui/it/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/default/xui/it/menu_url_map.xml4
-rw-r--r--indra/newview/skins/default/xui/it/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/default/xui/it/menu_url_parcel.xml4
-rw-r--r--indra/newview/skins/default/xui/it/menu_url_slapp.xml4
-rw-r--r--indra/newview/skins/default/xui/it/menu_url_slurl.xml6
-rw-r--r--indra/newview/skins/default/xui/it/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/default/xui/it/menu_viewer.xml426
-rw-r--r--indra/newview/skins/default/xui/it/menu_wearable_list_item.xml13
-rw-r--r--indra/newview/skins/default/xui/it/mime_types_linux.xml42
-rw-r--r--indra/newview/skins/default/xui/it/mime_types_mac.xml16
-rw-r--r--indra/newview/skins/default/xui/it/notifications.xml898
-rw-r--r--indra/newview/skins/default/xui/it/outfit_accordion_tab.xml4
-rw-r--r--indra/newview/skins/default/xui/it/panel_adhoc_control_panel.xml16
-rw-r--r--indra/newview/skins/default/xui/it/panel_avatar_list_item.xml15
-rw-r--r--indra/newview/skins/default/xui/it/panel_block_list_sidetray.xml8
-rw-r--r--indra/newview/skins/default/xui/it/panel_body_parts_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/it/panel_bodyparts_list_button_bar.xml5
-rw-r--r--indra/newview/skins/default/xui/it/panel_bottomtray.xml44
-rw-r--r--indra/newview/skins/default/xui/it/panel_bottomtray_lite.xml8
-rw-r--r--indra/newview/skins/default/xui/it/panel_classified_info.xml51
-rw-r--r--indra/newview/skins/default/xui/it/panel_clothing_list_button_bar.xml5
-rw-r--r--indra/newview/skins/default/xui/it/panel_clothing_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/it/panel_cof_wearables.xml8
-rw-r--r--indra/newview/skins/default/xui/it/panel_deletable_wearable_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/it/panel_dummy_clothing_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_alpha.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_classified.xml35
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_eyes.xml8
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_gloves.xml8
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_hair.xml14
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_jacket.xml8
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_pants.xml8
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_pick.xml13
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_profile.xml25
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_shape.xml41
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_shirt.xml10
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_shoes.xml8
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_skin.xml20
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_skirt.xml8
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_socks.xml10
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_tattoo.xml7
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_underpants.xml8
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_undershirt.xml8
-rw-r--r--indra/newview/skins/default/xui/it/panel_edit_wearable.xml48
-rw-r--r--indra/newview/skins/default/xui/it/panel_friends.xml4
-rw-r--r--indra/newview/skins/default/xui/it/panel_group_control_panel.xml20
-rw-r--r--indra/newview/skins/default/xui/it/panel_group_general.xml49
-rw-r--r--indra/newview/skins/default/xui/it/panel_group_info_sidetray.xml47
-rw-r--r--indra/newview/skins/default/xui/it/panel_group_invite.xml14
-rw-r--r--indra/newview/skins/default/xui/it/panel_group_land_money.xml127
-rw-r--r--indra/newview/skins/default/xui/it/panel_group_list_item.xml1
-rw-r--r--indra/newview/skins/default/xui/it/panel_group_notices.xml21
-rw-r--r--indra/newview/skins/default/xui/it/panel_group_notify.xml6
-rw-r--r--indra/newview/skins/default/xui/it/panel_group_roles.xml45
-rw-r--r--indra/newview/skins/default/xui/it/panel_im_control_panel.xml36
-rw-r--r--indra/newview/skins/default/xui/it/panel_inventory_item.xml4
-rw-r--r--indra/newview/skins/default/xui/it/panel_landmark_info.xml23
-rw-r--r--indra/newview/skins/default/xui/it/panel_landmarks.xml8
-rw-r--r--indra/newview/skins/default/xui/it/panel_login.xml25
-rw-r--r--indra/newview/skins/default/xui/it/panel_main_inventory.xml76
-rw-r--r--indra/newview/skins/default/xui/it/panel_me.xml6
-rw-r--r--indra/newview/skins/default/xui/it/panel_media_settings_general.xml22
-rw-r--r--indra/newview/skins/default/xui/it/panel_media_settings_permissions.xml17
-rw-r--r--indra/newview/skins/default/xui/it/panel_media_settings_security.xml8
-rw-r--r--indra/newview/skins/default/xui/it/panel_my_profile.xml58
-rw-r--r--indra/newview/skins/default/xui/it/panel_navigation_bar.xml15
-rw-r--r--indra/newview/skins/default/xui/it/panel_nearby_chat_bar.xml4
-rw-r--r--indra/newview/skins/default/xui/it/panel_nearby_media.xml65
-rw-r--r--indra/newview/skins/default/xui/it/panel_notes.xml14
-rw-r--r--indra/newview/skins/default/xui/it/panel_online_status.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_online_status_toast.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_outfit_edit.xml41
-rw-r--r--indra/newview/skins/default/xui/it/panel_outfits_inventory.xml16
-rw-r--r--indra/newview/skins/default/xui/it/panel_outfits_inventory_gear_default.xml12
-rw-r--r--indra/newview/skins/default/xui/it/panel_people.xml45
-rw-r--r--indra/newview/skins/default/xui/it/panel_pick_info.xml4
-rw-r--r--indra/newview/skins/default/xui/it/panel_picks.xml18
-rw-r--r--indra/newview/skins/default/xui/it/panel_place_profile.xml88
-rw-r--r--indra/newview/skins/default/xui/it/panel_places.xml18
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_advanced.xml63
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_alerts.xml8
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_chat.xml27
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_general.xml47
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml21
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_privacy.xml26
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_setup.xml39
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_sound.xml29
-rw-r--r--indra/newview/skins/default/xui/it/panel_prim_media_controls.xml73
-rw-r--r--indra/newview/skins/default/xui/it/panel_profile.xml64
-rw-r--r--indra/newview/skins/default/xui/it/panel_profile_view.xml6
-rw-r--r--indra/newview/skins/default/xui/it/panel_region_covenant.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_region_debug.xml6
-rw-r--r--indra/newview/skins/default/xui/it/panel_region_estate.xml13
-rw-r--r--indra/newview/skins/default/xui/it/panel_region_general.xml34
-rw-r--r--indra/newview/skins/default/xui/it/panel_region_general_layout.xml43
-rw-r--r--indra/newview/skins/default/xui/it/panel_region_texture.xml12
-rw-r--r--indra/newview/skins/default/xui/it/panel_script_ed.xml22
-rw-r--r--indra/newview/skins/default/xui/it/panel_script_limits_my_avatar.xml16
-rw-r--r--indra/newview/skins/default/xui/it/panel_script_limits_region_memory.xml20
-rw-r--r--indra/newview/skins/default/xui/it/panel_side_tray.xml27
-rw-r--r--indra/newview/skins/default/xui/it/panel_side_tray_tab_caption.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_stand_stop_flying.xml2
-rw-r--r--indra/newview/skins/default/xui/it/panel_status_bar.xml12
-rw-r--r--indra/newview/skins/default/xui/it/panel_teleport_history.xml18
-rw-r--r--indra/newview/skins/default/xui/it/panel_teleport_history_item.xml4
-rw-r--r--indra/newview/skins/default/xui/it/panel_voice_effect.xml15
-rw-r--r--indra/newview/skins/default/xui/it/panel_world_map.xml8
-rw-r--r--indra/newview/skins/default/xui/it/role_actions.xml112
-rw-r--r--indra/newview/skins/default/xui/it/sidepanel_appearance.xml15
-rw-r--r--indra/newview/skins/default/xui/it/sidepanel_inventory.xml8
-rw-r--r--indra/newview/skins/default/xui/it/sidepanel_item_info.xml63
-rw-r--r--indra/newview/skins/default/xui/it/sidepanel_task_info.xml126
-rw-r--r--indra/newview/skins/default/xui/it/strings.xml1401
-rw-r--r--indra/newview/skins/default/xui/it/teleport_strings.xml13
-rw-r--r--indra/newview/skins/default/xui/ja/floater_about.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/floater_about_land.xml183
-rw-r--r--indra/newview/skins/default/xui/ja/floater_animation_preview.xml63
-rw-r--r--indra/newview/skins/default/xui/ja/floater_avatar_textures.xml76
-rw-r--r--indra/newview/skins/default/xui/ja/floater_build_options.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/floater_bulk_perms.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/floater_buy_contents.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/floater_buy_currency.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_buy_currency_html.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_buy_land.xml261
-rw-r--r--indra/newview/skins/default/xui/ja/floater_buy_object.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/floater_camera.xml31
-rw-r--r--indra/newview/skins/default/xui/ja/floater_color_picker.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_critical.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_customize.xml72
-rw-r--r--indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml41
-rw-r--r--indra/newview/skins/default/xui/ja/floater_event.xml69
-rw-r--r--indra/newview/skins/default/xui/ja/floater_gesture.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_god_tools.xml17
-rw-r--r--indra/newview/skins/default/xui/ja/floater_help_browser.xml11
-rw-r--r--indra/newview/skins/default/xui/ja/floater_im.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_im_container.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_image_preview.xml26
-rw-r--r--indra/newview/skins/default/xui/ja/floater_incoming_call.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_inspect.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_inventory.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_joystick.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_land_holdings.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_map.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_media_browser.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_mem_leaking.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_moveview.xml46
-rw-r--r--indra/newview/skins/default/xui/ja/floater_outfit_save_as.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/floater_outgoing_call.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/floater_pay.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_perm_prefs.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_postcard.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preferences.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preview_animation.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preview_gesture.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preview_gesture_shortcut.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preview_notecard.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preview_sound.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_preview_texture.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_publish_classified.xml15
-rw-r--r--indra/newview/skins/default/xui/ja/floater_report_abuse.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/floater_sell_land.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_snapshot.xml96
-rw-r--r--indra/newview/skins/default/xui/ja/floater_sound_preview.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_sys_well.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/floater_telehub.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_tools.xml115
-rw-r--r--indra/newview/skins/default/xui/ja/floater_tos.xml23
-rw-r--r--indra/newview/skins/default/xui/ja/floater_url_entry.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_voice_controls.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/floater_voice_effect.xml29
-rw-r--r--indra/newview/skins/default/xui/ja/floater_water.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/floater_wearable_save_as.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/floater_window_size.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/floater_world_map.xml41
-rw-r--r--indra/newview/skins/default/xui/ja/inspect_avatar.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/inspect_object.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/language_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/menu_attachment_other.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_attachment_self.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/menu_avatar_other.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_avatar_self.xml15
-rw-r--r--indra/newview/skins/default/xui/ja/menu_bottomtray.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_cof_attachment.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_cof_body_part.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_cof_clothing.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/menu_cof_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_edit.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/menu_hide_navbar.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inv_offer_chiclet.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_inventory.xml35
-rw-r--r--indra/newview/skins/default/xui/ja/menu_login.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/menu_mini_map.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_object.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/menu_outfit_gear.xml26
-rw-r--r--indra/newview/skins/default/xui/ja/menu_outfit_tab.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/menu_participant_list.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_friends_view_sort.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_groups.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_nearby.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml1
-rw-r--r--indra/newview/skins/default/xui/ja/menu_profile_overflow.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/menu_save_outfit.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/menu_script_chiclet.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_slurl.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/menu_url_http.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/menu_viewer.xml224
-rw-r--r--indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml13
-rw-r--r--indra/newview/skins/default/xui/ja/mime_types.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/notifications.xml1256
-rw-r--r--indra/newview/skins/default/xui/ja/outfit_accordion_tab.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_body_parts_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_bodyparts_list_button_bar.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/panel_bottomtray.xml32
-rw-r--r--indra/newview/skins/default/xui/ja/panel_bottomtray_lite.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_classified_info.xml53
-rw-r--r--indra/newview/skins/default/xui/ja/panel_clothing_list_button_bar.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/panel_clothing_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_cof_wearables.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_deletable_wearable_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_dummy_clothing_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_alpha.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_classified.xml27
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_eyes.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_gloves.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_hair.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_jacket.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_pants.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_pick.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_profile.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_shape.xml41
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_shirt.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_shoes.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_skin.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_skirt.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_socks.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_tattoo.xml7
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_underpants.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_edit_wearable.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_friends.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_control_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_general.xml37
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml43
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_invite.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_land_money.xml110
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_notices.xml15
-rw-r--r--indra/newview/skins/default/xui/ja/panel_group_roles.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_groups.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_im_control_panel.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/panel_inventory_item.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_landmark_info.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/panel_landmarks.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_login.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/panel_main_inventory.xml76
-rw-r--r--indra/newview/skins/default/xui/ja/panel_me.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_media_settings_general.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_media_settings_permissions.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/panel_media_settings_security.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_my_profile.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/panel_navigation_bar.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_nearby_media.xml65
-rw-r--r--indra/newview/skins/default/xui/ja/panel_notes.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/panel_online_status.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_online_status_toast.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_outfit_edit.xml41
-rw-r--r--indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml13
-rw-r--r--indra/newview/skins/default/xui/ja/panel_people.xml44
-rw-r--r--indra/newview/skins/default/xui/ja/panel_picks.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_place_profile.xml37
-rw-r--r--indra/newview/skins/default/xui/ja/panel_places.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml45
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_alerts.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_chat.xml36
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_general.xml22
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml24
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_setup.xml21
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_sound.xml15
-rw-r--r--indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/panel_profile.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_covenant.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_debug.xml14
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_estate.xml12
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_general.xml38
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_general_layout.xml28
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_terrain.xml10
-rw-r--r--indra/newview/skins/default/xui/ja/panel_region_texture.xml23
-rw-r--r--indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml5
-rw-r--r--indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml16
-rw-r--r--indra/newview/skins/default/xui/ja/panel_side_tray.xml18
-rw-r--r--indra/newview/skins/default/xui/ja/panel_sidetray_home_tab.xml4
-rw-r--r--indra/newview/skins/default/xui/ja/panel_status_bar.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/panel_teleport_history.xml2
-rw-r--r--indra/newview/skins/default/xui/ja/panel_voice_effect.xml15
-rw-r--r--indra/newview/skins/default/xui/ja/panel_world_map.xml6
-rw-r--r--indra/newview/skins/default/xui/ja/role_actions.xml36
-rw-r--r--indra/newview/skins/default/xui/ja/sidepanel_appearance.xml13
-rw-r--r--indra/newview/skins/default/xui/ja/sidepanel_inventory.xml8
-rw-r--r--indra/newview/skins/default/xui/ja/sidepanel_task_info.xml9
-rw-r--r--indra/newview/skins/default/xui/ja/strings.xml657
-rw-r--r--indra/newview/skins/default/xui/ja/teleport_strings.xml27
-rw-r--r--indra/newview/skins/default/xui/nl/floater_about.xml67
-rw-r--r--indra/newview/skins/default/xui/nl/floater_about_land.xml26
-rw-r--r--indra/newview/skins/default/xui/nl/floater_customize.xml6
-rw-r--r--indra/newview/skins/default/xui/nl/floater_joystick.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/floater_mute_object.xml13
-rw-r--r--indra/newview/skins/default/xui/nl/floater_report_abuse.xml106
-rw-r--r--indra/newview/skins/default/xui/nl/floater_stats.xml71
-rw-r--r--indra/newview/skins/default/xui/nl/floater_tools.xml7
-rw-r--r--indra/newview/skins/default/xui/nl/language_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/nl/menu_inventory.xml24
-rw-r--r--indra/newview/skins/default/xui/nl/menu_inventory_add.xml32
-rw-r--r--indra/newview/skins/default/xui/nl/menu_mini_map.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/menu_picks.xml8
-rw-r--r--indra/newview/skins/default/xui/nl/panel_group_roles.xml136
-rw-r--r--indra/newview/skins/default/xui/nl/panel_login.xml62
-rw-r--r--indra/newview/skins/default/xui/nl/panel_main_inventory.xml64
-rw-r--r--indra/newview/skins/default/xui/nl/panel_region_estate.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/panel_world_map.xml6
-rw-r--r--indra/newview/skins/default/xui/nl/strings.xml2867
-rw-r--r--indra/newview/skins/default/xui/nl/teleport_strings.xml8
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_about.xml26
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_about_land.xml476
-rw-r--r--indra/newview/skins/default/xui/pl/floater_activeim.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_animation_preview.xml309
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_auction.xml18
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_avatar_picker.xml48
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_avatar_textures.xml65
-rw-r--r--indra/newview/skins/default/xui/pl/floater_beacons.xml24
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_build_options.xml15
-rw-r--r--indra/newview/skins/default/xui/pl/floater_bulk_perms.xml62
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_bumps.xml29
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_buy_contents.xml10
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_buy_currency.xml81
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_buy_land.xml265
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_buy_object.xml10
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_camera.xml33
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_choose_group.xml8
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_color_picker.xml16
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_critical.xml0
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_customize.xml223
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml10
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_device_settings.xml5
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_env_settings.xml22
-rw-r--r--indra/newview/skins/default/xui/pl/floater_event.xml72
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_gesture.xml37
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_god_tools.xml81
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_hardware_settings.xml28
-rw-r--r--indra/newview/skins/default/xui/pl/floater_help_browser.xml9
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_hud.xml4
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_im.xml8
-rw-r--r--indra/newview/skins/default/xui/pl/floater_im_container.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/floater_im_session.xml9
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_image_preview.xml28
-rw-r--r--indra/newview/skins/default/xui/pl/floater_incoming_call.xml27
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_inspect.xml19
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_inventory.xml57
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml90
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_inventory_view_finder.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_joystick.xml188
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_lagmeter.xml239
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_land_holdings.xml12
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_live_lsleditor.xml21
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_lsl_guide.xml10
-rw-r--r--indra/newview/skins/default/xui/pl/floater_map.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_media_browser.xml18
-rw-r--r--indra/newview/skins/default/xui/pl/floater_media_settings.xml6
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_mem_leaking.xml16
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_moveview.xml54
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_mute_object.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_my_friends.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/floater_nearby_chat.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_openobject.xml8
-rw-r--r--indra/newview/skins/default/xui/pl/floater_outfit_save_as.xml12
-rw-r--r--indra/newview/skins/default/xui/pl/floater_outgoing_call.xml40
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_pay.xml30
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_pay_object.xml45
-rw-r--r--indra/newview/skins/default/xui/pl/floater_perm_prefs.xml4
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_post_process.xml16
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_postcard.xml6
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_preferences.xml19
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_preview_animation.xml11
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_preview_classified.xml8
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_preview_event.xml8
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_preview_gesture.xml54
-rw-r--r--indra/newview/skins/default/xui/pl/floater_preview_gesture_info.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/floater_preview_gesture_shortcut.xml15
-rw-r--r--indra/newview/skins/default/xui/pl/floater_preview_gesture_steps.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_preview_notecard.xml22
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_preview_sound.xml13
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_preview_texture.xml42
-rw-r--r--indra/newview/skins/default/xui/pl/floater_publish_classified.xml15
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_region_info.xml4
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_report_abuse.xml60
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_script_debug.xml0
-rw-r--r--indra/newview/skins/default/xui/pl/floater_script_debug_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/floater_script_limits.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_script_preview.xml5
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_script_queue.xml19
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_script_search.xml11
-rw-r--r--indra/newview/skins/default/xui/pl/floater_search.xml16
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_select_key.xml6
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_sell_land.xml125
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_settings_debug.xml12
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_snapshot.xml70
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_sound_preview.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/floater_stats.xml54
-rw-r--r--indra/newview/skins/default/xui/pl/floater_sys_well.xml9
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_telehub.xml25
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml14
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_tools.xml590
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_top_objects.xml79
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_tos.xml11
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_url_entry.xml0
-rw-r--r--indra/newview/skins/default/xui/pl/floater_voice_controls.xml26
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_water.xml90
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_wearable_save_as.xml8
-rw-r--r--indra/newview/skins/default/xui/pl/floater_whitelist_entry.xml9
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_windlight_options.xml189
-rw-r--r--indra/newview/skins/default/xui/pl/floater_window_size.xml17
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/floater_world_map.xml123
-rw-r--r--indra/newview/skins/default/xui/pl/inspect_avatar.xml21
-rw-r--r--indra/newview/skins/default/xui/pl/inspect_group.xml22
-rw-r--r--indra/newview/skins/default/xui/pl/inspect_object.xml34
-rw-r--r--indra/newview/skins/default/xui/pl/inspect_remote_object.xml13
-rw-r--r--indra/newview/skins/default/xui/pl/language_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/menu_attachment_self.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/menu_avatar_self.xml8
-rw-r--r--indra/newview/skins/default/xui/pl/menu_bottomtray.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/menu_favorites.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/menu_hide_navbar.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/menu_imchiclet_adhoc.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/menu_imchiclet_group.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/menu_imchiclet_p2p.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/menu_inspect_object_gear.xml4
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/menu_inventory.xml69
-rw-r--r--indra/newview/skins/default/xui/pl/menu_inventory_add.xml46
-rw-r--r--indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml18
-rw-r--r--indra/newview/skins/default/xui/pl/menu_land.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/menu_landmark.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/menu_login.xml15
-rw-r--r--indra/newview/skins/default/xui/pl/menu_mini_map.xml10
-rw-r--r--indra/newview/skins/default/xui/pl/menu_navbar.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/menu_nearby_chat.xml12
-rw-r--r--indra/newview/skins/default/xui/pl/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/menu_object.xml17
-rw-r--r--indra/newview/skins/default/xui/pl/menu_participant_list.xml18
-rw-r--r--indra/newview/skins/default/xui/pl/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/pl/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/default/xui/pl/menu_people_groups_view_sort.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/menu_people_nearby.xml3
-rw-r--r--indra/newview/skins/default/xui/pl/menu_people_nearby_multiselect.xml1
-rw-r--r--indra/newview/skins/default/xui/pl/menu_people_nearby_view_sort.xml10
-rw-r--r--indra/newview/skins/default/xui/pl/menu_people_recent_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/pl/menu_picks_plus.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/menu_place.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/menu_place_add_button.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml10
-rw-r--r--indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml16
-rw-r--r--indra/newview/skins/default/xui/pl/menu_profile_overflow.xml7
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/menu_slurl.xml0
-rw-r--r--indra/newview/skins/default/xui/pl/menu_teleport_history_item.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/menu_url_agent.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/menu_url_group.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/menu_url_http.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/menu_url_inventory.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/menu_url_map.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/default/xui/pl/menu_url_parcel.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/menu_url_slurl.xml4
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/menu_viewer.xml83
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/mime_types.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/mime_types_linux.xml217
-rw-r--r--indra/newview/skins/default/xui/pl/mime_types_mac.xml217
-rw-r--r--indra/newview/skins/default/xui/pl/notifications.xml1370
-rw-r--r--indra/newview/skins/default/xui/pl/panel_active_object_row.xml9
-rw-r--r--indra/newview/skins/default/xui/pl/panel_adhoc_control_panel.xml14
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_audio_device.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/panel_avatar_list_item.xml26
-rw-r--r--indra/newview/skins/default/xui/pl/panel_block_list_sidetray.xml6
-rw-r--r--indra/newview/skins/default/xui/pl/panel_bottomtray.xml38
-rw-r--r--indra/newview/skins/default/xui/pl/panel_bottomtray_lite.xml8
-rw-r--r--indra/newview/skins/default/xui/pl/panel_classified_info.xml53
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_alpha.xml10
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_classified.xml48
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_eyes.xml9
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_gloves.xml10
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_hair.xml12
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_jacket.xml11
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_pants.xml10
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_pick.xml31
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_profile.xml94
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_shape.xml23
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_shirt.xml10
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_shoes.xml10
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_skin.xml14
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_skirt.xml10
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_socks.xml10
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_tattoo.xml8
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_underpants.xml10
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_undershirt.xml10
-rw-r--r--indra/newview/skins/default/xui/pl/panel_edit_wearable.xml101
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_friends.xml37
-rw-r--r--indra/newview/skins/default/xui/pl/panel_group_control_panel.xml17
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_group_general.xml95
-rw-r--r--indra/newview/skins/default/xui/pl/panel_group_info_sidetray.xml35
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_group_invite.xml32
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_group_land_money.xml129
-rw-r--r--indra/newview/skins/default/xui/pl/panel_group_list_item.xml5
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_group_notices.xml53
-rw-r--r--indra/newview/skins/default/xui/pl/panel_group_notify.xml8
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_group_roles.xml14
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_groups.xml0
-rw-r--r--indra/newview/skins/default/xui/pl/panel_im_control_panel.xml29
-rw-r--r--indra/newview/skins/default/xui/pl/panel_landmark_info.xml38
-rw-r--r--indra/newview/skins/default/xui/pl/panel_landmarks.xml14
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_login.xml54
-rw-r--r--indra/newview/skins/default/xui/pl/panel_main_inventory.xml82
-rw-r--r--indra/newview/skins/default/xui/pl/panel_me.xml7
-rw-r--r--indra/newview/skins/default/xui/pl/panel_media_settings_general.xml32
-rw-r--r--indra/newview/skins/default/xui/pl/panel_media_settings_permissions.xml20
-rw-r--r--indra/newview/skins/default/xui/pl/panel_media_settings_security.xml12
-rw-r--r--indra/newview/skins/default/xui/pl/panel_my_profile.xml35
-rw-r--r--indra/newview/skins/default/xui/pl/panel_navigation_bar.xml18
-rw-r--r--indra/newview/skins/default/xui/pl/panel_nearby_chat.xml9
-rw-r--r--indra/newview/skins/default/xui/pl/panel_nearby_chat_bar.xml11
-rw-r--r--indra/newview/skins/default/xui/pl/panel_nearby_media.xml67
-rw-r--r--indra/newview/skins/default/xui/pl/panel_notes.xml23
-rw-r--r--indra/newview/skins/default/xui/pl/panel_online_status.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/panel_online_status_toast.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/panel_outfits_inventory.xml14
-rw-r--r--indra/newview/skins/default/xui/pl/panel_outfits_inventory_gear_default.xml9
-rw-r--r--indra/newview/skins/default/xui/pl/panel_people.xml59
-rw-r--r--indra/newview/skins/default/xui/pl/panel_pick_info.xml16
-rw-r--r--indra/newview/skins/default/xui/pl/panel_picks.xml20
-rw-r--r--indra/newview/skins/default/xui/pl/panel_place_profile.xml111
-rw-r--r--indra/newview/skins/default/xui/pl/panel_places.xml15
-rw-r--r--indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml44
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_preferences_alerts.xml6
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_preferences_chat.xml22
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_preferences_general.xml120
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml213
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml48
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_preferences_setup.xml63
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_preferences_sound.xml19
-rw-r--r--indra/newview/skins/default/xui/pl/panel_prim_media_controls.xml79
-rw-r--r--indra/newview/skins/default/xui/pl/panel_profile.xml41
-rw-r--r--indra/newview/skins/default/xui/pl/panel_profile_view.xml16
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_region_covenant.xml22
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_region_debug.xml20
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_region_estate.xml21
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_region_general.xml46
-rw-r--r--indra/newview/skins/default/xui/pl/panel_region_general_layout.xml43
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_region_terrain.xml12
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_region_texture.xml32
-rw-r--r--indra/newview/skins/default/xui/pl/panel_script_ed.xml43
-rw-r--r--indra/newview/skins/default/xui/pl/panel_script_limits_my_avatar.xml16
-rw-r--r--indra/newview/skins/default/xui/pl/panel_script_limits_region_memory.xml20
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_scrolling_param.xml0
-rw-r--r--indra/newview/skins/default/xui/pl/panel_side_tray.xml29
-rw-r--r--indra/newview/skins/default/xui/pl/panel_side_tray_tab_caption.xml5
-rw-r--r--indra/newview/skins/default/xui/pl/panel_stand_stop_flying.xml6
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/panel_status_bar.xml60
-rw-r--r--indra/newview/skins/default/xui/pl/panel_teleport_history.xml18
-rw-r--r--indra/newview/skins/default/xui/pl/panel_teleport_history_item.xml4
-rw-r--r--indra/newview/skins/default/xui/pl/panel_world_map.xml2
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/role_actions.xml239
-rw-r--r--indra/newview/skins/default/xui/pl/sidepanel_appearance.xml10
-rw-r--r--indra/newview/skins/default/xui/pl/sidepanel_inventory.xml11
-rw-r--r--indra/newview/skins/default/xui/pl/sidepanel_item_info.xml73
-rw-r--r--indra/newview/skins/default/xui/pl/sidepanel_task_info.xml129
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/strings.xml1126
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/teleport_strings.xml3
-rw-r--r--[-rwxr-xr-x]indra/newview/skins/default/xui/pl/xui_version.xml0
-rw-r--r--indra/newview/skins/default/xui/pt/floater_about.xml74
-rw-r--r--indra/newview/skins/default/xui/pt/floater_about_land.xml504
-rw-r--r--indra/newview/skins/default/xui/pt/floater_activeim.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_animation_preview.xml219
-rw-r--r--indra/newview/skins/default/xui/pt/floater_auction.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/floater_avatar_picker.xml55
-rw-r--r--indra/newview/skins/default/xui/pt/floater_avatar_textures.xml76
-rw-r--r--indra/newview/skins/default/xui/pt/floater_beacons.xml24
-rw-r--r--indra/newview/skins/default/xui/pt/floater_build_options.xml11
-rw-r--r--indra/newview/skins/default/xui/pt/floater_bulk_perms.xml68
-rw-r--r--indra/newview/skins/default/xui/pt/floater_bumps.xml27
-rw-r--r--indra/newview/skins/default/xui/pt/floater_buy_contents.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/floater_buy_currency.xml79
-rw-r--r--indra/newview/skins/default/xui/pt/floater_buy_currency_html.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_buy_land.xml285
-rw-r--r--indra/newview/skins/default/xui/pt/floater_buy_object.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_camera.xml24
-rw-r--r--indra/newview/skins/default/xui/pt/floater_choose_group.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/floater_color_picker.xml13
-rw-r--r--indra/newview/skins/default/xui/pt/floater_customize.xml209
-rw-r--r--indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/floater_device_settings.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_env_settings.xml10
-rw-r--r--indra/newview/skins/default/xui/pt/floater_event.xml72
-rw-r--r--indra/newview/skins/default/xui/pt/floater_gesture.xml27
-rw-r--r--indra/newview/skins/default/xui/pt/floater_god_tools.xml33
-rw-r--r--indra/newview/skins/default/xui/pt/floater_hardware_settings.xml20
-rw-r--r--indra/newview/skins/default/xui/pt/floater_help_browser.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/floater_im.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/floater_im_container.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_im_session.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/floater_image_preview.xml22
-rw-r--r--indra/newview/skins/default/xui/pt/floater_incoming_call.xml33
-rw-r--r--indra/newview/skins/default/xui/pt/floater_inspect.xml17
-rw-r--r--indra/newview/skins/default/xui/pt/floater_inventory.xml59
-rw-r--r--indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml78
-rw-r--r--indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/floater_joystick.xml40
-rw-r--r--indra/newview/skins/default/xui/pt/floater_lagmeter.xml221
-rw-r--r--indra/newview/skins/default/xui/pt/floater_land_holdings.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/floater_live_lsleditor.xml19
-rw-r--r--indra/newview/skins/default/xui/pt/floater_lsl_guide.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/floater_map.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_media_browser.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_media_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/floater_mem_leaking.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_moveview.xml82
-rw-r--r--indra/newview/skins/default/xui/pt/floater_mute_object.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/floater_nearby_chat.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_outfit_save_as.xml11
-rw-r--r--indra/newview/skins/default/xui/pt/floater_outgoing_call.xml40
-rw-r--r--indra/newview/skins/default/xui/pt/floater_pay.xml34
-rw-r--r--indra/newview/skins/default/xui/pt/floater_pay_object.xml45
-rw-r--r--indra/newview/skins/default/xui/pt/floater_postcard.xml18
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preferences.xml16
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_animation.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_classified.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_event.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_gesture.xml67
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_gesture_info.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_gesture_shortcut.xml15
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_gesture_steps.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_notecard.xml20
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_sound.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/floater_preview_texture.xml42
-rw-r--r--indra/newview/skins/default/xui/pt/floater_publish_classified.xml15
-rw-r--r--indra/newview/skins/default/xui/pt/floater_report_abuse.xml102
-rw-r--r--indra/newview/skins/default/xui/pt/floater_script_debug_panel.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_script_limits.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_script_preview.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/floater_script_queue.xml15
-rw-r--r--indra/newview/skins/default/xui/pt/floater_script_search.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/floater_search.xml16
-rw-r--r--indra/newview/skins/default/xui/pt/floater_select_key.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_sell_land.xml124
-rw-r--r--indra/newview/skins/default/xui/pt/floater_settings_debug.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/floater_snapshot.xml96
-rw-r--r--indra/newview/skins/default/xui/pt/floater_sound_preview.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_statistics.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_stats.xml71
-rw-r--r--indra/newview/skins/default/xui/pt/floater_sys_well.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/floater_telehub.xml19
-rw-r--r--indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/floater_tools.xml584
-rw-r--r--indra/newview/skins/default/xui/pt/floater_top_objects.xml77
-rw-r--r--indra/newview/skins/default/xui/pt/floater_tos.xml17
-rw-r--r--indra/newview/skins/default/xui/pt/floater_voice_controls.xml28
-rw-r--r--indra/newview/skins/default/xui/pt/floater_voice_effect.xml29
-rw-r--r--indra/newview/skins/default/xui/pt/floater_water.xml28
-rw-r--r--indra/newview/skins/default/xui/pt/floater_wearable_save_as.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_whitelist_entry.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/floater_windlight_options.xml24
-rw-r--r--indra/newview/skins/default/xui/pt/floater_window_size.xml17
-rw-r--r--indra/newview/skins/default/xui/pt/floater_world_map.xml127
-rw-r--r--indra/newview/skins/default/xui/pt/inspect_avatar.xml21
-rw-r--r--indra/newview/skins/default/xui/pt/inspect_group.xml22
-rw-r--r--indra/newview/skins/default/xui/pt/inspect_object.xml41
-rw-r--r--indra/newview/skins/default/xui/pt/inspect_remote_object.xml13
-rw-r--r--indra/newview/skins/default/xui/pt/language_settings.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/menu_attachment_other.xml17
-rw-r--r--indra/newview/skins/default/xui/pt/menu_attachment_self.xml13
-rw-r--r--indra/newview/skins/default/xui/pt/menu_avatar_icon.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/menu_avatar_other.xml16
-rw-r--r--indra/newview/skins/default/xui/pt/menu_avatar_self.xml30
-rw-r--r--indra/newview/skins/default/xui/pt/menu_bottomtray.xml17
-rw-r--r--indra/newview/skins/default/xui/pt/menu_cof_attachment.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/menu_cof_body_part.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_cof_clothing.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/menu_cof_gear.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_edit.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/menu_favorites.xml10
-rw-r--r--indra/newview/skins/default/xui/pt/menu_gesture_gear.xml10
-rw-r--r--indra/newview/skins/default/xui/pt/menu_group_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_hide_navbar.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/menu_im_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/menu_imchiclet_adhoc.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/menu_imchiclet_group.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/menu_imchiclet_p2p.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/menu_inspect_avatar_gear.xml19
-rw-r--r--indra/newview/skins/default/xui/pt/menu_inspect_object_gear.xml17
-rw-r--r--indra/newview/skins/default/xui/pt/menu_inspect_self_gear.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/menu_inv_offer_chiclet.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/menu_inventory.xml83
-rw-r--r--indra/newview/skins/default/xui/pt/menu_inventory_add.xml32
-rw-r--r--indra/newview/skins/default/xui/pt/menu_inventory_gear_default.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/menu_land.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/menu_landmark.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/menu_login.xml22
-rw-r--r--indra/newview/skins/default/xui/pt/menu_mini_map.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_navbar.xml11
-rw-r--r--indra/newview/skins/default/xui/pt/menu_nearby_chat.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/menu_notification_well_button.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/menu_object.xml27
-rw-r--r--indra/newview/skins/default/xui/pt/menu_object_icon.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_outfit_gear.xml26
-rw-r--r--indra/newview/skins/default/xui/pt/menu_outfit_tab.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/menu_participant_list.xml21
-rw-r--r--indra/newview/skins/default/xui/pt/menu_people_friends_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/menu_people_groups.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/menu_people_groups_view_sort.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_people_nearby.xml13
-rw-r--r--indra/newview/skins/default/xui/pt/menu_people_nearby_multiselect.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/menu_people_nearby_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/menu_people_recent_view_sort.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/menu_picks.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/menu_picks_plus.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_place.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/menu_place_add_button.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_places_gear_folder.xml15
-rw-r--r--indra/newview/skins/default/xui/pt/menu_places_gear_landmark.xml18
-rw-r--r--indra/newview/skins/default/xui/pt/menu_profile_overflow.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/menu_save_outfit.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_script_chiclet.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/menu_slurl.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/menu_teleport_history_gear.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/menu_teleport_history_item.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/menu_teleport_history_tab.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_text_editor.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/menu_url_agent.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/menu_url_group.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/menu_url_http.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/menu_url_inventory.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/menu_url_map.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/menu_url_objectim.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/menu_url_parcel.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/menu_url_slapp.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/menu_url_slurl.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/menu_url_teleport.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/menu_viewer.xml501
-rw-r--r--indra/newview/skins/default/xui/pt/menu_wearable_list_item.xml13
-rw-r--r--indra/newview/skins/default/xui/pt/mime_types_linux.xml217
-rw-r--r--indra/newview/skins/default/xui/pt/mime_types_mac.xml217
-rw-r--r--indra/newview/skins/default/xui/pt/notifications.xml1819
-rw-r--r--indra/newview/skins/default/xui/pt/outfit_accordion_tab.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/panel_active_object_row.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/panel_adhoc_control_panel.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/panel_avatar_list_item.xml26
-rw-r--r--indra/newview/skins/default/xui/pt/panel_block_list_sidetray.xml10
-rw-r--r--indra/newview/skins/default/xui/pt/panel_body_parts_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/panel_bodyparts_list_button_bar.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/panel_bottomtray.xml49
-rw-r--r--indra/newview/skins/default/xui/pt/panel_bottomtray_lite.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/panel_classified_info.xml53
-rw-r--r--indra/newview/skins/default/xui/pt/panel_clothing_list_button_bar.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/panel_clothing_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/panel_cof_wearables.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/panel_deletable_wearable_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/panel_dummy_clothing_list_item.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_alpha.xml10
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_classified.xml48
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_eyes.xml11
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_gloves.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_hair.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_jacket.xml13
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_pants.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_pick.xml31
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_profile.xml94
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_shape.xml26
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_shirt.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_shoes.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_skin.xml16
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_skirt.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_socks.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_tattoo.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_underpants.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_undershirt.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/panel_edit_wearable.xml107
-rw-r--r--indra/newview/skins/default/xui/pt/panel_friends.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/panel_group_control_panel.xml17
-rw-r--r--indra/newview/skins/default/xui/pt/panel_group_general.xml102
-rw-r--r--indra/newview/skins/default/xui/pt/panel_group_info_sidetray.xml35
-rw-r--r--indra/newview/skins/default/xui/pt/panel_group_invite.xml26
-rw-r--r--indra/newview/skins/default/xui/pt/panel_group_land_money.xml138
-rw-r--r--indra/newview/skins/default/xui/pt/panel_group_list_item.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/panel_group_notices.xml59
-rw-r--r--indra/newview/skins/default/xui/pt/panel_group_notify.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/panel_group_roles.xml148
-rw-r--r--indra/newview/skins/default/xui/pt/panel_groups.xml8
-rw-r--r--indra/newview/skins/default/xui/pt/panel_im_control_panel.xml29
-rw-r--r--indra/newview/skins/default/xui/pt/panel_inventory_item.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/panel_landmark_info.xml38
-rw-r--r--indra/newview/skins/default/xui/pt/panel_landmarks.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/panel_login.xml63
-rw-r--r--indra/newview/skins/default/xui/pt/panel_main_inventory.xml28
-rw-r--r--indra/newview/skins/default/xui/pt/panel_me.xml7
-rw-r--r--indra/newview/skins/default/xui/pt/panel_media_settings_general.xml32
-rw-r--r--indra/newview/skins/default/xui/pt/panel_media_settings_permissions.xml29
-rw-r--r--indra/newview/skins/default/xui/pt/panel_media_settings_security.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/panel_my_profile.xml35
-rw-r--r--indra/newview/skins/default/xui/pt/panel_navigation_bar.xml18
-rw-r--r--indra/newview/skins/default/xui/pt/panel_nearby_chat.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/panel_nearby_chat_bar.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/panel_nearby_media.xml65
-rw-r--r--indra/newview/skins/default/xui/pt/panel_notes.xml23
-rw-r--r--indra/newview/skins/default/xui/pt/panel_online_status.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_online_status_toast.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/panel_outfit_edit.xml41
-rw-r--r--indra/newview/skins/default/xui/pt/panel_outfits_inventory.xml13
-rw-r--r--indra/newview/skins/default/xui/pt/panel_outfits_inventory_gear_default.xml9
-rw-r--r--indra/newview/skins/default/xui/pt/panel_people.xml64
-rw-r--r--indra/newview/skins/default/xui/pt/panel_pick_info.xml16
-rw-r--r--indra/newview/skins/default/xui/pt/panel_picks.xml20
-rw-r--r--indra/newview/skins/default/xui/pt/panel_place_profile.xml111
-rw-r--r--indra/newview/skins/default/xui/pt/panel_places.xml16
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml43
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_alerts.xml18
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_chat.xml44
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_general.xml125
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml210
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml45
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_setup.xml64
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_sound.xml72
-rw-r--r--indra/newview/skins/default/xui/pt/panel_prim_media_controls.xml79
-rw-r--r--indra/newview/skins/default/xui/pt/panel_profile.xml40
-rw-r--r--indra/newview/skins/default/xui/pt/panel_profile_view.xml16
-rw-r--r--indra/newview/skins/default/xui/pt/panel_region_covenant.xml11
-rw-r--r--indra/newview/skins/default/xui/pt/panel_region_debug.xml30
-rw-r--r--indra/newview/skins/default/xui/pt/panel_region_estate.xml13
-rw-r--r--indra/newview/skins/default/xui/pt/panel_region_general.xml24
-rw-r--r--indra/newview/skins/default/xui/pt/panel_region_general_layout.xml43
-rw-r--r--indra/newview/skins/default/xui/pt/panel_region_texture.xml30
-rw-r--r--indra/newview/skins/default/xui/pt/panel_script_ed.xml43
-rw-r--r--indra/newview/skins/default/xui/pt/panel_script_limits_my_avatar.xml16
-rw-r--r--indra/newview/skins/default/xui/pt/panel_script_limits_region_memory.xml20
-rw-r--r--indra/newview/skins/default/xui/pt/panel_side_tray.xml29
-rw-r--r--indra/newview/skins/default/xui/pt/panel_side_tray_tab_caption.xml5
-rw-r--r--indra/newview/skins/default/xui/pt/panel_stand_stop_flying.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/panel_status_bar.xml57
-rw-r--r--indra/newview/skins/default/xui/pt/panel_teleport_history.xml18
-rw-r--r--indra/newview/skins/default/xui/pt/panel_teleport_history_item.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/panel_voice_effect.xml15
-rw-r--r--indra/newview/skins/default/xui/pt/panel_world_map.xml12
-rw-r--r--indra/newview/skins/default/xui/pt/role_actions.xml227
-rw-r--r--indra/newview/skins/default/xui/pt/sidepanel_appearance.xml14
-rw-r--r--indra/newview/skins/default/xui/pt/sidepanel_inventory.xml13
-rw-r--r--indra/newview/skins/default/xui/pt/sidepanel_item_info.xml73
-rw-r--r--indra/newview/skins/default/xui/pt/sidepanel_task_info.xml129
-rw-r--r--indra/newview/skins/default/xui/pt/strings.xml3383
-rw-r--r--indra/newview/skins/default/xui/pt/teleport_strings.xml13
-rw-r--r--indra/newview/tests/lllogininstance_test.cpp124
-rw-r--r--indra/newview/tests/llsecapi_test.cpp188
-rw-r--r--indra/newview/tests/llsechandler_basic_test.cpp1071
-rw-r--r--indra/newview/tests/llslurl_test.cpp258
-rw-r--r--indra/newview/tests/llviewerhelputil_test.cpp2
-rw-r--r--indra/newview/tests/llviewernetwork_test.cpp582
-rw-r--r--indra/newview/tests/llxmlrpclistener_test.cpp2
-rwxr-xr-xindra/newview/viewer_manifest.py199
-rw-r--r--indra/test/CMakeLists.txt16
-rw-r--r--indra/test/llpermissions_tut.cpp108
-rw-r--r--indra/test_apps/llplugintest/bookmarks.txt24
-rw-r--r--indra/test_apps/llplugintest/llmediaplugintest.cpp298
-rw-r--r--indra/test_apps/llplugintest/llmediaplugintest.h11
-rw-r--r--indra/viewer_components/login/lllogin.cpp43
-rw-r--r--indra/win_crash_logger/llcrashloggerwindows.cpp1
-rw-r--r--indra/win_updater/CMakeLists.txt13
-rw-r--r--install.xml120
-rw-r--r--scripts/messages/message_template.msg4
3065 files changed, 136227 insertions, 68280 deletions
diff --git a/.hgignore b/.hgignore
index 53ddf71bb7..1221b80357 100644
--- a/.hgignore
+++ b/.hgignore
@@ -60,3 +60,4 @@ glob:indra/newview/teleport_history.txt
glob:indra/newview/search_history.txt
glob:indra/newview/filters.xml
glob:indra/newview/avatar_icons_cache.txt
+glob:indra/newview/avatar_lad.log
diff --git a/doc/contributions.txt b/doc/contributions.txt
index 2e4d803252..8c6bd5e0fe 100644
--- a/doc/contributions.txt
+++ b/doc/contributions.txt
@@ -17,11 +17,15 @@ Agathos Frascati
CT-317
CT-352
Aimee Trescothick
- VWR-1813
+ SNOW-227
+ SNOW-570
+ SNOW-572
VWR-3321
VWR-3336
VWR-3903
VWR-4083
+ VWR-4106
+ VWR-5308
VWR-6348
VWR-6358
VWR-6360
@@ -42,9 +46,15 @@ Aimee Trescothick
VWR-11100
VWR-11111
VWR-11844
+ VWR-12631
+ VWR-12696
+ VWR-12748
+ VWR-14087
VWR-14267
VWR-14278
- VWR-14087
+ VWR-14711
+ VWR-14712
+ VWR-15454
Alejandro Rosenthal
VWR-1184
Aleric Inglewood
@@ -175,6 +185,8 @@ Dale Glass
VWR-2502
VWR-1358
VWR-2041
+Drew Dri
+ VWR-19683
Drewan Keats
VWR-28
VWR-248
@@ -243,6 +255,7 @@ Gigs Taggart
VWR-2491
VWR-2502
VWR-2331
+ VWR-5308
VWR-8781
VWR-8783
Ginko Bayliss
@@ -314,6 +327,8 @@ Khyota Wulluf
VWR-8885
VWR-9256
VWR-9966
+Kitty Barnett
+ VWR-19699
Kunnis Basiat
VWR-82
VWR-102
@@ -599,6 +614,7 @@ tenebrous pau
Tharax Ferraris
VWR-605
Thickbrick Sleaford
+ SNOW-207
VWR-7109
VWR-9287
VWR-13483
diff --git a/indra/cmake/APR.cmake b/indra/cmake/APR.cmake
index f4706dd4f2..180504d286 100644
--- a/indra/cmake/APR.cmake
+++ b/indra/cmake/APR.cmake
@@ -54,7 +54,10 @@ else (STANDALONE)
endif (WINDOWS)
set(APR_INCLUDE_DIR ${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/include/apr-1)
- if (LINUX AND VIEWER)
- list(APPEND APRUTIL_LIBRARIES ${DB_LIBRARIES} uuid)
- endif (LINUX AND VIEWER)
+ if (LINUX)
+ if (VIEWER)
+ list(APPEND APRUTIL_LIBRARIES ${DB_LIBRARIES} uuid)
+ endif (VIEWER)
+ list(APPEND APRUTIL_LIBRARIES ${DB_LIBRARIES} rt)
+ endif (LINUX)
endif (STANDALONE)
diff --git a/indra/cmake/Boost.cmake b/indra/cmake/Boost.cmake
index efe9ad74d3..7ce57a5572 100644
--- a/indra/cmake/Boost.cmake
+++ b/indra/cmake/Boost.cmake
@@ -38,12 +38,12 @@ else (STANDALONE)
debug libboost_signals-vc80-mt-gd-${BOOST_VERSION})
endif (MSVC71)
elseif (DARWIN)
- set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-mt)
- set(BOOST_REGEX_LIBRARY boost_regex-mt)
- set(BOOST_SIGNALS_LIBRARY boost_signals-mt)
+ set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-xgcc40-mt)
+ set(BOOST_REGEX_LIBRARY boost_regex-xgcc40-mt)
+ set(BOOST_SIGNALS_LIBRARY boost_signals-xgcc40-mt)
elseif (LINUX)
- set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-mt)
- set(BOOST_REGEX_LIBRARY boost_regex-mt)
- set(BOOST_SIGNALS_LIBRARY boost_signals-mt)
+ set(BOOST_PROGRAM_OPTIONS_LIBRARY boost_program_options-gcc41-mt)
+ set(BOOST_REGEX_LIBRARY boost_regex-gcc41-mt)
+ set(BOOST_SIGNALS_LIBRARY boost_signals-gcc41-mt)
endif (WINDOWS)
endif (STANDALONE)
diff --git a/indra/cmake/CARes.cmake b/indra/cmake/CARes.cmake
index 8a2dc01561..1850b706ac 100644
--- a/indra/cmake/CARes.cmake
+++ b/indra/cmake/CARes.cmake
@@ -9,6 +9,7 @@ if (STANDALONE)
include(FindCARes)
else (STANDALONE)
use_prebuilt_binary(ares)
+ add_definitions("-DCARES_STATICLIB")
if (WINDOWS)
set(CARES_LIBRARIES areslib)
elseif (DARWIN)
diff --git a/indra/cmake/Copy3rdPartyLibs.cmake b/indra/cmake/Copy3rdPartyLibs.cmake
index faf9da8b14..89422fbdb2 100644
--- a/indra/cmake/Copy3rdPartyLibs.cmake
+++ b/indra/cmake/Copy3rdPartyLibs.cmake
@@ -19,7 +19,7 @@ if(WINDOWS)
set(vivox_src_dir "${CMAKE_SOURCE_DIR}/newview/vivox-runtime/i686-win32")
set(vivox_files
SLVoice.exe
- libsndfile-1.dll
+ libsndfile-1.dll
vivoxplatform.dll
vivoxsdk.dll
ortp.dll
@@ -167,6 +167,7 @@ elseif(DARWIN)
libexpat.dylib
libllqtwebkit.dylib
libndofdev.dylib
+ libexception_handler.dylib
)
# fmod is statically linked on darwin
@@ -216,6 +217,7 @@ elseif(LINUX)
libapr-1.so.0
libaprutil-1.so.0
libatk-1.0.so
+ libbreakpad_client.so.0
libcrypto.so.0.9.7
libdb-4.2.so
libexpat.so
diff --git a/indra/cmake/GStreamer010Plugin.cmake b/indra/cmake/GStreamer010Plugin.cmake
index 0d334837d4..0ca432da18 100644
--- a/indra/cmake/GStreamer010Plugin.cmake
+++ b/indra/cmake/GStreamer010Plugin.cmake
@@ -24,7 +24,6 @@ elseif (LINUX)
gmodule-2.0
dl
gthread-2.0
- rt
glib-2.0
)
endif (STANDALONE)
diff --git a/indra/cmake/GoogleBreakpad.cmake b/indra/cmake/GoogleBreakpad.cmake
new file mode 100644
index 0000000000..8270c0fabb
--- /dev/null
+++ b/indra/cmake/GoogleBreakpad.cmake
@@ -0,0 +1,19 @@
+# -*- cmake -*-
+include(Prebuilt)
+
+if (STANDALONE)
+ MESSAGE(FATAL_ERROR "*TODO standalone support for google breakad is unimplemented")
+ # *TODO - implement this include(FindGoogleBreakpad)
+else (STANDALONE)
+ use_prebuilt_binary(google_breakpad)
+ if (DARWIN)
+ set(BREAKPAD_EXCEPTION_HANDLER_LIBRARIES exception_handler)
+ endif (DARWIN)
+ if (LINUX)
+ set(BREAKPAD_EXCEPTION_HANDLER_LIBRARIES breakpad_client)
+ endif (LINUX)
+ if (WINDOWS)
+ set(BREAKPAD_EXCEPTION_HANDLER_LIBRARIES exception_handler crash_generation_client common)
+ endif (WINDOWS)
+endif (STANDALONE)
+
diff --git a/indra/cmake/LLAddBuildTest.cmake b/indra/cmake/LLAddBuildTest.cmake
index bf4d9b72a9..e8a0a949b6 100644
--- a/indra/cmake/LLAddBuildTest.cmake
+++ b/indra/cmake/LLAddBuildTest.cmake
@@ -137,21 +137,13 @@ INCLUDE(GoogleMock)
SET(TEST_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/PROJECT_${project}_TEST_${name}_ok.txt)
SET(TEST_CMD ${TEST_EXE} --touch=${TEST_OUTPUT} --sourcedir=${CMAKE_CURRENT_SOURCE_DIR})
- # daveh - what configuration does this use? Debug? it's cmake-time, not build time. + poppy 2009-04-19
+ # daveh - what configuration does this use? Debug? it's cmake-time, not build time. + poppy 2009-04-19
IF(LL_TEST_VERBOSE)
MESSAGE(STATUS "LL_ADD_PROJECT_UNIT_TESTS ${name} test_cmd = ${TEST_CMD}")
ENDIF(LL_TEST_VERBOSE)
-
- IF(WINDOWS)
- set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR})
- ELSEIF(DARWIN)
- set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources:/usr/lib)
- ELSE(WINDOWS)
- set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}:/usr/lib)
- ENDIF(WINDOWS)
- LL_TEST_COMMAND("${LD_LIBRARY_PATH}" ${TEST_CMD})
- SET(TEST_SCRIPT_CMD ${LL_TEST_COMMAND_value})
+ SET_TEST_PATH(LD_LIBRARY_PATH)
+ LL_TEST_COMMAND(TEST_SCRIPT_CMD "${LD_LIBRARY_PATH}" ${TEST_CMD})
IF(LL_TEST_VERBOSE)
MESSAGE(STATUS "LL_ADD_PROJECT_UNIT_TESTS ${name} test_script = ${TEST_SCRIPT_CMD}")
ENDIF(LL_TEST_VERBOSE)
@@ -233,16 +225,8 @@ FUNCTION(LL_ADD_INTEGRATION_TEST
LIST(INSERT test_command test_exe_pos "${TEST_EXE}")
ENDIF (test_exe_pos LESS 0)
- IF(WINDOWS)
- set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR})
- ELSEIF(DARWIN)
- set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources:/usr/lib)
- ELSE(WINDOWS)
- set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}:/usr/lib)
- ENDIF(WINDOWS)
-
- LL_TEST_COMMAND("${LD_LIBRARY_PATH}" ${test_command})
- SET(TEST_SCRIPT_CMD ${LL_TEST_COMMAND_value})
+ SET_TEST_PATH(LD_LIBRARY_PATH)
+ LL_TEST_COMMAND(TEST_SCRIPT_CMD "${LD_LIBRARY_PATH}" ${test_command})
if(TEST_DEBUG)
message(STATUS "TEST_SCRIPT_CMD: ${TEST_SCRIPT_CMD}")
@@ -258,3 +242,20 @@ FUNCTION(LL_ADD_INTEGRATION_TEST
# ADD_TEST(INTEGRATION_TEST_RUNNER_${testname} ${TEST_SCRIPT_CMD})
ENDFUNCTION(LL_ADD_INTEGRATION_TEST)
+
+MACRO(SET_TEST_PATH LISTVAR)
+ IF(WINDOWS)
+ # We typically build/package only Release variants of third-party
+ # libraries, so append the Release staging dir in case the library being
+ # sought doesn't have a debug variant.
+ set(${LISTVAR} ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR} ${SHARED_LIB_STAGING_DIR}/Release)
+ ELSEIF(DARWIN)
+ # We typically build/package only Release variants of third-party
+ # libraries, so append the Release staging dir in case the library being
+ # sought doesn't have a debug variant.
+ set(${LISTVAR} ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources ${SHARED_LIB_STAGING_DIR}/Release/Resources /usr/lib)
+ ELSE(WINDOWS)
+ # Linux uses a single staging directory anyway.
+ set(${LISTVAR} ${SHARED_LIB_STAGING_DIR} /usr/lib)
+ ENDIF(WINDOWS)
+ENDMACRO(SET_TEST_PATH)
diff --git a/indra/cmake/LLSharedLibs.cmake b/indra/cmake/LLSharedLibs.cmake
index 6f602680f4..e29076c738 100644
--- a/indra/cmake/LLSharedLibs.cmake
+++ b/indra/cmake/LLSharedLibs.cmake
@@ -5,20 +5,21 @@ macro(ll_deploy_sharedlibs_command target_exe)
get_filename_component(OUTPUT_PATH ${TARGET_LOCATION} PATH)
if(DARWIN)
- set(SEARCH_DIRS "${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources")
+ SET_TEST_PATH(SEARCH_DIRS)
get_target_property(IS_BUNDLE ${target_exe} MACOSX_BUNDLE)
if(IS_BUNDLE)
- # If its a bundle the exe is not in the target location, this should find it.
+ # If its a bundle the exe is not in the target location, this should find it.
get_filename_component(TARGET_FILE ${TARGET_LOCATION} NAME)
set(OUTPUT_PATH ${TARGET_LOCATION}.app/Contents/MacOS)
set(TARGET_LOCATION ${OUTPUT_PATH}/${TARGET_FILE})
- set(OUTPUT_PATH ${OUTPUT_PATH}/../Resources)
+ set(OUTPUT_PATH ${OUTPUT_PATH}/../Resources)
endif(IS_BUNDLE)
elseif(WINDOWS)
- set(SEARCH_DIRS "${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}" "$ENV{SystemRoot}/system32")
+ SET_TEST_PATH(SEARCH_DIRS)
+ LIST(APPEND SEARCH_DIRS "$ENV{SystemRoot}/system32")
elseif(LINUX)
- set(SEARCH_DIRS "${SHARED_LIB_STAGING_DIR}")
- set(OUTPUT_PATH ${OUTPUT_PATH}/lib)
+ SET_TEST_PATH(SEARCH_DIRS)
+ set(OUTPUT_PATH ${OUTPUT_PATH}/lib)
endif(DARWIN)
add_custom_command(
@@ -49,7 +50,7 @@ macro(ll_stage_sharedlib DSO_TARGET)
else(DARWIN)
set(SHARED_LIB_STAGING_DIR_CONFIG ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR})
endif(DARWIN)
-
+
# *TODO - maybe make this a symbolic link? -brad
add_custom_command(
TARGET ${DSO_TARGET} POST_BUILD
@@ -71,4 +72,4 @@ macro(ll_stage_sharedlib DSO_TARGET)
)
endif(DARWIN)
-endmacro(ll_stage_sharedlib) \ No newline at end of file
+endmacro(ll_stage_sharedlib)
diff --git a/indra/cmake/LLTestCommand.cmake b/indra/cmake/LLTestCommand.cmake
index fae5640493..554559edbd 100644
--- a/indra/cmake/LLTestCommand.cmake
+++ b/indra/cmake/LLTestCommand.cmake
@@ -1,13 +1,16 @@
-MACRO(LL_TEST_COMMAND LD_LIBRARY_PATH)
+MACRO(LL_TEST_COMMAND OUTVAR LD_LIBRARY_PATH)
# nat wonders how Kitware can use the term 'function' for a construct that
# cannot return a value. And yet, variables you set inside a FUNCTION are
# local. Try a MACRO instead.
- SET(LL_TEST_COMMAND_value
+ SET(value
${PYTHON_EXECUTABLE}
"${CMAKE_SOURCE_DIR}/cmake/run_build_test.py")
- IF(LD_LIBRARY_PATH)
- LIST(APPEND LL_TEST_COMMAND_value "-l${LD_LIBRARY_PATH}")
- ENDIF(LD_LIBRARY_PATH)
- LIST(APPEND LL_TEST_COMMAND_value ${ARGN})
-##MESSAGE(STATUS "Will run: ${LL_TEST_COMMAND_value}")
+ FOREACH(dir ${LD_LIBRARY_PATH})
+ LIST(APPEND value "-l${dir}")
+ ENDFOREACH(dir)
+ LIST(APPEND value ${ARGN})
+ SET(${OUTVAR} ${value})
+##IF(LL_TEST_VERBOSE)
+## MESSAGE(STATUS "LL_TEST_COMMAND: ${value}")
+##ENDIF(LL_TEST_VERBOSE)
ENDMACRO(LL_TEST_COMMAND)
diff --git a/indra/cmake/PulseAudio.cmake b/indra/cmake/PulseAudio.cmake
new file mode 100644
index 0000000000..f8087a8083
--- /dev/null
+++ b/indra/cmake/PulseAudio.cmake
@@ -0,0 +1,28 @@
+# -*- cmake -*-
+include(Prebuilt)
+
+if (STANDALONE)
+ include(FindPkgConfig)
+
+ pkg_check_modules(PULSEAUDIO REQUIRED libpulse-mainloop-glib)
+
+elseif (LINUX)
+ use_prebuilt_binary(pulseaudio)
+ set(PULSEAUDIO_FOUND ON FORCE BOOL)
+ set(PULSEAUDIO_INCLUDE_DIRS
+ ${LIBS_PREBUILT_DIR}/include
+ )
+ # We don't need to explicitly link against pulseaudio itself, because
+ # the viewer probes for the system's copy at runtime.
+ set(PULSEAUDIO_LIBRARIES
+ # none needed!
+ )
+endif (STANDALONE)
+
+if (PULSEAUDIO_FOUND)
+ set(PULSEAUDIO ON CACHE BOOL "Build with PulseAudio support, if available.")
+endif (PULSEAUDIO_FOUND)
+
+if (PULSEAUDIO)
+ add_definitions(-DLL_PULSEAUDIO_ENABLED=1)
+endif (PULSEAUDIO)
diff --git a/indra/cmake/Variables.cmake b/indra/cmake/Variables.cmake
index db0b44eb8f..bfaf3f4f26 100644
--- a/indra/cmake/Variables.cmake
+++ b/indra/cmake/Variables.cmake
@@ -75,11 +75,33 @@ endif (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
set(DARWIN 1)
- # set this dynamically from the build system now -
- # NOTE: wont have a distributable build unless you add this on the configure line with:
+
+ # NOTE: If specifying a different SDK with CMAKE_OSX_SYSROOT at configure
+ # time you should also specify CMAKE_OSX_DEPLOYMENT_TARGET explicitly,
+ # otherwise CMAKE_OSX_SYSROOT will be overridden here. We can't just check
+ # for it being unset, as it gets set to the system default :(
+
+ # Default to building against the 10.4 SDK if no deployment target is
+ # specified.
+ if (NOT CMAKE_OSX_DEPLOYMENT_TARGET)
+ # NOTE: setting -isysroot is NOT adequate: http://lists.apple.com/archives/Xcode-users/2007/Oct/msg00696.html
+ # see http://public.kitware.com/Bug/view.php?id=9959 + poppy
+ set(CMAKE_OSX_SYSROOT /Developer/SDKs/MacOSX10.4u.sdk)
+ set(CMAKE_OSX_DEPLOYMENT_TARGET 10.4)
+ endif (NOT CMAKE_OSX_DEPLOYMENT_TARGET)
+
+ # GCC 4.2 is incompatible with the MacOSX 10.4 SDK
+ if (${CMAKE_OSX_SYSROOT} MATCHES "10.4u")
+ set(CMAKE_XCODE_ATTRIBUTE_GCC_VERSION "4.0")
+ endif (${CMAKE_OSX_SYSROOT} MATCHES "10.4u")
+
+ # NOTE: To attempt an i386/PPC Universal build, add this on the configure line:
# -DCMAKE_OSX_ARCHITECTURES:STRING='i386;ppc'
- #set(CMAKE_OSX_ARCHITECTURES i386;ppc)
- set(CMAKE_OSX_SYSROOT /Developer/SDKs/MacOSX10.4u.sdk)
+ # Build only for i386 by default, system default on MacOSX 10.6 is x86_64
+ if (NOT CMAKE_OSX_ARCHITECTURES)
+ set(CMAKE_OSX_ARCHITECTURES i386)
+ endif (NOT CMAKE_OSX_ARCHITECTURES)
+
if (CMAKE_OSX_ARCHITECTURES MATCHES "i386" AND CMAKE_OSX_ARCHITECTURES MATCHES "ppc")
set(ARCH universal)
else (CMAKE_OSX_ARCHITECTURES MATCHES "i386" AND CMAKE_OSX_ARCHITECTURES MATCHES "ppc")
@@ -89,6 +111,7 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
set(ARCH i386)
endif (${CMAKE_SYSTEM_PROCESSOR} MATCHES "ppc")
endif (CMAKE_OSX_ARCHITECTURES MATCHES "i386" AND CMAKE_OSX_ARCHITECTURES MATCHES "ppc")
+
set(LL_ARCH ${ARCH}_darwin)
set(LL_ARCH_DIR universal-darwin)
set(WORD_SIZE 32)
diff --git a/indra/integration_tests/llui_libtest/llwidgetreg.cpp b/indra/integration_tests/llui_libtest/llwidgetreg.cpp
index c6e2e79a09..57c39243fb 100644
--- a/indra/integration_tests/llui_libtest/llwidgetreg.cpp
+++ b/indra/integration_tests/llui_libtest/llwidgetreg.cpp
@@ -37,6 +37,7 @@
#include "llcombobox.h"
#include "llcontainerview.h"
#include "lliconctrl.h"
+#include "llloadingindicator.h"
#include "llmenubutton.h"
#include "llmenugl.h"
#include "llmultislider.h"
@@ -72,6 +73,7 @@ void LLWidgetReg::initClass(bool register_widgets)
LLDefaultChildRegistry::Register<LLFlyoutButton> flyout_button("flyout_button");
LLDefaultChildRegistry::Register<LLContainerView> container_view("container_view");
LLDefaultChildRegistry::Register<LLIconCtrl> icon("icon");
+ LLDefaultChildRegistry::Register<LLLoadingIndicator> loading_indicator("loading_indicator");
LLDefaultChildRegistry::Register<LLLineEditor> line_editor("line_editor");
LLDefaultChildRegistry::Register<LLMenuItemSeparatorGL> menu_item_separator("menu_item_separator");
LLDefaultChildRegistry::Register<LLMenuItemCallGL> menu_item_call_gl("menu_item_call");
diff --git a/indra/lib/python/indra/util/llmanifest.py b/indra/lib/python/indra/util/llmanifest.py
index 7e5b86c53f..c33a03034a 100644
--- a/indra/lib/python/indra/util/llmanifest.py
+++ b/indra/lib/python/indra/util/llmanifest.py
@@ -39,6 +39,7 @@ import shutil
import sys
import tarfile
import errno
+import subprocess
def path_ancestors(path):
drive, path = os.path.splitdrive(os.path.normpath(path))
@@ -366,20 +367,23 @@ class LLManifest(object):
def run_command(self, command):
""" Runs an external command, and returns the output. Raises
- an exception if the command reurns a nonzero status code. For
- debugging/informational purpoases, prints out the command's
+ an exception if the command returns a nonzero status code. For
+ debugging/informational purposes, prints out the command's
output as it is received."""
print "Running command:", command
- fd = os.popen(command, 'r')
+ sys.stdout.flush()
+ child = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
+ shell=True)
lines = []
while True:
- lines.append(fd.readline())
+ lines.append(child.stdout.readline())
if lines[-1] == '':
break
else:
print lines[-1],
output = ''.join(lines)
- status = fd.close()
+ child.stdout.close()
+ status = child.wait()
if status:
raise RuntimeError(
"Command %s returned non-zero status (%s) \noutput:\n%s"
diff --git a/indra/linux_crash_logger/CMakeLists.txt b/indra/linux_crash_logger/CMakeLists.txt
index 4b19e28066..ab62a0d0af 100644
--- a/indra/linux_crash_logger/CMakeLists.txt
+++ b/indra/linux_crash_logger/CMakeLists.txt
@@ -54,12 +54,5 @@ target_link_libraries(linux-crash-logger
${DB_LIBRARIES}
)
-add_custom_command(
- OUTPUT linux-crash-logger-stripped
- COMMAND strip
- ARGS --strip-debug -o linux-crash-logger-stripped linux-crash-logger
- DEPENDS linux-crash-logger
- )
-
-add_custom_target(linux-crash-logger-strip-target ALL
- DEPENDS linux-crash-logger-stripped)
+add_custom_target(linux-crash-logger-target ALL
+ DEPENDS linux-crash-logger)
diff --git a/indra/linux_crash_logger/llcrashloggerlinux.cpp b/indra/linux_crash_logger/llcrashloggerlinux.cpp
index 039b70ec4a..ce03ea0d6f 100644
--- a/indra/linux_crash_logger/llcrashloggerlinux.cpp
+++ b/indra/linux_crash_logger/llcrashloggerlinux.cpp
@@ -120,7 +120,6 @@ LLCrashLoggerLinux::~LLCrashLoggerLinux(void)
void LLCrashLoggerLinux::gatherPlatformSpecificFiles()
{
- mFileMap["CrashLog"] = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log").c_str();
}
bool LLCrashLoggerLinux::mainLoop()
diff --git a/indra/linux_updater/CMakeLists.txt b/indra/linux_updater/CMakeLists.txt
index 9fe32ecb46..00a78b2a8f 100644
--- a/indra/linux_updater/CMakeLists.txt
+++ b/indra/linux_updater/CMakeLists.txt
@@ -47,12 +47,5 @@ target_link_libraries(linux-updater
${LLCOMMON_LIBRARIES}
)
-add_custom_command(
- OUTPUT linux-updater-stripped
- COMMAND strip
- ARGS --strip-debug -o linux-updater-stripped linux-updater
- DEPENDS linux-updater
- )
-
-add_custom_target(linux-updater-strip-target ALL
- DEPENDS linux-updater-stripped)
+add_custom_target(linux-updater-target ALL
+ DEPENDS linux-updater)
diff --git a/indra/llaudio/CMakeLists.txt b/indra/llaudio/CMakeLists.txt
index bfa2c34c12..e869b9717c 100644
--- a/indra/llaudio/CMakeLists.txt
+++ b/indra/llaudio/CMakeLists.txt
@@ -57,13 +57,11 @@ if (FMOD)
llstreamingaudio_fmod.h
)
- if (LINUX)
- if (${CXX_VERSION_NUMBER} GREATER 419)
- set_source_files_properties(llaudioengine_fmod.cpp
- llstreamingaudio_fmod.cpp
- COMPILE_FLAGS -Wno-write-strings)
- endif (${CXX_VERSION_NUMBER} GREATER 419)
- endif (LINUX)
+ if (LINUX OR DARWIN)
+ set_source_files_properties(llaudioengine_fmod.cpp
+ llstreamingaudio_fmod.cpp
+ COMPILE_FLAGS -Wno-write-strings)
+ endif (LINUX OR DARWIN)
endif (FMOD)
if (OPENAL)
diff --git a/indra/llaudio/llaudioengine.cpp b/indra/llaudio/llaudioengine.cpp
index a28c94d00d..9f4c108dff 100644
--- a/indra/llaudio/llaudioengine.cpp
+++ b/indra/llaudio/llaudioengine.cpp
@@ -202,12 +202,12 @@ void LLAudioEngine::updateInternetStream()
}
// virtual
-int LLAudioEngine::isInternetStreamPlaying()
+LLAudioEngine::LLAudioPlayState LLAudioEngine::isInternetStreamPlaying()
{
if (mStreamingAudioImpl)
- return mStreamingAudioImpl->isPlaying();
+ return (LLAudioEngine::LLAudioPlayState) mStreamingAudioImpl->isPlaying();
- return 0; // Stopped
+ return LLAudioEngine::AUDIO_STOPPED; // Stopped
}
@@ -548,12 +548,11 @@ void LLAudioEngine::enableWind(bool enable)
{
if (enable && (!mEnableWind))
{
- initWind();
- mEnableWind = enable;
+ mEnableWind = initWind();
}
else if (mEnableWind && (!enable))
{
- mEnableWind = enable;
+ mEnableWind = false;
cleanupWind();
}
}
@@ -592,7 +591,7 @@ LLAudioBuffer * LLAudioEngine::getFreeBuffer()
if (buffer_id >= 0)
{
- llinfos << "Taking over unused buffer " << buffer_id << llendl;
+ lldebugs << "Taking over unused buffer " << buffer_id << llendl;
//llinfos << "Flushing unused buffer!" << llendl;
mBuffers[buffer_id]->mAudioDatap->mBufferp = NULL;
delete mBuffers[buffer_id];
diff --git a/indra/llaudio/llaudioengine.h b/indra/llaudio/llaudioengine.h
index 457fd93abe..5876cef4ea 100644
--- a/indra/llaudio/llaudioengine.h
+++ b/indra/llaudio/llaudioengine.h
@@ -91,6 +91,15 @@ public:
AUDIO_TYPE_COUNT = 4 // last
};
+ enum LLAudioPlayState
+ {
+ // isInternetStreamPlaying() returns an *int*, with
+ // 0 = stopped, 1 = playing, 2 = paused.
+ AUDIO_STOPPED = 0,
+ AUDIO_PLAYING = 1,
+ AUDIO_PAUSED = 2
+ };
+
LLAudioEngine();
virtual ~LLAudioEngine();
@@ -156,7 +165,7 @@ public:
void stopInternetStream();
void pauseInternetStream(int pause);
void updateInternetStream(); // expected to be called often
- int isInternetStreamPlaying();
+ LLAudioPlayState isInternetStreamPlaying();
// use a value from 0.0 to 1.0, inclusive
void setInternetStreamGain(F32 vol);
std::string getInternetStreamURL();
@@ -186,7 +195,7 @@ protected:
virtual LLAudioBuffer *createBuffer() = 0;
virtual LLAudioChannel *createChannel() = 0;
- virtual void initWind() = 0;
+ virtual bool initWind() = 0;
virtual void cleanupWind() = 0;
virtual void setInternalGain(F32 gain) = 0;
diff --git a/indra/llaudio/llaudioengine_fmod.cpp b/indra/llaudio/llaudioengine_fmod.cpp
index d7f58defca..7a8a04afa1 100644
--- a/indra/llaudio/llaudioengine_fmod.cpp
+++ b/indra/llaudio/llaudioengine_fmod.cpp
@@ -54,13 +54,12 @@ extern "C" {
void * F_CALLBACKAPI windCallback(void *originalbuffer, void *newbuffer, int length, void* userdata);
}
-FSOUND_DSPUNIT *gWindDSP = NULL;
-
LLAudioEngine_FMOD::LLAudioEngine_FMOD()
{
mInited = false;
mWindGen = NULL;
+ mWindDSP = NULL;
}
@@ -258,10 +257,10 @@ void LLAudioEngine_FMOD::allocateListener(void)
void LLAudioEngine_FMOD::shutdown()
{
- if (gWindDSP)
+ if (mWindDSP)
{
- FSOUND_DSP_SetActive(gWindDSP,false);
- FSOUND_DSP_Free(gWindDSP);
+ FSOUND_DSP_SetActive(mWindDSP,false);
+ FSOUND_DSP_Free(mWindDSP);
}
stopInternetStream();
@@ -289,29 +288,66 @@ LLAudioChannel * LLAudioEngine_FMOD::createChannel()
}
-void LLAudioEngine_FMOD::initWind()
+bool LLAudioEngine_FMOD::initWind()
{
- mWindGen = new LLWindGen<MIXBUFFERFORMAT>;
+ if (!mWindGen)
+ {
+ bool enable;
+
+ switch (FSOUND_GetMixer())
+ {
+ case FSOUND_MIXER_MMXP5:
+ case FSOUND_MIXER_MMXP6:
+ case FSOUND_MIXER_QUALITY_MMXP5:
+ case FSOUND_MIXER_QUALITY_MMXP6:
+ enable = (typeid(MIXBUFFERFORMAT) == typeid(S16));
+ break;
+ case FSOUND_MIXER_BLENDMODE:
+ enable = (typeid(MIXBUFFERFORMAT) == typeid(S32));
+ break;
+ case FSOUND_MIXER_QUALITY_FPU:
+ enable = (typeid(MIXBUFFERFORMAT) == typeid(F32));
+ break;
+ default:
+ // FSOUND_GetMixer() does not return a valid mixer type on Darwin
+ LL_INFOS("AppInit") << "Unknown FMOD mixer type, assuming default" << LL_ENDL;
+ enable = true;
+ break;
+ }
+
+ if (enable)
+ {
+ mWindGen = new LLWindGen<MIXBUFFERFORMAT>(FSOUND_GetOutputRate());
+ }
+ else
+ {
+ LL_WARNS("AppInit") << "Incompatible FMOD mixer type, wind noise disabled" << LL_ENDL;
+ }
+ }
+
+ mNextWindUpdate = 0.0;
- if (!gWindDSP)
+ if (mWindGen && !mWindDSP)
{
- gWindDSP = FSOUND_DSP_Create(&windCallback, FSOUND_DSP_DEFAULTPRIORITY_CLEARUNIT + 20, mWindGen);
+ mWindDSP = FSOUND_DSP_Create(&windCallback, FSOUND_DSP_DEFAULTPRIORITY_CLEARUNIT + 20, mWindGen);
}
- if (gWindDSP)
+ if (mWindDSP)
{
- FSOUND_DSP_SetActive(gWindDSP, true);
+ FSOUND_DSP_SetActive(mWindDSP, true);
+ return true;
}
- mNextWindUpdate = 0.0;
+
+ return false;
}
void LLAudioEngine_FMOD::cleanupWind()
{
- if (gWindDSP)
+ if (mWindDSP)
{
- FSOUND_DSP_SetActive(gWindDSP, false);
- FSOUND_DSP_Free(gWindDSP);
- gWindDSP = NULL;
+ FSOUND_DSP_SetActive(mWindDSP, false);
+ FSOUND_DSP_Free(mWindDSP);
+ mWindDSP = NULL;
}
delete mWindGen;
@@ -740,30 +776,12 @@ void * F_CALLBACKAPI windCallback(void *originalbuffer, void *newbuffer, int len
// originalbuffer = fmod's original mixbuffer.
// newbuffer = the buffer passed from the previous DSP unit.
// length = length in samples at this mix time.
- // param = user parameter passed through in FSOUND_DSP_Create.
- //
- // modify the buffer in some fashion
+ // userdata = user parameter passed through in FSOUND_DSP_Create.
LLWindGen<LLAudioEngine_FMOD::MIXBUFFERFORMAT> *windgen =
(LLWindGen<LLAudioEngine_FMOD::MIXBUFFERFORMAT> *)userdata;
- U8 stride;
-
-#if LL_DARWIN
- stride = sizeof(LLAudioEngine_FMOD::MIXBUFFERFORMAT);
-#else
- int mixertype = FSOUND_GetMixer();
- if (mixertype == FSOUND_MIXER_BLENDMODE ||
- mixertype == FSOUND_MIXER_QUALITY_FPU)
- {
- stride = 4;
- }
- else
- {
- stride = 2;
- }
-#endif
-
- newbuffer = windgen->windGenerate((LLAudioEngine_FMOD::MIXBUFFERFORMAT *)newbuffer, length, stride);
+
+ newbuffer = windgen->windGenerate((LLAudioEngine_FMOD::MIXBUFFERFORMAT *)newbuffer, length);
return newbuffer;
}
diff --git a/indra/llaudio/llaudioengine_fmod.h b/indra/llaudio/llaudioengine_fmod.h
index 3968657cba..0e386a3884 100644
--- a/indra/llaudio/llaudioengine_fmod.h
+++ b/indra/llaudio/llaudioengine_fmod.h
@@ -55,15 +55,15 @@ public:
virtual void shutdown();
- /*virtual*/ void initWind();
+ /*virtual*/ bool initWind();
/*virtual*/ void cleanupWind();
/*virtual*/void updateWind(LLVector3 direction, F32 camera_height_above_water);
#if LL_DARWIN
- typedef S32 MIXBUFFERFORMAT;
+ typedef S32 MIXBUFFERFORMAT;
#else
- typedef S16 MIXBUFFERFORMAT;
+ typedef S16 MIXBUFFERFORMAT;
#endif
protected:
@@ -83,6 +83,7 @@ protected:
void* mUserData;
LLWindGen<MIXBUFFERFORMAT> *mWindGen;
+ FSOUND_DSPUNIT *mWindDSP;
};
diff --git a/indra/llaudio/llaudioengine_openal.cpp b/indra/llaudio/llaudioengine_openal.cpp
index a5982ccbd6..887c791790 100644
--- a/indra/llaudio/llaudioengine_openal.cpp
+++ b/indra/llaudio/llaudioengine_openal.cpp
@@ -370,7 +370,7 @@ U32 LLAudioBufferOpenAL::getLength()
// ------------
-void LLAudioEngine_OpenAL::initWind()
+bool LLAudioEngine_OpenAL::initWind()
{
ALenum error;
llinfos << "LLAudioEngine_OpenAL::initWind() start" << llendl;
@@ -397,10 +397,12 @@ void LLAudioEngine_OpenAL::initWind()
if(mWindBuf==NULL)
{
llerrs << "LLAudioEngine_OpenAL::initWind() Error creating wind memory buffer" << llendl;
- mEnableWind=false;
+ return false;
}
llinfos << "LLAudioEngine_OpenAL::initWind() done" << llendl;
+
+ return true;
}
void LLAudioEngine_OpenAL::cleanupWind()
@@ -508,14 +510,14 @@ void LLAudioEngine_OpenAL::updateWind(LLVector3 wind_vec, F32 camera_altitude)
alGenBuffers(1,&buffer);
if((error=alGetError()) != AL_NO_ERROR)
{
- llwarns << "LLAudioEngine_OpenAL::initWind() Error creating wind buffer: " << error << llendl;
+ llwarns << "LLAudioEngine_OpenAL::updateWind() Error creating wind buffer: " << error << llendl;
break;
}
alBufferData(buffer,
AL_FORMAT_STEREO16,
mWindGen->windGenerate(mWindBuf,
- mWindBufSamples, 2),
+ mWindBufSamples),
mWindBufBytes,
mWindBufFreq);
error = alGetError();
diff --git a/indra/llaudio/llaudioengine_openal.h b/indra/llaudio/llaudioengine_openal.h
index 5aca03e195..16125b2476 100644
--- a/indra/llaudio/llaudioengine_openal.h
+++ b/indra/llaudio/llaudioengine_openal.h
@@ -57,23 +57,23 @@ class LLAudioEngine_OpenAL : public LLAudioEngine
LLAudioBuffer* createBuffer();
LLAudioChannel* createChannel();
- /*virtual*/ void initWind();
+ /*virtual*/ bool initWind();
/*virtual*/ void cleanupWind();
/*virtual*/ void updateWind(LLVector3 direction, F32 camera_altitude);
private:
void * windDSP(void *newbuffer, int length);
- typedef S16 WIND_SAMPLE_T;
- LLWindGen<WIND_SAMPLE_T> *mWindGen;
- S16 *mWindBuf;
- U32 mWindBufFreq;
- U32 mWindBufSamples;
- U32 mWindBufBytes;
- ALuint mWindSource;
- int mNumEmptyWindALBuffers;
-
- static const int MAX_NUM_WIND_BUFFERS = 80;
- static const float WIND_BUFFER_SIZE_SEC = 0.05f; // 1/20th sec
+ typedef S16 WIND_SAMPLE_T;
+ LLWindGen<WIND_SAMPLE_T> *mWindGen;
+ S16 *mWindBuf;
+ U32 mWindBufFreq;
+ U32 mWindBufSamples;
+ U32 mWindBufBytes;
+ ALuint mWindSource;
+ int mNumEmptyWindALBuffers;
+
+ static const int MAX_NUM_WIND_BUFFERS = 80;
+ static const float WIND_BUFFER_SIZE_SEC = 0.05f; // 1/20th sec
};
class LLAudioChannelOpenAL : public LLAudioChannel
diff --git a/indra/llaudio/llstreamingaudio_fmod.cpp b/indra/llaudio/llstreamingaudio_fmod.cpp
index a4620fa13c..fe94688565 100644
--- a/indra/llaudio/llstreamingaudio_fmod.cpp
+++ b/indra/llaudio/llstreamingaudio_fmod.cpp
@@ -271,7 +271,7 @@ void LLStreamingAudio_FMOD::setGain(F32 vol)
if (mFMODInternetStreamChannel != -1)
{
- vol = llclamp(vol, 0.f, 1.f);
+ vol = llclamp(vol * vol, 0.f, 1.f);
int vol_int = llround(vol * 255.f);
FSOUND_SetVolumeAbsolute(mFMODInternetStreamChannel, vol_int);
}
diff --git a/indra/llaudio/llwindgen.h b/indra/llaudio/llwindgen.h
index 847bfa6e9d..1908b2545f 100644
--- a/indra/llaudio/llwindgen.h
+++ b/indra/llaudio/llwindgen.h
@@ -33,104 +33,149 @@
#define WINDGEN_H
#include "llcommon.h"
-#include "llrand.h"
template <class MIXBUFFERFORMAT_T>
class LLWindGen
{
public:
- LLWindGen() :
+ LLWindGen(const U32 sample_rate = 44100) :
mTargetGain(0.f),
mTargetFreq(100.f),
mTargetPanGainR(0.5f),
- mbuf0(0.0),
- mbuf1(0.0),
- mbuf2(0.0),
- mbuf3(0.0),
- mbuf4(0.0),
- mbuf5(0.0),
- mY0(0.0),
- mY1(0.0),
+ mInputSamplingRate(sample_rate),
+ mSubSamples(2),
+ mFilterBandWidth(50.f),
+ mBuf0(0.0f),
+ mBuf1(0.0f),
+ mBuf2(0.0f),
+ mY0(0.0f),
+ mY1(0.0f),
mCurrentGain(0.f),
mCurrentFreq(100.f),
- mCurrentPanGainR(0.5f) {};
-
- static const U32 getInputSamplingRate() {return mInputSamplingRate;}
+ mCurrentPanGainR(0.5f)
+ {
+ mSamplePeriod = (F32)mSubSamples / (F32)mInputSamplingRate;
+ mB2 = expf(-F_TWO_PI * mFilterBandWidth * mSamplePeriod);
+ }
+ const U32 getInputSamplingRate() { return mInputSamplingRate; }
+
// newbuffer = the buffer passed from the previous DSP unit.
// numsamples = length in samples-per-channel at this mix time.
- // stride = number of bytes between start of each sample.
// NOTE: generates L/R interleaved stereo
- MIXBUFFERFORMAT_T* windGenerate(MIXBUFFERFORMAT_T *newbuffer, int numsamples, int stride)
+ MIXBUFFERFORMAT_T* windGenerate(MIXBUFFERFORMAT_T *newbuffer, int numsamples)
{
- U8 *cursamplep = (U8*)newbuffer;
+ MIXBUFFERFORMAT_T *cursamplep = newbuffer;
+
+ // Filter coefficients
+ F32 a0 = 0.0f, b1 = 0.0f;
- double bandwidth = 50.0F;
- double a0,b1,b2;
+ // No need to clip at normal volumes
+ bool clip = mCurrentGain > 2.0f;
- // calculate resonant filter coeffs
- b2 = exp(-(F_TWO_PI) * (bandwidth / mInputSamplingRate));
+ bool interp_freq = false;
- while (numsamples--)
+ //if the frequency isn't changing much, we don't need to interpolate in the inner loop
+ if (llabs(mTargetFreq - mCurrentFreq) < (mCurrentFreq * 0.112))
{
- mCurrentFreq = (float)((0.999 * mCurrentFreq) + (0.001 * mTargetFreq));
- mCurrentGain = (float)((0.999 * mCurrentGain) + (0.001 * mTargetGain));
- mCurrentPanGainR = (float)((0.999 * mCurrentPanGainR) + (0.001 * mTargetPanGainR));
- b1 = (-4.0 * b2) / (1.0 + b2) * cos(F_TWO_PI * (mCurrentFreq / mInputSamplingRate));
- a0 = (1.0 - b2) * sqrt(1.0 - (b1 * b1) / (4.0 * b2));
- double nextSample;
+ // calculate resonant filter coefficients
+ mCurrentFreq = mTargetFreq;
+ b1 = (-4.0f * mB2) / (1.0f + mB2) * cosf(F_TWO_PI * (mCurrentFreq * mSamplePeriod));
+ a0 = (1.0f - mB2) * sqrtf(1.0f - (b1 * b1) / (4.0f * mB2));
+ }
+ else
+ {
+ interp_freq = true;
+ }
+
+ while (numsamples)
+ {
+ F32 next_sample;
+
+ // Start with white noise
+ // This expression is fragile, rearrange it and it will break!
+ next_sample = (F32)rand() * (1.0f / (F32)(RAND_MAX / (U16_MAX / 8))) + (F32)(S16_MIN / 8);
- // start with white noise
- nextSample = ll_frand(2.0f) - 1.0f;
+ // Apply a pinking filter
+ // Magic numbers taken from PKE method at http://www.firstpr.com.au/dsp/pink-noise/
+ mBuf0 = mBuf0 * 0.99765f + next_sample * 0.0990460f;
+ mBuf1 = mBuf1 * 0.96300f + next_sample * 0.2965164f;
+ mBuf2 = mBuf2 * 0.57000f + next_sample * 1.0526913f;
- // apply pinking filter
- mbuf0 = 0.997f * mbuf0 + 0.0126502f * nextSample;
- mbuf1 = 0.985f * mbuf1 + 0.0139083f * nextSample;
- mbuf2 = 0.950f * mbuf2 + 0.0205439f * nextSample;
- mbuf3 = 0.850f * mbuf3 + 0.0387225f * nextSample;
- mbuf4 = 0.620f * mbuf4 + 0.0465932f * nextSample;
- mbuf5 = 0.250f * mbuf5 + 0.1093477f * nextSample;
+ next_sample = mBuf0 + mBuf1 + mBuf2 + next_sample * 0.1848f;
- nextSample = mbuf0 + mbuf1 + mbuf2 + mbuf3 + mbuf4 + mbuf5;
+ if (interp_freq)
+ {
+ // calculate and interpolate resonant filter coefficients
+ mCurrentFreq = (0.999f * mCurrentFreq) + (0.001f * mTargetFreq);
+ b1 = (-4.0f * mB2) / (1.0f + mB2) * cosf(F_TWO_PI * (mCurrentFreq * mSamplePeriod));
+ a0 = (1.0f - mB2) * sqrtf(1.0f - (b1 * b1) / (4.0f * mB2));
+ }
- // do a resonant filter on the noise
- nextSample = (double)( a0 * nextSample - b1 * mY0 - b2 * mY1 );
+ // Apply a resonant low-pass filter on the pink noise
+ next_sample = a0 * next_sample - b1 * mY0 - mB2 * mY1;
mY1 = mY0;
- mY0 = nextSample;
+ mY0 = next_sample;
- nextSample *= mCurrentGain;
+ mCurrentGain = (0.999f * mCurrentGain) + (0.001f * mTargetGain);
+ mCurrentPanGainR = (0.999f * mCurrentPanGainR) + (0.001f * mTargetPanGainR);
- MIXBUFFERFORMAT_T sample;
+ // For a 3dB pan law use:
+ // next_sample *= mCurrentGain * ((mCurrentPanGainR*(mCurrentPanGainR-1)*1.652+1.413);
+ next_sample *= mCurrentGain;
- sample = llfloor(((F32)nextSample*32768.f*(1.0f - mCurrentPanGainR))+0.5f);
- *(MIXBUFFERFORMAT_T*)cursamplep = llclamp(sample, (MIXBUFFERFORMAT_T)-32768, (MIXBUFFERFORMAT_T)32767);
- cursamplep += stride;
-
- sample = llfloor(((F32)nextSample*32768.f*mCurrentPanGainR)+0.5f);
- *(MIXBUFFERFORMAT_T*)cursamplep = llclamp(sample, (MIXBUFFERFORMAT_T)-32768, (MIXBUFFERFORMAT_T)32767);
- cursamplep += stride;
+ // delta is used to interpolate between synthesized samples
+ F32 delta = (next_sample - mLastSample) / (F32)mSubSamples;
+
+ // Fill the audio buffer, clipping if necessary
+ for (U8 i=mSubSamples; i && numsamples; --i, --numsamples)
+ {
+ mLastSample = mLastSample + delta;
+ S32 sample_right = (S32)(mLastSample * mCurrentPanGainR);
+ S32 sample_left = (S32)mLastSample - sample_right;
+
+ if (!clip)
+ {
+ *cursamplep = (MIXBUFFERFORMAT_T)sample_left;
+ ++cursamplep;
+ *cursamplep = (MIXBUFFERFORMAT_T)sample_right;
+ ++cursamplep;
+ }
+ else
+ {
+ *cursamplep = (MIXBUFFERFORMAT_T)llclamp(sample_left, (S32)S16_MIN, (S32)S16_MAX);
+ ++cursamplep;
+ *cursamplep = (MIXBUFFERFORMAT_T)llclamp(sample_right, (S32)S16_MIN, (S32)S16_MAX);
+ ++cursamplep;
+ }
+ }
}
return newbuffer;
}
-
+
+public:
F32 mTargetGain;
F32 mTargetFreq;
F32 mTargetPanGainR;
-
+
private:
- static const U32 mInputSamplingRate = 44100;
- F64 mbuf0;
- F64 mbuf1;
- F64 mbuf2;
- F64 mbuf3;
- F64 mbuf4;
- F64 mbuf5;
- F64 mY0;
- F64 mY1;
+ U32 mInputSamplingRate;
+ U8 mSubSamples;
+ F32 mSamplePeriod;
+ F32 mFilterBandWidth;
+ F32 mB2;
+
+ F32 mBuf0;
+ F32 mBuf1;
+ F32 mBuf2;
+ F32 mY0;
+ F32 mY1;
+
F32 mCurrentGain;
F32 mCurrentFreq;
F32 mCurrentPanGainR;
+ F32 mLastSample;
};
#endif
diff --git a/indra/llcharacter/llanimationstates.cpp b/indra/llcharacter/llanimationstates.cpp
index 365fb673f3..4c24218fc3 100644
--- a/indra/llcharacter/llanimationstates.cpp
+++ b/indra/llcharacter/llanimationstates.cpp
@@ -39,6 +39,146 @@
#include "llanimationstates.h"
#include "llstring.h"
+const LLUUID ANIM_AGENT_AFRAID = LLUUID("6b61c8e8-4747-0d75-12d7-e49ff207a4ca");
+const LLUUID ANIM_AGENT_AIM_BAZOOKA_R = LLUUID("b5b4a67d-0aee-30d2-72cd-77b333e932ef");
+const LLUUID ANIM_AGENT_AIM_BOW_L = LLUUID("46bb4359-de38-4ed8-6a22-f1f52fe8f506");
+const LLUUID ANIM_AGENT_AIM_HANDGUN_R = LLUUID("3147d815-6338-b932-f011-16b56d9ac18b");
+const LLUUID ANIM_AGENT_AIM_RIFLE_R = LLUUID("ea633413-8006-180a-c3ba-96dd1d756720");
+const LLUUID ANIM_AGENT_ANGRY = LLUUID("5747a48e-073e-c331-f6f3-7c2149613d3e");
+const LLUUID ANIM_AGENT_AWAY = LLUUID("fd037134-85d4-f241-72c6-4f42164fedee");
+const LLUUID ANIM_AGENT_BACKFLIP = LLUUID("c4ca6188-9127-4f31-0158-23c4e2f93304");
+const LLUUID ANIM_AGENT_BELLY_LAUGH = LLUUID("18b3a4b5-b463-bd48-e4b6-71eaac76c515");
+const LLUUID ANIM_AGENT_BLOW_KISS = LLUUID("db84829b-462c-ee83-1e27-9bbee66bd624");
+const LLUUID ANIM_AGENT_BORED = LLUUID("b906c4ba-703b-1940-32a3-0c7f7d791510");
+const LLUUID ANIM_AGENT_BOW = LLUUID("82e99230-c906-1403-4d9c-3889dd98daba");
+const LLUUID ANIM_AGENT_BRUSH = LLUUID("349a3801-54f9-bf2c-3bd0-1ac89772af01");
+const LLUUID ANIM_AGENT_BUSY = LLUUID("efcf670c-2d18-8128-973a-034ebc806b67");
+const LLUUID ANIM_AGENT_CLAP = LLUUID("9b0c1c4e-8ac7-7969-1494-28c874c4f668");
+const LLUUID ANIM_AGENT_COURTBOW = LLUUID("9ba1c942-08be-e43a-fb29-16ad440efc50");
+const LLUUID ANIM_AGENT_CROUCH = LLUUID("201f3fdf-cb1f-dbec-201f-7333e328ae7c");
+const LLUUID ANIM_AGENT_CROUCHWALK = LLUUID("47f5f6fb-22e5-ae44-f871-73aaaf4a6022");
+const LLUUID ANIM_AGENT_CRY = LLUUID("92624d3e-1068-f1aa-a5ec-8244585193ed");
+const LLUUID ANIM_AGENT_CUSTOMIZE = LLUUID("038fcec9-5ebd-8a8e-0e2e-6e71a0a1ac53");
+const LLUUID ANIM_AGENT_CUSTOMIZE_DONE = LLUUID("6883a61a-b27b-5914-a61e-dda118a9ee2c");
+const LLUUID ANIM_AGENT_DANCE1 = LLUUID("b68a3d7c-de9e-fc87-eec8-543d787e5b0d");
+const LLUUID ANIM_AGENT_DANCE2 = LLUUID("928cae18-e31d-76fd-9cc9-2f55160ff818");
+const LLUUID ANIM_AGENT_DANCE3 = LLUUID("30047778-10ea-1af7-6881-4db7a3a5a114");
+const LLUUID ANIM_AGENT_DANCE4 = LLUUID("951469f4-c7b2-c818-9dee-ad7eea8c30b7");
+const LLUUID ANIM_AGENT_DANCE5 = LLUUID("4bd69a1d-1114-a0b4-625f-84e0a5237155");
+const LLUUID ANIM_AGENT_DANCE6 = LLUUID("cd28b69b-9c95-bb78-3f94-8d605ff1bb12");
+const LLUUID ANIM_AGENT_DANCE7 = LLUUID("a54d8ee2-28bb-80a9-7f0c-7afbbe24a5d6");
+const LLUUID ANIM_AGENT_DANCE8 = LLUUID("b0dc417c-1f11-af36-2e80-7e7489fa7cdc");
+const LLUUID ANIM_AGENT_DEAD = LLUUID("57abaae6-1d17-7b1b-5f98-6d11a6411276");
+const LLUUID ANIM_AGENT_DRINK = LLUUID("0f86e355-dd31-a61c-fdb0-3a96b9aad05f");
+const LLUUID ANIM_AGENT_EMBARRASSED = LLUUID("514af488-9051-044a-b3fc-d4dbf76377c6");
+const LLUUID ANIM_AGENT_EXPRESS_AFRAID = LLUUID("aa2df84d-cf8f-7218-527b-424a52de766e");
+const LLUUID ANIM_AGENT_EXPRESS_ANGER = LLUUID("1a03b575-9634-b62a-5767-3a679e81f4de");
+const LLUUID ANIM_AGENT_EXPRESS_BORED = LLUUID("214aa6c1-ba6a-4578-f27c-ce7688f61d0d");
+const LLUUID ANIM_AGENT_EXPRESS_CRY = LLUUID("d535471b-85bf-3b4d-a542-93bea4f59d33");
+const LLUUID ANIM_AGENT_EXPRESS_DISDAIN = LLUUID("d4416ff1-09d3-300f-4183-1b68a19b9fc1");
+const LLUUID ANIM_AGENT_EXPRESS_EMBARRASSED = LLUUID("0b8c8211-d78c-33e8-fa28-c51a9594e424");
+const LLUUID ANIM_AGENT_EXPRESS_FROWN = LLUUID("fee3df48-fa3d-1015-1e26-a205810e3001");
+const LLUUID ANIM_AGENT_EXPRESS_KISS = LLUUID("1e8d90cc-a84e-e135-884c-7c82c8b03a14");
+const LLUUID ANIM_AGENT_EXPRESS_LAUGH = LLUUID("62570842-0950-96f8-341c-809e65110823");
+const LLUUID ANIM_AGENT_EXPRESS_OPEN_MOUTH = LLUUID("d63bc1f9-fc81-9625-a0c6-007176d82eb7");
+const LLUUID ANIM_AGENT_EXPRESS_REPULSED = LLUUID("f76cda94-41d4-a229-2872-e0296e58afe1");
+const LLUUID ANIM_AGENT_EXPRESS_SAD = LLUUID("eb6ebfb2-a4b3-a19c-d388-4dd5c03823f7");
+const LLUUID ANIM_AGENT_EXPRESS_SHRUG = LLUUID("a351b1bc-cc94-aac2-7bea-a7e6ebad15ef");
+const LLUUID ANIM_AGENT_EXPRESS_SMILE = LLUUID("b7c7c833-e3d3-c4e3-9fc0-131237446312");
+const LLUUID ANIM_AGENT_EXPRESS_SURPRISE = LLUUID("728646d9-cc79-08b2-32d6-937f0a835c24");
+const LLUUID ANIM_AGENT_EXPRESS_TONGUE_OUT = LLUUID("835965c6-7f2f-bda2-5deb-2478737f91bf");
+const LLUUID ANIM_AGENT_EXPRESS_TOOTHSMILE = LLUUID("b92ec1a5-e7ce-a76b-2b05-bcdb9311417e");
+const LLUUID ANIM_AGENT_EXPRESS_WINK = LLUUID("da020525-4d94-59d6-23d7-81fdebf33148");
+const LLUUID ANIM_AGENT_EXPRESS_WORRY = LLUUID("9c05e5c7-6f07-6ca4-ed5a-b230390c3950");
+const LLUUID ANIM_AGENT_FALLDOWN = LLUUID("666307d9-a860-572d-6fd4-c3ab8865c094");
+const LLUUID ANIM_AGENT_FEMALE_RUN_NEW = LLUUID("85995026-eade-5d78-d364-94a64512cb66");
+const LLUUID ANIM_AGENT_FEMALE_WALK = LLUUID("f5fc7433-043d-e819-8298-f519a119b688");
+const LLUUID ANIM_AGENT_FEMALE_WALK_NEW = LLUUID("d60c41d2-7c24-7074-d3fa-6101cea22a51");
+const LLUUID ANIM_AGENT_FINGER_WAG = LLUUID("c1bc7f36-3ba0-d844-f93c-93be945d644f");
+const LLUUID ANIM_AGENT_FIST_PUMP = LLUUID("7db00ccd-f380-f3ee-439d-61968ec69c8a");
+const LLUUID ANIM_AGENT_FLY = LLUUID("aec4610c-757f-bc4e-c092-c6e9caf18daf");
+const LLUUID ANIM_AGENT_FLYSLOW = LLUUID("2b5a38b2-5e00-3a97-a495-4c826bc443e6");
+const LLUUID ANIM_AGENT_HELLO = LLUUID("9b29cd61-c45b-5689-ded2-91756b8d76a9");
+const LLUUID ANIM_AGENT_HOLD_BAZOOKA_R = LLUUID("ef62d355-c815-4816-2474-b1acc21094a6");
+const LLUUID ANIM_AGENT_HOLD_BOW_L = LLUUID("8b102617-bcba-037b-86c1-b76219f90c88");
+const LLUUID ANIM_AGENT_HOLD_HANDGUN_R = LLUUID("efdc1727-8b8a-c800-4077-975fc27ee2f2");
+const LLUUID ANIM_AGENT_HOLD_RIFLE_R = LLUUID("3d94bad0-c55b-7dcc-8763-033c59405d33");
+const LLUUID ANIM_AGENT_HOLD_THROW_R = LLUUID("7570c7b5-1f22-56dd-56ef-a9168241bbb6");
+const LLUUID ANIM_AGENT_HOVER = LLUUID("4ae8016b-31b9-03bb-c401-b1ea941db41d");
+const LLUUID ANIM_AGENT_HOVER_DOWN = LLUUID("20f063ea-8306-2562-0b07-5c853b37b31e");
+const LLUUID ANIM_AGENT_HOVER_UP = LLUUID("62c5de58-cb33-5743-3d07-9e4cd4352864");
+const LLUUID ANIM_AGENT_IMPATIENT = LLUUID("5ea3991f-c293-392e-6860-91dfa01278a3");
+const LLUUID ANIM_AGENT_JUMP = LLUUID("2305bd75-1ca9-b03b-1faa-b176b8a8c49e");
+const LLUUID ANIM_AGENT_JUMP_FOR_JOY = LLUUID("709ea28e-1573-c023-8bf8-520c8bc637fa");
+const LLUUID ANIM_AGENT_KISS_MY_BUTT = LLUUID("19999406-3a3a-d58c-a2ac-d72e555dcf51");
+const LLUUID ANIM_AGENT_LAND = LLUUID("7a17b059-12b2-41b1-570a-186368b6aa6f");
+const LLUUID ANIM_AGENT_LAUGH_SHORT = LLUUID("ca5b3f14-3194-7a2b-c894-aa699b718d1f");
+const LLUUID ANIM_AGENT_MEDIUM_LAND = LLUUID("f4f00d6e-b9fe-9292-f4cb-0ae06ea58d57");
+const LLUUID ANIM_AGENT_MOTORCYCLE_SIT = LLUUID("08464f78-3a8e-2944-cba5-0c94aff3af29");
+const LLUUID ANIM_AGENT_MUSCLE_BEACH = LLUUID("315c3a41-a5f3-0ba4-27da-f893f769e69b");
+const LLUUID ANIM_AGENT_NO = LLUUID("5a977ed9-7f72-44e9-4c4c-6e913df8ae74");
+const LLUUID ANIM_AGENT_NO_UNHAPPY = LLUUID("d83fa0e5-97ed-7eb2-e798-7bd006215cb4");
+const LLUUID ANIM_AGENT_NYAH_NYAH = LLUUID("f061723d-0a18-754f-66ee-29a44795a32f");
+const LLUUID ANIM_AGENT_ONETWO_PUNCH = LLUUID("eefc79be-daae-a239-8c04-890f5d23654a");
+const LLUUID ANIM_AGENT_PEACE = LLUUID("b312b10e-65ab-a0a4-8b3c-1326ea8e3ed9");
+const LLUUID ANIM_AGENT_POINT_ME = LLUUID("17c024cc-eef2-f6a0-3527-9869876d7752");
+const LLUUID ANIM_AGENT_POINT_YOU = LLUUID("ec952cca-61ef-aa3b-2789-4d1344f016de");
+const LLUUID ANIM_AGENT_PRE_JUMP = LLUUID("7a4e87fe-de39-6fcb-6223-024b00893244");
+const LLUUID ANIM_AGENT_PUNCH_LEFT = LLUUID("f3300ad9-3462-1d07-2044-0fef80062da0");
+const LLUUID ANIM_AGENT_PUNCH_RIGHT = LLUUID("c8e42d32-7310-6906-c903-cab5d4a34656");
+const LLUUID ANIM_AGENT_REPULSED = LLUUID("36f81a92-f076-5893-dc4b-7c3795e487cf");
+const LLUUID ANIM_AGENT_ROUNDHOUSE_KICK = LLUUID("49aea43b-5ac3-8a44-b595-96100af0beda");
+const LLUUID ANIM_AGENT_RPS_COUNTDOWN = LLUUID("35db4f7e-28c2-6679-cea9-3ee108f7fc7f");
+const LLUUID ANIM_AGENT_RPS_PAPER = LLUUID("0836b67f-7f7b-f37b-c00a-460dc1521f5a");
+const LLUUID ANIM_AGENT_RPS_ROCK = LLUUID("42dd95d5-0bc6-6392-f650-777304946c0f");
+const LLUUID ANIM_AGENT_RPS_SCISSORS = LLUUID("16803a9f-5140-e042-4d7b-d28ba247c325");
+const LLUUID ANIM_AGENT_RUN = LLUUID("05ddbff8-aaa9-92a1-2b74-8fe77a29b445");
+const LLUUID ANIM_AGENT_RUN_NEW = LLUUID("1ab1b236-cd08-21e6-0cbc-0d923fc6eca2");
+const LLUUID ANIM_AGENT_SAD = LLUUID("0eb702e2-cc5a-9a88-56a5-661a55c0676a");
+const LLUUID ANIM_AGENT_SALUTE = LLUUID("cd7668a6-7011-d7e2-ead8-fc69eff1a104");
+const LLUUID ANIM_AGENT_SHOOT_BOW_L = LLUUID("e04d450d-fdb5-0432-fd68-818aaf5935f8");
+const LLUUID ANIM_AGENT_SHOUT = LLUUID("6bd01860-4ebd-127a-bb3d-d1427e8e0c42");
+const LLUUID ANIM_AGENT_SHRUG = LLUUID("70ea714f-3a97-d742-1b01-590a8fcd1db5");
+const LLUUID ANIM_AGENT_SIT = LLUUID("1a5fe8ac-a804-8a5d-7cbd-56bd83184568");
+const LLUUID ANIM_AGENT_SIT_FEMALE = LLUUID("b1709c8d-ecd3-54a1-4f28-d55ac0840782");
+const LLUUID ANIM_AGENT_SIT_GENERIC = LLUUID("245f3c54-f1c0-bf2e-811f-46d8eeb386e7");
+const LLUUID ANIM_AGENT_SIT_GROUND = LLUUID("1c7600d6-661f-b87b-efe2-d7421eb93c86");
+const LLUUID ANIM_AGENT_SIT_GROUND_CONSTRAINED = LLUUID("1a2bd58e-87ff-0df8-0b4c-53e047b0bb6e");
+const LLUUID ANIM_AGENT_SIT_TO_STAND = LLUUID("a8dee56f-2eae-9e7a-05a2-6fb92b97e21e");
+const LLUUID ANIM_AGENT_SLEEP = LLUUID("f2bed5f9-9d44-39af-b0cd-257b2a17fe40");
+const LLUUID ANIM_AGENT_SMOKE_IDLE = LLUUID("d2f2ee58-8ad1-06c9-d8d3-3827ba31567a");
+const LLUUID ANIM_AGENT_SMOKE_INHALE = LLUUID("6802d553-49da-0778-9f85-1599a2266526");
+const LLUUID ANIM_AGENT_SMOKE_THROW_DOWN = LLUUID("0a9fb970-8b44-9114-d3a9-bf69cfe804d6");
+const LLUUID ANIM_AGENT_SNAPSHOT = LLUUID("eae8905b-271a-99e2-4c0e-31106afd100c");
+const LLUUID ANIM_AGENT_STAND = LLUUID("2408fe9e-df1d-1d7d-f4ff-1384fa7b350f");
+const LLUUID ANIM_AGENT_STANDUP = LLUUID("3da1d753-028a-5446-24f3-9c9b856d9422");
+const LLUUID ANIM_AGENT_STAND_1 = LLUUID("15468e00-3400-bb66-cecc-646d7c14458e");
+const LLUUID ANIM_AGENT_STAND_2 = LLUUID("370f3a20-6ca6-9971-848c-9a01bc42ae3c");
+const LLUUID ANIM_AGENT_STAND_3 = LLUUID("42b46214-4b44-79ae-deb8-0df61424ff4b");
+const LLUUID ANIM_AGENT_STAND_4 = LLUUID("f22fed8b-a5ed-2c93-64d5-bdd8b93c889f");
+const LLUUID ANIM_AGENT_STRETCH = LLUUID("80700431-74ec-a008-14f8-77575e73693f");
+const LLUUID ANIM_AGENT_STRIDE = LLUUID("1cb562b0-ba21-2202-efb3-30f82cdf9595");
+const LLUUID ANIM_AGENT_SURF = LLUUID("41426836-7437-7e89-025d-0aa4d10f1d69");
+const LLUUID ANIM_AGENT_SURPRISE = LLUUID("313b9881-4302-73c0-c7d0-0e7a36b6c224");
+const LLUUID ANIM_AGENT_SWORD_STRIKE = LLUUID("85428680-6bf9-3e64-b489-6f81087c24bd");
+const LLUUID ANIM_AGENT_TALK = LLUUID("5c682a95-6da4-a463-0bf6-0f5b7be129d1");
+const LLUUID ANIM_AGENT_TANTRUM = LLUUID("11000694-3f41-adc2-606b-eee1d66f3724");
+const LLUUID ANIM_AGENT_THROW_R = LLUUID("aa134404-7dac-7aca-2cba-435f9db875ca");
+const LLUUID ANIM_AGENT_TRYON_SHIRT = LLUUID("83ff59fe-2346-f236-9009-4e3608af64c1");
+const LLUUID ANIM_AGENT_TURNLEFT = LLUUID("56e0ba0d-4a9f-7f27-6117-32f2ebbf6135");
+const LLUUID ANIM_AGENT_TURNRIGHT = LLUUID("2d6daa51-3192-6794-8e2e-a15f8338ec30");
+const LLUUID ANIM_AGENT_TYPE = LLUUID("c541c47f-e0c0-058b-ad1a-d6ae3a4584d9");
+const LLUUID ANIM_AGENT_WALK = LLUUID("6ed24bd8-91aa-4b12-ccc7-c97c857ab4e0");
+const LLUUID ANIM_AGENT_WALK_NEW = LLUUID("33339176-7ddc-9397-94a4-bf3403cbc8f5");
+const LLUUID ANIM_AGENT_WHISPER = LLUUID("7693f268-06c7-ea71-fa21-2b30d6533f8f");
+const LLUUID ANIM_AGENT_WHISTLE = LLUUID("b1ed7982-c68e-a982-7561-52a88a5298c0");
+const LLUUID ANIM_AGENT_WINK = LLUUID("869ecdad-a44b-671e-3266-56aef2e3ac2e");
+const LLUUID ANIM_AGENT_WINK_HOLLYWOOD = LLUUID("c0c4030f-c02b-49de-24ba-2331f43fe41c");
+const LLUUID ANIM_AGENT_WORRY = LLUUID("9f496bd2-589a-709f-16cc-69bf7df1d36c");
+const LLUUID ANIM_AGENT_YES = LLUUID("15dd911d-be82-2856-26db-27659b142875");
+const LLUUID ANIM_AGENT_YES_HAPPY = LLUUID("b8c8b2a3-9008-1771-3bfc-90924955ab2d");
+const LLUUID ANIM_AGENT_YOGA_FLOAT = LLUUID("42ecd00b-9947-a97c-400a-bbc9174c7aeb");
+
LLUUID AGENT_WALK_ANIMS[] = {ANIM_AGENT_WALK, ANIM_AGENT_RUN, ANIM_AGENT_CROUCHWALK, ANIM_AGENT_TURNLEFT, ANIM_AGENT_TURNRIGHT};
S32 NUM_AGENT_WALK_ANIMS = LL_ARRAY_SIZE(AGENT_WALK_ANIMS);
@@ -116,7 +256,9 @@ LLAnimationLibrary::LLAnimationLibrary() :
mAnimMap[ANIM_AGENT_EXPRESS_WINK]= mAnimStringTable.addString("express_wink_emote");
mAnimMap[ANIM_AGENT_EXPRESS_WORRY]= mAnimStringTable.addString("express_worry_emote");
mAnimMap[ANIM_AGENT_FALLDOWN]= mAnimStringTable.addString("falldown");
+ mAnimMap[ANIM_AGENT_FEMALE_RUN_NEW]= mAnimStringTable.addString("female_run_new");
mAnimMap[ANIM_AGENT_FEMALE_WALK]= mAnimStringTable.addString("female_walk");
+ mAnimMap[ANIM_AGENT_FEMALE_WALK_NEW]= mAnimStringTable.addString("female_walk_new");
mAnimMap[ANIM_AGENT_FINGER_WAG]= mAnimStringTable.addString("angry_fingerwag");
mAnimMap[ANIM_AGENT_FIST_PUMP]= mAnimStringTable.addString("fist_pump");
mAnimMap[ANIM_AGENT_FLY]= mAnimStringTable.addString("fly");
@@ -156,6 +298,7 @@ LLAnimationLibrary::LLAnimationLibrary() :
mAnimMap[ANIM_AGENT_RPS_ROCK]= mAnimStringTable.addString("rps_rock");
mAnimMap[ANIM_AGENT_RPS_SCISSORS]= mAnimStringTable.addString("rps_scissors");
mAnimMap[ANIM_AGENT_RUN]= mAnimStringTable.addString("run");
+ mAnimMap[ANIM_AGENT_RUN_NEW]= mAnimStringTable.addString("run_new");
mAnimMap[ANIM_AGENT_SAD]= mAnimStringTable.addString("express_sad");
mAnimMap[ANIM_AGENT_SALUTE]= mAnimStringTable.addString("salute");
mAnimMap[ANIM_AGENT_SHOOT_BOW_L]= mAnimStringTable.addString("shoot_l_bow");
@@ -191,6 +334,7 @@ LLAnimationLibrary::LLAnimationLibrary() :
mAnimMap[ANIM_AGENT_TURNRIGHT]= mAnimStringTable.addString("turnright");
mAnimMap[ANIM_AGENT_TYPE]= mAnimStringTable.addString("type");
mAnimMap[ANIM_AGENT_WALK]= mAnimStringTable.addString("walk");
+ mAnimMap[ANIM_AGENT_WALK_NEW]= mAnimStringTable.addString("walk_new");
mAnimMap[ANIM_AGENT_WHISPER]= mAnimStringTable.addString("whisper");
mAnimMap[ANIM_AGENT_WHISTLE]= mAnimStringTable.addString("whistle");
mAnimMap[ANIM_AGENT_WINK]= mAnimStringTable.addString("express_wink");
@@ -260,6 +404,23 @@ LLUUID LLAnimationLibrary::stringToAnimState( const std::string& name, BOOL allo
return id;
}
+//-----------------------------------------------------------------------------
+// Associate an anim state with a name
+//-----------------------------------------------------------------------------
+void LLAnimationLibrary::animStateSetString( const LLUUID& state, const std::string& name)
+{
+ mAnimMap[state] = mAnimStringTable.addString(name);
+}
+
+std::string LLAnimationLibrary::animationName( const LLUUID& id ) const
+{
+ const char *cptr = gAnimLibrary.animStateToString(id);
+ if (cptr)
+ return std::string(cptr);
+ else
+ return std::string("[") + id.asString() + std::string("]");
+}
+
// Animation states that the user can trigger as part of a gesture
// See struct LLAnimStateEntry in header for label location information
const LLAnimStateEntry gUserAnimStates[] = {
@@ -337,6 +498,5 @@ const LLAnimStateEntry gUserAnimStates[] = {
const S32 gUserAnimStatesCount = LL_ARRAY_SIZE(gUserAnimStates);
-
// End
diff --git a/indra/llcharacter/llanimationstates.h b/indra/llcharacter/llanimationstates.h
index 56b24d5215..59d3a7d789 100644
--- a/indra/llcharacter/llanimationstates.h
+++ b/indra/llcharacter/llanimationstates.h
@@ -49,142 +49,145 @@
//-----------------------------------------------------------------------------
const S32 MAX_CONCURRENT_ANIMS = 16;
-
-const LLUUID ANIM_AGENT_AFRAID = LLUUID("6b61c8e8-4747-0d75-12d7-e49ff207a4ca");
-const LLUUID ANIM_AGENT_AIM_BAZOOKA_R = LLUUID("b5b4a67d-0aee-30d2-72cd-77b333e932ef");
-const LLUUID ANIM_AGENT_AIM_BOW_L = LLUUID("46bb4359-de38-4ed8-6a22-f1f52fe8f506");
-const LLUUID ANIM_AGENT_AIM_HANDGUN_R = LLUUID("3147d815-6338-b932-f011-16b56d9ac18b");
-const LLUUID ANIM_AGENT_AIM_RIFLE_R = LLUUID("ea633413-8006-180a-c3ba-96dd1d756720");
-const LLUUID ANIM_AGENT_ANGRY = LLUUID("5747a48e-073e-c331-f6f3-7c2149613d3e");
-const LLUUID ANIM_AGENT_AWAY = LLUUID("fd037134-85d4-f241-72c6-4f42164fedee");
-const LLUUID ANIM_AGENT_BACKFLIP = LLUUID("c4ca6188-9127-4f31-0158-23c4e2f93304");
-const LLUUID ANIM_AGENT_BELLY_LAUGH = LLUUID("18b3a4b5-b463-bd48-e4b6-71eaac76c515");
-const LLUUID ANIM_AGENT_BLOW_KISS = LLUUID("db84829b-462c-ee83-1e27-9bbee66bd624");
-const LLUUID ANIM_AGENT_BORED = LLUUID("b906c4ba-703b-1940-32a3-0c7f7d791510");
-const LLUUID ANIM_AGENT_BOW = LLUUID("82e99230-c906-1403-4d9c-3889dd98daba");
-const LLUUID ANIM_AGENT_BRUSH = LLUUID("349a3801-54f9-bf2c-3bd0-1ac89772af01");
-const LLUUID ANIM_AGENT_BUSY = LLUUID("efcf670c-2d18-8128-973a-034ebc806b67");
-const LLUUID ANIM_AGENT_CLAP = LLUUID("9b0c1c4e-8ac7-7969-1494-28c874c4f668");
-const LLUUID ANIM_AGENT_COURTBOW = LLUUID("9ba1c942-08be-e43a-fb29-16ad440efc50");
-const LLUUID ANIM_AGENT_CROUCH = LLUUID("201f3fdf-cb1f-dbec-201f-7333e328ae7c");
-const LLUUID ANIM_AGENT_CROUCHWALK = LLUUID("47f5f6fb-22e5-ae44-f871-73aaaf4a6022");
-const LLUUID ANIM_AGENT_CRY = LLUUID("92624d3e-1068-f1aa-a5ec-8244585193ed");
-const LLUUID ANIM_AGENT_CUSTOMIZE = LLUUID("038fcec9-5ebd-8a8e-0e2e-6e71a0a1ac53");
-const LLUUID ANIM_AGENT_CUSTOMIZE_DONE = LLUUID("6883a61a-b27b-5914-a61e-dda118a9ee2c");
-const LLUUID ANIM_AGENT_DANCE1 = LLUUID("b68a3d7c-de9e-fc87-eec8-543d787e5b0d");
-const LLUUID ANIM_AGENT_DANCE2 = LLUUID("928cae18-e31d-76fd-9cc9-2f55160ff818");
-const LLUUID ANIM_AGENT_DANCE3 = LLUUID("30047778-10ea-1af7-6881-4db7a3a5a114");
-const LLUUID ANIM_AGENT_DANCE4 = LLUUID("951469f4-c7b2-c818-9dee-ad7eea8c30b7");
-const LLUUID ANIM_AGENT_DANCE5 = LLUUID("4bd69a1d-1114-a0b4-625f-84e0a5237155");
-const LLUUID ANIM_AGENT_DANCE6 = LLUUID("cd28b69b-9c95-bb78-3f94-8d605ff1bb12");
-const LLUUID ANIM_AGENT_DANCE7 = LLUUID("a54d8ee2-28bb-80a9-7f0c-7afbbe24a5d6");
-const LLUUID ANIM_AGENT_DANCE8 = LLUUID("b0dc417c-1f11-af36-2e80-7e7489fa7cdc");
-const LLUUID ANIM_AGENT_DEAD = LLUUID("57abaae6-1d17-7b1b-5f98-6d11a6411276");
-const LLUUID ANIM_AGENT_DRINK = LLUUID("0f86e355-dd31-a61c-fdb0-3a96b9aad05f");
-const LLUUID ANIM_AGENT_EMBARRASSED = LLUUID("514af488-9051-044a-b3fc-d4dbf76377c6");
-const LLUUID ANIM_AGENT_EXPRESS_AFRAID = LLUUID("aa2df84d-cf8f-7218-527b-424a52de766e");
-const LLUUID ANIM_AGENT_EXPRESS_ANGER = LLUUID("1a03b575-9634-b62a-5767-3a679e81f4de");
-const LLUUID ANIM_AGENT_EXPRESS_BORED = LLUUID("214aa6c1-ba6a-4578-f27c-ce7688f61d0d");
-const LLUUID ANIM_AGENT_EXPRESS_CRY = LLUUID("d535471b-85bf-3b4d-a542-93bea4f59d33");
-const LLUUID ANIM_AGENT_EXPRESS_DISDAIN = LLUUID("d4416ff1-09d3-300f-4183-1b68a19b9fc1");
-const LLUUID ANIM_AGENT_EXPRESS_EMBARRASSED = LLUUID("0b8c8211-d78c-33e8-fa28-c51a9594e424");
-const LLUUID ANIM_AGENT_EXPRESS_FROWN = LLUUID("fee3df48-fa3d-1015-1e26-a205810e3001");
-const LLUUID ANIM_AGENT_EXPRESS_KISS = LLUUID("1e8d90cc-a84e-e135-884c-7c82c8b03a14");
-const LLUUID ANIM_AGENT_EXPRESS_LAUGH = LLUUID("62570842-0950-96f8-341c-809e65110823");
-const LLUUID ANIM_AGENT_EXPRESS_OPEN_MOUTH = LLUUID("d63bc1f9-fc81-9625-a0c6-007176d82eb7");
-const LLUUID ANIM_AGENT_EXPRESS_REPULSED = LLUUID("f76cda94-41d4-a229-2872-e0296e58afe1");
-const LLUUID ANIM_AGENT_EXPRESS_SAD = LLUUID("eb6ebfb2-a4b3-a19c-d388-4dd5c03823f7");
-const LLUUID ANIM_AGENT_EXPRESS_SHRUG = LLUUID("a351b1bc-cc94-aac2-7bea-a7e6ebad15ef");
-const LLUUID ANIM_AGENT_EXPRESS_SMILE = LLUUID("b7c7c833-e3d3-c4e3-9fc0-131237446312");
-const LLUUID ANIM_AGENT_EXPRESS_SURPRISE = LLUUID("728646d9-cc79-08b2-32d6-937f0a835c24");
-const LLUUID ANIM_AGENT_EXPRESS_TONGUE_OUT = LLUUID("835965c6-7f2f-bda2-5deb-2478737f91bf");
-const LLUUID ANIM_AGENT_EXPRESS_TOOTHSMILE = LLUUID("b92ec1a5-e7ce-a76b-2b05-bcdb9311417e");
-const LLUUID ANIM_AGENT_EXPRESS_WINK = LLUUID("da020525-4d94-59d6-23d7-81fdebf33148");
-const LLUUID ANIM_AGENT_EXPRESS_WORRY = LLUUID("9c05e5c7-6f07-6ca4-ed5a-b230390c3950");
-const LLUUID ANIM_AGENT_FALLDOWN = LLUUID("666307d9-a860-572d-6fd4-c3ab8865c094");
-const LLUUID ANIM_AGENT_FEMALE_WALK = LLUUID("f5fc7433-043d-e819-8298-f519a119b688");
-const LLUUID ANIM_AGENT_FINGER_WAG = LLUUID("c1bc7f36-3ba0-d844-f93c-93be945d644f");
-const LLUUID ANIM_AGENT_FIST_PUMP = LLUUID("7db00ccd-f380-f3ee-439d-61968ec69c8a");
-const LLUUID ANIM_AGENT_FLY = LLUUID("aec4610c-757f-bc4e-c092-c6e9caf18daf");
-const LLUUID ANIM_AGENT_FLYSLOW = LLUUID("2b5a38b2-5e00-3a97-a495-4c826bc443e6");
-const LLUUID ANIM_AGENT_HELLO = LLUUID("9b29cd61-c45b-5689-ded2-91756b8d76a9");
-const LLUUID ANIM_AGENT_HOLD_BAZOOKA_R = LLUUID("ef62d355-c815-4816-2474-b1acc21094a6");
-const LLUUID ANIM_AGENT_HOLD_BOW_L = LLUUID("8b102617-bcba-037b-86c1-b76219f90c88");
-const LLUUID ANIM_AGENT_HOLD_HANDGUN_R = LLUUID("efdc1727-8b8a-c800-4077-975fc27ee2f2");
-const LLUUID ANIM_AGENT_HOLD_RIFLE_R = LLUUID("3d94bad0-c55b-7dcc-8763-033c59405d33");
-const LLUUID ANIM_AGENT_HOLD_THROW_R = LLUUID("7570c7b5-1f22-56dd-56ef-a9168241bbb6");
-const LLUUID ANIM_AGENT_HOVER = LLUUID("4ae8016b-31b9-03bb-c401-b1ea941db41d");
-const LLUUID ANIM_AGENT_HOVER_DOWN = LLUUID("20f063ea-8306-2562-0b07-5c853b37b31e");
-const LLUUID ANIM_AGENT_HOVER_UP = LLUUID("62c5de58-cb33-5743-3d07-9e4cd4352864");
-const LLUUID ANIM_AGENT_IMPATIENT = LLUUID("5ea3991f-c293-392e-6860-91dfa01278a3");
-const LLUUID ANIM_AGENT_JUMP = LLUUID("2305bd75-1ca9-b03b-1faa-b176b8a8c49e");
-const LLUUID ANIM_AGENT_JUMP_FOR_JOY = LLUUID("709ea28e-1573-c023-8bf8-520c8bc637fa");
-const LLUUID ANIM_AGENT_KISS_MY_BUTT = LLUUID("19999406-3a3a-d58c-a2ac-d72e555dcf51");
-const LLUUID ANIM_AGENT_LAND = LLUUID("7a17b059-12b2-41b1-570a-186368b6aa6f");
-const LLUUID ANIM_AGENT_LAUGH_SHORT = LLUUID("ca5b3f14-3194-7a2b-c894-aa699b718d1f");
-const LLUUID ANIM_AGENT_MEDIUM_LAND = LLUUID("f4f00d6e-b9fe-9292-f4cb-0ae06ea58d57");
-const LLUUID ANIM_AGENT_MOTORCYCLE_SIT = LLUUID("08464f78-3a8e-2944-cba5-0c94aff3af29");
-const LLUUID ANIM_AGENT_MUSCLE_BEACH = LLUUID("315c3a41-a5f3-0ba4-27da-f893f769e69b");
-const LLUUID ANIM_AGENT_NO = LLUUID("5a977ed9-7f72-44e9-4c4c-6e913df8ae74");
-const LLUUID ANIM_AGENT_NO_UNHAPPY = LLUUID("d83fa0e5-97ed-7eb2-e798-7bd006215cb4");
-const LLUUID ANIM_AGENT_NYAH_NYAH = LLUUID("f061723d-0a18-754f-66ee-29a44795a32f");
-const LLUUID ANIM_AGENT_ONETWO_PUNCH = LLUUID("eefc79be-daae-a239-8c04-890f5d23654a");
-const LLUUID ANIM_AGENT_PEACE = LLUUID("b312b10e-65ab-a0a4-8b3c-1326ea8e3ed9");
-const LLUUID ANIM_AGENT_POINT_ME = LLUUID("17c024cc-eef2-f6a0-3527-9869876d7752");
-const LLUUID ANIM_AGENT_POINT_YOU = LLUUID("ec952cca-61ef-aa3b-2789-4d1344f016de");
-const LLUUID ANIM_AGENT_PRE_JUMP = LLUUID("7a4e87fe-de39-6fcb-6223-024b00893244");
-const LLUUID ANIM_AGENT_PUNCH_LEFT = LLUUID("f3300ad9-3462-1d07-2044-0fef80062da0");
-const LLUUID ANIM_AGENT_PUNCH_RIGHT = LLUUID("c8e42d32-7310-6906-c903-cab5d4a34656");
-const LLUUID ANIM_AGENT_REPULSED = LLUUID("36f81a92-f076-5893-dc4b-7c3795e487cf");
-const LLUUID ANIM_AGENT_ROUNDHOUSE_KICK = LLUUID("49aea43b-5ac3-8a44-b595-96100af0beda");
-const LLUUID ANIM_AGENT_RPS_COUNTDOWN = LLUUID("35db4f7e-28c2-6679-cea9-3ee108f7fc7f");
-const LLUUID ANIM_AGENT_RPS_PAPER = LLUUID("0836b67f-7f7b-f37b-c00a-460dc1521f5a");
-const LLUUID ANIM_AGENT_RPS_ROCK = LLUUID("42dd95d5-0bc6-6392-f650-777304946c0f");
-const LLUUID ANIM_AGENT_RPS_SCISSORS = LLUUID("16803a9f-5140-e042-4d7b-d28ba247c325");
-const LLUUID ANIM_AGENT_RUN = LLUUID("05ddbff8-aaa9-92a1-2b74-8fe77a29b445");
-const LLUUID ANIM_AGENT_SAD = LLUUID("0eb702e2-cc5a-9a88-56a5-661a55c0676a");
-const LLUUID ANIM_AGENT_SALUTE = LLUUID("cd7668a6-7011-d7e2-ead8-fc69eff1a104");
-const LLUUID ANIM_AGENT_SHOOT_BOW_L = LLUUID("e04d450d-fdb5-0432-fd68-818aaf5935f8");
-const LLUUID ANIM_AGENT_SHOUT = LLUUID("6bd01860-4ebd-127a-bb3d-d1427e8e0c42");
-const LLUUID ANIM_AGENT_SHRUG = LLUUID("70ea714f-3a97-d742-1b01-590a8fcd1db5");
-const LLUUID ANIM_AGENT_SIT = LLUUID("1a5fe8ac-a804-8a5d-7cbd-56bd83184568");
-const LLUUID ANIM_AGENT_SIT_FEMALE = LLUUID("b1709c8d-ecd3-54a1-4f28-d55ac0840782");
-const LLUUID ANIM_AGENT_SIT_GENERIC = LLUUID("245f3c54-f1c0-bf2e-811f-46d8eeb386e7");
-const LLUUID ANIM_AGENT_SIT_GROUND = LLUUID("1c7600d6-661f-b87b-efe2-d7421eb93c86");
-const LLUUID ANIM_AGENT_SIT_GROUND_CONSTRAINED = LLUUID("1a2bd58e-87ff-0df8-0b4c-53e047b0bb6e");
-const LLUUID ANIM_AGENT_SIT_TO_STAND = LLUUID("a8dee56f-2eae-9e7a-05a2-6fb92b97e21e");
-const LLUUID ANIM_AGENT_SLEEP = LLUUID("f2bed5f9-9d44-39af-b0cd-257b2a17fe40");
-const LLUUID ANIM_AGENT_SMOKE_IDLE = LLUUID("d2f2ee58-8ad1-06c9-d8d3-3827ba31567a");
-const LLUUID ANIM_AGENT_SMOKE_INHALE = LLUUID("6802d553-49da-0778-9f85-1599a2266526");
-const LLUUID ANIM_AGENT_SMOKE_THROW_DOWN = LLUUID("0a9fb970-8b44-9114-d3a9-bf69cfe804d6");
-const LLUUID ANIM_AGENT_SNAPSHOT = LLUUID("eae8905b-271a-99e2-4c0e-31106afd100c");
-const LLUUID ANIM_AGENT_STAND = LLUUID("2408fe9e-df1d-1d7d-f4ff-1384fa7b350f");
-const LLUUID ANIM_AGENT_STANDUP = LLUUID("3da1d753-028a-5446-24f3-9c9b856d9422");
-const LLUUID ANIM_AGENT_STAND_1 = LLUUID("15468e00-3400-bb66-cecc-646d7c14458e");
-const LLUUID ANIM_AGENT_STAND_2 = LLUUID("370f3a20-6ca6-9971-848c-9a01bc42ae3c");
-const LLUUID ANIM_AGENT_STAND_3 = LLUUID("42b46214-4b44-79ae-deb8-0df61424ff4b");
-const LLUUID ANIM_AGENT_STAND_4 = LLUUID("f22fed8b-a5ed-2c93-64d5-bdd8b93c889f");
-const LLUUID ANIM_AGENT_STRETCH = LLUUID("80700431-74ec-a008-14f8-77575e73693f");
-const LLUUID ANIM_AGENT_STRIDE = LLUUID("1cb562b0-ba21-2202-efb3-30f82cdf9595");
-const LLUUID ANIM_AGENT_SURF = LLUUID("41426836-7437-7e89-025d-0aa4d10f1d69");
-const LLUUID ANIM_AGENT_SURPRISE = LLUUID("313b9881-4302-73c0-c7d0-0e7a36b6c224");
-const LLUUID ANIM_AGENT_SWORD_STRIKE = LLUUID("85428680-6bf9-3e64-b489-6f81087c24bd");
-const LLUUID ANIM_AGENT_TALK = LLUUID("5c682a95-6da4-a463-0bf6-0f5b7be129d1");
-const LLUUID ANIM_AGENT_TANTRUM = LLUUID("11000694-3f41-adc2-606b-eee1d66f3724");
-const LLUUID ANIM_AGENT_THROW_R = LLUUID("aa134404-7dac-7aca-2cba-435f9db875ca");
-const LLUUID ANIM_AGENT_TRYON_SHIRT = LLUUID("83ff59fe-2346-f236-9009-4e3608af64c1");
-const LLUUID ANIM_AGENT_TURNLEFT = LLUUID("56e0ba0d-4a9f-7f27-6117-32f2ebbf6135");
-const LLUUID ANIM_AGENT_TURNRIGHT = LLUUID("2d6daa51-3192-6794-8e2e-a15f8338ec30");
-const LLUUID ANIM_AGENT_TYPE = LLUUID("c541c47f-e0c0-058b-ad1a-d6ae3a4584d9");
-const LLUUID ANIM_AGENT_WALK = LLUUID("6ed24bd8-91aa-4b12-ccc7-c97c857ab4e0");
-const LLUUID ANIM_AGENT_WHISPER = LLUUID("7693f268-06c7-ea71-fa21-2b30d6533f8f");
-const LLUUID ANIM_AGENT_WHISTLE = LLUUID("b1ed7982-c68e-a982-7561-52a88a5298c0");
-const LLUUID ANIM_AGENT_WINK = LLUUID("869ecdad-a44b-671e-3266-56aef2e3ac2e");
-const LLUUID ANIM_AGENT_WINK_HOLLYWOOD = LLUUID("c0c4030f-c02b-49de-24ba-2331f43fe41c");
-const LLUUID ANIM_AGENT_WORRY = LLUUID("9f496bd2-589a-709f-16cc-69bf7df1d36c");
-const LLUUID ANIM_AGENT_YES = LLUUID("15dd911d-be82-2856-26db-27659b142875");
-const LLUUID ANIM_AGENT_YES_HAPPY = LLUUID("b8c8b2a3-9008-1771-3bfc-90924955ab2d");
-const LLUUID ANIM_AGENT_YOGA_FLOAT = LLUUID("42ecd00b-9947-a97c-400a-bbc9174c7aeb");
+extern const LLUUID ANIM_AGENT_AFRAID;
+extern const LLUUID ANIM_AGENT_AIM_BAZOOKA_R;
+extern const LLUUID ANIM_AGENT_AIM_BOW_L;
+extern const LLUUID ANIM_AGENT_AIM_HANDGUN_R;
+extern const LLUUID ANIM_AGENT_AIM_RIFLE_R;
+extern const LLUUID ANIM_AGENT_ANGRY;
+extern const LLUUID ANIM_AGENT_AWAY;
+extern const LLUUID ANIM_AGENT_BACKFLIP;
+extern const LLUUID ANIM_AGENT_BELLY_LAUGH;
+extern const LLUUID ANIM_AGENT_BLOW_KISS;
+extern const LLUUID ANIM_AGENT_BORED;
+extern const LLUUID ANIM_AGENT_BOW;
+extern const LLUUID ANIM_AGENT_BRUSH;
+extern const LLUUID ANIM_AGENT_BUSY;
+extern const LLUUID ANIM_AGENT_CLAP;
+extern const LLUUID ANIM_AGENT_COURTBOW;
+extern const LLUUID ANIM_AGENT_CROUCH;
+extern const LLUUID ANIM_AGENT_CROUCHWALK;
+extern const LLUUID ANIM_AGENT_CRY;
+extern const LLUUID ANIM_AGENT_CUSTOMIZE;
+extern const LLUUID ANIM_AGENT_CUSTOMIZE_DONE;
+extern const LLUUID ANIM_AGENT_DANCE1;
+extern const LLUUID ANIM_AGENT_DANCE2;
+extern const LLUUID ANIM_AGENT_DANCE3;
+extern const LLUUID ANIM_AGENT_DANCE4;
+extern const LLUUID ANIM_AGENT_DANCE5;
+extern const LLUUID ANIM_AGENT_DANCE6;
+extern const LLUUID ANIM_AGENT_DANCE7;
+extern const LLUUID ANIM_AGENT_DANCE8;
+extern const LLUUID ANIM_AGENT_DEAD;
+extern const LLUUID ANIM_AGENT_DRINK;
+extern const LLUUID ANIM_AGENT_EMBARRASSED;
+extern const LLUUID ANIM_AGENT_EXPRESS_AFRAID;
+extern const LLUUID ANIM_AGENT_EXPRESS_ANGER;
+extern const LLUUID ANIM_AGENT_EXPRESS_BORED;
+extern const LLUUID ANIM_AGENT_EXPRESS_CRY;
+extern const LLUUID ANIM_AGENT_EXPRESS_DISDAIN;
+extern const LLUUID ANIM_AGENT_EXPRESS_EMBARRASSED;
+extern const LLUUID ANIM_AGENT_EXPRESS_FROWN;
+extern const LLUUID ANIM_AGENT_EXPRESS_KISS;
+extern const LLUUID ANIM_AGENT_EXPRESS_LAUGH;
+extern const LLUUID ANIM_AGENT_EXPRESS_OPEN_MOUTH;
+extern const LLUUID ANIM_AGENT_EXPRESS_REPULSED;
+extern const LLUUID ANIM_AGENT_EXPRESS_SAD;
+extern const LLUUID ANIM_AGENT_EXPRESS_SHRUG;
+extern const LLUUID ANIM_AGENT_EXPRESS_SMILE;
+extern const LLUUID ANIM_AGENT_EXPRESS_SURPRISE;
+extern const LLUUID ANIM_AGENT_EXPRESS_TONGUE_OUT;
+extern const LLUUID ANIM_AGENT_EXPRESS_TOOTHSMILE;
+extern const LLUUID ANIM_AGENT_EXPRESS_WINK;
+extern const LLUUID ANIM_AGENT_EXPRESS_WORRY;
+extern const LLUUID ANIM_AGENT_FALLDOWN;
+extern const LLUUID ANIM_AGENT_FEMALE_RUN_NEW;
+extern const LLUUID ANIM_AGENT_FEMALE_WALK;
+extern const LLUUID ANIM_AGENT_FEMALE_WALK_NEW;
+extern const LLUUID ANIM_AGENT_FINGER_WAG;
+extern const LLUUID ANIM_AGENT_FIST_PUMP;
+extern const LLUUID ANIM_AGENT_FLY;
+extern const LLUUID ANIM_AGENT_FLYSLOW;
+extern const LLUUID ANIM_AGENT_HELLO;
+extern const LLUUID ANIM_AGENT_HOLD_BAZOOKA_R;
+extern const LLUUID ANIM_AGENT_HOLD_BOW_L;
+extern const LLUUID ANIM_AGENT_HOLD_HANDGUN_R;
+extern const LLUUID ANIM_AGENT_HOLD_RIFLE_R;
+extern const LLUUID ANIM_AGENT_HOLD_THROW_R;
+extern const LLUUID ANIM_AGENT_HOVER;
+extern const LLUUID ANIM_AGENT_HOVER_DOWN;
+extern const LLUUID ANIM_AGENT_HOVER_UP;
+extern const LLUUID ANIM_AGENT_IMPATIENT;
+extern const LLUUID ANIM_AGENT_JUMP;
+extern const LLUUID ANIM_AGENT_JUMP_FOR_JOY;
+extern const LLUUID ANIM_AGENT_KISS_MY_BUTT;
+extern const LLUUID ANIM_AGENT_LAND;
+extern const LLUUID ANIM_AGENT_LAUGH_SHORT;
+extern const LLUUID ANIM_AGENT_MEDIUM_LAND;
+extern const LLUUID ANIM_AGENT_MOTORCYCLE_SIT;
+extern const LLUUID ANIM_AGENT_MUSCLE_BEACH;
+extern const LLUUID ANIM_AGENT_NO;
+extern const LLUUID ANIM_AGENT_NO_UNHAPPY;
+extern const LLUUID ANIM_AGENT_NYAH_NYAH;
+extern const LLUUID ANIM_AGENT_ONETWO_PUNCH;
+extern const LLUUID ANIM_AGENT_PEACE;
+extern const LLUUID ANIM_AGENT_POINT_ME;
+extern const LLUUID ANIM_AGENT_POINT_YOU;
+extern const LLUUID ANIM_AGENT_PRE_JUMP;
+extern const LLUUID ANIM_AGENT_PUNCH_LEFT;
+extern const LLUUID ANIM_AGENT_PUNCH_RIGHT;
+extern const LLUUID ANIM_AGENT_REPULSED;
+extern const LLUUID ANIM_AGENT_ROUNDHOUSE_KICK;
+extern const LLUUID ANIM_AGENT_RPS_COUNTDOWN;
+extern const LLUUID ANIM_AGENT_RPS_PAPER;
+extern const LLUUID ANIM_AGENT_RPS_ROCK;
+extern const LLUUID ANIM_AGENT_RPS_SCISSORS;
+extern const LLUUID ANIM_AGENT_RUN;
+extern const LLUUID ANIM_AGENT_RUN_NEW;
+extern const LLUUID ANIM_AGENT_SAD;
+extern const LLUUID ANIM_AGENT_SALUTE;
+extern const LLUUID ANIM_AGENT_SHOOT_BOW_L;
+extern const LLUUID ANIM_AGENT_SHOUT;
+extern const LLUUID ANIM_AGENT_SHRUG;
+extern const LLUUID ANIM_AGENT_SIT;
+extern const LLUUID ANIM_AGENT_SIT_FEMALE;
+extern const LLUUID ANIM_AGENT_SIT_GENERIC;
+extern const LLUUID ANIM_AGENT_SIT_GROUND;
+extern const LLUUID ANIM_AGENT_SIT_GROUND_CONSTRAINED;
+extern const LLUUID ANIM_AGENT_SIT_TO_STAND;
+extern const LLUUID ANIM_AGENT_SLEEP;
+extern const LLUUID ANIM_AGENT_SMOKE_IDLE;
+extern const LLUUID ANIM_AGENT_SMOKE_INHALE;
+extern const LLUUID ANIM_AGENT_SMOKE_THROW_DOWN;
+extern const LLUUID ANIM_AGENT_SNAPSHOT;
+extern const LLUUID ANIM_AGENT_STAND;
+extern const LLUUID ANIM_AGENT_STANDUP;
+extern const LLUUID ANIM_AGENT_STAND_1;
+extern const LLUUID ANIM_AGENT_STAND_2;
+extern const LLUUID ANIM_AGENT_STAND_3;
+extern const LLUUID ANIM_AGENT_STAND_4;
+extern const LLUUID ANIM_AGENT_STRETCH;
+extern const LLUUID ANIM_AGENT_STRIDE;
+extern const LLUUID ANIM_AGENT_SURF;
+extern const LLUUID ANIM_AGENT_SURPRISE;
+extern const LLUUID ANIM_AGENT_SWORD_STRIKE;
+extern const LLUUID ANIM_AGENT_TALK;
+extern const LLUUID ANIM_AGENT_TANTRUM;
+extern const LLUUID ANIM_AGENT_THROW_R;
+extern const LLUUID ANIM_AGENT_TRYON_SHIRT;
+extern const LLUUID ANIM_AGENT_TURNLEFT;
+extern const LLUUID ANIM_AGENT_TURNRIGHT;
+extern const LLUUID ANIM_AGENT_TYPE;
+extern const LLUUID ANIM_AGENT_WALK;
+extern const LLUUID ANIM_AGENT_WALK_NEW;
+extern const LLUUID ANIM_AGENT_WHISPER;
+extern const LLUUID ANIM_AGENT_WHISTLE;
+extern const LLUUID ANIM_AGENT_WINK;
+extern const LLUUID ANIM_AGENT_WINK_HOLLYWOOD;
+extern const LLUUID ANIM_AGENT_WORRY;
+extern const LLUUID ANIM_AGENT_YES;
+extern const LLUUID ANIM_AGENT_YES_HAPPY;
+extern const LLUUID ANIM_AGENT_YOGA_FLOAT;
extern LLUUID AGENT_WALK_ANIMS[];
extern S32 NUM_AGENT_WALK_ANIMS;
@@ -224,6 +227,16 @@ public:
// Retun NULL if the name is invalid.
//-----------------------------------------------------------------------------
LLUUID stringToAnimState( const std::string& name, BOOL allow_ids = TRUE );
+
+ //-----------------------------------------------------------------------------
+ // Associate an anim state with a name
+ //-----------------------------------------------------------------------------
+ void animStateSetString( const LLUUID& state, const std::string& name);
+
+ //-----------------------------------------------------------------------------
+ // Find the name for a given animation, or UUID string if none defined.
+ //-----------------------------------------------------------------------------
+ std::string animationName( const LLUUID& id ) const;
};
struct LLAnimStateEntry
@@ -249,7 +262,6 @@ extern const LLAnimStateEntry gUserAnimStates[];
extern const S32 gUserAnimStatesCount;
extern LLAnimationLibrary gAnimLibrary;
-
#endif // LL_LLANIMATIONSTATES_H
diff --git a/indra/llcharacter/llcharacter.cpp b/indra/llcharacter/llcharacter.cpp
index 528a7bb4a5..27c0c0b640 100644
--- a/indra/llcharacter/llcharacter.cpp
+++ b/indra/llcharacter/llcharacter.cpp
@@ -181,16 +181,18 @@ void LLCharacter::requestStopMotion( LLMotion* motion)
// updateMotions()
//-----------------------------------------------------------------------------
static LLFastTimer::DeclareTimer FTM_UPDATE_ANIMATION("Update Animation");
+static LLFastTimer::DeclareTimer FTM_UPDATE_HIDDEN_ANIMATION("Update Hidden Anim");
void LLCharacter::updateMotions(e_update_t update_type)
{
- LLFastTimer t(FTM_UPDATE_ANIMATION);
if (update_type == HIDDEN_UPDATE)
{
+ LLFastTimer t(FTM_UPDATE_HIDDEN_ANIMATION);
mMotionController.updateMotionsMinimal();
}
else
{
+ LLFastTimer t(FTM_UPDATE_ANIMATION);
// unpause if the number of outstanding pause requests has dropped to the initial one
if (mMotionController.isPaused() && mPauseRequest->getNumRefs() == 1)
{
@@ -387,27 +389,6 @@ void LLCharacter::clearVisualParamWeights()
}
//-----------------------------------------------------------------------------
-// BOOL visualParamWeightsAreDefault()
-//-----------------------------------------------------------------------------
-BOOL LLCharacter::visualParamWeightsAreDefault()
-{
- for (LLVisualParam *param = getFirstVisualParam();
- param;
- param = getNextVisualParam())
- {
- if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE)
- {
- if (param->getWeight() != param->getDefaultWeight())
- return false;
- }
- }
-
- return true;
-}
-
-
-
-//-----------------------------------------------------------------------------
// getVisualParam()
//-----------------------------------------------------------------------------
LLVisualParam* LLCharacter::getVisualParam(const char *param_name)
diff --git a/indra/llcharacter/llcharacter.h b/indra/llcharacter/llcharacter.h
index 27e2a51c62..cac73c01b9 100644
--- a/indra/llcharacter/llcharacter.h
+++ b/indra/llcharacter/llcharacter.h
@@ -212,12 +212,9 @@ public:
F32 getVisualParamWeight(const char* param_name);
F32 getVisualParamWeight(S32 index);
- // set all morph weights to 0
+ // set all morph weights to defaults
void clearVisualParamWeights();
- // see if all the weights are default
- BOOL visualParamWeightsAreDefault();
-
// visual parameter accessors
LLVisualParam* getFirstVisualParam()
{
@@ -231,6 +228,21 @@ public:
return (mCurIterator++)->second;
}
+ S32 getVisualParamCountInGroup(const EVisualParamGroup group) const
+ {
+ S32 rtn = 0;
+ for (visual_param_index_map_t::const_iterator iter = mVisualParamIndexMap.begin();
+ iter != mVisualParamIndexMap.end();
+ /**/ )
+ {
+ if ((iter++)->second->getGroup() == group)
+ {
+ ++rtn;
+ }
+ }
+ return rtn;
+ }
+
LLVisualParam* getVisualParam(S32 id) const
{
visual_param_index_map_t::const_iterator iter = mVisualParamIndexMap.find(id);
diff --git a/indra/llcharacter/lleditingmotion.cpp b/indra/llcharacter/lleditingmotion.cpp
index 381d19e614..57554bdc35 100644
--- a/indra/llcharacter/lleditingmotion.cpp
+++ b/indra/llcharacter/lleditingmotion.cpp
@@ -221,7 +221,7 @@ BOOL LLEditingMotion::onUpdate(F32 time, U8* joint_mask)
if (!target.isFinite())
{
llerrs << "Non finite target in editing motion with target distance of " << target_dist <<
- " and focus point " << focus_pt << " and pointAtPt: " << *pointAtPt << llendl;
+ " and focus point " << focus_pt << llendl;
}
mTarget.setPosition( target + mParentJoint.getPosition());
diff --git a/indra/llcharacter/llkeyframemotion.cpp b/indra/llcharacter/llkeyframemotion.cpp
index 5a2e3f73f9..f4dc3b927b 100644
--- a/indra/llcharacter/llkeyframemotion.cpp
+++ b/indra/llcharacter/llkeyframemotion.cpp
@@ -658,7 +658,12 @@ BOOL LLKeyframeMotion::onActivate()
// If the keyframe anim has an associated emote, trigger it.
if( mJointMotionList->mEmoteName.length() > 0 )
{
- mCharacter->startMotion( gAnimLibrary.stringToAnimState(mJointMotionList->mEmoteName) );
+ LLUUID emote_anim_id = gAnimLibrary.stringToAnimState(mJointMotionList->mEmoteName);
+ // don't start emote if already active to avoid recursion
+ if (!mCharacter->isMotionActive(emote_anim_id))
+ {
+ mCharacter->startMotion( emote_anim_id );
+ }
}
mLastLoopedTime = 0.f;
diff --git a/indra/llcharacter/llkeyframewalkmotion.cpp b/indra/llcharacter/llkeyframewalkmotion.cpp
index 461309bee9..0587e5642c 100644
--- a/indra/llcharacter/llkeyframewalkmotion.cpp
+++ b/indra/llcharacter/llkeyframewalkmotion.cpp
@@ -44,30 +44,31 @@
//-----------------------------------------------------------------------------
// Macros
//-----------------------------------------------------------------------------
-const F32 MAX_WALK_PLAYBACK_SPEED = 8.f; // max m/s for which we adjust walk cycle speed
-
-const F32 MIN_WALK_SPEED = 0.1f; // minimum speed at which we use velocity for down foot detection
-const F32 MAX_TIME_DELTA = 2.f; //max two seconds a frame for calculating interpolation
-const F32 SPEED_ADJUST_MAX = 2.5f; // maximum adjustment of walk animation playback speed
-const F32 SPEED_ADJUST_MAX_SEC = 3.f; // maximum adjustment to walk animation playback speed for a second
-const F32 DRIFT_COMP_MAX_TOTAL = 0.07f;//0.55f; // maximum drift compensation overall, in any direction
-const F32 DRIFT_COMP_MAX_SPEED = 4.f; // speed at which drift compensation total maxes out
+const F32 MAX_WALK_PLAYBACK_SPEED = 8.f; // max m/s for which we adjust walk cycle speed
+
+const F32 MIN_WALK_SPEED = 0.1f; // minimum speed at which we use velocity for down foot detection
+const F32 TIME_EPSILON = 0.001f; // minumum frame time
+const F32 MAX_TIME_DELTA = 2.f; // max two seconds a frame for calculating interpolation
+F32 SPEED_ADJUST_MAX_SEC = 2.f; // maximum adjustment to walk animation playback speed for a second
+F32 ANIM_SPEED_MAX = 1.5f; // absolute upper limit on animation speed
+const F32 DRIFT_COMP_MAX_TOTAL = 0.1f; // maximum drift compensation overall, in any direction
+const F32 DRIFT_COMP_MAX_SPEED = 4.f; // speed at which drift compensation total maxes out
const F32 MAX_ROLL = 0.6f;
+const F32 PELVIS_COMPENSATION_WIEGHT = 0.7f; // proportion of foot drift that is compensated by moving the avatar directly
+const F32 SPEED_ADJUST_TIME_CONSTANT = 0.1f; // time constant for speed adjustment interpolation
//-----------------------------------------------------------------------------
// LLKeyframeWalkMotion()
// Class Constructor
//-----------------------------------------------------------------------------
LLKeyframeWalkMotion::LLKeyframeWalkMotion(const LLUUID &id)
- : LLKeyframeMotion(id),
-
+: LLKeyframeMotion(id),
mCharacter(NULL),
mCyclePhase(0.0f),
mRealTimeLast(0.0f),
mAdjTimeLast(0.0f),
mDownFoot(0)
-{
-}
+{}
//-----------------------------------------------------------------------------
@@ -75,8 +76,7 @@ LLKeyframeWalkMotion::LLKeyframeWalkMotion(const LLUUID &id)
// Class Destructor
//-----------------------------------------------------------------------------
LLKeyframeWalkMotion::~LLKeyframeWalkMotion()
-{
-}
+{}
//-----------------------------------------------------------------------------
@@ -147,15 +147,12 @@ BOOL LLKeyframeWalkMotion::onUpdate(F32 time, U8* joint_mask)
LLWalkAdjustMotion::LLWalkAdjustMotion(const LLUUID &id) :
LLMotion(id),
mLastTime(0.f),
- mAvgCorrection(0.f),
- mSpeedAdjust(0.f),
mAnimSpeed(0.f),
- mAvgSpeed(0.f),
+ mAdjustedSpeed(0.f),
mRelativeDir(0.f),
mAnkleOffset(0.f)
{
mName = "walk_adjust";
-
mPelvisState = new LLJointState;
}
@@ -187,15 +184,16 @@ LLMotion::LLMotionInitStatus LLWalkAdjustMotion::onInitialize(LLCharacter *chara
//-----------------------------------------------------------------------------
BOOL LLWalkAdjustMotion::onActivate()
{
- mAvgCorrection = 0.f;
- mSpeedAdjust = 0.f;
mAnimSpeed = 0.f;
- mAvgSpeed = 0.f;
+ mAdjustedSpeed = 0.f;
mRelativeDir = 1.f;
mPelvisState->setPosition(LLVector3::zero);
// store ankle positions for next frame
- mLastLeftAnklePos = mCharacter->getPosGlobalFromAgent(mLeftAnkleJoint->getWorldPosition());
- mLastRightAnklePos = mCharacter->getPosGlobalFromAgent(mRightAnkleJoint->getWorldPosition());
+ mLastLeftFootGlobalPos = mCharacter->getPosGlobalFromAgent(mLeftAnkleJoint->getWorldPosition());
+ mLastLeftFootGlobalPos.mdV[VZ] = 0.0;
+
+ mLastRightFootGlobalPos = mCharacter->getPosGlobalFromAgent(mRightAnkleJoint->getWorldPosition());
+ mLastRightFootGlobalPos.mdV[VZ] = 0.0;
F32 leftAnkleOffset = (mLeftAnkleJoint->getWorldPosition() - mCharacter->getCharacterPosition()).magVec();
F32 rightAnkleOffset = (mRightAnkleJoint->getWorldPosition() - mCharacter->getCharacterPosition()).magVec();
@@ -209,143 +207,120 @@ BOOL LLWalkAdjustMotion::onActivate()
//-----------------------------------------------------------------------------
BOOL LLWalkAdjustMotion::onUpdate(F32 time, U8* joint_mask)
{
- LLVector3 footCorrection;
- LLVector3 vel = mCharacter->getCharacterVelocity() * mCharacter->getTimeDilation();
- F32 deltaTime = llclamp(time - mLastTime, 0.f, MAX_TIME_DELTA);
+ // delta_time is guaranteed to be non zero
+ F32 delta_time = llclamp(time - mLastTime, TIME_EPSILON, MAX_TIME_DELTA);
mLastTime = time;
- LLQuaternion inv_rotation = ~mPelvisJoint->getWorldRotation();
+ // find the avatar motion vector in the XY plane
+ LLVector3 avatar_velocity = mCharacter->getCharacterVelocity() * mCharacter->getTimeDilation();
+ avatar_velocity.mV[VZ] = 0.f;
- // get speed and normalize velocity vector
- LLVector3 ang_vel = mCharacter->getCharacterAngularVelocity() * mCharacter->getTimeDilation();
- F32 speed = llmin(vel.normVec(), MAX_WALK_PLAYBACK_SPEED);
- mAvgSpeed = lerp(mAvgSpeed, speed, LLCriticalDamp::getInterpolant(0.2f));
+ F32 speed = llclamp(avatar_velocity.magVec(), 0.f, MAX_WALK_PLAYBACK_SPEED);
- // calculate facing vector in pelvis-local space
- // (either straight forward or back, depending on velocity)
- LLVector3 localVel = vel * inv_rotation;
- if (localVel.mV[VX] > 0.f)
- {
- mRelativeDir = 1.f;
- }
- else if (localVel.mV[VX] < 0.f)
- {
- mRelativeDir = -1.f;
- }
+ // grab avatar->world transforms
+ LLQuaternion avatar_to_world_rot = mCharacter->getRootJoint()->getWorldRotation();
- // calculate world-space foot drift
- LLVector3 leftFootDelta;
- LLVector3 leftFootWorldPosition = mLeftAnkleJoint->getWorldPosition();
- LLVector3d leftFootGlobalPosition = mCharacter->getPosGlobalFromAgent(leftFootWorldPosition);
- leftFootDelta.setVec(mLastLeftAnklePos - leftFootGlobalPosition);
- mLastLeftAnklePos = leftFootGlobalPosition;
+ LLQuaternion world_to_avatar_rot(avatar_to_world_rot);
+ world_to_avatar_rot.conjugate();
- LLVector3 rightFootDelta;
- LLVector3 rightFootWorldPosition = mRightAnkleJoint->getWorldPosition();
- LLVector3d rightFootGlobalPosition = mCharacter->getPosGlobalFromAgent(rightFootWorldPosition);
- rightFootDelta.setVec(mLastRightAnklePos - rightFootGlobalPosition);
- mLastRightAnklePos = rightFootGlobalPosition;
+ LLVector3 foot_slip_vector;
// find foot drift along velocity vector
- if (mAvgSpeed > 0.1)
- {
- // walking/running
- F32 leftFootDriftAmt = leftFootDelta * vel;
- F32 rightFootDriftAmt = rightFootDelta * vel;
-
- if (rightFootDriftAmt > leftFootDriftAmt)
- {
- footCorrection = rightFootDelta;
- } else
- {
- footCorrection = leftFootDelta;
- }
- }
- else
- {
- mAvgSpeed = ang_vel.magVec() * mAnkleOffset;
- mRelativeDir = 1.f;
-
- // standing/turning
- // find the lower foot
- if (leftFootWorldPosition.mV[VZ] < rightFootWorldPosition.mV[VZ])
- {
- // pivot on left foot
- footCorrection = leftFootDelta;
- }
+ if (speed > MIN_WALK_SPEED)
+ { // walking/running
+
+ // calculate world-space foot drift
+ // use global coordinates to seamlessly handle region crossings
+ LLVector3d leftFootGlobalPosition = mCharacter->getPosGlobalFromAgent(mLeftAnkleJoint->getWorldPosition());
+ leftFootGlobalPosition.mdV[VZ] = 0.0;
+ LLVector3 leftFootDelta(leftFootGlobalPosition - mLastLeftFootGlobalPos);
+ mLastLeftFootGlobalPos = leftFootGlobalPosition;
+
+ LLVector3d rightFootGlobalPosition = mCharacter->getPosGlobalFromAgent(mRightAnkleJoint->getWorldPosition());
+ rightFootGlobalPosition.mdV[VZ] = 0.0;
+ LLVector3 rightFootDelta(rightFootGlobalPosition - mLastRightFootGlobalPos);
+ mLastRightFootGlobalPos = rightFootGlobalPosition;
+
+ // get foot drift along avatar direction of motion
+ F32 left_foot_slip_amt = leftFootDelta * avatar_velocity;
+ F32 right_foot_slip_amt = rightFootDelta * avatar_velocity;
+
+ // if right foot is pushing back faster than left foot...
+ if (right_foot_slip_amt < left_foot_slip_amt)
+ { //...use it to calculate optimal animation speed
+ foot_slip_vector = rightFootDelta;
+ }
else
- {
- // pivot on right foot
- footCorrection = rightFootDelta;
+ { // otherwise use the left foot
+ foot_slip_vector = leftFootDelta;
}
- }
- // rotate into avatar coordinates
- footCorrection = footCorrection * inv_rotation;
+ // calculate ideal pelvis offset so that foot is glued to ground and damp towards it
+ // this will soak up transient slippage
+ //
+ // FIXME: this interacts poorly with speed adjustment
+ // mPelvisOffset compensates for foot drift by moving the avatar pelvis in the opposite
+ // direction of the drift, up to a certain limited distance
+ // but this will cause the animation playback rate calculation below to
+ // kick in too slowly and sometimes start playing the animation in reverse.
- // calculate ideal pelvis offset so that foot is glued to ground and damp towards it
- // the amount of foot slippage this frame + the offset applied last frame
- mPelvisOffset = mPelvisState->getPosition() + lerp(LLVector3::zero, footCorrection, LLCriticalDamp::getInterpolant(0.2f));
+ //mPelvisOffset -= PELVIS_COMPENSATION_WIEGHT * (foot_slip_vector * world_to_avatar_rot);//lerp(LLVector3::zero, -1.f * (foot_slip_vector * world_to_avatar_rot), LLCriticalDamp::getInterpolant(0.1f));
- // pelvis drift (along walk direction)
- mAvgCorrection = lerp(mAvgCorrection, footCorrection.mV[VX] * mRelativeDir, LLCriticalDamp::getInterpolant(0.1f));
+ ////F32 drift_comp_max = DRIFT_COMP_MAX_TOTAL * (llclamp(speed, 0.f, DRIFT_COMP_MAX_SPEED) / DRIFT_COMP_MAX_SPEED);
+ //F32 drift_comp_max = DRIFT_COMP_MAX_TOTAL;
- // calculate average velocity of foot slippage
- F32 footSlipVelocity = (deltaTime != 0.f) ? (-mAvgCorrection / deltaTime) : 0.f;
+ //// clamp pelvis offset to a 90 degree arc behind the nominal position
+ //// NB: this is an ADDITIVE amount that is accumulated every frame, so clamping it alone won't do the trick
+ //// must clamp with absolute position of pelvis in mind
+ //LLVector3 currentPelvisPos = mPelvisState->getJoint()->getPosition();
+ //mPelvisOffset.mV[VX] = llclamp( mPelvisOffset.mV[VX], -drift_comp_max, drift_comp_max );
+ //mPelvisOffset.mV[VY] = llclamp( mPelvisOffset.mV[VY], -drift_comp_max, drift_comp_max );
+ //mPelvisOffset.mV[VZ] = 0.f;
+ //
+ //mLastRightFootGlobalPos += LLVector3d(mPelvisOffset * avatar_to_world_rot);
+ //mLastLeftFootGlobalPos += LLVector3d(mPelvisOffset * avatar_to_world_rot);
- F32 newSpeedAdjust = 0.f;
-
- // modulate speed by dot products of facing and velocity
- // so that if we are moving sideways, we slow down the animation
- // and if we're moving backward, we walk backward
+ //foot_slip_vector -= mPelvisOffset;
- F32 directional_factor = localVel.mV[VX] * mRelativeDir;
- if (speed > 0.1f)
- {
- // calculate ratio of desired foot velocity to detected foot velocity
- newSpeedAdjust = llclamp(footSlipVelocity - mAvgSpeed * (1.f - directional_factor),
- -SPEED_ADJUST_MAX, SPEED_ADJUST_MAX);
- newSpeedAdjust = lerp(mSpeedAdjust, newSpeedAdjust, LLCriticalDamp::getInterpolant(0.2f));
+ LLVector3 avatar_movement_dir = avatar_velocity;
+ avatar_movement_dir.normalize();
+
+ // planted foot speed is avatar velocity - foot slip amount along avatar movement direction
+ F32 foot_speed = speed - ((foot_slip_vector * avatar_movement_dir) / delta_time);
+
+ // multiply animation playback rate so that foot speed matches avatar speed
+ F32 desired_speed_multiplier = llclamp(speed / foot_speed, 0.f, ANIM_SPEED_MAX);
- F32 speedDelta = newSpeedAdjust - mSpeedAdjust;
- speedDelta = llclamp(speedDelta, -SPEED_ADJUST_MAX_SEC * deltaTime, SPEED_ADJUST_MAX_SEC * deltaTime);
+ // blend towards new speed adjustment value
+ F32 new_speed_adjust = lerp(mAdjustedSpeed, desired_speed_multiplier, LLCriticalDamp::getInterpolant(SPEED_ADJUST_TIME_CONSTANT));
- mSpeedAdjust = mSpeedAdjust + speedDelta;
+ // limit that rate at which the speed adjustment changes
+ F32 speedDelta = llclamp(new_speed_adjust - mAdjustedSpeed, -SPEED_ADJUST_MAX_SEC * delta_time, SPEED_ADJUST_MAX_SEC * delta_time);
+ mAdjustedSpeed += speedDelta;
+
+ // modulate speed by dot products of facing and velocity
+ // so that if we are moving sideways, we slow down the animation
+ // and if we're moving backward, we walk backward
+ // do this at the end to be more responsive to direction changes instead of in the above speed calculations
+ F32 directional_factor = (avatar_movement_dir * world_to_avatar_rot).mV[VX];
+
+ mAnimSpeed = mAdjustedSpeed * directional_factor;
}
else
- {
- mSpeedAdjust = lerp(mSpeedAdjust, 0.f, LLCriticalDamp::getInterpolant(0.2f));
+ { // standing/turning
+
+ // damp out speed adjustment to 0
+ mAnimSpeed = lerp(mAnimSpeed, 1.f, LLCriticalDamp::getInterpolant(0.2f));
+ //mPelvisOffset = lerp(mPelvisOffset, LLVector3::zero, LLCriticalDamp::getInterpolant(0.2f));
}
- mAnimSpeed = (mAvgSpeed + mSpeedAdjust) * mRelativeDir;
-// char debug_text[64];
-// sprintf(debug_text, "Foot slip vel: %.2f", footSlipVelocity);
-// mCharacter->addDebugText(debug_text);
-// sprintf(debug_text, "Speed: %.2f", mAvgSpeed);
-// mCharacter->addDebugText(debug_text);
-// sprintf(debug_text, "Speed Adjust: %.2f", mSpeedAdjust);
-// mCharacter->addDebugText(debug_text);
-// sprintf(debug_text, "Animation Playback Speed: %.2f", mAnimSpeed);
-// mCharacter->addDebugText(debug_text);
- mCharacter->setAnimationData("Walk Speed", &mAnimSpeed);
-
- // clamp pelvis offset to a 90 degree arc behind the nominal position
- F32 drift_comp_max = llclamp(speed, 0.f, DRIFT_COMP_MAX_SPEED) / DRIFT_COMP_MAX_SPEED;
- drift_comp_max *= DRIFT_COMP_MAX_TOTAL;
-
- LLVector3 currentPelvisPos = mPelvisState->getJoint()->getPosition();
-
- // NB: this is an ADDITIVE amount that is accumulated every frame, so clamping it alone won't do the trick
- // must clamp with absolute position of pelvis in mind
- mPelvisOffset.mV[VX] = llclamp( mPelvisOffset.mV[VX], -drift_comp_max - currentPelvisPos.mV[VX], drift_comp_max - currentPelvisPos.mV[VX] );
- mPelvisOffset.mV[VY] = llclamp( mPelvisOffset.mV[VY], -drift_comp_max - currentPelvisPos.mV[VY], drift_comp_max - currentPelvisPos.mV[VY]);
- mPelvisOffset.mV[VZ] = 0.f;
+ // broadcast walk speed change
+ mCharacter->setAnimationData("Walk Speed", &mAnimSpeed);
// set position
+ // need to update *some* joint to keep this animation active
mPelvisState->setPosition(mPelvisOffset);
- mCharacter->setAnimationData("Pelvis Offset", &mPelvisOffset);
-
return TRUE;
}
@@ -415,14 +390,8 @@ BOOL LLFlyAdjustMotion::onUpdate(F32 time, U8* joint_mask)
// roll is critically damped interpolation between current roll and angular velocity-derived target roll
mRoll = lerp(mRoll, target_roll, LLCriticalDamp::getInterpolant(0.1f));
-// llinfos << mRoll << llendl;
-
LLQuaternion roll(mRoll, LLVector3(0.f, 0.f, 1.f));
mPelvisState->setRotation(roll);
-// F32 lerp_amt = LLCriticalDamp::getInterpolant(0.2f);
-//
-// LLVector3 pelvis_correction = mPelvisState->getPosition() - lerp(LLVector3::zero, mPelvisState->getJoint()->getPosition() + mPelvisState->getPosition(), lerp_amt);
-// mPelvisState->setPosition(pelvis_correction);
return TRUE;
}
diff --git a/indra/llcharacter/llkeyframewalkmotion.h b/indra/llcharacter/llkeyframewalkmotion.h
index 90dd4dbcac..b507e9423a 100644
--- a/indra/llcharacter/llkeyframewalkmotion.h
+++ b/indra/llcharacter/llkeyframewalkmotion.h
@@ -126,13 +126,11 @@ public:
LLJoint* mRightAnkleJoint;
LLPointer<LLJointState> mPelvisState;
LLJoint* mPelvisJoint;
- LLVector3d mLastLeftAnklePos;
- LLVector3d mLastRightAnklePos;
+ LLVector3d mLastLeftFootGlobalPos;
+ LLVector3d mLastRightFootGlobalPos;
F32 mLastTime;
- F32 mAvgCorrection;
- F32 mSpeedAdjust;
+ F32 mAdjustedSpeed;
F32 mAnimSpeed;
- F32 mAvgSpeed;
F32 mRelativeDir;
LLVector3 mPelvisOffset;
F32 mAnkleOffset;
diff --git a/indra/llcharacter/llmotioncontroller.cpp b/indra/llcharacter/llmotioncontroller.cpp
index bb9625b2bd..78d9398c1d 100644
--- a/indra/llcharacter/llmotioncontroller.cpp
+++ b/indra/llcharacter/llmotioncontroller.cpp
@@ -143,7 +143,8 @@ LLMotionController::LLMotionController()
mPauseTime(0.f),
mTimeStep(0.f),
mTimeStepCount(0),
- mLastInterp(0.f)
+ mLastInterp(0.f),
+ mIsSelf(FALSE)
{
}
@@ -446,6 +447,7 @@ BOOL LLMotionController::stopMotionInstance(LLMotion* motion, BOOL stop_immediat
return FALSE;
}
+
// If on active list, stop it
if (isMotionActive(motion) && !motion->isStopped())
{
@@ -1033,6 +1035,31 @@ LLMotion* LLMotionController::findMotion(const LLUUID& id) const
}
//-----------------------------------------------------------------------------
+// dumpMotions()
+//-----------------------------------------------------------------------------
+void LLMotionController::dumpMotions()
+{
+ llinfos << "=====================================" << llendl;
+ for (motion_map_t::iterator iter = mAllMotions.begin();
+ iter != mAllMotions.end(); iter++)
+ {
+ LLUUID id = iter->first;
+ std::string state_string;
+ LLMotion *motion = iter->second;
+ if (mLoadingMotions.find(motion) != mLoadingMotions.end())
+ state_string += std::string("l");
+ if (mLoadedMotions.find(motion) != mLoadedMotions.end())
+ state_string += std::string("L");
+ if (std::find(mActiveMotions.begin(), mActiveMotions.end(), motion)!=mActiveMotions.end())
+ state_string += std::string("A");
+ if (mDeprecatedMotions.find(motion) != mDeprecatedMotions.end())
+ state_string += std::string("D");
+ llinfos << gAnimLibrary.animationName(id) << " " << state_string << llendl;
+
+ }
+}
+
+//-----------------------------------------------------------------------------
// deactivateAllMotions()
//-----------------------------------------------------------------------------
void LLMotionController::deactivateAllMotions()
diff --git a/indra/llcharacter/llmotioncontroller.h b/indra/llcharacter/llmotioncontroller.h
index 5c3ec223cb..f8bf5ac289 100644
--- a/indra/llcharacter/llmotioncontroller.h
+++ b/indra/llcharacter/llmotioncontroller.h
@@ -92,6 +92,7 @@ class LLMotionController
public:
typedef std::list<LLMotion*> motion_list_t;
typedef std::set<LLMotion*> motion_set_t;
+ BOOL mIsSelf;
public:
// Constructor
@@ -169,6 +170,10 @@ public:
bool isMotionLoading( LLMotion *motion );
LLMotion *findMotion( const LLUUID& id ) const;
+ void dumpMotions();
+
+ const LLFrameTimer& getFrameTimer() { return mTimer; }
+
protected:
// internal operations act on motion instances directly
// as there can be duplicate motions per id during blending overlap
diff --git a/indra/llcharacter/llmultigesture.cpp b/indra/llcharacter/llmultigesture.cpp
index 05d1bc0cd9..ee60430d97 100644
--- a/indra/llcharacter/llmultigesture.cpp
+++ b/indra/llcharacter/llmultigesture.cpp
@@ -498,6 +498,10 @@ std::vector<std::string> LLGestureStepWait::getLabel() const
strings.push_back("until animations are done");
// label += "until animations are done";
}
+ else
+ {
+ strings.push_back("");
+ }
return strings;
}
diff --git a/indra/llcharacter/llvisualparam.cpp b/indra/llcharacter/llvisualparam.cpp
index 297322fe58..703fe2f9cc 100644
--- a/indra/llcharacter/llvisualparam.cpp
+++ b/indra/llcharacter/llvisualparam.cpp
@@ -284,7 +284,7 @@ void LLVisualParam::setAnimationTarget(F32 target_value, BOOL upload_bake)
void LLVisualParam::setNextParam( LLVisualParam *next )
{
llassert(!mNext);
-
+ llassert(getWeight() == getDefaultWeight()); // need to establish mNext before we start changing values on this, else initial value won't get mirrored (we can fix that, but better to forbid this pattern)
mNext = next;
}
diff --git a/indra/llcommon/CMakeLists.txt b/indra/llcommon/CMakeLists.txt
index 9ead183a9e..2a036df06e 100644
--- a/indra/llcommon/CMakeLists.txt
+++ b/indra/llcommon/CMakeLists.txt
@@ -9,6 +9,7 @@ include(Linking)
include(Boost)
include(Pth)
include(LLSharedLibs)
+include(GoogleBreakpad)
include(GooglePerfTools)
include(Copy3rdPartyLibs)
@@ -35,6 +36,7 @@ set(llcommon_SOURCE_FILES
llbase32.cpp
llbase64.cpp
llcommon.cpp
+ llcommonutils.cpp
llcoros.cpp
llcrc.cpp
llcriticaldamp.cpp
@@ -50,6 +52,7 @@ set(llcommon_SOURCE_FILES
lleventdispatcher.cpp
lleventfilter.cpp
llevents.cpp
+ lleventtimer.cpp
llfasttimer_class.cpp
llfile.cpp
llfindlocale.cpp
@@ -123,6 +126,7 @@ set(llcommon_HEADER_FILES
llchat.h
llclickaction.h
llcommon.h
+ llcommonutils.h
llcoros.h
llcrc.h
llcriticaldamp.h
@@ -164,7 +168,6 @@ set(llcommon_HEADER_FILES
llhttpstatuscodes.h
llindexedqueue.h
llinstancetracker.h
- llinstancetracker.h
llkeythrottle.h
lllazy.h
lllistenerwrapper.h
@@ -230,7 +233,6 @@ set(llcommon_HEADER_FILES
metaclasst.h
metaproperty.h
metapropertyt.h
- processor.h
reflective.h
reflectivet.h
roles_constants.h
@@ -257,6 +259,7 @@ endif(LLCOMMON_LINK_SHARED)
target_link_libraries(
llcommon
+ ${BREAKPAD_EXCEPTION_HANDLER_LIBRARIES}
${APRUTIL_LIBRARIES}
${APR_LIBRARIES}
${EXPAT_LIBRARIES}
@@ -288,6 +291,7 @@ if (LL_TESTS)
LL_ADD_INTEGRATION_TEST(llframetimer "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(llinstancetracker "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(lllazy "" "${test_libs}")
+ LL_ADD_INTEGRATION_TEST(llprocessor "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(llrand "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(llsdserialize "" "${test_libs}")
LL_ADD_INTEGRATION_TEST(llstring "" "${test_libs}")
diff --git a/indra/llcommon/llapp.cpp b/indra/llcommon/llapp.cpp
index 968b92d1e7..0447ca93f5 100644
--- a/indra/llcommon/llapp.cpp
+++ b/indra/llcommon/llapp.cpp
@@ -30,6 +30,14 @@
* $/LicenseInfo$
*/
+#include <cstdlib>
+
+#ifdef LL_DARWIN
+#include <sys/types.h>
+#include <unistd.h>
+#include <sys/sysctl.h>
+#endif
+
#include "linden_common.h"
#include "llapp.h"
@@ -41,7 +49,10 @@
#include "lllivefile.h"
#include "llmemory.h"
#include "llstl.h" // for DeletePointer()
-#include "lltimer.h"
+#include "llstring.h"
+#include "lleventtimer.h"
+
+#include "google_breakpad/exception_handler.h"
//
// Signal handling
@@ -51,11 +62,22 @@
#if LL_WINDOWS
LONG WINAPI default_windows_exception_handler(struct _EXCEPTION_POINTERS *exception_infop);
BOOL ConsoleCtrlHandler(DWORD fdwCtrlType);
+bool windows_post_minidump_callback(const wchar_t* dump_path,
+ const wchar_t* minidump_id,
+ void* context,
+ EXCEPTION_POINTERS* exinfo,
+ MDRawAssertionInfo* assertion,
+ bool succeeded);
#else
# include <signal.h>
# include <unistd.h> // for fork()
void setup_signals();
void default_unix_signal_handler(int signum, siginfo_t *info, void *);
+
+// Called by breakpad exception handler after the minidump has been generated.
+bool unix_post_minidump_callback(const char *dump_dir,
+ const char *minidump_id,
+ void *context, bool succeeded);
# if LL_DARWIN
/* OSX doesn't support SIGRT* */
S32 LL_SMACKDOWN_SIGNAL = SIGUSR1;
@@ -81,7 +103,6 @@ BOOL LLApp::sLogInSignal = FALSE;
// static
LLApp::EAppStatus LLApp::sStatus = LLApp::APP_STATUS_STOPPED; // Keeps track of application status
LLAppErrorHandler LLApp::sErrorHandler = NULL;
-LLAppErrorHandler LLApp::sSyncErrorHandler = NULL;
BOOL LLApp::sErrorThreadRunning = FALSE;
#if !LL_WINDOWS
LLApp::child_map LLApp::sChildMap;
@@ -123,7 +144,12 @@ void LLApp::commonCtor()
// Set the application to this instance.
sApplication = this;
-
+
+ mExceptionHandler = 0;
+
+ // initialize the buffer to write the minidump filename to
+ // (this is used to avoid allocating memory in the crash handler)
+ memset(minidump_path, 0, MAX_MINDUMP_PATH_LENGTH);
}
LLApp::LLApp(LLErrorThread *error_thread) :
@@ -152,6 +178,8 @@ LLApp::~LLApp()
delete mThreadErrorp;
mThreadErrorp = NULL;
}
+
+ if(mExceptionHandler != 0) delete mExceptionHandler;
LLCommon::cleanupClass();
}
@@ -262,19 +290,18 @@ void LLApp::setupErrorHandling()
// occasionally checks to see if the app is in an error state, and sees if it needs to be run.
#if LL_WINDOWS
- // Windows doesn't have the same signal handling mechanisms as UNIX, thus APR doesn't provide
- // a signal handling thread implementation.
- // What we do is install an unhandled exception handler, which will try to do the right thing
- // in the case of an error (generate a minidump)
-
- // Disable this until the viewer gets ported so server crashes can be JIT debugged.
- //LPTOP_LEVEL_EXCEPTION_FILTER prev_filter;
- //prev_filter = SetUnhandledExceptionFilter(default_windows_exception_handler);
-
// This sets a callback to handle w32 signals to the console window.
// The viewer shouldn't be affected, sicne its a windowed app.
SetConsoleCtrlHandler( (PHANDLER_ROUTINE) ConsoleCtrlHandler, TRUE);
+ // Install the Google Breakpad crash handler for Windows
+ if(mExceptionHandler == 0)
+ {
+ llwarns << "adding breakpad exception handler" << llendl;
+ mExceptionHandler = new google_breakpad::ExceptionHandler(
+ L"C:\\Temp\\", 0, windows_post_minidump_callback, 0, google_breakpad::ExceptionHandler::HANDLER_ALL);
+ }
+
#else
//
// Start up signal handling.
@@ -282,9 +309,49 @@ void LLApp::setupErrorHandling()
// There are two different classes of signals. Synchronous signals are delivered to a specific
// thread, asynchronous signals can be delivered to any thread (in theory)
//
-
setup_signals();
-
+
+ // Add google breakpad exception handler configured for Darwin/Linux.
+ bool installHandler = true;
+#ifdef LL_DARWIN
+ // For the special case of Darwin, we do not want to install the handler if
+ // the process is being debugged as the app will exit with value ABRT (6) if
+ // we do. Unfortunately, the code below which performs that test relies on
+ // the structure kinfo_proc which has been tagged by apple as an unstable
+ // API. We disable this test for shipping versions to avoid conflicts with
+ // future releases of Darwin. This test is really only needed for developers
+ // starting the app from a debugger anyway.
+ #ifndef LL_RELEASE_FOR_DOWNLOAD
+ int mib[4];
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_PROC;
+ mib[2] = KERN_PROC_PID;
+ mib[3] = getpid();
+
+ struct kinfo_proc info;
+ memset(&info, 0, sizeof(info));
+
+ size_t size = sizeof(info);
+ int result = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0);
+ if((result == 0) || (errno == ENOMEM))
+ {
+ // P_TRACED flag is set, so this process is being debugged; do not install
+ // the handler
+ if(info.kp_proc.p_flag & P_TRACED) installHandler = false;
+ }
+ else
+ {
+ // Failed to discover if the process is being debugged; default to
+ // installing the handler.
+ installHandler = true;
+ }
+ #endif
+#endif
+ if(installHandler && (mExceptionHandler == 0))
+ {
+ std::string dumpPath = "/tmp/";
+ mExceptionHandler = new google_breakpad::ExceptionHandler(dumpPath, 0, &unix_post_minidump_callback, 0, true);
+ }
#endif
startErrorThread();
@@ -310,21 +377,6 @@ void LLApp::setErrorHandler(LLAppErrorHandler handler)
LLApp::sErrorHandler = handler;
}
-
-void LLApp::setSyncErrorHandler(LLAppErrorHandler handler)
-{
- LLApp::sSyncErrorHandler = handler;
-}
-
-// static
-void LLApp::runSyncErrorHandler()
-{
- if (LLApp::sSyncErrorHandler)
- {
- LLApp::sSyncErrorHandler();
- }
-}
-
// static
void LLApp::runErrorHandler()
{
@@ -337,7 +389,6 @@ void LLApp::runErrorHandler()
LLApp::setStopped();
}
-
// static
void LLApp::setStatus(EAppStatus status)
{
@@ -348,15 +399,27 @@ void LLApp::setStatus(EAppStatus status)
// static
void LLApp::setError()
{
- if (!isError())
- {
- // perform any needed synchronous error-handling
- runSyncErrorHandler();
- // set app status to ERROR so that the LLErrorThread notices
- setStatus(APP_STATUS_ERROR);
- }
+ // set app status to ERROR so that the LLErrorThread notices
+ setStatus(APP_STATUS_ERROR);
}
+void LLApp::setMiniDumpDir(const std::string &path)
+{
+ if(mExceptionHandler == 0) return;
+#ifdef LL_WINDOWS
+ wchar_t buffer[MAX_MINDUMP_PATH_LENGTH];
+ mbstowcs(buffer, path.c_str(), MAX_MINDUMP_PATH_LENGTH);
+ mExceptionHandler->set_dump_path(std::wstring(buffer));
+#else
+ mExceptionHandler->set_dump_path(path);
+#endif
+}
+
+void LLApp::writeMiniDump()
+{
+ if(mExceptionHandler == 0) return;
+ mExceptionHandler->WriteMinidump();
+}
// static
void LLApp::setQuitting()
@@ -587,6 +650,7 @@ void setup_signals()
// Asynchronous signals that result in core
sigaction(SIGQUIT, &act, NULL);
+
}
void clear_signals()
@@ -765,4 +829,97 @@ void default_unix_signal_handler(int signum, siginfo_t *info, void *)
}
}
+bool unix_post_minidump_callback(const char *dump_dir,
+ const char *minidump_id,
+ void *context, bool succeeded)
+{
+ // Copy minidump file path into fixed buffer in the app instance to avoid
+ // heap allocations in a crash handler.
+
+ // path format: <dump_dir>/<minidump_id>.dmp
+ int dirPathLength = strlen(dump_dir);
+ int idLength = strlen(minidump_id);
+
+ // The path must not be truncated.
+ llassert((dirPathLength + idLength + 5) <= LLApp::MAX_MINDUMP_PATH_LENGTH);
+
+ char * path = LLApp::instance()->getMiniDumpFilename();
+ S32 remaining = LLApp::MAX_MINDUMP_PATH_LENGTH;
+ strncpy(path, dump_dir, remaining);
+ remaining -= dirPathLength;
+ path += dirPathLength;
+ if (remaining > 0 && dirPathLength > 0 && path[-1] != '/')
+ {
+ *path++ = '/';
+ --remaining;
+ }
+ if (remaining > 0)
+ {
+ strncpy(path, minidump_id, remaining);
+ remaining -= idLength;
+ path += idLength;
+ strncpy(path, ".dmp", remaining);
+ }
+
+ llinfos << "generated minidump: " << LLApp::instance()->getMiniDumpFilename() << llendl;
+ LLApp::runErrorHandler();
+ return true;
+}
#endif // !WINDOWS
+
+#ifdef LL_WINDOWS
+bool windows_post_minidump_callback(const wchar_t* dump_path,
+ const wchar_t* minidump_id,
+ void* context,
+ EXCEPTION_POINTERS* exinfo,
+ MDRawAssertionInfo* assertion,
+ bool succeeded)
+{
+ char * path = LLApp::instance()->getMiniDumpFilename();
+ S32 remaining = LLApp::MAX_MINDUMP_PATH_LENGTH;
+ size_t bytesUsed;
+
+ bytesUsed = wcstombs(path, dump_path, static_cast<size_t>(remaining));
+ remaining -= bytesUsed;
+ path += bytesUsed;
+ if(remaining > 0 && bytesUsed > 0 && path[-1] != '\\')
+ {
+ *path++ = '\\';
+ --remaining;
+ }
+ if(remaining > 0)
+ {
+ bytesUsed = wcstombs(path, minidump_id, static_cast<size_t>(remaining));
+ remaining -= bytesUsed;
+ path += bytesUsed;
+ }
+ if(remaining > 0)
+ {
+ strncpy(path, ".dmp", remaining);
+ }
+
+ llinfos << "generated minidump: " << LLApp::instance()->getMiniDumpFilename() << llendl;
+ // *NOTE:Mani - this code is stolen from LLApp, where its never actually used.
+ //OSMessageBox("Attach Debugger Now", "Error", OSMB_OK);
+ // *TODO: Translate the signals/exceptions into cross-platform stuff
+ // Windows implementation
+ llinfos << "Entering Windows Exception Handler..." << llendl;
+
+ if (LLApp::isError())
+ {
+ llwarns << "Got another fatal signal while in the error handler, die now!" << llendl;
+ }
+
+ // Flag status to error, so thread_error starts its work
+ LLApp::setError();
+
+ // Block in the exception handler until the app has stopped
+ // This is pretty sketchy, but appears to work just fine
+ while (!LLApp::isStopped())
+ {
+ ms_sleep(10);
+ }
+
+ return true;
+}
+#endif
diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h
index 27a52cdd99..fef05a7939 100644
--- a/indra/llcommon/llapp.h
+++ b/indra/llcommon/llapp.h
@@ -66,6 +66,10 @@ public:
};
#endif
+namespace google_breakpad {
+ class ExceptionHandler; // See exception_handler.h
+}
+
class LL_COMMON_API LLApp : public LLOptionInterface
{
friend class LLErrorThread;
@@ -227,15 +231,27 @@ public:
void setupErrorHandling();
void setErrorHandler(LLAppErrorHandler handler);
- void setSyncErrorHandler(LLAppErrorHandler handler);
+ static void runErrorHandler(); // run shortly after we detect an error, ran in the relatively robust context of the LLErrorThread - preferred.
//@}
+
+ // the maximum length of the minidump filename returned by getMiniDumpFilename()
+ static const U32 MAX_MINDUMP_PATH_LENGTH = 256;
+
+ // change the directory where Breakpad minidump files are written to
+ void setMiniDumpDir(const std::string &path);
+
+ // Return the Google Breakpad minidump filename after a crash.
+ char *getMiniDumpFilename() { return minidump_path; }
+
+ // Write out a Google Breakpad minidump file.
+ void writeMiniDump();
#if !LL_WINDOWS
//
// Child process handling (Unix only for now)
//
// Set a callback to be run on exit of a child process
- // WARNING! This callback is run from the signal handler due to the extreme crappiness of
+ // WARNING! This callback is run from the signal handler due to
// Linux threading requiring waitpid() to be called from the thread that spawned the process.
// At some point I will make this more behaved, but I'm not going to fix this right now - djs
void setChildCallback(pid_t pid, LLAppChildCallback callback);
@@ -286,15 +302,14 @@ protected:
private:
void startErrorThread();
- static void runErrorHandler(); // run shortly after we detect an error, ran in the relatively robust context of the LLErrorThread - preferred.
- static void runSyncErrorHandler(); // run IMMEDIATELY when we get an error, ran in the context of the faulting thread.
+ // Contains the filename of the minidump file after a crash.
+ char minidump_path[MAX_MINDUMP_PATH_LENGTH];
// *NOTE: On Windows, we need a routine to reset the structured
// exception handler when some evil driver has taken it over for
// their own purposes
typedef int(*signal_handler_func)(int signum);
static LLAppErrorHandler sErrorHandler;
- static LLAppErrorHandler sSyncErrorHandler;
// Default application threads
LLErrorThread* mThreadErrorp; // Waits for app to go to status ERROR, then runs the error callback
@@ -315,6 +330,8 @@ private:
private:
// the static application instance if it was created.
static LLApp* sApplication;
+
+ google_breakpad::ExceptionHandler * mExceptionHandler;
#if !LL_WINDOWS
diff --git a/indra/llcommon/llapr.cpp b/indra/llcommon/llapr.cpp
index ed70b1d9f2..7330b00bcf 100644
--- a/indra/llcommon/llapr.cpp
+++ b/indra/llcommon/llapr.cpp
@@ -543,14 +543,13 @@ S32 LLAPRFile::readEx(const std::string& filename, void *buf, S32 offset, S32 nb
return 0;
}
- S32 off;
- if (offset < 0)
- off = LLAPRFile::seek(file_handle, APR_END, 0);
- else
- off = LLAPRFile::seek(file_handle, APR_SET, offset);
+ llassert(offset >= 0);
+
+ if (offset > 0)
+ offset = LLAPRFile::seek(file_handle, APR_SET, offset);
apr_size_t bytes_read;
- if (off < 0)
+ if (offset < 0)
{
bytes_read = 0;
}
diff --git a/indra/llcommon/llapr.h b/indra/llcommon/llapr.h
index b05a222b33..08cf11e593 100644
--- a/indra/llcommon/llapr.h
+++ b/indra/llcommon/llapr.h
@@ -182,7 +182,7 @@ typedef LLAtomic32<U32> LLAtomicU32;
typedef LLAtomic32<S32> LLAtomicS32;
// File IO convenience functions.
-// Returns NULL if the file fails to openm sets *sizep to file size of not NULL
+// Returns NULL if the file fails to open, sets *sizep to file size if not NULL
// abbreviated flags
#define LL_APR_R (APR_READ) // "r"
#define LL_APR_W (APR_CREATE|APR_TRUNCATE|APR_WRITE) // "w"
@@ -200,7 +200,7 @@ typedef LLAtomic32<S32> LLAtomicS32;
// especially do not put some time-costly operations between open() and close().
// otherwise it might lock the APRFilePool.
//there are two different apr_pools the APRFile can use:
-// 1, a temperary pool passed to an APRFile function, which is used within this function and only once.
+// 1, a temporary pool passed to an APRFile function, which is used within this function and only once.
// 2, a global pool.
//
@@ -255,12 +255,12 @@ public:
// Returns bytes read/written, 0 if read/write fails:
static S32 readEx(const std::string& filename, void *buf, S32 offset, S32 nbytes, LLVolatileAPRPool* pool = NULL);
- static S32 writeEx(const std::string& filename, void *buf, S32 offset, S32 nbytes, LLVolatileAPRPool* pool = NULL);
+ static S32 writeEx(const std::string& filename, void *buf, S32 offset, S32 nbytes, LLVolatileAPRPool* pool = NULL); // offset<0 means append
//*******************************************************************************************************************************
};
/**
- * @brief Function which approprately logs error or remains quiet on
+ * @brief Function which appropriately logs error or remains quiet on
* APR_SUCCESS.
* @return Returns <code>true</code> if status is an error condition.
*/
diff --git a/indra/llcommon/llassettype.cpp b/indra/llcommon/llassettype.cpp
index 6d5b12d840..2cd29448ae 100644
--- a/indra/llcommon/llassettype.cpp
+++ b/indra/llcommon/llassettype.cpp
@@ -45,12 +45,16 @@ struct AssetEntry : public LLDictionaryEntry
AssetEntry(const char *desc_name,
const char *type_name, // 8 character limit!
const char *human_name, // for decoding to human readable form; put any and as many printable characters you want in each one
- bool can_link) // can you create a link to this type?
+ bool can_link, // can you create a link to this type?
+ bool can_fetch, // can you fetch this asset by ID?
+ bool can_know) // can you see this asset's ID?
:
LLDictionaryEntry(desc_name),
mTypeName(type_name),
mHumanName(human_name),
- mCanLink(can_link)
+ mCanLink(can_link),
+ mCanFetch(can_fetch),
+ mCanKnow(can_know)
{
llassert(strlen(mTypeName) <= 8);
}
@@ -58,6 +62,8 @@ struct AssetEntry : public LLDictionaryEntry
const char *mTypeName;
const char *mHumanName;
bool mCanLink;
+ bool mCanFetch;
+ bool mCanKnow;
};
class LLAssetDictionary : public LLSingleton<LLAssetDictionary>,
@@ -69,32 +75,32 @@ public:
LLAssetDictionary::LLAssetDictionary()
{
- // DESCRIPTION TYPE NAME HUMAN NAME CAN LINK?
- // |--------------------|-----------|-------------------|-----------|
- addEntry(LLAssetType::AT_TEXTURE, new AssetEntry("TEXTURE", "texture", "texture", FALSE));
- addEntry(LLAssetType::AT_SOUND, new AssetEntry("SOUND", "sound", "sound", FALSE));
- addEntry(LLAssetType::AT_CALLINGCARD, new AssetEntry("CALLINGCARD", "callcard", "calling card", FALSE));
- addEntry(LLAssetType::AT_LANDMARK, new AssetEntry("LANDMARK", "landmark", "landmark", FALSE));
- addEntry(LLAssetType::AT_SCRIPT, new AssetEntry("SCRIPT", "script", "legacy script", FALSE));
- addEntry(LLAssetType::AT_CLOTHING, new AssetEntry("CLOTHING", "clothing", "clothing", TRUE));
- addEntry(LLAssetType::AT_OBJECT, new AssetEntry("OBJECT", "object", "object", TRUE));
- addEntry(LLAssetType::AT_NOTECARD, new AssetEntry("NOTECARD", "notecard", "note card", FALSE));
- addEntry(LLAssetType::AT_CATEGORY, new AssetEntry("CATEGORY", "category", "folder", TRUE));
- addEntry(LLAssetType::AT_LSL_TEXT, new AssetEntry("LSL_TEXT", "lsltext", "lsl2 script", FALSE));
- addEntry(LLAssetType::AT_LSL_BYTECODE, new AssetEntry("LSL_BYTECODE", "lslbyte", "lsl bytecode", FALSE));
- addEntry(LLAssetType::AT_TEXTURE_TGA, new AssetEntry("TEXTURE_TGA", "txtr_tga", "tga texture", FALSE));
- addEntry(LLAssetType::AT_BODYPART, new AssetEntry("BODYPART", "bodypart", "body part", TRUE));
- addEntry(LLAssetType::AT_SOUND_WAV, new AssetEntry("SOUND_WAV", "snd_wav", "sound", FALSE));
- addEntry(LLAssetType::AT_IMAGE_TGA, new AssetEntry("IMAGE_TGA", "img_tga", "targa image", FALSE));
- addEntry(LLAssetType::AT_IMAGE_JPEG, new AssetEntry("IMAGE_JPEG", "jpeg", "jpeg image", FALSE));
- addEntry(LLAssetType::AT_ANIMATION, new AssetEntry("ANIMATION", "animatn", "animation", FALSE));
- addEntry(LLAssetType::AT_GESTURE, new AssetEntry("GESTURE", "gesture", "gesture", TRUE));
- addEntry(LLAssetType::AT_SIMSTATE, new AssetEntry("SIMSTATE", "simstate", "simstate", FALSE));
-
- addEntry(LLAssetType::AT_LINK, new AssetEntry("LINK", "link", "symbolic link", FALSE));
- addEntry(LLAssetType::AT_LINK_FOLDER, new AssetEntry("FOLDER_LINK", "link_f", "symbolic folder link", FALSE));
-
- addEntry(LLAssetType::AT_NONE, new AssetEntry("NONE", "-1", NULL, FALSE));
+ // DESCRIPTION TYPE NAME HUMAN NAME CAN LINK? CAN FETCH? CAN KNOW?
+ // |--------------------|-----------|-------------------|-----------|-----------|---------|
+ addEntry(LLAssetType::AT_TEXTURE, new AssetEntry("TEXTURE", "texture", "texture", true, false, true));
+ addEntry(LLAssetType::AT_SOUND, new AssetEntry("SOUND", "sound", "sound", true, true, true));
+ addEntry(LLAssetType::AT_CALLINGCARD, new AssetEntry("CALLINGCARD", "callcard", "calling card", true, false, false));
+ addEntry(LLAssetType::AT_LANDMARK, new AssetEntry("LANDMARK", "landmark", "landmark", true, true, true));
+ addEntry(LLAssetType::AT_SCRIPT, new AssetEntry("SCRIPT", "script", "legacy script", true, false, false));
+ addEntry(LLAssetType::AT_CLOTHING, new AssetEntry("CLOTHING", "clothing", "clothing", true, true, true));
+ addEntry(LLAssetType::AT_OBJECT, new AssetEntry("OBJECT", "object", "object", true, false, false));
+ addEntry(LLAssetType::AT_NOTECARD, new AssetEntry("NOTECARD", "notecard", "note card", true, false, true));
+ addEntry(LLAssetType::AT_CATEGORY, new AssetEntry("CATEGORY", "category", "folder", true, false, false));
+ addEntry(LLAssetType::AT_LSL_TEXT, new AssetEntry("LSL_TEXT", "lsltext", "lsl2 script", true, false, false));
+ addEntry(LLAssetType::AT_LSL_BYTECODE, new AssetEntry("LSL_BYTECODE", "lslbyte", "lsl bytecode", true, false, false));
+ addEntry(LLAssetType::AT_TEXTURE_TGA, new AssetEntry("TEXTURE_TGA", "txtr_tga", "tga texture", true, false, false));
+ addEntry(LLAssetType::AT_BODYPART, new AssetEntry("BODYPART", "bodypart", "body part", true, true, true));
+ addEntry(LLAssetType::AT_SOUND_WAV, new AssetEntry("SOUND_WAV", "snd_wav", "sound", true, false, false));
+ addEntry(LLAssetType::AT_IMAGE_TGA, new AssetEntry("IMAGE_TGA", "img_tga", "targa image", true, false, false));
+ addEntry(LLAssetType::AT_IMAGE_JPEG, new AssetEntry("IMAGE_JPEG", "jpeg", "jpeg image", true, false, false));
+ addEntry(LLAssetType::AT_ANIMATION, new AssetEntry("ANIMATION", "animatn", "animation", true, true, true));
+ addEntry(LLAssetType::AT_GESTURE, new AssetEntry("GESTURE", "gesture", "gesture", true, true, true));
+ addEntry(LLAssetType::AT_SIMSTATE, new AssetEntry("SIMSTATE", "simstate", "simstate", false, false, false));
+
+ addEntry(LLAssetType::AT_LINK, new AssetEntry("LINK", "link", "sym link", false, false, true));
+ addEntry(LLAssetType::AT_LINK_FOLDER, new AssetEntry("FOLDER_LINK", "link_f", "sym folder link", false, false, true));
+
+ addEntry(LLAssetType::AT_NONE, new AssetEntry("NONE", "-1", NULL, false, false, false));
};
// static
@@ -225,3 +231,27 @@ const std::string &LLAssetType::badLookup()
return sBadLookup;
}
+
+// static
+bool LLAssetType::lookupIsAssetFetchByIDAllowed(EType asset_type)
+{
+ const LLAssetDictionary *dict = LLAssetDictionary::getInstance();
+ const AssetEntry *entry = dict->lookup(asset_type);
+ if (entry)
+ {
+ return entry->mCanFetch;
+ }
+ return false;
+}
+
+// static
+bool LLAssetType::lookupIsAssetIDKnowable(EType asset_type)
+{
+ const LLAssetDictionary *dict = LLAssetDictionary::getInstance();
+ const AssetEntry *entry = dict->lookup(asset_type);
+ if (entry)
+ {
+ return entry->mCanKnow;
+ }
+ return false;
+}
diff --git a/indra/llcommon/llassettype.h b/indra/llcommon/llassettype.h
index c7bbc2e74a..2c2dc27aaa 100644
--- a/indra/llcommon/llassettype.h
+++ b/indra/llcommon/llassettype.h
@@ -146,6 +146,9 @@ public:
static bool lookupCanLink(EType asset_type);
static bool lookupIsLinkType(EType asset_type);
+ static bool lookupIsAssetFetchByIDAllowed(EType asset_type); // the asset allows direct download
+ static bool lookupIsAssetIDKnowable(EType asset_type); // asset data can be known by the viewer
+
static const std::string& badLookup(); // error string when a lookup fails
protected:
diff --git a/indra/llcommon/llchat.h b/indra/llcommon/llchat.h
index a77bd211f3..63cce24005 100644
--- a/indra/llcommon/llchat.h
+++ b/indra/llcommon/llchat.h
@@ -43,7 +43,8 @@ typedef enum e_chat_source_type
{
CHAT_SOURCE_SYSTEM = 0,
CHAT_SOURCE_AGENT = 1,
- CHAT_SOURCE_OBJECT = 2
+ CHAT_SOURCE_OBJECT = 2,
+ CHAT_SOURCE_UNKNOWN = 3
} EChatSourceType;
typedef enum e_chat_type
@@ -68,7 +69,8 @@ typedef enum e_chat_audible_level
typedef enum e_chat_style
{
CHAT_STYLE_NORMAL,
- CHAT_STYLE_IRC
+ CHAT_STYLE_IRC,
+ CHAT_STYLE_HISTORY
}EChatStyle;
// A piece of chat
@@ -80,6 +82,7 @@ public:
mFromName(),
mFromID(),
mNotifId(),
+ mOwnerID(),
mSourceType(CHAT_SOURCE_AGENT),
mChatType(CHAT_TYPE_NORMAL),
mAudible(CHAT_AUDIBLE_FULLY),
@@ -96,6 +99,7 @@ public:
std::string mFromName; // agent or object name
LLUUID mFromID; // agent id or object id
LLUUID mNotifId;
+ LLUUID mOwnerID;
EChatSourceType mSourceType;
EChatType mChatType;
EChatAudible mAudible;
diff --git a/indra/llcommon/llcommonutils.cpp b/indra/llcommon/llcommonutils.cpp
new file mode 100644
index 0000000000..0022dc6915
--- /dev/null
+++ b/indra/llcommon/llcommonutils.cpp
@@ -0,0 +1,61 @@
+/**
+ * @file llcommonutils.h
+ * @brief Commin utils
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+#include "llcommonutils.h"
+
+void LLCommonUtils::computeDifference(
+ const uuid_vec_t& vnew,
+ const uuid_vec_t& vcur,
+ uuid_vec_t& vadded,
+ uuid_vec_t& vremoved)
+{
+ uuid_vec_t vnew_copy(vnew);
+ uuid_vec_t vcur_copy(vcur);
+
+ std::sort(vnew_copy.begin(), vnew_copy.end());
+ std::sort(vcur_copy.begin(), vcur_copy.end());
+
+ size_t maxsize = llmax(vnew_copy.size(), vcur_copy.size());
+ vadded.resize(maxsize);
+ vremoved.resize(maxsize);
+
+ uuid_vec_t::iterator it;
+ // what was removed
+ it = set_difference(vcur_copy.begin(), vcur_copy.end(), vnew_copy.begin(), vnew_copy.end(), vremoved.begin());
+ vremoved.erase(it, vremoved.end());
+
+ // what was added
+ it = set_difference(vnew_copy.begin(), vnew_copy.end(), vcur_copy.begin(), vcur_copy.end(), vadded.begin());
+ vadded.erase(it, vadded.end());
+}
+
+// EOF
diff --git a/indra/llcommon/llcommonutils.h b/indra/llcommon/llcommonutils.h
new file mode 100644
index 0000000000..ad0d884e37
--- /dev/null
+++ b/indra/llcommon/llcommonutils.h
@@ -0,0 +1,56 @@
+/**
+ * @file llcommonutils.h
+ * @brief Common utils
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLCOMMONUTILS_H
+#define LL_LLCOMMONUTILS_H
+
+namespace LLCommonUtils
+{
+ /**
+ * Computes difference between 'vnew' and 'vcur' vectors.
+ * Items present in 'vnew' and missing in 'vcur' are treated as added and are copied into 'vadded'
+ * Items missing in 'vnew' and present in 'vcur' are treated as removed and are copied into 'vremoved'
+ *
+ * @param vnew[in] - incoming IDs
+ * @param vcur[in] - current IDs
+ * @param vadded[out] - difference between incoming and current IDS - added IDs
+ * @param vremoved[out] - difference between incoming and current IDS - removed IDs
+ */
+ LL_COMMON_API void computeDifference(
+ const uuid_vec_t& vnew,
+ const uuid_vec_t& vcur,
+ uuid_vec_t& vadded,
+ uuid_vec_t& vremoved);
+};
+
+#endif //LL_LLCOMMONUTILS_H
+
+// EOF
diff --git a/indra/llcommon/llcursortypes.cpp b/indra/llcommon/llcursortypes.cpp
index 23ede97af3..6751c235f6 100644
--- a/indra/llcommon/llcursortypes.cpp
+++ b/indra/llcommon/llcursortypes.cpp
@@ -72,6 +72,9 @@ ECursorType getCursorFromString(const std::string& cursor_string)
cursor_string_table["UI_CURSOR_TOOLPAUSE"] = UI_CURSOR_TOOLPAUSE;
cursor_string_table["UI_CURSOR_TOOLMEDIAOPEN"] = UI_CURSOR_TOOLMEDIAOPEN;
cursor_string_table["UI_CURSOR_PIPETTE"] = UI_CURSOR_PIPETTE;
+ cursor_string_table["UI_CURSOR_TOOLSIT"] = UI_CURSOR_TOOLSIT;
+ cursor_string_table["UI_CURSOR_TOOLBUY"] = UI_CURSOR_TOOLBUY;
+ cursor_string_table["UI_CURSOR_TOOLOPEN"] = UI_CURSOR_TOOLOPEN;
}
std::map<std::string,U32>::const_iterator iter = cursor_string_table.find(cursor_string);
diff --git a/indra/llcommon/llcursortypes.h b/indra/llcommon/llcursortypes.h
index a1b8178bfe..143c2c64cf 100644
--- a/indra/llcommon/llcursortypes.h
+++ b/indra/llcommon/llcursortypes.h
@@ -68,6 +68,9 @@ enum ECursorType {
UI_CURSOR_TOOLPAUSE,
UI_CURSOR_TOOLMEDIAOPEN,
UI_CURSOR_PIPETTE,
+ UI_CURSOR_TOOLSIT,
+ UI_CURSOR_TOOLBUY,
+ UI_CURSOR_TOOLOPEN,
UI_CURSOR_COUNT // Number of elements in this enum (NOT a cursor)
};
diff --git a/indra/llcommon/lldate.cpp b/indra/llcommon/lldate.cpp
index de7f2ead74..a7ef28b431 100644
--- a/indra/llcommon/lldate.cpp
+++ b/indra/llcommon/lldate.cpp
@@ -248,8 +248,27 @@ bool LLDate::fromStream(std::istream& s)
s >> fractional;
seconds_since_epoch += fractional;
}
- c = s.get(); // skip the Z
- if (c != 'Z') { return false; }
+
+ c = s.peek(); // check for offset
+ if (c == '+' || c == '-')
+ {
+ S32 offset_sign = (c == '+') ? 1 : -1;
+ S32 offset_hours = 0;
+ S32 offset_minutes = 0;
+ S32 offset_in_seconds = 0;
+
+ s >> offset_hours;
+
+ c = s.get(); // skip the colon a get the minutes if there are any
+ if (c == ':')
+ {
+ s >> offset_minutes;
+ }
+
+ offset_in_seconds = (offset_hours * 60 + offset_sign * offset_minutes) * 60;
+ seconds_since_epoch -= offset_in_seconds;
+ }
+ else if (c != 'Z') { return false; } // skip the Z
mSecondsSinceEpoch = seconds_since_epoch;
return true;
diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp
index bd334a6654..d06d6baf85 100644
--- a/indra/llcommon/llerror.cpp
+++ b/indra/llcommon/llerror.cpp
@@ -954,7 +954,12 @@ namespace LLError
std::string class_name = className(site.mClassInfo);
std::string function_name = functionName(site.mFunction);
+#if LL_LINUX
+ // gross, but typeid comparison seems to always fail here with gcc4.1
+ if (0 != strcmp(site.mClassInfo.name(), typeid(NoClassInfo).name()))
+#else
if (site.mClassInfo != typeid(NoClassInfo))
+#endif // LL_LINUX
{
function_name = class_name + "::" + function_name;
}
@@ -1079,7 +1084,12 @@ namespace LLError
#if LL_WINDOWS
// DevStudio: __FUNCTION__ already includes the full class name
#else
+ #if LL_LINUX
+ // gross, but typeid comparison seems to always fail here with gcc4.1
+ if (0 != strcmp(site.mClassInfo.name(), typeid(NoClassInfo).name()))
+ #else
if (site.mClassInfo != typeid(NoClassInfo))
+ #endif // LL_LINUX
{
prefix << className(site.mClassInfo) << "::";
}
@@ -1225,17 +1235,32 @@ namespace LLError
char** LLCallStacks::sBuffer = NULL ;
S32 LLCallStacks::sIndex = 0 ;
+#define SINGLE_THREADED 1
+
class CallStacksLogLock
{
public:
CallStacksLogLock();
~CallStacksLogLock();
+
+#if SINGLE_THREADED
+ bool ok() const { return true; }
+#else
bool ok() const { return mOK; }
private:
bool mLocked;
bool mOK;
+#endif
};
+#if SINGLE_THREADED
+ CallStacksLogLock::CallStacksLogLock()
+ {
+ }
+ CallStacksLogLock::~CallStacksLogLock()
+ {
+ }
+#else
CallStacksLogLock::CallStacksLogLock()
: mLocked(false), mOK(false)
{
@@ -1271,6 +1296,7 @@ namespace LLError
apr_thread_mutex_unlock(gCallStacksLogMutexp);
}
}
+#endif
//static
void LLCallStacks::push(const char* function, const int line)
diff --git a/indra/llcommon/llerror.h b/indra/llcommon/llerror.h
index 09812de2b8..e64ee5e081 100644
--- a/indra/llcommon/llerror.h
+++ b/indra/llcommon/llerror.h
@@ -179,7 +179,7 @@ namespace LLError
{ return s; }
// used to indicate the end of a message
- class NoClassInfo { };
+ class LL_COMMON_API NoClassInfo { };
// used to indicate no class info known for logging
//LLCallStacks keeps track of call stacks and output the call stacks to log file
diff --git a/indra/llcommon/lleventtimer.cpp b/indra/llcommon/lleventtimer.cpp
new file mode 100644
index 0000000000..d44e7ec1e6
--- /dev/null
+++ b/indra/llcommon/lleventtimer.cpp
@@ -0,0 +1,95 @@
+/**
+ * @file lleventtimer.cpp
+ * @brief Cross-platform objects for doing timing
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "lleventtimer.h"
+
+#include "u64.h"
+
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// LLEventTimer Implementation
+//
+//////////////////////////////////////////////////////////////////////////////
+
+LLEventTimer::LLEventTimer(F32 period)
+: mEventTimer()
+{
+ mPeriod = period;
+}
+
+LLEventTimer::LLEventTimer(const LLDate& time)
+: mEventTimer()
+{
+ mPeriod = (F32)(time.secondsSinceEpoch() - LLDate::now().secondsSinceEpoch());
+}
+
+
+LLEventTimer::~LLEventTimer()
+{
+}
+
+//static
+void LLEventTimer::updateClass()
+{
+ std::list<LLEventTimer*> completed_timers;
+
+ {
+ LLInstanceTrackerScopedGuard guard;
+ for (instance_iter iter = guard.beginInstances(); iter != guard.endInstances(); )
+ {
+ LLEventTimer& timer = *iter++;
+ F32 et = timer.mEventTimer.getElapsedTimeF32();
+ if (timer.mEventTimer.getStarted() && et > timer.mPeriod) {
+ timer.mEventTimer.reset();
+ if ( timer.tick() )
+ {
+ completed_timers.push_back( &timer );
+ }
+ }
+ }
+ }
+
+ if ( completed_timers.size() > 0 )
+ {
+ for (std::list<LLEventTimer*>::iterator completed_iter = completed_timers.begin();
+ completed_iter != completed_timers.end();
+ completed_iter++ )
+ {
+ delete *completed_iter;
+ }
+ }
+}
+
+
diff --git a/indra/llcommon/lleventtimer.h b/indra/llcommon/lleventtimer.h
new file mode 100644
index 0000000000..5181cce52d
--- /dev/null
+++ b/indra/llcommon/lleventtimer.h
@@ -0,0 +1,60 @@
+/**
+ * @file lleventtimer.h
+ * @brief Cross-platform objects for doing timing
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_EVENTTIMER_H
+#define LL_EVENTTIMER_H
+
+#include "stdtypes.h"
+#include "lldate.h"
+#include "llinstancetracker.h"
+#include "lltimer.h"
+
+// class for scheduling a function to be called at a given frequency (approximate, inprecise)
+class LL_COMMON_API LLEventTimer : protected LLInstanceTracker<LLEventTimer>
+{
+public:
+ LLEventTimer(F32 period); // period is the amount of time between each call to tick() in seconds
+ LLEventTimer(const LLDate& time);
+ virtual ~LLEventTimer();
+
+ //function to be called at the supplied frequency
+ // Normally return FALSE; TRUE will delete the timer after the function returns.
+ virtual BOOL tick() = 0;
+
+ static void updateClass();
+
+protected:
+ LLTimer mEventTimer;
+ F32 mPeriod;
+};
+
+#endif //LL_EVENTTIMER_H
diff --git a/indra/llcommon/llfasttimer.h b/indra/llcommon/llfasttimer.h
index 48461df6ae..840d09d970 100644
--- a/indra/llcommon/llfasttimer.h
+++ b/indra/llcommon/llfasttimer.h
@@ -36,6 +36,10 @@
// pull in the actual class definition
#include "llfasttimer_class.h"
+//
+// Important note: These implementations must be FAST!
+//
+
#if LL_WINDOWS
//
// Windows implementation of CPU clock
@@ -99,15 +103,17 @@ inline U64 LLFastTimer::getCPUClockCount64()
#endif
-#if LL_LINUX || LL_SOLARIS
+#if (LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__))
//
-// Linux and Solaris implementation of CPU clock - all architectures.
+// Linux and Solaris implementation of CPU clock - non-x86.
+// This is accurate but SLOW! Only use out of desperation.
//
// Try to use the MONOTONIC clock if available, this is a constant time counter
-// with nanosecond resolution (but not necessarily accuracy) and attempts are made
-// to synchronize this value between cores at kernel start. It should not be affected
-// by CPU frequency. If not available use the REALTIME clock, but this may be affected by
-// NTP adjustments or other user activity affecting the system time.
+// with nanosecond resolution (but not necessarily accuracy) and attempts are
+// made to synchronize this value between cores at kernel start. It should not
+// be affected by CPU frequency. If not available use the REALTIME clock, but
+// this may be affected by NTP adjustments or other user activity affecting
+// the system time.
inline U64 LLFastTimer::getCPUClockCount64()
{
struct timespec tp;
@@ -124,12 +130,12 @@ inline U32 LLFastTimer::getCPUClockCount32()
{
return (U32)(LLFastTimer::getCPUClockCount64() >> 8);
}
-#endif // (LL_LINUX || LL_SOLARIS))
+#endif // (LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__))
-#if (LL_DARWIN) && (defined(__i386__) || defined(__amd64__))
+#if (LL_LINUX || LL_SOLARIS || LL_DARWIN) && (defined(__i386__) || defined(__amd64__))
//
-// Mac x86 implementation of CPU clock
+// Mac+Linux+Solaris FAST x86 implementation of CPU clock
inline U32 LLFastTimer::getCPUClockCount32()
{
U64 x;
diff --git a/indra/llcommon/llfasttimer_class.cpp b/indra/llcommon/llfasttimer_class.cpp
index 6d8d81e114..dfbae09864 100644
--- a/indra/llcommon/llfasttimer_class.cpp
+++ b/indra/llcommon/llfasttimer_class.cpp
@@ -218,9 +218,10 @@ LLFastTimer::DeclareTimer::DeclareTimer(const std::string& name)
// static
void LLFastTimer::DeclareTimer::updateCachedPointers()
{
+ DeclareTimer::LLInstanceTrackerScopedGuard guard;
// propagate frame state pointers to timer declarations
- for (DeclareTimer::instance_iter it = DeclareTimer::beginInstances();
- it != DeclareTimer::endInstances();
+ for (DeclareTimer::instance_iter it = guard.beginInstances();
+ it != guard.endInstances();
++it)
{
// update cached pointer
@@ -229,17 +230,18 @@ void LLFastTimer::DeclareTimer::updateCachedPointers()
}
//static
-#if LL_LINUX || LL_SOLARIS || ( LL_DARWIN && !(defined(__i386__) || defined(__amd64__)) )
+#if (LL_DARWIN || LL_LINUX || LL_SOLARIS) && !(defined(__i386__) || defined(__amd64__))
U64 LLFastTimer::countsPerSecond() // counts per second for the *32-bit* timer
{
return sClockResolution >> 8;
}
-#else // windows or x86-mac
+#else // windows or x86-mac or x86-linux or x86-solaris
U64 LLFastTimer::countsPerSecond() // counts per second for the *32-bit* timer
{
- static U64 sCPUClockFrequency = U64(CProcessor().GetCPUFrequency(50));
+ //getCPUFrequency returns MHz and sCPUClockFrequency wants to be in Hz
+ static U64 sCPUClockFrequency = U64(LLProcessorInfo().getCPUFrequency()*1000000.0);
- // we drop the low-order byte in out timers, so report a lower frequency
+ // we drop the low-order byte in our timers, so report a lower frequency
return sCPUClockFrequency >> 8;
}
#endif
@@ -371,20 +373,23 @@ void LLFastTimer::NamedTimer::buildHierarchy()
if (sCurFrameIndex < 0 ) return;
// set up initial tree
- for (instance_iter it = NamedTimer::beginInstances();
- it != endInstances();
- ++it)
{
- NamedTimer& timer = *it;
- if (&timer == NamedTimerFactory::instance().getRootTimer()) continue;
-
- // bootstrap tree construction by attaching to last timer to be on stack
- // when this timer was called
- if (timer.getFrameState().mLastCaller && timer.mParent == NamedTimerFactory::instance().getRootTimer())
+ NamedTimer::LLInstanceTrackerScopedGuard guard;
+ for (instance_iter it = guard.beginInstances();
+ it != guard.endInstances();
+ ++it)
{
- timer.setParent(timer.getFrameState().mLastCaller->mTimer);
- // no need to push up tree on first use, flag can be set spuriously
- timer.getFrameState().mMoveUpTree = false;
+ NamedTimer& timer = *it;
+ if (&timer == NamedTimerFactory::instance().getRootTimer()) continue;
+
+ // bootstrap tree construction by attaching to last timer to be on stack
+ // when this timer was called
+ if (timer.getFrameState().mLastCaller && timer.mParent == NamedTimerFactory::instance().getRootTimer())
+ {
+ timer.setParent(timer.getFrameState().mLastCaller->mTimer);
+ // no need to push up tree on first use, flag can be set spuriously
+ timer.getFrameState().mMoveUpTree = false;
+ }
}
}
@@ -486,18 +491,21 @@ void LLFastTimer::NamedTimer::resetFrame()
F64 total_time = 0;
LLSD sd;
- for (NamedTimer::instance_iter it = NamedTimer::beginInstances();
- it != NamedTimer::endInstances();
- ++it)
{
- NamedTimer& timer = *it;
- FrameState& info = timer.getFrameState();
- sd[timer.getName()]["Time"] = (LLSD::Real) (info.mSelfTimeCounter*iclock_freq);
- sd[timer.getName()]["Calls"] = (LLSD::Integer) info.mCalls;
-
- // computing total time here because getting the root timer's getCountHistory
- // doesn't work correctly on the first frame
- total_time = total_time + info.mSelfTimeCounter * iclock_freq;
+ NamedTimer::LLInstanceTrackerScopedGuard guard;
+ for (NamedTimer::instance_iter it = guard.beginInstances();
+ it != guard.endInstances();
+ ++it)
+ {
+ NamedTimer& timer = *it;
+ FrameState& info = timer.getFrameState();
+ sd[timer.getName()]["Time"] = (LLSD::Real) (info.mSelfTimeCounter*iclock_freq);
+ sd[timer.getName()]["Calls"] = (LLSD::Integer) info.mCalls;
+
+ // computing total time here because getting the root timer's getCountHistory
+ // doesn't work correctly on the first frame
+ total_time = total_time + info.mSelfTimeCounter * iclock_freq;
+ }
}
sd["Total"]["Time"] = (LLSD::Real) total_time;
@@ -531,21 +539,24 @@ void LLFastTimer::NamedTimer::resetFrame()
DeclareTimer::updateCachedPointers();
// reset for next frame
- for (NamedTimer::instance_iter it = NamedTimer::beginInstances();
- it != NamedTimer::endInstances();
- ++it)
{
- NamedTimer& timer = *it;
-
- FrameState& info = timer.getFrameState();
- info.mSelfTimeCounter = 0;
- info.mCalls = 0;
- info.mLastCaller = NULL;
- info.mMoveUpTree = false;
- // update parent pointer in timer state struct
- if (timer.mParent)
+ NamedTimer::LLInstanceTrackerScopedGuard guard;
+ for (NamedTimer::instance_iter it = guard.beginInstances();
+ it != guard.endInstances();
+ ++it)
{
- info.mParent = &timer.mParent->getFrameState();
+ NamedTimer& timer = *it;
+
+ FrameState& info = timer.getFrameState();
+ info.mSelfTimeCounter = 0;
+ info.mCalls = 0;
+ info.mLastCaller = NULL;
+ info.mMoveUpTree = false;
+ // update parent pointer in timer state struct
+ if (timer.mParent)
+ {
+ info.mParent = &timer.mParent->getFrameState();
+ }
}
}
@@ -575,20 +586,23 @@ void LLFastTimer::NamedTimer::reset()
}
// reset all history
- for (NamedTimer::instance_iter it = NamedTimer::beginInstances();
- it != NamedTimer::endInstances();
- ++it)
{
- NamedTimer& timer = *it;
- if (&timer != NamedTimerFactory::instance().getRootTimer())
+ NamedTimer::LLInstanceTrackerScopedGuard guard;
+ for (NamedTimer::instance_iter it = guard.beginInstances();
+ it != guard.endInstances();
+ ++it)
{
- timer.setParent(NamedTimerFactory::instance().getRootTimer());
+ NamedTimer& timer = *it;
+ if (&timer != NamedTimerFactory::instance().getRootTimer())
+ {
+ timer.setParent(NamedTimerFactory::instance().getRootTimer());
+ }
+
+ timer.mCountAverage = 0;
+ timer.mCallAverage = 0;
+ memset(timer.mCountHistory, 0, sizeof(U32) * HISTORY_NUM);
+ memset(timer.mCallHistory, 0, sizeof(U32) * HISTORY_NUM);
}
-
- timer.mCountAverage = 0;
- timer.mCallAverage = 0;
- memset(timer.mCountHistory, 0, sizeof(U32) * HISTORY_NUM);
- memset(timer.mCallHistory, 0, sizeof(U32) * HISTORY_NUM);
}
sLastFrameIndex = 0;
diff --git a/indra/llcommon/llinstancetracker.cpp b/indra/llcommon/llinstancetracker.cpp
new file mode 100644
index 0000000000..c962cb5be1
--- /dev/null
+++ b/indra/llcommon/llinstancetracker.cpp
@@ -0,0 +1,20 @@
+/**
+ * @file lllinstancetracker.cpp
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * Copyright (c) 2009, Linden Research, Inc.
+ * $/LicenseInfo$
+ */
+
+// Precompiled header
+#include "linden_common.h"
+// associated header
+#include "llinstancetracker.h"
+// STL headers
+// std headers
+// external library headers
+// other Linden headers
+
+// llinstancetracker.h is presently header-only. This file exists only because our CMake
+// test macro ADD_BUILD_TEST requires it.
+int dummy = 0;
diff --git a/indra/llcommon/llinstancetracker.h b/indra/llcommon/llinstancetracker.h
index 11fe523651..9df7998273 100644
--- a/indra/llcommon/llinstancetracker.h
+++ b/indra/llcommon/llinstancetracker.h
@@ -98,7 +98,10 @@ private:
mKey = key;
getMap_()[key] = static_cast<T*>(this);
}
- void remove_() { getMap_().erase(mKey); }
+ void remove_()
+ {
+ getMap_().erase(mKey);
+ }
static InstanceMap& getMap_()
{
@@ -129,31 +132,65 @@ public:
/// for completeness of analogy with the generic implementation
static T* getInstance(T* k) { return k; }
- static key_iter beginKeys() { return getSet_().begin(); }
- static key_iter endKeys() { return getSet_().end(); }
- static instance_iter beginInstances() { return instance_iter(getSet_().begin()); }
- static instance_iter endInstances() { return instance_iter(getSet_().end()); }
static S32 instanceCount() { return getSet_().size(); }
+ // Instantiate this to get access to iterators for this type. It's a 'guard' in the sense
+ // that it treats deletes of this type as errors as long as there is an instance of
+ // this class alive in scope somewhere (i.e. deleting while iterating is bad).
+ class LLInstanceTrackerScopedGuard
+ {
+ public:
+ LLInstanceTrackerScopedGuard()
+ {
+ ++sIterationNestDepth;
+ }
+
+ ~LLInstanceTrackerScopedGuard()
+ {
+ --sIterationNestDepth;
+ }
+
+ static instance_iter beginInstances() { return instance_iter(getSet_().begin()); }
+ static instance_iter endInstances() { return instance_iter(getSet_().end()); }
+ static key_iter beginKeys() { return getSet_().begin(); }
+ static key_iter endKeys() { return getSet_().end(); }
+ };
+
protected:
- LLInstanceTracker() { getSet_().insert(static_cast<T*>(this)); }
- virtual ~LLInstanceTracker() { getSet_().erase(static_cast<T*>(this)); }
+ LLInstanceTracker()
+ {
+ // it's safe but unpredictable to create instances of this type while all instances are being iterated over. I hate unpredictable. This assert will probably be turned on early in the next development cycle.
+ //llassert(sIterationNestDepth == 0);
+ getSet_().insert(static_cast<T*>(this));
+ }
+ virtual ~LLInstanceTracker()
+ {
+ // it's unsafe to delete instances of this type while all instances are being iterated over.
+ llassert(sIterationNestDepth == 0);
+ getSet_().erase(static_cast<T*>(this));
+ }
- LLInstanceTracker(const LLInstanceTracker& other) { getSet_().insert(static_cast<T*>(this)); }
+ LLInstanceTracker(const LLInstanceTracker& other)
+ {
+ //llassert(sIterationNestDepth == 0);
+ getSet_().insert(static_cast<T*>(this));
+ }
- static InstanceSet& getSet_() // called after getReady() but before go()
- {
- if (! sInstances)
- {
- sInstances = new InstanceSet;
- }
- return *sInstances;
- }
+ static InstanceSet& getSet_()
+ {
+ if (! sInstances)
+ {
+ sInstances = new InstanceSet;
+ }
+ return *sInstances;
+ }
static InstanceSet* sInstances;
+ static S32 sIterationNestDepth;
};
template <typename T, typename KEY> typename LLInstanceTracker<T, KEY>::InstanceMap* LLInstanceTracker<T, KEY>::sInstances = NULL;
template <typename T> typename LLInstanceTracker<T, T*>::InstanceSet* LLInstanceTracker<T, T*>::sInstances = NULL;
+template <typename T> S32 LLInstanceTracker<T, T*>::sIterationNestDepth = 0;
#endif
diff --git a/indra/llcommon/lllivefile.cpp b/indra/llcommon/lllivefile.cpp
index effda6c49c..5ca90d82ba 100644
--- a/indra/llcommon/lllivefile.cpp
+++ b/indra/llcommon/lllivefile.cpp
@@ -33,7 +33,7 @@
#include "lllivefile.h"
#include "llframetimer.h"
-#include "lltimer.h"
+#include "lleventtimer.h"
const F32 DEFAULT_CONFIG_FILE_REFRESH = 5.0f;
diff --git a/indra/llcommon/llprocessor.cpp b/indra/llcommon/llprocessor.cpp
index 8a4a4a8f9a..d3ba215751 100644
--- a/indra/llcommon/llprocessor.cpp
+++ b/indra/llcommon/llprocessor.cpp
@@ -30,130 +30,389 @@
* $/LicenseInfo$
*/
-// Filename: Processor.cpp
-// =======================
-// Author: Benjamin Jurke
-// File history: 27.02.2002 - File created. Support for Intel and AMD processors
-// 05.03.2002 - Fixed the CPUID bug: On Pre-Pentium CPUs the CPUID
-// command is not available
-// - The CProcessor::WriteInfoTextFile function do not
-// longer use Win32 file functions (-> os independend)
-// - Optional include of the windows.h header which is
-// still need for CProcessor::GetCPUFrequency.
-// 06.03.2002 - My birthday (18th :-))
-// - Replaced the '\r\n' line endings in function
-// CProcessor::CPUInfoToText by '\n'
-// - Replaced unsigned __int64 by signed __int64 for
-// solving some compiler conversion problems
-// - Fixed a bug at family=6, model=6 (Celeron -> P2)
-//////////////////////////////////////////////////////////////////////////////////
-
#include "linden_common.h"
+#include "llprocessor.h"
-#include "processor.h"
+#include "llerror.h"
-#include <memory>
+//#include <memory>
#if LL_WINDOWS
# define WIN32_LEAN_AND_MEAN
# include <winsock2.h>
# include <windows.h>
+# define _interlockedbittestandset _renamed_interlockedbittestandset
+# define _interlockedbittestandreset _renamed_interlockedbittestandreset
+# include <intrin.h>
+# undef _interlockedbittestandset
+# undef _interlockedbittestandreset
#endif
-#if !LL_DARWIN && !LL_SOLARIS
-
-#ifdef PROCESSOR_FREQUENCY_MEASURE_AVAILABLE
-// We need the QueryPerformanceCounter and Sleep functions
-#define FORCEINLINE __forceinline
-#else
-#define FORCEINLINE
+#include "llsd.h"
+
+#if LL_MSVC && _M_X64
+# define LL_X86_64 1
+# define LL_X86 1
+#elif LL_MSVC && _M_IX86
+# define LL_X86 1
+#elif LL_GNUC && ( defined(__amd64__) || defined(__x86_64__) )
+# define LL_X86_64 1
+# define LL_X86 1
+#elif LL_GNUC && ( defined(__i386__) )
+# define LL_X86 1
+#elif LL_GNUC && ( defined(__powerpc__) || defined(__ppc__) )
+# define LL_PPC 1
#endif
+class LLProcessorInfoImpl; // foward declaration for the mImpl;
+
+namespace
+{
+ enum cpu_info
+ {
+ eBrandName = 0,
+ eFrequency,
+ eVendor,
+ eStepping,
+ eFamily,
+ eExtendedFamily,
+ eModel,
+ eExtendedModel,
+ eType,
+ eBrandID,
+ eFamilyName
+ };
+
+
+ const char* cpu_info_names[] =
+ {
+ "Processor Name",
+ "Frequency",
+ "Vendor",
+ "Stepping",
+ "Family",
+ "Extended Family",
+ "Model",
+ "Extended Model",
+ "Type",
+ "Brand ID",
+ "Family Name"
+ };
+
+ enum cpu_config
+ {
+ eMaxID,
+ eMaxExtID,
+ eCLFLUSHCacheLineSize,
+ eAPICPhysicalID,
+ eCacheLineSize,
+ eL2Associativity,
+ eCacheSizeK,
+ eFeatureBits,
+ eExtFeatureBits
+ };
+
+ const char* cpu_config_names[] =
+ {
+ "Max Supported CPUID level",
+ "Max Supported Ext. CPUID level",
+ "CLFLUSH cache line size",
+ "APIC Physical ID",
+ "Cache Line Size",
+ "L2 Associativity",
+ "Cache Size",
+ "Feature Bits",
+ "Ext. Feature Bits"
+ };
+
+
+
+ // *NOTE:Mani - this contains the elements we reference directly and extensions beyond the first 32.
+ // The rest of the names are referenced by bit maks returned from cpuid.
+ enum cpu_features
+ {
+ eSSE_Ext=25,
+ eSSE2_Ext=26,
+
+ eSSE3_Features=32,
+ eMONTIOR_MWAIT=33,
+ eCPLDebugStore=34,
+ eThermalMonitor2=35,
+ eAltivec=36
+ };
+
+ const char* cpu_feature_names[] =
+ {
+ "x87 FPU On Chip",
+ "Virtual-8086 Mode Enhancement",
+ "Debugging Extensions",
+ "Page Size Extensions",
+ "Time Stamp Counter",
+ "RDMSR and WRMSR Support",
+ "Physical Address Extensions",
+ "Machine Check Exception",
+ "CMPXCHG8B Instruction",
+ "APIC On Chip",
+ "Unknown1",
+ "SYSENTER and SYSEXIT",
+ "Memory Type Range Registers",
+ "PTE Global Bit",
+ "Machine Check Architecture",
+ "Conditional Move/Compare Instruction",
+ "Page Attribute Table",
+ "Page Size Extension",
+ "Processor Serial Number",
+ "CFLUSH Extension",
+ "Unknown2",
+ "Debug Store",
+ "Thermal Monitor and Clock Ctrl",
+ "MMX Technology",
+ "FXSAVE/FXRSTOR",
+ "SSE Extensions",
+ "SSE2 Extensions",
+ "Self Snoop",
+ "Hyper-threading Technology",
+ "Thermal Monitor",
+ "Unknown4",
+ "Pend. Brk. EN.", // 31 End of FeatureInfo bits
+
+ "SSE3 New Instructions", // 32
+ "MONITOR/MWAIT",
+ "CPL Qualified Debug Store",
+ "Thermal Monitor 2",
+
+ "Altivec"
+ };
+
+ std::string intel_CPUFamilyName(int composed_family)
+ {
+ switch(composed_family)
+ {
+ case 3: return "Intel i386";
+ case 4: return "Intel i486";
+ case 5: return "Intel Pentium";
+ case 6: return "Intel Pentium Pro/2/3, Core";
+ case 7: return "Intel Itanium (IA-64)";
+ case 0xF: return "Intel Pentium 4";
+ case 0x10: return "Intel Itanium 2 (IA-64)";
+ }
+ return "Unknown";
+ }
+
+ std::string amd_CPUFamilyName(int composed_family)
+ {
+ switch(composed_family)
+ {
+ case 4: return "AMD 80486/5x86";
+ case 5: return "AMD K5/K6";
+ case 6: return "AMD K7";
+ case 0xF: return "AMD K8";
+ case 0x10: return "AMD K8L";
+ }
+ return "Unknown";
+ }
+
+ std::string compute_CPUFamilyName(const char* cpu_vendor, int composed_family)
+ {
+ const char* intel_string = "GenuineIntel";
+ const char* amd_string = "AuthenticAMD";
+ if(!strncmp(cpu_vendor, intel_string, strlen(intel_string)))
+ {
+ return intel_CPUFamilyName(composed_family);
+ }
+ else if(!strncmp(cpu_vendor, amd_string, strlen(amd_string)))
+ {
+ return amd_CPUFamilyName(composed_family);
+ }
+ return "Unknown";
+ }
+
+ std::string compute_CPUFamilyName(const char* cpu_vendor, int family, int ext_family)
+ {
+ const char* intel_string = "GenuineIntel";
+ const char* amd_string = "AuthenticAMD";
+ if(!strncmp(cpu_vendor, intel_string, strlen(intel_string)))
+ {
+ U32 composed_family = family + ext_family;
+ return intel_CPUFamilyName(composed_family);
+ }
+ else if(!strncmp(cpu_vendor, amd_string, strlen(amd_string)))
+ {
+ U32 composed_family = (family == 0xF)
+ ? family + ext_family
+ : family;
+ return amd_CPUFamilyName(composed_family);
+ }
+ return "Unknown";
+ }
+
+} // end unnamed namespace
+
+// The base class for implementations.
+// Each platform should override this class.
+class LLProcessorInfoImpl
+{
+public:
+ LLProcessorInfoImpl()
+ {
+ mProcessorInfo["info"] = LLSD::emptyMap();
+ mProcessorInfo["config"] = LLSD::emptyMap();
+ mProcessorInfo["extension"] = LLSD::emptyMap();
+ }
+ virtual ~LLProcessorInfoImpl() {}
+
+ F64 getCPUFrequency() const
+ {
+ return getInfo(eFrequency, 0).asReal();
+ }
+
+ bool hasSSE() const
+ {
+ return hasExtension(cpu_feature_names[eSSE_Ext]);
+ }
+
+ bool hasSSE2() const
+ {
+ return hasExtension(cpu_feature_names[eSSE2_Ext]);
+ }
+
+ bool hasAltivec() const
+ {
+ return hasExtension("Altivec");
+ }
-// Some macros we often need
-////////////////////////////
-#define CheckBit(var, bit) ((var & (1 << bit)) ? true : false)
+ std::string getCPUFamilyName() const { return getInfo(eFamilyName, "Unknown").asString(); }
+ std::string getCPUBrandName() const { return getInfo(eBrandName, "Unknown").asString(); }
+
+ // This is virtual to support a different linux format.
+ // *NOTE:Mani - I didn't want to screw up server use of this data...
+ virtual std::string getCPUFeatureDescription() const
+ {
+ std::ostringstream out;
+ out << std::endl << std::endl;
+ out << "// CPU General Information" << std::endl;
+ out << "//////////////////////////" << std::endl;
+ out << "Processor Name: " << getCPUBrandName() << std::endl;
+ out << "Frequency: " << getCPUFrequency() << " MHz" << std::endl;
+ out << "Vendor: " << getInfo(eVendor, "Unknown").asString() << std::endl;
+ out << "Family: " << getCPUFamilyName() << " (" << getInfo(eFamily, 0) << ")" << std::endl;
+ out << "Extended family: " << getInfo(eExtendedFamily, 0) << std::endl;
+ out << "Model: " << getInfo(eModel, 0) << std::endl;
+ out << "Extended model: " << getInfo(eExtendedModel, 0) << std::endl;
+ out << "Type: " << getInfo(eType, 0) << std::endl;
+ out << "Brand ID: " << getInfo(eBrandID, 0) << std::endl;
+ out << std::endl;
+ out << "// CPU Configuration" << std::endl;
+ out << "//////////////////////////" << std::endl;
+
+ // Iterate through the dictionary of configuration options.
+ LLSD configs = mProcessorInfo["config"];
+ for(LLSD::map_const_iterator cfgItr = configs.beginMap(); cfgItr != configs.endMap(); ++cfgItr)
+ {
+ out << cfgItr->first << " = " << cfgItr->second << std::endl;
+ }
+ out << std::endl;
+
+ out << "// CPU Extensions" << std::endl;
+ out << "//////////////////////////" << std::endl;
+
+ for(LLSD::map_const_iterator itr = mProcessorInfo["extension"].beginMap(); itr != mProcessorInfo["extension"].endMap(); ++itr)
+ {
+ out << " " << itr->first << std::endl;
+ }
+ return out.str();
+ }
+
+protected:
+ void setInfo(cpu_info info_type, const LLSD& value)
+ {
+ setInfo(cpu_info_names[info_type], value);
+ }
+ LLSD getInfo(cpu_info info_type, const LLSD& defaultVal) const
+ {
+ return getInfo(cpu_info_names[info_type], defaultVal);
+ }
+
+ void setConfig(cpu_config config_type, const LLSD& value)
+ {
+ setConfig(cpu_config_names[config_type], value);
+ }
+ LLSD getConfig(cpu_config config_type, const LLSD& defaultVal) const
+ {
+ return getConfig(cpu_config_names[config_type], defaultVal);
+ }
+
+ void setExtension(const std::string& name) { mProcessorInfo["extension"][name] = "true"; }
+ bool hasExtension(const std::string& name) const
+ {
+ return mProcessorInfo["extension"].has(name);
+ }
+
+private:
+ void setInfo(const std::string& name, const LLSD& value) { mProcessorInfo["info"][name]=value; }
+ LLSD getInfo(const std::string& name, const LLSD& defaultVal) const
+ {
+ if(mProcessorInfo["info"].has(name))
+ {
+ return mProcessorInfo["info"][name];
+ }
+ return defaultVal;
+ }
+ void setConfig(const std::string& name, const LLSD& value) { mProcessorInfo["config"][name]=value; }
+ LLSD getConfig(const std::string& name, const LLSD& defaultVal) const
+ {
+ LLSD r = mProcessorInfo["config"].get(name);
+ return r.isDefined() ? r : defaultVal;
+ }
+
+private:
+
+ LLSD mProcessorInfo;
+};
+
+
+#ifdef LL_MSVC
+// LL_MSVC and not LLWINDOWS because some of the following code
+// uses the MSVC compiler intrinsics __cpuid() and __rdtsc().
-#ifdef PROCESSOR_FREQUENCY_MEASURE_AVAILABLE
// Delays for the specified amount of milliseconds
-static void _Delay(unsigned int ms)
+static void _Delay(unsigned int ms)
{
- LARGE_INTEGER freq, c1, c2;
- __int64 x;
+ LARGE_INTEGER freq, c1, c2;
+ __int64 x;
- // Get High-Res Timer frequency
+ // Get High-Res Timer frequency
if (!QueryPerformanceFrequency(&freq))
return;
-
+
// Convert ms to High-Res Timer value
x = freq.QuadPart/1000*ms;
- // Get first snapshot of High-Res Timer value
+ // Get first snapshot of High-Res Timer value
QueryPerformanceCounter(&c1);
do
{
- // Get second snapshot
- QueryPerformanceCounter(&c2);
+ // Get second snapshot
+ QueryPerformanceCounter(&c2);
}while(c2.QuadPart-c1.QuadPart < x);
// Loop while (second-first < x)
}
-#endif
-
-// CProcessor::CProcessor
-// ======================
-// Class constructor:
-/////////////////////////
-CProcessor::CProcessor()
-{
- uqwFrequency = 0;
- strCPUName[0] = 0;
- memset(&CPUInfo, 0, sizeof(CPUInfo));
-}
-// unsigned __int64 CProcessor::GetCPUFrequency(unsigned int uiMeasureMSecs)
-// =========================================================================
-// Function to measure the current CPU frequency
-////////////////////////////////////////////////////////////////////////////
-F64 CProcessor::GetCPUFrequency(unsigned int uiMeasureMSecs)
+static F64 calculate_cpu_frequency(U32 measure_msecs)
{
-#ifndef PROCESSOR_FREQUENCY_MEASURE_AVAILABLE
- return 0;
-#else
- // If there are invalid measure time parameters, zero msecs for example,
- // we've to exit the function
- if (uiMeasureMSecs < 1)
+ if(measure_msecs == 0)
{
- // If theres already a measured frequency available, we return it
- if (uqwFrequency > 0)
- return uqwFrequency;
- else
- return 0;
- }
-
- // Now we check if the CPUID command is available
- if (!CheckCPUIDPresence())
return 0;
-
- // First we get the CPUID standard level 0x00000001
- unsigned long reg;
- __asm
- {
- mov eax, 1
- cpuid
- mov reg, edx
}
- // Then we check, if the RDTSC (Real Date Time Stamp Counter) is available.
- // This function is necessary for our measure process.
- if (!(reg & (1 << 4)))
- return 0;
-
// After that we declare some vars and check the frequency of the high
// resolution timer for the measure process.
- // If there's no high-res timer, we exit.
- __int64 starttime, endtime, timedif, freq, start, end, dif;
+ // If there"s no high-res timer, we exit.
+ unsigned __int64 starttime, endtime, timedif, freq, start, end, dif;
if (!QueryPerformanceFrequency((LARGE_INTEGER *) &freq))
+ {
return 0;
+ }
// Now we can init the measure process. We set the process and thread priority
// to the highest available level (Realtime priority). Also we focus the
@@ -169,35 +428,27 @@ F64 CProcessor::GetCPUFrequency(unsigned int uiMeasureMSecs)
SetThreadPriority(hThread, THREAD_PRIORITY_TIME_CRITICAL);
SetProcessAffinityMask(hProcess, dwNewMask);
- // Now we call a CPUID to ensure, that all other prior called functions are
- // completed now (serialization)
- __asm cpuid
+ //// Now we call a CPUID to ensure, that all other prior called functions are
+ //// completed now (serialization)
+ //__asm cpuid
+ int cpu_info[4] = {-1};
+ __cpuid(cpu_info, 0);
// We ask the high-res timer for the start time
QueryPerformanceCounter((LARGE_INTEGER *) &starttime);
// Then we get the current cpu clock and store it
- __asm
- {
- rdtsc
- mov dword ptr [start+4], edx
- mov dword ptr [start], eax
- }
+ start = __rdtsc();
// Now we wart for some msecs
- _Delay(uiMeasureMSecs);
-// Sleep(uiMeasureMSecs);
+ _Delay(measure_msecs);
+ // Sleep(uiMeasureMSecs);
// We ask for the end time
QueryPerformanceCounter((LARGE_INTEGER *) &endtime);
// And also for the end cpu clock
- __asm
- {
- rdtsc
- mov dword ptr [end+4], edx
- mov dword ptr [end], eax
- }
+ end = __rdtsc();
// Now we can restore the default process and thread priorities
SetProcessAffinityMask(hProcess, dwProcessMask);
@@ -210,2075 +461,433 @@ F64 CProcessor::GetCPUFrequency(unsigned int uiMeasureMSecs)
// And finally the frequency is the clock difference divided by the time
// difference.
- uqwFrequency = (F64)dif / (((F64)timedif) / freq);
+ F64 frequency = (F64)dif / (((F64)timedif) / freq);
// At last we just return the frequency that is also stored in the call
- // member var uqwFrequency
- return uqwFrequency;
-#endif
+ // member var uqwFrequency - converted to MHz
+ return frequency / (F64)1000000;
}
-// bool CProcessor::AnalyzeIntelProcessor()
-// ========================================
-// Private class function for analyzing an Intel processor
-//////////////////////////////////////////////////////////
-bool CProcessor::AnalyzeIntelProcessor()
+// Windows implementation
+class LLProcessorInfoWindowsImpl : public LLProcessorInfoImpl
{
-#if LL_WINDOWS
- unsigned long eaxreg, ebxreg, edxreg;
-
- // First we check if the CPUID command is available
- if (!CheckCPUIDPresence())
- return false;
-
- // Now we get the CPUID standard level 0x00000001
- __asm
+public:
+ LLProcessorInfoWindowsImpl()
{
- mov eax, 1
- cpuid
- mov eaxreg, eax
- mov ebxreg, ebx
- mov edxreg, edx
+ getCPUIDInfo();
+ setInfo(eFrequency, calculate_cpu_frequency(50));
}
-
- // Then get the cpu model, family, type, stepping and brand id by masking
- // the eax and ebx register
- CPUInfo.uiStepping = eaxreg & 0xF;
- CPUInfo.uiModel = (eaxreg >> 4) & 0xF;
- CPUInfo.uiFamily = (eaxreg >> 8) & 0xF;
- CPUInfo.uiType = (eaxreg >> 12) & 0x3;
- CPUInfo.uiBrandID = ebxreg & 0xF;
-
- static const char* INTEL_BRAND[] =
- {
- /* 0x00 */ "",
- /* 0x01 */ "0.18 micron Intel Celeron",
- /* 0x02 */ "0.18 micron Intel Pentium III",
- /* 0x03 */ "0.13 micron Intel Celeron",
- /* 0x04 */ "0.13 micron Intel Pentium III",
- /* 0x05 */ "",
- /* 0x06 */ "0.13 micron Intel Pentium III Mobile",
- /* 0x07 */ "0.13 micron Intel Celeron Mobile",
- /* 0x08 */ "0.18 micron Intel Pentium 4",
- /* 0x09 */ "0.13 micron Intel Pentium 4",
- /* 0x0A */ "0.13 micron Intel Celeron",
- /* 0x0B */ "0.13 micron Intel Pentium 4 Xeon",
- /* 0x0C */ "Intel Xeon MP",
- /* 0x0D */ "",
- /* 0x0E */ "0.18 micron Intel Pentium 4 Xeon",
- /* 0x0F */ "Mobile Intel Celeron",
- /* 0x10 */ "",
- /* 0x11 */ "Mobile Genuine Intel",
- /* 0x12 */ "Intel Celeron M",
- /* 0x13 */ "Mobile Intel Celeron",
- /* 0x14 */ "Intel Celeron",
- /* 0x15 */ "Mobile Genuine Intel",
- /* 0x16 */ "Intel Pentium M",
- /* 0x17 */ "Mobile Intel Celeron",
- };
- // Only override the brand if we have it in the lookup table. We should
- // already have a string here from GetCPUInfo(). JC
- if ( CPUInfo.uiBrandID < LL_ARRAY_SIZE(INTEL_BRAND) )
+private:
+ void getCPUIDInfo()
{
- strncpy(CPUInfo.strBrandID, INTEL_BRAND[CPUInfo.uiBrandID], sizeof(CPUInfo.strBrandID)-1);
- CPUInfo.strBrandID[sizeof(CPUInfo.strBrandID)-1]='\0';
+ // http://msdn.microsoft.com/en-us/library/hskdteyh(VS.80).aspx
- if (CPUInfo.uiBrandID == 3 && CPUInfo.uiModel == 6)
+ // __cpuid with an InfoType argument of 0 returns the number of
+ // valid Ids in cpu_info[0] and the CPU identification string in
+ // the other three array elements. The CPU identification string is
+ // not in linear order. The code below arranges the information
+ // in a human readable form.
+ int cpu_info[4] = {-1};
+ __cpuid(cpu_info, 0);
+ unsigned int ids = (unsigned int)cpu_info[0];
+ setConfig(eMaxID, (S32)ids);
+
+ char cpu_vendor[0x20];
+ memset(cpu_vendor, 0, sizeof(cpu_vendor));
+ *((int*)cpu_vendor) = cpu_info[1];
+ *((int*)(cpu_vendor+4)) = cpu_info[3];
+ *((int*)(cpu_vendor+8)) = cpu_info[2];
+ setInfo(eVendor, cpu_vendor);
+
+ // Get the information associated with each valid Id
+ for(unsigned int i=0; i<=ids; ++i)
{
- strcpy(CPUInfo.strBrandID, "0.18 micron Intel Pentium III Xeon");
- }
- }
+ __cpuid(cpu_info, i);
- // Then we translate the cpu family
- switch (CPUInfo.uiFamily)
- {
- case 3: // Family = 3: i386 (80386) processor family
- strcpy(CPUInfo.strFamily, "Intel i386"); /* Flawfinder: ignore */
- break;
- case 4: // Family = 4: i486 (80486) processor family
- strcpy(CPUInfo.strFamily, "Intel i486"); /* Flawfinder: ignore */
- break;
- case 5: // Family = 5: Pentium (80586) processor family
- strcpy(CPUInfo.strFamily, "Intel Pentium"); /* Flawfinder: ignore */
- break;
- case 6: // Family = 6: Pentium Pro (80686) processor family
- strcpy(CPUInfo.strFamily, "Intel Pentium Pro/2/3, Core"); /* Flawfinder: ignore */
- break;
- case 15: // Family = 15: Extended family specific
- // Masking the extended family
- CPUInfo.uiExtendedFamily = (eaxreg >> 20) & 0xFF;
- switch (CPUInfo.uiExtendedFamily)
- {
- case 0: // Family = 15, Ext. Family = 0: Pentium 4 (80786 ??) processor family
- strcpy(CPUInfo.strFamily, "Intel Pentium 4"); /* Flawfinder: ignore */
- break;
- case 1: // Family = 15, Ext. Family = 1: McKinley (64-bit) processor family
- strcpy(CPUInfo.strFamily, "Intel McKinley (IA-64)"); /* Flawfinder: ignore */
- break;
- default: // Sure is sure
- strcpy(CPUInfo.strFamily, "Unknown Intel Pentium 4+"); /* Flawfinder: ignore */
- break;
- }
- break;
- default: // Failsave
- strcpy(CPUInfo.strFamily, "Unknown"); /* Flawfinder: ignore */
- break;
- }
-
- // Now we come to the big deal, the exact model name
- switch (CPUInfo.uiFamily)
- {
- case 3: // i386 (80386) processor family
- strcpy(CPUInfo.strModel, "Unknown Intel i386"); /* Flawfinder: ignore */
- strncat(strCPUName, "Intel i386", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */
- break;
- case 4: // i486 (80486) processor family
- switch (CPUInfo.uiModel)
- {
- case 0: // Model = 0: i486 DX-25/33 processor model
- strcpy(CPUInfo.strModel, "Intel i486 DX-25/33"); /* Flawfinder: ignore */
- strncat(strCPUName, "Intel i486 DX-25/33", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */
- break;
- case 1: // Model = 1: i486 DX-50 processor model
- strcpy(CPUInfo.strModel, "Intel i486 DX-50"); /* Flawfinder: ignore */
- strncat(strCPUName, "Intel i486 DX-50", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */
- break;
- case 2: // Model = 2: i486 SX processor model
- strcpy(CPUInfo.strModel, "Intel i486 SX"); /* Flawfinder: ignore */
- strncat(strCPUName, "Intel i486 SX", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */
- break;
- case 3: // Model = 3: i486 DX2 (with i487 numeric coprocessor) processor model
- strcpy(CPUInfo.strModel, "Intel i486 487/DX2"); /* Flawfinder: ignore */
- strncat(strCPUName, "Intel i486 DX2 with i487 numeric coprocessor", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */
- break;
- case 4: // Model = 4: i486 SL processor model (never heard ?!?)
- strcpy(CPUInfo.strModel, "Intel i486 SL"); /* Flawfinder: ignore */
- strncat(strCPUName, "Intel i486 SL", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */
- break;
- case 5: // Model = 5: i486 SX2 processor model
- strcpy(CPUInfo.strModel, "Intel i486 SX2"); /* Flawfinder: ignore */
- strncat(strCPUName, "Intel i486 SX2", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */
- break;
- case 7: // Model = 7: i486 write-back enhanced DX2 processor model
- strcpy(CPUInfo.strModel, "Intel i486 write-back enhanced DX2"); /* Flawfinder: ignore */
- strncat(strCPUName, "Intel i486 write-back enhanced DX2", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */
- break;
- case 8: // Model = 8: i486 DX4 processor model
- strcpy(CPUInfo.strModel, "Intel i486 DX4"); /* Flawfinder: ignore */
- strncat(strCPUName, "Intel i486 DX4", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */
- break;
- case 9: // Model = 9: i486 write-back enhanced DX4 processor model
- strcpy(CPUInfo.strModel, "Intel i486 write-back enhanced DX4"); /* Flawfinder: ignore */
- strncat(strCPUName, "Intel i486 DX4", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */
- break;
- default: // ...
- strcpy(CPUInfo.strModel, "Unknown Intel i486"); /* Flawfinder: ignore */
- strncat(strCPUName, "Intel i486 (Unknown model)", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */
- break;
- }
- break;
- case 5: // Pentium (80586) processor family
- switch (CPUInfo.uiModel)
- {
- case 0: // Model = 0: Pentium (P5 A-Step) processor model
- strcpy(CPUInfo.strModel, "Intel Pentium (P5 A-Step)"); /* Flawfinder: ignore */
- strncat(strCPUName, "Intel Pentium (P5 A-Step core)", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */
- break; // Famous for the DIV bug, as far as I know
- case 1: // Model = 1: Pentium 60/66 processor model
- strcpy(CPUInfo.strModel, "Intel Pentium 60/66 (P5)"); /* Flawfinder: ignore */
- strncat(strCPUName, "Intel Pentium 60/66 (P5 core)", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */
- break;
- case 2: // Model = 2: Pentium 75-200 (P54C) processor model
- strcpy(CPUInfo.strModel, "Intel Pentium 75-200 (P54C)"); /* Flawfinder: ignore */
- strncat(strCPUName, "Intel Pentium 75-200 (P54C core)", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */
- break;
- case 3: // Model = 3: Pentium overdrive for 486 systems processor model
- strcpy(CPUInfo.strModel, "Intel Pentium for 486 system (P24T Overdrive)"); /* Flawfinder: ignore */
- strncat(strCPUName, "Intel Pentium for 486 (P24T overdrive core)", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/
- break;
- case 4: // Model = 4: Pentium MMX processor model
- strcpy(CPUInfo.strModel, "Intel Pentium MMX (P55C)"); /*Flawfinder: ignore*/
- strncat(strCPUName, "Intel Pentium MMX (P55C core)", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/
- break;
- case 7: // Model = 7: Pentium processor model (don't know difference to Model=2)
- strcpy(CPUInfo.strModel, "Intel Pentium (P54C)"); /*Flawfinder: ignore*/
- strncat(strCPUName, "Intel Pentium (P54C core)", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/
- break;
- case 8: // Model = 8: Pentium MMX (0.25 micron) processor model
- strcpy(CPUInfo.strModel, "Intel Pentium MMX (P55C), 0.25 micron"); /*Flawfinder: ignore*/
- strncat(strCPUName, "Intel Pentium MMX (P55C core), 0.25 micron", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/
- break;
- default: // ...
- strcpy(CPUInfo.strModel, "Unknown Intel Pentium"); /*Flawfinder: ignore*/
- strncat(strCPUName, "Intel Pentium (Unknown P5-model)", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/
- break;
- }
- break;
- case 6: // Pentium Pro (80686) processor family
- switch (CPUInfo.uiModel)
- {
- case 0: // Model = 0: Pentium Pro (P6 A-Step) processor model
- strcpy(CPUInfo.strModel, "Intel Pentium Pro (P6 A-Step)"); /*Flawfinder: ignore*/
- strncat(strCPUName, "Intel Pentium Pro (P6 A-Step core)", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/
- break;
- case 1: // Model = 1: Pentium Pro
- strcpy(CPUInfo.strModel, "Intel Pentium Pro (P6)"); /*Flawfinder: ignore*/
- strncat(strCPUName, "Intel Pentium Pro (P6 core)", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/
- break;
- case 3: // Model = 3: Pentium II (66 MHz FSB, I think) processor model
- strcpy(CPUInfo.strModel, "Intel Pentium II Model 3, 0.28 micron"); /*Flawfinder: ignore*/
- strncat(strCPUName, "Intel Pentium II (Model 3 core, 0.28 micron process)", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/
- break;
- case 5: // Model = 5: Pentium II/Xeon/Celeron (0.25 micron) processor model
- strcpy(CPUInfo.strModel, "Intel Pentium II Model 5/Xeon/Celeron, 0.25 micron"); /*Flawfinder: ignore*/
- strncat(strCPUName, "Intel Pentium II/Xeon/Celeron (Model 5 core, 0.25 micron process)", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/
- break;
- case 6: // Model = 6: Pentium II with internal L2 cache
- strcpy(CPUInfo.strModel, "Intel Pentium II - internal L2 cache"); /*Flawfinder: ignore*/
- strncat(strCPUName, "Intel Pentium II with internal L2 cache", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/
- break;
- case 7: // Model = 7: Pentium III/Xeon (extern L2 cache) processor model
- strcpy(CPUInfo.strModel, "Intel Pentium III/Pentium III Xeon - external L2 cache, 0.25 micron"); /*Flawfinder: ignore*/
- strncat(strCPUName, "Intel Pentium III/Pentium III Xeon (0.25 micron process) with external L2 cache", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/
- break;
- case 8: // Model = 8: Pentium III/Xeon/Celeron (256 KB on-die L2 cache) processor model
- strcpy(CPUInfo.strModel, "Intel Pentium III/Celeron/Pentium III Xeon - internal L2 cache, 0.18 micron"); /*Flawfinder: ignore*/
- // We want to know it exactly:
- switch (CPUInfo.uiBrandID)
- {
- case 1: // Model = 8, Brand id = 1: Celeron (on-die L2 cache) processor model
- strncat(strCPUName, "Intel Celeron (0.18 micron process) with internal L2 cache", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/
- break;
- case 2: // Model = 8, Brand id = 2: Pentium III (on-die L2 cache) processor model (my current cpu :-))
- strncat(strCPUName, "Intel Pentium III (0.18 micron process) with internal L2 cache", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/
- break;
- case 3: // Model = 8, Brand id = 3: Pentium III Xeon (on-die L2 cache) processor model
- strncat(strCPUName, "Intel Pentium III Xeon (0.18 micron process) with internal L2 cache", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/
- break;
- default: // ...
- strncat(strCPUName, "Intel Pentium III core (unknown model, 0.18 micron process) with internal L2 cache", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/
- break;
- }
- break;
- case 9: // Model = 9: Intel Pentium M processor, Intel Celeron M processor, model 9
- strcpy(CPUInfo.strModel, "Intel Pentium M Series Processor"); /*Flawfinder: ignore*/
- strncat(strCPUName, "Intel Pentium M Series Processor", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/
- break;
- case 0xA: // Model = 0xA: Pentium III/Xeon/Celeron (1 or 2 MB on-die L2 cache) processor model
- strcpy(CPUInfo.strModel, "Intel Pentium III/Celeron/Pentium III Xeon - internal L2 cache, 0.18 micron"); /*Flawfinder: ignore*/
- // Exact detection:
- switch (CPUInfo.uiBrandID)
- {
- case 1: // Model = 0xA, Brand id = 1: Celeron (1 or 2 MB on-die L2 cache (does it exist??)) processor model
- strncat(strCPUName, "Intel Celeron (0.18 micron process) with internal L2 cache", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/
- break;
- case 2: // Model = 0xA, Brand id = 2: Pentium III (1 or 2 MB on-die L2 cache (never seen...)) processor model
- strncat(strCPUName, "Intel Pentium III (0.18 micron process) with internal L2 cache", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/
- break;
- case 3: // Model = 0xA, Brand id = 3: Pentium III Xeon (1 or 2 MB on-die L2 cache) processor model
- strncat(strCPUName, "Intel Pentium III Xeon (0.18 micron process) with internal L2 cache", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/
- break;
- default: // Getting bored of this............
- strncat(strCPUName, "Intel Pentium III core (unknown model, 0.18 micron process) with internal L2 cache", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/
- break;
- }
- break;
- case 0xB: // Model = 0xB: Pentium III/Xeon/Celeron (Tualatin core, on-die cache) processor model
- strcpy(CPUInfo.strModel, "Intel Pentium III/Celeron/Pentium III Xeon - internal L2 cache, 0.13 micron"); /*Flawfinder: ignore*/
- // Omniscient: ;-)
- switch (CPUInfo.uiBrandID)
- {
- case 3: // Model = 0xB, Brand id = 3: Celeron (Tualatin core) processor model
- strncat(strCPUName, "Intel Celeron (Tualatin core, 0.13 micron process) with internal L2 cache", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/
- break;
- case 4: // Model = 0xB, Brand id = 4: Pentium III (Tualatin core) processor model
- strncat(strCPUName, "Intel Pentium III (Tualatin core, 0.13 micron process) with internal L2 cache", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/
- break;
- case 7: // Model = 0xB, Brand id = 7: Celeron mobile (Tualatin core) processor model
- strncat(strCPUName, "Intel Celeron mobile (Tualatin core, 0.13 micron process) with internal L2 cache", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/
- break;
- default: // *bored*
- strncat(strCPUName, "Intel Pentium III Tualatin core (unknown model, 0.13 micron process) with internal L2 cache", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/
- break;
- }
- break;
- case 0xD: // Model = 0xD: Intel Pentium M processor, Intel Celeron M processor, model D
- strcpy(CPUInfo.strModel, "Intel Pentium M Series Processor"); /*Flawfinder: ignore*/
- strncat(strCPUName, "Intel Pentium M Series Processor", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/
- break;
- case 0xE: // Model = 0xE: Intel Core Duo processor, Intel Core Solo processor, model E
- strcpy(CPUInfo.strModel, "Intel Core Series Processor"); /*Flawfinder: ignore*/
- strncat(strCPUName, "Intel Core Series Processor", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/
- break;
- case 0xF: // Model = 0xF: Intel Core 2 Duo processor, model F
- strcpy(CPUInfo.strModel, "Intel Core 2 Series Processor"); /*Flawfinder: ignore*/
- strncat(strCPUName, "Intel Core 2 Series Processor", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/
- break;
- default: // *more bored*
- strcpy(CPUInfo.strModel, "Unknown Intel Pentium Pro/2/3, Core"); /*Flawfinder: ignore*/
- strncat(strCPUName, "Intel Pentium Pro/2/3, Core (Unknown model)", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/
- break;
- }
- break;
- case 15: // Extended processor family
- // Masking the extended model
- CPUInfo.uiExtendedModel = (eaxreg >> 16) & 0xFF;
- switch (CPUInfo.uiModel)
+ // Interpret CPU feature information.
+ if (i == 1)
{
- case 0: // Model = 0: Pentium 4 Willamette (A-Step) core
- if ((CPUInfo.uiBrandID) == 8) // Brand id = 8: P4 Willamette
- {
- strcpy(CPUInfo.strModel, "Intel Pentium 4 Willamette (A-Step)"); /*Flawfinder: ignore*/
- strncat(strCPUName, "Intel Pentium 4 Willamette (A-Step)", sizeof(strCPUName)-(strlen(strCPUName)-1)); /*Flawfinder: ignore*/
- }
- else // else Xeon
- {
- strcpy(CPUInfo.strModel, "Intel Pentium 4 Willamette Xeon (A-Step)"); /* Flawfinder: ignore */
- strncat(strCPUName, "Intel Pentium 4 Willamette Xeon (A-Step)", sizeof(strCPUName) - strlen(strCPUName) - 1); /* Flawfinder: ignore */
- }
- break;
- case 1: // Model = 1: Pentium 4 Willamette core
- if ((CPUInfo.uiBrandID) == 8) // Brand id = 8: P4 Willamette
- {
- strcpy(CPUInfo.strModel, "Intel Pentium 4 Willamette"); /* Flawfinder: ignore */
- strncat(strCPUName, "Intel Pentium 4 Willamette", sizeof(strCPUName) - strlen(strCPUName) - 1); /* Flawfinder: ignore */
- }
- else // else Xeon
+ setInfo(eStepping, cpu_info[0] & 0xf);
+ setInfo(eModel, (cpu_info[0] >> 4) & 0xf);
+ int family = (cpu_info[0] >> 8) & 0xf;
+ setInfo(eFamily, family);
+ setInfo(eType, (cpu_info[0] >> 12) & 0x3);
+ setInfo(eExtendedModel, (cpu_info[0] >> 16) & 0xf);
+ int ext_family = (cpu_info[0] >> 20) & 0xff;
+ setInfo(eExtendedFamily, ext_family);
+ setInfo(eBrandID, cpu_info[1] & 0xff);
+
+ setInfo(eFamilyName, compute_CPUFamilyName(cpu_vendor, family, ext_family));
+
+ setConfig(eCLFLUSHCacheLineSize, ((cpu_info[1] >> 8) & 0xff) * 8);
+ setConfig(eAPICPhysicalID, (cpu_info[1] >> 24) & 0xff);
+
+ if(cpu_info[2] & 0x1)
+ {
+ setExtension(cpu_feature_names[eSSE3_Features]);
+ }
+
+ if(cpu_info[2] & 0x8)
+ {
+ setExtension(cpu_feature_names[eMONTIOR_MWAIT]);
+ }
+
+ if(cpu_info[2] & 0x10)
+ {
+ setExtension(cpu_feature_names[eCPLDebugStore]);
+ }
+
+ if(cpu_info[2] & 0x100)
+ {
+ setExtension(cpu_feature_names[eThermalMonitor2]);
+ }
+
+ unsigned int feature_info = (unsigned int) cpu_info[3];
+ for(unsigned int index = 0, bit = 1; index < eSSE3_Features; ++index, bit <<= 1)
+ {
+ if(feature_info & bit)
{
- strcpy(CPUInfo.strModel, "Intel Pentium 4 Willamette Xeon"); /* Flawfinder: ignore */
- strncat(strCPUName, "Intel Pentium 4 Willamette Xeon", sizeof(strCPUName) - strlen(strCPUName) - 1); /* Flawfinder: ignore */
+ setExtension(cpu_feature_names[index]);
}
- break;
- case 2: // Model = 2: Pentium 4 Northwood core
- if (((CPUInfo.uiBrandID) == 9) || ((CPUInfo.uiBrandID) == 0xA)) // P4 Willamette
- {
- strcpy(CPUInfo.strModel, "Intel Pentium 4 Northwood"); /* Flawfinder: ignore */
- strncat(strCPUName, "Intel Pentium 4 Northwood", sizeof(strCPUName) - strlen(strCPUName) - 1); /* Flawfinder: ignore */
- }
- else // Xeon
- {
- strcpy(CPUInfo.strModel, "Intel Pentium 4 Northwood Xeon"); /* Flawfinder: ignore */
- strncat(strCPUName, "Intel Pentium 4 Northwood Xeon", sizeof(strCPUName) - strlen(strCPUName) - 1); /* Flawfinder: ignore */
- }
- break;
- default: // Silly stupid never used failsave option
- strcpy(CPUInfo.strModel, "Unknown Intel Pentium 4"); /* Flawfinder: ignore */
- strncat(strCPUName, "Intel Pentium 4 (Unknown model)", sizeof(strCPUName) - strlen(strCPUName) - 1); /* Flawfinder: ignore */
- break;
+ }
}
- break;
- default: // *grmpf*
- strcpy(CPUInfo.strModel, "Unknown Intel model"); /* Flawfinder: ignore */
- strncat(strCPUName, "Intel (Unknown model)", sizeof(strCPUName) - strlen(strCPUName) - 1); /* Flawfinder: ignore */
- break;
- }
-
- // After the long processor model block we now come to the processors serial
- // number.
- // First of all we check if the processor supports the serial number
- if (CPUInfo.MaxSupportedLevel >= 3)
- {
- // If it supports the serial number CPUID level 0x00000003 we read the data
- unsigned long sig1, sig2, sig3;
- __asm
- {
- mov eax, 1
- cpuid
- mov sig1, eax
- mov eax, 3
- cpuid
- mov sig2, ecx
- mov sig3, edx
}
- // Then we convert the data to a readable string
- snprintf( /* Flawfinder: ignore */
- CPUInfo.strProcessorSerial,
- sizeof(CPUInfo.strProcessorSerial),
- "%04lX-%04lX-%04lX-%04lX-%04lX-%04lX",
- sig1 >> 16,
- sig1 & 0xFFFF,
- sig3 >> 16,
- sig3 & 0xFFFF,
- sig2 >> 16, sig2 & 0xFFFF);
- }
- else
- {
- // If there's no serial number support we just put "No serial number"
- snprintf( /* Flawfinder: ignore */
- CPUInfo.strProcessorSerial,
- sizeof(CPUInfo.strProcessorSerial),
- "No Processor Serial Number");
- }
- // Now we get the standard processor extensions
- GetStandardProcessorExtensions();
+ // Calling __cpuid with 0x80000000 as the InfoType argument
+ // gets the number of valid extended IDs.
+ __cpuid(cpu_info, 0x80000000);
+ unsigned int ext_ids = cpu_info[0];
+ setConfig(eMaxExtID, 0);
- // And finally the processor configuration (caches, TLBs, ...) and translate
- // the data to readable strings
- GetStandardProcessorConfiguration();
- TranslateProcessorConfiguration();
-
- // At last...
- return true;
-#else
- return FALSE;
-#endif
-}
+ char cpu_brand_string[0x40];
+ memset(cpu_brand_string, 0, sizeof(cpu_brand_string));
-// bool CProcessor::AnalyzeAMDProcessor()
-// ======================================
-// Private class function for analyzing an AMD processor
-////////////////////////////////////////////////////////
-bool CProcessor::AnalyzeAMDProcessor()
-{
-#if LL_WINDOWS
- unsigned long eaxreg, ebxreg, ecxreg, edxreg;
-
- // First of all we check if the CPUID command is available
- if (!CheckCPUIDPresence())
- return 0;
-
- // Now we get the CPUID standard level 0x00000001
- __asm
- {
- mov eax, 1
- cpuid
- mov eaxreg, eax
- mov ebxreg, ebx
- mov edxreg, edx
- }
-
- // Then we mask the model, family, stepping and type (AMD does not support brand id)
- CPUInfo.uiStepping = eaxreg & 0xF;
- CPUInfo.uiModel = (eaxreg >> 4) & 0xF;
- CPUInfo.uiFamily = (eaxreg >> 8) & 0xF;
- CPUInfo.uiType = (eaxreg >> 12) & 0x3;
-
- // Now we check if the processor supports the brand id string extended CPUID level
- if (CPUInfo.MaxSupportedExtendedLevel >= 0x80000004)
- {
- // If it supports the extended CPUID level 0x80000004 we read the data
- char tmp[52]; /* Flawfinder: ignore */
- memset(tmp, 0, sizeof(tmp));
- __asm
+ // Get the information associated with each extended ID.
+ for(unsigned int i=0x80000000; i<=ext_ids; ++i)
{
- mov eax, 0x80000002
- cpuid
- mov dword ptr [tmp], eax
- mov dword ptr [tmp+4], ebx
- mov dword ptr [tmp+8], ecx
- mov dword ptr [tmp+12], edx
- mov eax, 0x80000003
- cpuid
- mov dword ptr [tmp+16], eax
- mov dword ptr [tmp+20], ebx
- mov dword ptr [tmp+24], ecx
- mov dword ptr [tmp+28], edx
- mov eax, 0x80000004
- cpuid
- mov dword ptr [tmp+32], eax
- mov dword ptr [tmp+36], ebx
- mov dword ptr [tmp+40], ecx
- mov dword ptr [tmp+44], edx
- }
- // And copy it to the brand id string
- strncpy(CPUInfo.strBrandID, tmp,sizeof(CPUInfo.strBrandID)-1);
- CPUInfo.strBrandID[sizeof(CPUInfo.strBrandID)-1]='\0';
- }
- else
- {
- // Or just tell there is no brand id string support
- strcpy(CPUInfo.strBrandID, ""); /* Flawfinder: ignore */
- }
-
- // After that we translate the processor family
- switch(CPUInfo.uiFamily)
- {
- case 4: // Family = 4: 486 (80486) or 5x86 (80486) processor family
- switch (CPUInfo.uiModel)
+ __cpuid(cpu_info, i);
+
+ // Interpret CPU brand string and cache information.
+ if (i == 0x80000002)
+ memcpy(cpu_brand_string, cpu_info, sizeof(cpu_info));
+ else if (i == 0x80000003)
+ memcpy(cpu_brand_string + 16, cpu_info, sizeof(cpu_info));
+ else if (i == 0x80000004)
{
- case 3: // Thanks to AMD for this nice form of family
- case 7: // detection.... *grmpf*
- case 8:
- case 9:
- strcpy(CPUInfo.strFamily, "AMD 80486"); /* Flawfinder: ignore */
- break;
- case 0xE:
- case 0xF:
- strcpy(CPUInfo.strFamily, "AMD 5x86"); /* Flawfinder: ignore */
- break;
- default:
- strcpy(CPUInfo.strFamily, "Unknown family"); /* Flawfinder: ignore */
- break;
+ memcpy(cpu_brand_string + 32, cpu_info, sizeof(cpu_info));
+ setInfo(eBrandName, cpu_brand_string);
}
- break;
- case 5: // Family = 5: K5 or K6 processor family
- switch (CPUInfo.uiModel)
+ else if (i == 0x80000006)
{
- case 0:
- case 1:
- case 2:
- case 3:
- strcpy(CPUInfo.strFamily, "AMD K5"); /* Flawfinder: ignore */
- break;
- case 6:
- case 7:
- case 8:
- case 9:
- strcpy(CPUInfo.strFamily, "AMD K6"); /* Flawfinder: ignore */
- break;
- default:
- strcpy(CPUInfo.strFamily, "Unknown family"); /* Flawfinder: ignore */
- break;
+ setConfig(eCacheLineSize, cpu_info[2] & 0xff);
+ setConfig(eL2Associativity, (cpu_info[2] >> 12) & 0xf);
+ setConfig(eCacheSizeK, (cpu_info[2] >> 16) & 0xffff);
}
- break;
- case 6: // Family = 6: K7 (Athlon, ...) processor family
- strcpy(CPUInfo.strFamily, "AMD K7"); /* Flawfinder: ignore */
- break;
- default: // For security
- strcpy(CPUInfo.strFamily, "Unknown family"); /* Flawfinder: ignore */
- break;
+ }
}
+};
- // After the family detection we come to the specific processor model
- // detection
- switch (CPUInfo.uiFamily)
- {
- case 4: // Family = 4: 486 (80486) or 5x85 (80486) processor family
- switch (CPUInfo.uiModel)
- {
- case 3: // Model = 3: 80486 DX2
- strcpy(CPUInfo.strModel, "AMD 80486 DX2"); /* Flawfinder: ignore */
- strncat(strCPUName, "AMD 80486 DX2", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */
- break;
- case 7: // Model = 7: 80486 write-back enhanced DX2
- strcpy(CPUInfo.strModel, "AMD 80486 write-back enhanced DX2"); /* Flawfinder: ignore */
- strncat(strCPUName, "AMD 80486 write-back enhanced DX2", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */
- break;
- case 8: // Model = 8: 80486 DX4
- strcpy(CPUInfo.strModel, "AMD 80486 DX4"); /* Flawfinder: ignore */
- strncat(strCPUName, "AMD 80486 DX4", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */
- break;
- case 9: // Model = 9: 80486 write-back enhanced DX4
- strcpy(CPUInfo.strModel, "AMD 80486 write-back enhanced DX4"); /* Flawfinder: ignore */
- strncat(strCPUName, "AMD 80486 write-back enhanced DX4", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */
- break;
- case 0xE: // Model = 0xE: 5x86
- strcpy(CPUInfo.strModel, "AMD 5x86"); /* Flawfinder: ignore */
- strncat(strCPUName, "AMD 5x86", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */
- break;
- case 0xF: // Model = 0xF: 5x86 write-back enhanced (oh my god.....)
- strcpy(CPUInfo.strModel, "AMD 5x86 write-back enhanced"); /* Flawfinder: ignore */
- strncat(strCPUName, "AMD 5x86 write-back enhanced", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */
- break;
- default: // ...
- strcpy(CPUInfo.strModel, "Unknown AMD 80486 or 5x86 model"); /* Flawfinder: ignore */
- strncat(strCPUName, "AMD 80486 or 5x86 (Unknown model)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */
- break;
- }
- break;
- case 5: // Family = 5: K5 / K6 processor family
- switch (CPUInfo.uiModel)
- {
- case 0: // Model = 0: K5 SSA 5 (Pentium Rating *ggg* 75, 90 and 100 Mhz)
- strcpy(CPUInfo.strModel, "AMD K5 SSA5 (PR75, PR90, PR100)"); /* Flawfinder: ignore */
- strncat(strCPUName, "AMD K5 SSA5 (PR75, PR90, PR100)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */
- break;
- case 1: // Model = 1: K5 5k86 (PR 120 and 133 MHz)
- strcpy(CPUInfo.strModel, "AMD K5 5k86 (PR120, PR133)"); /* Flawfinder: ignore */
- strncat(strCPUName, "AMD K5 5k86 (PR120, PR133)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */
- break;
- case 2: // Model = 2: K5 5k86 (PR 166 MHz)
- strcpy(CPUInfo.strModel, "AMD K5 5k86 (PR166)"); /* Flawfinder: ignore */
- strncat(strCPUName, "AMD K5 5k86 (PR166)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */
- break;
- case 3: // Model = 3: K5 5k86 (PR 200 MHz)
- strcpy(CPUInfo.strModel, "AMD K5 5k86 (PR200)"); /* Flawfinder: ignore */
- strncat(strCPUName, "AMD K5 5k86 (PR200)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */
- break;
- case 6: // Model = 6: K6
- strcpy(CPUInfo.strModel, "AMD K6 (0.30 micron)"); /* Flawfinder: ignore */
- strncat(strCPUName, "AMD K6 (0.30 micron)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */
- break;
- case 7: // Model = 7: K6 (0.25 micron)
- strcpy(CPUInfo.strModel, "AMD K6 (0.25 micron)"); /* Flawfinder: ignore */
- strncat(strCPUName, "AMD K6 (0.25 micron)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */
- break;
- case 8: // Model = 8: K6-2
- strcpy(CPUInfo.strModel, "AMD K6-2"); /* Flawfinder: ignore */
- strncat(strCPUName, "AMD K6-2", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */
- break;
- case 9: // Model = 9: K6-III
- strcpy(CPUInfo.strModel, "AMD K6-III"); /* Flawfinder: ignore */
- strncat(strCPUName, "AMD K6-III", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */
- break;
- case 0xD: // Model = 0xD: K6-2+ / K6-III+
- strcpy(CPUInfo.strModel, "AMD K6-2+ or K6-III+ (0.18 micron)"); /* Flawfinder: ignore */
- strncat(strCPUName, "AMD K6-2+ or K6-III+ (0.18 micron)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */
- break;
- default: // ...
- strcpy(CPUInfo.strModel, "Unknown AMD K5 or K6 model"); /* Flawfinder: ignore */
- strncat(strCPUName, "AMD K5 or K6 (Unknown model)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */
- break;
- }
- break;
- case 6: // Family = 6: K7 processor family (AMDs first good processors)
- switch (CPUInfo.uiModel)
+#elif LL_DARWIN
+
+#include <mach/machine.h>
+#include <sys/sysctl.h>
+
+class LLProcessorInfoDarwinImpl : public LLProcessorInfoImpl
+{
+public:
+ LLProcessorInfoDarwinImpl()
+ {
+ getCPUIDInfo();
+ uint64_t frequency = getSysctlInt64("hw.cpufrequency");
+ setInfo(eFrequency, (F64)frequency / (F64)1000000);
+ }
+
+ virtual ~LLProcessorInfoDarwinImpl() {}
+
+private:
+ int getSysctlInt(const char* name)
+ {
+ int result = 0;
+ size_t len = sizeof(int);
+ int error = sysctlbyname(name, (void*)&result, &len, NULL, 0);
+ return error == -1 ? 0 : result;
+ }
+
+ uint64_t getSysctlInt64(const char* name)
+ {
+ uint64_t value = 0;
+ size_t size = sizeof(value);
+ int result = sysctlbyname(name, (void*)&value, &size, NULL, 0);
+ if ( result == 0 )
+ {
+ if ( size == sizeof( uint64_t ) )
+ ;
+ else if ( size == sizeof( uint32_t ) )
+ value = (uint64_t)(( uint32_t *)&value);
+ else if ( size == sizeof( uint16_t ) )
+ value = (uint64_t)(( uint16_t *)&value);
+ else if ( size == sizeof( uint8_t ) )
+ value = (uint64_t)(( uint8_t *)&value);
+ else
{
- case 1: // Athlon
- strcpy(CPUInfo.strModel, "AMD Athlon (0.25 micron)"); /* Flawfinder: ignore */
- strncat(strCPUName, "AMD Athlon (0.25 micron)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */
- break;
- case 2: // Athlon (0.18 micron)
- strcpy(CPUInfo.strModel, "AMD Athlon (0.18 micron)"); /* Flawfinder: ignore */
- strncat(strCPUName, "AMD Athlon (0.18 micron)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */
- break;
- case 3: // Duron (Spitfire core)
- strcpy(CPUInfo.strModel, "AMD Duron (Spitfire)"); /* Flawfinder: ignore */
- strncat(strCPUName, "AMD Duron (Spitfire core)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */
- break;
- case 4: // Athlon (Thunderbird core)
- strcpy(CPUInfo.strModel, "AMD Athlon (Thunderbird)"); /* Flawfinder: ignore */
- strncat(strCPUName, "AMD Athlon (Thunderbird core)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */
- break;
- case 6: // Athlon MP / Mobile Athlon (Palomino core)
- strcpy(CPUInfo.strModel, "AMD Athlon MP/Mobile Athlon (Palomino)"); /* Flawfinder: ignore */
- strncat(strCPUName, "AMD Athlon MP/Mobile Athlon (Palomino core)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */
- break;
- case 7: // Mobile Duron (Morgan core)
- strcpy(CPUInfo.strModel, "AMD Mobile Duron (Morgan)"); /* Flawfinder: ignore */
- strncat(strCPUName, "AMD Mobile Duron (Morgan core)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */
- break;
- default: // ...
- strcpy(CPUInfo.strModel, "Unknown AMD K7 model"); /* Flawfinder: ignore */
- strncat(strCPUName, "AMD K7 (Unknown model)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */
- break;
+ LL_WARNS("Unknown type returned from sysctl!") << LL_ENDL;
}
- break;
- default: // ...
- strcpy(CPUInfo.strModel, "Unknown AMD model"); /* Flawfinder: ignore */
- strncat(strCPUName, "AMD (Unknown model)", sizeof(strCPUName) - strlen(strCPUName) -1); /* Flawfinder: ignore */
- break;
- }
-
- // Now we read the standard processor extension that are stored in the same
- // way the Intel standard extensions are
- GetStandardProcessorExtensions();
-
- // Then we check if theres an extended CPUID level support
- if (CPUInfo.MaxSupportedExtendedLevel >= 0x80000001)
- {
- // If we can access the extended CPUID level 0x80000001 we get the
- // edx register
- __asm
- {
- mov eax, 0x80000001
- cpuid
- mov edxreg, edx
}
-
- // Now we can mask some AMD specific cpu extensions
- CPUInfo._Ext.EMMX_MultimediaExtensions = CheckBit(edxreg, 22);
- CPUInfo._Ext.AA64_AMD64BitArchitecture = CheckBit(edxreg, 29);
- CPUInfo._Ext._E3DNOW_InstructionExtensions = CheckBit(edxreg, 30);
- CPUInfo._Ext._3DNOW_InstructionExtensions = CheckBit(edxreg, 31);
- }
-
- // After that we check if the processor supports the ext. CPUID level
- // 0x80000006
- if (CPUInfo.MaxSupportedExtendedLevel >= 0x80000006)
+
+ return result == -1 ? 0 : value;
+ }
+
+ void getCPUIDInfo()
{
- // If it's present, we read it out
- __asm
- {
- mov eax, 0x80000005
- cpuid
- mov eaxreg, eax
- mov ebxreg, ebx
- mov ecxreg, ecx
- mov edxreg, edx
- }
+ size_t len = 0;
- // Then we mask the L1 Data TLB information
- if ((ebxreg >> 16) && (eaxreg >> 16))
- {
- CPUInfo._Data.bPresent = true;
- strcpy(CPUInfo._Data.strPageSize, "4 KB / 2 MB / 4MB"); /*Flawfinder: ignore*/
- CPUInfo._Data.uiAssociativeWays = (eaxreg >> 24) & 0xFF;
- CPUInfo._Data.uiEntries = (eaxreg >> 16) & 0xFF;
- }
- else if (eaxreg >> 16)
- {
- CPUInfo._Data.bPresent = true;
- strcpy(CPUInfo._Data.strPageSize, "2 MB / 4MB"); /*Flawfinder: ignore*/
- CPUInfo._Data.uiAssociativeWays = (eaxreg >> 24) & 0xFF;
- CPUInfo._Data.uiEntries = (eaxreg >> 16) & 0xFF;
- }
- else if (ebxreg >> 16)
- {
- CPUInfo._Data.bPresent = true;
- strcpy(CPUInfo._Data.strPageSize, "4 KB"); /*Flawfinder: ignore*/
- CPUInfo._Data.uiAssociativeWays = (ebxreg >> 24) & 0xFF;
- CPUInfo._Data.uiEntries = (ebxreg >> 16) & 0xFF;
- }
- if (CPUInfo._Data.uiAssociativeWays == 0xFF)
- CPUInfo._Data.uiAssociativeWays = (unsigned int) -1;
-
- // Now the L1 Instruction/Code TLB information
- if ((ebxreg & 0xFFFF) && (eaxreg & 0xFFFF))
- {
- CPUInfo._Instruction.bPresent = true;
- strcpy(CPUInfo._Instruction.strPageSize, "4 KB / 2 MB / 4MB"); /*Flawfinder: ignore*/
- CPUInfo._Instruction.uiAssociativeWays = (eaxreg >> 8) & 0xFF;
- CPUInfo._Instruction.uiEntries = eaxreg & 0xFF;
- }
- else if (eaxreg & 0xFFFF)
- {
- CPUInfo._Instruction.bPresent = true;
- strcpy(CPUInfo._Instruction.strPageSize, "2 MB / 4MB"); /*Flawfinder: ignore*/
- CPUInfo._Instruction.uiAssociativeWays = (eaxreg >> 8) & 0xFF;
- CPUInfo._Instruction.uiEntries = eaxreg & 0xFF;
- }
- else if (ebxreg & 0xFFFF)
- {
- CPUInfo._Instruction.bPresent = true;
- strcpy(CPUInfo._Instruction.strPageSize, "4 KB"); /*Flawfinder: ignore*/
- CPUInfo._Instruction.uiAssociativeWays = (ebxreg >> 8) & 0xFF;
- CPUInfo._Instruction.uiEntries = ebxreg & 0xFF;
- }
- if (CPUInfo._Instruction.uiAssociativeWays == 0xFF)
- CPUInfo._Instruction.uiAssociativeWays = (unsigned int) -1;
+ char cpu_brand_string[0x40];
+ len = sizeof(cpu_brand_string);
+ memset(cpu_brand_string, 0, len);
+ sysctlbyname("machdep.cpu.brand_string", (void*)cpu_brand_string, &len, NULL, 0);
+ cpu_brand_string[0x3f] = 0;
+ setInfo(eBrandName, cpu_brand_string);
- // Then we read the L1 data cache information
- if ((ecxreg >> 24) > 0)
- {
- CPUInfo._L1.Data.bPresent = true;
- snprintf(CPUInfo._L1.Data.strSize, sizeof(CPUInfo._L1.Data.strSize), "%d KB", ecxreg >> 24); /* Flawfinder: ignore */
- CPUInfo._L1.Data.uiAssociativeWays = (ecxreg >> 15) & 0xFF;
- CPUInfo._L1.Data.uiLineSize = ecxreg & 0xFF;
- }
- // After that we read the L2 instruction/code cache information
- if ((edxreg >> 24) > 0)
- {
- CPUInfo._L1.Instruction.bPresent = true;
- snprintf(CPUInfo._L1.Instruction.strSize, sizeof(CPUInfo._L1.Instruction.strSize), "%d KB", edxreg >> 24); /* Flawfinder: ignore */
- CPUInfo._L1.Instruction.uiAssociativeWays = (edxreg >> 15) & 0xFF;
- CPUInfo._L1.Instruction.uiLineSize = edxreg & 0xFF;
- }
-
- // Note: I'm not absolutely sure that the L1 page size code (the
- // 'if/else if/else if' structs above) really detects the real page
- // size for the TLB. Somebody should check it....
-
- // Now we read the ext. CPUID level 0x80000006
- __asm
- {
- mov eax, 0x80000006
- cpuid
- mov eaxreg, eax
- mov ebxreg, ebx
- mov ecxreg, ecx
- }
+ char cpu_vendor[0x20];
+ len = sizeof(cpu_vendor);
+ memset(cpu_vendor, 0, len);
+ sysctlbyname("machdep.cpu.vendor", (void*)cpu_vendor, &len, NULL, 0);
+ cpu_vendor[0x1f] = 0;
+ setInfo(eVendor, cpu_vendor);
+
+ setInfo(eStepping, getSysctlInt("machdep.cpu.stepping"));
+ setInfo(eModel, getSysctlInt("machdep.cpu.model"));
+ int family = getSysctlInt("machdep.cpu.family");
+ int ext_family = getSysctlInt("machdep.cpu.extfamily");
+ setInfo(eFamily, family);
+ setInfo(eExtendedFamily, ext_family);
+ setInfo(eFamilyName, compute_CPUFamilyName(cpu_vendor, family, ext_family));
+ setInfo(eExtendedModel, getSysctlInt("machdep.cpu.extmodel"));
+ setInfo(eBrandID, getSysctlInt("machdep.cpu.brand"));
+ setInfo(eType, 0); // ? where to find this?
+
+ //setConfig(eCLFLUSHCacheLineSize, ((cpu_info[1] >> 8) & 0xff) * 8);
+ //setConfig(eAPICPhysicalID, (cpu_info[1] >> 24) & 0xff);
+ setConfig(eCacheLineSize, getSysctlInt("machdep.cpu.cache.linesize"));
+ setConfig(eL2Associativity, getSysctlInt("machdep.cpu.cache.L2_associativity"));
+ setConfig(eCacheSizeK, getSysctlInt("machdep.cpu.cache.size"));
+
+ uint64_t feature_info = getSysctlInt64("machdep.cpu.feature_bits");
+ S32 *feature_infos = (S32*)(&feature_info);
+
+ setConfig(eFeatureBits, feature_infos[0]);
- // We only mask the unified L2 cache masks (never heard of an
- // L2 cache that is divided in data and code parts)
- if (((ecxreg >> 12) & 0xF) > 0)
+ for(unsigned int index = 0, bit = 1; index < eSSE3_Features; ++index, bit <<= 1)
{
- CPUInfo._L2.bPresent = true;
- snprintf(CPUInfo._L2.strSize, sizeof(CPUInfo._L2.strSize), "%d KB", ecxreg >> 16); /* Flawfinder: ignore */
- switch ((ecxreg >> 12) & 0xF)
+ if(feature_info & bit)
{
- case 1:
- CPUInfo._L2.uiAssociativeWays = 1;
- break;
- case 2:
- CPUInfo._L2.uiAssociativeWays = 2;
- break;
- case 4:
- CPUInfo._L2.uiAssociativeWays = 4;
- break;
- case 6:
- CPUInfo._L2.uiAssociativeWays = 8;
- break;
- case 8:
- CPUInfo._L2.uiAssociativeWays = 16;
- break;
- case 0xF:
- CPUInfo._L2.uiAssociativeWays = (unsigned int) -1;
- break;
- default:
- CPUInfo._L2.uiAssociativeWays = 0;
- break;
+ setExtension(cpu_feature_names[index]);
}
- CPUInfo._L2.uiLineSize = ecxreg & 0xFF;
}
- }
- else
- {
- // If we could not detect the ext. CPUID level 0x80000006 we
- // try to read the standard processor configuration.
- GetStandardProcessorConfiguration();
- }
- // After reading we translate the configuration to strings
- TranslateProcessorConfiguration();
-
- // And finally exit
- return true;
-#else
- return FALSE;
-#endif
-}
-
-// bool CProcessor::AnalyzeUnknownProcessor()
-// ==========================================
-// Private class function to analyze an unknown (No Intel or AMD) processor
-///////////////////////////////////////////////////////////////////////////
-bool CProcessor::AnalyzeUnknownProcessor()
-{
-#if LL_WINDOWS
- unsigned long eaxreg, ebxreg;
-
- // We check if the CPUID command is available
- if (!CheckCPUIDPresence())
- return false;
-
- // First of all we read the standard CPUID level 0x00000001
- // This level should be available on every x86-processor clone
- __asm
- {
- mov eax, 1
- cpuid
- mov eaxreg, eax
- mov ebxreg, ebx
- }
- // Then we mask the processor model, family, type and stepping
- CPUInfo.uiStepping = eaxreg & 0xF;
- CPUInfo.uiModel = (eaxreg >> 4) & 0xF;
- CPUInfo.uiFamily = (eaxreg >> 8) & 0xF;
- CPUInfo.uiType = (eaxreg >> 12) & 0x3;
-
- // To have complete information we also mask the brand id
- CPUInfo.uiBrandID = ebxreg & 0xF;
-
- // Then we get the standard processor extensions
- GetStandardProcessorExtensions();
-
- // Now we mark everything we do not know as unknown
- strcpy(strCPUName, "Unknown"); /*Flawfinder: ignore*/
-
- strcpy(CPUInfo._Data.strTLB, "Unknown"); /*Flawfinder: ignore*/
- strcpy(CPUInfo._Instruction.strTLB, "Unknown"); /*Flawfinder: ignore*/
-
- strcpy(CPUInfo._Trace.strCache, "Unknown"); /*Flawfinder: ignore*/
- strcpy(CPUInfo._L1.Data.strCache, "Unknown"); /*Flawfinder: ignore*/
- strcpy(CPUInfo._L1.Instruction.strCache, "Unknown"); /*Flawfinder: ignore*/
- strcpy(CPUInfo._L2.strCache, "Unknown"); /*Flawfinder: ignore*/
- strcpy(CPUInfo._L3.strCache, "Unknown"); /*Flawfinder: ignore*/
-
- strcpy(CPUInfo.strProcessorSerial, "Unknown / Not supported"); /*Flawfinder: ignore*/
-
- // For the family, model and brand id we can only print the numeric value
- snprintf(CPUInfo.strBrandID, sizeof(CPUInfo.strBrandID), "Brand-ID number %d", CPUInfo.uiBrandID); /* Flawfinder: ignore */
- snprintf(CPUInfo.strFamily, sizeof(CPUInfo.strFamily), "Family number %d", CPUInfo.uiFamily); /* Flawfinder: ignore */
- snprintf(CPUInfo.strModel, sizeof(CPUInfo.strModel), "Model number %d", CPUInfo.uiModel); /* Flawfinder: ignore */
-
- // And thats it
- return true;
-#else
- return FALSE;
-#endif
-}
-// bool CProcessor::CheckCPUIDPresence()
-// =====================================
-// This function checks if the CPUID command is available on the current
-// processor
-////////////////////////////////////////////////////////////////////////
-bool CProcessor::CheckCPUIDPresence()
-{
-#if LL_WINDOWS
- unsigned long BitChanged;
-
- // We've to check if we can toggle the flag register bit 21
- // If we can't the processor does not support the CPUID command
- __asm
- {
- pushfd
- pop eax
- mov ebx, eax
- xor eax, 0x00200000
- push eax
- popfd
- pushfd
- pop eax
- xor eax,ebx
- mov BitChanged, eax
- }
-
- return ((BitChanged) ? true : false);
-#else
- return FALSE;
-#endif
-}
+ // *NOTE:Mani - I didn't find any docs that assure me that machdep.cpu.feature_bits will always be
+ // The feature bits I think it is. Here's a test:
+#ifndef LL_RELEASE_FOR_DOWNLOAD
+ #if defined(__i386__) && defined(__PIC__)
+ /* %ebx may be the PIC register. */
+ #define __cpuid(level, a, b, c, d) \
+ __asm__ ("xchgl\t%%ebx, %1\n\t" \
+ "cpuid\n\t" \
+ "xchgl\t%%ebx, %1\n\t" \
+ : "=a" (a), "=r" (b), "=c" (c), "=d" (d) \
+ : "0" (level))
+ #else
+ #define __cpuid(level, a, b, c, d) \
+ __asm__ ("cpuid\n\t" \
+ : "=a" (a), "=b" (b), "=c" (c), "=d" (d) \
+ : "0" (level))
+ #endif
+
+ unsigned int eax, ebx, ecx, edx;
+ __cpuid(0x1, eax, ebx, ecx, edx);
+ if(feature_infos[0] != (S32)edx)
+ {
+ llerrs << "machdep.cpu.feature_bits doesn't match expected cpuid result!" << llendl;
+ }
+#endif // LL_RELEASE_FOR_DOWNLOAD
-// void CProcessor::DecodeProcessorConfiguration(unsigned int cfg)
-// ===============================================================
-// This function (or switch ?!) just translates a one-byte processor configuration
-// byte to understandable values
-//////////////////////////////////////////////////////////////////////////////////
-void CProcessor::DecodeProcessorConfiguration(unsigned int cfg)
-{
- // First we ensure that there's only one single byte
- cfg &= 0xFF;
- // Then we do a big switch
- switch(cfg)
- {
- case 0: // cfg = 0: Unused
- break;
- case 0x1: // cfg = 0x1: code TLB present, 4 KB pages, 4 ways, 32 entries
- CPUInfo._Instruction.bPresent = true;
- strcpy(CPUInfo._Instruction.strPageSize, "4 KB"); /*Flawfinder: ignore*/
- CPUInfo._Instruction.uiAssociativeWays = 4;
- CPUInfo._Instruction.uiEntries = 32;
- break;
- case 0x2: // cfg = 0x2: code TLB present, 4 MB pages, fully associative, 2 entries
- CPUInfo._Instruction.bPresent = true;
- strcpy(CPUInfo._Instruction.strPageSize, "4 MB"); /*Flawfinder: ignore*/
- CPUInfo._Instruction.uiAssociativeWays = 4;
- CPUInfo._Instruction.uiEntries = 2;
- break;
- case 0x3: // cfg = 0x3: data TLB present, 4 KB pages, 4 ways, 64 entries
- CPUInfo._Data.bPresent = true;
- strcpy(CPUInfo._Data.strPageSize, "4 KB"); /*Flawfinder: ignore*/
- CPUInfo._Data.uiAssociativeWays = 4;
- CPUInfo._Data.uiEntries = 64;
- break;
- case 0x4: // cfg = 0x4: data TLB present, 4 MB pages, 4 ways, 8 entries
- CPUInfo._Data.bPresent = true;
- strcpy(CPUInfo._Data.strPageSize, "4 MB"); /*Flawfinder: ignore*/
- CPUInfo._Data.uiAssociativeWays = 4;
- CPUInfo._Data.uiEntries = 8;
- break;
- case 0x6: // cfg = 0x6: code L1 cache present, 8 KB, 4 ways, 32 byte lines
- CPUInfo._L1.Instruction.bPresent = true;
- strcpy(CPUInfo._L1.Instruction.strSize, "8 KB"); /*Flawfinder: ignore*/
- CPUInfo._L1.Instruction.uiAssociativeWays = 4;
- CPUInfo._L1.Instruction.uiLineSize = 32;
- break;
- case 0x8: // cfg = 0x8: code L1 cache present, 16 KB, 4 ways, 32 byte lines
- CPUInfo._L1.Instruction.bPresent = true;
- strcpy(CPUInfo._L1.Instruction.strSize, "16 KB"); /*Flawfinder: ignore*/
- CPUInfo._L1.Instruction.uiAssociativeWays = 4;
- CPUInfo._L1.Instruction.uiLineSize = 32;
- break;
- case 0xA: // cfg = 0xA: data L1 cache present, 8 KB, 2 ways, 32 byte lines
- CPUInfo._L1.Data.bPresent = true;
- strcpy(CPUInfo._L1.Data.strSize, "8 KB"); /*Flawfinder: ignore*/
- CPUInfo._L1.Data.uiAssociativeWays = 2;
- CPUInfo._L1.Data.uiLineSize = 32;
- break;
- case 0xC: // cfg = 0xC: data L1 cache present, 16 KB, 4 ways, 32 byte lines
- CPUInfo._L1.Data.bPresent = true;
- strcpy(CPUInfo._L1.Data.strSize, "16 KB"); /*Flawfinder: ignore*/
- CPUInfo._L1.Data.uiAssociativeWays = 4;
- CPUInfo._L1.Data.uiLineSize = 32;
- break;
- case 0x22: // cfg = 0x22: code and data L3 cache present, 512 KB, 4 ways, 64 byte lines, sectored
- CPUInfo._L3.bPresent = true;
- strcpy(CPUInfo._L3.strSize, "512 KB"); /*Flawfinder: ignore*/
- CPUInfo._L3.uiAssociativeWays = 4;
- CPUInfo._L3.uiLineSize = 64;
- CPUInfo._L3.bSectored = true;
- break;
- case 0x23: // cfg = 0x23: code and data L3 cache present, 1024 KB, 8 ways, 64 byte lines, sectored
- CPUInfo._L3.bPresent = true;
- strcpy(CPUInfo._L3.strSize, "1024 KB"); /*Flawfinder: ignore*/
- CPUInfo._L3.uiAssociativeWays = 8;
- CPUInfo._L3.uiLineSize = 64;
- CPUInfo._L3.bSectored = true;
- break;
- case 0x25: // cfg = 0x25: code and data L3 cache present, 2048 KB, 8 ways, 64 byte lines, sectored
- CPUInfo._L3.bPresent = true;
- strcpy(CPUInfo._L3.strSize, "2048 KB"); /*Flawfinder: ignore*/
- CPUInfo._L3.uiAssociativeWays = 8;
- CPUInfo._L3.uiLineSize = 64;
- CPUInfo._L3.bSectored = true;
- break;
- case 0x29: // cfg = 0x29: code and data L3 cache present, 4096 KB, 8 ways, 64 byte lines, sectored
- CPUInfo._L3.bPresent = true;
- strcpy(CPUInfo._L3.strSize, "4096 KB"); /*Flawfinder: ignore*/
- CPUInfo._L3.uiAssociativeWays = 8;
- CPUInfo._L3.uiLineSize = 64;
- CPUInfo._L3.bSectored = true;
- break;
- case 0x40: // cfg = 0x40: no integrated L2 cache (P6 core) or L3 cache (P4 core)
- break;
- case 0x41: // cfg = 0x41: code and data L2 cache present, 128 KB, 4 ways, 32 byte lines
- CPUInfo._L2.bPresent = true;
- strcpy(CPUInfo._L2.strSize, "128 KB"); /*Flawfinder: ignore*/
- CPUInfo._L2.uiAssociativeWays = 4;
- CPUInfo._L2.uiLineSize = 32;
- break;
- case 0x42: // cfg = 0x42: code and data L2 cache present, 256 KB, 4 ways, 32 byte lines
- CPUInfo._L2.bPresent = true;
- strcpy(CPUInfo._L2.strSize, "256 KB"); /*Flawfinder: ignore*/
- CPUInfo._L2.uiAssociativeWays = 4;
- CPUInfo._L2.uiLineSize = 32;
- break;
- case 0x43: // cfg = 0x43: code and data L2 cache present, 512 KB, 4 ways, 32 byte lines
- CPUInfo._L2.bPresent = true;
- strcpy(CPUInfo._L2.strSize, "512 KB"); /* Flawfinder: ignore */
- CPUInfo._L2.uiAssociativeWays = 4;
- CPUInfo._L2.uiLineSize = 32;
- break;
- case 0x44: // cfg = 0x44: code and data L2 cache present, 1024 KB, 4 ways, 32 byte lines
- CPUInfo._L2.bPresent = true;
- strcpy(CPUInfo._L2.strSize, "1 MB"); /* Flawfinder: ignore */
- CPUInfo._L2.uiAssociativeWays = 4;
- CPUInfo._L2.uiLineSize = 32;
- break;
- case 0x45: // cfg = 0x45: code and data L2 cache present, 2048 KB, 4 ways, 32 byte lines
- CPUInfo._L2.bPresent = true;
- strcpy(CPUInfo._L2.strSize, "2 MB"); /* Flawfinder: ignore */
- CPUInfo._L2.uiAssociativeWays = 4;
- CPUInfo._L2.uiLineSize = 32;
- break;
- case 0x50: // cfg = 0x50: code TLB present, 4 KB / 4 MB / 2 MB pages, fully associative, 64 entries
- CPUInfo._Instruction.bPresent = true;
- strcpy(CPUInfo._Instruction.strPageSize, "4 KB / 2 MB / 4 MB"); /* Flawfinder: ignore */
- CPUInfo._Instruction.uiAssociativeWays = (unsigned int) -1;
- CPUInfo._Instruction.uiEntries = 64;
- break;
- case 0x51: // cfg = 0x51: code TLB present, 4 KB / 4 MB / 2 MB pages, fully associative, 128 entries
- CPUInfo._Instruction.bPresent = true;
- strcpy(CPUInfo._Instruction.strPageSize, "4 KB / 2 MB / 4 MB"); /* Flawfinder: ignore */
- CPUInfo._Instruction.uiAssociativeWays = (unsigned int) -1;
- CPUInfo._Instruction.uiEntries = 128;
- break;
- case 0x52: // cfg = 0x52: code TLB present, 4 KB / 4 MB / 2 MB pages, fully associative, 256 entries
- CPUInfo._Instruction.bPresent = true;
- strcpy(CPUInfo._Instruction.strPageSize, "4 KB / 2 MB / 4 MB"); /* Flawfinder: ignore */
- CPUInfo._Instruction.uiAssociativeWays = (unsigned int) -1;
- CPUInfo._Instruction.uiEntries = 256;
- break;
- case 0x5B: // cfg = 0x5B: data TLB present, 4 KB / 4 MB pages, fully associative, 64 entries
- CPUInfo._Data.bPresent = true;
- strcpy(CPUInfo._Data.strPageSize, "4 KB / 4 MB"); /* Flawfinder: ignore */
- CPUInfo._Data.uiAssociativeWays = (unsigned int) -1;
- CPUInfo._Data.uiEntries = 64;
- break;
- case 0x5C: // cfg = 0x5C: data TLB present, 4 KB / 4 MB pages, fully associative, 128 entries
- CPUInfo._Data.bPresent = true;
- strcpy(CPUInfo._Data.strPageSize, "4 KB / 4 MB"); /* Flawfinder: ignore */
- CPUInfo._Data.uiAssociativeWays = (unsigned int) -1;
- CPUInfo._Data.uiEntries = 128;
- break;
- case 0x5d: // cfg = 0x5D: data TLB present, 4 KB / 4 MB pages, fully associative, 256 entries
- CPUInfo._Data.bPresent = true;
- strcpy(CPUInfo._Data.strPageSize, "4 KB / 4 MB"); /* Flawfinder: ignore */
- CPUInfo._Data.uiAssociativeWays = (unsigned int) -1;
- CPUInfo._Data.uiEntries = 256;
- break;
- case 0x66: // cfg = 0x66: data L1 cache present, 8 KB, 4 ways, 64 byte lines, sectored
- CPUInfo._L1.Data.bPresent = true;
- strcpy(CPUInfo._L1.Data.strSize, "8 KB"); /* Flawfinder: ignore */
- CPUInfo._L1.Data.uiAssociativeWays = 4;
- CPUInfo._L1.Data.uiLineSize = 64;
- break;
- case 0x67: // cfg = 0x67: data L1 cache present, 16 KB, 4 ways, 64 byte lines, sectored
- CPUInfo._L1.Data.bPresent = true;
- strcpy(CPUInfo._L1.Data.strSize, "16 KB"); /* Flawfinder: ignore */
- CPUInfo._L1.Data.uiAssociativeWays = 4;
- CPUInfo._L1.Data.uiLineSize = 64;
- break;
- case 0x68: // cfg = 0x68: data L1 cache present, 32 KB, 4 ways, 64 byte lines, sectored
- CPUInfo._L1.Data.bPresent = true;
- strcpy(CPUInfo._L1.Data.strSize, "32 KB"); /* Flawfinder: ignore */
- CPUInfo._L1.Data.uiAssociativeWays = 4;
- CPUInfo._L1.Data.uiLineSize = 64;
- break;
- case 0x70: // cfg = 0x70: trace L1 cache present, 12 KuOPs, 4 ways
- CPUInfo._Trace.bPresent = true;
- strcpy(CPUInfo._Trace.strSize, "12 K-micro-ops"); /* Flawfinder: ignore */
- CPUInfo._Trace.uiAssociativeWays = 4;
- break;
- case 0x71: // cfg = 0x71: trace L1 cache present, 16 KuOPs, 4 ways
- CPUInfo._Trace.bPresent = true;
- strcpy(CPUInfo._Trace.strSize, "16 K-micro-ops"); /* Flawfinder: ignore */
- CPUInfo._Trace.uiAssociativeWays = 4;
- break;
- case 0x72: // cfg = 0x72: trace L1 cache present, 32 KuOPs, 4 ways
- CPUInfo._Trace.bPresent = true;
- strcpy(CPUInfo._Trace.strSize, "32 K-micro-ops"); /* Flawfinder: ignore */
- CPUInfo._Trace.uiAssociativeWays = 4;
- break;
- case 0x79: // cfg = 0x79: code and data L2 cache present, 128 KB, 8 ways, 64 byte lines, sectored
- CPUInfo._L2.bPresent = true;
- strcpy(CPUInfo._L2.strSize, "128 KB"); /* Flawfinder: ignore */
- CPUInfo._L2.uiAssociativeWays = 8;
- CPUInfo._L2.uiLineSize = 64;
- CPUInfo._L2.bSectored = true;
- break;
- case 0x7A: // cfg = 0x7A: code and data L2 cache present, 256 KB, 8 ways, 64 byte lines, sectored
- CPUInfo._L2.bPresent = true;
- strcpy(CPUInfo._L2.strSize, "256 KB"); /* Flawfinder: ignore */
- CPUInfo._L2.uiAssociativeWays = 8;
- CPUInfo._L2.uiLineSize = 64;
- CPUInfo._L2.bSectored = true;
- break;
- case 0x7B: // cfg = 0x7B: code and data L2 cache present, 512 KB, 8 ways, 64 byte lines, sectored
- CPUInfo._L2.bPresent = true;
- strcpy(CPUInfo._L2.strSize, "512 KB"); /* Flawfinder: ignore */
- CPUInfo._L2.uiAssociativeWays = 8;
- CPUInfo._L2.uiLineSize = 64;
- CPUInfo._L2.bSectored = true;
- break;
- case 0x7C: // cfg = 0x7C: code and data L2 cache present, 1024 KB, 8 ways, 64 byte lines, sectored
- CPUInfo._L2.bPresent = true;
- strcpy(CPUInfo._L2.strSize, "1 MB"); /* Flawfinder: ignore */
- CPUInfo._L2.uiAssociativeWays = 8;
- CPUInfo._L2.uiLineSize = 64;
- CPUInfo._L2.bSectored = true;
- break;
- case 0x81: // cfg = 0x81: code and data L2 cache present, 128 KB, 8 ways, 32 byte lines
- CPUInfo._L2.bPresent = true;
- strcpy(CPUInfo._L2.strSize, "128 KB"); /* Flawfinder: ignore */
- CPUInfo._L2.uiAssociativeWays = 8;
- CPUInfo._L2.uiLineSize = 32;
- break;
- case 0x82: // cfg = 0x82: code and data L2 cache present, 256 KB, 8 ways, 32 byte lines
- CPUInfo._L2.bPresent = true;
- strcpy(CPUInfo._L2.strSize, "256 KB"); /* Flawfinder: ignore */
- CPUInfo._L2.uiAssociativeWays = 8;
- CPUInfo._L2.uiLineSize = 32;
- break;
- case 0x83: // cfg = 0x83: code and data L2 cache present, 512 KB, 8 ways, 32 byte lines
- CPUInfo._L2.bPresent = true;
- strcpy(CPUInfo._L2.strSize, "512 KB"); /* Flawfinder: ignore */
- CPUInfo._L2.uiAssociativeWays = 8;
- CPUInfo._L2.uiLineSize = 32;
- break;
- case 0x84: // cfg = 0x84: code and data L2 cache present, 1024 KB, 8 ways, 32 byte lines
- CPUInfo._L2.bPresent = true;
- strcpy(CPUInfo._L2.strSize, "1 MB"); /* Flawfinder: ignore */
- CPUInfo._L2.uiAssociativeWays = 8;
- CPUInfo._L2.uiLineSize = 32;
- break;
- case 0x85: // cfg = 0x85: code and data L2 cache present, 2048 KB, 8 ways, 32 byte lines
- CPUInfo._L2.bPresent = true;
- strcpy(CPUInfo._L2.strSize, "2 MB"); /* Flawfinder: ignore */
- CPUInfo._L2.uiAssociativeWays = 8;
- CPUInfo._L2.uiLineSize = 32;
- break;
+ uint64_t ext_feature_info = getSysctlInt64("machdep.cpu.extfeature_bits");
+ S32 *ext_feature_infos = (S32*)(&ext_feature_info);
+ setConfig(eExtFeatureBits, ext_feature_infos[0]);
}
-}
+};
-FORCEINLINE static char *TranslateAssociativeWays(unsigned int uiWays, char *buf)
-{
- // We define 0xFFFFFFFF (= -1) as fully associative
- if (uiWays == ((unsigned int) -1))
- strcpy(buf, "fully associative"); /* Flawfinder: ignore */
- else
- {
- if (uiWays == 1) // A one way associative cache is just direct mapped
- strcpy(buf, "direct mapped"); /* Flawfinder: ignore */
- else if (uiWays == 0) // This should not happen...
- strcpy(buf, "unknown associative ways"); /* Flawfinder: ignore */
- else // The x-way associative cache
- sprintf(buf, "%d ways associative", uiWays); /* Flawfinder: ignore */
- }
- // To ease the function use we return the buffer
- return buf;
-}
-FORCEINLINE static void TranslateTLB(ProcessorTLB *tlb)
-{
- char buf[64]; /* Flawfinder: ignore */
+#elif LL_LINUX
+const char CPUINFO_FILE[] = "/proc/cpuinfo";
- // We just check if the TLB is present
- if (tlb->bPresent)
- snprintf(tlb->strTLB,sizeof(tlb->strTLB), "%s page size, %s, %d entries", tlb->strPageSize, TranslateAssociativeWays(tlb->uiAssociativeWays, buf), tlb->uiEntries); /* Flawfinder: ignore */
- else
- strcpy(tlb->strTLB, "Not present"); /* Flawfinder: ignore */
-}
-FORCEINLINE static void TranslateCache(ProcessorCache *cache)
+class LLProcessorInfoLinuxImpl : public LLProcessorInfoImpl
{
- char buf[64]; /* Flawfinder: ignore */
-
- // We just check if the cache is present
- if (cache->bPresent)
- {
- // If present we construct the string
- snprintf(cache->strCache, sizeof(cache->strCache), "%s cache size, %s, %d bytes line size", cache->strSize, TranslateAssociativeWays(cache->uiAssociativeWays, buf), cache->uiLineSize); /* Flawfinder: ignore */
- if (cache->bSectored)
- strncat(cache->strCache, ", sectored", sizeof(cache->strCache)-strlen(cache->strCache)-1); /* Flawfinder: ignore */
- }
- else
+public:
+ LLProcessorInfoLinuxImpl()
{
- // Else we just say "Not present"
- strcpy(cache->strCache, "Not present"); /* Flawfinder: ignore */
+ get_proc_cpuinfo();
}
-}
-// void CProcessor::TranslateProcessorConfiguration()
-// ==================================================
-// Private class function to translate the processor configuration values
-// to strings
-/////////////////////////////////////////////////////////////////////////
-void CProcessor::TranslateProcessorConfiguration()
-{
- // We just call the small functions defined above
- TranslateTLB(&CPUInfo._Data);
- TranslateTLB(&CPUInfo._Instruction);
-
- TranslateCache(&CPUInfo._Trace);
-
- TranslateCache(&CPUInfo._L1.Instruction);
- TranslateCache(&CPUInfo._L1.Data);
- TranslateCache(&CPUInfo._L2);
- TranslateCache(&CPUInfo._L3);
-}
-
-// void CProcessor::GetStandardProcessorConfiguration()
-// ====================================================
-// Private class function to read the standard processor configuration
-//////////////////////////////////////////////////////////////////////
-void CProcessor::GetStandardProcessorConfiguration()
-{
-#if LL_WINDOWS
- unsigned long eaxreg, ebxreg, ecxreg, edxreg;
+ virtual ~LLProcessorInfoLinuxImpl() {}
+private:
- // We check if the CPUID function is available
- if (!CheckCPUIDPresence())
- return;
-
- // First we check if the processor supports the standard
- // CPUID level 0x00000002
- if (CPUInfo.MaxSupportedLevel >= 2)
+ void get_proc_cpuinfo()
{
- // Now we go read the std. CPUID level 0x00000002 the first time
- unsigned long count, num = 255;
- for (count = 0; count < num; count++)
+ std::map< std::string, std::string > cpuinfo;
+ LLFILE* cpuinfo_fp = LLFile::fopen(CPUINFO_FILE, "rb");
+ if(cpuinfo_fp)
{
- __asm
- {
- mov eax, 2
- cpuid
- mov eaxreg, eax
- mov ebxreg, ebx
- mov ecxreg, ecx
- mov edxreg, edx
- }
- // We have to repeat this reading for 'num' times
- num = eaxreg & 0xFF;
-
- // Then we call the big decode switch function
- DecodeProcessorConfiguration(eaxreg >> 8);
- DecodeProcessorConfiguration(eaxreg >> 16);
- DecodeProcessorConfiguration(eaxreg >> 24);
-
- // If ebx contains additional data we also decode it
- if ((ebxreg & 0x80000000) == 0)
- {
- DecodeProcessorConfiguration(ebxreg);
- DecodeProcessorConfiguration(ebxreg >> 8);
- DecodeProcessorConfiguration(ebxreg >> 16);
- DecodeProcessorConfiguration(ebxreg >> 24);
- }
- // And also the ecx register
- if ((ecxreg & 0x80000000) == 0)
+ char line[MAX_STRING];
+ memset(line, 0, MAX_STRING);
+ while(fgets(line, MAX_STRING, cpuinfo_fp))
{
- DecodeProcessorConfiguration(ecxreg);
- DecodeProcessorConfiguration(ecxreg >> 8);
- DecodeProcessorConfiguration(ecxreg >> 16);
- DecodeProcessorConfiguration(ecxreg >> 24);
- }
- // At last the edx processor register
- if ((edxreg & 0x80000000) == 0)
- {
- DecodeProcessorConfiguration(edxreg);
- DecodeProcessorConfiguration(edxreg >> 8);
- DecodeProcessorConfiguration(edxreg >> 16);
- DecodeProcessorConfiguration(edxreg >> 24);
+ // /proc/cpuinfo on Linux looks like:
+ // name\t*: value\n
+ char* tabspot = strchr( line, '\t' );
+ if (tabspot == NULL)
+ continue;
+ char* colspot = strchr( tabspot, ':' );
+ if (colspot == NULL)
+ continue;
+ char* spacespot = strchr( colspot, ' ' );
+ if (spacespot == NULL)
+ continue;
+ char* nlspot = strchr( line, '\n' );
+ if (nlspot == NULL)
+ nlspot = line + strlen( line ); // Fallback to terminating NUL
+ std::string linename( line, tabspot );
+ std::string llinename(linename);
+ LLStringUtil::toLower(llinename);
+ std::string lineval( spacespot + 1, nlspot );
+ cpuinfo[ llinename ] = lineval;
}
+ fclose(cpuinfo_fp);
+ }
+# if LL_X86
+
+// *NOTE:Mani - eww, macros! srry.
+#define LLPI_SET_INFO_STRING(llpi_id, cpuinfo_id) \
+ if (!cpuinfo[cpuinfo_id].empty()) \
+ { setInfo(llpi_id, cpuinfo[cpuinfo_id]);}
+
+#define LLPI_SET_INFO_INT(llpi_id, cpuinfo_id) \
+ {\
+ S32 result; \
+ if (!cpuinfo[cpuinfo_id].empty() \
+ && LLStringUtil::convertToS32(cpuinfo[cpuinfo_id], result)) \
+ { setInfo(llpi_id, result);} \
+ }
+
+ F64 mhz;
+ if (LLStringUtil::convertToF64(cpuinfo["cpu mhz"], mhz)
+ && 200.0 < mhz && mhz < 10000.0)
+ {
+ setInfo(eFrequency,(F64)(mhz));
}
- }
-#endif
-}
-// void CProcessor::GetStandardProcessorExtensions()
-// =================================================
-// Private class function to read the standard processor extensions
-///////////////////////////////////////////////////////////////////
-void CProcessor::GetStandardProcessorExtensions()
-{
-#if LL_WINDOWS
- unsigned long ebxreg, edxreg;
+ LLPI_SET_INFO_STRING(eBrandName, "model name");
+ LLPI_SET_INFO_STRING(eVendor, "vendor_id");
- // We check if the CPUID command is available
- if (!CheckCPUIDPresence())
- return;
- // We just get the standard CPUID level 0x00000001 which should be
- // available on every x86 processor
- __asm
- {
- mov eax, 1
- cpuid
- mov ebxreg, ebx
- mov edxreg, edx
- }
-
- // Then we mask some bits
- CPUInfo._Ext.FPU_FloatingPointUnit = CheckBit(edxreg, 0);
- CPUInfo._Ext.VME_Virtual8086ModeEnhancements = CheckBit(edxreg, 1);
- CPUInfo._Ext.DE_DebuggingExtensions = CheckBit(edxreg, 2);
- CPUInfo._Ext.PSE_PageSizeExtensions = CheckBit(edxreg, 3);
- CPUInfo._Ext.TSC_TimeStampCounter = CheckBit(edxreg, 4);
- CPUInfo._Ext.MSR_ModelSpecificRegisters = CheckBit(edxreg, 5);
- CPUInfo._Ext.PAE_PhysicalAddressExtension = CheckBit(edxreg, 6);
- CPUInfo._Ext.MCE_MachineCheckException = CheckBit(edxreg, 7);
- CPUInfo._Ext.CX8_COMPXCHG8B_Instruction = CheckBit(edxreg, 8);
- CPUInfo._Ext.APIC_AdvancedProgrammableInterruptController = CheckBit(edxreg, 9);
- CPUInfo._Ext.APIC_ID = (ebxreg >> 24) & 0xFF;
- CPUInfo._Ext.SEP_FastSystemCall = CheckBit(edxreg, 11);
- CPUInfo._Ext.MTRR_MemoryTypeRangeRegisters = CheckBit(edxreg, 12);
- CPUInfo._Ext.PGE_PTE_GlobalFlag = CheckBit(edxreg, 13);
- CPUInfo._Ext.MCA_MachineCheckArchitecture = CheckBit(edxreg, 14);
- CPUInfo._Ext.CMOV_ConditionalMoveAndCompareInstructions = CheckBit(edxreg, 15);
- CPUInfo._Ext.FGPAT_PageAttributeTable = CheckBit(edxreg, 16);
- CPUInfo._Ext.PSE36_36bitPageSizeExtension = CheckBit(edxreg, 17);
- CPUInfo._Ext.PN_ProcessorSerialNumber = CheckBit(edxreg, 18);
- CPUInfo._Ext.CLFSH_CFLUSH_Instruction = CheckBit(edxreg, 19);
- CPUInfo._Ext.CLFLUSH_InstructionCacheLineSize = (ebxreg >> 8) & 0xFF;
- CPUInfo._Ext.DS_DebugStore = CheckBit(edxreg, 21);
- CPUInfo._Ext.ACPI_ThermalMonitorAndClockControl = CheckBit(edxreg, 22);
- CPUInfo._Ext.MMX_MultimediaExtensions = CheckBit(edxreg, 23);
- CPUInfo._Ext.FXSR_FastStreamingSIMD_ExtensionsSaveRestore = CheckBit(edxreg, 24);
- CPUInfo._Ext.SSE_StreamingSIMD_Extensions = CheckBit(edxreg, 25);
- CPUInfo._Ext.SSE2_StreamingSIMD2_Extensions = CheckBit(edxreg, 26);
- CPUInfo._Ext.Altivec_Extensions = false;
- CPUInfo._Ext.SS_SelfSnoop = CheckBit(edxreg, 27);
- CPUInfo._Ext.HT_HyperThreading = CheckBit(edxreg, 28);
- CPUInfo._Ext.HT_HyterThreadingSiblings = (ebxreg >> 16) & 0xFF;
- CPUInfo._Ext.TM_ThermalMonitor = CheckBit(edxreg, 29);
- CPUInfo._Ext.IA64_Intel64BitArchitecture = CheckBit(edxreg, 30);
-#endif
-}
+ LLPI_SET_INFO_INT(eStepping, "stepping");
+ LLPI_SET_INFO_INT(eModel, "model");
-// const ProcessorInfo *CProcessor::GetCPUInfo()
-// =============================================
-// Calls all the other detection function to create an detailed
-// processor information
-///////////////////////////////////////////////////////////////
-const ProcessorInfo *CProcessor::GetCPUInfo()
-{
-#if LL_WINDOWS
- unsigned long eaxreg, ebxreg, ecxreg, edxreg;
+
+ S32 family;
+ if (!cpuinfo["cpu family"].empty()
+ && LLStringUtil::convertToS32(cpuinfo["cpu family"], family))
+ {
+ setInfo(eFamily, family);
+ }
- // First of all we check if the CPUID command is available
- if (!CheckCPUIDPresence())
- return NULL;
+ setInfo(eFamilyName, compute_CPUFamilyName(cpuinfo["vendor_id"].c_str(), family));
- // We read the standard CPUID level 0x00000000 which should
- // be available on every x86 processor
- __asm
- {
- mov eax, 0
- cpuid
- mov eaxreg, eax
- mov ebxreg, ebx
- mov edxreg, edx
- mov ecxreg, ecx
- }
- // Then we connect the single register values to the vendor string
- *((unsigned long *) CPUInfo.strVendor) = ebxreg;
- *((unsigned long *) (CPUInfo.strVendor+4)) = edxreg;
- *((unsigned long *) (CPUInfo.strVendor+8)) = ecxreg;
- // Null terminate for string comparisons below.
- CPUInfo.strVendor[12] = 0;
-
- // We can also read the max. supported standard CPUID level
- CPUInfo.MaxSupportedLevel = eaxreg & 0xFFFF;
-
- // Then we read the ext. CPUID level 0x80000000
- __asm
- {
- mov eax, 0x80000000
- cpuid
- mov eaxreg, eax
- }
- // ...to check the max. supportted extended CPUID level
- CPUInfo.MaxSupportedExtendedLevel = eaxreg;
-
- // Then we switch to the specific processor vendors
- // See http://www.sandpile.org/ia32/cpuid.htm
- if (!strcmp(CPUInfo.strVendor, "GenuineIntel"))
- {
- AnalyzeIntelProcessor();
- }
- else if (!strcmp(CPUInfo.strVendor, "AuthenticAMD"))
- {
- AnalyzeAMDProcessor();
- }
- else if (!strcmp(CPUInfo.strVendor, "UMC UMC UMC"))
- {
- AnalyzeUnknownProcessor();
- }
- else if (!strcmp(CPUInfo.strVendor, "CyrixInstead"))
- {
- AnalyzeUnknownProcessor();
- }
- else if (!strcmp(CPUInfo.strVendor, "NexGenDriven"))
- {
- AnalyzeUnknownProcessor();
- }
- else if (!strcmp(CPUInfo.strVendor, "CentaurHauls"))
- {
- AnalyzeUnknownProcessor();
- }
- else if (!strcmp(CPUInfo.strVendor, "RiseRiseRise"))
- {
- AnalyzeUnknownProcessor();
- }
- else if (!strcmp(CPUInfo.strVendor, "SiS SiS SiS"))
- {
- AnalyzeUnknownProcessor();
- }
- else if (!strcmp(CPUInfo.strVendor, "GenuineTMx86"))
- {
- // Transmeta
- AnalyzeUnknownProcessor();
- }
- else if (!strcmp(CPUInfo.strVendor, "Geode by NSC"))
- {
- AnalyzeUnknownProcessor();
- }
- else
- {
- AnalyzeUnknownProcessor();
- }
-#endif
- // After all we return the class CPUInfo member var
- return (&CPUInfo);
-}
-
-#elif LL_SOLARIS
-#include <kstat.h>
+ // setInfo(eExtendedModel, getSysctlInt("machdep.cpu.extmodel"));
+ // setInfo(eBrandID, getSysctlInt("machdep.cpu.brand"));
+ // setInfo(eType, 0); // ? where to find this?
-#if defined(__i386)
-#include <sys/auxv.h>
-#endif
-
-// ======================
-// Class constructor:
-/////////////////////////
-CProcessor::CProcessor()
-{
- uqwFrequency = 0;
- strCPUName[0] = 0;
- memset(&CPUInfo, 0, sizeof(CPUInfo));
-}
-
-// unsigned __int64 CProcessor::GetCPUFrequency(unsigned int uiMeasureMSecs)
-// =========================================================================
-// Function to query the current CPU frequency
-////////////////////////////////////////////////////////////////////////////
-F64 CProcessor::GetCPUFrequency(unsigned int /*uiMeasureMSecs*/)
-{
- if(uqwFrequency == 0){
- GetCPUInfo();
- }
-
- return uqwFrequency;
-}
-
-// const ProcessorInfo *CProcessor::GetCPUInfo()
-// =============================================
-// Calls all the other detection function to create an detailed
-// processor information
-///////////////////////////////////////////////////////////////
-const ProcessorInfo *CProcessor::GetCPUInfo()
-{
- // In Solaris the CPU info is in the kstats
- // try "psrinfo" or "kstat cpu_info" to see all
- // that's available
- int ncpus=0, i;
- kstat_ctl_t *kc;
- kstat_t *ks;
- kstat_named_t *ksinfo, *ksi;
- kstat_t *CPU_stats_list;
-
- kc = kstat_open();
-
- if((int)kc == -1){
- llwarns << "kstat_open(0 failed!" << llendl;
- return (&CPUInfo);
- }
-
- for (ks = kc->kc_chain; ks != NULL; ks = ks->ks_next) {
- if (strncmp(ks->ks_module, "cpu_info", 8) == 0 &&
- strncmp(ks->ks_name, "cpu_info", 8) == 0)
- ncpus++;
- }
-
- if(ncpus < 1){
- llwarns << "No cpus found in kstats!" << llendl;
- return (&CPUInfo);
- }
-
- for (ks = kc->kc_chain; ks; ks = ks->ks_next) {
- if (strncmp(ks->ks_module, "cpu_info", 8) == 0
- && strncmp(ks->ks_name, "cpu_info", 8) == 0
- && kstat_read(kc, ks, NULL) != -1){
- CPU_stats_list = ks; // only looking at the first CPU
-
- break;
- }
- }
-
- if(ncpus > 1)
- snprintf(strCPUName, sizeof(strCPUName), "%d x ", ncpus);
-
- kstat_read(kc, CPU_stats_list, NULL);
- ksinfo = (kstat_named_t *)CPU_stats_list->ks_data;
- for(i=0; i < (int)(CPU_stats_list->ks_ndata); ++i){ // Walk the kstats for this cpu gathering what we need
- ksi = ksinfo++;
- if(!strcmp(ksi->name, "brand")){
- strncat(strCPUName, (char *)KSTAT_NAMED_STR_PTR(ksi),
- sizeof(strCPUName)-strlen(strCPUName)-1);
- strncat(CPUInfo.strFamily, (char *)KSTAT_NAMED_STR_PTR(ksi),
- sizeof(CPUInfo.strFamily)-strlen(CPUInfo.strFamily)-1);
- strncpy(CPUInfo.strBrandID, strCPUName,sizeof(CPUInfo.strBrandID)-1);
- CPUInfo.strBrandID[sizeof(CPUInfo.strBrandID)-1]='\0';
- // DEBUG llinfos << "CPU brand: " << strCPUName << llendl;
- continue;
- }
+ //setConfig(eCLFLUSHCacheLineSize, ((cpu_info[1] >> 8) & 0xff) * 8);
+ //setConfig(eAPICPhysicalID, (cpu_info[1] >> 24) & 0xff);
+ //setConfig(eCacheLineSize, getSysctlInt("machdep.cpu.cache.linesize"));
+ //setConfig(eL2Associativity, getSysctlInt("machdep.cpu.cache.L2_associativity"));
+ //setConfig(eCacheSizeK, getSysctlInt("machdep.cpu.cache.size"));
+
+ // Read extensions
+ std::string flags = " " + cpuinfo["flags"] + " ";
+ LLStringUtil::toLower(flags);
- if(!strcmp(ksi->name, "clock_MHz")){
-#if defined(__sparc)
- llinfos << "Raw kstat clock rate is: " << ksi->value.l << llendl;
- uqwFrequency = (F64)(ksi->value.l * 1000000);
-#else
- uqwFrequency = (F64)(ksi->value.i64 * 1000000);
-#endif
- //DEBUG llinfos << "CPU frequency: " << uqwFrequency << llendl;
- continue;
+ if( flags.find( " sse " ) != std::string::npos )
+ {
+ setExtension(cpu_feature_names[eSSE_Ext]);
}
-#if defined(__i386)
- if(!strcmp(ksi->name, "vendor_id")){
- strncpy(CPUInfo.strVendor, (char *)KSTAT_NAMED_STR_PTR(ksi), sizeof(CPUInfo.strVendor)-1);
- // DEBUG llinfos << "CPU vendor: " << CPUInfo.strVendor << llendl;
- continue;
+ if( flags.find( " sse2 " ) != std::string::npos )
+ {
+ setExtension(cpu_feature_names[eSSE2_Ext]);
}
-#endif
- }
-
- kstat_close(kc);
-
-#if defined(__sparc) // SPARC does not define a vendor string in kstat
- strncpy(CPUInfo.strVendor, "Sun Microsystems, Inc.", sizeof(CPUInfo.strVendor)-1);
-#endif
-
- // DEBUG llinfo << "The system has " << ncpus << " CPUs with a clock rate of " << uqwFrequency << "MHz." << llendl;
-
-#if defined (__i386) // we really don't care about the CPU extensions on SPARC but on x86...
-
- // Now get cpu extensions
-
- uint_t ui;
-
- (void) getisax(&ui, 1);
-
- if(ui & AV_386_FPU)
- CPUInfo._Ext.FPU_FloatingPointUnit = true;
- if(ui & AV_386_CX8)
- CPUInfo._Ext.CX8_COMPXCHG8B_Instruction = true;
- if(ui & AV_386_MMX)
- CPUInfo._Ext.MMX_MultimediaExtensions = true;
- if(ui & AV_386_AMD_MMX)
- CPUInfo._Ext.MMX_MultimediaExtensions = true;
- if(ui & AV_386_FXSR)
- CPUInfo._Ext.FXSR_FastStreamingSIMD_ExtensionsSaveRestore = true;
- if(ui & AV_386_SSE)
- CPUInfo._Ext.SSE_StreamingSIMD_Extensions = true;
- if(ui & AV_386_SSE2)
- CPUInfo._Ext.SSE2_StreamingSIMD2_Extensions = true;
-/* Left these here since they may get used later
- if(ui & AV_386_SSE3)
- CPUInfo._Ext.... = true;
- if(ui & AV_386_AMD_3DNow)
- CPUInfo._Ext.... = true;
- if(ui & AV_386_AMD_3DNowx)
- CPUInfo._Ext.... = true;
-*/
-#endif
- return (&CPUInfo);
-}
-
-#else
-// LL_DARWIN
-
-#include <mach/machine.h>
-#include <sys/sysctl.h>
-
-static char *TranslateAssociativeWays(unsigned int uiWays, char *buf)
-{
- // We define 0xFFFFFFFF (= -1) as fully associative
- if (uiWays == ((unsigned int) -1))
- strcpy(buf, "fully associative"); /* Flawfinder: ignore */
- else
- {
- if (uiWays == 1) // A one way associative cache is just direct mapped
- strcpy(buf, "direct mapped"); /* Flawfinder: ignore */
- else if (uiWays == 0) // This should not happen...
- strcpy(buf, "unknown associative ways"); /* Flawfinder: ignore */
- else // The x-way associative cache
- sprintf(buf, "%d ways associative", uiWays); /* Flawfinder: ignore */
- }
- // To ease the function use we return the buffer
- return buf;
-}
-static void TranslateTLB(ProcessorTLB *tlb)
-{
- char buf[64]; /* Flawfinder: ignore */
-
- // We just check if the TLB is present
- if (tlb->bPresent)
- snprintf(tlb->strTLB, sizeof(tlb->strTLB), "%s page size, %s, %d entries", tlb->strPageSize, TranslateAssociativeWays(tlb->uiAssociativeWays, buf), tlb->uiEntries); /* Flawfinder: ignore */
- else
- strcpy(tlb->strTLB, "Not present"); /* Flawfinder: ignore */
-}
-static void TranslateCache(ProcessorCache *cache)
-{
- char buf[64]; /* Flawfinder: ignore */
-
- // We just check if the cache is present
- if (cache->bPresent)
- {
- // If present we construct the string
- snprintf(cache->strCache,sizeof(cache->strCache), "%s cache size, %s, %d bytes line size", cache->strSize, TranslateAssociativeWays(cache->uiAssociativeWays, buf), cache->uiLineSize); /* Flawfinder: ignore */
- if (cache->bSectored)
- strncat(cache->strCache, ", sectored", sizeof(cache->strCache)-strlen(cache->strCache)-1); /* Flawfinder: ignore */
- }
- else
- {
- // Else we just say "Not present"
- strcpy(cache->strCache, "Not present"); /* Flawfinder: ignore */
- }
-}
-
-// void CProcessor::TranslateProcessorConfiguration()
-// ==================================================
-// Private class function to translate the processor configuration values
-// to strings
-/////////////////////////////////////////////////////////////////////////
-void CProcessor::TranslateProcessorConfiguration()
-{
- // We just call the small functions defined above
- TranslateTLB(&CPUInfo._Data);
- TranslateTLB(&CPUInfo._Instruction);
-
- TranslateCache(&CPUInfo._Trace);
-
- TranslateCache(&CPUInfo._L1.Instruction);
- TranslateCache(&CPUInfo._L1.Data);
- TranslateCache(&CPUInfo._L2);
- TranslateCache(&CPUInfo._L3);
-}
-
-// CProcessor::CProcessor
-// ======================
-// Class constructor:
-/////////////////////////
-CProcessor::CProcessor()
-{
- uqwFrequency = 0;
- strCPUName[0] = 0;
- memset(&CPUInfo, 0, sizeof(CPUInfo));
-}
-
-// unsigned __int64 CProcessor::GetCPUFrequency(unsigned int uiMeasureMSecs)
-// =========================================================================
-// Function to query the current CPU frequency
-////////////////////////////////////////////////////////////////////////////
-F64 CProcessor::GetCPUFrequency(unsigned int /*uiMeasureMSecs*/)
-{
- U64 frequency = 0;
- size_t len = sizeof(frequency);
-
- if(sysctlbyname("hw.cpufrequency", &frequency, &len, NULL, 0) == 0)
- {
- uqwFrequency = (F64)frequency;
- }
-
- return uqwFrequency;
-}
-
-static bool hasFeature(const char *name)
-{
- bool result = false;
- int val = 0;
- size_t len = sizeof(val);
-
- if(sysctlbyname(name, &val, &len, NULL, 0) == 0)
- {
- if(val != 0)
- result = true;
- }
-
- return result;
-}
-
-// const ProcessorInfo *CProcessor::GetCPUInfo()
-// =============================================
-// Calls all the other detection function to create an detailed
-// processor information
-///////////////////////////////////////////////////////////////
-const ProcessorInfo *CProcessor::GetCPUInfo()
-{
- int pagesize = 0;
- int cachelinesize = 0;
- int l1icachesize = 0;
- int l1dcachesize = 0;
- int l2settings = 0;
- int l2cachesize = 0;
- int l3settings = 0;
- int l3cachesize = 0;
- int ncpu = 0;
- int cpusubtype = 0;
-
- // sysctl knows all.
- int mib[2];
- size_t len;
- mib[0] = CTL_HW;
-
- mib[1] = HW_PAGESIZE;
- len = sizeof(pagesize);
- sysctl(mib, 2, &pagesize, &len, NULL, 0);
-
- mib[1] = HW_CACHELINE;
- len = sizeof(cachelinesize);
- sysctl(mib, 2, &cachelinesize, &len, NULL, 0);
-
- mib[1] = HW_L1ICACHESIZE;
- len = sizeof(l1icachesize);
- sysctl(mib, 2, &l1icachesize, &len, NULL, 0);
- mib[1] = HW_L1DCACHESIZE;
- len = sizeof(l1dcachesize);
- sysctl(mib, 2, &l1dcachesize, &len, NULL, 0);
-
- mib[1] = HW_L2SETTINGS;
- len = sizeof(l2settings);
- sysctl(mib, 2, &l2settings, &len, NULL, 0);
-
- mib[1] = HW_L2CACHESIZE;
- len = sizeof(l2cachesize);
- sysctl(mib, 2, &l2cachesize, &len, NULL, 0);
-
- mib[1] = HW_L3SETTINGS;
- len = sizeof(l3settings);
- sysctl(mib, 2, &l3settings, &len, NULL, 0);
-
- mib[1] = HW_L3CACHESIZE;
- len = sizeof(l3cachesize);
- sysctl(mib, 2, &l3cachesize, &len, NULL, 0);
-
- mib[1] = HW_NCPU;
- len = sizeof(ncpu);
- sysctl(mib, 2, &ncpu, &len, NULL, 0);
-
- sysctlbyname("hw.cpusubtype", &cpusubtype, &len, NULL, 0);
-
- strCPUName[0] = 0;
-
- if((ncpu == 0) || (ncpu == 1))
- {
- // Uhhh...
- }
- else if(ncpu == 2)
- {
- strncat(strCPUName, "Dual ", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */
+# endif // LL_X86
}
- else
- {
- snprintf(strCPUName, sizeof(strCPUName), "%d x ", ncpu); /* Flawfinder: ignore */
- }
-
-#if __ppc__
- switch(cpusubtype)
- {
- case CPU_SUBTYPE_POWERPC_601:// ((cpu_subtype_t) 1)
- strncat(strCPUName, "PowerPC 601", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */
- strncat(CPUInfo.strFamily, "PowerPC", sizeof(CPUInfo.strFamily)-strlen(CPUInfo.strFamily)-1); /* Flawfinder: ignore */
-
- break;
- case CPU_SUBTYPE_POWERPC_602:// ((cpu_subtype_t) 2)
- strncat(strCPUName, "PowerPC 602", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */
- strncat(CPUInfo.strFamily, "PowerPC", sizeof(CPUInfo.strFamily)-strlen(CPUInfo.strFamily)-1); /* Flawfinder: ignore */
- break;
- case CPU_SUBTYPE_POWERPC_603:// ((cpu_subtype_t) 3)
- strncat(strCPUName, "PowerPC 603", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */
- strncat(CPUInfo.strFamily, "PowerPC", sizeof(CPUInfo.strFamily)-strlen(CPUInfo.strFamily)-1); /* Flawfinder: ignore */
- break;
- case CPU_SUBTYPE_POWERPC_603e:// ((cpu_subtype_t) 4)
- strncat(strCPUName, "PowerPC 603e", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */
- strncat(CPUInfo.strFamily, "PowerPC", sizeof(CPUInfo.strFamily)-strlen(CPUInfo.strFamily)-1); /* Flawfinder: ignore */
- break;
- case CPU_SUBTYPE_POWERPC_603ev:// ((cpu_subtype_t) 5)
- strncat(strCPUName, "PowerPC 603ev", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */
- strncat(CPUInfo.strFamily, "PowerPC", sizeof(CPUInfo.strFamily)-strlen(CPUInfo.strFamily)-1); /* Flawfinder: ignore */
- break;
- case CPU_SUBTYPE_POWERPC_604:// ((cpu_subtype_t) 6)
- strncat(strCPUName, "PowerPC 604", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */
- strncat(CPUInfo.strFamily, "PowerPC", sizeof(CPUInfo.strFamily)-strlen(CPUInfo.strFamily)-1); /* Flawfinder: ignore */
- break;
- case CPU_SUBTYPE_POWERPC_604e:// ((cpu_subtype_t) 7)
- strncat(strCPUName, "PowerPC 604e", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */
- strncat(CPUInfo.strFamily, "PowerPC", sizeof(CPUInfo.strFamily)-strlen(CPUInfo.strFamily)-1); /* Flawfinder: ignore */
- break;
- case CPU_SUBTYPE_POWERPC_620:// ((cpu_subtype_t) 8)
- strncat(strCPUName, "PowerPC 620", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */
- strncat(CPUInfo.strFamily, "PowerPC", sizeof(CPUInfo.strFamily)-strlen(CPUInfo.strFamily)-1); /* Flawfinder: ignore */
- break;
- case CPU_SUBTYPE_POWERPC_750:// ((cpu_subtype_t) 9)
- strncat(strCPUName, "PowerPC 750", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */
- strncat(CPUInfo.strFamily, "PowerPC G3", sizeof(CPUInfo.strFamily)-strlen(CPUInfo.strFamily)-1); /* Flawfinder: ignore */
- break;
- case CPU_SUBTYPE_POWERPC_7400:// ((cpu_subtype_t) 10)
- strncat(strCPUName, "PowerPC 7400", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */
- strncat(CPUInfo.strFamily, "PowerPC G4", sizeof(CPUInfo.strFamily)-strlen(CPUInfo.strFamily)-1); /* Flawfinder: ignore */
- break;
- case CPU_SUBTYPE_POWERPC_7450:// ((cpu_subtype_t) 11)
- strncat(strCPUName, "PowerPC 7450", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */
- strncat(CPUInfo.strFamily, "PowerPC G4", sizeof(CPUInfo.strFamily)-strlen(CPUInfo.strFamily)-1); /* Flawfinder: ignore */
- break;
- case CPU_SUBTYPE_POWERPC_970:// ((cpu_subtype_t) 100)
- strncat(strCPUName, "PowerPC 970", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */
- strncat(CPUInfo.strFamily, "PowerPC G5", sizeof(CPUInfo.strFamily)-strlen(CPUInfo.strFamily)-1); /* Flawfinder: ignore */
- break;
-
- default:
- strncat(strCPUName, "PowerPC (Unknown)", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */
- break;
- }
-
- CPUInfo._Ext.EMMX_MultimediaExtensions =
- CPUInfo._Ext.MMX_MultimediaExtensions =
- CPUInfo._Ext.SSE_StreamingSIMD_Extensions =
- CPUInfo._Ext.SSE2_StreamingSIMD2_Extensions = false;
- CPUInfo._Ext.Altivec_Extensions = hasFeature("hw.optional.altivec");
-
-#endif
-
-#if __i386__
- // MBW -- XXX -- TODO -- make this call AnalyzeIntelProcessor()?
- switch(cpusubtype)
+ std::string getCPUFeatureDescription() const
{
- default:
- strncat(strCPUName, "i386 (Unknown)", sizeof(strCPUName)-strlen(strCPUName)-1); /* Flawfinder: ignore */
- break;
- }
-
- CPUInfo._Ext.EMMX_MultimediaExtensions = hasFeature("hw.optional.mmx"); // MBW -- XXX -- this may be wrong...
- CPUInfo._Ext.MMX_MultimediaExtensions = hasFeature("hw.optional.mmx");
- CPUInfo._Ext.SSE_StreamingSIMD_Extensions = hasFeature("hw.optional.sse");
- CPUInfo._Ext.SSE2_StreamingSIMD2_Extensions = hasFeature("hw.optional.sse2");
- CPUInfo._Ext.Altivec_Extensions = false;
- CPUInfo._Ext.AA64_AMD64BitArchitecture = hasFeature("hw.optional.x86_64");
+ std::ostringstream s;
-#endif
-
- // Terse CPU info uses this string...
- strncpy(CPUInfo.strBrandID, strCPUName,sizeof(CPUInfo.strBrandID)-1); /* Flawfinder: ignore */
- CPUInfo.strBrandID[sizeof(CPUInfo.strBrandID)-1]='\0';
-
- // Fun cache config stuff...
-
- if(l1dcachesize != 0)
- {
- CPUInfo._L1.Data.bPresent = true;
- snprintf(CPUInfo._L1.Data.strSize, sizeof(CPUInfo._L1.Data.strSize), "%d KB", l1dcachesize / 1024); /* Flawfinder: ignore */
-// CPUInfo._L1.Data.uiAssociativeWays = ???;
- CPUInfo._L1.Data.uiLineSize = cachelinesize;
+ // *NOTE:Mani - This is for linux only.
+ LLFILE* cpuinfo = LLFile::fopen(CPUINFO_FILE, "rb");
+ if(cpuinfo)
+ {
+ char line[MAX_STRING];
+ memset(line, 0, MAX_STRING);
+ while(fgets(line, MAX_STRING, cpuinfo))
+ {
+ line[strlen(line)-1] = ' ';
+ s << line;
+ s << std::endl;
+ }
+ fclose(cpuinfo);
+ s << std::endl;
+ }
+ else
+ {
+ s << "Unable to collect processor information" << std::endl;
+ }
+ return s.str();
}
+
+};
- if(l1icachesize != 0)
- {
- CPUInfo._L1.Instruction.bPresent = true;
- snprintf(CPUInfo._L1.Instruction.strSize, sizeof(CPUInfo._L1.Instruction.strSize), "%d KB", l1icachesize / 1024); /* Flawfinder: ignore */
-// CPUInfo._L1.Instruction.uiAssociativeWays = ???;
- CPUInfo._L1.Instruction.uiLineSize = cachelinesize;
- }
- if(l2cachesize != 0)
- {
- CPUInfo._L2.bPresent = true;
- snprintf(CPUInfo._L2.strSize, sizeof(CPUInfo._L2.strSize), "%d KB", l2cachesize / 1024); /* Flawfinder: ignore */
-// CPUInfo._L2.uiAssociativeWays = ???;
- CPUInfo._L2.uiLineSize = cachelinesize;
- }
+#endif // LL_MSVC elif LL_DARWIN elif LL_LINUX
- if(l3cachesize != 0)
- {
- CPUInfo._L2.bPresent = true;
- snprintf(CPUInfo._L2.strSize, sizeof(CPUInfo._L2.strSize), "%d KB", l3cachesize / 1024); /* Flawfinder: ignore */
-// CPUInfo._L2.uiAssociativeWays = ???;
- CPUInfo._L2.uiLineSize = cachelinesize;
+//////////////////////////////////////////////////////
+// Interface definition
+LLProcessorInfo::LLProcessorInfo() : mImpl(NULL)
+{
+ // *NOTE:Mani - not thread safe.
+ if(!mImpl)
+ {
+#ifdef LL_MSVC
+ static LLProcessorInfoWindowsImpl the_impl;
+ mImpl = &the_impl;
+#elif LL_DARWIN
+ static LLProcessorInfoDarwinImpl the_impl;
+ mImpl = &the_impl;
+#else
+ static LLProcessorInfoLinuxImpl the_impl;
+ mImpl = &the_impl;
+#endif // LL_MSVC
}
-
- CPUInfo._Ext.FPU_FloatingPointUnit = hasFeature("hw.optional.floatingpoint");
-
-// printf("pagesize = 0x%x\n", pagesize);
-// printf("cachelinesize = 0x%x\n", cachelinesize);
-// printf("l1icachesize = 0x%x\n", l1icachesize);
-// printf("l1dcachesize = 0x%x\n", l1dcachesize);
-// printf("l2settings = 0x%x\n", l2settings);
-// printf("l2cachesize = 0x%x\n", l2cachesize);
-// printf("l3settings = 0x%x\n", l3settings);
-// printf("l3cachesize = 0x%x\n", l3cachesize);
-
- // After reading we translate the configuration to strings
- TranslateProcessorConfiguration();
-
- // After all we return the class CPUInfo member var
- return (&CPUInfo);
}
-#endif // LL_DARWIN
-// bool CProcessor::CPUInfoToText(char *strBuffer, unsigned int uiMaxLen)
-// ======================================================================
-// Gets the frequency and processor information and writes it to a string
-/////////////////////////////////////////////////////////////////////////
-bool CProcessor::CPUInfoToText(char *strBuffer, unsigned int uiMaxLen)
-{
-#define LENCHECK len = (unsigned int) strlen(buf); if (len >= uiMaxLen) return false; strcpy(strBuffer, buf); strBuffer += len; /*Flawfinder: ignore*/
-#define COPYADD(str) strcpy(buf, str); LENCHECK; /* Flawfinder: ignore */
-#define FORMATADD(format, var) sprintf(buf, format, var); LENCHECK; /* Flawfinder: ignore */
-#define BOOLADD(str, boolvar) COPYADD(str); if (boolvar) { COPYADD(" Yes\n"); } else { COPYADD(" No\n"); }
-
- char buf[1024]; /* Flawfinder: ignore */
- unsigned int len;
-
- // First we have to get the frequency
- GetCPUFrequency(50);
-
- // Then we get the processor information
- GetCPUInfo();
-
- // Now we construct the string (see the macros at function beginning)
- strBuffer[0] = 0;
-
- COPYADD("// CPU General Information\n//////////////////////////\n");
- FORMATADD("Processor name: %s\n", strCPUName);
- FORMATADD("Frequency: %.2f MHz\n\n", (float) uqwFrequency / 1000000.0f);
- FORMATADD("Vendor: %s\n", CPUInfo.strVendor);
- FORMATADD("Family: %s\n", CPUInfo.strFamily);
- FORMATADD("Extended family: %d\n", CPUInfo.uiExtendedFamily);
- FORMATADD("Model: %s\n", CPUInfo.strModel);
- FORMATADD("Extended model: %d\n", CPUInfo.uiExtendedModel);
- FORMATADD("Type: %s\n", CPUInfo.strType);
- FORMATADD("Brand ID: %s\n", CPUInfo.strBrandID);
- if (CPUInfo._Ext.PN_ProcessorSerialNumber)
- {
- FORMATADD("Processor Serial: %s\n", CPUInfo.strProcessorSerial);
- }
- else
- {
- COPYADD("Processor Serial: Disabled\n");
- }
-#if !LL_SOLARIS // NOTE: Why bother printing all this when it's irrelavent
-
- COPYADD("\n\n// CPU Configuration\n////////////////////\n");
- FORMATADD("L1 instruction cache: %s\n", CPUInfo._L1.Instruction.strCache);
- FORMATADD("L1 data cache: %s\n", CPUInfo._L1.Data.strCache);
- FORMATADD("L2 cache: %s\n", CPUInfo._L2.strCache);
- FORMATADD("L3 cache: %s\n", CPUInfo._L3.strCache);
- FORMATADD("Trace cache: %s\n", CPUInfo._Trace.strCache);
- FORMATADD("Instruction TLB: %s\n", CPUInfo._Instruction.strTLB);
- FORMATADD("Data TLB: %s\n", CPUInfo._Data.strTLB);
- FORMATADD("Max Supported CPUID-Level: 0x%08lX\n", CPUInfo.MaxSupportedLevel);
- FORMATADD("Max Supported Ext. CPUID-Level: 0x%08lX\n", CPUInfo.MaxSupportedExtendedLevel);
-
- COPYADD("\n\n// CPU Extensions\n/////////////////\n");
- BOOLADD("AA64 AMD 64-bit Architecture: ", CPUInfo._Ext.AA64_AMD64BitArchitecture);
- BOOLADD("ACPI Thermal Monitor And Clock Control: ", CPUInfo._Ext.ACPI_ThermalMonitorAndClockControl);
- BOOLADD("APIC Advanced Programmable Interrupt Controller: ", CPUInfo._Ext.APIC_AdvancedProgrammableInterruptController);
- FORMATADD(" APIC-ID: %d\n", CPUInfo._Ext.APIC_ID);
- BOOLADD("CLFSH CLFLUSH Instruction Presence: ", CPUInfo._Ext.CLFSH_CFLUSH_Instruction);
- FORMATADD(" CLFLUSH Instruction Cache Line Size: %d\n", CPUInfo._Ext.CLFLUSH_InstructionCacheLineSize);
- BOOLADD("CMOV Conditional Move And Compare Instructions: ", CPUInfo._Ext.CMOV_ConditionalMoveAndCompareInstructions);
- BOOLADD("CX8 COMPXCHG8B Instruction: ", CPUInfo._Ext.CX8_COMPXCHG8B_Instruction);
- BOOLADD("DE Debugging Extensions: ", CPUInfo._Ext.DE_DebuggingExtensions);
- BOOLADD("DS Debug Store: ", CPUInfo._Ext.DS_DebugStore);
- BOOLADD("FGPAT Page Attribute Table: ", CPUInfo._Ext.FGPAT_PageAttributeTable);
- BOOLADD("FPU Floating Point Unit: ", CPUInfo._Ext.FPU_FloatingPointUnit);
- BOOLADD("FXSR Fast Streaming SIMD Extensions Save/Restore:", CPUInfo._Ext.FXSR_FastStreamingSIMD_ExtensionsSaveRestore);
- BOOLADD("HT Hyper Threading: ", CPUInfo._Ext.HT_HyperThreading);
- BOOLADD("IA64 Intel 64-Bit Architecture: ", CPUInfo._Ext.IA64_Intel64BitArchitecture);
- BOOLADD("MCA Machine Check Architecture: ", CPUInfo._Ext.MCA_MachineCheckArchitecture);
- BOOLADD("MCE Machine Check Exception: ", CPUInfo._Ext.MCE_MachineCheckException);
- BOOLADD("MMX Multimedia Extensions: ", CPUInfo._Ext.MMX_MultimediaExtensions);
- BOOLADD("MMX+ Multimedia Extensions: ", CPUInfo._Ext.EMMX_MultimediaExtensions);
- BOOLADD("MSR Model Specific Registers: ", CPUInfo._Ext.MSR_ModelSpecificRegisters);
- BOOLADD("MTRR Memory Type Range Registers: ", CPUInfo._Ext.MTRR_MemoryTypeRangeRegisters);
- BOOLADD("PAE Physical Address Extension: ", CPUInfo._Ext.PAE_PhysicalAddressExtension);
- BOOLADD("PGE PTE Global Flag: ", CPUInfo._Ext.PGE_PTE_GlobalFlag);
- if (CPUInfo._Ext.PN_ProcessorSerialNumber)
- {
- FORMATADD("PN Processor Serial Number: %s\n", CPUInfo.strProcessorSerial);
- }
- else
- {
- COPYADD("PN Processor Serial Number: Disabled\n");
- }
- BOOLADD("PSE Page Size Extensions: ", CPUInfo._Ext.PSE_PageSizeExtensions);
- BOOLADD("PSE36 36-bit Page Size Extension: ", CPUInfo._Ext.PSE36_36bitPageSizeExtension);
- BOOLADD("SEP Fast System Call: ", CPUInfo._Ext.SEP_FastSystemCall);
- BOOLADD("SS Self Snoop: ", CPUInfo._Ext.SS_SelfSnoop);
- BOOLADD("SSE Streaming SIMD Extensions: ", CPUInfo._Ext.SSE_StreamingSIMD_Extensions);
- BOOLADD("SSE2 Streaming SIMD 2 Extensions: ", CPUInfo._Ext.SSE2_StreamingSIMD2_Extensions);
- BOOLADD("ALTVEC Altivec Extensions: ", CPUInfo._Ext.Altivec_Extensions);
- BOOLADD("TM Thermal Monitor: ", CPUInfo._Ext.TM_ThermalMonitor);
- BOOLADD("TSC Time Stamp Counter: ", CPUInfo._Ext.TSC_TimeStampCounter);
- BOOLADD("VME Virtual 8086 Mode Enhancements: ", CPUInfo._Ext.VME_Virtual8086ModeEnhancements);
- BOOLADD("3DNow! Instructions: ", CPUInfo._Ext._3DNOW_InstructionExtensions);
- BOOLADD("Enhanced 3DNow! Instructions: ", CPUInfo._Ext._E3DNOW_InstructionExtensions);
-#endif
- // Yippie!!!
- return true;
-}
+LLProcessorInfo::~LLProcessorInfo() {}
+F64 LLProcessorInfo::getCPUFrequency() const { return mImpl->getCPUFrequency(); }
+bool LLProcessorInfo::hasSSE() const { return mImpl->hasSSE(); }
+bool LLProcessorInfo::hasSSE2() const { return mImpl->hasSSE2(); }
+bool LLProcessorInfo::hasAltivec() const { return mImpl->hasAltivec(); }
+std::string LLProcessorInfo::getCPUFamilyName() const { return mImpl->getCPUFamilyName(); }
+std::string LLProcessorInfo::getCPUBrandName() const { return mImpl->getCPUBrandName(); }
+std::string LLProcessorInfo::getCPUFeatureDescription() const { return mImpl->getCPUFeatureDescription(); }
-// bool CProcessor::WriteInfoTextFile(const std::string& strFilename)
-// ===========================================================
-// Takes use of CProcessor::CPUInfoToText and saves the string to a
-// file
-///////////////////////////////////////////////////////////////////
-bool CProcessor::WriteInfoTextFile(const std::string& strFilename)
-{
- char buf[16384]; /* Flawfinder: ignore */
-
- // First we get the string
- if (!CPUInfoToText(buf, 16383))
- return false;
-
- // Then we create a new file (CREATE_ALWAYS)
- LLFILE *file = LLFile::fopen(strFilename, "w"); /* Flawfinder: ignore */
- if (!file)
- return false;
-
- // After that we write the string to the file
- unsigned long dwBytesToWrite, dwBytesWritten;
- dwBytesToWrite = (unsigned long) strlen(buf); /*Flawfinder: ignore*/
- dwBytesWritten = (unsigned long) fwrite(buf, 1, dwBytesToWrite, file);
- fclose(file);
- if (dwBytesToWrite != dwBytesWritten)
- return false;
-
- // Done
- return true;
-}
diff --git a/indra/llcommon/llprocessor.h b/indra/llcommon/llprocessor.h
index 746d007a7f..fc2c8dacfb 100644
--- a/indra/llcommon/llprocessor.h
+++ b/indra/llcommon/llprocessor.h
@@ -30,167 +30,26 @@
* $/LicenseInfo$
*/
-// Author: Benjamin Jurke
-// File history: 27.02.2002 File created.
-///////////////////////////////////////////
-
#ifndef LLPROCESSOR_H
#define LLPROCESSOR_H
+class LLProcessorInfoImpl;
-// Options:
-///////////
-#if LL_WINDOWS
-#define PROCESSOR_FREQUENCY_MEASURE_AVAILABLE
-#endif
-
-#if LL_MSVC && _M_X64
-# define LL_X86_64 1
-# define LL_X86 1
-#elif LL_MSVC && _M_IX86
-# define LL_X86 1
-#elif LL_GNUC && ( defined(__amd64__) || defined(__x86_64__) )
-# define LL_X86_64 1
-# define LL_X86 1
-#elif LL_GNUC && ( defined(__i386__) )
-# define LL_X86 1
-#elif LL_GNUC && ( defined(__powerpc__) || defined(__ppc__) )
-# define LL_PPC 1
-#endif
-
-
-struct ProcessorExtensions
-{
- bool FPU_FloatingPointUnit;
- bool VME_Virtual8086ModeEnhancements;
- bool DE_DebuggingExtensions;
- bool PSE_PageSizeExtensions;
- bool TSC_TimeStampCounter;
- bool MSR_ModelSpecificRegisters;
- bool PAE_PhysicalAddressExtension;
- bool MCE_MachineCheckException;
- bool CX8_COMPXCHG8B_Instruction;
- bool APIC_AdvancedProgrammableInterruptController;
- unsigned int APIC_ID;
- bool SEP_FastSystemCall;
- bool MTRR_MemoryTypeRangeRegisters;
- bool PGE_PTE_GlobalFlag;
- bool MCA_MachineCheckArchitecture;
- bool CMOV_ConditionalMoveAndCompareInstructions;
- bool FGPAT_PageAttributeTable;
- bool PSE36_36bitPageSizeExtension;
- bool PN_ProcessorSerialNumber;
- bool CLFSH_CFLUSH_Instruction;
- unsigned int CLFLUSH_InstructionCacheLineSize;
- bool DS_DebugStore;
- bool ACPI_ThermalMonitorAndClockControl;
- bool EMMX_MultimediaExtensions;
- bool MMX_MultimediaExtensions;
- bool FXSR_FastStreamingSIMD_ExtensionsSaveRestore;
- bool SSE_StreamingSIMD_Extensions;
- bool SSE2_StreamingSIMD2_Extensions;
- bool Altivec_Extensions;
- bool SS_SelfSnoop;
- bool HT_HyperThreading;
- unsigned int HT_HyterThreadingSiblings;
- bool TM_ThermalMonitor;
- bool IA64_Intel64BitArchitecture;
- bool _3DNOW_InstructionExtensions;
- bool _E3DNOW_InstructionExtensions;
- bool AA64_AMD64BitArchitecture;
-};
-
-struct ProcessorCache
-{
- bool bPresent;
- char strSize[32]; /* Flawfinder: ignore */
- unsigned int uiAssociativeWays;
- unsigned int uiLineSize;
- bool bSectored;
- char strCache[128]; /* Flawfinder: ignore */
-};
-
-struct ProcessorL1Cache
-{
- ProcessorCache Instruction;
- ProcessorCache Data;
-};
-
-struct ProcessorTLB
+class LL_COMMON_API LLProcessorInfo
{
- bool bPresent;
- char strPageSize[32]; /* Flawfinder: ignore */
- unsigned int uiAssociativeWays;
- unsigned int uiEntries;
- char strTLB[128]; /* Flawfinder: ignore */
-};
-
-struct ProcessorInfo
-{
- char strVendor[16]; /* Flawfinder: ignore */
- unsigned int uiFamily;
- unsigned int uiExtendedFamily;
- char strFamily[64]; /* Flawfinder: ignore */
- unsigned int uiModel;
- unsigned int uiExtendedModel;
- char strModel[128]; /* Flawfinder: ignore */
- unsigned int uiStepping;
- unsigned int uiType;
- char strType[64]; /* Flawfinder: ignore */
- unsigned int uiBrandID;
- char strBrandID[64]; /* Flawfinder: ignore */
- char strProcessorSerial[64]; /* Flawfinder: ignore */
- unsigned long MaxSupportedLevel;
- unsigned long MaxSupportedExtendedLevel;
- ProcessorExtensions _Ext;
- ProcessorL1Cache _L1;
- ProcessorCache _L2;
- ProcessorCache _L3;
- ProcessorCache _Trace;
- ProcessorTLB _Instruction;
- ProcessorTLB _Data;
-};
-
-
-// CProcessor
-// ==========
-// Class for detecting the processor name, type and available
-// extensions as long as it's speed.
-/////////////////////////////////////////////////////////////
-class CProcessor
-{
-// Constructor / Destructor:
-////////////////////////////
public:
- CProcessor();
-
-// Private vars:
-////////////////
-public:
- F64 uqwFrequency;
- char strCPUName[128]; /* Flawfinder: ignore */
- ProcessorInfo CPUInfo;
-
-// Private functions:
-/////////////////////
+ LLProcessorInfo();
+ ~LLProcessorInfo();
+
+ F64 getCPUFrequency() const;
+ bool hasSSE() const;
+ bool hasSSE2() const;
+ bool hasAltivec() const;
+ std::string getCPUFamilyName() const;
+ std::string getCPUBrandName() const;
+ std::string getCPUFeatureDescription() const;
private:
- bool AnalyzeIntelProcessor();
- bool AnalyzeAMDProcessor();
- bool AnalyzeUnknownProcessor();
- bool CheckCPUIDPresence();
- void DecodeProcessorConfiguration(unsigned int cfg);
- void TranslateProcessorConfiguration();
- void GetStandardProcessorConfiguration();
- void GetStandardProcessorExtensions();
-
-// Public functions:
-////////////////////
-public:
- F64 GetCPUFrequency(unsigned int uiMeasureMSecs);
- const ProcessorInfo *GetCPUInfo();
- bool CPUInfoToText(char *strBuffer, unsigned int uiMaxLen);
- bool WriteInfoTextFile(const std::string& strFilename);
+ LLProcessorInfoImpl* mImpl;
};
-
-#endif
+#endif // LLPROCESSOR_H
diff --git a/indra/llcommon/llqueuedthread.cpp b/indra/llcommon/llqueuedthread.cpp
index 06ceeb2bc3..809a626c93 100644
--- a/indra/llcommon/llqueuedthread.cpp
+++ b/indra/llcommon/llqueuedthread.cpp
@@ -133,8 +133,11 @@ S32 LLQueuedThread::updateQueue(U32 max_time_ms)
if (mThreaded)
{
pending = getPending();
+ if(pending > 0)
+ {
unpause();
}
+ }
else
{
while (pending > 0)
@@ -459,7 +462,7 @@ S32 LLQueuedThread::processNextRequest()
req->setStatus(STATUS_QUEUED);
mRequestQueue.insert(req);
unlockData();
- if (mThreaded && start_priority <= PRIORITY_LOW)
+ if (mThreaded && start_priority < PRIORITY_NORMAL)
{
ms_sleep(1); // sleep the thread a little
}
diff --git a/indra/llcommon/llsdserialize_xml.cpp b/indra/llcommon/llsdserialize_xml.cpp
index 7e1c2e35e0..fca173df47 100644
--- a/indra/llcommon/llsdserialize_xml.cpp
+++ b/indra/llcommon/llsdserialize_xml.cpp
@@ -139,12 +139,8 @@ S32 LLSDXMLFormatter::format_impl(const LLSD& data, std::ostream& ostr, U32 opti
case LLSD::TypeBoolean:
ostr << pre << "<boolean>";
if(mBoolAlpha ||
-#if( LL_WINDOWS || __GNUC__ > 2)
(ostr.flags() & std::ios::boolalpha)
-#else
- (ostr.flags() & 0x0100)
-#endif
- )
+ )
{
ostr << (data.asBoolean() ? "true" : "false");
}
@@ -511,12 +507,7 @@ void LLSDXMLParser::Impl::reset()
mSkipping = false;
-#if( LL_WINDOWS || __GNUC__ > 2)
mCurrentKey.clear();
-#else
- mCurrentKey = std::string();
-#endif
-
XML_ParserReset(mParser, "utf-8");
XML_SetUserData(mParser, this);
@@ -644,11 +635,7 @@ void LLSDXMLParser::Impl::startElementHandler(const XML_Char* name, const XML_Ch
LLSD& newElement = map[mCurrentKey];
mStack.push_back(&newElement);
-#if( LL_WINDOWS || __GNUC__ > 2)
mCurrentKey.clear();
-#else
- mCurrentKey = std::string();
-#endif
}
else if (mStack.back()->isArray())
{
diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp
index 5f3d9d6582..f14d947734 100644
--- a/indra/llcommon/llstring.cpp
+++ b/indra/llcommon/llstring.cpp
@@ -676,6 +676,17 @@ long LLStringOps::sLocalTimeOffset = 0;
bool LLStringOps::sPacificDaylightTime = 0;
std::map<std::string, std::string> LLStringOps::datetimeToCodes;
+std::vector<std::string> LLStringOps::sWeekDayList;
+std::vector<std::string> LLStringOps::sWeekDayShortList;
+std::vector<std::string> LLStringOps::sMonthList;
+std::vector<std::string> LLStringOps::sMonthShortList;
+
+
+std::string LLStringOps::sDayFormat;
+std::string LLStringOps::sAM;
+std::string LLStringOps::sPM;
+
+
S32 LLStringOps::collate(const llwchar* a, const llwchar* b)
{
#if LL_WINDOWS
@@ -724,6 +735,50 @@ void LLStringOps::setupDatetimeInfo (bool daylight)
datetimeToCodes["timezone"] = "%Z"; // PST
}
+void tokenizeStringToArray(const std::string& data, std::vector<std::string>& output)
+{
+ output.clear();
+ size_t length = data.size();
+
+ // tokenize it and put it in the array
+ std::string cur_word;
+ for(size_t i = 0; i < length; ++i)
+ {
+ if(data[i] == ':')
+ {
+ output.push_back(cur_word);
+ cur_word.clear();
+ }
+ else
+ {
+ cur_word.append(1, data[i]);
+ }
+ }
+ output.push_back(cur_word);
+}
+
+void LLStringOps::setupWeekDaysNames(const std::string& data)
+{
+ tokenizeStringToArray(data,sWeekDayList);
+}
+void LLStringOps::setupWeekDaysShortNames(const std::string& data)
+{
+ tokenizeStringToArray(data,sWeekDayShortList);
+}
+void LLStringOps::setupMonthNames(const std::string& data)
+{
+ tokenizeStringToArray(data,sMonthList);
+}
+void LLStringOps::setupMonthShortNames(const std::string& data)
+{
+ tokenizeStringToArray(data,sMonthShortList);
+}
+void LLStringOps::setupDayFormat(const std::string& data)
+{
+ sDayFormat = data;
+}
+
+
std::string LLStringOps::getDatetimeCode (std::string key)
{
std::map<std::string, std::string>::iterator iter;
@@ -819,6 +874,10 @@ namespace LLStringFn
////////////////////////////////////////////////////////////
+// Forward specialization of LLStringUtil::format before use in LLStringUtil::formatDatetime.
+template<>
+S32 LLStringUtil::format(std::string& s, const format_map_t& substitutions);
+
//static
template<>
void LLStringUtil::getTokens(const std::string& instr, std::vector<std::string >& tokens, const std::string& delims)
@@ -911,6 +970,20 @@ bool LLStringUtil::simpleReplacement(std::string &replacement, std::string token
return false;
}
+//static
+template<>
+void LLStringUtil::setLocale(std::string inLocale)
+{
+ sLocale = inLocale;
+};
+
+//static
+template<>
+std::string LLStringUtil::getLocale(void)
+{
+ return sLocale;
+};
+
// static
template<>
void LLStringUtil::formatNumber(std::string& numStr, std::string decimals)
@@ -984,7 +1057,53 @@ bool LLStringUtil::formatDatetime(std::string& replacement, std::string token,
}
return true;
}
- replacement = datetime.toHTTPDateString(code);
+
+ //EXT-7013
+ //few codes are not suppotred by strtime function (example - weekdays for Japanise)
+ //so use predefined ones
+
+ //if sWeekDayList is not empty than current locale doesn't support
+ //weekday name.
+ time_t loc_seconds = (time_t) secFromEpoch;
+ if(LLStringOps::sWeekDayList.size() == 7 && code == "%A")
+ {
+ struct tm * gmt = gmtime (&loc_seconds);
+ replacement = LLStringOps::sWeekDayList[gmt->tm_wday];
+ }
+ else if(LLStringOps::sWeekDayShortList.size() == 7 && code == "%a")
+ {
+ struct tm * gmt = gmtime (&loc_seconds);
+ replacement = LLStringOps::sWeekDayShortList[gmt->tm_wday];
+ }
+ else if(LLStringOps::sMonthList.size() == 12 && code == "%B")
+ {
+ struct tm * gmt = gmtime (&loc_seconds);
+ replacement = LLStringOps::sWeekDayList[gmt->tm_mon];
+ }
+ else if( !LLStringOps::sDayFormat.empty() && code == "%d" )
+ {
+ struct tm * gmt = gmtime (&loc_seconds);
+ LLStringUtil::format_map_t args;
+ args["[MDAY]"] = llformat ("%d", gmt->tm_mday);
+ replacement = LLStringOps::sDayFormat;
+ LLStringUtil::format(replacement, args);
+ }
+ else if( !LLStringOps::sAM.empty() && !LLStringOps::sPM.empty() && code == "%p" )
+ {
+ struct tm * gmt = gmtime (&loc_seconds);
+ if(gmt->tm_hour<12)
+ {
+ replacement = LLStringOps::sAM;
+ }
+ else
+ {
+ replacement = LLStringOps::sPM;
+ }
+ }
+ else
+ {
+ replacement = datetime.toHTTPDateString(code);
+ }
// *HACK: delete leading zero from hour string in case 'hour12' (code = %I) time format
// to show time without leading zero, e.g. 08:16 -> 8:16 (EXT-2738).
diff --git a/indra/llcommon/llstring.h b/indra/llcommon/llstring.h
index 62cedcde4e..8071c8aa2d 100644
--- a/indra/llcommon/llstring.h
+++ b/indra/llcommon/llstring.h
@@ -154,9 +154,19 @@ private:
static long sPacificTimeOffset;
static long sLocalTimeOffset;
static bool sPacificDaylightTime;
+
static std::map<std::string, std::string> datetimeToCodes;
public:
+ static std::vector<std::string> sWeekDayList;
+ static std::vector<std::string> sWeekDayShortList;
+ static std::vector<std::string> sMonthList;
+ static std::vector<std::string> sMonthShortList;
+ static std::string sDayFormat;
+
+ static std::string sAM;
+ static std::string sPM;
+
static char toUpper(char elem) { return toupper((unsigned char)elem); }
static llwchar toUpper(llwchar elem) { return towupper(elem); }
@@ -185,6 +195,14 @@ public:
static S32 collate(const llwchar* a, const llwchar* b);
static void setupDatetimeInfo(bool pacific_daylight_time);
+
+ static void setupWeekDaysNames(const std::string& data);
+ static void setupWeekDaysShortNames(const std::string& data);
+ static void setupMonthNames(const std::string& data);
+ static void setupMonthShortNames(const std::string& data);
+ static void setupDayFormat(const std::string& data);
+
+
static long getPacificTimeOffset(void) { return sPacificTimeOffset;}
static long getLocalTimeOffset(void) { return sLocalTimeOffset;}
// Is the Pacific time zone (aka server time zone)
@@ -231,7 +249,7 @@ public:
/////////////////////////////////////////////////////////////////////////////////////////
// Static Utility functions that operate on std::strings
- static std::basic_string<T> null;
+ static const std::basic_string<T> null;
typedef std::map<LLFormatMapString, LLFormatMapString> format_map_t;
LL_COMMON_API static void getTokens(const std::basic_string<T>& instr, std::vector<std::basic_string<T> >& tokens, const std::basic_string<T>& delims);
@@ -241,8 +259,8 @@ public:
LL_COMMON_API static S32 format(std::basic_string<T>& s, const LLSD& substitutions);
LL_COMMON_API static bool simpleReplacement(std::basic_string<T>& replacement, std::basic_string<T> token, const format_map_t& substitutions);
LL_COMMON_API static bool simpleReplacement(std::basic_string<T>& replacement, std::basic_string<T> token, const LLSD& substitutions);
- static void setLocale (std::string inLocale) {sLocale = inLocale;};
- static std::string getLocale (void) {return sLocale;};
+ LL_COMMON_API static void setLocale (std::string inLocale);
+ LL_COMMON_API static std::string getLocale (void);
static bool isValidIndex(const std::basic_string<T>& string, size_type i)
{
@@ -353,7 +371,7 @@ private:
LL_COMMON_API static size_type getSubstitution(const std::basic_string<T>& instr, size_type& start, std::vector<std::basic_string<T> >& tokens);
};
-template<class T> std::basic_string<T> LLStringUtilBase<T>::null;
+template<class T> const std::basic_string<T> LLStringUtilBase<T>::null;
template<class T> std::string LLStringUtilBase<T>::sLocale;
typedef LLStringUtilBase<char> LLStringUtil;
diff --git a/indra/llcommon/llsys.cpp b/indra/llcommon/llsys.cpp
index 0272c55db2..d41d0c8a3f 100644
--- a/indra/llcommon/llsys.cpp
+++ b/indra/llcommon/llsys.cpp
@@ -58,7 +58,6 @@
# include <unistd.h>
# include <sys/sysinfo.h>
const char MEMINFO_FILE[] = "/proc/meminfo";
-const char CPUINFO_FILE[] = "/proc/cpuinfo";
#elif LL_SOLARIS
# include <stdio.h>
# include <unistd.h>
@@ -513,71 +512,21 @@ U32 LLOSInfo::getProcessResidentSizeKB()
LLCPUInfo::LLCPUInfo()
{
std::ostringstream out;
- CProcessor proc;
- const ProcessorInfo* info = proc.GetCPUInfo();
+ LLProcessorInfo proc;
// proc.WriteInfoTextFile("procInfo.txt");
- mHasSSE = info->_Ext.SSE_StreamingSIMD_Extensions;
- mHasSSE2 = info->_Ext.SSE2_StreamingSIMD2_Extensions;
- mHasAltivec = info->_Ext.Altivec_Extensions;
- mCPUMhz = (S32)(proc.GetCPUFrequency(50)/1000000.0);
- mFamily.assign( info->strFamily );
+ mHasSSE = proc.hasSSE();
+ mHasSSE2 = proc.hasSSE2();
+ mHasAltivec = proc.hasAltivec();
+ mCPUMHz = (F64)proc.getCPUFrequency();
+ mFamily = proc.getCPUFamilyName();
mCPUString = "Unknown";
-#if LL_WINDOWS || LL_DARWIN || LL_SOLARIS
- out << proc.strCPUName;
- if (200 < mCPUMhz && mCPUMhz < 10000) // *NOTE: cpu speed is often way wrong, do a sanity check
+ out << proc.getCPUBrandName();
+ if (200 < mCPUMHz && mCPUMHz < 10000) // *NOTE: cpu speed is often way wrong, do a sanity check
{
- out << " (" << mCPUMhz << " MHz)";
+ out << " (" << mCPUMHz << " MHz)";
}
mCPUString = out.str();
-
-#elif LL_LINUX
- std::map< std::string, std::string > cpuinfo;
- LLFILE* cpuinfo_fp = LLFile::fopen(CPUINFO_FILE, "rb");
- if(cpuinfo_fp)
- {
- char line[MAX_STRING];
- memset(line, 0, MAX_STRING);
- while(fgets(line, MAX_STRING, cpuinfo_fp))
- {
- // /proc/cpuinfo on Linux looks like:
- // name\t*: value\n
- char* tabspot = strchr( line, '\t' );
- if (tabspot == NULL)
- continue;
- char* colspot = strchr( tabspot, ':' );
- if (colspot == NULL)
- continue;
- char* spacespot = strchr( colspot, ' ' );
- if (spacespot == NULL)
- continue;
- char* nlspot = strchr( line, '\n' );
- if (nlspot == NULL)
- nlspot = line + strlen( line ); // Fallback to terminating NUL
- std::string linename( line, tabspot );
- std::string llinename(linename);
- LLStringUtil::toLower(llinename);
- std::string lineval( spacespot + 1, nlspot );
- cpuinfo[ llinename ] = lineval;
- }
- fclose(cpuinfo_fp);
- }
-# if LL_X86
- std::string flags = " " + cpuinfo["flags"] + " ";
- LLStringUtil::toLower(flags);
- mHasSSE = ( flags.find( " sse " ) != std::string::npos );
- mHasSSE2 = ( flags.find( " sse2 " ) != std::string::npos );
-
- F64 mhz;
- if (LLStringUtil::convertToF64(cpuinfo["cpu mhz"], mhz)
- && 200.0 < mhz && mhz < 10000.0)
- {
- mCPUMhz = (S32)llrint(mhz);
- }
- if (!cpuinfo["model name"].empty())
- mCPUString = cpuinfo["model name"];
-# endif // LL_X86
-#endif // LL_LINUX
}
bool LLCPUInfo::hasAltivec() const
@@ -595,9 +544,9 @@ bool LLCPUInfo::hasSSE2() const
return mHasSSE2;
}
-S32 LLCPUInfo::getMhz() const
+F64 LLCPUInfo::getMHz() const
{
- return mCPUMhz;
+ return mCPUMHz;
}
std::string LLCPUInfo::getCPUString() const
@@ -607,44 +556,15 @@ std::string LLCPUInfo::getCPUString() const
void LLCPUInfo::stream(std::ostream& s) const
{
-#if LL_WINDOWS || LL_DARWIN || LL_SOLARIS
// gather machine information.
- char proc_buf[CPUINFO_BUFFER_SIZE]; /* Flawfinder: ignore */
- CProcessor proc;
- if(proc.CPUInfoToText(proc_buf, CPUINFO_BUFFER_SIZE))
- {
- s << proc_buf;
- }
- else
- {
- s << "Unable to collect processor information" << std::endl;
- }
-#else
- // *NOTE: This works on linux. What will it do on other systems?
- LLFILE* cpuinfo = LLFile::fopen(CPUINFO_FILE, "rb");
- if(cpuinfo)
- {
- char line[MAX_STRING];
- memset(line, 0, MAX_STRING);
- while(fgets(line, MAX_STRING, cpuinfo))
- {
- line[strlen(line)-1] = ' ';
- s << line;
- }
- fclose(cpuinfo);
- s << std::endl;
- }
- else
- {
- s << "Unable to collect processor information" << std::endl;
- }
-#endif
+ s << LLProcessorInfo().getCPUFeatureDescription();
+
// These are interesting as they reflect our internal view of the
// CPU's attributes regardless of platform
s << "->mHasSSE: " << (U32)mHasSSE << std::endl;
s << "->mHasSSE2: " << (U32)mHasSSE2 << std::endl;
s << "->mHasAltivec: " << (U32)mHasAltivec << std::endl;
- s << "->mCPUMhz: " << mCPUMhz << std::endl;
+ s << "->mCPUMHz: " << mCPUMHz << std::endl;
s << "->mCPUString: " << mCPUString << std::endl;
}
diff --git a/indra/llcommon/llsys.h b/indra/llcommon/llsys.h
index c2c45bec9a..0b34951149 100644
--- a/indra/llcommon/llsys.h
+++ b/indra/llcommon/llsys.h
@@ -81,7 +81,7 @@ public:
bool hasAltivec() const;
bool hasSSE() const;
bool hasSSE2() const;
- S32 getMhz() const;
+ F64 getMHz() const;
// Family is "AMD Duron" or "Intel Pentium Pro"
const std::string& getFamily() const { return mFamily; }
@@ -90,7 +90,7 @@ private:
bool mHasSSE;
bool mHasSSE2;
bool mHasAltivec;
- S32 mCPUMhz;
+ F64 mCPUMHz;
std::string mFamily;
std::string mCPUString;
};
diff --git a/indra/llcommon/llthread.h b/indra/llcommon/llthread.h
index adef1a9192..dbb8ec5231 100644
--- a/indra/llcommon/llthread.h
+++ b/indra/llcommon/llthread.h
@@ -135,7 +135,7 @@ class LL_COMMON_API LLMutex
{
public:
LLMutex(apr_pool_t *apr_poolp); // NULL pool constructs a new pool for the mutex
- ~LLMutex();
+ virtual ~LLMutex();
void lock(); // blocks
void unlock();
diff --git a/indra/llcommon/lltimer.cpp b/indra/llcommon/lltimer.cpp
index 21e165ebc9..6111db2bfa 100644
--- a/indra/llcommon/lltimer.cpp
+++ b/indra/llcommon/lltimer.cpp
@@ -209,7 +209,7 @@ F64 calc_clock_frequency(U32 uiMeasureMSecs)
// Both Linux and Mac use gettimeofday for accurate time
F64 calc_clock_frequency(unsigned int uiMeasureMSecs)
{
- return 1000000.0; // microseconds, so 1 Mhz.
+ return 1000000.0; // microseconds, so 1 MHz.
}
U64 get_clock_count()
@@ -555,60 +555,3 @@ void secondsToTimecodeString(F32 current_time, std::string& tcstring)
}
-//////////////////////////////////////////////////////////////////////////////
-//
-// LLEventTimer Implementation
-//
-//////////////////////////////////////////////////////////////////////////////
-
-LLEventTimer::LLEventTimer(F32 period)
-: mEventTimer()
-{
- mPeriod = period;
- mBusy = false;
-}
-
-LLEventTimer::LLEventTimer(const LLDate& time)
-: mEventTimer()
-{
- mPeriod = (F32)(time.secondsSinceEpoch() - LLDate::now().secondsSinceEpoch());
- mBusy = false;
-}
-
-
-LLEventTimer::~LLEventTimer()
-{
- llassert(!mBusy); // this LLEventTimer was destroyed from within its own tick() function - bad. if you want tick() to cause destruction of its own timer, make it return true.
-}
-
-//static
-void LLEventTimer::updateClass()
-{
- std::list<LLEventTimer*> completed_timers;
- for (instance_iter iter = beginInstances(); iter != endInstances(); )
- {
- LLEventTimer& timer = *iter++;
- F32 et = timer.mEventTimer.getElapsedTimeF32();
- if (timer.mEventTimer.getStarted() && et > timer.mPeriod) {
- timer.mEventTimer.reset();
- timer.mBusy = true;
- if ( timer.tick() )
- {
- completed_timers.push_back( &timer );
- }
- timer.mBusy = false;
- }
- }
-
- if ( completed_timers.size() > 0 )
- {
- for (std::list<LLEventTimer*>::iterator completed_iter = completed_timers.begin();
- completed_iter != completed_timers.end();
- completed_iter++ )
- {
- delete *completed_iter;
- }
- }
-}
-
-
diff --git a/indra/llcommon/lltimer.h b/indra/llcommon/lltimer.h
index 4d995d5bba..baba95bfa1 100644
--- a/indra/llcommon/lltimer.h
+++ b/indra/llcommon/lltimer.h
@@ -39,8 +39,6 @@
#include <limits.h>
#include "stdtypes.h"
-#include "lldate.h"
-#include "llinstancetracker.h"
#include <string>
#include <list>
@@ -171,26 +169,6 @@ LL_COMMON_API struct tm* utc_to_pacific_time(time_t utc_time, BOOL pacific_dayli
LL_COMMON_API void microsecondsToTimecodeString(U64 current_time, std::string& tcstring);
LL_COMMON_API void secondsToTimecodeString(F32 current_time, std::string& tcstring);
-// class for scheduling a function to be called at a given frequency (approximate, inprecise)
-class LL_COMMON_API LLEventTimer : protected LLInstanceTracker<LLEventTimer>
-{
-public:
- LLEventTimer(F32 period); // period is the amount of time between each call to tick() in seconds
- LLEventTimer(const LLDate& time);
- virtual ~LLEventTimer();
-
- //function to be called at the supplied frequency
- // Normally return FALSE; TRUE will delete the timer after the function returns.
- virtual BOOL tick() = 0;
-
- static void updateClass();
-
-protected:
- LLTimer mEventTimer;
- F32 mPeriod;
- bool mBusy;
-};
-
U64 LL_COMMON_API totalTime(); // Returns current system time in microseconds
#endif
diff --git a/indra/llcommon/lluri.cpp b/indra/llcommon/lluri.cpp
index 9d4f3a98f0..0e8f3f0f73 100644
--- a/indra/llcommon/lluri.cpp
+++ b/indra/llcommon/lluri.cpp
@@ -231,7 +231,8 @@ static BOOL isDefault(const std::string& scheme, U16 port)
void LLURI::parseAuthorityAndPathUsingOpaque()
{
if (mScheme == "http" || mScheme == "https" ||
- mScheme == "ftp" || mScheme == "secondlife" )
+ mScheme == "ftp" || mScheme == "secondlife" ||
+ mScheme == "x-grid-location-info")
{
if (mEscapedOpaque.substr(0,2) != "//")
{
diff --git a/indra/llcommon/lluuid.cpp b/indra/llcommon/lluuid.cpp
index bcbae06ec5..583c1e589b 100644
--- a/indra/llcommon/lluuid.cpp
+++ b/indra/llcommon/lluuid.cpp
@@ -33,9 +33,12 @@
// We can't use WIN32_LEAN_AND_MEAN here, needs lots of includes.
#if LL_WINDOWS
-# undef WIN32_LEAN_AND_MEAN
-# include <winsock2.h>
-# include <windows.h>
+#undef WIN32_LEAN_AND_MEAN
+#include <winsock2.h>
+#include <windows.h>
+// ugh, this is ugly. We need to straighten out our linking for this library
+#pragma comment(lib, "IPHLPAPI.lib")
+#include <iphlpapi.h>
#endif
#include "lldefs.h"
@@ -452,67 +455,102 @@ static void get_random_bytes(void *buf, int nbytes)
return;
}
-#if LL_WINDOWS
-typedef struct _ASTAT_
-{
- ADAPTER_STATUS adapt;
- NAME_BUFFER NameBuff [30];
-}ASTAT, * PASTAT;
+#if LL_WINDOWS
+// Code copied from http://msdn.microsoft.com/en-us/library/aa365939(VS.85).aspx
+// This code grabs the first hardware address, rather than the first interface.
+// Using a VPN can cause the first returned interface to be changed.
+
+const S32 MAC_ADDRESS_BYTES=6;
+
// static
-S32 LLUUID::getNodeID(unsigned char * node_id)
-{
- ASTAT Adapter;
- NCB Ncb;
- UCHAR uRetCode;
- LANA_ENUM lenum;
- int i;
- int retval = 0;
-
- memset( &Ncb, 0, sizeof(Ncb) );
- Ncb.ncb_command = NCBENUM;
- Ncb.ncb_buffer = (UCHAR *)&lenum;
- Ncb.ncb_length = sizeof(lenum);
- uRetCode = Netbios( &Ncb );
- // printf( "The NCBENUM return code is: 0x%x \n", uRetCode );
-
- for(i=0; i < lenum.length ;i++)
- {
- memset( &Ncb, 0, sizeof(Ncb) );
- Ncb.ncb_command = NCBRESET;
- Ncb.ncb_lana_num = lenum.lana[i];
-
- uRetCode = Netbios( &Ncb );
- // printf( "The NCBRESET on LANA %d return code is: 0x%x \n",
- // lenum.lana[i], uRetCode );
-
- memset( &Ncb, 0, sizeof (Ncb) );
- Ncb.ncb_command = NCBASTAT;
- Ncb.ncb_lana_num = lenum.lana[i];
-
- strcpy( (char *)Ncb.ncb_callname, "* " ); /* Flawfinder: ignore */
- Ncb.ncb_buffer = (unsigned char *)&Adapter;
- Ncb.ncb_length = sizeof(Adapter);
-
- uRetCode = Netbios( &Ncb );
-// printf( "The NCBASTAT on LANA %d return code is: 0x%x \n",
-// lenum.lana[i], uRetCode );
- if ( uRetCode == 0 )
- {
-// printf( "The Ethernet Number on LANA %d is: %02x%02x%02x%02x%02x%02x\n",
-// lenum.lana[i],
-// Adapter.adapt.adapter_address[0],
-// Adapter.adapt.adapter_address[1],
-// Adapter.adapt.adapter_address[2],
-// Adapter.adapt.adapter_address[3],
-// Adapter.adapt.adapter_address[4],
-// Adapter.adapt.adapter_address[5] );
- memcpy(node_id,Adapter.adapt.adapter_address,6); /* Flawfinder: ignore */
- retval = 1;
-
- }
- }
- return retval;
+S32 LLUUID::getNodeID(unsigned char *node_id)
+{
+
+ // Declare and initialize variables.
+ DWORD dwSize = 0;
+ DWORD dwRetVal = 0;
+ int i;
+
+/* variables used for GetIfTable and GetIfEntry */
+ MIB_IFTABLE *pIfTable;
+ MIB_IFROW *pIfRow;
+
+ // Allocate memory for our pointers.
+ pIfTable = (MIB_IFTABLE *) malloc(sizeof (MIB_IFTABLE));
+ if (pIfTable == NULL)
+ {
+ printf("Error allocating memory needed to call GetIfTable\n");
+ return 0;
+ }
+
+ // Before calling GetIfEntry, we call GetIfTable to make
+ // sure there are entries to get and retrieve the interface index.
+
+ // Make an initial call to GetIfTable to get the
+ // necessary size into dwSize
+ if (GetIfTable(pIfTable, &dwSize, 0) == ERROR_INSUFFICIENT_BUFFER) {
+ free(pIfTable);
+ pIfTable = (MIB_IFTABLE *) malloc(dwSize);
+ if (pIfTable == NULL)
+ {
+ printf("Error allocating memory\n");
+ return 0;
+ }
+ }
+ // Make a second call to GetIfTable to get the actual
+ // data we want.
+ if ((dwRetVal = GetIfTable(pIfTable, &dwSize, 0)) == NO_ERROR)
+ {
+ if (pIfTable->dwNumEntries > 0)
+ {
+ pIfRow = (MIB_IFROW *) malloc(sizeof (MIB_IFROW));
+ if (pIfRow == NULL)
+ {
+ printf("Error allocating memory\n");
+ if (pIfTable != NULL)
+ {
+ free(pIfTable);
+ pIfTable = NULL;
+ }
+ return 0;
+ }
+
+ int limit = MAC_ADDRESS_BYTES;
+ memcpy(node_id, "\0\0\0\0\0\0", limit); // zero out array of bytes
+ for (i = 0; i < (int) pIfTable->dwNumEntries; i++)
+ {
+ pIfRow->dwIndex = pIfTable->table[i].dwIndex;
+ if ((dwRetVal = GetIfEntry(pIfRow)) == NO_ERROR)
+ {
+ switch (pIfRow->dwType)
+ {
+ case IF_TYPE_ETHERNET_CSMACD:
+ case IF_TYPE_IEEE80211:
+ limit = min((int) pIfRow->dwPhysAddrLen, limit);
+ if (pIfRow->dwPhysAddrLen == 0)
+ break;
+ memcpy(node_id, (UCHAR *)&pIfRow->bPhysAddr[0], limit); // just incase the PhysAddr is not the expected MAC_Address size
+ free(pIfTable);
+ return 1; //return first hardware device found.
+ break;
+
+ case IF_TYPE_OTHER:
+ case IF_TYPE_PPP:
+ case IF_TYPE_SOFTWARE_LOOPBACK:
+ case IF_TYPE_ISO88025_TOKENRING:
+ case IF_TYPE_IEEE1394:
+ case IF_TYPE_ATM:
+ case IF_TYPE_TUNNEL:
+ default:
+ break;
+ }
+ }
+ }
+ }
+ }
+ free(pIfTable);
+ return 0;
}
#elif LL_DARWIN
diff --git a/indra/llcommon/lluuid.h b/indra/llcommon/lluuid.h
index c78fb12018..3a0d66e4a5 100644
--- a/indra/llcommon/lluuid.h
+++ b/indra/llcommon/lluuid.h
@@ -133,6 +133,7 @@ public:
U8 mData[UUID_BYTES];
};
+typedef std::vector<LLUUID> uuid_vec_t;
// Construct
inline LLUUID::LLUUID()
diff --git a/indra/llcommon/llversionserver.h b/indra/llcommon/llversionserver.h
index 0f1e59a18c..87fe7001e0 100644
--- a/indra/llcommon/llversionserver.h
+++ b/indra/llcommon/llversionserver.h
@@ -33,10 +33,10 @@
#ifndef LL_LLVERSIONSERVER_H
#define LL_LLVERSIONSERVER_H
-const S32 LL_VERSION_MAJOR = 1;
-const S32 LL_VERSION_MINOR = 31;
+const S32 LL_VERSION_MAJOR = 2;
+const S32 LL_VERSION_MINOR = 1;
const S32 LL_VERSION_PATCH = 0;
-const S32 LL_VERSION_BUILD = 200030;
+const S32 LL_VERSION_BUILD = 0;
const char * const LL_CHANNEL = "Second Life Server";
diff --git a/indra/llcommon/llversionviewer.h b/indra/llcommon/llversionviewer.h
index 540aea4252..6e341b83a1 100644
--- a/indra/llcommon/llversionviewer.h
+++ b/indra/llcommon/llversionviewer.h
@@ -34,9 +34,9 @@
#define LL_LLVERSIONVIEWER_H
const S32 LL_VERSION_MAJOR = 2;
-const S32 LL_VERSION_MINOR = 0;
+const S32 LL_VERSION_MINOR = 1;
const S32 LL_VERSION_PATCH = 0;
-const S32 LL_VERSION_BUILD = 200030;
+const S32 LL_VERSION_BUILD = 0;
const char * const LL_CHANNEL = "Second Life Developer";
diff --git a/indra/llcommon/llworkerthread.cpp b/indra/llcommon/llworkerthread.cpp
index 1b0e03cb2a..a29e9a348e 100644
--- a/indra/llcommon/llworkerthread.cpp
+++ b/indra/llcommon/llworkerthread.cpp
@@ -65,6 +65,27 @@ LLWorkerThread::~LLWorkerThread()
// ~LLQueuedThread() will be called here
}
+//called only in destructor.
+void LLWorkerThread::clearDeleteList()
+{
+ // Delete any workers in the delete queue (should be safe - had better be!)
+ if (!mDeleteList.empty())
+ {
+ llwarns << "Worker Thread: " << mName << " destroyed with " << mDeleteList.size()
+ << " entries in delete list." << llendl;
+
+ mDeleteMutex->lock();
+ for (delete_list_t::iterator iter = mDeleteList.begin(); iter != mDeleteList.end(); ++iter)
+ {
+ (*iter)->mRequestHandle = LLWorkerThread::nullHandle();
+ (*iter)->clearFlags(LLWorkerClass::WCF_HAVE_WORK);
+ delete *iter ;
+ }
+ mDeleteList.clear() ;
+ mDeleteMutex->unlock() ;
+ }
+}
+
// virtual
S32 LLWorkerThread::update(U32 max_time_ms)
{
@@ -320,7 +341,20 @@ bool LLWorkerClass::checkWork(bool aborting)
if (mRequestHandle != LLWorkerThread::nullHandle())
{
LLWorkerThread::WorkRequest* workreq = (LLWorkerThread::WorkRequest*)mWorkerThread->getRequest(mRequestHandle);
- llassert_always(workreq);
+ if(!workreq)
+ {
+ if(mWorkerThread->isQuitting() || mWorkerThread->isStopped()) //the mWorkerThread is not running
+ {
+ mRequestHandle = LLWorkerThread::nullHandle();
+ clearFlags(WCF_HAVE_WORK);
+ }
+ else
+ {
+ llassert_always(workreq);
+ }
+ return true ;
+ }
+
LLQueuedThread::status_t status = workreq->getStatus();
if (status == LLWorkerThread::STATUS_ABORTED)
{
@@ -370,7 +404,7 @@ void LLWorkerClass::scheduleDelete()
void LLWorkerClass::setPriority(U32 priority)
{
mMutex.lock();
- if (mRequestHandle != LLWorkerThread::nullHandle())
+ if (mRequestHandle != LLWorkerThread::nullHandle() && mRequestPriority != priority)
{
mRequestPriority = priority;
mWorkerThread->setPriority(mRequestHandle, priority);
diff --git a/indra/llcommon/llworkerthread.h b/indra/llcommon/llworkerthread.h
index a1e85d2ecc..1756ebab6b 100644
--- a/indra/llcommon/llworkerthread.h
+++ b/indra/llcommon/llworkerthread.h
@@ -80,6 +80,9 @@ public:
S32 mParam;
};
+protected:
+ void clearDeleteList() ;
+
private:
typedef std::list<LLWorkerClass*> delete_list_t;
delete_list_t mDeleteList;
diff --git a/indra/llcommon/tests/llerror_test.cpp b/indra/llcommon/tests/llerror_test.cpp
index 6785d0cf17..1558df231a 100644
--- a/indra/llcommon/tests/llerror_test.cpp
+++ b/indra/llcommon/tests/llerror_test.cpp
@@ -545,15 +545,6 @@ namespace tut
// output order
void ErrorTestObject::test<10>()
{
-#if LL_LINUX
- skip("Fails on Linux, see comments");
-// on Linux:
-// [error, 10] fail: 'order is time type location function message: expected
-// '1947-07-08T03:04:05Z INFO: llcommon/tests/llerror_test.cpp(268) :
-// writeReturningLocationAndFunction: apple' actual
-// '1947-07-08T03:04:05Z INFO: llcommon/tests/llerror_test.cpp(268) :
-// LLError::NoClassInfo::writeReturningLocationAndFunction: apple''
-#endif
LLError::setPrintLocation(true);
LLError::setTimeFunction(roswell);
mRecorder.setWantsTime(true);
diff --git a/indra/llcommon/tests/llinstancetracker_test.cpp b/indra/llcommon/tests/llinstancetracker_test.cpp
index 7415f2d33b..4bb3ec2922 100644
--- a/indra/llcommon/tests/llinstancetracker_test.cpp
+++ b/indra/llcommon/tests/llinstancetracker_test.cpp
@@ -138,23 +138,29 @@ namespace tut
keys.insert(&one);
keys.insert(&two);
keys.insert(&three);
- for (Unkeyed::key_iter ki(Unkeyed::beginKeys()), kend(Unkeyed::endKeys());
- ki != kend; ++ki)
- {
- ensure_equals("spurious key", keys.erase(*ki), 1);
- }
+ {
+ Unkeyed::LLInstanceTrackerScopedGuard guard;
+ for (Unkeyed::key_iter ki(guard.beginKeys()), kend(guard.endKeys());
+ ki != kend; ++ki)
+ {
+ ensure_equals("spurious key", keys.erase(*ki), 1);
+ }
+ }
ensure_equals("unreported key", keys.size(), 0);
KeySet instances;
instances.insert(&one);
instances.insert(&two);
instances.insert(&three);
- for (Unkeyed::instance_iter ii(Unkeyed::beginInstances()), iend(Unkeyed::endInstances());
- ii != iend; ++ii)
- {
- Unkeyed& ref = *ii;
- ensure_equals("spurious instance", instances.erase(&ref), 1);
- }
+ {
+ Unkeyed::LLInstanceTrackerScopedGuard guard;
+ for (Unkeyed::instance_iter ii(guard.beginInstances()), iend(guard.endInstances());
+ ii != iend; ++ii)
+ {
+ Unkeyed& ref = *ii;
+ ensure_equals("spurious instance", instances.erase(&ref), 1);
+ }
+ }
ensure_equals("unreported instance", instances.size(), 0);
}
} // namespace tut
diff --git a/indra/llcommon/tests/llprocessor_test.cpp b/indra/llcommon/tests/llprocessor_test.cpp
new file mode 100644
index 0000000000..a9e312b70b
--- /dev/null
+++ b/indra/llcommon/tests/llprocessor_test.cpp
@@ -0,0 +1,67 @@
+/**
+ * @file llprocessor_test.cpp
+ * @date 2010-06-01
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+#include "../test/lltut.h"
+
+#include "../llprocessor.h"
+
+
+namespace tut
+{
+ struct processor
+ {
+ };
+
+ typedef test_group<processor> processor_t;
+ typedef processor_t::object processor_object_t;
+ tut::processor_t tut_processor("processor");
+
+ template<> template<>
+ void processor_object_t::test<1>()
+ {
+ set_test_name("LLProcessorInfo regression test");
+
+ LLProcessorInfo pi;
+ F64 freq = pi.getCPUFrequency();
+ //bool sse = pi.hasSSE();
+ //bool sse2 = pi.hasSSE2();
+ //bool alitvec = pi.hasAltivec();
+ std::string family = pi.getCPUFamilyName();
+ std::string brand = pi.getCPUBrandName();
+ //std::string steam = pi.getCPUFeatureDescription();
+
+ ensure_not_equals("Unknown Brand name", brand, "Unknown");
+ ensure_not_equals("Unknown Family name", family, "Unknown");
+ ensure("Reasonable CPU Frequency > 100 && < 10000", freq > 100 && freq < 10000);
+ }
+}
diff --git a/indra/llcrashlogger/llcrashlogger.cpp b/indra/llcrashlogger/llcrashlogger.cpp
index c1022c1195..51e5f14bfe 100755
--- a/indra/llcrashlogger/llcrashlogger.cpp
+++ b/indra/llcrashlogger/llcrashlogger.cpp
@@ -155,25 +155,6 @@ std::string getStartupStateFromLog(std::string& sllog)
void LLCrashLogger::gatherFiles()
{
-
- /*
- //TODO:This function needs to be reimplemented somewhere in here...
- if(!previous_crash && is_crash_log)
- {
- // Make sure the file isn't too old.
- double age = difftime(gLaunchTime, stat_data.st_mtimespec.tv_sec);
-
- // llinfos << "age is " << age << llendl;
-
- if(age > 60.0)
- {
- // The file was last modified more than 60 seconds before the crash reporter was launched. Assume it's stale.
- llwarns << "File " << mFilename << " is too old!" << llendl;
- return;
- }
- }
- */
-
updateApplication("Gathering logs...");
// Figure out the filename of the debug log
@@ -209,11 +190,9 @@ void LLCrashLogger::gatherFiles()
mFileMap["SettingsXml"] = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,"settings.xml");
}
-#if !LL_DARWIN
if(mCrashInPreviousExec)
-#else
-#endif
{
+ // Restarting after freeze.
// Replace the log file ext with .old, since the
// instance that launched this process has overwritten
// SecondLife.log
@@ -225,7 +204,12 @@ void LLCrashLogger::gatherFiles()
gatherPlatformSpecificFiles();
//Use the debug log to reconstruct the URL to send the crash report to
- if(mDebugLog.has("CurrentSimHost"))
+ if(mDebugLog.has("CrashHostUrl"))
+ {
+ // Crash log receiver has been manually configured.
+ mCrashHost = mDebugLog["CrashHostUrl"].asString();
+ }
+ else if(mDebugLog.has("CurrentSimHost"))
{
mCrashHost = "https://";
mCrashHost += mDebugLog["CurrentSimHost"].asString();
@@ -247,7 +231,6 @@ void LLCrashLogger::gatherFiles()
mCrashInfo["DebugLog"] = mDebugLog;
mFileMap["StatsLog"] = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stats.log");
- mFileMap["StackTrace"] = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log");
updateApplication("Encoding files...");
@@ -272,8 +255,30 @@ void LLCrashLogger::gatherFiles()
trimSLLog(crash_info);
}
- mCrashInfo[(*itr).first] = rawstr_to_utf8(crash_info);
+ mCrashInfo[(*itr).first] = LLStringFn::strip_invalid_xml(rawstr_to_utf8(crash_info));
+ }
+
+ // Add minidump as binary.
+ std::string minidump_path = mDebugLog["MinidumpPath"];
+ if(minidump_path != "")
+ {
+ std::ifstream minidump_stream(minidump_path.c_str(), std::ios_base::in | std::ios_base::binary);
+ if(minidump_stream.is_open())
+ {
+ minidump_stream.seekg(0, std::ios::end);
+ size_t length = minidump_stream.tellg();
+ minidump_stream.seekg(0, std::ios::beg);
+
+ LLSD::Binary data;
+ data.resize(length);
+
+ minidump_stream.read(reinterpret_cast<char *>(&(data[0])),length);
+ minidump_stream.close();
+
+ mCrashInfo["Minidump"] = data;
+ }
}
+ mCrashInfo["DebugLog"].erase("MinidumpPath");
}
LLSD LLCrashLogger::constructPostData()
diff --git a/indra/llimage/CMakeLists.txt b/indra/llimage/CMakeLists.txt
index 22be4078a1..a69621a57b 100644
--- a/indra/llimage/CMakeLists.txt
+++ b/indra/llimage/CMakeLists.txt
@@ -21,6 +21,7 @@ include_directories(
set(llimage_SOURCE_FILES
llimagebmp.cpp
llimage.cpp
+ llimagedimensionsinfo.cpp
llimagedxt.cpp
llimagej2c.cpp
llimagejpeg.cpp
@@ -35,6 +36,7 @@ set(llimage_HEADER_FILES
llimage.h
llimagebmp.h
+ llimagedimensionsinfo.h
llimagedxt.h
llimagej2c.h
llimagejpeg.h
diff --git a/indra/llimage/llimage.cpp b/indra/llimage/llimage.cpp
index e02be6c8c1..0fc5ca1ad6 100644
--- a/indra/llimage/llimage.cpp
+++ b/indra/llimage/llimage.cpp
@@ -93,9 +93,10 @@ LLImageBase::LLImageBase()
mWidth(0),
mHeight(0),
mComponents(0),
+ mBadBufferAllocation(false),
+ mAllowOverSize(false),
mMemType(LLMemType::MTYPE_IMAGEBASE)
{
- mBadBufferAllocation = FALSE ;
}
// virtual
@@ -134,8 +135,6 @@ void LLImageBase::sanityCheck()
}
}
-BOOL LLImageBase::sSizeOverride = FALSE;
-
// virtual
void LLImageBase::deleteData()
{
@@ -157,22 +156,32 @@ U8* LLImageBase::allocateData(S32 size)
llerrs << llformat("LLImageBase::allocateData called with bad dimensions: %dx%dx%d",mWidth,mHeight,mComponents) << llendl;
}
}
- else if (size <= 0 || (size > 4096*4096*16 && sSizeOverride == FALSE))
+
+ //make this function thread-safe.
+ static const U32 MAX_BUFFER_SIZE = 4096 * 4096 * 16 ; //256 MB
+ if (size < 1 || size > MAX_BUFFER_SIZE)
{
- llerrs << "LLImageBase::allocateData: bad size: " << size << llendl;
+ llinfos << "width: " << mWidth << " height: " << mHeight << " components: " << mComponents << llendl ;
+ if(mAllowOverSize)
+ {
+ llinfos << "Oversize: " << size << llendl ;
+ }
+ else
+ {
+ llerrs << "LLImageBase::allocateData: bad size: " << size << llendl;
+ }
}
-
if (!mData || size != mDataSize)
{
deleteData(); // virtual
- mBadBufferAllocation = FALSE ;
+ mBadBufferAllocation = false ;
mData = new U8[size];
if (!mData)
{
llwarns << "allocate image data: " << size << llendl;
size = 0 ;
mWidth = mHeight = 0 ;
- mBadBufferAllocation = TRUE ;
+ mBadBufferAllocation = true ;
}
mDataSize = size;
}
@@ -221,7 +230,7 @@ U8* LLImageBase::getData()
return mData;
}
-BOOL LLImageBase::isBufferInvalid()
+bool LLImageBase::isBufferInvalid()
{
return mBadBufferAllocation || mData == NULL ;
}
@@ -257,7 +266,7 @@ LLImageRaw::LLImageRaw(U16 width, U16 height, S8 components)
: LLImageBase()
{
mMemType = LLMemType::MTYPE_IMAGERAW;
- llassert( S32(width) * S32(height) * S32(components) <= MAX_IMAGE_DATA_SIZE );
+ //llassert( S32(width) * S32(height) * S32(components) <= MAX_IMAGE_DATA_SIZE );
allocateDataSize(width, height, components);
++sRawImageCount;
}
@@ -676,9 +685,6 @@ void LLImageRaw::copy(LLImageRaw* src)
LLImageRaw* dst = this; // Just for clarity.
- llassert( (3 == src->getComponents()) || (4 == src->getComponents()) );
- llassert( (3 == dst->getComponents()) || (4 == dst->getComponents()) );
-
if( (src->getWidth() == dst->getWidth()) && (src->getHeight() == dst->getHeight()) )
{
// No scaling needed
@@ -1328,7 +1334,7 @@ LLImageFormatted::LLImageFormatted(S8 codec)
mCodec(codec),
mDecoding(0),
mDecoded(0),
- mDiscardLevel(0)
+ mDiscardLevel(-1)
{
mMemType = LLMemType::MTYPE_IMAGEFORMATTED;
}
diff --git a/indra/llimage/llimage.h b/indra/llimage/llimage.h
index 686f583886..10444e7f89 100644
--- a/indra/llimage/llimage.h
+++ b/indra/llimage/llimage.h
@@ -48,7 +48,7 @@ const S32 MAX_IMAGE_SIZE = (1<<MAX_IMAGE_MIP); // 2048
const S32 MIN_IMAGE_AREA = MIN_IMAGE_SIZE * MIN_IMAGE_SIZE;
const S32 MAX_IMAGE_AREA = MAX_IMAGE_SIZE * MAX_IMAGE_SIZE;
const S32 MAX_IMAGE_COMPONENTS = 8;
-const S32 MAX_IMAGE_DATA_SIZE = MAX_IMAGE_AREA * MAX_IMAGE_COMPONENTS;
+const S32 MAX_IMAGE_DATA_SIZE = MAX_IMAGE_AREA * MAX_IMAGE_COMPONENTS; //2048 * 2048 * 8 = 16 MB
// Note! These CANNOT be changed without modifying simulator code
// *TODO: change both to 1024 when SIM texture fetching is deprecated
@@ -124,10 +124,12 @@ public:
const U8 *getData() const ;
U8 *getData() ;
- BOOL isBufferInvalid() ;
+ bool isBufferInvalid() ;
void setSize(S32 width, S32 height, S32 ncomponents);
U8* allocateDataSize(S32 width, S32 height, S32 ncomponents, S32 size = -1); // setSize() + allocateData()
+ void enableOverSize() {mAllowOverSize = true ;}
+ void disableOverSize() {mAllowOverSize = false; }
protected:
// special accessor to allow direct setting of mData and mDataSize by LLImageFormatted
@@ -140,8 +142,6 @@ public:
// <= 0 priority means that there's no need for more data.
static F32 calc_download_priority(F32 virtual_size, F32 visible_area, S32 bytes_sent);
- static void setSizeOverride(BOOL enabled) { sSizeOverride = enabled; }
-
static EImageCodec getCodecFromExtension(const std::string& exten);
private:
@@ -153,12 +153,10 @@ private:
S8 mComponents;
- BOOL mBadBufferAllocation ;
-
+ bool mBadBufferAllocation ;
+ bool mAllowOverSize ;
public:
LLMemType::DeclareMemType& mMemType; // debug
-
- static BOOL sSizeOverride;
};
// Raw representation of an image (used for textures, and other uncompressed formats
diff --git a/indra/llimage/llimagedimensionsinfo.cpp b/indra/llimage/llimagedimensionsinfo.cpp
new file mode 100644
index 0000000000..890b49b50a
--- /dev/null
+++ b/indra/llimage/llimagedimensionsinfo.cpp
@@ -0,0 +1,139 @@
+/**
+ * @file llimagedimensionsinfo.cpp
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+#include "stdtypes.h"
+
+#include "llimagejpeg.h"
+
+#include "llimagedimensionsinfo.h"
+
+bool LLImageDimensionsInfo::load(const std::string& src_filename,U32 codec)
+{
+ clean();
+
+ mSrcFilename = src_filename;
+
+ S32 file_size = 0;
+ apr_status_t s = mInfile.open(src_filename, LL_APR_RB, NULL, &file_size);
+
+ if (s != APR_SUCCESS)
+ {
+ setLastError("Unable to open file for reading", src_filename);
+ return false;
+ }
+
+ if (file_size == 0)
+ {
+ setLastError("File is empty",src_filename);
+ return false;
+ }
+
+ switch (codec)
+ {
+ case IMG_CODEC_BMP:
+ return getImageDimensionsBmp();
+ case IMG_CODEC_TGA:
+ return getImageDimensionsTga();
+ case IMG_CODEC_JPEG:
+ return getImageDimensionsJpeg();
+ case IMG_CODEC_PNG:
+ return getImageDimensionsPng();
+ default:
+ return false;
+
+ }
+}
+
+
+bool LLImageDimensionsInfo::getImageDimensionsBmp()
+{
+ const S32 BMP_FILE_HEADER_SIZE = 14;
+
+ mInfile.seek(APR_CUR,BMP_FILE_HEADER_SIZE+4);
+ mWidth = read_reverse_s32();
+ mHeight = read_reverse_s32();
+
+ return true;
+}
+
+bool LLImageDimensionsInfo::getImageDimensionsTga()
+{
+ const S32 TGA_FILE_HEADER_SIZE = 12;
+
+ mInfile.seek(APR_CUR,TGA_FILE_HEADER_SIZE);
+ mWidth = read_byte() | read_byte() << 8;
+ mHeight = read_byte() | read_byte() << 8;
+
+ return true;
+}
+
+bool LLImageDimensionsInfo::getImageDimensionsPng()
+{
+ const S32 PNG_FILE_MARKER_SIZE = 8;
+
+ mInfile.seek(APR_CUR,PNG_FILE_MARKER_SIZE + 8/*header offset+chunk length+chunk type*/);
+ mWidth = read_s32();
+ mHeight = read_s32();
+
+ return true;
+}
+
+
+bool LLImageDimensionsInfo::getImageDimensionsJpeg()
+{
+ clean();
+ FILE *fp = fopen (mSrcFilename.c_str(), "rb");
+ if (fp == NULL)
+ {
+ setLastError("Unable to open file for reading", mSrcFilename);
+ return false;
+ }
+ /* Init jpeg */
+ jpeg_error_mgr jerr;
+ jpeg_decompress_struct cinfo;
+ cinfo.err = jpeg_std_error(&jerr);
+
+ jpeg_create_decompress (&cinfo);
+ jpeg_stdio_src (&cinfo, fp);
+ jpeg_read_header (&cinfo, TRUE);
+ cinfo.out_color_space = JCS_RGB;
+ jpeg_start_decompress (&cinfo);
+
+ mHeight = cinfo.output_width;
+ mHeight = cinfo.output_height;
+
+ jpeg_destroy_decompress(&cinfo);
+ fclose(fp);
+
+ return true;
+}
+
diff --git a/indra/llimage/llimagedimensionsinfo.h b/indra/llimage/llimagedimensionsinfo.h
new file mode 100644
index 0000000000..2c8f675fa1
--- /dev/null
+++ b/indra/llimage/llimagedimensionsinfo.h
@@ -0,0 +1,139 @@
+/**
+ * @file llimagedimentionsinfo.h
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+
+#ifndef LL_LLIMAGEDIMENSIONSINFO_H
+#define LL_LLIMAGEDIMENSIONSINFO_H
+
+//-----------------------------------------------------------------------------
+// LLImageDimensionsInfo
+// helper class to get image dimensions WITHOUT loading image to memore
+// usefull when image may be too large...
+//-----------------------------------------------------------------------------
+class LLImageDimensionsInfo
+{
+public:
+ LLImageDimensionsInfo():
+ mData(NULL)
+ ,mHeight(0)
+ ,mWidth(0)
+ {}
+ ~LLImageDimensionsInfo()
+ {
+ clean();
+ }
+
+ bool load(const std::string& src_filename,U32 codec);
+ S32 getWidth() const { return mWidth;}
+ S32 getHeight() const { return mHeight;}
+
+ const std::string& getLastError()
+ {
+ return mLastError;
+ }
+protected:
+
+ void clean()
+ {
+ mInfile.close();
+ delete[] mData;
+ mData = NULL;
+ mWidth = 0;
+ mHeight = 0;
+ }
+
+ U8* getData()
+ {
+ return mData;
+ }
+
+
+ void setLastError(const std::string& message, const std::string& filename)
+ {
+ std::string error = message;
+ if (!filename.empty())
+ error += std::string(" FILE: ") + filename;
+ mLastError = error;
+ }
+
+
+ bool getImageDimensionsBmp();
+ bool getImageDimensionsTga();
+ bool getImageDimensionsPng();
+ bool getImageDimensionsJpeg();
+
+ S32 read_s32()
+ {
+ char p[4];
+ mInfile.read(&p[0],4);
+ S32 temp = (((S32)p[3]) & 0x000000FF) |
+ (((S32)p[2] << 8 ) & 0x0000FF00) |
+ (((S32)p[1] << 16) & 0x00FF0000) |
+ (((S32)p[0] << 24) & 0xFF000000);
+
+ return temp;
+ }
+ S32 read_reverse_s32()
+ {
+ char p[4];
+ mInfile.read(&p[0],4);
+ S32 temp = (((S32)p[0]) & 0x000000FF) |
+ (((S32)p[1] << 8 ) & 0x0000FF00) |
+ (((S32)p[2] << 16) & 0x00FF0000) |
+ (((S32)p[3] << 24) & 0xFF000000);
+
+ return temp;
+ }
+
+ U8 read_byte()
+ {
+ U8 bt;
+ mInfile.read(&bt,1);
+ return bt;
+ }
+
+ U16 read_short()
+ {
+ return read_byte() << 8 | read_byte();
+ }
+
+protected:
+ LLAPRFile mInfile ;
+ std::string mSrcFilename;
+
+ std::string mLastError;
+
+ U8* mData;
+
+ S32 mWidth;
+ S32 mHeight;
+};
+#endif
diff --git a/indra/llimage/llimagepng.cpp b/indra/llimage/llimagepng.cpp
index b5de104e61..018ce993b5 100644
--- a/indra/llimage/llimagepng.cpp
+++ b/indra/llimage/llimagepng.cpp
@@ -42,17 +42,12 @@
// LLImagePNG
// ---------------------------------------------------------------------------
LLImagePNG::LLImagePNG()
- : LLImageFormatted(IMG_CODEC_PNG),
- mTmpWriteBuffer(NULL)
+ : LLImageFormatted(IMG_CODEC_PNG)
{
}
LLImagePNG::~LLImagePNG()
{
- if (mTmpWriteBuffer)
- {
- delete[] mTmpWriteBuffer;
- }
}
// Virtual
@@ -123,27 +118,24 @@ BOOL LLImagePNG::encode(const LLImageRaw* raw_image, F32 encode_time)
// Temporary buffer to hold the encoded image. Note: the final image
// size should be much smaller due to compression.
- if (mTmpWriteBuffer)
- {
- delete[] mTmpWriteBuffer;
- }
U32 bufferSize = getWidth() * getHeight() * getComponents() + 1024;
- U8* mTmpWriteBuffer = new U8[ bufferSize ];
+ U8* tmpWriteBuffer = new U8[ bufferSize ];
// Delegate actual encoding work to wrapper
LLPngWrapper pngWrapper;
- if (! pngWrapper.writePng(raw_image, mTmpWriteBuffer))
+ if (! pngWrapper.writePng(raw_image, tmpWriteBuffer))
{
setLastError(pngWrapper.getErrorMessage());
+ delete[] tmpWriteBuffer;
return FALSE;
}
// Resize internal buffer and copy from temp
U32 encodedSize = pngWrapper.getFinalSize();
allocateData(encodedSize);
- memcpy(getData(), mTmpWriteBuffer, encodedSize);
+ memcpy(getData(), tmpWriteBuffer, encodedSize);
- delete[] mTmpWriteBuffer;
+ delete[] tmpWriteBuffer;
return TRUE;
}
diff --git a/indra/llimage/llimagepng.h b/indra/llimage/llimagepng.h
index 083dda73b9..4d6e2ee70a 100644
--- a/indra/llimage/llimagepng.h
+++ b/indra/llimage/llimagepng.h
@@ -47,9 +47,6 @@ public:
/*virtual*/ BOOL updateData();
/*virtual*/ BOOL decode(LLImageRaw* raw_image, F32 decode_time);
/*virtual*/ BOOL encode(const LLImageRaw* raw_image, F32 encode_time);
-
-private:
- U8* mTmpWriteBuffer;
};
#endif
diff --git a/indra/llimage/llimageworker.cpp b/indra/llimage/llimageworker.cpp
index 86d41515e7..20a72d0a28 100644
--- a/indra/llimage/llimageworker.cpp
+++ b/indra/llimage/llimageworker.cpp
@@ -54,9 +54,14 @@ S32 LLImageDecodeThread::update(U32 max_time_ms)
{
creation_info& info = *iter;
ImageRequest* req = new ImageRequest(info.handle, info.image,
- info.priority, info.discard, info.needs_aux,
- info.responder);
- addRequest(req);
+ info.priority, info.discard, info.needs_aux,
+ info.responder);
+
+ bool res = addRequest(req);
+ if (!res)
+ {
+ llerrs << "request added after LLLFSThread::cleanupClass()" << llendl;
+ }
}
mCreationList.clear();
S32 res = LLQueuedThread::update(max_time_ms);
diff --git a/indra/llinventory/CMakeLists.txt b/indra/llinventory/CMakeLists.txt
index b358f0a013..a563db901a 100644
--- a/indra/llinventory/CMakeLists.txt
+++ b/indra/llinventory/CMakeLists.txt
@@ -20,6 +20,7 @@ set(llinventory_SOURCE_FILES
llcategory.cpp
lleconomy.cpp
llinventory.cpp
+ llinventorydefines.cpp
llinventorytype.cpp
lllandmark.cpp
llnotecard.cpp
@@ -36,6 +37,7 @@ set(llinventory_HEADER_FILES
llcategory.h
lleconomy.h
llinventory.h
+ llinventorydefines.h
llinventorytype.h
lllandmark.h
llnotecard.h
diff --git a/indra/llinventory/llinventory.cpp b/indra/llinventory/llinventory.cpp
index d665deb605..53830b1a14 100644
--- a/indra/llinventory/llinventory.cpp
+++ b/indra/llinventory/llinventory.cpp
@@ -31,10 +31,10 @@
*/
#include "linden_common.h"
-
#include "llinventory.h"
#include "lldbstrings.h"
+#include "llinventorydefines.h"
#include "llxorcipher.h"
#include "llsd.h"
#include "message.h"
@@ -43,9 +43,8 @@
#include "llsdutil.h"
///----------------------------------------------------------------------------
-/// exported functions
+/// Exported functions
///----------------------------------------------------------------------------
-
static const std::string INV_ITEM_ID_LABEL("item_id");
static const std::string INV_FOLDER_ID_LABEL("folder_id");
static const std::string INV_PARENT_ID_LABEL("parent_id");
@@ -64,34 +63,29 @@ static const std::string INV_CREATION_DATE_LABEL("created_at");
// key used by agent-inventory-service
static const std::string INV_ASSET_TYPE_LABEL_WS("type_default");
static const std::string INV_FOLDER_ID_LABEL_WS("category_id");
+
///----------------------------------------------------------------------------
/// Local function declarations, constants, enums, and typedefs
///----------------------------------------------------------------------------
-
const U8 TASK_INVENTORY_ITEM_KEY = 0;
const U8 TASK_INVENTORY_ASSET_KEY = 1;
const LLUUID MAGIC_ID("3c115e51-04f4-523c-9fa6-98aff1034730");
-
///----------------------------------------------------------------------------
/// Class LLInventoryObject
///----------------------------------------------------------------------------
-LLInventoryObject::LLInventoryObject(
- const LLUUID& uuid,
- const LLUUID& parent_uuid,
- LLAssetType::EType type,
- const std::string& name) :
+LLInventoryObject::LLInventoryObject(const LLUUID& uuid,
+ const LLUUID& parent_uuid,
+ LLAssetType::EType type,
+ const std::string& name) :
mUUID(uuid),
mParentUUID(parent_uuid),
mType(type),
mName(name)
{
- LLStringUtil::replaceNonstandardASCII(mName, ' ');
- LLStringUtil::replaceChar(mName, '|', ' ');
- LLStringUtil::trim(mName);
- LLStringUtil::truncate(mName, DB_INV_ITEM_NAME_STR_LEN);
+ correctInventoryName(mName);
}
LLInventoryObject::LLInventoryObject() :
@@ -99,7 +93,7 @@ LLInventoryObject::LLInventoryObject() :
{
}
-LLInventoryObject::~LLInventoryObject( void )
+LLInventoryObject::~LLInventoryObject()
{
}
@@ -158,12 +152,8 @@ void LLInventoryObject::setUUID(const LLUUID& new_uuid)
void LLInventoryObject::rename(const std::string& n)
{
std::string new_name(n);
- LLStringUtil::replaceNonstandardASCII(new_name, ' ');
- LLStringUtil::replaceChar(new_name, '|', ' ');
- LLStringUtil::trim(new_name);
- LLStringUtil::truncate(new_name, DB_INV_ITEM_NAME_STR_LEN);
-
- if( new_name != mName )
+ correctInventoryName(new_name);
+ if( !new_name.empty() && new_name != mName )
{
mName = new_name;
}
@@ -224,10 +214,7 @@ BOOL LLInventoryObject::importLegacyStream(std::istream& input_stream)
" %254s %254[^|]",
keyword, valuestr);
mName.assign(valuestr);
- LLStringUtil::replaceNonstandardASCII(mName, ' ');
- LLStringUtil::replaceChar(mName, '|', ' ');
- LLStringUtil::trim(mName);
- LLStringUtil::truncate(mName, DB_INV_ITEM_NAME_STR_LEN);
+ correctInventoryName(mName);
}
else
{
@@ -287,23 +274,31 @@ void LLInventoryObject::updateServer(BOOL) const
llwarns << "LLInventoryObject::updateServer() called. Doesn't do anything." << llendl;
}
+inline
+void LLInventoryObject::correctInventoryName(std::string& name)
+{
+ LLStringUtil::replaceNonstandardASCII(name, ' ');
+ LLStringUtil::replaceChar(name, '|', ' ');
+ LLStringUtil::trim(name);
+ LLStringUtil::truncate(name, DB_INV_ITEM_NAME_STR_LEN);
+}
+
///----------------------------------------------------------------------------
/// Class LLInventoryItem
///----------------------------------------------------------------------------
-LLInventoryItem::LLInventoryItem(
- const LLUUID& uuid,
- const LLUUID& parent_uuid,
- const LLPermissions& permissions,
- const LLUUID& asset_uuid,
- LLAssetType::EType type,
- LLInventoryType::EType inv_type,
- const std::string& name,
- const std::string& desc,
- const LLSaleInfo& sale_info,
- U32 flags,
- S32 creation_date_utc) :
+LLInventoryItem::LLInventoryItem(const LLUUID& uuid,
+ const LLUUID& parent_uuid,
+ const LLPermissions& permissions,
+ const LLUUID& asset_uuid,
+ LLAssetType::EType type,
+ LLInventoryType::EType inv_type,
+ const std::string& name,
+ const std::string& desc,
+ const LLSaleInfo& sale_info,
+ U32 flags,
+ S32 creation_date_utc) :
LLInventoryObject(uuid, parent_uuid, type, name),
mPermissions(permissions),
mAssetUUID(asset_uuid),
@@ -458,11 +453,18 @@ void LLInventoryItem::setCreationDate(time_t creation_date_utc)
mCreationDate = creation_date_utc;
}
+// Currently only used in the Viewer to handle calling cards
+// where the creator is actually used to store the target.
+void LLInventoryItem::setCreator(const LLUUID& creator)
+{
+ mPermissions.setCreator(creator);
+}
+
void LLInventoryItem::accumulatePermissionSlamBits(const LLInventoryItem& old_item)
{
// Remove any pre-existing II_FLAGS_PERM_OVERWRITE_MASK flags
// because we now detect when they should be set.
- setFlags( old_item.getFlags() | (getFlags() & ~(LLInventoryItem::II_FLAGS_PERM_OVERWRITE_MASK)) );
+ setFlags( old_item.getFlags() | (getFlags() & ~(LLInventoryItemFlags::II_FLAGS_PERM_OVERWRITE_MASK)) );
// Enforce the PERM_OVERWRITE flags for any masks that are different
// but only for AT_OBJECT's since that is the only asset type that can
@@ -473,20 +475,20 @@ void LLInventoryItem::accumulatePermissionSlamBits(const LLInventoryItem& old_it
U32 flags_to_be_set = 0;
if(old_permissions.getMaskNextOwner() != getPermissions().getMaskNextOwner())
{
- flags_to_be_set |= LLInventoryItem::II_FLAGS_OBJECT_SLAM_PERM;
+ flags_to_be_set |= LLInventoryItemFlags::II_FLAGS_OBJECT_SLAM_PERM;
}
if(old_permissions.getMaskEveryone() != getPermissions().getMaskEveryone())
{
- flags_to_be_set |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE;
+ flags_to_be_set |= LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE;
}
if(old_permissions.getMaskGroup() != getPermissions().getMaskGroup())
{
- flags_to_be_set |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP;
+ flags_to_be_set |= LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP;
}
LLSaleInfo old_sale_info = old_item.getSaleInfo();
if(old_sale_info != getSaleInfo())
{
- flags_to_be_set |= LLInventoryItem::II_FLAGS_OBJECT_SLAM_SALE;
+ flags_to_be_set |= LLInventoryItemFlags::II_FLAGS_OBJECT_SLAM_SALE;
}
setFlags(getFlags() | flags_to_be_set);
}
@@ -1304,28 +1306,14 @@ void LLInventoryItem::unpackBinaryBucket(U8* bin_bucket, S32 bin_bucket_size)
setCreationDate(now);
}
-// returns TRUE if a should appear before b
-BOOL item_dictionary_sort( LLInventoryItem* a, LLInventoryItem* b )
-{
- return (LLStringUtil::compareDict( a->getName().c_str(), b->getName().c_str() ) < 0);
-}
-
-// returns TRUE if a should appear before b
-BOOL item_date_sort( LLInventoryItem* a, LLInventoryItem* b )
-{
- return a->getCreationDate() < b->getCreationDate();
-}
-
-
///----------------------------------------------------------------------------
/// Class LLInventoryCategory
///----------------------------------------------------------------------------
-LLInventoryCategory::LLInventoryCategory(
- const LLUUID& uuid,
- const LLUUID& parent_uuid,
- LLFolderType::EType preferred_type,
- const std::string& name) :
+LLInventoryCategory::LLInventoryCategory(const LLUUID& uuid,
+ const LLUUID& parent_uuid,
+ LLFolderType::EType preferred_type,
+ const std::string& name) :
LLInventoryObject(uuid, parent_uuid, LLAssetType::AT_CATEGORY, name),
mPreferredType(preferred_type)
{
diff --git a/indra/llinventory/llinventory.h b/indra/llinventory/llinventory.h
index 9faecbea85..4c6ac83ab8 100644
--- a/indra/llinventory/llinventory.h
+++ b/indra/llinventory/llinventory.h
@@ -33,8 +33,6 @@
#ifndef LL_LLINVENTORY_H
#define LL_LLINVENTORY_H
-#include <functional>
-
#include "lldarray.h"
#include "llfoldertype.h"
#include "llinventorytype.h"
@@ -45,180 +43,98 @@
#include "llsd.h"
#include "lluuid.h"
-// consts for Key field in the task inventory update message
-extern const U8 TASK_INVENTORY_ITEM_KEY;
-extern const U8 TASK_INVENTORY_ASSET_KEY;
-
-// anonymous enumeration to specify a max inventory buffer size for
-// use in packBinaryBucket()
-enum
-{
- MAX_INVENTORY_BUFFER_SIZE = 1024
-};
-
-
+class LLMessageSystem;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLInventoryObject
//
-// This is the base class for inventory objects that handles the
-// common code between items and categories. The 'mParentUUID' member
-// means the parent category since all inventory objects except each
-// user's root category are in some category. Each user's root
-// category will have mParentUUID==LLUUID::null.
+// Base class for anything in the user's inventory. Handles the common code
+// between items and categories.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLMessageSystem;
-
class LLInventoryObject : public LLRefCount
{
-protected:
- LLUUID mUUID;
- LLUUID mParentUUID;
- LLAssetType::EType mType;
- std::string mName;
+public:
+ typedef std::list<LLPointer<LLInventoryObject> > object_list_t;
-protected:
- virtual ~LLInventoryObject( void );
-
+ //--------------------------------------------------------------------
+ // Initialization
+ //--------------------------------------------------------------------
public:
MEM_TYPE_NEW(LLMemType::MTYPE_INVENTORY);
- LLInventoryObject(const LLUUID& uuid, const LLUUID& parent_uuid,
- LLAssetType::EType type, const std::string& name);
LLInventoryObject();
+ LLInventoryObject(const LLUUID& uuid,
+ const LLUUID& parent_uuid,
+ LLAssetType::EType type,
+ const std::string& name);
void copyObject(const LLInventoryObject* other); // LLRefCount requires custom copy
+protected:
+ virtual ~LLInventoryObject();
- // accessors
- virtual const LLUUID& getUUID() const;
+ //--------------------------------------------------------------------
+ // Accessors
+ //--------------------------------------------------------------------
+public:
+ virtual const LLUUID& getUUID() const; // inventoryID that this item points to
+ virtual const LLUUID& getLinkedUUID() const; // inventoryID that this item points to, else this item's inventoryID
const LLUUID& getParentUUID() const;
- virtual const LLUUID& getLinkedUUID() const; // get the inventoryID that this item points to, else this item's inventoryID
virtual const std::string& getName() const;
virtual LLAssetType::EType getType() const;
LLAssetType::EType getActualType() const; // bypasses indirection for linked items
BOOL getIsLinkType() const;
- // mutators - will not call updateServer();
+
+ //--------------------------------------------------------------------
+ // Mutators
+ // Will not call updateServer
+ //--------------------------------------------------------------------
+public:
void setUUID(const LLUUID& new_uuid);
virtual void rename(const std::string& new_name);
void setParent(const LLUUID& new_parent);
void setType(LLAssetType::EType type);
- // file support - implemented here so that a minimal information
- // set can be transmitted between simulator and viewer.
-// virtual BOOL importFile(LLFILE* fp);
- virtual BOOL exportFile(LLFILE* fp, BOOL include_asset_key = TRUE) const;
+private:
+ // in place correction for inventory name string
+ void correctInventoryName(std::string& name);
+ //--------------------------------------------------------------------
+ // File Support
+ // Implemented here so that a minimal information set can be transmitted
+ // between simulator and viewer.
+ //--------------------------------------------------------------------
+public:
+ // virtual BOOL importFile(LLFILE* fp);
+ virtual BOOL exportFile(LLFILE* fp, BOOL include_asset_key = TRUE) const;
virtual BOOL importLegacyStream(std::istream& input_stream);
virtual BOOL exportLegacyStream(std::ostream& output_stream, BOOL include_asset_key = TRUE) const;
- // virtual methods
virtual void removeFromServer();
virtual void updateParentOnServer(BOOL) const;
virtual void updateServer(BOOL) const;
+
+ //--------------------------------------------------------------------
+ // Member Variables
+ //--------------------------------------------------------------------
+protected:
+ LLUUID mUUID;
+ LLUUID mParentUUID; // Parent category. Root categories have LLUUID::NULL.
+ LLAssetType::EType mType;
+ std::string mName;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLInventoryItem
//
-// An inventory item represents something that the current user has in
-// their inventory.
+// An item in the current user's inventory.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
class LLInventoryItem : public LLInventoryObject
{
public:
typedef LLDynamicArray<LLPointer<LLInventoryItem> > item_array_t;
-
-protected:
- LLPermissions mPermissions;
- LLUUID mAssetUUID;
- std::string mDescription;
- LLSaleInfo mSaleInfo;
- LLInventoryType::EType mInventoryType;
- U32 mFlags;
- time_t mCreationDate; // seconds from 1/1/1970, UTC
-
-public:
-
- /**
- * Anonymous enumeration for specifying the inventory item flags.
- */
- enum
- {
- // The shared flags at the top are shared among all inventory
- // types. After that section, all values of flags are type
- // dependent. The shared flags will start at 2^30 and work
- // down while item type specific flags will start at 2^0 and
- // work up.
- II_FLAGS_NONE = 0,
-
-
- //
- // Shared flags
- //
- //
-
- // This value means that the asset has only one reference in
- // the system. If the inventory item is deleted, or the asset
- // id updated, then we can remove the old reference.
- II_FLAGS_SHARED_SINGLE_REFERENCE = 0x40000000,
-
-
- //
- // Landmark flags
- //
- II_FLAGS_LANDMARK_VISITED = 1,
-
- //
- // Object flags
- //
-
- // flag to indicate that object permissions should have next
- // owner perm be more restrictive on rez. We bump this into
- // the second byte of the flags since the low byte is used to
- // track attachment points.
- II_FLAGS_OBJECT_SLAM_PERM = 0x100,
-
- // flag to indicate that the object sale information has been changed.
- II_FLAGS_OBJECT_SLAM_SALE = 0x1000,
-
- // These flags specify which permissions masks to overwrite
- // upon rez. Normally, if no permissions slam (above) or
- // overwrite flags are set, the asset's permissions are
- // used and the inventory's permissions are ignored. If
- // any of these flags are set, the inventory's permissions
- // take precedence.
- II_FLAGS_OBJECT_PERM_OVERWRITE_BASE = 0x010000,
- II_FLAGS_OBJECT_PERM_OVERWRITE_OWNER = 0x020000,
- II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP = 0x040000,
- II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE = 0x080000,
- II_FLAGS_OBJECT_PERM_OVERWRITE_NEXT_OWNER = 0x100000,
-
- // flag to indicate whether an object that is returned is composed
- // of muiltiple items or not.
- II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS = 0x200000,
-
- //
- // wearables use the low order byte of flags to store the
- // EWearableType enumeration found in newview/llwearable.h
- //
- II_FLAGS_WEARABLES_MASK = 0xff,
-
- // these bits need to be cleared whenever the asset_id is updated
- // on a pre-existing inventory item (DEV-28098 and DEV-30997)
- II_FLAGS_PERM_OVERWRITE_MASK = II_FLAGS_OBJECT_SLAM_PERM
- | II_FLAGS_OBJECT_SLAM_SALE
- | II_FLAGS_OBJECT_PERM_OVERWRITE_BASE
- | II_FLAGS_OBJECT_PERM_OVERWRITE_OWNER
- | II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP
- | II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE
- | II_FLAGS_OBJECT_PERM_OVERWRITE_NEXT_OWNER,
- };
-
-protected:
- ~LLInventoryItem(); // ref counted
+ //--------------------------------------------------------------------
+ // Initialization
+ //--------------------------------------------------------------------
public:
-
MEM_TYPE_NEW(LLMemType::MTYPE_INVENTORY);
LLInventoryItem(const LLUUID& uuid,
const LLUUID& parent_uuid,
@@ -237,10 +153,14 @@ public:
// is prohibited
LLInventoryItem(const LLInventoryItem* other);
virtual void copyItem(const LLInventoryItem* other); // LLRefCount requires custom copy
-
void generateUUID() { mUUID.generate(); }
+protected:
+ ~LLInventoryItem(); // ref counted
- // accessors
+ //--------------------------------------------------------------------
+ // Accessors
+ //--------------------------------------------------------------------
+public:
virtual const LLUUID& getLinkedUUID() const;
virtual const LLPermissions& getPermissions() const;
virtual const LLUUID& getCreatorUUID() const;
@@ -252,8 +172,12 @@ public:
virtual time_t getCreationDate() const;
virtual U32 getCRC32() const; // really more of a checksum.
- // mutators - will not call updateServer(), and will never fail
- // (though it may correct to sane values)
+ //--------------------------------------------------------------------
+ // Mutators
+ // Will not call updateServer and will never fail
+ // (though it may correct to sane values)
+ //--------------------------------------------------------------------
+public:
void setAssetUUID(const LLUUID& asset_id);
void setDescription(const std::string& new_desc);
void setSaleInfo(const LLSaleInfo& sale_info);
@@ -261,62 +185,68 @@ public:
void setInventoryType(LLInventoryType::EType inv_type);
void setFlags(U32 flags);
void setCreationDate(time_t creation_date_utc);
+ void setCreator(const LLUUID& creator); // only used for calling cards
// Check for changes in permissions masks and sale info
- // and set the corresponding bits in mFlags
+ // and set the corresponding bits in mFlags.
void accumulatePermissionSlamBits(const LLInventoryItem& old_item);
-
- // This is currently only used in the Viewer to handle calling cards
- // where the creator is actually used to store the target.
- void setCreator(const LLUUID& creator) { mPermissions.setCreator(creator); }
- // Put this inventory item onto the current outgoing mesage. It
- // assumes you have already called nextBlock().
+ // Put this inventory item onto the current outgoing mesage.
+ // Assumes you have already called nextBlock().
virtual void packMessage(LLMessageSystem* msg) const;
- // unpack returns TRUE if the inventory item came through the
- // network ok. It uses a simple crc check which is defeatable, but
- // we want to detect network mangling somehow.
+ // Returns TRUE if the inventory item came through the network correctly.
+ // Uses a simple crc check which is defeatable, but we want to detect
+ // network mangling somehow.
virtual BOOL unpackMessage(LLMessageSystem* msg, const char* block, S32 block_num = 0);
- // file support
+
+ //--------------------------------------------------------------------
+ // File Support
+ //--------------------------------------------------------------------
+public:
virtual BOOL importFile(LLFILE* fp);
virtual BOOL exportFile(LLFILE* fp, BOOL include_asset_key = TRUE) const;
-
virtual BOOL importLegacyStream(std::istream& input_stream);
virtual BOOL exportLegacyStream(std::ostream& output_stream, BOOL include_asset_key = TRUE) const;
- // helper functions
-
- // pack all information needed to reconstruct this item into the given binary bucket.
- // perm_override is optional
+ //--------------------------------------------------------------------
+ // Helper Functions
+ //--------------------------------------------------------------------
+public:
+ // Pack all information needed to reconstruct this item into the given binary bucket.
S32 packBinaryBucket(U8* bin_bucket, LLPermissions* perm_override = NULL) const;
void unpackBinaryBucket(U8* bin_bucket, S32 bin_bucket_size);
LLSD asLLSD() const;
void asLLSD( LLSD& sd ) const;
bool fromLLSD(const LLSD& sd);
+ //--------------------------------------------------------------------
+ // Member Variables
+ //--------------------------------------------------------------------
+protected:
+ LLPermissions mPermissions;
+ LLUUID mAssetUUID;
+ std::string mDescription;
+ LLSaleInfo mSaleInfo;
+ LLInventoryType::EType mInventoryType;
+ U32 mFlags;
+ time_t mCreationDate; // seconds from 1/1/1970, UTC
};
-BOOL item_dictionary_sort(LLInventoryItem* a,LLInventoryItem* b);
-BOOL item_date_sort(LLInventoryItem* a, LLInventoryItem* b);
-
-
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLInventoryCategory
//
-// An instance of this class represents a category of inventory
-// items. Users come with a set of default categories, and can create
-// new ones as needed.
+// A category/folder of inventory items. Users come with a set of default
+// categories, and can create new ones as needed.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
class LLInventoryCategory : public LLInventoryObject
{
public:
typedef LLDynamicArray<LLPointer<LLInventoryCategory> > cat_array_t;
-protected:
- ~LLInventoryCategory();
-
+ //--------------------------------------------------------------------
+ // Initialization
+ //--------------------------------------------------------------------
public:
MEM_TYPE_NEW(LLMemType::MTYPE_INVENTORY);
LLInventoryCategory(const LLUUID& uuid, const LLUUID& parent_uuid,
@@ -325,40 +255,49 @@ public:
LLInventoryCategory();
LLInventoryCategory(const LLInventoryCategory* other);
void copyCategory(const LLInventoryCategory* other); // LLRefCount requires custom copy
+protected:
+ ~LLInventoryCategory();
- // accessors and mutators
+ //--------------------------------------------------------------------
+ // Accessors And Mutators
+ //--------------------------------------------------------------------
+public:
LLFolderType::EType getPreferredType() const;
void setPreferredType(LLFolderType::EType type);
- // For messaging system support
- virtual void packMessage(LLMessageSystem* msg) const;
- virtual void unpackMessage(LLMessageSystem* msg, const char* block, S32 block_num = 0);
-
LLSD asLLSD() const;
bool fromLLSD(const LLSD& sd);
- // file support
+ //--------------------------------------------------------------------
+ // Messaging
+ //--------------------------------------------------------------------
+public:
+ virtual void packMessage(LLMessageSystem* msg) const;
+ virtual void unpackMessage(LLMessageSystem* msg, const char* block, S32 block_num = 0);
+
+ //--------------------------------------------------------------------
+ // File Support
+ //--------------------------------------------------------------------
+public:
virtual BOOL importFile(LLFILE* fp);
virtual BOOL exportFile(LLFILE* fp, BOOL include_asset_key = TRUE) const;
-
virtual BOOL importLegacyStream(std::istream& input_stream);
virtual BOOL exportLegacyStream(std::ostream& output_stream, BOOL include_asset_key = TRUE) const;
+ //--------------------------------------------------------------------
+ // Member Variables
+ //--------------------------------------------------------------------
protected:
- // May be the type that this category was "meant" to hold (although it may hold any type).
- LLFolderType::EType mPreferredType;
+ LLFolderType::EType mPreferredType; // Type that this category was "meant" to hold (although it may hold any type).
};
//-----------------------------------------------------------------------------
-// Useful bits
+// Convertors
+//
+// These functions convert between structured data and an inventory
+// item, appropriate for serialization.
//-----------------------------------------------------------------------------
-
-typedef std::list<LLPointer<LLInventoryObject> > InventoryObjectList;
-
-// These functions convert between structured data and an inventory
-// item, appropriate for serialization.
LLSD ll_create_sd_from_inventory_item(LLPointer<LLInventoryItem> item);
-//LLPointer<LLInventoryItem> ll_create_item_from_sd(const LLSD& sd_item);
LLSD ll_create_sd_from_inventory_category(LLPointer<LLInventoryCategory> cat);
LLPointer<LLInventoryCategory> ll_create_category_from_sd(const LLSD& sd_cat);
diff --git a/indra/llinventory/llinventorydefines.cpp b/indra/llinventory/llinventorydefines.cpp
new file mode 100644
index 0000000000..a9610d4d4b
--- /dev/null
+++ b/indra/llinventory/llinventorydefines.cpp
@@ -0,0 +1,37 @@
+/**
+ * @file llinventorydefines.cpp
+ * @brief Implementation of the inventory defines.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+#include "llinventorydefines.h"
+
+const U8 TASK_INVENTORY_ITEM_KEY = 0;
+const U8 TASK_INVENTORY_ASSET_KEY = 1;
diff --git a/indra/llinventory/llinventorydefines.h b/indra/llinventory/llinventorydefines.h
new file mode 100644
index 0000000000..67e629c546
--- /dev/null
+++ b/indra/llinventory/llinventorydefines.h
@@ -0,0 +1,106 @@
+/**
+ * @file llinventorydefines.h
+ * @brief LLInventoryDefines
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLINVENTORYDEFINES_H
+#define LL_LLINVENTORYDEFINES_H
+
+// Consts for "key" field in the task inventory update message
+extern const U8 TASK_INVENTORY_ITEM_KEY;
+extern const U8 TASK_INVENTORY_ASSET_KEY;
+
+// Max inventory buffer size (for use in packBinaryBucket)
+enum
+{
+ MAX_INVENTORY_BUFFER_SIZE = 1024
+};
+
+//--------------------------------------------------------------------
+// Inventory item flags enums
+// The shared flags at the top are shared among all inventory
+// types. After that section, all values of flags are type
+// dependent. The shared flags will start at 2^30 and work
+// down while item type specific flags will start at 2^0 and work up.
+//--------------------------------------------------------------------
+class LLInventoryItemFlags
+{
+public:
+ enum EType
+ {
+ II_FLAGS_NONE = 0,
+
+ II_FLAGS_SHARED_SINGLE_REFERENCE = 0x40000000,
+ // The asset has only one reference in the system. If the
+ // inventory item is deleted, or the assetid updated, then we
+ // can remove the old reference.
+
+ II_FLAGS_LANDMARK_VISITED = 1,
+
+ II_FLAGS_OBJECT_SLAM_PERM = 0x100,
+ // Object permissions should have next owner perm be more
+ // restrictive on rez. We bump this into the second byte of the
+ // flags since the low byte is used to track attachment points.
+
+ II_FLAGS_OBJECT_SLAM_SALE = 0x1000,
+ // The object sale information has been changed.
+
+ II_FLAGS_OBJECT_PERM_OVERWRITE_BASE = 0x010000,
+ II_FLAGS_OBJECT_PERM_OVERWRITE_OWNER = 0x020000,
+ II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP = 0x040000,
+ II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE = 0x080000,
+ II_FLAGS_OBJECT_PERM_OVERWRITE_NEXT_OWNER = 0x100000,
+ // Specify which permissions masks to overwrite
+ // upon rez. Normally, if no permissions slam (above) or
+ // overwrite flags are set, the asset's permissions are
+ // used and the inventory's permissions are ignored. If
+ // any of these flags are set, the inventory's permissions
+ // take precedence.
+
+ II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS = 0x200000,
+ // Whether a returned object is composed of multiple items.
+
+ II_FLAGS_WEARABLES_MASK = 0xff,
+ // Wearables use the low order byte of flags to store the
+ // LLWearableType::EType enumeration found in newview/llwearable.h
+
+ II_FLAGS_PERM_OVERWRITE_MASK = (II_FLAGS_OBJECT_SLAM_PERM |
+ II_FLAGS_OBJECT_SLAM_SALE |
+ II_FLAGS_OBJECT_PERM_OVERWRITE_BASE |
+ II_FLAGS_OBJECT_PERM_OVERWRITE_OWNER |
+ II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP |
+ II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE |
+ II_FLAGS_OBJECT_PERM_OVERWRITE_NEXT_OWNER),
+ // These bits need to be cleared whenever the asset_id is updated
+ // on a pre-existing inventory item (DEV-28098 and DEV-30997)
+ };
+};
+
+#endif // LL_LLINVENTORYDEFINES_H
diff --git a/indra/llinventory/llinventorytype.cpp b/indra/llinventory/llinventorytype.cpp
index 4ef5df0b28..c050f20a9d 100644
--- a/indra/llinventory/llinventorytype.cpp
+++ b/indra/llinventory/llinventorytype.cpp
@@ -181,6 +181,10 @@ bool LLInventoryType::cannotRestrictPermissions(LLInventoryType::EType type)
bool inventory_and_asset_types_match(LLInventoryType::EType inventory_type,
LLAssetType::EType asset_type)
{
+ // Links can be of any inventory type.
+ if (LLAssetType::lookupIsLinkType(asset_type))
+ return true;
+
const InventoryEntry *entry = LLInventoryDictionary::getInstance()->lookup(inventory_type);
if (!entry) return false;
diff --git a/indra/llinventory/llinventorytype.h b/indra/llinventory/llinventorytype.h
index e515b8a304..20da954002 100644
--- a/indra/llinventory/llinventorytype.h
+++ b/indra/llinventory/llinventorytype.h
@@ -75,7 +75,6 @@ public:
// machine transation between type and strings
static EType lookup(const std::string& name);
static const std::string &lookup(EType type);
-
// translation from a type to a human readable form.
static const std::string &lookupHumanReadable(EType type);
diff --git a/indra/llinventory/llparcel.cpp b/indra/llinventory/llparcel.cpp
index ec21ae40e7..b08cb28218 100644
--- a/indra/llinventory/llparcel.cpp
+++ b/indra/llinventory/llparcel.cpp
@@ -452,7 +452,7 @@ BOOL LLParcel::allowTerraformBy(const LLUUID &agent_id) const
bool LLParcel::isAgentBlockedFromParcel(LLParcel* parcelp,
const LLUUID& agent_id,
- const std::vector<LLUUID>& group_ids,
+ const uuid_vec_t& group_ids,
const BOOL is_agent_identified,
const BOOL is_agent_transacted,
const BOOL is_agent_ageverified)
diff --git a/indra/llinventory/llparcel.h b/indra/llinventory/llparcel.h
index 2a9a596912..4ee9d9b40f 100644
--- a/indra/llinventory/llparcel.h
+++ b/indra/llinventory/llparcel.h
@@ -258,7 +258,7 @@ public:
void setMediaURLResetTimer(F32 time);
virtual void setLocalID(S32 local_id);
- // blow away all the extra crap lurking in parcels, including urls, access lists, etc
+ // blow away all the extra stuff lurking in parcels, including urls, access lists, etc
void clearParcel();
// This value is not persisted out to the parcel file, it is only
@@ -538,7 +538,7 @@ public:
static bool isAgentBlockedFromParcel(LLParcel* parcelp,
const LLUUID& agent_id,
- const std::vector<LLUUID>& group_ids,
+ const uuid_vec_t& group_ids,
const BOOL is_agent_identified,
const BOOL is_agent_transacted,
const BOOL is_agent_ageverified);
diff --git a/indra/llinventory/llpermissions.cpp b/indra/llinventory/llpermissions.cpp
index d2e5034734..9683252dc4 100644
--- a/indra/llinventory/llpermissions.cpp
+++ b/indra/llinventory/llpermissions.cpp
@@ -479,7 +479,7 @@ BOOL LLPermissions::setNextOwnerBits(const LLUUID& agent, const LLUUID& group, B
return ownership;
}
-BOOL LLPermissions::allowOperationBy(PermissionBit op, const LLUUID& requester, const LLUUID& group) const
+bool LLPermissions::allowOperationBy(PermissionBit op, const LLUUID& requester, const LLUUID& group) const
{
if(requester.isNull())
{
diff --git a/indra/llinventory/llpermissions.h b/indra/llinventory/llpermissions.h
index d5a0881c8f..fa20d5c214 100644
--- a/indra/llinventory/llpermissions.h
+++ b/indra/llinventory/llpermissions.h
@@ -149,7 +149,7 @@ public:
const LLUUID& getGroup() const { return mGroup; }
// return the agent_id of the last agent owner. Only returns
- // LLUUID::null if there has never been a previous owner.
+ // LLUUID::null if there has never been a previous owner (*note: this is apparently not true, say for textures in inventory, it may return LLUUID::null even if there was a previous owner).
const LLUUID& getLastOwner() const { return mLastOwner; }
U32 getMaskBase() const { return mMaskBase; }
@@ -272,18 +272,18 @@ public:
// They also return true if the object isn't owned, or the
// requesting agent is a system agent. See llpermissionsflags.h
// for bits.
- BOOL allowOperationBy(PermissionBit op, const LLUUID& agent, const LLUUID& group = LLUUID::null) const;
+ bool allowOperationBy(PermissionBit op, const LLUUID& agent, const LLUUID& group = LLUUID::null) const;
- inline BOOL allowModifyBy(const LLUUID &agent_id) const;
- inline BOOL allowCopyBy(const LLUUID& agent_id) const;
- inline BOOL allowMoveBy(const LLUUID& agent_id) const;
- inline BOOL allowModifyBy(const LLUUID &agent_id, const LLUUID& group) const;
- inline BOOL allowCopyBy(const LLUUID& agent_id, const LLUUID& group) const;
- inline BOOL allowMoveBy(const LLUUID &agent_id, const LLUUID &group) const;
+ inline bool allowModifyBy(const LLUUID &agent_id) const;
+ inline bool allowCopyBy(const LLUUID& agent_id) const;
+ inline bool allowMoveBy(const LLUUID& agent_id) const;
+ inline bool allowModifyBy(const LLUUID &agent_id, const LLUUID& group) const;
+ inline bool allowCopyBy(const LLUUID& agent_id, const LLUUID& group) const;
+ inline bool allowMoveBy(const LLUUID &agent_id, const LLUUID &group) const;
// This somewhat specialized function is meant for testing if the
// current owner is allowed to transfer to the specified agent id.
- inline BOOL allowTransferTo(const LLUUID &agent_id) const;
+ inline bool allowTransferTo(const LLUUID &agent_id) const;
//
// DEPRECATED.
@@ -336,38 +336,38 @@ public:
};
// Inlines
-BOOL LLPermissions::allowModifyBy(const LLUUID& agent, const LLUUID& group) const
+bool LLPermissions::allowModifyBy(const LLUUID& agent, const LLUUID& group) const
{
return allowOperationBy(PERM_MODIFY, agent, group);
}
-BOOL LLPermissions::allowCopyBy(const LLUUID& agent, const LLUUID& group) const
+bool LLPermissions::allowCopyBy(const LLUUID& agent, const LLUUID& group) const
{
return allowOperationBy(PERM_COPY, agent, group);
}
-BOOL LLPermissions::allowMoveBy(const LLUUID& agent, const LLUUID& group) const
+bool LLPermissions::allowMoveBy(const LLUUID& agent, const LLUUID& group) const
{
return allowOperationBy(PERM_MOVE, agent, group);
}
-BOOL LLPermissions::allowModifyBy(const LLUUID& agent) const
+bool LLPermissions::allowModifyBy(const LLUUID& agent) const
{
return allowOperationBy(PERM_MODIFY, agent, LLUUID::null);
}
-BOOL LLPermissions::allowCopyBy(const LLUUID& agent) const
+bool LLPermissions::allowCopyBy(const LLUUID& agent) const
{
return allowOperationBy(PERM_COPY, agent, LLUUID::null);
}
-BOOL LLPermissions::allowMoveBy(const LLUUID& agent) const
+bool LLPermissions::allowMoveBy(const LLUUID& agent) const
{
return allowOperationBy(PERM_MOVE, agent, LLUUID::null);
}
-BOOL LLPermissions::allowTransferTo(const LLUUID &agent_id) const
+bool LLPermissions::allowTransferTo(const LLUUID &agent_id) const
{
if (mIsGroupOwned)
{
diff --git a/indra/llmath/llmath.h b/indra/llmath/llmath.h
index 209b506c30..c3c15e1374 100644
--- a/indra/llmath/llmath.h
+++ b/indra/llmath/llmath.h
@@ -61,11 +61,11 @@
#endif
// Single Precision Floating Point Routines
-#ifndef fsqrtf
-#define fsqrtf(x) ((F32)sqrt((F64)(x)))
-#endif
#ifndef sqrtf
-#define sqrtf(x) ((F32)sqrt((F64)(x)))
+#define sqrtf(x) ((F32)sqrt((F64)(x)))
+#endif
+#ifndef fsqrtf
+#define fsqrtf(x) sqrtf(x)
#endif
#ifndef cosf
@@ -78,11 +78,14 @@
#define tanf(x) ((F32)tan((F64)(x)))
#endif
#ifndef acosf
-#define acosf(x) ((F32)acos((F64)(x)))
+#define acosf(x) ((F32)acos((F64)(x)))
#endif
#ifndef powf
-#define powf(x,y) ((F32)pow((F64)(x),(F64)(y)))
+#define powf(x,y) ((F32)pow((F64)(x),(F64)(y)))
+#endif
+#ifndef expf
+#define expf(x) ((F32)exp((F64)(x)))
#endif
const F32 GRAVITY = -9.8f;
diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp
index df4c618ac1..34348230b6 100644
--- a/indra/llmath/llvolume.cpp
+++ b/indra/llmath/llvolume.cpp
@@ -3822,6 +3822,7 @@ BOOL LLVolume::cleanupTriangleData( const S32 num_input_vertices,
// Generate the vertex mapping and the list of vertices without
// duplicates. This will crash if there are no vertices.
+ llassert(num_input_vertices > 0); // check for no vertices!
S32 *vertex_mapping = new S32[num_input_vertices];
LLVector3 *new_vertices = new LLVector3[num_input_vertices];
LLVertexIndexPair *prev_pairp = NULL;
@@ -4520,15 +4521,65 @@ BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build)
if (!partial_build)
{
- int idxs[] = {0,1,(grid_size+1)+1,(grid_size+1)+1,(grid_size+1),0};
- for(int gx = 0;gx<grid_size;gx++){
- for(int gy = 0;gy<grid_size;gy++){
- if (mTypeMask & TOP_MASK){
- for(int i=5;i>=0;i--)mIndices.push_back(vtop+(gy*(grid_size+1))+gx+idxs[i]);
- }else{
- for(int i=0;i<6;i++)mIndices.push_back(vtop+(gy*(grid_size+1))+gx+idxs[i]);
+ mTriStrip.clear();
+ S32 idxs[] = {0,1,(grid_size+1)+1,(grid_size+1)+1,(grid_size+1),0};
+ for(S32 gx = 0;gx<grid_size;gx++)
+ {
+
+ for(S32 gy = 0;gy<grid_size;gy++)
+ {
+ if (mTypeMask & TOP_MASK)
+ {
+ for(S32 i=5;i>=0;i--)
+ {
+ mIndices.push_back(vtop+(gy*(grid_size+1))+gx+idxs[i]);
+ }
+
+ if (gy == 0)
+ {
+ mTriStrip.push_back((gx+1)*(grid_size+1));
+ mTriStrip.push_back((gx+1)*(grid_size+1));
+ mTriStrip.push_back(gx*(grid_size+1));
+ }
+
+ mTriStrip.push_back(gy+1+(gx+1)*(grid_size+1));
+ mTriStrip.push_back(gy+1+gx*(grid_size+1));
+
+
+ if (gy == grid_size-1)
+ {
+ mTriStrip.push_back(gy+1+gx*(grid_size+1));
+ }
+ }
+ else
+ {
+ for(S32 i=0;i<6;i++)
+ {
+ mIndices.push_back(vtop+(gy*(grid_size+1))+gx+idxs[i]);
+ }
+
+ if (gy == 0)
+ {
+ mTriStrip.push_back(gx*(grid_size+1));
+ mTriStrip.push_back(gx*(grid_size+1));
+ mTriStrip.push_back((gx+1)*(grid_size+1));
+ }
+
+ mTriStrip.push_back(gy+1+gx*(grid_size+1));
+ mTriStrip.push_back(gy+1+(gx+1)*(grid_size+1));
+
+ if (gy == grid_size-1)
+ {
+ mTriStrip.push_back(gy+1+(gx+1)*(grid_size+1));
+ }
}
}
+
+ }
+
+ if (mTriStrip.size()%2 == 1)
+ {
+ mTriStrip.push_back(mTriStrip[mTriStrip.size()-1]);
}
}
@@ -4770,6 +4821,8 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)
pt2--;
}
}
+
+ makeTriStrip();
}
else
{
@@ -4874,67 +4927,108 @@ BOOL LLVolumeFace::createCap(LLVolume* volume, BOOL partial_build)
pt2--;
}
}
+
+ makeTriStrip();
}
}
else
{
// Not hollow, generate the triangle fan.
+ U16 v1 = 2;
+ U16 v2 = 1;
+
if (mTypeMask & TOP_MASK)
{
- if (mTypeMask & OPEN_MASK)
- {
- // SOLID OPEN TOP
- // Generate indices
- // This is a tri-fan, so we reuse the same first point for all triangles.
- for (S32 i = 0; i < (num_vertices - 2); i++)
- {
- mIndices[3*i] = num_vertices - 1;
- mIndices[3*i+1] = i;
- mIndices[3*i+2] = i + 1;
- }
- }
- else
- {
- // SOLID CLOSED TOP
- for (S32 i = 0; i < (num_vertices - 2); i++)
- {
- //MSMSM fix these caps but only for the un-cut case
- mIndices[3*i] = num_vertices - 1;
- mIndices[3*i+1] = i;
- mIndices[3*i+2] = i + 1;
- }
- }
+ v1 = 1;
+ v2 = 2;
+ }
+
+ for (S32 i = 0; i < (num_vertices - 2); i++)
+ {
+ mIndices[3*i] = num_vertices - 1;
+ mIndices[3*i+v1] = i;
+ mIndices[3*i+v2] = i + 1;
+ }
+
+ //make tri strip
+ if (mTypeMask & OPEN_MASK)
+ {
+ makeTriStrip();
}
else
{
- if (mTypeMask & OPEN_MASK)
+ S32 j = num_vertices-2;
+ if (mTypeMask & TOP_MASK)
{
- // SOLID OPEN BOTTOM
- // Generate indices
- // This is a tri-fan, so we reuse the same first point for all triangles.
- for (S32 i = 0; i < (num_vertices - 2); i++)
+ mTriStrip.push_back(0);
+ for (S32 i = 0; i <= j; ++i)
{
- mIndices[3*i] = num_vertices - 1;
- mIndices[3*i+1] = i + 1;
- mIndices[3*i+2] = i;
+ mTriStrip.push_back(i);
+ if (i != j)
+ {
+ mTriStrip.push_back(j);
+ }
+ --j;
}
}
else
{
- // SOLID CLOSED BOTTOM
- for (S32 i = 0; i < (num_vertices - 2); i++)
+ mTriStrip.push_back(j);
+ for (S32 i = 0; i <= j; ++i)
{
- //MSMSM fix these caps but only for the un-cut case
- mIndices[3*i] = num_vertices - 1;
- mIndices[3*i+1] = i + 1;
- mIndices[3*i+2] = i;
+ if (i != j)
+ {
+ mTriStrip.push_back(j);
+ }
+ mTriStrip.push_back(i);
+ --j;
}
}
+
+ mTriStrip.push_back(mTriStrip[mTriStrip.size()-1]);
+
+ if (mTriStrip.size()%2 == 1)
+ {
+ mTriStrip.push_back(mTriStrip[mTriStrip.size()-1]);
+ }
}
}
+
return TRUE;
}
+void LLVolumeFace::makeTriStrip()
+{
+ for (U32 i = 0; i < mIndices.size(); i+=3)
+ {
+ U16 i0 = mIndices[i];
+ U16 i1 = mIndices[i+1];
+ U16 i2 = mIndices[i+2];
+
+ if ((i/3)%2 == 1)
+ {
+ mTriStrip.push_back(i0);
+ mTriStrip.push_back(i0);
+ mTriStrip.push_back(i1);
+ mTriStrip.push_back(i2);
+ mTriStrip.push_back(i2);
+ }
+ else
+ {
+ mTriStrip.push_back(i2);
+ mTriStrip.push_back(i2);
+ mTriStrip.push_back(i1);
+ mTriStrip.push_back(i0);
+ mTriStrip.push_back(i0);
+ }
+ }
+
+ if (mTriStrip.size()%2 == 1)
+ {
+ mTriStrip.push_back(mTriStrip[mTriStrip.size()-1]);
+ }
+}
+
void LLVolumeFace::createBinormals()
{
LLMemType m1(LLMemType::MTYPE_VOLUME);
@@ -5135,9 +5229,14 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
if (!partial_build)
{
+ mTriStrip.clear();
+
// Now we generate the indices.
for (t = 0; t < (mNumT-1); t++)
{
+ //prepend terminating index to strip
+ mTriStrip.push_back(mNumS*t);
+
for (s = 0; s < (mNumS-1); s++)
{
mIndices[cur_index++] = s + mNumS*t; //bottom left
@@ -5147,6 +5246,14 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
mIndices[cur_index++] = s+1 + mNumS*t; //bottom right
mIndices[cur_index++] = s+1 + mNumS*(t+1); //top right
+ if (s == 0)
+ {
+ mTriStrip.push_back(s+mNumS*t);
+ mTriStrip.push_back(s+mNumS*(t+1));
+ }
+ mTriStrip.push_back(s+1+mNumS*t);
+ mTriStrip.push_back(s+1+mNumS*(t+1));
+
mEdge[cur_edge++] = (mNumS-1)*2*t+s*2+1; //bottom left/top right neighbor face
if (t < mNumT-2) { //top right/top left neighbor face
mEdge[cur_edge++] = (mNumS-1)*2*(t+1)+s*2+1;
@@ -5187,6 +5294,13 @@ BOOL LLVolumeFace::createSide(LLVolume* volume, BOOL partial_build)
}
mEdge[cur_edge++] = (mNumS-1)*2*t+s*2; //top right/bottom left neighbor face
}
+ //append terminating vertex to strip
+ mTriStrip.push_back(mNumS-1+mNumS*(t+1));
+ }
+
+ if (mTriStrip.size()%2 == 1)
+ {
+ mTriStrip.push_back(mTriStrip[mTriStrip.size()-1]);
}
}
diff --git a/indra/llmath/llvolume.h b/indra/llmath/llvolume.h
index 871b334452..d9f80f0e30 100644
--- a/indra/llmath/llvolume.h
+++ b/indra/llmath/llvolume.h
@@ -798,7 +798,8 @@ public:
BOOL create(LLVolume* volume, BOOL partial_build = FALSE);
void createBinormals();
-
+ void makeTriStrip();
+
class VertexData
{
public:
@@ -839,6 +840,7 @@ public:
std::vector<VertexData> mVertices;
std::vector<U16> mIndices;
+ std::vector<U16> mTriStrip;
std::vector<S32> mEdge;
private:
diff --git a/indra/llmath/tests/mathmisc_test.cpp b/indra/llmath/tests/mathmisc_test.cpp
index ea42f6e001..68d9ddc0fe 100644
--- a/indra/llmath/tests/mathmisc_test.cpp
+++ b/indra/llmath/tests/mathmisc_test.cpp
@@ -334,6 +334,8 @@ namespace tut
template<> template<>
void sphere_object::test<2>()
{
+ skip("See SNOW-620. Neither the test nor the code being tested seem good. Also sim-only.");
+
// test LLSphere::getBoundingSphere()
S32 number_of_tests = 100;
S32 number_of_spheres = 10;
diff --git a/indra/llmath/v2math.h b/indra/llmath/v2math.h
index 9fef8851cc..65f3714313 100644
--- a/indra/llmath/v2math.h
+++ b/indra/llmath/v2math.h
@@ -70,6 +70,8 @@ class LLVector2
void setVec(const LLVector2 &vec); // deprecated
void setVec(const F32 *vec); // deprecated
+ inline bool isFinite() const; // checks to see if all values of LLVector2 are finite
+
F32 length() const; // Returns magnitude of LLVector2
F32 lengthSquared() const; // Returns magnitude squared of LLVector2
F32 normalize(); // Normalizes and returns the magnitude of LLVector2
@@ -215,6 +217,7 @@ inline void LLVector2::setVec(const F32 *vec)
mV[VY] = vec[VY];
}
+
// LLVector2 Magnitude and Normalization Functions
inline F32 LLVector2::length(void) const
@@ -247,6 +250,12 @@ inline F32 LLVector2::normalize(void)
return (mag);
}
+// checker
+inline bool LLVector2::isFinite() const
+{
+ return (llfinite(mV[VX]) && llfinite(mV[VY]));
+}
+
// deprecated
inline F32 LLVector2::magVec(void) const
{
diff --git a/indra/llmessage/llares.cpp b/indra/llmessage/llares.cpp
index 00e77d20e9..5b7e5138ef 100644
--- a/indra/llmessage/llares.cpp
+++ b/indra/llmessage/llares.cpp
@@ -108,7 +108,8 @@ LLAres::LLAres() :
mInitSuccess(false),
mListener(new LLAresListener(this))
{
- if (ares_init(&chan_) != ARES_SUCCESS)
+ if (ares_library_init( ARES_LIB_INIT_ALL ) != ARES_SUCCESS ||
+ ares_init(&chan_) != ARES_SUCCESS)
{
llwarns << "Could not succesfully initialize ares!" << llendl;
return;
@@ -120,6 +121,7 @@ LLAres::LLAres() :
LLAres::~LLAres()
{
ares_destroy(chan_);
+ ares_library_cleanup();
}
void LLAres::cancel()
@@ -473,7 +475,7 @@ bool LLAres::process(U64 timeout)
ll_init_apr();
}
- int socks[ARES_GETSOCK_MAXNUM];
+ ares_socket_t socks[ARES_GETSOCK_MAXNUM];
apr_pollfd_t aprFds[ARES_GETSOCK_MAXNUM];
apr_int32_t nsds = 0;
int nactive = 0;
diff --git a/indra/llmessage/llassetstorage.cpp b/indra/llmessage/llassetstorage.cpp
index 0ab1081200..970b6747f7 100644
--- a/indra/llmessage/llassetstorage.cpp
+++ b/indra/llmessage/llassetstorage.cpp
@@ -283,28 +283,30 @@ LLEstateAssetRequest::~LLEstateAssetRequest()
// TODO: rework tempfile handling?
-LLAssetStorage::LLAssetStorage(LLMessageSystem *msg, LLXferManager *xfer, LLVFS *vfs, const LLHost &upstream_host)
+LLAssetStorage::LLAssetStorage(LLMessageSystem *msg, LLXferManager *xfer, LLVFS *vfs, LLVFS *static_vfs, const LLHost &upstream_host)
{
- _init(msg, xfer, vfs, upstream_host);
+ _init(msg, xfer, vfs, static_vfs, upstream_host);
}
LLAssetStorage::LLAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,
- LLVFS *vfs)
+ LLVFS *vfs, LLVFS *static_vfs)
{
- _init(msg, xfer, vfs, LLHost::invalid);
+ _init(msg, xfer, vfs, static_vfs, LLHost::invalid);
}
void LLAssetStorage::_init(LLMessageSystem *msg,
LLXferManager *xfer,
LLVFS *vfs,
+ LLVFS *static_vfs,
const LLHost &upstream_host)
{
mShutDown = FALSE;
mMessageSys = msg;
mXferManager = xfer;
mVFS = vfs;
+ mStaticVFS = static_vfs;
setUpstream(upstream_host);
msg->setHandlerFuncFast(_PREHASH_AssetUploadComplete, processUploadComplete, (void **)this);
@@ -396,7 +398,33 @@ void LLAssetStorage::_cleanupRequests(BOOL all, S32 error)
BOOL LLAssetStorage::hasLocalAsset(const LLUUID &uuid, const LLAssetType::EType type)
{
- return mVFS->getExists(uuid, type);
+ return mStaticVFS->getExists(uuid, type) || mVFS->getExists(uuid, type);
+}
+
+bool LLAssetStorage::findInStaticVFSAndInvokeCallback(const LLUUID& uuid, LLAssetType::EType type,
+ LLGetAssetCallback callback, void *user_data)
+{
+ BOOL exists = mStaticVFS->getExists(uuid, type);
+ if (exists)
+ {
+ LLVFile file(mStaticVFS, uuid, type);
+ U32 size = file.getSize();
+ if (size > 0)
+ {
+ // we've already got the file
+ if (callback)
+ {
+ callback(mStaticVFS, uuid, type, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED);
+ }
+ return true;
+ }
+ else
+ {
+ llwarns << "Asset vfile " << uuid << ":" << type
+ << " found in static cache with bad size " << file.getSize() << ", ignoring" << llendl;
+ }
+ }
+ return false;
}
///////////////////////////////////////////////////////////////////////////
@@ -404,12 +432,15 @@ BOOL LLAssetStorage::hasLocalAsset(const LLUUID &uuid, const LLAssetType::EType
///////////////////////////////////////////////////////////////////////////
// IW - uuid is passed by value to avoid side effects, please don't re-add &
-void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, void (*callback)(LLVFS *vfs, const LLUUID&, LLAssetType::EType, void *, S32, LLExtStat), void *user_data, BOOL is_priority)
+void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, LLGetAssetCallback callback, void *user_data, BOOL is_priority)
{
lldebugs << "LLAssetStorage::getAssetData() - " << uuid << "," << LLAssetType::lookup(type) << llendl;
+ llinfos << "ASSET_TRACE requesting " << uuid << " type " << LLAssetType::lookup(type) << llendl;
+
if (mShutDown)
{
+ llinfos << "ASSET_TRACE cancelled " << uuid << " type " << LLAssetType::lookup(type) << " shutting down" << llendl;
return; // don't get the asset or do any callbacks, we are shutting down
}
@@ -423,11 +454,30 @@ void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, vo
return;
}
+ // Try static VFS first.
+ if (findInStaticVFSAndInvokeCallback(uuid,type,callback,user_data))
+ {
+ llinfos << "ASSET_TRACE asset " << uuid << " found in static VFS" << llendl;
+ return;
+ }
+
BOOL exists = mVFS->getExists(uuid, type);
LLVFile file(mVFS, uuid, type);
U32 size = exists ? file.getSize() : 0;
- if (size < 1)
+ if (size > 0)
+ {
+ // we've already got the file
+ // theoretically, partial files w/o a pending request shouldn't happen
+ // unless there's a weird error
+ if (callback)
+ {
+ callback(mVFS, uuid, type, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED);
+ }
+
+ llinfos << "ASSET_TRACE asset " << uuid << " found in VFS" << llendl;
+ }
+ else
{
if (exists)
{
@@ -466,16 +516,7 @@ void LLAssetStorage::getAssetData(const LLUUID uuid, LLAssetType::EType type, vo
// This can be overridden by subclasses
_queueDataRequest(uuid, type, callback, user_data, duplicate, is_priority);
}
- else
- {
- // we've already got the file
- // theoretically, partial files w/o a pending request shouldn't happen
- // unless there's a weird error
- if (callback)
- {
- callback(mVFS, uuid, type, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED);
- }
- }
+
}
void LLAssetStorage::_queueDataRequest(const LLUUID& uuid, LLAssetType::EType atype,
@@ -528,6 +569,8 @@ void LLAssetStorage::downloadCompleteCallback(
LLAssetType::EType file_type,
void* user_data, LLExtStat ext_status)
{
+ llinfos << "ASSET_TRACE asset " << file_id << " downloadCompleteCallback" << llendl;
+
lldebugs << "LLAssetStorage::downloadCompleteCallback() for " << file_id
<< "," << LLAssetType::lookup(file_type) << llendl;
LLAssetRequest* req = (LLAssetRequest*)user_data;
@@ -616,11 +659,27 @@ void LLAssetStorage::getEstateAsset(const LLHost &object_sim, const LLUUID &agen
return;
}
+ // Try static VFS first.
+ if (findInStaticVFSAndInvokeCallback(asset_id,atype,callback,user_data))
+ {
+ return;
+ }
+
BOOL exists = mVFS->getExists(asset_id, atype);
LLVFile file(mVFS, asset_id, atype);
U32 size = exists ? file.getSize() : 0;
- if (size < 1)
+ if (size > 0)
+ {
+ // we've already got the file
+ // theoretically, partial files w/o a pending request shouldn't happen
+ // unless there's a weird error
+ if (callback)
+ {
+ callback(mVFS, asset_id, atype, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED);
+ }
+ }
+ else
{
if (exists)
{
@@ -671,16 +730,6 @@ void LLAssetStorage::getEstateAsset(const LLHost &object_sim, const LLUUID &agen
}
}
}
- else
- {
- // we've already got the file
- // theoretically, partial files w/o a pending request shouldn't happen
- // unless there's a weird error
- if (callback)
- {
- callback(mVFS, asset_id, atype, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED);
- }
- }
}
void LLAssetStorage::downloadEstateAssetCompleteCallback(
@@ -747,6 +796,12 @@ void LLAssetStorage::getInvItemAsset(const LLHost &object_sim, const LLUUID &age
if(asset_id.notNull())
{
+ // Try static VFS first.
+ if (findInStaticVFSAndInvokeCallback( asset_id, atype, callback, user_data))
+ {
+ return;
+ }
+
exists = mVFS->getExists(asset_id, atype);
LLVFile file(mVFS, asset_id, atype);
size = exists ? file.getSize() : 0;
@@ -758,7 +813,17 @@ void LLAssetStorage::getInvItemAsset(const LLHost &object_sim, const LLUUID &age
}
- if (size < 1)
+ if (size > 0)
+ {
+ // we've already got the file
+ // theoretically, partial files w/o a pending request shouldn't happen
+ // unless there's a weird error
+ if (callback)
+ {
+ callback(mVFS, asset_id, atype, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED);
+ }
+ }
+ else
{
// See whether we should talk to the object's originating sim,
// or the upstream provider.
@@ -807,16 +872,6 @@ void LLAssetStorage::getInvItemAsset(const LLHost &object_sim, const LLUUID &age
}
}
}
- else
- {
- // we've already got the file
- // theoretically, partial files w/o a pending request shouldn't happen
- // unless there's a weird error
- if (callback)
- {
- callback(mVFS, asset_id, atype, user_data, LL_ERR_NOERR, LL_EXSTAT_VFS_CACHED);
- }
- }
}
diff --git a/indra/llmessage/llassetstorage.h b/indra/llmessage/llassetstorage.h
index 83cfdf6110..e97b398ca7 100644
--- a/indra/llmessage/llassetstorage.h
+++ b/indra/llmessage/llassetstorage.h
@@ -218,6 +218,7 @@ class LLAssetStorage : public LLTempAssetStorage
public:
// VFS member is public because static child methods need it :(
LLVFS *mVFS;
+ LLVFS *mStaticVFS;
typedef void (*LLStoreAssetCallback)(const LLUUID &asset_id, void *user_data, S32 status, LLExtStat ext_status);
enum ERequestType
@@ -247,10 +248,10 @@ protected:
public:
LLAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,
- LLVFS *vfs, const LLHost &upstream_host);
+ LLVFS *vfs, LLVFS *static_vfs, const LLHost &upstream_host);
LLAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,
- LLVFS *vfs);
+ LLVFS *vfs, LLVFS *static_vfs);
virtual ~LLAssetStorage();
void setUpstream(const LLHost &upstream_host);
@@ -315,6 +316,9 @@ public:
void markAssetToxic( const LLUUID& uuid );
protected:
+ bool findInStaticVFSAndInvokeCallback(const LLUUID& uuid, LLAssetType::EType type,
+ LLGetAssetCallback callback, void *user_data);
+
virtual LLSD getPendingDetailsImpl(const request_list_t* requests,
LLAssetType::EType asset_type,
const std::string& detail_prefix) const;
@@ -442,6 +446,7 @@ private:
void _init(LLMessageSystem *msg,
LLXferManager *xfer,
LLVFS *vfs,
+ LLVFS *static_vfs,
const LLHost &upstream_host);
protected:
diff --git a/indra/llmessage/llcachename.cpp b/indra/llmessage/llcachename.cpp
index 9363b3a8d5..9871c922f1 100644
--- a/indra/llmessage/llcachename.cpp
+++ b/indra/llmessage/llcachename.cpp
@@ -486,7 +486,7 @@ BOOL LLCacheName::getName(const LLUUID& id, std::string& first, std::string& las
{
first = sCacheName["nobody"];
last.clear();
- return FALSE;
+ return TRUE;
}
LLCacheNameEntry* entry = get_ptr_in_map(impl.mCache, id );
@@ -530,7 +530,7 @@ BOOL LLCacheName::getGroupName(const LLUUID& id, std::string& group)
if(id.isNull())
{
group = sCacheName["none"];
- return FALSE;
+ return TRUE;
}
LLCacheNameEntry* entry = get_ptr_in_map(impl.mCache,id);
diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp
index 024e17a777..36874a5d48 100644
--- a/indra/llmessage/llcurl.cpp
+++ b/indra/llmessage/llcurl.cpp
@@ -89,10 +89,6 @@ S32 gCurlMultiCount = 0;
std::vector<LLMutex*> LLCurl::sSSLMutex;
std::string LLCurl::sCAPath;
std::string LLCurl::sCAFile;
-// Verify SSL certificates by default (matches libcurl default). The ability
-// to alter this flag is only to allow us to suppress verification if it's
-// broken for some reason.
-bool LLCurl::sSSLVerify = true;
//static
void LLCurl::setCAPath(const std::string& path)
@@ -107,18 +103,6 @@ void LLCurl::setCAFile(const std::string& file)
}
//static
-void LLCurl::setSSLVerify(bool verify)
-{
- sSSLVerify = verify;
-}
-
-//static
-bool LLCurl::getSSLVerify()
-{
- return sSSLVerify;
-}
-
-//static
std::string LLCurl::getVersionString()
{
return std::string(curl_version());
@@ -381,6 +365,13 @@ U32 LLCurl::Easy::report(CURLcode code)
responseReason = strerror(code) + " : " + mErrorBuffer;
}
+ if(responseCode >= 300 && responseCode < 400) //redirect
+ {
+ char new_url[512] ;
+ curl_easy_getinfo(mCurlEasyHandle, CURLINFO_REDIRECT_URL, new_url);
+ responseReason = new_url ; //get the new URL.
+ }
+
if (mResponder)
{
mResponder->completedRaw(responseCode, responseReason, mChannels, mOutput);
@@ -481,8 +472,7 @@ void LLCurl::Easy::prepRequest(const std::string& url,
setErrorBuffer();
setCA();
- setopt(CURLOPT_SSL_VERIFYPEER, LLCurl::getSSLVerify());
- setopt(CURLOPT_SSL_VERIFYHOST, LLCurl::getSSLVerify()? 2 : 0);
+ setopt(CURLOPT_SSL_VERIFYPEER, true);
setopt(CURLOPT_TIMEOUT, CURL_REQUEST_TIMEOUT);
setoptString(CURLOPT_URL, url);
@@ -912,6 +902,15 @@ void LLCurlEasyRequest::setReadCallback(curl_read_callback callback, void* userd
}
}
+void LLCurlEasyRequest::setSSLCtxCallback(curl_ssl_ctx_callback callback, void* userdata)
+{
+ if (mEasy)
+ {
+ mEasy->setopt(CURLOPT_SSL_CTX_FUNCTION, (void*)callback);
+ mEasy->setopt(CURLOPT_SSL_CTX_DATA, userdata);
+ }
+}
+
void LLCurlEasyRequest::slist_append(const char* str)
{
if (mEasy)
@@ -1061,3 +1060,4 @@ void LLCurl::cleanupClass()
#endif
curl_global_cleanup();
}
+
diff --git a/indra/llmessage/llcurl.h b/indra/llmessage/llcurl.h
index caf02cccd9..b6a637ae5b 100644
--- a/indra/llmessage/llcurl.h
+++ b/indra/llmessage/llcurl.h
@@ -158,16 +158,6 @@ public:
static const std::string& getCAPath() { return sCAPath; }
/**
- * @ brief Set flag controlling whether to verify HTTPS certs.
- */
- static void setSSLVerify(bool verify);
-
- /**
- * @ brief Get flag controlling whether to verify HTTPS certs.
- */
- static bool getSSLVerify();
-
- /**
* @ brief Initialize LLCurl class
*/
static void initClass();
@@ -192,7 +182,6 @@ public:
private:
static std::string sCAPath;
static std::string sCAFile;
- static bool sSSLVerify;
};
namespace boost
@@ -240,6 +229,7 @@ public:
void setHeaderCallback(curl_header_callback callback, void* userdata);
void setWriteCallback(curl_write_callback callback, void* userdata);
void setReadCallback(curl_read_callback callback, void* userdata);
+ void setSSLCtxCallback(curl_ssl_ctx_callback callback, void* userdata);
void slist_append(const char* str);
void sendRequest(const std::string& url);
void requestComplete();
diff --git a/indra/llmessage/llhttpassetstorage.cpp b/indra/llmessage/llhttpassetstorage.cpp
index 1980735bbb..fc326790eb 100644
--- a/indra/llmessage/llhttpassetstorage.cpp
+++ b/indra/llmessage/llhttpassetstorage.cpp
@@ -401,21 +401,23 @@ size_t LLHTTPAssetRequest::curlCompressedUploadCallback(
LLHTTPAssetStorage::LLHTTPAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,
- LLVFS *vfs, const LLHost &upstream_host,
+ LLVFS *vfs, LLVFS *static_vfs,
+ const LLHost &upstream_host,
const std::string& web_host,
const std::string& local_web_host,
const std::string& host_name)
- : LLAssetStorage(msg, xfer, vfs, upstream_host)
+ : LLAssetStorage(msg, xfer, vfs, static_vfs, upstream_host)
{
_init(web_host, local_web_host, host_name);
}
LLHTTPAssetStorage::LLHTTPAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,
LLVFS *vfs,
+ LLVFS *static_vfs,
const std::string& web_host,
const std::string& local_web_host,
const std::string& host_name)
- : LLAssetStorage(msg, xfer, vfs)
+ : LLAssetStorage(msg, xfer, vfs, static_vfs)
{
_init(web_host, local_web_host, host_name);
}
diff --git a/indra/llmessage/llhttpassetstorage.h b/indra/llmessage/llhttpassetstorage.h
index 231437dad4..3e85e898e2 100644
--- a/indra/llmessage/llhttpassetstorage.h
+++ b/indra/llmessage/llhttpassetstorage.h
@@ -48,13 +48,14 @@ class LLHTTPAssetStorage : public LLAssetStorage
{
public:
LLHTTPAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,
- LLVFS *vfs, const LLHost &upstream_host,
+ LLVFS *vfs, LLVFS *static_vfs,
+ const LLHost &upstream_host,
const std::string& web_host,
const std::string& local_web_host,
const std::string& host_name);
LLHTTPAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,
- LLVFS *vfs,
+ LLVFS *vfs, LLVFS *static_vfs,
const std::string& web_host,
const std::string& local_web_host,
const std::string& host_name);
diff --git a/indra/llmessage/llhttpclient.cpp b/indra/llmessage/llhttpclient.cpp
index dd56e18caf..e8dc207114 100644
--- a/indra/llmessage/llhttpclient.cpp
+++ b/indra/llmessage/llhttpclient.cpp
@@ -31,7 +31,7 @@
*/
#include "linden_common.h"
-
+#include <openssl/x509_vfy.h>
#include "llhttpclient.h"
#include "llassetstorage.h"
@@ -46,7 +46,10 @@
#include "message.h"
#include <curl/curl.h>
+
const F32 HTTP_REQUEST_EXPIRY_SECS = 60.0f;
+LLURLRequest::SSLCertVerifyCallback LLHTTPClient::mCertVerifyCallback = NULL;
+
////////////////////////////////////////////////////////////////////////////
// Responder class moved to LLCurl
@@ -79,8 +82,10 @@ namespace
{
if (mResponder.get())
{
- mResponder->completedRaw(mStatus, mReason, channels, buffer);
+ // Allow clients to parse headers before we attempt to parse
+ // the body and provide completed/result/error calls.
mResponder->completedHeader(mStatus, mReason, mHeaderOutput);
+ mResponder->completedRaw(mStatus, mReason, channels, buffer);
}
}
virtual void header(const std::string& header, const std::string& value)
@@ -194,6 +199,7 @@ namespace
fileBuffer = new U8 [fileSize];
vfile.read(fileBuffer, fileSize);
ostream.write((char*)fileBuffer, fileSize);
+ delete [] fileBuffer;
eos = true;
return STATUS_DONE;
}
@@ -206,13 +212,19 @@ namespace
LLPumpIO* theClientPump = NULL;
}
+void LLHTTPClient::setCertVerifyCallback(LLURLRequest::SSLCertVerifyCallback callback)
+{
+ LLHTTPClient::mCertVerifyCallback = callback;
+}
+
static void request(
const std::string& url,
LLURLRequest::ERequestAction method,
Injector* body_injector,
LLCurl::ResponderPtr responder,
const F32 timeout = HTTP_REQUEST_EXPIRY_SECS,
- const LLSD& headers = LLSD())
+ const LLSD& headers = LLSD()
+ )
{
if (!LLHTTPClient::hasPump())
{
@@ -222,7 +234,7 @@ static void request(
LLPumpIO::chain_t chain;
LLURLRequest* req = new LLURLRequest(method, url);
- req->checkRootCertificate(LLCurl::getSSLVerify());
+ req->setSSLVerifyCallback(LLHTTPClient::getCertVerifyCallback(), (void *)req);
lldebugs << LLURLRequest::actionAsVerb(method) << " " << url << " "
@@ -417,7 +429,6 @@ static LLSD blocking_request(
std::string body_str;
// other request method checks root cert first, we skip?
- //req->checkRootCertificate(true);
// * Set curl handle options
curl_easy_setopt(curlp, CURLOPT_NOSIGNAL, 1); // don't use SIGALRM for timeouts
diff --git a/indra/llmessage/llhttpclient.h b/indra/llmessage/llhttpclient.h
index 3d0646e5fe..8afbc9e0fc 100644
--- a/indra/llmessage/llhttpclient.h
+++ b/indra/llmessage/llhttpclient.h
@@ -40,7 +40,8 @@
#include <string>
#include <boost/intrusive_ptr.hpp>
-
+#include <openssl/x509_vfy.h>
+#include "llurlrequest.h"
#include "llassettype.h"
#include "llcurl.h"
#include "lliopipe.h"
@@ -61,6 +62,7 @@ public:
typedef LLCurl::Responder Responder;
typedef LLCurl::ResponderPtr ResponderPtr;
+
/** @name non-blocking API */
//@{
static void head(
@@ -155,7 +157,12 @@ public:
static void setPump(LLPumpIO& pump);
///< must be called before any of the above calls are made
static bool hasPump();
- ///< for testing
+
+ static void setCertVerifyCallback(LLURLRequest::SSLCertVerifyCallback callback);
+ static LLURLRequest::SSLCertVerifyCallback getCertVerifyCallback() { return mCertVerifyCallback; }
+
+protected:
+ static LLURLRequest::SSLCertVerifyCallback mCertVerifyCallback;
};
#endif // LL_LLHTTPCLIENT_H
diff --git a/indra/llmessage/llinstantmessage.cpp b/indra/llmessage/llinstantmessage.cpp
index a9e1ee77ef..57e8a22546 100644
--- a/indra/llmessage/llinstantmessage.cpp
+++ b/indra/llmessage/llinstantmessage.cpp
@@ -61,6 +61,7 @@ const char EMPTY_BINARY_BUCKET[] = "";
const S32 EMPTY_BINARY_BUCKET_SIZE = 1;
const U32 NO_TIMESTAMP = 0;
const std::string SYSTEM_FROM("Second Life");
+const std::string INTERACTIVE_SYSTEM_FROM("F387446C-37C4-45f2-A438-D99CBDBB563B");
const S32 IM_TTL = 1;
diff --git a/indra/llmessage/llinstantmessage.h b/indra/llmessage/llinstantmessage.h
index 272e753f3c..f11b649f78 100644
--- a/indra/llmessage/llinstantmessage.h
+++ b/indra/llmessage/llinstantmessage.h
@@ -226,6 +226,7 @@ extern const S32 EMPTY_BINARY_BUCKET_SIZE;
extern const U32 NO_TIMESTAMP;
extern const std::string SYSTEM_FROM;
+extern const std::string INTERACTIVE_SYSTEM_FROM;
// Number of retry attempts on sending the im.
extern const S32 IM_TTL;
diff --git a/indra/llmessage/lltemplatemessagebuilder.cpp b/indra/llmessage/lltemplatemessagebuilder.cpp
index 55379fc6fd..fa02456d90 100644
--- a/indra/llmessage/lltemplatemessagebuilder.cpp
+++ b/indra/llmessage/lltemplatemessagebuilder.cpp
@@ -326,7 +326,7 @@ void LLTemplateMessageBuilder::addData(const char *varname, const void *data, EM
<< "(" << size << "). Clamping size and truncating data." << llendl;
size = 255;
char *truncate = (char *)data;
- truncate[255] = 0;
+ truncate[254] = 0; // array size is 255 but the last element index is 254
}
// no correct size for MVT_VARIABLE, instead we need to tell how many bytes the size will be encoded as
diff --git a/indra/llmessage/lltemplatemessagereader.cpp b/indra/llmessage/lltemplatemessagereader.cpp
index 6682575ca5..8f56cf2521 100644
--- a/indra/llmessage/lltemplatemessagereader.cpp
+++ b/indra/llmessage/lltemplatemessagereader.cpp
@@ -433,10 +433,9 @@ inline void LLTemplateMessageReader::getString(const char *block, const char *va
inline void LLTemplateMessageReader::getString(const char *block, const char *var, std::string& outstr, S32 blocknum )
{
- char s[MTUBYTES];
- s[0] = '\0';
+ char s[MTUBYTES + 1]= {0}; // every element is initialized with 0
getData(block, var, s, 0, blocknum, MTUBYTES);
- s[MTUBYTES - 1] = '\0';
+ s[MTUBYTES] = '\0';
outstr = s;
}
diff --git a/indra/llmessage/lltransfersourceasset.cpp b/indra/llmessage/lltransfersourceasset.cpp
index 8f36d516d7..43f7c07e94 100644
--- a/indra/llmessage/lltransfersourceasset.cpp
+++ b/indra/llmessage/lltransfersourceasset.cpp
@@ -60,7 +60,7 @@ void LLTransferSourceAsset::initTransfer()
// to the simulator. This is subset of assets we allow to be
// simply pulled straight from the asset system.
LLUUID* tidp;
- if(is_asset_fetch_by_id_allowed(mParams.getAssetType()))
+ if(LLAssetType::lookupIsAssetFetchByIDAllowed(mParams.getAssetType()))
{
tidp = new LLUUID(getID());
gAssetStorage->getAssetData(
@@ -131,7 +131,7 @@ LLTSCode LLTransferSourceAsset::dataCallback(const S32 packet_id,
*data_handle = tmpp;
if (!vf.read(tmpp, max_bytes)) /* Flawfinder: Ignore */
{
- // Crap, read failure, need to deal with it.
+ // Read failure, need to deal with it.
delete[] tmpp;
*data_handle = NULL;
returned_bytes = 0;
@@ -257,50 +257,3 @@ BOOL LLTransferSourceParamsAsset::unpackParams(LLDataPacker &dp)
return TRUE;
}
-
-/**
- * Helper functions
- */
-bool is_asset_fetch_by_id_allowed(LLAssetType::EType type)
-{
- // *FIX: Make this list smaller.
- bool rv = false;
- switch(type)
- {
- case LLAssetType::AT_SOUND:
- case LLAssetType::AT_LANDMARK:
- case LLAssetType::AT_CLOTHING:
- case LLAssetType::AT_BODYPART:
- case LLAssetType::AT_ANIMATION:
- case LLAssetType::AT_GESTURE:
- rv = true;
- break;
- default:
- break;
- }
- return rv;
-}
-
-bool is_asset_id_knowable(LLAssetType::EType type)
-{
- // *FIX: Make this list smaller.
- bool rv = false;
- switch(type)
- {
- case LLAssetType::AT_TEXTURE:
- case LLAssetType::AT_SOUND:
- case LLAssetType::AT_LANDMARK:
- case LLAssetType::AT_CLOTHING:
- case LLAssetType::AT_NOTECARD:
- case LLAssetType::AT_BODYPART:
- case LLAssetType::AT_ANIMATION:
- case LLAssetType::AT_GESTURE:
- case LLAssetType::AT_LINK:
- case LLAssetType::AT_LINK_FOLDER:
- rv = true;
- break;
- default:
- break;
- }
- return rv;
-}
diff --git a/indra/llmessage/lltransfersourceasset.h b/indra/llmessage/lltransfersourceasset.h
index 70b09b6aaf..8616595654 100644
--- a/indra/llmessage/lltransfersourceasset.h
+++ b/indra/llmessage/lltransfersourceasset.h
@@ -84,24 +84,4 @@ protected:
S32 mCurPos;
};
-/**
- * @brief Quick check to see if the asset allows direct download.
- *
- * This might not be the right place for this function call, but it
- * originally started life inside the LLTransferSourceAsset code.
- * @param type The type of asset.
- * @return Returns true if the asset can be fetched by id.
- */
-bool is_asset_fetch_by_id_allowed(LLAssetType::EType type);
-
-/**
- * @brief Quick check to see if all asset data can be known by the viewer.
- *
- * This might not be the right place for this function call, but it
- * originally started life inside the LLTransferSourceAsset code.
- * @param type The type of asset.
- * @return Returns true if the asset id can be transmitted to the viewer.
- */
-bool is_asset_id_knowable(LLAssetType::EType type);
-
#endif // LL_LLTRANSFERSOURCEASSET_H
diff --git a/indra/llmessage/llurlrequest.cpp b/indra/llmessage/llurlrequest.cpp
index 4e7ceff984..1e76d10828 100644
--- a/indra/llmessage/llurlrequest.cpp
+++ b/indra/llmessage/llurlrequest.cpp
@@ -36,7 +36,8 @@
#include "llurlrequest.h"
#include <algorithm>
-
+#include <openssl/x509_vfy.h>
+#include <openssl/ssl.h>
#include "llcurl.h"
#include "llioutil.h"
#include "llmemtype.h"
@@ -56,6 +57,8 @@ const std::string CONTEXT_TRANSFERED_BYTES("transfered_bytes");
static size_t headerCallback(void* data, size_t size, size_t nmemb, void* user);
+
+
/**
* class LLURLRequestDetail
*/
@@ -72,6 +75,7 @@ public:
U32 mBodyLimit;
S32 mByteAccumulator;
bool mIsBodyLimitSet;
+ LLURLRequest::SSLCertVerifyCallback mSSLVerifyCallback;
};
LLURLRequestDetail::LLURLRequestDetail() :
@@ -80,7 +84,8 @@ LLURLRequestDetail::LLURLRequestDetail() :
mLastRead(NULL),
mBodyLimit(0),
mByteAccumulator(0),
- mIsBodyLimitSet(false)
+ mIsBodyLimitSet(false),
+ mSSLVerifyCallback(NULL)
{
LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
mCurlRequest = new LLCurlEasyRequest();
@@ -94,6 +99,36 @@ LLURLRequestDetail::~LLURLRequestDetail()
mLastRead = NULL;
}
+void LLURLRequest::setSSLVerifyCallback(SSLCertVerifyCallback callback, void *param)
+{
+ mDetail->mSSLVerifyCallback = callback;
+ mDetail->mCurlRequest->setSSLCtxCallback(LLURLRequest::_sslCtxCallback, (void *)this);
+ mDetail->mCurlRequest->setopt(CURLOPT_SSL_VERIFYPEER, true);
+ mDetail->mCurlRequest->setopt(CURLOPT_SSL_VERIFYHOST, 2);
+}
+
+
+// _sslCtxFunction
+// Callback function called when an SSL Context is created via CURL
+// used to configure the context for custom cert validation
+
+CURLcode LLURLRequest::_sslCtxCallback(CURL * curl, void *sslctx, void *param)
+{
+ LLURLRequest *req = (LLURLRequest *)param;
+ if(req == NULL || req->mDetail->mSSLVerifyCallback == NULL)
+ {
+ SSL_CTX_set_cert_verify_callback((SSL_CTX *)sslctx, NULL, NULL);
+ return CURLE_OK;
+ }
+ SSL_CTX * ctx = (SSL_CTX *) sslctx;
+ // disable any default verification for server certs
+ SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
+ // set the verification callback.
+ SSL_CTX_set_cert_verify_callback(ctx, req->mDetail->mSSLVerifyCallback, (void *)req);
+ // the calls are void
+ return CURLE_OK;
+
+}
/**
* class LLURLRequest
@@ -148,6 +183,11 @@ void LLURLRequest::setURL(const std::string& url)
mDetail->mURL = url;
}
+std::string LLURLRequest::getURL() const
+{
+ return mDetail->mURL;
+}
+
void LLURLRequest::addHeader(const char* header)
{
LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
@@ -160,13 +200,6 @@ void LLURLRequest::setBodyLimit(U32 size)
mDetail->mIsBodyLimitSet = true;
}
-void LLURLRequest::checkRootCertificate(bool check)
-{
- mDetail->mCurlRequest->setopt(CURLOPT_SSL_VERIFYPEER, (check? TRUE : FALSE));
- mDetail->mCurlRequest->setopt(CURLOPT_SSL_VERIFYHOST, (check? 2 : 0));
- mDetail->mCurlRequest->setoptString(CURLOPT_ENCODING, "");
-}
-
void LLURLRequest::setCallback(LLURLRequestComplete* callback)
{
LLMemType m1(LLMemType::MTYPE_IO_URL_REQUEST);
diff --git a/indra/llmessage/llurlrequest.h b/indra/llmessage/llurlrequest.h
index cb3c466440..69fd22e592 100644
--- a/indra/llmessage/llurlrequest.h
+++ b/indra/llmessage/llurlrequest.h
@@ -44,6 +44,8 @@
#include "lliopipe.h"
#include "llchainio.h"
#include "llerror.h"
+#include <openssl/x509_vfy.h>
+#include "llcurl.h"
extern const std::string CONTEXT_REQUEST;
@@ -72,6 +74,8 @@ class LLURLRequest : public LLIOPipe
{
LOG_CLASS(LLURLRequest);
public:
+
+ typedef int (* SSLCertVerifyCallback)(X509_STORE_CTX *ctx, void *param);
/**
* @brief This enumeration is for specifying the type of request.
*/
@@ -125,7 +129,7 @@ public:
*
*/
void setURL(const std::string& url);
-
+ std::string getURL() const;
/**
* @brief Add a header to the http post.
*
@@ -143,8 +147,9 @@ public:
* Set whether request will check that remote server
* certificates are signed by a known root CA when using HTTPS.
*/
- void checkRootCertificate(bool check);
+ void setSSLVerifyCallback(SSLCertVerifyCallback callback, void * param);
+
/**
* @brief Return at most size bytes of body.
*
@@ -189,6 +194,7 @@ public:
* @brief Give this pipe a chance to handle a generated error
*/
virtual EStatus handleError(EStatus status, LLPumpIO* pump);
+
protected:
/**
@@ -217,6 +223,8 @@ protected:
S32 mRequestTransferedBytes;
S32 mResponseTransferedBytes;
+ static CURLcode _sslCtxCallback(CURL * curl, void *sslctx, void *param);
+
private:
/**
* @brief Initialize the object. Called during construction.
@@ -364,62 +372,6 @@ protected:
};
-/**
- * @class LLURLRequestClientFactory
- * @brief Template class to build url request based client chains
- *
- * This class eases construction of a basic sd rpc client. Here is an
- * example of it's use:
- * <code>
- * class LLUsefulService : public LLService { ... }<br>
- * LLService::registerCreator(<br>
- * "useful",<br>
- * LLService::creator_t(new LLURLRequestClientFactory<LLUsefulService>))<br>
- * </code>
- *
- * This class should work, but I never got around to using/testing it.
- *
- */
-#if 0
-template<class Client>
-class LLURLRequestClientFactory : public LLChainIOFactory
-{
-public:
- LLURLRequestClientFactory(LLURLRequest::ERequestAction action) {}
- LLURLRequestClientFactory(
- LLURLRequest::ERequestAction action,
- const std::string& fixed_url) :
- mAction(action),
- mURL(fixed_url)
- {
- }
- virtual bool build(LLPumpIO::chain_t& chain, LLSD context) const
- {
- lldebugs << "LLURLRequestClientFactory::build" << llendl;
- LLIOPipe::ptr_t service(new Client);
- chain.push_back(service);
- LLURLRequest* http(new LLURLRequest(mAction));
- LLIOPipe::ptr_t http_pipe(http);
- // *FIX: how do we know the content type?
- //http->addHeader("Content-Type: text/llsd");
- if(mURL.empty())
- {
- chain.push_back(LLIOPipe::ptr_t(new LLContextURLExtractor(http)));
- }
- else
- {
- http->setURL(mURL);
- }
- chain.push_back(http_pipe);
- chain.push_back(service);
- return true;
- }
-
-protected:
- LLURLRequest::ERequestAction mAction;
- std::string mURL;
-};
-#endif
/**
* External constants
diff --git a/indra/llmessage/message_prehash.cpp b/indra/llmessage/message_prehash.cpp
index 9e3986f257..a118e21ffb 100644
--- a/indra/llmessage/message_prehash.cpp
+++ b/indra/llmessage/message_prehash.cpp
@@ -1147,7 +1147,7 @@ char* _PREHASH_ForceObjectSelect = LLMessageStringTable::getInstance()->getStrin
char* _PREHASH_Price = LLMessageStringTable::getInstance()->getString("Price");
char* _PREHASH_SunDirection = LLMessageStringTable::getInstance()->getString("SunDirection");
char* _PREHASH_FromName = LLMessageStringTable::getInstance()->getString("FromName");
-char* _PREHASH_ChangeInventoryItemFlags = LLMessageStringTable::getInstance()->getString("ChangeInventoryItemFlags");
+char* _PREHASH_ChangeInventoryItemFlags = LLMessageStringTable::getInstance()->getString("ChangLLInventoryItemFlags");
char* _PREHASH_Force = LLMessageStringTable::getInstance()->getString("Force");
char* _PREHASH_TransactionBlock = LLMessageStringTable::getInstance()->getString("TransactionBlock");
char* _PREHASH_PowersMask = LLMessageStringTable::getInstance()->getString("PowersMask");
diff --git a/indra/llmessage/tests/llareslistener_test.cpp b/indra/llmessage/tests/llareslistener_test.cpp
index ac4886ccf4..6ee74c8e7a 100644
--- a/indra/llmessage/tests/llareslistener_test.cpp
+++ b/indra/llmessage/tests/llareslistener_test.cpp
@@ -4,7 +4,7 @@
* @date 2009-02-26
* @brief Tests of llareslistener.h.
*
- * $LicenseInfo:firstyear=2009&license=internal$
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
* Copyright (c) 2009, Linden Research, Inc.
* $/LicenseInfo$
*/
diff --git a/indra/llplugin/CMakeLists.txt b/indra/llplugin/CMakeLists.txt
index 6706775d4f..441becbae0 100644
--- a/indra/llplugin/CMakeLists.txt
+++ b/indra/llplugin/CMakeLists.txt
@@ -3,6 +3,7 @@
project(llplugin)
include(00-Common)
+include(CURL)
include(LLCommon)
include(LLImage)
include(LLMath)
@@ -23,6 +24,7 @@ include_directories(
set(llplugin_SOURCE_FILES
llpluginclassmedia.cpp
+ llplugincookiestore.cpp
llplugininstance.cpp
llpluginmessage.cpp
llpluginmessagepipe.cpp
@@ -36,6 +38,7 @@ set(llplugin_HEADER_FILES
llpluginclassmedia.h
llpluginclassmediaowner.h
+ llplugincookiestore.h
llplugininstance.h
llpluginmessage.h
llpluginmessageclasses.h
@@ -53,3 +56,19 @@ list(APPEND llplugin_SOURCE_FILES ${llplugin_HEADER_FILES})
add_library (llplugin ${llplugin_SOURCE_FILES})
add_subdirectory(slplugin)
+
+# Add tests
+include(LLAddBuildTest)
+# UNIT TESTS
+SET(llplugin_TEST_SOURCE_FILES
+ llplugincookiestore.cpp
+ )
+
+# llplugincookiestore has a dependency on curl, so we need to link the curl library into the test.
+set_source_files_properties(
+ llplugincookiestore.cpp
+ PROPERTIES
+ LL_TEST_ADDITIONAL_LIBRARIES "${CURL_LIBRARIES}"
+ )
+
+LL_ADD_PROJECT_UNIT_TESTS(llplugin "${llplugin_TEST_SOURCE_FILES}")
diff --git a/indra/llplugin/llpluginclassmedia.cpp b/indra/llplugin/llpluginclassmedia.cpp
index 91c796a9e6..41ace62964 100644
--- a/indra/llplugin/llpluginclassmedia.cpp
+++ b/indra/llplugin/llpluginclassmedia.cpp
@@ -57,23 +57,31 @@ LLPluginClassMedia::LLPluginClassMedia(LLPluginClassMediaOwner *owner)
mOwner = owner;
mPlugin = NULL;
reset();
+
+ //debug use
+ mDeleteOK = true ;
}
LLPluginClassMedia::~LLPluginClassMedia()
{
+ llassert_always(mDeleteOK) ;
reset();
}
-bool LLPluginClassMedia::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path)
+bool LLPluginClassMedia::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug)
{
LL_DEBUGS("Plugin") << "launcher: " << launcher_filename << LL_ENDL;
LL_DEBUGS("Plugin") << "plugin: " << plugin_filename << LL_ENDL;
- LL_DEBUGS("Plugin") << "user_data_path: " << user_data_path << LL_ENDL;
mPlugin = new LLPluginProcessParent(this);
mPlugin->setSleepTime(mSleepTime);
- mPlugin->init(launcher_filename, plugin_filename, debug, user_data_path);
+
+ // Queue up the media init message -- it will be sent after all the currently queued messages.
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "init");
+ sendMessage(message);
+
+ mPlugin->init(launcher_filename, plugin_filename, debug);
return true;
}
@@ -156,7 +164,7 @@ void LLPluginClassMedia::idle(void)
mPlugin->idle();
}
- if((mMediaWidth == -1) || (!mTextureParamsReceived) || (mPlugin == NULL))
+ if((mMediaWidth == -1) || (!mTextureParamsReceived) || (mPlugin == NULL) || (mPlugin->isBlocked()))
{
// Can't process a size change at this time
}
@@ -433,6 +441,12 @@ void LLPluginClassMedia::mouseEvent(EMouseEventType type, int button, int x, int
{
if(type == MOUSE_EVENT_MOVE)
{
+ if(!mPlugin || !mPlugin->isRunning() || mPlugin->isBlocked())
+ {
+ // Don't queue up mouse move events that can't be delivered.
+ return;
+ }
+
if((x == mLastMouseX) && (y == mLastMouseY))
{
// Don't spam unnecessary mouse move events.
@@ -471,7 +485,7 @@ void LLPluginClassMedia::mouseEvent(EMouseEventType type, int button, int x, int
sendMessage(message);
}
-bool LLPluginClassMedia::keyEvent(EKeyEventType type, int key_code, MASK modifiers)
+bool LLPluginClassMedia::keyEvent(EKeyEventType type, int key_code, MASK modifiers, LLSD native_key_data)
{
bool result = true;
@@ -528,6 +542,7 @@ bool LLPluginClassMedia::keyEvent(EKeyEventType type, int key_code, MASK modifie
message.setValueS32("key", key_code);
message.setValue("modifiers", translateModifiers(modifiers));
+ message.setValueLLSD("native_key_data", native_key_data);
sendMessage(message);
}
@@ -546,12 +561,13 @@ void LLPluginClassMedia::scrollEvent(int x, int y, MASK modifiers)
sendMessage(message);
}
-bool LLPluginClassMedia::textInput(const std::string &text, MASK modifiers)
+bool LLPluginClassMedia::textInput(const std::string &text, MASK modifiers, LLSD native_key_data)
{
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "text_event");
message.setValue("text", text);
message.setValue("modifiers", translateModifiers(modifiers));
+ message.setValueLLSD("native_key_data", native_key_data);
sendMessage(message);
@@ -676,19 +692,47 @@ void LLPluginClassMedia::paste()
sendMessage(message);
}
+void LLPluginClassMedia::setUserDataPath(const std::string &user_data_path)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "set_user_data_path");
+ message.setValue("path", user_data_path);
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::setLanguageCode(const std::string &language_code)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "set_language_code");
+ message.setValue("language", language_code);
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::setPluginsEnabled(const bool enabled)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "plugins_enabled");
+ message.setValueBoolean("enable", enabled);
+ sendMessage(message);
+}
+
+void LLPluginClassMedia::setJavascriptEnabled(const bool enabled)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "javascript_enabled");
+ message.setValueBoolean("enable", enabled);
+ sendMessage(message);
+}
+
LLPluginClassMedia::ETargetType getTargetTypeFromLLQtWebkit(int target_type)
{
// convert a LinkTargetType value from llqtwebkit to an ETargetType
// so that we don't expose the llqtwebkit header in viewer code
switch (target_type)
{
- case LinkTargetType::LTT_TARGET_NONE:
+ case LLQtWebKit::LTT_TARGET_NONE:
return LLPluginClassMedia::TARGET_NONE;
- case LinkTargetType::LTT_TARGET_BLANK:
+ case LLQtWebKit::LTT_TARGET_BLANK:
return LLPluginClassMedia::TARGET_BLANK;
- case LinkTargetType::LTT_TARGET_EXTERNAL:
+ case LLQtWebKit::LTT_TARGET_EXTERNAL:
return LLPluginClassMedia::TARGET_EXTERNAL;
default:
@@ -959,6 +1003,13 @@ void LLPluginClassMedia::receivePluginMessage(const LLPluginMessage &message)
mClickTargetType = TARGET_NONE;
mediaEvent(LLPluginClassMediaOwner::MEDIA_EVENT_CLICK_LINK_NOFOLLOW);
}
+ else if(message_name == "cookie_set")
+ {
+ if(mOwner)
+ {
+ mOwner->handleCookieSet(this, message.getValue("cookie"));
+ }
+ }
else
{
LL_WARNS("Plugin") << "Unknown " << message_name << " class message: " << message_name << LL_ENDL;
@@ -1042,9 +1093,17 @@ void LLPluginClassMedia::clear_cookies()
sendMessage(message);
}
+void LLPluginClassMedia::set_cookies(const std::string &cookies)
+{
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "set_cookies");
+ message.setValue("cookies", cookies);
+ sendMessage(message);
+}
+
void LLPluginClassMedia::enable_cookies(bool enable)
{
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "enable_cookies");
+ message.setValueBoolean("enable", enable);
sendMessage(message);
}
diff --git a/indra/llplugin/llpluginclassmedia.h b/indra/llplugin/llpluginclassmedia.h
index ebb9099576..66853c9940 100644
--- a/indra/llplugin/llpluginclassmedia.h
+++ b/indra/llplugin/llpluginclassmedia.h
@@ -49,7 +49,9 @@ public:
virtual ~LLPluginClassMedia();
// local initialization, called by the media manager when creating a source
- virtual bool init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path);
+ virtual bool init(const std::string &launcher_filename,
+ const std::string &plugin_filename,
+ bool debug);
// undoes everything init() didm called by the media manager when destroying a source
virtual void reset();
@@ -114,12 +116,12 @@ public:
KEY_EVENT_REPEAT
}EKeyEventType;
- bool keyEvent(EKeyEventType type, int key_code, MASK modifiers);
+ bool keyEvent(EKeyEventType type, int key_code, MASK modifiers, LLSD native_key_data);
void scrollEvent(int x, int y, MASK modifiers);
// Text may be unicode (utf8 encoded)
- bool textInput(const std::string &text, MASK modifiers);
+ bool textInput(const std::string &text, MASK modifiers, LLSD native_key_data);
void loadURI(const std::string &uri);
@@ -173,6 +175,12 @@ public:
void paste();
bool canPaste() const { return mCanPaste; };
+
+ // These can be called before init(), and they will be queued and sent before the media init message.
+ void setUserDataPath(const std::string &user_data_path);
+ void setLanguageCode(const std::string &language_code);
+ void setPluginsEnabled(const bool enabled);
+ void setJavascriptEnabled(const bool enabled);
///////////////////////////////////
// media browser class functions
@@ -181,6 +189,7 @@ public:
void focus(bool focused);
void clear_cache();
void clear_cookies();
+ void set_cookies(const std::string &cookies);
void enable_cookies(bool enable);
void proxy_setup(bool enable, const std::string &host = LLStringUtil::null, int port = 0);
void browse_stop();
@@ -364,6 +373,14 @@ protected:
F64 mCurrentRate;
F64 mLoadedDuration;
+//--------------------------------------
+ //debug use only
+ //
+private:
+ bool mDeleteOK ;
+public:
+ void setDeleteOK(bool flag) { mDeleteOK = flag ;}
+//--------------------------------------
};
#endif // LL_LLPLUGINCLASSMEDIA_H
diff --git a/indra/llplugin/llpluginclassmediaowner.h b/indra/llplugin/llpluginclassmediaowner.h
index 6d369cd51a..5669b81fd1 100644
--- a/indra/llplugin/llpluginclassmediaowner.h
+++ b/indra/llplugin/llpluginclassmediaowner.h
@@ -39,6 +39,7 @@
#include <queue>
class LLPluginClassMedia;
+class LLPluginCookieStore;
class LLPluginClassMediaOwner
{
@@ -78,6 +79,7 @@ public:
virtual ~LLPluginClassMediaOwner() {};
virtual void handleMediaEvent(LLPluginClassMedia* /*self*/, EMediaEvent /*event*/) {};
+ virtual void handleCookieSet(LLPluginClassMedia* /*self*/, const std::string &/*cookie*/) {};
};
#endif // LL_LLPLUGINCLASSMEDIAOWNER_H
diff --git a/indra/llplugin/llplugincookiestore.cpp b/indra/llplugin/llplugincookiestore.cpp
new file mode 100644
index 0000000000..da770c5f2e
--- /dev/null
+++ b/indra/llplugin/llplugincookiestore.cpp
@@ -0,0 +1,669 @@
+/**
+ * @file llplugincookiestore.cpp
+ * @brief LLPluginCookieStore provides central storage for http cookies used by plugins
+ *
+ * @cond
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlife.com/developers/opensource/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlife.com/developers/opensource/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ * @endcond
+ */
+
+#include "linden_common.h"
+#include "indra_constants.h"
+
+#include "llplugincookiestore.h"
+#include <iostream>
+
+// for curl_getdate() (apparently parsing RFC 1123 dates is hard)
+#include <curl/curl.h>
+
+LLPluginCookieStore::LLPluginCookieStore():
+ mHasChangedCookies(false)
+{
+}
+
+
+LLPluginCookieStore::~LLPluginCookieStore()
+{
+ clearCookies();
+}
+
+
+LLPluginCookieStore::Cookie::Cookie(const std::string &s, std::string::size_type cookie_start, std::string::size_type cookie_end):
+ mCookie(s, cookie_start, cookie_end - cookie_start),
+ mNameStart(0), mNameEnd(0),
+ mValueStart(0), mValueEnd(0),
+ mDomainStart(0), mDomainEnd(0),
+ mPathStart(0), mPathEnd(0),
+ mDead(false), mChanged(true)
+{
+}
+
+LLPluginCookieStore::Cookie *LLPluginCookieStore::Cookie::createFromString(const std::string &s, std::string::size_type cookie_start, std::string::size_type cookie_end, const std::string &host)
+{
+ Cookie *result = new Cookie(s, cookie_start, cookie_end);
+
+ if(!result->parse(host))
+ {
+ delete result;
+ result = NULL;
+ }
+
+ return result;
+}
+
+std::string LLPluginCookieStore::Cookie::getKey() const
+{
+ std::string result;
+ if(mDomainEnd > mDomainStart)
+ {
+ result += mCookie.substr(mDomainStart, mDomainEnd - mDomainStart);
+ }
+ result += ';';
+ if(mPathEnd > mPathStart)
+ {
+ result += mCookie.substr(mPathStart, mPathEnd - mPathStart);
+ }
+ result += ';';
+ result += mCookie.substr(mNameStart, mNameEnd - mNameStart);
+ return result;
+}
+
+bool LLPluginCookieStore::Cookie::parse(const std::string &host)
+{
+ bool first_field = true;
+
+ std::string::size_type cookie_end = mCookie.size();
+ std::string::size_type field_start = 0;
+
+ LL_DEBUGS("CookieStoreParse") << "parsing cookie: " << mCookie << LL_ENDL;
+ while(field_start < cookie_end)
+ {
+ // Finding the start of the next field requires honoring special quoting rules
+ // see the definition of 'quoted-string' in rfc2616 for details
+ std::string::size_type next_field_start = findFieldEnd(field_start);
+
+ // The end of this field should not include the terminating ';' or any trailing whitespace
+ std::string::size_type field_end = mCookie.find_last_not_of("; ", next_field_start);
+ if(field_end == std::string::npos || field_end < field_start)
+ {
+ // This field was empty or all whitespace. Set end = start so it shows as empty.
+ field_end = field_start;
+ }
+ else if (field_end < next_field_start)
+ {
+ // we actually want the index of the char _after_ what 'last not of' found
+ ++field_end;
+ }
+
+ // find the start of the actual name (skip separator and possible whitespace)
+ std::string::size_type name_start = mCookie.find_first_not_of("; ", field_start);
+ if(name_start == std::string::npos || name_start > next_field_start)
+ {
+ // Again, nothing but whitespace.
+ name_start = field_start;
+ }
+
+ // the name and value are separated by the first equals sign
+ std::string::size_type name_value_sep = mCookie.find_first_of("=", name_start);
+ if(name_value_sep == std::string::npos || name_value_sep > field_end)
+ {
+ // No separator found, so this is a field without an =
+ name_value_sep = field_end;
+ }
+
+ // the name end is before the name-value separator
+ std::string::size_type name_end = mCookie.find_last_not_of("= ", name_value_sep);
+ if(name_end == std::string::npos || name_end < name_start)
+ {
+ // I'm not sure how we'd hit this case... it seems like it would have to be an empty name.
+ name_end = name_start;
+ }
+ else if (name_end < name_value_sep)
+ {
+ // we actually want the index of the char _after_ what 'last not of' found
+ ++name_end;
+ }
+
+ // Value is between the name-value sep and the end of the field.
+ std::string::size_type value_start = mCookie.find_first_not_of("= ", name_value_sep);
+ if(value_start == std::string::npos || value_start > field_end)
+ {
+ // All whitespace or empty value
+ value_start = field_end;
+ }
+ std::string::size_type value_end = mCookie.find_last_not_of("; ", field_end);
+ if(value_end == std::string::npos || value_end < value_start)
+ {
+ // All whitespace or empty value
+ value_end = value_start;
+ }
+ else if (value_end < field_end)
+ {
+ // we actually want the index of the char _after_ what 'last not of' found
+ ++value_end;
+ }
+
+ LL_DEBUGS("CookieStoreParse")
+ << " field name: \"" << mCookie.substr(name_start, name_end - name_start)
+ << "\", value: \"" << mCookie.substr(value_start, value_end - value_start) << "\""
+ << LL_ENDL;
+
+ // See whether this field is one we know
+ if(first_field)
+ {
+ // The first field is the name=value pair
+ mNameStart = name_start;
+ mNameEnd = name_end;
+ mValueStart = value_start;
+ mValueEnd = value_end;
+ first_field = false;
+ }
+ else
+ {
+ // Subsequent fields must come from the set in rfc2109
+ if(matchName(name_start, name_end, "expires"))
+ {
+ std::string date_string(mCookie, value_start, value_end - value_start);
+ // If the cookie contains an "expires" field, it MUST contain a parsable date.
+
+ // HACK: LLDate apparently can't PARSE an rfc1123-format date, even though it can GENERATE one.
+ // The curl function curl_getdate can do this, but I'm hesitant to unilaterally introduce a curl dependency in LLDate.
+#if 1
+ time_t date = curl_getdate(date_string.c_str(), NULL );
+ mDate.secondsSinceEpoch((F64)date);
+ LL_DEBUGS("CookieStoreParse") << " expire date parsed to: " << mDate.asRFC1123() << LL_ENDL;
+#else
+ // This doesn't work (rfc1123-format dates cause it to fail)
+ if(!mDate.fromString(date_string))
+ {
+ // Date failed to parse.
+ LL_WARNS("CookieStoreParse") << "failed to parse cookie's expire date: " << date << LL_ENDL;
+ return false;
+ }
+#endif
+ }
+ else if(matchName(name_start, name_end, "domain"))
+ {
+ mDomainStart = value_start;
+ mDomainEnd = value_end;
+ }
+ else if(matchName(name_start, name_end, "path"))
+ {
+ mPathStart = value_start;
+ mPathEnd = value_end;
+ }
+ else if(matchName(name_start, name_end, "max-age"))
+ {
+ // TODO: how should we handle this?
+ }
+ else if(matchName(name_start, name_end, "secure"))
+ {
+ // We don't care about the value of this field (yet)
+ }
+ else if(matchName(name_start, name_end, "version"))
+ {
+ // We don't care about the value of this field (yet)
+ }
+ else if(matchName(name_start, name_end, "comment"))
+ {
+ // We don't care about the value of this field (yet)
+ }
+ else if(matchName(name_start, name_end, "httponly"))
+ {
+ // We don't care about the value of this field (yet)
+ }
+ else
+ {
+ // An unknown field is a parse failure
+ LL_WARNS("CookieStoreParse") << "unexpected field name: " << mCookie.substr(name_start, name_end - name_start) << LL_ENDL;
+ return false;
+ }
+
+ }
+
+
+ // move on to the next field, skipping this field's separator and any leading whitespace
+ field_start = mCookie.find_first_not_of("; ", next_field_start);
+ }
+
+ // The cookie MUST have a name
+ if(mNameEnd <= mNameStart)
+ return false;
+
+ // If the cookie doesn't have a domain, add the current host as the domain.
+ if(mDomainEnd <= mDomainStart)
+ {
+ if(host.empty())
+ {
+ // no domain and no current host -- this is a parse failure.
+ return false;
+ }
+
+ // Figure out whether this cookie ended with a ";" or not...
+ std::string::size_type last_char = mCookie.find_last_not_of(" ");
+ if((last_char != std::string::npos) && (mCookie[last_char] != ';'))
+ {
+ mCookie += ";";
+ }
+
+ mCookie += " domain=";
+ mDomainStart = mCookie.size();
+ mCookie += host;
+ mDomainEnd = mCookie.size();
+
+ LL_DEBUGS("CookieStoreParse") << "added domain (" << mDomainStart << " to " << mDomainEnd << "), new cookie is: " << mCookie << LL_ENDL;
+ }
+
+ // If the cookie doesn't have a path, add "/".
+ if(mPathEnd <= mPathStart)
+ {
+ // Figure out whether this cookie ended with a ";" or not...
+ std::string::size_type last_char = mCookie.find_last_not_of(" ");
+ if((last_char != std::string::npos) && (mCookie[last_char] != ';'))
+ {
+ mCookie += ";";
+ }
+
+ mCookie += " path=";
+ mPathStart = mCookie.size();
+ mCookie += "/";
+ mPathEnd = mCookie.size();
+
+ LL_DEBUGS("CookieStoreParse") << "added path (" << mPathStart << " to " << mPathEnd << "), new cookie is: " << mCookie << LL_ENDL;
+ }
+
+
+ return true;
+}
+
+std::string::size_type LLPluginCookieStore::Cookie::findFieldEnd(std::string::size_type start, std::string::size_type end)
+{
+ std::string::size_type result = start;
+
+ if(end == std::string::npos)
+ end = mCookie.size();
+
+ bool in_quotes = false;
+ for(; (result < end); result++)
+ {
+ switch(mCookie[result])
+ {
+ case '\\':
+ if(in_quotes)
+ result++; // The next character is backslash-quoted. Skip over it.
+ break;
+ case '"':
+ in_quotes = !in_quotes;
+ break;
+ case ';':
+ if(!in_quotes)
+ return result;
+ break;
+ }
+ }
+
+ // If we got here, no ';' was found.
+ return end;
+}
+
+bool LLPluginCookieStore::Cookie::matchName(std::string::size_type start, std::string::size_type end, const char *name)
+{
+ // NOTE: this assumes 'name' is already in lowercase. The code which uses it should be able to arrange this...
+
+ while((start < end) && (*name != '\0'))
+ {
+ if(tolower(mCookie[start]) != *name)
+ return false;
+
+ start++;
+ name++;
+ }
+
+ // iff both strings hit the end at the same time, they're equal.
+ return ((start == end) && (*name == '\0'));
+}
+
+std::string LLPluginCookieStore::getAllCookies()
+{
+ std::stringstream result;
+ writeAllCookies(result);
+ return result.str();
+}
+
+void LLPluginCookieStore::writeAllCookies(std::ostream& s)
+{
+ cookie_map_t::iterator iter;
+ for(iter = mCookies.begin(); iter != mCookies.end(); iter++)
+ {
+ // Don't return expired cookies
+ if(!iter->second->isDead())
+ {
+ s << (iter->second->getCookie()) << "\n";
+ }
+ }
+
+}
+
+std::string LLPluginCookieStore::getPersistentCookies()
+{
+ std::stringstream result;
+ writePersistentCookies(result);
+ return result.str();
+}
+
+void LLPluginCookieStore::writePersistentCookies(std::ostream& s)
+{
+ cookie_map_t::iterator iter;
+ for(iter = mCookies.begin(); iter != mCookies.end(); iter++)
+ {
+ // Don't return expired cookies or session cookies
+ if(!iter->second->isDead() && !iter->second->isSessionCookie())
+ {
+ s << iter->second->getCookie() << "\n";
+ }
+ }
+}
+
+std::string LLPluginCookieStore::getChangedCookies(bool clear_changed)
+{
+ std::stringstream result;
+ writeChangedCookies(result, clear_changed);
+
+ return result.str();
+}
+
+void LLPluginCookieStore::writeChangedCookies(std::ostream& s, bool clear_changed)
+{
+ if(mHasChangedCookies)
+ {
+ lldebugs << "returning changed cookies: " << llendl;
+ cookie_map_t::iterator iter;
+ for(iter = mCookies.begin(); iter != mCookies.end(); )
+ {
+ cookie_map_t::iterator next = iter;
+ next++;
+
+ // Only return cookies marked as "changed"
+ if(iter->second->isChanged())
+ {
+ s << iter->second->getCookie() << "\n";
+
+ lldebugs << " " << iter->second->getCookie() << llendl;
+
+ // If requested, clear the changed mark
+ if(clear_changed)
+ {
+ if(iter->second->isDead())
+ {
+ // If this cookie was previously marked dead, it needs to be removed entirely.
+ delete iter->second;
+ mCookies.erase(iter);
+ }
+ else
+ {
+ // Not dead, just mark as not changed.
+ iter->second->setChanged(false);
+ }
+ }
+ }
+
+ iter = next;
+ }
+ }
+
+ if(clear_changed)
+ mHasChangedCookies = false;
+}
+
+void LLPluginCookieStore::setAllCookies(const std::string &cookies, bool mark_changed)
+{
+ clearCookies();
+ setCookies(cookies, mark_changed);
+}
+
+void LLPluginCookieStore::readAllCookies(std::istream& s, bool mark_changed)
+{
+ clearCookies();
+ readCookies(s, mark_changed);
+}
+
+void LLPluginCookieStore::setCookies(const std::string &cookies, bool mark_changed)
+{
+ std::string::size_type start = 0;
+
+ while(start != std::string::npos)
+ {
+ std::string::size_type end = cookies.find_first_of("\r\n", start);
+ if(end > start)
+ {
+ // The line is non-empty. Try to create a cookie from it.
+ setOneCookie(cookies, start, end, mark_changed);
+ }
+ start = cookies.find_first_not_of("\r\n ", end);
+ }
+}
+
+void LLPluginCookieStore::setCookiesFromHost(const std::string &cookies, const std::string &host, bool mark_changed)
+{
+ std::string::size_type start = 0;
+
+ while(start != std::string::npos)
+ {
+ std::string::size_type end = cookies.find_first_of("\r\n", start);
+ if(end > start)
+ {
+ // The line is non-empty. Try to create a cookie from it.
+ setOneCookie(cookies, start, end, mark_changed, host);
+ }
+ start = cookies.find_first_not_of("\r\n ", end);
+ }
+}
+
+void LLPluginCookieStore::readCookies(std::istream& s, bool mark_changed)
+{
+ std::string line;
+ while(s.good() && !s.eof())
+ {
+ std::getline(s, line);
+ if(!line.empty())
+ {
+ // Try to create a cookie from this line.
+ setOneCookie(line, 0, std::string::npos, mark_changed);
+ }
+ }
+}
+
+std::string LLPluginCookieStore::quoteString(const std::string &s)
+{
+ std::stringstream result;
+
+ result << '"';
+
+ for(std::string::size_type i = 0; i < s.size(); ++i)
+ {
+ char c = s[i];
+ switch(c)
+ {
+ // All these separators need to be quoted in HTTP headers, according to section 2.2 of rfc 2616:
+ case '(': case ')': case '<': case '>': case '@':
+ case ',': case ';': case ':': case '\\': case '"':
+ case '/': case '[': case ']': case '?': case '=':
+ case '{': case '}': case ' ': case '\t':
+ result << '\\';
+ break;
+ }
+
+ result << c;
+ }
+
+ result << '"';
+
+ return result.str();
+}
+
+std::string LLPluginCookieStore::unquoteString(const std::string &s)
+{
+ std::stringstream result;
+
+ bool in_quotes = false;
+
+ for(std::string::size_type i = 0; i < s.size(); ++i)
+ {
+ char c = s[i];
+ switch(c)
+ {
+ case '\\':
+ if(in_quotes)
+ {
+ // The next character is backslash-quoted. Pass it through untouched.
+ ++i;
+ if(i < s.size())
+ {
+ result << s[i];
+ }
+ continue;
+ }
+ break;
+ case '"':
+ in_quotes = !in_quotes;
+ continue;
+ break;
+ }
+
+ result << c;
+ }
+
+ return result.str();
+}
+
+// The flow for deleting a cookie is non-obvious enough that I should call it out here...
+// Deleting a cookie is done by setting a cookie with the same name, path, and domain, but with an expire timestamp in the past.
+// (This is exactly how a web server tells a browser to delete a cookie.)
+// When deleting with mark_changed set to true, this replaces the existing cookie in the list with an entry that's marked both dead and changed.
+// Some time later when writeChangedCookies() is called with clear_changed set to true, the dead cookie is deleted from the list after being returned, so that the
+// delete operation (in the form of the expired cookie) is passed along.
+void LLPluginCookieStore::setOneCookie(const std::string &s, std::string::size_type cookie_start, std::string::size_type cookie_end, bool mark_changed, const std::string &host)
+{
+ Cookie *cookie = Cookie::createFromString(s, cookie_start, cookie_end, host);
+ if(cookie)
+ {
+ LL_DEBUGS("CookieStoreUpdate") << "setting cookie: " << cookie->getCookie() << LL_ENDL;
+
+ // Create a key for this cookie
+ std::string key = cookie->getKey();
+
+ // Check to see whether this cookie should have expired
+ if(!cookie->isSessionCookie() && (cookie->getDate() < LLDate::now()))
+ {
+ // This cookie has expired.
+ if(mark_changed)
+ {
+ // If we're marking cookies as changed, we should keep it anyway since we'll need to send it out with deltas.
+ cookie->setDead(true);
+ LL_DEBUGS("CookieStoreUpdate") << " marking dead" << LL_ENDL;
+ }
+ else
+ {
+ // If we're not marking cookies as changed, we don't need to keep this cookie at all.
+ // If the cookie was already in the list, delete it.
+ removeCookie(key);
+
+ delete cookie;
+ cookie = NULL;
+
+ LL_DEBUGS("CookieStoreUpdate") << " removing" << LL_ENDL;
+ }
+ }
+
+ if(cookie)
+ {
+ // If it already exists in the map, replace it.
+ cookie_map_t::iterator iter = mCookies.find(key);
+ if(iter != mCookies.end())
+ {
+ if(iter->second->getCookie() == cookie->getCookie())
+ {
+ // The new cookie is identical to the old -- don't mark as changed.
+ // Just leave the old one in the map.
+ delete cookie;
+ cookie = NULL;
+
+ LL_DEBUGS("CookieStoreUpdate") << " unchanged" << LL_ENDL;
+ }
+ else
+ {
+ // A matching cookie was already in the map. Replace it.
+ delete iter->second;
+ iter->second = cookie;
+
+ cookie->setChanged(mark_changed);
+ if(mark_changed)
+ mHasChangedCookies = true;
+
+ LL_DEBUGS("CookieStoreUpdate") << " replacing" << LL_ENDL;
+ }
+ }
+ else
+ {
+ // The cookie wasn't in the map. Insert it.
+ mCookies.insert(std::make_pair(key, cookie));
+
+ cookie->setChanged(mark_changed);
+ if(mark_changed)
+ mHasChangedCookies = true;
+
+ LL_DEBUGS("CookieStoreUpdate") << " adding" << LL_ENDL;
+ }
+ }
+ }
+ else
+ {
+ LL_WARNS("CookieStoreUpdate") << "failed to parse cookie: " << s.substr(cookie_start, cookie_end - cookie_start) << LL_ENDL;
+ }
+
+}
+
+void LLPluginCookieStore::clearCookies()
+{
+ while(!mCookies.empty())
+ {
+ cookie_map_t::iterator iter = mCookies.begin();
+ delete iter->second;
+ mCookies.erase(iter);
+ }
+}
+
+void LLPluginCookieStore::removeCookie(const std::string &key)
+{
+ cookie_map_t::iterator iter = mCookies.find(key);
+ if(iter != mCookies.end())
+ {
+ delete iter->second;
+ mCookies.erase(iter);
+ }
+}
+
diff --git a/indra/llplugin/llplugincookiestore.h b/indra/llplugin/llplugincookiestore.h
new file mode 100644
index 0000000000..a93f0c14f0
--- /dev/null
+++ b/indra/llplugin/llplugincookiestore.h
@@ -0,0 +1,125 @@
+/**
+ * @file llplugincookiestore.h
+ * @brief LLPluginCookieStore provides central storage for http cookies used by plugins
+ *
+ * @cond
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlife.com/developers/opensource/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlife.com/developers/opensource/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ * @endcond
+ */
+
+#ifndef LL_LLPLUGINCOOKIESTORE_H
+#define LL_LLPLUGINCOOKIESTORE_H
+
+#include "lldate.h"
+#include <map>
+#include <string>
+#include <iostream>
+
+class LLPluginCookieStore
+{
+ LOG_CLASS(LLPluginCookieStore);
+public:
+ LLPluginCookieStore();
+ ~LLPluginCookieStore();
+
+ // gets all cookies currently in storage -- use when initializing a plugin
+ std::string getAllCookies();
+ void writeAllCookies(std::ostream& s);
+
+ // gets only persistent cookies (i.e. not session cookies) -- use when writing cookies to a file
+ std::string getPersistentCookies();
+ void writePersistentCookies(std::ostream& s);
+
+ // gets cookies which are marked as "changed" -- use when sending periodic updates to plugins
+ std::string getChangedCookies(bool clear_changed = true);
+ void writeChangedCookies(std::ostream& s, bool clear_changed = true);
+
+ // (re)initializes internal data structures and bulk-sets cookies -- use when reading cookies from a file
+ void setAllCookies(const std::string &cookies, bool mark_changed = false);
+ void readAllCookies(std::istream& s, bool mark_changed = false);
+
+ // sets one or more cookies (without reinitializing anything) -- use when receiving cookies from a plugin
+ void setCookies(const std::string &cookies, bool mark_changed = true);
+ void readCookies(std::istream& s, bool mark_changed = true);
+
+ // sets one or more cookies (without reinitializing anything), supplying a hostname the cookies came from -- use when setting a cookie manually
+ void setCookiesFromHost(const std::string &cookies, const std::string &host, bool mark_changed = true);
+
+ // quote or unquote a string as per the definition of 'quoted-string' in rfc2616
+ static std::string quoteString(const std::string &s);
+ static std::string unquoteString(const std::string &s);
+
+private:
+
+ void setOneCookie(const std::string &s, std::string::size_type cookie_start, std::string::size_type cookie_end, bool mark_changed, const std::string &host = LLStringUtil::null);
+
+ class Cookie
+ {
+ public:
+ static Cookie *createFromString(const std::string &s, std::string::size_type cookie_start = 0, std::string::size_type cookie_end = std::string::npos, const std::string &host = LLStringUtil::null);
+
+ // Construct a string from the cookie that uniquely represents it, to be used as a key in a std::map.
+ std::string getKey() const;
+
+ const std::string &getCookie() const { return mCookie; };
+ bool isSessionCookie() const { return mDate.isNull(); };
+
+ bool isDead() const { return mDead; };
+ void setDead(bool dead) { mDead = dead; };
+
+ bool isChanged() const { return mChanged; };
+ void setChanged(bool changed) { mChanged = changed; };
+
+ const LLDate &getDate() const { return mDate; };
+
+ private:
+ Cookie(const std::string &s, std::string::size_type cookie_start = 0, std::string::size_type cookie_end = std::string::npos);
+ bool parse(const std::string &host);
+ std::string::size_type findFieldEnd(std::string::size_type start = 0, std::string::size_type end = std::string::npos);
+ bool matchName(std::string::size_type start, std::string::size_type end, const char *name);
+
+ std::string mCookie; // The full cookie, in RFC 2109 string format
+ LLDate mDate; // The expiration date of the cookie. For session cookies, this will be a null date (mDate.isNull() is true).
+ // Start/end indices of various parts of the cookie string. Stored as indices into the string to save space and time.
+ std::string::size_type mNameStart, mNameEnd;
+ std::string::size_type mValueStart, mValueEnd;
+ std::string::size_type mDomainStart, mDomainEnd;
+ std::string::size_type mPathStart, mPathEnd;
+ bool mDead;
+ bool mChanged;
+ };
+
+ typedef std::map<std::string, Cookie*> cookie_map_t;
+
+ cookie_map_t mCookies;
+ bool mHasChangedCookies;
+
+ void clearCookies();
+ void removeCookie(const std::string &key);
+};
+
+#endif // LL_LLPLUGINCOOKIESTORE_H
diff --git a/indra/llplugin/llpluginmessagepipe.cpp b/indra/llplugin/llpluginmessagepipe.cpp
index cc193fca42..89f8b44569 100644
--- a/indra/llplugin/llpluginmessagepipe.cpp
+++ b/indra/llplugin/llpluginmessagepipe.cpp
@@ -96,11 +96,14 @@ void LLPluginMessagePipeOwner::killMessagePipe(void)
}
}
-LLPluginMessagePipe::LLPluginMessagePipe(LLPluginMessagePipeOwner *owner, LLSocket::ptr_t socket)
+LLPluginMessagePipe::LLPluginMessagePipe(LLPluginMessagePipeOwner *owner, LLSocket::ptr_t socket):
+ mInputMutex(gAPRPoolp),
+ mOutputMutex(gAPRPoolp),
+ mOwner(owner),
+ mSocket(socket)
{
- mOwner = owner;
+
mOwner->setMessagePipe(this);
- mSocket = socket;
}
LLPluginMessagePipe::~LLPluginMessagePipe()
@@ -114,6 +117,7 @@ LLPluginMessagePipe::~LLPluginMessagePipe()
bool LLPluginMessagePipe::addMessage(const std::string &message)
{
// queue the message for later output
+ LLMutexLock lock(&mOutputMutex);
mOutput += message;
mOutput += MESSAGE_DELIMITER; // message separator
@@ -149,6 +153,18 @@ void LLPluginMessagePipe::setSocketTimeout(apr_interval_time_t timeout_usec)
bool LLPluginMessagePipe::pump(F64 timeout)
{
+ bool result = pumpOutput();
+
+ if(result)
+ {
+ result = pumpInput(timeout);
+ }
+
+ return result;
+}
+
+bool LLPluginMessagePipe::pumpOutput()
+{
bool result = true;
if(mSocket)
@@ -156,6 +172,7 @@ bool LLPluginMessagePipe::pump(F64 timeout)
apr_status_t status;
apr_size_t size;
+ LLMutexLock lock(&mOutputMutex);
if(!mOutput.empty())
{
// write any outgoing messages
@@ -183,6 +200,17 @@ bool LLPluginMessagePipe::pump(F64 timeout)
// remove the written part from the buffer and try again later.
mOutput = mOutput.substr(size);
}
+ else if(APR_STATUS_IS_EOF(status))
+ {
+ // This is what we normally expect when a plugin exits.
+ llinfos << "Got EOF from plugin socket. " << llendl;
+
+ if(mOwner)
+ {
+ mOwner->socketError(status);
+ }
+ result = false;
+ }
else
{
// some other error
@@ -196,6 +224,19 @@ bool LLPluginMessagePipe::pump(F64 timeout)
result = false;
}
}
+ }
+
+ return result;
+}
+
+bool LLPluginMessagePipe::pumpInput(F64 timeout)
+{
+ bool result = true;
+
+ if(mSocket)
+ {
+ apr_status_t status;
+ apr_size_t size;
// FIXME: For some reason, the apr timeout stuff isn't working properly on windows.
// Until such time as we figure out why, don't try to use the socket timeout -- just sleep here instead.
@@ -216,8 +257,16 @@ bool LLPluginMessagePipe::pump(F64 timeout)
char input_buf[1024];
apr_size_t request_size;
- // Start out by reading one byte, so that any data received will wake us up.
- request_size = 1;
+ if(timeout == 0.0f)
+ {
+ // If we have no timeout, start out with a full read.
+ request_size = sizeof(input_buf);
+ }
+ else
+ {
+ // Start out by reading one byte, so that any data received will wake us up.
+ request_size = 1;
+ }
// and use the timeout so we'll sleep if no data is available.
setSocketTimeout((apr_interval_time_t)(timeout * 1000000));
@@ -236,11 +285,14 @@ bool LLPluginMessagePipe::pump(F64 timeout)
// LL_INFOS("Plugin") << "after apr_socket_recv, size = " << size << LL_ENDL;
if(size > 0)
+ {
+ LLMutexLock lock(&mInputMutex);
mInput.append(input_buf, size);
+ }
if(status == APR_SUCCESS)
{
-// llinfos << "success, read " << size << llendl;
+ LL_DEBUGS("PluginSocket") << "success, read " << size << LL_ENDL;
if(size != request_size)
{
@@ -250,16 +302,28 @@ bool LLPluginMessagePipe::pump(F64 timeout)
}
else if(APR_STATUS_IS_TIMEUP(status))
{
-// llinfos << "TIMEUP, read " << size << llendl;
+ LL_DEBUGS("PluginSocket") << "TIMEUP, read " << size << LL_ENDL;
// Timeout was hit. Since the initial read is 1 byte, this should never be a partial read.
break;
}
else if(APR_STATUS_IS_EAGAIN(status))
{
-// llinfos << "EAGAIN, read " << size << llendl;
+ LL_DEBUGS("PluginSocket") << "EAGAIN, read " << size << LL_ENDL;
- // We've been doing partial reads, and we're done now.
+ // Non-blocking read returned immediately.
+ break;
+ }
+ else if(APR_STATUS_IS_EOF(status))
+ {
+ // This is what we normally expect when a plugin exits.
+ LL_INFOS("PluginSocket") << "Got EOF from plugin socket. " << LL_ENDL;
+
+ if(mOwner)
+ {
+ mOwner->socketError(status);
+ }
+ result = false;
break;
}
else
@@ -276,22 +340,18 @@ bool LLPluginMessagePipe::pump(F64 timeout)
break;
}
- // Second and subsequent reads should not use the timeout
- setSocketTimeout(0);
- // and should try to fill the input buffer
- request_size = sizeof(input_buf);
+ if(timeout != 0.0f)
+ {
+ // Second and subsequent reads should not use the timeout
+ setSocketTimeout(0);
+ // and should try to fill the input buffer
+ request_size = sizeof(input_buf);
+ }
}
processInput();
}
}
-
- if(!result)
- {
- // If we got an error, we're done.
- LL_INFOS("Plugin") << "Error from socket, cleaning up." << LL_ENDL;
- delete this;
- }
return result;
}
@@ -299,19 +359,27 @@ bool LLPluginMessagePipe::pump(F64 timeout)
void LLPluginMessagePipe::processInput(void)
{
// Look for input delimiter(s) in the input buffer.
- int start = 0;
int delim;
- while((delim = mInput.find(MESSAGE_DELIMITER, start)) != std::string::npos)
+ mInputMutex.lock();
+ while((delim = mInput.find(MESSAGE_DELIMITER)) != std::string::npos)
{
// Let the owner process this message
- mOwner->receiveMessageRaw(mInput.substr(start, delim - start));
-
- start = delim + 1;
+ if (mOwner)
+ {
+ // Pull the message out of the input buffer before calling receiveMessageRaw.
+ // It's now possible for this function to get called recursively (in the case where the plugin makes a blocking request)
+ // and this guarantees that the messages will get dequeued correctly.
+ std::string message(mInput, 0, delim);
+ mInput.erase(0, delim + 1);
+ mInputMutex.unlock();
+ mOwner->receiveMessageRaw(message);
+ mInputMutex.lock();
+ }
+ else
+ {
+ LL_WARNS("Plugin") << "!mOwner" << LL_ENDL;
+ }
}
-
- // Remove delivered messages from the input buffer.
- if(start != 0)
- mInput = mInput.substr(start);
-
+ mInputMutex.unlock();
}
diff --git a/indra/llplugin/llpluginmessagepipe.h b/indra/llplugin/llpluginmessagepipe.h
index 1ddb38de68..1b0a08254b 100644
--- a/indra/llplugin/llpluginmessagepipe.h
+++ b/indra/llplugin/llpluginmessagepipe.h
@@ -35,6 +35,7 @@
#define LL_LLPLUGINMESSAGEPIPE_H
#include "lliosocket.h"
+#include "llthread.h"
class LLPluginMessagePipe;
@@ -51,7 +52,7 @@ public:
virtual apr_status_t socketError(apr_status_t error);
// called from LLPluginMessagePipe to manage the connection with LLPluginMessagePipeOwner -- do not use!
- virtual void setMessagePipe(LLPluginMessagePipe *message_pipe) ;
+ virtual void setMessagePipe(LLPluginMessagePipe *message_pipe);
protected:
// returns false if writeMessageRaw() would drop the message
@@ -76,14 +77,18 @@ public:
void clearOwner(void);
bool pump(F64 timeout = 0.0f);
-
+ bool pumpOutput();
+ bool pumpInput(F64 timeout = 0.0f);
+
protected:
void processInput(void);
// used internally by pump()
void setSocketTimeout(apr_interval_time_t timeout_usec);
+ LLMutex mInputMutex;
std::string mInput;
+ LLMutex mOutputMutex;
std::string mOutput;
LLPluginMessagePipeOwner *mOwner;
diff --git a/indra/llplugin/llpluginprocesschild.cpp b/indra/llplugin/llpluginprocesschild.cpp
index 0f3254d78d..d1cf91b253 100644
--- a/indra/llplugin/llpluginprocesschild.cpp
+++ b/indra/llplugin/llpluginprocesschild.cpp
@@ -48,6 +48,8 @@ LLPluginProcessChild::LLPluginProcessChild()
mSocket = LLSocket::create(gAPRPoolp, LLSocket::STREAM_TCP);
mSleepTime = PLUGIN_IDLE_SECONDS; // default: send idle messages at 100Hz
mCPUElapsed = 0.0f;
+ mBlockingRequest = false;
+ mBlockingResponseReceived = false;
}
LLPluginProcessChild::~LLPluginProcessChild()
@@ -83,9 +85,14 @@ void LLPluginProcessChild::idle(void)
bool idle_again;
do
{
- if(mSocketError != APR_SUCCESS)
+ if(APR_STATUS_IS_EOF(mSocketError))
{
- LL_INFOS("Plugin") << "message pipe is in error state, moving to STATE_ERROR"<< LL_ENDL;
+ // Plugin socket was closed. This covers both normal plugin termination and host crashes.
+ setState(STATE_ERROR);
+ }
+ else if(mSocketError != APR_SUCCESS)
+ {
+ LL_INFOS("Plugin") << "message pipe is in error state (" << mSocketError << "), moving to STATE_ERROR"<< LL_ENDL;
setState(STATE_ERROR);
}
@@ -155,7 +162,6 @@ void LLPluginProcessChild::idle(void)
{
setState(STATE_PLUGIN_INITIALIZING);
LLPluginMessage message("base", "init");
- message.setValue("user_data_path", mUserDataPath);
sendMessageToPlugin(message);
}
break;
@@ -227,6 +233,7 @@ void LLPluginProcessChild::idle(void)
void LLPluginProcessChild::sleep(F64 seconds)
{
+ deliverQueuedMessages();
if(mMessagePipe)
{
mMessagePipe->pump(seconds);
@@ -239,6 +246,7 @@ void LLPluginProcessChild::sleep(F64 seconds)
void LLPluginProcessChild::pump(void)
{
+ deliverQueuedMessages();
if(mMessagePipe)
{
mMessagePipe->pump(0.0f);
@@ -278,14 +286,21 @@ bool LLPluginProcessChild::isDone(void)
void LLPluginProcessChild::sendMessageToPlugin(const LLPluginMessage &message)
{
- std::string buffer = message.generate();
-
- LL_DEBUGS("Plugin") << "Sending to plugin: " << buffer << LL_ENDL;
- LLTimer elapsed;
-
- mInstance->sendMessage(buffer);
-
- mCPUElapsed += elapsed.getElapsedTimeF64();
+ if (mInstance)
+ {
+ std::string buffer = message.generate();
+
+ LL_DEBUGS("Plugin") << "Sending to plugin: " << buffer << LL_ENDL;
+ LLTimer elapsed;
+
+ mInstance->sendMessage(buffer);
+
+ mCPUElapsed += elapsed.getElapsedTimeF64();
+ }
+ else
+ {
+ LL_WARNS("Plugin") << "mInstance == NULL" << LL_ENDL;
+ }
}
void LLPluginProcessChild::sendMessageToParent(const LLPluginMessage &message)
@@ -303,15 +318,32 @@ void LLPluginProcessChild::receiveMessageRaw(const std::string &message)
LL_DEBUGS("Plugin") << "Received from parent: " << message << LL_ENDL;
+ // Decode this message
+ LLPluginMessage parsed;
+ parsed.parse(message);
+
+ if(mBlockingRequest)
+ {
+ // We're blocking the plugin waiting for a response.
+
+ if(parsed.hasValue("blocking_response"))
+ {
+ // This is the message we've been waiting for -- fall through and send it immediately.
+ mBlockingResponseReceived = true;
+ }
+ else
+ {
+ // Still waiting. Queue this message and don't process it yet.
+ mMessageQueue.push(message);
+ return;
+ }
+ }
+
bool passMessage = true;
// FIXME: how should we handle queueing here?
{
- // Decode this message
- LLPluginMessage parsed;
- parsed.parse(message);
-
std::string message_class = parsed.getClass();
if(message_class == LLPLUGIN_MESSAGE_CLASS_INTERNAL)
{
@@ -321,7 +353,6 @@ void LLPluginProcessChild::receiveMessageRaw(const std::string &message)
if(message_name == "load_plugin")
{
mPluginFile = parsed.getValue("file");
- mUserDataPath = parsed.getValue("user_data_path");
}
else if(message_name == "shm_add")
{
@@ -420,7 +451,13 @@ void LLPluginProcessChild::receiveMessageRaw(const std::string &message)
void LLPluginProcessChild::receivePluginMessage(const std::string &message)
{
LL_DEBUGS("Plugin") << "Received from plugin: " << message << LL_ENDL;
-
+
+ if(mBlockingRequest)
+ {
+ //
+ LL_ERRS("Plugin") << "Can't send a message while already waiting on a blocking request -- aborting!" << LL_ENDL;
+ }
+
// Incoming message from the plugin instance
bool passMessage = true;
@@ -431,6 +468,12 @@ void LLPluginProcessChild::receivePluginMessage(const std::string &message)
// Decode this message
LLPluginMessage parsed;
parsed.parse(message);
+
+ if(parsed.hasValue("blocking_request"))
+ {
+ mBlockingRequest = true;
+ }
+
std::string message_class = parsed.getClass();
if(message_class == "base")
{
@@ -489,6 +532,19 @@ void LLPluginProcessChild::receivePluginMessage(const std::string &message)
LL_DEBUGS("Plugin") << "Passing through to parent: " << message << LL_ENDL;
writeMessageRaw(message);
}
+
+ while(mBlockingRequest)
+ {
+ // The plugin wants to block and wait for a response to this message.
+ sleep(mSleepTime); // this will pump the message pipe and process messages
+
+ if(mBlockingResponseReceived || mSocketError != APR_SUCCESS || (mMessagePipe == NULL))
+ {
+ // Response has been received, or we've hit an error state. Stop waiting.
+ mBlockingRequest = false;
+ mBlockingResponseReceived = false;
+ }
+ }
}
@@ -497,3 +553,15 @@ void LLPluginProcessChild::setState(EState state)
LL_DEBUGS("Plugin") << "setting state to " << state << LL_ENDL;
mState = state;
};
+
+void LLPluginProcessChild::deliverQueuedMessages()
+{
+ if(!mBlockingRequest)
+ {
+ while(!mMessageQueue.empty())
+ {
+ receiveMessageRaw(mMessageQueue.front());
+ mMessageQueue.pop();
+ }
+ }
+}
diff --git a/indra/llplugin/llpluginprocesschild.h b/indra/llplugin/llpluginprocesschild.h
index 58f8935ed1..1430ad7a5d 100644
--- a/indra/llplugin/llpluginprocesschild.h
+++ b/indra/llplugin/llpluginprocesschild.h
@@ -98,8 +98,6 @@ private:
std::string mPluginFile;
- std::string mUserDataPath;
-
LLPluginInstance *mInstance;
typedef std::map<std::string, LLPluginSharedMemory*> sharedMemoryRegionsType;
@@ -108,6 +106,11 @@ private:
LLTimer mHeartbeat;
F64 mSleepTime;
F64 mCPUElapsed;
+ bool mBlockingRequest;
+ bool mBlockingResponseReceived;
+ std::queue<std::string> mMessageQueue;
+
+ void deliverQueuedMessages();
};
diff --git a/indra/llplugin/llpluginprocessparent.cpp b/indra/llplugin/llpluginprocessparent.cpp
index efd5df687e..3589b22a77 100644
--- a/indra/llplugin/llpluginprocessparent.cpp
+++ b/indra/llplugin/llpluginprocessparent.cpp
@@ -45,8 +45,51 @@ LLPluginProcessParentOwner::~LLPluginProcessParentOwner()
}
-LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner *owner)
+bool LLPluginProcessParent::sUseReadThread = false;
+apr_pollset_t *LLPluginProcessParent::sPollSet = NULL;
+bool LLPluginProcessParent::sPollsetNeedsRebuild = false;
+LLMutex *LLPluginProcessParent::sInstancesMutex;
+std::list<LLPluginProcessParent*> LLPluginProcessParent::sInstances;
+LLThread *LLPluginProcessParent::sReadThread = NULL;
+
+
+class LLPluginProcessParentPollThread: public LLThread
{
+public:
+ LLPluginProcessParentPollThread() :
+ LLThread("LLPluginProcessParentPollThread", gAPRPoolp)
+ {
+ }
+protected:
+ // Inherited from LLThread
+ /*virtual*/ void run(void)
+ {
+ while(!isQuitting() && LLPluginProcessParent::getUseReadThread())
+ {
+ LLPluginProcessParent::poll(0.1f);
+ checkPause();
+ }
+
+ // Final poll to clean up the pollset, etc.
+ LLPluginProcessParent::poll(0.0f);
+ }
+
+ // Inherited from LLThread
+ /*virtual*/ bool runCondition(void)
+ {
+ return(LLPluginProcessParent::canPollThreadRun());
+ }
+
+};
+
+LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner *owner):
+ mIncomingQueueMutex(gAPRPoolp)
+{
+ if(!sInstancesMutex)
+ {
+ sInstancesMutex = new LLMutex(gAPRPoolp);
+ }
+
mOwner = owner;
mBoundPort = 0;
mState = STATE_UNINITIALIZED;
@@ -54,18 +97,37 @@ LLPluginProcessParent::LLPluginProcessParent(LLPluginProcessParentOwner *owner)
mCPUUsage = 0.0;
mDisableTimeout = false;
mDebug = false;
+ mBlocked = false;
+ mPolledInput = false;
+ mPollFD.client_data = NULL;
mPluginLaunchTimeout = 60.0f;
mPluginLockupTimeout = 15.0f;
// Don't start the timer here -- start it when we actually launch the plugin process.
mHeartbeat.stop();
+
+ // Don't add to the global list until fully constructed.
+ {
+ LLMutexLock lock(sInstancesMutex);
+ sInstances.push_back(this);
+ }
}
LLPluginProcessParent::~LLPluginProcessParent()
{
LL_DEBUGS("Plugin") << "destructor" << LL_ENDL;
+ // Remove from the global list before beginning destruction.
+ {
+ // Make sure to get the global mutex _first_ here, to avoid a possible deadlock against LLPluginProcessParent::poll()
+ LLMutexLock lock(sInstancesMutex);
+ {
+ LLMutexLock lock2(&mIncomingQueueMutex);
+ sInstances.remove(this);
+ }
+ }
+
// Destroy any remaining shared memory regions
sharedMemoryRegionsType::iterator iter;
while((iter = mSharedMemoryRegions.begin()) != mSharedMemoryRegions.end())
@@ -77,15 +139,17 @@ LLPluginProcessParent::~LLPluginProcessParent()
mSharedMemoryRegions.erase(iter);
}
- // orphaning the process means it won't be killed when the LLProcessLauncher is destructed.
- // This is what we want -- it should exit cleanly once it notices the sockets have been closed.
- mProcess.orphan();
+ mProcess.kill();
killSockets();
}
void LLPluginProcessParent::killSockets(void)
{
- killMessagePipe();
+ {
+ LLMutexLock lock(&mIncomingQueueMutex);
+ killMessagePipe();
+ }
+
mListenSocket.reset();
mSocket.reset();
}
@@ -98,14 +162,12 @@ void LLPluginProcessParent::errorState(void)
setState(STATE_ERROR);
}
-void LLPluginProcessParent::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path)
+void LLPluginProcessParent::init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug)
{
mProcess.setExecutable(launcher_filename);
mPluginFile = plugin_filename;
mCPUUsage = 0.0f;
- mDebug = debug;
- mUserDataPath = user_data_path;
-
+ mDebug = debug;
setState(STATE_INITIALIZED);
}
@@ -161,21 +223,47 @@ void LLPluginProcessParent::idle(void)
do
{
+ // process queued messages
+ mIncomingQueueMutex.lock();
+ while(!mIncomingQueue.empty())
+ {
+ LLPluginMessage message = mIncomingQueue.front();
+ mIncomingQueue.pop();
+ mIncomingQueueMutex.unlock();
+
+ receiveMessage(message);
+
+ mIncomingQueueMutex.lock();
+ }
+
+ mIncomingQueueMutex.unlock();
+
// Give time to network processing
if(mMessagePipe)
{
- if(!mMessagePipe->pump())
+ // Drain any queued outgoing messages
+ mMessagePipe->pumpOutput();
+
+ // Only do input processing here if this instance isn't in a pollset.
+ if(!mPolledInput)
{
-// LL_WARNS("Plugin") << "Message pipe hit an error state" << LL_ENDL;
- errorState();
+ mMessagePipe->pumpInput();
}
}
-
- if((mSocketError != APR_SUCCESS) && (mState <= STATE_RUNNING))
+
+ if(mState <= STATE_RUNNING)
{
- // The socket is in an error state -- the plugin is gone.
- LL_WARNS("Plugin") << "Socket hit an error state (" << mSocketError << ")" << LL_ENDL;
- errorState();
+ if(APR_STATUS_IS_EOF(mSocketError))
+ {
+ // Plugin socket was closed. This covers both normal plugin termination and plugin crashes.
+ errorState();
+ }
+ else if(mSocketError != APR_SUCCESS)
+ {
+ // The socket is in an error state -- the plugin is gone.
+ LL_WARNS("Plugin") << "Socket hit an error state (" << mSocketError << ")" << LL_ENDL;
+ errorState();
+ }
}
// If a state needs to go directly to another state (as a performance enhancement), it can set idle_again to true after calling setState().
@@ -356,13 +444,12 @@ void LLPluginProcessParent::idle(void)
break;
case STATE_HELLO:
- LL_DEBUGS("Plugin") << "received hello message" << llendl;
+ LL_DEBUGS("Plugin") << "received hello message" << LL_ENDL;
// Send the message to load the plugin
{
LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_INTERNAL, "load_plugin");
message.setValue("file", mPluginFile);
- message.setValue("user_data_path", mUserDataPath);
sendMessage(message);
}
@@ -391,7 +478,7 @@ void LLPluginProcessParent::idle(void)
}
else if(pluginLockedUp())
{
- LL_WARNS("Plugin") << "timeout in exiting state, bailing out" << llendl;
+ LL_WARNS("Plugin") << "timeout in exiting state, bailing out" << LL_ENDL;
errorState();
}
break;
@@ -413,8 +500,7 @@ void LLPluginProcessParent::idle(void)
break;
case STATE_CLEANUP:
- // Don't do a kill here anymore -- closing the sockets is the new 'kill'.
- mProcess.orphan();
+ mProcess.kill();
killSockets();
setState(STATE_DONE);
break;
@@ -482,23 +568,323 @@ void LLPluginProcessParent::setSleepTime(F64 sleep_time, bool force_send)
void LLPluginProcessParent::sendMessage(const LLPluginMessage &message)
{
+ if(message.hasValue("blocking_response"))
+ {
+ mBlocked = false;
+
+ // reset the heartbeat timer, since there will have been no heartbeats while the plugin was blocked.
+ mHeartbeat.setTimerExpirySec(mPluginLockupTimeout);
+ }
std::string buffer = message.generate();
LL_DEBUGS("Plugin") << "Sending: " << buffer << LL_ENDL;
writeMessageRaw(buffer);
+
+ // Try to send message immediately.
+ if(mMessagePipe)
+ {
+ mMessagePipe->pumpOutput();
+ }
+}
+
+//virtual
+void LLPluginProcessParent::setMessagePipe(LLPluginMessagePipe *message_pipe)
+{
+ bool update_pollset = false;
+
+ if(mMessagePipe)
+ {
+ // Unsetting an existing message pipe -- remove from the pollset
+ mPollFD.client_data = NULL;
+
+ // pollset needs an update
+ update_pollset = true;
+ }
+ if(message_pipe != NULL)
+ {
+ // Set up the apr_pollfd_t
+ mPollFD.p = gAPRPoolp;
+ mPollFD.desc_type = APR_POLL_SOCKET;
+ mPollFD.reqevents = APR_POLLIN|APR_POLLERR|APR_POLLHUP;
+ mPollFD.rtnevents = 0;
+ mPollFD.desc.s = mSocket->getSocket();
+ mPollFD.client_data = (void*)this;
+
+ // pollset needs an update
+ update_pollset = true;
+ }
+
+ mMessagePipe = message_pipe;
+
+ if(update_pollset)
+ {
+ dirtyPollSet();
+ }
+}
+
+//static
+void LLPluginProcessParent::dirtyPollSet()
+{
+ sPollsetNeedsRebuild = true;
+
+ if(sReadThread)
+ {
+ LL_DEBUGS("PluginPoll") << "unpausing read thread " << LL_ENDL;
+ sReadThread->unpause();
+ }
+}
+
+void LLPluginProcessParent::updatePollset()
+{
+ if(!sInstancesMutex)
+ {
+ // No instances have been created yet. There's no work to do.
+ return;
+ }
+
+ LLMutexLock lock(sInstancesMutex);
+
+ if(sPollSet)
+ {
+ LL_DEBUGS("PluginPoll") << "destroying pollset " << sPollSet << LL_ENDL;
+ // delete the existing pollset.
+ apr_pollset_destroy(sPollSet);
+ sPollSet = NULL;
+ }
+
+ std::list<LLPluginProcessParent*>::iterator iter;
+ int count = 0;
+
+ // Count the number of instances that want to be in the pollset
+ for(iter = sInstances.begin(); iter != sInstances.end(); iter++)
+ {
+ (*iter)->mPolledInput = false;
+ if((*iter)->mPollFD.client_data)
+ {
+ // This instance has a socket that needs to be polled.
+ ++count;
+ }
+ }
+
+ if(sUseReadThread && sReadThread && !sReadThread->isQuitting())
+ {
+ if(!sPollSet && (count > 0))
+ {
+#ifdef APR_POLLSET_NOCOPY
+ // The pollset doesn't exist yet. Create it now.
+ apr_status_t status = apr_pollset_create(&sPollSet, count, gAPRPoolp, APR_POLLSET_NOCOPY);
+ if(status != APR_SUCCESS)
+ {
+#endif // APR_POLLSET_NOCOPY
+ LL_WARNS("PluginPoll") << "Couldn't create pollset. Falling back to non-pollset mode." << LL_ENDL;
+ sPollSet = NULL;
+#ifdef APR_POLLSET_NOCOPY
+ }
+ else
+ {
+ LL_DEBUGS("PluginPoll") << "created pollset " << sPollSet << LL_ENDL;
+
+ // Pollset was created, add all instances to it.
+ for(iter = sInstances.begin(); iter != sInstances.end(); iter++)
+ {
+ if((*iter)->mPollFD.client_data)
+ {
+ status = apr_pollset_add(sPollSet, &((*iter)->mPollFD));
+ if(status == APR_SUCCESS)
+ {
+ (*iter)->mPolledInput = true;
+ }
+ else
+ {
+ LL_WARNS("PluginPoll") << "apr_pollset_add failed with status " << status << LL_ENDL;
+ }
+ }
+ }
+ }
+#endif // APR_POLLSET_NOCOPY
+ }
+ }
+}
+
+void LLPluginProcessParent::setUseReadThread(bool use_read_thread)
+{
+ if(sUseReadThread != use_read_thread)
+ {
+ sUseReadThread = use_read_thread;
+
+ if(sUseReadThread)
+ {
+ if(!sReadThread)
+ {
+ // start up the read thread
+ LL_INFOS("PluginPoll") << "creating read thread " << LL_ENDL;
+
+ // make sure the pollset gets rebuilt.
+ sPollsetNeedsRebuild = true;
+
+ sReadThread = new LLPluginProcessParentPollThread;
+ sReadThread->start();
+ }
+ }
+ else
+ {
+ if(sReadThread)
+ {
+ // shut down the read thread
+ LL_INFOS("PluginPoll") << "destroying read thread " << LL_ENDL;
+ delete sReadThread;
+ sReadThread = NULL;
+ }
+ }
+
+ }
+}
+
+void LLPluginProcessParent::poll(F64 timeout)
+{
+ if(sPollsetNeedsRebuild || !sUseReadThread)
+ {
+ sPollsetNeedsRebuild = false;
+ updatePollset();
+ }
+
+ if(sPollSet)
+ {
+ apr_status_t status;
+ apr_int32_t count;
+ const apr_pollfd_t *descriptors;
+ status = apr_pollset_poll(sPollSet, (apr_interval_time_t)(timeout * 1000000), &count, &descriptors);
+ if(status == APR_SUCCESS)
+ {
+ // One or more of the descriptors signalled. Call them.
+ for(int i = 0; i < count; i++)
+ {
+ LLPluginProcessParent *self = (LLPluginProcessParent *)(descriptors[i].client_data);
+ // NOTE: the descriptor returned here is actually a COPY of the original (even though we create the pollset with APR_POLLSET_NOCOPY).
+ // This means that even if the parent has set its mPollFD.client_data to NULL, the old pointer may still there in this descriptor.
+ // It's even possible that the old pointer no longer points to a valid LLPluginProcessParent.
+ // This means that we can't safely dereference the 'self' pointer here without some extra steps...
+ if(self)
+ {
+ // Make sure this pointer is still in the instances list
+ bool valid = false;
+ {
+ LLMutexLock lock(sInstancesMutex);
+ for(std::list<LLPluginProcessParent*>::iterator iter = sInstances.begin(); iter != sInstances.end(); ++iter)
+ {
+ if(*iter == self)
+ {
+ // Lock the instance's mutex before unlocking the global mutex.
+ // This avoids a possible race condition where the instance gets deleted between this check and the servicePoll() call.
+ self->mIncomingQueueMutex.lock();
+ valid = true;
+ break;
+ }
+ }
+ }
+
+ if(valid)
+ {
+ // The instance is still valid.
+ // Pull incoming messages off the socket
+ self->servicePoll();
+ self->mIncomingQueueMutex.unlock();
+ }
+ else
+ {
+ LL_DEBUGS("PluginPoll") << "detected deleted instance " << self << LL_ENDL;
+ }
+
+ }
+ }
+ }
+ else if(APR_STATUS_IS_TIMEUP(status))
+ {
+ // timed out with no incoming data. Just return.
+ }
+ else if(status == EBADF)
+ {
+ // This happens when one of the file descriptors in the pollset is destroyed, which happens whenever a plugin's socket is closed.
+ // The pollset has been or will be recreated, so just return.
+ LL_DEBUGS("PluginPoll") << "apr_pollset_poll returned EBADF" << LL_ENDL;
+ }
+ else if(status != APR_SUCCESS)
+ {
+ LL_WARNS("PluginPoll") << "apr_pollset_poll failed with status " << status << LL_ENDL;
+ }
+ }
}
+void LLPluginProcessParent::servicePoll()
+{
+ bool result = true;
+
+ // poll signalled on this object's socket. Try to process incoming messages.
+ if(mMessagePipe)
+ {
+ result = mMessagePipe->pumpInput(0.0f);
+ }
+
+ if(!result)
+ {
+ // If we got a read error on input, remove this pipe from the pollset
+ apr_pollset_remove(sPollSet, &mPollFD);
+
+ // and tell the code not to re-add it
+ mPollFD.client_data = NULL;
+ }
+}
void LLPluginProcessParent::receiveMessageRaw(const std::string &message)
{
LL_DEBUGS("Plugin") << "Received: " << message << LL_ENDL;
-
- // FIXME: should this go into a queue instead?
LLPluginMessage parsed;
if(parsed.parse(message) != -1)
{
- receiveMessage(parsed);
+ if(parsed.hasValue("blocking_request"))
+ {
+ mBlocked = true;
+ }
+
+ if(mPolledInput)
+ {
+ // This is being called on the polling thread -- only do minimal processing/queueing.
+ receiveMessageEarly(parsed);
+ }
+ else
+ {
+ // This is not being called on the polling thread -- do full message processing at this time.
+ receiveMessage(parsed);
+ }
+ }
+}
+
+void LLPluginProcessParent::receiveMessageEarly(const LLPluginMessage &message)
+{
+ // NOTE: this function will be called from the polling thread. It will be called with mIncomingQueueMutex _already locked_.
+
+ bool handled = false;
+
+ std::string message_class = message.getClass();
+ if(message_class == LLPLUGIN_MESSAGE_CLASS_INTERNAL)
+ {
+ // no internal messages need to be handled early.
+ }
+ else
+ {
+ // Call out to the owner and see if they to reply
+ // TODO: Should this only happen when blocked?
+ if(mOwner != NULL)
+ {
+ handled = mOwner->receivePluginMessageEarly(message);
+ }
+ }
+
+ if(!handled)
+ {
+ // any message that wasn't handled early needs to be queued.
+ mIncomingQueue.push(message);
}
}
@@ -692,18 +1078,15 @@ bool LLPluginProcessParent::pluginLockedUpOrQuit()
{
bool result = false;
- if(!mDisableTimeout && !mDebug)
+ if(!mProcess.isRunning())
{
- if(!mProcess.isRunning())
- {
- LL_WARNS("Plugin") << "child exited" << llendl;
- result = true;
- }
- else if(pluginLockedUp())
- {
- LL_WARNS("Plugin") << "timeout" << llendl;
- result = true;
- }
+ LL_WARNS("Plugin") << "child exited" << LL_ENDL;
+ result = true;
+ }
+ else if(pluginLockedUp())
+ {
+ LL_WARNS("Plugin") << "timeout" << LL_ENDL;
+ result = true;
}
return result;
@@ -711,6 +1094,12 @@ bool LLPluginProcessParent::pluginLockedUpOrQuit()
bool LLPluginProcessParent::pluginLockedUp()
{
+ if(mDisableTimeout || mDebug || mBlocked)
+ {
+ // Never time out a plugin process in these cases.
+ return false;
+ }
+
// If the timer is running and has expired, the plugin has locked up.
return (mHeartbeat.getStarted() && mHeartbeat.hasExpired());
}
diff --git a/indra/llplugin/llpluginprocessparent.h b/indra/llplugin/llpluginprocessparent.h
index 524cd9923f..4dff835b6a 100644
--- a/indra/llplugin/llpluginprocessparent.h
+++ b/indra/llplugin/llpluginprocessparent.h
@@ -41,12 +41,14 @@
#include "llpluginsharedmemory.h"
#include "lliosocket.h"
+#include "llthread.h"
class LLPluginProcessParentOwner
{
public:
virtual ~LLPluginProcessParentOwner();
virtual void receivePluginMessage(const LLPluginMessage &message) = 0;
+ virtual bool receivePluginMessageEarly(const LLPluginMessage &message) {return false;};
// This will only be called when the plugin has died unexpectedly
virtual void pluginLaunchFailed() {};
virtual void pluginDied() {};
@@ -59,7 +61,10 @@ public:
LLPluginProcessParent(LLPluginProcessParentOwner *owner);
~LLPluginProcessParent();
- void init(const std::string &launcher_filename, const std::string &plugin_filename, bool debug, const std::string &user_data_path);
+ void init(const std::string &launcher_filename,
+ const std::string &plugin_filename,
+ bool debug);
+
void idle(void);
// returns true if the plugin is on its way to steady state
@@ -71,6 +76,9 @@ public:
// returns true if the process has exited or we've had a fatal error
bool isDone(void);
+ // returns true if the process is currently waiting on a blocking request
+ bool isBlocked(void) { return mBlocked; };
+
void killSockets(void);
// Go to the proper error state
@@ -84,7 +92,9 @@ public:
void receiveMessage(const LLPluginMessage &message);
// Inherited from LLPluginMessagePipeOwner
- void receiveMessageRaw(const std::string &message);
+ /*virtual*/ void receiveMessageRaw(const std::string &message);
+ /*virtual*/ void receiveMessageEarly(const LLPluginMessage &message);
+ /*virtual*/ void setMessagePipe(LLPluginMessagePipe *message_pipe) ;
// This adds a memory segment shared with the client, generating a name for the segment. The name generated is guaranteed to be unique on the host.
// The caller must call removeSharedMemory first (and wait until getSharedMemorySize returns 0 for the indicated name) before re-adding a segment with the same name.
@@ -107,7 +117,11 @@ public:
void setLockupTimeout(F32 timeout) { mPluginLockupTimeout = timeout; };
F64 getCPUUsage() { return mCPUUsage; };
-
+
+ static void poll(F64 timeout);
+ static bool canPollThreadRun() { return (sPollSet || sPollsetNeedsRebuild || sUseReadThread); };
+ static void setUseReadThread(bool use_read_thread);
+ static bool getUseReadThread() { return sUseReadThread; };
private:
enum EState
@@ -143,8 +157,6 @@ private:
std::string mPluginFile;
- std::string mUserDataPath;
-
LLPluginProcessParentOwner *mOwner;
typedef std::map<std::string, LLPluginSharedMemory*> sharedMemoryRegionsType;
@@ -159,12 +171,27 @@ private:
bool mDisableTimeout;
bool mDebug;
+ bool mBlocked;
+ bool mPolledInput;
LLProcessLauncher mDebugger;
F32 mPluginLaunchTimeout; // Somewhat longer timeout for initial launch.
F32 mPluginLockupTimeout; // If we don't receive a heartbeat in this many seconds, we declare the plugin locked up.
+ static bool sUseReadThread;
+ apr_pollfd_t mPollFD;
+ static apr_pollset_t *sPollSet;
+ static bool sPollsetNeedsRebuild;
+ static LLMutex *sInstancesMutex;
+ static std::list<LLPluginProcessParent*> sInstances;
+ static void dirtyPollSet();
+ static void updatePollset();
+ void servicePoll();
+ static LLThread *sReadThread;
+
+ LLMutex mIncomingQueueMutex;
+ std::queue<LLPluginMessage> mIncomingQueue;
};
#endif // LL_LLPLUGINPROCESSPARENT_H
diff --git a/indra/llplugin/slplugin/CMakeLists.txt b/indra/llplugin/slplugin/CMakeLists.txt
index 4a7d670c23..c1536e85de 100644
--- a/indra/llplugin/slplugin/CMakeLists.txt
+++ b/indra/llplugin/slplugin/CMakeLists.txt
@@ -27,9 +27,15 @@ set(SLPlugin_SOURCE_FILES
add_executable(SLPlugin
WIN32
+ MACOSX_BUNDLE
${SLPlugin_SOURCE_FILES}
)
+set_target_properties(SLPlugin
+ PROPERTIES
+ MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/slplugin_info.plist
+ )
+
target_link_libraries(SLPlugin
${LLPLUGIN_LIBRARIES}
${LLMESSAGE_LIBRARIES}
@@ -44,12 +50,16 @@ add_dependencies(SLPlugin
)
if (DARWIN)
- # Mac version needs to link against carbon, and also needs an embedded plist (to set LSBackgroundOnly)
+ # Mac version needs to link against Carbon
target_link_libraries(SLPlugin ${CARBON_LIBRARY})
- set_target_properties(
- SLPlugin
- PROPERTIES
- LINK_FLAGS "-Wl,-sectcreate,__TEXT,__info_plist,${CMAKE_CURRENT_SOURCE_DIR}/slplugin_info.plist"
+ # Make sure the app bundle has a Resources directory (it will get populated by viewer-manifest.py later)
+ add_custom_command(
+ TARGET SLPlugin POST_BUILD
+ COMMAND mkdir
+ ARGS
+ -p
+ ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/SLPlugin.app/Contents/Resources
)
endif (DARWIN)
+ll_deploy_sharedlibs_command(SLPlugin)
diff --git a/indra/llplugin/slplugin/slplugin.cpp b/indra/llplugin/slplugin/slplugin.cpp
index 77240ce546..7d6dde1a58 100644
--- a/indra/llplugin/slplugin/slplugin.cpp
+++ b/indra/llplugin/slplugin/slplugin.cpp
@@ -51,7 +51,7 @@
#endif
/*
- On Mac OS, since we call WaitNextEvent, this process will show up in the dock unless we set the LSBackgroundOnly flag in the Info.plist.
+ On Mac OS, since we call WaitNextEvent, this process will show up in the dock unless we set the LSBackgroundOnly or LSUIElement flag in the Info.plist.
Normally non-bundled binaries don't have an info.plist file, but it's possible to embed one in the binary by adding this to the linker flags:
@@ -60,7 +60,8 @@
which means adding this to the gcc flags:
-Wl,-sectcreate,__TEXT,__info_plist,/path/to/slplugin_info.plist
-
+
+ Now that SLPlugin is a bundled app on the Mac, this is no longer necessary (it can just use a regular Info.plist file), but I'm leaving this comment in for posterity.
*/
#if LL_DARWIN || LL_LINUX
@@ -239,6 +240,24 @@ int main(int argc, char **argv)
checkExceptionHandler();
#endif
+#if LL_DARWIN
+ // If the plugin opens a new window (such as the Flash plugin's fullscreen player), we may need to bring this plugin process to the foreground.
+ // Use this to track the current frontmost window and bring this process to the front if it changes.
+ WindowRef front_window = NULL;
+ WindowGroupRef layer_group = NULL;
+ int window_hack_state = 0;
+ CreateWindowGroup(kWindowGroupAttrFixedLevel, &layer_group);
+ if(layer_group)
+ {
+ // Start out with a window layer that's way out in front (fixes the problem with the menubar not getting hidden on first switch to fullscreen youtube)
+ SetWindowGroupName(layer_group, CFSTR("SLPlugin Layer"));
+ SetWindowGroupLevel(layer_group, kCGOverlayWindowLevel);
+ }
+#endif
+
+#if LL_DARWIN
+ EventTargetRef event_target = GetEventDispatcherTarget();
+#endif
while(!plugin->isDone())
{
timer.reset();
@@ -246,8 +265,86 @@ int main(int argc, char **argv)
#if LL_DARWIN
{
// Some plugins (webkit at least) will want an event loop. This qualifies.
- EventRecord evt;
- WaitNextEvent(0, &evt, 0, NULL);
+ EventRef event;
+ if(ReceiveNextEvent(0, 0, kEventDurationNoWait, true, &event) == noErr)
+ {
+ SendEventToEventTarget (event, event_target);
+ ReleaseEvent(event);
+ }
+
+ // Check for a change in this process's frontmost window.
+ if(FrontWindow() != front_window)
+ {
+ ProcessSerialNumber self = { 0, kCurrentProcess };
+ ProcessSerialNumber parent = { 0, kNoProcess };
+ ProcessSerialNumber front = { 0, kNoProcess };
+ Boolean this_is_front_process = false;
+ Boolean parent_is_front_process = false;
+ {
+ // Get this process's parent
+ ProcessInfoRec info;
+ info.processInfoLength = sizeof(ProcessInfoRec);
+ info.processName = NULL;
+ info.processAppSpec = NULL;
+ if(GetProcessInformation( &self, &info ) == noErr)
+ {
+ parent = info.processLauncher;
+ }
+
+ // and figure out whether this process or its parent are currently frontmost
+ if(GetFrontProcess(&front) == noErr)
+ {
+ (void) SameProcess(&self, &front, &this_is_front_process);
+ (void) SameProcess(&parent, &front, &parent_is_front_process);
+ }
+ }
+
+ if((FrontWindow() != NULL) && (front_window == NULL))
+ {
+ // Opening the first window
+
+ if(window_hack_state == 0)
+ {
+ // Next time through the event loop, lower the window group layer
+ window_hack_state = 1;
+ }
+
+ if(layer_group)
+ {
+ SetWindowGroup(FrontWindow(), layer_group);
+ }
+
+ if(parent_is_front_process)
+ {
+ // Bring this process's windows to the front.
+ (void) SetFrontProcess( &self );
+ }
+
+ ActivateWindow(FrontWindow(), true);
+ }
+ else if((FrontWindow() == NULL) && (front_window != NULL))
+ {
+ // Closing the last window
+
+ if(this_is_front_process)
+ {
+ // Try to bring this process's parent to the front
+ (void) SetFrontProcess(&parent);
+ }
+ }
+ else if(window_hack_state == 1)
+ {
+ if(layer_group)
+ {
+ // Set the window group level back to something less extreme
+ SetWindowGroupLevel(layer_group, kCGNormalWindowLevel);
+ }
+ window_hack_state = 2;
+ }
+
+ front_window = FrontWindow();
+
+ }
}
#endif
F64 elapsed = timer.getElapsedTimeF64();
diff --git a/indra/llplugin/slplugin/slplugin_info.plist b/indra/llplugin/slplugin/slplugin_info.plist
index b1daf87424..c4597380e0 100644
--- a/indra/llplugin/slplugin/slplugin_info.plist
+++ b/indra/llplugin/slplugin/slplugin_info.plist
@@ -6,7 +6,7 @@
<string>English</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
- <key>LSBackgroundOnly</key>
- <true/>
+ <key>LSUIElement</key>
+ <string>1</string>
</dict>
</plist>
diff --git a/indra/llplugin/tests/llplugincookiestore_test.cpp b/indra/llplugin/tests/llplugincookiestore_test.cpp
new file mode 100644
index 0000000000..c903464c64
--- /dev/null
+++ b/indra/llplugin/tests/llplugincookiestore_test.cpp
@@ -0,0 +1,211 @@
+/**
+ * @file llplugincookiestore_test.cpp
+ * @brief Unit tests for LLPluginCookieStore.
+ *
+ * @cond
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlife.com/developers/opensource/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlife.com/developers/opensource/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ * @endcond
+ */
+
+#include "linden_common.h"
+#include "../test/lltut.h"
+
+#include "../llplugincookiestore.h"
+
+
+namespace tut
+{
+ // Main Setup
+ struct LLPluginCookieStoreFixture
+ {
+ LLPluginCookieStoreFixture()
+ {
+ // We need dates definitively in the past and the future to properly test cookie expiration.
+ LLDate now = LLDate::now();
+ LLDate past(now.secondsSinceEpoch() - (60.0 * 60.0 * 24.0)); // 1 day in the past
+ LLDate future(now.secondsSinceEpoch() + (60.0 * 60.0 * 24.0)); // 1 day in the future
+
+ mPastString = past.asRFC1123();
+ mFutureString = future.asRFC1123();
+ }
+
+ std::string mPastString;
+ std::string mFutureString;
+ LLPluginCookieStore mCookieStore;
+
+ // List of cookies used for validation
+ std::list<std::string> mCookies;
+
+ // This sets up mCookies from a string returned by one of the functions in LLPluginCookieStore
+ void setCookies(const std::string &cookies)
+ {
+ mCookies.clear();
+ std::string::size_type start = 0;
+
+ while(start != std::string::npos)
+ {
+ std::string::size_type end = cookies.find_first_of("\r\n", start);
+ if(end > start)
+ {
+ std::string line(cookies, start, end - start);
+ if(line.find_first_not_of("\r\n\t ") != std::string::npos)
+ {
+ // The line has some non-whitespace characters. Save it to the list.
+ mCookies.push_back(std::string(cookies, start, end - start));
+ }
+ }
+ start = cookies.find_first_not_of("\r\n ", end);
+ }
+ }
+
+ // This ensures that a cookie matching the one passed is in the list.
+ void ensureCookie(const std::string &cookie)
+ {
+ std::list<std::string>::iterator iter;
+ for(iter = mCookies.begin(); iter != mCookies.end(); iter++)
+ {
+ if(*iter == cookie)
+ {
+ // Found the cookie
+ // TODO: this should do a smarter equality comparison on the two cookies, instead of just a string compare.
+ return;
+ }
+ }
+
+ // Didn't find this cookie
+ std::string message = "cookie not found: ";
+ message += cookie;
+ ensure(message, false);
+ }
+
+ // This ensures that the number of cookies in the list matches what's expected.
+ void ensureSize(const std::string &message, size_t size)
+ {
+ if(mCookies.size() != size)
+ {
+ std::stringstream full_message;
+
+ full_message << message << " (expected " << size << ", actual " << mCookies.size() << ")";
+ ensure(full_message.str(), false);
+ }
+ }
+ };
+
+ typedef test_group<LLPluginCookieStoreFixture> factory;
+ typedef factory::object object;
+ factory tf("LLPluginCookieStore test");
+
+ // Tests
+ template<> template<>
+ void object::test<1>()
+ {
+ // Test 1: cookie uniqueness and update lists.
+ // Valid, distinct cookies:
+
+ std::string cookie01 = "cookieA=value; domain=example.com; path=/";
+ std::string cookie02 = "cookieB=value; Domain=example.com; Path=/; Max-Age=10; Secure; Version=1; Comment=foo!; HTTPOnly"; // cookie with every supported field, in different cases.
+ std::string cookie03 = "cookieA=value; domain=foo.example.com; path=/"; // different domain
+ std::string cookie04 = "cookieA=value; domain=example.com; path=/bar/"; // different path
+ std::string cookie05 = "cookieC; domain=example.com; path=/"; // empty value
+ std::string cookie06 = "cookieD=value; domain=example.com; path=/; expires="; // different name, persistent cookie
+ cookie06 += mFutureString;
+
+ mCookieStore.setCookies(cookie01);
+ mCookieStore.setCookies(cookie02);
+ mCookieStore.setCookies(cookie03);
+ mCookieStore.setCookies(cookie04);
+ mCookieStore.setCookies(cookie05);
+ mCookieStore.setCookies(cookie06);
+
+ // Invalid cookies (these will get parse errors and not be added to the store)
+
+ std::string badcookie01 = "cookieD=value; domain=example.com; path=/; foo=bar"; // invalid field name
+ std::string badcookie02 = "cookieE=value; path=/"; // no domain
+
+ mCookieStore.setCookies(badcookie01);
+ mCookieStore.setCookies(badcookie02);
+
+ // All cookies added so far should have been marked as "changed"
+ setCookies(mCookieStore.getChangedCookies());
+ ensureSize("count of changed cookies", 6);
+ ensureCookie(cookie01);
+ ensureCookie(cookie02);
+ ensureCookie(cookie03);
+ ensureCookie(cookie04);
+ ensureCookie(cookie05);
+ ensureCookie(cookie06);
+
+ // Save off the current state of the cookie store (we'll restore it later)
+ std::string savedCookies = mCookieStore.getAllCookies();
+
+ // Test replacing cookies
+ std::string cookie01a = "cookieA=newvalue; domain=example.com; path=/"; // updated value
+ std::string cookie02a = "cookieB=newvalue; domain=example.com; path=/; expires="; // remove cookie (by setting an expire date in the past)
+ cookie02a += mPastString;
+
+ mCookieStore.setCookies(cookie01a);
+ mCookieStore.setCookies(cookie02a);
+
+ // test for getting changed cookies
+ setCookies(mCookieStore.getChangedCookies());
+ ensureSize("count of updated cookies", 2);
+ ensureCookie(cookie01a);
+ ensureCookie(cookie02a);
+
+ // and for the state of the store after getting changed cookies
+ setCookies(mCookieStore.getAllCookies());
+ ensureSize("count of valid cookies", 5);
+ ensureCookie(cookie01a);
+ ensureCookie(cookie03);
+ ensureCookie(cookie04);
+ ensureCookie(cookie05);
+ ensureCookie(cookie06);
+
+ // Check that only the persistent cookie is returned here
+ setCookies(mCookieStore.getPersistentCookies());
+ ensureSize("count of persistent cookies", 1);
+ ensureCookie(cookie06);
+
+ // Restore the cookie store to a previous state and verify
+ mCookieStore.setAllCookies(savedCookies);
+
+ // Since setAllCookies defaults to not marking cookies as changed, this list should be empty.
+ setCookies(mCookieStore.getChangedCookies());
+ ensureSize("count of changed cookies after restore", 0);
+
+ // Verify that the restore worked as it should have.
+ setCookies(mCookieStore.getAllCookies());
+ ensureSize("count of restored cookies", 6);
+ ensureCookie(cookie01);
+ ensureCookie(cookie02);
+ ensureCookie(cookie03);
+ ensureCookie(cookie04);
+ ensureCookie(cookie05);
+ ensureCookie(cookie06);
+ }
+
+}
diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp
index 59e7d890f4..a86bbbffff 100644
--- a/indra/llrender/llfontfreetype.cpp
+++ b/indra/llrender/llfontfreetype.cpp
@@ -270,6 +270,14 @@ F32 LLFontFreetype::getXAdvance(llwchar wch) const
return (F32)mFontBitmapCachep->getMaxCharWidth();
}
+F32 LLFontFreetype::getXAdvance(const LLFontGlyphInfo* glyph) const
+{
+ if (mFTFace == NULL)
+ return 0.0;
+
+ return glyph->mXAdvance;
+}
+
F32 LLFontFreetype::getXKerning(llwchar char_left, llwchar char_right) const
{
if (mFTFace == NULL)
@@ -289,6 +297,21 @@ F32 LLFontFreetype::getXKerning(llwchar char_left, llwchar char_right) const
return delta.x*(1.f/64.f);
}
+F32 LLFontFreetype::getXKerning(const LLFontGlyphInfo* left_glyph_info, const LLFontGlyphInfo* right_glyph_info) const
+{
+ if (mFTFace == NULL)
+ return 0.0;
+
+ U32 left_glyph = left_glyph_info ? left_glyph_info->mGlyphIndex : 0;
+ U32 right_glyph = right_glyph_info ? right_glyph_info->mGlyphIndex : 0;
+
+ FT_Vector delta;
+
+ llverify(!FT_Get_Kerning(mFTFace, left_glyph, right_glyph, ft_kerning_unfitted, &delta));
+
+ return delta.x*(1.f/64.f);
+}
+
BOOL LLFontFreetype::hasGlyph(llwchar wch) const
{
llassert(!mIsFallback);
@@ -504,8 +527,13 @@ void LLFontFreetype::resetBitmapCache()
mCharGlyphInfoMap.clear();
mFontBitmapCachep->reset();
- // Add the empty glyph
- addGlyphFromFont(this, 0, 0);
+ // Adding default glyph is skipped for fallback fonts here as well as in loadFace().
+ // This if was added as fix for EXT-4971.
+ if(!mIsFallback)
+ {
+ // Add the empty glyph
+ addGlyphFromFont(this, 0, 0);
+ }
}
void LLFontFreetype::destroyGL()
diff --git a/indra/llrender/llfontfreetype.h b/indra/llrender/llfontfreetype.h
index 7a5d029038..f60d09316d 100644
--- a/indra/llrender/llfontfreetype.h
+++ b/indra/llrender/llfontfreetype.h
@@ -128,7 +128,9 @@ public:
};
F32 getXAdvance(llwchar wc) const;
+ F32 getXAdvance(const LLFontGlyphInfo* glyph) const;
F32 getXKerning(llwchar char_left, llwchar char_right) const; // Get the kerning between the two characters
+ F32 getXKerning(const LLFontGlyphInfo* left_glyph_info, const LLFontGlyphInfo* right_glyph_info) const; // Get the kerning between the two characters
LLFontGlyphInfo* getGlyphInfo(llwchar wch) const;
diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp
index b6a6b448ee..d9e1976341 100644
--- a/indra/llrender/llfontgl.cpp
+++ b/indra/llrender/llfontgl.cpp
@@ -151,14 +151,16 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
}
}
- gGL.pushMatrix();
- glLoadIdentity();
- gGL.translatef(floorf(sCurOrigin.mX*sScaleX), floorf(sCurOrigin.mY*sScaleY), sCurOrigin.mZ);
+ gGL.pushUIMatrix();
+
+ gGL.loadUIIdentity();
+
+ gGL.translateUI(floorf(sCurOrigin.mX*sScaleX), floorf(sCurOrigin.mY*sScaleY), sCurOrigin.mZ);
// this code snaps the text origin to a pixel grid to start with
F32 pixel_offset_x = llround((F32)sCurOrigin.mX) - (sCurOrigin.mX);
F32 pixel_offset_y = llround((F32)sCurOrigin.mY) - (sCurOrigin.mY);
- gGL.translatef(-pixel_offset_x, -pixel_offset_y, 0.f);
+ gGL.translateUI(-pixel_offset_x, -pixel_offset_y, 0.f);
LLFastTimer t(FTM_RENDER_FONTS);
@@ -246,14 +248,18 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
}
- // Remember last-used texture to avoid unnecesssary bind calls.
- LLImageGL *last_bound_texture = NULL;
+ const LLFontGlyphInfo* next_glyph = NULL;
for (i = begin_offset; i < begin_offset + length; i++)
{
llwchar wch = wstr[i];
- const LLFontGlyphInfo* fgi= mFontFreetype->getGlyphInfo(wch);
+ const LLFontGlyphInfo* fgi = next_glyph;
+ next_glyph = NULL;
+ if(!fgi)
+ {
+ fgi = mFontFreetype->getGlyphInfo(wch);
+ }
if (!fgi)
{
llerrs << "Missing Glyph Info" << llendl;
@@ -261,12 +267,8 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
}
// Per-glyph bitmap texture.
LLImageGL *image_gl = mFontFreetype->getFontBitmapCache()->getImageGL(fgi->mBitmapNum);
- if (last_bound_texture != image_gl)
- {
- gGL.getTexUnit(0)->bind(image_gl);
- last_bound_texture = image_gl;
- }
-
+ gGL.getTexUnit(0)->bind(image_gl);
+
if ((start_x + scaled_max_pixels) < (cur_x + fgi->mXBearing + fgi->mWidth))
{
// Not enough room for this character.
@@ -295,7 +297,8 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
if (next_char && (next_char < LAST_CHARACTER))
{
// Kern this puppy.
- cur_x += mFontFreetype->getXKerning(wch, next_char);
+ next_glyph = mFontFreetype->getGlyphInfo(next_char);
+ cur_x += mFontFreetype->getXKerning(fgi, next_glyph);
}
// Round after kerning.
@@ -330,10 +333,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
// recursively render ellipses at end of string
// we've already reserved enough room
- gGL.pushMatrix();
- //glLoadIdentity();
- //gGL.translatef(sCurOrigin.mX, sCurOrigin.mY, 0.0f);
- //glScalef(sScaleX, sScaleY, 1.f);
+ gGL.pushUIMatrix();
renderUTF8(std::string("..."),
0,
cur_x / sScaleX, (F32)y,
@@ -344,10 +344,10 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons
S32_MAX, max_pixels,
right_x,
FALSE);
- gGL.popMatrix();
+ gGL.popUIMatrix();
}
- gGL.popMatrix();
+ gGL.popUIMatrix();
return chars_drawn;
}
@@ -435,14 +435,21 @@ F32 LLFontGL::getWidthF32(const llwchar* wchars, S32 begin_offset, S32 max_chars
F32 cur_x = 0;
const S32 max_index = begin_offset + max_chars;
+ const LLFontGlyphInfo* next_glyph = NULL;
+
F32 width_padding = 0.f;
for (S32 i = begin_offset; i < max_index && wchars[i] != 0; i++)
{
llwchar wch = wchars[i];
- const LLFontGlyphInfo* fgi= mFontFreetype->getGlyphInfo(wch);
+ const LLFontGlyphInfo* fgi = next_glyph;
+ next_glyph = NULL;
+ if(!fgi)
+ {
+ fgi = mFontFreetype->getGlyphInfo(wch);
+ }
- F32 advance = mFontFreetype->getXAdvance(wch);
+ F32 advance = mFontFreetype->getXAdvance(fgi);
// for the last character we want to measure the greater of its width and xadvance values
// so keep track of the difference between these values for the each character we measure
@@ -459,7 +466,8 @@ F32 LLFontGL::getWidthF32(const llwchar* wchars, S32 begin_offset, S32 max_chars
&& (next_char < LAST_CHARACTER))
{
// Kern this puppy.
- cur_x += mFontFreetype->getXKerning(wch, next_char);
+ next_glyph = mFontFreetype->getGlyphInfo(next_char);
+ cur_x += mFontFreetype->getXKerning(fgi, next_glyph);
}
// Round after kerning.
cur_x = (F32)llround(cur_x);
@@ -492,6 +500,8 @@ S32 LLFontGL::maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_ch
// avoid S32 overflow when max_pixels == S32_MAX by staying in floating point
F32 scaled_max_pixels = ceil(max_pixels * sScaleX);
F32 width_padding = 0.f;
+
+ LLFontGlyphInfo* next_glyph = NULL;
S32 i;
for (i=0; (i < max_chars); i++)
@@ -534,8 +544,13 @@ S32 LLFontGL::maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_ch
in_word = TRUE;
}
}
-
- LLFontGlyphInfo* fgi = mFontFreetype->getGlyphInfo(wch);
+
+ LLFontGlyphInfo* fgi = next_glyph;
+ next_glyph = NULL;
+ if(!fgi)
+ {
+ fgi = mFontFreetype->getGlyphInfo(wch);
+ }
// account for glyphs that run beyond the starting point for the next glyphs
width_padding = llmax( 0.f, // always use positive padding amount
@@ -554,7 +569,8 @@ S32 LLFontGL::maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_ch
if (((i+1) < max_chars) && wchars[i+1])
{
// Kern this puppy.
- cur_x += mFontFreetype->getXKerning(wch, wchars[i+1]);
+ next_glyph = mFontFreetype->getGlyphInfo(wchars[i+1]);
+ cur_x += mFontFreetype->getXKerning(fgi, next_glyph);
}
// Round after kerning.
@@ -657,9 +673,11 @@ S32 LLFontGL::charFromPixelOffset(const llwchar* wchars, S32 begin_offset, F32 t
target_x *= sScaleX;
// max_chars is S32_MAX by default, so make sure we don't get overflow
- const S32 max_index = begin_offset + llmin(S32_MAX - begin_offset, max_chars);
+ const S32 max_index = begin_offset + llmin(S32_MAX - begin_offset, max_chars - 1);
F32 scaled_max_pixels = max_pixels * sScaleX;
+
+ const LLFontGlyphInfo* next_glyph = NULL;
S32 pos;
for (pos = begin_offset; pos < max_index; pos++)
@@ -669,7 +687,15 @@ S32 LLFontGL::charFromPixelOffset(const llwchar* wchars, S32 begin_offset, F32 t
{
break; // done
}
- F32 char_width = mFontFreetype->getXAdvance(wch);
+
+ const LLFontGlyphInfo* glyph = next_glyph;
+ next_glyph = NULL;
+ if(!glyph)
+ {
+ glyph = mFontFreetype->getGlyphInfo(wch);
+ }
+
+ F32 char_width = mFontFreetype->getXAdvance(glyph);
if (round)
{
@@ -695,11 +721,12 @@ S32 LLFontGL::charFromPixelOffset(const llwchar* wchars, S32 begin_offset, F32 t
if (((pos + 1) < max_index)
&& (wchars[(pos + 1)]))
{
- llwchar next_char = wchars[pos + 1];
// Kern this puppy.
- cur_x += mFontFreetype->getXKerning(wch, next_char);
+ next_glyph = mFontFreetype->getGlyphInfo(wchars[pos + 1]);
+ cur_x += mFontFreetype->getXKerning(glyph, next_glyph);
}
+
// Round after kerning.
cur_x = llround(cur_x);
}
diff --git a/indra/llrender/llfontregistry.cpp b/indra/llrender/llfontregistry.cpp
index 7a3d6ec4f2..e619f89e1d 100644
--- a/indra/llrender/llfontregistry.cpp
+++ b/indra/llrender/llfontregistry.cpp
@@ -469,6 +469,8 @@ LLFontGL *LLFontRegistry::createFont(const LLFontDescriptor& desc)
else
{
fontlist.push_back(fontp->mFontFreetype);
+ delete fontp;
+ fontp = NULL;
}
}
}
diff --git a/indra/llrender/llimagegl.cpp b/indra/llrender/llimagegl.cpp
index 36ac3ff119..2d408f8e10 100644
--- a/indra/llrender/llimagegl.cpp
+++ b/indra/llrender/llimagegl.cpp
@@ -105,9 +105,9 @@ void check_all_images()
}
}
-void LLImageGL::checkTexSize() const
+void LLImageGL::checkTexSize(bool forced) const
{
- if (gDebugGL && mTarget == GL_TEXTURE_2D)
+ if ((forced || gDebugGL) && mTarget == GL_TEXTURE_2D)
{
GLint texname;
glGetIntegerv(GL_TEXTURE_BINDING_2D, &texname);
@@ -129,6 +129,8 @@ void LLImageGL::checkTexSize() const
glGetTexLevelParameteriv(mTarget, 0, GL_TEXTURE_WIDTH, (GLint*)&x);
glGetTexLevelParameteriv(mTarget, 0, GL_TEXTURE_HEIGHT, (GLint*)&y) ;
stop_glerror() ;
+ llcallstacks << "w: " << x << " h: " << y << llcallstacksendl ;
+
if(!x || !y)
{
return ;
@@ -138,11 +140,13 @@ void LLImageGL::checkTexSize() const
error = TRUE;
if (gDebugSession)
{
- gFailLog << "wrong texture size and discard level!" << std::endl;
+ gFailLog << "wrong texture size and discard level!" <<
+ mWidth << " Height: " << mHeight << " Current Level: " << mCurrentDiscardLevel << std::endl;
}
else
{
- llerrs << "wrong texture size and discard level!" << llendl ;
+ llerrs << "wrong texture size and discard level: width: " <<
+ mWidth << " Height: " << mHeight << " Current Level: " << mCurrentDiscardLevel << llendl ;
}
}
@@ -1044,7 +1048,9 @@ BOOL LLImageGL::setSubImageFromFrameBuffer(S32 fb_x, S32 fb_y, S32 x_pos, S32 y_
{
if (gGL.getTexUnit(0)->bind(this, false, true))
{
- //checkTexSize() ;
+ checkTexSize(true) ;
+ llcallstacks << fb_x << " : " << fb_y << " : " << x_pos << " : " << y_pos << " : " << width << " : " << height << llcallstacksendl ;
+
glCopyTexSubImage2D(GL_TEXTURE_2D, 0, fb_x, fb_y, x_pos, y_pos, width, height);
mGLTextureCreated = true;
stop_glerror();
@@ -1699,8 +1705,8 @@ void LLImageGL::updatePickMask(S32 width, S32 height, const U8* data_in)
U32 size = pick_width * pick_height;
size = (size + 7) / 8; // pixelcount-to-bits
mPickMask = new U8[size];
- mPickMaskWidth = pick_width;
- mPickMaskHeight = pick_height;
+ mPickMaskWidth = pick_width - 1;
+ mPickMaskHeight = pick_height - 1;
memset(mPickMask, 0, sizeof(U8) * size);
@@ -1732,31 +1738,41 @@ BOOL LLImageGL::getMask(const LLVector2 &tc)
if (mPickMask)
{
- F32 u = tc.mV[0] - floorf(tc.mV[0]);
- F32 v = tc.mV[1] - floorf(tc.mV[1]);
+ F32 u,v;
+ if (LL_LIKELY(tc.isFinite()))
+ {
+ u = tc.mV[0] - floorf(tc.mV[0]);
+ v = tc.mV[1] - floorf(tc.mV[1]);
+ }
+ else
+ {
+ LL_WARNS_ONCE("render") << "Ugh, non-finite u/v in mask pick" << LL_ENDL;
+ u = v = 0.f;
+ // removing assert per EXT-4388
+ // llassert(false);
+ }
if (LL_UNLIKELY(u < 0.f || u > 1.f ||
v < 0.f || v > 1.f))
{
LL_WARNS_ONCE("render") << "Ugh, u/v out of range in image mask pick" << LL_ENDL;
u = v = 0.f;
- llassert(false);
+ // removing assert per EXT-4388
+ // llassert(false);
}
- llassert(mPickMaskWidth > 0 && mPickMaskHeight > 0);
-
S32 x = llfloor(u * mPickMaskWidth);
S32 y = llfloor(v * mPickMaskHeight);
- if (LL_UNLIKELY(x >= mPickMaskWidth))
+ if (LL_UNLIKELY(x > mPickMaskWidth))
{
LL_WARNS_ONCE("render") << "Ooh, width overrun on pick mask read, that coulda been bad." << LL_ENDL;
- x = llmax(0, mPickMaskWidth-1);
+ x = llmax((U16)0, mPickMaskWidth);
}
- if (LL_UNLIKELY(y >= mPickMaskHeight))
+ if (LL_UNLIKELY(y > mPickMaskHeight))
{
LL_WARNS_ONCE("render") << "Ooh, height overrun on pick mask read, that woulda been bad." << LL_ENDL;
- y = llmax(0, mPickMaskHeight-1);
+ y = llmax((U16)0, mPickMaskHeight);
}
S32 idx = y*mPickMaskWidth+x;
diff --git a/indra/llrender/llimagegl.h b/indra/llrender/llimagegl.h
index f0870c3fc4..41239d24c8 100644
--- a/indra/llrender/llimagegl.h
+++ b/indra/llrender/llimagegl.h
@@ -157,7 +157,7 @@ public:
void updatePickMask(S32 width, S32 height, const U8* data_in);
BOOL getMask(const LLVector2 &tc);
- void checkTexSize() const ;
+ void checkTexSize(bool forced = false) const ;
// Sets the addressing mode used to sample the texture
// (such as wrapping, mirrored wrapping, and clamp)
diff --git a/indra/llrender/llrender.cpp b/indra/llrender/llrender.cpp
index 595b8577ff..c3540a717c 100644
--- a/indra/llrender/llrender.cpp
+++ b/indra/llrender/llrender.cpp
@@ -49,6 +49,9 @@ F64 gGLLastProjection[16];
F64 gGLProjection[16];
S32 gGLViewport[4];
+U32 LLRender::sUICalls = 0;
+U32 LLRender::sUIVerts = 0;
+
static const U32 LL_NUM_TEXTURE_LAYERS = 16;
static GLenum sGLTextureType[] =
@@ -90,7 +93,9 @@ static GLenum sGLBlendFactor[] =
GL_DST_ALPHA,
GL_SRC_ALPHA,
GL_ONE_MINUS_DST_ALPHA,
- GL_ONE_MINUS_SRC_ALPHA
+ GL_ONE_MINUS_SRC_ALPHA,
+
+ GL_ZERO // 'BF_UNDEF'
};
LLTexUnit::LLTexUnit(S32 index)
@@ -116,6 +121,8 @@ void LLTexUnit::refreshState(void)
// We set dirty to true so that the tex unit knows to ignore caching
// and we reset the cached tex unit state
+ gGL.flush();
+
glActiveTextureARB(GL_TEXTURE0_ARB + mIndex);
if (mCurrTexType != TT_NONE)
{
@@ -145,6 +152,7 @@ void LLTexUnit::activate(void)
if ((S32)gGL.mCurrTextureUnitIndex != mIndex || gGL.mDirty)
{
+ gGL.flush();
glActiveTextureARB(GL_TEXTURE0_ARB + mIndex);
gGL.mCurrTextureUnitIndex = mIndex;
}
@@ -176,6 +184,7 @@ void LLTexUnit::disable(void)
{
activate();
unbind(mCurrTexType);
+ gGL.flush();
glDisable(sGLTextureType[mCurrTexType]);
mCurrTexType = TT_NONE;
}
@@ -255,10 +264,9 @@ bool LLTexUnit::bind(LLImageGL* texture, bool for_rendering, bool forceBind)
return false ;
}
- gGL.flush();
-
if ((mCurrTexture != texture->getTexName()) || forceBind)
{
+ gGL.flush();
activate();
enable(texture->getTarget());
mCurrTexture = texture->getTexName();
@@ -382,6 +390,8 @@ void LLTexUnit::setTextureAddressMode(eTextureAddressMode mode)
{
if (mIndex < 0 || mCurrTexture == 0) return;
+ gGL.flush();
+
activate();
glTexParameteri (sGLTextureType[mCurrTexType], GL_TEXTURE_WRAP_S, sGLAddressMode[mode]);
@@ -396,6 +406,8 @@ void LLTexUnit::setTextureFilteringOption(LLTexUnit::eTextureFilterOptions optio
{
if (mIndex < 0 || mCurrTexture == 0) return;
+ gGL.flush();
+
if (option == TFO_POINT)
{
glTexParameteri(sGLTextureType[mCurrTexType], GL_TEXTURE_MAG_FILTER, GL_NEAREST);
@@ -445,6 +457,8 @@ void LLTexUnit::setTextureBlendType(eTextureBlendType type)
return;
}
+ gGL.flush();
+
activate();
mCurrBlendType = type;
S32 scale_amount = 1;
@@ -561,6 +575,7 @@ void LLTexUnit::setTextureCombiner(eTextureBlendOp op, eTextureBlendSrc src1, eT
if (mCurrBlendType != TB_COMBINE || gGL.mDirty)
{
mCurrBlendType = TB_COMBINE;
+ gGL.flush();
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
}
@@ -571,6 +586,8 @@ void LLTexUnit::setTextureCombiner(eTextureBlendOp op, eTextureBlendSrc src1, eT
return;
}
+ gGL.flush();
+
// Get the gl source enums according to the eTextureBlendSrc sources passed in
GLint source1 = getTextureSource(src1);
GLint source2 = getTextureSource(src2);
@@ -703,6 +720,7 @@ void LLTexUnit::setColorScale(S32 scale)
if (mCurrColorScale != scale || gGL.mDirty)
{
mCurrColorScale = scale;
+ gGL.flush();
glTexEnvi( GL_TEXTURE_ENV, GL_RGB_SCALE, scale );
}
}
@@ -712,6 +730,7 @@ void LLTexUnit::setAlphaScale(S32 scale)
if (mCurrAlphaScale != scale || gGL.mDirty)
{
mCurrAlphaScale = scale;
+ gGL.flush();
glTexEnvi( GL_TEXTURE_ENV, GL_ALPHA_SCALE, scale );
}
}
@@ -759,6 +778,8 @@ LLRender::LLRender()
mCurrAlphaFunc = CF_DEFAULT;
mCurrAlphaFuncVal = 0.01f;
+ mCurrBlendSFactor = BF_UNDEF;
+ mCurrBlendDFactor = BF_UNDEF;
}
LLRender::~LLRender()
@@ -821,6 +842,88 @@ void LLRender::popMatrix()
glPopMatrix();
}
+void LLRender::translateUI(F32 x, F32 y, F32 z)
+{
+ if (mUIOffset.empty())
+ {
+ llerrs << "Need to push a UI translation frame before offsetting" << llendl;
+ }
+
+ mUIOffset.front().mV[0] += x;
+ mUIOffset.front().mV[1] += y;
+ mUIOffset.front().mV[2] += z;
+}
+
+void LLRender::scaleUI(F32 x, F32 y, F32 z)
+{
+ if (mUIScale.empty())
+ {
+ llerrs << "Need to push a UI transformation frame before scaling." << llendl;
+ }
+
+ mUIScale.front().scaleVec(LLVector3(x,y,z));
+}
+
+void LLRender::pushUIMatrix()
+{
+ if (mUIOffset.empty())
+ {
+ mUIOffset.push_front(LLVector3(0,0,0));
+ }
+ else
+ {
+ mUIOffset.push_front(mUIOffset.front());
+ }
+
+ if (mUIScale.empty())
+ {
+ mUIScale.push_front(LLVector3(1,1,1));
+ }
+ else
+ {
+ mUIScale.push_front(mUIScale.front());
+ }
+}
+
+void LLRender::popUIMatrix()
+{
+ if (mUIOffset.empty())
+ {
+ llerrs << "UI offset stack blown." << llendl;
+ }
+ mUIOffset.pop_front();
+ mUIScale.pop_front();
+}
+
+LLVector3 LLRender::getUITranslation()
+{
+ if (mUIOffset.empty())
+ {
+ llerrs << "UI offset stack empty." << llendl;
+ }
+ return mUIOffset.front();
+}
+
+LLVector3 LLRender::getUIScale()
+{
+ if (mUIScale.empty())
+ {
+ llerrs << "UI scale stack empty." << llendl;
+ }
+ return mUIScale.front();
+}
+
+
+void LLRender::loadUIIdentity()
+{
+ if (mUIOffset.empty())
+ {
+ llerrs << "Need to push UI translation frame before clearing offset." << llendl;
+ }
+ mUIOffset.front().setVec(0,0,0);
+ mUIScale.front().setVec(1,1,1);
+}
+
void LLRender::setColorMask(bool writeColor, bool writeAlpha)
{
setColorMask(writeColor, writeColor, writeColor, writeAlpha);
@@ -843,29 +946,28 @@ void LLRender::setColorMask(bool writeColorR, bool writeColorG, bool writeColorB
void LLRender::setSceneBlendType(eBlendType type)
{
- flush();
switch (type)
{
case BT_ALPHA:
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ blendFunc(BF_SOURCE_ALPHA, BF_ONE_MINUS_SOURCE_ALPHA);
break;
case BT_ADD:
- glBlendFunc(GL_ONE, GL_ONE);
+ blendFunc(BF_ONE, BF_ONE);
break;
case BT_ADD_WITH_ALPHA:
- glBlendFunc(GL_SRC_ALPHA, GL_ONE);
+ blendFunc(BF_SOURCE_ALPHA, BF_ONE);
break;
case BT_MULT:
- glBlendFunc(GL_DST_COLOR, GL_ZERO);
+ blendFunc(BF_DEST_COLOR, BF_ZERO);
break;
case BT_MULT_ALPHA:
- glBlendFunc(GL_DST_ALPHA, GL_ZERO);
+ blendFunc(BF_DEST_ALPHA, BF_ZERO);
break;
case BT_MULT_X2:
- glBlendFunc(GL_DST_COLOR, GL_SRC_COLOR);
+ blendFunc(BF_DEST_COLOR, BF_SOURCE_COLOR);
break;
case BT_REPLACE:
- glBlendFunc(GL_ONE, GL_ZERO);
+ blendFunc(BF_ONE, BF_ZERO);
break;
default:
llerrs << "Unknown Scene Blend Type: " << type << llendl;
@@ -891,8 +993,15 @@ void LLRender::setAlphaRejectSettings(eCompareFunc func, F32 value)
void LLRender::blendFunc(eBlendFactor sfactor, eBlendFactor dfactor)
{
- flush();
- glBlendFunc(sGLBlendFactor[sfactor], sGLBlendFactor[dfactor]);
+ llassert(sfactor < BF_UNDEF);
+ llassert(dfactor < BF_UNDEF);
+ if (mCurrBlendSFactor != sfactor || mCurrBlendDFactor != dfactor)
+ {
+ mCurrBlendSFactor = sfactor;
+ mCurrBlendDFactor = dfactor;
+ flush();
+ glBlendFunc(sGLBlendFactor[sfactor], sGLBlendFactor[dfactor]);
+ }
}
LLTexUnit* LLRender::getTexUnit(U32 index)
@@ -1012,6 +1121,39 @@ void LLRender::flush()
}
#endif
+ if (!mUIOffset.empty())
+ {
+ sUICalls++;
+ sUIVerts += mCount;
+ }
+
+ if (gDebugGL)
+ {
+ if (mMode == LLRender::QUADS)
+ {
+ if (mCount%4 != 0)
+ {
+ llerrs << "Incomplete quad rendered." << llendl;
+ }
+ }
+
+ if (mMode == LLRender::TRIANGLES)
+ {
+ if (mCount%3 != 0)
+ {
+ llerrs << "Incomplete triangle rendered." << llendl;
+ }
+ }
+
+ if (mMode == LLRender::LINES)
+ {
+ if (mCount%2 != 0)
+ {
+ llerrs << "Incomplete line rendered." << llendl;
+ }
+ }
+ }
+
mBuffer->setBuffer(immediate_mask);
mBuffer->drawArrays(mMode, 0, mCount);
@@ -1031,7 +1173,16 @@ void LLRender::vertex3f(const GLfloat& x, const GLfloat& y, const GLfloat& z)
return;
}
- mVerticesp[mCount] = LLVector3(x,y,z);
+ if (mUIOffset.empty())
+ {
+ mVerticesp[mCount] = LLVector3(x,y,z);
+ }
+ else
+ {
+ LLVector3 vert = (LLVector3(x,y,z)+mUIOffset.front()).scaledVec(mUIScale.front());
+ mVerticesp[mCount] = vert;
+ }
+
mCount++;
if (mCount < 4096)
{
diff --git a/indra/llrender/llrender.h b/indra/llrender/llrender.h
index 0121a190ee..a90fbd4a5c 100644
--- a/indra/llrender/llrender.h
+++ b/indra/llrender/llrender.h
@@ -270,7 +270,9 @@ public:
BF_DEST_ALPHA,
BF_SOURCE_ALPHA,
BF_ONE_MINUS_DEST_ALPHA,
- BF_ONE_MINUS_SOURCE_ALPHA
+ BF_ONE_MINUS_SOURCE_ALPHA,
+
+ BF_UNDEF
} eBlendFactor;
LLRender();
@@ -286,6 +288,14 @@ public:
void pushMatrix();
void popMatrix();
+ void translateUI(F32 x, F32 y, F32 z);
+ void scaleUI(F32 x, F32 y, F32 z);
+ void pushUIMatrix();
+ void popUIMatrix();
+ void loadUIIdentity();
+ LLVector3 getUITranslation();
+ LLVector3 getUIScale();
+
void flush();
void begin(const GLuint& mode);
@@ -333,7 +343,9 @@ public:
};
public:
-
+ static U32 sUICalls;
+ static U32 sUIVerts;
+
private:
bool mDirty;
U32 mCount;
@@ -350,7 +362,14 @@ private:
std::vector<LLTexUnit*> mTexUnits;
LLTexUnit* mDummyTexUnit;
+ eBlendFactor mCurrBlendSFactor;
+ eBlendFactor mCurrBlendDFactor;
+
F32 mMaxAnisotropy;
+
+ std::list<LLVector3> mUIOffset;
+ std::list<LLVector3> mUIScale;
+
};
extern F64 gGLModelView[16];
diff --git a/indra/llrender/llrendersphere.cpp b/indra/llrender/llrendersphere.cpp
index e22b753923..212963f270 100644
--- a/indra/llrender/llrendersphere.cpp
+++ b/indra/llrender/llrendersphere.cpp
@@ -68,45 +68,6 @@ void drawSolidSphere(GLdouble radius, GLint slices, GLint stacks)
}
-// lat = 0 is Z-axis
-// lon = 0, lat = 90 at X-axis
-void lat2xyz(LLVector3 * result, F32 lat, F32 lon)
-{
- // Convert a latitude and longitude to x,y,z on a normal sphere and return it in result
- F32 r;
- result->mV[VX] = (F32) (cos(lon * DEG_TO_RAD) * sin(lat * DEG_TO_RAD));
- result->mV[VY] = (F32) (sin(lon * DEG_TO_RAD) * sin(lat * DEG_TO_RAD));
- r = (F32) pow(result->mV[VX] * result->mV[VX] + result->mV[VY] * result->mV[VY], 0.5f);
- if (r == 1.0f)
- {
- result->mV[VZ] = 0.0f;
- }
- else
- {
- result->mV[VZ] = (F32) pow(1 - r*r, 0.5f);
- if (lat > 90.01)
- {
- result->mV[VZ] *= -1.0;
- }
- }
-}
-
-void lat2xyz_rad(LLVector3 * result, F32 lat, F32 lon)
-{
- // Convert a latitude and longitude to x,y,z on a normal sphere and return it in result
- F32 r;
- result->mV[VX] = (F32) (cos(lon) * sin(lat));
- result->mV[VY] = (F32) (sin(lon) * sin(lat));
- r = (F32) pow(result->mV[VX] * result->mV[VX] + result->mV[VY] * result->mV[VY], 0.5f);
- if (r == 1.0f)
- result->mV[VZ] = 0.0f;
- else
- {
- result->mV[VZ] = (F32) pow(1 - r*r, 0.5f);
- if (lat > F_PI_BY_TWO) result->mV[VZ] *= -1.0;
- }
-}
-
// A couple thoughts on sphere drawing:
// 1) You need more slices than stacks, but little less than 2:1
// 2) At low LOD, setting stacks to an odd number avoids a "band" around the equator, making things look smoother
@@ -181,3 +142,50 @@ void LLRenderSphere::render()
{
glCallList(mDList[0]);
}
+
+inline LLVector3 polar_to_cart(F32 latitude, F32 longitude)
+{
+ return LLVector3(sin(F_TWO_PI * latitude) * cos(F_TWO_PI * longitude),
+ sin(F_TWO_PI * latitude) * sin(F_TWO_PI * longitude),
+ cos(F_TWO_PI * latitude));
+}
+
+
+void LLRenderSphere::renderGGL()
+{
+ S32 const LATITUDE_SLICES = 20;
+ S32 const LONGITUDE_SLICES = 30;
+
+ if (mSpherePoints.empty())
+ {
+ mSpherePoints.resize(LATITUDE_SLICES + 1);
+ for (S32 lat_i = 0; lat_i < LATITUDE_SLICES + 1; lat_i++)
+ {
+ mSpherePoints[lat_i].resize(LONGITUDE_SLICES + 1);
+ for (S32 lon_i = 0; lon_i < LONGITUDE_SLICES + 1; lon_i++)
+ {
+ F32 lat = (F32)lat_i / LATITUDE_SLICES;
+ F32 lon = (F32)lon_i / LONGITUDE_SLICES;
+
+ mSpherePoints[lat_i][lon_i] = polar_to_cart(lat, lon);
+ }
+ }
+ }
+
+ gGL.begin(LLRender::TRIANGLES);
+
+ for (S32 lat_i = 0; lat_i < LATITUDE_SLICES; lat_i++)
+ {
+ for (S32 lon_i = 0; lon_i < LONGITUDE_SLICES; lon_i++)
+ {
+ gGL.vertex3fv(mSpherePoints[lat_i][lon_i].mV);
+ gGL.vertex3fv(mSpherePoints[lat_i][lon_i+1].mV);
+ gGL.vertex3fv(mSpherePoints[lat_i+1][lon_i].mV);
+
+ gGL.vertex3fv(mSpherePoints[lat_i+1][lon_i].mV);
+ gGL.vertex3fv(mSpherePoints[lat_i][lon_i+1].mV);
+ gGL.vertex3fv(mSpherePoints[lat_i+1][lon_i+1].mV);
+ }
+ }
+ gGL.end();
+}
diff --git a/indra/llrender/llrendersphere.h b/indra/llrender/llrendersphere.h
index 617ee3e12e..ebc71b6146 100644
--- a/indra/llrender/llrendersphere.h
+++ b/indra/llrender/llrendersphere.h
@@ -52,6 +52,10 @@ public:
void cleanupGL();
void render(F32 pixel_area); // of a box of size 1.0 at that position
void render(); // render at highest LOD
+ void renderGGL(); // render using LLRender
+
+private:
+ std::vector< std::vector<LLVector3> > mSpherePoints;
};
extern LLRenderSphere gSphere;
diff --git a/indra/llui/CMakeLists.txt b/indra/llui/CMakeLists.txt
index ce068618e2..12df9ccae4 100644
--- a/indra/llui/CMakeLists.txt
+++ b/indra/llui/CMakeLists.txt
@@ -52,6 +52,7 @@ set(llui_SOURCE_FILES
llkeywords.cpp
lllayoutstack.cpp
lllineeditor.cpp
+ llloadingindicator.cpp
lllocalcliprect.cpp
llmenubutton.cpp
llmenugl.cpp
@@ -90,6 +91,8 @@ set(llui_SOURCE_FILES
lltextbox.cpp
lltexteditor.cpp
lltextparser.cpp
+ lltextutil.cpp
+ lltextvalidate.cpp
lltransutil.cpp
lltoggleablemenu.cpp
lltooltip.cpp
@@ -143,6 +146,7 @@ set(llui_HEADER_FILES
lllayoutstack.h
lllazyvalue.h
lllineeditor.h
+ llloadingindicator.h
lllocalcliprect.h
llmenubutton.h
llmenugl.h
@@ -182,6 +186,8 @@ set(llui_HEADER_FILES
lltextbox.h
lltexteditor.h
lltextparser.h
+ lltextutil.h
+ lltextvalidate.h
lltoggleablemenu.h
lltooltip.h
lltransutil.h
@@ -207,6 +213,16 @@ set(llui_HEADER_FILES
set_source_files_properties(${llui_HEADER_FILES}
PROPERTIES HEADER_FILE_ONLY TRUE)
+SET(llurlentry_TEST_DEPENDENCIES
+ llurlmatch.cpp
+ llurlregistry.cpp
+ )
+
+set_source_files_properties(llurlentry.cpp
+ PROPERTIES LL_TEST_ADDITIONAL_SOURCE_FILES
+ "${llurlentry_TEST_DEPENDENCIES}"
+ )
+
list(APPEND llui_SOURCE_FILES ${llui_HEADER_FILES})
add_library (llui ${llui_SOURCE_FILES})
diff --git a/indra/llui/llaccordionctrl.cpp b/indra/llui/llaccordionctrl.cpp
index d0c73fbfbc..237d42090f 100644
--- a/indra/llui/llaccordionctrl.cpp
+++ b/indra/llui/llaccordionctrl.cpp
@@ -65,8 +65,14 @@ LLAccordionCtrl::LLAccordionCtrl(const Params& params):LLPanel(params)
, mFitParent(params.fit_parent)
, mAutoScrolling( false )
, mAutoScrollRate( 0.f )
+ , mSelectedTab( NULL )
+ , mTabComparator( NULL )
+ , mNoVisibleTabsHelpText(NULL)
+ , mNoVisibleTabsOrigString(params.no_visible_tabs_text.initial_value().asString())
{
- mSingleExpansion = params.single_expansion;
+ initNoTabsWidget(params.no_matched_tabs_text);
+
+ mSingleExpansion = params.single_expansion;
if(mFitParent && !mSingleExpansion)
{
llinfos << "fit_parent works best when combined with single_expansion" << llendl;
@@ -76,7 +82,11 @@ LLAccordionCtrl::LLAccordionCtrl(const Params& params):LLPanel(params)
LLAccordionCtrl::LLAccordionCtrl() : LLPanel()
, mAutoScrolling( false )
, mAutoScrollRate( 0.f )
+ , mSelectedTab( NULL )
+ , mNoVisibleTabsHelpText(NULL)
{
+ initNoTabsWidget(LLTextBox::Params());
+
mSingleExpansion = false;
mFitParent = false;
LLUICtrlFactory::getInstance()->buildPanel(this, "accordion_parent.xml");
@@ -118,7 +128,6 @@ BOOL LLAccordionCtrl::postBuild()
scrollbar_size,
getRect().getHeight() - 1);
-
LLScrollbar::Params sbparams;
sbparams.name("scrollable vertical");
sbparams.rect(scroll_rect);
@@ -167,6 +176,8 @@ BOOL LLAccordionCtrl::postBuild()
}
}
+ updateNoTabsHelpTextVisibility();
+
return TRUE;
}
@@ -186,8 +197,15 @@ void LLAccordionCtrl::reshape(S32 width, S32 height, BOOL called_from_parent)
rcLocal.mRight = rcLocal.mLeft + width;
rcLocal.mTop = rcLocal.mBottom + height;
+ // get textbox a chance to reshape its content
+ mNoVisibleTabsHelpText->reshape(width, height, called_from_parent);
+
setRect(rcLocal);
+ // assume that help text is always fit accordion.
+ // necessary text paddings can be set via h_pad and v_pad
+ mNoVisibleTabsHelpText->setRect(getLocalRect());
+
arrange();
}
@@ -330,44 +348,130 @@ void LLAccordionCtrl::addCollapsibleCtrl(LLView* view)
LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(view);
if(!accordion_tab)
return;
- if(std::find(getChildList()->begin(),getChildList()->end(),accordion_tab) == getChildList()->end())
+ if(std::find(beginChild(), endChild(), accordion_tab) == endChild())
addChild(accordion_tab);
mAccordionTabs.push_back(accordion_tab);
-
+
accordion_tab->setDropDownStateChangedCallback( boost::bind(&LLAccordionCtrl::onCollapseCtrlCloseOpen, this, mAccordionTabs.size() - 1) );
+ arrange();
+}
+
+void LLAccordionCtrl::removeCollapsibleCtrl(LLView* view)
+{
+ LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(view);
+ if(!accordion_tab)
+ return;
+
+ if(std::find(beginChild(), endChild(), accordion_tab) != endChild())
+ removeChild(accordion_tab);
+ for (std::vector<LLAccordionCtrlTab*>::iterator iter = mAccordionTabs.begin();
+ iter != mAccordionTabs.end(); ++iter)
+ {
+ if (accordion_tab == (*iter))
+ {
+ mAccordionTabs.erase(iter);
+ break;
+ }
+ }
}
+void LLAccordionCtrl::initNoTabsWidget(const LLTextBox::Params& tb_params)
+{
+ LLTextBox::Params tp = tb_params;
+ tp.rect(getLocalRect());
+ mNoMatchedTabsOrigString = tp.initial_value().asString();
+ mNoVisibleTabsHelpText = LLUICtrlFactory::create<LLTextBox>(tp, this);
+}
-void LLAccordionCtrl::arrange()
+void LLAccordionCtrl::updateNoTabsHelpTextVisibility()
{
- if( mAccordionTabs.size() == 0)
+ bool visible_exists = false;
+ std::vector<LLAccordionCtrlTab*>::const_iterator it = mAccordionTabs.begin();
+ const std::vector<LLAccordionCtrlTab*>::const_iterator it_end = mAccordionTabs.end();
+ for (; it != it_end; ++it)
{
- //We do not arrange if we do not have what should be arranged
- return;
+ if ((*it)->getVisible())
+ {
+ visible_exists = true;
+ break;
+ }
}
- //Calculate params
+ mNoVisibleTabsHelpText->setVisible(!visible_exists);
+}
+
+void LLAccordionCtrl::arrangeSinge()
+{
S32 panel_left = BORDER_MARGIN; // Margin from left side of Splitter
S32 panel_top = getRect().getHeight() - BORDER_MARGIN; // Top coordinate of the first panel
S32 panel_width = getRect().getWidth() - 4; // Top coordinate of the first panel
+ S32 panel_height;
-
- if(mAccordionTabs.size() == 1)
+ S32 collapsed_height = 0;
+
+ for(size_t i=0;i<mAccordionTabs.size();++i)
{
- LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[0]);
-
- LLRect panel_rect = accordion_tab->getRect();
+ LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]);
- S32 panel_height = getRect().getHeight() - 2*BORDER_MARGIN;
+ if(accordion_tab->getVisible() == false) //skip hidden accordion tabs
+ continue;
+ if(!accordion_tab->isExpanded() )
+ {
+ collapsed_height+=mAccordionTabs[i]->getRect().getHeight();
+ }
+ }
- ctrlSetLeftTopAndSize(accordion_tab,panel_rect.mLeft,panel_top,panel_width,panel_height);
+ S32 expanded_height = getRect().getHeight() - BORDER_MARGIN - collapsed_height;
+
+ for(size_t i=0;i<mAccordionTabs.size();++i)
+ {
+ LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]);
- show_hide_scrollbar(getRect().getWidth(),getRect().getHeight());
- return;
+ if(accordion_tab->getVisible() == false) //skip hidden accordion tabs
+ continue;
+ if(!accordion_tab->isExpanded() )
+ {
+ panel_height = accordion_tab->getRect().getHeight();
+ }
+ else
+ {
+ if(mFitParent)
+ {
+ panel_height = expanded_height;
+ }
+ else
+ {
+ if(accordion_tab->getAccordionView())
+ {
+ panel_height = accordion_tab->getAccordionView()->getRect().getHeight() +
+ accordion_tab->getHeaderHeight() + 2*BORDER_MARGIN;
+ }
+ else
+ {
+ panel_height = accordion_tab->getRect().getHeight();
+ }
+ }
+ }
+
+ // make sure at least header is shown
+ panel_height = llmax(panel_height, accordion_tab->getHeaderHeight());
+ ctrlSetLeftTopAndSize(mAccordionTabs[i], panel_left, panel_top, panel_width, panel_height);
+ panel_top-=mAccordionTabs[i]->getRect().getHeight();
}
+ show_hide_scrollbar(getRect().getWidth(), getRect().getHeight());
+ updateLayout(getRect().getWidth(), getRect().getHeight());
+}
+
+void LLAccordionCtrl::arrangeMultiple()
+{
+ S32 panel_left = BORDER_MARGIN; // Margin from left side of Splitter
+ S32 panel_top = getRect().getHeight() - BORDER_MARGIN; // Top coordinate of the first panel
+ S32 panel_width = getRect().getWidth() - 4; // Top coordinate of the first panel
+
+ //Calculate params
for(size_t i = 0; i < mAccordionTabs.size(); i++ )
{
LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]);
@@ -415,7 +519,44 @@ void LLAccordionCtrl::arrange()
show_hide_scrollbar(getRect().getWidth(),getRect().getHeight());
updateLayout(getRect().getWidth(),getRect().getHeight());
+}
+
+
+void LLAccordionCtrl::arrange()
+{
+ updateNoTabsHelpTextVisibility();
+
+ if( mAccordionTabs.size() == 0)
+ {
+ //We do not arrange if we do not have what should be arranged
+ return;
+ }
+
+ if(mAccordionTabs.size() == 1)
+ {
+ S32 panel_top = getRect().getHeight() - BORDER_MARGIN; // Top coordinate of the first panel
+ S32 panel_width = getRect().getWidth() - 4; // Top coordinate of the first panel
+
+ LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[0]);
+
+ LLRect panel_rect = accordion_tab->getRect();
+
+ S32 panel_height = getRect().getHeight() - 2*BORDER_MARGIN;
+
+ if (accordion_tab->getFitParent())
+ panel_height = accordion_tab->getRect().getHeight();
+ ctrlSetLeftTopAndSize(accordion_tab,panel_rect.mLeft,panel_top,panel_width,panel_height);
+
+ show_hide_scrollbar(getRect().getWidth(),getRect().getHeight());
+ return;
+
+ }
+
+ if(mSingleExpansion)
+ arrangeSinge ();
+ else
+ arrangeMultiple ();
}
//---------------------------------------------------------------------------------
@@ -575,14 +716,44 @@ S32 LLAccordionCtrl::notifyParent(const LLSD& info)
LLAccordionCtrlTab* accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]);
if(accordion_tab->hasFocus() && i>0)
{
+ bool prev_visible_tab_found = false;
while(i>0)
{
if(mAccordionTabs[--i]->getVisible())
+ {
+ prev_visible_tab_found = true;
break;
+ }
}
-
- accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]);
- accordion_tab->notify(LLSD().with("action","select_last"));
+
+ if (prev_visible_tab_found)
+ {
+ accordion_tab = dynamic_cast<LLAccordionCtrlTab*>(mAccordionTabs[i]);
+ accordion_tab->notify(LLSD().with("action","select_last"));
+ return 1;
+ }
+ break;
+ }
+ }
+ return 0;
+ }
+ else if(str_action == "select_current")
+ {
+ for(size_t i=0;i<mAccordionTabs.size();++i)
+ {
+ // Set selection to the currently focused tab.
+ if(mAccordionTabs[i]->hasFocus())
+ {
+ if (mAccordionTabs[i] != mSelectedTab)
+ {
+ if (mSelectedTab)
+ {
+ mSelectedTab->setSelected(false);
+ }
+ mSelectedTab = mAccordionTabs[i];
+ mSelectedTab->setSelected(true);
+ }
+
return 1;
}
}
@@ -612,6 +783,20 @@ S32 LLAccordionCtrl::notifyParent(const LLSD& info)
}
return 1;
}
+ else if (info.has("child_visibility_change"))
+ {
+ BOOL new_visibility = info["child_visibility_change"];
+ if (new_visibility)
+ {
+ // there is at least one visible tab
+ mNoVisibleTabsHelpText->setVisible(FALSE);
+ }
+ else
+ {
+ // it could be the latest visible tab, check all of them
+ updateNoTabsHelpTextVisibility();
+ }
+ }
return LLPanel::notifyParent(info);
}
void LLAccordionCtrl::reset ()
@@ -620,6 +805,46 @@ void LLAccordionCtrl::reset ()
mScrollbar->setDocPos(0);
}
+void LLAccordionCtrl::sort()
+{
+ if (!mTabComparator)
+ {
+ llwarns << "No comparator specified for sorting accordion tabs." << llendl;
+ return;
+ }
+
+ std::sort(mAccordionTabs.begin(), mAccordionTabs.end(), LLComparatorAdaptor(*mTabComparator));
+ arrange();
+}
+
+void LLAccordionCtrl::setFilterSubString(const std::string& filter_string)
+{
+ LLStringUtil::format_map_t args;
+ args["[SEARCH_TERM]"] = LLURI::escape(filter_string);
+ std::string text = filter_string.empty() ? mNoVisibleTabsOrigString : mNoMatchedTabsOrigString;
+ LLStringUtil::format(text, args);
+
+ mNoVisibleTabsHelpText->setValue(text);
+}
+
+const LLAccordionCtrlTab* LLAccordionCtrl::getExpandedTab() const
+{
+ typedef std::vector<LLAccordionCtrlTab*>::const_iterator tabs_const_iterator;
+
+ const LLAccordionCtrlTab* result = 0;
+
+ for (tabs_const_iterator i = mAccordionTabs.begin(); i != mAccordionTabs.end(); ++i)
+ {
+ if ((*i)->isExpanded())
+ {
+ result = *i;
+ break;
+ }
+ }
+
+ return result;
+}
+
S32 LLAccordionCtrl::calcExpandedTabHeight(S32 tab_index /* = 0 */, S32 available_height /* = 0 */)
{
if(tab_index < 0)
diff --git a/indra/llui/llaccordionctrl.h b/indra/llui/llaccordionctrl.h
index d57a42df32..b5fdf796cd 100644
--- a/indra/llui/llaccordionctrl.h
+++ b/indra/llui/llaccordionctrl.h
@@ -34,6 +34,7 @@
#define LL_ACCORDIONCTRL_H
#include "llpanel.h"
+#include "lltextbox.h"
#include "llscrollbar.h"
#include <vector>
@@ -56,6 +57,19 @@ private:
public:
+ /**
+ * Abstract comparator for accordion tabs.
+ */
+ class LLTabComparator
+ {
+ public:
+ LLTabComparator() {};
+ virtual ~LLTabComparator() {};
+
+ /** Returns true if tab1 < tab2, false otherwise */
+ virtual bool compare(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2) const = 0;
+ };
+
struct Params
: public LLInitParam::Block<Params, LLPanel::Params>
{
@@ -64,10 +78,14 @@ public:
accordion tabs are responsible for scrolling their content.
*NOTE fit_parent works best when combined with single_expansion.
Accordion view should implement getRequiredRect() and provide valid height*/
+ Optional<LLTextBox::Params> no_matched_tabs_text;
+ Optional<LLTextBox::Params> no_visible_tabs_text;
Params()
: single_expansion("single_expansion",false)
, fit_parent("fit_parent", false)
+ , no_matched_tabs_text("no_matched_tabs_text")
+ , no_visible_tabs_text("no_visible_tabs_text")
{};
};
@@ -92,6 +110,7 @@ public:
virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
void addCollapsibleCtrl(LLView* view);
+ void removeCollapsibleCtrl(LLView* view);
void arrange();
@@ -104,7 +123,30 @@ public:
void reset ();
+ void setComparator(const LLTabComparator* comp) { mTabComparator = comp; }
+ void sort();
+
+ /**
+ * Sets filter substring as a search_term for help text when there are no any visible tabs.
+ */
+ void setFilterSubString(const std::string& filter_string);
+
+ /**
+ * This method returns the first expanded accordion tab.
+ * It is expected to be called for accordion which doesn't allow multiple
+ * tabs to be expanded. Use with care.
+ */
+ const LLAccordionCtrlTab* getExpandedTab() const;
+
+ const LLAccordionCtrlTab* getSelectedTab() const { return mSelectedTab; }
+
private:
+ void initNoTabsWidget(const LLTextBox::Params& tb_params);
+ void updateNoTabsHelpTextVisibility();
+
+ void arrangeSinge();
+ void arrangeMultiple();
+
// Calc Splitter's height that is necessary to display all child content
S32 calcRecuiredHeight();
S32 getRecuiredHeight() const { return mInnerRect.getHeight(); }
@@ -119,6 +161,21 @@ private:
BOOL autoScroll (S32 x, S32 y);
+ /**
+ * An adaptor for LLTabComparator
+ */
+ struct LLComparatorAdaptor
+ {
+ LLComparatorAdaptor(const LLTabComparator& comparator) : mComparator(comparator) {};
+
+ bool operator()(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2)
+ {
+ return mComparator.compare(tab1, tab2);
+ }
+
+ const LLTabComparator& mComparator;
+ };
+
private:
LLRect mInnerRect;
LLScrollbar* mScrollbar;
@@ -126,6 +183,13 @@ private:
bool mFitParent;
bool mAutoScrolling;
F32 mAutoScrollRate;
+ LLTextBox* mNoVisibleTabsHelpText;
+
+ std::string mNoMatchedTabsOrigString;
+ std::string mNoVisibleTabsOrigString;
+
+ LLAccordionCtrlTab* mSelectedTab;
+ const LLTabComparator* mTabComparator;
};
diff --git a/indra/llui/llaccordionctrltab.cpp b/indra/llui/llaccordionctrltab.cpp
index daa9e08f14..20e4b7867c 100644
--- a/indra/llui/llaccordionctrltab.cpp
+++ b/indra/llui/llaccordionctrltab.cpp
@@ -32,11 +32,13 @@
#include "linden_common.h"
-#include "lluictrl.h"
-
#include "llaccordionctrltab.h"
+#include "lllocalcliprect.h"
+#include "llscrollbar.h"
#include "lltextbox.h"
+#include "lltextutil.h"
+#include "lluictrl.h"
static const std::string DD_BUTTON_NAME = "dd_button";
static const std::string DD_TEXTBOX_NAME = "dd_textbox";
@@ -46,6 +48,8 @@ static const S32 HEADER_HEIGHT = 20;
static const S32 HEADER_IMAGE_LEFT_OFFSET = 5;
static const S32 HEADER_TEXT_LEFT_OFFSET = 30;
static const F32 AUTO_OPEN_TIME = 1.f;
+static const S32 VERTICAL_MULTIPLE = 16;
+static const S32 PARENT_BORDER_MARGIN = 5;
static LLDefaultChildRegistry::Register<LLAccordionCtrlTab> t1("accordion_tab");
@@ -69,7 +73,12 @@ public:
virtual BOOL postBuild();
- void setTitle(const std::string& title);
+ std::string getTitle();
+ void setTitle(const std::string& title, const std::string& hl);
+
+ void setTitleFontStyle(std::string style);
+
+ void setSelected(bool is_selected) { mIsSelected = is_selected; }
virtual void onMouseEnter(S32 x, S32 y, MASK mask);
virtual void onMouseLeave(S32 x, S32 y, MASK mask);
@@ -95,9 +104,13 @@ private:
LLPointer<LLUIImage> mImageHeaderPressed;
LLPointer<LLUIImage> mImageHeaderFocused;
+ // style saved when applying it in setTitleFontStyle
+ LLStyle::Params mStyleParams;
+
LLUIColor mHeaderBGColor;
bool mNeedsHighlight;
+ bool mIsSelected;
LLFrameTimer mAutoOpenTimer;
};
@@ -110,7 +123,8 @@ LLAccordionCtrlTab::LLAccordionCtrlTabHeader::LLAccordionCtrlTabHeader(
const LLAccordionCtrlTabHeader::Params& p)
: LLUICtrl(p)
, mHeaderBGColor(p.header_bg_color())
-,mNeedsHighlight(false),
+, mNeedsHighlight(false)
+, mIsSelected(false),
mImageCollapsed(p.header_collapse_img),
mImageCollapsedPressed(p.header_collapse_img_pressed),
mImageExpanded(p.header_expand_img),
@@ -143,10 +157,39 @@ BOOL LLAccordionCtrlTab::LLAccordionCtrlTabHeader::postBuild()
return TRUE;
}
-void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::setTitle(const std::string& title)
+std::string LLAccordionCtrlTab::LLAccordionCtrlTabHeader::getTitle()
+{
+ if(mHeaderTextbox)
+ {
+ return mHeaderTextbox->getText();
+ }
+ else
+ {
+ return LLStringUtil::null;
+ }
+}
+
+void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::setTitle(const std::string& title, const std::string& hl)
{
if(mHeaderTextbox)
- mHeaderTextbox->setText(title);
+ {
+ LLTextUtil::textboxSetHighlightedVal(
+ mHeaderTextbox,
+ mStyleParams,
+ title,
+ hl);
+ }
+}
+
+void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::setTitleFontStyle(std::string style)
+{
+ if (mHeaderTextbox)
+ {
+ std::string text = mHeaderTextbox->getText();
+ mStyleParams.font(mHeaderTextbox->getDefaultFont());
+ mStyleParams.font.style(style);
+ mHeaderTextbox->setText(text, mStyleParams);
+ }
}
void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::draw()
@@ -164,7 +207,7 @@ void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::draw()
// Only show green "focus" background image if the accordion is open,
// because the user's mental model of focus is that it goes away after
// the accordion is closed.
- if (getParent()->hasFocus()
+ if (getParent()->hasFocus() || mIsSelected
/*&& !(collapsible && !expanded)*/ // WHY??
)
{
@@ -277,6 +320,8 @@ LLAccordionCtrlTab::Params::Params()
,header_image_pressed("header_image_pressed")
,header_image_focused("header_image_focused")
,header_text_color("header_text_color")
+ ,fit_panel("fit_panel",true)
+ ,selection_enabled("selection_enabled", false)
{
mouse_opaque(false);
}
@@ -293,6 +338,9 @@ LLAccordionCtrlTab::LLAccordionCtrlTab(const LLAccordionCtrlTab::Params&p)
,mPaddingTop(p.padding_top)
,mPaddingBottom(p.padding_bottom)
,mCanOpenClose(true)
+ ,mFitPanel(p.fit_panel)
+ ,mContainerPanel(NULL)
+ ,mScrollbar(NULL)
{
mStoredOpenCloseState = false;
mWasStateStored = false;
@@ -304,6 +352,11 @@ LLAccordionCtrlTab::LLAccordionCtrlTab(const LLAccordionCtrlTab::Params&p)
mHeader = LLUICtrlFactory::create<LLAccordionCtrlTabHeader>(headerParams);
addChild(mHeader, 1);
+ if (p.selection_enabled)
+ {
+ LLFocusableElement::setFocusReceivedCallback(boost::bind(&LLAccordionCtrlTab::selectOnFocusReceived, this));
+ }
+
reshape(100, 200,FALSE);
}
@@ -321,54 +374,42 @@ void LLAccordionCtrlTab::setDisplayChildren(bool display)
mExpandedHeight : HEADER_HEIGHT);
setRect(rect);
- for(child_list_const_iter_t it = getChildList()->begin();
- getChildList()->end() != it; ++it)
- {
- LLView* child = *it;
- if(DD_HEADER_NAME == child->getName())
- continue;
+ if(mContainerPanel)
+ mContainerPanel->setVisible(getDisplayChildren());
- child->setVisible(getDisplayChildren());
+ if(mDisplayChildren)
+ {
+ adjustContainerPanel();
}
+ else
+ {
+ if(mScrollbar)
+ mScrollbar->setVisible(false);
+ }
+
}
void LLAccordionCtrlTab::reshape(S32 width, S32 height, BOOL called_from_parent /* = TRUE */)
{
LLRect headerRect;
- LLUICtrl::reshape(width, height, TRUE);
-
headerRect.setLeftTopAndSize(
0,height,width,HEADER_HEIGHT);
mHeader->setRect(headerRect);
mHeader->reshape(headerRect.getWidth(), headerRect.getHeight());
- for(child_list_const_iter_t it = getChildList()->begin();
- getChildList()->end() != it; ++it)
- {
- LLView* child = *it;
- if(DD_HEADER_NAME == child->getName())
- continue;
- if(!child->getVisible())
- continue;
-
- LLRect childRect = child->getRect();
- S32 childWidth = width - getPaddingLeft() - getPaddingRight();
- S32 childHeight = height - getHeaderHeight() - getPaddingTop() - getPaddingBottom();
+ if(!mDisplayChildren)
+ return;
- child->reshape(childWidth,childHeight);
-
- childRect.setLeftTopAndSize(
- getPaddingLeft(),
- childHeight + getPaddingBottom(),
- childWidth,
- childHeight);
+ LLRect childRect;
- child->setRect(childRect);
-
- break;//suppose that there is only one panel
- }
+ childRect.setLeftTopAndSize(
+ getPaddingLeft(),
+ height - getHeaderHeight() - getPaddingTop(),
+ width - getPaddingLeft() - getPaddingRight(),
+ height - getHeaderHeight() - getPaddingTop() - getPaddingBottom() );
+ adjustContainerPanel(childRect);
}
void LLAccordionCtrlTab::changeOpenClose(bool is_open)
@@ -384,6 +425,13 @@ void LLAccordionCtrlTab::changeOpenClose(bool is_open)
}
}
+void LLAccordionCtrlTab::handleVisibilityChange(BOOL new_visibility)
+{
+ LLUICtrl::handleVisibilityChange(new_visibility);
+
+ notifyParent(LLSD().with("child_visibility_change", new_visibility));
+}
+
BOOL LLAccordionCtrlTab::handleMouseDown(S32 x, S32 y, MASK mask)
{
if(mCollapsible && mHeaderVisible && mCanOpenClose)
@@ -430,6 +478,9 @@ bool LLAccordionCtrlTab::addChild(LLView* child, S32 tab_group)
setDisplayChildren(getDisplayChildren());
}
+ if (!mContainerPanel)
+ mContainerPanel = findContainerView();
+
return res;
}
@@ -438,8 +489,67 @@ void LLAccordionCtrlTab::setAccordionView(LLView* panel)
addChild(panel,0);
}
+std::string LLAccordionCtrlTab::getTitle() const
+{
+ LLAccordionCtrlTabHeader* header = findChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME);
+ if (header)
+ {
+ return header->getTitle();
+ }
+ else
+ {
+ return LLStringUtil::null;
+ }
+}
+
+void LLAccordionCtrlTab::setTitle(const std::string& title, const std::string& hl)
+{
+ LLAccordionCtrlTabHeader* header = findChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME);
+ if (header)
+ {
+ header->setTitle(title, hl);
+ }
+}
+
+void LLAccordionCtrlTab::setTitleFontStyle(std::string style)
+{
+ LLAccordionCtrlTabHeader* header = findChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME);
+ if (header)
+ {
+ header->setTitleFontStyle(style);
+ }
+}
-LLView* LLAccordionCtrlTab::getAccordionView()
+boost::signals2::connection LLAccordionCtrlTab::setFocusReceivedCallback(const focus_signal_t::slot_type& cb)
+{
+ LLAccordionCtrlTabHeader* header = findChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME);
+ if (header)
+ {
+ return header->setFocusReceivedCallback(cb);
+ }
+ return boost::signals2::connection();
+}
+
+boost::signals2::connection LLAccordionCtrlTab::setFocusLostCallback(const focus_signal_t::slot_type& cb)
+{
+ LLAccordionCtrlTabHeader* header = findChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME);
+ if (header)
+ {
+ return header->setFocusLostCallback(cb);
+ }
+ return boost::signals2::connection();
+}
+
+void LLAccordionCtrlTab::setSelected(bool is_selected)
+{
+ LLAccordionCtrlTabHeader* header = findChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME);
+ if (header)
+ {
+ header->setSelected(is_selected);
+ }
+}
+
+LLView* LLAccordionCtrlTab::findContainerView()
{
for(child_list_const_iter_t it = getChildList()->begin();
getChildList()->end() != it; ++it)
@@ -454,6 +564,11 @@ LLView* LLAccordionCtrlTab::getAccordionView()
return NULL;
}
+void LLAccordionCtrlTab::selectOnFocusReceived()
+{
+ if (getParent()) // A parent may not be set if tabs are added dynamically.
+ getParent()->notifyParent(LLSD().with("action", "select_current"));
+}
S32 LLAccordionCtrlTab::getHeaderHeight()
{
@@ -470,10 +585,49 @@ void LLAccordionCtrlTab::setHeaderVisible(bool value)
reshape(getRect().getWidth(), getRect().getHeight(), FALSE);
};
-//vurtual
+//virtual
BOOL LLAccordionCtrlTab::postBuild()
{
- mHeader->setVisible(mHeaderVisible);
+ if(mHeader)
+ mHeader->setVisible(mHeaderVisible);
+
+ static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
+
+ LLRect scroll_rect;
+ scroll_rect.setOriginAndSize(
+ getRect().getWidth() - scrollbar_size,
+ 1,
+ scrollbar_size,
+ getRect().getHeight() - 1);
+
+ mContainerPanel = findContainerView();
+
+ if(!mFitPanel)
+ {
+ LLScrollbar::Params sbparams;
+ sbparams.name("scrollable vertical");
+ sbparams.rect(scroll_rect);
+ sbparams.orientation(LLScrollbar::VERTICAL);
+ sbparams.doc_size(getRect().getHeight());
+ sbparams.doc_pos(0);
+ sbparams.page_size(getRect().getHeight());
+ sbparams.step_size(VERTICAL_MULTIPLE);
+ sbparams.follows.flags(FOLLOWS_RIGHT | FOLLOWS_TOP | FOLLOWS_BOTTOM);
+ sbparams.change_callback(boost::bind(&LLAccordionCtrlTab::onScrollPosChangeCallback, this, _1, _2));
+
+
+ mScrollbar = LLUICtrlFactory::create<LLScrollbar> (sbparams);
+ LLView::addChild( mScrollbar );
+ mScrollbar->setFollowsRight();
+ mScrollbar->setFollowsTop();
+ mScrollbar->setFollowsBottom();
+
+ mScrollbar->setVisible(false);
+ }
+
+ if(mContainerPanel)
+ mContainerPanel->setVisible(mDisplayChildren);
+
return LLUICtrl::postBuild();
}
bool LLAccordionCtrlTab::notifyChildren (const LLSD& info)
@@ -517,7 +671,8 @@ S32 LLAccordionCtrlTab::notifyParent(const LLSD& info)
}
//LLAccordionCtrl should rearrange accodion tab if one of accordion change its size
- getParent()->notifyParent(info);
+ if (getParent()) // A parent may not be set if tabs are added dynamically.
+ getParent()->notifyParent(info);
return 1;
}
else if(str_action == "select_prev")
@@ -562,6 +717,12 @@ BOOL LLAccordionCtrlTab::handleKey(KEY key, MASK mask, BOOL called_from_parent)
if( !header->hasFocus() )
return LLUICtrl::handleKey(key, mask, called_from_parent);
+ if ( (key == KEY_RETURN )&& mask == MASK_NONE)
+ {
+ changeOpenClose(getDisplayChildren());
+ return TRUE;
+ }
+
if ( (key == KEY_ADD || key == KEY_RIGHT)&& mask == MASK_NONE)
{
if(getDisplayChildren() == false)
@@ -608,6 +769,7 @@ void LLAccordionCtrlTab::showAndFocusHeader()
{
LLAccordionCtrlTabHeader* header = getChild<LLAccordionCtrlTabHeader>(DD_HEADER_NAME);
header->setFocus(true);
+ header->setSelected(true);
LLRect screen_rc;
LLRect selected_rc = header->getRect();
@@ -622,6 +784,7 @@ void LLAccordionCtrlTab::storeOpenCloseState()
mStoredOpenCloseState = getDisplayChildren();
mWasStateStored = true;
}
+
void LLAccordionCtrlTab::restoreOpenCloseState()
{
if(!mWasStateStored)
@@ -632,3 +795,214 @@ void LLAccordionCtrlTab::restoreOpenCloseState()
}
mWasStateStored = false;
}
+
+void LLAccordionCtrlTab::adjustContainerPanel ()
+{
+ S32 width = getRect().getWidth();
+ S32 height = getRect().getHeight();
+
+ LLRect child_rect;
+ child_rect.setLeftTopAndSize(
+ getPaddingLeft(),
+ height - getHeaderHeight() - getPaddingTop(),
+ width - getPaddingLeft() - getPaddingRight(),
+ height - getHeaderHeight() - getPaddingTop() - getPaddingBottom() );
+
+ adjustContainerPanel(child_rect);
+}
+
+void LLAccordionCtrlTab::adjustContainerPanel(const LLRect& child_rect)
+{
+ if(!mContainerPanel)
+ return;
+
+ if(!mFitPanel)
+ {
+ show_hide_scrollbar(child_rect);
+ updateLayout(child_rect);
+ }
+ else
+ {
+ mContainerPanel->reshape(child_rect.getWidth(),child_rect.getHeight());
+ mContainerPanel->setRect(child_rect);
+ }
+}
+
+S32 LLAccordionCtrlTab::getChildViewHeight()
+{
+ if(!mContainerPanel)
+ return 0;
+ return mContainerPanel->getRect().getHeight();
+}
+
+void LLAccordionCtrlTab::show_hide_scrollbar(const LLRect& child_rect)
+{
+ if(getChildViewHeight() > child_rect.getHeight() )
+ showScrollbar(child_rect);
+ else
+ hideScrollbar(child_rect);
+}
+void LLAccordionCtrlTab::showScrollbar(const LLRect& child_rect)
+{
+ if(!mContainerPanel || !mScrollbar)
+ return;
+ bool was_visible = mScrollbar->getVisible();
+ mScrollbar->setVisible(true);
+
+ static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
+
+ {
+ ctrlSetLeftTopAndSize(mScrollbar,child_rect.getWidth()-scrollbar_size,
+ child_rect.getHeight()-PARENT_BORDER_MARGIN,
+ scrollbar_size,
+ child_rect.getHeight()-2*PARENT_BORDER_MARGIN);
+ }
+
+ LLRect orig_rect = mContainerPanel->getRect();
+
+ mScrollbar->setPageSize(child_rect.getHeight());
+ mScrollbar->setDocParams(orig_rect.getHeight(),mScrollbar->getDocPos());
+
+ if(was_visible)
+ {
+ S32 scroll_pos = llmin(mScrollbar->getDocPos(), orig_rect.getHeight() - child_rect.getHeight() - 1);
+ mScrollbar->setDocPos(scroll_pos);
+ }
+ else//shrink child panel
+ {
+ updateLayout(child_rect);
+ }
+
+}
+
+void LLAccordionCtrlTab::hideScrollbar( const LLRect& child_rect )
+{
+ if(!mContainerPanel || !mScrollbar)
+ return;
+
+ if(mScrollbar->getVisible() == false)
+ return;
+ mScrollbar->setVisible(false);
+ mScrollbar->setDocPos(0);
+
+ //shrink child panel
+ updateLayout(child_rect);
+}
+
+void LLAccordionCtrlTab::onScrollPosChangeCallback(S32, LLScrollbar*)
+{
+ LLRect child_rect;
+
+ S32 width = getRect().getWidth();
+ S32 height = getRect().getHeight();
+
+ child_rect.setLeftTopAndSize(
+ getPaddingLeft(),
+ height - getHeaderHeight() - getPaddingTop(),
+ width - getPaddingLeft() - getPaddingRight(),
+ height - getHeaderHeight() - getPaddingTop() - getPaddingBottom() );
+
+ updateLayout(child_rect);
+}
+
+void LLAccordionCtrlTab::drawChild(const LLRect& root_rect,LLView* child)
+{
+ if (child && child->getVisible() && child->getRect().isValid())
+ {
+ LLRect screen_rect;
+ localRectToScreen(child->getRect(),&screen_rect);
+
+ if ( root_rect.overlaps(screen_rect) && LLUI::sDirtyRect.overlaps(screen_rect))
+ {
+ glMatrixMode(GL_MODELVIEW);
+ LLUI::pushMatrix();
+ {
+ LLUI::translate((F32)child->getRect().mLeft, (F32)child->getRect().mBottom, 0.f);
+ child->draw();
+
+ }
+ LLUI::popMatrix();
+ }
+ }
+}
+
+void LLAccordionCtrlTab::draw()
+{
+ if(mFitPanel)
+ LLUICtrl::draw();
+ else
+ {
+ LLRect root_rect = getRootView()->getRect();
+ drawChild(root_rect,mHeader);
+ drawChild(root_rect,mScrollbar );
+ {
+ LLRect child_rect;
+
+ S32 width = getRect().getWidth();
+ S32 height = getRect().getHeight();
+
+ child_rect.setLeftTopAndSize(
+ getPaddingLeft(),
+ height - getHeaderHeight() - getPaddingTop(),
+ width - getPaddingLeft() - getPaddingRight(),
+ height - getHeaderHeight() - getPaddingTop() - getPaddingBottom() );
+
+ LLLocalClipRect clip(child_rect);
+ drawChild(root_rect,mContainerPanel);
+ }
+ }
+}
+
+void LLAccordionCtrlTab::updateLayout ( const LLRect& child_rect )
+{
+ LLView* child = getAccordionView();
+ if(!mContainerPanel)
+ return;
+
+ S32 panel_top = child_rect.getHeight();
+ S32 panel_width = child_rect.getWidth();
+
+ static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
+ if(mScrollbar->getVisible() != false)
+ {
+ panel_top+=mScrollbar->getDocPos();
+ panel_width-=scrollbar_size;
+ }
+
+ //set sizes for first panels and dragbars
+ LLRect panel_rect = child->getRect();
+ ctrlSetLeftTopAndSize(mContainerPanel,child_rect.mLeft,panel_top,panel_width,panel_rect.getHeight());
+}
+void LLAccordionCtrlTab::ctrlSetLeftTopAndSize(LLView* panel, S32 left, S32 top, S32 width, S32 height)
+{
+ if(!panel)
+ return;
+ LLRect panel_rect = panel->getRect();
+ panel_rect.setLeftTopAndSize( left, top, width, height);
+ panel->reshape( width, height, 1);
+ panel->setRect(panel_rect);
+}
+BOOL LLAccordionCtrlTab::handleToolTip(S32 x, S32 y, MASK mask)
+{
+ //header may be not the first child but we need to process it first
+ if(y >= (getRect().getHeight() - HEADER_HEIGHT - HEADER_HEIGHT/2) )
+ {
+ //inside tab header
+ //fix for EXT-6619
+ return TRUE;
+ }
+ return LLUICtrl::handleToolTip(x, y, mask);
+}
+BOOL LLAccordionCtrlTab::handleScrollWheel ( S32 x, S32 y, S32 clicks )
+{
+ if( LLUICtrl::handleScrollWheel(x,y,clicks))
+ {
+ return TRUE;
+ }
+ if( mScrollbar && mScrollbar->getVisible() && mScrollbar->handleScrollWheel( 0, 0, clicks ) )
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
diff --git a/indra/llui/llaccordionctrltab.h b/indra/llui/llaccordionctrltab.h
index 2e0260ab16..e17ecc5319 100644
--- a/indra/llui/llaccordionctrltab.h
+++ b/indra/llui/llaccordionctrltab.h
@@ -35,12 +35,15 @@
#include <string>
#include "llrect.h"
+#include "lluictrl.h"
+#include "lluicolor.h"
+#include "llstyle.h"
-class LLUICtrl;
class LLUICtrlFactory;
class LLUIImage;
class LLButton;
class LLTextBox;
+class LLScrollbar;
@@ -84,6 +87,10 @@ public:
Optional<bool> header_visible;
+ Optional<bool> fit_panel;
+
+ Optional<bool> selection_enabled;
+
Optional<S32> padding_left;
Optional<S32> padding_right;
Optional<S32> padding_top;
@@ -107,7 +114,20 @@ public:
//set LLAccordionCtrlTab panel
void setAccordionView(LLView* panel);
- LLView* getAccordionView();
+ LLView* getAccordionView() { return mContainerPanel; };
+
+ std::string getTitle() const;
+
+ // Set text and highlight substring in LLAccordionCtrlTabHeader
+ void setTitle(const std::string& title, const std::string& hl = LLStringUtil::null);
+
+ // Set text font style in LLAccordionCtrlTabHeader
+ void setTitleFontStyle(std::string style);
+
+ boost::signals2::connection setFocusReceivedCallback(const focus_signal_t::slot_type& cb);
+ boost::signals2::connection setFocusLostCallback(const focus_signal_t::slot_type& cb);
+
+ void setSelected(bool is_selected);
bool getCollapsible() {return mCollapsible;};
@@ -123,6 +143,8 @@ public:
S32 notify(const LLSD& info);
bool notifyChildren(const LLSD& info);
+ void draw();
+
void storeOpenCloseState ();
void restoreOpenCloseState ();
@@ -136,15 +158,24 @@ public:
// Call reshape after changing size
virtual void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
+ /**
+ * Raises notifyParent event with "child_visibility_change" = new_visibility
+ */
+ void handleVisibilityChange(BOOL new_visibility);
+
// Changes expand/collapse state and triggers expand/collapse callbacks
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask);
virtual BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent);
+ virtual BOOL handleToolTip(S32 x, S32 y, MASK mask);
+ virtual BOOL handleScrollWheel( S32 x, S32 y, S32 clicks );
+
+
virtual bool addChild(LLView* child, S32 tab_group);
- bool isExpanded() { return mDisplayChildren; }
+ bool isExpanded() const { return mDisplayChildren; }
S32 getHeaderHeight();
@@ -164,9 +195,30 @@ public:
void showAndFocusHeader();
-private:
+ void setFitPanel( bool fit ) { mFitPanel = true; }
+ bool getFitParent() const { return mFitPanel; }
-
+protected:
+ void adjustContainerPanel (const LLRect& child_rect);
+ void adjustContainerPanel ();
+ S32 getChildViewHeight ();
+
+ void onScrollPosChangeCallback(S32, LLScrollbar*);
+
+ void show_hide_scrollbar (const LLRect& child_rect);
+ void showScrollbar (const LLRect& child_rect);
+ void hideScrollbar (const LLRect& child_rect);
+
+ void updateLayout ( const LLRect& child_rect );
+ void ctrlSetLeftTopAndSize (LLView* panel, S32 left, S32 top, S32 width, S32 height);
+
+ void drawChild(const LLRect& root_rect,LLView* child);
+
+ LLView* findContainerView ();
+
+ void selectOnFocusReceived();
+
+private:
class LLAccordionCtrlTabHeader;
LLAccordionCtrlTabHeader* mHeader; //Header
@@ -176,6 +228,7 @@ private:
bool mHeaderVisible;
bool mCanOpenClose;
+ bool mFitPanel;
S32 mPaddingLeft;
S32 mPaddingRight;
@@ -185,6 +238,8 @@ private:
bool mStoredOpenCloseState;
bool mWasStateStored;
+ LLScrollbar* mScrollbar;
+ LLView* mContainerPanel;
LLUIColor mDropdownBGColor;
};
diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp
index 4944ed4fe7..34f3049f2e 100644
--- a/indra/llui/llbutton.cpp
+++ b/indra/llui/llbutton.cpp
@@ -81,10 +81,9 @@ LLButton::Params::Params()
image_pressed_selected("image_pressed_selected"),
image_overlay("image_overlay"),
image_overlay_alignment("image_overlay_alignment", std::string("center")),
- image_left_pad("image_left_pad"),
- image_right_pad("image_right_pad"),
image_top_pad("image_top_pad"),
image_bottom_pad("image_bottom_pad"),
+ imgoverlay_label_space("imgoverlay_label_space", 1),
label_color("label_color"),
label_color_selected("label_color_selected"), // requires is_toggle true
label_color_disabled("label_color_disabled"),
@@ -129,6 +128,7 @@ LLButton::LLButton(const LLButton::Params& p)
mImageSelected(p.image_selected),
mImageDisabled(p.image_disabled),
mImageDisabledSelected(p.image_disabled_selected),
+ mImageFlash(p.image_flash),
mImagePressed(p.image_pressed),
mImagePressedSelected(p.image_pressed_selected),
mImageHoverSelected(p.image_hover_selected),
@@ -144,10 +144,9 @@ LLButton::LLButton(const LLButton::Params& p)
mImageOverlay(p.image_overlay()),
mImageOverlayColor(p.image_overlay_color()),
mImageOverlayAlignment(LLFontGL::hAlignFromName(p.image_overlay_alignment)),
- mImageOverlayLeftPad(p.image_left_pad),
- mImageOverlayRightPad(p.image_right_pad),
mImageOverlayTopPad(p.image_top_pad),
mImageOverlayBottomPad(p.image_bottom_pad),
+ mImgOverlayLabelSpace(p.imgoverlay_label_space),
mIsToggle(p.is_toggle),
mScaleImage(p.scale_image),
mDropShadowedText(p.label_shadow),
@@ -637,14 +636,24 @@ void LLButton::draw()
if (mFlashing)
{
- LLColor4 flash_color = mFlashBgColor.get();
- use_glow_effect = TRUE;
- glow_type = LLRender::BT_ALPHA; // blend the glow
-
- if (mNeedsHighlight) // highlighted AND flashing
- glow_color = (glow_color*0.5f + flash_color*0.5f) % 2.0f; // average between flash and highlight colour, with sum of the opacity
+ // if button should flash and we have icon for flashing, use it as image for button
+ if(flash && mImageFlash)
+ {
+ // setting flash to false to avoid its further influence on glow
+ flash = false;
+ imagep = mImageFlash;
+ }
+ // else use usual flashing via flash_color
else
- glow_color = flash_color;
+ {
+ LLColor4 flash_color = mFlashBgColor.get();
+ use_glow_effect = TRUE;
+ glow_type = LLRender::BT_ALPHA; // blend the glow
+ if (mNeedsHighlight) // highlighted AND flashing
+ glow_color = (glow_color*0.5f + flash_color*0.5f) % 2.0f; // average between flash and highlight colour, with sum of the opacity
+ else
+ glow_color = flash_color;
+ }
}
if (mNeedsHighlight && !imagep)
@@ -771,12 +780,7 @@ void LLButton::draw()
center_x++;
}
- S32 text_width_delta = overlay_width + 1;
- // if image paddings set, they should participate in scaling process
- S32 image_size_delta = mImageOverlayTopPad + mImageOverlayBottomPad;
- overlay_width = overlay_width - image_size_delta;
- overlay_height = overlay_height - image_size_delta;
-
+ center_y += (mImageOverlayBottomPad - mImageOverlayTopPad);
// fade out overlay images on disabled buttons
LLColor4 overlay_color = mImageOverlayColor.get();
if (!enabled)
@@ -788,10 +792,9 @@ void LLButton::draw()
switch(mImageOverlayAlignment)
{
case LLFontGL::LEFT:
- text_left += overlay_width + mImageOverlayRightPad + 1;
- text_width -= text_width_delta;
+ text_left += overlay_width + mImgOverlayLabelSpace;
mImageOverlay->draw(
- mLeftHPad,
+ mLeftHPad,
center_y - (overlay_height / 2),
overlay_width,
overlay_height,
@@ -806,10 +809,9 @@ void LLButton::draw()
overlay_color);
break;
case LLFontGL::RIGHT:
- text_right -= overlay_width + mImageOverlayLeftPad+ 1;
- text_width -= text_width_delta;
+ text_right -= overlay_width + mImgOverlayLabelSpace;
mImageOverlay->draw(
- getRect().getWidth() - mRightHPad - overlay_width,
+ getRect().getWidth() - mRightHPad - overlay_width,
center_y - (overlay_height / 2),
overlay_width,
overlay_height,
@@ -833,7 +835,7 @@ void LLButton::draw()
x = text_right;
break;
case LLFontGL::HCENTER:
- x = getRect().getWidth() / 2;
+ x = text_left + (text_width / 2);
break;
case LLFontGL::LEFT:
default:
@@ -1012,6 +1014,11 @@ void LLButton::setImageDisabledSelected(LLPointer<LLUIImage> image)
mFadeWhenDisabled = TRUE;
}
+void LLButton::setImagePressed(LLPointer<LLUIImage> image)
+{
+ mImagePressed = image;
+}
+
void LLButton::setImageHoverSelected(LLPointer<LLUIImage> image)
{
mImageHoverSelected = image;
@@ -1022,6 +1029,11 @@ void LLButton::setImageHoverUnselected(LLPointer<LLUIImage> image)
mImageHoverUnselected = image;
}
+void LLButton::setImageFlash(LLPointer<LLUIImage> image)
+{
+ mImageFlash = image;
+}
+
void LLButton::setImageOverlay(const std::string& image_name, LLFontGL::HAlign alignment, const LLColor4& color)
{
if (image_name.empty())
diff --git a/indra/llui/llbutton.h b/indra/llui/llbutton.h
index 8e5f19602f..9bd566d3c9 100644
--- a/indra/llui/llbutton.h
+++ b/indra/llui/llbutton.h
@@ -84,6 +84,7 @@ public:
image_hover_unselected,
image_disabled_selected,
image_disabled,
+ image_flash,
image_pressed,
image_pressed_selected,
image_overlay;
@@ -107,11 +108,14 @@ public:
Optional<S32> pad_bottom; // under text label
//image overlay paddings
- Optional<S32> image_left_pad;
- Optional<S32> image_right_pad;
Optional<S32> image_top_pad;
Optional<S32> image_bottom_pad;
+ /**
+ * Space between image_overlay and label
+ */
+ Optional<S32> imgoverlay_label_space;
+
// callbacks
Optional<CommitCallbackParam> click_callback, // alias -> commit_callback
mouse_down_callback,
@@ -192,10 +196,6 @@ public:
void setLeftHPad( S32 pad ) { mLeftHPad = pad; }
void setRightHPad( S32 pad ) { mRightHPad = pad; }
- void setImageOverlayLeftPad( S32 pad ) { mImageOverlayLeftPad = pad; }
- S32 getImageOverlayLeftPad() const { return mImageOverlayLeftPad; }
- void setImageOverlayRightPad( S32 pad ) { mImageOverlayRightPad = pad; }
- S32 getImageOverlayRightPad() const { return mImageOverlayRightPad; }
void setImageOverlayTopPad( S32 pad ) { mImageOverlayTopPad = pad; }
S32 getImageOverlayTopPad() const { return mImageOverlayTopPad; }
void setImageOverlayBottomPad( S32 pad ) { mImageOverlayBottomPad = pad; }
@@ -217,7 +217,8 @@ public:
void setImageOverlay(const std::string& image_name, LLFontGL::HAlign alignment = LLFontGL::HCENTER, const LLColor4& color = LLColor4::white);
void setImageOverlay(const LLUUID& image_id, LLFontGL::HAlign alignment = LLFontGL::HCENTER, const LLColor4& color = LLColor4::white);
LLPointer<LLUIImage> getImageOverlay() { return mImageOverlay; }
-
+ LLFontGL::HAlign getImageOverlayHAlign() const { return mImageOverlayAlignment; }
+
void autoResize(); // resize with label of current btn state
void resize(LLUIString label); // resize with label input
void setLabel( const LLStringExplicit& label);
@@ -246,6 +247,8 @@ public:
void setImageHoverUnselected(LLPointer<LLUIImage> image);
void setImageDisabled(LLPointer<LLUIImage> image);
void setImageDisabledSelected(LLPointer<LLUIImage> image);
+ void setImageFlash(LLPointer<LLUIImage> image);
+ void setImagePressed(LLPointer<LLUIImage> image);
void setCommitOnReturn(BOOL commit) { mCommitOnReturn = commit; }
BOOL getCommitOnReturn() const { return mCommitOnReturn; }
@@ -258,6 +261,8 @@ public:
void setForcePressedState(bool b) { mForcePressedState = b; }
+ void setAutoResize(bool auto_resize) { mAutoResize = auto_resize; }
+
protected:
LLPointer<LLUIImage> getImageUnselected() const { return mImageUnselected; }
LLPointer<LLUIImage> getImageSelected() const { return mImageSelected; }
@@ -307,6 +312,11 @@ private:
LLPointer<LLUIImage> mImagePressed;
LLPointer<LLUIImage> mImagePressedSelected;
+ /* There are two ways an image can flash- by making changes in color according to flash_color attribute
+ or by changing icon from current to the one specified in image_flash. Second way is used only if
+ flash icon name is set in attributes(by default it isn't). First way is used otherwise. */
+ LLPointer<LLUIImage> mImageFlash;
+
LLUIColor mHighlightColor;
LLUIColor mFlashBgColor;
@@ -328,11 +338,14 @@ private:
S32 mRightHPad;
S32 mBottomVPad; // under text label
- S32 mImageOverlayLeftPad;
- S32 mImageOverlayRightPad;
S32 mImageOverlayTopPad;
S32 mImageOverlayBottomPad;
+ /*
+ * Space between image_overlay and label
+ */
+ S32 mImgOverlayLabelSpace;
+
F32 mHoverGlowStrength;
F32 mCurGlowStrength;
diff --git a/indra/llui/llcombobox.cpp b/indra/llui/llcombobox.cpp
index 9d23daf56d..cc107c972d 100644
--- a/indra/llui/llcombobox.cpp
+++ b/indra/llui/llcombobox.cpp
@@ -160,7 +160,7 @@ LLComboBox::LLComboBox(const LLComboBox::Params& p)
createLineEditor(p);
- setTopLostCallback(boost::bind(&LLComboBox::hideList, this));
+ mTopLostSignalConnection = setTopLostCallback(boost::bind(&LLComboBox::hideList, this));
}
void LLComboBox::initFromParams(const LLComboBox::Params& p)
@@ -187,6 +187,9 @@ BOOL LLComboBox::postBuild()
LLComboBox::~LLComboBox()
{
// children automatically deleted, including mMenu, mButton
+
+ // explicitly disconect this signal, since base class destructor might fire top lost
+ mTopLostSignalConnection.disconnect();
}
@@ -320,15 +323,19 @@ void LLComboBox::setValue(const LLSD& value)
LLScrollListItem* item = mList->getFirstSelected();
if (item)
{
- setLabel( mList->getSelectedItemLabel() );
+ setLabel(getSelectedItemLabel());
}
mLastSelectedIndex = mList->getFirstSelectedIndex();
}
+ else
+ {
+ mLastSelectedIndex = -1;
+ }
}
const std::string LLComboBox::getSimple() const
{
- const std::string res = mList->getSelectedItemLabel();
+ const std::string res = getSelectedItemLabel();
if (res.empty() && mAllowTextEntry)
{
return mTextEntry->getText();
@@ -407,7 +414,7 @@ BOOL LLComboBox::remove(S32 index)
if (index < mList->getItemCount())
{
mList->deleteSingleItem(index);
- setLabel(mList->getSelectedItemLabel());
+ setLabel(getSelectedItemLabel());
return TRUE;
}
return FALSE;
@@ -448,7 +455,7 @@ BOOL LLComboBox::setCurrentByIndex( S32 index )
BOOL found = mList->selectNthItem( index );
if (found)
{
- setLabel(mList->getSelectedItemLabel());
+ setLabel(getSelectedItemLabel());
mLastSelectedIndex = index;
}
return found;
@@ -488,7 +495,6 @@ void LLComboBox::createLineEditor(const LLComboBox::Params& p)
params.max_length_bytes(mMaxChars);
params.commit_callback.function(boost::bind(&LLComboBox::onTextCommit, this, _2));
params.keystroke_callback(boost::bind(&LLComboBox::onTextEntry, this, _1));
- params.handle_edit_keys_directly(true);
params.commit_on_focus_lost(false);
params.follows.flags(FOLLOWS_ALL);
params.label(mLabel);
@@ -612,16 +618,14 @@ void LLComboBox::showList()
mList->setFocus(TRUE);
- // register ourselves as a "top" control
- // effectively putting us into a special draw layer
- // and not affecting the bounding rectangle calculation
- gFocusMgr.setTopCtrl(this);
-
// Show the list and push the button down
mButton->setToggleState(TRUE);
mList->setVisible(TRUE);
+ LLUI::addPopup(this);
+
setUseBoundingRect(TRUE);
+// updateBoundingRect();
}
void LLComboBox::hideList()
@@ -644,10 +648,8 @@ void LLComboBox::hideList()
mList->mouseOverHighlightNthItem(-1);
setUseBoundingRect(FALSE);
- if( gFocusMgr.getTopCtrl() == this )
- {
- gFocusMgr.setTopCtrl(NULL);
- }
+ LLUI::removePopup(this);
+// updateBoundingRect();
}
}
@@ -703,13 +705,10 @@ void LLComboBox::onListMouseUp()
void LLComboBox::onItemSelected(const LLSD& data)
{
- const std::string name = mList->getSelectedItemLabel();
-
- S32 cur_id = getCurrentIndex();
- mLastSelectedIndex = cur_id;
- if (cur_id != -1)
+ mLastSelectedIndex = getCurrentIndex();
+ if (mLastSelectedIndex != -1)
{
- setLabel(name);
+ setLabel(getSelectedItemLabel());
if (mAllowTextEntry)
{
@@ -717,7 +716,6 @@ void LLComboBox::onItemSelected(const LLSD& data)
mTextEntry->selectAll();
}
}
-
// hiding the list reasserts the old value stored in the text editor/dropdown button
hideList();
@@ -912,7 +910,7 @@ void LLComboBox::updateSelection()
}
else if (mList->selectItemByPrefix(left_wstring, FALSE))
{
- LLWString selected_item = utf8str_to_wstring(mList->getSelectedItemLabel());
+ LLWString selected_item = utf8str_to_wstring(getSelectedItemLabel());
LLWString wtext = left_wstring + selected_item.substr(left_wstring.size(), selected_item.size());
mTextEntry->setText(wstring_to_utf8str(wtext));
mTextEntry->setSelection(left_wstring.size(), mTextEntry->getWText().size());
@@ -1014,7 +1012,7 @@ BOOL LLComboBox::setCurrentByID(const LLUUID& id)
if (found)
{
- setLabel(mList->getSelectedItemLabel());
+ setLabel(getSelectedItemLabel());
mLastSelectedIndex = mList->getFirstSelectedIndex();
}
@@ -1030,7 +1028,7 @@ BOOL LLComboBox::setSelectedByValue(const LLSD& value, BOOL selected)
BOOL found = mList->setSelectedByValue(value, selected);
if (found)
{
- setLabel(mList->getSelectedItemLabel());
+ setLabel(getSelectedItemLabel());
}
return found;
}
@@ -1069,3 +1067,24 @@ BOOL LLComboBox::selectItemRange( S32 first, S32 last )
{
return mList->selectItemRange(first, last);
}
+
+
+static LLDefaultChildRegistry::Register<LLIconsComboBox> register_icons_combo_box("icons_combo_box");
+
+LLIconsComboBox::Params::Params()
+: icon_column("icon_column", ICON_COLUMN),
+ label_column("label_column", LABEL_COLUMN)
+{}
+
+LLIconsComboBox::LLIconsComboBox(const LLIconsComboBox::Params& p)
+: LLComboBox(p),
+ mIconColumnIndex(p.icon_column),
+ mLabelColumnIndex(p.label_column)
+{}
+
+const std::string LLIconsComboBox::getSelectedItemLabel(S32 column) const
+{
+ mButton->setImageOverlay(LLComboBox::getSelectedItemLabel(mIconColumnIndex), mButton->getImageOverlayHAlign());
+
+ return LLComboBox::getSelectedItemLabel(mLabelColumnIndex);
+}
diff --git a/indra/llui/llcombobox.h b/indra/llui/llcombobox.h
index 4f27588467..f0bd432f3a 100644
--- a/indra/llui/llcombobox.h
+++ b/indra/llui/llcombobox.h
@@ -150,7 +150,7 @@ public:
// Get name of current item. Returns an empty string if not found.
const std::string getSimple() const;
// Get contents of column x of selected row
- const std::string getSelectedItemLabel(S32 column = 0) const;
+ virtual const std::string getSelectedItemLabel(S32 column = 0) const;
// Sets the label, which doesn't have to exist in the label.
// This is probably a UI abuse.
@@ -230,6 +230,38 @@ private:
commit_callback_t mPrearrangeCallback;
commit_callback_t mTextEntryCallback;
commit_callback_t mSelectionCallback;
- S32 mLastSelectedIndex;
+ boost::signals2::connection mTopLostSignalConnection;
+ S32 mLastSelectedIndex;
};
+
+// A combo box with icons for the list of items.
+class LLIconsComboBox
+: public LLComboBox
+{
+public:
+ struct Params
+ : public LLInitParam::Block<Params, LLComboBox::Params>
+ {
+ Optional<S32> icon_column,
+ label_column;
+ Params();
+ };
+
+ /*virtual*/ const std::string getSelectedItemLabel(S32 column = 0) const;
+
+private:
+ enum EColumnIndex
+ {
+ ICON_COLUMN = 0,
+ LABEL_COLUMN
+ };
+
+ friend class LLUICtrlFactory;
+ LLIconsComboBox(const Params&);
+ virtual ~LLIconsComboBox() {};
+
+ S32 mIconColumnIndex;
+ S32 mLabelColumnIndex;
+};
+
#endif
diff --git a/indra/llui/llconsole.cpp b/indra/llui/llconsole.cpp
index 0237c80efa..badbddc3cc 100644
--- a/indra/llui/llconsole.cpp
+++ b/indra/llui/llconsole.cpp
@@ -244,23 +244,6 @@ void LLConsole::draw()
}
}
-void LLConsole::addLine(const std::string& utf8line)
-{
- LLWString wline = utf8str_to_wstring(utf8line);
- addLine(wline, 0.f, LLColor4(1.f, 1.f, 1.f, 1.f));
-}
-
-void LLConsole::addLine(const LLWString& wline)
-{
- addLine(wline, 0.f, LLColor4(1.f, 1.f, 1.f, 1.f));
-}
-
-void LLConsole::addLine(const std::string& utf8line, F32 size, const LLColor4 &color)
-{
- LLWString wline = utf8str_to_wstring(utf8line);
- addLine(wline, size, color);
-}
-
//Generate highlight color segments for this paragraph. Pass in default color of paragraph.
void LLConsole::Paragraph::makeParagraphColorSegments (const LLColor4 &color)
{
@@ -317,7 +300,8 @@ void LLConsole::Paragraph::updateLines(F32 screen_width, const LLFontGL* font, b
S32 paragraph_offset = 0; //Offset into the paragraph text.
// Wrap lines that are longer than the view is wide.
- while( paragraph_offset < (S32)mParagraphText.length() )
+ while( paragraph_offset < (S32)mParagraphText.length() &&
+ mParagraphText[paragraph_offset] != 0)
{
S32 skip_chars; // skip '\n'
// Figure out if a word-wrapped line fits here.
@@ -383,21 +367,45 @@ void LLConsole::Paragraph::updateLines(F32 screen_width, const LLFontGL* font, b
//Pass in the string and the default color for this block of text.
LLConsole::Paragraph::Paragraph (LLWString str, const LLColor4 &color, F32 add_time, const LLFontGL* font, F32 screen_width)
- : mParagraphText(str), mAddTime(add_time), mMaxWidth(-1)
+: mParagraphText(str), mAddTime(add_time), mMaxWidth(-1)
{
makeParagraphColorSegments(color);
updateLines( screen_width, font );
}
-void LLConsole::addLine(const LLWString& wline, F32 size, const LLColor4 &color)
+// called once per frame regardless of console visibility
+// static
+void LLConsole::updateClass()
{
- Paragraph paragraph(wline, color, mTimer.getElapsedTimeF32(), mFont, (F32)getRect().getWidth() );
-
- mParagraphs.push_back ( paragraph );
+ LLInstanceTrackerScopedGuard guard;
+
+ for (instance_iter it = guard.beginInstances(); it != guard.endInstances(); ++it)
+ {
+ it->update();
+ }
+}
+
+void LLConsole::update()
+{
+ {
+ LLMutexLock lock(&mMutex);
+
+ while (!mLines.empty())
+ {
+ mParagraphs.push_back(
+ Paragraph( mLines.front(),
+ LLColor4::white,
+ mTimer.getElapsedTimeF32(),
+ mFont,
+ (F32)getRect().getWidth()));
+ mLines.pop_front();
+ }
+ }
// remove old paragraphs which can't possibly be visible any more. ::draw() will do something similar but more conservative - we do this here because ::draw() isn't guaranteed to ever be called! (i.e. the console isn't visible)
- while ((S32)mParagraphs.size() > llmax((S32)0, (S32)(mMaxLines)))
- {
- mParagraphs.pop_front();
- }
+ while ((S32)mParagraphs.size() > llmax((S32)0, (S32)(mMaxLines)))
+ {
+ mParagraphs.pop_front();
+ }
}
+
diff --git a/indra/llui/llconsole.h b/indra/llui/llconsole.h
index 4719950f28..f38e2bc9c2 100644
--- a/indra/llui/llconsole.h
+++ b/indra/llui/llconsole.h
@@ -40,7 +40,7 @@
class LLSD;
-class LLConsole : public LLFixedBuffer, public LLUICtrl
+class LLConsole : public LLFixedBuffer, public LLUICtrl, public LLInstanceTracker<LLConsole>
{
public:
typedef enum e_font_size
@@ -68,6 +68,9 @@ protected:
friend class LLUICtrlFactory;
public:
+ // call once per frame to pull data out of LLFixedBuffer
+ static void updateClass();
+
//A paragraph color segment defines the color of text in a line
//of text that was received for console display. It has no
//notion of line wraps, screen position, or the text it contains.
@@ -139,14 +142,12 @@ public:
// -1 = monospace, 0 means small, font size = 1 means big
void setFontSize(S32 size_index);
- void addLine(const std::string& utf8line, F32 size, const LLColor4 &color);
- void addLine(const LLWString& wline, F32 size, const LLColor4 &color);
// Overrides
/*virtual*/ void draw();
- /*virtual*/ void addLine(const std::string& utf8line);
- /*virtual*/ void addLine(const LLWString& line);
private:
+ void update();
+
F32 mLinePersistTime; // Age at which to stop drawing.
F32 mFadeTime; // Age at which to start fading
const LLFontGL* mFont;
diff --git a/indra/llui/lldockablefloater.cpp b/indra/llui/lldockablefloater.cpp
index 57baf28dab..3d8670fef2 100644
--- a/indra/llui/lldockablefloater.cpp
+++ b/indra/llui/lldockablefloater.cpp
@@ -95,7 +95,7 @@ void LLDockableFloater::toggleInstance(const LLSD& sdname)
LLDockableFloater* instance =
dynamic_cast<LLDockableFloater*> (LLFloaterReg::findInstance(name));
// if floater closed or docked
- if (instance == NULL || instance != NULL && instance->isDocked())
+ if (instance == NULL || (instance && instance->isDocked()))
{
LLFloaterReg::toggleInstance(name, key);
// restore button toggle state
@@ -202,10 +202,6 @@ void LLDockableFloater::setDocked(bool docked, bool pop_on_undock)
translate(0, UNDOCK_LEAP_HEIGHT);
}
}
- else
- {
- docked = false;
- }
LLFloater::setDocked(docked, pop_on_undock);
}
@@ -226,7 +222,7 @@ void LLDockableFloater::draw()
void LLDockableFloater::setDockControl(LLDockControl* dockControl)
{
mDockControl.reset(dockControl);
- setDocked(mDockControl.get() != NULL && mDockControl.get()->isDockVisible());
+ setDocked(isDocked());
}
const LLUIImagePtr& LLDockableFloater::getDockTongue()
diff --git a/indra/llui/lldockcontrol.cpp b/indra/llui/lldockcontrol.cpp
index d836a5f4cd..d738b10130 100644
--- a/indra/llui/lldockcontrol.cpp
+++ b/indra/llui/lldockcontrol.cpp
@@ -162,7 +162,9 @@ bool LLDockControl::isDockVisible()
{
case LEFT: // to keep compiler happy
break;
+ case BOTTOM:
case TOP:
+ {
// check is dock inside parent rect
LLRect dockParentRect =
mDockWidget->getParent()->calcScreenRect();
@@ -173,6 +175,9 @@ bool LLDockControl::isDockVisible()
}
break;
}
+ default:
+ break;
+ }
}
}
@@ -255,6 +260,42 @@ void LLDockControl::moveDockable()
mDockTongueY = dockRect.mTop;
break;
+ case BOTTOM:
+ x = dockRect.getCenterX() - dockableRect.getWidth() / 2;
+ y = dockRect.mBottom;
+ // unique docking used with dock tongue, so add tongue height o the Y coordinate
+ if (use_tongue)
+ {
+ y -= mDockTongue->getHeight();
+ }
+
+ // check is dockable inside root view rect
+ if (x < rootRect.mLeft)
+ {
+ x = rootRect.mLeft;
+ }
+ if (x + dockableRect.getWidth() > rootRect.mRight)
+ {
+ x = rootRect.mRight - dockableRect.getWidth();
+ }
+
+ // calculate dock tongue position
+ dockParentRect = mDockWidget->getParent()->calcScreenRect();
+ if (dockRect.getCenterX() < dockParentRect.mLeft)
+ {
+ mDockTongueX = dockParentRect.mLeft - mDockTongue->getWidth() / 2;
+ }
+ else if (dockRect.getCenterX() > dockParentRect.mRight)
+ {
+ mDockTongueX = dockParentRect.mRight - mDockTongue->getWidth() / 2;;
+ }
+ else
+ {
+ mDockTongueX = dockRect.getCenterX() - mDockTongue->getWidth() / 2;
+ }
+ mDockTongueY = dockRect.mBottom - mDockTongue->getHeight();
+
+ break;
}
// move dockable
diff --git a/indra/llui/lldockcontrol.h b/indra/llui/lldockcontrol.h
index 550955c4c5..a5caf68001 100644
--- a/indra/llui/lldockcontrol.h
+++ b/indra/llui/lldockcontrol.h
@@ -47,8 +47,9 @@ class LLDockControl
public:
enum DocAt
{
- TOP
- ,LEFT
+ TOP,
+ LEFT,
+ BOTTOM
};
public:
diff --git a/indra/llui/lldraghandle.cpp b/indra/llui/lldraghandle.cpp
index 832f148902..9f83fcca35 100644
--- a/indra/llui/lldraghandle.cpp
+++ b/indra/llui/lldraghandle.cpp
@@ -248,15 +248,14 @@ void LLDragHandleTop::reshapeTitleBox()
return;
}
const LLFontGL* font = LLFontGL::getFontSansSerif();
- S32 title_width = font->getWidth( mTitleBox->getText() ) + TITLE_HPAD;
- if (getMaxTitleWidth() > 0)
- title_width = llmin(title_width, getMaxTitleWidth());
+ S32 title_width = getRect().getWidth();
+ title_width -= LEFT_PAD + 2 * BORDER_PAD + getButtonsRect().getWidth();
S32 title_height = llround(font->getLineHeight());
LLRect title_rect;
title_rect.setLeftTopAndSize(
LEFT_PAD,
getRect().getHeight() - title_vpad,
- getRect().getWidth() - LEFT_PAD - RIGHT_PAD,
+ title_width,
title_height);
// calls reshape on mTitleBox
diff --git a/indra/llui/lldraghandle.h b/indra/llui/lldraghandle.h
index dc5410787b..825bc9303e 100644
--- a/indra/llui/lldraghandle.h
+++ b/indra/llui/lldraghandle.h
@@ -71,6 +71,8 @@ public:
BOOL getForeground() const { return mForeground; }
void setMaxTitleWidth(S32 max_width) {mMaxTitleWidth = llmin(max_width, mMaxTitleWidth); }
S32 getMaxTitleWidth() const { return mMaxTitleWidth; }
+ void setButtonsRect(const LLRect& rect){ mButtonsRect = rect; }
+ LLRect getButtonsRect() { return mButtonsRect; }
void setTitleVisible(BOOL visible);
virtual void setTitle( const std::string& title ) = 0;
@@ -88,6 +90,7 @@ protected:
LLTextBox* mTitleBox;
private:
+ LLRect mButtonsRect;
S32 mDragLastScreenX;
S32 mDragLastScreenY;
S32 mLastMouseScreenX;
diff --git a/indra/llui/lleditmenuhandler.cpp b/indra/llui/lleditmenuhandler.cpp
index 821afae8fd..245bce76f5 100644
--- a/indra/llui/lleditmenuhandler.cpp
+++ b/indra/llui/lleditmenuhandler.cpp
@@ -37,3 +37,10 @@
/* static */
LLEditMenuHandler* LLEditMenuHandler::gEditMenuHandler = NULL;
+LLEditMenuHandler::~LLEditMenuHandler()
+{
+ if (gEditMenuHandler == this)
+ {
+ gEditMenuHandler = NULL;
+ }
+}
diff --git a/indra/llui/lleditmenuhandler.h b/indra/llui/lleditmenuhandler.h
index 1de9c56afb..d72283cd99 100644
--- a/indra/llui/lleditmenuhandler.h
+++ b/indra/llui/lleditmenuhandler.h
@@ -38,7 +38,7 @@ class LLEditMenuHandler
{
public:
// this is needed even though this is just an interface class.
- virtual ~LLEditMenuHandler() {};
+ virtual ~LLEditMenuHandler();
virtual void undo() {};
virtual BOOL canUndo() const { return FALSE; }
diff --git a/indra/llui/llfiltereditor.cpp b/indra/llui/llfiltereditor.cpp
index 390504234d..6c80275713 100644
--- a/indra/llui/llfiltereditor.cpp
+++ b/indra/llui/llfiltereditor.cpp
@@ -39,6 +39,7 @@
LLFilterEditor::LLFilterEditor(const LLFilterEditor::Params& p)
: LLSearchEditor(p)
{
+ setCommitOnFocusLost(FALSE); // we'll commit on every keystroke, don't re-commit when we take focus away (i.e. we go to interact with the actual results!)
}
diff --git a/indra/llui/llflatlistview.cpp b/indra/llui/llflatlistview.cpp
index 2481249f91..2433c14315 100644
--- a/indra/llui/llflatlistview.cpp
+++ b/indra/llui/llflatlistview.cpp
@@ -1,10 +1,10 @@
/**
* @file llflatlistview.cpp
- * @brief LLFlatListView base class
+ * @brief LLFlatListView base class and extension to support messages for several cases of an empty list.
*
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
- * Copyright (c) 2009, Linden Research, Inc.
+ * Copyright (c) 2009-2010, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
@@ -243,7 +243,7 @@ LLUUID LLFlatListView::getSelectedUUID() const
}
}
-void LLFlatListView::getSelectedUUIDs(std::vector<LLUUID>& selected_uuids) const
+void LLFlatListView::getSelectedUUIDs(uuid_vec_t& selected_uuids) const
{
if (mSelectedItemPairs.empty()) return;
@@ -297,6 +297,27 @@ void LLFlatListView::setNoItemsCommentText(const std::string& comment_text)
mNoItemsCommentTextbox->setValue(comment_text);
}
+U32 LLFlatListView::size(const bool only_visible_items) const
+{
+ if (only_visible_items)
+ {
+ U32 size = 0;
+ for (pairs_const_iterator_t
+ iter = mItemPairs.begin(),
+ iter_end = mItemPairs.end();
+ iter != iter_end; ++iter)
+ {
+ if ((*iter)->first->getVisible())
+ ++size;
+ }
+ return size;
+ }
+ else
+ {
+ return mItemPairs.size();
+ }
+}
+
void LLFlatListView::clear()
{
// do not use LLView::deleteAllChildren to avoid removing nonvisible items. drag-n-drop for ex.
@@ -358,6 +379,7 @@ LLFlatListView::LLFlatListView(const LLFlatListView::Params& p)
, mCommitOnSelectionChange(false)
, mPrevNotifyParentRect(LLRect())
, mNoItemsCommentTextbox(NULL)
+ , mIsConsecutiveSelection(false)
{
mBorderThickness = getBorderWidth();
@@ -426,7 +448,7 @@ void LLFlatListView::rearrangeItems()
{
static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
- setNoItemsCommentVisible(mItemPairs.empty());
+ setNoItemsCommentVisible(0==size());
if (mItemPairs.empty()) return;
@@ -492,13 +514,92 @@ void LLFlatListView::onItemMouseClick(item_pair_t* item_pair, MASK mask)
{
if (!item_pair) return;
+ if (!item_pair->first)
+ {
+ llwarning("Attempt to selet an item pair containing null panel item", 0);
+ return;
+ }
+
setFocus(TRUE);
bool select_item = !isSelected(item_pair);
//*TODO find a better place for that enforcing stuff
if (mKeepOneItemSelected && numSelected() == 1 && !select_item) return;
-
+
+ if ( (mask & MASK_SHIFT) && !(mask & MASK_CONTROL)
+ && mMultipleSelection && !mSelectedItemPairs.empty() )
+ {
+ item_pair_t* last_selected_pair = mSelectedItemPairs.back();
+
+ // If item_pair is already selected - do nothing
+ if (last_selected_pair == item_pair)
+ return;
+
+ bool grab_items = false;
+ bool reverse = false;
+ pairs_list_t pairs_to_select;
+
+ // Pick out items from list between last selected and current clicked item_pair.
+ for (pairs_iterator_t
+ iter = mItemPairs.begin(),
+ iter_end = mItemPairs.end();
+ iter != iter_end; ++iter)
+ {
+ item_pair_t* cur = *iter;
+ if (cur == last_selected_pair || cur == item_pair)
+ {
+ // We've got reverse selection if last grabed item isn't a new selection.
+ reverse = grab_items && (cur != item_pair);
+ grab_items = !grab_items;
+ // Skip last selected and current clicked item pairs.
+ continue;
+ }
+ if (!cur->first->getVisible())
+ {
+ // Skip invisible item pairs.
+ continue;
+ }
+ if (grab_items)
+ {
+ pairs_to_select.push_back(cur);
+ }
+ }
+
+ if (reverse)
+ {
+ pairs_to_select.reverse();
+ }
+
+ pairs_to_select.push_back(item_pair);
+
+ for (pairs_iterator_t
+ iter = pairs_to_select.begin(),
+ iter_end = pairs_to_select.end();
+ iter != iter_end; ++iter)
+ {
+ item_pair_t* pair_to_select = *iter;
+ if (isSelected(pair_to_select))
+ {
+ // Item was already selected but there is a need to keep order from last selected pair to new selection.
+ // Do it here to prevent extra mCommitOnSelectionChange in selectItemPair().
+ mSelectedItemPairs.remove(pair_to_select);
+ mSelectedItemPairs.push_back(pair_to_select);
+ }
+ else
+ {
+ selectItemPair(pair_to_select, true);
+ }
+ }
+
+ if (!select_item)
+ {
+ // Update last selected item border.
+ mSelectedItemsBorder->setRect(getLastSelectedItemRect().stretch(-1));
+ }
+ return;
+ }
+
if (!(mask & MASK_CONTROL) || !mMultipleSelection) resetSelection();
selectItemPair(item_pair, select_item);
}
@@ -552,15 +653,6 @@ BOOL LLFlatListView::handleKeyHere(KEY key, MASK mask)
}
break;
}
- case 'A':
- {
- if(MASK_CONTROL & mask)
- {
- selectAll();
- handled = TRUE;
- }
- break;
- }
default:
break;
}
@@ -670,6 +762,8 @@ bool LLFlatListView::selectItemPair(item_pair_t* item_pair, bool select)
// Stretch selected item rect to ensure it won't be clipped
mSelectedItemsBorder->setRect(getLastSelectedItemRect().stretch(-1));
+ // By default mark it as not consecutive selection
+ mIsConsecutiveSelection = false;
return true;
}
@@ -686,14 +780,44 @@ LLRect LLFlatListView::getLastSelectedItemRect()
void LLFlatListView::selectFirstItem ()
{
- selectItemPair(mItemPairs.front(), true);
- ensureSelectedVisible();
+ // No items - no actions!
+ if (0 == size()) return;
+
+ // Select first visible item
+ for (pairs_iterator_t
+ iter = mItemPairs.begin(),
+ iter_end = mItemPairs.end();
+ iter != iter_end; ++iter)
+ {
+ // skip invisible items
+ if ( (*iter)->first->getVisible() )
+ {
+ selectItemPair(*iter, true);
+ ensureSelectedVisible();
+ break;
+ }
+ }
}
void LLFlatListView::selectLastItem ()
{
- selectItemPair(mItemPairs.back(), true);
- ensureSelectedVisible();
+ // No items - no actions!
+ if (0 == size()) return;
+
+ // Select last visible item
+ for (pairs_list_t::reverse_iterator
+ r_iter = mItemPairs.rbegin(),
+ r_iter_end = mItemPairs.rend();
+ r_iter != r_iter_end; ++r_iter)
+ {
+ // skip invisible items
+ if ( (*r_iter)->first->getVisible() )
+ {
+ selectItemPair(*r_iter, true);
+ ensureSelectedVisible();
+ break;
+ }
+ }
}
void LLFlatListView::ensureSelectedVisible()
@@ -711,14 +835,25 @@ void LLFlatListView::ensureSelectedVisible()
bool LLFlatListView::selectNextItemPair(bool is_up_direction, bool reset_selection)
{
// No items - no actions!
- if ( !mItemPairs.size() )
+ if ( 0 == size() )
return false;
-
- item_pair_t* to_sel_pair = NULL;
- item_pair_t* cur_sel_pair = NULL;
+ if (!mIsConsecutiveSelection)
+ {
+ // Leave only one item selected if list has not consecutive selection
+ if (mSelectedItemPairs.size() && !reset_selection)
+ {
+ item_pair_t* cur_sel_pair = mSelectedItemPairs.back();
+ resetSelection();
+ selectItemPair (cur_sel_pair, true);
+ }
+ }
+
if ( mSelectedItemPairs.size() )
{
+ item_pair_t* to_sel_pair = NULL;
+ item_pair_t* cur_sel_pair = NULL;
+
// Take the last selected pair
cur_sel_pair = mSelectedItemPairs.back();
// Bases on given direction choose next item to select
@@ -752,43 +887,52 @@ bool LLFlatListView::selectNextItemPair(bool is_up_direction, bool reset_selecti
}
}
}
+
+ if ( to_sel_pair )
+ {
+ bool select = true;
+ if ( reset_selection )
+ {
+ // Reset current selection if we were asked about it
+ resetSelection();
+ }
+ else
+ {
+ // If item already selected and no reset request than we should deselect last selected item.
+ select = (mSelectedItemPairs.end() == std::find(mSelectedItemPairs.begin(), mSelectedItemPairs.end(), to_sel_pair));
+ }
+ // Select/Deselect next item
+ selectItemPair(select ? to_sel_pair : cur_sel_pair, select);
+ // Mark it as consecutive selection
+ mIsConsecutiveSelection = true;
+ return true;
+ }
}
else
{
// If there weren't selected items then choose the first one bases on given direction
- cur_sel_pair = (is_up_direction) ? mItemPairs.back() : mItemPairs.front();
// Force selection to first item
- to_sel_pair = cur_sel_pair;
- }
-
-
- if ( to_sel_pair )
- {
- bool select = true;
-
- if ( reset_selection )
- {
- // Reset current selection if we were asked about it
- resetSelection();
- }
+ if (is_up_direction)
+ selectLastItem();
else
- {
- // If item already selected and no reset request than we should deselect last selected item.
- select = (mSelectedItemPairs.end() == std::find(mSelectedItemPairs.begin(), mSelectedItemPairs.end(), to_sel_pair));
- }
-
- // Select/Deselect next item
- selectItemPair(select ? to_sel_pair : cur_sel_pair, select);
-
+ selectFirstItem();
+ // Mark it as consecutive selection
+ mIsConsecutiveSelection = true;
return true;
}
+
return false;
}
-bool LLFlatListView::selectAll()
+BOOL LLFlatListView::canSelectAll() const
{
- if (!mAllowSelection)
- return false;
+ return 0 != size() && mAllowSelection && mMultipleSelection;
+}
+
+void LLFlatListView::selectAll()
+{
+ if (!mAllowSelection || !mMultipleSelection)
+ return;
mSelectedItemPairs.clear();
@@ -808,8 +952,6 @@ bool LLFlatListView::selectAll()
// Stretch selected item rect to ensure it won't be clipped
mSelectedItemsBorder->setRect(getLastSelectedItemRect().stretch(-1));
-
- return true;
}
bool LLFlatListView::isSelected(item_pair_t* item_pair) const
@@ -947,11 +1089,17 @@ void LLFlatListView::getValues(std::vector<LLSD>& values) const
void LLFlatListView::onFocusReceived()
{
mSelectedItemsBorder->setVisible(TRUE);
+ gEditMenuHandler = this;
}
// virtual
void LLFlatListView::onFocusLost()
{
mSelectedItemsBorder->setVisible(FALSE);
+ // Route menu back to the default
+ if( gEditMenuHandler == this )
+ {
+ gEditMenuHandler = NULL;
+ }
}
//virtual
@@ -1055,4 +1203,90 @@ void LLFlatListView::detachItems(std::vector<LLPanel*>& detached_items)
}
}
+
+/************************************************************************/
+/* LLFlatListViewEx implementation */
+/************************************************************************/
+LLFlatListViewEx::Params::Params()
+: no_items_msg("no_items_msg")
+, no_filtered_items_msg("no_filtered_items_msg")
+{
+
+}
+
+LLFlatListViewEx::LLFlatListViewEx(const Params& p)
+: LLFlatListView(p)
+, mNoFilteredItemsMsg(p.no_filtered_items_msg)
+, mNoItemsMsg(p.no_items_msg)
+{
+
+}
+
+void LLFlatListViewEx::updateNoItemsMessage(const std::string& filter_string)
+{
+ bool items_filtered = !filter_string.empty();
+ if (items_filtered)
+ {
+ // items were filtered
+ LLStringUtil::format_map_t args;
+ args["[SEARCH_TERM]"] = LLURI::escape(filter_string);
+ std::string text = mNoFilteredItemsMsg;
+ LLStringUtil::format(text, args);
+ setNoItemsCommentText(text);
+ }
+ else
+ {
+ // list does not contain any items at all
+ setNoItemsCommentText(mNoItemsMsg);
+ }
+
+}
+
+void LLFlatListViewEx::setFilterSubString(const std::string& filter_str)
+{
+ if (0 != LLStringUtil::compareInsensitive(filter_str, mFilterSubString))
+ {
+ mFilterSubString = filter_str;
+ updateNoItemsMessage(mFilterSubString);
+ filterItems();
+ }
+}
+
+void LLFlatListViewEx::filterItems()
+{
+ typedef std::vector <LLPanel*> item_panel_list_t;
+
+ std::string cur_filter = mFilterSubString;
+ LLStringUtil::toUpper(cur_filter);
+
+ LLSD action;
+ action.with("match_filter", cur_filter);
+
+ item_panel_list_t items;
+ getItems(items);
+
+ for (item_panel_list_t::iterator
+ iter = items.begin(),
+ iter_end = items.end();
+ iter != iter_end; ++iter)
+ {
+ LLPanel* pItem = (*iter);
+ // 0 signifies that filter is matched,
+ // i.e. we don't hide items that don't support 'match_filter' action, separators etc.
+ if (0 == pItem->notify(action))
+ {
+ pItem->setVisible(true);
+ }
+ else
+ {
+ // TODO: implement (re)storing of current selection.
+ selectItem(pItem, false);
+ pItem->setVisible(false);
+ }
+ }
+
+ sort();
+ notifyParentItemsRectChanged();
+}
+
//EOF
diff --git a/indra/llui/llflatlistview.h b/indra/llui/llflatlistview.h
index 92cb40332e..f4e0426f15 100644
--- a/indra/llui/llflatlistview.h
+++ b/indra/llui/llflatlistview.h
@@ -1,10 +1,10 @@
/**
* @file llflatlistview.h
- * @brief LLFlatListView base class
+ * @brief LLFlatListView base class and extension to support messages for several cases of an empty list.
*
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
- * Copyright (c) 2009, Linden Research, Inc.
+ * Copyright (c) 2009-2010, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
@@ -58,7 +58,7 @@
* - Order of returned selected items are not guaranteed
* - The control assumes that all items being added are unique.
*/
-class LLFlatListView : public LLScrollContainer
+class LLFlatListView : public LLScrollContainer, public LLEditMenuHandler
{
public:
@@ -114,8 +114,6 @@ public:
Params();
};
- virtual ~LLFlatListView() { clear(); };
-
/**
* Connects callback to signal called when Return key is pressed.
*/
@@ -224,7 +222,7 @@ public:
* Get LLUUIDs associated with selected items
* @param selected_uuids An std::vector being populated with LLUUIDs associated with selected items
*/
- virtual void getSelectedUUIDs(std::vector<LLUUID>& selected_uuids) const;
+ virtual void getSelectedUUIDs(uuid_vec_t& selected_uuids) const;
/** Get the top selected item */
virtual LLPanel* getSelectedItem() const;
@@ -266,9 +264,8 @@ public:
/** Get number of selected items in the list */
U32 numSelected() const {return mSelectedItemPairs.size(); }
- /** Get number of items in the list */
- U32 size() const { return mItemPairs.size(); }
-
+ /** Get number of (visible) items in the list */
+ U32 size(const bool only_visible_items = true) const;
/** Removes all items from the list */
virtual void clear();
@@ -344,7 +341,8 @@ protected:
virtual bool selectNextItemPair(bool is_up_direction, bool reset_selection);
- virtual bool selectAll();
+ virtual BOOL canSelectAll() const;
+ virtual void selectAll();
virtual bool isSelected(item_pair_t* item_pair) const;
@@ -379,11 +377,14 @@ private:
void setNoItemsCommentVisible(bool visible) const;
-private:
+protected:
/** Comparator to use when sorting the list. */
const ItemComparator* mItemComparator;
+
+private:
+
LLPanel* mItemsPanel;
S32 mItemsNoScrollWidth;
@@ -409,6 +410,8 @@ private:
bool mKeepOneItemSelected;
+ bool mIsConsecutiveSelection;
+
/** All pairs of the list */
pairs_list_t mItemPairs;
@@ -428,4 +431,66 @@ private:
commit_signal_t mOnReturnSignal;
};
+/**
+ * Extends LLFlatListView functionality to show different messages when there are no items in the
+ * list depend on whether they are filtered or not.
+ *
+ * Class provides one message per case of empty list.
+ * It also provides protected updateNoItemsMessage() method to be called each time when derived list
+ * is changed to update base mNoItemsCommentTextbox value.
+ *
+ * It is implemented to avoid duplication of this functionality in concrete implementations of the
+ * lists. It is intended to be used as a base class for lists which should support two different
+ * messages for empty state. Can be improved to support more than two messages via state-to-message map.
+ */
+class LLFlatListViewEx : public LLFlatListView
+{
+public:
+ struct Params : public LLInitParam::Block<Params, LLFlatListView::Params>
+ {
+ /**
+ * Contains a message for empty list when it does not contain any items at all.
+ */
+ Optional<std::string> no_items_msg;
+
+ /**
+ * Contains a message for empty list when its items are removed by filtering.
+ */
+ Optional<std::string> no_filtered_items_msg;
+ Params();
+ };
+
+ // *WORKAROUND: two methods to overload appropriate Params due to localization issue:
+ // no_items_msg & no_filtered_items_msg attributes are not defined as translatable in VLT. See EXT-5931
+ void setNoItemsMsg(const std::string& msg) { mNoItemsMsg = msg; }
+ void setNoFilteredItemsMsg(const std::string& msg) { mNoFilteredItemsMsg = msg; }
+
+ /**
+ * Sets up new filter string and filters the list.
+ */
+ void setFilterSubString(const std::string& filter_str);
+
+ /**
+ * Filters the list, rearranges and notifies parent about shape changes.
+ * Derived classes may want to overload rearrangeItems() to exclude repeated separators after filtration.
+ */
+ void filterItems();
+
+protected:
+ LLFlatListViewEx(const Params& p);
+
+ /**
+ * Applies a message for empty list depend on passed argument.
+ *
+ * @param filter_string - if is not empty, message for filtered items will be set, otherwise for
+ * completely empty list. Value of filter string will be passed as search_term in SLURL.
+ */
+ void updateNoItemsMessage(const std::string& filter_string);
+
+private:
+ std::string mNoFilteredItemsMsg;
+ std::string mNoItemsMsg;
+ std::string mFilterSubString;
+};
+
#endif
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index a55915af35..9a56372e68 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -169,6 +169,7 @@ LLFloater::Params::Params()
save_rect("save_rect", false),
save_visibility("save_visibility", false),
can_dock("can_dock", false),
+ open_centered("open_centered", false),
header_height("header_height", 0),
legacy_header_height("legacy_header_height", 0),
close_image("close_image"),
@@ -329,6 +330,7 @@ void LLFloater::addDragHandle()
addChild(mDragHandle);
}
layoutDragHandle();
+ applyTitle();
}
void LLFloater::layoutDragHandle()
@@ -345,9 +347,8 @@ void LLFloater::layoutDragHandle()
{
rect = getLocalRect();
}
- mDragHandle->setRect(rect);
- updateButtons();
- applyTitle();
+ mDragHandle->setShape(rect);
+ updateTitleButtons();
}
void LLFloater::addResizeCtrls()
@@ -527,10 +528,7 @@ void LLFloater::setVisible( BOOL visible )
if( !visible )
{
- if( gFocusMgr.childIsTopCtrl( this ) )
- {
- gFocusMgr.setTopCtrl(NULL);
- }
+ LLUI::removePopup(this);
if( gFocusMgr.childHasMouseCapture( this ) )
{
@@ -566,6 +564,7 @@ void LLFloater::handleVisibilityChange ( BOOL new_visibility )
void LLFloater::openFloater(const LLSD& key)
{
+ llinfos << "Opening floater " << getName() << llendl;
mKey = key; // in case we need to open ourselves again
if (getSoundFlags() != SILENT
@@ -606,6 +605,7 @@ void LLFloater::openFloater(const LLSD& key)
void LLFloater::closeFloater(bool app_quitting)
{
+ llinfos << "Closing floater " << getName() << llendl;
if (app_quitting)
{
LLFloater::sQuitting = true;
@@ -704,10 +704,7 @@ void LLFloater::reshape(S32 width, S32 height, BOOL called_from_parent)
void LLFloater::releaseFocus()
{
- if( gFocusMgr.childIsTopCtrl( this ) )
- {
- gFocusMgr.setTopCtrl(NULL);
- }
+ LLUI::removePopup(this);
setFocus(FALSE);
@@ -767,6 +764,13 @@ void LLFloater::applySavedVariables()
void LLFloater::applyRectControl()
{
+ // first, center on screen if requested
+ if (mOpenCentered)
+ {
+ center();
+ }
+
+ // override center if we have saved rect control
if (mRectControl.size() > 1)
{
const LLRect& rect = LLUI::sSettingGroups["floater"]->getRect(mRectControl);
@@ -806,6 +810,11 @@ void LLFloater::applyTitle()
{
mDragHandle->setTitle ( mTitle );
}
+
+ if (getHost())
+ {
+ getHost()->updateFloaterTitle(this);
+ }
}
std::string LLFloater::getCurrentTitle() const
@@ -1067,11 +1076,10 @@ void LLFloater::setMinimized(BOOL minimize)
// Reshape *after* setting mMinimized
reshape( mExpandedRect.getWidth(), mExpandedRect.getHeight(), TRUE );
}
-
- applyTitle ();
make_ui_sound("UISndWindowClose");
- updateButtons();
+ updateTitleButtons();
+ applyTitle ();
}
void LLFloater::setFocus( BOOL b )
@@ -1127,6 +1135,7 @@ void LLFloater::setIsChrome(BOOL is_chrome)
setFocus(FALSE);
// can't Ctrl-Tab to "chrome" floaters
setFocusRoot(FALSE);
+ mButtons[BUTTON_CLOSE]->setToolTip(LLStringExplicit(getButtonTooltip(Params(), BUTTON_CLOSE, is_chrome)));
}
// no titles displayed on "chrome" floaters
@@ -1196,7 +1205,7 @@ void LLFloater::setHost(LLMultiFloater* host)
mButtonScale = 1.f;
//mButtonsEnabled[BUTTON_TEAR_OFF] = FALSE;
}
- updateButtons();
+ updateTitleButtons();
if (host)
{
mHostHandle = host->getHandle();
@@ -1360,7 +1369,6 @@ void LLFloater::bringToFront( S32 x, S32 y )
// virtual
void LLFloater::setVisibleAndFrontmost(BOOL take_focus)
{
- gFocusMgr.setTopCtrl(NULL);
setVisible(TRUE);
setFrontmost(take_focus);
}
@@ -1396,7 +1404,7 @@ void LLFloater::setCanDock(bool b)
mButtonsEnabled[BUTTON_DOCK] = FALSE;
}
}
- updateButtons();
+ updateTitleButtons();
}
void LLFloater::setDocked(bool docked, bool pop_on_undock)
@@ -1405,7 +1413,7 @@ void LLFloater::setDocked(bool docked, bool pop_on_undock)
{
mDocked = docked;
mButtonsEnabled[BUTTON_DOCK] = !mDocked;
- updateButtons();
+ updateTitleButtons();
storeDockStateControl();
}
@@ -1458,7 +1466,7 @@ void LLFloater::onClickTearOff(LLFloater* self)
}
self->setTornOff(false);
}
- self->updateButtons();
+ self->updateTitleButtons();
}
// static
@@ -1554,7 +1562,12 @@ void LLFloater::onClickClose( LLFloater* self )
{
if (!self)
return;
- self->closeFloater(false);
+ self->onClickCloseBtn();
+}
+
+void LLFloater::onClickCloseBtn()
+{
+ closeFloater(false);
}
@@ -1565,43 +1578,34 @@ void LLFloater::draw()
// draw background
if( isBackgroundVisible() )
{
+ drawShadow(this);
+
S32 left = LLPANEL_BORDER_WIDTH;
S32 top = getRect().getHeight() - LLPANEL_BORDER_WIDTH;
S32 right = getRect().getWidth() - LLPANEL_BORDER_WIDTH;
S32 bottom = LLPANEL_BORDER_WIDTH;
- static LLUICachedControl<S32> shadow_offset_S32 ("DropShadowFloater", 0);
- static LLUIColor shadow_color_cached = LLUIColorTable::instance().getColor("ColorDropShadow");
- LLColor4 shadow_color = shadow_color_cached;
- F32 shadow_offset = (F32)shadow_offset_S32;
-
- if (!isBackgroundOpaque())
- {
- shadow_offset *= 0.2f;
- shadow_color.mV[VALPHA] *= 0.5f;
- }
- gl_drop_shadow(left, top, right, bottom,
- shadow_color % alpha,
- llround(shadow_offset));
-
LLUIImage* image = NULL;
LLColor4 color;
+ LLColor4 overlay_color;
if (isBackgroundOpaque())
{
// NOTE: image may not be set
image = getBackgroundImage();
color = getBackgroundColor();
+ overlay_color = getBackgroundImageOverlay();
}
else
{
image = getTransparentImage();
color = getTransparentColor();
+ overlay_color = getTransparentImageOverlay();
}
if (image)
{
// We're using images for this floater's backgrounds
- image->draw(getLocalRect(), UI_VERTEX_COLOR % alpha);
+ image->draw(getLocalRect(), overlay_color % alpha);
}
else
{
@@ -1666,6 +1670,29 @@ void LLFloater::draw()
}
}
+void LLFloater::drawShadow(LLPanel* panel)
+{
+ F32 alpha = panel->getDrawContext().mAlpha;
+ S32 left = LLPANEL_BORDER_WIDTH;
+ S32 top = panel->getRect().getHeight() - LLPANEL_BORDER_WIDTH;
+ S32 right = panel->getRect().getWidth() - LLPANEL_BORDER_WIDTH;
+ S32 bottom = LLPANEL_BORDER_WIDTH;
+
+ static LLUICachedControl<S32> shadow_offset_S32 ("DropShadowFloater", 0);
+ static LLUIColor shadow_color_cached = LLUIColorTable::instance().getColor("ColorDropShadow");
+ LLColor4 shadow_color = shadow_color_cached;
+ F32 shadow_offset = (F32)shadow_offset_S32;
+
+ if (!panel->isBackgroundOpaque())
+ {
+ shadow_offset *= 0.2f;
+ shadow_color.mV[VALPHA] *= 0.5f;
+ }
+ gl_drop_shadow(left, top, right, bottom,
+ shadow_color % alpha,
+ llround(shadow_offset));
+}
+
void LLFloater::setCanMinimize(BOOL can_minimize)
{
// if removing minimize/restore button programmatically,
@@ -1679,7 +1706,7 @@ void LLFloater::setCanMinimize(BOOL can_minimize)
mButtonsEnabled[BUTTON_MINIMIZE] = can_minimize && !isMinimized();
mButtonsEnabled[BUTTON_RESTORE] = can_minimize && isMinimized();
- updateButtons();
+ updateTitleButtons();
}
void LLFloater::setCanClose(BOOL can_close)
@@ -1687,7 +1714,7 @@ void LLFloater::setCanClose(BOOL can_close)
mCanClose = can_close;
mButtonsEnabled[BUTTON_CLOSE] = can_close;
- updateButtons();
+ updateTitleButtons();
}
void LLFloater::setCanTearOff(BOOL can_tear_off)
@@ -1695,7 +1722,7 @@ void LLFloater::setCanTearOff(BOOL can_tear_off)
mCanTearOff = can_tear_off;
mButtonsEnabled[BUTTON_TEAR_OFF] = mCanTearOff && !mHostHandle.isDead();
- updateButtons();
+ updateTitleButtons();
}
@@ -1719,10 +1746,11 @@ void LLFloater::setCanDrag(BOOL can_drag)
}
}
-void LLFloater::updateButtons()
+void LLFloater::updateTitleButtons()
{
static LLUICachedControl<S32> floater_close_box_size ("UIFloaterCloseBoxSize", 0);
static LLUICachedControl<S32> close_box_from_top ("UICloseBoxFromTop", 0);
+ LLRect buttons_rect;
S32 button_count = 0;
for (S32 i = 0; i < BUTTON_COUNT; i++)
{
@@ -1773,6 +1801,18 @@ void LLFloater::updateButtons()
llround((F32)floater_close_box_size * mButtonScale));
}
+ // first time here, init 'buttons_rect'
+ if(1 == button_count)
+ {
+ buttons_rect = btn_rect;
+ }
+ else
+ {
+ // if mDragOnLeft=true then buttons are on top-left side vertically aligned
+ // title is not displayed in this case, calculating 'buttons_rect' for future use
+ mDragOnLeft ? buttons_rect.mBottom -= btn_rect.mBottom :
+ buttons_rect.mLeft = btn_rect.mLeft;
+ }
mButtons[i]->setRect(btn_rect);
mButtons[i]->setVisible(TRUE);
// the restore button should have a tab stop so that it takes action when you Ctrl-Tab to a minimized floater
@@ -1784,7 +1824,10 @@ void LLFloater::updateButtons()
}
}
if (mDragHandle)
- mDragHandle->setMaxTitleWidth(getRect().getWidth() - (button_count * (floater_close_box_size + 1)));
+ {
+ localRectToOtherView(buttons_rect, &buttons_rect, mDragHandle);
+ mDragHandle->setButtonsRect(buttons_rect);
+ }
}
void LLFloater::buildButtons(const Params& floater_params)
@@ -1832,7 +1875,7 @@ void LLFloater::buildButtons(const Params& floater_params)
p.click_callback.function(boost::bind(sButtonCallbacks[i], this));
p.tab_stop(false);
p.follows.flags(FOLLOWS_TOP|FOLLOWS_RIGHT);
- p.tool_tip = getButtonTooltip(floater_params, (EFloaterButton)i);
+ p.tool_tip = getButtonTooltip(floater_params, (EFloaterButton)i, getIsChrome());
p.scale_image(true);
p.chrome(true);
@@ -1841,7 +1884,7 @@ void LLFloater::buildButtons(const Params& floater_params)
mButtons[i] = buttonp;
}
- updateButtons();
+ updateTitleButtons();
}
// static
@@ -1887,8 +1930,15 @@ LLUIImage* LLFloater::getButtonPressedImage(const Params& p, EFloaterButton e)
}
// static
-std::string LLFloater::getButtonTooltip(const Params& p, EFloaterButton e)
+std::string LLFloater::getButtonTooltip(const Params& p, EFloaterButton e, bool is_chrome)
{
+ // EXT-4081 (Lag Meter: Ctrl+W does not close floater)
+ // If floater is chrome set 'Close' text for close button's tooltip
+ if(is_chrome && BUTTON_CLOSE == e)
+ {
+ static std::string close_tooltip_chrome = LLTrans::getString("BUTTON_CLOSE_CHROME");
+ return close_tooltip_chrome;
+ }
// TODO: per-floater localizable tooltips set in XML
return sButtonToolTips[e];
}
@@ -2376,10 +2426,17 @@ void LLFloaterView::adjustToFitScreen(LLFloater* floater, BOOL allow_partial_out
LLRect new_rect;
new_rect.setLeftTopAndSize(view_rect.mLeft,view_rect.mTop,new_width, new_height);
- floater->reshape( new_width, new_height, TRUE );
- floater->setRect(new_rect);
+ floater->setShape(new_rect);
- floater->translateIntoRect( getLocalRect(), false );
+ if (floater->followsRight())
+ {
+ floater->translate(old_width - new_width, 0);
+ }
+
+ if (floater->followsTop())
+ {
+ floater->translate(0, old_height - new_height);
+ }
}
}
@@ -2467,7 +2524,7 @@ LLFloater *LLFloaterView::getBackmost() const
void LLFloaterView::syncFloaterTabOrder()
{
- // look for a visible modal dialog, starting from first (should be only one)
+ // look for a visible modal dialog, starting from first
LLModalDialog* modal_dialog = NULL;
for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it)
{
@@ -2482,10 +2539,7 @@ void LLFloaterView::syncFloaterTabOrder()
if (modal_dialog)
{
// If we have a visible modal dialog, make sure that it has focus
- if( gFocusMgr.getTopCtrl() != modal_dialog )
- {
- gFocusMgr.setTopCtrl( modal_dialog );
- }
+ LLUI::addPopup(modal_dialog);
if( !gFocusMgr.childHasKeyboardFocus( modal_dialog ) )
{
@@ -2670,6 +2724,7 @@ void LLFloater::initFromParams(const LLFloater::Params& p)
mLegacyHeaderHeight = p.legacy_header_height;
mSingleInstance = p.single_instance;
mAutoTile = p.auto_tile;
+ mOpenCentered = p.open_centered;
if (p.save_rect)
{
@@ -2794,3 +2849,15 @@ bool LLFloater::isShown(const LLFloater* floater)
{
return floater && floater->isShown();
}
+
+/* static */
+bool LLFloater::isMinimized(const LLFloater* floater)
+{
+ return floater && floater->isMinimized();
+}
+
+/* static */
+bool LLFloater::isVisible(const LLFloater* floater)
+{
+ return floater && floater->getVisible();
+}
diff --git a/indra/llui/llfloater.h b/indra/llui/llfloater.h
index 2166d8db8a..654164ddc0 100644
--- a/indra/llui/llfloater.h
+++ b/indra/llui/llfloater.h
@@ -110,7 +110,8 @@ public:
save_rect,
save_visibility,
save_dock_state,
- can_dock;
+ can_dock,
+ open_centered;
Optional<S32> header_height,
legacy_header_height; // HACK see initFromXML()
@@ -194,6 +195,8 @@ public:
/// The static isShown() can accept a NULL pointer (which of course
/// returns false). When non-NULL, it calls the non-static isShown().
static bool isShown(const LLFloater* floater);
+ static bool isVisible(const LLFloater* floater);
+ static bool isMinimized(const LLFloater* floater);
BOOL isFirstLook() { return mFirstLook; } // EXT-2653: This function is necessary to prevent overlapping for secondary showed toasts
BOOL isFrontmost();
BOOL isDependent() { return !mDependeeHandle.isDead(); }
@@ -222,6 +225,7 @@ public:
virtual BOOL handleScrollWheel(S32 x, S32 y, S32 mask);
virtual void draw();
+ virtual void drawShadow(LLPanel* panel);
virtual void onOpen(const LLSD& key) {}
virtual void onClose(bool app_quitting) {}
@@ -306,19 +310,28 @@ protected:
void destroy() { die(); } // Don't call this directly. You probably want to call closeFloater()
+ virtual void onClickCloseBtn();
+
+ virtual void updateTitleButtons();
+
private:
void setForeground(BOOL b); // called only by floaterview
void cleanupHandles(); // remove handles to dead floaters
void createMinimizeButton();
- void updateButtons();
void buildButtons(const Params& p);
// Images and tooltips are named in the XML, but we want to look them
// up by index.
static LLUIImage* getButtonImage(const Params& p, EFloaterButton e);
static LLUIImage* getButtonPressedImage(const Params& p, EFloaterButton e);
- static std::string getButtonTooltip(const Params& p, EFloaterButton e);
+ /**
+ * @params is_chrome - if floater is Chrome it means that floater will never get focus.
+ * Therefore it can't be closed with 'Ctrl+W'. So the tooltip text of close button( X )
+ * should be 'Close' not 'Close(Ctrl+W)' as for usual floaters.
+ */
+ static std::string getButtonTooltip(const Params& p, EFloaterButton e, bool is_chrome);
+
BOOL offerClickToButton(S32 x, S32 y, MASK mask, EFloaterButton index);
void addResizeCtrls();
void layoutResizeCtrls();
@@ -345,6 +358,7 @@ protected:
LLResizeBar* mResizeBar[4];
LLResizeHandle* mResizeHandle[4];
+ LLButton* mButtons[BUTTON_COUNT];
private:
LLRect mExpandedRect;
@@ -360,6 +374,7 @@ private:
BOOL mCanClose;
BOOL mDragOnLeft;
BOOL mResizable;
+ bool mOpenCentered;
S32 mMinWidth;
S32 mMinHeight;
@@ -378,7 +393,6 @@ private:
handle_set_t mDependents;
bool mButtonsEnabled[BUTTON_COUNT];
- LLButton* mButtons[BUTTON_COUNT];
F32 mButtonScale;
BOOL mAutoFocus;
LLHandle<LLFloater> mSnappedTo;
@@ -420,11 +434,15 @@ private:
class LLFloaterView : public LLUICtrl
{
+public:
+ struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>{};
+
protected:
LLFloaterView (const Params& p);
friend class LLUICtrlFactory;
public:
+
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
void reshapeFloater(S32 width, S32 height, BOOL called_from_parent, BOOL adjust_vertical);
diff --git a/indra/llui/llfloaterreg.cpp b/indra/llui/llfloaterreg.cpp
index 5de3934c8a..85f9af126c 100644
--- a/indra/llui/llfloaterreg.cpp
+++ b/indra/llui/llfloaterreg.cpp
@@ -47,6 +47,7 @@ LLFloaterReg::instance_map_t LLFloaterReg::sInstanceMap;
LLFloaterReg::build_map_t LLFloaterReg::sBuildMap;
std::map<std::string,std::string> LLFloaterReg::sGroupMap;
bool LLFloaterReg::sBlockShowFloaters = false;
+std::set<std::string> LLFloaterReg::sAlwaysShowableList;
static LLFloaterRegListener sFloaterRegListener;
@@ -219,7 +220,9 @@ LLFloaterReg::const_instance_list_t& LLFloaterReg::getFloaterList(const std::str
//static
LLFloater* LLFloaterReg::showInstance(const std::string& name, const LLSD& key, BOOL focus)
{
- if( sBlockShowFloaters )
+ if( sBlockShowFloaters
+ // see EXT-7090
+ && sAlwaysShowableList.find(name) == sAlwaysShowableList.end())
return 0;//
LLFloater* instance = getInstance(name, key);
if (instance)
@@ -272,11 +275,11 @@ bool LLFloaterReg::toggleInstance(const std::string& name, const LLSD& key)
}
//static
-// returns true if the instance exists and is visible
+// returns true if the instance exists and is visible (doesnt matter minimized or not)
bool LLFloaterReg::instanceVisible(const std::string& name, const LLSD& key)
{
LLFloater* instance = findInstance(name, key);
- return LLFloater::isShown(instance);
+ return LLFloater::isVisible(instance);
}
//static
@@ -403,6 +406,14 @@ void LLFloaterReg::registerControlVariables()
declareVisibilityControl(name);
}
}
+
+ const LLSD& exclude_list = LLUI::sSettingGroups["config"]->getLLSD("always_showable_floaters");
+ for (LLSD::array_const_iterator iter = exclude_list.beginArray();
+ iter != exclude_list.endArray();
+ iter++)
+ {
+ sAlwaysShowableList.insert(iter->asString());
+ }
}
// Callbacks
@@ -463,3 +474,12 @@ bool LLFloaterReg::floaterInstanceVisible(const LLSD& sdname)
return instanceVisible(name, key);
}
+//static
+bool LLFloaterReg::floaterInstanceMinimized(const LLSD& sdname)
+{
+ LLSD key;
+ std::string name = sdname.asString();
+ parse_name_key(name, key);
+ LLFloater* instance = findInstance(name, key);
+ return LLFloater::isShown(instance);
+}
diff --git a/indra/llui/llfloaterreg.h b/indra/llui/llfloaterreg.h
index 8a11d5c3f2..f1ba41f638 100644
--- a/indra/llui/llfloaterreg.h
+++ b/indra/llui/llfloaterreg.h
@@ -76,6 +76,10 @@ private:
static build_map_t sBuildMap;
static std::map<std::string,std::string> sGroupMap;
static bool sBlockShowFloaters;
+ /**
+ * Defines list of floater names that can be shown despite state of sBlockShowFloaters.
+ */
+ static std::set<std::string> sAlwaysShowableList;
public:
// Registration
@@ -134,6 +138,7 @@ public:
static void hideFloaterInstance(const LLSD& sdname);
static void toggleFloaterInstance(const LLSD& sdname);
static bool floaterInstanceVisible(const LLSD& sdname);
+ static bool floaterInstanceMinimized(const LLSD& sdname);
// Typed find / get / show
template <class T>
diff --git a/indra/llui/llfocusmgr.cpp b/indra/llui/llfocusmgr.cpp
index 35fbc7b0a8..b3af258456 100644
--- a/indra/llui/llfocusmgr.cpp
+++ b/indra/llui/llfocusmgr.cpp
@@ -38,8 +38,6 @@
const F32 FOCUS_FADE_TIME = 0.3f;
-// NOTE: the LLFocusableElement implementation has been moved here from lluictrl.cpp.
-
LLFocusableElement::LLFocusableElement()
: mFocusLostCallback(NULL),
mFocusReceivedCallback(NULL),
@@ -124,8 +122,7 @@ boost::signals2::connection LLFocusableElement::setTopLostCallback(const focus_s
LLFocusMgr gFocusMgr;
LLFocusMgr::LLFocusMgr()
- :
- mLockedView( NULL ),
+: mLockedView( NULL ),
mMouseCaptor( NULL ),
mKeyboardFocus( NULL ),
mLastKeyboardFocus( NULL ),
@@ -133,16 +130,11 @@ LLFocusMgr::LLFocusMgr()
mKeystrokesOnly(FALSE),
mTopCtrl( NULL ),
mAppHasFocus(TRUE) // Macs don't seem to notify us that we've gotten focus, so default to true
- #ifdef _DEBUG
- , mMouseCaptorName("none")
- , mKeyboardFocusName("none")
- , mTopCtrlName("none")
- #endif
{
}
-void LLFocusMgr::releaseFocusIfNeeded( const LLView* view )
+void LLFocusMgr::releaseFocusIfNeeded( LLView* view )
{
if( childHasMouseCapture( view ) )
{
@@ -162,10 +154,7 @@ void LLFocusMgr::releaseFocusIfNeeded( const LLView* view )
}
}
- if( childIsTopCtrl( view ) )
- {
- setTopCtrl( NULL );
- }
+ LLUI::removePopup(view);
}
@@ -248,11 +237,6 @@ void LLFocusMgr::setKeyboardFocus(LLFocusableElement* new_focus, BOOL lock, BOOL
return;
}
- #ifdef _DEBUG
- LLUICtrl* focus_ctrl = dynamic_cast<LLUICtrl*>(new_focus);
- mKeyboardFocusName = focus_ctrl ? focus_ctrl->getName() : std::string("none");
- #endif
-
// If we've got a default keyboard focus, and the caller is
// releasing keyboard focus, move to the default.
if (mDefaultKeyboardFocus != NULL && mKeyboardFocus == NULL)
@@ -334,20 +318,12 @@ void LLFocusMgr::removeKeyboardFocusWithoutCallback( const LLFocusableElement* f
if( mKeyboardFocus == focus )
{
mKeyboardFocus = NULL;
- #ifdef _DEBUG
- mKeyboardFocusName = std::string("none");
- #endif
}
}
void LLFocusMgr::setMouseCapture( LLMouseHandler* new_captor )
{
- //if (mFocusLocked)
- //{
- // return;
- //}
-
if( new_captor != mMouseCaptor )
{
LLMouseHandler* old_captor = mMouseCaptor;
@@ -370,24 +346,14 @@ void LLFocusMgr::setMouseCapture( LLMouseHandler* new_captor )
old_captor->onMouseCaptureLost();
}
- #ifdef _DEBUG
- mMouseCaptorName = new_captor ? new_captor->getName() : std::string("none");
- #endif
}
}
void LLFocusMgr::removeMouseCaptureWithoutCallback( const LLMouseHandler* captor )
{
- //if (mFocusLocked)
- //{
- // return;
- //}
if( mMouseCaptor == captor )
{
mMouseCaptor = NULL;
- #ifdef _DEBUG
- mMouseCaptorName = std::string("none");
- #endif
}
}
@@ -416,10 +382,6 @@ void LLFocusMgr::setTopCtrl( LLUICtrl* new_top )
{
mTopCtrl = new_top;
- #ifdef _DEBUG
- mTopCtrlName = new_top ? new_top->getName() : std::string("none");
- #endif
-
if (old_top)
{
old_top->onTopLost();
@@ -432,9 +394,6 @@ void LLFocusMgr::removeTopCtrlWithoutCallback( const LLUICtrl* top_view )
if( mTopCtrl == top_view )
{
mTopCtrl = NULL;
- #ifdef _DEBUG
- mTopCtrlName = std::string("none");
- #endif
}
}
@@ -478,9 +437,9 @@ void LLFocusMgr::setAppHasFocus(BOOL focus)
}
// release focus from "top ctrl"s, which generally hides them
- if (!focus && mTopCtrl)
+ if (!focus)
{
- setTopCtrl(NULL);
+ LLUI::clearPopups();
}
mAppHasFocus = focus;
}
diff --git a/indra/llui/llfocusmgr.h b/indra/llui/llfocusmgr.h
index 83ecd1d301..86d3ccf111 100644
--- a/indra/llui/llfocusmgr.h
+++ b/indra/llui/llfocusmgr.h
@@ -65,10 +65,10 @@ public:
virtual BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent);
virtual BOOL handleUnicodeChar(llwchar uni_char, BOOL called_from_parent);
+ virtual void onTopLost(); // called when registered as top ctrl and user clicks elsewhere
protected:
virtual void onFocusReceived();
virtual void onFocusLost();
- virtual void onTopLost(); // called when registered as top ctrl and user clicks elsewhere
focus_signal_t* mFocusLostCallback;
focus_signal_t* mFocusReceivedCallback;
focus_signal_t* mFocusChangedCallback;
@@ -119,7 +119,7 @@ public:
BOOL childIsTopCtrl( const LLView* parent ) const;
// All Three
- void releaseFocusIfNeeded( const LLView* top_view );
+ void releaseFocusIfNeeded( LLView* top_view );
void lockFocus();
void unlockFocus();
BOOL focusLocked() const { return mLockedView != NULL; }
@@ -149,12 +149,6 @@ private:
typedef std::map<LLHandle<LLView>, LLHandle<LLView> > focus_history_map_t;
focus_history_map_t mFocusHistory;
-
- #ifdef _DEBUG
- std::string mMouseCaptorName;
- std::string mKeyboardFocusName;
- std::string mTopCtrlName;
- #endif
};
extern LLFocusMgr gFocusMgr;
diff --git a/indra/llui/llhandle.h b/indra/llui/llhandle.h
index 899f6b9326..8ade327044 100644
--- a/indra/llui/llhandle.h
+++ b/indra/llui/llhandle.h
@@ -67,6 +67,13 @@ public:
return *this;
}
+ template<typename Subclass>
+ LLHandle<T>& operator =(const LLHandle<Subclass>& other)
+ {
+ mTombStone = other.mTombStone;
+ return *this;
+ }
+
bool isDead() const
{
return mTombStone->getTarget() == NULL;
diff --git a/indra/llui/lliconctrl.h b/indra/llui/lliconctrl.h
index 66368f979b..7e37600409 100644
--- a/indra/llui/lliconctrl.h
+++ b/indra/llui/lliconctrl.h
@@ -73,6 +73,7 @@ public:
std::string getImageName() const;
void setColor(const LLColor4& color) { mColor = color; }
+ void setImage(LLPointer<LLUIImage> image) { mImagep = image; }
private:
void setIconImageDrawSize() ;
diff --git a/indra/llui/llkeywords.cpp b/indra/llui/llkeywords.cpp
index ede32084d0..e9614ea660 100644
--- a/indra/llui/llkeywords.cpp
+++ b/indra/llui/llkeywords.cpp
@@ -218,6 +218,86 @@ void LLKeywords::addToken(LLKeywordToken::TOKEN_TYPE type,
llassert(0);
}
}
+LLKeywords::WStringMapIndex::WStringMapIndex(const WStringMapIndex& other)
+{
+ if(other.mOwner)
+ {
+ copyData(other.mData, other.mLength);
+ }
+ else
+ {
+ mOwner = false;
+ mLength = other.mLength;
+ mData = other.mData;
+ }
+}
+
+LLKeywords::WStringMapIndex::WStringMapIndex(const LLWString& str)
+{
+ copyData(str.data(), str.size());
+}
+
+LLKeywords::WStringMapIndex::WStringMapIndex(const llwchar *start, size_t length):
+mData(start), mLength(length), mOwner(false)
+{
+}
+
+LLKeywords::WStringMapIndex::~WStringMapIndex()
+{
+ if(mOwner)
+ delete[] mData;
+}
+
+void LLKeywords::WStringMapIndex::copyData(const llwchar *start, size_t length)
+{
+ llwchar *data = new llwchar[length];
+ memcpy((void*)data, (const void*)start, length * sizeof(llwchar));
+
+ mOwner = true;
+ mLength = length;
+ mData = data;
+}
+
+bool LLKeywords::WStringMapIndex::operator<(const LLKeywords::WStringMapIndex &other) const
+{
+ // NOTE: Since this is only used to organize a std::map, it doesn't matter if it uses correct collate order or not.
+ // The comparison only needs to strictly order all possible strings, and be stable.
+
+ bool result = false;
+ const llwchar* self_iter = mData;
+ const llwchar* self_end = mData + mLength;
+ const llwchar* other_iter = other.mData;
+ const llwchar* other_end = other.mData + other.mLength;
+
+ while(true)
+ {
+ if(other_iter >= other_end)
+ {
+ // We've hit the end of other.
+ // This covers two cases: other being shorter than self, or the strings being equal.
+ // In either case, we want to return false.
+ result = false;
+ break;
+ }
+ else if(self_iter >= self_end)
+ {
+ // self is shorter than other.
+ result = true;
+ break;
+ }
+ else if(*self_iter != *other_iter)
+ {
+ // The current character differs. The strings are not equal.
+ result = *self_iter < *other_iter;
+ break;
+ }
+
+ self_iter++;
+ other_iter++;
+ }
+
+ return result;
+}
LLColor3 LLKeywords::readColor( const std::string& s )
{
@@ -259,6 +339,9 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
{
if( *cur == '\n' )
{
+ LLTextSegmentPtr text_segment = new LLLineBreakTextSegment(cur-base);
+ text_segment->setToken( 0 );
+ insertSegment( *seg_list, text_segment, text_len, defaultColor, editor);
cur++;
if( !*cur || *cur == '\n' )
{
@@ -298,9 +381,8 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
}
S32 seg_end = cur - base;
- LLTextSegmentPtr text_segment = new LLNormalTextSegment( cur_token->getColor(), seg_start, seg_end, editor );
- text_segment->setToken( cur_token );
- insertSegment( seg_list, text_segment, text_len, defaultColor, editor);
+ //create segments from seg_start to seg_end
+ insertSegments(wtext, *seg_list,cur_token, text_len, seg_start, seg_end, defaultColor, editor);
line_done = TRUE; // to break out of second loop.
break;
}
@@ -406,11 +488,12 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
seg_end = seg_start + between_delimiters + cur_delimiter->getLength();
}
-
+ insertSegments(wtext, *seg_list,cur_delimiter, text_len, seg_start, seg_end, defaultColor, editor);
+ /*
LLTextSegmentPtr text_segment = new LLNormalTextSegment( cur_delimiter->getColor(), seg_start, seg_end, editor );
text_segment->setToken( cur_delimiter );
insertSegment( seg_list, text_segment, text_len, defaultColor, editor);
-
+ */
// Note: we don't increment cur, since the end of one delimited seg may be immediately
// followed by the start of another one.
continue;
@@ -429,7 +512,7 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
S32 seg_len = p - cur;
if( seg_len > 0 )
{
- LLWString word( cur, 0, seg_len );
+ WStringMapIndex word( cur, seg_len );
word_token_map_t::iterator map_iter = mWordTokenMap.find(word);
if( map_iter != mWordTokenMap.end() )
{
@@ -439,10 +522,7 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
// llinfos << "Seg: [" << word.c_str() << "]" << llendl;
-
- LLTextSegmentPtr text_segment = new LLNormalTextSegment( cur_token->getColor(), seg_start, seg_end, editor );
- text_segment->setToken( cur_token );
- insertSegment( seg_list, text_segment, text_len, defaultColor, editor);
+ insertSegments(wtext, *seg_list,cur_token, text_len, seg_start, seg_end, defaultColor, editor);
}
cur += seg_len;
continue;
@@ -457,24 +537,50 @@ void LLKeywords::findSegments(std::vector<LLTextSegmentPtr>* seg_list, const LLW
}
}
-void LLKeywords::insertSegment(std::vector<LLTextSegmentPtr>* seg_list, LLTextSegmentPtr new_segment, S32 text_len, const LLColor4 &defaultColor, LLTextEditor& editor )
+void LLKeywords::insertSegments(const LLWString& wtext, std::vector<LLTextSegmentPtr>& seg_list, LLKeywordToken* cur_token, S32 text_len, S32 seg_start, S32 seg_end, const LLColor4 &defaultColor, LLTextEditor& editor )
+{
+ std::string::size_type pos = wtext.find('\n',seg_start);
+
+ while (pos!=-1 && pos < (std::string::size_type)seg_end)
+ {
+ if (pos!=seg_start)
+ {
+ LLTextSegmentPtr text_segment = new LLNormalTextSegment( cur_token->getColor(), seg_start, pos, editor );
+ text_segment->setToken( cur_token );
+ insertSegment( seg_list, text_segment, text_len, defaultColor, editor);
+ }
+
+ LLTextSegmentPtr text_segment = new LLLineBreakTextSegment(pos);
+ text_segment->setToken( cur_token );
+ insertSegment( seg_list, text_segment, text_len, defaultColor, editor);
+
+ seg_start = pos+1;
+ pos = wtext.find('\n',seg_start);
+ }
+
+ LLTextSegmentPtr text_segment = new LLNormalTextSegment( cur_token->getColor(), seg_start, seg_end, editor );
+ text_segment->setToken( cur_token );
+ insertSegment( seg_list, text_segment, text_len, defaultColor, editor);
+}
+
+void LLKeywords::insertSegment(std::vector<LLTextSegmentPtr>& seg_list, LLTextSegmentPtr new_segment, S32 text_len, const LLColor4 &defaultColor, LLTextEditor& editor )
{
- LLTextSegmentPtr last = seg_list->back();
+ LLTextSegmentPtr last = seg_list.back();
S32 new_seg_end = new_segment->getEnd();
if( new_segment->getStart() == last->getStart() )
{
- seg_list->pop_back();
+ seg_list.pop_back();
}
else
{
last->setEnd( new_segment->getStart() );
}
- seg_list->push_back( new_segment );
+ seg_list.push_back( new_segment );
if( new_seg_end < text_len )
{
- seg_list->push_back( new LLNormalTextSegment( defaultColor, new_seg_end, text_len, editor ) );
+ seg_list.push_back( new LLNormalTextSegment( defaultColor, new_seg_end, text_len, editor ) );
}
}
diff --git a/indra/llui/llkeywords.h b/indra/llui/llkeywords.h
index 53377869ca..09378e408b 100644
--- a/indra/llui/llkeywords.h
+++ b/indra/llui/llkeywords.h
@@ -92,8 +92,33 @@ public:
const std::string& key,
const LLColor3& color,
const std::string& tool_tip = LLStringUtil::null);
-
- typedef std::map<LLWString, LLKeywordToken*> word_token_map_t;
+
+ // This class is here as a performance optimization.
+ // The word token map used to be defined as std::map<LLWString, LLKeywordToken*>.
+ // This worked, but caused a performance bottleneck due to memory allocation and string copies
+ // because it's not possible to search such a map without creating an LLWString.
+ // Using this class as the map index instead allows us to search using segments of an existing
+ // text run without copying them first, which greatly reduces overhead in LLKeywords::findSegments().
+ class WStringMapIndex
+ {
+ public:
+ // copy constructor
+ WStringMapIndex(const WStringMapIndex& other);
+ // constructor from a string (copies the string's data into the new object)
+ WStringMapIndex(const LLWString& str);
+ // constructor from pointer and length
+ // NOTE: does NOT copy data, caller must ensure that the lifetime of the pointer exceeds that of the new object!
+ WStringMapIndex(const llwchar *start, size_t length);
+ ~WStringMapIndex();
+ bool operator<(const WStringMapIndex &other) const;
+ private:
+ void copyData(const llwchar *start, size_t length);
+ const llwchar *mData;
+ size_t mLength;
+ bool mOwner;
+ };
+
+ typedef std::map<WStringMapIndex, LLKeywordToken*> word_token_map_t;
typedef word_token_map_t::const_iterator keyword_iterator_t;
keyword_iterator_t begin() const { return mWordTokenMap.begin(); }
keyword_iterator_t end() const { return mWordTokenMap.end(); }
@@ -104,7 +129,8 @@ public:
private:
LLColor3 readColor(const std::string& s);
- void insertSegment(std::vector<LLTextSegmentPtr> *seg_list, LLTextSegmentPtr new_segment, S32 text_len, const LLColor4 &defaultColor, class LLTextEditor& editor);
+ void insertSegment(std::vector<LLTextSegmentPtr>& seg_list, LLTextSegmentPtr new_segment, S32 text_len, const LLColor4 &defaultColor, class LLTextEditor& editor);
+ void insertSegments(const LLWString& wtext, std::vector<LLTextSegmentPtr>& seg_list, LLKeywordToken* token, S32 text_len, S32 seg_start, S32 seg_end, const LLColor4 &defaultColor, LLTextEditor& editor);
BOOL mLoaded;
word_token_map_t mWordTokenMap;
diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp
index 1aaba88c49..4512091371 100644
--- a/indra/llui/lllayoutstack.cpp
+++ b/indra/llui/lllayoutstack.cpp
@@ -49,9 +49,11 @@ static LLDefaultChildRegistry::Register<LLLayoutStack> register_layout_stack("la
//
struct LLLayoutStack::LayoutPanel
{
- LayoutPanel(LLPanel* panelp, ELayoutOrientation orientation, S32 min_width, S32 min_height, BOOL auto_resize, BOOL user_resize) : mPanel(panelp),
+ LayoutPanel(LLPanel* panelp, ELayoutOrientation orientation, S32 min_width, S32 min_height, S32 max_width, S32 max_height, BOOL auto_resize, BOOL user_resize) : mPanel(panelp),
mMinWidth(min_width),
mMinHeight(min_height),
+ mMaxWidth(max_width),
+ mMaxHeight(max_height),
mAutoResize(auto_resize),
mUserResize(user_resize),
mOrientation(orientation),
@@ -112,6 +114,11 @@ struct LLLayoutStack::LayoutPanel
LLPanel* mPanel;
S32 mMinWidth;
S32 mMinHeight;
+
+ // mMaxWidth & mMaxHeight are added to make configurable max width of the nearby chat bar. EXT-5589
+ // they are not processed by LLLayoutStack but they can be if necessary
+ S32 mMaxWidth;
+ S32 mMaxHeight;
BOOL mAutoResize;
BOOL mUserResize;
BOOL mCollapsed;
@@ -261,10 +268,14 @@ LLView* LLLayoutStack::fromXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr o
{
const S32 DEFAULT_MIN_WIDTH = 0;
const S32 DEFAULT_MIN_HEIGHT = 0;
+ const S32 DEFAULT_MAX_WIDTH = S32_MAX;
+ const S32 DEFAULT_MAX_HEIGHT = S32_MAX;
const BOOL DEFAULT_AUTO_RESIZE = TRUE;
S32 min_width = DEFAULT_MIN_WIDTH;
S32 min_height = DEFAULT_MIN_HEIGHT;
+ S32 max_width = DEFAULT_MAX_WIDTH;
+ S32 max_height = DEFAULT_MAX_HEIGHT;
BOOL auto_resize = DEFAULT_AUTO_RESIZE;
LLXMLNodePtr output_child;
@@ -281,6 +292,10 @@ LLView* LLLayoutStack::fromXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr o
DEFAULT_MIN_WIDTH, output_child);
get_attribute_s32_and_write(child_node, "min_height", &min_height,
DEFAULT_MIN_HEIGHT, output_child);
+ get_attribute_s32_and_write(child_node, "max_width", &max_width,
+ DEFAULT_MAX_WIDTH, output_child);
+ get_attribute_s32_and_write(child_node, "max_height", &max_height,
+ DEFAULT_MAX_HEIGHT, output_child);
get_attribute_bool_and_write(child_node, "auto_resize", &auto_resize,
DEFAULT_AUTO_RESIZE, output_child);
@@ -293,7 +308,7 @@ LLView* LLLayoutStack::fromXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr o
if (panelp)
{
panelp->setFollowsNone();
- layout_stackp->addPanel(panelp, min_width, min_height, auto_resize, user_resize);
+ layout_stackp->addPanel(panelp, min_width, min_height, max_width, max_height, auto_resize, user_resize);
}
}
else
@@ -309,7 +324,7 @@ LLView* LLLayoutStack::fromXML(LLXMLNodePtr node, LLView *parent, LLXMLNodePtr o
if (new_child)
{
// put child in new embedded panel
- layout_stackp->addPanel(panelp, min_width, min_height, auto_resize, user_resize);
+ layout_stackp->addPanel(panelp, min_width, min_height, max_width, max_height, auto_resize, user_resize);
// resize panel to contain widget and move widget to be contained in panel
panelp->setRect(new_child->getRect());
new_child->setOrigin(0, 0);
@@ -359,14 +374,14 @@ S32 LLLayoutStack::getDefaultWidth(S32 cur_width)
return cur_width;
}
-void LLLayoutStack::addPanel(LLPanel* panel, S32 min_width, S32 min_height, BOOL auto_resize, BOOL user_resize, EAnimate animate, S32 index)
+void LLLayoutStack::addPanel(LLPanel* panel, S32 min_width, S32 min_height, S32 max_width, S32 max_height, BOOL auto_resize, BOOL user_resize, EAnimate animate, S32 index)
{
// panel starts off invisible (collapsed)
if (animate == ANIMATE)
{
panel->setVisible(FALSE);
}
- LayoutPanel* embedded_panel = new LayoutPanel(panel, mOrientation, min_width, min_height, auto_resize, user_resize);
+ LayoutPanel* embedded_panel = new LayoutPanel(panel, mOrientation, min_width, min_height, max_width, max_height, auto_resize, user_resize);
mPanels.insert(mPanels.begin() + llclamp(index, 0, (S32)mPanels.size()), embedded_panel);
@@ -437,6 +452,19 @@ bool LLLayoutStack::getPanelMinSize(const std::string& panel_name, S32* min_widt
return NULL != panel;
}
+bool LLLayoutStack::getPanelMaxSize(const std::string& panel_name, S32* max_widthp, S32* max_heightp)
+{
+ LayoutPanel* panel = findEmbeddedPanelByName(panel_name);
+
+ if (panel)
+ {
+ if (max_widthp) *max_widthp = panel->mMaxWidth;
+ if (max_heightp) *max_heightp = panel->mMaxHeight;
+ }
+
+ return NULL != panel;
+}
+
static LLFastTimer::DeclareTimer FTM_UPDATE_LAYOUT("Update LayoutStacks");
void LLLayoutStack::updateLayout(BOOL force_resize)
{
@@ -816,7 +844,10 @@ void LLLayoutStack::calcMinExtents()
//static
void LLLayoutStack::updateClass()
{
- for (LLLayoutStack::instance_iter it = beginInstances(); it != endInstances(); ++it)
+ LLInstanceTrackerScopedGuard guard;
+ for (LLLayoutStack::instance_iter it = guard.beginInstances();
+ it != guard.endInstances();
+ ++it)
{
it->updateLayout();
}
diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h
index c4f10038f8..e454454fe2 100644
--- a/indra/llui/lllayoutstack.h
+++ b/indra/llui/lllayoutstack.h
@@ -74,7 +74,7 @@ public:
ANIMATE
} EAnimate;
- void addPanel(LLPanel* panel, S32 min_width, S32 min_height, BOOL auto_resize, BOOL user_resize, EAnimate animate = NO_ANIMATE, S32 index = S32_MAX);
+ void addPanel(LLPanel* panel, S32 min_width, S32 min_height, S32 max_width, S32 max_height, BOOL auto_resize, BOOL user_resize, EAnimate animate = NO_ANIMATE, S32 index = S32_MAX);
void removePanel(LLPanel* panel);
void collapsePanel(LLPanel* panel, BOOL collapsed = TRUE);
S32 getNumPanels() { return mPanels.size(); }
@@ -89,6 +89,14 @@ public:
* @returns true if specified by panel_name internal panel exists, false otherwise.
*/
bool getPanelMinSize(const std::string& panel_name, S32* min_widthp, S32* min_heightp);
+
+ /**
+ * Gets maximal width and/or height of the specified by name panel.
+ *
+ * If it is necessary to get only the one dimension pass NULL for another one.
+ * @returns true if specified by panel_name internal panel exists, false otherwise.
+ */
+ bool getPanelMaxSize(const std::string& panel_name, S32* max_width, S32* max_height);
void updateLayout(BOOL force_resize = FALSE);
diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index 30b09352d8..c93ca1af88 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -83,19 +83,6 @@ template class LLLineEditor* LLView::getChild<class LLLineEditor>(
// Member functions
//
-void LLLineEditor::PrevalidateNamedFuncs::declareValues()
-{
- declare("ascii", LLLineEditor::prevalidateASCII);
- declare("float", LLLineEditor::prevalidateFloat);
- declare("int", LLLineEditor::prevalidateInt);
- declare("positive_s32", LLLineEditor::prevalidatePositiveS32);
- declare("non_negative_s32", LLLineEditor::prevalidateNonNegativeS32);
- declare("alpha_num", LLLineEditor::prevalidateAlphaNum);
- declare("alpha_num_space", LLLineEditor::prevalidateAlphaNumSpace);
- declare("ascii_printable_no_pipe", LLLineEditor::prevalidateASCIIPrintableNoPipe);
- declare("ascii_printable_no_space", LLLineEditor::prevalidateASCIIPrintableNoSpace);
-}
-
LLLineEditor::Params::Params()
: max_length_bytes("max_length", 254),
keystroke_callback("keystroke_callback"),
@@ -104,7 +91,6 @@ LLLineEditor::Params::Params()
background_image_disabled("background_image_disabled"),
background_image_focused("background_image_focused"),
select_on_focus("select_on_focus", false),
- handle_edit_keys_directly("handle_edit_keys_directly", false),
revert_on_esc("revert_on_esc", true),
commit_on_focus_lost("commit_on_focus_lost", true),
ignore_tab("ignore_tab", true),
@@ -149,7 +135,6 @@ LLLineEditor::LLLineEditor(const LLLineEditor::Params& p)
mIgnoreArrowKeys( FALSE ),
mIgnoreTab( p.ignore_tab ),
mDrawAsterixes( FALSE ),
- mHandleEditKeysDirectly(p.handle_edit_keys_directly),
mSelectAllonFocusReceived( p.select_on_focus ),
mPassDelete(FALSE),
mReadOnly(FALSE),
@@ -205,12 +190,8 @@ LLLineEditor::~LLLineEditor()
{
mCommitOnFocusLost = FALSE;
+ // calls onCommit() while LLLineEditor still valid
gFocusMgr.releaseFocusIfNeeded( this );
-
- if( gEditMenuHandler == this )
- {
- gEditMenuHandler = NULL;
- }
}
@@ -396,7 +377,10 @@ void LLLineEditor::setText(const LLStringExplicit &new_text)
setCursor(llmin((S32)mText.length(), getCursor()));
// Set current history line to end of history.
- mCurrentHistoryLine = mLineHistory.end() - 1;
+ if(mLineHistory.end() != mLineHistory.begin())
+ {
+ mCurrentHistoryLine = mLineHistory.end() - 1;
+ }
mPrevText = mText;
}
@@ -510,6 +494,7 @@ void LLLineEditor::selectAll()
setCursor(mSelectionEnd);
//mScrollHPos = 0;
mIsSelecting = TRUE;
+ updatePrimary();
}
@@ -801,7 +786,7 @@ void LLLineEditor::removeChar()
}
else
{
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
}
@@ -840,7 +825,7 @@ void LLLineEditor::addChar(const llwchar uni_char)
}
else
{
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
getWindow()->hideCursorUntilMouseMove();
@@ -929,7 +914,7 @@ BOOL LLLineEditor::handleSelectionKey(KEY key, MASK mask)
}
else
{
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
break;
@@ -945,7 +930,7 @@ BOOL LLLineEditor::handleSelectionKey(KEY key, MASK mask)
}
else
{
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
break;
@@ -971,22 +956,6 @@ BOOL LLLineEditor::handleSelectionKey(KEY key, MASK mask)
}
}
- if (!handled && mHandleEditKeysDirectly)
- {
- if( (MASK_CONTROL & mask) && ('A' == key) )
- {
- if( canSelectAll() )
- {
- selectAll();
- }
- else
- {
- reportBadKeystroke();
- }
- handled = TRUE;
- }
- }
-
if(handled)
{
// take selection to 'primary' clipboard
@@ -1033,7 +1002,7 @@ void LLLineEditor::cut()
if( need_to_rollback )
{
rollback.doRollback( this );
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
else
if( mKeystrokeCallback )
@@ -1142,7 +1111,7 @@ void LLLineEditor::pasteHelper(bool is_primary)
}
// Truncate the clean string at the limit of what will fit
clean_string = clean_string.substr(0, wchars_that_fit);
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
mText.insert(getCursor(), clean_string);
@@ -1154,7 +1123,7 @@ void LLLineEditor::pasteHelper(bool is_primary)
if( need_to_rollback )
{
rollback.doRollback( this );
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
else
if( mKeystrokeCallback )
@@ -1219,7 +1188,7 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask)
}
else
{
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
}
handled = TRUE;
@@ -1268,7 +1237,7 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask)
}
else
{
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
handled = TRUE;
}
@@ -1295,7 +1264,7 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask)
}
else
{
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
handled = TRUE;
}
@@ -1312,7 +1281,7 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask)
}
else
{
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
handled = TRUE;
}
@@ -1329,7 +1298,7 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask)
}
else
{
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
handled = TRUE;
}
@@ -1352,64 +1321,6 @@ BOOL LLLineEditor::handleSpecialKey(KEY key, MASK mask)
break;
}
- if( !handled && mHandleEditKeysDirectly )
- {
- // Standard edit keys (Ctrl-X, Delete, etc,) are handled here instead of routed by the menu system.
- if( KEY_DELETE == key )
- {
- if( canDoDelete() )
- {
- doDelete();
- }
- else
- {
- reportBadKeystroke();
- }
- handled = TRUE;
- }
- else
- if( MASK_CONTROL & mask )
- {
- if( 'C' == key )
- {
- if( canCopy() )
- {
- copy();
- }
- else
- {
- reportBadKeystroke();
- }
- handled = TRUE;
- }
- else
- if( 'V' == key )
- {
- if( canPaste() )
- {
- paste();
- }
- else
- {
- reportBadKeystroke();
- }
- handled = TRUE;
- }
- else
- if( 'X' == key )
- {
- if( canCut() )
- {
- cut();
- }
- else
- {
- reportBadKeystroke();
- }
- handled = TRUE;
- }
- }
- }
return handled;
}
@@ -1464,7 +1375,7 @@ BOOL LLLineEditor::handleKeyHere(KEY key, MASK mask )
{
rollback.doRollback(this);
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
// Notify owner if requested
@@ -1512,7 +1423,7 @@ BOOL LLLineEditor::handleUnicodeCharHere(llwchar uni_char)
{
rollback.doRollback( this );
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
// Notify owner if requested
@@ -1532,7 +1443,7 @@ BOOL LLLineEditor::handleUnicodeCharHere(llwchar uni_char)
BOOL LLLineEditor::canDoDelete() const
{
- return ( !mReadOnly && (!mPassDelete || (hasSelection() || (getCursor() < mText.length()))) );
+ return ( !mReadOnly && mText.length() > 0 && (!mPassDelete || (hasSelection() || (getCursor() < mText.length()))) );
}
void LLLineEditor::doDelete()
@@ -1557,7 +1468,7 @@ void LLLineEditor::doDelete()
if( need_to_rollback )
{
rollback.doRollback( this );
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
else
{
@@ -1892,11 +1803,6 @@ S32 LLLineEditor::findPixelNearestPos(const S32 cursor_offset) const
return result;
}
-void LLLineEditor::reportBadKeystroke()
-{
- make_ui_sound("UISndBadKeystroke");
-}
-
//virtual
void LLLineEditor::clear()
{
@@ -1984,51 +1890,12 @@ void LLLineEditor::setRect(const LLRect& rect)
}
}
-void LLLineEditor::setPrevalidate(LLLinePrevalidateFunc func)
+void LLLineEditor::setPrevalidate(LLTextValidate::validate_func_t func)
{
mPrevalidateFunc = func;
updateAllowingLanguageInput();
}
-// Limits what characters can be used to [1234567890.-] with [-] only valid in the first position.
-// Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for
-// the simple reasons that intermediate states may be invalid even if the final result is valid.
-//
-// static
-BOOL LLLineEditor::prevalidateFloat(const LLWString &str)
-{
- LLLocale locale(LLLocale::USER_LOCALE);
-
- BOOL success = TRUE;
- LLWString trimmed = str;
- LLWStringUtil::trim(trimmed);
- S32 len = trimmed.length();
- if( 0 < len )
- {
- // May be a comma or period, depending on the locale
- llwchar decimal_point = (llwchar)LLResMgr::getInstance()->getDecimalPoint();
-
- S32 i = 0;
-
- // First character can be a negative sign
- if( '-' == trimmed[0] )
- {
- i++;
- }
-
- for( ; i < len; i++ )
- {
- if( (decimal_point != trimmed[i] ) && !LLStringOps::isDigit( trimmed[i] ) )
- {
- success = FALSE;
- break;
- }
- }
- }
-
- return success;
-}
-
// static
BOOL LLLineEditor::postvalidateFloat(const std::string &str)
{
@@ -2088,223 +1955,6 @@ BOOL LLLineEditor::postvalidateFloat(const std::string &str)
return success;
}
-// Limits what characters can be used to [1234567890-] with [-] only valid in the first position.
-// Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for
-// the simple reasons that intermediate states may be invalid even if the final result is valid.
-//
-// static
-BOOL LLLineEditor::prevalidateInt(const LLWString &str)
-{
- LLLocale locale(LLLocale::USER_LOCALE);
-
- BOOL success = TRUE;
- LLWString trimmed = str;
- LLWStringUtil::trim(trimmed);
- S32 len = trimmed.length();
- if( 0 < len )
- {
- S32 i = 0;
-
- // First character can be a negative sign
- if( '-' == trimmed[0] )
- {
- i++;
- }
-
- for( ; i < len; i++ )
- {
- if( !LLStringOps::isDigit( trimmed[i] ) )
- {
- success = FALSE;
- break;
- }
- }
- }
-
- return success;
-}
-
-// static
-BOOL LLLineEditor::prevalidatePositiveS32(const LLWString &str)
-{
- LLLocale locale(LLLocale::USER_LOCALE);
-
- LLWString trimmed = str;
- LLWStringUtil::trim(trimmed);
- S32 len = trimmed.length();
- BOOL success = TRUE;
- if(0 < len)
- {
- if(('-' == trimmed[0]) || ('0' == trimmed[0]))
- {
- success = FALSE;
- }
- S32 i = 0;
- while(success && (i < len))
- {
- if(!LLStringOps::isDigit(trimmed[i++]))
- {
- success = FALSE;
- }
- }
- }
- if (success)
- {
- S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10);
- if (val <= 0)
- {
- success = FALSE;
- }
- }
- return success;
-}
-
-BOOL LLLineEditor::prevalidateNonNegativeS32(const LLWString &str)
-{
- LLLocale locale(LLLocale::USER_LOCALE);
-
- LLWString trimmed = str;
- LLWStringUtil::trim(trimmed);
- S32 len = trimmed.length();
- BOOL success = TRUE;
- if(0 < len)
- {
- if('-' == trimmed[0])
- {
- success = FALSE;
- }
- S32 i = 0;
- while(success && (i < len))
- {
- if(!LLStringOps::isDigit(trimmed[i++]))
- {
- success = FALSE;
- }
- }
- }
- if (success)
- {
- S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10);
- if (val < 0)
- {
- success = FALSE;
- }
- }
- return success;
-}
-
-BOOL LLLineEditor::prevalidateAlphaNum(const LLWString &str)
-{
- LLLocale locale(LLLocale::USER_LOCALE);
-
- BOOL rv = TRUE;
- S32 len = str.length();
- if(len == 0) return rv;
- while(len--)
- {
- if( !LLStringOps::isAlnum((char)str[len]) )
- {
- rv = FALSE;
- break;
- }
- }
- return rv;
-}
-
-// static
-BOOL LLLineEditor::prevalidateAlphaNumSpace(const LLWString &str)
-{
- LLLocale locale(LLLocale::USER_LOCALE);
-
- BOOL rv = TRUE;
- S32 len = str.length();
- if(len == 0) return rv;
- while(len--)
- {
- if(!(LLStringOps::isAlnum((char)str[len]) || (' ' == str[len])))
- {
- rv = FALSE;
- break;
- }
- }
- return rv;
-}
-
-// Used for most names of things stored on the server, due to old file-formats
-// that used the pipe (|) for multiline text storage. Examples include
-// inventory item names, parcel names, object names, etc.
-// static
-BOOL LLLineEditor::prevalidateASCIIPrintableNoPipe(const LLWString &str)
-{
- BOOL rv = TRUE;
- S32 len = str.length();
- if(len == 0) return rv;
- while(len--)
- {
- llwchar wc = str[len];
- if (wc < 0x20
- || wc > 0x7f
- || wc == '|')
- {
- rv = FALSE;
- break;
- }
- if(!(wc == ' '
- || LLStringOps::isAlnum((char)wc)
- || LLStringOps::isPunct((char)wc) ) )
- {
- rv = FALSE;
- break;
- }
- }
- return rv;
-}
-
-
-// Used for avatar names
-// static
-BOOL LLLineEditor::prevalidateASCIIPrintableNoSpace(const LLWString &str)
-{
- BOOL rv = TRUE;
- S32 len = str.length();
- if(len == 0) return rv;
- while(len--)
- {
- llwchar wc = str[len];
- if (wc < 0x20
- || wc > 0x7f
- || LLStringOps::isSpace(wc))
- {
- rv = FALSE;
- break;
- }
- if( !(LLStringOps::isAlnum((char)str[len]) ||
- LLStringOps::isPunct((char)str[len]) ) )
- {
- rv = FALSE;
- break;
- }
- }
- return rv;
-}
-
-
-// static
-BOOL LLLineEditor::prevalidateASCII(const LLWString &str)
-{
- BOOL rv = TRUE;
- S32 len = str.length();
- while(len--)
- {
- if (str[len] < 0x20 || str[len] > 0x7f)
- {
- rv = FALSE;
- break;
- }
- }
- return rv;
-}
-
void LLLineEditor::onMouseCaptureLost()
{
endSelection();
diff --git a/indra/llui/lllineeditor.h b/indra/llui/lllineeditor.h
index a06a317f76..9489e723e3 100644
--- a/indra/llui/lllineeditor.h
+++ b/indra/llui/lllineeditor.h
@@ -51,27 +51,18 @@
#include "llviewborder.h"
#include "llpreeditor.h"
-#include <boost/function.hpp>
+#include "lltextvalidate.h"
class LLFontGL;
class LLLineEditorRollback;
class LLButton;
class LLContextMenu;
-typedef boost::function<BOOL (const LLWString &wstr)> LLLinePrevalidateFunc;
-
class LLLineEditor
: public LLUICtrl, public LLEditMenuHandler, protected LLPreeditor
{
public:
- struct PrevalidateNamedFuncs
- : public LLInitParam::TypeValuesHelper<LLLinePrevalidateFunc, PrevalidateNamedFuncs>
-
- {
- static void declareValues();
- };
-
typedef boost::function<void (LLLineEditor* caller)> keystroke_callback_t;
struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
@@ -81,7 +72,7 @@ public:
Optional<keystroke_callback_t> keystroke_callback;
- Optional<LLLinePrevalidateFunc, PrevalidateNamedFuncs> prevalidate_callback;
+ Optional<LLTextValidate::validate_func_t, LLTextValidate::ValidateTextNamedFuncs> prevalidate_callback;
Optional<LLViewBorder::Params> border;
@@ -90,7 +81,6 @@ public:
background_image_focused;
Optional<bool> select_on_focus,
- handle_edit_keys_directly,
revert_on_esc,
commit_on_focus_lost,
ignore_tab;
@@ -207,6 +197,8 @@ public:
const LLColor4& getReadOnlyFgColor() const { return mReadOnlyFgColor.get(); }
const LLColor4& getTentativeFgColor() const { return mTentativeFgColor.get(); }
+ const LLFontGL* getFont() const { return mGLFont; }
+
void setIgnoreArrowKeys(BOOL b) { mIgnoreArrowKeys = b; }
void setIgnoreTab(BOOL b) { mIgnoreTab = b; }
void setPassDelete(BOOL b) { mPassDelete = b; }
@@ -222,7 +214,6 @@ public:
void extendSelection(S32 new_cursor_pos);
void deleteSelection();
- void setHandleEditKeysDirectly( BOOL b ) { mHandleEditKeysDirectly = b; }
void setSelectAllonFocusReceived(BOOL b);
typedef boost::function<void (LLLineEditor* caller, void* user_data)> callback_t;
@@ -234,17 +225,7 @@ public:
void setTextPadding(S32 left, S32 right);
// Prevalidation controls which keystrokes can affect the editor
- void setPrevalidate( LLLinePrevalidateFunc func );
- static BOOL prevalidateFloat(const LLWString &str );
- static BOOL prevalidateInt(const LLWString &str );
- static BOOL prevalidatePositiveS32(const LLWString &str);
- static BOOL prevalidateNonNegativeS32(const LLWString &str);
- static BOOL prevalidateAlphaNum(const LLWString &str );
- static BOOL prevalidateAlphaNumSpace(const LLWString &str );
- static BOOL prevalidateASCIIPrintableNoPipe(const LLWString &str);
- static BOOL prevalidateASCIIPrintableNoSpace(const LLWString &str);
- static BOOL prevalidateASCII(const LLWString &str);
-
+ void setPrevalidate( LLTextValidate::validate_func_t func );
static BOOL postvalidateFloat(const std::string &str);
// line history support:
@@ -264,7 +245,6 @@ private:
void addChar(const llwchar c);
void setCursorAtLocalPos(S32 local_mouse_x);
S32 findPixelNearestPos(S32 cursor_offset = 0) const;
- void reportBadKeystroke();
BOOL handleSpecialKey(KEY key, MASK mask);
BOOL handleSelectionKey(KEY key, MASK mask);
BOOL handleControlKey(KEY key, MASK mask);
@@ -324,7 +304,7 @@ protected:
S32 mLastSelectionStart;
S32 mLastSelectionEnd;
- LLLinePrevalidateFunc mPrevalidateFunc;
+ LLTextValidate::validate_func_t mPrevalidateFunc;
LLFrameTimer mKeystrokeTimer;
LLTimer mTripleClickTimer;
@@ -342,7 +322,6 @@ protected:
BOOL mIgnoreTab;
BOOL mDrawAsterixes;
- BOOL mHandleEditKeysDirectly; // If true, the standard edit keys (Ctrl-X, Delete, etc,) are handled here instead of routed by the menu system
BOOL mSelectAllonFocusReceived;
BOOL mPassDelete;
diff --git a/indra/llui/llloadingindicator.cpp b/indra/llui/llloadingindicator.cpp
new file mode 100644
index 0000000000..f8b029e19c
--- /dev/null
+++ b/indra/llui/llloadingindicator.cpp
@@ -0,0 +1,133 @@
+/**
+ * @file llloadingindicator.cpp
+ * @brief Perpetual loading indicator
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "linden_common.h"
+
+#include "llloadingindicator.h"
+
+// Linden library includes
+#include "llsingleton.h"
+
+// Project includes
+#include "lluictrlfactory.h"
+#include "lluiimage.h"
+
+static LLDefaultChildRegistry::Register<LLLoadingIndicator> r("loading_indicator");
+
+///////////////////////////////////////////////////////////////////////////////
+// LLLoadingIndicator::Data class
+///////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Pre-loaded images shared by all instances of the widget
+ */
+class LLLoadingIndicator::Data: public LLSingleton<LLLoadingIndicator::Data>
+{
+public:
+ /*virtual*/ void initSingleton(); // from LLSingleton
+
+ LLPointer<LLUIImage> getNextImage(S8& idx) const;
+ U8 getImagesCount() const { return NIMAGES; }
+private:
+
+ static const U8 NIMAGES = 12;
+ LLPointer<LLUIImage> mImages[NIMAGES];
+};
+
+// virtual
+// Called right after the instance gets constructed.
+void LLLoadingIndicator::Data::initSingleton()
+{
+ // Load images.
+ for (U8 i = 0; i < NIMAGES; ++i)
+ {
+ std::string img_name = llformat("Progress_%d", i+1);
+ mImages[i] = LLUI::getUIImage(img_name, 0);
+ llassert(mImages[i]);
+ }
+}
+
+LLPointer<LLUIImage> LLLoadingIndicator::Data::getNextImage(S8& idx) const
+{
+ // Calculate next index, performing array bounds checking.
+ idx = (idx >= NIMAGES || idx < 0) ? 0 : (idx + 1) % NIMAGES;
+ return mImages[idx];
+}
+
+///////////////////////////////////////////////////////////////////////////////
+// LLLoadingIndicator class
+///////////////////////////////////////////////////////////////////////////////
+
+LLLoadingIndicator::LLLoadingIndicator(const Params& p)
+: LLUICtrl(p)
+ , mRotationsPerSec(p.rotations_per_sec > 0 ? p.rotations_per_sec : 1.0f)
+ , mCurImageIdx(-1)
+{
+ // Select initial image.
+ mCurImagep = Data::instance().getNextImage(mCurImageIdx);
+
+ // Start timer for switching images.
+ start();
+}
+
+void LLLoadingIndicator::draw()
+{
+ // Time to switch to the next image?
+ if (mImageSwitchTimer.getStarted() && mImageSwitchTimer.hasExpired())
+ {
+ // Switch to the next image.
+ mCurImagep = Data::instance().getNextImage(mCurImageIdx);
+
+ // Restart timer.
+ start();
+ }
+
+ // Draw current image.
+ if( mCurImagep.notNull() )
+ {
+ mCurImagep->draw(getLocalRect(), LLColor4::white % getDrawContext().mAlpha);
+ }
+
+ LLUICtrl::draw();
+}
+
+void LLLoadingIndicator::stop()
+{
+ mImageSwitchTimer.stop();
+}
+
+void LLLoadingIndicator::start()
+{
+ mImageSwitchTimer.start();
+ F32 period = 1.0f / (Data::instance().getImagesCount() * mRotationsPerSec);
+ mImageSwitchTimer.setTimerExpirySec(period);
+}
diff --git a/indra/llui/llloadingindicator.h b/indra/llui/llloadingindicator.h
new file mode 100644
index 0000000000..32dd1fead8
--- /dev/null
+++ b/indra/llui/llloadingindicator.h
@@ -0,0 +1,93 @@
+/**
+ * @file llloadingindicator.h
+ * @brief Perpetual loading indicator
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLLOADINGINDICATOR_H
+#define LL_LLLOADINGINDICATOR_H
+
+#include "lluictrl.h"
+
+///////////////////////////////////////////////////////////////////////////////
+// class LLLoadingIndicator
+///////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Perpetual loading indicator (a la MacOSX or YouTube)
+ *
+ * Number of rotations per second can be overriden
+ * with the "roations_per_sec" parameter.
+ *
+ * Can start/stop spinning.
+ *
+ * @see start()
+ * @see stop()
+ */
+class LLLoadingIndicator
+: public LLUICtrl
+{
+ LOG_CLASS(LLLoadingIndicator);
+public:
+ struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
+ {
+ Optional<F32> rotations_per_sec;
+ Params()
+ : rotations_per_sec("rotations_per_sec", 1.0f)
+ {}
+ };
+
+ virtual ~LLLoadingIndicator() {}
+
+ // llview overrides
+ virtual void draw();
+
+ /**
+ * Stop spinning.
+ */
+ void stop();
+
+ /**
+ * Start spinning.
+ */
+ void start();
+
+private:
+ LLLoadingIndicator(const Params&);
+ friend class LLUICtrlFactory;
+
+ class Data;
+
+ F32 mRotationsPerSec;
+ S8 mCurImageIdx;
+ LLPointer<LLUIImage> mCurImagep;
+ LLFrameTimer mImageSwitchTimer;
+};
+
+#endif // LL_LLLOADINGINDICATOR_H
diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp
index 7fa9a88059..b77126996e 100644
--- a/indra/llui/llmenugl.cpp
+++ b/indra/llui/llmenugl.cpp
@@ -657,11 +657,38 @@ LLMenuItemVerticalSeparatorGL::LLMenuItemVerticalSeparatorGL( void )
// Class LLMenuItemTearOffGL
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LLMenuItemTearOffGL::LLMenuItemTearOffGL(const LLMenuItemTearOffGL::Params& p)
-: LLMenuItemGL(p),
- mParentHandle(p.parent_floater_handle)
+: LLMenuItemGL(p)
{
}
+// Returns the first floater ancestor if there is one
+LLFloater* LLMenuItemTearOffGL::getParentFloater()
+{
+ LLView* parent_view = getMenu();
+
+ while (parent_view)
+ {
+ if (dynamic_cast<LLFloater*>(parent_view))
+ {
+ return dynamic_cast<LLFloater*>(parent_view);
+ }
+
+ bool parent_is_menu = dynamic_cast<LLMenuGL*>(parent_view) && !dynamic_cast<LLMenuBarGL*>(parent_view);
+
+ if (parent_is_menu)
+ {
+ // use menu parent
+ parent_view = dynamic_cast<LLMenuGL*>(parent_view)->getParentMenuItem();
+ }
+ else
+ {
+ // just use regular view parent
+ parent_view = parent_view->getParent();
+ }
+ }
+
+ return NULL;
+}
void LLMenuItemTearOffGL::onCommit()
{
@@ -680,7 +707,7 @@ void LLMenuItemTearOffGL::onCommit()
getMenu()->needsArrange();
- LLFloater* parent_floater = mParentHandle.get();
+ LLFloater* parent_floater = getParentFloater();
LLFloater* tear_off_menu = LLTearOffMenu::create(getMenu());
if (tear_off_menu)
@@ -1671,7 +1698,6 @@ LLMenuGL::LLMenuGL(const LLMenuGL::Params& p)
mSpilloverMenu(NULL),
mJumpKey(p.jump_key),
mCreateJumpKeys(p.create_jump_keys),
- mParentFloaterHandle(p.parent_floater),
mNeedsArrange(FALSE),
mShortcutPad(p.shortcut_pad)
{
@@ -1699,7 +1725,7 @@ LLMenuGL::LLMenuGL(const LLMenuGL::Params& p)
void LLMenuGL::initFromParams(const LLMenuGL::Params& p)
{
LLUICtrl::initFromParams(p);
- setCanTearOff(p.can_tear_off, p.parent_floater);
+ setCanTearOff(p.can_tear_off);
}
// Destroys the object
@@ -1711,12 +1737,11 @@ LLMenuGL::~LLMenuGL( void )
mJumpKeys.clear();
}
-void LLMenuGL::setCanTearOff(BOOL tear_off, LLHandle<LLFloater> parent_floater_handle )
+void LLMenuGL::setCanTearOff(BOOL tear_off)
{
if (tear_off && mTearOffItem == NULL)
{
LLMenuItemTearOffGL::Params p;
- p.parent_floater_handle = parent_floater_handle;
mTearOffItem = LLUICtrlFactory::create<LLMenuItemTearOffGL>(p);
addChildInBack(mTearOffItem);
}
@@ -2233,7 +2258,6 @@ void LLMenuGL::createSpilloverBranch()
LLMenuGL::Params p;
p.name("More");
p.label("More"); // *TODO: Translate
- p.parent_floater(mParentFloaterHandle);
p.bg_color(mBackgroundColor);
p.bg_visible(true);
p.can_tear_off(false);
@@ -3321,7 +3345,7 @@ void LLMenuHolderGL::draw()
LLView::draw();
// now draw last selected item as overlay
LLMenuItemGL* selecteditem = (LLMenuItemGL*)sItemLastSelectedHandle.get();
- if (selecteditem && sItemActivationTimer.getStarted() && sItemActivationTimer.getElapsedTimeF32() < ACTIVATE_HIGHLIGHT_TIME)
+ if (selecteditem && selecteditem->getVisible() && sItemActivationTimer.getStarted() && sItemActivationTimer.getElapsedTimeF32() < ACTIVATE_HIGHLIGHT_TIME)
{
// make sure toggle items, for example, show the proper state when fading out
selecteditem->buildDrawLabel();
@@ -3396,6 +3420,12 @@ BOOL LLMenuHolderGL::handleKey(KEY key, MASK mask, BOOL called_from_parent)
if (pMenu)
{
+ //eat TAB key - EXT-7000
+ if (key == KEY_TAB && mask == MASK_NONE)
+ {
+ return TRUE;
+ }
+
//handle ESCAPE and RETURN key
handled = LLPanel::handleKey(key, mask, called_from_parent);
if (!handled)
@@ -3431,7 +3461,7 @@ LLView* const LLMenuHolderGL::getVisibleMenu() const
for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it)
{
LLView* viewp = *child_it;
- if (viewp->getVisible() && dynamic_cast<LLMenuBarGL*>(viewp) == NULL)
+ if (viewp->getVisible() && dynamic_cast<LLMenuGL*>(viewp) != NULL)
{
return viewp;
}
@@ -3454,8 +3484,7 @@ BOOL LLMenuHolderGL::hideMenus()
for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it)
{
LLView* viewp = *child_it;
- // clicks off of menu do not hide menu bar
- if (dynamic_cast<LLMenuBarGL*>(viewp) == NULL && viewp->getVisible())
+ if (dynamic_cast<LLMenuGL*>(viewp) != NULL && viewp->getVisible())
{
viewp->setVisible(FALSE);
}
@@ -3703,10 +3732,14 @@ void LLContextMenuBranch::buildDrawLabel( void )
void LLContextMenuBranch::showSubMenu()
{
- S32 center_x;
- S32 center_y;
- localPointToScreen(getRect().getWidth(), getRect().getHeight() , &center_x, &center_y);
- mBranch->show( center_x, center_y);
+ LLMenuItemGL* menu_item = mBranch->getParentMenuItem();
+ if (menu_item != NULL && menu_item->getVisible())
+ {
+ S32 center_x;
+ S32 center_y;
+ localPointToScreen(getRect().getWidth(), getRect().getHeight() , &center_x, &center_y);
+ mBranch->show(center_x, center_y);
+ }
}
// onCommit() - do the primary funcationality of the menu item.
@@ -3941,7 +3974,6 @@ BOOL LLContextMenu::appendContextSubMenu(LLContextMenu *menu)
item = LLUICtrlFactory::create<LLContextMenuBranch>(p);
LLMenuGL::sMenuContainer->addChild(item->getBranch());
- item->setFont( LLFontGL::getFontSansSerif() );
return append( item );
}
diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h
index 8441aaadd4..6f0f83d4b9 100644
--- a/indra/llui/llmenugl.h
+++ b/indra/llui/llmenugl.h
@@ -295,7 +295,7 @@ private:
// class, by allowing another method to be specified which determines
// if the menu item should consider itself checked as true or not. Be
// careful that the provided callback is fast - it needs to be VERY
-// FUCKING EFFICIENT, because it may need to be checked a lot.
+// EFFICIENT because it may need to be checked a lot.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLMenuItemCheckGL
@@ -355,7 +355,6 @@ class LLMenuGL
public:
struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
{
- Optional<LLHandle<LLFloater> > parent_floater;
Optional<KEY> jump_key;
Optional<bool> horizontal_layout,
can_tear_off,
@@ -430,7 +429,7 @@ public:
void setBackgroundColor( const LLUIColor& color ) { mBackgroundColor = color; }
const LLUIColor& getBackgroundColor() const { return mBackgroundColor; }
void setBackgroundVisible( BOOL b ) { mBgVisible = b; }
- void setCanTearOff(BOOL tear_off, LLHandle<LLFloater> parent_floater_handle = LLHandle<LLFloater>());
+ void setCanTearOff(BOOL tear_off);
// add a separator to this menu
virtual BOOL addSeparator();
@@ -553,7 +552,6 @@ private:
class LLMenuItemTearOffGL* mTearOffItem;
class LLMenuItemBranchGL* mSpilloverBranch;
LLMenuGL* mSpilloverMenu;
- LLHandle<LLFloater> mParentFloaterHandle;
KEY mJumpKey;
BOOL mCreateJumpKeys;
S32 mShortcutPad;
@@ -814,7 +812,6 @@ class LLMenuItemTearOffGL : public LLMenuItemGL
public:
struct Params : public LLInitParam::Block<Params, LLMenuItemGL::Params>
{
- Optional<LLHandle<LLFloater> > parent_floater_handle;
Params()
{
name = "tear off";
@@ -823,13 +820,12 @@ public:
};
LLMenuItemTearOffGL( const Params& );
-
+
virtual void onCommit(void);
virtual void draw(void);
virtual U32 getNominalHeight() const;
-private:
- LLHandle<LLFloater> mParentHandle;
+ LLFloater* getParentFloater();
};
diff --git a/indra/llui/llmodaldialog.cpp b/indra/llui/llmodaldialog.cpp
index 387af05935..6cff68c20b 100644
--- a/indra/llui/llmodaldialog.cpp
+++ b/indra/llui/llmodaldialog.cpp
@@ -111,7 +111,7 @@ void LLModalDialog::onOpen(const LLSD& key)
// This is a modal dialog. It sucks up all mouse and keyboard operations.
gFocusMgr.setMouseCapture( this );
- gFocusMgr.setTopCtrl( this );
+ LLUI::addPopup(this);
setFocus(TRUE);
sModalStack.push_front( this );
@@ -153,7 +153,7 @@ void LLModalDialog::setVisible( BOOL visible )
gFocusMgr.setMouseCapture( this );
// The dialog view is a root view
- gFocusMgr.setTopCtrl( this );
+ LLUI::addPopup(this);
setFocus( TRUE );
}
else
@@ -291,7 +291,7 @@ void LLModalDialog::onAppFocusGained()
// This is a modal dialog. It sucks up all mouse and keyboard operations.
gFocusMgr.setMouseCapture( instance );
instance->setFocus(TRUE);
- gFocusMgr.setTopCtrl( instance );
+ LLUI::addPopup(instance);
instance->centerOnScreen();
}
diff --git a/indra/llui/llmultifloater.cpp b/indra/llui/llmultifloater.cpp
index 78738c826d..b1dbce0000 100644
--- a/indra/llui/llmultifloater.cpp
+++ b/indra/llui/llmultifloater.cpp
@@ -92,14 +92,6 @@ void LLMultiFloater::draw()
}
else
{
- for (S32 i = 0; i < mTabContainer->getTabCount(); i++)
- {
- LLFloater* floaterp = (LLFloater*)mTabContainer->getPanelByIndex(i);
- if (floaterp->getShortTitle() != mTabContainer->getPanelTitle(i))
- {
- mTabContainer->setPanelTitle(i, floaterp->getShortTitle());
- }
- }
LLFloater::draw();
}
}
@@ -246,6 +238,16 @@ void LLMultiFloater::addFloater(LLFloater* floaterp, BOOL select_added_floater,
moveResizeHandlesToFront();
}
+void LLMultiFloater::updateFloaterTitle(LLFloater* floaterp)
+{
+ S32 index = mTabContainer->getIndexForPanel(floaterp);
+ if (index != -1)
+ {
+ mTabContainer->setPanelTitle(index, floaterp->getShortTitle());
+ }
+}
+
+
/**
BOOL selectFloater(LLFloater* floaterp)
@@ -353,13 +355,20 @@ void LLMultiFloater::setVisible(BOOL visible)
BOOL LLMultiFloater::handleKeyHere(KEY key, MASK mask)
{
- if (key == 'W' && mask == MASK_CONTROL)
+ if (key == 'W' && mask == (MASK_CONTROL|MASK_SHIFT))
{
LLFloater* floater = getActiveFloater();
// is user closeable and is system closeable
if (floater && floater->canClose() && floater->isCloseable())
{
floater->closeFloater();
+
+ // EXT-5695 (Tabbed IM window loses focus if close any tabs by Ctrl+W)
+ // bring back focus on tab container if there are any tab left
+ if(mTabContainer->getTabCount() > 0)
+ {
+ mTabContainer->setFocus(TRUE);
+ }
}
return TRUE;
}
diff --git a/indra/llui/llmultifloater.h b/indra/llui/llmultifloater.h
index bbf2c56fe7..24a841f64e 100644
--- a/indra/llui/llmultifloater.h
+++ b/indra/llui/llmultifloater.h
@@ -80,6 +80,7 @@ public:
void onTabSelected();
virtual void updateResizeLimits();
+ virtual void updateFloaterTitle(LLFloater* floaterp);
protected:
struct LLFloaterData
diff --git a/indra/llui/llmultisliderctrl.cpp b/indra/llui/llmultisliderctrl.cpp
index f4434a0f78..cc26c00a3e 100644
--- a/indra/llui/llmultisliderctrl.cpp
+++ b/indra/llui/llmultisliderctrl.cpp
@@ -138,7 +138,7 @@ LLMultiSliderCtrl::LLMultiSliderCtrl(const LLMultiSliderCtrl::Params& p)
params.font(p.font);
params.max_length_bytes(MAX_STRING_LENGTH);
params.commit_callback.function(LLMultiSliderCtrl::onEditorCommit);
- params.prevalidate_callback(&LLLineEditor::prevalidateFloat);
+ params.prevalidate_callback(&LLTextValidate::validateFloat);
params.follows.flags(FOLLOWS_LEFT | FOLLOWS_BOTTOM);
mEditor = LLUICtrlFactory::create<LLLineEditor> (params);
mEditor->setFocusReceivedCallback( boost::bind(LLMultiSliderCtrl::onEditorGainFocus, _1, this) );
@@ -330,9 +330,14 @@ void LLMultiSliderCtrl::updateText()
// static
void LLMultiSliderCtrl::onEditorCommit( LLUICtrl* ctrl, const LLSD& userdata)
{
- LLMultiSliderCtrl* self = dynamic_cast<LLMultiSliderCtrl*>(ctrl->getParent());
+ llassert(ctrl);
if (!ctrl)
return;
+
+ LLMultiSliderCtrl* self = dynamic_cast<LLMultiSliderCtrl*>(ctrl->getParent());
+ llassert(self);
+ if (!self) // cast failed - wrong type! :O
+ return;
BOOL success = FALSE;
F32 val = self->mCurValue;
diff --git a/indra/llui/llnotifications.cpp b/indra/llui/llnotifications.cpp
index 5816cef6af..7b8f51ae3c 100644
--- a/indra/llui/llnotifications.cpp
+++ b/indra/llui/llnotifications.cpp
@@ -48,122 +48,38 @@
const std::string NOTIFICATION_PERSIST_VERSION = "0.93";
-// local channel for notification history
-class LLNotificationHistoryChannel : public LLNotificationChannel
+// Local channel for persistent notifications
+// Stores only persistent notifications.
+// Class users can use connectChanged() to process persistent notifications
+// (see LLNotificationStorage for example).
+class LLPersistentNotificationChannel : public LLNotificationChannel
{
- LOG_CLASS(LLNotificationHistoryChannel);
+ LOG_CLASS(LLPersistentNotificationChannel);
public:
- LLNotificationHistoryChannel(const std::string& filename) :
- LLNotificationChannel("History", "Visible", &historyFilter, LLNotificationComparators::orderByUUID()),
- mFileName(filename)
+ LLPersistentNotificationChannel() :
+ LLNotificationChannel("Persistent", "Visible", &notificationFilter, LLNotificationComparators::orderByUUID())
{
- connectChanged(boost::bind(&LLNotificationHistoryChannel::historyHandler, this, _1));
- loadPersistentNotifications();
}
private:
- bool historyHandler(const LLSD& payload)
- {
- // we ignore "load" messages, but rewrite the persistence file on any other
- std::string sigtype = payload["sigtype"];
- if (sigtype != "load")
- {
- savePersistentNotifications();
- }
- return false;
- }
- // The history channel gets all notifications except those that have been cancelled
- static bool historyFilter(LLNotificationPtr pNotification)
+ // The channel gets all persistent notifications except those that have been canceled
+ static bool notificationFilter(LLNotificationPtr pNotification)
{
- return !pNotification->isCancelled();
- }
-
- void savePersistentNotifications()
- {
- /* NOTE: As of 2009-11-09 the reload of notifications on startup does not
- work, and has not worked for months. Skip saving notifications until the
- read can be fixed, because this hits the disk once per notification and
- causes log spam. James
-
- llinfos << "Saving open notifications to " << mFileName << llendl;
+ bool handle_notification = false;
- llofstream notify_file(mFileName.c_str());
- if (!notify_file.is_open())
- {
- llwarns << "Failed to open " << mFileName << llendl;
- return;
- }
-
- LLSD output;
- output["version"] = NOTIFICATION_PERSIST_VERSION;
- LLSD& data = output["data"];
-
- for (LLNotificationSet::iterator it = mItems.begin(); it != mItems.end(); ++it)
- {
- if (!LLNotifications::instance().templateExists((*it)->getName())) continue;
+ handle_notification = pNotification->isPersistent()
+ && !pNotification->isCancelled();
- // only store notifications flagged as persisting
- LLNotificationTemplatePtr templatep = LLNotifications::instance().getTemplate((*it)->getName());
- if (!templatep->mPersist) continue;
-
- data.append((*it)->asLLSD());
- }
-
- LLPointer<LLSDFormatter> formatter = new LLSDXMLFormatter();
- formatter->format(output, notify_file, LLSDFormatter::OPTIONS_PRETTY);
- */
+ return handle_notification;
}
- void loadPersistentNotifications()
- {
- llinfos << "Loading open notifications from " << mFileName << llendl;
-
- llifstream notify_file(mFileName.c_str());
- if (!notify_file.is_open())
- {
- llwarns << "Failed to open " << mFileName << llendl;
- return;
- }
-
- LLSD input;
- LLPointer<LLSDParser> parser = new LLSDXMLParser();
- if (parser->parse(notify_file, input, LLSDSerialize::SIZE_UNLIMITED) < 0)
- {
- llwarns << "Failed to parse open notifications" << llendl;
- return;
- }
-
- if (input.isUndefined()) return;
- std::string version = input["version"];
- if (version != NOTIFICATION_PERSIST_VERSION)
- {
- llwarns << "Bad open notifications version: " << version << llendl;
- return;
- }
- LLSD& data = input["data"];
- if (data.isUndefined()) return;
-
- LLNotifications& instance = LLNotifications::instance();
- for (LLSD::array_const_iterator notification_it = data.beginArray();
- notification_it != data.endArray();
- ++notification_it)
- {
- instance.add(LLNotificationPtr(new LLNotification(*notification_it)));
- }
- }
-
- //virtual
void onDelete(LLNotificationPtr pNotification)
{
- // we want to keep deleted notifications in our log
+ // we want to keep deleted notifications in our log, otherwise some
+ // notifications will be lost on exit.
mItems.insert(pNotification);
-
- return;
}
-
-private:
- std::string mFileName;
};
bool filterIgnoredNotifications(LLNotificationPtr notification)
@@ -402,7 +318,9 @@ LLNotification::LLNotification(const LLNotification::Params& p) :
mRespondedTo(false),
mPriority(p.priority),
mCancelled(false),
- mIgnored(false)
+ mIgnored(false),
+ mResponderObj(NULL),
+ mIsReusable(false)
{
if (p.functor.name.isChosen())
{
@@ -415,6 +333,15 @@ LLNotification::LLNotification(const LLNotification::Params& p) :
mTemporaryResponder = true;
}
+ else if(p.functor.responder.isChosen())
+ {
+ mResponder = p.functor.responder;
+ }
+
+ if(p.responder.isProvided())
+ {
+ mResponderObj = p.responder;
+ }
mId.generate();
init(p.name, p.form_elements);
@@ -425,7 +352,9 @@ LLNotification::LLNotification(const LLSD& sd) :
mTemporaryResponder(false),
mRespondedTo(false),
mCancelled(false),
- mIgnored(false)
+ mIgnored(false),
+ mResponderObj(NULL),
+ mIsReusable(false)
{
mId.generate();
mSubstitutions = sd["substitutions"];
@@ -452,6 +381,13 @@ LLSD LLNotification::asLLSD()
output["expiry"] = mExpiresAt;
output["priority"] = (S32)mPriority;
output["responseFunctor"] = mResponseFunctorName;
+ output["reusable"] = mIsReusable;
+
+ if(mResponder)
+ {
+ output["responder"] = mResponder->asLLSD();
+ }
+
return output;
}
@@ -479,7 +415,9 @@ void LLNotification::updateFrom(LLNotificationPtr other)
mForm = other->mForm;
mResponseFunctorName = other->mResponseFunctorName;
mRespondedTo = other->mRespondedTo;
+ mResponse = other->mResponse;
mTemporaryResponder = other->mTemporaryResponder;
+ mIsReusable = other->isReusable();
update();
}
@@ -556,14 +494,24 @@ std::string LLNotification::getSelectedOptionName(const LLSD& response)
void LLNotification::respond(const LLSD& response)
{
+ // *TODO may remove mRespondedTo and use mResponce.isDefined() in isRespondedTo()
mRespondedTo = true;
- // look up the functor
- LLNotificationFunctorRegistry::ResponseFunctor functor =
- LLNotificationFunctorRegistry::instance().getFunctor(mResponseFunctorName);
- // and then call it
- functor(asLLSD(), response);
-
- if (mTemporaryResponder)
+ mResponse = response;
+
+ if(mResponder)
+ {
+ mResponder->handleRespond(asLLSD(), response);
+ }
+ else
+ {
+ // look up the functor
+ LLNotificationFunctorRegistry::ResponseFunctor functor =
+ LLNotificationFunctorRegistry::instance().getFunctor(mResponseFunctorName);
+ // and then call it
+ functor(asLLSD(), response);
+ }
+
+ if (mTemporaryResponder && !isReusable())
{
LLNotificationFunctorRegistry::instance().unregisterFunctor(mResponseFunctorName);
mResponseFunctorName = "";
@@ -597,6 +545,21 @@ void LLNotification::setResponseFunctor(std::string const &responseFunctorName)
mTemporaryResponder = false;
}
+void LLNotification::setResponseFunctor(const LLNotificationFunctorRegistry::ResponseFunctor& cb)
+{
+ if(mTemporaryResponder)
+ {
+ LLNotificationFunctorRegistry::instance().unregisterFunctor(mResponseFunctorName);
+ }
+
+ LLNotificationFunctorRegistry::instance().registerFunctor(mResponseFunctorName, cb);
+}
+
+void LLNotification::setResponseFunctor(const LLNotificationResponderPtr& responder)
+{
+ mResponder = responder;
+}
+
bool LLNotification::payloadContainsAll(const std::vector<std::string>& required_fields) const
{
for(std::vector<std::string>::const_iterator required_fields_it = required_fields.begin();
@@ -856,8 +819,12 @@ bool LLNotificationChannelBase::updateItem(const LLSD& payload, LLNotificationPt
if (wasFound)
{
abortProcessing = mChanged(payload);
- mItems.erase(pNotification);
- onDelete(pNotification);
+ // do not delete the notification to make LLChatHistory::appendMessage add notification panel to IM window
+ if( ! pNotification->isReusable() )
+ {
+ mItems.erase(pNotification);
+ onDelete(pNotification);
+ }
}
}
return abortProcessing;
@@ -1088,12 +1055,9 @@ void LLNotifications::createDefaultChannels()
LLNotificationChannel::buildChannel("Visible", "Ignore",
&LLNotificationFilters::includeEverything);
- // create special history channel
- //std::string notifications_log_file = gDirUtilp->getExpandedFilename ( LL_PATH_PER_SL_ACCOUNT, "open_notifications.xml" );
- // use ^^^ when done debugging notifications serialization
- std::string notifications_log_file = gDirUtilp->getExpandedFilename ( LL_PATH_USER_SETTINGS, "open_notifications.xml" );
+ // create special persistent notification channel
// this isn't a leak, don't worry about the empty "new"
- new LLNotificationHistoryChannel(notifications_log_file);
+ new LLPersistentNotificationChannel();
// connect action methods to these channels
LLNotifications::instance().getChannel("Expiration")->
@@ -1524,3 +1488,11 @@ std::ostream& operator<<(std::ostream& s, const LLNotification& notification)
return s;
}
+void LLPostponedNotification::onCachedNameReceived(const LLUUID& id, const std::string& first,
+ const std::string& last, bool is_group)
+{
+ gCacheName->getFullName(id, mName);
+ modifyNotificationParams();
+ LLNotifications::instance().add(mParams);
+ cleanup();
+}
diff --git a/indra/llui/llnotifications.h b/indra/llui/llnotifications.h
index 8d993b71d7..c942a32512 100644
--- a/indra/llui/llnotifications.h
+++ b/indra/llui/llnotifications.h
@@ -104,6 +104,7 @@
#include "llinitparam.h"
#include "llnotificationslistener.h"
#include "llnotificationptr.h"
+#include "llcachename.h"
typedef enum e_notification_priority
@@ -115,8 +116,23 @@ typedef enum e_notification_priority
NOTIFICATION_PRIORITY_CRITICAL
} ENotificationPriority;
+class LLNotificationResponderInterface
+{
+public:
+ LLNotificationResponderInterface(){};
+ virtual ~LLNotificationResponderInterface(){};
+
+ virtual void handleRespond(const LLSD& notification, const LLSD& response) = 0;
+
+ virtual LLSD asLLSD() = 0;
+
+ virtual void fromLLSD(const LLSD& params) = 0;
+};
+
typedef boost::function<void (const LLSD&, const LLSD&)> LLNotificationResponder;
+typedef boost::shared_ptr<LLNotificationResponderInterface> LLNotificationResponderPtr;
+
typedef LLFunctorRegistry<LLNotificationResponder> LLNotificationFunctorRegistry;
typedef LLFunctorRegistration<LLNotificationResponder> LLNotificationFunctorRegistration;
@@ -296,15 +312,18 @@ public:
Optional<LLSD> form_elements;
Optional<LLDate> time_stamp;
Optional<LLNotificationContext*> context;
+ Optional<void*> responder;
struct Functor : public LLInitParam::Choice<Functor>
{
Alternative<std::string> name;
Alternative<LLNotificationFunctorRegistry::ResponseFunctor> function;
+ Alternative<LLNotificationResponderPtr> responder;
Functor()
: name("functor_name"),
- function("functor")
+ function("functor"),
+ responder("responder")
{}
};
Optional<Functor> functor;
@@ -317,6 +336,7 @@ public:
form_elements("form_elements")
{
time_stamp = LLDate::now();
+ responder = NULL;
}
Params(const std::string& _name)
@@ -329,6 +349,7 @@ public:
functor.name = _name;
name = _name;
time_stamp = LLDate::now();
+ responder = NULL;
}
};
@@ -341,13 +362,17 @@ private:
LLDate mExpiresAt;
bool mCancelled;
bool mRespondedTo; // once the notification has been responded to, this becomes true
+ LLSD mResponse;
bool mIgnored;
ENotificationPriority mPriority;
LLNotificationFormPtr mForm;
-
+ void* mResponderObj; // TODO - refactor/remove this field
+ bool mIsReusable;
+ LLNotificationResponderPtr mResponder;
+
// a reference to the template
LLNotificationTemplatePtr mTemplatep;
-
+
/*
We want to be able to store and reload notifications so that they can survive
a shutdown/restart of the client. So we can't simply pass in callbacks;
@@ -384,6 +409,10 @@ public:
void setResponseFunctor(std::string const &responseFunctorName);
+ void setResponseFunctor(const LLNotificationFunctorRegistry::ResponseFunctor& cb);
+
+ void setResponseFunctor(const LLNotificationResponderPtr& responder);
+
typedef enum e_response_template_type
{
WITHOUT_DEFAULT_BUTTON,
@@ -423,6 +452,10 @@ public:
void respond(const LLSD& sd);
+ void* getResponder() { return mResponderObj; }
+
+ void setResponder(void* responder) { mResponderObj = responder; }
+
void setIgnored(bool ignore);
bool isCancelled() const
@@ -435,6 +468,8 @@ public:
return mRespondedTo;
}
+ const LLSD& getResponse() { return mResponse; }
+
bool isIgnored() const
{
return mIgnored;
@@ -444,7 +479,12 @@ public:
{
return mTemplatep->mName;
}
-
+
+ bool isPersistent() const
+ {
+ return mTemplatep->mPersist;
+ }
+
const LLUUID& id() const
{
return mId;
@@ -504,6 +544,10 @@ public:
{
return mId;
}
+
+ bool isReusable() { return mIsReusable; }
+
+ void setReusable(bool reusable) { mIsReusable = reusable; }
// comparing two notifications normally means comparing them by UUID (so we can look them
// up quickly this way)
@@ -931,6 +975,62 @@ private:
boost::scoped_ptr<LLNotificationsListener> mListener;
};
+/**
+ * Abstract class for postponed notifications.
+ * Provides possibility to add notification after specified by id avatar or group will be
+ * received from cache name. The object of this type automatically well be deleted
+ * by cleanup method after respond will be received from cache name.
+ *
+ * To add custom postponed notification to the notification system client should:
+ * 1 create class derived from LLPostponedNotification;
+ * 2 call LLPostponedNotification::add method;
+ */
+class LLPostponedNotification
+{
+public:
+ /**
+ * Performs hooking cache name callback which will add notification to notifications system.
+ * Type of added notification should be specified by template parameter T
+ * and non-private derived from LLPostponedNotification class,
+ * otherwise compilation error will occur.
+ */
+ template<class T>
+ static void add(const LLNotification::Params& params,
+ const LLUUID& id, bool is_group)
+ {
+ // upcast T to the base type to restrict T derivation from LLPostponedNotification
+ LLPostponedNotification* thiz = new T();
+
+ thiz->mParams = params;
+
+ gCacheName->get(id, is_group, boost::bind(
+ &LLPostponedNotification::onCachedNameReceived, thiz, _1, _2,
+ _3, _4));
+ }
+
+private:
+ void onCachedNameReceived(const LLUUID& id, const std::string& first,
+ const std::string& last, bool is_group);
+
+ void cleanup()
+ {
+ delete this;
+ }
+
+protected:
+ LLPostponedNotification() {}
+ virtual ~LLPostponedNotification() {}
+
+ /**
+ * Abstract method provides possibility to modify notification parameters and
+ * will be called after cache name retrieve information about avatar or group
+ * and before notification will be added to the notification system.
+ */
+ virtual void modifyNotificationParams() = 0;
+
+ LLNotification::Params mParams;
+ std::string mName;
+};
#endif//LL_LLNOTIFICATIONS_H
diff --git a/indra/llui/llpanel.cpp b/indra/llui/llpanel.cpp
index 7f23fe2671..0cd052eefa 100644
--- a/indra/llui/llpanel.cpp
+++ b/indra/llui/llpanel.cpp
@@ -80,6 +80,8 @@ LLPanel::Params::Params()
background_opaque("background_opaque", false),
bg_opaque_color("bg_opaque_color"),
bg_alpha_color("bg_alpha_color"),
+ bg_opaque_image_overlay("bg_opaque_image_overlay"),
+ bg_alpha_image_overlay("bg_alpha_image_overlay"),
bg_opaque_image("bg_opaque_image"),
bg_alpha_image("bg_alpha_image"),
min_width("min_width", 100),
@@ -103,6 +105,8 @@ LLPanel::LLPanel(const LLPanel::Params& p)
mBgOpaque(p.background_opaque),
mBgOpaqueColor(p.bg_opaque_color()),
mBgAlphaColor(p.bg_alpha_color()),
+ mBgOpaqueImageOverlay(p.bg_opaque_image_overlay),
+ mBgAlphaImageOverlay(p.bg_alpha_image_overlay),
mBgOpaqueImage(p.bg_opaque_image()),
mBgAlphaImage(p.bg_alpha_image()),
mDefaultBtn(NULL),
@@ -199,7 +203,7 @@ void LLPanel::draw()
// opaque, in-front look
if (mBgOpaqueImage.notNull())
{
- mBgOpaqueImage->draw( local_rect, UI_VERTEX_COLOR % alpha );
+ mBgOpaqueImage->draw( local_rect, mBgOpaqueImageOverlay % alpha );
}
else
{
@@ -212,7 +216,7 @@ void LLPanel::draw()
// transparent, in-back look
if (mBgAlphaImage.notNull())
{
- mBgAlphaImage->draw( local_rect, UI_VERTEX_COLOR % alpha );
+ mBgAlphaImage->draw( local_rect, mBgAlphaImageOverlay % alpha );
}
else
{
@@ -397,6 +401,12 @@ LLView* LLPanel::fromXML(LLXMLNodePtr node, LLView* parent, LLXMLNodePtr output_
if (!panelp)
{
panelp = LLUICtrlFactory::getInstance()->createFactoryPanel(name);
+ llassert(panelp);
+
+ if (!panelp)
+ {
+ return NULL; // :(
+ }
}
}
@@ -414,7 +424,7 @@ LLView* LLPanel::fromXML(LLXMLNodePtr node, LLView* parent, LLXMLNodePtr output_
panelp->mCommitCallbackRegistrar.popScope();
panelp->mEnableCallbackRegistrar.popScope();
- if (panelp && !panelp->getFactoryMap().empty())
+ if (!panelp->getFactoryMap().empty())
{
LLUICtrlFactory::instance().popFactoryFunctions();
}
@@ -475,6 +485,8 @@ void LLPanel::initFromParams(const LLPanel::Params& p)
setTransparentColor(p.bg_alpha_color().get());
mBgOpaqueImage = p.bg_opaque_image();
mBgAlphaImage = p.bg_alpha_image();
+ mBgOpaqueImageOverlay = p.bg_opaque_image_overlay;
+ mBgAlphaImageOverlay = p.bg_alpha_image_overlay;
}
static LLFastTimer::DeclareTimer FTM_PANEL_SETUP("Panel Setup");
@@ -936,7 +948,7 @@ LLPanel *LLPanel::childGetVisiblePanelWithHelp()
return ::childGetVisiblePanelWithHelp(this);
}
-void LLPanel::childSetPrevalidate(const std::string& id, BOOL (*func)(const LLWString &) )
+void LLPanel::childSetPrevalidate(const std::string& id, bool (*func)(const LLWString &) )
{
LLLineEditor* child = findChild<LLLineEditor>(id);
if (child)
diff --git a/indra/llui/llpanel.h b/indra/llui/llpanel.h
index 6de83fe3a7..03e3dc0c0e 100644
--- a/indra/llui/llpanel.h
+++ b/indra/llui/llpanel.h
@@ -77,7 +77,9 @@ public:
background_opaque;
Optional<LLUIColor> bg_opaque_color,
- bg_alpha_color;
+ bg_alpha_color,
+ bg_opaque_image_overlay,
+ bg_alpha_image_overlay;
// opaque image is for "panel in foreground" look
Optional<LLUIImage*> bg_opaque_image,
bg_alpha_image;
@@ -137,6 +139,8 @@ public:
const LLColor4& getTransparentColor() const { return mBgAlphaColor; }
LLPointer<LLUIImage> getBackgroundImage() const { return mBgOpaqueImage; }
LLPointer<LLUIImage> getTransparentImage() const { return mBgAlphaImage; }
+ LLColor4 getBackgroundImageOverlay() { return mBgOpaqueImageOverlay; }
+ LLColor4 getTransparentImageOverlay() { return mBgAlphaImageOverlay; }
void setBackgroundVisible( BOOL b ) { mBgVisible = b; }
BOOL isBackgroundVisible() const { return mBgVisible; }
void setBackgroundOpaque(BOOL b) { mBgOpaque = b; }
@@ -226,7 +230,7 @@ public:
std::string childGetText(const std::string& id) const { return childGetValue(id).asString(); }
// LLLineEditor
- void childSetPrevalidate(const std::string& id, BOOL (*func)(const LLWString &) );
+ void childSetPrevalidate(const std::string& id, bool (*func)(const LLWString &) );
// LLButton
void childSetAction(const std::string& id, boost::function<void(void*)> function, void* value = NULL);
@@ -262,6 +266,8 @@ private:
BOOL mBgOpaque; // use opaque color or image
LLUIColor mBgOpaqueColor;
LLUIColor mBgAlphaColor;
+ LLUIColor mBgOpaqueImageOverlay;
+ LLUIColor mBgAlphaImageOverlay;
LLPointer<LLUIImage> mBgOpaqueImage; // "panel in front" look
LLPointer<LLUIImage> mBgAlphaImage; // "panel in back" look
LLViewBorder* mBorder;
diff --git a/indra/llui/llradiogroup.cpp b/indra/llui/llradiogroup.cpp
index 4087b484aa..e27792dc1d 100644
--- a/indra/llui/llradiogroup.cpp
+++ b/indra/llui/llradiogroup.cpp
@@ -106,7 +106,6 @@ LLRadioGroup::LLRadioGroup(const LLRadioGroup::Params& p)
void LLRadioGroup::initFromParams(const Params& p)
{
- LLUICtrl::initFromParams(p);
for (LLInitParam::ParamIterator<ItemParams>::const_iterator it = p.items().begin();
it != p.items().end();
++it)
@@ -124,6 +123,9 @@ void LLRadioGroup::initFromParams(const Params& p)
LLRadioCtrl* item = LLUICtrlFactory::create<LLRadioCtrl>(item_params, this);
mRadioButtons.push_back(item);
}
+
+ // call this *after* setting up mRadioButtons so we can handle setValue() calls
+ LLUICtrl::initFromParams(p);
}
@@ -138,10 +140,6 @@ BOOL LLRadioGroup::postBuild()
{
mRadioButtons[0]->setTabStop(true);
}
- if (mControlVariable)
- {
- setSelectedIndex(mControlVariable->getValue().asInteger());
- }
return TRUE;
}
diff --git a/indra/llui/llresizebar.cpp b/indra/llui/llresizebar.cpp
index 0c46edf300..5d26b904b5 100644
--- a/indra/llui/llresizebar.cpp
+++ b/indra/llui/llresizebar.cpp
@@ -182,6 +182,11 @@ BOOL LLResizeBar::handleHover(S32 x, S32 y, MASK mask)
break;
}
+ notifyParent(LLSD().with("action", "resize")
+ .with("view_name", mResizingView->getName())
+ .with("new_height", new_height)
+ .with("new_width", new_width));
+
scaled_rect.mTop = scaled_rect.mBottom + new_height;
scaled_rect.mRight = scaled_rect.mLeft + new_width;
mResizingView->setRect(scaled_rect);
diff --git a/indra/llui/llresizehandle.cpp b/indra/llui/llresizehandle.cpp
index 3df09d124a..00214d451c 100644
--- a/indra/llui/llresizehandle.cpp
+++ b/indra/llui/llresizehandle.cpp
@@ -124,7 +124,7 @@ BOOL LLResizeHandle::handleHover(S32 x, S32 y, MASK mask)
{
// Make sure the mouse in still over the application. We don't want to make the parent
// so big that we can't see the resize handle any more.
-
+
S32 screen_x;
S32 screen_y;
localPointToScreen(x, y, &screen_x, &screen_y);
@@ -136,9 +136,10 @@ BOOL LLResizeHandle::handleHover(S32 x, S32 y, MASK mask)
if( resizing_view )
{
// undock floater when user resize it
- if (((LLFloater*)getParent())->isDocked())
+ LLFloater* floater_parent = dynamic_cast<LLFloater*>(getParent());
+ if (floater_parent && floater_parent->isDocked())
{
- ((LLFloater*)getParent())->setDocked(false, false);
+ floater_parent->setDocked(false, false);
}
// Resize the parent
@@ -146,61 +147,68 @@ BOOL LLResizeHandle::handleHover(S32 x, S32 y, MASK mask)
LLRect scaled_rect = orig_rect;
S32 delta_x = screen_x - mDragLastScreenX;
S32 delta_y = screen_y - mDragLastScreenY;
-
- if(delta_x == 0 && delta_y == 0)
- return FALSE;
-
LLCoordGL mouse_dir;
// use hysteresis on mouse motion to preserve user intent when mouse stops moving
mouse_dir.mX = (screen_x == mLastMouseScreenX) ? mLastMouseDir.mX : screen_x - mLastMouseScreenX;
mouse_dir.mY = (screen_y == mLastMouseScreenY) ? mLastMouseDir.mY : screen_y - mLastMouseScreenY;
-
mLastMouseScreenX = screen_x;
mLastMouseScreenY = screen_y;
mLastMouseDir = mouse_dir;
- S32 new_width = orig_rect.getWidth();
- S32 new_height = orig_rect.getHeight();
+ S32 x_multiple = 1;
+ S32 y_multiple = 1;
+ switch( mCorner )
+ {
+ case LEFT_TOP:
+ x_multiple = -1;
+ y_multiple = 1;
+ break;
+ case LEFT_BOTTOM:
+ x_multiple = -1;
+ y_multiple = -1;
+ break;
+ case RIGHT_TOP:
+ x_multiple = 1;
+ y_multiple = 1;
+ break;
+ case RIGHT_BOTTOM:
+ x_multiple = 1;
+ y_multiple = -1;
+ break;
+ }
- S32 new_pos_x = orig_rect.mLeft;
- S32 new_pos_y = orig_rect.mTop;
+ S32 new_width = orig_rect.getWidth() + x_multiple * delta_x;
+ if( new_width < mMinWidth )
+ {
+ new_width = mMinWidth;
+ delta_x = x_multiple * (mMinWidth - orig_rect.getWidth());
+ }
+
+ S32 new_height = orig_rect.getHeight() + y_multiple * delta_y;
+ if( new_height < mMinHeight )
+ {
+ new_height = mMinHeight;
+ delta_y = y_multiple * (mMinHeight - orig_rect.getHeight());
+ }
switch( mCorner )
{
- case LEFT_TOP:
- new_width-=delta_x;
- new_height+=delta_y;
- new_pos_x+=delta_x;
- new_pos_y+=delta_y;
+ case LEFT_TOP:
+ scaled_rect.translate(delta_x, 0);
break;
case LEFT_BOTTOM:
- new_width-=delta_x;
- new_height-=delta_y;
- new_pos_x+=delta_x;
+ scaled_rect.translate(delta_x, delta_y);
break;
case RIGHT_TOP:
- new_width+=delta_x;
- new_height+=delta_y;
- new_pos_y+=delta_y;
break;
case RIGHT_BOTTOM:
- new_width+=delta_x;
- new_height-=delta_y;
+ scaled_rect.translate(0, delta_y);
break;
}
- new_width = llmax(new_width,mMinWidth);
- new_height = llmax(new_height,mMinHeight);
-
- LLRect::tCoordType screen_width = resizing_view->getParent()->getSnapRect().getWidth();
- LLRect::tCoordType screen_height = resizing_view->getParent()->getSnapRect().getHeight();
-
- new_width = llmin(new_width, screen_width);
- new_height = llmin(new_height, screen_height);
-
// temporarily set new parent rect
- scaled_rect.setLeftTopAndSize(new_pos_x,new_pos_y,new_width,new_height);
-
+ scaled_rect.mRight = scaled_rect.mLeft + new_width;
+ scaled_rect.mTop = scaled_rect.mBottom + new_height;
resizing_view->setRect(scaled_rect);
LLView* snap_view = NULL;
@@ -251,11 +259,7 @@ BOOL LLResizeHandle::handleHover(S32 x, S32 y, MASK mask)
resizing_view->setRect(orig_rect);
// translate and scale to new shape
- resizing_view->reshape(scaled_rect.getWidth(),scaled_rect.getHeight());
- resizing_view->setRect(scaled_rect);
- //set shape to handle dependent floaters...
- resizing_view->handleReshape(scaled_rect, false);
-
+ resizing_view->setShape(scaled_rect, true);
// update last valid mouse cursor position based on resized view's actual size
LLRect new_rect = resizing_view->getRect();
diff --git a/indra/llui/llscrollingpanellist.cpp b/indra/llui/llscrollingpanellist.cpp
index 4f55c0507c..b7840d1b59 100644
--- a/indra/llui/llscrollingpanellist.cpp
+++ b/indra/llui/llscrollingpanellist.cpp
@@ -47,7 +47,12 @@ void LLScrollingPanelList::clearPanels()
{
deleteAllChildren();
mPanelList.clear();
- reshape( 1, 1, FALSE );
+
+ LLRect rc = getRect();
+ rc.setLeftTopAndSize(rc.mLeft, rc.mTop, 1, 1);
+ setRect(rc);
+
+ notifySizeChanged(rc.getHeight());
}
S32 LLScrollingPanelList::addPanel( LLScrollingPanel* panel )
@@ -67,7 +72,11 @@ S32 LLScrollingPanelList::addPanel( LLScrollingPanel* panel )
max_width = llmax( max_width, childp->getRect().getWidth() );
cur_gap = GAP_BETWEEN_PANELS;
}
- reshape( max_width, total_height, FALSE );
+ LLRect rc = getRect();
+ rc.setLeftTopAndSize(rc.mLeft, rc.mTop, max_width, total_height);
+ setRect(rc);
+
+ notifySizeChanged(rc.getHeight());
// Reposition each of the child views
S32 cur_y = total_height;
@@ -131,7 +140,11 @@ void LLScrollingPanelList::removePanel( U32 panel_index )
max_width = llmax( max_width, childp->getRect().getWidth() );
cur_gap = GAP_BETWEEN_PANELS;
}
- reshape( max_width, total_height, FALSE );
+ LLRect rc = getRect();
+ rc.setLeftTopAndSize(rc.mLeft, rc.mTop, max_width, total_height);
+ setRect(rc);
+
+ notifySizeChanged(rc.getHeight());
// Reposition each of the child views
S32 cur_y = total_height;
@@ -200,3 +213,12 @@ void LLScrollingPanelList::draw()
LLUICtrl::draw();
}
+void LLScrollingPanelList::notifySizeChanged(S32 height)
+{
+ LLSD info;
+ info["action"] = "size_changes";
+ info["height"] = height;
+ notifyParent(info);
+}
+
+// EOF
diff --git a/indra/llui/llscrollingpanellist.h b/indra/llui/llscrollingpanellist.h
index 3abfbcbbe7..5f1996159b 100644
--- a/indra/llui/llscrollingpanellist.h
+++ b/indra/llui/llscrollingpanellist.h
@@ -61,7 +61,6 @@ public:
Params()
{
name = "scrolling_panel_list";
- follows.flags = FOLLOWS_LEFT | FOLLOWS_BOTTOM;
}
};
LLScrollingPanelList(const Params& p)
@@ -86,6 +85,11 @@ public:
private:
void updatePanelVisiblilty();
+ /**
+ * Notify parent about size change, makes sense when used inside accordion
+ */
+ void notifySizeChanged(S32 height);
+
panel_list_t mPanelList;
};
diff --git a/indra/llui/llscrolllistcell.cpp b/indra/llui/llscrolllistcell.cpp
index 3cc92baa8d..d17be8b94a 100644
--- a/indra/llui/llscrolllistcell.cpp
+++ b/indra/llui/llscrolllistcell.cpp
@@ -185,6 +185,8 @@ LLScrollListText::LLScrollListText(const LLScrollListCell::Params& p)
{
sCount++;
+ mTextWidth = getWidth();
+
// initialize rounded rect image
if (!mRoundedRectImage)
{
@@ -340,7 +342,7 @@ void LLScrollListText::draw(const LLColor4& color, const LLColor4& highlight_col
0,
LLFontGL::NO_SHADOW,
string_chars,
- getWidth(),
+ getTextWidth(),
&right_x,
TRUE);
}
diff --git a/indra/llui/llscrolllistcell.h b/indra/llui/llscrolllistcell.h
index 5fecf5aade..b1c8901fc4 100644
--- a/indra/llui/llscrolllistcell.h
+++ b/indra/llui/llscrolllistcell.h
@@ -151,11 +151,16 @@ public:
/*virtual*/ const std::string & getToolTip() const;
/*virtual*/ BOOL needsToolTip() const;
+ S32 getTextWidth() const { return mTextWidth;}
+ void setTextWidth(S32 value) { mTextWidth = value;}
+ virtual void setWidth(S32 width) { LLScrollListCell::setWidth(width); mTextWidth = width; }
+
void setText(const LLStringExplicit& text);
void setFontStyle(const U8 font_style);
private:
LLUIString mText;
+ S32 mTextWidth;
const LLFontGL* mFont;
LLColor4 mColor;
U8 mUseColor;
diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp
index 478e270c98..d4d161f2c9 100644
--- a/indra/llui/llscrolllistctrl.cpp
+++ b/indra/llui/llscrolllistctrl.cpp
@@ -71,8 +71,9 @@ static LLDefaultChildRegistry::Register<LLScrollListCtrl> r("scroll_list");
// local structures & classes.
struct SortScrollListItem
{
- SortScrollListItem(const std::vector<std::pair<S32, BOOL> >& sort_orders)
+ SortScrollListItem(const std::vector<std::pair<S32, BOOL> >& sort_orders,const LLScrollListCtrl::sort_signal_t* sort_signal)
: mSortOrders(sort_orders)
+ , mSortSignal(sort_signal)
{}
bool operator()(const LLScrollListItem* i1, const LLScrollListItem* i2)
@@ -85,12 +86,20 @@ struct SortScrollListItem
S32 col_idx = it->first;
BOOL sort_ascending = it->second;
+ S32 order = sort_ascending ? 1 : -1; // ascending or descending sort for this column?
+
const LLScrollListCell *cell1 = i1->getColumn(col_idx);
const LLScrollListCell *cell2 = i2->getColumn(col_idx);
- S32 order = sort_ascending ? 1 : -1; // ascending or descending sort for this column?
if (cell1 && cell2)
{
- sort_result = order * LLStringUtil::compareDict(cell1->getValue().asString(), cell2->getValue().asString());
+ if(mSortSignal)
+ {
+ sort_result = order * (*mSortSignal)(col_idx,i1, i2);
+ }
+ else
+ {
+ sort_result = order * LLStringUtil::compareDict(cell1->getValue().asString(), cell2->getValue().asString());
+ }
if (sort_result != 0)
{
break; // we have a sort order!
@@ -100,8 +109,10 @@ struct SortScrollListItem
return sort_result < 0;
}
+
typedef std::vector<std::pair<S32, BOOL> > sort_order_t;
+ const LLScrollListCtrl::sort_signal_t* mSortSignal;
const sort_order_t& mSortOrders;
};
@@ -169,6 +180,7 @@ LLScrollListCtrl::LLScrollListCtrl(const LLScrollListCtrl::Params& p)
mOnSortChangedCallback( NULL ),
mHighlightedItem(-1),
mBorder(NULL),
+ mSortCallback(NULL),
mPopupMenu(NULL),
mNumDynamicWidthColumns(0),
mTotalStaticColumnWidth(0),
@@ -270,6 +282,8 @@ LLScrollListCtrl::LLScrollListCtrl(const LLScrollListCtrl::Params& p)
text_p.border_visible(false);
text_p.rect(mItemListRect);
text_p.follows.flags(FOLLOWS_ALL);
+ // word wrap was added accroding to the EXT-6841
+ text_p.wrap(true);
addChild(LLUICtrlFactory::create<LLTextBox>(text_p));
}
@@ -309,12 +323,9 @@ bool LLScrollListCtrl::preProcessChildNode(LLXMLNodePtr child)
LLScrollListCtrl::~LLScrollListCtrl()
{
- std::for_each(mItemList.begin(), mItemList.end(), DeletePointer());
+ delete mSortCallback;
- if( gEditMenuHandler == this )
- {
- gEditMenuHandler = NULL;
- }
+ std::for_each(mItemList.begin(), mItemList.end(), DeletePointer());
}
@@ -540,7 +551,7 @@ BOOL LLScrollListCtrl::addItem( LLScrollListItem* item, EAddPosition pos, BOOL r
std::stable_sort(
mItemList.begin(),
mItemList.end(),
- SortScrollListItem(single_sort_column));
+ SortScrollListItem(single_sort_column,mSortCallback));
// ADD_SORTED just sorts by first column...
// this might not match user sort criteria, so flag list as being in unsorted state
@@ -943,14 +954,14 @@ void LLScrollListCtrl::mouseOverHighlightNthItem(S32 target_index)
}
}
-S32 LLScrollListCtrl::selectMultiple( std::vector<LLUUID> ids )
+S32 LLScrollListCtrl::selectMultiple( uuid_vec_t ids )
{
item_list::iterator iter;
S32 count = 0;
for (iter = mItemList.begin(); iter != mItemList.end(); iter++)
{
LLScrollListItem* item = *iter;
- std::vector<LLUUID>::iterator iditr;
+ uuid_vec_t::iterator iditr;
for(iditr = ids.begin(); iditr != ids.end(); ++iditr)
{
if (item->getEnabled() && (item->getUUID() == (*iditr)))
@@ -1388,6 +1399,8 @@ void LLScrollListCtrl::drawItems()
LLGLSUIDefault gls_ui;
+ F32 alpha = getDrawContext().mAlpha;
+
{
LLLocalClipRect clip(mItemListRect);
@@ -1463,7 +1476,7 @@ void LLScrollListCtrl::drawItems()
bg_color = mBgReadOnlyColor.get();
}
- item->draw(item_rect, fg_color, bg_color, highlight_color, mColumnPadding);
+ item->draw(item_rect, fg_color % alpha, bg_color% alpha, highlight_color % alpha, mColumnPadding);
cur_y -= mLineHeight;
}
@@ -2393,7 +2406,7 @@ void LLScrollListCtrl::updateSort() const
std::stable_sort(
mItemList.begin(),
mItemList.end(),
- SortScrollListItem(mSortColumns));
+ SortScrollListItem(mSortColumns,mSortCallback));
mSorted = true;
}
@@ -2409,7 +2422,7 @@ void LLScrollListCtrl::sortOnce(S32 column, BOOL ascending)
std::stable_sort(
mItemList.begin(),
mItemList.end(),
- SortScrollListItem(sort_column));
+ SortScrollListItem(sort_column,mSortCallback));
}
void LLScrollListCtrl::dirtyColumns()
@@ -2936,7 +2949,6 @@ BOOL LLScrollListCtrl::operateOnAll(EOperation op)
//virtual
void LLScrollListCtrl::setFocus(BOOL b)
{
- mSearchString.clear();
// for tabbing into pristine scroll lists (Finder)
if (!getFirstSelected())
{
@@ -2981,6 +2993,9 @@ void LLScrollListCtrl::onFocusLost()
{
gFocusMgr.setMouseCapture(NULL);
}
+
+ mSearchString.clear();
+
LLUICtrl::onFocusLost();
}
diff --git a/indra/llui/llscrolllistctrl.h b/indra/llui/llscrolllistctrl.h
index d2d2379328..1f0ef585db 100644
--- a/indra/llui/llscrolllistctrl.h
+++ b/indra/llui/llscrolllistctrl.h
@@ -73,6 +73,30 @@ public:
// *TODO: Add callbacks to Params
typedef boost::function<void (void)> callback_t;
+
+ template<typename T> struct maximum
+ {
+ typedef T result_type;
+
+ template<typename InputIterator>
+ T operator()(InputIterator first, InputIterator last) const
+ {
+ // If there are no slots to call, just return the
+ // default-constructed value
+ if(first == last ) return T();
+ T max_value = *first++;
+ while (first != last) {
+ if (max_value < *first)
+ max_value = *first;
+ ++first;
+ }
+
+ return max_value;
+ }
+ };
+
+
+ typedef boost::signals2::signal<S32 (S32,const LLScrollListItem*,const LLScrollListItem*),maximum<S32> > sort_signal_t;
struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
{
@@ -195,7 +219,10 @@ public:
void deselectAllItems(BOOL no_commit_on_change = FALSE); // by default, go ahead and commit on selection change
void clearHighlightedItems();
- void mouseOverHighlightNthItem( S32 index );
+
+ virtual void mouseOverHighlightNthItem( S32 index );
+
+ S32 getHighlightedItemInx() const { return mHighlightedItem; }
void setDoubleClickCallback( callback_t cb ) { mOnDoubleClickCallback = cb; }
void setMaximumSelectCallback( callback_t cb) { mOnMaximumSelectCallback = cb; }
@@ -352,7 +379,7 @@ public:
BOOL getSortAscending() { return mSortColumns.empty() ? TRUE : mSortColumns.back().second; }
BOOL hasSortOrder() const;
- S32 selectMultiple( std::vector<LLUUID> ids );
+ S32 selectMultiple( uuid_vec_t ids );
// conceptually const, but mutates mItemList
void updateSort() const;
// sorts a list without affecting the permanent sort order (so further list insertions can be unsorted, for example)
@@ -362,6 +389,13 @@ public:
void setNeedsSort(bool val = true) { mSorted = !val; }
void dirtyColumns(); // some operation has potentially affected column layout or ordering
+ boost::signals2::connection setSortCallback(sort_signal_t::slot_type cb )
+ {
+ if (!mSortCallback) mSortCallback = new sort_signal_t();
+ return mSortCallback->connect(cb);
+ }
+
+
protected:
// "Full" interface: use this when you're creating a list that has one or more of the following:
// * contains icons
@@ -474,6 +508,8 @@ private:
typedef std::pair<S32, BOOL> sort_column_t;
std::vector<sort_column_t> mSortColumns;
+
+ sort_signal_t* mSortCallback;
}; // end class LLScrollListCtrl
#endif // LL_SCROLLLISTCTRL_H
diff --git a/indra/llui/llsearcheditor.cpp b/indra/llui/llsearcheditor.cpp
index 6fa99df82e..ec2ad5e5fa 100644
--- a/indra/llui/llsearcheditor.cpp
+++ b/indra/llui/llsearcheditor.cpp
@@ -44,22 +44,34 @@ LLSearchEditor::LLSearchEditor(const LLSearchEditor::Params& p)
S32 srch_btn_top = p.search_button.top_pad + p.search_button.rect.height;
S32 srch_btn_right = p.search_button.rect.width + p.search_button.left_pad;
LLRect srch_btn_rect(p.search_button.left_pad, srch_btn_top, srch_btn_right, p.search_button.top_pad);
+
+ S32 clr_btn_top = p.clear_button.rect.bottom + p.clear_button.rect.height;
+ S32 clr_btn_right = getRect().getWidth() - p.clear_button.pad_right;
+ S32 clr_btn_left = clr_btn_right - p.clear_button.rect.width;
+ LLRect clear_btn_rect(clr_btn_left, clr_btn_top, clr_btn_right, p.clear_button.rect.bottom);
+
S32 text_pad_left = p.text_pad_left;
+ S32 text_pad_right = p.text_pad_right;
if (p.search_button_visible)
text_pad_left += srch_btn_rect.getWidth();
+ if (p.clear_button_visible)
+ text_pad_right = getRect().getWidth() - clr_btn_left + p.clear_button.pad_left;
+
// Set up line editor.
LLLineEditor::Params line_editor_params(p);
line_editor_params.name("filter edit box");
line_editor_params.rect(getLocalRect());
line_editor_params.follows.flags(FOLLOWS_ALL);
line_editor_params.text_pad_left(text_pad_left);
+ line_editor_params.text_pad_right(text_pad_right);
line_editor_params.revert_on_esc(false);
line_editor_params.commit_callback.function(boost::bind(&LLUICtrl::onCommit, this));
line_editor_params.keystroke_callback(boost::bind(&LLSearchEditor::handleKeystroke, this));
mSearchEditor = LLUICtrlFactory::create<LLLineEditor>(line_editor_params);
+ mSearchEditor->setPassDelete(TRUE);
addChild(mSearchEditor);
if (p.search_button_visible)
@@ -79,8 +91,6 @@ LLSearchEditor::LLSearchEditor(const LLSearchEditor::Params& p)
if (p.clear_button_visible)
{
// Set up clear button.
- S32 clr_btn_width = getRect().getHeight(); // button is square, and as tall as search editor
- LLRect clear_btn_rect(getRect().getWidth() - clr_btn_width, getRect().getHeight(), getRect().getWidth(), 0);
LLButton::Params clr_btn_params(p.clear_button);
clr_btn_params.name(std::string("clear button"));
clr_btn_params.rect(clear_btn_rect) ;
@@ -153,7 +163,7 @@ void LLSearchEditor::setFocus( BOOL b )
void LLSearchEditor::onClearButtonClick(const LLSD& data)
{
setText(LLStringUtil::null);
- mSearchEditor->doDelete(); // force keystroke callback
+ mSearchEditor->onCommit(); // force keystroke callback
}
void LLSearchEditor::handleKeystroke()
diff --git a/indra/llui/llsearcheditor.h b/indra/llui/llsearcheditor.h
index 714aca9337..785d0633dc 100644
--- a/indra/llui/llsearcheditor.h
+++ b/indra/llui/llsearcheditor.h
@@ -66,6 +66,8 @@ public:
}
};
+ void setCommitOnFocusLost(BOOL b) { if (mSearchEditor) mSearchEditor->setCommitOnFocusLost(b); }
+
protected:
LLSearchEditor(const Params&);
friend class LLUICtrlFactory;
diff --git a/indra/llui/llsliderctrl.cpp b/indra/llui/llsliderctrl.cpp
index 01c274bb4e..04958075db 100644
--- a/indra/llui/llsliderctrl.cpp
+++ b/indra/llui/llsliderctrl.cpp
@@ -63,7 +63,8 @@ LLSliderCtrl::LLSliderCtrl(const LLSliderCtrl::Params& p)
mCanEditText(p.can_edit_text),
mPrecision(p.decimal_digits),
mTextEnabledColor(p.text_color()),
- mTextDisabledColor(p.text_disabled_color())
+ mTextDisabledColor(p.text_disabled_color()),
+ mLabelWidth(p.label_width)
{
S32 top = getRect().getHeight();
S32 bottom = 0;
@@ -86,6 +87,7 @@ LLSliderCtrl::LLSliderCtrl(const LLSliderCtrl::Params& p)
params.initial_value(p.label());
mLabelBox = LLUICtrlFactory::create<LLTextBox> (params);
addChild(mLabelBox);
+ mLabelFont = params.font();
}
if (p.show_text && !p.text_width.isProvided())
@@ -141,7 +143,7 @@ LLSliderCtrl::LLSliderCtrl(const LLSliderCtrl::Params& p)
line_p.rect.setIfNotProvided(text_rect);
line_p.font.setIfNotProvided(p.font);
line_p.commit_callback.function(&LLSliderCtrl::onEditorCommit);
- line_p.prevalidate_callback(&LLLineEditor::prevalidateFloat);
+ line_p.prevalidate_callback(&LLTextValidate::validateFloat);
mEditor = LLUICtrlFactory::create<LLLineEditor>(line_p);
mEditor->setFocusReceivedCallback( boost::bind(&LLSliderCtrl::onEditorGainFocus, _1, this ));
@@ -186,9 +188,9 @@ BOOL LLSliderCtrl::setLabelArg( const std::string& key, const LLStringExplicit&
if (mLabelBox)
{
res = mLabelBox->setTextArg(key, text);
- if (res && mLabelWidth == 0)
+ if (res && mLabelFont && mLabelWidth == 0)
{
- S32 label_width = mFont->getWidth(mLabelBox->getText());
+ S32 label_width = mLabelFont->getWidth(mLabelBox->getText());
LLRect rect = mLabelBox->getRect();
S32 prev_right = rect.mRight;
rect.mRight = rect.mLeft + label_width;
diff --git a/indra/llui/llsliderctrl.h b/indra/llui/llsliderctrl.h
index c425849782..482c81a0f4 100644
--- a/indra/llui/llsliderctrl.h
+++ b/indra/llui/llsliderctrl.h
@@ -141,6 +141,7 @@ private:
void reportInvalidData();
const LLFontGL* mFont;
+ const LLFontGL* mLabelFont;
BOOL mShowText;
BOOL mCanEditText;
@@ -158,3 +159,4 @@ private:
};
#endif // LL_LLSLIDERCTRL_H
+
diff --git a/indra/llui/llspinctrl.cpp b/indra/llui/llspinctrl.cpp
index 28f3788817..c0d02fa8e9 100644
--- a/indra/llui/llspinctrl.cpp
+++ b/indra/llui/llspinctrl.cpp
@@ -127,7 +127,16 @@ LLSpinCtrl::LLSpinCtrl(const LLSpinCtrl::Params& p)
}
params.max_length_bytes(MAX_STRING_LENGTH);
params.commit_callback.function((boost::bind(&LLSpinCtrl::onEditorCommit, this, _2)));
- params.prevalidate_callback(&LLLineEditor::prevalidateFloat);
+
+ if( mPrecision>0 )//should accept float numbers
+ {
+ params.prevalidate_callback(&LLTextValidate::validateFloat);
+ }
+ else //should accept int numbers
+ {
+ params.prevalidate_callback(&LLTextValidate::validateNonNegativeS32);
+ }
+
params.follows.flags(FOLLOWS_LEFT | FOLLOWS_BOTTOM);
mEditor = LLUICtrlFactory::create<LLLineEditor> (params);
mEditor->setFocusReceivedCallback( boost::bind(&LLSpinCtrl::onEditorGainFocus, _1, this ));
@@ -457,3 +466,8 @@ BOOL LLSpinCtrl::handleKeyHere(KEY key, MASK mask)
return FALSE;
}
+BOOL LLSpinCtrl::handleDoubleClick(S32 x, S32 y, MASK mask)
+{
+ // just treat a double click as a second click
+ return handleMouseDown(x, y, mask);
+}
diff --git a/indra/llui/llspinctrl.h b/indra/llui/llspinctrl.h
index 00d6f86f83..06201255d2 100644
--- a/indra/llui/llspinctrl.h
+++ b/indra/llui/llspinctrl.h
@@ -94,6 +94,7 @@ public:
virtual BOOL handleScrollWheel(S32 x,S32 y,S32 clicks);
virtual BOOL handleKeyHere(KEY key, MASK mask);
+ virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
void onEditorCommit(const LLSD& data);
static void onEditorGainFocus(LLFocusableElement* caller, void *userdata);
diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp
index 6be76605fd..986cfe75a1 100644
--- a/indra/llui/lltabcontainer.cpp
+++ b/indra/llui/lltabcontainer.cpp
@@ -35,7 +35,6 @@
#include "lltabcontainer.h"
#include "llfocusmgr.h"
-#include "llbutton.h"
#include "lllocalcliprect.h"
#include "llrect.h"
#include "llresizehandle.h"
@@ -96,6 +95,95 @@ public:
//----------------------------------------------------------------------------
+//============================================================================
+/*
+ * @file lltabcontainer.cpp
+ * @brief class implements LLButton with LLIconCtrl on it
+ */
+class LLCustomButtonIconCtrl : public LLButton
+{
+public:
+ struct Params
+ : public LLInitParam::Block<Params, LLButton::Params>
+ {
+ // LEFT, RIGHT, TOP, BOTTOM paddings of LLIconCtrl in this class has same value
+ Optional<S32> icon_ctrl_pad;
+
+ Params():
+ icon_ctrl_pad("icon_ctrl_pad", 1)
+ {}
+ };
+
+protected:
+ friend class LLUICtrlFactory;
+ LLCustomButtonIconCtrl(const Params& p):
+ LLButton(p),
+ mIcon(NULL),
+ mIconAlignment(LLFontGL::HCENTER),
+ mIconCtrlPad(p.icon_ctrl_pad)
+ {}
+
+public:
+
+ void updateLayout()
+ {
+ LLRect button_rect = getRect();
+ LLRect icon_rect = mIcon->getRect();
+
+ S32 icon_size = button_rect.getHeight() - 2*mIconCtrlPad;
+
+ switch(mIconAlignment)
+ {
+ case LLFontGL::LEFT:
+ icon_rect.setLeftTopAndSize(button_rect.mLeft + mIconCtrlPad, button_rect.mTop - mIconCtrlPad,
+ icon_size, icon_size);
+ setLeftHPad(icon_size + mIconCtrlPad * 2);
+ break;
+ case LLFontGL::HCENTER:
+ icon_rect.setLeftTopAndSize(button_rect.mRight - (button_rect.getWidth() + mIconCtrlPad - icon_size)/2, button_rect.mTop - mIconCtrlPad,
+ icon_size, icon_size);
+ setRightHPad(icon_size + mIconCtrlPad * 2);
+ break;
+ case LLFontGL::RIGHT:
+ icon_rect.setLeftTopAndSize(button_rect.mRight - mIconCtrlPad - icon_size, button_rect.mTop - mIconCtrlPad,
+ icon_size, icon_size);
+ setRightHPad(icon_size + mIconCtrlPad * 2);
+ break;
+ default:
+ break;
+ }
+ mIcon->setRect(icon_rect);
+ }
+
+ void setIcon(LLIconCtrl* icon, LLFontGL::HAlign alignment = LLFontGL::LEFT)
+ {
+ if(icon)
+ {
+ if(mIcon)
+ {
+ removeChild(mIcon);
+ mIcon->die();
+ }
+ mIcon = icon;
+ mIconAlignment = alignment;
+
+ addChild(mIcon);
+ updateLayout();
+ }
+ }
+
+ LLIconCtrl* getIconCtrl() const
+ {
+ return mIcon;
+ }
+
+private:
+ LLIconCtrl* mIcon;
+ LLFontGL::HAlign mIconAlignment;
+ S32 mIconCtrlPad;
+};
+//============================================================================
+
struct LLPlaceHolderPanel : public LLPanel
{
// create dummy param block to register with "placeholder" nane
@@ -109,10 +197,13 @@ static LLDefaultChildRegistry::Register<LLTabContainer> r2("tab_container");
LLTabContainer::TabParams::TabParams()
: tab_top_image_unselected("tab_top_image_unselected"),
tab_top_image_selected("tab_top_image_selected"),
+ tab_top_image_flash("tab_top_image_flash"),
tab_bottom_image_unselected("tab_bottom_image_unselected"),
tab_bottom_image_selected("tab_bottom_image_selected"),
+ tab_bottom_image_flash("tab_bottom_image_flash"),
tab_left_image_unselected("tab_left_image_unselected"),
- tab_left_image_selected("tab_left_image_selected")
+ tab_left_image_selected("tab_left_image_selected"),
+ tab_left_image_flash("tab_left_image_flash")
{}
LLTabContainer::Params::Params()
@@ -127,7 +218,11 @@ LLTabContainer::Params::Params()
tab_padding_right("tab_padding_right"),
first_tab("first_tab"),
middle_tab("middle_tab"),
- last_tab("last_tab")
+ last_tab("last_tab"),
+ use_custom_icon_ctrl("use_custom_icon_ctrl", false),
+ tab_icon_ctrl_pad("tab_icon_ctrl_pad", 0),
+ use_ellipses("use_ellipses"),
+ font_halign("halign")
{
name(std::string("tab_container"));
mouse_opaque = false;
@@ -162,7 +257,10 @@ LLTabContainer::LLTabContainer(const LLTabContainer::Params& p)
mFont(p.font),
mFirstTabParams(p.first_tab),
mMiddleTabParams(p.middle_tab),
- mLastTabParams(p.last_tab)
+ mLastTabParams(p.last_tab),
+ mCustomIconCtrlUsed(p.use_custom_icon_ctrl),
+ mTabIconCtrlPad(p.tab_icon_ctrl_pad),
+ mUseTabEllipses(p.use_ellipses)
{
static LLUICachedControl<S32> tabcntr_vert_tab_min_width ("UITabCntrVertTabMinWidth", 0);
@@ -402,15 +500,15 @@ void LLTabContainer::draw()
if( mIsVertical && has_scroll_arrows )
{
// Redraw the arrows so that they appears on top.
- gGL.pushMatrix();
- gGL.translatef((F32)mPrevArrowBtn->getRect().mLeft, (F32)mPrevArrowBtn->getRect().mBottom, 0.f);
+ gGL.pushUIMatrix();
+ gGL.translateUI((F32)mPrevArrowBtn->getRect().mLeft, (F32)mPrevArrowBtn->getRect().mBottom, 0.f);
mPrevArrowBtn->draw();
- gGL.popMatrix();
+ gGL.popUIMatrix();
- gGL.pushMatrix();
- gGL.translatef((F32)mNextArrowBtn->getRect().mLeft, (F32)mNextArrowBtn->getRect().mBottom, 0.f);
+ gGL.pushUIMatrix();
+ gGL.translateUI((F32)mNextArrowBtn->getRect().mLeft, (F32)mNextArrowBtn->getRect().mBottom, 0.f);
mNextArrowBtn->draw();
- gGL.popMatrix();
+ gGL.popUIMatrix();
}
}
@@ -784,16 +882,19 @@ void LLTabContainer::update_images(LLTabTuple* tuple, TabParams params, LLTabCon
{
tuple->mButton->setImageUnselected(static_cast<LLUIImage*>(params.tab_top_image_unselected));
tuple->mButton->setImageSelected(static_cast<LLUIImage*>(params.tab_top_image_selected));
+ tuple->mButton->setImageFlash(static_cast<LLUIImage*>(params.tab_top_image_flash));
}
else if (pos == LLTabContainer::BOTTOM)
{
tuple->mButton->setImageUnselected(static_cast<LLUIImage*>(params.tab_bottom_image_unselected));
tuple->mButton->setImageSelected(static_cast<LLUIImage*>(params.tab_bottom_image_selected));
+ tuple->mButton->setImageFlash(static_cast<LLUIImage*>(params.tab_bottom_image_flash));
}
else if (pos == LLTabContainer::LEFT)
{
tuple->mButton->setImageUnselected(static_cast<LLUIImage*>(params.tab_left_image_unselected));
tuple->mButton->setImageSelected(static_cast<LLUIImage*>(params.tab_left_image_selected));
+ tuple->mButton->setImageFlash(static_cast<LLUIImage*>(params.tab_left_image_flash));
}
}
}
@@ -801,6 +902,10 @@ void LLTabContainer::update_images(LLTabTuple* tuple, TabParams params, LLTabCon
void LLTabContainer::addTabPanel(const TabPanelParams& panel)
{
LLPanel* child = panel.panel();
+
+ llassert(child);
+ if (!child) return;
+
const std::string& label = panel.label.isProvided()
? panel.label()
: panel.panel()->getLabel();
@@ -856,7 +961,7 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
LLRect tab_panel_rect;
if (!getTabsHidden() && mIsVertical)
{
- tab_panel_rect = LLRect(mMinTabWidth + (LLPANEL_BORDER_WIDTH * 2) + tabcntrv_pad,
+ tab_panel_rect = LLRect(mMinTabWidth + mRightTabBtnOffset + (LLPANEL_BORDER_WIDTH * 2) + tabcntrv_pad,
getRect().getHeight() - LLPANEL_BORDER_WIDTH,
getRect().getWidth() - LLPANEL_BORDER_WIDTH,
LLPANEL_BORDER_WIDTH);
@@ -905,6 +1010,11 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
LLTextBox* textbox = NULL;
LLButton* btn = NULL;
+ LLCustomButtonIconCtrl::Params custom_btn_params;
+ {
+ custom_btn_params.icon_ctrl_pad(mTabIconCtrlPad);
+ }
+ LLButton::Params normal_btn_params;
if (placeholder)
{
@@ -924,7 +1034,9 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
{
if (mIsVertical)
{
- LLButton::Params p;
+ LLButton::Params& p = (mCustomIconCtrlUsed)?
+ custom_btn_params:normal_btn_params;
+
p.name(std::string("vert tab button"));
p.rect(btn_rect);
p.follows.flags(FOLLOWS_TOP | FOLLOWS_LEFT);
@@ -942,11 +1054,22 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
{
p.pad_left(indent);
}
- btn = LLUICtrlFactory::create<LLButton>(p);
+
+
+ if(mCustomIconCtrlUsed)
+ {
+ btn = LLUICtrlFactory::create<LLCustomButtonIconCtrl>(custom_btn_params);
+
+ }
+ else
+ {
+ btn = LLUICtrlFactory::create<LLButton>(p);
+ }
}
else
{
- LLButton::Params p;
+ LLButton::Params& p = (mCustomIconCtrlUsed)?
+ custom_btn_params:normal_btn_params;
p.name(std::string(child->getName()) + " tab");
p.rect(btn_rect);
p.click_callback.function(boost::bind(&LLTabContainer::onTabBtn, this, _2, child));
@@ -980,7 +1103,14 @@ void LLTabContainer::addTabPanel(const TabPanelParams& panel)
p.follows.flags = p.follows.flags() | FOLLOWS_BOTTOM;
}
-++ btn = LLUICtrlFactory::create<LLButton>(p);
+ if(mCustomIconCtrlUsed)
+ {
+ btn = LLUICtrlFactory::create<LLCustomButtonIconCtrl>(custom_btn_params);
+ }
+ else
+ {
+ btn = LLUICtrlFactory::create<LLButton>(p);
+ }
}
}
@@ -1373,8 +1503,8 @@ BOOL LLTabContainer::setTab(S32 which)
{
LLTabTuple* tuple = *iter;
BOOL is_selected = ( tuple == selected_tuple );
- tuple->mButton->setUseEllipses(TRUE);
- tuple->mButton->setHAlign(LLFontGL::LEFT);
+ tuple->mButton->setUseEllipses(mUseTabEllipses);
+ tuple->mButton->setHAlign(mFontHalign);
tuple->mTabPanel->setVisible( is_selected );
// tuple->mTabPanel->setFocus(is_selected); // not clear that we want to do this here.
tuple->mButton->setToggleState( is_selected );
@@ -1484,7 +1614,7 @@ void LLTabContainer::setTabImage(LLPanel* child, std::string image_name, const L
if( tuple )
{
tuple->mButton->setImageOverlay(image_name, LLFontGL::LEFT, color);
- reshape_tuple(tuple);
+ reshapeTuple(tuple);
}
}
@@ -1494,31 +1624,48 @@ void LLTabContainer::setTabImage(LLPanel* child, const LLUUID& image_id, const L
if( tuple )
{
tuple->mButton->setImageOverlay(image_id, LLFontGL::LEFT, color);
- reshape_tuple(tuple);
+ reshapeTuple(tuple);
}
}
-void LLTabContainer::reshape_tuple(LLTabTuple* tuple)
+void LLTabContainer::setTabImage(LLPanel* child, LLIconCtrl* icon)
+{
+ LLTabTuple* tuple = getTabByPanel(child);
+ LLCustomButtonIconCtrl* button;
+
+ if(tuple)
+ {
+ button = dynamic_cast<LLCustomButtonIconCtrl*>(tuple->mButton);
+ if(button)
+ {
+ button->setIcon(icon);
+ reshapeTuple(tuple);
+ }
+ }
+}
+
+void LLTabContainer::reshapeTuple(LLTabTuple* tuple)
{
static LLUICachedControl<S32> tab_padding ("UITabPadding", 0);
- static LLUICachedControl<S32> image_left_padding ("UIButtonImageLeftPadding", 4);
- static LLUICachedControl<S32> image_right_padding ("UIButtonImageRightPadding", 4);
- static LLUICachedControl<S32> image_top_padding ("UIButtonImageTopPadding", 2);
- static LLUICachedControl<S32> image_bottom_padding ("UIButtonImageBottomPadding", 2);
if (!mIsVertical)
{
- tuple->mButton->setImageOverlayLeftPad(image_left_padding);
- tuple->mButton->setImageOverlayRightPad(image_right_padding);
- tuple->mButton->setImageOverlayTopPad(image_top_padding);
- tuple->mButton->setImageOverlayBottomPad(image_bottom_padding);
+ S32 image_overlay_width = 0;
+ if(mCustomIconCtrlUsed)
+ {
+ LLCustomButtonIconCtrl* button = dynamic_cast<LLCustomButtonIconCtrl*>(tuple->mButton);
+ LLIconCtrl* icon_ctrl = button ? button->getIconCtrl() : NULL;
+ image_overlay_width = icon_ctrl ? icon_ctrl->getRect().getWidth() : 0;
+ }
+ else
+ {
+ image_overlay_width = tuple->mButton->getImageOverlay().notNull() ?
+ tuple->mButton->getImageOverlay()->getImage()->getWidth(0) : 0;
+ }
// remove current width from total tab strip width
mTotalTabWidth -= tuple->mButton->getRect().getWidth();
- S32 image_overlay_width = tuple->mButton->getImageOverlay().notNull() ?
- tuple->mButton->getImageOverlay()->getImage()->getWidth(0) : 0;
-
tuple->mPadding = image_overlay_width;
tuple->mButton->reshape(llclamp(mFont->getWidth(tuple->mButton->getLabelSelected()) + tab_padding + tuple->mPadding, mMinTabWidth, mMaxTabWidth),
diff --git a/indra/llui/lltabcontainer.h b/indra/llui/lltabcontainer.h
index 2a55877d3c..a2dc15aaf9 100644
--- a/indra/llui/lltabcontainer.h
+++ b/indra/llui/lltabcontainer.h
@@ -36,6 +36,8 @@
#include "llpanel.h"
#include "lltextbox.h"
#include "llframetimer.h"
+#include "lliconctrl.h"
+#include "llbutton.h"
class LLTabTuple;
@@ -65,10 +67,13 @@ public:
{
Optional<LLUIImage*> tab_top_image_unselected,
tab_top_image_selected,
+ tab_top_image_flash,
tab_bottom_image_unselected,
tab_bottom_image_selected,
+ tab_bottom_image_flash,
tab_left_image_unselected,
- tab_left_image_selected;
+ tab_left_image_selected,
+ tab_left_image_flash;
TabParams();
};
@@ -90,6 +95,26 @@ public:
middle_tab,
last_tab;
+ /**
+ * Tab label horizontal alignment
+ */
+ Optional<LLFontGL::HAlign> font_halign;
+
+ /**
+ * Tab label ellipses
+ */
+ Optional<bool> use_ellipses;
+
+ /**
+ * Use LLCustomButtonIconCtrl or LLButton in LLTabTuple
+ */
+ Optional<bool> use_custom_icon_ctrl;
+
+ /**
+ * Paddings for LLIconCtrl in case of LLCustomButtonIconCtrl usage(use_custom_icon_ctrl = true)
+ */
+ Optional<S32> tab_icon_ctrl_pad;
+
Params();
};
@@ -173,6 +198,7 @@ public:
void setTabPanelFlashing(LLPanel* child, BOOL state);
void setTabImage(LLPanel* child, std::string img_name, const LLColor4& color = LLColor4::white);
void setTabImage(LLPanel* child, const LLUUID& img_id, const LLColor4& color = LLColor4::white);
+ void setTabImage(LLPanel* child, LLIconCtrl* icon);
void setTitle( const std::string& title );
const std::string getPanelTitle(S32 index);
@@ -228,7 +254,7 @@ private:
// updates tab button images given the tuple, tab position and the corresponding params
void update_images(LLTabTuple* tuple, TabParams params, LLTabContainer::TabPosition pos);
- void reshape_tuple(LLTabTuple* tuple);
+ void reshapeTuple(LLTabTuple* tuple);
// Variables
@@ -278,6 +304,10 @@ private:
TabParams mFirstTabParams;
TabParams mMiddleTabParams;
TabParams mLastTabParams;
+
+ bool mCustomIconCtrlUsed;
+ S32 mTabIconCtrlPad;
+ bool mUseTabEllipses;
};
#endif // LL_TABCONTAINER_H
diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp
index 2b1e2b8226..2d0d5c12cb 100644
--- a/indra/llui/lltextbase.cpp
+++ b/indra/llui/lltextbase.cpp
@@ -152,6 +152,7 @@ LLTextBase::Params::Params()
bg_writeable_color("bg_writeable_color"),
bg_focus_color("bg_focus_color"),
allow_scroll("allow_scroll", true),
+ plain_text("plain_text",false),
track_end("track_end", false),
read_only("read_only", false),
v_pad("v_pad", 0),
@@ -200,6 +201,7 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)
mSelectionStart( 0 ),
mSelectionEnd( 0 ),
mIsSelecting( FALSE ),
+ mPlainText ( p.plain_text ),
mWordWrap(p.wrap),
mUseEllipses( p.use_ellipses ),
mParseHTML(p.allow_html),
@@ -246,7 +248,7 @@ LLTextBase::~LLTextBase()
{
// Menu, like any other LLUICtrl, is deleted by its parent - gMenuHolder
- clearSegments();
+ mSegments.clear();
}
void LLTextBase::initFromParams(const LLTextBase::Params& p)
@@ -350,6 +352,8 @@ void LLTextBase::drawSelectionBackground()
S32 segment_line_start = segmentp->getStart() + segment_offset;
S32 segment_line_end = llmin(segmentp->getEnd(), line_iter->mDocIndexEnd);
+ if (segment_line_start > segment_line_end) break;
+
S32 segment_width = 0;
S32 segment_height = 0;
@@ -361,8 +365,11 @@ void LLTextBase::drawSelectionBackground()
selection_rect.mLeft += segment_width;
}
- // if selection spans end of current segment...
- if (selection_right > segment_line_end)
+ // if selection_right == segment_line_end then that means we are the first character of the next segment
+ // or first character of the next line, in either case we want to add the length of the current segment
+ // to the selection rectangle and continue.
+ // if selection right > segment_line_end then selection spans end of current segment...
+ if (selection_right >= segment_line_end)
{
// extend selection slightly beyond end of line
// to indicate selection of newline character (use "n" character to determine width)
@@ -957,8 +964,20 @@ void LLTextBase::reshape(S32 width, S32 height, BOOL called_from_parent)
{
if (width != getRect().getWidth() || height != getRect().getHeight())
{
+ bool scrolled_to_bottom = mScroller ? mScroller->isAtBottom() : false;
+
LLUICtrl::reshape( width, height, called_from_parent );
+ if (mScroller && scrolled_to_bottom && mTrackEnd)
+ {
+ // keep bottom of text buffer visible
+ // do this here as well as in reflow to handle case
+ // where shrinking from top, which causes buffer to temporarily
+ // not be scrolled to the bottom, since the scroll index
+ // specified the _top_ of the visible document region
+ mScroller->goToBottom();
+ }
+
// do this first after reshape, because other things depend on
// up-to-date mVisibleTextRect
updateRects();
@@ -1043,6 +1062,13 @@ void LLTextBase::setValue(const LLSD& value )
}
//virtual
+BOOL LLTextBase::canDeselect() const
+{
+ return hasSelection();
+}
+
+
+//virtual
void LLTextBase::deselect()
{
mSelectionStart = 0;
@@ -1077,7 +1103,7 @@ S32 LLTextBase::getLeftOffset(S32 width)
case LLFontGL::LEFT:
return mHPad;
case LLFontGL::HCENTER:
- return mHPad + (mVisibleTextRect.getWidth() - width - mHPad) / 2;
+ return mHPad + llmax(0, (mVisibleTextRect.getWidth() - width - mHPad) / 2);
case LLFontGL::RIGHT:
return mVisibleTextRect.getWidth() - width;
default:
@@ -1093,33 +1119,54 @@ void LLTextBase::reflow()
updateSegments();
- while(mReflowIndex < S32_MAX)
+ if (mReflowIndex == S32_MAX)
{
- S32 start_index = mReflowIndex;
- mReflowIndex = S32_MAX;
+ return;
+ }
- // shrink document to minimum size (visible portion of text widget)
- // to force inlined widgets with follows set to shrink
- mDocumentView->reshape(mVisibleTextRect.getWidth(), mDocumentView->getRect().getHeight());
+ bool scrolled_to_bottom = mScroller ? mScroller->isAtBottom() : false;
- bool scrolled_to_bottom = mScroller ? mScroller->isAtBottom() : false;
+ LLRect cursor_rect = getLocalRectFromDocIndex(mCursorPos);
+ bool follow_selection = getLocalRect().overlaps(cursor_rect); // cursor is (potentially) visible
+
+ // store in top-left relative coordinates to avoid issues with horizontal scrollbar appearing and disappearing
+ cursor_rect.mTop = mVisibleTextRect.mTop - cursor_rect.mTop;
+ cursor_rect.mBottom = mVisibleTextRect.mTop - cursor_rect.mBottom;
- LLRect old_cursor_rect = getLocalRectFromDocIndex(mCursorPos);
- bool follow_selection = mVisibleTextRect.overlaps(old_cursor_rect); // cursor is visible
- old_cursor_rect.translate(-mVisibleTextRect.mLeft, -mVisibleTextRect.mBottom);
+ S32 first_line = getFirstVisibleLine();
- S32 first_line = getFirstVisibleLine();
+ // if scroll anchor not on first line, update it to first character of first line
+ if (!mLineInfoList.empty()
+ && (mScrollIndex < mLineInfoList[first_line].mDocIndexStart
+ || mScrollIndex >= mLineInfoList[first_line].mDocIndexEnd))
+ {
+ mScrollIndex = mLineInfoList[first_line].mDocIndexStart;
+ }
+ LLRect first_char_rect = getLocalRectFromDocIndex(mScrollIndex);
+ // store in top-left relative coordinates to avoid issues with horizontal scrollbar appearing and disappearing
+ first_char_rect.mTop = mVisibleTextRect.mTop - first_char_rect.mTop;
+ first_char_rect.mBottom = mVisibleTextRect.mTop - first_char_rect.mBottom;
- // if scroll anchor not on first line, update it to first character of first line
- if (!mLineInfoList.empty()
- && (mScrollIndex < mLineInfoList[first_line].mDocIndexStart
- || mScrollIndex >= mLineInfoList[first_line].mDocIndexEnd))
+ S32 reflow_count = 0;
+ while(mReflowIndex < S32_MAX)
+ {
+ // we can get into an infinite loop if the document height does not monotonically increase
+ // with decreasing width (embedded ui elements with alternate layouts). In that case,
+ // we want to stop reflowing after 2 iterations. We use 2, since we need to handle the case
+ // of introducing a vertical scrollbar causing a reflow with less width. We should also always
+ // use an even number of iterations to avoid user visible oscillation of the layout
+ if(++reflow_count > 2)
{
- mScrollIndex = mLineInfoList[first_line].mDocIndexStart;
+ lldebugs << "Breaking out of reflow due to possible infinite loop in " << getName() << llendl;
+ break;
}
- LLRect first_char_rect = getLocalRectFromDocIndex(mScrollIndex);
- // subtract off effect of horizontal scrollbar from local position of first char
- first_char_rect.translate(-mVisibleTextRect.mLeft, -mVisibleTextRect.mBottom);
+
+ S32 start_index = mReflowIndex;
+ mReflowIndex = S32_MAX;
+
+ // shrink document to minimum size (visible portion of text widget)
+ // to force inlined widgets with follows set to shrink
+ mDocumentView->reshape(mVisibleTextRect.getWidth(), mDocumentView->getRect().getHeight());
S32 cur_top = 0;
@@ -1137,6 +1184,7 @@ void LLTextBase::reflow()
line_list_t::iterator iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), start_index, line_end_compare());
line_start_index = iter->mDocIndexStart;
line_count = iter->mLineNum;
+ cur_top = iter->mRect.mTop;
getSegmentAndOffset(iter->mDocIndexStart, &seg_iter, &seg_offset);
mLineInfoList.erase(iter, mLineInfoList.end());
}
@@ -1161,11 +1209,6 @@ void LLTextBase::reflow()
// grow line height as necessary based on reported height of this segment
line_height = llmax(line_height, segment_height);
remaining_pixels -= segment_width;
- if (remaining_pixels < 0)
- {
- // getNumChars() and getDimensions() should return consistent results
- remaining_pixels = 0;
- }
seg_offset += character_count;
@@ -1240,32 +1283,42 @@ void LLTextBase::reflow()
segmentp->updateLayout(*this);
}
+ }
- // apply scroll constraints after reflowing text
- if (!hasMouseCapture() && mScroller)
+ // apply scroll constraints after reflowing text
+ if (!hasMouseCapture() && mScroller)
+ {
+ if (scrolled_to_bottom && mTrackEnd)
{
- if (scrolled_to_bottom && mTrackEnd)
- {
- // keep bottom of text buffer visible
- endOfDoc();
- }
- else if (hasSelection() && follow_selection)
- {
- // keep cursor in same vertical position on screen when selecting text
- LLRect new_cursor_rect_doc = getDocRectFromDocIndex(mCursorPos);
- mScroller->scrollToShowRect(new_cursor_rect_doc, old_cursor_rect);
- }
- else
- {
- // keep first line of text visible
- LLRect new_first_char_rect = getDocRectFromDocIndex(mScrollIndex);
- mScroller->scrollToShowRect(new_first_char_rect, first_char_rect);
- }
+ // keep bottom of text buffer visible
+ endOfDoc();
}
+ else if (hasSelection() && follow_selection)
+ {
+ // keep cursor in same vertical position on screen when selecting text
+ LLRect new_cursor_rect_doc = getDocRectFromDocIndex(mCursorPos);
+ LLRect old_cursor_rect = cursor_rect;
+ old_cursor_rect.mTop = mVisibleTextRect.mTop - cursor_rect.mTop;
+ old_cursor_rect.mBottom = mVisibleTextRect.mTop - cursor_rect.mBottom;
- // reset desired x cursor position
- updateCursorXPos();
+ mScroller->scrollToShowRect(new_cursor_rect_doc, old_cursor_rect);
+ }
+ else
+ {
+ // keep first line of text visible
+ LLRect new_first_char_rect = getDocRectFromDocIndex(mScrollIndex);
+
+ // pass in desired rect in the coordinate frame of the document viewport
+ LLRect old_first_char_rect = first_char_rect;
+ old_first_char_rect.mTop = mVisibleTextRect.mTop - first_char_rect.mTop;
+ old_first_char_rect.mBottom = mVisibleTextRect.mTop - first_char_rect.mBottom;
+
+ mScroller->scrollToShowRect(new_first_char_rect, old_first_char_rect);
+ }
}
+
+ // reset desired x cursor position
+ updateCursorXPos();
}
LLRect LLTextBase::getTextBoundingRect()
@@ -1444,10 +1497,10 @@ LLTextBase::segment_set_t::const_iterator LLTextBase::getSegIterContaining(S32 i
}
// Finds the text segment (if any) at the give local screen position
-LLTextSegmentPtr LLTextBase::getSegmentAtLocalPos( S32 x, S32 y )
+LLTextSegmentPtr LLTextBase::getSegmentAtLocalPos( S32 x, S32 y, bool hit_past_end_of_line)
{
// Find the cursor position at the requested local screen position
- S32 offset = getDocIndexFromLocalCoord( x, y, FALSE );
+ S32 offset = getDocIndexFromLocalCoord( x, y, FALSE, hit_past_end_of_line);
segment_set_t::iterator seg_iter = getSegIterContaining(offset);
if (seg_iter != mSegments.end())
{
@@ -1483,6 +1536,7 @@ void LLTextBase::createUrlContextMenu(S32 x, S32 y, const std::string &in_url)
registrar.add("Url.OpenExternal", boost::bind(&LLUrlAction::openURLExternal, url));
registrar.add("Url.Execute", boost::bind(&LLUrlAction::executeSLURL, url));
registrar.add("Url.Teleport", boost::bind(&LLUrlAction::teleportToLocation, url));
+ registrar.add("Url.ShowProfile", boost::bind(&LLUrlAction::showProfile, url));
registrar.add("Url.ShowOnMap", boost::bind(&LLUrlAction::showLocationOnMap, url));
registrar.add("Url.CopyLabel", boost::bind(&LLUrlAction::copyLabelToClipboard, url));
registrar.add("Url.CopyUrl", boost::bind(&LLUrlAction::copyURLToClipboard, url));
@@ -1526,7 +1580,7 @@ std::string LLTextBase::getText() const
return getViewModel()->getValue().asString();
}
-void LLTextBase::appendText(const std::string &new_text, bool prepend_newline, const LLStyle::Params& input_params)
+void LLTextBase::appendTextImpl(const std::string &new_text, const LLStyle::Params& input_params)
{
LLStyle::Params style_params(input_params);
style_params.fillFrom(getDefaultStyleParams());
@@ -1562,8 +1616,7 @@ void LLTextBase::appendText(const std::string &new_text, bool prepend_newline, c
part = (S32)LLTextParser::MIDDLE;
}
std::string subtext=text.substr(0,start);
- appendAndHighlightText(subtext, prepend_newline, part, style_params);
- prepend_newline = false;
+ appendAndHighlightText(subtext, part, style_params);
}
// output an optional icon before the Url
@@ -1574,20 +1627,21 @@ void LLTextBase::appendText(const std::string &new_text, bool prepend_newline, c
{
LLStyle::Params icon;
icon.image = image;
- // HACK: fix spacing of images and remove the fixed char spacing
- appendAndHighlightText(" ", prepend_newline, part, icon);
- prepend_newline = false;
+ // Text will be replaced during rendering with the icon,
+ // but string cannot be empty or the segment won't be
+ // added (or drawn).
+ appendImageSegment(part, icon);
}
}
// output the styled Url (unless we've been asked to suppress hyperlinking)
if (match.isLinkDisabled())
{
- appendAndHighlightText(match.getLabel(), prepend_newline, part, style_params);
+ appendAndHighlightText(match.getLabel(), part, style_params);
}
else
{
- appendAndHighlightText(match.getLabel(), prepend_newline, part, link_params);
+ appendAndHighlightText(match.getLabel(), part, link_params);
// set the tooltip for the Url label
if (! match.getTooltip().empty())
@@ -1600,8 +1654,6 @@ void LLTextBase::appendText(const std::string &new_text, bool prepend_newline, c
}
}
}
- prepend_newline = false;
-
// move on to the rest of the text after the Url
if (end < (S32)text.length())
{
@@ -1614,25 +1666,59 @@ void LLTextBase::appendText(const std::string &new_text, bool prepend_newline, c
break;
}
}
- if (part != (S32)LLTextParser::WHOLE) part=(S32)LLTextParser::END;
- if (end < (S32)text.length()) appendAndHighlightText(text, prepend_newline, part, style_params);
+ if (part != (S32)LLTextParser::WHOLE)
+ part=(S32)LLTextParser::END;
+ if (end < (S32)text.length())
+ appendAndHighlightText(text, part, style_params);
}
else
{
- appendAndHighlightText(new_text, prepend_newline, part, style_params);
+ appendAndHighlightText(new_text, part, style_params);
}
}
+void LLTextBase::appendText(const std::string &new_text, bool prepend_newline, const LLStyle::Params& input_params)
+{
+ if (new_text.empty())
+ return;
+
+ if(prepend_newline)
+ appendLineBreakSegment(input_params);
+ appendTextImpl(new_text,input_params);
+}
+
void LLTextBase::needsReflow(S32 index)
{
lldebugs << "reflow on object " << (void*)this << " index = " << mReflowIndex << ", new index = " << index << llendl;
mReflowIndex = llmin(mReflowIndex, index);
}
-void LLTextBase::appendAndHighlightText(const std::string &new_text, bool prepend_newline, S32 highlight_part, const LLStyle::Params& style_params)
+void LLTextBase::appendLineBreakSegment(const LLStyle::Params& style_params)
+{
+ segment_vec_t segments;
+ LLStyleConstSP sp(new LLStyle(style_params));
+ segments.push_back(new LLLineBreakTextSegment(sp, getLength()));
+
+ insertStringNoUndo(getLength(), utf8str_to_wstring("\n"), &segments);
+}
+
+void LLTextBase::appendImageSegment(S32 highlight_part, const LLStyle::Params& style_params)
{
- if (new_text.empty()) return;
+ if(getPlainText())
+ {
+ return;
+ }
+ segment_vec_t segments;
+ LLStyleConstSP sp(new LLStyle(style_params));
+ segments.push_back(new LLImageTextSegment(sp, getLength(),*this));
+
+ insertStringNoUndo(getLength(), utf8str_to_wstring(" "), &segments);
+}
+
+
+void LLTextBase::appendAndHighlightTextImpl(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params)
+{
// Save old state
S32 selection_start = mSelectionStart;
S32 selection_end = mSelectionEnd;
@@ -1645,13 +1731,11 @@ void LLTextBase::appendAndHighlightText(const std::string &new_text, bool prepen
setCursorPos(old_length);
- LLTextParser* highlight = LLTextParser::getInstance();
-
- if (mParseHighlights && highlight)
+ if (mParseHighlights)
{
LLStyle::Params highlight_params(style_params);
- LLSD pieces = highlight->parsePartialLineHighlights(new_text, highlight_params.color(), (LLTextParser::EHighlightPosition)highlight_part);
+ LLSD pieces = LLTextParser::instance().parsePartialLineHighlights(new_text, highlight_params.color(), (LLTextParser::EHighlightPosition)highlight_part);
for (S32 i = 0; i < pieces.size(); i++)
{
LLSD color_llsd = pieces[i]["color"];
@@ -1660,14 +1744,8 @@ void LLTextBase::appendAndHighlightText(const std::string &new_text, bool prepen
highlight_params.color = lcolor;
LLWString wide_text;
- if (prepend_newline && (i == 0 || pieces.size() <= 1 ))
- {
- wide_text = utf8str_to_wstring(std::string("\n") + pieces[i]["text"].asString());
- }
- else
- {
- wide_text = utf8str_to_wstring(pieces[i]["text"].asString());
- }
+ wide_text = utf8str_to_wstring(pieces[i]["text"].asString());
+
S32 cur_length = getLength();
LLStyleConstSP sp(new LLStyle(highlight_params));
LLTextSegmentPtr segmentp = new LLNormalTextSegment(sp, cur_length, cur_length + wide_text.size(), *this);
@@ -1679,17 +1757,7 @@ void LLTextBase::appendAndHighlightText(const std::string &new_text, bool prepen
else
{
LLWString wide_text;
-
- // Add carriage return if not first line
- if (getLength() != 0
- && prepend_newline)
- {
- wide_text = utf8str_to_wstring(std::string("\n") + new_text);
- }
- else
- {
- wide_text = utf8str_to_wstring(new_text);
- }
+ wide_text = utf8str_to_wstring(new_text);
segment_vec_t segments;
S32 segment_start = old_length;
@@ -1717,11 +1785,29 @@ void LLTextBase::appendAndHighlightText(const std::string &new_text, bool prepen
{
setCursorPos(cursor_pos);
}
+}
+
+void LLTextBase::appendAndHighlightText(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params)
+{
+ if (new_text.empty()) return;
+
+ std::string::size_type start = 0;
+ std::string::size_type pos = new_text.find("\n",start);
+
+ while(pos!=-1)
+ {
+ if(pos!=start)
+ {
+ std::string str = std::string(new_text,start,pos-start);
+ appendAndHighlightTextImpl(str,highlight_part, style_params);
+ }
+ appendLineBreakSegment(style_params);
+ start = pos+1;
+ pos = new_text.find("\n",start);
+ }
- //if( !allow_undo )
- //{
- // blockUndo();
- //}
+ std::string str = std::string(new_text,start,new_text.length()-start);
+ appendAndHighlightTextImpl(str,highlight_part, style_params);
}
@@ -1785,11 +1871,11 @@ const LLWString& LLTextBase::getWText() const
// will be put to its right. If round is false, the cursor will always be put to the
// character's left.
-S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round ) const
+S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round, bool hit_past_end_of_line) const
{
// Figure out which line we're nearest to.
LLRect visible_region = getVisibleDocumentRect();
-
+
// binary search for line that starts before local_y
line_list_t::const_iterator line_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), local_y - mVisibleTextRect.mBottom + visible_region.mBottom, compare_bottom());
@@ -1799,7 +1885,7 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round
}
S32 pos = getLength();
- S32 start_x = mVisibleTextRect.mLeft + line_iter->mRect.mLeft;
+ S32 start_x = mVisibleTextRect.mLeft + line_iter->mRect.mLeft - visible_region.mLeft;
segment_set_t::iterator line_seg_iter;
S32 line_seg_offset;
@@ -1810,11 +1896,23 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round
const LLTextSegmentPtr segmentp = *line_seg_iter;
S32 segment_line_start = segmentp->getStart() + line_seg_offset;
- S32 segment_line_length = llmin(segmentp->getEnd(), line_iter->mDocIndexEnd - 1) - segment_line_start;
+ S32 segment_line_length = llmin(segmentp->getEnd(), line_iter->mDocIndexEnd) - segment_line_start;
S32 text_width, text_height;
- segmentp->getDimensions(line_seg_offset, segment_line_length, text_width, text_height);
- if (local_x < start_x + text_width // cursor to left of right edge of text
- || segmentp->getEnd() >= line_iter->mDocIndexEnd - 1) // or this segment wraps to next line
+ bool newline = segmentp->getDimensions(line_seg_offset, segment_line_length, text_width, text_height);
+
+ if(newline)
+ {
+ pos = segment_line_start + segmentp->getOffset(local_x - start_x, line_seg_offset, segment_line_length, round);
+ break;
+ }
+
+ // if we've reached a line of text *below* the mouse cursor, doc index is first character on that line
+ if (hit_past_end_of_line && local_y - mVisibleTextRect.mBottom + visible_region.mBottom > line_iter->mRect.mTop)
+ {
+ pos = segment_line_start;
+ break;
+ }
+ if (local_x < start_x + text_width) // cursor to left of right edge of text
{
// Figure out which character we're nearest to.
S32 offset;
@@ -1838,6 +1936,13 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round
pos = segment_line_start + offset;
break;
}
+ else if (hit_past_end_of_line && segmentp->getEnd() > line_iter->mDocIndexEnd - 1)
+ {
+ // segment wraps to next line, so just set doc pos to the end of the line
+ // segment wraps to next line, so just set doc pos to start of next line (represented by mDocIndexEnd)
+ pos = llmin(getLength(), line_iter->mDocIndexEnd);
+ break;
+ }
start_x += text_width;
}
@@ -1906,11 +2011,18 @@ LLRect LLTextBase::getDocRectFromDocIndex(S32 pos) const
LLRect LLTextBase::getLocalRectFromDocIndex(S32 pos) const
{
+ LLRect content_window_rect = mScroller ? mScroller->getContentWindowRect() : getLocalRect();
+ if (mBorderVisible)
+ {
+ content_window_rect.stretch(-1);
+ }
+
LLRect local_rect;
+
if (mLineInfoList.empty())
{
// return default height rect in upper left
- local_rect = mVisibleTextRect;
+ local_rect = content_window_rect;
local_rect.mBottom = local_rect.mTop - (S32)(mDefaultFont->getLineHeight());
return local_rect;
}
@@ -1921,8 +2033,8 @@ LLRect LLTextBase::getLocalRectFromDocIndex(S32 pos) const
// compensate for scrolled, inset view of doc
LLRect scrolled_view_rect = getVisibleDocumentRect();
local_rect = doc_rect;
- local_rect.translate(mVisibleTextRect.mLeft - scrolled_view_rect.mLeft,
- mVisibleTextRect.mBottom - scrolled_view_rect.mBottom);
+ local_rect.translate(content_window_rect.mLeft - scrolled_view_rect.mLeft,
+ content_window_rect.mBottom - scrolled_view_rect.mBottom);
return local_rect;
}
@@ -2294,18 +2406,6 @@ F32 LLNormalTextSegment::draw(S32 start, S32 end, S32 selection_start, S32 selec
{
if( end - start > 0 )
{
- if ( mStyle->isImage() && (start >= 0) && (end <= mEnd - mStart))
- {
- LLColor4 color = LLColor4::white % mEditor.getDrawContext().mAlpha;
- LLUIImagePtr image = mStyle->getImage();
- S32 style_image_height = image->getHeight();
- S32 style_image_width = image->getWidth();
- // Center the image vertically
- S32 image_bottom = draw_rect.getCenterY() - (style_image_height/2);
- image->draw(draw_rect.mLeft, image_bottom,
- style_image_width, style_image_height, color);
- }
-
return drawClippedSegment( getStart() + start, getStart() + end, selection_start, selection_end, draw_rect);
}
return draw_rect.mLeft;
@@ -2318,11 +2418,6 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele
const LLWString &text = mEditor.getWText();
- if ( text[seg_end-1] == '\n' )
- {
- --seg_end;
- }
-
F32 right_x = rect.mLeft;
if (!mStyle->isVisible())
{
@@ -2392,8 +2487,12 @@ BOOL LLNormalTextSegment::handleHover(S32 x, S32 y, MASK mask)
{
if (getStyle() && getStyle()->isLink())
{
- LLUI::getWindow()->setCursor(UI_CURSOR_HAND);
- return TRUE;
+ // Only process the click if it's actually in this segment, not to the right of the end-of-line.
+ if(mEditor.getSegmentAtLocalPos(x, y, false) == this)
+ {
+ LLUI::getWindow()->setCursor(UI_CURSOR_HAND);
+ return TRUE;
+ }
}
return FALSE;
}
@@ -2402,8 +2501,12 @@ BOOL LLNormalTextSegment::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
if (getStyle() && getStyle()->isLink())
{
- mEditor.createUrlContextMenu(x, y, getStyle()->getLinkHREF());
- return TRUE;
+ // Only process the click if it's actually in this segment, not to the right of the end-of-line.
+ if(mEditor.getSegmentAtLocalPos(x, y, false) == this)
+ {
+ mEditor.createUrlContextMenu(x, y, getStyle()->getLinkHREF());
+ return TRUE;
+ }
}
return FALSE;
}
@@ -2412,8 +2515,12 @@ BOOL LLNormalTextSegment::handleMouseDown(S32 x, S32 y, MASK mask)
{
if (getStyle() && getStyle()->isLink())
{
- // eat mouse down event on hyperlinks, so we get the mouse up
- return TRUE;
+ // Only process the click if it's actually in this segment, not to the right of the end-of-line.
+ if(mEditor.getSegmentAtLocalPos(x, y, false) == this)
+ {
+ // eat mouse down event on hyperlinks, so we get the mouse up
+ return TRUE;
+ }
}
return FALSE;
@@ -2423,8 +2530,12 @@ BOOL LLNormalTextSegment::handleMouseUp(S32 x, S32 y, MASK mask)
{
if (getStyle() && getStyle()->isLink())
{
- LLUrlAction::clickAction(getStyle()->getLinkHREF());
- return TRUE;
+ // Only process the click if it's actually in this segment, not to the right of the end-of-line.
+ if(mEditor.getSegmentAtLocalPos(x, y, false) == this)
+ {
+ LLUrlAction::clickAction(getStyle()->getLinkHREF());
+ return TRUE;
+ }
}
return FALSE;
@@ -2465,33 +2576,14 @@ bool LLNormalTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& widt
{
height = 0;
width = 0;
- bool force_newline = false;
if (num_chars > 0)
{
height = mFontHeight;
const LLWString &text = mEditor.getWText();
// if last character is a newline, then return true, forcing line break
- llwchar last_char = text[mStart + first_char + num_chars - 1];
- if (last_char == '\n')
- {
- force_newline = true;
- // don't count newline in font width
- width = mStyle->getFont()->getWidth(text.c_str(), mStart + first_char, num_chars - 1);
- }
- else
- {
- width = mStyle->getFont()->getWidth(text.c_str(), mStart + first_char, num_chars);
- }
- }
-
- LLUIImagePtr image = mStyle->getImage();
- if( image.notNull())
- {
- width += image->getWidth();
- height = llmax(height, image->getHeight());
+ width = mStyle->getFont()->getWidth(text.c_str(), mStart + first_char, num_chars);
}
-
- return force_newline;
+ return false;
}
S32 LLNormalTextSegment::getOffset(S32 segment_local_x_coord, S32 start_offset, S32 num_chars, bool round) const
@@ -2514,15 +2606,7 @@ S32 LLNormalTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 lin
num_pixels = llmax(0, num_pixels - image->getWidth());
}
- // search for newline and if found, truncate there
- S32 last_char = mStart + segment_offset;
- for (; last_char != mEnd; ++last_char)
- {
- if (text[last_char] == '\n')
- {
- break;
- }
- }
+ S32 last_char = mEnd;
// set max characters to length of segment, or to first newline
max_chars = llmin(max_chars, last_char - (mStart + segment_offset));
@@ -2550,8 +2634,7 @@ S32 LLNormalTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 lin
S32 last_char_in_run = mStart + segment_offset + num_chars;
// check length first to avoid indexing off end of string
if (last_char_in_run < mEnd
- && (last_char_in_run >= mEditor.getLength()
- || text[last_char_in_run] == '\n'))
+ && (last_char_in_run >= mEditor.getLength() ))
{
num_chars++;
}
@@ -2646,3 +2729,93 @@ void LLInlineViewSegment::linkToDocument(LLTextBase* editor)
{
editor->addDocumentChild(mView);
}
+
+LLLineBreakTextSegment::LLLineBreakTextSegment(S32 pos):LLTextSegment(pos,pos+1)
+{
+ LLStyleSP s( new LLStyle(LLStyle::Params().visible(true)));
+
+ mFontHeight = llceil(s->getFont()->getLineHeight());
+}
+LLLineBreakTextSegment::LLLineBreakTextSegment(LLStyleConstSP style,S32 pos):LLTextSegment(pos,pos+1)
+{
+ mFontHeight = llceil(style->getFont()->getLineHeight());
+}
+LLLineBreakTextSegment::~LLLineBreakTextSegment()
+{
+}
+bool LLLineBreakTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const
+{
+ width = 0;
+ height = mFontHeight;
+
+ return true;
+}
+S32 LLLineBreakTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const
+{
+ return 1;
+}
+F32 LLLineBreakTextSegment::draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRect& draw_rect)
+{
+ return draw_rect.mLeft;
+}
+
+LLImageTextSegment::LLImageTextSegment(LLStyleConstSP style,S32 pos,class LLTextBase& editor)
+ :LLTextSegment(pos,pos+1)
+ ,mStyle( style )
+ ,mEditor(editor)
+{
+}
+
+LLImageTextSegment::~LLImageTextSegment()
+{
+}
+
+static const S32 IMAGE_HPAD = 3;
+
+bool LLImageTextSegment::getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const
+{
+ width = 0;
+ height = llceil(mStyle->getFont()->getLineHeight());;
+
+ LLUIImagePtr image = mStyle->getImage();
+ if( num_chars>0 && image.notNull())
+ {
+ width += image->getWidth() + IMAGE_HPAD;
+ height = llmax(height, image->getHeight() + IMAGE_HPAD );
+ }
+ return false;
+}
+
+S32 LLImageTextSegment::getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const
+{
+ LLUIImagePtr image = mStyle->getImage();
+ S32 image_width = image->getWidth();
+ if(line_offset == 0 || num_pixels>image_width + IMAGE_HPAD)
+ {
+ return 1;
+ }
+ return 0;
+}
+
+F32 LLImageTextSegment::draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRect& draw_rect)
+{
+ if ( (start >= 0) && (end <= mEnd - mStart))
+ {
+ LLColor4 color = LLColor4::white % mEditor.getDrawContext().mAlpha;
+ LLUIImagePtr image = mStyle->getImage();
+ S32 style_image_height = image->getHeight();
+ S32 style_image_width = image->getWidth();
+ // Text is drawn from the top of the draw_rect downward
+
+ S32 text_center = draw_rect.mTop - (draw_rect.getHeight() / 2);
+ // Align image to center of draw rect
+ S32 image_bottom = text_center - (style_image_height / 2);
+ image->draw(draw_rect.mLeft, image_bottom,
+ style_image_width, style_image_height, color);
+
+ const S32 IMAGE_HPAD = 3;
+ return draw_rect.mLeft + style_image_width + IMAGE_HPAD;
+ }
+ return 0.0;
+}
+
diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h
index 3dda6f4cc8..92876e20d6 100644
--- a/indra/llui/lltextbase.h
+++ b/indra/llui/lltextbase.h
@@ -48,6 +48,7 @@
class LLContextMenu;
class LLTextSegment;
+class LLNormalTextSegment;
typedef LLPointer<LLTextSegment> LLTextSegmentPtr;
@@ -61,6 +62,9 @@ class LLTextBase
protected LLEditMenuHandler
{
public:
+ friend class LLTextSegment;
+ friend class LLNormalTextSegment;
+
struct LineSpacingParams : public LLInitParam::Choice<LineSpacingParams>
{
Alternative<F32> multiple;
@@ -82,6 +86,7 @@ public:
track_end,
read_only,
allow_scroll,
+ plain_text,
wrap,
use_ellipses,
allow_html,
@@ -128,6 +133,7 @@ public:
/*virtual*/ LLTextViewModel* getViewModel() const;
// LLEditMenuHandler interface
+ /*virtual*/ BOOL canDeselect() const;
/*virtual*/ void deselect();
// used by LLTextSegment layout code
@@ -165,13 +171,16 @@ public:
S32 getVPad() { return mVPad; }
S32 getHPad() { return mHPad; }
- S32 getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round ) const;
+ S32 getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round, bool hit_past_end_of_line = true) const;
LLRect getLocalRectFromDocIndex(S32 pos) const;
LLRect getDocRectFromDocIndex(S32 pos) const;
void setReadOnly(bool read_only) { mReadOnly = read_only; }
bool getReadOnly() { return mReadOnly; }
+ void setPlainText(bool value) { mPlainText = value;}
+ bool getPlainText() const { return mPlainText; }
+
// cursor manipulation
bool setCursor(S32 row, S32 column);
bool setCursorPos(S32 cursor_pos, bool keep_cursor_offset = false);
@@ -269,13 +278,13 @@ protected:
S32 insertStringNoUndo(S32 pos, const LLWString &wstr, segment_vec_t* segments = NULL); // returns num of chars actually inserted
S32 removeStringNoUndo(S32 pos, S32 length);
S32 overwriteCharNoUndo(S32 pos, llwchar wc);
- void appendAndHighlightText(const std::string &new_text, bool prepend_newline, S32 highlight_part, const LLStyle::Params& stylep);
+ void appendAndHighlightText(const std::string &new_text, S32 highlight_part, const LLStyle::Params& stylep);
// manage segments
void getSegmentAndOffset( S32 startpos, segment_set_t::const_iterator* seg_iter, S32* offsetp ) const;
void getSegmentAndOffset( S32 startpos, segment_set_t::iterator* seg_iter, S32* offsetp );
- LLTextSegmentPtr getSegmentAtLocalPos( S32 x, S32 y );
+ LLTextSegmentPtr getSegmentAtLocalPos( S32 x, S32 y, bool hit_past_end_of_line = true);
segment_set_t::iterator getSegIterContaining(S32 index);
segment_set_t::const_iterator getSegIterContaining(S32 index) const;
void clearSegments();
@@ -311,6 +320,13 @@ protected:
void needsScroll() { mScrollNeeded = TRUE; }
void replaceUrlLabel(const std::string &url, const std::string &label);
+ void appendLineBreakSegment(const LLStyle::Params& style_params);
+ void appendImageSegment(S32 highlight_part, const LLStyle::Params& style_params);
+
+ void appendTextImpl(const std::string &new_text, const LLStyle::Params& input_params = LLStyle::Params());
+ void appendAndHighlightTextImpl(const std::string &new_text, S32 highlight_part, const LLStyle::Params& style_params);
+
+
protected:
// text segmentation and flow
segment_set_t mSegments;
@@ -354,6 +370,7 @@ protected:
bool mReadOnly;
bool mBGVisible; // render background?
bool mClipPartial; // false if we show lines that are partially inside bounding rect
+ bool mPlainText; // didn't use Image or Icon segments
S32 mMaxTextByteLength; // Maximum length mText is allowed to be in bytes
// support widgets
@@ -502,5 +519,33 @@ private:
bool mForceNewLine;
};
+class LLLineBreakTextSegment : public LLTextSegment
+{
+public:
+
+ LLLineBreakTextSegment(LLStyleConstSP style,S32 pos);
+ LLLineBreakTextSegment(S32 pos);
+ ~LLLineBreakTextSegment();
+ bool getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const;
+ S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const;
+ F32 draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRect& draw_rect);
+
+private:
+ S32 mFontHeight;
+};
+
+class LLImageTextSegment : public LLTextSegment
+{
+public:
+ LLImageTextSegment(LLStyleConstSP style,S32 pos,class LLTextBase& editor);
+ ~LLImageTextSegment();
+ bool getDimensions(S32 first_char, S32 num_chars, S32& width, S32& height) const;
+ S32 getNumChars(S32 num_pixels, S32 segment_offset, S32 line_offset, S32 max_chars) const;
+ F32 draw(S32 start, S32 end, S32 selection_start, S32 selection_end, const LLRect& draw_rect);
+
+private:
+ class LLTextBase& mEditor;
+ LLStyleConstSP mStyle;
+};
#endif
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index 3fdb48b3ca..c9474d66b7 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -237,13 +237,16 @@ private:
///////////////////////////////////////////////////////////////////
LLTextEditor::Params::Params()
: default_text("default_text"),
+ prevalidate_callback("prevalidate_callback"),
embedded_items("embedded_items", false),
ignore_tab("ignore_tab", true),
- handle_edit_keys_directly("handle_edit_keys_directly", false),
show_line_numbers("show_line_numbers", false),
default_color("default_color"),
- commit_on_focus_lost("commit_on_focus_lost", false)
-{}
+ commit_on_focus_lost("commit_on_focus_lost", false),
+ show_context_menu("show_context_menu")
+{
+ addSynonym(prevalidate_callback, "text_type");
+}
LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) :
LLTextBase(p),
@@ -254,11 +257,12 @@ LLTextEditor::LLTextEditor(const LLTextEditor::Params& p) :
mShowLineNumbers ( p.show_line_numbers ),
mCommitOnFocusLost( p.commit_on_focus_lost),
mAllowEmbeddedItems( p.embedded_items ),
- mHandleEditKeysDirectly( p.handle_edit_keys_directly ),
mMouseDownX(0),
mMouseDownY(0),
mTabsToNextField(p.ignore_tab),
- mContextMenu(NULL)
+ mPrevalidateFunc(p.prevalidate_callback()),
+ mContextMenu(NULL),
+ mShowContextMenu(p.show_context_menu)
{
mDefaultFont = p.font;
@@ -299,12 +303,6 @@ LLTextEditor::~LLTextEditor()
{
gFocusMgr.releaseFocusIfNeeded( this ); // calls onCommit() while LLTextEditor still valid
- // Route menu back to the default
- if( gEditMenuHandler == this )
- {
- gEditMenuHandler = NULL;
- }
-
// Scrollbar is deleted by LLView
std::for_each(mUndoStack.begin(), mUndoStack.end(), DeletePointer());
@@ -318,6 +316,17 @@ LLTextEditor::~LLTextEditor()
void LLTextEditor::setText(const LLStringExplicit &utf8str, const LLStyle::Params& input_params)
{
+ // validate incoming text if necessary
+ if (mPrevalidateFunc)
+ {
+ LLWString test_text = utf8str_to_wstring(utf8str);
+ if (!mPrevalidateFunc(test_text))
+ {
+ // not valid text, nothing to do
+ return;
+ }
+ }
+
blockUndo();
deselect();
@@ -490,21 +499,6 @@ void LLTextEditor::getSegmentsInRange(LLTextEditor::segment_vec_t& segments_out,
}
}
-// virtual
-BOOL LLTextEditor::canDeselect() const
-{
- return hasSelection();
-}
-
-
-void LLTextEditor::deselect()
-{
- mSelectionStart = 0;
- mSelectionEnd = 0;
- mIsSelecting = FALSE;
-}
-
-
BOOL LLTextEditor::selectionContainsLineBreaks()
{
if (hasSelection())
@@ -651,6 +645,7 @@ void LLTextEditor::selectAll()
mSelectionStart = getLength();
mSelectionEnd = 0;
setCursorPos(mSelectionEnd);
+ updatePrimary();
}
BOOL LLTextEditor::handleMouseDown(S32 x, S32 y, MASK mask)
@@ -718,9 +713,10 @@ BOOL LLTextEditor::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
setFocus(TRUE);
}
- if (!LLTextBase::handleRightMouseDown(x, y, mask))
+ // Prefer editor menu if it has selection. See EXT-6806.
+ if (hasSelection() || !LLTextBase::handleRightMouseDown(x, y, mask))
{
- if(getMouseOpaque())
+ if(getShowContextMenu())
{
showContextMenu(x, y);
}
@@ -909,6 +905,21 @@ S32 LLTextEditor::execute( TextCmd* cmd )
// Push the new command is now on the top (front) of the undo stack.
mUndoStack.push_front(cmd);
mLastCmd = cmd;
+
+ bool need_to_rollback = mPrevalidateFunc
+ && !mPrevalidateFunc(getViewModel()->getDisplay());
+ if (need_to_rollback)
+ {
+ // get rid of this last command and clean up undo stack
+ undo();
+
+ // remove any evidence of this command from redo history
+ mUndoStack.pop_front();
+ delete cmd;
+
+ // failure, nothing changed
+ delta = 0;
+ }
}
else
{
@@ -993,7 +1004,7 @@ void LLTextEditor::removeCharOrTab()
}
else
{
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
}
@@ -1016,7 +1027,7 @@ void LLTextEditor::removeChar()
}
else
{
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
}
@@ -1032,7 +1043,21 @@ S32 LLTextEditor::addChar(S32 pos, llwchar wc)
if (mLastCmd && mLastCmd->canExtend(pos))
{
S32 delta = 0;
+ if (mPrevalidateFunc)
+ {
+ // get a copy of current text contents
+ LLWString test_string(getViewModel()->getDisplay());
+
+ // modify text contents as if this addChar succeeded
+ llassert(pos <= (S32)test_string.size());
+ test_string.insert(pos, 1, wc);
+ if (!mPrevalidateFunc( test_string))
+ {
+ return 0;
+ }
+ }
mLastCmd->extendAndExecute(this, pos, wc, &delta);
+
return delta;
}
else
@@ -1058,6 +1083,28 @@ void LLTextEditor::addChar(llwchar wc)
setCursorPos(mCursorPos + addChar( mCursorPos, wc ));
}
+void LLTextEditor::addLineBreakChar()
+{
+ if( !getEnabled() )
+ {
+ return;
+ }
+ if( hasSelection() )
+ {
+ deleteSelection(TRUE);
+ }
+ else if (LL_KIM_OVERWRITE == gKeyboard->getInsertMode())
+ {
+ removeChar(mCursorPos);
+ }
+
+ LLStyleConstSP sp(new LLStyle(LLStyle::Params()));
+ LLTextSegmentPtr segment = new LLLineBreakTextSegment(sp, mCursorPos);
+
+ S32 pos = execute(new TextCmdAddChar(mCursorPos, FALSE, '\n', segment));
+
+ setCursorPos(mCursorPos + pos);
+}
BOOL LLTextEditor::handleSelectionKey(const KEY key, const MASK mask)
@@ -1152,22 +1199,6 @@ BOOL LLTextEditor::handleSelectionKey(const KEY key, const MASK mask)
}
}
- if( !handled && mHandleEditKeysDirectly )
- {
- if( (MASK_CONTROL & mask) && ('A' == key) )
- {
- if( canSelectAll() )
- {
- selectAll();
- }
- else
- {
- reportBadKeystroke();
- }
- handled = TRUE;
- }
- }
-
if( handled )
{
// take selection to 'primary' clipboard
@@ -1201,6 +1232,7 @@ BOOL LLTextEditor::handleNavigationKey(const KEY key, const MASK mask)
case KEY_DOWN:
changeLine( 1 );
+ deselect();
break;
case KEY_PAGE_DOWN:
@@ -1214,7 +1246,7 @@ BOOL LLTextEditor::handleNavigationKey(const KEY key, const MASK mask)
case KEY_LEFT:
if( hasSelection() )
{
- setCursorPos(llmin( mCursorPos - 1, mSelectionStart, mSelectionEnd ));
+ setCursorPos(llmin( mSelectionStart, mSelectionEnd ));
}
else
{
@@ -1224,7 +1256,7 @@ BOOL LLTextEditor::handleNavigationKey(const KEY key, const MASK mask)
}
else
{
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
}
break;
@@ -1232,7 +1264,7 @@ BOOL LLTextEditor::handleNavigationKey(const KEY key, const MASK mask)
case KEY_RIGHT:
if( hasSelection() )
{
- setCursorPos(llmax( mCursorPos + 1, mSelectionStart, mSelectionEnd ));
+ setCursorPos(llmax( mSelectionStart, mSelectionEnd ));
}
else
{
@@ -1242,7 +1274,7 @@ BOOL LLTextEditor::handleNavigationKey(const KEY key, const MASK mask)
}
else
{
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
}
break;
@@ -1253,6 +1285,11 @@ BOOL LLTextEditor::handleNavigationKey(const KEY key, const MASK mask)
}
}
+ if (handled)
+ {
+ deselect();
+ }
+
return handled;
}
@@ -1389,7 +1426,27 @@ void LLTextEditor::pasteHelper(bool is_primary)
}
// Insert the new text into the existing text.
- setCursorPos(mCursorPos + insert(mCursorPos, clean_string, FALSE, LLTextSegmentPtr()));
+
+ //paste text with linebreaks.
+ std::basic_string<llwchar>::size_type start = 0;
+ std::basic_string<llwchar>::size_type pos = clean_string.find('\n',start);
+
+ while(pos!=-1)
+ {
+ if(pos!=start)
+ {
+ std::basic_string<llwchar> str = std::basic_string<llwchar>(clean_string,start,pos-start);
+ setCursorPos(mCursorPos + insert(mCursorPos, str, FALSE, LLTextSegmentPtr()));
+ }
+ addLineBreakChar();
+
+ start = pos+1;
+ pos = clean_string.find('\n',start);
+ }
+
+ std::basic_string<llwchar> str = std::basic_string<llwchar>(clean_string,start,clean_string.length()-start);
+ setCursorPos(mCursorPos + insert(mCursorPos, str, FALSE, LLTextSegmentPtr()));
+
deselect();
onKeyStroke();
@@ -1505,75 +1562,13 @@ BOOL LLTextEditor::handleControlKey(const KEY key, const MASK mask)
return handled;
}
-BOOL LLTextEditor::handleEditKey(const KEY key, const MASK mask)
-{
- BOOL handled = FALSE;
- // Standard edit keys (Ctrl-X, Delete, etc,) are handled here instead of routed by the menu system.
- if( KEY_DELETE == key )
+BOOL LLTextEditor::handleSpecialKey(const KEY key, const MASK mask)
{
- if( canDoDelete() )
- {
- doDelete();
- }
- else
- {
- reportBadKeystroke();
- }
- handled = TRUE;
- }
- else
- if( MASK_CONTROL & mask )
- {
- if( 'C' == key )
- {
- if( canCopy() )
- {
- copy();
- }
- else
- {
- reportBadKeystroke();
- }
- handled = TRUE;
- }
- else
- if( 'V' == key )
- {
- if( canPaste() )
- {
- paste();
- }
- else
- {
- reportBadKeystroke();
- }
- handled = TRUE;
- }
- else
- if( 'X' == key )
- {
- if( canCut() )
- {
- cut();
- }
- else
- {
- reportBadKeystroke();
- }
- handled = TRUE;
- }
- }
-
- return handled;
-}
-
-
-BOOL LLTextEditor::handleSpecialKey(const KEY key, const MASK mask, BOOL* return_key_hit)
-{
- *return_key_hit = FALSE;
BOOL handled = TRUE;
+ if (mReadOnly) return FALSE;
+
switch( key )
{
case KEY_INSERT:
@@ -1595,7 +1590,7 @@ BOOL LLTextEditor::handleSpecialKey(const KEY key, const MASK mask, BOOL* return
}
else
{
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
break;
@@ -1648,6 +1643,10 @@ BOOL LLTextEditor::handleSpecialKey(const KEY key, const MASK mask, BOOL* return
break;
}
+ if (handled)
+ {
+ onKeyStroke();
+ }
return handled;
}
@@ -1668,9 +1667,6 @@ void LLTextEditor::unindentLineBeforeCloseBrace()
BOOL LLTextEditor::handleKeyHere(KEY key, MASK mask )
{
BOOL handled = FALSE;
- BOOL selection_modified = FALSE;
- BOOL return_key_hit = FALSE;
- BOOL text_may_have_changed = TRUE;
// Special case for TAB. If want to move to next field, report
// not handled and let the parent take care of field movement.
@@ -1678,116 +1674,24 @@ BOOL LLTextEditor::handleKeyHere(KEY key, MASK mask )
{
return FALSE;
}
- /*
- if (KEY_F10 == key)
- {
- LLComboBox::Params cp;
- cp.name = "combo box";
- cp.label = "my combo";
- cp.rect.width = 100;
- cp.rect.height = 20;
- cp.items.add().label = "item 1";
- cp.items.add().label = "item 2";
- cp.items.add().label = "item 3";
- appendWidget(LLUICtrlFactory::create<LLComboBox>(cp), "combo", true, false);
- }
- if (KEY_F11 == key)
- {
- LLButton::Params bp;
- bp.name = "text button";
- bp.label = "Click me";
- bp.rect.width = 100;
- bp.rect.height = 20;
-
- appendWidget(LLUICtrlFactory::create<LLButton>(bp), "button", true, false);
- }
- */
- if (mReadOnly)
+ if (mReadOnly && mScroller)
{
- if(mScroller)
- {
- handled = mScroller->handleKeyHere( key, mask );
+ handled = (mScroller && mScroller->handleKeyHere( key, mask ))
+ || handleSelectionKey(key, mask)
+ || handleControlKey(key, mask);
}
else
{
- handled = handleNavigationKey( key, mask );
- }
-
- }
- else
- {
- // handle navigation keys ourself
- handled = handleNavigationKey( key, mask );
- }
-
-
- if( handled )
- {
- text_may_have_changed = FALSE;
- }
-
- if( !handled )
- {
- handled = handleSelectionKey( key, mask );
- if( handled )
- {
- selection_modified = TRUE;
- }
- }
-
- if( !handled )
- {
- handled = handleControlKey( key, mask );
- if( handled )
- {
- selection_modified = TRUE;
- }
- }
-
- if( !handled && mHandleEditKeysDirectly )
- {
- handled = handleEditKey( key, mask );
- if( handled )
- {
- selection_modified = TRUE;
- text_may_have_changed = TRUE;
- }
- }
-
- // Handle most keys only if the text editor is writeable.
- if( !mReadOnly )
- {
- if( !handled )
- {
- handled = handleSpecialKey( key, mask, &return_key_hit );
- if( handled )
- {
- selection_modified = TRUE;
- text_may_have_changed = TRUE;
- }
- }
-
+ handled = handleNavigationKey( key, mask )
+ || handleSelectionKey(key, mask)
+ || handleControlKey(key, mask)
+ || handleSpecialKey(key, mask);
}
if( handled )
{
resetCursorBlink();
-
- // Most keystrokes will make the selection box go away, but not all will.
- if( !selection_modified &&
- KEY_SHIFT != key &&
- KEY_CONTROL != key &&
- KEY_ALT != key &&
- KEY_CAPSLOCK )
- {
- deselect();
- }
-
- if(text_may_have_changed)
- {
- onKeyStroke();
- }
needsScroll();
}
@@ -2288,7 +2192,7 @@ void LLTextEditor::getCurrentLineAndColumn( S32* line, S32* col, BOOL include_wo
void LLTextEditor::autoIndent()
{
// Count the number of spaces in the current line
- S32 line = getLineNumFromDocIndex(mCursorPos);
+ S32 line = getLineNumFromDocIndex(mCursorPos, false);
S32 line_start = getLineStart(line);
S32 space_count = 0;
S32 i;
@@ -2307,7 +2211,10 @@ void LLTextEditor::autoIndent()
}
// Insert that number of spaces on the new line
- addChar( '\n' );
+
+ //appendLineBreakSegment(LLStyle::Params());//addChar( '\n' );
+ addLineBreakChar();
+
for( i = 0; i < space_count; i++ )
{
addChar( ' ' );
@@ -2478,9 +2385,9 @@ void LLTextEditor::loadKeywords(const std::string& filename,
void LLTextEditor::updateSegments()
{
- LLFastTimer ft(FTM_SYNTAX_HIGHLIGHTING);
- if (mKeywords.isLoaded())
+ if (mReflowIndex < S32_MAX && mKeywords.isLoaded())
{
+ LLFastTimer ft(FTM_SYNTAX_HIGHLIGHTING);
// HACK: No non-ascii keywords for now
segment_vec_t segment_list;
mKeywords.findSegments(&segment_list, getWText(), mDefaultColor.get(), *this);
diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h
index a136f9ccce..7b68974fd8 100644
--- a/indra/llui/lltexteditor.h
+++ b/indra/llui/lltexteditor.h
@@ -44,6 +44,7 @@
#include "lldarray.h"
#include "llviewborder.h" // for params
#include "lltextbase.h"
+#include "lltextvalidate.h"
#include "llpreeditor.h"
#include "llcontrol.h"
@@ -63,12 +64,13 @@ public:
struct Params : public LLInitParam::Block<Params, LLTextBase::Params>
{
Optional<std::string> default_text;
+ Optional<LLTextValidate::validate_func_t, LLTextValidate::ValidateTextNamedFuncs> prevalidate_callback;
Optional<bool> embedded_items,
ignore_tab,
- handle_edit_keys_directly,
show_line_numbers,
- commit_on_focus_lost;
+ commit_on_focus_lost,
+ show_context_menu;
//colors
Optional<LLUIColor> default_color;
@@ -143,8 +145,6 @@ public:
virtual BOOL canDoDelete() const;
virtual void selectAll();
virtual BOOL canSelectAll() const;
- virtual void deselect();
- virtual BOOL canDeselect() const;
void selectNext(const std::string& search_text_in, BOOL case_insensitive, BOOL wrap = TRUE);
BOOL replaceText(const std::string& search_text, const std::string& replace_text, BOOL case_insensitive, BOOL wrap = TRUE);
@@ -200,6 +200,9 @@ public:
const LLTextSegmentPtr getPreviousSegment() const;
void getSelectedSegments(segment_vec_t& segments) const;
+ void setShowContextMenu(bool show) { mShowContextMenu = show; }
+ bool getShowContextMenu() const { return mShowContextMenu; }
+
protected:
void showContextMenu(S32 x, S32 y);
void drawPreeditMarker();
@@ -212,13 +215,10 @@ protected:
S32 indentLine( S32 pos, S32 spaces );
void unindentLineBeforeCloseBrace();
- void reportBadKeystroke() { make_ui_sound("UISndBadKeystroke"); }
-
BOOL handleNavigationKey(const KEY key, const MASK mask);
- BOOL handleSpecialKey(const KEY key, const MASK mask, BOOL* return_key_hit);
+ BOOL handleSpecialKey(const KEY key, const MASK mask);
BOOL handleSelectionKey(const KEY key, const MASK mask);
BOOL handleControlKey(const KEY key, const MASK mask);
- BOOL handleEditKey(const KEY key, const MASK mask);
BOOL selectionContainsLineBreaks();
void deleteSelection(BOOL transient_operation);
@@ -240,6 +240,7 @@ protected:
// Undoable operations
void addChar(llwchar c); // at mCursorPos
S32 addChar(S32 pos, llwchar wc);
+ void addLineBreakChar();
S32 overwriteChar(S32 pos, llwchar wc);
void removeChar();
S32 removeChar(S32 pos);
@@ -319,16 +320,14 @@ private:
BOOL mTakesFocus;
BOOL mAllowEmbeddedItems;
+ bool mShowContextMenu;
LLUUID mSourceID;
- // If true, the standard edit keys (Ctrl-X, Delete, etc,) are handled here
- //instead of routed by the menu system
- BOOL mHandleEditKeysDirectly;
-
LLCoordGL mLastIMEPosition; // Last position of the IME editor
keystroke_signal_t mKeystrokeSignal;
+ LLTextValidate::validate_func_t mPrevalidateFunc;
LLContextMenu* mContextMenu;
}; // end class LLTextEditor
diff --git a/indra/llui/lltextparser.cpp b/indra/llui/lltextparser.cpp
index 76a39e3094..2493afcb5d 100644
--- a/indra/llui/lltextparser.cpp
+++ b/indra/llui/lltextparser.cpp
@@ -43,29 +43,14 @@
#include "v4color.h"
#include "lldir.h"
-// Routines used for parsing text for TextParsers and html
-
-LLTextParser* LLTextParser::sInstance = NULL;
-
//
// Member Functions
//
-LLTextParser::~LLTextParser()
-{
- sInstance=NULL;
-}
+LLTextParser::LLTextParser()
+: mLoaded(false)
+{}
-// static
-LLTextParser* LLTextParser::getInstance()
-{
- if (!sInstance)
- {
- sInstance = new LLTextParser();
- sInstance->loadFromDisk();
- }
- return sInstance;
-}
// Moved triggerAlerts() to llfloaterchat.cpp to break llui/llaudio library dependency.
@@ -105,6 +90,8 @@ S32 LLTextParser::findPattern(const std::string &text, LLSD highlight)
LLSD LLTextParser::parsePartialLineHighlights(const std::string &text, const LLColor4 &color, EHighlightPosition part, S32 index)
{
+ loadKeywords();
+
//evil recursive string atomizer.
LLSD ret_llsd, start_llsd, middle_llsd, end_llsd;
@@ -195,6 +182,8 @@ LLSD LLTextParser::parsePartialLineHighlights(const std::string &text, const LLC
bool LLTextParser::parseFullLineHighlights(const std::string &text, LLColor4 *color)
{
+ loadKeywords();
+
for (S32 i=0;i<mHighlights.size();i++)
{
if ((S32)mHighlights[i]["highlight"]==ALL || (S32)mHighlights[i]["condition"]==MATCHES)
@@ -221,14 +210,14 @@ std::string LLTextParser::getFileName()
return path;
}
-LLSD LLTextParser::loadFromDisk()
+void LLTextParser::loadKeywords()
{
- std::string filename=getFileName();
- if (filename.empty())
- {
- llwarns << "LLTextParser::loadFromDisk() no valid user directory." << llendl;
+ if (mLoaded)
+ {// keywords already loaded
+ return;
}
- else
+ std::string filename=getFileName();
+ if (!filename.empty())
{
llifstream file;
file.open(filename.c_str());
@@ -237,9 +226,8 @@ LLSD LLTextParser::loadFromDisk()
LLSDSerialize::fromXML(mHighlights, file);
}
file.close();
+ mLoaded = true;
}
-
- return mHighlights;
}
bool LLTextParser::saveToDisk(LLSD highlights)
diff --git a/indra/llui/lltextparser.h b/indra/llui/lltextparser.h
index 072ac0f300..3005822f43 100644
--- a/indra/llui/lltextparser.h
+++ b/indra/llui/lltextparser.h
@@ -35,12 +35,13 @@
#define LL_LLTEXTPARSER_H
#include "llsd.h"
+#include "llsingleton.h"
class LLUUID;
class LLVector3d;
class LLColor4;
-class LLTextParser
+class LLTextParser : public LLSingleton<LLTextParser>
{
public:
typedef enum e_condition_type { CONTAINS, MATCHES, STARTS_WITH, ENDS_WITH } EConditionType;
@@ -48,22 +49,20 @@ public:
typedef enum e_highlight_position { WHOLE, START, MIDDLE, END } EHighlightPosition;
typedef enum e_dialog_action { ACTION_NONE, ACTION_CLOSE, ACTION_ADD, ACTION_COPY, ACTION_UPDATE } EDialogAction;
- static LLTextParser* getInstance();
- LLTextParser(){};
- ~LLTextParser();
+ LLTextParser();
- S32 findPattern(const std::string &text, LLSD highlight);
LLSD parsePartialLineHighlights(const std::string &text,const LLColor4 &color, EHighlightPosition part=WHOLE, S32 index=0);
bool parseFullLineHighlights(const std::string &text, LLColor4 *color);
+private:
+ S32 findPattern(const std::string &text, LLSD highlight);
std::string getFileName();
- LLSD loadFromDisk();
+ void loadKeywords();
bool saveToDisk(LLSD highlights);
public:
LLSD mHighlights;
-private:
- static LLTextParser* sInstance;
+ bool mLoaded;
};
#endif
diff --git a/indra/llui/lltextutil.cpp b/indra/llui/lltextutil.cpp
new file mode 100644
index 0000000000..c5f3929fb1
--- /dev/null
+++ b/indra/llui/lltextutil.cpp
@@ -0,0 +1,79 @@
+/**
+ * @file lltextutil.cpp
+ * @brief Misc text-related auxiliary methods
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "lltextutil.h"
+
+#include "lluicolor.h"
+#include "lltextbox.h"
+
+
+void LLTextUtil::textboxSetHighlightedVal(LLTextBox *txtbox, const LLStyle::Params& normal_style, const std::string& text, const std::string& hl)
+{
+ static LLUIColor sFilterTextColor = LLUIColorTable::instance().getColor("FilterTextColor", LLColor4::green);
+
+ std::string text_uc = text;
+ LLStringUtil::toUpper(text_uc);
+
+ size_t hl_begin = 0, hl_len = hl.size();
+
+ if (hl_len == 0 || (hl_begin = text_uc.find(hl)) == std::string::npos)
+ {
+ txtbox->setText(text, normal_style);
+ return;
+ }
+
+ LLStyle::Params hl_style = normal_style;
+ hl_style.color = sFilterTextColor;
+
+ txtbox->setText(LLStringUtil::null); // clear text
+ txtbox->appendText(text.substr(0, hl_begin), false, normal_style);
+ txtbox->appendText(text.substr(hl_begin, hl_len), false, hl_style);
+ txtbox->appendText(text.substr(hl_begin + hl_len), false, normal_style);
+}
+
+const std::string& LLTextUtil::formatPhoneNumber(const std::string& phone_str)
+{
+ static const std::string PHONE_SEPARATOR = LLUI::sSettingGroups["config"]->getString("AvalinePhoneSeparator");
+ static const S32 PHONE_PART_LEN = 2;
+
+ static std::string formatted_phone_str;
+ formatted_phone_str = phone_str;
+ S32 separator_pos = (S32)(formatted_phone_str.size()) - PHONE_PART_LEN;
+ for (; separator_pos >= PHONE_PART_LEN; separator_pos -= PHONE_PART_LEN)
+ {
+ formatted_phone_str.insert(separator_pos, PHONE_SEPARATOR);
+ }
+
+ return formatted_phone_str;
+}
+
+// EOF
diff --git a/indra/llui/lltextutil.h b/indra/llui/lltextutil.h
new file mode 100644
index 0000000000..325c3c5b7c
--- /dev/null
+++ b/indra/llui/lltextutil.h
@@ -0,0 +1,72 @@
+/**
+ * @file lltextutil.h
+ * @brief Misc text-related auxiliary methods
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLTEXTUTIL_H
+#define LL_LLTEXTUTIL_H
+
+#include "llstyle.h"
+
+class LLTextBox;
+
+namespace LLTextUtil
+{
+
+ /**
+ * Set value for text box, highlighting substring hl_uc.
+ *
+ * Used to highlight filter matches.
+ *
+ * @param txtbox Text box to set value for
+ * @param normal_style Style to use for non-highlighted text
+ * @param text Text to set
+ * @param hl Upper-cased string to highlight
+ */
+ void textboxSetHighlightedVal(
+ LLTextBox *txtbox,
+ const LLStyle::Params& normal_style,
+ const std::string& text,
+ const std::string& hl);
+
+ /**
+ * Formats passed phone number to be more human readable.
+ *
+ * It just divides the number on parts by two digits from right to left. The first left part
+ * can have 2 or 3 digits, i.e. +44-33-33-44-55-66 or 12-34-56-78-90. Separator is set in
+ * application settings (AvalinePhoneSeparator)
+ *
+ * @param[in] phone_str string with original phone number
+ * @return reference to string with formatted phone number
+ */
+ const std::string& formatPhoneNumber(const std::string& phone_str);
+}
+
+#endif // LL_LLTEXTUTIL_H
diff --git a/indra/llui/lltextvalidate.cpp b/indra/llui/lltextvalidate.cpp
new file mode 100644
index 0000000000..8b6bc5bd7d
--- /dev/null
+++ b/indra/llui/lltextvalidate.cpp
@@ -0,0 +1,302 @@
+/**
+ * @file lltextvalidate.cpp
+ * @brief Text validation helper functions
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+// Text editor widget to let users enter a single line.
+
+#include "linden_common.h"
+
+#include "lltextvalidate.h"
+#include "llresmgr.h" // for LLLocale
+
+namespace LLTextValidate
+{
+ void ValidateTextNamedFuncs::declareValues()
+ {
+ declare("ascii", validateASCII);
+ declare("float", validateFloat);
+ declare("int", validateInt);
+ declare("positive_s32", validatePositiveS32);
+ declare("non_negative_s32", validateNonNegativeS32);
+ declare("alpha_num", validateAlphaNum);
+ declare("alpha_num_space", validateAlphaNumSpace);
+ declare("ascii_printable_no_pipe", validateASCIIPrintableNoPipe);
+ declare("ascii_printable_no_space", validateASCIIPrintableNoSpace);
+ }
+
+ // Limits what characters can be used to [1234567890.-] with [-] only valid in the first position.
+ // Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for
+ // the simple reasons that intermediate states may be invalid even if the final result is valid.
+ //
+ bool validateFloat(const LLWString &str)
+ {
+ LLLocale locale(LLLocale::USER_LOCALE);
+
+ bool success = TRUE;
+ LLWString trimmed = str;
+ LLWStringUtil::trim(trimmed);
+ S32 len = trimmed.length();
+ if( 0 < len )
+ {
+ // May be a comma or period, depending on the locale
+ llwchar decimal_point = (llwchar)LLResMgr::getInstance()->getDecimalPoint();
+
+ S32 i = 0;
+
+ // First character can be a negative sign
+ if( '-' == trimmed[0] )
+ {
+ i++;
+ }
+
+ for( ; i < len; i++ )
+ {
+ if( (decimal_point != trimmed[i] ) && !LLStringOps::isDigit( trimmed[i] ) )
+ {
+ success = FALSE;
+ break;
+ }
+ }
+ }
+
+ return success;
+ }
+
+ // Limits what characters can be used to [1234567890-] with [-] only valid in the first position.
+ // Does NOT ensure that the string is a well-formed number--that's the job of post-validation--for
+ // the simple reasons that intermediate states may be invalid even if the final result is valid.
+ //
+ bool validateInt(const LLWString &str)
+ {
+ LLLocale locale(LLLocale::USER_LOCALE);
+
+ bool success = TRUE;
+ LLWString trimmed = str;
+ LLWStringUtil::trim(trimmed);
+ S32 len = trimmed.length();
+ if( 0 < len )
+ {
+ S32 i = 0;
+
+ // First character can be a negative sign
+ if( '-' == trimmed[0] )
+ {
+ i++;
+ }
+
+ for( ; i < len; i++ )
+ {
+ if( !LLStringOps::isDigit( trimmed[i] ) )
+ {
+ success = FALSE;
+ break;
+ }
+ }
+ }
+
+ return success;
+ }
+
+ bool validatePositiveS32(const LLWString &str)
+ {
+ LLLocale locale(LLLocale::USER_LOCALE);
+
+ LLWString trimmed = str;
+ LLWStringUtil::trim(trimmed);
+ S32 len = trimmed.length();
+ bool success = TRUE;
+ if(0 < len)
+ {
+ if(('-' == trimmed[0]) || ('0' == trimmed[0]))
+ {
+ success = FALSE;
+ }
+ S32 i = 0;
+ while(success && (i < len))
+ {
+ if(!LLStringOps::isDigit(trimmed[i++]))
+ {
+ success = FALSE;
+ }
+ }
+ }
+ if (success)
+ {
+ S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10);
+ if (val <= 0)
+ {
+ success = FALSE;
+ }
+ }
+ return success;
+ }
+
+ bool validateNonNegativeS32(const LLWString &str)
+ {
+ LLLocale locale(LLLocale::USER_LOCALE);
+
+ LLWString trimmed = str;
+ LLWStringUtil::trim(trimmed);
+ S32 len = trimmed.length();
+ bool success = TRUE;
+ if(0 < len)
+ {
+ if('-' == trimmed[0])
+ {
+ success = FALSE;
+ }
+ S32 i = 0;
+ while(success && (i < len))
+ {
+ if(!LLStringOps::isDigit(trimmed[i++]))
+ {
+ success = FALSE;
+ }
+ }
+ }
+ if (success)
+ {
+ S32 val = strtol(wstring_to_utf8str(trimmed).c_str(), NULL, 10);
+ if (val < 0)
+ {
+ success = FALSE;
+ }
+ }
+ return success;
+ }
+
+ bool validateAlphaNum(const LLWString &str)
+ {
+ LLLocale locale(LLLocale::USER_LOCALE);
+
+ bool rv = TRUE;
+ S32 len = str.length();
+ if(len == 0) return rv;
+ while(len--)
+ {
+ if( !LLStringOps::isAlnum((char)str[len]) )
+ {
+ rv = FALSE;
+ break;
+ }
+ }
+ return rv;
+ }
+
+ bool validateAlphaNumSpace(const LLWString &str)
+ {
+ LLLocale locale(LLLocale::USER_LOCALE);
+
+ bool rv = TRUE;
+ S32 len = str.length();
+ if(len == 0) return rv;
+ while(len--)
+ {
+ if(!(LLStringOps::isAlnum((char)str[len]) || (' ' == str[len])))
+ {
+ rv = FALSE;
+ break;
+ }
+ }
+ return rv;
+ }
+
+ // Used for most names of things stored on the server, due to old file-formats
+ // that used the pipe (|) for multiline text storage. Examples include
+ // inventory item names, parcel names, object names, etc.
+ bool validateASCIIPrintableNoPipe(const LLWString &str)
+ {
+ bool rv = TRUE;
+ S32 len = str.length();
+ if(len == 0) return rv;
+ while(len--)
+ {
+ llwchar wc = str[len];
+ if (wc < 0x20
+ || wc > 0x7f
+ || wc == '|')
+ {
+ rv = FALSE;
+ break;
+ }
+ if(!(wc == ' '
+ || LLStringOps::isAlnum((char)wc)
+ || LLStringOps::isPunct((char)wc) ) )
+ {
+ rv = FALSE;
+ break;
+ }
+ }
+ return rv;
+ }
+
+
+ // Used for avatar names
+ bool validateASCIIPrintableNoSpace(const LLWString &str)
+ {
+ bool rv = TRUE;
+ S32 len = str.length();
+ if(len == 0) return rv;
+ while(len--)
+ {
+ llwchar wc = str[len];
+ if (wc < 0x20
+ || wc > 0x7f
+ || LLStringOps::isSpace(wc))
+ {
+ rv = FALSE;
+ break;
+ }
+ if( !(LLStringOps::isAlnum((char)str[len]) ||
+ LLStringOps::isPunct((char)str[len]) ) )
+ {
+ rv = FALSE;
+ break;
+ }
+ }
+ return rv;
+ }
+
+ bool validateASCII(const LLWString &str)
+ {
+ bool rv = TRUE;
+ S32 len = str.length();
+ while(len--)
+ {
+ if (str[len] < 0x20 || str[len] > 0x7f)
+ {
+ rv = FALSE;
+ break;
+ }
+ }
+ return rv;
+ }
+}
diff --git a/indra/llui/lltextvalidate.h b/indra/llui/lltextvalidate.h
new file mode 100644
index 0000000000..ffb4e85e7c
--- /dev/null
+++ b/indra/llui/lltextvalidate.h
@@ -0,0 +1,63 @@
+/**
+ * @file lltextbase.h
+ * @author Martin Reddy
+ * @brief The base class of text box/editor, providing Url handling support
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLTEXTVALIDATE_H
+#define LL_LLTEXTVALIDATE_H
+
+#include "llstring.h"
+#include "llinitparam.h"
+#include <boost/function.hpp>
+
+namespace LLTextValidate
+{
+ typedef boost::function<BOOL (const LLWString &wstr)> validate_func_t;
+
+ struct ValidateTextNamedFuncs
+ : public LLInitParam::TypeValuesHelper<validate_func_t, ValidateTextNamedFuncs>
+ {
+ static void declareValues();
+ };
+
+ bool validateFloat(const LLWString &str );
+ bool validateInt(const LLWString &str );
+ bool validatePositiveS32(const LLWString &str);
+ bool validateNonNegativeS32(const LLWString &str);
+ bool validateAlphaNum(const LLWString &str );
+ bool validateAlphaNumSpace(const LLWString &str );
+ bool validateASCIIPrintableNoPipe(const LLWString &str);
+ bool validateASCIIPrintableNoSpace(const LLWString &str);
+ bool validateASCII(const LLWString &str);
+}
+
+
+#endif
diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp
index 173fde8e76..ed7fd02e14 100644
--- a/indra/llui/lltooltip.cpp
+++ b/indra/llui/lltooltip.cpp
@@ -129,12 +129,6 @@ BOOL LLToolTipView::handleScrollWheel( S32 x, S32 y, S32 clicks )
return FALSE;
}
-void LLToolTipView::onMouseLeave(S32 x, S32 y, MASK mask)
-{
- LLToolTipMgr::instance().blockToolTips();
-}
-
-
void LLToolTipView::drawStickyRect()
{
gl_rect_2d(LLToolTipMgr::instance().getMouseNearRect(), LLColor4::white, false);
diff --git a/indra/llui/lltooltip.h b/indra/llui/lltooltip.h
index 7978b6a583..24e32b9b24 100644
--- a/indra/llui/lltooltip.h
+++ b/indra/llui/lltooltip.h
@@ -56,8 +56,6 @@ public:
/*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
/*virtual*/ BOOL handleScrollWheel( S32 x, S32 y, S32 clicks );
- /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
-
void drawStickyRect();
/*virtual*/ void draw();
@@ -129,7 +127,8 @@ private:
class LLInspector : public LLToolTip
{
public:
- struct Params : public LLInitParam::Block<Params, LLToolTip::Params> {};
+ struct Params : public LLInitParam::Block<Params, LLToolTip::Params>
+ {};
};
class LLToolTipMgr : public LLSingleton<LLToolTipMgr>
diff --git a/indra/llui/llui.cpp b/indra/llui/llui.cpp
index 76f07373b4..bf12384a28 100644
--- a/indra/llui/llui.cpp
+++ b/indra/llui/llui.cpp
@@ -39,6 +39,7 @@
// Linden library includes
#include "v2math.h"
+#include "m3math.h"
#include "v4color.h"
#include "llrender.h"
#include "llrect.h"
@@ -55,6 +56,7 @@
#include "llfloaterreg.h"
#include "llmenugl.h"
#include "llmenubutton.h"
+#include "llloadingindicator.h"
#include "llwindow.h"
// for registration
@@ -85,12 +87,18 @@ std::list<std::string> gUntranslated;
/*static*/ LLHelp* LLUI::sHelpImpl = NULL;
/*static*/ std::vector<std::string> LLUI::sXUIPaths;
/*static*/ LLFrameTimer LLUI::sMouseIdleTimer;
+/*static*/ LLUI::add_popup_t LLUI::sAddPopupFunc;
+/*static*/ LLUI::remove_popup_t LLUI::sRemovePopupFunc;
+/*static*/ LLUI::clear_popups_t LLUI::sClearPopupsFunc;
// register filtereditor here
static LLDefaultChildRegistry::Register<LLFilterEditor> register_filter_editor("filter_editor");
static LLDefaultChildRegistry::Register<LLFlyoutButton> register_flyout_button("flyout_button");
static LLDefaultChildRegistry::Register<LLSearchEditor> register_search_editor("search_editor");
+
+// register other widgets which otherwise may not be linked in
static LLDefaultChildRegistry::Register<LLMenuButton> register_menu_button("menu_button");
+static LLDefaultChildRegistry::Register<LLLoadingIndicator> register_loading_indicator("loading_indicator");
//
@@ -180,19 +188,19 @@ void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, const LL
void gl_rect_2d_offset_local( S32 left, S32 top, S32 right, S32 bottom, S32 pixel_offset, BOOL filled)
{
- gGL.pushMatrix();
+ gGL.pushUIMatrix();
left += LLFontGL::sCurOrigin.mX;
right += LLFontGL::sCurOrigin.mX;
bottom += LLFontGL::sCurOrigin.mY;
top += LLFontGL::sCurOrigin.mY;
- glLoadIdentity();
+ gGL.loadUIIdentity();
gl_rect_2d(llfloor((F32)left * LLUI::sGLScaleFactor.mV[VX]) - pixel_offset,
llfloor((F32)top * LLUI::sGLScaleFactor.mV[VY]) + pixel_offset,
llfloor((F32)right * LLUI::sGLScaleFactor.mV[VX]) + pixel_offset,
llfloor((F32)bottom * LLUI::sGLScaleFactor.mV[VY]) - pixel_offset,
filled);
- gGL.popMatrix();
+ gGL.popUIMatrix();
}
@@ -203,7 +211,7 @@ void gl_rect_2d(S32 left, S32 top, S32 right, S32 bottom, BOOL filled )
// Counterclockwise quad will face the viewer
if( filled )
- {
+ {
gGL.begin( LLRender::QUADS );
gGL.vertex2i(left, top);
gGL.vertex2i(left, bottom);
@@ -508,9 +516,9 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTex
gGL.getTexUnit(0)->setTextureAlphaBlend(LLTexUnit::TBO_MULT, LLTexUnit::TBS_TEX_ALPHA, LLTexUnit::TBS_VERT_ALPHA);
}
- gGL.pushMatrix();
+ gGL.pushUIMatrix();
{
- gGL.translatef((F32)x, (F32)y, 0.f);
+ gGL.translateUI((F32)x, (F32)y, 0.f);
gGL.getTexUnit(0)->bind(image);
@@ -637,7 +645,7 @@ void gl_draw_scaled_image_with_border(S32 x, S32 y, S32 width, S32 height, LLTex
}
gGL.end();
}
- gGL.popMatrix();
+ gGL.popUIMatrix();
if (solid_color)
{
@@ -660,39 +668,72 @@ void gl_draw_scaled_rotated_image(S32 x, S32 y, S32 width, S32 height, F32 degre
LLGLSUIDefault gls_ui;
- gGL.pushMatrix();
+
+ gGL.getTexUnit(0)->bind(image);
+
+ gGL.color4fv(color.mV);
+
+ if (degrees == 0.f)
{
- gGL.translatef((F32)x, (F32)y, 0.f);
- if( degrees )
+ gGL.pushUIMatrix();
+ gGL.translateUI((F32)x, (F32)y, 0.f);
+
+ gGL.begin(LLRender::QUADS);
{
- F32 offset_x = F32(width/2);
- F32 offset_y = F32(height/2);
- gGL.translatef( offset_x, offset_y, 0.f);
- glRotatef( degrees, 0.f, 0.f, 1.f );
- gGL.translatef( -offset_x, -offset_y, 0.f );
+ gGL.texCoord2f(uv_rect.mRight, uv_rect.mTop);
+ gGL.vertex2i(width, height );
+
+ gGL.texCoord2f(uv_rect.mLeft, uv_rect.mTop);
+ gGL.vertex2i(0, height );
+
+ gGL.texCoord2f(uv_rect.mLeft, uv_rect.mBottom);
+ gGL.vertex2i(0, 0);
+
+ gGL.texCoord2f(uv_rect.mRight, uv_rect.mBottom);
+ gGL.vertex2i(width, 0);
}
+ gGL.end();
+ gGL.popUIMatrix();
+ }
+ else
+ {
+ gGL.pushUIMatrix();
+ gGL.translateUI((F32)x, (F32)y, 0.f);
+
+ F32 offset_x = F32(width/2);
+ F32 offset_y = F32(height/2);
+
+ gGL.translateUI(offset_x, offset_y, 0.f);
+ LLMatrix3 quat(0.f, 0.f, degrees*DEG_TO_RAD);
+
gGL.getTexUnit(0)->bind(image);
gGL.color4fv(color.mV);
gGL.begin(LLRender::QUADS);
{
+ LLVector3 v;
+
+ v = LLVector3(offset_x, offset_y, 0.f) * quat;
gGL.texCoord2f(uv_rect.mRight, uv_rect.mTop);
- gGL.vertex2i(width, height );
+ gGL.vertex2f(v.mV[0], v.mV[1] );
+ v = LLVector3(-offset_x, offset_y, 0.f) * quat;
gGL.texCoord2f(uv_rect.mLeft, uv_rect.mTop);
- gGL.vertex2i(0, height );
+ gGL.vertex2f(v.mV[0], v.mV[1] );
+ v = LLVector3(-offset_x, -offset_y, 0.f) * quat;
gGL.texCoord2f(uv_rect.mLeft, uv_rect.mBottom);
- gGL.vertex2i(0, 0);
+ gGL.vertex2f(v.mV[0], v.mV[1] );
+ v = LLVector3(offset_x, -offset_y, 0.f) * quat;
gGL.texCoord2f(uv_rect.mRight, uv_rect.mBottom);
- gGL.vertex2i(width, 0);
+ gGL.vertex2f(v.mV[0], v.mV[1] );
}
gGL.end();
+ gGL.popUIMatrix();
}
- gGL.popMatrix();
}
@@ -747,9 +788,9 @@ void gl_arc_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled, F
end_angle += F_TWO_PI;
}
- gGL.pushMatrix();
+ gGL.pushUIMatrix();
{
- gGL.translatef(center_x, center_y, 0.f);
+ gGL.translateUI(center_x, center_y, 0.f);
// Inexact, but reasonably fast.
F32 delta = (end_angle - start_angle) / steps;
@@ -780,15 +821,15 @@ void gl_arc_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled, F
}
gGL.end();
}
- gGL.popMatrix();
+ gGL.popUIMatrix();
}
void gl_circle_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled)
{
- gGL.pushMatrix();
+ gGL.pushUIMatrix();
{
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- gGL.translatef(center_x, center_y, 0.f);
+ gGL.translateUI(center_x, center_y, 0.f);
// Inexact, but reasonably fast.
F32 delta = F_TWO_PI / steps;
@@ -819,7 +860,7 @@ void gl_circle_2d(F32 center_x, F32 center_y, F32 radius, S32 steps, BOOL filled
}
gGL.end();
}
- gGL.popMatrix();
+ gGL.popUIMatrix();
}
// Renders a ring with sides (tube shape)
@@ -846,9 +887,9 @@ void gl_deep_circle( F32 radius, F32 depth, S32 steps )
void gl_ring( F32 radius, F32 width, const LLColor4& center_color, const LLColor4& side_color, S32 steps, BOOL render_center )
{
- gGL.pushMatrix();
+ gGL.pushUIMatrix();
{
- gGL.translatef(0.f, 0.f, -width / 2);
+ gGL.translateUI(0.f, 0.f, -width / 2);
if( render_center )
{
gGL.color4fv(center_color.mV);
@@ -857,11 +898,11 @@ void gl_ring( F32 radius, F32 width, const LLColor4& center_color, const LLColor
else
{
gl_washer_2d(radius, radius - width, steps, side_color, side_color);
- gGL.translatef(0.f, 0.f, width);
+ gGL.translateUI(0.f, 0.f, width);
gl_washer_2d(radius - width, radius, steps, side_color, side_color);
}
}
- gGL.popMatrix();
+ gGL.popUIMatrix();
}
// Draw gray and white checkerboard with black border
@@ -1050,9 +1091,9 @@ void gl_segmented_rect_2d_tex(const S32 left,
S32 width = llabs(right - left);
S32 height = llabs(top - bottom);
- gGL.pushMatrix();
+ gGL.pushUIMatrix();
- gGL.translatef((F32)left, (F32)bottom, 0.f);
+ gGL.translateUI((F32)left, (F32)bottom, 0.f);
LLVector2 border_uv_scale((F32)border_size / (F32)texture_width, (F32)border_size / (F32)texture_height);
if (border_uv_scale.mV[VX] > 0.5f)
@@ -1193,7 +1234,7 @@ void gl_segmented_rect_2d_tex(const S32 left,
}
gGL.end();
- gGL.popMatrix();
+ gGL.popUIMatrix();
}
void gl_segmented_rect_2d_fragment_tex(const S32 left,
@@ -1210,9 +1251,9 @@ void gl_segmented_rect_2d_fragment_tex(const S32 left,
S32 width = llabs(right - left);
S32 height = llabs(top - bottom);
- gGL.pushMatrix();
+ gGL.pushUIMatrix();
- gGL.translatef((F32)left, (F32)bottom, 0.f);
+ gGL.translateUI((F32)left, (F32)bottom, 0.f);
LLVector2 border_uv_scale((F32)border_size / (F32)texture_width, (F32)border_size / (F32)texture_height);
if (border_uv_scale.mV[VX] > 0.5f)
@@ -1383,7 +1424,7 @@ void gl_segmented_rect_2d_fragment_tex(const S32 left,
}
gGL.end();
- gGL.popMatrix();
+ gGL.popUIMatrix();
}
void gl_segmented_rect_3d_tex(const LLVector2& border_scale, const LLVector3& border_width,
@@ -1573,6 +1614,13 @@ void LLUI::cleanupClass()
sImageProvider->cleanUp();
}
+void LLUI::setPopupFuncs(const add_popup_t& add_popup, const remove_popup_t& remove_popup, const clear_popups_t& clear_popups)
+{
+ sAddPopupFunc = add_popup;
+ sRemovePopupFunc = remove_popup;
+ sClearPopupsFunc = clear_popups;
+}
+
//static
void LLUI::dirtyRect(LLRect rect)
{
@@ -1591,7 +1639,7 @@ void LLUI::dirtyRect(LLRect rect)
//static
void LLUI::translate(F32 x, F32 y, F32 z)
{
- gGL.translatef(x,y,z);
+ gGL.translateUI(x,y,z);
LLFontGL::sCurOrigin.mX += (S32) x;
LLFontGL::sCurOrigin.mY += (S32) y;
LLFontGL::sCurOrigin.mZ += z;
@@ -1600,14 +1648,14 @@ void LLUI::translate(F32 x, F32 y, F32 z)
//static
void LLUI::pushMatrix()
{
- gGL.pushMatrix();
+ gGL.pushUIMatrix();
LLFontGL::sOriginStack.push_back(LLFontGL::sCurOrigin);
}
//static
void LLUI::popMatrix()
{
- gGL.popMatrix();
+ gGL.popUIMatrix();
LLFontGL::sCurOrigin = *LLFontGL::sOriginStack.rbegin();
LLFontGL::sOriginStack.pop_back();
}
@@ -1615,7 +1663,7 @@ void LLUI::popMatrix()
//static
void LLUI::loadIdentity()
{
- glLoadIdentity();
+ gGL.loadUIIdentity();
LLFontGL::sCurOrigin.mX = 0;
LLFontGL::sCurOrigin.mY = 0;
LLFontGL::sCurOrigin.mZ = 0;
@@ -1843,6 +1891,39 @@ LLControlGroup& LLUI::getControlControlGroup (const std::string& controlname)
return *sSettingGroups["config"]; // default group
}
+//static
+void LLUI::addPopup(LLView* viewp)
+{
+ if (sAddPopupFunc)
+ {
+ sAddPopupFunc(viewp);
+ }
+}
+
+//static
+void LLUI::removePopup(LLView* viewp)
+{
+ if (sRemovePopupFunc)
+ {
+ sRemovePopupFunc(viewp);
+ }
+}
+
+//static
+void LLUI::clearPopups()
+{
+ if (sClearPopupsFunc)
+ {
+ sClearPopupsFunc();
+ }
+}
+
+//static
+void LLUI::reportBadKeystroke()
+{
+ make_ui_sound("UISndBadKeystroke");
+}
+
//static
// spawn_x and spawn_y are top left corner of view in screen GL coordinates
void LLUI::positionViewNearMouse(LLView* view, S32 spawn_x, S32 spawn_y)
@@ -1894,7 +1975,9 @@ namespace LLInitParam
blue("blue"),
alpha("alpha"),
control("")
- {}
+ {
+ setBlockFromValue();
+ }
void TypedParam<LLUIColor>::setValueFromBlock() const
{
@@ -1939,7 +2022,9 @@ namespace LLInitParam
size("size"),
style("style")
{
+ setBlockFromValue();
addSynonym(name, "");
+ setBlockFromValue();
}
void TypedParam<const LLFontGL*>::setValueFromBlock() const
@@ -1979,7 +2064,9 @@ namespace LLInitParam
bottom("bottom"),
width("width"),
height("height")
- {}
+ {
+ setBlockFromValue();
+ }
void TypedParam<LLRect>::setValueFromBlock() const
{
@@ -2064,6 +2151,7 @@ namespace LLInitParam
x("x"),
y("y")
{
+ setBlockFromValue();
}
void TypedParam<LLCoordGL>::setValueFromBlock() const
diff --git a/indra/llui/llui.h b/indra/llui/llui.h
index 5840e76f5c..c18262ef76 100644
--- a/indra/llui/llui.h
+++ b/indra/llui/llui.h
@@ -160,12 +160,17 @@ public:
// Methods
//
typedef std::map<std::string, LLControlGroup*> settings_map_t;
+ typedef boost::function<void(LLView*)> add_popup_t;
+ typedef boost::function<void(LLView*)> remove_popup_t;
+ typedef boost::function<void(void)> clear_popups_t;
+
static void initClass(const settings_map_t& settings,
LLImageProviderInterface* image_provider,
LLUIAudioCallback audio_callback = NULL,
const LLVector2 *scale_factor = NULL,
const std::string& language = LLStringUtil::null);
static void cleanupClass();
+ static void setPopupFuncs(const add_popup_t& add_popup, const remove_popup_t&, const clear_popups_t& );
static void pushMatrix();
static void popMatrix();
@@ -208,6 +213,12 @@ public:
static void resetMouseIdleTimer() { sMouseIdleTimer.reset(); }
static LLWindow* getWindow() { return sWindow; }
+ static void addPopup(LLView*);
+ static void removePopup(LLView*);
+ static void clearPopups();
+
+ static void reportBadKeystroke();
+
// Ensures view does not overlap mouse cursor, but is inside
// the view's parent rectangle. Used for tooltips, inspectors.
// Optionally override the view's default X/Y, which are relative to the
@@ -227,6 +238,9 @@ private:
static LLImageProviderInterface* sImageProvider;
static std::vector<std::string> sXUIPaths;
static LLFrameTimer sMouseIdleTimer;
+ static add_popup_t sAddPopupFunc;
+ static remove_popup_t sRemovePopupFunc;
+ static clear_popups_t sClearPopupsFunc;
};
@@ -426,8 +440,8 @@ namespace LLInitParam
{
typedef BlockValue<const LLFontGL*> super_t;
public:
- Mandatory<std::string> name;
- Optional<std::string> size,
+ Optional<std::string> name,
+ size,
style;
TypedParam(BlockDescriptor& descriptor, const char* name, const LLFontGL* const value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count);
diff --git a/indra/llui/lluicolortable.cpp b/indra/llui/lluicolortable.cpp
index 9be33483d0..1b64ef3abe 100644
--- a/indra/llui/lluicolortable.cpp
+++ b/indra/llui/lluicolortable.cpp
@@ -56,7 +56,7 @@ LLUIColorTable::Params::Params()
{
}
-void LLUIColorTable::insertFromParams(const Params& p)
+void LLUIColorTable::insertFromParams(const Params& p, string_color_map_t& table)
{
// this map will contain all color references after the following loop
typedef std::map<std::string, std::string> string_string_map_t;
@@ -69,14 +69,7 @@ void LLUIColorTable::insertFromParams(const Params& p)
ColorEntryParams color_entry = *it;
if(color_entry.color.value.isChosen())
{
- if(mUserSetColors.find(color_entry.name)!=mUserSetColors.end())
- {
- setColor(color_entry.name, color_entry.color.value);
- }
- else
- {
- setColor(color_entry.name, color_entry.color.value, mLoadedColors);
- }
+ setColor(color_entry.name, color_entry.color.value, table);
}
else
{
@@ -220,16 +213,16 @@ bool LLUIColorTable::loadFromSettings()
bool result = false;
std::string default_filename = gDirUtilp->getExpandedFilename(LL_PATH_DEFAULT_SKIN, "colors.xml");
- result |= loadFromFilename(default_filename);
+ result |= loadFromFilename(default_filename, mLoadedColors);
std::string current_filename = gDirUtilp->getExpandedFilename(LL_PATH_TOP_SKIN, "colors.xml");
if(current_filename != default_filename)
{
- result |= loadFromFilename(current_filename);
+ result |= loadFromFilename(current_filename, mLoadedColors);
}
std::string user_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "colors.xml");
- loadFromFilename(user_filename);
+ loadFromFilename(user_filename, mUserSetColors);
return result;
}
@@ -299,7 +292,7 @@ void LLUIColorTable::setColor(const std::string& name, const LLColor4& color, st
}
}
-bool LLUIColorTable::loadFromFilename(const std::string& filename)
+bool LLUIColorTable::loadFromFilename(const std::string& filename, string_color_map_t& table)
{
LLXMLNodePtr root;
@@ -320,7 +313,7 @@ bool LLUIColorTable::loadFromFilename(const std::string& filename)
if(params.validateBlock())
{
- insertFromParams(params);
+ insertFromParams(params, table);
}
else
{
@@ -330,3 +323,11 @@ bool LLUIColorTable::loadFromFilename(const std::string& filename)
return true;
}
+
+void LLUIColorTable::insertFromParams(const Params& p)
+{
+ insertFromParams(p, mUserSetColors);
+}
+
+// EOF
+
diff --git a/indra/llui/lluicolortable.h b/indra/llui/lluicolortable.h
index c87695f456..d401e5e724 100644
--- a/indra/llui/lluicolortable.h
+++ b/indra/llui/lluicolortable.h
@@ -45,6 +45,10 @@ class LLUIColor;
class LLUIColorTable : public LLSingleton<LLUIColorTable>
{
LOG_CLASS(LLUIColorTable);
+
+ // consider using sorted vector, can be much faster
+ typedef std::map<std::string, LLUIColor> string_color_map_t;
+
public:
struct ColorParams : LLInitParam::Choice<ColorParams>
{
@@ -91,10 +95,9 @@ public:
void saveUserSettings() const;
private:
- bool loadFromFilename(const std::string& filename);
+ bool loadFromFilename(const std::string& filename, string_color_map_t& table);
- // consider using sorted vector, can be much faster
- typedef std::map<std::string, LLUIColor> string_color_map_t;
+ void insertFromParams(const Params& p, string_color_map_t& table);
void clearTable(string_color_map_t& table);
void setColor(const std::string& name, const LLColor4& color, string_color_map_t& table);
diff --git a/indra/llui/lluictrlfactory.cpp b/indra/llui/lluictrlfactory.cpp
index 27237800d4..930dadc377 100644
--- a/indra/llui/lluictrlfactory.cpp
+++ b/indra/llui/lluictrlfactory.cpp
@@ -435,7 +435,10 @@ void LLUICtrlFactory::registerWidget(const std::type_info* widget_type, const st
std::string* existing_tag = LLWidgetNameRegistry::instance().getValue(param_block_type);
if (existing_tag != NULL && *existing_tag != tag)
{
- llerrs << "Duplicate entry for T::Params, try creating empty param block in derived classes that inherit T::Params" << llendl;
+ std::cerr << "Duplicate entry for T::Params, try creating empty param block in derived classes that inherit T::Params" << std::endl;
+ // forcing crash here
+ char* foo = 0;
+ *foo = 1;
}
LLWidgetNameRegistry ::instance().defaultRegistrar().add(param_block_type, tag);
// associate widget type with factory function
diff --git a/indra/llui/lluifwd.h b/indra/llui/lluifwd.h
index f99bb39fdd..d6047b943c 100644
--- a/indra/llui/lluifwd.h
+++ b/indra/llui/lluifwd.h
@@ -39,6 +39,7 @@ class LLComboBox;
class LLDragHandle;
class LLFloater;
class LLIconCtrl;
+class LLLoadingIndicator;
class LLLineEditor;
class LLMenuGL;
class LLPanel;
diff --git a/indra/llui/lluiimage.h b/indra/llui/lluiimage.h
index bdfc44262d..4ea0738026 100644
--- a/indra/llui/lluiimage.h
+++ b/indra/llui/lluiimage.h
@@ -109,6 +109,7 @@ namespace LLInitParam
TypedParam(BlockDescriptor& descriptor, const char* name, super_t::value_assignment_t value, ParamDescriptor::validation_func_t func, S32 min_count, S32 max_count)
: super_t(descriptor, name, value, func, min_count, max_count)
{
+ setBlockFromValue();
}
void setValueFromBlock() const;
diff --git a/indra/llui/llurlaction.cpp b/indra/llui/llurlaction.cpp
index 679db5e39b..2f13a56b42 100644
--- a/indra/llui/llurlaction.cpp
+++ b/indra/llui/llurlaction.cpp
@@ -146,3 +146,20 @@ void LLUrlAction::copyLabelToClipboard(std::string url)
LLView::getWindow()->copyTextToClipboard(utf8str_to_wstring(match.getLabel()));
}
}
+
+void LLUrlAction::showProfile(std::string url)
+{
+ // Get id from 'secondlife:///app/{cmd}/{id}/{action}'
+ // and show its profile
+ LLURI uri(url);
+ LLSD path_array = uri.pathArray();
+ if (path_array.size() == 4)
+ {
+ std::string id_str = path_array.get(2).asString();
+ if (LLUUID::validate(id_str))
+ {
+ std::string cmd_str = path_array.get(1).asString();
+ executeSLURL("secondlife:///app/" + cmd_str + "/" + id_str + "/about");
+ }
+ }
+}
diff --git a/indra/llui/llurlaction.h b/indra/llui/llurlaction.h
index 4830cf27ef..b96faf1b3f 100644
--- a/indra/llui/llurlaction.h
+++ b/indra/llui/llurlaction.h
@@ -79,6 +79,9 @@ public:
/// copy a Url to the clipboard
static void copyURLToClipboard(std::string url);
+ /// if the Url specifies an SL command in the form like 'app/{cmd}/{id}/*', show its profile
+ static void showProfile(std::string url);
+
/// specify the callbacks to enable this class's functionality
static void setOpenURLCallback(void (*cb) (const std::string& url));
static void setOpenURLInternalCallback(void (*cb) (const std::string& url));
diff --git a/indra/llui/llurlentry.cpp b/indra/llui/llurlentry.cpp
index 92b7816bdd..fd56a87345 100644
--- a/indra/llui/llurlentry.cpp
+++ b/indra/llui/llurlentry.cpp
@@ -34,11 +34,16 @@
#include "linden_common.h"
#include "llurlentry.h"
#include "lluri.h"
+#include "llurlmatch.h"
+#include "llurlregistry.h"
#include "llcachename.h"
#include "lltrans.h"
#include "lluicolortable.h"
+#define APP_HEADER_REGEX "((x-grid-location-info://[-\\w\\.]+/app)|(secondlife:///app))"
+
+
LLUrlEntryBase::LLUrlEntryBase() :
mColor(LLUIColorTable::instance().getColor("HTMLLinkColor")),
mDisabledLink(false)
@@ -232,7 +237,7 @@ std::string LLUrlEntryHTTPNoProtocol::getUrl(const std::string &string) const
LLUrlEntrySLURL::LLUrlEntrySLURL()
{
// see http://slurl.com/about.php for details on the SLURL format
- mPattern = boost::regex("http://(maps.secondlife.com|slurl.com)/secondlife/\\S+/?(\\d+)?/?(\\d+)?/?(\\d+)?/?\\S*",
+ mPattern = boost::regex("http://(maps.secondlife.com|slurl.com)/secondlife/[^ /]+(/\\d+){0,3}(/?(\\?title|\\?img|\\?msg)=\\S*)?/?",
boost::regex::perl|boost::regex::icase);
mMenuName = "menu_url_slurl.xml";
mTooltip = LLTrans::getString("TooltipSLURL");
@@ -287,7 +292,7 @@ std::string LLUrlEntrySLURL::getLabel(const std::string &url, const LLUrlLabelCa
std::string LLUrlEntrySLURL::getLocation(const std::string &url) const
{
// return the part of the Url after slurl.com/secondlife/
- const std::string search_string = "secondlife";
+ const std::string search_string = "/secondlife";
size_t pos = url.find(search_string);
if (pos == std::string::npos)
{
@@ -301,10 +306,11 @@ std::string LLUrlEntrySLURL::getLocation(const std::string &url) const
//
// LLUrlEntryAgent Describes a Second Life agent Url, e.g.,
// secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
+// x-grid-location-info://lincoln.lindenlab.com/app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
//
LLUrlEntryAgent::LLUrlEntryAgent()
{
- mPattern = boost::regex("secondlife:///app/agent/[\\da-f-]+/\\w+",
+ mPattern = boost::regex(APP_HEADER_REGEX "/agent/[\\da-f-]+/\\w+",
boost::regex::perl|boost::regex::icase);
mMenuName = "menu_url_agent.xml";
mIcon = "Generic_Person";
@@ -320,6 +326,38 @@ void LLUrlEntryAgent::onAgentNameReceived(const LLUUID& id,
callObservers(id.asString(), first + " " + last);
}
+std::string LLUrlEntryAgent::getTooltip(const std::string &string) const
+{
+ // return a tooltip corresponding to the URL type instead of the generic one
+ std::string url = getUrl(string);
+
+ if (LLStringUtil::endsWith(url, "/mute"))
+ {
+ return LLTrans::getString("TooltipAgentMute");
+ }
+ if (LLStringUtil::endsWith(url, "/unmute"))
+ {
+ return LLTrans::getString("TooltipAgentUnmute");
+ }
+ if (LLStringUtil::endsWith(url, "/im"))
+ {
+ return LLTrans::getString("TooltipAgentIM");
+ }
+ if (LLStringUtil::endsWith(url, "/pay"))
+ {
+ return LLTrans::getString("TooltipAgentPay");
+ }
+ if (LLStringUtil::endsWith(url, "/offerteleport"))
+ {
+ return LLTrans::getString("TooltipAgentOfferTeleport");
+ }
+ if (LLStringUtil::endsWith(url, "/requestfriend"))
+ {
+ return LLTrans::getString("TooltipAgentRequestFriend");
+ }
+ return LLTrans::getString("TooltipAgentUrl");
+}
+
std::string LLUrlEntryAgent::getLabel(const std::string &url, const LLUrlLabelCallback &cb)
{
if (!gCacheName)
@@ -343,6 +381,31 @@ std::string LLUrlEntryAgent::getLabel(const std::string &url, const LLUrlLabelCa
}
else if (gCacheName->getFullName(agent_id, full_name))
{
+ // customize label string based on agent SLapp suffix
+ if (LLStringUtil::endsWith(url, "/mute"))
+ {
+ return LLTrans::getString("SLappAgentMute") + " " + full_name;
+ }
+ if (LLStringUtil::endsWith(url, "/unmute"))
+ {
+ return LLTrans::getString("SLappAgentUnmute") + " " + full_name;
+ }
+ if (LLStringUtil::endsWith(url, "/im"))
+ {
+ return LLTrans::getString("SLappAgentIM") + " " + full_name;
+ }
+ if (LLStringUtil::endsWith(url, "/pay"))
+ {
+ return LLTrans::getString("SLappAgentPay") + " " + full_name;
+ }
+ if (LLStringUtil::endsWith(url, "/offerteleport"))
+ {
+ return LLTrans::getString("SLappAgentOfferTeleport") + " " + full_name;
+ }
+ if (LLStringUtil::endsWith(url, "/requestfriend"))
+ {
+ return LLTrans::getString("SLappAgentRequestFriend") + " " + full_name;
+ }
return full_name;
}
else
@@ -359,10 +422,11 @@ std::string LLUrlEntryAgent::getLabel(const std::string &url, const LLUrlLabelCa
// LLUrlEntryGroup Describes a Second Life group Url, e.g.,
// secondlife:///app/group/00005ff3-4044-c79f-9de8-fb28ae0df991/about
// secondlife:///app/group/00005ff3-4044-c79f-9de8-fb28ae0df991/inspect
+// x-grid-location-info://lincoln.lindenlab.com/app/group/00005ff3-4044-c79f-9de8-fb28ae0df991/inspect
//
LLUrlEntryGroup::LLUrlEntryGroup()
{
- mPattern = boost::regex("secondlife:///app/group/[\\da-f-]+/\\w+",
+ mPattern = boost::regex(APP_HEADER_REGEX "/group/[\\da-f-]+/\\w+",
boost::regex::perl|boost::regex::icase);
mMenuName = "menu_url_group.xml";
mIcon = "Generic_Group";
@@ -423,7 +487,8 @@ LLUrlEntryInventory::LLUrlEntryInventory()
//*TODO: add supporting of inventory item names with whitespaces
//this pattern cann't parse for example
//secondlife:///app/inventory/0e346d8b-4433-4d66-a6b0-fd37083abc4c/select?name=name with spaces&param2=value
- mPattern = boost::regex("secondlife:///app/inventory/[\\da-f-]+/\\w+\\S*",
+ //x-grid-location-info://lincoln.lindenlab.com/app/inventory/0e346d8b-4433-4d66-a6b0-fd37083abc4c/select?name=name with spaces&param2=value
+ mPattern = boost::regex(APP_HEADER_REGEX "/inventory/[\\da-f-]+/\\w+\\S*",
boost::regex::perl|boost::regex::icase);
mMenuName = "menu_url_inventory.xml";
}
@@ -434,13 +499,43 @@ std::string LLUrlEntryInventory::getLabel(const std::string &url, const LLUrlLab
return LLURI::unescape(label.empty() ? url : label);
}
+//
+// LLUrlEntryObjectIM Describes a Second Life inspector for the object Url, e.g.,
+// secondlife:///app/objectim/7bcd7864-da6b-e43f-4486-91d28a28d95b?name=Object&owner=3de548e1-57be-cfea-2b78-83ae3ad95998&slurl=Danger!%20Danger!/200/200/30/&groupowned=1
+//
+LLUrlEntryObjectIM::LLUrlEntryObjectIM()
+{
+ mPattern = boost::regex("secondlife:///app/objectim/[\\da-f-]+\?.*",
+ boost::regex::perl|boost::regex::icase);
+ mMenuName = "menu_url_objectim.xml";
+}
+
+std::string LLUrlEntryObjectIM::getLabel(const std::string &url, const LLUrlLabelCallback &cb)
+{
+ LLURI uri(url);
+ LLSD query_map = uri.queryMap();
+ if (query_map.has("name"))
+ return query_map["name"];
+ return unescapeUrl(url);
+}
+
+std::string LLUrlEntryObjectIM::getLocation(const std::string &url) const
+{
+ LLURI uri(url);
+ LLSD query_map = uri.queryMap();
+ if (query_map.has("slurl"))
+ return query_map["slurl"];
+ return LLUrlEntryBase::getLocation(url);
+}
+
///
/// LLUrlEntryParcel Describes a Second Life parcel Url, e.g.,
/// secondlife:///app/parcel/0000060e-4b39-e00b-d0c3-d98b1934e3a8/about
+/// x-grid-location-info://lincoln.lindenlab.com/app/parcel/0000060e-4b39-e00b-d0c3-d98b1934e3a8/about
///
LLUrlEntryParcel::LLUrlEntryParcel()
{
- mPattern = boost::regex("secondlife:///app/parcel/[\\da-f-]+/about",
+ mPattern = boost::regex(APP_HEADER_REGEX "/parcel/[\\da-f-]+/about",
boost::regex::perl|boost::regex::icase);
mMenuName = "menu_url_parcel.xml";
mTooltip = LLTrans::getString("TooltipParcelUrl");
@@ -456,7 +551,7 @@ std::string LLUrlEntryParcel::getLabel(const std::string &url, const LLUrlLabelC
//
LLUrlEntryPlace::LLUrlEntryPlace()
{
- mPattern = boost::regex("secondlife://\\S+/?(\\d+/\\d+/\\d+|\\d+/\\d+)/?",
+ mPattern = boost::regex("((x-grid-location-info://[-\\w\\.]+/region/)|(secondlife://))\\S+/?(\\d+/\\d+/\\d+|\\d+/\\d+)/?",
boost::regex::perl|boost::regex::icase);
mMenuName = "menu_url_slurl.xml";
mTooltip = LLTrans::getString("TooltipSLURL");
@@ -501,10 +596,11 @@ std::string LLUrlEntryPlace::getLocation(const std::string &url) const
//
// LLUrlEntryTeleport Describes a Second Life teleport Url, e.g.,
// secondlife:///app/teleport/Ahern/50/50/50/
+// x-grid-location-info://lincoln.lindenlab.com/app/teleport/Ahern/50/50/50/
//
LLUrlEntryTeleport::LLUrlEntryTeleport()
{
- mPattern = boost::regex("secondlife:///app/teleport/\\S+(/\\d+)?(/\\d+)?(/\\d+)?/?\\S*",
+ mPattern = boost::regex(APP_HEADER_REGEX "/teleport/\\S+(/\\d+)?(/\\d+)?(/\\d+)?/?\\S*",
boost::regex::perl|boost::regex::icase);
mMenuName = "menu_url_teleport.xml";
mTooltip = LLTrans::getString("TooltipTeleportUrl");
@@ -522,7 +618,12 @@ std::string LLUrlEntryTeleport::getLabel(const std::string &url, const LLUrlLabe
LLURI uri(url);
LLSD path_array = uri.pathArray();
S32 path_parts = path_array.size();
- const std::string label = LLTrans::getString("SLurlLabelTeleport");
+ std::string host = uri.hostName();
+ std::string label = LLTrans::getString("SLurlLabelTeleport");
+ if (!host.empty())
+ {
+ label += " " + host;
+ }
if (path_parts == 6)
{
// handle teleport url with (X,Y,Z) coordinates
@@ -602,12 +703,26 @@ std::string LLUrlEntrySLLabel::getUrl(const std::string &string) const
return getUrlFromWikiLink(string);
}
+std::string LLUrlEntrySLLabel::getTooltip(const std::string &string) const
+{
+ // return a tooltip corresponding to the URL type instead of the generic one (EXT-4574)
+ std::string url = getUrl(string);
+ LLUrlMatch match;
+ if (LLUrlRegistry::instance().findUrl(url, match))
+ {
+ return match.getTooltip();
+ }
+
+ // unrecognized URL? should not happen
+ return LLUrlEntryBase::getTooltip(string);
+}
+
//
// LLUrlEntryWorldMap Describes secondlife:///<location> URLs
//
LLUrlEntryWorldMap::LLUrlEntryWorldMap()
{
- mPattern = boost::regex("secondlife:///app/worldmap/\\S+/?(\\d+)?/?(\\d+)?/?(\\d+)?/?\\S*",
+ mPattern = boost::regex(APP_HEADER_REGEX "/worldmap/\\S+/?(\\d+)?/?(\\d+)?/?(\\d+)?/?\\S*",
boost::regex::perl|boost::regex::icase);
mMenuName = "menu_url_map.xml";
mTooltip = LLTrans::getString("TooltipMapUrl");
@@ -630,7 +745,7 @@ std::string LLUrlEntryWorldMap::getLabel(const std::string &url, const LLUrlLabe
}
const std::string label = LLTrans::getString("SLurlLabelShowOnMap");
- std::string location = path_array[2];
+ std::string location = unescapeUrl(path_array[2]);
std::string x = (path_parts > 3) ? path_array[3] : "128";
std::string y = (path_parts > 4) ? path_array[4] : "128";
std::string z = (path_parts > 5) ? path_array[5] : "0";
@@ -663,3 +778,35 @@ std::string LLUrlEntryNoLink::getLabel(const std::string &url, const LLUrlLabelC
{
return getUrl(url);
}
+
+//
+// LLUrlEntryIcon describes an icon with <icon>...</icon> tags
+//
+LLUrlEntryIcon::LLUrlEntryIcon()
+{
+ mPattern = boost::regex("<icon\\s*>\\s*([^<]*)?\\s*</icon\\s*>",
+ boost::regex::perl|boost::regex::icase);
+ mDisabledLink = true;
+}
+
+std::string LLUrlEntryIcon::getUrl(const std::string &url) const
+{
+ return LLStringUtil::null;
+}
+
+std::string LLUrlEntryIcon::getLabel(const std::string &url, const LLUrlLabelCallback &cb)
+{
+ return LLStringUtil::null;
+}
+
+std::string LLUrlEntryIcon::getIcon(const std::string &url)
+{
+ // Grep icon info between <icon>...</icon> tags
+ // matches[1] contains the icon name/path
+ boost::match_results<std::string::const_iterator> matches;
+ mIcon = (boost::regex_match(url, matches, mPattern) && matches[1].matched)
+ ? matches[1]
+ : LLStringUtil::null;
+ LLStringUtil::trim(mIcon);
+ return mIcon;
+}
diff --git a/indra/llui/llurlentry.h b/indra/llui/llurlentry.h
index 3abada0f24..3c21fe8d61 100644
--- a/indra/llui/llurlentry.h
+++ b/indra/llui/llurlentry.h
@@ -77,13 +77,13 @@ public:
virtual std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb) { return url; }
/// Return an icon that can be displayed next to Urls of this type
- std::string getIcon() const { return mIcon; }
+ virtual std::string getIcon(const std::string &url) { return mIcon; }
/// Return the color to render the displayed text
LLUIColor getColor() const { return mColor; }
/// Given a matched Url, return a tooltip string for the hyperlink
- std::string getTooltip() const { return mTooltip; }
+ virtual std::string getTooltip(const std::string &string) const { return mTooltip; }
/// Return the name of a XUI file containing the context menu items
std::string getMenuName() const { return mMenuName; }
@@ -94,6 +94,8 @@ public:
/// is this a match for a URL that should not be hyperlinked?
bool isLinkDisabled() const { return mDisabledLink; }
+ virtual LLUUID getID(const std::string &string) const { return LLUUID::null; }
+
protected:
std::string getIDStringFromUrl(const std::string &url) const;
std::string escapeUrl(const std::string &url) const;
@@ -169,6 +171,7 @@ class LLUrlEntryAgent : public LLUrlEntryBase
public:
LLUrlEntryAgent();
/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
+ /*virtual*/ std::string getTooltip(const std::string &string) const;
private:
void onAgentNameReceived(const LLUUID& id, const std::string& first,
const std::string& last, BOOL is_group);
@@ -200,6 +203,18 @@ public:
private:
};
+///
+/// LLUrlEntryObjectIM Describes a Second Life inspector for the object Url, e.g.,
+/// secondlife:///app/objectim/7bcd7864-da6b-e43f-4486-91d28a28d95b?name=Object&owner=3de548e1-57be-cfea-2b78-83ae3ad95998&slurl=Danger!%20Danger!/200/200/30/&groupowned=1
+///
+class LLUrlEntryObjectIM : public LLUrlEntryBase
+{
+public:
+ LLUrlEntryObjectIM();
+ /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
+ /*virtual*/ std::string getLocation(const std::string &url) const;
+private:
+};
///
/// LLUrlEntryParcel Describes a Second Life parcel Url, e.g.,
@@ -257,6 +272,7 @@ public:
LLUrlEntrySLLabel();
/*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
/*virtual*/ std::string getUrl(const std::string &string) const;
+ /*virtual*/ std::string getTooltip(const std::string &string) const;
};
///
@@ -282,4 +298,17 @@ public:
/*virtual*/ std::string getUrl(const std::string &string) const;
};
+///
+/// LLUrlEntryIcon describes an icon with <icon>...</icon> tags
+///
+class LLUrlEntryIcon : public LLUrlEntryBase
+{
+public:
+ LLUrlEntryIcon();
+ /*virtual*/ std::string getUrl(const std::string &string) const;
+ /*virtual*/ std::string getLabel(const std::string &url, const LLUrlLabelCallback &cb);
+ /*virtual*/ std::string getIcon(const std::string &url);
+};
+
+
#endif
diff --git a/indra/llui/llurlmatch.cpp b/indra/llui/llurlmatch.cpp
index 72a199c220..7c96665ce4 100644
--- a/indra/llui/llurlmatch.cpp
+++ b/indra/llui/llurlmatch.cpp
@@ -51,7 +51,7 @@ void LLUrlMatch::setValues(U32 start, U32 end, const std::string &url,
const std::string &label, const std::string &tooltip,
const std::string &icon, const LLUIColor& color,
const std::string &menu, const std::string &location,
- bool disabled_link)
+ bool disabled_link, const LLUUID& id)
{
mStart = start;
mEnd = end;
@@ -63,4 +63,5 @@ void LLUrlMatch::setValues(U32 start, U32 end, const std::string &url,
mMenuName = menu;
mLocation = location;
mDisabledLink = disabled_link;
+ mID = id;
}
diff --git a/indra/llui/llurlmatch.h b/indra/llui/llurlmatch.h
index e86762548b..78dd2c528f 100644
--- a/indra/llui/llurlmatch.h
+++ b/indra/llui/llurlmatch.h
@@ -90,7 +90,10 @@ public:
void setValues(U32 start, U32 end, const std::string &url, const std::string &label,
const std::string &tooltip, const std::string &icon,
const LLUIColor& color, const std::string &menu,
- const std::string &location, bool disabled_link);
+ const std::string &location, bool disabled_link
+ , const LLUUID& id );
+
+ const LLUUID& getID() const { return mID;}
private:
U32 mStart;
@@ -101,6 +104,8 @@ private:
std::string mIcon;
std::string mMenuName;
std::string mLocation;
+
+ LLUUID mID;
LLUIColor mColor;
bool mDisabledLink;
};
diff --git a/indra/llui/llurlregistry.cpp b/indra/llui/llurlregistry.cpp
index 722dbe41b3..1f86f72faa 100644
--- a/indra/llui/llurlregistry.cpp
+++ b/indra/llui/llurlregistry.cpp
@@ -45,6 +45,7 @@ LLUrlRegistry::LLUrlRegistry()
{
// Urls are matched in the order that they were registered
registerUrl(new LLUrlEntryNoLink());
+ registerUrl(new LLUrlEntryIcon());
registerUrl(new LLUrlEntrySLURL());
registerUrl(new LLUrlEntryHTTP());
registerUrl(new LLUrlEntryHTTPLabel());
@@ -53,8 +54,10 @@ LLUrlRegistry::LLUrlRegistry()
registerUrl(new LLUrlEntryParcel());
registerUrl(new LLUrlEntryTeleport());
registerUrl(new LLUrlEntryWorldMap());
+ registerUrl(new LLUrlEntryObjectIM());
registerUrl(new LLUrlEntryPlace());
registerUrl(new LLUrlEntryInventory());
+ registerUrl(new LLUrlEntryObjectIM());
//LLUrlEntrySL and LLUrlEntrySLLabel have more common pattern,
//so it should be registered in the end of list
registerUrl(new LLUrlEntrySL());
@@ -133,7 +136,8 @@ static bool stringHasUrl(const std::string &text)
text.find(".net") != std::string::npos ||
text.find(".edu") != std::string::npos ||
text.find(".org") != std::string::npos ||
- text.find("<nolink>") != std::string::npos);
+ text.find("<nolink>") != std::string::npos ||
+ text.find("<icon") != std::string::npos);
}
bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LLUrlLabelCallback &cb)
@@ -174,12 +178,13 @@ bool LLUrlRegistry::findUrl(const std::string &text, LLUrlMatch &match, const LL
match.setValues(match_start, match_end,
match_entry->getUrl(url),
match_entry->getLabel(url, cb),
- match_entry->getTooltip(),
- match_entry->getIcon(),
+ match_entry->getTooltip(url),
+ match_entry->getIcon(url),
match_entry->getColor(),
match_entry->getMenuName(),
match_entry->getLocation(url),
- match_entry->isLinkDisabled());
+ match_entry->isLinkDisabled(),
+ match_entry->getID(url));
return true;
}
@@ -213,7 +218,8 @@ bool LLUrlRegistry::findUrl(const LLWString &text, LLUrlMatch &match, const LLUr
match.getColor(),
match.getMenuName(),
match.getLocation(),
- match.isLinkDisabled());
+ match.isLinkDisabled(),
+ match.getID());
return true;
}
return false;
diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp
index f1b08c380b..bd56da9121 100644
--- a/indra/llui/llview.cpp
+++ b/indra/llui/llview.cpp
@@ -73,9 +73,9 @@ S32 LLView::sLastBottomXML = S32_MIN;
std::vector<LLViewDrawContext*> LLViewDrawContext::sDrawContextStack;
-#if LL_DEBUG
+//#if LL_DEBUG
BOOL LLView::sIsDrawing = FALSE;
-#endif
+//#endif
// Compiler optimization, generate extern template
template class LLView* LLView::getChild<class LLView>(
@@ -107,8 +107,6 @@ LLView::Params::Params()
top_delta("top_delta", S32_MAX),
left_pad("left_pad"),
left_delta("left_delta", S32_MAX),
- center_horiz("center_horiz", false),
- center_vert("center_vert", false),
from_xui("from_xui", false),
user_resize("user_resize"),
auto_resize("auto_resize"),
@@ -150,6 +148,10 @@ LLView::~LLView()
{
dirtyRect();
//llinfos << "Deleting view " << mName << ":" << (void*) this << llendl;
+ if (LLView::sIsDrawing)
+ {
+ lldebugs << "Deleting view " << mName << " during UI draw() phase" << llendl;
+ }
// llassert(LLView::sIsDrawing == FALSE);
// llassert_always(sDepth == 0); // avoid deleting views while drawing! It can subtly break list iterators
@@ -592,11 +594,6 @@ void LLView::setVisible(BOOL visible)
{
if ( mVisible != visible )
{
- if( !visible && (gFocusMgr.getTopCtrl() == this) )
- {
- gFocusMgr.setTopCtrl( NULL );
- }
-
mVisible = visible;
// notify children of visibility change if root, or part of visible hierarchy
@@ -1326,7 +1323,6 @@ void LLView::drawChildren()
localRectToScreen(viewp->getRect(),&screenRect);
if ( rootRect.overlaps(screenRect) && LLUI::sDirtyRect.overlaps(screenRect))
{
- glMatrixMode(GL_MODELVIEW);
LLUI::pushMatrix();
{
LLUI::translate((F32)viewp->getRect().mLeft, (F32)viewp->getRect().mBottom, 0.f);
@@ -1350,8 +1346,6 @@ void LLView::drawChildren()
}
--sDepth;
}
-
- gGL.getTexUnit(0)->disable();
}
void LLView::dirtyRect()
@@ -1720,6 +1714,7 @@ LLView* LLView::findChildView(const std::string& name, BOOL recurse) const
for ( child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
{
LLView* childp = *child_it;
+ llassert(childp);
if (childp->getName() == name)
{
return childp;
@@ -1731,6 +1726,7 @@ LLView* LLView::findChildView(const std::string& name, BOOL recurse) const
for ( child_it = mChildList.begin(); child_it != mChildList.end(); ++child_it)
{
LLView* childp = *child_it;
+ llassert(childp);
LLView* viewp = childp->findChildView(name, recurse);
if ( viewp )
{
@@ -2501,7 +2497,6 @@ void LLView::applyXUILayout(LLView::Params& p, LLView* parent)
p.layout = parent->getLayout();
}
-
if (parent)
{
LLRect parent_rect = parent->getLocalRect();
@@ -2509,60 +2504,21 @@ void LLView::applyXUILayout(LLView::Params& p, LLView* parent)
LLRect last_rect = parent->getLocalRect();
bool layout_topleft = (p.layout() == "topleft");
- if (layout_topleft)
- {
- //invert top to bottom
- if (p.rect.top.isProvided()) p.rect.top = parent_rect.getHeight() - p.rect.top;
- if (p.rect.bottom.isProvided()) p.rect.bottom = parent_rect.getHeight() - p.rect.bottom;
- }
// convert negative or centered coordinates to parent relative values
// Note: some of this logic matches the logic in TypedParam<LLRect>::setValueFromBlock()
+ if (p.rect.left.isProvided() && p.rect.left < 0) p.rect.left = p.rect.left + parent_rect.getWidth();
+ if (p.rect.right.isProvided() && p.rect.right < 0) p.rect.right = p.rect.right + parent_rect.getWidth();
+ if (p.rect.bottom.isProvided() && p.rect.bottom < 0) p.rect.bottom = p.rect.bottom + parent_rect.getHeight();
+ if (p.rect.top.isProvided() && p.rect.top < 0) p.rect.top = p.rect.top + parent_rect.getHeight();
- if (p.center_horiz)
- {
- if (p.rect.left.isProvided() && p.rect.right.isProvided())
- {
- S32 width = p.rect.right - p.rect.left;
- width = llmax(width, 0);
- S32 offset = parent_rect.getWidth()/2 - width/2;
- p.rect.left = p.rect.left + offset;
- p.rect.right = p.rect.right + offset;
- }
- else
- {
- p.rect.left = p.rect.left + parent_rect.getWidth()/2 - p.rect.width/2;
- p.rect.right.setProvided(false); // recalculate the right
- }
- }
- else
- {
- if (p.rect.left.isProvided() && p.rect.left < 0) p.rect.left = p.rect.left + parent_rect.getWidth();
- if (p.rect.right.isProvided() && p.rect.right < 0) p.rect.right = p.rect.right + parent_rect.getWidth();
- }
- if (p.center_vert)
- {
- if (p.rect.bottom.isProvided() && p.rect.top.isProvided())
- {
- S32 height = p.rect.top - p.rect.bottom;
- height = llmax(height, 0);
- S32 offset = parent_rect.getHeight()/2 - height/2;
- p.rect.bottom = p.rect.bottom + offset;
- p.rect.top = p.rect.top + offset;
- }
- else
- {
- p.rect.bottom = p.rect.bottom + parent_rect.getHeight()/2 - p.rect.height/2;
- p.rect.top.setProvided(false); // recalculate the top
- }
- }
- else
+ if (layout_topleft)
{
- if (p.rect.bottom.isProvided() && p.rect.bottom < 0) p.rect.bottom = p.rect.bottom + parent_rect.getHeight();
- if (p.rect.top.isProvided() && p.rect.top < 0) p.rect.top = p.rect.top + parent_rect.getHeight();
+ //invert top to bottom
+ if (p.rect.top.isProvided()) p.rect.top = parent_rect.getHeight() - p.rect.top;
+ if (p.rect.bottom.isProvided()) p.rect.bottom = parent_rect.getHeight() - p.rect.bottom;
}
-
// DEPRECATE: automatically fall back to height of MIN_WIDGET_HEIGHT pixels
if (!p.rect.height.isProvided() && !p.rect.top.isProvided() && p.rect.height == 0)
{
diff --git a/indra/llui/llview.h b/indra/llui/llview.h
index c4d7313743..3779fedf34 100644
--- a/indra/llui/llview.h
+++ b/indra/llui/llview.h
@@ -143,9 +143,6 @@ public:
left_pad, // from last right to my left
left_delta; // from last left to my left
- Optional<bool> center_horiz,
- center_vert;
-
// these are nested attributes for LLLayoutPanel
//FIXME: get parent context involved in parsing traversal
Ignored user_resize,
@@ -171,9 +168,9 @@ private:
// widgets in general are not copyable
LLView(const LLView& other) {};
public:
-#if LL_DEBUG
+//#if LL_DEBUG
static BOOL sIsDrawing;
-#endif
+//#endif
enum ESoundFlags
{
SILENT = 0,
diff --git a/indra/llui/llviewborder.cpp b/indra/llui/llviewborder.cpp
index 30717f87de..bd9c43c97f 100644
--- a/indra/llui/llviewborder.cpp
+++ b/indra/llui/llviewborder.cpp
@@ -125,14 +125,6 @@ void LLViewBorder::draw()
llassert( FALSE ); // not implemented
}
}
- else
- if( STYLE_TEXTURE == mStyle )
- {
- if( mTexture )
- {
- drawTextures();
- }
- }
LLView::draw();
}
@@ -255,56 +247,6 @@ void LLViewBorder::drawTwoPixelLines()
gl_line_2d(left+1, bottom+1, right-1, bottom+1);
}
-void LLViewBorder::drawTextures()
-{
- //LLGLSUIDefault gls_ui;
-
- //llassert( FALSE ); // TODO: finish implementing
-
- //gGL.color4fv(UI_VERTEX_COLOR.mV);
-
- //gGL.getTexUnit(0)->bind(mTexture);
- //gGL.getTexUnit(0)->setTextureAddressMode(LLTexUnit::TAM_WRAP);
-
- //drawTextureTrapezoid( 0.f, mBorderWidth, getRect().getWidth(), 0, 0 );
- //drawTextureTrapezoid( 90.f, mBorderWidth, getRect().getHeight(), (F32)getRect().getWidth(),0 );
- //drawTextureTrapezoid( 180.f, mBorderWidth, getRect().getWidth(), (F32)getRect().getWidth(),(F32)getRect().getHeight() );
- //drawTextureTrapezoid( 270.f, mBorderWidth, getRect().getHeight(), 0, (F32)getRect().getHeight() );
-}
-
-
-void LLViewBorder::drawTextureTrapezoid( F32 degrees, S32 width, S32 length, F32 start_x, F32 start_y )
-{
- gGL.pushMatrix();
- {
- gGL.translatef(start_x, start_y, 0.f);
- glRotatef( degrees, 0, 0, 1 );
-
- gGL.begin(LLRender::QUADS);
- {
- // width, width /---------\ length-width, width //
- // / \ //
- // / \ //
- // /---------------\ //
- // 0,0 length, 0 //
-
- gGL.texCoord2f( 0, 0 );
- gGL.vertex2i( 0, 0 );
-
- gGL.texCoord2f( (GLfloat)length, 0 );
- gGL.vertex2i( length, 0 );
-
- gGL.texCoord2f( (GLfloat)(length - width), (GLfloat)width );
- gGL.vertex2i( length - width, width );
-
- gGL.texCoord2f( (GLfloat)width, (GLfloat)width );
- gGL.vertex2i( width, width );
- }
- gGL.end();
- }
- gGL.popMatrix();
-}
-
BOOL LLViewBorder::getBevelFromAttribute(LLXMLNodePtr node, LLViewBorder::EBevel& bevel_style)
{
if (node->hasAttribute("bevel_style"))
diff --git a/indra/llui/llviewborder.h b/indra/llui/llviewborder.h
index 92fd569325..342e84fd93 100644
--- a/indra/llui/llviewborder.h
+++ b/indra/llui/llviewborder.h
@@ -99,8 +99,7 @@ private:
void drawOnePixelLines();
void drawTwoPixelLines();
void drawTextures();
- void drawTextureTrapezoid( F32 degrees, S32 width, S32 length, F32 start_x, F32 start_y );
-
+
EBevel mBevel;
EStyle mStyle;
LLUIColor mHighlightLight;
diff --git a/indra/llui/tests/llurlentry_test.cpp b/indra/llui/tests/llurlentry_test.cpp
index cbb303a059..4463b6cc6f 100644
--- a/indra/llui/tests/llurlentry_test.cpp
+++ b/indra/llui/tests/llurlentry_test.cpp
@@ -286,6 +286,13 @@ namespace tut
"XXX secondlife:///App/AGENT/0E346D8B-4433-4d66-a6b0-fd37083abc4c/foobar",
"secondlife:///App/AGENT/0E346D8B-4433-4d66-a6b0-fd37083abc4c/foobar");
+ testRegex("Standalone Agent Url ", url,
+ "x-grid-location-info://lincoln.lindenlab.com/app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about",
+ "x-grid-location-info://lincoln.lindenlab.com/app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about");
+
+ testRegex("Standalone Agent Url Multicase with Text", url,
+ "M x-grid-location-info://lincoln.lindenlab.com/app/AGENT/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about M",
+ "x-grid-location-info://lincoln.lindenlab.com/app/AGENT/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about");
}
template<> template<>
@@ -315,6 +322,15 @@ namespace tut
testRegex("Group Url multicase", url,
"XXX secondlife:///APP/Group/00005FF3-4044-c79f-9de8-fb28ae0df991/About XXX",
"secondlife:///APP/Group/00005FF3-4044-c79f-9de8-fb28ae0df991/About");
+
+ testRegex("Standalone Group Url ", url,
+ "x-grid-location-info://lincoln.lindenlab.com/app/group/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about",
+ "x-grid-location-info://lincoln.lindenlab.com/app/group/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about");
+
+ testRegex("Standalone Group Url Multicase ith Text", url,
+ "M x-grid-location-info://lincoln.lindenlab.com/app/GROUP/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about M",
+ "x-grid-location-info://lincoln.lindenlab.com/app/GROUP/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about");
+
}
template<> template<>
@@ -361,7 +377,11 @@ namespace tut
// DEV-35459: SLURLs and teleport Links not parsed properly
testRegex("SLURL with quote", url,
"XXX secondlife://A'ksha%20Oasis/41/166/701 XXX",
- "secondlife://A%27ksha%20Oasis/41/166/701");
+ "secondlife://A%27ksha%20Oasis/41/166/701");
+
+ testRegex("Standalone All Hands (50,50) [2] with text", url,
+ "XXX x-grid-location-info://lincoln.lindenlab.com/region/All%20Hands/50/50/50 XXX",
+ "x-grid-location-info://lincoln.lindenlab.com/region/All%20Hands/50/50/50");
}
template<> template<>
@@ -461,6 +481,10 @@ namespace tut
testRegex("Teleport url with quote", url,
"XXX secondlife:///app/teleport/A'ksha%20Oasis/41/166/701 XXX",
"secondlife:///app/teleport/A%27ksha%20Oasis/41/166/701");
+
+ testRegex("Standalone All Hands", url,
+ "XXX x-grid-location-info://lincoln.lindenlab.com/app/teleport/All%20Hands/50/50/50 XXX",
+ "x-grid-location-info://lincoln.lindenlab.com/app/teleport/All%20Hands/50/50/50");
}
template<> template<>
diff --git a/indra/llui/tests/llurlmatch_test.cpp b/indra/llui/tests/llurlmatch_test.cpp
index 24a32de268..06b850d233 100644
--- a/indra/llui/tests/llurlmatch_test.cpp
+++ b/indra/llui/tests/llurlmatch_test.cpp
@@ -54,7 +54,7 @@ namespace tut
LLUrlMatch match;
ensure("empty()", match.empty());
- match.setValues(0, 1, "http://secondlife.com", "Second Life", "", "", LLUIColor(), "", "", false);
+ match.setValues(0, 1, "http://secondlife.com", "Second Life", "", "", LLUIColor(), "", "", false,LLUUID::null);
ensure("! empty()", ! match.empty());
}
@@ -67,7 +67,7 @@ namespace tut
LLUrlMatch match;
ensure_equals("getStart() == 0", match.getStart(), 0);
- match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false);
+ match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null);
ensure_equals("getStart() == 10", match.getStart(), 10);
}
@@ -80,7 +80,7 @@ namespace tut
LLUrlMatch match;
ensure_equals("getEnd() == 0", match.getEnd(), 0);
- match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false);
+ match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null);
ensure_equals("getEnd() == 20", match.getEnd(), 20);
}
@@ -93,10 +93,10 @@ namespace tut
LLUrlMatch match;
ensure_equals("getUrl() == ''", match.getUrl(), "");
- match.setValues(10, 20, "http://slurl.com/", "", "", "", LLUIColor(), "", "", false);
+ match.setValues(10, 20, "http://slurl.com/", "", "", "", LLUIColor(), "", "", false,LLUUID::null);
ensure_equals("getUrl() == 'http://slurl.com/'", match.getUrl(), "http://slurl.com/");
- match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false);
+ match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null);
ensure_equals("getUrl() == '' (2)", match.getUrl(), "");
}
@@ -109,10 +109,10 @@ namespace tut
LLUrlMatch match;
ensure_equals("getLabel() == ''", match.getLabel(), "");
- match.setValues(10, 20, "", "Label", "", "", LLUIColor(), "", "", false);
+ match.setValues(10, 20, "", "Label", "", "", LLUIColor(), "", "", false,LLUUID::null);
ensure_equals("getLabel() == 'Label'", match.getLabel(), "Label");
- match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false);
+ match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null);
ensure_equals("getLabel() == '' (2)", match.getLabel(), "");
}
@@ -125,10 +125,10 @@ namespace tut
LLUrlMatch match;
ensure_equals("getTooltip() == ''", match.getTooltip(), "");
- match.setValues(10, 20, "", "", "Info", "", LLUIColor(), "", "", false);
+ match.setValues(10, 20, "", "", "Info", "", LLUIColor(), "", "", false,LLUUID::null);
ensure_equals("getTooltip() == 'Info'", match.getTooltip(), "Info");
- match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false);
+ match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null);
ensure_equals("getTooltip() == '' (2)", match.getTooltip(), "");
}
@@ -141,10 +141,10 @@ namespace tut
LLUrlMatch match;
ensure_equals("getIcon() == ''", match.getIcon(), "");
- match.setValues(10, 20, "", "", "", "Icon", LLUIColor(), "", "", false);
+ match.setValues(10, 20, "", "", "", "Icon", LLUIColor(), "", "", false,LLUUID::null);
ensure_equals("getIcon() == 'Icon'", match.getIcon(), "Icon");
- match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false);
+ match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null);
ensure_equals("getIcon() == '' (2)", match.getIcon(), "");
}
@@ -157,10 +157,10 @@ namespace tut
LLUrlMatch match;
ensure("getMenuName() empty", match.getMenuName().empty());
- match.setValues(10, 20, "", "", "", "Icon", LLUIColor(), "xui_file.xml", "", false);
+ match.setValues(10, 20, "", "", "", "Icon", LLUIColor(), "xui_file.xml", "", false,LLUUID::null);
ensure_equals("getMenuName() == \"xui_file.xml\"", match.getMenuName(), "xui_file.xml");
- match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false);
+ match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null);
ensure("getMenuName() empty (2)", match.getMenuName().empty());
}
@@ -173,10 +173,10 @@ namespace tut
LLUrlMatch match;
ensure("getLocation() empty", match.getLocation().empty());
- match.setValues(10, 20, "", "", "", "Icon", LLUIColor(), "xui_file.xml", "Paris", false);
+ match.setValues(10, 20, "", "", "", "Icon", LLUIColor(), "xui_file.xml", "Paris", false,LLUUID::null);
ensure_equals("getLocation() == \"Paris\"", match.getLocation(), "Paris");
- match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false);
+ match.setValues(10, 20, "", "", "", "", LLUIColor(), "", "", false,LLUUID::null);
ensure("getLocation() empty (2)", match.getLocation().empty());
}
}
diff --git a/indra/llvfs/lldir.cpp b/indra/llvfs/lldir.cpp
index da4abde451..795aa8327d 100644
--- a/indra/llvfs/lldir.cpp
+++ b/indra/llvfs/lldir.cpp
@@ -91,15 +91,16 @@ S32 LLDir::deleteFilesInDir(const std::string &dirname, const std::string &mask)
S32 result;
while (getNextFileInDir(dirname, mask, filename, FALSE))
{
- if ((filename == ".") || (filename == ".."))
+ fullpath = dirname;
+ fullpath += getDirDelimiter();
+ fullpath += filename;
+
+ if(LLFile::isdir(fullpath))
{
// skipping directory traversal filenames
count++;
continue;
}
- fullpath = dirname;
- fullpath += getDirDelimiter();
- fullpath += filename;
S32 retry_count = 0;
while (retry_count < 5)
@@ -459,7 +460,6 @@ std::string LLDir::getExpandedFilename(ELLPath location, const std::string& subd
}
//llinfos << "*** EXPANDED FILENAME: <" << expanded_filename << ">" << llendl;
-
return expanded_filename;
}
@@ -565,27 +565,23 @@ std::string LLDir::getForbiddenFileChars()
return "\\/:*?\"<>|";
}
-void LLDir::setLindenUserDir(const std::string &first, const std::string &last)
+void LLDir::setLindenUserDir(const std::string &username)
{
- // if both first and last aren't set, that's bad.
- if (!first.empty() && !last.empty())
+ // if the username isn't set, that's bad
+ if (!username.empty())
{
// some platforms have case-sensitive filesystems, so be
// utterly consistent with our firstname/lastname case.
- std::string firstlower(first);
- LLStringUtil::toLower(firstlower);
- std::string lastlower(last);
- LLStringUtil::toLower(lastlower);
+ std::string userlower(username);
+ LLStringUtil::toLower(userlower);
+ LLStringUtil::replaceChar(userlower, ' ', '_');
mLindenUserDir = getOSUserAppDir();
mLindenUserDir += mDirDelimiter;
- mLindenUserDir += firstlower;
- mLindenUserDir += "_";
- mLindenUserDir += lastlower;
- llinfos << "Got name for LLDir::setLindenUserDir(first='" << first << "', last='" << last << "')" << llendl;
+ mLindenUserDir += userlower;
}
else
{
- llerrs << "Invalid name for LLDir::setLindenUserDir(first='" << first << "', last='" << last << "')" << llendl;
+ llerrs << "NULL name for LLDir::setLindenUserDir" << llendl;
}
dumpCurrentDirectories();
@@ -603,27 +599,25 @@ void LLDir::setChatLogsDir(const std::string &path)
}
}
-void LLDir::setPerAccountChatLogsDir(const std::string &first, const std::string &last)
+void LLDir::setPerAccountChatLogsDir(const std::string &username)
{
// if both first and last aren't set, assume we're grabbing the cached dir
- if (!first.empty() && !last.empty())
+ if (!username.empty())
{
// some platforms have case-sensitive filesystems, so be
// utterly consistent with our firstname/lastname case.
- std::string firstlower(first);
- LLStringUtil::toLower(firstlower);
- std::string lastlower(last);
- LLStringUtil::toLower(lastlower);
+ std::string userlower(username);
+ LLStringUtil::toLower(userlower);
+ LLStringUtil::replaceChar(userlower, ' ', '_');
mPerAccountChatLogsDir = getChatLogsDir();
mPerAccountChatLogsDir += mDirDelimiter;
- mPerAccountChatLogsDir += firstlower;
- mPerAccountChatLogsDir += "_";
- mPerAccountChatLogsDir += lastlower;
+ mPerAccountChatLogsDir += userlower;
}
else
{
- llwarns << "Invalid name for LLDir::setPerAccountChatLogsDir" << llendl;
+ llerrs << "NULL name for LLDir::setPerAccountChatLogsDir" << llendl;
}
+
}
void LLDir::setSkinFolder(const std::string &skin_folder)
diff --git a/indra/llvfs/lldir.h b/indra/llvfs/lldir.h
index 9067d75bac..05d5efc66f 100644
--- a/indra/llvfs/lldir.h
+++ b/indra/llvfs/lldir.h
@@ -137,8 +137,8 @@ class LLDir
static std::string getForbiddenFileChars();
virtual void setChatLogsDir(const std::string &path); // Set the chat logs dir to this user's dir
- virtual void setPerAccountChatLogsDir(const std::string &first, const std::string &last); // Set the per user chat log directory.
- virtual void setLindenUserDir(const std::string &first, const std::string &last); // Set the linden user dir to this user's dir
+ virtual void setPerAccountChatLogsDir(const std::string &username); // Set the per user chat log directory.
+ virtual void setLindenUserDir(const std::string &username); // Set the linden user dir to this user's dir
virtual void setSkinFolder(const std::string &skin_folder);
virtual bool setCacheDir(const std::string &path);
diff --git a/indra/llvfs/lldir_mac.cpp b/indra/llvfs/lldir_mac.cpp
index 7bc6f63e1f..8d3852002c 100644
--- a/indra/llvfs/lldir_mac.cpp
+++ b/indra/llvfs/lldir_mac.cpp
@@ -426,7 +426,7 @@ BOOL LLDir_Mac::fileExists(const std::string &filename) const
/*virtual*/ std::string LLDir_Mac::getLLPluginLauncher()
{
return gDirUtilp->getAppRODataDir() + gDirUtilp->getDirDelimiter() +
- "SLPlugin";
+ "SLPlugin.app/Contents/MacOS/SLPlugin";
}
/*virtual*/ std::string LLDir_Mac::getLLPluginFilename(std::string base_name)
diff --git a/indra/llvfs/lllfsthread.cpp b/indra/llvfs/lllfsthread.cpp
index e85cc437f4..49c198a82d 100644
--- a/indra/llvfs/lllfsthread.cpp
+++ b/indra/llvfs/lllfsthread.cpp
@@ -188,7 +188,7 @@ bool LLLFSThread::Request::processRequest()
if (mOperation == FILE_READ)
{
llassert(mOffset >= 0);
- LLAPRFile infile ;
+ LLAPRFile infile ; // auto-closes
infile.open(mFileName, LL_APR_RB, mThread->getLocalAPRFilePool());
if (!infile.getFileHandle())
{
@@ -204,7 +204,6 @@ bool LLLFSThread::Request::processRequest()
llassert_always(off >= 0);
mBytesRead = infile.read(mBuffer, mBytes );
complete = true;
- infile.close() ;
// llinfos << "LLLFSThread::READ:" << mFileName << " Bytes: " << mBytesRead << llendl;
}
else if (mOperation == FILE_WRITE)
@@ -212,7 +211,7 @@ bool LLLFSThread::Request::processRequest()
apr_int32_t flags = APR_CREATE|APR_WRITE|APR_BINARY;
if (mOffset < 0)
flags |= APR_APPEND;
- LLAPRFile outfile ;
+ LLAPRFile outfile ; // auto-closes
outfile.open(mFileName, flags, mThread->getLocalAPRFilePool());
if (!outfile.getFileHandle())
{
@@ -232,7 +231,6 @@ bool LLLFSThread::Request::processRequest()
}
mBytesRead = outfile.write(mBuffer, mBytes );
complete = true;
-
// llinfos << "LLLFSThread::WRITE:" << mFileName << " Bytes: " << mBytesRead << "/" << mBytes << " Offset:" << mOffset << llendl;
}
else
diff --git a/indra/llwindow/CMakeLists.txt b/indra/llwindow/CMakeLists.txt
index 77c6fa57b6..bf3233f386 100644
--- a/indra/llwindow/CMakeLists.txt
+++ b/indra/llwindow/CMakeLists.txt
@@ -113,6 +113,7 @@ if (WINDOWS)
)
list(APPEND llwindow_LINK_LIBRARIES
comdlg32 # Common Dialogs for ChooseColor
+ ole32
)
endif (WINDOWS)
diff --git a/indra/llwindow/lldragdropwin32.cpp b/indra/llwindow/lldragdropwin32.cpp
index 9b80fe0a84..b85960be10 100644
--- a/indra/llwindow/lldragdropwin32.cpp
+++ b/indra/llwindow/lldragdropwin32.cpp
@@ -50,7 +50,8 @@ class LLDragDropWin32Target:
LLDragDropWin32Target( HWND hWnd ) :
mRefCount( 1 ),
mAppWindowHandle( hWnd ),
- mAllowDrop( false)
+ mAllowDrop(false),
+ mIsSlurl(false)
{
};
diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h
index 127dbf45e0..52132c38d3 100644
--- a/indra/llwindow/llwindow.h
+++ b/indra/llwindow/llwindow.h
@@ -37,6 +37,7 @@
#include "llcoord.h"
#include "llstring.h"
#include "llcursortypes.h"
+#include "llsd.h"
class LLSplashScreen;
class LLPreeditor;
@@ -159,9 +160,12 @@ public:
virtual void setLanguageTextInput( const LLCoordGL & pos ) {};
virtual void updateLanguageTextInputArea() {}
virtual void interruptLanguageTextInput() {}
- virtual void spawnWebBrowser(const std::string& escaped_url) {};
+ virtual void spawnWebBrowser(const std::string& escaped_url, bool async) {};
static std::vector<std::string> getDynamicFallbackFontList();
+
+ // Provide native key event data
+ virtual LLSD getNativeKeyData() { return LLSD::emptyMap(); }
protected:
LLWindow(LLWindowCallbacks* callbacks, BOOL fullscreen, U32 flags);
diff --git a/indra/llwindow/llwindowmacosx.cpp b/indra/llwindow/llwindowmacosx.cpp
index 9ccd4c7f97..7026a3f7a6 100644
--- a/indra/llwindow/llwindowmacosx.cpp
+++ b/indra/llwindow/llwindowmacosx.cpp
@@ -260,6 +260,7 @@ LLWindowMacOSX::LLWindowMacOSX(LLWindowCallbacks* callbacks,
mTSMScriptCode = 0;
mTSMLangCode = 0;
mPreeditor = NULL;
+ mRawKeyEvent = NULL;
mFSAASamples = fsaa_samples;
mForceRebuild = FALSE;
@@ -2140,10 +2141,11 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
{
UInt32 modifiers = 0;
+
// First, process the raw event.
{
- EventRef rawEvent;
-
+ EventRef rawEvent = NULL;
+
// Get the original event and extract the modifier keys, so we can ignore command-key events.
if (GetEventParameter(event, kEventParamTextInputSendKeyboardEvent, typeEventRef, NULL, sizeof(rawEvent), NULL, &rawEvent) == noErr)
{
@@ -2152,6 +2154,9 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
// and call this function recursively to handle the raw key event.
eventHandler (myHandler, rawEvent);
+
+ // save the raw event until we're done processing the unicode input as well.
+ mRawKeyEvent = rawEvent;
}
}
@@ -2202,6 +2207,7 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
delete[] buffer;
}
+ mRawKeyEvent = NULL;
result = err;
}
break;
@@ -2276,6 +2282,9 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
GetEventParameter (event, kEventParamKeyCode, typeUInt32, NULL, sizeof(UInt32), NULL, &keyCode);
GetEventParameter (event, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers);
+ // save the raw event so getNativeKeyData can use it.
+ mRawKeyEvent = event;
+
// printf("key event, key code = 0x%08x, char code = 0x%02x (%c), modifiers = 0x%08x\n", keyCode, charCode, (char)charCode, modifiers);
// fflush(stdout);
@@ -2371,6 +2380,8 @@ OSStatus LLWindowMacOSX::eventHandler (EventHandlerCallRef myHandler, EventRef e
result = eventNotHandledErr;
break;
}
+
+ mRawKeyEvent = NULL;
}
break;
@@ -2770,6 +2781,9 @@ const char* cursorIDToName(int id)
case UI_CURSOR_TOOLPAUSE: return "UI_CURSOR_TOOLPAUSE";
case UI_CURSOR_TOOLMEDIAOPEN: return "UI_CURSOR_TOOLMEDIAOPEN";
case UI_CURSOR_PIPETTE: return "UI_CURSOR_PIPETTE";
+ case UI_CURSOR_TOOLSIT: return "UI_CURSOR_TOOLSIT";
+ case UI_CURSOR_TOOLBUY: return "UI_CURSOR_TOOLBUY";
+ case UI_CURSOR_TOOLOPEN: return "UI_CURSOR_TOOLOPEN";
}
llerrs << "cursorIDToName: unknown cursor id" << id << llendl;
@@ -2872,6 +2886,9 @@ void LLWindowMacOSX::setCursor(ECursorType cursor)
case UI_CURSOR_TOOLPLAY:
case UI_CURSOR_TOOLPAUSE:
case UI_CURSOR_TOOLMEDIAOPEN:
+ case UI_CURSOR_TOOLSIT:
+ case UI_CURSOR_TOOLBUY:
+ case UI_CURSOR_TOOLOPEN:
result = setImageCursor(gCursors[cursor]);
break;
@@ -2913,6 +2930,9 @@ void LLWindowMacOSX::initCursors()
initPixmapCursor(UI_CURSOR_TOOLPLAY, 1, 1);
initPixmapCursor(UI_CURSOR_TOOLPAUSE, 1, 1);
initPixmapCursor(UI_CURSOR_TOOLMEDIAOPEN, 1, 1);
+ initPixmapCursor(UI_CURSOR_TOOLSIT, 20, 15);
+ initPixmapCursor(UI_CURSOR_TOOLBUY, 20, 15);
+ initPixmapCursor(UI_CURSOR_TOOLOPEN, 20, 15);
initPixmapCursor(UI_CURSOR_SIZENWSE, 10, 10);
initPixmapCursor(UI_CURSOR_SIZENESW, 10, 10);
@@ -3158,7 +3178,7 @@ S32 OSMessageBoxMacOSX(const std::string& text, const std::string& caption, U32
// Open a URL with the user's default web browser.
// Must begin with protocol identifier.
-void LLWindowMacOSX::spawnWebBrowser(const std::string& escaped_url)
+void LLWindowMacOSX::spawnWebBrowser(const std::string& escaped_url, bool async)
{
bool found = false;
S32 i;
@@ -3211,6 +3231,60 @@ void LLWindowMacOSX::spawnWebBrowser(const std::string& escaped_url)
}
}
+LLSD LLWindowMacOSX::getNativeKeyData()
+{
+ LLSD result = LLSD::emptyMap();
+
+ if(mRawKeyEvent)
+ {
+ char char_code = 0;
+ UInt32 key_code = 0;
+ UInt32 modifiers = 0;
+ UInt32 keyboard_type = 0;
+
+ GetEventParameter (mRawKeyEvent, kEventParamKeyMacCharCodes, typeChar, NULL, sizeof(char), NULL, &char_code);
+ GetEventParameter (mRawKeyEvent, kEventParamKeyCode, typeUInt32, NULL, sizeof(UInt32), NULL, &key_code);
+ GetEventParameter (mRawKeyEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(UInt32), NULL, &modifiers);
+ GetEventParameter (mRawKeyEvent, kEventParamKeyboardType, typeUInt32, NULL, sizeof(UInt32), NULL, &keyboard_type);
+
+ result["char_code"] = (S32)char_code;
+ result["key_code"] = (S32)key_code;
+ result["modifiers"] = (S32)modifiers;
+ result["keyboard_type"] = (S32)keyboard_type;
+
+#if 0
+ // This causes trouble for control characters -- apparently character codes less than 32 (escape, control-A, etc)
+ // cause llsd serialization to create XML that the llsd deserializer won't parse!
+ std::string unicode;
+ OSStatus err = noErr;
+ EventParamType actualType = typeUTF8Text;
+ UInt32 actualSize = 0;
+ char *buffer = NULL;
+
+ err = GetEventParameter (mRawKeyEvent, kEventParamKeyUnicodes, typeUTF8Text, &actualType, 0, &actualSize, NULL);
+ if(err == noErr)
+ {
+ // allocate a buffer and get the actual data.
+ buffer = new char[actualSize];
+ err = GetEventParameter (mRawKeyEvent, kEventParamKeyUnicodes, typeUTF8Text, &actualType, actualSize, &actualSize, buffer);
+ if(err == noErr)
+ {
+ unicode.assign(buffer, actualSize);
+ }
+ delete[] buffer;
+ }
+
+ result["unicode"] = unicode;
+#endif
+
+ }
+
+
+ lldebugs << "native key data is: " << result << llendl;
+
+ return result;
+}
+
BOOL LLWindowMacOSX::dialogColorPicker( F32 *r, F32 *g, F32 *b)
{
diff --git a/indra/llwindow/llwindowmacosx.h b/indra/llwindow/llwindowmacosx.h
index 377f10b6d4..5ac74bb004 100644
--- a/indra/llwindow/llwindowmacosx.h
+++ b/indra/llwindow/llwindowmacosx.h
@@ -116,10 +116,14 @@ public:
/*virtual*/ void allowLanguageTextInput(LLPreeditor *preeditor, BOOL b);
/*virtual*/ void interruptLanguageTextInput();
- /*virtual*/ void spawnWebBrowser(const std::string& escaped_url);
+ /*virtual*/ void spawnWebBrowser(const std::string& escaped_url, bool async);
static std::vector<std::string> getDynamicFallbackFontList();
+ // Provide native key event data
+ /*virtual*/ LLSD getNativeKeyData();
+
+
protected:
LLWindowMacOSX(LLWindowCallbacks* callbacks,
const std::string& title, const std::string& name, int x, int y, int width, int height, U32 flags,
@@ -218,6 +222,7 @@ protected:
friend class LLWindowManager;
static WindowRef sMediaWindow;
+ EventRef mRawKeyEvent;
};
diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp
index f9c3694459..399d284402 100644
--- a/indra/llwindow/llwindowsdl.cpp
+++ b/indra/llwindow/llwindowsdl.cpp
@@ -251,6 +251,10 @@ LLWindowSDL::LLWindowSDL(LLWindowCallbacks* callbacks,
#if LL_X11
mFlashing = FALSE;
#endif // LL_X11
+
+ mKeyScanCode = 0;
+ mKeyVirtualKey = 0;
+ mKeyModifiers = KMOD_NONE;
}
static SDL_Surface *Load_BMP_Resource(const char *basename)
@@ -1593,12 +1597,83 @@ U32 LLWindowSDL::SDLCheckGrabbyKeys(SDLKey keysym, BOOL gain)
return mGrabbyKeyFlags;
}
+
+void check_vm_bloat()
+{
+#if LL_LINUX
+ // watch our own VM and RSS sizes, warn if we bloated rapidly
+ FILE *fp = fopen("/proc/self/stat", "r");
+ if (fp)
+ {
+ static long long last_vm_size = 0;
+ static long long last_rss_size = 0;
+ const long long significant_vm_difference = 250 * 1024*1024;
+ const long long significant_rss_difference = 50 * 1024*1024;
+
+ ssize_t res;
+ size_t dummy;
+ char *ptr;
+ for (int i=0; i<22; ++i) // parse past the values we don't want
+ {
+ ptr = NULL;
+ res = getdelim(&ptr, &dummy, ' ', fp);
+ free(ptr);
+ }
+ // 23rd space-delimited entry is vsize
+ ptr = NULL;
+ res = getdelim(&ptr, &dummy, ' ', fp);
+ llassert(ptr);
+ long long this_vm_size = atoll(ptr);
+ free(ptr);
+ // 24th space-delimited entry is RSS
+ ptr = NULL;
+ res = getdelim(&ptr, &dummy, ' ', fp);
+ llassert(ptr);
+ long long this_rss_size = getpagesize() * atoll(ptr);
+ free(ptr);
+
+ llinfos << "VM SIZE IS NOW " << (this_vm_size/(1024*1024)) << " MB, RSS SIZE IS NOW " << (this_rss_size/(1024*1024)) << " MB" << llendl;
+
+ if (llabs(last_vm_size - this_vm_size) >
+ significant_vm_difference)
+ {
+ if (this_vm_size > last_vm_size)
+ {
+ llwarns << "VM size grew by " << (this_vm_size - last_vm_size)/(1024*1024) << " MB in last frame" << llendl;
+ }
+ else
+ {
+ llinfos << "VM size shrank by " << (last_vm_size - this_vm_size)/(1024*1024) << " MB in last frame" << llendl;
+ }
+ }
+
+ if (llabs(last_rss_size - this_rss_size) >
+ significant_rss_difference)
+ {
+ if (this_rss_size > last_rss_size)
+ {
+ llwarns << "RSS size grew by " << (this_rss_size - last_rss_size)/(1024*1024) << " MB in last frame" << llendl;
+ }
+ else
+ {
+ llinfos << "RSS size shrank by " << (last_rss_size - this_rss_size)/(1024*1024) << " MB in last frame" << llendl;
+ }
+ }
+
+ last_rss_size = this_rss_size;
+ last_vm_size = this_vm_size;
+
+ fclose(fp);
+ }
+#endif // LL_LINUX
+}
+
+
// virtual
void LLWindowSDL::processMiscNativeEvents()
{
#if LL_GTK
// Pump GTK events to avoid starvation for:
- // * Embedded Gecko
// * DBUS servicing
// * Anything else which quietly hooks into the default glib/GTK loop
if (ll_try_gtk_init())
@@ -1624,6 +1699,12 @@ void LLWindowSDL::processMiscNativeEvents()
setlocale(LC_ALL, saved_locale.c_str() );
}
#endif // LL_GTK
+
+ // hack - doesn't belong here - but this is just for debugging
+ if (getenv("LL_DEBUG_BLOAT"))
+ {
+ check_vm_bloat();
+ }
}
void LLWindowSDL::gatherInput()
@@ -1651,24 +1732,32 @@ void LLWindowSDL::gatherInput()
}
case SDL_KEYDOWN:
- gKeyboard->handleKeyDown(event.key.keysym.sym, event.key.keysym.mod);
- // part of the fix for SL-13243
- if (SDLCheckGrabbyKeys(event.key.keysym.sym, TRUE) != 0)
- SDLReallyCaptureInput(TRUE);
-
- if (event.key.keysym.unicode)
- {
- handleUnicodeUTF16(event.key.keysym.unicode,
- gKeyboard->currentMask(FALSE));
- }
+ mKeyScanCode = event.key.keysym.scancode;
+ mKeyVirtualKey = event.key.keysym.unicode;
+ mKeyModifiers = event.key.keysym.mod;
+
+ gKeyboard->handleKeyDown(event.key.keysym.sym, event.key.keysym.mod);
+ // part of the fix for SL-13243
+ if (SDLCheckGrabbyKeys(event.key.keysym.sym, TRUE) != 0)
+ SDLReallyCaptureInput(TRUE);
+
+ if (event.key.keysym.unicode)
+ {
+ handleUnicodeUTF16(event.key.keysym.unicode,
+ gKeyboard->currentMask(FALSE));
+ }
break;
case SDL_KEYUP:
- if (SDLCheckGrabbyKeys(event.key.keysym.sym, FALSE) == 0)
- SDLReallyCaptureInput(FALSE); // part of the fix for SL-13243
+ mKeyScanCode = event.key.keysym.scancode;
+ mKeyVirtualKey = event.key.keysym.unicode;
+ mKeyModifiers = event.key.keysym.mod;
- gKeyboard->handleKeyUp(event.key.keysym.sym, event.key.keysym.mod);
- break;
+ if (SDLCheckGrabbyKeys(event.key.keysym.sym, FALSE) == 0)
+ SDLReallyCaptureInput(FALSE); // part of the fix for SL-13243
+
+ gKeyboard->handleKeyUp(event.key.keysym.sym, event.key.keysym.mod);
+ break;
case SDL_MOUSEBUTTONDOWN:
{
@@ -1985,6 +2074,9 @@ void LLWindowSDL::initCursors()
mSDLCursors[UI_CURSOR_TOOLPAUSE] = makeSDLCursorFromBMP("toolpause.BMP",0,0);
mSDLCursors[UI_CURSOR_TOOLMEDIAOPEN] = makeSDLCursorFromBMP("toolmediaopen.BMP",0,0);
mSDLCursors[UI_CURSOR_PIPETTE] = makeSDLCursorFromBMP("lltoolpipette.BMP",2,28);
+ mSDLCursors[UI_CURSOR_TOOLSIT] = makeSDLCursorFromBMP("toolsit.BMP",20,15);
+ mSDLCursors[UI_CURSOR_TOOLBUY] = makeSDLCursorFromBMP("toolbuy.BMP",20,15);
+ mSDLCursors[UI_CURSOR_TOOLOPEN] = makeSDLCursorFromBMP("toolopen.BMP",20,15);
if (getenv("LL_ATI_MOUSE_CURSOR_BUG") != NULL) {
llinfos << "Disabling cursor updating due to LL_ATI_MOUSE_CURSOR_BUG" << llendl;
@@ -2224,6 +2316,39 @@ static void color_changed_callback(GtkWidget *widget,
gtk_color_selection_get_current_color(colorsel, colorp);
}
+
+/*
+ Make the raw keyboard data available - used to poke through to LLQtWebKit so
+ that Qt/Webkit has access to the virtual keycodes etc. that it needs
+*/
+LLSD LLWindowSDL::getNativeKeyData()
+{
+ LLSD result = LLSD::emptyMap();
+
+ U32 modifiers = 0; // pretend-native modifiers... oh what a tangled web we weave!
+
+ // we go through so many levels of device abstraction that I can't really guess
+ // what a plugin under GDK under Qt under SL under SDL under X11 considers
+ // a 'native' modifier mask. this has been sort of reverse-engineered... they *appear*
+ // to match GDK consts, but that may be co-incidence.
+ modifiers |= (mKeyModifiers & KMOD_LSHIFT) ? 0x0001 : 0;
+ modifiers |= (mKeyModifiers & KMOD_RSHIFT) ? 0x0001 : 0;// munge these into the same shift
+ modifiers |= (mKeyModifiers & KMOD_CAPS) ? 0x0002 : 0;
+ modifiers |= (mKeyModifiers & KMOD_LCTRL) ? 0x0004 : 0;
+ modifiers |= (mKeyModifiers & KMOD_RCTRL) ? 0x0004 : 0;// munge these into the same ctrl
+ modifiers |= (mKeyModifiers & KMOD_LALT) ? 0x0008 : 0;// untested
+ modifiers |= (mKeyModifiers & KMOD_RALT) ? 0x0008 : 0;// untested
+ // *todo: test ALTs - I don't have a case for testing these. Do you?
+ // *todo: NUM? - I don't care enough right now (and it's not a GDK modifier).
+
+ result["scan_code"] = (S32)mKeyScanCode;
+ result["virtual_key"] = (S32)mKeyVirtualKey;
+ result["modifiers"] = (S32)modifiers;
+
+ return result;
+}
+
+
BOOL LLWindowSDL::dialogColorPicker( F32 *r, F32 *g, F32 *b)
{
BOOL rtn = FALSE;
@@ -2343,7 +2468,7 @@ void exec_cmd(const std::string& cmd, const std::string& arg)
// Open a URL with the user's default web browser.
// Must begin with protocol identifier.
-void LLWindowSDL::spawnWebBrowser(const std::string& escaped_url)
+void LLWindowSDL::spawnWebBrowser(const std::string& escaped_url, bool async)
{
llinfos << "spawn_web_browser: " << escaped_url << llendl;
@@ -2421,6 +2546,7 @@ std::vector<std::string> LLWindowSDL::getDynamicFallbackFontList()
// Use libfontconfig to find us a nice ordered list of fallback fonts
// specific to this system.
std::string final_fallback("/usr/share/fonts/truetype/kochi/kochi-gothic.ttf");
+ const int max_font_count_cutoff = 40; // fonts are expensive in the current system, don't enumerate an arbitrary number of them
// Our 'ideal' font properties which define the sorting results.
// slant=0 means Roman, index=0 means the first face in a font file
// (the one we actually use), weight=80 means medium weight,
@@ -2436,7 +2562,6 @@ std::vector<std::string> LLWindowSDL::getDynamicFallbackFontList()
std::vector<std::string> rtns;
FcFontSet *fs = NULL;
FcPattern *sortpat = NULL;
- int font_count = 0;
llinfos << "Getting system font list from FontConfig..." << llendl;
@@ -2480,12 +2605,13 @@ std::vector<std::string> LLWindowSDL::getDynamicFallbackFontList()
FcPatternDestroy(sortpat);
}
+ int found_font_count = 0;
if (fs)
{
// Get the full pathnames to the fonts, where available,
// which is what we really want.
- int i;
- for (i=0; i<fs->nfont; ++i)
+ found_font_count = fs->nfont;
+ for (int i=0; i<fs->nfont; ++i)
{
FcChar8 *filename;
if (FcResultMatch == FcPatternGetString(fs->fonts[i],
@@ -2494,7 +2620,8 @@ std::vector<std::string> LLWindowSDL::getDynamicFallbackFontList()
&& filename)
{
rtns.push_back(std::string((const char*)filename));
- ++font_count;
+ if (rtns.size() >= max_font_count_cutoff)
+ break; // hit limit
}
}
FcFontSetDestroy (fs);
@@ -2507,7 +2634,7 @@ std::vector<std::string> LLWindowSDL::getDynamicFallbackFontList()
{
lldebugs << " file: " << *it << llendl;
}
- llinfos << "Using " << font_count << " system font(s)." << llendl;
+ llinfos << "Using " << rtns.size() << "/" << found_font_count << " system fonts." << llendl;
rtns.push_back(final_fallback);
return rtns;
diff --git a/indra/llwindow/llwindowsdl.h b/indra/llwindow/llwindowsdl.h
index 0ba1c861da..8e65a2f324 100644
--- a/indra/llwindow/llwindowsdl.h
+++ b/indra/llwindow/llwindowsdl.h
@@ -102,7 +102,7 @@ public:
/*virtual*/ void gatherInput();
/*virtual*/ void swapBuffers();
- /*virtual*/ void delayInputProcessing() { };
+ /*virtual*/ void delayInputProcessing() { };
// handy coordinate space conversion routines
/*virtual*/ BOOL convertCoords(LLCoordScreen from, LLCoordWindow *to);
@@ -125,7 +125,7 @@ public:
/*virtual*/ void *getPlatformWindow();
/*virtual*/ void bringToFront();
- /*virtual*/ void spawnWebBrowser(const std::string& escaped_url);
+ /*virtual*/ void spawnWebBrowser(const std::string& escaped_url, bool async);
static std::vector<std::string> getDynamicFallbackFontList();
@@ -155,12 +155,13 @@ protected:
BOOL ignore_pixel_depth, U32 fsaa_samples);
~LLWindowSDL();
+ /*virtual*/ BOOL isValid();
+ /*virtual*/ LLSD getNativeKeyData();
+
void initCursors();
void quitCursors();
- BOOL isValid();
void moveWindow(const LLCoordScreen& position,const LLCoordScreen& size);
-
// Changes display resolution. Returns true if successful
BOOL setDisplayResolution(S32 width, S32 height, S32 bits, S32 refresh);
@@ -204,12 +205,16 @@ protected:
friend class LLWindowManager;
-#if LL_X11
private:
+#if LL_X11
void x11_set_urgent(BOOL urgent);
BOOL mFlashing;
LLTimer mFlashTimer;
#endif //LL_X11
+
+ U32 mKeyScanCode;
+ U32 mKeyVirtualKey;
+ SDLMod mKeyModifiers;
};
diff --git a/indra/llwindow/llwindowwin32.cpp b/indra/llwindow/llwindowwin32.cpp
index 57a4921d92..f8fde0319e 100644
--- a/indra/llwindow/llwindowwin32.cpp
+++ b/indra/llwindow/llwindowwin32.cpp
@@ -46,6 +46,7 @@
#include "llerror.h"
#include "llgl.h"
#include "llstring.h"
+#include "lldir.h"
// System includes
#include <commdlg.h>
@@ -378,6 +379,9 @@ LLWindowWin32::LLWindowWin32(LLWindowCallbacks* callbacks,
mMousePositionModified = FALSE;
mInputProcessingPaused = FALSE;
mPreeditor = NULL;
+ mKeyCharCode = 0;
+ mKeyScanCode = 0;
+ mKeyVirtualKey = 0;
mhDC = NULL;
mhRC = NULL;
@@ -1540,11 +1544,14 @@ void LLWindowWin32::initCursors()
mCursor[ UI_CURSOR_TOOLZOOMIN ] = LoadCursor(module, TEXT("TOOLZOOMIN"));
mCursor[ UI_CURSOR_TOOLPICKOBJECT3 ] = LoadCursor(module, TEXT("TOOLPICKOBJECT3"));
mCursor[ UI_CURSOR_PIPETTE ] = LoadCursor(module, TEXT("TOOLPIPETTE"));
+ mCursor[ UI_CURSOR_TOOLSIT ] = LoadCursor(module, TEXT("TOOLSIT"));
+ mCursor[ UI_CURSOR_TOOLBUY ] = LoadCursor(module, TEXT("TOOLBUY"));
+ mCursor[ UI_CURSOR_TOOLOPEN ] = LoadCursor(module, TEXT("TOOLOPEN"));
// Color cursors
- mCursor[UI_CURSOR_TOOLPLAY] = loadColorCursor(TEXT("TOOLPLAY"));
- mCursor[UI_CURSOR_TOOLPAUSE] = loadColorCursor(TEXT("TOOLPAUSE"));
- mCursor[UI_CURSOR_TOOLMEDIAOPEN] = loadColorCursor(TEXT("TOOLMEDIAOPEN"));
+ mCursor[ UI_CURSOR_TOOLPLAY ] = loadColorCursor(TEXT("TOOLPLAY"));
+ mCursor[ UI_CURSOR_TOOLPAUSE ] = loadColorCursor(TEXT("TOOLPAUSE"));
+ mCursor[ UI_CURSOR_TOOLMEDIAOPEN ] = loadColorCursor(TEXT("TOOLMEDIAOPEN"));
// Note: custom cursors that are not found make LoadCursor() return NULL.
for( S32 i = 0; i < UI_CURSOR_COUNT; i++ )
@@ -1872,6 +1879,10 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
// allow system keys, such as ALT-F4 to be processed by Windows
eat_keystroke = FALSE;
case WM_KEYDOWN:
+ window_imp->mKeyCharCode = 0; // don't know until wm_char comes in next
+ window_imp->mKeyScanCode = ( l_param >> 16 ) & 0xff;
+ window_imp->mKeyVirtualKey = w_param;
+
window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_KEYDOWN");
{
if (gDebugWindowProc)
@@ -1891,6 +1902,9 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
eat_keystroke = FALSE;
case WM_KEYUP:
{
+ window_imp->mKeyScanCode = ( l_param >> 16 ) & 0xff;
+ window_imp->mKeyVirtualKey = w_param;
+
window_imp->mCallbacks->handlePingWatchdog(window_imp, "Main:WM_KEYUP");
LLFastTimer t2(FTM_KEYHANDLER);
@@ -1976,6 +1990,8 @@ LRESULT CALLBACK LLWindowWin32::mainWindowProc(HWND h_wnd, UINT u_msg, WPARAM w_
break;
case WM_CHAR:
+ window_imp->mKeyCharCode = w_param;
+
// Should really use WM_UNICHAR eventually, but it requires a specific Windows version and I need
// to figure out how that works. - Doug
//
@@ -2861,8 +2877,16 @@ void LLSplashScreenWin32::updateImpl(const std::string& mesg)
{
if (!mWindow) return;
- WCHAR w_mesg[1024];
- mbstowcs(w_mesg, mesg.c_str(), 1024);
+ int output_str_len = MultiByteToWideChar(CP_UTF8, 0, mesg.c_str(), mesg.length(), NULL, 0);
+ if( output_str_len>1024 )
+ return;
+
+ WCHAR w_mesg[1025];//big enought to keep null terminatos
+
+ MultiByteToWideChar (CP_UTF8, 0, mesg.c_str(), mesg.length(), w_mesg, output_str_len);
+
+ //looks like MultiByteToWideChar didn't add null terminator to converted string, see EXT-4858
+ w_mesg[output_str_len] = 0;
SendDlgItemMessage(mWindow,
666, // HACK: text id
@@ -2941,7 +2965,7 @@ S32 OSMessageBoxWin32(const std::string& text, const std::string& caption, U32 t
}
-void LLWindowWin32::spawnWebBrowser(const std::string& escaped_url )
+void LLWindowWin32::spawnWebBrowser(const std::string& escaped_url, bool async)
{
bool found = false;
S32 i;
@@ -2971,87 +2995,32 @@ void LLWindowWin32::spawnWebBrowser(const std::string& escaped_url )
// let the OS decide what to use to open the URL
SHELLEXECUTEINFO sei = { sizeof( sei ) };
- sei.fMask = SEE_MASK_FLAG_DDEWAIT;
+ // NOTE: this assumes that SL will stick around long enough to complete the DDE message exchange
+ // necessary for ShellExecuteEx to complete
+ if (async)
+ {
+ sei.fMask = SEE_MASK_ASYNCOK;
+ }
sei.nShow = SW_SHOWNORMAL;
sei.lpVerb = L"open";
sei.lpFile = url_utf16.c_str();
ShellExecuteEx( &sei );
+}
- //// TODO: LEAVING OLD CODE HERE SO I DON'T BONE OTHER MERGES
- //// DELETE THIS ONCE THE MERGES ARE DONE
-
- // Figure out the user's default web browser
- // HKEY_CLASSES_ROOT\http\shell\open\command
- /*
- std::string reg_path_str = gURLProtocolWhitelistHandler[i] + "\\shell\\open\\command";
- WCHAR reg_path_wstr[256];
- mbstowcs( reg_path_wstr, reg_path_str.c_str(), LL_ARRAY_SIZE(reg_path_wstr) );
-
- HKEY key;
- WCHAR browser_open_wstr[1024];
- DWORD buffer_length = 1024;
- RegOpenKeyEx(HKEY_CLASSES_ROOT, reg_path_wstr, 0, KEY_QUERY_VALUE, &key);
- RegQueryValueEx(key, NULL, NULL, NULL, (LPBYTE)browser_open_wstr, &buffer_length);
- RegCloseKey(key);
-
- // Convert to STL string
- LLWString browser_open_wstring = utf16str_to_wstring(browser_open_wstr);
-
- if (browser_open_wstring.length() < 2)
- {
- LL_WARNS("Window") << "Invalid browser executable in registry " << browser_open_wstring << LL_ENDL;
- return;
- }
-
- // Extract the process that's supposed to be launched
- LLWString browser_executable;
- if (browser_open_wstring[0] == '"')
- {
- // executable is quoted, find the matching quote
- size_t quote_pos = browser_open_wstring.find('"', 1);
- // copy out the string including both quotes
- browser_executable = browser_open_wstring.substr(0, quote_pos+1);
- }
- else
- {
- // executable not quoted, find a space
- size_t space_pos = browser_open_wstring.find(' ', 1);
- browser_executable = browser_open_wstring.substr(0, space_pos);
- }
-
- LL_DEBUGS("Window") << "Browser reg key: " << wstring_to_utf8str(browser_open_wstring) << LL_ENDL;
- LL_INFOS("Window") << "Browser executable: " << wstring_to_utf8str(browser_executable) << LL_ENDL;
-
- // Convert URL to wide string for Windows API
- // Assume URL is UTF8, as can come from scripts
- LLWString url_wstring = utf8str_to_wstring(escaped_url);
- llutf16string url_utf16 = wstring_to_utf16str(url_wstring);
+/*
+ Make the raw keyboard data available - used to poke through to LLQtWebKit so
+ that Qt/Webkit has access to the virtual keycodes etc. that it needs
+*/
+LLSD LLWindowWin32::getNativeKeyData()
+{
+ LLSD result = LLSD::emptyMap();
- // Convert executable and path to wide string for Windows API
- llutf16string browser_exec_utf16 = wstring_to_utf16str(browser_executable);
+ result["scan_code"] = (S32)mKeyScanCode;
+ result["virtual_key"] = (S32)mKeyVirtualKey;
- // ShellExecute returns HINSTANCE for backwards compatiblity.
- // MS docs say to cast to int and compare to 32.
- HWND our_window = NULL;
- LPCWSTR directory_wstr = NULL;
- int retval = (int) ShellExecute(our_window, // Flawfinder: ignore
- L"open",
- browser_exec_utf16.c_str(),
- url_utf16.c_str(),
- directory_wstr,
- SW_SHOWNORMAL);
- if (retval > 32)
- {
- LL_DEBUGS("Window") << "load_url success with " << retval << LL_ENDL;
- }
- else
- {
- LL_INFOS("Window") << "load_url failure with " << retval << LL_ENDL;
- }
- */
+ return result;
}
-
BOOL LLWindowWin32::dialogColorPicker( F32 *r, F32 *g, F32 *b )
{
BOOL retval = FALSE;
diff --git a/indra/llwindow/llwindowwin32.h b/indra/llwindow/llwindowwin32.h
index 6aca31b63e..d4a3446515 100644
--- a/indra/llwindow/llwindowwin32.h
+++ b/indra/llwindow/llwindowwin32.h
@@ -114,7 +114,7 @@ public:
/*virtual*/ void setLanguageTextInput( const LLCoordGL & pos );
/*virtual*/ void updateLanguageTextInputArea();
/*virtual*/ void interruptLanguageTextInput();
- /*virtual*/ void spawnWebBrowser(const std::string& escaped_url);
+ /*virtual*/ void spawnWebBrowser(const std::string& escaped_url, bool async);
LLWindowCallbacks::DragNDropResult completeDragNDropRequest( const LLCoordGL gl_coord, const MASK mask, LLWindowCallbacks::DragNDropAction action, const std::string url );
@@ -132,7 +132,7 @@ protected:
HCURSOR loadColorCursor(LPCTSTR name);
BOOL isValid();
void moveWindow(const LLCoordScreen& position,const LLCoordScreen& size);
-
+ LLSD getNativeKeyData();
// Changes display resolution. Returns true if successful
BOOL setDisplayResolution(S32 width, S32 height, S32 bits, S32 refresh);
@@ -211,6 +211,10 @@ protected:
LLDragDropWin32* mDragDrop;
+ U32 mKeyCharCode;
+ U32 mKeyScanCode;
+ U32 mKeyVirtualKey;
+
friend class LLWindowManager;
};
diff --git a/indra/llxuixml/llinitparam.cpp b/indra/llxuixml/llinitparam.cpp
index fb0a04dc58..8d6aa405e2 100644
--- a/indra/llxuixml/llinitparam.cpp
+++ b/indra/llxuixml/llinitparam.cpp
@@ -137,15 +137,15 @@ namespace LLInitParam
}
- bool BaseBlock::validateBlock(bool silent) const
+ bool BaseBlock::validateBlock(bool emit_errors) const
{
- const BlockDescriptor& block_data = getBlockDescriptor();
+ const BlockDescriptor& block_data = mostDerivedBlockDescriptor();
for (BlockDescriptor::param_validation_list_t::const_iterator it = block_data.mValidationList.begin(); it != block_data.mValidationList.end(); ++it)
{
const Param* param = getParamFromHandle(it->first);
if (!it->second(param))
{
- if (!silent)
+ if (emit_errors)
{
llwarns << "Invalid param \"" << getParamName(block_data, param) << "\"" << llendl;
}
@@ -159,7 +159,7 @@ namespace LLInitParam
{
// named param is one like LLView::Params::follows
// unnamed param is like LLView::Params::rect - implicit
- const BlockDescriptor& block_data = getBlockDescriptor();
+ const BlockDescriptor& block_data = mostDerivedBlockDescriptor();
for (BlockDescriptor::param_list_t::const_iterator it = block_data.mUnnamedParams.begin();
it != block_data.mUnnamedParams.end();
@@ -230,7 +230,7 @@ namespace LLInitParam
{
// named param is one like LLView::Params::follows
// unnamed param is like LLView::Params::rect - implicit
- const BlockDescriptor& block_data = getBlockDescriptor();
+ const BlockDescriptor& block_data = mostDerivedBlockDescriptor();
for (BlockDescriptor::param_list_t::const_iterator it = block_data.mUnnamedParams.begin();
it != block_data.mUnnamedParams.end();
@@ -301,7 +301,7 @@ namespace LLInitParam
bool BaseBlock::deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack)
{
- BlockDescriptor& block_data = getBlockDescriptor();
+ BlockDescriptor& block_data = mostDerivedBlockDescriptor();
bool names_left = name_stack.first != name_stack.second;
if (names_left)
@@ -386,7 +386,7 @@ namespace LLInitParam
void BaseBlock::addSynonym(Param& param, const std::string& synonym)
{
- BlockDescriptor& block_data = getBlockDescriptor();
+ BlockDescriptor& block_data = mostDerivedBlockDescriptor();
if (block_data.mInitializationState == BlockDescriptor::INITIALIZING)
{
param_handle_t handle = getHandleFromParam(&param);
@@ -417,8 +417,8 @@ namespace LLInitParam
{
if (user_provided)
{
- mChangeVersion++;
- }
+ mChangeVersion++;
+ }
}
const std::string& BaseBlock::getParamName(const BlockDescriptor& block_data, const Param* paramp) const
@@ -445,7 +445,7 @@ namespace LLInitParam
ParamDescriptor* BaseBlock::findParamDescriptor(param_handle_t handle)
{
- BlockDescriptor& descriptor = getBlockDescriptor();
+ BlockDescriptor& descriptor = mostDerivedBlockDescriptor();
BlockDescriptor::all_params_list_t::iterator end_it = descriptor.mAllParams.end();
for (BlockDescriptor::all_params_list_t::iterator it = descriptor.mAllParams.begin();
it != end_it;
@@ -458,29 +458,9 @@ namespace LLInitParam
// take all provided params from other and apply to self
// NOTE: this requires that "other" is of the same derived type as this
- bool BaseBlock::overwriteFromImpl(BlockDescriptor& block_data, const BaseBlock& other)
- {
- bool param_changed = false;
- BlockDescriptor::all_params_list_t::const_iterator end_it = block_data.mAllParams.end();
- for (BlockDescriptor::all_params_list_t::const_iterator it = block_data.mAllParams.begin();
- it != end_it;
- ++it)
- {
- const Param* other_paramp = other.getParamFromHandle(it->mParamHandle);
- ParamDescriptor::merge_func_t merge_func = it->mMergeFunc;
- if (merge_func)
- {
- Param* paramp = getParamFromHandle(it->mParamHandle);
- param_changed |= merge_func(*paramp, *other_paramp, true);
- }
- }
- return param_changed;
- }
-
- // take all provided params that are not already provided, and apply to self
- bool BaseBlock::fillFromImpl(BlockDescriptor& block_data, const BaseBlock& other)
+ bool BaseBlock::merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite)
{
- bool param_changed = false;
+ bool some_param_changed = false;
BlockDescriptor::all_params_list_t::const_iterator end_it = block_data.mAllParams.end();
for (BlockDescriptor::all_params_list_t::const_iterator it = block_data.mAllParams.begin();
it != end_it;
@@ -491,10 +471,10 @@ namespace LLInitParam
if (merge_func)
{
Param* paramp = getParamFromHandle(it->mParamHandle);
- param_changed |= merge_func(*paramp, *other_paramp, false);
+ some_param_changed |= merge_func(*paramp, *other_paramp, overwrite);
}
}
- return param_changed;
+ return some_param_changed;
}
bool ParamCompare<LLSD, false>::equals(const LLSD &a, const LLSD &b)
diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h
index d264cea3b2..b645c4be7c 100644
--- a/indra/llxuixml/llinitparam.h
+++ b/indra/llxuixml/llinitparam.h
@@ -407,7 +407,7 @@ namespace LLInitParam
class BaseBlock
{
public:
- // "Multiple" constraint types
+ // "Multiple" constraint types, put here in root class to avoid ambiguity during use
struct AnyAmount
{
static U32 minCount() { return 0; }
@@ -452,7 +452,7 @@ namespace LLInitParam
bool submitValue(const Parser::name_stack_t& name_stack, Parser& p, bool silent=false);
param_handle_t getHandleFromParam(const Param* param) const;
- bool validateBlock(bool silent = false) const;
+ bool validateBlock(bool emit_errors = true) const;
Param* getParamFromHandle(const param_handle_t param_handle)
{
@@ -477,10 +477,10 @@ namespace LLInitParam
bool deserializeBlock(Parser& p, Parser::name_stack_range_t name_stack);
bool serializeBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t(), const BaseBlock* diff_block = NULL) const;
- virtual bool inspectBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t()) const;
+ bool inspectBlock(Parser& p, Parser::name_stack_t name_stack = Parser::name_stack_t()) const;
- const BlockDescriptor& getBlockDescriptor() const { return *mBlockDescriptor; }
- BlockDescriptor& getBlockDescriptor() { return *mBlockDescriptor; }
+ const BlockDescriptor& mostDerivedBlockDescriptor() const { return *mBlockDescriptor; }
+ BlockDescriptor& mostDerivedBlockDescriptor() { return *mBlockDescriptor; }
// take all provided params from other and apply to self
bool overwriteFrom(const BaseBlock& other)
@@ -500,17 +500,14 @@ namespace LLInitParam
// take all provided params from other and apply to self
- bool overwriteFromImpl(BlockDescriptor& block_data, const BaseBlock& other);
-
- // take all provided params that are not already provided, and apply to self
- bool fillFromImpl(BlockDescriptor& block_data, const BaseBlock& other);
+ bool merge(BlockDescriptor& block_data, const BaseBlock& other, bool overwrite);
// can be updated in getters
mutable S32 mChangeVersion;
BlockDescriptor* mBlockDescriptor; // most derived block descriptor
- static BlockDescriptor& blockDescriptor()
+ static BlockDescriptor& selfBlockDescriptor()
{
static BlockDescriptor sBlockDescriptor;
return sBlockDescriptor;
@@ -562,7 +559,7 @@ namespace LLInitParam
TypedParam(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count)
: Param(block_descriptor.mCurrentBlockPtr)
{
- if (block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)
+ if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
{
ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
&mergeWith,
@@ -587,6 +584,7 @@ namespace LLInitParam
{
if (parser.readValue<T>(typed_param.mData.mValue))
{
+ typed_param.mData.clearKey();
typed_param.setProvided(true);
typed_param.enclosingBlock().setLastChangedParam(param, true);
return true;
@@ -693,7 +691,7 @@ namespace LLInitParam
&& (overwrite || !dst_typed_param.isProvided()))
{
dst_typed_param.mData.clearKey();
- dst_typed_param = src_typed_param;
+ dst_typed_param.set(src_typed_param.get());
return true;
}
return false;
@@ -725,7 +723,7 @@ namespace LLInitParam
: Param(block_descriptor.mCurrentBlockPtr),
T(value)
{
- if (block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)
+ if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
{
ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
&mergeWith,
@@ -744,6 +742,7 @@ namespace LLInitParam
// attempt to parse block...
if(typed_param.deserializeBlock(parser, name_stack))
{
+ typed_param.mData.clearKey();
typed_param.enclosingBlock().setLastChangedParam(param, true);
return true;
}
@@ -805,7 +804,7 @@ namespace LLInitParam
if (Param::getProvided() && mData.mValidatedVersion < T::getLastChangeVersion())
{
// a sub-block is "provided" when it has been filled in enough to be valid
- mData.mValidated = T::validateBlock(true);
+ mData.mValidated = T::validateBlock(false);
mData.mValidatedVersion = T::getLastChangeVersion();
}
return Param::getProvided() && mData.mValidated;
@@ -859,21 +858,10 @@ namespace LLInitParam
{
const self_t& src_typed_param = static_cast<const self_t&>(src);
self_t& dst_typed_param = static_cast<self_t&>(dst);
- if (overwrite)
- {
- if (dst_typed_param.T::overwriteFrom(src_typed_param))
- {
- dst_typed_param.mData.clearKey();
- return true;
- }
- }
- else
+ if (dst_typed_param.T::merge(T::selfBlockDescriptor(), src_typed_param, overwrite || !dst_typed_param.isProvided()))
{
- if (dst_typed_param.T::fillFrom(src_typed_param))
- {
- dst_typed_param.mData.clearKey();
- return true;
- }
+ dst_typed_param.mData.clearKey();
+ return true;
}
return false;
}
@@ -914,7 +902,7 @@ namespace LLInitParam
mValues(value)
{
mCachedKeys.resize(mValues.size());
- if (block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)
+ if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
{
ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
&mergeWith,
@@ -1063,9 +1051,9 @@ namespace LLInitParam
self_t& dst_typed_param = static_cast<self_t&>(dst);
if (src_typed_param.isProvided()
- && (overwrite || !isProvided()))
+ && (overwrite || !dst_typed_param.isProvided()))
{
- dst_typed_param = src_typed_param;
+ dst_typed_param.set(src_typed_param.get());
return true;
}
return false;
@@ -1097,7 +1085,7 @@ namespace LLInitParam
mLastParamGeneration(0)
{
mCachedKeys.resize(mValues.size());
- if (block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)
+ if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
{
ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
&mergeWith,
@@ -1236,7 +1224,7 @@ namespace LLInitParam
it != mValues.end();
++it)
{
- if(it->validateBlock(true)) count++;
+ if(it->validateBlock(false)) count++;
}
return count;
}
@@ -1255,7 +1243,7 @@ namespace LLInitParam
if (src_typed_param.isProvided()
&& (overwrite || !dst_typed_param.isProvided()))
{
- dst_typed_param = src_typed_param;
+ dst_typed_param.set(src_typed_param.get());
return true;
}
return false;
@@ -1285,13 +1273,24 @@ namespace LLInitParam
// take all provided params from other and apply to self
bool overwriteFrom(const self_t& other)
{
- mCurChoice = other.mCurChoice;
- return BaseBlock::overwriteFromImpl(blockDescriptor(), other);
+ return merge(selfBlockDescriptor(), other, true);
}
// take all provided params that are not already provided, and apply to self
bool fillFrom(const self_t& other)
{
+ return merge(selfBlockDescriptor(), other, false);
+ }
+
+ // merge with other block
+ bool merge(BlockDescriptor& block_data, const self_t& other, bool overwrite)
+ {
+ // only merge a choice if we are overwriting with other's contents
+ if (overwrite)
+ {
+ mCurChoice = other.mCurChoice;
+ return BaseBlock::merge(selfBlockDescriptor(), other, overwrite);
+ }
return false;
}
@@ -1317,7 +1316,7 @@ namespace LLInitParam
Choice()
: mCurChoice(0)
{
- BaseBlock::init(blockDescriptor(), BaseBlock::blockDescriptor(), sizeof(DERIVED_BLOCK));
+ BaseBlock::init(selfBlockDescriptor(), BaseBlock::selfBlockDescriptor(), sizeof(DERIVED_BLOCK));
}
// Alternatives are mutually exclusive wrt other Alternatives in the same block.
@@ -1334,13 +1333,14 @@ namespace LLInitParam
typedef typename super_t::value_assignment_t value_assignment_t;
explicit Alternative(const char* name, value_assignment_t val = DefaultInitializer<T>::get())
- : super_t(DERIVED_BLOCK::blockDescriptor(), name, val, NULL, 0, 1),
+ : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, NULL, 0, 1),
mOriginalValue(val)
{
// assign initial choice to first declared option
- DERIVED_BLOCK* blockp = ((DERIVED_BLOCK*)DERIVED_BLOCK::blockDescriptor().mCurrentBlockPtr);
- if (DERIVED_BLOCK::blockDescriptor().mInitializationState == BlockDescriptor::INITIALIZING
- && blockp->mCurChoice == 0)
+ DERIVED_BLOCK* blockp = ((DERIVED_BLOCK*)DERIVED_BLOCK::selfBlockDescriptor().mCurrentBlockPtr);
+ if (LL_UNLIKELY(
+ DERIVED_BLOCK::selfBlockDescriptor().mInitializationState == BlockDescriptor::INITIALIZING
+ && blockp->mCurChoice == 0))
{
blockp->mCurChoice = Param::enclosingBlock().getHandleFromParam(this);
}
@@ -1385,7 +1385,7 @@ namespace LLInitParam
};
protected:
- static BlockDescriptor& blockDescriptor()
+ static BlockDescriptor& selfBlockDescriptor()
{
static BlockDescriptor sBlockDescriptor;
return sBlockDescriptor;
@@ -1413,19 +1413,19 @@ namespace LLInitParam
// take all provided params from other and apply to self
bool overwriteFrom(const self_t& other)
{
- return BaseBlock::overwriteFromImpl(blockDescriptor(), other);
+ return BaseBlock::merge(selfBlockDescriptor(), other, true);
}
// take all provided params that are not already provided, and apply to self
bool fillFrom(const self_t& other)
{
- return BaseBlock::fillFromImpl(blockDescriptor(), other);
+ return BaseBlock::merge(selfBlockDescriptor(), other, false);
}
protected:
Block()
{
//#pragma message("Parsing LLInitParam::Block")
- BaseBlock::init(blockDescriptor(), BASE_BLOCK::blockDescriptor(), sizeof(DERIVED_BLOCK));
+ BaseBlock::init(selfBlockDescriptor(), BASE_BLOCK::selfBlockDescriptor(), sizeof(DERIVED_BLOCK));
}
//
@@ -1439,7 +1439,7 @@ namespace LLInitParam
typedef typename super_t::value_assignment_t value_assignment_t;
explicit Optional(const char* name = "", value_assignment_t val = DefaultInitializer<T>::get())
- : super_t(DERIVED_BLOCK::blockDescriptor(), name, val, NULL, 0, 1)
+ : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, NULL, 0, 1)
{
//#pragma message("Parsing LLInitParam::Block::Optional")
}
@@ -1468,7 +1468,7 @@ namespace LLInitParam
// mandatory parameters require a name to be parseable
explicit Mandatory(const char* name = "", value_assignment_t val = DefaultInitializer<T>::get())
- : super_t(DERIVED_BLOCK::blockDescriptor(), name, val, &validate, 1, 1)
+ : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, &validate, 1, 1)
{}
Mandatory& operator=(value_assignment_t val)
@@ -1504,7 +1504,7 @@ namespace LLInitParam
typedef typename container_t::const_iterator const_iterator;
explicit Multiple(const char* name = "", value_assignment_t val = DefaultInitializer<container_t>::get())
- : super_t(DERIVED_BLOCK::blockDescriptor(), name, val, &validate, RANGE::minCount(), RANGE::maxCount())
+ : super_t(DERIVED_BLOCK::selfBlockDescriptor(), name, val, &validate, RANGE::minCount(), RANGE::maxCount())
{}
using super_t::operator();
@@ -1532,10 +1532,10 @@ namespace LLInitParam
{
public:
explicit Deprecated(const char* name)
- : Param(DERIVED_BLOCK::blockDescriptor().mCurrentBlockPtr)
+ : Param(DERIVED_BLOCK::selfBlockDescriptor().mCurrentBlockPtr)
{
- BlockDescriptor& block_descriptor = DERIVED_BLOCK::blockDescriptor();
- if (block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)
+ BlockDescriptor& block_descriptor = DERIVED_BLOCK::selfBlockDescriptor();
+ if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
{
ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
NULL,
@@ -1564,7 +1564,7 @@ namespace LLInitParam
typedef Deprecated Ignored;
protected:
- static BlockDescriptor& blockDescriptor()
+ static BlockDescriptor& selfBlockDescriptor()
{
static BlockDescriptor sBlockDescriptor;
return sBlockDescriptor;
@@ -1577,6 +1577,13 @@ namespace LLInitParam
public Param
{
public:
+ typedef enum e_value_age
+ {
+ OLDER_THAN_BLOCK, // mData.mValue needs to be refreshed from the block parameters
+ NEWER_THAN_BLOCK, // mData.mValue holds the authoritative value (which has been replicated to the block parameters via setBlockFromValue)
+ SAME_AS_BLOCK // mData.mValue is derived from the block parameters, which are authoritative
+ } EValueAge;
+
typedef BlockValue<T> self_t;
typedef Block<TypedParam<T, TypeValues<T>, false> > block_t;
typedef const T& value_const_ref_t;
@@ -1585,9 +1592,9 @@ namespace LLInitParam
BlockValue(BlockDescriptor& block_descriptor, const char* name, value_assignment_t value, ParamDescriptor::validation_func_t validate_func, S32 min_count, S32 max_count)
: Param(block_descriptor.mCurrentBlockPtr),
- mData(value)
+ mData(value, NEWER_THAN_BLOCK)
{
- if (block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING)
+ if (LL_UNLIKELY(block_descriptor.mInitializationState == BlockDescriptor::INITIALIZING))
{
ParamDescriptor param_descriptor(block_descriptor.mCurrentBlockPtr->getHandleFromParam(this),
&mergeWith,
@@ -1607,7 +1614,7 @@ namespace LLInitParam
static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack, S32 generation)
{
- self_t& typed_param = static_cast<self_t&>(param);
+ DERIVED& typed_param = static_cast<DERIVED&>(param);
// type to apply parse direct value T
if (name_stack.first == name_stack.second)
{
@@ -1615,7 +1622,10 @@ namespace LLInitParam
{
typed_param.enclosingBlock().setLastChangedParam(param, true);
typed_param.setProvided(true);
- typed_param.mData.mLastParamVersion = typed_param.BaseBlock::getLastChangeVersion();
+ typed_param.mData.clearKey();
+ typed_param.mData.mValueAge = NEWER_THAN_BLOCK;
+ typed_param.setBlockFromValue();
+
return true;
}
@@ -1631,7 +1641,9 @@ namespace LLInitParam
typed_param.mData.setKey(name);
typed_param.enclosingBlock().setLastChangedParam(param, true);
typed_param.setProvided(true);
- typed_param.mData.mLastParamVersion = typed_param.BaseBlock::getLastChangeVersion();
+ typed_param.mData.mValueAge = NEWER_THAN_BLOCK;
+ typed_param.setBlockFromValue();
+
return true;
}
}
@@ -1706,16 +1718,18 @@ namespace LLInitParam
bool isProvided() const
{
- // either param value provided directly or block is sufficiently filled in
+ if (!Param::getProvided()) return false;
+
+ // block has an updated parameter
// if cached value is stale, regenerate from params
- if (Param::getProvided() && mData.mLastParamVersion < BaseBlock::getLastChangeVersion())
+ if (mData.mValueAge == OLDER_THAN_BLOCK)
{
- if (block_t::validateBlock(true))
+ if (block_t::validateBlock(false))
{
static_cast<const DERIVED*>(this)->setValueFromBlock();
// clear stale keyword associated with old value
mData.clearKey();
- mData.mLastParamVersion = BaseBlock::getLastChangeVersion();
+ mData.mValueAge = SAME_AS_BLOCK;
return true;
}
else
@@ -1725,8 +1739,11 @@ namespace LLInitParam
return false;
}
}
- // either no data provided, or we have a valid value in hand
- return Param::getProvided();
+ else
+ {
+ // we have a valid value in hand
+ return true;
+ }
}
void set(value_assignment_t val, bool flag_as_provided = true)
@@ -1734,7 +1751,7 @@ namespace LLInitParam
Param::enclosingBlock().setLastChangedParam(*this, flag_as_provided);
// set param version number to be up to date, so we ignore block contents
- mData.mLastParamVersion = BaseBlock::getLastChangeVersion();
+ mData.mValueAge = NEWER_THAN_BLOCK;
mData.mValue = val;
mData.clearKey();
@@ -1759,6 +1776,8 @@ namespace LLInitParam
if (user_provided)
{
setProvided(true); // some component provided
+ // a parameter changed, so our value is out of date
+ mData.mValueAge = OLDER_THAN_BLOCK;
}
}
@@ -1766,56 +1785,54 @@ namespace LLInitParam
value_assignment_t get() const
{
// if some parameters were provided, issue warnings on invalid blocks
- if (Param::getProvided() && (mData.mLastParamVersion < BaseBlock::getLastChangeVersion()))
+ if (Param::getProvided() && (mData.mValueAge == OLDER_THAN_BLOCK))
{
// go ahead and issue warnings at this point if any param is invalid
- if(block_t::validateBlock(false))
+ if(block_t::validateBlock(true))
{
static_cast<const DERIVED*>(this)->setValueFromBlock();
mData.clearKey();
- mData.mLastParamVersion = BaseBlock::getLastChangeVersion();
+ mData.mValueAge = SAME_AS_BLOCK;
}
}
return mData.mValue;
}
- // mutable to allow lazy updates on get
+
struct Data : public key_cache_t
{
- Data(const T& value)
+ Data(const T& value, EValueAge age)
: mValue(value),
- mLastParamVersion(0)
+ mValueAge(age)
{}
- T mValue;
- S32 mLastParamVersion;
+ T mValue;
+ EValueAge mValueAge;
};
+ // mutable to allow lazy updates on get
mutable Data mData;
private:
static bool mergeWith(Param& dst, const Param& src, bool overwrite)
{
- const self_t& src_param = static_cast<const self_t&>(src);
- self_t& dst_typed_param = static_cast<self_t&>(dst);
+ const DERIVED& src_typed_param = static_cast<const DERIVED&>(src);
+ DERIVED& dst_typed_param = static_cast<DERIVED&>(dst);
- if (src_param.isProvided()
+ if (src_typed_param.isProvided()
&& (overwrite || !dst_typed_param.isProvided()))
{
- // assign individual parameters
- if (overwrite)
+ if (src_typed_param.mData.mValueAge == NEWER_THAN_BLOCK)
{
- dst_typed_param.BaseBlock::overwriteFromImpl(block_t::blockDescriptor(), src_param);
+ // copy value over
+ dst_typed_param.set(src_typed_param.get());
}
else
{
- dst_typed_param.BaseBlock::fillFromImpl(block_t::blockDescriptor(), src_param);
+ // merge individual parameters into destination
+ dst_typed_param.merge(block_t::selfBlockDescriptor(), src_typed_param, overwrite);
}
- // then copy actual value
- dst_typed_param.mData.mValue = src_param.get();
- dst_typed_param.mData.clearKey();
- dst_typed_param.setProvided(true);
return true;
}
return false;
diff --git a/indra/llxuixml/llxuiparser.cpp b/indra/llxuixml/llxuiparser.cpp
index 17399865e5..dbc20a5a1e 100644
--- a/indra/llxuixml/llxuiparser.cpp
+++ b/indra/llxuixml/llxuiparser.cpp
@@ -324,33 +324,33 @@ void LLXUIXSDWriter::writeXSD(const std::string& type_name, const std::string& p
// add includes for all possible children
const std::type_info* type = *LLWidgetTypeRegistry::instance().getValue(type_name);
const widget_registry_t* widget_registryp = LLChildRegistryRegistry::instance().getValue(type);
-
- // add include declarations for all valid children
- for (widget_registry_t::Registrar::registry_map_t::const_iterator it = widget_registryp->currentRegistrar().beginItems();
- it != widget_registryp->currentRegistrar().endItems();
- ++it)
- {
- std::string widget_name = it->first;
- if (widget_name == type_name)
- {
- continue;
- }
- LLXMLNodePtr nodep = new LLXMLNode("xs:include", false);
- nodep->createChild("schemaLocation", true)->setStringValue(widget_name + ".xsd");
-
- // add to front of schema
- mSchemaNode->addChild(nodep, mSchemaNode);
- }
// add choices for valid children
if (widget_registryp)
{
+ // add include declarations for all valid children
+ for (widget_registry_t::Registrar::registry_map_t::const_iterator it = widget_registryp->currentRegistrar().beginItems();
+ it != widget_registryp->currentRegistrar().endItems();
+ ++it)
+ {
+ std::string widget_name = it->first;
+ if (widget_name == type_name)
+ {
+ continue;
+ }
+ LLXMLNodePtr nodep = new LLXMLNode("xs:include", false);
+ nodep->createChild("schemaLocation", true)->setStringValue(widget_name + ".xsd");
+
+ // add to front of schema
+ mSchemaNode->addChild(nodep, mSchemaNode);
+ }
+
for (widget_registry_t::Registrar::registry_map_t::const_iterator it = widget_registryp->currentRegistrar().beginItems();
it != widget_registryp->currentRegistrar().endItems();
++it)
{
std::string widget_name = it->first;
- //<xs:element name="widget_name" type="widget_name">
+ //<xs:element name="widget_name" type="widget_name">
LLXMLNodePtr widget_node = mElementNode->createChild("xs:element", false);
widget_node->createChild("name", true)->setStringValue(widget_name);
widget_node->createChild("type", true)->setStringValue(widget_name);
diff --git a/indra/lscript/lscript_compile/lscript_tree.cpp b/indra/lscript/lscript_compile/lscript_tree.cpp
index 3b8bbbe805..3d19de193a 100644
--- a/indra/lscript/lscript_compile/lscript_tree.cpp
+++ b/indra/lscript/lscript_compile/lscript_tree.cpp
@@ -9805,6 +9805,9 @@ void LLScriptEventHandler::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCom
break;
case LSCP_EMIT_BYTE_CODE:
{
+ llassert(mEventp);
+ if (!mEventp) return;
+
// order for event handler
// set jump table value
S32 jumpoffset;
@@ -9818,13 +9821,11 @@ void LLScriptEventHandler::recurse(LLFILE *fp, S32 tabs, S32 tabsize, LSCRIPTCom
chunk->addBytes(4);
// null terminated event name and null terminated parameters
- if (mEventp)
- {
- LLScriptByteCodeChunk *event = new LLScriptByteCodeChunk(FALSE);
- mEventp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, event, heap, stacksize, entry, entrycount, NULL);
- chunk->addBytes(event->mCodeChunk, event->mCurrentOffset);
- delete event;
- }
+ LLScriptByteCodeChunk *event = new LLScriptByteCodeChunk(FALSE);
+ mEventp->recurse(fp, tabs, tabsize, pass, ptype, prunearg, scope, type, basetype, count, event, heap, stacksize, entry, entrycount, NULL);
+ chunk->addBytes(event->mCodeChunk, event->mCurrentOffset);
+ delete event;
+
chunk->addBytes(1);
// now we're at the first opcode
@@ -10626,6 +10627,8 @@ LLScriptScript::LLScriptScript(LLScritpGlobalStorage *globals,
}
temp = temp->mNextp;
}
+
+ mClassName[0] = '\0';
}
void LLScriptScript::setBytecodeDest(const char* dst_filename)
diff --git a/indra/lscript/lscript_compile/lscript_tree.h b/indra/lscript/lscript_compile/lscript_tree.h
index a667e1eb5b..7de9606dfc 100644
--- a/indra/lscript/lscript_compile/lscript_tree.h
+++ b/indra/lscript/lscript_compile/lscript_tree.h
@@ -1876,7 +1876,7 @@ class LLScriptStateChange : public LLScriptStatement
{
public:
LLScriptStateChange(S32 line, S32 col, LLScriptIdentifier *identifier)
- : LLScriptStatement(line, col, LSSMT_STATE_CHANGE), mIdentifier(identifier)
+ : LLScriptStatement(line, col, LSSMT_STATE_CHANGE), mIdentifier(identifier), mReturnType(LST_NULL)
{
}
@@ -2210,7 +2210,7 @@ class LLScriptState : public LLScriptFilePosition
{
public:
LLScriptState(S32 line, S32 col, LSCRIPTStateType type, LLScriptIdentifier *identifier, LLScriptEventHandler *event)
- : LLScriptFilePosition(line, col), mType(type), mIdentifier(identifier), mEvent(event), mNextp(NULL)
+ : LLScriptFilePosition(line, col), mType(type), mIdentifier(identifier), mEvent(event), mNextp(NULL), mStateScope(NULL)
{
}
diff --git a/indra/lscript/lscript_execute/lscript_execute.cpp b/indra/lscript/lscript_execute/lscript_execute.cpp
index e849fa9a6e..8de54aeda5 100644
--- a/indra/lscript/lscript_execute/lscript_execute.cpp
+++ b/indra/lscript/lscript_execute/lscript_execute.cpp
@@ -520,7 +520,7 @@ void LLScriptExecuteLSL2::callNextQueuedEventHandler(U64 event_register, const L
}
else
{
- llwarns << "Shit, somehow got an event that we're not registered for!" << llendl;
+ llwarns << "Somehow got an event that we're not registered for!" << llendl;
}
delete eventdata;
}
diff --git a/indra/mac_crash_logger/llcrashloggermac.cpp b/indra/mac_crash_logger/llcrashloggermac.cpp
index 16efa4fe2c..90de39ba27 100644
--- a/indra/mac_crash_logger/llcrashloggermac.cpp
+++ b/indra/mac_crash_logger/llcrashloggermac.cpp
@@ -211,89 +211,6 @@ bool LLCrashLoggerMac::init(void)
void LLCrashLoggerMac::gatherPlatformSpecificFiles()
{
updateApplication("Gathering hardware information...");
- char path[MAX_PATH];
- FSRef folder;
-
- if(FSFindFolder(kUserDomain, kLogsFolderType, false, &folder) == noErr)
- {
- // folder is an FSRef to ~/Library/Logs/
- if(FSRefMakePath(&folder, (UInt8*)&path, sizeof(path)) == noErr)
- {
- struct stat dw_stat;
- std::string mBuf;
- bool isLeopard = false;
- // Try the 10.3 path first...
- std::string dw_file_name = std::string(path) + std::string("/CrashReporter/Second Life.crash.log");
- int res = stat(dw_file_name.c_str(), &dw_stat);
-
- if (res)
- {
- // Try the 10.2 one next...
- dw_file_name = std::string(path) + std::string("/Second Life.crash.log");
- res = stat(dw_file_name.c_str(), &dw_stat);
- }
-
- if(res)
- {
- //10.5: Like 10.3+, except it puts the crash time in the file instead of dividing it up
- //using asterisks. Get a directory listing, search for files starting with second life,
- //use the last one found.
- std::string old_file_name, current_file_name, pathname, mask;
- pathname = std::string(path) + std::string("/CrashReporter/");
- mask = "Second Life*";
- while(gDirUtilp->getNextFileInDir(pathname, mask, current_file_name, false))
- {
- old_file_name = current_file_name;
- }
- if(old_file_name != "")
- {
- dw_file_name = pathname + old_file_name;
- res=stat(dw_file_name.c_str(), &dw_stat);
- isLeopard = true;
- }
- }
-
- if (!res)
- {
- std::ifstream fp(dw_file_name.c_str());
- std::stringstream str;
- if(!fp.is_open()) return;
- str << fp.rdbuf();
- mBuf = str.str();
-
- if(!isLeopard)
- {
- // Crash logs consist of a number of entries, one per crash.
- // Each entry is preceeded by "**********" on a line by itself.
- // We want only the most recent (i.e. last) one.
- const char *sep = "**********";
- const char *start = mBuf.c_str();
- const char *cur = start;
- const char *temp = strstr(cur, sep);
-
- while(temp != NULL)
- {
- // Skip past the marker we just found
- cur = temp + strlen(sep); /* Flawfinder: ignore */
-
- // and try to find another
- temp = strstr(cur, sep);
- }
-
- // If there's more than one entry in the log file, strip all but the last one.
- if(cur != start)
- {
- mBuf.erase(0, cur - start);
- }
- }
- mCrashInfo["CrashLog"] = mBuf;
- }
- else
- {
- llwarns << "Couldn't find any CrashReporter files..." << llendl;
- }
- }
- }
}
bool LLCrashLoggerMac::mainLoop()
diff --git a/indra/mac_updater/CMakeLists.txt b/indra/mac_updater/CMakeLists.txt
index 57d426aa24..44f98e5e18 100644
--- a/indra/mac_updater/CMakeLists.txt
+++ b/indra/mac_updater/CMakeLists.txt
@@ -15,24 +15,10 @@ include_directories(
set(mac_updater_SOURCE_FILES
mac_updater.cpp
- FSCopyObject.c
- GenLinkedList.c
- MoreFilesX.c
)
set(mac_updater_HEADER_FILES
CMakeLists.txt
-
- FSCopyObject.h
- GenLinkedList.h
- MoreFilesX.h
- )
-
-set_source_files_properties(
- FSCopyObject.c
- MoreFilesX.c
- PROPERTIES
- COMPILE_FLAGS -Wno-deprecated-declarations
)
set_source_files_properties(${mac_updater_HEADER_FILES}
diff --git a/indra/mac_updater/mac_updater.cpp b/indra/mac_updater/mac_updater.cpp
index d2a46d4338..44f002aecf 100644
--- a/indra/mac_updater/mac_updater.cpp
+++ b/indra/mac_updater/mac_updater.cpp
@@ -48,9 +48,6 @@
#include <Carbon/Carbon.h>
-#include "MoreFilesX.h"
-#include "FSCopyObject.h"
-
#include "llerrorcontrol.h"
enum
@@ -547,20 +544,6 @@ bool isDirWritable(FSRef &dir)
return result;
}
-static void utf8str_to_HFSUniStr255(HFSUniStr255 *dest, const char* src)
-{
- llutf16string utf16str = utf8str_to_utf16str(src);
-
- dest->length = utf16str.size();
- if(dest->length > 255)
- {
- // There's onl room for 255 chars in a HFSUniStr25..
- // Truncate to avoid stack smaching or other badness.
- dest->length = 255;
- }
- memcpy(dest->unicode, utf16str.data(), sizeof(UniChar)* dest->length); /* Flawfinder: ignore */
-}
-
static std::string HFSUniStr255_to_utf8str(const HFSUniStr255* src)
{
llutf16string string16((U16*)&(src->unicode), src->length);
@@ -584,19 +567,12 @@ int restoreObject(const char* aside, const char* target, const char* path, const
llinfos << "Copying " << source << " to " << dest << llendl;
- err = FSCopyObject(
+ err = FSCopyObjectSync(
&sourceRef,
&destRef,
- 0,
- kFSCatInfoNone,
- kDupeActionReplace,
- NULL,
- false,
- false,
NULL,
NULL,
- NULL,
- NULL);
+ kFSFileOperationOverwrite);
if(err != noErr) return false;
return true;
@@ -779,21 +755,21 @@ void *updatethreadproc(void*)
// so we need to go up 3 levels to get the path to the main application bundle.
if(err == noErr)
{
- err = FSGetParentRef(&myBundle, &targetRef);
+ err = FSGetCatalogInfo(&myBundle, kFSCatInfoNone, NULL, NULL, NULL, &targetRef);
}
if(err == noErr)
{
- err = FSGetParentRef(&targetRef, &targetRef);
+ err = FSGetCatalogInfo(&targetRef, kFSCatInfoNone, NULL, NULL, NULL, &targetRef);
}
if(err == noErr)
{
- err = FSGetParentRef(&targetRef, &targetRef);
+ err = FSGetCatalogInfo(&targetRef, kFSCatInfoNone, NULL, NULL, NULL, &targetRef);
}
// And once more to get the parent of the target
if(err == noErr)
{
- err = FSGetParentRef(&targetRef, &targetParentRef);
+ err = FSGetCatalogInfo(&targetRef, kFSCatInfoNone, NULL, NULL, NULL, &targetParentRef);
}
if(err == noErr)
@@ -1077,14 +1053,16 @@ void *updatethreadproc(void*)
char aside[MAX_PATH]; /* Flawfinder: ignore */
// this will hold the name of the destination target
- HFSUniStr255 appNameUniStr;
+ CFStringRef appNameRef;
if(replacingTarget)
{
// Get the name of the target we're replacing
+ HFSUniStr255 appNameUniStr;
err = FSGetCatalogInfo(&targetRef, 0, NULL, &appNameUniStr, NULL, NULL);
if(err != noErr)
throw 0;
+ appNameRef = FSCreateStringFromHFSUniStr(NULL, &appNameUniStr);
// Move aside old version (into work directory)
err = FSMoveObject(&targetRef, &tempDirRef, &asideRef);
@@ -1099,7 +1077,7 @@ void *updatethreadproc(void*)
// Construct the name of the target based on the product name
char appName[MAX_PATH]; /* Flawfinder: ignore */
snprintf(appName, sizeof(appName), "%s.app", gProductName);
- utf8str_to_HFSUniStr255( &appNameUniStr, appName );
+ appNameRef = CFStringCreateWithCString(NULL, appName, kCFStringEncodingUTF8);
}
sendProgress(0, 0, CFSTR("Copying files..."));
@@ -1107,19 +1085,12 @@ void *updatethreadproc(void*)
llinfos << "Starting copy..." << llendl;
// Copy the new version from the disk image to the target location.
- err = FSCopyObject(
+ err = FSCopyObjectSync(
&sourceRef,
&targetParentRef,
- 0,
- kFSCatInfoNone,
- kDupeActionStandard,
- &appNameUniStr,
- false,
- false,
- NULL,
- NULL,
+ appNameRef,
&targetRef,
- NULL);
+ kFSFileOperationDefaultOptions);
// Grab the path for later use.
err = FSRefMakePath(&targetRef, (UInt8*)target, sizeof(target));
@@ -1131,7 +1102,7 @@ void *updatethreadproc(void*)
if(err != noErr)
{
// Something went wrong during the copy. Attempt to put the old version back and bail.
- (void)FSDeleteObjects(&targetRef);
+ (void)FSDeleteObject(&targetRef);
if(replacingTarget)
{
(void)FSMoveObject(&asideRef, &targetParentRef, NULL);
diff --git a/indra/media_plugins/CMakeLists.txt b/indra/media_plugins/CMakeLists.txt
index cc03d9cb72..85318aea3b 100644
--- a/indra/media_plugins/CMakeLists.txt
+++ b/indra/media_plugins/CMakeLists.txt
@@ -10,4 +10,8 @@ if (WINDOWS OR DARWIN)
add_subdirectory(quicktime)
endif (WINDOWS OR DARWIN)
+if (WINDOWS)
+ add_subdirectory(winmmshim)
+endif (WINDOWS)
+
add_subdirectory(example)
diff --git a/indra/media_plugins/example/media_plugin_example.cpp b/indra/media_plugins/example/media_plugin_example.cpp
index f5b077fea0..49bbca6c52 100644
--- a/indra/media_plugins/example/media_plugin_example.cpp
+++ b/indra/media_plugins/example/media_plugin_example.cpp
@@ -119,17 +119,6 @@ void MediaPluginExample::receiveMessage( const char* message_string )
std::string plugin_version = "Example media plugin, Example Version 1.0.0.0";
message.setValue( "plugin_version", plugin_version );
sendMessage( message );
-
- // Plugin gets to decide the texture parameters to use.
- message.setMessage( LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params" );
- message.setValueS32( "default_width", mWidth );
- message.setValueS32( "default_height", mHeight );
- message.setValueS32( "depth", mDepth );
- message.setValueU32( "internalformat", GL_RGBA );
- message.setValueU32( "format", GL_RGBA );
- message.setValueU32( "type", GL_UNSIGNED_BYTE );
- message.setValueBoolean( "coords_opengl", false );
- sendMessage( message );
}
else
if ( message_name == "idle" )
@@ -191,7 +180,20 @@ void MediaPluginExample::receiveMessage( const char* message_string )
else
if ( message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA )
{
- if ( message_name == "size_change" )
+ if ( message_name == "init" )
+ {
+ // Plugin gets to decide the texture parameters to use.
+ LLPluginMessage message( LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params" );
+ message.setValueS32( "default_width", mWidth );
+ message.setValueS32( "default_height", mHeight );
+ message.setValueS32( "depth", mDepth );
+ message.setValueU32( "internalformat", GL_RGBA );
+ message.setValueU32( "format", GL_RGBA );
+ message.setValueU32( "type", GL_UNSIGNED_BYTE );
+ message.setValueBoolean( "coords_opengl", false );
+ sendMessage( message );
+ }
+ else if ( message_name == "size_change" )
{
std::string name = message_in.getValue( "name" );
S32 width = message_in.getValueS32( "width" );
diff --git a/indra/media_plugins/gstreamer010/CMakeLists.txt b/indra/media_plugins/gstreamer010/CMakeLists.txt
index 3b73e04786..9f0ff654fc 100644
--- a/indra/media_plugins/gstreamer010/CMakeLists.txt
+++ b/indra/media_plugins/gstreamer010/CMakeLists.txt
@@ -42,12 +42,12 @@ set(media_plugin_gstreamer010_HEADER_FILES
llmediaimplgstreamertriviallogging.h
)
-if (${CXX_VERSION_NUMBER} MATCHES "4[23].")
+if (${CXX_VERSION_NUMBER} MATCHES "4[23456789].")
# Work around a bad interaction between broken gstreamer headers and
- # g++ 4.3's increased strictness.
+ # g++ >= 4.2's increased strictness.
set_source_files_properties(llmediaimplgstreamervidplug.cpp PROPERTIES
COMPILE_FLAGS -Wno-write-strings)
-endif (${CXX_VERSION_NUMBER} MATCHES "4[23].")
+endif (${CXX_VERSION_NUMBER} MATCHES "4[23456789].")
add_library(media_plugin_gstreamer010
SHARED
diff --git a/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp b/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp
index 26173314a7..e6d2ad3edc 100644
--- a/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp
+++ b/indra/media_plugins/gstreamer010/media_plugin_gstreamer010.cpp
@@ -141,6 +141,7 @@ private:
// Very GStreamer-specific
GMainLoop *mPump; // event pump for this media
GstElement *mPlaybin;
+ GstElement *mVisualizer;
GstSLVideo *mVideoSink;
};
@@ -159,6 +160,7 @@ MediaPluginGStreamer010::MediaPluginGStreamer010(
mSeekDestination(0.0),
mPump ( NULL ),
mPlaybin ( NULL ),
+ mVisualizer ( NULL ),
mVideoSink ( NULL ),
mCommand ( COMMAND_NONE )
{
@@ -542,8 +544,12 @@ MediaPluginGStreamer010::pause()
{
DEBUGMSG("pausing media...");
// todo: error-check this?
- llgst_element_set_state(mPlaybin, GST_STATE_PAUSED);
- return true;
+ if (mDoneInit && mPlaybin)
+ {
+ llgst_element_set_state(mPlaybin, GST_STATE_PAUSED);
+ return true;
+ }
+ return false;
}
bool
@@ -551,8 +557,12 @@ MediaPluginGStreamer010::stop()
{
DEBUGMSG("stopping media...");
// todo: error-check this?
- llgst_element_set_state(mPlaybin, GST_STATE_READY);
- return true;
+ if (mDoneInit && mPlaybin)
+ {
+ llgst_element_set_state(mPlaybin, GST_STATE_READY);
+ return true;
+ }
+ return false;
}
bool
@@ -562,8 +572,12 @@ MediaPluginGStreamer010::play(double rate)
DEBUGMSG("playing media... rate=%f", rate);
// todo: error-check this?
- llgst_element_set_state(mPlaybin, GST_STATE_PLAYING);
- return true;
+ if (mDoneInit && mPlaybin)
+ {
+ llgst_element_set_state(mPlaybin, GST_STATE_PLAYING);
+ return true;
+ }
+ return false;
}
bool
@@ -606,7 +620,7 @@ bool
MediaPluginGStreamer010::getTimePos(double &sec_out)
{
bool got_position = false;
- if (mPlaybin)
+ if (mDoneInit && mPlaybin)
{
gint64 pos;
GstFormat timefmt = GST_FORMAT_TIME;
@@ -686,6 +700,35 @@ MediaPluginGStreamer010::load()
this);
llgst_object_unref (bus);
+#if 0 // not quite stable/correct yet
+ // get a visualizer element (bonus feature!)
+ char* vis_name = getenv("LL_GST_VIS_NAME");
+ if (!vis_name ||
+ (vis_name && std::string(vis_name)!="none"))
+ {
+ if (vis_name)
+ {
+ mVisualizer = llgst_element_factory_make (vis_name, "vis");
+ }
+ if (!mVisualizer)
+ {
+ mVisualizer = llgst_element_factory_make ("libvisual_jess", "vis");
+ if (!mVisualizer)
+ {
+ mVisualizer = llgst_element_factory_make ("goom", "vis");
+ if (!mVisualizer)
+ {
+ mVisualizer = llgst_element_factory_make ("libvisual_lv_scope", "vis");
+ if (!mVisualizer)
+ {
+ // That's okay, we don't NEED this.
+ }
+ }
+ }
+ }
+ }
+#endif
+
if (NULL == getenv("LL_GSTREAMER_EXTERNAL")) {
// instantiate a custom video sink
mVideoSink =
@@ -702,6 +745,11 @@ MediaPluginGStreamer010::load()
g_object_set(mPlaybin, "video-sink", mVideoSink, NULL);
}
+ if (mVisualizer)
+ {
+ g_object_set(mPlaybin, "vis-plugin", mVisualizer, NULL);
+ }
+
return true;
}
@@ -724,6 +772,12 @@ MediaPluginGStreamer010::unload ()
mPlaybin = NULL;
}
+ if (mVisualizer)
+ {
+ llgst_object_unref (GST_OBJECT (mVisualizer));
+ mVisualizer = NULL;
+ }
+
if (mPump)
{
g_main_loop_quit(mPump);
@@ -946,33 +1000,6 @@ void MediaPluginGStreamer010::receiveMessage(const char *message_string)
message.setValue("plugin_version", getVersion());
sendMessage(message);
-
- // Plugin gets to decide the texture parameters to use.
- message.setMessage(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params");
- // lame to have to decide this now, it depends on the movie. Oh well.
- mDepth = 4;
-
- mCurrentWidth = 1;
- mCurrentHeight = 1;
- mPreviousWidth = 1;
- mPreviousHeight = 1;
- mNaturalWidth = 1;
- mNaturalHeight = 1;
- mWidth = 1;
- mHeight = 1;
- mTextureWidth = 1;
- mTextureHeight = 1;
-
- message.setValueU32("format", GL_RGBA);
- message.setValueU32("type", GL_UNSIGNED_INT_8_8_8_8_REV);
-
- message.setValueS32("depth", mDepth);
- message.setValueS32("default_width", mWidth);
- message.setValueS32("default_height", mHeight);
- message.setValueU32("internalformat", GL_RGBA8);
- message.setValueBoolean("coords_opengl", true); // true == use OpenGL-style coordinates, false == (0,0) is upper left.
- message.setValueBoolean("allow_downsample", true); // we respond with grace and performance if asked to downscale
- sendMessage(message);
}
else if(message_name == "idle")
{
@@ -1037,7 +1064,36 @@ void MediaPluginGStreamer010::receiveMessage(const char *message_string)
}
else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA)
{
- if(message_name == "size_change")
+ if(message_name == "init")
+ {
+ // Plugin gets to decide the texture parameters to use.
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params");
+ // lame to have to decide this now, it depends on the movie. Oh well.
+ mDepth = 4;
+
+ mCurrentWidth = 1;
+ mCurrentHeight = 1;
+ mPreviousWidth = 1;
+ mPreviousHeight = 1;
+ mNaturalWidth = 1;
+ mNaturalHeight = 1;
+ mWidth = 1;
+ mHeight = 1;
+ mTextureWidth = 1;
+ mTextureHeight = 1;
+
+ message.setValueU32("format", GL_RGBA);
+ message.setValueU32("type", GL_UNSIGNED_INT_8_8_8_8_REV);
+
+ message.setValueS32("depth", mDepth);
+ message.setValueS32("default_width", mWidth);
+ message.setValueS32("default_height", mHeight);
+ message.setValueU32("internalformat", GL_RGBA8);
+ message.setValueBoolean("coords_opengl", true); // true == use OpenGL-style coordinates, false == (0,0) is upper left.
+ message.setValueBoolean("allow_downsample", true); // we respond with grace and performance if asked to downscale
+ sendMessage(message);
+ }
+ else if(message_name == "size_change")
{
std::string name = message_in.getValue("name");
S32 width = message_in.getValueS32("width");
diff --git a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
index e230fcc280..1f88301ca7 100644
--- a/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
+++ b/indra/media_plugins/quicktime/media_plugin_quicktime.cpp
@@ -859,36 +859,6 @@ void MediaPluginQuickTime::receiveMessage(const char *message_string)
plugin_version += codec.str();
message.setValue("plugin_version", plugin_version);
sendMessage(message);
-
- // Plugin gets to decide the texture parameters to use.
- message.setMessage(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params");
- #if defined(LL_WINDOWS)
- // Values for Windows
- mDepth = 3;
- message.setValueU32("format", GL_RGB);
- message.setValueU32("type", GL_UNSIGNED_BYTE);
-
- // We really want to pad the texture width to a multiple of 32 bytes, but since we're using 3-byte pixels, it doesn't come out even.
- // Padding to a multiple of 3*32 guarantees it'll divide out properly.
- message.setValueU32("padding", 32 * 3);
- #else
- // Values for Mac
- mDepth = 4;
- message.setValueU32("format", GL_BGRA_EXT);
- #ifdef __BIG_ENDIAN__
- message.setValueU32("type", GL_UNSIGNED_INT_8_8_8_8_REV );
- #else
- message.setValueU32("type", GL_UNSIGNED_INT_8_8_8_8);
- #endif
-
- // Pad texture width to a multiple of 32 bytes, to line up with cache lines.
- message.setValueU32("padding", 32);
- #endif
- message.setValueS32("depth", mDepth);
- message.setValueU32("internalformat", GL_RGB);
- message.setValueBoolean("coords_opengl", true); // true == use OpenGL-style coordinates, false == (0,0) is upper left.
- message.setValueBoolean("allow_downsample", true);
- sendMessage(message);
}
else if(message_name == "idle")
{
@@ -953,7 +923,41 @@ void MediaPluginQuickTime::receiveMessage(const char *message_string)
}
else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA)
{
- if(message_name == "size_change")
+ if(message_name == "init")
+ {
+ // This is the media init message -- all necessary data for initialization should have been received.
+
+ // Plugin gets to decide the texture parameters to use.
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params");
+ #if defined(LL_WINDOWS)
+ // Values for Windows
+ mDepth = 3;
+ message.setValueU32("format", GL_RGB);
+ message.setValueU32("type", GL_UNSIGNED_BYTE);
+
+ // We really want to pad the texture width to a multiple of 32 bytes, but since we're using 3-byte pixels, it doesn't come out even.
+ // Padding to a multiple of 3*32 guarantees it'll divide out properly.
+ message.setValueU32("padding", 32 * 3);
+ #else
+ // Values for Mac
+ mDepth = 4;
+ message.setValueU32("format", GL_BGRA_EXT);
+ #ifdef __BIG_ENDIAN__
+ message.setValueU32("type", GL_UNSIGNED_INT_8_8_8_8_REV );
+ #else
+ message.setValueU32("type", GL_UNSIGNED_INT_8_8_8_8);
+ #endif
+
+ // Pad texture width to a multiple of 32 bytes, to line up with cache lines.
+ message.setValueU32("padding", 32);
+ #endif
+ message.setValueS32("depth", mDepth);
+ message.setValueU32("internalformat", GL_RGB);
+ message.setValueBoolean("coords_opengl", true); // true == use OpenGL-style coordinates, false == (0,0) is upper left.
+ message.setValueBoolean("allow_downsample", true);
+ sendMessage(message);
+ }
+ else if(message_name == "size_change")
{
std::string name = message_in.getValue("name");
S32 width = message_in.getValueS32("width");
diff --git a/indra/media_plugins/webkit/CMakeLists.txt b/indra/media_plugins/webkit/CMakeLists.txt
index 812760a116..d576638dd7 100644
--- a/indra/media_plugins/webkit/CMakeLists.txt
+++ b/indra/media_plugins/webkit/CMakeLists.txt
@@ -14,10 +14,12 @@ include(Linking)
include(PluginAPI)
include(MediaPluginBase)
include(FindOpenGL)
+include(PulseAudio)
include(WebKitLibPlugin)
include_directories(
+ ${PULSEAUDIO_INCLUDE_DIRS}
${LLPLUGIN_INCLUDE_DIRS}
${MEDIA_PLUGIN_BASE_INCLUDE_DIRS}
${LLCOMMON_INCLUDE_DIRS}
@@ -34,10 +36,9 @@ set(media_plugin_webkit_SOURCE_FILES
media_plugin_webkit.cpp
)
-add_library(media_plugin_webkit
- SHARED
- ${media_plugin_webkit_SOURCE_FILES}
-)
+set(media_plugin_webkit_HEADER_FILES
+ volume_catcher.h
+ )
set(media_plugin_webkit_LINK_LIBRARIES
${LLPLUGIN_LIBRARIES}
@@ -45,14 +46,42 @@ set(media_plugin_webkit_LINK_LIBRARIES
${LLCOMMON_LIBRARIES}
${WEBKIT_PLUGIN_LIBRARIES}
${PLUGIN_API_WINDOWS_LIBRARIES}
+ ${PULSEAUDIO_LIBRARIES}
)
+# Select which VolumeCatcher implementation to use
if (LINUX)
+ if (PULSEAUDIO)
+ list(APPEND media_plugin_webkit_SOURCE_FILES linux_volume_catcher.cpp)
+ endif (PULSEAUDIO)
list(APPEND media_plugin_webkit_LINK_LIBRARIES
${UI_LIBRARIES} # for glib/GTK
)
+elseif (DARWIN)
+ list(APPEND media_plugin_webkit_SOURCE_FILES mac_volume_catcher.cpp)
+ find_library(CORESERVICES_LIBRARY CoreServices)
+ find_library(AUDIOUNIT_LIBRARY AudioUnit)
+ list(APPEND media_plugin_webkit_LINK_LIBRARIES
+ ${CORESERVICES_LIBRARY} # for Component Manager calls
+ ${AUDIOUNIT_LIBRARY} # for AudioUnit calls
+ )
+elseif (WINDOWS)
+ list(APPEND media_plugin_webkit_SOURCE_FILES windows_volume_catcher.cpp)
+else (LINUX)
+ # All other platforms use the dummy volume catcher for now.
+ list(APPEND media_plugin_webkit_SOURCE_FILES dummy_volume_catcher.cpp)
endif (LINUX)
+set_source_files_properties(${media_plugin_webkit_HEADER_FILES}
+ PROPERTIES HEADER_FILE_ONLY TRUE)
+
+list(APPEND media_plugin_webkit_SOURCE_FILES ${media_plugin_webkit_HEADER_FILES})
+
+add_library(media_plugin_webkit
+ SHARED
+ ${media_plugin_webkit_SOURCE_FILES}
+)
+
target_link_libraries(media_plugin_webkit ${media_plugin_webkit_LINK_LIBRARIES})
add_dependencies(media_plugin_webkit
@@ -88,4 +117,5 @@ if (DARWIN)
DEPENDS media_plugin_webkit ${CMAKE_SOURCE_DIR}/../libraries/universal-darwin/lib_release/libllqtwebkit.dylib
)
-endif (DARWIN) \ No newline at end of file
+endif (DARWIN)
+
diff --git a/indra/media_plugins/webkit/dummy_volume_catcher.cpp b/indra/media_plugins/webkit/dummy_volume_catcher.cpp
new file mode 100644
index 0000000000..45b2c62eba
--- /dev/null
+++ b/indra/media_plugins/webkit/dummy_volume_catcher.cpp
@@ -0,0 +1,63 @@
+/**
+ * @file dummy_volume_catcher.cpp
+ * @brief A null implementation of the "VolumeCatcher" class for platforms where it's not implemented yet.
+ *
+ * @cond
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlife.com/developers/opensource/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlife.com/developers/opensource/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ * @endcond
+ */
+
+#include "volume_catcher.h"
+
+
+class VolumeCatcherImpl
+{
+};
+
+/////////////////////////////////////////////////////
+
+VolumeCatcher::VolumeCatcher()
+{
+ pimpl = NULL;
+}
+
+VolumeCatcher::~VolumeCatcher()
+{
+}
+
+void VolumeCatcher::setVolume(F32 volume)
+{
+}
+
+void VolumeCatcher::setPan(F32 pan)
+{
+}
+
+void VolumeCatcher::pump()
+{
+}
+
diff --git a/indra/media_plugins/webkit/linux_volume_catcher.cpp b/indra/media_plugins/webkit/linux_volume_catcher.cpp
new file mode 100644
index 0000000000..2e7fda865e
--- /dev/null
+++ b/indra/media_plugins/webkit/linux_volume_catcher.cpp
@@ -0,0 +1,468 @@
+/**
+ * @file linux_volume_catcher.cpp
+ * @brief A Linux-specific, PulseAudio-specific hack to detect and volume-adjust new audio sources
+ *
+ * @cond
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlife.com/developers/opensource/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlife.com/developers/opensource/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ * @endcond
+ */
+
+/*
+ The high-level design is as follows:
+ 1) Connect to the PulseAudio daemon
+ 2) Watch for the creation of new audio players connecting to the daemon (this includes ALSA clients running on the PulseAudio emulation layer, such as Flash plugins)
+ 3) Examine any new audio player's PID to see if it belongs to our own process
+ 4) If so, tell PA to adjust the volume of that audio player ('sink input' in PA parlance)
+ 5) Keep a list of all living audio players that we care about, adjust the volumes of all of them when we get a new setVolume() call
+ */
+
+#include "linden_common.h"
+
+#include "volume_catcher.h"
+
+
+extern "C" {
+#include <glib.h>
+
+#include <pulse/introspect.h>
+#include <pulse/context.h>
+#include <pulse/subscribe.h>
+#include <pulse/glib-mainloop.h> // There's no special reason why we want the *glib* PA mainloop, but the generic polling implementation seems broken.
+
+#include "apr_pools.h"
+#include "apr_dso.h"
+}
+
+////////////////////////////////////////////////////
+
+#define DEBUGMSG(...) do {} while(0)
+#define INFOMSG(...) do {} while(0)
+#define WARNMSG(...) do {} while(0)
+
+#define LL_PA_SYM(REQUIRED, PASYM, RTN, ...) RTN (*ll##PASYM)(__VA_ARGS__) = NULL
+#include "linux_volume_catcher_pa_syms.inc"
+#include "linux_volume_catcher_paglib_syms.inc"
+#undef LL_PA_SYM
+
+static bool sSymsGrabbed = false;
+static apr_pool_t *sSymPADSOMemoryPool = NULL;
+static apr_dso_handle_t *sSymPADSOHandleG = NULL;
+
+bool grab_pa_syms(std::string pulse_dso_name)
+{
+ if (sSymsGrabbed)
+ {
+ // already have grabbed good syms
+ return true;
+ }
+
+ bool sym_error = false;
+ bool rtn = false;
+ apr_status_t rv;
+ apr_dso_handle_t *sSymPADSOHandle = NULL;
+
+#define LL_PA_SYM(REQUIRED, PASYM, RTN, ...) do{rv = apr_dso_sym((apr_dso_handle_sym_t*)&ll##PASYM, sSymPADSOHandle, #PASYM); if (rv != APR_SUCCESS) {INFOMSG("Failed to grab symbol: %s", #PASYM); if (REQUIRED) sym_error = true;} else DEBUGMSG("grabbed symbol: %s from %p", #PASYM, (void*)ll##PASYM);}while(0)
+
+ //attempt to load the shared library
+ apr_pool_create(&sSymPADSOMemoryPool, NULL);
+
+ if ( APR_SUCCESS == (rv = apr_dso_load(&sSymPADSOHandle,
+ pulse_dso_name.c_str(),
+ sSymPADSOMemoryPool) ))
+ {
+ INFOMSG("Found DSO: %s", pulse_dso_name.c_str());
+
+#include "linux_volume_catcher_pa_syms.inc"
+#include "linux_volume_catcher_paglib_syms.inc"
+
+ if ( sSymPADSOHandle )
+ {
+ sSymPADSOHandleG = sSymPADSOHandle;
+ sSymPADSOHandle = NULL;
+ }
+
+ rtn = !sym_error;
+ }
+ else
+ {
+ INFOMSG("Couldn't load DSO: %s", pulse_dso_name.c_str());
+ rtn = false; // failure
+ }
+
+ if (sym_error)
+ {
+ WARNMSG("Failed to find necessary symbols in PulseAudio libraries.");
+ }
+#undef LL_PA_SYM
+
+ sSymsGrabbed = rtn;
+ return rtn;
+}
+
+
+void ungrab_pa_syms()
+{
+ // should be safe to call regardless of whether we've
+ // actually grabbed syms.
+
+ if ( sSymPADSOHandleG )
+ {
+ apr_dso_unload(sSymPADSOHandleG);
+ sSymPADSOHandleG = NULL;
+ }
+
+ if ( sSymPADSOMemoryPool )
+ {
+ apr_pool_destroy(sSymPADSOMemoryPool);
+ sSymPADSOMemoryPool = NULL;
+ }
+
+ // NULL-out all of the symbols we'd grabbed
+#define LL_PA_SYM(REQUIRED, PASYM, RTN, ...) do{ll##PASYM = NULL;}while(0)
+#include "linux_volume_catcher_pa_syms.inc"
+#include "linux_volume_catcher_paglib_syms.inc"
+#undef LL_PA_SYM
+
+ sSymsGrabbed = false;
+}
+////////////////////////////////////////////////////
+
+// PulseAudio requires a chain of callbacks with C linkage
+extern "C" {
+ void callback_discovered_sinkinput(pa_context *context, const pa_sink_input_info *i, int eol, void *userdata);
+ void callback_subscription_alert(pa_context *context, pa_subscription_event_type_t t, uint32_t index, void *userdata);
+ void callback_context_state(pa_context *context, void *userdata);
+}
+
+
+class VolumeCatcherImpl
+{
+public:
+ VolumeCatcherImpl();
+ ~VolumeCatcherImpl();
+
+ void setVolume(F32 volume);
+ void pump(void);
+
+ // for internal use - can't be private because used from our C callbacks
+
+ bool loadsyms(std::string pulse_dso_name);
+ void init();
+ void cleanup();
+
+ void update_all_volumes(F32 volume);
+ void update_index_volume(U32 index, F32 volume);
+ void connected_okay();
+
+ std::set<U32> mSinkInputIndices;
+ std::map<U32,U32> mSinkInputNumChannels;
+ F32 mDesiredVolume;
+ pa_glib_mainloop *mMainloop;
+ pa_context *mPAContext;
+ bool mConnected;
+ bool mGotSyms;
+};
+
+VolumeCatcherImpl::VolumeCatcherImpl()
+ : mDesiredVolume(0.0f),
+ mMainloop(NULL),
+ mPAContext(NULL),
+ mConnected(false),
+ mGotSyms(false)
+{
+ init();
+}
+
+VolumeCatcherImpl::~VolumeCatcherImpl()
+{
+ cleanup();
+}
+
+bool VolumeCatcherImpl::loadsyms(std::string pulse_dso_name)
+{
+ return grab_pa_syms(pulse_dso_name);
+}
+
+void VolumeCatcherImpl::init()
+{
+ // try to be as defensive as possible because PA's interface is a
+ // bit fragile and (for our purposes) we'd rather simply not function
+ // than crash
+
+ // we cheat and rely upon libpulse-mainloop-glib.so.0 to pull-in
+ // libpulse.so.0 - this isn't a great assumption, and the two DSOs should
+ // probably be loaded separately. Our Linux DSO framework needs refactoring,
+ // we do this sort of thing a lot with practically identical logic...
+ mGotSyms = loadsyms("libpulse-mainloop-glib.so.0");
+ if (!mGotSyms) return;
+
+ mMainloop = llpa_glib_mainloop_new(g_main_context_default());
+ if (mMainloop)
+ {
+ pa_mainloop_api *api = llpa_glib_mainloop_get_api(mMainloop);
+ if (api)
+ {
+ pa_proplist *proplist = llpa_proplist_new();
+ if (proplist)
+ {
+ llpa_proplist_sets(proplist, PA_PROP_APPLICATION_ICON_NAME, "multimedia-player");
+ llpa_proplist_sets(proplist, PA_PROP_APPLICATION_ID, "com.secondlife.viewer.mediaplugvoladjust");
+ llpa_proplist_sets(proplist, PA_PROP_APPLICATION_NAME, "SL Plugin Volume Adjuster");
+ llpa_proplist_sets(proplist, PA_PROP_APPLICATION_VERSION, "1");
+
+ // plain old pa_context_new() is broken!
+ mPAContext = llpa_context_new_with_proplist(api, NULL, proplist);
+ llpa_proplist_free(proplist);
+ }
+ }
+ }
+
+ // Now we've set up a PA context and mainloop, try connecting the
+ // PA context to a PA daemon.
+ if (mPAContext)
+ {
+ llpa_context_set_state_callback(mPAContext, callback_context_state, this);
+ pa_context_flags_t cflags = (pa_context_flags)0; // maybe add PA_CONTEXT_NOAUTOSPAWN?
+ if (llpa_context_connect(mPAContext, NULL, cflags, NULL) >= 0)
+ {
+ // Okay! We haven't definitely connected, but we
+ // haven't definitely failed yet.
+ }
+ else
+ {
+ // Failed to connect to PA manager... we'll leave
+ // things like that. Perhaps we should try again later.
+ }
+ }
+}
+
+void VolumeCatcherImpl::cleanup()
+{
+ mConnected = false;
+
+ if (mGotSyms && mPAContext)
+ {
+ llpa_context_disconnect(mPAContext);
+ llpa_context_unref(mPAContext);
+ }
+ mPAContext = NULL;
+
+ if (mGotSyms && mMainloop)
+ {
+ llpa_glib_mainloop_free(mMainloop);
+ }
+ mMainloop = NULL;
+}
+
+void VolumeCatcherImpl::setVolume(F32 volume)
+{
+ mDesiredVolume = volume;
+
+ if (!mGotSyms) return;
+
+ if (mConnected && mPAContext)
+ {
+ update_all_volumes(mDesiredVolume);
+ }
+
+ pump();
+}
+
+void VolumeCatcherImpl::pump()
+{
+ gboolean may_block = FALSE;
+ g_main_context_iteration(g_main_context_default(), may_block);
+}
+
+void VolumeCatcherImpl::connected_okay()
+{
+ pa_operation *op;
+
+ // fetch global list of existing sinkinputs
+ if ((op = llpa_context_get_sink_input_info_list(mPAContext,
+ callback_discovered_sinkinput,
+ this)))
+ {
+ llpa_operation_unref(op);
+ }
+
+ // subscribe to future global sinkinput changes
+ llpa_context_set_subscribe_callback(mPAContext,
+ callback_subscription_alert,
+ this);
+ if ((op = llpa_context_subscribe(mPAContext, (pa_subscription_mask_t)
+ (PA_SUBSCRIPTION_MASK_SINK_INPUT),
+ NULL, NULL)))
+ {
+ llpa_operation_unref(op);
+ }
+}
+
+void VolumeCatcherImpl::update_all_volumes(F32 volume)
+{
+ for (std::set<U32>::iterator it = mSinkInputIndices.begin();
+ it != mSinkInputIndices.end(); ++it)
+ {
+ update_index_volume(*it, volume);
+ }
+}
+
+void VolumeCatcherImpl::update_index_volume(U32 index, F32 volume)
+{
+ static pa_cvolume cvol;
+ llpa_cvolume_set(&cvol, mSinkInputNumChannels[index],
+ llpa_sw_volume_from_linear(volume));
+
+ pa_context *c = mPAContext;
+ uint32_t idx = index;
+ const pa_cvolume *cvolumep = &cvol;
+ pa_context_success_cb_t cb = NULL; // okay as null
+ void *userdata = NULL; // okay as null
+
+ pa_operation *op;
+ if ((op = llpa_context_set_sink_input_volume(c, idx, cvolumep, cb, userdata)))
+ {
+ llpa_operation_unref(op);
+ }
+}
+
+
+void callback_discovered_sinkinput(pa_context *context, const pa_sink_input_info *sii, int eol, void *userdata)
+{
+ VolumeCatcherImpl *impl = dynamic_cast<VolumeCatcherImpl*>((VolumeCatcherImpl*)userdata);
+ llassert(impl);
+
+ if (0 == eol)
+ {
+ pa_proplist *proplist = sii->proplist;
+ pid_t sinkpid = atoll(llpa_proplist_gets(proplist, PA_PROP_APPLICATION_PROCESS_ID));
+
+ if (sinkpid == getpid()) // does the discovered sinkinput belong to this process?
+ {
+ bool is_new = (impl->mSinkInputIndices.find(sii->index) ==
+ impl->mSinkInputIndices.end());
+
+ impl->mSinkInputIndices.insert(sii->index);
+ impl->mSinkInputNumChannels[sii->index] = sii->channel_map.channels;
+
+ if (is_new)
+ {
+ // new!
+ impl->update_index_volume(sii->index, impl->mDesiredVolume);
+ }
+ else
+ {
+ // seen it already, do nothing.
+ }
+ }
+ }
+}
+
+void callback_subscription_alert(pa_context *context, pa_subscription_event_type_t t, uint32_t index, void *userdata)
+{
+ VolumeCatcherImpl *impl = dynamic_cast<VolumeCatcherImpl*>((VolumeCatcherImpl*)userdata);
+ llassert(impl);
+
+ switch (t & PA_SUBSCRIPTION_EVENT_FACILITY_MASK) {
+ case PA_SUBSCRIPTION_EVENT_SINK_INPUT:
+ if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) ==
+ PA_SUBSCRIPTION_EVENT_REMOVE)
+ {
+ // forget this sinkinput, if we were caring about it
+ impl->mSinkInputIndices.erase(index);
+ impl->mSinkInputNumChannels.erase(index);
+ }
+ else if ((t & PA_SUBSCRIPTION_EVENT_TYPE_MASK) ==
+ PA_SUBSCRIPTION_EVENT_NEW)
+ {
+ // ask for more info about this new sinkinput
+ pa_operation *op;
+ if ((op = llpa_context_get_sink_input_info(impl->mPAContext, index, callback_discovered_sinkinput, impl)))
+ {
+ llpa_operation_unref(op);
+ }
+ }
+ else
+ {
+ // property change on this sinkinput - we don't care.
+ }
+ break;
+
+ default:;
+ }
+}
+
+void callback_context_state(pa_context *context, void *userdata)
+{
+ VolumeCatcherImpl *impl = dynamic_cast<VolumeCatcherImpl*>((VolumeCatcherImpl*)userdata);
+ llassert(impl);
+
+ switch (llpa_context_get_state(context))
+ {
+ case PA_CONTEXT_READY:
+ impl->mConnected = true;
+ impl->connected_okay();
+ break;
+ case PA_CONTEXT_TERMINATED:
+ impl->mConnected = false;
+ break;
+ case PA_CONTEXT_FAILED:
+ impl->mConnected = false;
+ break;
+ default:;
+ }
+}
+
+/////////////////////////////////////////////////////
+
+VolumeCatcher::VolumeCatcher()
+{
+ pimpl = new VolumeCatcherImpl();
+}
+
+VolumeCatcher::~VolumeCatcher()
+{
+ delete pimpl;
+ pimpl = NULL;
+}
+
+void VolumeCatcher::setVolume(F32 volume)
+{
+ llassert(pimpl);
+ pimpl->setVolume(volume);
+}
+
+void VolumeCatcher::setPan(F32 pan)
+{
+ // TODO: implement this (if possible)
+}
+
+void VolumeCatcher::pump()
+{
+ llassert(pimpl);
+ pimpl->pump();
+}
diff --git a/indra/media_plugins/webkit/linux_volume_catcher_pa_syms.inc b/indra/media_plugins/webkit/linux_volume_catcher_pa_syms.inc
new file mode 100644
index 0000000000..d806b48428
--- /dev/null
+++ b/indra/media_plugins/webkit/linux_volume_catcher_pa_syms.inc
@@ -0,0 +1,21 @@
+// required symbols to grab
+LL_PA_SYM(true, pa_context_connect, int, pa_context *c, const char *server, pa_context_flags_t flags, const pa_spawn_api *api);
+LL_PA_SYM(true, pa_context_disconnect, void, pa_context *c);
+LL_PA_SYM(true, pa_context_get_sink_input_info, pa_operation*, pa_context *c, uint32_t idx, pa_sink_input_info_cb_t cb, void *userdata);
+LL_PA_SYM(true, pa_context_get_sink_input_info_list, pa_operation*, pa_context *c, pa_sink_input_info_cb_t cb, void *userdata);
+LL_PA_SYM(true, pa_context_get_state, pa_context_state_t, pa_context *c);
+LL_PA_SYM(true, pa_context_new_with_proplist, pa_context*, pa_mainloop_api *mainloop, const char *name, pa_proplist *proplist);
+LL_PA_SYM(true, pa_context_set_sink_input_volume, pa_operation*, pa_context *c, uint32_t idx, const pa_cvolume *volume, pa_context_success_cb_t cb, void *userdata);
+LL_PA_SYM(true, pa_context_set_state_callback, void, pa_context *c, pa_context_notify_cb_t cb, void *userdata);
+LL_PA_SYM(true, pa_context_set_subscribe_callback, void, pa_context *c, pa_context_subscribe_cb_t cb, void *userdata);
+LL_PA_SYM(true, pa_context_subscribe, pa_operation*, pa_context *c, pa_subscription_mask_t m, pa_context_success_cb_t cb, void *userdata);
+LL_PA_SYM(true, pa_context_unref, void, pa_context *c);
+LL_PA_SYM(true, pa_cvolume_set, pa_cvolume*, pa_cvolume *a, unsigned channels, pa_volume_t v);
+LL_PA_SYM(true, pa_operation_unref, void, pa_operation *o);
+LL_PA_SYM(true, pa_proplist_free, void, pa_proplist* p);
+LL_PA_SYM(true, pa_proplist_gets, const char*, pa_proplist *p, const char *key);
+LL_PA_SYM(true, pa_proplist_new, pa_proplist*, void);
+LL_PA_SYM(true, pa_proplist_sets, int, pa_proplist *p, const char *key, const char *value);
+LL_PA_SYM(true, pa_sw_volume_from_linear, pa_volume_t, double v);
+
+// optional symbols to grab
diff --git a/indra/media_plugins/webkit/linux_volume_catcher_paglib_syms.inc b/indra/media_plugins/webkit/linux_volume_catcher_paglib_syms.inc
new file mode 100644
index 0000000000..abf628c96c
--- /dev/null
+++ b/indra/media_plugins/webkit/linux_volume_catcher_paglib_syms.inc
@@ -0,0 +1,6 @@
+// required symbols to grab
+LL_PA_SYM(true, pa_glib_mainloop_free, void, pa_glib_mainloop* g);
+LL_PA_SYM(true, pa_glib_mainloop_get_api, pa_mainloop_api*, pa_glib_mainloop* g);
+LL_PA_SYM(true, pa_glib_mainloop_new, pa_glib_mainloop *, GMainContext *c);
+
+// optional symbols to grab
diff --git a/indra/media_plugins/webkit/mac_volume_catcher.cpp b/indra/media_plugins/webkit/mac_volume_catcher.cpp
new file mode 100644
index 0000000000..38727e5965
--- /dev/null
+++ b/indra/media_plugins/webkit/mac_volume_catcher.cpp
@@ -0,0 +1,273 @@
+/**
+ * @file mac_volume_catcher.cpp
+ * @brief A Mac OS X specific hack to control the volume level of all audio channels opened by a process.
+ *
+ * @cond
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlife.com/developers/opensource/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlife.com/developers/opensource/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ * @endcond
+ */
+
+/**************************************************************************************************************
+ This code works by using CaptureComponent to capture the "Default Output" audio component
+ (kAudioUnitType_Output/kAudioUnitSubType_DefaultOutput) and delegating all calls to the original component.
+ It does this just to keep track of all instances of the default output component, so that it can set the
+ kHALOutputParam_Volume parameter on all of them to adjust the output volume.
+**************************************************************************************************************/
+
+#include "volume_catcher.h"
+
+#include <Carbon/Carbon.h>
+#include <QuickTime/QuickTime.h>
+#include <AudioUnit/AudioUnit.h>
+
+struct VolumeCatcherStorage;
+
+class VolumeCatcherImpl
+{
+public:
+
+ void setVolume(F32 volume);
+ void setPan(F32 pan);
+
+ void setInstanceVolume(VolumeCatcherStorage *instance);
+
+ std::list<VolumeCatcherStorage*> mComponentInstances;
+ Component mOriginalDefaultOutput;
+ Component mVolumeAdjuster;
+
+ static VolumeCatcherImpl *getInstance();
+private:
+ // This is a singleton class -- both callers and the component implementation should use getInstance() to find the instance.
+ VolumeCatcherImpl();
+ static VolumeCatcherImpl *sInstance;
+
+ // The singlar instance of this class is expected to last until the process exits.
+ // To ensure this, we declare the destructor here but never define it, so any code which attempts to destroy the instance will not link.
+ ~VolumeCatcherImpl();
+
+ F32 mVolume;
+ F32 mPan;
+};
+
+VolumeCatcherImpl *VolumeCatcherImpl::sInstance = NULL;;
+
+struct VolumeCatcherStorage
+{
+ ComponentInstance self;
+ ComponentInstance delegate;
+};
+
+static ComponentResult volume_catcher_component_entry(ComponentParameters *cp, Handle componentStorage);
+static ComponentResult volume_catcher_component_open(VolumeCatcherStorage *storage, ComponentInstance self);
+static ComponentResult volume_catcher_component_close(VolumeCatcherStorage *storage, ComponentInstance self);
+
+VolumeCatcherImpl *VolumeCatcherImpl::getInstance()
+{
+ if(!sInstance)
+ {
+ sInstance = new VolumeCatcherImpl;
+ }
+
+ return sInstance;
+}
+
+VolumeCatcherImpl::VolumeCatcherImpl()
+{
+ mVolume = 1.0; // default to full volume
+ mPan = 0.0; // and center pan
+
+ ComponentDescription desc;
+ desc.componentType = kAudioUnitType_Output;
+ desc.componentSubType = kAudioUnitSubType_DefaultOutput;
+ desc.componentManufacturer = kAudioUnitManufacturer_Apple;
+ desc.componentFlags = 0;
+ desc.componentFlagsMask = 0;
+
+ // Find the original default output component
+ mOriginalDefaultOutput = FindNextComponent(NULL, &desc);
+
+ // Register our own output component with the same parameters
+ mVolumeAdjuster = RegisterComponent(&desc, NewComponentRoutineUPP(volume_catcher_component_entry), 0, NULL, NULL, NULL);
+
+ // Capture the original component, so we always get found instead.
+ CaptureComponent(mOriginalDefaultOutput, mVolumeAdjuster);
+
+}
+
+static ComponentResult volume_catcher_component_entry(ComponentParameters *cp, Handle componentStorage)
+{
+ ComponentResult result = badComponentSelector;
+ VolumeCatcherStorage *storage = (VolumeCatcherStorage*)componentStorage;
+
+ switch(cp->what)
+ {
+ case kComponentOpenSelect:
+// std::cerr << "kComponentOpenSelect" << std::endl;
+ result = CallComponentFunctionWithStorageProcInfo((Handle)storage, cp, (ProcPtr)volume_catcher_component_open, uppCallComponentOpenProcInfo);
+ break;
+
+ case kComponentCloseSelect:
+// std::cerr << "kComponentCloseSelect" << std::endl;
+ result = CallComponentFunctionWithStorageProcInfo((Handle)storage, cp, (ProcPtr)volume_catcher_component_close, uppCallComponentCloseProcInfo);
+ // CallComponentFunctionWithStorageProcInfo
+ break;
+
+ default:
+// std::cerr << "Delegating selector: " << cp->what << " to component instance " << storage->delegate << std::endl;
+ result = DelegateComponentCall(cp, storage->delegate);
+ break;
+ }
+
+ return result;
+}
+
+static ComponentResult volume_catcher_component_open(VolumeCatcherStorage *storage, ComponentInstance self)
+{
+ ComponentResult result = noErr;
+ VolumeCatcherImpl *impl = VolumeCatcherImpl::getInstance();
+
+ storage = new VolumeCatcherStorage;
+
+ storage->self = self;
+ storage->delegate = NULL;
+
+ result = OpenAComponent(impl->mOriginalDefaultOutput, &(storage->delegate));
+
+ if(result != noErr)
+ {
+// std::cerr << "OpenAComponent result = " << result << ", component ref = " << storage->delegate << std::endl;
+
+ // If we failed to open the delagate component, our open is going to fail. Clean things up.
+ delete storage;
+ }
+ else
+ {
+ // Success -- set up this component's storage
+ SetComponentInstanceStorage(self, (Handle)storage);
+
+ // add this instance to the global list
+ impl->mComponentInstances.push_back(storage);
+
+ // and set up the initial volume
+ impl->setInstanceVolume(storage);
+ }
+
+ return result;
+}
+
+static ComponentResult volume_catcher_component_close(VolumeCatcherStorage *storage, ComponentInstance self)
+{
+ ComponentResult result = noErr;
+
+ if(storage)
+ {
+ if(storage->delegate)
+ {
+ CloseComponent(storage->delegate);
+ storage->delegate = NULL;
+ }
+
+ VolumeCatcherImpl *impl = VolumeCatcherImpl::getInstance();
+ impl->mComponentInstances.remove(storage);
+ delete[] storage;
+ }
+
+ return result;
+}
+
+void VolumeCatcherImpl::setVolume(F32 volume)
+{
+ VolumeCatcherImpl *impl = VolumeCatcherImpl::getInstance();
+ impl->mVolume = volume;
+
+ // Iterate through all known instances, setting the volume on each.
+ for(std::list<VolumeCatcherStorage*>::iterator iter = mComponentInstances.begin(); iter != mComponentInstances.end(); ++iter)
+ {
+ impl->setInstanceVolume(*iter);
+ }
+}
+
+void VolumeCatcherImpl::setPan(F32 pan)
+{
+ VolumeCatcherImpl *impl = VolumeCatcherImpl::getInstance();
+ impl->mPan = pan;
+
+ // TODO: implement this.
+ // This will probably require adding a "panner" audio unit to the chain somehow.
+ // There's also a "3d mixer" component that we might be able to use...
+}
+
+void VolumeCatcherImpl::setInstanceVolume(VolumeCatcherStorage *instance)
+{
+// std::cerr << "Setting volume on component instance: " << (instance->delegate) << " to " << mVolume << std::endl;
+
+ OSStatus err = noErr;
+
+ if(instance && instance->delegate)
+ {
+ err = AudioUnitSetParameter(
+ instance->delegate,
+ kHALOutputParam_Volume,
+ kAudioUnitScope_Global,
+ 0,
+ mVolume,
+ 0);
+ }
+
+ if(err)
+ {
+// std::cerr << " AudioUnitSetParameter returned " << err << std::endl;
+ }
+}
+
+/////////////////////////////////////////////////////
+
+VolumeCatcher::VolumeCatcher()
+{
+ pimpl = VolumeCatcherImpl::getInstance();
+}
+
+VolumeCatcher::~VolumeCatcher()
+{
+ // Let the instance persist until exit.
+}
+
+void VolumeCatcher::setVolume(F32 volume)
+{
+ pimpl->setVolume(volume);
+}
+
+void VolumeCatcher::setPan(F32 pan)
+{
+ pimpl->setPan(pan);
+}
+
+void VolumeCatcher::pump()
+{
+ // No periodic tasks are necessary for this implementation.
+}
+
diff --git a/indra/media_plugins/webkit/media_plugin_webkit.cpp b/indra/media_plugins/webkit/media_plugin_webkit.cpp
index b607d2f66a..a9ff7bf752 100644
--- a/indra/media_plugins/webkit/media_plugin_webkit.cpp
+++ b/indra/media_plugins/webkit/media_plugin_webkit.cpp
@@ -43,12 +43,18 @@
#include "llpluginmessageclasses.h"
#include "media_plugin_base.h"
+// set to 1 if you're using the version of llqtwebkit that's QPixmap-ified
#if LL_LINUX
+# define LL_QTWEBKIT_USES_PIXMAPS 0
extern "C" {
# include <glib.h>
}
+#else
+# define LL_QTWEBKIT_USES_PIXMAPS 0
#endif // LL_LINUX
+# include "volume_catcher.h"
+
#if LL_WINDOWS
# include <direct.h>
#else
@@ -83,10 +89,16 @@ public:
private:
std::string mProfileDir;
+ std::string mHostLanguage;
+ std::string mUserAgent;
+ bool mCookiesEnabled;
+ bool mJavascriptEnabled;
+ bool mPluginsEnabled;
enum
{
- INIT_STATE_UNINITIALIZED, // Browser instance hasn't been set up yet
+ INIT_STATE_UNINITIALIZED, // LLQtWebkit hasn't been set up yet
+ INIT_STATE_INITIALIZED, // LLQtWebkit has been set up, but no browser window has been created yet.
INIT_STATE_NAVIGATING, // Browser instance has been set up and initial navigate to about:blank has been issued
INIT_STATE_NAVIGATE_COMPLETE, // initial navigate to about:blank has completed
INIT_STATE_WAIT_REDRAW, // First real navigate begin has been received, waiting for page changed event to start handling redraws
@@ -108,6 +120,8 @@ private:
F32 mBackgroundG;
F32 mBackgroundB;
+ VolumeCatcher mVolumeCatcher;
+
void setInitState(int state)
{
// std::cerr << "changing init state to " << state << std::endl;
@@ -130,6 +144,8 @@ private:
// pump qt
LLQtWebKit::getInstance()->pump( milliseconds );
+ mVolumeCatcher.pump();
+
checkEditState();
if(mInitState == INIT_STATE_NAVIGATE_COMPLETE)
@@ -146,7 +162,11 @@ private:
{
const unsigned char* browser_pixels = LLQtWebKit::getInstance()->grabBrowserWindow( mBrowserWindowId );
- unsigned int buffer_size = LLQtWebKit::getInstance()->getBrowserRowSpan( mBrowserWindowId ) * LLQtWebKit::getInstance()->getBrowserHeight( mBrowserWindowId );
+ unsigned int rowspan = LLQtWebKit::getInstance()->getBrowserRowSpan( mBrowserWindowId );
+ unsigned int height = LLQtWebKit::getInstance()->getBrowserHeight( mBrowserWindowId );
+#if !LL_QTWEBKIT_USES_PIXMAPS
+ unsigned int buffer_size = rowspan * height;
+#endif // !LL_QTWEBKIT_USES_PIXMAPS
// std::cerr << "webkit plugin: updating" << std::endl;
@@ -154,7 +174,16 @@ private:
if ( mPixels && browser_pixels )
{
// std::cerr << " memcopy of " << buffer_size << " bytes" << std::endl;
+
+#if LL_QTWEBKIT_USES_PIXMAPS
+ // copy the pixel data upside-down because of the co-ord system
+ for (int y=0; y<height; ++y)
+ {
+ memcpy( &mPixels[(height-y-1)*rowspan], &browser_pixels[y*rowspan], rowspan );
+ }
+#else
memcpy( mPixels, browser_pixels, buffer_size );
+#endif // LL_QTWEBKIT_USES_PIXMAPS
}
if ( mWidth > 0 && mHeight > 0 )
@@ -175,13 +204,6 @@ private:
if ( mInitState > INIT_STATE_UNINITIALIZED )
return true;
- // not enough information to initialize the browser yet.
- if ( mWidth < 0 || mHeight < 0 || mDepth < 0 ||
- mTextureWidth < 0 || mTextureHeight < 0 )
- {
- return false;
- };
-
// set up directories
char cwd[ FILENAME_MAX ]; // I *think* this is defined on all platforms we use
if (NULL == getcwd( cwd, FILENAME_MAX - 1 ))
@@ -192,12 +214,12 @@ private:
std::string application_dir = std::string( cwd );
#if LL_DARWIN
- // When running under the Xcode debugger, there's a setting called "Break on Debugger()/DebugStr()" which defaults to being turned on.
- // This causes the environment variable USERBREAK to be set to 1, which causes these legacy calls to break into the debugger.
- // This wouldn't cause any problems except for the fact that the current release version of the Flash plugin has a call to Debugger() in it
- // which gets hit when the plugin is probed by webkit.
- // Unsetting the environment variable here works around this issue.
- unsetenv("USERBREAK");
+ // When running under the Xcode debugger, there's a setting called "Break on Debugger()/DebugStr()" which defaults to being turned on.
+ // This causes the environment variable USERBREAK to be set to 1, which causes these legacy calls to break into the debugger.
+ // This wouldn't cause any problems except for the fact that the current release version of the Flash plugin has a call to Debugger() in it
+ // which gets hit when the plugin is probed by webkit.
+ // Unsetting the environment variable here works around this issue.
+ unsetenv("USERBREAK");
#endif
#if LL_WINDOWS
@@ -238,65 +260,94 @@ private:
bool result = LLQtWebKit::getInstance()->init( application_dir, component_dir, mProfileDir, native_window_handle );
if ( result )
{
- // create single browser window
- mBrowserWindowId = LLQtWebKit::getInstance()->createBrowserWindow( mWidth, mHeight );
-#if LL_WINDOWS
- // Enable plugins
- LLQtWebKit::getInstance()->enablePlugins(true);
-#elif LL_DARWIN
- // Enable plugins
- LLQtWebKit::getInstance()->enablePlugins(true);
-#elif LL_LINUX
- // Enable plugins
- LLQtWebKit::getInstance()->enablePlugins(true);
-#endif
- // Enable cookies
- LLQtWebKit::getInstance()->enableCookies( true );
-
- // tell LLQtWebKit about the size of the browser window
- LLQtWebKit::getInstance()->setSize( mBrowserWindowId, mWidth, mHeight );
-
- // observer events that LLQtWebKit emits
- LLQtWebKit::getInstance()->addObserver( mBrowserWindowId, this );
-
- // append details to agent string
- LLQtWebKit::getInstance()->setBrowserAgentId( "LLPluginMedia Web Browser" );
-
- // don't flip bitmap
- LLQtWebKit::getInstance()->flipWindow( mBrowserWindowId, true );
-
- // set background color
- // convert background color channels from [0.0, 1.0] to [0, 255];
- LLQtWebKit::getInstance()->setBackgroundColor( mBrowserWindowId, int(mBackgroundR * 255.0f), int(mBackgroundG * 255.0f), int(mBackgroundB * 255.0f) );
-
- // Set state _before_ starting the navigate, since onNavigateBegin might get called before this call returns.
- setInitState(INIT_STATE_NAVIGATING);
-
- // Don't do this here -- it causes the dreaded "white flash" when loading a browser instance.
- // FIXME: Re-added this because navigating to a "page" initializes things correctly - especially
- // for the HTTP AUTH dialog issues (DEV-41731). Will fix at a later date.
- // Build a data URL like this: "data:text/html,%3Chtml%3E%3Cbody bgcolor=%22#RRGGBB%22%3E%3C/body%3E%3C/html%3E"
- // where RRGGBB is the background color in HTML style
- std::stringstream url;
+ mInitState = INIT_STATE_INITIALIZED;
- url << "data:text/html,%3Chtml%3E%3Cbody%20bgcolor=%22#";
- // convert background color channels from [0.0, 1.0] to [0, 255];
- url << std::setfill('0') << std::setw(2) << std::hex << int(mBackgroundR * 255.0f);
- url << std::setfill('0') << std::setw(2) << std::hex << int(mBackgroundG * 255.0f);
- url << std::setfill('0') << std::setw(2) << std::hex << int(mBackgroundB * 255.0f);
- url << "%22%3E%3C/body%3E%3C/html%3E";
-
- lldebugs << "data url is: " << url.str() << llendl;
-
- LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, url.str() );
-// LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, "about:blank" );
-
return true;
};
return false;
};
+ ////////////////////////////////////////////////////////////////////////////////
+ //
+ bool initBrowserWindow()
+ {
+ // already initialized
+ if ( mInitState > INIT_STATE_INITIALIZED )
+ return true;
+
+ // not enough information to initialize the browser yet.
+ if ( mWidth < 0 || mHeight < 0 || mDepth < 0 ||
+ mTextureWidth < 0 || mTextureHeight < 0 )
+ {
+ return false;
+ };
+
+ // Set up host language before creating browser window
+ if(!mHostLanguage.empty())
+ {
+ LLQtWebKit::getInstance()->setHostLanguage(mHostLanguage);
+ }
+
+ // turn on/off cookies based on what host app tells us
+ LLQtWebKit::getInstance()->enableCookies( mCookiesEnabled );
+
+ // turn on/off plugins based on what host app tells us
+ LLQtWebKit::getInstance()->enablePlugins( mPluginsEnabled );
+
+ // turn on/off Javascript based on what host app tells us
+ LLQtWebKit::getInstance()->enableJavascript( mJavascriptEnabled );
+
+ // create single browser window
+ mBrowserWindowId = LLQtWebKit::getInstance()->createBrowserWindow( mWidth, mHeight );
+
+ // tell LLQtWebKit about the size of the browser window
+ LLQtWebKit::getInstance()->setSize( mBrowserWindowId, mWidth, mHeight );
+
+ // observer events that LLQtWebKit emits
+ LLQtWebKit::getInstance()->addObserver( mBrowserWindowId, this );
+
+ // append details to agent string
+ LLQtWebKit::getInstance()->setBrowserAgentId( mUserAgent );
+
+ // Set up window open behavior
+ LLQtWebKit::getInstance()->setWindowOpenBehavior(mBrowserWindowId, LLQtWebKit::WOB_SIMULATE_BLANK_HREF_CLICK);
+
+#if !LL_QTWEBKIT_USES_PIXMAPS
+ // don't flip bitmap
+ LLQtWebKit::getInstance()->flipWindow( mBrowserWindowId, true );
+#endif // !LL_QTWEBKIT_USES_PIXMAPS
+
+ // set background color
+ // convert background color channels from [0.0, 1.0] to [0, 255];
+ LLQtWebKit::getInstance()->setBackgroundColor( mBrowserWindowId, int(mBackgroundR * 255.0f), int(mBackgroundG * 255.0f), int(mBackgroundB * 255.0f) );
+
+ // Set state _before_ starting the navigate, since onNavigateBegin might get called before this call returns.
+ setInitState(INIT_STATE_NAVIGATING);
+
+ // Don't do this here -- it causes the dreaded "white flash" when loading a browser instance.
+ // FIXME: Re-added this because navigating to a "page" initializes things correctly - especially
+ // for the HTTP AUTH dialog issues (DEV-41731). Will fix at a later date.
+ // Build a data URL like this: "data:text/html,%3Chtml%3E%3Cbody bgcolor=%22#RRGGBB%22%3E%3C/body%3E%3C/html%3E"
+ // where RRGGBB is the background color in HTML style
+ std::stringstream url;
+
+ url << "data:text/html,%3Chtml%3E%3Cbody%20bgcolor=%22#";
+ // convert background color channels from [0.0, 1.0] to [0, 255];
+ url << std::setfill('0') << std::setw(2) << std::hex << int(mBackgroundR * 255.0f);
+ url << std::setfill('0') << std::setw(2) << std::hex << int(mBackgroundG * 255.0f);
+ url << std::setfill('0') << std::setw(2) << std::hex << int(mBackgroundB * 255.0f);
+ url << "%22%3E%3C/body%3E%3C/html%3E";
+
+ lldebugs << "data url is: " << url.str() << llendl;
+
+ LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, url.str() );
+// LLQtWebKit::getInstance()->navigateTo( mBrowserWindowId, "about:blank" );
+
+ return true;
+ }
+
+ void setVolume(F32 vol);
////////////////////////////////////////////////////////////////////////////////
// virtual
@@ -467,6 +518,19 @@ private:
sendMessage(message);
}
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // virtual
+ void onCookieChanged(const EventType& event)
+ {
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA_BROWSER, "cookie_set");
+ message.setValue("cookie", event.getStringValue());
+ // These could be passed through as well, but aren't really needed.
+// message.setValue("uri", event.getEventUri());
+// message.setValueBoolean("dead", (event.getIntValue() != 0))
+ sendMessage(message);
+ }
+
LLQtWebKit::EKeyboardModifier decodeModifiers(std::string &modifiers)
{
int result = 0;
@@ -486,92 +550,96 @@ private:
return (LLQtWebKit::EKeyboardModifier)result;
}
-
////////////////////////////////////////////////////////////////////////////////
//
- void keyEvent(LLQtWebKit::EKeyEvent key_event, int key, LLQtWebKit::EKeyboardModifier modifiers)
+ void deserializeKeyboardData( LLSD native_key_data, uint32_t& native_scan_code, uint32_t& native_virtual_key, uint32_t& native_modifiers )
{
- int llqt_key;
+ native_scan_code = 0;
+ native_virtual_key = 0;
+ native_modifiers = 0;
+ if( native_key_data.isMap() )
+ {
+#if LL_DARWIN
+ native_scan_code = (uint32_t)(native_key_data["char_code"].asInteger());
+ native_virtual_key = (uint32_t)(native_key_data["key_code"].asInteger());
+ native_modifiers = (uint32_t)(native_key_data["modifiers"].asInteger());
+#elif LL_WINDOWS
+ native_scan_code = (uint32_t)(native_key_data["scan_code"].asInteger());
+ native_virtual_key = (uint32_t)(native_key_data["virtual_key"].asInteger());
+ // TODO: I don't think we need to do anything with native modifiers here -- please verify
+#elif LL_LINUX
+ native_scan_code = (uint32_t)(native_key_data["scan_code"].asInteger());
+ native_virtual_key = (uint32_t)(native_key_data["virtual_key"].asInteger());
+ native_modifiers = (uint32_t)(native_key_data["modifiers"].asInteger());
+#else
+ // Add other platforms here as needed
+#endif
+ };
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+ //
+ void keyEvent(LLQtWebKit::EKeyEvent key_event, int key, LLQtWebKit::EKeyboardModifier modifiers, LLSD native_key_data = LLSD::emptyMap())
+ {
// The incoming values for 'key' will be the ones from indra_constants.h
- // the outgoing values are the ones from llqtwebkit.h
+ std::string utf8_text;
+ if(key < KEY_SPECIAL)
+ {
+ // Low-ascii characters need to get passed through.
+ utf8_text = (char)key;
+ }
+
+ // Any special-case handling we want to do for particular keys...
switch((KEY)key)
{
- // This is the list that the llqtwebkit implementation actually maps into Qt keys.
-// case KEY_XXX: llqt_key = LL_DOM_VK_CANCEL; break;
-// case KEY_XXX: llqt_key = LL_DOM_VK_HELP; break;
- case KEY_BACKSPACE: llqt_key = LL_DOM_VK_BACK_SPACE; break;
- case KEY_TAB: llqt_key = LL_DOM_VK_TAB; break;
-// case KEY_XXX: llqt_key = LL_DOM_VK_CLEAR; break;
- case KEY_RETURN: llqt_key = LL_DOM_VK_RETURN; break;
- case KEY_PAD_RETURN: llqt_key = LL_DOM_VK_ENTER; break;
- case KEY_SHIFT: llqt_key = LL_DOM_VK_SHIFT; break;
- case KEY_CONTROL: llqt_key = LL_DOM_VK_CONTROL; break;
- case KEY_ALT: llqt_key = LL_DOM_VK_ALT; break;
-// case KEY_XXX: llqt_key = LL_DOM_VK_PAUSE; break;
- case KEY_CAPSLOCK: llqt_key = LL_DOM_VK_CAPS_LOCK; break;
- case KEY_ESCAPE: llqt_key = LL_DOM_VK_ESCAPE; break;
- case KEY_PAGE_UP: llqt_key = LL_DOM_VK_PAGE_UP; break;
- case KEY_PAGE_DOWN: llqt_key = LL_DOM_VK_PAGE_DOWN; break;
- case KEY_END: llqt_key = LL_DOM_VK_END; break;
- case KEY_HOME: llqt_key = LL_DOM_VK_HOME; break;
- case KEY_LEFT: llqt_key = LL_DOM_VK_LEFT; break;
- case KEY_UP: llqt_key = LL_DOM_VK_UP; break;
- case KEY_RIGHT: llqt_key = LL_DOM_VK_RIGHT; break;
- case KEY_DOWN: llqt_key = LL_DOM_VK_DOWN; break;
-// case KEY_XXX: llqt_key = LL_DOM_VK_PRINTSCREEN; break;
- case KEY_INSERT: llqt_key = LL_DOM_VK_INSERT; break;
- case KEY_DELETE: llqt_key = LL_DOM_VK_DELETE; break;
-// case KEY_XXX: llqt_key = LL_DOM_VK_CONTEXT_MENU; break;
+ // ASCII codes for some standard keys
+ case LLQtWebKit::KEY_BACKSPACE: utf8_text = (char)8; break;
+ case LLQtWebKit::KEY_TAB: utf8_text = (char)9; break;
+ case LLQtWebKit::KEY_RETURN: utf8_text = (char)13; break;
+ case LLQtWebKit::KEY_PAD_RETURN: utf8_text = (char)13; break;
+ case LLQtWebKit::KEY_ESCAPE: utf8_text = (char)27; break;
- default:
- if(key < KEY_SPECIAL)
- {
- // Pass the incoming key through -- it should be regular ASCII, which should be correct for webkit.
- llqt_key = key;
- }
- else
- {
- // Don't pass through untranslated special keys -- they'll be all wrong.
- llqt_key = 0;
- }
+ default:
break;
}
-// std::cerr << "keypress, original code = 0x" << std::hex << key << ", converted code = 0x" << std::hex << llqt_key << std::dec << std::endl;
+// std::cerr << "key event " << (int)key_event << ", native_key_data = " << native_key_data << std::endl;
- if(llqt_key != 0)
- {
- LLQtWebKit::getInstance()->keyEvent( mBrowserWindowId, key_event, llqt_key, modifiers);
- }
+ uint32_t native_scan_code = 0;
+ uint32_t native_virtual_key = 0;
+ uint32_t native_modifiers = 0;
+ deserializeKeyboardData( native_key_data, native_scan_code, native_virtual_key, native_modifiers );
+
+ LLQtWebKit::getInstance()->keyboardEvent( mBrowserWindowId, key_event, (uint32_t)key, utf8_text.c_str(), modifiers, native_scan_code, native_virtual_key, native_modifiers);
checkEditState();
};
////////////////////////////////////////////////////////////////////////////////
//
- void unicodeInput( const std::string &utf8str, LLQtWebKit::EKeyboardModifier modifiers)
- {
- LLWString wstr = utf8str_to_wstring(utf8str);
+ void unicodeInput( const std::string &utf8str, LLQtWebKit::EKeyboardModifier modifiers, LLSD native_key_data = LLSD::emptyMap())
+ {
+ uint32_t key = LLQtWebKit::KEY_NONE;
- unsigned int i;
- for(i=0; i < wstr.size(); i++)
+// std::cerr << "unicode input, native_key_data = " << native_key_data << std::endl;
+
+ if(utf8str.size() == 1)
{
-// std::cerr << "unicode input, code = 0x" << std::hex << (unsigned long)(wstr[i]) << std::dec << std::endl;
-
- if(wstr[i] == 32)
- {
- // For some reason, the webkit plugin really wants the space bar to come in through the key-event path, not the unicode path.
- LLQtWebKit::getInstance()->keyEvent( mBrowserWindowId, LLQtWebKit::KE_KEY_DOWN, 32, modifiers);
- LLQtWebKit::getInstance()->keyEvent( mBrowserWindowId, LLQtWebKit::KE_KEY_UP, 32, modifiers);
- }
- else
- {
- LLQtWebKit::getInstance()->unicodeInput(mBrowserWindowId, wstr[i], modifiers);
- }
+ // The only way a utf8 string can be one byte long is if it's actually a single 7-bit ascii character.
+ // In this case, use it as the key value.
+ key = utf8str[0];
}
+ uint32_t native_scan_code = 0;
+ uint32_t native_virtual_key = 0;
+ uint32_t native_modifiers = 0;
+ deserializeKeyboardData( native_key_data, native_scan_code, native_virtual_key, native_modifiers );
+
+ LLQtWebKit::getInstance()->keyboardEvent( mBrowserWindowId, LLQtWebKit::KE_KEY_DOWN, (uint32_t)key, utf8str.c_str(), modifiers, native_scan_code, native_virtual_key, native_modifiers);
+ LLQtWebKit::getInstance()->keyboardEvent( mBrowserWindowId, LLQtWebKit::KE_KEY_UP, (uint32_t)key, utf8str.c_str(), modifiers, native_scan_code, native_virtual_key, native_modifiers);
+
checkEditState();
};
@@ -627,6 +695,11 @@ MediaPluginWebKit::MediaPluginWebKit(LLPluginInstance::sendMessageFunction host_
mBackgroundR = 0.0f;
mBackgroundG = 0.0f;
mBackgroundB = 0.0f;
+
+ mHostLanguage = "en"; // default to english
+ mJavascriptEnabled = true; // default to on
+ mPluginsEnabled = true; // default to on
+ mUserAgent = "LLPluginMedia Web Browser";
}
MediaPluginWebKit::~MediaPluginWebKit()
@@ -653,9 +726,6 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
{
if(message_name == "init")
{
- std::string user_data_path = message_in.getValue("user_data_path"); // n.b. always has trailing platform-specific dir-delimiter
- mProfileDir = user_data_path + "browser_profile";
-
LLPluginMessage message("base", "init_response");
LLSD versions = LLSD::emptyMap();
versions[LLPLUGIN_MESSAGE_CLASS_BASE] = LLPLUGIN_MESSAGE_CLASS_BASE_VERSION;
@@ -667,19 +737,6 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
plugin_version += LLQtWebKit::getInstance()->getVersion();
message.setValue("plugin_version", plugin_version);
sendMessage(message);
-
- // Plugin gets to decide the texture parameters to use.
- mDepth = 4;
-
- message.setMessage(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params");
- message.setValueS32("default_width", 1024);
- message.setValueS32("default_height", 1024);
- message.setValueS32("depth", mDepth);
- message.setValueU32("internalformat", GL_RGBA);
- message.setValueU32("format", GL_RGBA);
- message.setValueU32("type", GL_UNSIGNED_BYTE);
- message.setValueBoolean("coords_opengl", true);
- sendMessage(message);
}
else if(message_name == "idle")
{
@@ -744,9 +801,68 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
// std::cerr << "MediaPluginWebKit::receiveMessage: unknown base message: " << message_name << std::endl;
}
}
+ else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA_TIME)
+ {
+ if(message_name == "set_volume")
+ {
+ F32 volume = message_in.getValueReal("volume");
+ setVolume(volume);
+ }
+ }
else if(message_class == LLPLUGIN_MESSAGE_CLASS_MEDIA)
{
- if(message_name == "size_change")
+ if(message_name == "init")
+ {
+ // This is the media init message -- all necessary data for initialization should have been received.
+ if(initBrowser())
+ {
+
+ // Plugin gets to decide the texture parameters to use.
+ mDepth = 4;
+
+ LLPluginMessage message(LLPLUGIN_MESSAGE_CLASS_MEDIA, "texture_params");
+ message.setValueS32("default_width", 1024);
+ message.setValueS32("default_height", 1024);
+ message.setValueS32("depth", mDepth);
+ message.setValueU32("internalformat", GL_RGBA);
+ #if LL_QTWEBKIT_USES_PIXMAPS
+ message.setValueU32("format", GL_BGRA_EXT); // I hope this isn't system-dependant... is it? If so, we'll have to check the root window's pixel layout or something... yuck.
+ #else
+ message.setValueU32("format", GL_RGBA);
+ #endif // LL_QTWEBKIT_USES_PIXMAPS
+ message.setValueU32("type", GL_UNSIGNED_BYTE);
+ message.setValueBoolean("coords_opengl", true);
+ sendMessage(message);
+ }
+ else
+ {
+ // if initialization failed, we're done.
+ mDeleteMe = true;
+ }
+
+ }
+ else if(message_name == "set_user_data_path")
+ {
+ std::string user_data_path = message_in.getValue("path"); // n.b. always has trailing platform-specific dir-delimiter
+ mProfileDir = user_data_path + "browser_profile";
+
+ // FIXME: Should we do anything with this if it comes in after the browser has been initialized?
+ }
+ else if(message_name == "set_language_code")
+ {
+ mHostLanguage = message_in.getValue("language");
+
+ // FIXME: Should we do anything with this if it comes in after the browser has been initialized?
+ }
+ else if(message_name == "plugins_enabled")
+ {
+ mPluginsEnabled = message_in.getValueBoolean("enable");
+ }
+ else if(message_name == "javascript_enabled")
+ {
+ mJavascriptEnabled = message_in.getValueBoolean("enable");
+ }
+ else if(message_name == "size_change")
{
std::string name = message_in.getValue("name");
S32 width = message_in.getValueS32("width");
@@ -768,29 +884,36 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
mWidth = width;
mHeight = height;
- // initialize (only gets called once)
- initBrowser();
-
- // size changed so tell the browser
- LLQtWebKit::getInstance()->setSize( mBrowserWindowId, mWidth, mHeight );
-
-// std::cerr << "webkit plugin: set size to " << mWidth << " x " << mHeight
-// << ", rowspan is " << LLQtWebKit::getInstance()->getBrowserRowSpan(mBrowserWindowId) << std::endl;
-
- S32 real_width = LLQtWebKit::getInstance()->getBrowserRowSpan(mBrowserWindowId) / LLQtWebKit::getInstance()->getBrowserDepth(mBrowserWindowId);
-
- // The actual width the browser will be drawing to is probably smaller... let the host know by modifying texture_width in the response.
- if(real_width <= texture_width)
+ if(initBrowserWindow())
{
- texture_width = real_width;
+
+ // size changed so tell the browser
+ LLQtWebKit::getInstance()->setSize( mBrowserWindowId, mWidth, mHeight );
+
+ // std::cerr << "webkit plugin: set size to " << mWidth << " x " << mHeight
+ // << ", rowspan is " << LLQtWebKit::getInstance()->getBrowserRowSpan(mBrowserWindowId) << std::endl;
+
+ S32 real_width = LLQtWebKit::getInstance()->getBrowserRowSpan(mBrowserWindowId) / LLQtWebKit::getInstance()->getBrowserDepth(mBrowserWindowId);
+
+ // The actual width the browser will be drawing to is probably smaller... let the host know by modifying texture_width in the response.
+ if(real_width <= texture_width)
+ {
+ texture_width = real_width;
+ }
+ else
+ {
+ // This won't work -- it'll be bigger than the allocated memory. This is a fatal error.
+ // std::cerr << "Fatal error: browser rowbytes greater than texture width" << std::endl;
+ mDeleteMe = true;
+ return;
+ }
}
else
{
- // This won't work -- it'll be bigger than the allocated memory. This is a fatal error.
-// std::cerr << "Fatal error: browser rowbytes greater than texture width" << std::endl;
+ // Setting up the browser window failed. This is a fatal error.
mDeleteMe = true;
- return;
}
+
mTextureWidth = texture_width;
mTextureHeight = texture_height;
@@ -871,6 +994,7 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
std::string event = message_in.getValue("event");
S32 key = message_in.getValueS32("key");
std::string modifiers = message_in.getValue("modifiers");
+ LLSD native_key_data = message_in.getValueLLSD("native_key_data");
// Treat unknown events as key-up for safety.
LLQtWebKit::EKeyEvent key_event = LLQtWebKit::KE_KEY_UP;
@@ -883,14 +1007,15 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
key_event = LLQtWebKit::KE_KEY_REPEAT;
}
- keyEvent(key_event, key, decodeModifiers(modifiers));
+ keyEvent(key_event, key, decodeModifiers(modifiers), native_key_data);
}
else if(message_name == "text_event")
{
std::string text = message_in.getValue("text");
std::string modifiers = message_in.getValue("modifiers");
+ LLSD native_key_data = message_in.getValueLLSD("native_key_data");
- unicodeInput(text, decodeModifiers(modifiers));
+ unicodeInput(text, decodeModifiers(modifiers), native_key_data);
}
if(message_name == "edit_cut")
{
@@ -938,8 +1063,22 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
}
else if(message_name == "enable_cookies")
{
- bool val = message_in.getValueBoolean("enable");
- LLQtWebKit::getInstance()->enableCookies( val );
+ mCookiesEnabled = message_in.getValueBoolean("enable");
+ LLQtWebKit::getInstance()->enableCookies( mCookiesEnabled );
+ }
+ else if(message_name == "enable_plugins")
+ {
+ mPluginsEnabled = message_in.getValueBoolean("enable");
+ LLQtWebKit::getInstance()->enablePlugins( mPluginsEnabled );
+ }
+ else if(message_name == "enable_javascript")
+ {
+ mJavascriptEnabled = message_in.getValueBoolean("enable");
+ //LLQtWebKit::getInstance()->enableJavascript( mJavascriptEnabled );
+ }
+ else if(message_name == "set_cookies")
+ {
+ LLQtWebKit::getInstance()->setCookies(message_in.getValue("cookies"));
}
else if(message_name == "proxy_setup")
{
@@ -976,8 +1115,8 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
}
else if(message_name == "set_user_agent")
{
- std::string user_agent = message_in.getValue("user_agent");
- LLQtWebKit::getInstance()->setBrowserAgentId( user_agent );
+ mUserAgent = message_in.getValue("user_agent");
+ LLQtWebKit::getInstance()->setBrowserAgentId( mUserAgent );
}
else if(message_name == "init_history")
{
@@ -1008,6 +1147,11 @@ void MediaPluginWebKit::receiveMessage(const char *message_string)
}
}
+void MediaPluginWebKit::setVolume(F32 volume)
+{
+ mVolumeCatcher.setVolume(volume);
+}
+
int init_media_plugin(LLPluginInstance::sendMessageFunction host_send_func, void *host_user_data, LLPluginInstance::sendMessageFunction *plugin_send_func, void **plugin_user_data)
{
MediaPluginWebKit *self = new MediaPluginWebKit(host_send_func, host_user_data);
diff --git a/indra/media_plugins/webkit/volume_catcher.h b/indra/media_plugins/webkit/volume_catcher.h
new file mode 100644
index 0000000000..77b10cfed0
--- /dev/null
+++ b/indra/media_plugins/webkit/volume_catcher.h
@@ -0,0 +1,59 @@
+/**
+ * @file volume_catcher.h
+ * @brief Interface to a class with platform-specific implementations that allows control of the audio volume of all sources in the current process.
+ *
+ * @cond
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlife.com/developers/opensource/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlife.com/developers/opensource/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ * @endcond
+ */
+
+#ifndef VOLUME_CATCHER_H
+#define VOLUME_CATCHER_H
+
+#include "linden_common.h"
+
+class VolumeCatcherImpl;
+
+class VolumeCatcher
+{
+ public:
+ VolumeCatcher();
+ ~VolumeCatcher();
+
+ void setVolume(F32 volume); // 0.0 - 1.0
+
+ // Set the left-right pan of audio sources
+ // where -1.0 = left, 0 = center, and 1.0 = right
+ void setPan(F32 pan);
+
+ void pump(); // call this at least a few times a second if you can - it affects how quickly we can 'catch' a new audio source and adjust its volume
+
+ private:
+ VolumeCatcherImpl *pimpl;
+};
+
+#endif // VOLUME_CATCHER_H
diff --git a/indra/media_plugins/webkit/windows_volume_catcher.cpp b/indra/media_plugins/webkit/windows_volume_catcher.cpp
new file mode 100644
index 0000000000..ef96102a0a
--- /dev/null
+++ b/indra/media_plugins/webkit/windows_volume_catcher.cpp
@@ -0,0 +1,122 @@
+/**
+ * @file windows_volume_catcher.cpp
+ * @brief A Windows implementation of volume level control of all audio channels opened by a process.
+ *
+ * @cond
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlife.com/developers/opensource/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlife.com/developers/opensource/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ * @endcond
+ */
+
+#include "volume_catcher.h"
+#include <windows.h>
+#include "llsingleton.h"
+class VolumeCatcherImpl : public LLSingleton<VolumeCatcherImpl>
+{
+friend LLSingleton<VolumeCatcherImpl>;
+public:
+
+ void setVolume(F32 volume);
+ void setPan(F32 pan);
+
+private:
+ // This is a singleton class -- both callers and the component implementation should use getInstance() to find the instance.
+ VolumeCatcherImpl();
+ ~VolumeCatcherImpl();
+
+ typedef void (WINAPI *set_volume_func_t)(F32);
+ typedef void (WINAPI *set_mute_func_t)(bool);
+
+ set_volume_func_t mSetVolumeFunc;
+ set_mute_func_t mSetMuteFunc;
+
+ F32 mVolume;
+ F32 mPan;
+};
+VolumeCatcherImpl::VolumeCatcherImpl()
+: mVolume(1.0f), // default volume is max
+ mPan(0.f) // default pan is centered
+{
+ HMODULE handle = ::LoadLibrary(L"winmm.dll");
+ if(handle)
+ {
+ mSetVolumeFunc = (set_volume_func_t)::GetProcAddress(handle, "setPluginVolume");
+ mSetMuteFunc = (set_mute_func_t)::GetProcAddress(handle, "setPluginMute");
+ }
+}
+
+VolumeCatcherImpl::~VolumeCatcherImpl()
+{
+}
+
+
+void VolumeCatcherImpl::setVolume(F32 volume)
+{
+ mVolume = volume;
+
+ if (mSetMuteFunc)
+ {
+ mSetMuteFunc(volume == 0.f);
+ }
+ if (mSetVolumeFunc)
+ {
+ mSetVolumeFunc(mVolume);
+ }
+}
+
+void VolumeCatcherImpl::setPan(F32 pan)
+{ // remember pan for calculating individual channel levels later
+ mPan = pan;
+}
+
+/////////////////////////////////////////////////////
+
+VolumeCatcher::VolumeCatcher()
+{
+ pimpl = VolumeCatcherImpl::getInstance();
+}
+
+VolumeCatcher::~VolumeCatcher()
+{
+ // Let the instance persist until exit.
+}
+
+void VolumeCatcher::setVolume(F32 volume)
+{
+ pimpl->setVolume(volume);
+}
+
+void VolumeCatcher::setPan(F32 pan)
+{
+ pimpl->setPan(pan);
+}
+
+void VolumeCatcher::pump()
+{
+ // No periodic tasks are necessary for this implementation.
+}
+
+
diff --git a/indra/media_plugins/winmmshim/CMakeLists.txt b/indra/media_plugins/winmmshim/CMakeLists.txt
new file mode 100644
index 0000000000..387214088f
--- /dev/null
+++ b/indra/media_plugins/winmmshim/CMakeLists.txt
@@ -0,0 +1,34 @@
+# -*- cmake -*-
+
+project(winmm_shim)
+
+### winmm_shim
+
+set(winmm_shim_SOURCE_FILES
+ forwarding_api.cpp
+ winmm_shim.cpp
+ )
+
+set(winmm_shim_HEADER_FILES
+ forwarding_api.h
+ winmm.def
+ )
+
+list(APPEND winmm_shim_SOURCE_FILES ${winmm_shim_HEADER_FILES})
+
+set_source_files_properties(${media_plugin_webkit_HEADER_FILES}
+ PROPERTIES HEADER_FILE_ONLY TRUE)
+
+add_library(winmm_shim
+ SHARED
+ ${winmm_shim_SOURCE_FILES}
+)
+
+if (WINDOWS)
+ set_target_properties(
+ winmm_shim
+ PROPERTIES
+ LINK_FLAGS "/MANIFEST:NO"
+ OUTPUT_NAME "winmm"
+ )
+endif (WINDOWS)
diff --git a/indra/media_plugins/winmmshim/forwarding_api.cpp b/indra/media_plugins/winmmshim/forwarding_api.cpp
new file mode 100644
index 0000000000..c2f553dfef
--- /dev/null
+++ b/indra/media_plugins/winmmshim/forwarding_api.cpp
@@ -0,0 +1,1460 @@
+/**
+ * @file forwarding_api.cpp
+ * @brief forwards winmm API calls to real winmm.dll
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "forwarding_api.h"
+
+CloseDriver_type CloseDriver_orig;
+OpenDriver_type OpenDriver_orig;
+SendDriverMessage_type SendDriverMessage_orig;
+DrvGetModuleHandle_type DrvGetModuleHandle_orig;
+GetDriverModuleHandle_type GetDriverModuleHandle_orig;
+DefDriverProc_type DefDriverProc_orig;
+DriverCallback_type DriverCallback_orig;
+mmsystemGetVersion_type mmsystemGetVersion_orig;
+sndPlaySoundA_type sndPlaySoundA_orig;
+sndPlaySoundW_type sndPlaySoundW_orig;
+PlaySoundA_type PlaySoundA_orig;
+PlaySoundW_type PlaySoundW_orig;
+waveOutGetNumDevs_type waveOutGetNumDevs_orig;
+waveOutGetDevCapsA_type waveOutGetDevCapsA_orig;
+waveOutGetDevCapsW_type waveOutGetDevCapsW_orig;
+waveOutGetVolume_type waveOutGetVolume_orig;
+waveOutSetVolume_type waveOutSetVolume_orig;
+waveOutGetErrorTextA_type waveOutGetErrorTextA_orig;
+waveOutGetErrorTextW_type waveOutGetErrorTextW_orig;
+waveOutOpen_type waveOutOpen_orig;
+waveOutClose_type waveOutClose_orig;
+waveOutPrepareHeader_type waveOutPrepareHeader_orig;
+waveOutUnprepareHeader_type waveOutUnprepareHeader_orig;
+waveOutWrite_type waveOutWrite_orig;
+waveOutPause_type waveOutPause_orig;
+waveOutRestart_type waveOutRestart_orig;
+waveOutReset_type waveOutReset_orig;
+waveOutBreakLoop_type waveOutBreakLoop_orig;
+waveOutGetPosition_type waveOutGetPosition_orig;
+waveOutGetPitch_type waveOutGetPitch_orig;
+waveOutSetPitch_type waveOutSetPitch_orig;
+waveOutGetPlaybackRate_type waveOutGetPlaybackRate_orig;
+waveOutSetPlaybackRate_type waveOutSetPlaybackRate_orig;
+waveOutGetID_type waveOutGetID_orig;
+waveOutMessage_type waveOutMessage_orig;
+waveInGetNumDevs_type waveInGetNumDevs_orig;
+waveInGetDevCapsA_type waveInGetDevCapsA_orig;
+waveInGetDevCapsW_type waveInGetDevCapsW_orig;
+waveInGetErrorTextA_type waveInGetErrorTextA_orig;
+waveInGetErrorTextW_type waveInGetErrorTextW_orig;
+waveInOpen_type waveInOpen_orig;
+waveInClose_type waveInClose_orig;
+waveInPrepareHeader_type waveInPrepareHeader_orig;
+waveInUnprepareHeader_type waveInUnprepareHeader_orig;
+waveInAddBuffer_type waveInAddBuffer_orig;
+waveInStart_type waveInStart_orig;
+waveInStop_type waveInStop_orig;
+waveInReset_type waveInReset_orig;
+waveInGetPosition_type waveInGetPosition_orig;
+waveInGetID_type waveInGetID_orig;
+waveInMessage_type waveInMessage_orig;
+midiOutGetNumDevs_type midiOutGetNumDevs_orig;
+midiStreamOpen_type midiStreamOpen_orig;
+midiStreamClose_type midiStreamClose_orig;
+midiStreamProperty_type midiStreamProperty_orig;
+midiStreamPosition_type midiStreamPosition_orig;
+midiStreamOut_type midiStreamOut_orig;
+midiStreamPause_type midiStreamPause_orig;
+midiStreamRestart_type midiStreamRestart_orig;
+midiStreamStop_type midiStreamStop_orig;
+midiConnect_type midiConnect_orig;
+midiDisconnect_type midiDisconnect_orig;
+midiOutGetDevCapsA_type midiOutGetDevCapsA_orig;
+midiOutGetDevCapsW_type midiOutGetDevCapsW_orig;
+midiOutGetVolume_type midiOutGetVolume_orig;
+midiOutSetVolume_type midiOutSetVolume_orig;
+midiOutGetErrorTextA_type midiOutGetErrorTextA_orig;
+midiOutGetErrorTextW_type midiOutGetErrorTextW_orig;
+midiOutOpen_type midiOutOpen_orig;
+midiOutClose_type midiOutClose_orig;
+midiOutPrepareHeader_type midiOutPrepareHeader_orig;
+midiOutUnprepareHeader_type midiOutUnprepareHeader_orig;
+midiOutShortMsg_type midiOutShortMsg_orig;
+midiOutLongMsg_type midiOutLongMsg_orig;
+midiOutReset_type midiOutReset_orig;
+midiOutCachePatches_type midiOutCachePatches_orig;
+midiOutCacheDrumPatches_type midiOutCacheDrumPatches_orig;
+midiOutGetID_type midiOutGetID_orig;
+midiOutMessage_type midiOutMessage_orig;
+midiInGetNumDevs_type midiInGetNumDevs_orig;
+midiInGetDevCapsA_type midiInGetDevCapsA_orig;
+midiInGetDevCapsW_type midiInGetDevCapsW_orig;
+midiInGetErrorTextA_type midiInGetErrorTextA_orig;
+midiInGetErrorTextW_type midiInGetErrorTextW_orig;
+midiInOpen_type midiInOpen_orig;
+midiInClose_type midiInClose_orig;
+midiInPrepareHeader_type midiInPrepareHeader_orig;
+midiInUnprepareHeader_type midiInUnprepareHeader_orig;
+midiInAddBuffer_type midiInAddBuffer_orig;
+midiInStart_type midiInStart_orig;
+midiInStop_type midiInStop_orig;
+midiInReset_type midiInReset_orig;
+midiInGetID_type midiInGetID_orig;
+midiInMessage_type midiInMessage_orig;
+auxGetNumDevs_type auxGetNumDevs_orig;
+auxGetDevCapsA_type auxGetDevCapsA_orig;
+auxGetDevCapsW_type auxGetDevCapsW_orig;
+auxSetVolume_type auxSetVolume_orig;
+auxGetVolume_type auxGetVolume_orig;
+auxOutMessage_type auxOutMessage_orig;
+mixerGetNumDevs_type mixerGetNumDevs_orig;
+mixerGetDevCapsA_type mixerGetDevCapsA_orig;
+mixerGetDevCapsW_type mixerGetDevCapsW_orig;
+mixerOpen_type mixerOpen_orig;
+mixerClose_type mixerClose_orig;
+mixerMessage_type mixerMessage_orig;
+mixerGetLineInfoA_type mixerGetLineInfoA_orig;
+mixerGetLineInfoW_type mixerGetLineInfoW_orig;
+mixerGetID_type mixerGetID_orig;
+mixerGetLineControlsA_type mixerGetLineControlsA_orig;
+mixerGetLineControlsW_type mixerGetLineControlsW_orig;
+mixerGetControlDetailsA_type mixerGetControlDetailsA_orig;
+mixerGetControlDetailsW_type mixerGetControlDetailsW_orig;
+mixerSetControlDetails_type mixerSetControlDetails_orig;
+mmGetCurrentTask_type mmGetCurrentTask_orig;
+mmTaskBlock_type mmTaskBlock_orig;
+mmTaskCreate_type mmTaskCreate_orig;
+mmTaskSignal_type mmTaskSignal_orig;
+mmTaskYield_type mmTaskYield_orig;
+timeGetSystemTime_type timeGetSystemTime_orig;
+timeGetTime_type timeGetTime_orig;
+timeSetEvent_type timeSetEvent_orig;
+timeKillEvent_type timeKillEvent_orig;
+timeGetDevCaps_type timeGetDevCaps_orig;
+timeBeginPeriod_type timeBeginPeriod_orig;
+timeEndPeriod_type timeEndPeriod_orig;
+joyGetNumDevs_type joyGetNumDevs_orig;
+joyConfigChanged_type joyConfigChanged_orig;
+joyGetDevCapsA_type joyGetDevCapsA_orig;
+joyGetDevCapsW_type joyGetDevCapsW_orig;
+joyGetPos_type joyGetPos_orig;
+joyGetPosEx_type joyGetPosEx_orig;
+joyGetThreshold_type joyGetThreshold_orig;
+joyReleaseCapture_type joyReleaseCapture_orig;
+joySetCapture_type joySetCapture_orig;
+joySetThreshold_type joySetThreshold_orig;
+mmioStringToFOURCCA_type mmioStringToFOURCCA_orig;
+mmioStringToFOURCCW_type mmioStringToFOURCCW_orig;
+mmioInstallIOProcA_type mmioInstallIOProcA_orig;
+mmioInstallIOProcW_type mmioInstallIOProcW_orig;
+mmioOpenA_type mmioOpenA_orig;
+mmioOpenW_type mmioOpenW_orig;
+mmioRenameA_type mmioRenameA_orig;
+mmioRenameW_type mmioRenameW_orig;
+mmioClose_type mmioClose_orig;
+mmioRead_type mmioRead_orig;
+mmioWrite_type mmioWrite_orig;
+mmioSeek_type mmioSeek_orig;
+mmioGetInfo_type mmioGetInfo_orig;
+mmioSetInfo_type mmioSetInfo_orig;
+mmioSetBuffer_type mmioSetBuffer_orig;
+mmioFlush_type mmioFlush_orig;
+mmioAdvance_type mmioAdvance_orig;
+mmioSendMessage_type mmioSendMessage_orig;
+mmioDescend_type mmioDescend_orig;
+mmioAscend_type mmioAscend_orig;
+mmioCreateChunk_type mmioCreateChunk_orig;
+mciSendCommandA_type mciSendCommandA_orig;
+mciSendCommandW_type mciSendCommandW_orig;
+mciSendStringA_type mciSendStringA_orig;
+mciSendStringW_type mciSendStringW_orig;
+mciGetDeviceIDA_type mciGetDeviceIDA_orig;
+mciGetDeviceIDW_type mciGetDeviceIDW_orig;
+mciGetDeviceIDFromElementIDA_type mciGetDeviceIDFromElementIDA_orig;
+mciGetDeviceIDFromElementIDW_type mciGetDeviceIDFromElementIDW_orig;
+mciGetDriverData_type mciGetDriverData_orig;
+mciGetErrorStringA_type mciGetErrorStringA_orig;
+mciGetErrorStringW_type mciGetErrorStringW_orig;
+mciSetDriverData_type mciSetDriverData_orig;
+mciDriverNotify_type mciDriverNotify_orig;
+mciDriverYield_type mciDriverYield_orig;
+mciSetYieldProc_type mciSetYieldProc_orig;
+mciFreeCommandResource_type mciFreeCommandResource_orig;
+mciGetCreatorTask_type mciGetCreatorTask_orig;
+mciGetYieldProc_type mciGetYieldProc_orig;
+mciLoadCommandResource_type mciLoadCommandResource_orig;
+mciExecute_type mciExecute_orig;
+
+// grab pointers to function calls in the real DLL
+void init_function_pointers(HMODULE winmm_handle)
+{
+ CloseDriver_orig = (CloseDriver_type)::GetProcAddress(winmm_handle, "CloseDriver");
+ OpenDriver_orig = (OpenDriver_type)::GetProcAddress(winmm_handle, "OpenDriver");
+ SendDriverMessage_orig = (SendDriverMessage_type)::GetProcAddress(winmm_handle, "SendDriverMessage");
+ DrvGetModuleHandle_orig = (DrvGetModuleHandle_type)::GetProcAddress(winmm_handle, "DrvGetModuleHandle");
+ GetDriverModuleHandle_orig = (GetDriverModuleHandle_type)::GetProcAddress(winmm_handle, "GetDriverModuleHandle");
+ DefDriverProc_orig = (DefDriverProc_type)::GetProcAddress(winmm_handle, "DefDriverProc");
+ DriverCallback_orig = (DriverCallback_type)::GetProcAddress(winmm_handle, "DriverCallback");
+ mmsystemGetVersion_orig = (mmsystemGetVersion_type)::GetProcAddress(winmm_handle, "mmsystemGetVersion");
+ sndPlaySoundA_orig = (sndPlaySoundA_type)::GetProcAddress(winmm_handle, "sndPlaySoundA");
+ sndPlaySoundW_orig = (sndPlaySoundW_type)::GetProcAddress(winmm_handle, "sndPlaySoundW");
+ PlaySoundA_orig = (PlaySoundA_type)::GetProcAddress(winmm_handle, "PlaySoundA");
+ PlaySoundW_orig = (PlaySoundW_type)::GetProcAddress(winmm_handle, "PlaySoundW");
+ waveOutGetNumDevs_orig = (waveOutGetNumDevs_type)::GetProcAddress(winmm_handle, "waveOutGetNumDevs");
+ waveOutGetDevCapsA_orig = (waveOutGetDevCapsA_type)::GetProcAddress(winmm_handle, "waveOutGetDevCapsA");
+ waveOutGetDevCapsW_orig = (waveOutGetDevCapsW_type)::GetProcAddress(winmm_handle, "waveOutGetDevCapsW");
+ waveOutGetVolume_orig = (waveOutGetVolume_type)::GetProcAddress(winmm_handle, "waveOutGetVolume");
+ waveOutSetVolume_orig = (waveOutSetVolume_type)::GetProcAddress(winmm_handle, "waveOutSetVolume");
+ waveOutGetErrorTextA_orig = (waveOutGetErrorTextA_type)::GetProcAddress(winmm_handle, "waveOutGetErrorTextA");
+ waveOutGetErrorTextW_orig = (waveOutGetErrorTextW_type)::GetProcAddress(winmm_handle, "waveOutGetErrorTextW");
+ waveOutOpen_orig = (waveOutOpen_type)::GetProcAddress(winmm_handle, "waveOutOpen");
+ waveOutClose_orig = (waveOutClose_type)::GetProcAddress(winmm_handle, "waveOutClose");
+ waveOutPrepareHeader_orig = (waveOutPrepareHeader_type)::GetProcAddress(winmm_handle, "waveOutPrepareHeader");
+ waveOutUnprepareHeader_orig = (waveOutUnprepareHeader_type)::GetProcAddress(winmm_handle, "waveOutUnprepareHeader");
+ waveOutWrite_orig = (waveOutWrite_type)::GetProcAddress(winmm_handle, "waveOutWrite");
+ waveOutPause_orig = (waveOutPause_type)::GetProcAddress(winmm_handle, "waveOutPause");
+ waveOutRestart_orig = (waveOutRestart_type)::GetProcAddress(winmm_handle, "waveOutRestart");
+ waveOutReset_orig = (waveOutReset_type)::GetProcAddress(winmm_handle, "waveOutReset");
+ waveOutBreakLoop_orig = (waveOutBreakLoop_type)::GetProcAddress(winmm_handle, "waveOutBreakLoop");
+ waveOutGetPosition_orig = (waveOutGetPosition_type)::GetProcAddress(winmm_handle, "waveOutGetPosition");
+ waveOutGetPitch_orig = (waveOutGetPitch_type)::GetProcAddress(winmm_handle, "waveOutGetPitch");
+ waveOutSetPitch_orig = (waveOutSetPitch_type)::GetProcAddress(winmm_handle, "waveOutSetPitch");
+ waveOutGetPlaybackRate_orig = (waveOutGetPlaybackRate_type)::GetProcAddress(winmm_handle, "waveOutGetPlaybackRate");
+ waveOutSetPlaybackRate_orig = (waveOutSetPlaybackRate_type)::GetProcAddress(winmm_handle, "waveOutSetPlaybackRate");
+ waveOutGetID_orig = (waveOutGetID_type)::GetProcAddress(winmm_handle, "waveOutGetID");
+ waveOutMessage_orig = (waveOutMessage_type)::GetProcAddress(winmm_handle, "waveOutMessage");
+ waveInGetNumDevs_orig = (waveInGetNumDevs_type)::GetProcAddress(winmm_handle, "waveInGetNumDevs");
+ waveInGetDevCapsA_orig = (waveInGetDevCapsA_type)::GetProcAddress(winmm_handle, "waveInGetDevCapsA");
+ waveInGetDevCapsW_orig = (waveInGetDevCapsW_type)::GetProcAddress(winmm_handle, "waveInGetDevCapsW");
+ waveInGetErrorTextA_orig = (waveInGetErrorTextA_type)::GetProcAddress(winmm_handle, "waveInGetErrorTextA");
+ waveInGetErrorTextW_orig = (waveInGetErrorTextW_type)::GetProcAddress(winmm_handle, "waveInGetErrorTextW");
+ waveInOpen_orig = (waveInOpen_type)::GetProcAddress(winmm_handle, "waveInOpen");
+ waveInClose_orig = (waveInClose_type)::GetProcAddress(winmm_handle, "waveInClose");
+ waveInPrepareHeader_orig = (waveInPrepareHeader_type)::GetProcAddress(winmm_handle, "waveInPrepareHeader");
+ waveInUnprepareHeader_orig = (waveInUnprepareHeader_type)::GetProcAddress(winmm_handle, "waveInUnprepareHeader");
+ waveInAddBuffer_orig = (waveInAddBuffer_type)::GetProcAddress(winmm_handle, "waveInAddBuffer");
+ waveInStart_orig = (waveInStart_type)::GetProcAddress(winmm_handle, "waveInStart");
+ waveInStop_orig = (waveInStop_type)::GetProcAddress(winmm_handle, "waveInStop");
+ waveInReset_orig = (waveInReset_type)::GetProcAddress(winmm_handle, "waveInReset");
+ waveInGetPosition_orig = (waveInGetPosition_type)::GetProcAddress(winmm_handle, "waveInGetPosition");
+ waveInGetID_orig = (waveInGetID_type)::GetProcAddress(winmm_handle, "waveInGetID");
+ waveInMessage_orig = (waveInMessage_type)::GetProcAddress(winmm_handle, "waveInMessage");
+ midiOutGetNumDevs_orig = (midiOutGetNumDevs_type)::GetProcAddress(winmm_handle, "midiOutGetNumDevs");
+ midiStreamOpen_orig = (midiStreamOpen_type)::GetProcAddress(winmm_handle, "midiStreamOpen");
+ midiStreamClose_orig = (midiStreamClose_type)::GetProcAddress(winmm_handle, "midiStreamClose");
+ midiStreamProperty_orig = (midiStreamProperty_type)::GetProcAddress(winmm_handle, "midiStreamProperty");
+ midiStreamPosition_orig = (midiStreamPosition_type)::GetProcAddress(winmm_handle, "midiStreamPosition");
+ midiStreamOut_orig = (midiStreamOut_type)::GetProcAddress(winmm_handle, "midiStreamOut");
+ midiStreamPause_orig = (midiStreamPause_type)::GetProcAddress(winmm_handle, "midiStreamPause");
+ midiStreamRestart_orig = (midiStreamRestart_type)::GetProcAddress(winmm_handle, "midiStreamRestart");
+ midiStreamStop_orig = (midiStreamStop_type)::GetProcAddress(winmm_handle, "midiStreamStop");
+ midiConnect_orig = (midiConnect_type)::GetProcAddress(winmm_handle, "midiConnect");
+ midiDisconnect_orig = (midiDisconnect_type)::GetProcAddress(winmm_handle, "midiDisconnect");
+ midiOutGetDevCapsA_orig = (midiOutGetDevCapsA_type)::GetProcAddress(winmm_handle, "midiOutGetDevCapsA");
+ midiOutGetDevCapsW_orig = (midiOutGetDevCapsW_type)::GetProcAddress(winmm_handle, "midiOutGetDevCapsW");
+ midiOutGetVolume_orig = (midiOutGetVolume_type)::GetProcAddress(winmm_handle, "midiOutGetVolume");
+ midiOutSetVolume_orig = (midiOutSetVolume_type)::GetProcAddress(winmm_handle, "midiOutSetVolume");
+ midiOutGetErrorTextA_orig = (midiOutGetErrorTextA_type)::GetProcAddress(winmm_handle, "midiOutGetErrorTextA");
+ midiOutGetErrorTextW_orig = (midiOutGetErrorTextW_type)::GetProcAddress(winmm_handle, "midiOutGetErrorTextW");
+ midiOutOpen_orig = (midiOutOpen_type)::GetProcAddress(winmm_handle, "midiOutOpen");
+ midiOutClose_orig = (midiOutClose_type)::GetProcAddress(winmm_handle, "midiOutClose");
+ midiOutPrepareHeader_orig = (midiOutPrepareHeader_type)::GetProcAddress(winmm_handle, "midiOutPrepareHeader");
+ midiOutUnprepareHeader_orig = (midiOutUnprepareHeader_type)::GetProcAddress(winmm_handle, "midiOutUnprepareHeader");
+ midiOutShortMsg_orig = (midiOutShortMsg_type)::GetProcAddress(winmm_handle, "midiOutShortMsg");
+ midiOutLongMsg_orig = (midiOutLongMsg_type)::GetProcAddress(winmm_handle, "midiOutLongMsg");
+ midiOutReset_orig = (midiOutReset_type)::GetProcAddress(winmm_handle, "midiOutReset");
+ midiOutCachePatches_orig = (midiOutCachePatches_type)::GetProcAddress(winmm_handle, "midiOutCachePatches");
+ midiOutCacheDrumPatches_orig = (midiOutCacheDrumPatches_type)::GetProcAddress(winmm_handle, "midiOutCacheDrumPatches");
+ midiOutGetID_orig = (midiOutGetID_type)::GetProcAddress(winmm_handle, "midiOutGetID");
+ midiOutMessage_orig = (midiOutMessage_type)::GetProcAddress(winmm_handle, "midiOutMessage");
+ midiInGetNumDevs_orig = (midiInGetNumDevs_type)::GetProcAddress(winmm_handle, "midiInGetNumDevs");
+ midiInGetDevCapsA_orig = (midiInGetDevCapsA_type)::GetProcAddress(winmm_handle, "midiInGetDevCapsA");
+ midiInGetDevCapsW_orig = (midiInGetDevCapsW_type)::GetProcAddress(winmm_handle, "midiInGetDevCapsW");
+ midiInGetErrorTextA_orig = (midiInGetErrorTextA_type)::GetProcAddress(winmm_handle, "midiInGetErrorTextA");
+ midiInGetErrorTextW_orig = (midiInGetErrorTextW_type)::GetProcAddress(winmm_handle, "midiInGetErrorTextW");
+ midiInOpen_orig = (midiInOpen_type)::GetProcAddress(winmm_handle, "midiInOpen");
+ midiInClose_orig = (midiInClose_type)::GetProcAddress(winmm_handle, "midiInClose");
+ midiInPrepareHeader_orig = (midiInPrepareHeader_type)::GetProcAddress(winmm_handle, "midiInPrepareHeader");
+ midiInUnprepareHeader_orig = (midiInUnprepareHeader_type)::GetProcAddress(winmm_handle, "midiInUnprepareHeader");
+ midiInAddBuffer_orig = (midiInAddBuffer_type)::GetProcAddress(winmm_handle, "midiInAddBuffer");
+ midiInStart_orig = (midiInStart_type)::GetProcAddress(winmm_handle, "midiInStart");
+ midiInStop_orig = (midiInStop_type)::GetProcAddress(winmm_handle, "midiInStop");
+ midiInReset_orig = (midiInReset_type)::GetProcAddress(winmm_handle, "midiInReset");
+ midiInGetID_orig = (midiInGetID_type)::GetProcAddress(winmm_handle, "midiInGetID");
+ midiInMessage_orig = (midiInMessage_type)::GetProcAddress(winmm_handle, "midiInMessage");
+ auxGetNumDevs_orig = (auxGetNumDevs_type)::GetProcAddress(winmm_handle, "auxGetNumDevs");
+ auxGetDevCapsA_orig = (auxGetDevCapsA_type)::GetProcAddress(winmm_handle, "auxGetDevCapsA");
+ auxGetDevCapsW_orig = (auxGetDevCapsW_type)::GetProcAddress(winmm_handle, "auxGetDevCapsW");
+ auxSetVolume_orig = (auxSetVolume_type)::GetProcAddress(winmm_handle, "auxSetVolume");
+ auxGetVolume_orig = (auxGetVolume_type)::GetProcAddress(winmm_handle, "auxGetVolume");
+ auxOutMessage_orig = (auxOutMessage_type)::GetProcAddress(winmm_handle, "auxOutMessage");
+ mixerGetNumDevs_orig = (mixerGetNumDevs_type)::GetProcAddress(winmm_handle, "mixerGetNumDevs");
+ mixerGetDevCapsA_orig = (mixerGetDevCapsA_type)::GetProcAddress(winmm_handle, "mixerGetDevCapsA");
+ mixerGetDevCapsW_orig = (mixerGetDevCapsW_type)::GetProcAddress(winmm_handle, "mixerGetDevCapsW");
+ mixerOpen_orig = (mixerOpen_type)::GetProcAddress(winmm_handle, "mixerOpen");
+ mixerClose_orig = (mixerClose_type)::GetProcAddress(winmm_handle, "mixerClose");
+ mixerMessage_orig = (mixerMessage_type)::GetProcAddress(winmm_handle, "mixerMessage");
+ mixerGetLineInfoA_orig = (mixerGetLineInfoA_type)::GetProcAddress(winmm_handle, "mixerGetLineInfoA");
+ mixerGetLineInfoW_orig = (mixerGetLineInfoW_type)::GetProcAddress(winmm_handle, "mixerGetLineInfoW");
+ mixerGetID_orig = (mixerGetID_type)::GetProcAddress(winmm_handle, "mixerGetID");
+ mixerGetLineControlsA_orig = (mixerGetLineControlsA_type)::GetProcAddress(winmm_handle, "mixerGetLineControlsA");
+ mixerGetLineControlsW_orig = (mixerGetLineControlsW_type)::GetProcAddress(winmm_handle, "mixerGetLineControlsW");
+ mixerGetControlDetailsA_orig = (mixerGetControlDetailsA_type)::GetProcAddress(winmm_handle, "mixerGetControlDetailsA");
+ mixerGetControlDetailsW_orig = (mixerGetControlDetailsW_type)::GetProcAddress(winmm_handle, "mixerGetControlDetailsW");
+ mixerSetControlDetails_orig = (mixerSetControlDetails_type)::GetProcAddress(winmm_handle, "mixerSetControlDetails");
+ mmGetCurrentTask_orig = (mmGetCurrentTask_type)::GetProcAddress(winmm_handle, "mmGetCurrentTask");
+ mmTaskBlock_orig = (mmTaskBlock_type)::GetProcAddress(winmm_handle, "mmTaskBlock");
+ mmTaskCreate_orig = (mmTaskCreate_type)::GetProcAddress(winmm_handle, "mmTaskCreate");
+ mmTaskSignal_orig = (mmTaskSignal_type)::GetProcAddress(winmm_handle, "mmTaskSignal");
+ mmTaskYield_orig = (mmTaskYield_type)::GetProcAddress(winmm_handle, "mmTaskYield");
+ timeGetSystemTime_orig = (timeGetSystemTime_type)::GetProcAddress(winmm_handle, "timeGetSystemTime");
+ timeGetTime_orig = (timeGetTime_type)::GetProcAddress(winmm_handle, "timeGetTime");
+ timeSetEvent_orig = (timeSetEvent_type)::GetProcAddress(winmm_handle, "timeSetEvent");
+ timeKillEvent_orig = (timeKillEvent_type)::GetProcAddress(winmm_handle, "timeKillEvent");
+ timeGetDevCaps_orig = (timeGetDevCaps_type)::GetProcAddress(winmm_handle, "timeGetDevCaps");
+ timeBeginPeriod_orig = (timeBeginPeriod_type)::GetProcAddress(winmm_handle, "timeBeginPeriod");
+ timeEndPeriod_orig = (timeEndPeriod_type)::GetProcAddress(winmm_handle, "timeEndPeriod");
+ joyGetNumDevs_orig = (joyGetNumDevs_type)::GetProcAddress(winmm_handle, "joyGetNumDevs");
+ joyConfigChanged_orig = (joyConfigChanged_type)::GetProcAddress(winmm_handle, "joyConfigChanged");
+ joyGetDevCapsA_orig = (joyGetDevCapsA_type)::GetProcAddress(winmm_handle, "joyGetDevCapsA");
+ joyGetDevCapsW_orig = (joyGetDevCapsW_type)::GetProcAddress(winmm_handle, "joyGetDevCapsW");
+ joyGetPos_orig = (joyGetPos_type)::GetProcAddress(winmm_handle, "joyGetPos");
+ joyGetPosEx_orig = (joyGetPosEx_type)::GetProcAddress(winmm_handle, "joyGetPosEx");
+ joyGetThreshold_orig = (joyGetThreshold_type)::GetProcAddress(winmm_handle, "joyGetThreshold");
+ joyReleaseCapture_orig = (joyReleaseCapture_type)::GetProcAddress(winmm_handle, "joyReleaseCapture");
+ joySetCapture_orig = (joySetCapture_type)::GetProcAddress(winmm_handle, "joySetCapture");
+ joySetThreshold_orig = (joySetThreshold_type)::GetProcAddress(winmm_handle, "joySetThreshold");
+ mciDriverNotify_orig = (mciDriverNotify_type)::GetProcAddress(winmm_handle, "mciDriverNotify");
+ mciDriverYield_orig = (mciDriverYield_type)::GetProcAddress(winmm_handle, "mciDriverYield");
+ mmioStringToFOURCCA_orig = (mmioStringToFOURCCA_type)::GetProcAddress(winmm_handle, "mmioStringToFOURCCA");
+ mmioStringToFOURCCW_orig = (mmioStringToFOURCCW_type)::GetProcAddress(winmm_handle, "mmioStringToFOURCCW");
+ mmioInstallIOProcA_orig = (mmioInstallIOProcA_type)::GetProcAddress(winmm_handle, "mmioInstallIOProcA");
+ mmioInstallIOProcW_orig = (mmioInstallIOProcW_type)::GetProcAddress(winmm_handle, "mmioInstallIOProcW");
+ mmioOpenA_orig = (mmioOpenA_type)::GetProcAddress(winmm_handle, "mmioOpenA");
+ mmioOpenW_orig = (mmioOpenW_type)::GetProcAddress(winmm_handle, "mmioOpenW");
+ mmioRenameA_orig = (mmioRenameA_type)::GetProcAddress(winmm_handle, "mmioRenameA");
+ mmioRenameW_orig = (mmioRenameW_type)::GetProcAddress(winmm_handle, "mmioRenameW");
+ mmioClose_orig = (mmioClose_type)::GetProcAddress(winmm_handle, "mmioClose");
+ mmioRead_orig = (mmioRead_type)::GetProcAddress(winmm_handle, "mmioRead");
+ mmioWrite_orig = (mmioWrite_type)::GetProcAddress(winmm_handle, "mmioWrite");
+ mmioSeek_orig = (mmioSeek_type)::GetProcAddress(winmm_handle, "mmioSeek");
+ mmioGetInfo_orig = (mmioGetInfo_type)::GetProcAddress(winmm_handle, "mmioGetInfo");
+ mmioSetInfo_orig = (mmioSetInfo_type)::GetProcAddress(winmm_handle, "mmioSetInfo");
+ mmioSetBuffer_orig = (mmioSetBuffer_type)::GetProcAddress(winmm_handle, "mmioSetBuffer");
+ mmioFlush_orig = (mmioFlush_type)::GetProcAddress(winmm_handle, "mmioFlush");
+ mmioAdvance_orig = (mmioAdvance_type)::GetProcAddress(winmm_handle, "mmioAdvance");
+ mmioSendMessage_orig = (mmioSendMessage_type)::GetProcAddress(winmm_handle, "mmioSendMessage");
+ mmioDescend_orig = (mmioDescend_type)::GetProcAddress(winmm_handle, "mmioDescend");
+ mmioAscend_orig = (mmioAscend_type)::GetProcAddress(winmm_handle, "mmioAscend");
+ mmioCreateChunk_orig = (mmioCreateChunk_type)::GetProcAddress(winmm_handle, "mmioCreateChunk");
+ mciSendCommandA_orig = (mciSendCommandA_type)::GetProcAddress(winmm_handle, "mciSendCommandA");
+ mciSendCommandW_orig = (mciSendCommandW_type)::GetProcAddress(winmm_handle, "mciSendCommandW");
+ mciSendStringA_orig = (mciSendStringA_type)::GetProcAddress(winmm_handle, "mciSendStringA");
+ mciSendStringW_orig = (mciSendStringW_type)::GetProcAddress(winmm_handle, "mciSendStringW");
+ mciGetDeviceIDA_orig = (mciGetDeviceIDA_type)::GetProcAddress(winmm_handle, "mciGetDeviceIDA");
+ mciGetDeviceIDW_orig = (mciGetDeviceIDW_type)::GetProcAddress(winmm_handle, "mciGetDeviceIDW");
+ mciGetDeviceIDFromElementIDA_orig = (mciGetDeviceIDFromElementIDA_type)::GetProcAddress(winmm_handle, "mciGetDeviceIDFromElementIDA");
+ mciGetDeviceIDFromElementIDW_orig = (mciGetDeviceIDFromElementIDW_type)::GetProcAddress(winmm_handle, "mciGetDeviceIDFromElementIDW");
+ mciGetDriverData_orig = (mciGetDriverData_type)::GetProcAddress(winmm_handle, "mciGetDriverData");
+ mciGetErrorStringA_orig = (mciGetErrorStringA_type)::GetProcAddress(winmm_handle, "mciGetErrorStringA");
+ mciGetErrorStringW_orig = (mciGetErrorStringW_type)::GetProcAddress(winmm_handle, "mciGetErrorStringW");
+ mciSetDriverData_orig = (mciSetDriverData_type)::GetProcAddress(winmm_handle, "mciSetDriverData");
+ mciSetYieldProc_orig = (mciSetYieldProc_type)::GetProcAddress(winmm_handle, "mciSetYieldProc");
+ mciFreeCommandResource_orig = (mciFreeCommandResource_type)::GetProcAddress(winmm_handle, "mciFreeCommandResource");
+ mciGetCreatorTask_orig = (mciGetCreatorTask_type)::GetProcAddress(winmm_handle, "mciGetCreatorTask");
+ mciGetYieldProc_orig = (mciGetYieldProc_type)::GetProcAddress(winmm_handle, "mciGetYieldProc");
+ mciLoadCommandResource_orig = (mciLoadCommandResource_type)::GetProcAddress(winmm_handle, "mciLoadCommandResource");
+ mciExecute_orig = (mciExecute_type)::GetProcAddress(winmm_handle, "mciExecute");
+}
+
+extern "C" {
+ LRESULT WINAPI CloseDriver( HDRVR hDriver, LPARAM lParam1, LPARAM lParam2)
+ {
+ //OutputDebugString(L"CloseDriver\n");
+ return CloseDriver_orig( hDriver, lParam1, lParam2);
+ }
+
+ HDRVR WINAPI OpenDriver( LPCWSTR szDriverName, LPCWSTR szSectionName, LPARAM lParam2)
+ {
+ //OutputDebugString(L"OpenDriver\n");
+ return OpenDriver_orig( szDriverName, szSectionName, lParam2);
+ }
+
+ LRESULT WINAPI SendDriverMessage( HDRVR hDriver, UINT message, LPARAM lParam1, LPARAM lParam2)
+ {
+ //OutputDebugString(L"SendDriverMessage\n");
+ return SendDriverMessage_orig( hDriver, message, lParam1, lParam2);
+ }
+
+ HMODULE WINAPI DrvGetModuleHandle( HDRVR hDriver)
+ {
+ //OutputDebugString(L"DrvGetModuleHandle\n");
+ return DrvGetModuleHandle_orig( hDriver);
+ }
+
+ HMODULE WINAPI GetDriverModuleHandle( HDRVR hDriver)
+ {
+ //OutputDebugString(L"GetDriverModuleHandle\n");
+ return GetDriverModuleHandle_orig( hDriver);
+ }
+
+ LRESULT WINAPI DefDriverProc( DWORD_PTR dwDriverIdentifier, HDRVR hdrvr, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
+ {
+ //OutputDebugString(L"DefDriverProc\n");
+ return DefDriverProc_orig( dwDriverIdentifier, hdrvr, uMsg, lParam1, lParam2);
+ }
+
+ BOOL WINAPI DriverCallback( DWORD dwCallBack, DWORD dwFlags, HDRVR hdrvr, DWORD msg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2)
+ {
+ //OutputDebugString(L"DriverCallback\n");
+ return DriverCallback_orig(dwCallBack, dwFlags, hdrvr, msg, dwUser, dwParam1, dwParam2);
+ }
+
+ UINT WINAPI mmsystemGetVersion(void)
+ {
+ //OutputDebugString(L"mmsystemGetVersion\n");
+ return mmsystemGetVersion_orig();
+ }
+
+ BOOL WINAPI sndPlaySoundA( LPCSTR pszSound, UINT fuSound)
+ {
+ //OutputDebugString(L"sndPlaySoundA\n");
+ return sndPlaySoundA_orig( pszSound, fuSound);
+ }
+
+ BOOL WINAPI sndPlaySoundW( LPCWSTR pszSound, UINT fuSound)
+ {
+ //OutputDebugString(L"sndPlaySoundW\n");
+ return sndPlaySoundW_orig( pszSound, fuSound);
+ }
+
+ BOOL WINAPI PlaySoundA( LPCSTR pszSound, HMODULE hmod, DWORD fdwSound)
+ {
+ //OutputDebugString(L"PlaySoundA\n");
+ return PlaySoundA_orig( pszSound, hmod, fdwSound);
+ }
+
+ BOOL WINAPI PlaySoundW( LPCWSTR pszSound, HMODULE hmod, DWORD fdwSound)
+ {
+ //OutputDebugString(L"PlaySoundW\n");
+ return PlaySoundW_orig( pszSound, hmod, fdwSound);
+ }
+
+ UINT WINAPI waveOutGetNumDevs(void)
+ {
+ //OutputDebugString(L"waveOutGetNumDevs\n");
+ return waveOutGetNumDevs_orig();
+ }
+
+ MMRESULT WINAPI waveOutGetDevCapsA( UINT_PTR uDeviceID, LPWAVEOUTCAPSA pwoc, UINT cbwoc)
+ {
+ //OutputDebugString(L"waveOutGetDevCapsA\n");
+ return waveOutGetDevCapsA_orig( uDeviceID, pwoc, cbwoc);
+ }
+
+ MMRESULT WINAPI waveOutGetDevCapsW( UINT_PTR uDeviceID, LPWAVEOUTCAPSW pwoc, UINT cbwoc)
+ {
+ //OutputDebugString(L"waveOutGetDevCapsW\n");
+ return waveOutGetDevCapsW_orig( uDeviceID, pwoc, cbwoc);
+ }
+
+
+ MMRESULT WINAPI waveOutGetVolume( HWAVEOUT hwo, LPDWORD pdwVolume)
+ {
+ //OutputDebugString(L"waveOutGetVolume\n");
+ return waveOutGetVolume_orig( hwo, pdwVolume);
+ }
+
+ MMRESULT WINAPI waveOutSetVolume( HWAVEOUT hwo, DWORD dwVolume)
+ {
+ //OutputDebugString(L"waveOutSetVolume\n");
+ return waveOutSetVolume_orig( hwo, dwVolume);
+ }
+
+ MMRESULT WINAPI waveOutGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText)
+ {
+ //OutputDebugString(L"waveOutGetErrorTextA\n");
+ return waveOutGetErrorTextA_orig( mmrError, pszText, cchText);
+ }
+
+ MMRESULT WINAPI waveOutGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText)
+ {
+ //OutputDebugString(L"waveOutGetErrorTextW\n");
+ return waveOutGetErrorTextW_orig( mmrError, pszText, cchText);
+ }
+
+ //MMRESULT WINAPI waveOutOpen( LPHWAVEOUT phwo, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)
+ //{
+ // //OutputDebugString(L"waveOutGetErrorTextW\n");
+ // return waveOutOpen_orig( phwo, uDeviceID, pwfx, dwCallback, dwInstance, fdwOpen);
+ //}
+
+ //MMRESULT WINAPI waveOutClose( HWAVEOUT hwo)
+ //{
+ // //OutputDebugString(L"waveOutGetErrorTextW\n");
+ // return waveOutClose_orig( hwo );
+ //}
+
+ MMRESULT WINAPI waveOutPrepareHeader( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh)
+ {
+ //OutputDebugString(L"waveOutPrepareHeader\n");
+ return waveOutPrepareHeader_orig( hwo, pwh, cbwh);
+ }
+
+ MMRESULT WINAPI waveOutUnprepareHeader( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh)
+ {
+ //OutputDebugString(L"waveOutUnprepareHeader\n");
+ return waveOutUnprepareHeader_orig( hwo, pwh, cbwh);
+ }
+
+
+ //MMRESULT WINAPI waveOutWrite( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh)
+ //{
+ // //OutputDebugString(L"waveOutUnprepareHeader\n");
+ // return waveOutWrite_orig( hwo, pwh, cbwh);
+ //}
+
+ MMRESULT WINAPI waveOutPause( HWAVEOUT hwo)
+ {
+ //OutputDebugString(L"waveOutPause\n");
+ return waveOutPause_orig( hwo);
+ }
+
+ MMRESULT WINAPI waveOutRestart( HWAVEOUT hwo)
+ {
+ //OutputDebugString(L"waveOutRestart\n");
+ return waveOutRestart_orig( hwo);
+ }
+
+ MMRESULT WINAPI waveOutReset( HWAVEOUT hwo)
+ {
+ //OutputDebugString(L"waveOutReset\n");
+ return waveOutReset_orig( hwo);
+ }
+
+ MMRESULT WINAPI waveOutBreakLoop( HWAVEOUT hwo)
+ {
+ //OutputDebugString(L"waveOutBreakLoop\n");
+ return waveOutBreakLoop_orig( hwo);
+ }
+
+ MMRESULT WINAPI waveOutGetPosition( HWAVEOUT hwo, LPMMTIME pmmt, UINT cbmmt)
+ {
+ //OutputDebugString(L"waveOutGetPosition\n");
+ return waveOutGetPosition_orig( hwo, pmmt, cbmmt);
+ }
+
+ MMRESULT WINAPI waveOutGetPitch( HWAVEOUT hwo, LPDWORD pdwPitch)
+ {
+ //OutputDebugString(L"waveOutGetPitch\n");
+ return waveOutGetPitch_orig( hwo, pdwPitch);
+ }
+
+ MMRESULT WINAPI waveOutSetPitch( HWAVEOUT hwo, DWORD dwPitch)
+ {
+ //OutputDebugString(L"waveOutSetPitch\n");
+ return waveOutSetPitch_orig( hwo, dwPitch);
+ }
+
+ MMRESULT WINAPI waveOutGetPlaybackRate( HWAVEOUT hwo, LPDWORD pdwRate)
+ {
+ //OutputDebugString(L"waveOutGetPlaybackRate\n");
+ return waveOutGetPlaybackRate_orig( hwo, pdwRate);
+ }
+
+ MMRESULT WINAPI waveOutSetPlaybackRate( HWAVEOUT hwo, DWORD dwRate)
+ {
+ //OutputDebugString(L"waveOutSetPlaybackRate\n");
+ return waveOutSetPlaybackRate_orig( hwo, dwRate);
+ }
+
+ MMRESULT WINAPI waveOutGetID( HWAVEOUT hwo, LPUINT puDeviceID)
+ {
+ //OutputDebugString(L"waveOutGetID\n");
+ return waveOutGetID_orig( hwo, puDeviceID);
+ }
+
+ MMRESULT WINAPI waveOutMessage( HWAVEOUT hwo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2)
+ {
+ //OutputDebugString(L"waveOutMessage\n");
+ return waveOutMessage_orig( hwo, uMsg, dw1, dw2);
+ }
+
+ UINT WINAPI waveInGetNumDevs(void)
+ {
+ //OutputDebugString(L"waveInGetNumDevs\n");
+ return waveInGetNumDevs_orig();
+ }
+
+ MMRESULT WINAPI waveInGetDevCapsA( UINT_PTR uDeviceID, LPWAVEINCAPSA pwic, UINT cbwic)
+ {
+ //OutputDebugString(L"waveInGetDevCapsA\n");
+ return waveInGetDevCapsA_orig( uDeviceID, pwic, cbwic);
+ }
+
+ MMRESULT WINAPI waveInGetDevCapsW( UINT_PTR uDeviceID, LPWAVEINCAPSW pwic, UINT cbwic)
+ {
+ //OutputDebugString(L"waveInGetDevCapsW\n");
+ return waveInGetDevCapsW_orig( uDeviceID, pwic, cbwic);
+ }
+
+ MMRESULT WINAPI waveInGetErrorTextA(MMRESULT mmrError, LPSTR pszText, UINT cchText)
+ {
+ //OutputDebugString(L"waveInGetErrorTextA\n");
+ return waveInGetErrorTextA_orig(mmrError, pszText, cchText);
+ }
+
+ MMRESULT WINAPI waveInGetErrorTextW(MMRESULT mmrError, LPWSTR pszText, UINT cchText)
+ {
+ //OutputDebugString(L"waveInGetErrorTextW\n");
+ return waveInGetErrorTextW_orig(mmrError, pszText, cchText);
+ }
+
+ MMRESULT WINAPI waveInOpen( LPHWAVEIN phwi, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)
+ {
+ //OutputDebugString(L"waveInOpen\n");
+ return waveInOpen_orig(phwi, uDeviceID, pwfx, dwCallback, dwInstance, fdwOpen);
+ }
+
+ MMRESULT WINAPI waveInClose( HWAVEIN hwi)
+ {
+ //OutputDebugString(L"waveInClose\n");
+ return waveInClose_orig( hwi);
+ }
+
+ MMRESULT WINAPI waveInPrepareHeader( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh)
+ {
+ //OutputDebugString(L"waveInPrepareHeader\n");
+ return waveInPrepareHeader_orig( hwi, pwh, cbwh);
+ }
+
+ MMRESULT WINAPI waveInUnprepareHeader( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh)
+ {
+ //OutputDebugString(L"waveInUnprepareHeader\n");
+ return waveInUnprepareHeader_orig( hwi, pwh, cbwh);
+ }
+
+ MMRESULT WINAPI waveInAddBuffer( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh)
+ {
+ //OutputDebugString(L"waveInAddBuffer\n");
+ return waveInAddBuffer_orig( hwi, pwh, cbwh);
+ }
+
+ MMRESULT WINAPI waveInStart( HWAVEIN hwi)
+ {
+ //OutputDebugString(L"waveInStart\n");
+ return waveInStart_orig( hwi);
+ }
+
+ MMRESULT WINAPI waveInStop( HWAVEIN hwi)
+ {
+ //OutputDebugString(L"waveInStop\n");
+ return waveInStop_orig(hwi);
+ }
+
+ MMRESULT WINAPI waveInReset( HWAVEIN hwi)
+ {
+ //OutputDebugString(L"waveInReset\n");
+ return waveInReset_orig(hwi);
+ }
+
+ MMRESULT WINAPI waveInGetPosition( HWAVEIN hwi, LPMMTIME pmmt, UINT cbmmt)
+ {
+ //OutputDebugString(L"waveInGetPosition\n");
+ return waveInGetPosition_orig( hwi, pmmt, cbmmt);
+ }
+
+ MMRESULT WINAPI waveInGetID( HWAVEIN hwi, LPUINT puDeviceID)
+ {
+ //OutputDebugString(L"waveInGetID\n");
+ return waveInGetID_orig( hwi, puDeviceID);
+ }
+
+ MMRESULT WINAPI waveInMessage( HWAVEIN hwi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2)
+ {
+ //OutputDebugString(L"waveInMessage\n");
+ return waveInMessage_orig( hwi, uMsg, dw1, dw2);
+ }
+
+ UINT WINAPI midiOutGetNumDevs(void)
+ {
+ //OutputDebugString(L"midiOutGetNumDevs\n");
+ return midiOutGetNumDevs_orig();
+ }
+
+ MMRESULT WINAPI midiStreamOpen( LPHMIDISTRM phms, LPUINT puDeviceID, DWORD cMidi, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)
+ {
+ //OutputDebugString(L"midiStreamOpen\n");
+ return midiStreamOpen_orig( phms, puDeviceID, cMidi, dwCallback, dwInstance, fdwOpen);
+ }
+
+ MMRESULT WINAPI midiStreamClose( HMIDISTRM hms)
+ {
+ //OutputDebugString(L"midiStreamClose\n");
+ return midiStreamClose_orig( hms);
+ }
+
+ MMRESULT WINAPI midiStreamProperty( HMIDISTRM hms, LPBYTE lppropdata, DWORD dwProperty)
+ {
+ //OutputDebugString(L"midiStreamProperty\n");
+ return midiStreamProperty_orig( hms, lppropdata, dwProperty);
+ }
+
+ MMRESULT WINAPI midiStreamPosition( HMIDISTRM hms, LPMMTIME lpmmt, UINT cbmmt)
+ {
+ //OutputDebugString(L"midiStreamPosition\n");
+ return midiStreamPosition_orig( hms, lpmmt, cbmmt);
+ }
+
+ MMRESULT WINAPI midiStreamOut( HMIDISTRM hms, LPMIDIHDR pmh, UINT cbmh)
+ {
+ //OutputDebugString(L"midiStreamOut\n");
+ return midiStreamOut_orig( hms, pmh, cbmh);
+ }
+
+ MMRESULT WINAPI midiStreamPause( HMIDISTRM hms)
+ {
+ //OutputDebugString(L"midiStreamPause\n");
+ return midiStreamPause_orig( hms);
+ }
+
+ MMRESULT WINAPI midiStreamRestart( HMIDISTRM hms)
+ {
+ //OutputDebugString(L"midiStreamRestart\n");
+ return midiStreamRestart_orig( hms);
+ }
+
+ MMRESULT WINAPI midiStreamStop( HMIDISTRM hms)
+ {
+ //OutputDebugString(L"midiStreamStop\n");
+ return midiStreamStop_orig( hms);
+ }
+
+ MMRESULT WINAPI midiConnect( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved)
+ {
+ //OutputDebugString(L"midiConnect\n");
+ return midiConnect_orig( hmi, hmo, pReserved);
+ }
+
+ MMRESULT WINAPI midiDisconnect( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved)
+ {
+ //OutputDebugString(L"midiDisconnect\n");
+ return midiDisconnect_orig( hmi, hmo, pReserved);
+ }
+
+ MMRESULT WINAPI midiOutGetDevCapsA( UINT_PTR uDeviceID, LPMIDIOUTCAPSA pmoc, UINT cbmoc)
+ {
+ //OutputDebugString(L"midiOutGetDevCapsA\n");
+ return midiOutGetDevCapsA_orig( uDeviceID, pmoc, cbmoc);
+ }
+
+ MMRESULT WINAPI midiOutGetDevCapsW( UINT_PTR uDeviceID, LPMIDIOUTCAPSW pmoc, UINT cbmoc)
+ {
+ //OutputDebugString(L"midiOutGetDevCapsW\n");
+ return midiOutGetDevCapsW_orig( uDeviceID, pmoc, cbmoc);
+ }
+
+ MMRESULT WINAPI midiOutGetVolume( HMIDIOUT hmo, LPDWORD pdwVolume)
+ {
+ //OutputDebugString(L"midiOutGetVolume\n");
+ return midiOutGetVolume_orig( hmo, pdwVolume);
+ }
+
+ MMRESULT WINAPI midiOutSetVolume( HMIDIOUT hmo, DWORD dwVolume)
+ {
+ //OutputDebugString(L"midiOutSetVolume\n");
+ return midiOutSetVolume_orig( hmo, dwVolume);
+ }
+
+ MMRESULT WINAPI midiOutGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText)
+ {
+ //OutputDebugString(L"midiOutGetErrorTextA\n");
+ return midiOutGetErrorTextA_orig( mmrError, pszText, cchText);
+ }
+
+ MMRESULT WINAPI midiOutGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText)
+ {
+ //OutputDebugString(L"midiOutGetErrorTextW\n");
+ return midiOutGetErrorTextW_orig( mmrError, pszText, cchText);
+ }
+
+ MMRESULT WINAPI midiOutOpen( LPHMIDIOUT phmo, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)
+ {
+ //OutputDebugString(L"midiOutOpen\n");
+ return midiOutOpen_orig(phmo, uDeviceID, dwCallback, dwInstance, fdwOpen);
+ }
+
+ MMRESULT WINAPI midiOutClose( HMIDIOUT hmo)
+ {
+ //OutputDebugString(L"midiOutClose\n");
+ return midiOutClose_orig( hmo);
+ }
+
+ MMRESULT WINAPI midiOutPrepareHeader( HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh)
+ {
+ //OutputDebugString(L"midiOutPrepareHeader\n");
+ return midiOutPrepareHeader_orig( hmo, pmh, cbmh);
+ }
+
+ MMRESULT WINAPI midiOutUnprepareHeader(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh)
+ {
+ //OutputDebugString(L"midiOutUnprepareHeader\n");
+ return midiOutUnprepareHeader_orig(hmo, pmh, cbmh);
+ }
+
+ MMRESULT WINAPI midiOutShortMsg( HMIDIOUT hmo, DWORD dwMsg)
+ {
+ //OutputDebugString(L"midiOutShortMsg\n");
+ return midiOutShortMsg_orig( hmo, dwMsg);
+ }
+
+ MMRESULT WINAPI midiOutLongMsg(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh)
+ {
+ //OutputDebugString(L"midiOutLongMsg\n");
+ return midiOutLongMsg_orig(hmo, pmh, cbmh);
+ }
+
+ MMRESULT WINAPI midiOutReset( HMIDIOUT hmo)
+ {
+ //OutputDebugString(L"midiOutReset\n");
+ return midiOutReset_orig( hmo);
+ }
+
+ MMRESULT WINAPI midiOutCachePatches( HMIDIOUT hmo, UINT uBank, LPWORD pwpa, UINT fuCache)
+ {
+ //OutputDebugString(L"midiOutCachePatches\n");
+ return midiOutCachePatches_orig( hmo, uBank, pwpa, fuCache);
+ }
+
+ MMRESULT WINAPI midiOutCacheDrumPatches( HMIDIOUT hmo, UINT uPatch, LPWORD pwkya, UINT fuCache)
+ {
+ //OutputDebugString(L"midiOutCacheDrumPatches\n");
+ return midiOutCacheDrumPatches_orig( hmo, uPatch, pwkya, fuCache);
+ }
+
+ MMRESULT WINAPI midiOutGetID( HMIDIOUT hmo, LPUINT puDeviceID)
+ {
+ //OutputDebugString(L"midiOutGetID\n");
+ return midiOutGetID_orig( hmo, puDeviceID);
+ }
+
+ MMRESULT WINAPI midiOutMessage( HMIDIOUT hmo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2)
+ {
+ //OutputDebugString(L"midiOutMessage\n");
+ return midiOutMessage_orig( hmo, uMsg, dw1, dw2);
+ }
+
+ UINT WINAPI midiInGetNumDevs(void)
+ {
+ //OutputDebugString(L"midiInGetNumDevs\n");
+ return midiInGetNumDevs_orig();
+ }
+
+ MMRESULT WINAPI midiInGetDevCapsA( UINT_PTR uDeviceID, LPMIDIINCAPSA pmic, UINT cbmic)
+ {
+ //OutputDebugString(L"midiInGetDevCapsA\n");
+ return midiInGetDevCapsA_orig( uDeviceID, pmic, cbmic);
+ }
+
+ MMRESULT WINAPI midiInGetDevCapsW( UINT_PTR uDeviceID, LPMIDIINCAPSW pmic, UINT cbmic)
+ {
+ //OutputDebugString(L"midiInGetDevCapsW\n");
+ return midiInGetDevCapsW_orig( uDeviceID, pmic, cbmic);
+ }
+
+ MMRESULT WINAPI midiInGetErrorTextA( MMRESULT mmrError, LPSTR pszText, UINT cchText)
+ {
+ //OutputDebugString(L"midiInGetErrorTextA\n");
+ return midiInGetErrorTextA_orig( mmrError, pszText, cchText);
+ }
+
+ MMRESULT WINAPI midiInGetErrorTextW( MMRESULT mmrError, LPWSTR pszText, UINT cchText)
+ {
+ //OutputDebugString(L"midiInGetErrorTextW\n");
+ return midiInGetErrorTextW_orig( mmrError, pszText, cchText);
+ }
+
+ MMRESULT WINAPI midiInOpen( LPHMIDIIN phmi, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)
+ {
+ //OutputDebugString(L"midiInOpen\n");
+ return midiInOpen_orig(phmi, uDeviceID, dwCallback, dwInstance, fdwOpen);
+ }
+
+ MMRESULT WINAPI midiInClose( HMIDIIN hmi)
+ {
+ //OutputDebugString(L"midiInClose\n");
+ return midiInClose_orig( hmi);
+ }
+
+ MMRESULT WINAPI midiInPrepareHeader( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh)
+ {
+ //OutputDebugString(L"midiInPrepareHeader\n");
+ return midiInPrepareHeader_orig( hmi, pmh, cbmh);
+ }
+
+ MMRESULT WINAPI midiInUnprepareHeader( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh)
+ {
+ //OutputDebugString(L"midiInUnprepareHeader\n");
+ return midiInUnprepareHeader_orig( hmi, pmh, cbmh);
+ }
+
+ MMRESULT WINAPI midiInAddBuffer( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh)
+ {
+ //OutputDebugString(L"midiInAddBuffer\n");
+ return midiInAddBuffer_orig( hmi, pmh, cbmh);
+ }
+
+ MMRESULT WINAPI midiInStart( HMIDIIN hmi)
+ {
+ //OutputDebugString(L"midiInStart\n");
+ return midiInStart_orig( hmi);
+ }
+
+ MMRESULT WINAPI midiInStop( HMIDIIN hmi)
+ {
+ //OutputDebugString(L"midiInStop\n");
+ return midiInStop_orig(hmi);
+ }
+
+ MMRESULT WINAPI midiInReset( HMIDIIN hmi)
+ {
+ //OutputDebugString(L"midiInReset\n");
+ return midiInReset_orig( hmi);
+ }
+
+ MMRESULT WINAPI midiInGetID( HMIDIIN hmi, LPUINT puDeviceID)
+ {
+ //OutputDebugString(L"midiInGetID\n");
+ return midiInGetID_orig( hmi, puDeviceID);
+ }
+
+ MMRESULT WINAPI midiInMessage( HMIDIIN hmi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2)
+ {
+ //OutputDebugString(L"midiInMessage\n");
+ return midiInMessage_orig( hmi, uMsg, dw1, dw2);
+ }
+
+ UINT WINAPI auxGetNumDevs(void)
+ {
+ //OutputDebugString(L"auxGetNumDevs\n");
+ return auxGetNumDevs_orig();
+ }
+
+ MMRESULT WINAPI auxGetDevCapsA( UINT_PTR uDeviceID, LPAUXCAPSA pac, UINT cbac)
+ {
+ //OutputDebugString(L"auxGetDevCapsA\n");
+ return auxGetDevCapsA_orig( uDeviceID, pac, cbac);
+ }
+
+ MMRESULT WINAPI auxGetDevCapsW( UINT_PTR uDeviceID, LPAUXCAPSW pac, UINT cbac)
+ {
+ //OutputDebugString(L"auxGetDevCapsW\n");
+ return auxGetDevCapsW_orig( uDeviceID, pac, cbac);
+ }
+
+ MMRESULT WINAPI auxSetVolume( UINT uDeviceID, DWORD dwVolume)
+ {
+ //OutputDebugString(L"auxSetVolume\n");
+ return auxSetVolume_orig( uDeviceID, dwVolume);
+ }
+
+ MMRESULT WINAPI auxGetVolume( UINT uDeviceID, LPDWORD pdwVolume)
+ {
+ //OutputDebugString(L"auxGetVolume\n");
+ return auxGetVolume_orig( uDeviceID, pdwVolume);
+ }
+
+ MMRESULT WINAPI auxOutMessage( UINT uDeviceID, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2)
+ {
+ //OutputDebugString(L"auxOutMessage\n");
+ return auxOutMessage_orig( uDeviceID, uMsg, dw1, dw2);
+ }
+
+ UINT WINAPI mixerGetNumDevs(void)
+ {
+ //OutputDebugString(L"mixerGetNumDevs\n");
+ return mixerGetNumDevs_orig();
+ }
+
+ MMRESULT WINAPI mixerGetDevCapsA( UINT_PTR uMxId, LPMIXERCAPSA pmxcaps, UINT cbmxcaps)
+ {
+ //OutputDebugString(L"mixerGetDevCapsA\n");
+ return mixerGetDevCapsA_orig( uMxId, pmxcaps, cbmxcaps);
+ }
+
+ MMRESULT WINAPI mixerGetDevCapsW( UINT_PTR uMxId, LPMIXERCAPSW pmxcaps, UINT cbmxcaps)
+ {
+ //OutputDebugString(L"mixerGetDevCapsW\n");
+ return mixerGetDevCapsW_orig( uMxId, pmxcaps, cbmxcaps);
+ }
+
+ MMRESULT WINAPI mixerOpen( LPHMIXER phmx, UINT uMxId, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)
+ {
+ //OutputDebugString(L"mixerOpen\n");
+ return mixerOpen_orig( phmx, uMxId, dwCallback, dwInstance, fdwOpen);
+ }
+
+ MMRESULT WINAPI mixerClose( HMIXER hmx)
+ {
+ //OutputDebugString(L"mixerClose\n");
+ return mixerClose_orig( hmx);
+ }
+
+ DWORD WINAPI mixerMessage( HMIXER hmx, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
+ {
+ //OutputDebugString(L"mixerMessage\n");
+ return mixerMessage_orig( hmx, uMsg, dwParam1, dwParam2);
+ }
+
+ MMRESULT WINAPI mixerGetLineInfoA( HMIXEROBJ hmxobj, LPMIXERLINEA pmxl, DWORD fdwInfo)
+ {
+ //OutputDebugString(L"mixerGetLineInfoA\n");
+ return mixerGetLineInfoA_orig( hmxobj, pmxl, fdwInfo);
+ }
+
+ MMRESULT WINAPI mixerGetLineInfoW( HMIXEROBJ hmxobj, LPMIXERLINEW pmxl, DWORD fdwInfo)
+ {
+ //OutputDebugString(L"mixerGetLineInfoW\n");
+ return mixerGetLineInfoW_orig( hmxobj, pmxl, fdwInfo);
+ }
+
+ MMRESULT WINAPI mixerGetID( HMIXEROBJ hmxobj, UINT FAR *puMxId, DWORD fdwId)
+ {
+ //OutputDebugString(L"mixerGetID\n");
+ return mixerGetID_orig( hmxobj, puMxId, fdwId);
+ }
+
+ MMRESULT WINAPI mixerGetLineControlsA( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSA pmxlc, DWORD fdwControls)
+ {
+ //OutputDebugString(L"mixerGetLineControlsA\n");
+ return mixerGetLineControlsA_orig( hmxobj, pmxlc, fdwControls);
+ }
+
+ MMRESULT WINAPI mixerGetLineControlsW( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSW pmxlc, DWORD fdwControls)
+ {
+ //OutputDebugString(L"mixerGetLineControlsW\n");
+ return mixerGetLineControlsW_orig( hmxobj, pmxlc, fdwControls);
+ }
+
+ MMRESULT WINAPI mixerGetControlDetailsA( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails)
+ {
+ //OutputDebugString(L"mixerGetControlDetailsA\n");
+ return mixerGetControlDetailsA_orig( hmxobj, pmxcd, fdwDetails);
+ }
+
+ MMRESULT WINAPI mixerGetControlDetailsW( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails)
+ {
+ //OutputDebugString(L"mixerGetControlDetailsW\n");
+ return mixerGetControlDetailsW_orig( hmxobj, pmxcd, fdwDetails);
+ }
+
+ MMRESULT WINAPI mixerSetControlDetails( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails)
+ {
+ //OutputDebugString(L"mixerSetControlDetails\n");
+ return mixerSetControlDetails_orig( hmxobj, pmxcd, fdwDetails);
+ }
+
+ DWORD WINAPI mmGetCurrentTask(void)
+ {
+ //OutputDebugString(L"mmGetCurrentTask\n");
+ return mmGetCurrentTask_orig();
+ }
+
+ void WINAPI mmTaskBlock(DWORD val)
+ {
+ //OutputDebugString(L"mmTaskBlock\n");
+ return mmTaskBlock_orig(val);
+ }
+
+ UINT WINAPI mmTaskCreate(LPTASKCALLBACK a, HANDLE* b, DWORD_PTR c)
+ {
+ //OutputDebugString(L"mmTaskCreate\n");
+ return mmTaskCreate_orig(a, b, c);
+ }
+
+ BOOL WINAPI mmTaskSignal(DWORD a)
+ {
+ //OutputDebugString(L"mmTaskSignal\n");
+ return mmTaskSignal_orig(a);
+ }
+
+ VOID WINAPI mmTaskYield()
+ {
+ //OutputDebugString(L"mmTaskYield\n");
+ mmTaskYield_orig();
+ }
+
+ MMRESULT WINAPI timeGetSystemTime( LPMMTIME pmmt, UINT cbmmt)
+ {
+ //OutputDebugString(L"timeGetSystemTime\n");
+ return timeGetSystemTime_orig( pmmt, cbmmt);
+ }
+
+ DWORD WINAPI timeGetTime(void)
+ {
+ //OutputDebugString(L"timeGetTime\n");
+ return timeGetTime_orig();
+ }
+
+ MMRESULT WINAPI timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK fptc, DWORD_PTR dwUser, UINT fuEvent)
+ {
+ //OutputDebugString(L"timeSetEvent\n");
+ return timeSetEvent_orig(uDelay, uResolution, fptc, dwUser, fuEvent);
+ }
+
+ MMRESULT WINAPI timeKillEvent( UINT uTimerID)
+ {
+ //OutputDebugString(L"timeKillEvent\n");
+ return timeKillEvent_orig( uTimerID);
+ }
+
+ MMRESULT WINAPI timeGetDevCaps( LPTIMECAPS ptc, UINT cbtc)
+ {
+ //OutputDebugString(L"timeGetDevCaps\n");
+ return timeGetDevCaps_orig( ptc, cbtc);
+ }
+
+ MMRESULT WINAPI timeBeginPeriod( UINT uPeriod)
+ {
+ //OutputDebugString(L"timeBeginPeriod\n");
+ return timeBeginPeriod_orig( uPeriod);
+ }
+
+ MMRESULT WINAPI timeEndPeriod( UINT uPeriod)
+ {
+ //OutputDebugString(L"timeEndPeriod\n");
+ return timeEndPeriod_orig( uPeriod);
+ }
+
+ UINT WINAPI joyGetNumDevs(void)
+ {
+ //OutputDebugString(L"joyGetNumDevs\n");
+ return joyGetNumDevs_orig();
+ }
+
+ MMRESULT WINAPI joyConfigChanged(DWORD dwFlags)
+ {
+ //OutputDebugString(L"joyConfigChanged\n");
+ return joyConfigChanged_orig(dwFlags);
+ }
+
+ MMRESULT WINAPI joyGetDevCapsA( UINT_PTR uJoyID, LPJOYCAPSA pjc, UINT cbjc)
+ {
+ //OutputDebugString(L"joyGetDevCapsA\n");
+ return joyGetDevCapsA_orig( uJoyID, pjc, cbjc);
+ }
+
+ MMRESULT WINAPI joyGetDevCapsW( UINT_PTR uJoyID, LPJOYCAPSW pjc, UINT cbjc)
+ {
+ //OutputDebugString(L"joyGetDevCapsW\n");
+ return joyGetDevCapsW_orig( uJoyID, pjc, cbjc);
+ }
+
+ MMRESULT WINAPI joyGetPos( UINT uJoyID, LPJOYINFO pji)
+ {
+ //OutputDebugString(L"joyGetPos\n");
+ return joyGetPos_orig( uJoyID, pji);
+ }
+
+ MMRESULT WINAPI joyGetPosEx( UINT uJoyID, LPJOYINFOEX pji)
+ {
+ //OutputDebugString(L"joyGetPosEx\n");
+ return joyGetPosEx_orig( uJoyID, pji);
+ }
+
+ MMRESULT WINAPI joyGetThreshold( UINT uJoyID, LPUINT puThreshold)
+ {
+ //OutputDebugString(L"joyGetThreshold\n");
+ return joyGetThreshold_orig( uJoyID, puThreshold);
+ }
+
+ MMRESULT WINAPI joyReleaseCapture( UINT uJoyID)
+ {
+ //OutputDebugString(L"joyReleaseCapture\n");
+ return joyReleaseCapture_orig( uJoyID);
+ }
+
+ MMRESULT WINAPI joySetCapture( HWND hwnd, UINT uJoyID, UINT uPeriod, BOOL fChanged)
+ {
+ //OutputDebugString(L"joySetCapture\n");
+ return joySetCapture_orig(hwnd, uJoyID, uPeriod, fChanged);
+ }
+
+ MMRESULT WINAPI joySetThreshold( UINT uJoyID, UINT uThreshold)
+ {
+ //OutputDebugString(L"joySetThreshold\n");
+ return joySetThreshold_orig( uJoyID, uThreshold);
+ }
+
+ BOOL WINAPI mciDriverNotify(HWND hwndCallback, UINT uDeviceID, UINT uStatus)
+ {
+ //OutputDebugString(L"mciDriverNotify\n");
+ return mciDriverNotify_orig(hwndCallback, uDeviceID, uStatus);
+ }
+
+ UINT WINAPI mciDriverYield(UINT uDeviceID)
+ {
+ //OutputDebugString(L"mciDriverYield\n");
+ return mciDriverYield_orig(uDeviceID);
+ }
+
+ FOURCC WINAPI mmioStringToFOURCCA( LPCSTR sz, UINT uFlags)
+ {
+ //OutputDebugString(L"mmioStringToFOURCCA\n");
+ return mmioStringToFOURCCA_orig( sz, uFlags);
+ }
+
+ FOURCC WINAPI mmioStringToFOURCCW( LPCWSTR sz, UINT uFlags)
+ {
+ //OutputDebugString(L"mmioStringToFOURCCW\n");
+ return mmioStringToFOURCCW_orig( sz, uFlags);
+ }
+
+ LPMMIOPROC WINAPI mmioInstallIOProcA( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags)
+ {
+ //OutputDebugString(L"mmioInstallIOProcA\n");
+ return mmioInstallIOProcA_orig( fccIOProc, pIOProc, dwFlags);
+ }
+
+ LPMMIOPROC WINAPI mmioInstallIOProcW( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags)
+ {
+ //OutputDebugString(L"mmioInstallIOProcW\n");
+ return mmioInstallIOProcW_orig( fccIOProc, pIOProc, dwFlags);
+ }
+
+ HMMIO WINAPI mmioOpenA( LPSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen)
+ {
+ //OutputDebugString(L"mmioOpenA\n");
+ return mmioOpenA_orig( pszFileName, pmmioinfo, fdwOpen);
+ }
+
+ HMMIO WINAPI mmioOpenW( LPWSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen)
+ {
+ //OutputDebugString(L"mmioOpenW\n");
+ return mmioOpenW_orig( pszFileName, pmmioinfo, fdwOpen);
+ }
+
+ MMRESULT WINAPI mmioRenameA( LPCSTR pszFileName, LPCSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename)
+ {
+ //OutputDebugString(L"mmioRenameA\n");
+ return mmioRenameA_orig( pszFileName, pszNewFileName, pmmioinfo, fdwRename);
+ }
+
+ MMRESULT WINAPI mmioRenameW( LPCWSTR pszFileName, LPCWSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename)
+ {
+ //OutputDebugString(L"mmioRenameW\n");
+ return mmioRenameW_orig( pszFileName, pszNewFileName, pmmioinfo, fdwRename);
+ }
+
+ MMRESULT WINAPI mmioClose( HMMIO hmmio, UINT fuClose)
+ {
+ //OutputDebugString(L"mmioClose\n");
+ return mmioClose_orig( hmmio, fuClose);
+ }
+
+ LONG WINAPI mmioRead( HMMIO hmmio, HPSTR pch, LONG cch)
+ {
+ //OutputDebugString(L"mmioRead\n");
+ return mmioRead_orig( hmmio, pch, cch);
+ }
+
+ LONG WINAPI mmioWrite( HMMIO hmmio, const char _huge* pch, LONG cch)
+ {
+ //OutputDebugString(L"mmioWrite\n");
+ return mmioWrite_orig( hmmio, pch, cch);
+ }
+
+ LONG WINAPI mmioSeek( HMMIO hmmio, LONG lOffset, int iOrigin)
+ {
+ //OutputDebugString(L"mmioSeek\n");
+ return mmioSeek_orig(hmmio, lOffset, iOrigin);
+ }
+
+ MMRESULT WINAPI mmioGetInfo( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuInfo)
+ {
+ //OutputDebugString(L"mmioGetInfo\n");
+ return mmioGetInfo_orig( hmmio, pmmioinfo, fuInfo);
+ }
+
+ MMRESULT WINAPI mmioSetInfo( HMMIO hmmio, LPCMMIOINFO pmmioinfo, UINT fuInfo)
+ {
+ //OutputDebugString(L"mmioSetInfo\n");
+ return mmioSetInfo_orig( hmmio, pmmioinfo, fuInfo);
+ }
+
+ MMRESULT WINAPI mmioSetBuffer( HMMIO hmmio, LPSTR pchBuffer, LONG cchBuffer, UINT fuBuffer)
+ {
+ //OutputDebugString(L"mmioSetBuffer\n");
+ return mmioSetBuffer_orig(hmmio, pchBuffer, cchBuffer, fuBuffer);
+ }
+
+ MMRESULT WINAPI mmioFlush( HMMIO hmmio, UINT fuFlush)
+ {
+ //OutputDebugString(L"mmioFlush\n");
+ return mmioFlush_orig( hmmio, fuFlush);
+ }
+
+ MMRESULT WINAPI mmioAdvance( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuAdvance)
+ {
+ //OutputDebugString(L"mmioAdvance\n");
+ return mmioAdvance_orig( hmmio, pmmioinfo, fuAdvance);
+ }
+
+ LRESULT WINAPI mmioSendMessage( HMMIO hmmio, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
+ {
+ //OutputDebugString(L"mmioSendMessage\n");
+ return mmioSendMessage_orig(hmmio, uMsg, lParam1, lParam2);
+ }
+
+ MMRESULT WINAPI mmioDescend( HMMIO hmmio, LPMMCKINFO pmmcki, const MMCKINFO FAR* pmmckiParent, UINT fuDescend)
+ {
+ //OutputDebugString(L"mmioDescend\n");
+ return mmioDescend_orig(hmmio, pmmcki, pmmckiParent, fuDescend);
+ }
+
+ MMRESULT WINAPI mmioAscend( HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuAscend)
+ {
+ //OutputDebugString(L"mmioAscend\n");
+ return mmioAscend_orig( hmmio, pmmcki, fuAscend);
+ }
+
+ MMRESULT WINAPI mmioCreateChunk(HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuCreate)
+ {
+ //OutputDebugString(L"mmioCreateChunk\n");
+ return mmioCreateChunk_orig(hmmio, pmmcki, fuCreate);
+ }
+
+ MCIERROR WINAPI mciSendCommandA( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
+ {
+ //OutputDebugString(L"mciSendCommandA\n");
+ return mciSendCommandA_orig( mciId, uMsg, dwParam1, dwParam2);
+ }
+
+ MCIERROR WINAPI mciSendCommandW( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
+ {
+ //OutputDebugString(L"mciSendCommandW\n");
+ return mciSendCommandW_orig( mciId, uMsg, dwParam1, dwParam2);
+ }
+
+ MCIERROR WINAPI mciSendStringA( LPCSTR lpstrCommand, LPSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback)
+ {
+ //OutputDebugString(L"mciSendStringA\n");
+ return mciSendStringA_orig( lpstrCommand, lpstrReturnString, uReturnLength, hwndCallback);
+ }
+
+ MCIERROR WINAPI mciSendStringW( LPCWSTR lpstrCommand, LPWSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback)
+ {
+ //OutputDebugString(L"mciSendStringW\n");
+ return mciSendStringW_orig( lpstrCommand, lpstrReturnString, uReturnLength, hwndCallback);
+ }
+
+ MCIDEVICEID WINAPI mciGetDeviceIDA( LPCSTR pszDevice)
+ {
+ //OutputDebugString(L"mciGetDeviceIDA\n");
+ return mciGetDeviceIDA_orig( pszDevice);
+ }
+
+ MCIDEVICEID WINAPI mciGetDeviceIDW( LPCWSTR pszDevice)
+ {
+ //OutputDebugString(L"mciGetDeviceIDW\n");
+ return mciGetDeviceIDW_orig( pszDevice);
+ }
+
+ MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDA( DWORD dwElementID, LPCSTR lpstrType )
+ {
+ //OutputDebugString(L"mciGetDeviceIDFromElementIDA\n");
+ return mciGetDeviceIDFromElementIDA_orig( dwElementID, lpstrType );
+ }
+
+ MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDW( DWORD dwElementID, LPCWSTR lpstrType )
+ {
+ //OutputDebugString(L"mciGetDeviceIDFromElementIDW\n");
+ return mciGetDeviceIDFromElementIDW_orig( dwElementID, lpstrType );
+ }
+
+ DWORD_PTR WINAPI mciGetDriverData(UINT uDeviceID)
+ {
+ //OutputDebugString(L"mciGetDriverData\n");
+ return mciGetDriverData_orig(uDeviceID);
+ }
+
+ BOOL WINAPI mciGetErrorStringA( MCIERROR mcierr, LPSTR pszText, UINT cchText)
+ {
+ //OutputDebugString(L"mciGetErrorStringA\n");
+ return mciGetErrorStringA_orig( mcierr, pszText, cchText);
+ }
+
+ BOOL WINAPI mciGetErrorStringW( MCIERROR mcierr, LPWSTR pszText, UINT cchText)
+ {
+ //OutputDebugString(L"mciGetErrorStringW\n");
+ return mciGetErrorStringW_orig( mcierr, pszText, cchText);
+ }
+
+ BOOL WINAPI mciSetDriverData(UINT uDeviceID, DWORD_PTR dwData)
+ {
+ //OutputDebugString(L"mciSetDriverData_type\n");
+ return mciSetDriverData_orig( uDeviceID, dwData );
+ }
+
+ BOOL WINAPI mciSetYieldProc( MCIDEVICEID mciId, YIELDPROC fpYieldProc, DWORD dwYieldData)
+ {
+ //OutputDebugString(L"mciSetYieldProc\n");
+ return mciSetYieldProc_orig(mciId, fpYieldProc, dwYieldData);
+ }
+
+ BOOL WINAPI mciFreeCommandResource(UINT uTable)
+ {
+ //OutputDebugString(L"mciFreeCommandResource\n");
+ return mciFreeCommandResource_orig(uTable);
+ }
+
+ HTASK WINAPI mciGetCreatorTask( MCIDEVICEID mciId)
+ {
+ //OutputDebugString(L"mciGetCreatorTask\n");
+ return mciGetCreatorTask_orig( mciId);
+ }
+
+ YIELDPROC WINAPI mciGetYieldProc( MCIDEVICEID mciId, LPDWORD pdwYieldData)
+ {
+ //OutputDebugString(L"mciGetYieldProc\n");
+ return mciGetYieldProc_orig( mciId, pdwYieldData);
+ }
+
+ UINT WINAPI mciLoadCommandResource(HINSTANCE hInstance, LPCWSTR lpResName, UINT uType)
+ {
+ //OutputDebugString(L"mciLoadCommandResource");
+ return mciLoadCommandResource_orig(hInstance, lpResName, uType);
+ }
+
+
+ BOOL WINAPI mciExecute(LPCSTR pszCommand)
+ {
+ //OutputDebugString(L"mciExecute\n");
+ return mciExecute_orig(pszCommand);
+ }
+}
diff --git a/indra/media_plugins/winmmshim/forwarding_api.h b/indra/media_plugins/winmmshim/forwarding_api.h
new file mode 100644
index 0000000000..31e2186aa2
--- /dev/null
+++ b/indra/media_plugins/winmmshim/forwarding_api.h
@@ -0,0 +1,395 @@
+/**
+ * @file forwarding_api.h
+ * @brief forwards winmm API calls to real winmm.dll
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+// this turns off __declspec(dllimport) for the functions declared in mmsystem.h
+#define _WINMM_
+#include <windows.h>
+#include <mmsystem.h>
+
+void init_function_pointers(HMODULE winmm_handle);
+
+typedef VOID (*LPTASKCALLBACK)(DWORD_PTR dwInst);
+
+typedef LRESULT (WINAPI *CloseDriver_type)( HDRVR hDriver, LPARAM lParam1, LPARAM lParam2);
+extern CloseDriver_type CloseDriver_orig;
+typedef HDRVR (WINAPI *OpenDriver_type)( LPCWSTR szDriverName, LPCWSTR szSectionName, LPARAM lParam2);
+extern OpenDriver_type OpenDriver_orig;
+typedef LRESULT (WINAPI *SendDriverMessage_type)( HDRVR hDriver, UINT message, LPARAM lParam1, LPARAM lParam2);
+extern SendDriverMessage_type SendDriverMessage_orig;
+typedef HMODULE (WINAPI *DrvGetModuleHandle_type)( HDRVR hDriver);
+extern DrvGetModuleHandle_type DrvGetModuleHandle_orig;
+typedef HMODULE (WINAPI *GetDriverModuleHandle_type)( HDRVR hDriver);
+extern GetDriverModuleHandle_type GetDriverModuleHandle_orig;
+typedef LRESULT (WINAPI *DefDriverProc_type)( DWORD_PTR dwDriverIdentifier, HDRVR hdrvr, UINT uMsg, LPARAM lParam1, LPARAM lParam2);
+extern DefDriverProc_type DefDriverProc_orig;
+typedef BOOL (WINAPI *DriverCallback_type)(DWORD dwCallBack, DWORD dwFlags, HDRVR hdrvr, DWORD msg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2);
+extern DriverCallback_type DriverCallback_orig;
+typedef UINT (WINAPI *mmsystemGetVersion_type)(void);
+extern mmsystemGetVersion_type mmsystemGetVersion_orig;
+typedef BOOL (WINAPI *sndPlaySoundA_type)( LPCSTR pszSound, UINT fuSound);
+extern sndPlaySoundA_type sndPlaySoundA_orig;
+typedef BOOL (WINAPI *sndPlaySoundW_type)( LPCWSTR pszSound, UINT fuSound);
+extern sndPlaySoundW_type sndPlaySoundW_orig;
+typedef BOOL (WINAPI *PlaySoundA_type)( LPCSTR pszSound, HMODULE hmod, DWORD fdwSound);
+extern PlaySoundA_type PlaySoundA_orig;
+typedef BOOL (WINAPI *PlaySoundW_type)( LPCWSTR pszSound, HMODULE hmod, DWORD fdwSound);
+extern PlaySoundW_type PlaySoundW_orig;
+typedef UINT (WINAPI *waveOutGetNumDevs_type)(void);
+extern waveOutGetNumDevs_type waveOutGetNumDevs_orig;
+typedef MMRESULT (WINAPI *waveOutGetDevCapsA_type)( UINT_PTR uDeviceID, LPWAVEOUTCAPSA pwoc, UINT cbwoc);
+extern waveOutGetDevCapsA_type waveOutGetDevCapsA_orig;
+typedef MMRESULT (WINAPI *waveOutGetDevCapsW_type)( UINT_PTR uDeviceID, LPWAVEOUTCAPSW pwoc, UINT cbwoc);
+extern waveOutGetDevCapsW_type waveOutGetDevCapsW_orig;
+typedef MMRESULT (WINAPI *waveOutGetVolume_type)( HWAVEOUT hwo, LPDWORD pdwVolume);
+extern waveOutGetVolume_type waveOutGetVolume_orig;
+typedef MMRESULT (WINAPI *waveOutSetVolume_type)( HWAVEOUT hwo, DWORD dwVolume);
+extern waveOutSetVolume_type waveOutSetVolume_orig;
+typedef MMRESULT (WINAPI *waveOutGetErrorTextA_type)( MMRESULT mmrError, LPSTR pszText, UINT cchText);
+extern waveOutGetErrorTextA_type waveOutGetErrorTextA_orig;
+typedef MMRESULT (WINAPI *waveOutGetErrorTextW_type)( MMRESULT mmrError, LPWSTR pszText, UINT cchText);
+extern waveOutGetErrorTextW_type waveOutGetErrorTextW_orig;
+typedef MMRESULT (WINAPI *waveOutOpen_type)( LPHWAVEOUT phwo, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen);
+extern waveOutOpen_type waveOutOpen_orig;
+typedef MMRESULT (WINAPI *waveOutClose_type)( HWAVEOUT hwo);
+extern waveOutClose_type waveOutClose_orig;
+typedef MMRESULT (WINAPI *waveOutPrepareHeader_type)( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh);
+extern waveOutPrepareHeader_type waveOutPrepareHeader_orig;
+typedef MMRESULT (WINAPI *waveOutUnprepareHeader_type)( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh);
+extern waveOutUnprepareHeader_type waveOutUnprepareHeader_orig;
+typedef MMRESULT (WINAPI *waveOutWrite_type)( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh);
+extern waveOutWrite_type waveOutWrite_orig;
+typedef MMRESULT (WINAPI *waveOutPause_type)( HWAVEOUT hwo);
+extern waveOutPause_type waveOutPause_orig;
+typedef MMRESULT (WINAPI *waveOutRestart_type)( HWAVEOUT hwo);
+extern waveOutRestart_type waveOutRestart_orig;
+typedef MMRESULT (WINAPI *waveOutReset_type)( HWAVEOUT hwo);
+extern waveOutReset_type waveOutReset_orig;
+typedef MMRESULT (WINAPI *waveOutBreakLoop_type)( HWAVEOUT hwo);
+extern waveOutBreakLoop_type waveOutBreakLoop_orig;
+typedef MMRESULT (WINAPI *waveOutGetPosition_type)( HWAVEOUT hwo, LPMMTIME pmmt, UINT cbmmt);
+extern waveOutGetPosition_type waveOutGetPosition_orig;
+typedef MMRESULT (WINAPI *waveOutGetPitch_type)( HWAVEOUT hwo, LPDWORD pdwPitch);
+extern waveOutGetPitch_type waveOutGetPitch_orig;
+typedef MMRESULT (WINAPI *waveOutSetPitch_type)( HWAVEOUT hwo, DWORD dwPitch);
+extern waveOutSetPitch_type waveOutSetPitch_orig;
+typedef MMRESULT (WINAPI *waveOutGetPlaybackRate_type)( HWAVEOUT hwo, LPDWORD pdwRate);
+extern waveOutGetPlaybackRate_type waveOutGetPlaybackRate_orig;
+typedef MMRESULT (WINAPI *waveOutSetPlaybackRate_type)( HWAVEOUT hwo, DWORD dwRate);
+extern waveOutSetPlaybackRate_type waveOutSetPlaybackRate_orig;
+typedef MMRESULT (WINAPI *waveOutGetID_type)( HWAVEOUT hwo, LPUINT puDeviceID);
+extern waveOutGetID_type waveOutGetID_orig;
+typedef MMRESULT (WINAPI *waveOutMessage_type)( HWAVEOUT hwo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2);
+extern waveOutMessage_type waveOutMessage_orig;
+typedef UINT (WINAPI *waveInGetNumDevs_type)(void);
+extern waveInGetNumDevs_type waveInGetNumDevs_orig;
+typedef MMRESULT (WINAPI *waveInGetDevCapsA_type)( UINT_PTR uDeviceID, LPWAVEINCAPSA pwic, UINT cbwic);
+extern waveInGetDevCapsA_type waveInGetDevCapsA_orig;
+typedef MMRESULT (WINAPI *waveInGetDevCapsW_type)( UINT_PTR uDeviceID, LPWAVEINCAPSW pwic, UINT cbwic);
+extern waveInGetDevCapsW_type waveInGetDevCapsW_orig;
+typedef MMRESULT (WINAPI *waveInGetErrorTextA_type)(MMRESULT mmrError, LPSTR pszText, UINT cchText);
+extern waveInGetErrorTextA_type waveInGetErrorTextA_orig;
+typedef MMRESULT (WINAPI *waveInGetErrorTextW_type)(MMRESULT mmrError, LPWSTR pszText, UINT cchText);
+extern waveInGetErrorTextW_type waveInGetErrorTextW_orig;
+typedef MMRESULT (WINAPI *waveInOpen_type)( LPHWAVEIN phwi, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen);
+extern waveInOpen_type waveInOpen_orig;
+typedef MMRESULT (WINAPI *waveInClose_type)( HWAVEIN hwi);
+extern waveInClose_type waveInClose_orig;
+typedef MMRESULT (WINAPI *waveInPrepareHeader_type)( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh);
+extern waveInPrepareHeader_type waveInPrepareHeader_orig;
+typedef MMRESULT (WINAPI *waveInUnprepareHeader_type)( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh);
+extern waveInUnprepareHeader_type waveInUnprepareHeader_orig;
+typedef MMRESULT (WINAPI *waveInAddBuffer_type)( HWAVEIN hwi, LPWAVEHDR pwh, UINT cbwh);
+extern waveInAddBuffer_type waveInAddBuffer_orig;
+typedef MMRESULT (WINAPI *waveInStart_type)( HWAVEIN hwi);
+extern waveInStart_type waveInStart_orig;
+typedef MMRESULT (WINAPI *waveInStop_type)( HWAVEIN hwi);
+extern waveInStop_type waveInStop_orig;
+typedef MMRESULT (WINAPI *waveInReset_type)( HWAVEIN hwi);
+extern waveInReset_type waveInReset_orig;
+typedef MMRESULT (WINAPI *waveInGetPosition_type)( HWAVEIN hwi, LPMMTIME pmmt, UINT cbmmt);
+extern waveInGetPosition_type waveInGetPosition_orig;
+typedef MMRESULT (WINAPI *waveInGetID_type)( HWAVEIN hwi, LPUINT puDeviceID);
+extern waveInGetID_type waveInGetID_orig;
+typedef MMRESULT (WINAPI *waveInMessage_type)( HWAVEIN hwi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2);
+extern waveInMessage_type waveInMessage_orig;
+typedef UINT (WINAPI *midiOutGetNumDevs_type)(void);
+extern midiOutGetNumDevs_type midiOutGetNumDevs_orig;
+typedef MMRESULT (WINAPI *midiStreamOpen_type)( LPHMIDISTRM phms, LPUINT puDeviceID, DWORD cMidi, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen);
+extern midiStreamOpen_type midiStreamOpen_orig;
+typedef MMRESULT (WINAPI *midiStreamClose_type)( HMIDISTRM hms);
+extern midiStreamClose_type midiStreamClose_orig;
+typedef MMRESULT (WINAPI *midiStreamProperty_type)( HMIDISTRM hms, LPBYTE lppropdata, DWORD dwProperty);
+extern midiStreamProperty_type midiStreamProperty_orig;
+typedef MMRESULT (WINAPI *midiStreamPosition_type)( HMIDISTRM hms, LPMMTIME lpmmt, UINT cbmmt);
+extern midiStreamPosition_type midiStreamPosition_orig;
+typedef MMRESULT (WINAPI *midiStreamOut_type)( HMIDISTRM hms, LPMIDIHDR pmh, UINT cbmh);
+extern midiStreamOut_type midiStreamOut_orig;
+typedef MMRESULT (WINAPI *midiStreamPause_type)( HMIDISTRM hms);
+extern midiStreamPause_type midiStreamPause_orig;
+typedef MMRESULT (WINAPI *midiStreamRestart_type)( HMIDISTRM hms);
+extern midiStreamRestart_type midiStreamRestart_orig;
+typedef MMRESULT (WINAPI *midiStreamStop_type)( HMIDISTRM hms);
+extern midiStreamStop_type midiStreamStop_orig;
+typedef MMRESULT (WINAPI *midiConnect_type)( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved);
+extern midiConnect_type midiConnect_orig;
+typedef MMRESULT (WINAPI *midiDisconnect_type)( HMIDI hmi, HMIDIOUT hmo, LPVOID pReserved);
+extern midiDisconnect_type midiDisconnect_orig;
+typedef MMRESULT (WINAPI *midiOutGetDevCapsA_type)( UINT_PTR uDeviceID, LPMIDIOUTCAPSA pmoc, UINT cbmoc);
+extern midiOutGetDevCapsA_type midiOutGetDevCapsA_orig;
+typedef MMRESULT (WINAPI *midiOutGetDevCapsW_type)( UINT_PTR uDeviceID, LPMIDIOUTCAPSW pmoc, UINT cbmoc);
+extern midiOutGetDevCapsW_type midiOutGetDevCapsW_orig;
+typedef MMRESULT (WINAPI *midiOutGetVolume_type)( HMIDIOUT hmo, LPDWORD pdwVolume);
+extern midiOutGetVolume_type midiOutGetVolume_orig;
+typedef MMRESULT (WINAPI *midiOutSetVolume_type)( HMIDIOUT hmo, DWORD dwVolume);
+extern midiOutSetVolume_type midiOutSetVolume_orig;
+typedef MMRESULT (WINAPI *midiOutGetErrorTextA_type)( MMRESULT mmrError, LPSTR pszText, UINT cchText);
+extern midiOutGetErrorTextA_type midiOutGetErrorTextA_orig;
+typedef MMRESULT (WINAPI *midiOutGetErrorTextW_type)( MMRESULT mmrError, LPWSTR pszText, UINT cchText);
+extern midiOutGetErrorTextW_type midiOutGetErrorTextW_orig;
+typedef MMRESULT (WINAPI *midiOutOpen_type)( LPHMIDIOUT phmo, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen);
+extern midiOutOpen_type midiOutOpen_orig;
+typedef MMRESULT (WINAPI *midiOutClose_type)( HMIDIOUT hmo);
+extern midiOutClose_type midiOutClose_orig;
+typedef MMRESULT (WINAPI *midiOutPrepareHeader_type)( HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh);
+extern midiOutPrepareHeader_type midiOutPrepareHeader_orig;
+typedef MMRESULT (WINAPI *midiOutUnprepareHeader_type)(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh);
+extern midiOutUnprepareHeader_type midiOutUnprepareHeader_orig;
+typedef MMRESULT (WINAPI *midiOutShortMsg_type)( HMIDIOUT hmo, DWORD dwMsg);
+extern midiOutShortMsg_type midiOutShortMsg_orig;
+typedef MMRESULT (WINAPI *midiOutLongMsg_type)(HMIDIOUT hmo, LPMIDIHDR pmh, UINT cbmh);
+extern midiOutLongMsg_type midiOutLongMsg_orig;
+typedef MMRESULT (WINAPI *midiOutReset_type)( HMIDIOUT hmo);
+extern midiOutReset_type midiOutReset_orig;
+typedef MMRESULT (WINAPI *midiOutCachePatches_type)( HMIDIOUT hmo, UINT uBank, LPWORD pwpa, UINT fuCache);
+extern midiOutCachePatches_type midiOutCachePatches_orig;
+typedef MMRESULT (WINAPI *midiOutCacheDrumPatches_type)( HMIDIOUT hmo, UINT uPatch, LPWORD pwkya, UINT fuCache);
+extern midiOutCacheDrumPatches_type midiOutCacheDrumPatches_orig;
+typedef MMRESULT (WINAPI *midiOutGetID_type)( HMIDIOUT hmo, LPUINT puDeviceID);
+extern midiOutGetID_type midiOutGetID_orig;
+typedef MMRESULT (WINAPI *midiOutMessage_type)( HMIDIOUT hmo, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2);
+extern midiOutMessage_type midiOutMessage_orig;
+typedef UINT (WINAPI *midiInGetNumDevs_type)(void);
+extern midiInGetNumDevs_type midiInGetNumDevs_orig;
+typedef MMRESULT (WINAPI *midiInGetDevCapsA_type)( UINT_PTR uDeviceID, LPMIDIINCAPSA pmic, UINT cbmic);
+extern midiInGetDevCapsA_type midiInGetDevCapsA_orig;
+typedef MMRESULT (WINAPI *midiInGetDevCapsW_type)( UINT_PTR uDeviceID, LPMIDIINCAPSW pmic, UINT cbmic);
+extern midiInGetDevCapsW_type midiInGetDevCapsW_orig;
+typedef MMRESULT (WINAPI *midiInGetErrorTextA_type)( MMRESULT mmrError, LPSTR pszText, UINT cchText);
+extern midiInGetErrorTextA_type midiInGetErrorTextA_orig;
+typedef MMRESULT (WINAPI *midiInGetErrorTextW_type)( MMRESULT mmrError, LPWSTR pszText, UINT cchText);
+extern midiInGetErrorTextW_type midiInGetErrorTextW_orig;
+typedef MMRESULT (WINAPI *midiInOpen_type)( LPHMIDIIN phmi, UINT uDeviceID, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen);
+extern midiInOpen_type midiInOpen_orig;
+typedef MMRESULT (WINAPI *midiInClose_type)( HMIDIIN hmi);
+extern midiInClose_type midiInClose_orig;
+typedef MMRESULT (WINAPI *midiInPrepareHeader_type)( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh);
+extern midiInPrepareHeader_type midiInPrepareHeader_orig;
+typedef MMRESULT (WINAPI *midiInUnprepareHeader_type)( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh);
+extern midiInUnprepareHeader_type midiInUnprepareHeader_orig;
+typedef MMRESULT (WINAPI *midiInAddBuffer_type)( HMIDIIN hmi, LPMIDIHDR pmh, UINT cbmh);
+extern midiInAddBuffer_type midiInAddBuffer_orig;
+typedef MMRESULT (WINAPI *midiInStart_type)( HMIDIIN hmi);
+extern midiInStart_type midiInStart_orig;
+typedef MMRESULT (WINAPI *midiInStop_type)( HMIDIIN hmi);
+extern midiInStop_type midiInStop_orig;
+typedef MMRESULT (WINAPI *midiInReset_type)( HMIDIIN hmi);
+extern midiInReset_type midiInReset_orig;
+typedef MMRESULT (WINAPI *midiInGetID_type)( HMIDIIN hmi, LPUINT puDeviceID);
+extern midiInGetID_type midiInGetID_orig;
+typedef MMRESULT (WINAPI *midiInMessage_type)( HMIDIIN hmi, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2);
+extern midiInMessage_type midiInMessage_orig;
+typedef UINT (WINAPI *auxGetNumDevs_type)(void);
+extern auxGetNumDevs_type auxGetNumDevs_orig;
+typedef MMRESULT (WINAPI *auxGetDevCapsA_type)( UINT_PTR uDeviceID, LPAUXCAPSA pac, UINT cbac);
+extern auxGetDevCapsA_type auxGetDevCapsA_orig;
+typedef MMRESULT (WINAPI *auxGetDevCapsW_type)( UINT_PTR uDeviceID, LPAUXCAPSW pac, UINT cbac);
+extern auxGetDevCapsW_type auxGetDevCapsW_orig;
+typedef MMRESULT (WINAPI *auxSetVolume_type)( UINT uDeviceID, DWORD dwVolume);
+extern auxSetVolume_type auxSetVolume_orig;
+typedef MMRESULT (WINAPI *auxGetVolume_type)( UINT uDeviceID, LPDWORD pdwVolume);
+extern auxGetVolume_type auxGetVolume_orig;
+typedef MMRESULT (WINAPI *auxOutMessage_type)( UINT uDeviceID, UINT uMsg, DWORD_PTR dw1, DWORD_PTR dw2);
+extern auxOutMessage_type auxOutMessage_orig;
+typedef UINT (WINAPI *mixerGetNumDevs_type)(void);
+extern mixerGetNumDevs_type mixerGetNumDevs_orig;
+typedef MMRESULT (WINAPI *mixerGetDevCapsA_type)( UINT_PTR uMxId, LPMIXERCAPSA pmxcaps, UINT cbmxcaps);
+extern mixerGetDevCapsA_type mixerGetDevCapsA_orig;
+typedef MMRESULT (WINAPI *mixerGetDevCapsW_type)( UINT_PTR uMxId, LPMIXERCAPSW pmxcaps, UINT cbmxcaps);
+extern mixerGetDevCapsW_type mixerGetDevCapsW_orig;
+typedef MMRESULT (WINAPI *mixerOpen_type)( LPHMIXER phmx, UINT uMxId, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen);
+extern mixerOpen_type mixerOpen_orig;
+typedef MMRESULT (WINAPI *mixerClose_type)( HMIXER hmx);
+extern mixerClose_type mixerClose_orig;
+typedef DWORD (WINAPI *mixerMessage_type)( HMIXER hmx, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2);
+extern mixerMessage_type mixerMessage_orig;
+typedef MMRESULT (WINAPI *mixerGetLineInfoA_type)( HMIXEROBJ hmxobj, LPMIXERLINEA pmxl, DWORD fdwInfo);
+extern mixerGetLineInfoA_type mixerGetLineInfoA_orig;
+typedef MMRESULT (WINAPI *mixerGetLineInfoW_type)( HMIXEROBJ hmxobj, LPMIXERLINEW pmxl, DWORD fdwInfo);
+extern mixerGetLineInfoW_type mixerGetLineInfoW_orig;
+typedef MMRESULT (WINAPI *mixerGetID_type)( HMIXEROBJ hmxobj, UINT FAR *puMxId, DWORD fdwId);
+extern mixerGetID_type mixerGetID_orig;
+typedef MMRESULT (WINAPI *mixerGetLineControlsA_type)( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSA pmxlc, DWORD fdwControls);
+extern mixerGetLineControlsA_type mixerGetLineControlsA_orig;
+typedef MMRESULT (WINAPI *mixerGetLineControlsW_type)( HMIXEROBJ hmxobj, LPMIXERLINECONTROLSW pmxlc, DWORD fdwControls);
+extern mixerGetLineControlsW_type mixerGetLineControlsW_orig;
+typedef MMRESULT (WINAPI *mixerGetControlDetailsA_type)( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails);
+extern mixerGetControlDetailsA_type mixerGetControlDetailsA_orig;
+typedef MMRESULT (WINAPI *mixerGetControlDetailsW_type)( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails);
+extern mixerGetControlDetailsW_type mixerGetControlDetailsW_orig;
+typedef MMRESULT (WINAPI *mixerSetControlDetails_type)( HMIXEROBJ hmxobj, LPMIXERCONTROLDETAILS pmxcd, DWORD fdwDetails);
+extern mixerSetControlDetails_type mixerSetControlDetails_orig;
+typedef DWORD (WINAPI *mmGetCurrentTask_type)(void);
+extern mmGetCurrentTask_type mmGetCurrentTask_orig;
+typedef void (WINAPI *mmTaskBlock_type)(DWORD);
+extern mmTaskBlock_type mmTaskBlock_orig;
+typedef UINT (WINAPI *mmTaskCreate_type)(LPTASKCALLBACK, HANDLE*, DWORD_PTR);
+extern mmTaskCreate_type mmTaskCreate_orig;
+typedef BOOL (WINAPI *mmTaskSignal_type)(DWORD);
+extern mmTaskSignal_type mmTaskSignal_orig;
+typedef VOID (WINAPI *mmTaskYield_type)(VOID);
+extern mmTaskYield_type mmTaskYield_orig;
+typedef MMRESULT (WINAPI *timeGetSystemTime_type)( LPMMTIME pmmt, UINT cbmmt);
+extern timeGetSystemTime_type timeGetSystemTime_orig;
+typedef DWORD (WINAPI *timeGetTime_type)(void);
+extern timeGetTime_type timeGetTime_orig;
+typedef MMRESULT (WINAPI *timeSetEvent_type)( UINT uDelay, UINT uResolution, LPTIMECALLBACK fptc, DWORD_PTR dwUser, UINT fuEvent);
+extern timeSetEvent_type timeSetEvent_orig;
+typedef MMRESULT (WINAPI *timeKillEvent_type)( UINT uTimerID);
+extern timeKillEvent_type timeKillEvent_orig;
+typedef MMRESULT (WINAPI *timeGetDevCaps_type)( LPTIMECAPS ptc, UINT cbtc);
+extern timeGetDevCaps_type timeGetDevCaps_orig;
+typedef MMRESULT (WINAPI *timeBeginPeriod_type)( UINT uPeriod);
+extern timeBeginPeriod_type timeBeginPeriod_orig;
+typedef MMRESULT (WINAPI *timeEndPeriod_type)( UINT uPeriod);
+extern timeEndPeriod_type timeEndPeriod_orig;
+typedef UINT (WINAPI *joyGetNumDevs_type)(void);
+extern joyGetNumDevs_type joyGetNumDevs_orig;
+typedef MMRESULT (WINAPI *joyConfigChanged_type)(DWORD dwFlags);
+extern joyConfigChanged_type joyConfigChanged_orig;
+typedef MMRESULT (WINAPI *joyGetDevCapsA_type)( UINT_PTR uJoyID, LPJOYCAPSA pjc, UINT cbjc);
+extern joyGetDevCapsA_type joyGetDevCapsA_orig;
+typedef MMRESULT (WINAPI *joyGetDevCapsW_type)( UINT_PTR uJoyID, LPJOYCAPSW pjc, UINT cbjc);
+extern joyGetDevCapsW_type joyGetDevCapsW_orig;
+typedef MMRESULT (WINAPI *joyGetPos_type)( UINT uJoyID, LPJOYINFO pji);
+extern joyGetPos_type joyGetPos_orig;
+typedef MMRESULT (WINAPI *joyGetPosEx_type)( UINT uJoyID, LPJOYINFOEX pji);
+extern joyGetPosEx_type joyGetPosEx_orig;
+typedef MMRESULT (WINAPI *joyGetThreshold_type)( UINT uJoyID, LPUINT puThreshold);
+extern joyGetThreshold_type joyGetThreshold_orig;
+typedef MMRESULT (WINAPI *joyReleaseCapture_type)( UINT uJoyID);
+extern joyReleaseCapture_type joyReleaseCapture_orig;
+typedef MMRESULT (WINAPI *joySetCapture_type)( HWND hwnd, UINT uJoyID, UINT uPeriod, BOOL fChanged);
+extern joySetCapture_type joySetCapture_orig;
+typedef MMRESULT (WINAPI *joySetThreshold_type)( UINT uJoyID, UINT uThreshold);
+extern joySetThreshold_type joySetThreshold_orig;
+typedef BOOL (WINAPI *mciDriverNotify_type)(HWND hwndCallback, UINT uDeviceID, UINT uStatus);
+extern mciDriverNotify_type mciDriverNotify_orig;
+typedef UINT (WINAPI *mciDriverYield_type)(UINT uDeviceID);
+extern mciDriverYield_type mciDriverYield_orig;
+typedef FOURCC (WINAPI *mmioStringToFOURCCA_type)( LPCSTR sz, UINT uFlags);
+extern mmioStringToFOURCCA_type mmioStringToFOURCCA_orig;
+typedef FOURCC (WINAPI *mmioStringToFOURCCW_type)( LPCWSTR sz, UINT uFlags);
+extern mmioStringToFOURCCW_type mmioStringToFOURCCW_orig;
+typedef LPMMIOPROC (WINAPI *mmioInstallIOProcA_type)( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags);
+extern mmioInstallIOProcA_type mmioInstallIOProcA_orig;
+typedef LPMMIOPROC (WINAPI *mmioInstallIOProcW_type)( FOURCC fccIOProc, LPMMIOPROC pIOProc, DWORD dwFlags);
+extern mmioInstallIOProcW_type mmioInstallIOProcW_orig;
+typedef HMMIO (WINAPI *mmioOpenA_type)( LPSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen);
+extern mmioOpenA_type mmioOpenA_orig;
+typedef HMMIO (WINAPI *mmioOpenW_type)( LPWSTR pszFileName, LPMMIOINFO pmmioinfo, DWORD fdwOpen);
+extern mmioOpenW_type mmioOpenW_orig;
+typedef MMRESULT (WINAPI *mmioRenameA_type)( LPCSTR pszFileName, LPCSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename);
+extern mmioRenameA_type mmioRenameA_orig;
+typedef MMRESULT (WINAPI *mmioRenameW_type)( LPCWSTR pszFileName, LPCWSTR pszNewFileName, LPCMMIOINFO pmmioinfo, DWORD fdwRename);
+extern mmioRenameW_type mmioRenameW_orig;
+typedef MMRESULT (WINAPI *mmioClose_type)( HMMIO hmmio, UINT fuClose);
+extern mmioClose_type mmioClose_orig;
+typedef LONG (WINAPI *mmioRead_type)( HMMIO hmmio, HPSTR pch, LONG cch);
+extern mmioRead_type mmioRead_orig;
+typedef LONG (WINAPI *mmioWrite_type)( HMMIO hmmio, const char _huge* pch, LONG cch);
+extern mmioWrite_type mmioWrite_orig;
+typedef LONG (WINAPI *mmioSeek_type)( HMMIO hmmio, LONG lOffset, int iOrigin);
+extern mmioSeek_type mmioSeek_orig;
+typedef MMRESULT (WINAPI *mmioGetInfo_type)( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuInfo);
+extern mmioGetInfo_type mmioGetInfo_orig;
+typedef MMRESULT (WINAPI *mmioSetInfo_type)( HMMIO hmmio, LPCMMIOINFO pmmioinfo, UINT fuInfo);
+extern mmioSetInfo_type mmioSetInfo_orig;
+typedef MMRESULT (WINAPI *mmioSetBuffer_type)( HMMIO hmmio, LPSTR pchBuffer, LONG cchBuffer, UINT fuBuffer);
+extern mmioSetBuffer_type mmioSetBuffer_orig;
+typedef MMRESULT (WINAPI *mmioFlush_type)( HMMIO hmmio, UINT fuFlush);
+extern mmioFlush_type mmioFlush_orig;
+typedef MMRESULT (WINAPI *mmioAdvance_type)( HMMIO hmmio, LPMMIOINFO pmmioinfo, UINT fuAdvance);
+extern mmioAdvance_type mmioAdvance_orig;
+typedef LRESULT (WINAPI *mmioSendMessage_type)( HMMIO hmmio, UINT uMsg, LPARAM lParam1, LPARAM lParam2);
+extern mmioSendMessage_type mmioSendMessage_orig;
+typedef MMRESULT (WINAPI *mmioDescend_type)( HMMIO hmmio, LPMMCKINFO pmmcki, const MMCKINFO FAR* pmmckiParent, UINT fuDescend);
+extern mmioDescend_type mmioDescend_orig;
+typedef MMRESULT (WINAPI *mmioAscend_type)( HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuAscend);
+extern mmioAscend_type mmioAscend_orig;
+typedef MMRESULT (WINAPI *mmioCreateChunk_type)(HMMIO hmmio, LPMMCKINFO pmmcki, UINT fuCreate);
+extern mmioCreateChunk_type mmioCreateChunk_orig;
+typedef MCIERROR (WINAPI *mciSendCommandA_type)( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2);
+extern mciSendCommandA_type mciSendCommandA_orig;
+typedef MCIERROR (WINAPI *mciSendCommandW_type)( MCIDEVICEID mciId, UINT uMsg, DWORD_PTR dwParam1, DWORD_PTR dwParam2);
+extern mciSendCommandW_type mciSendCommandW_orig;
+typedef MCIERROR (WINAPI *mciSendStringA_type)( LPCSTR lpstrCommand, LPSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback);
+extern mciSendStringA_type mciSendStringA_orig;
+typedef MCIERROR (WINAPI *mciSendStringW_type)( LPCWSTR lpstrCommand, LPWSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback);
+extern mciSendStringW_type mciSendStringW_orig;
+typedef MCIDEVICEID (WINAPI *mciGetDeviceIDA_type)( LPCSTR pszDevice);
+extern mciGetDeviceIDA_type mciGetDeviceIDA_orig;
+typedef MCIDEVICEID (WINAPI *mciGetDeviceIDW_type)( LPCWSTR pszDevice);
+extern mciGetDeviceIDW_type mciGetDeviceIDW_orig;
+typedef MCIDEVICEID (WINAPI *mciGetDeviceIDFromElementIDA_type)( DWORD dwElementID, LPCSTR lpstrType );
+extern mciGetDeviceIDFromElementIDA_type mciGetDeviceIDFromElementIDA_orig;
+typedef MCIDEVICEID (WINAPI *mciGetDeviceIDFromElementIDW_type)( DWORD dwElementID, LPCWSTR lpstrType );
+extern mciGetDeviceIDFromElementIDW_type mciGetDeviceIDFromElementIDW_orig;
+typedef DWORD_PTR (WINAPI *mciGetDriverData_type)(UINT uDeviceID);
+extern mciGetDriverData_type mciGetDriverData_orig;
+typedef BOOL (WINAPI *mciGetErrorStringA_type)( MCIERROR mcierr, LPSTR pszText, UINT cchText);
+extern mciGetErrorStringA_type mciGetErrorStringA_orig;
+typedef BOOL (WINAPI *mciGetErrorStringW_type)( MCIERROR mcierr, LPWSTR pszText, UINT cchText);
+extern mciGetErrorStringW_type mciGetErrorStringW_orig;
+typedef BOOL (WINAPI *mciSetDriverData_type)(UINT uDeviceID, DWORD_PTR dwData);
+extern mciSetDriverData_type mciSetDriverData_orig;
+typedef BOOL (WINAPI *mciSetYieldProc_type)( MCIDEVICEID mciId, YIELDPROC fpYieldProc, DWORD dwYieldData);
+extern mciSetYieldProc_type mciSetYieldProc_orig;
+typedef BOOL (WINAPI *mciFreeCommandResource_type)(UINT uTable);
+extern mciFreeCommandResource_type mciFreeCommandResource_orig;
+typedef HTASK (WINAPI *mciGetCreatorTask_type)( MCIDEVICEID mciId);
+extern mciGetCreatorTask_type mciGetCreatorTask_orig;
+typedef YIELDPROC (WINAPI *mciGetYieldProc_type)( MCIDEVICEID mciId, LPDWORD pdwYieldData);
+extern mciGetYieldProc_type mciGetYieldProc_orig;
+typedef UINT (WINAPI *mciLoadCommandResource_type)(HINSTANCE hInstance, LPCWSTR lpResName, UINT uType);
+extern mciLoadCommandResource_type mciLoadCommandResource_orig;
+typedef BOOL (WINAPI *mciExecute_type)(LPCSTR pszCommand);
+extern mciExecute_type mciExecute_orig;
diff --git a/indra/media_plugins/winmmshim/winmm.def b/indra/media_plugins/winmmshim/winmm.def
new file mode 100644
index 0000000000..c55a2845f8
--- /dev/null
+++ b/indra/media_plugins/winmmshim/winmm.def
@@ -0,0 +1,218 @@
+;
+; winmm.def
+;
+; Exports for WINMM DLL
+;
+
+LIBRARY WINMM
+EXPORTS
+CloseDriver
+DefDriverProc
+DriverCallback
+DrvGetModuleHandle
+GetDriverModuleHandle
+;MigrateAllDrivers
+;MigrateSoundEvents
+;NotifyCallbackData
+OpenDriver
+;PlaySound
+PlaySoundA
+PlaySoundW
+SendDriverMessage
+;WOW32DriverCallback
+;WOW32ResolveMultiMediaHandle
+;WOWAppExit
+;WinmmLogoff
+;WinmmLogon
+;aux32Message
+auxGetDevCapsA
+auxGetDevCapsW
+auxGetNumDevs
+auxGetVolume
+auxOutMessage
+auxSetVolume
+;gfxAddGfx
+;gfxBatchChange
+;gfxCreateGfxFactoriesList
+;gfxCreateZoneFactoriesList
+;gfxDestroyDeviceInterfaceList
+;gfxEnumerateGfxs
+;gfxLogoff
+;gfxLogon
+;gfxModifyGfx
+;gfxOpenGfx
+;gfxRemoveGfx
+;joy32Message
+joyConfigChanged
+joyGetDevCapsA
+joyGetDevCapsW
+joyGetNumDevs
+joyGetPos
+joyGetPosEx
+joyGetThreshold
+joyReleaseCapture
+joySetCapture
+joySetThreshold
+;mci32Message
+mciDriverNotify
+mciDriverYield
+mciExecute
+mciFreeCommandResource
+mciGetCreatorTask
+mciGetDeviceIDA
+mciGetDeviceIDFromElementIDA
+mciGetDeviceIDFromElementIDW
+mciGetDeviceIDW
+mciGetDriverData
+mciGetErrorStringA
+mciGetErrorStringW
+mciGetYieldProc
+mciLoadCommandResource
+mciSendCommandA
+mciSendCommandW
+mciSendStringA
+mciSendStringW
+mciSetDriverData
+mciSetYieldProc
+;mid32Message
+midiConnect
+midiDisconnect
+midiInAddBuffer
+midiInClose
+midiInGetDevCapsA
+midiInGetDevCapsW
+midiInGetErrorTextA
+midiInGetErrorTextW
+midiInGetID
+midiInGetNumDevs
+midiInMessage
+midiInOpen
+midiInPrepareHeader
+midiInReset
+midiInStart
+midiInStop
+midiInUnprepareHeader
+midiOutCacheDrumPatches
+midiOutCachePatches
+midiOutClose
+midiOutGetDevCapsA
+midiOutGetDevCapsW
+midiOutGetErrorTextA
+midiOutGetErrorTextW
+midiOutGetID
+midiOutGetNumDevs
+midiOutGetVolume
+midiOutLongMsg
+midiOutMessage
+midiOutOpen
+midiOutPrepareHeader
+midiOutReset
+midiOutSetVolume
+midiOutShortMsg
+midiOutUnprepareHeader
+midiStreamClose
+midiStreamOpen
+midiStreamOut
+midiStreamPause
+midiStreamPosition
+midiStreamProperty
+midiStreamRestart
+midiStreamStop
+mixerClose
+mixerGetControlDetailsA
+mixerGetControlDetailsW
+mixerGetDevCapsA
+mixerGetDevCapsW
+mixerGetID
+mixerGetLineControlsA
+mixerGetLineControlsW
+mixerGetLineInfoA
+mixerGetLineInfoW
+mixerGetNumDevs
+mixerMessage
+mixerOpen
+mixerSetControlDetails
+;mmDrvInstall
+mmGetCurrentTask
+mmTaskBlock
+mmTaskCreate
+mmTaskSignal
+mmTaskYield
+mmioAdvance
+mmioAscend
+mmioClose
+mmioCreateChunk
+mmioDescend
+mmioFlush
+mmioGetInfo
+mmioInstallIOProcA
+mmioInstallIOProcW
+mmioOpenA
+mmioOpenW
+mmioRead
+mmioRenameA
+mmioRenameW
+mmioSeek
+mmioSendMessage
+mmioSetBuffer
+mmioSetInfo
+mmioStringToFOURCCA
+mmioStringToFOURCCW
+mmioWrite
+mmsystemGetVersion
+;mod32Message
+;mxd32Message
+sndPlaySoundA
+sndPlaySoundW
+;tid32Message
+timeBeginPeriod
+timeEndPeriod
+timeGetDevCaps
+timeGetSystemTime
+timeGetTime
+timeKillEvent
+timeSetEvent
+waveInAddBuffer
+waveInClose
+waveInGetDevCapsA
+waveInGetDevCapsW
+waveInGetErrorTextA
+waveInGetErrorTextW
+waveInGetID
+waveInGetNumDevs
+waveInGetPosition
+waveInMessage
+waveInOpen
+waveInPrepareHeader
+waveInReset
+waveInStart
+waveInStop
+waveInUnprepareHeader
+waveOutBreakLoop
+waveOutClose
+waveOutGetDevCapsA
+waveOutGetDevCapsW
+waveOutGetErrorTextA
+waveOutGetErrorTextW
+waveOutGetID
+waveOutGetNumDevs
+waveOutGetPitch
+waveOutGetPlaybackRate
+waveOutGetPosition
+waveOutGetVolume
+waveOutMessage
+waveOutOpen
+waveOutPause
+waveOutPrepareHeader
+waveOutReset
+waveOutRestart
+waveOutSetPitch
+waveOutSetPlaybackRate
+waveOutSetVolume
+waveOutUnprepareHeader
+waveOutWrite
+;wid32Message
+;winmmSetDebugLevel
+;wod32Message
+setPluginVolume
+setPluginMute \ No newline at end of file
diff --git a/indra/media_plugins/winmmshim/winmm_shim.cpp b/indra/media_plugins/winmmshim/winmm_shim.cpp
new file mode 100644
index 0000000000..6fbf517d7c
--- /dev/null
+++ b/indra/media_plugins/winmmshim/winmm_shim.cpp
@@ -0,0 +1,194 @@
+/**
+ * @file winmmshim.cpp
+ * @brief controls volume level of process by intercepting calls to winmm.dll
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+#include "forwarding_api.h"
+#include <xmmintrin.h>
+#include <map>
+#include <math.h>
+
+using std::wstring;
+
+static float sVolumeLevel = 1.f;
+static bool sMute = false;
+
+BOOL APIENTRY DllMain( HMODULE hModule,
+ DWORD ul_reason_for_call,
+ LPVOID lpReserved
+ )
+{
+ static bool initialized = false;
+ // do this only once
+ if (!initialized)
+ { // bind to original winmm.dll
+ TCHAR system_path[MAX_PATH];
+ TCHAR dll_path[MAX_PATH];
+ ::GetSystemDirectory(system_path, MAX_PATH);
+
+ // grab winmm.dll from system path, where it should live
+ wsprintf(dll_path, "%s\\winmm.dll", system_path);
+ HMODULE winmm_handle = ::LoadLibrary(dll_path);
+
+ if (winmm_handle != NULL)
+ { // we have a dll, let's get out pointers!
+ initialized = true;
+ init_function_pointers(winmm_handle);
+ return true;
+ }
+
+ // failed to initialize real winmm.dll
+ return false;
+ }
+ return true;
+}
+
+
+extern "C"
+{
+ // tracks the requested format for a given waveout buffer
+ struct WaveOutFormat
+ {
+ WaveOutFormat(int bits_per_sample)
+ : mBitsPerSample(bits_per_sample)
+ {}
+ int mBitsPerSample;
+ };
+ typedef std::map<HWAVEOUT, WaveOutFormat*> wave_out_map_t;
+ static wave_out_map_t sWaveOuts;
+
+ MMRESULT WINAPI waveOutOpen( LPHWAVEOUT phwo, UINT uDeviceID, LPCWAVEFORMATEX pwfx, DWORD_PTR dwCallback, DWORD_PTR dwInstance, DWORD fdwOpen)
+ {
+ if (pwfx->wFormatTag != WAVE_FORMAT_PCM
+ || (pwfx->wBitsPerSample != 8 && pwfx->wBitsPerSample != 16))
+ { // uncompressed 8 and 16 bit sound are the only types we support
+ return WAVERR_BADFORMAT;
+ }
+
+ MMRESULT result = waveOutOpen_orig(phwo, uDeviceID, pwfx, dwCallback, dwInstance, fdwOpen);
+ if (result == MMSYSERR_NOERROR
+ && ((fdwOpen & WAVE_FORMAT_QUERY) == 0)) // not just querying for format support
+ { // remember the requested bits per sample, and associate with the given handle
+ WaveOutFormat* wave_outp = new WaveOutFormat(pwfx->wBitsPerSample);
+ sWaveOuts.insert(std::make_pair(*phwo, wave_outp));
+ }
+ return result;
+ }
+
+ MMRESULT WINAPI waveOutClose( HWAVEOUT hwo)
+ {
+ wave_out_map_t::iterator found_it = sWaveOuts.find(hwo);
+ if (found_it != sWaveOuts.end())
+ { // forget what we know about this handle
+ delete found_it->second;
+ sWaveOuts.erase(found_it);
+ }
+ return waveOutClose_orig( hwo);
+ }
+
+ MMRESULT WINAPI waveOutWrite( HWAVEOUT hwo, LPWAVEHDR pwh, UINT cbwh)
+ {
+ MMRESULT result = MMSYSERR_NOERROR;
+
+ if (sMute)
+ { // zero out the audio buffer when muted
+ memset(pwh->lpData, 0, pwh->dwBufferLength);
+ }
+ else if (sVolumeLevel != 1.f)
+ { // need to apply volume level
+ wave_out_map_t::iterator found_it = sWaveOuts.find(hwo);
+ if (found_it != sWaveOuts.end())
+ {
+ WaveOutFormat* formatp = found_it->second;
+ switch (formatp->mBitsPerSample){
+ case 8:
+ {
+ char volume = (char)(sVolumeLevel * 127.f);
+ for (unsigned int i = 0; i < pwh->dwBufferLength; i++)
+ {
+ // unsigned multiply doesn't use most significant bit, so shift by 7 bits
+ // to get resulting value back into 8 bits
+ pwh->lpData[i] = (pwh->lpData[i] * volume) >> 7;
+ }
+ break;
+ }
+ case 16:
+ {
+ short volume_16 = (short)(sVolumeLevel * 32767.f);
+
+ // copy volume level 4 times into 64 bit MMX register
+ __m64 volume_64 = _mm_set_pi16(volume_16, volume_16, volume_16, volume_16);
+ __m64* sample_64;
+ __m64* last_sample_64 = (__m64*)(pwh->lpData + pwh->dwBufferLength - sizeof(__m64));
+ // for everything that can be addressed in 64 bit multiples...
+ for (sample_64 = (__m64*)pwh->lpData;
+ sample_64 <= last_sample_64;
+ ++sample_64)
+ {
+ //...multiply the samples by the volume...
+ __m64 scaled_sample = _mm_mulhi_pi16(*sample_64, volume_64);
+ // ...and shift left 1 bit since an unsigned multiple loses the most significant bit
+ // 0x7FFF * 0x7FFF = 0x3fff0001
+ // 0x3fff0001 << 1 = 0x7ffe0002
+ // notice that the LSB is always 0...should consider dithering
+ *sample_64 = _mm_slli_pi16(scaled_sample, 1);
+ }
+
+ // the captain has turned off the MMX sign, you are now free to use floating point registers
+ _mm_empty();
+
+ // finish remaining samples that didn't fit into 64 bit register
+ for (short* sample_16 = (short*)sample_64;
+ sample_16 < (short*)(pwh->lpData + pwh->dwBufferLength);
+ ++sample_16)
+ {
+ *sample_16 = (*sample_16 * volume_16) >> 15;
+ }
+
+ break;
+ }
+ default:
+ // don't do anything
+ break;
+ }
+ }
+ }
+ return waveOutWrite_orig( hwo, pwh, cbwh);
+ }
+
+ void WINAPI setPluginVolume(float volume)
+ {
+ sVolumeLevel = volume;
+ }
+
+ void WINAPI setPluginMute(bool mute)
+ {
+ sMute = mute;
+ }
+}
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index cd7c002096..24811db3cb 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -7,6 +7,7 @@ include(Boost)
include(BuildVersion)
include(DBusGlib)
include(DirectX)
+include(OpenSSL)
include(DragDrop)
include(ELFIO)
include(FMOD)
@@ -66,6 +67,7 @@ include_directories(
set(viewer_SOURCE_FILES
llagent.cpp
llagentaccess.cpp
+ llagentcamera.cpp
llagentdata.cpp
llagentlanguage.cpp
llagentlistener.cpp
@@ -73,6 +75,7 @@ set(viewer_SOURCE_FILES
llagentpilot.cpp
llagentui.cpp
llagentwearables.cpp
+ llagentwearablesfetch.cpp
llanimstatelabels.cpp
llappearancemgr.cpp
llappviewer.cpp
@@ -88,6 +91,7 @@ set(viewer_SOURCE_FILES
llbottomtray.cpp
llbox.cpp
llbreadcrumbview.cpp
+ llbuycurrencyhtml.cpp
llcallbacklist.cpp
llcallfloater.cpp
llcallingcard.cpp
@@ -102,6 +106,7 @@ set(viewer_SOURCE_FILES
llclassifiedinfo.cpp
llclassifiedstatsresponder.cpp
llcloud.cpp
+ llcofwearables.cpp
llcolorswatch.cpp
llcommanddispatcherlistener.cpp
llcommandhandler.cpp
@@ -140,10 +145,10 @@ set(viewer_SOURCE_FILES
llfavoritesbar.cpp
llfeaturemanager.cpp
llfilepicker.cpp
+ llfilteredwearablelist.cpp
llfirstuse.cpp
llflexibleobject.cpp
llfloaterabout.cpp
- llfloateractivespeakers.cpp
llfloateranimpreview.cpp
llfloaterauction.cpp
llfloateravatarpicker.cpp
@@ -155,12 +160,13 @@ set(viewer_SOURCE_FILES
llfloaterbuy.cpp
llfloaterbuycontents.cpp
llfloaterbuycurrency.cpp
+ llfloaterbuycurrencyhtml.cpp
llfloaterbuyland.cpp
llfloatercamera.cpp
llfloatercolorpicker.cpp
- llfloatercustomize.cpp
llfloaterdaycycle.cpp
llfloaterenvsettings.cpp
+ llfloaterevent.cpp
llfloaterfonttest.cpp
llfloatergesture.cpp
llfloatergodtools.cpp
@@ -182,7 +188,6 @@ set(viewer_SOURCE_FILES
llfloatermediasettings.cpp
llfloatermemleak.cpp
llfloaternamedesc.cpp
- llfloaternearbymedia.cpp
llfloaternotificationsconsole.cpp
llfloateropenobject.cpp
llfloaterparcel.cpp
@@ -210,6 +215,7 @@ set(viewer_SOURCE_FILES
llfloaterurldisplay.cpp
llfloaterurlentry.cpp
llfloatervoicedevicesettings.cpp
+ llfloatervoiceeffect.cpp
llfloaterwater.cpp
llfloaterwhitelistentry.cpp
llfloaterwindlight.cpp
@@ -220,6 +226,7 @@ set(viewer_SOURCE_FILES
llfollowcam.cpp
llfriendcard.cpp
llgesturemgr.cpp
+ llgiveinventory.cpp
llglsandbox.cpp
llgroupactions.cpp
llgroupiconctrl.cpp
@@ -251,13 +258,17 @@ set(viewer_SOURCE_FILES
llinventoryclipboard.cpp
llinventoryfilter.cpp
llinventoryfunctions.cpp
+ llinventoryicon.cpp
+ llinventoryitemslist.cpp
llinventorymodel.cpp
+ llinventorymodelbackgroundfetch.cpp
llinventoryobserver.cpp
llinventorypanel.cpp
lljoystickbutton.cpp
lllandmarkactions.cpp
lllandmarklist.cpp
lllistbrowser.cpp
+ lllistcontextmenu.cpp
lllistview.cpp
lllocaltextureobject.cpp
lllocationhistory.cpp
@@ -265,6 +276,7 @@ set(viewer_SOURCE_FILES
lllogchat.cpp
llloginhandler.cpp
lllogininstance.cpp
+ llmachineid.cpp
llmanip.cpp
llmaniprotate.cpp
llmanipscale.cpp
@@ -292,7 +304,10 @@ set(viewer_SOURCE_FILES
llnotificationmanager.cpp
llnotificationofferhandler.cpp
llnotificationscripthandler.cpp
+ llnotificationstorage.cpp
llnotificationtiphandler.cpp
+ lloutfitslist.cpp
+ lloutfitobserver.cpp
lloutputmonitorctrl.cpp
llpanelavatar.cpp
llpanelavatartag.cpp
@@ -300,8 +315,8 @@ set(viewer_SOURCE_FILES
llpanelclassified.cpp
llpanelcontents.cpp
llpaneleditwearable.cpp
- llpanelevent.cpp
llpanelface.cpp
+ llpanelgenerictip.cpp
llpanelgroup.cpp
llpanelgroupgeneral.cpp
llpanelgroupinvite.cpp
@@ -317,14 +332,16 @@ set(viewer_SOURCE_FILES
llpanellandmedia.cpp
llpanellogin.cpp
llpanelloginlistener.cpp
- llpanellookinfo.cpp
llpanelmaininventory.cpp
llpanelmediasettingsgeneral.cpp
llpanelmediasettingspermissions.cpp
llpanelmediasettingssecurity.cpp
llpanelme.cpp
+ llpanelnearbymedia.cpp
llpanelobject.cpp
llpanelobjectinventory.cpp
+ llpanelonlinestatus.cpp
+ llpaneloutfitedit.cpp
llpaneloutfitsinventory.cpp
llpanelpeople.cpp
llpanelpeoplemenus.cpp
@@ -340,6 +357,9 @@ set(viewer_SOURCE_FILES
llpanelprofile.cpp
llpanelprofileview.cpp
llpanelteleporthistory.cpp
+ llpaneltiptoast.cpp
+ llpanelvoiceeffect.cpp
+ llpaneltopinfobar.cpp
llpanelvolume.cpp
llpanelvolumepulldown.cpp
llparcelselection.cpp
@@ -347,6 +367,7 @@ set(viewer_SOURCE_FILES
llpatchvertexarray.cpp
llplacesinventorybridge.cpp
llplacesinventorypanel.cpp
+ llpopupview.cpp
llpolymesh.cpp
llpolymorph.cpp
llpreview.cpp
@@ -362,11 +383,14 @@ set(viewer_SOURCE_FILES
llregionposition.cpp
llremoteparcelrequest.cpp
llsavedsettingsglue.cpp
+ llsaveoutfitcombobtn.cpp
llscreenchannel.cpp
llscriptfloater.cpp
llscrollingpanelparam.cpp
llsearchcombobox.cpp
llsearchhistory.cpp
+ llsecapi.cpp
+ llsechandler_basic.cpp
llselectmgr.cpp
llsidepanelappearance.cpp
llsidepanelinventory.cpp
@@ -406,7 +430,6 @@ set(viewer_SOURCE_FILES
lltexturestats.cpp
lltexturestatsuploader.cpp
lltextureview.cpp
- lltextutil.cpp
lltoast.cpp
lltoastalertpanel.cpp
lltoastgroupnotifypanel.cpp
@@ -441,13 +464,13 @@ set(viewer_SOURCE_FILES
llurldispatcherlistener.cpp
llurlhistory.cpp
llurllineeditorctrl.cpp
- llurlsimstring.cpp
llurlwhitelist.cpp
llvectorperfoptions.cpp
llversioninfo.cpp
llviewchildren.cpp
llviewerassetstorage.cpp
llviewerassettype.cpp
+ llviewerattachmenu.cpp
llvieweraudio.cpp
llviewercamera.cpp
llviewerchat.cpp
@@ -509,6 +532,7 @@ set(viewer_SOURCE_FILES
llvoicechannel.cpp
llvoiceclient.cpp
llvoicevisualizer.cpp
+ llvoicevivox.cpp
llvoinventorylistener.cpp
llvopartgroup.cpp
llvosky.cpp
@@ -522,8 +546,9 @@ set(viewer_SOURCE_FILES
llwaterparammanager.cpp
llwaterparamset.cpp
llwearable.cpp
- llwearabledictionary.cpp
+ llwearableitemslist.cpp
llwearablelist.cpp
+ llwearabletype.cpp
llweb.cpp
llwind.cpp
llwlanimator.cpp
@@ -563,6 +588,7 @@ set(viewer_HEADER_FILES
ViewerInstall.cmake
llagent.h
llagentaccess.h
+ llagentcamera.h
llagentdata.h
llagentlanguage.h
llagentlistener.h
@@ -570,6 +596,7 @@ set(viewer_HEADER_FILES
llagentpilot.h
llagentui.h
llagentwearables.h
+ llagentwearablesfetch.h
llanimstatelabels.h
llappearance.h
llappearancemgr.h
@@ -586,6 +613,7 @@ set(viewer_HEADER_FILES
llbottomtray.h
llbox.h
llbreadcrumbview.h
+ llbuycurrencyhtml.h
llcallbacklist.h
llcallfloater.h
llcallingcard.h
@@ -601,6 +629,7 @@ set(viewer_HEADER_FILES
llclassifiedinfo.h
llclassifiedstatsresponder.h
llcloud.h
+ llcofwearables.h
llcolorswatch.h
llcommanddispatcherlistener.h
llcommandhandler.h
@@ -640,10 +669,10 @@ set(viewer_HEADER_FILES
llfavoritesbar.h
llfeaturemanager.h
llfilepicker.h
+ llfilteredwearablelist.h
llfirstuse.h
llflexibleobject.h
llfloaterabout.h
- llfloateractivespeakers.h
llfloateranimpreview.h
llfloaterauction.h
llfloateravatarpicker.h
@@ -655,12 +684,13 @@ set(viewer_HEADER_FILES
llfloaterbuy.h
llfloaterbuycontents.h
llfloaterbuycurrency.h
+ llfloaterbuycurrencyhtml.h
llfloaterbuyland.h
llfloatercamera.h
llfloatercolorpicker.h
- llfloatercustomize.h
llfloaterdaycycle.h
llfloaterenvsettings.h
+ llfloaterevent.h
llfloaterfonttest.h
llfloatergesture.h
llfloatergodtools.h
@@ -682,7 +712,6 @@ set(viewer_HEADER_FILES
llfloatermediasettings.h
llfloatermemleak.h
llfloaternamedesc.h
- llfloaternearbymedia.h
llfloaternotificationsconsole.h
llfloateropenobject.h
llfloaterparcel.h
@@ -710,6 +739,7 @@ set(viewer_HEADER_FILES
llfloaterurldisplay.h
llfloaterurlentry.h
llfloatervoicedevicesettings.h
+ llfloatervoiceeffect.h
llfloaterwater.h
llfloaterwhitelistentry.h
llfloaterwindlight.h
@@ -721,6 +751,7 @@ set(viewer_HEADER_FILES
llfollowcam.h
llfriendcard.h
llgesturemgr.h
+ llgiveinventory.h
llgroupactions.h
llgroupiconctrl.h
llgrouplist.h
@@ -750,7 +781,10 @@ set(viewer_HEADER_FILES
llinventoryclipboard.h
llinventoryfilter.h
llinventoryfunctions.h
+ llinventoryicon.h
+ llinventoryitemslist.h
llinventorymodel.h
+ llinventorymodelbackgroundfetch.h
llinventoryobserver.h
llinventorypanel.h
lljoystickbutton.h
@@ -758,6 +792,7 @@ set(viewer_HEADER_FILES
lllandmarklist.h
lllightconstants.h
lllistbrowser.h
+ lllistcontextmenu.h
lllistview.h
lllocaltextureobject.h
lllocationhistory.h
@@ -765,6 +800,7 @@ set(viewer_HEADER_FILES
lllogchat.h
llloginhandler.h
lllogininstance.h
+ llmachineid.h
llmanip.h
llmaniprotate.h
llmanipscale.h
@@ -788,6 +824,9 @@ set(viewer_HEADER_FILES
llnetmap.h
llnotificationhandler.h
llnotificationmanager.h
+ llnotificationstorage.h
+ lloutfitslist.h
+ lloutfitobserver.h
lloutputmonitorctrl.h
llpanelavatar.h
llpanelavatartag.h
@@ -795,8 +834,8 @@ set(viewer_HEADER_FILES
llpanelclassified.h
llpanelcontents.h
llpaneleditwearable.h
- llpanelevent.h
llpanelface.h
+ llpanelgenerictip.h
llpanelgroup.h
llpanelgroupgeneral.h
llpanelgroupinvite.h
@@ -812,14 +851,16 @@ set(viewer_HEADER_FILES
llpanellandmedia.h
llpanellogin.h
llpanelloginlistener.h
- llpanellookinfo.h
llpanelmaininventory.h
llpanelmediasettingsgeneral.h
llpanelmediasettingspermissions.h
llpanelmediasettingssecurity.h
llpanelme.h
+ llpanelnearbymedia.h
llpanelobject.h
llpanelobjectinventory.h
+ llpanelonlinestatus.h
+ llpaneloutfitedit.h
llpaneloutfitsinventory.h
llpanelpeople.h
llpanelpeoplemenus.h
@@ -835,6 +876,9 @@ set(viewer_HEADER_FILES
llpanelprofile.h
llpanelprofileview.h
llpanelteleporthistory.h
+ llpaneltiptoast.h
+ llpanelvoiceeffect.h
+ llpaneltopinfobar.h
llpanelvolume.h
llpanelvolumepulldown.h
llparcelselection.h
@@ -844,6 +888,7 @@ set(viewer_HEADER_FILES
llplacesinventorypanel.h
llpolymesh.h
llpolymorph.h
+ llpopupview.h
llpreview.h
llpreviewanim.h
llpreviewgesture.h
@@ -859,11 +904,14 @@ set(viewer_HEADER_FILES
llresourcedata.h
llrootview.h
llsavedsettingsglue.h
+ llsaveoutfitcombobtn.h
llscreenchannel.h
llscriptfloater.h
llscrollingpanelparam.h
llsearchcombobox.h
llsearchhistory.h
+ llsecapi.h
+ llsechandler_basic.h
llselectmgr.h
llsidepanelappearance.h
llsidepanelinventory.h
@@ -904,7 +952,6 @@ set(viewer_HEADER_FILES
lltexturestats.h
lltexturestatsuploader.h
lltextureview.h
- lltextutil.h
lltoast.h
lltoastalertpanel.h
lltoastgroupnotifypanel.h
@@ -940,13 +987,13 @@ set(viewer_HEADER_FILES
llurldispatcherlistener.h
llurlhistory.h
llurllineeditorctrl.h
- llurlsimstring.h
llurlwhitelist.h
llvectorperfoptions.h
llversioninfo.h
llviewchildren.h
llviewerassetstorage.h
llviewerassettype.h
+ llviewerattachmenu.h
llvieweraudio.h
llviewercamera.h
llviewerchat.h
@@ -1005,6 +1052,7 @@ set(viewer_HEADER_FILES
llvoicechannel.h
llvoiceclient.h
llvoicevisualizer.h
+ llvoicevivox.h
llvoinventorylistener.h
llvopartgroup.h
llvosky.h
@@ -1019,11 +1067,11 @@ set(viewer_HEADER_FILES
llwaterparammanager.h
llwaterparamset.h
llwearable.h
- llwearabledictionary.h
+ llwearableitemslist.h
llwearablelist.h
+ llwearabletype.h
llweb.h
llwind.h
- llwindebug.h
llwlanimator.h
llwldaycycle.h
llwlparammanager.h
@@ -1097,12 +1145,10 @@ endif (LINUX)
if (WINDOWS)
list(APPEND viewer_SOURCE_FILES
llappviewerwin32.cpp
- llwindebug.cpp
)
list(APPEND viewer_HEADER_FILES
llappviewerwin32.h
- llwindebug.h
)
# precompiled header configuration
@@ -1154,6 +1200,9 @@ if (WINDOWS)
res/toolpickobject2.cur
res/toolpickobject3.cur
res/toolpipette.cur
+ res/toolbuy.cur
+ res/toolopen.cur
+ res/toolsit.cur
)
set_source_files_properties(${viewer_RESOURCE_FILES}
@@ -1377,7 +1426,7 @@ if (WINDOWS)
# 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
+ # *NOTE:Mani - This is a crappy hack to have important dependencies 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.
@@ -1395,10 +1444,10 @@ if (WINDOWS)
${SHARED_LIB_STAGING_DIR}/RelWithDebInfo/libtcmalloc_minimal.dll
${SHARED_LIB_STAGING_DIR}/Debug/libtcmalloc_minimal-debug.dll
)
- endif(USE_GOOGLE_PERFTOOLS)
-
+ endif(USE_GOOGLE_PERFTOOLS)
+
- set(COPY_INPUT_DEPENDECIES
+ set(COPY_INPUT_DEPENDENCIES
# The following commented dependencies are determined at variably at build time. Can't do this here.
#${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libtcmalloc_minimal.dll => None ... Skipping libtcmalloc_minimal.dll
${CMAKE_SOURCE_DIR}/../etc/message.xml
@@ -1432,8 +1481,6 @@ if (WINDOWS)
${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
@@ -1473,6 +1520,7 @@ if (WINDOWS)
SLPlugin
media_plugin_quicktime
media_plugin_webkit
+ winmm_shim
windows-crash-logger
windows-updater
)
@@ -1494,7 +1542,7 @@ if (WINDOWS)
DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
stage_third_party_libs
- ${COPY_INPUT_DEPENDECIES}
+ ${COPY_INPUT_DEPENDENCIES}
COMMENT "Performing viewer_manifest copy"
)
@@ -1513,8 +1561,6 @@ if (WINDOWS)
add_dependencies(${VIEWER_BINARY_NAME}
SLPlugin
- media_plugin_quicktime
- media_plugin_webkit
windows-updater
windows-crash-logger
)
@@ -1564,7 +1610,10 @@ if (WINDOWS)
--login_channel=${VIEWER_LOGIN_CHANNEL}
--source=${CMAKE_CURRENT_SOURCE_DIR}
--touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/touched.bat
- DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
+ DEPENDS
+ ${VIEWER_BINARY_NAME}
+ ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
+ ${COPY_INPUT_DEPENDENCIES}
)
add_custom_target(package ALL DEPENDS
@@ -1613,6 +1662,8 @@ target_link_libraries(${VIEWER_BINARY_NAME}
${WINDOWS_LIBRARIES}
${XMLRPCEPI_LIBRARIES}
${ELFIO_LIBRARIES}
+ ${OPENSSL_LIBRARIES}
+ ${CRYPTO_LIBRARIES}
${LLLOGIN_LIBRARIES}
${GOOGLE_PERFTOOLS_LIBRARIES}
)
@@ -1624,13 +1675,6 @@ set(ARTWORK_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH
if (LINUX)
- add_custom_command(
- OUTPUT secondlife-stripped
- COMMAND strip
- ARGS --strip-debug -o secondlife-stripped ${VIEWER_BINARY_NAME}
- DEPENDS ${VIEWER_BINARY_NAME}
- )
-
set(product SecondLife-${ARCH}-${viewer_VERSION})
add_custom_command(
@@ -1650,17 +1694,40 @@ if (LINUX)
--login_channel=${VIEWER_LOGIN_CHANNEL}
--source=${CMAKE_CURRENT_SOURCE_DIR}
--touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched
- DEPENDS secondlife-stripped ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
+ DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
)
add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_gstreamer010 media_plugin_webkit)
if (NOT INSTALL)
add_custom_target(package ALL DEPENDS ${product}.tar.bz2)
- add_dependencies(package linux-crash-logger-strip-target)
- add_dependencies(package linux-updater-strip-target)
+ add_dependencies(package linux-crash-logger-target)
+ add_dependencies(package linux-updater-target)
check_message_template(package)
endif (NOT INSTALL)
+
+ add_custom_command(
+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.copy_touched
+ COMMAND ${PYTHON_EXECUTABLE}
+ ARGS
+ ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
+ --arch=${ARCH}
+ --actions=copy
+ --artwork=${ARTWORK_DIR}
+ --build=${CMAKE_CURRENT_BINARY_DIR}
+ --buildtype=${CMAKE_BUILD_TYPE}
+ --configuration=${CMAKE_CFG_INTDIR}
+ --dest=${CMAKE_CURRENT_BINARY_DIR}/packaged
+ --grid=${GRID}
+ --source=${CMAKE_CURRENT_SOURCE_DIR}
+ DEPENDS
+ ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
+ ${COPY_INPUT_DEPENDENCIES}
+ COMMENT "Performing viewer_manifest copy"
+ )
+
+ add_custom_target(copy_l_viewer_manifest ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.copy_touched)
+ add_dependencies(copy_l_viewer_manifest "${VIEWER_BINARY_NAME}" linux-crash-logger-target linux-updater-target)
endif (LINUX)
if (DARWIN)
@@ -1695,52 +1762,30 @@ if (DARWIN)
DEPENDS ${VIEWER_BINARY_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
)
- add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit)
+ add_dependencies(${VIEWER_BINARY_NAME} SLPlugin media_plugin_quicktime media_plugin_webkit mac-updater mac-crash-logger)
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(
TARGET package POST_BUILD
COMMAND ${PYTHON_EXECUTABLE}
ARGS
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
- --grid=${GRID}
- --buildtype=${CMAKE_BUILD_TYPE}
- --configuration=${CMAKE_CFG_INTDIR}
- --channel=${VIEWER_CHANNEL}
- --login_channel=${VIEWER_LOGIN_CHANNEL}
- --source=${CMAKE_CURRENT_SOURCE_DIR}
--artwork=${ARTWORK_DIR}
--build=${CMAKE_CURRENT_BINARY_DIR}
- --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app
- --touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched
- DEPENDS
- ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
- )
-
-
- add_custom_command(
- TARGET package POST_BUILD
- COMMAND ${PYTHON_EXECUTABLE}
- ARGS
- ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
- --grid=${GRID}
--buildtype=${CMAKE_BUILD_TYPE}
- --configuration=${CMAKE_CFG_INTDIR}
--channel=${VIEWER_CHANNEL}
+ --configuration=${CMAKE_CFG_INTDIR}
+ --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app
+ --grid=${GRID}
--login_channel=${VIEWER_LOGIN_CHANNEL}
--source=${CMAKE_CURRENT_SOURCE_DIR}
- --artwork=${ARTWORK_DIR}
- --build=${CMAKE_CURRENT_BINARY_DIR}
- --dest=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app
--touch=${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.touched
DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
)
-
endif (PACKAGE)
endif (DARWIN)
@@ -1748,6 +1793,45 @@ if (INSTALL)
include(${CMAKE_CURRENT_SOURCE_DIR}/ViewerInstall.cmake)
endif (INSTALL)
+if (PACKAGE)
+ if (WINDOWS)
+ set(VIEWER_DIST_DIR "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}")
+ set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-windows.tar.bz2")
+ set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME}${CMAKE_EXECUTABLE_SUFFIX} slplugin.exe")
+ set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}")
+ set(VIEWER_COPY_MANIFEST copy_w_viewer_manifest)
+ endif (WINDOWS)
+ if (DARWIN)
+ set(VIEWER_DIST_DIR "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app")
+ set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-darwin.tar.bz2")
+ set(VIEWER_EXE_GLOBS "'Second Life' SLPlugin")
+ set(VIEWER_LIB_GLOB "*.dylib")
+ endif (DARWIN)
+ if (LINUX)
+ set(VIEWER_DIST_DIR "${CMAKE_CURRENT_BINARY_DIR}/packaged")
+ set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-linux.tar.bz2")
+ set(VIEWER_EXE_GLOBS "do-not-directly-run-secondlife-bin SLPlugin")
+ set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}*")
+ set(VIEWER_COPY_MANIFEST copy_l_viewer_manifest)
+ endif (LINUX)
+
+ add_custom_command(OUTPUT "${VIEWER_SYMBOL_FILE}"
+ COMMAND "${PYTHON_EXECUTABLE}"
+ ARGS
+ "${CMAKE_CURRENT_SOURCE_DIR}/generate_breakpad_symbols.py"
+ "${VIEWER_DIST_DIR}"
+ "${VIEWER_EXE_GLOBS}"
+ "${VIEWER_LIB_GLOB}"
+ "${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/bin/dump_syms"
+ "${VIEWER_SYMBOL_FILE}"
+ DEPENDS generate_breakpad_symbols.py
+ VERBATIM
+ )
+ add_custom_target(generate_breakpad_symbols ALL DEPENDS "${VIEWER_SYMBOL_FILE}")
+ add_dependencies(generate_breakpad_symbols "${VIEWER_BINARY_NAME}" "${VIEWER_COPY_MANIFEST}")
+ add_dependencies(package generate_breakpad_symbols)
+endif (PACKAGE)
+
if (LL_TESTS)
# To add a viewer unit test, just add the test .cpp file below
# This creates a separate test project per file listed.
@@ -1796,6 +1880,43 @@ if (LL_TESTS)
"${CMAKE_SOURCE_DIR}/llmessage/tests/test_llsdmessage_peer.py"
)
+ set(test_libs
+ ${LLMESSAGE_LIBRARIES}
+ ${WINDOWS_LIBRARIES}
+ ${LLVFS_LIBRARIES}
+ ${LLMATH_LIBRARIES}
+ ${LLCOMMON_LIBRARIES}
+ ${GOOGLEMOCK_LIBRARIES}
+ ${OPENSSL_LIBRARIES}
+ ${CRYPTO_LIBRARIES}
+ )
+
+ LL_ADD_INTEGRATION_TEST(llsechandler_basic
+ llsechandler_basic.cpp
+ "${test_libs}"
+ )
+
+ LL_ADD_INTEGRATION_TEST(llsecapi
+ llsecapi.cpp
+ "${test_libs}"
+ )
+
+ set(llslurl_test_sources
+ llslurl.cpp
+ llviewernetwork.cpp
+ )
+
+
+ LL_ADD_INTEGRATION_TEST(llslurl
+ "${llslurl_test_sources}"
+ "${test_libs}"
+ )
+
+ LL_ADD_INTEGRATION_TEST(llviewernetwork
+ llviewernetwork.cpp
+ "${test_libs}"
+ )
+
#ADD_VIEWER_BUILD_TEST(llmemoryview viewer)
#ADD_VIEWER_BUILD_TEST(llagentaccess viewer)
#ADD_VIEWER_BUILD_TEST(llworldmap viewer)
@@ -1803,6 +1924,7 @@ if (LL_TESTS)
#ADD_VIEWER_BUILD_TEST(lltextureinfo viewer)
#ADD_VIEWER_BUILD_TEST(lltextureinfodetails viewer)
#ADD_VIEWER_BUILD_TEST(lltexturestatsuploader viewer)
+
endif (LL_TESTS)
diff --git a/indra/newview/English.lproj/InfoPlist.strings b/indra/newview/English.lproj/InfoPlist.strings
index 879408d6e4..fc531f93d4 100644
--- a/indra/newview/English.lproj/InfoPlist.strings
+++ b/indra/newview/English.lproj/InfoPlist.strings
@@ -2,6 +2,6 @@
CFBundleName = "Second Life";
-CFBundleShortVersionString = "Second Life version 2.0.0.200030";
-CFBundleGetInfoString = "Second Life version 2.0.0.200030, Copyright 2004-2009 Linden Research, Inc.";
+CFBundleShortVersionString = "Second Life version 2.1.0.0";
+CFBundleGetInfoString = "Second Life version 2.1.0.0, Copyright 2004-2009 Linden Research, Inc.";
diff --git a/indra/newview/Info-SecondLife.plist b/indra/newview/Info-SecondLife.plist
index 38ebb22b84..97e24a0bd5 100644
--- a/indra/newview/Info-SecondLife.plist
+++ b/indra/newview/Info-SecondLife.plist
@@ -18,6 +18,33 @@
<string>APPL</string>
<key>CFBundleSignature</key>
<string>????</string>
+ <key>CFBundleDocumentTypes</key>
+ <array>
+ <dict>
+ <key>CFBundleTypeExtensions</key>
+ <array>
+ <string>slurl</string>
+ </array>
+ <key>CFBundleTypeIconFile</key>
+ <string>seconlife</string>
+ <key>CFBundleTypeMIMETypes</key>
+ <array>
+ <string>application/x-grid-location-info</string>
+ </array>
+ <key>CFBundleTypeName</key>
+ <string>Secondlife SLURL</string>
+ <key>CFBundleTypeOSTypes</key>
+ <array>
+ <string>SLRL</string>
+ </array>
+ <key>CFBundleTypeRole</key>
+ <string>Viewer</string>
+ <key>LSTypeIsPackage</key>
+ <true/>
+ <key>NSDocumentClass</key>
+ <string>SecondLifeSLURL</string>
+ </dict>
+ </array>
<key>CFBundleURLTypes</key>
<array>
<dict>
@@ -26,13 +53,14 @@
<key>CFBundleURLSchemes</key>
<array>
<string>secondlife</string>
+ <string>x-grid-location-info</string>
</array>
<key>LSIsAppleDefaultForScheme</key>
<true/>
</dict>
</array>
<key>CFBundleVersion</key>
- <string>2.0.0.200030</string>
+ <string>2.1.0.0</string>
<key>CSResourcesFileMapped</key>
<true/>
</dict>
diff --git a/indra/newview/app_settings/CA.pem b/indra/newview/app_settings/CA.pem
index b14e7346ad..e68e2b6ce6 100644
--- a/indra/newview/app_settings/CA.pem
+++ b/indra/newview/app_settings/CA.pem
@@ -26,1489 +26,1464 @@ t79enKNHEA2fupH3vEigf5Eh4bVAN5VohrTm6MY53x7XQZZr1ME7a55lFEnSeT0u
mlOAjR2mAbvSM5X5oSZNrmetdzyTj2flCM8CC7MLab0kkdngRIlUBGHF1/S5nmPb
K+9A46sd33oqK8n8
-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIDtTCCAp2gAwIBAgIRANAeQJAAAEZSAAAAAQAAAAQwDQYJKoZIhvcNAQEFBQAw
+gYkxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJEQzETMBEGA1UEBxMKV2FzaGluZ3Rv
+bjEXMBUGA1UEChMOQUJBLkVDT00sIElOQy4xGTAXBgNVBAMTEEFCQS5FQ09NIFJv
+b3QgQ0ExJDAiBgkqhkiG9w0BCQEWFWFkbWluQGRpZ3NpZ3RydXN0LmNvbTAeFw05
+OTA3MTIxNzMzNTNaFw0wOTA3MDkxNzMzNTNaMIGJMQswCQYDVQQGEwJVUzELMAkG
+A1UECBMCREMxEzARBgNVBAcTCldhc2hpbmd0b24xFzAVBgNVBAoTDkFCQS5FQ09N
+LCBJTkMuMRkwFwYDVQQDExBBQkEuRUNPTSBSb290IENBMSQwIgYJKoZIhvcNAQkB
+FhVhZG1pbkBkaWdzaWd0cnVzdC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQCx0xHgeVVDBwhMywVCAOINg0Y95JO6tgbTDVm9PsHOQ2cBiiGo77zM
+0KLMsFWWU4RmBQDaREmA2FQKpSWGlO1jVv9wbKOhGdJ4vmgqRF4vz8wYXke8OrFG
+PR7wuSw0X4x8TAgpnUBV6zx9g9618PeKgw6hTLQ6pbNfWiKX7BmbwQVo/ea3qZGU
+LOR4SCQaJRk665WcOQqKz0Ky8BzVX/tr7WhWezkscjiw7pOp03t3POtxA6k4ShZs
+iSrK2jMTecJVjO2cu/LLWxD4LmE1xilMKtAqY9FlWbT4zfn0AIS2V0KFnTKo+SpU
++/94Qby9cSj0u5C8/5Y0BONFnqFGKECBAgMBAAGjFjAUMBIGA1UdEwEB/wQIMAYB
+Af8CAQgwDQYJKoZIhvcNAQEFBQADggEBAARvJYbk5pYntNlCwNDJALF/VD6Hsm0k
+qS8Kfv2kRLD4VAe9G52dyntQJHsRW0mjpr8SdNWJt7cvmGQlFLdh6X9ggGvTZOir
+vRrWUfrAtF13Gn9kCF55xgVM8XrdTX3O5kh7VNJhkoHWG9YA8A6eKHegTYjHInYZ
+w8eeG6Z3ePhfm1bR8PIXrI6dWeYf/le22V7hXZ9F7GFoGUHhsiAm/lowdiT/QHI8
+eZ98IkirRs3bs4Ysj78FQdPB4xTjQRcm0HyncUwZ6EoPclgxfexgeqMiKL0ZJGA/
+O4dzwGvky663qyVDslUte6sGDnVdNOVdc22esnVApVnJTzFxiNmIf1Q=
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx
+HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh
+IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAwMFoXDTM3MTEyMDE1
+MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg
+SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M
+IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U
+0pPlLYnKhHw/EEMbjIt8hFj4JHxIzyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItI
+TuLCxFlpMGK2MKKMCxGZYTVtfu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAf
+RC+iYkGzuxgh28pxPIzstrkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqF
+zQ6axOAAsNUl6twr5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqh
+BC4aMqiaILGcLCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEA
+AaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jY
+PXy+XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/
+BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNMeUWn
+9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7CegCgTXT
+Ct8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77BfWgDrvq2g+EQF
+Z7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oTLW4jYYehY0KswsuX
+n2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCzvhGbRWeDhhmH05i9CBoW
+H1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmwX7A5KGgOc90lmt4S
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMCVVMx
+HTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNBbWVyaWNh
+IE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIgUm9vdCBDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyOTA2MDAwMFoXDTM3MDkyODIz
+NDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRBT0wgVGltZSBXYXJuZXIg
+SW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUgSW5jLjE3MDUGA1UEAxMuQU9M
+IFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIw
+DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ
+7ouZzU9AhqS2TcnZsdw8TQ2FTBVsRotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilb
+m2BPJoPRYxJWSXakFsKlnUWsi4SVqBax7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOY
+xFSMFkpBd4aVdQxHAWZg/BXxD+r1FHjHDtdugRxev17nOirYlxcwfACtCJ0zr7iZ
+YYCLqJV+FNwSbKTQ2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2wTPDaRrbq
+JS5Gr42whTg0ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fx
+I2rSAG2X+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETz
+kxmlJ85per5n0/xQpCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFh
+EVsVS6kkUfykXPcXnbDS+gfpj1bkGoxoigTTfFrjnqKhynFbotSg5ymFXQNoKk/S
+Btc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuWCpTehTacyH+BCQJJKg71ZDIM
+gtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1ExMVCgyhwn2RAu
+rda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
+FE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaAFE9pbQN+nZ8HGEO8txBO
+1b+pxCAoMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAO/Ouyugu
+h4X7ZVnnrREUpVe8WJ8kEle7+z802u6teio0cnAxa8cZmIDJgt43d15Ui47y6mdP
+yXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRFASbI5Rq8NEQh3q0l/HYWdyGQgJhXnU7q
+7C+qPBR7V8F+GBRn7iTGvboVsNIYvbdVgaxTwOjdaRITQrcCtQVBynlQboIOcXKT
+RuidDV29rs4prWPVVRaAMCf/drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ68W/
+ClTluUI8JPu3B5wwn3la5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyB
+M5kYJRF3p+v9WAksmWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQ
+my8YJPamTQr5O8t1wswvziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xO
+AU++CrYD062KRffaJ00psUjf5BHklka9bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT
+9Y41xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4oGKQWDzH9OmwjkyB24f0H
+hdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2uBOLZ8/5
+fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg=
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
+IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
+MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
+FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
+bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
+dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
+H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9
+uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX
+mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX
+a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
+E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0
+WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
+VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
+Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
+cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
+IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
+AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
+YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
+6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
+Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
+c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
+mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
+b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw
+MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD
+VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA
+A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul
+CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n
+tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl
+dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch
+PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC
++Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O
+BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E
+BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl
+MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk
+ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB
+IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X
+7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz
+43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
+eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl
+pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA
+WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
+b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx
+MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB
+ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV
+BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV
+6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX
+GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP
+dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH
+1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF
+62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW
+BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw
+AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL
+MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU
+cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv
+b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6
+IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/
+iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
+GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh
+4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm
+XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
+b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1
+MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK
+EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh
+BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq
+xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G
+87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i
+2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U
+WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1
+0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G
+A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T
+AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr
+pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL
+ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm
+aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv
+hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm
+hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
+dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3
+P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y
+iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no
+xqE=
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc
+MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP
+bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2
+MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft
+ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk
+hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym
+1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW
+OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb
+2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko
+O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU
+AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
+BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF
+Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb
+LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir
+oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C
+MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds
+sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7
+-----END CERTIFICATE-----
+
-----BEGIN CERTIFICATE-----
-MIIDtTCCAp2gAwIBAgIRANAeQJAAAEZSAAAAAQAAAAQwDQYJKoZIhvcNAQEF
-BQAwgYkxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJEQzETMBEGA1UEBxMKV2Fz
-aGluZ3RvbjEXMBUGA1UEChMOQUJBLkVDT00sIElOQy4xGTAXBgNVBAMTEEFC
-QS5FQ09NIFJvb3QgQ0ExJDAiBgkqhkiG9w0BCQEWFWFkbWluQGRpZ3NpZ3Ry
-dXN0LmNvbTAeFw05OTA3MTIxNzMzNTNaFw0wOTA3MDkxNzMzNTNaMIGJMQsw
-CQYDVQQGEwJVUzELMAkGA1UECBMCREMxEzARBgNVBAcTCldhc2hpbmd0b24x
-FzAVBgNVBAoTDkFCQS5FQ09NLCBJTkMuMRkwFwYDVQQDExBBQkEuRUNPTSBS
-b290IENBMSQwIgYJKoZIhvcNAQkBFhVhZG1pbkBkaWdzaWd0cnVzdC5jb20w
-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx0xHgeVVDBwhMywVC
-AOINg0Y95JO6tgbTDVm9PsHOQ2cBiiGo77zM0KLMsFWWU4RmBQDaREmA2FQK
-pSWGlO1jVv9wbKOhGdJ4vmgqRF4vz8wYXke8OrFGPR7wuSw0X4x8TAgpnUBV
-6zx9g9618PeKgw6hTLQ6pbNfWiKX7BmbwQVo/ea3qZGULOR4SCQaJRk665Wc
-OQqKz0Ky8BzVX/tr7WhWezkscjiw7pOp03t3POtxA6k4ShZsiSrK2jMTecJV
-jO2cu/LLWxD4LmE1xilMKtAqY9FlWbT4zfn0AIS2V0KFnTKo+SpU+/94Qby9
-cSj0u5C8/5Y0BONFnqFGKECBAgMBAAGjFjAUMBIGA1UdEwEB/wQIMAYBAf8C
-AQgwDQYJKoZIhvcNAQEFBQADggEBAARvJYbk5pYntNlCwNDJALF/VD6Hsm0k
-qS8Kfv2kRLD4VAe9G52dyntQJHsRW0mjpr8SdNWJt7cvmGQlFLdh6X9ggGvT
-ZOirvRrWUfrAtF13Gn9kCF55xgVM8XrdTX3O5kh7VNJhkoHWG9YA8A6eKHeg
-TYjHInYZw8eeG6Z3ePhfm1bR8PIXrI6dWeYf/le22V7hXZ9F7GFoGUHhsiAm
-/lowdiT/QHI8eZ98IkirRs3bs4Ysj78FQdPB4xTjQRcm0HyncUwZ6EoPclgx
-fexgeqMiKL0ZJGA/O4dzwGvky663qyVDslUte6sGDnVdNOVdc22esnVApVnJ
-TzFxiNmIf1Q=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIID5jCCAs6gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMC
-VVMxHTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNB
-bWVyaWNhIE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIg
-Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyOTA2MDAw
-MFoXDTM3MTEyMDE1MDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRB
-T0wgVGltZSBXYXJuZXIgSW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUg
-SW5jLjE3MDUGA1UEAxMuQU9MIFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
-ggEBAJnej8Mlo2k06AX3dLm/WpcZuS+U0pPlLYnKhHw/EEMbjIt8hFj4JHxI
-zyr9wBXZGH6EGhfT257XyuTZ16pYUYfw8ItITuLCxFlpMGK2MKKMCxGZYTVt
-fu/FsRkGIBKOQuHfD5YQUqjPnF+VFNivO3ULMSAfRC+iYkGzuxgh28pxPIzs
-trkNn+9R7017EvILDOGsQI93f7DKeHEMXRZxcKLXwjqFzQ6axOAAsNUl6twr
-5JQtOJyJQVdkKGUZHLZEtMgxa44Be3ZZJX8VHIQIfHNlIAqhBC4aMqiaILGc
-LCFZ5/vP7nAtCMpjPiybkxlqpMKX/7eGV4iFbJ4VFitNLLMCAwEAAaNjMGEw
-DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUoTYwFsuGkABFgFOxj8jYPXy+
-XxIwHwYDVR0jBBgwFoAUoTYwFsuGkABFgFOxj8jYPXy+XxIwDgYDVR0PAQH/
-BAQDAgGGMA0GCSqGSIb3DQEBBQUAA4IBAQCKIBilvrMvtKaEAEAwKfq0FHNM
-eUWn9nDg6H5kHgqVfGphwu9OH77/yZkfB2FK4V1Mza3u0FIy2VkyvNp5ctZ7
-CegCgTXTCt8RHcl5oIBN/lrXVtbtDyqvpxh1MwzqwWEFT2qaifKNuZ8u77Bf
-WgDrvq2g+EQFZ7zLBO+eZMXpyD8Fv8YvBxzDNnGGyjhmSs3WuEvGbKeXO/oT
-LW4jYYehY0KswsuXn2Fozy1MBJ3XJU8KDk2QixhWqJNIV9xvrr2eZ1d3iVCz
-vhGbRWeDhhmH05i9CBoWH1iCC+GWaQVLjuyDUTEH1dSf/1l7qG6Fz9NLqUmw
-X7A5KGgOc90lmt4S
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIF5jCCA86gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgzELMAkGA1UEBhMC
-VVMxHTAbBgNVBAoTFEFPTCBUaW1lIFdhcm5lciBJbmMuMRwwGgYDVQQLExNB
-bWVyaWNhIE9ubGluZSBJbmMuMTcwNQYDVQQDEy5BT0wgVGltZSBXYXJuZXIg
-Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyOTA2MDAw
-MFoXDTM3MDkyODIzNDMwMFowgYMxCzAJBgNVBAYTAlVTMR0wGwYDVQQKExRB
-T0wgVGltZSBXYXJuZXIgSW5jLjEcMBoGA1UECxMTQW1lcmljYSBPbmxpbmUg
-SW5jLjE3MDUGA1UEAxMuQU9MIFRpbWUgV2FybmVyIFJvb3QgQ2VydGlmaWNh
-dGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoC
-ggIBALQ3WggWmRToVbEbJGv8x4vmh6mJ7ouZzU9AhqS2TcnZsdw8TQ2FTBVs
-RotSeJ/4I/1n9SQ6aF3Q92RhQVSji6UI0ilbm2BPJoPRYxJWSXakFsKlnUWs
-i4SVqBax7J/qJBrvuVdcmiQhLE0OcR+mrF1FdAOYxFSMFkpBd4aVdQxHAWZg
-/BXxD+r1FHjHDtdugRxev17nOirYlxcwfACtCJ0zr7iZYYCLqJV+FNwSbKTQ
-2O9ASQI2+W6p1h2WVgSysy0WVoaP2SBXgM1nEG2wTPDaRrbqJS5Gr42whTg0
-ixQmgiusrpkLjhTXUr2eacOGAgvqdnUxCc4zGSGFQ+aJLZ8lN2fxI2rSAG2X
-+Z/nKcrdH9cG6rjJuQkhn8g/BsXS6RJGAE57COtCPStIbp1n3UsC5ETzkxml
-J85per5n0/xQpCyrw2u544BMzwVhSyvcG7mm0tCq9Stz+86QNZ8MUhy/XCFh
-EVsVS6kkUfykXPcXnbDS+gfpj1bkGoxoigTTfFrjnqKhynFbotSg5ymFXQNo
-Kk/SBtc9+cMDLz9l+WceR0DTYw/j1Y75hauXTLPXJuuWCpTehTacyH+BCQJJ
-Kg71ZDIMgtG6aoIbs0t0EfOMd9afv9w3pKdVBC/UMejTRrkDfNoSTllkt1Ex
-MVCgyhwn2RAurda9EGYrw7AiShJbAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMB
-Af8wHQYDVR0OBBYEFE9pbQN+nZ8HGEO8txBO1b+pxCAoMB8GA1UdIwQYMBaA
-FE9pbQN+nZ8HGEO8txBO1b+pxCAoMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG
-9w0BAQUFAAOCAgEAO/Ouyuguh4X7ZVnnrREUpVe8WJ8kEle7+z802u6teio0
-cnAxa8cZmIDJgt43d15Ui47y6mdPyXSEkVYJ1eV6moG2gcKtNuTxVBFT8zRF
-ASbI5Rq8NEQh3q0l/HYWdyGQgJhXnU7q7C+qPBR7V8F+GBRn7iTGvboVsNIY
-vbdVgaxTwOjdaRITQrcCtQVBynlQboIOcXKTRuidDV29rs4prWPVVRaAMCf/
-drr3uNZK49m1+VLQTkCpx+XCMseqdiThawVQ68W/ClTluUI8JPu3B5wwn3la
-5uBAUhX0/Kr0VvlEl4ftDmVyXr4m+02kLQgH3thcoNyBM5kYJRF3p+v9WAks
-mWsbivNSPxpNSGDxoPYzAlOL7SUJuA0t7Zdz7NeWH45gDtoQmy8YJPamTQr5
-O8t1wswvziRpyQoijlmn94IM19drNZxDAGrElWe6nEXLuA4399xOAU++CrYD
-062KRffaJ00psUjf5BHklka9bAI+1lHIlRcBFanyqqryvy9lG2/QuRqT9Y41
-xICHPpQvZuTpqP9BnHAqTyo5GJUefvthATxRCC4oGKQWDzH9OmwjkyB24f0H
-hdFbP9IcczLd+rn4jM8Ch3qaluTtT4mNU0OrDhPAARW0eTjb/G49nlG2uBOL
-Z8/5fNkiHfZdxRwBL5joeiQYvITX+txyW/fBOmg=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJT
-RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4
-dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5h
-bCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzEL
-MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1B
-ZGRUcnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1
-c3QgRXh0ZXJuYWwgQ0EgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
-AQoCggEBALf3GjPm8gAELTngTlvtH7xsD821+iO2zt6bETOXpClMfZOfvUq8
-k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfwTz/oMp50
-ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504
-B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDez
-eWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5
-aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0WicCAwEAAaOB
-3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0PBAQD
-AgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6
-xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
-cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdv
-cmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJ
-KoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl
-j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5R
-xNKWt9x+Tu5w/Rw56wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjT
-K3rMUUKhemPR5ruhxSvCNr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1
-n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHx
-REzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49O
-hgQ=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJT
-RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU
-UCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3Qw
-HhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJT
-RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU
-UCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3Qw
-ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwze
-xODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY654eyNAbFvAWlA3yCyykQruGI
-gb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWroulpOj0O
-M3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1Lc
-sRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5
-mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG
-9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0OBBYEFJWxtPCU
-tr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTADAQH/
-MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQsw
-CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk
-ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAx
-IENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0
-MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph
-iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9
-tTEv2dB8Xfjea4MYeDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL
-/bscVjby/rK25Xa71SJlpz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlV
-g3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6
-tkD9xOQ14R0WHNC8K47Wcdk=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJT
-RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU
-UCBOZXR3b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAe
-Fw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNF
-MRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ
-IE5ldHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIB
-IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+
-A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c
-+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1id9NEHif2
-P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKX
-C1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8R
-s3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9
-BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQWBBSBPjfYkrAf
-d59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zCB
-jgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkG
-A1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU
-cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENB
-IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmu
-G7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL
-+YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbj
-PGsye/Kf8Lb93/AoGEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bY
-GozH7ZxOmuASu7VqTITh4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6
-NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9HEufOX1362Kqx
-My3ZdvJOOjMMK7MtkAY=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJT
-RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRU
-UCBOZXR3b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9v
-dDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYT
-AlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3Qg
-VFRQIE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBS
-b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoek
-n0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKk
-IhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3KP0q6p6z
-sLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1t
-UvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R
-+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvES
-a0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0GA1UdDgQWBBQ5
-lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw
-AwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkw
-ZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL
-ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVh
-bGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2Vh
-lRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG
-GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx9
-5dr6h+sNNVJn0J6XdgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKF
-Yqa0p9m9N5xotS1WfbC3P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVA
-wRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQw
-dOUeqN48Jzd/g66ed8/wMLH/S5noxqE=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJV
-UzEcMBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1l
-cmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4X
-DTAyMDUyODA2MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMx
-HDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJp
-Y2EgT25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIw
-DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCa
-xlCyfqXfaE0bfA+2l2h9LaaLl+lkhsmj76CGv2BlnEtUiMJIxUo5vxTjWVXl
-GbR0yLQFOVwWpeKVBeASrlmLojNoWBym1BW32J/X3HGrfpq/m44zDyL9Hy7n
-BzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsWOqMFf6Dch9Wc/HKpoH145Lcx
-VR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb2xzTa5qGUwew76wGePiE
-mf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQkoO3rHl+Ee5fSfwMCu
-JKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
-HQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAUAK3Zo/Z5
-9m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEBBQUA
-A4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF
-Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOM
-IOAbLjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTI
-dGcL+oiroQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43g
-Kd8hdIaC2y+CMMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j
-8uB9Gr784N/Xx6dssPmuujz9dLQR6FgNgLzTqIA6me11zEZ7
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJV
-UzEcMBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1l
-cmljYSBPbmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4X
-DTAyMDUyODA2MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMx
-HDAaBgNVBAoTE0FtZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJp
-Y2EgT25saW5lIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIw
-DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssN
-t79Hc9PwVU3dxgz6sWYFas14tNwC206B89enfHG8dWOgXeMHDEjsJcQDIPT/
-DjsS/5uN4cbVG7RtIuOx238hZK+GvFciKtZHgVdEglZTvYYUAQv8f3SkWq7x
-uhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2JxhP7JsowtS013wMPgwr38oE
-18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9BoInLRBYBbV4Bbkv2wxr
-kJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7eXz8d3eOyG6ChKiMD
-bi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8BPeraunzgWGcX
-uVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67Xnfn6KVu
-Y8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEqZ8A9
-W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ
-o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48
-ArO3+L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124Hhn
-AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3Op
-aaEg5+31IqEjFNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNee
-MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypL
-M7PmG2tZTiLMubekJcmnxPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qf
-tIe3RUavg6WXSIylvfEWK5t2LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjR
-Ywu5W1LtGLBDQiKmsXeu3mnFzcccobGlHBD7GL4acN3Bkku+KVqdPzW+5X1R
-+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8CNyRnqjQ1xU3c6U1uPx+xURABsPr
-+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMeIjzCpjbdGe+n/BLzJsBZMYVM
-nNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMADjMSW7yV5TKQqLPGbIOt
-d+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2FAjgQ5ANh1NolNscI
-WC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUXOm/9riW99XJZ
-ZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPbAZO1XB4Y
-3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQlZvqz
-2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw
+MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc
+MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP
+bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2
+MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft
+ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC
+206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci
+KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2
+JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9
+BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e
+Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B
+PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67
+Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq
+Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ
+o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3
++L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj
+YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj
+FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE
+AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn
+xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2
+LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc
+obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8
+CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe
+IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA
+DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F
+AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX
+Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb
+AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl
+Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw
RY8mkaKO/qk=
-----END CERTIFICATE-----
+
-----BEGIN CERTIFICATE-----
-MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQG
-EwJJRTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0
-MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUx
-MjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNV
-BAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZ
-QmFsdGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBAKMEuyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+h
-Xe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gR
-QKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/CG9VwcPCP
-wBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1
-pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNT
-Px8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkC
-AwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1BE3wMBIGA1Ud
-EwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUA
-A4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkT
-I7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx
-jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/
-oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67
-G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H
-RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQG
-EwJVUzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREw
-DwYDVQQLEwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQw
-MjNaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVy
-ZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEB
-AQUAA4GLADCBhwKBgQCgbIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlR
-EmlvMVW5SXIACH7TpWJENySZj9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+Lth
-zfNHwJmm8fOR6Hh8AMthyUQncWlVSn5JTe2io74CTADKAqjuAQIxZA9SLRN0
-dja1erQtcQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBoBgNVHR8E
-YTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwg
-U2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTExDTALBgNV
-BAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEwMjNagQ8yMDE4MTIx
-MDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5fpFpRhgTCgJ3
-pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i+DAMBgNV
-HRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3
-DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN
-QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomA
-sH3+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6
-w4pl
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIID2DCCAsACEQDQHkCLAAACfAAAAAIAAAABMA0GCSqGSIb3DQEBBQUAMIGp
-MQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBM
-YWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENv
-LjERMA8GA1UECxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDEx
-ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODEyMDEx
-ODE4NTVaFw0wODExMjgxODE4NTVaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UE
-CBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0Rp
-Z2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDEx
-FjAUBgNVBAMTDURTVCBSb290Q0EgWDExITAfBgkqhkiG9w0BCQEWEmNhQGRp
-Z3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-ANLGJrbnpT3BxGjVUG9TxW9JEwm4ryxIjRRqoxdfWvnTLnUv2Chi0ZMv/E3U
-q4flCMeZ55I/db3rJbQVwZsZPdJEjdd0IG03Ao9pk1uKxBmd9LIO/BZsubEF
-koPRhSxglD5FVaDZqwgh5mDoO3TymVBRaNADLbGAvqPYUrBEzUNKcI5YhZXh
-TizWLUFv1oTnyJhEykfbLCSlaSbPa7gnYsP0yXqSI+0TZ4KuRS5F5X5yP4Wd
-lGIQ5jyRoa13AOAV7POEgHJ6jm5gl8ckWRA0g1vhpaRptlc1HHhZxtMvOnNn
-7pTKBBMFYgZwI7P0fO5F2WQLW0mqpEPOJsREEmy43XkCAwEAATANBgkqhkiG
-9w0BAQUFAAOCAQEAojeyP2n714Z5VEkxlTMr89EJFEliYIalsBHiUMIdBlc+
-LegzZL6bqq1fG03UmZWii5rJYnK1aerZWKs17RWiQ9a2vAd5ZWRzfdd5ynvV
-WlHG4VMElo04z6MXrDlxawHDi1M8Y+nuecDkvpIyZHqzH5eUYr3qsiAVlfuX
-8ngvYzZAOONGDx3drJXK50uQe7FLqdTF65raqtWjlBRGjS0f8zrWkzr2Pnn8
-6Oawde3uPclwx12qgUtGJRzHbBXjlU4PqjI3lAoXJJIThFjSY28r9+ZbYgsT
-F7ANUkz+/m9c4pFuHf2kYtdo+o56T9II2pPc8JIRetDccpMMc5NihWjQ9A==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQG
-EwJVUzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREw
-DwYDVQQLEwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3
-MjZaMEYxCzAJBgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVy
-ZSBUcnVzdCBDby4xETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEB
-AQUAA4GLADCBhwKBgQC/k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fB
-w18DW9Fvrn5C6mYjuGODVvsoLeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87e
-ZfCocfdPJmyMvMa1795JJ/9IKn3oTQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd
-55FbgM2UnQIBA6OCASQwggEgMBEGCWCGSAGG+EIBAQQEAwIABzBoBgNVHR8E
-YTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMxJDAiBgNVBAoTG0RpZ2l0YWwg
-U2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgRTIxDTALBgNV
-BAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3MjZagQ8yMDE4MTIw
-OTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6CTShlgDzJQW6s
-NS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5WzAMBgNV
-HRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqGSIb3
-DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR
-xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLb
-dHVLB3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlih
-w6ID
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIID2DCCAsACEQDQHkCLAAB3bQAAAAEAAAAEMA0GCSqGSIb3DQEBBQUAMIGp
-MQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBM
-YWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENv
-LjERMA8GA1UECxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIx
-ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODExMzAy
-MjQ2MTZaFw0wODExMjcyMjQ2MTZaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UE
-CBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0Rp
-Z2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMIRFNUQ0EgWDIx
-FjAUBgNVBAMTDURTVCBSb290Q0EgWDIxITAfBgkqhkiG9w0BCQEWEmNhQGRp
-Z3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
-ANx18IzAdZaawGIfJvfE4Zrq4FZzW5nNAUSoCLbVp9oaBBg5kkp4o4HC9Xd6
-ULRw/5qrxsfKboNPQpj7Jgva3G3WqZlVUmfpKAOS3OWwBZoPFflrWXJW8vo5
-/Kpo7g8fEIMv/J36F5bdguPmRX3AS4BEH+0s4IT9kVySVGkl5WJp3OXuAFK9
-MwutdQKFp2RQLcUZGTDAJtvJ0/0uma1ZtQtN1EGuhUhDWdy3qOKi3sOP17ih
-YqZoUFLkzzGnlIXan0YyF1bl8utmPRL/Q9uY73fPy4GNNLHGUEom0eQ+QVCv
-bK4iNC7Va26Dunm4dmVI2gkpZGMiuftHdoWMhkTLCdsCAwEAATANBgkqhkiG
-9w0BAQUFAAOCAQEAtTYOXeFhKFoRZcA/gwN5Tb4opgsHAlKFzfiR0BBstWog
-WxyQ2TA8xkieil5k+aFxd+8EJx8H6+Qm93N0yUQYGmbT4EOvkTvRyyzYdFQ6
-HE3K1GjNI3wdEJ5F6fYAbqbNGf9PLCmPV03Ed5K+4EwJ+11EhmYhqLkyolbV
-6YyDfFk/xPEL553snr2cGA4+wjl5KLcDDQjLxufZATdQEOzMYRZA1K8xdHv8
-PzGn0EdzMzkbzE5q10mDEQb+64JYMzJM8FasHpwvVpp7wUocpf1VNs78lk30
-sPDst2yC7S8xmUJMqbINuBVd8d+6ybVK1GSYsyapMMj9puyrliGtf8J4tg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UE
-ChMLRW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NB
-X0NQUyBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsT
-HChjKSAyMDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1
-c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAy
-MDcxNjE2NDBaFw0yMDAyMDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0
-Lm5ldDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29y
-cC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAg
-RW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2xp
-ZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQCTdLS25MVL1qFof2LV7PdRV7NySpj10InJrWPNTTVRaoTU
-rcloeW+46xHbh65cJFET8VQlhK8pK5/jgOLZy93GRUk0iJBeAZfv6lOm3fzB
-3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKklWb1m9fkn5JVn1j+SgF7y
-NH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHdBgNVHR8E
-gdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUAw
-PgYDVQQLFDd3d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSBy
-ZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0
-Lm5ldCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5ldCBDbGllbnQgQ2Vy
-dGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQw
-IoAPMjAwMDAyMDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQD
-AgEGMB8GA1UdIwQYMBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQW
-BBSEi3T9xY3A/ydtIDdFfP4tzrrTfTAMBgNVHRMEBTADAQH/MB0GCSqGSIb2
-fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQFAAOBgQBObzWA
-O9GK9Q6nIMstZVXQkvTnhLUGJoMShAusO7JE7r3PQNsgDrpuFOow4DtifH+L
-a3xKp9U1PL6oXOpLu5OOgGarDyn9TS2/GpsKkMWr2tGzhtQvJFJcem3G8v7l
-TRowjJDyutdKPkN+1MhQGof4T4HHdguEOnKdzmVml64mXg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UE
-ChMLRW50cnVzdC5uZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xf
-Q1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
-KGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVz
-dC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
-Fw0wMDAyMDQxNzIwMDBaFw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtF
-bnRydXN0Lm5ldDE/MD0GA1UECxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMg
-aW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykg
-MjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5l
-dCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0G
-CSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO8GCGD9JYf9Mzly0XonUw
-tZZkJi9ow0SrqHXmAGc0V55lxyKbc+bT3QgON1WqJUaBbL3+qPZ1V1eMkGxK
-wz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439PmrkDQYC2dWcTC5/oVzbI
-XQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4QgEBBAQD
-AgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoTC0Vu
-dHJ1c3QubmV0MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBp
-bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAy
-MDAwIEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0
-IFNlY3VyZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNV
-BAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIw
-NDE3NTAwMFowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc
-/vuLkpyw8m4iMB0GA1UdDgQWBBTLbMBr47s+y/winP77i5KcsPJuIjAMBgNV
-HRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkq
-hkiG9w0BAQQFAAOBgQBi24GRzsiad0Iv7L0no1MPUBvqTpLwqa+poLpIYcvv
-yQbvH9X07t9WLebKahlzqlO+krNQAraFJnJj2HVQYnUUt7NQGj/KEQALhUVp
-bbalrlHhStyCP2yMNLJ3a9kC9n8O6mUE8c1UyrrJzOCE98g+EZfTYAkYvAX/
-bIkz8OwVDw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UE
-ChMLRW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNf
-MjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsT
-HChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1
-c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEy
-MjQxNzUwNTFaFw0xOTEyMjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0
-Lm5ldDFAMD4GA1UECxQ3d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29y
-cC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDE5OTkg
-RW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2Vy
-dGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEF
-AAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4
-QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/EC
-DNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuXMlBvPci6Zgzj
-/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzWnLLP
-KQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZd
-enoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
-4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB
-0RGAvtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJ
-FrlwMB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0B
-AQUFAAOCAQEAWUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFh
-fGPjK50xA3B20qMooPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVU
-KcgF7bISKo30Axv/55IQh7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaoho
-wXkCIryqptau37AUX7iH0N18f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2
-+z7pnIkPFc4YsIV4IU9rTw76NmfNB/L/CNDi3tm/Kq+4h4YhPATKt5Rof888
-6ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVyvUxFnmG6v4SBkgPR0ml8xQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UE
-BhMCVVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50
-cnVzdC5uZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBs
-aW1pdHMgbGlhYi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExp
-bWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0
-aW9uIEF1dGhvcml0eTAeFw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBa
-MIHJMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNV
-BAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5mby9DUFMgaW5jb3Jw
-LiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMpIDE5OTkgRW50
-cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50
-IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GL
-ADCBhwKBgQDIOpleMRffrCdvkHvkGf9FozTC28GoT/Bo6oT9n3V5z8GKUZSv
-x1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGpOZ5V+Pux5zDeg7K6PvHV
-iTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zmAqTmT173
-iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSCARkw
-ggEVMIHkoIHhoIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50
-cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0Ff
-SW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UE
-CxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50
-cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYD
-VQQDEwRDUkwxMCygKqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9D
-bGllbnQxLmNybDArBgNVHRAEJDAigA8xOTk5MTAxMjE5MjQzMFqBDzIwMTkx
-MDEyMTkyNDMwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUxPucKXuXzUyW
-/O5bs8qZdIuV6kwwHQYDVR0OBBYEFMT7nCl7l81MlvzuW7PKmXSLlepMMAwG
-A1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
-hvcNAQEEBQADgYEAP66K8ddmAwWePvrqHEa7pFuPeJoSSJn59DXeDDYHAmsQ
-OokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6hURzzwy5E97BnRqqS5TvaHBkU
-ODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/aEkP/TOYGJqibGapE
-PHayXOw=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UE
-BhMCVVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50
-cnVzdC5uZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl
-MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UE
-AxMxRW50cnVzdC5uZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1
-dGhvcml0eTAeFw05OTA1MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQsw
-CQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3
-dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1pdHMgbGlh
-Yi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVkMTow
-OAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
-b24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQDNKIM0
-VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/I0dNxScZgSYMVHIN
-iC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3wkrYKZImZNHk
-mGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OCAdcwggHT
-MBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHboIHY
-pIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
-BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChs
-aW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBM
-aW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENl
-cnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNo
-dHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAi
-gA8xOTk5MDUyNTE2MDk0MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMC
-AQYwHwYDVR0jBBgwFoAU8BdiE1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYE
-FPAXYhNVPbP/CgBr+1CEl/PtYtAaMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9
-B0EABAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEFBQADgYEAkNwwAvpkdMKn
-CqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN95K+8cPV1ZVqBLssziY2Zcgx
-xufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd2cNgQ4xYDiKWL2KjLB+6
-rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQG
-EwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1
-cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4
-MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgx
-LTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0
-eTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2R
-FGiYCh7+2gRvE4RiIcPRfM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO
-/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuv
-K9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAGA1UdHwRp
-MGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEt
-MCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
-MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjAL
-BgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gjIBBPM5iQn9Qw
-HQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMBAf8w
-GgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GB
-AFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
-7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2u
-FHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJV
-UzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1
-aWZheCBTZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0
-MDAwMFoXDTIwMDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoT
-E0VxdWlmYXggU2VjdXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJl
-IEdsb2JhbCBlQnVzaW5lc3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAw
-gYkCgYEAuucXkAJlsTRVPEnCUdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQy
-td4zjTov2/KaelpzmKNc6fuKcxtc58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORR
-OhI8bIpaVIRw28HFkM9yRcuoWcDNM50/o5brhTMhHD4ePmBudpxnhcXIw2EC
-AwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAHMA8GA1UdEwEB/wQFMAMBAf8w
-HwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1draGwwHQYDVR0OBBYEFL6o
-oHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUAA4GBADDiAVGqx+pf
-2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkAZ70Br83gcfxa
-z2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv8qIYNMR1
-pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJV
-UzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1
-aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcN
-MjAwNjIxMDQwMDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZh
-eCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2lu
-ZXNzIENBLTEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fe
-k6lfWg0XTzQaDJj0ItlZ1MRoRvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5
-/VGcqiTZ9J2DKocKIdMSODRsjQBuWqDZQu4aIZX5UkxVWsUPOE9G+m34LjXW
-HXzr4vCwdYDIqROsvojvOm6rXyo4YgKwEnv+j6YDAgMBAAGjZjBkMBEGCWCG
-SAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFEp4
-MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRKeDJSEdtZFjZe38EUNkBq
-R3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZMzfmpTMANmvPMZWnm
-JXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+WB5Hh1Q+WKG1
-tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN/Bf+KpYr
-tWKmpj29f5JZzVoqgrI3eQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQG
-EwJVUzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlm
-YXggU2VjdXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5
-MDYyMzEyMTQ0NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXgg
-U2VjdXJlMSYwJAYDVQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0Et
-MjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF
-7Y6yEb3+6+e0dMKP/wXn2Z0GvxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKD
-pkWNYmi7hRsgcDKqQM2mll/EcTc/BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HM
-HMg3OrmXUqesxWoklE6ce8/AatbfIb0CAwEAAaOCAQkwggEFMHAGA1UdHwRp
-MGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORXF1aWZheCBT
-ZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJlIGVCdXNpbmVzcyBDQS0y
-MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkwNjIzMTIxNDQ1WjAL
-BgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBqy/3YIHqngnYw
-HQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQFMAMBAf8w
-GgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GB
-AAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy
-0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkt
-y3D1E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgw
-FgYDVQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRy
-dXN0IFNvbHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3Qg
-R2xvYmFsIFJvb3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1
-MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYD
-VQQLEx5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMT
-GkdURSBDeWJlclRydXN0IEdsb2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUA
-A4GNADCBiQKBgQCVD6C28FCc6HrHiM3dFw4usJTQGz0O9pTAipTHBsiQl8i4
-ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTSr41tiGeA5u2ylc9yMcqlHHK6XALn
-ZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X404Wqk2kmhXBIgD8SFcd5tB8F
-LztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3rGwnpXtlR22ciYaQqPEh3
-46B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l93PR2VX2bY1QY6fDq
-81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0PlZPvy5TYnh+d
-XIVtx6quTx8itc2VrbqnzPmrC3p/
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIB+jCCAWMCAgGjMA0GCSqGSIb3DQEBBAUAMEUxCzAJBgNVBAYTAlVTMRgw
-FgYDVQQKEw9HVEUgQ29ycG9yYXRpb24xHDAaBgNVBAMTE0dURSBDeWJlclRy
-dXN0IFJvb3QwHhcNOTYwMjIzMjMwMTAwWhcNMDYwMjIzMjM1OTAwWjBFMQsw
-CQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMRwwGgYDVQQD
-ExNHVEUgQ3liZXJUcnVzdCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB
-iQKBgQC45k+625h8cXyvRLfTD0bZZOWTwUKOx7pJjTUteueLveUFMVnGsS8K
-DPufpz+iCWaEVh43KRuH6X4MypqfpX/1FZSj1aJGgthoTNE3FQZor734sLPw
-KfWVWgkWYXcKIiXUT0Wqx73llt/51KiOQswkwB6RJ0q1bQaAYznEol44AwID
-AQABMA0GCSqGSIb3DQEBBAUAA4GBABKzdcZfHeFhVYAA1IFLezEPI2PnPfMD
-+fQ2qLvZ46WXTeorKeDWanOB5sCJo9Px4KWlIjeaY8JIILTbcuPI9tl8vrGv
-U9oUtCG41tWW4/5ODFlitppK+ULdjG+BqXH/9ApybW1EDp3zdHSo1TRJ6V6e
-6bR64eVaH4QwnNOfpSXY
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYT
-AlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVz
-dCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBC
-MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UE
-AxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
-MIIBCgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEH
-CIjaWC9mOSm9BXiLnTjoBbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlC
-GDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet8u5fa9IAjbkU+BQVNdnARqN7
-csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+VcT4wt/lAj
-Nvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdRe
-JivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQAB
-o1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9
-qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1luMrMTjANBgkq
-hkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Qzxpe
-R+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWV
-Yrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
-PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot
-2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeX
-xx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm
-Mw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDdTCCAl2gAwIBAgILAgAAAAAA1ni3lAUwDQYJKoZIhvcNAQEEBQAwVzEL
-MAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNV
-BAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05
-ODA5MDExMjAwMDBaFw0xNDAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkw
-FwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRsw
-GQYDVQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUA
-A4IBDwAwggEKAoIBAQDaDuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR
-4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc
-71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4
-bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgK
-OOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMW
-ea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DP
-AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIABjAdBgNVHQ4EFgQUYHtmGkUNl8qJ
-UC99BM00qP/8/UswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOC
-AQEArqqf/LfSyx9fOSkoGJ40yWxPbxrwZKJwSk8ThptgKJ7ogUmYfQq75bCd
-PTbbjwVR/wkxKh/diXeeDy5slQTthsu0AD+EAk2AaioteAuubyuig0SDH81Q
-gkwkr733pbTIWg/050deSY43lv6aiAU62cDbKYfmGZZHpzqmjIs8d/5GY6dT
-2iHRrH5Jokvmw2dZL7OKDrssvamqQnw1wdh/1acxOk5jQzmvCLBhNIzTmKlD
-NPYPhyk7ncJWWJh3w/cbrPad+D6qp1RF8PX51TFl/mtYnHGzHtdS6jIX/EBg
-Hcl5JLL2bP2oZg6C3ZjL2sJETy6ge/L3ayx2EYRGinij4w==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD
-ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu
-Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRp
-b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv
-bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy
-NjAwMjIzM1oXDTE5MDYyNjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
-IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x
-NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24g
-QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x
-IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3
-DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfDcnWTq8+epvzzFlLWLU2f
-NUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs2Ejcv8ECIMYkpChM
-MFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqYJJgpp0lZpd34
-t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliEZwgs3x/b
-e0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJn0Wu
-PIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A
+MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
+RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
+VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX
+DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y
+ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy
+VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr
+mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr
+IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK
+mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu
+XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy
+dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye
+jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1
+BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3
+DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92
+9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx
+jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0
+Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz
+ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS
+R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIDKTCCApKgAwIBAgIENnAVljANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV
+UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL
+EwhEU1RDQSBFMTAeFw05ODEyMTAxODEwMjNaFw0xODEyMTAxODQwMjNaMEYxCzAJ
+BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x
+ETAPBgNVBAsTCERTVENBIEUxMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCg
+bIGpzzQeJN3+hijM3oMv+V7UQtLodGBmE5gGHKlREmlvMVW5SXIACH7TpWJENySZ
+j9mDSI+ZbZUTu0M7LklOiDfBu1h//uG9+LthzfNHwJmm8fOR6Hh8AMthyUQncWlV
+Sn5JTe2io74CTADKAqjuAQIxZA9SLRN0dja1erQtcQIBA6OCASQwggEgMBEGCWCG
+SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx
+JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI
+RFNUQ0EgRTExDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMTAxODEw
+MjNagQ8yMDE4MTIxMDE4MTAyM1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFGp5
+fpFpRhgTCgJ3pVlbYJglDqL4MB0GA1UdDgQWBBRqeX6RaUYYEwoCd6VZW2CYJQ6i
++DAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG
+SIb3DQEBBQUAA4GBACIS2Hod3IEGtgllsofIH160L+nEHvI8wbsEkBFKg05+k7lN
+QseSJqBcNJo4cvj9axY+IO6CizEqkzaFI4iKPANo08kJD038bKTaKHKTDomAsH3+
+gG9lbRgzl4vCa4nuYD3Im+9/KzJic5PLPON74nZ4RbyhkwS7hp86W0N6w4pl
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIID2DCCAsACEQDQHkCLAAACfAAAAAIAAAABMA0GCSqGSIb3DQEBBQUAMIGpMQsw
+CQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENp
+dHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UE
+CxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDExITAfBgkqhkiG9w0B
+CQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODEyMDExODE4NTVaFw0wODExMjgx
+ODE4NTVaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMO
+U2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0
+IENvLjERMA8GA1UECxMIRFNUQ0EgWDExFjAUBgNVBAMTDURTVCBSb290Q0EgWDEx
+ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBANLGJrbnpT3BxGjVUG9TxW9JEwm4ryxIjRRqoxdf
+WvnTLnUv2Chi0ZMv/E3Uq4flCMeZ55I/db3rJbQVwZsZPdJEjdd0IG03Ao9pk1uK
+xBmd9LIO/BZsubEFkoPRhSxglD5FVaDZqwgh5mDoO3TymVBRaNADLbGAvqPYUrBE
+zUNKcI5YhZXhTizWLUFv1oTnyJhEykfbLCSlaSbPa7gnYsP0yXqSI+0TZ4KuRS5F
+5X5yP4WdlGIQ5jyRoa13AOAV7POEgHJ6jm5gl8ckWRA0g1vhpaRptlc1HHhZxtMv
+OnNn7pTKBBMFYgZwI7P0fO5F2WQLW0mqpEPOJsREEmy43XkCAwEAATANBgkqhkiG
+9w0BAQUFAAOCAQEAojeyP2n714Z5VEkxlTMr89EJFEliYIalsBHiUMIdBlc+Legz
+ZL6bqq1fG03UmZWii5rJYnK1aerZWKs17RWiQ9a2vAd5ZWRzfdd5ynvVWlHG4VME
+lo04z6MXrDlxawHDi1M8Y+nuecDkvpIyZHqzH5eUYr3qsiAVlfuX8ngvYzZAOONG
+Dx3drJXK50uQe7FLqdTF65raqtWjlBRGjS0f8zrWkzr2Pnn86Oawde3uPclwx12q
+gUtGJRzHbBXjlU4PqjI3lAoXJJIThFjSY28r9+ZbYgsTF7ANUkz+/m9c4pFuHf2k
+Ytdo+o56T9II2pPc8JIRetDccpMMc5NihWjQ9A==
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIDKTCCApKgAwIBAgIENm7TzjANBgkqhkiG9w0BAQUFADBGMQswCQYDVQQGEwJV
+UzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMREwDwYDVQQL
+EwhEU1RDQSBFMjAeFw05ODEyMDkxOTE3MjZaFw0xODEyMDkxOTQ3MjZaMEYxCzAJ
+BgNVBAYTAlVTMSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4x
+ETAPBgNVBAsTCERTVENBIEUyMIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQC/
+k48Xku8zExjrEH9OFr//Bo8qhbxe+SSmJIi2A7fBw18DW9Fvrn5C6mYjuGODVvso
+LeE4i7TuqAHhzhy2iCoiRoX7n6dwqUcUP87eZfCocfdPJmyMvMa1795JJ/9IKn3o
+TQPMx7JSxhcxEzu1TdvIxPbDDyQq2gyd55FbgM2UnQIBA6OCASQwggEgMBEGCWCG
+SAGG+EIBAQQEAwIABzBoBgNVHR8EYTBfMF2gW6BZpFcwVTELMAkGA1UEBhMCVVMx
+JDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UECxMI
+RFNUQ0EgRTIxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMTk5ODEyMDkxOTE3
+MjZagQ8yMDE4MTIwOTE5MTcyNlowCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFB6C
+TShlgDzJQW6sNS5ay97u+DlbMB0GA1UdDgQWBBQegk0oZYA8yUFurDUuWsve7vg5
+WzAMBgNVHRMEBTADAQH/MBkGCSqGSIb2fQdBAAQMMAobBFY0LjADAgSQMA0GCSqG
+SIb3DQEBBQUAA4GBAEeNg61i8tuwnkUiBbmi1gMOOHLnnvx75pO2mqWilMg0HZHR
+xdf0CiUPPXiBng+xZ8SQTGPdXqfiup/1902lMXucKS1M/mQ+7LZT/uqb7YLbdHVL
+B3luHtgZg3Pe9T7Qtd7nS2h9Qy4qIOF+oHhEngj1mPnHfxsb1gYgAlihw6ID
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIID2DCCAsACEQDQHkCLAAB3bQAAAAEAAAAEMA0GCSqGSIb3DQEBBQUAMIGpMQsw
+CQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMOU2FsdCBMYWtlIENp
+dHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0IENvLjERMA8GA1UE
+CxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIxITAfBgkqhkiG9w0B
+CQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTAeFw05ODExMzAyMjQ2MTZaFw0wODExMjcy
+MjQ2MTZaMIGpMQswCQYDVQQGEwJ1czENMAsGA1UECBMEVXRhaDEXMBUGA1UEBxMO
+U2FsdCBMYWtlIENpdHkxJDAiBgNVBAoTG0RpZ2l0YWwgU2lnbmF0dXJlIFRydXN0
+IENvLjERMA8GA1UECxMIRFNUQ0EgWDIxFjAUBgNVBAMTDURTVCBSb290Q0EgWDIx
+ITAfBgkqhkiG9w0BCQEWEmNhQGRpZ3NpZ3RydXN0LmNvbTCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBANx18IzAdZaawGIfJvfE4Zrq4FZzW5nNAUSoCLbV
+p9oaBBg5kkp4o4HC9Xd6ULRw/5qrxsfKboNPQpj7Jgva3G3WqZlVUmfpKAOS3OWw
+BZoPFflrWXJW8vo5/Kpo7g8fEIMv/J36F5bdguPmRX3AS4BEH+0s4IT9kVySVGkl
+5WJp3OXuAFK9MwutdQKFp2RQLcUZGTDAJtvJ0/0uma1ZtQtN1EGuhUhDWdy3qOKi
+3sOP17ihYqZoUFLkzzGnlIXan0YyF1bl8utmPRL/Q9uY73fPy4GNNLHGUEom0eQ+
+QVCvbK4iNC7Va26Dunm4dmVI2gkpZGMiuftHdoWMhkTLCdsCAwEAATANBgkqhkiG
+9w0BAQUFAAOCAQEAtTYOXeFhKFoRZcA/gwN5Tb4opgsHAlKFzfiR0BBstWogWxyQ
+2TA8xkieil5k+aFxd+8EJx8H6+Qm93N0yUQYGmbT4EOvkTvRyyzYdFQ6HE3K1GjN
+I3wdEJ5F6fYAbqbNGf9PLCmPV03Ed5K+4EwJ+11EhmYhqLkyolbV6YyDfFk/xPEL
+553snr2cGA4+wjl5KLcDDQjLxufZATdQEOzMYRZA1K8xdHv8PzGn0EdzMzkbzE5q
+10mDEQb+64JYMzJM8FasHpwvVpp7wUocpf1VNs78lk30sPDst2yC7S8xmUJMqbIN
+uBVd8d+6ybVK1GSYsyapMMj9puyrliGtf8J4tg==
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIEgzCCA+ygAwIBAgIEOJ725DANBgkqhkiG9w0BAQQFADCBtDEUMBIGA1UEChML
+RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9HQ0NBX0NQUyBp
+bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw
+IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENsaWVu
+dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDcxNjE2NDBaFw0yMDAy
+MDcxNjQ2NDBaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
+LmVudHJ1c3QubmV0L0dDQ0FfQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
+YWIuKTElMCMGA1UECxMcKGMpIDIwMDAgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
+A1UEAxMqRW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCTdLS25MVL1qFof2LV7PdRV7Ny
+Spj10InJrWPNTTVRaoTUrcloeW+46xHbh65cJFET8VQlhK8pK5/jgOLZy93GRUk0
+iJBeAZfv6lOm3fzB3ksqJeTpNfpVBQbliXrqpBFXO/x8PTbNZzVtpKklWb1m9fkn
+5JVn1j+SgF7yNH0rhQIDAQABo4IBnjCCAZowEQYJYIZIAYb4QgEBBAQDAgAHMIHd
+BgNVHR8EgdUwgdIwgc+ggcyggcmkgcYwgcMxFDASBgNVBAoTC0VudHJ1c3QubmV0
+MUAwPgYDVQQLFDd3d3cuZW50cnVzdC5uZXQvR0NDQV9DUFMgaW5jb3JwLiBieSBy
+ZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5l
+dCBMaW1pdGVkMTMwMQYDVQQDEypFbnRydXN0Lm5ldCBDbGllbnQgQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMDAy
+MDcxNjE2NDBagQ8yMDIwMDIwNzE2NDY0MFowCwYDVR0PBAQDAgEGMB8GA1UdIwQY
+MBaAFISLdP3FjcD/J20gN0V8/i3OutN9MB0GA1UdDgQWBBSEi3T9xY3A/ydtIDdF
+fP4tzrrTfTAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4w
+AwIEkDANBgkqhkiG9w0BAQQFAAOBgQBObzWAO9GK9Q6nIMstZVXQkvTnhLUGJoMS
+hAusO7JE7r3PQNsgDrpuFOow4DtifH+La3xKp9U1PL6oXOpLu5OOgGarDyn9TS2/
+GpsKkMWr2tGzhtQvJFJcem3G8v7lTRowjJDyutdKPkN+1MhQGof4T4HHdguEOnKd
+zmVml64mXg==
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIElTCCA/6gAwIBAgIEOJsRPDANBgkqhkiG9w0BAQQFADCBujEUMBIGA1UEChML
+RW50cnVzdC5uZXQxPzA9BgNVBAsUNnd3dy5lbnRydXN0Lm5ldC9TU0xfQ1BTIGlu
+Y29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMcKGMpIDIwMDAg
+RW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5uZXQgU2VjdXJl
+IFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMDAyMDQxNzIwMDBa
+Fw0yMDAyMDQxNzUwMDBaMIG6MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDE/MD0GA1UE
+CxQ2d3d3LmVudHJ1c3QubmV0L1NTTF9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p
+dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMjAwMCBFbnRydXN0Lm5ldCBMaW1pdGVk
+MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
+b24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDHwV9OcfHO
+8GCGD9JYf9Mzly0XonUwtZZkJi9ow0SrqHXmAGc0V55lxyKbc+bT3QgON1WqJUaB
+bL3+qPZ1V1eMkGxKwz6LS0MKyRFWmponIpnPVZ5h2QLifLZ8OAfc439PmrkDQYC2
+dWcTC5/oVzbIXQA23mYU2m52H083jIITiQIDAQABo4IBpDCCAaAwEQYJYIZIAYb4
+QgEBBAQDAgAHMIHjBgNVHR8EgdswgdgwgdWggdKggc+kgcwwgckxFDASBgNVBAoT
+C0VudHJ1c3QubmV0MT8wPQYDVQQLFDZ3d3cuZW50cnVzdC5uZXQvU1NMX0NQUyBp
+bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAyMDAw
+IEVudHJ1c3QubmV0IExpbWl0ZWQxOjA4BgNVBAMTMUVudHJ1c3QubmV0IFNlY3Vy
+ZSBTZXJ2ZXIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxDTALBgNVBAMTBENSTDEw
+KwYDVR0QBCQwIoAPMjAwMDAyMDQxNzIwMDBagQ8yMDIwMDIwNDE3NTAwMFowCwYD
+VR0PBAQDAgEGMB8GA1UdIwQYMBaAFMtswGvjuz7L/CKc/vuLkpyw8m4iMB0GA1Ud
+DgQWBBTLbMBr47s+y/winP77i5KcsPJuIjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2
+fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQQFAAOBgQBi24GRzsia
+d0Iv7L0no1MPUBvqTpLwqa+poLpIYcvvyQbvH9X07t9WLebKahlzqlO+krNQAraF
+JnJj2HVQYnUUt7NQGj/KEQALhUVpbbalrlHhStyCP2yMNLJ3a9kC9n8O6mUE8c1U
+yrrJzOCE98g+EZfTYAkYvAX/bIkz8OwVDw==
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIEXDCCA0SgAwIBAgIEOGO5ZjANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
+RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
+bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
+IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0xOTEy
+MjQxODIwNTFaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
+LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
+YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
+A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq
+K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe
+sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX
+MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT
+XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/
+HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
+4QIDAQABo3QwcjARBglghkgBhvhCAQEEBAMCAAcwHwYDVR0jBBgwFoAUVeSB0RGA
+vtiJuQijMfmhJAkWuXAwHQYDVR0OBBYEFFXkgdERgL7YibkIozH5oSQJFrlwMB0G
+CSqGSIb2fQdBAAQQMA4bCFY1LjA6NC4wAwIEkDANBgkqhkiG9w0BAQUFAAOCAQEA
+WUesIYSKF8mciVMeuoCFGsY8Tj6xnLZ8xpJdGGQC49MGCBFhfGPjK50xA3B20qMo
+oPS7mmNz7W3lKtvtFKkrxjYR0CvrB4ul2p5cGZ1WEvVUKcgF7bISKo30Axv/55IQ
+h7A6tcOdBTcSo8f0FbnVpDkWm1M6I5HxqIKiaohowXkCIryqptau37AUX7iH0N18
+f3v/rxzP5tsHrV7bhZ3QKw0z2wTR5klAEyt2+z7pnIkPFc4YsIV4IU9rTw76NmfN
+B/L/CNDi3tm/Kq+4h4YhPATKt5Rof8886ZjXOP/swNlQ8C5LWK5Gb9Auw2DaclVy
+vUxFnmG6v4SBkgPR0ml8xQ==
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIE7TCCBFagAwIBAgIEOAOR7jANBgkqhkiG9w0BAQQFADCByTELMAkGA1UEBhMC
+VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MUgwRgYDVQQLFD93d3cuZW50cnVzdC5u
+ZXQvQ2xpZW50X0NBX0luZm8vQ1BTIGluY29ycC4gYnkgcmVmLiBsaW1pdHMgbGlh
+Yi4xJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV
+BAMTKkVudHJ1c3QubmV0IENsaWVudCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
+Fw05OTEwMTIxOTI0MzBaFw0xOTEwMTIxOTU0MzBaMIHJMQswCQYDVQQGEwJVUzEU
+MBIGA1UEChMLRW50cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9D
+bGllbnRfQ0FfSW5mby9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjEl
+MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMq
+RW50cnVzdC5uZXQgQ2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0G
+CSqGSIb3DQEBAQUAA4GLADCBhwKBgQDIOpleMRffrCdvkHvkGf9FozTC28GoT/Bo
+6oT9n3V5z8GKUZSvx1cDR2SerYIbWtp/N3hHuzeYEpbOxhN979IMMFGpOZ5V+Pux
+5zDeg7K6PvHViTs7hbqqdCz+PzFur5GVbgbUB01LLFZHGARS2g4Qk79jkJvh34zm
+AqTmT173iwIBA6OCAeAwggHcMBEGCWCGSAGG+EIBAQQEAwIABzCCASIGA1UdHwSC
+ARkwggEVMIHkoIHhoIHepIHbMIHYMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50
+cnVzdC5uZXQxSDBGBgNVBAsUP3d3dy5lbnRydXN0Lm5ldC9DbGllbnRfQ0FfSW5m
+by9DUFMgaW5jb3JwLiBieSByZWYuIGxpbWl0cyBsaWFiLjElMCMGA1UECxMcKGMp
+IDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5uZXQg
+Q2xpZW50IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCyg
+KqAohiZodHRwOi8vd3d3LmVudHJ1c3QubmV0L0NSTC9DbGllbnQxLmNybDArBgNV
+HRAEJDAigA8xOTk5MTAxMjE5MjQzMFqBDzIwMTkxMDEyMTkyNDMwWjALBgNVHQ8E
+BAMCAQYwHwYDVR0jBBgwFoAUxPucKXuXzUyW/O5bs8qZdIuV6kwwHQYDVR0OBBYE
+FMT7nCl7l81MlvzuW7PKmXSLlepMMAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EA
+BAwwChsEVjQuMAMCBJAwDQYJKoZIhvcNAQEEBQADgYEAP66K8ddmAwWePvrqHEa7
+pFuPeJoSSJn59DXeDDYHAmsQOokUgZwxpnyyQbJq5wcBoUv5nyU7lsqZwz6hURzz
+wy5E97BnRqqS5TvaHBkUODDV4qIxJS7x7EU47fgGWANzYrAQMY9Av2TgXD7FTx/a
+EkP/TOYGJqibGapEPHayXOw=
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
+VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
+ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
+KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
+ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1
+MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE
+ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j
+b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
+bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg
+U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA
+A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/
+I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3
+wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC
+AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb
+oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
+BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p
+dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk
+MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
+b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
+dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0
+MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi
+E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa
+MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
+hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN
+95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd
+2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
+UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
+dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
+MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
+dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
+AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
+BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
+cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
+AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
+MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
+aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
+ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
+IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
+MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
+A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
+7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
+1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc
+MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT
+ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw
+MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj
+dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l
+c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC
+UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc
+58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/
+o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH
+MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr
+aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA
+A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA
+Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv
+8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc
+MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT
+ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw
+MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j
+LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ
+KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo
+RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu
+WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw
+Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD
+AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK
+eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM
+zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+
+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN
+/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ==
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAomgAwIBAgIEN3DPtTANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
+UzEXMBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2Vj
+dXJlIGVCdXNpbmVzcyBDQS0yMB4XDTk5MDYyMzEyMTQ0NVoXDTE5MDYyMzEyMTQ0
+NVowTjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDkVxdWlmYXggU2VjdXJlMSYwJAYD
+VQQLEx1FcXVpZmF4IFNlY3VyZSBlQnVzaW5lc3MgQ0EtMjCBnzANBgkqhkiG9w0B
+AQEFAAOBjQAwgYkCgYEA5Dk5kx5SBhsoNviyoynF7Y6yEb3+6+e0dMKP/wXn2Z0G
+vxLIPw7y1tEkshHe0XMJitSxLJgJDR5QRrKDpkWNYmi7hRsgcDKqQM2mll/EcTc/
+BPO3QSQ5BxoeLmFYoBIL5aXfxavqN3HMHMg3OrmXUqesxWoklE6ce8/AatbfIb0C
+AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEX
+MBUGA1UEChMORXF1aWZheCBTZWN1cmUxJjAkBgNVBAsTHUVxdWlmYXggU2VjdXJl
+IGVCdXNpbmVzcyBDQS0yMQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTkw
+NjIzMTIxNDQ1WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUUJ4L6q9euSBIplBq
+y/3YIHqngnYwHQYDVR0OBBYEFFCeC+qvXrkgSKZQasv92CB6p4J2MAwGA1UdEwQF
+MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
+A4GBAAyGgq3oThr1jokn4jVYPSm0B482UJW/bsGe68SQsoWou7dC4A8HOd/7npCy
+0cE+U58DRLB+S/Rv5Hwf5+Kx5Lia78O9zt4LMjTZ3ijtM2vE1Nc9ElirfQkty3D1
+E4qUoSek1nDFbZS1yX2doNLGCEnZZpum0/QL3MUmV+GRMOrN
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD
+VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv
+bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv
+b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV
+UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
+cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
+b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH
+iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS
+r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4
+04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r
+GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9
+3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P
+lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIB+jCCAWMCAgGjMA0GCSqGSIb3DQEBBAUAMEUxCzAJBgNVBAYTAlVTMRgwFgYD
+VQQKEw9HVEUgQ29ycG9yYXRpb24xHDAaBgNVBAMTE0dURSBDeWJlclRydXN0IFJv
+b3QwHhcNOTYwMjIzMjMwMTAwWhcNMDYwMjIzMjM1OTAwWjBFMQswCQYDVQQGEwJV
+UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMRwwGgYDVQQDExNHVEUgQ3liZXJU
+cnVzdCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC45k+625h8cXyv
+RLfTD0bZZOWTwUKOx7pJjTUteueLveUFMVnGsS8KDPufpz+iCWaEVh43KRuH6X4M
+ypqfpX/1FZSj1aJGgthoTNE3FQZor734sLPwKfWVWgkWYXcKIiXUT0Wqx73llt/5
+1KiOQswkwB6RJ0q1bQaAYznEol44AwIDAQABMA0GCSqGSIb3DQEBBAUAA4GBABKz
+dcZfHeFhVYAA1IFLezEPI2PnPfMD+fQ2qLvZ46WXTeorKeDWanOB5sCJo9Px4KWl
+IjeaY8JIILTbcuPI9tl8vrGvU9oUtCG41tWW4/5ODFlitppK+ULdjG+BqXH/9Apy
+bW1EDp3zdHSo1TRJ6V6e6bR64eVaH4QwnNOfpSXY
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
+MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
+YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
+R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
+9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
+fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
+iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
+1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
+MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
+ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
+uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
+Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
+tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
+PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
+hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
+5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIDdTCCAl2gAwIBAgILAgAAAAAA1ni3lAUwDQYJKoZIhvcNAQEEBQAwVzELMAkG
+A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
+b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
+MDBaFw0xNDAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
+YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
+aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
+jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
+xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
+1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
+snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
+U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
+9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIABjAdBgNVHQ4EFgQU
+YHtmGkUNl8qJUC99BM00qP/8/UswDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B
+AQQFAAOCAQEArqqf/LfSyx9fOSkoGJ40yWxPbxrwZKJwSk8ThptgKJ7ogUmYfQq7
+5bCdPTbbjwVR/wkxKh/diXeeDy5slQTthsu0AD+EAk2AaioteAuubyuig0SDH81Q
+gkwkr733pbTIWg/050deSY43lv6aiAU62cDbKYfmGZZHpzqmjIs8d/5GY6dT2iHR
+rH5Jokvmw2dZL7OKDrssvamqQnw1wdh/1acxOk5jQzmvCLBhNIzTmKlDNPYPhyk7
+ncJWWJh3w/cbrPad+D6qp1RF8PX51TFl/mtYnHGzHtdS6jIX/EBgHcl5JLL2bP2o
+Zg6C3ZjL2sJETy6ge/L3ayx2EYRGinij4w==
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
+IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
+BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
+aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
+9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy
+NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
+azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
+Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
+cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD
+cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs
+2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY
+JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE
+Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ
+n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A
PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu
-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUFADA6
+MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp
+dHkgMTAyNCBWMzAeFw0wMTAyMjIyMTAxNDlaFw0yNjAyMjIyMDAxNDlaMDoxGTAX
+BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAx
+MDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDV3f5mCc8kPD6ugU5O
+isRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dYrIMKo1W1exeQFYRMiu4mmdxY
+78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYtbzZUaMjShFbuklNhCbM/OZuoyZu9
+zp9+1BlqFikYvtc6adwlWzMaUQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4G
+A1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAd
+BgNVHQ4EFgQUxMAcpAeU/c1NAdRU2qUMX96uBVowDQYJKoZIhvcNAQEFBQADgYEA
+Py1q4yZDlX2Jl2X7deRyHUZXxGFraZ8SmyzVWujAovBDleMf6XbN3Ou8k6BlCsdN
+T1+nr6JGFLkM88y9am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNumU4/iXgD
+mMrzVcydro7BqkWY+o8aoI2II/EVQQ2lRj6RP4vr93E=
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6
+MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp
+dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX
+BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy
+MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp
+eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg
+/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl
+wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh
+AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2
+PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu
+AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR
+MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc
+HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/
+Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+
+f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO
+rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch
+6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3
+7CAFYd4=
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRF
+MRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFU
+QyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJI
+MSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAyIENBMSkwJwYJKoZIhvcN
+AQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05ODAzMDkxMTU5NTla
+Fw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVy
+ZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9y
+IFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1
+c3RDZW50ZXIgQ2xhc3MgMiBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVA
+dHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANo46O0y
+AClxgwENv4wB3NrGrTmkqYov1YtcaF9QxmL1Zr3KkSLsqh1R1z2zUbKDTl3LSbDw
+TFXlay3HhQswHJJOgtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5Nu6hLVxa8
+/vhYnvgpjbB7zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQF
+MAMBAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3
+LnRydXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G
+CSqGSIb3DQEBBAUAA4GBAIRS+yjf/x91AbwBvgRWl2p0QiQxg/lGsQaKic+WLDO/
+jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ29ELw+HkuCkhcq8xRT3h2oNms
+Gb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/AcASZ4smZHcFFk
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYTAkRF
+MRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYDVQQKEzFU
+QyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3b3JrcyBHbWJI
+MSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAzIENBMSkwJwYJKoZIhvcN
+AQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAeFw05ODAzMDkxMTU5NTla
+Fw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJERTEQMA4GA1UECBMHSGFtYnVy
+ZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UEChMxVEMgVHJ1c3RDZW50ZXIgZm9y
+IFNlY3VyaXR5IGluIERhdGEgTmV0d29ya3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1
+c3RDZW50ZXIgQ2xhc3MgMyBDQTEpMCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVA
+dHJ1c3RjZW50ZXIuZGUwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALa0wTUF
+Lg2N7KBAahwOJ6ZQkmtQGwfeLud2zODa/ISoXoxjaitN2U4CdhHBC/KNecoAtvGw
+Dtf7pBc9r6tpepYnv68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+77uMMfTDW
+w1Krj10nnGvAo+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQF
+MAMBAf8wDgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3
+LnRydXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G
+CSqGSIb3DQEBBAUAA4GBABY9xs3Bu4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4iJIE
+Tb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm5gZOngylerpuw3yCGdHHsbHD
+2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQSCdS7kjXvD9s0
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMCWkEx
+FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD
+VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT
+ZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBlcnNvbmFsIEJhc2lj
+IENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNpY0B0aGF3dGUuY29tMB4X
+DTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgcsxCzAJBgNVBAYTAlpBMRUw
+EwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UE
+ChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2Vy
+dmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBD
+QTEoMCYGCSqGSIb3DQEJARYZcGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzAN
+BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53
+dXLdjUmbllegeNTKP1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdK
+wPQIcOk8RHtQfmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7
+G1sY0b8jkyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQF
+AAOBgQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7
+c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95B21P
+9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ==
+-----END CERTIFICATE-----
+
-----BEGIN CERTIFICATE-----
-MIICXDCCAcWgAwIBAgIQCgEBAQAAAnwAAAALAAAAAjANBgkqhkiG9w0BAQUF
-ADA6MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0Eg
-U2VjdXJpdHkgMTAyNCBWMzAeFw0wMTAyMjIyMTAxNDlaFw0yNjAyMjIyMDAx
-NDlaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJT
-QSBTZWN1cml0eSAxMDI0IFYzMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
-gQDV3f5mCc8kPD6ugU5OisRpgFtZO9+5TUzKtS3DJy08rwBCbbwoppbPf9dY
-rIMKo1W1exeQFYRMiu4mmdxY78c4pqqv0I5CyGLXq6yp+0p9v+r+Ek3d/yYt
-bzZUaMjShFbuklNhCbM/OZuoyZu9zp9+1BlqFikYvtc6adwlWzMaUQIDAQAB
-o2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSME
-GDAWgBTEwBykB5T9zU0B1FTapQxf3q4FWjAdBgNVHQ4EFgQUxMAcpAeU/c1N
-AdRU2qUMX96uBVowDQYJKoZIhvcNAQEFBQADgYEAPy1q4yZDlX2Jl2X7deRy
-HUZXxGFraZ8SmyzVWujAovBDleMf6XbN3Ou8k6BlCsdNT1+nr6JGFLkM88y9
-am63nd4lQtBU/55oc2PcJOsiv6hy8l4A4Q1OOkNumU4/iXgDmMrzVcydro7B
-qkWY+o8aoI2II/EVQQ2lRj6RP4vr93E=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUF
-ADA6MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0Eg
-U2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5
-MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJT
-QSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
-CgKCAQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37
-RqtBaB4Y6lXIL5F4iSj7Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E
-0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J
-6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iHKrtjEAMq
-s6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzD
-uvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2Mw
-YTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAW
-gBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NRMKSq6UWuNST6
-/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmYv/3V
-EhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5g
-EydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+
-f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJq
-aHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEk
-llgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA
-pKnXwiJPZ9d37CAFYd4=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDXDCCAsWgAwIBAgICA+owDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYT
-AkRFMRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYD
-VQQKEzFUQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3
-b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAyIENB
-MSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAe
-Fw05ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJE
-RTEQMA4GA1UECBMHSGFtYnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UE
-ChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3VyaXR5IGluIERhdGEgTmV0d29y
-a3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTEp
-MCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8w
-DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANo46O0yAClxgwENv4wB3NrGrTmk
-qYov1YtcaF9QxmL1Zr3KkSLsqh1R1z2zUbKDTl3LSbDwTFXlay3HhQswHJJO
-gtTKAu33b77c4OMUuAVT8pr0VotanoWT0bSCVq5Nu6hLVxa8/vhYnvgpjbB7
-zXjJT6yLZwzxnPv8V5tXXE8NAgMBAAGjazBpMA8GA1UdEwEB/wQFMAMBAf8w
-DgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRy
-dXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G
-CSqGSIb3DQEBBAUAA4GBAIRS+yjf/x91AbwBvgRWl2p0QiQxg/lGsQaKic+W
-LDO/jLVfenKhhQbOhvgFjuj5Jcrag4wGrOs2bYWRNAQ29ELw+HkuCkhcq8xR
-T3h2oNmsGb0q0WkEKJHKNhAngFdb0lz1wlurZIFjdFH0l7/NEij3TWZ/p/Ac
-ASZ4smZHcFFk
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDXDCCAsWgAwIBAgICA+swDQYJKoZIhvcNAQEEBQAwgbwxCzAJBgNVBAYT
-AkRFMRAwDgYDVQQIEwdIYW1idXJnMRAwDgYDVQQHEwdIYW1idXJnMTowOAYD
-VQQKEzFUQyBUcnVzdENlbnRlciBmb3IgU2VjdXJpdHkgaW4gRGF0YSBOZXR3
-b3JrcyBHbWJIMSIwIAYDVQQLExlUQyBUcnVzdENlbnRlciBDbGFzcyAzIENB
-MSkwJwYJKoZIhvcNAQkBFhpjZXJ0aWZpY2F0ZUB0cnVzdGNlbnRlci5kZTAe
-Fw05ODAzMDkxMTU5NTlaFw0xMTAxMDExMTU5NTlaMIG8MQswCQYDVQQGEwJE
-RTEQMA4GA1UECBMHSGFtYnVyZzEQMA4GA1UEBxMHSGFtYnVyZzE6MDgGA1UE
-ChMxVEMgVHJ1c3RDZW50ZXIgZm9yIFNlY3VyaXR5IGluIERhdGEgTmV0d29y
-a3MgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTEp
-MCcGCSqGSIb3DQEJARYaY2VydGlmaWNhdGVAdHJ1c3RjZW50ZXIuZGUwgZ8w
-DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBALa0wTUFLg2N7KBAahwOJ6ZQkmtQ
-GwfeLud2zODa/ISoXoxjaitN2U4CdhHBC/KNecoAtvGwDtf7pBc9r6tpepYn
-v68zoZoqWarEtTcI8hKlMbZD9TKWcSgoq40oht+77uMMfTDWw1Krj10nnGvA
-o+cFa1dJRLNu6mTP0o56UHd3AgMBAAGjazBpMA8GA1UdEwEB/wQFMAMBAf8w
-DgYDVR0PAQH/BAQDAgGGMDMGCWCGSAGG+EIBCAQmFiRodHRwOi8vd3d3LnRy
-dXN0Y2VudGVyLmRlL2d1aWRlbGluZXMwEQYJYIZIAYb4QgEBBAQDAgAHMA0G
-CSqGSIb3DQEBBAUAA4GBABY9xs3Bu4VxhUafPiCPUSiZ7C1FIWMjWwS7TJC4
-iJIETb19AaM/9uzO8d7+feXhPrvGq14L3T2WxMup1Pkm5gZOngylerpuw3yC
-GdHHsbHD2w2Om0B8NwvxXej9H5CIpQ5ON2QhqE6NtJ/x3kit1VYYUimLRzQS
-CdS7kjXvD9s0
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDITCCAoqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCByzELMAkGA1UEBhMC
-WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du
-MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm
-aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFBl
-cnNvbmFsIEJhc2ljIENBMSgwJgYJKoZIhvcNAQkBFhlwZXJzb25hbC1iYXNp
-Y0B0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVow
-gcsxCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNV
-BAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAm
-BgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24xITAfBgNV
-BAMTGFRoYXd0ZSBQZXJzb25hbCBCYXNpYyBDQTEoMCYGCSqGSIb3DQEJARYZ
-cGVyc29uYWwtYmFzaWNAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOB
-jQAwgYkCgYEAvLyTU23AUE+CFeZIlDWmWr5vQvoPR+53dXLdjUmbllegeNTK
-P1GzaQuRdhciB5dqxFGTS+CN7zeVoQxN2jSQHReJl+A1OFdKwPQIcOk8RHtQ
-fmGakOMj04gRRif1CwcOu93RfyAKiLlWCy4cgNrx454p7xS9CkT7G1sY0b8j
-kyECAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOB
-gQAt4plrsD16iddZopQBHyvdEktTwq1/qqcAXJFAVyVKOKqEcLnZgA+le1z7
-c8a914phXAPjLSeoF+CEhULcXpvGt7Jtu3Sv5D/Lp7ew4F2+eIMllNLbgQ95
-B21P9DkVWlIBe94y1k049hJcBlDfBVu9FEuh3ym6O0GN92NWod8isQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMC
-WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du
-MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm
-aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBl
-cnNvbmFsIEZyZWVtYWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1m
-cmVlbWFpbEB0aGF3dGUuY29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIz
-NTk1OVowgdExCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUx
-EjAQBgNVBAcTCUNhcGUgVG93bjEaMBgGA1UEChMRVGhhd3RlIENvbnN1bHRp
-bmcxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24x
-JDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBGcmVlbWFpbCBDQTErMCkGCSqG
-SIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhhd3RlLmNvbTCBnzANBgkq
-hkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfYDFG26nKRsIRefS0N
-j3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5ErHzmj+hND3Ef
-QDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVquzgkCGqY
-x7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq
-hkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP
-MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgC
-neSa/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr
-5PjRzneigQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMC
-WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du
-MRowGAYDVQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlm
-aWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBl
-cnNvbmFsIFByZW1pdW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXBy
-ZW1pdW1AdGhhd3RlLmNvbTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5
-NTlaMIHPMQswCQYDVQQGEwJaQTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIw
-EAYDVQQHEwlDYXBlIFRvd24xGjAYBgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5n
-MSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMSMw
-IQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJlbWl1bSBDQTEqMCgGCSqGSIb3
-DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUuY29tMIGfMA0GCSqGSIb3
-DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0VsBd/eJxZRNkERbGw7
-7f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWIEt12TfIa/G8j
-Hnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYDZicRFTuq
-W/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
-DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH
-b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVx
-eTBhKXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1
-KzGJ
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMC
-WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du
-MR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2Vy
-dGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3Rl
-IFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNl
-cnZlckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1
-OVowgc4xCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQ
-BgNVBAcTCUNhcGUgVG93bjEdMBsGA1UEChMUVGhhd3RlIENvbnN1bHRpbmcg
-Y2MxKDAmBgNVBAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24x
-ITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3
-DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0B
-AQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhI
-NTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQug2SBhRz1JPL
-lyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMRuHM/qgeN
-9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0B
-AQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI
-hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZ
-a4JMpAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcU
-Qg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMC
-WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3du
-MR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2Vy
-dGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3Rl
-IFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0
-ZS5jb20wHhcNOTYwODAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkG
-A1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2Fw
-ZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UE
-CxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQ
-VGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRz
-QHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANOkUG7I
-/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91yekIYfUGbTBuFRkC
-6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCXL+eQbcAoQpnX
-TEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGjEzARMA8G
-A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG7oWD
-TSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e
-QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdni
-TCxZqdq5snUb9kLy78fyGPmJvKP/iiMucEc=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMC
-WkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmls
-bGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmlj
-YXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcw
-MTAxMDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTAT
-BgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN
-BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24x
-HzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcN
-AQEBBQADgY0AMIGJAoGBANYrWHhhRYZT6jR7UZztsOYuGA7+4F+oJ9O0yeB8
-WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQaWt9MevPZQx08EHp5JduQ/vBR
-5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL8vg7ij5FrHGSALSQQZj7
-X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcN
-AQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC9RAIDb/LogWK
-0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQpgCed/r8
-zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZCayJ
-SdM=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUF
-ADCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0
-IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEw
-HwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVU
-Ti1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0
-ODM5WhcNMTkwNzA5MTg1NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgT
-AlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVT
-RVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVz
-dC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBsaWNh
-dGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCz+5Gh5DZV
-hawGNFugmliy+LUPBXeDrjKxdpJo7CNKyXY/45y2N3kDuatpjQclthln5LAb
-GHNhSuh+zdMvZOOmfAz6F4CjDUeJT1FxL+78P/m4FoCHiZMlIJpDgmkkdihZ
-NaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXuOzr0hAReYFmnjDRy7rh4
-xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1axwiP8vv
-/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6gyN7i
-gEL66S/ozjIEj3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQD
-AgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPqGydvguul49Uuo1hXf
-8NPhahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwudXNlcnRydXN0
-LmNvbS9VVE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0G
-CSqGSIb3DQEBBQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXh
-i6r/fWRRzwr/vH3YIWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUq
-f9FuVSTiuwL7MT++6LzsQCv4AdRWOOTKRIK1YSAhZ2X28AvnNPilwpyjXEAf
-hZOVBt5P1CeptqX8Fs1zMT+4ZSfP1FMa8Kxun08FDAOBp4QpxFq9ZFdyrTvP
-NximmMatBrTcCKME1SmklpoSZ0qMYEWd8SOasACcaLWYUNPvji6SZbFIPiG+
-FTAqDbUMo2s/rn9X9R+WfN9v3YIwLGUbQErNaLly7HF27FSOH4UMAWr6pjis
-H8SE
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD
-ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu
-Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRp
-b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv
-bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy
-NTIyMjM0OFoXDTE5MDYyNTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
-IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x
-NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24g
-QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x
-IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3
-DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9YLqdUHAZu9OqNSLwxlBfw
-8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+TunRf50sQB1ZaG6m
-+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8YTfwggtFzVXSN
-dnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0LBwGlN+V
-YH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLWI8so
-gTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw
+MIIDLTCCApagAwIBAgIBADANBgkqhkiG9w0BAQQFADCB0TELMAkGA1UEBhMCWkEx
+FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD
+VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT
+ZXJ2aWNlcyBEaXZpc2lvbjEkMCIGA1UEAxMbVGhhd3RlIFBlcnNvbmFsIEZyZWVt
+YWlsIENBMSswKQYJKoZIhvcNAQkBFhxwZXJzb25hbC1mcmVlbWFpbEB0aGF3dGUu
+Y29tMB4XDTk2MDEwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgdExCzAJBgNVBAYT
+AlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEa
+MBgGA1UEChMRVGhhd3RlIENvbnN1bHRpbmcxKDAmBgNVBAsTH0NlcnRpZmljYXRp
+b24gU2VydmljZXMgRGl2aXNpb24xJDAiBgNVBAMTG1RoYXd0ZSBQZXJzb25hbCBG
+cmVlbWFpbCBDQTErMCkGCSqGSIb3DQEJARYccGVyc29uYWwtZnJlZW1haWxAdGhh
+d3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA1GnX1LCUZFtx6UfY
+DFG26nKRsIRefS0Nj3sS34UldSh0OkIsYyeflXtL734Zhx2G6qPduc6WZBrCFG5E
+rHzmj+hND3EfQDimAKOHePb5lIZererAXnbr2RSjXW56fAylS1V/Bhkpf56aJtVq
+uzgkCGqYx7Hao5iR/Xnb5VrEHLkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN
+BgkqhkiG9w0BAQQFAAOBgQDH7JJ+Tvj1lqVnYiqk8E0RYNBvjWBYYawmu1I1XAjP
+MPuoSpaKH2JCI4wXD/S6ZJwXrEcp352YXtJsYHFcoqzceePnbgBHH7UNKOgCneSa
+/RP0ptl8sfjcXyMmCZGAc9AUG95DqYMl8uacLxXK/qarigd1iwzdUYRr5PjRznei
+gQ==
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIDKTCCApKgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBzzELMAkGA1UEBhMCWkEx
+FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMRowGAYD
+VQQKExFUaGF3dGUgQ29uc3VsdGluZzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBT
+ZXJ2aWNlcyBEaXZpc2lvbjEjMCEGA1UEAxMaVGhhd3RlIFBlcnNvbmFsIFByZW1p
+dW0gQ0ExKjAoBgkqhkiG9w0BCQEWG3BlcnNvbmFsLXByZW1pdW1AdGhhd3RlLmNv
+bTAeFw05NjAxMDEwMDAwMDBaFw0yMDEyMzEyMzU5NTlaMIHPMQswCQYDVQQGEwJa
+QTEVMBMGA1UECBMMV2VzdGVybiBDYXBlMRIwEAYDVQQHEwlDYXBlIFRvd24xGjAY
+BgNVBAoTEVRoYXd0ZSBDb25zdWx0aW5nMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9u
+IFNlcnZpY2VzIERpdmlzaW9uMSMwIQYDVQQDExpUaGF3dGUgUGVyc29uYWwgUHJl
+bWl1bSBDQTEqMCgGCSqGSIb3DQEJARYbcGVyc29uYWwtcHJlbWl1bUB0aGF3dGUu
+Y29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJZtn4B0TPuYwu8KHvE0Vs
+Bd/eJxZRNkERbGw77f4QfRKe5ZtCmv5gMcNmt3M6SK5O0DI3lIi1DbbZ8/JE2dWI
+Et12TfIa/G8jHnrx2JhFTgcQ7xZC0EN1bUre4qrJMf8fAHB8Zs8QJQi6+u4A6UYD
+ZicRFTuqW/KY3TZCstqIdQIDAQABoxMwETAPBgNVHRMBAf8EBTADAQH/MA0GCSqG
+SIb3DQEBBAUAA4GBAGk2ifc0KjNyL2071CKyuG+axTZmDhs8obF1Wub9NdP4qPIH
+b4Vnjt4rueIXsDqg8A6iAJrf8xQVbrvIhVqYgPn/vnQdPfP+MCXRNzRn+qVxeTBh
+KXLA4CxM+1bkOqhv5TJZUtt1KFBZDPgLGeSs2a+WjS9Q2wfD6h+rM+D1KzGJ
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx
+FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
+VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
+biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy
+dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t
+MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB
+MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG
+A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp
+b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl
+cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv
+bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE
+VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ
+ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR
+uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
+9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI
+hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM
+pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg==
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx
+FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
+VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
+biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm
+MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx
+MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
+DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3
+dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl
+cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3
+DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD
+gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91
+yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX
+L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj
+EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG
+7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e
+QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ
+qdq5snUb9kLy78fyGPmJvKP/iiMucEc=
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIICoTCCAgqgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBizELMAkGA1UEBhMCWkEx
+FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzAN
+BgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAd
+BgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcNOTcwMTAxMDAwMDAwWhcN
+MjAxMjMxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4g
+Q2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsG
+A1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1l
+c3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBANYrWHhhRYZT
+6jR7UZztsOYuGA7+4F+oJ9O0yeB8WU4WDnNUYMF/9p8u6TqFJBU820cEY8OexJQa
+Wt9MevPZQx08EHp5JduQ/vBR5zDWQQD9nyjfeb6Uu522FOMjhdepQeBMpHmwKxqL
+8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzARMA8GA1UdEwEB/wQFMAMB
+Af8wDQYJKoZIhvcNAQEEBQADgYEAZ9viwuaHPUCDhjc1fR/OmsMMZiCouqoEiYbC
+9RAIDb/LogWK0E02PvTX72nGXuSwlG9KuefeW4i2e9vjJ+V2w/A1wcu1J5szedyQ
+pgCed/r8zSeUQhac0xxo7L9c3eWpexAKMnRUEzGLhQOEkbdYATAUOK8oyvyxUBkZ
+CayJSdM=
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIEZDCCA0ygAwIBAgIQRL4Mi1AAJLQR0zYwS8AzdzANBgkqhkiG9w0BAQUFADCB
+ozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
+Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
+dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3Qt
+TmV0d29yayBBcHBsaWNhdGlvbnMwHhcNOTkwNzA5MTg0ODM5WhcNMTkwNzA5MTg1
+NzQ5WjCBozELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0
+IExha2UgQ2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYD
+VQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VS
+Rmlyc3QtTmV0d29yayBBcHBsaWNhdGlvbnMwggEiMA0GCSqGSIb3DQEBAQUAA4IB
+DwAwggEKAoIBAQCz+5Gh5DZVhawGNFugmliy+LUPBXeDrjKxdpJo7CNKyXY/45y2
+N3kDuatpjQclthln5LAbGHNhSuh+zdMvZOOmfAz6F4CjDUeJT1FxL+78P/m4FoCH
+iZMlIJpDgmkkdihZNaEdwH+DBmQWICzTSaSFtMBhf1EI+GgVkYDLpdXuOzr0hARe
+YFmnjDRy7rh4xdE7EkpvfmUnuaRVxblvQ6TFHSyZwFKkeEwVs0CYCGtDxgGwenv1
+axwiP8vv/6jQOkt2FZ7S0cYu49tXGzKiuG/ohqY/cKvlcJKrRB5AUPuco2LkbG6g
+yN7igEL66S/ozjIEj3yNtxyjNTwV3Z7DrpelAgMBAAGjgZEwgY4wCwYDVR0PBAQD
+AgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFPqGydvguul49Uuo1hXf8NPh
+ahQ8ME8GA1UdHwRIMEYwRKBCoECGPmh0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9V
+VE4tVVNFUkZpcnN0LU5ldHdvcmtBcHBsaWNhdGlvbnMuY3JsMA0GCSqGSIb3DQEB
+BQUAA4IBAQCk8yXM0dSRgyLQzDKrm5ZONJFUICU0YV8qAhXhi6r/fWRRzwr/vH3Y
+IWp4yy9Rb/hCHTO967V7lMPDqaAt39EpHx3+jz+7qEUqf9FuVSTiuwL7MT++6Lzs
+QCv4AdRWOOTKRIK1YSAhZ2X28AvnNPilwpyjXEAfhZOVBt5P1CeptqX8Fs1zMT+4
+ZSfP1FMa8Kxun08FDAOBp4QpxFq9ZFdyrTvPNximmMatBrTcCKME1SmklpoSZ0qM
+YEWd8SOasACcaLWYUNPvji6SZbFIPiG+FTAqDbUMo2s/rn9X9R+WfN9v3YIwLGUb
+QErNaLly7HF27FSOH4UMAWr6pjisH8SE
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
+IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
+BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
+aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
+9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy
+NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
+azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
+Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
+cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y
+LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+
+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y
+TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0
+LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW
+I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw
nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI
-----END CERTIFICATE-----
+
-----BEGIN CERTIFICATE-----
-MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlD
-ZXJ0IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIElu
-Yy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRp
-b24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNv
-bS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYy
-NjAwMTk1NFoXDTE5MDYyNjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
-IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4x
-NTAzBgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24g
-QXV0aG9yaXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8x
-IDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMIGfMA0GCSqGSIb3
-DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vYdA757tn2VUdZZUcOBVXc
-65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9WlmpZdRJEy0kTRxQ
-b7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QSv4dk+NoS/zcn
-wbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9vUJSZSWI4
-OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTuIYEZ
-oDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
+IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
+BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
+aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
+9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy
+NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
+azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
+Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
+cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY
+dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9
+WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS
+v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v
+UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu
+IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC
W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd
-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8xCzAJ
+BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh
+c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05
+NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNVBAYTAlVTMRcwFQYD
+VQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xhc3MgMSBQdWJsaWMgUHJp
+bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCBnzANBgkqhkiG9w0BAQEFAAOB
+jQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3noaACpEO+jglr0aIguVzqKCbJF0N
+H8xlbgyw0FaEGIeaBpsQoXPftFg5a27B9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR
+4k5FVmkfeAKA2txHkSm7NsljXMXg1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATAN
+BgkqhkiG9w0BAQIFAAOBgQBMP7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZo
+EWx8QszznC7EBz8UsA9P/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5
+FvjqBUuUfx3CHMjjt/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89Fx
+lA==
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
+BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
+c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
+MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
+emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
+DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
+FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMSBQdWJsaWMg
+UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
+YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
+MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
+AQUAA4GNADCBiQKBgQCq0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYK
+VdPfQ4chEWWKfo+9Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSm
+Fc/IReumXY6cPvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQID
+AQABMA0GCSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0J
+h9ZrbWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul
+uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4iP/68
+DzFc6PLZ
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
+cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
+LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
+aWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
+VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
+aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
+bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
+IENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4
+nN493GwTFtl63SRRZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO
+8ESlV8dAWB6jRx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjV
+ojYJrKshJlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjb
+PG7PoBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2
+6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHhv2Vr
+n5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQBfGfMY1a
+qtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/Ny9Sn2WCVhDr4
+wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUfxJM8/XmPBNQ+T+r3
+ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFMDSZl4kSAHsef493oCtrs
+pSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5SCJ5ShkPshw+IHTZasO+8ih4
+E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXVOBRgmaNL3gaWcSzy27YfpO8/7g==
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIDnjCCAwegAwIBAgIQK2jUo0aexTsoCas4XX8nIDANBgkqhkiG9w0BAQUFADBf
+MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1BgNVBAsT
+LkNsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw
+HhcNMDAwODA0MDAwMDAwWhcNMDQwODAzMjM1OTU5WjCBpzEXMBUGA1UEChMOVmVy
+aVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOzA5
+BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczovL3d3dy52ZXJpc2lnbi5jb20v
+UlBBIChjKTAwMS4wLAYDVQQDEyVDbGFzcyAxIFB1YmxpYyBQcmltYXJ5IE9DU1Ag
+UmVzcG9uZGVyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC57V56Ondfzl86
+UvzNZPdxtW9qlsZZklWUXS9bLsER6iaKy6eBPPZaRN56Ey/9WlHZezcmSsAnPwQD
+albBgyzhb1upVFAkSsYuekyhWzdUJCExH6F4GHansXDaItBq/gdiQMb39pt9DAa4
+S8co5GYjhFHvRreT2IEzy+U2rMboBQIDAQABo4IBEDCCAQwwIAYDVR0RBBkwF6QV
+MBMxETAPBgNVBAMTCE9DU1AgMS0xMDEGA1UdHwQqMCgwJqAkoCKGIGh0dHA6Ly9j
+cmwudmVyaXNpZ24uY29tL3BjYTEuY3JsMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEIG
+CCsGAQUFBwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJpc2ln
+bi5jb20vb2NzcC9zdGF0dXMwRAYDVR0gBD0wOzA5BgtghkgBhvhFAQcBATAqMCgG
+CCsGAQUFBwIBFhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vUlBBMAkGA1UdEwQC
+MAAwCwYDVR0PBAQDAgeAMA0GCSqGSIb3DQEBBQUAA4GBAHCQ3bjkvlMXfH8C6dX3
+i5mTMWCNfuZgayTvYKzSzpHegG0JpNO4OOVEynJeDS3Bd5y9LAN4KY2kpXeH9fEr
+Jq3MB2w6VFoo4AnzTQoEytRYaQuns/XdAaXn3PAfusFdkI2z6k/BEVmXarIrE7Ha
+rZehs7GgIFvKMquNzxPwHynD
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzELMAkG
+A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
+cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
+MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
+BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAyIFB1YmxpYyBQcmlt
+YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
+ADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZMJaLtVRKXxaeAufqDwSCg+i8VDXyh
+YGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvEerf4Zh+AVPy3wo5ZShRXRtGak75BkQO7
+FYCTXOvnzAhsPz6zSvz/S2wj1VCCJkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0G
+CSqGSIb3DQEBAgUAA4GBAIobK/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxg
+J8pFUs4W7z8GZOeUaHxgMxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Nc
+r6Pc5iaAIzy4RHT3Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns
+YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH
+MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y
+aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe
+Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX
+MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj
+IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx
+KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
+eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B
+AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM
+HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw
+DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC
+AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji
+nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX
+rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn
+jBJ7xUS0rg==
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcoxCzAJ
+BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVy
+aVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24s
+IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNp
+Z24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
+eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcxNjIzNTk1OVowgcoxCzAJBgNV
+BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UECxMWVmVyaVNp
+Z24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkgVmVyaVNpZ24sIElu
+Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24g
+Q2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt
+IEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWU
+J92lvuCwTY+zYVY81nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDO
+JxOeBUebMXoT2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUY
+wZF7C9UTAJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9o
+koqQHgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN
+qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVCYQ/E
+Srg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekhktdmnLfe
+xbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf0xwLRtxyID+u
+7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydEp85EXdQbkJgNHkKU
+sQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377BMnMiIYtYgXsVkXq642RI
+sH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab5iXiQkWquJCtvgiPqQtCGJTP
+cjnhsUPgKM+351psE2tJs//jGHyJizNdrDPXp/naOlXJWBD5qu9ats9LS98q
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIDnjCCAwegAwIBAgIQCUYX5h3Y1BygDKBi6HmKpzANBgkqhkiG9w0BAQUFADBf
+MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1BgNVBAsT
+LkNsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw
+HhcNMDAwODAxMDAwMDAwWhcNMDQwNzMxMjM1OTU5WjCBpzEXMBUGA1UEChMOVmVy
+aVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOzA5
+BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczovL3d3dy52ZXJpc2lnbi5jb20v
+UlBBIChjKTAwMS4wLAYDVQQDEyVDbGFzcyAyIFB1YmxpYyBQcmltYXJ5IE9DU1Ag
+UmVzcG9uZGVyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQymMxYX9ENHwF
+fQs9apDLeUt3Cj9LxyPlwGItfpx+PoiHkdCs6E1Jh6KWkIrdBKUCP4yb6Yn+YqDi
+Wr3I3bR45qVCkwhnAcAgTddc9F3as+M3plIaLExlTYqH2aij8UlUuzxcgFFoxvtJ
+/wtVqxXd+5rBuR10DbKMRF2J/J/5gwIDAQABo4IBEDCCAQwwIAYDVR0RBBkwF6QV
+MBMxETAPBgNVBAMTCE9DU1AgMS0yMDEGA1UdHwQqMCgwJqAkoCKGIGh0dHA6Ly9j
+cmwudmVyaXNpZ24uY29tL3BjYTIuY3JsMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEIG
+CCsGAQUFBwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJpc2ln
+bi5jb20vb2NzcC9zdGF0dXMwRAYDVR0gBD0wOzA5BgtghkgBhvhFAQcBATAqMCgG
+CCsGAQUFBwIBFhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vUlBBMAkGA1UdEwQC
+MAAwCwYDVR0PBAQDAgeAMA0GCSqGSIb3DQEBBQUAA4GBAB99CW4kRnUEnPMmm+M5
+bhfvvL2iG9IChIar0ECXLMRDiDcZayKoA3FQnSDcNmAgmnMtc1VsWJsswrQ0LHoz
+QsqR2elDr88e4PXEeqs/cmMeqTfhWzuIsxOGgpBXy1f/9Fa+It3jl6jhvCJDwt1N
+2/aBnpIUnjkPE1TegtjAXjSN
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG
+A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
+cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
+MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
+BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
+YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
+ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
+BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
+I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
+CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do
+lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc
+AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
+BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
+c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
+MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
+emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
+DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
+FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg
+UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
+YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
+MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
+AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4
+pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0
+13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID
+AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk
+U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i
+F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY
+oJ2daZH9
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
+cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
+LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
+aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
+VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
+aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
+bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
+IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b
+N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t
+KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu
+kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm
+CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ
+Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu
+imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te
+2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe
+DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
+/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p
+F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt
+TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIDojCCAwugAwIBAgIQLpaev7ZibOx76XPM42zBhDANBgkqhkiG9w0BAQUFADBf
+MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1BgNVBAsT
+LkNsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkw
+HhcNMDAwODA0MDAwMDAwWhcNMDQwODAzMjM1OTU5WjCBpzEXMBUGA1UEChMOVmVy
+aVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOzA5
+BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczovL3d3dy52ZXJpc2lnbi5jb20v
+UlBBIChjKTAwMS4wLAYDVQQDEyVDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IE9DU1Ag
+UmVzcG9uZGVyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDx5AgOg7t140jl
+uNum8Lmr6Txix141W9ACVBHYydFWuXZLuat65s269gwE1n7WsAplrE454/H3LaMl
+Oe+wi8++2wxdbnD0B81w9zrAPjUW7XiMQ8/CJi5H1oZ9nPG+1mcMIiWkymXmH3p4
+KC8/BdsEIb/hRWb+PLeC7Vq4FhW5VQIDAQABo4IBFDCCARAwIAYDVR0RBBkwF6QV
+MBMxETAPBgNVBAMTCE9DU1AgMS0zMDUGA1UdHwQuMCwwKqAooCaGJGh0dHA6Ly9j
+cmwudmVyaXNpZ24uY29tL3BjYTMuMS4xLmNybDATBgNVHSUEDDAKBggrBgEFBQcD
+CTBCBggrBgEFBQcBAQQ2MDQwMgYIKwYBBQUHMAGmJhYkaHR0cDovL29jc3AudmVy
+aXNpZ24uY29tL29jc3Avc3RhdHVzMEQGA1UdIAQ9MDswOQYLYIZIAYb4RQEHAQEw
+KjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL1JQQTAJBgNV
+HRMEAjAAMAsGA1UdDwQEAwIHgDANBgkqhkiG9w0BAQUFAAOBgQAC9lNjwKke8tCL
+MzCPSJtMsFa0g3FKvtxQ2PW24AvbvXhP6c8JNNopSZ0Bc1qRkYJULBMK03cjzzf8
+Y96n4/a3tWlFKEnDkdyqRxypiJksBSqNjYr6YuJatwAgXTnEKMLL/J6oia5bPY4S
+6jKy/OsU1wkVGsDNG9W1FU5B1ZbjTg==
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
+BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
+c3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
+MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
+emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
+DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
+FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgNCBQdWJsaWMg
+UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
+YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
+MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
+AQUAA4GNADCBiQKBgQC68OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDM
+HO0oW369atyzkSTKQWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtK
+qsGgtG7rL+VXxbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwID
+AQABMA0GCSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwj
+cSGIL4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y
+cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckztImRP
+T8qAkbYp
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
+cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
+LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
+aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
+VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
+aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
+bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
+IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1
+GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ
++mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd
+U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm
+NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY
+ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/
+ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1
+CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq
+g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
+fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c
+2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/
+bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzELMAkG
+A1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD
+VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk0
+MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UEBhMCVVMxIDAeBgNV
+BAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2Vy
+dmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGbMA0GCSqGSIb3DQEBAQUAA4GJ
+ADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6OLDfO6zV4ZFQD5YRAUcm/jwjiioII
+0haGN1XpsSECrXZogZoFokvJSyVmIlZsiAeP94FZbYQHZXATcXY+m3dM41CJVphI
+uR2nKRoTLkoRWZweFdVJVCxzOmmCsZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZI
+hvcNAQECBQADfgBl3X7hsuyw4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3
+YQO2WxZpO8ZECAyIUwxrl0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc
+1/p3yjkWWW8O6tO1g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA==
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIDnzCCAwygAwIBAgIRAP9F1SddJPuzwjkkU1fhT94wDQYJKoZIhvcNAQEFBQAw
+XzELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMu
+MS4wLAYDVQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+MB4XDTAwMDgwNDAwMDAwMFoXDTA0MDgwMzIzNTk1OVowgZ4xFzAVBgNVBAoTDlZl
+cmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTsw
+OQYDVQQLEzJUZXJtcyBvZiB1c2UgYXQgaHR0cHM6Ly93d3cudmVyaXNpZ24uY29t
+L1JQQSAoYykwMDElMCMGA1UEAxMcU2VjdXJlIFNlcnZlciBPQ1NQIFJlc3BvbmRl
+cjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuFGZZIUO7rMKaPC/Y3YdU/X8
+oXiMM+6f9L452psPTUepjyDoS0S9zs17kNEw6JDEJXuJKN699pMd/7n/krWpjeSu
+zOLDB4Nqo3IQASdiIqY1Jjktns9gDPxHpNfQQninHWzQy08VpykKtJVFxLHnWgnX
+OZXYHTWewr2zXcEMSx8CAwEAAaOCAR0wggEZMCAGA1UdEQQZMBekFTATMREwDwYD
+VQQDEwhPQ1NQIDEtNDA+BgNVHR8ENzA1MDOgMaAvhi1odHRwOi8vY3JsLnZlcmlz
+aWduLmNvbS9SU0FTZWN1cmVTZXJ2ZXItcC5jcmwwEwYDVR0lBAwwCgYIKwYBBQUH
+AwkwQgYIKwYBBQUHAQEENjA0MDIGCCsGAQUFBzABpiYWJGh0dHA6Ly9vY3NwLnZl
+cmlzaWduLmNvbS9vY3NwL3N0YXR1czBEBgNVHSAEPTA7MDkGC2CGSAGG+EUBBwEB
+MCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9SUEEwCQYD
+VR0TBAIwADALBgNVHQ8EBAMCB4AwDQYJKoZIhvcNAQEFBQADfgAAsxBTZpxJky4x
+oAJC0lhXfmah/huKYRhQQCweK0Gl1tv/rAgcWgVtAlwqtpZPR9u+TtvOzLqGuBjO
+sRKRX2P380g+zPFNE+RtCZR4AJLLoyCdBgtqoEMHztEZbI8YdZqfFzP9qSa44+Le
+wqjEWop/mNYHBmvMVp6GcM7U7w==
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIDzTCCAzagAwIBAgIQU2GyYK7bcY6nlLMTM/QHCTANBgkqhkiG9w0BAQUFADCB
+wTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTwwOgYDVQQL
+EzNDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+IC0gRzIxOjA4BgNVBAsTMShjKSAxOTk4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1
+dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
+cmswHhcNMDAwOTI2MDAwMDAwWhcNMTAwOTI1MjM1OTU5WjCBpTEXMBUGA1UEChMO
+VmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsx
+OzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczovL3d3dy52ZXJpc2lnbi5j
+b20vcnBhIChjKTAwMSwwKgYDVQQDEyNWZXJpU2lnbiBUaW1lIFN0YW1waW5nIEF1
+dGhvcml0eSBDQTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0hmdZ8IAIVli
+zrQJIkRpivglWtvtDbc2fk7gu5Q+kCWHwmFHKdm9VLhjzCx9abQzNvQ3B5rB3UBU
+/OB4naCTuQk9I1F/RMIUdNsKvsvJMDRAmD7Q1yUQgZS9B0+c1lQn3y6ov8uQjI11
+S7zi6ESHzeZBCiVu6PQkAsVSD27smHUCAwEAAaOB3zCB3DAPBgNVHRMECDAGAQH/
+AgEAMEUGA1UdIAQ+MDwwOgYMYIZIAYb4RQEHFwEDMCowKAYIKwYBBQUHAgEWHGh0
+dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9ycGEwMQYDVR0fBCowKDAmoCSgIoYgaHR0
+cDovL2NybC52ZXJpc2lnbi5jb20vcGNhMy5jcmwwCwYDVR0PBAQDAgEGMEIGCCsG
+AQUFBwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJpc2lnbi5j
+b20vb2NzcC9zdGF0dXMwDQYJKoZIhvcNAQEFBQADgYEAgnBold+2DcIBcBlK0lRW
+HqzyRUyHuPU163hLBanInTsZIS5wNEqi9YngFXVF5yg3ADQnKeg3S/LvRJdrF1Ea
+w1adPBqK9kpGRjeM+sv1ZFo4aC4cw+9wzrhGBha/937ntag+RaypJXUie28/sJyU
+58dzq6wf7iWbwBbtt8pb8BQ=
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIDgDCCAmigAwIBAgICAx4wDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMCVVMx
+DTALBgNVBAoTBFZJU0ExLzAtBgNVBAsTJlZpc2EgSW50ZXJuYXRpb25hbCBTZXJ2
+aWNlIEFzc29jaWF0aW9uMRIwEAYDVQQDEwlHUCBSb290IDIwHhcNMDAwODE2MjI1
+MTAwWhcNMjAwODE1MjM1OTAwWjBhMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklT
+QTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRp
+b24xEjAQBgNVBAMTCUdQIFJvb3QgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
+AQoCggEBAKkBcLWqxEDwq2omYXkZAPy/mzdZDK9vZBv42pWUJGkzEXDK41Z0ohdX
+ZFwgBuHW73G3O/erwWnQSaSxBNf0V2KJXLB1LRckaeNCYOTudNargFbYiCjh+20i
+/SN8RnNPflRzHqgsVVh1t0zzWkWlAhr62p3DRcMiXvOL8WAp0sdftAw6UYPvMPjU
+58fy+pmjIlC++QU3o63tmsPm7IgbthknGziLgE3sucfFicv8GjLtI/C1AVj59o/g
+halMCXI5Etuz9c9OYmTaxhkVOmMd6RdVoUwiPDQyRvhlV7or7zaMavrZ2UT0qt2E
+1w0cslSsMoW0ZA3eQbuxNMYBhjJk1Z8CAwEAAaNCMEAwHQYDVR0OBBYEFJ59SzS/
+ca3CBfYDdYDOqU8axCRMMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG
+MA0GCSqGSIb3DQEBBQUAA4IBAQAhpXYUVfmtJ3CPPPTVbMjMCqujmAuKBiPFyWHb
+mQdpNSYx/scuhMKZYdQN6X0uEyt8joW2hcdLzzW2LEc9zikv2G+fiRxkk78IvXbQ
+kIqUs38oW26sTTMs7WXcFsziza6kPWKSBpUmv9+55CCmc2rBvveURNZNbyoLaxhN
+dBA2aGpawWqn3TYpjLgwi08hPwAuVDAHOrqK5MOeyti12HvOdUVmB/RtLdh6yumJ
+ivIj2C/LbgA2T/vwLwHMD8AiZfSr4k5hLQOCfZEWtTDVFN5ex5D8ofyrEK9ca3Cn
+B+8phuiyJccg/ybdd+95RBTEvd07xQObdyPsoOy7Wjm1zK0G
+-----END CERTIFICATE-----
+
-----BEGIN CERTIFICATE-----
-MIICPTCCAaYCEQDNun9W8N/kvFT+IqyzcqpVMA0GCSqGSIb3DQEBAgUAMF8x
-CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UE
-CxMuQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv
-cml0eTAeFw05NjAxMjkwMDAwMDBaFw0yODA4MDEyMzU5NTlaMF8xCzAJBgNV
-BAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE3MDUGA1UECxMuQ2xh
-c3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCB
-nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA5Rm/baNWYS2ZSHH2Z965jeu3
-noaACpEO+jglr0aIguVzqKCbJF0NH8xlbgyw0FaEGIeaBpsQoXPftFg5a27B
-9hXVqKg/qhIGjTGsf7A01480Z4gJzRQR4k5FVmkfeAKA2txHkSm7NsljXMXg
-1y2He6G3MrB7MLoqLzGq7qNn2tsCAwEAATANBgkqhkiG9w0BAQIFAAOBgQBM
-P7iLxmjf7kMzDl3ppssHhE16M/+SG/Q2rdiVIjZoEWx8QszznC7EBz8UsA9P
-/5CSdvnivErpj82ggAr3xSnxgiJduLHdgSOjeyUVRjB5FvjqBUuUfx3CHMjj
-t/QQQDwTw18fU+hI5Ia0e6E1sHslurjTjqs/OJ0ANACY89FxlA==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDAjCCAmsCEEzH6qqYPnHTkxD4PTqJkZIwDQYJKoZIhvcNAQEFBQAwgcEx
-CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE
-CxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv
-cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt
-IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU
-cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
-gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG
-A1UECxMzQ2xhc3MgMSBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1
-dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j
-LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln
-biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCq
-0Lq+Fi24g9TK0g+8djHKlNgdk4xWArzZbxpvUjZudVYKVdPfQ4chEWWKfo+9
-Id5rMj8bhDSVBZ1BNeuS65bdqlk/AVNtmU/t5eIqWpDBucSmFc/IReumXY6c
-PvBkJHalzasab7bYe1FhbqZ/h8jit+U03EGI6glAvnOSPWvndQIDAQABMA0G
-CSqGSIb3DQEBBQUAA4GBAKlPww3HZ74sy9mozS11534Vnjty637rXC0Jh9Zr
-bWB85a7FkCMMXErQr7Fd88e2CtvgFZMN3QO8x3aKtd1Pw5sTdbgBwObJW2ul
-uIncrKTdcu1OofdPvAbT6shkdHvClUGcZXNY8ZCaPGqxmMnEh7zPRW1F4m4i
-P/68DzFc6PLZ
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEGjCCAwICEQCLW3VWhFSFCwDPrzhIzrGkMA0GCSqGSIb3DQEBBQUAMIHK
-MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV
-BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5
-IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD
-BgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlm
-aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3
-MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s
-IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV
-BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg
-dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDEgUHVibGljIFBy
-aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAN2E1Lm0+afY8wR4nN493GwTFtl63SRR
-ZsDHJlkNrAYIwpTRMx/wgzUfbhvI3qpuFU5UJ+/EbRrsC+MO8ESlV8dAWB6j
-Rx9x7GD2bZTIGDnt/kIYVt/kTEkQeE4BdjVjEjbdZrwBBDajVWjVojYJrKsh
-JlQGrT/KFOCsyq0GHZXi+J3x4GD/wn91K0zM2v6HmSHquv4+VNfSWXjbPG7P
-oBMAGrgnoeS+Z5bKoMWznN3JdZ7rMJpfo83ZrngZPyPpXNspva1VyBtUjGP2
-6KbqxzcSXKMpHgLZ2x87tNcPVkeBFQRKr4Mn0cVYiMHd9qqnoxjaaKptEVHh
-v2Vrn5Z20T0CAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAq2aN17O6x5q25lXQ
-BfGfMY1aqtmqRiYPce2lrVNWYgFHKkTp/j90CxObufRNG7LRX7K20ohcs5/N
-y9Sn2WCVhDr4wTcdYcrnsMXlkdpUpqwxga6X3s0IrLjAl4B/bnKk52kTlWUf
-xJM8/XmPBNQ+T+r3ns7NZ3xPZQL/kYVUc8f/NveGLezQXk//EZ9yBta4GvFM
-DSZl4kSAHsef493oCtrspSCAaWihT37ha88HQfqDjrw43bAuEbFrskLMmrz5
-SCJ5ShkPshw+IHTZasO+8ih4E1Z5T21Q6huwtVexN2ZYI/PcD98Kh8TvhgXV
-OBRgmaNL3gaWcSzy27YfpO8/7g==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDnjCCAwegAwIBAgIQK2jUo0aexTsoCas4XX8nIDANBgkqhkiG9w0BAQUF
-ADBfMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1
-BgNVBAsTLkNsYXNzIDEgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB
-dXRob3JpdHkwHhcNMDAwODA0MDAwMDAwWhcNMDQwODAzMjM1OTU5WjCBpzEX
-MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
-dXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczov
-L3d3dy52ZXJpc2lnbi5jb20vUlBBIChjKTAwMS4wLAYDVQQDEyVDbGFzcyAx
-IFB1YmxpYyBQcmltYXJ5IE9DU1AgUmVzcG9uZGVyMIGfMA0GCSqGSIb3DQEB
-AQUAA4GNADCBiQKBgQC57V56Ondfzl86UvzNZPdxtW9qlsZZklWUXS9bLsER
-6iaKy6eBPPZaRN56Ey/9WlHZezcmSsAnPwQDalbBgyzhb1upVFAkSsYuekyh
-WzdUJCExH6F4GHansXDaItBq/gdiQMb39pt9DAa4S8co5GYjhFHvRreT2IEz
-y+U2rMboBQIDAQABo4IBEDCCAQwwIAYDVR0RBBkwF6QVMBMxETAPBgNVBAMT
-CE9DU1AgMS0xMDEGA1UdHwQqMCgwJqAkoCKGIGh0dHA6Ly9jcmwudmVyaXNp
-Z24uY29tL3BjYTEuY3JsMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEIGCCsGAQUF
-BwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJpc2lnbi5j
-b20vb2NzcC9zdGF0dXMwRAYDVR0gBD0wOzA5BgtghkgBhvhFAQcBATAqMCgG
-CCsGAQUFBwIBFhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vUlBBMAkGA1Ud
-EwQCMAAwCwYDVR0PBAQDAgeAMA0GCSqGSIb3DQEBBQUAA4GBAHCQ3bjkvlMX
-fH8C6dX3i5mTMWCNfuZgayTvYKzSzpHegG0JpNO4OOVEynJeDS3Bd5y9LAN4
-KY2kpXeH9fErJq3MB2w6VFoo4AnzTQoEytRYaQuns/XdAaXn3PAfusFdkI2z
-6k/BEVmXarIrE7HarZehs7GgIFvKMquNzxPwHynD
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICPDCCAaUCEC0b/EoXjaOR6+f/9YtFvgswDQYJKoZIhvcNAQECBQAwXzEL
-MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQL
-Ey5DbGFzcyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
-aXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UE
-BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
-cyAyIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGf
-MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2WoujDWojg4BrzzmH9CETMwZM
-JaLtVRKXxaeAufqDwSCg+i8VDXyhYGt+eSz6Bg86rvYbb7HS/y8oUl+DfUvE
-erf4Zh+AVPy3wo5ZShRXRtGak75BkQO7FYCTXOvnzAhsPz6zSvz/S2wj1VCC
-JkQZjiPDceoZJEcEnnW/yKYAHwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBAIob
-K/o5wXTXXtgZZKJYSi034DNHD6zt96rbHuSLBlxgJ8pFUs4W7z8GZOeUaHxg
-MxURaa+dYo2jA1Rrpr7l7gUYYAS/QoD90KioHgE796Ncr6Pc5iaAIzy4RHT3
-Cq5Ji2F4zCS/iIqnDupzGUH9TQPwiNHleI2lKk/2lw0Xd8rY
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHB
-MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNV
-BAsTM0NsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRo
-b3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4g
-LSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24g
-VHJ1c3QgTmV0d29yazAeFw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTla
-MIHBMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6
-BgNVBAsTM0NsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB
-dXRob3JpdHkgLSBHMjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIElu
-Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNp
-Z24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA
-p4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjMHiwSViy4AWkszJkf
-rbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjwDqL7MWzJ5m+Z
-Jwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cCAwEAATAN
-BgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9jinb3/
-7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX
-rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6x
-RnInjBJ7xUS0rg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEGTCCAwECEGFwy0mMX5hFKeewptlQW3owDQYJKoZIhvcNAQEFBQAwgcox
-CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0GA1UE
-CxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UECxMxKGMpIDE5OTkg
-VmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTFFMEMG
-A1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZp
-Y2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTk5MTAwMTAwMDAwMFoXDTM2MDcx
-NjIzNTk1OVowgcoxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwg
-SW5jLjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazE6MDgGA1UE
-CxMxKGMpIDE5OTkgVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1
-c2Ugb25seTFFMEMGA1UEAxM8VmVyaVNpZ24gQ2xhc3MgMiBQdWJsaWMgUHJp
-bWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMIIBIjANBgkqhkiG
-9w0BAQEFAAOCAQ8AMIIBCgKCAQEArwoNwtUs22e5LeWUJ92lvuCwTY+zYVY8
-1nzD9M0+hsuiiOLh2KRpxbXiv8GmR1BeRjmL1Za6tW8UvxDOJxOeBUebMXoT
-2B/Z0wI3i60sR/COgQanDTAM6/c8DyAd3HJG7qUCyFvDyVZpTMUYwZF7C9UT
-AJu878NIPkZgIIUq1ZC2zYugzDLdt/1AVbJQHFauzI13TccgTacxdu9okoqQ
-HgiBVrKtaaNS0MscxCM9H5n+TOgWY47GCI72MfbS+uV23bUckqNJzc0BzWjN
-qWm6o+sdDZykIKbBoMXRRkwXbdKsZj+WjOCE1Db/IlnF+RFgqF8EffIa9iVC
-YQ/ESrg+iQIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQA0JhU8wI1NQ0kdvekh
-ktdmnLfexbjQ5F1fdiLAJvmEOjr5jLX77GDx6M4EsMjdpwOPMPOY36TmpDHf
-0xwLRtxyID+u7gU8pDM/CzmscHhzS5kr3zDCVLCoO1Wh/hYozUK9dG6A2ydE
-p85EXdQbkJgNHkKUsQAsBNB0owIFImNjzYO1+8FtYmtpdf1dcEG59b98377B
-MnMiIYtYgXsVkXq642RIsH/7NiXaldDxJBQX3RiAa0YjOVT1jmIJBB2UkKab
-5iXiQkWquJCtvgiPqQtCGJTPcjnhsUPgKM+351psE2tJs//jGHyJizNdrDPX
-p/naOlXJWBD5qu9ats9LS98q
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDnjCCAwegAwIBAgIQCUYX5h3Y1BygDKBi6HmKpzANBgkqhkiG9w0BAQUF
-ADBfMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1
-BgNVBAsTLkNsYXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB
-dXRob3JpdHkwHhcNMDAwODAxMDAwMDAwWhcNMDQwNzMxMjM1OTU5WjCBpzEX
-MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
-dXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczov
-L3d3dy52ZXJpc2lnbi5jb20vUlBBIChjKTAwMS4wLAYDVQQDEyVDbGFzcyAy
-IFB1YmxpYyBQcmltYXJ5IE9DU1AgUmVzcG9uZGVyMIGfMA0GCSqGSIb3DQEB
-AQUAA4GNADCBiQKBgQDQymMxYX9ENHwFfQs9apDLeUt3Cj9LxyPlwGItfpx+
-PoiHkdCs6E1Jh6KWkIrdBKUCP4yb6Yn+YqDiWr3I3bR45qVCkwhnAcAgTddc
-9F3as+M3plIaLExlTYqH2aij8UlUuzxcgFFoxvtJ/wtVqxXd+5rBuR10DbKM
-RF2J/J/5gwIDAQABo4IBEDCCAQwwIAYDVR0RBBkwF6QVMBMxETAPBgNVBAMT
-CE9DU1AgMS0yMDEGA1UdHwQqMCgwJqAkoCKGIGh0dHA6Ly9jcmwudmVyaXNp
-Z24uY29tL3BjYTIuY3JsMBMGA1UdJQQMMAoGCCsGAQUFBwMJMEIGCCsGAQUF
-BwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJpc2lnbi5j
-b20vb2NzcC9zdGF0dXMwRAYDVR0gBD0wOzA5BgtghkgBhvhFAQcBATAqMCgG
-CCsGAQUFBwIBFhxodHRwczovL3d3dy52ZXJpc2lnbi5jb20vUlBBMAkGA1Ud
-EwQCMAAwCwYDVR0PBAQDAgeAMA0GCSqGSIb3DQEBBQUAA4GBAB99CW4kRnUE
-nPMmm+M5bhfvvL2iG9IChIar0ECXLMRDiDcZayKoA3FQnSDcNmAgmnMtc1Vs
-WJsswrQ0LHozQsqR2elDr88e4PXEeqs/cmMeqTfhWzuIsxOGgpBXy1f/9Fa+
-It3jl6jhvCJDwt1N2/aBnpIUnjkPE1TegtjAXjSN
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzEL
-MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQL
-Ey5DbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
-aXR5MB4XDTk2MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UE
-BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
-cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGf
-MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69q
-RUCPhAwL0TPZ2RHP7gJYHyX3KqhEBarsAx94f56TuZoAqiN91qyFomNFx3In
-zPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/isI19wKTakyYbnsZogy1Olhec9vn2a
-/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0GCSqGSIb3DQEBAgUAA4GBALtM
-EivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Dolbwdj2wsqFHMc9ikwFPw
-TtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNycAA9WjQKZ7aKQRUzk
-uxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcEx
-CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE
-CxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv
-cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt
-IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU
-cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
-gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG
-A1UECxMzQ2xhc3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1
-dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j
-LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln
-biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDM
-XtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4pO0M8RcPO/mn+SXX
-wc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg013gfqLptQ5GV
-j0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwIDAQABMA0G
-CSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSkU01U
-bSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i
-F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo
-1KpYoJ2daZH9
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHK
-MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV
-BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5
-IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD
-BgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlm
-aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3
-MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s
-IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV
-BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg
-dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFBy
-aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2
-R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2tKmFZpGcmTNDo
-vFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUccLwg
-TS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+V
-k7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ
-Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJ
-OxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my
-/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f
-j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoA
-Wii/gt/4uhMdUIaC/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8S
-GhJouPtmmRQURVyu565pF4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbb
-o27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh
-/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDojCCAwugAwIBAgIQLpaev7ZibOx76XPM42zBhDANBgkqhkiG9w0BAQUF
-ADBfMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xNzA1
-BgNVBAsTLkNsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBB
-dXRob3JpdHkwHhcNMDAwODA0MDAwMDAwWhcNMDQwODAzMjM1OTU5WjCBpzEX
-MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
-dXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBhdCBodHRwczov
-L3d3dy52ZXJpc2lnbi5jb20vUlBBIChjKTAwMS4wLAYDVQQDEyVDbGFzcyAz
-IFB1YmxpYyBQcmltYXJ5IE9DU1AgUmVzcG9uZGVyMIGfMA0GCSqGSIb3DQEB
-AQUAA4GNADCBiQKBgQDx5AgOg7t140jluNum8Lmr6Txix141W9ACVBHYydFW
-uXZLuat65s269gwE1n7WsAplrE454/H3LaMlOe+wi8++2wxdbnD0B81w9zrA
-PjUW7XiMQ8/CJi5H1oZ9nPG+1mcMIiWkymXmH3p4KC8/BdsEIb/hRWb+PLeC
-7Vq4FhW5VQIDAQABo4IBFDCCARAwIAYDVR0RBBkwF6QVMBMxETAPBgNVBAMT
-CE9DU1AgMS0zMDUGA1UdHwQuMCwwKqAooCaGJGh0dHA6Ly9jcmwudmVyaXNp
-Z24uY29tL3BjYTMuMS4xLmNybDATBgNVHSUEDDAKBggrBgEFBQcDCTBCBggr
-BgEFBQcBAQQ2MDQwMgYIKwYBBQUHMAGmJhYkaHR0cDovL29jc3AudmVyaXNp
-Z24uY29tL29jc3Avc3RhdHVzMEQGA1UdIAQ9MDswOQYLYIZIAYb4RQEHAQEw
-KjAoBggrBgEFBQcCARYcaHR0cHM6Ly93d3cudmVyaXNpZ24uY29tL1JQQTAJ
-BgNVHRMEAjAAMAsGA1UdDwQEAwIHgDANBgkqhkiG9w0BAQUFAAOBgQAC9lNj
-wKke8tCLMzCPSJtMsFa0g3FKvtxQ2PW24AvbvXhP6c8JNNopSZ0Bc1qRkYJU
-LBMK03cjzzf8Y96n4/a3tWlFKEnDkdyqRxypiJksBSqNjYr6YuJatwAgXTnE
-KMLL/J6oia5bPY4S6jKy/OsU1wkVGsDNG9W1FU5B1ZbjTg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDAjCCAmsCEDKIjprS9esTR/h/xCA3JfgwDQYJKoZIhvcNAQEFBQAwgcEx
-CzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UE
-CxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv
-cml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAt
-IEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBU
-cnVzdCBOZXR3b3JrMB4XDTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVow
-gcExCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoG
-A1UECxMzQ2xhc3MgNCBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1
-dGhvcml0eSAtIEcyMTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5j
-LiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2ln
-biBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC6
-8OTP+cSuhVS5B1f5j8V/aBH4xBewRNzjMHPVKmIquNDMHO0oW369atyzkSTK
-QWI8/AIBvxwWMZQFl3Zuoq29YRdsTjCG8FE3KlDHqGKB3FtKqsGgtG7rL+VX
-xbErQHDbWk2hjh+9Ax/YA9SPTJlxvOKCzFjomDqG04Y48wApHwIDAQABMA0G
-CSqGSIb3DQEBBQUAA4GBAIWMEsGnuVAVess+rLhDityq3RS6iYF+ATwjcSGI
-L4LcY/oCRaxFWdcqWERbt5+BO5JoPeI3JPV7bI92NZYJqFmduc4jq3TWg/0y
-cyfYaT5DdPauxYma51N86Xv2S/PBZYPejYqcPIiNOVn8qj8ijaHBZlCBckzt
-ImRPT8qAkbYp
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHK
-MQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNV
-BAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5
-IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBD
-BgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlm
-aWNhdGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3
-MTYyMzU5NTlaMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24s
-IEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNV
-BAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQg
-dXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFBy
-aW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI
-hvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYl
-S+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ+mGuqPKljYXC
-KtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM8BDc
-VHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdL
-MEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY
-ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDD
-Zq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1Wr
-IhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt
-mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csK
-vE+MW8VLADsfKoKmfjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluP
-QSjA1egtTaRezarZ7c7c2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kP
-mF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr
-9Xgn2uf3ZkPznoM+IKrDNWCRzg==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIICNDCCAaECEAKtZn5ORf5eV288mBle3cAwDQYJKoZIhvcNAQECBQAwXzEL
-MAkGA1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMu
-MS4wLAYDVQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9y
-aXR5MB4XDTk0MTEwOTAwMDAwMFoXDTEwMDEwNzIzNTk1OVowXzELMAkGA1UE
-BhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5LCBJbmMuMS4wLAYD
-VQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGb
-MA0GCSqGSIb3DQEBAQUAA4GJADCBhQJ+AJLOesGugz5aqomDV6wlAXYMra6O
-LDfO6zV4ZFQD5YRAUcm/jwjiioII0haGN1XpsSECrXZogZoFokvJSyVmIlZs
-iAeP94FZbYQHZXATcXY+m3dM41CJVphIuR2nKRoTLkoRWZweFdVJVCxzOmmC
-sZc5nG1wZ0jl3S3WyB57AgMBAAEwDQYJKoZIhvcNAQECBQADfgBl3X7hsuyw
-4jrg7HFGmhkRuNPHoLQDQCYCPgmc4RKz0Vr2N6W3YQO2WxZpO8ZECAyIUwxr
-l0nHPjXcbLm7qt9cuzovk2C2qUtN8iD3zV9/ZHuO3ABc1/p3yjkWWW8O6tO1
-g39NTUJWdrTJXwT4OPjr0l91X817/OWOgHz8UA==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDnzCCAwygAwIBAgIRAP9F1SddJPuzwjkkU1fhT94wDQYJKoZIhvcNAQEF
-BQAwXzELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1JTQSBEYXRhIFNlY3VyaXR5
-LCBJbmMuMS4wLAYDVQQLEyVTZWN1cmUgU2VydmVyIENlcnRpZmljYXRpb24g
-QXV0aG9yaXR5MB4XDTAwMDgwNDAwMDAwMFoXDTA0MDgwMzIzNTk1OVowgZ4x
-FzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU
-cnVzdCBOZXR3b3JrMTswOQYDVQQLEzJUZXJtcyBvZiB1c2UgYXQgaHR0cHM6
-Ly93d3cudmVyaXNpZ24uY29tL1JQQSAoYykwMDElMCMGA1UEAxMcU2VjdXJl
-IFNlcnZlciBPQ1NQIFJlc3BvbmRlcjCBnzANBgkqhkiG9w0BAQEFAAOBjQAw
-gYkCgYEAuFGZZIUO7rMKaPC/Y3YdU/X8oXiMM+6f9L452psPTUepjyDoS0S9
-zs17kNEw6JDEJXuJKN699pMd/7n/krWpjeSuzOLDB4Nqo3IQASdiIqY1Jjkt
-ns9gDPxHpNfQQninHWzQy08VpykKtJVFxLHnWgnXOZXYHTWewr2zXcEMSx8C
-AwEAAaOCAR0wggEZMCAGA1UdEQQZMBekFTATMREwDwYDVQQDEwhPQ1NQIDEt
-NDA+BgNVHR8ENzA1MDOgMaAvhi1odHRwOi8vY3JsLnZlcmlzaWduLmNvbS9S
-U0FTZWN1cmVTZXJ2ZXItcC5jcmwwEwYDVR0lBAwwCgYIKwYBBQUHAwkwQgYI
-KwYBBQUHAQEENjA0MDIGCCsGAQUFBzABpiYWJGh0dHA6Ly9vY3NwLnZlcmlz
-aWduLmNvbS9vY3NwL3N0YXR1czBEBgNVHSAEPTA7MDkGC2CGSAGG+EUBBwEB
-MCowKAYIKwYBBQUHAgEWHGh0dHBzOi8vd3d3LnZlcmlzaWduLmNvbS9SUEEw
-CQYDVR0TBAIwADALBgNVHQ8EBAMCB4AwDQYJKoZIhvcNAQEFBQADfgAAsxBT
-ZpxJky4xoAJC0lhXfmah/huKYRhQQCweK0Gl1tv/rAgcWgVtAlwqtpZPR9u+
-TtvOzLqGuBjOsRKRX2P380g+zPFNE+RtCZR4AJLLoyCdBgtqoEMHztEZbI8Y
-dZqfFzP9qSa44+LewqjEWop/mNYHBmvMVp6GcM7U7w==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDzTCCAzagAwIBAgIQU2GyYK7bcY6nlLMTM/QHCTANBgkqhkiG9w0BAQUF
-ADCBwTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTww
-OgYDVQQLEzNDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24g
-QXV0aG9yaXR5IC0gRzIxOjA4BgNVBAsTMShjKSAxOTk4IFZlcmlTaWduLCBJ
-bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAsTFlZlcmlT
-aWduIFRydXN0IE5ldHdvcmswHhcNMDAwOTI2MDAwMDAwWhcNMTAwOTI1MjM1
-OTU5WjCBpTEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
-cmlTaWduIFRydXN0IE5ldHdvcmsxOzA5BgNVBAsTMlRlcm1zIG9mIHVzZSBh
-dCBodHRwczovL3d3dy52ZXJpc2lnbi5jb20vcnBhIChjKTAwMSwwKgYDVQQD
-EyNWZXJpU2lnbiBUaW1lIFN0YW1waW5nIEF1dGhvcml0eSBDQTCBnzANBgkq
-hkiG9w0BAQEFAAOBjQAwgYkCgYEA0hmdZ8IAIVlizrQJIkRpivglWtvtDbc2
-fk7gu5Q+kCWHwmFHKdm9VLhjzCx9abQzNvQ3B5rB3UBU/OB4naCTuQk9I1F/
-RMIUdNsKvsvJMDRAmD7Q1yUQgZS9B0+c1lQn3y6ov8uQjI11S7zi6ESHzeZB
-CiVu6PQkAsVSD27smHUCAwEAAaOB3zCB3DAPBgNVHRMECDAGAQH/AgEAMEUG
-A1UdIAQ+MDwwOgYMYIZIAYb4RQEHFwEDMCowKAYIKwYBBQUHAgEWHGh0dHBz
-Oi8vd3d3LnZlcmlzaWduLmNvbS9ycGEwMQYDVR0fBCowKDAmoCSgIoYgaHR0
-cDovL2NybC52ZXJpc2lnbi5jb20vcGNhMy5jcmwwCwYDVR0PBAQDAgEGMEIG
-CCsGAQUFBwEBBDYwNDAyBggrBgEFBQcwAaYmFiRodHRwOi8vb2NzcC52ZXJp
-c2lnbi5jb20vb2NzcC9zdGF0dXMwDQYJKoZIhvcNAQEFBQADgYEAgnBold+2
-DcIBcBlK0lRWHqzyRUyHuPU163hLBanInTsZIS5wNEqi9YngFXVF5yg3ADQn
-Keg3S/LvRJdrF1Eaw1adPBqK9kpGRjeM+sv1ZFo4aC4cw+9wzrhGBha/937n
-tag+RaypJXUie28/sJyU58dzq6wf7iWbwBbtt8pb8BQ=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDgDCCAmigAwIBAgICAx4wDQYJKoZIhvcNAQEFBQAwYTELMAkGA1UEBhMC
-VVMxDTALBgNVBAoTBFZJU0ExLzAtBgNVBAsTJlZpc2EgSW50ZXJuYXRpb25h
-bCBTZXJ2aWNlIEFzc29jaWF0aW9uMRIwEAYDVQQDEwlHUCBSb290IDIwHhcN
-MDAwODE2MjI1MTAwWhcNMjAwODE1MjM1OTAwWjBhMQswCQYDVQQGEwJVUzEN
-MAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNl
-cnZpY2UgQXNzb2NpYXRpb24xEjAQBgNVBAMTCUdQIFJvb3QgMjCCASIwDQYJ
-KoZIhvcNAQEBBQADggEPADCCAQoCggEBAKkBcLWqxEDwq2omYXkZAPy/mzdZ
-DK9vZBv42pWUJGkzEXDK41Z0ohdXZFwgBuHW73G3O/erwWnQSaSxBNf0V2KJ
-XLB1LRckaeNCYOTudNargFbYiCjh+20i/SN8RnNPflRzHqgsVVh1t0zzWkWl
-Ahr62p3DRcMiXvOL8WAp0sdftAw6UYPvMPjU58fy+pmjIlC++QU3o63tmsPm
-7IgbthknGziLgE3sucfFicv8GjLtI/C1AVj59o/ghalMCXI5Etuz9c9OYmTa
-xhkVOmMd6RdVoUwiPDQyRvhlV7or7zaMavrZ2UT0qt2E1w0cslSsMoW0ZA3e
-QbuxNMYBhjJk1Z8CAwEAAaNCMEAwHQYDVR0OBBYEFJ59SzS/ca3CBfYDdYDO
-qU8axCRMMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqG
-SIb3DQEBBQUAA4IBAQAhpXYUVfmtJ3CPPPTVbMjMCqujmAuKBiPFyWHbmQdp
-NSYx/scuhMKZYdQN6X0uEyt8joW2hcdLzzW2LEc9zikv2G+fiRxkk78IvXbQ
-kIqUs38oW26sTTMs7WXcFsziza6kPWKSBpUmv9+55CCmc2rBvveURNZNbyoL
-axhNdBA2aGpawWqn3TYpjLgwi08hPwAuVDAHOrqK5MOeyti12HvOdUVmB/Rt
-Ldh6yumJivIj2C/LbgA2T/vwLwHMD8AiZfSr4k5hLQOCfZEWtTDVFN5ex5D8
-ofyrEK9ca3CnB+8phuiyJccg/ybdd+95RBTEvd07xQObdyPsoOy7Wjm1zK0G
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUF
-ADBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlz
-YSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMT
-E1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0
-MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UE
-CxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAa
-BgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA
-A4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh
-28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8bRaVK7362
-rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81
-q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtF
-Wsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0
-lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaLdXe6YJ2E5/4t
-AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
-A1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOC
-AQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR
-zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKht
-cbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGI
-xHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu
-YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/
-hC3euiInlhBx6yLt398znM/jra6O1I7mT1GvFpLgXPYHDw==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFajCCBFKgAwIBAgIEPLU9RjANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQK
-EwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEG
-A1UEAxMqYmVUUlVTVGVkIFJvb3QgQ0EtQmFsdGltb3JlIEltcGxlbWVudGF0
-aW9uMB4XDTAyMDQxMTA3Mzg1MVoXDTIyMDQxMTA3Mzg1MVowZjESMBAGA1UE
-ChMJYmVUUlVTVGVkMRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAx
-BgNVBAMTKmJlVFJVU1RlZCBSb290IENBLUJhbHRpbW9yZSBJbXBsZW1lbnRh
-dGlvbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALx+xDmcjOPW
-HIb/ymKt4H8wRXqOGrO4x/nRNv8i805qX4QQ+2aBw5R5MdKR4XeOGCrDFN5R
-9U+jK7wYFuK13XneIviCfsuBH/0nLI/6l2Qijvj/YaOcGx6Sj8CoCd8JEey3
-fTGaGuqDIQY8n7pc/5TqarjDa1U0Tz0yH92BFODEPM2dMPgwqZfT7syj0B9f
-HBOB1BirlNFjw55/NZKeX0Tq7PQiXLfoPX2k+YmpkbIq2eszh+6l/ePazIjm
-iSZuxyuC0F6dWdsU7JGDBcNeDsYq0ATdcT0gTlgn/FP7eHgZFLL8kFKJOGJg
-B7Sg7KxrUNb9uShr71ItOrL/8QFArDcCAwEAAaOCAh4wggIaMA8GA1UdEwEB
-/wQFMAMBAf8wggG1BgNVHSAEggGsMIIBqDCCAaQGDysGAQQBsT4AAAEJKIOR
-MTCCAY8wggFIBggrBgEFBQcCAjCCAToaggE2UmVsaWFuY2Ugb24gb3IgdXNl
-IG9mIHRoaXMgQ2VydGlmaWNhdGUgY3JlYXRlcyBhbiBhY2tub3dsZWRnbWVu
-dCBhbmQgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5k
-YXJkIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgdGhlIENlcnRpZmlj
-YXRpb24gUHJhY3RpY2UgU3RhdGVtZW50IGFuZCB0aGUgUmVseWluZyBQYXJ0
-eSBBZ3JlZW1lbnQsIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgYmVUUlVT
-VGVkIHdlYiBzaXRlLCBodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVj
-dHNfc2VydmljZXMvaW5kZXguaHRtbDBBBggrBgEFBQcCARY1aHR0cDovL3d3
-dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWww
-HQYDVR0OBBYEFEU9w6nR3D8kVpgccxiIav+DR+22MB8GA1UdIwQYMBaAFEU9
-w6nR3D8kVpgccxiIav+DR+22MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0B
-AQUFAAOCAQEASZK8o+6svfoNyYt5hhwjdrCAWXf82n+0S9/DZEtqTg6t8n1Z
-dwWtColzsPq8y9yNAIiPpqCy6qxSJ7+hSHyXEHu67RMdmgduyzFiEuhjA6p9
-beP4G3YheBufS0OM00mG9htc9i5gFdPp43t1P9ACg9AYgkHNZTfqjjJ+vWuZ
-XTARyNtIVBw74acT02pIk/c9jH8F6M7ziCpjBLjqflh8AXtb4cV97yHgjQ5d
-UX2xZ/2jvTg2xvI4hocalmhgRvsoFEdV4aeADGvi6t9NfJBIoDa9CReJf8Py
-05yc493EG931t3GzUwWJBtDLSoDByFOQtTwxiBdQn8nEDovYqAJjDQ==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFLDCCBBSgAwIBAgIEOU99hzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQG
-EwJXVzESMBAGA1UEChMJYmVUUlVTVGVkMRswGQYDVQQDExJiZVRSVVNUZWQg
-Um9vdCBDQXMxGjAYBgNVBAMTEWJlVFJVU1RlZCBSb290IENBMB4XDTAwMDYy
-MDE0MjEwNFoXDTEwMDYyMDEzMjEwNFowWjELMAkGA1UEBhMCV1cxEjAQBgNV
-BAoTCWJlVFJVU1RlZDEbMBkGA1UEAxMSYmVUUlVTVGVkIFJvb3QgQ0FzMRow
-GAYDVQQDExFiZVRSVVNUZWQgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
-ggEPADCCAQoCggEBANS0c3oTCjhVAb6JVuGUntS+WutKNHUbYSnE4a0IYCF4
-SP+00PpeQY1hRIfo7clY+vyTmt9P6j41ffgzeubx181vSUs9Ty1uDoM6GHh3
-o8/n9E1z2Jo7Gh2+lVPPIJfCzz4kUmwMjmVZxXH/YgmPqsWPzGCgc0rXOD8V
-cr+il7dw6K/ifhYGTPWqZCZyByWtNfwYsSbX2P8ZDoMbjNx4RWc0PfSvHI3k
-bWvtILNnmrRhyxdviTX/507AMhLn7uzf/5cwdO2NR47rtMNE5qdMf1ZD6Li8
-tr76g5fmu/vEtpO+GRg+jIG5c4gW9JZDnGdzF5DYCW5jrEq2I8QBoa2k5MUC
-AwEAAaOCAfgwggH0MA8GA1UdEwEB/wQFMAMBAf8wggFZBgNVHSAEggFQMIIB
-TDCCAUgGCisGAQQBsT4BAAAwggE4MIIBAQYIKwYBBQUHAgIwgfQagfFSZWxp
-YW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVz
-IGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0
-ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGFuZCBjZXJ0aWZpY2F0aW9u
-IHByYWN0aWNlIHN0YXRlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IGJl
-VFJVU1RlZCdzIHdlYiBzaXRlLCBodHRwczovL3d3dy5iZVRSVVNUZWQuY29t
-L3ZhdWx0L3Rlcm1zMDEGCCsGAQUFBwIBFiVodHRwczovL3d3dy5iZVRSVVNU
-ZWQuY29tL3ZhdWx0L3Rlcm1zMDQGA1UdHwQtMCswKaAnoCWkIzAhMRIwEAYD
-VQQKEwliZVRSVVNUZWQxCzAJBgNVBAYTAldXMB0GA1UdDgQWBBQquZtpLjub
-2M3eKjEENGvKBxirZzAfBgNVHSMEGDAWgBQquZtpLjub2M3eKjEENGvKBxir
-ZzAOBgNVHQ8BAf8EBAMCAf4wDQYJKoZIhvcNAQEFBQADggEBAHlh26Nebhax
-6nZR+csVm8tpvuaBa58oH2U+3RGFktToQb9+M70j5/Egv6S0phkBxoyNNXxl
-pE8JpNbYIxUFE6dDea/bow6be3ga8wSGWsb2jCBHOElQBp1yZzrwmAOtlmdE
-/D8QDYZN5AA7KXvOOzuZhmElQITcE2K3+spZ1gMe1lMBzW1MaFVA4e5rxyoA
-AEiCswoBw2AqDPeCNe5IhpbkdNQ96gFxugR1QKepfzk5mlWXKWWuGVUlBXJH
-0+gY3Ljpr0NzARJ0o+FcXxVdJPP55PS2Z2cS52QiivalQaYctmBjRYoQtLpG
-EK5BV2VsPyMQPyEQWbfkQN0mDCP2qq4=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIGUTCCBTmgAwIBAgIEPLVPQDANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQK
-EwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEG
-A1UEAxMqYmVUUlVTVGVkIFJvb3QgQ0EgLSBFbnRydXN0IEltcGxlbWVudGF0
-aW9uMB4XDTAyMDQxMTA4MjQyN1oXDTIyMDQxMTA4NTQyN1owZjESMBAGA1UE
-ChMJYmVUUlVTVGVkMRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAx
-BgNVBAMTKmJlVFJVU1RlZCBSb290IENBIC0gRW50cnVzdCBJbXBsZW1lbnRh
-dGlvbjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALr0RAOqEmq1
-Q+xVkrYwfTVXDNvzDSduTPdQqJtOK2/b9a0cS12zqcH+e0TrW6MFDR/FNCsw
-ACnxeECypP869AGIF37m1CbTukzqMvtDd5eHI8XbQ6P1KqNRXuE70mVpflUV
-m3rnafdE4Fe1FehmYA8NA/uCjqPoEXtsvsdjDheT389Lrm5zdeDzqrmkwAkb
-hepxKYhBMvnwKg5sCfJ0a2ZsUhMfGLzUPvfYbiCeyv78IZTuEyhL11xeDGbu
-6bsPwTSxfwh28z0mcMmLJR1iJAzqHHVOwBLkuhMdMCktVjMFu5dZfsZJT4nX
-LySotohAtWSSU1Yk5KKghbNekLQSM80CAwEAAaOCAwUwggMBMIIBtwYDVR0g
-BIIBrjCCAaowggGmBg8rBgEEAbE+AAACCSiDkTEwggGRMIIBSQYIKwYBBQUH
-AgIwggE7GoIBN1JlbGlhbmNlIG9uIG9yIHVzZSBvZiB0aGlzIENlcnRpZmlj
-YXRlIGNyZWF0ZXMgYW4gYWNrbm93bGVkZ21lbnQgYW5kIGFjY2VwdGFuY2Ug
-b2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29u
-ZGl0aW9ucyBvZiB1c2UsIHRoZSBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0
-YXRlbWVudCBhbmQgdGhlIFJlbHlpbmcgUGFydHkgQWdyZWVtZW50LCB3aGlj
-aCBjYW4gYmUgZm91bmQgYXQgdGhlIGJlVFJVU1RlZCB3ZWIgc2l0ZSwgaHR0
-cHM6Ly93d3cuYmV0cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRl
-eC5odG1sMEIGCCsGAQUFBwIBFjZodHRwczovL3d3dy5iZXRydXN0ZWQuY29t
-L3Byb2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWwwEQYJYIZIAYb4QgEBBAQD
-AgAHMIGJBgNVHR8EgYEwfzB9oHugeaR3MHUxEjAQBgNVBAoTCWJlVFJVU1Rl
-ZDEbMBkGA1UECxMSYmVUUlVTVGVkIFJvb3QgQ0FzMTMwMQYDVQQDEypiZVRS
-VVNUZWQgUm9vdCBDQSAtIEVudHJ1c3QgSW1wbGVtZW50YXRpb24xDTALBgNV
-BAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMjA0MTEwODI0MjdagQ8yMDIyMDQx
-MTA4NTQyN1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaAFH1w5a44iwY/qhwa
-j/nPJDCqhIQWMB0GA1UdDgQWBBR9cOWuOIsGP6ocGo/5zyQwqoSEFjAMBgNV
-HRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIEkDANBgkq
-hkiG9w0BAQUFAAOCAQEAKrgXzh8QlOu4mre5X+za95IkrNySO8cgjfKZ5V04
-ocI07cUTWVwFtStPYZuR+0H8/NU8TZh2BvWBfevdkObRVlTa4y0MnxEylCIB
-evZsLHRnBMylj44ss0O1lKLQfelifwa+JwGDnjr9iu6YQ0pr17WXOzq/T220
-Y/ozADQuLW2WyXvKmWO6vvT2MKAtmJbpVkQFqUSjYRDrgqFnXbxdJ3Wqiig2
-KjiS2d2kXgClzMx8KSreKJCrt+G2/30lC0DYqjSjLd4H61/OCt3Kfjp9JsFi
-aDrmLzfzgYYhxKlkqu9FNtEaZnz46TfW1mG+oq1I59/mdP7TbX3SJdysYlep
-9w==
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFaDCCBFCgAwIBAgIQO1nHe81bV569N1KsdrSqGjANBgkqhkiG9w0BAQUF
-ADBiMRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBS
-b290IENBczEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1w
-bGVtZW50YXRpb24wHhcNMDIwNDExMTExODEzWhcNMjIwNDEyMTEwNzI1WjBi
-MRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290
-IENBczEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVt
-ZW50YXRpb24wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkujQw
-CY5X0LkGLG9uJIAiv11DpvpPrILnHGhwhRujbrWqeNluB0s/6d/16uhUoWGK
-Di9pdRi3DOUUjXFumLhV/AyV0Jtu4S2I1DpAa5LxmZZk3tv/ePTulh1HiXzU
-vrmIdyM6CeYEnm2qXtLIvZpOGd+J6lsOfsPktPDgaTuID0GQ+NRxQyTBjyZL
-O1bp/4xsN+lFrYWMU8NghpBKlsmzVLC7F/AcRdnUGxlkVgoZ98zh/4avflhe
-rHqQH8koOUV7orbHnB/ahdQhhlkwk75TMzf270HPM8ercmsl9fNTGwxMLvF1
-S++gh/f+ihXQbNXL+WhTuXAVE8L1LvtDNXUtAgMBAAGjggIYMIICFDAMBgNV
-HRMEBTADAQH/MIIBtQYDVR0gBIIBrDCCAagwggGkBg8rBgEEAbE+AAADCSiD
-kTEwggGPMEEGCCsGAQUFBwIBFjVodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20v
-cHJvZHVjdHNfc2VydmljZXMvaW5kZXguaHRtbDCCAUgGCCsGAQUFBwICMIIB
-OhqCATZSZWxpYW5jZSBvbiBvciB1c2Ugb2YgdGhpcyBDZXJ0aWZpY2F0ZSBj
-cmVhdGVzIGFuIGFja25vd2xlZGdtZW50IGFuZCBhY2NlcHRhbmNlIG9mIHRo
-ZSB0aGVuIGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlv
-bnMgb2YgdXNlLCB0aGUgQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1l
-bnQgYW5kIHRoZSBSZWx5aW5nIFBhcnR5IEFncmVlbWVudCwgd2hpY2ggY2Fu
-IGJlIGZvdW5kIGF0IHRoZSBiZVRSVVNUZWQgd2ViIHNpdGUsIGh0dHA6Ly93
-d3cuYmV0cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1s
-MAsGA1UdDwQEAwIBBjAfBgNVHSMEGDAWgBSp7BR++dlDzFMrFK3P9/BZiUHN
-GTAdBgNVHQ4EFgQUqewUfvnZQ8xTKxStz/fwWYlBzRkwDQYJKoZIhvcNAQEF
-BQADggEBANuXsHXqDMTBmMpWBcCorSZIry0g6IHHtt9DwSwddUvUQo3neqh0
-3GZCWYez9Wlt2ames30cMcH1VOJZJEnl7r05pmuKmET7m9cqg5c0Lcd9NUwt
-NLg+DcTsiCevnpL9UGGCqGAHFFPMZRPB9kdEadIxyKbdLrML3kqNWz2rDcI1
-UqJWN8wyiyiFQpyRQHpwKzg21eFzGh/l+n5f3NacOzDq28BbJ1zTcwfBwvNM
-m2+fG8oeqqg4MwlYsq78B+g23FW6L09A/nq9BqaBwZMifIYRCgZ3SK41ty8y
-mmFei74pnykkiFY5LKjSq5YDWtRIn7lAhAuYaPsBQ9Yb4gmxlxw=
+MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr
+MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl
+cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
+bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw
+CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h
+dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l
+cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h
+2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E
+lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV
+ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq
+299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t
+vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL
+dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
+AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF
+AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR
+zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3
+LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd
+7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw
+++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
+398znM/jra6O1I7mT1GvFpLgXPYHDw==
-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIFajCCBFKgAwIBAgIEPLU9RjANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwli
+ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMq
+YmVUUlVTVGVkIFJvb3QgQ0EtQmFsdGltb3JlIEltcGxlbWVudGF0aW9uMB4XDTAy
+MDQxMTA3Mzg1MVoXDTIyMDQxMTA3Mzg1MVowZjESMBAGA1UEChMJYmVUUlVTVGVk
+MRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNVBAMTKmJlVFJVU1Rl
+ZCBSb290IENBLUJhbHRpbW9yZSBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBALx+xDmcjOPWHIb/ymKt4H8wRXqOGrO4x/nRNv8i
+805qX4QQ+2aBw5R5MdKR4XeOGCrDFN5R9U+jK7wYFuK13XneIviCfsuBH/0nLI/6
+l2Qijvj/YaOcGx6Sj8CoCd8JEey3fTGaGuqDIQY8n7pc/5TqarjDa1U0Tz0yH92B
+FODEPM2dMPgwqZfT7syj0B9fHBOB1BirlNFjw55/NZKeX0Tq7PQiXLfoPX2k+Ymp
+kbIq2eszh+6l/ePazIjmiSZuxyuC0F6dWdsU7JGDBcNeDsYq0ATdcT0gTlgn/FP7
+eHgZFLL8kFKJOGJgB7Sg7KxrUNb9uShr71ItOrL/8QFArDcCAwEAAaOCAh4wggIa
+MA8GA1UdEwEB/wQFMAMBAf8wggG1BgNVHSAEggGsMIIBqDCCAaQGDysGAQQBsT4A
+AAEJKIORMTCCAY8wggFIBggrBgEFBQcCAjCCAToaggE2UmVsaWFuY2Ugb24gb3Ig
+dXNlIG9mIHRoaXMgQ2VydGlmaWNhdGUgY3JlYXRlcyBhbiBhY2tub3dsZWRnbWVu
+dCBhbmQgYWNjZXB0YW5jZSBvZiB0aGUgdGhlbiBhcHBsaWNhYmxlIHN0YW5kYXJk
+IHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZSwgdGhlIENlcnRpZmljYXRpb24g
+UHJhY3RpY2UgU3RhdGVtZW50IGFuZCB0aGUgUmVseWluZyBQYXJ0eSBBZ3JlZW1l
+bnQsIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCB0aGUgYmVUUlVTVGVkIHdlYiBzaXRl
+LCBodHRwOi8vd3d3LmJldHJ1c3RlZC5jb20vcHJvZHVjdHNfc2VydmljZXMvaW5k
+ZXguaHRtbDBBBggrBgEFBQcCARY1aHR0cDovL3d3dy5iZXRydXN0ZWQuY29tL3By
+b2R1Y3RzX3NlcnZpY2VzL2luZGV4Lmh0bWwwHQYDVR0OBBYEFEU9w6nR3D8kVpgc
+cxiIav+DR+22MB8GA1UdIwQYMBaAFEU9w6nR3D8kVpgccxiIav+DR+22MA4GA1Ud
+DwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEASZK8o+6svfoNyYt5hhwjdrCA
+WXf82n+0S9/DZEtqTg6t8n1ZdwWtColzsPq8y9yNAIiPpqCy6qxSJ7+hSHyXEHu6
+7RMdmgduyzFiEuhjA6p9beP4G3YheBufS0OM00mG9htc9i5gFdPp43t1P9ACg9AY
+gkHNZTfqjjJ+vWuZXTARyNtIVBw74acT02pIk/c9jH8F6M7ziCpjBLjqflh8AXtb
+4cV97yHgjQ5dUX2xZ/2jvTg2xvI4hocalmhgRvsoFEdV4aeADGvi6t9NfJBIoDa9
+CReJf8Py05yc493EG931t3GzUwWJBtDLSoDByFOQtTwxiBdQn8nEDovYqAJjDQ==
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIFLDCCBBSgAwIBAgIEOU99hzANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJX
+VzESMBAGA1UEChMJYmVUUlVTVGVkMRswGQYDVQQDExJiZVRSVVNUZWQgUm9vdCBD
+QXMxGjAYBgNVBAMTEWJlVFJVU1RlZCBSb290IENBMB4XDTAwMDYyMDE0MjEwNFoX
+DTEwMDYyMDEzMjEwNFowWjELMAkGA1UEBhMCV1cxEjAQBgNVBAoTCWJlVFJVU1Rl
+ZDEbMBkGA1UEAxMSYmVUUlVTVGVkIFJvb3QgQ0FzMRowGAYDVQQDExFiZVRSVVNU
+ZWQgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANS0c3oT
+CjhVAb6JVuGUntS+WutKNHUbYSnE4a0IYCF4SP+00PpeQY1hRIfo7clY+vyTmt9P
+6j41ffgzeubx181vSUs9Ty1uDoM6GHh3o8/n9E1z2Jo7Gh2+lVPPIJfCzz4kUmwM
+jmVZxXH/YgmPqsWPzGCgc0rXOD8Vcr+il7dw6K/ifhYGTPWqZCZyByWtNfwYsSbX
+2P8ZDoMbjNx4RWc0PfSvHI3kbWvtILNnmrRhyxdviTX/507AMhLn7uzf/5cwdO2N
+R47rtMNE5qdMf1ZD6Li8tr76g5fmu/vEtpO+GRg+jIG5c4gW9JZDnGdzF5DYCW5j
+rEq2I8QBoa2k5MUCAwEAAaOCAfgwggH0MA8GA1UdEwEB/wQFMAMBAf8wggFZBgNV
+HSAEggFQMIIBTDCCAUgGCisGAQQBsT4BAAAwggE4MIIBAQYIKwYBBQUHAgIwgfQa
+gfFSZWxpYW5jZSBvbiB0aGlzIGNlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBhc3N1
+bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0
+ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGFuZCBjZXJ0aWZpY2F0aW9uIHBy
+YWN0aWNlIHN0YXRlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IGJlVFJVU1Rl
+ZCdzIHdlYiBzaXRlLCBodHRwczovL3d3dy5iZVRSVVNUZWQuY29tL3ZhdWx0L3Rl
+cm1zMDEGCCsGAQUFBwIBFiVodHRwczovL3d3dy5iZVRSVVNUZWQuY29tL3ZhdWx0
+L3Rlcm1zMDQGA1UdHwQtMCswKaAnoCWkIzAhMRIwEAYDVQQKEwliZVRSVVNUZWQx
+CzAJBgNVBAYTAldXMB0GA1UdDgQWBBQquZtpLjub2M3eKjEENGvKBxirZzAfBgNV
+HSMEGDAWgBQquZtpLjub2M3eKjEENGvKBxirZzAOBgNVHQ8BAf8EBAMCAf4wDQYJ
+KoZIhvcNAQEFBQADggEBAHlh26Nebhax6nZR+csVm8tpvuaBa58oH2U+3RGFktTo
+Qb9+M70j5/Egv6S0phkBxoyNNXxlpE8JpNbYIxUFE6dDea/bow6be3ga8wSGWsb2
+jCBHOElQBp1yZzrwmAOtlmdE/D8QDYZN5AA7KXvOOzuZhmElQITcE2K3+spZ1gMe
+1lMBzW1MaFVA4e5rxyoAAEiCswoBw2AqDPeCNe5IhpbkdNQ96gFxugR1QKepfzk5
+mlWXKWWuGVUlBXJH0+gY3Ljpr0NzARJ0o+FcXxVdJPP55PS2Z2cS52QiivalQaYc
+tmBjRYoQtLpGEK5BV2VsPyMQPyEQWbfkQN0mDCP2qq4=
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIGUTCCBTmgAwIBAgIEPLVPQDANBgkqhkiG9w0BAQUFADBmMRIwEAYDVQQKEwli
+ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEzMDEGA1UEAxMq
+YmVUUlVTVGVkIFJvb3QgQ0EgLSBFbnRydXN0IEltcGxlbWVudGF0aW9uMB4XDTAy
+MDQxMTA4MjQyN1oXDTIyMDQxMTA4NTQyN1owZjESMBAGA1UEChMJYmVUUlVTVGVk
+MRswGQYDVQQLExJiZVRSVVNUZWQgUm9vdCBDQXMxMzAxBgNVBAMTKmJlVFJVU1Rl
+ZCBSb290IENBIC0gRW50cnVzdCBJbXBsZW1lbnRhdGlvbjCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBALr0RAOqEmq1Q+xVkrYwfTVXDNvzDSduTPdQqJtO
+K2/b9a0cS12zqcH+e0TrW6MFDR/FNCswACnxeECypP869AGIF37m1CbTukzqMvtD
+d5eHI8XbQ6P1KqNRXuE70mVpflUVm3rnafdE4Fe1FehmYA8NA/uCjqPoEXtsvsdj
+DheT389Lrm5zdeDzqrmkwAkbhepxKYhBMvnwKg5sCfJ0a2ZsUhMfGLzUPvfYbiCe
+yv78IZTuEyhL11xeDGbu6bsPwTSxfwh28z0mcMmLJR1iJAzqHHVOwBLkuhMdMCkt
+VjMFu5dZfsZJT4nXLySotohAtWSSU1Yk5KKghbNekLQSM80CAwEAAaOCAwUwggMB
+MIIBtwYDVR0gBIIBrjCCAaowggGmBg8rBgEEAbE+AAACCSiDkTEwggGRMIIBSQYI
+KwYBBQUHAgIwggE7GoIBN1JlbGlhbmNlIG9uIG9yIHVzZSBvZiB0aGlzIENlcnRp
+ZmljYXRlIGNyZWF0ZXMgYW4gYWNrbm93bGVkZ21lbnQgYW5kIGFjY2VwdGFuY2Ug
+b2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0
+aW9ucyBvZiB1c2UsIHRoZSBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu
+dCBhbmQgdGhlIFJlbHlpbmcgUGFydHkgQWdyZWVtZW50LCB3aGljaCBjYW4gYmUg
+Zm91bmQgYXQgdGhlIGJlVFJVU1RlZCB3ZWIgc2l0ZSwgaHR0cHM6Ly93d3cuYmV0
+cnVzdGVkLmNvbS9wcm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMEIGCCsGAQUF
+BwIBFjZodHRwczovL3d3dy5iZXRydXN0ZWQuY29tL3Byb2R1Y3RzX3NlcnZpY2Vz
+L2luZGV4Lmh0bWwwEQYJYIZIAYb4QgEBBAQDAgAHMIGJBgNVHR8EgYEwfzB9oHug
+eaR3MHUxEjAQBgNVBAoTCWJlVFJVU1RlZDEbMBkGA1UECxMSYmVUUlVTVGVkIFJv
+b3QgQ0FzMTMwMQYDVQQDEypiZVRSVVNUZWQgUm9vdCBDQSAtIEVudHJ1c3QgSW1w
+bGVtZW50YXRpb24xDTALBgNVBAMTBENSTDEwKwYDVR0QBCQwIoAPMjAwMjA0MTEw
+ODI0MjdagQ8yMDIyMDQxMTA4NTQyN1owCwYDVR0PBAQDAgEGMB8GA1UdIwQYMBaA
+FH1w5a44iwY/qhwaj/nPJDCqhIQWMB0GA1UdDgQWBBR9cOWuOIsGP6ocGo/5zyQw
+qoSEFjAMBgNVHRMEBTADAQH/MB0GCSqGSIb2fQdBAAQQMA4bCFY2LjA6NC4wAwIE
+kDANBgkqhkiG9w0BAQUFAAOCAQEAKrgXzh8QlOu4mre5X+za95IkrNySO8cgjfKZ
+5V04ocI07cUTWVwFtStPYZuR+0H8/NU8TZh2BvWBfevdkObRVlTa4y0MnxEylCIB
+evZsLHRnBMylj44ss0O1lKLQfelifwa+JwGDnjr9iu6YQ0pr17WXOzq/T220Y/oz
+ADQuLW2WyXvKmWO6vvT2MKAtmJbpVkQFqUSjYRDrgqFnXbxdJ3Wqiig2KjiS2d2k
+XgClzMx8KSreKJCrt+G2/30lC0DYqjSjLd4H61/OCt3Kfjp9JsFiaDrmLzfzgYYh
+xKlkqu9FNtEaZnz46TfW1mG+oq1I59/mdP7TbX3SJdysYlep9w==
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIFaDCCBFCgAwIBAgIQO1nHe81bV569N1KsdrSqGjANBgkqhkiG9w0BAQUFADBi
+MRIwEAYDVQQKEwliZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENB
+czEvMC0GA1UEAxMmYmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRp
+b24wHhcNMDIwNDExMTExODEzWhcNMjIwNDEyMTEwNzI1WjBiMRIwEAYDVQQKEwli
+ZVRSVVNUZWQxGzAZBgNVBAsTEmJlVFJVU1RlZCBSb290IENBczEvMC0GA1UEAxMm
+YmVUUlVTVGVkIFJvb3QgQ0EgLSBSU0EgSW1wbGVtZW50YXRpb24wggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkujQwCY5X0LkGLG9uJIAiv11DpvpPrILn
+HGhwhRujbrWqeNluB0s/6d/16uhUoWGKDi9pdRi3DOUUjXFumLhV/AyV0Jtu4S2I
+1DpAa5LxmZZk3tv/ePTulh1HiXzUvrmIdyM6CeYEnm2qXtLIvZpOGd+J6lsOfsPk
+tPDgaTuID0GQ+NRxQyTBjyZLO1bp/4xsN+lFrYWMU8NghpBKlsmzVLC7F/AcRdnU
+GxlkVgoZ98zh/4avflherHqQH8koOUV7orbHnB/ahdQhhlkwk75TMzf270HPM8er
+cmsl9fNTGwxMLvF1S++gh/f+ihXQbNXL+WhTuXAVE8L1LvtDNXUtAgMBAAGjggIY
+MIICFDAMBgNVHRMEBTADAQH/MIIBtQYDVR0gBIIBrDCCAagwggGkBg8rBgEEAbE+
+AAADCSiDkTEwggGPMEEGCCsGAQUFBwIBFjVodHRwOi8vd3d3LmJldHJ1c3RlZC5j
+b20vcHJvZHVjdHNfc2VydmljZXMvaW5kZXguaHRtbDCCAUgGCCsGAQUFBwICMIIB
+OhqCATZSZWxpYW5jZSBvbiBvciB1c2Ugb2YgdGhpcyBDZXJ0aWZpY2F0ZSBjcmVh
+dGVzIGFuIGFja25vd2xlZGdtZW50IGFuZCBhY2NlcHRhbmNlIG9mIHRoZSB0aGVu
+IGFwcGxpY2FibGUgc3RhbmRhcmQgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNl
+LCB0aGUgQ2VydGlmaWNhdGlvbiBQcmFjdGljZSBTdGF0ZW1lbnQgYW5kIHRoZSBS
+ZWx5aW5nIFBhcnR5IEFncmVlbWVudCwgd2hpY2ggY2FuIGJlIGZvdW5kIGF0IHRo
+ZSBiZVRSVVNUZWQgd2ViIHNpdGUsIGh0dHA6Ly93d3cuYmV0cnVzdGVkLmNvbS9w
+cm9kdWN0c19zZXJ2aWNlcy9pbmRleC5odG1sMAsGA1UdDwQEAwIBBjAfBgNVHSME
+GDAWgBSp7BR++dlDzFMrFK3P9/BZiUHNGTAdBgNVHQ4EFgQUqewUfvnZQ8xTKxSt
+z/fwWYlBzRkwDQYJKoZIhvcNAQEFBQADggEBANuXsHXqDMTBmMpWBcCorSZIry0g
+6IHHtt9DwSwddUvUQo3neqh03GZCWYez9Wlt2ames30cMcH1VOJZJEnl7r05pmuK
+mET7m9cqg5c0Lcd9NUwtNLg+DcTsiCevnpL9UGGCqGAHFFPMZRPB9kdEadIxyKbd
+LrML3kqNWz2rDcI1UqJWN8wyiyiFQpyRQHpwKzg21eFzGh/l+n5f3NacOzDq28Bb
+J1zTcwfBwvNMm2+fG8oeqqg4MwlYsq78B+g23FW6L09A/nq9BqaBwZMifIYRCgZ3
+SK41ty8ymmFei74pnykkiFY5LKjSq5YDWtRIn7lAhAuYaPsBQ9Yb4gmxlxw=
+-----END CERTIFICATE-----
+
-----BEGIN CERTIFICATE-----
MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC
TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0
@@ -1545,74 +1520,89 @@ SnQ2+Q==
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
-MIIETzCCAzegAwIBAgIEO63vKTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE
-ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg
-U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIzMTQxODE3WhcNMTEw
-OTIzMTMxODE3WjB1MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v
-LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWdu
-ZXQgLSBDQSBLbGFzYSAxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4SRW9Q58g5DY1Hw7h
-gCRKBEdPdGn0MFHsfw7rlu/oQm7IChI/uWd9q5wwo77YojtTDjRnpgZsjqBeynX8T90vFILqsY2K
-5CF1OESalwvVr3sZiQX79lisuFKat92u6hBFikFIVxfHHB67Af+g7u0dEHdDW7lwy81MwFYxBTRy
-9wIDAQABo4IBbTCCAWkwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwggEEBgNVHSAE
-gfwwgfkwgfYGDSsGAQQBvj8CAQoBAQAwgeQwgZoGCCsGAQUFBwICMIGNGoGKQ2VydHlmaWthdCB3
-eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtOiAiUG9saXR5a2EgQ2VydHlmaWthY2ppIGRs
-YSBSb290Q0EiLiBDZXJ0eWZpa2F0IHd5c3Rhd2lvbnkgcHJ6ZXogUm9vdENBIHcgaGllcmFyY2hp
-aSBDQyBTaWduZXQuMEUGCCsGAQUFBwIBFjlodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0b3Jp
-dW0vZG9rdW1lbnR5L3BjX3Jvb3RjYS50eHQwHwYDVR0jBBgwFoAUwJvFIw0C4aZOSGsfAOnjmhQb
-sa8wHQYDVR0OBBYEFMODHtVZd1T7TftXR/nEI1zR54njMA0GCSqGSIb3DQEBBQUAA4IBAQBRIHQB
-FIGh8Jpxt87AgSLwIEEk4+oGy769u3NtoaR0R3WNMdmt7fXTi0tyTQ9V4AIszxVjhnUPaKnF1KYy
-f8Tl+YTzk9ZfFkZ3kCdSaILZAOIrmqWNLPmjUQ5/JiMGho0e1YmWUcMci84+pIisTsytFzVP32/W
-+sz2H4FQAvOIMmxB7EJX9AdbnXn9EXZ+4nCqi0ft5z96ZqOJJiCB3vSaoYg+wdkcvb6souMJzuc2
-uptXtR1Xf3ihlHaGW+hmnpcwFA6AoNrom6Vgzk6U1ienx0Cw28BhRSKqzKkyXkuK8gRflZUx84uf
-tXncwKJrMiE3lvgOOBITRzcahirLer4c
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIE9zCCA9+gAwIBAgIEPL/xoTANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJQTDEfMB0GA1UE
-ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg
-U2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQgLSBQQ0EgS2xhc2EgMjAeFw0wMjA0MTkxMDI5NTNa
-Fw0xNzA0MTgxMjUzMDdaMHUxCzAJBgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4g
-eiBvLm8uMSQwIgYDVQQLExtDZW50cnVtIENlcnR5ZmlrYWNqaSBTaWduZXQxHzAdBgNVBAMTFkND
-IFNpZ25ldCAtIENBIEtsYXNhIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqgLJu
-QqY4yavbSgHg8CyfKTx4BokNSDOVz4eD9vptUr11Kqd06ED1hlH7Sg0goBFAfntNU/QTKwSBaNui
-me7C4sSEdgsKrPoAhGb4Mq8y7Ty7RqZz7mkzNMqzL2L2U4yQ2QjvpH8MH0IBqOWEcpSkpwnrCDIm
-RoTfd+YlZWKi2JceQixUUYIQ45Ox8+x8hHbvvZdgqtcvo8PW27qoHkp/7hMuJ44kDAGrmxffBXl/
-OBRZp0uO1CSLcMcVJzyr2phKhy406MYdWrtNPEluGs0GFDzd0nrIctiWAO4cmct4S72S9Q6e//0G
-O9f3/Ca5Kb2I1xYLj/xE+HgjHX9aD2MhAgMBAAGjggGMMIIBiDAPBgNVHRMBAf8EBTADAQH/MA4G
-A1UdDwEB/wQEAwIBBjCB4wYDVR0gBIHbMIHYMIHVBg0rBgEEAb4/AhQKAQEAMIHDMHUGCCsGAQUF
-BwICMGkaZ0NlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0
-eWthIENlcnR5ZmlrYWNqaSBQQ0EyIC0gQ2VydHlmaWthdHkgVXJ6ZWRvdyBLbGFzeSAyIi4wSgYI
-KwYBBQUHAgEWPmh0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9kb2t1bWVudHkva2xh
-c2EyL3BjX3BjYTIudHh0MD8GA1UdHwQ4MDYwNKAyoDCGLmh0dHA6Ly93d3cuc2lnbmV0LnBsL3Jl
-cG96eXRvcml1bS9jcmwvcGNhMi5jcmwwHwYDVR0jBBgwFoAUwGxGyl2CfpYHRonE82AVXO08kMIw
-HQYDVR0OBBYEFLtFBlILy4HNKVSzvHxBTM0HDowlMA0GCSqGSIb3DQEBBQUAA4IBAQBWTsCbqXrX
-hBBev5v5cIuc6gJM8ww7oR0uMQRZoFSqvQUPWBYM2/TLI/f8UM9hSShUVj3zEsSj/vFHagUVmzuV
-Xo5u0WK8iaqATSyEVBhADHrPG6wYcLKJlagge/ILA0m+SieyP2sjYD9MUB9KZIEyBKv0429UuDTw
-6P7pslxMWJBSNyQxaLIs0SRKsqZZWkc7ZYAj2apSkBMX2Is1oHA+PwkF6jQMwCao/+CndXPUzfCF
-6caa9WwW31W26MlXCvSmJgfiTPwGvm4PkPmOnmWZ3CczzhHl4q7ztHFzshJH3sZWDnrWwBFjzz5e
-Pr3WHV1wA7EY6oT4zBx+2gT9XBTB
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEUzCCAzugAwIBAgIEPq+qjzANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJQTDE3MDUGA1UE
-ChMuQ1ppQyBDZW50cmFzdCBTQSB3IGltaWVuaXUgTWluaXN0cmEgR29zcG9kYXJraTEZMBcGA1UE
-AxMQQ1ppQyBDZW50cmFzdCBTQTAeFw0wMzA0MzAxMDUwNTVaFw0wODA0MjgxMDUwNTVaMGgxCzAJ
-BgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4geiBvLm8uMR8wHQYDVQQDExZDQyBT
-aWduZXQgLSBDQSBLbGFzYSAzMRcwFQYDVQQFEw5OdW1lciB3cGlzdTogNDCCASIwDQYJKoZIhvcN
-AQEBBQADggEPADCCAQoCggEBALVdeOM62cPH2NERFxbS5FIp/HSv3fgesdVsTUFxZbGtE+/E0RMl
-KZQJHH9emx7vRYubsi4EOLCjYsCOTFvgGRIpZzx7R7T5c0Di5XFkRU4gjBl7aHJoKb5SLzGlWdoX
-GsekVtl6keEACrizV2EafqjI8cnBWY7OxQ1ooLQp5AeFjXg+5PT0lO6TUZAubqjFbhVbxSWjqvdj
-93RGfyYE76MnNn4c2xWySD07n7uno06TC0IJe6+3WSX1h+76VsIFouWBXOoM7cxxiLjoqdBVu24+
-P8e81SukE7qEvOwDPmk9ZJFtt1nBNg8a1kaixcljrA/43XwOPz6qnJ+cIj/xywECAwEAAaOCAQow
-ggEGMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMDMGA1UdIAEB/wQpMCcwJQYEVR0g
-ADAdMBsGCCsGAQUFBwIBFg93d3cuY2VudHJhc3QucGwwgY4GA1UdIwSBhjCBg4AU2a7r85Cp1iJN
-W0Ca1LR6VG3996ShZaRjMGExCzAJBgNVBAYTAlBMMTcwNQYDVQQKEy5DWmlDIENlbnRyYXN0IFNB
-IHcgaW1pZW5pdSBNaW5pc3RyYSBHb3Nwb2RhcmtpMRkwFwYDVQQDExBDWmlDIENlbnRyYXN0IFNB
-ggQ9/0sQMB0GA1UdDgQWBBR7Y8wZkHq0zrY7nn1tFSdQ0PlJuTANBgkqhkiG9w0BAQUFAAOCAQEA
-ldt/svO5c1MU08FKgrOXCGEbEPbQxhpM0xcd6Iv3dCo6qugEgjEs9Qm5CwUNKMnFsvR27cJWUvZb
-MVcvwlwCwclOdwF6u/QRS8bC2HYErhYo9bp9yuxxzuow2A94c5fPqfVrjXy+vDouchAm6+A5Wjzv
-J8wxVFDCs+9iGACmyUWr/JGXCYiQIbQkwlkRKHHlan9ymKf1NvIej/3EpeT8fKr6ywxGuhAfqofW
-pg3WJY/RCB4lTzD8vZGNwfMFGkWhJkypad3i9w3lGmDVpsHaWtCgGfd0H7tUtWPkP+t7EjIRCD9J
-HYnTR+wbbewc5vOI+UobR15ynGfFIaSIiMTVtQ==
+MIIETzCCAzegAwIBAgIEO63vKTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ
+TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu
+dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS
+b290Q0EwHhcNMDEwOTIzMTQxODE3WhcNMTEwOTIzMTMxODE3WjB1MQswCQYDVQQG
+EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb
+Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQg
+LSBDQSBLbGFzYSAxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4SRW9Q58g
+5DY1Hw7hgCRKBEdPdGn0MFHsfw7rlu/oQm7IChI/uWd9q5wwo77YojtTDjRnpgZs
+jqBeynX8T90vFILqsY2K5CF1OESalwvVr3sZiQX79lisuFKat92u6hBFikFIVxfH
+HB67Af+g7u0dEHdDW7lwy81MwFYxBTRy9wIDAQABo4IBbTCCAWkwDwYDVR0TAQH/
+BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwggEEBgNVHSAEgfwwgfkwgfYGDSsGAQQB
+vj8CAQoBAQAwgeQwgZoGCCsGAQUFBwICMIGNGoGKQ2VydHlmaWthdCB3eXN0YXdp
+b255IHpnb2RuaWUgeiBkb2t1bWVudGVtOiAiUG9saXR5a2EgQ2VydHlmaWthY2pp
+IGRsYSBSb290Q0EiLiBDZXJ0eWZpa2F0IHd5c3Rhd2lvbnkgcHJ6ZXogUm9vdENB
+IHcgaGllcmFyY2hpaSBDQyBTaWduZXQuMEUGCCsGAQUFBwIBFjlodHRwOi8vd3d3
+LnNpZ25ldC5wbC9yZXBvenl0b3JpdW0vZG9rdW1lbnR5L3BjX3Jvb3RjYS50eHQw
+HwYDVR0jBBgwFoAUwJvFIw0C4aZOSGsfAOnjmhQbsa8wHQYDVR0OBBYEFMODHtVZ
+d1T7TftXR/nEI1zR54njMA0GCSqGSIb3DQEBBQUAA4IBAQBRIHQBFIGh8Jpxt87A
+gSLwIEEk4+oGy769u3NtoaR0R3WNMdmt7fXTi0tyTQ9V4AIszxVjhnUPaKnF1KYy
+f8Tl+YTzk9ZfFkZ3kCdSaILZAOIrmqWNLPmjUQ5/JiMGho0e1YmWUcMci84+pIis
+TsytFzVP32/W+sz2H4FQAvOIMmxB7EJX9AdbnXn9EXZ+4nCqi0ft5z96ZqOJJiCB
+3vSaoYg+wdkcvb6souMJzuc2uptXtR1Xf3ihlHaGW+hmnpcwFA6AoNrom6Vgzk6U
+1ienx0Cw28BhRSKqzKkyXkuK8gRflZUx84uftXncwKJrMiE3lvgOOBITRzcahirL
+er4c
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIE9zCCA9+gAwIBAgIEPL/xoTANBgkqhkiG9w0BAQUFADB2MQswCQYDVQQGEwJQ
+TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu
+dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQgLSBQ
+Q0EgS2xhc2EgMjAeFw0wMjA0MTkxMDI5NTNaFw0xNzA0MTgxMjUzMDdaMHUxCzAJ
+BgNVBAYTAlBMMR8wHQYDVQQKExZUUCBJbnRlcm5ldCBTcC4geiBvLm8uMSQwIgYD
+VQQLExtDZW50cnVtIENlcnR5ZmlrYWNqaSBTaWduZXQxHzAdBgNVBAMTFkNDIFNp
+Z25ldCAtIENBIEtsYXNhIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQCqgLJuQqY4yavbSgHg8CyfKTx4BokNSDOVz4eD9vptUr11Kqd06ED1hlH7Sg0g
+oBFAfntNU/QTKwSBaNuime7C4sSEdgsKrPoAhGb4Mq8y7Ty7RqZz7mkzNMqzL2L2
+U4yQ2QjvpH8MH0IBqOWEcpSkpwnrCDImRoTfd+YlZWKi2JceQixUUYIQ45Ox8+x8
+hHbvvZdgqtcvo8PW27qoHkp/7hMuJ44kDAGrmxffBXl/OBRZp0uO1CSLcMcVJzyr
+2phKhy406MYdWrtNPEluGs0GFDzd0nrIctiWAO4cmct4S72S9Q6e//0GO9f3/Ca5
+Kb2I1xYLj/xE+HgjHX9aD2MhAgMBAAGjggGMMIIBiDAPBgNVHRMBAf8EBTADAQH/
+MA4GA1UdDwEB/wQEAwIBBjCB4wYDVR0gBIHbMIHYMIHVBg0rBgEEAb4/AhQKAQEA
+MIHDMHUGCCsGAQUFBwICMGkaZ0NlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmll
+IHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBQQ0EyIC0gQ2Vy
+dHlmaWthdHkgVXJ6ZWRvdyBLbGFzeSAyIi4wSgYIKwYBBQUHAgEWPmh0dHA6Ly93
+d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9kb2t1bWVudHkva2xhc2EyL3BjX3Bj
+YTIudHh0MD8GA1UdHwQ4MDYwNKAyoDCGLmh0dHA6Ly93d3cuc2lnbmV0LnBsL3Jl
+cG96eXRvcml1bS9jcmwvcGNhMi5jcmwwHwYDVR0jBBgwFoAUwGxGyl2CfpYHRonE
+82AVXO08kMIwHQYDVR0OBBYEFLtFBlILy4HNKVSzvHxBTM0HDowlMA0GCSqGSIb3
+DQEBBQUAA4IBAQBWTsCbqXrXhBBev5v5cIuc6gJM8ww7oR0uMQRZoFSqvQUPWBYM
+2/TLI/f8UM9hSShUVj3zEsSj/vFHagUVmzuVXo5u0WK8iaqATSyEVBhADHrPG6wY
+cLKJlagge/ILA0m+SieyP2sjYD9MUB9KZIEyBKv0429UuDTw6P7pslxMWJBSNyQx
+aLIs0SRKsqZZWkc7ZYAj2apSkBMX2Is1oHA+PwkF6jQMwCao/+CndXPUzfCF6caa
+9WwW31W26MlXCvSmJgfiTPwGvm4PkPmOnmWZ3CczzhHl4q7ztHFzshJH3sZWDnrW
+wBFjzz5ePr3WHV1wA7EY6oT4zBx+2gT9XBTB
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIEUzCCAzugAwIBAgIEPq+qjzANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQGEwJQ
+TDE3MDUGA1UEChMuQ1ppQyBDZW50cmFzdCBTQSB3IGltaWVuaXUgTWluaXN0cmEg
+R29zcG9kYXJraTEZMBcGA1UEAxMQQ1ppQyBDZW50cmFzdCBTQTAeFw0wMzA0MzAx
+MDUwNTVaFw0wODA0MjgxMDUwNTVaMGgxCzAJBgNVBAYTAlBMMR8wHQYDVQQKExZU
+UCBJbnRlcm5ldCBTcC4geiBvLm8uMR8wHQYDVQQDExZDQyBTaWduZXQgLSBDQSBL
+bGFzYSAzMRcwFQYDVQQFEw5OdW1lciB3cGlzdTogNDCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBALVdeOM62cPH2NERFxbS5FIp/HSv3fgesdVsTUFxZbGt
+E+/E0RMlKZQJHH9emx7vRYubsi4EOLCjYsCOTFvgGRIpZzx7R7T5c0Di5XFkRU4g
+jBl7aHJoKb5SLzGlWdoXGsekVtl6keEACrizV2EafqjI8cnBWY7OxQ1ooLQp5AeF
+jXg+5PT0lO6TUZAubqjFbhVbxSWjqvdj93RGfyYE76MnNn4c2xWySD07n7uno06T
+C0IJe6+3WSX1h+76VsIFouWBXOoM7cxxiLjoqdBVu24+P8e81SukE7qEvOwDPmk9
+ZJFtt1nBNg8a1kaixcljrA/43XwOPz6qnJ+cIj/xywECAwEAAaOCAQowggEGMA8G
+A1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMDMGA1UdIAEB/wQpMCcwJQYE
+VR0gADAdMBsGCCsGAQUFBwIBFg93d3cuY2VudHJhc3QucGwwgY4GA1UdIwSBhjCB
+g4AU2a7r85Cp1iJNW0Ca1LR6VG3996ShZaRjMGExCzAJBgNVBAYTAlBMMTcwNQYD
+VQQKEy5DWmlDIENlbnRyYXN0IFNBIHcgaW1pZW5pdSBNaW5pc3RyYSBHb3Nwb2Rh
+cmtpMRkwFwYDVQQDExBDWmlDIENlbnRyYXN0IFNBggQ9/0sQMB0GA1UdDgQWBBR7
+Y8wZkHq0zrY7nn1tFSdQ0PlJuTANBgkqhkiG9w0BAQUFAAOCAQEAldt/svO5c1MU
+08FKgrOXCGEbEPbQxhpM0xcd6Iv3dCo6qugEgjEs9Qm5CwUNKMnFsvR27cJWUvZb
+MVcvwlwCwclOdwF6u/QRS8bC2HYErhYo9bp9yuxxzuow2A94c5fPqfVrjXy+vDou
+chAm6+A5WjzvJ8wxVFDCs+9iGACmyUWr/JGXCYiQIbQkwlkRKHHlan9ymKf1NvIe
+j/3EpeT8fKr6ywxGuhAfqofWpg3WJY/RCB4lTzD8vZGNwfMFGkWhJkypad3i9w3l
+GmDVpsHaWtCgGfd0H7tUtWPkP+t7EjIRCD9JHYnTR+wbbewc5vOI+UobR15ynGfF
+IaSIiMTVtQ==
-----END CERTIFICATE-----
+
-----BEGIN CERTIFICATE-----
MIIEejCCA2KgAwIBAgIEP4vk6TANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQ
TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu
@@ -1639,6 +1629,7 @@ iCNe431axGNDWKnpuj2KUpj4CFHYsWCXky847YtTXDjri9NIwJJauazsrSjK+oXp
ngRS506mdQ7vWrtApkh8zhhWp7duCkjcCo1O8JxqYr2qEW1fXmgOISe010v2mmuv
hHxPyVwoAU4KkOw0nbXZn53yak0is5+XmAjh0wWue44AssHrjC9nUh3mkLt6eQ==
-----END CERTIFICATE-----
+
-----BEGIN CERTIFICATE-----
MIIEezCCA2OgAwIBAgIEP4vnLzANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJQ
TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEfMB0GA1UEAxMWQ0Mg
@@ -1665,100 +1656,123 @@ upyWls1BmYUxB91R7QkTiAUSNZ87s3auhZuG4f0V0JLVCcg2rn7AN1rfMkgxCbHk
GxiQbYWFljl6aatxR3odnnzVUe1I8uoY2JXpmmUcOG4dNGuQYziyKG3mtXCQWvug
5qi9Mf3KUh1oSTKx6HfLjjNl1+wMB5Mdb8LF0XyZLdJM9yIZh7SBRsYm9QiXevY=
-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIFGjCCBAKgAwIBAgIEPL7eEDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ
+TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu
+dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS
+b290Q0EwHhcNMDIwNDE4MTQ1NDA4WhcNMjYwOTIxMTU0MjE5WjB2MQswCQYDVQQG
+EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb
+Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQg
+LSBQQ0EgS2xhc2EgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM7B
+rBlbN5maM5eg0BOTqoZ+9NBDvU8Lm5rTdrMswFTCathzpVVLK/JD4K3+4oCZ9SRA
+spEXE4gvwb08ASY6w5s+HpRkeJw8YzMFR5kDZD5adgnCAy4vDfIXYZgppXPaTQ8w
+nfUZ7BZ7Zfa7QBemUIcJIzJBB0UqgtxWCeol9IekpBRVmuuSA6QG0Jkm+pGDJ05y
+j2eQG8jTcBENM7sVA8rGRMyFA4skSZ+D0OG6FS2xC1i9JyN0ag1yII/LPx8HK5J4
+W9MaPRNjAEeaa2qI9EpchwrOxnyVbQfSedCG1VRJfAsE/9tT9CMUPZ3xW20QjQcS
+ZJqVcmGW9gVsXKQOVLsCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYD
+VR0PAQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQEBMIHk
+MIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmll
+IHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENB
+Ii4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNo
+aWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwv
+cmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw
+OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Ev
+cm9vdGNhLmNybDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNV
+HQ4EFgQUwGxGyl2CfpYHRonE82AVXO08kMIwDQYJKoZIhvcNAQEFBQADggEBABp1
+TAUsa+BeVWg4cjowc8yTJ5XN3GvN96GObMkxUGY7U9kVrLI71xBgoNVyzXTiMNDB
+vjh7vdPWjpl5SDiRpnnKiOFXA43HvNWzUaOkTu1mxjJsZsanot1Xt6j0ZDC+03Fj
+LHdYMyM9kSWp6afb4980EPYZCcSzgM5TOGfJmNii5Tq468VFKrX+52Aou1G22Ohu
++EEOlOrG7ylKv1hHUJJCjwN0ZVEIn1nDbrU9FeGCz8J9ihVUvnENEBbBkU37PWqW
+uHitKQDVtcwTwJJdR8cmKq3NmkwAm9fPacidQLpaw0WkuGrS+fEDhu1Nhy9xELP6
+NA9GRTCNxm/dXlcwnmY=
+-----END CERTIFICATE-----
+
-----BEGIN CERTIFICATE-----
-MIIFGjCCBAKgAwIBAgIEPL7eEDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE
-ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg
-U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwNDE4MTQ1NDA4WhcNMjYw
-OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v
-LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu
-ZXQgLSBQQ0EgS2xhc2EgMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM7BrBlbN5ma
-M5eg0BOTqoZ+9NBDvU8Lm5rTdrMswFTCathzpVVLK/JD4K3+4oCZ9SRAspEXE4gvwb08ASY6w5s+
-HpRkeJw8YzMFR5kDZD5adgnCAy4vDfIXYZgppXPaTQ8wnfUZ7BZ7Zfa7QBemUIcJIzJBB0UqgtxW
-Ceol9IekpBRVmuuSA6QG0Jkm+pGDJ05yj2eQG8jTcBENM7sVA8rGRMyFA4skSZ+D0OG6FS2xC1i9
-JyN0ag1yII/LPx8HK5J4W9MaPRNjAEeaa2qI9EpchwrOxnyVbQfSedCG1VRJfAsE/9tT9CMUPZ3x
-W20QjQcSZJqVcmGW9gVsXKQOVLsCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
-AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQEBMIHkMIGaBggrBgEFBQcC
-AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0
-eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6
-IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z
-aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw
-OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy
-bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUwGxGyl2CfpYHRonE
-82AVXO08kMIwDQYJKoZIhvcNAQEFBQADggEBABp1TAUsa+BeVWg4cjowc8yTJ5XN3GvN96GObMkx
-UGY7U9kVrLI71xBgoNVyzXTiMNDBvjh7vdPWjpl5SDiRpnnKiOFXA43HvNWzUaOkTu1mxjJsZsan
-ot1Xt6j0ZDC+03FjLHdYMyM9kSWp6afb4980EPYZCcSzgM5TOGfJmNii5Tq468VFKrX+52Aou1G2
-2Ohu+EEOlOrG7ylKv1hHUJJCjwN0ZVEIn1nDbrU9FeGCz8J9ihVUvnENEBbBkU37PWqWuHitKQDV
-tcwTwJJdR8cmKq3NmkwAm9fPacidQLpaw0WkuGrS+fEDhu1Nhy9xELP6NA9GRTCNxm/dXlcwnmY=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIFGjCCBAKgAwIBAgIEPV0tNDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE
-ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg
-U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDIwODE2MTY0OTU2WhcNMjYw
-OTIxMTU0MjE5WjB2MQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v
-LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWdu
-ZXQgLSBQQ0EgS2xhc2EgMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALN3LanJtdue
-Ne6geWUTFENa+lEuzqELcoqhYB+a/tJcPEkc6TX/bYPzalRRjqs+quMP6KZTU0DixOrV+K7iWaqA
-iQ913HX5IBLmKDCrTVW/ZvSDpiBKbxlHfSNuJxAuVT6HdbzK7yAW38ssX+yS2tZYHZ5FhZcfqzPE
-OpO94mAKcBUhk6T/ki0evXX/ZvvktwmF3hKattzwtM4JMLurAEl8SInyEYULw5JdlfcBez2Tg6Db
-w34hA1A+ckTwhxzecrB8TUe2BnQKOs9vr2cCACpFFcOmPkM0Drtjctr1QHm1tYSqRFRf9VcV5tfC
-3P8QqoK4ONjtLPHc9x5NE1uK/FMCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
-AQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQECMIHkMIGaBggrBgEFBQcC
-AjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0
-eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6
-IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5z
-aWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw
-OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Evcm9vdGNhLmNy
-bDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNVHQ4EFgQUXvthcPHlH5BgGhlM
-ErJNXWlhlgAwDQYJKoZIhvcNAQEFBQADggEBACIce95Mvn710KCAISA0CuHD4aznTU6pLoCDShW4
-7OR+GTpJUm1coTcUqlBHV9mra4VFrBcBuOkHZoBLq/jmE0QJWnpSEULDcH9J3mF0nqO9SM+mWyJG
-dsJF/XU/7smummgjMNQXwzQTtWORF+6v5KUbWX85anO2wR+M6YTBWC55zWpWi4RG3vkHFs5Ze2oF
-JTlpuxw9ZgxTnWlwI9QR2MvEhYIUMKMOWxw1nt0kKj+5TCNQQGh/VJJ1dsiroGh/io1DOcePEhKz
-1Ag52y6Wf0nJJB9yk0sFakqZH18F7eQecQImgZyyeRtsG95leNugB3BXWCW+KxwiBrtQTXv4dTE=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIIEzzCCA7egAwIBAgIEO6ocGTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQTDEfMB0GA1UE
-ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg
-U2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBSb290Q0EwHhcNMDEwOTIwMTY0MjE5WhcNMjYw
-OTIxMTU0MjE5WjBxMQswCQYDVQQGEwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5v
-LjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWdu
-ZXQgLSBSb290Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrr2vydnNpELfGW3Ks
-ARiDhJvwDtUe4AbWev+OfMc3+vA29nX8ZmIwno3gmItjo5DbUCCRiCMq5c9epcGu+kg4a3BJChVX
-REl8gVh0ST15rr3RKrSc4VgsvQzl0ZUraeQLl8JoRT5PLsUj3qwF78jUCQVckiiLVcnGfZtFCm+D
-CJXliQBDMB9XFAUEiO/DtEBs0B7wJGx7lgJeJpQUcGiaOPjcJDYOk7rNAYmmD2gWeSlepufO8luU
-YG/YDxTC4mqhRqfa4MnVO5dqy+ICj2UvUpHbZDB0KfGRibgBYeQP1kuqgIzJN4UqknVAJb0aMBSP
-l+9k2fAUdchx1njlbdcbAgMBAAGjggFtMIIBaTAPBgNVHRMBAf8EBTADAQH/MIIBBAYDVR0gBIH8
-MIH5MIH2Bg0rBgEEAb4/AgEKAQEAMIHkMIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lz
-dGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEg
-Um9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNoaWkg
-Q0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVt
-L2Rva3VtZW50eS9wY19yb290Y2EudHh0MB0GA1UdDgQWBBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAf
-BgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcN
-AQEFBQADggEBAGnY5QmYqnnO9OqFOWZxxb25UHRnaRF6IV9aaGit5BZufZj2Tq3v8L3SgE34GOoI
-cdRMMG5JEpEU4mN/Ef3oY6Eo+7HfqaPHI4KFmbDSPiK5s+wmf+bQSm0Yq5/h4ZOdcAESlLQeLSt1
-CQk2JoKQJ6pyAf6xJBgWEIlm4RXE4J3324PUiOp83kW6MDvaa1xY976WyInr4rwoLgxVl11LZeKW
-ha0RJJxJgw/NyWpKG7LWCm1fglF8JH51vZNndGYq1iKtfnrIOvLZq6bzaCiZm1EurD8HE6P7pmAB
-KK6o3C2OXlNfNIgwkDN/cDqk5TYsTkrpfriJPdxXBH8hQOkW89g=
------END CERTIFICATE-----
------BEGIN CERTIFICATE-----
-MIID/TCCA2agAwIBAgIEP4/gkTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQTDEfMB0GA1UE
-ChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2VudHJ1bSBDZXJ0eWZpa2Fjamkg
-U2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBDQSBLbGFzYSAxMB4XDTAzMTAxNzEyMjkwMloX
-DTExMDkyMzExMTgxN1owdjELMAkGA1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6
-IG8uby4xJDAiBgNVBAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEgMB4GA1UEAxMXQ0Mg
-U2lnbmV0IC0gVFNBIEtsYXNhIDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOJYrISEtSsd
-uHajROh5/n7NGrkpYTT9NEaPe9+ucuQ37KxIbfJwXJjgUc1dw4wCkcQ12FJarD1X6mSQ4cfN/60v
-LfKI5ZD4nhJTMKlAj1pX9ScQ/MuyvKStCbn5WTkjPhjRAM0tdwXSnzuTEunfw0Oup559y3Iqxg1c
-ExflB6cfAgMBAAGjggGXMIIBkzBBBgNVHR8EOjA4MDagNKAyhjBodHRwOi8vd3d3LnNpZ25ldC5w
-bC9yZXBvenl0b3JpdW0vY3JsL2tsYXNhMS5jcmwwDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQM
-MAoGCCsGAQUFBwMIMIHaBgNVHSAEgdIwgc8wgcwGDSsGAQQBvj8CZAoRAgEwgbowbwYIKwYBBQUH
-AgIwYxphQ2VydHlmaWthdCB3eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVudGVtICJQb2xpdHlr
-YSBDZXJ0eWZpa2FjamkgQ0MgU2lnbmV0IC0gWm5ha293YW5pZSBjemFzZW0iLjBHBggrBgEFBQcC
-ARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY190c2ExXzJf
-MS5wZGYwHwYDVR0jBBgwFoAUw4Me1Vl3VPtN+1dH+cQjXNHnieMwHQYDVR0OBBYEFJdDwEqtcavO
-Yd9u9tej53vWXwNBMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADgYEAnpiQkqLCJQYXUrqMHUEz
-+z3rOqS0XzSFnVVLhkVssvXc8S3FkJIiQTUrkScjI4CToCzujj3EyfNxH6yiLlMbskF8I31JxIeB
-vueqV+s+o76CZm3ycu9hb0I4lswuxoT+q5ZzPR8Irrb51rZXlolR+7KtwMg4sFDJZ8RNgOf7tbA=
+MIIFGjCCBAKgAwIBAgIEPV0tNDANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ
+TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu
+dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS
+b290Q0EwHhcNMDIwODE2MTY0OTU2WhcNMjYwOTIxMTU0MjE5WjB2MQswCQYDVQQG
+EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb
+Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MSAwHgYDVQQDExdDQyBTaWduZXQg
+LSBQQ0EgS2xhc2EgMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALN3
+LanJtdueNe6geWUTFENa+lEuzqELcoqhYB+a/tJcPEkc6TX/bYPzalRRjqs+quMP
+6KZTU0DixOrV+K7iWaqAiQ913HX5IBLmKDCrTVW/ZvSDpiBKbxlHfSNuJxAuVT6H
+dbzK7yAW38ssX+yS2tZYHZ5FhZcfqzPEOpO94mAKcBUhk6T/ki0evXX/ZvvktwmF
+3hKattzwtM4JMLurAEl8SInyEYULw5JdlfcBez2Tg6Dbw34hA1A+ckTwhxzecrB8
+TUe2BnQKOs9vr2cCACpFFcOmPkM0Drtjctr1QHm1tYSqRFRf9VcV5tfC3P8QqoK4
+ONjtLPHc9x5NE1uK/FMCAwEAAaOCAbMwggGvMA8GA1UdEwEB/wQFMAMBAf8wDgYD
+VR0PAQH/BAQDAgEGMIIBBAYDVR0gBIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQECMIHk
+MIGaBggrBgEFBQcCAjCBjRqBikNlcnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmll
+IHogZG9rdW1lbnRlbTogIlBvbGl0eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENB
+Ii4gQ2VydHlmaWthdCB3eXN0YXdpb255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNo
+aWkgQ0MgU2lnbmV0LjBFBggrBgEFBQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwv
+cmVwb3p5dG9yaXVtL2Rva3VtZW50eS9wY19yb290Y2EudHh0MEQGA1UdHwQ9MDsw
+OaA3oDWGM2h0dHA6Ly93d3cuc2lnbmV0LnBsL3JlcG96eXRvcml1bS9yb290Y2Ev
+cm9vdGNhLmNybDAfBgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAdBgNV
+HQ4EFgQUXvthcPHlH5BgGhlMErJNXWlhlgAwDQYJKoZIhvcNAQEFBQADggEBACIc
+e95Mvn710KCAISA0CuHD4aznTU6pLoCDShW47OR+GTpJUm1coTcUqlBHV9mra4VF
+rBcBuOkHZoBLq/jmE0QJWnpSEULDcH9J3mF0nqO9SM+mWyJGdsJF/XU/7smummgj
+MNQXwzQTtWORF+6v5KUbWX85anO2wR+M6YTBWC55zWpWi4RG3vkHFs5Ze2oFJTlp
+uxw9ZgxTnWlwI9QR2MvEhYIUMKMOWxw1nt0kKj+5TCNQQGh/VJJ1dsiroGh/io1D
+OcePEhKz1Ag52y6Wf0nJJB9yk0sFakqZH18F7eQecQImgZyyeRtsG95leNugB3BX
+WCW+KxwiBrtQTXv4dTE=
-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIEzzCCA7egAwIBAgIEO6ocGTANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJQ
+TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu
+dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQgLSBS
+b290Q0EwHhcNMDEwOTIwMTY0MjE5WhcNMjYwOTIxMTU0MjE5WjBxMQswCQYDVQQG
+EwJQTDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMb
+Q2VudHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MRswGQYDVQQDExJDQyBTaWduZXQg
+LSBSb290Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrr2vydnNp
+ELfGW3KsARiDhJvwDtUe4AbWev+OfMc3+vA29nX8ZmIwno3gmItjo5DbUCCRiCMq
+5c9epcGu+kg4a3BJChVXREl8gVh0ST15rr3RKrSc4VgsvQzl0ZUraeQLl8JoRT5P
+LsUj3qwF78jUCQVckiiLVcnGfZtFCm+DCJXliQBDMB9XFAUEiO/DtEBs0B7wJGx7
+lgJeJpQUcGiaOPjcJDYOk7rNAYmmD2gWeSlepufO8luUYG/YDxTC4mqhRqfa4MnV
+O5dqy+ICj2UvUpHbZDB0KfGRibgBYeQP1kuqgIzJN4UqknVAJb0aMBSPl+9k2fAU
+dchx1njlbdcbAgMBAAGjggFtMIIBaTAPBgNVHRMBAf8EBTADAQH/MIIBBAYDVR0g
+BIH8MIH5MIH2Bg0rBgEEAb4/AgEKAQEAMIHkMIGaBggrBgEFBQcCAjCBjRqBikNl
+cnR5ZmlrYXQgd3lzdGF3aW9ueSB6Z29kbmllIHogZG9rdW1lbnRlbTogIlBvbGl0
+eWthIENlcnR5ZmlrYWNqaSBkbGEgUm9vdENBIi4gQ2VydHlmaWthdCB3eXN0YXdp
+b255IHByemV6IFJvb3RDQSB3IGhpZXJhcmNoaWkgQ0MgU2lnbmV0LjBFBggrBgEF
+BQcCARY5aHR0cDovL3d3dy5zaWduZXQucGwvcmVwb3p5dG9yaXVtL2Rva3VtZW50
+eS9wY19yb290Y2EudHh0MB0GA1UdDgQWBBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAf
+BgNVHSMEGDAWgBTAm8UjDQLhpk5Iax8A6eOaFBuxrzAOBgNVHQ8BAf8EBAMCAQYw
+DQYJKoZIhvcNAQEFBQADggEBAGnY5QmYqnnO9OqFOWZxxb25UHRnaRF6IV9aaGit
+5BZufZj2Tq3v8L3SgE34GOoIcdRMMG5JEpEU4mN/Ef3oY6Eo+7HfqaPHI4KFmbDS
+PiK5s+wmf+bQSm0Yq5/h4ZOdcAESlLQeLSt1CQk2JoKQJ6pyAf6xJBgWEIlm4RXE
+4J3324PUiOp83kW6MDvaa1xY976WyInr4rwoLgxVl11LZeKWha0RJJxJgw/NyWpK
+G7LWCm1fglF8JH51vZNndGYq1iKtfnrIOvLZq6bzaCiZm1EurD8HE6P7pmABKK6o
+3C2OXlNfNIgwkDN/cDqk5TYsTkrpfriJPdxXBH8hQOkW89g=
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIID/TCCA2agAwIBAgIEP4/gkTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJQ
+TDEfMB0GA1UEChMWVFAgSW50ZXJuZXQgU3AuIHogby5vLjEkMCIGA1UECxMbQ2Vu
+dHJ1bSBDZXJ0eWZpa2FjamkgU2lnbmV0MR8wHQYDVQQDExZDQyBTaWduZXQgLSBD
+QSBLbGFzYSAxMB4XDTAzMTAxNzEyMjkwMloXDTExMDkyMzExMTgxN1owdjELMAkG
+A1UEBhMCUEwxHzAdBgNVBAoTFlRQIEludGVybmV0IFNwLiB6IG8uby4xJDAiBgNV
+BAsTG0NlbnRydW0gQ2VydHlmaWthY2ppIFNpZ25ldDEgMB4GA1UEAxMXQ0MgU2ln
+bmV0IC0gVFNBIEtsYXNhIDEwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAOJY
+rISEtSsduHajROh5/n7NGrkpYTT9NEaPe9+ucuQ37KxIbfJwXJjgUc1dw4wCkcQ1
+2FJarD1X6mSQ4cfN/60vLfKI5ZD4nhJTMKlAj1pX9ScQ/MuyvKStCbn5WTkjPhjR
+AM0tdwXSnzuTEunfw0Oup559y3Iqxg1cExflB6cfAgMBAAGjggGXMIIBkzBBBgNV
+HR8EOjA4MDagNKAyhjBodHRwOi8vd3d3LnNpZ25ldC5wbC9yZXBvenl0b3JpdW0v
+Y3JsL2tsYXNhMS5jcmwwDgYDVR0PAQH/BAQDAgeAMBYGA1UdJQEB/wQMMAoGCCsG
+AQUFBwMIMIHaBgNVHSAEgdIwgc8wgcwGDSsGAQQBvj8CZAoRAgEwgbowbwYIKwYB
+BQUHAgIwYxphQ2VydHlmaWthdCB3eXN0YXdpb255IHpnb2RuaWUgeiBkb2t1bWVu
+dGVtICJQb2xpdHlrYSBDZXJ0eWZpa2FjamkgQ0MgU2lnbmV0IC0gWm5ha293YW5p
+ZSBjemFzZW0iLjBHBggrBgEFBQcCARY7aHR0cDovL3d3dy5zaWduZXQucGwvcmVw
+b3p5dG9yaXVtL2Rva3VtZW50eS9wY190c2ExXzJfMS5wZGYwHwYDVR0jBBgwFoAU
+w4Me1Vl3VPtN+1dH+cQjXNHnieMwHQYDVR0OBBYEFJdDwEqtcavOYd9u9tej53vW
+XwNBMAkGA1UdEwQCMAAwDQYJKoZIhvcNAQEFBQADgYEAnpiQkqLCJQYXUrqMHUEz
++z3rOqS0XzSFnVVLhkVssvXc8S3FkJIiQTUrkScjI4CToCzujj3EyfNxH6yiLlMb
+skF8I31JxIeBvueqV+s+o76CZm3ycu9hb0I4lswuxoT+q5ZzPR8Irrb51rZXlolR
++7KtwMg4sFDJZ8RNgOf7tbA=
+-----END CERTIFICATE-----
+
-----BEGIN CERTIFICATE-----
MIIEFTCCA36gAwIBAgIBADANBgkqhkiG9w0BAQQFADCBvjELMAkGA1UEBhMCVVMx
EDAOBgNVBAgTB0luZGlhbmExFTATBgNVBAcTDEluZGlhbmFwb2xpczEoMCYGA1UE
@@ -1783,6 +1797,7 @@ AQEEBQADgYEAm/Abn8c2y1nO3fgpAIslxvi9iNBZDhQtJ0VQZY6wgSfANyDOR4DW
iexO/AlorB49KnkFS7TjCAoLOZhcg5FaNiKnlstMI5krQmau1Qnb/vGSNsE/UGms
1ts+QYPUs0KmGEAFUri2XzLy+aQo9Kw74VBvqnxvaaMeY5yMcKNOieY=
-----END CERTIFICATE-----
+
-----BEGIN CERTIFICATE-----
MIIEUDCCA7mgAwIBAgIJAN4ppNGwj6yIMA0GCSqGSIb3DQEBBAUAMIHMMQswCQYD
VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNU2FuIEZyYW5j
@@ -1809,3 +1824,48 @@ xA39CIJ65Zozs28Eg1aV9/Y+Of7TnWhW+U3J3/wD/GghaAGiKK6vMn9gJBIdBX/9
e6ef37VGyiOEFFjnUIbuk0RWty0orN76q/lI/xjCi15XSA/VSq2j4vmnwfZcPTDu
glmQ1A==
-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIDQTCCAikCBEvyOsEwDQYJKoZIhvcNAQEEBQAwSDENMAsGA1UECxMER0lBQjEi
+MCAGA1UEAxMZY2hpbW5leXJvY2subGluZGVubGFiLmNvbTETMBEGA1UEChMKTGlu
+ZGVuIExhYjAeFw0xMDA1MTcyMTUzMDVaFw0xMTA1MTcyMTUzMDVaMCQxIjAgBgNV
+BAMTGWNoaW1uZXlyb2NrLmxpbmRlbmxhYi5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD
+gY0AMIGJAoGBALYZBzbHpME8PQIO4lhokeLT9mowtw7/XO6DYAJwosRJ4zcEw+/5
+IBfKMfQwtbt9JeJULFEn37NL1UbMxIXXmhc5ksjh04WoOyNhPT10mLJ2bLbTa+xw
+UEm5S3qo/4DKu6I/ONeKDX17XXs0MJQYr4JV0PaXig57Q7GUsEut1hslAgMBAAGj
+gd8wgdwwEwYDVR0lBAwwCgYIKwYBBQUHAwEwCQYDVR0TBAIwADALBgNVHQ8EBAMC
+BaAwfwYDVR0jBHgwdoAgxeADFdbMC6h1FEvUr1CQ+/0Gy9PZFec3OIBsByVVfc2h
+TKRKMEgxDTALBgNVBAsTBEdJQUIxIjAgBgNVBAMTGWNoaW1uZXlyb2NrLmxpbmRl
+bmxhYi5jb20xEzARBgNVBAoTCkxpbmRlbiBMYWKCBEvxusEwLAYDVR0OAQH/BCIE
+IOSsRq4oCDj4UyXZWXuTbBjCxpSmM7K+JBWMRuZJnQm4MA0GCSqGSIb3DQEBBAUA
+A4IBAQBSfsuZTC8dfsJfaIKywQDYMrjutSKEKLm7l9BtBKQKKG97k4GAnQL+9nvn
+sOv5moA8qIuHdj05qoEvaMmOgKWGoNWr5YBN/gE1k15U8KdU6Z4usS5hx+6lcCb4
+kD4LybSGUku/Jl9qikT82mdEQA5FerNeA9XAq9LWDF37IorUsDlJTe4STb01LZO8
+37tAJ2eEgsY3cFFk5Zrdi46BRcixnLDRLTVGSUnOKKmaqUF1fFESO+kJFfYjH6Bu
+gxO37yK5JUII7t4zNaTJnuFPbUxcNa/WQOMTBzp5xXdnqkTxJk4oHvO7x3+SEElZ
+KeKB2mkBRCUG3dznWSFWrUT9hrui
+-----END CERTIFICATE-----
+
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
+ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
+MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
+LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
+RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
+PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
+xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
+Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
+hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
+EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
+FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
+nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
+eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
+hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
+Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
+vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
++OkuE6N36B9K
+-----END CERTIFICATE-----
diff --git a/indra/newview/app_settings/ignorable_dialogs.xml b/indra/newview/app_settings/ignorable_dialogs.xml
index e825f13e82..d0e1f62a84 100644
--- a/indra/newview/app_settings/ignorable_dialogs.xml
+++ b/indra/newview/app_settings/ignorable_dialogs.xml
@@ -177,17 +177,6 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>FirstStreamingMedia</key>
- <map>
- <key>Comment</key>
- <string>Enables FirstStreamingMedia warning dialog</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
<key>FirstTeleport</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini
index 0805e94b10..263b73ba23 100644
--- a/indra/newview/app_settings/keywords.ini
+++ b/indra/newview/app_settings/keywords.ini
@@ -497,6 +497,7 @@ PARCEL_DETAILS_DESC Used with llGetParcelDetails to get the parcel description.
PARCEL_DETAILS_OWNER Used with llGetParcelDetails to get the parcel owner id.
PARCEL_DETAILS_GROUP Used with llGetParcelDetails to get the parcel group id.
PARCEL_DETAILS_AREA Used with llGetParcelDetails to get the parcel area in square meters.
+PARCEL_DETAILS_ID Used with llGetParcelDetails to get the parcel id.
STRING_TRIM_HEAD Used with llStringTrim to trim leading spaces from a string.
STRING_TRIM_TAIL Used with llStringTrim to trim trailing spaces from a string.
diff --git a/indra/newview/app_settings/logcontrol.xml b/indra/newview/app_settings/logcontrol.xml
index d7bb64ce8a..937c4e4c6a 100644
--- a/indra/newview/app_settings/logcontrol.xml
+++ b/indra/newview/app_settings/logcontrol.xml
@@ -25,6 +25,7 @@
<string>AppCache</string>
<string>Window</string>
<string>RenderInit</string>
+ <string>MediaAuth</string>
</array>
</map>
<map>
@@ -40,6 +41,8 @@
</array>
<key>tags</key>
<array>
+ <!-- sample entry for debugging a specific item -->
+<!-- <string>Voice</string> -->
</array>
</map>
</array>
diff --git a/indra/newview/app_settings/low_graphics.xml b/indra/newview/app_settings/low_graphics.xml
index 3f67a70d7a..d02a13a671 100644
--- a/indra/newview/app_settings/low_graphics.xml
+++ b/indra/newview/app_settings/low_graphics.xml
@@ -4,6 +4,8 @@
<RenderAvatarCloth value="FALSE"/>
<!--Default for now-->
<RenderAvatarLODFactor value="0.5"/>
+ <!--Default for now-->
+ <RenderAvatarMaxVisible value="3"/>
<!--NO SHADERS-->
<RenderAvatarVP value="FALSE"/>
<!--Short Range-->
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index c7300fcee2..1d635ef18a 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -1,16 +1,28 @@
<?xml version="1.0" ?>
<llsd>
<map>
+ <key>CrashHostUrl</key>
+ <map>
+ <key>Comment</key>
+ <string>A URL pointing to a crash report handler; overrides cluster negotiation to locate crash handler.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string />
+ </map>
<key>AFKTimeout</key>
<map>
<key>Comment</key>
- <string>Time before automatically setting AFK (away from keyboard) mode (seconds)</string>
+ <string>Time before automatically setting AFK (away from keyboard) mode (seconds, 0=never).
+ Valid values are: 0, 120, 300, 600, 1800</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <real>300.0</real>
+ <real>300</real>
</map>
<key>AdvanceSnapshot</key>
<map>
@@ -197,7 +209,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>1.0</real>
+ <real>0.5</real>
</map>
<key>AudioLevelMic</key>
<map>
@@ -219,7 +231,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>1.0</real>
+ <real>0.5</real>
</map>
<key>AudioLevelRolloff</key>
<map>
@@ -241,7 +253,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>1.0</real>
+ <real>0.5</real>
</map>
<key>AudioLevelUI</key>
<map>
@@ -573,6 +585,17 @@
<key>Value</key>
<integer>2</integer>
</map>
+ <key>AvatarBakedTextureTimeout</key>
+ <map>
+ <key>Comment</key>
+ <string>Specifes the maximum time in seconds to wait before sending your baked textures for avatar appearance. Set to 0 to disable and wait until all baked textures are at highest resolution.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>120</integer>
+ </map>
<key>AvatarSex</key>
<map>
<key>Comment</key>
@@ -620,7 +643,18 @@
<key>BlockAvatarAppearanceMessages</key>
<map>
<key>Comment</key>
- <string>Ignore's appearance messages (for simulating Ruth)</string>
+ <string>Ignores appearance messages (for simulating Ruth)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>BlockSomeAvatarAppearanceVisualParams</key>
+ <map>
+ <key>Comment</key>
+ <string>Drop around 50% of VisualParam occurances in appearance messages (for simulating Ruth)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -1264,6 +1298,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>CertStore</key>
+ <map>
+ <key>Comment</key>
+ <string>Specifies the Certificate Store for certificate trust verification</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>default</string>
+ </map>
<key>ChatBarStealsFocus</key>
<map>
<key>Comment</key>
@@ -1563,6 +1608,39 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>BrowserJavascriptEnabled</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable Javascript in the built-in Web browser?</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>BrowserPluginsEnabled</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable Web plugins in the built-in Web browser?</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>ChatBarCustomWidth</key>
+ <map>
+ <key>Comment</key>
+ <string>Stores customized width of chat bar.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>CreateToolCopyCenters</key>
<map>
<key>Comment</key>
@@ -1618,6 +1696,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>CurrentGrid</key>
+ <map>
+ <key>Comment</key>
+ <string>Currently Selected Grid</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string></string>
+ </map>
<key>CustomServer</key>
<map>
<key>Comment</key>
@@ -1629,6 +1718,17 @@
<key>Value</key>
<string />
</map>
+ <key>DebugAvatarRezTime</key>
+ <map>
+ <key>Comment</key>
+ <string>Display times for avatars to resolve.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>DebugBeaconLineWidth</key>
<map>
<key>Comment</key>
@@ -2344,6 +2444,29 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>DefaultFemaleAvatar</key>
+ <map>
+ <key>Comment</key>
+ <string>Default Female Avatar</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>Female Shape &amp; Outfit</string>
+ </map>
+ <key>DefaultMaleAvatar</key>
+ <map>
+ <key>Comment</key>
+ <string>Default Male Avatar</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>Male Shape &amp; Outfit</string>
+ </map>
+
<key>DefaultObjectTexture</key>
<map>
<key>Comment</key>
@@ -2542,6 +2665,17 @@
<key>Value</key>
<real>0.10000000149</real>
</map>
+ <key>DragAndDropDistanceThreshold</key>
+ <map>
+ <key>Comment</key>
+ <string>Number of pixels that mouse should move before triggering drag and drop mode</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>3</integer>
+ </map>
<key>DropShadowButton</key>
<map>
<key>Comment</key>
@@ -2586,6 +2720,17 @@
<key>Value</key>
<integer>4</integer>
</map>
+ <key>DumpVFSCaches</key>
+ <map>
+ <key>Comment</key>
+ <string>Dump VFS caches on startup.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>DynamicCameraStrength</key>
<map>
<key>Comment</key>
@@ -2696,6 +2841,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>FeatureManagerHTTPTable</key>
+ <map>
+ <key>Comment</key>
+ <string>Base directory for HTTP feature/gpu table fetches</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://viewer-settings.secondlife.com</string>
+ </map>
<key>FPSLogFrequency</key>
<map>
<key>Comment</key>
@@ -2817,16 +2973,16 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>HadFirstSuccessfulLogin</key>
+ <key>FirstRunThisInstall</key>
<map>
<key>Comment</key>
- <string>Specifies whether you have successfully logged in at least once before</string>
+ <string>Specifies that you have not run the viewer since you installed the latest update</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
<key>FirstSelectedDisabledPopups</key>
<map>
@@ -3400,6 +3556,17 @@
<key>Value</key>
<real>9.0</real>
</map>
+ <key>ForceAssetFail</key>
+ <map>
+ <key>Comment</key>
+ <string>Force wearable fetches to fail for this asset type.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>255</integer>
+ </map>
<key>ForceShowGrid</key>
<map>
<key>Comment</key>
@@ -3442,7 +3609,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>1.33329999447</real>
+ <real>3</real>
</map>
<key>FullScreenAutoDetectAspectRatio</key>
<map>
@@ -3453,29 +3620,18 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>1</integer>
- </map>
- <key>FullScreenHeight</key>
- <map>
- <key>Comment</key>
- <string>Fullscreen resolution in height</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>768</integer>
+ <integer>0</integer>
</map>
- <key>FullScreenWidth</key>
+ <key>GesturesMarketplaceURL</key>
<map>
<key>Comment</key>
- <string>Fullscreen resolution in width</string>
+ <string>URL to the Gestures Marketplace</string>
<key>Persist</key>
- <integer>1</integer>
+ <integer>0</integer>
<key>Type</key>
- <string>S32</string>
+ <string>String</string>
<key>Value</key>
- <integer>1024</integer>
+ <string>https://www.xstreetsl.com/modules.php?name=Marketplace&amp;CategoryID=233</string>
</map>
<key>GridCrossSections</key>
<map>
@@ -3607,7 +3763,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://lecs.viewer-sidebar.secondlife.com.s3.amazonaws.com/sidebar.html?p=[AUTH_TOKEN]&amp;lang=[LANGUAGE]&amp;channel=[CHANNEL]&amp;version=[VERSION]&amp;major=[VERSION_MAJOR]&amp;minor=[VERSION_MINOR]</string>
+ <string>https://viewer-sidebar.secondlife.com/sidebar.html?p=[AUTH_TOKEN]&amp;lang=[LANGUAGE]&amp;channel=[CHANNEL]&amp;version=[VERSION]&amp;major=[VERSION_MAJOR]&amp;minor=[VERSION_MINOR]&amp;patch=[VERSION_PATCH]&amp;build=[VERSION_BUILD]&amp;firstlogin=[FIRST_LOGIN]</string>
</map>
<key>SearchURL</key>
<map>
@@ -3618,7 +3774,7 @@
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>http://search.secondlife.com/viewer/[CATEGORY]?q=[QUERY]&amp;p=[AUTH_TOKEN]&amp;r=[MATURITY]&amp;lang=[LANGUAGE]&amp;g=[GODLIKE]&amp;sid=[SESSION_ID]&amp;rid=[REGION_ID]&amp;pid=[PARCEL_ID]</string>
+ <string>http://search.secondlife.com/viewer/[CATEGORY]?q=[QUERY]&amp;p=[AUTH_TOKEN]&amp;r=[MATURITY]&amp;lang=[LANGUAGE]&amp;g=[GODLIKE]&amp;sid=[SESSION_ID]&amp;rid=[REGION_ID]&amp;pid=[PARCEL_ID]&amp;channel=[CHANNEL]&amp;version=[VERSION]&amp;major=[VERSION_MAJOR]&amp;minor=[VERSION_MINOR]&amp;patch=[VERSION_PATCH]&amp;build=[VERSION_BUILD]</string>
</map>
<key>HighResSnapshot</key>
<map>
@@ -3706,7 +3862,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
<key>InBandwidth</key>
<map>
@@ -3763,6 +3919,17 @@
<key>Value</key>
<real>1.0</real>
</map>
+ <key>InventoryLinking</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable ability to create links to folders and items via "Paste as link".</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>InventorySortOrder</key>
<map>
<key>Comment</key>
@@ -4027,6 +4194,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>LastGPUClass</key>
+ <map>
+ <key>Comment</key>
+ <string>[DO NOT MODIFY] previous GPU class for tracking hardware changes</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>-1</integer>
+ </map>
<key>LastFeatureVersion</key>
<map>
<key>Comment</key>
@@ -4328,7 +4506,7 @@
<key>LoginLocation</key>
<map>
<key>Comment</key>
- <string>Login at same location you last logged out</string>
+ <string>Login location ('last', 'home')</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -4391,6 +4569,17 @@
<key>Value</key>
<real>128.0</real>
</map>
+ <key>MapServerURL</key>
+ <map>
+ <key>Comment</key>
+ <string>World map URL template for locating map tiles</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://map.secondlife.com.s3.amazonaws.com/</string>
+ </map>
<key>MapShowEvents</key>
<map>
<key>Comment</key>
@@ -4457,6 +4646,391 @@
<key>Value</key>
<string />
</map>
+ <key>MarketplaceURL</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>https://www.xstreetsl.com/modules.php?name=Marketplace</string>
+ </map>
+ <key>MarketplaceURL_objectFemale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Attachments Female</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/attachments</string>
+ </map>
+ <key>MarketplaceURL_objectMale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Attachments Male</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/attachments</string>
+ </map>
+ <key>MarketplaceURL_clothingFemale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Clothing Female</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/clothing_female_avatar</string>
+ </map>
+ <key>MarketplaceURL_clothingMale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Clothing Male</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/clothing_male_avatar</string>
+ </map>
+ <key>MarketplaceURL_bodypartFemale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Bodyparts Female</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>https://www.xstreetsl.com/modules.php?name=Marketplace</string>
+ </map>
+ <key>MarketplaceURL_bodypartMale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Bodyparts Male</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>https://www.xstreetsl.com/modules.php?name=Marketplace</string>
+ </map>
+ <key>MarketplaceURL_glovesMale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Gloves Male</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/gloves_both_women_and_men</string>
+ </map>
+ <key>MarketplaceURL_glovesFemale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Gloves Female</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/gloves_both_women_and_men</string>
+ </map>
+ <key>MarketplaceURL_jacketFemale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Jacket Female</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/jacket_womens</string>
+ </map>
+ <key>MarketplaceURL_jacketMale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Jacket Male</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/jacket_mens</string>
+ </map>
+ <key>MarketplaceURL_shirtFemale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Shirt Female</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/shirt_womens</string>
+ </map>
+ <key>MarketplaceURL_shirtMale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Shirt Male</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/shirt_mens</string>
+ </map>
+ <key>MarketplaceURL_undershirtFemale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Undershirt Female</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/undershirt_womens</string>
+ </map>
+ <key>MarketplaceURL_undershirtMale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Undershirt Male</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/undershirt_mens</string>
+ </map>
+ <key>MarketplaceURL_skirtFemale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Skirt Female</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/skirts_women</string>
+ </map>
+ <key>MarketplaceURL_skirtMale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Skirt Male</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/skirts_women</string>
+ </map>
+ <key>MarketplaceURL_pantsFemale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Pants Female</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/pants_women</string>
+ </map>
+ <key>MarketplaceURL_pantsMale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Pants Male</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/pants_men</string>
+ </map>
+ <key>MarketplaceURL_underpantsFemale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Underwear Female</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/underwear_women</string>
+ </map>
+ <key>MarketplaceURL_underpantsMale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Underwear Male</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/underwear_men</string>
+ </map>
+ <key>MarketplaceURL_shoesFemale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Shoes Female</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/shoes_women</string>
+ </map>
+ <key>MarketplaceURL_shoesMale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Shoes Male</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/shoes_men</string>
+ </map>
+ <key>MarketplaceURL_socksFemale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Socks Female</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/socks_women</string>
+ </map>
+ <key>MarketplaceURL_socksMale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Socks Male</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/socks_women</string>
+ </map>
+ <key>MarketplaceURL_tattooMale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Tattoo Male</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/tattoo_both_women_and_men</string>
+ </map>
+ <key>MarketplaceURL_tattooFemale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Tattoo Female</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/tattoo_both_women_and_men</string>
+ </map>
+ <key>MarketplaceURL_hairFemale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Hair Female</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/womens_hair</string>
+ </map>
+ <key>MarketplaceURL_hairMale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Hair Male</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/mens_hair</string>
+ </map>
+ <key>MarketplaceURL_eyesFemale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Eyes Female</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/womens_eyes</string>
+ </map>
+ <key>MarketplaceURL_eyesMale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Eyes Male</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/mens_eyes</string>
+ </map>
+ <key>MarketplaceURL_shapeFemale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Shape Female</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/womens_shape</string>
+ </map>
+ <key>MarketplaceURL_shapeMale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Shape Male</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/mens_shape</string>
+ </map>
+ <key>MarketplaceURL_skinFemale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Skin Female</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/womens_skin</string>
+ </map>
+ <key>MarketplaceURL_skinMale</key>
+ <map>
+ <key>Comment</key>
+ <string>URL to the Marketplace Skins Male</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>http://marketplace.secondlife.com/trampoline/viewer21/mens_skin</string>
+ </map>
<key>MaxDragDistance</key>
<map>
<key>Comment</key>
@@ -4479,6 +5053,17 @@
<key>Value</key>
<real>64.0</real>
</map>
+ <key>MaxWearableWaitTime</key>
+ <map>
+ <key>Comment</key>
+ <string>Max seconds to wait for wearable assets to fetch.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>60.0</real>
+ </map>
<key>MeanCollisionBump</key>
<map>
<key>Comment</key>
@@ -4578,6 +5163,50 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>MediaShowOnOthers</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether or not to show media on other avatars</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>MediaShowOutsideParcel</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether or not to show media from outside the current parcel</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>MediaShowWithinParcel</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether or not to show media within the current parcel</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>MediaTentativeAutoPlay</key>
+ <map>
+ <key>Comment</key>
+ <string>This is a tentative flag that may be temporarily set off by the user, until she teleports</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>MemoryLogFrequency</key>
<map>
<key>Comment</key>
@@ -4633,6 +5262,17 @@
<key>Value</key>
<integer>410</integer>
</map>
+ <key>MePanelOpened</key>
+ <map>
+ <key>Comment</key>
+ <string>Indicates that Me Panel was opened at least once after Viewer was installed</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <real>0</real>
+ </map>
<key>MigrateCacheDirectory</key>
<map>
<key>Comment</key>
@@ -5044,7 +5684,9 @@
<map>
<key>Comment</key>
<string>Default width of buttons in the toast.
- Note if required width will be less then this one, a button will be reshaped to default size , otherwise to required</string>
+ Notes:
+ If required width will be less then this one, a button will be reshaped to default size , otherwise to required
+ Change of this parameter will affect the layout of buttons in notification toast.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -5303,7 +5945,18 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
+ </map>
+ <key>ParticipantListShowIcons</key>
+ <map>
+ <key>Comment</key>
+ <string>Show/hide people icons in participant list</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
</map>
<key>PerAccountSettingsFile</key>
<map>
@@ -5435,7 +6088,7 @@
<key>Type</key>
<string>F32</string>
<key>Value</key>
- <real>1.0</real>
+ <real>0.9</real>
</map>
<key>PlainTextChatHistory</key>
@@ -5483,6 +6136,19 @@
<key>Value</key>
<integer>8</integer>
</map>
+
+ <key>PluginUseReadThread</key>
+ <map>
+ <key>Comment</key>
+ <string>Use a separate thread to read incoming messages from plugins</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+
<key>PrecachingDelay</key>
<map>
<key>Comment</key>
@@ -5497,7 +6163,7 @@
<key>PreferredMaturity</key>
<map>
<key>Comment</key>
- <string>Setting for the user's preferred maturity level.</string>
+ <string>Setting for the user's preferred maturity level (consts in indra_constants.h)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -5736,7 +6402,40 @@
<key>Value</key>
<real>1.0</real>
</map>
- <key>RecentItemsSortOrder</key>
+ <key>MediaRollOffRate</key>
+ <map>
+ <key>Comment</key>
+ <string>Multiplier to change rate of media attenuation</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.125</real>
+ </map>
+ <key>MediaRollOffMin</key>
+ <map>
+ <key>Comment</key>
+ <string>Adjusts the distance at which media attentuation starts</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>5.0</real>
+ </map>
+ <key>MediaRollOffMax</key>
+ <map>
+ <key>Comment</key>
+ <string>Distance at which media volume is set to 0</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>30.0</real>
+ </map>
+ <key>RecentItemsSortOrder</key>
<map>
<key>Comment</key>
<string>Specifies sort key for recent inventory items (+0 = name, +1 = date, +2 = folders always by name, +4 = system folders to top)</string>
@@ -5769,6 +6468,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>QuickBuyCurrency</key>
+ <map>
+ <key>Comment</key>
+ <string>Toggle between HTML based currency purchase floater and legacy XUI version</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>RegionTextureSize</key>
<map>
<key>Comment</key>
@@ -5877,7 +6587,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>35</integer>
+ <integer>12</integer>
</map>
<key>RenderAvatarVP</key>
<map>
@@ -7386,6 +8096,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>RenderUseTriStrips</key>
+ <map>
+ <key>Comment</key>
+ <string>Use triangle strips for rendering prims.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>RenderUseFarClip</key>
<map>
<key>Comment</key>
@@ -7595,6 +8316,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>SecondLifeEnterprise</key>
+ <map>
+ <key>Comment</key>
+ <string>Enables Second Life Enterprise features</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>SelectMovableOnly</key>
<map>
<key>Comment</key>
@@ -7771,6 +8503,28 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>ShowBuildButton</key>
+ <map>
+ <key>Comment</key>
+ <string>Shows/Hides Build button in the bottom tray.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowCameraButton</key>
+ <map>
+ <key>Comment</key>
+ <string>Show/Hide View button in the bottom tray.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>ShowConsoleWindow</key>
<map>
<key>Comment</key>
@@ -7804,6 +8558,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>ShowBetaGrids</key>
+ <map>
+ <key>Comment</key>
+ <string>Display the beta grids in the grid selection control.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>ShowCrosshairs</key>
<map>
<key>Comment</key>
@@ -7826,10 +8591,10 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>ShowDebugAppearanceEditor</key>
+ <key>ShowEmptyFoldersWhenSearching</key>
<map>
<key>Comment</key>
- <string>Show debugging appearance editor</string>
+ <string>Shows folders that do not have any visible contents when applying a filter to inventory</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -7837,16 +8602,16 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>ShowEmptyFoldersWhenSearching</key>
+ <key>ShowGestureButton</key>
<map>
<key>Comment</key>
- <string>Shows folders that do not have any visible contents when applying a filter to inventory</string>
+ <string>Shows/Hides Gesture button in the bottom tray.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
<key>ShowHoverTips</key>
<map>
@@ -7870,21 +8635,21 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>ShowCameraButton</key>
+ <key>ShowMiniMapButton</key>
<map>
<key>Comment</key>
- <string>Show/Hide Camera button in the bottom tray</string>
+ <string>Shows/Hides Mini-Map button in the bottom tray.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>1</integer>
+ <integer>0</integer>
</map>
- <key>ShowScriptErrors</key>
+ <key>ShowMoveButton</key>
<map>
<key>Comment</key>
- <string>Show script errors</string>
+ <string>Shows/Hides Move button in the bottom tray.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -7892,49 +8657,49 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>ShowScriptErrorsLocation</key>
+ <key>ShowScriptErrors</key>
<map>
<key>Comment</key>
- <string>Show script error in chat or window</string>
+ <string>Show script errors</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>S32</string>
+ <string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
- <key>ShowSnapshotButton</key>
+ <key>ShowScriptErrorsLocation</key>
<map>
<key>Comment</key>
- <string>Show/Hide Snapshot button button in the bottom tray</string>
+ <string>Show script error in chat or window</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>Boolean</string>
+ <string>S32</string>
<key>Value</key>
- <integer>1</integer>
+ <integer>1</integer>
</map>
- <key>ShowMoveButton</key>
+ <key>ShowSearchButton</key>
<map>
<key>Comment</key>
- <string>Show/Hide Move button in the bottom tray</string>
+ <string>Shows/Hides Search button in the bottom tray.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>1</integer>
- </map>
- <key>ShowGestureButton</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowSnapshotButton</key>
<map>
<key>Comment</key>
- <string>Show/Hide Gesture button in the bottom tray</string>
+ <string>Shows/Hides Snapshot button button in the bottom tray.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>1</integer>
+ <integer>1</integer>
</map>
<key>ShowObjectRenderingCost</key>
<map>
@@ -7969,6 +8734,39 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>ShowWorldMapButton</key>
+ <map>
+ <key>Comment</key>
+ <string>Shows/Hides Map button in the bottom tray.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowMiniLocationPanel</key>
+ <map>
+ <key>Comment</key>
+ <string>Show/Hide Mini-Location Panel</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>SidebarCameraMovement</key>
+ <map>
+ <key>Comment</key>
+ <string>Reflects world rect changing while changing sidebar visibility.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>GroupListShowIcons</key>
<map>
<key>Comment</key>
@@ -8027,13 +8825,13 @@
<key>NearbyPeopleSortOrder</key>
<map>
<key>Comment</key>
- <string>Specifies sort order for nearby people (0 = by name, 2 = by most recent)</string>
+ <string>Specifies sort order for nearby people (0 = by name, 3 = by distance, 4 = by most recent)</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>U32</string>
<key>Value</key>
- <integer>2</integer>
+ <integer>4</integer>
</map>
<key>RecentPeopleSortOrder</key>
<map>
@@ -8399,7 +9197,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>1</integer>
+ <integer>0</integer>
</map>
<key>ShowTangentBasis</key>
<map>
@@ -8434,21 +9232,10 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>ShowVoiceChannelPopup</key>
- <map>
- <key>Comment</key>
- <string>Controls visibility of the current voice channel popup above the voice tab</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>0</integer>
- </map>
- <key>ShowVolumeSettingsPopup</key>
+ <key>ShowVoiceVisualizersInCalls</key>
<map>
<key>Comment</key>
- <string>Show individual volume slider for voice, sound effects, etc</string>
+ <string>Enables in-world voice visualizers, voice gestures and lip-sync while in group or P2P calls.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -8552,17 +9339,6 @@
<key>Value</key>
<integer>1</integer>
</map>
- <key>SmallAvatarNames</key>
- <map>
- <key>Comment</key>
- <string>Display avatar name text in smaller font</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>Boolean</string>
- <key>Value</key>
- <integer>1</integer>
- </map>
<key>SnapEnabled</key>
<map>
<key>Comment</key>
@@ -8805,6 +9581,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>TextureDiscardLevel</key>
+ <map>
+ <key>Comment</key>
+ <string>Specify texture resolution (0 = highest, 5 = lowest)</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>TextureLoadFullRes</key>
<map>
<key>Comment</key>
@@ -9938,50 +10725,6 @@
<key>Value</key>
<integer>15</integer>
</map>
- <key>UIButtonImageLeftPadding</key>
- <map>
- <key>Comment</key>
- <string>Button Overlay Image Left Padding</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>4</integer>
- </map>
- <key>UIButtonImageRightPadding</key>
- <map>
- <key>Comment</key>
- <string>Button Overlay Image Right Padding</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>4</integer>
- </map>
- <key>UIButtonImageTopPadding</key>
- <map>
- <key>Comment</key>
- <string>Button Overlay Image Top Padding</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>2</integer>
- </map>
- <key>UIButtonImageBottomPadding</key>
- <map>
- <key>Comment</key>
- <string>Button Overlay Image Bottom Padding</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>S32</string>
- <key>Value</key>
- <integer>2</integer>
- </map>
<key>UploadBakedTexOld</key>
<map>
<key>Comment</key>
@@ -10090,7 +10833,7 @@
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
<key>UseFreezeFrame</key>
<map>
@@ -10136,7 +10879,17 @@
<key>Value</key>
<real>10.0</real>
</map>
-
+ <key>UseNewWalkRun</key>
+ <map>
+ <key>Comment</key>
+ <string>Replace standard walk/run animations with new ones.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>UseStartScreen</key>
<map>
<key>Comment</key>
@@ -10336,6 +11089,17 @@
<key>Value</key>
<string></string>
</map>
+ <key>VivoxDebugSIPURIHostName</key>
+ <map>
+ <key>Comment</key>
+ <string>Hostname portion of vivox SIP URIs (empty string for the default).</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string></string>
+ </map>
<key>VivoxDebugVoiceAccountServerURI</key>
<map>
<key>Comment</key>
@@ -10347,6 +11111,28 @@
<key>Value</key>
<string></string>
</map>
+ <key>VivoxVoiceHost</key>
+ <map>
+ <key>Comment</key>
+ <string>Client SLVoice host to connect to</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>127.0.0.1</string>
+ </map>
+ <key>VivoxVoicePort</key>
+ <map>
+ <key>Comment</key>
+ <string>Client SLVoice port to connect to</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>U32</string>
+ <key>Value</key>
+ <integer>44125</integer>
+ </map>
<key>VoiceCallsFriendsOnly</key>
<map>
<key>Comment</key>
@@ -10358,27 +11144,38 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>AutoDisengageMic</key>
+ <key>VoiceEffectExpiryWarningTime</key>
<map>
<key>Comment</key>
- <string>Automatically turn off the microphone when ending IM calls.</string>
+ <string>How much notice to give of Voice Morph subscriptions expiry, in seconds.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>259200</integer>
+ </map>
+ <key>VoiceMorphingEnabled</key>
+ <map>
+ <key>Comment</key>
+ <string>Whether or not to enable Voice Morphs and show the UI.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
<string>Boolean</string>
<key>Value</key>
<integer>1</integer>
</map>
- <key>VoiceDefaultInternalLevel</key>
+ <key>AutoDisengageMic</key>
<map>
<key>Comment</key>
- <string>Internal level of voice set by default. Is equivalent to 0.5 (from 0.0-1.0 range) external voice level (internal = 400 * external^2).</string>
+ <string>Automatically turn off the microphone when ending IM calls.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>S32</string>
+ <string>Boolean</string>
<key>Value</key>
- <integer>100</integer>
+ <integer>1</integer>
</map>
<key>VoiceEarLocation</key>
<map>
@@ -10490,6 +11287,17 @@
<key>Value</key>
<string>Default</string>
</map>
+ <key>VoiceLogFile</key>
+ <map>
+ <key>Comment</key>
+ <string>Log file to use when launching the voice daemon</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string></string>
+ </map>
<key>VoiceOutputAudioDevice</key>
<map>
<key>Comment</key>
@@ -10534,6 +11342,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>VoiceServerType</key>
+ <map>
+ <key>Comment</key>
+ <string>The type of voice server to connect to.</string>
+ <key>Persist</key>
+ <integer>0</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>vivox</string>
+ </map>
<key>WLSkyDetail</key>
<map>
<key>Comment</key>
@@ -10600,27 +11419,38 @@
<key>Value</key>
<real>50.0</real>
</map>
- <key>WindLightUseAtmosShaders</key>
+ <key>WellIconFlashCount</key>
<map>
<key>Comment</key>
- <string>Whether to enable or disable WindLight atmospheric shaders.</string>
+ <string>Number of flashes of IM Well and Notification Well icons after which flashing buttons stay lit up. Requires restart.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>Boolean</string>
+ <string>S32</string>
<key>Value</key>
+ <integer>3</integer>
+ </map>
+ <key>WellIconFlashPeriod</key>
+ <map>
+ <key>Comment</key>
+ <string>Period at which IM Well and Notification Well icons flash (seconds). Requires restart.</string>
+ <key>Persist</key>
<integer>1</integer>
+ <key>Type</key>
+ <string>F32</string>
+ <key>Value</key>
+ <real>0.25</real>
</map>
- <key>WindowFullScreen</key>
+ <key>WindLightUseAtmosShaders</key>
<map>
<key>Comment</key>
- <string>Run SL in fullscreen mode</string>
+ <string>Whether to enable or disable WindLight atmospheric shaders.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>Boolean</string>
<key>Value</key>
- <integer>0</integer>
+ <integer>1</integer>
</map>
<key>WindowHeight</key>
<map>
@@ -10631,7 +11461,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>700</integer>
+ <integer>738</integer>
</map>
<key>WindowMaximized</key>
<map>
@@ -10653,7 +11483,7 @@
<key>Type</key>
<string>S32</string>
<key>Value</key>
- <integer>1000</integer>
+ <integer>1024</integer>
</map>
<key>WindowX</key>
<map>
@@ -10886,5 +11716,113 @@
<key>Value</key>
<integer>1</integer>
</map>
+
+ <!-- Settings below are for back compatibility only.
+ They are not used in current viewer anymore. But they can't be removed to avoid
+ influence on previous versions of the viewer in case of settings are not used or default value
+ should be changed. See also EXT-6661. -->
+ <!-- 1.23 settings -->
+ <key>ShowVoiceChannelPopup</key>
+ <map>
+ <key>Comment</key>
+ <string>Controls visibility of the current voice channel popup above the voice tab</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>ShowVolumeSettingsPopup</key>
+ <map>
+ <key>Comment</key>
+ <string>Show individual volume slider for voice, sound effects, etc</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>max_texture_dimension_X</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum texture width for user uploaded textures</string>
+ <key>Persist</key>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>2048</integer>
+ </map>
+ <key>max_texture_dimension_Y</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum texture height for user uploaded textures</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>2048</integer>
+ </map>
+ <!-- End of back compatibility settings -->
+ <key>teleport_offer_invitation_max_length</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum length of teleport offer invitation line editor. 254 - max_location_url_length(76) = 178</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>178</integer>
+ </map>
+ <key>always_showable_floaters</key>
+ <map>
+ <key>Comment</key>
+ <string>Floaters that can be shown despite mouselook mode</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>LLSD</string>
+ <key>Value</key>
+ <array>
+ <string>snapshot</string>
+ <string>mini_map</string>
+ </array>
+ </map>
+ <key>LandmarksSortedByDate</key>
+ <map>
+ <key>Comment</key>
+ <string>Reflects landmarks panel sorting order.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
+ <key>OutfitOperationsTimeout</key>
+ <map>
+ <key>Comment</key>
+ <string>Timeout for outfit related operations.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>180</integer>
+ </map>
+ <key>HeightUnits</key>
+ <map>
+ <key>Comment</key>
+ <string>Determines which metric units are used: 1(TRUE) for meter and 0(FALSE) for foot.</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
</map>
</llsd>
diff --git a/indra/newview/app_settings/settings_per_account.xml b/indra/newview/app_settings/settings_per_account.xml
index af5fa4f388..dc76a4e518 100644
--- a/indra/newview/app_settings/settings_per_account.xml
+++ b/indra/newview/app_settings/settings_per_account.xml
@@ -1,38 +1,27 @@
<llsd>
<map>
- <key>BusyModeResponse</key>
+ <key>BusyResponseChanged</key>
<map>
<key>Comment</key>
- <string>Auto response to instant messages while in busy mode.</string>
+ <string>Does user's busy mode message differ from default?</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
- <string>String</string>
+ <string>Boolean</string>
<key>Value</key>
- <string>The Resident you messaged is in &apos;busy mode&apos; which means they have requested not to be disturbed. Your message will still be shown in their IM panel for later viewing.</string>
+ <integer>0</integer>
</map>
- <key>BusyModeResponse2</key>
+ <key>BusyModeResponse</key>
<map>
<key>Comment</key>
- <string>Auto response to instant messages while in busy mode, clean (unencoded) version of BusyModeResponse</string>
+ <string>Auto response to instant messages while in busy mode.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
<string>String</string>
<key>Value</key>
- <string>|TOKEN COPY BusyModeResponse|</string>
+ <string>The Resident you messaged is in &apos;busy mode&apos; which means they have requested not to be disturbed. Your message will still be shown in their IM panel for later viewing.</string>
</map>
- <key>InstantMessageLogFolder</key>
- <map>
- <key>Comment</key>
- <string>Top level folder to your log files.</string>
- <key>Persist</key>
- <integer>1</integer>
- <key>Type</key>
- <string>String</string>
- <key>Value</key>
- <string />
- </map>
<key>InstantMessageLogPath</key>
<map>
<key>Comment</key>
@@ -55,10 +44,10 @@
<key>Value</key>
<integer>0</integer>
</map>
- <key>LogChat</key>
+ <key>LogNearbyChat</key>
<map>
<key>Comment</key>
- <string>Log Chat</string>
+ <string>Log Nearby Chat messages to a file. Is used instead of LogChat but with the "1" default value.</string>
<key>Persist</key>
<integer>1</integer>
<key>Type</key>
@@ -110,5 +99,57 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>VoiceEffectDefault</key>
+ <map>
+ <key>Comment</key>
+ <string>Selected Voice Morph</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>00000000-0000-0000-0000-000000000000</string>
+ </map>
+
+ <!-- Settings below are for back compatibility only.
+ They are not used in current viewer anymore. But they can't be removed to avoid
+ influence on previous versions of the viewer in case of settings are not used or default value
+ should be changed. See EXT-6661. -->
+
+ <!-- 1.23 settings -->
+ <key>LogChat</key>
+ <map>
+ <key>Comment</key>
+ <string>Log Chat</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>LogChatIM</key>
+ <map>
+ <key>Comment</key>
+ <string>Log Incoming Instant Messages with Chat</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <key>LogChatTimestamp</key>
+ <map>
+ <key>Comment</key>
+ <string>Log Timestamp of Chat</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
+ <!-- End of back compatibility settings -->
</map>
</llsd>
diff --git a/indra/newview/character/avatar_lad.xml b/indra/newview/character/avatar_lad.xml
index 448e20b382..9564236ad2 100644
--- a/indra/newview/character/avatar_lad.xml
+++ b/indra/newview/character/avatar_lad.xml
@@ -4782,7 +4782,7 @@
group="1"
name="Saddlebags"
wearable="shape"
- edit_grouo="driven"
+ edit_group="driven"
value_min="-.5"
value_max="3">
<param_morph>
@@ -6623,6 +6623,60 @@ render_pass="bump">
name="head_tattoo">
<texture
local_texture="head_tattoo" />
+ <param
+ id="1062"
+ group="1"
+ edit_group="colorpicker_driven"
+ wearable="tattoo"
+ name="tattoo_head_red"
+ value_min="0"
+ value_max="1"
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
+
+ <value
+ color="255, 0, 0, 255" />
+ </param_color>
+ </param>
+
+ <param
+ id="1063"
+ group="1"
+ edit_group="colorpicker_driven"
+ wearable="tattoo"
+ name="tattoo_head_green"
+ value_min="0"
+ value_max="1"
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
+
+ <value
+ color="0, 255, 0, 255" />
+ </param_color>
+ </param>
+
+ <param
+ id="1064"
+ group="1"
+ edit_group="colorpicker_driven"
+ wearable="tattoo"
+ name="tattoo_head_blue"
+ value_min="0"
+ value_max="1"
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
+
+ <value
+ color="0, 0, 255, 255" />
+ </param_color>
+ </param>
+
</layer>
@@ -6745,6 +6799,61 @@ render_pass="bump">
name="upper_tattoo">
<texture
local_texture="upper_tattoo" />
+
+ <param
+ id="1065"
+ group="1"
+ edit_group="colorpicker_driven"
+ wearable="tattoo"
+ name="tattoo_upper_red"
+ value_min="0"
+ value_max="1"
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
+
+ <value
+ color="255, 0, 0, 255" />
+ </param_color>
+ </param>
+
+ <param
+ id="1066"
+ group="1"
+ edit_group="colorpicker_driven"
+ wearable="tattoo"
+ name="tattoo_upper_green"
+ value_min="0"
+ value_max="1"
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
+
+ <value
+ color="0, 255, 0, 255" />
+ </param_color>
+ </param>
+
+ <param
+ id="1067"
+ group="1"
+ edit_group="colorpicker_driven"
+ wearable="tattoo"
+ name="tattoo_upper_blue"
+ value_min="0"
+ value_max="1"
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
+
+ <value
+ color="0, 0, 255, 255" />
+ </param_color>
+ </param>
+
</layer>
@@ -7942,6 +8051,61 @@ render_pass="bump">
name="lower_tattoo">
<texture
local_texture="lower_tattoo" />
+
+ <param
+ id="1068"
+ group="1"
+ edit_group="colorpicker_driven"
+ wearable="tattoo"
+ name="tattoo_lower_red"
+ value_min="0"
+ value_max="1"
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
+
+ <value
+ color="255, 0, 0, 255" />
+ </param_color>
+ </param>
+
+ <param
+ id="1069"
+ group="1"
+ edit_group="colorpicker_driven"
+ wearable="tattoo"
+ name="tattoo_lower_green"
+ value_min="0"
+ value_max="1"
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
+
+ <value
+ color="0, 255, 0, 255" />
+ </param_color>
+ </param>
+
+ <param
+ id="1070"
+ group="1"
+ edit_group="colorpicker_driven"
+ wearable="tattoo"
+ name="tattoo_lower_blue"
+ value_min="0"
+ value_max="1"
+ value_default="1">
+ <param_color>
+ <value
+ color="0, 0, 0, 255" />
+
+ <value
+ color="0, 0, 255, 255" />
+ </param_color>
+ </param>
+
</layer>
<layer
@@ -11367,6 +11531,106 @@ render_pass="bump">
</param_driver>
</param>
+ <param
+ id="1071"
+ group="0"
+ wearable="tattoo"
+ edit_group="colorpicker"
+ name="tattoo_red"
+ value_min="0"
+ value_max="1"
+ value_default="1">
+ <param_driver>
+ <driven
+ id="1062"
+ min1="0"
+ max1="1"
+ max2="1"
+ min2="1" />
+
+ <driven
+ id="1065"
+ min1="0"
+ max1="1"
+ max2="1"
+ min2="1" />
+
+ <driven
+ id="1068"
+ min1="0"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
+
+ <param
+ id="1072"
+ group="0"
+ wearable="tattoo"
+ edit_group="colorpicker"
+ name="tattoo_green"
+ value_min="0"
+ value_max="1"
+ value_default="1">
+ <param_driver>
+ <driven
+ id="1063"
+ min1="0"
+ max1="1"
+ max2="1"
+ min2="1" />
+
+ <driven
+ id="1066"
+ min1="0"
+ max1="1"
+ max2="1"
+ min2="1" />
+
+ <driven
+ id="1069"
+ min1="0"
+ max1="1"
+ max2="1"
+ min2="1" />
+ </param_driver>
+ </param>
+
+ <param
+ id="1073"
+ group="0"
+ wearable="tattoo"
+ edit_group="colorpicker"
+ name="tattoo_blue"
+ value_min="0"
+ value_max="1"
+ value_default="1">
+ <param_driver>
+ <driven
+ id="1064"
+ min1="0"
+ max1="1"
+ max2="1"
+ min2="1" />
+
+ <driven
+ id="1067"
+ min1="0"
+ max1="1"
+ max2="1"
+ min2="1" />
+
+ <driven
+ id="1070"
+ min1="0"
+ max1="1"
+ max2="1"
+ min2="1" />
+
+ </param_driver>
+ </param>
+
</driver_parameters>
diff --git a/indra/newview/cursors_mac/UI_CURSOR_TOOLBUY.tif b/indra/newview/cursors_mac/UI_CURSOR_TOOLBUY.tif
new file mode 100644
index 0000000000..f366026c33
--- /dev/null
+++ b/indra/newview/cursors_mac/UI_CURSOR_TOOLBUY.tif
Binary files differ
diff --git a/indra/newview/cursors_mac/UI_CURSOR_TOOLOPEN.tif b/indra/newview/cursors_mac/UI_CURSOR_TOOLOPEN.tif
new file mode 100644
index 0000000000..e9e6a20cd9
--- /dev/null
+++ b/indra/newview/cursors_mac/UI_CURSOR_TOOLOPEN.tif
Binary files differ
diff --git a/indra/newview/cursors_mac/UI_CURSOR_TOOLSIT.tif b/indra/newview/cursors_mac/UI_CURSOR_TOOLSIT.tif
new file mode 100644
index 0000000000..bea3d9d442
--- /dev/null
+++ b/indra/newview/cursors_mac/UI_CURSOR_TOOLSIT.tif
Binary files differ
diff --git a/indra/newview/featuretable.txt b/indra/newview/featuretable.txt
index 4029bf95a0..e8591ca086 100644
--- a/indra/newview/featuretable.txt
+++ b/indra/newview/featuretable.txt
@@ -26,6 +26,7 @@ list all
RenderAnisotropic 1 0
RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
+RenderAvatarMaxVisible 1 12
RenderAvatarVP 1 1
RenderCubeMap 1 1
RenderDelayVBUpdate 1 0
@@ -56,7 +57,7 @@ Disregard128DefaultDrawDistance 1 1
Disregard96DefaultDrawDistance 1 1
RenderTextureMemoryMultiple 1 1.0
RenderShaderLightingMaxLevel 1 3
-
+SkyUseClassicClouds 1 1
//
// Low Graphics Settings
@@ -64,24 +65,26 @@ RenderShaderLightingMaxLevel 1 3
list Low
RenderAnisotropic 1 0
RenderAvatarCloth 1 0
-RenderAvatarLODFactor 1 0.5
+RenderAvatarLODFactor 1 0
+RenderAvatarMaxVisible 1 3
RenderAvatarVP 1 0
RenderFarClip 1 64
-RenderFlexTimeFactor 1 0.5
+RenderFlexTimeFactor 1 0
RenderGlowResolutionPow 1 8
RenderLightingDetail 1 0
-RenderMaxPartCount 1 1024
+RenderMaxPartCount 1 0
RenderObjectBump 1 0
RenderReflectionDetail 1 0
RenderTerrainDetail 1 0
RenderTerrainLODFactor 1 1
-RenderTreeLODFactor 1 0.5
+RenderTreeLODFactor 1 0
RenderUseImpostors 1 1
-RenderVolumeLODFactor 1 1.125
+RenderVolumeLODFactor 1 0
RenderWaterReflections 1 0
VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
WLSkyDetail 1 48
+SkyUseClassicClouds 1 0
//
// Mid Graphics Settings
@@ -296,28 +299,23 @@ RenderUseImpostors 0 0
list Intel_945GM
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
-RenderUseImpostors 0 0
list Intel_945G
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
-RenderUseImpostors 0 0
list Intel_950
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
-RenderUseImpostors 0 0
list Intel_965
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
UseOcclusion 0 0
-RenderUseImpostors 0 0
list Intel_G33
RenderTerrainDetail 1 0
RenderVBOEnable 1 0
-RenderUseImpostors 0 0
list Intel_G45
WindLightUseAtmosShaders 0 0
diff --git a/indra/newview/featuretable_linux.txt b/indra/newview/featuretable_linux.txt
index 61a8e51c50..779490c9f7 100644
--- a/indra/newview/featuretable_linux.txt
+++ b/indra/newview/featuretable_linux.txt
@@ -26,6 +26,7 @@ list all
RenderAnisotropic 1 0
RenderAvatarCloth 1 1
RenderAvatarLODFactor 1 1.0
+RenderAvatarMaxVisible 1 12
RenderAvatarVP 1 1
RenderCubeMap 1 1
RenderDelayVBUpdate 1 0
@@ -55,6 +56,7 @@ WLSkyDetail 1 128
Disregard128DefaultDrawDistance 1 1
Disregard96DefaultDrawDistance 1 1
RenderTextureMemoryMultiple 1 1.0
+SkyUseClassicClouds 1 1
//
// Low Graphics Settings
@@ -62,24 +64,26 @@ RenderTextureMemoryMultiple 1 1.0
list Low
RenderAnisotropic 1 0
RenderAvatarCloth 1 0
-RenderAvatarLODFactor 1 0.5
+RenderAvatarLODFactor 1 0
+RenderAvatarMaxVisible 1 3
RenderAvatarVP 1 0
RenderFarClip 1 64
-RenderFlexTimeFactor 1 0.5
+RenderFlexTimeFactor 1 0
RenderGlowResolutionPow 1 8
RenderLightingDetail 1 0
-RenderMaxPartCount 1 1024
+RenderMaxPartCount 1 0
RenderObjectBump 1 0
RenderReflectionDetail 1 0
RenderTerrainDetail 1 0
RenderTerrainLODFactor 1 1
-RenderTreeLODFactor 1 0.5
+RenderTreeLODFactor 1 0
RenderUseImpostors 1 1
-RenderVolumeLODFactor 1 1.125
+RenderVolumeLODFactor 1 0
RenderWaterReflections 1 0
VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
WLSkyDetail 1 48
+SkyUseClassicClouds 1 0
//
// Mid Graphics Settings
diff --git a/indra/newview/featuretable_mac.txt b/indra/newview/featuretable_mac.txt
index 12d47a904c..47033efc47 100644
--- a/indra/newview/featuretable_mac.txt
+++ b/indra/newview/featuretable_mac.txt
@@ -26,6 +26,7 @@ list all
RenderAnisotropic 1 0
RenderAvatarCloth 0 0
RenderAvatarLODFactor 1 1.0
+RenderAvatarMaxVisible 1 12
RenderAvatarVP 1 0
RenderCubeMap 1 1
RenderDelayVBUpdate 1 0
@@ -57,6 +58,7 @@ Disregard96DefaultDrawDistance 1 1
RenderTextureMemoryMultiple 1 0.5
Disregard128DefaultDrawDistance 1 1
Disregard96DefaultDrawDistance 1 1
+SkyUseClassicClouds 1 1
//
// Low Graphics Settings
@@ -64,24 +66,26 @@ Disregard96DefaultDrawDistance 1 1
list Low
RenderAnisotropic 1 0
RenderAvatarCloth 1 0
-RenderAvatarLODFactor 1 0.5
+RenderAvatarLODFactor 1 0
+RenderAvatarMaxVisible 1 3
RenderAvatarVP 1 0
RenderFarClip 1 64
-RenderFlexTimeFactor 1 0.5
+RenderFlexTimeFactor 1 0
RenderGlowResolutionPow 1 8
RenderLightingDetail 1 0
-RenderMaxPartCount 1 1024
+RenderMaxPartCount 1 0
RenderObjectBump 1 0
RenderReflectionDetail 1 0
RenderTerrainDetail 1 0
RenderTerrainLODFactor 1 1
-RenderTreeLODFactor 1 0.5
+RenderTreeLODFactor 1 0
RenderUseImpostors 1 1
-RenderVolumeLODFactor 1 1.125
+RenderVolumeLODFactor 1 0
RenderWaterReflections 1 0
VertexShaderEnable 1 0
WindLightUseAtmosShaders 1 0
WLSkyDetail 1 48
+SkyUseClassicClouds 1 0
//
// Mid Graphics Settings
diff --git a/indra/newview/featuretable_solaris.txt b/indra/newview/featuretable_solaris.txt
index f24cbde5e2..6edd280686 100644
--- a/indra/newview/featuretable_solaris.txt
+++ b/indra/newview/featuretable_solaris.txt
@@ -117,6 +117,7 @@ UseOcclusion 0 0
list low
RenderVBO 1 0
RenderAniso 1 0
+RenderAvatarMaxVisible 1 3
RenderLighting 1 0
list medium
diff --git a/indra/newview/generate_breakpad_symbols.py b/indra/newview/generate_breakpad_symbols.py
new file mode 100644
index 0000000000..1f42004bb7
--- /dev/null
+++ b/indra/newview/generate_breakpad_symbols.py
@@ -0,0 +1,135 @@
+#!/usr/bin/env python
+# @file generate_breakpad_symbols.py
+# @author Brad Kittenbrink <brad@lindenlab.com>
+# @brief Simple tool for generating google_breakpad symbol information
+# for the crash reporter.
+#
+# $LicenseInfo:firstyear=2010&license=viewergpl$
+#
+# Copyright (c) 2010-2010, Linden Research, Inc.
+#
+# Second Life Viewer Source Code
+# The source code in this file ("Source Code") is provided by Linden Lab
+# to you under the terms of the GNU General Public License, version 2.0
+# ("GPL"), unless you have obtained a separate licensing agreement
+# ("Other License"), formally executed by you and Linden Lab. Terms of
+# the GPL can be found in doc/GPL-license.txt in this distribution, or
+# online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+#
+# There are special exceptions to the terms and conditions of the GPL as
+# it is applied to this Source Code. View the full text of the exception
+# in the file doc/FLOSS-exception.txt in this software distribution, or
+# online at
+# http://secondlifegrid.net/programs/open_source/licensing/flossexception
+#
+# By copying, modifying or distributing this software, you acknowledge
+# that you have read and understood your obligations described above,
+# and agree to abide by those obligations.
+#
+# ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+# WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+# COMPLETENESS OR PERFORMANCE.
+# $/LicenseInfo$
+
+
+import collections
+import fnmatch
+import itertools
+import operator
+import os
+import sys
+import shlex
+import subprocess
+import tarfile
+import StringIO
+
+def usage():
+ print >>sys.stderr, "usage: %s viewer_dir viewer_exes libs_suffix dump_syms_tool viewer_symbol_file" % sys.argv[0]
+
+class MissingModuleError(Exception):
+ def __init__(self, modules):
+ Exception.__init__(self, "Failed to find required modules: %r" % modules)
+ self.modules = modules
+
+def main(viewer_dir, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file):
+ print "generate_breakpad_symbols run with args: %s" % str((viewer_dir, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file))
+
+ # split up list of viewer_exes
+ # "'Second Life' SLPlugin" becomes ['Second Life', 'SLPlugin']
+ viewer_exes = shlex.split(viewer_exes)
+
+ found_required = dict([(module, False) for module in viewer_exes])
+
+ def matches(f):
+ if f in viewer_exes:
+ found_required[f] = True
+ return True
+ return fnmatch.fnmatch(f, libs_suffix)
+
+ def list_files():
+ for (dirname, subdirs, filenames) in os.walk(viewer_dir):
+ #print "scanning '%s' for modules..." % dirname
+ for f in itertools.ifilter(matches, filenames):
+ yield os.path.join(dirname, f)
+
+ def dump_module(m):
+ print "dumping module '%s' with '%s'..." % (m, dump_syms_tool)
+ child = subprocess.Popen([dump_syms_tool, m] , stdout=subprocess.PIPE)
+ out, err = child.communicate()
+ return (m,child.returncode, out, err)
+
+ out = tarfile.open(viewer_symbol_file, 'w:bz2')
+
+ for (filename,status,symbols,err) in itertools.imap(dump_module, list_files()):
+ if status == 0:
+ module_line = symbols[:symbols.index('\n')]
+ module_line = module_line.split()
+ hash_id = module_line[3]
+ module = ' '.join(module_line[4:])
+ if sys.platform in ['win32', 'cygwin']:
+ mod_name = module[:module.rindex('.pdb')]
+ else:
+ mod_name = module
+ symbolfile = StringIO.StringIO(symbols)
+ info = tarfile.TarInfo("%(module)s/%(hash_id)s/%(mod_name)s.sym" % dict(module=module, hash_id=hash_id, mod_name=mod_name))
+ info.size = symbolfile.len
+ out.addfile(info, symbolfile)
+ else:
+ print >>sys.stderr, "warning: failed to dump symbols for '%s': %s" % (filename, err)
+
+ out.close()
+
+ missing_modules = [m for (m,_) in
+ itertools.ifilter(lambda (k,v): not v, found_required.iteritems())
+ ]
+ if missing_modules:
+ print >> sys.stderr, "failed to generate %s" % viewer_symbol_file
+ os.remove(viewer_symbol_file)
+ raise MissingModuleError(missing_modules)
+
+ symbols = tarfile.open(viewer_symbol_file, 'r:bz2')
+ tarfile_members = symbols.getnames()
+ symbols.close()
+
+ for required_module in viewer_exes:
+ def match_module_basename(m):
+ return os.path.splitext(required_module)[0].lower() \
+ == os.path.splitext(os.path.basename(m))[0].lower()
+ # there must be at least one .sym file in tarfile_members that matches
+ # each required module (ignoring file extensions)
+ if not reduce(operator.or_, itertools.imap(match_module_basename, tarfile_members)):
+ print >> sys.stderr, "failed to find required %s in generated %s" \
+ % (required_module, viewer_symbol_file)
+ os.remove(viewer_symbol_file)
+ raise MissingModuleError([required_module])
+
+ print "successfully generated %s including required modules '%s'" % (viewer_symbol_file, viewer_exes)
+
+ return 0
+
+if __name__ == "__main__":
+ if len(sys.argv) != 6:
+ usage()
+ sys.exit(1)
+ sys.exit(main(*sys.argv[1:]))
+
diff --git a/indra/newview/gpu_table.txt b/indra/newview/gpu_table.txt
index 887dab66d1..62766f9229 100644
--- a/indra/newview/gpu_table.txt
+++ b/indra/newview/gpu_table.txt
@@ -47,8 +47,10 @@ ATI ASUS EAH26xx .*ATI.*ASUS.*EAH26.* 3 1
ATI ASUS EAH34xx .*ATI.*ASUS.*EAH34.* 1 1
ATI ASUS EAH36xx .*ATI.*ASUS.*EAH36.* 3 1
ATI ASUS EAH38xx .*ATI.*ASUS.*EAH38.* 3 1
+ATI ASUS EAH45xx .*ATI.*ASUS.*EAH45.* 1 1
ATI ASUS EAH48xx .*ATI.*ASUS.*EAH48.* 3 1
-ATI Radeon X1xxx .*ATI.*ASUS.*X1.* 2 1
+ATI ASUS EAH57xx .*ATI.*ASUS.*EAH57.* 3 1
+ATI Radeon X1xxx .*ATI.*ASUS.*X1.* 3 1
ATI Radeon X7xx .*ATI.*ASUS.*X7.* 1 1
ATI Radeon X500 .*ATI.*Diamond X5.* 1 1
ATI Radeon X13xx .*ATI.*Diamond X13.* 1 1
@@ -68,37 +70,42 @@ ATI M56 .*ATI.*M56.* 1 1
ATI M71 .*ATI.*M71.* 1 1
ATI M72 .*ATI.*M72.* 1 1
ATI M76 .*ATI.*M76.* 3 1
-ATI Mobility Radeon 7xxx .*ATI.*Mobility.*Radeon 7.* 0 1
-ATI Mobility Radeon 8xxx .*ATI.*Mobility.*Radeon 8.* 0 1
-ATI Mobility Radeon 9800 .*ATI.*Mobility.*98.* 0 1
-ATI Mobility Radeon 9700 .*ATI.*Mobility.*97.* 0 1
-ATI Mobility Radeon 9600 .*ATI.*Mobility.*96.* 0 1
-ATI Mobility Radeon HD 2300 .*ATI.*Mobility.*HD.*23.* 1 1
-ATI Mobility Radeon HD 2400 .*ATI.*Mobility.*HD.*24.* 1 1
-ATI Mobility Radeon HD 2600 .*ATI.*Mobility.*HD.*26.* 3 1
-ATI Mobility Radeon HD 3400 .*ATI.*Mobility.*HD.*34.* 1 1
-ATI Mobility Radeon HD 3600 .*ATI.*Mobility.*HD.*36.* 3 1
-ATI Mobility Radeon HD 3800 .*ATI.*Mobility.*HD.*38.* 3 1
-ATI Mobility Radeon X1xxx .*ATI.*Mobility.*X1.* 0 1
-ATI Mobility Radeon X2xxx .*ATI.*Mobility.*X2.* 0 1
-ATI Mobility Radeon X3xx .*ATI.*Mobility.*X3.* 1 1
-ATI Mobility Radeon X6xx .*ATI.*Mobility.*X6.* 1 1
-ATI Mobility Radeon X7xx .*ATI.*Mobility.*X7.* 1 1
-ATI Mobility Radeon Xxxx .*ATI.*Mobility.*X.* 0 1
-ATI Mobility Radeon .*ATI.*Mobility.* 0 1
-ATI Radeon HD 2300 .*ATI.*Radeon HD 23.* 0 1
-ATI Radeon HD 2400 .*ATI.*Radeon HD.*24.* 1 1
-ATI Radeon HD 2600 .*ATI.*Radeon HD 26.* 2 1
-ATI Radeon HD 2900 .*ATI.*Radeon HD 29.* 3 1
-ATI Radeon HD 3200 .*ATI.*Radeon.*HD.*32.* 1 1
-ATI Radeon HD 3300 .*ATI.*Radeon HD.*33.* 1 1
-ATI Radeon HD 3400 .*ATI.*Radeon HD.*34.* 1 1
-ATI Radeon HD 3600 .*ATI.*Radeon HD.*36.* 3 1
-ATI Radeon HD 3800 .*ATI.*Radeon HD.*38.* 3 1
-ATI Radeon HD 4300 .*ATI.*Radeon HD 43.* 1 1
-ATI Radeon HD 4500 .*ATI.*Radeon HD 45.* 2 1
-ATI Radeon HD 4600 .*ATI.*Radeon HD 46.* 3 1
-ATI Radeon HD 4800 .*ATI.*Radeon.*HD.*48.* 3 1
+ATI Mobility Radeon 7xxx .*ATI.*Mobility *Radeon 7.* 0 1
+ATI Mobility Radeon 8xxx .*ATI.*Mobility *Radeon 8.* 0 1
+ATI Mobility Radeon 9800 .*ATI.*Mobility *98.* 0 1
+ATI Mobility Radeon 9700 .*ATI.*Mobility *97.* 0 1
+ATI Mobility Radeon 9600 .*ATI.*Mobility *96.* 0 1
+ATI Mobility Radeon HD 2300 .*ATI.*Mobility *HD *23.* 1 1
+ATI Mobility Radeon HD 2400 .*ATI.*Mobility *HD *24.* 1 1
+ATI Mobility Radeon HD 2600 .*ATI.*Mobility *HD *26.* 3 1
+ATI Mobility Radeon HD 3400 .*ATI.*Mobility *HD *34.* 1 1
+ATI Mobility Radeon HD 3600 .*ATI.*Mobility *HD *36.* 3 1
+ATI Mobility Radeon HD 3800 .*ATI.*Mobility *HD *38.* 3 1
+ATI Mobility Radeon X1xxx .*ATI.*Mobility *X1.* 0 1
+ATI Mobility Radeon X2xxx .*ATI.*Mobility *X2.* 0 1
+ATI Mobility Radeon X3xx .*ATI.*Mobility *X3.* 1 1
+ATI Mobility Radeon X6xx .*ATI.*Mobility *X6.* 1 1
+ATI Mobility Radeon X7xx .*ATI.*Mobility *X7.* 1 1
+ATI Mobility Radeon Xxxx .*ATI.*Mobility *X.* 0 1
+ATI Radeon HD 2300 .*ATI.*Radeon HD *23.* 0 1
+ATI Radeon HD 2400 .*ATI.*Radeon HD *24.* 1 1
+ATI Radeon HD 2600 .*ATI.*Radeon HD *26.* 2 1
+ATI Radeon HD 2900 .*ATI.*Radeon HD *29.* 3 1
+ATI Radeon HD 3200 .*ATI.*Radeon *HD *32.* 0 1
+ATI Radeon HD 3300 .*ATI.*Radeon HD *33.* 1 1
+ATI Radeon HD 3400 .*ATI.*Radeon HD *34.* 1 1
+ATI Radeon HD 3600 .*ATI.*Radeon HD *36.* 3 1
+ATI Radeon HD 3800 .*ATI.*Radeon HD *38.* 3 1
+ATI Radeon HD 4200 .*ATI.*Radeon HD *42.* 1 1
+ATI Radeon HD 4300 .*ATI.*Radeon HD *43.* 1 1
+ATI Radeon HD 4500 .*ATI.*Radeon HD *45.* 3 1
+ATI Radeon HD 4600 .*ATI.*Radeon HD *46.* 3 1
+ATI Radeon HD 4700 .*ATI.*Radeon HD *47.* 3 1
+ATI Radeon HD 4800 .*ATI.*Radeon.*HD *48.* 3 1
+ATI Radeon HD 5600 .*ATI.*Radeon.*HD *56.* 3 1
+ATI Radeon HD 5700 .*ATI.*Radeon.*HD *57.* 3 1
+ATI Radeon HD 5800 .*ATI.*Radeon.*HD *58.* 3 1
+ATI Radeon HD 5900 .*ATI.*Radeon.*HD *59.* 3 1
ATI Radeon OpenGL .*ATI.*Radeon OpenGL.* 0 0
ATI Radeon 2100 .*ATI.*Radeon 21.* 0 1
ATI Radeon 3100 .*ATI.*Radeon 31.* 1 1
@@ -120,12 +127,12 @@ ATI Radeon VE .*ATI.*Radeon.*VE.* 0 0
ATI Radeon X1000 .*ATI.*Radeon *X10.* 0 1
ATI Radeon X1200 .*ATI.*Radeon *X12.* 0 1
ATI Radeon X1300 .*ATI.*Radeon *X13.* 1 1
-ATI Radeon X1400 .*ATI.*Radeon X14.* 1 1
-ATI Radeon X1500 .*ATI.*Radeon X15.* 1 1
+ATI Radeon X1400 .*ATI.*Radeon *X14.* 1 1
+ATI Radeon X1500 .*ATI.*Radeon *X15.* 1 1
ATI Radeon X1600 .*ATI.*Radeon *X16.* 1 1
-ATI Radeon X1700 .*ATI.*Radeon X17.* 1 1
-ATI Radeon X1800 .*ATI.*Radeon X18.* 3 1
-ATI Radeon X1900 .*ATI.*Radeon X19.* 3 1
+ATI Radeon X1700 .*ATI.*Radeon *X17.* 1 1
+ATI Radeon X1800 .*ATI.*Radeon *X18.* 3 1
+ATI Radeon X1900 .*ATI.*Radeon *X19.* 3 1
ATI Radeon X300 .*ATI.*Radeon *X3.* 0 1
ATI Radeon X400 .*ATI.*Radeon X4.* 0 1
ATI Radeon X500 .*ATI.*Radeon X5.* 0 1
@@ -152,13 +159,17 @@ Intel 945G .*Intel.*945G.* 0 1
Intel 950 .*Intel.*950.* 0 1
Intel 965 .*Intel.*965.* 0 1
Intel G33 .*Intel.*G33.* 0 0
+Intel G41 .*Intel.*G41.* 0 1
Intel G45 .*Intel.*G45.* 0 1
Intel Bear Lake .*Intel.*Bear Lake.* 0 0
Intel Broadwater .*Intel.*Broadwater.* 0 0
Intel Brookdale .*Intel.*Brookdale.* 0 0
Intel Cantiga .*Intel.*Cantiga.* 0 0
Intel Eaglelake .*Intel.*Eaglelake.* 0 1
+Intel Mobile 4 Series .*Intel.*Mobile.*4 Series.* 0 1
+Intel Media Graphics HD .*Intel.*Media.*Graphics.*HD.* 0 1
Intel Montara .*Intel.*Montara.* 0 0
+Intel Pineview .*Intel.*Pineview.* 0 1
Intel Springdale .*Intel.*Springdale.* 0 0
Matrox .*Matrox.* 0 0
Mesa .*Mesa.* 0 0
@@ -192,14 +203,14 @@ NVIDIA GeForce 7100 .*NVIDIA.*GeForce 71.* 0 1
NVIDIA GeForce 7200 .*NVIDIA.*GeForce 72.* 1 1
NVIDIA GeForce 7300 .*NVIDIA.*GeForce 73.* 1 1
NVIDIA GeForce 7500 .*NVIDIA.*GeForce 75.* 1 1
-NVIDIA GeForce 7600 .*NVIDIA.*GeForce 76.* 3 1
-NVIDIA GeForce 7800 .*NVIDIA.*GeForce.*78.* 3 1
-NVIDIA GeForce 7900 .*NVIDIA.*GeForce.*79.* 3 1
+NVIDIA GeForce 7600 .*NVIDIA.*GeForce 76.* 1 1
+NVIDIA GeForce 7800 .*NVIDIA.*GeForce 78.* 1 1
+NVIDIA GeForce 7900 .*NVIDIA.*GeForce 79.* 1 1
NVIDIA GeForce 8100 .*NVIDIA.*GeForce 81.* 1 1
NVIDIA GeForce 8200 .*NVIDIA.*GeForce 82.* 1 1
NVIDIA GeForce 8300 .*NVIDIA.*GeForce 83.* 1 1
NVIDIA GeForce 8400 .*NVIDIA.*GeForce 84.* 1 1
-NVIDIA GeForce 8500 .*GeForce 85.* 3 1
+NVIDIA GeForce 8500 .*GeForce 85.* 1 1
NVIDIA GeForce 8600M .*NVIDIA.*GeForce.*8600M.* 1 1
NVIDIA GeForce 8600 .*NVIDIA.*GeForce 86.* 3 1
NVIDIA GeForce 8700 .*NVIDIA.*GeForce 87.* 3 1
@@ -248,6 +259,7 @@ NVIDIA G84 .*G84.* 1 1
NVIDIA G92 .*G92.* 3 1
NVIDIA G94 .*G94.* 3 1
NVIDIA GeForce Go 6 .*GeForce Go 6.* 1 1
+NVIDIA ION .*NVIDIA ION.* 1 1
NVIDIA NB9M .*GeForce NB9M.* 1 1
NVIDIA NB9P .*GeForce NB9P.* 1 1
NVIDIA GeForce PCX .*GeForce PCX.* 0 1
diff --git a/indra/newview/installers/darwin/release-dmg/_DS_Store b/indra/newview/installers/darwin/release-dmg/_DS_Store
index 495ec37f53..8f6c25c2f4 100644
--- a/indra/newview/installers/darwin/release-dmg/_DS_Store
+++ b/indra/newview/installers/darwin/release-dmg/_DS_Store
Binary files differ
diff --git a/indra/newview/installers/windows/install_icon.ico b/indra/newview/installers/windows/install_icon.ico
index 1e00530c90..efe6c4f323 100644
--- a/indra/newview/installers/windows/install_icon.ico
+++ b/indra/newview/installers/windows/install_icon.ico
Binary files differ
diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi
index a7322749ca..b7b4c54001 100644
--- a/indra/newview/installers/windows/installer_template.nsi
+++ b/indra/newview/installers/windows/installer_template.nsi
@@ -797,6 +797,12 @@ WriteRegStr HKEY_CLASSES_ROOT "${URLNAME}\DefaultIcon" "" '"$INSTDIR\$INSTEXE"'
;; URL param must be last item passed to viewer, it ignores subsequent params
;; to avoid parameter injection attacks.
WriteRegExpandStr HKEY_CLASSES_ROOT "${URLNAME}\shell\open\command" "" '"$INSTDIR\$INSTEXE" $INSTFLAGS -url "%1"'
+WriteRegStr HKEY_CLASSES_ROOT "x-grid-location-info"(default)" "URL:Second Life"
+WriteRegStr HKEY_CLASSES_ROOT "x-grid-location-info" "URL Protocol" ""
+WriteRegStr HKEY_CLASSES_ROOT "x-grid-location-info\DefaultIcon" "" '"$INSTDIR\$INSTEXE"'
+;; URL param must be last item passed to viewer, it ignores subsequent params
+;; to avoid parameter injection attacks.
+WriteRegExpandStr HKEY_CLASSES_ROOT "x-grid-location-info\shell\open\command" "" '"$INSTDIR\$INSTEXE" $INSTFLAGS -url "%1"'
; write out uninstaller
WriteUninstaller "$INSTDIR\uninst.exe"
diff --git a/indra/newview/installers/windows/uninstall_icon.ico b/indra/newview/installers/windows/uninstall_icon.ico
index c4ec6c70bd..05e1546860 100644
--- a/indra/newview/installers/windows/uninstall_icon.ico
+++ b/indra/newview/installers/windows/uninstall_icon.ico
Binary files differ
diff --git a/indra/newview/linux_tools/client-readme.txt b/indra/newview/linux_tools/client-readme.txt
index 92d321d8c0..e01b9e4bc6 100644
--- a/indra/newview/linux_tools/client-readme.txt
+++ b/indra/newview/linux_tools/client-readme.txt
@@ -15,7 +15,7 @@ Life itself - please see <http://www.secondlife.com/whatis/>.
5.3. Blank window after minimizing it
5.4. Audio
5.5. 'Alt' key for camera controls doesn't work
- 5.6. In-world streaming movie/music playback
+ 5.6. In-world streaming movie, music and Flash playback
6. Advanced Troubleshooting
6.1. Audio
6.2. OpenGL
@@ -169,12 +169,15 @@ SOLUTION:- Some window managers eat the Alt key for their own purposes; you
example, the 'Windows' key!) which will allow the Alt key to function
properly with mouse actions in Second Life and other applications.
-PROBLEM 6:- In-world movie and/or music playback doesn't work for me.
+PROBLEM 6:- In-world movie, music, or Flash playback doesn't work for me.
SOLUTION:- You need to have a working installation of GStreamer 0.10; this
is usually an optional package for most versions of Linux. If you have
installed GStreamer 0.10 and you can play some music/movies but not others
then you need to install a wider selection of GStreamer plugins, either
- from your vendor or an appropriate third party.
+ from your vendor (i.e. the 'Ugly' plugins) or an appropriate third party.
+ For Flash playback, you need to have Flash 10 installed for your normal
+ web browser (for example, Firefox). PulseAudio is required for Flash
+ volume control / muting to fully function inside Second Life.
6. ADVANCED TROUBLESHOOTING
diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh
index f84102e1fb..d2df968544 100755
--- a/indra/newview/linux_tools/wrapper.sh
+++ b/indra/newview/linux_tools/wrapper.sh
@@ -41,16 +41,8 @@
## driver bug, try enabling this option and report whether it helps:
#export LL_ATI_MOUSE_CURSOR_BUG=x
-## - If you experience crashes with streaming video and music, you can
-## disable these by enabling this option:
-#export LL_DISABLE_GSTREAMER=x
-
-## - GStreamer is automatically disabled - for now - on 64-bit systems due
-## to common fatal incompatibilities; remove/comment these lines if you want
-## to try anyway.
if [ "`uname -m`" = "x86_64" ]; then
- export LL_DISABLE_GSTREAMER=x
- echo '64-bit Linux detected: Disabling GStreamer (streaming video and music) by default; edit ./secondlife to re-enable.'
+ echo '64-bit Linux detected.'
fi
## Everything below this line is just for advanced troubleshooters.
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 2354323a66..03efcadc98 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -35,6 +35,7 @@
#include "pipeline.h"
+#include "llagentcamera.h"
#include "llagentlistener.h"
#include "llagentwearables.h"
#include "llagentui.h"
@@ -43,9 +44,7 @@
#include "llcallingcard.h"
#include "llchannelmanager.h"
#include "llconsole.h"
-//#include "llfirstuse.h"
#include "llfloatercamera.h"
-#include "llfloatercustomize.h"
#include "llfloaterreg.h"
#include "llfloatertools.h"
#include "llgroupactions.h"
@@ -59,6 +58,7 @@
#include "llnearbychatbar.h"
#include "llnotificationsutil.h"
#include "llparcel.h"
+#include "llrendersphere.h"
#include "llsdutil.h"
#include "llsidetray.h"
#include "llsky.h"
@@ -72,6 +72,7 @@
#include "llviewerdisplay.h"
#include "llviewerjoystick.h"
#include "llviewermediafocus.h"
+#include "llviewermenu.h"
#include "llviewerobjectlist.h"
#include "llviewerparcelmgr.h"
#include "llviewerstats.h"
@@ -88,77 +89,18 @@ const BOOL ANIMATE = TRUE;
const U8 AGENT_STATE_TYPING = 0x04;
const U8 AGENT_STATE_EDITING = 0x10;
-//drone wandering constants
-const F32 MAX_WANDER_TIME = 20.f; // seconds
-const F32 MAX_HEADING_HALF_ERROR = 0.2f; // radians
-const F32 WANDER_MAX_SLEW_RATE = 2.f * DEG_TO_RAD; // radians / frame
-const F32 WANDER_TARGET_MIN_DISTANCE = 10.f; // meters
-
// Autopilot constants
-const F32 AUTOPILOT_HEADING_HALF_ERROR = 10.f * DEG_TO_RAD; // radians
-const F32 AUTOPILOT_MAX_SLEW_RATE = 1.f * DEG_TO_RAD; // radians / frame
-const F32 AUTOPILOT_STOP_DISTANCE = 2.f; // meters
const F32 AUTOPILOT_HEIGHT_ADJUST_DISTANCE = 8.f; // meters
const F32 AUTOPILOT_MIN_TARGET_HEIGHT_OFF_GROUND = 1.f; // meters
const F32 AUTOPILOT_MAX_TIME_NO_PROGRESS = 1.5f; // seconds
-// face editing constants
-const LLVector3d FACE_EDIT_CAMERA_OFFSET(0.4f, -0.05f, 0.07f);
-const LLVector3d FACE_EDIT_TARGET_OFFSET(0.f, 0.f, 0.05f);
-
-// Mousewheel camera zoom
-const F32 MIN_ZOOM_FRACTION = 0.25f;
-const F32 INITIAL_ZOOM_FRACTION = 1.f;
-const F32 MAX_ZOOM_FRACTION = 8.f;
-const F32 METERS_PER_WHEEL_CLICK = 1.f;
-
-const F32 MAX_TIME_DELTA = 1.f;
-
-const F32 CAMERA_ZOOM_HALF_LIFE = 0.07f; // seconds
-const F32 FOV_ZOOM_HALF_LIFE = 0.07f; // seconds
-
-const F32 CAMERA_FOCUS_HALF_LIFE = 0.f;//0.02f;
-const F32 CAMERA_LAG_HALF_LIFE = 0.25f;
-const F32 MIN_CAMERA_LAG = 0.5f;
-const F32 MAX_CAMERA_LAG = 5.f;
-
-const F32 CAMERA_COLLIDE_EPSILON = 0.1f;
-const F32 MIN_CAMERA_DISTANCE = 0.1f;
-const F32 AVATAR_ZOOM_MIN_X_FACTOR = 0.55f;
-const F32 AVATAR_ZOOM_MIN_Y_FACTOR = 0.7f;
-const F32 AVATAR_ZOOM_MIN_Z_FACTOR = 1.15f;
-
-const F32 MAX_CAMERA_DISTANCE_FROM_AGENT = 50.f;
-
-const F32 MAX_CAMERA_SMOOTH_DISTANCE = 50.0f;
-
-const F32 HEAD_BUFFER_SIZE = 0.3f;
-const F32 CUSTOMIZE_AVATAR_CAMERA_ANIM_SLOP = 0.2f;
-
-const F32 LAND_MIN_ZOOM = 0.15f;
-const F32 AVATAR_MIN_ZOOM = 0.5f;
-const F32 OBJECT_MIN_ZOOM = 0.02f;
-
-const F32 APPEARANCE_MIN_ZOOM = 0.39f;
-const F32 APPEARANCE_MAX_ZOOM = 8.f;
+const F32 MAX_VELOCITY_AUTO_LAND_SQUARED = 4.f * 4.f;
+const F64 CHAT_AGE_FAST_RATE = 3.0;
// fidget constants
const F32 MIN_FIDGET_TIME = 8.f; // seconds
const F32 MAX_FIDGET_TIME = 20.f; // seconds
-const S32 MAX_NUM_CHAT_POSITIONS = 10;
-const F32 GROUND_TO_AIR_CAMERA_TRANSITION_TIME = 0.5f;
-const F32 GROUND_TO_AIR_CAMERA_TRANSITION_START_TIME = 0.5f;
-
-const F32 MAX_VELOCITY_AUTO_LAND_SQUARED = 4.f * 4.f;
-
-const F32 MAX_FOCUS_OFFSET = 20.f;
-
-const F32 OBJECT_EXTENTS_PADDING = 0.5f;
-
-const F32 MIN_RADIUS_ALPHA_SIZZLE = 0.5f;
-
-const F64 CHAT_AGE_FAST_RATE = 3.0;
// The agent instance.
LLAgent gAgent;
@@ -193,11 +135,11 @@ bool handleSlowMotionAnimation(const LLSD& newvalue)
{
if (newvalue.asBoolean())
{
- gAgent.getAvatarObject()->setAnimTimeFactor(0.2f);
+ gAgentAvatarp->setAnimTimeFactor(0.2f);
}
else
{
- gAgent.getAvatarObject()->setAnimTimeFactor(1.0f);
+ gAgentAvatarp->setAnimTimeFactor(1.0f);
}
return true;
}
@@ -218,20 +160,12 @@ bool handleSlowMotionAnimation(const LLSD& newvalue)
// LLAgent()
//-----------------------------------------------------------------------------
LLAgent::LLAgent() :
- mDrawDistance( DEFAULT_FAR_PLANE ),
-
mGroupPowers(0),
mHideGroupTitle(FALSE),
mGroupID(),
- mLookAt(NULL),
- mPointAt(NULL),
-
- mHUDTargetZoom(1.f),
- mHUDCurZoom(1.f),
mInitialized(FALSE),
mListener(),
- mForceMouselook(FALSE),
mDoubleTapRunTimer(),
mDoubleTapRunMode(DOUBLETAP_NONE),
@@ -249,78 +183,17 @@ LLAgent::LLAgent() :
mDistanceTraveled(0.F),
mLastPositionGlobal(LLVector3d::zero),
- mAvatarObject(NULL),
-
mRenderState(0),
mTypingTimer(),
- mCameraMode( CAMERA_MODE_THIRD_PERSON ),
- mLastCameraMode( CAMERA_MODE_THIRD_PERSON ),
mViewsPushed(FALSE),
- mCameraPreset(CAMERA_PRESET_REAR_VIEW),
-
mCustomAnim(FALSE),
mShowAvatar(TRUE),
- mCameraAnimating( FALSE ),
- mAnimationCameraStartGlobal(),
- mAnimationFocusStartGlobal(),
- mAnimationTimer(),
- mAnimationDuration(0.33f),
-
- mCameraFOVZoomFactor(0.f),
- mCameraCurrentFOVZoomFactor(0.f),
- mCameraFocusOffset(),
- mCameraFOVDefault(DEFAULT_FIELD_OF_VIEW),
-
- mCameraCollidePlane(),
-
- mCurrentCameraDistance(2.f), // meters, set in init()
- mTargetCameraDistance(2.f),
- mCameraZoomFraction(1.f), // deprecated
- mThirdPersonHeadOffset(0.f, 0.f, 1.f),
- mSitCameraEnabled(FALSE),
- mCameraSmoothingLastPositionGlobal(),
- mCameraSmoothingLastPositionAgent(),
- mCameraSmoothingStop(FALSE),
-
- mCameraUpVector(LLVector3::z_axis), // default is straight up
-
- mFocusOnAvatar(TRUE),
- mFocusGlobal(),
- mFocusTargetGlobal(),
- mFocusObject(NULL),
- mFocusObjectDist(0.f),
- mFocusObjectOffset(),
- mFocusDotRadius( 0.1f ), // meters
- mTrackFocusObject(TRUE),
- mUIOffset(0.f),
-
mFrameAgent(),
mIsBusy(FALSE),
- mAtKey(0), // Either 1, 0, or -1... indicates that movement-key is pressed
- mWalkKey(0), // like AtKey, but causes less forward thrust
- mLeftKey(0),
- mUpKey(0),
- mYawKey(0.f),
- mPitchKey(0.f),
-
- mOrbitLeftKey(0.f),
- mOrbitRightKey(0.f),
- mOrbitUpKey(0.f),
- mOrbitDownKey(0.f),
- mOrbitInKey(0.f),
- mOrbitOutKey(0.f),
-
- mPanUpKey(0.f),
- mPanDownKey(0.f),
- mPanLeftKey(0.f),
- mPanRightKey(0.f),
- mPanInKey(0.f),
- mPanOutKey(0.f),
-
mControlFlags(0x00000000),
mbFlagsDirty(FALSE),
mbFlagsNeedReset(FALSE),
@@ -358,7 +231,6 @@ LLAgent::LLAgent() :
mControlsTakenPassedOnCount[i] = 0;
}
- mFollowCam.setMaxCameraDistantFromSubject( MAX_CAMERA_DISTANCE_FROM_AGENT );
mListener.reset(new LLAgentListener(*this));
}
@@ -372,37 +244,10 @@ void LLAgent::init()
gSavedSettings.declareBOOL("SlowMotionAnimation", FALSE, "Declared in code", FALSE);
gSavedSettings.getControl("SlowMotionAnimation")->getSignal()->connect(boost::bind(&handleSlowMotionAnimation, _2));
- mDrawDistance = gSavedSettings.getF32("RenderFarClip");
-
// *Note: this is where LLViewerCamera::getInstance() used to be constructed.
- LLViewerCamera::getInstance()->setView(DEFAULT_FIELD_OF_VIEW);
- // Leave at 0.1 meters until we have real near clip management
- LLViewerCamera::getInstance()->setNear(0.1f);
- LLViewerCamera::getInstance()->setFar(mDrawDistance); // if you want to change camera settings, do so in camera.h
- LLViewerCamera::getInstance()->setAspect( gViewerWindow->getWorldViewAspectRatio() ); // default, overridden in LLViewerWindow::reshape
- LLViewerCamera::getInstance()->setViewHeightInPixels(768); // default, overridden in LLViewerWindow::reshape
-
setFlying( gSavedSettings.getBOOL("FlyingAtExit") );
- mCameraFocusOffsetTarget = LLVector4(gSavedSettings.getVector3("CameraOffsetBuild"));
-
- mCameraPreset = (ECameraPreset) gSavedSettings.getU32("CameraPreset");
-
- mCameraOffsetInitial[CAMERA_PRESET_REAR_VIEW] = gSavedSettings.getVector3("CameraOffsetRearView");
- mCameraOffsetInitial[CAMERA_PRESET_FRONT_VIEW] = gSavedSettings.getVector3("CameraOffsetFrontView");
- mCameraOffsetInitial[CAMERA_PRESET_GROUP_VIEW] = gSavedSettings.getVector3("CameraOffsetGroupView");
-
- mFocusOffsetInitial[CAMERA_PRESET_REAR_VIEW] = gSavedSettings.getVector3d("FocusOffsetRearView");
- mFocusOffsetInitial[CAMERA_PRESET_FRONT_VIEW] = gSavedSettings.getVector3d("FocusOffsetFrontView");
- mFocusOffsetInitial[CAMERA_PRESET_GROUP_VIEW] = gSavedSettings.getVector3d("FocusOffsetGroupView");
-
- mCameraCollidePlane.clearVec();
- mCurrentCameraDistance = getCameraOffsetInitial().magVec() * gSavedSettings.getF32("CameraOffsetScale");
- mTargetCameraDistance = mCurrentCameraDistance;
- mCameraZoomFraction = 1.f;
- mTrackFocusObject = gSavedSettings.getBOOL("TrackFocusObject");
-
mEffectColor = LLUIColorTable::instance().getColor("EffectColor");
gSavedSettings.getControl("PreferredMaturity")->getValidateSignal()->connect(boost::bind(&LLAgent::validateMaturity, this, _2));
@@ -416,22 +261,7 @@ void LLAgent::init()
//-----------------------------------------------------------------------------
void LLAgent::cleanup()
{
- setSitCamera(LLUUID::null);
-
- mAvatarObject = NULL;
-
- if(mLookAt)
- {
- mLookAt->markDead() ;
- mLookAt = NULL;
- }
- if(mPointAt)
- {
- mPointAt->markDead() ;
- mPointAt = NULL;
- }
mRegionp = NULL;
- setFocusObject(NULL);
}
//-----------------------------------------------------------------------------
@@ -444,83 +274,6 @@ LLAgent::~LLAgent()
// *Note: this is where LLViewerCamera::getInstance() used to be deleted.
}
-// Change camera back to third person, stop the autopilot,
-// deselect stuff, etc.
-//-----------------------------------------------------------------------------
-// resetView()
-//-----------------------------------------------------------------------------
-void LLAgent::resetView(BOOL reset_camera, BOOL change_camera)
-{
- if (mAutoPilot)
- {
- stopAutoPilot(TRUE);
- }
-
- if (!gNoRender)
- {
- LLSelectMgr::getInstance()->unhighlightAll();
-
- // By popular request, keep land selection while walking around. JC
- // LLViewerParcelMgr::getInstance()->deselectLand();
-
- // force deselect when walking and attachment is selected
- // this is so people don't wig out when their avatar moves without animating
- if (LLSelectMgr::getInstance()->getSelection()->isAttachment())
- {
- LLSelectMgr::getInstance()->deselectAll();
- }
-
- // Hide all popup menus
- gMenuHolder->hideMenus();
- }
-
- if (change_camera && !gSavedSettings.getBOOL("FreezeTime"))
- {
- changeCameraToDefault();
-
- if (LLViewerJoystick::getInstance()->getOverrideCamera())
- {
- handle_toggle_flycam();
- }
-
- // reset avatar mode from eventual residual motion
- if (LLToolMgr::getInstance()->inBuildMode())
- {
- LLViewerJoystick::getInstance()->moveAvatar(true);
- }
-
- //Camera Tool is needed for Free Camera Control Mode
- if (!LLFloaterCamera::inFreeCameraMode())
- {
- LLFloaterReg::hideInstance("build");
-
- // Switch back to basic toolset
- LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
- }
-
- gViewerWindow->showCursor();
- }
-
-
- if (reset_camera && !gSavedSettings.getBOOL("FreezeTime"))
- {
- if (!gViewerWindow->getLeftMouseDown() && cameraThirdPerson())
- {
- // leaving mouse-steer mode
- LLVector3 agent_at_axis = getAtAxis();
- agent_at_axis -= projected_vec(agent_at_axis, getReferenceUpVector());
- agent_at_axis.normalize();
- gAgent.resetAxes(lerp(getAtAxis(), agent_at_axis, LLCriticalDamp::getInterpolant(0.3f)));
- }
-
- setFocusOnAvatar(TRUE, ANIMATE);
-
- mCameraFOVZoomFactor = 0.f;
- }
-
- mHUDTargetZoom = 1.f;
-}
-
// Handle any actions that need to be performed when the main app gains focus
// (such as through alt-tab).
//-----------------------------------------------------------------------------
@@ -528,9 +281,9 @@ void LLAgent::resetView(BOOL reset_camera, BOOL change_camera)
//-----------------------------------------------------------------------------
void LLAgent::onAppFocusGained()
{
- if (CAMERA_MODE_MOUSELOOK == mCameraMode)
+ if (CAMERA_MODE_MOUSELOOK == gAgentCamera.getCameraMode())
{
- changeCameraToDefault();
+ gAgentCamera.changeCameraToDefault();
LLToolMgr::getInstance()->clearSavedTool();
}
}
@@ -538,32 +291,15 @@ void LLAgent::onAppFocusGained()
void LLAgent::ageChat()
{
- if (mAvatarObject.notNull())
+ if (isAgentAvatarValid())
{
// get amount of time since I last chatted
- F64 elapsed_time = (F64)mAvatarObject->mChatTimer.getElapsedTimeF32();
+ F64 elapsed_time = (F64)gAgentAvatarp->mChatTimer.getElapsedTimeF32();
// add in frame time * 3 (so it ages 4x)
- mAvatarObject->mChatTimer.setAge(elapsed_time + (F64)gFrameDTClamped * (CHAT_AGE_FAST_RATE - 1.0));
+ gAgentAvatarp->mChatTimer.setAge(elapsed_time + (F64)gFrameDTClamped * (CHAT_AGE_FAST_RATE - 1.0));
}
}
-// Allow camera to be moved somewhere other than behind avatar.
-//-----------------------------------------------------------------------------
-// unlockView()
-//-----------------------------------------------------------------------------
-void LLAgent::unlockView()
-{
- if (getFocusOnAvatar())
- {
- if (mAvatarObject.notNull())
- {
- setFocusGlobal( LLVector3d::zero, mAvatarObject->mID );
- }
- setFocusOnAvatar(FALSE, FALSE); // no animation
- }
-}
-
-
//-----------------------------------------------------------------------------
// moveAt()
//-----------------------------------------------------------------------------
@@ -572,7 +308,7 @@ void LLAgent::moveAt(S32 direction, bool reset)
// age chat timer so it fades more quickly when you are intentionally moving
ageChat();
- setKey(direction, mAtKey);
+ gAgentCamera.setAtKey(LLAgentCamera::directionToKey(direction));
if (direction > 0)
{
@@ -585,7 +321,7 @@ void LLAgent::moveAt(S32 direction, bool reset)
if (reset)
{
- resetView();
+ gAgentCamera.resetView();
}
}
@@ -597,7 +333,7 @@ void LLAgent::moveAtNudge(S32 direction)
// age chat timer so it fades more quickly when you are intentionally moving
ageChat();
- setKey(direction, mWalkKey);
+ gAgentCamera.setWalkKey(LLAgentCamera::directionToKey(direction));
if (direction > 0)
{
@@ -608,7 +344,7 @@ void LLAgent::moveAtNudge(S32 direction)
setControlFlags(AGENT_CONTROL_NUDGE_AT_NEG);
}
- resetView();
+ gAgentCamera.resetView();
}
//-----------------------------------------------------------------------------
@@ -619,7 +355,7 @@ void LLAgent::moveLeft(S32 direction)
// age chat timer so it fades more quickly when you are intentionally moving
ageChat();
- setKey(direction, mLeftKey);
+ gAgentCamera.setLeftKey(LLAgentCamera::directionToKey(direction));
if (direction > 0)
{
@@ -630,7 +366,7 @@ void LLAgent::moveLeft(S32 direction)
setControlFlags(AGENT_CONTROL_LEFT_NEG | AGENT_CONTROL_FAST_LEFT);
}
- resetView();
+ gAgentCamera.resetView();
}
//-----------------------------------------------------------------------------
@@ -641,7 +377,7 @@ void LLAgent::moveLeftNudge(S32 direction)
// age chat timer so it fades more quickly when you are intentionally moving
ageChat();
- setKey(direction, mLeftKey);
+ gAgentCamera.setLeftKey(LLAgentCamera::directionToKey(direction));
if (direction > 0)
{
@@ -652,7 +388,7 @@ void LLAgent::moveLeftNudge(S32 direction)
setControlFlags(AGENT_CONTROL_NUDGE_LEFT_NEG);
}
- resetView();
+ gAgentCamera.resetView();
}
//-----------------------------------------------------------------------------
@@ -663,7 +399,7 @@ void LLAgent::moveUp(S32 direction)
// age chat timer so it fades more quickly when you are intentionally moving
ageChat();
- setKey(direction, mUpKey);
+ gAgentCamera.setUpKey(LLAgentCamera::directionToKey(direction));
if (direction > 0)
{
@@ -674,7 +410,7 @@ void LLAgent::moveUp(S32 direction)
setControlFlags(AGENT_CONTROL_UP_NEG | AGENT_CONTROL_FAST_UP);
}
- resetView();
+ gAgentCamera.resetView();
}
//-----------------------------------------------------------------------------
@@ -682,7 +418,7 @@ void LLAgent::moveUp(S32 direction)
//-----------------------------------------------------------------------------
void LLAgent::moveYaw(F32 mag, bool reset_view)
{
- mYawKey = mag;
+ gAgentCamera.setYawKey(mag);
if (mag > 0)
{
@@ -695,7 +431,7 @@ void LLAgent::moveYaw(F32 mag, bool reset_view)
if (reset_view)
{
- resetView();
+ gAgentCamera.resetView();
}
}
@@ -704,7 +440,7 @@ void LLAgent::moveYaw(F32 mag, bool reset_view)
//-----------------------------------------------------------------------------
void LLAgent::movePitch(F32 mag)
{
- mPitchKey = mag;
+ gAgentCamera.setPitchKey(mag);
if (mag > 0)
{
@@ -747,20 +483,20 @@ BOOL LLAgent::getFlying() const
//-----------------------------------------------------------------------------
void LLAgent::setFlying(BOOL fly)
{
- if (mAvatarObject.notNull())
+ if (isAgentAvatarValid())
{
// *HACK: Don't allow to start the flying mode if we got ANIM_AGENT_STANDUP signal
// because in this case we won't get a signal to start avatar flying animation and
// it will be walking with flying mode "ON" indication. However we allow to switch
// the flying mode off if we get ANIM_AGENT_STANDUP signal. See process_avatar_animation().
// See EXT-2781.
- if(fly && mAvatarObject->mSignaledAnimations.find(ANIM_AGENT_STANDUP) != mAvatarObject->mSignaledAnimations.end())
+ if(fly && gAgentAvatarp->mSignaledAnimations.find(ANIM_AGENT_STANDUP) != gAgentAvatarp->mSignaledAnimations.end())
{
return;
}
// don't allow taking off while sitting
- if (fly && mAvatarObject->isSitting())
+ if (fly && gAgentAvatarp->isSitting())
{
return;
}
@@ -806,16 +542,16 @@ void LLAgent::toggleFlying()
BOOL fly = !gAgent.getFlying();
gAgent.setFlying( fly );
- gAgent.resetView();
+ gAgentCamera.resetView();
}
// static
bool LLAgent::enableFlying()
{
BOOL sitting = FALSE;
- if (gAgent.getAvatarObject())
+ if (isAgentAvatarValid())
{
- sitting = gAgent.getAvatarObject()->isSitting();
+ sitting = gAgentAvatarp->isSitting();
}
return !sitting;
}
@@ -956,6 +692,7 @@ void LLAgent::sendMessage()
if (!mRegionp)
{
llerrs << "No region for agent yet!" << llendl;
+ return;
}
gMessageSystem->sendMessage(mRegionp->getHost());
}
@@ -984,9 +721,9 @@ void LLAgent::sendReliableMessage()
//-----------------------------------------------------------------------------
LLVector3 LLAgent::getVelocity() const
{
- if (mAvatarObject.notNull())
+ if (isAgentAvatarValid())
{
- return mAvatarObject->getVelocity();
+ return gAgentAvatarp->getVelocity();
}
else
{
@@ -1005,13 +742,13 @@ void LLAgent::setPositionAgent(const LLVector3 &pos_agent)
llerrs << "setPositionAgent is not a number" << llendl;
}
- if (mAvatarObject.notNull() && mAvatarObject->getParent())
+ if (isAgentAvatarValid() && gAgentAvatarp->getParent())
{
LLVector3 pos_agent_sitting;
LLVector3d pos_agent_d;
- LLViewerObject *parent = (LLViewerObject*)mAvatarObject->getParent();
+ LLViewerObject *parent = (LLViewerObject*)gAgentAvatarp->getParent();
- pos_agent_sitting = mAvatarObject->getPosition() * parent->getRotation() + parent->getPositionAgent();
+ pos_agent_sitting = gAgentAvatarp->getPosition() * parent->getRotation() + parent->getPositionAgent();
pos_agent_d.setVec(pos_agent_sitting);
mFrameAgent.setOrigin(pos_agent_sitting);
@@ -1028,24 +765,13 @@ void LLAgent::setPositionAgent(const LLVector3 &pos_agent)
}
//-----------------------------------------------------------------------------
-// slamLookAt()
-//-----------------------------------------------------------------------------
-void LLAgent::slamLookAt(const LLVector3 &look_at)
-{
- LLVector3 look_at_norm = look_at;
- look_at_norm.mV[VZ] = 0.f;
- look_at_norm.normalize();
- resetAxes(look_at_norm);
-}
-
-//-----------------------------------------------------------------------------
// getPositionGlobal()
//-----------------------------------------------------------------------------
const LLVector3d &LLAgent::getPositionGlobal() const
{
- if (mAvatarObject.notNull() && !mAvatarObject->mDrawable.isNull())
+ if (isAgentAvatarValid() && !gAgentAvatarp->mDrawable.isNull())
{
- mPositionGlobal = getPosGlobalFromAgent(mAvatarObject->getRenderPosition());
+ mPositionGlobal = getPosGlobalFromAgent(gAgentAvatarp->getRenderPosition());
}
else
{
@@ -1060,9 +786,9 @@ const LLVector3d &LLAgent::getPositionGlobal() const
//-----------------------------------------------------------------------------
const LLVector3 &LLAgent::getPositionAgent()
{
- if(mAvatarObject.notNull() && !mAvatarObject->mDrawable.isNull())
+ if (isAgentAvatarValid() && !gAgentAvatarp->mDrawable.isNull())
{
- mFrameAgent.setOrigin(mAvatarObject->getRenderPosition());
+ mFrameAgent.setOrigin(gAgentAvatarp->getRenderPosition());
}
return mFrameAgent.getOrigin();
@@ -1188,21 +914,21 @@ LLVector3 LLAgent::getReferenceUpVector()
{
// this vector is in the coordinate frame of the avatar's parent object, or the world if none
LLVector3 up_vector = LLVector3::z_axis;
- if (mAvatarObject.notNull() &&
- mAvatarObject->getParent() &&
- mAvatarObject->mDrawable.notNull())
+ if (isAgentAvatarValid() &&
+ gAgentAvatarp->getParent() &&
+ gAgentAvatarp->mDrawable.notNull())
{
- U32 camera_mode = mCameraAnimating ? mLastCameraMode : mCameraMode;
+ U32 camera_mode = gAgentCamera.getCameraAnimating() ? gAgentCamera.getLastCameraMode() : gAgentCamera.getCameraMode();
// and in third person...
if (camera_mode == CAMERA_MODE_THIRD_PERSON)
{
// make the up vector point to the absolute +z axis
- up_vector = up_vector * ~((LLViewerObject*)mAvatarObject->getParent())->getRenderRotation();
+ up_vector = up_vector * ~((LLViewerObject*)gAgentAvatarp->getParent())->getRenderRotation();
}
else if (camera_mode == CAMERA_MODE_MOUSELOOK)
{
// make the up vector point to the avatar's +z axis
- up_vector = up_vector * mAvatarObject->mDrawable->getRotation();
+ up_vector = up_vector * gAgentAvatarp->mDrawable->getRotation();
}
}
@@ -1238,7 +964,7 @@ F32 LLAgent::clampPitchToLimits(F32 angle)
F32 angle_from_skyward = acos( mFrameAgent.getAtAxis() * skyward );
- if (mAvatarObject.notNull() && mAvatarObject->isSitting())
+ if (isAgentAvatarValid() && gAgentAvatarp->isSitting())
{
look_down_limit = 130.f * DEG_TO_RAD;
}
@@ -1291,736 +1017,11 @@ LLQuaternion LLAgent::getQuat() const
return mFrameAgent.getQuaternion();
}
-
-//-----------------------------------------------------------------------------
-// calcFocusOffset()
-//-----------------------------------------------------------------------------
-LLVector3 LLAgent::calcFocusOffset(LLViewerObject *object, LLVector3 original_focus_point, S32 x, S32 y)
-{
- LLMatrix4 obj_matrix = object->getRenderMatrix();
- LLQuaternion obj_rot = object->getRenderRotation();
- LLVector3 obj_pos = object->getRenderPosition();
-
- BOOL is_avatar = object->isAvatar();
- // if is avatar - don't do any funk heuristics to position the focal point
- // see DEV-30589
- if (is_avatar)
- {
- return original_focus_point - obj_pos;
- }
-
-
- LLQuaternion inv_obj_rot = ~obj_rot; // get inverse of rotation
- LLVector3 object_extents = object->getScale();
- // make sure they object extents are non-zero
- object_extents.clamp(0.001f, F32_MAX);
-
- // obj_to_cam_ray is unit vector pointing from object center to camera, in the coordinate frame of the object
- LLVector3 obj_to_cam_ray = obj_pos - LLViewerCamera::getInstance()->getOrigin();
- obj_to_cam_ray.rotVec(inv_obj_rot);
- obj_to_cam_ray.normalize();
-
- // obj_to_cam_ray_proportions are the (positive) ratios of
- // the obj_to_cam_ray x,y,z components with the x,y,z object dimensions.
- LLVector3 obj_to_cam_ray_proportions;
- obj_to_cam_ray_proportions.mV[VX] = llabs(obj_to_cam_ray.mV[VX] / object_extents.mV[VX]);
- obj_to_cam_ray_proportions.mV[VY] = llabs(obj_to_cam_ray.mV[VY] / object_extents.mV[VY]);
- obj_to_cam_ray_proportions.mV[VZ] = llabs(obj_to_cam_ray.mV[VZ] / object_extents.mV[VZ]);
-
- // find the largest ratio stored in obj_to_cam_ray_proportions
- // this corresponds to the object's local axial plane (XY, YZ, XZ) that is *most* facing the camera
- LLVector3 longest_object_axis;
- // is x-axis longest?
- if (obj_to_cam_ray_proportions.mV[VX] > obj_to_cam_ray_proportions.mV[VY]
- && obj_to_cam_ray_proportions.mV[VX] > obj_to_cam_ray_proportions.mV[VZ])
- {
- // then grab it
- longest_object_axis.setVec(obj_matrix.getFwdRow4());
- }
- // is y-axis longest?
- else if (obj_to_cam_ray_proportions.mV[VY] > obj_to_cam_ray_proportions.mV[VZ])
- {
- // then grab it
- longest_object_axis.setVec(obj_matrix.getLeftRow4());
- }
- // otherwise, use z axis
- else
- {
- longest_object_axis.setVec(obj_matrix.getUpRow4());
- }
-
- // Use this axis as the normal to project mouse click on to plane with that normal, at the object center.
- // This generates a point behind the mouse cursor that is approximately in the middle of the object in
- // terms of depth.
- // We do this to allow the camera rotation tool to "tumble" the object by rotating the camera.
- // If the focus point were the object surface under the mouse, camera rotation would introduce an undesirable
- // eccentricity to the object orientation
- LLVector3 focus_plane_normal(longest_object_axis);
- focus_plane_normal.normalize();
-
- LLVector3d focus_pt_global;
- gViewerWindow->mousePointOnPlaneGlobal(focus_pt_global, x, y, gAgent.getPosGlobalFromAgent(obj_pos), focus_plane_normal);
- LLVector3 focus_pt = gAgent.getPosAgentFromGlobal(focus_pt_global);
-
- // find vector from camera to focus point in object space
- LLVector3 camera_to_focus_vec = focus_pt - LLViewerCamera::getInstance()->getOrigin();
- camera_to_focus_vec.rotVec(inv_obj_rot);
-
- // find vector from object origin to focus point in object coordinates
- LLVector3 focus_offset_from_object_center = focus_pt - obj_pos;
- // convert to object-local space
- focus_offset_from_object_center.rotVec(inv_obj_rot);
-
- // We need to project the focus point back into the bounding box of the focused object.
- // Do this by calculating the XYZ scale factors needed to get focus offset back in bounds along the camera_focus axis
- LLVector3 clip_fraction;
-
- // for each axis...
- for (U32 axis = VX; axis <= VZ; axis++)
- {
- //...calculate distance that focus offset sits outside of bounding box along that axis...
- //NOTE: dist_out_of_bounds keeps the sign of focus_offset_from_object_center
- F32 dist_out_of_bounds;
- if (focus_offset_from_object_center.mV[axis] > 0.f)
- {
- dist_out_of_bounds = llmax(0.f, focus_offset_from_object_center.mV[axis] - (object_extents.mV[axis] * 0.5f));
- }
- else
- {
- dist_out_of_bounds = llmin(0.f, focus_offset_from_object_center.mV[axis] + (object_extents.mV[axis] * 0.5f));
- }
-
- //...then calculate the scale factor needed to push camera_to_focus_vec back in bounds along current axis
- if (llabs(camera_to_focus_vec.mV[axis]) < 0.0001f)
- {
- // don't divide by very small number
- clip_fraction.mV[axis] = 0.f;
- }
- else
- {
- clip_fraction.mV[axis] = dist_out_of_bounds / camera_to_focus_vec.mV[axis];
- }
- }
-
- LLVector3 abs_clip_fraction = clip_fraction;
- abs_clip_fraction.abs();
-
- // find axis of focus offset that is *most* outside the bounding box and use that to
- // rescale focus offset to inside object extents
- if (abs_clip_fraction.mV[VX] > abs_clip_fraction.mV[VY]
- && abs_clip_fraction.mV[VX] > abs_clip_fraction.mV[VZ])
- {
- focus_offset_from_object_center -= clip_fraction.mV[VX] * camera_to_focus_vec;
- }
- else if (abs_clip_fraction.mV[VY] > abs_clip_fraction.mV[VZ])
- {
- focus_offset_from_object_center -= clip_fraction.mV[VY] * camera_to_focus_vec;
- }
- else
- {
- focus_offset_from_object_center -= clip_fraction.mV[VZ] * camera_to_focus_vec;
- }
-
- // convert back to world space
- focus_offset_from_object_center.rotVec(obj_rot);
-
- // now, based on distance of camera from object relative to object size
- // push the focus point towards the near surface of the object when (relatively) close to the objcet
- // or keep the focus point in the object middle when (relatively) far
- // NOTE: leave focus point in middle of avatars, since the behavior you want when alt-zooming on avatars
- // is almost always "tumble about middle" and not "spin around surface point"
- if (!is_avatar)
- {
- LLVector3 obj_rel = original_focus_point - object->getRenderPosition();
-
- //now that we have the object relative position, we should bias toward the center of the object
- //based on the distance of the camera to the focus point vs. the distance of the camera to the focus
-
- F32 relDist = llabs(obj_rel * LLViewerCamera::getInstance()->getAtAxis());
- F32 viewDist = dist_vec(obj_pos + obj_rel, LLViewerCamera::getInstance()->getOrigin());
-
-
- LLBBox obj_bbox = object->getBoundingBoxAgent();
- F32 bias = 0.f;
-
- // virtual_camera_pos is the camera position we are simulating by backing the camera off
- // and adjusting the FOV
- LLVector3 virtual_camera_pos = gAgent.getPosAgentFromGlobal(mFocusTargetGlobal + (getCameraPositionGlobal() - mFocusTargetGlobal) / (1.f + mCameraFOVZoomFactor));
-
- // if the camera is inside the object (large, hollow objects, for example)
- // leave focus point all the way to destination depth, away from object center
- if(!obj_bbox.containsPointAgent(virtual_camera_pos))
- {
- // perform magic number biasing of focus point towards surface vs. planar center
- bias = clamp_rescale(relDist/viewDist, 0.1f, 0.7f, 0.0f, 1.0f);
- obj_rel = lerp(focus_offset_from_object_center, obj_rel, bias);
- }
-
- focus_offset_from_object_center = obj_rel;
- }
-
- return focus_offset_from_object_center;
-}
-
-//-----------------------------------------------------------------------------
-// calcCameraMinDistance()
-//-----------------------------------------------------------------------------
-BOOL LLAgent::calcCameraMinDistance(F32 &obj_min_distance)
-{
- BOOL soft_limit = FALSE; // is the bounding box to be treated literally (volumes) or as an approximation (avatars)
-
- if (!mFocusObject || mFocusObject->isDead())
- {
- obj_min_distance = 0.f;
- return TRUE;
- }
-
- if (mFocusObject->mDrawable.isNull())
- {
-#ifdef LL_RELEASE_FOR_DOWNLOAD
- llwarns << "Focus object with no drawable!" << llendl;
-#else
- mFocusObject->dump();
- llerrs << "Focus object with no drawable!" << llendl;
-#endif
- obj_min_distance = 0.f;
- return TRUE;
- }
-
- LLQuaternion inv_object_rot = ~mFocusObject->getRenderRotation();
- LLVector3 target_offset_origin = mFocusObjectOffset;
- LLVector3 camera_offset_target(getCameraPositionAgent() - getPosAgentFromGlobal(mFocusTargetGlobal));
-
- // convert offsets into object local space
- camera_offset_target.rotVec(inv_object_rot);
- target_offset_origin.rotVec(inv_object_rot);
-
- // push around object extents based on target offset
- LLVector3 object_extents = mFocusObject->getScale();
- if (mFocusObject->isAvatar())
- {
- // fudge factors that lets you zoom in on avatars a bit more (which don't do FOV zoom)
- object_extents.mV[VX] *= AVATAR_ZOOM_MIN_X_FACTOR;
- object_extents.mV[VY] *= AVATAR_ZOOM_MIN_Y_FACTOR;
- object_extents.mV[VZ] *= AVATAR_ZOOM_MIN_Z_FACTOR;
- soft_limit = TRUE;
- }
- LLVector3 abs_target_offset = target_offset_origin;
- abs_target_offset.abs();
-
- LLVector3 target_offset_dir = target_offset_origin;
- F32 object_radius = mFocusObject->getVObjRadius();
-
- BOOL target_outside_object_extents = FALSE;
-
- for (U32 i = VX; i <= VZ; i++)
- {
- if (abs_target_offset.mV[i] * 2.f > object_extents.mV[i] + OBJECT_EXTENTS_PADDING)
- {
- target_outside_object_extents = TRUE;
- }
- if (camera_offset_target.mV[i] > 0.f)
- {
- object_extents.mV[i] -= target_offset_origin.mV[i] * 2.f;
- }
- else
- {
- object_extents.mV[i] += target_offset_origin.mV[i] * 2.f;
- }
- }
-
- // don't shrink the object extents so far that the object inverts
- object_extents.clamp(0.001f, F32_MAX);
-
- // move into first octant
- LLVector3 camera_offset_target_abs_norm = camera_offset_target;
- camera_offset_target_abs_norm.abs();
- // make sure offset is non-zero
- camera_offset_target_abs_norm.clamp(0.001f, F32_MAX);
- camera_offset_target_abs_norm.normalize();
-
- // find camera position relative to normalized object extents
- LLVector3 camera_offset_target_scaled = camera_offset_target_abs_norm;
- camera_offset_target_scaled.mV[VX] /= object_extents.mV[VX];
- camera_offset_target_scaled.mV[VY] /= object_extents.mV[VY];
- camera_offset_target_scaled.mV[VZ] /= object_extents.mV[VZ];
-
- if (camera_offset_target_scaled.mV[VX] > camera_offset_target_scaled.mV[VY] &&
- camera_offset_target_scaled.mV[VX] > camera_offset_target_scaled.mV[VZ])
- {
- if (camera_offset_target_abs_norm.mV[VX] < 0.001f)
- {
- obj_min_distance = object_extents.mV[VX] * 0.5f;
- }
- else
- {
- obj_min_distance = object_extents.mV[VX] * 0.5f / camera_offset_target_abs_norm.mV[VX];
- }
- }
- else if (camera_offset_target_scaled.mV[VY] > camera_offset_target_scaled.mV[VZ])
- {
- if (camera_offset_target_abs_norm.mV[VY] < 0.001f)
- {
- obj_min_distance = object_extents.mV[VY] * 0.5f;
- }
- else
- {
- obj_min_distance = object_extents.mV[VY] * 0.5f / camera_offset_target_abs_norm.mV[VY];
- }
- }
- else
- {
- if (camera_offset_target_abs_norm.mV[VZ] < 0.001f)
- {
- obj_min_distance = object_extents.mV[VZ] * 0.5f;
- }
- else
- {
- obj_min_distance = object_extents.mV[VZ] * 0.5f / camera_offset_target_abs_norm.mV[VZ];
- }
- }
-
- LLVector3 object_split_axis;
- LLVector3 target_offset_scaled = target_offset_origin;
- target_offset_scaled.abs();
- target_offset_scaled.normalize();
- target_offset_scaled.mV[VX] /= object_extents.mV[VX];
- target_offset_scaled.mV[VY] /= object_extents.mV[VY];
- target_offset_scaled.mV[VZ] /= object_extents.mV[VZ];
-
- if (target_offset_scaled.mV[VX] > target_offset_scaled.mV[VY] &&
- target_offset_scaled.mV[VX] > target_offset_scaled.mV[VZ])
- {
- object_split_axis = LLVector3::x_axis;
- }
- else if (target_offset_scaled.mV[VY] > target_offset_scaled.mV[VZ])
- {
- object_split_axis = LLVector3::y_axis;
- }
- else
- {
- object_split_axis = LLVector3::z_axis;
- }
-
- LLVector3 camera_offset_object(getCameraPositionAgent() - mFocusObject->getPositionAgent());
-
- // length projected orthogonal to target offset
- F32 camera_offset_dist = (camera_offset_object - target_offset_dir * (camera_offset_object * target_offset_dir)).magVec();
-
- // calculate whether the target point would be "visible" if it were outside the bounding box
- // on the opposite of the splitting plane defined by object_split_axis;
- BOOL exterior_target_visible = FALSE;
- if (camera_offset_dist > object_radius)
- {
- // target is visible from camera, so turn off fov zoom
- exterior_target_visible = TRUE;
- }
-
- F32 camera_offset_clip = camera_offset_object * object_split_axis;
- F32 target_offset_clip = target_offset_dir * object_split_axis;
-
- // target has moved outside of object extents
- // check to see if camera and target are on same side
- if (target_outside_object_extents)
- {
- if (camera_offset_clip > 0.f && target_offset_clip > 0.f)
- {
- return FALSE;
- }
- else if (camera_offset_clip < 0.f && target_offset_clip < 0.f)
- {
- return FALSE;
- }
- }
-
- // clamp obj distance to diagonal of 10 by 10 cube
- obj_min_distance = llmin(obj_min_distance, 10.f * F_SQRT3);
-
- obj_min_distance += LLViewerCamera::getInstance()->getNear() + (soft_limit ? 0.1f : 0.2f);
-
- return TRUE;
-}
-
-F32 LLAgent::getCameraZoomFraction()
-{
- // 0.f -> camera zoomed all the way out
- // 1.f -> camera zoomed all the way in
- LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
- if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD)
- {
- // already [0,1]
- return mHUDTargetZoom;
- }
- else if (mFocusOnAvatar && cameraThirdPerson())
- {
- return clamp_rescale(mCameraZoomFraction, MIN_ZOOM_FRACTION, MAX_ZOOM_FRACTION, 1.f, 0.f);
- }
- else if (cameraCustomizeAvatar())
- {
- F32 distance = (F32)mCameraFocusOffsetTarget.magVec();
- return clamp_rescale(distance, APPEARANCE_MIN_ZOOM, APPEARANCE_MAX_ZOOM, 1.f, 0.f );
- }
- else
- {
- F32 min_zoom;
- const F32 DIST_FUDGE = 16.f; // meters
- F32 max_zoom = llmin(mDrawDistance - DIST_FUDGE,
- LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE,
- MAX_CAMERA_DISTANCE_FROM_AGENT);
-
- F32 distance = (F32)mCameraFocusOffsetTarget.magVec();
- if (mFocusObject.notNull())
- {
- if (mFocusObject->isAvatar())
- {
- min_zoom = AVATAR_MIN_ZOOM;
- }
- else
- {
- min_zoom = OBJECT_MIN_ZOOM;
- }
- }
- else
- {
- min_zoom = LAND_MIN_ZOOM;
- }
-
- return clamp_rescale(distance, min_zoom, max_zoom, 1.f, 0.f);
- }
-}
-
-void LLAgent::setCameraZoomFraction(F32 fraction)
-{
- // 0.f -> camera zoomed all the way out
- // 1.f -> camera zoomed all the way in
- LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
-
- if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD)
- {
- mHUDTargetZoom = fraction;
- }
- else if (mFocusOnAvatar && cameraThirdPerson())
- {
- mCameraZoomFraction = rescale(fraction, 0.f, 1.f, MAX_ZOOM_FRACTION, MIN_ZOOM_FRACTION);
- }
- else if (cameraCustomizeAvatar())
- {
- LLVector3d camera_offset_dir = mCameraFocusOffsetTarget;
- camera_offset_dir.normalize();
- mCameraFocusOffsetTarget = camera_offset_dir * rescale(fraction, 0.f, 1.f, APPEARANCE_MAX_ZOOM, APPEARANCE_MIN_ZOOM);
- }
- else
- {
- F32 min_zoom = LAND_MIN_ZOOM;
- const F32 DIST_FUDGE = 16.f; // meters
- F32 max_zoom = llmin(mDrawDistance - DIST_FUDGE,
- LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE,
- MAX_CAMERA_DISTANCE_FROM_AGENT);
-
- if (mFocusObject.notNull())
- {
- if (mFocusObject.notNull())
- {
- if (mFocusObject->isAvatar())
- {
- min_zoom = AVATAR_MIN_ZOOM;
- }
- else
- {
- min_zoom = OBJECT_MIN_ZOOM;
- }
- }
- }
-
- LLVector3d camera_offset_dir = mCameraFocusOffsetTarget;
- camera_offset_dir.normalize();
- mCameraFocusOffsetTarget = camera_offset_dir * rescale(fraction, 0.f, 1.f, max_zoom, min_zoom);
- }
- startCameraAnimation();
-}
-
-
-//-----------------------------------------------------------------------------
-// cameraOrbitAround()
-//-----------------------------------------------------------------------------
-void LLAgent::cameraOrbitAround(const F32 radians)
-{
- LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
- if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD)
- {
- // do nothing for hud selection
- }
- else if (mFocusOnAvatar && (mCameraMode == CAMERA_MODE_THIRD_PERSON || mCameraMode == CAMERA_MODE_FOLLOW))
- {
- mFrameAgent.rotate(radians, getReferenceUpVector());
- }
- else
- {
- mCameraFocusOffsetTarget.rotVec(radians, 0.f, 0.f, 1.f);
-
- cameraZoomIn(1.f);
- }
-}
-
-
-//-----------------------------------------------------------------------------
-// cameraOrbitOver()
-//-----------------------------------------------------------------------------
-void LLAgent::cameraOrbitOver(const F32 angle)
-{
- LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
- if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD)
- {
- // do nothing for hud selection
- }
- else if (mFocusOnAvatar && mCameraMode == CAMERA_MODE_THIRD_PERSON)
- {
- pitch(angle);
- }
- else
- {
- LLVector3 camera_offset_unit(mCameraFocusOffsetTarget);
- camera_offset_unit.normalize();
-
- F32 angle_from_up = acos( camera_offset_unit * getReferenceUpVector() );
-
- LLVector3d left_axis;
- left_axis.setVec(LLViewerCamera::getInstance()->getLeftAxis());
- F32 new_angle = llclamp(angle_from_up - angle, 1.f * DEG_TO_RAD, 179.f * DEG_TO_RAD);
- mCameraFocusOffsetTarget.rotVec(angle_from_up - new_angle, left_axis);
-
- cameraZoomIn(1.f);
- }
-}
-
-//-----------------------------------------------------------------------------
-// cameraZoomIn()
-//-----------------------------------------------------------------------------
-void LLAgent::cameraZoomIn(const F32 fraction)
-{
- if (gDisconnected)
- {
- return;
- }
-
- LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
- if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD)
- {
- // just update hud zoom level
- mHUDTargetZoom /= fraction;
- return;
- }
-
-
- LLVector3d camera_offset(mCameraFocusOffsetTarget);
- LLVector3d camera_offset_unit(mCameraFocusOffsetTarget);
- F32 min_zoom = LAND_MIN_ZOOM;
- F32 current_distance = (F32)camera_offset_unit.normalize();
- F32 new_distance = current_distance * fraction;
-
- // Don't move through focus point
- if (mFocusObject)
- {
- LLVector3 camera_offset_dir((F32)camera_offset_unit.mdV[VX], (F32)camera_offset_unit.mdV[VY], (F32)camera_offset_unit.mdV[VZ]);
-
- if (mFocusObject->isAvatar())
- {
- calcCameraMinDistance(min_zoom);
- }
- else
- {
- min_zoom = OBJECT_MIN_ZOOM;
- }
- }
-
- new_distance = llmax(new_distance, min_zoom);
-
- // Don't zoom too far back
- const F32 DIST_FUDGE = 16.f; // meters
- F32 max_distance = llmin(mDrawDistance - DIST_FUDGE,
- LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE );
-
- if (new_distance > max_distance)
- {
- new_distance = max_distance;
-
- /*
- // Unless camera is unlocked
- if (!LLViewerCamera::sDisableCameraConstraints)
- {
- return;
- }
- */
- }
-
- if( cameraCustomizeAvatar() )
- {
- new_distance = llclamp( new_distance, APPEARANCE_MIN_ZOOM, APPEARANCE_MAX_ZOOM );
- }
-
- mCameraFocusOffsetTarget = new_distance * camera_offset_unit;
-}
-
-//-----------------------------------------------------------------------------
-// cameraOrbitIn()
-//-----------------------------------------------------------------------------
-void LLAgent::cameraOrbitIn(const F32 meters)
-{
- if (mFocusOnAvatar && mCameraMode == CAMERA_MODE_THIRD_PERSON)
- {
- F32 camera_offset_dist = llmax(0.001f, getCameraOffsetInitial().magVec() * gSavedSettings.getF32("CameraOffsetScale"));
-
- mCameraZoomFraction = (mTargetCameraDistance - meters) / camera_offset_dist;
-
- if (!gSavedSettings.getBOOL("FreezeTime") && mCameraZoomFraction < MIN_ZOOM_FRACTION && meters > 0.f)
- {
- // No need to animate, camera is already there.
- changeCameraToMouselook(FALSE);
- }
-
- mCameraZoomFraction = llclamp(mCameraZoomFraction, MIN_ZOOM_FRACTION, MAX_ZOOM_FRACTION);
- }
- else
- {
- LLVector3d camera_offset(mCameraFocusOffsetTarget);
- LLVector3d camera_offset_unit(mCameraFocusOffsetTarget);
- F32 current_distance = (F32)camera_offset_unit.normalize();
- F32 new_distance = current_distance - meters;
- F32 min_zoom = LAND_MIN_ZOOM;
-
- // Don't move through focus point
- if (mFocusObject.notNull())
- {
- if (mFocusObject->isAvatar())
- {
- min_zoom = AVATAR_MIN_ZOOM;
- }
- else
- {
- min_zoom = OBJECT_MIN_ZOOM;
- }
- }
-
- new_distance = llmax(new_distance, min_zoom);
-
- // Don't zoom too far back
- const F32 DIST_FUDGE = 16.f; // meters
- F32 max_distance = llmin(mDrawDistance - DIST_FUDGE,
- LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE );
-
- if (new_distance > max_distance)
- {
- // Unless camera is unlocked
- if (!gSavedSettings.getBOOL("DisableCameraConstraints"))
- {
- return;
- }
- }
-
- if( CAMERA_MODE_CUSTOMIZE_AVATAR == getCameraMode() )
- {
- new_distance = llclamp( new_distance, APPEARANCE_MIN_ZOOM, APPEARANCE_MAX_ZOOM );
- }
-
- // Compute new camera offset
- mCameraFocusOffsetTarget = new_distance * camera_offset_unit;
- cameraZoomIn(1.f);
- }
-}
-
-
-//-----------------------------------------------------------------------------
-// cameraPanIn()
-//-----------------------------------------------------------------------------
-void LLAgent::cameraPanIn(F32 meters)
-{
- LLVector3d at_axis;
- at_axis.setVec(LLViewerCamera::getInstance()->getAtAxis());
-
- mFocusTargetGlobal += meters * at_axis;
- mFocusGlobal = mFocusTargetGlobal;
- // don't enforce zoom constraints as this is the only way for users to get past them easily
- updateFocusOffset();
- // NOTE: panning movements expect the camera to move exactly with the focus target, not animated behind -Nyx
- mCameraSmoothingLastPositionGlobal = calcCameraPositionTargetGlobal();
-}
-
-//-----------------------------------------------------------------------------
-// cameraPanLeft()
-//-----------------------------------------------------------------------------
-void LLAgent::cameraPanLeft(F32 meters)
-{
- LLVector3d left_axis;
- left_axis.setVec(LLViewerCamera::getInstance()->getLeftAxis());
-
- mFocusTargetGlobal += meters * left_axis;
- mFocusGlobal = mFocusTargetGlobal;
-
- // disable smoothing for camera pan, which causes some residents unhappiness
- mCameraSmoothingStop = TRUE;
-
- cameraZoomIn(1.f);
- updateFocusOffset();
- // NOTE: panning movements expect the camera to move exactly with the focus target, not animated behind - Nyx
- mCameraSmoothingLastPositionGlobal = calcCameraPositionTargetGlobal();
-}
-
-//-----------------------------------------------------------------------------
-// cameraPanUp()
-//-----------------------------------------------------------------------------
-void LLAgent::cameraPanUp(F32 meters)
-{
- LLVector3d up_axis;
- up_axis.setVec(LLViewerCamera::getInstance()->getUpAxis());
-
- mFocusTargetGlobal += meters * up_axis;
- mFocusGlobal = mFocusTargetGlobal;
-
- // disable smoothing for camera pan, which causes some residents unhappiness
- mCameraSmoothingStop = TRUE;
-
- cameraZoomIn(1.f);
- updateFocusOffset();
- // NOTE: panning movements expect the camera to move exactly with the focus target, not animated behind -Nyx
- mCameraSmoothingLastPositionGlobal = calcCameraPositionTargetGlobal();
-}
-
-//-----------------------------------------------------------------------------
-// setKey()
-//-----------------------------------------------------------------------------
-void LLAgent::setKey(const S32 direction, S32 &key)
-{
- if (direction > 0)
- {
- key = 1;
- }
- else if (direction < 0)
- {
- key = -1;
- }
- else
- {
- key = 0;
- }
-}
-
-
//-----------------------------------------------------------------------------
// getControlFlags()
//-----------------------------------------------------------------------------
U32 LLAgent::getControlFlags()
{
-/*
- // HACK -- avoids maintenance of control flags when camera mode is turned on or off,
- // only worries about it when the flags are measured
- if (mCameraMode == CAMERA_MODE_MOUSELOOK)
- {
- if ( !(mControlFlags & AGENT_CONTROL_MOUSELOOK) )
- {
- mControlFlags |= AGENT_CONTROL_MOUSELOOK;
- }
- }
-*/
return mControlFlags;
}
@@ -2116,10 +1117,9 @@ void LLAgent::clearAFK()
// Gods can sometimes get into away state (via gestures)
// without setting the appropriate control flag. JC
- LLVOAvatar* av = mAvatarObject;
if (mControlFlags & AGENT_CONTROL_AWAY
- || (av
- && (av->mSignaledAnimations.find(ANIM_AGENT_AWAY) != av->mSignaledAnimations.end())))
+ || (isAgentAvatarValid()
+ && (gAgentAvatarp->mSignaledAnimations.find(ANIM_AGENT_AWAY) != gAgentAvatarp->mSignaledAnimations.end())))
{
sendAnimationRequest(ANIM_AGENT_AWAY, ANIM_REQUEST_STOP);
clearControlFlags(AGENT_CONTROL_AWAY);
@@ -2180,7 +1180,7 @@ BOOL LLAgent::getBusy() const
//-----------------------------------------------------------------------------
void LLAgent::startAutoPilotGlobal(const LLVector3d &target_global, const std::string& behavior_name, const LLQuaternion *target_rotation, void (*finish_callback)(BOOL, void *), void *callback_data, F32 stop_distance, F32 rot_threshold)
{
- if (!gAgent.getAvatarObject())
+ if (!isAgentAvatarValid())
{
return;
}
@@ -2226,7 +1226,10 @@ void LLAgent::startAutoPilotGlobal(const LLVector3d &target_global, const std::s
if ( distance > 1.f && heightDelta > (sqrtf(mAutoPilotStopDistance) + 1.f))
{
setFlying(TRUE);
- mAutoPilotFlyOnStop = TRUE;
+ // Do not force flying for "Sit" behavior to prevent flying after pressing "Stand"
+ // from an object. See EXT-1655.
+ if ("Sit" != mAutoPilotBehaviorName)
+ mAutoPilotFlyOnStop = TRUE;
}
mAutoPilot = TRUE;
@@ -2241,7 +1244,7 @@ void LLAgent::startAutoPilotGlobal(const LLVector3d &target_global, const std::s
LLViewerObject *obj;
LLWorld::getInstance()->resolveStepHeightGlobal(NULL, target_global, traceEndPt, targetOnGround, groundNorm, &obj);
- F64 target_height = llmax((F64)gAgent.getAvatarObject()->getPelvisToFoot(), target_global.mdV[VZ] - targetOnGround.mdV[VZ]);
+ F64 target_height = llmax((F64)gAgentAvatarp->getPelvisToFoot(), target_global.mdV[VZ] - targetOnGround.mdV[VZ]);
// clamp z value of target to minimum height above ground
mAutoPilotTargetGlobal.mdV[VZ] = targetOnGround.mdV[VZ] + target_height;
@@ -2295,6 +1298,13 @@ void LLAgent::stopAutoPilot(BOOL user_cancel)
{
resetAxes(mAutoPilotTargetFacing);
}
+ // Restore previous flying state before invoking mAutoPilotFinishedCallback to allow
+ // callback function to change the flying state (like in near_sit_down_point()).
+ // If the user cancelled, don't change the fly state
+ if (!user_cancel)
+ {
+ setFlying(mAutoPilotFlyOnStop);
+ }
//NB: auto pilot can terminate for a reason other than reaching the destination
if (mAutoPilotFinishedCallback)
{
@@ -2302,11 +1312,6 @@ void LLAgent::stopAutoPilot(BOOL user_cancel)
}
mLeaderID = LLUUID::null;
- // If the user cancelled, don't change the fly state
- if (!user_cancel)
- {
- setFlying(mAutoPilotFlyOnStop);
- }
setControlFlags(AGENT_CONTROL_STOP);
if (user_cancel && !mAutoPilotBehaviorName.empty())
@@ -2341,12 +1346,9 @@ void LLAgent::autoPilot(F32 *delta_yaw)
mAutoPilotTargetGlobal = object->getPositionGlobal();
}
- if (mAvatarObject.isNull())
- {
- return;
- }
+ if (!isAgentAvatarValid()) return;
- if (mAvatarObject->mInAir)
+ if (gAgentAvatarp->mInAir)
{
setFlying(TRUE);
}
@@ -2422,9 +1424,9 @@ void LLAgent::autoPilot(F32 *delta_yaw)
// If we're flying, handle autopilot points above or below you.
if (getFlying() && xy_distance < AUTOPILOT_HEIGHT_ADJUST_DISTANCE)
{
- if (mAvatarObject.notNull())
+ if (isAgentAvatarValid())
{
- F64 current_height = mAvatarObject->getPositionGlobal().mdV[VZ];
+ F64 current_height = gAgentAvatarp->getPositionGlobal().mdV[VZ];
F32 delta_z = (F32)(mAutoPilotTargetGlobal.mdV[VZ] - current_height);
F32 slope = delta_z / xy_distance;
if (slope > 0.45f && delta_z > 6.f)
@@ -2489,30 +1491,32 @@ void LLAgent::propagate(const F32 dt)
LLFloaterMove *floater_move = LLFloaterReg::findTypedInstance<LLFloaterMove>("moveview");
if (floater_move)
{
- floater_move->mForwardButton ->setToggleState( mAtKey > 0 || mWalkKey > 0 );
- floater_move->mBackwardButton ->setToggleState( mAtKey < 0 || mWalkKey < 0 );
- floater_move->mTurnLeftButton ->setToggleState( mYawKey > 0.f );
- floater_move->mTurnRightButton ->setToggleState( mYawKey < 0.f );
- floater_move->mMoveUpButton ->setToggleState( mUpKey > 0 );
- floater_move->mMoveDownButton ->setToggleState( mUpKey < 0 );
+ floater_move->mForwardButton ->setToggleState( gAgentCamera.getAtKey() > 0 || gAgentCamera.getWalkKey() > 0 );
+ floater_move->mBackwardButton ->setToggleState( gAgentCamera.getAtKey() < 0 || gAgentCamera.getWalkKey() < 0 );
+ floater_move->mTurnLeftButton ->setToggleState( gAgentCamera.getYawKey() > 0.f );
+ floater_move->mTurnRightButton ->setToggleState( gAgentCamera.getYawKey() < 0.f );
+ floater_move->mSlideLeftButton ->setToggleState( gAgentCamera.getLeftKey() > 0.f );
+ floater_move->mSlideRightButton ->setToggleState( gAgentCamera.getLeftKey() < 0.f );
+ floater_move->mMoveUpButton ->setToggleState( gAgentCamera.getUpKey() > 0 );
+ floater_move->mMoveDownButton ->setToggleState( gAgentCamera.getUpKey() < 0 );
}
// handle rotation based on keyboard levels
const F32 YAW_RATE = 90.f * DEG_TO_RAD; // radians per second
- yaw(YAW_RATE * mYawKey * dt);
+ yaw(YAW_RATE * gAgentCamera.getYawKey() * dt);
const F32 PITCH_RATE = 90.f * DEG_TO_RAD; // radians per second
- pitch(PITCH_RATE * mPitchKey * dt);
+ pitch(PITCH_RATE * gAgentCamera.getPitchKey() * dt);
// handle auto-land behavior
- if (mAvatarObject.notNull())
+ if (isAgentAvatarValid())
{
- BOOL in_air = mAvatarObject->mInAir;
+ BOOL in_air = gAgentAvatarp->mInAir;
LLVector3 land_vel = getVelocity();
land_vel.mV[VZ] = 0.f;
if (!in_air
- && mUpKey < 0
+ && gAgentCamera.getUpKey() < 0
&& land_vel.magVecSquared() < MAX_VELOCITY_AUTO_LAND_SQUARED
&& gSavedSettings.getBOOL("AutomaticFly"))
{
@@ -2521,13 +1525,7 @@ void LLAgent::propagate(const F32 dt)
}
}
- // clear keys
- mAtKey = 0;
- mWalkKey = 0;
- mLeftKey = 0;
- mUpKey = 0;
- mYawKey = 0.f;
- mPitchKey = 0.f;
+ gAgentCamera.clearGeneralKeys();
}
//-----------------------------------------------------------------------------
@@ -2545,79 +1543,7 @@ void LLAgent::updateAgentPosition(const F32 dt, const F32 yaw_radians, const S32
// Check for water and land collision, set underwater flag
//
- updateLookAt(mouse_x, mouse_y);
-}
-
-//-----------------------------------------------------------------------------
-// updateLookAt()
-//-----------------------------------------------------------------------------
-void LLAgent::updateLookAt(const S32 mouse_x, const S32 mouse_y)
-{
- static LLVector3 last_at_axis;
-
-
- if (mAvatarObject.isNull())
- {
- return;
- }
-
- LLQuaternion av_inv_rot = ~mAvatarObject->mRoot.getWorldRotation();
- LLVector3 root_at = LLVector3::x_axis * mAvatarObject->mRoot.getWorldRotation();
-
- if ((gViewerWindow->getMouseVelocityStat()->getCurrent() < 0.01f) &&
- (root_at * last_at_axis > 0.95f ))
- {
- LLVector3 vel = mAvatarObject->getVelocity();
- if (vel.magVecSquared() > 4.f)
- {
- setLookAt(LOOKAT_TARGET_IDLE, mAvatarObject, vel * av_inv_rot);
- }
- else
- {
- // *FIX: rotate mframeagent by sit object's rotation?
- LLQuaternion look_rotation = mAvatarObject->isSitting() ? mAvatarObject->getRenderRotation() : mFrameAgent.getQuaternion(); // use camera's current rotation
- LLVector3 look_offset = LLVector3(2.f, 0.f, 0.f) * look_rotation * av_inv_rot;
- setLookAt(LOOKAT_TARGET_IDLE, mAvatarObject, look_offset);
- }
- last_at_axis = root_at;
- return;
- }
-
- last_at_axis = root_at;
-
- if (CAMERA_MODE_CUSTOMIZE_AVATAR == getCameraMode())
- {
- setLookAt(LOOKAT_TARGET_NONE, mAvatarObject, LLVector3(-2.f, 0.f, 0.f));
- }
- else
- {
- // Move head based on cursor position
- ELookAtType lookAtType = LOOKAT_TARGET_NONE;
- LLVector3 headLookAxis;
- LLCoordFrame frameCamera = *((LLCoordFrame*)LLViewerCamera::getInstance());
-
- if (cameraMouselook())
- {
- lookAtType = LOOKAT_TARGET_MOUSELOOK;
- }
- else if (cameraThirdPerson())
- {
- // range from -.5 to .5
- F32 x_from_center =
- ((F32) mouse_x / (F32) gViewerWindow->getWindowWidthScaled() ) - 0.5f;
- F32 y_from_center =
- ((F32) mouse_y / (F32) gViewerWindow->getWindowHeightScaled() ) - 0.5f;
-
- frameCamera.yaw( - x_from_center * gSavedSettings.getF32("YawFromMousePosition") * DEG_TO_RAD);
- frameCamera.pitch( - y_from_center * gSavedSettings.getF32("PitchFromMousePosition") * DEG_TO_RAD);
- lookAtType = LOOKAT_TARGET_FREELOOK;
- }
-
- headLookAxis = frameCamera.getAtAxis();
- // RN: we use world-space offset for mouselook and freelook
- //headLookAxis = headLookAxis * av_inv_rot;
- setLookAt(lookAtType, mAvatarObject, headLookAxis);
- }
+ gAgentCamera.updateLookAt(mouse_x, mouse_y);
}
// friends and operators
@@ -2632,44 +1558,6 @@ std::ostream& operator<<(std::ostream &s, const LLAgent &agent)
return s;
}
-
-// ------------------- Beginning of legacy LLCamera hack ----------------------
-// This section is included for legacy LLCamera support until
-// it is no longer needed. Some legacy code must exist in
-// non-legacy functions, and is labeled with "// legacy" comments.
-
-//-----------------------------------------------------------------------------
-// setAvatarObject()
-//-----------------------------------------------------------------------------
-void LLAgent::setAvatarObject(LLVOAvatarSelf *avatar)
-{
- mAvatarObject = avatar;
-
- if (!avatar)
- {
- llinfos << "Setting LLAgent::mAvatarObject to NULL" << llendl;
- return;
- }
-
- if (!mLookAt)
- {
- mLookAt = (LLHUDEffectLookAt *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_LOOKAT);
- }
- if (!mPointAt)
- {
- mPointAt = (LLHUDEffectPointAt *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINTAT);
- }
-
- if (!mLookAt.isNull())
- {
- mLookAt->setSourceObject(avatar);
- }
- if (!mPointAt.isNull())
- {
- mPointAt->setSourceObject(avatar);
- }
-}
-
// TRUE if your own avatar needs to be rendered. Usually only
// in third person and build.
//-----------------------------------------------------------------------------
@@ -2677,7 +1565,7 @@ void LLAgent::setAvatarObject(LLVOAvatarSelf *avatar)
//-----------------------------------------------------------------------------
BOOL LLAgent::needsRenderAvatar()
{
- if (cameraMouselook() && !LLVOAvatar::sVisibleInFirstPerson)
+ if (gAgentCamera.cameraMouselook() && !LLVOAvatar::sVisibleInFirstPerson)
{
return FALSE;
}
@@ -2688,7 +1576,7 @@ BOOL LLAgent::needsRenderAvatar()
// TRUE if we need to render your own avatar's head.
BOOL LLAgent::needsRenderHead()
{
- return (LLVOAvatar::sVisibleInFirstPerson && LLPipeline::sReflectionRender) || (mShowAvatar && !cameraMouselook());
+ return (LLVOAvatar::sVisibleInFirstPerson && LLPipeline::sReflectionRender) || (mShowAvatar && !gAgentCamera.cameraMouselook());
}
//-----------------------------------------------------------------------------
@@ -2710,7 +1598,7 @@ void LLAgent::startTyping()
LLViewerObject* chatter = gObjectList.findObject(mLastChatterID);
if (chatter && chatter->isAvatar())
{
- gAgent.setLookAt(LOOKAT_TARGET_RESPOND, chatter, LLVector3::zero);
+ gAgentCamera.setLookAt(LOOKAT_TARGET_RESPOND, chatter, LLVector3::zero);
}
}
@@ -2789,14 +1677,14 @@ U8 LLAgent::getRenderState()
//-----------------------------------------------------------------------------
void LLAgent::endAnimationUpdateUI()
{
- if (mCameraMode == mLastCameraMode)
+ if (gAgentCamera.getCameraMode() == gAgentCamera.getLastCameraMode())
{
// We're already done endAnimationUpdateUI for this transition.
return;
}
// clean up UI from mode we're leaving
- if ( mLastCameraMode == CAMERA_MODE_MOUSELOOK )
+ if (gAgentCamera.getLastCameraMode() == CAMERA_MODE_MOUSELOOK )
{
// show mouse cursor
gViewerWindow->showCursor();
@@ -2834,33 +1722,33 @@ void LLAgent::endAnimationUpdateUI()
}
- gAgent.setLookAt(LOOKAT_TARGET_CLEAR);
+ gAgentCamera.setLookAt(LOOKAT_TARGET_CLEAR);
if( gMorphView )
{
gMorphView->setVisible( FALSE );
}
// Disable mouselook-specific animations
- if (mAvatarObject.notNull())
+ if (isAgentAvatarValid())
{
- if( mAvatarObject->isAnyAnimationSignaled(AGENT_GUN_AIM_ANIMS, NUM_AGENT_GUN_AIM_ANIMS) )
+ if( gAgentAvatarp->isAnyAnimationSignaled(AGENT_GUN_AIM_ANIMS, NUM_AGENT_GUN_AIM_ANIMS) )
{
- if (mAvatarObject->mSignaledAnimations.find(ANIM_AGENT_AIM_RIFLE_R) != mAvatarObject->mSignaledAnimations.end())
+ if (gAgentAvatarp->mSignaledAnimations.find(ANIM_AGENT_AIM_RIFLE_R) != gAgentAvatarp->mSignaledAnimations.end())
{
sendAnimationRequest(ANIM_AGENT_AIM_RIFLE_R, ANIM_REQUEST_STOP);
sendAnimationRequest(ANIM_AGENT_HOLD_RIFLE_R, ANIM_REQUEST_START);
}
- if (mAvatarObject->mSignaledAnimations.find(ANIM_AGENT_AIM_HANDGUN_R) != mAvatarObject->mSignaledAnimations.end())
+ if (gAgentAvatarp->mSignaledAnimations.find(ANIM_AGENT_AIM_HANDGUN_R) != gAgentAvatarp->mSignaledAnimations.end())
{
sendAnimationRequest(ANIM_AGENT_AIM_HANDGUN_R, ANIM_REQUEST_STOP);
sendAnimationRequest(ANIM_AGENT_HOLD_HANDGUN_R, ANIM_REQUEST_START);
}
- if (mAvatarObject->mSignaledAnimations.find(ANIM_AGENT_AIM_BAZOOKA_R) != mAvatarObject->mSignaledAnimations.end())
+ if (gAgentAvatarp->mSignaledAnimations.find(ANIM_AGENT_AIM_BAZOOKA_R) != gAgentAvatarp->mSignaledAnimations.end())
{
sendAnimationRequest(ANIM_AGENT_AIM_BAZOOKA_R, ANIM_REQUEST_STOP);
sendAnimationRequest(ANIM_AGENT_HOLD_BAZOOKA_R, ANIM_REQUEST_START);
}
- if (mAvatarObject->mSignaledAnimations.find(ANIM_AGENT_AIM_BOW_L) != mAvatarObject->mSignaledAnimations.end())
+ if (gAgentAvatarp->mSignaledAnimations.find(ANIM_AGENT_AIM_BOW_L) != gAgentAvatarp->mSignaledAnimations.end())
{
sendAnimationRequest(ANIM_AGENT_AIM_BOW_L, ANIM_REQUEST_STOP);
sendAnimationRequest(ANIM_AGENT_HOLD_BOW_L, ANIM_REQUEST_START);
@@ -2868,8 +1756,7 @@ void LLAgent::endAnimationUpdateUI()
}
}
}
- else
- if( mLastCameraMode == CAMERA_MODE_CUSTOMIZE_AVATAR )
+ else if (gAgentCamera.getLastCameraMode() == CAMERA_MODE_CUSTOMIZE_AVATAR)
{
// make sure we ask to save changes
@@ -2880,7 +1767,7 @@ void LLAgent::endAnimationUpdateUI()
gMorphView->setVisible( FALSE );
}
- if (mAvatarObject.notNull())
+ if (isAgentAvatarValid())
{
if(mCustomAnim)
{
@@ -2891,13 +1778,13 @@ void LLAgent::endAnimationUpdateUI()
}
}
- setLookAt(LOOKAT_TARGET_CLEAR);
+ gAgentCamera.setLookAt(LOOKAT_TARGET_CLEAR);
}
//---------------------------------------------------------------------
// Set up UI for mode we're entering
//---------------------------------------------------------------------
- if (mCameraMode == CAMERA_MODE_MOUSELOOK)
+ if (gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK)
{
// hide menus
gMenuBarView->setVisible(FALSE);
@@ -2912,7 +1799,7 @@ void LLAgent::endAnimationUpdateUI()
LLPanelStandStopFlying::getInstance()->setVisible(FALSE);
// clear out camera lag effect
- mCameraLag.clearVec();
+ gAgentCamera.clearCameraLag();
// JC - Added for always chat in third person option
gFocusMgr.setKeyboardFocus(NULL);
@@ -2940,49 +1827,49 @@ void LLAgent::endAnimationUpdateUI()
gConsole->setVisible( TRUE );
- if (mAvatarObject.notNull())
+ if (isAgentAvatarValid())
{
// Trigger mouselook-specific animations
- if( mAvatarObject->isAnyAnimationSignaled(AGENT_GUN_HOLD_ANIMS, NUM_AGENT_GUN_HOLD_ANIMS) )
+ if( gAgentAvatarp->isAnyAnimationSignaled(AGENT_GUN_HOLD_ANIMS, NUM_AGENT_GUN_HOLD_ANIMS) )
{
- if (mAvatarObject->mSignaledAnimations.find(ANIM_AGENT_HOLD_RIFLE_R) != mAvatarObject->mSignaledAnimations.end())
+ if (gAgentAvatarp->mSignaledAnimations.find(ANIM_AGENT_HOLD_RIFLE_R) != gAgentAvatarp->mSignaledAnimations.end())
{
sendAnimationRequest(ANIM_AGENT_HOLD_RIFLE_R, ANIM_REQUEST_STOP);
sendAnimationRequest(ANIM_AGENT_AIM_RIFLE_R, ANIM_REQUEST_START);
}
- if (mAvatarObject->mSignaledAnimations.find(ANIM_AGENT_HOLD_HANDGUN_R) != mAvatarObject->mSignaledAnimations.end())
+ if (gAgentAvatarp->mSignaledAnimations.find(ANIM_AGENT_HOLD_HANDGUN_R) != gAgentAvatarp->mSignaledAnimations.end())
{
sendAnimationRequest(ANIM_AGENT_HOLD_HANDGUN_R, ANIM_REQUEST_STOP);
sendAnimationRequest(ANIM_AGENT_AIM_HANDGUN_R, ANIM_REQUEST_START);
}
- if (mAvatarObject->mSignaledAnimations.find(ANIM_AGENT_HOLD_BAZOOKA_R) != mAvatarObject->mSignaledAnimations.end())
+ if (gAgentAvatarp->mSignaledAnimations.find(ANIM_AGENT_HOLD_BAZOOKA_R) != gAgentAvatarp->mSignaledAnimations.end())
{
sendAnimationRequest(ANIM_AGENT_HOLD_BAZOOKA_R, ANIM_REQUEST_STOP);
sendAnimationRequest(ANIM_AGENT_AIM_BAZOOKA_R, ANIM_REQUEST_START);
}
- if (mAvatarObject->mSignaledAnimations.find(ANIM_AGENT_HOLD_BOW_L) != mAvatarObject->mSignaledAnimations.end())
+ if (gAgentAvatarp->mSignaledAnimations.find(ANIM_AGENT_HOLD_BOW_L) != gAgentAvatarp->mSignaledAnimations.end())
{
sendAnimationRequest(ANIM_AGENT_HOLD_BOW_L, ANIM_REQUEST_STOP);
sendAnimationRequest(ANIM_AGENT_AIM_BOW_L, ANIM_REQUEST_START);
}
}
- if (mAvatarObject->getParent())
+ if (gAgentAvatarp->getParent())
{
LLVector3 at_axis = LLViewerCamera::getInstance()->getAtAxis();
- LLViewerObject* root_object = (LLViewerObject*)mAvatarObject->getRoot();
+ LLViewerObject* root_object = (LLViewerObject*)gAgentAvatarp->getRoot();
if (root_object->flagCameraDecoupled())
{
resetAxes(at_axis);
}
else
{
- resetAxes(at_axis * ~((LLViewerObject*)mAvatarObject->getParent())->getRenderRotation());
+ resetAxes(at_axis * ~((LLViewerObject*)gAgentAvatarp->getParent())->getRenderRotation());
}
}
}
}
- else if (mCameraMode == CAMERA_MODE_CUSTOMIZE_AVATAR)
+ else if (gAgentCamera.getCameraMode() == CAMERA_MODE_CUSTOMIZE_AVATAR)
{
LLToolMgr::getInstance()->setCurrentToolset(gFaceEditToolset);
@@ -2992,1583 +1879,22 @@ void LLAgent::endAnimationUpdateUI()
}
// freeze avatar
- if (mAvatarObject.notNull())
+ if (isAgentAvatarValid())
{
- mPauseRequest = mAvatarObject->requestPause();
+ mPauseRequest = gAgentAvatarp->requestPause();
}
}
- if (getAvatarObject())
+ if (isAgentAvatarValid())
{
- getAvatarObject()->updateAttachmentVisibility(mCameraMode);
+ gAgentAvatarp->updateAttachmentVisibility(gAgentCamera.getCameraMode());
}
gFloaterTools->dirty();
// Don't let this be called more than once if the camera
// mode hasn't changed. --JC
- mLastCameraMode = mCameraMode;
-
-}
-
-
-//-----------------------------------------------------------------------------
-// updateCamera()
-//-----------------------------------------------------------------------------
-void LLAgent::updateCamera()
-{
- //Ventrella - changed camera_skyward to the new global "mCameraUpVector"
- mCameraUpVector = LLVector3::z_axis;
- //LLVector3 camera_skyward(0.f, 0.f, 1.f);
- //end Ventrella
-
- U32 camera_mode = mCameraAnimating ? mLastCameraMode : mCameraMode;
-
- validateFocusObject();
-
- if (mAvatarObject.notNull() &&
- mAvatarObject->isSitting() &&
- camera_mode == CAMERA_MODE_MOUSELOOK)
- {
- //Ventrella
- //changed camera_skyward to the new global "mCameraUpVector"
- mCameraUpVector = mCameraUpVector * mAvatarObject->getRenderRotation();
- //end Ventrella
- }
-
- if (cameraThirdPerson() && mFocusOnAvatar && LLFollowCamMgr::getActiveFollowCamParams())
- {
- changeCameraToFollow();
- }
-
- //Ventrella
- //NOTE - this needs to be integrated into a general upVector system here within llAgent.
- if ( camera_mode == CAMERA_MODE_FOLLOW && mFocusOnAvatar )
- {
- mCameraUpVector = mFollowCam.getUpVector();
- }
- //end Ventrella
-
- if (mSitCameraEnabled)
- {
- if (mSitCameraReferenceObject->isDead())
- {
- setSitCamera(LLUUID::null);
- }
- }
-
- // Update UI with our camera inputs
- LLFloaterCamera* camera_floater = LLFloaterReg::findTypedInstance<LLFloaterCamera>("camera");
- if (camera_floater)
- {
- camera_floater->mRotate->setToggleState(
- mOrbitRightKey > 0.f, // left
- mOrbitUpKey > 0.f, // top
- mOrbitLeftKey > 0.f, // right
- mOrbitDownKey > 0.f); // bottom
-
- camera_floater->mTrack->setToggleState(
- mPanLeftKey > 0.f, // left
- mPanUpKey > 0.f, // top
- mPanRightKey > 0.f, // right
- mPanDownKey > 0.f); // bottom
- }
-
- // Handle camera movement based on keyboard.
- const F32 ORBIT_OVER_RATE = 90.f * DEG_TO_RAD; // radians per second
- const F32 ORBIT_AROUND_RATE = 90.f * DEG_TO_RAD; // radians per second
- const F32 PAN_RATE = 5.f; // meters per second
-
- if( mOrbitUpKey || mOrbitDownKey )
- {
- F32 input_rate = mOrbitUpKey - mOrbitDownKey;
- cameraOrbitOver( input_rate * ORBIT_OVER_RATE / gFPSClamped );
- }
-
- if( mOrbitLeftKey || mOrbitRightKey)
- {
- F32 input_rate = mOrbitLeftKey - mOrbitRightKey;
- cameraOrbitAround( input_rate * ORBIT_AROUND_RATE / gFPSClamped );
- }
-
- if( mOrbitInKey || mOrbitOutKey )
- {
- F32 input_rate = mOrbitInKey - mOrbitOutKey;
-
- LLVector3d to_focus = gAgent.getPosGlobalFromAgent(LLViewerCamera::getInstance()->getOrigin()) - calcFocusPositionTargetGlobal();
- F32 distance_to_focus = (F32)to_focus.magVec();
- // Move at distance (in meters) meters per second
- cameraOrbitIn( input_rate * distance_to_focus / gFPSClamped );
- }
-
- if( mPanInKey || mPanOutKey )
- {
- F32 input_rate = mPanInKey - mPanOutKey;
- cameraPanIn( input_rate * PAN_RATE / gFPSClamped );
- }
-
- if( mPanRightKey || mPanLeftKey )
- {
- F32 input_rate = mPanRightKey - mPanLeftKey;
- cameraPanLeft( input_rate * -PAN_RATE / gFPSClamped );
- }
-
- if( mPanUpKey || mPanDownKey )
- {
- F32 input_rate = mPanUpKey - mPanDownKey;
- cameraPanUp( input_rate * PAN_RATE / gFPSClamped );
- }
-
- // Clear camera keyboard keys.
- mOrbitLeftKey = 0.f;
- mOrbitRightKey = 0.f;
- mOrbitUpKey = 0.f;
- mOrbitDownKey = 0.f;
- mOrbitInKey = 0.f;
- mOrbitOutKey = 0.f;
-
- mPanRightKey = 0.f;
- mPanLeftKey = 0.f;
- mPanUpKey = 0.f;
- mPanDownKey = 0.f;
- mPanInKey = 0.f;
- mPanOutKey = 0.f;
-
- // lerp camera focus offset
- mCameraFocusOffset = lerp(mCameraFocusOffset, mCameraFocusOffsetTarget, LLCriticalDamp::getInterpolant(CAMERA_FOCUS_HALF_LIFE));
-
- //Ventrella
- if ( mCameraMode == CAMERA_MODE_FOLLOW )
- {
- if ( mAvatarObject.notNull() )
- {
- //--------------------------------------------------------------------------------
- // this is where the avatar's position and rotation are given to followCam, and
- // where it is updated. All three of its attributes are updated: (1) position,
- // (2) focus, and (3) upvector. They can then be queried elsewhere in llAgent.
- //--------------------------------------------------------------------------------
- // *TODO: use combined rotation of frameagent and sit object
- LLQuaternion avatarRotationForFollowCam = mAvatarObject->isSitting() ? mAvatarObject->getRenderRotation() : mFrameAgent.getQuaternion();
-
- LLFollowCamParams* current_cam = LLFollowCamMgr::getActiveFollowCamParams();
- if (current_cam)
- {
- mFollowCam.copyParams(*current_cam);
- mFollowCam.setSubjectPositionAndRotation( mAvatarObject->getRenderPosition(), avatarRotationForFollowCam );
- mFollowCam.update();
- LLViewerJoystick::getInstance()->setCameraNeedsUpdate(true);
- }
- else
- {
- changeCameraToThirdPerson(TRUE);
- }
- }
- }
- // end Ventrella
-
- BOOL hit_limit;
- LLVector3d camera_pos_global;
- LLVector3d camera_target_global = calcCameraPositionTargetGlobal(&hit_limit);
- mCameraVirtualPositionAgent = getPosAgentFromGlobal(camera_target_global);
- LLVector3d focus_target_global = calcFocusPositionTargetGlobal();
-
- // perform field of view correction
- mCameraFOVZoomFactor = calcCameraFOVZoomFactor();
- camera_target_global = focus_target_global + (camera_target_global - focus_target_global) * (1.f + mCameraFOVZoomFactor);
-
- mShowAvatar = TRUE; // can see avatar by default
-
- // Adjust position for animation
- if (mCameraAnimating)
- {
- F32 time = mAnimationTimer.getElapsedTimeF32();
-
- // yet another instance of critically damped motion, hooray!
- // F32 fraction_of_animation = 1.f - pow(2.f, -time / CAMERA_ZOOM_HALF_LIFE);
-
- // linear interpolation
- F32 fraction_of_animation = time / mAnimationDuration;
-
- BOOL isfirstPerson = mCameraMode == CAMERA_MODE_MOUSELOOK;
- BOOL wasfirstPerson = mLastCameraMode == CAMERA_MODE_MOUSELOOK;
- F32 fraction_animation_to_skip;
-
- if (mAnimationCameraStartGlobal == camera_target_global)
- {
- fraction_animation_to_skip = 0.f;
- }
- else
- {
- LLVector3d cam_delta = mAnimationCameraStartGlobal - camera_target_global;
- fraction_animation_to_skip = HEAD_BUFFER_SIZE / (F32)cam_delta.magVec();
- }
- F32 animation_start_fraction = (wasfirstPerson) ? fraction_animation_to_skip : 0.f;
- F32 animation_finish_fraction = (isfirstPerson) ? (1.f - fraction_animation_to_skip) : 1.f;
-
- if (fraction_of_animation < animation_finish_fraction)
- {
- if (fraction_of_animation < animation_start_fraction || fraction_of_animation > animation_finish_fraction )
- {
- mShowAvatar = FALSE;
- }
-
- // ...adjust position for animation
- F32 smooth_fraction_of_animation = llsmoothstep(0.0f, 1.0f, fraction_of_animation);
- camera_pos_global = lerp(mAnimationCameraStartGlobal, camera_target_global, smooth_fraction_of_animation);
- mFocusGlobal = lerp(mAnimationFocusStartGlobal, focus_target_global, smooth_fraction_of_animation);
- }
- else
- {
- // ...animation complete
- mCameraAnimating = FALSE;
-
- camera_pos_global = camera_target_global;
- mFocusGlobal = focus_target_global;
-
- endAnimationUpdateUI();
- mShowAvatar = TRUE;
- }
-
- if (getAvatarObject() && mCameraMode != CAMERA_MODE_MOUSELOOK)
- {
- getAvatarObject()->updateAttachmentVisibility(mCameraMode);
- }
- }
- else
- {
- camera_pos_global = camera_target_global;
- mFocusGlobal = focus_target_global;
- mShowAvatar = TRUE;
- }
-
- // smoothing
- if (TRUE)
- {
- LLVector3d agent_pos = getPositionGlobal();
- LLVector3d camera_pos_agent = camera_pos_global - agent_pos;
- // Sitting on what you're manipulating can cause camera jitter with smoothing.
- // This turns off smoothing while editing. -MG
- mCameraSmoothingStop |= (BOOL)LLToolMgr::getInstance()->inBuildMode();
-
- if (cameraThirdPerson() && !mCameraSmoothingStop)
- {
- const F32 SMOOTHING_HALF_LIFE = 0.02f;
-
- F32 smoothing = LLCriticalDamp::getInterpolant(gSavedSettings.getF32("CameraPositionSmoothing") * SMOOTHING_HALF_LIFE, FALSE);
-
- if (!mFocusObject) // we differentiate on avatar mode
- {
- // for avatar-relative focus, we smooth in avatar space -
- // the avatar moves too jerkily w/r/t global space to smooth there.
-
- LLVector3d delta = camera_pos_agent - mCameraSmoothingLastPositionAgent;
- if (delta.magVec() < MAX_CAMERA_SMOOTH_DISTANCE) // only smooth over short distances please
- {
- camera_pos_agent = lerp(mCameraSmoothingLastPositionAgent, camera_pos_agent, smoothing);
- camera_pos_global = camera_pos_agent + agent_pos;
- }
- }
- else
- {
- LLVector3d delta = camera_pos_global - mCameraSmoothingLastPositionGlobal;
- if (delta.magVec() < MAX_CAMERA_SMOOTH_DISTANCE) // only smooth over short distances please
- {
- camera_pos_global = lerp(mCameraSmoothingLastPositionGlobal, camera_pos_global, smoothing);
- }
- }
- }
-
- mCameraSmoothingLastPositionGlobal = camera_pos_global;
- mCameraSmoothingLastPositionAgent = camera_pos_agent;
- mCameraSmoothingStop = FALSE;
- }
-
-
- mCameraCurrentFOVZoomFactor = lerp(mCameraCurrentFOVZoomFactor, mCameraFOVZoomFactor, LLCriticalDamp::getInterpolant(FOV_ZOOM_HALF_LIFE));
-
-// llinfos << "Current FOV Zoom: " << mCameraCurrentFOVZoomFactor << " Target FOV Zoom: " << mCameraFOVZoomFactor << " Object penetration: " << mFocusObjectDist << llendl;
-
- F32 ui_offset = 0.f;
- if( CAMERA_MODE_CUSTOMIZE_AVATAR == mCameraMode )
- {
- ui_offset = calcCustomizeAvatarUIOffset( camera_pos_global );
- }
-
-
- LLVector3 focus_agent = getPosAgentFromGlobal(mFocusGlobal);
-
- mCameraPositionAgent = getPosAgentFromGlobal(camera_pos_global);
-
- // Move the camera
-
- //Ventrella
- LLViewerCamera::getInstance()->updateCameraLocation(mCameraPositionAgent, mCameraUpVector, focus_agent);
- //LLViewerCamera::getInstance()->updateCameraLocation(mCameraPositionAgent, camera_skyward, focus_agent);
- //end Ventrella
-
- //RN: translate UI offset after camera is oriented properly
- LLViewerCamera::getInstance()->translate(LLViewerCamera::getInstance()->getLeftAxis() * ui_offset);
-
- // Change FOV
- LLViewerCamera::getInstance()->setView(LLViewerCamera::getInstance()->getDefaultFOV() / (1.f + mCameraCurrentFOVZoomFactor));
-
- // follow camera when in customize mode
- if (cameraCustomizeAvatar())
- {
- setLookAt(LOOKAT_TARGET_FOCUS, NULL, mCameraPositionAgent);
- }
-
- // update the travel distance stat
- // this isn't directly related to the camera
- // but this seemed like the best place to do this
- LLVector3d global_pos = getPositionGlobal();
- if (! mLastPositionGlobal.isExactlyZero())
- {
- LLVector3d delta = global_pos - mLastPositionGlobal;
- mDistanceTraveled += delta.magVec();
- }
- mLastPositionGlobal = global_pos;
-
- if (LLVOAvatar::sVisibleInFirstPerson && mAvatarObject.notNull() && !mAvatarObject->isSitting() && cameraMouselook())
- {
- LLVector3 head_pos = mAvatarObject->mHeadp->getWorldPosition() +
- LLVector3(0.08f, 0.f, 0.05f) * mAvatarObject->mHeadp->getWorldRotation() +
- LLVector3(0.1f, 0.f, 0.f) * mAvatarObject->mPelvisp->getWorldRotation();
- LLVector3 diff = mCameraPositionAgent - head_pos;
- diff = diff * ~mAvatarObject->mRoot.getWorldRotation();
-
- LLJoint* torso_joint = mAvatarObject->mTorsop;
- LLJoint* chest_joint = mAvatarObject->mChestp;
- LLVector3 torso_scale = torso_joint->getScale();
- LLVector3 chest_scale = chest_joint->getScale();
-
- // shorten avatar skeleton to avoid foot interpenetration
- if (!mAvatarObject->mInAir)
- {
- LLVector3 chest_offset = LLVector3(0.f, 0.f, chest_joint->getPosition().mV[VZ]) * torso_joint->getWorldRotation();
- F32 z_compensate = llclamp(-diff.mV[VZ], -0.2f, 1.f);
- F32 scale_factor = llclamp(1.f - ((z_compensate * 0.5f) / chest_offset.mV[VZ]), 0.5f, 1.2f);
- torso_joint->setScale(LLVector3(1.f, 1.f, scale_factor));
-
- LLJoint* neck_joint = mAvatarObject->mNeckp;
- LLVector3 neck_offset = LLVector3(0.f, 0.f, neck_joint->getPosition().mV[VZ]) * chest_joint->getWorldRotation();
- scale_factor = llclamp(1.f - ((z_compensate * 0.5f) / neck_offset.mV[VZ]), 0.5f, 1.2f);
- chest_joint->setScale(LLVector3(1.f, 1.f, scale_factor));
- diff.mV[VZ] = 0.f;
- }
-
- mAvatarObject->mPelvisp->setPosition(mAvatarObject->mPelvisp->getPosition() + diff);
-
- mAvatarObject->mRoot.updateWorldMatrixChildren();
-
- for (LLVOAvatar::attachment_map_t::iterator iter = mAvatarObject->mAttachmentPoints.begin();
- iter != mAvatarObject->mAttachmentPoints.end(); )
- {
- LLVOAvatar::attachment_map_t::iterator curiter = iter++;
- LLViewerJointAttachment* attachment = curiter->second;
- for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
- attachment_iter != attachment->mAttachedObjects.end();
- ++attachment_iter)
- {
- LLViewerObject *attached_object = (*attachment_iter);
- if (attached_object && !attached_object->isDead() && attached_object->mDrawable.notNull())
- {
- // clear any existing "early" movements of attachment
- attached_object->mDrawable->clearState(LLDrawable::EARLY_MOVE);
- gPipeline.updateMoveNormalAsync(attached_object->mDrawable);
- attached_object->updateText();
- }
- }
- }
-
- torso_joint->setScale(torso_scale);
- chest_joint->setScale(chest_scale);
- }
-}
-
-void LLAgent::updateFocusOffset()
-{
- validateFocusObject();
- if (mFocusObject.notNull())
- {
- LLVector3d obj_pos = getPosGlobalFromAgent(mFocusObject->getRenderPosition());
- mFocusObjectOffset.setVec(mFocusTargetGlobal - obj_pos);
- }
-}
-
-void LLAgent::validateFocusObject()
-{
- if (mFocusObject.notNull() &&
- (mFocusObject->isDead()))
- {
- mFocusObjectOffset.clearVec();
- clearFocusObject();
- mCameraFOVZoomFactor = 0.f;
- }
-}
-
-//-----------------------------------------------------------------------------
-// calcCustomizeAvatarUIOffset()
-//-----------------------------------------------------------------------------
-F32 LLAgent::calcCustomizeAvatarUIOffset( const LLVector3d& camera_pos_global )
-{
- F32 ui_offset = 0.f;
-
- if( gFloaterCustomize )
- {
- const LLRect& rect = gFloaterCustomize->getRect();
-
- // Move the camera so that the avatar isn't covered up by this floater.
- F32 fraction_of_fov = 0.5f - (0.5f * (1.f - llmin(1.f, ((F32)rect.getWidth() / (F32)gViewerWindow->getWindowWidthScaled()))));
- F32 apparent_angle = fraction_of_fov * LLViewerCamera::getInstance()->getView() * LLViewerCamera::getInstance()->getAspect(); // radians
- F32 offset = tan(apparent_angle);
-
- if( rect.mLeft < (gViewerWindow->getWindowWidthScaled() - rect.mRight) )
- {
- // Move the avatar to the right (camera to the left)
- ui_offset = offset;
- }
- else
- {
- // Move the avatar to the left (camera to the right)
- ui_offset = -offset;
- }
- }
- F32 range = (F32)dist_vec(camera_pos_global, gAgent.getFocusGlobal());
- mUIOffset = lerp(mUIOffset, ui_offset, LLCriticalDamp::getInterpolant(0.05f));
- return mUIOffset * range;
-}
-
-//-----------------------------------------------------------------------------
-// calcFocusPositionTargetGlobal()
-//-----------------------------------------------------------------------------
-LLVector3d LLAgent::calcFocusPositionTargetGlobal()
-{
- if (mFocusObject.notNull() && mFocusObject->isDead())
- {
- clearFocusObject();
- }
-
- // Ventrella
- if ( mCameraMode == CAMERA_MODE_FOLLOW && mFocusOnAvatar )
- {
- mFocusTargetGlobal = gAgent.getPosGlobalFromAgent(mFollowCam.getSimulatedFocus());
- return mFocusTargetGlobal;
- }// End Ventrella
- else if (mCameraMode == CAMERA_MODE_MOUSELOOK)
- {
- LLVector3d at_axis(1.0, 0.0, 0.0);
- LLQuaternion agent_rot = mFrameAgent.getQuaternion();
- if (mAvatarObject.notNull() && mAvatarObject->getParent())
- {
- LLViewerObject* root_object = (LLViewerObject*)mAvatarObject->getRoot();
- if (!root_object->flagCameraDecoupled())
- {
- agent_rot *= ((LLViewerObject*)(mAvatarObject->getParent()))->getRenderRotation();
- }
- }
- at_axis = at_axis * agent_rot;
- mFocusTargetGlobal = calcCameraPositionTargetGlobal() + at_axis;
- return mFocusTargetGlobal;
- }
- else if (mCameraMode == CAMERA_MODE_CUSTOMIZE_AVATAR)
- {
- return mFocusTargetGlobal;
- }
- else if (!mFocusOnAvatar)
- {
- if (mFocusObject.notNull() && !mFocusObject->isDead() && mFocusObject->mDrawable.notNull())
- {
- LLDrawable* drawablep = mFocusObject->mDrawable;
-
- if (mTrackFocusObject &&
- drawablep &&
- drawablep->isActive())
- {
- if (!mFocusObject->isAvatar())
- {
- if (mFocusObject->isSelected())
- {
- gPipeline.updateMoveNormalAsync(drawablep);
- }
- else
- {
- if (drawablep->isState(LLDrawable::MOVE_UNDAMPED))
- {
- gPipeline.updateMoveNormalAsync(drawablep);
- }
- else
- {
- gPipeline.updateMoveDampedAsync(drawablep);
- }
- }
- }
- }
- // if not tracking object, update offset based on new object position
- else
- {
- updateFocusOffset();
- }
- LLVector3 focus_agent = mFocusObject->getRenderPosition() + mFocusObjectOffset;
- mFocusTargetGlobal.setVec(getPosGlobalFromAgent(focus_agent));
- }
- return mFocusTargetGlobal;
- }
- else if (mSitCameraEnabled && mAvatarObject.notNull() && mAvatarObject->isSitting() && mSitCameraReferenceObject.notNull())
- {
- // sit camera
- LLVector3 object_pos = mSitCameraReferenceObject->getRenderPosition();
- LLQuaternion object_rot = mSitCameraReferenceObject->getRenderRotation();
-
- LLVector3 target_pos = object_pos + (mSitCameraFocus * object_rot);
- return getPosGlobalFromAgent(target_pos);
- }
- else
- {
- return getPositionGlobal() + calcThirdPersonFocusOffset();
- }
-}
-
-LLVector3d LLAgent::calcThirdPersonFocusOffset()
-{
- // ...offset from avatar
- LLVector3d focus_offset;
-
- LLQuaternion agent_rot = mFrameAgent.getQuaternion();
- if (!mAvatarObject.isNull() && mAvatarObject->getParent())
- {
- agent_rot *= ((LLViewerObject*)(mAvatarObject->getParent()))->getRenderRotation();
- }
-
- focus_offset = mFocusOffsetInitial[mCameraPreset] * agent_rot;
- return focus_offset;
-}
-
-void LLAgent::setupSitCamera()
-{
- // agent frame entering this function is in world coordinates
- if (mAvatarObject.notNull() && mAvatarObject->getParent())
- {
- LLQuaternion parent_rot = ((LLViewerObject*)mAvatarObject->getParent())->getRenderRotation();
- // slam agent coordinate frame to proper parent local version
- LLVector3 at_axis = mFrameAgent.getAtAxis();
- at_axis.mV[VZ] = 0.f;
- at_axis.normalize();
- resetAxes(at_axis * ~parent_rot);
- }
-}
-
-//-----------------------------------------------------------------------------
-// getCameraPositionAgent()
-//-----------------------------------------------------------------------------
-const LLVector3 &LLAgent::getCameraPositionAgent() const
-{
- return LLViewerCamera::getInstance()->getOrigin();
-}
-
-//-----------------------------------------------------------------------------
-// getCameraPositionGlobal()
-//-----------------------------------------------------------------------------
-LLVector3d LLAgent::getCameraPositionGlobal() const
-{
- return getPosGlobalFromAgent(LLViewerCamera::getInstance()->getOrigin());
-}
-
-//-----------------------------------------------------------------------------
-// calcCameraFOVZoomFactor()
-//-----------------------------------------------------------------------------
-F32 LLAgent::calcCameraFOVZoomFactor()
-{
- LLVector3 camera_offset_dir;
- camera_offset_dir.setVec(mCameraFocusOffset);
-
- if (mCameraMode == CAMERA_MODE_MOUSELOOK)
- {
- return 0.f;
- }
- else if (mFocusObject.notNull() && !mFocusObject->isAvatar() && !mFocusOnAvatar)
- {
- // don't FOV zoom on mostly transparent objects
- LLVector3 focus_offset = mFocusObjectOffset;
- F32 obj_min_dist = 0.f;
- calcCameraMinDistance(obj_min_dist);
- F32 current_distance = llmax(0.001f, camera_offset_dir.magVec());
-
- mFocusObjectDist = obj_min_dist - current_distance;
-
- F32 new_fov_zoom = llclamp(mFocusObjectDist / current_distance, 0.f, 1000.f);
- return new_fov_zoom;
- }
- else // focusing on land or avatar
- {
- // keep old field of view until user changes focus explicitly
- return mCameraFOVZoomFactor;
- //return 0.f;
- }
-}
-
-//-----------------------------------------------------------------------------
-// calcCameraPositionTargetGlobal()
-//-----------------------------------------------------------------------------
-LLVector3d LLAgent::calcCameraPositionTargetGlobal(BOOL *hit_limit)
-{
- // Compute base camera position and look-at points.
- F32 camera_land_height;
- LLVector3d frame_center_global = mAvatarObject.isNull() ? getPositionGlobal()
- : getPosGlobalFromAgent(mAvatarObject->mRoot.getWorldPosition());
-
- BOOL isConstrained = FALSE;
- LLVector3d head_offset;
- head_offset.setVec(mThirdPersonHeadOffset);
-
- LLVector3d camera_position_global;
-
- // Ventrella
- if ( mCameraMode == CAMERA_MODE_FOLLOW && mFocusOnAvatar )
- {
- camera_position_global = gAgent.getPosGlobalFromAgent(mFollowCam.getSimulatedPosition());
- }// End Ventrella
- else if (mCameraMode == CAMERA_MODE_MOUSELOOK)
- {
- if (mAvatarObject.isNull() || mAvatarObject->mDrawable.isNull())
- {
- llwarns << "Null avatar drawable!" << llendl;
- return LLVector3d::zero;
- }
- head_offset.clearVec();
- if (mAvatarObject->isSitting() && mAvatarObject->getParent())
- {
- mAvatarObject->updateHeadOffset();
- head_offset.mdV[VX] = mAvatarObject->mHeadOffset.mV[VX];
- head_offset.mdV[VY] = mAvatarObject->mHeadOffset.mV[VY];
- head_offset.mdV[VZ] = mAvatarObject->mHeadOffset.mV[VZ] + 0.1f;
- const LLMatrix4& mat = ((LLViewerObject*) mAvatarObject->getParent())->getRenderMatrix();
- camera_position_global = getPosGlobalFromAgent
- ((mAvatarObject->getPosition()+
- LLVector3(head_offset)*mAvatarObject->getRotation()) * mat);
- }
- else
- {
- head_offset.mdV[VZ] = mAvatarObject->mHeadOffset.mV[VZ];
- if (mAvatarObject->isSitting())
- {
- head_offset.mdV[VZ] += 0.1;
- }
- camera_position_global = getPosGlobalFromAgent(mAvatarObject->getRenderPosition());//frame_center_global;
- head_offset = head_offset * mAvatarObject->getRenderRotation();
- camera_position_global = camera_position_global + head_offset;
- }
- }
- else if (mCameraMode == CAMERA_MODE_THIRD_PERSON && mFocusOnAvatar)
- {
- LLVector3 local_camera_offset;
- F32 camera_distance = 0.f;
-
- if (mSitCameraEnabled
- && mAvatarObject.notNull()
- && mAvatarObject->isSitting()
- && mSitCameraReferenceObject.notNull())
- {
- // sit camera
- LLVector3 object_pos = mSitCameraReferenceObject->getRenderPosition();
- LLQuaternion object_rot = mSitCameraReferenceObject->getRenderRotation();
-
- LLVector3 target_pos = object_pos + (mSitCameraPos * object_rot);
-
- camera_position_global = getPosGlobalFromAgent(target_pos);
- }
- else
- {
- local_camera_offset = mCameraZoomFraction * getCameraOffsetInitial() * gSavedSettings.getF32("CameraOffsetScale");
-
- // are we sitting down?
- if (mAvatarObject.notNull() && mAvatarObject->getParent())
- {
- LLQuaternion parent_rot = ((LLViewerObject*)mAvatarObject->getParent())->getRenderRotation();
- // slam agent coordinate frame to proper parent local version
- LLVector3 at_axis = mFrameAgent.getAtAxis() * parent_rot;
- at_axis.mV[VZ] = 0.f;
- at_axis.normalize();
- resetAxes(at_axis * ~parent_rot);
-
- local_camera_offset = local_camera_offset * mFrameAgent.getQuaternion() * parent_rot;
- }
- else
- {
- local_camera_offset = mFrameAgent.rotateToAbsolute( local_camera_offset );
- }
-
- if (!mCameraCollidePlane.isExactlyZero() && (mAvatarObject.isNull() || !mAvatarObject->isSitting()))
- {
- LLVector3 plane_normal;
- plane_normal.setVec(mCameraCollidePlane.mV);
-
- F32 offset_dot_norm = local_camera_offset * plane_normal;
- if (llabs(offset_dot_norm) < 0.001f)
- {
- offset_dot_norm = 0.001f;
- }
-
- camera_distance = local_camera_offset.normalize();
-
- F32 pos_dot_norm = getPosAgentFromGlobal(frame_center_global + head_offset) * plane_normal;
-
- // if agent is outside the colliding half-plane
- if (pos_dot_norm > mCameraCollidePlane.mV[VW])
- {
- // check to see if camera is on the opposite side (inside) the half-plane
- if (offset_dot_norm + pos_dot_norm < mCameraCollidePlane.mV[VW])
- {
- // diminish offset by factor to push it back outside the half-plane
- camera_distance *= (pos_dot_norm - mCameraCollidePlane.mV[VW] - CAMERA_COLLIDE_EPSILON) / -offset_dot_norm;
- }
- }
- else
- {
- if (offset_dot_norm + pos_dot_norm > mCameraCollidePlane.mV[VW])
- {
- camera_distance *= (mCameraCollidePlane.mV[VW] - pos_dot_norm - CAMERA_COLLIDE_EPSILON) / offset_dot_norm;
- }
- }
- }
- else
- {
- camera_distance = local_camera_offset.normalize();
- }
-
- mTargetCameraDistance = llmax(camera_distance, MIN_CAMERA_DISTANCE);
-
- if (mTargetCameraDistance != mCurrentCameraDistance)
- {
- F32 camera_lerp_amt = LLCriticalDamp::getInterpolant(CAMERA_ZOOM_HALF_LIFE);
-
- mCurrentCameraDistance = lerp(mCurrentCameraDistance, mTargetCameraDistance, camera_lerp_amt);
- }
-
- // Make the camera distance current
- local_camera_offset *= mCurrentCameraDistance;
-
- // set the global camera position
- LLVector3d camera_offset;
-
- LLVector3 av_pos = mAvatarObject.isNull() ? LLVector3::zero : mAvatarObject->getRenderPosition();
- camera_offset.setVec( local_camera_offset );
- camera_position_global = frame_center_global + head_offset + camera_offset;
-
- if (mAvatarObject.notNull())
- {
- LLVector3d camera_lag_d;
- F32 lag_interp = LLCriticalDamp::getInterpolant(CAMERA_LAG_HALF_LIFE);
- LLVector3 target_lag;
- LLVector3 vel = getVelocity();
-
- // lag by appropriate amount for flying
- F32 time_in_air = mAvatarObject->mTimeInAir.getElapsedTimeF32();
- if(!mCameraAnimating && mAvatarObject->mInAir && time_in_air > GROUND_TO_AIR_CAMERA_TRANSITION_START_TIME)
- {
- LLVector3 frame_at_axis = mFrameAgent.getAtAxis();
- frame_at_axis -= projected_vec(frame_at_axis, getReferenceUpVector());
- frame_at_axis.normalize();
-
- //transition smoothly in air mode, to avoid camera pop
- F32 u = (time_in_air - GROUND_TO_AIR_CAMERA_TRANSITION_START_TIME) / GROUND_TO_AIR_CAMERA_TRANSITION_TIME;
- u = llclamp(u, 0.f, 1.f);
-
- lag_interp *= u;
-
- if (gViewerWindow->getLeftMouseDown() && gViewerWindow->getLastPick().mObjectID == mAvatarObject->getID())
- {
- // disable camera lag when using mouse-directed steering
- target_lag.clearVec();
- }
- else
- {
- target_lag = vel * gSavedSettings.getF32("DynamicCameraStrength") / 30.f;
- }
-
- mCameraLag = lerp(mCameraLag, target_lag, lag_interp);
-
- F32 lag_dist = mCameraLag.magVec();
- if (lag_dist > MAX_CAMERA_LAG)
- {
- mCameraLag = mCameraLag * MAX_CAMERA_LAG / lag_dist;
- }
-
- // clamp camera lag so that avatar is always in front
- F32 dot = (mCameraLag - (frame_at_axis * (MIN_CAMERA_LAG * u))) * frame_at_axis;
- if (dot < -(MIN_CAMERA_LAG * u))
- {
- mCameraLag -= (dot + (MIN_CAMERA_LAG * u)) * frame_at_axis;
- }
- }
- else
- {
- mCameraLag = lerp(mCameraLag, LLVector3::zero, LLCriticalDamp::getInterpolant(0.15f));
- }
-
- camera_lag_d.setVec(mCameraLag);
- camera_position_global = camera_position_global - camera_lag_d;
- }
- }
- }
- else
- {
- LLVector3d focusPosGlobal = calcFocusPositionTargetGlobal();
- // camera gets pushed out later wrt mCameraFOVZoomFactor...this is "raw" value
- camera_position_global = focusPosGlobal + mCameraFocusOffset;
- }
-
- if (!gSavedSettings.getBOOL("DisableCameraConstraints") && !gAgent.isGodlike())
- {
- LLViewerRegion* regionp = LLWorld::getInstance()->getRegionFromPosGlobal(
- camera_position_global);
- bool constrain = true;
- if(regionp && regionp->canManageEstate())
- {
- constrain = false;
- }
- if(constrain)
- {
- F32 max_dist = ( CAMERA_MODE_CUSTOMIZE_AVATAR == mCameraMode ) ?
- APPEARANCE_MAX_ZOOM : mDrawDistance;
-
- LLVector3d camera_offset = camera_position_global
- - gAgent.getPositionGlobal();
- F32 camera_distance = (F32)camera_offset.magVec();
-
- if(camera_distance > max_dist)
- {
- camera_position_global = gAgent.getPositionGlobal() +
- (max_dist / camera_distance) * camera_offset;
- isConstrained = TRUE;
- }
- }
-
-// JC - Could constrain camera based on parcel stuff here.
-// LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromPosGlobal(camera_position_global);
-//
-// if (regionp && !regionp->mParcelOverlay->isBuildCameraAllowed(regionp->getPosRegionFromGlobal(camera_position_global)))
-// {
-// camera_position_global = last_position_global;
-//
-// isConstrained = TRUE;
-// }
- }
-
- // Don't let camera go underground
- F32 camera_min_off_ground = getCameraMinOffGround();
-
- camera_land_height = LLWorld::getInstance()->resolveLandHeightGlobal(camera_position_global);
-
- if (camera_position_global.mdV[VZ] < camera_land_height + camera_min_off_ground)
- {
- camera_position_global.mdV[VZ] = camera_land_height + camera_min_off_ground;
- isConstrained = TRUE;
- }
-
-
- if (hit_limit)
- {
- *hit_limit = isConstrained;
- }
-
- return camera_position_global;
-}
-
-
-LLVector3 LLAgent::getCameraOffsetInitial()
-{
- return mCameraOffsetInitial[mCameraPreset];
-}
-
-
-//-----------------------------------------------------------------------------
-// handleScrollWheel()
-//-----------------------------------------------------------------------------
-void LLAgent::handleScrollWheel(S32 clicks)
-{
- if ( mCameraMode == CAMERA_MODE_FOLLOW && gAgent.getFocusOnAvatar())
- {
- if ( ! mFollowCam.getPositionLocked() ) // not if the followCam position is locked in place
- {
- mFollowCam.zoom( clicks );
- if ( mFollowCam.isZoomedToMinimumDistance() )
- {
- changeCameraToMouselook(FALSE);
- }
- }
- }
- else
- {
- LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
- const F32 ROOT_ROOT_TWO = sqrt(F_SQRT2);
-
- // Block if camera is animating
- if (mCameraAnimating)
- {
- return;
- }
-
- if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD)
- {
- F32 zoom_factor = (F32)pow(0.8, -clicks);
- cameraZoomIn(zoom_factor);
- }
- else if (mFocusOnAvatar && mCameraMode == CAMERA_MODE_THIRD_PERSON)
- {
- F32 camera_offset_initial_mag = getCameraOffsetInitial().magVec();
-
- F32 current_zoom_fraction = mTargetCameraDistance / (camera_offset_initial_mag * gSavedSettings.getF32("CameraOffsetScale"));
- current_zoom_fraction *= 1.f - pow(ROOT_ROOT_TWO, clicks);
-
- cameraOrbitIn(current_zoom_fraction * camera_offset_initial_mag * gSavedSettings.getF32("CameraOffsetScale"));
- }
- else
- {
- F32 current_zoom_fraction = (F32)mCameraFocusOffsetTarget.magVec();
- cameraOrbitIn(current_zoom_fraction * (1.f - pow(ROOT_ROOT_TWO, clicks)));
- }
- }
-}
-
-
-//-----------------------------------------------------------------------------
-// getCameraMinOffGround()
-//-----------------------------------------------------------------------------
-F32 LLAgent::getCameraMinOffGround()
-{
- if (mCameraMode == CAMERA_MODE_MOUSELOOK)
- {
- return 0.f;
- }
- else
- {
- if (gSavedSettings.getBOOL("DisableCameraConstraints"))
- {
- return -1000.f;
- }
- else
- {
- return 0.5f;
- }
- }
-}
-
-
-//-----------------------------------------------------------------------------
-// resetCamera()
-//-----------------------------------------------------------------------------
-void LLAgent::resetCamera()
-{
- // Remove any pitch from the avatar
- LLVector3 at = mFrameAgent.getAtAxis();
- at.mV[VZ] = 0.f;
- at.normalize();
- gAgent.resetAxes(at);
- // have to explicitly clear field of view zoom now
- mCameraFOVZoomFactor = 0.f;
-
- updateCamera();
-}
-
-//-----------------------------------------------------------------------------
-// changeCameraToMouselook()
-//-----------------------------------------------------------------------------
-void LLAgent::changeCameraToMouselook(BOOL animate)
-{
- if (LLViewerJoystick::getInstance()->getOverrideCamera())
- {
- return;
- }
-
- // visibility changes at end of animation
- gViewerWindow->getWindow()->resetBusyCount();
-
- // unpause avatar animation
- mPauseRequest = NULL;
-
- LLToolMgr::getInstance()->setCurrentToolset(gMouselookToolset);
-
- if (mAvatarObject.notNull())
- {
- mAvatarObject->stopMotion( ANIM_AGENT_BODY_NOISE );
- mAvatarObject->stopMotion( ANIM_AGENT_BREATHE_ROT );
- }
-
- //gViewerWindow->stopGrab();
- LLSelectMgr::getInstance()->deselectAll();
- gViewerWindow->hideCursor();
- gViewerWindow->moveCursorToCenter();
-
- if( mCameraMode != CAMERA_MODE_MOUSELOOK )
- {
- gFocusMgr.setKeyboardFocus( NULL );
-
- mLastCameraMode = mCameraMode;
- mCameraMode = CAMERA_MODE_MOUSELOOK;
- U32 old_flags = mControlFlags;
- setControlFlags(AGENT_CONTROL_MOUSELOOK);
- if (old_flags != mControlFlags)
- {
- mbFlagsDirty = TRUE;
- }
-
- if (animate)
- {
- startCameraAnimation();
- }
- else
- {
- mCameraAnimating = FALSE;
- endAnimationUpdateUI();
- }
- }
-}
-
-
-//-----------------------------------------------------------------------------
-// changeCameraToDefault()
-//-----------------------------------------------------------------------------
-void LLAgent::changeCameraToDefault()
-{
- if (LLViewerJoystick::getInstance()->getOverrideCamera())
- {
- return;
- }
-
- if (LLFollowCamMgr::getActiveFollowCamParams())
- {
- changeCameraToFollow();
- }
- else
- {
- changeCameraToThirdPerson();
- }
-}
-
-
-// Ventrella
-//-----------------------------------------------------------------------------
-// changeCameraToFollow()
-//-----------------------------------------------------------------------------
-void LLAgent::changeCameraToFollow(BOOL animate)
-{
- if (LLViewerJoystick::getInstance()->getOverrideCamera())
- {
- return;
- }
-
- if( mCameraMode != CAMERA_MODE_FOLLOW )
- {
- if (mCameraMode == CAMERA_MODE_MOUSELOOK)
- {
- animate = FALSE;
- }
- startCameraAnimation();
-
- mLastCameraMode = mCameraMode;
- mCameraMode = CAMERA_MODE_FOLLOW;
-
- // bang-in the current focus, position, and up vector of the follow cam
- mFollowCam.reset( mCameraPositionAgent, LLViewerCamera::getInstance()->getPointOfInterest(), LLVector3::z_axis );
-
- if (gBasicToolset)
- {
- LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
- }
-
- if (mAvatarObject.notNull())
- {
- mAvatarObject->mPelvisp->setPosition(LLVector3::zero);
- mAvatarObject->startMotion( ANIM_AGENT_BODY_NOISE );
- mAvatarObject->startMotion( ANIM_AGENT_BREATHE_ROT );
- }
-
- // unpause avatar animation
- mPauseRequest = NULL;
-
- U32 old_flags = mControlFlags;
- clearControlFlags(AGENT_CONTROL_MOUSELOOK);
- if (old_flags != mControlFlags)
- {
- mbFlagsDirty = TRUE;
- }
-
- if (animate)
- {
- startCameraAnimation();
- }
- else
- {
- mCameraAnimating = FALSE;
- endAnimationUpdateUI();
- }
- }
-}
-
-//-----------------------------------------------------------------------------
-// changeCameraToThirdPerson()
-//-----------------------------------------------------------------------------
-void LLAgent::changeCameraToThirdPerson(BOOL animate)
-{
- if (LLViewerJoystick::getInstance()->getOverrideCamera())
- {
- return;
- }
-
- gViewerWindow->getWindow()->resetBusyCount();
-
- mCameraZoomFraction = INITIAL_ZOOM_FRACTION;
-
- if (mAvatarObject.notNull())
- {
- if (!mAvatarObject->isSitting())
- {
- mAvatarObject->mPelvisp->setPosition(LLVector3::zero);
- }
- mAvatarObject->startMotion( ANIM_AGENT_BODY_NOISE );
- mAvatarObject->startMotion( ANIM_AGENT_BREATHE_ROT );
- }
-
- LLVector3 at_axis;
-
- // unpause avatar animation
- mPauseRequest = NULL;
-
- if( mCameraMode != CAMERA_MODE_THIRD_PERSON )
- {
- if (gBasicToolset)
- {
- LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
- }
-
- mCameraLag.clearVec();
- if (mCameraMode == CAMERA_MODE_MOUSELOOK)
- {
- mCurrentCameraDistance = MIN_CAMERA_DISTANCE;
- mTargetCameraDistance = MIN_CAMERA_DISTANCE;
- animate = FALSE;
- }
- mLastCameraMode = mCameraMode;
- mCameraMode = CAMERA_MODE_THIRD_PERSON;
- U32 old_flags = mControlFlags;
- clearControlFlags(AGENT_CONTROL_MOUSELOOK);
- if (old_flags != mControlFlags)
- {
- mbFlagsDirty = TRUE;
- }
-
- }
-
- // Remove any pitch from the avatar
- if (mAvatarObject.notNull() && mAvatarObject->getParent())
- {
- LLQuaternion obj_rot = ((LLViewerObject*)mAvatarObject->getParent())->getRenderRotation();
- at_axis = LLViewerCamera::getInstance()->getAtAxis();
- at_axis.mV[VZ] = 0.f;
- at_axis.normalize();
- resetAxes(at_axis * ~obj_rot);
- }
- else
- {
- at_axis = mFrameAgent.getAtAxis();
- at_axis.mV[VZ] = 0.f;
- at_axis.normalize();
- resetAxes(at_axis);
- }
-
-
- if (animate)
- {
- startCameraAnimation();
- }
- else
- {
- mCameraAnimating = FALSE;
- endAnimationUpdateUI();
- }
-}
-
-//-----------------------------------------------------------------------------
-// changeCameraToCustomizeAvatar()
-//-----------------------------------------------------------------------------
-void LLAgent::changeCameraToCustomizeAvatar(BOOL avatar_animate, BOOL camera_animate)
-{
- if (LLViewerJoystick::getInstance()->getOverrideCamera())
- {
- return;
- }
-
- standUp(); // force stand up
- gViewerWindow->getWindow()->resetBusyCount();
-
- if (gFaceEditToolset)
- {
- LLToolMgr::getInstance()->setCurrentToolset(gFaceEditToolset);
- }
-
- if (camera_animate)
- {
- startCameraAnimation();
- }
-
- // Remove any pitch from the avatar
- //LLVector3 at = mFrameAgent.getAtAxis();
- //at.mV[VZ] = 0.f;
- //at.normalize();
- //gAgent.resetAxes(at);
-
- if( mCameraMode != CAMERA_MODE_CUSTOMIZE_AVATAR )
- {
- mLastCameraMode = mCameraMode;
- mCameraMode = CAMERA_MODE_CUSTOMIZE_AVATAR;
- U32 old_flags = mControlFlags;
- clearControlFlags(AGENT_CONTROL_MOUSELOOK);
- if (old_flags != mControlFlags)
- {
- mbFlagsDirty = TRUE;
- }
-
- gFocusMgr.setKeyboardFocus( NULL );
- gFocusMgr.setMouseCapture( NULL );
-
- LLVOAvatarSelf::onCustomizeStart();
- }
-
- if (mAvatarObject.notNull())
- {
- if(avatar_animate)
- {
- // Remove any pitch from the avatar
- LLVector3 at = mFrameAgent.getAtAxis();
- at.mV[VZ] = 0.f;
- at.normalize();
- gAgent.resetAxes(at);
-
- sendAnimationRequest(ANIM_AGENT_CUSTOMIZE, ANIM_REQUEST_START);
- mCustomAnim = TRUE ;
- mAvatarObject->startMotion(ANIM_AGENT_CUSTOMIZE);
- LLMotion* turn_motion = mAvatarObject->findMotion(ANIM_AGENT_CUSTOMIZE);
-
- if (turn_motion)
- {
- mAnimationDuration = turn_motion->getDuration() + CUSTOMIZE_AVATAR_CAMERA_ANIM_SLOP;
-
- }
- else
- {
- mAnimationDuration = gSavedSettings.getF32("ZoomTime");
- }
- }
-
-
-
- gAgent.setFocusGlobal(LLVector3d::zero);
- }
- else
- {
- mCameraAnimating = FALSE;
- endAnimationUpdateUI();
- }
-
-}
-
-
-void LLAgent::switchCameraPreset(ECameraPreset preset)
-{
- //zoom is supposed to be reset for the front and group views
- mCameraZoomFraction = 1.f;
-
- //focusing on avatar in that case means following him on movements
- mFocusOnAvatar = TRUE;
-
- mCameraPreset = preset;
-
- gSavedSettings.setU32("CameraPreset", mCameraPreset);
-}
-
-
-//
-// Focus point management
-//
-
-//-----------------------------------------------------------------------------
-// startCameraAnimation()
-//-----------------------------------------------------------------------------
-void LLAgent::startCameraAnimation()
-{
- mAnimationCameraStartGlobal = getCameraPositionGlobal();
- mAnimationFocusStartGlobal = mFocusGlobal;
- mAnimationTimer.reset();
- mCameraAnimating = TRUE;
- mAnimationDuration = gSavedSettings.getF32("ZoomTime");
-}
-
-//-----------------------------------------------------------------------------
-// stopCameraAnimation()
-//-----------------------------------------------------------------------------
-void LLAgent::stopCameraAnimation()
-{
- mCameraAnimating = FALSE;
-}
-
-void LLAgent::clearFocusObject()
-{
- if (mFocusObject.notNull())
- {
- startCameraAnimation();
-
- setFocusObject(NULL);
- mFocusObjectOffset.clearVec();
- }
-}
-
-void LLAgent::setFocusObject(LLViewerObject* object)
-{
- mFocusObject = object;
-}
-
-// Focus on a point, but try to keep camera position stable.
-//-----------------------------------------------------------------------------
-// setFocusGlobal()
-//-----------------------------------------------------------------------------
-void LLAgent::setFocusGlobal(const LLPickInfo& pick)
-{
- LLViewerObject* objectp = gObjectList.findObject(pick.mObjectID);
-
- if (objectp)
- {
- // focus on object plus designated offset
- // which may or may not be same as pick.mPosGlobal
- setFocusGlobal(objectp->getPositionGlobal() + LLVector3d(pick.mObjectOffset), pick.mObjectID);
- }
- else
- {
- // focus directly on point where user clicked
- setFocusGlobal(pick.mPosGlobal, pick.mObjectID);
- }
-}
-
-
-void LLAgent::setFocusGlobal(const LLVector3d& focus, const LLUUID &object_id)
-{
- setFocusObject(gObjectList.findObject(object_id));
- LLVector3d old_focus = mFocusTargetGlobal;
- LLViewerObject *focus_obj = mFocusObject;
-
- // if focus has changed
- if (old_focus != focus)
- {
- if (focus.isExactlyZero())
- {
- if (mAvatarObject.notNull())
- {
- mFocusTargetGlobal = getPosGlobalFromAgent(mAvatarObject->mHeadp->getWorldPosition());
- }
- else
- {
- mFocusTargetGlobal = getPositionGlobal();
- }
- mCameraFocusOffsetTarget = getCameraPositionGlobal() - mFocusTargetGlobal;
- mCameraFocusOffset = mCameraFocusOffsetTarget;
- setLookAt(LOOKAT_TARGET_CLEAR);
- }
- else
- {
- mFocusTargetGlobal = focus;
- if (!focus_obj)
- {
- mCameraFOVZoomFactor = 0.f;
- }
-
- mCameraFocusOffsetTarget = gAgent.getPosGlobalFromAgent(mCameraVirtualPositionAgent) - mFocusTargetGlobal;
-
- startCameraAnimation();
-
- if (focus_obj)
- {
- if (focus_obj->isAvatar())
- {
- setLookAt(LOOKAT_TARGET_FOCUS, focus_obj);
- }
- else
- {
- setLookAt(LOOKAT_TARGET_FOCUS, focus_obj, (getPosAgentFromGlobal(focus) - focus_obj->getRenderPosition()) * ~focus_obj->getRenderRotation());
- }
- }
- else
- {
- setLookAt(LOOKAT_TARGET_FOCUS, NULL, getPosAgentFromGlobal(mFocusTargetGlobal));
- }
- }
- }
- else // focus == mFocusTargetGlobal
- {
- if (focus.isExactlyZero())
- {
- if (mAvatarObject.notNull())
- {
- mFocusTargetGlobal = getPosGlobalFromAgent(mAvatarObject->mHeadp->getWorldPosition());
- }
- else
- {
- mFocusTargetGlobal = getPositionGlobal();
- }
- }
- mCameraFocusOffsetTarget = (getCameraPositionGlobal() - mFocusTargetGlobal) / (1.f + mCameraFOVZoomFactor);;
- mCameraFocusOffset = mCameraFocusOffsetTarget;
- }
-
- if (mFocusObject.notNull())
- {
- // for attachments, make offset relative to avatar, not the attachment
- if (mFocusObject->isAttachment())
- {
- while (mFocusObject.notNull() // DEV-29123 - can crash with a messed-up attachment
- && !mFocusObject->isAvatar())
- {
- mFocusObject = (LLViewerObject*) mFocusObject->getParent();
- }
- setFocusObject((LLViewerObject*)mFocusObject);
- }
- updateFocusOffset();
- }
-}
-
-// Used for avatar customization
-//-----------------------------------------------------------------------------
-// setCameraPosAndFocusGlobal()
-//-----------------------------------------------------------------------------
-void LLAgent::setCameraPosAndFocusGlobal(const LLVector3d& camera_pos, const LLVector3d& focus, const LLUUID &object_id)
-{
- LLVector3d old_focus = mFocusTargetGlobal;
-
- F64 focus_delta_squared = (old_focus - focus).magVecSquared();
- const F64 ANIM_EPSILON_SQUARED = 0.0001;
- if( focus_delta_squared > ANIM_EPSILON_SQUARED )
- {
- startCameraAnimation();
-
- if( CAMERA_MODE_CUSTOMIZE_AVATAR == mCameraMode )
- {
- // Compensate for the fact that the camera has already been offset to make room for LLFloaterCustomize.
- mAnimationCameraStartGlobal -= LLVector3d(LLViewerCamera::getInstance()->getLeftAxis() * calcCustomizeAvatarUIOffset( mAnimationCameraStartGlobal ));
- }
- }
-
- //LLViewerCamera::getInstance()->setOrigin( gAgent.getPosAgentFromGlobal( camera_pos ) );
- setFocusObject(gObjectList.findObject(object_id));
- mFocusTargetGlobal = focus;
- mCameraFocusOffsetTarget = camera_pos - focus;
- mCameraFocusOffset = mCameraFocusOffsetTarget;
-
- if (mFocusObject)
- {
- if (mFocusObject->isAvatar())
- {
- setLookAt(LOOKAT_TARGET_FOCUS, mFocusObject);
- }
- else
- {
- setLookAt(LOOKAT_TARGET_FOCUS, mFocusObject, (getPosAgentFromGlobal(focus) - mFocusObject->getRenderPosition()) * ~mFocusObject->getRenderRotation());
- }
- }
- else
- {
- setLookAt(LOOKAT_TARGET_FOCUS, NULL, getPosAgentFromGlobal(mFocusTargetGlobal));
- }
-
- if( mCameraAnimating )
- {
- const F64 ANIM_METERS_PER_SECOND = 10.0;
- const F64 MIN_ANIM_SECONDS = 0.5;
- F64 anim_duration = llmax( MIN_ANIM_SECONDS, sqrt(focus_delta_squared) / ANIM_METERS_PER_SECOND );
- setAnimationDuration( (F32)anim_duration );
- }
-
- updateFocusOffset();
-}
-
-//-----------------------------------------------------------------------------
-// setSitCamera()
-//-----------------------------------------------------------------------------
-void LLAgent::setSitCamera(const LLUUID &object_id, const LLVector3 &camera_pos, const LLVector3 &camera_focus)
-{
- BOOL camera_enabled = !object_id.isNull();
-
- if (camera_enabled)
- {
- LLViewerObject *reference_object = gObjectList.findObject(object_id);
- if (reference_object)
- {
- //convert to root object relative?
- mSitCameraPos = camera_pos;
- mSitCameraFocus = camera_focus;
- mSitCameraReferenceObject = reference_object;
- mSitCameraEnabled = TRUE;
- }
- }
- else
- {
- mSitCameraPos.clearVec();
- mSitCameraFocus.clearVec();
- mSitCameraReferenceObject = NULL;
- mSitCameraEnabled = FALSE;
- }
-}
-
-//-----------------------------------------------------------------------------
-// setFocusOnAvatar()
-//-----------------------------------------------------------------------------
-void LLAgent::setFocusOnAvatar(BOOL focus_on_avatar, BOOL animate)
-{
- if (focus_on_avatar != mFocusOnAvatar)
- {
- if (animate)
- {
- startCameraAnimation();
- }
- else
- {
- stopCameraAnimation();
- }
- }
-
- //RN: when focused on the avatar, we're not "looking" at it
- // looking implies intent while focusing on avatar means
- // you're just walking around with a camera on you...eesh.
- if (!mFocusOnAvatar && focus_on_avatar)
- {
- setFocusGlobal(LLVector3d::zero);
- mCameraFOVZoomFactor = 0.f;
- if (mCameraMode == CAMERA_MODE_THIRD_PERSON)
- {
- LLVector3 at_axis;
- if (mAvatarObject.notNull() && mAvatarObject->getParent())
- {
- LLQuaternion obj_rot = ((LLViewerObject*)mAvatarObject->getParent())->getRenderRotation();
- at_axis = LLViewerCamera::getInstance()->getAtAxis();
- at_axis.mV[VZ] = 0.f;
- at_axis.normalize();
- resetAxes(at_axis * ~obj_rot);
- }
- else
- {
- at_axis = LLViewerCamera::getInstance()->getAtAxis();
- at_axis.mV[VZ] = 0.f;
- at_axis.normalize();
- resetAxes(at_axis);
- }
- }
- }
- // unlocking camera from avatar
- else if (mFocusOnAvatar && !focus_on_avatar)
- {
- // keep camera focus point consistent, even though it is now unlocked
- setFocusGlobal(getPositionGlobal() + calcThirdPersonFocusOffset(), gAgent.getID());
- }
-
- mFocusOnAvatar = focus_on_avatar;
+ gAgentCamera.updateLastCamera();
}
//-----------------------------------------------------------------------------
@@ -4586,90 +1912,13 @@ void LLAgent::heardChat(const LLUUID& id)
if (ll_rand(2) == 0)
{
LLViewerObject *chatter = gObjectList.findObject(mLastChatterID);
- setLookAt(LOOKAT_TARGET_AUTO_LISTEN, chatter, LLVector3::zero);
+ gAgentCamera.setLookAt(LOOKAT_TARGET_AUTO_LISTEN, chatter, LLVector3::zero);
}
mLastChatterID = id;
mChatTimer.reset();
}
-//-----------------------------------------------------------------------------
-// lookAtLastChat()
-//-----------------------------------------------------------------------------
-void LLAgent::lookAtLastChat()
-{
- // Block if camera is animating or not in normal third person camera mode
- if (mCameraAnimating || !cameraThirdPerson())
- {
- return;
- }
-
- LLViewerObject *chatter = gObjectList.findObject(mLastChatterID);
- if (chatter)
- {
- LLVector3 delta_pos;
- if (chatter->isAvatar())
- {
- LLVOAvatar *chatter_av = (LLVOAvatar*)chatter;
- if (mAvatarObject.notNull() && chatter_av->mHeadp)
- {
- delta_pos = chatter_av->mHeadp->getWorldPosition() - mAvatarObject->mHeadp->getWorldPosition();
- }
- else
- {
- delta_pos = chatter->getPositionAgent() - getPositionAgent();
- }
- delta_pos.normalize();
-
- setControlFlags(AGENT_CONTROL_STOP);
-
- changeCameraToThirdPerson();
-
- LLVector3 new_camera_pos = mAvatarObject->mHeadp->getWorldPosition();
- LLVector3 left = delta_pos % LLVector3::z_axis;
- left.normalize();
- LLVector3 up = left % delta_pos;
- up.normalize();
- new_camera_pos -= delta_pos * 0.4f;
- new_camera_pos += left * 0.3f;
- new_camera_pos += up * 0.2f;
- if (chatter_av->mHeadp)
- {
- setFocusGlobal(getPosGlobalFromAgent(chatter_av->mHeadp->getWorldPosition()), mLastChatterID);
- mCameraFocusOffsetTarget = getPosGlobalFromAgent(new_camera_pos) - gAgent.getPosGlobalFromAgent(chatter_av->mHeadp->getWorldPosition());
- }
- else
- {
- setFocusGlobal(chatter->getPositionGlobal(), mLastChatterID);
- mCameraFocusOffsetTarget = getPosGlobalFromAgent(new_camera_pos) - chatter->getPositionGlobal();
- }
- setFocusOnAvatar(FALSE, TRUE);
- }
- else
- {
- delta_pos = chatter->getRenderPosition() - getPositionAgent();
- delta_pos.normalize();
-
- setControlFlags(AGENT_CONTROL_STOP);
-
- changeCameraToThirdPerson();
-
- LLVector3 new_camera_pos = mAvatarObject->mHeadp->getWorldPosition();
- LLVector3 left = delta_pos % LLVector3::z_axis;
- left.normalize();
- LLVector3 up = left % delta_pos;
- up.normalize();
- new_camera_pos -= delta_pos * 0.4f;
- new_camera_pos += left * 0.3f;
- new_camera_pos += up * 0.2f;
-
- setFocusGlobal(chatter->getPositionGlobal(), mLastChatterID);
- mCameraFocusOffsetTarget = getPosGlobalFromAgent(new_camera_pos) - chatter->getPositionGlobal();
- setFocusOnAvatar(FALSE, TRUE);
- }
- }
-}
-
const F32 SIT_POINT_EXTENTS = 0.2f;
LLSD ll_sdmap_from_vector3(const LLVector3& vec)
@@ -4714,10 +1963,10 @@ void LLAgent::setStartPosition( U32 location_id )
LLVector3 agent_pos = getPositionAgent();
- if (mAvatarObject.notNull())
+ if (isAgentAvatarValid())
{
// the z height is at the agent's feet
- agent_pos.mV[VZ] -= 0.5f * mAvatarObject->mBodySize.mV[VZ];
+ agent_pos.mV[VZ] -= 0.5f * gAgentAvatarp->mBodySize.mV[VZ];
}
agent_pos.mV[VX] = llclamp( agent_pos.mV[VX], INSET, REGION_WIDTH - INSET );
@@ -4824,7 +2073,7 @@ void LLAgent::onAnimStop(const LLUUID& id)
setControlFlags(AGENT_CONTROL_FINISH_ANIM);
// now trigger dusting self off animation
- if (mAvatarObject.notNull() && !mAvatarObject->mBelowWater && rand() % 3 == 0)
+ if (isAgentAvatarValid() && !gAgentAvatarp->mBelowWater && rand() % 3 == 0)
sendAnimationRequest( ANIM_AGENT_BRUSH, ANIM_REQUEST_START );
}
else if (id == ANIM_AGENT_PRE_JUMP || id == ANIM_AGENT_LAND || id == ANIM_AGENT_MEDIUM_LAND)
@@ -4833,11 +2082,16 @@ void LLAgent::onAnimStop(const LLUUID& id)
}
}
-BOOL LLAgent::isGodlike() const
+bool LLAgent::isGodlike() const
{
return mAgentAccess.isGodlike();
}
+bool LLAgent::isGodlikeWithoutAdminMenuFakery() const
+{
+ return mAgentAccess.isGodlikeWithoutAdminMenuFakery();
+}
+
U8 LLAgent::getGodLevel() const
{
return mAgentAccess.getGodLevel();
@@ -5018,15 +2272,15 @@ void LLAgent::buildFullnameAndTitle(std::string& name) const
name.erase(0, name.length());
}
- if (mAvatarObject.notNull())
+ if (isAgentAvatarValid())
{
- name += mAvatarObject->getFullname();
+ name += gAgentAvatarp->getFullname();
}
}
-BOOL LLAgent::isInGroup(const LLUUID& group_id) const
+BOOL LLAgent::isInGroup(const LLUUID& group_id, BOOL ignore_god_mode /* FALSE */) const
{
- if (isGodlike())
+ if (!ignore_god_mode && isGodlike())
return true;
S32 count = mGroups.count();
@@ -5166,14 +2420,14 @@ BOOL LLAgent::canJoinGroups() const
LLQuaternion LLAgent::getHeadRotation()
{
- if (mAvatarObject.isNull() || !mAvatarObject->mPelvisp || !mAvatarObject->mHeadp)
+ if (!isAgentAvatarValid() || !gAgentAvatarp->mPelvisp || !gAgentAvatarp->mHeadp)
{
return LLQuaternion::DEFAULT;
}
- if (!gAgent.cameraMouselook())
+ if (!gAgentCamera.cameraMouselook())
{
- return mAvatarObject->getRotation();
+ return gAgentAvatarp->getRotation();
}
// We must be in mouselook
@@ -5182,9 +2436,9 @@ LLQuaternion LLAgent::getHeadRotation()
LLVector3 left = up % look_dir;
LLQuaternion rot(look_dir, left, up);
- if (mAvatarObject->getParent())
+ if (gAgentAvatarp->getParent())
{
- rot = rot * ~mAvatarObject->getParent()->getRotation();
+ rot = rot * ~gAgentAvatarp->getParent()->getRotation();
}
return rot;
@@ -5342,10 +2596,11 @@ void LLAgent::initOriginGlobal(const LLVector3d &origin_global)
BOOL LLAgent::leftButtonGrabbed() const
{
- return (!cameraMouselook() && mControlsTakenCount[CONTROL_LBUTTON_DOWN_INDEX] > 0)
- || (cameraMouselook() && mControlsTakenCount[CONTROL_ML_LBUTTON_DOWN_INDEX] > 0)
- || (!cameraMouselook() && mControlsTakenPassedOnCount[CONTROL_LBUTTON_DOWN_INDEX] > 0)
- || (cameraMouselook() && mControlsTakenPassedOnCount[CONTROL_ML_LBUTTON_DOWN_INDEX] > 0);
+ const BOOL camera_mouse_look = gAgentCamera.cameraMouselook();
+ return (!camera_mouse_look && mControlsTakenCount[CONTROL_LBUTTON_DOWN_INDEX] > 0)
+ || (camera_mouse_look && mControlsTakenCount[CONTROL_ML_LBUTTON_DOWN_INDEX] > 0)
+ || (!camera_mouse_look && mControlsTakenPassedOnCount[CONTROL_LBUTTON_DOWN_INDEX] > 0)
+ || (camera_mouse_look && mControlsTakenPassedOnCount[CONTROL_ML_LBUTTON_DOWN_INDEX] > 0);
}
BOOL LLAgent::rotateGrabbed() const
@@ -5806,14 +3061,13 @@ void LLAgent::processAgentCachedTextureResponse(LLMessageSystem *mesgsys, void *
{
gAgentQueryManager.mNumPendingQueries--;
- LLVOAvatarSelf* avatarp = gAgent.getAvatarObject();
- if (!avatarp || avatarp->isDead())
+ if (!isAgentAvatarValid() || gAgentAvatarp->isDead())
{
llwarns << "No avatar for user in cached texture update!" << llendl;
return;
}
- if (gAgent.cameraCustomizeAvatar())
+ if (gAgentCamera.cameraCustomizeAvatar())
{
// ignore baked textures when in customize mode
return;
@@ -5834,26 +3088,42 @@ void LLAgent::processAgentCachedTextureResponse(LLMessageSystem *mesgsys, void *
mesgsys->getUUIDFast(_PREHASH_WearableData, _PREHASH_TextureID, texture_id, texture_block);
mesgsys->getU8Fast(_PREHASH_WearableData, _PREHASH_TextureIndex, texture_index, texture_block);
- if (texture_id.notNull()
- && (S32)texture_index < BAKED_NUM_INDICES
- && gAgentQueryManager.mActiveCacheQueries[texture_index] == query_id)
- {
- //llinfos << "Received cached texture " << (U32)texture_index << ": " << texture_id << llendl;
- avatarp->setCachedBakedTexture(LLVOAvatarDictionary::bakedToLocalTextureIndex((EBakedTextureIndex)texture_index), texture_id);
- //avatarp->setTETexture( LLVOAvatar::sBakedTextureIndices[texture_index], texture_id );
- gAgentQueryManager.mActiveCacheQueries[texture_index] = 0;
- num_results++;
+
+ if ((S32)texture_index < TEX_NUM_INDICES )
+ {
+ const LLVOAvatarDictionary::TextureEntry *texture_entry = LLVOAvatarDictionary::instance().getTexture((ETextureIndex)texture_index);
+ if (texture_entry)
+ {
+ EBakedTextureIndex baked_index = texture_entry->mBakedTextureIndex;
+
+ if (gAgentQueryManager.mActiveCacheQueries[baked_index] == query_id)
+ {
+ if (texture_id.notNull())
+ {
+ //llinfos << "Received cached texture " << (U32)texture_index << ": " << texture_id << llendl;
+ gAgentAvatarp->setCachedBakedTexture((ETextureIndex)texture_index, texture_id);
+ //gAgentAvatarp->setTETexture( LLVOAvatar::sBakedTextureIndices[texture_index], texture_id );
+ gAgentQueryManager.mActiveCacheQueries[baked_index] = 0;
+ num_results++;
+ }
+ else
+ {
+ // no cache of this bake. request upload.
+ gAgentAvatarp->requestLayerSetUpload(baked_index);
+ }
+ }
+ }
}
}
llinfos << "Received cached texture response for " << num_results << " textures." << llendl;
- avatarp->updateMeshTextures();
+ gAgentAvatarp->updateMeshTextures();
if (gAgentQueryManager.mNumPendingQueries == 0)
{
// RN: not sure why composites are disabled at this point
- avatarp->setCompositeUpdatesEnabled(TRUE);
+ gAgentAvatarp->setCompositeUpdatesEnabled(TRUE);
gAgent.sendAgentSetAppearance();
}
}
@@ -5906,11 +3176,10 @@ BOOL LLAgent::getHomePosGlobal( LLVector3d* pos_global )
void LLAgent::clearVisualParams(void *data)
{
- LLVOAvatar* avatarp = gAgent.getAvatarObject();
- if (avatarp)
+ if (isAgentAvatarValid())
{
- avatarp->clearVisualParamWeights();
- avatarp->updateVisualParams();
+ gAgentAvatarp->clearVisualParamWeights();
+ gAgentAvatarp->updateVisualParams();
}
}
@@ -5934,16 +3203,15 @@ bool LLAgent::teleportCore(bool is_local)
// sync with other viewers. Discuss in DEV-14145/VWR-6744 before reenabling.
// Stop all animation before actual teleporting
- LLVOAvatar* avatarp = gAgent.getAvatarObject();
- if (avatarp)
+ if (isAgentAvatarValid())
{
- for ( LLVOAvatar::AnimIterator anim_it= avatarp->mPlayingAnimations.begin();
- anim_it != avatarp->mPlayingAnimations.end();
+ for ( LLVOAvatar::AnimIterator anim_it= gAgentAvatarp->mPlayingAnimations.begin();
+ anim_it != gAgentAvatarp->mPlayingAnimations.end();
++anim_it)
{
- avatarp->stopMotion(anim_it->first);
+ gAgentAvatarp->stopMotion(anim_it->first);
}
- avatarp->processAnimationStateChanges();
+ gAgentAvatarp->processAnimationStateChanges();
}
#endif
@@ -5951,9 +3219,9 @@ bool LLAgent::teleportCore(bool is_local)
// yet if the teleport will succeed. Look in
// process_teleport_location_reply
- // close the map and find panels so we can see our destination
+ // close the map panel so we can see our destination.
+ // we don't close search floater, see EXT-5840.
LLFloaterReg::hideInstance("world_map");
- LLFloaterReg::hideInstance("search");
// hide land floater too - it'll be out of date
LLFloaterReg::hideInstance("about_land");
@@ -5963,7 +3231,7 @@ bool LLAgent::teleportCore(bool is_local)
// Close all pie menus, deselect land, etc.
// Don't change the camera until we know teleport succeeded. JC
- resetView(FALSE);
+ gAgentCamera.resetView(FALSE);
// local logic
LLViewerStats::getInstance()->incStat(LLViewerStats::ST_TELEPORT_COUNT);
@@ -5979,7 +3247,7 @@ bool LLAgent::teleportCore(bool is_local)
// MBW -- Let the voice client know a teleport has begun so it can leave the existing channel.
// This was breaking the case of teleporting within a single sim. Backing it out for now.
-// gVoiceClient->leaveChannel();
+// LLVoiceClient::getInstance()->leaveChannel();
return true;
}
@@ -6123,7 +3391,7 @@ void LLAgent::setTeleportState(ETeleportState state)
if (mTeleportState == TELEPORT_MOVING)
{
// We're outa here. Save "back" slurl.
- mTeleportSourceSLURL = LLAgentUI::buildSLURL();
+ LLAgentUI::buildSLURL(mTeleportSourceSLURL);
}
else if(mTeleportState == TELEPORT_ARRIVING)
{
@@ -6136,13 +3404,11 @@ void LLAgent::stopCurrentAnimations()
{
// This function stops all current overriding animations on this
// avatar, propagating this change back to the server.
-
- LLVOAvatar* avatarp = gAgent.getAvatarObject();
- if (avatarp)
+ if (isAgentAvatarValid())
{
for ( LLVOAvatar::AnimIterator anim_it =
- avatarp->mPlayingAnimations.begin();
- anim_it != avatarp->mPlayingAnimations.end();
+ gAgentAvatarp->mPlayingAnimations.begin();
+ anim_it != gAgentAvatarp->mPlayingAnimations.end();
anim_it++)
{
if (anim_it->first ==
@@ -6155,7 +3421,7 @@ void LLAgent::stopCurrentAnimations()
else
{
// stop this animation locally
- avatarp->stopMotion(anim_it->first, TRUE);
+ gAgentAvatarp->stopMotion(anim_it->first, TRUE);
// ...and tell the server to tell everyone.
sendAnimationRequest(anim_it->first, ANIM_REQUEST_STOP);
}
@@ -6262,15 +3528,14 @@ void LLAgent::requestLeaveGodMode()
//-----------------------------------------------------------------------------
void LLAgent::sendAgentSetAppearance()
{
- if (mAvatarObject.isNull()) return;
+ if (!isAgentAvatarValid()) return;
- if (gAgentQueryManager.mNumPendingQueries > 0 && !gAgent.cameraCustomizeAvatar())
+ if (gAgentQueryManager.mNumPendingQueries > 0 && !gAgentCamera.cameraCustomizeAvatar())
{
return;
}
-
- llinfos << "TAT: Sent AgentSetAppearance: " << mAvatarObject->getBakedStatusForPrintout() << llendl;
+ llinfos << "TAT: Sent AgentSetAppearance: " << gAgentAvatarp->getBakedStatusForPrintout() << llendl;
//dumpAvatarTEs( "sendAgentSetAppearance()" );
LLMessageSystem* msg = gMessageSystem;
@@ -6284,7 +3549,7 @@ void LLAgent::sendAgentSetAppearance()
// NOTE -- when we start correcting all of the other Havok geometry
// to compensate for the COLLISION_TOLERANCE ugliness we will have
// to tweak this number again
- const LLVector3 body_size = mAvatarObject->mBodySize;
+ const LLVector3 body_size = gAgentAvatarp->mBodySize;
msg->addVector3Fast(_PREHASH_Size, body_size);
// To guard against out of order packets
@@ -6294,20 +3559,20 @@ void LLAgent::sendAgentSetAppearance()
// is texture data current relative to wearables?
// KLW - TAT this will probably need to check the local queue.
- BOOL textures_current = mAvatarObject->areTexturesCurrent();
+ BOOL textures_current = gAgentAvatarp->areTexturesCurrent();
for(U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++ )
{
const ETextureIndex texture_index = LLVOAvatarDictionary::bakedToLocalTextureIndex((EBakedTextureIndex)baked_index);
// if we're not wearing a skirt, we don't need the texture to be baked
- if (texture_index == TEX_SKIRT_BAKED && !mAvatarObject->isWearingWearableType(WT_SKIRT))
+ if (texture_index == TEX_SKIRT_BAKED && !gAgentAvatarp->isWearingWearableType(LLWearableType::WT_SKIRT))
{
continue;
}
// IMG_DEFAULT_AVATAR means not baked. 0 index should be ignored for baked textures
- if (!mAvatarObject->isTextureDefined(texture_index, 0))
+ if (!gAgentAvatarp->isTextureDefined(texture_index, 0))
{
textures_current = FALSE;
break;
@@ -6320,32 +3585,24 @@ void LLAgent::sendAgentSetAppearance()
llinfos << "TAT: Sending cached texture data" << llendl;
for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++)
{
- const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index);
- LLUUID hash;
- for (U8 i=0; i < baked_dict->mWearables.size(); i++)
+ BOOL generate_valid_hash = TRUE;
+ if (isAgentAvatarValid() && !gAgentAvatarp->isBakedTextureFinal((LLVOAvatarDefines::EBakedTextureIndex)baked_index))
{
- // EWearableType wearable_type = gBakedWearableMap[baked_index][wearable_num];
- const EWearableType wearable_type = baked_dict->mWearables[i];
- // MULTI-WEARABLE: fixed to 0th - extend to everything once messaging works.
- const LLWearable* wearable = gAgentWearables.getWearable(wearable_type,0);
- if (wearable)
- {
- hash ^= wearable->getAssetID();
- }
+ generate_valid_hash = FALSE;
+ llinfos << "Not caching baked texture upload for " << (U32)baked_index << " due to being uploaded at low resolution." << llendl;
}
+
+ const LLUUID hash = gAgentWearables.computeBakedTextureHash((EBakedTextureIndex) baked_index, generate_valid_hash);
if (hash.notNull())
{
- hash ^= baked_dict->mWearablesHashID;
+ ETextureIndex texture_index = LLVOAvatarDictionary::bakedToLocalTextureIndex((EBakedTextureIndex) baked_index);
+ msg->nextBlockFast(_PREHASH_WearableData);
+ msg->addUUIDFast(_PREHASH_CacheID, hash);
+ msg->addU8Fast(_PREHASH_TextureIndex, (U8)texture_index);
}
-
- const ETextureIndex texture_index = LLVOAvatarDictionary::bakedToLocalTextureIndex((EBakedTextureIndex)baked_index);
-
- msg->nextBlockFast(_PREHASH_WearableData);
- msg->addUUIDFast(_PREHASH_CacheID, hash);
- msg->addU8Fast(_PREHASH_TextureIndex, (U8)texture_index);
}
msg->nextBlockFast(_PREHASH_ObjectData);
- mAvatarObject->sendAppearanceMessage( gMessageSystem );
+ gAgentAvatarp->sendAppearanceMessage( gMessageSystem );
}
else
{
@@ -6358,9 +3615,9 @@ void LLAgent::sendAgentSetAppearance()
S32 transmitted_params = 0;
- for (LLViewerVisualParam* param = (LLViewerVisualParam*)mAvatarObject->getFirstVisualParam();
+ for (LLViewerVisualParam* param = (LLViewerVisualParam*)gAgentAvatarp->getFirstVisualParam();
param;
- param = (LLViewerVisualParam*)mAvatarObject->getNextVisualParam())
+ param = (LLViewerVisualParam*)gAgentAvatarp->getNextVisualParam())
{
if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE)
{
@@ -6482,7 +3739,39 @@ void LLAgent::dumpGroupInfo()
//llinfos << "insig " << gAgent.mGroupInsigniaID << llendl;
}
+// Draw a representation of current autopilot target
+void LLAgent::renderAutoPilotTarget()
+{
+ if (mAutoPilot)
+ {
+ F32 height_meters;
+ LLVector3d target_global;
+
+ glMatrixMode(GL_MODELVIEW);
+ gGL.pushMatrix();
+
+ // not textured
+ gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
+
+ // lovely green
+ glColor4f(0.f, 1.f, 1.f, 1.f);
+
+ target_global = mAutoPilotTargetGlobal;
+
+ gGL.translatef((F32)(target_global.mdV[VX]), (F32)(target_global.mdV[VY]), (F32)(target_global.mdV[VZ]));
+
+ height_meters = 1.f;
+
+ glScalef(height_meters, height_meters, height_meters);
+
+ gSphere.render(1500.f);
+
+ gGL.popMatrix();
+ }
+}
+
/********************************************************************************/
+
LLAgentQueryManager gAgentQueryManager;
LLAgentQueryManager::LLAgentQueryManager() :
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index beede7fbe3..32f9b00135 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -39,19 +39,16 @@
#include "llagentconstants.h"
#include "llagentdata.h" // gAgentID, gAgentSessionID
#include "llcharacter.h" // LLAnimPauseRequest
-#include "llfollowcam.h" // Ventrella
-#include "llhudeffectlookat.h" // EPointAtType
-#include "llhudeffectpointat.h" // ELookAtType
#include "llpointer.h"
#include "lluicolor.h"
#include "llvoavatardefines.h"
+#include "llslurl.h"
extern const BOOL ANIMATE;
extern const U8 AGENT_STATE_TYPING; // Typing indication
extern const U8 AGENT_STATE_EDITING; // Set when agent has objects selected
class LLChat;
-class LLVOAvatarSelf;
class LLViewerRegion;
class LLMotion;
class LLToolset;
@@ -66,26 +63,6 @@ class LLAgentDropGroupViewerNode;
//--------------------------------------------------------------------
// Types
//--------------------------------------------------------------------
-enum ECameraMode
-{
- CAMERA_MODE_THIRD_PERSON,
- CAMERA_MODE_MOUSELOOK,
- CAMERA_MODE_CUSTOMIZE_AVATAR,
- CAMERA_MODE_FOLLOW
-};
-
-/** Camera Presets for CAMERA_MODE_THIRD_PERSON */
-enum ECameraPreset
-{
- /** Default preset, what the Third Person Mode actually was */
- CAMERA_PRESET_REAR_VIEW,
-
- /** "Looking at the Avatar from the front" */
- CAMERA_PRESET_FRONT_VIEW,
-
- /** "Above and to the left, over the shoulder, pulled back a little on the zoom" */
- CAMERA_PRESET_GROUP_VIEW
-};
enum EAnimRequest
{
@@ -129,7 +106,6 @@ public:
virtual ~LLAgent();
void init();
void cleanup();
- void setAvatarObject(LLVOAvatarSelf *avatar);
//--------------------------------------------------------------------
// Login
@@ -139,11 +115,12 @@ public:
void setFirstLogin(BOOL b) { mFirstLogin = b; }
// Return TRUE if the database reported this login as the first for this particular user.
BOOL isFirstLogin() const { return mFirstLogin; }
+ BOOL isInitialized() const { return mInitialized; }
public:
- BOOL mInitialized;
- BOOL mFirstLogin;
std::string mMOTD; // Message of the day
private:
+ BOOL mInitialized;
+ BOOL mFirstLogin;
boost::shared_ptr<LLAgentListener> mListener;
//--------------------------------------------------------------------
@@ -192,20 +169,6 @@ private:
/********************************************************************************
** **
- ** GENERAL ACCESSORS
- **/
-
-public:
- LLVOAvatarSelf* getAvatarObject() const { return mAvatarObject; }
-private:
- LLPointer<LLVOAvatarSelf> mAvatarObject; // NULL until avatar object sent down from simulator
-
-/** General Accessors
- ** **
- *******************************************************************************/
-
-/********************************************************************************
- ** **
** POSITION
**/
@@ -236,7 +199,7 @@ public:
// Coordinate System
//--------------------------------------------------------------------
public:
- LLCoordFrame getFrameAgent() const { return mFrameAgent; }
+ const LLCoordFrame& getFrameAgent() const { return mFrameAgent; }
void initOriginGlobal(const LLVector3d &origin_global); // Only to be used in ONE place
void resetAxes();
void resetAxes(const LLVector3 &look_at); // Makes reasonable left and up
@@ -279,6 +242,10 @@ private:
public:
S32 getRegionsVisited() const;
F64 getDistanceTraveled() const;
+ void setDistanceTraveled(F64 dist) { mDistanceTraveled = dist; }
+
+ const LLVector3d &getLastPositionGlobal() const { return mLastPositionGlobal; }
+ void setLastPositionGlobal(const LLVector3d &pos) { mLastPositionGlobal = pos; }
private:
std::set<U64> mRegionsVisited; // Stat - what distinct regions has the avatar been to?
F64 mDistanceTraveled; // Stat - how far has the avatar moved?
@@ -321,7 +288,6 @@ public:
//--------------------------------------------------------------------
public:
void heardChat(const LLUUID& id);
- void lookAtLastChat();
F32 getTypingTime() { return mTypingTimer.getElapsedTimeF32(); }
LLUUID getLastChatter() const { return mLastChatterID; }
F32 getNearChatRadius() { return mNearChatRadius; }
@@ -430,6 +396,8 @@ public:
// Send message to simulator to force grabbed controls to be
// released, in case of a poorly written script.
void forceReleaseControls();
+ void setFlagsDirty() { mbFlagsDirty = TRUE; }
+
private:
S32 mControlsTakenCount[TOTAL_CONTROLS];
S32 mControlsTakenPassedOnCount[TOTAL_CONTROLS];
@@ -447,9 +415,11 @@ public:
void sendAnimationRequests(LLDynamicArray<LLUUID> &anim_ids, EAnimRequest request);
void sendAnimationRequest(const LLUUID &anim_id, EAnimRequest request);
void endAnimationUpdateUI();
+ void unpauseAnimation() { mPauseRequest = NULL; }
+ BOOL getCustomAnim() const { return mCustomAnim; }
+ void setCustomAnim(BOOL anim) { mCustomAnim = anim; }
+
private:
- LLFrameTimer mAnimationTimer; // Seconds that transition animation has been active
- F32 mAnimationDuration; // In seconds
BOOL mCustomAnim; // Current animation is ANIM_AGENT_CUSTOMIZE ?
LLAnimPauseRequest mPauseRequest;
BOOL mViewsPushed; // Keep track of whether or not we have pushed views
@@ -462,19 +432,6 @@ private:
** **
** MOVEMENT
**/
-
- //--------------------------------------------------------------------
- // Keys
- //--------------------------------------------------------------------
-public:
- void setKey(const S32 direction, S32 &key); // Sets key to +1 for +direction, -1 for -direction
-private:
- S32 mAtKey; // Either 1, 0, or -1. Indicates that movement key is pressed
- S32 mWalkKey; // Like AtKey, but causes less forward thrust
- S32 mLeftKey;
- S32 mUpKey;
- F32 mYawKey;
- F32 mPitchKey;
//--------------------------------------------------------------------
// Movement from user input
@@ -492,42 +449,6 @@ public:
void movePitch(F32 mag);
//--------------------------------------------------------------------
- // Orbit
- //--------------------------------------------------------------------
-public:
- void setOrbitLeftKey(F32 mag) { mOrbitLeftKey = mag; }
- void setOrbitRightKey(F32 mag) { mOrbitRightKey = mag; }
- void setOrbitUpKey(F32 mag) { mOrbitUpKey = mag; }
- void setOrbitDownKey(F32 mag) { mOrbitDownKey = mag; }
- void setOrbitInKey(F32 mag) { mOrbitInKey = mag; }
- void setOrbitOutKey(F32 mag) { mOrbitOutKey = mag; }
-private:
- F32 mOrbitLeftKey;
- F32 mOrbitRightKey;
- F32 mOrbitUpKey;
- F32 mOrbitDownKey;
- F32 mOrbitInKey;
- F32 mOrbitOutKey;
-
- //--------------------------------------------------------------------
- // Pan
- //--------------------------------------------------------------------
-public:
- void setPanLeftKey(F32 mag) { mPanLeftKey = mag; }
- void setPanRightKey(F32 mag) { mPanRightKey = mag; }
- void setPanUpKey(F32 mag) { mPanUpKey = mag; }
- void setPanDownKey(F32 mag) { mPanDownKey = mag; }
- void setPanInKey(F32 mag) { mPanInKey = mag; }
- void setPanOutKey(F32 mag) { mPanOutKey = mag; }
-private:
- F32 mPanUpKey;
- F32 mPanDownKey;
- F32 mPanLeftKey;
- F32 mPanRightKey;
- F32 mPanInKey;
- F32 mPanOutKey;
-
- //--------------------------------------------------------------------
// Move the avatar's frame
//--------------------------------------------------------------------
public:
@@ -594,13 +515,13 @@ public:
public:
static void parseTeleportMessages(const std::string& xml_filename);
- const std::string getTeleportSourceSLURL() const { return mTeleportSourceSLURL; }
+ const void getTeleportSourceSLURL(LLSLURL& slurl) const { slurl = mTeleportSourceSLURL; }
public:
// ! TODO ! Define ERROR and PROGRESS enums here instead of exposing the mappings.
static std::map<std::string, std::string> sTeleportErrorMessages;
static std::map<std::string, std::string> sTeleportProgressMessages;
private:
- std::string mTeleportSourceSLURL; // SLURL where last TP began
+ LLSLURL mTeleportSourceSLURL; // SLURL where last TP began
//--------------------------------------------------------------------
// Teleport Actions
@@ -640,232 +561,6 @@ private:
/********************************************************************************
** **
- ** CAMERA
- **/
-
- //--------------------------------------------------------------------
- // Mode
- //--------------------------------------------------------------------
-public:
- void changeCameraToDefault();
- void changeCameraToMouselook(BOOL animate = TRUE);
- void changeCameraToThirdPerson(BOOL animate = TRUE);
- void changeCameraToCustomizeAvatar(BOOL avatar_animate = TRUE, BOOL camera_animate = TRUE); // Trigger transition animation
- void changeCameraToFollow(BOOL animate = TRUE); // Ventrella
- BOOL cameraThirdPerson() const { return (mCameraMode == CAMERA_MODE_THIRD_PERSON && mLastCameraMode == CAMERA_MODE_THIRD_PERSON); }
- BOOL cameraMouselook() const { return (mCameraMode == CAMERA_MODE_MOUSELOOK && mLastCameraMode == CAMERA_MODE_MOUSELOOK); }
- BOOL cameraCustomizeAvatar() const { return (mCameraMode == CAMERA_MODE_CUSTOMIZE_AVATAR /*&& !mCameraAnimating*/); }
- BOOL cameraFollow() const { return (mCameraMode == CAMERA_MODE_FOLLOW && mLastCameraMode == CAMERA_MODE_FOLLOW); }
- ECameraMode getCameraMode() const { return mCameraMode; }
- void updateCamera(); // Call once per frame to update camera location/orientation
- void resetCamera(); // Slam camera into its default position
-private:
- ECameraMode mCameraMode; // Target mode after transition animation is done
- ECameraMode mLastCameraMode;
-
- //--------------------------------------------------------------------
- // Preset
- //--------------------------------------------------------------------
-public:
- void switchCameraPreset(ECameraPreset preset);
-
-private:
-
- /** Determines default camera offset depending on the current camera preset */
- LLVector3 getCameraOffsetInitial();
-
- /** Camera preset in Third Person Mode */
- ECameraPreset mCameraPreset;
-
- /** Initial camera offsets */
- std::map<ECameraPreset, LLVector3> mCameraOffsetInitial;
-
- /** Initial focus offsets */
- std::map<ECameraPreset, LLVector3d> mFocusOffsetInitial;
-
-
- //--------------------------------------------------------------------
- // Position
- //--------------------------------------------------------------------
-public:
- LLVector3d getCameraPositionGlobal() const;
- const LLVector3 &getCameraPositionAgent() const;
- LLVector3d calcCameraPositionTargetGlobal(BOOL *hit_limit = NULL); // Calculate the camera position target
- F32 getCameraMinOffGround(); // Minimum height off ground for this mode, meters
- void setCameraCollidePlane(const LLVector4 &plane) { mCameraCollidePlane = plane; }
- BOOL calcCameraMinDistance(F32 &obj_min_distance);
- F32 calcCustomizeAvatarUIOffset(const LLVector3d& camera_pos_global);
- F32 getCurrentCameraBuildOffset() { return (F32)mCameraFocusOffset.length(); }
-private:
- F32 mCurrentCameraDistance; // Current camera offset from avatar
- F32 mTargetCameraDistance; // Target camera offset from avatar
- F32 mCameraFOVZoomFactor; // Amount of fov zoom applied to camera when zeroing in on an object
- F32 mCameraCurrentFOVZoomFactor; // Interpolated fov zoom
- F32 mCameraFOVDefault; // Default field of view that is basis for FOV zoom effect
- LLVector4 mCameraCollidePlane; // Colliding plane for camera
- F32 mCameraZoomFraction; // Mousewheel driven fraction of zoom
- LLVector3 mCameraPositionAgent; // Camera position in agent coordinates
- LLVector3 mCameraVirtualPositionAgent; // Camera virtual position (target) before performing FOV zoom
- LLVector3d mCameraSmoothingLastPositionGlobal;
- LLVector3d mCameraSmoothingLastPositionAgent;
- BOOL mCameraSmoothingStop;
- LLVector3 mCameraLag; // Third person camera lag
- LLVector3 mCameraUpVector; // Camera's up direction in world coordinates (determines the 'roll' of the view)
-
- //--------------------------------------------------------------------
- // Follow
- //--------------------------------------------------------------------
-public:
- void setUsingFollowCam(bool using_follow_cam);
-private:
- LLFollowCam mFollowCam; // Ventrella
-
- //--------------------------------------------------------------------
- // Sit
- //--------------------------------------------------------------------
-public:
- void setupSitCamera();
- BOOL sitCameraEnabled() { return mSitCameraEnabled; }
- void setSitCamera(const LLUUID &object_id,
- const LLVector3 &camera_pos = LLVector3::zero, const LLVector3 &camera_focus = LLVector3::zero);
-private:
- LLPointer<LLViewerObject> mSitCameraReferenceObject; // Object to which camera is related when sitting
- BOOL mSitCameraEnabled; // Use provided camera information when sitting?
- LLVector3 mSitCameraPos; // Root relative camera pos when sitting
- LLVector3 mSitCameraFocus; // Root relative camera target when sitting
-
- //--------------------------------------------------------------------
- // Animation
- //--------------------------------------------------------------------
-public:
- void setCameraAnimating(BOOL b) { mCameraAnimating = b; }
- BOOL getCameraAnimating() { return mCameraAnimating; }
- void setAnimationDuration(F32 seconds) { mAnimationDuration = seconds; }
- void startCameraAnimation();
- void stopCameraAnimation();
-private:
- BOOL mCameraAnimating; // Camera is transitioning from one mode to another
- LLVector3d mAnimationCameraStartGlobal; // Camera start position, global coords
- LLVector3d mAnimationFocusStartGlobal; // Camera focus point, global coords
-
- //--------------------------------------------------------------------
- // Focus
- //--------------------------------------------------------------------
-public:
- LLVector3d calcFocusPositionTargetGlobal();
- LLVector3 calcFocusOffset(LLViewerObject *object, LLVector3 pos_agent, S32 x, S32 y);
- BOOL getFocusOnAvatar() const { return mFocusOnAvatar; }
- LLPointer<LLViewerObject>& getFocusObject() { return mFocusObject; }
- F32 getFocusObjectDist() const { return mFocusObjectDist; }
- void updateFocusOffset();
- void validateFocusObject();
- void setFocusGlobal(const LLPickInfo& pick);
- void setFocusGlobal(const LLVector3d &focus, const LLUUID &object_id = LLUUID::null);
- void setFocusOnAvatar(BOOL focus, BOOL animate);
- void setCameraPosAndFocusGlobal(const LLVector3d& pos, const LLVector3d& focus, const LLUUID &object_id);
- void clearFocusObject();
- void setFocusObject(LLViewerObject* object);
- void setObjectTracking(BOOL track) { mTrackFocusObject = track; }
- const LLVector3d &getFocusGlobal() const { return mFocusGlobal; }
- const LLVector3d &getFocusTargetGlobal() const { return mFocusTargetGlobal; }
-private:
- LLVector3d mCameraFocusOffset; // Offset from focus point in build mode
- LLVector3d mCameraFocusOffsetTarget; // Target towards which we are lerping the camera's focus offset
- BOOL mFocusOnAvatar;
- LLVector3d mFocusGlobal;
- LLVector3d mFocusTargetGlobal;
- LLPointer<LLViewerObject> mFocusObject;
- F32 mFocusObjectDist;
- LLVector3 mFocusObjectOffset;
- F32 mFocusDotRadius; // Meters
- BOOL mTrackFocusObject;
- F32 mUIOffset;
-
- //--------------------------------------------------------------------
- // Lookat / Pointat
- //--------------------------------------------------------------------
-public:
- void updateLookAt(const S32 mouse_x, const S32 mouse_y);
- BOOL setLookAt(ELookAtType target_type, LLViewerObject *object = NULL, LLVector3 position = LLVector3::zero);
- ELookAtType getLookAtType();
- void slamLookAt(const LLVector3 &look_at); // Set the physics data
- BOOL setPointAt(EPointAtType target_type, LLViewerObject *object = NULL, LLVector3 position = LLVector3::zero);
- EPointAtType getPointAtType();
-public:
- LLPointer<LLHUDEffectLookAt> mLookAt;
- LLPointer<LLHUDEffectPointAt> mPointAt;
-
- //--------------------------------------------------------------------
- // Third person
- //--------------------------------------------------------------------
-public:
- LLVector3d calcThirdPersonFocusOffset();
- void setThirdPersonHeadOffset(LLVector3 offset) { mThirdPersonHeadOffset = offset; }
-private:
- LLVector3 mThirdPersonHeadOffset; // Head offset for third person camera position
-
- //--------------------------------------------------------------------
- // Orbit
- //--------------------------------------------------------------------
-public:
- void cameraOrbitAround(const F32 radians); // Rotate camera CCW radians about build focus point
- void cameraOrbitOver(const F32 radians); // Rotate camera forward radians over build focus point
- void cameraOrbitIn(const F32 meters); // Move camera in toward build focus point
-
- //--------------------------------------------------------------------
- // Zoom
- //--------------------------------------------------------------------
-public:
- void handleScrollWheel(S32 clicks); // Mousewheel driven zoom
- void cameraZoomIn(const F32 factor); // Zoom in by fraction of current distance
- F32 getCameraZoomFraction(); // Get camera zoom as fraction of minimum and maximum zoom
- void setCameraZoomFraction(F32 fraction); // Set camera zoom as fraction of minimum and maximum zoom
- F32 calcCameraFOVZoomFactor();
-
- //--------------------------------------------------------------------
- // Pan
- //--------------------------------------------------------------------
-public:
- void cameraPanIn(const F32 meters);
- void cameraPanLeft(const F32 meters);
- void cameraPanUp(const F32 meters);
-
- //--------------------------------------------------------------------
- // View
- //--------------------------------------------------------------------
-public:
- // Called whenever the agent moves. Puts camera back in default position, deselects items, etc.
- void resetView(BOOL reset_camera = TRUE, BOOL change_camera = FALSE);
- // Called on camera movement. Unlocks camera from the default position behind the avatar.
- void unlockView();
-
- //--------------------------------------------------------------------
- // Mouselook
- //--------------------------------------------------------------------
-public:
- BOOL getForceMouselook() const { return mForceMouselook; }
- void setForceMouselook(BOOL mouselook) { mForceMouselook = mouselook; }
-private:
- BOOL mForceMouselook;
-
- //--------------------------------------------------------------------
- // HUD
- //--------------------------------------------------------------------
-public:
- const LLColor4 &getEffectColor();
- void setEffectColor(const LLColor4 &color);
-public:
- F32 mHUDTargetZoom; // Target zoom level for HUD objects (used when editing)
- F32 mHUDCurZoom; // Current animated zoom level for HUD objects
-private:
- LLUIColor mEffectColor;
-
-/** Camera
- ** **
- *******************************************************************************/
-
-/********************************************************************************
- ** **
** ACCESS
**/
@@ -888,7 +583,8 @@ private:
// God
//--------------------------------------------------------------------
public:
- BOOL isGodlike() const;
+ bool isGodlike() const;
+ bool isGodlikeWithoutAdminMenuFakery() const;
U8 getGodLevel() const;
void setAdminOverride(BOOL b);
void setGodLevel(U8 god_level);
@@ -937,8 +633,9 @@ public:
LLQuaternion getHeadRotation();
BOOL needsRenderAvatar(); // TRUE when camera mode is such that your own avatar should draw
BOOL needsRenderHead();
-public:
- F32 mDrawDistance;
+ void setShowAvatar(BOOL show) { mShowAvatar = show; }
+ BOOL getShowAvatar() const { return mShowAvatar; }
+
private:
BOOL mShowAvatar; // Should we render the avatar?
U32 mAppearanceSerialNum;
@@ -953,6 +650,15 @@ public:
private:
U8 mRenderState; // Current behavior state of agent
+ //--------------------------------------------------------------------
+ // HUD
+ //--------------------------------------------------------------------
+public:
+ const LLColor4 &getEffectColor();
+ void setEffectColor(const LLColor4 &color);
+private:
+ LLUIColor mEffectColor;
+
/** Rendering
** **
*******************************************************************************/
@@ -982,7 +688,7 @@ private:
//--------------------------------------------------------------------
public:
// Checks against all groups in the entire agent group list.
- BOOL isInGroup(const LLUUID& group_id) const;
+ BOOL isInGroup(const LLUUID& group_id, BOOL ingnore_God_mod = FALSE) const;
protected:
// Only used for building titles.
BOOL isGroupMember() const { return !mGroupID.isNull(); }
diff --git a/indra/newview/llagentaccess.cpp b/indra/newview/llagentaccess.cpp
index eb978eb6c1..915dabb935 100644
--- a/indra/newview/llagentaccess.cpp
+++ b/indra/newview/llagentaccess.cpp
@@ -69,12 +69,21 @@ bool LLAgentAccess::isGodlike() const
#endif
}
+bool LLAgentAccess::isGodlikeWithoutAdminMenuFakery() const
+{
+#ifdef HACKED_GODLIKE_VIEWER
+ return true;
+#else
+ return mGodLevel > GOD_NOT;
+#endif
+}
+
U8 LLAgentAccess::getGodLevel() const
{
#ifdef HACKED_GODLIKE_VIEWER
return GOD_MAINTENANCE;
#else
- if(mAdminOverride) return GOD_FULL;
+ if(mAdminOverride) return GOD_FULL; // :(
return mGodLevel;
#endif
}
diff --git a/indra/newview/llagentaccess.h b/indra/newview/llagentaccess.h
index 93d2f0a371..49da5f44cc 100644
--- a/indra/newview/llagentaccess.h
+++ b/indra/newview/llagentaccess.h
@@ -48,6 +48,7 @@ public:
void setGodLevel(U8 god_level);
bool isGodlike() const;
+ bool isGodlikeWithoutAdminMenuFakery() const;
U8 getGodLevel() const;
diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp
new file mode 100644
index 0000000000..9cf0a659c1
--- /dev/null
+++ b/indra/newview/llagentcamera.cpp
@@ -0,0 +1,2852 @@
+/**
+ * @file llagentcamera.cpp
+ * @brief LLAgent class implementation
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llagentcamera.h"
+
+#include "pipeline.h"
+
+#include "llagent.h"
+#include "llanimationstates.h"
+#include "llfloatercamera.h"
+#include "llfloaterreg.h"
+#include "llhudmanager.h"
+#include "lljoystickbutton.h"
+#include "llselectmgr.h"
+#include "llsmoothstep.h"
+#include "lltoolmgr.h"
+#include "llviewercamera.h"
+#include "llviewercontrol.h"
+#include "llviewerjoystick.h"
+#include "llviewermenu.h"
+#include "llviewerobjectlist.h"
+#include "llviewerregion.h"
+#include "llviewerwindow.h"
+#include "llvoavatarself.h"
+#include "llwindow.h"
+#include "llworld.h"
+
+using namespace LLVOAvatarDefines;
+
+extern LLMenuBarGL* gMenuBarView;
+
+// Mousewheel camera zoom
+const F32 MIN_ZOOM_FRACTION = 0.25f;
+const F32 INITIAL_ZOOM_FRACTION = 1.f;
+const F32 MAX_ZOOM_FRACTION = 8.f;
+
+const F32 CAMERA_ZOOM_HALF_LIFE = 0.07f; // seconds
+const F32 FOV_ZOOM_HALF_LIFE = 0.07f; // seconds
+
+const F32 CAMERA_FOCUS_HALF_LIFE = 0.f;//0.02f;
+const F32 CAMERA_LAG_HALF_LIFE = 0.25f;
+const F32 MIN_CAMERA_LAG = 0.5f;
+const F32 MAX_CAMERA_LAG = 5.f;
+
+const F32 CAMERA_COLLIDE_EPSILON = 0.1f;
+const F32 MIN_CAMERA_DISTANCE = 0.1f;
+
+const F32 AVATAR_ZOOM_MIN_X_FACTOR = 0.55f;
+const F32 AVATAR_ZOOM_MIN_Y_FACTOR = 0.7f;
+const F32 AVATAR_ZOOM_MIN_Z_FACTOR = 1.15f;
+
+const F32 MAX_CAMERA_DISTANCE_FROM_AGENT = 50.f;
+
+const F32 MAX_CAMERA_SMOOTH_DISTANCE = 50.0f;
+
+const F32 HEAD_BUFFER_SIZE = 0.3f;
+
+const F32 CUSTOMIZE_AVATAR_CAMERA_ANIM_SLOP = 0.2f;
+
+const F32 LAND_MIN_ZOOM = 0.15f;
+
+const F32 AVATAR_MIN_ZOOM = 0.5f;
+const F32 OBJECT_MIN_ZOOM = 0.02f;
+
+const F32 APPEARANCE_MIN_ZOOM = 0.39f;
+const F32 APPEARANCE_MAX_ZOOM = 8.f;
+
+const F32 GROUND_TO_AIR_CAMERA_TRANSITION_TIME = 0.5f;
+const F32 GROUND_TO_AIR_CAMERA_TRANSITION_START_TIME = 0.5f;
+
+const F32 OBJECT_EXTENTS_PADDING = 0.5f;
+
+// The agent instance.
+LLAgentCamera gAgentCamera;
+
+//-----------------------------------------------------------------------------
+// LLAgentCamera()
+//-----------------------------------------------------------------------------
+LLAgentCamera::LLAgentCamera() :
+ mInitialized(false),
+
+ mDrawDistance( DEFAULT_FAR_PLANE ),
+
+ mLookAt(NULL),
+ mPointAt(NULL),
+
+ mHUDTargetZoom(1.f),
+ mHUDCurZoom(1.f),
+
+ mForceMouselook(FALSE),
+
+ mCameraMode( CAMERA_MODE_THIRD_PERSON ),
+ mLastCameraMode( CAMERA_MODE_THIRD_PERSON ),
+
+ mCameraPreset(CAMERA_PRESET_REAR_VIEW),
+
+ mCameraAnimating( FALSE ),
+ mAnimationCameraStartGlobal(),
+ mAnimationFocusStartGlobal(),
+ mAnimationTimer(),
+ mAnimationDuration(0.33f),
+
+ mCameraFOVZoomFactor(0.f),
+ mCameraCurrentFOVZoomFactor(0.f),
+ mCameraFocusOffset(),
+ mCameraFOVDefault(DEFAULT_FIELD_OF_VIEW),
+
+ mCameraCollidePlane(),
+
+ mCurrentCameraDistance(2.f), // meters, set in init()
+ mTargetCameraDistance(2.f),
+ mCameraZoomFraction(1.f), // deprecated
+ mThirdPersonHeadOffset(0.f, 0.f, 1.f),
+ mSitCameraEnabled(FALSE),
+ mCameraSmoothingLastPositionGlobal(),
+ mCameraSmoothingLastPositionAgent(),
+ mCameraSmoothingStop(false),
+
+ mCameraUpVector(LLVector3::z_axis), // default is straight up
+
+ mFocusOnAvatar(TRUE),
+ mFocusGlobal(),
+ mFocusTargetGlobal(),
+ mFocusObject(NULL),
+ mFocusObjectDist(0.f),
+ mFocusObjectOffset(),
+ mFocusDotRadius( 0.1f ), // meters
+ mTrackFocusObject(TRUE),
+ mUIOffset(0.f),
+
+ mAtKey(0), // Either 1, 0, or -1... indicates that movement-key is pressed
+ mWalkKey(0), // like AtKey, but causes less forward thrust
+ mLeftKey(0),
+ mUpKey(0),
+ mYawKey(0.f),
+ mPitchKey(0.f),
+
+ mOrbitLeftKey(0.f),
+ mOrbitRightKey(0.f),
+ mOrbitUpKey(0.f),
+ mOrbitDownKey(0.f),
+ mOrbitInKey(0.f),
+ mOrbitOutKey(0.f),
+
+ mPanUpKey(0.f),
+ mPanDownKey(0.f),
+ mPanLeftKey(0.f),
+ mPanRightKey(0.f),
+ mPanInKey(0.f),
+ mPanOutKey(0.f)
+{
+ mFollowCam.setMaxCameraDistantFromSubject( MAX_CAMERA_DISTANCE_FROM_AGENT );
+
+ clearGeneralKeys();
+ clearOrbitKeys();
+ clearPanKeys();
+}
+
+// Requires gSavedSettings to be initialized.
+//-----------------------------------------------------------------------------
+// init()
+//-----------------------------------------------------------------------------
+void LLAgentCamera::init()
+{
+ // *Note: this is where LLViewerCamera::getInstance() used to be constructed.
+
+ mDrawDistance = gSavedSettings.getF32("RenderFarClip");
+
+ LLViewerCamera::getInstance()->setView(DEFAULT_FIELD_OF_VIEW);
+ // Leave at 0.1 meters until we have real near clip management
+ LLViewerCamera::getInstance()->setNear(0.1f);
+ LLViewerCamera::getInstance()->setFar(mDrawDistance); // if you want to change camera settings, do so in camera.h
+ LLViewerCamera::getInstance()->setAspect( gViewerWindow->getWorldViewAspectRatio() ); // default, overridden in LLViewerWindow::reshape
+ LLViewerCamera::getInstance()->setViewHeightInPixels(768); // default, overridden in LLViewerWindow::reshape
+
+ mCameraFocusOffsetTarget = LLVector4(gSavedSettings.getVector3("CameraOffsetBuild"));
+
+ mCameraPreset = (ECameraPreset) gSavedSettings.getU32("CameraPreset");
+
+ mCameraOffsetInitial[CAMERA_PRESET_REAR_VIEW] = gSavedSettings.getControl("CameraOffsetRearView");
+ mCameraOffsetInitial[CAMERA_PRESET_FRONT_VIEW] = gSavedSettings.getControl("CameraOffsetFrontView");
+ mCameraOffsetInitial[CAMERA_PRESET_GROUP_VIEW] = gSavedSettings.getControl("CameraOffsetGroupView");
+
+ mFocusOffsetInitial[CAMERA_PRESET_REAR_VIEW] = gSavedSettings.getControl("FocusOffsetRearView");
+ mFocusOffsetInitial[CAMERA_PRESET_FRONT_VIEW] = gSavedSettings.getControl("FocusOffsetFrontView");
+ mFocusOffsetInitial[CAMERA_PRESET_GROUP_VIEW] = gSavedSettings.getControl("FocusOffsetGroupView");
+
+ mCameraCollidePlane.clearVec();
+ mCurrentCameraDistance = getCameraOffsetInitial().magVec() * gSavedSettings.getF32("CameraOffsetScale");
+ mTargetCameraDistance = mCurrentCameraDistance;
+ mCameraZoomFraction = 1.f;
+ mTrackFocusObject = gSavedSettings.getBOOL("TrackFocusObject");
+
+ mInitialized = true;
+}
+
+//-----------------------------------------------------------------------------
+// cleanup()
+//-----------------------------------------------------------------------------
+void LLAgentCamera::cleanup()
+{
+ setSitCamera(LLUUID::null);
+
+ if(mLookAt)
+ {
+ mLookAt->markDead() ;
+ mLookAt = NULL;
+ }
+ if(mPointAt)
+ {
+ mPointAt->markDead() ;
+ mPointAt = NULL;
+ }
+ setFocusObject(NULL);
+}
+
+void LLAgentCamera::setAvatarObject(LLVOAvatarSelf* avatar)
+{
+ if (!mLookAt)
+ {
+ mLookAt = (LLHUDEffectLookAt *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_LOOKAT);
+ }
+ if (!mPointAt)
+ {
+ mPointAt = (LLHUDEffectPointAt *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINTAT);
+ }
+
+ if (!mLookAt.isNull())
+ {
+ mLookAt->setSourceObject(avatar);
+ }
+ if (!mPointAt.isNull())
+ {
+ mPointAt->setSourceObject(avatar);
+ }
+}
+
+//-----------------------------------------------------------------------------
+// LLAgent()
+//-----------------------------------------------------------------------------
+LLAgentCamera::~LLAgentCamera()
+{
+ cleanup();
+
+ // *Note: this is where LLViewerCamera::getInstance() used to be deleted.
+}
+
+// Change camera back to third person, stop the autopilot,
+// deselect stuff, etc.
+//-----------------------------------------------------------------------------
+// resetView()
+//-----------------------------------------------------------------------------
+void LLAgentCamera::resetView(BOOL reset_camera, BOOL change_camera)
+{
+ if (gAgent.getAutoPilot())
+ {
+ gAgent.stopAutoPilot(TRUE);
+ }
+
+ if (!gNoRender)
+ {
+ LLSelectMgr::getInstance()->unhighlightAll();
+
+ // By popular request, keep land selection while walking around. JC
+ // LLViewerParcelMgr::getInstance()->deselectLand();
+
+ // force deselect when walking and attachment is selected
+ // this is so people don't wig out when their avatar moves without animating
+ if (LLSelectMgr::getInstance()->getSelection()->isAttachment())
+ {
+ LLSelectMgr::getInstance()->deselectAll();
+ }
+
+ // Hide all popup menus
+ gMenuHolder->hideMenus();
+ }
+
+ if (change_camera && !gSavedSettings.getBOOL("FreezeTime"))
+ {
+ changeCameraToDefault();
+
+ if (LLViewerJoystick::getInstance()->getOverrideCamera())
+ {
+ handle_toggle_flycam();
+ }
+
+ // reset avatar mode from eventual residual motion
+ if (LLToolMgr::getInstance()->inBuildMode())
+ {
+ LLViewerJoystick::getInstance()->moveAvatar(true);
+ }
+
+ //Camera Tool is needed for Free Camera Control Mode
+ if (!LLFloaterCamera::inFreeCameraMode())
+ {
+ LLFloaterReg::hideInstance("build");
+
+ // Switch back to basic toolset
+ LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
+ }
+
+ gViewerWindow->showCursor();
+ }
+
+
+ if (reset_camera && !gSavedSettings.getBOOL("FreezeTime"))
+ {
+ if (!gViewerWindow->getLeftMouseDown() && cameraThirdPerson())
+ {
+ // leaving mouse-steer mode
+ LLVector3 agent_at_axis = gAgent.getAtAxis();
+ agent_at_axis -= projected_vec(agent_at_axis, gAgent.getReferenceUpVector());
+ agent_at_axis.normalize();
+ gAgent.resetAxes(lerp(gAgent.getAtAxis(), agent_at_axis, LLCriticalDamp::getInterpolant(0.3f)));
+ }
+
+ setFocusOnAvatar(TRUE, ANIMATE);
+
+ mCameraFOVZoomFactor = 0.f;
+ }
+
+ mHUDTargetZoom = 1.f;
+}
+
+// Allow camera to be moved somewhere other than behind avatar.
+//-----------------------------------------------------------------------------
+// unlockView()
+//-----------------------------------------------------------------------------
+void LLAgentCamera::unlockView()
+{
+ if (getFocusOnAvatar())
+ {
+ if (isAgentAvatarValid())
+ {
+ setFocusGlobal(LLVector3d::zero, gAgentAvatarp->mID);
+ }
+ setFocusOnAvatar(FALSE, FALSE); // no animation
+ }
+}
+
+//-----------------------------------------------------------------------------
+// slamLookAt()
+//-----------------------------------------------------------------------------
+void LLAgentCamera::slamLookAt(const LLVector3 &look_at)
+{
+ LLVector3 look_at_norm = look_at;
+ look_at_norm.mV[VZ] = 0.f;
+ look_at_norm.normalize();
+ gAgent.resetAxes(look_at_norm);
+}
+
+//-----------------------------------------------------------------------------
+// calcFocusOffset()
+//-----------------------------------------------------------------------------
+LLVector3 LLAgentCamera::calcFocusOffset(LLViewerObject *object, LLVector3 original_focus_point, S32 x, S32 y)
+{
+ LLMatrix4 obj_matrix = object->getRenderMatrix();
+ LLQuaternion obj_rot = object->getRenderRotation();
+ LLVector3 obj_pos = object->getRenderPosition();
+
+ BOOL is_avatar = object->isAvatar();
+ // if is avatar - don't do any funk heuristics to position the focal point
+ // see DEV-30589
+ if (is_avatar)
+ {
+ return original_focus_point - obj_pos;
+ }
+
+
+ LLQuaternion inv_obj_rot = ~obj_rot; // get inverse of rotation
+ LLVector3 object_extents = object->getScale();
+ // make sure they object extents are non-zero
+ object_extents.clamp(0.001f, F32_MAX);
+
+ // obj_to_cam_ray is unit vector pointing from object center to camera, in the coordinate frame of the object
+ LLVector3 obj_to_cam_ray = obj_pos - LLViewerCamera::getInstance()->getOrigin();
+ obj_to_cam_ray.rotVec(inv_obj_rot);
+ obj_to_cam_ray.normalize();
+
+ // obj_to_cam_ray_proportions are the (positive) ratios of
+ // the obj_to_cam_ray x,y,z components with the x,y,z object dimensions.
+ LLVector3 obj_to_cam_ray_proportions;
+ obj_to_cam_ray_proportions.mV[VX] = llabs(obj_to_cam_ray.mV[VX] / object_extents.mV[VX]);
+ obj_to_cam_ray_proportions.mV[VY] = llabs(obj_to_cam_ray.mV[VY] / object_extents.mV[VY]);
+ obj_to_cam_ray_proportions.mV[VZ] = llabs(obj_to_cam_ray.mV[VZ] / object_extents.mV[VZ]);
+
+ // find the largest ratio stored in obj_to_cam_ray_proportions
+ // this corresponds to the object's local axial plane (XY, YZ, XZ) that is *most* facing the camera
+ LLVector3 longest_object_axis;
+ // is x-axis longest?
+ if (obj_to_cam_ray_proportions.mV[VX] > obj_to_cam_ray_proportions.mV[VY]
+ && obj_to_cam_ray_proportions.mV[VX] > obj_to_cam_ray_proportions.mV[VZ])
+ {
+ // then grab it
+ longest_object_axis.setVec(obj_matrix.getFwdRow4());
+ }
+ // is y-axis longest?
+ else if (obj_to_cam_ray_proportions.mV[VY] > obj_to_cam_ray_proportions.mV[VZ])
+ {
+ // then grab it
+ longest_object_axis.setVec(obj_matrix.getLeftRow4());
+ }
+ // otherwise, use z axis
+ else
+ {
+ longest_object_axis.setVec(obj_matrix.getUpRow4());
+ }
+
+ // Use this axis as the normal to project mouse click on to plane with that normal, at the object center.
+ // This generates a point behind the mouse cursor that is approximately in the middle of the object in
+ // terms of depth.
+ // We do this to allow the camera rotation tool to "tumble" the object by rotating the camera.
+ // If the focus point were the object surface under the mouse, camera rotation would introduce an undesirable
+ // eccentricity to the object orientation
+ LLVector3 focus_plane_normal(longest_object_axis);
+ focus_plane_normal.normalize();
+
+ LLVector3d focus_pt_global;
+ gViewerWindow->mousePointOnPlaneGlobal(focus_pt_global, x, y, gAgent.getPosGlobalFromAgent(obj_pos), focus_plane_normal);
+ LLVector3 focus_pt = gAgent.getPosAgentFromGlobal(focus_pt_global);
+
+ // find vector from camera to focus point in object space
+ LLVector3 camera_to_focus_vec = focus_pt - LLViewerCamera::getInstance()->getOrigin();
+ camera_to_focus_vec.rotVec(inv_obj_rot);
+
+ // find vector from object origin to focus point in object coordinates
+ LLVector3 focus_offset_from_object_center = focus_pt - obj_pos;
+ // convert to object-local space
+ focus_offset_from_object_center.rotVec(inv_obj_rot);
+
+ // We need to project the focus point back into the bounding box of the focused object.
+ // Do this by calculating the XYZ scale factors needed to get focus offset back in bounds along the camera_focus axis
+ LLVector3 clip_fraction;
+
+ // for each axis...
+ for (U32 axis = VX; axis <= VZ; axis++)
+ {
+ //...calculate distance that focus offset sits outside of bounding box along that axis...
+ //NOTE: dist_out_of_bounds keeps the sign of focus_offset_from_object_center
+ F32 dist_out_of_bounds;
+ if (focus_offset_from_object_center.mV[axis] > 0.f)
+ {
+ dist_out_of_bounds = llmax(0.f, focus_offset_from_object_center.mV[axis] - (object_extents.mV[axis] * 0.5f));
+ }
+ else
+ {
+ dist_out_of_bounds = llmin(0.f, focus_offset_from_object_center.mV[axis] + (object_extents.mV[axis] * 0.5f));
+ }
+
+ //...then calculate the scale factor needed to push camera_to_focus_vec back in bounds along current axis
+ if (llabs(camera_to_focus_vec.mV[axis]) < 0.0001f)
+ {
+ // don't divide by very small number
+ clip_fraction.mV[axis] = 0.f;
+ }
+ else
+ {
+ clip_fraction.mV[axis] = dist_out_of_bounds / camera_to_focus_vec.mV[axis];
+ }
+ }
+
+ LLVector3 abs_clip_fraction = clip_fraction;
+ abs_clip_fraction.abs();
+
+ // find axis of focus offset that is *most* outside the bounding box and use that to
+ // rescale focus offset to inside object extents
+ if (abs_clip_fraction.mV[VX] > abs_clip_fraction.mV[VY]
+ && abs_clip_fraction.mV[VX] > abs_clip_fraction.mV[VZ])
+ {
+ focus_offset_from_object_center -= clip_fraction.mV[VX] * camera_to_focus_vec;
+ }
+ else if (abs_clip_fraction.mV[VY] > abs_clip_fraction.mV[VZ])
+ {
+ focus_offset_from_object_center -= clip_fraction.mV[VY] * camera_to_focus_vec;
+ }
+ else
+ {
+ focus_offset_from_object_center -= clip_fraction.mV[VZ] * camera_to_focus_vec;
+ }
+
+ // convert back to world space
+ focus_offset_from_object_center.rotVec(obj_rot);
+
+ // now, based on distance of camera from object relative to object size
+ // push the focus point towards the near surface of the object when (relatively) close to the objcet
+ // or keep the focus point in the object middle when (relatively) far
+ // NOTE: leave focus point in middle of avatars, since the behavior you want when alt-zooming on avatars
+ // is almost always "tumble about middle" and not "spin around surface point"
+ if (!is_avatar)
+ {
+ LLVector3 obj_rel = original_focus_point - object->getRenderPosition();
+
+ //now that we have the object relative position, we should bias toward the center of the object
+ //based on the distance of the camera to the focus point vs. the distance of the camera to the focus
+
+ F32 relDist = llabs(obj_rel * LLViewerCamera::getInstance()->getAtAxis());
+ F32 viewDist = dist_vec(obj_pos + obj_rel, LLViewerCamera::getInstance()->getOrigin());
+
+
+ LLBBox obj_bbox = object->getBoundingBoxAgent();
+ F32 bias = 0.f;
+
+ // virtual_camera_pos is the camera position we are simulating by backing the camera off
+ // and adjusting the FOV
+ LLVector3 virtual_camera_pos = gAgent.getPosAgentFromGlobal(mFocusTargetGlobal + (getCameraPositionGlobal() - mFocusTargetGlobal) / (1.f + mCameraFOVZoomFactor));
+
+ // if the camera is inside the object (large, hollow objects, for example)
+ // leave focus point all the way to destination depth, away from object center
+ if(!obj_bbox.containsPointAgent(virtual_camera_pos))
+ {
+ // perform magic number biasing of focus point towards surface vs. planar center
+ bias = clamp_rescale(relDist/viewDist, 0.1f, 0.7f, 0.0f, 1.0f);
+ obj_rel = lerp(focus_offset_from_object_center, obj_rel, bias);
+ }
+
+ focus_offset_from_object_center = obj_rel;
+ }
+
+ return focus_offset_from_object_center;
+}
+
+//-----------------------------------------------------------------------------
+// calcCameraMinDistance()
+//-----------------------------------------------------------------------------
+BOOL LLAgentCamera::calcCameraMinDistance(F32 &obj_min_distance)
+{
+ BOOL soft_limit = FALSE; // is the bounding box to be treated literally (volumes) or as an approximation (avatars)
+
+ if (!mFocusObject || mFocusObject->isDead())
+ {
+ obj_min_distance = 0.f;
+ return TRUE;
+ }
+
+ if (mFocusObject->mDrawable.isNull())
+ {
+#ifdef LL_RELEASE_FOR_DOWNLOAD
+ llwarns << "Focus object with no drawable!" << llendl;
+#else
+ mFocusObject->dump();
+ llerrs << "Focus object with no drawable!" << llendl;
+#endif
+ obj_min_distance = 0.f;
+ return TRUE;
+ }
+
+ LLQuaternion inv_object_rot = ~mFocusObject->getRenderRotation();
+ LLVector3 target_offset_origin = mFocusObjectOffset;
+ LLVector3 camera_offset_target(getCameraPositionAgent() - gAgent.getPosAgentFromGlobal(mFocusTargetGlobal));
+
+ // convert offsets into object local space
+ camera_offset_target.rotVec(inv_object_rot);
+ target_offset_origin.rotVec(inv_object_rot);
+
+ // push around object extents based on target offset
+ LLVector3 object_extents = mFocusObject->getScale();
+ if (mFocusObject->isAvatar())
+ {
+ // fudge factors that lets you zoom in on avatars a bit more (which don't do FOV zoom)
+ object_extents.mV[VX] *= AVATAR_ZOOM_MIN_X_FACTOR;
+ object_extents.mV[VY] *= AVATAR_ZOOM_MIN_Y_FACTOR;
+ object_extents.mV[VZ] *= AVATAR_ZOOM_MIN_Z_FACTOR;
+ soft_limit = TRUE;
+ }
+ LLVector3 abs_target_offset = target_offset_origin;
+ abs_target_offset.abs();
+
+ LLVector3 target_offset_dir = target_offset_origin;
+ F32 object_radius = mFocusObject->getVObjRadius();
+
+ BOOL target_outside_object_extents = FALSE;
+
+ for (U32 i = VX; i <= VZ; i++)
+ {
+ if (abs_target_offset.mV[i] * 2.f > object_extents.mV[i] + OBJECT_EXTENTS_PADDING)
+ {
+ target_outside_object_extents = TRUE;
+ }
+ if (camera_offset_target.mV[i] > 0.f)
+ {
+ object_extents.mV[i] -= target_offset_origin.mV[i] * 2.f;
+ }
+ else
+ {
+ object_extents.mV[i] += target_offset_origin.mV[i] * 2.f;
+ }
+ }
+
+ // don't shrink the object extents so far that the object inverts
+ object_extents.clamp(0.001f, F32_MAX);
+
+ // move into first octant
+ LLVector3 camera_offset_target_abs_norm = camera_offset_target;
+ camera_offset_target_abs_norm.abs();
+ // make sure offset is non-zero
+ camera_offset_target_abs_norm.clamp(0.001f, F32_MAX);
+ camera_offset_target_abs_norm.normalize();
+
+ // find camera position relative to normalized object extents
+ LLVector3 camera_offset_target_scaled = camera_offset_target_abs_norm;
+ camera_offset_target_scaled.mV[VX] /= object_extents.mV[VX];
+ camera_offset_target_scaled.mV[VY] /= object_extents.mV[VY];
+ camera_offset_target_scaled.mV[VZ] /= object_extents.mV[VZ];
+
+ if (camera_offset_target_scaled.mV[VX] > camera_offset_target_scaled.mV[VY] &&
+ camera_offset_target_scaled.mV[VX] > camera_offset_target_scaled.mV[VZ])
+ {
+ if (camera_offset_target_abs_norm.mV[VX] < 0.001f)
+ {
+ obj_min_distance = object_extents.mV[VX] * 0.5f;
+ }
+ else
+ {
+ obj_min_distance = object_extents.mV[VX] * 0.5f / camera_offset_target_abs_norm.mV[VX];
+ }
+ }
+ else if (camera_offset_target_scaled.mV[VY] > camera_offset_target_scaled.mV[VZ])
+ {
+ if (camera_offset_target_abs_norm.mV[VY] < 0.001f)
+ {
+ obj_min_distance = object_extents.mV[VY] * 0.5f;
+ }
+ else
+ {
+ obj_min_distance = object_extents.mV[VY] * 0.5f / camera_offset_target_abs_norm.mV[VY];
+ }
+ }
+ else
+ {
+ if (camera_offset_target_abs_norm.mV[VZ] < 0.001f)
+ {
+ obj_min_distance = object_extents.mV[VZ] * 0.5f;
+ }
+ else
+ {
+ obj_min_distance = object_extents.mV[VZ] * 0.5f / camera_offset_target_abs_norm.mV[VZ];
+ }
+ }
+
+ LLVector3 object_split_axis;
+ LLVector3 target_offset_scaled = target_offset_origin;
+ target_offset_scaled.abs();
+ target_offset_scaled.normalize();
+ target_offset_scaled.mV[VX] /= object_extents.mV[VX];
+ target_offset_scaled.mV[VY] /= object_extents.mV[VY];
+ target_offset_scaled.mV[VZ] /= object_extents.mV[VZ];
+
+ if (target_offset_scaled.mV[VX] > target_offset_scaled.mV[VY] &&
+ target_offset_scaled.mV[VX] > target_offset_scaled.mV[VZ])
+ {
+ object_split_axis = LLVector3::x_axis;
+ }
+ else if (target_offset_scaled.mV[VY] > target_offset_scaled.mV[VZ])
+ {
+ object_split_axis = LLVector3::y_axis;
+ }
+ else
+ {
+ object_split_axis = LLVector3::z_axis;
+ }
+
+ LLVector3 camera_offset_object(getCameraPositionAgent() - mFocusObject->getPositionAgent());
+
+ // length projected orthogonal to target offset
+ F32 camera_offset_dist = (camera_offset_object - target_offset_dir * (camera_offset_object * target_offset_dir)).magVec();
+
+ // calculate whether the target point would be "visible" if it were outside the bounding box
+ // on the opposite of the splitting plane defined by object_split_axis;
+ BOOL exterior_target_visible = FALSE;
+ if (camera_offset_dist > object_radius)
+ {
+ // target is visible from camera, so turn off fov zoom
+ exterior_target_visible = TRUE;
+ }
+
+ F32 camera_offset_clip = camera_offset_object * object_split_axis;
+ F32 target_offset_clip = target_offset_dir * object_split_axis;
+
+ // target has moved outside of object extents
+ // check to see if camera and target are on same side
+ if (target_outside_object_extents)
+ {
+ if (camera_offset_clip > 0.f && target_offset_clip > 0.f)
+ {
+ return FALSE;
+ }
+ else if (camera_offset_clip < 0.f && target_offset_clip < 0.f)
+ {
+ return FALSE;
+ }
+ }
+
+ // clamp obj distance to diagonal of 10 by 10 cube
+ obj_min_distance = llmin(obj_min_distance, 10.f * F_SQRT3);
+
+ obj_min_distance += LLViewerCamera::getInstance()->getNear() + (soft_limit ? 0.1f : 0.2f);
+
+ return TRUE;
+}
+
+F32 LLAgentCamera::getCameraZoomFraction()
+{
+ // 0.f -> camera zoomed all the way out
+ // 1.f -> camera zoomed all the way in
+ LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
+ if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD)
+ {
+ // already [0,1]
+ return mHUDTargetZoom;
+ }
+ else if (mFocusOnAvatar && cameraThirdPerson())
+ {
+ return clamp_rescale(mCameraZoomFraction, MIN_ZOOM_FRACTION, MAX_ZOOM_FRACTION, 1.f, 0.f);
+ }
+ else if (cameraCustomizeAvatar())
+ {
+ F32 distance = (F32)mCameraFocusOffsetTarget.magVec();
+ return clamp_rescale(distance, APPEARANCE_MIN_ZOOM, APPEARANCE_MAX_ZOOM, 1.f, 0.f );
+ }
+ else
+ {
+ F32 min_zoom;
+ const F32 DIST_FUDGE = 16.f; // meters
+ F32 max_zoom = llmin(mDrawDistance - DIST_FUDGE,
+ LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE,
+ MAX_CAMERA_DISTANCE_FROM_AGENT);
+
+ F32 distance = (F32)mCameraFocusOffsetTarget.magVec();
+ if (mFocusObject.notNull())
+ {
+ if (mFocusObject->isAvatar())
+ {
+ min_zoom = AVATAR_MIN_ZOOM;
+ }
+ else
+ {
+ min_zoom = OBJECT_MIN_ZOOM;
+ }
+ }
+ else
+ {
+ min_zoom = LAND_MIN_ZOOM;
+ }
+
+ return clamp_rescale(distance, min_zoom, max_zoom, 1.f, 0.f);
+ }
+}
+
+void LLAgentCamera::setCameraZoomFraction(F32 fraction)
+{
+ // 0.f -> camera zoomed all the way out
+ // 1.f -> camera zoomed all the way in
+ LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
+
+ if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD)
+ {
+ mHUDTargetZoom = fraction;
+ }
+ else if (mFocusOnAvatar && cameraThirdPerson())
+ {
+ mCameraZoomFraction = rescale(fraction, 0.f, 1.f, MAX_ZOOM_FRACTION, MIN_ZOOM_FRACTION);
+ }
+ else if (cameraCustomizeAvatar())
+ {
+ LLVector3d camera_offset_dir = mCameraFocusOffsetTarget;
+ camera_offset_dir.normalize();
+ mCameraFocusOffsetTarget = camera_offset_dir * rescale(fraction, 0.f, 1.f, APPEARANCE_MAX_ZOOM, APPEARANCE_MIN_ZOOM);
+ }
+ else
+ {
+ F32 min_zoom = LAND_MIN_ZOOM;
+ const F32 DIST_FUDGE = 16.f; // meters
+ F32 max_zoom = llmin(mDrawDistance - DIST_FUDGE,
+ LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE,
+ MAX_CAMERA_DISTANCE_FROM_AGENT);
+
+ if (mFocusObject.notNull())
+ {
+ if (mFocusObject.notNull())
+ {
+ if (mFocusObject->isAvatar())
+ {
+ min_zoom = AVATAR_MIN_ZOOM;
+ }
+ else
+ {
+ min_zoom = OBJECT_MIN_ZOOM;
+ }
+ }
+ }
+
+ LLVector3d camera_offset_dir = mCameraFocusOffsetTarget;
+ camera_offset_dir.normalize();
+ mCameraFocusOffsetTarget = camera_offset_dir * rescale(fraction, 0.f, 1.f, max_zoom, min_zoom);
+ }
+ startCameraAnimation();
+}
+
+
+//-----------------------------------------------------------------------------
+// cameraOrbitAround()
+//-----------------------------------------------------------------------------
+void LLAgentCamera::cameraOrbitAround(const F32 radians)
+{
+ LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
+ if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD)
+ {
+ // do nothing for hud selection
+ }
+ else if (mFocusOnAvatar && (mCameraMode == CAMERA_MODE_THIRD_PERSON || mCameraMode == CAMERA_MODE_FOLLOW))
+ {
+ gAgent.yaw(radians);
+ }
+ else
+ {
+ mCameraFocusOffsetTarget.rotVec(radians, 0.f, 0.f, 1.f);
+
+ cameraZoomIn(1.f);
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// cameraOrbitOver()
+//-----------------------------------------------------------------------------
+void LLAgentCamera::cameraOrbitOver(const F32 angle)
+{
+ LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
+ if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD)
+ {
+ // do nothing for hud selection
+ }
+ else if (mFocusOnAvatar && mCameraMode == CAMERA_MODE_THIRD_PERSON)
+ {
+ gAgent.pitch(angle);
+ }
+ else
+ {
+ LLVector3 camera_offset_unit(mCameraFocusOffsetTarget);
+ camera_offset_unit.normalize();
+
+ F32 angle_from_up = acos( camera_offset_unit * gAgent.getReferenceUpVector() );
+
+ LLVector3d left_axis;
+ left_axis.setVec(LLViewerCamera::getInstance()->getLeftAxis());
+ F32 new_angle = llclamp(angle_from_up - angle, 1.f * DEG_TO_RAD, 179.f * DEG_TO_RAD);
+ mCameraFocusOffsetTarget.rotVec(angle_from_up - new_angle, left_axis);
+
+ cameraZoomIn(1.f);
+ }
+}
+
+//-----------------------------------------------------------------------------
+// cameraZoomIn()
+//-----------------------------------------------------------------------------
+void LLAgentCamera::cameraZoomIn(const F32 fraction)
+{
+ if (gDisconnected)
+ {
+ return;
+ }
+
+ LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
+ if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD)
+ {
+ // just update hud zoom level
+ mHUDTargetZoom /= fraction;
+ return;
+ }
+
+
+ LLVector3d camera_offset(mCameraFocusOffsetTarget);
+ LLVector3d camera_offset_unit(mCameraFocusOffsetTarget);
+ F32 min_zoom = LAND_MIN_ZOOM;
+ F32 current_distance = (F32)camera_offset_unit.normalize();
+ F32 new_distance = current_distance * fraction;
+
+ // Don't move through focus point
+ if (mFocusObject)
+ {
+ LLVector3 camera_offset_dir((F32)camera_offset_unit.mdV[VX], (F32)camera_offset_unit.mdV[VY], (F32)camera_offset_unit.mdV[VZ]);
+
+ if (mFocusObject->isAvatar())
+ {
+ calcCameraMinDistance(min_zoom);
+ }
+ else
+ {
+ min_zoom = OBJECT_MIN_ZOOM;
+ }
+ }
+
+ new_distance = llmax(new_distance, min_zoom);
+
+ // Don't zoom too far back
+ const F32 DIST_FUDGE = 16.f; // meters
+ F32 max_distance = llmin(mDrawDistance - DIST_FUDGE,
+ LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE );
+
+ if (new_distance > max_distance)
+ {
+ new_distance = max_distance;
+
+ /*
+ // Unless camera is unlocked
+ if (!LLViewerCamera::sDisableCameraConstraints)
+ {
+ return;
+ }
+ */
+ }
+
+ if( cameraCustomizeAvatar() )
+ {
+ new_distance = llclamp( new_distance, APPEARANCE_MIN_ZOOM, APPEARANCE_MAX_ZOOM );
+ }
+
+ mCameraFocusOffsetTarget = new_distance * camera_offset_unit;
+}
+
+//-----------------------------------------------------------------------------
+// cameraOrbitIn()
+//-----------------------------------------------------------------------------
+void LLAgentCamera::cameraOrbitIn(const F32 meters)
+{
+ if (mFocusOnAvatar && mCameraMode == CAMERA_MODE_THIRD_PERSON)
+ {
+ F32 camera_offset_dist = llmax(0.001f, getCameraOffsetInitial().magVec() * gSavedSettings.getF32("CameraOffsetScale"));
+
+ mCameraZoomFraction = (mTargetCameraDistance - meters) / camera_offset_dist;
+
+ if (!gSavedSettings.getBOOL("FreezeTime") && mCameraZoomFraction < MIN_ZOOM_FRACTION && meters > 0.f)
+ {
+ // No need to animate, camera is already there.
+ changeCameraToMouselook(FALSE);
+ }
+
+ mCameraZoomFraction = llclamp(mCameraZoomFraction, MIN_ZOOM_FRACTION, MAX_ZOOM_FRACTION);
+ }
+ else
+ {
+ LLVector3d camera_offset(mCameraFocusOffsetTarget);
+ LLVector3d camera_offset_unit(mCameraFocusOffsetTarget);
+ F32 current_distance = (F32)camera_offset_unit.normalize();
+ F32 new_distance = current_distance - meters;
+ F32 min_zoom = LAND_MIN_ZOOM;
+
+ // Don't move through focus point
+ if (mFocusObject.notNull())
+ {
+ if (mFocusObject->isAvatar())
+ {
+ min_zoom = AVATAR_MIN_ZOOM;
+ }
+ else
+ {
+ min_zoom = OBJECT_MIN_ZOOM;
+ }
+ }
+
+ new_distance = llmax(new_distance, min_zoom);
+
+ // Don't zoom too far back
+ const F32 DIST_FUDGE = 16.f; // meters
+ F32 max_distance = llmin(mDrawDistance - DIST_FUDGE,
+ LLWorld::getInstance()->getRegionWidthInMeters() - DIST_FUDGE );
+
+ if (new_distance > max_distance)
+ {
+ // Unless camera is unlocked
+ if (!gSavedSettings.getBOOL("DisableCameraConstraints"))
+ {
+ return;
+ }
+ }
+
+ if( CAMERA_MODE_CUSTOMIZE_AVATAR == getCameraMode() )
+ {
+ new_distance = llclamp( new_distance, APPEARANCE_MIN_ZOOM, APPEARANCE_MAX_ZOOM );
+ }
+
+ // Compute new camera offset
+ mCameraFocusOffsetTarget = new_distance * camera_offset_unit;
+ cameraZoomIn(1.f);
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// cameraPanIn()
+//-----------------------------------------------------------------------------
+void LLAgentCamera::cameraPanIn(F32 meters)
+{
+ LLVector3d at_axis;
+ at_axis.setVec(LLViewerCamera::getInstance()->getAtAxis());
+
+ mFocusTargetGlobal += meters * at_axis;
+ mFocusGlobal = mFocusTargetGlobal;
+ // don't enforce zoom constraints as this is the only way for users to get past them easily
+ updateFocusOffset();
+ // NOTE: panning movements expect the camera to move exactly with the focus target, not animated behind -Nyx
+ mCameraSmoothingLastPositionGlobal = calcCameraPositionTargetGlobal();
+}
+
+//-----------------------------------------------------------------------------
+// cameraPanLeft()
+//-----------------------------------------------------------------------------
+void LLAgentCamera::cameraPanLeft(F32 meters)
+{
+ LLVector3d left_axis;
+ left_axis.setVec(LLViewerCamera::getInstance()->getLeftAxis());
+
+ mFocusTargetGlobal += meters * left_axis;
+ mFocusGlobal = mFocusTargetGlobal;
+
+ // disable smoothing for camera pan, which causes some residents unhappiness
+ mCameraSmoothingStop = true;
+
+ cameraZoomIn(1.f);
+ updateFocusOffset();
+ // NOTE: panning movements expect the camera to move exactly with the focus target, not animated behind - Nyx
+ mCameraSmoothingLastPositionGlobal = calcCameraPositionTargetGlobal();
+}
+
+//-----------------------------------------------------------------------------
+// cameraPanUp()
+//-----------------------------------------------------------------------------
+void LLAgentCamera::cameraPanUp(F32 meters)
+{
+ LLVector3d up_axis;
+ up_axis.setVec(LLViewerCamera::getInstance()->getUpAxis());
+
+ mFocusTargetGlobal += meters * up_axis;
+ mFocusGlobal = mFocusTargetGlobal;
+
+ // disable smoothing for camera pan, which causes some residents unhappiness
+ mCameraSmoothingStop = true;
+
+ cameraZoomIn(1.f);
+ updateFocusOffset();
+ // NOTE: panning movements expect the camera to move exactly with the focus target, not animated behind -Nyx
+ mCameraSmoothingLastPositionGlobal = calcCameraPositionTargetGlobal();
+}
+
+//-----------------------------------------------------------------------------
+// updateLookAt()
+//-----------------------------------------------------------------------------
+void LLAgentCamera::updateLookAt(const S32 mouse_x, const S32 mouse_y)
+{
+ static LLVector3 last_at_axis;
+
+ if (!isAgentAvatarValid()) return;
+
+ LLQuaternion av_inv_rot = ~gAgentAvatarp->mRoot.getWorldRotation();
+ LLVector3 root_at = LLVector3::x_axis * gAgentAvatarp->mRoot.getWorldRotation();
+
+ if ((gViewerWindow->getMouseVelocityStat()->getCurrent() < 0.01f) &&
+ (root_at * last_at_axis > 0.95f))
+ {
+ LLVector3 vel = gAgentAvatarp->getVelocity();
+ if (vel.magVecSquared() > 4.f)
+ {
+ setLookAt(LOOKAT_TARGET_IDLE, gAgentAvatarp, vel * av_inv_rot);
+ }
+ else
+ {
+ // *FIX: rotate mframeagent by sit object's rotation?
+ LLQuaternion look_rotation = gAgentAvatarp->isSitting() ? gAgentAvatarp->getRenderRotation() : gAgent.getFrameAgent().getQuaternion(); // use camera's current rotation
+ LLVector3 look_offset = LLVector3(2.f, 0.f, 0.f) * look_rotation * av_inv_rot;
+ setLookAt(LOOKAT_TARGET_IDLE, gAgentAvatarp, look_offset);
+ }
+ last_at_axis = root_at;
+ return;
+ }
+
+ last_at_axis = root_at;
+
+ if (CAMERA_MODE_CUSTOMIZE_AVATAR == getCameraMode())
+ {
+ setLookAt(LOOKAT_TARGET_NONE, gAgentAvatarp, LLVector3(-2.f, 0.f, 0.f));
+ }
+ else
+ {
+ // Move head based on cursor position
+ ELookAtType lookAtType = LOOKAT_TARGET_NONE;
+ LLVector3 headLookAxis;
+ LLCoordFrame frameCamera = *((LLCoordFrame*)LLViewerCamera::getInstance());
+
+ if (cameraMouselook())
+ {
+ lookAtType = LOOKAT_TARGET_MOUSELOOK;
+ }
+ else if (cameraThirdPerson())
+ {
+ // range from -.5 to .5
+ F32 x_from_center =
+ ((F32) mouse_x / (F32) gViewerWindow->getWorldViewWidthScaled() ) - 0.5f;
+ F32 y_from_center =
+ ((F32) mouse_y / (F32) gViewerWindow->getWorldViewHeightScaled() ) - 0.5f;
+
+ frameCamera.yaw( - x_from_center * gSavedSettings.getF32("YawFromMousePosition") * DEG_TO_RAD);
+ frameCamera.pitch( - y_from_center * gSavedSettings.getF32("PitchFromMousePosition") * DEG_TO_RAD);
+ lookAtType = LOOKAT_TARGET_FREELOOK;
+ }
+
+ headLookAxis = frameCamera.getAtAxis();
+ // RN: we use world-space offset for mouselook and freelook
+ //headLookAxis = headLookAxis * av_inv_rot;
+ setLookAt(lookAtType, gAgentAvatarp, headLookAxis);
+ }
+}
+
+//-----------------------------------------------------------------------------
+// updateCamera()
+//-----------------------------------------------------------------------------
+void LLAgentCamera::updateCamera()
+{
+ static LLFastTimer::DeclareTimer ftm("Camera");
+ LLFastTimer t(ftm);
+
+ //Ventrella - changed camera_skyward to the new global "mCameraUpVector"
+ mCameraUpVector = LLVector3::z_axis;
+ //LLVector3 camera_skyward(0.f, 0.f, 1.f);
+ //end Ventrella
+
+ U32 camera_mode = mCameraAnimating ? mLastCameraMode : mCameraMode;
+
+ validateFocusObject();
+
+ if (isAgentAvatarValid() &&
+ gAgentAvatarp->isSitting() &&
+ camera_mode == CAMERA_MODE_MOUSELOOK)
+ {
+ //Ventrella
+ //changed camera_skyward to the new global "mCameraUpVector"
+ mCameraUpVector = mCameraUpVector * gAgentAvatarp->getRenderRotation();
+ //end Ventrella
+ }
+
+ if (cameraThirdPerson() && mFocusOnAvatar && LLFollowCamMgr::getActiveFollowCamParams())
+ {
+ changeCameraToFollow();
+ }
+
+ //Ventrella
+ //NOTE - this needs to be integrated into a general upVector system here within llAgent.
+ if ( camera_mode == CAMERA_MODE_FOLLOW && mFocusOnAvatar )
+ {
+ mCameraUpVector = mFollowCam.getUpVector();
+ }
+ //end Ventrella
+
+ if (mSitCameraEnabled)
+ {
+ if (mSitCameraReferenceObject->isDead())
+ {
+ setSitCamera(LLUUID::null);
+ }
+ }
+
+ // Update UI with our camera inputs
+ LLFloaterCamera* camera_floater = LLFloaterReg::findTypedInstance<LLFloaterCamera>("camera");
+ if (camera_floater)
+ {
+ camera_floater->mRotate->setToggleState(gAgentCamera.getOrbitRightKey() > 0.f, // left
+ gAgentCamera.getOrbitUpKey() > 0.f, // top
+ gAgentCamera.getOrbitLeftKey() > 0.f, // right
+ gAgentCamera.getOrbitDownKey() > 0.f); // bottom
+
+ camera_floater->mTrack->setToggleState(gAgentCamera.getPanLeftKey() > 0.f, // left
+ gAgentCamera.getPanUpKey() > 0.f, // top
+ gAgentCamera.getPanRightKey() > 0.f, // right
+ gAgentCamera.getPanDownKey() > 0.f); // bottom
+ }
+
+ // Handle camera movement based on keyboard.
+ const F32 ORBIT_OVER_RATE = 90.f * DEG_TO_RAD; // radians per second
+ const F32 ORBIT_AROUND_RATE = 90.f * DEG_TO_RAD; // radians per second
+ const F32 PAN_RATE = 5.f; // meters per second
+
+ if (gAgentCamera.getOrbitUpKey() || gAgentCamera.getOrbitDownKey())
+ {
+ F32 input_rate = gAgentCamera.getOrbitUpKey() - gAgentCamera.getOrbitDownKey();
+ cameraOrbitOver( input_rate * ORBIT_OVER_RATE / gFPSClamped );
+ }
+
+ if (gAgentCamera.getOrbitLeftKey() || gAgentCamera.getOrbitRightKey())
+ {
+ F32 input_rate = gAgentCamera.getOrbitLeftKey() - gAgentCamera.getOrbitRightKey();
+ cameraOrbitAround(input_rate * ORBIT_AROUND_RATE / gFPSClamped);
+ }
+
+ if (gAgentCamera.getOrbitInKey() || gAgentCamera.getOrbitOutKey())
+ {
+ F32 input_rate = gAgentCamera.getOrbitInKey() - gAgentCamera.getOrbitOutKey();
+
+ LLVector3d to_focus = gAgent.getPosGlobalFromAgent(LLViewerCamera::getInstance()->getOrigin()) - calcFocusPositionTargetGlobal();
+ F32 distance_to_focus = (F32)to_focus.magVec();
+ // Move at distance (in meters) meters per second
+ cameraOrbitIn( input_rate * distance_to_focus / gFPSClamped );
+ }
+
+ if (gAgentCamera.getPanInKey() || gAgentCamera.getPanOutKey())
+ {
+ F32 input_rate = gAgentCamera.getPanInKey() - gAgentCamera.getPanOutKey();
+ cameraPanIn(input_rate * PAN_RATE / gFPSClamped);
+ }
+
+ if (gAgentCamera.getPanRightKey() || gAgentCamera.getPanLeftKey())
+ {
+ F32 input_rate = gAgentCamera.getPanRightKey() - gAgentCamera.getPanLeftKey();
+ cameraPanLeft(input_rate * -PAN_RATE / gFPSClamped );
+ }
+
+ if (gAgentCamera.getPanUpKey() || gAgentCamera.getPanDownKey())
+ {
+ F32 input_rate = gAgentCamera.getPanUpKey() - gAgentCamera.getPanDownKey();
+ cameraPanUp(input_rate * PAN_RATE / gFPSClamped );
+ }
+
+ // Clear camera keyboard keys.
+ gAgentCamera.clearOrbitKeys();
+ gAgentCamera.clearPanKeys();
+
+ // lerp camera focus offset
+ mCameraFocusOffset = lerp(mCameraFocusOffset, mCameraFocusOffsetTarget, LLCriticalDamp::getInterpolant(CAMERA_FOCUS_HALF_LIFE));
+
+ //Ventrella
+ if ( mCameraMode == CAMERA_MODE_FOLLOW )
+ {
+ if (isAgentAvatarValid())
+ {
+ //--------------------------------------------------------------------------------
+ // this is where the avatar's position and rotation are given to followCam, and
+ // where it is updated. All three of its attributes are updated: (1) position,
+ // (2) focus, and (3) upvector. They can then be queried elsewhere in llAgent.
+ //--------------------------------------------------------------------------------
+ // *TODO: use combined rotation of frameagent and sit object
+ LLQuaternion avatarRotationForFollowCam = gAgentAvatarp->isSitting() ? gAgentAvatarp->getRenderRotation() : gAgent.getFrameAgent().getQuaternion();
+
+ LLFollowCamParams* current_cam = LLFollowCamMgr::getActiveFollowCamParams();
+ if (current_cam)
+ {
+ mFollowCam.copyParams(*current_cam);
+ mFollowCam.setSubjectPositionAndRotation( gAgentAvatarp->getRenderPosition(), avatarRotationForFollowCam );
+ mFollowCam.update();
+ LLViewerJoystick::getInstance()->setCameraNeedsUpdate(true);
+ }
+ else
+ {
+ changeCameraToThirdPerson(TRUE);
+ }
+ }
+ }
+ // end Ventrella
+
+ BOOL hit_limit;
+ LLVector3d camera_pos_global;
+ LLVector3d camera_target_global = calcCameraPositionTargetGlobal(&hit_limit);
+ mCameraVirtualPositionAgent = gAgent.getPosAgentFromGlobal(camera_target_global);
+ LLVector3d focus_target_global = calcFocusPositionTargetGlobal();
+
+ // perform field of view correction
+ mCameraFOVZoomFactor = calcCameraFOVZoomFactor();
+ camera_target_global = focus_target_global + (camera_target_global - focus_target_global) * (1.f + mCameraFOVZoomFactor);
+
+ gAgent.setShowAvatar(TRUE); // can see avatar by default
+
+ // Adjust position for animation
+ if (mCameraAnimating)
+ {
+ F32 time = mAnimationTimer.getElapsedTimeF32();
+
+ // yet another instance of critically damped motion, hooray!
+ // F32 fraction_of_animation = 1.f - pow(2.f, -time / CAMERA_ZOOM_HALF_LIFE);
+
+ // linear interpolation
+ F32 fraction_of_animation = time / mAnimationDuration;
+
+ BOOL isfirstPerson = mCameraMode == CAMERA_MODE_MOUSELOOK;
+ BOOL wasfirstPerson = mLastCameraMode == CAMERA_MODE_MOUSELOOK;
+ F32 fraction_animation_to_skip;
+
+ if (mAnimationCameraStartGlobal == camera_target_global)
+ {
+ fraction_animation_to_skip = 0.f;
+ }
+ else
+ {
+ LLVector3d cam_delta = mAnimationCameraStartGlobal - camera_target_global;
+ fraction_animation_to_skip = HEAD_BUFFER_SIZE / (F32)cam_delta.magVec();
+ }
+ F32 animation_start_fraction = (wasfirstPerson) ? fraction_animation_to_skip : 0.f;
+ F32 animation_finish_fraction = (isfirstPerson) ? (1.f - fraction_animation_to_skip) : 1.f;
+
+ if (fraction_of_animation < animation_finish_fraction)
+ {
+ if (fraction_of_animation < animation_start_fraction || fraction_of_animation > animation_finish_fraction )
+ {
+ gAgent.setShowAvatar(FALSE);
+ }
+
+ // ...adjust position for animation
+ F32 smooth_fraction_of_animation = llsmoothstep(0.0f, 1.0f, fraction_of_animation);
+ camera_pos_global = lerp(mAnimationCameraStartGlobal, camera_target_global, smooth_fraction_of_animation);
+ mFocusGlobal = lerp(mAnimationFocusStartGlobal, focus_target_global, smooth_fraction_of_animation);
+ }
+ else
+ {
+ // ...animation complete
+ mCameraAnimating = FALSE;
+
+ camera_pos_global = camera_target_global;
+ mFocusGlobal = focus_target_global;
+
+ gAgent.endAnimationUpdateUI();
+ gAgent.setShowAvatar(TRUE);
+ }
+
+ if (isAgentAvatarValid() && (mCameraMode != CAMERA_MODE_MOUSELOOK))
+ {
+ gAgentAvatarp->updateAttachmentVisibility(mCameraMode);
+ }
+ }
+ else
+ {
+ camera_pos_global = camera_target_global;
+ mFocusGlobal = focus_target_global;
+ gAgent.setShowAvatar(TRUE);
+ }
+
+ // smoothing
+ if (TRUE)
+ {
+ LLVector3d agent_pos = gAgent.getPositionGlobal();
+ LLVector3d camera_pos_agent = camera_pos_global - agent_pos;
+ // Sitting on what you're manipulating can cause camera jitter with smoothing.
+ // This turns off smoothing while editing. -MG
+ bool in_build_mode = LLToolMgr::getInstance()->inBuildMode();
+ mCameraSmoothingStop = mCameraSmoothingStop || in_build_mode;
+
+ if (cameraThirdPerson() && !mCameraSmoothingStop)
+ {
+ const F32 SMOOTHING_HALF_LIFE = 0.02f;
+
+ F32 smoothing = LLCriticalDamp::getInterpolant(gSavedSettings.getF32("CameraPositionSmoothing") * SMOOTHING_HALF_LIFE, FALSE);
+
+ if (!mFocusObject) // we differentiate on avatar mode
+ {
+ // for avatar-relative focus, we smooth in avatar space -
+ // the avatar moves too jerkily w/r/t global space to smooth there.
+
+ LLVector3d delta = camera_pos_agent - mCameraSmoothingLastPositionAgent;
+ if (delta.magVec() < MAX_CAMERA_SMOOTH_DISTANCE) // only smooth over short distances please
+ {
+ camera_pos_agent = lerp(mCameraSmoothingLastPositionAgent, camera_pos_agent, smoothing);
+ camera_pos_global = camera_pos_agent + agent_pos;
+ }
+ }
+ else
+ {
+ LLVector3d delta = camera_pos_global - mCameraSmoothingLastPositionGlobal;
+ if (delta.magVec() < MAX_CAMERA_SMOOTH_DISTANCE) // only smooth over short distances please
+ {
+ camera_pos_global = lerp(mCameraSmoothingLastPositionGlobal, camera_pos_global, smoothing);
+ }
+ }
+ }
+
+ mCameraSmoothingLastPositionGlobal = camera_pos_global;
+ mCameraSmoothingLastPositionAgent = camera_pos_agent;
+ mCameraSmoothingStop = false;
+ }
+
+
+ mCameraCurrentFOVZoomFactor = lerp(mCameraCurrentFOVZoomFactor, mCameraFOVZoomFactor, LLCriticalDamp::getInterpolant(FOV_ZOOM_HALF_LIFE));
+
+// llinfos << "Current FOV Zoom: " << mCameraCurrentFOVZoomFactor << " Target FOV Zoom: " << mCameraFOVZoomFactor << " Object penetration: " << mFocusObjectDist << llendl;
+
+ F32 ui_offset = 0.f;
+ if( CAMERA_MODE_CUSTOMIZE_AVATAR == mCameraMode )
+ {
+ ui_offset = calcCustomizeAvatarUIOffset( camera_pos_global );
+ }
+
+
+ LLVector3 focus_agent = gAgent.getPosAgentFromGlobal(mFocusGlobal);
+
+ mCameraPositionAgent = gAgent.getPosAgentFromGlobal(camera_pos_global);
+
+ // Move the camera
+
+ //Ventrella
+ LLViewerCamera::getInstance()->updateCameraLocation(mCameraPositionAgent, mCameraUpVector, focus_agent);
+ //LLViewerCamera::getInstance()->updateCameraLocation(mCameraPositionAgent, camera_skyward, focus_agent);
+ //end Ventrella
+
+ //RN: translate UI offset after camera is oriented properly
+ LLViewerCamera::getInstance()->translate(LLViewerCamera::getInstance()->getLeftAxis() * ui_offset);
+
+ // Change FOV
+ LLViewerCamera::getInstance()->setView(LLViewerCamera::getInstance()->getDefaultFOV() / (1.f + mCameraCurrentFOVZoomFactor));
+
+ // follow camera when in customize mode
+ if (cameraCustomizeAvatar())
+ {
+ setLookAt(LOOKAT_TARGET_FOCUS, NULL, mCameraPositionAgent);
+ }
+
+ // update the travel distance stat
+ // this isn't directly related to the camera
+ // but this seemed like the best place to do this
+ LLVector3d global_pos = gAgent.getPositionGlobal();
+ if (!gAgent.getLastPositionGlobal().isExactlyZero())
+ {
+ LLVector3d delta = global_pos - gAgent.getLastPositionGlobal();
+ gAgent.setDistanceTraveled(gAgent.getDistanceTraveled() + delta.magVec());
+ }
+ gAgent.setLastPositionGlobal(global_pos);
+
+ if (LLVOAvatar::sVisibleInFirstPerson && isAgentAvatarValid() && !gAgentAvatarp->isSitting() && cameraMouselook())
+ {
+ LLVector3 head_pos = gAgentAvatarp->mHeadp->getWorldPosition() +
+ LLVector3(0.08f, 0.f, 0.05f) * gAgentAvatarp->mHeadp->getWorldRotation() +
+ LLVector3(0.1f, 0.f, 0.f) * gAgentAvatarp->mPelvisp->getWorldRotation();
+ LLVector3 diff = mCameraPositionAgent - head_pos;
+ diff = diff * ~gAgentAvatarp->mRoot.getWorldRotation();
+
+ LLJoint* torso_joint = gAgentAvatarp->mTorsop;
+ LLJoint* chest_joint = gAgentAvatarp->mChestp;
+ LLVector3 torso_scale = torso_joint->getScale();
+ LLVector3 chest_scale = chest_joint->getScale();
+
+ // shorten avatar skeleton to avoid foot interpenetration
+ if (!gAgentAvatarp->mInAir)
+ {
+ LLVector3 chest_offset = LLVector3(0.f, 0.f, chest_joint->getPosition().mV[VZ]) * torso_joint->getWorldRotation();
+ F32 z_compensate = llclamp(-diff.mV[VZ], -0.2f, 1.f);
+ F32 scale_factor = llclamp(1.f - ((z_compensate * 0.5f) / chest_offset.mV[VZ]), 0.5f, 1.2f);
+ torso_joint->setScale(LLVector3(1.f, 1.f, scale_factor));
+
+ LLJoint* neck_joint = gAgentAvatarp->mNeckp;
+ LLVector3 neck_offset = LLVector3(0.f, 0.f, neck_joint->getPosition().mV[VZ]) * chest_joint->getWorldRotation();
+ scale_factor = llclamp(1.f - ((z_compensate * 0.5f) / neck_offset.mV[VZ]), 0.5f, 1.2f);
+ chest_joint->setScale(LLVector3(1.f, 1.f, scale_factor));
+ diff.mV[VZ] = 0.f;
+ }
+
+ gAgentAvatarp->mPelvisp->setPosition(gAgentAvatarp->mPelvisp->getPosition() + diff);
+
+ gAgentAvatarp->mRoot.updateWorldMatrixChildren();
+
+ for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin();
+ iter != gAgentAvatarp->mAttachmentPoints.end(); )
+ {
+ LLVOAvatar::attachment_map_t::iterator curiter = iter++;
+ LLViewerJointAttachment* attachment = curiter->second;
+ for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
+ attachment_iter != attachment->mAttachedObjects.end();
+ ++attachment_iter)
+ {
+ LLViewerObject *attached_object = (*attachment_iter);
+ if (attached_object && !attached_object->isDead() && attached_object->mDrawable.notNull())
+ {
+ // clear any existing "early" movements of attachment
+ attached_object->mDrawable->clearState(LLDrawable::EARLY_MOVE);
+ gPipeline.updateMoveNormalAsync(attached_object->mDrawable);
+ attached_object->updateText();
+ }
+ }
+ }
+
+ torso_joint->setScale(torso_scale);
+ chest_joint->setScale(chest_scale);
+ }
+}
+
+void LLAgentCamera::updateLastCamera()
+{
+ mLastCameraMode = mCameraMode;
+}
+
+void LLAgentCamera::updateFocusOffset()
+{
+ validateFocusObject();
+ if (mFocusObject.notNull())
+ {
+ LLVector3d obj_pos = gAgent.getPosGlobalFromAgent(mFocusObject->getRenderPosition());
+ mFocusObjectOffset.setVec(mFocusTargetGlobal - obj_pos);
+ }
+}
+
+void LLAgentCamera::validateFocusObject()
+{
+ if (mFocusObject.notNull() &&
+ mFocusObject->isDead())
+ {
+ mFocusObjectOffset.clearVec();
+ clearFocusObject();
+ mCameraFOVZoomFactor = 0.f;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// calcCustomizeAvatarUIOffset()
+//-----------------------------------------------------------------------------
+F32 LLAgentCamera::calcCustomizeAvatarUIOffset(const LLVector3d& camera_pos_global)
+{
+ F32 ui_offset = 0.f;
+
+ F32 range = (F32)dist_vec(camera_pos_global, getFocusGlobal());
+ mUIOffset = lerp(mUIOffset, ui_offset, LLCriticalDamp::getInterpolant(0.05f));
+ return mUIOffset * range;
+}
+
+//-----------------------------------------------------------------------------
+// calcFocusPositionTargetGlobal()
+//-----------------------------------------------------------------------------
+LLVector3d LLAgentCamera::calcFocusPositionTargetGlobal()
+{
+ if (mFocusObject.notNull() && mFocusObject->isDead())
+ {
+ clearFocusObject();
+ }
+
+ // Ventrella
+ if (mCameraMode == CAMERA_MODE_FOLLOW && mFocusOnAvatar)
+ {
+ mFocusTargetGlobal = gAgent.getPosGlobalFromAgent(mFollowCam.getSimulatedFocus());
+ return mFocusTargetGlobal;
+ }// End Ventrella
+ else if (mCameraMode == CAMERA_MODE_MOUSELOOK)
+ {
+ LLVector3d at_axis(1.0, 0.0, 0.0);
+ LLQuaternion agent_rot = gAgent.getFrameAgent().getQuaternion();
+ if (isAgentAvatarValid() && gAgentAvatarp->getParent())
+ {
+ LLViewerObject* root_object = (LLViewerObject*)gAgentAvatarp->getRoot();
+ if (!root_object->flagCameraDecoupled())
+ {
+ agent_rot *= ((LLViewerObject*)(gAgentAvatarp->getParent()))->getRenderRotation();
+ }
+ }
+ at_axis = at_axis * agent_rot;
+ mFocusTargetGlobal = calcCameraPositionTargetGlobal() + at_axis;
+ return mFocusTargetGlobal;
+ }
+ else if (mCameraMode == CAMERA_MODE_CUSTOMIZE_AVATAR)
+ {
+ return mFocusTargetGlobal;
+ }
+ else if (!mFocusOnAvatar)
+ {
+ if (mFocusObject.notNull() && !mFocusObject->isDead() && mFocusObject->mDrawable.notNull())
+ {
+ LLDrawable* drawablep = mFocusObject->mDrawable;
+
+ if (mTrackFocusObject &&
+ drawablep &&
+ drawablep->isActive())
+ {
+ if (!mFocusObject->isAvatar())
+ {
+ if (mFocusObject->isSelected())
+ {
+ gPipeline.updateMoveNormalAsync(drawablep);
+ }
+ else
+ {
+ if (drawablep->isState(LLDrawable::MOVE_UNDAMPED))
+ {
+ gPipeline.updateMoveNormalAsync(drawablep);
+ }
+ else
+ {
+ gPipeline.updateMoveDampedAsync(drawablep);
+ }
+ }
+ }
+ }
+ // if not tracking object, update offset based on new object position
+ else
+ {
+ updateFocusOffset();
+ }
+ LLVector3 focus_agent = mFocusObject->getRenderPosition() + mFocusObjectOffset;
+ mFocusTargetGlobal.setVec(gAgent.getPosGlobalFromAgent(focus_agent));
+ }
+ return mFocusTargetGlobal;
+ }
+ else if (mSitCameraEnabled && isAgentAvatarValid() && gAgentAvatarp->isSitting() && mSitCameraReferenceObject.notNull())
+ {
+ // sit camera
+ LLVector3 object_pos = mSitCameraReferenceObject->getRenderPosition();
+ LLQuaternion object_rot = mSitCameraReferenceObject->getRenderRotation();
+
+ LLVector3 target_pos = object_pos + (mSitCameraFocus * object_rot);
+ return gAgent.getPosGlobalFromAgent(target_pos);
+ }
+ else
+ {
+ return gAgent.getPositionGlobal() + calcThirdPersonFocusOffset();
+ }
+}
+
+LLVector3d LLAgentCamera::calcThirdPersonFocusOffset()
+{
+ // ...offset from avatar
+ LLVector3d focus_offset;
+ LLQuaternion agent_rot = gAgent.getFrameAgent().getQuaternion();
+ if (isAgentAvatarValid() && gAgentAvatarp->getParent())
+ {
+ agent_rot *= ((LLViewerObject*)(gAgentAvatarp->getParent()))->getRenderRotation();
+ }
+
+ focus_offset = convert_from_llsd<LLVector3d>(mFocusOffsetInitial[mCameraPreset]->get(), TYPE_VEC3D, "");
+ return focus_offset * agent_rot;
+}
+
+void LLAgentCamera::setupSitCamera()
+{
+ // agent frame entering this function is in world coordinates
+ if (isAgentAvatarValid() && gAgentAvatarp->getParent())
+ {
+ LLQuaternion parent_rot = ((LLViewerObject*)gAgentAvatarp->getParent())->getRenderRotation();
+ // slam agent coordinate frame to proper parent local version
+ LLVector3 at_axis = gAgent.getFrameAgent().getAtAxis();
+ at_axis.mV[VZ] = 0.f;
+ at_axis.normalize();
+ gAgent.resetAxes(at_axis * ~parent_rot);
+ }
+}
+
+//-----------------------------------------------------------------------------
+// getCameraPositionAgent()
+//-----------------------------------------------------------------------------
+const LLVector3 &LLAgentCamera::getCameraPositionAgent() const
+{
+ return LLViewerCamera::getInstance()->getOrigin();
+}
+
+//-----------------------------------------------------------------------------
+// getCameraPositionGlobal()
+//-----------------------------------------------------------------------------
+LLVector3d LLAgentCamera::getCameraPositionGlobal() const
+{
+ return gAgent.getPosGlobalFromAgent(LLViewerCamera::getInstance()->getOrigin());
+}
+
+//-----------------------------------------------------------------------------
+// calcCameraFOVZoomFactor()
+//-----------------------------------------------------------------------------
+F32 LLAgentCamera::calcCameraFOVZoomFactor()
+{
+ LLVector3 camera_offset_dir;
+ camera_offset_dir.setVec(mCameraFocusOffset);
+
+ if (mCameraMode == CAMERA_MODE_MOUSELOOK)
+ {
+ return 0.f;
+ }
+ else if (mFocusObject.notNull() && !mFocusObject->isAvatar() && !mFocusOnAvatar)
+ {
+ // don't FOV zoom on mostly transparent objects
+ LLVector3 focus_offset = mFocusObjectOffset;
+ F32 obj_min_dist = 0.f;
+ calcCameraMinDistance(obj_min_dist);
+ F32 current_distance = llmax(0.001f, camera_offset_dir.magVec());
+
+ mFocusObjectDist = obj_min_dist - current_distance;
+
+ F32 new_fov_zoom = llclamp(mFocusObjectDist / current_distance, 0.f, 1000.f);
+ return new_fov_zoom;
+ }
+ else // focusing on land or avatar
+ {
+ // keep old field of view until user changes focus explicitly
+ return mCameraFOVZoomFactor;
+ //return 0.f;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// calcCameraPositionTargetGlobal()
+//-----------------------------------------------------------------------------
+LLVector3d LLAgentCamera::calcCameraPositionTargetGlobal(BOOL *hit_limit)
+{
+ // Compute base camera position and look-at points.
+ F32 camera_land_height;
+ LLVector3d frame_center_global = !isAgentAvatarValid() ?
+ gAgent.getPositionGlobal() :
+ gAgent.getPosGlobalFromAgent(gAgentAvatarp->mRoot.getWorldPosition());
+
+ BOOL isConstrained = FALSE;
+ LLVector3d head_offset;
+ head_offset.setVec(mThirdPersonHeadOffset);
+
+ LLVector3d camera_position_global;
+
+ // Ventrella
+ if (mCameraMode == CAMERA_MODE_FOLLOW && mFocusOnAvatar)
+ {
+ camera_position_global = gAgent.getPosGlobalFromAgent(mFollowCam.getSimulatedPosition());
+ }// End Ventrella
+ else if (mCameraMode == CAMERA_MODE_MOUSELOOK)
+ {
+ if (!isAgentAvatarValid() || gAgentAvatarp->mDrawable.isNull())
+ {
+ llwarns << "Null avatar drawable!" << llendl;
+ return LLVector3d::zero;
+ }
+ head_offset.clearVec();
+ if (gAgentAvatarp->isSitting() && gAgentAvatarp->getParent())
+ {
+ gAgentAvatarp->updateHeadOffset();
+ head_offset.mdV[VX] = gAgentAvatarp->mHeadOffset.mV[VX];
+ head_offset.mdV[VY] = gAgentAvatarp->mHeadOffset.mV[VY];
+ head_offset.mdV[VZ] = gAgentAvatarp->mHeadOffset.mV[VZ] + 0.1f;
+ const LLMatrix4& mat = ((LLViewerObject*) gAgentAvatarp->getParent())->getRenderMatrix();
+ camera_position_global = gAgent.getPosGlobalFromAgent
+ ((gAgentAvatarp->getPosition()+
+ LLVector3(head_offset)*gAgentAvatarp->getRotation()) * mat);
+ }
+ else
+ {
+ head_offset.mdV[VZ] = gAgentAvatarp->mHeadOffset.mV[VZ];
+ if (gAgentAvatarp->isSitting())
+ {
+ head_offset.mdV[VZ] += 0.1;
+ }
+ camera_position_global = gAgent.getPosGlobalFromAgent(gAgentAvatarp->getRenderPosition());//frame_center_global;
+ head_offset = head_offset * gAgentAvatarp->getRenderRotation();
+ camera_position_global = camera_position_global + head_offset;
+ }
+ }
+ else if (mCameraMode == CAMERA_MODE_THIRD_PERSON && mFocusOnAvatar)
+ {
+ LLVector3 local_camera_offset;
+ F32 camera_distance = 0.f;
+
+ if (mSitCameraEnabled
+ && isAgentAvatarValid()
+ && gAgentAvatarp->isSitting()
+ && mSitCameraReferenceObject.notNull())
+ {
+ // sit camera
+ LLVector3 object_pos = mSitCameraReferenceObject->getRenderPosition();
+ LLQuaternion object_rot = mSitCameraReferenceObject->getRenderRotation();
+
+ LLVector3 target_pos = object_pos + (mSitCameraPos * object_rot);
+
+ camera_position_global = gAgent.getPosGlobalFromAgent(target_pos);
+ }
+ else
+ {
+ local_camera_offset = mCameraZoomFraction * getCameraOffsetInitial() * gSavedSettings.getF32("CameraOffsetScale");
+
+ // are we sitting down?
+ if (isAgentAvatarValid() && gAgentAvatarp->getParent())
+ {
+ LLQuaternion parent_rot = ((LLViewerObject*)gAgentAvatarp->getParent())->getRenderRotation();
+ // slam agent coordinate frame to proper parent local version
+ LLVector3 at_axis = gAgent.getFrameAgent().getAtAxis() * parent_rot;
+ at_axis.mV[VZ] = 0.f;
+ at_axis.normalize();
+ gAgent.resetAxes(at_axis * ~parent_rot);
+
+ local_camera_offset = local_camera_offset * gAgent.getFrameAgent().getQuaternion() * parent_rot;
+ }
+ else
+ {
+ local_camera_offset = gAgent.getFrameAgent().rotateToAbsolute( local_camera_offset );
+ }
+
+ if (!mCameraCollidePlane.isExactlyZero() && (!isAgentAvatarValid() || !gAgentAvatarp->isSitting()))
+ {
+ LLVector3 plane_normal;
+ plane_normal.setVec(mCameraCollidePlane.mV);
+
+ F32 offset_dot_norm = local_camera_offset * plane_normal;
+ if (llabs(offset_dot_norm) < 0.001f)
+ {
+ offset_dot_norm = 0.001f;
+ }
+
+ camera_distance = local_camera_offset.normalize();
+
+ F32 pos_dot_norm = gAgent.getPosAgentFromGlobal(frame_center_global + head_offset) * plane_normal;
+
+ // if agent is outside the colliding half-plane
+ if (pos_dot_norm > mCameraCollidePlane.mV[VW])
+ {
+ // check to see if camera is on the opposite side (inside) the half-plane
+ if (offset_dot_norm + pos_dot_norm < mCameraCollidePlane.mV[VW])
+ {
+ // diminish offset by factor to push it back outside the half-plane
+ camera_distance *= (pos_dot_norm - mCameraCollidePlane.mV[VW] - CAMERA_COLLIDE_EPSILON) / -offset_dot_norm;
+ }
+ }
+ else
+ {
+ if (offset_dot_norm + pos_dot_norm > mCameraCollidePlane.mV[VW])
+ {
+ camera_distance *= (mCameraCollidePlane.mV[VW] - pos_dot_norm - CAMERA_COLLIDE_EPSILON) / offset_dot_norm;
+ }
+ }
+ }
+ else
+ {
+ camera_distance = local_camera_offset.normalize();
+ }
+
+ mTargetCameraDistance = llmax(camera_distance, MIN_CAMERA_DISTANCE);
+
+ if (mTargetCameraDistance != mCurrentCameraDistance)
+ {
+ F32 camera_lerp_amt = LLCriticalDamp::getInterpolant(CAMERA_ZOOM_HALF_LIFE);
+
+ mCurrentCameraDistance = lerp(mCurrentCameraDistance, mTargetCameraDistance, camera_lerp_amt);
+ }
+
+ // Make the camera distance current
+ local_camera_offset *= mCurrentCameraDistance;
+
+ // set the global camera position
+ LLVector3d camera_offset;
+
+ LLVector3 av_pos = !isAgentAvatarValid() ? LLVector3::zero : gAgentAvatarp->getRenderPosition();
+ camera_offset.setVec( local_camera_offset );
+ camera_position_global = frame_center_global + head_offset + camera_offset;
+
+ if (isAgentAvatarValid())
+ {
+ LLVector3d camera_lag_d;
+ F32 lag_interp = LLCriticalDamp::getInterpolant(CAMERA_LAG_HALF_LIFE);
+ LLVector3 target_lag;
+ LLVector3 vel = gAgent.getVelocity();
+
+ // lag by appropriate amount for flying
+ F32 time_in_air = gAgentAvatarp->mTimeInAir.getElapsedTimeF32();
+ if(!mCameraAnimating && gAgentAvatarp->mInAir && time_in_air > GROUND_TO_AIR_CAMERA_TRANSITION_START_TIME)
+ {
+ LLVector3 frame_at_axis = gAgent.getFrameAgent().getAtAxis();
+ frame_at_axis -= projected_vec(frame_at_axis, gAgent.getReferenceUpVector());
+ frame_at_axis.normalize();
+
+ //transition smoothly in air mode, to avoid camera pop
+ F32 u = (time_in_air - GROUND_TO_AIR_CAMERA_TRANSITION_START_TIME) / GROUND_TO_AIR_CAMERA_TRANSITION_TIME;
+ u = llclamp(u, 0.f, 1.f);
+
+ lag_interp *= u;
+
+ if (gViewerWindow->getLeftMouseDown() && gViewerWindow->getLastPick().mObjectID == gAgentAvatarp->getID())
+ {
+ // disable camera lag when using mouse-directed steering
+ target_lag.clearVec();
+ }
+ else
+ {
+ target_lag = vel * gSavedSettings.getF32("DynamicCameraStrength") / 30.f;
+ }
+
+ mCameraLag = lerp(mCameraLag, target_lag, lag_interp);
+
+ F32 lag_dist = mCameraLag.magVec();
+ if (lag_dist > MAX_CAMERA_LAG)
+ {
+ mCameraLag = mCameraLag * MAX_CAMERA_LAG / lag_dist;
+ }
+
+ // clamp camera lag so that avatar is always in front
+ F32 dot = (mCameraLag - (frame_at_axis * (MIN_CAMERA_LAG * u))) * frame_at_axis;
+ if (dot < -(MIN_CAMERA_LAG * u))
+ {
+ mCameraLag -= (dot + (MIN_CAMERA_LAG * u)) * frame_at_axis;
+ }
+ }
+ else
+ {
+ mCameraLag = lerp(mCameraLag, LLVector3::zero, LLCriticalDamp::getInterpolant(0.15f));
+ }
+
+ camera_lag_d.setVec(mCameraLag);
+ camera_position_global = camera_position_global - camera_lag_d;
+ }
+ }
+ }
+ else
+ {
+ LLVector3d focusPosGlobal = calcFocusPositionTargetGlobal();
+ // camera gets pushed out later wrt mCameraFOVZoomFactor...this is "raw" value
+ camera_position_global = focusPosGlobal + mCameraFocusOffset;
+ }
+
+ if (!gSavedSettings.getBOOL("DisableCameraConstraints") && !gAgent.isGodlike())
+ {
+ LLViewerRegion* regionp = LLWorld::getInstance()->getRegionFromPosGlobal(camera_position_global);
+ bool constrain = true;
+ if(regionp && regionp->canManageEstate())
+ {
+ constrain = false;
+ }
+ if(constrain)
+ {
+ F32 max_dist = (CAMERA_MODE_CUSTOMIZE_AVATAR == mCameraMode) ? APPEARANCE_MAX_ZOOM : mDrawDistance;
+
+ LLVector3d camera_offset = camera_position_global - gAgent.getPositionGlobal();
+ F32 camera_distance = (F32)camera_offset.magVec();
+
+ if(camera_distance > max_dist)
+ {
+ camera_position_global = gAgent.getPositionGlobal() + (max_dist/camera_distance)*camera_offset;
+ isConstrained = TRUE;
+ }
+ }
+
+// JC - Could constrain camera based on parcel stuff here.
+// LLViewerRegion *regionp = LLWorld::getInstance()->getRegionFromPosGlobal(camera_position_global);
+//
+// if (regionp && !regionp->mParcelOverlay->isBuildCameraAllowed(regionp->getPosRegionFromGlobal(camera_position_global)))
+// {
+// camera_position_global = last_position_global;
+//
+// isConstrained = TRUE;
+// }
+ }
+
+ // Don't let camera go underground
+ F32 camera_min_off_ground = getCameraMinOffGround();
+
+ camera_land_height = LLWorld::getInstance()->resolveLandHeightGlobal(camera_position_global);
+
+ if (camera_position_global.mdV[VZ] < camera_land_height + camera_min_off_ground)
+ {
+ camera_position_global.mdV[VZ] = camera_land_height + camera_min_off_ground;
+ isConstrained = TRUE;
+ }
+
+
+ if (hit_limit)
+ {
+ *hit_limit = isConstrained;
+ }
+
+ return camera_position_global;
+}
+
+
+LLVector3 LLAgentCamera::getCameraOffsetInitial()
+{
+ return convert_from_llsd<LLVector3>(mCameraOffsetInitial[mCameraPreset]->get(), TYPE_VEC3, "");
+}
+
+
+//-----------------------------------------------------------------------------
+// handleScrollWheel()
+//-----------------------------------------------------------------------------
+void LLAgentCamera::handleScrollWheel(S32 clicks)
+{
+ if (mCameraMode == CAMERA_MODE_FOLLOW && getFocusOnAvatar())
+ {
+ if (!mFollowCam.getPositionLocked()) // not if the followCam position is locked in place
+ {
+ mFollowCam.zoom(clicks);
+ if (mFollowCam.isZoomedToMinimumDistance())
+ {
+ changeCameraToMouselook(FALSE);
+ }
+ }
+ }
+ else
+ {
+ LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
+ const F32 ROOT_ROOT_TWO = sqrt(F_SQRT2);
+
+ // Block if camera is animating
+ if (mCameraAnimating)
+ {
+ return;
+ }
+
+ if (selection->getObjectCount() && selection->getSelectType() == SELECT_TYPE_HUD)
+ {
+ F32 zoom_factor = (F32)pow(0.8, -clicks);
+ cameraZoomIn(zoom_factor);
+ }
+ else if (mFocusOnAvatar && (mCameraMode == CAMERA_MODE_THIRD_PERSON))
+ {
+ F32 camera_offset_initial_mag = getCameraOffsetInitial().magVec();
+
+ F32 current_zoom_fraction = mTargetCameraDistance / (camera_offset_initial_mag * gSavedSettings.getF32("CameraOffsetScale"));
+ current_zoom_fraction *= 1.f - pow(ROOT_ROOT_TWO, clicks);
+
+ cameraOrbitIn(current_zoom_fraction * camera_offset_initial_mag * gSavedSettings.getF32("CameraOffsetScale"));
+ }
+ else
+ {
+ F32 current_zoom_fraction = (F32)mCameraFocusOffsetTarget.magVec();
+ cameraOrbitIn(current_zoom_fraction * (1.f - pow(ROOT_ROOT_TWO, clicks)));
+ }
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// getCameraMinOffGround()
+//-----------------------------------------------------------------------------
+F32 LLAgentCamera::getCameraMinOffGround()
+{
+ if (mCameraMode == CAMERA_MODE_MOUSELOOK)
+ {
+ return 0.f;
+ }
+ else
+ {
+ if (gSavedSettings.getBOOL("DisableCameraConstraints"))
+ {
+ return -1000.f;
+ }
+ else
+ {
+ return 0.5f;
+ }
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// resetCamera()
+//-----------------------------------------------------------------------------
+void LLAgentCamera::resetCamera()
+{
+ // Remove any pitch from the avatar
+ LLVector3 at = gAgent.getFrameAgent().getAtAxis();
+ at.mV[VZ] = 0.f;
+ at.normalize();
+ gAgent.resetAxes(at);
+ // have to explicitly clear field of view zoom now
+ mCameraFOVZoomFactor = 0.f;
+
+ updateCamera();
+}
+
+//-----------------------------------------------------------------------------
+// changeCameraToMouselook()
+//-----------------------------------------------------------------------------
+void LLAgentCamera::changeCameraToMouselook(BOOL animate)
+{
+ if (LLViewerJoystick::getInstance()->getOverrideCamera())
+ {
+ return;
+ }
+
+ // visibility changes at end of animation
+ gViewerWindow->getWindow()->resetBusyCount();
+
+ // Menus should not remain open on switching to mouselook...
+ LLMenuGL::sMenuContainer->hideMenus();
+
+ // unpause avatar animation
+ gAgent.unpauseAnimation();
+
+ LLToolMgr::getInstance()->setCurrentToolset(gMouselookToolset);
+
+ if (isAgentAvatarValid())
+ {
+ gAgentAvatarp->stopMotion(ANIM_AGENT_BODY_NOISE);
+ gAgentAvatarp->stopMotion(ANIM_AGENT_BREATHE_ROT);
+ }
+
+ //gViewerWindow->stopGrab();
+ LLSelectMgr::getInstance()->deselectAll();
+ gViewerWindow->hideCursor();
+ gViewerWindow->moveCursorToCenter();
+
+ if (mCameraMode != CAMERA_MODE_MOUSELOOK)
+ {
+ gFocusMgr.setKeyboardFocus(NULL);
+
+ updateLastCamera();
+ mCameraMode = CAMERA_MODE_MOUSELOOK;
+ const U32 old_flags = gAgent.getControlFlags();
+ gAgent.setControlFlags(AGENT_CONTROL_MOUSELOOK);
+ if (old_flags != gAgent.getControlFlags())
+ {
+ gAgent.setFlagsDirty();
+ }
+
+ if (animate)
+ {
+ startCameraAnimation();
+ }
+ else
+ {
+ mCameraAnimating = FALSE;
+ gAgent.endAnimationUpdateUI();
+ }
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// changeCameraToDefault()
+//-----------------------------------------------------------------------------
+void LLAgentCamera::changeCameraToDefault()
+{
+ if (LLViewerJoystick::getInstance()->getOverrideCamera())
+ {
+ return;
+ }
+
+ if (LLFollowCamMgr::getActiveFollowCamParams())
+ {
+ changeCameraToFollow();
+ }
+ else
+ {
+ changeCameraToThirdPerson();
+ }
+}
+
+
+// Ventrella
+//-----------------------------------------------------------------------------
+// changeCameraToFollow()
+//-----------------------------------------------------------------------------
+void LLAgentCamera::changeCameraToFollow(BOOL animate)
+{
+ if (LLViewerJoystick::getInstance()->getOverrideCamera())
+ {
+ return;
+ }
+
+ if(mCameraMode != CAMERA_MODE_FOLLOW)
+ {
+ if (mCameraMode == CAMERA_MODE_MOUSELOOK)
+ {
+ animate = FALSE;
+ }
+ startCameraAnimation();
+
+ updateLastCamera();
+ mCameraMode = CAMERA_MODE_FOLLOW;
+
+ // bang-in the current focus, position, and up vector of the follow cam
+ mFollowCam.reset(mCameraPositionAgent, LLViewerCamera::getInstance()->getPointOfInterest(), LLVector3::z_axis);
+
+ if (gBasicToolset)
+ {
+ LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
+ }
+
+ if (isAgentAvatarValid())
+ {
+ gAgentAvatarp->mPelvisp->setPosition(LLVector3::zero);
+ gAgentAvatarp->startMotion( ANIM_AGENT_BODY_NOISE );
+ gAgentAvatarp->startMotion( ANIM_AGENT_BREATHE_ROT );
+ }
+
+ // unpause avatar animation
+ gAgent.unpauseAnimation();
+
+ const U32 old_flags = gAgent.getControlFlags();
+ gAgent.clearControlFlags(AGENT_CONTROL_MOUSELOOK);
+ if (old_flags != gAgent.getControlFlags())
+ {
+ gAgent.setFlagsDirty();
+ }
+
+ if (animate)
+ {
+ startCameraAnimation();
+ }
+ else
+ {
+ mCameraAnimating = FALSE;
+ gAgent.endAnimationUpdateUI();
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// changeCameraToThirdPerson()
+//-----------------------------------------------------------------------------
+void LLAgentCamera::changeCameraToThirdPerson(BOOL animate)
+{
+ if (LLViewerJoystick::getInstance()->getOverrideCamera())
+ {
+ return;
+ }
+
+ gViewerWindow->getWindow()->resetBusyCount();
+
+ mCameraZoomFraction = INITIAL_ZOOM_FRACTION;
+
+ if (isAgentAvatarValid())
+ {
+ if (!gAgentAvatarp->isSitting())
+ {
+ gAgentAvatarp->mPelvisp->setPosition(LLVector3::zero);
+ }
+ gAgentAvatarp->startMotion(ANIM_AGENT_BODY_NOISE);
+ gAgentAvatarp->startMotion(ANIM_AGENT_BREATHE_ROT);
+ }
+
+ LLVector3 at_axis;
+
+ // unpause avatar animation
+ gAgent.unpauseAnimation();
+
+ if (mCameraMode != CAMERA_MODE_THIRD_PERSON)
+ {
+ if (gBasicToolset)
+ {
+ LLToolMgr::getInstance()->setCurrentToolset(gBasicToolset);
+ }
+
+ mCameraLag.clearVec();
+ if (mCameraMode == CAMERA_MODE_MOUSELOOK)
+ {
+ mCurrentCameraDistance = MIN_CAMERA_DISTANCE;
+ mTargetCameraDistance = MIN_CAMERA_DISTANCE;
+ animate = FALSE;
+ }
+ updateLastCamera();
+ mCameraMode = CAMERA_MODE_THIRD_PERSON;
+ const U32 old_flags = gAgent.getControlFlags();
+ gAgent.clearControlFlags(AGENT_CONTROL_MOUSELOOK);
+ if (old_flags != gAgent.getControlFlags())
+ {
+ gAgent.setFlagsDirty();
+ }
+
+ }
+
+ // Remove any pitch from the avatar
+ if (isAgentAvatarValid() && gAgentAvatarp->getParent())
+ {
+ LLQuaternion obj_rot = ((LLViewerObject*)gAgentAvatarp->getParent())->getRenderRotation();
+ at_axis = LLViewerCamera::getInstance()->getAtAxis();
+ at_axis.mV[VZ] = 0.f;
+ at_axis.normalize();
+ gAgent.resetAxes(at_axis * ~obj_rot);
+ }
+ else
+ {
+ at_axis = gAgent.getFrameAgent().getAtAxis();
+ at_axis.mV[VZ] = 0.f;
+ at_axis.normalize();
+ gAgent.resetAxes(at_axis);
+ }
+
+
+ if (animate)
+ {
+ startCameraAnimation();
+ }
+ else
+ {
+ mCameraAnimating = FALSE;
+ gAgent.endAnimationUpdateUI();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// changeCameraToCustomizeAvatar()
+//-----------------------------------------------------------------------------
+void LLAgentCamera::changeCameraToCustomizeAvatar(BOOL avatar_animate, BOOL camera_animate)
+{
+ if (LLViewerJoystick::getInstance()->getOverrideCamera())
+ {
+ return;
+ }
+
+ gAgent.standUp(); // force stand up
+ gViewerWindow->getWindow()->resetBusyCount();
+
+ if (gFaceEditToolset)
+ {
+ LLToolMgr::getInstance()->setCurrentToolset(gFaceEditToolset);
+ }
+
+ if (camera_animate)
+ {
+ startCameraAnimation();
+ }
+
+ if (mCameraMode != CAMERA_MODE_CUSTOMIZE_AVATAR)
+ {
+ updateLastCamera();
+ mCameraMode = CAMERA_MODE_CUSTOMIZE_AVATAR;
+ const U32 old_flags = gAgent.getControlFlags();
+ gAgent.clearControlFlags(AGENT_CONTROL_MOUSELOOK);
+ if (old_flags != gAgent.getControlFlags())
+ {
+ gAgent.setFlagsDirty();
+ }
+
+ gFocusMgr.setKeyboardFocus( NULL );
+ gFocusMgr.setMouseCapture( NULL );
+
+ LLVOAvatarSelf::onCustomizeStart();
+ }
+
+ if (isAgentAvatarValid())
+ {
+ if(avatar_animate)
+ {
+ // slamming the avatar's axis to the camera so that when the rotation
+ // completes it correctly points to the front of the avatar
+ // Remove any pitch or rotation from the avatar
+ LLVector3 at = LLViewerCamera::getInstance()->getAtAxis();
+ at.mV[VZ] = 0.f;
+ at.normalize();
+ gAgent.resetAxes(at);
+
+ gAgent.sendAnimationRequest(ANIM_AGENT_CUSTOMIZE, ANIM_REQUEST_START);
+ gAgent.setCustomAnim(TRUE);
+ gAgentAvatarp->startMotion(ANIM_AGENT_CUSTOMIZE);
+ LLMotion* turn_motion = gAgentAvatarp->findMotion(ANIM_AGENT_CUSTOMIZE);
+
+ if (turn_motion)
+ {
+ mAnimationDuration = turn_motion->getDuration() + CUSTOMIZE_AVATAR_CAMERA_ANIM_SLOP;
+
+ }
+ else
+ {
+ mAnimationDuration = gSavedSettings.getF32("ZoomTime");
+ }
+ }
+
+ // this is what sets the avatar as the mFocusTargetGlobal
+ setFocusGlobal(LLVector3d::zero);
+
+ gAgentAvatarp->updateMeshTextures();
+ }
+ else
+ {
+ mCameraAnimating = FALSE;
+ gAgent.endAnimationUpdateUI();
+ }
+}
+
+
+void LLAgentCamera::switchCameraPreset(ECameraPreset preset)
+{
+ //zoom is supposed to be reset for the front and group views
+ mCameraZoomFraction = 1.f;
+
+ //focusing on avatar in that case means following him on movements
+ mFocusOnAvatar = TRUE;
+
+ mCameraPreset = preset;
+
+ gSavedSettings.setU32("CameraPreset", mCameraPreset);
+}
+
+
+//
+// Focus point management
+//
+
+//-----------------------------------------------------------------------------
+// startCameraAnimation()
+//-----------------------------------------------------------------------------
+void LLAgentCamera::startCameraAnimation()
+{
+ mAnimationCameraStartGlobal = getCameraPositionGlobal();
+ mAnimationFocusStartGlobal = mFocusGlobal;
+ mAnimationTimer.reset();
+ mCameraAnimating = TRUE;
+ mAnimationDuration = gSavedSettings.getF32("ZoomTime");
+}
+
+//-----------------------------------------------------------------------------
+// stopCameraAnimation()
+//-----------------------------------------------------------------------------
+void LLAgentCamera::stopCameraAnimation()
+{
+ mCameraAnimating = FALSE;
+}
+
+void LLAgentCamera::clearFocusObject()
+{
+ if (mFocusObject.notNull())
+ {
+ startCameraAnimation();
+
+ setFocusObject(NULL);
+ mFocusObjectOffset.clearVec();
+ }
+}
+
+void LLAgentCamera::setFocusObject(LLViewerObject* object)
+{
+ mFocusObject = object;
+}
+
+// Focus on a point, but try to keep camera position stable.
+//-----------------------------------------------------------------------------
+// setFocusGlobal()
+//-----------------------------------------------------------------------------
+void LLAgentCamera::setFocusGlobal(const LLPickInfo& pick)
+{
+ LLViewerObject* objectp = gObjectList.findObject(pick.mObjectID);
+
+ if (objectp)
+ {
+ // focus on object plus designated offset
+ // which may or may not be same as pick.mPosGlobal
+ setFocusGlobal(objectp->getPositionGlobal() + LLVector3d(pick.mObjectOffset), pick.mObjectID);
+ }
+ else
+ {
+ // focus directly on point where user clicked
+ setFocusGlobal(pick.mPosGlobal, pick.mObjectID);
+ }
+}
+
+
+void LLAgentCamera::setFocusGlobal(const LLVector3d& focus, const LLUUID &object_id)
+{
+ setFocusObject(gObjectList.findObject(object_id));
+ LLVector3d old_focus = mFocusTargetGlobal;
+ LLViewerObject *focus_obj = mFocusObject;
+
+ // if focus has changed
+ if (old_focus != focus)
+ {
+ if (focus.isExactlyZero())
+ {
+ if (isAgentAvatarValid())
+ {
+ mFocusTargetGlobal = gAgent.getPosGlobalFromAgent(gAgentAvatarp->mHeadp->getWorldPosition());
+ }
+ else
+ {
+ mFocusTargetGlobal = gAgent.getPositionGlobal();
+ }
+ mCameraFocusOffsetTarget = getCameraPositionGlobal() - mFocusTargetGlobal;
+ mCameraFocusOffset = mCameraFocusOffsetTarget;
+ setLookAt(LOOKAT_TARGET_CLEAR);
+ }
+ else
+ {
+ mFocusTargetGlobal = focus;
+ if (!focus_obj)
+ {
+ mCameraFOVZoomFactor = 0.f;
+ }
+
+ mCameraFocusOffsetTarget = gAgent.getPosGlobalFromAgent(mCameraVirtualPositionAgent) - mFocusTargetGlobal;
+
+ startCameraAnimation();
+
+ if (focus_obj)
+ {
+ if (focus_obj->isAvatar())
+ {
+ setLookAt(LOOKAT_TARGET_FOCUS, focus_obj);
+ }
+ else
+ {
+ setLookAt(LOOKAT_TARGET_FOCUS, focus_obj, (gAgent.getPosAgentFromGlobal(focus) - focus_obj->getRenderPosition()) * ~focus_obj->getRenderRotation());
+ }
+ }
+ else
+ {
+ setLookAt(LOOKAT_TARGET_FOCUS, NULL, gAgent.getPosAgentFromGlobal(mFocusTargetGlobal));
+ }
+ }
+ }
+ else // focus == mFocusTargetGlobal
+ {
+ if (focus.isExactlyZero())
+ {
+ if (isAgentAvatarValid())
+ {
+ mFocusTargetGlobal = gAgent.getPosGlobalFromAgent(gAgentAvatarp->mHeadp->getWorldPosition());
+ }
+ else
+ {
+ mFocusTargetGlobal = gAgent.getPositionGlobal();
+ }
+ }
+ mCameraFocusOffsetTarget = (getCameraPositionGlobal() - mFocusTargetGlobal) / (1.f + mCameraFOVZoomFactor);;
+ mCameraFocusOffset = mCameraFocusOffsetTarget;
+ }
+
+ if (mFocusObject.notNull())
+ {
+ // for attachments, make offset relative to avatar, not the attachment
+ if (mFocusObject->isAttachment())
+ {
+ while (mFocusObject.notNull() && !mFocusObject->isAvatar())
+ {
+ mFocusObject = (LLViewerObject*) mFocusObject->getParent();
+ }
+ setFocusObject((LLViewerObject*)mFocusObject);
+ }
+ updateFocusOffset();
+ }
+}
+
+// Used for avatar customization
+//-----------------------------------------------------------------------------
+// setCameraPosAndFocusGlobal()
+//-----------------------------------------------------------------------------
+void LLAgentCamera::setCameraPosAndFocusGlobal(const LLVector3d& camera_pos, const LLVector3d& focus, const LLUUID &object_id)
+{
+ LLVector3d old_focus = mFocusTargetGlobal;
+
+ F64 focus_delta_squared = (old_focus - focus).magVecSquared();
+ const F64 ANIM_EPSILON_SQUARED = 0.0001;
+ if (focus_delta_squared > ANIM_EPSILON_SQUARED)
+ {
+ startCameraAnimation();
+
+ if (CAMERA_MODE_CUSTOMIZE_AVATAR == mCameraMode)
+ {
+ // Compensate for the fact that the camera has already been offset to make room for LLFloaterCustomize.
+ mAnimationCameraStartGlobal -= LLVector3d(LLViewerCamera::getInstance()->getLeftAxis() * calcCustomizeAvatarUIOffset( mAnimationCameraStartGlobal ));
+ }
+ }
+
+ //LLViewerCamera::getInstance()->setOrigin( gAgent.getPosAgentFromGlobal( camera_pos ) );
+ setFocusObject(gObjectList.findObject(object_id));
+ mFocusTargetGlobal = focus;
+ mCameraFocusOffsetTarget = camera_pos - focus;
+ mCameraFocusOffset = mCameraFocusOffsetTarget;
+
+ if (mFocusObject)
+ {
+ if (mFocusObject->isAvatar())
+ {
+ setLookAt(LOOKAT_TARGET_FOCUS, mFocusObject);
+ }
+ else
+ {
+ setLookAt(LOOKAT_TARGET_FOCUS, mFocusObject, (gAgent.getPosAgentFromGlobal(focus) - mFocusObject->getRenderPosition()) * ~mFocusObject->getRenderRotation());
+ }
+ }
+ else
+ {
+ setLookAt(LOOKAT_TARGET_FOCUS, NULL, gAgent.getPosAgentFromGlobal(mFocusTargetGlobal));
+ }
+
+ if (mCameraAnimating)
+ {
+ const F64 ANIM_METERS_PER_SECOND = 10.0;
+ const F64 MIN_ANIM_SECONDS = 0.5;
+ const F64 MAX_ANIM_SECONDS = 10.0;
+ F64 anim_duration = llmax( MIN_ANIM_SECONDS, sqrt(focus_delta_squared) / ANIM_METERS_PER_SECOND );
+ anim_duration = llmin( anim_duration, MAX_ANIM_SECONDS );
+ setAnimationDuration( (F32)anim_duration );
+ }
+
+ updateFocusOffset();
+}
+
+//-----------------------------------------------------------------------------
+// setSitCamera()
+//-----------------------------------------------------------------------------
+void LLAgentCamera::setSitCamera(const LLUUID &object_id, const LLVector3 &camera_pos, const LLVector3 &camera_focus)
+{
+ BOOL camera_enabled = !object_id.isNull();
+
+ if (camera_enabled)
+ {
+ LLViewerObject *reference_object = gObjectList.findObject(object_id);
+ if (reference_object)
+ {
+ //convert to root object relative?
+ mSitCameraPos = camera_pos;
+ mSitCameraFocus = camera_focus;
+ mSitCameraReferenceObject = reference_object;
+ mSitCameraEnabled = TRUE;
+ }
+ }
+ else
+ {
+ mSitCameraPos.clearVec();
+ mSitCameraFocus.clearVec();
+ mSitCameraReferenceObject = NULL;
+ mSitCameraEnabled = FALSE;
+ }
+}
+
+//-----------------------------------------------------------------------------
+// setFocusOnAvatar()
+//-----------------------------------------------------------------------------
+void LLAgentCamera::setFocusOnAvatar(BOOL focus_on_avatar, BOOL animate)
+{
+ if (focus_on_avatar != mFocusOnAvatar)
+ {
+ if (animate)
+ {
+ startCameraAnimation();
+ }
+ else
+ {
+ stopCameraAnimation();
+ }
+ }
+
+ //RN: when focused on the avatar, we're not "looking" at it
+ // looking implies intent while focusing on avatar means
+ // you're just walking around with a camera on you...eesh.
+ if (!mFocusOnAvatar && focus_on_avatar)
+ {
+ setFocusGlobal(LLVector3d::zero);
+ mCameraFOVZoomFactor = 0.f;
+ if (mCameraMode == CAMERA_MODE_THIRD_PERSON)
+ {
+ LLVector3 at_axis;
+ if (isAgentAvatarValid() && gAgentAvatarp->getParent())
+ {
+ LLQuaternion obj_rot = ((LLViewerObject*)gAgentAvatarp->getParent())->getRenderRotation();
+ at_axis = LLViewerCamera::getInstance()->getAtAxis();
+ at_axis.mV[VZ] = 0.f;
+ at_axis.normalize();
+ gAgent.resetAxes(at_axis * ~obj_rot);
+ }
+ else
+ {
+ at_axis = LLViewerCamera::getInstance()->getAtAxis();
+ at_axis.mV[VZ] = 0.f;
+ at_axis.normalize();
+ gAgent.resetAxes(at_axis);
+ }
+ }
+ }
+ // unlocking camera from avatar
+ else if (mFocusOnAvatar && !focus_on_avatar)
+ {
+ // keep camera focus point consistent, even though it is now unlocked
+ setFocusGlobal(gAgent.getPositionGlobal() + calcThirdPersonFocusOffset(), gAgent.getID());
+ }
+
+ mFocusOnAvatar = focus_on_avatar;
+}
+
+
+BOOL LLAgentCamera::setLookAt(ELookAtType target_type, LLViewerObject *object, LLVector3 position)
+{
+ if(object && object->isAttachment())
+ {
+ LLViewerObject* parent = object;
+ while(parent)
+ {
+ if (parent == gAgentAvatarp)
+ {
+ // looking at an attachment on ourselves, which we don't want to do
+ object = gAgentAvatarp;
+ position.clearVec();
+ }
+ parent = (LLViewerObject*)parent->getParent();
+ }
+ }
+ if(!mLookAt || mLookAt->isDead())
+ {
+ mLookAt = (LLHUDEffectLookAt *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_LOOKAT);
+ mLookAt->setSourceObject(gAgentAvatarp);
+ }
+
+ return mLookAt->setLookAt(target_type, object, position);
+}
+
+//-----------------------------------------------------------------------------
+// lookAtLastChat()
+//-----------------------------------------------------------------------------
+void LLAgentCamera::lookAtLastChat()
+{
+ // Block if camera is animating or not in normal third person camera mode
+ if (mCameraAnimating || !cameraThirdPerson())
+ {
+ return;
+ }
+
+ LLViewerObject *chatter = gObjectList.findObject(gAgent.getLastChatter());
+ if (!chatter)
+ {
+ return;
+ }
+
+ LLVector3 delta_pos;
+ if (chatter->isAvatar())
+ {
+ LLVOAvatar *chatter_av = (LLVOAvatar*)chatter;
+ if (isAgentAvatarValid() && chatter_av->mHeadp)
+ {
+ delta_pos = chatter_av->mHeadp->getWorldPosition() - gAgentAvatarp->mHeadp->getWorldPosition();
+ }
+ else
+ {
+ delta_pos = chatter->getPositionAgent() - gAgent.getPositionAgent();
+ }
+ delta_pos.normalize();
+
+ gAgent.setControlFlags(AGENT_CONTROL_STOP);
+
+ changeCameraToThirdPerson();
+
+ LLVector3 new_camera_pos = gAgentAvatarp->mHeadp->getWorldPosition();
+ LLVector3 left = delta_pos % LLVector3::z_axis;
+ left.normalize();
+ LLVector3 up = left % delta_pos;
+ up.normalize();
+ new_camera_pos -= delta_pos * 0.4f;
+ new_camera_pos += left * 0.3f;
+ new_camera_pos += up * 0.2f;
+ if (chatter_av->mHeadp)
+ {
+ setFocusGlobal(gAgent.getPosGlobalFromAgent(chatter_av->mHeadp->getWorldPosition()), gAgent.getLastChatter());
+ mCameraFocusOffsetTarget = gAgent.getPosGlobalFromAgent(new_camera_pos) - gAgent.getPosGlobalFromAgent(chatter_av->mHeadp->getWorldPosition());
+ }
+ else
+ {
+ setFocusGlobal(chatter->getPositionGlobal(), gAgent.getLastChatter());
+ mCameraFocusOffsetTarget = gAgent.getPosGlobalFromAgent(new_camera_pos) - chatter->getPositionGlobal();
+ }
+ setFocusOnAvatar(FALSE, TRUE);
+ }
+ else
+ {
+ delta_pos = chatter->getRenderPosition() - gAgent.getPositionAgent();
+ delta_pos.normalize();
+
+ gAgent.setControlFlags(AGENT_CONTROL_STOP);
+
+ changeCameraToThirdPerson();
+
+ LLVector3 new_camera_pos = gAgentAvatarp->mHeadp->getWorldPosition();
+ LLVector3 left = delta_pos % LLVector3::z_axis;
+ left.normalize();
+ LLVector3 up = left % delta_pos;
+ up.normalize();
+ new_camera_pos -= delta_pos * 0.4f;
+ new_camera_pos += left * 0.3f;
+ new_camera_pos += up * 0.2f;
+
+ setFocusGlobal(chatter->getPositionGlobal(), gAgent.getLastChatter());
+ mCameraFocusOffsetTarget = gAgent.getPosGlobalFromAgent(new_camera_pos) - chatter->getPositionGlobal();
+ setFocusOnAvatar(FALSE, TRUE);
+ }
+}
+
+BOOL LLAgentCamera::setPointAt(EPointAtType target_type, LLViewerObject *object, LLVector3 position)
+{
+ // disallow pointing at attachments and avatars
+ if (object && (object->isAttachment() || object->isAvatar()))
+ {
+ return FALSE;
+ }
+ if (!mPointAt || mPointAt->isDead())
+ {
+ mPointAt = (LLHUDEffectPointAt *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINTAT);
+ mPointAt->setSourceObject(gAgentAvatarp);
+ }
+ return mPointAt->setPointAt(target_type, object, position);
+}
+
+ELookAtType LLAgentCamera::getLookAtType()
+{
+ if (mLookAt)
+ {
+ return mLookAt->getLookAtType();
+ }
+ return LOOKAT_TARGET_NONE;
+}
+
+EPointAtType LLAgentCamera::getPointAtType()
+{
+ if (mPointAt)
+ {
+ return mPointAt->getPointAtType();
+ }
+ return POINTAT_TARGET_NONE;
+}
+
+void LLAgentCamera::clearGeneralKeys()
+{
+ mAtKey = 0;
+ mWalkKey = 0;
+ mLeftKey = 0;
+ mUpKey = 0;
+ mYawKey = 0.f;
+ mPitchKey = 0.f;
+}
+
+void LLAgentCamera::clearOrbitKeys()
+{
+ mOrbitLeftKey = 0.f;
+ mOrbitRightKey = 0.f;
+ mOrbitUpKey = 0.f;
+ mOrbitDownKey = 0.f;
+ mOrbitInKey = 0.f;
+ mOrbitOutKey = 0.f;
+}
+
+void LLAgentCamera::clearPanKeys()
+{
+ mPanRightKey = 0.f;
+ mPanLeftKey = 0.f;
+ mPanUpKey = 0.f;
+ mPanDownKey = 0.f;
+ mPanInKey = 0.f;
+ mPanOutKey = 0.f;
+}
+
+// static
+S32 LLAgentCamera::directionToKey(S32 direction)
+{
+ if (direction > 0) return 1;
+ if (direction < 0) return -1;
+ return 0;
+}
+
+
+// EOF
+
diff --git a/indra/newview/llagentcamera.h b/indra/newview/llagentcamera.h
new file mode 100644
index 0000000000..7afb5c0ed9
--- /dev/null
+++ b/indra/newview/llagentcamera.h
@@ -0,0 +1,401 @@
+/**
+ * @file llagent.h
+ * @brief LLAgent class header file
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLAGENTCAMERA_H
+#define LL_LLAGENTCAMERA_H
+
+#include "llfollowcam.h" // Ventrella
+#include "llhudeffectlookat.h" // EPointAtType
+#include "llhudeffectpointat.h" // ELookAtType
+
+class LLPickInfo;
+class LLVOAvatarSelf;
+class LLControlVariable;
+
+//--------------------------------------------------------------------
+// Types
+//--------------------------------------------------------------------
+enum ECameraMode
+{
+ CAMERA_MODE_THIRD_PERSON,
+ CAMERA_MODE_MOUSELOOK,
+ CAMERA_MODE_CUSTOMIZE_AVATAR,
+ CAMERA_MODE_FOLLOW
+};
+
+/** Camera Presets for CAMERA_MODE_THIRD_PERSON */
+enum ECameraPreset
+{
+ /** Default preset, what the Third Person Mode actually was */
+ CAMERA_PRESET_REAR_VIEW,
+
+ /** "Looking at the Avatar from the front" */
+ CAMERA_PRESET_FRONT_VIEW,
+
+ /** "Above and to the left, over the shoulder, pulled back a little on the zoom" */
+ CAMERA_PRESET_GROUP_VIEW
+};
+
+//------------------------------------------------------------------------
+// LLAgentCamera
+//------------------------------------------------------------------------
+class LLAgentCamera
+{
+ LOG_CLASS(LLAgentCamera);
+
+public:
+ //--------------------------------------------------------------------
+ // Constructors / Destructors
+ //--------------------------------------------------------------------
+public:
+ LLAgentCamera();
+ virtual ~LLAgentCamera();
+ void init();
+ void cleanup();
+ void setAvatarObject(LLVOAvatarSelf* avatar);
+private:
+ bool mInitialized;
+
+
+ //--------------------------------------------------------------------
+ // Mode
+ //--------------------------------------------------------------------
+public:
+ void changeCameraToDefault();
+ void changeCameraToMouselook(BOOL animate = TRUE);
+ void changeCameraToThirdPerson(BOOL animate = TRUE);
+ void changeCameraToCustomizeAvatar(BOOL avatar_animate = TRUE, BOOL camera_animate = TRUE); // Trigger transition animation
+ void changeCameraToFollow(BOOL animate = TRUE); // Ventrella
+ BOOL cameraThirdPerson() const { return (mCameraMode == CAMERA_MODE_THIRD_PERSON && mLastCameraMode == CAMERA_MODE_THIRD_PERSON); }
+ BOOL cameraMouselook() const { return (mCameraMode == CAMERA_MODE_MOUSELOOK && mLastCameraMode == CAMERA_MODE_MOUSELOOK); }
+ BOOL cameraCustomizeAvatar() const { return (mCameraMode == CAMERA_MODE_CUSTOMIZE_AVATAR /*&& !mCameraAnimating*/); }
+ BOOL cameraFollow() const { return (mCameraMode == CAMERA_MODE_FOLLOW && mLastCameraMode == CAMERA_MODE_FOLLOW); }
+ ECameraMode getCameraMode() const { return mCameraMode; }
+ ECameraMode getLastCameraMode() const { return mLastCameraMode; }
+ void updateCamera(); // Call once per frame to update camera location/orientation
+ void resetCamera(); // Slam camera into its default position
+ void updateLastCamera(); // Set last camera to current camera
+
+private:
+ ECameraMode mCameraMode; // Target mode after transition animation is done
+ ECameraMode mLastCameraMode;
+
+ //--------------------------------------------------------------------
+ // Preset
+ //--------------------------------------------------------------------
+public:
+ void switchCameraPreset(ECameraPreset preset);
+private:
+ /** Determines default camera offset depending on the current camera preset */
+ LLVector3 getCameraOffsetInitial();
+
+ /** Camera preset in Third Person Mode */
+ ECameraPreset mCameraPreset;
+
+ /** Initial camera offsets */
+ std::map<ECameraPreset, LLPointer<LLControlVariable> > mCameraOffsetInitial;
+
+ /** Initial focus offsets */
+ std::map<ECameraPreset, LLPointer<LLControlVariable> > mFocusOffsetInitial;
+
+ //--------------------------------------------------------------------
+ // Position
+ //--------------------------------------------------------------------
+public:
+ LLVector3d getCameraPositionGlobal() const;
+ const LLVector3 &getCameraPositionAgent() const;
+ LLVector3d calcCameraPositionTargetGlobal(BOOL *hit_limit = NULL); // Calculate the camera position target
+ F32 getCameraMinOffGround(); // Minimum height off ground for this mode, meters
+ void setCameraCollidePlane(const LLVector4 &plane) { mCameraCollidePlane = plane; }
+ BOOL calcCameraMinDistance(F32 &obj_min_distance);
+ F32 calcCustomizeAvatarUIOffset(const LLVector3d& camera_pos_global);
+ F32 getCurrentCameraBuildOffset() { return (F32)mCameraFocusOffset.length(); }
+ void clearCameraLag() { mCameraLag.clearVec(); }
+private:
+ F32 mCurrentCameraDistance; // Current camera offset from avatar
+ F32 mTargetCameraDistance; // Target camera offset from avatar
+ F32 mCameraFOVZoomFactor; // Amount of fov zoom applied to camera when zeroing in on an object
+ F32 mCameraCurrentFOVZoomFactor; // Interpolated fov zoom
+ F32 mCameraFOVDefault; // Default field of view that is basis for FOV zoom effect
+ LLVector4 mCameraCollidePlane; // Colliding plane for camera
+ F32 mCameraZoomFraction; // Mousewheel driven fraction of zoom
+ LLVector3 mCameraPositionAgent; // Camera position in agent coordinates
+ LLVector3 mCameraVirtualPositionAgent; // Camera virtual position (target) before performing FOV zoom
+ LLVector3d mCameraSmoothingLastPositionGlobal;
+ LLVector3d mCameraSmoothingLastPositionAgent;
+ bool mCameraSmoothingStop;
+ LLVector3 mCameraLag; // Third person camera lag
+ LLVector3 mCameraUpVector; // Camera's up direction in world coordinates (determines the 'roll' of the view)
+
+ //--------------------------------------------------------------------
+ // Follow
+ //--------------------------------------------------------------------
+public:
+ void setUsingFollowCam(bool using_follow_cam);
+private:
+ LLFollowCam mFollowCam; // Ventrella
+
+ //--------------------------------------------------------------------
+ // Sit
+ //--------------------------------------------------------------------
+public:
+ void setupSitCamera();
+ BOOL sitCameraEnabled() { return mSitCameraEnabled; }
+ void setSitCamera(const LLUUID &object_id,
+ const LLVector3 &camera_pos = LLVector3::zero, const LLVector3 &camera_focus = LLVector3::zero);
+private:
+ LLPointer<LLViewerObject> mSitCameraReferenceObject; // Object to which camera is related when sitting
+ BOOL mSitCameraEnabled; // Use provided camera information when sitting?
+ LLVector3 mSitCameraPos; // Root relative camera pos when sitting
+ LLVector3 mSitCameraFocus; // Root relative camera target when sitting
+
+ //--------------------------------------------------------------------
+ // Animation
+ //--------------------------------------------------------------------
+public:
+ void setCameraAnimating(BOOL b) { mCameraAnimating = b; }
+ BOOL getCameraAnimating() { return mCameraAnimating; }
+ void setAnimationDuration(F32 seconds) { mAnimationDuration = seconds; }
+ void startCameraAnimation();
+ void stopCameraAnimation();
+private:
+ LLFrameTimer mAnimationTimer; // Seconds that transition animation has been active
+ F32 mAnimationDuration; // In seconds
+ BOOL mCameraAnimating; // Camera is transitioning from one mode to another
+ LLVector3d mAnimationCameraStartGlobal; // Camera start position, global coords
+ LLVector3d mAnimationFocusStartGlobal; // Camera focus point, global coords
+
+ //--------------------------------------------------------------------
+ // Focus
+ //--------------------------------------------------------------------
+public:
+ LLVector3d calcFocusPositionTargetGlobal();
+ LLVector3 calcFocusOffset(LLViewerObject *object, LLVector3 pos_agent, S32 x, S32 y);
+ BOOL getFocusOnAvatar() const { return mFocusOnAvatar; }
+ LLPointer<LLViewerObject>& getFocusObject() { return mFocusObject; }
+ F32 getFocusObjectDist() const { return mFocusObjectDist; }
+ void updateFocusOffset();
+ void validateFocusObject();
+ void setFocusGlobal(const LLPickInfo& pick);
+ void setFocusGlobal(const LLVector3d &focus, const LLUUID &object_id = LLUUID::null);
+ void setFocusOnAvatar(BOOL focus, BOOL animate);
+ void setCameraPosAndFocusGlobal(const LLVector3d& pos, const LLVector3d& focus, const LLUUID &object_id);
+ void clearFocusObject();
+ void setFocusObject(LLViewerObject* object);
+ void setObjectTracking(BOOL track) { mTrackFocusObject = track; }
+ const LLVector3d &getFocusGlobal() const { return mFocusGlobal; }
+ const LLVector3d &getFocusTargetGlobal() const { return mFocusTargetGlobal; }
+private:
+ LLVector3d mCameraFocusOffset; // Offset from focus point in build mode
+ LLVector3d mCameraFocusOffsetTarget; // Target towards which we are lerping the camera's focus offset
+ BOOL mFocusOnAvatar;
+ LLVector3d mFocusGlobal;
+ LLVector3d mFocusTargetGlobal;
+ LLPointer<LLViewerObject> mFocusObject;
+ F32 mFocusObjectDist;
+ LLVector3 mFocusObjectOffset;
+ F32 mFocusDotRadius; // Meters
+ BOOL mTrackFocusObject;
+ F32 mUIOffset;
+
+ //--------------------------------------------------------------------
+ // Lookat / Pointat
+ //--------------------------------------------------------------------
+public:
+ void updateLookAt(const S32 mouse_x, const S32 mouse_y);
+ BOOL setLookAt(ELookAtType target_type, LLViewerObject *object = NULL, LLVector3 position = LLVector3::zero);
+ ELookAtType getLookAtType();
+ void lookAtLastChat();
+ void slamLookAt(const LLVector3 &look_at); // Set the physics data
+ BOOL setPointAt(EPointAtType target_type, LLViewerObject *object = NULL, LLVector3 position = LLVector3::zero);
+ EPointAtType getPointAtType();
+public:
+ LLPointer<LLHUDEffectLookAt> mLookAt;
+ LLPointer<LLHUDEffectPointAt> mPointAt;
+
+ //--------------------------------------------------------------------
+ // Third person
+ //--------------------------------------------------------------------
+public:
+ LLVector3d calcThirdPersonFocusOffset();
+ void setThirdPersonHeadOffset(LLVector3 offset) { mThirdPersonHeadOffset = offset; }
+private:
+ LLVector3 mThirdPersonHeadOffset; // Head offset for third person camera position
+
+ //--------------------------------------------------------------------
+ // Orbit
+ //--------------------------------------------------------------------
+public:
+ void cameraOrbitAround(const F32 radians); // Rotate camera CCW radians about build focus point
+ void cameraOrbitOver(const F32 radians); // Rotate camera forward radians over build focus point
+ void cameraOrbitIn(const F32 meters); // Move camera in toward build focus point
+
+ //--------------------------------------------------------------------
+ // Zoom
+ //--------------------------------------------------------------------
+public:
+ void handleScrollWheel(S32 clicks); // Mousewheel driven zoom
+ void cameraZoomIn(const F32 factor); // Zoom in by fraction of current distance
+ F32 getCameraZoomFraction(); // Get camera zoom as fraction of minimum and maximum zoom
+ void setCameraZoomFraction(F32 fraction); // Set camera zoom as fraction of minimum and maximum zoom
+ F32 calcCameraFOVZoomFactor();
+
+ //--------------------------------------------------------------------
+ // Pan
+ //--------------------------------------------------------------------
+public:
+ void cameraPanIn(const F32 meters);
+ void cameraPanLeft(const F32 meters);
+ void cameraPanUp(const F32 meters);
+
+ //--------------------------------------------------------------------
+ // View
+ //--------------------------------------------------------------------
+public:
+ // Called whenever the agent moves. Puts camera back in default position, deselects items, etc.
+ void resetView(BOOL reset_camera = TRUE, BOOL change_camera = FALSE);
+ // Called on camera movement. Unlocks camera from the default position behind the avatar.
+ void unlockView();
+public:
+ F32 mDrawDistance;
+
+ //--------------------------------------------------------------------
+ // Mouselook
+ //--------------------------------------------------------------------
+public:
+ BOOL getForceMouselook() const { return mForceMouselook; }
+ void setForceMouselook(BOOL mouselook) { mForceMouselook = mouselook; }
+private:
+ BOOL mForceMouselook;
+
+ //--------------------------------------------------------------------
+ // HUD
+ //--------------------------------------------------------------------
+public:
+ F32 mHUDTargetZoom; // Target zoom level for HUD objects (used when editing)
+ F32 mHUDCurZoom; // Current animated zoom level for HUD objects
+
+
+/********************************************************************************
+ ** **
+ ** KEYS
+ **/
+
+public:
+ S32 getAtKey() const { return mAtKey; }
+ S32 getWalkKey() const { return mWalkKey; }
+ S32 getLeftKey() const { return mLeftKey; }
+ S32 getUpKey() const { return mUpKey; }
+ F32 getYawKey() const { return mYawKey; }
+ F32 getPitchKey() const { return mPitchKey; }
+
+ void setAtKey(S32 mag) { mAtKey = mag; }
+ void setWalkKey(S32 mag) { mWalkKey = mag; }
+ void setLeftKey(S32 mag) { mLeftKey = mag; }
+ void setUpKey(S32 mag) { mUpKey = mag; }
+ void setYawKey(F32 mag) { mYawKey = mag; }
+ void setPitchKey(F32 mag) { mPitchKey = mag; }
+
+ void clearGeneralKeys();
+ static S32 directionToKey(S32 direction); // Changes direction to -1/0/1
+
+private:
+ S32 mAtKey; // Either 1, 0, or -1. Indicates that movement key is pressed
+ S32 mWalkKey; // Like AtKey, but causes less forward thrust
+ S32 mLeftKey;
+ S32 mUpKey;
+ F32 mYawKey;
+ F32 mPitchKey;
+
+ //--------------------------------------------------------------------
+ // Orbit
+ //--------------------------------------------------------------------
+public:
+ F32 getOrbitLeftKey() const { return mOrbitLeftKey; }
+ F32 getOrbitRightKey() const { return mOrbitRightKey; }
+ F32 getOrbitUpKey() const { return mOrbitUpKey; }
+ F32 getOrbitDownKey() const { return mOrbitDownKey; }
+ F32 getOrbitInKey() const { return mOrbitInKey; }
+ F32 getOrbitOutKey() const { return mOrbitOutKey; }
+
+ void setOrbitLeftKey(F32 mag) { mOrbitLeftKey = mag; }
+ void setOrbitRightKey(F32 mag) { mOrbitRightKey = mag; }
+ void setOrbitUpKey(F32 mag) { mOrbitUpKey = mag; }
+ void setOrbitDownKey(F32 mag) { mOrbitDownKey = mag; }
+ void setOrbitInKey(F32 mag) { mOrbitInKey = mag; }
+ void setOrbitOutKey(F32 mag) { mOrbitOutKey = mag; }
+
+ void clearOrbitKeys();
+private:
+ F32 mOrbitLeftKey;
+ F32 mOrbitRightKey;
+ F32 mOrbitUpKey;
+ F32 mOrbitDownKey;
+ F32 mOrbitInKey;
+ F32 mOrbitOutKey;
+
+ //--------------------------------------------------------------------
+ // Pan
+ //--------------------------------------------------------------------
+public:
+ F32 getPanLeftKey() const { return mPanLeftKey; }
+ F32 getPanRightKey() const { return mPanRightKey; }
+ F32 getPanUpKey() const { return mPanUpKey; }
+ F32 getPanDownKey() const { return mPanDownKey; }
+ F32 getPanInKey() const { return mPanInKey; }
+ F32 getPanOutKey() const { return mPanOutKey; }
+
+ void setPanLeftKey(F32 mag) { mPanLeftKey = mag; }
+ void setPanRightKey(F32 mag) { mPanRightKey = mag; }
+ void setPanUpKey(F32 mag) { mPanUpKey = mag; }
+ void setPanDownKey(F32 mag) { mPanDownKey = mag; }
+ void setPanInKey(F32 mag) { mPanInKey = mag; }
+ void setPanOutKey(F32 mag) { mPanOutKey = mag; }
+
+ void clearPanKeys();
+private:
+ F32 mPanUpKey;
+ F32 mPanDownKey;
+ F32 mPanLeftKey;
+ F32 mPanRightKey;
+ F32 mPanInKey;
+ F32 mPanOutKey;
+
+/** Keys
+ ** **
+ *******************************************************************************/
+
+};
+
+extern LLAgentCamera gAgentCamera;
+
+#endif
diff --git a/indra/newview/llagentlistener.cpp b/indra/newview/llagentlistener.cpp
index b3ed7c353e..7a8205acb5 100644
--- a/indra/newview/llagentlistener.cpp
+++ b/indra/newview/llagentlistener.cpp
@@ -53,7 +53,10 @@ void LLAgentListener::requestTeleport(LLSD const & event_data) const
}
else
{
- std::string url = LLSLURL::buildSLURL(event_data["regionname"], event_data["x"], event_data["y"], event_data["z"]);
+ std::string url = LLSLURL(event_data["regionname"],
+ LLVector3(event_data["x"].asReal(),
+ event_data["y"].asReal(),
+ event_data["z"].asReal())).getSLURLString();
LLURLDispatcher::dispatch(url, NULL, false);
}
}
diff --git a/indra/newview/llagentui.cpp b/indra/newview/llagentui.cpp
index 7404fe5bc4..15d9f36b74 100644
--- a/indra/newview/llagentui.cpp
+++ b/indra/newview/llagentui.cpp
@@ -49,12 +49,10 @@
void LLAgentUI::buildName(std::string& name)
{
name.clear();
-
- LLVOAvatarSelf* avatar_object = gAgent.getAvatarObject();
- if (avatar_object)
+ if (isAgentAvatarValid())
{
- LLNameValue *first_nv = avatar_object->getNVPair("FirstName");
- LLNameValue *last_nv = avatar_object->getNVPair("LastName");
+ LLNameValue *first_nv = gAgentAvatarp->getNVPair("FirstName");
+ LLNameValue *last_nv = gAgentAvatarp->getNVPair("LastName");
if (first_nv && last_nv)
{
name = first_nv->printData() + " " + last_nv->printData();
@@ -73,20 +71,20 @@ void LLAgentUI::buildName(std::string& name)
//static
void LLAgentUI::buildFullname(std::string& name)
{
- if (gAgent.getAvatarObject()) name = gAgent.getAvatarObject()->getFullname();
+ if (isAgentAvatarValid())
+ name = gAgentAvatarp->getFullname();
}
//static
-std::string LLAgentUI::buildSLURL(const bool escaped /*= true*/)
+void LLAgentUI::buildSLURL(LLSLURL& slurl, const bool escaped /*= true*/)
{
- std::string slurl;
- LLViewerRegion *regionp = gAgent.getRegion();
- if (regionp)
- {
- LLVector3d agentPos = gAgent.getPositionGlobal();
- slurl = LLSLURL::buildSLURLfromPosGlobal(regionp->getName(), agentPos, escaped);
- }
- return slurl;
+ LLSLURL return_slurl;
+ LLViewerRegion *regionp = gAgent.getRegion();
+ if (regionp)
+ {
+ return_slurl = LLSLURL(regionp->getName(), gAgent.getPositionGlobal());
+ }
+ slurl = return_slurl;
}
//static
@@ -150,11 +148,17 @@ BOOL LLAgentUI::buildLocationString(std::string& str, ELocationFormat fmt,const
sim_access_string.c_str());
break;
case LOCATION_FORMAT_NO_MATURITY:
- case LOCATION_FORMAT_FULL:
buffer = llformat("%s (%d, %d, %d)",
region_name.c_str(),
pos_x, pos_y, pos_z);
break;
+ case LOCATION_FORMAT_FULL:
+ buffer = llformat("%s (%d, %d, %d)%s%s",
+ region_name.c_str(),
+ pos_x, pos_y, pos_z,
+ sim_access_string.empty() ? "" : " - ",
+ sim_access_string.c_str());
+ break;
}
}
else
diff --git a/indra/newview/llagentui.h b/indra/newview/llagentui.h
index 3478793e38..577b752fbe 100644
--- a/indra/newview/llagentui.h
+++ b/indra/newview/llagentui.h
@@ -33,6 +33,8 @@
#ifndef LLAGENTUI_H
#define LLAGENTUI_H
+class LLSLURL;
+
class LLAgentUI
{
public:
@@ -48,7 +50,7 @@ public:
static void buildName(std::string& name);
static void buildFullname(std::string &name);
- static std::string buildSLURL(const bool escaped = true);
+ static void buildSLURL(LLSLURL& slurl, const bool escaped = true);
//build location string using the current position of gAgent.
static BOOL buildLocationString(std::string& str, ELocationFormat fmt = LOCATION_FORMAT_LANDMARK);
//build location string using a region position of the avatar.
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 7cbd7e46a9..5728256dba 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -31,109 +31,58 @@
*/
#include "llviewerprecompiledheaders.h"
-
-#include "llagent.h"
#include "llagentwearables.h"
+#include "llaccordionctrltab.h"
+#include "llagent.h"
+#include "llagentcamera.h"
+#include "llagentwearablesfetch.h"
+#include "llappearancemgr.h"
#include "llcallbacklist.h"
-#include "llfloatercustomize.h"
+#include "llfolderview.h"
+#include "llgesturemgr.h"
#include "llinventorybridge.h"
+#include "llinventoryfunctions.h"
#include "llinventoryobserver.h"
#include "llinventorypanel.h"
+#include "llmd5.h"
#include "llnotificationsutil.h"
+#include "lloutfitobserver.h"
+#include "llpaneloutfitsinventory.h"
+#include "llsidepanelappearance.h"
+#include "llsidetray.h"
+#include "lltexlayer.h"
#include "llviewerregion.h"
#include "llvoavatarself.h"
#include "llwearable.h"
#include "llwearablelist.h"
-#include "llgesturemgr.h"
-#include "llappearancemgr.h"
-#include "lltexlayer.h"
-#include "llsidetray.h"
-#include "llpaneloutfitsinventory.h"
-#include "llfolderview.h"
-#include "llaccordionctrltab.h"
#include <boost/scoped_ptr.hpp>
-#define USE_CURRENT_OUTFIT_FOLDER
+LLAgentWearables gAgentWearables;
-//--------------------------------------------------------------------
-// Classes for fetching initial wearables data
-//--------------------------------------------------------------------
-// Outfit folder fetching callback structure.
-class LLInitialWearablesFetch : public LLInventoryFetchDescendentsObserver
-{
-public:
- LLInitialWearablesFetch() {}
- ~LLInitialWearablesFetch();
- virtual void done();
-
- struct InitialWearableData
- {
- EWearableType mType;
- LLUUID mItemID;
- LLUUID mAssetID;
- InitialWearableData(EWearableType type, LLUUID& itemID, LLUUID& assetID) :
- mType(type),
- mItemID(itemID),
- mAssetID(assetID)
- {}
- };
-
- typedef std::vector<InitialWearableData> initial_wearable_data_vec_t;
- initial_wearable_data_vec_t mCOFInitialWearables; // Wearables from the Current Outfit Folder
- initial_wearable_data_vec_t mAgentInitialWearables; // Wearables from the old agent wearables msg
-
-protected:
- void processWearablesMessage();
- void processContents();
-};
+BOOL LLAgentWearables::mInitialWearablesUpdateReceived = FALSE;
+
+using namespace LLVOAvatarDefines;
+
+///////////////////////////////////////////////////////////////////////////////
-class LLLibraryOutfitsFetch : public LLInventoryFetchDescendentsObserver
+// Callback to wear and start editing an item that has just been created.
+class LLWearAndEditCallback : public LLInventoryCallback
{
-public:
- enum ELibraryOutfitFetchStep {
- LOFS_FOLDER = 0,
- LOFS_OUTFITS,
- LOFS_LIBRARY,
- LOFS_IMPORTED,
- LOFS_CONTENTS
- };
- LLLibraryOutfitsFetch() : mCurrFetchStep(LOFS_FOLDER), mOutfitsPopulated(false)
- {
- mMyOutfitsID = LLUUID::null;
- mClothingID = LLUUID::null;
- mLibraryClothingID = LLUUID::null;
- mImportedClothingID = LLUUID::null;
- mImportedClothingName = "Imported Library Clothing";
- }
- ~LLLibraryOutfitsFetch() {}
- virtual void done();
- void doneIdle();
- LLUUID mMyOutfitsID;
- void importedFolderFetch();
-protected:
- void folderDone(void);
- void outfitsDone(void);
- void libraryDone(void);
- void importedFolderDone(void);
- void contentsDone(void);
- enum ELibraryOutfitFetchStep mCurrFetchStep;
- typedef std::vector< std::pair< LLUUID, std::string > > cloth_folder_vec_t;
- cloth_folder_vec_t mLibraryClothingFolders;
- cloth_folder_vec_t mImportedClothingFolders;
- bool mOutfitsPopulated;
- LLUUID mClothingID;
- LLUUID mLibraryClothingID;
- LLUUID mImportedClothingID;
- std::string mImportedClothingName;
-};
+ void fire(const LLUUID& inv_item)
+ {
+ if (inv_item.isNull()) return;
-LLAgentWearables gAgentWearables;
+ // Request editing the item after it gets worn.
+ gAgentWearables.requestEditingWearable(inv_item);
-BOOL LLAgentWearables::mInitialWearablesUpdateReceived = FALSE;
+ // Wear it.
+ LLAppearanceMgr::instance().wearItemOnAvatar(inv_item);
+ }
+};
-using namespace LLVOAvatarDefines;
+///////////////////////////////////////////////////////////////////////////////
// HACK: For EXT-3923: Pants item shows in inventory with skin icon and messes with "current look"
// Some db items are corrupted, have inventory flags = 0, implying wearable type = shape, even though
@@ -171,13 +120,13 @@ void checkWearableAgainstInventory(LLWearable *wearable)
void LLAgentWearables::dump()
{
llinfos << "LLAgentWearablesDump" << llendl;
- for (S32 i = 0; i < WT_COUNT; i++)
+ for (S32 i = 0; i < LLWearableType::WT_COUNT; i++)
{
- U32 count = getWearableCount((EWearableType)i);
+ U32 count = getWearableCount((LLWearableType::EType)i);
llinfos << "Type: " << i << " count " << count << llendl;
for (U32 j=0; j<count; j++)
{
- LLWearable* wearable = getWearable((EWearableType)i,j);
+ LLWearable* wearable = getWearable((LLWearableType::EType)i,j);
if (wearable == NULL)
{
llinfos << " " << j << " NULL wearable" << llendl;
@@ -196,7 +145,6 @@ void LLAgentWearables::dump()
}
}
-// MULTI-WEARABLE: debugging
struct LLAgentDumper
{
LLAgentDumper(std::string name):
@@ -218,8 +166,8 @@ struct LLAgentDumper
};
LLAgentWearables::LLAgentWearables() :
- mWearablesLoaded(FALSE),
- mAvatarObject(NULL)
+ mWearablesLoaded(FALSE)
+, mCOFChangeInProgress(false)
{
}
@@ -230,12 +178,18 @@ LLAgentWearables::~LLAgentWearables()
void LLAgentWearables::cleanup()
{
- mAvatarObject = NULL;
+}
+
+// static
+void LLAgentWearables::initClass()
+{
+ // this can not be called from constructor because its instance is global and is created too early.
+ // Subscribe to "COF is Saved" signal to notify observers about this (Loading indicator for ex.).
+ LLOutfitObserver::instance().addCOFSavedCallback(boost::bind(&LLAgentWearables::notifyLoadingFinished, &gAgentWearables));
}
void LLAgentWearables::setAvatarObject(LLVOAvatarSelf *avatar)
{
- mAvatarObject = avatar;
if (avatar)
{
sendAgentWearablesRequest();
@@ -245,6 +199,7 @@ void LLAgentWearables::setAvatarObject(LLVOAvatarSelf *avatar)
// wearables
LLAgentWearables::createStandardWearablesAllDoneCallback::~createStandardWearablesAllDoneCallback()
{
+ llinfos << "destructor - all done?" << llendl;
gAgentWearables.createStandardWearablesAllDone();
}
@@ -264,17 +219,23 @@ LLAgentWearables::sendAgentWearablesUpdateCallback::~sendAgentWearablesUpdateCal
* @param todo Bitmask of actions to take on completion.
*/
LLAgentWearables::addWearableToAgentInventoryCallback::addWearableToAgentInventoryCallback(
- LLPointer<LLRefCount> cb, S32 type, U32 index, LLWearable* wearable, U32 todo) :
+ LLPointer<LLRefCount> cb, LLWearableType::EType type, U32 index, LLWearable* wearable, U32 todo) :
mType(type),
mIndex(index),
mWearable(wearable),
mTodo(todo),
mCB(cb)
{
+ llinfos << "constructor" << llendl;
}
void LLAgentWearables::addWearableToAgentInventoryCallback::fire(const LLUUID& inv_item)
{
+ if (mTodo & CALL_CREATESTANDARDDONE)
+ {
+ llinfos << "callback fired, inv_item " << inv_item.asString() << llendl;
+ }
+
if (inv_item.isNull())
return;
@@ -286,6 +247,7 @@ void LLAgentWearables::addWearableToAgentInventoryCallback::fire(const LLUUID& i
}
if (mTodo & CALL_RECOVERDONE)
{
+ LLAppearanceMgr::instance().addCOFItemLink(inv_item,false);
gAgentWearables.recoverMissingWearableDone();
}
/*
@@ -293,38 +255,48 @@ void LLAgentWearables::addWearableToAgentInventoryCallback::fire(const LLUUID& i
*/
if (mTodo & CALL_CREATESTANDARDDONE)
{
+ LLAppearanceMgr::instance().addCOFItemLink(inv_item,false);
gAgentWearables.createStandardWearablesDone(mType, mIndex);
}
if (mTodo & CALL_MAKENEWOUTFITDONE)
{
gAgentWearables.makeNewOutfitDone(mType, mIndex);
}
+ if (mTodo & CALL_WEARITEM)
+ {
+ LLAppearanceMgr::instance().addCOFItemLink(inv_item, true);
+ }
}
-void LLAgentWearables::addWearabletoAgentInventoryDone(const S32 type,
+void LLAgentWearables::addWearabletoAgentInventoryDone(const LLWearableType::EType type,
const U32 index,
const LLUUID& item_id,
LLWearable* wearable)
{
+ llinfos << "type " << type << " index " << index << " item " << item_id.asString() << llendl;
+
if (item_id.isNull())
return;
- LLUUID old_item_id = getWearableItemID((EWearableType)type,index);
+ LLUUID old_item_id = getWearableItemID(type,index);
+
if (wearable)
{
wearable->setItemID(item_id);
- }
- if (old_item_id.notNull())
- {
- gInventory.addChangedMask(LLInventoryObserver::LABEL, old_item_id);
- setWearable((EWearableType)type,index,wearable);
- }
- else
- {
- pushWearable((EWearableType)type,wearable);
+ if (old_item_id.notNull())
+ {
+ gInventory.addChangedMask(LLInventoryObserver::LABEL, old_item_id);
+ setWearable(type,index,wearable);
+ }
+ else
+ {
+ pushWearable(type,wearable);
+ }
}
+
gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
+
LLViewerInventoryItem* item = gInventory.getItem(item_id);
if (item && wearable)
{
@@ -341,13 +313,12 @@ void LLAgentWearables::addWearabletoAgentInventoryDone(const S32 type,
void LLAgentWearables::sendAgentWearablesUpdate()
{
- // MULTI-WEARABLE: call i "type" or something.
// First make sure that we have inventory items for each wearable
- for (S32 type=0; type < WT_COUNT; ++type)
+ for (S32 type=0; type < LLWearableType::WT_COUNT; ++type)
{
- for (U32 j=0; j < getWearableCount((EWearableType)type); ++j)
+ for (U32 index=0; index < getWearableCount((LLWearableType::EType)type); ++index)
{
- LLWearable* wearable = getWearable((EWearableType)type,j);
+ LLWearable* wearable = getWearable((LLWearableType::EType)type,index);
if (wearable)
{
if (wearable->getItemID().isNull())
@@ -355,8 +326,8 @@ void LLAgentWearables::sendAgentWearablesUpdate()
LLPointer<LLInventoryCallback> cb =
new addWearableToAgentInventoryCallback(
LLPointer<LLRefCount>(NULL),
- type,
- j,
+ (LLWearableType::EType)type,
+ index,
wearable,
addWearableToAgentInventoryCallback::CALL_NONE);
addWearableToAgentInventory(cb, wearable);
@@ -381,16 +352,15 @@ void LLAgentWearables::sendAgentWearablesUpdate()
gMessageSystem->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
lldebugs << "sendAgentWearablesUpdate()" << llendl;
- // MULTI-WEARABLE: update for multi-wearables after server-side support is in.
- for (S32 type=0; type < WT_COUNT; ++type)
+ // MULTI-WEARABLE: DEPRECATED: HACK: index to 0- server database tables don't support concept of multiwearables.
+ for (S32 type=0; type < LLWearableType::WT_COUNT; ++type)
{
gMessageSystem->nextBlockFast(_PREHASH_WearableData);
U8 type_u8 = (U8)type;
gMessageSystem->addU8Fast(_PREHASH_WearableType, type_u8);
- // MULTI-WEARABLE: TODO: hacked index to 0, needs to loop over all once messages support this.
- LLWearable* wearable = getWearable((EWearableType)type, 0);
+ LLWearable* wearable = getWearable((LLWearableType::EType)type, 0);
if (wearable)
{
//llinfos << "Sending wearable " << wearable->getName() << llendl;
@@ -406,16 +376,16 @@ void LLAgentWearables::sendAgentWearablesUpdate()
}
else
{
- //llinfos << "Not wearing wearable type " << LLWearableDictionary::getInstance()->getWearable((EWearableType)i) << llendl;
+ //llinfos << "Not wearing wearable type " << LLWearableType::getTypeName((LLWearableType::EType)i) << llendl;
gMessageSystem->addUUIDFast(_PREHASH_ItemID, LLUUID::null);
}
- lldebugs << " " << LLWearableDictionary::getTypeLabel((EWearableType)type) << ": " << (wearable ? wearable->getAssetID() : LLUUID::null) << llendl;
+ lldebugs << " " << LLWearableType::getTypeLabel((LLWearableType::EType)type) << ": " << (wearable ? wearable->getAssetID() : LLUUID::null) << llendl;
}
gAgent.sendReliableMessage();
}
-void LLAgentWearables::saveWearable(const EWearableType type, const U32 index, BOOL send_update)
+void LLAgentWearables::saveWearable(const LLWearableType::EType type, const U32 index, BOOL send_update)
{
LLWearable* old_wearable = getWearable(type, index);
if (old_wearable && (old_wearable->isDirty() || old_wearable->isOldVersion()))
@@ -425,6 +395,11 @@ void LLAgentWearables::saveWearable(const EWearableType type, const U32 index, B
new_wearable->setItemID(old_item_id); // should this be in LLWearable::copyDataFrom()?
setWearable(type,index,new_wearable);
+ // old_wearable may still be referred to by other inventory items. Revert
+ // unsaved changes so other inventory items aren't affected by the changes
+ // that were just saved.
+ old_wearable->revertValues();
+
LLInventoryItem* item = gInventory.getItem(old_item_id);
if (item)
{
@@ -456,7 +431,7 @@ void LLAgentWearables::saveWearable(const EWearableType type, const U32 index, B
LLPointer<LLInventoryCallback> cb =
new addWearableToAgentInventoryCallback(
LLPointer<LLRefCount>(NULL),
- (S32)type,
+ type,
index,
new_wearable,
todo);
@@ -464,7 +439,7 @@ void LLAgentWearables::saveWearable(const EWearableType type, const U32 index, B
return;
}
- gAgent.getAvatarObject()->wearableUpdated( type, TRUE );
+ gAgentAvatarp->wearableUpdated( type, TRUE );
if (send_update)
{
@@ -473,7 +448,7 @@ void LLAgentWearables::saveWearable(const EWearableType type, const U32 index, B
}
}
-void LLAgentWearables::saveWearableAs(const EWearableType type,
+void LLAgentWearables::saveWearableAs(const LLWearableType::EType type,
const U32 index,
const std::string& new_name,
BOOL save_in_lost_and_found)
@@ -507,7 +482,7 @@ void LLAgentWearables::saveWearableAs(const EWearableType type,
type,
index,
new_wearable,
- addWearableToAgentInventoryCallback::CALL_UPDATE);
+ addWearableToAgentInventoryCallback::CALL_WEARITEM);
LLUUID category_id;
if (save_in_lost_and_found)
{
@@ -527,9 +502,14 @@ void LLAgentWearables::saveWearableAs(const EWearableType type,
category_id,
new_name,
cb);
+
+ // old_wearable may still be referred to by other inventory items. Revert
+ // unsaved changes so other inventory items aren't affected by the changes
+ // that were just saved.
+ old_wearable->revertValues();
}
-void LLAgentWearables::revertWearable(const EWearableType type, const U32 index)
+void LLAgentWearables::revertWearable(const LLWearableType::EType type, const U32 index)
{
LLWearable* wearable = getWearable(type, index);
wearable->revertValues();
@@ -544,10 +524,10 @@ void LLAgentWearables::saveAllWearables()
// return;
//}
- for (S32 i=0; i < WT_COUNT; i++)
+ for (S32 i=0; i < LLWearableType::WT_COUNT; i++)
{
- for (U32 j=0; j < getWearableCount((EWearableType)i); j++)
- saveWearable((EWearableType)i, j, FALSE);
+ for (U32 j=0; j < getWearableCount((LLWearableType::EType)i); j++)
+ saveWearable((LLWearableType::EType)i, j, FALSE);
}
sendAgentWearablesUpdate();
}
@@ -555,14 +535,14 @@ void LLAgentWearables::saveAllWearables()
// Called when the user changes the name of a wearable inventory item that is currently being worn.
void LLAgentWearables::setWearableName(const LLUUID& item_id, const std::string& new_name)
{
- for (S32 i=0; i < WT_COUNT; i++)
+ for (S32 i=0; i < LLWearableType::WT_COUNT; i++)
{
- for (U32 j=0; j < getWearableCount((EWearableType)i); j++)
+ for (U32 j=0; j < getWearableCount((LLWearableType::EType)i); j++)
{
- LLUUID curr_item_id = getWearableItemID((EWearableType)i,j);
+ LLUUID curr_item_id = getWearableItemID((LLWearableType::EType)i,j);
if (curr_item_id == item_id)
{
- LLWearable* old_wearable = getWearable((EWearableType)i,j);
+ LLWearable* old_wearable = getWearable((LLWearableType::EType)i,j);
llassert(old_wearable);
std::string old_name = old_wearable->getName();
@@ -576,7 +556,7 @@ void LLAgentWearables::setWearableName(const LLUUID& item_id, const std::string&
}
old_wearable->setName(old_name);
- setWearable((EWearableType)i,j,new_wearable);
+ setWearable((LLWearableType::EType)i,j,new_wearable);
sendAgentWearablesUpdate();
break;
}
@@ -585,12 +565,18 @@ void LLAgentWearables::setWearableName(const LLUUID& item_id, const std::string&
}
-BOOL LLAgentWearables::isWearableModifiable(EWearableType type, U32 index) const
+BOOL LLAgentWearables::isWearableModifiable(LLWearableType::EType type, U32 index) const
{
LLUUID item_id = getWearableItemID(type, index);
- if (!item_id.isNull())
+ return item_id.notNull() ? isWearableModifiable(item_id) : FALSE;
+}
+
+BOOL LLAgentWearables::isWearableModifiable(const LLUUID& item_id) const
+{
+ const LLUUID& linked_id = gInventory.getLinkedItemID(item_id);
+ if (linked_id.notNull())
{
- LLInventoryItem* item = gInventory.getItem(item_id);
+ LLInventoryItem* item = gInventory.getItem(linked_id);
if (item && item->getPermissions().allowModifyBy(gAgent.getID(),
gAgent.getGroupID()))
{
@@ -600,7 +586,7 @@ BOOL LLAgentWearables::isWearableModifiable(EWearableType type, U32 index) const
return FALSE;
}
-BOOL LLAgentWearables::isWearableCopyable(EWearableType type, U32 index) const
+BOOL LLAgentWearables::isWearableCopyable(LLWearableType::EType type, U32 index) const
{
LLUUID item_id = getWearableItemID(type, index);
if (!item_id.isNull())
@@ -616,7 +602,7 @@ BOOL LLAgentWearables::isWearableCopyable(EWearableType type, U32 index) const
}
/*
- U32 LLAgentWearables::getWearablePermMask(EWearableType type)
+ U32 LLAgentWearables::getWearablePermMask(LLWearableType::EType type)
{
LLUUID item_id = getWearableItemID(type);
if (!item_id.isNull())
@@ -631,7 +617,7 @@ BOOL LLAgentWearables::isWearableCopyable(EWearableType type, U32 index) const
}
*/
-LLInventoryItem* LLAgentWearables::getWearableInventoryItem(EWearableType type, U32 index)
+LLInventoryItem* LLAgentWearables::getWearableInventoryItem(LLWearableType::EType type, U32 index)
{
LLUUID item_id = getWearableItemID(type,index);
LLInventoryItem* item = NULL;
@@ -644,12 +630,30 @@ LLInventoryItem* LLAgentWearables::getWearableInventoryItem(EWearableType type,
const LLWearable* LLAgentWearables::getWearableFromItemID(const LLUUID& item_id) const
{
- for (S32 i=0; i < WT_COUNT; i++)
+ const LLUUID& base_item_id = gInventory.getLinkedItemID(item_id);
+ for (S32 i=0; i < LLWearableType::WT_COUNT; i++)
+ {
+ for (U32 j=0; j < getWearableCount((LLWearableType::EType)i); j++)
+ {
+ const LLWearable * curr_wearable = getWearable((LLWearableType::EType)i, j);
+ if (curr_wearable && (curr_wearable->getItemID() == base_item_id))
+ {
+ return curr_wearable;
+ }
+ }
+ }
+ return NULL;
+}
+
+LLWearable* LLAgentWearables::getWearableFromItemID(const LLUUID& item_id)
+{
+ const LLUUID& base_item_id = gInventory.getLinkedItemID(item_id);
+ for (S32 i=0; i < LLWearableType::WT_COUNT; i++)
{
- for (U32 j=0; j < getWearableCount((EWearableType)i); j++)
+ for (U32 j=0; j < getWearableCount((LLWearableType::EType)i); j++)
{
- const LLWearable * curr_wearable = getWearable((EWearableType)i, j);
- if (curr_wearable && (curr_wearable->getItemID() == item_id))
+ LLWearable * curr_wearable = getWearable((LLWearableType::EType)i, j);
+ if (curr_wearable && (curr_wearable->getItemID() == base_item_id))
{
return curr_wearable;
}
@@ -658,13 +662,13 @@ const LLWearable* LLAgentWearables::getWearableFromItemID(const LLUUID& item_id)
return NULL;
}
-const LLWearable* LLAgentWearables::getWearableFromAssetID(const LLUUID& asset_id) const
+LLWearable* LLAgentWearables::getWearableFromAssetID(const LLUUID& asset_id)
{
- for (S32 i=0; i < WT_COUNT; i++)
+ for (S32 i=0; i < LLWearableType::WT_COUNT; i++)
{
- for (U32 j=0; j < getWearableCount((EWearableType)i); j++)
+ for (U32 j=0; j < getWearableCount((LLWearableType::EType)i); j++)
{
- const LLWearable * curr_wearable = getWearable((EWearableType)i, j);
+ LLWearable * curr_wearable = getWearable((LLWearableType::EType)i, j);
if (curr_wearable && (curr_wearable->getAssetID() == asset_id))
{
return curr_wearable;
@@ -684,12 +688,12 @@ void LLAgentWearables::sendAgentWearablesRequest()
}
// static
-BOOL LLAgentWearables::selfHasWearable(EWearableType type)
+BOOL LLAgentWearables::selfHasWearable(LLWearableType::EType type)
{
return (gAgentWearables.getWearableCount(type) > 0);
}
-LLWearable* LLAgentWearables::getWearable(const EWearableType type, U32 index)
+LLWearable* LLAgentWearables::getWearable(const LLWearableType::EType type, U32 index)
{
wearableentry_map_t::iterator wearable_iter = mWearableDatas.find(type);
if (wearable_iter == mWearableDatas.end())
@@ -707,7 +711,7 @@ LLWearable* LLAgentWearables::getWearable(const EWearableType type, U32 index)
}
}
-void LLAgentWearables::setWearable(const EWearableType type, U32 index, LLWearable *wearable)
+void LLAgentWearables::setWearable(const LLWearableType::EType type, U32 index, LLWearable *wearable)
{
LLWearable *old_wearable = getWearable(type,index);
@@ -737,27 +741,27 @@ void LLAgentWearables::setWearable(const EWearableType type, U32 index, LLWearab
}
}
-U32 LLAgentWearables::pushWearable(const EWearableType type, LLWearable *wearable)
+U32 LLAgentWearables::pushWearable(const LLWearableType::EType type, LLWearable *wearable)
{
if (wearable == NULL)
{
// no null wearables please!
llwarns << "Null wearable sent for type " << type << llendl;
- return MAX_WEARABLES_PER_TYPE;
+ return MAX_CLOTHING_PER_TYPE;
}
- if (type < WT_COUNT || mWearableDatas[type].size() < MAX_WEARABLES_PER_TYPE)
+ if (type < LLWearableType::WT_COUNT || mWearableDatas[type].size() < MAX_CLOTHING_PER_TYPE)
{
mWearableDatas[type].push_back(wearable);
wearableUpdated(wearable);
checkWearableAgainstInventory(wearable);
return mWearableDatas[type].size()-1;
}
- return MAX_WEARABLES_PER_TYPE;
+ return MAX_CLOTHING_PER_TYPE;
}
void LLAgentWearables::wearableUpdated(LLWearable *wearable)
{
- mAvatarObject->wearableUpdated(wearable->getType(), TRUE);
+ gAgentAvatarp->wearableUpdated(wearable->getType(), FALSE);
wearable->refreshName();
wearable->setLabelUpdated();
@@ -787,21 +791,21 @@ void LLAgentWearables::popWearable(LLWearable *wearable)
}
U32 index = getWearableIndex(wearable);
- EWearableType type = wearable->getType();
+ LLWearableType::EType type = wearable->getType();
- if (index < MAX_WEARABLES_PER_TYPE && index < getWearableCount(type))
+ if (index < MAX_CLOTHING_PER_TYPE && index < getWearableCount(type))
{
popWearable(type, index);
}
}
-void LLAgentWearables::popWearable(const EWearableType type, U32 index)
+void LLAgentWearables::popWearable(const LLWearableType::EType type, U32 index)
{
LLWearable *wearable = getWearable(type, index);
if (wearable)
{
mWearableDatas[type].erase(mWearableDatas[type].begin() + index);
- mAvatarObject->wearableUpdated(wearable->getType(), TRUE);
+ gAgentAvatarp->wearableUpdated(wearable->getType(), FALSE);
wearable->setLabelUpdated();
}
}
@@ -810,15 +814,15 @@ U32 LLAgentWearables::getWearableIndex(LLWearable *wearable)
{
if (wearable == NULL)
{
- return MAX_WEARABLES_PER_TYPE;
+ return MAX_CLOTHING_PER_TYPE;
}
- const EWearableType type = wearable->getType();
+ const LLWearableType::EType type = wearable->getType();
wearableentry_map_t::const_iterator wearable_iter = mWearableDatas.find(type);
if (wearable_iter == mWearableDatas.end())
{
llwarns << "tried to get wearable index with an invalid type!" << llendl;
- return MAX_WEARABLES_PER_TYPE;
+ return MAX_CLOTHING_PER_TYPE;
}
const wearableentry_vec_t& wearable_vec = wearable_iter->second;
for(U32 index = 0; index < wearable_vec.size(); index++)
@@ -829,10 +833,10 @@ U32 LLAgentWearables::getWearableIndex(LLWearable *wearable)
}
}
- return MAX_WEARABLES_PER_TYPE;
+ return MAX_CLOTHING_PER_TYPE;
}
-const LLWearable* LLAgentWearables::getWearable(const EWearableType type, U32 index) const
+const LLWearable* LLAgentWearables::getWearable(const LLWearableType::EType type, U32 index) const
{
wearableentry_map_t::const_iterator wearable_iter = mWearableDatas.find(type);
if (wearable_iter == mWearableDatas.end())
@@ -850,7 +854,7 @@ const LLWearable* LLAgentWearables::getWearable(const EWearableType type, U32 in
}
}
-LLWearable* LLAgentWearables::getTopWearable(const EWearableType type)
+LLWearable* LLAgentWearables::getTopWearable(const LLWearableType::EType type)
{
U32 count = getWearableCount(type);
if ( count == 0)
@@ -861,7 +865,17 @@ LLWearable* LLAgentWearables::getTopWearable(const EWearableType type)
return getWearable(type, count-1);
}
-U32 LLAgentWearables::getWearableCount(const EWearableType type) const
+LLWearable* LLAgentWearables::getBottomWearable(const LLWearableType::EType type)
+{
+ if (getWearableCount(type) == 0)
+ {
+ return NULL;
+ }
+
+ return getWearable(type, 0);
+}
+
+U32 LLAgentWearables::getWearableCount(const LLWearableType::EType type) const
{
wearableentry_map_t::const_iterator wearable_iter = mWearableDatas.find(type);
if (wearable_iter == mWearableDatas.end())
@@ -874,7 +888,7 @@ U32 LLAgentWearables::getWearableCount(const EWearableType type) const
U32 LLAgentWearables::getWearableCount(const U32 tex_index) const
{
- const EWearableType wearable_type = LLVOAvatarDictionary::getTEWearableType((LLVOAvatarDefines::ETextureIndex)tex_index);
+ const LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType((LLVOAvatarDefines::ETextureIndex)tex_index);
return getWearableCount(wearable_type);
}
@@ -889,7 +903,7 @@ U32 LLAgentWearables::itemUpdatePendingCount() const
return mItemsAwaitingWearableUpdate.size();
}
-const LLUUID LLAgentWearables::getWearableItemID(EWearableType type, U32 index) const
+const LLUUID LLAgentWearables::getWearableItemID(LLWearableType::EType type, U32 index) const
{
const LLWearable *wearable = getWearable(type,index);
if (wearable)
@@ -898,7 +912,7 @@ const LLUUID LLAgentWearables::getWearableItemID(EWearableType type, U32 index)
return LLUUID();
}
-const LLUUID LLAgentWearables::getWearableAssetID(EWearableType type, U32 index) const
+const LLUUID LLAgentWearables::getWearableAssetID(LLWearableType::EType type, U32 index) const
{
const LLWearable *wearable = getWearable(type,index);
if (wearable)
@@ -909,32 +923,32 @@ const LLUUID LLAgentWearables::getWearableAssetID(EWearableType type, U32 index)
BOOL LLAgentWearables::isWearingItem(const LLUUID& item_id) const
{
- const LLUUID& base_item_id = gInventory.getLinkedItemID(item_id);
- if (getWearableFromItemID(base_item_id) != NULL)
- {
- return TRUE;
- }
- return FALSE;
+ return getWearableFromItemID(item_id) != NULL;
}
-// MULTI-WEARABLE: update for multiple
+// MULTI-WEARABLE: DEPRECATED (see backwards compatibility)
// static
// ! BACKWARDS COMPATIBILITY ! When we stop supporting viewer1.23, we can assume
// that viewers have a Current Outfit Folder and won't need this message, and thus
-// we can remove/ignore this whole function.
+// we can remove/ignore this whole function. EXCEPT gAgentWearables.notifyLoadingStarted
void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgsys, void** user_data)
{
// We should only receive this message a single time. Ignore subsequent AgentWearablesUpdates
// that may result from AgentWearablesRequest having been sent more than once.
if (mInitialWearablesUpdateReceived)
return;
+
+ // notify subscribers that wearables started loading. See EXT-7777
+ // *TODO: find more proper place to not be called from deprecated method.
+ // Seems such place is found: LLInitialWearablesFetch::processContents()
+ gAgentWearables.notifyLoadingStarted();
+
mInitialWearablesUpdateReceived = true;
LLUUID agent_id;
gMessageSystem->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id);
- LLVOAvatar* avatar = gAgent.getAvatarObject();
- if (avatar && (agent_id == avatar->getID()))
+ if (isAgentAvatarValid() && (agent_id == gAgentAvatarp->getID()))
{
gMessageSystem->getU32Fast(_PREHASH_AgentData, _PREHASH_SerialNum, gAgentQueryManager.mUpdateSerialNum);
@@ -952,23 +966,22 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs
// Get the UUID of the current outfit folder (will be created if it doesn't exist)
const LLUUID current_outfit_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
-
- LLInitialWearablesFetch* outfit = new LLInitialWearablesFetch();
+ LLInitialWearablesFetch* outfit = new LLInitialWearablesFetch(current_outfit_id);
//lldebugs << "processAgentInitialWearablesUpdate()" << llendl;
// Add wearables
- // MULTI-WEARABLE: TODO: update once messages change. Currently use results to populate the zeroth element.
+ // MULTI-WEARABLE: DEPRECATED: Message only supports one wearable per type, will be ignored in future.
gAgentWearables.mItemsAwaitingWearableUpdate.clear();
for (S32 i=0; i < num_wearables; i++)
{
// Parse initial wearables data from message system
U8 type_u8 = 0;
gMessageSystem->getU8Fast(_PREHASH_WearableData, _PREHASH_WearableType, type_u8, i);
- if (type_u8 >= WT_COUNT)
+ if (type_u8 >= LLWearableType::WT_COUNT)
{
continue;
}
- const EWearableType type = (EWearableType) type_u8;
+ const LLWearableType::EType type = (LLWearableType::EType) type_u8;
LLUUID item_id;
gMessageSystem->getUUIDFast(_PREHASH_WearableData, _PREHASH_ItemID, item_id, i);
@@ -981,29 +994,26 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs
}
else
{
- LLAssetType::EType asset_type = LLWearableDictionary::getAssetType(type);
+ LLAssetType::EType asset_type = LLWearableType::getAssetType(type);
if (asset_type == LLAssetType::AT_NONE)
{
continue;
}
- // MULTI-WEARABLE: TODO: update once messages change. Currently use results to populate the zeroth element.
+ // MULTI-WEARABLE: DEPRECATED: this message only supports one wearable per type. Should be ignored in future versions
// Store initial wearables data until we know whether we have the current outfit folder or need to use the data.
- LLInitialWearablesFetch::InitialWearableData wearable_data(type, item_id, asset_id); // MULTI-WEARABLE: update
- outfit->mAgentInitialWearables.push_back(wearable_data);
-
+ LLInitialWearablesFetch::InitialWearableData wearable_data(type, item_id, asset_id);
+ outfit->add(wearable_data);
}
- lldebugs << " " << LLWearableDictionary::getTypeLabel(type) << llendl;
+ lldebugs << " " << LLWearableType::getTypeLabel(type) << llendl;
}
// Get the complete information on the items in the inventory and set up an observer
// that will trigger when the complete information is fetched.
- LLInventoryFetchDescendentsObserver::folder_ref_t folders;
- folders.push_back(current_outfit_id);
- outfit->fetchDescendents(folders);
- if(outfit->isEverythingComplete())
+ outfit->startFetch();
+ if(outfit->isFinished())
{
// everything is already here - call done.
outfit->done();
@@ -1018,74 +1028,16 @@ void LLAgentWearables::processAgentInitialWearablesUpdate(LLMessageSystem* mesgs
}
}
-// A single wearable that the avatar was wearing on start-up has arrived from the database.
-// static
-void LLAgentWearables::onInitialWearableAssetArrived(LLWearable* wearable, void* userdata)
-{
- boost::scoped_ptr<LLInitialWearablesFetch::InitialWearableData> wear_data((LLInitialWearablesFetch::InitialWearableData*)userdata);
- const EWearableType type = wear_data->mType;
- U32 index = 0;
-
- LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- if (!avatar)
- {
- return;
- }
-
- if (wearable)
- {
- llassert(type == wearable->getType());
- wearable->setItemID(wear_data->mItemID);
- index = gAgentWearables.pushWearable(type, wearable);
- gAgentWearables.mItemsAwaitingWearableUpdate.erase(wear_data->mItemID);
-
- // disable composites if initial textures are baked
- avatar->setupComposites();
-
- avatar->setCompositeUpdatesEnabled(TRUE);
- gInventory.addChangedMask(LLInventoryObserver::LABEL, wearable->getItemID());
- }
- else
- {
- // Somehow the asset doesn't exist in the database.
- gAgentWearables.recoverMissingWearable(type,index);
- }
-
- gInventory.notifyObservers();
-
- // Have all the wearables that the avatar was wearing at log-in arrived?
- // MULTI-WEARABLE: update when multiple wearables can arrive per type.
-
- gAgentWearables.updateWearablesLoaded();
- if (gAgentWearables.areWearablesLoaded())
- {
-
- // Can't query cache until all wearables have arrived, so calling this earlier is a no-op.
- gAgentWearables.queryWearableCache();
-
- // Make sure that the server's idea of the avatar's wearables actually match the wearables.
- gAgent.sendAgentSetAppearance();
-
- // Check to see if there are any baked textures that we hadn't uploaded before we logged off last time.
- // If there are any, schedule them to be uploaded as soon as the layer textures they depend on arrive.
- if (gAgent.cameraCustomizeAvatar())
- {
- avatar->requestLayerSetUploads();
- }
- }
-}
-
// Normally, all wearables referred to "AgentWearablesUpdate" will correspond to actual assets in the
// database. If for some reason, we can't load one of those assets, we can try to reconstruct it so that
// the user isn't left without a shape, for example. (We can do that only after the inventory has loaded.)
-void LLAgentWearables::recoverMissingWearable(const EWearableType type, U32 index)
+void LLAgentWearables::recoverMissingWearable(const LLWearableType::EType type, U32 index)
{
// Try to recover by replacing missing wearable with a new one.
LLNotificationsUtil::add("ReplacedMissingWearable");
- lldebugs << "Wearable " << LLWearableDictionary::getTypeLabel(type) << " could not be downloaded. Replaced inventory item with default wearable." << llendl;
+ lldebugs << "Wearable " << LLWearableType::getTypeLabel(type) << " could not be downloaded. Replaced inventory item with default wearable." << llendl;
LLWearable* new_wearable = LLWearableList::instance().createNewWearable(type);
- S32 type_s32 = (S32) type;
setWearable(type,index,new_wearable);
//new_wearable->writeToAvatar(TRUE);
@@ -1096,7 +1048,7 @@ void LLAgentWearables::recoverMissingWearable(const EWearableType type, U32 inde
LLPointer<LLInventoryCallback> cb =
new addWearableToAgentInventoryCallback(
LLPointer<LLRefCount>(NULL),
- type_s32,
+ type,
index,
new_wearable,
addWearableToAgentInventoryCallback::CALL_RECOVERDONE);
@@ -1119,9 +1071,9 @@ void LLAgentWearables::recoverMissingWearableDone()
}
}
-void LLAgentWearables::addLocalTextureObject(const EWearableType wearable_type, const LLVOAvatarDefines::ETextureIndex texture_type, U32 wearable_index)
+void LLAgentWearables::addLocalTextureObject(const LLWearableType::EType wearable_type, const LLVOAvatarDefines::ETextureIndex texture_type, U32 wearable_index)
{
- LLWearable* wearable = getWearable((EWearableType)wearable_type, wearable_index);
+ LLWearable* wearable = getWearable((LLWearableType::EType)wearable_type, wearable_index);
if (!wearable)
{
llerrs << "Tried to add local texture object to invalid wearable with type " << wearable_type << " and index " << wearable_index << llendl;
@@ -1131,234 +1083,155 @@ void LLAgentWearables::addLocalTextureObject(const EWearableType wearable_type,
wearable->setLocalTextureObject(texture_type, lto);
}
+class OnWearableItemCreatedCB: public LLInventoryCallback
+{
+public:
+ OnWearableItemCreatedCB():
+ mWearablesAwaitingItems(LLWearableType::WT_COUNT,NULL)
+ {
+ llinfos << "created callback" << llendl;
+ }
+ /* virtual */ void fire(const LLUUID& inv_item)
+ {
+ llinfos << "One item created " << inv_item.asString() << llendl;
+ LLViewerInventoryItem *item = gInventory.getItem(inv_item);
+ mItemsToLink.put(item);
+ updatePendingWearable(inv_item);
+ }
+ ~OnWearableItemCreatedCB()
+ {
+ llinfos << "All items created" << llendl;
+ LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy;
+ LLAppearanceMgr::instance().linkAll(LLAppearanceMgr::instance().getCOF(),
+ mItemsToLink,
+ link_waiter);
+ }
+ void addPendingWearable(LLWearable *wearable)
+ {
+ if (!wearable)
+ {
+ llwarns << "no wearable" << llendl;
+ return;
+ }
+ LLWearableType::EType type = wearable->getType();
+ if (type<LLWearableType::WT_COUNT)
+ {
+ mWearablesAwaitingItems[type] = wearable;
+ }
+ else
+ {
+ llwarns << "invalid type " << type << llendl;
+ }
+ }
+ void updatePendingWearable(const LLUUID& inv_item)
+ {
+ LLViewerInventoryItem *item = gInventory.getItem(inv_item);
+ if (!item)
+ {
+ llwarns << "no item found" << llendl;
+ return;
+ }
+ if (!item->isWearableType())
+ {
+ llwarns << "non-wearable item found" << llendl;
+ return;
+ }
+ if (item && item->isWearableType())
+ {
+ LLWearableType::EType type = item->getWearableType();
+ if (type < LLWearableType::WT_COUNT)
+ {
+ LLWearable *wearable = mWearablesAwaitingItems[type];
+ if (wearable)
+ wearable->setItemID(inv_item);
+ }
+ else
+ {
+ llwarns << "invalid wearable type " << type << llendl;
+ }
+ }
+ }
+
+private:
+ LLInventoryModel::item_array_t mItemsToLink;
+ std::vector<LLWearable*> mWearablesAwaitingItems;
+};
+
void LLAgentWearables::createStandardWearables(BOOL female)
{
llwarns << "Creating Standard " << (female ? "female" : "male")
<< " Wearables" << llendl;
- if (mAvatarObject.isNull())
- {
- return;
- }
+ if (!isAgentAvatarValid()) return;
- mAvatarObject->setSex(female ? SEX_FEMALE : SEX_MALE);
+ gAgentAvatarp->setSex(female ? SEX_FEMALE : SEX_MALE);
- const BOOL create[WT_COUNT] =
+ const BOOL create[LLWearableType::WT_COUNT] =
{
- TRUE, //WT_SHAPE
- TRUE, //WT_SKIN
- TRUE, //WT_HAIR
- TRUE, //WT_EYES
- TRUE, //WT_SHIRT
- TRUE, //WT_PANTS
- TRUE, //WT_SHOES
- TRUE, //WT_SOCKS
- FALSE, //WT_JACKET
- FALSE, //WT_GLOVES
- TRUE, //WT_UNDERSHIRT
- TRUE, //WT_UNDERPANTS
- FALSE //WT_SKIRT
+ TRUE, //LLWearableType::WT_SHAPE
+ TRUE, //LLWearableType::WT_SKIN
+ TRUE, //LLWearableType::WT_HAIR
+ TRUE, //LLWearableType::WT_EYES
+ TRUE, //LLWearableType::WT_SHIRT
+ TRUE, //LLWearableType::WT_PANTS
+ TRUE, //LLWearableType::WT_SHOES
+ TRUE, //LLWearableType::WT_SOCKS
+ FALSE, //LLWearableType::WT_JACKET
+ FALSE, //LLWearableType::WT_GLOVES
+ TRUE, //LLWearableType::WT_UNDERSHIRT
+ TRUE, //LLWearableType::WT_UNDERPANTS
+ FALSE //LLWearableType::WT_SKIRT
};
- for (S32 i=0; i < WT_COUNT; i++)
+ LLPointer<LLInventoryCallback> cb = new OnWearableItemCreatedCB;
+ for (S32 i=0; i < LLWearableType::WT_COUNT; i++)
{
- bool once = false;
- LLPointer<LLRefCount> donecb = NULL;
if (create[i])
{
- if (!once)
- {
- once = true;
- donecb = new createStandardWearablesAllDoneCallback;
- }
- llassert(getWearableCount((EWearableType)i) == 0);
- LLWearable* wearable = LLWearableList::instance().createNewWearable((EWearableType)i);
- U32 index = pushWearable((EWearableType)i,wearable);
+ llassert(getWearableCount((LLWearableType::EType)i) == 0);
+ LLWearable* wearable = LLWearableList::instance().createNewWearable((LLWearableType::EType)i);
+ ((OnWearableItemCreatedCB*)(&(*cb)))->addPendingWearable(wearable);
// no need to update here...
- LLPointer<LLInventoryCallback> cb =
- new addWearableToAgentInventoryCallback(
- donecb,
- i,
- index,
- wearable,
- addWearableToAgentInventoryCallback::CALL_CREATESTANDARDDONE);
- addWearableToAgentInventory(cb, wearable, LLUUID::null, FALSE);
+ LLUUID category_id = LLUUID::null;
+ create_inventory_item(gAgent.getID(),
+ gAgent.getSessionID(),
+ category_id,
+ wearable->getTransactionID(),
+ wearable->getName(),
+ wearable->getDescription(),
+ wearable->getAssetType(),
+ LLInventoryType::IT_WEARABLE,
+ wearable->getType(),
+ wearable->getPermissions().getMaskNextOwner(),
+ cb);
}
}
}
void LLAgentWearables::createStandardWearablesDone(S32 type, U32 index)
{
- if (mAvatarObject)
- {
- mAvatarObject->updateVisualParams();
- }
+ llinfos << "type " << type << " index " << index << llendl;
+
+ if (!isAgentAvatarValid()) return;
+ gAgentAvatarp->updateVisualParams();
}
void LLAgentWearables::createStandardWearablesAllDone()
{
// ... because sendAgentWearablesUpdate will notify inventory
// observers.
+ llinfos << "all done?" << llendl;
+
mWearablesLoaded = TRUE;
checkWearablesLoaded();
+ notifyLoadingFinished();
updateServer();
// Treat this as the first texture entry message, if none received yet
- mAvatarObject->onFirstTEMessageReceived();
-}
-
-// MULTI-WEARABLE: Properly handle multiwearables later.
-void LLAgentWearables::getAllWearablesArray(LLDynamicArray<S32>& wearables)
-{
- for( S32 i = 0; i < WT_COUNT; ++i )
- {
- if (getWearableCount((EWearableType) i) != 0)
- {
- wearables.push_back(i);
- }
- }
+ gAgentAvatarp->onFirstTEMessageReceived();
}
-// Note: wearables_to_include should be a list of EWearableType types
-// attachments_to_include should be a list of attachment points
-void LLAgentWearables::makeNewOutfit(const std::string& new_folder_name,
- const LLDynamicArray<S32>& wearables_to_include,
- const LLDynamicArray<S32>& attachments_to_include,
- BOOL rename_clothing)
-{
- if (mAvatarObject.isNull())
- {
- return;
- }
-
- // First, make a folder in the Clothes directory.
- LLUUID folder_id = gInventory.createNewCategory(
- gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING),
- LLFolderType::FT_NONE,
- new_folder_name);
-
- bool found_first_item = false;
-
- ///////////////////
- // Wearables
-
- if (wearables_to_include.count())
- {
- // Then, iterate though each of the wearables and save copies of them in the folder.
- S32 i;
- S32 count = wearables_to_include.count();
- LLDynamicArray<LLUUID> delete_items;
- LLPointer<LLRefCount> cbdone = NULL;
- for (i = 0; i < count; ++i)
- {
- const S32 type = wearables_to_include[i];
- for (U32 j=0; j<getWearableCount((EWearableType)i); j++)
- {
- LLWearable* old_wearable = getWearable((EWearableType)type, j);
- if (old_wearable)
- {
- std::string new_name;
- LLWearable* new_wearable;
- new_wearable = LLWearableList::instance().createCopy(old_wearable);
- if (rename_clothing)
- {
- new_name = new_folder_name;
- new_name.append(" ");
- new_name.append(old_wearable->getTypeLabel());
- LLStringUtil::truncate(new_name, DB_INV_ITEM_NAME_STR_LEN);
- new_wearable->setName(new_name);
- }
-
- LLViewerInventoryItem* item = gInventory.getItem(getWearableItemID((EWearableType)type,j));
- S32 todo = addWearableToAgentInventoryCallback::CALL_NONE;
- if (!found_first_item)
- {
- found_first_item = true;
- /* set the focus to the first item */
- todo |= addWearableToAgentInventoryCallback::CALL_MAKENEWOUTFITDONE;
- /* send the agent wearables update when done */
- cbdone = new sendAgentWearablesUpdateCallback;
- }
- LLPointer<LLInventoryCallback> cb =
- new addWearableToAgentInventoryCallback(
- cbdone,
- type,
- j,
- new_wearable,
- todo);
- if (isWearableCopyable((EWearableType)type, j))
- {
- copy_inventory_item(
- gAgent.getID(),
- item->getPermissions().getOwner(),
- item->getUUID(),
- folder_id,
- new_name,
- cb);
- }
- else
- {
- move_inventory_item(
- gAgent.getID(),
- gAgent.getSessionID(),
- item->getUUID(),
- folder_id,
- new_name,
- cb);
- }
- }
- }
- }
- gInventory.notifyObservers();
- }
-
-
- ///////////////////
- // Attachments
-
- if (attachments_to_include.count())
- {
- BOOL msg_started = FALSE;
- LLMessageSystem* msg = gMessageSystem;
- for (S32 i = 0; i < attachments_to_include.count(); i++)
- {
- S32 attachment_pt = attachments_to_include[i];
- LLViewerJointAttachment* attachment = get_if_there(mAvatarObject->mAttachmentPoints, attachment_pt, (LLViewerJointAttachment*)NULL);
- if (!attachment) continue;
- for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
- attachment_iter != attachment->mAttachedObjects.end();
- ++attachment_iter)
- {
- LLViewerObject *attached_object = (*attachment_iter);
- if(!attached_object) continue;
- const LLUUID& item_id = (*attachment_iter)->getItemID();
- if(item_id.isNull()) continue;
- LLInventoryItem* item = gInventory.getItem(item_id);
- if(!item) continue;
- if(!msg_started)
- {
- msg_started = TRUE;
- msg->newMessage("CreateNewOutfitAttachments");
- msg->nextBlock("AgentData");
- msg->addUUID("AgentID", gAgent.getID());
- msg->addUUID("SessionID", gAgent.getSessionID());
- msg->nextBlock("HeaderData");
- msg->addUUID("NewFolderID", folder_id);
- }
- msg->nextBlock("ObjectData");
- msg->addUUID("OldItemID", item_id);
- msg->addUUID("OldFolderID", item->getParentUUID());
- }
- }
-
- if (msg_started)
- {
- gAgent.sendReliableMessage();
- }
-
- }
-}
class LLShowCreatedOutfit: public LLInventoryCallback
{
@@ -1374,7 +1247,8 @@ public:
LLSideTray::getInstance()->showPanel("panel_outfits_inventory", key);
LLPanelOutfitsInventory *outfit_panel =
dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory"));
- if (outfit_panel)
+ // TODO: add handling "My Outfits" tab.
+ if (outfit_panel && outfit_panel->isCOFPanelActive())
{
outfit_panel->getRootFolder()->clearSelection();
outfit_panel->getRootFolder()->setSelectionByID(mFolderID, TRUE);
@@ -1385,8 +1259,8 @@ public:
tab_outfits->changeOpenClose(tab_outfits->getDisplayChildren());
}
- LLAppearanceManager::instance().updateIsDirty();
- LLAppearanceManager::instance().updatePanelOutfitName("");
+ LLAppearanceMgr::instance().updateIsDirty();
+ LLAppearanceMgr::instance().updatePanelOutfitName("");
}
virtual void fire(const LLUUID&)
@@ -1397,30 +1271,9 @@ private:
LLUUID mFolderID;
};
-LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name)
-{
- if (mAvatarObject.isNull())
- {
- return LLUUID::null;
- }
-
- // First, make a folder in the My Outfits directory.
- const LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
- LLUUID folder_id = gInventory.createNewCategory(
- parent_id,
- LLFolderType::FT_OUTFIT,
- new_folder_name);
-
- LLPointer<LLInventoryCallback> cb = new LLShowCreatedOutfit(folder_id);
- LLAppearanceManager::instance().shallowCopyCategory(LLAppearanceManager::instance().getCOF(),folder_id, cb);
- LLAppearanceManager::instance().createBaseOutfitLink(folder_id, cb);
-
- return folder_id;
-}
-
void LLAgentWearables::makeNewOutfitDone(S32 type, U32 index)
{
- LLUUID first_item_id = getWearableItemID((EWearableType)type, index);
+ LLUUID first_item_id = getWearableItemID((LLWearableType::EType)type, index);
// Open the inventory and select the first item we added.
if (first_item_id.notNull())
{
@@ -1451,10 +1304,10 @@ void LLAgentWearables::addWearableToAgentInventory(LLPointer<LLInventoryCallback
cb);
}
-void LLAgentWearables::removeWearable(const EWearableType type, bool do_remove_all, U32 index)
+void LLAgentWearables::removeWearable(const LLWearableType::EType type, bool do_remove_all, U32 index)
{
if (gAgent.isTeen() &&
- (type == WT_UNDERSHIRT || type == WT_UNDERPANTS))
+ (type == LLWearableType::WT_UNDERSHIRT || type == LLWearableType::WT_UNDERPANTS))
{
// Can't take off underclothing in simple UI mode or on PG accounts
// TODO: enable the removing of a single undershirt/underpants if multiple are worn. - Nyx
@@ -1480,6 +1333,7 @@ void LLAgentWearables::removeWearable(const EWearableType type, bool do_remove_a
{
LLSD payload;
payload["wearable_type"] = (S32)type;
+ payload["wearable_index"] = (S32)index;
// Bring up view-modal dialog: Save changes? Yes, No, Cancel
LLNotificationsUtil::add("WearableSave", LLSD(), payload, &LLAgentWearables::onRemoveWearableDialog);
return;
@@ -1493,22 +1347,21 @@ void LLAgentWearables::removeWearable(const EWearableType type, bool do_remove_a
}
-// MULTI_WEARABLE: assuming one wearable per type.
-// MULTI_WEARABLE: hardwiring 0th elt for now - notification needs to change.
// static
bool LLAgentWearables::onRemoveWearableDialog(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- EWearableType type = (EWearableType)notification["payload"]["wearable_type"].asInteger();
+ LLWearableType::EType type = (LLWearableType::EType)notification["payload"]["wearable_type"].asInteger();
+ S32 index = (S32)notification["payload"]["wearable_index"].asInteger();
switch(option)
{
case 0: // "Save"
- gAgentWearables.saveWearable(type, 0);
- gAgentWearables.removeWearableFinal(type, false, 0);
+ gAgentWearables.saveWearable(type, index);
+ gAgentWearables.removeWearableFinal(type, false, index);
break;
case 1: // "Don't Save"
- gAgentWearables.removeWearableFinal(type, false, 0);
+ gAgentWearables.removeWearableFinal(type, false, index);
break;
case 2: // "Cancel"
@@ -1522,7 +1375,7 @@ bool LLAgentWearables::onRemoveWearableDialog(const LLSD& notification, const LL
}
// Called by removeWearable() and onRemoveWearableDialog() to actually do the removal.
-void LLAgentWearables::removeWearableFinal(const EWearableType type, bool do_remove_all, U32 index)
+void LLAgentWearables::removeWearableFinal(const LLWearableType::EType type, bool do_remove_all, U32 index)
{
//LLAgentDumper dumper("removeWearable");
if (do_remove_all)
@@ -1560,30 +1413,25 @@ void LLAgentWearables::removeWearableFinal(const EWearableType type, bool do_rem
}
// Assumes existing wearables are not dirty.
-// MULTI_WEARABLE: assumes one wearable per type.
void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& items,
const LLDynamicArray< LLWearable* >& wearables,
BOOL remove)
{
- lldebugs << "setWearableOutfit() start" << llendl;
-
- BOOL wearables_to_remove[WT_COUNT];
- wearables_to_remove[WT_SHAPE] = FALSE;
- wearables_to_remove[WT_SKIN] = FALSE;
- wearables_to_remove[WT_HAIR] = FALSE;
- wearables_to_remove[WT_EYES] = FALSE;
- wearables_to_remove[WT_SHIRT] = remove;
- wearables_to_remove[WT_PANTS] = remove;
- wearables_to_remove[WT_SHOES] = remove;
- wearables_to_remove[WT_SOCKS] = remove;
- wearables_to_remove[WT_JACKET] = remove;
- wearables_to_remove[WT_GLOVES] = remove;
- wearables_to_remove[WT_UNDERSHIRT] = (!gAgent.isTeen()) & remove;
- wearables_to_remove[WT_UNDERPANTS] = (!gAgent.isTeen()) & remove;
- wearables_to_remove[WT_SKIRT] = remove;
- wearables_to_remove[WT_ALPHA] = remove;
- wearables_to_remove[WT_TATTOO] = remove;
+ llinfos << "setWearableOutfit() start" << llendl;
+ // TODO: Removed check for ensuring that teens don't remove undershirt and underwear. Handle later
+ if (remove)
+ {
+ // note: shirt is the first non-body part wearable item. Update if wearable order changes.
+ // This loop should remove all clothing, but not any body parts
+ for (S32 type = 0; type < (S32)LLWearableType::WT_COUNT; type++)
+ {
+ if (LLWearableType::getAssetType((LLWearableType::EType)type) == LLAssetType::AT_CLOTHING)
+ {
+ removeWearable((LLWearableType::EType)type, true, 0);
+ }
+ }
+ }
S32 count = wearables.count();
llassert(items.count() == count);
@@ -1594,79 +1442,46 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it
LLWearable* new_wearable = wearables[i];
LLPointer<LLInventoryItem> new_item = items[i];
- const EWearableType type = new_wearable->getType();
- wearables_to_remove[type] = FALSE;
-
- // MULTI_WEARABLE: using 0th
- LLWearable* old_wearable = getWearable(type, 0);
- if (old_wearable)
+ llassert(new_wearable);
+ if (new_wearable)
{
- const LLUUID& old_item_id = getWearableItemID(type, 0);
- if ((old_wearable->getAssetID() == new_wearable->getAssetID()) &&
- (old_item_id == new_item->getUUID()))
- {
- lldebugs << "No change to wearable asset and item: " << LLWearableDictionary::getInstance()->getWearableEntry(type) << llendl;
- continue;
- }
+ const LLWearableType::EType type = new_wearable->getType();
+
+ new_wearable->setName(new_item->getName());
+ new_wearable->setItemID(new_item->getUUID());
- // Assumes existing wearables are not dirty.
- if (old_wearable->isDirty())
+ if (LLWearableType::getAssetType(type) == LLAssetType::AT_BODYPART)
{
- llassert(0);
- continue;
+ // exactly one wearable per body part
+ setWearable(type,0,new_wearable);
}
- }
-
- if (new_wearable)
- new_wearable->setItemID(new_item->getUUID());
- setWearable(type,0,new_wearable);
- }
-
- std::vector<LLWearable*> wearables_being_removed;
-
- for (i = 0; i < WT_COUNT; i++)
- {
- if (wearables_to_remove[i])
- {
- // MULTI_WEARABLE: assuming 0th
- LLWearable* wearable = getWearable((EWearableType)i, 0);
- const LLUUID &item_id = getWearableItemID((EWearableType)i,0);
- gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
- if (wearable)
+ else
{
- wearables_being_removed.push_back(wearable);
+ pushWearable(type,new_wearable);
}
- removeWearable((EWearableType)i,true,0);
+ wearableUpdated(new_wearable);
+ checkWearableAgainstInventory(new_wearable);
}
}
gInventory.notifyObservers();
-
- std::vector<LLWearable*>::iterator wearable_iter;
-
- for (wearable_iter = wearables_being_removed.begin();
- wearable_iter != wearables_being_removed.end();
- ++wearable_iter)
- {
- LLWearable* wearablep = *wearable_iter;
- if (wearablep)
- {
- wearablep->removeFromAvatar(TRUE);
- }
- }
-
- if (mAvatarObject)
+ if (isAgentAvatarValid())
{
- mAvatarObject->updateVisualParams();
+ gAgentAvatarp->setCompositeUpdatesEnabled(TRUE);
+ gAgentAvatarp->updateVisualParams();
+ gAgentAvatarp->invalidateAll();
}
// Start rendering & update the server
mWearablesLoaded = TRUE;
checkWearablesLoaded();
+ notifyLoadingFinished();
queryWearableCache();
updateServer();
+ gAgentAvatarp->dumpAvatarTEs("setWearableOutfit");
+
lldebugs << "setWearableOutfit() end" << llendl;
}
@@ -1681,7 +1496,7 @@ void LLAgentWearables::setWearableItem(LLInventoryItem* new_item, LLWearable* ne
return;
}
- const EWearableType type = new_wearable->getType();
+ const LLWearableType::EType type = new_wearable->getType();
if (!do_append)
{
@@ -1694,7 +1509,7 @@ void LLAgentWearables::setWearableItem(LLInventoryItem* new_item, LLWearable* ne
if ((old_wearable->getAssetID() == new_wearable->getAssetID()) &&
(old_item_id == new_item->getUUID()))
{
- lldebugs << "No change to wearable asset and item: " << LLWearableDictionary::getInstance()->getWearableEntry(type) << llendl;
+ lldebugs << "No change to wearable asset and item: " << LLWearableType::getTypeName(type) << llendl;
return;
}
@@ -1717,6 +1532,7 @@ bool LLAgentWearables::onSetWearableDialog(const LLSD& notification, const LLSD&
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
LLInventoryItem* new_item = gInventory.getItem(notification["payload"]["item_id"].asUUID());
+ U32 index = gAgentWearables.getWearableIndex(wearable);
if (!new_item)
{
delete wearable;
@@ -1726,8 +1542,7 @@ bool LLAgentWearables::onSetWearableDialog(const LLSD& notification, const LLSD&
switch(option)
{
case 0: // "Save"
-// MULTI_WEARABLE: assuming 0th
- gAgentWearables.saveWearable(wearable->getType(),0);
+ gAgentWearables.saveWearable(wearable->getType(),index);
gAgentWearables.setWearableFinal(new_item, wearable);
break;
@@ -1751,7 +1566,7 @@ bool LLAgentWearables::onSetWearableDialog(const LLSD& notification, const LLSD&
// MULTI_WEARABLE: unify code after null objects are gone.
void LLAgentWearables::setWearableFinal(LLInventoryItem* new_item, LLWearable* new_wearable, bool do_append)
{
- const EWearableType type = new_wearable->getType();
+ const LLWearableType::EType type = new_wearable->getType();
if (do_append && getWearableItemID(type,0).notNull())
{
@@ -1816,32 +1631,18 @@ void LLAgentWearables::queryWearableCache()
S32 num_queries = 0;
for (U8 baked_index = 0; baked_index < BAKED_NUM_INDICES; baked_index++)
{
- const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index);
- LLUUID hash;
- for (U8 i=0; i < baked_dict->mWearables.size(); i++)
+ LLUUID hash_id = computeBakedTextureHash((EBakedTextureIndex) baked_index);
+ if (hash_id.notNull())
{
- const EWearableType baked_type = baked_dict->mWearables[i];
- // MULTI_WEARABLE: not order-dependent
- const U32 num_wearables = getWearableCount(baked_type);
- for (U32 index = 0; index < num_wearables; ++index)
- {
- const LLWearable* wearable = getWearable(baked_type,index);
- if (wearable)
- {
- hash ^= wearable->getAssetID();
- }
- }
- }
- if (hash.notNull())
- {
- hash ^= baked_dict->mWearablesHashID;
num_queries++;
// *NOTE: make sure at least one request gets packed
+ ETextureIndex te_index = LLVOAvatarDictionary::bakedToLocalTextureIndex((EBakedTextureIndex)baked_index);
+
//llinfos << "Requesting texture for hash " << hash << " in baked texture slot " << baked_index << llendl;
gMessageSystem->nextBlockFast(_PREHASH_WearableData);
- gMessageSystem->addUUIDFast(_PREHASH_ID, hash);
- gMessageSystem->addU8Fast(_PREHASH_TextureIndex, (U8)baked_index);
+ gMessageSystem->addUUIDFast(_PREHASH_ID, hash_id);
+ gMessageSystem->addU8Fast(_PREHASH_TextureIndex, (U8)te_index);
}
gAgentQueryManager.mActiveCacheQueries[baked_index] = gAgentQueryManager.mWearablesCacheQueryID;
@@ -1853,16 +1654,66 @@ void LLAgentWearables::queryWearableCache()
gAgentQueryManager.mWearablesCacheQueryID++;
}
-// MULTI_WEARABLE: need a way to specify by wearable rather than by type.
+LLUUID LLAgentWearables::computeBakedTextureHash(LLVOAvatarDefines::EBakedTextureIndex baked_index,
+ BOOL generate_valid_hash) // Set to false if you want to upload the baked texture w/o putting it in the cache
+{
+ LLUUID hash_id;
+ bool hash_computed = false;
+ LLMD5 hash;
+ const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture(baked_index);
+
+ for (U8 i=0; i < baked_dict->mWearables.size(); i++)
+ {
+ const LLWearableType::EType baked_type = baked_dict->mWearables[i];
+ const U32 num_wearables = getWearableCount(baked_type);
+ for (U32 index = 0; index < num_wearables; ++index)
+ {
+ const LLWearable* wearable = getWearable(baked_type,index);
+ if (wearable)
+ {
+ LLUUID asset_id = wearable->getAssetID();
+ hash.update((const unsigned char*)asset_id.mData, UUID_BYTES);
+ hash_computed = true;
+ }
+ }
+ }
+ if (hash_computed)
+ {
+ hash.update((const unsigned char*)baked_dict->mWearablesHashID.mData, UUID_BYTES);
+
+ // Add some garbage into the hash so that it becomes invalid.
+ if (!generate_valid_hash)
+ {
+ if (isAgentAvatarValid())
+ {
+ hash.update((const unsigned char*)gAgentAvatarp->getID().mData, UUID_BYTES);
+ }
+ }
+ hash.finalize();
+ hash.raw_digest(hash_id.mData);
+ }
+
+ return hash_id;
+}
+
// User has picked "remove from avatar" from a menu.
// static
-void LLAgentWearables::userRemoveWearable(EWearableType& type)
+void LLAgentWearables::userRemoveWearable(const LLWearableType::EType &type, const U32 &index)
{
- if (!(type==WT_SHAPE || type==WT_SKIN || type==WT_HAIR)) //&&
- //!((!gAgent.isTeen()) && (type==WT_UNDERPANTS || type==WT_UNDERSHIRT)))
+ if (!(type==LLWearableType::WT_SHAPE || type==LLWearableType::WT_SKIN || type==LLWearableType::WT_HAIR || type==LLWearableType::WT_EYES)) //&&
+ //!((!gAgent.isTeen()) && (type==LLWearableType::WT_UNDERPANTS || type==LLWearableType::WT_UNDERSHIRT)))
{
- // MULTI_WEARABLE: fixed to 0th for now.
- gAgentWearables.removeWearable(type,false,0);
+ gAgentWearables.removeWearable(type,false,index);
+ }
+}
+
+//static
+void LLAgentWearables::userRemoveWearablesOfType(const LLWearableType::EType &type)
+{
+ if (!(type==LLWearableType::WT_SHAPE || type==LLWearableType::WT_SKIN || type==LLWearableType::WT_HAIR || type==LLWearableType::WT_EYES)) //&&
+ //!((!gAgent.isTeen()) && (type==LLWearableType::WT_UNDERPANTS || type==LLWearableType::WT_UNDERSHIRT)))
+ {
+ gAgentWearables.removeWearable(type,true,0);
}
}
@@ -1870,14 +1721,12 @@ void LLAgentWearables::userRemoveWearable(EWearableType& type)
void LLAgentWearables::userRemoveAllClothes()
{
// We have to do this up front to avoid having to deal with the case of multiple wearables being dirty.
- if (gFloaterCustomize)
- {
- gFloaterCustomize->askToSaveIfDirty(userRemoveAllClothesStep2);
- }
- else
+ if (gAgentCamera.cameraCustomizeAvatar())
{
- userRemoveAllClothesStep2(TRUE);
+ // switching to outfit editor should automagically save any currently edited wearable
+ LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit"));
}
+ userRemoveAllClothesStep2(TRUE);
}
// static
@@ -1885,17 +1734,17 @@ void LLAgentWearables::userRemoveAllClothesStep2(BOOL proceed)
{
if (proceed)
{
- gAgentWearables.removeWearable(WT_SHIRT,true,0);
- gAgentWearables.removeWearable(WT_PANTS,true,0);
- gAgentWearables.removeWearable(WT_SHOES,true,0);
- gAgentWearables.removeWearable(WT_SOCKS,true,0);
- gAgentWearables.removeWearable(WT_JACKET,true,0);
- gAgentWearables.removeWearable(WT_GLOVES,true,0);
- gAgentWearables.removeWearable(WT_UNDERSHIRT,true,0);
- gAgentWearables.removeWearable(WT_UNDERPANTS,true,0);
- gAgentWearables.removeWearable(WT_SKIRT,true,0);
- gAgentWearables.removeWearable(WT_ALPHA,true,0);
- gAgentWearables.removeWearable(WT_TATTOO,true,0);
+ gAgentWearables.removeWearable(LLWearableType::WT_SHIRT,true,0);
+ gAgentWearables.removeWearable(LLWearableType::WT_PANTS,true,0);
+ gAgentWearables.removeWearable(LLWearableType::WT_SHOES,true,0);
+ gAgentWearables.removeWearable(LLWearableType::WT_SOCKS,true,0);
+ gAgentWearables.removeWearable(LLWearableType::WT_JACKET,true,0);
+ gAgentWearables.removeWearable(LLWearableType::WT_GLOVES,true,0);
+ gAgentWearables.removeWearable(LLWearableType::WT_UNDERSHIRT,true,0);
+ gAgentWearables.removeWearable(LLWearableType::WT_UNDERPANTS,true,0);
+ gAgentWearables.removeWearable(LLWearableType::WT_SKIRT,true,0);
+ gAgentWearables.removeWearable(LLWearableType::WT_ALPHA,true,0);
+ gAgentWearables.removeWearable(LLWearableType::WT_TATTOO,true,0);
}
}
@@ -1908,12 +1757,7 @@ void LLAgentWearables::userUpdateAttachments(LLInventoryModel::item_array_t& obj
// already wearing and in request set -> leave alone.
// not wearing and in request set -> put on.
- LLVOAvatar* avatarp = gAgent.getAvatarObject();
- if (!avatarp)
- {
- llwarns << "No avatar found." << llendl;
- return;
- }
+ if (!isAgentAvatarValid()) return;
std::set<LLUUID> requested_item_ids;
std::set<LLUUID> current_item_ids;
@@ -1922,8 +1766,8 @@ void LLAgentWearables::userUpdateAttachments(LLInventoryModel::item_array_t& obj
// Build up list of objects to be removed and items currently attached.
llvo_vec_t objects_to_remove;
- for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin();
- iter != avatarp->mAttachmentPoints.end();)
+ for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin();
+ iter != gAgentAvatarp->mAttachmentPoints.end();)
{
LLVOAvatar::attachment_map_t::iterator curiter = iter++;
LLViewerJointAttachment* attachment = curiter->second;
@@ -1979,12 +1823,7 @@ void LLAgentWearables::userUpdateAttachments(LLInventoryModel::item_array_t& obj
void LLAgentWearables::userRemoveMultipleAttachments(llvo_vec_t& objects_to_remove)
{
- LLVOAvatar* avatarp = gAgent.getAvatarObject();
- if (!avatarp)
- {
- llwarns << "No avatar found." << llendl;
- return;
- }
+ if (!isAgentAvatarValid()) return;
if (objects_to_remove.empty())
return;
@@ -2007,17 +1846,12 @@ void LLAgentWearables::userRemoveMultipleAttachments(llvo_vec_t& objects_to_remo
void LLAgentWearables::userRemoveAllAttachments()
{
- LLVOAvatar* avatarp = gAgent.getAvatarObject();
- if (!avatarp)
- {
- llwarns << "No avatar found." << llendl;
- return;
- }
+ if (!isAgentAvatarValid()) return;
llvo_vec_t objects_to_remove;
- for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin();
- iter != avatarp->mAttachmentPoints.end();)
+ for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin();
+ iter != gAgentAvatarp->mAttachmentPoints.end();)
{
LLVOAvatar::attachment_map_t::iterator curiter = iter++;
LLViewerJointAttachment* attachment = curiter->second;
@@ -2073,7 +1907,11 @@ void LLAgentWearables::userAttachMultipleAttachments(LLInventoryModel::item_arra
msg->nextBlockFast(_PREHASH_ObjectData );
msg->addUUIDFast(_PREHASH_ItemID, item->getLinkedUUID());
msg->addUUIDFast(_PREHASH_OwnerID, item->getPermissions().getOwner());
+#if ENABLE_MULTIATTACHMENTS
+ msg->addU8Fast(_PREHASH_AttachmentPt, 0 | ATTACHMENT_ADD );
+#else
msg->addU8Fast(_PREHASH_AttachmentPt, 0 ); // Wear at the previous or default attachment point
+#endif
pack_permissions_slam(msg, item->getFlags(), item->getPermissions());
msg->addStringFast(_PREHASH_Name, item->getName());
msg->addStringFast(_PREHASH_Description, item->getDescription());
@@ -2097,476 +1935,205 @@ void LLAgentWearables::checkWearablesLoaded() const
#endif
}
+// Returns false if the given wearable is already topmost/bottommost
+// (depending on closer_to_body parameter).
+bool LLAgentWearables::canMoveWearable(const LLUUID& item_id, bool closer_to_body)
+{
+ const LLWearable* wearable = getWearableFromItemID(item_id);
+ if (!wearable) return false;
+
+ LLWearableType::EType wtype = wearable->getType();
+ const LLWearable* marginal_wearable = closer_to_body ? getBottomWearable(wtype) : getTopWearable(wtype);
+ if (!marginal_wearable) return false;
+
+ return wearable != marginal_wearable;
+}
+
BOOL LLAgentWearables::areWearablesLoaded() const
{
checkWearablesLoaded();
return mWearablesLoaded;
}
-// MULTI-WEARABLE: update for multiple indices.
+// MULTI-WEARABLE: DEPRECATED: item pending count relies on old messages that don't support multi-wearables. do not trust to be accurate
void LLAgentWearables::updateWearablesLoaded()
{
mWearablesLoaded = (itemUpdatePendingCount()==0);
+ if (mWearablesLoaded)
+ {
+ notifyLoadingFinished();
+ }
}
bool LLAgentWearables::canWearableBeRemoved(const LLWearable* wearable) const
{
if (!wearable) return false;
- EWearableType type = wearable->getType();
+ LLWearableType::EType type = wearable->getType();
// Make sure the user always has at least one shape, skin, eyes, and hair type currently worn.
- return !(((type == WT_SHAPE) || (type == WT_SKIN) || (type == WT_HAIR) || (type == WT_EYES))
+ return !(((type == LLWearableType::WT_SHAPE) || (type == LLWearableType::WT_SKIN) || (type == LLWearableType::WT_HAIR) || (type == LLWearableType::WT_EYES))
&& (getWearableCount(type) <= 1) );
}
void LLAgentWearables::animateAllWearableParams(F32 delta, BOOL upload_bake)
{
- for( S32 type = 0; type < WT_COUNT; ++type )
+ for( S32 type = 0; type < LLWearableType::WT_COUNT; ++type )
{
- for (S32 count = 0; count < (S32)getWearableCount((EWearableType)type); ++count)
+ for (S32 count = 0; count < (S32)getWearableCount((LLWearableType::EType)type); ++count)
{
- LLWearable *wearable = getWearable((EWearableType)type,count);
+ LLWearable *wearable = getWearable((LLWearableType::EType)type,count);
wearable->animateParams(delta, upload_bake);
}
}
}
-void LLAgentWearables::updateServer()
+bool LLAgentWearables::moveWearable(const LLViewerInventoryItem* item, bool closer_to_body)
{
- sendAgentWearablesUpdate();
- gAgent.sendAgentSetAppearance();
-}
+ if (!item) return false;
+ if (!item->isWearableType()) return false;
-void LLAgentWearables::populateMyOutfitsFolder(void)
-{
- LLLibraryOutfitsFetch* outfits = new LLLibraryOutfitsFetch();
-
- // Get the complete information on the items in the inventory and
- // setup an observer that will wait for that to happen.
- LLInventoryFetchDescendentsObserver::folder_ref_t folders;
- outfits->mMyOutfitsID = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+ wearableentry_map_t::iterator wearable_iter = mWearableDatas.find(item->getWearableType());
+ if (wearable_iter == mWearableDatas.end()) return false;
- folders.push_back(outfits->mMyOutfitsID);
- gInventory.addObserver(outfits);
- outfits->fetchDescendents(folders);
- if (outfits->isEverythingComplete())
- {
- outfits->done();
- }
-}
+ wearableentry_vec_t& wearable_vec = wearable_iter->second;
+ if (wearable_vec.empty()) return false;
-void LLLibraryOutfitsFetch::done()
-{
- // Delay this until idle() routine, since it's a heavy operation and
- // we also can't have it run within notifyObservers.
- doOnIdle(boost::bind(&LLLibraryOutfitsFetch::doneIdle,this));
- gInventory.removeObserver(this); // Prevent doOnIdle from being added twice.
-}
+ const LLUUID& asset_id = item->getAssetUUID();
-void LLLibraryOutfitsFetch::doneIdle()
-{
- gInventory.addObserver(this); // Add this back in since it was taken out during ::done()
-
- switch (mCurrFetchStep)
- {
- case LOFS_FOLDER:
- folderDone();
- mCurrFetchStep = LOFS_OUTFITS;
- break;
- case LOFS_OUTFITS:
- outfitsDone();
- mCurrFetchStep = LOFS_LIBRARY;
- break;
- case LOFS_LIBRARY:
- libraryDone();
- mCurrFetchStep = LOFS_IMPORTED;
- break;
- case LOFS_IMPORTED:
- importedFolderDone();
- mCurrFetchStep = LOFS_CONTENTS;
- break;
- case LOFS_CONTENTS:
- contentsDone();
- break;
- default:
- llwarns << "Got invalid state for outfit fetch: " << mCurrFetchStep << llendl;
- mOutfitsPopulated = TRUE;
- break;
- }
+ //nowhere to move if the wearable is already on any boundary (closest to the body/furthest from the body)
+ if (closer_to_body && asset_id == wearable_vec.front()->getAssetID()) return false;
+ if (!closer_to_body && asset_id == wearable_vec.back()->getAssetID()) return false;
- // We're completely done. Cleanup.
- if (mOutfitsPopulated)
+ for (U32 i = 0; i < wearable_vec.size(); ++i)
{
- gInventory.removeObserver(this);
- delete this;
- return;
+ LLWearable* wearable = wearable_vec[i];
+ if (!wearable) continue;
+ if (wearable->getAssetID() != asset_id) continue;
+
+ //swapping wearables
+ U32 swap_i = closer_to_body ? i-1 : i+1;
+ wearable_vec[i] = wearable_vec[swap_i];
+ wearable_vec[swap_i] = wearable;
+ return true;
}
-}
-void LLLibraryOutfitsFetch::folderDone(void)
-{
- LLInventoryModel::cat_array_t cat_array;
- LLInventoryModel::item_array_t wearable_array;
- gInventory.collectDescendents(mMyOutfitsID, cat_array, wearable_array,
- LLInventoryModel::EXCLUDE_TRASH);
-
- // Early out if we already have items in My Outfits.
- if (cat_array.count() > 0 || wearable_array.count() > 0)
- {
- mOutfitsPopulated = true;
- return;
- }
-
- mClothingID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);
- mLibraryClothingID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING, false, true);
-
- mCompleteFolders.clear();
-
- // Get the complete information on the items in the inventory.
- LLInventoryFetchDescendentsObserver::folder_ref_t folders;
- folders.push_back(mClothingID);
- folders.push_back(mLibraryClothingID);
- fetchDescendents(folders);
- if (isEverythingComplete())
- {
- done();
- }
+ return false;
}
-void LLLibraryOutfitsFetch::outfitsDone(void)
+// static
+void LLAgentWearables::createWearable(LLWearableType::EType type, bool wear, const LLUUID& parent_id)
{
- LLInventoryModel::cat_array_t cat_array;
- LLInventoryModel::item_array_t wearable_array;
- LLInventoryFetchDescendentsObserver::folder_ref_t folders;
-
- // Collect the contents of the Library's Clothing folder
- gInventory.collectDescendents(mLibraryClothingID, cat_array, wearable_array,
- LLInventoryModel::EXCLUDE_TRASH);
-
- llassert(cat_array.count() > 0);
- for (LLInventoryModel::cat_array_t::const_iterator iter = cat_array.begin();
- iter != cat_array.end();
- ++iter)
+ if (type == LLWearableType::WT_INVALID || type == LLWearableType::WT_NONE) return;
+
+ LLWearable* wearable = LLWearableList::instance().createNewWearable(type);
+ LLAssetType::EType asset_type = wearable->getAssetType();
+ LLInventoryType::EType inv_type = LLInventoryType::IT_WEARABLE;
+ LLPointer<LLInventoryCallback> cb = wear ? new LLWearAndEditCallback : NULL;
+ LLUUID folder_id;
+
+ if (parent_id.notNull())
{
- const LLViewerInventoryCategory *cat = iter->get();
-
- // Get the names and id's of every outfit in the library, except for ruth and other "misc" outfits.
- if (cat->getName() != "More Outfits" && cat->getName() != "Ruth")
- {
- // Get the name of every outfit in the library
- folders.push_back(cat->getUUID());
- mLibraryClothingFolders.push_back(std::make_pair(cat->getUUID(), cat->getName()));
- }
+ folder_id = parent_id;
}
-
- // Collect the contents of your Inventory Clothing folder
- cat_array.clear();
- wearable_array.clear();
- gInventory.collectDescendents(mClothingID, cat_array, wearable_array,
- LLInventoryModel::EXCLUDE_TRASH);
-
- // Check if you already have an "Imported Library Clothing" folder
- for (LLInventoryModel::cat_array_t::const_iterator iter = cat_array.begin();
- iter != cat_array.end();
- ++iter)
- {
- const LLViewerInventoryCategory *cat = iter->get();
- if (cat->getName() == mImportedClothingName)
- {
- mImportedClothingID = cat->getUUID();
- }
- }
-
- mCompleteFolders.clear();
-
- fetchDescendents(folders);
- if (isEverythingComplete())
+ else
{
- done();
+ LLFolderType::EType folder_type = LLFolderType::assetTypeToFolderType(asset_type);
+ folder_id = gInventory.findCategoryUUIDForType(folder_type);
}
+
+ create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
+ folder_id, wearable->getTransactionID(), wearable->getName(),
+ wearable->getDescription(), asset_type, inv_type, wearable->getType(),
+ wearable->getPermissions().getMaskNextOwner(),
+ cb);
}
-class LLLibraryOutfitsCopyDone: public LLInventoryCallback
+// static
+void LLAgentWearables::editWearable(const LLUUID& item_id)
{
-public:
- LLLibraryOutfitsCopyDone(LLLibraryOutfitsFetch * fetcher):
- mFireCount(0), mLibraryOutfitsFetcher(fetcher)
+ LLViewerInventoryItem* item = gInventory.getLinkedItem(item_id);
+ if (!item)
{
+ llwarns << "Failed to get linked item" << llendl;
+ return;
}
-
- virtual ~LLLibraryOutfitsCopyDone()
+
+ LLWearable* wearable = gAgentWearables.getWearableFromItemID(item_id);
+ if (!wearable)
{
- if (!LLApp::isExiting() && mLibraryOutfitsFetcher)
- {
- gInventory.addObserver(mLibraryOutfitsFetcher);
- mLibraryOutfitsFetcher->done();
- }
+ llwarns << "Cannot get wearable" << llendl;
+ return;
}
-
- /* virtual */ void fire(const LLUUID& inv_item)
+
+ if (!gAgentWearables.isWearableModifiable(item->getUUID()))
{
- mFireCount++;
+ llwarns << "Cannot modify wearable" << llendl;
+ return;
}
-private:
- U32 mFireCount;
- LLLibraryOutfitsFetch * mLibraryOutfitsFetcher;
-};
-void LLLibraryOutfitsFetch::libraryDone(void)
+ LLPanel* panel = LLSideTray::getInstance()->getPanel("sidepanel_appearance");
+ LLSidepanelAppearance::editWearable(wearable, panel);
+}
+
+// Request editing the item after it gets worn.
+void LLAgentWearables::requestEditingWearable(const LLUUID& item_id)
{
- // Copy the clothing folders from the library into the imported clothing folder if necessary.
- if (mImportedClothingID == LLUUID::null)
- {
- gInventory.removeObserver(this);
- LLPointer<LLInventoryCallback> copy_waiter = new LLLibraryOutfitsCopyDone(this);
- mImportedClothingID = gInventory.createNewCategory(mClothingID,
- LLFolderType::FT_NONE,
- mImportedClothingName);
-
- for (cloth_folder_vec_t::const_iterator iter = mLibraryClothingFolders.begin();
- iter != mLibraryClothingFolders.end();
- ++iter)
- {
- LLUUID folder_id = gInventory.createNewCategory(mImportedClothingID,
- LLFolderType::FT_NONE,
- iter->second);
- LLAppearanceManager::getInstance()->shallowCopyCategory(iter->first, folder_id, copy_waiter);
- }
- }
- else
- {
- // Skip straight to fetching the contents of the imported folder
- importedFolderFetch();
- }
+ mItemToEdit = gInventory.getLinkedItemID(item_id);
}
-void LLLibraryOutfitsFetch::importedFolderFetch(void)
+// Start editing the item if previously requested.
+void LLAgentWearables::editWearableIfRequested(const LLUUID& item_id)
{
- // Fetch the contents of the Imported Clothing Folder
- LLInventoryFetchDescendentsObserver::folder_ref_t folders;
- folders.push_back(mImportedClothingID);
-
- mCompleteFolders.clear();
-
- fetchDescendents(folders);
- if (isEverythingComplete())
+ if (mItemToEdit.notNull() &&
+ mItemToEdit == gInventory.getLinkedItemID(item_id))
{
- done();
+ LLAgentWearables::editWearable(item_id);
+ mItemToEdit.setNull();
}
}
-void LLLibraryOutfitsFetch::importedFolderDone(void)
+void LLAgentWearables::updateServer()
{
- LLInventoryModel::cat_array_t cat_array;
- LLInventoryModel::item_array_t wearable_array;
- LLInventoryFetchDescendentsObserver::folder_ref_t folders;
-
- // Collect the contents of the Imported Clothing folder
- gInventory.collectDescendents(mImportedClothingID, cat_array, wearable_array,
- LLInventoryModel::EXCLUDE_TRASH);
-
- for (LLInventoryModel::cat_array_t::const_iterator iter = cat_array.begin();
- iter != cat_array.end();
- ++iter)
- {
- const LLViewerInventoryCategory *cat = iter->get();
-
- // Get the name of every imported outfit
- folders.push_back(cat->getUUID());
- mImportedClothingFolders.push_back(std::make_pair(cat->getUUID(), cat->getName()));
- }
-
- mCompleteFolders.clear();
- fetchDescendents(folders);
- if (isEverythingComplete())
- {
- done();
- }
+ sendAgentWearablesUpdate();
+ gAgent.sendAgentSetAppearance();
}
-void LLLibraryOutfitsFetch::contentsDone(void)
-{
- LLInventoryModel::cat_array_t cat_array;
- LLInventoryModel::item_array_t wearable_array;
+void LLAgentWearables::populateMyOutfitsFolder(void)
+{
+ llinfos << "starting outfit population" << llendl;
+
+ const LLUUID& my_outfits_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+ LLLibraryOutfitsFetch* outfits = new LLLibraryOutfitsFetch(my_outfits_id);
+ outfits->mMyOutfitsID = my_outfits_id;
- for (cloth_folder_vec_t::const_iterator folder_iter = mImportedClothingFolders.begin();
- folder_iter != mImportedClothingFolders.end();
- ++folder_iter)
+ // Get the complete information on the items in the inventory and
+ // setup an observer that will wait for that to happen.
+ gInventory.addObserver(outfits);
+ outfits->startFetch();
+ if (outfits->isFinished())
{
- // First, make a folder in the My Outfits directory.
- LLUUID new_outfit_folder_id = gInventory.createNewCategory(mMyOutfitsID, LLFolderType::FT_OUTFIT, folder_iter->second);
-
- cat_array.clear();
- wearable_array.clear();
- // Collect the contents of each imported clothing folder, so we can create new outfit links for it
- gInventory.collectDescendents(folder_iter->first, cat_array, wearable_array,
- LLInventoryModel::EXCLUDE_TRASH);
-
- for (LLInventoryModel::item_array_t::const_iterator wearable_iter = wearable_array.begin();
- wearable_iter != wearable_array.end();
- ++wearable_iter)
- {
- const LLViewerInventoryItem *item = wearable_iter->get();
- link_inventory_item(gAgent.getID(),
- item->getLinkedUUID(),
- new_outfit_folder_id,
- item->getName(),
- LLAssetType::AT_LINK,
- NULL);
- }
+ outfits->done();
}
-
- mOutfitsPopulated = true;
}
-//--------------------------------------------------------------------
-// InitialWearablesFetch
-//
-// This grabs contents from the COF and processes them.
-// The processing is handled in idle(), i.e. outside of done(),
-// to avoid gInventory.notifyObservers recursion.
-//--------------------------------------------------------------------
-
-LLInitialWearablesFetch::~LLInitialWearablesFetch()
+boost::signals2::connection LLAgentWearables::addLoadingStartedCallback(loading_started_callback_t cb)
{
+ return mLoadingStartedSignal.connect(cb);
}
-// virtual
-void LLInitialWearablesFetch::done()
+boost::signals2::connection LLAgentWearables::addLoadedCallback(loaded_callback_t cb)
{
- // Delay processing the actual results of this so it's not handled within
- // gInventory.notifyObservers. The results will be handled in the next
- // idle tick instead.
- gInventory.removeObserver(this);
- doOnIdle(boost::bind(&LLInitialWearablesFetch::processContents,this));
+ return mLoadedSignal.connect(cb);
}
-void LLInitialWearablesFetch::processContents()
+void LLAgentWearables::notifyLoadingStarted()
{
- // Fetch the wearable items from the Current Outfit Folder
- LLInventoryModel::cat_array_t cat_array;
- LLInventoryModel::item_array_t wearable_array;
- LLFindWearables is_wearable;
- gInventory.collectDescendentsIf(mCompleteFolders.front(), cat_array, wearable_array,
- LLInventoryModel::EXCLUDE_TRASH, is_wearable);
-
- LLAppearanceManager::instance().setAttachmentInvLinkEnable(true);
- if (wearable_array.count() > 0)
- {
- LLAppearanceManager::instance().updateAppearanceFromCOF();
- }
- else
- {
- // if we're constructing the COF from the wearables message, we don't have a proper outfit link
- LLAppearanceManager::instance().setOutfitDirty(true);
- processWearablesMessage();
- }
- delete this;
+ mCOFChangeInProgress = true;
+ mLoadingStartedSignal();
}
-class LLFetchAndLinkObserver: public LLInventoryFetchObserver
-{
-public:
- LLFetchAndLinkObserver(LLInventoryFetchObserver::item_ref_t& ids):
- m_ids(ids),
- LLInventoryFetchObserver(true)
- {
- }
- ~LLFetchAndLinkObserver()
- {
- }
- virtual void done()
- {
- gInventory.removeObserver(this);
- // Link to all fetched items in COF.
- for (LLInventoryFetchObserver::item_ref_t::iterator it = m_ids.begin();
- it != m_ids.end();
- ++it)
- {
- LLUUID id = *it;
- LLViewerInventoryItem *item = gInventory.getItem(*it);
- if (!item)
- {
- llwarns << "fetch failed!" << llendl;
- continue;
- }
- link_inventory_item(gAgent.getID(), item->getLinkedUUID(), LLAppearanceManager::instance().getCOF(), item->getName(),
- LLAssetType::AT_LINK, LLPointer<LLInventoryCallback>(NULL));
- }
- }
-private:
- LLInventoryFetchObserver::item_ref_t m_ids;
-};
-
-void LLInitialWearablesFetch::processWearablesMessage()
+void LLAgentWearables::notifyLoadingFinished()
{
- if (!mAgentInitialWearables.empty()) // We have an empty current outfit folder, use the message data instead.
- {
- const LLUUID current_outfit_id = LLAppearanceManager::instance().getCOF();
- LLInventoryFetchObserver::item_ref_t ids;
- for (U8 i = 0; i < mAgentInitialWearables.size(); ++i)
- {
- // Populate the current outfit folder with links to the wearables passed in the message
- InitialWearableData *wearable_data = new InitialWearableData(mAgentInitialWearables[i]); // This will be deleted in the callback.
-
- if (wearable_data->mAssetID.notNull())
- {
-#ifdef USE_CURRENT_OUTFIT_FOLDER
- ids.push_back(wearable_data->mItemID);
-#endif
- // Fetch the wearables
- LLWearableList::instance().getAsset(wearable_data->mAssetID,
- LLStringUtil::null,
- LLWearableDictionary::getAssetType(wearable_data->mType),
- LLAgentWearables::onInitialWearableAssetArrived, (void*)(wearable_data));
- }
- else
- {
- llinfos << "Invalid wearable, type " << wearable_data->mType << " itemID "
- << wearable_data->mItemID << " assetID " << wearable_data->mAssetID << llendl;
- delete wearable_data;
- }
- }
-
- // Add all current attachments to the requested items as well.
- LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- if( avatar )
- {
- for (LLVOAvatar::attachment_map_t::const_iterator iter = avatar->mAttachmentPoints.begin();
- iter != avatar->mAttachmentPoints.end(); ++iter)
- {
- LLViewerJointAttachment* attachment = iter->second;
- if (!attachment) continue;
- for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
- attachment_iter != attachment->mAttachedObjects.end();
- ++attachment_iter)
- {
- LLViewerObject* attached_object = (*attachment_iter);
- if (!attached_object) continue;
- const LLUUID& item_id = attached_object->getItemID();
- if (item_id.isNull()) continue;
- ids.push_back(item_id);
- }
- }
- }
-
- // Need to fetch the inventory items for ids, then create links to them after they arrive.
- LLFetchAndLinkObserver *fetcher = new LLFetchAndLinkObserver(ids);
- fetcher->fetchItems(ids);
- // If no items to be fetched, done will never be triggered.
- // TODO: Change LLInventoryFetchObserver::fetchItems to trigger done() on this condition.
- if (fetcher->isEverythingComplete())
- {
- fetcher->done();
- }
- else
- {
- gInventory.addObserver(fetcher);
- }
- }
- else
- {
- LL_WARNS("Wearables") << "No current outfit folder items found and no initial wearables fallback message received." << LL_ENDL;
- }
+ mCOFChangeInProgress = false;
+ mLoadedSignal();
}
-
-
+// EOF
diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h
index b4f58674af..8122971db6 100644
--- a/indra/newview/llagentwearables.h
+++ b/indra/newview/llagentwearables.h
@@ -33,9 +33,13 @@
#ifndef LL_LLAGENTWEARABLES_H
#define LL_LLAGENTWEARABLES_H
+// libraries
#include "llmemory.h"
+#include "llui.h"
#include "lluuid.h"
#include "llinventory.h"
+
+// newview
#include "llinventorymodel.h"
#include "llviewerinventory.h"
#include "llvoavatardefines.h"
@@ -47,7 +51,7 @@ class LLInitialWearablesFetch;
class LLViewerObject;
class LLTexLayerTemplate;
-class LLAgentWearables
+class LLAgentWearables : public LLInitClass<LLAgentWearables>
{
//--------------------------------------------------------------------
// Constructors / destructors / Initializers
@@ -61,8 +65,10 @@ public:
void createStandardWearables(BOOL female);
void cleanup();
void dump();
+
+ // LLInitClass interface
+ static void initClass();
protected:
- // MULTI-WEARABLE: assuming one per type. Type is called index - rename.
void createStandardWearablesDone(S32 type, U32 index/* = 0*/);
void createStandardWearablesAllDone();
@@ -71,51 +77,59 @@ protected:
//--------------------------------------------------------------------
public:
BOOL isWearingItem(const LLUUID& item_id) const;
- BOOL isWearableModifiable(EWearableType type, U32 index /*= 0*/) const;
- BOOL isWearableCopyable(EWearableType type, U32 index /*= 0*/) const;
+ BOOL isWearableModifiable(LLWearableType::EType type, U32 index /*= 0*/) const;
+ BOOL isWearableModifiable(const LLUUID& item_id) const;
+
+ BOOL isWearableCopyable(LLWearableType::EType type, U32 index /*= 0*/) const;
BOOL areWearablesLoaded() const;
+ bool isCOFChangeInProgress() const { return mCOFChangeInProgress; }
void updateWearablesLoaded();
void checkWearablesLoaded() const;
+ bool canMoveWearable(const LLUUID& item_id, bool closer_to_body);
// Note: False for shape, skin, eyes, and hair, unless you have MORE than 1.
bool canWearableBeRemoved(const LLWearable* wearable) const;
void animateAllWearableParams(F32 delta, BOOL upload_bake);
-
+
//--------------------------------------------------------------------
// Accessors
//--------------------------------------------------------------------
public:
- const LLUUID getWearableItemID(EWearableType type, U32 index /*= 0*/) const;
- const LLUUID getWearableAssetID(EWearableType type, U32 index /*= 0*/) const;
+ const LLUUID getWearableItemID(LLWearableType::EType type, U32 index /*= 0*/) const;
+ const LLUUID getWearableAssetID(LLWearableType::EType type, U32 index /*= 0*/) const;
const LLWearable* getWearableFromItemID(const LLUUID& item_id) const;
- const LLWearable* getWearableFromAssetID(const LLUUID& asset_id) const;
- LLInventoryItem* getWearableInventoryItem(EWearableType type, U32 index /*= 0*/);
- // MULTI-WEARABLE: assuming one per type.
- static BOOL selfHasWearable(EWearableType type);
- LLWearable* getWearable(const EWearableType type, U32 index /*= 0*/);
- const LLWearable* getWearable(const EWearableType type, U32 index /*= 0*/) const;
- LLWearable* getTopWearable(const EWearableType type);
- U32 getWearableCount(const EWearableType type) const;
+ LLWearable* getWearableFromItemID(const LLUUID& item_id);
+ LLWearable* getWearableFromAssetID(const LLUUID& asset_id);
+ LLInventoryItem* getWearableInventoryItem(LLWearableType::EType type, U32 index /*= 0*/);
+ static BOOL selfHasWearable(LLWearableType::EType type);
+ LLWearable* getWearable(const LLWearableType::EType type, U32 index /*= 0*/);
+ const LLWearable* getWearable(const LLWearableType::EType type, U32 index /*= 0*/) const;
+ LLWearable* getTopWearable(const LLWearableType::EType type);
+ LLWearable* getBottomWearable(const LLWearableType::EType type);
+ U32 getWearableCount(const LLWearableType::EType type) const;
U32 getWearableCount(const U32 tex_index) const;
+ static const U32 MAX_CLOTHING_PER_TYPE = 5;
+
+
//--------------------------------------------------------------------
// Setters
//--------------------------------------------------------------------
private:
// Low-level data structure setter - public access is via setWearableItem, etc.
- void setWearable(const EWearableType type, U32 index, LLWearable *wearable);
- U32 pushWearable(const EWearableType type, LLWearable *wearable);
+ void setWearable(const LLWearableType::EType type, U32 index, LLWearable *wearable);
+ U32 pushWearable(const LLWearableType::EType type, LLWearable *wearable);
void wearableUpdated(LLWearable *wearable);
void popWearable(LLWearable *wearable);
- void popWearable(const EWearableType type, U32 index);
+ void popWearable(const LLWearableType::EType type, U32 index);
public:
void setWearableItem(LLInventoryItem* new_item, LLWearable* wearable, bool do_append = false);
void setWearableOutfit(const LLInventoryItem::item_array_t& items, const LLDynamicArray< LLWearable* >& wearables, BOOL remove);
void setWearableName(const LLUUID& item_id, const std::string& new_name);
- void addLocalTextureObject(const EWearableType wearable_type, const LLVOAvatarDefines::ETextureIndex texture_type, U32 wearable_index);
+ void addLocalTextureObject(const LLWearableType::EType wearable_type, const LLVOAvatarDefines::ETextureIndex texture_type, U32 wearable_index);
U32 getWearableIndex(LLWearable *wearable);
protected:
@@ -126,20 +140,35 @@ protected:
LLWearable* wearable,
const LLUUID& category_id = LLUUID::null,
BOOL notify = TRUE);
- void addWearabletoAgentInventoryDone(const S32 type,
+ void addWearabletoAgentInventoryDone(const LLWearableType::EType type,
const U32 index,
const LLUUID& item_id,
LLWearable* wearable);
- void recoverMissingWearable(const EWearableType type, U32 index /*= 0*/);
+ void recoverMissingWearable(const LLWearableType::EType type, U32 index /*= 0*/);
void recoverMissingWearableDone();
//--------------------------------------------------------------------
+ // Editing/moving wearables
+ //--------------------------------------------------------------------
+
+public:
+ static void createWearable(LLWearableType::EType type, bool wear = false, const LLUUID& parent_id = LLUUID::null);
+ static void editWearable(const LLUUID& item_id);
+ bool moveWearable(const LLViewerInventoryItem* item, bool closer_to_body);
+
+ void requestEditingWearable(const LLUUID& item_id);
+ void editWearableIfRequested(const LLUUID& item_id);
+
+private:
+ LLUUID mItemToEdit;
+
+ //--------------------------------------------------------------------
// Removing wearables
//--------------------------------------------------------------------
public:
- void removeWearable(const EWearableType type, bool do_remove_all /*= false*/, U32 index /*= 0*/);
+ void removeWearable(const LLWearableType::EType type, bool do_remove_all /*= false*/, U32 index /*= 0*/);
private:
- void removeWearableFinal(const EWearableType type, bool do_remove_all /*= false*/, U32 index /*= 0*/);
+ void removeWearableFinal(const LLWearableType::EType type, bool do_remove_all /*= false*/, U32 index /*= 0*/);
protected:
static bool onRemoveWearableDialog(const LLSD& notification, const LLSD& response);
static void userRemoveAllClothesStep2(BOOL proceed); // userdata is NULL
@@ -150,6 +179,9 @@ protected:
public:
// Processes the initial wearables update message (if necessary, since the outfit folder makes it redundant)
static void processAgentInitialWearablesUpdate(LLMessageSystem* mesgsys, void** user_data);
+ LLUUID computeBakedTextureHash(LLVOAvatarDefines::EBakedTextureIndex baked_index,
+ BOOL generate_valid_hash = TRUE);
+
protected:
void sendAgentWearablesUpdate();
void sendAgentWearablesRequest();
@@ -161,20 +193,10 @@ protected:
// Outfits
//--------------------------------------------------------------------
public:
- void getAllWearablesArray(LLDynamicArray<S32>& wearables);
-
- // Note: wearables_to_include should be a list of EWearableType types
- // attachments_to_include should be a list of attachment points
- void makeNewOutfit(const std::string& new_folder_name,
- const LLDynamicArray<S32>& wearables_to_include,
- const LLDynamicArray<S32>& attachments_to_include,
- BOOL rename_clothing);
-
- LLUUID makeNewOutfitLinks(const std::string& new_folder_name);
// Should only be called if we *know* we've never done so before, since users may
// not want the Library outfits to stay in their quick outfit selector and can delete them.
- void populateMyOutfitsFolder(void);
+ void populateMyOutfitsFolder();
private:
void makeNewOutfitDone(S32 type, U32 index);
@@ -183,18 +205,17 @@ private:
// Save Wearables
//--------------------------------------------------------------------
public:
- // MULTI-WEARABLE: assumes one per type.
- void saveWearableAs(const EWearableType type, const U32 index, const std::string& new_name, BOOL save_in_lost_and_found);
- void saveWearable(const EWearableType type, const U32 index, BOOL send_update = TRUE);
+ void saveWearableAs(const LLWearableType::EType type, const U32 index, const std::string& new_name, BOOL save_in_lost_and_found);
+ void saveWearable(const LLWearableType::EType type, const U32 index, BOOL send_update = TRUE);
void saveAllWearables();
- void revertWearable(const EWearableType type, const U32 index);
+ void revertWearable(const LLWearableType::EType type, const U32 index);
//--------------------------------------------------------------------
// Static UI hooks
//--------------------------------------------------------------------
public:
- // MULTI-WEARABLE: assuming one wearable per type. Need upstream changes.
- static void userRemoveWearable(EWearableType& type);
+ static void userRemoveWearable(const LLWearableType::EType &type, const U32 &index);
+ static void userRemoveWearablesOfType(const LLWearableType::EType &type);
static void userRemoveAllClothes();
typedef std::vector<LLViewerObject*> llvo_vec_t;
@@ -208,17 +229,40 @@ public:
U32 itemUpdatePendingCount() const;
//--------------------------------------------------------------------
+ // Signals
+ //--------------------------------------------------------------------
+public:
+ typedef boost::function<void()> loading_started_callback_t;
+ typedef boost::signals2::signal<void()> loading_started_signal_t;
+ boost::signals2::connection addLoadingStartedCallback(loading_started_callback_t cb);
+
+ typedef boost::function<void()> loaded_callback_t;
+ typedef boost::signals2::signal<void()> loaded_signal_t;
+ boost::signals2::connection addLoadedCallback(loaded_callback_t cb);
+
+ void notifyLoadingStarted();
+ void notifyLoadingFinished();
+
+private:
+ loading_started_signal_t mLoadingStartedSignal; // should be called before wearables are changed
+ loaded_signal_t mLoadedSignal; // emitted when all agent wearables get loaded
+
+ //--------------------------------------------------------------------
// Member variables
//--------------------------------------------------------------------
private:
typedef std::vector<LLWearable*> wearableentry_vec_t; // all wearables of a certain type (EG all shirts)
- typedef std::map<EWearableType, wearableentry_vec_t> wearableentry_map_t; // wearable "categories" arranged by wearable type
+ typedef std::map<LLWearableType::EType, wearableentry_vec_t> wearableentry_map_t; // wearable "categories" arranged by wearable type
wearableentry_map_t mWearableDatas;
static BOOL mInitialWearablesUpdateReceived;
BOOL mWearablesLoaded;
std::set<LLUUID> mItemsAwaitingWearableUpdate;
- LLPointer<LLVOAvatarSelf> mAvatarObject; // NULL until avatar object sent down from simulator
+
+ /**
+ * True if agent's outfit is being changed now.
+ */
+ BOOL mCOFChangeInProgress;
//--------------------------------------------------------------------------------
// Support classes
@@ -238,33 +282,30 @@ private:
class addWearableToAgentInventoryCallback : public LLInventoryCallback
{
public:
- enum EType
+ enum ETodo
{
CALL_NONE = 0,
CALL_UPDATE = 1,
CALL_RECOVERDONE = 2,
CALL_CREATESTANDARDDONE = 4,
- CALL_MAKENEWOUTFITDONE = 8
+ CALL_MAKENEWOUTFITDONE = 8,
+ CALL_WEARITEM = 16
};
- // MULTI-WEARABLE: index is an EWearableType - more confusing usage.
- // MULTI-WEARABLE: need to have type and index args both?
addWearableToAgentInventoryCallback(LLPointer<LLRefCount> cb,
- S32 type,
+ LLWearableType::EType type,
U32 index,
LLWearable* wearable,
U32 todo = CALL_NONE);
virtual void fire(const LLUUID& inv_item);
private:
- S32 mType;
+ LLWearableType::EType mType;
U32 mIndex;
LLWearable* mWearable;
U32 mTodo;
LLPointer<LLRefCount> mCB;
};
- static const U32 MAX_WEARABLES_PER_TYPE = 1;
-
}; // LLAgentWearables
extern LLAgentWearables gAgentWearables;
diff --git a/indra/newview/llagentwearablesfetch.cpp b/indra/newview/llagentwearablesfetch.cpp
new file mode 100644
index 0000000000..931aba1d41
--- /dev/null
+++ b/indra/newview/llagentwearablesfetch.cpp
@@ -0,0 +1,574 @@
+/**
+ * @file llagentwearablesfetch.cpp
+ * @brief LLAgentWearblesFetch class implementation
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llagentwearablesfetch.h"
+
+#include "llagent.h"
+#include "llagentwearables.h"
+#include "llappearancemgr.h"
+#include "llinventoryfunctions.h"
+#include "llstartup.h"
+#include "llvoavatarself.h"
+
+
+class LLOrderMyOutfitsOnDestroy: public LLInventoryCallback
+{
+public:
+ LLOrderMyOutfitsOnDestroy() {};
+
+ virtual ~LLOrderMyOutfitsOnDestroy()
+ {
+ const LLUUID& my_outfits_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+ if (my_outfits_id.isNull()) return;
+
+ LLInventoryModel::cat_array_t* cats;
+ LLInventoryModel::item_array_t* items;
+ gInventory.getDirectDescendentsOf(my_outfits_id, cats, items);
+ if (!cats) return;
+
+ //My Outfits should at least contain saved initial outfit and one another outfit
+ if (cats->size() < 2)
+ {
+ llwarning("My Outfits category was not populated properly", 0);
+ return;
+ }
+
+ llinfos << "Starting updating My Outfits with wearables ordering information" << llendl;
+
+ for (LLInventoryModel::cat_array_t::iterator outfit_iter = cats->begin();
+ outfit_iter != cats->end(); ++outfit_iter)
+ {
+ const LLUUID& cat_id = (*outfit_iter)->getUUID();
+ if (cat_id.isNull()) continue;
+
+ // saved initial outfit already contains wearables ordering information
+ if (cat_id == LLAppearanceMgr::getInstance()->getBaseOutfitUUID()) continue;
+
+ LLAppearanceMgr::getInstance()->updateClothingOrderingInfo(cat_id);
+ }
+
+ llinfos << "Finished updating My Outfits with wearables ordering information" << llendl;
+ }
+
+ /* virtual */ void fire(const LLUUID& inv_item) {};
+};
+
+
+LLInitialWearablesFetch::LLInitialWearablesFetch(const LLUUID& cof_id) :
+ LLInventoryFetchDescendentsObserver(cof_id)
+{
+}
+
+LLInitialWearablesFetch::~LLInitialWearablesFetch()
+{
+}
+
+// virtual
+void LLInitialWearablesFetch::done()
+{
+ // Delay processing the actual results of this so it's not handled within
+ // gInventory.notifyObservers. The results will be handled in the next
+ // idle tick instead.
+ gInventory.removeObserver(this);
+ doOnIdleOneTime(boost::bind(&LLInitialWearablesFetch::processContents,this));
+}
+
+void LLInitialWearablesFetch::add(InitialWearableData &data)
+
+{
+ mAgentInitialWearables.push_back(data);
+}
+
+void LLInitialWearablesFetch::processContents()
+{
+ // Fetch the wearable items from the Current Outfit Folder
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t wearable_array;
+ LLFindWearables is_wearable;
+ gInventory.collectDescendentsIf(mComplete.front(), cat_array, wearable_array,
+ LLInventoryModel::EXCLUDE_TRASH, is_wearable);
+
+ LLAppearanceMgr::instance().setAttachmentInvLinkEnable(true);
+ if (wearable_array.count() > 0)
+ {
+ gAgentWearables.notifyLoadingStarted();
+ LLAppearanceMgr::instance().updateAppearanceFromCOF();
+ }
+ else
+ {
+ // if we're constructing the COF from the wearables message, we don't have a proper outfit link
+ LLAppearanceMgr::instance().setOutfitDirty(true);
+ processWearablesMessage();
+ }
+ delete this;
+}
+
+class LLFetchAndLinkObserver: public LLInventoryFetchItemsObserver
+{
+public:
+ LLFetchAndLinkObserver(uuid_vec_t& ids):
+ LLInventoryFetchItemsObserver(ids)
+ {
+ }
+ ~LLFetchAndLinkObserver()
+ {
+ }
+ virtual void done()
+ {
+ gInventory.removeObserver(this);
+
+ // Link to all fetched items in COF.
+ LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy;
+ for (uuid_vec_t::iterator it = mIDs.begin();
+ it != mIDs.end();
+ ++it)
+ {
+ LLUUID id = *it;
+ LLViewerInventoryItem *item = gInventory.getItem(*it);
+ if (!item)
+ {
+ llwarns << "fetch failed!" << llendl;
+ continue;
+ }
+
+ link_inventory_item(gAgent.getID(),
+ item->getLinkedUUID(),
+ LLAppearanceMgr::instance().getCOF(),
+ item->getName(),
+ item->getDescription(),
+ LLAssetType::AT_LINK,
+ link_waiter);
+ }
+ }
+};
+
+void LLInitialWearablesFetch::processWearablesMessage()
+{
+ if (!mAgentInitialWearables.empty()) // We have an empty current outfit folder, use the message data instead.
+ {
+ const LLUUID current_outfit_id = LLAppearanceMgr::instance().getCOF();
+ uuid_vec_t ids;
+ for (U8 i = 0; i < mAgentInitialWearables.size(); ++i)
+ {
+ // Populate the current outfit folder with links to the wearables passed in the message
+ InitialWearableData *wearable_data = new InitialWearableData(mAgentInitialWearables[i]); // This will be deleted in the callback.
+
+ if (wearable_data->mAssetID.notNull())
+ {
+ ids.push_back(wearable_data->mItemID);
+ }
+ else
+ {
+ llinfos << "Invalid wearable, type " << wearable_data->mType << " itemID "
+ << wearable_data->mItemID << " assetID " << wearable_data->mAssetID << llendl;
+ delete wearable_data;
+ }
+ }
+
+ // Add all current attachments to the requested items as well.
+ if (isAgentAvatarValid())
+ {
+ for (LLVOAvatar::attachment_map_t::const_iterator iter = gAgentAvatarp->mAttachmentPoints.begin();
+ iter != gAgentAvatarp->mAttachmentPoints.end(); ++iter)
+ {
+ LLViewerJointAttachment* attachment = iter->second;
+ if (!attachment) continue;
+ for (LLViewerJointAttachment::attachedobjs_vec_t::iterator attachment_iter = attachment->mAttachedObjects.begin();
+ attachment_iter != attachment->mAttachedObjects.end();
+ ++attachment_iter)
+ {
+ LLViewerObject* attached_object = (*attachment_iter);
+ if (!attached_object) continue;
+ const LLUUID& item_id = attached_object->getItemID();
+ if (item_id.isNull()) continue;
+ ids.push_back(item_id);
+ }
+ }
+ }
+
+ // Need to fetch the inventory items for ids, then create links to them after they arrive.
+ LLFetchAndLinkObserver *fetcher = new LLFetchAndLinkObserver(ids);
+ fetcher->startFetch();
+ // If no items to be fetched, done will never be triggered.
+ // TODO: Change LLInventoryFetchItemsObserver::fetchItems to trigger done() on this condition.
+ if (fetcher->isFinished())
+ {
+ fetcher->done();
+ }
+ else
+ {
+ gInventory.addObserver(fetcher);
+ }
+ }
+ else
+ {
+ LL_WARNS("Wearables") << "No current outfit folder items found and no initial wearables fallback message received." << LL_ENDL;
+ }
+}
+
+LLLibraryOutfitsFetch::LLLibraryOutfitsFetch(const LLUUID& my_outfits_id) :
+ LLInventoryFetchDescendentsObserver(my_outfits_id),
+ mCurrFetchStep(LOFS_FOLDER),
+ mOutfitsPopulated(false)
+{
+ mMyOutfitsID = LLUUID::null;
+ mClothingID = LLUUID::null;
+ mLibraryClothingID = LLUUID::null;
+ mImportedClothingID = LLUUID::null;
+ mImportedClothingName = "Imported Library Clothing";
+}
+
+LLLibraryOutfitsFetch::~LLLibraryOutfitsFetch()
+{
+}
+
+void LLLibraryOutfitsFetch::done()
+{
+ // Delay this until idle() routine, since it's a heavy operation and
+ // we also can't have it run within notifyObservers.
+ doOnIdleOneTime(boost::bind(&LLLibraryOutfitsFetch::doneIdle,this));
+ gInventory.removeObserver(this); // Prevent doOnIdleOneTime from being added twice.
+}
+
+void LLLibraryOutfitsFetch::doneIdle()
+{
+ gInventory.addObserver(this); // Add this back in since it was taken out during ::done()
+
+ switch (mCurrFetchStep)
+ {
+ case LOFS_FOLDER:
+ folderDone();
+ mCurrFetchStep = LOFS_OUTFITS;
+ break;
+ case LOFS_OUTFITS:
+ outfitsDone();
+ mCurrFetchStep = LOFS_LIBRARY;
+ break;
+ case LOFS_LIBRARY:
+ libraryDone();
+ mCurrFetchStep = LOFS_IMPORTED;
+ break;
+ case LOFS_IMPORTED:
+ importedFolderDone();
+ mCurrFetchStep = LOFS_CONTENTS;
+ break;
+ case LOFS_CONTENTS:
+ contentsDone();
+ break;
+ default:
+ llwarns << "Got invalid state for outfit fetch: " << mCurrFetchStep << llendl;
+ mOutfitsPopulated = TRUE;
+ break;
+ }
+
+ // We're completely done. Cleanup.
+ if (mOutfitsPopulated)
+ {
+ gInventory.removeObserver(this);
+ delete this;
+ return;
+ }
+}
+
+void LLLibraryOutfitsFetch::folderDone()
+{
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t wearable_array;
+ gInventory.collectDescendents(mMyOutfitsID, cat_array, wearable_array,
+ LLInventoryModel::EXCLUDE_TRASH);
+
+ // Early out if we already have items in My Outfits
+ // except the case when My Outfits contains just initial outfit
+ if (cat_array.count() > 1 ||
+ cat_array.count() == 1 && cat_array[0]->getUUID() != LLAppearanceMgr::getInstance()->getBaseOutfitUUID())
+ {
+ mOutfitsPopulated = true;
+ return;
+ }
+
+ mClothingID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);
+ mLibraryClothingID = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING, false, true);
+
+ // If Library->Clothing->Initial Outfits exists, use that.
+ LLNameCategoryCollector matchFolderFunctor("Initial Outfits");
+ cat_array.clear();
+ gInventory.collectDescendentsIf(mLibraryClothingID,
+ cat_array, wearable_array,
+ LLInventoryModel::EXCLUDE_TRASH,
+ matchFolderFunctor);
+ if (cat_array.count() > 0)
+ {
+ const LLViewerInventoryCategory *cat = cat_array.get(0);
+ mLibraryClothingID = cat->getUUID();
+ }
+
+ mComplete.clear();
+
+ // Get the complete information on the items in the inventory.
+ uuid_vec_t folders;
+ folders.push_back(mClothingID);
+ folders.push_back(mLibraryClothingID);
+ setFetchIDs(folders);
+ startFetch();
+ if (isFinished())
+ {
+ done();
+ }
+}
+
+void LLLibraryOutfitsFetch::outfitsDone()
+{
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t wearable_array;
+ uuid_vec_t folders;
+
+ // Collect the contents of the Library's Clothing folder
+ gInventory.collectDescendents(mLibraryClothingID, cat_array, wearable_array,
+ LLInventoryModel::EXCLUDE_TRASH);
+
+ llassert(cat_array.count() > 0);
+ for (LLInventoryModel::cat_array_t::const_iterator iter = cat_array.begin();
+ iter != cat_array.end();
+ ++iter)
+ {
+ const LLViewerInventoryCategory *cat = iter->get();
+
+ // Get the names and id's of every outfit in the library, skip "Ruth"
+ // because it's a low quality legacy outfit
+ if (cat->getName() != "Ruth")
+ {
+ // Get the name of every outfit in the library
+ folders.push_back(cat->getUUID());
+ mLibraryClothingFolders.push_back(cat->getUUID());
+ }
+ }
+ cat_array.clear();
+ wearable_array.clear();
+
+ // Check if you already have an "Imported Library Clothing" folder
+ LLNameCategoryCollector matchFolderFunctor(mImportedClothingName);
+ gInventory.collectDescendentsIf(mClothingID,
+ cat_array, wearable_array,
+ LLInventoryModel::EXCLUDE_TRASH,
+ matchFolderFunctor);
+ if (cat_array.size() > 0)
+ {
+ const LLViewerInventoryCategory *cat = cat_array.get(0);
+ mImportedClothingID = cat->getUUID();
+ }
+
+ mComplete.clear();
+ setFetchIDs(folders);
+ startFetch();
+ if (isFinished())
+ {
+ done();
+ }
+}
+
+class LLLibraryOutfitsCopyDone: public LLInventoryCallback
+{
+public:
+ LLLibraryOutfitsCopyDone(LLLibraryOutfitsFetch * fetcher):
+ mFireCount(0), mLibraryOutfitsFetcher(fetcher)
+ {
+ }
+
+ virtual ~LLLibraryOutfitsCopyDone()
+ {
+ if (!LLApp::isExiting() && mLibraryOutfitsFetcher)
+ {
+ gInventory.addObserver(mLibraryOutfitsFetcher);
+ mLibraryOutfitsFetcher->done();
+ }
+ }
+
+ /* virtual */ void fire(const LLUUID& inv_item)
+ {
+ mFireCount++;
+ }
+private:
+ U32 mFireCount;
+ LLLibraryOutfitsFetch * mLibraryOutfitsFetcher;
+};
+
+// Copy the clothing folders from the library into the imported clothing folder
+void LLLibraryOutfitsFetch::libraryDone()
+{
+ if (mImportedClothingID != LLUUID::null)
+ {
+ // Skip straight to fetching the contents of the imported folder
+ importedFolderFetch();
+ return;
+ }
+
+ // Remove observer; next autopopulation step will be triggered externally by LLLibraryOutfitsCopyDone.
+ gInventory.removeObserver(this);
+
+ LLPointer<LLInventoryCallback> copy_waiter = new LLLibraryOutfitsCopyDone(this);
+ mImportedClothingID = gInventory.createNewCategory(mClothingID,
+ LLFolderType::FT_NONE,
+ mImportedClothingName);
+ // Copy each folder from library into clothing unless it already exists.
+ for (uuid_vec_t::const_iterator iter = mLibraryClothingFolders.begin();
+ iter != mLibraryClothingFolders.end();
+ ++iter)
+ {
+ const LLUUID& src_folder_id = (*iter); // Library clothing folder ID
+ const LLViewerInventoryCategory *cat = gInventory.getCategory(src_folder_id);
+ if (!cat)
+ {
+ llwarns << "Library folder import for uuid:" << src_folder_id << " failed to find folder." << llendl;
+ continue;
+ }
+
+ if (!LLAppearanceMgr::getInstance()->getCanMakeFolderIntoOutfit(src_folder_id))
+ {
+ llinfos << "Skipping non-outfit folder name:" << cat->getName() << llendl;
+ continue;
+ }
+
+ // Don't copy the category if it already exists.
+ LLNameCategoryCollector matchFolderFunctor(cat->getName());
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t wearable_array;
+ gInventory.collectDescendentsIf(mImportedClothingID,
+ cat_array, wearable_array,
+ LLInventoryModel::EXCLUDE_TRASH,
+ matchFolderFunctor);
+ if (cat_array.size() > 0)
+ {
+ continue;
+ }
+
+ LLUUID dst_folder_id = gInventory.createNewCategory(mImportedClothingID,
+ LLFolderType::FT_NONE,
+ cat->getName());
+ LLAppearanceMgr::getInstance()->shallowCopyCategoryContents(src_folder_id, dst_folder_id, copy_waiter);
+ }
+}
+
+void LLLibraryOutfitsFetch::importedFolderFetch()
+{
+ // Fetch the contents of the Imported Clothing Folder
+ uuid_vec_t folders;
+ folders.push_back(mImportedClothingID);
+
+ mComplete.clear();
+ setFetchIDs(folders);
+ startFetch();
+ if (isFinished())
+ {
+ done();
+ }
+}
+
+void LLLibraryOutfitsFetch::importedFolderDone()
+{
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t wearable_array;
+ uuid_vec_t folders;
+
+ // Collect the contents of the Imported Clothing folder
+ gInventory.collectDescendents(mImportedClothingID, cat_array, wearable_array,
+ LLInventoryModel::EXCLUDE_TRASH);
+
+ for (LLInventoryModel::cat_array_t::const_iterator iter = cat_array.begin();
+ iter != cat_array.end();
+ ++iter)
+ {
+ const LLViewerInventoryCategory *cat = iter->get();
+
+ // Get the name of every imported outfit
+ folders.push_back(cat->getUUID());
+ mImportedClothingFolders.push_back(cat->getUUID());
+ }
+
+ mComplete.clear();
+ setFetchIDs(folders);
+ startFetch();
+ if (isFinished())
+ {
+ done();
+ }
+}
+
+void LLLibraryOutfitsFetch::contentsDone()
+{
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t wearable_array;
+
+ LLPointer<LLOrderMyOutfitsOnDestroy> order_myoutfits_on_destroy = new LLOrderMyOutfitsOnDestroy;
+
+ for (uuid_vec_t::const_iterator folder_iter = mImportedClothingFolders.begin();
+ folder_iter != mImportedClothingFolders.end();
+ ++folder_iter)
+ {
+ const LLUUID &folder_id = (*folder_iter);
+ const LLViewerInventoryCategory *cat = gInventory.getCategory(folder_id);
+ if (!cat)
+ {
+ llwarns << "Library folder import for uuid:" << folder_id << " failed to find folder." << llendl;
+ continue;
+ }
+
+ //initial outfit should be already in My Outfits
+ if (cat->getName() == LLStartUp::getInitialOutfitName()) continue;
+
+ // First, make a folder in the My Outfits directory.
+ LLUUID new_outfit_folder_id = gInventory.createNewCategory(mMyOutfitsID, LLFolderType::FT_OUTFIT, cat->getName());
+
+ cat_array.clear();
+ wearable_array.clear();
+ // Collect the contents of each imported clothing folder, so we can create new outfit links for it
+ gInventory.collectDescendents(folder_id, cat_array, wearable_array,
+ LLInventoryModel::EXCLUDE_TRASH);
+
+ for (LLInventoryModel::item_array_t::const_iterator wearable_iter = wearable_array.begin();
+ wearable_iter != wearable_array.end();
+ ++wearable_iter)
+ {
+ const LLViewerInventoryItem *item = wearable_iter->get();
+ link_inventory_item(gAgent.getID(),
+ item->getLinkedUUID(),
+ new_outfit_folder_id,
+ item->getName(),
+ item->getDescription(),
+ LLAssetType::AT_LINK,
+ order_myoutfits_on_destroy);
+ }
+ }
+
+ mOutfitsPopulated = true;
+}
+
diff --git a/indra/newview/llagentwearablesfetch.h b/indra/newview/llagentwearablesfetch.h
new file mode 100644
index 0000000000..faa5fbaa43
--- /dev/null
+++ b/indra/newview/llagentwearablesfetch.h
@@ -0,0 +1,118 @@
+/**
+ * @file llagentwearablesinitialfetch.h
+ * @brief LLAgentWearablesInitialFetch class header file
+ *
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLAGENTWEARABLESINITIALFETCH_H
+#define LL_LLAGENTWEARABLESINITIALFETCH_H
+
+#include "llinventoryobserver.h"
+#include "llwearabletype.h"
+#include "lluuid.h"
+
+//--------------------------------------------------------------------
+// InitialWearablesFetch
+//
+// This grabs contents from the COF and processes them.
+// The processing is handled in idle(), i.e. outside of done(),
+// to avoid gInventory.notifyObservers recursion.
+//--------------------------------------------------------------------
+class LLInitialWearablesFetch : public LLInventoryFetchDescendentsObserver
+{
+public:
+ LLInitialWearablesFetch(const LLUUID& cof_id);
+ ~LLInitialWearablesFetch();
+ virtual void done();
+
+ struct InitialWearableData
+ {
+ LLWearableType::EType mType;
+ LLUUID mItemID;
+ LLUUID mAssetID;
+ InitialWearableData(LLWearableType::EType type, LLUUID& itemID, LLUUID& assetID) :
+ mType(type),
+ mItemID(itemID),
+ mAssetID(assetID)
+ {}
+ };
+
+ void add(InitialWearableData &data);
+
+protected:
+ void processWearablesMessage();
+ void processContents();
+
+private:
+ typedef std::vector<InitialWearableData> initial_wearable_data_vec_t;
+ initial_wearable_data_vec_t mAgentInitialWearables; // Wearables from the old agent wearables msg
+};
+
+//--------------------------------------------------------------------
+// InitialWearablesFetch
+//
+// This grabs outfits from the Library and copies those over to the user's
+// outfits folder, typically during first-ever login.
+//--------------------------------------------------------------------
+class LLLibraryOutfitsFetch : public LLInventoryFetchDescendentsObserver
+{
+public:
+ enum ELibraryOutfitFetchStep
+ {
+ LOFS_FOLDER = 0,
+ LOFS_OUTFITS,
+ LOFS_LIBRARY,
+ LOFS_IMPORTED,
+ LOFS_CONTENTS
+ };
+
+ LLLibraryOutfitsFetch(const LLUUID& my_outfits_id);
+ ~LLLibraryOutfitsFetch();
+
+ virtual void done();
+ void doneIdle();
+ LLUUID mMyOutfitsID;
+ void importedFolderFetch();
+protected:
+ void folderDone();
+ void outfitsDone();
+ void libraryDone();
+ void importedFolderDone();
+ void contentsDone();
+ enum ELibraryOutfitFetchStep mCurrFetchStep;
+ uuid_vec_t mLibraryClothingFolders;
+ uuid_vec_t mImportedClothingFolders;
+ bool mOutfitsPopulated;
+ LLUUID mClothingID;
+ LLUUID mLibraryClothingID;
+ LLUUID mImportedClothingID;
+ std::string mImportedClothingName;
+};
+
+#endif // LL_AGENTWEARABLESINITIALFETCH_H
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 326fc41c1e..3947be49bb 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -32,22 +32,59 @@
#include "llviewerprecompiledheaders.h"
+#include "llaccordionctrltab.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llagentwearables.h"
#include "llappearancemgr.h"
#include "llcommandhandler.h"
-#include "llfloatercustomize.h"
+#include "lleventtimer.h"
#include "llgesturemgr.h"
#include "llinventorybridge.h"
+#include "llinventoryfunctions.h"
#include "llinventoryobserver.h"
#include "llnotificationsutil.h"
+#include "lloutfitobserver.h"
+#include "llpaneloutfitsinventory.h"
+#include "llselectmgr.h"
#include "llsidepanelappearance.h"
#include "llsidetray.h"
+#include "llviewerobjectlist.h"
#include "llvoavatar.h"
#include "llvoavatarself.h"
#include "llviewerregion.h"
#include "llwearablelist.h"
+char ORDER_NUMBER_SEPARATOR('@');
+
+class LLOutfitUnLockTimer: public LLEventTimer
+{
+public:
+ LLOutfitUnLockTimer(F32 period) : LLEventTimer(period)
+ {
+ // restart timer on BOF changed event
+ LLOutfitObserver::instance().addBOFChangedCallback(boost::bind(
+ &LLOutfitUnLockTimer::reset, this));
+ stop();
+ }
+
+ /*virtual*/
+ BOOL tick()
+ {
+ if(mEventTimer.hasExpired())
+ {
+ LLAppearanceMgr::instance().setOutfitLocked(false);
+ }
+ return FALSE;
+ }
+ void stop() { mEventTimer.stop(); }
+ void start() { mEventTimer.start(); }
+ void reset() { mEventTimer.reset(); }
+ BOOL getStarted() { return mEventTimer.getStarted(); }
+
+ LLTimer& getEventTimer() { return mEventTimer;}
+};
+
// support for secondlife:///app/appearance SLapps
class LLAppearanceHandler : public LLCommandHandler
{
@@ -63,8 +100,35 @@ public:
return true;
}
};
+
LLAppearanceHandler gAppearanceHandler;
+
+LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id, const std::string& name)
+{
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t item_array;
+ LLNameCategoryCollector has_name(name);
+ gInventory.collectDescendentsIf(parent_id,
+ cat_array,
+ item_array,
+ LLInventoryModel::EXCLUDE_TRASH,
+ has_name);
+ if (0 == cat_array.count())
+ return LLUUID();
+ else
+ {
+ LLViewerInventoryCategory *cat = cat_array.get(0);
+ if (cat)
+ return cat->getUUID();
+ else
+ {
+ llwarns << "null cat" << llendl;
+ return LLUUID();
+ }
+ }
+}
+
class LLWearInventoryCategoryCallback : public LLInventoryCallback
{
public:
@@ -88,11 +152,13 @@ public:
protected:
~LLWearInventoryCategoryCallback()
{
+ llinfos << "done all inventory callbacks" << llendl;
+
// Is the destructor called by ordinary dereference, or because the app's shutting down?
// If the inventory callback manager goes away, we're shutting down, no longer want the callback.
if( LLInventoryCallbackManager::is_instantiated() )
{
- LLAppearanceManager::instance().wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend);
+ LLAppearanceMgr::instance().wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend);
}
else
{
@@ -105,212 +171,77 @@ private:
bool mAppend;
};
-class LLOutfitObserver : public LLInventoryFetchObserver
-{
-public:
- LLOutfitObserver(const LLUUID& cat_id, bool copy_items, bool append) :
- mCatID(cat_id),
- mCopyItems(copy_items),
- mAppend(append)
- {}
- ~LLOutfitObserver() {}
- virtual void done();
- void doWearCategory();
-
-protected:
- LLUUID mCatID;
- bool mCopyItems;
- bool mAppend;
-};
-
-void LLOutfitObserver::done()
-{
- gInventory.removeObserver(this);
- doOnIdle(boost::bind(&LLOutfitObserver::doWearCategory,this));
-}
-void LLOutfitObserver::doWearCategory()
+//Inventory callback updating "dirty" state when destroyed
+class LLUpdateDirtyState: public LLInventoryCallback
{
- // We now have an outfit ready to be copied to agent inventory. Do
- // it, and wear that outfit normally.
- if(mCopyItems)
+public:
+ LLUpdateDirtyState() {}
+ virtual ~LLUpdateDirtyState()
{
- LLInventoryCategory* cat = gInventory.getCategory(mCatID);
- std::string name;
- if(!cat)
- {
- // should never happen.
- name = "New Outfit";
- }
- else
- {
- name = cat->getName();
- }
- LLViewerInventoryItem* item = NULL;
- item_ref_t::iterator it = mComplete.begin();
- item_ref_t::iterator end = mComplete.end();
- LLUUID pid;
- for(; it < end; ++it)
- {
- item = (LLViewerInventoryItem*)gInventory.getItem(*it);
- if(item)
- {
- if(LLInventoryType::IT_GESTURE == item->getInventoryType())
- {
- pid = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE);
- }
- else
- {
- pid = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);
- }
- break;
- }
- }
- if(pid.isNull())
- {
- pid = gInventory.getRootFolderID();
- }
-
- LLUUID cat_id = gInventory.createNewCategory(
- pid,
- LLFolderType::FT_NONE,
- name);
- mCatID = cat_id;
- LLPointer<LLInventoryCallback> cb = new LLWearInventoryCategoryCallback(mCatID, mAppend);
- it = mComplete.begin();
- for(; it < end; ++it)
+ if (LLAppearanceMgr::instanceExists())
{
- item = (LLViewerInventoryItem*)gInventory.getItem(*it);
- if(item)
- {
- copy_inventory_item(
- gAgent.getID(),
- item->getPermissions().getOwner(),
- item->getUUID(),
- cat_id,
- std::string(),
- cb);
- }
+ LLAppearanceMgr::getInstance()->updateIsDirty();
}
- // BAP fixes a lag in display of created dir.
- gInventory.notifyObservers();
}
- else
- {
- // Wear the inventory category.
- LLAppearanceManager::instance().wearInventoryCategoryOnAvatar(gInventory.getCategory(mCatID), mAppend);
- }
- delete this;
-}
-
-class LLOutfitFetch : public LLInventoryFetchDescendentsObserver
-{
-public:
- LLOutfitFetch(bool copy_items, bool append) : mCopyItems(copy_items), mAppend(append) {}
- ~LLOutfitFetch() {}
- virtual void done();
-protected:
- bool mCopyItems;
- bool mAppend;
+ virtual void fire(const LLUUID&) {}
};
-void LLOutfitFetch::done()
-{
- // What we do here is get the complete information on the items in
- // the library, and set up an observer that will wait for that to
- // happen.
- LLInventoryModel::cat_array_t cat_array;
- LLInventoryModel::item_array_t item_array;
- gInventory.collectDescendents(mCompleteFolders.front(),
- cat_array,
- item_array,
- LLInventoryModel::EXCLUDE_TRASH);
- S32 count = item_array.count();
- if(!count)
- {
- llwarns << "Nothing fetched in category " << mCompleteFolders.front()
- << llendl;
- //dec_busy_count();
- gInventory.removeObserver(this);
- delete this;
- return;
- }
-
- LLOutfitObserver* outfit_observer = new LLOutfitObserver(mCompleteFolders.front(), mCopyItems, mAppend);
- LLInventoryFetchObserver::item_ref_t ids;
- for(S32 i = 0; i < count; ++i)
- {
- ids.push_back(item_array.get(i)->getUUID());
- }
-
- // clean up, and remove this as an observer since the call to the
- // outfit could notify observers and throw us into an infinite
- // loop.
- //dec_busy_count();
- gInventory.removeObserver(this);
- // increment busy count and either tell the inventory to check &
- // call done, or add this object to the inventory for observation.
- //inc_busy_count();
-
- // do the fetch
- outfit_observer->fetchItems(ids);
- if(outfit_observer->isEverythingComplete())
- {
- // everything is already here - call done.
- outfit_observer->done();
- }
- else
- {
- // it's all on it's way - add an observer, and the inventory
- // will call done for us when everything is here.
- gInventory.addObserver(outfit_observer);
- }
- delete this;
+LLUpdateAppearanceOnDestroy::LLUpdateAppearanceOnDestroy():
+ mFireCount(0)
+{
}
-class LLUpdateAppearanceOnDestroy: public LLInventoryCallback
+LLUpdateAppearanceOnDestroy::~LLUpdateAppearanceOnDestroy()
{
-public:
- LLUpdateAppearanceOnDestroy():
- mFireCount(0)
+ llinfos << "done update appearance on destroy" << llendl;
+
+ if (!LLApp::isExiting())
{
+ LLAppearanceMgr::instance().updateAppearanceFromCOF();
}
+}
- virtual ~LLUpdateAppearanceOnDestroy()
- {
- if (!LLApp::isExiting())
- {
- LLAppearanceManager::instance().updateAppearanceFromCOF();
- }
- }
-
- /* virtual */ void fire(const LLUUID& inv_item)
- {
- mFireCount++;
- }
-private:
- U32 mFireCount;
-};
+void LLUpdateAppearanceOnDestroy::fire(const LLUUID& inv_item)
+{
+ LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getItem(inv_item);
+ const std::string item_name = item ? item->getName() : "ITEM NOT FOUND";
+#ifndef LL_RELEASE_FOR_DOWNLOAD
+ llinfos << "callback fired [ name:" << item_name << " UUID:" << inv_item << " count:" << mFireCount << " ] " << llendl;
+#endif
+ mFireCount++;
+}
struct LLFoundData
{
- LLFoundData() : mAssetType(LLAssetType::AT_NONE), mWearable(NULL) {}
+ LLFoundData() :
+ mAssetType(LLAssetType::AT_NONE),
+ mWearableType(LLWearableType::WT_INVALID),
+ mWearable(NULL) {}
+
LLFoundData(const LLUUID& item_id,
- const LLUUID& asset_id,
- const std::string& name,
- LLAssetType::EType asset_type) :
+ const LLUUID& asset_id,
+ const std::string& name,
+ const LLAssetType::EType& asset_type,
+ const LLWearableType::EType& wearable_type,
+ const bool is_replacement = false
+ ) :
mItemID(item_id),
mAssetID(asset_id),
mName(name),
mAssetType(asset_type),
+ mWearableType(wearable_type),
+ mIsReplacement(is_replacement),
mWearable( NULL ) {}
LLUUID mItemID;
LLUUID mAssetID;
std::string mName;
LLAssetType::EType mAssetType;
+ LLWearableType::EType mWearableType;
LLWearable* mWearable;
+ bool mIsReplacement;
};
@@ -320,50 +251,241 @@ public:
LLWearableHoldingPattern();
~LLWearableHoldingPattern();
- bool pollCompletion();
+ bool pollFetchCompletion();
+ void onFetchCompletion();
bool isFetchCompleted();
bool isTimedOut();
+
+ void checkMissingWearables();
+ bool pollMissingWearables();
+ bool isMissingCompleted();
+ void recoverMissingWearable(LLWearableType::EType type);
+ void clearCOFLinksForMissingWearables();
+ void onWearableAssetFetch(LLWearable *wearable);
+ void onAllComplete();
+
typedef std::list<LLFoundData> found_list_t;
+ found_list_t& getFoundList();
+ void eraseTypeToLink(LLWearableType::EType type);
+ void eraseTypeToRecover(LLWearableType::EType type);
+ void setObjItems(const LLInventoryModel::item_array_t& items);
+ void setGestItems(const LLInventoryModel::item_array_t& items);
+ bool isMostRecent();
+ void handleLateArrivals();
+ void resetTime(F32 timeout);
+
+private:
found_list_t mFoundList;
LLInventoryModel::item_array_t mObjItems;
LLInventoryModel::item_array_t mGestItems;
+ typedef std::set<S32> type_set_t;
+ type_set_t mTypesToRecover;
+ type_set_t mTypesToLink;
S32 mResolved;
LLTimer mWaitTime;
bool mFired;
+ typedef std::set<LLWearableHoldingPattern*> type_set_hp;
+ static type_set_hp sActiveHoldingPatterns;
+ bool mIsMostRecent;
+ std::set<LLWearable*> mLateArrivals;
+ bool mIsAllComplete;
};
+LLWearableHoldingPattern::type_set_hp LLWearableHoldingPattern::sActiveHoldingPatterns;
+
LLWearableHoldingPattern::LLWearableHoldingPattern():
mResolved(0),
- mFired(false)
+ mFired(false),
+ mIsMostRecent(true),
+ mIsAllComplete(false)
{
+ if (sActiveHoldingPatterns.size()>0)
+ {
+ llinfos << "Creating LLWearableHoldingPattern when "
+ << sActiveHoldingPatterns.size()
+ << " other attempts are active."
+ << " Flagging others as invalid."
+ << llendl;
+ for (type_set_hp::iterator it = sActiveHoldingPatterns.begin();
+ it != sActiveHoldingPatterns.end();
+ ++it)
+ {
+ (*it)->mIsMostRecent = false;
+ }
+
+ }
+ sActiveHoldingPatterns.insert(this);
}
LLWearableHoldingPattern::~LLWearableHoldingPattern()
{
+ sActiveHoldingPatterns.erase(this);
+}
+
+bool LLWearableHoldingPattern::isMostRecent()
+{
+ return mIsMostRecent;
+}
+
+LLWearableHoldingPattern::found_list_t& LLWearableHoldingPattern::getFoundList()
+{
+ return mFoundList;
+}
+
+void LLWearableHoldingPattern::eraseTypeToLink(LLWearableType::EType type)
+{
+ mTypesToLink.erase(type);
+}
+
+void LLWearableHoldingPattern::eraseTypeToRecover(LLWearableType::EType type)
+{
+ mTypesToRecover.erase(type);
+}
+
+void LLWearableHoldingPattern::setObjItems(const LLInventoryModel::item_array_t& items)
+{
+ mObjItems = items;
+}
+
+void LLWearableHoldingPattern::setGestItems(const LLInventoryModel::item_array_t& items)
+{
+ mGestItems = items;
}
bool LLWearableHoldingPattern::isFetchCompleted()
{
- return (mResolved >= (S32)mFoundList.size()); // have everything we were waiting for?
+ return (mResolved >= (S32)getFoundList().size()); // have everything we were waiting for?
}
bool LLWearableHoldingPattern::isTimedOut()
{
- static F32 max_wait_time = 20.0; // give up if wearable fetches haven't completed in max_wait_time seconds.
- return mWaitTime.getElapsedTimeF32() > max_wait_time;
+ return mWaitTime.hasExpired();
}
-bool LLWearableHoldingPattern::pollCompletion()
+void LLWearableHoldingPattern::checkMissingWearables()
{
+ if (!isMostRecent())
+ {
+ llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl;
+ }
+
+ std::vector<S32> found_by_type(LLWearableType::WT_COUNT,0);
+ std::vector<S32> requested_by_type(LLWearableType::WT_COUNT,0);
+ for (found_list_t::iterator it = getFoundList().begin(); it != getFoundList().end(); ++it)
+ {
+ LLFoundData &data = *it;
+ if (data.mWearableType < LLWearableType::WT_COUNT)
+ requested_by_type[data.mWearableType]++;
+ if (data.mWearable)
+ found_by_type[data.mWearableType]++;
+ }
+
+ for (S32 type = 0; type < LLWearableType::WT_COUNT; ++type)
+ {
+ llinfos << "type " << type << " requested " << requested_by_type[type] << " found " << found_by_type[type] << llendl;
+ if (found_by_type[type] > 0)
+ continue;
+ if (
+ // If at least one wearable of certain types (pants/shirt/skirt)
+ // was requested but none was found, create a default asset as a replacement.
+ // In all other cases, don't do anything.
+ // For critical types (shape/hair/skin/eyes), this will keep the avatar as a cloud
+ // due to logic in LLVOAvatarSelf::getIsCloud().
+ // For non-critical types (tatoo, socks, etc.) the wearable will just be missing.
+ (requested_by_type[type] > 0) &&
+ ((type == LLWearableType::WT_PANTS) || (type == LLWearableType::WT_SHIRT) || (type == LLWearableType::WT_SKIRT)))
+ {
+ mTypesToRecover.insert(type);
+ mTypesToLink.insert(type);
+ recoverMissingWearable((LLWearableType::EType)type);
+ llwarns << "need to replace " << type << llendl;
+ }
+ }
+
+ resetTime(60.0F);
+ if (!pollMissingWearables())
+ {
+ doOnIdleRepeating(boost::bind(&LLWearableHoldingPattern::pollMissingWearables,this));
+ }
+}
+
+void LLWearableHoldingPattern::onAllComplete()
+{
+ if (!isMostRecent())
+ {
+ llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl;
+ }
+
+ // Activate all gestures in this folder
+ if (mGestItems.count() > 0)
+ {
+ llinfos << "Activating " << mGestItems.count() << " gestures" << llendl;
+
+ LLGestureMgr::instance().activateGestures(mGestItems);
+
+ // Update the inventory item labels to reflect the fact
+ // they are active.
+ LLViewerInventoryCategory* catp =
+ gInventory.getCategory(LLAppearanceMgr::instance().getCOF());
+
+ if (catp)
+ {
+ gInventory.updateCategory(catp);
+ gInventory.notifyObservers();
+ }
+ }
+
+ // Update wearables.
+ llinfos << "Updating agent wearables with " << mResolved << " wearable items " << llendl;
+ LLAppearanceMgr::instance().updateAgentWearables(this, false);
+
+ // Update attachments to match those requested.
+ if (isAgentAvatarValid())
+ {
+ llinfos << "Updating " << mObjItems.count() << " attachments" << llendl;
+ LLAgentWearables::userUpdateAttachments(mObjItems);
+ }
+
+ if (isFetchCompleted() && isMissingCompleted())
+ {
+ // Only safe to delete if all wearable callbacks and all missing wearables completed.
+ delete this;
+ }
+ else
+ {
+ mIsAllComplete = true;
+ handleLateArrivals();
+ }
+}
+
+void LLWearableHoldingPattern::onFetchCompletion()
+{
+ if (!isMostRecent())
+ {
+ llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl;
+ }
+
+ checkMissingWearables();
+}
+
+// Runs as an idle callback until all wearables are fetched (or we time out).
+bool LLWearableHoldingPattern::pollFetchCompletion()
+{
+ if (!isMostRecent())
+ {
+ llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl;
+ }
+
bool completed = isFetchCompleted();
bool timed_out = isTimedOut();
bool done = completed || timed_out;
-
- llinfos << "polling, done status: " << completed << " timed out? " << timed_out << " elapsed " << mWaitTime.getElapsedTimeF32() << llendl;
if (done)
{
+ llinfos << "polling, done status: " << completed << " timed out " << timed_out
+ << " elapsed " << mWaitTime.getElapsedTimeF32() << llendl;
+
mFired = true;
if (timed_out)
@@ -371,46 +493,338 @@ bool LLWearableHoldingPattern::pollCompletion()
llwarns << "Exceeded max wait time for wearables, updating appearance based on what has arrived" << llendl;
}
- // Activate all gestures in this folder
- if (mGestItems.count() > 0)
+ onFetchCompletion();
+ }
+ return done;
+}
+
+class RecoveredItemLinkCB: public LLInventoryCallback
+{
+public:
+ RecoveredItemLinkCB(LLWearableType::EType type, LLWearable *wearable, LLWearableHoldingPattern* holder):
+ mHolder(holder),
+ mWearable(wearable),
+ mType(type)
+ {
+ }
+ void fire(const LLUUID& item_id)
+ {
+ if (!mHolder->isMostRecent())
+ {
+ llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl;
+ }
+
+ llinfos << "Recovered item link for type " << mType << llendl;
+ mHolder->eraseTypeToLink(mType);
+ // Add wearable to FoundData for actual wearing
+ LLViewerInventoryItem *item = gInventory.getItem(item_id);
+ LLViewerInventoryItem *linked_item = item ? item->getLinkedItem() : NULL;
+
+ if (linked_item)
{
- llinfos << "Activating " << mGestItems.count() << " gestures" << llendl;
+ gInventory.addChangedMask(LLInventoryObserver::LABEL, linked_item->getUUID());
- LLGestureManager::instance().activateGestures(mGestItems);
-
- // Update the inventory item labels to reflect the fact
- // they are active.
- LLViewerInventoryCategory* catp =
- gInventory.getCategory(LLAppearanceManager::instance().getCOF());
-
- if (catp)
+ if (item)
+ {
+ LLFoundData found(linked_item->getUUID(),
+ linked_item->getAssetUUID(),
+ linked_item->getName(),
+ linked_item->getType(),
+ linked_item->isWearableType() ? linked_item->getWearableType() : LLWearableType::WT_INVALID,
+ true // is replacement
+ );
+ found.mWearable = mWearable;
+ mHolder->getFoundList().push_front(found);
+ }
+ else
{
- gInventory.updateCategory(catp);
- gInventory.notifyObservers();
+ llwarns << "inventory item not found for recovered wearable" << llendl;
}
}
+ else
+ {
+ llwarns << "inventory link not found for recovered wearable" << llendl;
+ }
+ }
+private:
+ LLWearableHoldingPattern* mHolder;
+ LLWearable *mWearable;
+ LLWearableType::EType mType;
+};
- // Update wearables.
- llinfos << "Updating agent wearables with " << mResolved << " wearable items " << llendl;
- LLAppearanceManager::instance().updateAgentWearables(this, false);
-
- // Update attachments to match those requested.
- LLVOAvatar* avatar = gAgent.getAvatarObject();
- if( avatar )
+class RecoveredItemCB: public LLInventoryCallback
+{
+public:
+ RecoveredItemCB(LLWearableType::EType type, LLWearable *wearable, LLWearableHoldingPattern* holder):
+ mHolder(holder),
+ mWearable(wearable),
+ mType(type)
+ {
+ }
+ void fire(const LLUUID& item_id)
+ {
+ if (!mHolder->isMostRecent())
{
- llinfos << "Updating " << mObjItems.count() << " attachments" << llendl;
- LLAgentWearables::userUpdateAttachments(mObjItems);
+ llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl;
}
- if (completed)
+ llinfos << "Recovered item for type " << mType << llendl;
+ LLViewerInventoryItem *itemp = gInventory.getItem(item_id);
+ mWearable->setItemID(item_id);
+ LLPointer<LLInventoryCallback> cb = new RecoveredItemLinkCB(mType,mWearable,mHolder);
+ mHolder->eraseTypeToRecover(mType);
+ llassert(itemp);
+ if (itemp)
{
- // Only safe to delete if all wearable callbacks completed.
- delete this;
+ link_inventory_item( gAgent.getID(),
+ item_id,
+ LLAppearanceMgr::instance().getCOF(),
+ itemp->getName(),
+ itemp->getDescription(),
+ LLAssetType::AT_LINK,
+ cb);
}
}
+private:
+ LLWearableHoldingPattern* mHolder;
+ LLWearable *mWearable;
+ LLWearableType::EType mType;
+};
+
+void LLWearableHoldingPattern::recoverMissingWearable(LLWearableType::EType type)
+{
+ if (!isMostRecent())
+ {
+ llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl;
+ }
+
+ // Try to recover by replacing missing wearable with a new one.
+ LLNotificationsUtil::add("ReplacedMissingWearable");
+ lldebugs << "Wearable " << LLWearableType::getTypeLabel(type)
+ << " could not be downloaded. Replaced inventory item with default wearable." << llendl;
+ LLWearable* wearable = LLWearableList::instance().createNewWearable(type);
+
+ // Add a new one in the lost and found folder.
+ const LLUUID lost_and_found_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
+ LLPointer<LLInventoryCallback> cb = new RecoveredItemCB(type,wearable,this);
+
+ create_inventory_item(gAgent.getID(),
+ gAgent.getSessionID(),
+ lost_and_found_id,
+ wearable->getTransactionID(),
+ wearable->getName(),
+ wearable->getDescription(),
+ wearable->getAssetType(),
+ LLInventoryType::IT_WEARABLE,
+ wearable->getType(),
+ wearable->getPermissions().getMaskNextOwner(),
+ cb);
+}
+
+bool LLWearableHoldingPattern::isMissingCompleted()
+{
+ return mTypesToLink.size()==0 && mTypesToRecover.size()==0;
+}
+
+void LLWearableHoldingPattern::clearCOFLinksForMissingWearables()
+{
+ for (found_list_t::iterator it = getFoundList().begin(); it != getFoundList().end(); ++it)
+ {
+ LLFoundData &data = *it;
+ if ((data.mWearableType < LLWearableType::WT_COUNT) && (!data.mWearable))
+ {
+ // Wearable link that was never resolved; remove links to it from COF
+ llinfos << "removing link for unresolved item " << data.mItemID.asString() << llendl;
+ LLAppearanceMgr::instance().removeCOFItemLinks(data.mItemID,false);
+ }
+ }
+}
+
+bool LLWearableHoldingPattern::pollMissingWearables()
+{
+ if (!isMostRecent())
+ {
+ llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl;
+ }
+
+ bool timed_out = isTimedOut();
+ bool missing_completed = isMissingCompleted();
+ bool done = timed_out || missing_completed;
+
+ llinfos << "polling missing wearables, waiting for items " << mTypesToRecover.size()
+ << " links " << mTypesToLink.size()
+ << " wearables, timed out " << timed_out
+ << " elapsed " << mWaitTime.getElapsedTimeF32()
+ << " done " << done << llendl;
+
+ if (done)
+ {
+ gAgentAvatarp->debugWearablesLoaded();
+
+ // BAP - if we don't call clearCOFLinksForMissingWearables()
+ // here, we won't have to add the link back in later if the
+ // wearable arrives late. This is to avoid corruption of
+ // wearable ordering info. Also has the effect of making
+ // unworn item links visible in the COF under some
+ // circumstances.
+
+ //clearCOFLinksForMissingWearables();
+ onAllComplete();
+ }
return done;
}
+// Handle wearables that arrived after the timeout period expired.
+void LLWearableHoldingPattern::handleLateArrivals()
+{
+ // Only safe to run if we have previously finished the missing
+ // wearables and other processing - otherwise we could be in some
+ // intermediate state - but have not been superceded by a later
+ // outfit change request.
+ if (mLateArrivals.size() == 0)
+ {
+ // Nothing to process.
+ return;
+ }
+ if (!isMostRecent())
+ {
+ llwarns << "Late arrivals not handled - outfit change no longer valid" << llendl;
+ }
+ if (!mIsAllComplete)
+ {
+ llwarns << "Late arrivals not handled - in middle of missing wearables processing" << llendl;
+ }
+
+ llinfos << "Need to handle " << mLateArrivals.size() << " late arriving wearables" << llendl;
+
+ // Update mFoundList using late-arriving wearables.
+ std::set<LLWearableType::EType> replaced_types;
+ for (LLWearableHoldingPattern::found_list_t::iterator iter = getFoundList().begin();
+ iter != getFoundList().end(); ++iter)
+ {
+ LLFoundData& data = *iter;
+ for (std::set<LLWearable*>::iterator wear_it = mLateArrivals.begin();
+ wear_it != mLateArrivals.end();
+ ++wear_it)
+ {
+ LLWearable *wearable = *wear_it;
+
+ if(wearable->getAssetID() == data.mAssetID)
+ {
+ data.mWearable = wearable;
+
+ replaced_types.insert(data.mWearableType);
+
+ // BAP - if we didn't call
+ // clearCOFLinksForMissingWearables() earlier, we
+ // don't need to restore the link here. Fixes
+ // wearable ordering problems.
+
+ // LLAppearanceMgr::instance().addCOFItemLink(data.mItemID,false);
+
+ // BAP failing this means inventory or asset server
+ // are corrupted in a way we don't handle.
+ llassert((data.mWearableType < LLWearableType::WT_COUNT) && (wearable->getType() == data.mWearableType));
+ break;
+ }
+ }
+ }
+
+ // Remove COF links for any default wearables previously used to replace the late arrivals.
+ // All this pussyfooting around with a while loop and explicit
+ // iterator incrementing is to allow removing items from the list
+ // without clobbering the iterator we're using to navigate.
+ LLWearableHoldingPattern::found_list_t::iterator iter = getFoundList().begin();
+ while (iter != getFoundList().end())
+ {
+ LLFoundData& data = *iter;
+
+ // If an item of this type has recently shown up, removed the corresponding replacement wearable from COF.
+ if (data.mWearable && data.mIsReplacement &&
+ replaced_types.find(data.mWearableType) != replaced_types.end())
+ {
+ LLAppearanceMgr::instance().removeCOFItemLinks(data.mItemID,false);
+ std::list<LLFoundData>::iterator clobber_ator = iter;
+ ++iter;
+ getFoundList().erase(clobber_ator);
+ }
+ else
+ {
+ ++iter;
+ }
+ }
+
+ // Clear contents of late arrivals.
+ mLateArrivals.clear();
+
+ // Update appearance based on mFoundList
+ LLAppearanceMgr::instance().updateAgentWearables(this, false);
+}
+
+void LLWearableHoldingPattern::resetTime(F32 timeout)
+{
+ mWaitTime.reset();
+ mWaitTime.setTimerExpirySec(timeout);
+}
+
+void LLWearableHoldingPattern::onWearableAssetFetch(LLWearable *wearable)
+{
+ if (!isMostRecent())
+ {
+ llwarns << "skipping because LLWearableHolding pattern is invalid (superceded by later outfit request)" << llendl;
+ }
+
+ mResolved += 1; // just counting callbacks, not successes.
+ llinfos << "onWearableAssetFetch, resolved count " << mResolved << " of requested " << getFoundList().size() << llendl;
+ if (wearable)
+ {
+ llinfos << "wearable found, type " << wearable->getType() << " asset " << wearable->getAssetID() << llendl;
+ }
+ else
+ {
+ llwarns << "no wearable found" << llendl;
+ }
+
+ if (mFired)
+ {
+ llwarns << "called after holder fired" << llendl;
+ if (wearable)
+ {
+ mLateArrivals.insert(wearable);
+ if (mIsAllComplete)
+ {
+ handleLateArrivals();
+ }
+ }
+ return;
+ }
+
+ if (!wearable)
+ {
+ return;
+ }
+
+ for (LLWearableHoldingPattern::found_list_t::iterator iter = getFoundList().begin();
+ iter != getFoundList().end(); ++iter)
+ {
+ LLFoundData& data = *iter;
+ if(wearable->getAssetID() == data.mAssetID)
+ {
+ data.mWearable = wearable;
+ // Failing this means inventory or asset server are corrupted in a way we don't handle.
+ llassert((data.mWearableType < LLWearableType::WT_COUNT) && (wearable->getType() == data.mWearableType));
+ break;
+ }
+ }
+}
+
+static void onWearableAssetFetch(LLWearable* wearable, void* data)
+{
+ LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data;
+ holder->onWearableAssetFetch(wearable);
+}
+
+
static void removeDuplicateItems(LLInventoryModel::item_array_t& items)
{
LLInventoryModel::item_array_t new_items;
@@ -438,37 +852,13 @@ static void removeDuplicateItems(LLInventoryModel::item_array_t& items)
items = new_items;
}
-static void onWearableAssetFetch(LLWearable* wearable, void* data)
-{
- LLWearableHoldingPattern* holder = (LLWearableHoldingPattern*)data;
- if (holder->mFired)
- {
- llwarns << "called after holder fired" << llendl;
- }
-
- if(wearable)
- {
- for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin();
- iter != holder->mFoundList.end(); ++iter)
- {
- LLFoundData& data = *iter;
- if(wearable->getAssetID() == data.mAssetID)
- {
- data.mWearable = wearable;
- break;
- }
- }
- }
- holder->mResolved += 1;
-}
-
-const LLUUID LLAppearanceManager::getCOF() const
+const LLUUID LLAppearanceMgr::getCOF() const
{
return gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
}
-const LLViewerInventoryItem* LLAppearanceManager::getBaseOutfitLink()
+const LLViewerInventoryItem* LLAppearanceMgr::getBaseOutfitLink()
{
const LLUUID& current_outfit_cat = getCOF();
LLInventoryModel::cat_array_t cat_array;
@@ -490,13 +880,20 @@ const LLViewerInventoryItem* LLAppearanceManager::getBaseOutfitLink()
const LLViewerInventoryCategory *cat = item->getLinkedCategory();
if (cat && cat->getPreferredType() == LLFolderType::FT_OUTFIT)
{
+ const LLUUID parent_id = cat->getParentUUID();
+ LLViewerInventoryCategory* parent_cat = gInventory.getCategory(parent_id);
+ // if base outfit moved to trash it means that we don't have base outfit
+ if (parent_cat != NULL && parent_cat->getPreferredType() == LLFolderType::FT_TRASH)
+ {
+ return NULL;
+ }
return item;
}
}
return NULL;
}
-bool LLAppearanceManager::getBaseOutfitName(std::string& name)
+bool LLAppearanceMgr::getBaseOutfitName(std::string& name)
{
const LLViewerInventoryItem* outfit_link = getBaseOutfitLink();
if(outfit_link)
@@ -511,59 +908,360 @@ bool LLAppearanceManager::getBaseOutfitName(std::string& name)
return false;
}
+const LLUUID LLAppearanceMgr::getBaseOutfitUUID()
+{
+ const LLViewerInventoryItem* outfit_link = getBaseOutfitLink();
+ if (!outfit_link || !outfit_link->getIsLinkType()) return LLUUID::null;
+
+ const LLViewerInventoryCategory* outfit_cat = outfit_link->getLinkedCategory();
+ if (!outfit_cat) return LLUUID::null;
+
+ if (outfit_cat->getPreferredType() != LLFolderType::FT_OUTFIT)
+ {
+ llwarns << "Expected outfit type:" << LLFolderType::FT_OUTFIT << " but got type:" << outfit_cat->getType() << " for folder name:" << outfit_cat->getName() << llendl;
+ return LLUUID::null;
+ }
+
+ return outfit_cat->getUUID();
+}
+
+bool LLAppearanceMgr::wearItemOnAvatar(const LLUUID& item_id_to_wear, bool do_update, bool replace)
+{
+ if (item_id_to_wear.isNull()) return false;
+
+ // *TODO: issue with multi-wearable should be fixed:
+ // in this case this method will be called N times - loading started for each item
+ // and than N times will be called - loading completed for each item.
+ // That means subscribers will be notified that loading is done after first item in a batch is worn.
+ // (loading indicator disappears for example before all selected items are worn)
+ // Have not fix this issue for 2.1 because of stability reason. EXT-7777.
+ gAgentWearables.notifyLoadingStarted();
+
+ LLViewerInventoryItem* item_to_wear = gInventory.getItem(item_id_to_wear);
+ if (!item_to_wear) return false;
+
+ if (gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.getLibraryRootFolderID()))
+ {
+ LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback(replace);
+ copy_inventory_item(gAgent.getID(), item_to_wear->getPermissions().getOwner(), item_to_wear->getUUID(), LLUUID::null, std::string(),cb);
+ return false;
+ }
+ else if (!gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.getRootFolderID()))
+ {
+ return false; // not in library and not in agent's inventory
+ }
+ else if (gInventory.isObjectDescendentOf(item_to_wear->getUUID(), gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH)))
+ {
+ LLNotificationsUtil::add("CannotWearTrash");
+ return false;
+ }
+
+ switch (item_to_wear->getType())
+ {
+ case LLAssetType::AT_CLOTHING:
+ if (gAgentWearables.areWearablesLoaded())
+ {
+ S32 wearable_count = gAgentWearables.getWearableCount(item_to_wear->getWearableType());
+ if ((replace && wearable_count != 0) ||
+ (wearable_count >= LLAgentWearables::MAX_CLOTHING_PER_TYPE) )
+ {
+ removeCOFItemLinks(gAgentWearables.getWearableItemID(item_to_wear->getWearableType(), wearable_count-1), false);
+ }
+ }
+ case LLAssetType::AT_BODYPART:
+ // Don't wear anything until initial wearables are loaded, can
+ // destroy clothing items.
+ if (!gAgentWearables.areWearablesLoaded())
+ {
+ LLNotificationsUtil::add("CanNotChangeAppearanceUntilLoaded");
+ return false;
+ }
+
+ // Remove the existing wearables of the same type.
+ // Remove existing body parts anyway because we must not be able to wear e.g. two skins.
+ if (item_to_wear->getType() == LLAssetType::AT_BODYPART)
+ {
+ removeCOFLinksOfType(item_to_wear->getWearableType(), false);
+ }
+
+ addCOFItemLink(item_to_wear, do_update);
+ break;
+ case LLAssetType::AT_OBJECT:
+ rez_attachment(item_to_wear, NULL);
+ break;
+ default: return false;;
+ }
+
+ return true;
+}
+
// Update appearance from outfit folder.
-void LLAppearanceManager::changeOutfit(bool proceed, const LLUUID& category, bool append)
+void LLAppearanceMgr::changeOutfit(bool proceed, const LLUUID& category, bool append)
{
if (!proceed)
return;
- LLAppearanceManager::instance().updateCOF(category,append);
+ LLAppearanceMgr::instance().updateCOF(category,append);
}
-void LLAppearanceManager::shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,
- LLPointer<LLInventoryCallback> cb)
+void LLAppearanceMgr::replaceCurrentOutfit(const LLUUID& new_outfit)
+{
+ LLViewerInventoryCategory* cat = gInventory.getCategory(new_outfit);
+ wearInventoryCategory(cat, false, false);
+}
+
+// Open outfit renaming dialog.
+void LLAppearanceMgr::renameOutfit(const LLUUID& outfit_id)
+{
+ LLViewerInventoryCategory* cat = gInventory.getCategory(outfit_id);
+ if (!cat)
+ {
+ return;
+ }
+
+ LLSD args;
+ args["NAME"] = cat->getName();
+
+ LLSD payload;
+ payload["cat_id"] = outfit_id;
+
+ LLNotificationsUtil::add("RenameOutfit", args, payload, boost::bind(onOutfitRename, _1, _2));
+}
+
+// User typed new outfit name.
+// static
+void LLAppearanceMgr::onOutfitRename(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option != 0) return; // canceled
+
+ std::string outfit_name = response["new_name"].asString();
+ LLStringUtil::trim(outfit_name);
+ if (!outfit_name.empty())
+ {
+ LLUUID cat_id = notification["payload"]["cat_id"].asUUID();
+ rename_category(&gInventory, cat_id, outfit_name);
+ }
+}
+
+void LLAppearanceMgr::setOutfitLocked(bool locked)
+{
+ if (mOutfitLocked == locked)
+ {
+ return;
+ }
+
+ mOutfitLocked = locked;
+ if (locked)
+ {
+ mUnlockOutfitTimer->reset();
+ mUnlockOutfitTimer->start();
+ }
+ else
+ {
+ mUnlockOutfitTimer->stop();
+ }
+
+ LLOutfitObserver::instance().notifyOutfitLockChanged();
+}
+
+void LLAppearanceMgr::addCategoryToCurrentOutfit(const LLUUID& cat_id)
+{
+ LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id);
+ wearInventoryCategory(cat, false, true);
+}
+
+void LLAppearanceMgr::takeOffOutfit(const LLUUID& cat_id)
{
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
- gInventory.collectDescendents(src_id, cats, items,
- LLInventoryModel::EXCLUDE_TRASH);
- for (S32 i = 0; i < items.count(); ++i)
+ LLFindWearablesEx collector(/*is_worn=*/ true, /*include_body_parts=*/ false);
+
+ gInventory.collectDescendentsIf(cat_id, cats, items, FALSE, collector);
+
+ LLInventoryModel::item_array_t::const_iterator it = items.begin();
+ const LLInventoryModel::item_array_t::const_iterator it_end = items.end();
+ for( ; it_end != it; ++it)
{
- const LLViewerInventoryItem* item = items.get(i).get();
- if (item->getActualType() == LLAssetType::AT_LINK)
- {
- link_inventory_item(gAgent.getID(),
- item->getLinkedUUID(),
- dst_id,
- item->getName(),
- LLAssetType::AT_LINK, cb);
- }
- else if (item->getActualType() == LLAssetType::AT_LINK_FOLDER)
+ LLViewerInventoryItem* item = *it;
+ removeItemFromAvatar(item->getUUID());
+ }
+}
+
+// Create a copy of src_id + contents as a subfolder of dst_id.
+void LLAppearanceMgr::shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,
+ LLPointer<LLInventoryCallback> cb)
+{
+ LLInventoryCategory *src_cat = gInventory.getCategory(src_id);
+ if (!src_cat)
+ {
+ llwarns << "folder not found for src " << src_id.asString() << llendl;
+ return;
+ }
+ llinfos << "starting, src_id " << src_id << " name " << src_cat->getName() << " dst_id " << dst_id << llendl;
+ LLUUID parent_id = dst_id;
+ if(parent_id.isNull())
+ {
+ parent_id = gInventory.getRootFolderID();
+ }
+ LLUUID subfolder_id = gInventory.createNewCategory( parent_id,
+ LLFolderType::FT_NONE,
+ src_cat->getName());
+ shallowCopyCategoryContents(src_id, subfolder_id, cb);
+
+ gInventory.notifyObservers();
+}
+
+// Copy contents of src_id to dst_id.
+void LLAppearanceMgr::shallowCopyCategoryContents(const LLUUID& src_id, const LLUUID& dst_id,
+ LLPointer<LLInventoryCallback> cb)
+{
+ LLInventoryModel::cat_array_t* cats;
+ LLInventoryModel::item_array_t* items;
+ gInventory.getDirectDescendentsOf(src_id, cats, items);
+ llinfos << "copying " << items->count() << " items" << llendl;
+ for (LLInventoryModel::item_array_t::const_iterator iter = items->begin();
+ iter != items->end();
+ ++iter)
+ {
+ const LLViewerInventoryItem* item = (*iter);
+ switch (item->getActualType())
{
- LLViewerInventoryCategory *catp = item->getLinkedCategory();
- // Skip copying outfit links.
- if (catp && catp->getPreferredType() != LLFolderType::FT_OUTFIT)
+ case LLAssetType::AT_LINK:
{
+ //LLInventoryItem::getDescription() is used for a new description
+ //to propagate ordering information saved in descriptions of links
link_inventory_item(gAgent.getID(),
item->getLinkedUUID(),
dst_id,
item->getName(),
- LLAssetType::AT_LINK_FOLDER, cb);
+ item->LLInventoryItem::getDescription(),
+ LLAssetType::AT_LINK, cb);
+ break;
+ }
+ case LLAssetType::AT_LINK_FOLDER:
+ {
+ LLViewerInventoryCategory *catp = item->getLinkedCategory();
+ // Skip copying outfit links.
+ if (catp && catp->getPreferredType() != LLFolderType::FT_OUTFIT)
+ {
+ link_inventory_item(gAgent.getID(),
+ item->getLinkedUUID(),
+ dst_id,
+ item->getName(),
+ item->getDescription(),
+ LLAssetType::AT_LINK_FOLDER, cb);
+ }
+ break;
+ }
+ case LLAssetType::AT_CLOTHING:
+ case LLAssetType::AT_OBJECT:
+ case LLAssetType::AT_BODYPART:
+ case LLAssetType::AT_GESTURE:
+ {
+ llinfos << "copying inventory item " << item->getName() << llendl;
+ copy_inventory_item(gAgent.getID(),
+ item->getPermissions().getOwner(),
+ item->getUUID(),
+ dst_id,
+ item->getName(),
+ cb);
+ break;
}
+ default:
+ // Ignore non-outfit asset types
+ break;
}
- else
+ }
+}
+
+BOOL LLAppearanceMgr::getCanMakeFolderIntoOutfit(const LLUUID& folder_id)
+{
+ // These are the wearable items that are required for considering this
+ // folder as containing a complete outfit.
+ U32 required_wearables = 0;
+ required_wearables |= 1LL << LLWearableType::WT_SHAPE;
+ required_wearables |= 1LL << LLWearableType::WT_SKIN;
+ required_wearables |= 1LL << LLWearableType::WT_HAIR;
+ required_wearables |= 1LL << LLWearableType::WT_EYES;
+
+ // These are the wearables that the folder actually contains.
+ U32 folder_wearables = 0;
+ LLInventoryModel::cat_array_t* cats;
+ LLInventoryModel::item_array_t* items;
+ gInventory.getDirectDescendentsOf(folder_id, cats, items);
+ for (LLInventoryModel::item_array_t::const_iterator iter = items->begin();
+ iter != items->end();
+ ++iter)
+ {
+ const LLViewerInventoryItem* item = (*iter);
+ if (item->isWearableType())
{
- copy_inventory_item(
- gAgent.getID(),
- item->getPermissions().getOwner(),
- item->getUUID(),
- dst_id,
- item->getName(),
- cb);
+ const LLWearableType::EType wearable_type = item->getWearableType();
+ folder_wearables |= 1LL << wearable_type;
}
}
+
+ // If the folder contains the required wearables, return TRUE.
+ return ((required_wearables & folder_wearables) == required_wearables);
+}
+
+bool LLAppearanceMgr::getCanRemoveOutfit(const LLUUID& outfit_cat_id)
+{
+ // Disallow removing the base outfit.
+ if (outfit_cat_id == getBaseOutfitUUID())
+ {
+ return false;
+ }
+
+ // Check if the outfit folder itself is removable.
+ if (!get_is_category_removable(&gInventory, outfit_cat_id))
+ {
+ return false;
+ }
+
+ // Check for the folder's non-removable descendants.
+ LLFindNonRemovableObjects filter_non_removable;
+ LLInventoryModel::cat_array_t cats;
+ LLInventoryModel::item_array_t items;
+ LLInventoryModel::item_array_t::const_iterator it;
+ gInventory.collectDescendentsIf(outfit_cat_id, cats, items, false, filter_non_removable);
+ if (!cats.empty() || !items.empty())
+ {
+ return false;
+ }
+
+ return true;
}
-void LLAppearanceManager::purgeBaseOutfitLink(const LLUUID& category)
+// static
+bool LLAppearanceMgr::getCanRemoveFromCOF(const LLUUID& outfit_cat_id)
+{
+ LLInventoryModel::cat_array_t cats;
+ LLInventoryModel::item_array_t items;
+ LLFindWearablesEx is_worn(/*is_worn=*/ true, /*include_body_parts=*/ false);
+ gInventory.collectDescendentsIf(outfit_cat_id,
+ cats,
+ items,
+ LLInventoryModel::EXCLUDE_TRASH,
+ is_worn);
+ return items.size() > 0;
+}
+
+// static
+bool LLAppearanceMgr::getCanAddToCOF(const LLUUID& outfit_cat_id)
+{
+ LLInventoryModel::cat_array_t cats;
+ LLInventoryModel::item_array_t items;
+ LLFindWearablesEx not_worn(/*is_worn=*/ false, /*include_body_parts=*/ false);
+ gInventory.collectDescendentsIf(outfit_cat_id,
+ cats,
+ items,
+ LLInventoryModel::EXCLUDE_TRASH,
+ not_worn);
+ return items.size() > 0;
+}
+
+void LLAppearanceMgr::purgeBaseOutfitLink(const LLUUID& category)
{
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
@@ -585,7 +1283,7 @@ void LLAppearanceManager::purgeBaseOutfitLink(const LLUUID& category)
}
}
-void LLAppearanceManager::purgeCategory(const LLUUID& category, bool keep_outfit_links)
+void LLAppearanceMgr::purgeCategory(const LLUUID& category, bool keep_outfit_links)
{
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
@@ -605,24 +1303,16 @@ void LLAppearanceManager::purgeCategory(const LLUUID& category, bool keep_outfit
// Keep the last N wearables of each type. For viewer 2.0, N is 1 for
// both body parts and clothing items.
-void LLAppearanceManager::filterWearableItems(
+void LLAppearanceMgr::filterWearableItems(
LLInventoryModel::item_array_t& items, S32 max_per_type)
{
// Divvy items into arrays by wearable type.
- std::vector<LLInventoryModel::item_array_t> items_by_type(WT_COUNT);
- for (S32 i=0; i<items.count(); i++)
- {
- LLViewerInventoryItem *item = items.get(i);
- // Ignore non-wearables.
- if (!item->isWearableType())
- continue;
- EWearableType type = item->getWearableType();
- items_by_type[type].push_back(item);
- }
+ std::vector<LLInventoryModel::item_array_t> items_by_type(LLWearableType::WT_COUNT);
+ divvyWearablesByType(items, items_by_type);
// rebuild items list, retaining the last max_per_type of each array
items.clear();
- for (S32 i=0; i<WT_COUNT; i++)
+ for (S32 i=0; i<LLWearableType::WT_COUNT; i++)
{
S32 size = items_by_type[i].size();
if (size <= 0)
@@ -636,7 +1326,7 @@ void LLAppearanceManager::filterWearableItems(
}
// Create links to all listed items.
-void LLAppearanceManager::linkAll(const LLUUID& category,
+void LLAppearanceMgr::linkAll(const LLUUID& cat_uuid,
LLInventoryModel::item_array_t& items,
LLPointer<LLInventoryCallback> cb)
{
@@ -645,15 +1335,25 @@ void LLAppearanceManager::linkAll(const LLUUID& category,
const LLInventoryItem* item = items.get(i).get();
link_inventory_item(gAgent.getID(),
item->getLinkedUUID(),
- category,
+ cat_uuid,
item->getName(),
+ item->LLInventoryItem::getDescription(),
LLAssetType::AT_LINK,
cb);
+
+ const LLViewerInventoryCategory *cat = gInventory.getCategory(cat_uuid);
+ const std::string cat_name = cat ? cat->getName() : "CAT NOT FOUND";
+#ifndef LL_RELEASE_FOR_DOWNLOAD
+ llinfos << "Linking Item [ name:" << item->getName() << " UUID:" << item->getUUID() << " ] to Category [ name:" << cat_name << " UUID:" << cat_uuid << " ] " << llendl;
+#endif
}
}
-void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)
+void LLAppearanceMgr::updateCOF(const LLUUID& category, bool append)
{
+ LLViewerInventoryCategory *pcat = gInventory.getCategory(category);
+ llinfos << "starting, cat " << (pcat ? pcat->getName() : "[UNKNOWN]") << llendl;
+
const LLUUID cof = getCOF();
// Deactivate currently active gestures in the COF, if replacing outfit
@@ -664,9 +1364,9 @@ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)
for(S32 i = 0; i < gest_items.count(); ++i)
{
LLViewerInventoryItem *gest_item = gest_items.get(i);
- if ( LLGestureManager::instance().isGestureActive( gest_item->getLinkedUUID()) )
+ if ( LLGestureMgr::instance().isGestureActive( gest_item->getLinkedUUID()) )
{
- LLGestureManager::instance().deactivateGesture( gest_item->getLinkedUUID() );
+ LLGestureMgr::instance().deactivateGesture( gest_item->getLinkedUUID() );
}
}
}
@@ -675,9 +1375,12 @@ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)
// - Body parts: always include COF contents as a fallback in case any
// required parts are missing.
+ // Preserve body parts from COF if appending.
LLInventoryModel::item_array_t body_items;
getDescendentsOfAssetType(cof, body_items, LLAssetType::AT_BODYPART, false);
getDescendentsOfAssetType(category, body_items, LLAssetType::AT_BODYPART, false);
+ if (append)
+ reverse(body_items.begin(), body_items.end());
// Reduce body items to max of one per type.
removeDuplicateItems(body_items);
filterWearableItems(body_items, 1);
@@ -689,7 +1392,7 @@ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)
getDescendentsOfAssetType(category, wear_items, LLAssetType::AT_CLOTHING, false);
// Reduce wearables to max of one per type.
removeDuplicateItems(wear_items);
- filterWearableItems(wear_items, 1);
+ filterWearableItems(wear_items, LLAgentWearables::MAX_CLOTHING_PER_TYPE);
// - Attachments: include COF contents only if appending.
LLInventoryModel::item_array_t obj_items;
@@ -711,11 +1414,27 @@ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)
gInventory.notifyObservers();
// Create links to new COF contents.
+ llinfos << "creating LLUpdateAppearanceOnDestroy" << llendl;
LLPointer<LLInventoryCallback> link_waiter = new LLUpdateAppearanceOnDestroy;
+#ifndef LL_RELEASE_FOR_DOWNLOAD
+ llinfos << "Linking body items" << llendl;
+#endif
linkAll(cof, body_items, link_waiter);
+
+#ifndef LL_RELEASE_FOR_DOWNLOAD
+ llinfos << "Linking wear items" << llendl;
+#endif
linkAll(cof, wear_items, link_waiter);
+
+#ifndef LL_RELEASE_FOR_DOWNLOAD
+ llinfos << "Linking obj items" << llendl;
+#endif
linkAll(cof, obj_items, link_waiter);
+
+#ifndef LL_RELEASE_FOR_DOWNLOAD
+ llinfos << "Linking gesture items" << llendl;
+#endif
linkAll(cof, gest_items, link_waiter);
// Add link to outfit if category is an outfit.
@@ -723,9 +1442,10 @@ void LLAppearanceManager::updateCOF(const LLUUID& category, bool append)
{
createBaseOutfitLink(category, link_waiter);
}
+ llinfos << "waiting for LLUpdateAppearanceOnDestroy" << llendl;
}
-void LLAppearanceManager::updatePanelOutfitName(const std::string& name)
+void LLAppearanceMgr::updatePanelOutfitName(const std::string& name)
{
LLSidepanelAppearance* panel_appearance =
dynamic_cast<LLSidepanelAppearance *>(LLSideTray::getInstance()->getPanel("sidepanel_appearance"));
@@ -735,7 +1455,7 @@ void LLAppearanceManager::updatePanelOutfitName(const std::string& name)
}
}
-void LLAppearanceManager::createBaseOutfitLink(const LLUUID& category, LLPointer<LLInventoryCallback> link_waiter)
+void LLAppearanceMgr::createBaseOutfitLink(const LLUUID& category, LLPointer<LLInventoryCallback> link_waiter)
{
const LLUUID cof = getCOF();
LLViewerInventoryCategory* catp = gInventory.getCategory(category);
@@ -745,7 +1465,7 @@ void LLAppearanceManager::createBaseOutfitLink(const LLUUID& category, LLPointer
if (catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT)
{
- link_inventory_item(gAgent.getID(), category, cof, catp->getName(),
+ link_inventory_item(gAgent.getID(), category, cof, catp->getName(), "",
LLAssetType::AT_LINK_FOLDER, link_waiter);
new_outfit_name = catp->getName();
}
@@ -753,31 +1473,28 @@ void LLAppearanceManager::createBaseOutfitLink(const LLUUID& category, LLPointer
updatePanelOutfitName(new_outfit_name);
}
-void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder, bool append)
+void LLAppearanceMgr::updateAgentWearables(LLWearableHoldingPattern* holder, bool append)
{
lldebugs << "updateAgentWearables()" << llendl;
LLInventoryItem::item_array_t items;
LLDynamicArray< LLWearable* > wearables;
- // For each wearable type, find the first instance in the category
- // that we recursed through.
- for( S32 i = 0; i < WT_COUNT; i++ )
+ // For each wearable type, find the wearables of that type.
+ for( S32 i = 0; i < LLWearableType::WT_COUNT; i++ )
{
- for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->mFoundList.begin();
- iter != holder->mFoundList.end(); ++iter)
+ for (LLWearableHoldingPattern::found_list_t::iterator iter = holder->getFoundList().begin();
+ iter != holder->getFoundList().end(); ++iter)
{
LLFoundData& data = *iter;
LLWearable* wearable = data.mWearable;
if( wearable && ((S32)wearable->getType() == i) )
{
- LLViewerInventoryItem* item;
- item = (LLViewerInventoryItem*)gInventory.getItem(data.mItemID);
+ LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getItem(data.mItemID);
if( item && (item->getAssetUUID() == wearable->getAssetID()) )
{
items.put(item);
wearables.put(wearable);
}
- break;
}
}
}
@@ -790,10 +1507,44 @@ void LLAppearanceManager::updateAgentWearables(LLWearableHoldingPattern* holder,
// dec_busy_count();
}
-void LLAppearanceManager::updateAppearanceFromCOF()
+static void remove_non_link_items(LLInventoryModel::item_array_t &items)
+{
+ LLInventoryModel::item_array_t pruned_items;
+ for (LLInventoryModel::item_array_t::const_iterator iter = items.begin();
+ iter != items.end();
+ ++iter)
+ {
+ const LLViewerInventoryItem *item = (*iter);
+ if (item && item->getIsLinkType())
+ {
+ pruned_items.push_back((*iter));
+ }
+ }
+ items = pruned_items;
+}
+
+//a predicate for sorting inventory items by actual descriptions
+bool sort_by_description(const LLInventoryItem* item1, const LLInventoryItem* item2)
{
+ if (!item1 || !item2)
+ {
+ llwarning("either item1 or item2 is NULL", 0);
+ return true;
+ }
+
+ return item1->LLInventoryItem::getDescription() < item2->LLInventoryItem::getDescription();
+}
+
+void LLAppearanceMgr::updateAppearanceFromCOF()
+{
+ //checking integrity of the COF in terms of ordering of wearables,
+ //checking and updating links' descriptions of wearables in the COF (before analyzed for "dirty" state)
+ updateClothingOrderingInfo();
+
// update dirty flag to see if the state of the COF matches
// the saved outfit stored as a folder link
+ llinfos << "starting" << llendl;
+
updateIsDirty();
dumpCat(getCOF(),"COF, start");
@@ -801,59 +1552,83 @@ void LLAppearanceManager::updateAppearanceFromCOF()
bool follow_folder_links = true;
LLUUID current_outfit_id = getCOF();
- // Find all the wearables that are in the COF's subtree.
- lldebugs << "LLAppearanceManager::updateFromCOF()" << llendl;
+ // Find all the wearables that are in the COF's subtree.
+ lldebugs << "LLAppearanceMgr::updateFromCOF()" << llendl;
LLInventoryModel::item_array_t wear_items;
LLInventoryModel::item_array_t obj_items;
LLInventoryModel::item_array_t gest_items;
getUserDescendents(current_outfit_id, wear_items, obj_items, gest_items, follow_folder_links);
-
+ // Get rid of non-links in case somehow the COF was corrupted.
+ remove_non_link_items(wear_items);
+ remove_non_link_items(obj_items);
+ remove_non_link_items(gest_items);
+
if(!wear_items.count())
{
LLNotificationsUtil::add("CouldNotPutOnOutfit");
return;
}
+ //preparing the list of wearables in the correct order for LLAgentWearables
+ sortItemsByActualDescription(wear_items);
+
+
LLWearableHoldingPattern* holder = new LLWearableHoldingPattern;
- holder->mObjItems = obj_items;
- holder->mGestItems = gest_items;
+ holder->setObjItems(obj_items);
+ holder->setGestItems(gest_items);
// Note: can't do normal iteration, because if all the
// wearables can be resolved immediately, then the
// callback will be called (and this object deleted)
// before the final getNextData().
- LLDynamicArray<LLFoundData> found_container;
+
for(S32 i = 0; i < wear_items.count(); ++i)
{
LLViewerInventoryItem *item = wear_items.get(i);
LLViewerInventoryItem *linked_item = item ? item->getLinkedItem() : NULL;
- if (item && linked_item)
+
+ // Fault injection: use debug setting to test asset
+ // fetch failures (should be replaced by new defaults in
+ // lost&found).
+ U32 skip_type = gSavedSettings.getU32("ForceAssetFail");
+
+ if (item && item->getIsLinkType() && linked_item)
{
LLFoundData found(linked_item->getUUID(),
linked_item->getAssetUUID(),
linked_item->getName(),
- linked_item->getType());
- holder->mFoundList.push_front(found);
- found_container.put(found);
+ linked_item->getType(),
+ linked_item->isWearableType() ? linked_item->getWearableType() : LLWearableType::WT_INVALID
+ );
+
+ if (skip_type != LLWearableType::WT_INVALID && skip_type == found.mWearableType)
+ {
+ found.mAssetID.generate(); // Replace with new UUID, guaranteed not to exist in DB
+ }
+ //pushing back, not front, to preserve order of wearables for LLAgentWearables
+ holder->getFoundList().push_back(found);
}
else
{
if (!item)
{
- llwarns << "attempt to wear a null item " << llendl;
+ llwarns << "Attempt to wear a null item " << llendl;
}
else if (!linked_item)
{
- llwarns << "attempt to wear a broken link " << item->getName() << llendl;
+ llwarns << "Attempt to wear a broken link [ name:" << item->getName() << " ] " << llendl;
}
}
}
- for(S32 i = 0; i < found_container.count(); ++i)
+ for (LLWearableHoldingPattern::found_list_t::iterator it = holder->getFoundList().begin();
+ it != holder->getFoundList().end(); ++it)
{
- LLFoundData& found = found_container.get(i);
-
+ LLFoundData& found = *it;
+
+ llinfos << "waiting for onWearableAssetFetch callback, asset " << found.mAssetID.asString() << llendl;
+
// Fetch the wearables about to be worn.
LLWearableList::instance().getAsset(found.mAssetID,
found.mName,
@@ -863,14 +1638,14 @@ void LLAppearanceManager::updateAppearanceFromCOF()
}
- if (!holder->pollCompletion())
+ holder->resetTime(gSavedSettings.getF32("MaxWearableWaitTime"));
+ if (!holder->pollFetchCompletion())
{
- doOnIdleRepeating(boost::bind(&LLWearableHoldingPattern::pollCompletion,holder));
+ doOnIdleRepeating(boost::bind(&LLWearableHoldingPattern::pollFetchCompletion,holder));
}
-
}
-void LLAppearanceManager::getDescendentsOfAssetType(const LLUUID& category,
+void LLAppearanceMgr::getDescendentsOfAssetType(const LLUUID& category,
LLInventoryModel::item_array_t& items,
LLAssetType::EType type,
bool follow_folder_links)
@@ -885,7 +1660,7 @@ void LLAppearanceManager::getDescendentsOfAssetType(const LLUUID& category,
follow_folder_links);
}
-void LLAppearanceManager::getUserDescendents(const LLUUID& category,
+void LLAppearanceMgr::getUserDescendents(const LLUUID& category,
LLInventoryModel::item_array_t& wear_items,
LLInventoryModel::item_array_t& obj_items,
LLInventoryModel::item_array_t& gest_items,
@@ -920,56 +1695,117 @@ void LLAppearanceManager::getUserDescendents(const LLUUID& category,
follow_folder_links);
}
-void LLAppearanceManager::wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append)
+void LLAppearanceMgr::wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append)
{
+ gAgentWearables.notifyLoadingStarted();
if(!category) return;
- lldebugs << "wearInventoryCategory( " << category->getName()
+ llinfos << "wearInventoryCategory( " << category->getName()
<< " )" << llendl;
- // What we do here is get the complete information on the items in
- // the inventory, and set up an observer that will wait for that to
- // happen.
- LLOutfitFetch* outfit_fetcher = new LLOutfitFetch(copy, append);
- LLInventoryFetchDescendentsObserver::folder_ref_t folders;
- folders.push_back(category->getUUID());
- outfit_fetcher->fetchDescendents(folders);
- //inc_busy_count();
- if(outfit_fetcher->isEverythingComplete())
+
+ callAfterCategoryFetch(category->getUUID(),boost::bind(&LLAppearanceMgr::wearCategoryFinal,
+ &LLAppearanceMgr::instance(),
+ category->getUUID(), copy, append));
+}
+
+void LLAppearanceMgr::wearCategoryFinal(LLUUID& cat_id, bool copy_items, bool append)
+{
+ llinfos << "starting" << llendl;
+
+ // We now have an outfit ready to be copied to agent inventory. Do
+ // it, and wear that outfit normally.
+ LLInventoryCategory* cat = gInventory.getCategory(cat_id);
+ if(copy_items)
{
- // everything is already here - call done.
- outfit_fetcher->done();
+ LLInventoryModel::cat_array_t* cats;
+ LLInventoryModel::item_array_t* items;
+ gInventory.getDirectDescendentsOf(cat_id, cats, items);
+ std::string name;
+ if(!cat)
+ {
+ // should never happen.
+ name = "New Outfit";
+ }
+ else
+ {
+ name = cat->getName();
+ }
+ LLViewerInventoryItem* item = NULL;
+ LLInventoryModel::item_array_t::const_iterator it = items->begin();
+ LLInventoryModel::item_array_t::const_iterator end = items->end();
+ LLUUID pid;
+ for(; it < end; ++it)
+ {
+ item = *it;
+ if(item)
+ {
+ if(LLInventoryType::IT_GESTURE == item->getInventoryType())
+ {
+ pid = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE);
+ }
+ else
+ {
+ pid = gInventory.findCategoryUUIDForType(LLFolderType::FT_CLOTHING);
+ }
+ break;
+ }
+ }
+ if(pid.isNull())
+ {
+ pid = gInventory.getRootFolderID();
+ }
+
+ LLUUID new_cat_id = gInventory.createNewCategory(
+ pid,
+ LLFolderType::FT_NONE,
+ name);
+ LLPointer<LLInventoryCallback> cb = new LLWearInventoryCategoryCallback(new_cat_id, append);
+ it = items->begin();
+ for(; it < end; ++it)
+ {
+ item = *it;
+ if(item)
+ {
+ copy_inventory_item(
+ gAgent.getID(),
+ item->getPermissions().getOwner(),
+ item->getUUID(),
+ new_cat_id,
+ std::string(),
+ cb);
+ }
+ }
+ // BAP fixes a lag in display of created dir.
+ gInventory.notifyObservers();
}
else
{
- // it's all on it's way - add an observer, and the inventory
- // will call done for us when everything is here.
- gInventory.addObserver(outfit_fetcher);
+ // Wear the inventory category.
+ LLAppearanceMgr::instance().wearInventoryCategoryOnAvatar(cat, append);
}
}
// *NOTE: hack to get from avatar inventory to avatar
-void LLAppearanceManager::wearInventoryCategoryOnAvatar( LLInventoryCategory* category, bool append )
+void LLAppearanceMgr::wearInventoryCategoryOnAvatar( LLInventoryCategory* category, bool append )
{
// Avoid unintentionally overwriting old wearables. We have to do
// this up front to avoid having to deal with the case of multiple
// wearables being dirty.
if(!category) return;
- lldebugs << "wearInventoryCategoryOnAvatar( " << category->getName()
+
+ llinfos << "wearInventoryCategoryOnAvatar( " << category->getName()
<< " )" << llendl;
- if( gFloaterCustomize )
+ if (gAgentCamera.cameraCustomizeAvatar())
{
- gFloaterCustomize->askToSaveIfDirty(boost::bind(&LLAppearanceManager::changeOutfit,
- &LLAppearanceManager::instance(),
- _1, category->getUUID(), append));
- }
- else
- {
- LLAppearanceManager::changeOutfit(TRUE, category->getUUID(), append);
+ // switching to outfit editor should automagically save any currently edited wearable
+ LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit"));
}
+
+ LLAppearanceMgr::changeOutfit(TRUE, category->getUUID(), append);
}
-void LLAppearanceManager::wearOutfitByName(const std::string& name)
+void LLAppearanceMgr::wearOutfitByName(const std::string& name)
{
llinfos << "Wearing category " << name << llendl;
//inc_busy_count();
@@ -1005,7 +1841,7 @@ void LLAppearanceManager::wearOutfitByName(const std::string& name)
if(cat)
{
- LLAppearanceManager::wearInventoryCategory(cat, copy_items, false);
+ LLAppearanceMgr::wearInventoryCategory(cat, copy_items, false);
}
else
{
@@ -1041,7 +1877,7 @@ public:
if (item)
{
gInventory.removeObserver(this);
- LLAppearanceManager::instance().addCOFItemLink(item,mDoUpdate);
+ LLAppearanceMgr::instance().addCOFItemLink(item,mDoUpdate);
delete this;
}
}
@@ -1052,7 +1888,9 @@ private:
};
-void LLAppearanceManager::addCOFItemLink(const LLUUID &item_id, bool do_update )
+// BAP - note that this runs asynchronously if the item is not already loaded from inventory.
+// Dangerous if caller assumes link will exist after calling the function.
+void LLAppearanceMgr::addCOFItemLink(const LLUUID &item_id, bool do_update )
{
const LLInventoryItem *item = gInventory.getItem(item_id);
if (!item)
@@ -1066,7 +1904,7 @@ void LLAppearanceManager::addCOFItemLink(const LLUUID &item_id, bool do_update )
}
}
-void LLAppearanceManager::addCOFItemLink(const LLInventoryItem *item, bool do_update )
+void LLAppearanceMgr::addCOFItemLink(const LLInventoryItem *item, bool do_update )
{
const LLViewerInventoryItem *vitem = dynamic_cast<const LLViewerInventoryItem*>(item);
if (!vitem)
@@ -1079,52 +1917,69 @@ void LLAppearanceManager::addCOFItemLink(const LLInventoryItem *item, bool do_up
LLInventoryModel::cat_array_t cat_array;
LLInventoryModel::item_array_t item_array;
- gInventory.collectDescendents(LLAppearanceManager::getCOF(),
+ gInventory.collectDescendents(LLAppearanceMgr::getCOF(),
cat_array,
item_array,
LLInventoryModel::EXCLUDE_TRASH);
bool linked_already = false;
+ U32 count = 0;
for (S32 i=0; i<item_array.count(); i++)
{
// Are these links to the same object?
const LLViewerInventoryItem* inv_item = item_array.get(i).get();
+ const LLWearableType::EType wearable_type = inv_item->getWearableType();
+
+ const bool is_body_part = (wearable_type == LLWearableType::WT_SHAPE)
+ || (wearable_type == LLWearableType::WT_HAIR)
+ || (wearable_type == LLWearableType::WT_EYES)
+ || (wearable_type == LLWearableType::WT_SKIN);
+
if (inv_item->getLinkedUUID() == vitem->getLinkedUUID())
{
linked_already = true;
}
- // Are these links to different items of the same wearable
+ // Are these links to different items of the same body part
// type? If so, new item will replace old.
- // MULTI-WEARABLES: revisit if more than one per type is allowed.
- else if (areMatchingWearables(vitem,inv_item))
+ else if ((vitem->isWearableType()) && (vitem->getWearableType() == wearable_type))
{
- if (inv_item->getIsLinkType())
+ ++count;
+ if (is_body_part && inv_item->getIsLinkType() && (vitem->getWearableType() == wearable_type))
+ {
+ gInventory.purgeObject(inv_item->getUUID());
+ }
+ else if (count >= LLAgentWearables::MAX_CLOTHING_PER_TYPE)
{
+ // MULTI-WEARABLES: make sure we don't go over MAX_CLOTHING_PER_TYPE
gInventory.purgeObject(inv_item->getUUID());
}
}
}
+
if (linked_already)
{
if (do_update)
{
- LLAppearanceManager::updateAppearanceFromCOF();
+ LLAppearanceMgr::updateAppearanceFromCOF();
}
return;
}
else
{
LLPointer<LLInventoryCallback> cb = do_update ? new ModifiedCOFCallback : 0;
+ const std::string description = vitem->getIsLinkType() ? vitem->getDescription() : "";
link_inventory_item( gAgent.getID(),
vitem->getLinkedUUID(),
getCOF(),
vitem->getName(),
+ description,
LLAssetType::AT_LINK,
cb);
}
return;
}
-void LLAppearanceManager::addEnsembleLink( LLInventoryCategory* cat, bool do_update )
+// BAP remove ensemble code for 2.1?
+void LLAppearanceMgr::addEnsembleLink( LLInventoryCategory* cat, bool do_update )
{
#if SUPPORT_ENSEMBLES
// BAP add check for already in COF.
@@ -1133,18 +1988,19 @@ void LLAppearanceManager::addEnsembleLink( LLInventoryCategory* cat, bool do_upd
cat->getLinkedUUID(),
getCOF(),
cat->getName(),
+ cat->getDescription(),
LLAssetType::AT_LINK_FOLDER,
cb);
#endif
}
-void LLAppearanceManager::removeCOFItemLinks(const LLUUID& item_id, bool do_update)
+void LLAppearanceMgr::removeCOFItemLinks(const LLUUID& item_id, bool do_update)
{
gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
LLInventoryModel::cat_array_t cat_array;
LLInventoryModel::item_array_t item_array;
- gInventory.collectDescendents(LLAppearanceManager::getCOF(),
+ gInventory.collectDescendents(LLAppearanceMgr::getCOF(),
cat_array,
item_array,
LLInventoryModel::EXCLUDE_TRASH);
@@ -1158,11 +2014,45 @@ void LLAppearanceManager::removeCOFItemLinks(const LLUUID& item_id, bool do_upda
}
if (do_update)
{
- LLAppearanceManager::updateAppearanceFromCOF();
+ LLAppearanceMgr::updateAppearanceFromCOF();
+ }
+}
+
+void LLAppearanceMgr::removeCOFLinksOfType(LLWearableType::EType type, bool do_update)
+{
+ LLFindWearablesOfType filter_wearables_of_type(type);
+ LLInventoryModel::cat_array_t cats;
+ LLInventoryModel::item_array_t items;
+ LLInventoryModel::item_array_t::const_iterator it;
+
+ gInventory.collectDescendentsIf(getCOF(), cats, items, true, filter_wearables_of_type);
+ for (it = items.begin(); it != items.end(); ++it)
+ {
+ const LLViewerInventoryItem* item = *it;
+ if (item->getIsLinkType()) // we must operate on links only
+ {
+ gInventory.purgeObject(item->getUUID());
+ }
+ }
+
+ if (do_update)
+ {
+ updateAppearanceFromCOF();
}
}
-void LLAppearanceManager::updateIsDirty()
+bool sort_by_linked_uuid(const LLViewerInventoryItem* item1, const LLViewerInventoryItem* item2)
+{
+ if (!item1 || !item2)
+ {
+ llwarning("item1, item2 cannot be null, something is very wrong", 0);
+ return true;
+ }
+
+ return item1->getLinkedUUID() < item2->getLinkedUUID();
+}
+
+void LLAppearanceMgr::updateIsDirty()
{
LLUUID cof = getCOF();
LLUUID base_outfit;
@@ -1201,39 +2091,378 @@ void LLAppearanceManager::updateIsDirty()
// Current outfit folder should have one more item than the outfit folder.
// this one item is the link back to the outfit folder itself.
mOutfitIsDirty = true;
+ return;
}
- else
- {
- typedef std::set<LLUUID> item_set_t;
- item_set_t cof_set;
- item_set_t outfit_set;
- // sort COF items by UUID
- for (S32 i = 0; i < cof_items.count(); ++i)
+ //getting rid of base outfit folder link to simplify comparison
+ for (LLInventoryModel::item_array_t::iterator it = cof_items.begin(); it != cof_items.end(); ++it)
+ {
+ if (*it == base_outfit_item)
{
- LLViewerInventoryItem *item = cof_items.get(i);
- // don't add the base outfit link to the list of objects we're comparing
- if(item != base_outfit_item)
- {
- cof_set.insert(item->getLinkedUUID());
- }
+ cof_items.erase(it);
+ break;
}
+ }
+
+ //"dirty" - also means a difference in linked UUIDs and/or a difference in wearables order (links' descriptions)
+ std::sort(cof_items.begin(), cof_items.end(), sort_by_linked_uuid);
+ std::sort(outfit_items.begin(), outfit_items.end(), sort_by_linked_uuid);
- // sort outfit folder by UUID
- for (S32 i = 0; i < outfit_items.count(); ++i)
+ for (U32 i = 0; i < cof_items.size(); ++i)
+ {
+ LLViewerInventoryItem *item1 = cof_items.get(i);
+ LLViewerInventoryItem *item2 = outfit_items.get(i);
+
+ if (item1->getLinkedUUID() != item2->getLinkedUUID() ||
+ item1->LLInventoryItem::getDescription() != item2->LLInventoryItem::getDescription())
{
- LLViewerInventoryItem *item = outfit_items.get(i);
- outfit_set.insert(item->getLinkedUUID());
+ mOutfitIsDirty = true;
+ return;
}
+ }
+
+ mOutfitIsDirty = false;
+ }
+}
+
+void LLAppearanceMgr::autopopulateOutfits()
+{
+ // If this is the very first time the user has logged into viewer2+ (from a legacy viewer, or new account)
+ // then auto-populate outfits from the library into the My Outfits folder.
+
+ llinfos << "avatar fully visible" << llendl;
+
+ static bool check_populate_my_outfits = true;
+ if (check_populate_my_outfits &&
+ (LLInventoryModel::getIsFirstTimeInViewer2()
+ || gSavedSettings.getBOOL("MyOutfitsAutofill")))
+ {
+ gAgentWearables.populateMyOutfitsFolder();
+ }
+ check_populate_my_outfits = false;
+}
+
+// Handler for anything that's deferred until avatar de-clouds.
+void LLAppearanceMgr::onFirstFullyVisible()
+{
+ gAgentAvatarp->debugAvatarVisible();
+ autopopulateOutfits();
+}
+
+bool LLAppearanceMgr::updateBaseOutfit()
+{
+ if (isOutfitLocked())
+ {
+ // don't allow modify locked outfit
+ llassert(!isOutfitLocked());
+ return false;
+ }
+ setOutfitLocked(true);
+
+ gAgentWearables.notifyLoadingStarted();
+
+ const LLUUID base_outfit_id = getBaseOutfitUUID();
+ if (base_outfit_id.isNull()) return false;
+
+ updateClothingOrderingInfo();
+
+ // in a Base Outfit we do not remove items, only links
+ purgeCategory(base_outfit_id, false);
+
+
+ LLPointer<LLInventoryCallback> dirty_state_updater = new LLUpdateDirtyState();
+
+ //COF contains only links so we copy to the Base Outfit only links
+ shallowCopyCategoryContents(getCOF(), base_outfit_id, dirty_state_updater);
+
+ return true;
+}
+
+void LLAppearanceMgr::divvyWearablesByType(const LLInventoryModel::item_array_t& items, wearables_by_type_t& items_by_type)
+{
+ items_by_type.reserve(LLWearableType::WT_COUNT);
+ if (items.empty()) return;
+
+ for (S32 i=0; i<items.count(); i++)
+ {
+ LLViewerInventoryItem *item = items.get(i);
+ // Ignore non-wearables.
+ if (!item->isWearableType())
+ continue;
+ LLWearableType::EType type = item->getWearableType();
+ if(type < 0 || type >= LLWearableType::WT_COUNT)
+ {
+ LL_WARNS("Appearance") << "Invalid wearable type. Inventory type does not match wearable flag bitfield." << LL_ENDL;
+ continue;
+ }
+ items_by_type[type].push_back(item);
+ }
+}
+
+std::string build_order_string(LLWearableType::EType type, U32 i)
+{
+ std::ostringstream order_num;
+ order_num << ORDER_NUMBER_SEPARATOR << type * 100 + i;
+ return order_num.str();
+}
+
+struct WearablesOrderComparator
+{
+ WearablesOrderComparator(const LLWearableType::EType type)
+ {
+ mControlSize = build_order_string(type, 0).size();
+ };
+
+ bool operator()(const LLInventoryItem* item1, const LLInventoryItem* item2)
+ {
+ if (!item1 || !item2)
+ {
+ llwarning("either item1 or item2 is NULL", 0);
+ return true;
+ }
+
+ const std::string& desc1 = item1->LLInventoryItem::getDescription();
+ const std::string& desc2 = item2->LLInventoryItem::getDescription();
+
+ bool item1_valid = (desc1.size() == mControlSize) && (ORDER_NUMBER_SEPARATOR == desc1[0]);
+ bool item2_valid = (desc2.size() == mControlSize) && (ORDER_NUMBER_SEPARATOR == desc2[0]);
- mOutfitIsDirty = (outfit_set != cof_set);
+ if (item1_valid && item2_valid)
+ return desc1 < desc2;
+
+ //we need to sink down invalid items: items with empty descriptions, items with "Broken link" descriptions,
+ //items with ordering information but not for the associated wearables type
+ if (!item1_valid && item2_valid)
+ return false;
+
+ return true;
+ }
+
+ U32 mControlSize;
+};
+
+void LLAppearanceMgr::updateClothingOrderingInfo(LLUUID cat_id)
+{
+ if (cat_id.isNull())
+ {
+ cat_id = getCOF();
+ }
+
+ // COF is processed if cat_id is not specified
+ LLInventoryModel::item_array_t wear_items;
+ getDescendentsOfAssetType(cat_id, wear_items, LLAssetType::AT_CLOTHING, false);
+
+ wearables_by_type_t items_by_type(LLWearableType::WT_COUNT);
+ divvyWearablesByType(wear_items, items_by_type);
+
+ bool inventory_changed = false;
+ for (U32 type = LLWearableType::WT_SHIRT; type < LLWearableType::WT_COUNT; type++)
+ {
+
+ U32 size = items_by_type[type].size();
+ if (!size) continue;
+
+ //sinking down invalid items which need reordering
+ std::sort(items_by_type[type].begin(), items_by_type[type].end(), WearablesOrderComparator((LLWearableType::EType) type));
+
+ //requesting updates only for those links which don't have "valid" descriptions
+ for (U32 i = 0; i < size; i++)
+ {
+ LLViewerInventoryItem* item = items_by_type[type][i];
+ if (!item) continue;
+
+ std::string new_order_str = build_order_string((LLWearableType::EType)type, i);
+ if (new_order_str == item->LLInventoryItem::getDescription()) continue;
+
+ item->setDescription(new_order_str);
+ item->setComplete(TRUE);
+ item->updateServer(FALSE);
+ gInventory.updateItem(item);
+ inventory_changed = true;
}
}
+
+ //*TODO do we really need to notify observers?
+ if (inventory_changed) gInventory.notifyObservers();
+}
+
+
+
+
+class LLShowCreatedOutfit: public LLInventoryCallback
+{
+public:
+ LLShowCreatedOutfit(LLUUID& folder_id, bool show_panel = true): mFolderID(folder_id), mShowPanel(show_panel)
+ {}
+
+ virtual ~LLShowCreatedOutfit()
+ {
+ LLSD key;
+
+ //EXT-7727. For new accounts LLShowCreatedOutfit is created during login process
+ // add may be processed after login process is finished
+ if (mShowPanel)
+ {
+ LLSideTray::getInstance()->showPanel("panel_outfits_inventory", key);
+ }
+ LLPanelOutfitsInventory *outfit_panel =
+ dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory"));
+ if (outfit_panel)
+ {
+ outfit_panel->getRootFolder()->clearSelection();
+ outfit_panel->getRootFolder()->setSelectionByID(mFolderID, TRUE);
+ }
+
+ LLAccordionCtrlTab* tab_outfits = outfit_panel ? outfit_panel->findChild<LLAccordionCtrlTab>("tab_outfits") : 0;
+ if (tab_outfits && !tab_outfits->getDisplayChildren())
+ {
+ tab_outfits->changeOpenClose(tab_outfits->getDisplayChildren());
+ }
+
+ LLAppearanceMgr::getInstance()->updateIsDirty();
+ gAgentWearables.notifyLoadingFinished(); // New outfit is saved.
+ LLAppearanceMgr::getInstance()->updatePanelOutfitName("");
+ }
+
+ virtual void fire(const LLUUID&)
+ {}
+
+private:
+ LLUUID mFolderID;
+ bool mShowPanel;
+};
+
+LLUUID LLAppearanceMgr::makeNewOutfitLinks(const std::string& new_folder_name, bool show_panel)
+{
+ if (!isAgentAvatarValid()) return LLUUID::null;
+
+ gAgentWearables.notifyLoadingStarted();
+
+ // First, make a folder in the My Outfits directory.
+ const LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+ LLUUID folder_id = gInventory.createNewCategory(
+ parent_id,
+ LLFolderType::FT_OUTFIT,
+ new_folder_name);
+
+ updateClothingOrderingInfo();
+
+ LLPointer<LLInventoryCallback> cb = new LLShowCreatedOutfit(folder_id,show_panel);
+ shallowCopyCategoryContents(getCOF(),folder_id, cb);
+ createBaseOutfitLink(folder_id, cb);
+
+ dumpCat(folder_id,"COF, new outfit");
+
+ return folder_id;
+}
+
+void LLAppearanceMgr::wearBaseOutfit()
+{
+ const LLUUID& base_outfit_id = getBaseOutfitUUID();
+ if (base_outfit_id.isNull()) return;
+
+ updateCOF(base_outfit_id);
+}
+
+void LLAppearanceMgr::removeItemFromAvatar(const LLUUID& id_to_remove)
+{
+ LLViewerInventoryItem * item_to_remove = gInventory.getItem(id_to_remove);
+ if (!item_to_remove) return;
+
+ switch (item_to_remove->getType())
+ {
+ case LLAssetType::AT_CLOTHING:
+ if (get_is_item_worn(id_to_remove))
+ {
+ //*TODO move here the exact removing code from LLWearableBridge::removeItemFromAvatar in the future
+ LLWearableBridge::removeItemFromAvatar(item_to_remove);
+ }
+ break;
+ case LLAssetType::AT_OBJECT:
+ gMessageSystem->newMessageFast(_PREHASH_DetachAttachmentIntoInv);
+ gMessageSystem->nextBlockFast(_PREHASH_ObjectData);
+ gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ gMessageSystem->addUUIDFast(_PREHASH_ItemID, item_to_remove->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(item_to_remove->getLinkedUUID());
+ if (found_obj)
+ {
+ LLSelectMgr::getInstance()->remove(found_obj);
+ };
+ }
+ default: break;
+ }
+}
+
+bool LLAppearanceMgr::moveWearable(LLViewerInventoryItem* item, bool closer_to_body)
+{
+ if (!item || !item->isWearableType()) return false;
+ if (item->getType() != LLAssetType::AT_CLOTHING) return false;
+ if (!gInventory.isObjectDescendentOf(item->getUUID(), getCOF())) return false;
+
+ LLInventoryModel::cat_array_t cats;
+ LLInventoryModel::item_array_t items;
+ LLFindWearablesOfType filter_wearables_of_type(item->getWearableType());
+ gInventory.collectDescendentsIf(getCOF(), cats, items, true, filter_wearables_of_type);
+ if (items.empty()) return false;
+
+ // We assume that the items have valid descriptions.
+ std::sort(items.begin(), items.end(), WearablesOrderComparator(item->getWearableType()));
+
+ if (closer_to_body && items.front() == item) return false;
+ if (!closer_to_body && items.back() == item) return false;
+
+ LLInventoryModel::item_array_t::iterator it = std::find(items.begin(), items.end(), item);
+ if (items.end() == it) return false;
+
+
+ //swapping descriptions
+ closer_to_body ? --it : ++it;
+ LLViewerInventoryItem* swap_item = *it;
+ if (!swap_item) return false;
+ std::string tmp = swap_item->LLInventoryItem::getDescription();
+ swap_item->setDescription(item->LLInventoryItem::getDescription());
+ item->setDescription(tmp);
+
+
+ //items need to be updated on a dataserver
+ item->setComplete(TRUE);
+ item->updateServer(FALSE);
+ gInventory.updateItem(item);
+
+ swap_item->setComplete(TRUE);
+ swap_item->updateServer(FALSE);
+ gInventory.updateItem(swap_item);
+
+ //to cause appearance of the agent to be updated
+ bool result = false;
+ if (result = gAgentWearables.moveWearable(item, closer_to_body))
+ {
+ gAgentAvatarp->wearableUpdated(item->getWearableType(), FALSE);
+ }
+
+ setOutfitDirty(true);
+
+ //*TODO do we need to notify observers here in such a way?
+ gInventory.notifyObservers();
+
+ return result;
+}
+
+//static
+void LLAppearanceMgr::sortItemsByActualDescription(LLInventoryModel::item_array_t& items)
+{
+ if (items.size() < 2) return;
+
+ std::sort(items.begin(), items.end(), sort_by_description);
}
//#define DUMP_CAT_VERBOSE
-void LLAppearanceManager::dumpCat(const LLUUID& cat_id, const std::string& msg)
+void LLAppearanceMgr::dumpCat(const LLUUID& cat_id, const std::string& msg)
{
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
@@ -1254,7 +2483,7 @@ void LLAppearanceManager::dumpCat(const LLUUID& cat_id, const std::string& msg)
llinfos << msg << " count " << items.count() << llendl;
}
-void LLAppearanceManager::dumpItemArray(const LLInventoryModel::item_array_t& items,
+void LLAppearanceMgr::dumpItemArray(const LLInventoryModel::item_array_t& items,
const std::string& msg)
{
llinfos << msg << llendl;
@@ -1266,22 +2495,31 @@ void LLAppearanceManager::dumpItemArray(const LLInventoryModel::item_array_t& it
llinfos << llendl;
}
-LLAppearanceManager::LLAppearanceManager():
+LLAppearanceMgr::LLAppearanceMgr():
mAttachmentInvLinkEnabled(false),
mOutfitIsDirty(false)
{
+ LLOutfitObserver& outfit_observer = LLOutfitObserver::instance();
+
+ // unlock outfit on save operation completed
+ outfit_observer.addCOFSavedCallback(boost::bind(
+ &LLAppearanceMgr::setOutfitLocked, this, false));
+
+ mUnlockOutfitTimer.reset(new LLOutfitUnLockTimer(gSavedSettings.getS32(
+ "OutfitOperationsTimeout")));
}
-LLAppearanceManager::~LLAppearanceManager()
+LLAppearanceMgr::~LLAppearanceMgr()
{
}
-void LLAppearanceManager::setAttachmentInvLinkEnable(bool val)
+void LLAppearanceMgr::setAttachmentInvLinkEnable(bool val)
{
llinfos << "setAttachmentInvLinkEnable => " << (int) val << llendl;
mAttachmentInvLinkEnabled = val;
}
+// BAP TODO - mRegisteredAttachments is currently maintained but not used for anything. Consider yanking.
void dumpAttachmentSet(const std::set<LLUUID>& atts, const std::string& msg)
{
llinfos << msg << llendl;
@@ -1299,15 +2537,16 @@ void dumpAttachmentSet(const std::set<LLUUID>& atts, const std::string& msg)
llinfos << llendl;
}
-void LLAppearanceManager::registerAttachment(const LLUUID& item_id)
+void LLAppearanceMgr::registerAttachment(const LLUUID& item_id)
{
mRegisteredAttachments.insert(item_id);
gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
- //dumpAttachmentSet(mRegisteredAttachments,"after register:");
if (mAttachmentInvLinkEnabled)
{
- LLAppearanceManager::addCOFItemLink(item_id, false); // Add COF link for item.
+ // we have to pass do_update = true to call LLAppearanceMgr::updateAppearanceFromCOF.
+ // it will trigger gAgentWariables.notifyLoadingFinished()
+ LLAppearanceMgr::addCOFItemLink(item_id, true); // Add COF link for item.
}
else
{
@@ -1315,17 +2554,14 @@ void LLAppearanceManager::registerAttachment(const LLUUID& item_id)
}
}
-void LLAppearanceManager::unregisterAttachment(const LLUUID& item_id)
+void LLAppearanceMgr::unregisterAttachment(const LLUUID& item_id)
{
mRegisteredAttachments.erase(item_id);
gInventory.addChangedMask(LLInventoryObserver::LABEL, item_id);
- //dumpAttachmentSet(mRegisteredAttachments,"after unregister:");
-
if (mAttachmentInvLinkEnabled)
{
- //LLAppearanceManager::dumpCat(LLAppearanceManager::getCOF(),"Removing attachment link:");
- LLAppearanceManager::removeCOFItemLinks(item_id, false);
+ LLAppearanceMgr::removeCOFItemLinks(item_id, false);
}
else
{
@@ -1333,27 +2569,34 @@ void LLAppearanceManager::unregisterAttachment(const LLUUID& item_id)
}
}
-void LLAppearanceManager::linkRegisteredAttachments()
+void LLAppearanceMgr::linkRegisteredAttachments()
{
for (std::set<LLUUID>::iterator it = mRegisteredAttachments.begin();
it != mRegisteredAttachments.end();
++it)
{
LLUUID item_id = *it;
- addCOFItemLink(item_id, false);
+ addCOFItemLink(item_id, true);
}
mRegisteredAttachments.clear();
}
-BOOL LLAppearanceManager::getIsInCOF(const LLUUID& obj_id) const
+BOOL LLAppearanceMgr::getIsInCOF(const LLUUID& obj_id) const
{
return gInventory.isObjectDescendentOf(obj_id, getCOF());
}
-BOOL LLAppearanceManager::getIsProtectedCOFItem(const LLUUID& obj_id) const
+BOOL LLAppearanceMgr::getIsProtectedCOFItem(const LLUUID& obj_id) const
{
if (!getIsInCOF(obj_id)) return FALSE;
+ // If a non-link somehow ended up in COF, allow deletion.
+ const LLInventoryObject *obj = gInventory.getObject(obj_id);
+ if (obj && !obj->getIsLinkType())
+ {
+ return FALSE;
+ }
+
// For now, don't allow direct deletion from the COF. Instead, force users
// to choose "Detach" or "Take Off".
return TRUE;
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 38d1e01d08..ab4ff1bcfc 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -35,29 +35,56 @@
#include "llsingleton.h"
#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
+#include "llviewerinventory.h"
#include "llcallbacklist.h"
class LLWearable;
class LLWearableHoldingPattern;
class LLInventoryCallback;
+class LLOutfitUnLockTimer;
-class LLAppearanceManager: public LLSingleton<LLAppearanceManager>
+class LLAppearanceMgr: public LLSingleton<LLAppearanceMgr>
{
- friend class LLSingleton<LLAppearanceManager>;
+ friend class LLSingleton<LLAppearanceMgr>;
+ friend class LLOutfitUnLockTimer;
public:
+ typedef std::vector<LLInventoryModel::item_array_t> wearables_by_type_t;
+
void updateAppearanceFromCOF();
bool needToSaveCOF();
void updateCOF(const LLUUID& category, bool append = false);
void wearInventoryCategory(LLInventoryCategory* category, bool copy, bool append);
void wearInventoryCategoryOnAvatar(LLInventoryCategory* category, bool append);
+ void wearCategoryFinal(LLUUID& cat_id, bool copy_items, bool append);
void wearOutfitByName(const std::string& name);
void changeOutfit(bool proceed, const LLUUID& category, bool append);
+ void replaceCurrentOutfit(const LLUUID& new_outfit);
+ void renameOutfit(const LLUUID& outfit_id);
+ void takeOffOutfit(const LLUUID& cat_id);
+ void addCategoryToCurrentOutfit(const LLUUID& cat_id);
- // Copy all items in a category.
+ // Copy all items and the src category itself.
void shallowCopyCategory(const LLUUID& src_id, const LLUUID& dst_id,
LLPointer<LLInventoryCallback> cb);
+ // Return whether this folder contains minimal contents suitable for making a full outfit.
+ BOOL getCanMakeFolderIntoOutfit(const LLUUID& folder_id);
+
+ // Determine whether a given outfit can be removed.
+ bool getCanRemoveOutfit(const LLUUID& outfit_cat_id);
+
+ // Determine whether we're wearing any of the outfit contents (excluding body parts).
+ static bool getCanRemoveFromCOF(const LLUUID& outfit_cat_id);
+
+ // Determine whether we can add anything (but body parts) from the outfit contents to COF.
+ static bool getCanAddToCOF(const LLUUID& outfit_cat_id);
+
+ // Copy all items in a category.
+ void shallowCopyCategoryContents(const LLUUID& src_id, const LLUUID& dst_id,
+ LLPointer<LLInventoryCallback> cb);
+
// Find the Current Outfit folder.
const LLUUID getCOF() const;
@@ -65,6 +92,12 @@ public:
const LLViewerInventoryItem *getBaseOutfitLink();
bool getBaseOutfitName(std::string &name);
+ // find the UUID of the currently worn outfit (Base Outfit)
+ const LLUUID getBaseOutfitUUID();
+
+ // Wear/attach an item (from a user's inventory) on the agent
+ bool wearItemOnAvatar(const LLUUID& item_to_wear, bool do_update = true, bool replace = false);
+
// Update the displayed outfit name in UI.
void updatePanelOutfitName(const std::string& name);
@@ -93,6 +126,7 @@ public:
// Remove COF entries
void removeCOFItemLinks(const LLUUID& item_id, bool do_update = true);
+ void removeCOFLinksOfType(LLWearableType::EType type, bool do_update = true);
// Add COF link to ensemble folder.
void addEnsembleLink(LLInventoryCategory* item, bool do_update = true);
@@ -107,9 +141,40 @@ public:
// should only be necessary to do on initial login.
void updateIsDirty();
+ // Called when self avatar is first fully visible.
+ void onFirstFullyVisible();
+
+ // Create initial outfits from library.
+ void autopopulateOutfits();
+
+ void wearBaseOutfit();
+
+ // Overrides the base outfit with the content from COF
+ // @return false if there is no base outfit
+ bool updateBaseOutfit();
+
+ //Remove clothing or detach an object from the agent (a bodypart cannot be removed)
+ void removeItemFromAvatar(const LLUUID& item_id);
+
+
+ LLUUID makeNewOutfitLinks(const std::string& new_folder_name,bool show_panel = true);
+
+ bool moveWearable(LLViewerInventoryItem* item, bool closer_to_body);
+
+ static void sortItemsByActualDescription(LLInventoryModel::item_array_t& items);
+
+ //Divvy items into arrays by wearable type
+ static void divvyWearablesByType(const LLInventoryModel::item_array_t& items, wearables_by_type_t& items_by_type);
+
+ //Check ordering information on wearables stored in links' descriptions and update if it is invalid
+ // COF is processed if cat_id is not specified
+ void updateClothingOrderingInfo(LLUUID cat_id = LLUUID::null);
+
+ bool isOutfitLocked() { return mOutfitLocked; }
+
protected:
- LLAppearanceManager();
- ~LLAppearanceManager();
+ LLAppearanceMgr();
+ ~LLAppearanceMgr();
private:
@@ -129,10 +194,22 @@ private:
void purgeCategory(const LLUUID& category, bool keep_outfit_links);
void purgeBaseOutfitLink(const LLUUID& category);
+ static void onOutfitRename(const LLSD& notification, const LLSD& response);
+
+ void setOutfitLocked(bool locked);
+
std::set<LLUUID> mRegisteredAttachments;
bool mAttachmentInvLinkEnabled;
bool mOutfitIsDirty;
+ /**
+ * Lock for blocking operations on outfit until server reply or timeout exceed
+ * to avoid unsynchronized outfit state or performing duplicate operations.
+ */
+ bool mOutfitLocked;
+
+ std::auto_ptr<LLOutfitUnLockTimer> mUnlockOutfitTimer;
+
//////////////////////////////////////////////////////////////////////////////////
// Item-specific convenience functions
public:
@@ -142,22 +219,36 @@ public:
BOOL getIsProtectedCOFItem(const LLUUID& obj_id) const;
};
+class LLUpdateAppearanceOnDestroy: public LLInventoryCallback
+{
+public:
+ LLUpdateAppearanceOnDestroy();
+ virtual ~LLUpdateAppearanceOnDestroy();
+ /* virtual */ void fire(const LLUUID& inv_item);
+
+private:
+ U32 mFireCount;
+};
+
+
#define SUPPORT_ENSEMBLES 0
+LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id,const std::string& name);
+
// Shim class and template function to allow arbitrary boost::bind
// expressions to be run as one-time idle callbacks.
template <typename T>
-class OnIdleCallback
+class OnIdleCallbackOneTime
{
public:
- OnIdleCallback(T callable):
+ OnIdleCallbackOneTime(T callable):
mCallable(callable)
{
}
static void onIdle(void *data)
{
gIdleCallbacks.deleteFunction(onIdle, data);
- OnIdleCallback<T>* self = reinterpret_cast<OnIdleCallback<T>*>(data);
+ OnIdleCallbackOneTime<T>* self = reinterpret_cast<OnIdleCallbackOneTime<T>*>(data);
self->call();
delete self;
}
@@ -170,14 +261,15 @@ private:
};
template <typename T>
-void doOnIdle(T callable)
+void doOnIdleOneTime(T callable)
{
- OnIdleCallback<T>* cb_functor = new OnIdleCallback<T>(callable);
- gIdleCallbacks.addFunction(&OnIdleCallback<T>::onIdle,cb_functor);
+ OnIdleCallbackOneTime<T>* cb_functor = new OnIdleCallbackOneTime<T>(callable);
+ gIdleCallbacks.addFunction(&OnIdleCallbackOneTime<T>::onIdle,cb_functor);
}
// Shim class and template function to allow arbitrary boost::bind
// expressions to be run as recurring idle callbacks.
+// Callable should return true when done, false to continue getting called.
template <typename T>
class OnIdleCallbackRepeating
{
@@ -186,7 +278,7 @@ public:
mCallable(callable)
{
}
- // Will keep getting called until the callable returns false.
+ // Will keep getting called until the callable returns true.
static void onIdle(void *data)
{
OnIdleCallbackRepeating<T>* self = reinterpret_cast<OnIdleCallbackRepeating<T>*>(data);
@@ -212,4 +304,108 @@ void doOnIdleRepeating(T callable)
gIdleCallbacks.addFunction(&OnIdleCallbackRepeating<T>::onIdle,cb_functor);
}
+template <class T>
+class CallAfterCategoryFetchStage2: public LLInventoryFetchItemsObserver
+{
+public:
+ CallAfterCategoryFetchStage2(const uuid_vec_t& ids,
+ T callable) :
+ LLInventoryFetchItemsObserver(ids),
+ mCallable(callable)
+ {
+ }
+ ~CallAfterCategoryFetchStage2()
+ {
+ }
+ virtual void done()
+ {
+ llinfos << this << " done with incomplete " << mIncomplete.size()
+ << " complete " << mComplete.size() << " calling callable" << llendl;
+
+ gInventory.removeObserver(this);
+ doOnIdleOneTime(mCallable);
+ delete this;
+ }
+protected:
+ T mCallable;
+};
+
+template <class T>
+class CallAfterCategoryFetchStage1: public LLInventoryFetchDescendentsObserver
+{
+public:
+ CallAfterCategoryFetchStage1(const LLUUID& cat_id, T callable) :
+ LLInventoryFetchDescendentsObserver(cat_id),
+ mCallable(callable)
+ {
+ }
+ ~CallAfterCategoryFetchStage1()
+ {
+ }
+ virtual void done()
+ {
+ // What we do here is get the complete information on the items in
+ // the library, and set up an observer that will wait for that to
+ // happen.
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t item_array;
+ gInventory.collectDescendents(mComplete.front(),
+ cat_array,
+ item_array,
+ LLInventoryModel::EXCLUDE_TRASH);
+ S32 count = item_array.count();
+ if(!count)
+ {
+ llwarns << "Nothing fetched in category " << mComplete.front()
+ << llendl;
+ //dec_busy_count();
+ gInventory.removeObserver(this);
+ delete this;
+ return;
+ }
+
+ llinfos << "stage1 got " << item_array.count() << " items, passing to stage2 " << llendl;
+ uuid_vec_t ids;
+ for(S32 i = 0; i < count; ++i)
+ {
+ ids.push_back(item_array.get(i)->getUUID());
+ }
+
+ gInventory.removeObserver(this);
+
+ // do the fetch
+ CallAfterCategoryFetchStage2<T> *stage2 = new CallAfterCategoryFetchStage2<T>(ids, mCallable);
+ stage2->startFetch();
+ if(stage2->isFinished())
+ {
+ // everything is already here - call done.
+ stage2->done();
+ }
+ else
+ {
+ // it's all on it's way - add an observer, and the inventory
+ // will call done for us when everything is here.
+ gInventory.addObserver(stage2);
+ }
+ delete this;
+ }
+protected:
+ T mCallable;
+};
+
+template <class T>
+void callAfterCategoryFetch(const LLUUID& cat_id, T callable)
+{
+ CallAfterCategoryFetchStage1<T> *stage1 = new CallAfterCategoryFetchStage1<T>(cat_id, callable);
+ stage1->startFetch();
+ if (stage1->isFinished())
+ {
+ stage1->done();
+ }
+ else
+ {
+ gInventory.addObserver(stage1);
+ }
+}
+
#endif
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index 2f90885df3..1ed63555b0 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -40,9 +40,11 @@
#include "lluictrlfactory.h"
#include "lltexteditor.h"
#include "llerrorcontrol.h"
+#include "lleventtimer.h"
#include "llviewertexturelist.h"
#include "llgroupmgr.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llagentwearables.h"
#include "llwindow.h"
#include "llviewerstats.h"
@@ -77,6 +79,7 @@
#include "lllocationhistory.h"
#include "llfasttimerview.h"
#include "llvoicechannel.h"
+#include "llvoavatarself.h"
#include "llsidetray.h"
@@ -100,8 +103,8 @@
// Third party library includes
#include <boost/bind.hpp>
+
#if LL_WINDOWS
- #include "llwindebug.h"
# include <share.h> // For _SH_DENYWR in initMarkerFile
#else
# include <sys/file.h> // For initMarkerFile support
@@ -150,7 +153,7 @@
#include "llworld.h"
#include "llhudeffecttrail.h"
#include "llvectorperfoptions.h"
-#include "llurlsimstring.h"
+#include "llslurl.h"
#include "llwatchdog.h"
// Included so that constants/settings might be initialized
@@ -190,6 +193,10 @@
#include "llparcel.h"
#include "llavatariconctrl.h"
+// Include for security api initialization
+#include "llsecapi.h"
+#include "llmachineid.h"
+
// *FIX: These extern globals should be cleaned up.
// The globals either represent state/config/resource-storage of either
// this app, or another 'component' of the viewer. App globals should be
@@ -324,10 +331,6 @@ const char *VFS_INDEX_FILE_BASE = "index.db2.x.";
static std::string gWindowTitle;
-std::string gLoginPage;
-std::vector<std::string> gLoginURIs;
-static std::string gHelperURI;
-
LLAppViewer::LLUpdaterInfo *LLAppViewer::sUpdaterInfo = NULL ;
void idle_afk_check()
@@ -354,7 +357,7 @@ void request_initial_instant_messages()
if (!requested
&& gMessageSystem
&& LLMuteList::getInstance()->isLoaded()
- && gAgent.getAvatarObject())
+ && isAgentAvatarValid())
{
// Auto-accepted inventory items may require the avatar object
// to build a correct name. Likewise, inventory offers from
@@ -409,7 +412,7 @@ static void settings_to_globals()
LLVolumeImplFlexible::sUpdateFactor = gSavedSettings.getF32("RenderFlexTimeFactor");
LLVOTree::sTreeFactor = gSavedSettings.getF32("RenderTreeLODFactor");
LLVOAvatar::sLODFactor = gSavedSettings.getF32("RenderAvatarLODFactor");
- LLVOAvatar::sMaxVisible = gSavedSettings.getS32("RenderAvatarMaxVisible");
+ LLVOAvatar::sMaxVisible = (U32)gSavedSettings.getS32("RenderAvatarMaxVisible");
LLVOAvatar::sVisibleInFirstPerson = gSavedSettings.getBOOL("FirstPersonAvatarVisible");
// clamp auto-open time to some minimum usable value
LLFolderView::sAutoOpenTime = llmax(0.25f, gSavedSettings.getF32("FolderAutoOpenDelay"));
@@ -504,35 +507,6 @@ public:
}
};
-void LLAppViewer::initGridChoice()
-{
- // Load up the initial grid choice from:
- // - hard coded defaults...
- // - command line settings...
- // - if dev build, persisted settings...
-
- // Set the "grid choice", this is specified by command line.
- std::string grid_choice = gSavedSettings.getString("CmdLineGridChoice");
- LLViewerLogin::getInstance()->setGridChoice(grid_choice);
-
- // Load last server choice by default
- // ignored if the command line grid choice has been set
- if(grid_choice.empty())
- {
- S32 server = gSavedSettings.getS32("ServerChoice");
- server = llclamp(server, 0, (S32)GRID_INFO_COUNT - 1);
- if(server == GRID_INFO_OTHER)
- {
- std::string custom_server = gSavedSettings.getString("CustomServer");
- LLViewerLogin::getInstance()->setGridChoice(custom_server);
- }
- else if(server != (S32)GRID_INFO_NONE)
- {
- LLViewerLogin::getInstance()->setGridChoice((EGridInfo)server);
- }
- }
-}
-
//virtual
bool LLAppViewer::initSLURLHandler()
{
@@ -625,6 +599,11 @@ bool LLAppViewer::init()
if (!initConfiguration())
return false;
+ // write Google Breakpad minidump files to our log directory
+ std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "");
+ logdir += gDirUtilp->getDirDelimiter();
+ setMiniDumpDir(logdir);
+
// Although initLogging() is the right place to mess with
// setFatalFunction(), we can't query gSavedSettings until after
// initConfiguration().
@@ -642,9 +621,9 @@ bool LLAppViewer::init()
// *NOTE:Mani - LLCurl::initClass is not thread safe.
// Called before threads are created.
LLCurl::initClass();
+ LLMachineID::init();
initThreads();
-
writeSystemInfo();
// Build a string representing the current version number.
@@ -701,9 +680,9 @@ bool LLAppViewer::init()
settings_map["account"] = &gSavedPerAccountSettings;
LLUI::initClass(settings_map,
- LLUIImageList::getInstance(),
- ui_audio_callback,
- &LLUI::sGLScaleFactor);
+ LLUIImageList::getInstance(),
+ ui_audio_callback,
+ &LLUI::sGLScaleFactor);
// Setup paths and LLTrans after LLUI::initClass has been called
LLUI::setupPaths();
@@ -774,10 +753,6 @@ bool LLAppViewer::init()
return false;
}
- // Always fetch the Ethernet MAC address, needed both for login
- // and password load.
- LLUUID::getNodeID(gMACAddress);
-
// Prepare for out-of-memory situations, during which we will crash on
// purpose and save a dump.
#if LL_WINDOWS && LL_RELEASE_FOR_DOWNLOAD && LL_USE_SMARTHEAP
@@ -859,7 +834,7 @@ bool LLAppViewer::init()
minSpecs += "\n";
unsupported = true;
}
- if(gSysCPU.getMhz() < minCPU)
+ if(gSysCPU.getMHz() < minCPU)
{
minSpecs += LLNotifications::instance().getGlobalString("UnsupportedCPU");
minSpecs += "\n";
@@ -889,6 +864,7 @@ bool LLAppViewer::init()
}
}
+
// save the graphics card
gDebugInfo["GraphicsCard"] = LLFeatureManager::getInstance()->getGPUString();
@@ -899,6 +875,17 @@ bool LLAppViewer::init()
gSimFrames = (F32)gFrameCount;
LLViewerJoystick::getInstance()->init(false);
+
+ try {
+ initializeSecHandler();
+ }
+ catch (LLProtectedDataException ex)
+ {
+ LLNotificationsUtil::add("CorruptedProtectedDataStore");
+ }
+ LLHTTPClient::setCertVerifyCallback(secapiSSLCertVerifyCallback);
+
+
gGLActive = FALSE;
if (gSavedSettings.getBOOL("QAMode") && gSavedSettings.getS32("QAModeEventHostPort") > 0)
{
@@ -906,7 +893,22 @@ bool LLAppViewer::init()
}
LLViewerMedia::initClass();
-
+
+ //EXT-7013 - On windows for some locale (Japanese) standard
+ //datetime formatting functions didn't support some parameters such as "weekday".
+ std::string language = LLControlGroup::getInstance(sGlobalSettingsName)->getString("Language");
+ if(language == "ja")
+ {
+ LLStringOps::setupWeekDaysNames(LLTrans::getString("dateTimeWeekdaysNames"));
+ LLStringOps::setupWeekDaysShortNames(LLTrans::getString("dateTimeWeekdaysShortNames"));
+ LLStringOps::setupMonthNames(LLTrans::getString("dateTimeMonthNames"));
+ LLStringOps::setupMonthShortNames(LLTrans::getString("dateTimeMonthShortNames"));
+ LLStringOps::setupDayFormat(LLTrans::getString("dateTimeDayFormat"));
+
+ LLStringOps::sAM = LLTrans::getString("dateTimeAM");
+ LLStringOps::sPM = LLTrans::getString("dateTimePM");
+ }
+
return true;
}
@@ -933,13 +935,11 @@ bool LLAppViewer::mainLoop()
gServicePump = new LLPumpIO(gAPRPoolp);
LLHTTPClient::setPump(*gServicePump);
LLCurl::setCAFile(gDirUtilp->getCAFile());
- LLCurl::setSSLVerify(! gSavedSettings.getBOOL("NoVerifySSLCert"));
-
+
// Note: this is where gLocalSpeakerMgr and gActiveSpeakerMgr used to be instantiated.
LLVoiceChannel::initClass();
- LLVoiceClient::init(gServicePump);
-
+ LLVoiceClient::getInstance()->init(gServicePump);
LLTimer frameTimer,idleTimer;
LLTimer debugTime;
LLViewerJoystick* joystick(LLViewerJoystick::getInstance());
@@ -1106,12 +1106,15 @@ bool LLAppViewer::mainLoop()
ms_sleep(500);
}
-
+ static const F64 FRAME_SLOW_THRESHOLD = 0.5; //2 frames per seconds
const F64 min_frame_time = 0.0; //(.0333 - .0010); // max video frame rate = 30 fps
const F64 min_idle_time = 0.0; //(.0010); // min idle time = 1 ms
const F64 max_idle_time = run_multiple_threads ? min_idle_time : llmin(.005*10.0*gFrameTimeSeconds, 0.005); // 5 ms a second
idleTimer.reset();
- while(1)
+ bool is_slow = (frameTimer.getElapsedTimeF64() > FRAME_SLOW_THRESHOLD) ;
+ S32 total_work_pending = 0;
+ S32 total_io_pending = 0;
+ while(!is_slow)//do not unpause threads if the frame rates are very low.
{
S32 work_pending = 0;
S32 io_pending = 0;
@@ -1142,6 +1145,8 @@ bool LLAppViewer::mainLoop()
ms_sleep(llmin(io_pending/100,100)); // give the vfs some time to catch up
}
+ total_work_pending += work_pending ;
+ total_io_pending += io_pending ;
F64 frame_time = frameTimer.getElapsedTimeF64();
F64 idle_time = idleTimer.getElapsedTimeF64();
if (frame_time >= min_frame_time &&
@@ -1151,25 +1156,32 @@ bool LLAppViewer::mainLoop()
break;
}
}
- if ((LLStartUp::getStartupState() >= STATE_CLEANUP) &&
- (frameTimer.getElapsedTimeF64() > FRAME_STALL_THRESHOLD))
- {
- gFrameStalls++;
- }
- frameTimer.reset();
// Prevent the worker threads from running while rendering.
// if (LLThread::processorCount()==1) //pause() should only be required when on a single processor client...
if (run_multiple_threads == FALSE)
{
- LLFastTimer ftm(FTM_PAUSE_THREADS);
-
- LLAppViewer::getTextureCache()->pause();
- LLAppViewer::getImageDecodeThread()->pause();
- // LLAppViewer::getTextureFetch()->pause(); // Don't pause the fetch (IO) thread
+ //LLFastTimer ftm(FTM_PAUSE_THREADS); //not necessary.
+
+ if(!total_work_pending) //pause texture fetching threads if nothing to process.
+ {
+ LLAppViewer::getTextureCache()->pause();
+ LLAppViewer::getImageDecodeThread()->pause();
+ LLAppViewer::getTextureFetch()->pause();
+ }
+ if(!total_io_pending) //pause file threads if nothing to process.
+ {
+ LLVFSThread::sLocal->pause();
+ LLLFSThread::sLocal->pause();
+ }
+ }
+
+ if ((LLStartUp::getStartupState() >= STATE_CLEANUP) &&
+ (frameTimer.getElapsedTimeF64() > FRAME_STALL_THRESHOLD))
+ {
+ gFrameStalls++;
}
- //LLVFSThread::sLocal->pause(); // Prevent the VFS thread from running while rendering.
- //LLLFSThread::sLocal->pause(); // Prevent the LFS thread from running while rendering.
+ frameTimer.reset();
resumeMainloopTimeout();
@@ -1232,6 +1244,14 @@ bool LLAppViewer::cleanup()
// workaround for DEV-35406 crash on shutdown
LLEventPumps::instance().reset();
+ // remove any old breakpad minidump files from the log directory
+ if (! isError())
+ {
+ std::string logdir = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "");
+ logdir += gDirUtilp->getDirDelimiter();
+ gDirUtilp->deleteFilesInDir(logdir, "*-*-*-*-*.dmp");
+ }
+
// *TODO - generalize this and move DSO wrangling to a helper class -brad
std::set<struct apr_dso_handle_t *>::const_iterator i;
for(i = mPlugins.begin(); i != mPlugins.end(); ++i)
@@ -1258,7 +1278,7 @@ bool LLAppViewer::cleanup()
// to ensure shutdown order
LLMortician::setZealous(TRUE);
- LLVoiceClient::terminate();
+ LLVoiceClient::getInstance()->terminate();
disconnectViewer();
@@ -1353,9 +1373,6 @@ bool LLAppViewer::cleanup()
llinfos << "Cache files removed" << llendflush;
-
- cleanup_menus();
-
// Wait for any pending VFS IO
while (1)
{
@@ -1460,13 +1477,6 @@ bool LLAppViewer::cleanup()
llinfos << "Saving Data" << llendflush;
- // Quitting with "Remember Password" turned off should always stomp your
- // saved password, whether or not you successfully logged in. JC
- if (!gSavedSettings.getBOOL("RememberPassword"))
- {
- LLStartUp::deletePasswordFromDisk();
- }
-
// Store the time of our current logoff
gSavedPerAccountSettings.setU32("LastLogoff", time_corrected());
@@ -1515,9 +1525,14 @@ bool LLAppViewer::cleanup()
LLLocationHistory::getInstance()->save();
LLAvatarIconIDCache::getInstance()->save();
+
+ LLViewerMedia::saveCookieFile();
+
+ // Stop the plugin read thread if it's running.
+ LLPluginProcessParent::setUseReadThread(false);
llinfos << "Shutting down Threads" << llendflush;
-
+
// Let threads finish
LLTimer idleTimer;
idleTimer.reset();
@@ -1531,19 +1546,26 @@ bool LLAppViewer::cleanup()
pending += LLVFSThread::updateClass(0);
pending += LLLFSThread::updateClass(0);
F64 idle_time = idleTimer.getElapsedTimeF64();
- if (!pending || idle_time >= max_idle_time)
+ if(!pending)
+ {
+ break ; //done
+ }
+ else if(idle_time >= max_idle_time)
{
llwarns << "Quitting with pending background tasks." << llendl;
break;
}
}
-
+
// Delete workers first
// shotdown all worker threads before deleting them in case of co-dependencies
sTextureCache->shutdown();
sTextureFetch->shutdown();
sImageDecodeThread->shutdown();
+ sTextureFetch->shutDownTextureCacheThread() ;
+ sTextureFetch->shutDownImageDecodeThread() ;
+
delete sTextureCache;
sTextureCache = NULL;
delete sTextureFetch;
@@ -1628,7 +1650,7 @@ bool LLAppViewer::cleanup()
// HACK: Attempt to wait until the screen res. switch is complete.
ms_sleep(1000);
- LLWeb::loadURLExternal( gLaunchFileOnQuit );
+ LLWeb::loadURLExternal( gLaunchFileOnQuit, false );
llinfos << "File launched." << llendflush;
}
@@ -1681,7 +1703,7 @@ bool LLAppViewer::initThreads()
// Image decoding
LLAppViewer::sImageDecodeThread = new LLImageDecodeThread(enable_threads && true);
LLAppViewer::sTextureCache = new LLTextureCache(enable_threads && true);
- LLAppViewer::sTextureFetch = new LLTextureFetch(LLAppViewer::getTextureCache(), sImageDecodeThread, enable_threads && false);
+ LLAppViewer::sTextureFetch = new LLTextureFetch(LLAppViewer::getTextureCache(), sImageDecodeThread, enable_threads && true);
LLImage::initClass();
if (LLFastTimer::sLog || LLFastTimer::sMetricLog)
@@ -1810,7 +1832,7 @@ bool LLAppViewer::loadSettingsFromDirectory(const std::string& location_key,
}
else
{
- llwarns << "Cannot load " << full_settings_path << " - No settings found." << llendl;
+ llinfos << "Cannot load " << full_settings_path << " - No settings found." << llendl;
}
}
else
@@ -1935,7 +1957,6 @@ bool LLAppViewer::initConfiguration()
// LLFirstUse::addConfigVariable("FirstSandbox");
// LLFirstUse::addConfigVariable("FirstFlexible");
// LLFirstUse::addConfigVariable("FirstDebugMenus");
-// LLFirstUse::addConfigVariable("FirstStreamingMedia");
// LLFirstUse::addConfigVariable("FirstSculptedPrim");
// LLFirstUse::addConfigVariable("FirstVoice");
// LLFirstUse::addConfigVariable("FirstMedia");
@@ -2027,7 +2048,6 @@ bool LLAppViewer::initConfiguration()
}
}
- initGridChoice();
// If we have specified crash on startup, set the global so we'll trigger the crash at the right time
if(clp.hasOption("crashonstartup"))
@@ -2121,30 +2141,17 @@ bool LLAppViewer::initConfiguration()
// injection and steal passwords. Phoenix. SL-55321
if(clp.hasOption("url"))
{
- std::string slurl = clp.getOption("url")[0];
- if (LLSLURL::isSLURLCommand(slurl))
- {
- LLStartUp::sSLURLCommand = slurl;
- }
- else
- {
- LLURLSimString::setString(slurl);
- }
+ LLStartUp::setStartSLURL(LLSLURL(clp.getOption("url")[0]));
+ if(LLStartUp::getStartSLURL().getType() == LLSLURL::LOCATION)
+ {
+ LLGridManager::getInstance()->setGridChoice(LLStartUp::getStartSLURL().getGrid());
+
+ }
}
else if(clp.hasOption("slurl"))
{
- std::string slurl = clp.getOption("slurl")[0];
- if(LLSLURL::isSLURL(slurl))
- {
- if (LLSLURL::isSLURLCommand(slurl))
- {
- LLStartUp::sSLURLCommand = slurl;
- }
- else
- {
- LLURLSimString::setString(slurl);
- }
- }
+ LLSLURL start_slurl(clp.getOption("slurl")[0]);
+ LLStartUp::setStartSLURL(start_slurl);
}
const LLControlVariable* skinfolder = gSavedSettings.getControl("SkinCurrent");
@@ -2194,10 +2201,12 @@ bool LLAppViewer::initConfiguration()
// Display splash screen. Must be after above check for previous
// crash as this dialog is always frontmost.
- std::ostringstream splash_msg;
- splash_msg << "Loading " << LLTrans::getString("SECOND_LIFE") << "...";
+ std::string splash_msg;
+ LLStringUtil::format_map_t args;
+ args["[APP_NAME]"] = LLTrans::getString("SECOND_LIFE");
+ splash_msg = LLTrans::getString("StartupLoading", args);
LLSplashScreen::show();
- LLSplashScreen::update(splash_msg.str());
+ LLSplashScreen::update(splash_msg);
//LLVolumeMgr::initClass();
LLVolumeMgr* volume_manager = new LLVolumeMgr();
@@ -2223,18 +2232,10 @@ bool LLAppViewer::initConfiguration()
// don't call anotherInstanceRunning() when doing URL handoff, as
// it relies on checking a marker file which will not work when running
// out of different directories
- std::string slurl;
- if (!LLStartUp::sSLURLCommand.empty())
- {
- slurl = LLStartUp::sSLURLCommand;
- }
- else if (LLURLSimString::parse())
- {
- slurl = LLURLSimString::getURL();
- }
- if (!slurl.empty())
+
+ if (LLStartUp::getStartSLURL().isValid())
{
- if (sendURLToOtherInstance(slurl))
+ if (sendURLToOtherInstance(LLStartUp::getStartSLURL().getSLURLString()))
{
// successfully handed off URL to existing instance, exit
return false;
@@ -2290,9 +2291,9 @@ bool LLAppViewer::initConfiguration()
// need to do this here - need to have initialized global settings first
std::string nextLoginLocation = gSavedSettings.getString( "NextLoginLocation" );
- if ( nextLoginLocation.length() )
+ if ( !nextLoginLocation.empty() )
{
- LLURLSimString::setString( nextLoginLocation );
+ LLStartUp::setStartSLURL(LLSLURL(nextLoginLocation));
};
gLastRunVersion = gSavedSettings.getString("LastRunVersion");
@@ -2307,17 +2308,7 @@ void LLAppViewer::checkForCrash(void)
{
#if LL_SEND_CRASH_REPORTS
- //*NOTE:Mani The current state of the crash handler has the MacOSX
- // sending all crash reports as freezes, in order to let
- // the MacOSX CrashRepoter generate stacks before spawning the
- // SL crash logger.
- // The Linux and Windows clients generate their own stacks and
- // spawn the SL crash logger immediately. This may change in the future.
-#if LL_DARWIN
- if(gLastExecEvent != LAST_EXEC_NORMAL)
-#else
if (gLastExecEvent == LAST_EXEC_FROZE)
-#endif
{
llinfos << "Last execution froze, requesting to send crash report." << llendl;
//
@@ -2365,9 +2356,6 @@ bool LLAppViewer::initWindow()
// store setting in a global for easy access and modification
gNoRender = gSavedSettings.getBOOL("DisableRendering");
- // Hide the splash screen
- LLSplashScreen::hide();
-
// always start windowed
BOOL ignorePixelDepth = gSavedSettings.getBOOL("IgnorePixelDepth");
gViewerWindow = new LLViewerWindow(gWindowTitle,
@@ -2378,16 +2366,9 @@ bool LLAppViewer::initWindow()
LLNotificationsUI::LLNotificationManager::getInstance();
- if (gSavedSettings.getBOOL("WindowFullScreen"))
- {
- // request to go full screen... which will be delayed until login
- gViewerWindow->toggleFullscreen(FALSE);
- }
-
if (gSavedSettings.getBOOL("WindowMaximized"))
{
gViewerWindow->mWindow->maximize();
- gViewerWindow->getWindow()->setNativeAspectRatio(gSavedSettings.getF32("FullScreenAspectRatio"));
}
if (!gNoRender)
@@ -2461,11 +2442,10 @@ void LLAppViewer::cleanupSavedSettings()
}
}
- // save window position if not fullscreen
+ // save window position if not maximized
// as we don't track it in callbacks
- BOOL fullscreen = gViewerWindow->mWindow->getFullscreen();
BOOL maximized = gViewerWindow->mWindow->getMaximized();
- if (!fullscreen && !maximized)
+ if (!maximized)
{
LLCoordScreen window_pos;
@@ -2479,9 +2459,9 @@ void LLAppViewer::cleanupSavedSettings()
gSavedSettings.setF32("MapScale", LLWorldMapView::sMapScale );
// Some things are cached in LLAgent.
- if (gAgent.mInitialized)
+ if (gAgent.isInitialized())
{
- gSavedSettings.setF32("RenderFarClip", gAgent.mDrawDistance);
+ gSavedSettings.setF32("RenderFarClip", gAgentCamera.mDrawDistance);
}
}
@@ -2505,7 +2485,7 @@ void LLAppViewer::writeSystemInfo()
gDebugInfo["CPUInfo"]["CPUString"] = gSysCPU.getCPUString();
gDebugInfo["CPUInfo"]["CPUFamily"] = gSysCPU.getFamily();
- gDebugInfo["CPUInfo"]["CPUMhz"] = gSysCPU.getMhz();
+ gDebugInfo["CPUInfo"]["CPUMhz"] = (S32)gSysCPU.getMHz();
gDebugInfo["CPUInfo"]["CPUAltivec"] = gSysCPU.hasAltivec();
gDebugInfo["CPUInfo"]["CPUSSE"] = gSysCPU.hasSSE();
gDebugInfo["CPUInfo"]["CPUSSE2"] = gSysCPU.hasSSE2();
@@ -2516,9 +2496,9 @@ void LLAppViewer::writeSystemInfo()
// The user is not logged on yet, but record the current grid choice login url
// which may have been the intended grid. This can b
- gDebugInfo["GridName"] = LLViewerLogin::getInstance()->getGridLabel();
+ gDebugInfo["GridName"] = LLGridManager::getInstance()->getGridLabel();
- // *FIX:Mani - move this ddown in llappviewerwin32
+ // *FIX:Mani - move this down in llappviewerwin32
#ifdef LL_WINDOWS
DWORD thread_id = GetCurrentThreadId();
gDebugInfo["MainloopThreadID"] = (S32)thread_id;
@@ -2530,6 +2510,15 @@ void LLAppViewer::writeSystemInfo()
// If the crash is handled by LLAppViewer::handleViewerCrash, ie not a freeze,
// then the value of "CrashNotHandled" will be set to true.
gDebugInfo["CrashNotHandled"] = (LLSD::Boolean)true;
+
+ // Insert crash host url (url to post crash log to) if configured. This insures
+ // that the crash report will go to the proper location in the case of a
+ // prior freeze.
+ std::string crashHostUrl = gSavedSettings.get<std::string>("CrashHostUrl");
+ if(crashHostUrl != "")
+ {
+ gDebugInfo["CrashHostUrl"] = crashHostUrl;
+ }
// Dump some debugging info
LL_INFOS("SystemInfo") << LLTrans::getString("APP_NAME")
@@ -2551,17 +2540,12 @@ void LLAppViewer::writeSystemInfo()
writeDebugInfo(); // Save out debug_info.log early, in case of crash.
}
-void LLAppViewer::handleSyncViewerCrash()
-{
- LLAppViewer* pApp = LLAppViewer::instance();
- // Call to pure virtual, handled by platform specific llappviewer instance.
- pApp->handleSyncCrashTrace();
-}
-
void LLAppViewer::handleViewerCrash()
{
llinfos << "Handle viewer crash entry." << llendl;
+ llinfos << "Last render pool type: " << LLPipeline::sCurRenderPoolType << llendl ;
+
//print out recorded call stacks if there are any.
LLError::LLCallStacks::print();
@@ -2579,9 +2563,13 @@ void LLAppViewer::handleViewerCrash()
return;
}
pApp->mReportedCrash = TRUE;
-
- // Make sure the watchdog gets turned off...
-// pApp->destroyMainloopTimeout(); // SJB: Bah. This causes the crash handler to hang, not sure why.
+
+ // Insert crash host url (url to post crash log to) if configured.
+ std::string crashHostUrl = gSavedSettings.get<std::string>("CrashHostUrl");
+ if(crashHostUrl != "")
+ {
+ gDebugInfo["CrashHostUrl"] = crashHostUrl;
+ }
//We already do this in writeSystemInfo(), but we do it again here to make /sure/ we have a version
//to check against no matter what
@@ -2611,8 +2599,14 @@ void LLAppViewer::handleViewerCrash()
gDebugInfo["StartupState"] = LLStartUp::getStartupStateString();
gDebugInfo["RAMInfo"]["Allocated"] = (LLSD::Integer) LLMemory::getCurrentRSS() >> 10;
gDebugInfo["FirstLogin"] = (LLSD::Boolean) gAgent.isFirstLogin();
- gDebugInfo["HadFirstSuccessfulLogin"] = gSavedSettings.getBOOL("HadFirstSuccessfulLogin");
+ gDebugInfo["FirstRunThisInstall"] = gSavedSettings.getBOOL("FirstRunThisInstall");
+ char *minidump_file = pApp->getMiniDumpFilename();
+ if(minidump_file && minidump_file[0] != 0)
+ {
+ gDebugInfo["MinidumpPath"] = minidump_file;
+ }
+
if(gLogoutInProgress)
{
gDebugInfo["LastExecEvent"] = LAST_EXEC_LOGOUT_CRASH;
@@ -2690,10 +2684,6 @@ void LLAppViewer::handleViewerCrash()
LLError::logToFile("");
-// On Mac, we send the report on the next run, since we need macs crash report
-// for a stack trace, so we have to let it the app fail.
-#if !LL_DARWIN
-
// Remove the marker file, since otherwise we'll spawn a process that'll keep it locked
if(gDebugInfo["LastExecEvent"].asInteger() == LAST_EXEC_LOGOUT_CRASH)
{
@@ -2706,8 +2696,6 @@ void LLAppViewer::handleViewerCrash()
// Call to pure virtual, handled by platform specific llappviewer instance.
pApp->handleCrashReporting();
-
-#endif //!LL_DARWIN
return;
}
@@ -2997,41 +2985,97 @@ void LLAppViewer::migrateCacheDirectory()
#endif // LL_WINDOWS || LL_DARWIN
}
-bool LLAppViewer::initCache()
+//static
+S32 LLAppViewer::getCacheVersion()
{
- mPurgeCache = false;
- // Purge cache if user requested it
- if (gSavedSettings.getBOOL("PurgeCacheOnStartup") ||
- gSavedSettings.getBOOL("PurgeCacheOnNextStartup"))
+ static const S32 cache_version = 7;
+
+ return cache_version ;
+}
+
+void dumpVFSCaches()
+{
+ llinfos << "======= Static VFS ========" << llendl;
+ gStaticVFS->listFiles();
+#if LL_WINDOWS
+ llinfos << "======= Dumping static VFS to StaticVFSDump ========" << llendl;
+ WCHAR w_str[MAX_PATH];
+ GetCurrentDirectory(MAX_PATH, w_str);
+ S32 res = LLFile::mkdir("StaticVFSDump");
+ if (res == -1)
{
- gSavedSettings.setBOOL("PurgeCacheOnNextStartup", false);
- mPurgeCache = true;
+ if (errno != EEXIST)
+ {
+ llwarns << "Couldn't create dir StaticVFSDump" << llendl;
+ }
}
- // Purge cache if it belongs to an old version
- else
+ SetCurrentDirectory(utf8str_to_utf16str("StaticVFSDump").c_str());
+ gStaticVFS->dumpFiles();
+ SetCurrentDirectory(w_str);
+#endif
+
+ llinfos << "========= Dynamic VFS ====" << llendl;
+ gVFS->listFiles();
+#if LL_WINDOWS
+ llinfos << "========= Dumping dynamic VFS to VFSDump ====" << llendl;
+ res = LLFile::mkdir("VFSDump");
+ if (res == -1)
{
- static const S32 cache_version = 5;
- if (gSavedSettings.getS32("LocalCacheVersion") != cache_version)
+ if (errno != EEXIST)
{
- mPurgeCache = true;
- gSavedSettings.setS32("LocalCacheVersion", cache_version);
+ llwarns << "Couldn't create dir VFSDump" << llendl;
}
}
-
- // We have moved the location of the cache directory over time.
- migrateCacheDirectory();
+ SetCurrentDirectory(utf8str_to_utf16str("VFSDump").c_str());
+ gVFS->dumpFiles();
+ SetCurrentDirectory(w_str);
+#endif
+}
+bool LLAppViewer::initCache()
+{
+ mPurgeCache = false;
+ BOOL disable_texture_cache = FALSE ;
+ BOOL read_only = mSecondInstance ? TRUE : FALSE;
+ LLAppViewer::getTextureCache()->setReadOnly(read_only) ;
- // Setup and verify the cache location
- std::string cache_location = gSavedSettings.getString("CacheLocation");
- std::string new_cache_location = gSavedSettings.getString("NewCacheLocation");
- if (new_cache_location != cache_location)
+ if (gSavedSettings.getS32("LocalCacheVersion") != LLAppViewer::getCacheVersion())
{
- gDirUtilp->setCacheDir(gSavedSettings.getString("CacheLocation"));
- purgeCache(); // purge old cache
- gSavedSettings.setString("CacheLocation", new_cache_location);
- gSavedSettings.setString("CacheLocationTopFolder", gDirUtilp->getBaseFileName(new_cache_location));
+ if(read_only)
+ {
+ disable_texture_cache = TRUE ; //if the cache version of this viewer is different from the running one, this viewer can not use the texture cache.
+ }
+ else
+ {
+ mPurgeCache = true; // Purge cache if the version number is different.
+ gSavedSettings.setS32("LocalCacheVersion", LLAppViewer::getCacheVersion());
+ }
}
+
+ if(!read_only)
+ {
+ // Purge cache if user requested it
+ if (gSavedSettings.getBOOL("PurgeCacheOnStartup") ||
+ gSavedSettings.getBOOL("PurgeCacheOnNextStartup"))
+ {
+ gSavedSettings.setBOOL("PurgeCacheOnNextStartup", false);
+ mPurgeCache = true;
+ }
+ // We have moved the location of the cache directory over time.
+ migrateCacheDirectory();
+
+ // Setup and verify the cache location
+ std::string cache_location = gSavedSettings.getString("CacheLocation");
+ std::string new_cache_location = gSavedSettings.getString("NewCacheLocation");
+ if (new_cache_location != cache_location)
+ {
+ gDirUtilp->setCacheDir(gSavedSettings.getString("CacheLocation"));
+ purgeCache(); // purge old cache
+ gSavedSettings.setString("CacheLocation", new_cache_location);
+ gSavedSettings.setString("CacheLocationTopFolder", gDirUtilp->getBaseFileName(new_cache_location));
+ }
+ }
+
if (!gDirUtilp->setCacheDir(gSavedSettings.getString("CacheLocation")))
{
LL_WARNS("AppCache") << "Unable to set cache location" << LL_ENDL;
@@ -3039,26 +3083,25 @@ bool LLAppViewer::initCache()
gSavedSettings.setString("CacheLocationTopFolder", "");
}
- if (mPurgeCache)
+ if (mPurgeCache && !read_only)
{
- LLSplashScreen::update("Clearing cache...");
+ LLSplashScreen::update(LLTrans::getString("StartupClearingCache"));
purgeCache();
}
- LLSplashScreen::update("Initializing Texture Cache...");
+ LLSplashScreen::update(LLTrans::getString("StartupInitializingTextureCache"));
// Init the texture cache
- // Allocate 80% of the cache size for textures
- BOOL read_only = mSecondInstance ? TRUE : FALSE;
+ // Allocate 80% of the cache size for textures
const S32 MB = 1024*1024;
S64 cache_size = (S64)(gSavedSettings.getU32("CacheSize")) * MB;
const S64 MAX_CACHE_SIZE = 1024*MB;
cache_size = llmin(cache_size, MAX_CACHE_SIZE);
S64 texture_cache_size = ((cache_size * 8)/10);
- S64 extra = LLAppViewer::getTextureCache()->initCache(LL_PATH_CACHE, texture_cache_size, read_only);
+ S64 extra = LLAppViewer::getTextureCache()->initCache(LL_PATH_CACHE, texture_cache_size, disable_texture_cache);
texture_cache_size -= extra;
- LLSplashScreen::update("Initializing VFS...");
+ LLSplashScreen::update(LLTrans::getString("StartupInitializingVFS"));
// Init the VFS
S64 vfs_size = cache_size - texture_cache_size;
@@ -3204,6 +3247,14 @@ bool LLAppViewer::initCache()
else
{
LLVFile::initClass();
+
+#ifndef LL_RELEASE_FOR_DOWNLOAD
+ if (gSavedSettings.getBOOL("DumpVFSCaches"))
+ {
+ dumpVFSCaches();
+ }
+#endif
+
return true;
}
}
@@ -3288,13 +3339,6 @@ void LLAppViewer::badNetworkHandler()
mPurgeOnExit = TRUE;
-#if LL_WINDOWS
- // Generates the minidump.
- LLWinDebug::generateCrashStacks(NULL);
-#endif
- LLAppViewer::handleSyncViewerCrash();
- LLAppViewer::handleViewerCrash();
-
std::ostringstream message;
message <<
"The viewer has detected mangled network data indicative\n"
@@ -3307,6 +3351,8 @@ void LLAppViewer::badNetworkHandler()
"If the problem continues, see the Tech Support FAQ at: \n"
"www.secondlife.com/support";
forceDisconnect(message.str());
+
+ LLApp::instance()->writeMiniDump();
}
// This routine may get called more than once during the shutdown process.
@@ -3316,10 +3362,10 @@ void LLAppViewer::saveFinalSnapshot()
{
if (!mSavedFinalSnapshot && !gNoRender)
{
- gSavedSettings.setVector3d("FocusPosOnLogout", gAgent.calcFocusPositionTargetGlobal());
- gSavedSettings.setVector3d("CameraPosOnLogout", gAgent.calcCameraPositionTargetGlobal());
+ gSavedSettings.setVector3d("FocusPosOnLogout", gAgentCamera.calcFocusPositionTargetGlobal());
+ gSavedSettings.setVector3d("CameraPosOnLogout", gAgentCamera.calcCameraPositionTargetGlobal());
gViewerWindow->setCursor(UI_CURSOR_WAIT);
- gAgent.changeCameraToThirdPerson( FALSE ); // don't animate, need immediate switch
+ gAgentCamera.changeCameraToThirdPerson( FALSE ); // don't animate, need immediate switch
gSavedSettings.setBOOL("ShowParcelOwners", FALSE);
idle();
@@ -3599,13 +3645,15 @@ void LLAppViewer::idle()
{
// Handle pending gesture processing
- LLGestureManager::instance().update();
+ static LLFastTimer::DeclareTimer ftm("Agent Position");
+ LLFastTimer t(ftm);
+ LLGestureMgr::instance().update();
gAgent.updateAgentPosition(gFrameDTClamped, yaw, current_mouse.mX, current_mouse.mY);
}
{
- LLFastTimer t(FTM_OBJECTLIST_UPDATE); // Actually "object update"
+ LLFastTimer t(FTM_OBJECTLIST_UPDATE);
if (!(logoutRequestSent() && hasSavedFinalSnapshot()))
{
@@ -3639,6 +3687,8 @@ void LLAppViewer::idle()
//
{
+ static LLFastTimer::DeclareTimer ftm("HUD Effects");
+ LLFastTimer t(ftm);
LLSelectMgr::getInstance()->updateEffects();
LLHUDManager::getInstance()->cleanupEffects();
LLHUDManager::getInstance()->sendEffects();
@@ -3725,7 +3775,7 @@ void LLAppViewer::idle()
LLViewerJoystick::getInstance()->moveObjects();
}
- gAgent.updateCamera();
+ gAgentCamera.updateCamera();
}
// update media focus
@@ -3823,7 +3873,7 @@ void LLAppViewer::idleShutdown()
S32 finished_uploads = total_uploads - pending_uploads;
F32 percent = 100.f * finished_uploads / total_uploads;
gViewerWindow->setProgressPercent(percent);
- gViewerWindow->setProgressString("Saving your settings...");
+ gViewerWindow->setProgressString(LLTrans::getString("SavingSettings"));
return;
}
@@ -3835,7 +3885,7 @@ void LLAppViewer::idleShutdown()
// Wait for a LogoutReply message
gViewerWindow->setShowProgress(TRUE);
gViewerWindow->setProgressPercent(100.f);
- gViewerWindow->setProgressString("Logging out...");
+ gViewerWindow->setProgressString(LLTrans::getString("LoggingOut"));
return;
}
@@ -3863,7 +3913,7 @@ void LLAppViewer::sendLogoutRequest()
gLogoutMaxTime = LOGOUT_REQUEST_TIME;
mLogoutRequestSent = TRUE;
- gVoiceClient->leaveChannel();
+ LLVoiceClient::getInstance()->leaveChannel();
//Set internal status variables and marker files
gLogoutInProgress = TRUE;
@@ -3895,15 +3945,13 @@ void LLAppViewer::sendLogoutRequest()
static F32 CheckMessagesMaxTime = CHECK_MESSAGES_DEFAULT_MAX_TIME;
#endif
-static LLFastTimer::DeclareTimer FTM_IDLE_NETWORK("Network");
+static LLFastTimer::DeclareTimer FTM_IDLE_NETWORK("Idle Network");
void LLAppViewer::idleNetwork()
{
LLMemType mt_in(LLMemType::MTYPE_IDLE_NETWORK);
pingMainloopTimeout("idleNetwork");
- LLError::LLCallStacks::clear() ;
- llpushcallstacks ;
-
+
gObjectList.mNumNewObjects = 0;
S32 total_decoded = 0;
@@ -3913,7 +3961,6 @@ void LLAppViewer::idleNetwork()
// deal with any queued name requests and replies.
gCacheName->processPending();
- llpushcallstacks ;
LLTimer check_message_timer;
// Read all available packets from network
const S64 frame_count = gFrameCount; // U32->S64
@@ -3983,16 +4030,13 @@ void LLAppViewer::idleNetwork()
gPrintMessagesThisFrame = FALSE;
}
}
- llpushcallstacks ;
LLViewerStats::getInstance()->mNumNewObjectsStat.addValue(gObjectList.mNumNewObjects);
// Retransmit unacknowledged packets.
gXferManager->retransmitUnackedPackets();
gAssetStorage->checkForTimeouts();
- llpushcallstacks ;
gViewerThrottle.updateDynamicThrottle();
- llpushcallstacks ;
// Check that the circuit between the viewer and the agent's current
// region is still alive
LLViewerRegion *agent_region = gAgent.getRegion();
@@ -4008,7 +4052,6 @@ void LLAppViewer::idleNetwork()
mAgentRegionLastID = this_region_id;
mAgentRegionLastAlive = this_region_alive;
}
- llpushcallstacks ;
}
void LLAppViewer::disconnectViewer()
@@ -4059,7 +4102,7 @@ void LLAppViewer::disconnectViewer()
LLFloaterInventory::cleanup();
gAgentWearables.cleanup();
-
+ gAgentCamera.cleanup();
// Also writes cached agent settings to gSavedSettings
gAgent.cleanup();
@@ -4283,7 +4326,7 @@ void LLAppViewer::launchUpdater()
#endif
// *TODO change userserver to be grid on both viewer and sim, since
// userserver no longer exists.
- query_map["userserver"] = LLViewerLogin::getInstance()->getGridLabel();
+ query_map["userserver"] = LLGridManager::getInstance()->getGridLabel();
query_map["channel"] = gSavedSettings.getString("VersionChannelName");
// *TODO constantize this guy
// *NOTE: This URL is also used in win_setup/lldownloader.cpp
@@ -4296,10 +4339,10 @@ void LLAppViewer::launchUpdater()
LLAppViewer::sUpdaterInfo = new LLAppViewer::LLUpdaterInfo() ;
// if a sim name was passed in via command line parameter (typically through a SLURL)
- if ( LLURLSimString::sInstance.mSimString.length() )
+ if ( LLStartUp::getStartSLURL().getType() == LLSLURL::LOCATION )
{
// record the location to start at next time
- gSavedSettings.setString( "NextLoginLocation", LLURLSimString::sInstance.mSimString );
+ gSavedSettings.setString( "NextLoginLocation", LLStartUp::getStartSLURL().getSLURLString());
};
#if LL_WINDOWS
diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h
index a011c5ebfd..0b862a92a1 100644
--- a/indra/newview/llappviewer.h
+++ b/indra/newview/llappviewer.h
@@ -36,6 +36,7 @@
#include "llallocator.h"
#include "llcontrol.h"
#include "llsys.h" // for LLOSInfo
+#include "lltimer.h"
class LLCommandLineParser;
class LLFrameTimer;
@@ -91,9 +92,7 @@ public:
virtual bool restoreErrorTrap() = 0; // Require platform specific override to reset error handling mechanism.
// return false if the error trap needed restoration.
virtual void handleCrashReporting(bool reportFreeze = false) = 0; // What to do with crash report?
- virtual void handleSyncCrashTrace() = 0; // any low-level crash-prep that has to happen in the context of the crashing thread before the crash report is delivered.
static void handleViewerCrash(); // Hey! The viewer crashed. Do this, soon.
- static void handleSyncViewerCrash(); // Hey! The viewer crashed. Do this right NOW in the context of the crashing thread.
void checkForCrash();
// Thread accessors
@@ -101,6 +100,8 @@ public:
static LLImageDecodeThread* getImageDecodeThread() { return sImageDecodeThread; }
static LLTextureFetch* getTextureFetch() { return sTextureFetch; }
+ static S32 getCacheVersion() ;
+
const std::string& getSerialNumber() { return mSerialNumber; }
bool getPurgeCache() const { return mPurgeCache; }
@@ -190,7 +191,6 @@ private:
bool initThreads(); // Initialize viewer threads, return false on failure.
bool initConfiguration(); // Initialize settings from the command line/config file.
- void initGridChoice();
bool initCache(); // Initialize local client cache.
diff --git a/indra/newview/llappviewerlinux.cpp b/indra/newview/llappviewerlinux.cpp
index d34bcb4a68..78afdc8995 100644
--- a/indra/newview/llappviewerlinux.cpp
+++ b/indra/newview/llappviewerlinux.cpp
@@ -46,23 +46,6 @@
#include <exception>
-#if LL_LINUX
-# include <dlfcn.h> // RTLD_LAZY
-# include <execinfo.h> // backtrace - glibc only
-#elif LL_SOLARIS
-# include <sys/types.h>
-# include <unistd.h>
-# include <fcntl.h>
-# include <ucontext.h>
-#endif
-
-#ifdef LL_ELFBIN
-# ifdef __GNUC__
-# include <cxxabi.h> // for symbol demangling
-# endif
-# include "ELFIO/ELFIO.h" // for better backtraces
-#endif
-
#if LL_DBUS_ENABLED
# include "llappviewerlinux_api_dbus.h"
@@ -86,7 +69,6 @@ static void exceptionTerminateHandler()
// reinstall default terminate() handler in case we re-terminate.
if (gOldTerminateHandler) std::set_terminate(gOldTerminateHandler);
// treat this like a regular viewer crash, with nice stacktrace etc.
- LLAppViewer::handleSyncViewerCrash();
LLAppViewer::handleViewerCrash();
// we've probably been killed-off before now, but...
gOldTerminateHandler(); // call old terminate() handler
@@ -109,7 +91,6 @@ int main( int argc, char **argv )
gOldTerminateHandler = std::set_terminate(exceptionTerminateHandler);
// install crash handlers
viewer_app_ptr->setErrorHandler(LLAppViewer::handleViewerCrash);
- viewer_app_ptr->setSyncErrorHandler(LLAppViewer::handleSyncViewerCrash);
bool ok = viewer_app_ptr->init();
if(!ok)
@@ -138,201 +119,6 @@ int main( int argc, char **argv )
return 0;
}
-#ifdef LL_SOLARIS
-static inline BOOL do_basic_glibc_backtrace()
-{
- BOOL success = FALSE;
-
- std::string strace_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log");
- llinfos << "Opening stack trace file " << strace_filename << llendl;
- LLFILE* StraceFile = LLFile::fopen(strace_filename, "w");
- if (!StraceFile)
- {
- llinfos << "Opening stack trace file " << strace_filename << " failed. Using stderr." << llendl;
- StraceFile = stderr;
- }
-
- printstack(fileno(StraceFile));
-
- if (StraceFile != stderr)
- fclose(StraceFile);
-
- return success;
-}
-#else
-#define MAX_STACK_TRACE_DEPTH 40
-// This uses glibc's basic built-in stack-trace functions for a not very
-// amazing backtrace.
-static inline BOOL do_basic_glibc_backtrace()
-{
- void *stackarray[MAX_STACK_TRACE_DEPTH];
- size_t size;
- char **strings;
- size_t i;
- BOOL success = FALSE;
-
- size = backtrace(stackarray, MAX_STACK_TRACE_DEPTH);
- strings = backtrace_symbols(stackarray, size);
-
- std::string strace_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log");
- llinfos << "Opening stack trace file " << strace_filename << llendl;
- LLFILE* StraceFile = LLFile::fopen(strace_filename, "w"); // Flawfinder: ignore
- if (!StraceFile)
- {
- llinfos << "Opening stack trace file " << strace_filename << " failed. Using stderr." << llendl;
- StraceFile = stderr;
- }
-
- if (size)
- {
- for (i = 0; i < size; i++)
- {
- // the format of the StraceFile is very specific, to allow (kludgy) machine-parsing
- fprintf(StraceFile, "%-3lu ", (unsigned long)i);
- fprintf(StraceFile, "%-32s\t", "unknown");
- fprintf(StraceFile, "%p ", stackarray[i]);
- fprintf(StraceFile, "%s\n", strings[i]);
- }
-
- success = TRUE;
- }
-
- if (StraceFile != stderr)
- fclose(StraceFile);
-
- free (strings);
- return success;
-}
-
-#if LL_ELFBIN
-// This uses glibc's basic built-in stack-trace functions together with
-// ELFIO's ability to parse the .symtab ELF section for better symbol
-// extraction without exporting symbols (which'd cause subtle, fatal bugs).
-static inline BOOL do_elfio_glibc_backtrace()
-{
- void *stackarray[MAX_STACK_TRACE_DEPTH];
- size_t btsize;
- char **strings;
- BOOL success = FALSE;
-
- std::string appfilename = gDirUtilp->getExecutablePathAndName();
-
- std::string strace_filename = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log");
- llinfos << "Opening stack trace file " << strace_filename << llendl;
- LLFILE* StraceFile = LLFile::fopen(strace_filename, "w"); // Flawfinder: ignore
- if (!StraceFile)
- {
- llinfos << "Opening stack trace file " << strace_filename << " failed. Using stderr." << llendl;
- StraceFile = stderr;
- }
-
- // get backtrace address list and basic symbol info
- btsize = backtrace(stackarray, MAX_STACK_TRACE_DEPTH);
- strings = backtrace_symbols(stackarray, btsize);
-
- // create ELF reader for our app binary
- IELFI* pReader;
- const IELFISection* pSec = NULL;
- IELFISymbolTable* pSymTbl = 0;
- if (ERR_ELFIO_NO_ERROR != ELFIO::GetInstance()->CreateELFI(&pReader) ||
- ERR_ELFIO_NO_ERROR != pReader->Load(appfilename.c_str()) ||
- // find symbol table, create reader-object
- NULL == (pSec = pReader->GetSection( ".symtab" )) ||
- ERR_ELFIO_NO_ERROR != pReader->CreateSectionReader(IELFI::ELFI_SYMBOL, pSec, (void**)&pSymTbl) )
- {
- // Failed to open our binary and read its symbol table somehow
- llinfos << "Could not initialize ELF symbol reading - doing basic backtrace." << llendl;
- if (StraceFile != stderr)
- fclose(StraceFile);
- // note that we may be leaking some of the above ELFIO
- // objects now, but it's expected that we'll be dead soon
- // and we want to tread delicately until we get *some* kind
- // of useful backtrace.
- return do_basic_glibc_backtrace();
- }
-
- // iterate over trace and symtab, looking for plausible symbols
- std::string name;
- Elf32_Addr value;
- Elf32_Word ssize;
- unsigned char bind;
- unsigned char type;
- Elf32_Half section;
- int nSymNo = pSymTbl->GetSymbolNum();
- size_t btpos;
- for (btpos = 0; btpos < btsize; ++btpos)
- {
- // the format of the StraceFile is very specific, to allow (kludgy) machine-parsing
- fprintf(StraceFile, "%-3ld ", (long)btpos);
- int symidx;
- for (symidx = 0; symidx < nSymNo; ++symidx)
- {
- if (ERR_ELFIO_NO_ERROR ==
- pSymTbl->GetSymbol(symidx, name, value, ssize,
- bind, type, section))
- {
- // check if trace address within symbol range
- if (uintptr_t(stackarray[btpos]) >= value &&
- uintptr_t(stackarray[btpos]) < value+ssize)
- {
- // symbol is inside viewer
- fprintf(StraceFile, "%-32s\t", "com.secondlife.indra.viewer");
- fprintf(StraceFile, "%p ", stackarray[btpos]);
-
- char *demangled_str = NULL;
- int demangle_result = 1;
- demangled_str =
- abi::__cxa_demangle
- (name.c_str(), NULL, NULL,
- &demangle_result);
- if (0 == demangle_result &&
- NULL != demangled_str) {
- fprintf(StraceFile,
- "%s", demangled_str);
- free(demangled_str);
- }
- else // failed demangle; print it raw
- {
- fprintf(StraceFile,
- "%s", name.c_str());
- }
- // print offset from symbol start
- fprintf(StraceFile,
- " + %lu\n",
- uintptr_t(stackarray[btpos]) -
- value);
- goto got_sym; // early escape
- }
- }
- }
- // Fallback:
- // Didn't find a suitable symbol in the binary - it's probably
- // a symbol in a DSO; use glibc's idea of what it should be.
- fprintf(StraceFile, "%-32s\t", "unknown");
- fprintf(StraceFile, "%p ", stackarray[btpos]);
- fprintf(StraceFile, "%s\n", strings[btpos]);
- got_sym:;
- }
-
- if (StraceFile != stderr)
- fclose(StraceFile);
-
- pSymTbl->Release();
- pSec->Release();
- pReader->Release();
-
- free(strings);
-
- llinfos << "Finished generating stack trace." << llendl;
-
- success = TRUE;
- return success;
-}
-#endif // LL_ELFBIN
-
-#endif // LL_SOLARIS
-
-
LLAppViewerLinux::LLAppViewerLinux()
{
}
@@ -541,16 +327,6 @@ bool LLAppViewerLinux::sendURLToOtherInstance(const std::string& url)
}
#endif // LL_DBUS_ENABLED
-void LLAppViewerLinux::handleSyncCrashTrace()
-{
- // This backtrace writes into stack_trace.log
-# if LL_ELFBIN
- do_elfio_glibc_backtrace(); // more useful backtrace
-# else
- do_basic_glibc_backtrace(); // only slightly useful backtrace
-# endif // LL_ELFBIN
-}
-
void LLAppViewerLinux::handleCrashReporting(bool reportFreeze)
{
std::string cmd =gDirUtilp->getExecutableDir();
@@ -604,7 +380,7 @@ void LLAppViewerLinux::handleCrashReporting(bool reportFreeze)
{cmd.c_str(),
ask_dialog,
"-user",
- (char*)LLViewerLogin::getInstance()->getGridLabel().c_str(),
+ (char*)LLGridManager::getInstance()->getGridLabel().c_str(),
"-name",
LLAppViewer::instance()->getSecondLifeTitle().c_str(),
NULL};
@@ -686,6 +462,8 @@ bool LLAppViewerLinux::beingDebugged()
bool LLAppViewerLinux::initLogging()
{
// Remove the last stack trace, if any
+ // This file is no longer created, since the move to Google Breakpad
+ // The code is left here to clean out any old state in the log dir
std::string old_stack_file =
gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"stack_trace.log");
LLFile::remove(old_stack_file);
diff --git a/indra/newview/llappviewerlinux.h b/indra/newview/llappviewerlinux.h
index 230c0dc24b..b17380d4d8 100644
--- a/indra/newview/llappviewerlinux.h
+++ b/indra/newview/llappviewerlinux.h
@@ -68,7 +68,6 @@ protected:
virtual bool restoreErrorTrap();
virtual void handleCrashReporting(bool reportFreeze);
- virtual void handleSyncCrashTrace();
virtual bool initLogging();
virtual bool initParseCommandLine(LLCommandLineParser& clp);
diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp
index f8f8f50cd6..1e66e55f3d 100644
--- a/indra/newview/llappviewermacosx.cpp
+++ b/indra/newview/llappviewermacosx.cpp
@@ -44,7 +44,6 @@
#include "llviewernetwork.h"
#include "llviewercontrol.h"
#include "llmd5.h"
-#include "llurlsimstring.h"
#include "llfloaterworldmap.h"
#include "llurldispatcher.h"
#include <Carbon/Carbon.h>
@@ -265,11 +264,6 @@ bool LLAppViewerMacOSX::restoreErrorTrap()
return reset_count == 0;
}
-void LLAppViewerMacOSX::handleSyncCrashTrace()
-{
- // do nothing
-}
-
static OSStatus CarbonEventHandler(EventHandlerCallRef inHandlerCallRef,
EventRef inEvent,
void* inUserData)
@@ -291,6 +285,7 @@ static OSStatus CarbonEventHandler(EventHandlerCallRef inHandlerCallRef,
if(os_result >= 0 && matching_psn)
{
sCrashReporterIsRunning = false;
+ QuitApplicationEventLoop();
}
}
return noErr;
@@ -326,7 +321,7 @@ void LLAppViewerMacOSX::handleCrashReporting(bool reportFreeze)
// *NOTE:Mani A better way - make a copy of the data that the crash reporter will send
// and let SL go about its business. This way makes the mac work like windows and linux
// and is the smallest patch for the issue.
- sCrashReporterIsRunning = true;
+ sCrashReporterIsRunning = false;
ProcessSerialNumber o_psn;
static EventHandlerRef sCarbonEventsRef = NULL;
@@ -356,15 +351,13 @@ void LLAppViewerMacOSX::handleCrashReporting(bool reportFreeze)
if(os_result >= 0)
{
- EventRecord evt;
- while(sCrashReporterIsRunning)
- {
- while(WaitNextEvent(osMask, &evt, 0, NULL))
- {
- // null op!?!
- }
- }
- }
+ sCrashReporterIsRunning = true;
+ }
+
+ while(sCrashReporterIsRunning)
+ {
+ RunApplicationEventLoop();
+ }
// Re-install the apps quit handler.
AEInstallEventHandler(kCoreEventClass,
@@ -386,33 +379,6 @@ void LLAppViewerMacOSX::handleCrashReporting(bool reportFreeze)
}
}
-
- if(!reportFreeze)
- {
- _exit(1);
- }
-
- // TODO:palmer REMOVE THIS VERY SOON. THIS WILL NOT BE IN VIEWER 2.0
- // Remove the crash stack log from previous executions.
- // Since we've started logging a new instance of the app, we can assume
- // The old crash stack is invalid for the next crash report.
- char path[MAX_PATH];
- FSRef folder;
- if(FSFindFolder(kUserDomain, kLogsFolderType, false, &folder) == noErr)
- {
- // folder is an FSRef to ~/Library/Logs/
- if(FSRefMakePath(&folder, (UInt8*)&path, sizeof(path)) == noErr)
- {
- std::string pathname = std::string(path) + std::string("/CrashReporter/");
- std::string mask = "Second Life*";
- std::string file_name;
- while(gDirUtilp->getNextFileInDir(pathname, mask, file_name, false))
- {
- LLFile::remove(pathname + file_name);
- }
- }
- }
-
}
std::string LLAppViewerMacOSX::generateSerialNumber()
@@ -448,16 +414,17 @@ std::string LLAppViewerMacOSX::generateSerialNumber()
static AudioDeviceID get_default_audio_output_device(void)
{
AudioDeviceID device = 0;
- UInt32 size;
- OSStatus err;
-
- size = sizeof(device);
- err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, &size, &device);
+ UInt32 size = sizeof(device);
+ AudioObjectPropertyAddress device_address = { kAudioHardwarePropertyDefaultOutputDevice,
+ kAudioObjectPropertyScopeGlobal,
+ kAudioObjectPropertyElementMaster };
+
+ OSStatus err = AudioObjectGetPropertyData(kAudioObjectSystemObject, &device_address, 0, NULL, &size, &device);
if(err != noErr)
{
LL_DEBUGS("SystemMute") << "Couldn't get default audio output device (0x" << std::hex << err << ")" << LL_ENDL;
}
-
+
return device;
}
@@ -465,11 +432,15 @@ static AudioDeviceID get_default_audio_output_device(void)
void LLAppViewerMacOSX::setMasterSystemAudioMute(bool new_mute)
{
AudioDeviceID device = get_default_audio_output_device();
-
+
if(device != 0)
{
UInt32 mute = new_mute;
- OSStatus err = AudioDeviceSetProperty(device, NULL, 0, false, kAudioDevicePropertyMute, sizeof(mute), &mute);
+ AudioObjectPropertyAddress device_address = { kAudioDevicePropertyMute,
+ kAudioDevicePropertyScopeOutput,
+ kAudioObjectPropertyElementMaster };
+
+ OSStatus err = AudioObjectSetPropertyData(device, &device_address, 0, NULL, sizeof(mute), &mute);
if(err != noErr)
{
LL_INFOS("SystemMute") << "Couldn't set audio mute property (0x" << std::hex << err << ")" << LL_ENDL;
@@ -482,13 +453,17 @@ bool LLAppViewerMacOSX::getMasterSystemAudioMute()
{
// Assume the system isn't muted
UInt32 mute = 0;
-
+
AudioDeviceID device = get_default_audio_output_device();
-
+
if(device != 0)
{
UInt32 size = sizeof(mute);
- OSStatus err = AudioDeviceGetProperty(device, 0, false, kAudioDevicePropertyMute, &size, &mute);
+ AudioObjectPropertyAddress device_address = { kAudioDevicePropertyMute,
+ kAudioDevicePropertyScopeOutput,
+ kAudioObjectPropertyElementMaster };
+
+ OSStatus err = AudioObjectGetPropertyData(device, &device_address, 0, NULL, &size, &mute);
if(err != noErr)
{
LL_DEBUGS("SystemMute") << "Couldn't get audio mute property (0x" << std::hex << err << ")" << LL_ENDL;
diff --git a/indra/newview/llappviewermacosx.h b/indra/newview/llappviewermacosx.h
index cbf7e6c209..3d7bb55556 100644
--- a/indra/newview/llappviewermacosx.h
+++ b/indra/newview/llappviewermacosx.h
@@ -55,7 +55,6 @@ public:
protected:
virtual bool restoreErrorTrap();
virtual void handleCrashReporting(bool reportFreeze);
- virtual void handleSyncCrashTrace();
std::string generateSerialNumber();
virtual bool initParseCommandLine(LLCommandLineParser& clp);
diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp
index 12cff32780..e3ef04d03d 100644
--- a/indra/newview/llappviewerwin32.cpp
+++ b/indra/newview/llappviewerwin32.cpp
@@ -57,8 +57,6 @@
#include "llweb.h"
#include "llsecondlifeurls.h"
-#include "llwindebug.h"
-
#include "llviewernetwork.h"
#include "llmd5.h"
#include "llfindlocale.h"
@@ -81,51 +79,6 @@ extern "C" {
const std::string LLAppViewerWin32::sWindowClass = "Second Life";
-LONG WINAPI viewer_windows_exception_handler(struct _EXCEPTION_POINTERS *exception_infop)
-{
- // *NOTE:Mani - this code is stolen from LLApp, where its never actually used.
- //OSMessageBox("Attach Debugger Now", "Error", OSMB_OK);
- // *TODO: Translate the signals/exceptions into cross-platform stuff
- // Windows implementation
- _tprintf( _T("Entering Windows Exception Handler...\n") );
- llinfos << "Entering Windows Exception Handler..." << llendl;
-
- // Make sure the user sees something to indicate that the app crashed.
- LONG retval;
-
- if (LLApp::isError())
- {
- _tprintf( _T("Got another fatal signal while in the error handler, die now!\n") );
- llwarns << "Got another fatal signal while in the error handler, die now!" << llendl;
-
- retval = EXCEPTION_EXECUTE_HANDLER;
- return retval;
- }
-
- // Generate a minidump if we can.
- // Before we wake the error thread...
- // Which will start the crash reporting.
- LLWinDebug::generateCrashStacks(exception_infop);
-
- // Flag status to error, so thread_error starts its work
- LLApp::setError();
-
- // Block in the exception handler until the app has stopped
- // This is pretty sketchy, but appears to work just fine
- while (!LLApp::isStopped())
- {
- ms_sleep(10);
- }
-
- //
- // At this point, we always want to exit the app. There's no graceful
- // recovery for an unhandled exception.
- //
- // Just kill the process.
- retval = EXCEPTION_EXECUTE_HANDLER;
- return retval;
-}
-
// Create app mutex creates a unique global windows object.
// If the object can be created it returns true, otherwise
// it returns false. The false result can be used to determine
@@ -191,8 +144,6 @@ int APIENTRY WINMAIN(HINSTANCE hInstance,
gIconResource = MAKEINTRESOURCE(IDI_LL_ICON);
LLAppViewerWin32* viewer_app_ptr = new LLAppViewerWin32(lpCmdLine);
-
- LLWinDebug::initExceptionHandler(viewer_windows_exception_handler);
viewer_app_ptr->setErrorHandler(LLAppViewer::handleViewerCrash);
@@ -405,12 +356,6 @@ bool LLAppViewerWin32::cleanup()
bool LLAppViewerWin32::initLogging()
{
- // Remove the crash stack log from previous executions.
- // Since we've started logging a new instance of the app, we can assume
- // *NOTE: This should happen before the we send a 'previous instance froze'
- // crash report, but it must happen after we initialize the DirUtil.
- LLWinDebug::clearCrashStacks();
-
return LLAppViewer::initLogging();
}
@@ -469,7 +414,7 @@ bool LLAppViewerWin32::initHardwareTest()
if (OSBTN_NO== button)
{
LL_INFOS("AppInit") << "User quitting after failed DirectX 9 detection" << LL_ENDL;
- LLWeb::loadURLExternal(DIRECTX_9_URL);
+ LLWeb::loadURLExternal(DIRECTX_9_URL, false);
return false;
}
gWarningSettings.setBOOL("AboutDirectX9", FALSE);
@@ -480,10 +425,12 @@ bool LLAppViewerWin32::initHardwareTest()
gSavedSettings.setBOOL("ProbeHardwareOnStartup", FALSE);
// Disable so debugger can work
- std::ostringstream splash_msg;
- splash_msg << LLTrans::getString("StartupLoading") << " " << LLAppViewer::instance()->getSecondLifeTitle() << "...";
+ std::string splash_msg;
+ LLStringUtil::format_map_t args;
+ args["[APP_NAME]"] = LLAppViewer::instance()->getSecondLifeTitle();
+ splash_msg = LLTrans::getString("StartupLoading", args);
- LLSplashScreen::update(splash_msg.str());
+ LLSplashScreen::update(splash_msg);
}
if (!restoreErrorTrap())
@@ -527,13 +474,9 @@ bool LLAppViewerWin32::initParseCommandLine(LLCommandLineParser& clp)
}
bool LLAppViewerWin32::restoreErrorTrap()
-{
- return LLWinDebug::checkExceptionHandler();
-}
-
-void LLAppViewerWin32::handleSyncCrashTrace()
-{
- // do nothing
+{
+ return true;
+ //return LLWinDebug::checkExceptionHandler();
}
void LLAppViewerWin32::handleCrashReporting(bool reportFreeze)
diff --git a/indra/newview/llappviewerwin32.h b/indra/newview/llappviewerwin32.h
index 13454edeec..52dcc583a4 100644
--- a/indra/newview/llappviewerwin32.h
+++ b/indra/newview/llappviewerwin32.h
@@ -57,7 +57,6 @@ protected:
virtual bool restoreErrorTrap();
virtual void handleCrashReporting(bool reportFreeze);
- virtual void handleSyncCrashTrace();
virtual bool sendURLToOtherInstance(const std::string& url);
diff --git a/indra/newview/llassetuploadresponders.cpp b/indra/newview/llassetuploadresponders.cpp
index a2322e28b4..116c4cafc2 100644
--- a/indra/newview/llassetuploadresponders.cpp
+++ b/indra/newview/llassetuploadresponders.cpp
@@ -37,8 +37,9 @@
// viewer includes
#include "llagent.h"
#include "llcompilequeue.h"
-#include "llfloaterbuycurrency.h"
+#include "llbuycurrencyhtml.h"
#include "llfilepicker.h"
+#include "llinventorydefines.h"
#include "llinventoryobserver.h"
#include "llinventorypanel.h"
#include "llpermissionsflags.h"
@@ -55,6 +56,7 @@
#include "llviewermenufile.h"
#include "llviewerwindow.h"
#include "lltexlayer.h"
+#include "lltrans.h"
// library includes
#include "lldir.h"
@@ -181,7 +183,10 @@ void LLAssetUploadResponder::uploadFailure(const LLSD& content)
// deal with L$ errors
if (reason == "insufficient funds")
{
- LLFloaterBuyCurrency::buyCurrency("Uploading costs", LLGlobalEconomy::Singleton::getInstance()->getPriceUpload());
+ S32 price = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
+ LLStringUtil::format_map_t args;
+ args["AMOUNT"] = llformat("%d", price);
+ LLBuyCurrencyHTML::openCurrencyFloater( LLTrans::getString("uploading_costs", args), price );
}
else
{
@@ -278,7 +283,7 @@ void LLNewAgentInventoryResponder::uploadComplete(const LLSD& content)
mPostData["name"].asString(),
mPostData["description"].asString(),
LLSaleInfo::DEFAULT,
- LLInventoryItem::II_FLAGS_NONE,
+ LLInventoryItemFlags::II_FLAGS_NONE,
creation_date_now);
gInventory.updateItem(item);
gInventory.notifyObservers();
@@ -473,10 +478,10 @@ void LLUpdateAgentInventoryResponder::uploadComplete(const LLSD& content)
{
// If this gesture is active, then we need to update the in-memory
// active map with the new pointer.
- if (LLGestureManager::instance().isGestureActive(item_id))
+ if (LLGestureMgr::instance().isGestureActive(item_id))
{
LLUUID asset_id = new_item->getAssetUUID();
- LLGestureManager::instance().replaceGesture(item_id, asset_id);
+ LLGestureMgr::instance().replaceGesture(item_id, asset_id);
gInventory.notifyObservers();
}
diff --git a/indra/newview/llassetuploadresponders.h b/indra/newview/llassetuploadresponders.h
index e656351305..91fb39916d 100644
--- a/indra/newview/llassetuploadresponders.h
+++ b/indra/newview/llassetuploadresponders.h
@@ -72,7 +72,7 @@ public:
virtual void uploadComplete(const LLSD& content);
};
-class LLBakedUploadData;
+struct LLBakedUploadData;
class LLSendTexLayerResponder : public LLAssetUploadResponder
{
public:
diff --git a/indra/newview/llaudiosourcevo.cpp b/indra/newview/llaudiosourcevo.cpp
index 5e71e64b2f..50363ea2e7 100644
--- a/indra/newview/llaudiosourcevo.cpp
+++ b/indra/newview/llaudiosourcevo.cpp
@@ -35,7 +35,7 @@
#include "llaudiosourcevo.h"
-#include "llagent.h"
+#include "llagentcamera.h"
#include "llmutelist.h"
#include "llviewerparcelmgr.h"
@@ -148,7 +148,7 @@ void LLAudioSourceVO::update()
updateGain();
if (mObjectp->isHUDAttachment())
{
- mPositionGlobal = gAgent.getCameraPositionGlobal();
+ mPositionGlobal = gAgentCamera.getCameraPositionGlobal();
}
else
{
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index bd987eac77..5bc3b3ac8d 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -35,6 +35,8 @@
#include "llavataractions.h"
+#include "boost/lambda/lambda.hpp" // for lambda::constant
+
#include "llsd.h"
#include "lldarray.h"
#include "llnotifications.h"
@@ -46,13 +48,18 @@
#include "llappviewer.h" // for gLastVersionChannel
#include "llcachename.h"
#include "llcallingcard.h" // for LLAvatarTracker
+#include "llfloateravatarpicker.h" // for LLFloaterAvatarPicker
#include "llfloatergroupinvite.h"
#include "llfloatergroups.h"
#include "llfloaterreg.h"
#include "llfloaterpay.h"
+#include "llfloaterworldmap.h"
+#include "llgiveinventory.h"
#include "llinventorymodel.h" // for gInventory.findCategoryUUIDForType
+#include "llinventorypanel.h"
#include "llimview.h" // for gIMMgr
#include "llmutelist.h"
+#include "llnotificationsutil.h" // for LLNotificationsUtil
#include "llrecentpeople.h"
#include "llsidetray.h"
#include "lltrans.h"
@@ -112,13 +119,13 @@ void LLAvatarActions::removeFriendDialog(const LLUUID& id)
if (id.isNull())
return;
- std::vector<LLUUID> ids;
+ uuid_vec_t ids;
ids.push_back(id);
removeFriendsDialog(ids);
}
// static
-void LLAvatarActions::removeFriendsDialog(const std::vector<LLUUID>& ids)
+void LLAvatarActions::removeFriendsDialog(const uuid_vec_t& ids)
{
if(ids.size() == 0)
return;
@@ -143,7 +150,7 @@ void LLAvatarActions::removeFriendsDialog(const std::vector<LLUUID>& ids)
}
LLSD payload;
- for (std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); ++it)
+ for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it)
{
payload["ids"].append(*it);
}
@@ -160,13 +167,21 @@ void LLAvatarActions::offerTeleport(const LLUUID& invitee)
if (invitee.isNull())
return;
+ //waiting until Name Cache gets updated with corresponding avatar name
+ std::string just_to_request_name;
+ if (!gCacheName->getFullName(invitee, just_to_request_name))
+ {
+ gCacheName->get(invitee, FALSE, boost::bind((void (*)(const LLUUID&)) &LLAvatarActions::offerTeleport, invitee));
+ return;
+ }
+
LLDynamicArray<LLUUID> ids;
ids.push_back(invitee);
offerTeleport(ids);
}
// static
-void LLAvatarActions::offerTeleport(const std::vector<LLUUID>& ids)
+void LLAvatarActions::offerTeleport(const uuid_vec_t& ids)
{
if (ids.size() == 0)
return;
@@ -181,7 +196,12 @@ void LLAvatarActions::startIM(const LLUUID& id)
return;
std::string name;
- gCacheName->getFullName(id, name);
+ if (!gCacheName->getFullName(id, name))
+ {
+ gCacheName->get(id, FALSE, boost::bind(&LLAvatarActions::startIM, id));
+ return;
+ }
+
LLUUID session_id = gIMMgr->addSession(name, IM_NOTHING_SPECIAL, id);
if (session_id != LLUUID::null)
{
@@ -222,7 +242,7 @@ void LLAvatarActions::startCall(const LLUUID& id)
}
// static
-void LLAvatarActions::startAdhocCall(const std::vector<LLUUID>& ids)
+void LLAvatarActions::startAdhocCall(const uuid_vec_t& ids)
{
if (ids.size() == 0)
{
@@ -231,7 +251,7 @@ void LLAvatarActions::startAdhocCall(const std::vector<LLUUID>& ids)
// convert vector into LLDynamicArray for addSession
LLDynamicArray<LLUUID> id_array;
- for (std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); ++it)
+ for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it)
{
id_array.push_back(*it);
}
@@ -268,15 +288,15 @@ bool LLAvatarActions::isCalling(const LLUUID &id)
//static
bool LLAvatarActions::canCall()
{
- return LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking();
+ return LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking();
}
// static
-void LLAvatarActions::startConference(const std::vector<LLUUID>& ids)
+void LLAvatarActions::startConference(const uuid_vec_t& ids)
{
// *HACK: Copy into dynamic array
LLDynamicArray<LLUUID> id_array;
- for (std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); ++it)
+ for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it)
{
id_array.push_back(*it);
}
@@ -312,6 +332,20 @@ void LLAvatarActions::showProfile(const LLUUID& id)
}
// static
+void LLAvatarActions::showOnMap(const LLUUID& id)
+{
+ std::string name;
+ if (!gCacheName->getFullName(id, name))
+ {
+ gCacheName->get(id, FALSE, boost::bind(&LLAvatarActions::showOnMap, id));
+ return;
+ }
+
+ gFloaterWorldMap->trackAvatar(id, name);
+ LLFloaterReg::showInstance("world_map");
+}
+
+// static
void LLAvatarActions::pay(const LLUUID& id)
{
LLNotification::Params params("BusyModePay");
@@ -397,6 +431,234 @@ void LLAvatarActions::share(const LLUUID& id)
}
}
+namespace action_give_inventory
+{
+ typedef std::set<LLUUID> uuid_set_t;
+
+ /**
+ * Checks My Inventory visibility.
+ */
+ static bool is_give_inventory_acceptable()
+ {
+ LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE);
+ if (NULL == active_panel) return false;
+
+ // check selection in the panel
+ const uuid_set_t inventory_selected_uuids = active_panel->getRootFolder()->getSelectionList();
+ if (inventory_selected_uuids.empty()) return false; // nothing selected
+
+ bool acceptable = false;
+ uuid_set_t::const_iterator it = inventory_selected_uuids.begin();
+ const uuid_set_t::const_iterator it_end = inventory_selected_uuids.end();
+ for (; it != it_end; ++it)
+ {
+ LLViewerInventoryCategory* inv_cat = gInventory.getCategory(*it);
+ // any category can be offered.
+ if (inv_cat)
+ {
+ acceptable = true;
+ continue;
+ }
+
+ LLViewerInventoryItem* inv_item = gInventory.getItem(*it);
+ // check if inventory item can be given
+ if (LLGiveInventory::isInventoryGiveAcceptable(inv_item))
+ {
+ acceptable = true;
+ continue;
+ }
+
+ // there are neither item nor category in inventory
+ acceptable = false;
+ break;
+ }
+ return acceptable;
+ }
+
+ static void build_residents_string(const std::vector<std::string>& avatar_names, std::string& residents_string)
+ {
+ llassert(avatar_names.size() > 0);
+
+ const std::string& separator = LLTrans::getString("words_separator");
+ for (std::vector<std::string>::const_iterator it = avatar_names.begin(); ; )
+ {
+ residents_string.append(*it);
+ if (++it == avatar_names.end())
+ {
+ break;
+ }
+ residents_string.append(separator);
+ }
+ }
+
+ static void build_items_string(const uuid_set_t& inventory_selected_uuids , std::string& items_string)
+ {
+ llassert(inventory_selected_uuids.size() > 0);
+
+ const std::string& separator = LLTrans::getString("words_separator");
+ for (uuid_set_t::const_iterator it = inventory_selected_uuids.begin(); ; )
+ {
+ LLViewerInventoryCategory* inv_cat = gInventory.getCategory(*it);
+ if (NULL != inv_cat)
+ {
+ items_string = inv_cat->getName();
+ break;
+ }
+ LLViewerInventoryItem* inv_item = gInventory.getItem(*it);
+ if (NULL != inv_item)
+ {
+ items_string.append(inv_item->getName());
+ }
+ if(++it == inventory_selected_uuids.end())
+ {
+ break;
+ }
+ items_string.append(separator);
+ }
+ }
+
+ struct LLShareInfo : public LLSingleton<LLShareInfo>
+ {
+ std::vector<std::string> mAvatarNames;
+ uuid_vec_t mAvatarUuids;
+ };
+
+ static void give_inventory_cb(const LLSD& notification, const LLSD& response)
+ {
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ // if Cancel pressed
+ if (option == 1)
+ {
+ return;
+ }
+
+ LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE);
+ if (NULL == active_panel)
+ {
+ return;
+ }
+
+ const uuid_set_t inventory_selected_uuids = active_panel->getRootFolder()->getSelectionList();
+ if (inventory_selected_uuids.empty())
+ {
+ return;
+ }
+
+ S32 count = LLShareInfo::instance().mAvatarNames.size();
+ bool shared = false;
+
+ // iterate through avatars
+ for(S32 i = 0; i < count; ++i)
+ {
+ const LLUUID& avatar_uuid = LLShareInfo::instance().mAvatarUuids[i];
+
+ // We souldn't open IM session, just calculate session ID for logging purpose. See EXT-6710
+ const LLUUID session_id = gIMMgr->computeSessionID(IM_NOTHING_SPECIAL, avatar_uuid);
+
+ uuid_set_t::const_iterator it = inventory_selected_uuids.begin();
+ const uuid_set_t::const_iterator it_end = inventory_selected_uuids.end();
+
+ const std::string& separator = LLTrans::getString("words_separator");
+ std::string noncopy_item_names;
+ LLSD noncopy_items = LLSD::emptyArray();
+ // iterate through selected inventory objects
+ for (; it != it_end; ++it)
+ {
+ LLViewerInventoryCategory* inv_cat = gInventory.getCategory(*it);
+ if (inv_cat)
+ {
+ LLGiveInventory::doGiveInventoryCategory(avatar_uuid, inv_cat, session_id);
+ shared = true;
+ break;
+ }
+ LLViewerInventoryItem* inv_item = gInventory.getItem(*it);
+ if (!inv_item->getPermissions().allowCopyBy(gAgentID))
+ {
+ if (!noncopy_item_names.empty())
+ {
+ noncopy_item_names.append(separator);
+ }
+ noncopy_item_names.append(inv_item->getName());
+ noncopy_items.append(*it);
+ }
+ else
+ {
+ LLGiveInventory::doGiveInventoryItem(avatar_uuid, inv_item, session_id);
+ shared = true;
+ }
+ }
+ if (noncopy_items.beginArray() != noncopy_items.endArray())
+ {
+ LLSD substitutions;
+ substitutions["ITEMS"] = noncopy_item_names;
+ LLSD payload;
+ payload["agent_id"] = avatar_uuid;
+ payload["items"] = noncopy_items;
+ LLNotificationsUtil::add("CannotCopyWarning", substitutions, payload,
+ &LLGiveInventory::handleCopyProtectedItem);
+ break;
+ }
+ }
+ if (shared)
+ {
+ LLFloaterReg::hideInstance("avatar_picker");
+ LLNotificationsUtil::add("ItemsShared");
+ }
+ }
+
+ /**
+ * Performs "give inventory" operations for provided avatars.
+ *
+ * Sends one requests to give all selected inventory items for each passed avatar.
+ * Avatars are represent by two vectors: names and UUIDs which must be sychronized with each other.
+ *
+ * @param avatar_names - avatar names request to be sent.
+ * @param avatar_uuids - avatar names request to be sent.
+ */
+ static void give_inventory(const std::vector<std::string>& avatar_names, const uuid_vec_t& avatar_uuids)
+ {
+ llassert(avatar_names.size() == avatar_uuids.size());
+
+
+ LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE);
+ if (NULL == active_panel)
+ {
+ return;
+ }
+
+ const uuid_set_t inventory_selected_uuids = active_panel->getRootFolder()->getSelectionList();
+ if (inventory_selected_uuids.empty())
+ {
+ return;
+ }
+
+ std::string residents;
+ build_residents_string(avatar_names, residents);
+
+ std::string items;
+ build_items_string(inventory_selected_uuids, items);
+
+ LLSD substitutions;
+ substitutions["RESIDENTS"] = residents;
+ substitutions["ITEMS"] = items;
+ LLShareInfo::instance().mAvatarNames = avatar_names;
+ LLShareInfo::instance().mAvatarUuids = avatar_uuids;
+ LLNotificationsUtil::add("ShareItemsConfirmation", substitutions, LLSD(), &give_inventory_cb);
+ }
+}
+
+//static
+void LLAvatarActions::shareWithAvatars()
+{
+ using namespace action_give_inventory;
+
+ LLFloaterAvatarPicker* picker =
+ LLFloaterAvatarPicker::show(boost::bind(give_inventory, _1, _2), TRUE, FALSE);
+ picker->setOkBtnEnableCb(boost::bind(is_give_inventory_acceptable));
+ picker->openFriendsTab();
+ LLNotificationsUtil::add("ShareNotification");
+}
+
// static
void LLAvatarActions::toggleBlock(const LLUUID& id)
{
@@ -414,6 +676,20 @@ void LLAvatarActions::toggleBlock(const LLUUID& id)
LLMuteList::getInstance()->add(mute);
}
}
+// static
+bool LLAvatarActions::canOfferTeleport(const LLUUID& id)
+{
+ // First use LLAvatarTracker::isBuddy()
+ // If LLAvatarTracker::instance().isBuddyOnline function only is used
+ // then for avatars that are online and not a friend it will return false.
+ // But we should give an ability to offer a teleport for such avatars.
+ if(LLAvatarTracker::instance().isBuddy(id))
+ {
+ return LLAvatarTracker::instance().isBuddyOnline(id);
+ }
+
+ return true;
+}
void LLAvatarActions::inviteToGroup(const LLUUID& id)
{
@@ -479,7 +755,7 @@ bool LLAvatarActions::handlePay(const LLSD& notification, const LLSD& response,
// static
void LLAvatarActions::callback_invite_to_group(LLUUID group_id, LLUUID id)
{
- std::vector<LLUUID> agent_ids;
+ uuid_vec_t agent_ids;
agent_ids.push_back(id);
LLFloaterGroupInvite::showForGroup(group_id, &agent_ids);
diff --git a/indra/newview/llavataractions.h b/indra/newview/llavataractions.h
index 16a58718a2..d106a83eea 100644
--- a/indra/newview/llavataractions.h
+++ b/indra/newview/llavataractions.h
@@ -60,13 +60,13 @@ public:
* Show a friend removal dialog.
*/
static void removeFriendDialog(const LLUUID& id);
- static void removeFriendsDialog(const std::vector<LLUUID>& ids);
+ static void removeFriendsDialog(const uuid_vec_t& ids);
/**
* Show teleport offer dialog.
*/
static void offerTeleport(const LLUUID& invitee);
- static void offerTeleport(const std::vector<LLUUID>& ids);
+ static void offerTeleport(const uuid_vec_t& ids);
/**
* Start instant messaging session.
@@ -86,12 +86,12 @@ public:
/**
* Start an ad-hoc conference voice call with multiple users
*/
- static void startAdhocCall(const std::vector<LLUUID>& ids);
+ static void startAdhocCall(const uuid_vec_t& ids);
/**
* Start conference chat with the given avatars.
*/
- static void startConference(const std::vector<LLUUID>& ids);
+ static void startConference(const uuid_vec_t& ids);
/**
* Show avatar profile.
@@ -99,6 +99,11 @@ public:
static void showProfile(const LLUUID& id);
/**
+ * Show avatar on world map.
+ */
+ static void showOnMap(const LLUUID& id);
+
+ /**
* Give money to the avatar.
*/
static void pay(const LLUUID& id);
@@ -109,6 +114,11 @@ public:
static void share(const LLUUID& id);
/**
+ * Share items with the picked avatars.
+ */
+ static void shareWithAvatars();
+
+ /**
* Block/unblock the avatar.
*/
static void toggleBlock(const LLUUID& id);
@@ -166,6 +176,12 @@ public:
*/
static void csr(const LLUUID& id, std::string name);
+ /**
+ * Checks whether can offer teleport to the avatar
+ * Can't offer only for offline friends
+ */
+ static bool canOfferTeleport(const LLUUID& id);
+
private:
static bool callbackAddFriend(const LLSD& notification, const LLSD& response);
diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp
index 87b8d807c4..abb79b53a7 100644
--- a/indra/newview/llavatariconctrl.cpp
+++ b/indra/newview/llavatariconctrl.cpp
@@ -244,7 +244,10 @@ void LLAvatarIconCtrl::setValue(const LLSD& value)
LLIconCtrl::setValue(value);
}
- gCacheName->get(mAvatarId, FALSE, boost::bind(&LLAvatarIconCtrl::nameUpdatedCallback, this, _1, _2, _3, _4));
+ if (gCacheName)
+ {
+ gCacheName->get(mAvatarId, FALSE, boost::bind(&LLAvatarIconCtrl::nameUpdatedCallback, this, _1, _2, _3, _4));
+ }
}
bool LLAvatarIconCtrl::updateFromCache()
diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp
index 6784e6693b..3275d784a3 100644
--- a/indra/newview/llavatarlist.cpp
+++ b/indra/newview/llavatarlist.cpp
@@ -33,12 +33,22 @@
#include "llviewerprecompiledheaders.h"
#include "llavatarlist.h"
-#include "llagentdata.h" // for comparator
+
+// common
+#include "lltrans.h"
+#include "llcommonutils.h"
+
+// llui
+#include "lltextutil.h"
// newview
+#include "llagentdata.h" // for comparator
+#include "llavatariconctrl.h"
#include "llcallingcard.h" // for LLAvatarTracker
#include "llcachename.h"
+#include "lllistcontextmenu.h"
#include "llrecentpeople.h"
+#include "lluuid.h"
#include "llvoiceclient.h"
#include "llviewercontrol.h" // for gSavedSettings
@@ -53,7 +63,7 @@ static const unsigned ADD_LIMIT = 50;
bool LLAvatarList::contains(const LLUUID& id)
{
- const uuid_vector_t& ids = getIDs();
+ const uuid_vec_t& ids = getIDs();
return std::find(ids.begin(), ids.end(), id) != ids.end();
}
@@ -107,7 +117,7 @@ LLAvatarList::Params::Params()
}
LLAvatarList::LLAvatarList(const Params& p)
-: LLFlatListView(p)
+: LLFlatListViewEx(p)
, mIgnoreOnlineStatus(p.ignore_online_status)
, mShowLastInteractionTime(p.show_last_interaction_time)
, mContextMenu(NULL)
@@ -148,7 +158,7 @@ void LLAvatarList::draw()
// *NOTE dzaporozhan
// Call refresh() after draw() to avoid flickering of avatar list items.
- LLFlatListView::draw();
+ LLFlatListViewEx::draw();
if (mDirty)
refresh();
@@ -165,14 +175,20 @@ void LLAvatarList::clear()
{
getIDs().clear();
setDirty(true);
- LLFlatListView::clear();
+ LLFlatListViewEx::clear();
}
void LLAvatarList::setNameFilter(const std::string& filter)
{
- if (mNameFilter != filter)
+ std::string filter_upper = filter;
+ LLStringUtil::toUpper(filter_upper);
+ if (mNameFilter != filter_upper)
{
- mNameFilter = filter;
+ mNameFilter = filter_upper;
+
+ // update message for empty state here instead of refresh() to avoid blinking when switch
+ // between tabs.
+ updateNoItemsMessage(filter);
setDirty();
}
}
@@ -183,6 +199,27 @@ void LLAvatarList::sortByName()
sort();
}
+void LLAvatarList::setDirty(bool val /*= true*/, bool force_refresh /*= false*/)
+{
+ mDirty = val;
+ if(mDirty && force_refresh)
+ {
+ refresh();
+ }
+}
+
+void LLAvatarList::addAvalineItem(const LLUUID& item_id, const LLUUID& session_id, const std::string& item_name)
+{
+ LL_DEBUGS("Avaline") << "Adding avaline item into the list: " << item_name << "|" << item_id << ", session: " << session_id << LL_ENDL;
+ LLAvalineListItem* item = new LLAvalineListItem;
+ item->setAvatarId(item_id, session_id, true, false);
+ item->setName(item_name);
+
+ addItem(item, item_id);
+ mIDs.push_back(item_id);
+ sort();
+}
+
//////////////////////////////////////////////////////////////////////////
// PROTECTED SECTION
//////////////////////////////////////////////////////////////////////////
@@ -195,17 +232,17 @@ void LLAvatarList::refresh()
bool have_filter = !mNameFilter.empty();
// Save selection.
- std::vector<LLUUID> selected_ids;
+ uuid_vec_t selected_ids;
getSelectedUUIDs(selected_ids);
LLUUID current_id = getSelectedUUID();
// Determine what to add and what to remove.
- std::vector<LLUUID> added, removed;
+ uuid_vec_t added, removed;
LLAvatarList::computeDifference(getIDs(), added, removed);
// Handle added items.
unsigned nadded = 0;
- for (std::vector<LLUUID>::const_iterator it=added.begin(); it != added.end(); it++)
+ for (uuid_vec_t::const_iterator it=added.begin(); it != added.end(); it++)
{
std::string name;
const LLUUID& buddy_id = *it;
@@ -227,7 +264,7 @@ void LLAvatarList::refresh()
}
// Handle removed items.
- for (std::vector<LLUUID>::const_iterator it=removed.begin(); it != removed.end(); it++)
+ for (uuid_vec_t::const_iterator it=removed.begin(); it != removed.end(); it++)
{
removeItemByUUID(*it);
modified = true;
@@ -282,9 +319,7 @@ void LLAvatarList::refresh()
}
// Send refresh_complete signal.
- std::vector<LLSD> cur_values;
- getValues(cur_values);
- mRefreshCompleteSignal(this, LLSD((S32)cur_values.size()));
+ mRefreshCompleteSignal(this, LLSD((S32)size(false)));
}
// Commit if we've added/removed items.
@@ -294,9 +329,9 @@ void LLAvatarList::refresh()
bool LLAvatarList::filterHasMatches()
{
- uuid_vector_t values = getIDs();
+ uuid_vec_t values = getIDs();
- for (uuid_vector_t::const_iterator it=values.begin(); it != values.end(); it++)
+ for (uuid_vec_t::const_iterator it=values.begin(); it != values.end(); it++)
{
std::string name;
const LLUUID& buddy_id = *it;
@@ -325,11 +360,22 @@ boost::signals2::connection LLAvatarList::setItemDoubleClickCallback(const mouse
return mItemDoubleClickSignal.connect(cb);
}
+//virtual
+S32 LLAvatarList::notifyParent(const LLSD& info)
+{
+ if (info.has("sort") && &NAME_COMPARATOR == mItemComparator)
+ {
+ sort();
+ return 1;
+ }
+ return LLFlatListViewEx::notifyParent(info);
+}
+
void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is_online, EAddPosition pos)
{
LLAvatarListItem* item = new LLAvatarListItem();
item->setName(name);
- item->setAvatarId(id, mIgnoreOnlineStatus);
+ item->setAvatarId(id, mSessionID, mIgnoreOnlineStatus);
item->setOnline(mIgnoreOnlineStatus ? true : is_online);
item->showLastInteractionTime(mShowLastInteractionTime);
@@ -349,20 +395,28 @@ BOOL LLAvatarList::handleRightMouseDown(S32 x, S32 y, MASK mask)
BOOL handled = LLUICtrl::handleRightMouseDown(x, y, mask);
if ( mContextMenu )
{
- std::vector<LLUUID> selected_uuids;
+ uuid_vec_t selected_uuids;
getSelectedUUIDs(selected_uuids);
mContextMenu->show(this, selected_uuids, x, y);
}
return handled;
}
+void LLAvatarList::setVisible(BOOL visible)
+{
+ if ( visible == FALSE && mContextMenu )
+ {
+ mContextMenu->hide();
+ }
+ LLFlatListViewEx::setVisible(visible);
+}
+
void LLAvatarList::computeDifference(
- const std::vector<LLUUID>& vnew_unsorted,
- std::vector<LLUUID>& vadded,
- std::vector<LLUUID>& vremoved)
+ const uuid_vec_t& vnew_unsorted,
+ uuid_vec_t& vadded,
+ uuid_vec_t& vremoved)
{
- std::vector<LLUUID> vcur;
- std::vector<LLUUID> vnew = vnew_unsorted;
+ uuid_vec_t vcur;
// Convert LLSDs to LLUUIDs.
{
@@ -373,21 +427,7 @@ void LLAvatarList::computeDifference(
vcur.push_back(vcur_values[i].asUUID());
}
- std::sort(vcur.begin(), vcur.end());
- std::sort(vnew.begin(), vnew.end());
-
- std::vector<LLUUID>::iterator it;
- size_t maxsize = llmax(vcur.size(), vnew.size());
- vadded.resize(maxsize);
- vremoved.resize(maxsize);
-
- // what to remove
- it = set_difference(vcur.begin(), vcur.end(), vnew.begin(), vnew.end(), vremoved.begin());
- vremoved.erase(it, vremoved.end());
-
- // what to add
- it = set_difference(vnew.begin(), vnew.end(), vcur.begin(), vcur.end(), vadded.begin());
- vadded.erase(it, vadded.end());
+ LLCommonUtils::computeDifference(vnew_unsorted, vcur, vadded, vremoved);
}
// Refresh shown time of our last interaction with all listed avatars.
@@ -450,3 +490,61 @@ bool LLAvatarItemAgentOnTopComparator::doCompare(const LLAvatarListItem* avatar_
}
return LLAvatarItemNameComparator::doCompare(avatar_item1,avatar_item2);
}
+
+/************************************************************************/
+/* class LLAvalineListItem */
+/************************************************************************/
+LLAvalineListItem::LLAvalineListItem(bool hide_number/* = true*/) : LLAvatarListItem(false)
+, mIsHideNumber(hide_number)
+{
+ // should not use buildPanel from the base class to ensure LLAvalineListItem::postBuild is called.
+ LLUICtrlFactory::getInstance()->buildPanel(this, "panel_avatar_list_item.xml");
+}
+
+BOOL LLAvalineListItem::postBuild()
+{
+ BOOL rv = LLAvatarListItem::postBuild();
+
+ if (rv)
+ {
+ setOnline(true);
+ showLastInteractionTime(false);
+ setShowProfileBtn(false);
+ setShowInfoBtn(false);
+ mAvatarIcon->setValue("Avaline_Icon");
+ mAvatarIcon->setToolTip(std::string(""));
+ }
+ return rv;
+}
+
+// to work correctly this method should be called AFTER setAvatarId for avaline callers with hidden phone number
+void LLAvalineListItem::setName(const std::string& name)
+{
+ if (mIsHideNumber)
+ {
+ static U32 order = 0;
+ typedef std::map<LLUUID, U32> avaline_callers_nums_t;
+ static avaline_callers_nums_t mAvalineCallersNums;
+
+ llassert(getAvatarId() != LLUUID::null);
+
+ const LLUUID &uuid = getAvatarId();
+
+ if (mAvalineCallersNums.find(uuid) == mAvalineCallersNums.end())
+ {
+ mAvalineCallersNums[uuid] = ++order;
+ LL_DEBUGS("Avaline") << "Set name for new avaline caller: " << uuid << ", order: " << order << LL_ENDL;
+ }
+ LLStringUtil::format_map_t args;
+ args["[ORDER]"] = llformat("%u", mAvalineCallersNums[uuid]);
+ std::string hidden_name = LLTrans::getString("AvalineCaller", args);
+
+ LL_DEBUGS("Avaline") << "Avaline caller: " << uuid << ", name: " << hidden_name << LL_ENDL;
+ LLAvatarListItem::setName(hidden_name);
+ }
+ else
+ {
+ const std::string& formatted_phone = LLTextUtil::formatPhoneNumber(name);
+ LLAvatarListItem::setName(formatted_phone);
+ }
+}
diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h
index aeed4fee08..fffc6e6e73 100644
--- a/indra/newview/llavatarlist.h
+++ b/indra/newview/llavatarlist.h
@@ -38,6 +38,7 @@
#include "llavatarlistitem.h"
class LLTimer;
+class LLListContextMenu;
/**
* Generic list of avatars.
@@ -49,13 +50,11 @@ class LLTimer;
* @see setDirty()
* @see setNameFilter()
*/
-class LLAvatarList : public LLFlatListView
+class LLAvatarList : public LLFlatListViewEx
{
LOG_CLASS(LLAvatarList);
public:
- typedef std::vector<LLUUID> uuid_vector_t;
-
- struct Params : public LLInitParam::Block<Params, LLFlatListView::Params>
+ struct Params : public LLInitParam::Block<Params, LLFlatListViewEx::Params>
{
Optional<bool> ignore_online_status, // show all items as online
show_last_interaction_time, // show most recent interaction time. *HACK: move this to a derived class
@@ -72,12 +71,16 @@ public:
virtual void clear();
+ virtual void setVisible(BOOL visible);
+
void setNameFilter(const std::string& filter);
- void setDirty(bool val = true) { mDirty = val; }
- uuid_vector_t& getIDs() { return mIDs; }
+ void setDirty(bool val = true, bool force_refresh = false);
+ uuid_vec_t& getIDs() { return mIDs; }
bool contains(const LLUUID& id);
- void setContextMenu(LLAvatarListItem::ContextMenu* menu) { mContextMenu = menu; }
+ void setContextMenu(LLListContextMenu* menu) { mContextMenu = menu; }
+ void setSessionID(const LLUUID& session_id) { mSessionID = session_id; }
+ const LLUUID& getSessionID() { return mSessionID; }
void toggleIcons();
void setSpeakingIndicatorsVisible(bool visible);
@@ -94,14 +97,18 @@ public:
boost::signals2::connection setItemDoubleClickCallback(const mouse_signal_t::slot_type& cb);
+ virtual S32 notifyParent(const LLSD& info);
+
+ void addAvalineItem(const LLUUID& item_id, const LLUUID& session_id, const std::string& item_name);
+
protected:
void refresh();
void addNewItem(const LLUUID& id, const std::string& name, BOOL is_online, EAddPosition pos = ADD_BOTTOM);
void computeDifference(
- const std::vector<LLUUID>& vnew,
- std::vector<LLUUID>& vadded,
- std::vector<LLUUID>& vremoved);
+ const uuid_vec_t& vnew,
+ uuid_vec_t& vadded,
+ uuid_vec_t& vremoved);
void updateLastInteractionTimes();
void onItemDoucleClicked(LLUICtrl* ctrl, S32 x, S32 y, MASK mask);
@@ -118,9 +125,10 @@ private:
LLTimer* mLITUpdateTimer; // last interaction time update timer
std::string mIconParamName;
std::string mNameFilter;
- uuid_vector_t mIDs;
+ uuid_vec_t mIDs;
+ LLUUID mSessionID;
- LLAvatarListItem::ContextMenu* mContextMenu;
+ LLListContextMenu* mContextMenu;
commit_signal_t mRefreshCompleteSignal;
mouse_signal_t mItemDoubleClickSignal;
@@ -172,4 +180,27 @@ protected:
virtual bool doCompare(const LLAvatarListItem* avatar_item1, const LLAvatarListItem* avatar_item2) const;
};
+/**
+ * Represents Avaline caller in Avatar list in Voice Control Panel and group chats.
+ */
+class LLAvalineListItem : public LLAvatarListItem
+{
+public:
+
+ /**
+ * Constructor
+ *
+ * @param hide_number - flag indicating if number should be hidden.
+ * In this case It will be shown as "Avaline Caller 1", "Avaline Caller 1", etc.
+ */
+ LLAvalineListItem(bool hide_number = true);
+
+ /*virtual*/ BOOL postBuild();
+
+ /*virtual*/ void setName(const std::string& name);
+
+private:
+ bool mIsHideNumber;
+};
+
#endif // LL_LLAVATARLIST_H
diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp
index 846b2843dd..c74075d67f 100644
--- a/indra/newview/llavatarlistitem.cpp
+++ b/indra/newview/llavatarlistitem.cpp
@@ -1,6 +1,6 @@
/**
* @file llavatarlistitem.cpp
- * @avatar list item source file
+ * @brief avatar list item source file
*
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
@@ -36,12 +36,13 @@
#include "llavataractions.h"
#include "llavatarlistitem.h"
+#include "llbutton.h"
#include "llfloaterreg.h"
+#include "lltextutil.h"
+
#include "llagent.h"
-#include "lloutputmonitorctrl.h"
#include "llavatariconctrl.h"
-#include "lltextutil.h"
-#include "llbutton.h"
+#include "lloutputmonitorctrl.h"
bool LLAvatarListItem::sStaticInitialized = false;
S32 LLAvatarListItem::sLeftPadding = 0;
@@ -119,8 +120,9 @@ S32 LLAvatarListItem::notifyParent(const LLSD& info)
if (info.has("visibility_changed"))
{
updateChildren();
+ return 1;
}
- return 0;
+ return LLPanel::notifyParent(info);
}
void LLAvatarListItem::onMouseEnter(S32 x, S32 y, MASK mask)
@@ -211,21 +213,25 @@ void LLAvatarListItem::setState(EItemState item_style)
mAvatarIcon->setColor(item_icon_color_map[item_style]);
}
-void LLAvatarListItem::setAvatarId(const LLUUID& id, bool ignore_status_changes)
+void LLAvatarListItem::setAvatarId(const LLUUID& id, const LLUUID& session_id, bool ignore_status_changes/* = false*/, bool is_resident/* = true*/)
{
if (mAvatarId.notNull())
LLAvatarTracker::instance().removeParticularFriendObserver(mAvatarId, this);
mAvatarId = id;
- mAvatarIcon->setValue(id);
- mSpeakingIndicator->setSpeakerId(id);
+ mSpeakingIndicator->setSpeakerId(id, session_id);
// We'll be notified on avatar online status changes
if (!ignore_status_changes && mAvatarId.notNull())
LLAvatarTracker::instance().addParticularFriendObserver(mAvatarId, this);
- // Set avatar name.
- gCacheName->get(id, FALSE, boost::bind(&LLAvatarListItem::onNameCache, this, _2, _3));
+ if (is_resident)
+ {
+ mAvatarIcon->setValue(id);
+
+ // Set avatar name.
+ gCacheName->get(id, FALSE, boost::bind(&LLAvatarListItem::onNameCache, this, _2, _3));
+ }
}
void LLAvatarListItem::showLastInteractionTime(bool show)
@@ -334,6 +340,9 @@ void LLAvatarListItem::onNameCache(const std::string& first_name, const std::str
{
std::string name = first_name + " " + last_name;
setName(name);
+
+ //requesting the list to resort
+ notifyParent(LLSD().with("sort", LLSD()));
}
// Convert given number of seconds to a string like "23 minutes", "15 hours" or "3 years",
@@ -526,21 +535,30 @@ void LLAvatarListItem::updateChildren()
LLView* LLAvatarListItem::getItemChildView(EAvatarListItemChildIndex child_view_index)
{
LLView* child_view = mAvatarName;
- if (child_view_index < 0 || ALIC_COUNT <= child_view_index)
- {
- LL_WARNS("AvatarItemReshape") << "Child view index is out of range: " << child_view_index << LL_ENDL;
- return child_view;
- }
+
switch (child_view_index)
{
- case ALIC_ICON: child_view = mAvatarIcon; break;
- case ALIC_NAME: child_view = mAvatarName; break;
- case ALIC_INTERACTION_TIME: child_view = mLastInteractionTime; break;
- case ALIC_SPEAKER_INDICATOR: child_view = mSpeakingIndicator; break;
- case ALIC_INFO_BUTTON: child_view = mInfoBtn; break;
- case ALIC_PROFILE_BUTTON: child_view = mProfileBtn; break;
+ case ALIC_ICON:
+ child_view = mAvatarIcon;
+ break;
+ case ALIC_NAME:
+ child_view = mAvatarName;
+ break;
+ case ALIC_INTERACTION_TIME:
+ child_view = mLastInteractionTime;
+ break;
+ case ALIC_SPEAKER_INDICATOR:
+ child_view = mSpeakingIndicator;
+ break;
+ case ALIC_INFO_BUTTON:
+ child_view = mInfoBtn;
+ break;
+ case ALIC_PROFILE_BUTTON:
+ child_view = mProfileBtn;
+ break;
default:
LL_WARNS("AvatarItemReshape") << "Unexpected child view index is passed: " << child_view_index << LL_ENDL;
+ // leave child_view untouched
}
return child_view;
diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h
index 426d80e0a8..ba9c3574d5 100644
--- a/indra/newview/llavatarlistitem.h
+++ b/indra/newview/llavatarlistitem.h
@@ -1,6 +1,6 @@
/**
* @file llavatarlistitem.h
- * @avatar list item header file
+ * @brief avatar list item header file
*
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
@@ -67,12 +67,6 @@ public:
IS_OFFLINE,
} EItemState;
- class ContextMenu
- {
- public:
- virtual void show(LLView* spawning_view, const std::vector<LLUUID>& selected_uuids, S32 x, S32 y) = 0;
- };
-
/**
* Creates an instance of LLAvatarListItem.
*
@@ -100,7 +94,7 @@ public:
void setName(const std::string& name);
void setHighlight(const std::string& highlight);
void setState(EItemState item_style);
- void setAvatarId(const LLUUID& id, bool ignore_status_changes = false);
+ void setAvatarId(const LLUUID& id, const LLUUID& session_id, bool ignore_status_changes = false, bool is_resident = true);
void setLastInteractionTime(U32 secs_since);
//Show/hide profile/info btn, translating speaker indicator and avatar name coordinates accordingly
void setShowProfileBtn(bool show);
diff --git a/indra/newview/llavatarpropertiesprocessor.cpp b/indra/newview/llavatarpropertiesprocessor.cpp
index 33e5046f50..c7e788f345 100644
--- a/indra/newview/llavatarpropertiesprocessor.cpp
+++ b/indra/newview/llavatarpropertiesprocessor.cpp
@@ -37,6 +37,7 @@
// Viewer includes
#include "llagent.h"
#include "llagentpicksinfo.h"
+#include "lldateutil.h"
#include "llviewergenericmessage.h"
// Linden library includes
@@ -246,6 +247,7 @@ std::string LLAvatarPropertiesProcessor::paymentInfo(const LLAvatarData* avatar_
void LLAvatarPropertiesProcessor::processAvatarPropertiesReply(LLMessageSystem* msg, void**)
{
LLAvatarData avatar_data;
+ std::string birth_date;
msg->getUUIDFast( _PREHASH_AgentData, _PREHASH_AgentID, avatar_data.agent_id);
msg->getUUIDFast( _PREHASH_AgentData, _PREHASH_AvatarID, avatar_data.avatar_id);
@@ -254,11 +256,12 @@ void LLAvatarPropertiesProcessor::processAvatarPropertiesReply(LLMessageSystem*
msg->getUUIDFast( _PREHASH_PropertiesData, _PREHASH_PartnerID, avatar_data.partner_id);
msg->getStringFast( _PREHASH_PropertiesData, _PREHASH_AboutText, avatar_data.about_text);
msg->getStringFast( _PREHASH_PropertiesData, _PREHASH_FLAboutText, avatar_data.fl_about_text);
- msg->getStringFast( _PREHASH_PropertiesData, _PREHASH_BornOn, avatar_data.born_on);
+ msg->getStringFast( _PREHASH_PropertiesData, _PREHASH_BornOn, birth_date);
msg->getString( _PREHASH_PropertiesData, _PREHASH_ProfileURL, avatar_data.profile_url);
msg->getU32Fast( _PREHASH_PropertiesData, _PREHASH_Flags, avatar_data.flags);
+ LLDateUtil::dateFromPDTString(avatar_data.born_on, birth_date);
avatar_data.caption_index = 0;
S32 charter_member_size = 0;
diff --git a/indra/newview/llavatarpropertiesprocessor.h b/indra/newview/llavatarpropertiesprocessor.h
index 716c1b8065..b9e8bfd0ab 100644
--- a/indra/newview/llavatarpropertiesprocessor.h
+++ b/indra/newview/llavatarpropertiesprocessor.h
@@ -67,7 +67,7 @@ struct LLAvatarData
LLUUID partner_id;
std::string about_text;
std::string fl_about_text;
- std::string born_on;
+ LLDate born_on;
std::string profile_url;
U8 caption_index;
std::string caption_text;
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index 93b708f299..41f5fe64a1 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -35,20 +35,32 @@
#define LLBOTTOMTRAY_CPP
#include "llbottomtray.h"
-#include "llagent.h"
-#include "llchiclet.h"
+// library includes
#include "llfloaterreg.h"
#include "llflyoutbutton.h"
-#include "llimfloater.h" // for LLIMFloater
#include "lllayoutstack.h"
-#include "llnearbychatbar.h"
+#include "llnotifications.h"
#include "llnotificationsutil.h"
+#include "lltexteditor.h"
+
+// newview includes
+#include "llagentcamera.h"
+#include "llchiclet.h"
+#include "llfloatercamera.h"
+#include "llimfloater.h" // for LLIMFloater
+#include "llnearbychatbar.h"
#include "llspeakbutton.h"
#include "llsplitbutton.h"
#include "llsyswellwindow.h"
-#include "llfloatercamera.h"
-#include "lltexteditor.h"
-#include "llnotifications.h"
+#include "lltoolmgr.h"
+#include "llviewerparcelmgr.h"
+
+static void update_build_button_enable_state()
+{
+ bool can_edit = LLToolMgr::getInstance()->canEdit();
+
+ LLBottomTray::getInstance()->childSetEnabled("build_btn", can_edit);
+}
// Build time optimization, generate extern template once in .cpp file
template class LLBottomTray* LLSingleton<class LLBottomTray>::getInstance();
@@ -60,6 +72,38 @@ namespace
const std::string& PANEL_MOVEMENT_NAME = "movement_panel";
const std::string& PANEL_CAMERA_NAME = "cam_panel";
const std::string& PANEL_GESTURE_NAME = "gesture_panel";
+
+ S32 get_panel_min_width(LLLayoutStack* stack, LLView* panel)
+ {
+ S32 minimal_width = 0;
+ llassert(stack);
+ if ( stack && panel && panel->getVisible() )
+ {
+ stack->getPanelMinSize(panel->getName(), &minimal_width, NULL);
+ }
+ return minimal_width;
+ }
+
+ S32 get_panel_max_width(LLLayoutStack* stack, LLPanel* panel)
+ {
+ S32 max_width = 0;
+ llassert(stack);
+ if ( stack && panel && panel->getVisible() )
+ {
+ stack->getPanelMaxSize(panel->getName(), &max_width, NULL);
+ }
+ return max_width;
+ }
+
+ S32 get_curr_width(LLUICtrl* ctrl)
+ {
+ S32 cur_width = 0;
+ if ( ctrl && ctrl->getVisible() )
+ {
+ cur_width = ctrl->getRect().getWidth();
+ }
+ return cur_width;
+ }
}
class LLBottomTrayLite
@@ -93,7 +137,7 @@ public:
void onFocusLost()
{
- if (gAgent.cameraMouselook())
+ if (gAgentCamera.cameraMouselook())
{
LLBottomTray::getInstance()->setVisible(FALSE);
}
@@ -112,10 +156,6 @@ LLBottomTray::LLBottomTray(const LLSD&)
, mMovementButton(NULL)
, mResizeState(RS_NORESIZE)
, mBottomTrayContextMenu(NULL)
-, mMovementPanel(NULL)
-, mCamPanel(NULL)
-, mSnapshotPanel(NULL)
-, mGesturePanel(NULL)
, mCamButton(NULL)
, mBottomTrayLite(NULL)
, mIsInLiteMode(false)
@@ -128,19 +168,13 @@ LLBottomTray::LLBottomTray(const LLSD&)
LLUICtrlFactory::getInstance()->buildPanel(this,"panel_bottomtray.xml");
- mChicletPanel = getChild<LLChicletPanel>("chiclet_list");
-
- mChicletPanel->setChicletClickedCallback(boost::bind(&LLBottomTray::onChicletClick,this,_1));
-
- LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraPresets, _2));
+ LLUICtrl::CommitCallbackRegistry::defaultRegistrar().add("CameraPresets.ChangeView", boost::bind(&LLFloaterCamera::onClickCameraItem, _2));
//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
//destroyed LLBottomTray requires some subsystems that are long gone
//LLUI::getRootView()->addChild(this);
- initStateProcessedObjectMap();
-
// Necessary for focus movement among child controls
setFocusRoot(TRUE);
@@ -157,24 +191,21 @@ LLBottomTray::~LLBottomTray()
{
LLIMMgr::getInstance()->removeSessionObserver(this);
}
-}
-void LLBottomTray::onChicletClick(LLUICtrl* ctrl)
-{
- LLIMChiclet* chiclet = dynamic_cast<LLIMChiclet*>(ctrl);
- if (chiclet)
+ if (mNearbyChatBar)
{
- // Until you can type into an IM Window and have a conversation,
- // still show the old communicate window
- //LLFloaterReg::showInstance("communicate", chiclet->getSessionId());
-
- // Show after comm window so it is frontmost (and hence will not
- // auto-hide)
-
-// this logic has been moved to LLIMChiclet::handleMouseDown
-// LLIMFloater::show(chiclet->getSessionId());
-// chiclet->setCounter(0);
+ // store custom width of chatbar panel.
+ S32 custom_width = mNearbyChatBar->getRect().getWidth();
+ gSavedSettings.setS32("ChatBarCustomWidth", custom_width);
}
+
+ // emulate previous floater behavior to be hidden on startup.
+ // override effect of save_visibility=true.
+ // this attribute is necessary to button.initial_callback=Button.SetFloaterToggle works properly:
+ // i.g when floater changes its visibility - button changes its toggle state.
+ getChild<LLUICtrl>("build_btn")->setControlValue(false);
+ getChild<LLUICtrl>("search_btn")->setControlValue(false);
+ getChild<LLUICtrl>("world_map_btn")->setControlValue(false);
}
// *TODO Vadim: why void* ?
@@ -293,7 +324,7 @@ void LLBottomTray::onChange(EStatusType status, const std::string &channelURI, b
// skipped to avoid button blinking
if (status != STATUS_JOINING && status!= STATUS_LEFT_CHANNEL)
{
- mSpeakBtn->setFlyoutBtnEnabled(LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking());
+ mSpeakBtn->setFlyoutBtnEnabled(LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking());
}
}
@@ -329,7 +360,7 @@ void LLBottomTray::setVisible(BOOL visible)
{
mBottomTrayLite->setVisible(visible);
}
- else
+ else
{
LLPanel::setVisible(visible);
}
@@ -339,6 +370,37 @@ void LLBottomTray::setVisible(BOOL visible)
gFloaterView->setSnapOffsetBottom(0);
}
+S32 LLBottomTray::notifyParent(const LLSD& info)
+{
+ if(info.has("well_empty")) // implementation of EXT-3397
+ {
+ const std::string chiclet_name = info["well_name"];
+
+ // only "im_well" or "notification_well" names are expected.
+ // They are set in panel_bottomtray.xml in <chiclet_im_well> & <chiclet_notification>
+ llassert("im_well" == chiclet_name || "notification_well" == chiclet_name);
+
+ BOOL should_be_visible = !info["well_empty"];
+ showWellButton("im_well" == chiclet_name ? RS_IM_WELL : RS_NOTIFICATION_WELL, should_be_visible);
+ return 1;
+ }
+
+ if (info.has("action") && info["action"] == "resize")
+ {
+ const std::string& name = info["view_name"];
+
+ // expected only resize of nearby chatbar
+ if (mNearbyChatBar->getName() != name) return LLPanel::notifyParent(info);
+
+ const S32 new_width = info["new_width"];
+
+ processChatbarCustomization(new_width);
+
+ return 2;
+ }
+ return LLPanel::notifyParent(info);
+}
+
void LLBottomTray::showBottomTrayContextMenu(S32 x, S32 y, MASK mask)
{
// We should show BottomTrayContextMenu in last turn
@@ -363,22 +425,12 @@ void LLBottomTray::updateContextMenu(S32 x, S32 y, MASK mask)
bool in_edit_box = edit_box->pointInView(local_x, local_y);
- LLMenuItemGL* menu_item;
- menu_item = mBottomTrayContextMenu->findChild<LLMenuItemGL>("NearbyChatBar_Cut");
- if(menu_item)
- menu_item->setVisible(in_edit_box);
- menu_item = mBottomTrayContextMenu->findChild<LLMenuItemGL>("NearbyChatBar_Copy");
- if(menu_item)
- menu_item->setVisible(in_edit_box);
- menu_item = mBottomTrayContextMenu->findChild<LLMenuItemGL>("NearbyChatBar_Paste");
- if(menu_item)
- menu_item->setVisible(in_edit_box);
- menu_item = mBottomTrayContextMenu->findChild<LLMenuItemGL>("NearbyChatBar_Delete");
- if(menu_item)
- menu_item->setVisible(in_edit_box);
- menu_item = mBottomTrayContextMenu->findChild<LLMenuItemGL>("NearbyChatBar_Select_All");
- if(menu_item)
- menu_item->setVisible(in_edit_box);
+ mBottomTrayContextMenu->setItemVisible("Separator", in_edit_box);
+ mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Cut", in_edit_box);
+ mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Copy", in_edit_box);
+ mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Paste", in_edit_box);
+ mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Delete", in_edit_box);
+ mBottomTrayContextMenu->setItemVisible("NearbyChatBar_Select_All", in_edit_box);
}
void LLBottomTray::showGestureButton(BOOL visible)
@@ -401,6 +453,18 @@ void LLBottomTray::showSnapshotButton(BOOL visible)
setTrayButtonVisibleIfPossible(RS_BUTTON_SNAPSHOT, visible);
}
+void LLBottomTray::toggleMovementControls()
+{
+ if (mMovementButton)
+ mMovementButton->onCommit();
+}
+
+void LLBottomTray::toggleCameraControls()
+{
+ if (mCamButton)
+ mCamButton->onCommit();
+}
+
BOOL LLBottomTray::postBuild()
{
@@ -413,12 +477,8 @@ BOOL LLBottomTray::postBuild()
mNearbyChatBar = getChild<LLNearbyChatBar>("chat_bar");
mToolbarStack = getChild<LLLayoutStack>("toolbar_stack");
- mMovementPanel = getChild<LLPanel>("movement_panel");
- mMovementButton = mMovementPanel->getChild<LLButton>("movement_btn");
- mGesturePanel = getChild<LLPanel>("gesture_panel");
- mCamPanel = getChild<LLPanel>("cam_panel");
- mCamButton = mCamPanel->getChild<LLButton>("camera_btn");
- mSnapshotPanel = getChild<LLPanel>("snapshot_panel");
+ mMovementButton = getChild<LLButton>("movement_btn");
+ mCamButton = getChild<LLButton>("camera_btn");
setRightMouseDownCallback(boost::bind(&LLBottomTray::showBottomTrayContextMenu,this, _2, _3,_4));
mSpeakPanel = getChild<LLPanel>("speak_panel");
@@ -434,15 +494,24 @@ BOOL LLBottomTray::postBuild()
mSpeakBtn->setShowToolTip( getString("VoiceControlBtnToolTip") );
// Registering Chat Bar to receive Voice client status change notifications.
- gVoiceClient->addObserver(this);
-
- mObjectDefaultWidthMap[RS_BUTTON_GESTURES] = mGesturePanel->getRect().getWidth();
- mObjectDefaultWidthMap[RS_BUTTON_MOVEMENT] = mMovementPanel->getRect().getWidth();
- mObjectDefaultWidthMap[RS_BUTTON_CAMERA] = mCamPanel->getRect().getWidth();
- mObjectDefaultWidthMap[RS_BUTTON_SPEAK] = mSpeakPanel->getRect().getWidth();
+ LLVoiceClient::getInstance()->addObserver(this);
mNearbyChatBar->getChatBox()->setContextMenu(NULL);
+ mChicletPanel = getChild<LLChicletPanel>("chiclet_list");
+
+ initResizeStateContainers();
+
+ setButtonsControlsAndListeners();
+
+ initButtonsVisibility();
+
+ // update wells visibility:
+ showWellButton(RS_IM_WELL, !LLIMWellWindow::getInstance()->isWindowEmpty());
+ showWellButton(RS_NOTIFICATION_WELL, !LLNotificationWellWindow::getInstance()->isWindowEmpty());
+
+ LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(boost::bind(&update_build_button_enable_state));
+
return TRUE;
}
@@ -604,6 +673,24 @@ void LLBottomTray::reshape(S32 width, S32 height, BOOL called_from_parent)
if (mNearbyChatBar) log(mNearbyChatBar, "after");
if (mChicletPanel) log(mChicletPanel, "after");
+
+
+ // Restore width of the chatbar on first reshape.
+ // we can not to do this from postBuild because reshape is called from parent view on startup
+ // creation after it and reset width according to resize logic.
+ static bool needs_restore_custom_state = true;
+ if (mNearbyChatBar && needs_restore_custom_state)
+ {
+ // restore custom width of chatbar panel.
+ S32 new_width = gSavedSettings.getS32("ChatBarCustomWidth");
+ if (new_width > 0)
+ {
+ processChatbarCustomization(new_width);
+ mNearbyChatBar->reshape(new_width, mNearbyChatBar->getRect().getHeight());
+ }
+ needs_restore_custom_state = false;
+ }
+
}
S32 LLBottomTray::processWidthDecreased(S32 delta_width)
@@ -639,7 +726,7 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width)
}
const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth();
- const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth();
+ const S32 chatbar_panel_min_width = get_panel_min_width(mToolbarStack, mNearbyChatBar);
if (still_should_be_processed && chatbar_panel_width > chatbar_panel_min_width)
{
// we have some space to decrease chatbar panel
@@ -666,27 +753,9 @@ S32 LLBottomTray::processWidthDecreased(S32 delta_width)
S32 buttons_freed_width = 0;
if (still_should_be_processed)
{
- processShrinkButtons(&delta_width, &buttons_freed_width);
+ processShrinkButtons(delta_width, buttons_freed_width);
- if (delta_width < 0)
- {
- processHideButton(RS_BUTTON_SNAPSHOT, &delta_width, &buttons_freed_width);
- }
-
- if (delta_width < 0)
- {
- processHideButton(RS_BUTTON_CAMERA, &delta_width, &buttons_freed_width);
- }
-
- if (delta_width < 0)
- {
- processHideButton(RS_BUTTON_MOVEMENT, &delta_width, &buttons_freed_width);
- }
-
- if (delta_width < 0)
- {
- processHideButton(RS_BUTTON_GESTURES, &delta_width, &buttons_freed_width);
- }
+ processHideButtons(delta_width, buttons_freed_width);
if (delta_width < 0)
{
@@ -712,11 +781,11 @@ void LLBottomTray::processWidthIncreased(S32 delta_width)
if (delta_width <= 0) return;
const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth();
- const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth();
+ static const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth();
const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth();
- const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth();
- const S32 chatbar_panel_max_width = mNearbyChatBar->getMaxWidth();
+ static const S32 chatbar_panel_min_width = get_panel_min_width(mToolbarStack, mNearbyChatBar);
+ static const S32 chatbar_panel_max_width = get_panel_max_width(mToolbarStack, mNearbyChatBar);
const S32 chatbar_available_shrink_width = chatbar_panel_width - chatbar_panel_min_width;
const S32 available_width_chiclet = chiclet_panel_width - chiclet_panel_min_width;
@@ -731,27 +800,10 @@ void LLBottomTray::processWidthIncreased(S32 delta_width)
<< llendl;
S32 available_width = total_available_width;
- if (available_width > 0)
- {
- processShowButton(RS_BUTTON_GESTURES, &available_width);
- }
- if (available_width > 0)
- {
- processShowButton(RS_BUTTON_MOVEMENT, &available_width);
- }
-
- if (available_width > 0)
- {
- processShowButton(RS_BUTTON_CAMERA, &available_width);
- }
-
- if (available_width > 0)
- {
- processShowButton(RS_BUTTON_SNAPSHOT, &available_width);
- }
+ processShowButtons(available_width);
- processExtendButtons(&available_width);
+ processExtendButtons(available_width);
// if we have to show/extend some buttons but resized delta width is not enough...
S32 processed_width = total_available_width - available_width;
@@ -808,9 +860,26 @@ void LLBottomTray::processWidthIncreased(S32 delta_width)
}
}
-bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* available_width)
+void LLBottomTray::processShowButtons(S32& available_width)
+{
+ // process buttons from left to right
+ resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin();
+ const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end();
+
+ for (; it != it_end; ++it)
+ {
+ // is there available space?
+ if (available_width <= 0) break;
+
+ // try to show next button
+ processShowButton(*it, available_width);
+ }
+}
+
+bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32& available_width)
{
lldebugs << "Trying to show object type: " << shown_object_type << llendl;
+ llassert(mStateProcessedObjectMap[shown_object_type] != NULL);
LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
if (NULL == panel)
@@ -823,15 +892,15 @@ bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* availa
{
//validate if we have enough room to show this button
const S32 required_width = panel->getRect().getWidth();
- can_be_shown = *available_width >= required_width;
+ can_be_shown = available_width >= required_width;
if (can_be_shown)
{
- *available_width -= required_width;
+ available_width -= required_width;
setTrayButtonVisible(shown_object_type, true);
lldebugs << "processed object type: " << shown_object_type
- << ", rest available width: " << *available_width
+ << ", rest available width: " << available_width
<< llendl;
mResizeState &= ~shown_object_type;
}
@@ -839,9 +908,26 @@ bool LLBottomTray::processShowButton(EResizeState shown_object_type, S32* availa
return can_be_shown;
}
-void LLBottomTray::processHideButton(EResizeState processed_object_type, S32* required_width, S32* buttons_freed_width)
+void LLBottomTray::processHideButtons(S32& required_width, S32& buttons_freed_width)
+{
+ // process buttons from right to left
+ resize_state_vec_t::const_reverse_iterator it = mButtonsProcessOrder.rbegin();
+ const resize_state_vec_t::const_reverse_iterator it_end = mButtonsProcessOrder.rend();
+
+ for (; it != it_end; ++it)
+ {
+ // is it still necessary to hide a button?
+ if (required_width >= 0) break;
+
+ // try to hide next button
+ processHideButton(*it, required_width, buttons_freed_width);
+ }
+}
+
+void LLBottomTray::processHideButton(EResizeState processed_object_type, S32& required_width, S32& buttons_freed_width)
{
lldebugs << "Trying to hide object type: " << processed_object_type << llendl;
+ llassert(mStateProcessedObjectMap[processed_object_type] != NULL);
LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
if (NULL == panel)
@@ -852,11 +938,11 @@ void LLBottomTray::processHideButton(EResizeState processed_object_type, S32* re
if (panel->getVisible())
{
- *required_width += panel->getRect().getWidth();
+ required_width += panel->getRect().getWidth();
- if (*required_width > 0)
+ if (required_width > 0)
{
- *buttons_freed_width += *required_width;
+ buttons_freed_width += required_width;
}
setTrayButtonVisible(processed_object_type, false);
@@ -864,24 +950,29 @@ void LLBottomTray::processHideButton(EResizeState processed_object_type, S32* re
mResizeState |= processed_object_type;
lldebugs << "processing object type: " << processed_object_type
- << ", buttons_freed_width: " << *buttons_freed_width
+ << ", buttons_freed_width: " << buttons_freed_width
<< llendl;
}
}
-void LLBottomTray::processShrinkButtons(S32* required_width, S32* buttons_freed_width)
+void LLBottomTray::processShrinkButtons(S32& required_width, S32& buttons_freed_width)
{
- processShrinkButton(RS_BUTTON_CAMERA, required_width);
+ // process buttons from right to left
+ resize_state_vec_t::const_reverse_iterator it = mButtonsProcessOrder.rbegin();
+ const resize_state_vec_t::const_reverse_iterator it_end = mButtonsProcessOrder.rend();
- if (*required_width < 0)
- {
- processShrinkButton(RS_BUTTON_MOVEMENT, required_width);
- }
- if (*required_width < 0)
+ // iterate through buttons in the mButtonsProcessOrder first
+ for (; it != it_end; ++it)
{
- processShrinkButton(RS_BUTTON_GESTURES, required_width);
+ // is it still necessary to hide a button?
+ if (required_width >= 0) break;
+
+ // try to shrink next button
+ processShrinkButton(*it, required_width);
}
- if (*required_width < 0)
+
+ // then shrink Speak button
+ if (required_width < 0)
{
S32 panel_min_width = 0;
@@ -893,33 +984,33 @@ void LLBottomTray::processShrinkButtons(S32* required_width, S32* buttons_freed_
}
else
{
- //
- mSpeakBtn->setLabelVisible(false);
S32 panel_width = mSpeakPanel->getRect().getWidth();
S32 possible_shrink_width = panel_width - panel_min_width;
if (possible_shrink_width > 0)
{
+ mSpeakBtn->setLabelVisible(false);
mSpeakPanel->reshape(panel_width - possible_shrink_width, mSpeakPanel->getRect().getHeight());
- *required_width += possible_shrink_width;
+ required_width += possible_shrink_width;
- if (*required_width > 0)
+ if (required_width > 0)
{
- *buttons_freed_width += *required_width;
+ buttons_freed_width += required_width;
}
- lldebugs << "Shrunk panel: " << panel_name
+ lldebugs << "Shrunk Speak button panel: " << panel_name
<< ", shrunk width: " << possible_shrink_width
- << ", rest width to process: " << *required_width
+ << ", rest width to process: " << required_width
<< llendl;
}
}
}
}
-void LLBottomTray::processShrinkButton(EResizeState processed_object_type, S32* required_width)
+void LLBottomTray::processShrinkButton(EResizeState processed_object_type, S32& required_width)
{
+ llassert(mStateProcessedObjectMap[processed_object_type] != NULL);
LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
if (NULL == panel)
{
@@ -945,64 +1036,70 @@ void LLBottomTray::processShrinkButton(EResizeState processed_object_type, S32*
// let calculate real width to shrink
// 1. apply all possible width
- *required_width += possible_shrink_width;
+ required_width += possible_shrink_width;
// 2. it it is too much...
- if (*required_width > 0)
+ if (required_width > 0)
{
// reduce applied shrunk width to the excessive value.
- possible_shrink_width -= *required_width;
- *required_width = 0;
+ possible_shrink_width -= required_width;
+ required_width = 0;
}
panel->reshape(panel_width - possible_shrink_width, panel->getRect().getHeight());
lldebugs << "Shrunk panel: " << panel_name
<< ", shrunk width: " << possible_shrink_width
- << ", rest width to process: " << *required_width
+ << ", rest width to process: " << required_width
<< llendl;
}
}
}
-void LLBottomTray::processExtendButtons(S32* available_width)
+void LLBottomTray::processExtendButtons(S32& available_width)
{
- // do not allow extending any buttons if we have some buttons hidden
+ // do not allow extending any buttons if we have some buttons hidden via resize
if (mResizeState & RS_BUTTONS_CAN_BE_HIDDEN) return;
- processExtendButton(RS_BUTTON_GESTURES, available_width);
+ // process buttons from left to right
+ resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin();
+ const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end();
- if (*available_width > 0)
+ // iterate through buttons in the mButtonsProcessOrder first
+ for (; it != it_end; ++it)
{
- processExtendButton(RS_BUTTON_CAMERA, available_width);
- }
- if (*available_width > 0)
- {
- processExtendButton(RS_BUTTON_MOVEMENT, available_width);
+ // is there available space?
+ if (available_width <= 0) break;
+
+ // try to extend next button
+ processExtendButton(*it, available_width);
}
- if (*available_width > 0)
+
+ // then try to extend Speak button
+ if (available_width > 0)
{
S32 panel_max_width = mObjectDefaultWidthMap[RS_BUTTON_SPEAK];
S32 panel_width = mSpeakPanel->getRect().getWidth();
S32 possible_extend_width = panel_max_width - panel_width;
- if (possible_extend_width > 0 && possible_extend_width <= *available_width)
+ if (possible_extend_width >= 0 && possible_extend_width <= available_width) // HACK: this button doesn't change size so possible_extend_width will be 0
{
mSpeakBtn->setLabelVisible(true);
mSpeakPanel->reshape(panel_max_width, mSpeakPanel->getRect().getHeight());
log(mSpeakBtn, "speak button is extended");
- *available_width -= possible_extend_width;
+ available_width -= possible_extend_width;
- lldebugs << "Extending panel: " << mSpeakPanel->getName()
+ lldebugs << "Extending Speak button panel: " << mSpeakPanel->getName()
<< ", extended width: " << possible_extend_width
- << ", rest width to process: " << *available_width
+ << ", rest width to process: " << available_width
<< llendl;
}
}
}
-void LLBottomTray::processExtendButton(EResizeState processed_object_type, S32* available_width)
+void LLBottomTray::processExtendButton(EResizeState processed_object_type, S32& available_width)
{
+ llassert(mStateProcessedObjectMap[processed_object_type] != NULL);
LLPanel* panel = mStateProcessedObjectMap[processed_object_type];
if (NULL == panel)
{
@@ -1021,68 +1118,142 @@ void LLBottomTray::processExtendButton(EResizeState processed_object_type, S32*
// let calculate real width to extend
// 1. apply all possible width
- *available_width -= possible_extend_width;
+ available_width -= possible_extend_width;
// 2. it it is too much...
- if (*available_width < 0)
+ if (available_width < 0)
{
// reduce applied extended width to the excessive value.
- possible_extend_width += *available_width;
- *available_width = 0;
+ possible_extend_width += available_width;
+ available_width = 0;
}
panel->reshape(panel_width + possible_extend_width, panel->getRect().getHeight());
lldebugs << "Extending panel: " << panel->getName()
<< ", extended width: " << possible_extend_width
- << ", rest width to process: " << *available_width
+ << ", rest width to process: " << available_width
<< llendl;
}
}
bool LLBottomTray::canButtonBeShown(EResizeState processed_object_type) const
{
+ // 0. Check if passed button was previously hidden on resize
bool can_be_shown = mResizeState & processed_object_type;
if (can_be_shown)
{
- static MASK MOVEMENT_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES;
- static MASK CAMERA_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES | RS_BUTTON_MOVEMENT;
- static MASK SNAPSHOT_PREVIOUS_BUTTONS_MASK = RS_BUTTON_GESTURES | RS_BUTTON_MOVEMENT | RS_BUTTON_CAMERA;
+ // Yes, it was. Lets now check that all buttons before it (that can be hidden on resize)
+ // are already shown
+
+ // process buttons in direct order (from left to right)
+ resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin();
+ const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end();
- switch(processed_object_type)
+ // 1. Find and accumulate all buttons types before one passed into the method.
+ MASK buttons_before_mask = RS_NORESIZE;
+ for (; it != it_end; ++it)
{
- case RS_BUTTON_GESTURES: // Gestures should be shown first
- break;
- case RS_BUTTON_MOVEMENT: // Move only if gesture is shown
- can_be_shown = !(MOVEMENT_PREVIOUS_BUTTONS_MASK & mResizeState);
- break;
- case RS_BUTTON_CAMERA:
- can_be_shown = !(CAMERA_PREVIOUS_BUTTONS_MASK & mResizeState);
- break;
- case RS_BUTTON_SNAPSHOT:
- can_be_shown = !(SNAPSHOT_PREVIOUS_BUTTONS_MASK & mResizeState);
- break;
- default: // nothing to do here
- break;
+ const EResizeState button_type = *it;
+ if (button_type == processed_object_type) break;
+
+ buttons_before_mask |= button_type;
}
+
+ // 2. Check if some previous buttons are still hidden on resize
+ can_be_shown = !(buttons_before_mask & mResizeState);
}
return can_be_shown;
}
-void LLBottomTray::initStateProcessedObjectMap()
+void LLBottomTray::initResizeStateContainers()
+{
+ // init map with objects should be processed for each type
+ mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_GESTURES, getChild<LLPanel>("gesture_panel")));
+ mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, getChild<LLPanel>("movement_panel")));
+ mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_CAMERA, getChild<LLPanel>("cam_panel")));
+ mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SNAPSHOT, getChild<LLPanel>("snapshot_panel")));
+ mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_BUILD, getChild<LLPanel>("build_btn_panel")));
+ mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SEARCH, getChild<LLPanel>("search_btn_panel")));
+ mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_WORLD_MAP, getChild<LLPanel>("world_map_btn_panel")));
+ mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MINI_MAP, getChild<LLPanel>("mini_map_btn_panel")));
+
+ // init an order of processed buttons
+ mButtonsProcessOrder.push_back(RS_BUTTON_GESTURES);
+ mButtonsProcessOrder.push_back(RS_BUTTON_MOVEMENT);
+ mButtonsProcessOrder.push_back(RS_BUTTON_CAMERA);
+ mButtonsProcessOrder.push_back(RS_BUTTON_SNAPSHOT);
+ mButtonsProcessOrder.push_back(RS_BUTTON_BUILD);
+ mButtonsProcessOrder.push_back(RS_BUTTON_SEARCH);
+ mButtonsProcessOrder.push_back(RS_BUTTON_WORLD_MAP);
+ mButtonsProcessOrder.push_back(RS_BUTTON_MINI_MAP);
+
+ // init default widths
+
+ // process buttons that can be hidden on resize...
+ resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin();
+ const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end();
+
+ for (; it != it_end; ++it)
+ {
+ const EResizeState button_type = *it;
+ // is there an appropriate object?
+ llassert(mStateProcessedObjectMap.count(button_type) > 0);
+ if (0 == mStateProcessedObjectMap.count(button_type)) continue;
+
+ // set default width for it.
+ mObjectDefaultWidthMap[button_type] = mStateProcessedObjectMap[button_type]->getRect().getWidth();
+ }
+
+ // ... and add Speak button because it also can be shrunk.
+ mObjectDefaultWidthMap[RS_BUTTON_SPEAK] = mSpeakPanel->getRect().getWidth();
+
+}
+
+// this method must be called before restoring of the chat entry field on startup
+// because it resets chatbar's width according to resize logic.
+void LLBottomTray::initButtonsVisibility()
+{
+ setVisibleAndFitWidths(RS_BUTTON_GESTURES, gSavedSettings.getBOOL("ShowGestureButton"));
+ setVisibleAndFitWidths(RS_BUTTON_MOVEMENT, gSavedSettings.getBOOL("ShowMoveButton"));
+ setVisibleAndFitWidths(RS_BUTTON_CAMERA, gSavedSettings.getBOOL("ShowCameraButton"));
+ setVisibleAndFitWidths(RS_BUTTON_SNAPSHOT, gSavedSettings.getBOOL("ShowSnapshotButton"));
+ setVisibleAndFitWidths(RS_BUTTON_BUILD, gSavedSettings.getBOOL("ShowBuildButton"));
+ setVisibleAndFitWidths(RS_BUTTON_SEARCH, gSavedSettings.getBOOL("ShowSearchButton"));
+ setVisibleAndFitWidths(RS_BUTTON_WORLD_MAP, gSavedSettings.getBOOL("ShowWorldMapButton"));
+ setVisibleAndFitWidths(RS_BUTTON_MINI_MAP, gSavedSettings.getBOOL("ShowMiniMapButton"));
+}
+
+void LLBottomTray::setButtonsControlsAndListeners()
{
- mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_GESTURES, mGesturePanel));
- mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, mMovementPanel));
- mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_CAMERA, mCamPanel));
- mStateProcessedObjectMap.insert(std::make_pair(RS_BUTTON_SNAPSHOT, mSnapshotPanel));
-
- mDummiesMap.insert(std::make_pair(RS_BUTTON_GESTURES, getChild<LLUICtrl>("after_gesture_panel")));
- mDummiesMap.insert(std::make_pair(RS_BUTTON_MOVEMENT, getChild<LLUICtrl>("after_movement_panel")));
- mDummiesMap.insert(std::make_pair(RS_BUTTON_CAMERA, getChild<LLUICtrl>("after_cam_panel")));
- mDummiesMap.insert(std::make_pair(RS_BUTTON_SPEAK, getChild<LLUICtrl>("after_speak_panel")));
+ gSavedSettings.getControl("ShowGestureButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_GESTURES, _2));
+ gSavedSettings.getControl("ShowMoveButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_MOVEMENT, _2));
+ gSavedSettings.getControl("ShowCameraButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_CAMERA, _2));
+ gSavedSettings.getControl("ShowSnapshotButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SNAPSHOT, _2));
+ gSavedSettings.getControl("ShowBuildButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_BUILD, _2));
+ gSavedSettings.getControl("ShowSearchButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_SEARCH, _2));
+ gSavedSettings.getControl("ShowWorldMapButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_WORLD_MAP, _2));
+ gSavedSettings.getControl("ShowMiniMapButton")->getSignal()->connect(boost::bind(&LLBottomTray::toggleShowButton, RS_BUTTON_MINI_MAP, _2));
+
+
+ LLButton* build_btn = getChild<LLButton>("build_btn");
+ // set control name for Build button. It is not enough to link it with Button.SetFloaterToggle in xml
+ std::string vis_control_name = LLFloaterReg::declareVisibilityControl("build");
+ // Set the button control value (toggle state) to the floater visibility control (Sets the value as well)
+ build_btn->setControlVariable(LLUI::sSettingGroups["floater"]->getControl(vis_control_name));
+}
+
+bool LLBottomTray::toggleShowButton(LLBottomTray::EResizeState button_type, const LLSD& new_visibility)
+{
+ if (LLBottomTray::instanceExists())
+ {
+ LLBottomTray::getInstance()->setTrayButtonVisibleIfPossible(button_type, new_visibility.asBoolean());
+ }
+ return true;
}
void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool visible)
{
+ llassert(mStateProcessedObjectMap[shown_object_type] != NULL);
LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
if (NULL == panel)
{
@@ -1091,60 +1262,176 @@ void LLBottomTray::setTrayButtonVisible(EResizeState shown_object_type, bool vis
}
panel->setVisible(visible);
+}
- if (mDummiesMap.count(shown_object_type))
+void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible, bool raise_notification)
+{
+ if (!setVisibleAndFitWidths(shown_object_type, visible) && visible && raise_notification)
{
- mDummiesMap[shown_object_type]->setVisible(visible);
+ LLNotificationsUtil::add("BottomTrayButtonCanNotBeShown",
+ LLSD(),
+ LLSD(),
+ LLNotificationFunctorRegistry::instance().DONOTHING);
}
}
-void LLBottomTray::setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible, bool raise_notification)
+bool LLBottomTray::setVisibleAndFitWidths(EResizeState object_type, bool visible)
{
- bool can_be_set = true;
+ LLPanel* cur_panel = mStateProcessedObjectMap[object_type];
+ if (NULL == cur_panel)
+ {
+ lldebugs << "There is no object to process for state: " << object_type << llendl;
+ return false;
+ }
+
+ bool is_set = true;
if (visible)
{
- LLPanel* panel = mStateProcessedObjectMap[shown_object_type];
- if (NULL == panel)
+ // Assume that only chiclet panel can be auto-resized
+ const S32 available_width =
+ mChicletPanel->getParent()->getRect().getWidth() - mChicletPanel->getMinWidth();
+
+ S32 preferred_width = mObjectDefaultWidthMap[object_type];
+ S32 current_width = cur_panel->getRect().getWidth();
+ S32 result_width = 0;
+ bool decrease_width = false;
+
+ // Mark this button to be shown
+ mResizeState |= object_type;
+
+ if (preferred_width > 0 && available_width >= preferred_width)
{
- lldebugs << "There is no object to process for state: " << shown_object_type << llendl;
- return;
+ result_width = preferred_width;
}
+ else if (available_width >= current_width)
+ {
+ result_width = current_width;
+ }
+ else
+ {
+ // Calculate the possible shrunk width as difference between current and minimal widths
+ const S32 chatbar_shrunk_width =
+ mNearbyChatBar->getRect().getWidth() - get_panel_min_width(mToolbarStack, mNearbyChatBar);
- const S32 dummy_width = mDummiesMap.count(shown_object_type) ? mDummiesMap[shown_object_type]->getRect().getWidth() : 0;
+ S32 sum_of_min_widths = get_panel_min_width(mToolbarStack, mSpeakPanel);
+ S32 sum_of_curr_widths = get_curr_width(mSpeakPanel);
- const S32 chatbar_panel_width = mNearbyChatBar->getRect().getWidth();
- const S32 chatbar_panel_min_width = mNearbyChatBar->getMinWidth();
+ resize_state_vec_t::const_iterator it = mButtonsProcessOrder.begin();
+ const resize_state_vec_t::const_iterator it_end = mButtonsProcessOrder.end();
- const S32 chiclet_panel_width = mChicletPanel->getParent()->getRect().getWidth();
- const S32 chiclet_panel_min_width = mChicletPanel->getMinWidth();
+ for (; it != it_end; ++it)
+ {
+ LLPanel * cur_panel = mStateProcessedObjectMap[*it];
+ sum_of_min_widths += get_panel_min_width(mToolbarStack, cur_panel);
+ sum_of_curr_widths += get_curr_width(cur_panel);
+ }
- const S32 available_width = (chatbar_panel_width - chatbar_panel_min_width)
- + (chiclet_panel_width - chiclet_panel_min_width);
+ const S32 possible_shrunk_width =
+ chatbar_shrunk_width + (sum_of_curr_widths - sum_of_min_widths);
- const S32 required_width = panel->getRect().getWidth() + dummy_width;
- can_be_set = available_width >= required_width;
- }
+ // Minimal width of current panel
+ S32 minimal_width = 0;
+ mToolbarStack->getPanelMinSize(cur_panel->getName(), &minimal_width, NULL);
- if (can_be_set)
+ if ( (available_width + possible_shrunk_width) >= minimal_width)
+ {
+ // There is enough space for minimal width, but set the result_width
+ // to preferred_width so buttons widths decreasing will be done in predefined order
+ result_width = (preferred_width > 0) ? preferred_width : current_width;
+ decrease_width = true;
+ }
+ else
+ {
+ // Nothing can be done, give up...
+ return false;
+ }
+ }
+
+ if (result_width != current_width)
+ {
+ cur_panel->reshape(result_width, cur_panel->getRect().getHeight());
+ current_width = result_width;
+ }
+
+ is_set = processShowButton(object_type, current_width);
+
+ // Shrink buttons if needed
+ if (is_set && decrease_width)
+ {
+ processWidthDecreased( -result_width);
+ }
+ }
+ else
{
- setTrayButtonVisible(shown_object_type, visible);
+ const S32 delta_width = get_curr_width(cur_panel);
+
+ setTrayButtonVisible(object_type, false);
- // if we hide the button mark it NOT to show while future bottom tray extending
- if (!visible)
+ // Mark button NOT to show while future bottom tray extending
+ mResizeState &= ~object_type;
+
+ // Extend other buttons if need
+ if (delta_width)
{
- mResizeState &= ~shown_object_type;
+ processWidthIncreased(delta_width);
}
}
+ return is_set;
+}
+
+void LLBottomTray::showWellButton(EResizeState object_type, bool visible)
+{
+ llassert( ((RS_NOTIFICATION_WELL | RS_IM_WELL) & object_type) == object_type );
+
+ const std::string panel_name = RS_IM_WELL == object_type ? "im_well_panel" : "notification_well_panel";
+
+ LLView * panel = getChild<LLView>(panel_name);
+
+ // if necessary visibility is set nothing to do here
+ if (panel->getVisible() == (BOOL)visible) return;
+
+ S32 panel_width = panel->getRect().getWidth();
+ panel->setVisible(visible);
+
+ if (visible)
+ {
+ // method assumes that input param is a negative value
+ processWidthDecreased(-panel_width);
+ }
else
{
- // mark this button to show it while future bottom tray extending
- mResizeState |= shown_object_type;
- if ( raise_notification )
- LLNotificationsUtil::add("BottomTrayButtonCanNotBeShown",
- LLSD(),
- LLSD(),
- LLNotificationFunctorRegistry::instance().DONOTHING);
+ processWidthIncreased(panel_width);
+ }
+}
+
+void LLBottomTray::processChatbarCustomization(S32 new_width)
+{
+ if (NULL == mNearbyChatBar) return;
+
+ const S32 delta_width = mNearbyChatBar->getRect().getWidth() - new_width;
+
+ if (delta_width == 0) return;
+
+ LLView * chiclet_layout_panel = mChicletPanel->getParent();
+ const S32 chiclet_min_width = get_panel_min_width(mToolbarStack, chiclet_layout_panel);
+ const S32 chiclet_panel_width = chiclet_layout_panel->getRect().getWidth();
+ const S32 available_chiclet_shrink_width = chiclet_panel_width - chiclet_min_width;
+ llassert(available_chiclet_shrink_width >= 0);
+
+ if (delta_width > 0) // panel gets narrowly
+ {
+ S32 total_possible_width = delta_width + available_chiclet_shrink_width;
+ processShowButtons(total_possible_width);
+ processExtendButtons(total_possible_width);
+ }
+ // here (delta_width < 0) // panel gets wider
+ else //if (-delta_width > available_chiclet_shrink_width)
+ {
+ S32 required_width = delta_width + available_chiclet_shrink_width;
+ S32 buttons_freed_width = 0;
+ processShrinkButtons(required_width, buttons_freed_width);
+ processHideButtons(required_width, buttons_freed_width);
}
}
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index ee0eb13218..05fed53936 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -83,6 +83,8 @@ public:
virtual void setVisible(BOOL visible);
+ /*virtual*/ S32 notifyParent(const LLSD& info);
+
// Implements LLVoiceClientStatusObserver::onChange() to enable the speak
// button when voice is available
/*virtual*/ void onChange(EStatusType status, const std::string &channelURI, bool proximal);
@@ -94,6 +96,9 @@ public:
void showCameraButton(BOOL visible);
void showSnapshotButton(BOOL visible);
+ void toggleMovementControls();
+ void toggleCameraControls();
+
void onMouselookModeIn();
void onMouselookModeOut();
@@ -113,37 +118,153 @@ private:
, RS_BUTTON_MOVEMENT = 0x0010
, RS_BUTTON_GESTURES = 0x0020
, RS_BUTTON_SPEAK = 0x0040
+ , RS_IM_WELL = 0x0080
+ , RS_NOTIFICATION_WELL = 0x0100
+ , RS_BUTTON_BUILD = 0x0200
+ , RS_BUTTON_SEARCH = 0x0400
+ , RS_BUTTON_WORLD_MAP = 0x0800
+ , RS_BUTTON_MINI_MAP = 0x1000
+
+ /*
+ Once new button that can be hidden on resize is added don't forget to update related places:
+ - RS_BUTTONS_CAN_BE_HIDDEN enum value below.
+ - initResizeStateContainers(): mStateProcessedObjectMap and mButtonsProcessOrder
+ */
/**
* Specifies buttons which can be hidden when bottom tray is shrunk.
* They are: Gestures, Movement (Move), Camera (View), Snapshot
+ * new: Build, Search, Map, World Map, Mini-Map.
*/
, RS_BUTTONS_CAN_BE_HIDDEN = RS_BUTTON_SNAPSHOT | RS_BUTTON_CAMERA | RS_BUTTON_MOVEMENT | RS_BUTTON_GESTURES
+ | RS_BUTTON_BUILD | RS_BUTTON_SEARCH | RS_BUTTON_WORLD_MAP | RS_BUTTON_MINI_MAP
}EResizeState;
+ /**
+ * Updates child controls size and visibility when it is necessary to reduce total width.
+ *
+ * Process order:
+ * - reduce chiclet panel to its minimal width;
+ * - reduce chatbar to its minimal width;
+ * - reduce visible buttons from right to left to their minimal width;
+ * - hide visible buttons from right to left;
+ * When button is hidden chatbar extended to fill released space if it is necessary.
+ *
+ * @param[in] delta_width - value by which bottom tray should be shrunk. It is a negative value.
+ * @return positive value which bottom tray can not process when it reaches its minimal width.
+ * Zero if there was enough space to process delta_width.
+ */
S32 processWidthDecreased(S32 delta_width);
+
+ /**
+ * Updates child controls size and visibility when it is necessary to extend total width.
+ *
+ * Process order:
+ * - show invisible buttons should be shown from left to right if possible;
+ * - extend visible buttons from left to right to their default width;
+ * - extend chatbar to its maximal width;
+ * - extend chiclet panel to all available space;
+ * When chatbar & chiclet panels are wider then their minimal width they can be reduced to allow
+ * a button gets visible in case if passed delta_width is not enough (chatbar first).
+ *
+ * @param[in] delta_width - value by which bottom tray should be extended. It is a positive value.
+ */
void processWidthIncreased(S32 delta_width);
+
+ /** helper function to log debug messages */
void log(LLView* panel, const std::string& descr);
- bool processShowButton(EResizeState shown_object_type, S32* available_width);
- void processHideButton(EResizeState processed_object_type, S32* required_width, S32* buttons_freed_width);
+
+ /**
+ * Tries to show hidden by resize buttons using available width.
+ *
+ * Gets buttons visible if there is enough space. Reduces available_width in this case.
+ *
+ * @params[in, out] available_width - reference to available width to be used to show buttons.
+ * @see processShowButton()
+ */
+ void processShowButtons(S32& available_width);
+
+ /**
+ * Tries to show panel with specified button using available width.
+ *
+ * Shows button specified by type if there is enough space. Reduces available_width in this case.
+ *
+ * @params[in] shown_object_type - type of button to be shown.
+ * @params[in, out] available_width - reference to available width to be used to show button.
+ *
+ * @return true if button can be shown, false otherwise
+ */
+ bool processShowButton(EResizeState shown_object_type, S32& available_width);
+
+ /**
+ * Hides visible panels with all buttons that may be hidden by resize if it is necessary.
+ *
+ * When button gets hidden some space is released in bottom tray.
+ * This space is taken into account for several consecutive calls for several buttons.
+ *
+ * @params[in, out] required_width - reference to required width to be released. This is a negative value.
+ * Its absolute value is decreased by shown panel width.
+ * @params[in, out] buttons_freed_width - reference to value released over required one.
+ * If panel's width is more than required difference is added to buttons_freed_width.
+ * @see processHideButton()
+ */
+ void processHideButtons(S32& required_width, S32& buttons_freed_width);
+
+ /**
+ * Hides panel with specified button if it is visible.
+ *
+ * When button gets hidden some space is released in bottom tray.
+ * This space is taken into account for several consecutive calls for several buttons.
+ *
+ * @params[in] processed_object_type - type of button to be hide.
+ * @params[in, out] required_width - reference to required width to be released. This is a negative value.
+ * Its absolute value is decreased by panel width.
+ * @params[in, out] buttons_freed_width - reference to value released over required one.
+ * If panel's width is more than required difference is added to buttons_freed_width.
+ */
+ void processHideButton(EResizeState processed_object_type, S32& required_width, S32& buttons_freed_width);
/**
* Shrinks shown buttons to reduce total taken space.
*
- * @param - required_width - width which buttons can use to be shrunk. It is a negative value.
+ * Shrinks buttons that may be shrunk smoothly first. Then shrinks Speak button.
+ *
+ * @param[in, out] required_width - reference to width value which should be released when buttons are shrunk. It is a negative value.
* It is increased on the value processed by buttons.
+ * @params[in, out] buttons_freed_width - reference to value released over required one.
+ * If width of panel with Speak button is more than required that difference is added
+ * to buttons_freed_width.
+ * This is because Speak button shrinks discretely unlike other buttons which are changed smoothly.
+ */
+ void processShrinkButtons(S32& required_width, S32& buttons_freed_width);
+
+ /**
+ * Shrinks panel with specified button if it is visible.
+ *
+ * @params[in] processed_object_type - type of button to be shrunk.
+ * @param[in, out] required_width - reference to width value which should be released when button is shrunk. It is a negative value.
+ * It is increased on the value released by the button.
*/
- void processShrinkButtons(S32* required_width, S32* buttons_freed_width);
- void processShrinkButton(EResizeState processed_object_type, S32* required_width);
+ void processShrinkButton(EResizeState processed_object_type, S32& required_width);
/**
* Extends shown buttons to increase total taken space.
*
- * @param - available_width - width which buttons can use to be extended. It is a positive value.
- * It is decreased on the value processed by buttons.
+ * Extends buttons that may be extended smoothly first. Then extends Speak button.
+ *
+ * @param[in, out] available_width - reference to width value which buttons can use to be extended.
+ * It is a positive value. It is decreased on the value processed by buttons.
+ */
+ void processExtendButtons(S32& available_width);
+
+ /**
+ * Extends shown button to increase total taken space.
+ *
+ * @params[in] processed_object_type - type of button to be extended.
+ * @param[in, out] available_width - reference to width value which button can use to be extended.
+ * It is a positive value. It is decreased on the value processed by buttons.
*/
- void processExtendButtons(S32* available_width);
- void processExtendButton(EResizeState processed_object_type, S32* available_width);
+ void processExtendButton(EResizeState processed_object_type, S32& available_width);
/**
* Determines if specified by type object can be shown. It should be hidden by shrink before.
@@ -152,7 +273,37 @@ private:
* - Gestures, Move, View, Snapshot
*/
bool canButtonBeShown(EResizeState processed_object_type) const;
- void initStateProcessedObjectMap();
+
+ /**
+ * Initializes all containers stored data related to children resize state.
+ *
+ * @see mStateProcessedObjectMap
+ * @see mObjectDefaultWidthMap
+ * @see mButtonsProcessOrder
+ */
+ void initResizeStateContainers();
+
+ /**
+ * Initializes buttons' visibility depend on stored Control Settings.
+ */
+ void initButtonsVisibility();
+
+ /**
+ * Initializes listeners of Control Settings to toggle appropriate buttons' visibility.
+ *
+ * @see toggleShowButton()
+ */
+ void setButtonsControlsAndListeners();
+
+ /**
+ * Toggles visibility of specified button depend on passed value.
+ *
+ * @param button_type - type of button to be toggled
+ * @param new_visibility - new visibility of the button
+ *
+ * @see setButtonsControlsAndListeners()
+ */
+ static bool toggleShowButton(EResizeState button_type, const LLSD& new_visibility);
/**
* Sets passed visibility to object specified by resize type.
@@ -173,6 +324,34 @@ private:
*/
void setTrayButtonVisibleIfPossible(EResizeState shown_object_type, bool visible, bool raise_notification = true);
+ /**
+ * Sets passed visibility to required button and fit widths of shown
+ * buttons(notice that method can shrink widths to
+ * allocate needed room in bottom tray).
+ * Returns true if visibility of required button was set.
+ */
+ bool setVisibleAndFitWidths(EResizeState object_type, bool visible);
+
+ /**
+ * Shows/hides panel with specified well button (IM or Notification)
+ *
+ * @param[in] object_type - type of well button to be processed.
+ * Must be one of RS_IM_WELL or RS_NOTIFICATION_WELL.
+ * @param[in] visible - flag specified whether button should be shown or hidden.
+ */
+ void showWellButton(EResizeState object_type, bool visible);
+
+ /**
+ * Handles a customization of chatbar width.
+ *
+ * When chatbar gets wider layout stack will reduce chiclet panel (it is auto-resizable)
+ * But once chiclet panel reaches its minimal width Stack will force to reduce buttons width.
+ * including Speak button. The similar behavior is when chatbar gets narrowly.
+ * This methods force resize behavior to resize buttons properly in these cases.
+ */
+ void processChatbarCustomization(S32 new_width);
+
+
MASK mResizeState;
typedef std::map<EResizeState, LLPanel*> state_object_map_t;
@@ -181,15 +360,17 @@ private:
typedef std::map<EResizeState, S32> state_object_width_map_t;
state_object_width_map_t mObjectDefaultWidthMap;
- typedef std::map<EResizeState, LLUICtrl*> dummies_map_t;
- dummies_map_t mDummiesMap;
+ typedef std::vector<EResizeState> resize_state_vec_t;
+
+ /**
+ * Contains order in which child buttons should be processed in show/hide, extend/shrink methods.
+ */
+ resize_state_vec_t mButtonsProcessOrder;
protected:
LLBottomTray(const LLSD& key = LLSD());
- void onChicletClick(LLUICtrl* ctrl);
-
static void* createNearbyChatBar(void* userdata);
void updateContextMenu(S32 x, S32 y, MASK mask);
@@ -202,10 +383,6 @@ protected:
LLNearbyChatBar* mNearbyChatBar;
LLLayoutStack* mToolbarStack;
LLMenuGL* mBottomTrayContextMenu;
- LLPanel* mMovementPanel;
- LLPanel* mCamPanel;
- LLPanel* mSnapshotPanel;
- LLPanel* mGesturePanel;
LLButton* mCamButton;
LLButton* mMovementButton;
LLBottomTrayLite* mBottomTrayLite;
diff --git a/indra/newview/llbuycurrencyhtml.cpp b/indra/newview/llbuycurrencyhtml.cpp
new file mode 100644
index 0000000000..163829a1ea
--- /dev/null
+++ b/indra/newview/llbuycurrencyhtml.cpp
@@ -0,0 +1,165 @@
+/**
+ * @file llbuycurrencyhtml.cpp
+ * @brief Manages Buy Currency HTML floater
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2006-2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterbuycurrency.h"
+#include "llbuycurrencyhtml.h"
+#include "llfloaterbuycurrencyhtml.h"
+
+#include "llfloaterreg.h"
+#include "llcommandhandler.h"
+#include "llviewercontrol.h"
+
+// support for secondlife:///app/buycurrencyhtml/{ACTION}/{NEXT_ACTION}/{RETURN_CODE} SLapps
+class LLBuyCurrencyHTMLHandler :
+ public LLCommandHandler
+{
+public:
+ // requests will be throttled from a non-trusted browser
+ LLBuyCurrencyHTMLHandler() : LLCommandHandler( "buycurrencyhtml", UNTRUSTED_ALLOW ) {}
+
+ bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
+ {
+ std::string action( "" );
+ if ( params.size() >= 1 )
+ {
+ action = params[ 0 ].asString();
+ };
+
+ std::string next_action( "" );
+ if ( params.size() >= 2 )
+ {
+ next_action = params[ 1 ].asString();
+ };
+
+ int result_code = 0;
+ if ( params.size() >= 3 )
+ {
+ result_code = params[ 2 ].asInteger();
+ };
+
+ // open the legacy XUI based currency floater
+ if ( "open_legacy" == next_action )
+ {
+ LLFloaterBuyCurrency::buyCurrency();
+ };
+
+ // ask the Buy Currency floater to close
+ // note: this is the last thing we can do so make
+ // sure any other actions are processed before this.
+ if ( "close" == action )
+ {
+ LLBuyCurrencyHTML::closeDialog();
+ };
+
+ return true;
+ };
+};
+LLBuyCurrencyHTMLHandler gBuyCurrencyHTMLHandler;
+
+////////////////////////////////////////////////////////////////////////////////
+// static
+// Opens the legacy XUI based floater or new HTML based one based on
+// the QuickBuyCurrency value in settings.xml - this overload is for
+// the case where the amount is not requested.
+void LLBuyCurrencyHTML::openCurrencyFloater()
+{
+ if ( gSavedSettings.getBOOL( "QuickBuyCurrency" ) )
+ {
+ // HTML version
+ LLBuyCurrencyHTML::showDialog( false, "", 0 );
+ }
+ else
+ {
+ // legacy version
+ LLFloaterBuyCurrency::buyCurrency();
+ };
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// static
+// Opens the legacy XUI based floater or new HTML based one based on
+// the QuickBuyCurrency value in settings.xml - this overload is for
+// the case where the amount and a string to display are requested.
+void LLBuyCurrencyHTML::openCurrencyFloater( const std::string& message, S32 sum )
+{
+ if ( gSavedSettings.getBOOL( "QuickBuyCurrency" ) )
+ {
+ // HTML version
+ LLBuyCurrencyHTML::showDialog( true, message, sum );
+ }
+ else
+ {
+ // legacy version
+ LLFloaterBuyCurrency::buyCurrency( message, sum );
+ };
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// static
+void LLBuyCurrencyHTML::showDialog( bool specific_sum_requested, const std::string& message, S32 sum )
+{
+ LLFloaterBuyCurrencyHTML* buy_currency_floater = dynamic_cast< LLFloaterBuyCurrencyHTML* >( LLFloaterReg::getInstance( "buy_currency_html" ) );
+ if ( buy_currency_floater )
+ {
+ // pass on flag indicating if we want to buy specific amount and if so, how much
+ buy_currency_floater->setParams( specific_sum_requested, message, sum );
+
+ // force navigate to new URL
+ buy_currency_floater->navigateToFinalURL();
+
+ // make it visible and raise to front
+ BOOL visible = TRUE;
+ buy_currency_floater->setVisible( visible );
+ BOOL take_focus = TRUE;
+ buy_currency_floater->setFrontmost( take_focus );
+
+ // spec calls for floater to be centered on client window
+ buy_currency_floater->center();
+ }
+ else
+ {
+ llwarns << "Buy Currency (HTML) Floater not found" << llendl;
+ };
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLBuyCurrencyHTML::closeDialog()
+{
+ LLFloaterBuyCurrencyHTML* buy_currency_floater = dynamic_cast< LLFloaterBuyCurrencyHTML* >(LLFloaterReg::getInstance( "buy_currency_html" ) );
+ if ( buy_currency_floater )
+ {
+ buy_currency_floater->closeFloater();
+ };
+}
diff --git a/indra/newview/llbuycurrencyhtml.h b/indra/newview/llbuycurrencyhtml.h
new file mode 100644
index 0000000000..3435bb0451
--- /dev/null
+++ b/indra/newview/llbuycurrencyhtml.h
@@ -0,0 +1,57 @@
+/**
+ * @file llbuycurrencyhtml.h
+ * @brief Manages Buy Currency HTML floater
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2006-2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLBUYCURRENCYHTML_H
+#define LL_LLBUYCURRENCYHTML_H
+
+#include "llsingleton.h"
+
+class LLFloaterBuyCurrencyHTML;
+
+class LLBuyCurrencyHTML
+{
+ public:
+ // choke point for opening a legacy or new currency floater - this overload is when the L$ sum is not required
+ static void openCurrencyFloater();
+
+ // choke point for opening a legacy or new currency floater - this overload is when the L$ sum is required
+ static void openCurrencyFloater( const std::string& message, S32 sum );
+
+ // show and give focus to actual currency floater - this is used for both cases
+ // where the sum is required and where it is not
+ static void showDialog( bool specific_sum_requested, const std::string& message, S32 sum );
+
+ // close (and destroy) the currency floater
+ static void closeDialog();
+};
+
+#endif // LL_LLBUYCURRENCYHTML_H
diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp
index bd4fae6ab6..60a2392d87 100644
--- a/indra/newview/llcallfloater.cpp
+++ b/indra/newview/llcallfloater.cpp
@@ -54,7 +54,7 @@
#include "llvoicechannel.h"
#include "llviewerparcelmgr.h"
-static void get_voice_participants_uuids(std::vector<LLUUID>& speakers_uuids);
+static void get_voice_participants_uuids(uuid_vec_t& speakers_uuids);
void reshape_floater(LLCallFloater* floater, S32 delta_height);
class LLNonAvatarCaller : public LLAvatarListItem
@@ -95,7 +95,7 @@ static void* create_non_avatar_caller(void*)
return new LLNonAvatarCaller;
}
-LLVoiceChannel* LLCallFloater::sCurrentVoiceCanel = NULL;
+LLVoiceChannel* LLCallFloater::sCurrentVoiceChannel = NULL;
LLCallFloater::LLCallFloater(const LLSD& key)
: LLTransientDockableFloater(NULL, false, key)
@@ -113,8 +113,11 @@ LLCallFloater::LLCallFloater(const LLSD& key)
mSpeakerDelayRemover = new LLSpeakersDelayActionsStorage(boost::bind(&LLCallFloater::removeVoiceLeftParticipant, this, _1), voice_left_remove_delay);
mFactoryMap["non_avatar_caller"] = LLCallbackMap(create_non_avatar_caller, NULL);
- LLVoiceClient::getInstance()->addObserver(this);
+ LLVoiceClient::instance().addObserver(this);
LLTransientFloaterMgr::getInstance()->addControlView(this);
+
+ // force docked state since this floater doesn't save it between recreations
+ setDocked(true);
}
LLCallFloater::~LLCallFloater()
@@ -128,11 +131,9 @@ LLCallFloater::~LLCallFloater()
mAvatarListRefreshConnection.disconnect();
mVoiceChannelStateChangeConnection.disconnect();
- // Don't use LLVoiceClient::getInstance() here
- // singleton MAY have already been destroyed.
- if(gVoiceClient)
+ if(LLVoiceClient::instanceExists())
{
- gVoiceClient->removeObserver(this);
+ LLVoiceClient::getInstance()->removeObserver(this);
}
LLTransientFloaterMgr::getInstance()->removeControlView(this);
}
@@ -157,7 +158,6 @@ BOOL LLCallFloater::postBuild()
initAgentData();
-
connectToChannel(LLVoiceChannel::getCurrentVoiceChannel());
setIsChrome(true);
@@ -188,7 +188,7 @@ void LLCallFloater::draw()
// Seems this is a problem somewhere in Voice Client (LLVoiceClient::participantAddedEvent)
// onChange();
- bool is_moderator_muted = gVoiceClient->getIsModeratorMuted(gAgentID);
+ bool is_moderator_muted = LLVoiceClient::getInstance()->getIsModeratorMuted(gAgentID);
if (mIsModeratorMutedVoice != is_moderator_muted)
{
@@ -203,16 +203,15 @@ void LLCallFloater::draw()
}
// virtual
-void LLCallFloater::onChange()
+void LLCallFloater::onParticipantsChanged()
{
if (NULL == mParticipants) return;
-
updateParticipantsVoiceState();
// Add newly joined participants.
- std::vector<LLUUID> speakers_uuids;
+ uuid_vec_t speakers_uuids;
get_voice_participants_uuids(speakers_uuids);
- for (std::vector<LLUUID>::const_iterator it = speakers_uuids.begin(); it != speakers_uuids.end(); it++)
+ for (uuid_vec_t::const_iterator it = speakers_uuids.begin(); it != speakers_uuids.end(); it++)
{
mParticipants->addAvatarIDExceptAgent(*it);
}
@@ -227,7 +226,7 @@ void LLCallFloater::leaveCall()
LLVoiceChannel* voice_channel = LLVoiceChannel::getCurrentVoiceChannel();
if (voice_channel)
{
- voice_channel->deactivate();
+ gIMMgr->endCall(voice_channel->getSessionID());
}
}
@@ -236,11 +235,11 @@ void LLCallFloater::updateSession()
LLVoiceChannel* voice_channel = LLVoiceChannel::getCurrentVoiceChannel();
if (voice_channel)
{
- lldebugs << "Current voice channel: " << voice_channel->getSessionID() << llendl;
+ LL_DEBUGS("Voice") << "Current voice channel: " << voice_channel->getSessionID() << LL_ENDL;
if (mSpeakerManager && voice_channel->getSessionID() == mSpeakerManager->getSessionID())
{
- lldebugs << "Speaker manager is already set for session: " << voice_channel->getSessionID() << llendl;
+ LL_DEBUGS("Voice") << "Speaker manager is already set for session: " << voice_channel->getSessionID() << LL_ENDL;
return;
}
else
@@ -250,7 +249,6 @@ void LLCallFloater::updateSession()
}
const LLUUID& session_id = voice_channel ? voice_channel->getSessionID() : LLUUID::null;
- lldebugs << "Set speaker manager for session: " << session_id << llendl;
LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(session_id);
if (im_session)
@@ -288,23 +286,25 @@ void LLCallFloater::updateSession()
if (NULL == mSpeakerManager)
{
- // by default let show nearby chat participants
+ // By default show nearby chat participants
mSpeakerManager = LLLocalSpeakerMgr::getInstance();
- lldebugs << "Set DEFAULT speaker manager" << llendl;
+ LL_DEBUGS("Voice") << "Set DEFAULT speaker manager" << LL_ENDL;
mVoiceType = VC_LOCAL_CHAT;
}
updateTitle();
-
- //hide "Leave Call" button for nearby chat
+
+ // Hide "Leave Call" button for nearby chat
bool is_local_chat = mVoiceType == VC_LOCAL_CHAT;
childSetVisible("leave_call_btn_panel", !is_local_chat);
refreshParticipantList();
updateAgentModeratorState();
- //show floater for voice calls
- if (!is_local_chat)
+ // Show floater for voice calls & only in CONNECTED to voice channel state
+ if (!is_local_chat &&
+ voice_channel &&
+ LLVoiceChannel::STATE_CONNECTED == voice_channel->getState())
{
LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
bool show_me = !(im_floater && im_floater->getVisible());
@@ -331,8 +331,9 @@ void LLCallFloater::refreshParticipantList()
if (!non_avatar_caller)
{
- mParticipants = new LLParticipantList(mSpeakerManager, mAvatarList, true, mVoiceType != VC_GROUP_CHAT && mVoiceType != VC_AD_HOC_CHAT);
+ mParticipants = new LLParticipantList(mSpeakerManager, mAvatarList, true, mVoiceType != VC_GROUP_CHAT && mVoiceType != VC_AD_HOC_CHAT, false);
mParticipants->setValidateSpeakerCallback(boost::bind(&LLCallFloater::validateSpeaker, this, _1));
+ mParticipants->setSortOrder(LLParticipantList::E_SORT_BY_RECENT_SPEAKERS);
if (LLLocalSpeakerMgr::getInstance() == mSpeakerManager)
{
@@ -366,7 +367,7 @@ void LLCallFloater::sOnCurrentChannelChanged(const LLUUID& /*session_id*/)
// *NOTE: if signal was sent for voice channel with LLVoiceChannel::STATE_NO_CHANNEL_INFO
// it sill be sent for the same channel again (when state is changed).
// So, lets ignore this call.
- if (channel == sCurrentVoiceCanel) return;
+ if (channel == sCurrentVoiceChannel) return;
LLCallFloater* call_floater = LLFloaterReg::getTypedInstance<LLCallFloater>("voice_controls");
@@ -463,19 +464,18 @@ void LLCallFloater::updateAgentModeratorState()
mAgentPanel->childSetValue("user_text", name);
}
-static void get_voice_participants_uuids(std::vector<LLUUID>& speakers_uuids)
+static void get_voice_participants_uuids(uuid_vec_t& speakers_uuids)
{
// Get a list of participants from VoiceClient
- LLVoiceClient::participantMap *voice_map = gVoiceClient->getParticipantList();
- if (voice_map)
+ std::set<LLUUID> participants;
+ LLVoiceClient::getInstance()->getParticipantList(participants);
+
+ for (std::set<LLUUID>::const_iterator iter = participants.begin();
+ iter != participants.end(); ++iter)
{
- for (LLVoiceClient::participantMap::const_iterator iter = voice_map->begin();
- iter != voice_map->end(); ++iter)
- {
- LLUUID id = (*iter).second->mAvatarID;
- speakers_uuids.push_back(id);
- }
+ speakers_uuids.push_back(*iter);
}
+
}
void LLCallFloater::initParticipantsVoiceState()
@@ -488,7 +488,7 @@ void LLCallFloater::initParticipantsVoiceState()
it_end = items.end();
- std::vector<LLUUID> speakers_uuids;
+ uuid_vec_t speakers_uuids;
get_voice_participants_uuids(speakers_uuids);
for(; it != it_end; ++it)
@@ -499,7 +499,7 @@ void LLCallFloater::initParticipantsVoiceState()
LLUUID speaker_id = item->getAvatarId();
- std::vector<LLUUID>::const_iterator speaker_iter = std::find(speakers_uuids.begin(), speakers_uuids.end(), speaker_id);
+ uuid_vec_t::const_iterator speaker_iter = std::find(speakers_uuids.begin(), speakers_uuids.end(), speaker_id);
// If an avatarID assigned to a panel is found in a speakers list
// obtained from VoiceClient we assign the JOINED status to the owner
@@ -528,10 +528,10 @@ void LLCallFloater::initParticipantsVoiceState()
void LLCallFloater::updateParticipantsVoiceState()
{
- std::vector<LLUUID> speakers_list;
+ uuid_vec_t speakers_list;
// Get a list of participants from VoiceClient
- std::vector<LLUUID> speakers_uuids;
+ uuid_vec_t speakers_uuids;
get_voice_participants_uuids(speakers_uuids);
// Updating the status for each participant already in list.
@@ -549,9 +549,9 @@ void LLCallFloater::updateParticipantsVoiceState()
const LLUUID participant_id = item->getAvatarId();
bool found = false;
- std::vector<LLUUID>::iterator speakers_iter = std::find(speakers_uuids.begin(), speakers_uuids.end(), participant_id);
+ uuid_vec_t::iterator speakers_iter = std::find(speakers_uuids.begin(), speakers_uuids.end(), participant_id);
- lldebugs << "processing speaker: " << item->getAvatarName() << ", " << item->getAvatarId() << llendl;
+ LL_DEBUGS("Voice") << "processing speaker: " << item->getAvatarName() << ", " << item->getAvatarId() << LL_ENDL;
// If an avatarID assigned to a panel is found in a speakers list
// obtained from VoiceClient we assign the JOINED status to the owner
@@ -597,10 +597,13 @@ void LLCallFloater::updateNotInVoiceParticipantState(LLAvatarListItem* item)
}
}
break;
- case STATE_INVITED:
case STATE_LEFT:
// nothing to do. These states should not be changed.
break;
+ case STATE_INVITED:
+ // If avatar was invited into group chat and went offline it is still exists in mSpeakerStateMap
+ // If it goes online it will be rendered as JOINED via LAvatarListItem.
+ // Lets update its visual representation. See EXT-6660
case STATE_UNKNOWN:
// If an avatarID is not found in a speakers list from VoiceClient and
// a panel with this ID has an UNKNOWN status this means that this person
@@ -659,8 +662,8 @@ void LLCallFloater::setVoiceRemoveTimer(const LLUUID& voice_speaker_id)
bool LLCallFloater::removeVoiceLeftParticipant(const LLUUID& voice_speaker_id)
{
- LLAvatarList::uuid_vector_t& speaker_uuids = mAvatarList->getIDs();
- LLAvatarList::uuid_vector_t::iterator pos = std::find(speaker_uuids.begin(), speaker_uuids.end(), voice_speaker_id);
+ uuid_vec_t& speaker_uuids = mAvatarList->getIDs();
+ uuid_vec_t::iterator pos = std::find(speaker_uuids.begin(), speaker_uuids.end(), voice_speaker_id);
if(pos != speaker_uuids.end())
{
speaker_uuids.erase(pos);
@@ -678,8 +681,7 @@ void LLCallFloater::resetVoiceRemoveTimers()
void LLCallFloater::removeVoiceRemoveTimer(const LLUUID& voice_speaker_id)
{
- bool delete_it = true;
- mSpeakerDelayRemover->unsetActionTimer(voice_speaker_id, delete_it);
+ mSpeakerDelayRemover->unsetActionTimer(voice_speaker_id);
}
bool LLCallFloater::validateSpeaker(const LLUUID& speaker_id)
@@ -690,7 +692,7 @@ bool LLCallFloater::validateSpeaker(const LLUUID& speaker_id)
case VC_LOCAL_CHAT:
{
// A nearby chat speaker is considered valid it it's known to LLVoiceClient (i.e. has enabled voice).
- std::vector<LLUUID> speakers;
+ uuid_vec_t speakers;
get_voice_participants_uuids(speakers);
is_valid = std::find(speakers.begin(), speakers.end(), speaker_id) != speakers.end();
}
@@ -712,21 +714,29 @@ void LLCallFloater::connectToChannel(LLVoiceChannel* channel)
{
mVoiceChannelStateChangeConnection.disconnect();
- sCurrentVoiceCanel = channel;
+ sCurrentVoiceChannel = channel;
- mVoiceChannelStateChangeConnection = sCurrentVoiceCanel->setStateChangedCallback(boost::bind(&LLCallFloater::onVoiceChannelStateChanged, this, _1, _2));
+ mVoiceChannelStateChangeConnection = sCurrentVoiceChannel->setStateChangedCallback(boost::bind(&LLCallFloater::onVoiceChannelStateChanged, this, _1, _2));
updateState(channel->getState());
}
void LLCallFloater::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state)
{
- updateState(new_state);
+ // check is voice operational and if it doesn't work hide VCP (EXT-4397)
+ if(LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking())
+ {
+ updateState(new_state);
+ }
+ else
+ {
+ closeFloater();
+ }
}
void LLCallFloater::updateState(const LLVoiceChannel::EState& new_state)
{
- LL_DEBUGS("Voice") << "Updating state: " << new_state << ", session name: " << sCurrentVoiceCanel->getSessionName() << LL_ENDL;
+ LL_DEBUGS("Voice") << "Updating state: " << new_state << ", session name: " << sCurrentVoiceChannel->getSessionName() << LL_ENDL;
if (LLVoiceChannel::STATE_CONNECTED == new_state)
{
updateSession();
@@ -750,18 +760,26 @@ void LLCallFloater::reset(const LLVoiceChannel::EState& new_state)
mParticipants = NULL;
mAvatarList->clear();
- // "loading" is shown in parcel with disabled voice only when state is "ringing"
- // to avoid showing it in nearby chat vcp all the time- "no_one_near" is now shown there (EXT-4648)
- bool show_loading = LLVoiceChannel::STATE_RINGING == new_state;
- if(!show_loading && !LLViewerParcelMgr::getInstance()->allowAgentVoice() && mVoiceType == VC_LOCAL_CHAT)
+ // These ifs were added instead of simply showing "loading" to make VCP work correctly in parcels
+ // with disabled voice (EXT-4648 and EXT-4649)
+ if (!LLViewerParcelMgr::getInstance()->allowAgentVoice() && LLVoiceChannel::STATE_HUNG_UP == new_state)
{
+ // hides "Leave Call" when call is ended in parcel with disabled voice- hiding usually happens in
+ // updateSession() which won't be called here because connect to nearby voice never happens
+ childSetVisible("leave_call_btn_panel", false);
+ // setting title to nearby chat an "no one near..." text- because in region with disabled
+ // voice we won't have chance to really connect to nearby, so VCP is changed here manually
+ setTitle(getString("title_nearby"));
mAvatarList->setNoItemsCommentText(getString("no_one_near"));
}
- else
+ // "loading" is shown only when state is "ringing" to avoid showing it in nearby chat vcp
+ // of parcels with disabled voice all the time- "no_one_near" is now shown there (EXT-4648)
+ else if (new_state == LLVoiceChannel::STATE_RINGING)
{
// update floater to show Loading while waiting for data.
mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData"));
}
+
mAvatarList->setVisible(TRUE);
mNonAvatarCaller->setVisible(FALSE);
diff --git a/indra/newview/llcallfloater.h b/indra/newview/llcallfloater.h
index dac4390fa7..e4341175e2 100644
--- a/indra/newview/llcallfloater.h
+++ b/indra/newview/llcallfloater.h
@@ -47,15 +47,15 @@ class LLSpeakerMgr;
class LLSpeakersDelayActionsStorage;
/**
- * The Voice Control Panel is an ambient window summoned by clicking the flyout chevron on the Speak button.
- * It can be torn-off and freely positioned onscreen.
+ * The Voice Control Panel is an ambient window summoned by clicking the flyout chevron
+ * on the Speak button. It can be torn-off and freely positioned onscreen.
*
- * When the Resident is engaged in Nearby Voice Chat, the Voice Control Panel provides control over
- * the Resident's own microphone input volume, the audible volume of each of the other participants,
- * the Resident's own Voice Morphing settings (if she has subscribed to enable the feature), and Voice Recording.
+ * When the Resident is engaged in Voice Chat, the Voice Control Panel provides control
+ * over the audible volume of each of the other participants, the Resident's own Voice
+ * Morphing settings (if she has subscribed to enable the feature), and Voice Recording.
*
- * When the Resident is engaged in any chat except Nearby Chat, the Voice Control Panel also provides an
- * 'Leave Call' button to allow the Resident to leave that voice channel.
+ * When the Resident is engaged in any chat except Nearby Chat, the Voice Control Panel
+ * also provides a 'Leave Call' button to allow the Resident to leave that voice channel.
*/
class LLCallFloater : public LLTransientDockableFloater, LLVoiceClientParticipantObserver
{
@@ -75,7 +75,7 @@ public:
*
* Refreshes list to display participants not in voice as disabled.
*/
- /*virtual*/ void onChange();
+ /*virtual*/ void onParticipantsChanged();
static void sOnCurrentChannelChanged(const LLUUID& session_id);
@@ -259,7 +259,11 @@ private:
*
* @see sOnCurrentChannelChanged()
*/
- static LLVoiceChannel* sCurrentVoiceCanel;
+ static LLVoiceChannel* sCurrentVoiceChannel;
+
+ /* virtual */
+ LLTransientFloaterMgr::ETransientGroup getGroup() { return LLTransientFloaterMgr::IM; }
+
boost::signals2::connection mVoiceChannelStateChangeConnection;
};
diff --git a/indra/newview/llcallingcard.cpp b/indra/newview/llcallingcard.cpp
index d988770f90..1a6c11fa73 100644
--- a/indra/newview/llcallingcard.cpp
+++ b/indra/newview/llcallingcard.cpp
@@ -56,12 +56,14 @@
#include "llnotifications.h"
#include "llnotificationsutil.h"
#include "llresmgr.h"
+#include "llslurl.h"
#include "llimview.h"
#include "llviewercontrol.h"
#include "llviewernetwork.h"
#include "llviewerobjectlist.h"
#include "llviewerwindow.h"
#include "llvoavatar.h"
+#include "llavataractions.h"
///----------------------------------------------------------------------------
/// Local function declarations, constants, enums, and typedefs
@@ -680,9 +682,11 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)
}
BOOL notify = FALSE;
LLSD args;
+ LLSD payload;
for(S32 i = 0; i < count; ++i)
{
msg->getUUIDFast(_PREHASH_AgentBlock, _PREHASH_AgentID, agent_id, i);
+ payload["FROM_ID"] = agent_id;
info = getBuddyInfo(agent_id);
if(info)
{
@@ -696,6 +700,7 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)
args["FIRST"] = first;
args["LAST"] = last;
}
+
}
}
else
@@ -715,7 +720,21 @@ void LLAvatarTracker::processNotify(LLMessageSystem* msg, bool online)
if(notify)
{
// Popup a notify box with online status of this agent
- LLNotificationPtr notification = LLNotificationsUtil::add(online ? "FriendOnline" : "FriendOffline", args);
+ LLNotificationPtr notification;
+
+ if (online)
+ {
+ notification =
+ LLNotificationsUtil::add("FriendOnline",
+ args,
+ payload.with("respond_on_mousedown", TRUE),
+ boost::bind(&LLAvatarActions::startIM, agent_id));
+ }
+ else
+ {
+ notification =
+ LLNotificationsUtil::add("FriendOffline", args, payload);
+ }
// If there's an open IM session with this agent, send a notification there too.
LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, agent_id);
diff --git a/indra/newview/llchannelmanager.cpp b/indra/newview/llchannelmanager.cpp
index 769387c26c..fafa315a59 100644
--- a/indra/newview/llchannelmanager.cpp
+++ b/indra/newview/llchannelmanager.cpp
@@ -35,6 +35,7 @@
#include "llchannelmanager.h"
#include "llappviewer.h"
+#include "llnotificationstorage.h"
#include "llviewercontrol.h"
#include "llviewerwindow.h"
#include "llrootview.h"
@@ -107,31 +108,35 @@ void LLChannelManager::onLoginCompleted()
if(!away_notifications)
{
onStartUpToastClose();
- return;
}
-
- // create a channel for the StartUp Toast
- LLChannelManager::Params p;
- p.id = LLUUID(gSavedSettings.getString("StartUpChannelUUID"));
- p.channel_align = CA_RIGHT;
- mStartUpChannel = createChannel(p);
-
- if(!mStartUpChannel)
+ else
{
- onStartUpToastClose();
- return;
- }
+ // create a channel for the StartUp Toast
+ LLChannelManager::Params p;
+ p.id = LLUUID(gSavedSettings.getString("StartUpChannelUUID"));
+ p.channel_align = CA_RIGHT;
+ mStartUpChannel = createChannel(p);
- gViewerWindow->getRootView()->addChild(mStartUpChannel);
+ if(!mStartUpChannel)
+ {
+ onStartUpToastClose();
+ }
+ else
+ {
+ gViewerWindow->getRootView()->addChild(mStartUpChannel);
- // init channel's position and size
- S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");
- S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
- mStartUpChannel->init(channel_right_bound - channel_width, channel_right_bound);
- mStartUpChannel->setMouseDownCallback(boost::bind(&LLNotificationWellWindow::onStartUpToastClick, LLNotificationWellWindow::getInstance(), _2, _3, _4));
+ // init channel's position and size
+ S32 channel_right_bound = gViewerWindow->getWorldViewRectScaled().mRight - gSavedSettings.getS32("NotificationChannelRightMargin");
+ S32 channel_width = gSavedSettings.getS32("NotifyBoxWidth");
+ mStartUpChannel->init(channel_right_bound - channel_width, channel_right_bound);
+ mStartUpChannel->setMouseDownCallback(boost::bind(&LLNotificationWellWindow::onStartUpToastClick, LLNotificationWellWindow::getInstance(), _2, _3, _4));
- mStartUpChannel->setCommitCallback(boost::bind(&LLChannelManager::onStartUpToastClose, this));
- mStartUpChannel->createStartUpToast(away_notifications, gSavedSettings.getS32("StartUpToastLifeTime"));
+ mStartUpChannel->setCommitCallback(boost::bind(&LLChannelManager::onStartUpToastClose, this));
+ mStartUpChannel->createStartUpToast(away_notifications, gSavedSettings.getS32("StartUpToastLifeTime"));
+ }
+ }
+
+ LLPersistentNotificationStorage::getInstance()->loadNotifications();
}
//--------------------------------------------------------------------------
@@ -238,3 +243,19 @@ void LLChannelManager::killToastsFromChannel(const LLUUID& channel_id, const LLS
}
}
+// static
+LLNotificationsUI::LLScreenChannel* LLChannelManager::getNotificationScreenChannel()
+{
+ LLNotificationsUI::LLScreenChannel* channel = static_cast<LLNotificationsUI::LLScreenChannel*>
+ (LLNotificationsUI::LLChannelManager::getInstance()->
+ findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
+
+ if (channel == NULL)
+ {
+ llwarns << "Can't find screen channel by NotificationChannelUUID" << llendl;
+ llassert(!"Can't find screen channel by NotificationChannelUUID");
+ }
+
+ return channel;
+}
+
diff --git a/indra/newview/llchannelmanager.h b/indra/newview/llchannelmanager.h
index c2be39122f..8c725f2660 100644
--- a/indra/newview/llchannelmanager.h
+++ b/indra/newview/llchannelmanager.h
@@ -114,6 +114,11 @@ public:
*/
void killToastsFromChannel(const LLUUID& channel_id, const LLScreenChannel::Matcher& matcher);
+ /**
+ * Returns notification screen channel.
+ */
+ static LLNotificationsUI::LLScreenChannel* getNotificationScreenChannel();
+
private:
LLScreenChannel* createChannel(LLChannelManager::Params& p);
diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp
index b32a955038..cd279fa10a 100644
--- a/indra/newview/llchatbar.cpp
+++ b/indra/newview/llchatbar.cpp
@@ -107,7 +107,7 @@ LLChatBar::LLChatBar()
LLChatBar::~LLChatBar()
{
- LLGestureManager::instance().removeObserver(mObserver);
+ LLGestureMgr::instance().removeObserver(mObserver);
delete mObserver;
mObserver = NULL;
// LLView destructor cleans up children
@@ -149,7 +149,6 @@ BOOL LLChatBar::handleKeyHere( KEY key, MASK mask )
{
BOOL handled = FALSE;
- // ALT-RETURN is reserved for windowed/fullscreen toggle
if( KEY_RETURN == key )
{
if (mask == MASK_CONTROL)
@@ -209,8 +208,8 @@ void LLChatBar::refreshGestures()
// collect list of unique gestures
std::map <std::string, BOOL> unique;
- LLGestureManager::item_map_t::const_iterator it;
- const LLGestureManager::item_map_t& active_gestures = LLGestureManager::instance().getActiveGestures();
+ LLGestureMgr::item_map_t::const_iterator it;
+ const LLGestureMgr::item_map_t& active_gestures = LLGestureMgr::instance().getActiveGestures();
for (it = active_gestures.begin(); it != active_gestures.end(); ++it)
{
LLMultiGesture* gesture = (*it).second;
@@ -296,7 +295,7 @@ void LLChatBar::setGestureCombo(LLComboBox* combo)
// now register observer since we have a place to put the results
mObserver = new LLChatBarGestureObserver(this);
- LLGestureManager::instance().addObserver(mObserver);
+ LLGestureMgr::instance().addObserver(mObserver);
// refresh list from current active gestures
refreshGestures();
@@ -377,7 +376,7 @@ void LLChatBar::sendChat( EChatType type )
if (0 == channel)
{
// discard returned "found" boolean
- LLGestureManager::instance().triggerAndReviseString(utf8text, &utf8_revised_text);
+ LLGestureMgr::instance().triggerAndReviseString(utf8text, &utf8_revised_text);
}
else
{
@@ -516,7 +515,7 @@ void LLChatBar::onInputEditorKeystroke( LLLineEditor* caller, void* userdata )
std::string utf8_trigger = wstring_to_utf8str(raw_text);
std::string utf8_out_str(utf8_trigger);
- if (LLGestureManager::instance().matchPrefix(utf8_trigger, &utf8_out_str))
+ if (LLGestureMgr::instance().matchPrefix(utf8_trigger, &utf8_out_str))
{
if (self->mInputEditor)
{
@@ -653,7 +652,7 @@ void LLChatBar::onCommitGesture(LLUICtrl* ctrl)
// substitution and logging.
std::string text(trigger);
std::string revised_text;
- LLGestureManager::instance().triggerAndReviseString(text, &revised_text);
+ LLGestureMgr::instance().triggerAndReviseString(text, &revised_text);
revised_text = utf8str_trim(revised_text);
if (!revised_text.empty())
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index f046e08827..ab97dbb695 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -66,6 +66,9 @@ static LLDefaultChildRegistry::Register<LLChatHistory> r("chat_history");
const static std::string NEW_LINE(rawstr_to_utf8("\n"));
+const static std::string SLURL_APP_AGENT = "secondlife:///app/agent/";
+const static std::string SLURL_ABOUT = "/about";
+
// support for secondlife:///app/objectim/{UUID}/ SLapps
class LLObjectIMHandler : public LLCommandHandler
{
@@ -90,7 +93,7 @@ public:
payload["object_id"] = object_id;
payload["owner_id"] = query_map["owner"];
payload["name"] = query_map["name"];
- payload["slurl"] = query_map["slurl"];
+ payload["slurl"] = LLWeb::escapeURL(query_map["slurl"]);
payload["group_owned"] = query_map["groupowned"];
LLFloaterReg::showInstance("inspect_remote_object", payload);
return true;
@@ -113,34 +116,6 @@ public:
return LLPanel::handleMouseUp(x,y,mask);
}
- //*TODO remake it using mouse enter/leave and static LLHandle<LLIconCtrl> to add/remove as a child
- BOOL handleToolTip(S32 x, S32 y, MASK mask)
- {
- LLViewerTextEditor* name = getChild<LLViewerTextEditor>("user_name");
- if (name && name->parentPointInView(x, y) && mAvatarID.notNull() && SYSTEM_FROM != mFrom)
- {
-
- // Spawn at right side of the name textbox.
- LLRect sticky_rect = name->calcScreenRect();
- S32 icon_x = llmin(sticky_rect.mLeft + name->getTextBoundingRect().getWidth() + 7, sticky_rect.mRight - 3);
-
- LLToolTip::Params params;
- params.background_visible(false);
- params.click_callback(boost::bind(&LLChatHistoryHeader::onHeaderPanelClick, this, 0, 0, 0));
- params.delay_time(0.0f); // spawn instantly on hover
- params.image(LLUI::getUIImage("Info_Small"));
- params.message("");
- params.padding(0);
- params.pos(LLCoordGL(icon_x, sticky_rect.mTop - 2));
- params.sticky_rect(sticky_rect);
-
- LLToolTipMgr::getInstance()->show(params);
- return TRUE;
- }
-
- return LLPanel::handleToolTip(x, y, mask);
- }
-
void onObjectIconContextMenuItemClicked(const LLSD& userdata)
{
std::string level = userdata.asString();
@@ -174,12 +149,7 @@ public:
}
else if (level == "add")
{
- std::string name;
- name.assign(getFirstName());
- name.append(" ");
- name.append(getLastName());
-
- LLAvatarActions::requestFriendshipDialog(getAvatarId(), name);
+ LLAvatarActions::requestFriendshipDialog(getAvatarId(), mFrom);
}
else if (level == "remove")
{
@@ -200,7 +170,10 @@ public:
menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_object_icon.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
mPopupMenuHandleObject = menu->getHandle();
- setDoubleClickCallback(boost::bind(&LLChatHistoryHeader::onHeaderPanelClick, this, _2, _3, _4));
+ setDoubleClickCallback(boost::bind(&LLChatHistoryHeader::showInspector, this));
+
+ setMouseEnterCallback(boost::bind(&LLChatHistoryHeader::showInfoCtrl, this));
+ setMouseLeaveCallback(boost::bind(&LLChatHistoryHeader::hideInfoCtrl, this));
return LLPanel::postBuild();
}
@@ -234,8 +207,10 @@ public:
return LLPanel::handleRightMouseDown(x,y,mask);
}
- void onHeaderPanelClick(S32 x, S32 y, MASK mask)
+ void showInspector()
{
+ if (mAvatarID.isNull() && CHAT_SOURCE_SYSTEM != mSourceType) return;
+
if (mSourceType == CHAT_SOURCE_OBJECT)
{
LLFloaterReg::showInstance("inspect_object", LLSD().with("object_id", mAvatarID));
@@ -247,9 +222,18 @@ public:
//if chat source is system, you may add "else" here to define behaviour.
}
+ static void onClickInfoCtrl(LLUICtrl* info_ctrl)
+ {
+ if (!info_ctrl) return;
+
+ LLChatHistoryHeader* header = dynamic_cast<LLChatHistoryHeader*>(info_ctrl->getParent());
+ if (!header) return;
+
+ header->showInspector();
+ }
+
+
const LLUUID& getAvatarId () const { return mAvatarID;}
- const std::string& getFirstName() const { return mFirstName; }
- const std::string& getLastName () const { return mLastName; }
void setup(const LLChat& chat,const LLStyle::Params& style_params)
{
@@ -257,27 +241,27 @@ public:
mSessionID = chat.mSessionID;
mSourceType = chat.mSourceType;
gCacheName->get(mAvatarID, FALSE, boost::bind(&LLChatHistoryHeader::nameUpdatedCallback, this, _1, _2, _3, _4));
- if(chat.mFromID.isNull())
+
+ //*TODO overly defensive thing, source type should be maintained out there
+ if((chat.mFromID.isNull() && chat.mFromName.empty()) || chat.mFromName == SYSTEM_FROM && chat.mFromID.isNull())
{
mSourceType = CHAT_SOURCE_SYSTEM;
}
- LLTextEditor* userName = getChild<LLTextEditor>("user_name");
+ LLTextBox* userName = getChild<LLTextBox>("user_name");
userName->setReadOnlyColor(style_params.readonly_color());
userName->setColor(style_params.color());
- if(!chat.mFromName.empty())
- {
- userName->setValue(chat.mFromName);
- mFrom = chat.mFromName;
- }
- else
+ userName->setValue(chat.mFromName);
+ mFrom = chat.mFromName;
+ if (chat.mFromName.empty() || CHAT_SOURCE_SYSTEM == mSourceType)
{
- std::string SL = LLTrans::getString("SECOND_LIFE");
- userName->setValue(SL);
+ mFrom = LLTrans::getString("SECOND_LIFE");
+ userName->setValue(mFrom);
}
+
mMinUserNameWidth = style_params.font()->getWidth(userName->getWText().c_str()) + PADDING;
setTimeField(chat);
@@ -287,20 +271,25 @@ public:
if(mSourceType != CHAT_SOURCE_AGENT)
icon->setDrawTooltip(false);
- if(!chat.mFromID.isNull())
- {
- icon->setValue(chat.mFromID);
- }
- else if (userName->getValue().asString()==LLTrans::getString("SECOND_LIFE"))
+ switch (mSourceType)
{
- icon->setValue(LLSD("SL_Logo"));
+ case CHAT_SOURCE_AGENT:
+ icon->setValue(chat.mFromID);
+ break;
+ case CHAT_SOURCE_OBJECT:
+ icon->setValue(LLSD("OBJECT_Icon"));
+ break;
+ case CHAT_SOURCE_SYSTEM:
+ icon->setValue(LLSD("SL_Logo"));
+ break;
+ case CHAT_SOURCE_UNKNOWN:
+ icon->setValue(LLSD("Unknown_Icon"));
}
-
}
/*virtual*/ void draw()
{
- LLTextEditor* user_name = getChild<LLTextEditor>("user_name");
+ LLTextBox* user_name = getChild<LLTextBox>("user_name");
LLTextBox* time_box = getChild<LLTextBox>("time_box");
LLRect user_name_rect = user_name->getRect();
@@ -332,8 +321,7 @@ public:
{
if (id != mAvatarID)
return;
- mFirstName = first;
- mLastName = last;
+ mFrom = first + " " + last;
}
protected:
static const S32 PADDING = 20;
@@ -342,9 +330,9 @@ protected:
{
if(mSourceType == CHAT_SOURCE_SYSTEM)
showSystemContextMenu(x,y);
- if(mSourceType == CHAT_SOURCE_AGENT)
+ if(mAvatarID.notNull() && mSourceType == CHAT_SOURCE_AGENT)
showAvatarContextMenu(x,y);
- if(mSourceType == CHAT_SOURCE_OBJECT && SYSTEM_FROM != mFrom)
+ if(mAvatarID.notNull() && mSourceType == CHAT_SOURCE_OBJECT && SYSTEM_FROM != mFrom)
showObjectContextMenu(x,y);
}
@@ -388,6 +376,33 @@ protected:
}
}
+ void showInfoCtrl()
+ {
+ if (mAvatarID.isNull() || mFrom.empty() || SYSTEM_FROM == mFrom) return;
+
+ if (!sInfoCtrl)
+ {
+ sInfoCtrl = LLUICtrlFactory::createFromFile<LLUICtrl>("inspector_info_ctrl.xml", NULL, LLPanel::child_registry_t::instance());
+ sInfoCtrl->setCommitCallback(boost::bind(&LLChatHistoryHeader::onClickInfoCtrl, sInfoCtrl));
+ }
+
+ LLTextBase* name = getChild<LLTextBase>("user_name");
+ LLRect sticky_rect = name->getRect();
+ S32 icon_x = llmin(sticky_rect.mLeft + name->getTextBoundingRect().getWidth() + 7, sticky_rect.mRight - 3);
+ sInfoCtrl->setOrigin(icon_x, sticky_rect.getCenterY() - sInfoCtrl->getRect().getHeight() / 2 ) ;
+ addChild(sInfoCtrl);
+ }
+
+ void hideInfoCtrl()
+ {
+ if (!sInfoCtrl) return;
+
+ if (sInfoCtrl->getParent() == this)
+ {
+ removeChild(sInfoCtrl);
+ }
+ }
+
private:
void setTimeField(const LLChat& chat)
{
@@ -416,16 +431,17 @@ protected:
LLHandle<LLView> mPopupMenuHandleAvatar;
LLHandle<LLView> mPopupMenuHandleObject;
+ static LLUICtrl* sInfoCtrl;
+
LLUUID mAvatarID;
EChatSourceType mSourceType;
- std::string mFirstName;
- std::string mLastName;
std::string mFrom;
LLUUID mSessionID;
S32 mMinUserNameWidth;
};
+LLUICtrl* LLChatHistoryHeader::sInfoCtrl = NULL;
LLChatHistory::LLChatHistory(const LLChatHistory::Params& p)
: LLUICtrl(p),
@@ -438,12 +454,14 @@ LLChatHistory::LLChatHistory(const LLChatHistory::Params& p)
mTopSeparatorPad(p.top_separator_pad),
mBottomSeparatorPad(p.bottom_separator_pad),
mTopHeaderPad(p.top_header_pad),
- mBottomHeaderPad(p.bottom_header_pad)
+ mBottomHeaderPad(p.bottom_header_pad),
+ mIsLastMessageFromLog(false)
{
LLTextEditor::Params editor_params(p);
editor_params.rect = getLocalRect();
editor_params.follows.flags = FOLLOWS_ALL;
editor_params.enabled = false; // read only
+ editor_params.show_context_menu = "true";
mEditor = LLUICtrlFactory::create<LLTextEditor>(editor_params, this);
}
@@ -473,7 +491,7 @@ void LLChatHistory::initFromParams(const LLChatHistory::Params& p)
panel_p.background_visible = false;
panel_p.has_border = false;
panel_p.mouse_opaque = false;
- stackp->addPanel(LLUICtrlFactory::create<LLPanel>(panel_p), 0, 30, true, false, LLLayoutStack::ANIMATE);
+ stackp->addPanel(LLUICtrlFactory::create<LLPanel>(panel_p), 0, 30, S32_MAX, S32_MAX, true, false, LLLayoutStack::ANIMATE);
panel_p.name = "new_text_notice_holder";
LLRect new_text_notice_rect = getLocalRect();
@@ -491,7 +509,7 @@ void LLChatHistory::initFromParams(const LLChatHistory::Params& p)
mMoreChatText = LLUICtrlFactory::create<LLTextBox>(text_p, mMoreChatPanel);
mMoreChatText->setClickedCallback(boost::bind(&LLChatHistory::onClickMoreText, this));
- stackp->addPanel(mMoreChatPanel, 0, 0, false, false, LLLayoutStack::ANIMATE);
+ stackp->addPanel(mMoreChatPanel, 0, 0, S32_MAX, S32_MAX, false, false, LLLayoutStack::ANIMATE);
}
@@ -538,6 +556,12 @@ void LLChatHistory::clear()
void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LLStyle::Params& input_append_params)
{
bool use_plain_text_chat_history = args["use_plain_text_chat_history"].asBoolean();
+
+ if(mEditor)
+ {
+ mEditor->setPlainText(use_plain_text_chat_history);
+ }
+
if (!mEditor->scrolledToEnd() && chat.mFromID != gAgent.getID() && !chat.mFromName.empty())
{
mUnreadChatSources.insert(chat.mFromName);
@@ -603,30 +627,44 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
style_params.font.style = "ITALIC";
}
+ bool message_from_log = chat.mChatStyle == CHAT_STYLE_HISTORY;
+ // We graying out chat history by graying out messages that contains full date in a time string
+ if (message_from_log)
+ {
+ style_params.color(LLColor4::grey);
+ style_params.readonly_color(LLColor4::grey);
+ }
+
if (use_plain_text_chat_history)
{
- mEditor->appendText("[" + chat.mTimeStr + "] ", mEditor->getText().size() != 0, style_params);
+ LLStyle::Params timestamp_style(style_params);
+ if (!message_from_log)
+ {
+ LLColor4 timestamp_color = LLUIColorTable::instance().getColor("ChatTimestampColor");
+ timestamp_style.color(timestamp_color);
+ timestamp_style.readonly_color(timestamp_color);
+ }
+ mEditor->appendText("[" + chat.mTimeStr + "] ", mEditor->getText().size() != 0, timestamp_style);
if (utf8str_trim(chat.mFromName).size() != 0)
{
// Don't hotlink any messages from the system (e.g. "Second Life:"), so just add those in plain text.
- if ( chat.mSourceType == CHAT_SOURCE_OBJECT )
+ if ( chat.mSourceType == CHAT_SOURCE_OBJECT && chat.mFromID.notNull())
{
// for object IMs, create a secondlife:///app/objectim SLapp
- std::string url = LLSLURL::buildCommand("objectim", chat.mFromID, "");
+ std::string url = LLSLURL("objectim", chat.mFromID, "").getSLURLString();
url += "?name=" + chat.mFromName;
- url += "&owner=" + args["owner_id"].asString();
+ url += "&owner=" + chat.mOwnerID.asString();
std::string slurl = args["slurl"].asString();
if (slurl.empty())
{
- LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosAgent(chat.mPosAgent);
- if (region)
- {
- S32 x, y, z;
- LLSLURL::globalPosToXYZ(LLVector3d(chat.mPosAgent), x, y, z);
- slurl = region->getName() + llformat("/%d/%d/%d", x, y, z);
- }
+ LLViewerRegion *region = LLWorld::getInstance()->getRegionFromPosAgent(chat.mPosAgent);
+ if(region)
+ {
+ LLSLURL region_slurl(region->getName(), chat.mPosAgent);
+ slurl = region_slurl.getLocationString();
+ }
}
url += "&slurl=" + slurl;
@@ -634,14 +672,14 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
// (don't let object names with hyperlinks override our objectim Url)
LLStyle::Params link_params(style_params);
link_params.color.control = "HTMLLinkColor";
- link_params.link_href = url;
+ link_params.link_href = LLURI::escape(url);
mEditor->appendText("<nolink>" + chat.mFromName + "</nolink>" + delimiter,
false, link_params);
}
- else if ( chat.mFromName != SYSTEM_FROM && chat.mFromID.notNull() )
+ else if ( chat.mFromName != SYSTEM_FROM && chat.mFromID.notNull() && !message_from_log)
{
LLStyle::Params link_params(style_params);
- link_params.fillFrom(LLStyleMap::instance().lookupAgent(chat.mFromID));
+ link_params.overwriteFrom(LLStyleMap::instance().lookupAgent(chat.mFromID));
// Convert the name to a hotlink and add to message.
mEditor->appendText(chat.mFromName + delimiter, false, link_params);
}
@@ -665,7 +703,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
&& mLastFromID == chat.mFromID
&& mLastMessageTime.notNull()
&& (new_message_time.secondsSinceEpoch() - mLastMessageTime.secondsSinceEpoch()) < 60.0
- && mLastMessageTimeStr.size() == chat.mTimeStr.size()) //*HACK to distinguish between current and previous chat session's histories
+ && mIsLastMessageFromLog == message_from_log) //distinguish between current and previous chat session's histories
{
view = getSeparator();
p.top_pad = mTopSeparatorPad;
@@ -699,7 +737,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
mLastFromName = chat.mFromName;
mLastFromID = chat.mFromID;
mLastMessageTime = new_message_time;
- mLastMessageTimeStr = chat.mTimeStr;
+ mIsLastMessageFromLog = message_from_log;
}
if (chat.mNotifId.notNull())
@@ -707,29 +745,35 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
LLNotificationPtr notification = LLNotificationsUtil::find(chat.mNotifId);
if (notification != NULL)
{
- LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(
- notification);
+ LLIMToastNotifyPanel* notify_box = new LLIMToastNotifyPanel(
+ notification, chat.mSessionID);
//we can't set follows in xml since it broke toasts behavior
notify_box->setFollowsLeft();
notify_box->setFollowsRight();
notify_box->setFollowsTop();
- LLButton* accept_button = notify_box->getChild<LLButton> ("Accept",
- TRUE);
- if (accept_button != NULL)
- {
- accept_button->setFollowsNone();
- accept_button->setOrigin(2*HPAD, accept_button->getRect().mBottom);
- }
-
- LLButton* decline_button = notify_box->getChild<LLButton> (
- "Decline", TRUE);
- if (accept_button != NULL && decline_button != NULL)
+ ctrl_list_t ctrls = notify_box->getControlPanel()->getCtrlList();
+ S32 offset = 0;
+ // Children were added by addChild() which uses push_front to insert them into list,
+ // so to get buttons in correct order reverse iterator is used (EXT-5906)
+ for (ctrl_list_t::reverse_iterator it = ctrls.rbegin(); it != ctrls.rend(); it++)
{
- decline_button->setFollowsNone();
- decline_button->setOrigin(4*HPAD
- + accept_button->getRect().getWidth(),
- decline_button->getRect().mBottom);
+ LLButton * button = dynamic_cast<LLButton*> (*it);
+ if (button != NULL)
+ {
+ button->setOrigin( offset,
+ button->getRect().mBottom);
+ button->setLeftHPad(2 * HPAD);
+ button->setRightHPad(2 * HPAD);
+ // set zero width before perform autoResize()
+ button->setRect(LLRect(button->getRect().mLeft,
+ button->getRect().mTop, button->getRect().mLeft,
+ button->getRect().mBottom));
+ button->setAutoResize(true);
+ button->autoResize();
+ offset += HPAD + button->getRect().getWidth();
+ button->setFollowsNone();
+ }
}
LLTextEditor* text_editor = notify_box->getChild<LLTextEditor>("text_editor_box", TRUE);
@@ -767,6 +811,25 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
else
{
std::string message = irc_me ? chat.mText.substr(3) : chat.mText;
+
+
+ //MESSAGE TEXT PROCESSING
+ //*HACK getting rid of redundant sender names in system notifications sent using sender name (see EXT-5010)
+ if (use_plain_text_chat_history && gAgentID != chat.mFromID && chat.mFromID.notNull())
+ {
+ std::string slurl_about = SLURL_APP_AGENT + chat.mFromID.asString() + SLURL_ABOUT;
+ if (message.length() > slurl_about.length() &&
+ message.compare(0, slurl_about.length(), slurl_about) == 0)
+ {
+ message = message.substr(slurl_about.length(), message.length()-1);
+ }
+ }
+
+ if (irc_me && !use_plain_text_chat_history)
+ {
+ message = chat.mFromName + message;
+ }
+
mEditor->appendText(message, FALSE, style_params);
}
mEditor->blockUndo();
@@ -788,12 +851,3 @@ void LLChatHistory::draw()
LLUICtrl::draw();
}
-
-void LLChatHistory::reshape(S32 width, S32 height, BOOL called_from_parent)
-{
- bool is_scrolled_to_end = mEditor->scrolledToEnd();
- LLUICtrl::reshape( width, height, called_from_parent );
- // update scroll
- if (is_scrolled_to_end)
- mEditor->setCursorAndScrollToEnd();
-}
diff --git a/indra/newview/llchathistory.h b/indra/newview/llchathistory.h
index 32600bb71d..fa1f2e04a4 100644
--- a/indra/newview/llchathistory.h
+++ b/indra/newview/llchathistory.h
@@ -122,13 +122,13 @@ class LLChatHistory : public LLUICtrl
*/
void appendMessage(const LLChat& chat, const LLSD &args = LLSD(), const LLStyle::Params& input_append_params = LLStyle::Params());
/*virtual*/ void clear();
- /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
private:
std::string mLastFromName;
LLUUID mLastFromID;
LLDate mLastMessageTime;
- std::string mLastMessageTimeStr;
+ bool mIsLastMessageFromLog;
+ //std::string mLastMessageTimeStr;
std::string mMessageHeaderFilename;
std::string mMessageSeparatorFilename;
diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index f772aea4bd..35a244c461 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -44,6 +44,8 @@
#include "llviewercontrol.h"
#include "llagentdata.h"
+#include "llslurl.h"
+
static const S32 msg_left_offset = 10;
static const S32 msg_right_offset = 10;
static const S32 msg_height_pad = 5;
@@ -144,6 +146,7 @@ void LLNearbyChatToastPanel::init(LLSD& notification)
std::string messageText = notification["message"].asString(); // UTF-8 line of text
std::string fromName = notification["from"].asString(); // agent or object name
mFromID = notification["from_id"].asUUID(); // agent id or object id
+ mFromName = fromName;
int sType = notification["source"].asInteger();
mSourceType = (EChatSourceType)sType;
@@ -189,6 +192,8 @@ void LLNearbyChatToastPanel::init(LLSD& notification)
style_params_name.font.name(font_name);
style_params_name.font.size(font_style_size);
+ style_params_name.link_href = LLSLURL("agent",mFromID,"about").getSLURLString();
+
msg_text->appendText(str_sender, FALSE, style_params_name);
}
@@ -321,7 +326,14 @@ void LLNearbyChatToastPanel::draw()
if(icon)
{
icon->setDrawTooltip(mSourceType == CHAT_SOURCE_AGENT);
- icon->setValue(mFromID);
+ if(mSourceType == CHAT_SOURCE_OBJECT)
+ icon->setValue(LLSD("OBJECT_Icon"));
+ else if(mSourceType == CHAT_SOURCE_SYSTEM)
+ icon->setValue(LLSD("SL_Logo"));
+ else if(mSourceType == CHAT_SOURCE_AGENT)
+ icon->setValue(mFromID);
+ else if(!mFromID.isNull())
+ icon->setValue(mFromID);
}
mIsDirty = false;
}
diff --git a/indra/newview/llchatitemscontainerctrl.h b/indra/newview/llchatitemscontainerctrl.h
index 4d730573d9..b28c9dbc4b 100644
--- a/indra/newview/llchatitemscontainerctrl.h
+++ b/indra/newview/llchatitemscontainerctrl.h
@@ -60,6 +60,7 @@ public:
static LLNearbyChatToastPanel* createInstance();
const LLUUID& getFromID() const { return mFromID;}
+ const std::string& getFromName() const { return mFromName; }
//void addText (const std::string& message , const LLStyle::Params& input_params = LLStyle::Params());
//void setMessage (const LLChat& msg);
@@ -84,9 +85,11 @@ public:
virtual void draw();
+ //*TODO REMOVE, why a dup of getFromID?
const LLUUID& messageID() const { return mFromID;}
private:
LLUUID mFromID; // agent id or object id
+ std::string mFromName;
EChatSourceType mSourceType;
diff --git a/indra/newview/llchiclet.cpp b/indra/newview/llchiclet.cpp
index f646bcccb5..6897f4ee8e 100644
--- a/indra/newview/llchiclet.cpp
+++ b/indra/newview/llchiclet.cpp
@@ -36,6 +36,7 @@
#include "llagent.h"
#include "llavataractions.h"
#include "llbottomtray.h"
+#include "lleventtimer.h"
#include "llgroupactions.h"
#include "lliconctrl.h"
#include "llimfloater.h"
@@ -130,8 +131,6 @@ LLSysWellChiclet::Params::Params()
: button("button")
, unread_notifications("unread_notifications")
, max_displayed_count("max_displayed_count", 99)
-, flash_to_lit_count("flash_to_lit_count", 3)
-, flash_period("flash_period", 0.5F)
{
button.name("button");
button.tab_stop(FALSE);
@@ -151,7 +150,13 @@ LLSysWellChiclet::LLSysWellChiclet(const Params& p)
mButton = LLUICtrlFactory::create<LLButton>(button_params);
addChild(mButton);
- mFlashToLitTimer = new FlashToLitTimer(p.flash_to_lit_count, p.flash_period, boost::bind(&LLSysWellChiclet::changeLitState, this));
+ // use settings from settings.xml to be able change them via Debug settings. See EXT-5973.
+ // Due to Timer is implemented as derived class from EventTimer it is impossible to change period
+ // in runtime. So, both settings are made as required restart.
+ static S32 flash_to_lit_count = gSavedSettings.getS32("WellIconFlashCount");
+ static F32 flash_period = gSavedSettings.getF32("WellIconFlashPeriod");
+
+ mFlashToLitTimer = new FlashToLitTimer(flash_to_lit_count, flash_period, boost::bind(&LLSysWellChiclet::changeLitState, this));
}
LLSysWellChiclet::~LLSysWellChiclet()
@@ -178,20 +183,6 @@ void LLSysWellChiclet::setCounter(S32 counter)
mButton->setLabel(s_count);
- setNewMessagesState(counter > mCounter);
-
- // we have to flash to 'Lit' state each time new unread message is coming.
- if (counter > mCounter)
- {
- mFlashToLitTimer->flash();
- }
- else if (counter == 0)
- {
- // if notification is resolved while well is flashing it can leave in the 'Lit' state
- // when flashing finishes itself. Let break flashing here.
- mFlashToLitTimer->stopFlashing();
- }
-
mCounter = counter;
}
@@ -228,6 +219,11 @@ void LLSysWellChiclet::setNewMessagesState(bool new_messages)
void LLSysWellChiclet::updateWidget(bool is_window_empty)
{
mButton->setEnabled(!is_window_empty);
+
+ LLSD params;
+ params["well_empty"] = is_window_empty;
+ params["well_name"] = getName();
+ notifyParent(params);
}
// virtual
BOOL LLSysWellChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
@@ -306,7 +302,26 @@ void LLIMWellChiclet::createMenu()
void LLIMWellChiclet::messageCountChanged(const LLSD& session_data)
{
- setCounter(LLBottomTray::getInstance()->getTotalUnreadIMCount());
+ const LLUUID& session_id = session_data["session_id"];
+ const S32 counter = LLBottomTray::getInstance()->getTotalUnreadIMCount();
+ const bool im_not_visible = !LLFloaterReg::instanceVisible("im_container")
+ && !LLFloaterReg::instanceVisible("impanel", session_id);
+
+ setNewMessagesState(counter > mCounter && im_not_visible);
+
+ // we have to flash to 'Lit' state each time new unread message is coming.
+ if (counter > mCounter && im_not_visible)
+ {
+ mFlashToLitTimer->flash();
+ }
+ else if (counter == 0)
+ {
+ // if notification is resolved while well is flashing it can leave in the 'Lit' state
+ // when flashing finishes itself. Let break flashing here.
+ mFlashToLitTimer->stopFlashing();
+ }
+
+ setCounter(counter);
}
/************************************************************************/
@@ -455,6 +470,7 @@ LLIMChiclet::LLIMChiclet(const LLIMChiclet::Params& p)
, mSpeakerCtrl(NULL)
, mCounterCtrl(NULL)
, mChicletButton(NULL)
+, mPopupMenu(NULL)
{
enableCounterControl(p.enable_counter);
}
@@ -545,6 +561,7 @@ void LLIMChiclet::toggleSpeakerControl()
}
setRequiredWidth();
+ mSpeakerCtrl->setSpeakerId(LLUUID::null);
mSpeakerCtrl->setVisible(getShowSpeaker());
}
@@ -637,6 +654,37 @@ LLIMChiclet::EType LLIMChiclet::getIMSessionType(const LLUUID& session_id)
return type;
}
+BOOL LLIMChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+ if(!mPopupMenu)
+ {
+ createPopupMenu();
+ }
+
+ if (mPopupMenu)
+ {
+ updateMenuItems();
+ mPopupMenu->arrangeAndClear();
+ LLMenuGL::showPopup(this, mPopupMenu, x, y);
+ }
+
+ return TRUE;
+}
+
+bool LLIMChiclet::canCreateMenu()
+{
+ if(mPopupMenu)
+ {
+ llwarns << "Menu already exists" << llendl;
+ return false;
+ }
+ if(getSessionId().isNull())
+ {
+ return false;
+ }
+ return true;
+}
+
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
@@ -654,7 +702,6 @@ LLIMP2PChiclet::Params::Params()
LLIMP2PChiclet::LLIMP2PChiclet(const Params& p)
: LLIMChiclet(p)
, mChicletIconCtrl(NULL)
-, mPopupMenu(NULL)
{
LLButton::Params button_params = p.chiclet_button;
mChicletButton = LLUICtrlFactory::create<LLButton>(button_params);
@@ -709,34 +756,10 @@ void LLIMP2PChiclet::updateMenuItems()
mPopupMenu->getChild<LLUICtrl>("Add Friend")->setEnabled(!is_friend);
}
-BOOL LLIMP2PChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
-{
- if(!mPopupMenu)
- {
- createPopupMenu();
- }
-
- if (mPopupMenu)
- {
- updateMenuItems();
- mPopupMenu->arrangeAndClear();
- LLMenuGL::showPopup(this, mPopupMenu, x, y);
- }
-
- return TRUE;
-}
-
void LLIMP2PChiclet::createPopupMenu()
{
- if(mPopupMenu)
- {
- llwarns << "Menu already exists" << llendl;
- return;
- }
- if(getSessionId().isNull())
- {
+ if(!canCreateMenu())
return;
- }
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
registrar.add("IMChicletMenu.Action", boost::bind(&LLIMP2PChiclet::onMenuItemClicked, this, _2));
@@ -786,7 +809,6 @@ LLAdHocChiclet::Params::Params()
LLAdHocChiclet::LLAdHocChiclet(const Params& p)
: LLIMChiclet(p)
, mChicletIconCtrl(NULL)
-, mPopupMenu(NULL)
{
LLButton::Params button_params = p.chiclet_button;
mChicletButton = LLUICtrlFactory::create<LLButton>(button_params);
@@ -856,15 +878,8 @@ void LLAdHocChiclet::switchToCurrentSpeaker()
void LLAdHocChiclet::createPopupMenu()
{
- if(mPopupMenu)
- {
- llwarns << "Menu already exists" << llendl;
+ if(!canCreateMenu())
return;
- }
- if(getSessionId().isNull())
- {
- return;
- }
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
registrar.add("IMChicletMenu.Action", boost::bind(&LLAdHocChiclet::onMenuItemClicked, this, _2));
@@ -884,22 +899,6 @@ void LLAdHocChiclet::onMenuItemClicked(const LLSD& user_data)
}
}
-BOOL LLAdHocChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
-{
- if(!mPopupMenu)
- {
- createPopupMenu();
- }
-
- if (mPopupMenu)
- {
- mPopupMenu->arrangeAndClear();
- LLMenuGL::showPopup(this, mPopupMenu, x, y);
- }
-
- return TRUE;
-}
-
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
@@ -918,7 +917,6 @@ LLIMGroupChiclet::LLIMGroupChiclet(const Params& p)
: LLIMChiclet(p)
, LLGroupMgrObserver(LLUUID::null)
, mChicletIconCtrl(NULL)
-, mPopupMenu(NULL)
{
LLButton::Params button_params = p.chiclet_button;
mChicletButton = LLUICtrlFactory::create<LLButton>(button_params);
@@ -954,7 +952,10 @@ LLIMGroupChiclet::~LLIMGroupChiclet()
void LLIMGroupChiclet::draw()
{
- switchToCurrentSpeaker();
+ if(getShowSpeaker())
+ {
+ switchToCurrentSpeaker();
+ }
LLIMChiclet::draw();
}
@@ -1028,34 +1029,10 @@ void LLIMGroupChiclet::updateMenuItems()
mPopupMenu->getChild<LLUICtrl>("Chat")->setEnabled(!open_window_exists);
}
-BOOL LLIMGroupChiclet::handleRightMouseDown(S32 x, S32 y, MASK mask)
-{
- if(!mPopupMenu)
- {
- createPopupMenu();
- }
-
- if (mPopupMenu)
- {
- updateMenuItems();
- mPopupMenu->arrangeAndClear();
- LLMenuGL::showPopup(this, mPopupMenu, x, y);
- }
-
- return TRUE;
-}
-
void LLIMGroupChiclet::createPopupMenu()
{
- if(mPopupMenu)
- {
- llwarns << "Menu already exists" << llendl;
- return;
- }
- if(getSessionId().isNull())
- {
+ if(!canCreateMenu())
return;
- }
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
registrar.add("IMChicletMenu.Action", boost::bind(&LLIMGroupChiclet::onMenuItemClicked, this, _2));
@@ -1132,7 +1109,7 @@ void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){
S32 unread = data["participant_unread"].asInteger();
LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
- if (im_floater && im_floater->getVisible())
+ if (im_floater && im_floater->getVisible() && im_floater->hasFocus())
{
unread = 0;
}
@@ -1154,10 +1131,10 @@ void im_chiclet_callback(LLChicletPanel* panel, const LLSD& data){
void object_chiclet_callback(const LLSD& data)
{
- LLUUID object_id = data["object_id"];
+ LLUUID notification_id = data["notification_id"];
bool new_message = data["new_message"];
- std::list<LLChiclet*> chiclets = LLIMChiclet::sFindChicletsSignal(object_id);
+ std::list<LLChiclet*> chiclets = LLIMChiclet::sFindChicletsSignal(notification_id);
std::list<LLChiclet *>::iterator iter;
for (iter = chiclets.begin(); iter != chiclets.end(); iter++)
{
@@ -1889,12 +1866,8 @@ void LLScriptChiclet::setSessionId(const LLUUID& session_id)
setShowNewMessagesIcon( getSessionId() != session_id );
LLIMChiclet::setSessionId(session_id);
- LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(session_id);
- LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
- if(notification)
- {
- setToolTip(notification->getSubstitutions()["TITLE"].asString());
- }
+
+ setToolTip(LLScriptFloaterManager::getObjectName(session_id));
}
void LLScriptChiclet::setCounter(S32 counter)
@@ -1907,6 +1880,28 @@ void LLScriptChiclet::onMouseDown()
LLScriptFloaterManager::getInstance()->toggleScriptFloater(getSessionId());
}
+void LLScriptChiclet::onMenuItemClicked(const LLSD& user_data)
+{
+ std::string action = user_data.asString();
+
+ if("end" == action)
+ {
+ LLScriptFloaterManager::instance().onRemoveNotification(getSessionId());
+ }
+}
+
+void LLScriptChiclet::createPopupMenu()
+{
+ if(!canCreateMenu())
+ return;
+
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+ registrar.add("ScriptChiclet.Action", boost::bind(&LLScriptChiclet::onMenuItemClicked, this, _2));
+
+ mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>
+ ("menu_script_chiclet.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+}
+
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
@@ -1943,13 +1938,10 @@ void LLInvOfferChiclet::setSessionId(const LLUUID& session_id)
{
setShowNewMessagesIcon( getSessionId() != session_id );
+ setToolTip(LLScriptFloaterManager::getObjectName(session_id));
+
LLIMChiclet::setSessionId(session_id);
- LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(session_id);
- LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
- if(notification)
- {
- setToolTip(notification->getSubstitutions()["TITLE"].asString());
- }
+ LLNotificationPtr notification = LLNotifications::getInstance()->find(session_id);
if ( notification && notification->getName() == INVENTORY_USER_OFFER )
{
@@ -1971,4 +1963,26 @@ void LLInvOfferChiclet::onMouseDown()
LLScriptFloaterManager::instance().toggleScriptFloater(getSessionId());
}
+void LLInvOfferChiclet::onMenuItemClicked(const LLSD& user_data)
+{
+ std::string action = user_data.asString();
+
+ if("end" == action)
+ {
+ LLScriptFloaterManager::instance().onRemoveNotification(getSessionId());
+ }
+}
+
+void LLInvOfferChiclet::createPopupMenu()
+{
+ if(!canCreateMenu())
+ return;
+
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+ registrar.add("InvOfferChiclet.Action", boost::bind(&LLInvOfferChiclet::onMenuItemClicked, this, _2));
+
+ mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>
+ ("menu_inv_offer_chiclet.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+}
+
// EOF
diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h
index b006ae3420..9d421b4f0b 100644
--- a/indra/newview/llchiclet.h
+++ b/indra/newview/llchiclet.h
@@ -428,12 +428,31 @@ public:
virtual void setToggleState(bool toggle);
+ /**
+ * Displays popup menu.
+ */
+ virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
+
protected:
LLIMChiclet(const LLIMChiclet::Params& p);
protected:
+ /**
+ * Creates chiclet popup menu.
+ */
+ virtual void createPopupMenu() = 0;
+
+ /**
+ * Enables/disables menus.
+ */
+ virtual void updateMenuItems() {};
+
+ bool canCreateMenu();
+
+ LLMenuGL* mPopupMenu;
+
bool mShowSpeaker;
bool mCounterEnabled;
/* initial width of chiclet, should not include counter or speaker width */
@@ -519,11 +538,6 @@ protected:
*/
virtual void onMenuItemClicked(const LLSD& user_data);
- /**
- * Displays popup menu.
- */
- /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
-
/**
* Enables/disables menus based on relationship with other participant.
* Enables/disables "show session" menu item depending on visible IM floater existence.
@@ -533,7 +547,6 @@ protected:
private:
LLChicletAvatarIconCtrl* mChicletIconCtrl;
- LLMenuGL* mPopupMenu;
};
/**
@@ -598,11 +611,6 @@ protected:
virtual void onMenuItemClicked(const LLSD& user_data);
/**
- * Displays popup menu.
- */
- virtual BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
-
- /**
* Finds a current speaker and resets the SpeakerControl with speaker's ID
*/
/*virtual*/ void switchToCurrentSpeaker();
@@ -610,7 +618,6 @@ protected:
private:
LLChicletAvatarIconCtrl* mChicletIconCtrl;
- LLMenuGL* mPopupMenu;
};
/**
@@ -647,6 +654,16 @@ protected:
LLScriptChiclet(const Params&);
friend class LLUICtrlFactory;
+ /**
+ * Creates chiclet popup menu.
+ */
+ virtual void createPopupMenu();
+
+ /**
+ * Processes clicks on chiclet popup menu.
+ */
+ virtual void onMenuItemClicked(const LLSD& user_data);
+
private:
LLIconCtrl* mChicletIconCtrl;
@@ -685,6 +702,16 @@ protected:
LLInvOfferChiclet(const Params&);
friend class LLUICtrlFactory;
+ /**
+ * Creates chiclet popup menu.
+ */
+ virtual void createPopupMenu();
+
+ /**
+ * Processes clicks on chiclet popup menu.
+ */
+ virtual void onMenuItemClicked(const LLSD& user_data);
+
private:
LLChicletInvOfferIconCtrl* mChicletIconCtrl;
};
@@ -767,15 +794,9 @@ protected:
*/
virtual void updateMenuItems();
- /**
- * Displays popup menu.
- */
- /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
-
private:
LLChicletGroupIconCtrl* mChicletIconCtrl;
- LLMenuGL* mPopupMenu;
};
/**
@@ -800,16 +821,6 @@ public:
*/
Optional<S32> max_displayed_count;
- /**
- * How many time chiclet should flash before set "Lit" state. Default value is 3.
- */
- Optional<S32> flash_to_lit_count;
-
- /**
- * Period of flashing while setting "Lit" state, in seconds. Default value is 0.5.
- */
- Optional<F32> flash_period;
-
Params();
};
@@ -910,6 +921,9 @@ protected:
class LLNotificationChiclet : public LLSysWellChiclet
{
friend class LLUICtrlFactory;
+public:
+ struct Params : public LLInitParam::Block<Params, LLSysWellChiclet::Params>{};
+
protected:
LLNotificationChiclet(const Params& p);
@@ -1228,12 +1242,15 @@ T* LLChicletPanel::findChiclet(const LLUUID& im_session_id)
{
LLChiclet* chiclet = *it;
+ llassert(chiclet);
+ if (!chiclet) continue;
if(chiclet->getSessionId() == im_session_id)
{
T* result = dynamic_cast<T*>(chiclet);
- if(!result && chiclet)
+ if(!result)
{
llwarns << "Found chiclet but of wrong type " << llendl;
+ continue;
}
return result;
}
diff --git a/indra/newview/llclassifiedstatsresponder.cpp b/indra/newview/llclassifiedstatsresponder.cpp
index ecd1879090..95f17aa7ba 100644
--- a/indra/newview/llclassifiedstatsresponder.cpp
+++ b/indra/newview/llclassifiedstatsresponder.cpp
@@ -43,11 +43,12 @@
#include "llview.h"
#include "message.h"
-LLClassifiedStatsResponder::LLClassifiedStatsResponder(LLHandle<LLView> classified_panel_handle, LLUUID classified_id)
-: mClassifiedPanelHandle(classified_panel_handle),
+LLClassifiedStatsResponder::LLClassifiedStatsResponder(LLUUID classified_id)
+:
mClassifiedID(classified_id)
{
}
+
/*virtual*/
void LLClassifiedStatsResponder::result(const LLSD& content)
{
@@ -58,17 +59,12 @@ void LLClassifiedStatsResponder::result(const LLSD& content)
S32 search_map = content["search_map_clicks"].asInteger();
S32 search_profile = content["search_profile_clicks"].asInteger();
- LLPanelClassified* classified_panelp = (LLPanelClassified*)mClassifiedPanelHandle.get();
-
- if(classified_panelp)
- {
- classified_panelp->setClickThrough(mClassifiedID,
- teleport + search_teleport,
- map + search_map,
- profile + search_profile,
- true);
- }
-
+ LLPanelClassifiedInfo::setClickThrough(
+ mClassifiedID,
+ teleport + search_teleport,
+ map + search_map,
+ profile + search_profile,
+ true);
}
/*virtual*/
@@ -77,5 +73,3 @@ void LLClassifiedStatsResponder::error(U32 status, const std::string& reason)
llinfos << "LLClassifiedStatsResponder::error("
<< status << ": " << reason << ")" << llendl;
}
-
-
diff --git a/indra/newview/llclassifiedstatsresponder.h b/indra/newview/llclassifiedstatsresponder.h
index 9c52ed5ae1..4a74f7b129 100644
--- a/indra/newview/llclassifiedstatsresponder.h
+++ b/indra/newview/llclassifiedstatsresponder.h
@@ -40,7 +40,7 @@
class LLClassifiedStatsResponder : public LLHTTPClient::Responder
{
public:
- LLClassifiedStatsResponder(LLHandle<LLView> classified_panel_handle, LLUUID classified_id);
+ LLClassifiedStatsResponder(LLUUID classified_id);
//If we get back a normal response, handle it here
virtual void result(const LLSD& content);
//If we get back an error (not found, etc...), handle it here
@@ -48,7 +48,6 @@ public:
virtual void error(U32 status, const std::string& reason);
protected:
- LLHandle<LLView> mClassifiedPanelHandle;
LLUUID mClassifiedID;
};
diff --git a/indra/newview/llcloud.cpp b/indra/newview/llcloud.cpp
index af6f4e3286..a4104923e4 100644
--- a/indra/newview/llcloud.cpp
+++ b/indra/newview/llcloud.cpp
@@ -329,16 +329,7 @@ void LLCloudLayer::setRegion(LLViewerRegion *regionp)
void LLCloudLayer::destroy()
{
- // Kill all of the existing puffs
- S32 i, j;
-
- for (i = 0; i < CLOUD_GROUPS_PER_EDGE; i++)
- {
- for (j = 0; j < CLOUD_GROUPS_PER_EDGE; j++)
- {
- mCloudGroups[i][j].cleanup();
- }
- }
+ reset();
delete [] mDensityp;
mDensityp = NULL;
@@ -348,8 +339,17 @@ void LLCloudLayer::destroy()
void LLCloudLayer::reset()
{
-}
+ // Kill all of the existing puffs
+ S32 i, j;
+ for (i = 0; i < CLOUD_GROUPS_PER_EDGE; i++)
+ {
+ for (j = 0; j < CLOUD_GROUPS_PER_EDGE; j++)
+ {
+ mCloudGroups[i][j].cleanup();
+ }
+ }
+}
void LLCloudLayer::setWindPointer(LLWind *windp)
{
diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp
new file mode 100644
index 0000000000..aa8cc01f7d
--- /dev/null
+++ b/indra/newview/llcofwearables.cpp
@@ -0,0 +1,616 @@
+/**
+ * @file llcofwearables.cpp
+ * @brief LLCOFWearables displayes wearables from the current outfit split into three lists (attachments, clothing and body parts)
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llcofwearables.h"
+
+#include "llaccordionctrl.h"
+#include "llaccordionctrltab.h"
+#include "llagentdata.h"
+#include "llagentwearables.h"
+#include "llappearancemgr.h"
+#include "llinventory.h"
+#include "llinventoryfunctions.h"
+#include "lllistcontextmenu.h"
+#include "llmenugl.h"
+#include "llviewermenu.h"
+#include "llwearableitemslist.h"
+#include "llpaneloutfitedit.h"
+#include "llsidetray.h"
+#include "lltrans.h"
+
+static LLRegisterPanelClassWrapper<LLCOFWearables> t_cof_wearables("cof_wearables");
+
+const LLSD REARRANGE = LLSD().with("rearrange", LLSD());
+
+static const LLWearableItemNameComparator WEARABLE_NAME_COMPARATOR;
+
+//////////////////////////////////////////////////////////////////////////
+
+class CofContextMenu : public LLListContextMenu
+{
+protected:
+ CofContextMenu(LLCOFWearables* cof_wearables)
+ : mCOFWearables(cof_wearables)
+ {
+ llassert(mCOFWearables);
+ }
+
+ void updateCreateWearableLabel(LLMenuGL* menu, const LLUUID& item_id)
+ {
+ LLMenuItemGL* menu_item = menu->getChild<LLMenuItemGL>("create_new");
+ LLWearableType::EType w_type = getWearableType(item_id);
+
+ // Hide the "Create new <WEARABLE_TYPE>" if it's irrelevant.
+ if (w_type == LLWearableType::WT_NONE)
+ {
+ menu_item->setVisible(FALSE);
+ return;
+ }
+
+ // Set proper label for the "Create new <WEARABLE_TYPE>" menu item.
+ LLStringUtil::format_map_t args;
+ args["[WEARABLE_TYPE]"] = LLWearableType::getTypeDefaultNewName(w_type);
+ std::string new_label = LLTrans::getString("CreateNewWearable", args);
+ menu_item->setLabel(new_label);
+ }
+
+ void createNew(const LLUUID& item_id)
+ {
+ LLAgentWearables::createWearable(getWearableType(item_id), true);
+ }
+
+ // Get wearable type of the given item.
+ //
+ // There is a special case: so-called "dummy items"
+ // (i.e. the ones that are there just to indicate that you're not wearing
+ // any wearables of the corresponding type. They are currently grayed out
+ // and suffixed with "not worn").
+ // Those items don't have an UUID, but they do have an associated wearable type.
+ // If the user has invoked context menu for such item,
+ // we ignore the passed item_id and retrieve wearable type from the item.
+ LLWearableType::EType getWearableType(const LLUUID& item_id)
+ {
+ if (!isDummyItem(item_id))
+ {
+ LLViewerInventoryItem* item = gInventory.getLinkedItem(item_id);
+ if (item && item->isWearableType())
+ {
+ return item->getWearableType();
+ }
+ }
+ else if (mCOFWearables) // dummy item selected
+ {
+ LLPanelDummyClothingListItem* item;
+
+ item = dynamic_cast<LLPanelDummyClothingListItem*>(mCOFWearables->getSelectedItem());
+ if (item)
+ {
+ return item->getWearableType();
+ }
+ }
+
+ return LLWearableType::WT_NONE;
+ }
+
+ static bool isDummyItem(const LLUUID& item_id)
+ {
+ return item_id.isNull();
+ }
+
+ LLCOFWearables* mCOFWearables;
+};
+
+//////////////////////////////////////////////////////////////////////////
+
+class CofAttachmentContextMenu : public CofContextMenu
+{
+public:
+ CofAttachmentContextMenu(LLCOFWearables* cof_wearables)
+ : CofContextMenu(cof_wearables)
+ {
+ }
+
+protected:
+
+ /*virtual*/ LLContextMenu* createMenu()
+ {
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+
+ functor_t take_off = boost::bind(&LLAppearanceMgr::removeItemFromAvatar, LLAppearanceMgr::getInstance(), _1);
+ registrar.add("Attachment.Detach", boost::bind(handleMultiple, take_off, mUUIDs));
+
+ return createFromFile("menu_cof_attachment.xml");
+ }
+};
+
+//////////////////////////////////////////////////////////////////////////
+
+class CofClothingContextMenu : public CofContextMenu
+{
+public:
+ CofClothingContextMenu(LLCOFWearables* cof_wearables)
+ : CofContextMenu(cof_wearables)
+ {
+ }
+
+protected:
+ /*virtual*/ LLContextMenu* createMenu()
+ {
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+ LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
+ LLUUID selected_id = mUUIDs.back();
+ functor_t take_off = boost::bind(&LLAppearanceMgr::removeItemFromAvatar, LLAppearanceMgr::getInstance(), _1);
+
+ registrar.add("Clothing.TakeOff", boost::bind(handleMultiple, take_off, mUUIDs));
+ registrar.add("Clothing.MoveUp", boost::bind(moveWearable, selected_id, false));
+ registrar.add("Clothing.MoveDown", boost::bind(moveWearable, selected_id, true));
+ registrar.add("Clothing.Edit", boost::bind(LLAgentWearables::editWearable, selected_id));
+ registrar.add("Clothing.Create", boost::bind(&CofClothingContextMenu::createNew, this, selected_id));
+
+ enable_registrar.add("Clothing.OnEnable", boost::bind(&CofClothingContextMenu::onEnable, this, _2));
+
+ LLContextMenu* menu = createFromFile("menu_cof_clothing.xml");
+ llassert(menu);
+ if (menu)
+ {
+ updateCreateWearableLabel(menu, selected_id);
+ }
+ return menu;
+ }
+
+ bool onEnable(const LLSD& data)
+ {
+ std::string param = data.asString();
+ LLUUID selected_id = mUUIDs.back();
+
+ if ("move_up" == param)
+ {
+ return gAgentWearables.canMoveWearable(selected_id, false);
+ }
+ else if ("move_down" == param)
+ {
+ return gAgentWearables.canMoveWearable(selected_id, true);
+ }
+ else if ("take_off" == param)
+ {
+ return get_is_item_worn(selected_id);
+ }
+ else if ("edit" == param)
+ {
+ return mUUIDs.size() == 1 && gAgentWearables.isWearableModifiable(selected_id);
+ }
+ return true;
+ }
+
+ // We don't use LLAppearanceMgr::moveWearable() directly because
+ // the item may be invalidated between setting the callback and calling it.
+ static bool moveWearable(const LLUUID& item_id, bool closer_to_body)
+ {
+ LLViewerInventoryItem* item = gInventory.getItem(item_id);
+ return LLAppearanceMgr::instance().moveWearable(item, closer_to_body);
+ }
+};
+
+//////////////////////////////////////////////////////////////////////////
+
+class CofBodyPartContextMenu : public CofContextMenu
+{
+public:
+ CofBodyPartContextMenu(LLCOFWearables* cof_wearables)
+ : CofContextMenu(cof_wearables)
+ {
+ }
+
+protected:
+ /*virtual*/ LLContextMenu* createMenu()
+ {
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+ LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
+ LLUUID selected_id = mUUIDs.back();
+
+ // *HACK* need to pass pointer to LLPanelOutfitEdit instead of LLSideTray::getInstance()->getPanel().
+ // LLSideTray::getInstance()->getPanel() is rather slow variant
+ LLPanelOutfitEdit* panel_oe = dynamic_cast<LLPanelOutfitEdit*>(LLSideTray::getInstance()->getPanel("panel_outfit_edit"));
+ registrar.add("BodyPart.Replace", boost::bind(&LLPanelOutfitEdit::onReplaceBodyPartMenuItemClicked, panel_oe, selected_id));
+ registrar.add("BodyPart.Edit", boost::bind(LLAgentWearables::editWearable, selected_id));
+ registrar.add("BodyPart.Create", boost::bind(&CofBodyPartContextMenu::createNew, this, selected_id));
+
+ enable_registrar.add("BodyPart.OnEnable", boost::bind(&CofBodyPartContextMenu::onEnable, this, _2));
+
+ LLContextMenu* menu = createFromFile("menu_cof_body_part.xml");
+ llassert(menu);
+ if (menu)
+ {
+ updateCreateWearableLabel(menu, selected_id);
+ }
+ return menu;
+ }
+
+ bool onEnable(const LLSD& data)
+ {
+ std::string param = data.asString();
+ LLUUID selected_id = mUUIDs.back();
+
+ if ("edit" == param)
+ {
+ return mUUIDs.size() == 1 && gAgentWearables.isWearableModifiable(selected_id);
+ }
+
+ return true;
+ }
+};
+
+//////////////////////////////////////////////////////////////////////////
+
+LLCOFWearables::LLCOFWearables() : LLPanel(),
+ mAttachments(NULL),
+ mClothing(NULL),
+ mBodyParts(NULL),
+ mLastSelectedList(NULL)
+{
+ mClothingMenu = new CofClothingContextMenu(this);
+ mAttachmentMenu = new CofAttachmentContextMenu(this);
+ mBodyPartMenu = new CofBodyPartContextMenu(this);
+};
+
+LLCOFWearables::~LLCOFWearables()
+{
+ delete mClothingMenu;
+ delete mAttachmentMenu;
+ delete mBodyPartMenu;
+}
+
+// virtual
+BOOL LLCOFWearables::postBuild()
+{
+ mAttachments = getChild<LLFlatListView>("list_attachments");
+ mClothing = getChild<LLFlatListView>("list_clothing");
+ mBodyParts = getChild<LLFlatListView>("list_body_parts");
+
+ mClothing->setRightMouseDownCallback(boost::bind(&LLCOFWearables::onListRightClick, this, _1, _2, _3, mClothingMenu));
+ mAttachments->setRightMouseDownCallback(boost::bind(&LLCOFWearables::onListRightClick, this, _1, _2, _3, mAttachmentMenu));
+ mBodyParts->setRightMouseDownCallback(boost::bind(&LLCOFWearables::onListRightClick, this, _1, _2, _3, mBodyPartMenu));
+
+ //selection across different list/tabs is not supported
+ mAttachments->setCommitCallback(boost::bind(&LLCOFWearables::onSelectionChange, this, mAttachments));
+ mClothing->setCommitCallback(boost::bind(&LLCOFWearables::onSelectionChange, this, mClothing));
+ mBodyParts->setCommitCallback(boost::bind(&LLCOFWearables::onSelectionChange, this, mBodyParts));
+
+ mAttachments->setCommitOnSelectionChange(true);
+ mClothing->setCommitOnSelectionChange(true);
+ mBodyParts->setCommitOnSelectionChange(true);
+
+ //clothing is sorted according to its position relatively to the body
+ mAttachments->setComparator(&WEARABLE_NAME_COMPARATOR);
+ mBodyParts->setComparator(&WEARABLE_NAME_COMPARATOR);
+
+ return LLPanel::postBuild();
+}
+
+void LLCOFWearables::onSelectionChange(LLFlatListView* selected_list)
+{
+ if (!selected_list) return;
+
+ if (selected_list != mLastSelectedList)
+ {
+ if (selected_list != mAttachments) mAttachments->resetSelection(true);
+ if (selected_list != mClothing) mClothing->resetSelection(true);
+ if (selected_list != mBodyParts) mBodyParts->resetSelection(true);
+
+ mLastSelectedList = selected_list;
+ }
+
+ onCommit();
+}
+
+void LLCOFWearables::refresh()
+{
+ typedef std::vector<LLSD> values_vector_t;
+ typedef std::map<LLFlatListView*, values_vector_t> selection_map_t;
+
+ selection_map_t preserve_selection;
+
+ // Save current selection
+ mAttachments->getSelectedValues(preserve_selection[mAttachments]);
+ mClothing->getSelectedValues(preserve_selection[mClothing]);
+ mBodyParts->getSelectedValues(preserve_selection[mBodyParts]);
+
+ clear();
+
+ LLInventoryModel::cat_array_t cats;
+ LLInventoryModel::item_array_t cof_items;
+
+ gInventory.collectDescendents(LLAppearanceMgr::getInstance()->getCOF(), cats, cof_items, LLInventoryModel::EXCLUDE_TRASH);
+
+ populateAttachmentsAndBodypartsLists(cof_items);
+
+
+ LLAppearanceMgr::wearables_by_type_t clothing_by_type(LLWearableType::WT_COUNT);
+ LLAppearanceMgr::getInstance()->divvyWearablesByType(cof_items, clothing_by_type);
+
+ populateClothingList(clothing_by_type);
+
+ // Restore previous selection
+ for (selection_map_t::iterator
+ iter = preserve_selection.begin(),
+ iter_end = preserve_selection.end();
+ iter != iter_end; ++iter)
+ {
+ LLFlatListView* list = iter->first;
+ const values_vector_t& values = iter->second;
+ for (values_vector_t::const_iterator
+ value_it = values.begin(),
+ value_it_end = values.end();
+ value_it != value_it_end; ++value_it)
+ {
+ list->selectItemByValue(*value_it);
+ }
+ }
+}
+
+
+void LLCOFWearables::populateAttachmentsAndBodypartsLists(const LLInventoryModel::item_array_t& cof_items)
+{
+ for (U32 i = 0; i < cof_items.size(); ++i)
+ {
+ LLViewerInventoryItem* item = cof_items.get(i);
+ if (!item) continue;
+
+ const LLAssetType::EType item_type = item->getType();
+ if (item_type == LLAssetType::AT_CLOTHING) continue;
+ LLPanelInventoryListItemBase* item_panel = NULL;
+ if (item_type == LLAssetType::AT_OBJECT)
+ {
+ item_panel = buildAttachemntListItem(item);
+ mAttachments->addItem(item_panel, item->getUUID(), ADD_BOTTOM, false);
+ }
+ else if (item_type == LLAssetType::AT_BODYPART)
+ {
+ item_panel = buildBodypartListItem(item);
+ if (!item_panel) continue;
+
+ mBodyParts->addItem(item_panel, item->getUUID(), ADD_BOTTOM, false);
+ }
+ }
+
+ if (mAttachments->size())
+ {
+ mAttachments->sort();
+ mAttachments->notify(REARRANGE); //notifying the parent about the list's size change (cause items were added with rearrange=false)
+ }
+
+ if (mBodyParts->size())
+ {
+ mBodyParts->sort();
+ mBodyParts->notify(REARRANGE);
+ }
+}
+
+//create a clothing list item, update verbs and show/hide line separator
+LLPanelClothingListItem* LLCOFWearables::buildClothingListItem(LLViewerInventoryItem* item, bool first, bool last)
+{
+ llassert(item);
+ if (!item) return NULL;
+ LLPanelClothingListItem* item_panel = LLPanelClothingListItem::create(item);
+ if (!item_panel) return NULL;
+
+ //updating verbs
+ //we don't need to use permissions of a link but of an actual/linked item
+ if (item->getLinkedItem()) item = item->getLinkedItem();
+ llassert(item);
+ if (!item) return NULL;
+
+ bool allow_modify = item->getPermissions().allowModifyBy(gAgentID);
+
+ item_panel->setShowLockButton(!allow_modify);
+ item_panel->setShowEditButton(allow_modify);
+
+ item_panel->setShowMoveUpButton(!first);
+ item_panel->setShowMoveDownButton(!last);
+
+ //setting callbacks
+ //*TODO move that item panel's inner structure disclosing stuff into the panels
+ item_panel->childSetAction("btn_delete", mCOFCallbacks.mDeleteWearable);
+ item_panel->childSetAction("btn_move_up", mCOFCallbacks.mMoveWearableFurther);
+ item_panel->childSetAction("btn_move_down", mCOFCallbacks.mMoveWearableCloser);
+ item_panel->childSetAction("btn_edit", mCOFCallbacks.mEditWearable);
+
+ //turning on gray separator line for the last item in the items group of the same wearable type
+ item_panel->childSetVisible("wearable_type_separator_icon", last);
+
+ return item_panel;
+}
+
+LLPanelBodyPartsListItem* LLCOFWearables::buildBodypartListItem(LLViewerInventoryItem* item)
+{
+ llassert(item);
+ if (!item) return NULL;
+ LLPanelBodyPartsListItem* item_panel = LLPanelBodyPartsListItem::create(item);
+ if (!item_panel) return NULL;
+
+ //updating verbs
+ //we don't need to use permissions of a link but of an actual/linked item
+ if (item->getLinkedItem()) item = item->getLinkedItem();
+ llassert(item);
+ if (!item) return NULL;
+ bool allow_modify = item->getPermissions().allowModifyBy(gAgentID);
+ item_panel->setShowLockButton(!allow_modify);
+ item_panel->setShowEditButton(allow_modify);
+
+ //setting callbacks
+ //*TODO move that item panel's inner structure disclosing stuff into the panels
+ item_panel->childSetAction("btn_delete", mCOFCallbacks.mDeleteWearable);
+ item_panel->childSetAction("btn_edit", mCOFCallbacks.mEditWearable);
+
+ return item_panel;
+}
+
+LLPanelDeletableWearableListItem* LLCOFWearables::buildAttachemntListItem(LLViewerInventoryItem* item)
+{
+ llassert(item);
+ if (!item) return NULL;
+
+ LLPanelAttachmentListItem* item_panel = LLPanelAttachmentListItem::create(item);
+ if (!item_panel) return NULL;
+
+ //setting callbacks
+ //*TODO move that item panel's inner structure disclosing stuff into the panels
+ item_panel->childSetAction("btn_delete", mCOFCallbacks.mDeleteWearable);
+
+ return item_panel;
+}
+
+void LLCOFWearables::populateClothingList(LLAppearanceMgr::wearables_by_type_t& clothing_by_type)
+{
+ llassert(clothing_by_type.size() == LLWearableType::WT_COUNT);
+
+ for (U32 type = LLWearableType::WT_SHIRT; type < LLWearableType::WT_COUNT; ++type)
+ {
+ U32 size = clothing_by_type[type].size();
+ if (!size) continue;
+
+ LLAppearanceMgr::sortItemsByActualDescription(clothing_by_type[type]);
+
+ //clothing items are displayed in reverse order, from furthest ones to closest ones (relatively to the body)
+ for (U32 i = size; i != 0; --i)
+ {
+ LLViewerInventoryItem* item = clothing_by_type[type][i-1];
+
+ LLPanelClothingListItem* item_panel = buildClothingListItem(item, i == size, i == 1);
+ if (!item_panel) continue;
+
+ mClothing->addItem(item_panel, item->getUUID(), ADD_BOTTOM, false);
+ }
+ }
+
+ addClothingTypesDummies(clothing_by_type);
+
+ mClothing->notify(REARRANGE);
+}
+
+//adding dummy items for missing wearable types
+void LLCOFWearables::addClothingTypesDummies(const LLAppearanceMgr::wearables_by_type_t& clothing_by_type)
+{
+ llassert(clothing_by_type.size() == LLWearableType::WT_COUNT);
+
+ for (U32 type = LLWearableType::WT_SHIRT; type < LLWearableType::WT_COUNT; type++)
+ {
+ U32 size = clothing_by_type[type].size();
+ if (size) continue;
+
+ LLWearableType::EType w_type = static_cast<LLWearableType::EType>(type);
+ LLPanelInventoryListItemBase* item_panel = LLPanelDummyClothingListItem::create(w_type);
+ if(!item_panel) continue;
+ item_panel->childSetAction("btn_add", mCOFCallbacks.mAddWearable);
+ mClothing->addItem(item_panel, LLUUID::null, ADD_BOTTOM, false);
+ }
+}
+
+LLUUID LLCOFWearables::getSelectedUUID()
+{
+ if (!mLastSelectedList) return LLUUID::null;
+
+ return mLastSelectedList->getSelectedUUID();
+}
+
+bool LLCOFWearables::getSelectedUUIDs(uuid_vec_t& selected_ids)
+{
+ if (!mLastSelectedList) return false;
+
+ mLastSelectedList->getSelectedUUIDs(selected_ids);
+ return selected_ids.size() != 0;
+}
+
+LLPanel* LLCOFWearables::getSelectedItem()
+{
+ if (!mLastSelectedList) return NULL;
+
+ return mLastSelectedList->getSelectedItem();
+}
+
+void LLCOFWearables::getSelectedItems(std::vector<LLPanel*>& selected_items) const
+{
+ if (mLastSelectedList)
+ {
+ mLastSelectedList->getSelectedItems(selected_items);
+ }
+}
+
+void LLCOFWearables::clear()
+{
+ mAttachments->clear();
+ mClothing->clear();
+ mBodyParts->clear();
+}
+
+LLAssetType::EType LLCOFWearables::getExpandedAccordionAssetType()
+{
+ typedef std::map<std::string, LLAssetType::EType> type_map_t;
+
+ static type_map_t type_map;
+ static LLAccordionCtrl* accordion_ctrl = getChild<LLAccordionCtrl>("cof_wearables_accordion");
+
+ if (type_map.empty())
+ {
+ type_map["tab_clothing"] = LLAssetType::AT_CLOTHING;
+ type_map["tab_attachments"] = LLAssetType::AT_OBJECT;
+ type_map["tab_body_parts"] = LLAssetType::AT_BODYPART;
+ }
+
+ const LLAccordionCtrlTab* tab = accordion_ctrl->getExpandedTab();
+ LLAssetType::EType result = LLAssetType::AT_NONE;
+
+ if (tab)
+ {
+ type_map_t::iterator i = type_map.find(tab->getName());
+ llassert(i != type_map.end());
+ result = i->second;
+ }
+
+ return result;
+}
+
+void LLCOFWearables::onListRightClick(LLUICtrl* ctrl, S32 x, S32 y, LLListContextMenu* menu)
+{
+ if(menu)
+ {
+ uuid_vec_t selected_uuids;
+ if(getSelectedUUIDs(selected_uuids))
+ {
+ menu->show(ctrl, selected_uuids, x, y);
+ }
+ }
+}
+
+//EOF
diff --git a/indra/newview/llcofwearables.h b/indra/newview/llcofwearables.h
new file mode 100644
index 0000000000..62f4cfc692
--- /dev/null
+++ b/indra/newview/llcofwearables.h
@@ -0,0 +1,118 @@
+/**
+ * @file llcofwearables.h
+ * @brief LLCOFWearables displayes wearables from the current outfit split into three lists (attachments, clothing and body parts)
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLCOFWEARABLES_H
+#define LL_LLCOFWEARABLES_H
+
+// llui
+#include "llflatlistview.h"
+#include "llpanel.h"
+
+#include "llappearancemgr.h"
+#include "llinventorymodel.h"
+
+class LLListContextMenu;
+class LLPanelClothingListItem;
+class LLPanelBodyPartsListItem;
+class LLPanelDeletableWearableListItem;
+
+class LLCOFWearables : public LLPanel
+{
+public:
+
+ /**
+ * Represents a collection of callbacks assigned to inventory panel item's buttons
+ */
+ class LLCOFCallbacks
+ {
+ public:
+ LLCOFCallbacks() {};
+ virtual ~LLCOFCallbacks() {};
+
+ typedef boost::function<void (void*)> cof_callback_t;
+
+ cof_callback_t mAddWearable;
+ cof_callback_t mMoveWearableCloser;
+ cof_callback_t mMoveWearableFurther;
+ cof_callback_t mEditWearable;
+ cof_callback_t mDeleteWearable;
+ };
+
+
+
+ LLCOFWearables();
+ virtual ~LLCOFWearables();
+
+ /*virtual*/ BOOL postBuild();
+
+ LLUUID getSelectedUUID();
+ bool getSelectedUUIDs(uuid_vec_t& selected_ids);
+
+ LLPanel* getSelectedItem();
+ void getSelectedItems(std::vector<LLPanel*>& selected_items) const;
+
+ void refresh();
+ void clear();
+
+ LLAssetType::EType getExpandedAccordionAssetType();
+
+ LLCOFCallbacks& getCOFCallbacks() { return mCOFCallbacks; }
+
+protected:
+
+ void populateAttachmentsAndBodypartsLists(const LLInventoryModel::item_array_t& cof_items);
+ void populateClothingList(LLAppearanceMgr::wearables_by_type_t& clothing_by_type);
+
+ void addClothingTypesDummies(const LLAppearanceMgr::wearables_by_type_t& clothing_by_type);
+ void onSelectionChange(LLFlatListView* selected_list);
+
+ LLPanelClothingListItem* buildClothingListItem(LLViewerInventoryItem* item, bool first, bool last);
+ LLPanelBodyPartsListItem* buildBodypartListItem(LLViewerInventoryItem* item);
+ LLPanelDeletableWearableListItem* buildAttachemntListItem(LLViewerInventoryItem* item);
+
+ void onListRightClick(LLUICtrl* ctrl, S32 x, S32 y, LLListContextMenu* menu);
+
+ LLFlatListView* mAttachments;
+ LLFlatListView* mClothing;
+ LLFlatListView* mBodyParts;
+
+ LLFlatListView* mLastSelectedList;
+
+ LLCOFCallbacks mCOFCallbacks;
+
+ LLListContextMenu* mClothingMenu;
+ LLListContextMenu* mAttachmentMenu;
+ LLListContextMenu* mBodyPartMenu;
+};
+
+
+#endif
diff --git a/indra/newview/llcolorswatch.cpp b/indra/newview/llcolorswatch.cpp
index dc6847f236..b83e4fe830 100644
--- a/indra/newview/llcolorswatch.cpp
+++ b/indra/newview/llcolorswatch.cpp
@@ -68,7 +68,7 @@ LLColorSwatchCtrl::Params::Params()
LLColorSwatchCtrl::LLColorSwatchCtrl(const Params& p)
: LLUICtrl(p),
mValid( TRUE ),
- mColor(p.color),
+ mColor(p.color()),
mCanApplyImmediately(p.can_apply_immediately),
mAlphaGradientImage(p.alpha_background_image),
mOnCancelCallback(p.cancel_callback()),
@@ -338,7 +338,11 @@ void LLColorSwatchCtrl::showPicker(BOOL take_focus)
if (!pickerp)
{
pickerp = new LLFloaterColorPicker(this, mCanApplyImmediately);
- //gFloaterView->getParentFloater(this)->addDependentFloater(pickerp);
+ LLFloater* parent = gFloaterView->getParentFloater(this);
+ if (parent)
+ {
+ parent->addDependentFloater(pickerp);
+ }
mPickerHandle = pickerp->getHandle();
}
diff --git a/indra/newview/llcolorswatch.h b/indra/newview/llcolorswatch.h
index 4bb7d837cb..09bb49cfbe 100644
--- a/indra/newview/llcolorswatch.h
+++ b/indra/newview/llcolorswatch.h
@@ -60,7 +60,7 @@ public:
struct Params : public LLInitParam::Block<Params, LLUICtrl::Params>
{
- Optional<LLColor4> color;
+ Optional<LLUIColor> color;
Optional<bool> can_apply_immediately;
Optional<LLUIImage*> alpha_background_image;
Optional<commit_callback_t> cancel_callback;
diff --git a/indra/newview/llcompilequeue.cpp b/indra/newview/llcompilequeue.cpp
index a96981a108..feb8c540ef 100644
--- a/indra/newview/llcompilequeue.cpp
+++ b/indra/newview/llcompilequeue.cpp
@@ -114,7 +114,7 @@ BOOL LLFloaterScriptQueue::postBuild()
// worked on.
// NOT static, virtual!
void LLFloaterScriptQueue::inventoryChanged(LLViewerObject* viewer_object,
- InventoryObjectList* inv,
+ LLInventoryObject::object_list_t* inv,
S32,
void* q_id)
{
@@ -305,7 +305,7 @@ LLFloaterCompileQueue::~LLFloaterCompileQueue()
}
void LLFloaterCompileQueue::handleInventory(LLViewerObject *viewer_object,
- InventoryObjectList* inv)
+ LLInventoryObject::object_list_t* inv)
{
// find all of the lsl, leaving off duplicates. We'll remove
// all matching asset uuids on compilation success.
@@ -313,8 +313,8 @@ void LLFloaterCompileQueue::handleInventory(LLViewerObject *viewer_object,
typedef std::multimap<LLUUID, LLPointer<LLInventoryItem> > uuid_item_map;
uuid_item_map asset_item_map;
- InventoryObjectList::const_iterator it = inv->begin();
- InventoryObjectList::const_iterator end = inv->end();
+ LLInventoryObject::object_list_t::const_iterator it = inv->begin();
+ LLInventoryObject::object_list_t::const_iterator end = inv->end();
for ( ; it != end; ++it)
{
if((*it)->getType() == LLAssetType::AT_LSL_TEXT)
@@ -625,14 +625,14 @@ LLFloaterResetQueue::~LLFloaterResetQueue()
}
void LLFloaterResetQueue::handleInventory(LLViewerObject* viewer_obj,
- InventoryObjectList* inv)
+ LLInventoryObject::object_list_t* inv)
{
// find all of the lsl, leaving off duplicates. We'll remove
// all matching asset uuids on compilation success.
LLDynamicArray<const char*> names;
- InventoryObjectList::const_iterator it = inv->begin();
- InventoryObjectList::const_iterator end = inv->end();
+ LLInventoryObject::object_list_t::const_iterator it = inv->begin();
+ LLInventoryObject::object_list_t::const_iterator end = inv->end();
for ( ; it != end; ++it)
{
if((*it)->getType() == LLAssetType::AT_LSL_TEXT)
@@ -677,14 +677,14 @@ LLFloaterRunQueue::~LLFloaterRunQueue()
}
void LLFloaterRunQueue::handleInventory(LLViewerObject* viewer_obj,
- InventoryObjectList* inv)
+ LLInventoryObject::object_list_t* inv)
{
// find all of the lsl, leaving off duplicates. We'll remove
// all matching asset uuids on compilation success.
LLDynamicArray<const char*> names;
- InventoryObjectList::const_iterator it = inv->begin();
- InventoryObjectList::const_iterator end = inv->end();
+ LLInventoryObject::object_list_t::const_iterator it = inv->begin();
+ LLInventoryObject::object_list_t::const_iterator end = inv->end();
for ( ; it != end; ++it)
{
if((*it)->getType() == LLAssetType::AT_LSL_TEXT)
@@ -732,14 +732,14 @@ LLFloaterNotRunQueue::~LLFloaterNotRunQueue()
}
void LLFloaterNotRunQueue::handleInventory(LLViewerObject* viewer_obj,
- InventoryObjectList* inv)
+ LLInventoryObject::object_list_t* inv)
{
// find all of the lsl, leaving off duplicates. We'll remove
// all matching asset uuids on compilation success.
LLDynamicArray<const char*> names;
- InventoryObjectList::const_iterator it = inv->begin();
- InventoryObjectList::const_iterator end = inv->end();
+ LLInventoryObject::object_list_t::const_iterator it = inv->begin();
+ LLInventoryObject::object_list_t::const_iterator end = inv->end();
for ( ; it != end; ++it)
{
if((*it)->getType() == LLAssetType::AT_LSL_TEXT)
diff --git a/indra/newview/llcompilequeue.h b/indra/newview/llcompilequeue.h
index 2d061f5d8a..4fde2572af 100644
--- a/indra/newview/llcompilequeue.h
+++ b/indra/newview/llcompilequeue.h
@@ -76,13 +76,13 @@ protected:
// This is the callback method for the viewer object currently
// being worked on.
/*virtual*/ void inventoryChanged(LLViewerObject* obj,
- InventoryObjectList* inv,
+ LLInventoryObject::object_list_t* inv,
S32 serial_num,
void* queue);
// This is called by inventoryChanged
virtual void handleInventory(LLViewerObject* viewer_obj,
- InventoryObjectList* inv) = 0;
+ LLInventoryObject::object_list_t* inv) = 0;
static void onCloseBtn(void* user_data);
@@ -145,7 +145,7 @@ protected:
// This is called by inventoryChanged
virtual void handleInventory(LLViewerObject* viewer_obj,
- InventoryObjectList* inv);
+ LLInventoryObject::object_list_t* inv);
// This is the callback for when each script arrives
static void scriptArrived(LLVFS *vfs, const LLUUID& asset_id,
@@ -192,7 +192,7 @@ protected:
// This is called by inventoryChanged
virtual void handleInventory(LLViewerObject* viewer_obj,
- InventoryObjectList* inv);
+ LLInventoryObject::object_list_t* inv);
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -210,7 +210,7 @@ protected:
// This is called by inventoryChanged
virtual void handleInventory(LLViewerObject* viewer_obj,
- InventoryObjectList* inv);
+ LLInventoryObject::object_list_t* inv);
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -228,7 +228,7 @@ protected:
// This is called by inventoryChanged
virtual void handleInventory(LLViewerObject* viewer_obj,
- InventoryObjectList* inv);
+ LLInventoryObject::object_list_t* inv);
};
#endif // LL_LLCOMPILEQUEUE_H
diff --git a/indra/newview/llcurrencyuimanager.cpp b/indra/newview/llcurrencyuimanager.cpp
index 00c05445e1..fd3df359bd 100644
--- a/indra/newview/llcurrencyuimanager.cpp
+++ b/indra/newview/llcurrencyuimanager.cpp
@@ -284,7 +284,7 @@ void LLCurrencyUIManager::Impl::startTransaction(TransactionType type,
static std::string transactionURI;
if (transactionURI.empty())
{
- transactionURI = LLViewerLogin::getInstance()->getHelperURI() + "currency.php";
+ transactionURI = LLGridManager::getInstance()->getHelperURI() + "currency.php";
}
delete mTransaction;
@@ -426,7 +426,7 @@ void LLCurrencyUIManager::Impl::prepare()
LLLineEditor* lindenAmount = mPanel.getChild<LLLineEditor>("currency_amt");
if (lindenAmount)
{
- lindenAmount->setPrevalidate(LLLineEditor::prevalidateNonNegativeS32);
+ lindenAmount->setPrevalidate(LLTextValidate::validateNonNegativeS32);
lindenAmount->setKeystrokeCallback(onCurrencyKey, this);
}
}
diff --git a/indra/newview/lldateutil.cpp b/indra/newview/lldateutil.cpp
index abb2fdeb9a..3e71ecdfba 100644
--- a/indra/newview/lldateutil.cpp
+++ b/indra/newview/lldateutil.cpp
@@ -59,19 +59,22 @@ static S32 days_from_month(S32 year, S32 month)
}
}
-std::string LLDateUtil::ageFromDate(const std::string& date_string,
- const LLDate& now)
+bool LLDateUtil::dateFromPDTString(LLDate& date, const std::string& str)
+{
+ S32 month, day, year;
+ S32 matched = sscanf(str.c_str(), "%d/%d/%d", &month, &day, &year);
+ if (matched != 3) return false;
+ date.fromYMDHMS(year, month, day);
+ F64 secs_since_epoch = date.secondsSinceEpoch();
+ // Correct for the fact that specified date is in Pacific time, == UTC - 8
+ secs_since_epoch += 8.0 * 60.0 * 60.0;
+ date.secondsSinceEpoch(secs_since_epoch);
+ return true;
+}
+
+std::string LLDateUtil::ageFromDate(const LLDate& born_date, const LLDate& now)
{
S32 born_month, born_day, born_year;
- S32 matched = sscanf(date_string.c_str(), "%d/%d/%d", &born_month, &born_day, &born_year);
- if (matched != 3) return "???";
- LLDate born_date;
- born_date.fromYMDHMS(born_year, born_month, born_day);
- F64 born_date_secs_since_epoch = born_date.secondsSinceEpoch();
- // Correct for the fact that account creation dates are in Pacific time,
- // == UTC - 8
- born_date_secs_since_epoch += 8.0 * 60.0 * 60.0;
- born_date.secondsSinceEpoch(born_date_secs_since_epoch);
// explode out to month/day/year again
born_date.split(&born_year, &born_month, &born_day);
@@ -155,6 +158,16 @@ std::string LLDateUtil::ageFromDate(const std::string& date_string,
return LLTrans::getString("TodayOld");
}
+std::string LLDateUtil::ageFromDate(const std::string& date_string, const LLDate& now)
+{
+ LLDate born_date;
+
+ if (!dateFromPDTString(born_date, date_string))
+ return "???";
+
+ return ageFromDate(born_date, now);
+}
+
std::string LLDateUtil::ageFromDate(const std::string& date_string)
{
return ageFromDate(date_string, LLDate::now());
diff --git a/indra/newview/lldateutil.h b/indra/newview/lldateutil.h
index 041be07f12..a0df21022e 100644
--- a/indra/newview/lldateutil.h
+++ b/indra/newview/lldateutil.h
@@ -36,6 +36,29 @@ class LLDate;
namespace LLDateUtil
{
+ /**
+ * Convert a date provided by the server into seconds since the Epoch.
+ *
+ * @param[out] date Number of seconds since 01/01/1970 UTC.
+ * @param[in] str Date string (MM/DD/YYYY) in PDT time zone.
+ *
+ * @return true on success, false on parse error
+ */
+ bool dateFromPDTString(LLDate& date, const std::string& str);
+
+ /**
+ * Get human-readable avatar age.
+ *
+ * Used for avatar inspectors and profiles.
+ *
+ * @param born_date Date an avatar was born on.
+ * @param now Current date.
+ *
+ * @return human-readable localized string like "1 year, 2 months",
+ * or "???" on error.
+ */
+ std::string ageFromDate(const LLDate& born_date, const LLDate& now);
+
// Convert a date provided by the server (MM/DD/YYYY) into a localized,
// human-readable age (1 year, 2 months) using translation strings.
// Pass LLDate::now() for now.
diff --git a/indra/newview/lldebugview.cpp b/indra/newview/lldebugview.cpp
index 169a963d0d..f113cc49d4 100644
--- a/indra/newview/lldebugview.cpp
+++ b/indra/newview/lldebugview.cpp
@@ -81,11 +81,13 @@ void LLDebugView::init()
r.setLeftTopAndSize(25, rect.getHeight() - 50, (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f),
(S32) (gViewerWindow->getWindowRectScaled().getHeight() * 0.75f));
+
mFastTimerView = new LLFastTimerView(r);
mFastTimerView->setFollowsTop();
mFastTimerView->setFollowsLeft();
mFastTimerView->setVisible(FALSE); // start invisible
addChild(mFastTimerView);
+ mFastTimerView->setRect(rect);
r.setLeftTopAndSize(25, rect.getHeight() - 50, (S32) (gViewerWindow->getWindowRectScaled().getWidth() * 0.75f),
(S32) (gViewerWindow->getWindowRectScaled().getHeight() * 0.75f));
diff --git a/indra/newview/lldrawable.cpp b/indra/newview/lldrawable.cpp
index d60330024a..3f9d3fdbef 100644
--- a/indra/newview/lldrawable.cpp
+++ b/indra/newview/lldrawable.cpp
@@ -386,8 +386,6 @@ void LLDrawable::makeActive()
mParent->makeActive();
}
- gPipeline.setActive(this, TRUE);
-
//all child objects must also be active
llassert_always(mVObjp);
@@ -434,7 +432,6 @@ void LLDrawable::makeStatic(BOOL warning_enabled)
if (isState(ACTIVE))
{
clearState(ACTIVE);
- gPipeline.setActive(this, FALSE);
if (mParent.notNull() && mParent->isActive() && warning_enabled)
{
@@ -1049,9 +1046,13 @@ LLSpatialBridge::LLSpatialBridge(LLDrawable* root, BOOL render_by_group, U32 dat
llassert(mDrawable);
llassert(mDrawable->getRegion());
- llassert(mDrawable->getRegion()->getSpatialPartition(mPartitionType));
+ LLSpatialPartition *part = mDrawable->getRegion()->getSpatialPartition(mPartitionType);
+ llassert(part);
- mDrawable->getRegion()->getSpatialPartition(mPartitionType)->put(this);
+ if (part)
+ {
+ part->put(this);
+ }
}
LLSpatialBridge::~LLSpatialBridge()
@@ -1365,12 +1366,17 @@ void LLSpatialBridge::move(LLDrawable *drawablep, LLSpatialGroup *curp, BOOL imm
BOOL LLSpatialBridge::updateMove()
{
- llassert(mDrawable);
- llassert(mDrawable->getRegion());
- llassert(mDrawable->getRegion()->getSpatialPartition(mPartitionType));
+ llassert_always(mDrawable);
+ llassert_always(mDrawable->mVObjp);
+ llassert_always(mDrawable->getRegion());
+ LLSpatialPartition* part = mDrawable->getRegion()->getSpatialPartition(mPartitionType);
+ llassert_always(part);
mOctree->balance();
- mDrawable->getRegion()->getSpatialPartition(mPartitionType)->move(this, getSpatialGroup(), TRUE);
+ if (part)
+ {
+ part->move(this, getSpatialGroup(), TRUE);
+ }
return TRUE;
}
diff --git a/indra/newview/lldrawpool.cpp b/indra/newview/lldrawpool.cpp
index 95ddacb722..e3e66fa00d 100644
--- a/indra/newview/lldrawpool.cpp
+++ b/indra/newview/lldrawpool.cpp
@@ -442,7 +442,6 @@ void LLRenderPass::renderTexture(U32 type, U32 mask)
void LLRenderPass::pushBatches(U32 type, U32 mask, BOOL texture)
{
- llpushcallstacks ;
for (LLCullResult::drawinfo_list_t::iterator i = gPipeline.beginRenderMap(type); i != gPipeline.endRenderMap(type); ++i)
{
LLDrawInfo* pparams = *i;
@@ -496,8 +495,8 @@ void LLRenderPass::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)
params.mGroup->rebuildMesh();
}
params.mVertexBuffer->setBuffer(mask);
- params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
- gPipeline.addTrianglesDrawn(params.mCount/3);
+ params.mVertexBuffer->drawRange(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset);
+ gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode);
}
if (params.mTextureMatrix && texture && params.mTexture.notNull())
diff --git a/indra/newview/lldrawpoolalpha.cpp b/indra/newview/lldrawpoolalpha.cpp
index 6d77361414..875c9ac6a9 100644
--- a/indra/newview/lldrawpoolalpha.cpp
+++ b/indra/newview/lldrawpoolalpha.cpp
@@ -180,6 +180,7 @@ void LLDrawPoolAlpha::render(S32 pass)
if (LLPipeline::sFastAlpha && !deferred_render)
{
+ LLGLDisable blend_disable(GL_BLEND);
gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.33f);
if (mVertexShaderLevel > 0)
{
@@ -250,8 +251,8 @@ void LLDrawPoolAlpha::renderAlphaHighlight(U32 mask)
params.mGroup->rebuildMesh();
}
params.mVertexBuffer->setBuffer(mask);
- params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
- gPipeline.addTrianglesDrawn(params.mCount/3);
+ params.mVertexBuffer->drawRange(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset);
+ gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode);
}
}
}
@@ -380,8 +381,8 @@ void LLDrawPoolAlpha::renderAlpha(U32 mask)
}
params.mVertexBuffer->setBuffer(mask);
- params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
- gPipeline.addTrianglesDrawn(params.mCount/3);
+ params.mVertexBuffer->drawRange(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset);
+ gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode);
if (params.mTextureMatrix && params.mTexture.notNull())
{
diff --git a/indra/newview/lldrawpoolavatar.cpp b/indra/newview/lldrawpoolavatar.cpp
index 546b60f286..2d0859650a 100644
--- a/indra/newview/lldrawpoolavatar.cpp
+++ b/indra/newview/lldrawpoolavatar.cpp
@@ -634,7 +634,7 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
if (!single_avatar && !avatarp->isFullyLoaded() )
{
- if (pass==1 && (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_PARTICLES) || LLViewerPartSim::getMaxPartCount() <= 0))
+ if (pass==0 && (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_PARTICLES) || LLViewerPartSim::getMaxPartCount() <= 0))
{
// debug code to draw a sphere in place of avatar
gGL.getTexUnit(0)->bind(LLViewerFetchedTexture::sWhiteImagep);
@@ -646,8 +646,10 @@ void LLDrawPoolAvatar::renderAvatars(LLVOAvatar* single_avatar, S32 pass)
gGL.translatef((F32)(pos.mV[VX]),
(F32)(pos.mV[VY]),
(F32)(pos.mV[VZ]));
- gGL.scalef(0.15f, 0.15f, 0.3f);
- gSphere.render();
+ gGL.scalef(0.15f, 0.15f, 0.3f);
+
+ gSphere.renderGGL();
+
gGL.popMatrix();
gGL.setColorMask(true, false);
}
diff --git a/indra/newview/lldrawpoolbump.cpp b/indra/newview/lldrawpoolbump.cpp
index 03a8b108e2..19cdccb630 100644
--- a/indra/newview/lldrawpoolbump.cpp
+++ b/indra/newview/lldrawpoolbump.cpp
@@ -560,8 +560,8 @@ void LLDrawPoolBump::renderGroup(LLSpatialGroup* group, U32 type, U32 mask, BOOL
params.mGroup->rebuildMesh();
}
params.mVertexBuffer->setBuffer(mask);
- params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
- gPipeline.addTrianglesDrawn(params.mCount/3);
+ params.mVertexBuffer->drawRange(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset);
+ gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode);
}
}
@@ -825,7 +825,6 @@ void LLBumpImageList::addTextureStats(U8 bump, const LLUUID& base_image_id, F32
void LLBumpImageList::updateImages()
{
- llpushcallstacks ;
for (bump_image_map_t::iterator iter = mBrightnessEntries.begin(); iter != mBrightnessEntries.end(); )
{
bump_image_map_t::iterator curiter = iter++;
@@ -852,7 +851,6 @@ void LLBumpImageList::updateImages()
}
}
}
- llpushcallstacks ;
for (bump_image_map_t::iterator iter = mDarknessEntries.begin(); iter != mDarknessEntries.end(); )
{
bump_image_map_t::iterator curiter = iter++;
@@ -879,7 +877,6 @@ void LLBumpImageList::updateImages()
}
}
}
- llpushcallstacks ;
}
@@ -1231,8 +1228,8 @@ void LLDrawPoolBump::pushBatch(LLDrawInfo& params, U32 mask, BOOL texture)
params.mGroup->rebuildMesh();
}
params.mVertexBuffer->setBuffer(mask);
- params.mVertexBuffer->drawRange(LLRender::TRIANGLES, params.mStart, params.mEnd, params.mCount, params.mOffset);
- gPipeline.addTrianglesDrawn(params.mCount/3);
+ params.mVertexBuffer->drawRange(params.mDrawMode, params.mStart, params.mEnd, params.mCount, params.mOffset);
+ gPipeline.addTrianglesDrawn(params.mCount, params.mDrawMode);
if (params.mTextureMatrix)
{
if (mShiny)
diff --git a/indra/newview/lldrawpooltree.cpp b/indra/newview/lldrawpooltree.cpp
index 5521fb05a8..1571415e63 100644
--- a/indra/newview/lldrawpooltree.cpp
+++ b/indra/newview/lldrawpooltree.cpp
@@ -113,9 +113,12 @@ void LLDrawPoolTree::render(S32 pass)
iter != mDrawFace.end(); iter++)
{
LLFace *face = *iter;
- face->mVertexBuffer->setBuffer(LLDrawPoolTree::VERTEX_DATA_MASK);
- face->mVertexBuffer->drawRange(LLRender::TRIANGLES, 0, face->mVertexBuffer->getRequestedVerts()-1, face->mVertexBuffer->getRequestedIndices(), 0);
- gPipeline.addTrianglesDrawn(face->mVertexBuffer->getRequestedIndices()/3);
+ if(face->mVertexBuffer.notNull())
+ {
+ face->mVertexBuffer->setBuffer(LLDrawPoolTree::VERTEX_DATA_MASK);
+ face->mVertexBuffer->drawRange(LLRender::TRIANGLES, 0, face->mVertexBuffer->getRequestedVerts()-1, face->mVertexBuffer->getRequestedIndices(), 0);
+ gPipeline.addTrianglesDrawn(face->mVertexBuffer->getRequestedIndices());
+ }
}
}
}
@@ -237,7 +240,7 @@ void LLDrawPoolTree::renderForSelect()
face->mVertexBuffer->setBuffer(LLDrawPoolTree::VERTEX_DATA_MASK);
face->mVertexBuffer->drawRange(LLRender::TRIANGLES, 0, face->mVertexBuffer->getRequestedVerts()-1, face->mVertexBuffer->getRequestedIndices(), 0);
- gPipeline.addTrianglesDrawn(face->mVertexBuffer->getRequestedIndices()/3);
+ gPipeline.addTrianglesDrawn(face->mVertexBuffer->getRequestedIndices());
}
}
}
@@ -333,7 +336,7 @@ void LLDrawPoolTree::renderTree(BOOL selecting)
S32 stop_depth = 0;
F32 app_angle = treep->getAppAngle()*LLVOTree::sTreeFactor;
F32 alpha = 1.0;
- S32 trunk_LOD = 0;
+ S32 trunk_LOD = LLVOTree::sMAX_NUM_TREE_LOD_LEVELS;
for (S32 j = 0; j < 4; j++)
{
@@ -344,6 +347,10 @@ void LLDrawPoolTree::renderTree(BOOL selecting)
break;
}
}
+ if(trunk_LOD >= LLVOTree::sMAX_NUM_TREE_LOD_LEVELS)
+ {
+ continue ; //do not render.
+ }
if (app_angle < (THRESH_ANGLE_FOR_BILLBOARD - BLEND_RANGE_FOR_BILLBOARD))
{
diff --git a/indra/newview/lldriverparam.cpp b/indra/newview/lldriverparam.cpp
index 8ebfa471f3..40ce0ebcf4 100644
--- a/indra/newview/lldriverparam.cpp
+++ b/indra/newview/lldriverparam.cpp
@@ -118,13 +118,12 @@ void LLDriverParamInfo::toStream(std::ostream &out)
out << std::endl;
- LLVOAvatarSelf *avatar = gAgent.getAvatarObject();
- if(avatar)
+ if(isAgentAvatarValid())
{
for (entry_info_list_t::iterator iter = mDrivenInfoList.begin(); iter != mDrivenInfoList.end(); iter++)
{
LLDrivenEntryInfo driven = *iter;
- LLViewerVisualParam *param = (LLViewerVisualParam*)avatar->getVisualParam(driven.mDrivenID);
+ LLViewerVisualParam *param = (LLViewerVisualParam*)gAgentAvatarp->getVisualParam(driven.mDrivenID);
if (param)
{
param->getInfo()->toStream(out);
@@ -146,7 +145,7 @@ void LLDriverParamInfo::toStream(std::ostream &out)
}
else
{
- llwarns << "could not get parameter " << driven.mDrivenID << " from avatar " << avatar << " for driver parameter " << getID() << llendl;
+ llwarns << "could not get parameter " << driven.mDrivenID << " from avatar " << gAgentAvatarp << " for driver parameter " << getID() << llendl;
}
out << std::endl;
}
@@ -432,6 +431,12 @@ const LLVector3* LLDriverParam::getNextDistortion(U32 *index, LLPolyMesh **poly_
}
}
+ llassert(driven);
+ if (!driven)
+ {
+ return NULL; // shouldn't happen, but...
+ }
+
// We're already in the middle of a param's distortions, so get the next one.
const LLVector3* v = driven->mParam->getNextDistortion( index, poly_mesh );
if( (!v) && (iter != mDriven.end()) )
@@ -529,7 +534,7 @@ void LLDriverParam::resetDrivenParams()
mDriven.reserve(getInfo()->mDrivenInfoList.size());
}
-void LLDriverParam::updateCrossDrivenParams(EWearableType driven_type)
+void LLDriverParam::updateCrossDrivenParams(LLWearableType::EType driven_type)
{
bool needs_update = (getWearableType()==driven_type);
@@ -546,7 +551,7 @@ void LLDriverParam::updateCrossDrivenParams(EWearableType driven_type)
if (needs_update)
{
- EWearableType driver_type = (EWearableType)getWearableType();
+ LLWearableType::EType driver_type = (LLWearableType::EType)getWearableType();
// If we've gotten here, we've added a new wearable of type "type"
// Thus this wearable needs to get updates from the driver wearable.
@@ -620,13 +625,13 @@ F32 LLDriverParam::getDrivenWeight(const LLDrivenEntry* driven, F32 input_weight
void LLDriverParam::setDrivenWeight(LLDrivenEntry *driven, F32 driven_weight, bool upload_bake)
{
- LLVOAvatarSelf *avatar_self = gAgent.getAvatarObject();
- if(mWearablep &&
+ if(isAgentAvatarValid() &&
+ mWearablep &&
driven->mParam->getCrossWearable() &&
mWearablep->isOnTop())
{
// call setWeight through LLVOAvatarSelf so other wearables can be updated with the correct values
- avatar_self->setVisualParamWeight( (LLVisualParam*)driven->mParam, driven_weight, upload_bake );
+ gAgentAvatarp->setVisualParamWeight( (LLVisualParam*)driven->mParam, driven_weight, upload_bake );
}
else
{
diff --git a/indra/newview/lldriverparam.h b/indra/newview/lldriverparam.h
index e963a2d55a..1069f7ad51 100644
--- a/indra/newview/lldriverparam.h
+++ b/indra/newview/lldriverparam.h
@@ -34,7 +34,7 @@
#define LL_LLDRIVERPARAM_H
#include "llviewervisualparam.h"
-#include "llwearabledictionary.h"
+#include "llwearabletype.h"
class LLVOAvatar;
class LLWearable;
@@ -94,7 +94,7 @@ public:
void setWearable(LLWearable *wearablep);
void setAvatar(LLVOAvatar *avatarp);
- void updateCrossDrivenParams(EWearableType driven_type);
+ void updateCrossDrivenParams(LLWearableType::EType driven_type);
/*virtual*/ LLViewerVisualParam* cloneParam(LLWearable* wearable) const;
diff --git a/indra/newview/lldynamictexture.cpp b/indra/newview/lldynamictexture.cpp
index c7c79401a0..c423473740 100644
--- a/indra/newview/lldynamictexture.cpp
+++ b/indra/newview/lldynamictexture.cpp
@@ -167,6 +167,8 @@ void LLViewerDynamicTexture::postRender(BOOL success)
{
generateGLTexture() ;
}
+ llcallstacks << "class type: " << (S32)getType() << llcallstacksendl ;
+
success = mGLTexturep->setSubImageFromFrameBuffer(0, 0, mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight);
}
}
diff --git a/indra/newview/lldynamictexture.h b/indra/newview/lldynamictexture.h
index 2a944eaada..caf2603519 100644
--- a/indra/newview/lldynamictexture.h
+++ b/indra/newview/lldynamictexture.h
@@ -41,6 +41,19 @@
class LLViewerDynamicTexture : public LLViewerTexture
{
+public:
+ enum
+ {
+ LL_VIEWER_DYNAMIC_TEXTURE = LLViewerTexture::DYNAMIC_TEXTURE,
+ LL_TEX_LAYER_SET_BUFFER = LLViewerTexture::INVALID_TEXTURE_TYPE + 1,
+ LL_VISUAL_PARAM_HINT,
+ LL_VISUAL_PARAM_RESET,
+ LL_PREVIEW_ANIMATION,
+ LL_IMAGE_PREVIEW_SCULPTED,
+ LL_IMAGE_PREVIEW_AVATAR,
+ INVALID_DYNAMIC_TEXTURE
+ };
+
protected:
/*virtual*/ ~LLViewerDynamicTexture();
diff --git a/indra/newview/lleventpoll.cpp b/indra/newview/lleventpoll.cpp
index eca9f8aba2..cc4e1a1868 100644
--- a/indra/newview/lleventpoll.cpp
+++ b/indra/newview/lleventpoll.cpp
@@ -39,7 +39,7 @@
#include "llhttpclient.h"
#include "llhttpstatuscodes.h"
#include "llsdserialize.h"
-#include "lltimer.h"
+#include "lleventtimer.h"
#include "llviewerregion.h"
#include "message.h"
#include "lltrans.h"
diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp
index 3818ee6f78..149ba2478d 100644
--- a/indra/newview/llexpandabletextbox.cpp
+++ b/indra/newview/llexpandabletextbox.cpp
@@ -35,6 +35,7 @@
#include "llscrollcontainer.h"
#include "llwindow.h"
+#include "llviewerwindow.h"
static LLDefaultChildRegistry::Register<LLExpandableTextBox> t1("expandable_text");
@@ -111,13 +112,12 @@ private:
};
LLExpandableTextBox::LLTextBoxEx::Params::Params()
-: more_label("more_label")
{
}
LLExpandableTextBox::LLTextBoxEx::LLTextBoxEx(const Params& p)
: LLTextEditor(p),
- mExpanderLabel(p.more_label),
+ mExpanderLabel(p.label),
mExpanderVisible(false)
{
setIsChrome(TRUE);
@@ -382,7 +382,7 @@ void LLExpandableTextBox::expandTextBox()
setFocus(TRUE);
// this lets us receive top_lost event(needed to collapse text box)
// it also draws text box above all other ui elements
- gFocusMgr.setTopCtrl(this);
+ gViewerWindow->addPopup(this);
mExpanded = true;
}
@@ -401,10 +401,7 @@ void LLExpandableTextBox::collapseTextBox()
updateTextBoxRect();
- if(gFocusMgr.getTopCtrl() == this)
- {
- gFocusMgr.setTopCtrl(NULL);
- }
+ gViewerWindow->removePopup(this);
}
void LLExpandableTextBox::onFocusLost()
diff --git a/indra/newview/llexpandabletextbox.h b/indra/newview/llexpandabletextbox.h
index 58316ddb98..5872592fae 100644
--- a/indra/newview/llexpandabletextbox.h
+++ b/indra/newview/llexpandabletextbox.h
@@ -54,7 +54,6 @@ protected:
public:
struct Params : public LLInitParam::Block<Params, LLTextEditor::Params>
{
- Mandatory<std::string> more_label;
Params();
};
@@ -144,6 +143,7 @@ public:
*/
/*virtual*/ void onTopLost();
+
/**
* Draws text box, collapses text box if its expanded and its parent's position changed
*/
diff --git a/indra/newview/llface.cpp b/indra/newview/llface.cpp
index 965ac1cad0..dbbcb6e7c4 100644
--- a/indra/newview/llface.cpp
+++ b/indra/newview/llface.cpp
@@ -182,6 +182,7 @@ void LLFace::init(LLDrawable* drawablep, LLViewerObject* objp)
mAtlasInfop = NULL ;
mUsingAtlas = FALSE ;
+ mHasMedia = FALSE ;
}
@@ -301,7 +302,8 @@ void LLFace::switchTexture(LLViewerTexture* new_texture)
if(!new_texture)
{
- llerrs << "Can not switch to a null texture." << llendl ;
+ llerrs << "Can not switch to a null texture." << llendl;
+ return;
}
new_texture->addTextureStats(mTexture->getMaxVirtualSize()) ;
@@ -860,15 +862,17 @@ void LLFace::updateRebuildFlags()
}
}
+static LLFastTimer::DeclareTimer FTM_FACE_GET_GEOM("Face Geom");
+
BOOL LLFace::getGeometryVolume(const LLVolume& volume,
const S32 &f,
const LLMatrix4& mat_vert, const LLMatrix3& mat_normal,
const U16 &index_offset)
{
- llpushcallstacks ;
+ LLFastTimer t(FTM_FACE_GET_GEOM);
const LLVolumeFace &vf = volume.getVolumeFace(f);
S32 num_vertices = (S32)vf.mVertices.size();
- S32 num_indices = (S32)vf.mIndices.size();
+ S32 num_indices = LLPipeline::sUseTriStrips ? (S32)vf.mTriStrip.size() : (S32) vf.mIndices.size();
if (mVertexBuffer.notNull())
{
@@ -1040,17 +1044,20 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
if (rebuild_color)
{
- GLfloat alpha[4] =
- {
- 0.00f,
- 0.25f,
- 0.5f,
- 0.75f
- };
-
- if (getPoolType() != LLDrawPool::POOL_ALPHA && (LLPipeline::sRenderDeferred || (LLPipeline::sRenderBump && tep->getShiny())))
+ if (tep)
{
- color.mV[3] = U8 (alpha[tep->getShiny()] * 255);
+ GLfloat alpha[4] =
+ {
+ 0.00f,
+ 0.25f,
+ 0.5f,
+ 0.75f
+ };
+
+ if (getPoolType() != LLDrawPool::POOL_ALPHA && (LLPipeline::sRenderDeferred || (LLPipeline::sRenderBump && tep->getShiny())))
+ {
+ color.mV[3] = U8 (alpha[tep->getShiny()] * 255);
+ }
}
}
@@ -1058,9 +1065,19 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
if (full_rebuild)
{
mVertexBuffer->getIndexStrider(indicesp, mIndicesIndex);
- for (U16 i = 0; i < num_indices; i++)
+ if (LLPipeline::sUseTriStrips)
{
- *indicesp++ = vf.mIndices[i] + index_offset;
+ for (U32 i = 0; i < (U32) num_indices; i++)
+ {
+ *indicesp++ = vf.mTriStrip[i] + index_offset;
+ }
+ }
+ else
+ {
+ for (U32 i = 0; i < (U32) num_indices; i++)
+ {
+ *indicesp++ = vf.mIndices[i] + index_offset;
+ }
}
}
@@ -1323,17 +1340,33 @@ BOOL LLFace::getGeometryVolume(const LLVolume& volume,
return TRUE;
}
+//check if the face has a media
+BOOL LLFace::hasMedia() const
+{
+ if(mHasMedia)
+ {
+ return TRUE ;
+ }
+ if(mTexture.notNull())
+ {
+ return mTexture->hasParcelMedia() ; //if has a parcel media
+ }
+
+ return FALSE ; //no media.
+}
+
const F32 LEAST_IMPORTANCE = 0.05f ;
const F32 LEAST_IMPORTANCE_FOR_LARGE_IMAGE = 0.3f ;
F32 LLFace::getTextureVirtualSize()
{
F32 radius;
- F32 cos_angle_to_view_dir;
- mPixelArea = calcPixelArea(cos_angle_to_view_dir, radius);
+ F32 cos_angle_to_view_dir;
+ BOOL in_frustum = calcPixelArea(cos_angle_to_view_dir, radius);
- if (mPixelArea <= 0)
+ if (mPixelArea < 0.0001f || !in_frustum)
{
+ setVirtualSize(0.f) ;
return 0.f;
}
@@ -1346,9 +1379,18 @@ F32 LLFace::getTextureVirtualSize()
texel_area = 1.f;
}
- //apply texel area to face area to get accurate ratio
- //face_area /= llclamp(texel_area, 1.f/64.f, 16.f);
- F32 face_area = mPixelArea / llclamp(texel_area, 0.015625f, 128.f);
+ F32 face_area;
+ if (mVObjp->isSculpted() && texel_area > 1.f)
+ {
+ //sculpts can break assumptions about texel area
+ face_area = mPixelArea;
+ }
+ else
+ {
+ //apply texel area to face area to get accurate ratio
+ //face_area /= llclamp(texel_area, 1.f/64.f, 16.f);
+ face_area = mPixelArea / llclamp(texel_area, 0.015625f, 128.f);
+ }
if(face_area > LLViewerTexture::sMaxSmallImageSize)
{
@@ -1370,23 +1412,48 @@ F32 LLFace::getTextureVirtualSize()
}
}
+ setVirtualSize(face_area) ;
+
return face_area;
}
-F32 LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
+BOOL LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
{
//get area of circle around face
LLVector3 center = getPositionAgent();
- LLVector3 size = (mExtents[1] - mExtents[0]) * 0.5f;
-
+ LLVector3 size = (mExtents[1] - mExtents[0]) * 0.5f;
LLViewerCamera* camera = LLViewerCamera::getInstance();
+
+ F32 size_squared = size.lengthSquared() ;
LLVector3 lookAt = center - camera->getOrigin();
- F32 dist = lookAt.normVec() ;
+ F32 dist = lookAt.normVec() ;
//get area of circle around node
- F32 app_angle = atanf(size.length()/dist);
+ F32 app_angle = atanf(fsqrtf(size_squared) / dist);
radius = app_angle*LLDrawable::sCurPixelAngle;
- F32 face_area = radius*radius * 3.14159f;
+ mPixelArea = radius*radius * 3.14159f;
+ cos_angle_to_view_dir = lookAt * camera->getXAxis() ;
+
+ //if has media, check if the face is out of the view frustum.
+ if(hasMedia())
+ {
+ if(!camera->AABBInFrustum(center, size))
+ {
+ mImportanceToCamera = 0.f ;
+ return false ;
+ }
+ if(cos_angle_to_view_dir > camera->getCosHalfFov()) //the center is within the view frustum
+ {
+ cos_angle_to_view_dir = 1.0f ;
+ }
+ else
+ {
+ if(dist * dist * (lookAt - camera->getXAxis()).lengthSquared() < size_squared)
+ {
+ cos_angle_to_view_dir = 1.0f ;
+ }
+ }
+ }
if(dist < mBoundingSphereRadius) //camera is very close
{
@@ -1394,12 +1461,11 @@ F32 LLFace::calcPixelArea(F32& cos_angle_to_view_dir, F32& radius)
mImportanceToCamera = 1.0f ;
}
else
- {
- cos_angle_to_view_dir = lookAt * camera->getXAxis() ;
+ {
mImportanceToCamera = LLFace::calcImportanceToCamera(cos_angle_to_view_dir, dist) ;
}
- return face_area ;
+ return true ;
}
//the projection of the face partially overlaps with the screen
@@ -1572,8 +1638,13 @@ S32 LLFace::pushVertices(const U16* index_array) const
{
if (mIndicesCount)
{
- mVertexBuffer->drawRange(LLRender::TRIANGLES, mGeomIndex, mGeomIndex+mGeomCount-1, mIndicesCount, mIndicesIndex);
- gPipeline.addTrianglesDrawn(mIndicesCount/3);
+ U32 render_type = LLRender::TRIANGLES;
+ if (mDrawInfo)
+ {
+ render_type = mDrawInfo->mDrawMode;
+ }
+ mVertexBuffer->drawRange(render_type, mGeomIndex, mGeomIndex+mGeomCount-1, mIndicesCount, mIndicesIndex);
+ gPipeline.addTrianglesDrawn(mIndicesCount, render_type);
}
return mIndicesCount;
diff --git a/indra/newview/llface.h b/indra/newview/llface.h
index e12b64a2f2..67dd97e6f7 100644
--- a/indra/newview/llface.h
+++ b/indra/newview/llface.h
@@ -194,6 +194,9 @@ public:
F32 getTextureVirtualSize() ;
F32 getImportanceToCamera()const {return mImportanceToCamera ;}
+ void setHasMedia(bool has_media) { mHasMedia = has_media ;}
+ BOOL hasMedia() const ;
+
//for atlas
LLTextureAtlasSlot* getAtlasInfo() ;
void setAtlasInUse(BOOL flag);
@@ -208,7 +211,7 @@ public:
private:
F32 adjustPartialOverlapPixelArea(F32 cos_angle_to_view_dir, F32 radius );
- F32 calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) ;
+ BOOL calcPixelArea(F32& cos_angle_to_view_dir, F32& radius) ;
public:
static F32 calcImportanceToCamera(F32 to_view_dir, F32 dist);
@@ -262,7 +265,7 @@ private:
//based on the distance from the face to the view point and the angle from the face center to the view direction.
F32 mImportanceToCamera ;
F32 mBoundingSphereRadius ;
-
+ bool mHasMedia ;
//atlas
LLPointer<LLTextureAtlasSlot> mAtlasInfop ;
diff --git a/indra/newview/llfasttimerview.cpp b/indra/newview/llfasttimerview.cpp
index 4fa97e789b..8bc3b5a75f 100644
--- a/indra/newview/llfasttimerview.cpp
+++ b/indra/newview/llfasttimerview.cpp
@@ -44,6 +44,7 @@
#include "llfontgl.h"
#include "llsdserialize.h"
#include "lltooltip.h"
+#include "llbutton.h"
#include "llappviewer.h"
#include "llviewertexturelist.h"
@@ -99,6 +100,8 @@ LLFastTimerView::LLFastTimerView(const LLRect& rect)
FTV_NUM_TIMERS = LLFastTimer::NamedTimer::instanceCount();
mPrintStats = -1;
mAverageCyclesPerTimer = 0;
+ setCanMinimize(false);
+ setCanClose(true);
}
@@ -139,6 +142,18 @@ LLFastTimer::NamedTimer* LLFastTimerView::getLegendID(S32 y)
BOOL LLFastTimerView::handleMouseDown(S32 x, S32 y, MASK mask)
{
+
+ {
+ S32 local_x = x - mButtons[BUTTON_CLOSE]->getRect().mLeft;
+ S32 local_y = y - mButtons[BUTTON_CLOSE]->getRect().mBottom;
+ if(mButtons[BUTTON_CLOSE]->getVisible()
+ && mButtons[BUTTON_CLOSE]->pointInView(local_x, local_y) )
+ {
+ return LLFloater::handleMouseDown(x, y, mask);;
+ }
+ }
+
+
if (x < mBarRect.mLeft)
{
LLFastTimer::NamedTimer* idp = getLegendID(y);
@@ -188,6 +203,15 @@ BOOL LLFastTimerView::handleMouseDown(S32 x, S32 y, MASK mask)
BOOL LLFastTimerView::handleMouseUp(S32 x, S32 y, MASK mask)
{
+ {
+ S32 local_x = x - mButtons[BUTTON_CLOSE]->getRect().mLeft;
+ S32 local_y = y - mButtons[BUTTON_CLOSE]->getRect().mBottom;
+ if(mButtons[BUTTON_CLOSE]->getVisible()
+ && mButtons[BUTTON_CLOSE]->pointInView(local_x, local_y) )
+ {
+ return LLFloater::handleMouseUp(x, y, mask);;
+ }
+ }
return FALSE;
}
@@ -1191,5 +1215,8 @@ void LLFastTimerView::doAnalysis(std::string baseline, std::string target, std::
return ;
}
}
-
+void LLFastTimerView::onClickCloseBtn()
+{
+ setVisible(false);
+}
diff --git a/indra/newview/llfasttimerview.h b/indra/newview/llfasttimerview.h
index f5c8f23818..ac06990913 100644
--- a/indra/newview/llfasttimerview.h
+++ b/indra/newview/llfasttimerview.h
@@ -63,7 +63,9 @@ public:
LLFastTimer::NamedTimer* getLegendID(S32 y);
F64 getTime(const std::string& name);
-
+
+protected:
+ virtual void onClickCloseBtn();
private:
typedef std::vector<std::vector<S32> > bar_positions_t;
bar_positions_t mBarStart;
diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp
index 0f52b30567..6b7a257a4b 100644
--- a/indra/newview/llfavoritesbar.cpp
+++ b/indra/newview/llfavoritesbar.cpp
@@ -31,7 +31,6 @@
*/
#include "llviewerprecompiledheaders.h"
-
#include "llfavoritesbar.h"
#include "llfloaterreg.h"
@@ -47,6 +46,7 @@
#include "llclipboard.h"
#include "llinventoryclipboard.h"
#include "llinventorybridge.h"
+#include "llinventoryfunctions.h"
#include "llfloaterworldmap.h"
#include "lllandmarkactions.h"
#include "llnotificationsutil.h"
@@ -75,7 +75,9 @@ public:
mPosY(0),
mPosZ(0),
mLoaded(false)
- {}
+ {
+ mHandle.bind(this);
+ }
void setLandmarkID(const LLUUID& id) { mLandmarkID = id; }
const LLUUID& getLandmarkId() const { return mLandmarkID; }
@@ -122,17 +124,21 @@ private:
if(LLLandmarkActions::getLandmarkGlobalPos(mLandmarkID, g_pos))
{
LLLandmarkActions::getRegionNameAndCoordsFromPosGlobal(g_pos,
- boost::bind(&LLLandmarkInfoGetter::landmarkNameCallback, this, _1, _2, _3, _4));
+ boost::bind(&LLLandmarkInfoGetter::landmarkNameCallback, static_cast<LLHandle<LLLandmarkInfoGetter> >(mHandle), _1, _2, _3, _4));
}
}
- void landmarkNameCallback(const std::string& name, S32 x, S32 y, S32 z)
+ static void landmarkNameCallback(LLHandle<LLLandmarkInfoGetter> handle, const std::string& name, S32 x, S32 y, S32 z)
{
- mPosX = x;
- mPosY = y;
- mPosZ = z;
- mName = name;
- mLoaded = true;
+ LLLandmarkInfoGetter* getter = handle.get();
+ if (getter)
+ {
+ getter->mPosX = x;
+ getter->mPosY = y;
+ getter->mPosZ = z;
+ getter->mName = name;
+ getter->mLoaded = true;
+ }
}
LLUUID mLandmarkID;
@@ -141,6 +147,7 @@ private:
S32 mPosY;
S32 mPosZ;
bool mLoaded;
+ LLRootHandle<LLLandmarkInfoGetter> mHandle;
};
/**
@@ -298,6 +305,20 @@ public:
return TRUE;
}
+ void setVisible(BOOL b)
+ {
+ // Overflow menu shouldn't hide when it still has focus. See EXT-4217.
+ if (!b && hasFocus())
+ return;
+ LLToggleableMenu::setVisible(b);
+ setFocus(b);
+ }
+
+ void onFocusLost()
+ {
+ setVisible(FALSE);
+ }
+
protected:
LLFavoriteLandmarkToggleableMenu(const LLToggleableMenu::Params& p):
LLToggleableMenu(p)
@@ -777,6 +798,15 @@ void LLFavoritesBarCtrl::updateButtons()
mChevronButton->setRect(rect);
mChevronButton->setVisible(TRUE);
}
+ // Update overflow menu
+ LLToggleableMenu* overflow_menu = static_cast <LLToggleableMenu*> (mPopupMenuHandle.get());
+ if (overflow_menu && overflow_menu->getVisible())
+ {
+ overflow_menu->setFocus(FALSE);
+ overflow_menu->setVisible(FALSE);
+ if (mUpdateDropDownItems)
+ showDropDownMenu();
+ }
}
else
{
@@ -892,6 +922,8 @@ void LLFavoritesBarCtrl::showDropDownMenu()
if (menu)
{
+ // Release focus to allow changing of visibility.
+ menu->setFocus(FALSE);
if (!menu->toggleVisibility())
return;
@@ -1133,6 +1165,17 @@ void LLFavoritesBarCtrl::pastFromClipboard() const
void LLFavoritesBarCtrl::onButtonMouseDown(LLUUID id, LLUICtrl* ctrl, S32 x, S32 y, MASK mask)
{
+ // EXT-6997 (Fav bar: Pop-up menu for LM in overflow dropdown is kept after LM was dragged away)
+ // mInventoryItemsPopupMenuHandle.get() - is a pop-up menu (of items) in already opened dropdown menu.
+ // We have to check and set visibility of pop-up menu in such a way instead of using
+ // LLMenuHolderGL::hideMenus() because it will close both menus(dropdown and pop-up), but
+ // we need to close only pop-up menu while dropdown one should be still opened.
+ LLMenuGL* menu = (LLMenuGL*)mInventoryItemsPopupMenuHandle.get();
+ if(menu && menu->getVisible())
+ {
+ menu->setVisible(FALSE);
+ }
+
mDragItemId = id;
mStartDrag = TRUE;
@@ -1239,8 +1282,11 @@ LLInventoryModel::item_array_t::iterator LLFavoritesBarCtrl::findItemByUUID(LLIn
void LLFavoritesBarCtrl::insertBeforeItem(LLInventoryModel::item_array_t& items, const LLUUID& beforeItemId, LLViewerInventoryItem* insertedItem)
{
LLViewerInventoryItem* beforeItem = gInventory.getItem(beforeItemId);
-
- items.insert(findItemByUUID(items, beforeItem->getUUID()), insertedItem);
+ llassert(beforeItem);
+ if (beforeItem)
+ {
+ items.insert(findItemByUUID(items, beforeItem->getUUID()), insertedItem);
+ }
}
// EOF
diff --git a/indra/newview/llfeaturemanager.cpp b/indra/newview/llfeaturemanager.cpp
index fb724f30e0..f32fcd6b7f 100644
--- a/indra/newview/llfeaturemanager.cpp
+++ b/indra/newview/llfeaturemanager.cpp
@@ -45,10 +45,13 @@
#include "llsecondlifeurls.h"
#include "llappviewer.h"
+#include "llhttpclient.h"
+#include "llnotificationsutil.h"
#include "llviewercontrol.h"
#include "llworld.h"
#include "lldrawpoolterrain.h"
#include "llviewertexturelist.h"
+#include "llversioninfo.h"
#include "llwindow.h"
#include "llui.h"
#include "llcontrol.h"
@@ -62,15 +65,20 @@
#if LL_DARWIN
const char FEATURE_TABLE_FILENAME[] = "featuretable_mac.txt";
+const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_mac.%s.txt";
#elif LL_LINUX
const char FEATURE_TABLE_FILENAME[] = "featuretable_linux.txt";
+const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_linux.%s.txt";
#elif LL_SOLARIS
const char FEATURE_TABLE_FILENAME[] = "featuretable_solaris.txt";
+const char FEATURE_TABLE_VER_FILENAME[] = "featuretable_solaris.%s.txt";
#else
const char FEATURE_TABLE_FILENAME[] = "featuretable.txt";
+const char FEATURE_TABLE_VER_FILENAME[] = "featuretable.%s.txt";
#endif
const char GPU_TABLE_FILENAME[] = "gpu_table.txt";
+const char GPU_TABLE_VER_FILENAME[] = "gpu_table.%s.txt";
LLFeatureInfo::LLFeatureInfo(const std::string& name, const BOOL available, const F32 level)
: mValid(TRUE), mName(name), mAvailable(available), mRecommendedLevel(level)
@@ -215,22 +223,44 @@ BOOL LLFeatureManager::loadFeatureTables()
mSkippedFeatures.insert("RenderVBOEnable");
mSkippedFeatures.insert("RenderFogRatio");
- std::string data_path = gDirUtilp->getAppRODataDir();
+ // first table is install with app
+ std::string app_path = gDirUtilp->getAppRODataDir();
+ app_path += gDirUtilp->getDirDelimiter();
+ app_path += FEATURE_TABLE_FILENAME;
- data_path += gDirUtilp->getDirDelimiter();
+ // second table is downloaded with HTTP
+ std::string http_filename = llformat(FEATURE_TABLE_VER_FILENAME, LLVersionInfo::getVersion().c_str());
+ std::string http_path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, http_filename);
- data_path += FEATURE_TABLE_FILENAME;
- lldebugs << "Looking for feature table in " << data_path << llendl;
+ // use HTTP table if it exists
+ std::string path;
+ if (gDirUtilp->fileExists(http_path))
+ {
+ path = http_path;
+ }
+ else
+ {
+ path = app_path;
+ }
+
+
+ return parseFeatureTable(path);
+}
+
+
+BOOL LLFeatureManager::parseFeatureTable(std::string filename)
+{
+ llinfos << "Looking for feature table in " << filename << llendl;
llifstream file;
std::string name;
U32 version;
- file.open(data_path); /*Flawfinder: ignore*/
+ file.open(filename); /*Flawfinder: ignore*/
if (!file)
{
- LL_WARNS("RenderInit") << "Unable to open feature table!" << LL_ENDL;
+ LL_WARNS("RenderInit") << "Unable to open feature table " << filename << LL_ENDL;
return FALSE;
}
@@ -239,7 +269,7 @@ BOOL LLFeatureManager::loadFeatureTables()
file >> version;
if (name != "version")
{
- LL_WARNS("RenderInit") << data_path << " does not appear to be a valid feature table!" << LL_ENDL;
+ LL_WARNS("RenderInit") << filename << " does not appear to be a valid feature table!" << LL_ENDL;
return FALSE;
}
@@ -287,6 +317,7 @@ BOOL LLFeatureManager::loadFeatureTables()
if (!flp)
{
LL_ERRS("RenderInit") << "Specified parameter before <list> keyword!" << LL_ENDL;
+ return FALSE;
}
S32 available;
F32 recommended;
@@ -301,24 +332,44 @@ BOOL LLFeatureManager::loadFeatureTables()
void LLFeatureManager::loadGPUClass()
{
- std::string data_path = gDirUtilp->getAppRODataDir();
-
- data_path += gDirUtilp->getDirDelimiter();
-
- data_path += GPU_TABLE_FILENAME;
-
// defaults
mGPUClass = GPU_CLASS_UNKNOWN;
mGPUString = gGLManager.getRawGLString();
mGPUSupported = FALSE;
+ // first table is in the app dir
+ std::string app_path = gDirUtilp->getAppRODataDir();
+ app_path += gDirUtilp->getDirDelimiter();
+ app_path += GPU_TABLE_FILENAME;
+
+ // second table is downloaded with HTTP
+ std::string http_filename = llformat(GPU_TABLE_VER_FILENAME, LLVersionInfo::getVersion().c_str());
+ std::string http_path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, http_filename);
+
+ // use HTTP table if it exists
+ std::string path;
+ if (gDirUtilp->fileExists(http_path))
+ {
+ path = http_path;
+ }
+ else
+ {
+ path = app_path;
+ }
+
+ parseGPUTable(path);
+}
+
+
+void LLFeatureManager::parseGPUTable(std::string filename)
+{
llifstream file;
- file.open(data_path); /*Flawfinder: ignore*/
+ file.open(filename);
if (!file)
{
- LL_WARNS("RenderInit") << "Unable to open GPU table: " << data_path << "!" << LL_ENDL;
+ LL_WARNS("RenderInit") << "Unable to open GPU table: " << filename << "!" << LL_ENDL;
return;
}
@@ -402,6 +453,70 @@ void LLFeatureManager::loadGPUClass()
LL_WARNS("RenderInit") << "Couldn't match GPU to a class: " << gGLManager.getRawGLString() << LL_ENDL;
}
+// responder saves table into file
+class LLHTTPFeatureTableResponder : public LLHTTPClient::Responder
+{
+public:
+
+ LLHTTPFeatureTableResponder(std::string filename) :
+ mFilename(filename)
+ {
+ }
+
+
+ virtual void completedRaw(U32 status, const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+ {
+ if (isGoodStatus(status))
+ {
+ // write to file
+
+ llinfos << "writing feature table to " << mFilename << llendl;
+
+ S32 file_size = buffer->countAfter(channels.in(), NULL);
+ if (file_size > 0)
+ {
+ // read from buffer
+ U8* copy_buffer = new U8[file_size];
+ buffer->readAfter(channels.in(), NULL, copy_buffer, file_size);
+
+ // write to file
+ LLAPRFile out(mFilename, LL_APR_WB);
+ out.write(copy_buffer, file_size);
+ out.close();
+ }
+ }
+
+ }
+
+private:
+ std::string mFilename;
+};
+
+void fetch_table(std::string table)
+{
+ const std::string base = gSavedSettings.getString("FeatureManagerHTTPTable");
+
+ const std::string filename = llformat(table.c_str(), LLVersionInfo::getVersion().c_str());
+
+ const std::string url = base + "/" + filename;
+
+ const std::string path = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, filename);
+
+ llinfos << "LLFeatureManager fetching " << url << " into " << path << llendl;
+
+ LLHTTPClient::get(url, new LLHTTPFeatureTableResponder(path));
+}
+
+// fetch table(s) from a website (S3)
+void LLFeatureManager::fetchHTTPTables()
+{
+ fetch_table(FEATURE_TABLE_VER_FILENAME);
+ fetch_table(GPU_TABLE_VER_FILENAME);
+}
+
+
void LLFeatureManager::cleanupFeatureTables()
{
std::for_each(mMaskList.begin(), mMaskList.end(), DeletePairedPointer());
@@ -620,9 +735,9 @@ void LLFeatureManager::applyBaseMasks()
#if LL_SOLARIS && defined(__sparc) // even low MHz SPARCs are fast
#error The 800 is hinky. Would something like a LL_MIN_MHZ make more sense here?
- if (gSysCPU.getMhz() < 800)
+ if (gSysCPU.getMHz() < 800)
#else
- if (gSysCPU.getMhz() < 1100)
+ if (gSysCPU.getMHz() < 1100)
#endif
{
maskFeatures("CPUSlow");
diff --git a/indra/newview/llfeaturemanager.h b/indra/newview/llfeaturemanager.h
index dd218d428f..c2ecede2c5 100644
--- a/indra/newview/llfeaturemanager.h
+++ b/indra/newview/llfeaturemanager.h
@@ -48,6 +48,7 @@ typedef enum EGPUClass
GPU_CLASS_3 = 3
} EGPUClass;
+
class LLFeatureInfo
{
public:
@@ -144,8 +145,13 @@ public:
// in the skip list if true
void applyFeatures(bool skipFeatures);
+ // load the dynamic GPU/feature table from a website
+ void fetchHTTPTables();
+
protected:
void loadGPUClass();
+ BOOL parseFeatureTable(std::string filename);
+ void parseGPUTable(std::string filename);
void initBaseMask();
diff --git a/indra/newview/llfilteredwearablelist.cpp b/indra/newview/llfilteredwearablelist.cpp
new file mode 100644
index 0000000000..306fa5ad6d
--- /dev/null
+++ b/indra/newview/llfilteredwearablelist.cpp
@@ -0,0 +1,100 @@
+/**
+ * @file llfilteredwearablelist.cpp
+ * @brief Functionality for showing filtered wearable flat list
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llfilteredwearablelist.h"
+
+// newview
+#include "llinventoryfunctions.h"
+#include "llinventoryitemslist.h"
+#include "llinventorymodel.h"
+
+
+LLFilteredWearableListManager::LLFilteredWearableListManager(LLInventoryItemsList* list, LLInventoryCollectFunctor* collector)
+: mWearableList(list)
+, mCollector(collector)
+{
+ llassert(mWearableList);
+ gInventory.addObserver(this);
+ gInventory.fetchDescendentsOf(gInventory.getRootFolderID());
+}
+
+LLFilteredWearableListManager::~LLFilteredWearableListManager()
+{
+ gInventory.removeObserver(this);
+}
+
+void LLFilteredWearableListManager::changed(U32 mask)
+{
+ if (LLInventoryObserver::CALLING_CARD == mask
+ || LLInventoryObserver::GESTURE == mask
+ || LLInventoryObserver::SORT == mask
+ )
+ {
+ // skip non-related changes
+ return;
+ }
+
+ if(!gInventory.isInventoryUsable())
+ {
+ return;
+ }
+
+ populateList();
+}
+
+void LLFilteredWearableListManager::setFilterCollector(LLInventoryCollectFunctor* collector)
+{
+ mCollector = collector;
+ populateList();
+}
+
+void LLFilteredWearableListManager::populateList()
+{
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t item_array;
+
+ if(mCollector)
+ {
+ gInventory.collectDescendentsIf(
+ gInventory.getRootFolderID(),
+ cat_array,
+ item_array,
+ LLInventoryModel::EXCLUDE_TRASH,
+ *mCollector);
+ }
+
+ // Probably will also need to get items from Library (waiting for reply in EXT-6724).
+
+ mWearableList->refreshList(item_array);
+}
+
+// EOF
diff --git a/indra/newview/llfilteredwearablelist.h b/indra/newview/llfilteredwearablelist.h
new file mode 100644
index 0000000000..b7825c07af
--- /dev/null
+++ b/indra/newview/llfilteredwearablelist.h
@@ -0,0 +1,71 @@
+/**
+ * @file llfilteredwearablelist.h
+ * @brief Functionality for showing filtered wearable flat list
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFILTEREDWEARABLELIST_H
+#define LL_LLFILTEREDWEARABLELIST_H
+
+#include "llinventoryfunctions.h"
+#include "llinventoryobserver.h"
+
+class LLInventoryItemsList;
+
+// Class that fills LLInventoryItemsList with filtered data (original items only (non-links)).
+class LLFilteredWearableListManager : public LLInventoryObserver
+{
+ LOG_CLASS(LLFilteredWearableListManager);
+public:
+
+ LLFilteredWearableListManager(LLInventoryItemsList* list, LLInventoryCollectFunctor* collector);
+ ~LLFilteredWearableListManager();
+
+ /** LLInventoryObserver implementation
+ *
+ */
+ /*virtual*/ void changed(U32 mask);
+
+ /**
+ * Sets new collector and applies it immediately
+ */
+ void setFilterCollector(LLInventoryCollectFunctor* collector);
+
+ /**
+ * Populates wearable list with filtered data.
+ */
+ void populateList();
+
+private:
+ LLInventoryItemsList* mWearableList;
+ LLInventoryCollectFunctor* mCollector;
+};
+
+#endif //LL_LLFILTEREDWEARABLELIST_H
+
+// EOF
diff --git a/indra/newview/llflexibleobject.cpp b/indra/newview/llflexibleobject.cpp
index aea2de8e92..561965d021 100644
--- a/indra/newview/llflexibleobject.cpp
+++ b/indra/newview/llflexibleobject.cpp
@@ -51,6 +51,9 @@
/*static*/ F32 LLVolumeImplFlexible::sUpdateFactor = 1.0f;
+static LLFastTimer::DeclareTimer FTM_FLEXIBLE_REBUILD("Rebuild");
+static LLFastTimer::DeclareTimer FTM_DO_FLEXIBLE_UPDATE("Update");
+
// LLFlexibleObjectData::pack/unpack now in llprimitive.cpp
//-----------------------------------------------
@@ -194,7 +197,6 @@ void LLVolumeImplFlexible::remapSections(LLFlexibleObjectSection *source, S32 so
}
}
-
//-----------------------------------------------------------------------------
void LLVolumeImplFlexible::setAttributesOfAllSections(LLVector3* inScale)
{
@@ -363,6 +365,7 @@ inline S32 log2(S32 x)
void LLVolumeImplFlexible::doFlexibleUpdate()
{
+ LLFastTimer ftm(FTM_DO_FLEXIBLE_UPDATE);
LLVolume* volume = mVO->getVolume();
LLPath *path = &volume->getPath();
if (mSimulateRes == 0)
@@ -693,7 +696,10 @@ BOOL LLVolumeImplFlexible::doUpdateGeometry(LLDrawable *drawable)
}
volume->updateRelativeXform();
- doFlexibleUpdate();
+ {
+ LLFastTimer t(FTM_DO_FLEXIBLE_UPDATE);
+ doFlexibleUpdate();
+ }
// Object may have been rotated, which means it needs a rebuild. See SL-47220
BOOL rotated = FALSE;
@@ -710,7 +716,10 @@ BOOL LLVolumeImplFlexible::doUpdateGeometry(LLDrawable *drawable)
volume->regenFaces();
volume->mDrawable->setState(LLDrawable::REBUILD_VOLUME);
volume->dirtySpatialGroup();
- doFlexibleRebuild();
+ {
+ LLFastTimer t(FTM_FLEXIBLE_REBUILD);
+ doFlexibleRebuild();
+ }
volume->genBBoxes(isVolumeGlobal());
}
else if (!mUpdated || rotated)
diff --git a/indra/newview/llfloaterabout.cpp b/indra/newview/llfloaterabout.cpp
index ef69f39ad2..4bd3151f2e 100644
--- a/indra/newview/llfloaterabout.cpp
+++ b/indra/newview/llfloaterabout.cpp
@@ -135,10 +135,10 @@ BOOL LLFloaterAbout::postBuild()
// Render the LLSD from getInfo() as a format_map_t
LLStringUtil::format_map_t args;
- // For reasons I don't yet understand, [ReleaseNotes] is not part of the
- // default substitution strings whereas [APP_NAME] is. But it works to
- // simply copy it into these specific args.
+
+ // allow the "Release Notes" URL label to be localized
args["ReleaseNotes"] = LLTrans::getString("ReleaseNotes");
+
for (LLSD::map_const_iterator ii(info.beginMap()), iend(info.endMap());
ii != iend; ++ii)
{
@@ -266,8 +266,18 @@ LLSD LLFloaterAbout::getInfo()
info["J2C_VERSION"] = LLImageJ2C::getEngineInfo();
bool want_fullname = true;
info["AUDIO_DRIVER_VERSION"] = gAudiop ? LLSD(gAudiop->getDriverName(want_fullname)) : LLSD();
- info["VIVOX_VERSION"] = gVoiceClient ? gVoiceClient->getAPIVersion() : LLTrans::getString("NotConnected");
-
+ if(LLVoiceClient::getInstance()->voiceEnabled())
+ {
+ LLVoiceVersionInfo version = LLVoiceClient::getInstance()->getVersion();
+ std::ostringstream version_string;
+ version_string << version.serverType << " " << version.serverVersion << std::endl;
+ info["VOICE_VERSION"] = version_string.str();
+ }
+ else
+ {
+ info["VOICE_VERSION"] = LLTrans::getString("NotConnected");
+ }
+
// TODO: Implement media plugin version query
info["QT_WEBKIT_VERSION"] = "4.6 (version number hard-coded)";
@@ -283,14 +293,14 @@ LLSD LLFloaterAbout::getInfo()
static std::string get_viewer_release_notes_url()
{
- LLSD query;
- query["channel"] = gSavedSettings.getString("VersionChannelName");
- query["version"] = LLVersionInfo::getVersion();
-
- std::ostringstream url;
- url << LLTrans::getString("RELEASE_NOTES_BASE_URL") << LLURI::mapToQueryString(query);
-
- return LLWeb::escapeURL(url.str());
+ // return a URL to the release notes for this viewer, such as:
+ // http://wiki.secondlife.com/wiki/Release_Notes/Second Life Beta Viewer/2.1.0
+ std::string url = LLTrans::getString("RELEASE_NOTES_BASE_URL");
+ if (! LLStringUtil::endsWith(url, "/"))
+ url += "/";
+ url += gSavedSettings.getString("VersionChannelName") + "/";
+ url += LLVersionInfo::getShortVersion();
+ return LLWeb::escapeURL(url);
}
class LLFloaterAboutListener: public LLEventAPI
diff --git a/indra/newview/llfloateranimpreview.cpp b/indra/newview/llfloateranimpreview.cpp
index 5ec58c8dd6..f14e64e3e4 100644
--- a/indra/newview/llfloateranimpreview.cpp
+++ b/indra/newview/llfloateranimpreview.cpp
@@ -568,7 +568,7 @@ void LLFloaterAnimPreview::onBtnPlay(void* user_data)
{
LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
- if(!avatarp->isMotionActive(previewp->mMotionID))
+ if (!avatarp->isMotionActive(previewp->mMotionID))
{
previewp->resetMotion();
previewp->mPauseRequest = NULL;
@@ -593,7 +593,7 @@ void LLFloaterAnimPreview::onBtnPause(void* user_data)
{
LLVOAvatar* avatarp = previewp->mAnimPreview->getDummyAvatar();
- if(avatarp->isMotionActive(previewp->mMotionID))
+ if (avatarp->isMotionActive(previewp->mMotionID))
{
if (!avatarp->areAnimationsPaused())
{
@@ -1069,6 +1069,12 @@ LLPreviewAnimation::~LLPreviewAnimation()
mDummyAvatar->markDead();
}
+//virtual
+S8 LLPreviewAnimation::getType() const
+{
+ return LLViewerDynamicTexture::LL_PREVIEW_ANIMATION ;
+}
+
//-----------------------------------------------------------------------------
// update()
//-----------------------------------------------------------------------------
diff --git a/indra/newview/llfloateranimpreview.h b/indra/newview/llfloateranimpreview.h
index 3ee1f419ab..84f131a322 100644
--- a/indra/newview/llfloateranimpreview.h
+++ b/indra/newview/llfloateranimpreview.h
@@ -50,6 +50,8 @@ protected:
public:
LLPreviewAnimation(S32 width, S32 height);
+ /*virtual*/ S8 getType() const ;
+
BOOL render();
void requestUpdate();
void rotate(F32 yaw_radians, F32 pitch_radians);
diff --git a/indra/newview/llfloaterauction.cpp b/indra/newview/llfloaterauction.cpp
index 698ccec9c1..679ab4c713 100644
--- a/indra/newview/llfloaterauction.cpp
+++ b/indra/newview/llfloaterauction.cpp
@@ -46,6 +46,7 @@
#include "llagent.h"
#include "llcombobox.h"
+#include "llmimetypes.h"
#include "llnotifications.h"
#include "llnotificationsutil.h"
#include "llsavedsettingsglue.h"
@@ -351,7 +352,7 @@ void LLFloaterAuction::doResetParcel()
body["music_url"] = empty;
body["media_url"] = empty;
body["media_desc"] = empty;
- body["media_type"] = std::string("none/none");
+ body["media_type"] = LLMIMETypes::getDefaultMimeType();
body["media_width"] = (S32) 0;
body["media_height"] = (S32) 0;
body["auto_scale"] = (S32) 0;
diff --git a/indra/newview/llfloateravatarpicker.cpp b/indra/newview/llfloateravatarpicker.cpp
index a0b2de85f0..8f6816b845 100644
--- a/indra/newview/llfloateravatarpicker.cpp
+++ b/indra/newview/llfloateravatarpicker.cpp
@@ -38,6 +38,8 @@
#include "llcallingcard.h"
#include "llfocusmgr.h"
#include "llfloaterreg.h"
+#include "llimview.h" // for gIMMgr
+#include "lltooldraganddrop.h" // for LLToolDragAndDrop
#include "llviewercontrol.h"
#include "llworld.h"
@@ -157,7 +159,7 @@ void LLFloaterAvatarPicker::onBtnFind()
find();
}
-static void getSelectedAvatarData(const LLScrollListCtrl* from, std::vector<std::string>& avatar_names, std::vector<LLUUID>& avatar_ids)
+static void getSelectedAvatarData(const LLScrollListCtrl* from, std::vector<std::string>& avatar_names, uuid_vec_t& avatar_ids)
{
std::vector<LLScrollListItem*> items = from->getAllSelected();
for (std::vector<LLScrollListItem*>::iterator iter = items.begin(); iter != items.end(); ++iter)
@@ -203,7 +205,7 @@ void LLFloaterAvatarPicker::onBtnSelect()
if(list)
{
std::vector<std::string> avatar_names;
- std::vector<LLUUID> avatar_ids;
+ uuid_vec_t avatar_ids;
getSelectedAvatarData(list, avatar_names, avatar_ids);
mSelectionCallback(avatar_names, avatar_ids);
}
@@ -247,7 +249,7 @@ void LLFloaterAvatarPicker::populateNearMe()
LLScrollListCtrl* near_me_scroller = getChild<LLScrollListCtrl>("NearMe");
near_me_scroller->deleteAllItems();
- std::vector<LLUUID> avatar_ids;
+ uuid_vec_t avatar_ids;
LLWorld::getInstance()->getAvatars(&avatar_ids, NULL, gAgent.getPositionGlobal(), gSavedSettings.getF32("NearMeRange"));
for(U32 i=0; i<avatar_ids.size(); i++)
{
@@ -312,6 +314,18 @@ void LLFloaterAvatarPicker::populateFriend()
void LLFloaterAvatarPicker::draw()
{
+ // sometimes it is hard to determine when Select/Ok button should be disabled (see LLAvatarActions::shareWithAvatars).
+ // lets check this via mOkButtonValidateSignal callback periodically.
+ static LLFrameTimer timer;
+ if (timer.hasExpired())
+ {
+ timer.setTimerExpirySec(0.33f); // three times per second should be enough.
+
+ // simulate list changes.
+ onList();
+ timer.start();
+ }
+
LLFloater::draw();
if (!mNearMeListComplete && childGetVisibleTab("ResidentChooserTabs") == getChild<LLPanel>("NearMePanel"))
{
@@ -370,6 +384,81 @@ void LLFloaterAvatarPicker::setAllowMultiple(BOOL allow_multiple)
getChild<LLScrollListCtrl>("Friends")->setAllowMultipleSelection(allow_multiple);
}
+LLScrollListCtrl* LLFloaterAvatarPicker::getActiveList()
+{
+ std::string acvtive_panel_name;
+ LLScrollListCtrl* list = NULL;
+ LLPanel* active_panel = childGetVisibleTab("ResidentChooserTabs");
+ if(active_panel)
+ {
+ acvtive_panel_name = active_panel->getName();
+ }
+ if(acvtive_panel_name == "SearchPanel")
+ {
+ list = getChild<LLScrollListCtrl>("SearchResults");
+ }
+ else if(acvtive_panel_name == "NearMePanel")
+ {
+ list = getChild<LLScrollListCtrl>("NearMe");
+ }
+ else if (acvtive_panel_name == "FriendsPanel")
+ {
+ list = getChild<LLScrollListCtrl>("Friends");
+ }
+ return list;
+}
+
+BOOL LLFloaterAvatarPicker::handleDragAndDrop(S32 x, S32 y, MASK mask,
+ BOOL drop, EDragAndDropType cargo_type,
+ void *cargo_data, EAcceptance *accept,
+ std::string& tooltip_msg)
+{
+ LLScrollListCtrl* list = getActiveList();
+ if(list)
+ {
+ LLRect rc_list;
+ LLRect rc_point(x,y,x,y);
+ if (localRectToOtherView(rc_point, &rc_list, list))
+ {
+ // Keep selected only one item
+ list->deselectAllItems(TRUE);
+ list->selectItemAt(rc_list.mLeft, rc_list.mBottom, mask);
+ LLScrollListItem* selection = list->getFirstSelected();
+ if (selection)
+ {
+ LLUUID session_id = LLUUID::null;
+ LLUUID dest_agent_id = selection->getUUID();
+ std::string avatar_name = selection->getColumn(0)->getValue().asString();
+ if (dest_agent_id.notNull() && dest_agent_id != gAgentID)
+ {
+ if (drop)
+ {
+ // Start up IM before give the item
+ session_id = gIMMgr->addSession(avatar_name, IM_NOTHING_SPECIAL, dest_agent_id);
+ }
+ return LLToolDragAndDrop::handleGiveDragAndDrop(dest_agent_id, session_id, drop,
+ cargo_type, cargo_data, accept, getName());
+ }
+ }
+ }
+ }
+ *accept = ACCEPT_NO;
+ return TRUE;
+}
+
+
+void LLFloaterAvatarPicker::openFriendsTab()
+{
+ LLTabContainer* tab_container = getChild<LLTabContainer>("ResidentChooserTabs");
+ if (tab_container == NULL)
+ {
+ llassert(tab_container != NULL);
+ return;
+ }
+
+ tab_container->selectTabByName("FriendsPanel");
+}
+
// static
void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void**)
{
@@ -387,8 +476,8 @@ void LLFloaterAvatarPicker::processAvatarPickerReply(LLMessageSystem* msg, void*
LLFloaterAvatarPicker* floater = LLFloaterReg::findTypedInstance<LLFloaterAvatarPicker>("avatar_picker");
- // these are not results from our last request
- if (query_id != floater->mQueryID)
+ // floater is closed or these are not results from our last request
+ if (NULL == floater || query_id != floater->mQueryID)
{
return;
}
@@ -499,7 +588,7 @@ bool LLFloaterAvatarPicker::isSelectBtnEnabled()
if(list)
{
- std::vector<LLUUID> avatar_ids;
+ uuid_vec_t avatar_ids;
std::vector<std::string> avatar_names;
getSelectedAvatarData(list, avatar_names, avatar_ids);
return mOkButtonValidateSignal(avatar_ids);
diff --git a/indra/newview/llfloateravatarpicker.h b/indra/newview/llfloateravatarpicker.h
index e35466cec8..0af72e85a0 100644
--- a/indra/newview/llfloateravatarpicker.h
+++ b/indra/newview/llfloateravatarpicker.h
@@ -37,14 +37,16 @@
#include <vector>
+class LLScrollListCtrl;
+
class LLFloaterAvatarPicker : public LLFloater
{
public:
- typedef boost::signals2::signal<bool(const std::vector<LLUUID>&), boost_boolean_combiner> validate_signal_t;
+ typedef boost::signals2::signal<bool(const uuid_vec_t&), boost_boolean_combiner> validate_signal_t;
typedef validate_signal_t::slot_type validate_callback_t;
// The callback function will be called with an avatar name and UUID.
- typedef boost::function<void (const std::vector<std::string>&, const std::vector<LLUUID>&)> select_callback_t;
+ typedef boost::function<void (const std::vector<std::string>&, const uuid_vec_t&)> select_callback_t;
// Call this to select an avatar.
static LLFloaterAvatarPicker* show(select_callback_t callback,
BOOL allow_multiple = FALSE,
@@ -59,6 +61,13 @@ public:
static void processAvatarPickerReply(class LLMessageSystem* msg, void**);
+ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask,
+ BOOL drop, EDragAndDropType cargo_type,
+ void *cargo_data, EAcceptance *accept,
+ std::string& tooltip_msg);
+
+ void openFriendsTab();
+
private:
void editKeystroke(class LLLineEditor* caller, void* user_data);
@@ -77,6 +86,7 @@ private:
void find();
void setAllowMultiple(BOOL allow_multiple);
+ LLScrollListCtrl* getActiveList();
virtual void draw();
virtual BOOL handleKeyHere(KEY key, MASK mask);
diff --git a/indra/newview/llfloateravatartextures.cpp b/indra/newview/llfloateravatartextures.cpp
index 8c7899af3e..847462a6c3 100644
--- a/indra/newview/llfloateravatartextures.cpp
+++ b/indra/newview/llfloateravatartextures.cpp
@@ -31,15 +31,14 @@
*/
#include "llviewerprecompiledheaders.h"
-
#include "llfloateravatartextures.h"
+#include "llagent.h"
+#include "llagentwearables.h"
#include "lltexturectrl.h"
-
#include "lluictrlfactory.h"
#include "llviewerobjectlist.h"
-#include "llvoavatar.h"
-#include "llagentwearables.h"
+#include "llvoavatarself.h"
using namespace LLVOAvatarDefines;
@@ -75,7 +74,6 @@ void LLFloaterAvatarTextures::draw()
LLFloater::draw();
}
-#if !LL_RELEASE_FOR_DOWNLOAD
static void update_texture_ctrl(LLVOAvatar* avatarp,
LLTextureCtrl* ctrl,
ETextureIndex te)
@@ -84,14 +82,17 @@ static void update_texture_ctrl(LLVOAvatar* avatarp,
const LLVOAvatarDictionary::TextureEntry* tex_entry = LLVOAvatarDictionary::getInstance()->getTexture(te);
if (tex_entry->mIsLocalTexture)
{
- const EWearableType wearable_type = tex_entry->mWearableType;
- LLWearable *wearable = gAgentWearables.getWearable(wearable_type, 0);
- if (wearable)
+ if (avatarp->isSelf())
{
- LLLocalTextureObject *lto = wearable->getLocalTextureObject(te);
- if (lto)
+ const LLWearableType::EType wearable_type = tex_entry->mWearableType;
+ LLWearable *wearable = gAgentWearables.getWearable(wearable_type, 0);
+ if (wearable)
{
- id = lto->getID();
+ LLLocalTextureObject *lto = wearable->getLocalTextureObject(te);
+ if (lto)
+ {
+ id = lto->getID();
+ }
}
}
}
@@ -103,12 +104,12 @@ static void update_texture_ctrl(LLVOAvatar* avatarp,
if (id == IMG_DEFAULT_AVATAR)
{
ctrl->setImageAssetID(LLUUID::null);
- ctrl->setToolTip(std::string("IMG_DEFAULT_AVATAR"));
+ ctrl->setToolTip(tex_entry->mName + " : " + std::string("IMG_DEFAULT_AVATAR"));
}
else
{
ctrl->setImageAssetID(id);
- ctrl->setToolTip(id.asString());
+ ctrl->setToolTip(tex_entry->mName + " : " + id.asString());
}
}
@@ -132,72 +133,73 @@ static LLVOAvatar* find_avatar(const LLUUID& id)
void LLFloaterAvatarTextures::refresh()
{
- LLVOAvatar *avatarp = find_avatar(mID);
- if (avatarp)
+ if (gAgent.isGodlike())
{
- std::string fullname;
- if (gCacheName->getFullName(avatarp->getID(), fullname))
+ LLVOAvatar *avatarp = find_avatar(mID);
+ if (avatarp)
{
- setTitle(mTitle + ": " + fullname);
+ std::string fullname;
+ if (gCacheName->getFullName(avatarp->getID(), fullname))
+ {
+ setTitle(mTitle + ": " + fullname);
+ }
+ for (U32 i=0; i < TEX_NUM_INDICES; i++)
+ {
+ update_texture_ctrl(avatarp, mTextures[i], ETextureIndex(i));
+ }
}
- for (U32 i=0; i < TEX_NUM_INDICES; i++)
+ else
{
- update_texture_ctrl(avatarp, mTextures[i], ETextureIndex(i));
+ setTitle(mTitle + ": " + getString("InvalidAvatar") + " (" + mID.asString() + ")");
}
}
- else
- {
- setTitle(mTitle + ": " + getString("InvalidAvatar") + " (" + mID.asString() + ")");
- }
}
-#else
-
-void LLFloaterAvatarTextures::refresh()
-{
-}
-
-#endif
-
// static
void LLFloaterAvatarTextures::onClickDump(void* data)
{
-#if !LL_RELEASE_FOR_DOWNLOAD
- LLFloaterAvatarTextures* self = (LLFloaterAvatarTextures*)data;
- LLVOAvatar* avatarp = find_avatar(self->mID);
- if (!avatarp) return;
-
- for (S32 i = 0; i < avatarp->getNumTEs(); i++)
+ if (gAgent.isGodlike())
{
- const LLTextureEntry* te = avatarp->getTE(i);
- if (!te) continue;
-
- if (LLVOAvatar::isIndexLocalTexture((ETextureIndex)i))
+ const LLVOAvatarSelf* avatarp = gAgentAvatarp;
+ if (!avatarp) return;
+ for (S32 i = 0; i < avatarp->getNumTEs(); i++)
{
- LLUUID id = IMG_DEFAULT_AVATAR;
- EWearableType wearable_type = LLVOAvatarDictionary::getInstance()->getTEWearableType((ETextureIndex)i);
- LLWearable *wearable = gAgentWearables.getWearable(wearable_type, 0);
- if (wearable)
+ const LLTextureEntry* te = avatarp->getTE(i);
+ if (!te) continue;
+
+ const LLVOAvatarDictionary::TextureEntry* tex_entry = LLVOAvatarDictionary::getInstance()->getTexture((ETextureIndex)(i));
+ if (!tex_entry)
+ continue;
+
+ if (LLVOAvatar::isIndexLocalTexture((ETextureIndex)i))
{
- LLLocalTextureObject *lto = wearable->getLocalTextureObject(i);
- if (lto)
+ LLUUID id = IMG_DEFAULT_AVATAR;
+ LLWearableType::EType wearable_type = LLVOAvatarDictionary::getInstance()->getTEWearableType((ETextureIndex)i);
+ if (avatarp->isSelf())
{
- id = lto->getID();
+ LLWearable *wearable = gAgentWearables.getWearable(wearable_type, 0);
+ if (wearable)
+ {
+ LLLocalTextureObject *lto = wearable->getLocalTextureObject(i);
+ if (lto)
+ {
+ id = lto->getID();
+ }
+ }
+ }
+ if (id != IMG_DEFAULT_AVATAR)
+ {
+ llinfos << "TE " << i << " name:" << tex_entry->mName << " id:" << id << llendl;
+ }
+ else
+ {
+ llinfos << "TE " << i << " name:" << tex_entry->mName << " id:" << "<DEFAULT>" << llendl;
}
- }
- if (id != IMG_DEFAULT_AVATAR)
- {
- llinfos << "Avatar TE " << i << " id " << id << llendl;
}
else
{
- llinfos << "Avatar TE " << i << " id " << "<DEFAULT>" << llendl;
+ llinfos << "TE " << i << " name:" << tex_entry->mName << " id:" << te->getID() << llendl;
}
}
- else
- {
- llinfos << "Avatar TE " << i << " id " << te->getID() << llendl;
- }
}
-#endif
}
diff --git a/indra/newview/llfloaterbeacons.cpp b/indra/newview/llfloaterbeacons.cpp
index 13a7888f60..975c888a2b 100644
--- a/indra/newview/llfloaterbeacons.cpp
+++ b/indra/newview/llfloaterbeacons.cpp
@@ -71,7 +71,7 @@ void LLFloaterBeacons::onClickUICheck(LLUICtrl *ctrl)
{
LLCheckBoxCtrl *check = (LLCheckBoxCtrl *)ctrl;
std::string name = check->getName();
- if( name == "touch_only")
+ if(name == "touch_only")
{
LLPipeline::toggleRenderScriptedTouchBeacons(NULL);
// Don't allow both to be ON at the same time. Toggle the other one off if both now on.
@@ -81,7 +81,9 @@ void LLFloaterBeacons::onClickUICheck(LLUICtrl *ctrl)
{
LLPipeline::setRenderScriptedBeacons(FALSE);
getChild<LLCheckBoxCtrl>("scripted")->setControlValue(LLSD(FALSE));
+ getChild<LLCheckBoxCtrl>("scripted")->setValue(FALSE);
getChild<LLCheckBoxCtrl>("touch_only")->setControlValue(LLSD(TRUE)); // just to be sure it's in sync with llpipeline
+ getChild<LLCheckBoxCtrl>("touch_only")->setValue(TRUE);
}
}
else if(name == "scripted")
@@ -94,7 +96,9 @@ void LLFloaterBeacons::onClickUICheck(LLUICtrl *ctrl)
{
LLPipeline::setRenderScriptedTouchBeacons(FALSE);
getChild<LLCheckBoxCtrl>("touch_only")->setControlValue(LLSD(FALSE));
+ getChild<LLCheckBoxCtrl>("touch_only")->setValue(FALSE);
getChild<LLCheckBoxCtrl>("scripted")->setControlValue(LLSD(TRUE)); // just to be sure it's in sync with llpipeline
+ getChild<LLCheckBoxCtrl>("scripted")->setValue(TRUE);
}
}
else if(name == "physical") LLPipeline::setRenderPhysicalBeacons(check->get());
@@ -110,7 +114,9 @@ void LLFloaterBeacons::onClickUICheck(LLUICtrl *ctrl)
{
LLPipeline::setRenderBeacons(TRUE);
getChild<LLCheckBoxCtrl>("beacons")->setControlValue(LLSD(TRUE));
+ getChild<LLCheckBoxCtrl>("beacons")->setValue(TRUE);
getChild<LLCheckBoxCtrl>("highlights")->setControlValue(LLSD(FALSE)); // just to be sure it's in sync with llpipeline
+ getChild<LLCheckBoxCtrl>("highlights")->setValue(FALSE);
}
}
else if(name == "beacons")
@@ -123,7 +129,9 @@ void LLFloaterBeacons::onClickUICheck(LLUICtrl *ctrl)
{
LLPipeline::setRenderHighlights(TRUE);
getChild<LLCheckBoxCtrl>("highlights")->setControlValue(LLSD(TRUE));
+ getChild<LLCheckBoxCtrl>("highlights")->setValue(TRUE);
getChild<LLCheckBoxCtrl>("beacons")->setControlValue(LLSD(FALSE)); // just to be sure it's in sync with llpipeline
+ getChild<LLCheckBoxCtrl>("beacons")->setValue(FALSE);
}
}
}
diff --git a/indra/newview/llfloaterbulkpermission.cpp b/indra/newview/llfloaterbulkpermission.cpp
index b2f700069f..766fc0723c 100644
--- a/indra/newview/llfloaterbulkpermission.cpp
+++ b/indra/newview/llfloaterbulkpermission.cpp
@@ -37,6 +37,7 @@
#include "llfloaterperms.h" // for utilities
#include "llagent.h"
#include "llchat.h"
+#include "llinventorydefines.h"
#include "llviewerwindow.h"
#include "llviewerobject.h"
#include "llviewerobjectlist.h"
@@ -116,7 +117,7 @@ void LLFloaterBulkPermission::doApply()
// worked on.
// NOT static, virtual!
void LLFloaterBulkPermission::inventoryChanged(LLViewerObject* viewer_object,
- InventoryObjectList* inv,
+ LLInventoryObject::object_list_t* inv,
S32,
void* q_id)
{
@@ -250,12 +251,12 @@ void LLFloaterBulkPermission::doCheckUncheckAll(BOOL check)
}
-void LLFloaterBulkPermission::handleInventory(LLViewerObject* viewer_obj, InventoryObjectList* inv)
+void LLFloaterBulkPermission::handleInventory(LLViewerObject* viewer_obj, LLInventoryObject::object_list_t* inv)
{
LLScrollListCtrl* list = getChild<LLScrollListCtrl>("queue output");
- InventoryObjectList::const_iterator it = inv->begin();
- InventoryObjectList::const_iterator end = inv->end();
+ LLInventoryObject::object_list_t::const_iterator it = inv->begin();
+ LLInventoryObject::object_list_t::const_iterator end = inv->end();
for ( ; it != end; ++it)
{
LLAssetType::EType asstype = (*it)->getType();
diff --git a/indra/newview/llfloaterbulkpermission.h b/indra/newview/llfloaterbulkpermission.h
index bffcff7059..80dc88fbb1 100644
--- a/indra/newview/llfloaterbulkpermission.h
+++ b/indra/newview/llfloaterbulkpermission.h
@@ -63,13 +63,13 @@ private:
// This is the callback method for the viewer object currently
// being worked on.
/*virtual*/ void inventoryChanged(LLViewerObject* obj,
- InventoryObjectList* inv,
+ LLInventoryObject::object_list_t* inv,
S32 serial_num,
void* queue);
// This is called by inventoryChanged
void handleInventory(LLViewerObject* viewer_obj,
- InventoryObjectList* inv);
+ LLInventoryObject::object_list_t* inv);
void updateInventory(LLViewerObject* object,
diff --git a/indra/newview/llfloaterbuy.cpp b/indra/newview/llfloaterbuy.cpp
index fba557c656..d359856443 100644
--- a/indra/newview/llfloaterbuy.cpp
+++ b/indra/newview/llfloaterbuy.cpp
@@ -43,7 +43,8 @@
#include "llagent.h" // for agent id
#include "llinventorymodel.h" // for gInventory
#include "llfloaterreg.h"
-#include "llfloaterinventory.h" // for get_item_icon
+#include "llinventoryicon.h"
+#include "llinventorydefines.h"
#include "llinventoryfunctions.h"
#include "llnotificationsutil.h"
#include "llselectmgr.h"
@@ -151,9 +152,8 @@ void LLFloaterBuy::show(const LLSaleInfo& sale_info)
LLSD row;
// Compute icon for this item
- std::string icon_name = get_item_icon_name(LLAssetType::AT_OBJECT,
- LLInventoryType::IT_OBJECT,
- 0x0, FALSE);
+ std::string icon_name = LLInventoryIcon::getIconName(LLAssetType::AT_OBJECT,
+ LLInventoryType::IT_OBJECT);
row["columns"][0]["column"] = "icon";
row["columns"][0]["type"] = "icon";
@@ -195,7 +195,7 @@ void LLFloaterBuy::show(const LLSaleInfo& sale_info)
}
void LLFloaterBuy::inventoryChanged(LLViewerObject* obj,
- InventoryObjectList* inv,
+ LLInventoryObject::object_list_t* inv,
S32 serial_num,
void* data)
{
@@ -220,8 +220,8 @@ void LLFloaterBuy::inventoryChanged(LLViewerObject* obj,
return;
}
- InventoryObjectList::const_iterator it = inv->begin();
- InventoryObjectList::const_iterator end = inv->end();
+ LLInventoryObject::object_list_t::const_iterator it = inv->begin();
+ LLInventoryObject::object_list_t::const_iterator end = inv->end();
for ( ; it != end; ++it )
{
LLInventoryObject* obj = (LLInventoryObject*)(*it);
@@ -246,12 +246,13 @@ void LLFloaterBuy::inventoryChanged(LLViewerObject* obj,
// Compute icon for this item
BOOL item_is_multi = FALSE;
- if ( inv_item->getFlags() & LLInventoryItem::II_FLAGS_LANDMARK_VISITED )
+ if ( inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED
+ || inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS)
{
item_is_multi = TRUE;
}
- std::string icon_name = get_item_icon_name(inv_item->getType(),
+ std::string icon_name = LLInventoryIcon::getIconName(inv_item->getType(),
inv_item->getInventoryType(),
inv_item->getFlags(),
item_is_multi);
diff --git a/indra/newview/llfloaterbuy.h b/indra/newview/llfloaterbuy.h
index ab38e082dc..411c8fb00e 100644
--- a/indra/newview/llfloaterbuy.h
+++ b/indra/newview/llfloaterbuy.h
@@ -65,7 +65,7 @@ protected:
void requestObjectInventories();
/*virtual*/ void inventoryChanged(LLViewerObject* obj,
- InventoryObjectList* inv,
+ LLInventoryObject::object_list_t* inv,
S32 serial_num,
void* data);
diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp
index 0daef27af2..9bde3b1dac 100644
--- a/indra/newview/llfloaterbuycontents.cpp
+++ b/indra/newview/llfloaterbuycontents.cpp
@@ -44,10 +44,11 @@
#include "llagent.h" // for agent id
#include "llcheckboxctrl.h"
+#include "llinventorydefines.h"
#include "llinventoryfunctions.h"
#include "llinventorymodel.h" // for gInventory
#include "llfloaterreg.h"
-#include "llfloaterinventory.h" // for get_item_icon
+#include "llfloaterinventory.h" // for LLInventoryIcon::getIcon
#include "llnotificationsutil.h"
#include "llselectmgr.h"
#include "llscrolllistctrl.h"
@@ -142,7 +143,7 @@ void LLFloaterBuyContents::show(const LLSaleInfo& sale_info)
void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj,
- InventoryObjectList* inv,
+ LLInventoryObject::object_list_t* inv,
S32 serial_num,
void* data)
{
@@ -176,8 +177,8 @@ void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj,
LLInventoryType::EType inv_type;
S32 wearable_count = 0;
- InventoryObjectList::const_iterator it = inv->begin();
- InventoryObjectList::const_iterator end = inv->end();
+ LLInventoryObject::object_list_t::const_iterator it = inv->begin();
+ LLInventoryObject::object_list_t::const_iterator end = inv->end();
for ( ; it != end; ++it )
{
@@ -215,12 +216,12 @@ void LLFloaterBuyContents::inventoryChanged(LLViewerObject* obj,
LLSD row;
BOOL item_is_multi = FALSE;
- if ( inv_item->getFlags() & LLInventoryItem::II_FLAGS_LANDMARK_VISITED )
+ if ( inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED )
{
item_is_multi = TRUE;
}
- std::string icon_name = get_item_icon_name(inv_item->getType(),
+ std::string icon_name = LLInventoryIcon::getIconName(inv_item->getType(),
inv_item->getInventoryType(),
inv_item->getFlags(),
item_is_multi);
diff --git a/indra/newview/llfloaterbuycontents.h b/indra/newview/llfloaterbuycontents.h
index 8045a46c9f..ab161adfea 100644
--- a/indra/newview/llfloaterbuycontents.h
+++ b/indra/newview/llfloaterbuycontents.h
@@ -59,7 +59,7 @@ public:
protected:
void requestObjectInventories();
/*virtual*/ void inventoryChanged(LLViewerObject* obj,
- InventoryObjectList* inv,
+ LLInventoryObject::object_list_t* inv,
S32 serial_num,
void* data);
diff --git a/indra/newview/llfloaterbuycurrency.cpp b/indra/newview/llfloaterbuycurrency.cpp
index 1642e6725e..7fddd1fc5f 100644
--- a/indra/newview/llfloaterbuycurrency.cpp
+++ b/indra/newview/llfloaterbuycurrency.cpp
@@ -234,8 +234,7 @@ void LLFloaterBuyCurrencyUI::updateUI()
if (mHasTarget)
{
childSetVisible("buy_action", true);
- childSetTextArg("buy_action", "[NAME]", mTargetName);
- childSetTextArg("buy_action", "[PRICE]", llformat("%d",mTargetPrice));
+ childSetTextArg("buy_action", "[ACTION]", mTargetName);
}
}
diff --git a/indra/newview/llfloaterbuycurrencyhtml.cpp b/indra/newview/llfloaterbuycurrencyhtml.cpp
new file mode 100644
index 0000000000..d45df37092
--- /dev/null
+++ b/indra/newview/llfloaterbuycurrencyhtml.cpp
@@ -0,0 +1,128 @@
+/**
+ * @file llfloaterbuycurrencyhtml.cpp
+ * @brief buy currency implemented in HTML floater - uses embedded media browser control
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2006-2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterbuycurrencyhtml.h"
+#include "llstatusbar.h"
+
+////////////////////////////////////////////////////////////////////////////////
+//
+LLFloaterBuyCurrencyHTML::LLFloaterBuyCurrencyHTML( const LLSD& key ):
+ LLFloater( key ),
+ mSpecificSumRequested( false ),
+ mMessage( "" ),
+ mSum( 0 )
+{
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+BOOL LLFloaterBuyCurrencyHTML::postBuild()
+{
+ // observer media events
+ mBrowser = getChild<LLMediaCtrl>( "browser" );
+ mBrowser->addObserver( this );
+
+ return TRUE;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLFloaterBuyCurrencyHTML::navigateToFinalURL()
+{
+ // URL for actual currency buy contents is in XUI file
+ std::string buy_currency_url = getString( "buy_currency_url" );
+
+ // replace [LANGUAGE] meta-tag with view language
+ LLStringUtil::format_map_t replace;
+
+ // viewer language
+ replace[ "[LANGUAGE]" ] = LLUI::getLanguage();
+
+ // flag that specific amount requested
+ replace[ "[SPECIFIC_AMOUNT]" ] = ( mSpecificSumRequested ? "y":"n" );
+
+ // amount requested
+ std::ostringstream codec( "" );
+ codec << mSum;
+ replace[ "[SUM]" ] = codec.str();
+
+ // users' current balance
+ codec.clear();
+ codec.str( "" );
+ codec << gStatusBar->getBalance();
+ replace[ "[BAL]" ] = codec.str();
+
+ // message - "This cost L$x,xxx for example
+ replace[ "[MSG]" ] = LLURI::escape( mMessage );
+ LLStringUtil::format( buy_currency_url, replace );
+
+ // write final URL to debug console
+ llinfos << "Buy currency HTML prased URL is " << buy_currency_url << llendl;
+
+ // kick off the navigation
+ mBrowser->navigateTo( buy_currency_url, "text/html" );
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLFloaterBuyCurrencyHTML::handleMediaEvent( LLPluginClassMedia* self, EMediaEvent event )
+{
+ // placeholder for now - just in case we want to catch media events
+ if ( LLPluginClassMediaOwner::MEDIA_EVENT_NAVIGATE_COMPLETE == event )
+ {
+ // update currency after we complete a navigation since there are many ways
+ // this can result in a different L$ balance
+ LLStatusBar::sendMoneyBalanceRequest();
+ };
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLFloaterBuyCurrencyHTML::onClose( bool app_quitting )
+{
+ // update L$ balanace one more time
+ LLStatusBar::sendMoneyBalanceRequest();
+
+ destroy();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLFloaterBuyCurrencyHTML::setParams( bool specific_sum_requested, const std::string& message, S32 sum )
+{
+ // save these away - used to construct URL later
+ mSpecificSumRequested = specific_sum_requested;
+ mMessage = message;
+ mSum = sum;
+}
diff --git a/indra/newview/llfloaterbuycurrencyhtml.h b/indra/newview/llfloaterbuycurrencyhtml.h
new file mode 100644
index 0000000000..be7a4d3dd6
--- /dev/null
+++ b/indra/newview/llfloaterbuycurrencyhtml.h
@@ -0,0 +1,65 @@
+/**
+ * @file llfloaterbuycurrencyhtml.h
+ * @brief buy currency implemented in HTML floater - uses embedded media browser control
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2006-2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERBUYCURRENCYHTML_H
+#define LL_LLFLOATERBUYCURRENCYHTML_H
+
+#include "llfloater.h"
+#include "llmediactrl.h"
+
+class LLFloaterBuyCurrencyHTML :
+ public LLFloater,
+ public LLViewerMediaObserver
+{
+ public:
+ LLFloaterBuyCurrencyHTML( const LLSD& key );
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onClose( bool app_quitting );
+
+ // inherited from LLViewerMediaObserver
+ /*virtual*/ void handleMediaEvent( LLPluginClassMedia* self, EMediaEvent event );
+
+ // allow our controlling parent to tell us paramters
+ void setParams( bool specific_sum_requested, const std::string& message, S32 sum );
+
+ // parse and construct URL and set browser to navigate there.
+ void navigateToFinalURL();
+
+ private:
+ LLMediaCtrl* mBrowser;
+ bool mSpecificSumRequested;
+ std::string mMessage;
+ S32 mSum;
+};
+
+#endif // LL_LLFLOATERBUYCURRENCYHTML_H
diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp
index 9b88923e7e..7ca7ace0fc 100644
--- a/indra/newview/llfloaterbuyland.cpp
+++ b/indra/newview/llfloaterbuyland.cpp
@@ -54,6 +54,7 @@
#include "llstatusbar.h"
#include "lltextbox.h"
#include "lltexturectrl.h"
+#include "lltrans.h"
#include "llviewchildren.h"
#include "llviewercontrol.h"
#include "lluictrlfactory.h"
@@ -82,7 +83,10 @@ public:
virtual ~LLFloaterBuyLandUI();
/*virtual*/ void onClose(bool app_quitting);
-
+
+ // Left padding for maturity rating icon.
+ static const S32 ICON_PAD = 2;
+
private:
class SelectionObserver : public LLParcelObserver
{
@@ -501,6 +505,25 @@ void LLFloaterBuyLandUI::updateCovenantInfo()
{
std::string region_name_txt = region->getName() + " ("+rating +")";
region_name->setText(region_name_txt);
+
+ LLIconCtrl* rating_icon = getChild<LLIconCtrl>("rating_icon");
+ LLRect rect = rating_icon->getRect();
+ S32 icon_left_pad = region_name->getRect().mLeft + region_name->getTextBoundingRect().getWidth() + ICON_PAD;
+ rating_icon->setRect(rect.setOriginAndSize(icon_left_pad, rect.mBottom, rect.getWidth(), rect.getHeight()));
+
+ switch(sim_access)
+ {
+ case SIM_ACCESS_PG:
+ rating_icon->setValue(getString("icon_PG"));
+ break;
+
+ case SIM_ACCESS_ADULT:
+ rating_icon->setValue(getString("icon_R"));
+ break;
+
+ default:
+ rating_icon->setValue(getString("icon_M"));
+ }
}
LLTextBox* region_type = getChild<LLTextBox>("region_type_text");
@@ -808,7 +831,7 @@ void LLFloaterBuyLandUI::updateNames()
else
{
mParcelSellerName =
- LLSLURL::buildCommand("agent", parcelp->getOwnerID(), "inspect");
+ LLSLURL("agent", parcelp->getOwnerID(), "inspect").getSLURLString();
}
}
@@ -837,7 +860,7 @@ void LLFloaterBuyLandUI::startTransaction(TransactionType type, const LLXMLRPCVa
static std::string transaction_uri;
if (transaction_uri.empty())
{
- transaction_uri = LLViewerLogin::getInstance()->getHelperURI() + "landtool.php";
+ transaction_uri = LLGridManager::getInstance()->getHelperURI() + "landtool.php";
}
const char* method;
@@ -1150,13 +1173,13 @@ void LLFloaterBuyLandUI::refreshUI()
if (!mParcelValid)
{
- message += getString("no_parcel_selected");
+ message += LLTrans::getString("sentences_separator") + getString("no_parcel_selected");
}
else if (mParcelBillableArea == mParcelActualArea)
{
LLStringUtil::format_map_t string_args;
string_args["[AMOUNT]"] = llformat("%d ", mParcelActualArea);
- message += getString("parcel_meters", string_args);
+ message += LLTrans::getString("sentences_separator") + getString("parcel_meters", string_args);
}
else
{
@@ -1165,13 +1188,13 @@ void LLFloaterBuyLandUI::refreshUI()
{
LLStringUtil::format_map_t string_args;
string_args["[AMOUNT]"] = llformat("%d ", mParcelBillableArea);
- message += getString("premium_land", string_args);
+ message += LLTrans::getString("sentences_separator") + getString("premium_land", string_args);
}
else
{
LLStringUtil::format_map_t string_args;
string_args["[AMOUNT]"] = llformat("%d ", mParcelBillableArea);
- message += getString("discounted_land", string_args);
+ message += LLTrans::getString("sentences_separator") + getString("discounted_land", string_args);
}
}
diff --git a/indra/newview/llfloatercamera.cpp b/indra/newview/llfloatercamera.cpp
index 9496e94780..d6effb2b21 100644
--- a/indra/newview/llfloatercamera.cpp
+++ b/indra/newview/llfloatercamera.cpp
@@ -38,24 +38,31 @@
#include "llfloaterreg.h"
// Viewer includes
+#include "llagentcamera.h"
#include "lljoystickbutton.h"
#include "llviewercontrol.h"
#include "llviewercamera.h"
#include "llbottomtray.h"
-#include "llagent.h"
#include "lltoolmgr.h"
#include "lltoolfocus.h"
#include "llslider.h"
+static LLDefaultChildRegistry::Register<LLPanelCameraItem> r("panel_camera_item");
+
+const F32 NUDGE_TIME = 0.25f; // in seconds
+const F32 ORBIT_NUDGE_RATE = 0.05f; // fraction of normal speed
+
// Constants
const F32 CAMERA_BUTTON_DELAY = 0.0f;
#define ORBIT "cam_rotate_stick"
#define PAN "cam_track_stick"
#define ZOOM "zoom"
-#define PRESETS "camera_presets"
+#define PRESETS "preset_views_list"
#define CONTROLS "controls"
+bool LLFloaterCamera::sFreeCamera = false;
+
// Zoom the camera in and out
class LLPanelCameraZoom
: public LLPanel
@@ -65,20 +72,82 @@ public:
LLPanelCameraZoom();
/* virtual */ BOOL postBuild();
- /* virtual */ void onOpen(const LLSD& key);
+ /* virtual */ void draw();
protected:
void onZoomPlusHeldDown();
void onZoomMinusHeldDown();
void onSliderValueChanged();
+ F32 getOrbitRate(F32 time);
private:
- F32 mSavedSliderVal;
LLButton* mPlusBtn;
LLButton* mMinusBtn;
LLSlider* mSlider;
};
+LLPanelCameraItem::Params::Params()
+: icon_over("icon_over"),
+ icon_selected("icon_selected"),
+ picture("picture"),
+ text("text"),
+ selected_picture("selected_picture"),
+ mousedown_callback("mousedown_callback")
+{
+}
+
+LLPanelCameraItem::LLPanelCameraItem(const LLPanelCameraItem::Params& p)
+: LLPanel(p)
+{
+ LLIconCtrl::Params icon_params = p.picture;
+ mPicture = LLUICtrlFactory::create<LLIconCtrl>(icon_params);
+ addChild(mPicture);
+
+ icon_params = p.icon_over;
+ mIconOver = LLUICtrlFactory::create<LLIconCtrl>(icon_params);
+ addChild(mIconOver);
+
+ icon_params = p.icon_selected;
+ mIconSelected = LLUICtrlFactory::create<LLIconCtrl>(icon_params);
+ addChild(mIconSelected);
+
+ icon_params = p.selected_picture;
+ mPictureSelected = LLUICtrlFactory::create<LLIconCtrl>(icon_params);
+ addChild(mPictureSelected);
+
+ LLTextBox::Params text_params = p.text;
+ mText = LLUICtrlFactory::create<LLTextBox>(text_params);
+ addChild(mText);
+
+ if (p.mousedown_callback.isProvided())
+ {
+ setCommitCallback(initCommitCallback(p.mousedown_callback));
+ }
+}
+
+BOOL LLPanelCameraItem::postBuild()
+{
+ setMouseEnterCallback(boost::bind(&LLPanelCameraItem::childSetVisible, this, "hovered_icon", true));
+ setMouseLeaveCallback(boost::bind(&LLPanelCameraItem::childSetVisible, this, "hovered_icon", false));
+ setMouseDownCallback(boost::bind(&LLPanelCameraItem::onAnyMouseClick, this));
+ setRightMouseDownCallback(boost::bind(&LLPanelCameraItem::onAnyMouseClick, this));
+ return TRUE;
+}
+
+void LLPanelCameraItem::onAnyMouseClick()
+{
+ if (mCommitSignal) (*mCommitSignal)(this, LLSD());
+}
+
+void LLPanelCameraItem::setValue(const LLSD& value)
+{
+ if (!value.isMap()) return;;
+ if (!value.has("selected")) return;
+ childSetVisible("selected_icon", value["selected"]);
+ childSetVisible("picture", !value["selected"]);
+ childSetVisible("selected_picture", value["selected"]);
+}
+
static LLRegisterPanelClassWrapper<LLPanelCameraZoom> t_camera_zoom_panel("camera_zoom_panel");
//-------------------------------------------------------------------------------
@@ -88,11 +157,10 @@ static LLRegisterPanelClassWrapper<LLPanelCameraZoom> t_camera_zoom_panel("camer
LLPanelCameraZoom::LLPanelCameraZoom()
: mPlusBtn( NULL ),
mMinusBtn( NULL ),
- mSlider( NULL ),
- mSavedSliderVal(0.f)
+ mSlider( NULL )
{
- mCommitCallbackRegistrar.add("Zoom.minus", boost::bind(&LLPanelCameraZoom::onZoomPlusHeldDown, this));
- mCommitCallbackRegistrar.add("Zoom.plus", boost::bind(&LLPanelCameraZoom::onZoomMinusHeldDown, this));
+ mCommitCallbackRegistrar.add("Zoom.minus", boost::bind(&LLPanelCameraZoom::onZoomMinusHeldDown, this));
+ mCommitCallbackRegistrar.add("Zoom.plus", boost::bind(&LLPanelCameraZoom::onZoomPlusHeldDown, this));
mCommitCallbackRegistrar.add("Slider.value_changed", boost::bind(&LLPanelCameraZoom::onSliderValueChanged, this));
}
@@ -101,16 +169,13 @@ BOOL LLPanelCameraZoom::postBuild()
mPlusBtn = getChild <LLButton> ("zoom_plus_btn");
mMinusBtn = getChild <LLButton> ("zoom_minus_btn");
mSlider = getChild <LLSlider> ("zoom_slider");
- mSlider->setMinValue(.0f);
- mSlider->setMaxValue(8.f);
return LLPanel::postBuild();
}
-void LLPanelCameraZoom::onOpen(const LLSD& key)
+void LLPanelCameraZoom::draw()
{
- LLVector3d to_focus = gAgent.getPosGlobalFromAgent(LLViewerCamera::getInstance()->getOrigin()) - gAgent.calcFocusPositionTargetGlobal();
- mSavedSliderVal = 8.f - (F32)to_focus.magVec(); // maximum minus current
- mSlider->setValue( mSavedSliderVal );
+ mSlider->setValue(gAgentCamera.getCameraZoomFraction());
+ LLPanel::draw();
}
void LLPanelCameraZoom::onZoomPlusHeldDown()
@@ -118,9 +183,9 @@ void LLPanelCameraZoom::onZoomPlusHeldDown()
F32 val = mSlider->getValueF32();
F32 inc = mSlider->getIncrement();
mSlider->setValue(val - inc);
- // commit only if value changed
- if (val != mSlider->getValueF32())
- mSlider->onCommit();
+ F32 time = mPlusBtn->getHeldDownTime();
+ gAgentCamera.unlockView();
+ gAgentCamera.setOrbitInKey(getOrbitRate(time));
}
void LLPanelCameraZoom::onZoomMinusHeldDown()
@@ -128,20 +193,28 @@ void LLPanelCameraZoom::onZoomMinusHeldDown()
F32 val = mSlider->getValueF32();
F32 inc = mSlider->getIncrement();
mSlider->setValue(val + inc);
- // commit only if value changed
- if (val != mSlider->getValueF32())
- mSlider->onCommit();
+ F32 time = mMinusBtn->getHeldDownTime();
+ gAgentCamera.unlockView();
+ gAgentCamera.setOrbitOutKey(getOrbitRate(time));
}
-void LLPanelCameraZoom::onSliderValueChanged()
+F32 LLPanelCameraZoom::getOrbitRate(F32 time)
{
- F32 val = mSlider->getValueF32();
- F32 rate = val - mSavedSliderVal;
-
- gAgent.unlockView();
- gAgent.cameraOrbitIn(rate);
+ if( time < NUDGE_TIME )
+ {
+ F32 rate = ORBIT_NUDGE_RATE + time * (1 - ORBIT_NUDGE_RATE)/ NUDGE_TIME;
+ return rate;
+ }
+ else
+ {
+ return 1;
+ }
+}
- mSavedSliderVal = val;
+void LLPanelCameraZoom::onSliderValueChanged()
+{
+ F32 zoom_level = mSlider->getValueF32();
+ gAgentCamera.setCameraZoomFraction(zoom_level);
}
void activate_camera_tool()
@@ -156,23 +229,18 @@ void activate_camera_tool()
/*static*/ bool LLFloaterCamera::inFreeCameraMode()
{
LLFloaterCamera* floater_camera = LLFloaterCamera::findInstance();
- if (floater_camera && floater_camera->mCurrMode == CAMERA_CTRL_MODE_FREE_CAMERA && gAgent.getCameraMode() != CAMERA_MODE_MOUSELOOK)
+ if (floater_camera && floater_camera->mCurrMode == CAMERA_CTRL_MODE_FREE_CAMERA && gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK)
{
return true;
}
return false;
}
-bool LLFloaterCamera::inAvatarViewMode()
-{
- return mCurrMode == CAMERA_CTRL_MODE_AVATAR_VIEW;
-}
-
void LLFloaterCamera::resetCameraMode()
{
LLFloaterCamera* floater_camera = LLFloaterCamera::findInstance();
if (!floater_camera) return;
- floater_camera->switchMode(CAMERA_CTRL_MODE_ORBIT);
+ floater_camera->switchMode(CAMERA_CTRL_MODE_PAN);
}
void LLFloaterCamera::update()
@@ -190,9 +258,13 @@ void LLFloaterCamera::toPrevMode()
/*static*/ void LLFloaterCamera::onLeavingMouseLook()
{
LLFloaterCamera* floater_camera = LLFloaterCamera::findInstance();
- if (floater_camera && floater_camera->inFreeCameraMode())
+ if (floater_camera)
{
- activate_camera_tool();
+ floater_camera->updateItemsSelection();
+ if(floater_camera->inFreeCameraMode())
+ {
+ activate_camera_tool();
+ }
}
}
@@ -226,24 +298,24 @@ void LLFloaterCamera::onClose(bool app_quitting)
//We don't care of camera mode if app is quitting
if(app_quitting)
return;
- // When mCurrMode is in CAMERA_CTRL_MODE_ORBIT
+ // When mCurrMode is in CAMERA_CTRL_MODE_PAN
// switchMode won't modify mPrevMode, so force it here.
// It is needed to correctly return to previous mode on open, see EXT-2727.
- if (mCurrMode == CAMERA_CTRL_MODE_ORBIT)
- mPrevMode = CAMERA_CTRL_MODE_ORBIT;
+ if (mCurrMode == CAMERA_CTRL_MODE_PAN)
+ mPrevMode = CAMERA_CTRL_MODE_PAN;
// HACK: Should always close as docked to prevent toggleInstance without calling onOpen.
if ( !isDocked() )
setDocked(true);
- switchMode(CAMERA_CTRL_MODE_ORBIT);
+ switchMode(CAMERA_CTRL_MODE_PAN);
mClosed = TRUE;
}
LLFloaterCamera::LLFloaterCamera(const LLSD& val)
: LLTransientDockableFloater(NULL, true, val),
mClosed(FALSE),
- mCurrMode(CAMERA_CTRL_MODE_ORBIT),
- mPrevMode(CAMERA_CTRL_MODE_ORBIT)
+ mCurrMode(CAMERA_CTRL_MODE_PAN),
+ mPrevMode(CAMERA_CTRL_MODE_PAN)
{
}
@@ -251,21 +323,38 @@ LLFloaterCamera::LLFloaterCamera(const LLSD& val)
BOOL LLFloaterCamera::postBuild()
{
setIsChrome(TRUE);
+ setTitleVisible(TRUE); // restore title visibility after chrome applying
mRotate = getChild<LLJoystickCameraRotate>(ORBIT);
mZoom = getChild<LLPanelCameraZoom>(ZOOM);
mTrack = getChild<LLJoystickCameraTrack>(PAN);
- assignButton2Mode(CAMERA_CTRL_MODE_ORBIT, "orbit_btn");
+ assignButton2Mode(CAMERA_CTRL_MODE_MODES, "avatarview_btn");
assignButton2Mode(CAMERA_CTRL_MODE_PAN, "pan_btn");
- assignButton2Mode(CAMERA_CTRL_MODE_FREE_CAMERA, "freecamera_btn");
- assignButton2Mode(CAMERA_CTRL_MODE_AVATAR_VIEW, "avatarview_btn");
+ assignButton2Mode(CAMERA_CTRL_MODE_PRESETS, "presets_btn");
update();
return LLDockableFloater::postBuild();
}
+void LLFloaterCamera::fillFlatlistFromPanel (LLFlatListView* list, LLPanel* panel)
+{
+ // copying child list and then iterating over a copy, because list itself
+ // is changed in process
+ const child_list_t child_list = *panel->getChildList();
+ child_list_t::const_reverse_iterator iter = child_list.rbegin();
+ child_list_t::const_reverse_iterator end = child_list.rend();
+ for ( ; iter != end; ++iter)
+ {
+ LLView* view = *iter;
+ LLPanel* item = dynamic_cast<LLPanel*>(view);
+ if (panel)
+ list->addItem(item);
+ }
+
+}
+
ECameraControlMode LLFloaterCamera::determineMode()
{
LLTool* curr_tool = LLToolMgr::getInstance()->getCurrentTool();
@@ -274,12 +363,12 @@ ECameraControlMode LLFloaterCamera::determineMode()
return CAMERA_CTRL_MODE_FREE_CAMERA;
}
- if (gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK)
+ if (gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK)
{
- return CAMERA_CTRL_MODE_AVATAR_VIEW;
+ return CAMERA_CTRL_MODE_PRESETS;
}
- return CAMERA_CTRL_MODE_ORBIT;
+ return CAMERA_CTRL_MODE_PAN;
}
@@ -305,25 +394,54 @@ void LLFloaterCamera::setMode(ECameraControlMode mode)
updateState();
}
+void LLFloaterCamera::setModeTitle(const ECameraControlMode mode)
+{
+ std::string title;
+ switch(mode)
+ {
+ case CAMERA_CTRL_MODE_MODES:
+ title = getString("camera_modes_title");
+ break;
+ case CAMERA_CTRL_MODE_PAN:
+ title = getString("pan_mode_title");
+ break;
+ case CAMERA_CTRL_MODE_PRESETS:
+ title = getString("presets_mode_title");
+ break;
+ default:
+ break;
+ }
+ setTitle(title);
+}
+
void LLFloaterCamera::switchMode(ECameraControlMode mode)
{
setMode(mode);
switch (mode)
{
- case CAMERA_CTRL_MODE_ORBIT:
- clear_camera_tool();
+ case CAMERA_CTRL_MODE_MODES:
+ if(sFreeCamera)
+ {
+ switchMode(CAMERA_CTRL_MODE_FREE_CAMERA);
+ }
break;
case CAMERA_CTRL_MODE_PAN:
+ sFreeCamera = false;
clear_camera_tool();
break;
case CAMERA_CTRL_MODE_FREE_CAMERA:
+ sFreeCamera = true;
activate_camera_tool();
break;
- case CAMERA_CTRL_MODE_AVATAR_VIEW:
+ case CAMERA_CTRL_MODE_PRESETS:
+ if(sFreeCamera)
+ {
+ switchMode(CAMERA_CTRL_MODE_FREE_CAMERA);
+ }
break;
default:
@@ -352,67 +470,98 @@ void LLFloaterCamera::assignButton2Mode(ECameraControlMode mode, const std::stri
void LLFloaterCamera::updateState()
{
+ childSetVisible(ZOOM, CAMERA_CTRL_MODE_PAN == mCurrMode);
+
+ bool show_presets = (CAMERA_CTRL_MODE_PRESETS == mCurrMode) || (CAMERA_CTRL_MODE_FREE_CAMERA == mCurrMode
+ && CAMERA_CTRL_MODE_PRESETS == mPrevMode);
+ childSetVisible(PRESETS, show_presets);
+
+ bool show_camera_modes = CAMERA_CTRL_MODE_MODES == mCurrMode || (CAMERA_CTRL_MODE_FREE_CAMERA == mCurrMode
+ && CAMERA_CTRL_MODE_MODES == mPrevMode);
+ childSetVisible("camera_modes_list", show_camera_modes);
+
+ updateItemsSelection();
+
+ if (CAMERA_CTRL_MODE_FREE_CAMERA == mCurrMode)
+ {
+ return;
+ }
+
//updating buttons
std::map<ECameraControlMode, LLButton*>::const_iterator iter = mMode2Button.begin();
for (; iter != mMode2Button.end(); ++iter)
{
iter->second->setToggleState(iter->first == mCurrMode);
}
+ setModeTitle(mCurrMode);
+}
- childSetVisible(ORBIT, CAMERA_CTRL_MODE_ORBIT == mCurrMode);
- childSetVisible(PAN, CAMERA_CTRL_MODE_PAN == mCurrMode);
- childSetVisible(ZOOM, CAMERA_CTRL_MODE_AVATAR_VIEW != mCurrMode);
- childSetVisible(PRESETS, CAMERA_CTRL_MODE_AVATAR_VIEW == mCurrMode);
-
- //hiding or showing the panel with controls by reshaping the floater
- bool showControls = CAMERA_CTRL_MODE_FREE_CAMERA != mCurrMode;
- if (showControls == childIsVisible(CONTROLS)) return;
+void LLFloaterCamera::updateItemsSelection()
+{
+ ECameraPreset preset = (ECameraPreset) gSavedSettings.getU32("CameraPreset");
+ LLSD argument;
+ argument["selected"] = preset == CAMERA_PRESET_REAR_VIEW;
+ getChild<LLPanelCameraItem>("rear_view")->setValue(argument);
+ argument["selected"] = preset == CAMERA_PRESET_GROUP_VIEW;
+ getChild<LLPanelCameraItem>("group_view")->setValue(argument);
+ argument["selected"] = preset == CAMERA_PRESET_FRONT_VIEW;
+ getChild<LLPanelCameraItem>("front_view")->setValue(argument);
+ argument["selected"] = gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK;
+ getChild<LLPanelCameraItem>("mouselook_view")->setValue(argument);
+ argument["selected"] = mCurrMode == CAMERA_CTRL_MODE_FREE_CAMERA;
+ getChild<LLPanelCameraItem>("object_view")->setValue(argument);
+}
- childSetVisible(CONTROLS, showControls);
+void LLFloaterCamera::onClickCameraItem(const LLSD& param)
+{
+ std::string name = param.asString();
- LLRect rect = getRect();
- LLRect controls_rect;
- if (childGetRect(CONTROLS, controls_rect))
+ if ("mouselook_view" == name)
{
- S32 floater_header_size = getHeaderHeight();
- S32 height = controls_rect.getHeight() - floater_header_size;
- S32 newHeight = rect.getHeight();
-
- if (showControls)
- {
- newHeight += height;
- }
- else
- {
- newHeight -= height;
- }
-
- rect.setOriginAndSize(rect.mLeft, rect.mBottom, rect.getWidth(), newHeight);
- reshape(rect.getWidth(), rect.getHeight());
- setRect(rect);
+ gAgentCamera.changeCameraToMouselook();
+ }
+ else if ("object_view" == name)
+ {
+ LLFloaterCamera* camera_floater = LLFloaterCamera::findInstance();
+ if (camera_floater)
+ camera_floater->switchMode(CAMERA_CTRL_MODE_FREE_CAMERA);
+ }
+ else
+ {
+ switchToPreset(name);
+ }
+ LLFloaterCamera* camera_floater = LLFloaterCamera::findInstance();
+ if (camera_floater)
+ {
+ camera_floater->updateItemsSelection();
+ camera_floater->fromFreeToPresets();
}
}
-void LLFloaterCamera::onClickCameraPresets(const LLSD& param)
+/*static*/
+void LLFloaterCamera::switchToPreset(const std::string& name)
{
- std::string name = param.asString();
-
+ sFreeCamera = false;
+ clear_camera_tool();
if ("rear_view" == name)
{
- gAgent.switchCameraPreset(CAMERA_PRESET_REAR_VIEW);
+ gAgentCamera.switchCameraPreset(CAMERA_PRESET_REAR_VIEW);
}
else if ("group_view" == name)
{
- gAgent.switchCameraPreset(CAMERA_PRESET_GROUP_VIEW);
+ gAgentCamera.switchCameraPreset(CAMERA_PRESET_GROUP_VIEW);
}
else if ("front_view" == name)
{
- gAgent.switchCameraPreset(CAMERA_PRESET_FRONT_VIEW);
+ gAgentCamera.switchCameraPreset(CAMERA_PRESET_FRONT_VIEW);
}
- else if ("mouselook_view" == name)
+}
+
+void LLFloaterCamera::fromFreeToPresets()
+{
+ if (!sFreeCamera && mCurrMode == CAMERA_CTRL_MODE_FREE_CAMERA && mPrevMode == CAMERA_CTRL_MODE_PRESETS)
{
- gAgent.changeCameraToMouselook();
+ switchMode(CAMERA_CTRL_MODE_PRESETS);
}
-
}
diff --git a/indra/newview/llfloatercamera.h b/indra/newview/llfloatercamera.h
index 45d5e9a845..564e38d02d 100644
--- a/indra/newview/llfloatercamera.h
+++ b/indra/newview/llfloatercamera.h
@@ -34,19 +34,21 @@
#define LLFLOATERCAMERA_H
#include "lltransientdockablefloater.h"
+#include "lliconctrl.h"
+#include "lltextbox.h"
+#include "llflatlistview.h"
class LLJoystickCameraRotate;
-class LLJoystickCameraZoom;
class LLJoystickCameraTrack;
class LLFloaterReg;
class LLPanelCameraZoom;
enum ECameraControlMode
{
- CAMERA_CTRL_MODE_ORBIT,
+ CAMERA_CTRL_MODE_MODES,
CAMERA_CTRL_MODE_PAN,
CAMERA_CTRL_MODE_FREE_CAMERA,
- CAMERA_CTRL_MODE_AVATAR_VIEW
+ CAMERA_CTRL_MODE_PRESETS
};
class LLFloaterCamera
@@ -58,8 +60,8 @@ public:
/* whether in free camera mode */
static bool inFreeCameraMode();
- /* callback for camera presets changing */
- static void onClickCameraPresets(const LLSD& param);
+ /* callback for camera items selection changing */
+ static void onClickCameraItem(const LLSD& param);
static void onLeavingMouseLook();
@@ -68,7 +70,14 @@ public:
/* determines actual mode and updates ui */
void update();
-
+
+ /*switch to one of the camera presets (front, rear, side)*/
+ static void switchToPreset(const std::string& name);
+
+ /* move to CAMERA_CTRL_MODE_PRESETS from CAMERA_CTRL_MODE_FREE_CAMERA if we are on presets panel and
+ are not in free camera mode*/
+ void fromFreeToPresets();
+
virtual void onOpen(const LLSD& key);
virtual void onClose(bool app_quitting);
@@ -88,9 +97,6 @@ private:
ECameraControlMode determineMode();
- /* whether in avatar view (first person) mode */
- bool inAvatarViewMode();
-
/* resets to the previous mode */
void toPrevMode();
@@ -100,18 +106,65 @@ private:
/* sets a new mode preserving previous one and updates ui*/
void setMode(ECameraControlMode mode);
+ /** set title appropriate to passed mode */
+ void setModeTitle(const ECameraControlMode mode);
+
/* updates the state (UI) according to the current mode */
void updateState();
+ /* update camera modes items selection and camera preset items selection according to the currently selected preset */
+ void updateItemsSelection();
+
void onClickBtn(ECameraControlMode mode);
void assignButton2Mode(ECameraControlMode mode, const std::string& button_name);
+ // fills flatlist with items from given panel
+ void fillFlatlistFromPanel (LLFlatListView* list, LLPanel* panel);
+ // set to true when free camera mode is selected in modes list
+ // remains true until preset camera mode is chosen, or pan button is clicked, or escape pressed
+ static bool sFreeCamera;
BOOL mClosed;
ECameraControlMode mPrevMode;
ECameraControlMode mCurrMode;
std::map<ECameraControlMode, LLButton*> mMode2Button;
+};
+/**
+ * Class used to represent widgets from panel_camera_item.xml-
+ * panels that contain pictures and text. Pictures are different
+ * for selected and unselected state (this state is nor stored- icons
+ * are changed in setValue()). This class doesn't implement selection logic-
+ * it's items are used inside of flatlist.
+ */
+class LLPanelCameraItem
+ : public LLPanel
+{
+public:
+ struct Params : public LLInitParam::Block<Params, LLPanel::Params>
+ {
+ Optional<LLIconCtrl::Params> icon_over;
+ Optional<LLIconCtrl::Params> icon_selected;
+ Optional<LLIconCtrl::Params> picture;
+ Optional<LLIconCtrl::Params> selected_picture;
+
+ Optional<LLTextBox::Params> text;
+ Optional<CommitCallbackParam> mousedown_callback;
+ Params();
+ };
+ /*virtual*/ BOOL postBuild();
+ /** setting on/off background icon to indicate selected state */
+ /*virtual*/ void setValue(const LLSD& value);
+ // sends commit signal
+ void onAnyMouseClick();
+protected:
+ friend class LLUICtrlFactory;
+ LLPanelCameraItem(const Params&);
+ LLIconCtrl* mIconOver;
+ LLIconCtrl* mIconSelected;
+ LLIconCtrl* mPicture;
+ LLIconCtrl* mPictureSelected;
+ LLTextBox* mText;
};
#endif
diff --git a/indra/newview/llfloaterchat.cpp b/indra/newview/llfloaterchat.cpp
index cdb9b8edb8..882d12f68e 100644
--- a/indra/newview/llfloaterchat.cpp
+++ b/indra/newview/llfloaterchat.cpp
@@ -166,7 +166,7 @@ void add_timestamped_line(LLViewerTextEditor* edit, LLChat chat, const LLColor4&
if (chat.mSourceType == CHAT_SOURCE_AGENT &&
chat.mFromID != LLUUID::null)
{
- chat.mURL = LLSLURL::buildCommand("agent", chat.mFromID, "inspect");
+ chat.mURL = LLSLURL("agent", chat.mFromID, "inspect").getSLURLString();
}
// If the chat line has an associated url, link it up to the name.
diff --git a/indra/newview/llfloaterchatterbox.cpp b/indra/newview/llfloaterchatterbox.cpp
index 774caaec90..a15cef7ea4 100644
--- a/indra/newview/llfloaterchatterbox.cpp
+++ b/indra/newview/llfloaterchatterbox.cpp
@@ -318,7 +318,7 @@ LLFloaterChatterBox* LLFloaterChatterBox::getInstance()
//static
LLFloater* LLFloaterChatterBox::getCurrentVoiceFloater()
{
- if (!LLVoiceClient::voiceEnabled())
+ if (!LLVoiceClient::getInstance()->voiceEnabled())
{
return NULL;
}
diff --git a/indra/newview/llfloaterevent.cpp b/indra/newview/llfloaterevent.cpp
new file mode 100644
index 0000000000..f6cffd4b14
--- /dev/null
+++ b/indra/newview/llfloaterevent.cpp
@@ -0,0 +1,356 @@
+/**
+ * @file llfloaterevent.cpp
+ * @brief Display for events in the finder
+ *
+ * $LicenseInfo:firstyear=2004&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloaterevent.h"
+
+#include "message.h"
+#include "llnotificationsutil.h"
+#include "llui.h"
+
+#include "llagent.h"
+#include "llviewerwindow.h"
+#include "llbutton.h"
+#include "llcachename.h"
+#include "llcommandhandler.h" // secondlife:///app/chat/ support
+#include "lleventflags.h"
+#include "lleventnotifier.h"
+#include "llexpandabletextbox.h"
+#include "llfloater.h"
+#include "llfloaterreg.h"
+#include "llfloaterworldmap.h"
+#include "llinventorymodel.h"
+#include "llsecondlifeurls.h"
+#include "llslurl.h"
+#include "lltextbox.h"
+#include "lltexteditor.h"
+#include "lluiconstants.h"
+#include "llviewercontrol.h"
+#include "llweb.h"
+#include "llworldmap.h"
+#include "llworldmapmessage.h"
+#include "lluictrlfactory.h"
+#include "lltrans.h"
+
+
+class LLEventHandler : public LLCommandHandler
+{
+public:
+ // requires trusted browser to trigger
+ LLEventHandler() : LLCommandHandler("event", UNTRUSTED_THROTTLE) { }
+ bool handle(const LLSD& params, const LLSD& query_map,
+ LLMediaCtrl* web)
+ {
+ if (params.size() < 1)
+ {
+ return false;
+ }
+
+ LLFloaterEvent* floater = LLFloaterReg::getTypedInstance<LLFloaterEvent>("event");
+ if (floater)
+ {
+ floater->setEventID(params[0].asInteger());
+ LLFloaterReg::showTypedInstance<LLFloaterEvent>("event");
+ return true;
+ }
+
+ return false;
+ }
+};
+LLEventHandler gEventHandler;
+
+LLFloaterEvent::LLFloaterEvent(const LLSD& key)
+ : LLFloater(key),
+
+ mEventID(0)
+{
+}
+
+
+LLFloaterEvent::~LLFloaterEvent()
+{
+}
+
+
+BOOL LLFloaterEvent::postBuild()
+{
+ mTBName = getChild<LLTextBox>("event_name");
+
+ mTBCategory = getChild<LLTextBox>("event_category");
+
+ mTBDate = getChild<LLTextBox>("event_date");
+
+ mTBDuration = getChild<LLTextBox>("event_duration");
+
+ mTBDesc = getChild<LLExpandableTextBox>("event_desc");
+
+ mTBRunBy = getChild<LLTextBox>("event_runby");
+ mTBLocation = getChild<LLTextBox>("event_location");
+ mTBCover = getChild<LLTextBox>("event_cover");
+
+ mTeleportBtn = getChild<LLButton>( "teleport_btn");
+ mTeleportBtn->setClickedCallback(onClickTeleport, this);
+
+ mMapBtn = getChild<LLButton>( "map_btn");
+ mMapBtn->setClickedCallback(onClickMap, this);
+
+ mNotifyBtn = getChild<LLButton>( "notify_btn");
+ mNotifyBtn->setClickedCallback(onClickNotify, this);
+
+ mCreateEventBtn = getChild<LLButton>( "create_event_btn");
+ mCreateEventBtn->setClickedCallback(onClickCreateEvent, this);
+
+ mGodDeleteEventBtn = getChild<LLButton>( "god_delete_event_btn");
+ mGodDeleteEventBtn->setClickedCallback(boost::bind(&LLFloaterEvent::onClickDeleteEvent, this));
+
+ return TRUE;
+}
+
+void LLFloaterEvent::setEventID(const U32 event_id)
+{
+ mEventID = event_id;
+ // Should reset all of the panel state here
+ resetInfo();
+
+ if (event_id != 0)
+ {
+ sendEventInfoRequest();
+ }
+}
+
+void LLFloaterEvent::onClickDeleteEvent()
+{
+ LLMessageSystem* msg = gMessageSystem;
+
+ msg->newMessageFast(_PREHASH_EventGodDelete);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+
+ msg->nextBlockFast(_PREHASH_EventData);
+ msg->addU32Fast(_PREHASH_EventID, mEventID);
+
+ gAgent.sendReliableMessage();
+}
+
+void LLFloaterEvent::sendEventInfoRequest()
+{
+ LLMessageSystem *msg = gMessageSystem;
+
+ msg->newMessageFast(_PREHASH_EventInfoRequest);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID() );
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID() );
+ msg->nextBlockFast(_PREHASH_EventData);
+ msg->addU32Fast(_PREHASH_EventID, mEventID);
+ gAgent.sendReliableMessage();
+}
+
+//static
+void LLFloaterEvent::processEventInfoReply(LLMessageSystem *msg, void **)
+{
+ // extract the agent id
+ LLUUID agent_id;
+ msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_AgentID, agent_id );
+
+ LLFloaterEvent* floater = LLFloaterReg::getTypedInstance<LLFloaterEvent>("event");
+
+ if(floater)
+ {
+ floater->mEventInfo.unpack(msg);
+ floater->mTBName->setText(floater->mEventInfo.mName);
+ floater->mTBCategory->setText(floater->mEventInfo.mCategoryStr);
+ floater->mTBDate->setText(floater->mEventInfo.mTimeStr);
+ floater->mTBDesc->setText(floater->mEventInfo.mDesc);
+ floater->mTBRunBy->setText(LLSLURL("agent", floater->mEventInfo.mRunByID, "inspect").getSLURLString());
+
+ floater->mTBDuration->setText(llformat("%d:%.2d", floater->mEventInfo.mDuration / 60, floater->mEventInfo.mDuration % 60));
+
+ if (!floater->mEventInfo.mHasCover)
+ {
+ floater->mTBCover->setText(floater->getString("none"));
+ }
+ else
+ {
+ floater->mTBCover->setText(llformat("%d", floater->mEventInfo.mCover));
+ }
+
+ F32 global_x = (F32)floater->mEventInfo.mPosGlobal.mdV[VX];
+ F32 global_y = (F32)floater->mEventInfo.mPosGlobal.mdV[VY];
+
+ S32 region_x = llround(global_x) % REGION_WIDTH_UNITS;
+ S32 region_y = llround(global_y) % REGION_WIDTH_UNITS;
+ S32 region_z = llround((F32)floater->mEventInfo.mPosGlobal.mdV[VZ]);
+
+ std::string desc = floater->mEventInfo.mSimName + llformat(" (%d, %d, %d)", region_x, region_y, region_z);
+ floater->mTBLocation->setText(desc);
+
+ floater->childSetVisible("rating_icon_m", FALSE);
+ floater->childSetVisible("rating_icon_r", FALSE);
+ floater->childSetVisible("rating_icon_pg", FALSE);
+ floater->childSetValue("rating_value", floater->getString("unknown"));
+
+ //for some reason there's not adult flags for now, so see if region is adult and then
+ //set flags
+ LLWorldMapMessage::url_callback_t cb = boost::bind( &regionInfoCallback, floater->mEventInfo.mID, _1);
+ LLWorldMapMessage::getInstance()->sendNamedRegionRequest(floater->mEventInfo.mSimName, cb, std::string("unused"), false);
+
+ if (floater->mEventInfo.mUnixTime < time_corrected())
+ {
+ floater->mNotifyBtn->setEnabled(FALSE);
+ }
+ else
+ {
+ floater->mNotifyBtn->setEnabled(TRUE);
+ }
+
+ if (gEventNotifier.hasNotification(floater->mEventInfo.mID))
+ {
+ floater->mNotifyBtn->setLabel(floater->getString("dont_notify"));
+ }
+ else
+ {
+ floater->mNotifyBtn->setLabel(floater->getString("notify"));
+ }
+
+ floater->mMapBtn->setEnabled(TRUE);
+ floater->mTeleportBtn->setEnabled(TRUE);
+ }
+}
+
+//static
+void LLFloaterEvent::regionInfoCallback(U32 event_id, U64 region_handle)
+{
+ LLSimInfo* sim_info = LLWorldMap::getInstance()->simInfoFromHandle(region_handle);
+ LLFloaterEvent* floater = LLFloaterReg::getTypedInstance<LLFloaterEvent>("event");
+
+ if (sim_info && floater && (event_id == floater->getEventID()))
+ {
+ // update the event with the maturity info
+ if (sim_info->isAdult())
+ {
+ floater->childSetVisible("rating_icon_m", FALSE);
+ floater->childSetVisible("rating_icon_r", TRUE);
+ floater->childSetVisible("rating_icon_pg", FALSE);
+ floater->childSetValue("rating_value", floater->getString("adult"));
+
+ }
+ else if (floater->mEventInfo.mEventFlags & EVENT_FLAG_MATURE)
+ {
+ floater->childSetVisible("rating_icon_m", TRUE);
+ floater->childSetVisible("rating_icon_r", FALSE);
+ floater->childSetVisible("rating_icon_pg", FALSE);
+ floater->childSetValue("rating_value", floater->getString("moderate"));
+ }
+ else
+ {
+ floater->childSetVisible("rating_icon_m", FALSE);
+ floater->childSetVisible("rating_icon_r", FALSE);
+ floater->childSetVisible("rating_icon_pg", TRUE);
+ floater->childSetValue("rating_value", floater->getString("general"));
+ }
+ }
+}
+
+void LLFloaterEvent::draw()
+{
+ mGodDeleteEventBtn->setVisible(gAgent.isGodlike());
+
+ LLPanel::draw();
+}
+
+void LLFloaterEvent::resetInfo()
+{
+ mTBName->setText(LLStringUtil::null);
+ mTBCategory->setText(LLStringUtil::null);
+ mTBDate->setText(LLStringUtil::null);
+ mTBDesc->setText(LLStringUtil::null);
+ mTBDuration->setText(LLStringUtil::null);
+ mTBCover->setText(LLStringUtil::null);
+ mTBLocation->setText(LLStringUtil::null);
+ mTBRunBy->setText(LLStringUtil::null);
+ mNotifyBtn->setEnabled(FALSE);
+ mMapBtn->setEnabled(FALSE);
+ mTeleportBtn->setEnabled(FALSE);
+}
+
+// static
+void LLFloaterEvent::onClickTeleport(void* data)
+{
+ LLFloaterEvent* self = (LLFloaterEvent*)data;
+ LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance();
+ if (!self->mEventInfo.mPosGlobal.isExactlyZero()&&worldmap_instance)
+ {
+ gAgent.teleportViaLocation(self->mEventInfo.mPosGlobal);
+ worldmap_instance->trackLocation(self->mEventInfo.mPosGlobal);
+ }
+}
+
+
+// static
+void LLFloaterEvent::onClickMap(void* data)
+{
+ LLFloaterEvent* self = (LLFloaterEvent*)data;
+ LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance();
+
+ if (!self->mEventInfo.mPosGlobal.isExactlyZero()&&worldmap_instance)
+ {
+ worldmap_instance->trackLocation(self->mEventInfo.mPosGlobal);
+ LLFloaterReg::showInstance("world_map", "center");
+ }
+}
+
+
+// static
+void LLFloaterEvent::onClickCreateEvent(void* data)
+{
+ LLNotificationsUtil::add("PromptGoToEventsPage");//, LLSD(), LLSD(), callbackCreateEventWebPage);
+}
+
+
+// static
+void LLFloaterEvent::onClickNotify(void *data)
+{
+ LLFloaterEvent* self = (LLFloaterEvent*)data;
+
+ if (!gEventNotifier.hasNotification(self->mEventID))
+ {
+ gEventNotifier.add(self->mEventInfo);
+ self->mNotifyBtn->setLabel(self->getString("dont_notify"));
+ }
+ else
+ {
+ gEventNotifier.remove(self->mEventInfo.mID);
+ self->mNotifyBtn->setLabel(self->getString("notify"));
+ }
+}
diff --git a/indra/newview/llfloaterevent.h b/indra/newview/llfloaterevent.h
new file mode 100644
index 0000000000..4126236964
--- /dev/null
+++ b/indra/newview/llfloaterevent.h
@@ -0,0 +1,97 @@
+/**
+ * @file llfloaterevent.h
+ * @brief Display for events in the finder
+ *
+ * $LicenseInfo:firstyear=2004&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATEREVENT_H
+#define LL_LLFLOATEREVENT_H
+
+#include "llfloater.h"
+#include "lleventinfo.h"
+#include "lluuid.h"
+#include "v3dmath.h"
+
+class LLTextBox;
+class LLTextEditor;
+class LLButton;
+class LLExpandableTextBox;
+class LLMessageSystem;
+
+class LLFloaterEvent : public LLFloater
+{
+public:
+ LLFloaterEvent(const LLSD& key);
+ /*virtual*/ ~LLFloaterEvent();
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void draw();
+
+ void setEventID(const U32 event_id);
+ void sendEventInfoRequest();
+
+ static void processEventInfoReply(LLMessageSystem *msg, void **);
+
+ U32 getEventID() { return mEventID; }
+
+protected:
+ void resetInfo();
+
+ static void onClickTeleport(void*);
+ static void onClickMap(void*);
+ //static void onClickLandmark(void*);
+ static void onClickCreateEvent(void*);
+ static void onClickNotify(void*);
+ void onClickDeleteEvent();
+
+ static void regionInfoCallback(U32 event_id, U64 region_handle);
+
+
+protected:
+ U32 mEventID;
+ LLEventInfo mEventInfo;
+
+ LLTextBox* mTBName;
+ LLTextBox* mTBCategory;
+ LLTextBox* mTBDate;
+ LLTextBox* mTBDuration;
+ LLExpandableTextBox* mTBDesc;
+
+ LLTextBox* mTBRunBy;
+ LLTextBox* mTBLocation;
+ LLTextBox* mTBCover;
+
+ LLButton* mTeleportBtn;
+ LLButton* mMapBtn;
+ LLButton* mCreateEventBtn;
+ LLButton* mGodDeleteEventBtn;
+ LLButton* mNotifyBtn;
+};
+
+#endif // LL_LLFLOATEREVENT_H
diff --git a/indra/newview/llfloaterfriends.cpp b/indra/newview/llfloaterfriends.cpp
index ccc5cab85a..4e2633d750 100644
--- a/indra/newview/llfloaterfriends.cpp
+++ b/indra/newview/llfloaterfriends.cpp
@@ -58,7 +58,7 @@
#include "llmenucommands.h"
#include "llviewercontrol.h"
#include "llviewermessage.h"
-#include "lltimer.h"
+#include "lleventtimer.h"
#include "lltextbox.h"
#include "llvoiceclient.h"
diff --git a/indra/newview/llfloatergesture.cpp b/indra/newview/llfloatergesture.cpp
index b684e1f985..eff7131145 100644
--- a/indra/newview/llfloatergesture.cpp
+++ b/indra/newview/llfloatergesture.cpp
@@ -36,6 +36,7 @@
#include "llinventory.h"
#include "llinventorybridge.h"
+#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
#include "llinventoryclipboard.h"
@@ -106,7 +107,7 @@ LLFloaterGesture::LLFloaterGesture(const LLSD& key)
: LLFloater(key)
{
mObserver = new LLFloaterGestureObserver(this);
- LLGestureManager::instance().addObserver(mObserver);
+ LLGestureMgr::instance().addObserver(mObserver);
mCommitCallbackRegistrar.add("Gesture.Action.ToogleActiveState", boost::bind(&LLFloaterGesture::onActivateBtnClick, this));
mCommitCallbackRegistrar.add("Gesture.Action.ShowPreview", boost::bind(&LLFloaterGesture::onClickEdit, this));
@@ -125,7 +126,7 @@ void LLFloaterGesture::done()
// we load only gesture folder without childred.
LLInventoryModel::cat_array_t* categories;
LLInventoryModel::item_array_t* items;
- LLInventoryFetchDescendentsObserver::folder_ref_t unloaded_folders;
+ uuid_vec_t unloaded_folders;
LL_DEBUGS("Gesture")<< "Get subdirs of Gesture Folder...." << LL_ENDL;
gInventory.getDirectDescendentsOf(mGestureFolderID, categories, items);
if (categories->empty())
@@ -147,7 +148,8 @@ void LLFloaterGesture::done()
if (!unloaded_folders.empty())
{
LL_DEBUGS("Gesture")<< "Fetching subdirectories....." << LL_ENDL;
- fetchDescendents(unloaded_folders);
+ setFetchIDs(unloaded_folders);
+ startFetch();
}
else
{
@@ -165,7 +167,7 @@ void LLFloaterGesture::done()
// virtual
LLFloaterGesture::~LLFloaterGesture()
{
- LLGestureManager::instance().removeObserver(mObserver);
+ LLGestureMgr::instance().removeObserver(mObserver);
delete mObserver;
mObserver = NULL;
gInventory.removeObserver(this);
@@ -197,18 +199,19 @@ BOOL LLFloaterGesture::postBuild()
setDefaultBtn("play_btn");
mGestureFolderID = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE, false);
- folder_ref_t folders;
+ uuid_vec_t folders;
folders.push_back(mGestureFolderID);
//perform loading Gesture directory anyway to make sure that all subdirectory are loaded too. See method done() for details.
gInventory.addObserver(this);
- fetchDescendents(folders);
-
- buildGestureList();
-
- mGestureList->setFocus(TRUE);
+ setFetchIDs(folders);
+ startFetch();
if (mGestureList)
{
+ buildGestureList();
+
+ mGestureList->setFocus(TRUE);
+
const BOOL ascending = TRUE;
mGestureList->sortByColumn(std::string("name"), ascending);
mGestureList->selectFirstItem();
@@ -223,10 +226,10 @@ BOOL LLFloaterGesture::postBuild()
void LLFloaterGesture::refreshAll()
{
- buildGestureList();
-
if (!mGestureList) return;
+ buildGestureList();
+
if (mSelectedID.isNull())
{
mGestureList->selectFirstItem();
@@ -246,13 +249,13 @@ void LLFloaterGesture::refreshAll()
void LLFloaterGesture::buildGestureList()
{
S32 scroll_pos = mGestureList->getScrollPos();
- std::vector<LLUUID> selected_items;
+ uuid_vec_t selected_items;
getSelectedIds(selected_items);
LL_DEBUGS("Gesture")<< "Rebuilding gesture list "<< LL_ENDL;
mGestureList->deleteAllItems();
- LLGestureManager::item_map_t::const_iterator it;
- const LLGestureManager::item_map_t& active_gestures = LLGestureManager::instance().getActiveGestures();
+ LLGestureMgr::item_map_t::const_iterator it;
+ const LLGestureMgr::item_map_t& active_gestures = LLGestureMgr::instance().getActiveGestures();
for (it = active_gestures.begin(); it != active_gestures.end(); ++it)
{
addGesture(it->first,it->second, mGestureList);
@@ -278,7 +281,7 @@ void LLFloaterGesture::buildGestureList()
// attempt to preserve scroll position through re-builds
// since we do re-build whenever something gets dirty
- for(std::vector<LLUUID>::iterator it = selected_items.begin(); it != selected_items.end(); it++)
+ for(uuid_vec_t::iterator it = selected_items.begin(); it != selected_items.end(); it++)
{
mGestureList->selectByID(*it);
}
@@ -354,10 +357,10 @@ void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gestur
element["columns"][0]["value"] = "";
element["columns"][0]["font"]["name"] = "SANSSERIF";
element["columns"][0]["font"]["style"] = font_style;
- element["columns"][0]["column"] = "trigger";
- element["columns"][0]["value"] = "---";
- element["columns"][0]["font"]["name"] = "SANSSERIF";
- element["columns"][0]["font"]["style"] = font_style;
+ element["columns"][1]["column"] = "shortcut";
+ element["columns"][1]["value"] = "---";
+ element["columns"][1]["font"]["name"] = "SANSSERIF";
+ element["columns"][1]["font"]["style"] = font_style;
element["columns"][2]["column"] = "key";
element["columns"][2]["value"] = "~~~";
element["columns"][2]["font"]["name"] = "SANSSERIF";
@@ -371,13 +374,13 @@ void LLFloaterGesture::addGesture(const LLUUID& item_id , LLMultiGesture* gestur
LLScrollListItem* sl_item = list->addElement(element, ADD_BOTTOM);
if(sl_item)
{
- LLFontGL::StyleFlags style = LLGestureManager::getInstance()->isGestureActive(item_id) ? LLFontGL::BOLD : LLFontGL::NORMAL;
+ LLFontGL::StyleFlags style = LLGestureMgr::getInstance()->isGestureActive(item_id) ? LLFontGL::BOLD : LLFontGL::NORMAL;
// *TODO find out why ["font"]["style"] does not affect font style
((LLScrollListText*)sl_item->getColumn(0))->setFontStyle(style);
}
}
-void LLFloaterGesture::getSelectedIds(std::vector<LLUUID>& ids)
+void LLFloaterGesture::getSelectedIds(uuid_vec_t& ids)
{
std::vector<LLScrollListItem*> items = mGestureList->getAllSelected();
for(std::vector<LLScrollListItem*>::const_iterator it = items.begin(); it != items.end(); it++)
@@ -421,14 +424,19 @@ void LLFloaterGesture::onClickPlay()
if(item_id.isNull()) return;
LL_DEBUGS("Gesture")<<" Trying to play gesture id: "<< item_id <<LL_ENDL;
- if(!LLGestureManager::instance().isGestureActive(item_id))
+ if(!LLGestureMgr::instance().isGestureActive(item_id))
{
// we need to inform server about gesture activating to be consistent with LLPreviewGesture and LLGestureComboList.
BOOL inform_server = TRUE;
BOOL deactivate_similar = FALSE;
- LLGestureManager::instance().setGestureLoadedCallback(item_id, boost::bind(&LLFloaterGesture::playGesture, this, item_id));
- LLGestureManager::instance().activateGestureWithAsset(item_id, gInventory.getItem(item_id)->getAssetUUID(), inform_server, deactivate_similar);
- LL_DEBUGS("Gesture")<< "Activating gesture with inventory ID: " << item_id <<LL_ENDL;
+ LLGestureMgr::instance().setGestureLoadedCallback(item_id, boost::bind(&LLFloaterGesture::playGesture, this, item_id));
+ LLViewerInventoryItem *item = gInventory.getItem(item_id);
+ llassert(item);
+ if (item)
+ {
+ LLGestureMgr::instance().activateGestureWithAsset(item_id, item->getAssetUUID(), inform_server, deactivate_similar);
+ LL_DEBUGS("Gesture")<< "Activating gesture with inventory ID: " << item_id <<LL_ENDL;
+ }
}
else
{
@@ -446,13 +454,13 @@ void LLFloaterGesture::onClickNew()
void LLFloaterGesture::onActivateBtnClick()
{
- std::vector<LLUUID> ids;
+ uuid_vec_t ids;
getSelectedIds(ids);
if(ids.empty())
return;
- LLGestureManager* gm = LLGestureManager::getInstance();
- std::vector<LLUUID>::const_iterator it = ids.begin();
+ LLGestureMgr* gm = LLGestureMgr::getInstance();
+ uuid_vec_t::const_iterator it = ids.begin();
BOOL first_gesture_state = gm->isGestureActive(*it);
BOOL is_mixed = FALSE;
while( ++it != ids.end() )
@@ -463,7 +471,7 @@ void LLFloaterGesture::onActivateBtnClick()
break;
}
}
- for(std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); it++)
+ for(uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); it++)
{
if(is_mixed)
{
@@ -489,11 +497,11 @@ void LLFloaterGesture::onCopyPasteAction(const LLSD& command)
// since we select this comman inventory item had already arrived .
if("copy_gesture" == command_name)
{
- std::vector<LLUUID> ids;
+ uuid_vec_t ids;
getSelectedIds(ids);
// make sure that clopboard is empty
LLInventoryClipboard::instance().reset();
- for(std::vector<LLUUID>::iterator it = ids.begin(); it != ids.end(); it++)
+ for(uuid_vec_t::iterator it = ids.begin(); it != ids.end(); it++)
{
LLInventoryItem* item = gInventory.getItem(*it);
if(item && item->getInventoryType() == LLInventoryType::IT_GESTURE)
@@ -510,15 +518,16 @@ void LLFloaterGesture::onCopyPasteAction(const LLSD& command)
if(ids.empty() || !gInventory.isCategoryComplete(mGestureFolderID))
return;
LLInventoryCategory* gesture_dir = gInventory.getCategory(mGestureFolderID);
+ llassert(gesture_dir);
LLPointer<GestureCopiedCallback> cb = new GestureCopiedCallback(this);
for(LLDynamicArray<LLUUID>::iterator it = ids.begin(); it != ids.end(); it++)
{
LLInventoryItem* item = gInventory.getItem(*it);
- LLStringUtil::format_map_t string_args;
- string_args["[COPY_NAME]"] = item->getName();
- if(item && item->getInventoryType() == LLInventoryType::IT_GESTURE)
+ if(gesture_dir && item && item->getInventoryType() == LLInventoryType::IT_GESTURE)
{
+ LLStringUtil::format_map_t string_args;
+ string_args["[COPY_NAME]"] = item->getName();
LL_DEBUGS("Gesture")<< "Copying gesture " << item->getName() << " "<< item->getUUID() << " into "
<< gesture_dir->getName() << " "<< gesture_dir->getUUID() << LL_ENDL;
copy_inventory_item(gAgent.getID(), item->getPermissions().getOwner(), item->getUUID(),
@@ -552,7 +561,7 @@ void LLFloaterGesture::onCommitList()
const LLUUID& item_id = mGestureList->getCurrentID();
mSelectedID = item_id;
- if (LLGestureManager::instance().isGesturePlaying(item_id))
+ if (LLGestureMgr::instance().isGesturePlaying(item_id))
{
childSetVisible("play_btn", false);
childSetVisible("stop_btn", true);
@@ -566,14 +575,14 @@ void LLFloaterGesture::onCommitList()
void LLFloaterGesture::onDeleteSelected()
{
- std::vector<LLUUID> ids;
+ uuid_vec_t ids;
getSelectedIds(ids);
if(ids.empty())
return;
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- LLGestureManager* gm = LLGestureManager::getInstance();
- for(std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); it++)
+ LLGestureMgr* gm = LLGestureMgr::getInstance();
+ for(uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); it++)
{
const LLUUID& selected_item = *it;
LLInventoryItem* inv_item = gInventory.getItem(selected_item);
@@ -604,10 +613,10 @@ void LLFloaterGesture::onDeleteSelected()
void LLFloaterGesture::addToCurrentOutFit()
{
- std::vector<LLUUID> ids;
+ uuid_vec_t ids;
getSelectedIds(ids);
- LLAppearanceManager* am = LLAppearanceManager::getInstance();
- for(std::vector<LLUUID>::const_iterator it = ids.begin(); it != ids.end(); it++)
+ LLAppearanceMgr* am = LLAppearanceMgr::getInstance();
+ for(uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); it++)
{
am->addCOFItemLink(*it);
}
@@ -617,12 +626,12 @@ void LLFloaterGesture::playGesture(LLUUID item_id)
{
LL_DEBUGS("Gesture")<<"Playing gesture "<< item_id<<LL_ENDL;
- if (LLGestureManager::instance().isGesturePlaying(item_id))
+ if (LLGestureMgr::instance().isGesturePlaying(item_id))
{
- LLGestureManager::instance().stopGesture(item_id);
+ LLGestureMgr::instance().stopGesture(item_id);
}
else
{
- LLGestureManager::instance().playGesture(item_id);
+ LLGestureMgr::instance().playGesture(item_id);
}
}
diff --git a/indra/newview/llfloatergesture.h b/indra/newview/llfloatergesture.h
index 629d77b949..1676542c77 100644
--- a/indra/newview/llfloatergesture.h
+++ b/indra/newview/llfloatergesture.h
@@ -85,7 +85,7 @@ private:
* Therefore we have to copy these items to avoid viewer crash.
* @see LLFloaterGesture::onActivateBtnClick
*/
- void getSelectedIds(std::vector<LLUUID>& ids);
+ void getSelectedIds(uuid_vec_t& ids);
bool isActionEnabled(const LLSD& command);
/**
* @brief Activation rules:
diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp
index c2b0bd18fa..bd07cfdfbf 100644
--- a/indra/newview/llfloatergodtools.cpp
+++ b/indra/newview/llfloatergodtools.cpp
@@ -213,6 +213,9 @@ void LLFloaterGodTools::showPanel(const std::string& panel_name)
// static
void LLFloaterGodTools::processRegionInfo(LLMessageSystem* msg)
{
+ llassert(msg);
+ if (!msg) return;
+
LLHost host = msg->getSender();
if (host != gAgent.getRegionHost())
{
@@ -270,8 +273,7 @@ void LLFloaterGodTools::processRegionInfo(LLMessageSystem* msg)
if ( gAgent.isGodlike()
&& LLFloaterReg::instanceVisible("god_tools")
&& god_tools->mPanelRegionTools
- && god_tools->mPanelObjectTools
- && msg )
+ && god_tools->mPanelObjectTools)
{
LLPanelRegionTools* rtool = god_tools->mPanelRegionTools;
god_tools->mCurrentHost = host;
@@ -414,17 +416,17 @@ LLPanelRegionTools::LLPanelRegionTools()
BOOL LLPanelRegionTools::postBuild()
{
getChild<LLLineEditor>("region name")->setKeystrokeCallback(onChangeSimName, this);
- childSetPrevalidate("region name", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
- childSetPrevalidate("estate", &LLLineEditor::prevalidatePositiveS32);
- childSetPrevalidate("parentestate", &LLLineEditor::prevalidatePositiveS32);
+ childSetPrevalidate("region name", &LLTextValidate::validateASCIIPrintableNoPipe);
+ childSetPrevalidate("estate", &LLTextValidate::validatePositiveS32);
+ childSetPrevalidate("parentestate", &LLTextValidate::validatePositiveS32);
childDisable("parentestate");
- childSetPrevalidate("gridposx", &LLLineEditor::prevalidatePositiveS32);
+ childSetPrevalidate("gridposx", &LLTextValidate::validatePositiveS32);
childDisable("gridposx");
- childSetPrevalidate("gridposy", &LLLineEditor::prevalidatePositiveS32);
+ childSetPrevalidate("gridposy", &LLTextValidate::validatePositiveS32);
childDisable("gridposy");
- childSetPrevalidate("redirectx", &LLLineEditor::prevalidatePositiveS32);
- childSetPrevalidate("redirecty", &LLLineEditor::prevalidatePositiveS32);
+ childSetPrevalidate("redirectx", &LLTextValidate::validatePositiveS32);
+ childSetPrevalidate("redirecty", &LLTextValidate::validatePositiveS32);
return TRUE;
}
@@ -826,7 +828,6 @@ const F32 HOURS_TO_RADIANS = (2.f*F_PI)/24.f;
LLPanelGridTools::LLPanelGridTools() :
LLPanel()
{
- mCommitCallbackRegistrar.add("GridTools.KickAll", boost::bind(&LLPanelGridTools::onClickKickAll, this));
mCommitCallbackRegistrar.add("GridTools.FlushMapVisibilityCaches", boost::bind(&LLPanelGridTools::onClickFlushMapVisibilityCaches, this));
}
@@ -844,46 +845,6 @@ void LLPanelGridTools::refresh()
{
}
-void LLPanelGridTools::onClickKickAll()
-{
- LLNotificationsUtil::add("KickAllUsers", LLSD(), LLSD(), LLPanelGridTools::confirmKick);
-}
-
-
-bool LLPanelGridTools::confirmKick(const LLSD& notification, const LLSD& response)
-{
- if (LLNotificationsUtil::getSelectedOption(notification, response) == 0)
- {
- LLSD payload;
- payload["kick_message"] = response["message"].asString();
- LLNotificationsUtil::add("ConfirmKick", LLSD(), payload, LLPanelGridTools::finishKick);
- }
- return false;
-}
-
-
-// static
-bool LLPanelGridTools::finishKick(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
-
-
- if (option == 0)
- {
- LLMessageSystem* msg = gMessageSystem;
-
- msg->newMessageFast(_PREHASH_GodKickUser);
- msg->nextBlockFast(_PREHASH_UserInfo);
- msg->addUUIDFast(_PREHASH_GodID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_GodSessionID, gAgent.getSessionID());
- msg->addUUIDFast(_PREHASH_AgentID, LL_UUID_ALL_AGENTS );
- msg->addU32("KickFlags", KICK_FLAGS_DEFAULT );
- msg->addStringFast(_PREHASH_Reason, notification["payload"]["kick_message"].asString());
- gAgent.sendReliableMessage();
- }
- return false;
-}
-
void LLPanelGridTools::onClickFlushMapVisibilityCaches()
{
LLNotificationsUtil::add("FlushMapVisibilityCaches", LLSD(), LLSD(), flushMapVisibilityCachesConfirm);
@@ -961,6 +922,7 @@ LLPanelObjectTools::~LLPanelObjectTools()
BOOL LLPanelObjectTools::postBuild()
{
+ refresh();
return TRUE;
}
@@ -1189,7 +1151,7 @@ void LLPanelObjectTools::onClickSetBySelection(void* data)
panelp->childSetValue("target_avatar_name", name);
}
-void LLPanelObjectTools::callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids)
+void LLPanelObjectTools::callbackAvatarID(const std::vector<std::string>& names, const uuid_vec_t& ids)
{
if (ids.empty() || names.empty()) return;
mTargetAvatar = ids[0];
diff --git a/indra/newview/llfloatergodtools.h b/indra/newview/llfloatergodtools.h
index ef5ce02749..aee9db78a3 100644
--- a/indra/newview/llfloatergodtools.h
+++ b/indra/newview/llfloatergodtools.h
@@ -198,9 +198,6 @@ public:
void refresh();
- void onClickKickAll();
- static bool confirmKick(const LLSD& notification, const LLSD& response);
- static bool finishKick(const LLSD& notification, const LLSD& response);
static void onDragSunPhase(LLUICtrl *ctrl, void *userdata);
void onClickFlushMapVisibilityCaches();
static bool flushMapVisibilityCachesConfirm(const LLSD& notification, const LLSD& response);
@@ -234,7 +231,7 @@ public:
void onChangeAnything();
void onApplyChanges();
void onClickSet();
- void callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids);
+ void callbackAvatarID(const std::vector<std::string>& names, const uuid_vec_t& ids);
void onClickDeletePublicOwnedBy();
void onClickDeleteAllScriptedOwnedBy();
void onClickDeleteAllOwnedBy();
diff --git a/indra/newview/llfloatergroupinvite.cpp b/indra/newview/llfloatergroupinvite.cpp
index bf484c6343..5d1864b4c8 100644
--- a/indra/newview/llfloatergroupinvite.cpp
+++ b/indra/newview/llfloatergroupinvite.cpp
@@ -112,7 +112,7 @@ LLFloaterGroupInvite::~LLFloaterGroupInvite()
}
// static
-void LLFloaterGroupInvite::showForGroup(const LLUUID& group_id, std::vector<LLUUID> *agent_ids)
+void LLFloaterGroupInvite::showForGroup(const LLUUID& group_id, uuid_vec_t *agent_ids)
{
const LLFloater::Params& floater_params = LLFloater::getDefaultParams();
S32 floater_header_size = floater_params.header_height;
diff --git a/indra/newview/llfloatergroupinvite.h b/indra/newview/llfloatergroupinvite.h
index b3f5d75ac1..68943724df 100644
--- a/indra/newview/llfloatergroupinvite.h
+++ b/indra/newview/llfloatergroupinvite.h
@@ -43,7 +43,7 @@ class LLFloaterGroupInvite
public:
virtual ~LLFloaterGroupInvite();
- static void showForGroup(const LLUUID &group_id, std::vector<LLUUID> *agent_ids = NULL);
+ static void showForGroup(const LLUUID &group_id, uuid_vec_t *agent_ids = NULL);
protected:
LLFloaterGroupInvite(const LLUUID& group_id = LLUUID::null);
diff --git a/indra/newview/llfloaterhardwaresettings.cpp b/indra/newview/llfloaterhardwaresettings.cpp
index b2564eb2b6..480e4ce3a4 100644
--- a/indra/newview/llfloaterhardwaresettings.cpp
+++ b/indra/newview/llfloaterhardwaresettings.cpp
@@ -143,10 +143,9 @@ void LLFloaterHardwareSettings::apply()
LLWindow* window = gViewerWindow->getWindow();
LLCoordScreen size;
window->getSize(&size);
- gViewerWindow->changeDisplaySettings(window->getFullscreen(),
- size,
- gSavedSettings.getBOOL("DisableVerticalSync"),
- logged_in);
+ gViewerWindow->changeDisplaySettings(size,
+ gSavedSettings.getBOOL("DisableVerticalSync"),
+ logged_in);
}
else if (old_anisotropic != LLImageGL::sGlobalUseAnisotropic)
{
diff --git a/indra/newview/llfloaterhud.cpp b/indra/newview/llfloaterhud.cpp
index d2ee3e44c5..930bbe9e6b 100644
--- a/indra/newview/llfloaterhud.cpp
+++ b/indra/newview/llfloaterhud.cpp
@@ -79,9 +79,6 @@ BOOL LLFloaterHUD::postBuild()
mWebBrowser = getChild<LLMediaCtrl>("floater_hud_browser" );
if (mWebBrowser)
{
- // Open links in internal browser
- mWebBrowser->setOpenInExternalBrowser(false);
-
// This is a "chrome" floater, so we don't want anything to
// take focus (as the user needs to be able to walk with
// arrow keys during tutorial).
diff --git a/indra/newview/llfloaterimagepreview.cpp b/indra/newview/llfloaterimagepreview.cpp
index 61568df12e..8a20712ea8 100644
--- a/indra/newview/llfloaterimagepreview.cpp
+++ b/indra/newview/llfloaterimagepreview.cpp
@@ -59,13 +59,18 @@
#include "llviewertexturelist.h"
#include "llstring.h"
+#include "llendianswizzle.h"
+
+#include "llviewercontrol.h"
+#include "lltrans.h"
+#include "llimagedimensionsinfo.h"
+
const S32 PREVIEW_BORDER_WIDTH = 2;
const S32 PREVIEW_RESIZE_HANDLE_SIZE = S32(RESIZE_HANDLE_WIDTH * OO_SQRT2) + PREVIEW_BORDER_WIDTH;
const S32 PREVIEW_HPAD = PREVIEW_RESIZE_HANDLE_SIZE;
const S32 PREF_BUTTON_HEIGHT = 16 + 7 + 16;
const S32 PREVIEW_TEXTURE_HEIGHT = 300;
-
//-----------------------------------------------------------------------------
// LLFloaterImagePreview()
//-----------------------------------------------------------------------------
@@ -124,6 +129,11 @@ BOOL LLFloaterImagePreview::postBuild()
childShow("bad_image_text");
childDisable("clothing_type_combo");
childDisable("ok_btn");
+
+ if(!mImageLoadError.empty())
+ {
+ childSetValue("bad_image_text",mImageLoadError.c_str());
+ }
}
getChild<LLUICtrl>("ok_btn")->setCommitCallback(boost::bind(&LLFloaterNameDesc::onBtnOK, this));
@@ -341,6 +351,27 @@ bool LLFloaterImagePreview::loadImage(const std::string& src_filename)
codec = IMG_CODEC_PNG;
}
+ LLImageDimensionsInfo image_info;
+ if(!image_info.load(src_filename,codec))
+ {
+ mImageLoadError = image_info.getLastError();
+ return false;
+ }
+
+ S32 max_width = gSavedSettings.getS32("max_texture_dimension_X");
+ S32 max_heigh = gSavedSettings.getS32("max_texture_dimension_Y");
+
+ if(image_info.getWidth() > max_width|| image_info.getHeight() > max_heigh)
+ {
+ LLStringUtil::format_map_t args;
+ args["WIDTH"] = llformat("%d", max_width);
+ args["HEIGHT"] = llformat("%d", max_heigh);
+
+ mImageLoadError = LLTrans::getString("texture_load_dimensions_error", args);
+ return false;
+ }
+
+
LLPointer<LLImageRaw> raw_image = new LLImageRaw;
switch (codec)
@@ -611,7 +642,6 @@ LLImagePreviewAvatar::LLImagePreviewAvatar(S32 width, S32 height) : LLViewerDyna
mCameraZoom = 1.f;
mDummyAvatar = (LLVOAvatar*)gObjectList.createObjectViewer(LL_PCODE_LEGACY_AVATAR, gAgent.getRegion());
- mDummyAvatar->initInstance();
mDummyAvatar->createDrawable(&gPipeline);
mDummyAvatar->mIsDummy = TRUE;
mDummyAvatar->mSpecialRenderMode = 2;
@@ -630,6 +660,11 @@ LLImagePreviewAvatar::~LLImagePreviewAvatar()
mDummyAvatar->markDead();
}
+//virtual
+S8 LLImagePreviewAvatar::getType() const
+{
+ return LLViewerDynamicTexture::LL_IMAGE_PREVIEW_AVATAR ;
+}
void LLImagePreviewAvatar::setPreviewTarget(const std::string& joint_name, const std::string& mesh_name, LLImageRaw* imagep, F32 distance, BOOL male)
{
@@ -688,6 +723,9 @@ BOOL LLImagePreviewAvatar::render()
mNeedsUpdate = FALSE;
LLVOAvatar* avatarp = mDummyAvatar;
+ gGL.pushUIMatrix();
+ gGL.loadUIIdentity();
+
glMatrixMode(GL_PROJECTION);
gGL.pushMatrix();
glLoadIdentity();
@@ -696,6 +734,7 @@ BOOL LLImagePreviewAvatar::render()
glMatrixMode(GL_MODELVIEW);
gGL.pushMatrix();
glLoadIdentity();
+
LLGLSUIDefault def;
gGL.color4f(0.15f, 0.2f, 0.3f, 1.f);
@@ -741,6 +780,7 @@ BOOL LLImagePreviewAvatar::render()
avatarPoolp->renderAvatars(avatarp); // renders only one avatar
}
+ gGL.popUIMatrix();
gGL.color4f(1,1,1,1);
return TRUE;
}
@@ -804,6 +844,11 @@ LLImagePreviewSculpted::~LLImagePreviewSculpted()
{
}
+//virtual
+S8 LLImagePreviewSculpted::getType() const
+{
+ return LLViewerDynamicTexture::LL_IMAGE_PREVIEW_SCULPTED ;
+}
void LLImagePreviewSculpted::setPreviewTarget(LLImageRaw* imagep, F32 distance)
{
diff --git a/indra/newview/llfloaterimagepreview.h b/indra/newview/llfloaterimagepreview.h
index 4a12543650..3a7e1ff7d8 100644
--- a/indra/newview/llfloaterimagepreview.h
+++ b/indra/newview/llfloaterimagepreview.h
@@ -54,6 +54,8 @@ protected:
public:
LLImagePreviewSculpted(S32 width, S32 height);
+ /*virtual*/ S8 getType() const ;
+
void setPreviewTarget(LLImageRaw *imagep, F32 distance);
void setTexture(U32 name) { mTextureName = name; }
@@ -85,6 +87,8 @@ protected:
public:
LLImagePreviewAvatar(S32 width, S32 height);
+ /*virtual*/ S8 getType() const ;
+
void setPreviewTarget(const std::string& joint_name, const std::string& mesh_name, LLImageRaw* imagep, F32 distance, BOOL male);
void setTexture(U32 name) { mTextureName = name; }
void clearPreviewTexture(const std::string& mesh_name);
@@ -139,7 +143,8 @@ protected:
LLRect mPreviewRect;
LLRectf mPreviewImageRect;
LLPointer<LLViewerTexture> mImagep ;
-
+
+ std::string mImageLoadError;
};
#endif // LL_LLFLOATERIMAGEPREVIEW_H
diff --git a/indra/newview/llfloaterinventory.cpp b/indra/newview/llfloaterinventory.cpp
index e62e2c99a7..4bffd41d29 100644
--- a/indra/newview/llfloaterinventory.cpp
+++ b/indra/newview/llfloaterinventory.cpp
@@ -34,13 +34,14 @@
#include "llfloaterinventory.h"
-#include "llagent.h"
+#include "llagentcamera.h"
//#include "llfirstuse.h"
#include "llfloaterreg.h"
#include "llinventorymodel.h"
#include "llpanelmaininventory.h"
#include "llresmgr.h"
#include "llviewerfoldertype.h"
+#include "lltransientfloatermgr.h"
///----------------------------------------------------------------------------
/// LLFloaterInventory
@@ -49,10 +50,12 @@
LLFloaterInventory::LLFloaterInventory(const LLSD& key)
: LLFloater(key)
{
+ LLTransientFloaterMgr::getInstance()->addControlView(this);
}
LLFloaterInventory::~LLFloaterInventory()
{
+ LLTransientFloaterMgr::getInstance()->removeControlView(this);
}
BOOL LLFloaterInventory::postBuild()
@@ -61,42 +64,6 @@ BOOL LLFloaterInventory::postBuild()
return TRUE;
}
-
-void LLFloaterInventory::draw()
-{
- updateTitle();
- LLFloater::draw();
-}
-
-void LLFloaterInventory::updateTitle()
-{
- LLLocale locale(LLLocale::USER_LOCALE);
- std::string item_count_string;
- LLResMgr::getInstance()->getIntegerString(item_count_string, gInventory.getItemCount());
-
- LLStringUtil::format_map_t string_args;
- string_args["[ITEM_COUNT]"] = item_count_string;
- string_args["[FILTER]"] = mPanelMainInventory->getFilterText();
-
- if (LLInventoryModel::backgroundFetchActive())
- {
- setTitle(getString("TitleFetching", string_args));
- }
- else if (LLInventoryModel::isEverythingFetched())
- {
- setTitle(getString("TitleCompleted", string_args));
- }
- else
- {
- setTitle(getString("Title"));
- }
-}
-
-void LLFloaterInventory::changed(U32 mask)
-{
- updateTitle();
-}
-
LLInventoryPanel* LLFloaterInventory::getPanel()
{
if (mPanelMainInventory)
@@ -112,7 +79,7 @@ LLFloaterInventory* LLFloaterInventory::showAgentInventory()
instance_num = (instance_num + 1) % S32_MAX;
LLFloaterInventory* iv = NULL;
- if (!gAgent.cameraMouselook())
+ if (!gAgentCamera.cameraMouselook())
{
iv = LLFloaterReg::showTypedInstance<LLFloaterInventory>("inventory", LLSD(instance_num));
}
diff --git a/indra/newview/llfloaterinventory.h b/indra/newview/llfloaterinventory.h
index b661c391a7..dc719bdafe 100644
--- a/indra/newview/llfloaterinventory.h
+++ b/indra/newview/llfloaterinventory.h
@@ -63,13 +63,10 @@ public:
static void cleanup();
// Inherited functionality
- /*virtual*/ void changed(U32 mask);
- /*virtual*/ void draw();
/*virtual*/ void onOpen(const LLSD& key);
LLInventoryPanel* getPanel();
-protected:
- void updateTitle();
+ LLPanelMainInventory* getMainInventoryPanel() { return mPanelMainInventory;}
private:
LLPanelMainInventory* mPanelMainInventory;
};
diff --git a/indra/newview/llfloaterlagmeter.cpp b/indra/newview/llfloaterlagmeter.cpp
index 3753dcaaa8..100cbdb217 100644
--- a/indra/newview/llfloaterlagmeter.cpp
+++ b/indra/newview/llfloaterlagmeter.cpp
@@ -64,7 +64,7 @@ BOOL LLFloaterLagMeter::postBuild()
setIsChrome(TRUE);
// were we shrunk last time?
- if (gSavedSettings.getBOOL("LagMeterShrunk"))
+ if (isShrunk())
{
onClickShrink();
}
@@ -122,6 +122,7 @@ BOOL LLFloaterLagMeter::postBuild()
mStringArgs["[SERVER_FRAME_RATE_WARNING]"] = getString("server_frame_rate_warning_fps");
// childSetAction("minimize", onClickShrink, this);
+ updateControls(isShrunk()); // if expanded append colon to the labels (EXT-4079)
return TRUE;
}
@@ -130,7 +131,7 @@ LLFloaterLagMeter::~LLFloaterLagMeter()
// save shrunk status for next time
// gSavedSettings.setBOOL("LagMeterShrunk", mShrunk);
// expand so we save the large window rectangle
- if (gSavedSettings.getBOOL("LagMeterShrunk"))
+ if (isShrunk())
{
onClickShrink();
}
@@ -205,7 +206,7 @@ void LLFloaterLagMeter::determineNetwork()
// *FIXME: We can't blame a large ping time on anything in
// particular if the frame rate is low, because a low frame
- // rate is a sure recipe for crappy ping times right now until
+ // rate is a sure recipe for bad ping times right now until
// the network handlers are de-synched from the rendering.
F32 client_frame_time_ms = 1000.0f * LLViewerStats::getInstance()->mFPSStat.getMeanDuration();
@@ -312,17 +313,15 @@ void LLFloaterLagMeter::determineServer()
}
}
-
-void LLFloaterLagMeter::onClickShrink() // toggle "LagMeterShrunk"
+void LLFloaterLagMeter::updateControls(bool shrink)
{
// LLFloaterLagMeter * self = (LLFloaterLagMeter*)data;
LLButton * button = getChild<LLButton>("minimize");
S32 delta_width = mMaxWidth -mMinWidth;
LLRect r = getRect();
- bool shrunk = gSavedSettings.getBOOL("LagMeterShrunk");
- if(shrunk)
+ if(!shrink)
{
setTitle(getString("max_title_msg", mStringArgs) );
// make left edge appear to expand
@@ -368,5 +367,16 @@ void LLFloaterLagMeter::onClickShrink() // toggle "LagMeterShrunk"
// self->childSetVisible("server_help", self->mShrunk);
// self->mShrunk = !self->mShrunk;
- gSavedSettings.setBOOL("LagMeterShrunk", !gSavedSettings.getBOOL("LagMeterShrunk"));
+}
+
+BOOL LLFloaterLagMeter::isShrunk()
+{
+ return gSavedSettings.getBOOL("LagMeterShrunk");
+}
+
+void LLFloaterLagMeter::onClickShrink() // toggle "LagMeterShrunk"
+{
+ bool shrunk = isShrunk();
+ updateControls(!shrunk);
+ gSavedSettings.setBOOL("LagMeterShrunk", !shrunk);
}
diff --git a/indra/newview/llfloaterlagmeter.h b/indra/newview/llfloaterlagmeter.h
index 592630636a..5416bca790 100644
--- a/indra/newview/llfloaterlagmeter.h
+++ b/indra/newview/llfloaterlagmeter.h
@@ -51,6 +51,8 @@ private:
void determineClient();
void determineNetwork();
void determineServer();
+ void updateControls(bool shrink);
+ BOOL isShrunk();
void onClickShrink();
diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp
index 8cd63deebe..7c5586ec96 100644
--- a/indra/newview/llfloaterland.cpp
+++ b/indra/newview/llfloaterland.cpp
@@ -42,7 +42,6 @@
#include "llnotificationsutil.h"
#include "llparcel.h"
#include "message.h"
-#include "lluserauth.h"
#include "llagent.h"
#include "llbutton.h"
@@ -86,10 +85,12 @@
static std::string OWNER_ONLINE = "0";
static std::string OWNER_OFFLINE = "1";
static std::string OWNER_GROUP = "2";
+static std::string MATURITY = "[MATURITY]";
// constants used in callbacks below - syntactic sugar.
static const BOOL BUY_GROUP_LAND = TRUE;
static const BOOL BUY_PERSONAL_LAND = FALSE;
+LLPointer<LLParcelSelection> LLPanelLandGeneral::sSelectionForBuyPass = NULL;
// Statics
LLParcelSelectionObserver* LLFloaterLand::sObserver = NULL;
@@ -102,6 +103,22 @@ public:
virtual void changed() { LLFloaterLand::refreshAll(); }
};
+// class needed to get full access to textbox inside checkbox, because LLCheckBoxCtrl::setLabel() has string as its argument.
+// It was introduced while implementing EXT-4706
+class LLCheckBoxWithTBAcess : public LLCheckBoxCtrl
+{
+public:
+ LLTextBox* getTextBox()
+ {
+ return mLabel;
+ }
+};
+
+// inserts maturity info(icon and text) into target textbox
+// names_floater - pointer to floater which contains strings with maturity icons filenames
+// str_to_parse is string in format "txt1[MATURITY]txt2" where maturity icon and text will be inserted instead of [MATURITY]
+void insert_maturity_into_textbox(LLTextBox* target_textbox, LLFloater* names_floater, std::string str_to_parse);
+
//---------------------------------------------------------------------------
// LLFloaterLand
//---------------------------------------------------------------------------
@@ -353,7 +370,7 @@ BOOL LLPanelLandGeneral::postBuild()
{
mEditName = getChild<LLLineEditor>("Name");
mEditName->setCommitCallback(onCommitAny, this);
- childSetPrevalidate("Name", LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("Name", LLTextValidate::validateASCIIPrintableNoPipe);
mEditDesc = getChild<LLTextEditor>("Description");
mEditDesc->setCommitOnFocusLost(TRUE);
@@ -554,8 +571,8 @@ void LLPanelLandGeneral::refresh()
if (regionp)
{
- mContentRating->setText(regionp->getSimAccessString());
- mLandType->setText(regionp->getSimProductName());
+ insert_maturity_into_textbox(mContentRating, gFloaterView->getParentFloater(this), MATURITY);
+ mLandType->setText(LLTrans::getString(regionp->getSimProductName()));
}
// estate owner/manager cannot edit other parts of the parcel
@@ -629,9 +646,12 @@ void LLPanelLandGeneral::refresh()
}
// Display claim date
- // *TODO:Localize (Time format may need Translating)
time_t claim_date = parcel->getClaimDate();
- mTextClaimDate->setText(formatted_time(claim_date));
+ std::string claim_date_str = getString("time_stamp_template");
+ LLSD substitution;
+ substitution["datetime"] = (S32) claim_date;
+ LLStringUtil::format (claim_date_str, substitution);
+ mTextClaimDate->setText(claim_date_str);
mTextClaimDate->setEnabled(is_leased);
BOOL enable_auction = (gAgent.getGodLevel() >= GOD_LIAISON)
@@ -787,7 +807,7 @@ void LLPanelLandGeneral::refreshNames()
else
{
// Figure out the owner's name
- owner = LLSLURL::buildCommand("agent", parcel->getOwnerID(), "inspect");
+ owner = LLSLURL("agent", parcel->getOwnerID(), "inspect").getSLURLString();
}
if(LLParcel::OS_LEASE_PENDING == parcel->getOwnershipStatus())
@@ -799,20 +819,23 @@ void LLPanelLandGeneral::refreshNames()
std::string group;
if (!parcel->getGroupID().isNull())
{
- group = LLSLURL::buildCommand("group", parcel->getGroupID(), "inspect");
+ group = LLSLURL("group", parcel->getGroupID(), "inspect").getSLURLString();
}
mTextGroup->setText(group);
- const LLUUID& auth_buyer_id = parcel->getAuthorizedBuyerID();
- if(auth_buyer_id.notNull())
- {
- std::string name;
- name = LLSLURL::buildCommand("agent", auth_buyer_id, "inspect");
- mSaleInfoForSale2->setTextArg("[BUYER]", name);
- }
- else
+ if (parcel->getForSale())
{
- mSaleInfoForSale2->setTextArg("[BUYER]", getString("anyone"));
+ const LLUUID& auth_buyer_id = parcel->getAuthorizedBuyerID();
+ if(auth_buyer_id.notNull())
+ {
+ std::string name;
+ name = LLSLURL("agent", auth_buyer_id, "inspect").getSLURLString();
+ mSaleInfoForSale2->setTextArg("[BUYER]", name);
+ }
+ else
+ {
+ mSaleInfoForSale2->setTextArg("[BUYER]", getString("anyone"));
+ }
}
}
@@ -955,6 +978,8 @@ void LLPanelLandGeneral::onClickBuyPass(void* data)
args["PARCEL_NAME"] = parcel_name;
args["TIME"] = time;
+ // creating pointer on selection to avoid deselection of parcel until we are done with buying pass (EXT-6464)
+ sSelectionForBuyPass = LLViewerParcelMgr::getInstance()->getParcelSelection();
LLNotificationsUtil::add("LandBuyPass", args, LLSD(), cbBuyPass);
}
@@ -986,6 +1011,8 @@ bool LLPanelLandGeneral::cbBuyPass(const LLSD& notification, const LLSD& respons
// User clicked OK
LLViewerParcelMgr::getInstance()->buyPass();
}
+ // we are done with buying pass, additional selection is no longer needed
+ sSelectionForBuyPass = NULL;
return false;
}
@@ -1111,7 +1138,7 @@ BOOL LLPanelLandObjects::postBuild()
mCleanOtherObjectsTime->setFocusLostCallback(boost::bind(onLostFocus, _1, this));
mCleanOtherObjectsTime->setCommitCallback(onCommitClean, this);
- childSetPrevalidate("clean other time", LLLineEditor::prevalidateNonNegativeS32);
+ childSetPrevalidate("clean other time", LLTextValidate::validateNonNegativeS32);
mBtnRefresh = getChild<LLButton>("Refresh List");
mBtnRefresh->setClickedCallback(onClickRefresh, this);
@@ -1592,7 +1619,7 @@ void LLPanelLandObjects::processParcelObjectOwnersReply(LLMessageSystem *msg, vo
item_params.columns.add().value(object_count_str).font(FONT).column("count");
item_params.columns.add().value(LLDate((time_t)most_recent_time)).font(FONT).column("mostrecent").type("date");
- self->mOwnerList->addRow(item_params);
+ self->mOwnerList->addNameItemRow(item_params);
lldebugs << "object owner " << owner_id << " (" << (is_group_owned ? "group" : "agent")
<< ") owns " << object_count << " objects." << llendl;
@@ -2058,8 +2085,14 @@ void LLPanelLandOptions::refresh()
{
// not teen so fill in the data for the maturity control
mMatureCtrl->setVisible(TRUE);
- mMatureCtrl->setLabel(getString("mature_check_mature"));
- mMatureCtrl->setToolTip(getString("mature_check_mature_tooltip"));
+ LLStyle::Params style;
+ style.image(LLUI::getUIImage(gFloaterView->getParentFloater(this)->getString("maturity_icon_moderate")));
+ LLCheckBoxWithTBAcess* fullaccess_mature_ctrl = (LLCheckBoxWithTBAcess*)mMatureCtrl;
+ fullaccess_mature_ctrl->getTextBox()->setText(std::string("icon"),style);
+ fullaccess_mature_ctrl->getTextBox()->appendText(getString("mature_check_mature"), false);
+ fullaccess_mature_ctrl->setToolTip(getString("mature_check_mature_tooltip"));
+ fullaccess_mature_ctrl->reshape(fullaccess_mature_ctrl->getRect().getWidth(), fullaccess_mature_ctrl->getRect().getHeight(), FALSE);
+
// they can see the checkbox, but its disposition depends on the
// state of the region
LLViewerRegion* regionp = LLViewerParcelMgr::getInstance()->getSelectionRegion();
@@ -2460,19 +2493,26 @@ void LLPanelLandAccess::refresh()
}
}
+ LLCheckBoxWithTBAcess* maturity_checkbox = (LLCheckBoxWithTBAcess*) getChild<LLCheckBoxCtrl>( "public_access");
LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
if(region)
{
- std::string region_access = "(";
- region_access += region->getSimAccessString();
- region_access += ")";
- childSetLabelArg( "public_access", "[MATURITY]", region_access );
+ LLTextBox* maturity_textbox = maturity_checkbox->getTextBox();
+ insert_maturity_into_textbox(maturity_textbox, gFloaterView->getParentFloater(this), getString("allow_public_access"));
+ maturity_checkbox->reshape(maturity_checkbox->getRect().getWidth(), maturity_checkbox->getRect().getHeight(), FALSE);
}
else
{
- childSetLabelArg( "public_access", "[MATURITY]", std::string() );
- }
+ std::string maturity_string = getString("allow_public_access");
+ size_t maturity_pos = maturity_string.find(MATURITY);
+ if (maturity_pos != std::string::npos)
+ {
+ maturity_string.replace(maturity_pos, MATURITY.length(), std::string(""));
+ }
+
+ maturity_checkbox->setLabel(maturity_string);
+ }
if(parcel->getRegionDenyAnonymousOverride())
{
@@ -2741,7 +2781,7 @@ void LLPanelLandAccess::onClickAddAccess()
gFloaterView->getParentFloater(this)->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLPanelLandAccess::callbackAvatarCBAccess, this, _1,_2)) );
}
-void LLPanelLandAccess::callbackAvatarCBAccess(const std::vector<std::string>& names, const std::vector<LLUUID>& ids)
+void LLPanelLandAccess::callbackAvatarCBAccess(const std::vector<std::string>& names, const uuid_vec_t& ids)
{
if (!names.empty() && !ids.empty())
{
@@ -2786,7 +2826,7 @@ void LLPanelLandAccess::onClickAddBanned()
}
// static
-void LLPanelLandAccess::callbackAvatarCBBanned(const std::vector<std::string>& names, const std::vector<LLUUID>& ids)
+void LLPanelLandAccess::callbackAvatarCBBanned(const std::vector<std::string>& names, const uuid_vec_t& ids)
{
if (!names.empty() && !ids.empty())
{
@@ -2858,7 +2898,7 @@ void LLPanelLandCovenant::refresh()
LLTextBox* region_maturity = getChild<LLTextBox>("region_maturity_text");
if (region_maturity)
{
- region_maturity->setText(region->getSimAccessString());
+ insert_maturity_into_textbox(region_maturity, gFloaterView->getParentFloater(this), MATURITY);
}
LLTextBox* resellable_clause = getChild<LLTextBox>("resellable_clause");
@@ -2939,3 +2979,51 @@ void LLPanelLandCovenant::updateEstateOwnerName(const std::string& name)
if (editor) editor->setText(name);
}
}
+
+// inserts maturity info(icon and text) into target textbox
+// names_floater - pointer to floater which contains strings with maturity icons filenames
+// str_to_parse is string in format "txt1[MATURITY]txt2" where maturity icon and text will be inserted instead of [MATURITY]
+void insert_maturity_into_textbox(LLTextBox* target_textbox, LLFloater* names_floater, std::string str_to_parse)
+{
+ LLViewerRegion* region = LLViewerParcelMgr::getInstance()->getSelectionRegion();
+ if (!region)
+ return;
+
+ LLStyle::Params style;
+
+ U8 sim_access = region->getSimAccess();
+
+ switch(sim_access)
+ {
+ case SIM_ACCESS_PG:
+ style.image(LLUI::getUIImage(names_floater->getString("maturity_icon_general")));
+ break;
+
+ case SIM_ACCESS_ADULT:
+ style.image(LLUI::getUIImage(names_floater->getString("maturity_icon_adult")));
+ break;
+
+ case SIM_ACCESS_MATURE:
+ style.image(LLUI::getUIImage(names_floater->getString("maturity_icon_moderate")));
+ break;
+
+ default:
+ break;
+ }
+
+ size_t maturity_pos = str_to_parse.find(MATURITY);
+
+ if (maturity_pos == std::string::npos)
+ {
+ return;
+ }
+
+ std::string text_before_rating = str_to_parse.substr(0, maturity_pos);
+ std::string text_after_rating = str_to_parse.substr(maturity_pos + MATURITY.length());
+
+ target_textbox->setText(text_before_rating);
+ // any text may be here instead of "icon" except ""
+ target_textbox->appendText(std::string("icon"), false, style);
+ target_textbox->appendText(LLViewerParcelMgr::getInstance()->getSelectionRegion()->getSimAccessString(), false);
+ target_textbox->appendText(text_after_rating, false);
+}
diff --git a/indra/newview/llfloaterland.h b/indra/newview/llfloaterland.h
index a4785e8f5b..0a743e5215 100644
--- a/indra/newview/llfloaterland.h
+++ b/indra/newview/llfloaterland.h
@@ -167,7 +167,7 @@ public:
static void onClickSet(void* data);
static void onClickClear(void* data);
static void onClickShow(void* data);
- static void callbackAvatarPick(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* data);
+ static void callbackAvatarPick(const std::vector<std::string>& names, const uuid_vec_t& ids, void* data);
static void finalizeAvatarPick(void* data);
static void callbackHighlightTransferable(S32 option, void* userdata);
static void onClickStartAuction(void*);
@@ -234,6 +234,11 @@ protected:
LLSafeHandle<LLParcelSelection>& mParcel;
+ // This pointer is needed to avoid parcel deselection until buying pass is completed or canceled.
+ // Deselection happened because of zero references to parcel selection, which took place when
+ // "Buy Pass" was called from popup menu(EXT-6464)
+ static LLPointer<LLParcelSelection> sSelectionForBuyPass;
+
static LLHandle<LLFloater> sBuyPassDialogHandle;
};
@@ -374,8 +379,8 @@ public:
void onClickAddAccess();
void onClickAddBanned();
- void callbackAvatarCBBanned(const std::vector<std::string>& names, const std::vector<LLUUID>& ids);
- void callbackAvatarCBAccess(const std::vector<std::string>& names, const std::vector<LLUUID>& ids);
+ void callbackAvatarCBBanned(const std::vector<std::string>& names, const uuid_vec_t& ids);
+ void callbackAvatarCBAccess(const std::vector<std::string>& names, const uuid_vec_t& ids);
protected:
LLNameListCtrl* mListAccess;
diff --git a/indra/newview/llfloatermap.cpp b/indra/newview/llfloatermap.cpp
index 051ab585e2..e74bfae026 100644
--- a/indra/newview/llfloatermap.cpp
+++ b/indra/newview/llfloatermap.cpp
@@ -41,7 +41,7 @@
#include "llglheaders.h"
// Viewer includes
-#include "llagent.h"
+#include "llagentcamera.h"
#include "llviewercontrol.h"
#include "llnetmap.h"
#include "lltracker.h"
@@ -54,7 +54,10 @@
// Constants
//
const F32 MAP_MINOR_DIR_THRESHOLD = 0.08f;
-
+const S32 MAP_PADDING_LEFT = 0;
+const S32 MAP_PADDING_TOP = 2;
+const S32 MAP_PADDING_RIGHT = 2;
+const S32 MAP_PADDING_BOTTOM = 0;
//
// Member functions
//
@@ -106,6 +109,9 @@ BOOL LLFloaterMap::postBuild()
mPopupMenu->setItemEnabled ("Stop Tracking", false);
}
+ stretchMiniMap(getRect().getWidth() - MAP_PADDING_LEFT - MAP_PADDING_RIGHT
+ ,getRect().getHeight() - MAP_PADDING_TOP - MAP_PADDING_BOTTOM);
+
updateMinorDirections();
// Get the drag handle all the way in back
@@ -196,7 +202,7 @@ void LLFloaterMap::draw()
setDirectionPos( mTextBoxSouthEast, rotation + F_PI + F_PI_BY_TWO + F_PI_BY_TWO / 2);
// Note: we can't just gAgent.check cameraMouselook() because the transition states are wrong.
- if( gAgent.cameraMouselook())
+ if(gAgentCamera.cameraMouselook())
{
setMouseOpaque(FALSE);
getDragHandle()->setMouseOpaque(FALSE);
@@ -215,9 +221,40 @@ void LLFloaterMap::draw()
LLFloater::draw();
}
+// virtual
+void LLFloaterMap::onFocusReceived()
+{
+ setBackgroundOpaque(true);
+ LLPanel::onFocusReceived();
+}
+
+// virtual
+void LLFloaterMap::onFocusLost()
+{
+ setBackgroundOpaque(false);
+ LLPanel::onFocusLost();
+}
+
+void LLFloaterMap::stretchMiniMap(S32 width,S32 height)
+{
+ //fix for ext-7112
+ //by default ctrl can't overlap caption area
+ if(mMap)
+ {
+ LLRect map_rect;
+ map_rect.setLeftTopAndSize( MAP_PADDING_LEFT, getRect().getHeight() - MAP_PADDING_TOP, width, height);
+ mMap->reshape( width, height, 1);
+ mMap->setRect(map_rect);
+ }
+}
+
void LLFloaterMap::reshape(S32 width, S32 height, BOOL called_from_parent)
{
LLFloater::reshape(width, height, called_from_parent);
+
+ stretchMiniMap(width - MAP_PADDING_LEFT - MAP_PADDING_RIGHT
+ ,height - MAP_PADDING_TOP - MAP_PADDING_BOTTOM);
+
updateMinorDirections();
}
diff --git a/indra/newview/llfloatermap.h b/indra/newview/llfloatermap.h
index 6c9138c6a7..3c063adfb8 100644
--- a/indra/newview/llfloatermap.h
+++ b/indra/newview/llfloatermap.h
@@ -53,12 +53,16 @@ public:
/*virtual*/ BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
/*virtual*/ void draw();
+ /*virtual*/ void onFocusLost();
+ /*virtual*/ void onFocusReceived();
private:
void handleZoom(const LLSD& userdata);
void handleStopTracking (const LLSD& userdata);
void setDirectionPos( LLTextBox* text_box, F32 rotation );
void updateMinorDirections();
+
+ void stretchMiniMap(S32 width,S32 height);
LLMenuGL* mPopupMenu;
diff --git a/indra/newview/llfloatermediasettings.cpp b/indra/newview/llfloatermediasettings.cpp
index 7388f7ea3f..ee68faf84b 100644
--- a/indra/newview/llfloatermediasettings.cpp
+++ b/indra/newview/llfloatermediasettings.cpp
@@ -207,7 +207,7 @@ void LLFloaterMediaSettings::commitFields()
if (hasFocus())
{
LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus());
- if (cur_focus->acceptsTextInput())
+ if (cur_focus && cur_focus->acceptsTextInput())
{
cur_focus->onCommit();
};
@@ -242,6 +242,12 @@ void LLFloaterMediaSettings::onBtnApply( void* userdata )
sInstance->commitFields();
sInstance->apply();
+
+ sInstance->mInitialValues.clear();
+ sInstance->mPanelMediaSettingsGeneral->getValues( sInstance->mInitialValues );
+ sInstance->mPanelMediaSettingsSecurity->getValues( sInstance->mInitialValues );
+ sInstance->mPanelMediaSettingsPermissions->getValues( sInstance->mInitialValues );
+
}
////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llfloaternamedesc.cpp b/indra/newview/llfloaternamedesc.cpp
index 810761e034..159ce41b79 100644
--- a/indra/newview/llfloaternamedesc.cpp
+++ b/indra/newview/llfloaternamedesc.cpp
@@ -111,7 +111,7 @@ BOOL LLFloaterNameDesc::postBuild()
if (NameEditor)
{
NameEditor->setMaxTextLength(DB_INV_ITEM_NAME_STR_LEN);
- NameEditor->setPrevalidate(&LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ NameEditor->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
}
y -= llfloor(PREVIEW_LINE_HEIGHT * 1.2f);
@@ -123,7 +123,7 @@ BOOL LLFloaterNameDesc::postBuild()
if (DescEditor)
{
DescEditor->setMaxTextLength(DB_INV_ITEM_DESC_STR_LEN);
- DescEditor->setPrevalidate(&LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ DescEditor->setPrevalidate(&LLTextValidate::validateASCIIPrintableNoPipe);
}
y -= llfloor(PREVIEW_LINE_HEIGHT * 1.2f);
diff --git a/indra/newview/llfloaternotificationsconsole.cpp b/indra/newview/llfloaternotificationsconsole.cpp
index 90db8988b2..105d7f9201 100644
--- a/indra/newview/llfloaternotificationsconsole.cpp
+++ b/indra/newview/llfloaternotificationsconsole.cpp
@@ -112,10 +112,15 @@ void LLNotificationChannelPanel::onClickNotification(void* user_data)
{
LLNotificationChannelPanel* self = (LLNotificationChannelPanel*)user_data;
if (!self) return;
- void* data = self->getChild<LLScrollListCtrl>("notifications_list")->getFirstSelected()->getUserdata();
- if (data)
+ LLScrollListItem* firstselected = self->getChild<LLScrollListCtrl>("notifications_list")->getFirstSelected();
+ llassert(firstselected);
+ if (firstselected)
{
- gFloaterView->getParentFloater(self)->addDependentFloater(new LLFloaterNotification((LLNotification*)data), TRUE);
+ void* data = firstselected->getUserdata();
+ if (data)
+ {
+ gFloaterView->getParentFloater(self)->addDependentFloater(new LLFloaterNotification((LLNotification*)data), TRUE);
+ }
}
}
@@ -124,10 +129,15 @@ void LLNotificationChannelPanel::onClickNotificationReject(void* user_data)
{
LLNotificationChannelPanel* self = (LLNotificationChannelPanel*)user_data;
if (!self) return;
- void* data = self->getChild<LLScrollListCtrl>("notification_rejects_list")->getFirstSelected()->getUserdata();
- if (data)
+ LLScrollListItem* firstselected = self->getChild<LLScrollListCtrl>("notification_rejects_list")->getFirstSelected();
+ llassert(firstselected);
+ if (firstselected)
{
- gFloaterView->getParentFloater(self)->addDependentFloater(new LLFloaterNotification((LLNotification*)data), TRUE);
+ void* data = firstselected->getUserdata();
+ if (data)
+ {
+ gFloaterView->getParentFloater(self)->addDependentFloater(new LLFloaterNotification((LLNotification*)data), TRUE);
+ }
}
}
@@ -174,7 +184,7 @@ BOOL LLFloaterNotificationConsole::postBuild()
addChannel("Ignore");
addChannel("Visible", true);
// all the ones below attach to the Visible channel
- addChannel("History");
+ addChannel("Persistent");
addChannel("Alerts");
addChannel("AlertModal");
addChannel("Group Notifications");
@@ -200,7 +210,7 @@ void LLFloaterNotificationConsole::addChannel(const std::string& name, bool open
{
LLLayoutStack& stack = getChildRef<LLLayoutStack>("notification_channels");
LLNotificationChannelPanel* panelp = new LLNotificationChannelPanel(name);
- stack.addPanel(panelp, 0, NOTIFICATION_PANEL_HEADER_HEIGHT, TRUE, TRUE, LLLayoutStack::ANIMATE);
+ stack.addPanel(panelp, 0, NOTIFICATION_PANEL_HEADER_HEIGHT, S32_MAX, S32_MAX, TRUE, TRUE, LLLayoutStack::ANIMATE);
LLButton& header_button = panelp->getChildRef<LLButton>("header");
header_button.setToggleState(!open);
diff --git a/indra/newview/llfloateropenobject.cpp b/indra/newview/llfloateropenobject.cpp
index ec50ed596c..71bfae316a 100644
--- a/indra/newview/llfloateropenobject.cpp
+++ b/indra/newview/llfloateropenobject.cpp
@@ -121,12 +121,12 @@ void LLFloaterOpenObject::refresh()
{
// this folder is coming from an object, as there is only one folder in an object, the root,
// we need to collect the entire contents and handle them as a group
- InventoryObjectList inventory_objects;
+ LLInventoryObject::object_list_t inventory_objects;
object->getInventoryContents(inventory_objects);
if (!inventory_objects.empty())
{
- for (InventoryObjectList::iterator it = inventory_objects.begin();
+ for (LLInventoryObject::object_list_t::iterator it = inventory_objects.begin();
it != inventory_objects.end();
++it)
{
diff --git a/indra/newview/llfloaterpay.cpp b/indra/newview/llfloaterpay.cpp
index 00959322e5..51364594e4 100644
--- a/indra/newview/llfloaterpay.cpp
+++ b/indra/newview/llfloaterpay.cpp
@@ -204,7 +204,7 @@ BOOL LLFloaterPay::postBuild()
getChild<LLLineEditor>("amount")->setKeystrokeCallback(&LLFloaterPay::onKeystroke, this);
childSetText("amount", last_amount);
- childSetPrevalidate("amount", LLLineEditor::prevalidateNonNegativeS32);
+ childSetPrevalidate("amount", LLTextValidate::validateNonNegativeS32);
info = new LLGiveMoneyInfo(this, 0);
mCallbackData.push_back(info);
diff --git a/indra/newview/llfloaterpreference.cpp b/indra/newview/llfloaterpreference.cpp
index 9d9fbacee3..f450b199c8 100644
--- a/indra/newview/llfloaterpreference.cpp
+++ b/indra/newview/llfloaterpreference.cpp
@@ -107,10 +107,13 @@
#include "llpluginclassmedia.h"
#include "llteleporthistorystorage.h"
+#include "lllogininstance.h" // to check if logged in yet
+
const F32 MAX_USER_FAR_CLIP = 512.f;
const F32 MIN_USER_FAR_CLIP = 64.f;
-const S32 ASPECT_RATIO_STR_LEN = 100;
+//control value for middle mouse as talk2push button
+const static std::string MIDDLE_MOUSE_CV = "MiddleMouse";
class LLVoiceSetKeyDialog : public LLModalDialog
{
@@ -181,8 +184,6 @@ void LLVoiceSetKeyDialog::onCancel(void* user_data)
// if creating/destroying these is too slow, we'll need to create
// a static member and update all our static callbacks
-void handleNameTagOptionChanged(const LLSD& newvalue);
-viewer_media_t get_web_media();
bool callback_clear_browser_cache(const LLSD& notification, const LLSD& response);
//bool callback_skip_dialogs(const LLSD& notification, const LLSD& response, LLFloaterPreference* floater);
@@ -190,23 +191,14 @@ bool callback_clear_browser_cache(const LLSD& notification, const LLSD& response
void fractionFromDecimal(F32 decimal_val, S32& numerator, S32& denominator);
-viewer_media_t get_web_media()
-{
- viewer_media_t media_source = LLViewerMedia::newMediaImpl(LLUUID::null);
- media_source->initializeMedia("text/html");
- return media_source;
-}
-
-
bool callback_clear_browser_cache(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if ( option == 0 ) // YES
{
// clean web
- viewer_media_t media_source = get_web_media();
- if (media_source && media_source->hasMedia())
- media_source->getMediaPlugin()->clear_cache();
+ LLViewerMedia::clearAllCaches();
+ LLViewerMedia::clearAllCookies();
// clean nav bar history
LLNavigationBar::getInstance()->clearHistoryCache();
@@ -227,15 +219,6 @@ bool callback_clear_browser_cache(const LLSD& notification, const LLSD& response
return false;
}
-void handleNameTagOptionChanged(const LLSD& newvalue)
-{
- S32 name_tag_option = S32(newvalue);
- if(name_tag_option==2)
- {
- gSavedSettings.setBOOL("SmallAvatarNames", TRUE);
- }
-}
-
/*bool callback_skip_dialogs(const LLSD& notification, const LLSD& response, LLFloaterPreference* floater)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
@@ -283,7 +266,6 @@ void fractionFromDecimal(F32 decimal_val, S32& numerator, S32& denominator)
}
// static
std::string LLFloaterPreference::sSkin = "";
-F32 LLFloaterPreference::sAspectRatio = 0.0;
//////////////////////////////////////////////
// LLFloaterPreference
@@ -318,24 +300,17 @@ LLFloaterPreference::LLFloaterPreference(const LLSD& key)
mCommitCallbackRegistrar.add("Pref.ClickEnablePopup", boost::bind(&LLFloaterPreference::onClickEnablePopup, this));
mCommitCallbackRegistrar.add("Pref.ClickDisablePopup", boost::bind(&LLFloaterPreference::onClickDisablePopup, this));
mCommitCallbackRegistrar.add("Pref.LogPath", boost::bind(&LLFloaterPreference::onClickLogPath, this));
- mCommitCallbackRegistrar.add("Pref.UpdateMeterText", boost::bind(&LLFloaterPreference::updateMeterText, this, _1));
mCommitCallbackRegistrar.add("Pref.HardwareSettings", boost::bind(&LLFloaterPreference::onOpenHardwareSettings, this));
mCommitCallbackRegistrar.add("Pref.HardwareDefaults", boost::bind(&LLFloaterPreference::setHardwareDefaults, this));
mCommitCallbackRegistrar.add("Pref.VertexShaderEnable", boost::bind(&LLFloaterPreference::onVertexShaderEnable, this));
mCommitCallbackRegistrar.add("Pref.WindowedMod", boost::bind(&LLFloaterPreference::onCommitWindowedMode, this));
mCommitCallbackRegistrar.add("Pref.UpdateSliderText", boost::bind(&LLFloaterPreference::onUpdateSliderText,this, _1,_2));
- mCommitCallbackRegistrar.add("Pref.AutoDetectAspect", boost::bind(&LLFloaterPreference::onCommitAutoDetectAspect, this));
- mCommitCallbackRegistrar.add("Pref.ParcelMediaAutoPlayEnable", boost::bind(&LLFloaterPreference::onCommitParcelMediaAutoPlayEnable, this));
- mCommitCallbackRegistrar.add("Pref.MediaEnabled", boost::bind(&LLFloaterPreference::onCommitMediaEnabled, this));
- mCommitCallbackRegistrar.add("Pref.MusicEnabled", boost::bind(&LLFloaterPreference::onCommitMusicEnabled, this));
- mCommitCallbackRegistrar.add("Pref.onSelectAspectRatio", boost::bind(&LLFloaterPreference::onKeystrokeAspectRatio, this));
mCommitCallbackRegistrar.add("Pref.QualityPerformance", boost::bind(&LLFloaterPreference::onChangeQuality, this, _2));
mCommitCallbackRegistrar.add("Pref.applyUIColor", boost::bind(&LLFloaterPreference::applyUIColor, this ,_1, _2));
mCommitCallbackRegistrar.add("Pref.getUIColor", boost::bind(&LLFloaterPreference::getUIColor, this ,_1, _2));
-
+ mCommitCallbackRegistrar.add("Pref.MaturitySettings", boost::bind(&LLFloaterPreference::onChangeMaturity, this));
+
sSkin = gSavedSettings.getString("SkinCurrent");
-
- gSavedSettings.getControl("AvatarNameTagMode")->getCommitSignal()->connect(boost::bind(&handleNameTagOptionChanged, _2));
}
BOOL LLFloaterPreference::postBuild()
@@ -344,27 +319,43 @@ BOOL LLFloaterPreference::postBuild()
gSavedSettings.getControl("PlainTextChatHistory")->getSignal()->connect(boost::bind(&LLNearbyChat::processChatHistoryStyleUpdate, _2));
+ gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&LLIMFloater::processChatHistoryStyleUpdate, _2));
+
+ gSavedSettings.getControl("ChatFontSize")->getSignal()->connect(boost::bind(&LLNearbyChat::processChatHistoryStyleUpdate, _2));
+
LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core");
if (!tabcontainer->selectTab(gSavedSettings.getS32("LastPrefTab")))
tabcontainer->selectFirstTab();
- S32 show_avatar_nametag_options = gSavedSettings.getS32("AvatarNameTagMode");
- handleNameTagOptionChanged(LLSD(show_avatar_nametag_options));
std::string cache_location = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "");
childSetText("cache_location", cache_location);
+ // if floater is opened before login set default localized busy message
+ if (LLStartUp::getStartupState() < STATE_STARTED)
+ {
+ gSavedPerAccountSettings.setString("BusyModeResponse", LLTrans::getString("BusyModeResponseDefault"));
+ }
+
return TRUE;
}
+void LLFloaterPreference::onBusyResponseChanged()
+{
+ // set "BusyResponseChanged" TRUE if user edited message differs from default, FALSE otherwise
+ if(LLTrans::getString("BusyModeResponseDefault") != getChild<LLUICtrl>("busy_response")->getValue().asString())
+ {
+ gSavedPerAccountSettings.setBOOL("BusyResponseChanged", TRUE );
+ }
+ else
+ {
+ gSavedPerAccountSettings.setBOOL("BusyResponseChanged", FALSE );
+ }
+}
+
LLFloaterPreference::~LLFloaterPreference()
{
// clean up user data
- LLComboBox* ctrl_aspect_ratio = getChild<LLComboBox>( "aspect_ratio");
LLComboBox* ctrl_window_size = getChild<LLComboBox>("windowsize combo");
- for (S32 i = 0; i < ctrl_aspect_ratio->getItemCount(); i++)
- {
- ctrl_aspect_ratio->setCurrentByIndex(i);
- }
for (S32 i = 0; i < ctrl_window_size->getItemCount(); i++)
{
ctrl_window_size->setCurrentByIndex(i);
@@ -435,17 +426,14 @@ void LLFloaterPreference::apply()
std::string cache_location = gDirUtilp->getExpandedFilename(LL_PATH_CACHE, "");
childSetText("cache_location", cache_location);
- viewer_media_t media_source = get_web_media();
- if (media_source && media_source->hasMedia())
+ LLViewerMedia::setCookiesEnabled(childGetValue("cookies_enabled"));
+
+ if(hasChild("web_proxy_enabled") &&hasChild("web_proxy_editor") && hasChild("web_proxy_port"))
{
- media_source->getMediaPlugin()->enable_cookies(childGetValue("cookies_enabled"));
- if(hasChild("web_proxy_enabled") &&hasChild("web_proxy_editor") && hasChild("web_proxy_port"))
- {
- bool proxy_enable = childGetValue("web_proxy_enabled");
- std::string proxy_address = childGetValue("web_proxy_editor");
- int proxy_port = childGetValue("web_proxy_port");
- media_source->getMediaPlugin()->proxy_setup(proxy_enable, proxy_address, proxy_port);
- }
+ bool proxy_enable = childGetValue("web_proxy_enabled");
+ std::string proxy_address = childGetValue("web_proxy_editor");
+ int proxy_port = childGetValue("web_proxy_port");
+ LLViewerMedia::setProxyConfig(proxy_enable, proxy_address, proxy_port);
}
// LLWString busy_response = utf8str_to_wstring(getChild<LLUICtrl>("busy_response")->getValue().asString());
@@ -477,8 +465,6 @@ void LLFloaterPreference::apply()
gAgent.sendAgentUpdateUserInfo(new_im_via_email,mDirectoryVisibility);
}
}
-
- applyResolution();
}
void LLFloaterPreference::cancel()
@@ -514,40 +500,60 @@ void LLFloaterPreference::cancel()
LLFloaterReg::hideInstance("pref_voicedevicesettings");
- gSavedSettings.setF32("FullScreenAspectRatio", sAspectRatio);
-
}
void LLFloaterPreference::onOpen(const LLSD& key)
{
+ // this variable and if that follows it are used to properly handle busy mode response message
+ static bool initialized = FALSE;
+ // if user is logged in and we haven't initialized busy_response yet, do it
+ if (!initialized && LLStartUp::getStartupState() == STATE_STARTED)
+ {
+ // Special approach is used for busy response localization, because "BusyModeResponse" is
+ // in non-localizable xml, and also because it may be changed by user and in this case it shouldn't be localized.
+ // To keep track of whether busy response is default or changed by user additional setting BusyResponseChanged
+ // was added into per account settings.
+
+ // initialization should happen once,so setting variable to TRUE
+ initialized = TRUE;
+ // this connection is needed to properly set "BusyResponseChanged" setting when user makes changes in
+ // busy response message.
+ gSavedPerAccountSettings.getControl("BusyModeResponse")->getSignal()->connect(boost::bind(&LLFloaterPreference::onBusyResponseChanged, this));
+ }
gAgent.sendAgentUserInfoRequest();
/////////////////////////// From LLPanelGeneral //////////////////////////
// if we have no agent, we can't let them choose anything
// if we have an agent, then we only let them choose if they have a choice
bool can_choose_maturity =
- gAgent.getID().notNull() && (gAgent.isMature() || gAgent.isGodlike());
+ gAgent.getID().notNull() &&
+ (gAgent.isMature() || gAgent.isGodlike());
LLComboBox* maturity_combo = getChild<LLComboBox>("maturity_desired_combobox");
if (can_choose_maturity)
{
// if they're not adult or a god, they shouldn't see the adult selection, so delete it
- if (!gAgent.isAdult() && !gAgent.isGodlike())
+ if (!gAgent.isAdult() && !gAgent.isGodlikeWithoutAdminMenuFakery())
{
- // we're going to remove the adult entry from the combo. This obviously depends
- // on the order of items in the XML file, but there doesn't seem to be a reasonable
- // way to depend on the field in XML called 'name'.
- maturity_combo->remove(0);
+ // we're going to remove the adult entry from the combo
+ LLScrollListCtrl* maturity_list = maturity_combo->findChild<LLScrollListCtrl>("ComboBox");
+ if (maturity_list)
+ {
+ maturity_list->deleteItems(LLSD(SIM_ACCESS_ADULT));
+ }
}
childSetVisible("maturity_desired_combobox", true);
- childSetVisible("maturity_desired_textbox", false);
+ childSetVisible("maturity_desired_textbox", false);
}
else
{
childSetText("maturity_desired_textbox", maturity_combo->getSelectedItemLabel());
childSetVisible("maturity_desired_combobox", false);
}
+
+ // Display selected maturity icons.
+ onChangeMaturity();
// Enabled/disabled popups, might have been changed by user actions
// while preferences floater was closed.
@@ -567,6 +573,16 @@ void LLFloaterPreference::onVertexShaderEnable()
refreshEnabledGraphics();
}
+//static
+void LLFloaterPreference::initBusyResponse()
+ {
+ if (!gSavedPerAccountSettings.getBOOL("BusyResponseChanged"))
+ {
+ //LLTrans::getString("BusyModeResponseDefault") is used here for localization (EXT-5885)
+ gSavedPerAccountSettings.setString("BusyModeResponse", LLTrans::getString("BusyModeResponseDefault"));
+ }
+ }
+
void LLFloaterPreference::setHardwareDefaults()
{
LLFeatureManager::getInstance()->applyRecommendedSettings();
@@ -602,7 +618,7 @@ void LLFloaterPreference::onBtnOK()
if (hasFocus())
{
LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus());
- if (cur_focus->acceptsTextInput())
+ if (cur_focus && cur_focus->acceptsTextInput())
{
cur_focus->onCommit();
}
@@ -626,7 +642,7 @@ void LLFloaterPreference::onBtnOK()
llinfos << "Can't close preferences!" << llendl;
}
- LLPanelLogin::refreshLocation( false );
+ LLPanelLogin::updateLocationCombo( false );
}
// static
@@ -635,7 +651,7 @@ void LLFloaterPreference::onBtnApply( )
if (hasFocus())
{
LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus());
- if (cur_focus->acceptsTextInput())
+ if (cur_focus && cur_focus->acceptsTextInput())
{
cur_focus->onCommit();
}
@@ -643,7 +659,7 @@ void LLFloaterPreference::onBtnApply( )
apply();
saveSettings();
- LLPanelLogin::refreshLocation( false );
+ LLPanelLogin::updateLocationCombo( false );
}
// static
@@ -652,7 +668,7 @@ void LLFloaterPreference::onBtnCancel()
if (hasFocus())
{
LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus());
- if (cur_focus->acceptsTextInput())
+ if (cur_focus && cur_focus->acceptsTextInput())
{
cur_focus->onCommit();
}
@@ -678,7 +694,8 @@ void LLFloaterPreference::refreshEnabledGraphics()
LLFloaterPreference* instance = LLFloaterReg::findTypedInstance<LLFloaterPreference>("preferences");
if(instance)
{
- instance->refreshEnabledState();
+ instance->refresh();
+ //instance->refreshEnabledState();
}
LLFloaterHardwareSettings* hardware_settings = LLFloaterReg::getTypedInstance<LLFloaterHardwareSettings>("prefs_hardware_settings");
if (hardware_settings)
@@ -687,21 +704,6 @@ void LLFloaterPreference::refreshEnabledGraphics()
}
}
-void LLFloaterPreference::updateMeterText(LLUICtrl* ctrl)
-{
- // get our UI widgets
- LLSliderCtrl* slider = (LLSliderCtrl*) ctrl;
-
- LLTextBox* m1 = getChild<LLTextBox>("DrawDistanceMeterText1");
- LLTextBox* m2 = getChild<LLTextBox>("DrawDistanceMeterText2");
-
- // toggle the two text boxes based on whether we have 1 or two digits
- F32 val = slider->getValueF32();
- bool two_digits = val < 100;
- m1->setVisible(two_digits);
- m2->setVisible(!two_digits);
-}
-
void LLFloaterPreference::onClickBrowserClearCache()
{
LLNotificationsUtil::add("ConfirmClearBrowserCache", LLSD(), LLSD(), callback_clear_browser_cache);
@@ -901,6 +903,8 @@ void LLFloaterPreference::refreshEnabledState()
ctrl_wind_light->setEnabled(ctrl_shader_enable->getEnabled() && shaders);
// now turn off any features that are unavailable
disableUnavailableSettings();
+
+ childSetEnabled ("block_list", LLLoginInstance::getInstance()->authSuccess());
}
void LLFloaterPreference::disableUnavailableSettings()
@@ -968,60 +972,6 @@ void LLFloaterPreference::disableUnavailableSettings()
}
}
-void LLFloaterPreference::onCommitAutoDetectAspect()
-{
- BOOL auto_detect = getChild<LLCheckBoxCtrl>("aspect_auto_detect")->get();
- F32 ratio;
-
- if (auto_detect)
- {
- S32 numerator = 0;
- S32 denominator = 0;
-
- // clear any aspect ratio override
- gViewerWindow->mWindow->setNativeAspectRatio(0.f);
- fractionFromDecimal(gViewerWindow->mWindow->getNativeAspectRatio(), numerator, denominator);
-
- std::string aspect;
- if (numerator != 0)
- {
- aspect = llformat("%d:%d", numerator, denominator);
- }
- else
- {
- aspect = llformat("%.3f", gViewerWindow->mWindow->getNativeAspectRatio());
- }
-
- getChild<LLComboBox>( "aspect_ratio")->setLabel(aspect);
-
- ratio = gViewerWindow->mWindow->getNativeAspectRatio();
- gSavedSettings.setF32("FullScreenAspectRatio", ratio);
- }
-}
-
-void LLFloaterPreference::onCommitParcelMediaAutoPlayEnable()
-{
- BOOL autoplay = getChild<LLCheckBoxCtrl>("autoplay_enabled")->get();
-
- gSavedSettings.setBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING, autoplay);
-
- lldebugs << "autoplay now = " << int(autoplay) << llendl;
-}
-
-void LLFloaterPreference::onCommitMediaEnabled()
-{
- LLCheckBoxCtrl *media_enabled_ctrl = getChild<LLCheckBoxCtrl>("media_enabled");
- bool enabled = media_enabled_ctrl->get();
- gSavedSettings.setBOOL("AudioStreamingMedia", enabled);
-}
-
-void LLFloaterPreference::onCommitMusicEnabled()
-{
- LLCheckBoxCtrl *music_enabled_ctrl = getChild<LLCheckBoxCtrl>("music_enabled");
- bool enabled = music_enabled_ctrl->get();
- gSavedSettings.setBOOL("AudioStreamingMusic", enabled);
-}
-
void LLFloaterPreference::refresh()
{
LLPanel::refresh();
@@ -1053,17 +1003,6 @@ void LLFloaterPreference::onChangeQuality(const LLSD& data)
refresh();
}
-// static
-// DEV-24146 - needs to be removed at a later date. jan-2009
-void LLFloaterPreference::cleanupBadSetting()
-{
- if (gSavedPerAccountSettings.getString("BusyModeResponse2") == "|TOKEN COPY BusyModeResponse|")
- {
- llwarns << "cleaning old BusyModeResponse" << llendl;
- gSavedPerAccountSettings.setString("BusyModeResponse2", gSavedPerAccountSettings.getText("BusyModeResponse"));
- }
-}
-
void LLFloaterPreference::onClickSetKey()
{
LLVoiceSetKeyDialog* dialog = LLFloaterReg::showTypedInstance<LLVoiceSetKeyDialog>("voice_set_key", LLSD(), TRUE);
@@ -1082,9 +1021,17 @@ void LLFloaterPreference::setKey(KEY key)
void LLFloaterPreference::onClickSetMiddleMouse()
{
- childSetValue("modifier_combo", "MiddleMouse");
+ LLUICtrl* p2t_line_editor = getChild<LLUICtrl>("modifier_combo");
+
// update the control right away since we no longer wait for apply
- getChild<LLUICtrl>("modifier_combo")->onCommit();
+ p2t_line_editor->setControlValue(MIDDLE_MOUSE_CV);
+
+ //push2talk button "middle mouse" control value is in English, need to localize it for presentation
+ LLPanel* advanced_preferences = dynamic_cast<LLPanel*>(p2t_line_editor->getParent());
+ if (advanced_preferences)
+ {
+ p2t_line_editor->setValue(advanced_preferences->getString("middle_mouse"));
+ }
}
/*
void LLFloaterPreference::onClickSkipDialogs()
@@ -1167,10 +1114,8 @@ void LLFloaterPreference::onClickLogPath()
{
return; //Canceled!
}
- std::string chat_log_dir = picker.getDirName();
- std::string chat_log_top_folder= gDirUtilp->getBaseFileName(chat_log_dir);
- gSavedPerAccountSettings.setString("InstantMessageLogPath",chat_log_dir);
- gSavedPerAccountSettings.setString("InstantMessageLogFolder",chat_log_top_folder);
+
+ gSavedPerAccountSettings.setString("InstantMessageLogPath", picker.getDirName());
}
void LLFloaterPreference::setPersonalInfo(const std::string& visibility, bool im_via_email, const std::string& email)
@@ -1266,79 +1211,19 @@ void LLFloaterPreference::updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_b
}
}
-void LLFloaterPreference::onKeystrokeAspectRatio()
+void LLFloaterPreference::onChangeMaturity()
{
- getChild<LLCheckBoxCtrl>("aspect_auto_detect")->set(FALSE);
-}
+ U8 sim_access = gSavedSettings.getU32("PreferredMaturity");
-void LLFloaterPreference::applyResolution()
-{
- LLComboBox* ctrl_aspect_ratio = getChild<LLComboBox>( "aspect_ratio");
- gGL.flush();
- char aspect_ratio_text[ASPECT_RATIO_STR_LEN]; /*Flawfinder: ignore*/
- if (ctrl_aspect_ratio->getCurrentIndex() == -1)
- {
- // *Can't pass const char* from c_str() into strtok
- strncpy(aspect_ratio_text, ctrl_aspect_ratio->getSimple().c_str(), sizeof(aspect_ratio_text) -1); /*Flawfinder: ignore*/
- aspect_ratio_text[sizeof(aspect_ratio_text) -1] = '\0';
- char *element = strtok(aspect_ratio_text, ":/\\");
- if (!element)
- {
- sAspectRatio = 0.f; // will be clamped later
- }
- else
- {
- LLLocale locale(LLLocale::USER_LOCALE);
- sAspectRatio = (F32)atof(element);
- }
-
- // look for denominator
- element = strtok(NULL, ":/\\");
- if (element)
- {
- LLLocale locale(LLLocale::USER_LOCALE);
-
- F32 denominator = (F32)atof(element);
- if (denominator != 0.f)
- {
- sAspectRatio /= denominator;
- }
- }
- }
- else
- {
- sAspectRatio = (F32)ctrl_aspect_ratio->getValue().asReal();
- }
-
- // presumably, user entered a non-numeric value if aspect_ratio == 0.f
- if (sAspectRatio != 0.f)
- {
- sAspectRatio = llclamp(sAspectRatio, 0.2f, 5.f);
- gSavedSettings.setF32("FullScreenAspectRatio", sAspectRatio);
- }
-
- // Screen resolution
- S32 num_resolutions;
- LLWindow::LLWindowResolution* supported_resolutions =
- gViewerWindow->getWindow()->getSupportedResolutions(num_resolutions);
- S32 resIndex = getChild<LLComboBox>("fullscreen combo")->getCurrentIndex();
- if (resIndex == -1)
- {
- // use highest resolution if nothing selected
- resIndex = num_resolutions - 1;
- }
- gSavedSettings.setS32("FullScreenWidth", supported_resolutions[resIndex].mWidth);
- gSavedSettings.setS32("FullScreenHeight", supported_resolutions[resIndex].mHeight);
-
- gViewerWindow->requestResolutionUpdate(gSavedSettings.getBOOL("WindowFullScreen"));
-
- send_agent_update(TRUE);
-
- // Update enable/disable
- refresh();
-}
+ getChild<LLIconCtrl>("rating_icon_general")->setVisible(sim_access == SIM_ACCESS_PG
+ || sim_access == SIM_ACCESS_MATURE
+ || sim_access == SIM_ACCESS_ADULT);
+ getChild<LLIconCtrl>("rating_icon_moderate")->setVisible(sim_access == SIM_ACCESS_MATURE
+ || sim_access == SIM_ACCESS_ADULT);
+ getChild<LLIconCtrl>("rating_icon_adult")->setVisible(sim_access == SIM_ACCESS_ADULT);
+}
void LLFloaterPreference::applyUIColor(LLUICtrl* ctrl, const LLSD& param)
@@ -1393,54 +1278,12 @@ BOOL LLPanelPreference::postBuild()
childSetText("email_address",getString("log_in_to_change") );
// childSetText("busy_response", getString("log_in_to_change"));
}
-
-
- if(hasChild("aspect_ratio"))
- {
- // We used to set up fullscreen resolution and window size
- // controls here, see LLFloaterWindowSize::initWindowSizeControls()
-
- if (gSavedSettings.getBOOL("FullScreenAutoDetectAspectRatio"))
- {
- LLFloaterPreference::sAspectRatio = gViewerWindow->getDisplayAspectRatio();
- }
- else
- {
- LLFloaterPreference::sAspectRatio = gSavedSettings.getF32("FullScreenAspectRatio");
- }
-
- getChild<LLComboBox>("aspect_ratio")->setTextEntryCallback(boost::bind(&LLPanelPreference::setControlFalse, this, LLSD("FullScreenAutoDetectAspectRatio") ));
-
-
- S32 numerator = 0;
- S32 denominator = 0;
- fractionFromDecimal(LLFloaterPreference::sAspectRatio, numerator, denominator);
-
- LLUIString aspect_ratio_text = getString("aspect_ratio_text");
- if (numerator != 0)
- {
- aspect_ratio_text.setArg("[NUM]", llformat("%d", numerator));
- aspect_ratio_text.setArg("[DEN]", llformat("%d", denominator));
- }
- else
- {
- aspect_ratio_text = llformat("%.3f", LLFloaterPreference::sAspectRatio);
- }
-
- LLComboBox* ctrl_aspect_ratio = getChild<LLComboBox>( "aspect_ratio");
- //mCtrlAspectRatio->setCommitCallback(onSelectAspectRatio, this);
- // add default aspect ratios
- ctrl_aspect_ratio->add(aspect_ratio_text, &LLFloaterPreference::sAspectRatio, ADD_TOP);
- ctrl_aspect_ratio->setCurrentByIndex(0);
-
- refresh();
- }
//////////////////////PanelPrivacy ///////////////////
if (hasChild("media_enabled"))
{
bool media_enabled = gSavedSettings.getBOOL("AudioStreamingMedia");
- getChild<LLCheckBoxCtrl>("voice_call_friends_only_check")->setCommitCallback(boost::bind(&showFriendsOnlyWarning, _1, _2));
+
getChild<LLCheckBoxCtrl>("media_enabled")->set(media_enabled);
getChild<LLCheckBoxCtrl>("autoplay_enabled")->setEnabled(media_enabled);
}
@@ -1448,7 +1291,21 @@ BOOL LLPanelPreference::postBuild()
{
getChild<LLCheckBoxCtrl>("music_enabled")->set(gSavedSettings.getBOOL("AudioStreamingMusic"));
}
-
+ if (hasChild("voice_call_friends_only_check"))
+ {
+ getChild<LLCheckBoxCtrl>("voice_call_friends_only_check")->setCommitCallback(boost::bind(&showFriendsOnlyWarning, _1, _2));
+ }
+
+ // Panel Advanced
+ if (hasChild("modifier_combo"))
+ {
+ //localizing if push2talk button is set to middle mouse
+ if (MIDDLE_MOUSE_CV == childGetValue("modifier_combo").asString())
+ {
+ childSetValue("modifier_combo", getString("middle_mouse"));
+ }
+ }
+
apply();
return true;
}
diff --git a/indra/newview/llfloaterpreference.h b/indra/newview/llfloaterpreference.h
index 0827c7c2b2..b45e09db7d 100644
--- a/indra/newview/llfloaterpreference.h
+++ b/indra/newview/llfloaterpreference.h
@@ -80,6 +80,9 @@ public:
// refresh all the graphics preferences menus
static void refreshEnabledGraphics();
+ // translate user's busy response message according to current locale if message is default, otherwise do nothing
+ static void initBusyResponse();
+
protected:
void onBtnOK();
void onBtnCancel();
@@ -87,6 +90,9 @@ protected:
void onClickBrowserClearCache();
+ // set value of "BusyResponseChanged" in account settings depending on whether busy response
+ // string differs from default after user changes.
+ void onBusyResponseChanged();
// if the custom settings box is clicked
void onChangeCustom();
void updateMeterText(LLUICtrl* ctrl);
@@ -128,21 +134,18 @@ public:
void updateSliderText(LLSliderCtrl* ctrl, LLTextBox* text_box);
void onUpdateSliderText(LLUICtrl* ctrl, const LLSD& name);
- void onKeystrokeAspectRatio();
// void fractionFromDecimal(F32 decimal_val, S32& numerator, S32& denominator);
- void onCommitAutoDetectAspect();
void onCommitParcelMediaAutoPlayEnable();
void onCommitMediaEnabled();
void onCommitMusicEnabled();
void applyResolution();
+ void onChangeMaturity();
void applyUIColor(LLUICtrl* ctrl, const LLSD& param);
- void getUIColor(LLUICtrl* ctrl, const LLSD& param);
+ void getUIColor(LLUICtrl* ctrl, const LLSD& param);
void buildPopupLists();
static void refreshSkin(void* data);
- static void cleanupBadSetting();
- static F32 sAspectRatio;
private:
static std::string sSkin;
bool mGotPersonalInfo;
diff --git a/indra/newview/llfloaterproperties.cpp b/indra/newview/llfloaterproperties.cpp
index ff9002787c..30b654de24 100644
--- a/indra/newview/llfloaterproperties.cpp
+++ b/indra/newview/llfloaterproperties.cpp
@@ -38,12 +38,12 @@
#include "llcachename.h"
#include "lldbstrings.h"
#include "llfloaterreg.h"
-#include "llinventory.h"
#include "llagent.h"
#include "llbutton.h"
#include "llcheckboxctrl.h"
#include "llavataractions.h"
+#include "llinventorydefines.h"
#include "llinventoryobserver.h"
#include "llinventorymodel.h"
#include "lllineeditor.h"
@@ -130,9 +130,9 @@ BOOL LLFloaterProperties::postBuild()
{
// build the UI
// item name & description
- childSetPrevalidate("LabelItemName",&LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("LabelItemName",&LLTextValidate::validateASCIIPrintableNoPipe);
getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLFloaterProperties::onCommitName,this));
- childSetPrevalidate("LabelItemDesc",&LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("LabelItemDesc",&LLTextValidate::validateASCIIPrintableNoPipe);
getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLFloaterProperties:: onCommitDescription, this));
// Creator information
getChild<LLUICtrl>("BtnCreator")->setCommitCallback(boost::bind(&LLFloaterProperties::onClickCreator,this));
@@ -237,7 +237,7 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item)
// do not enable the UI for incomplete items.
LLViewerInventoryItem* i = (LLViewerInventoryItem*)item;
- BOOL is_complete = i->isComplete();
+ BOOL is_complete = i->isFinished();
const BOOL cannot_restrict_permissions = LLInventoryType::cannotRestrictPermissions(i->getInventoryType());
const BOOL is_calling_card = (i->getInventoryType() == LLInventoryType::IT_CALLINGCARD);
const LLPermissions& perm = item->getPermissions();
@@ -380,9 +380,9 @@ void LLFloaterProperties::refreshFromItem(LLInventoryItem* item)
if (item->getType() == LLAssetType::AT_OBJECT)
{
U32 flags = item->getFlags();
- slam_perm = flags & LLInventoryItem::II_FLAGS_OBJECT_SLAM_PERM;
- overwrite_everyone = flags & LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE;
- overwrite_group = flags & LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP;
+ slam_perm = flags & LLInventoryItemFlags::II_FLAGS_OBJECT_SLAM_PERM;
+ overwrite_everyone = flags & LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE;
+ overwrite_group = flags & LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP;
}
std::string perm_string;
@@ -683,7 +683,7 @@ void LLFloaterProperties::onCommitPermissions()
CheckNextOwnerTransfer->get(), PERM_TRANSFER);
}
if(perm != item->getPermissions()
- && item->isComplete())
+ && item->isFinished())
{
LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
new_item->setPermissions(perm);
@@ -693,7 +693,7 @@ void LLFloaterProperties::onCommitPermissions()
if((perm.getMaskNextOwner()!=item->getPermissions().getMaskNextOwner())
&& (item->getType() == LLAssetType::AT_OBJECT))
{
- flags |= LLInventoryItem::II_FLAGS_OBJECT_SLAM_PERM;
+ flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_SLAM_PERM;
}
// If everyone permissions have changed (and this is an object)
// then set the overwrite everyone permissions flag so they
@@ -701,7 +701,7 @@ void LLFloaterProperties::onCommitPermissions()
if ((perm.getMaskEveryone()!=item->getPermissions().getMaskEveryone())
&& (item->getType() == LLAssetType::AT_OBJECT))
{
- flags |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE;
+ flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE;
}
// If group permissions have changed (and this is an object)
// then set the overwrite group permissions flag so they
@@ -709,7 +709,7 @@ void LLFloaterProperties::onCommitPermissions()
if ((perm.getMaskGroup()!=item->getPermissions().getMaskGroup())
&& (item->getType() == LLAssetType::AT_OBJECT))
{
- flags |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP;
+ flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP;
}
new_item->setFlags(flags);
if(mObjectID.isNull())
@@ -813,7 +813,7 @@ void LLFloaterProperties::updateSaleInfo()
sale_info.setSaleType(LLSaleInfo::FS_NOT);
}
if(sale_info != item->getSaleInfo()
- && item->isComplete())
+ && item->isFinished())
{
LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
@@ -821,7 +821,7 @@ void LLFloaterProperties::updateSaleInfo()
if (item->getType() == LLAssetType::AT_OBJECT)
{
U32 flags = new_item->getFlags();
- flags |= LLInventoryItem::II_FLAGS_OBJECT_SLAM_SALE;
+ flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_SLAM_SALE;
new_item->setFlags(flags);
}
@@ -880,7 +880,11 @@ void LLFloaterProperties::dirtyAll()
iter != inst_list.end(); ++iter)
{
LLFloaterProperties* floater = dynamic_cast<LLFloaterProperties*>(*iter);
- floater->dirty();
+ llassert(floater); // else cast failed - wrong type D:
+ if (floater)
+ {
+ floater->dirty();
+ }
}
}
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index d54736e942..8c219cb3fd 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -610,7 +610,7 @@ void LLPanelRegionGeneralInfo::onClickKick()
parent_floater->addDependentFloater(child_floater);
}
-void LLPanelRegionGeneralInfo::onKickCommit(const std::vector<std::string>& names, const std::vector<LLUUID>& ids)
+void LLPanelRegionGeneralInfo::onKickCommit(const std::vector<std::string>& names, const uuid_vec_t& ids)
{
if (names.empty() || ids.empty()) return;
if(ids[0].notNull())
@@ -848,7 +848,7 @@ void LLPanelRegionDebugInfo::onClickChooseAvatar()
}
-void LLPanelRegionDebugInfo::callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids)
+void LLPanelRegionDebugInfo::callbackAvatarID(const std::vector<std::string>& names, const uuid_vec_t& ids)
{
if (ids.empty() || names.empty()) return;
mTargetAvatar = ids[0];
@@ -1531,7 +1531,7 @@ void LLPanelEstateInfo::onClickKickUser()
parent_floater->addDependentFloater(child_floater);
}
-void LLPanelEstateInfo::onKickUserCommit(const std::vector<std::string>& names, const std::vector<LLUUID>& ids)
+void LLPanelEstateInfo::onKickUserCommit(const std::vector<std::string>& names, const uuid_vec_t& ids)
{
if (names.empty() || ids.empty()) return;
@@ -1616,7 +1616,6 @@ bool LLPanelEstateInfo::isLindenEstate()
return (estate_id <= ESTATE_LAST_LINDEN);
}
-typedef std::vector<LLUUID> AgentOrGroupIDsVector;
struct LLEstateAccessChangeInfo
{
LLEstateAccessChangeInfo(const LLSD& sd)
@@ -1637,7 +1636,7 @@ struct LLEstateAccessChangeInfo
LLSD sd;
sd["name"] = mDialogName;
sd["operation"] = (S32)mOperationFlag;
- for (AgentOrGroupIDsVector::const_iterator it = mAgentOrGroupIDs.begin();
+ for (uuid_vec_t::const_iterator it = mAgentOrGroupIDs.begin();
it != mAgentOrGroupIDs.end();
++it)
{
@@ -1648,7 +1647,7 @@ struct LLEstateAccessChangeInfo
U32 mOperationFlag; // ESTATE_ACCESS_BANNED_AGENT_ADD, _REMOVE, etc.
std::string mDialogName;
- AgentOrGroupIDsVector mAgentOrGroupIDs; // List of agent IDs to apply to this change
+ uuid_vec_t mAgentOrGroupIDs; // List of agent IDs to apply to this change
};
// Special case callback for groups, since it has different callback format than names
@@ -1716,7 +1715,7 @@ bool LLPanelEstateInfo::accessAddCore2(const LLSD& notification, const LLSD& res
}
// static
-void LLPanelEstateInfo::accessAddCore3(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* data)
+void LLPanelEstateInfo::accessAddCore3(const std::vector<std::string>& names, const uuid_vec_t& ids, void* data)
{
LLEstateAccessChangeInfo* change_info = (LLEstateAccessChangeInfo*)data;
if (!change_info) return;
@@ -2923,8 +2922,7 @@ bool LLDispatchEstateUpdateInfo::operator()(
LLUUID owner_id(strings[1]);
regionp->setOwner(owner_id);
// Update estate owner name in UI
- std::string owner_name =
- LLSLURL::buildCommand("agent", owner_id, "inspect");
+ std::string owner_name = LLSLURL("agent", owner_id, "inspect").getSLURLString();
panel->setOwnerName(owner_name);
U32 estate_id = strtoul(strings[2].c_str(), NULL, 10);
diff --git a/indra/newview/llfloaterregioninfo.h b/indra/newview/llfloaterregioninfo.h
index 8d315bdb78..482ebb3303 100644
--- a/indra/newview/llfloaterregioninfo.h
+++ b/indra/newview/llfloaterregioninfo.h
@@ -168,7 +168,7 @@ public:
protected:
virtual BOOL sendUpdate();
void onClickKick();
- void onKickCommit(const std::vector<std::string>& names, const std::vector<LLUUID>& ids);
+ void onKickCommit(const std::vector<std::string>& names, const uuid_vec_t& ids);
static void onClickKickAll(void* userdata);
bool onKickAllCommit(const LLSD& notification, const LLSD& response);
static void onClickMessage(void* userdata);
@@ -193,7 +193,7 @@ protected:
virtual BOOL sendUpdate();
void onClickChooseAvatar();
- void callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids);
+ void callbackAvatarID(const std::vector<std::string>& names, const uuid_vec_t& ids);
static void onClickReturn(void *);
bool callbackReturn(const LLSD& notification, const LLSD& response);
static void onClickTopColliders(void*);
@@ -284,7 +284,7 @@ public:
// Core methods for all above add/remove button clicks
static void accessAddCore(U32 operation_flag, const std::string& dialog_name);
static bool accessAddCore2(const LLSD& notification, const LLSD& response);
- static void accessAddCore3(const std::vector<std::string>& names, const std::vector<LLUUID>& ids, void* data);
+ static void accessAddCore3(const std::vector<std::string>& names, const uuid_vec_t& ids, void* data);
static void accessRemoveCore(U32 operation_flag, const std::string& dialog_name, const std::string& list_ctrl_name);
static bool accessRemoveCore2(const LLSD& notification, const LLSD& response);
@@ -296,7 +296,7 @@ public:
// Send the actual EstateOwnerRequest "estateaccessdelta" message
static void sendEstateAccessDelta(U32 flags, const LLUUID& agent_id);
- void onKickUserCommit(const std::vector<std::string>& names, const std::vector<LLUUID>& ids);
+ void onKickUserCommit(const std::vector<std::string>& names, const uuid_vec_t& ids);
static void onClickMessageEstate(void* data);
bool onMessageCommit(const LLSD& notification, const LLSD& response);
diff --git a/indra/newview/llfloaterreporter.cpp b/indra/newview/llfloaterreporter.cpp
index 0f3c176cea..f7c8855bf6 100644
--- a/indra/newview/llfloaterreporter.cpp
+++ b/indra/newview/llfloaterreporter.cpp
@@ -84,6 +84,8 @@
#include "llassetuploadresponders.h"
#include "llagentui.h"
+#include "lltrans.h"
+
const U32 INCLUDE_SCREENSHOT = 0x01 << 0;
//-----------------------------------------------------------------------------
@@ -124,7 +126,9 @@ void LLFloaterReporter::processRegionInfo(LLMessageSystem* msg)
// virtual
BOOL LLFloaterReporter::postBuild()
{
- childSetText("abuse_location_edit", LLAgentUI::buildSLURL());
+ LLSLURL slurl;
+ LLAgentUI::buildSLURL(slurl);
+ childSetText("abuse_location_edit", slurl.getSLURLString());
enableControls(TRUE);
@@ -278,7 +282,6 @@ void LLFloaterReporter::getObjectInfo(const LLUUID& object_id)
{
object_owner.append("Unknown");
}
-
setFromAvatar(mObjectID, object_owner);
}
else
@@ -306,7 +309,7 @@ void LLFloaterReporter::onClickSelectAbuser()
gFloaterView->getParentFloater(this)->addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLFloaterReporter::callbackAvatarID, this, _1, _2), FALSE, TRUE ));
}
-void LLFloaterReporter::callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids)
+void LLFloaterReporter::callbackAvatarID(const std::vector<std::string>& names, const uuid_vec_t& ids)
{
if (ids.empty() || names.empty()) return;
@@ -323,7 +326,8 @@ void LLFloaterReporter::setFromAvatar(const LLUUID& avatar_id, const std::string
mAbuserID = mObjectID = avatar_id;
mOwnerName = avatar_name;
- std::string avatar_link = LLSLURL::buildCommand("agent", mObjectID, "inspect");
+ std::string avatar_link =
+ LLSLURL("agent", mObjectID, "inspect").getSLURLString();
childSetText("owner_name", avatar_link);
childSetText("object_name", avatar_name);
childSetText("abuser_name_edit", avatar_name);
@@ -372,8 +376,7 @@ void LLFloaterReporter::onClickSend(void *userdata)
return;
}
-
- LLUploadDialog::modalUploadDialog("Uploading...\n\nReport");
+ LLUploadDialog::modalUploadDialog(LLTrans::getString("uploading_abuse_report"));
// *TODO don't upload image if checkbox isn't checked
std::string url = gAgent.getRegion()->getCapability("SendUserReport");
std::string sshot_url = gAgent.getRegion()->getCapability("SendUserReportWithScreenshot");
@@ -503,7 +506,7 @@ void LLFloaterReporter::setPickedObjectProperties(const std::string& object_name
{
childSetText("object_name", object_name);
std::string owner_link =
- LLSLURL::buildCommand("agent", owner_id, "inspect");
+ LLSLURL("agent", owner_id, "inspect").getSLURLString();
childSetText("owner_name", owner_link);
childSetText("abuser_name_edit", owner_name);
mAbuserID = owner_id;
@@ -565,7 +568,7 @@ LLSD LLFloaterReporter::gatherReport()
mCopyrightWarningSeen = FALSE;
std::ostringstream summary;
- if (!LLViewerLogin::getInstance()->isInProductionGrid())
+ if (!LLGridManager::getInstance()->isInProductionGrid())
{
summary << "Preview ";
}
diff --git a/indra/newview/llfloaterreporter.h b/indra/newview/llfloaterreporter.h
index 7c6473f975..23784b7650 100644
--- a/indra/newview/llfloaterreporter.h
+++ b/indra/newview/llfloaterreporter.h
@@ -123,7 +123,7 @@ private:
void setPosBox(const LLVector3d &pos);
void enableControls(BOOL own_avatar);
void getObjectInfo(const LLUUID& object_id);
- void callbackAvatarID(const std::vector<std::string>& names, const std::vector<LLUUID>& ids);
+ void callbackAvatarID(const std::vector<std::string>& names, const uuid_vec_t& ids);
void setFromAvatar(const LLUUID& avatar_id, const std::string& avatar_name = LLStringUtil::null);
private:
diff --git a/indra/newview/llfloaterscriptdebug.cpp b/indra/newview/llfloaterscriptdebug.cpp
index eeea71cc4c..d6732a9d5c 100644
--- a/indra/newview/llfloaterscriptdebug.cpp
+++ b/indra/newview/llfloaterscriptdebug.cpp
@@ -104,6 +104,10 @@ void LLFloaterScriptDebug::addScriptLine(const std::string &utf8mesg, const std:
LLViewerObject* objectp = gObjectList.findObject(source_id);
std::string floater_label;
+ // Handle /me messages.
+ std::string prefix = utf8mesg.substr(0, 4);
+ std::string message = (prefix == "/me " || prefix == "/me'") ? user_name + utf8mesg.substr(3) : utf8mesg;
+
if (objectp)
{
objectp->setIcon(LLViewerTextureManager::getFetchedTextureFromFile("script_error.j2c", TRUE, LLViewerTexture::BOOST_UI));
@@ -121,14 +125,14 @@ void LLFloaterScriptDebug::addScriptLine(const std::string &utf8mesg, const std:
LLFloaterScriptDebugOutput* floaterp = LLFloaterReg::getTypedInstance<LLFloaterScriptDebugOutput>("script_debug_output", LLUUID::null);
if (floaterp)
{
- floaterp->addLine(utf8mesg, user_name, color);
+ floaterp->addLine(message, user_name, color);
}
// add to specific script instance floater
floaterp = LLFloaterReg::getTypedInstance<LLFloaterScriptDebugOutput>("script_debug_output", source_id);
if (floaterp)
{
- floaterp->addLine(utf8mesg, floater_label, color);
+ floaterp->addLine(message, floater_label, color);
}
}
diff --git a/indra/newview/llfloaterscriptlimits.cpp b/indra/newview/llfloaterscriptlimits.cpp
index 4194416a01..4792d761d8 100644
--- a/indra/newview/llfloaterscriptlimits.cpp
+++ b/indra/newview/llfloaterscriptlimits.cpp
@@ -110,7 +110,7 @@ BOOL LLFloaterScriptLimits::postBuild()
if(!mTab)
{
- llinfos << "Error! couldn't get scriptlimits_panels, aborting Script Information setup" << llendl;
+ llwarns << "Error! couldn't get scriptlimits_panels, aborting Script Information setup" << llendl;
return FALSE;
}
@@ -214,7 +214,7 @@ void fetchScriptLimitsRegionInfoResponder::result(const LLSD& content)
LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits");
if(!instance)
{
- llinfos << "Failed to get llfloaterscriptlimits instance" << llendl;
+ llwarns << "Failed to get llfloaterscriptlimits instance" << llendl;
}
}
@@ -227,7 +227,7 @@ void fetchScriptLimitsRegionInfoResponder::result(const LLSD& content)
void fetchScriptLimitsRegionInfoResponder::error(U32 status, const std::string& reason)
{
- llinfos << "Error from responder " << reason << llendl;
+ llwarns << "Error from responder " << reason << llendl;
}
void fetchScriptLimitsRegionSummaryResponder::result(const LLSD& content_ref)
@@ -281,26 +281,40 @@ void fetchScriptLimitsRegionSummaryResponder::result(const LLSD& content_ref)
OSMessageBox(nice_llsd.str(), "summary response:", 0);
- llinfos << "summary response:" << *content << llendl;
+ llwarns << "summary response:" << *content << llendl;
#endif
LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits");
if(!instance)
{
- llinfos << "Failed to get llfloaterscriptlimits instance" << llendl;
+ llwarns << "Failed to get llfloaterscriptlimits instance" << llendl;
}
else
{
LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels");
- LLPanelScriptLimitsRegionMemory* panel_memory = (LLPanelScriptLimitsRegionMemory*)tab->getChild<LLPanel>("script_limits_region_memory_panel");
- panel_memory->setRegionSummary(content);
+ if(tab)
+ {
+ LLPanelScriptLimitsRegionMemory* panel_memory = (LLPanelScriptLimitsRegionMemory*)tab->getChild<LLPanel>("script_limits_region_memory_panel");
+ if(panel_memory)
+ {
+ panel_memory->childSetValue("loading_text", LLSD(std::string("")));
+
+ LLButton* btn = panel_memory->getChild<LLButton>("refresh_list_btn");
+ if(btn)
+ {
+ btn->setEnabled(true);
+ }
+
+ panel_memory->setRegionSummary(content);
+ }
+ }
}
}
void fetchScriptLimitsRegionSummaryResponder::error(U32 status, const std::string& reason)
{
- llinfos << "Error from responder " << reason << llendl;
+ llwarns << "Error from responder " << reason << llendl;
}
void fetchScriptLimitsRegionDetailsResponder::result(const LLSD& content_ref)
@@ -383,7 +397,7 @@ result (map)
if(!instance)
{
- llinfos << "Failed to get llfloaterscriptlimits instance" << llendl;
+ llwarns << "Failed to get llfloaterscriptlimits instance" << llendl;
}
else
{
@@ -397,19 +411,19 @@ result (map)
}
else
{
- llinfos << "Failed to get scriptlimits memory panel" << llendl;
+ llwarns << "Failed to get scriptlimits memory panel" << llendl;
}
}
else
{
- llinfos << "Failed to get scriptlimits_panels" << llendl;
+ llwarns << "Failed to get scriptlimits_panels" << llendl;
}
}
}
void fetchScriptLimitsRegionDetailsResponder::error(U32 status, const std::string& reason)
{
- llinfos << "Error from responder " << reason << llendl;
+ llwarns << "Error from responder " << reason << llendl;
}
void fetchScriptLimitsAttachmentInfoResponder::result(const LLSD& content_ref)
@@ -471,7 +485,7 @@ void fetchScriptLimitsAttachmentInfoResponder::result(const LLSD& content_ref)
if(!instance)
{
- llinfos << "Failed to get llfloaterscriptlimits instance" << llendl;
+ llwarns << "Failed to get llfloaterscriptlimits instance" << llendl;
}
else
{
@@ -481,29 +495,46 @@ void fetchScriptLimitsAttachmentInfoResponder::result(const LLSD& content_ref)
LLPanelScriptLimitsAttachment* panel = (LLPanelScriptLimitsAttachment*)tab->getChild<LLPanel>("script_limits_my_avatar_panel");
if(panel)
{
+ panel->childSetValue("loading_text", LLSD(std::string("")));
+
+ LLButton* btn = panel->getChild<LLButton>("refresh_list_btn");
+ if(btn)
+ {
+ btn->setEnabled(true);
+ }
+
panel->setAttachmentDetails(content);
}
else
{
- llinfos << "Failed to get script_limits_my_avatar_panel" << llendl;
+ llwarns << "Failed to get script_limits_my_avatar_panel" << llendl;
}
}
else
{
- llinfos << "Failed to get scriptlimits_panels" << llendl;
+ llwarns << "Failed to get scriptlimits_panels" << llendl;
}
}
}
void fetchScriptLimitsAttachmentInfoResponder::error(U32 status, const std::string& reason)
{
- llinfos << "Error from responder " << reason << llendl;
+ llwarns << "Error from responder " << reason << llendl;
}
///----------------------------------------------------------------------------
// Memory Panel
///----------------------------------------------------------------------------
+LLPanelScriptLimitsRegionMemory::~LLPanelScriptLimitsRegionMemory()
+{
+ if(!mParcelId.isNull())
+ {
+ LLRemoteParcelInfoProcessor::getInstance()->removeObserver(mParcelId, this);
+ mParcelId.setNull();
+ }
+};
+
BOOL LLPanelScriptLimitsRegionMemory::getLandScriptResources()
{
LLSD body;
@@ -544,6 +575,11 @@ void LLPanelScriptLimitsRegionMemory::setParcelID(const LLUUID& parcel_id)
{
if (!parcel_id.isNull())
{
+ if(!mParcelId.isNull())
+ {
+ LLRemoteParcelInfoProcessor::getInstance()->removeObserver(mParcelId, this);
+ mParcelId.setNull();
+ }
LLRemoteParcelInfoProcessor::getInstance()->addObserver(parcel_id, this);
LLRemoteParcelInfoProcessor::getInstance()->sendParcelInfoRequest(parcel_id);
}
@@ -557,7 +593,7 @@ void LLPanelScriptLimitsRegionMemory::setParcelID(const LLUUID& parcel_id)
// virtual
void LLPanelScriptLimitsRegionMemory::setErrorStatus(U32 status, const std::string& reason)
{
- llerrs << "Can't handle remote parcel request."<< " Http Status: "<< status << ". Reason : "<< reason<<llendl;
+ llwarns << "Can't handle remote parcel request."<< " Http Status: "<< status << ". Reason : "<< reason<<llendl;
}
// callback from the name cache with an owner name to add to the list
@@ -597,7 +633,7 @@ void LLPanelScriptLimitsRegionMemory::setRegionDetails(LLSD content)
if(!list)
{
- llinfos << "Error getting the scripts_list control" << llendl;
+ llwarns << "Error getting the scripts_list control" << llendl;
return;
}
@@ -608,7 +644,7 @@ void LLPanelScriptLimitsRegionMemory::setRegionDetails(LLSD content)
std::string msg_parcels = LLTrans::getString("ScriptLimitsParcelsOwned", args_parcels);
childSetValue("parcels_listed", LLSD(msg_parcels));
- std::vector<LLUUID> names_requested;
+ uuid_vec_t names_requested;
// This makes the assumption that all objects will have the same set
// of attributes, ie they will all have, or none will have locations
@@ -734,8 +770,6 @@ void LLPanelScriptLimitsRegionMemory::setRegionDetails(LLSD content)
// save the structure to make object return easier
mContent = content;
-
- childSetValue("loading_text", LLSD(std::string("")));
}
void LLPanelScriptLimitsRegionMemory::setRegionSummary(LLSD content)
@@ -744,17 +778,17 @@ void LLPanelScriptLimitsRegionMemory::setRegionSummary(LLSD content)
{
mParcelMemoryUsed = content["summary"]["used"][0]["amount"].asInteger() / SIZE_OF_ONE_KB;
mParcelMemoryMax = content["summary"]["available"][0]["amount"].asInteger() / SIZE_OF_ONE_KB;
- mGotParcelMemoryUsed = TRUE;
+ mGotParcelMemoryUsed = true;
}
else if(content["summary"]["used"][1]["type"].asString() == std::string("memory"))
{
mParcelMemoryUsed = content["summary"]["used"][1]["amount"].asInteger() / SIZE_OF_ONE_KB;
mParcelMemoryMax = content["summary"]["available"][1]["amount"].asInteger() / SIZE_OF_ONE_KB;
- mGotParcelMemoryUsed = TRUE;
+ mGotParcelMemoryUsed = true;
}
else
{
- llinfos << "summary doesn't contain memory info" << llendl;
+ llwarns << "summary doesn't contain memory info" << llendl;
return;
}
@@ -762,17 +796,17 @@ void LLPanelScriptLimitsRegionMemory::setRegionSummary(LLSD content)
{
mParcelURLsUsed = content["summary"]["used"][0]["amount"].asInteger();
mParcelURLsMax = content["summary"]["available"][0]["amount"].asInteger();
- mGotParcelURLsUsed = TRUE;
+ mGotParcelURLsUsed = true;
}
else if(content["summary"]["used"][1]["type"].asString() == std::string("urls"))
{
mParcelURLsUsed = content["summary"]["used"][1]["amount"].asInteger();
mParcelURLsMax = content["summary"]["available"][1]["amount"].asInteger();
- mGotParcelURLsUsed = TRUE;
+ mGotParcelURLsUsed = true;
}
else
{
- llinfos << "summary doesn't contain urls info" << llendl;
+ llwarns << "summary doesn't contain urls info" << llendl;
return;
}
@@ -902,10 +936,10 @@ void LLPanelScriptLimitsRegionMemory::clearList()
list->operateOnAll(LLCtrlListInterface::OP_DELETE);
}
- mGotParcelMemoryUsed = FALSE;
- mGotParcelMemoryMax = FALSE;
- mGotParcelURLsUsed = FALSE;
- mGotParcelURLsMax = FALSE;
+ mGotParcelMemoryUsed = false;
+ mGotParcelMemoryMax = false;
+ mGotParcelURLsUsed = false;
+ mGotParcelURLsMax = false;
LLStringUtil::format_map_t args_parcel_memory;
std::string msg_empty_string("");
@@ -919,8 +953,6 @@ void LLPanelScriptLimitsRegionMemory::clearList()
// static
void LLPanelScriptLimitsRegionMemory::onClickRefresh(void* userdata)
{
- llinfos << "LLPanelRegionGeneralInfo::onClickRefresh" << llendl;
-
LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits");
if(instance)
{
@@ -930,6 +962,13 @@ void LLPanelScriptLimitsRegionMemory::onClickRefresh(void* userdata)
LLPanelScriptLimitsRegionMemory* panel_memory = (LLPanelScriptLimitsRegionMemory*)tab->getChild<LLPanel>("script_limits_region_memory_panel");
if(panel_memory)
{
+ //To stop people from hammering the refesh button and accidentally dosing themselves - enough requests can crash the viewer!
+ //turn the button off, then turn it on when we get a response
+ LLButton* btn = panel_memory->getChild<LLButton>("refresh_list_btn");
+ if(btn)
+ {
+ btn->setEnabled(false);
+ }
panel_memory->clearList();
panel_memory->StartRequestChain();
@@ -969,7 +1008,6 @@ void LLPanelScriptLimitsRegionMemory::showBeacon()
// static
void LLPanelScriptLimitsRegionMemory::onClickHighlight(void* userdata)
{
- llinfos << "LLPanelRegionGeneralInfo::onClickHighlight" << llendl;
LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits");
if(instance)
{
@@ -1075,7 +1113,6 @@ void LLPanelScriptLimitsRegionMemory::returnObjects()
// static
void LLPanelScriptLimitsRegionMemory::onClickReturn(void* userdata)
{
- llinfos << "LLPanelRegionGeneralInfo::onClickReturn" << llendl;
LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits");
if(instance)
{
@@ -1178,6 +1215,12 @@ void LLPanelScriptLimitsAttachment::setAttachmentDetails(LLSD content)
setAttachmentSummary(content);
childSetValue("loading_text", LLSD(std::string("")));
+
+ LLButton* btn = getChild<LLButton>("refresh_list_btn");
+ if(btn)
+ {
+ btn->setEnabled(true);
+ }
}
BOOL LLPanelScriptLimitsAttachment::postBuild()
@@ -1208,17 +1251,17 @@ void LLPanelScriptLimitsAttachment::setAttachmentSummary(LLSD content)
{
mAttachmentMemoryUsed = content["summary"]["used"][0]["amount"].asInteger() / SIZE_OF_ONE_KB;
mAttachmentMemoryMax = content["summary"]["available"][0]["amount"].asInteger() / SIZE_OF_ONE_KB;
- mGotAttachmentMemoryUsed = TRUE;
+ mGotAttachmentMemoryUsed = true;
}
else if(content["summary"]["used"][1]["type"].asString() == std::string("memory"))
{
mAttachmentMemoryUsed = content["summary"]["used"][1]["amount"].asInteger() / SIZE_OF_ONE_KB;
mAttachmentMemoryMax = content["summary"]["available"][1]["amount"].asInteger() / SIZE_OF_ONE_KB;
- mGotAttachmentMemoryUsed = TRUE;
+ mGotAttachmentMemoryUsed = true;
}
else
{
- llinfos << "attachment details don't contain memory summary info" << llendl;
+ llwarns << "attachment details don't contain memory summary info" << llendl;
return;
}
@@ -1226,17 +1269,17 @@ void LLPanelScriptLimitsAttachment::setAttachmentSummary(LLSD content)
{
mAttachmentURLsUsed = content["summary"]["used"][0]["amount"].asInteger();
mAttachmentURLsMax = content["summary"]["available"][0]["amount"].asInteger();
- mGotAttachmentURLsUsed = TRUE;
+ mGotAttachmentURLsUsed = true;
}
else if(content["summary"]["used"][1]["type"].asString() == std::string("urls"))
{
mAttachmentURLsUsed = content["summary"]["used"][1]["amount"].asInteger();
mAttachmentURLsMax = content["summary"]["available"][1]["amount"].asInteger();
- mGotAttachmentURLsUsed = TRUE;
+ mGotAttachmentURLsUsed = true;
}
else
{
- llinfos << "attachment details don't contain urls summary info" << llendl;
+ llwarns << "attachment details don't contain urls summary info" << llendl;
return;
}
@@ -1267,16 +1310,23 @@ void LLPanelScriptLimitsAttachment::setAttachmentSummary(LLSD content)
// static
void LLPanelScriptLimitsAttachment::onClickRefresh(void* userdata)
-{
- llinfos << "Refresh clicked" << llendl;
-
+{
LLFloaterScriptLimits* instance = LLFloaterReg::getTypedInstance<LLFloaterScriptLimits>("script_limits");
if(instance)
{
LLTabContainer* tab = instance->getChild<LLTabContainer>("scriptlimits_panels");
LLPanelScriptLimitsAttachment* panel_attachments = (LLPanelScriptLimitsAttachment*)tab->getChild<LLPanel>("script_limits_my_avatar_panel");
+ LLButton* btn = panel_attachments->getChild<LLButton>("refresh_list_btn");
+
+ //To stop people from hammering the refesh button and accidentally dosing themselves - enough requests can crash the viewer!
+ //turn the button off, then turn it on when we get a response
+ if(btn)
+ {
+ btn->setEnabled(false);
+ }
panel_attachments->clearList();
panel_attachments->requestAttachmentDetails();
+
return;
}
else
diff --git a/indra/newview/llfloaterscriptlimits.h b/indra/newview/llfloaterscriptlimits.h
index 4c1ecc1019..3c32b9f701 100644
--- a/indra/newview/llfloaterscriptlimits.h
+++ b/indra/newview/llfloaterscriptlimits.h
@@ -148,15 +148,12 @@ public:
: LLPanelScriptLimitsInfo(), LLRemoteParcelInfoObserver(),
mParcelId(LLUUID()),
- mGotParcelMemoryUsed(FALSE),
- mGotParcelMemoryMax(FALSE),
+ mGotParcelMemoryUsed(false),
+ mGotParcelMemoryMax(false),
mParcelMemoryMax(0),
mParcelMemoryUsed(0) {};
- ~LLPanelScriptLimitsRegionMemory()
- {
- LLRemoteParcelInfoProcessor::getInstance()->removeObserver(mParcelId, this);
- };
+ ~LLPanelScriptLimitsRegionMemory();
// LLPanel
virtual BOOL postBuild();
@@ -180,16 +177,16 @@ private:
LLSD mContent;
LLUUID mParcelId;
- BOOL mGotParcelMemoryUsed;
- BOOL mGotParcelMemoryUsedDetails;
- BOOL mGotParcelMemoryMax;
+ bool mGotParcelMemoryUsed;
+ bool mGotParcelMemoryUsedDetails;
+ bool mGotParcelMemoryMax;
S32 mParcelMemoryMax;
S32 mParcelMemoryUsed;
S32 mParcelMemoryUsedDetails;
- BOOL mGotParcelURLsUsed;
- BOOL mGotParcelURLsUsedDetails;
- BOOL mGotParcelURLsMax;
+ bool mGotParcelURLsUsed;
+ bool mGotParcelURLsUsedDetails;
+ bool mGotParcelURLsMax;
S32 mParcelURLsMax;
S32 mParcelURLsUsed;
S32 mParcelURLsUsedDetails;
@@ -217,7 +214,21 @@ class LLPanelScriptLimitsAttachment : public LLPanelScriptLimitsInfo
public:
LLPanelScriptLimitsAttachment()
- : LLPanelScriptLimitsInfo() {};
+ : LLPanelScriptLimitsInfo(),
+ mGotAttachmentMemoryUsed(false),
+ mGotAttachmentMemoryUsedDetails(false),
+ mGotAttachmentMemoryMax(false),
+ mAttachmentMemoryMax(0),
+ mAttachmentMemoryUsed(0),
+ mAttachmentMemoryUsedDetails(0),
+ mGotAttachmentURLsUsed(false),
+ mGotAttachmentURLsUsedDetails(false),
+ mGotAttachmentURLsMax(false),
+ mAttachmentURLsMax(0),
+ mAttachmentURLsUsed(0),
+ mAttachmentURLsUsedDetails(0)
+ {};
+
~LLPanelScriptLimitsAttachment()
{
};
@@ -233,16 +244,16 @@ public:
private:
- BOOL mGotAttachmentMemoryUsed;
- BOOL mGotAttachmentMemoryUsedDetails;
- BOOL mGotAttachmentMemoryMax;
+ bool mGotAttachmentMemoryUsed;
+ bool mGotAttachmentMemoryUsedDetails;
+ bool mGotAttachmentMemoryMax;
S32 mAttachmentMemoryMax;
S32 mAttachmentMemoryUsed;
S32 mAttachmentMemoryUsedDetails;
- BOOL mGotAttachmentURLsUsed;
- BOOL mGotAttachmentURLsUsedDetails;
- BOOL mGotAttachmentURLsMax;
+ bool mGotAttachmentURLsUsed;
+ bool mGotAttachmentURLsUsedDetails;
+ bool mGotAttachmentURLsMax;
S32 mAttachmentURLsMax;
S32 mAttachmentURLsUsed;
S32 mAttachmentURLsUsedDetails;
diff --git a/indra/newview/llfloatersearch.cpp b/indra/newview/llfloatersearch.cpp
index a7401fdb6f..76caa0cf91 100644
--- a/indra/newview/llfloatersearch.cpp
+++ b/indra/newview/llfloatersearch.cpp
@@ -118,11 +118,9 @@ void LLFloaterSearch::onOpen(const LLSD& key)
void LLFloaterSearch::onClose(bool app_quitting)
{
- if (! app_quitting)
- {
- // Show the blank home page ready for the next onOpen()
- mBrowser->navigateHome();
- }
+ // tear down the web view so we don't show the previous search
+ // result when the floater is opened next time
+ destroy();
}
void LLFloaterSearch::handleMediaEvent(LLPluginClassMedia *self, EMediaEvent event)
@@ -158,11 +156,6 @@ void LLFloaterSearch::search(const LLSD &key)
return;
}
- // display the blank home page first, to clear the display of
- // any previous search results while the new results load.
- // The home page is set in floater_search.xml as start_url.
- mBrowser->navigateHome();
-
// reset the god level warning as we're sending the latest state
childHide("refresh_search");
mSearchGodLevel = gAgent.getGodLevel();
diff --git a/indra/newview/llfloatersellland.cpp b/indra/newview/llfloatersellland.cpp
index e2b0c4b66f..9dddbd998a 100644
--- a/indra/newview/llfloatersellland.cpp
+++ b/indra/newview/llfloatersellland.cpp
@@ -94,14 +94,14 @@ private:
static void doSellLand(void *userdata);
bool onConfirmSale(const LLSD& notification, const LLSD& response);
static void doShowObjects(void *userdata);
- static bool callbackHighlightTransferable(const LLSD& notification, const LLSD& response);
- void callbackAvatarPick(const std::vector<std::string>& names, const std::vector<LLUUID>& ids);
+ void callbackAvatarPick(const std::vector<std::string>& names, const uuid_vec_t& ids);
public:
virtual BOOL postBuild();
bool setParcel(LLViewerRegion* region, LLParcelSelectionHandle parcel);
+ static bool callbackHighlightTransferable(const LLSD& notification, const LLSD& response);
};
// static
@@ -163,13 +163,14 @@ BOOL LLFloaterSellLandUI::postBuild()
{
childSetCommitCallback("sell_to", onChangeValue, this);
childSetCommitCallback("price", onChangeValue, this);
- childSetPrevalidate("price", LLLineEditor::prevalidateNonNegativeS32);
+ childSetPrevalidate("price", LLTextValidate::validateNonNegativeS32);
childSetCommitCallback("sell_objects", onChangeValue, this);
childSetAction("sell_to_select_agent", boost::bind( &LLFloaterSellLandUI::doSelectAgent, this));
childSetAction("cancel_btn", doCancel, this);
childSetAction("sell_btn", doSellLand, this);
childSetAction("show_objects", doShowObjects, this);
center();
+ getChild<LLUICtrl>("profile_scroll")->setTabStop(true);
return TRUE;
}
@@ -268,7 +269,7 @@ void LLFloaterSellLandUI::refreshUI()
std::string price_str = childGetValue("price").asString();
bool valid_price = false;
- valid_price = (price_str != "") && LLLineEditor::prevalidateNonNegativeS32(utf8str_to_wstring(price_str));
+ valid_price = (price_str != "") && LLTextValidate::validateNonNegativeS32(utf8str_to_wstring(price_str));
if (valid_price && mParcelActualArea > 0)
{
@@ -390,7 +391,7 @@ void LLFloaterSellLandUI::doSelectAgent()
addDependentFloater(LLFloaterAvatarPicker::show(boost::bind(&LLFloaterSellLandUI::callbackAvatarPick, this, _1, _2), FALSE, TRUE));
}
-void LLFloaterSellLandUI::callbackAvatarPick(const std::vector<std::string>& names, const std::vector<LLUUID>& ids)
+void LLFloaterSellLandUI::callbackAvatarPick(const std::vector<std::string>& names, const uuid_vec_t& ids)
{
LLParcel* parcel = mParcelSelection->getParcel();
@@ -422,11 +423,13 @@ void LLFloaterSellLandUI::doShowObjects(void *userdata)
send_parcel_select_objects(parcel->getLocalID(), RT_SELL);
+ // we shouldn't pass callback functor since it is registered in LLFunctorRegistration
LLNotificationsUtil::add("TransferObjectsHighlighted",
- LLSD(), LLSD(),
- &LLFloaterSellLandUI::callbackHighlightTransferable);
+ LLSD(), LLSD());
}
+static LLNotificationFunctorRegistration tr("TransferObjectsHighlighted", &LLFloaterSellLandUI::callbackHighlightTransferable);
+
// static
bool LLFloaterSellLandUI::callbackHighlightTransferable(const LLSD& notification, const LLSD& data)
{
diff --git a/indra/newview/llfloatersnapshot.cpp b/indra/newview/llfloatersnapshot.cpp
index a0031f0193..f3baa482a0 100644
--- a/indra/newview/llfloatersnapshot.cpp
+++ b/indra/newview/llfloatersnapshot.cpp
@@ -38,6 +38,7 @@
// Viewer includes
#include "llagent.h"
+#include "llagentcamera.h"
#include "llcallbacklist.h"
#include "llcriticaldamp.h"
#include "llui.h"
@@ -892,7 +893,7 @@ BOOL LLSnapshotLivePreview::onIdle( void* snapshot_preview )
previewp->mSnapshotUpToDate = TRUE;
previewp->generateThumbnailImage(TRUE) ;
- previewp->mPosTakenGlobal = gAgent.getCameraPositionGlobal();
+ previewp->mPosTakenGlobal = gAgentCamera.getCameraPositionGlobal();
previewp->mShineCountdown = 4; // wait a few frames to avoid animation glitch due to readback this frame
}
}
diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp
index 4edd09b02c..a42f6ee00f 100644
--- a/indra/newview/llfloatertools.cpp
+++ b/indra/newview/llfloatertools.cpp
@@ -38,7 +38,7 @@
#include "llcoord.h"
//#include "llgl.h"
-#include "llagent.h"
+#include "llagentcamera.h"
#include "llbutton.h"
#include "llcheckboxctrl.h"
#include "llcombobox.h"
@@ -237,6 +237,7 @@ BOOL LLFloaterTools::postBuild()
childSetValue("checkbox stretch textures",(BOOL)gSavedSettings.getBOOL("ScaleStretchTextures"));
mTextGridMode = getChild<LLTextBox>("text ruler mode");
mComboGridMode = getChild<LLComboBox>("combobox grid mode");
+ mCheckStretchUniformLabel = getChild<LLTextBox>("checkbox uniform label");
//
// Create Buttons
@@ -316,6 +317,7 @@ LLFloaterTools::LLFloaterTools(const LLSD& key)
mComboGridMode(NULL),
mCheckStretchUniform(NULL),
mCheckStretchTexture(NULL),
+ mCheckStretchUniformLabel(NULL),
mBtnRotateLeft(NULL),
mBtnRotateReset(NULL),
@@ -533,7 +535,7 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
}
// multiply by correction factor because volume sliders go [0, 0.5]
- childSetValue( "slider zoom", gAgent.getCameraZoomFraction() * 0.5f);
+ childSetValue( "slider zoom", gAgentCamera.getCameraZoomFraction() * 0.5f);
// Move buttons
BOOL move_visible = (tool == LLToolGrab::getInstance());
@@ -632,6 +634,7 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
//mCheckSelectLinked ->setVisible( edit_visible );
if (mCheckStretchUniform) mCheckStretchUniform->setVisible( edit_visible );
if (mCheckStretchTexture) mCheckStretchTexture->setVisible( edit_visible );
+ if (mCheckStretchUniformLabel) mCheckStretchUniformLabel->setVisible( edit_visible );
// Create buttons
BOOL create_visible = (tool == LLToolCompCreate::getInstance());
@@ -666,8 +669,8 @@ void LLFloaterTools::updatePopup(LLCoordGL center, MASK mask)
if (mCheckCopyCenters) mCheckCopyCenters ->setVisible( create_visible );
if (mCheckCopyRotates) mCheckCopyRotates ->setVisible( create_visible );
- if (mCheckCopyCenters) mCheckCopyCenters->setEnabled( mCheckCopySelection->get() );
- if (mCheckCopyRotates) mCheckCopyRotates->setEnabled( mCheckCopySelection->get() );
+ if (mCheckCopyCenters && mCheckCopySelection) mCheckCopyCenters->setEnabled( mCheckCopySelection->get() );
+ if (mCheckCopyRotates && mCheckCopySelection) mCheckCopyRotates->setEnabled( mCheckCopySelection->get() );
// Land buttons
BOOL land_visible = (tool == LLToolBrushLand::getInstance() || tool == LLToolSelectLand::getInstance() );
@@ -766,7 +769,7 @@ void LLFloaterTools::onClose(bool app_quitting)
// Different from handle_reset_view in that it doesn't actually
// move the camera if EditCameraMovement is not set.
- gAgent.resetView(gSavedSettings.getBOOL("EditCameraMovement"));
+ gAgentCamera.resetView(gSavedSettings.getBOOL("EditCameraMovement"));
// exit component selection mode
LLSelectMgr::getInstance()->promoteSelectionToRoot();
@@ -847,7 +850,7 @@ void commit_slider_zoom(LLUICtrl *ctrl)
{
// renormalize value, since max "volume" level is 0.5 for some reason
F32 zoom_level = (F32)ctrl->getValue().asReal() * 2.f; // / 0.5f;
- gAgent.setCameraZoomFraction(zoom_level);
+ gAgentCamera.setCameraZoomFraction(zoom_level);
}
void click_popup_rotate_left(void*)
@@ -1523,7 +1526,9 @@ void LLFloaterTools::updateMediaSettings()
mMediaSettings[ base_key + std::string( LLPanelContents::TENTATIVE_SUFFIX ) ] = ! identical;
// Auto play
- value_bool = default_media_data.getAutoPlay();
+ //value_bool = default_media_data.getAutoPlay();
+ // set default to auto play TRUE -- angela EXT-5172
+ value_bool = true;
struct functor_getter_auto_play : public LLSelectedTEGetFunctor< bool >
{
functor_getter_auto_play(const LLMediaEntry& entry) : mMediaEntry(entry) {}
@@ -1534,7 +1539,8 @@ void LLFloaterTools::updateMediaSettings()
if ( object->getTE(face) )
if ( object->getTE(face)->getMediaData() )
return object->getTE(face)->getMediaData()->getAutoPlay();
- return mMediaEntry.getAutoPlay();
+ //return mMediaEntry.getAutoPlay(); set default to auto play TRUE -- angela EXT-5172
+ return true;
};
const LLMediaEntry &mMediaEntry;
@@ -1547,7 +1553,9 @@ void LLFloaterTools::updateMediaSettings()
// Auto scale
- value_bool = default_media_data.getAutoScale();
+ // set default to auto scale TRUE -- angela EXT-5172
+ //value_bool = default_media_data.getAutoScale();
+ value_bool = true;
struct functor_getter_auto_scale : public LLSelectedTEGetFunctor< bool >
{
functor_getter_auto_scale(const LLMediaEntry& entry): mMediaEntry(entry) {}
@@ -1558,8 +1566,9 @@ void LLFloaterTools::updateMediaSettings()
if ( object->getTE(face) )
if ( object->getTE(face)->getMediaData() )
return object->getTE(face)->getMediaData()->getAutoScale();
- return mMediaEntry.getAutoScale();;
- };
+ // return mMediaEntry.getAutoScale(); set default to auto scale TRUE -- angela EXT-5172
+ return true;
+ };
const LLMediaEntry &mMediaEntry;
diff --git a/indra/newview/llfloatertools.h b/indra/newview/llfloatertools.h
index e1f3c9b78c..91431969bb 100644
--- a/indra/newview/llfloatertools.h
+++ b/indra/newview/llfloatertools.h
@@ -149,6 +149,10 @@ public:
LLCheckBoxCtrl* mCheckStretchUniform;
LLCheckBoxCtrl* mCheckStretchTexture;
+ // !HACK! Replacement of mCheckStretchUniform label because LLCheckBoxCtrl
+ // doesn't support word_wrap of its label. Need to fix truncation bug EXT-6658
+ LLTextBox* mCheckStretchUniformLabel;
+
LLButton *mBtnRotateLeft;
LLButton *mBtnRotateReset;
LLButton *mBtnRotateRight;
diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp
index c930e99bad..84ea353dab 100644
--- a/indra/newview/llfloatertopobjects.cpp
+++ b/indra/newview/llfloatertopobjects.cpp
@@ -283,8 +283,13 @@ void LLFloaterTopObjects::updateSelectionInfo()
std::string object_id_string = object_id.asString();
childSetValue("id_editor", LLSD(object_id_string));
- childSetValue("object_name_editor", list->getFirstSelected()->getColumn(1)->getValue().asString());
- childSetValue("owner_name_editor", list->getFirstSelected()->getColumn(2)->getValue().asString());
+ LLScrollListItem* sli = list->getFirstSelected();
+ llassert(sli);
+ if (sli)
+ {
+ childSetValue("object_name_editor", sli->getColumn(1)->getValue().asString());
+ childSetValue("owner_name_editor", sli->getColumn(2)->getValue().asString());
+ }
}
// static
@@ -310,7 +315,7 @@ void LLFloaterTopObjects::doToObjects(int action, bool all)
LLCtrlListInterface *list = childGetListInterface("objects_list");
if (!list || list->getItemCount() == 0) return;
- std::vector<LLUUID>::iterator id_itor;
+ uuid_vec_t::iterator id_itor;
bool start_message = true;
diff --git a/indra/newview/llfloatertopobjects.h b/indra/newview/llfloatertopobjects.h
index ee3c5d3cce..8fb89a3cc5 100644
--- a/indra/newview/llfloatertopobjects.h
+++ b/indra/newview/llfloatertopobjects.h
@@ -89,7 +89,7 @@ private:
std::string mMethod;
LLSD mObjectListData;
- std::vector<LLUUID> mObjectListIDs;
+ uuid_vec_t mObjectListIDs;
U32 mCurrentMode;
U32 mFlags;
diff --git a/indra/newview/llfloatertos.cpp b/indra/newview/llfloatertos.cpp
index 69ee8cd547..104827f4a3 100644
--- a/indra/newview/llfloatertos.cpp
+++ b/indra/newview/llfloatertos.cpp
@@ -57,7 +57,9 @@ LLFloaterTOS::LLFloaterTOS(const LLSD& data)
: LLModalDialog( data["message"].asString() ),
mMessage(data["message"].asString()),
mWebBrowserWindowId( 0 ),
- mLoadCompleteCount( 0 ),
+ mLoadingScreenLoaded(false),
+ mSiteAlive(false),
+ mRealNavigateBegun(false),
mReplyPumpName(data["reply_pump"].asString())
{
}
@@ -138,8 +140,10 @@ BOOL LLFloaterTOS::postBuild()
if ( web_browser )
{
web_browser->addObserver(this);
- gResponsePtr = LLIamHere::build( this );
- LLHTTPClient::get( getString( "real_url" ), gResponsePtr );
+
+ // Don't use the start_url parameter for this browser instance -- it may finish loading before we get to add our observer.
+ // Store the URL separately and navigate here instead.
+ web_browser->navigateTo( getString( "loading_url" ) );
}
return TRUE;
@@ -147,18 +151,28 @@ BOOL LLFloaterTOS::postBuild()
void LLFloaterTOS::setSiteIsAlive( bool alive )
{
+ mSiteAlive = alive;
+
// only do this for TOS pages
if (hasChild("tos_html"))
{
- LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("tos_html");
// if the contents of the site was retrieved
if ( alive )
{
// navigate to the "real" page
- web_browser->navigateTo( getString( "real_url" ) );
+ if(!mRealNavigateBegun && mSiteAlive)
+ {
+ LLMediaCtrl* web_browser = getChild<LLMediaCtrl>("tos_html");
+ if(web_browser)
+ {
+ mRealNavigateBegun = true;
+ web_browser->navigateTo( getString( "real_url" ) );
+ }
+ }
}
else
{
+ LL_INFOS("TOS") << "ToS page: ToS page unavailable!" << LL_ENDL;
// normally this is set when navigation to TOS page navigation completes (so you can't accept before TOS loads)
// but if the page is unavailable, we need to do this now
LLCheckBoxCtrl* tos_agreement = getChild<LLCheckBoxCtrl>("agree_chk");
@@ -169,7 +183,6 @@ void LLFloaterTOS::setSiteIsAlive( bool alive )
LLFloaterTOS::~LLFloaterTOS()
{
-
// tell the responder we're not here anymore
if ( gResponsePtr )
gResponsePtr->setParent( 0 );
@@ -194,7 +207,7 @@ void LLFloaterTOS::updateAgree(LLUICtrl*, void* userdata )
void LLFloaterTOS::onContinue( void* userdata )
{
LLFloaterTOS* self = (LLFloaterTOS*) userdata;
- llinfos << "User agrees with TOS." << llendl;
+ LL_INFOS("TOS") << "User agrees with TOS." << LL_ENDL;
if(self->mReplyPumpName != "")
{
@@ -208,7 +221,7 @@ void LLFloaterTOS::onContinue( void* userdata )
void LLFloaterTOS::onCancel( void* userdata )
{
LLFloaterTOS* self = (LLFloaterTOS*) userdata;
- llinfos << "User disagrees with TOS." << llendl;
+ LL_INFOS("TOS") << "User disagrees with TOS." << LL_ENDL;
LLNotificationsUtil::add("MustAgreeToLogIn", LLSD(), LLSD(), login_alert_done);
if(self->mReplyPumpName != "")
@@ -216,8 +229,13 @@ void LLFloaterTOS::onCancel( void* userdata )
LLEventPumps::instance().obtain(self->mReplyPumpName).post(LLSD(false));
}
- self->mLoadCompleteCount = 0; // reset counter for next time we come to TOS
- self->closeFloater(); // destroys this object
+ // reset state for next time we come to TOS
+ self->mLoadingScreenLoaded = false;
+ self->mSiteAlive = false;
+ self->mRealNavigateBegun = false;
+
+ // destroys this object
+ self->closeFloater();
}
//virtual
@@ -225,10 +243,16 @@ void LLFloaterTOS::handleMediaEvent(LLPluginClassMedia* /*self*/, EMediaEvent ev
{
if(event == MEDIA_EVENT_NAVIGATE_COMPLETE)
{
- // skip past the loading screen navigate complete
- if ( ++mLoadCompleteCount == 2 )
+ if(!mLoadingScreenLoaded)
+ {
+ mLoadingScreenLoaded = true;
+
+ gResponsePtr = LLIamHere::build( this );
+ LLHTTPClient::get( getString( "real_url" ), gResponsePtr );
+ }
+ else if(mRealNavigateBegun)
{
- llinfos << "NAVIGATE COMPLETE" << llendl;
+ LL_INFOS("TOS") << "TOS: NAVIGATE COMPLETE" << LL_ENDL;
// enable Agree to TOS radio button now that page has loaded
LLCheckBoxCtrl * tos_agreement = getChild<LLCheckBoxCtrl>("agree_chk");
tos_agreement->setEnabled( true );
diff --git a/indra/newview/llfloatertos.h b/indra/newview/llfloatertos.h
index 1d573e8170..d985ccbab0 100644
--- a/indra/newview/llfloatertos.h
+++ b/indra/newview/llfloatertos.h
@@ -66,9 +66,12 @@ public:
/*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event);
private:
+
std::string mMessage;
int mWebBrowserWindowId;
- int mLoadCompleteCount;
+ bool mLoadingScreenLoaded;
+ bool mSiteAlive;
+ bool mRealNavigateBegun;
std::string mReplyPumpName;
};
diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp
index c6e12476bd..1b6ef0e97a 100644
--- a/indra/newview/llfloateruipreview.cpp
+++ b/indra/newview/llfloateruipreview.cpp
@@ -41,6 +41,7 @@
#include "llfloateruipreview.h" // Own header
// Internal utility
+#include "lleventtimer.h"
#include "llrender.h"
#include "llsdutil.h"
#include "llxmltree.h"
@@ -91,7 +92,6 @@ static std::string get_xui_dir()
}
// Forward declarations to avoid header dependencies
-class LLEventTimer;
class LLColor;
class LLScrollListCtrl;
class LLComboBox;
@@ -266,11 +266,12 @@ private:
class LLPreviewedFloater : public LLFloater
{
public:
- LLPreviewedFloater(LLFloaterUIPreview* floater)
- : LLFloater(LLSD()),
+ LLPreviewedFloater(LLFloaterUIPreview* floater, const Params& params)
+ : LLFloater(LLSD(), params),
mFloaterUIPreview(floater)
{
}
+
virtual void draw();
BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
BOOL handleToolTip(S32 x, S32 y, MASK mask);
@@ -362,8 +363,7 @@ BOOL LLFadeEventTimer::tick()
if(NULL == mParent) // no more need to tick, so suicide
{
- delete this;
- return FALSE;
+ return TRUE;
}
// Set up colors
@@ -429,6 +429,7 @@ BOOL LLFloaterUIPreview::postBuild()
// Double-click opens the floater, for convenience
mFileList->setDoubleClickCallback(boost::bind(&LLFloaterUIPreview::onClickDisplayFloater, this, PRIMARY_FLOATER));
+ setDefaultBtn("display_floater");
// get pointers to buttons and link to callbacks
mLanguageSelection = main_panel_tmp->getChild<LLComboBox>("language_select_combo");
mLanguageSelection->setCommitCallback(boost::bind(&LLFloaterUIPreview::onLanguageComboSelect, this, mLanguageSelection));
@@ -825,7 +826,11 @@ void LLFloaterUIPreview::displayFloater(BOOL click, S32 ID, bool save)
return; // ignore click (this can only happen with empty list; otherwise an item is always selected)
}
- *floaterp = new LLPreviewedFloater(this);
+ LLFloater::Params p(LLFloater::getDefaultParams());
+ p.min_height=p.header_height;
+ p.min_width=10;
+
+ *floaterp = new LLPreviewedFloater(this, p);
if(!strncmp(path.c_str(),"floater_",8)
|| !strncmp(path.c_str(), "inspect_", 8)) // if it's a floater
@@ -875,6 +880,8 @@ void LLFloaterUIPreview::displayFloater(BOOL click, S32 ID, bool save)
}
else // if it is a panel...
{
+ (*floaterp)->setCanResize(true);
+
const LLFloater::Params& floater_params = LLFloater::getDefaultParams();
S32 floater_header_size = floater_params.header_height;
diff --git a/indra/newview/llfloaterurlentry.cpp b/indra/newview/llfloaterurlentry.cpp
index 91d0f0e370..0e802e9736 100644
--- a/indra/newview/llfloaterurlentry.cpp
+++ b/indra/newview/llfloaterurlentry.cpp
@@ -40,6 +40,7 @@
#include "llpanelface.h"
#include "llcombobox.h"
+#include "llmimetypes.h"
#include "llnotificationsutil.h"
#include "llurlhistory.h"
#include "lluictrlfactory.h"
@@ -69,16 +70,11 @@ public:
completeAny(status, mime_type);
}
- virtual void error( U32 status, const std::string& reason )
- {
- completeAny(status, "none/none");
- }
-
void completeAny(U32 status, const std::string& mime_type)
{
// Set empty type to none/none. Empty string is reserved for legacy parcels
// which have no mime type set.
- std::string resolved_mime_type = ! mime_type.empty() ? mime_type : "none/none";
+ std::string resolved_mime_type = ! mime_type.empty() ? mime_type : LLMIMETypes::getDefaultMimeType();
LLFloaterURLEntry* floater_url_entry = (LLFloaterURLEntry*)mParent.get();
if ( floater_url_entry )
floater_url_entry->headerFetchComplete( status, resolved_mime_type );
diff --git a/indra/newview/llfloatervoicedevicesettings.cpp b/indra/newview/llfloatervoicedevicesettings.cpp
index 638c9f1b8c..63365e3461 100644
--- a/indra/newview/llfloatervoicedevicesettings.cpp
+++ b/indra/newview/llfloatervoicedevicesettings.cpp
@@ -64,9 +64,6 @@ LLPanelVoiceDeviceSettings::LLPanelVoiceDeviceSettings()
// grab "live" mic volume level
mMicVolume = gSavedSettings.getF32("AudioLevelMic");
- // ask for new device enumeration
- // now do this in onOpen() instead...
- //gVoiceClient->refreshDeviceLists();
}
LLPanelVoiceDeviceSettings::~LLPanelVoiceDeviceSettings()
@@ -105,7 +102,7 @@ void LLPanelVoiceDeviceSettings::draw()
refresh();
// let user know that volume indicator is not yet available
- bool is_in_tuning_mode = gVoiceClient->inTuningMode();
+ bool is_in_tuning_mode = LLVoiceClient::getInstance()->inTuningMode();
childSetVisible("wait_text", !is_in_tuning_mode);
LLPanel::draw();
@@ -113,7 +110,7 @@ void LLPanelVoiceDeviceSettings::draw()
if (is_in_tuning_mode)
{
const S32 num_bars = 5;
- F32 voice_power = gVoiceClient->tuningGetEnergy() / LLVoiceClient::OVERDRIVEN_POWER_LEVEL;
+ F32 voice_power = LLVoiceClient::getInstance()->tuningGetEnergy() / LLVoiceClient::OVERDRIVEN_POWER_LEVEL;
S32 discrete_power = llmin(num_bars, llfloor(voice_power * (F32)num_bars + 0.1f));
for(S32 power_bar_idx = 0; power_bar_idx < num_bars; power_bar_idx++)
@@ -194,13 +191,13 @@ void LLPanelVoiceDeviceSettings::refresh()
LLSlider* volume_slider = getChild<LLSlider>("mic_volume_slider");
// set mic volume tuning slider based on last mic volume setting
F32 current_volume = (F32)volume_slider->getValue().asReal();
- gVoiceClient->tuningSetMicVolume(current_volume);
+ LLVoiceClient::getInstance()->tuningSetMicVolume(current_volume);
// Fill in popup menus
mCtrlInputDevices = getChild<LLComboBox>("voice_input_device");
mCtrlOutputDevices = getChild<LLComboBox>("voice_output_device");
- if(!gVoiceClient->deviceSettingsAvailable())
+ if(!LLVoiceClient::getInstance()->deviceSettingsAvailable())
{
// The combo boxes are disabled, since we can't get the device settings from the daemon just now.
// Put the currently set default (ONLY) in the box, and select it.
@@ -219,17 +216,16 @@ void LLPanelVoiceDeviceSettings::refresh()
}
else if (!mDevicesUpdated)
{
- LLVoiceClient::deviceList *devices;
-
- LLVoiceClient::deviceList::iterator iter;
+ LLVoiceDeviceList::const_iterator iter;
if(mCtrlInputDevices)
{
mCtrlInputDevices->removeall();
mCtrlInputDevices->add( getString("default_text"), ADD_BOTTOM );
- devices = gVoiceClient->getCaptureDevices();
- for(iter=devices->begin(); iter != devices->end(); iter++)
+ for(iter=LLVoiceClient::getInstance()->getCaptureDevices().begin();
+ iter != LLVoiceClient::getInstance()->getCaptureDevices().end();
+ iter++)
{
mCtrlInputDevices->add( *iter, ADD_BOTTOM );
}
@@ -245,8 +241,8 @@ void LLPanelVoiceDeviceSettings::refresh()
mCtrlOutputDevices->removeall();
mCtrlOutputDevices->add( getString("default_text"), ADD_BOTTOM );
- devices = gVoiceClient->getRenderDevices();
- for(iter=devices->begin(); iter != devices->end(); iter++)
+ for(iter= LLVoiceClient::getInstance()->getRenderDevices().begin();
+ iter != LLVoiceClient::getInstance()->getRenderDevices().end(); iter++)
{
mCtrlOutputDevices->add( *iter, ADD_BOTTOM );
}
@@ -268,37 +264,34 @@ void LLPanelVoiceDeviceSettings::initialize()
mDevicesUpdated = FALSE;
// ask for new device enumeration
- gVoiceClient->refreshDeviceLists();
+ LLVoiceClient::getInstance()->refreshDeviceLists();
// put voice client in "tuning" mode
- gVoiceClient->tuningStart();
+ LLVoiceClient::getInstance()->tuningStart();
LLVoiceChannel::suspend();
}
void LLPanelVoiceDeviceSettings::cleanup()
{
- if (gVoiceClient)
- {
- gVoiceClient->tuningStop();
- }
+ LLVoiceClient::getInstance()->tuningStop();
LLVoiceChannel::resume();
}
// static
void LLPanelVoiceDeviceSettings::onCommitInputDevice(LLUICtrl* ctrl, void* user_data)
{
- if(gVoiceClient)
+ if(LLVoiceClient::getInstance())
{
- gVoiceClient->setCaptureDevice(ctrl->getValue().asString());
+ LLVoiceClient::getInstance()->setCaptureDevice(ctrl->getValue().asString());
}
}
// static
void LLPanelVoiceDeviceSettings::onCommitOutputDevice(LLUICtrl* ctrl, void* user_data)
{
- if(gVoiceClient)
+ if(LLVoiceClient::getInstance())
{
- gVoiceClient->setRenderDevice(ctrl->getValue().asString());
+ LLVoiceClient::getInstance()->setRenderDevice(ctrl->getValue().asString());
}
}
diff --git a/indra/newview/llfloatervoiceeffect.cpp b/indra/newview/llfloatervoiceeffect.cpp
new file mode 100644
index 0000000000..ca1f142760
--- /dev/null
+++ b/indra/newview/llfloatervoiceeffect.cpp
@@ -0,0 +1,288 @@
+/**
+ * @file llfloatervoiceeffect.cpp
+ * @author Aimee
+ * @brief Selection and preview of voice effect.
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llfloatervoiceeffect.h"
+
+#include "llscrolllistctrl.h"
+#include "lltrans.h"
+#include "llweb.h"
+
+LLFloaterVoiceEffect::LLFloaterVoiceEffect(const LLSD& key)
+ : LLFloater(key)
+{
+ mCommitCallbackRegistrar.add("VoiceEffect.Record", boost::bind(&LLFloaterVoiceEffect::onClickRecord, this));
+ mCommitCallbackRegistrar.add("VoiceEffect.Play", boost::bind(&LLFloaterVoiceEffect::onClickPlay, this));
+ mCommitCallbackRegistrar.add("VoiceEffect.Stop", boost::bind(&LLFloaterVoiceEffect::onClickStop, this));
+// mCommitCallbackRegistrar.add("VoiceEffect.Activate", boost::bind(&LLFloaterVoiceEffect::onClickActivate, this));
+}
+
+// virtual
+LLFloaterVoiceEffect::~LLFloaterVoiceEffect()
+{
+ if(LLVoiceClient::instanceExists())
+ {
+ LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface();
+ if (effect_interface)
+ {
+ effect_interface->removeObserver(this);
+ }
+ }
+}
+
+// virtual
+BOOL LLFloaterVoiceEffect::postBuild()
+{
+ setDefaultBtn("record_btn");
+ getChild<LLButton>("record_btn")->setFocus(true);
+ childSetTextArg("voice_morphing_link", "[URL]", LLTrans::getString("voice_morphing_url"));
+
+ mVoiceEffectList = getChild<LLScrollListCtrl>("voice_effect_list");
+ if (mVoiceEffectList)
+ {
+ mVoiceEffectList->setCommitCallback(boost::bind(&LLFloaterVoiceEffect::onClickPlay, this));
+// mVoiceEffectList->setDoubleClickCallback(boost::bind(&LLFloaterVoiceEffect::onClickActivate, this));
+ }
+
+ LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface();
+ if (effect_interface)
+ {
+ effect_interface->addObserver(this);
+
+ // Disconnect from the current voice channel ready to record a voice sample for previewing
+ effect_interface->enablePreviewBuffer(true);
+ }
+
+ refreshEffectList();
+ updateControls();
+
+ return TRUE;
+}
+
+// virtual
+void LLFloaterVoiceEffect::onClose(bool app_quitting)
+{
+ LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface();
+ if (effect_interface)
+ {
+ effect_interface->enablePreviewBuffer(false);
+ }
+}
+
+void LLFloaterVoiceEffect::refreshEffectList()
+{
+ if (!mVoiceEffectList)
+ {
+ return;
+ }
+
+ LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface();
+ if (!effect_interface)
+ {
+ mVoiceEffectList->setEnabled(false);
+ return;
+ }
+
+ LL_DEBUGS("Voice")<< "Rebuilding Voice Morph list."<< LL_ENDL;
+
+ // Preserve selected items and scroll position
+ S32 scroll_pos = mVoiceEffectList->getScrollPos();
+ uuid_vec_t selected_items;
+ std::vector<LLScrollListItem*> items = mVoiceEffectList->getAllSelected();
+ for(std::vector<LLScrollListItem*>::const_iterator it = items.begin(); it != items.end(); it++)
+ {
+ selected_items.push_back((*it)->getUUID());
+ }
+
+ mVoiceEffectList->deleteAllItems();
+
+ {
+ // Add the "No Voice Morph" entry
+ LLSD element;
+
+ element["id"] = LLUUID::null;
+ element["columns"][NAME_COLUMN]["column"] = "name";
+ element["columns"][NAME_COLUMN]["value"] = getString("no_voice_effect");
+ element["columns"][NAME_COLUMN]["font"]["style"] = "BOLD";
+
+ LLScrollListItem* sl_item = mVoiceEffectList->addElement(element, ADD_BOTTOM);
+ // *HACK: Copied from llfloatergesture.cpp : ["font"]["style"] does not affect font style :(
+ if(sl_item)
+ {
+ ((LLScrollListText*)sl_item->getColumn(0))->setFontStyle(LLFontGL::BOLD);
+ }
+ }
+
+ // Add each Voice Morph template, if there are any (template list includes all usable effects)
+ const voice_effect_list_t& template_list = effect_interface->getVoiceEffectTemplateList();
+ if (!template_list.empty())
+ {
+ for (voice_effect_list_t::const_iterator it = template_list.begin(); it != template_list.end(); ++it)
+ {
+ const LLUUID& effect_id = it->second;
+ std::string effect_name = it->first;
+
+ LLSD effect_properties = effect_interface->getVoiceEffectProperties(effect_id);
+
+ // Tag the active effect.
+ if (effect_id == LLVoiceClient::instance().getVoiceEffectDefault())
+ {
+ effect_name += " " + getString("active_voice_effect");
+ }
+
+ // Tag available effects that are new this session
+ if (effect_properties["is_new"].asBoolean())
+ {
+ effect_name += " " + getString("new_voice_effect");
+ }
+
+ LLDate expiry_date = effect_properties["expiry_date"].asDate();
+ bool is_template_only = effect_properties["template_only"].asBoolean();
+
+ std::string font_style = "NORMAL";
+ if (!is_template_only)
+ {
+ font_style = "BOLD";
+ }
+
+ LLSD element;
+ element["id"] = effect_id;
+
+ element["columns"][NAME_COLUMN]["column"] = "name";
+ element["columns"][NAME_COLUMN]["value"] = effect_name;
+ element["columns"][NAME_COLUMN]["font"]["style"] = font_style;
+
+ element["columns"][1]["column"] = "expires";
+ if (!is_template_only)
+ {
+ element["columns"][DATE_COLUMN]["value"] = expiry_date;
+ element["columns"][DATE_COLUMN]["type"] = "date";
+ }
+ else {
+ element["columns"][DATE_COLUMN]["value"] = getString("unsubscribed_voice_effect");
+ }
+// element["columns"][DATE_COLUMN]["font"]["style"] = "NORMAL";
+
+ LLScrollListItem* sl_item = mVoiceEffectList->addElement(element, ADD_BOTTOM);
+ // *HACK: Copied from llfloatergesture.cpp : ["font"]["style"] does not affect font style :(
+ if(sl_item)
+ {
+ LLFontGL::StyleFlags style = is_template_only ? LLFontGL::NORMAL : LLFontGL::BOLD;
+ dynamic_cast<LLScrollListText*>(sl_item->getColumn(0))->setFontStyle(style);
+ }
+ }
+ }
+
+ // Re-select items that were selected before, and restore the scroll position
+ for(uuid_vec_t::iterator it = selected_items.begin(); it != selected_items.end(); it++)
+ {
+ mVoiceEffectList->selectByID(*it);
+ }
+ mVoiceEffectList->setScrollPos(scroll_pos);
+ mVoiceEffectList->setEnabled(true);
+}
+
+void LLFloaterVoiceEffect::updateControls()
+{
+ bool recording = false;
+
+ LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface();
+ if (effect_interface)
+ {
+ recording = effect_interface->isPreviewRecording();
+ }
+
+ getChild<LLButton>("record_btn")->setVisible(!recording);
+ getChild<LLButton>("record_stop_btn")->setVisible(recording);
+}
+
+// virtual
+void LLFloaterVoiceEffect::onVoiceEffectChanged(bool effect_list_updated)
+{
+ if (effect_list_updated)
+ {
+ refreshEffectList();
+ }
+ updateControls();
+}
+
+void LLFloaterVoiceEffect::onClickRecord()
+{
+ LL_DEBUGS("Voice") << "Record clicked" << LL_ENDL;
+ LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface();
+ if (effect_interface)
+ {
+ effect_interface->recordPreviewBuffer();
+ }
+ updateControls();
+}
+
+void LLFloaterVoiceEffect::onClickPlay()
+{
+ LL_DEBUGS("Voice") << "Play clicked" << LL_ENDL;
+ if (!mVoiceEffectList)
+ {
+ return;
+ }
+
+ const LLUUID& effect_id = mVoiceEffectList->getCurrentID();
+
+ LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface();
+ if (effect_interface)
+ {
+ effect_interface->playPreviewBuffer(effect_id);
+ }
+ updateControls();
+}
+
+void LLFloaterVoiceEffect::onClickStop()
+{
+ LL_DEBUGS("Voice") << "Stop clicked" << LL_ENDL;
+ LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface();
+ if (effect_interface)
+ {
+ effect_interface->stopPreviewBuffer();
+ }
+ updateControls();
+}
+
+//void LLFloaterVoiceEffect::onClickActivate()
+//{
+// LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface();
+// if (effect_interface && mVoiceEffectList)
+// {
+// effect_interface->setVoiceEffect(mVoiceEffectList->getCurrentID());
+// }
+//}
+
diff --git a/indra/newview/llfloatervoiceeffect.h b/indra/newview/llfloatervoiceeffect.h
new file mode 100644
index 0000000000..fe207a05c3
--- /dev/null
+++ b/indra/newview/llfloatervoiceeffect.h
@@ -0,0 +1,78 @@
+/**
+ * @file llfloatervoiceeffect.h
+ * @author Aimee
+ * @brief Selection and preview of voice effects.
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLFLOATERVOICEEFFECT_H
+#define LL_LLFLOATERVOICEEFFECT_H
+
+#include "llfloater.h"
+#include "llvoiceclient.h"
+
+class LLButton;
+class LLScrollListCtrl;
+
+class LLFloaterVoiceEffect
+ : public LLFloater
+ , public LLVoiceEffectObserver
+{
+public:
+ LOG_CLASS(LLFloaterVoiceEffect);
+
+ LLFloaterVoiceEffect(const LLSD& key);
+ virtual ~LLFloaterVoiceEffect();
+
+ virtual BOOL postBuild();
+ virtual void onClose(bool app_quitting);
+
+private:
+ enum ColumnIndex
+ {
+ NAME_COLUMN = 0,
+ DATE_COLUMN = 1,
+ };
+
+ void refreshEffectList();
+ void updateControls();
+
+ /// Called by voice effect provider when voice effect list is changed.
+ virtual void onVoiceEffectChanged(bool effect_list_updated);
+
+ void onClickRecord();
+ void onClickPlay();
+ void onClickStop();
+// void onClickActivate();
+
+ LLUUID mSelectedID;
+ LLScrollListCtrl* mVoiceEffectList;
+};
+
+#endif
diff --git a/indra/newview/llfloaterwater.cpp b/indra/newview/llfloaterwater.cpp
index 66a1f6701f..1bbee2625c 100644
--- a/indra/newview/llfloaterwater.cpp
+++ b/indra/newview/llfloaterwater.cpp
@@ -574,12 +574,10 @@ bool LLFloaterWater::deleteAlertCallback(const LLSD& notification, const LLSD& r
LLComboBox* combo_box = getChild<LLComboBox>("WaterPresetsCombo");
LLFloaterDayCycle* day_cycle = LLFloaterReg::findTypedInstance<LLFloaterDayCycle>("env_day_cycle");
LLComboBox* key_combo = NULL;
- LLMultiSliderCtrl* mult_sldr = NULL;
if (day_cycle)
{
key_combo = day_cycle->getChild<LLComboBox>("WaterKeyPresets");
- mult_sldr = day_cycle->getChild<LLMultiSliderCtrl>("WaterDayCycleKeys");
}
std::string name = combo_box->getSelectedValue().asString();
diff --git a/indra/newview/llfloaterwindlight.cpp b/indra/newview/llfloaterwindlight.cpp
index ea6fda7303..c1b15c578c 100644
--- a/indra/newview/llfloaterwindlight.cpp
+++ b/indra/newview/llfloaterwindlight.cpp
@@ -749,12 +749,10 @@ bool LLFloaterWindLight::deleteAlertCallback(const LLSD& notification, const LLS
LLComboBox* combo_box = getChild<LLComboBox>("WLPresetsCombo");
LLFloaterDayCycle* day_cycle = LLFloaterReg::findTypedInstance<LLFloaterDayCycle>("env_day_cycle");
LLComboBox* key_combo = NULL;
- LLMultiSliderCtrl* mult_sldr = NULL;
if (day_cycle)
{
key_combo = day_cycle->getChild<LLComboBox>("WLKeyPresets");
- mult_sldr = day_cycle->getChild<LLMultiSliderCtrl>("WLDayCycleKeys");
}
std::string name(combo_box->getSelectedValue().asString());
diff --git a/indra/newview/llfloaterworldmap.cpp b/indra/newview/llfloaterworldmap.cpp
index f4d4ea3553..152360a96e 100644
--- a/indra/newview/llfloaterworldmap.cpp
+++ b/indra/newview/llfloaterworldmap.cpp
@@ -41,6 +41,7 @@
#include "llfloaterworldmap.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llbutton.h"
#include "llcallingcard.h"
#include "llcombobox.h"
@@ -50,7 +51,9 @@
//#include "llfirstuse.h"
#include "llfloaterreg.h" // getTypedInstance()
#include "llfocusmgr.h"
+#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
+#include "llinventorymodelbackgroundfetch.h"
#include "llinventoryobserver.h"
#include "lllandmarklist.h"
#include "lllineeditor.h"
@@ -122,7 +125,7 @@ public:
}
// support the secondlife:///app/worldmap/{LOCATION}/{COORDS} SLapp
- const std::string region_name = params[0].asString();
+ const std::string region_name = LLURI::unescape(params[0].asString());
S32 x = (params.size() > 1) ? params[1].asInteger() : 128;
S32 y = (params.size() > 2) ? params[2].asInteger() : 128;
S32 z = (params.size() > 3) ? params[3].asInteger() : 0;
@@ -321,7 +324,7 @@ void LLFloaterWorldMap::onOpen(const LLSD& key)
// Start speculative download of landmarks
const LLUUID landmark_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
- gInventory.startBackgroundFetch(landmark_folder_id);
+ LLInventoryModelBackgroundFetch::instance().start(landmark_folder_id);
childSetFocus("location", TRUE);
gFocusMgr.triggerFocusFlash();
@@ -359,9 +362,7 @@ BOOL LLFloaterWorldMap::handleScrollWheel(S32 x, S32 y, S32 clicks)
{
if (!isMinimized() && isFrontmost())
{
- LLRect area;
- childGetRect("search_results", area);
- if(!area.pointInRect(x, y))
+ if(mPanel->pointInView(x, y))
{
F32 slider_value = (F32)childGetValue("zoom slider").asReal();
slider_value += ((F32)clicks * -0.3333f);
@@ -460,7 +461,7 @@ void LLFloaterWorldMap::draw()
childSetEnabled("Teleport", (BOOL)tracking_status);
// childSetEnabled("Clear", (BOOL)tracking_status);
childSetEnabled("Show Destination", (BOOL)tracking_status || LLWorldMap::getInstance()->isTracking());
- childSetEnabled("copy_slurl", (mSLURL.size() > 0) );
+ childSetEnabled("copy_slurl", (mSLURL.isValid()) );
setMouseOpaque(TRUE);
getDragHandle()->setMouseOpaque(TRUE);
@@ -659,14 +660,8 @@ void LLFloaterWorldMap::updateLocation()
childSetValue("location", agent_sim_name);
// Figure out where user is
- LLVector3d agentPos = gAgent.getPositionGlobal();
-
- S32 agent_x = llround( (F32)fmod( agentPos.mdV[VX], (F64)REGION_WIDTH_METERS ) );
- S32 agent_y = llround( (F32)fmod( agentPos.mdV[VY], (F64)REGION_WIDTH_METERS ) );
- S32 agent_z = llround( (F32)agentPos.mdV[VZ] );
-
// Set the current SLURL
- mSLURL = LLSLURL::buildSLURL(agent_sim_name, agent_x, agent_y, agent_z);
+ mSLURL = LLSLURL(agent_sim_name, gAgent.getPositionGlobal());
}
}
@@ -693,18 +688,15 @@ void LLFloaterWorldMap::updateLocation()
}
childSetValue("location", sim_name);
-
- F32 region_x = (F32)fmod( pos_global.mdV[VX], (F64)REGION_WIDTH_METERS );
- F32 region_y = (F32)fmod( pos_global.mdV[VY], (F64)REGION_WIDTH_METERS );
// simNameFromPosGlobal can fail, so don't give the user an invalid SLURL
if ( gotSimName )
{
- mSLURL = LLSLURL::buildSLURL(sim_name, llround(region_x), llround(region_y), llround((F32)pos_global.mdV[VZ]));
+ mSLURL = LLSLURL(sim_name, pos_global);
}
else
{ // Empty SLURL will disable the "Copy SLURL to clipboard" button
- mSLURL = "";
+ mSLURL = LLSLURL();
}
}
}
@@ -788,8 +780,11 @@ void LLFloaterWorldMap::friendsChanged()
if(avatar_id.notNull())
{
LLCtrlSelectionInterface *iface = childGetSelectionInterface("friend combo");
- if(!iface || !iface->setCurrentByID(avatar_id) ||
- !t.getBuddyInfo(avatar_id)->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION) || gAgent.isGodlike())
+ const LLRelationship* buddy_info = t.getBuddyInfo(avatar_id);
+ if(!iface ||
+ !iface->setCurrentByID(avatar_id) ||
+ (buddy_info && !buddy_info->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION)) ||
+ gAgent.isGodlike())
{
LLTracker::stopTracking(NULL);
}
@@ -1170,7 +1165,7 @@ void LLFloaterWorldMap::onClearBtn()
mTrackedStatus = LLTracker::TRACKING_NOTHING;
LLTracker::stopTracking((void *)(intptr_t)TRUE);
LLWorldMap::getInstance()->cancelTracking();
- mSLURL = ""; // Clear the SLURL since it's invalid
+ mSLURL = LLSLURL(); // Clear the SLURL since it's invalid
mSetToUserPosition = TRUE; // Revert back to the current user position
}
@@ -1193,10 +1188,10 @@ void LLFloaterWorldMap::onClickTeleportBtn()
void LLFloaterWorldMap::onCopySLURL()
{
- getWindow()->copyTextToClipboard(utf8str_to_wstring(mSLURL));
+ getWindow()->copyTextToClipboard(utf8str_to_wstring(mSLURL.getSLURLString()));
LLSD args;
- args["SLURL"] = mSLURL;
+ args["SLURL"] = mSLURL.getSLURLString();
LLNotificationsUtil::add("CopySLURL", args);
}
@@ -1219,12 +1214,12 @@ void LLFloaterWorldMap::centerOnTarget(BOOL animate)
{
// We've got the position finally, so we're no longer busy. JC
// getWindow()->decBusyCount();
- pos_global = LLTracker::getTrackedPositionGlobal() - gAgent.getCameraPositionGlobal();
+ pos_global = LLTracker::getTrackedPositionGlobal() - gAgentCamera.getCameraPositionGlobal();
}
}
else if(LLWorldMap::getInstance()->isTracking())
{
- pos_global = LLWorldMap::getInstance()->getTrackedPositionGlobal() - gAgent.getCameraPositionGlobal();;
+ pos_global = LLWorldMap::getInstance()->getTrackedPositionGlobal() - gAgentCamera.getCameraPositionGlobal();;
}
else
{
diff --git a/indra/newview/llfloaterworldmap.h b/indra/newview/llfloaterworldmap.h
index 00f5e788fb..52809ff830 100644
--- a/indra/newview/llfloaterworldmap.h
+++ b/indra/newview/llfloaterworldmap.h
@@ -43,6 +43,7 @@
#include "llhudtext.h"
#include "llmapimagetype.h"
#include "lltracker.h"
+#include "llslurl.h"
class LLEventInfo;
class LLFriendObserver;
@@ -183,7 +184,7 @@ private:
LLTracker::ETrackingStatus mTrackedStatus;
std::string mTrackedSimName;
std::string mTrackedAvatarName;
- std::string mSLURL;
+ LLSLURL mSLURL;
};
extern LLFloaterWorldMap* gFloaterWorldMap;
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index 5c65b2c293..f241d18a21 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -39,6 +39,7 @@
#include "llinventoryclipboard.h" // *TODO: remove this once hack below gone.
#include "llinventoryfilter.h"
#include "llinventoryfunctions.h"
+#include "llinventorymodelbackgroundfetch.h"
#include "llinventorypanel.h"
#include "llfoldertype.h"
#include "llfloaterinventory.h"// hacked in for the bonus context menu items.
@@ -87,6 +88,10 @@ const S32 MIN_ITEM_WIDTH_VISIBLE = LLFolderViewItem::ICON_WIDTH
+ /*first few characters*/ 40;
const S32 MINIMUM_RENAMER_WIDTH = 80;
+// *TODO: move in params in xml if necessary. Requires modification of LLFolderView & LLInventoryPanel Params.
+const S32 STATUS_TEXT_HPAD = 6;
+const S32 STATUS_TEXT_VPAD = 8;
+
enum {
SIGNAL_NO_KEYBOARD_FOCUS = 1,
SIGNAL_KEYBOARD_FOCUS = 2
@@ -179,13 +184,15 @@ LLFolderView::LLFolderView(const Params& p)
mSourceID(p.task_id),
mRenameItem( NULL ),
mNeedsScroll( FALSE ),
+ mEnableScroll( true ),
+ mUseLabelSuffix(p.use_label_suffix),
mPinningSelectedItem(FALSE),
mNeedsAutoSelect( FALSE ),
mAutoSelectOverride(FALSE),
mNeedsAutoRename(FALSE),
mDebugFilters(FALSE),
mSortOrder(LLInventoryFilter::SO_FOLDERS_BY_NAME), // This gets overridden by a pref immediately
- mFilter( new LLInventoryFilter(p.name) ),
+ mFilter( new LLInventoryFilter(p.title) ),
mShowSelectionContext(FALSE),
mShowSingleSelection(FALSE),
mArrangeGeneration(0),
@@ -195,7 +202,8 @@ LLFolderView::LLFolderView(const Params& p)
mCallbackRegistrar(NULL),
mParentPanel(p.parent_panel),
mUseEllipses(false),
- mDraggingOverItem(NULL)
+ mDraggingOverItem(NULL),
+ mStatusTextBox(NULL)
{
LLRect rect = p.rect;
LLRect new_rect(rect.mLeft, rect.mBottom + getRect().getHeight(), rect.mLeft + getRect().getWidth(), rect.mBottom);
@@ -221,16 +229,38 @@ LLFolderView::LLFolderView(const Params& p)
// Escape is handled by reverting the rename, not commiting it (default behavior)
LLLineEditor::Params params;
params.name("ren");
- params.rect(getRect());
+ params.rect(rect);
params.font(getLabelFontForStyle(LLFontGL::NORMAL));
params.max_length_bytes(DB_INV_ITEM_NAME_STR_LEN);
params.commit_callback.function(boost::bind(&LLFolderView::commitRename, this, _2));
- params.prevalidate_callback(&LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ params.prevalidate_callback(&LLTextValidate::validateASCIIPrintableNoPipe);
params.commit_on_focus_lost(true);
params.visible(false);
mRenamer = LLUICtrlFactory::create<LLLineEditor> (params);
addChild(mRenamer);
+ // Textbox
+ LLTextBox::Params text_p;
+ LLFontGL* font = getLabelFontForStyle(mLabelStyle);
+ LLRect new_r = LLRect(rect.mLeft + ICON_PAD,
+ rect.mTop - TEXT_PAD,
+ rect.mRight,
+ rect.mTop - TEXT_PAD - llfloor(font->getLineHeight()));
+ text_p.rect(new_r);
+ text_p.name(std::string(p.name));
+ text_p.font(font);
+ text_p.visible(false);
+ text_p.allow_html(true);
+ text_p.wrap(true); // allow multiline text. See EXT-7564, EXT-7047
+ // set text padding the same as in People panel. EXT-7047, EXT-4837
+ text_p.h_pad(STATUS_TEXT_HPAD);
+ text_p.v_pad(STATUS_TEXT_VPAD);
+ mStatusTextBox = LLUICtrlFactory::create<LLTextBox> (text_p);
+ mStatusTextBox->setFollowsLeft();
+ mStatusTextBox->setFollowsTop();
+ //addChild(mStatusTextBox);
+
+
// make the popup menu available
LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_inventory.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
if (!menu)
@@ -253,21 +283,14 @@ LLFolderView::~LLFolderView( void )
mScrollContainer = NULL;
mRenameItem = NULL;
mRenamer = NULL;
-
- if( gEditMenuHandler == this )
- {
- gEditMenuHandler = NULL;
- }
+ mStatusTextBox = NULL;
mAutoOpenItems.removeAllNodes();
gIdleCallbacks.deleteFunction(idle, this);
LLView::deleteViewByHandle(mPopupMenuHandle);
- if(mRenamer == gFocusMgr.getTopCtrl())
- {
- gFocusMgr.setTopCtrl(NULL);
- }
+ gViewerWindow->removePopup(mRenamer);
mAutoOpenItems.removeAllNodes();
clearSelection();
@@ -458,6 +481,13 @@ S32 LLFolderView::arrange( S32* unused_width, S32* unused_height, S32 filter_gen
}
}
+ if(!mHasVisibleChildren)// is there any filtered items ?
+ {
+ //Nope. We need to display status textbox, let's reserve some place for it
+ running_height = mStatusTextBox->getTextPixelHeight();
+ target_height = running_height;
+ }
+
LLRect scroll_rect = mScrollContainer->getContentWindowRect();
reshape( llmax(scroll_rect.getWidth(), total_width), running_height );
@@ -814,30 +844,33 @@ void LLFolderView::sanitizeSelection()
void LLFolderView::clearSelection()
{
- if (mSelectedItems.size() > 0)
+ for (selected_items_t::const_iterator item_it = mSelectedItems.begin();
+ item_it != mSelectedItems.end();
+ ++item_it)
{
- recursiveDeselect(FALSE);
- mSelectedItems.clear();
+ (*item_it)->setUnselected();
}
+
+ mSelectedItems.clear();
mSelectThisID.setNull();
}
-BOOL LLFolderView::getSelectionList(std::set<LLUUID> &selection) const
+std::set<LLUUID> LLFolderView::getSelectionList() const
{
+ std::set<LLUUID> selection;
for (selected_items_t::const_iterator item_it = mSelectedItems.begin();
item_it != mSelectedItems.end();
++item_it)
{
selection.insert((*item_it)->getListener()->getUUID());
}
-
- return (selection.size() != 0);
+ return selection;
}
BOOL LLFolderView::startDrag(LLToolDragAndDrop::ESource source)
{
std::vector<EDragAndDropType> types;
- std::vector<LLUUID> cargo_ids;
+ uuid_vec_t cargo_ids;
selected_items_t::iterator item_it;
BOOL can_drag = TRUE;
if (!mSelectedItems.empty())
@@ -874,7 +907,7 @@ void LLFolderView::draw()
LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
}
- LLFontGL* font = getLabelFontForStyle(mLabelStyle);
+ //LLFontGL* font = getLabelFontForStyle(mLabelStyle);
// if cursor has moved off of me during drag and drop
// close all auto opened folders
@@ -911,19 +944,42 @@ void LLFolderView::draw()
|| mFilter->getShowFolderState() == LLInventoryFilter::SHOW_ALL_FOLDERS)
{
mStatusText.clear();
+ mStatusTextBox->setVisible( FALSE );
}
else
{
- if (gInventory.backgroundFetchActive() || mCompletedFilterGeneration < mFilter->getMinRequiredGeneration())
+ if (LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() || mCompletedFilterGeneration < mFilter->getMinRequiredGeneration())
{
mStatusText = LLTrans::getString("Searching");
- font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
+ //font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
}
else
{
- mStatusText = LLTrans::getString(getFilter()->getEmptyLookupMessage());
- font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
+ LLStringUtil::format_map_t args;
+ args["[SEARCH_TERM]"] = LLURI::escape(getFilter()->getFilterSubStringOrig());
+ mStatusText = LLTrans::getString(getFilter()->getEmptyLookupMessage(), args);
+ //font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
}
+ mStatusTextBox->setValue(mStatusText);
+ mStatusTextBox->setVisible( TRUE );
+
+ // firstly reshape message textbox with current size. This is necessary to
+ // LLTextBox::getTextPixelHeight works properly
+ const LLRect local_rect = getLocalRect();
+ mStatusTextBox->setShape(local_rect);
+
+ // get preferable text height...
+ S32 pixel_height = mStatusTextBox->getTextPixelHeight();
+ bool height_changed = local_rect.getHeight() != pixel_height;
+ if (height_changed)
+ {
+ // ... if it does not match current height, lets rearrange current view.
+ // This will indirectly call ::arrange and reshape of the status textbox.
+ // We should call this method to also notify parent about required rect.
+ // See EXT-7564, EXT-7047.
+ arrangeFromRoot();
+ }
+
}
LLFolderViewFolder::draw();
@@ -942,12 +998,11 @@ void LLFolderView::finishRenamingItem( void )
mRenameItem->rename( mRenamer->getText() );
}
- gFocusMgr.setTopCtrl( NULL );
+ gViewerWindow->removePopup(mRenamer);
if( mRenameItem )
{
setSelectionFromRoot( mRenameItem, TRUE );
- mRenameItem = NULL;
}
// List is re-sorted alphabeticly, so scroll to make sure the selected item is visible.
@@ -959,7 +1014,7 @@ void LLFolderView::closeRenamer( void )
// will commit current name (which could be same as original name)
mRenamer->setFocus( FALSE );
mRenamer->setVisible( FALSE );
- gFocusMgr.setTopCtrl( NULL );
+ gViewerWindow->removePopup(mRenamer);
if( mRenameItem )
{
@@ -1389,9 +1444,9 @@ void LLFolderView::startRenamingSelectedItem( void )
mRenamer->setVisible( TRUE );
// set focus will fail unless item is visible
mRenamer->setFocus( TRUE );
- mRenamer->setTopLostCallback(boost::bind(onRenamerLost, _1));
- mRenamer->setFocusLostCallback(boost::bind(onRenamerLost, _1));
- gFocusMgr.setTopCtrl( mRenamer );
+ mRenamer->setTopLostCallback(boost::bind(&LLFolderView::onRenamerLost, this, _1));
+ mRenamer->setFocusLostCallback(boost::bind(&LLFolderView::onRenamerLost, this, _1));
+ gViewerWindow->addPopup(mRenamer);
}
}
@@ -1607,7 +1662,11 @@ BOOL LLFolderView::handleKeyHere( KEY key, MASK mask )
LLFolderViewItem* parent_folder = last_selected->getParentFolder();
if (!last_selected->isOpen() && parent_folder && parent_folder->getParentFolder())
{
- setSelection(parent_folder, FALSE, TRUE);
+ // Don't change selectin to hidden folder. See EXT-5328.
+ if (!parent_folder->getHidden())
+ {
+ setSelection(parent_folder, FALSE, TRUE);
+ }
}
else
{
@@ -1711,6 +1770,8 @@ BOOL LLFolderView::handleMouseDown( S32 x, S32 y, MASK mask )
mParentPanel->setFocus(TRUE);
+ LLEditMenuHandler::gEditMenuHandler = this;
+
return LLView::handleMouseDown( x, y, mask );
}
@@ -1795,7 +1856,9 @@ BOOL LLFolderView::handleRightMouseDown( S32 x, S32 y, MASK mask )
BOOL handled = childrenHandleRightMouseDown(x, y, mask) != NULL;
S32 count = mSelectedItems.size();
LLMenuGL* menu = (LLMenuGL*)mPopupMenuHandle.get();
- if(handled && (count > 0) && menu)
+ if ( handled
+ && ( count > 0 && (hasVisibleChildren() || mFilter->getShowFolderState() == LLInventoryFilter::SHOW_ALL_FOLDERS) ) // show menu only if selected items are visible
+ && menu )
{
if (mCallbackRegistrar)
mCallbackRegistrar->pushScope();
@@ -1868,7 +1931,7 @@ void LLFolderView::deleteAllChildren()
{
if(mRenamer == gFocusMgr.getTopCtrl())
{
- gFocusMgr.setTopCtrl(NULL);
+ gViewerWindow->removePopup(mRenamer);
}
LLView::deleteViewByHandle(mPopupMenuHandle);
mPopupMenuHandle = LLHandle<LLView>();
@@ -1880,7 +1943,7 @@ void LLFolderView::deleteAllChildren()
void LLFolderView::scrollToShowSelection()
{
- if (mSelectedItems.size())
+ if (mEnableScroll && mSelectedItems.size())
{
mNeedsScroll = TRUE;
}
@@ -2035,8 +2098,7 @@ bool LLFolderView::doToSelected(LLInventoryModel* model, const LLSD& userdata)
}
- std::set<LLUUID> selected_items;
- getSelectionList(selected_items);
+ std::set<LLUUID> selected_items = getSelectionList();
LLMultiPreview* multi_previewp = NULL;
LLMultiProperties* multi_propertiesp = NULL;
@@ -2065,8 +2127,7 @@ bool LLFolderView::doToSelected(LLInventoryModel* model, const LLSD& userdata)
if(!folder_item) continue;
LLInvFVBridge* bridge = (LLInvFVBridge*)folder_item->getListener();
if(!bridge) continue;
-
- bridge->performAction(this, model, action);
+ bridge->performAction(model, action);
}
LLFloater::setFloaterHost(NULL);
@@ -2130,6 +2191,15 @@ void LLFolderView::doIdle()
LLSelectFirstFilteredItem filter;
applyFunctorRecursively(filter);
}
+
+ // Open filtered folders for folder views with mAutoSelectOverride=TRUE.
+ // Used by LLPlacesFolderView.
+ if (mAutoSelectOverride && !mFilter->getFilterSubString().empty())
+ {
+ LLOpenFilteredFolders filter;
+ applyFunctorRecursively(filter);
+ }
+
scrollToShowSelection();
}
@@ -2266,7 +2336,7 @@ void LLFolderView::updateRenamerPosition()
bool LLFolderView::selectFirstItem()
{
for (folders_t::iterator iter = mFolders.begin();
- iter != mFolders.end();)
+ iter != mFolders.end();++iter)
{
LLFolderViewFolder* folder = (*iter );
if (folder->getVisible())
@@ -2303,7 +2373,7 @@ bool LLFolderView::selectLastItem()
}
}
for (folders_t::reverse_iterator iter = mFolders.rbegin();
- iter != mFolders.rend();)
+ iter != mFolders.rend();++iter)
{
LLFolderViewFolder* folder = (*iter);
if (folder->getVisible())
@@ -2345,9 +2415,9 @@ S32 LLFolderView::notify(const LLSD& info)
/// Local function definitions
///----------------------------------------------------------------------------
-//static
void LLFolderView::onRenamerLost( LLFocusableElement* renamer)
{
+ mRenameItem = NULL;
LLUICtrl* uictrl = dynamic_cast<LLUICtrl*>(renamer);
if (uictrl)
{
diff --git a/indra/newview/llfolderview.h b/indra/newview/llfolderview.h
index 56ebdfcf79..55eb543f5f 100644
--- a/indra/newview/llfolderview.h
+++ b/indra/newview/llfolderview.h
@@ -62,6 +62,7 @@ class LLLineEditor;
class LLMenuGL;
class LLScrollContainer;
class LLUICtrl;
+class LLTextBox;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLFolderViewFunctor
@@ -92,8 +93,10 @@ class LLFolderView : public LLFolderViewFolder, public LLEditMenuHandler
public:
struct Params : public LLInitParam::Block<Params, LLFolderViewFolder::Params>
{
- Mandatory<LLPanel*> parent_panel;
- Optional<LLUUID> task_id;
+ Mandatory<LLPanel*> parent_panel;
+ Optional<LLUUID> task_id;
+ Optional<std::string> title;
+ Optional<bool> use_label_suffix;
};
LLFolderView(const Params&);
virtual ~LLFolderView( void );
@@ -162,7 +165,7 @@ public:
virtual S32 extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items);
- virtual BOOL getSelectionList(std::set<LLUUID> &selection) const;
+ virtual std::set<LLUUID> getSelectionList() const;
// make sure if ancestor is selected, descendents are not
void sanitizeSelection();
@@ -228,6 +231,7 @@ public:
EAcceptance* accept,
std::string& tooltip_msg);
/*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
+ /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask) { setShowSelectionContext(FALSE); }
virtual void draw();
virtual void deleteAllChildren();
@@ -268,7 +272,9 @@ public:
void dumpSelectionInformation();
virtual S32 notify(const LLSD& info) ;
+ void setEnableScroll(bool enable_scroll) { mEnableScroll = enable_scroll; }
+ bool useLabelSuffix() { return mUseLabelSuffix; }
private:
void updateRenamerPosition();
@@ -276,7 +282,7 @@ protected:
LLScrollContainer* mScrollContainer; // NULL if this is not a child of a scroll container.
void commitRename( const LLSD& data );
- static void onRenamerLost( LLFocusableElement* renamer);
+ void onRenamerLost( LLFocusableElement* renamer);
void finishRenamingItem( void );
void closeRenamer( void );
@@ -299,11 +305,13 @@ protected:
LLLineEditor* mRenamer;
BOOL mNeedsScroll;
+ bool mEnableScroll;
BOOL mPinningSelectedItem;
LLRect mScrollConstraintRect;
BOOL mNeedsAutoSelect;
BOOL mAutoSelectOverride;
BOOL mNeedsAutoRename;
+ bool mUseLabelSuffix;
BOOL mDebugFilters;
U32 mSortOrder;
@@ -327,7 +335,7 @@ protected:
LLUUID mSelectThisID; // if non null, select this item
- LLPanel* mParentPanel;
+ LLPanel* mParentPanel;
/**
* Is used to determine if we need to cut text In LLFolderViewItem to avoid horizontal scroll.
@@ -344,6 +352,8 @@ protected:
public:
static F32 sAutoOpenTime;
+ LLTextBox* mStatusTextBox;
+
};
bool sort_item_name(LLFolderViewItem* a, LLFolderViewItem* b);
diff --git a/indra/newview/llfoldervieweventlistener.h b/indra/newview/llfoldervieweventlistener.h
index 12e100caf4..82f8a10cf3 100644
--- a/indra/newview/llfoldervieweventlistener.h
+++ b/indra/newview/llfoldervieweventlistener.h
@@ -37,6 +37,7 @@
#include "llinventorytype.h"
#include "llpermissionsflags.h"
#include "llpointer.h"
+#include "llwearabletype.h"
class LLFolderViewItem;
@@ -88,7 +89,8 @@ public:
virtual BOOL isUpToDate() const = 0;
virtual BOOL hasChildren() const = 0;
virtual LLInventoryType::EType getInventoryType() const = 0;
- virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action) = 0;
+ virtual void performAction(LLInventoryModel* model, std::string action) = 0;
+ virtual LLWearableType::EType getWearableType() const = 0;
// This method should be called when a drag begins. returns TRUE
// if the drag can begin, otherwise FALSE.
diff --git a/indra/newview/llfolderviewitem.cpp b/indra/newview/llfolderviewitem.cpp
index f154de39c9..50b35bfc69 100644
--- a/indra/newview/llfolderviewitem.cpp
+++ b/indra/newview/llfolderviewitem.cpp
@@ -38,6 +38,7 @@
#include "llfoldervieweventlistener.h"
#include "llinventorybridge.h" // for LLItemBridge in LLInventorySort::operator()
#include "llinventoryfilter.h"
+#include "llinventorymodelbackgroundfetch.h"
#include "llpanel.h"
#include "llviewercontrol.h" // gSavedSettings
#include "llviewerwindow.h" // Argh, only for setCursor()
@@ -95,6 +96,7 @@ void LLFolderViewItem::cleanupClass()
LLFolderViewItem::Params::Params()
: icon(),
icon_open(),
+ icon_overlay(),
root(),
listener(),
folder_arrow_image("folder_arrow_image"),
@@ -121,7 +123,6 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)
mHasVisibleChildren(FALSE),
mIndentation(0),
mItemHeight(p.item_height),
- mNumDescendantsSelected(0),
mPassedFilter(FALSE),
mLastFilterGeneration(-1),
mStringMatchOffset(std::string::npos),
@@ -133,6 +134,7 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)
mCreationDate(p.creation_date),
mIcon(p.icon),
mIconOpen(p.icon_open),
+ mIconOverlay(p.icon_overlay),
mListener(p.listener),
mHidden(false),
mShowLoadStatus(false)
@@ -256,11 +258,30 @@ void LLFolderViewItem::refreshFromListener()
// temporary attempt to display the inventory folder in the user locale.
// mantipov: *NOTE: be sure this code is synchronized with LLFriendCardsManager::findChildFolderUUID
// it uses the same way to find localized string
- if (LLFolderType::lookupIsProtectedType(preferred_type))
+
+ // HACK: EXT - 6028 ([HARD CODED]? Inventory > Library > "Accessories" folder)
+ // Translation of Accessories folder in Library inventory folder
+ bool accessories = false;
+ if(mLabel == std::string("Accessories"))
+ {
+ //To ensure that Accessories folder is in Library we have to check its parent folder.
+ //Due to parent LLFolderViewFloder is not set to this item yet we have to check its parent via Inventory Model
+ LLInventoryCategory* cat = gInventory.getCategory(mListener->getUUID());
+ if(cat)
+ {
+ const LLUUID& parent_folder_id = cat->getParentUUID();
+ accessories = (parent_folder_id == gInventory.getLibraryRootFolderID());
+ }
+ }
+
+ //"Accessories" inventory category has folder type FT_NONE. So, this folder
+ //can not be detected as protected with LLFolderType::lookupIsProtectedType
+ if (accessories || LLFolderType::lookupIsProtectedType(preferred_type))
{
LLTrans::findString(mLabel, "InvFolder " + mLabel);
};
+ setToolTip(mLabel);
setIcon(mListener->getIcon());
time_t creation_date = mListener->getCreationDate();
if (mCreationDate != creation_date)
@@ -268,8 +289,11 @@ void LLFolderViewItem::refreshFromListener()
mCreationDate = mListener->getCreationDate();
dirtyFilter();
}
- mLabelStyle = mListener->getLabelStyle();
- mLabelSuffix = mListener->getLabelSuffix();
+ if (mRoot->useLabelSuffix())
+ {
+ mLabelStyle = mListener->getLabelStyle();
+ mLabelSuffix = mListener->getLabelSuffix();
+ }
}
}
@@ -368,6 +392,12 @@ void LLFolderViewItem::extendSelectionFromRoot(LLFolderViewItem* selection)
getRoot()->extendSelection(selection, NULL, selected_items);
}
+std::set<LLUUID> LLFolderViewItem::getSelectionList() const
+{
+ std::set<LLUUID> selection;
+ return selection;
+}
+
EInventorySortGroup LLFolderViewItem::getSortGroup() const
{
return SG_ITEM;
@@ -418,11 +448,8 @@ S32 LLFolderViewItem::arrange( S32* width, S32* height, S32 filter_generation)
S32 LLFolderViewItem::getItemHeight()
{
- if (mHidden) return 0;
+ if (getHidden()) return 0;
- //S32 icon_height = mIcon->getHeight();
- //S32 label_height = llround(getLabelFontForStyle(mLabelStyle)->getLineHeight());
- //return llmax( icon_height, label_height ) + ICON_PAD;
return mItemHeight;
}
@@ -497,22 +524,6 @@ BOOL LLFolderViewItem::changeSelection(LLFolderViewItem* selection, BOOL selecte
return FALSE;
}
-void LLFolderViewItem::recursiveDeselect(BOOL deselect_self)
-{
- if (mIsSelected && deselect_self)
- {
- mIsSelected = FALSE;
-
- // update ancestors' count of selected descendents
- LLFolderViewFolder* parent_folder = getParentFolder();
- while(parent_folder)
- {
- parent_folder->mNumDescendantsSelected--;
- parent_folder = parent_folder->getParentFolder();
- }
- }
-}
-
BOOL LLFolderViewItem::isMovable()
{
@@ -611,6 +622,7 @@ const std::string& LLFolderViewItem::getSearchableLabel() const
LLViewerInventoryItem * LLFolderViewItem::getInventoryItem(void)
{
+ if (!getListener()) return NULL;
return gInventory.getItem(getListener()->getUUID());
}
@@ -821,32 +833,39 @@ BOOL LLFolderViewItem::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
return handled;
}
-
void LLFolderViewItem::draw()
{
- if (mHidden) return;
+ if (getHidden())
+ {
+ return;
+ }
static LLUIColor sFgColor = LLUIColorTable::instance().getColor("MenuItemEnabledColor", DEFAULT_WHITE);
static LLUIColor sHighlightBgColor = LLUIColorTable::instance().getColor("MenuItemHighlightBgColor", DEFAULT_WHITE);
static LLUIColor sHighlightFgColor = LLUIColorTable::instance().getColor("MenuItemHighlightFgColor", DEFAULT_WHITE);
- static LLUIColor sFocusOutlineColor =
- LLUIColorTable::instance().getColor("InventoryFocusOutlineColor", DEFAULT_WHITE);
+ static LLUIColor sFocusOutlineColor = LLUIColorTable::instance().getColor("InventoryFocusOutlineColor", DEFAULT_WHITE);
static LLUIColor sFilterBGColor = LLUIColorTable::instance().getColor("FilterBackgroundColor", DEFAULT_WHITE);
static LLUIColor sFilterTextColor = LLUIColorTable::instance().getColor("FilterTextColor", DEFAULT_WHITE);
- static LLUIColor sSuffixColor = LLUIColorTable::instance().getColor("InventoryItemSuffixColor", DEFAULT_WHITE);
+ static LLUIColor sSuffixColor = LLUIColorTable::instance().getColor("InventoryItemColor", DEFAULT_WHITE);
+ static LLUIColor sLibraryColor = LLUIColorTable::instance().getColor("InventoryItemLibraryColor", DEFAULT_WHITE);
+ static LLUIColor sLinkColor = LLUIColorTable::instance().getColor("InventoryItemLinkColor", DEFAULT_WHITE);
static LLUIColor sSearchStatusColor = LLUIColorTable::instance().getColor("InventorySearchStatusColor", DEFAULT_WHITE);
const Params& default_params = LLUICtrlFactory::getDefaultParams<LLFolderViewItem>();
const S32 TOP_PAD = default_params.item_top_pad;
+ const S32 FOCUS_LEFT = 1;
+ const LLFontGL* font = getLabelFontForStyle(mLabelStyle);
- bool possibly_has_children = false;
- bool up_to_date = mListener && mListener->isUpToDate();
- if((up_to_date && hasVisibleChildren() ) || // we fetched our children and some of them have passed the filter...
- (!up_to_date && mListener && mListener->hasChildren())) // ...or we know we have children but haven't fetched them (doesn't obey filter)
- {
- possibly_has_children = true;
- }
- if(/*mControlLabel[0] != '\0' && */possibly_has_children)
+ const BOOL in_inventory = getListener() && gInventory.isObjectDescendentOf(getListener()->getUUID(), gInventory.getRootFolderID());
+ const BOOL in_library = getListener() && gInventory.isObjectDescendentOf(getListener()->getUUID(), gInventory.getLibraryRootFolderID());
+
+ //--------------------------------------------------------------------------------//
+ // Draw open folder arrow
+ //
+ const bool up_to_date = mListener && mListener->isUpToDate();
+ const bool possibly_has_children = ((up_to_date && hasVisibleChildren()) || // we fetched our children and some of them have passed the filter...
+ (!up_to_date && mListener && mListener->hasChildren())); // ...or we know we have children but haven't fetched them (doesn't obey filter)
+ if (possibly_has_children)
{
LLUIImage* arrow_image = default_params.folder_arrow_image;
gl_draw_scaled_rotated_image(
@@ -854,22 +873,16 @@ void LLFolderViewItem::draw()
ARROW_SIZE, ARROW_SIZE, mControlLabelRotation, arrow_image->getImage(), sFgColor);
}
- // See also LLFolderView::updateRenamerPosition()
- F32 text_left = (F32)(ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + mIndentation);
-
- LLFontGL* font = getLabelFontForStyle(mLabelStyle);
- // If we have keyboard focus, draw selection filled
- BOOL show_context = getRoot()->getShowSelectionContext();
- BOOL filled = show_context || (getRoot()->getParentPanel()->hasFocus());
- const S32 FOCUS_LEFT = 1;
- S32 focus_top = getRect().getHeight();
- S32 focus_bottom = getRect().getHeight() - mItemHeight;
- bool folder_open = (getRect().getHeight() > mItemHeight + 4);
-
- // always render "current" item, only render other selected items if
- // mShowSingleSelection is FALSE
- if( mIsSelected )
+ //--------------------------------------------------------------------------------//
+ // Draw highlight for selected items
+ //
+ const BOOL show_context = getRoot()->getShowSelectionContext();
+ const BOOL filled = show_context || (getRoot()->getParentPanel()->hasFocus()); // If we have keyboard focus, draw selection filled
+ const S32 focus_top = getRect().getHeight();
+ const S32 focus_bottom = getRect().getHeight() - mItemHeight;
+ const bool folder_open = (getRect().getHeight() > mItemHeight + 4);
+ if (mIsSelected) // always render "current" item. Only render other selected items if mShowSingleSelection is FALSE
{
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
LLColor4 bg_color = sHighlightBgColor;
@@ -888,152 +901,173 @@ void LLFolderViewItem::draw()
bg_color.mV[VALPHA] = clamp_rescale(fade_time, 0.f, 0.4f, 0.f, bg_color.mV[VALPHA]);
}
}
-
- gl_rect_2d(
- FOCUS_LEFT,
- focus_top,
- getRect().getWidth() - 2,
- focus_bottom,
- bg_color, filled);
+ gl_rect_2d(FOCUS_LEFT,
+ focus_top,
+ getRect().getWidth() - 2,
+ focus_bottom,
+ bg_color, filled);
if (mIsCurSelection)
{
- gl_rect_2d(
- FOCUS_LEFT,
- focus_top,
- getRect().getWidth() - 2,
- focus_bottom,
- sFocusOutlineColor, FALSE);
+ gl_rect_2d(FOCUS_LEFT,
+ focus_top,
+ getRect().getWidth() - 2,
+ focus_bottom,
+ sFocusOutlineColor, FALSE);
}
if (folder_open)
{
- gl_rect_2d(
- FOCUS_LEFT,
- focus_bottom + 1, // overlap with bottom edge of above rect
- getRect().getWidth() - 2,
- 0,
- sFocusOutlineColor, FALSE);
+ gl_rect_2d(FOCUS_LEFT,
+ focus_bottom + 1, // overlap with bottom edge of above rect
+ getRect().getWidth() - 2,
+ 0,
+ sFocusOutlineColor, FALSE);
if (show_context)
{
- gl_rect_2d(
- FOCUS_LEFT,
- focus_bottom + 1,
- getRect().getWidth() - 2,
- 0,
- sHighlightBgColor, TRUE);
+ gl_rect_2d(FOCUS_LEFT,
+ focus_bottom + 1,
+ getRect().getWidth() - 2,
+ 0,
+ sHighlightBgColor, TRUE);
}
}
}
+
+ //--------------------------------------------------------------------------------//
+ // Draw DragNDrop highlight
+ //
if (mDragAndDropTarget)
{
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
- gl_rect_2d(
- FOCUS_LEFT,
- focus_top,
- getRect().getWidth() - 2,
- focus_bottom,
- sHighlightBgColor, FALSE);
+ gl_rect_2d(FOCUS_LEFT,
+ focus_top,
+ getRect().getWidth() - 2,
+ focus_bottom,
+ sHighlightBgColor, FALSE);
if (folder_open)
{
- gl_rect_2d(
- FOCUS_LEFT,
- focus_bottom + 1, // overlap with bottom edge of above rect
- getRect().getWidth() - 2,
- 0,
- sHighlightBgColor, FALSE);
+ gl_rect_2d(FOCUS_LEFT,
+ focus_bottom + 1, // overlap with bottom edge of above rect
+ getRect().getWidth() - 2,
+ 0,
+ sHighlightBgColor, FALSE);
}
mDragAndDropTarget = FALSE;
}
- S32 icon_x = mIndentation + ARROW_SIZE + TEXT_PAD;
- // First case is used for open folders
- if (!mIconOpen.isNull() && (llabs(mControlLabelRotation) > 80))
+ const LLViewerInventoryItem *item = getInventoryItem();
+ const BOOL highlight_link = mIconOverlay && item && item->getIsLinkType();
+ //--------------------------------------------------------------------------------//
+ // Draw open icon
+ //
+ const S32 icon_x = mIndentation + ARROW_SIZE + TEXT_PAD;
+ if (!mIconOpen.isNull() && (llabs(mControlLabelRotation) > 80)) // For open folders
{
mIconOpen->draw(icon_x, getRect().getHeight() - mIconOpen->getHeight() - TOP_PAD + 1);
}
- else if(mIcon)
+ else if (mIcon)
{
mIcon->draw(icon_x, getRect().getHeight() - mIcon->getHeight() - TOP_PAD + 1);
}
- if (!mLabel.empty())
+ if (highlight_link)
{
- // highlight filtered text
- BOOL debug_filters = getRoot()->getDebugFilters();
- LLColor4 color = ( (mIsSelected && filled) ? sHighlightFgColor : sFgColor );
- F32 right_x;
- F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD - (F32)TOP_PAD;
-
- if (debug_filters)
- {
- if (!getFiltered() && !possibly_has_children)
- {
- color.mV[VALPHA] *= 0.5f;
- }
+ mIconOverlay->draw(icon_x, getRect().getHeight() - mIcon->getHeight() - TOP_PAD + 1);
+ }
- LLColor4 filter_color = mLastFilterGeneration >= getRoot()->getFilter()->getCurrentGeneration() ? LLColor4(0.5f, 0.8f, 0.5f, 1.f) : LLColor4(0.8f, 0.5f, 0.5f, 1.f);
- LLFontGL::getFontMonospace()->renderUTF8(
- mStatusText, 0, text_left, y, filter_color,
- LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
- S32_MAX, S32_MAX, &right_x, FALSE );
- text_left = right_x;
- }
+ //--------------------------------------------------------------------------------//
+ // Exit if no label to draw
+ //
+ if (mLabel.empty())
+ {
+ return;
+ }
+ LLColor4 color = (mIsSelected && filled) ? sHighlightFgColor : sFgColor;
+ if (highlight_link) color = sLinkColor;
+ if (in_library) color = sLibraryColor;
- 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);
+ F32 right_x = 0;
+ F32 y = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD - (F32)TOP_PAD;
+ F32 text_left = (F32)(ARROW_SIZE + TEXT_PAD + ICON_WIDTH + ICON_PAD + mIndentation);
-// LLViewerInventoryCategory *item = 0;
-// if (getListener())
-// item = gInventory.getCategory(getListener()->getUUID());
- bool root_is_loading = false;
- if (getListener() && gInventory.isObjectDescendentOf(getListener()->getUUID(),gInventory.getRootFolderID()))
- {
- // Descendent of my inventory.
- root_is_loading = gInventory.myInventoryFetchInProgress();
- }
- if (getListener() && gInventory.isObjectDescendentOf(getListener()->getUUID(),gInventory.getLibraryRootFolderID()))
- {
- // Descendent of library
- root_is_loading = gInventory.libraryFetchInProgress();
- }
-
- if ( (mIsLoading && mTimeSinceRequestStart.getElapsedTimeF32() >= gSavedSettings.getF32("FolderLoadingMessageWaitTime"))
- || (LLInventoryModel::backgroundFetchActive() && root_is_loading && mShowLoadStatus) )
+ //--------------------------------------------------------------------------------//
+ // Highlight filtered text
+ //
+ if (getRoot()->getDebugFilters())
+ {
+ if (!getFiltered() && !possibly_has_children)
{
- 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);
+ color.mV[VALPHA] *= 0.5f;
}
+ LLColor4 filter_color = mLastFilterGeneration >= getRoot()->getFilter()->getCurrentGeneration() ?
+ LLColor4(0.5f, 0.8f, 0.5f, 1.f) :
+ LLColor4(0.8f, 0.5f, 0.5f, 1.f);
+ LLFontGL::getFontMonospace()->renderUTF8(mStatusText, 0, text_left, y, filter_color,
+ LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
+ S32_MAX, S32_MAX, &right_x, FALSE );
+ text_left = right_x;
+ }
+ //--------------------------------------------------------------------------------//
+ // Draw the actual label text
+ //
+ 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 (!mLabelSuffix.empty())
- {
- font->renderUTF8( mLabelSuffix, 0, right_x, y, sSuffixColor,
- LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
- S32_MAX, S32_MAX, &right_x, FALSE );
- }
+ //--------------------------------------------------------------------------------//
+ // Draw "Loading..." text
+ //
+ bool root_is_loading = false;
+ if (in_inventory)
+ {
+ root_is_loading = LLInventoryModelBackgroundFetch::instance().inventoryFetchInProgress();
+ }
+ if (in_library)
+ {
+ root_is_loading = LLInventoryModelBackgroundFetch::instance().libraryFetchInProgress();
+ }
+ if ((mIsLoading && mTimeSinceRequestStart.getElapsedTimeF32() >= gSavedSettings.getF32("FolderLoadingMessageWaitTime")) ||
+ (LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() && root_is_loading && (mShowLoadStatus || mHidden)))
+ {
+ 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);
+ }
+
+ //--------------------------------------------------------------------------------//
+ // Draw label suffix
+ //
+ if (!mLabelSuffix.empty())
+ {
+ font->renderUTF8( mLabelSuffix, 0, right_x, y, sSuffixColor,
+ LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
+ S32_MAX, S32_MAX, &right_x, FALSE );
+ }
- if (mStringMatchOffset != std::string::npos)
+ //--------------------------------------------------------------------------------//
+ // Highlight string match
+ //
+ if (mStringMatchOffset != std::string::npos)
+ {
+ // don't draw backgrounds for zero-length strings
+ S32 filter_string_length = getRoot()->getFilterSubString().size();
+ if (filter_string_length > 0)
{
- // don't draw backgrounds for zero-length strings
- S32 filter_string_length = getRoot()->getFilterSubString().size();
- if (filter_string_length > 0)
- {
- std::string combined_string = mLabel + mLabelSuffix;
- S32 left = llround(text_left) + font->getWidth(combined_string, 0, mStringMatchOffset) - 1;
- S32 right = left + font->getWidth(combined_string, mStringMatchOffset, filter_string_length) + 2;
- S32 bottom = llfloor(getRect().getHeight() - font->getLineHeight() - 3 - TOP_PAD);
- S32 top = getRect().getHeight() - TOP_PAD;
+ std::string combined_string = mLabel + mLabelSuffix;
+ S32 left = llround(text_left) + font->getWidth(combined_string, 0, mStringMatchOffset) - 1;
+ S32 right = left + font->getWidth(combined_string, mStringMatchOffset, filter_string_length) + 2;
+ S32 bottom = llfloor(getRect().getHeight() - font->getLineHeight() - 3 - TOP_PAD);
+ S32 top = getRect().getHeight() - TOP_PAD;
- LLUIImage* box_image = default_params.selection_image;
- LLRect box_rect(left, top, right, bottom);
- box_image->draw(box_rect, sFilterBGColor);
- F32 match_string_left = text_left + font->getWidthF32(combined_string, 0, mStringMatchOffset);
- F32 yy = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD - (F32)TOP_PAD;
- font->renderUTF8( combined_string, mStringMatchOffset, match_string_left, yy,
- sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
- filter_string_length, S32_MAX, &right_x, FALSE );
- }
+ LLUIImage* box_image = default_params.selection_image;
+ LLRect box_rect(left, top, right, bottom);
+ box_image->draw(box_rect, sFilterBGColor);
+ F32 match_string_left = text_left + font->getWidthF32(combined_string, 0, mStringMatchOffset);
+ F32 yy = (F32)getRect().getHeight() - font->getLineHeight() - (F32)TEXT_PAD - (F32)TOP_PAD;
+ font->renderUTF8( combined_string, mStringMatchOffset, match_string_left, yy,
+ sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW,
+ filter_string_length, S32_MAX, &right_x, FALSE );
}
}
}
@@ -1044,20 +1078,21 @@ void LLFolderViewItem::draw()
///----------------------------------------------------------------------------
LLFolderViewFolder::LLFolderViewFolder( const LLFolderViewItem::Params& p ):
-LLFolderViewItem( p ), // 0 = no create time
-mIsOpen(FALSE),
-mExpanderHighlighted(FALSE),
-mCurHeight(0.f),
-mTargetHeight(0.f),
-mAutoOpenCountdown(0.f),
-mSubtreeCreationDate(0),
-mAmTrash(LLFolderViewFolder::UNKNOWN),
-mLastArrangeGeneration( -1 ),
-mLastCalculatedWidth(0),
-mCompletedFilterGeneration(-1),
-mMostFilteredDescendantGeneration(-1),
-mNeedsSort(false)
-{}
+ LLFolderViewItem( p ), // 0 = no create time
+ mIsOpen(FALSE),
+ mExpanderHighlighted(FALSE),
+ mCurHeight(0.f),
+ mTargetHeight(0.f),
+ mAutoOpenCountdown(0.f),
+ mSubtreeCreationDate(0),
+ mAmTrash(LLFolderViewFolder::UNKNOWN),
+ mLastArrangeGeneration( -1 ),
+ mLastCalculatedWidth(0),
+ mCompletedFilterGeneration(-1),
+ mMostFilteredDescendantGeneration(-1),
+ mNeedsSort(false)
+{
+}
// Destroys the object
LLFolderViewFolder::~LLFolderViewFolder( void )
@@ -1315,7 +1350,7 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)
// when applying a filter, matching folders get their contents downloaded first
if (filter.isNotDefault() && getFiltered(filter.getMinRequiredGeneration()) && (mListener && !gInventory.isCategoryComplete(mListener->getUUID())))
{
- gInventory.startBackgroundFetch(mListener->getUUID());
+ LLInventoryModelBackgroundFetch::instance().start(mListener->getUUID());
}
// now query children
@@ -1339,10 +1374,6 @@ void LLFolderViewFolder::filter( LLInventoryFilter& filter)
if (folder->getFiltered() || folder->hasFilteredDescendants(filter.getMinRequiredGeneration()))
{
mMostFilteredDescendantGeneration = filter_generation;
- if (getRoot()->needsAutoSelect() && autoopen_folders)
- {
- folder->setOpenArrangeRecursively(TRUE);
- }
}
// just skip it, it has already been filtered
continue;
@@ -1463,7 +1494,6 @@ BOOL LLFolderViewFolder::setSelection(LLFolderViewItem* selection, BOOL openitem
{
rv = TRUE;
child_selected = TRUE;
- mNumDescendantsSelected++;
}
}
for (items_t::iterator iter = mItems.begin();
@@ -1474,7 +1504,6 @@ BOOL LLFolderViewFolder::setSelection(LLFolderViewItem* selection, BOOL openitem
{
rv = TRUE;
child_selected = TRUE;
- mNumDescendantsSelected++;
}
}
if(openitem && child_selected)
@@ -1507,14 +1536,6 @@ BOOL LLFolderViewFolder::changeSelection(LLFolderViewItem* selection,
folders_t::iterator fit = iter++;
if((*fit)->changeSelection(selection, selected))
{
- if (selected)
- {
- mNumDescendantsSelected++;
- }
- else
- {
- mNumDescendantsSelected--;
- }
rv = TRUE;
}
}
@@ -1524,14 +1545,6 @@ BOOL LLFolderViewFolder::changeSelection(LLFolderViewItem* selection,
items_t::iterator iit = iter++;
if((*iit)->changeSelection(selection, selected))
{
- if (selected)
- {
- mNumDescendantsSelected++;
- }
- else
- {
- mNumDescendantsSelected--;
- }
rv = TRUE;
}
}
@@ -1548,7 +1561,6 @@ S32 LLFolderViewFolder::extendSelection(LLFolderViewItem* selection, LLFolderVie
{
folders_t::iterator fit = iter++;
num_selected += (*fit)->extendSelection(selection, last_selected, selected_items);
- mNumDescendantsSelected += num_selected;
}
// handle selection of our immediate children...
@@ -1641,7 +1653,6 @@ S32 LLFolderViewFolder::extendSelection(LLFolderViewItem* selection, LLFolderVie
if (item->changeSelection(item, TRUE))
{
selected_items.put(item);
- mNumDescendantsSelected++;
num_selected++;
}
}
@@ -1652,7 +1663,6 @@ S32 LLFolderViewFolder::extendSelection(LLFolderViewItem* selection, LLFolderVie
if (selection->changeSelection(selection, TRUE))
{
selected_items.put(selection);
- mNumDescendantsSelected++;
num_selected++;
}
}
@@ -1660,47 +1670,6 @@ S32 LLFolderViewFolder::extendSelection(LLFolderViewItem* selection, LLFolderVie
return num_selected;
}
-void LLFolderViewFolder::recursiveDeselect(BOOL deselect_self)
-{
- // make sure we don't have negative values
- llassert(mNumDescendantsSelected >= 0);
-
- if (mIsSelected && deselect_self)
- {
- mIsSelected = FALSE;
-
- // update ancestors' count of selected descendents
- LLFolderViewFolder* parent_folder = getParentFolder();
- while(parent_folder)
- {
- parent_folder->mNumDescendantsSelected--;
- parent_folder = parent_folder->getParentFolder();
- }
- }
-
- if (0 == mNumDescendantsSelected)
- {
- return;
- }
-
- for (items_t::iterator iter = mItems.begin();
- iter != mItems.end();)
- {
- items_t::iterator iit = iter++;
- LLFolderViewItem* item = (*iit);
- item->recursiveDeselect(TRUE);
- }
-
- for (folders_t::iterator iter = mFolders.begin();
- iter != mFolders.end();)
- {
- folders_t::iterator fit = iter++;
- LLFolderViewFolder* folder = (*fit);
- folder->recursiveDeselect(TRUE);
- }
-
-}
-
void LLFolderViewFolder::destroyView()
{
for (items_t::iterator iter = mItems.begin();
@@ -1734,8 +1703,6 @@ BOOL LLFolderViewFolder::removeItem(LLFolderViewItem* item)
{
if(item->remove())
{
- //RN: this seem unneccessary as remove() moves to trash
- //removeView(item);
return TRUE;
}
return FALSE;
@@ -1750,7 +1717,6 @@ void LLFolderViewFolder::removeView(LLFolderViewItem* item)
return;
}
// deselect without traversing hierarchy
- item->recursiveDeselect(TRUE);
getRoot()->removeFromSelectionList(item);
extractItem(item);
delete item;
@@ -1859,10 +1825,9 @@ EInventorySortGroup LLFolderViewFolder::getSortGroup() const
return SG_TRASH_FOLDER;
}
- // Folders that can't be moved are 'system' folders.
if( mListener )
{
- if( !(mListener->isItemMovable()) )
+ if(LLFolderType::lookupIsProtectedType(mListener->getPreferredType()))
{
return SG_SYSTEM_FOLDER;
}
@@ -2548,8 +2513,12 @@ bool LLInventorySort::operator()(const LLFolderViewItem* const& a, const LLFolde
{
// *TODO: mantipov: probably it is better to add an appropriate method to LLFolderViewItem
// or to LLInvFVBridge
- S32 a_sort = (static_cast<const LLItemBridge*>(a->getListener()))->getItem()->getSortField();
- S32 b_sort = (static_cast<const LLItemBridge*>(b->getListener()))->getItem()->getSortField();
+ LLViewerInventoryItem* aitem = (static_cast<const LLItemBridge*>(a->getListener()))->getItem();
+ LLViewerInventoryItem* bitem = (static_cast<const LLItemBridge*>(b->getListener()))->getItem();
+ if (!aitem || !bitem)
+ return false;
+ S32 a_sort = aitem->getSortField();
+ S32 b_sort = bitem->getSortField();
return a_sort < b_sort;
}
}
diff --git a/indra/newview/llfolderviewitem.h b/indra/newview/llfolderviewitem.h
index be8e73a5a9..d6e4b2f556 100644
--- a/indra/newview/llfolderviewitem.h
+++ b/indra/newview/llfolderviewitem.h
@@ -97,6 +97,7 @@ public:
{
Optional<LLUIImage*> icon;
Optional<LLUIImage*> icon_open; // used for folders
+ Optional<LLUIImage*> icon_overlay; // for links
Optional<LLFolderView*> root;
Optional<LLFolderViewEventListener*> listener;
@@ -147,10 +148,10 @@ protected:
LLUIImagePtr mIcon;
std::string mStatusText;
LLUIImagePtr mIconOpen;
+ LLUIImagePtr mIconOverlay;
BOOL mHasVisibleChildren;
S32 mIndentation;
S32 mItemHeight;
- S32 mNumDescendantsSelected;
BOOL mPassedFilter;
S32 mLastFilterGeneration;
std::string::size_type mStringMatchOffset;
@@ -231,11 +232,8 @@ public:
// this method is used to group select items
virtual S32 extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items){ return FALSE; }
- // this method is used to group select items
- virtual void recursiveDeselect(BOOL deselect_self);
-
// gets multiple-element selection
- virtual BOOL getSelectionList(std::set<LLUUID> &selection) const {return TRUE;}
+ virtual std::set<LLUUID> getSelectionList() const;
// Returns true is this object and all of its children can be removed (deleted by user)
virtual BOOL isRemovable();
@@ -246,10 +244,10 @@ public:
// destroys this item recursively
virtual void destroyView();
- S32 getNumSelectedDescendants() { return mNumDescendantsSelected; }
-
BOOL isSelected() { return mIsSelected; }
+ void setUnselected() { mIsSelected = FALSE; }
+
void setIsCurSelection(BOOL select) { mIsCurSelection = select; }
BOOL getIsCurSelection() { return mIsCurSelection; }
@@ -441,8 +439,6 @@ public:
// this method is used to group select items
virtual S32 extendSelection(LLFolderViewItem* selection, LLFolderViewItem* last_selected, LLDynamicArray<LLFolderViewItem*>& items);
- virtual void recursiveDeselect(BOOL deselect_self);
-
// Returns true is this object and all of its children can be removed.
virtual BOOL isRemovable();
diff --git a/indra/newview/llfriendcard.cpp b/indra/newview/llfriendcard.cpp
index ac060cef15..7f28e09933 100644
--- a/indra/newview/llfriendcard.cpp
+++ b/indra/newview/llfriendcard.cpp
@@ -33,6 +33,7 @@
#include "llviewerprecompiledheaders.h"
#include "llinventory.h"
+#include "llinventoryfunctions.h"
#include "llinventoryobserver.h"
#include "lltrans.h"
@@ -44,24 +45,28 @@
// Constants;
-static const std::string INVENTORY_STRING_FRIENDS_SUBFOLDER = "InvFolder Friends";
-static const std::string INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER = "InvFolder All";
+static const std::string INVENTORY_STRING_FRIENDS_SUBFOLDER = "Friends";
+static const std::string INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER = "All";
// helper functions
-// NOTE: Usage of LLTrans::getString(); in next two functions to set localized
-// folders' names is caused by a hack in the LLFolderViewItem::refreshFromListener()
-// method for protected asset types.
-// So, localized names will be got from the strings with "InvFolder LABEL_NAME"
-// in the strings.xml
+// NOTE: For now Friends & All folders are created as protected folders of the LLFolderType::FT_CALLINGCARD type.
+// So, their names will be processed in the LLFolderViewItem::refreshFromListener() to be localized
+// using "InvFolder LABEL_NAME" as LLTrans::findString argument.
+
+// We must use in this file their hard-coded names to ensure found them on different locales. EXT-5829.
+// These hard-coded names will be stored in InventoryItems but shown localized in FolderViewItems
+
+// If hack in the LLFolderViewItem::refreshFromListener() to localize protected folder is removed
+// or these folders are not protected these names should be localized in another place/way.
inline const std::string get_friend_folder_name()
{
- return LLTrans::getString(INVENTORY_STRING_FRIENDS_SUBFOLDER);
+ return INVENTORY_STRING_FRIENDS_SUBFOLDER;
}
inline const std::string get_friend_all_subfolder_name()
{
- return LLTrans::getString(INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER);
+ return INVENTORY_STRING_FRIENDS_ALL_SUBFOLDER;
}
void move_from_to_arrays(LLInventoryModel::cat_array_t& from, LLInventoryModel::cat_array_t& to)
@@ -106,8 +111,11 @@ class LLInitialFriendCardsFetch : public LLInventoryFetchDescendentsObserver
public:
typedef boost::function<void()> callback_t;
- LLInitialFriendCardsFetch(callback_t cb)
- : mCheckFolderCallback(cb) {}
+ LLInitialFriendCardsFetch(const LLUUID& folder_id,
+ callback_t cb) :
+ LLInventoryFetchDescendentsObserver(folder_id),
+ mCheckFolderCallback(cb)
+ {}
/* virtual */ void done();
@@ -318,7 +326,7 @@ void LLFriendCardsManager::collectFriendsLists(folderid_buddies_map_t& folderBud
if (NULL == items)
continue;
- std::vector<LLUUID> buddyUUIDs;
+ uuid_vec_t buddyUUIDs;
for (itBuddy = items->begin(); itBuddy != items->end(); ++itBuddy)
{
buddyUUIDs.push_back((*itBuddy)->getCreatorUUID());
@@ -350,9 +358,9 @@ const LLUUID& LLFriendCardsManager::findFriendAllSubfolderUUIDImpl() const
return findChildFolderUUID(friendFolderUUID, friendAllSubfolderName);
}
-const LLUUID& LLFriendCardsManager::findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& localizedName) const
+const LLUUID& LLFriendCardsManager::findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& nonLocalizedName) const
{
- LLNameCategoryCollector matchFolderFunctor(localizedName);
+ LLNameCategoryCollector matchFolderFunctor(nonLocalizedName);
return get_folder_uuid(parentFolderUUID, matchFolderFunctor);
}
@@ -403,13 +411,9 @@ void LLFriendCardsManager::findMatchedFriendCards(const LLUUID& avatarID, LLInve
void LLFriendCardsManager::fetchAndCheckFolderDescendents(const LLUUID& folder_id, callback_t cb)
{
// This instance will be deleted in LLInitialFriendCardsFetch::done().
- LLInitialFriendCardsFetch* fetch = new LLInitialFriendCardsFetch(cb);
-
- LLInventoryFetchDescendentsObserver::folder_ref_t folders;
- folders.push_back(folder_id);
-
- fetch->fetchDescendents(folders);
- if(fetch->isEverythingComplete())
+ LLInitialFriendCardsFetch* fetch = new LLInitialFriendCardsFetch(folder_id, cb);
+ fetch->startFetch();
+ if(fetch->isFinished())
{
// everything is already here - call done.
fetch->done();
diff --git a/indra/newview/llfriendcard.h b/indra/newview/llfriendcard.h
index b94d5ec2c0..638a1eca84 100644
--- a/indra/newview/llfriendcard.h
+++ b/indra/newview/llfriendcard.h
@@ -49,7 +49,7 @@ class LLFriendCardsManager
friend class CreateFriendCardCallback;
public:
- typedef std::map<LLUUID, std::vector<LLUUID> > folderid_buddies_map_t;
+ typedef std::map<LLUUID, uuid_vec_t > folderid_buddies_map_t;
// LLFriendObserver implementation
void changed(U32 mask)
@@ -120,7 +120,7 @@ private:
return (mBuddyIDSet.end() != mBuddyIDSet.find(avatarID));
}
- const LLUUID& findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& localizedName) const;
+ const LLUUID& findChildFolderUUID(const LLUUID& parentFolderUUID, const std::string& nonLocalizedName) const;
const LLUUID& findFriendFolderUUIDImpl() const;
const LLUUID& findFriendAllSubfolderUUIDImpl() const;
const LLUUID& findFriendCardInventoryUUIDImpl(const LLUUID& avatarID);
diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp
index 0ba7bdf613..6ffd534a53 100644
--- a/indra/newview/llgesturemgr.cpp
+++ b/indra/newview/llgesturemgr.cpp
@@ -67,19 +67,18 @@ static const LLUUID& get_linked_uuid(const LLUUID& item_id);
// Lightweight constructor.
// init() does the heavy lifting.
-LLGestureManager::LLGestureManager()
+LLGestureMgr::LLGestureMgr()
: mValid(FALSE),
mPlaying(),
mActive(),
mLoadingCount(0)
{
- mRetryIfMissing = true;
gInventory.addObserver(this);
}
// We own the data for gestures, so clean them up.
-LLGestureManager::~LLGestureManager()
+LLGestureMgr::~LLGestureMgr()
{
item_map_t::iterator it;
for (it = mActive.begin(); it != mActive.end(); ++it)
@@ -93,14 +92,14 @@ LLGestureManager::~LLGestureManager()
}
-void LLGestureManager::init()
+void LLGestureMgr::init()
{
// TODO
}
-void LLGestureManager::changed(U32 mask)
+void LLGestureMgr::changed(U32 mask)
{
- LLInventoryFetchObserver::changed(mask);
+ LLInventoryFetchItemsObserver::changed(mask);
if (mask & LLInventoryObserver::GESTURE)
{
@@ -136,10 +135,12 @@ void LLGestureManager::changed(U32 mask)
// Use this version when you have the item_id but not the asset_id,
// and you KNOW the inventory is loaded.
-void LLGestureManager::activateGesture(const LLUUID& item_id)
+void LLGestureMgr::activateGesture(const LLUUID& item_id)
{
LLViewerInventoryItem* item = gInventory.getItem(item_id);
if (!item) return;
+ if (item->getType() != LLAssetType::AT_GESTURE)
+ return;
LLUUID asset_id = item->getAssetUUID();
@@ -152,7 +153,7 @@ void LLGestureManager::activateGesture(const LLUUID& item_id)
}
-void LLGestureManager::activateGestures(LLViewerInventoryItem::item_array_t& items)
+void LLGestureMgr::activateGestures(LLViewerInventoryItem::item_array_t& items)
{
// Load up the assets
S32 count = 0;
@@ -248,7 +249,7 @@ struct LLLoadInfo
/**
* It will load a gesture from remote storage
*/
-void LLGestureManager::activateGestureWithAsset(const LLUUID& item_id,
+void LLGestureMgr::activateGestureWithAsset(const LLUUID& item_id,
const LLUUID& asset_id,
BOOL inform_server,
BOOL deactivate_similar)
@@ -257,7 +258,7 @@ void LLGestureManager::activateGestureWithAsset(const LLUUID& item_id,
if( !gAssetStorage )
{
- llwarns << "LLGestureManager::activateGestureWithAsset without valid gAssetStorage" << llendl;
+ llwarns << "LLGestureMgr::activateGestureWithAsset without valid gAssetStorage" << llendl;
return;
}
// If gesture is already active, nothing to do.
@@ -299,7 +300,7 @@ void LLGestureManager::activateGestureWithAsset(const LLUUID& item_id,
}
-void LLGestureManager::deactivateGesture(const LLUUID& item_id)
+void LLGestureMgr::deactivateGesture(const LLUUID& item_id)
{
const LLUUID& base_item_id = get_linked_uuid(item_id);
item_map_t::iterator it = mActive.find(base_item_id);
@@ -338,16 +339,16 @@ void LLGestureManager::deactivateGesture(const LLUUID& item_id)
gAgent.sendReliableMessage();
- LLAppearanceManager::instance().removeCOFItemLinks(base_item_id, false);
+ LLAppearanceMgr::instance().removeCOFItemLinks(base_item_id, false);
notifyObservers();
}
-void LLGestureManager::deactivateSimilarGestures(LLMultiGesture* in, const LLUUID& in_item_id)
+void LLGestureMgr::deactivateSimilarGestures(LLMultiGesture* in, const LLUUID& in_item_id)
{
const LLUUID& base_in_item_id = get_linked_uuid(in_item_id);
- std::vector<LLUUID> gest_item_ids;
+ uuid_vec_t gest_item_ids;
// Deactivate all gestures that match
item_map_t::iterator it;
@@ -386,7 +387,7 @@ void LLGestureManager::deactivateSimilarGestures(LLMultiGesture* in, const LLUUI
// Inform database of the change
LLMessageSystem* msg = gMessageSystem;
BOOL start_message = TRUE;
- std::vector<LLUUID>::const_iterator vit = gest_item_ids.begin();
+ uuid_vec_t::const_iterator vit = gest_item_ids.begin();
while (vit != gest_item_ids.end())
{
if (start_message)
@@ -431,7 +432,7 @@ void LLGestureManager::deactivateSimilarGestures(LLMultiGesture* in, const LLUUI
}
-BOOL LLGestureManager::isGestureActive(const LLUUID& item_id)
+BOOL LLGestureMgr::isGestureActive(const LLUUID& item_id)
{
const LLUUID& base_item_id = get_linked_uuid(item_id);
item_map_t::iterator it = mActive.find(base_item_id);
@@ -439,7 +440,7 @@ BOOL LLGestureManager::isGestureActive(const LLUUID& item_id)
}
-BOOL LLGestureManager::isGesturePlaying(const LLUUID& item_id)
+BOOL LLGestureMgr::isGesturePlaying(const LLUUID& item_id)
{
const LLUUID& base_item_id = get_linked_uuid(item_id);
@@ -452,7 +453,7 @@ BOOL LLGestureManager::isGesturePlaying(const LLUUID& item_id)
return gesture->mPlaying;
}
-BOOL LLGestureManager::isGesturePlaying(LLMultiGesture* gesture)
+BOOL LLGestureMgr::isGesturePlaying(LLMultiGesture* gesture)
{
if(!gesture)
{
@@ -462,7 +463,7 @@ BOOL LLGestureManager::isGesturePlaying(LLMultiGesture* gesture)
return gesture->mPlaying;
}
-void LLGestureManager::replaceGesture(const LLUUID& item_id, LLMultiGesture* new_gesture, const LLUUID& asset_id)
+void LLGestureMgr::replaceGesture(const LLUUID& item_id, LLMultiGesture* new_gesture, const LLUUID& asset_id)
{
const LLUUID& base_item_id = get_linked_uuid(item_id);
@@ -504,11 +505,11 @@ void LLGestureManager::replaceGesture(const LLUUID& item_id, LLMultiGesture* new
notifyObservers();
}
-void LLGestureManager::replaceGesture(const LLUUID& item_id, const LLUUID& new_asset_id)
+void LLGestureMgr::replaceGesture(const LLUUID& item_id, const LLUUID& new_asset_id)
{
const LLUUID& base_item_id = get_linked_uuid(item_id);
- item_map_t::iterator it = LLGestureManager::instance().mActive.find(base_item_id);
+ item_map_t::iterator it = LLGestureMgr::instance().mActive.find(base_item_id);
if (it == mActive.end())
{
llwarns << "replaceGesture for inactive gesture " << base_item_id << llendl;
@@ -517,10 +518,10 @@ void LLGestureManager::replaceGesture(const LLUUID& item_id, const LLUUID& new_a
// mActive owns this gesture pointer, so clean up memory.
LLMultiGesture* gesture = (*it).second;
- LLGestureManager::instance().replaceGesture(base_item_id, gesture, new_asset_id);
+ LLGestureMgr::instance().replaceGesture(base_item_id, gesture, new_asset_id);
}
-void LLGestureManager::playGesture(LLMultiGesture* gesture)
+void LLGestureMgr::playGesture(LLMultiGesture* gesture)
{
if (!gesture) return;
@@ -539,7 +540,7 @@ void LLGestureManager::playGesture(LLMultiGesture* gesture)
// Convenience function that looks up the item_id for you.
-void LLGestureManager::playGesture(const LLUUID& item_id)
+void LLGestureMgr::playGesture(const LLUUID& item_id)
{
const LLUUID& base_item_id = get_linked_uuid(item_id);
@@ -556,7 +557,7 @@ void LLGestureManager::playGesture(const LLUUID& item_id)
// Iterates through space delimited tokens in string, triggering any gestures found.
// Generates a revised string that has the found tokens replaced by their replacement strings
// and (as a minor side effect) has multiple spaces in a row replaced by single spaces.
-BOOL LLGestureManager::triggerAndReviseString(const std::string &utf8str, std::string* revised_string)
+BOOL LLGestureMgr::triggerAndReviseString(const std::string &utf8str, std::string* revised_string)
{
std::string tokenized = utf8str;
@@ -649,7 +650,7 @@ BOOL LLGestureManager::triggerAndReviseString(const std::string &utf8str, std::s
}
-BOOL LLGestureManager::triggerGesture(KEY key, MASK mask)
+BOOL LLGestureMgr::triggerGesture(KEY key, MASK mask)
{
std::vector <LLMultiGesture *> matching;
item_map_t::iterator it;
@@ -683,7 +684,7 @@ BOOL LLGestureManager::triggerGesture(KEY key, MASK mask)
}
-S32 LLGestureManager::getPlayingCount() const
+S32 LLGestureMgr::getPlayingCount() const
{
return mPlaying.size();
}
@@ -697,7 +698,7 @@ struct IsGesturePlaying : public std::unary_function<LLMultiGesture*, bool>
}
};
-void LLGestureManager::update()
+void LLGestureMgr::update()
{
S32 i;
for (i = 0; i < (S32)mPlaying.size(); ++i)
@@ -740,14 +741,13 @@ void LLGestureManager::update()
// Run all steps until you're either done or hit a wait.
-void LLGestureManager::stepGesture(LLMultiGesture* gesture)
+void LLGestureMgr::stepGesture(LLMultiGesture* gesture)
{
if (!gesture)
{
return;
}
- LLVOAvatar* avatar = gAgent.getAvatarObject();
- if (!avatar) return;
+ if (!isAgentAvatarValid()) return;
// Of the ones that started playing, have any stopped?
@@ -758,8 +758,8 @@ void LLGestureManager::stepGesture(LLMultiGesture* gesture)
{
// look in signaled animations (simulator's view of what is
// currently playing.
- LLVOAvatar::AnimIterator play_it = avatar->mSignaledAnimations.find(*gest_it);
- if (play_it != avatar->mSignaledAnimations.end())
+ LLVOAvatar::AnimIterator play_it = gAgentAvatarp->mSignaledAnimations.find(*gest_it);
+ if (play_it != gAgentAvatarp->mSignaledAnimations.end())
{
++gest_it;
}
@@ -777,8 +777,8 @@ void LLGestureManager::stepGesture(LLMultiGesture* gesture)
gest_it != gesture->mRequestedAnimIDs.end();
)
{
- LLVOAvatar::AnimIterator play_it = avatar->mSignaledAnimations.find(*gest_it);
- if (play_it != avatar->mSignaledAnimations.end())
+ LLVOAvatar::AnimIterator play_it = gAgentAvatarp->mSignaledAnimations.find(*gest_it);
+ if (play_it != gAgentAvatarp->mSignaledAnimations.end())
{
// Hooray, this animation has started playing!
// Copy into playing.
@@ -888,7 +888,7 @@ void LLGestureManager::stepGesture(LLMultiGesture* gesture)
}
-void LLGestureManager::runStep(LLMultiGesture* gesture, LLGestureStep* step)
+void LLGestureMgr::runStep(LLMultiGesture* gesture, LLGestureStep* step)
{
switch(step->getType())
{
@@ -975,7 +975,7 @@ void LLGestureManager::runStep(LLMultiGesture* gesture, LLGestureStep* step)
// static
-void LLGestureManager::onLoadComplete(LLVFS *vfs,
+void LLGestureMgr::onLoadComplete(LLVFS *vfs,
const LLUUID& asset_uuid,
LLAssetType::EType type,
void* user_data, S32 status, LLExtStat ext_status)
@@ -988,7 +988,7 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs,
delete info;
info = NULL;
- LLGestureManager& self = LLGestureManager::instance();
+ LLGestureMgr& self = LLGestureMgr::instance();
self.mLoadingCount--;
if (0 == status)
@@ -1032,9 +1032,8 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs,
else
{
// Watch this item and set gesture name when item exists in inventory
- item_ref_t ids;
- ids.push_back(item_id);
- self.fetchItems(ids);
+ self.setFetchID(item_id);
+ self.startFetch();
}
self.mActive[item_id] = gesture;
@@ -1094,12 +1093,12 @@ void LLGestureManager::onLoadComplete(LLVFS *vfs,
llwarns << "Problem loading gesture: " << status << llendl;
- LLGestureManager::instance().mActive.erase(item_id);
+ LLGestureMgr::instance().mActive.erase(item_id);
}
}
-void LLGestureManager::stopGesture(LLMultiGesture* gesture)
+void LLGestureMgr::stopGesture(LLMultiGesture* gesture)
{
if (!gesture) return;
@@ -1139,7 +1138,7 @@ void LLGestureManager::stopGesture(LLMultiGesture* gesture)
}
-void LLGestureManager::stopGesture(const LLUUID& item_id)
+void LLGestureMgr::stopGesture(const LLUUID& item_id)
{
const LLUUID& base_item_id = get_linked_uuid(item_id);
@@ -1153,12 +1152,12 @@ void LLGestureManager::stopGesture(const LLUUID& item_id)
}
-void LLGestureManager::addObserver(LLGestureManagerObserver* observer)
+void LLGestureMgr::addObserver(LLGestureManagerObserver* observer)
{
mObservers.push_back(observer);
}
-void LLGestureManager::removeObserver(LLGestureManagerObserver* observer)
+void LLGestureMgr::removeObserver(LLGestureManagerObserver* observer)
{
std::vector<LLGestureManagerObserver*>::iterator it;
it = std::find(mObservers.begin(), mObservers.end(), observer);
@@ -1171,9 +1170,9 @@ void LLGestureManager::removeObserver(LLGestureManagerObserver* observer)
// Call this method when it's time to update everyone on a new state.
// Copy the list because an observer could respond by removing itself
// from the list.
-void LLGestureManager::notifyObservers()
+void LLGestureMgr::notifyObservers()
{
- lldebugs << "LLGestureManager::notifyObservers" << llendl;
+ lldebugs << "LLGestureMgr::notifyObservers" << llendl;
std::vector<LLGestureManagerObserver*> observers = mObservers;
@@ -1185,7 +1184,7 @@ void LLGestureManager::notifyObservers()
}
}
-BOOL LLGestureManager::matchPrefix(const std::string& in_str, std::string* out_str)
+BOOL LLGestureMgr::matchPrefix(const std::string& in_str, std::string* out_str)
{
S32 in_len = in_str.length();
@@ -1216,7 +1215,7 @@ BOOL LLGestureManager::matchPrefix(const std::string& in_str, std::string* out_s
}
-void LLGestureManager::getItemIDs(std::vector<LLUUID>* ids)
+void LLGestureMgr::getItemIDs(uuid_vec_t* ids)
{
item_map_t::const_iterator it;
for (it = mActive.begin(); it != mActive.end(); ++it)
@@ -1225,7 +1224,7 @@ void LLGestureManager::getItemIDs(std::vector<LLUUID>* ids)
}
}
-void LLGestureManager::done()
+void LLGestureMgr::done()
{
bool notify = false;
for(item_map_t::iterator it = mActive.begin(); it != mActive.end(); ++it)
diff --git a/indra/newview/llgesturemgr.h b/indra/newview/llgesturemgr.h
index 3dd184ddc7..5f2c3e2d61 100644
--- a/indra/newview/llgesturemgr.h
+++ b/indra/newview/llgesturemgr.h
@@ -54,7 +54,7 @@ public:
virtual void changed() = 0;
};
-class LLGestureManager : public LLSingleton<LLGestureManager>, public LLInventoryFetchObserver
+class LLGestureMgr : public LLSingleton<LLGestureMgr>, public LLInventoryFetchItemsObserver
{
public:
@@ -63,8 +63,8 @@ public:
typedef std::map<LLUUID, LLMultiGesture*> item_map_t;
typedef std::map<LLUUID, gesture_loaded_callback_t> callback_map_t;
- LLGestureManager();
- ~LLGestureManager();
+ LLGestureMgr();
+ ~LLGestureMgr();
void init();
@@ -146,7 +146,7 @@ public:
BOOL matchPrefix(const std::string& in_str, std::string* out_str);
// Copy item ids into the vector
- void getItemIDs(std::vector<LLUUID>* ids);
+ void getItemIDs(uuid_vec_t* ids);
protected:
// Handle the processing of a single gesture
diff --git a/indra/newview/llgiveinventory.cpp b/indra/newview/llgiveinventory.cpp
new file mode 100644
index 0000000000..6470e9d6fe
--- /dev/null
+++ b/indra/newview/llgiveinventory.cpp
@@ -0,0 +1,553 @@
+/**
+ * @file llgiveinventory.cpp
+ * @brief LLGiveInventory class implementation
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llgiveinventory.h"
+
+// library includes
+#include "llnotificationsutil.h"
+#include "lltrans.h"
+
+// newview includes
+#include "llagent.h"
+#include "llagentdata.h"
+#include "llagentui.h"
+#include "llagentwearables.h"
+#include "llfloatertools.h" // for gFloaterTool
+#include "llhudeffecttrail.h"
+#include "llhudmanager.h"
+#include "llimview.h"
+#include "llinventory.h"
+#include "llinventoryfunctions.h"
+#include "llmutelist.h"
+#include "llrecentpeople.h"
+#include "llviewerobjectlist.h"
+#include "llvoavatarself.h"
+
+// MAX ITEMS is based on (sizeof(uuid)+2) * count must be < MTUBYTES
+// or 18 * count < 1200 => count < 1200/18 => 66. I've cut it down a
+// bit from there to give some pad.
+const S32 MAX_ITEMS = 42;
+
+class LLGiveable : public LLInventoryCollectFunctor
+{
+public:
+ LLGiveable() : mCountLosing(0) {}
+ virtual ~LLGiveable() {}
+ virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item);
+
+ S32 countNoCopy() const { return mCountLosing; }
+protected:
+ S32 mCountLosing;
+};
+
+bool LLGiveable::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
+{
+ // All categories can be given.
+ if (cat)
+ return true;
+
+ bool allowed = false;
+ if (item)
+ {
+ allowed = itemTransferCommonlyAllowed(item);
+ if (allowed &&
+ !item->getPermissions().allowOperationBy(PERM_TRANSFER,
+ gAgent.getID()))
+ {
+ allowed = FALSE;
+ }
+ if (allowed &&
+ !item->getPermissions().allowCopyBy(gAgent.getID()))
+ {
+ ++mCountLosing;
+ }
+ }
+ return allowed;
+}
+
+class LLUncopyableItems : public LLInventoryCollectFunctor
+{
+public:
+ LLUncopyableItems() {}
+ virtual ~LLUncopyableItems() {}
+ virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item);
+};
+
+bool LLUncopyableItems::operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item)
+{
+ bool uncopyable = false;
+ if (item)
+ {
+ if (itemTransferCommonlyAllowed(item) &&
+ !item->getPermissions().allowCopyBy(gAgent.getID()))
+ {
+ uncopyable = true;
+ }
+ }
+ return uncopyable;
+}
+
+// static
+bool LLGiveInventory::isInventoryGiveAcceptable(const LLInventoryItem* item)
+{
+ if (!item) return false;
+
+ if (!isAgentAvatarValid()) return false;
+
+ if (!item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgentID))
+ {
+ return false;
+ }
+
+ bool acceptable = true;
+ switch(item->getType())
+ {
+ case LLAssetType::AT_OBJECT:
+ if (gAgentAvatarp->isWearingAttachment(item->getUUID()))
+ {
+ acceptable = false;
+ }
+ break;
+ case LLAssetType::AT_BODYPART:
+ case LLAssetType::AT_CLOTHING:
+ {
+ BOOL copyable = false;
+ if (item->getPermissions().allowCopyBy(gAgentID)) copyable = true;
+
+ if (!copyable && gAgentWearables.isWearingItem(item->getUUID()))
+ {
+ acceptable = false;
+ }
+ }
+ break;
+ default:
+ break;
+ }
+ return acceptable;
+}
+
+// static
+bool LLGiveInventory::isInventoryGroupGiveAcceptable(const LLInventoryItem* item)
+{
+ if (!item) return false;
+
+ if (!isAgentAvatarValid()) return false;
+
+ // These permissions are double checked in the simulator in
+ // LLGroupNoticeInventoryItemFetch::result().
+ if (!item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgentID))
+ {
+ return false;
+ }
+ if (!item->getPermissions().allowCopyBy(gAgent.getID()))
+ {
+ return false;
+ }
+
+
+ bool acceptable = true;
+ switch(item->getType())
+ {
+ case LLAssetType::AT_OBJECT:
+ if (gAgentAvatarp->isWearingAttachment(item->getUUID()))
+ {
+ acceptable = false;
+ }
+ break;
+ default:
+ break;
+ }
+ return acceptable;
+}
+
+// static
+bool LLGiveInventory::doGiveInventoryItem(const LLUUID& to_agent,
+ const LLInventoryItem* item,
+ const LLUUID& im_session_id/* = LLUUID::null*/)
+
+{
+ bool res = true;
+ llinfos << "LLGiveInventory::giveInventory()" << llendl;
+ if (!isInventoryGiveAcceptable(item))
+ {
+ return false;
+ }
+ if (item->getPermissions().allowCopyBy(gAgentID))
+ {
+ // just give it away.
+ LLGiveInventory::commitGiveInventoryItem(to_agent, item, im_session_id);
+ }
+ else
+ {
+ // ask if the agent is sure.
+ LLSD substitutions;
+ substitutions["ITEMS"] = item->getName();
+ LLSD payload;
+ payload["agent_id"] = to_agent;
+ LLSD items = LLSD::emptyArray();
+ items.append(item->getUUID());
+ payload["items"] = items;
+ LLNotificationsUtil::add("CannotCopyWarning", substitutions, payload,
+ &LLGiveInventory::handleCopyProtectedItem);
+ res = false;
+ }
+
+ return res;
+}
+
+void LLGiveInventory::doGiveInventoryCategory(const LLUUID& to_agent,
+ const LLInventoryCategory* cat,
+ const LLUUID& im_session_id)
+
+{
+ if (!cat) return;
+ llinfos << "LLGiveInventory::giveInventoryCategory() - "
+ << cat->getUUID() << llendl;
+
+ if (!isAgentAvatarValid()) return;
+
+ // Test out how many items are being given.
+ LLViewerInventoryCategory::cat_array_t cats;
+ LLViewerInventoryItem::item_array_t items;
+ LLGiveable giveable;
+ gInventory.collectDescendentsIf (cat->getUUID(),
+ cats,
+ items,
+ LLInventoryModel::EXCLUDE_TRASH,
+ giveable);
+ S32 count = cats.count();
+ bool complete = true;
+ for(S32 i = 0; i < count; ++i)
+ {
+ if (!gInventory.isCategoryComplete(cats.get(i)->getUUID()))
+ {
+ complete = false;
+ break;
+ }
+ }
+ if (!complete)
+ {
+ LLNotificationsUtil::add("IncompleteInventory");
+ return;
+ }
+ count = items.count() + cats.count();
+ if (count > MAX_ITEMS)
+ {
+ LLNotificationsUtil::add("TooManyItems");
+ return;
+ }
+ else if (count == 0)
+ {
+ LLNotificationsUtil::add("NoItems");
+ return;
+ }
+ else
+ {
+ if (0 == giveable.countNoCopy())
+ {
+ LLGiveInventory::commitGiveInventoryCategory(to_agent, cat, im_session_id);
+ }
+ else
+ {
+ LLSD args;
+ args["COUNT"] = llformat("%d",giveable.countNoCopy());
+ LLSD payload;
+ payload["agent_id"] = to_agent;
+ payload["folder_id"] = cat->getUUID();
+ LLNotificationsUtil::add("CannotCopyCountItems", args, payload, &LLGiveInventory::handleCopyProtectedCategory);
+ }
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////
+// PRIVATE METHODS
+//////////////////////////////////////////////////////////////////////////
+
+//static
+void LLGiveInventory::logInventoryOffer(const LLUUID& to_agent, const LLUUID &im_session_id)
+{
+ // compute id of possible IM session with agent that has "to_agent" id
+ LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, to_agent);
+ // If this item was given by drag-and-drop into an IM panel, log this action in the IM panel chat.
+ LLSD args;
+ args["user_id"] = to_agent;
+ if (im_session_id.notNull())
+ {
+ gIMMgr->addSystemMessage(im_session_id, "inventory_item_offered", args);
+ }
+ // If this item was given by drag-and-drop on avatar while IM panel was open, log this action in the IM panel chat.
+ else if (LLIMModel::getInstance()->findIMSession(session_id))
+ {
+ gIMMgr->addSystemMessage(session_id, "inventory_item_offered", args);
+ }
+ // If this item was given by drag-and-drop on avatar while IM panel wasn't open, log this action to IM history.
+ else
+ {
+ std::string full_name;
+ if (gCacheName->getFullName(to_agent, full_name))
+ {
+ LLIMModel::instance().logToFile(full_name, LLTrans::getString("SECOND_LIFE"), im_session_id, LLTrans::getString("inventory_item_offered-im"));
+ }
+ }
+}
+
+// static
+bool LLGiveInventory::handleCopyProtectedItem(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ LLSD itmes = notification["payload"]["items"];
+ LLInventoryItem* item = NULL;
+ switch(option)
+ {
+ case 0: // "Yes"
+ for (LLSD::array_iterator it = itmes.beginArray(); it != itmes.endArray(); it++)
+ {
+ item = gInventory.getItem((*it).asUUID());
+ if (item)
+ {
+ LLGiveInventory::commitGiveInventoryItem(notification["payload"]["agent_id"].asUUID(),
+ item);
+ // delete it for now - it will be deleted on the server
+ // quickly enough.
+ gInventory.deleteObject(item->getUUID());
+ gInventory.notifyObservers();
+ }
+ else
+ {
+ LLNotificationsUtil::add("CannotGiveItem");
+ }
+ }
+ break;
+
+ default: // no, cancel, whatever, who cares, not yes.
+ LLNotificationsUtil::add("TransactionCancelled");
+ break;
+ }
+ return false;
+}
+
+// static
+void LLGiveInventory::commitGiveInventoryItem(const LLUUID& to_agent,
+ const LLInventoryItem* item,
+ const LLUUID& im_session_id)
+{
+ if (!item) return;
+ std::string name;
+ LLAgentUI::buildFullname(name);
+ LLUUID transaction_id;
+ transaction_id.generate();
+ const S32 BUCKET_SIZE = sizeof(U8) + UUID_BYTES;
+ U8 bucket[BUCKET_SIZE];
+ bucket[0] = (U8)item->getType();
+ memcpy(&bucket[1], &(item->getUUID().mData), UUID_BYTES); /* Flawfinder: ignore */
+ pack_instant_message(
+ gMessageSystem,
+ gAgentID,
+ FALSE,
+ gAgentSessionID,
+ to_agent,
+ name,
+ item->getName(),
+ IM_ONLINE,
+ IM_INVENTORY_OFFERED,
+ transaction_id,
+ 0,
+ LLUUID::null,
+ gAgent.getPositionAgent(),
+ NO_TIMESTAMP,
+ bucket,
+ BUCKET_SIZE);
+ gAgent.sendReliableMessage();
+
+ // VEFFECT: giveInventory
+ LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
+ effectp->setSourceObject(gAgentAvatarp);
+ effectp->setTargetObject(gObjectList.findObject(to_agent));
+ effectp->setDuration(LL_HUD_DUR_SHORT);
+ effectp->setColor(LLColor4U(gAgent.getEffectColor()));
+ gFloaterTools->dirty();
+
+ LLMuteList::getInstance()->autoRemove(to_agent, LLMuteList::AR_INVENTORY);
+
+ logInventoryOffer(to_agent, im_session_id);
+
+ // add buddy to recent people list
+ LLRecentPeople::instance().add(to_agent);
+}
+
+// static
+bool LLGiveInventory::handleCopyProtectedCategory(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ LLInventoryCategory* cat = NULL;
+ switch(option)
+ {
+ case 0: // "Yes"
+ cat = gInventory.getCategory(notification["payload"]["folder_id"].asUUID());
+ if (cat)
+ {
+ LLGiveInventory::commitGiveInventoryCategory(notification["payload"]["agent_id"].asUUID(),
+ cat);
+ LLViewerInventoryCategory::cat_array_t cats;
+ LLViewerInventoryItem::item_array_t items;
+ LLUncopyableItems remove;
+ gInventory.collectDescendentsIf (cat->getUUID(),
+ cats,
+ items,
+ LLInventoryModel::EXCLUDE_TRASH,
+ remove);
+ S32 count = items.count();
+ for(S32 i = 0; i < count; ++i)
+ {
+ gInventory.deleteObject(items.get(i)->getUUID());
+ }
+ gInventory.notifyObservers();
+ }
+ else
+ {
+ LLNotificationsUtil::add("CannotGiveCategory");
+ }
+ break;
+
+ default: // no, cancel, whatever, who cares, not yes.
+ LLNotificationsUtil::add("TransactionCancelled");
+ break;
+ }
+ return false;
+}
+
+// static
+void LLGiveInventory::commitGiveInventoryCategory(const LLUUID& to_agent,
+ const LLInventoryCategory* cat,
+ const LLUUID& im_session_id)
+
+{
+ if (!cat) return;
+ llinfos << "LLGiveInventory::commitGiveInventoryCategory() - "
+ << cat->getUUID() << llendl;
+
+ // add buddy to recent people list
+ LLRecentPeople::instance().add(to_agent);
+
+ // Test out how many items are being given.
+ LLViewerInventoryCategory::cat_array_t cats;
+ LLViewerInventoryItem::item_array_t items;
+ LLGiveable giveable;
+ gInventory.collectDescendentsIf (cat->getUUID(),
+ cats,
+ items,
+ LLInventoryModel::EXCLUDE_TRASH,
+ giveable);
+
+ // MAX ITEMS is based on (sizeof(uuid)+2) * count must be <
+ // MTUBYTES or 18 * count < 1200 => count < 1200/18 =>
+ // 66. I've cut it down a bit from there to give some pad.
+ S32 count = items.count() + cats.count();
+ if (count > MAX_ITEMS)
+ {
+ LLNotificationsUtil::add("TooManyItems");
+ return;
+ }
+ else if (count == 0)
+ {
+ LLNotificationsUtil::add("NoItems");
+ return;
+ }
+ else
+ {
+ std::string name;
+ LLAgentUI::buildFullname(name);
+ LLUUID transaction_id;
+ transaction_id.generate();
+ S32 bucket_size = (sizeof(U8) + UUID_BYTES) * (count + 1);
+ U8* bucket = new U8[bucket_size];
+ U8* pos = bucket;
+ U8 type = (U8)cat->getType();
+ memcpy(pos, &type, sizeof(U8)); /* Flawfinder: ignore */
+ pos += sizeof(U8);
+ memcpy(pos, &(cat->getUUID()), UUID_BYTES); /* Flawfinder: ignore */
+ pos += UUID_BYTES;
+ S32 i;
+ count = cats.count();
+ for(i = 0; i < count; ++i)
+ {
+ memcpy(pos, &type, sizeof(U8)); /* Flawfinder: ignore */
+ pos += sizeof(U8);
+ memcpy(pos, &(cats.get(i)->getUUID()), UUID_BYTES); /* Flawfinder: ignore */
+ pos += UUID_BYTES;
+ }
+ count = items.count();
+ for(i = 0; i < count; ++i)
+ {
+ type = (U8)items.get(i)->getType();
+ memcpy(pos, &type, sizeof(U8)); /* Flawfinder: ignore */
+ pos += sizeof(U8);
+ memcpy(pos, &(items.get(i)->getUUID()), UUID_BYTES); /* Flawfinder: ignore */
+ pos += UUID_BYTES;
+ }
+ pack_instant_message(
+ gMessageSystem,
+ gAgent.getID(),
+ FALSE,
+ gAgent.getSessionID(),
+ to_agent,
+ name,
+ cat->getName(),
+ IM_ONLINE,
+ IM_INVENTORY_OFFERED,
+ transaction_id,
+ 0,
+ LLUUID::null,
+ gAgent.getPositionAgent(),
+ NO_TIMESTAMP,
+ bucket,
+ bucket_size);
+ gAgent.sendReliableMessage();
+ delete[] bucket;
+
+ // VEFFECT: giveInventoryCategory
+ LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
+ effectp->setSourceObject(gAgentAvatarp);
+ effectp->setTargetObject(gObjectList.findObject(to_agent));
+ effectp->setDuration(LL_HUD_DUR_SHORT);
+ effectp->setColor(LLColor4U(gAgent.getEffectColor()));
+ gFloaterTools->dirty();
+
+ LLMuteList::getInstance()->autoRemove(to_agent, LLMuteList::AR_INVENTORY);
+
+ logInventoryOffer(to_agent, im_session_id);
+ }
+}
+
+// EOF
diff --git a/indra/newview/llgiveinventory.h b/indra/newview/llgiveinventory.h
new file mode 100644
index 0000000000..86f0f2fe86
--- /dev/null
+++ b/indra/newview/llgiveinventory.h
@@ -0,0 +1,100 @@
+/**
+ * @file llgiveinventory.cpp
+ * @brief LLGiveInventory class declaration
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLGIVEINVENTORY_H
+#define LL_LLGIVEINVENTORY_H
+
+class LLInventoryItem;
+class LLInventoryCategory;
+
+/**
+ * Class represented give inventory related actions.
+ *
+ * It has only static methods and is not intended to be instantiated for now.
+ */
+class LLGiveInventory
+{
+public:
+ /**
+ * Checks if inventory item you are attempting to transfer to a resident can be given.
+ *
+ * @return true if you can give, otherwise false.
+ */
+ static bool isInventoryGiveAcceptable(const LLInventoryItem* item);
+
+ /**
+ * Checks if inventory item you are attempting to transfer to a group can be given.
+ *
+ * @return true if you can give, otherwise false.
+ */
+ static bool isInventoryGroupGiveAcceptable(const LLInventoryItem* item);
+
+ /**
+ * Gives passed inventory item to specified avatar in specified session.
+ */
+ static bool doGiveInventoryItem(const LLUUID& to_agent,
+ const LLInventoryItem* item,
+ const LLUUID& im_session_id = LLUUID::null);
+
+ /**
+ * Gives passed inventory category to specified avatar in specified session.
+ */
+ static void doGiveInventoryCategory(const LLUUID& to_agent,
+ const LLInventoryCategory* item,
+ const LLUUID &session_id = LLUUID::null);
+
+ // give inventory item functionality
+ static bool handleCopyProtectedItem(const LLSD& notification, const LLSD& response);
+
+private:
+ // this class is not intended to be instantiated.
+ LLGiveInventory();
+
+ /**
+ * logs "Inventory item offered" to IM
+ */
+ static void logInventoryOffer(const LLUUID& to_agent,
+ const LLUUID &im_session_id = LLUUID::null);
+
+ static void commitGiveInventoryItem(const LLUUID& to_agent,
+ const LLInventoryItem* item,
+ const LLUUID &im_session_id = LLUUID::null);
+
+ // give inventory category functionality
+ static bool handleCopyProtectedCategory(const LLSD& notification, const LLSD& response);
+ static void commitGiveInventoryCategory(const LLUUID& to_agent,
+ const LLInventoryCategory* cat,
+ const LLUUID &im_session_id = LLUUID::null);
+
+};
+
+#endif // LL_LLGIVEINVENTORY_H
diff --git a/indra/newview/llglsandbox.cpp b/indra/newview/llglsandbox.cpp
index 750a9d478f..2aba0b5c09 100644
--- a/indra/newview/llglsandbox.cpp
+++ b/indra/newview/llglsandbox.cpp
@@ -71,99 +71,6 @@
// Height of the yellow selection highlight posts for land
const F32 PARCEL_POST_HEIGHT = 0.666f;
-BOOL LLAgent::setLookAt(ELookAtType target_type, LLViewerObject *object, LLVector3 position)
-{
- if(object && object->isAttachment())
- {
- LLViewerObject* parent = object;
- while(parent)
- {
- if (parent == mAvatarObject)
- {
- // looking at an attachment on ourselves, which we don't want to do
- object = mAvatarObject;
- position.clearVec();
- }
- parent = (LLViewerObject*)parent->getParent();
- }
- }
- if(!mLookAt || mLookAt->isDead())
- {
- mLookAt = (LLHUDEffectLookAt *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_LOOKAT);
- mLookAt->setSourceObject(mAvatarObject);
- }
-
- return mLookAt->setLookAt(target_type, object, position);
-}
-
-BOOL LLAgent::setPointAt(EPointAtType target_type, LLViewerObject *object, LLVector3 position)
-{
- // disallow pointing at attachments and avatars
- if (object && (object->isAttachment() || object->isAvatar()))
- {
- return FALSE;
- }
-
- if(!mPointAt || mPointAt->isDead())
- {
- mPointAt = (LLHUDEffectPointAt *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_POINTAT);
- mPointAt->setSourceObject(mAvatarObject);
- }
-
- return mPointAt->setPointAt(target_type, object, position);
-}
-
-ELookAtType LLAgent::getLookAtType()
-{
- if (mLookAt)
- {
- return mLookAt->getLookAtType();
- }
-
- return LOOKAT_TARGET_NONE;
-}
-
-EPointAtType LLAgent::getPointAtType()
-{
- if (mPointAt)
- {
- return mPointAt->getPointAtType();
- }
-
- return POINTAT_TARGET_NONE;
-}
-
-// Draw a representation of current autopilot target
-void LLAgent::renderAutoPilotTarget()
-{
- if (mAutoPilot)
- {
- F32 height_meters;
- LLVector3d target_global;
-
- glMatrixMode(GL_MODELVIEW);
- gGL.pushMatrix();
-
- // not textured
- gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
-
- // lovely green
- glColor4f(0.f, 1.f, 1.f, 1.f);
-
- target_global = mAutoPilotTargetGlobal;
-
- gGL.translatef((F32)(target_global.mdV[VX]), (F32)(target_global.mdV[VY]), (F32)(target_global.mdV[VZ]));
-
- height_meters = 1.f;
-
- glScalef(height_meters, height_meters, height_meters);
-
- gSphere.render(1500.f);
-
- gGL.popMatrix();
- }
-}
-
// Returns true if you got at least one object
void LLToolSelectRect::handleRectangleSelection(S32 x, S32 y, MASK mask)
{
@@ -897,19 +804,21 @@ void LLViewerObjectList::renderObjectBeacons()
S32 last_line_width = -1;
// gGL.begin(LLRender::LINES); // Always happens in (line_width != last_line_width)
- for (S32 i = 0; i < mDebugBeacons.count(); i++)
+ BOOL flush = FALSE;
+ for (std::vector<LLDebugBeacon>::iterator iter = mDebugBeacons.begin(); iter != mDebugBeacons.end(); ++iter)
{
- const LLDebugBeacon &debug_beacon = mDebugBeacons[i];
+ const LLDebugBeacon &debug_beacon = *iter;
LLColor4 color = debug_beacon.mColor;
color.mV[3] *= 0.25f;
S32 line_width = debug_beacon.mLineWidth;
if (line_width != last_line_width)
{
- if (i > 0)
+ if (flush)
{
gGL.end();
- gGL.flush();
}
+ flush = TRUE;
+ gGL.flush();
glLineWidth( (F32)line_width );
last_line_width = line_width;
gGL.begin(LLRender::LINES);
@@ -936,18 +845,20 @@ void LLViewerObjectList::renderObjectBeacons()
S32 last_line_width = -1;
// gGL.begin(LLRender::LINES); // Always happens in (line_width != last_line_width)
- for (S32 i = 0; i < mDebugBeacons.count(); i++)
+ BOOL flush = FALSE;
+ for (std::vector<LLDebugBeacon>::iterator iter = mDebugBeacons.begin(); iter != mDebugBeacons.end(); ++iter)
{
- const LLDebugBeacon &debug_beacon = mDebugBeacons[i];
+ const LLDebugBeacon &debug_beacon = *iter;
S32 line_width = debug_beacon.mLineWidth;
if (line_width != last_line_width)
{
- if (i > 0)
+ if (flush)
{
gGL.end();
- gGL.flush();
}
+ flush = TRUE;
+ gGL.flush();
glLineWidth( (F32)line_width );
last_line_width = line_width;
gGL.begin(LLRender::LINES);
@@ -969,9 +880,9 @@ void LLViewerObjectList::renderObjectBeacons()
gGL.flush();
glLineWidth(1.f);
- for (S32 i = 0; i < mDebugBeacons.count(); i++)
+ for (std::vector<LLDebugBeacon>::iterator iter = mDebugBeacons.begin(); iter != mDebugBeacons.end(); ++iter)
{
- LLDebugBeacon &debug_beacon = mDebugBeacons[i];
+ LLDebugBeacon &debug_beacon = *iter;
if (debug_beacon.mString == "")
{
continue;
diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp
index 00e2365ffd..438159b2e6 100644
--- a/indra/newview/llgroupactions.cpp
+++ b/indra/newview/llgroupactions.cpp
@@ -75,12 +75,13 @@ public:
return false;
}
- //*TODO by what to replace showing groups floater?
if (tokens[0].asString() == "list")
{
if (tokens[1].asString() == "show")
{
- //LLFloaterReg::showInstance("contacts", "groups");
+ LLSD params;
+ params["people_panel_tab_name"] = "groups_panel";
+ LLSideTray::getInstance()->showPanel("panel_people", params);
return true;
}
return false;
@@ -105,7 +106,7 @@ public:
{
if (group_id.isNull())
return true;
- LLGroupActions::show(group_id);
+ LLGroupActions::inspect(group_id);
return true;
}
return false;
@@ -246,6 +247,12 @@ static bool isGroupUIVisible()
return panel->isInVisibleChain();
}
+// static
+void LLGroupActions::inspect(const LLUUID& group_id)
+{
+ LLFloaterReg::showInstance("inspect_group", LLSD().with("group_id", group_id));
+}
+
// static
void LLGroupActions::show(const LLUUID& group_id)
{
diff --git a/indra/newview/llgroupactions.h b/indra/newview/llgroupactions.h
index e99df86cd9..55cae4db0b 100644
--- a/indra/newview/llgroupactions.h
+++ b/indra/newview/llgroupactions.h
@@ -66,6 +66,11 @@ public:
static void show(const LLUUID& group_id);
/**
+ * Show group inspector floater.
+ */
+ static void inspect(const LLUUID& group_id);
+
+ /**
* Refresh group information panel.
*/
static void refresh(const LLUUID& group_id);
diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp
index 1ed1113f4d..da5196df45 100644
--- a/indra/newview/llgrouplist.cpp
+++ b/indra/newview/llgrouplist.cpp
@@ -39,13 +39,13 @@
#include "lliconctrl.h"
#include "llmenugl.h"
#include "lltextbox.h"
+#include "lltextutil.h"
#include "lltrans.h"
// newview
#include "llagent.h"
#include "llgroupactions.h"
#include "llfloaterreg.h"
-#include "lltextutil.h"
#include "llviewercontrol.h" // for gSavedSettings
#include "llviewermenu.h" // for gMenuHolder
#include "llvoiceclient.h"
@@ -71,18 +71,10 @@ public:
static const LLGroupComparator GROUP_COMPARATOR;
-LLGroupList::Params::Params()
-: no_groups_msg("no_groups_msg")
-, no_filtered_groups_msg("no_filtered_groups_msg")
-{
-
-}
LLGroupList::LLGroupList(const Params& p)
-: LLFlatListView(p)
+: LLFlatListViewEx(p)
, mDirty(true) // to force initial update
- , mNoFilteredGroupsMsg(p.no_filtered_groups_msg)
- , mNoGroupsMsg(p.no_groups_msg)
{
// Listen for agent group changes.
gAgent.addListener(this, "new group");
@@ -127,7 +119,7 @@ BOOL LLGroupList::handleRightMouseDown(S32 x, S32 y, MASK mask)
BOOL handled = LLUICtrl::handleRightMouseDown(x, y, mask);
LLMenuGL* context_menu = (LLMenuGL*)mContextMenuHandle.get();
- if (context_menu)
+ if (context_menu && size() > 0)
{
context_menu->buildDrawLabels();
context_menu->updateParent(LLMenuGL::sMenuContainer);
@@ -139,9 +131,15 @@ BOOL LLGroupList::handleRightMouseDown(S32 x, S32 y, MASK mask)
void LLGroupList::setNameFilter(const std::string& filter)
{
- if (mNameFilter != filter)
+ std::string filter_upper = filter;
+ LLStringUtil::toUpper(filter_upper);
+ if (mNameFilter != filter_upper)
{
- mNameFilter = filter;
+ mNameFilter = filter_upper;
+
+ // set no items message depend on filter state
+ updateNoItemsMessage(filter);
+
setDirty();
}
}
@@ -159,18 +157,6 @@ void LLGroupList::refresh()
LLUUID id;
bool have_filter = !mNameFilter.empty();
- // set no items message depend on filter state & total count of groups
- if (have_filter)
- {
- // groups were filtered
- setNoItemsCommentText(mNoFilteredGroupsMsg);
- }
- else if (0 == count)
- {
- // user is not a member of any group
- setNoItemsCommentText(mNoGroupsMsg);
- }
-
clear();
for(S32 i = 0; i < count; ++i)
@@ -287,7 +273,7 @@ bool LLGroupList::onContextMenuItemEnable(const LLSD& userdata)
return gAgent.getGroupID() != selected_group_id;
if (userdata.asString() == "call")
- return LLVoiceClient::voiceEnabled()&&gVoiceClient->voiceWorking();
+ return real_group_selected && LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking();
return real_group_selected;
}
diff --git a/indra/newview/llgrouplist.h b/indra/newview/llgrouplist.h
index f3ac676edd..16f3fc05a3 100644
--- a/indra/newview/llgrouplist.h
+++ b/indra/newview/llgrouplist.h
@@ -47,23 +47,10 @@
*
* @see setNameFilter()
*/
-class LLGroupList: public LLFlatListView, public LLOldEvents::LLSimpleListener
+class LLGroupList: public LLFlatListViewEx, public LLOldEvents::LLSimpleListener
{
LOG_CLASS(LLGroupList);
public:
- struct Params : public LLInitParam::Block<Params, LLFlatListView::Params>
- {
- /**
- * Contains a message for empty list when user is not a member of any group
- */
- Optional<std::string> no_groups_msg;
-
- /**
- * Contains a message for empty list when all groups don't match passed filter
- */
- Optional<std::string> no_filtered_groups_msg;
- Params();
- };
LLGroupList(const Params& p);
virtual ~LLGroupList();
@@ -74,7 +61,7 @@ public:
void setNameFilter(const std::string& filter);
void toggleIcons();
bool getIconsVisible() const { return mShowIcons; }
-
+
private:
void setDirty(bool val = true) { mDirty = val; }
void refresh();
@@ -89,8 +76,6 @@ private:
bool mShowIcons;
bool mDirty;
std::string mNameFilter;
- std::string mNoFilteredGroupsMsg;
- std::string mNoGroupsMsg;
};
class LLButton;
diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp
index 4c1019a882..996553ccf7 100644
--- a/indra/newview/llgroupmgr.cpp
+++ b/indra/newview/llgroupmgr.cpp
@@ -54,8 +54,19 @@
#include "llgroupactions.h"
#include "llnotificationsutil.h"
#include "lluictrlfactory.h"
+#include "lltrans.h"
#include <boost/regex.hpp>
+#if LL_MSVC
+// disable boost::lexical_cast warning
+#pragma warning (disable:4702)
+#endif
+
+#include <boost/lexical_cast.hpp>
+
+#if LL_MSVC
+#pragma warning(pop) // Restore all warnings to the previous state
+#endif
const U32 MAX_CACHED_GROUPS = 10;
@@ -149,7 +160,7 @@ LLGroupRoleData::~LLGroupRoleData()
{
}
-S32 LLGroupRoleData::getMembersInRole(std::vector<LLUUID> members,
+S32 LLGroupRoleData::getMembersInRole(uuid_vec_t members,
BOOL needs_sort)
{
if (mRoleID.isNull())
@@ -173,8 +184,8 @@ S32 LLGroupRoleData::getMembersInRole(std::vector<LLUUID> members,
// Return the number of members in the intersection.
S32 max_size = llmin( members.size(), mMemberIDs.size() );
- std::vector<LLUUID> in_role( max_size );
- std::vector<LLUUID>::iterator in_role_end;
+ uuid_vec_t in_role( max_size );
+ uuid_vec_t::iterator in_role_end;
in_role_end = std::set_intersection(mMemberIDs.begin(), mMemberIDs.end(),
members.begin(), members.end(),
in_role.begin());
@@ -189,7 +200,7 @@ void LLGroupRoleData::addMember(const LLUUID& member)
bool LLGroupRoleData::removeMember(const LLUUID& member)
{
- std::vector<LLUUID>::iterator it = std::find(mMemberIDs.begin(),mMemberIDs.end(),member);
+ uuid_vec_t::iterator it = std::find(mMemberIDs.begin(),mMemberIDs.end(),member);
if (it != mMemberIDs.end())
{
@@ -677,9 +688,12 @@ void LLGroupMgrGroupData::sendRoleChanges()
break;
}
case RC_UPDATE_ALL:
+ // fall through
case RC_UPDATE_POWERS:
need_power_recalc = true;
+ // fall through
case RC_UPDATE_DATA:
+ // fall through
default:
{
LLGroupRoleData* group_role_data = (*role_it).second;
@@ -762,7 +776,7 @@ void LLGroupMgr::addObserver(LLGroupMgrObserver* observer)
mObservers.insert(std::pair<LLUUID, LLGroupMgrObserver*>(observer->getID(), observer));
}
-void LLGroupMgr::addObserver(const LLUUID& group_id, LLParticularGroupMgrObserver* observer)
+void LLGroupMgr::addObserver(const LLUUID& group_id, LLParticularGroupObserver* observer)
{
if(group_id.notNull() && observer)
{
@@ -792,7 +806,7 @@ void LLGroupMgr::removeObserver(LLGroupMgrObserver* observer)
}
}
-void LLGroupMgr::removeObserver(const LLUUID& group_id, LLParticularGroupMgrObserver* observer)
+void LLGroupMgr::removeObserver(const LLUUID& group_id, LLParticularGroupObserver* observer)
{
if(group_id.isNull() || !observer)
{
@@ -830,12 +844,13 @@ static void formatDateString(std::string &date_string)
const regex expression("([0-9]{1,2})/([0-9]{1,2})/([0-9]{4})");
if (regex_match(date_string.c_str(), result, expression))
{
- std::string year = result[3];
- std::string month = result[1];
- std::string day = result[2];
+ // convert matches to integers so that we can pad them with zeroes on Linux
+ S32 year = boost::lexical_cast<S32>(result[3]);
+ S32 month = boost::lexical_cast<S32>(result[1]);
+ S32 day = boost::lexical_cast<S32>(result[2]);
// ISO 8601 date format
- date_string = llformat("%02s/%02s/%04s", month.c_str(), day.c_str(), year.c_str());
+ date_string = llformat("%04d/%02d/%02d", year, month, day);
}
}
@@ -1048,6 +1063,24 @@ void LLGroupMgr::processGroupRoleDataReply(LLMessageSystem* msg, void** data)
msg->getU64("RoleData","Powers",powers,i);
msg->getU32("RoleData","Members",member_count,i);
+ //there are 3 predifined roles - Owners, Officers, Everyone
+ //there names are defined in lldatagroups.cpp
+ //lets change names from server to localized strings
+ if(name == "Everyone")
+ {
+ name = LLTrans::getString("group_role_everyone");
+ }
+ else if(name == "Officers")
+ {
+ name = LLTrans::getString("group_role_officers");
+ }
+ else if(name == "Owners")
+ {
+ name = LLTrans::getString("group_role_owners");
+ }
+
+
+
lldebugs << "Adding role data: " << name << " {" << role_id << "}" << llendl;
LLGroupRoleData* rd = new LLGroupRoleData(role_id,name,title,desc,powers,member_count);
group_data->mRoles[role_id] = rd;
@@ -1364,7 +1397,7 @@ void LLGroupMgr::notifyObservers(LLGroupChange gc)
gi->second->mChanged = FALSE;
- // notify LLParticularGroupMgrObserver
+ // notify LLParticularGroupObserver
observer_map_t::iterator obs_it = mParticularObservers.find(group_id);
if(obs_it == mParticularObservers.end())
return;
@@ -1703,7 +1736,7 @@ void LLGroupMgr::sendGroupMemberInvites(const LLUUID& group_id, std::map<LLUUID,
//static
void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id,
- std::vector<LLUUID>& member_ids)
+ uuid_vec_t& member_ids)
{
bool start_message = true;
LLMessageSystem* msg = gMessageSystem;
@@ -1713,18 +1746,16 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id,
LLGroupMgrGroupData* group_datap = LLGroupMgr::getInstance()->getGroupData(group_id);
if (!group_datap) return;
- for (std::vector<LLUUID>::iterator it = member_ids.begin();
+ for (uuid_vec_t::iterator it = member_ids.begin();
it != member_ids.end(); ++it)
{
LLUUID& ejected_member_id = (*it);
- llwarns << "LLGroupMgr::sendGroupMemberEjects -- ejecting member" << ejected_member_id << llendl;
-
// Can't use 'eject' to leave a group.
- if ((*it) == gAgent.getID()) continue;
+ if (ejected_member_id == gAgent.getID()) continue;
// Make sure they are in the group, and we need the member data
- LLGroupMgrGroupData::member_list_t::iterator mit = group_datap->mMembers.find(*it);
+ LLGroupMgrGroupData::member_list_t::iterator mit = group_datap->mMembers.find(ejected_member_id);
if (mit != group_datap->mMembers.end())
{
// Add them to the message
@@ -1748,22 +1779,23 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id,
start_message = true;
}
+ LLGroupMemberData* member_data = (*mit).second;
+
// Clean up groupmgr
- for (LLGroupMemberData::role_list_t::iterator rit = (*mit).second->roleBegin();
- rit != (*mit).second->roleEnd(); ++rit)
+ for (LLGroupMemberData::role_list_t::iterator rit = member_data->roleBegin();
+ rit != member_data->roleEnd(); ++rit)
{
if ((*rit).first.notNull() && (*rit).second!=0)
{
(*rit).second->removeMember(ejected_member_id);
-
- llwarns << "LLGroupMgr::sendGroupMemberEjects - removing member from role " << llendl;
}
}
- group_datap->mMembers.erase(*it);
+ group_datap->mMembers.erase(ejected_member_id);
- llwarns << "LLGroupMgr::sendGroupMemberEjects - deleting memnber data " << llendl;
- delete (*mit).second;
+ // member_data was introduced and is used here instead of (*mit).second to avoid crash because of invalid iterator
+ // It becomes invalid after line with erase above. EXT-4778
+ delete member_data;
}
}
@@ -1771,8 +1803,6 @@ void LLGroupMgr::sendGroupMemberEjects(const LLUUID& group_id,
{
gAgent.sendReliableMessage();
}
-
- llwarns << "LLGroupMgr::sendGroupMemberEjects - done " << llendl;
}
void LLGroupMgr::sendGroupRoleChanges(const LLUUID& group_id)
diff --git a/indra/newview/llgroupmgr.h b/indra/newview/llgroupmgr.h
index 588b4a9034..82df631b8c 100644
--- a/indra/newview/llgroupmgr.h
+++ b/indra/newview/llgroupmgr.h
@@ -53,10 +53,10 @@ protected:
LLUUID mID;
};
-class LLParticularGroupMgrObserver
+class LLParticularGroupObserver
{
public:
- virtual ~LLParticularGroupMgrObserver(){}
+ virtual ~LLParticularGroupObserver(){}
virtual void changed(const LLUUID& group_id, LLGroupChange gc) = 0;
};
@@ -139,8 +139,8 @@ public:
const LLUUID& getID() const { return mRoleID; }
- const std::vector<LLUUID>& getRoleMembers() const { return mMemberIDs; }
- S32 getMembersInRole(std::vector<LLUUID> members, BOOL needs_sort = TRUE);
+ const uuid_vec_t& getRoleMembers() const { return mMemberIDs; }
+ S32 getMembersInRole(uuid_vec_t members, BOOL needs_sort = TRUE);
S32 getTotalMembersInRole() { return mMemberIDs.size(); }
LLRoleData getRoleData() const { return mRoleData; }
@@ -150,10 +150,10 @@ public:
bool removeMember(const LLUUID& member);
void clearMembers();
- const std::vector<LLUUID>::const_iterator getMembersBegin() const
+ const uuid_vec_t::const_iterator getMembersBegin() const
{ return mMemberIDs.begin(); }
- const std::vector<LLUUID>::const_iterator getMembersEnd() const
+ const uuid_vec_t::const_iterator getMembersEnd() const
{ return mMemberIDs.end(); }
@@ -164,7 +164,7 @@ protected:
LLUUID mRoleID;
LLRoleData mRoleData;
- std::vector<LLUUID> mMemberIDs;
+ uuid_vec_t mMemberIDs;
S32 mMemberCount;
private:
@@ -313,9 +313,9 @@ public:
~LLGroupMgr();
void addObserver(LLGroupMgrObserver* observer);
- void addObserver(const LLUUID& group_id, LLParticularGroupMgrObserver* observer);
+ void addObserver(const LLUUID& group_id, LLParticularGroupObserver* observer);
void removeObserver(LLGroupMgrObserver* observer);
- void removeObserver(const LLUUID& group_id, LLParticularGroupMgrObserver* observer);
+ void removeObserver(const LLUUID& group_id, LLParticularGroupObserver* observer);
LLGroupMgrGroupData* getGroupData(const LLUUID& id);
void sendGroupPropertiesRequest(const LLUUID& group_id);
@@ -340,7 +340,7 @@ public:
static void sendGroupMemberJoin(const LLUUID& group_id);
static void sendGroupMemberInvites(const LLUUID& group_id, std::map<LLUUID,LLUUID>& role_member_pairs);
static void sendGroupMemberEjects(const LLUUID& group_id,
- std::vector<LLUUID>& member_ids);
+ uuid_vec_t& member_ids);
void cancelGroupRoleChanges(const LLUUID& group_id);
@@ -374,7 +374,7 @@ private:
typedef std::map<LLUUID, LLGroupMgrGroupData*> group_map_t;
group_map_t mGroups;
- typedef std::set<LLParticularGroupMgrObserver*> observer_set_t;
+ typedef std::set<LLParticularGroupObserver*> observer_set_t;
typedef std::map<LLUUID,observer_set_t> observer_map_t;
observer_map_t mParticularObservers;
};
diff --git a/indra/newview/llhudeffectlookat.cpp b/indra/newview/llhudeffectlookat.cpp
index 07b81ef134..3be0fcbc5f 100644
--- a/indra/newview/llhudeffectlookat.cpp
+++ b/indra/newview/llhudeffectlookat.cpp
@@ -38,6 +38,7 @@
#include "message.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llvoavatar.h"
#include "lldrawable.h"
#include "llviewerobjectlist.h"
@@ -316,7 +317,7 @@ void LLHUDEffectLookAt::unpackData(LLMessageSystem *mesgsys, S32 blocknum)
LLUUID dataId;
mesgsys->getUUIDFast(_PREHASH_Effect, _PREHASH_ID, dataId, blocknum);
- if (!gAgent.mLookAt.isNull() && dataId == gAgent.mLookAt->getID())
+ if (!gAgentCamera.mLookAt.isNull() && dataId == gAgentCamera.mLookAt->getID())
{
return;
}
@@ -637,7 +638,7 @@ bool LLHUDEffectLookAt::calcTargetPosition()
// mouselook and freelook target offsets are absolute
target_rot = LLQuaternion::DEFAULT;
}
- else if (looking_at_self && gAgent.cameraCustomizeAvatar())
+ else if (looking_at_self && gAgentCamera.cameraCustomizeAvatar())
{
// *NOTE: We have to do this because animation
// overrides do not set lookat behavior.
diff --git a/indra/newview/llhudeffectpointat.cpp b/indra/newview/llhudeffectpointat.cpp
index a13ee8572f..01dfb50b10 100644
--- a/indra/newview/llhudeffectpointat.cpp
+++ b/indra/newview/llhudeffectpointat.cpp
@@ -38,6 +38,7 @@
#include "llrender.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "lldrawable.h"
#include "llviewerobjectlist.h"
#include "llvoavatar.h"
@@ -152,7 +153,7 @@ void LLHUDEffectPointAt::unpackData(LLMessageSystem *mesgsys, S32 blocknum)
mesgsys->getUUIDFast(_PREHASH_Effect, _PREHASH_ID, dataId, blocknum);
// ignore messages from ourselves
- if (!gAgent.mPointAt.isNull() && dataId == gAgent.mPointAt->getID())
+ if (!gAgentCamera.mPointAt.isNull() && dataId == gAgentCamera.mPointAt->getID())
{
return;
}
diff --git a/indra/newview/llhudobject.cpp b/indra/newview/llhudobject.cpp
index dc55aba0db..2b73ed1dcd 100644
--- a/indra/newview/llhudobject.cpp
+++ b/indra/newview/llhudobject.cpp
@@ -43,6 +43,7 @@
#include "llhudeffectbeam.h"
#include "llhudeffecttrail.h"
#include "llhudeffectlookat.h"
+#include "llhudeffectpointat.h"
#include "llvoicevisualizer.h"
diff --git a/indra/newview/llhudrender.cpp b/indra/newview/llhudrender.cpp
index a02dc3355b..47fe641680 100644
--- a/indra/newview/llhudrender.cpp
+++ b/indra/newview/llhudrender.cpp
@@ -78,8 +78,8 @@ void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent,
LLVector3 up_axis;
if (orthographic)
{
- right_axis.setVec(0.f, -1.f / gViewerWindow->getWorldViewWidthRaw(), 0.f);
- up_axis.setVec(0.f, 0.f, 1.f / gViewerWindow->getWorldViewHeightRaw());
+ right_axis.setVec(0.f, -1.f / gViewerWindow->getWorldViewHeightScaled(), 0.f);
+ up_axis.setVec(0.f, 0.f, 1.f / gViewerWindow->getWorldViewHeightScaled());
}
else
{
@@ -121,24 +121,24 @@ void hud_render_text(const LLWString &wstr, const LLVector3 &pos_agent,
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
-
+ gGL.pushMatrix();
LLUI::pushMatrix();
gl_state_for_2d(world_view_rect.getWidth(), world_view_rect.getHeight());
gViewerWindow->setup3DViewport();
- //gViewerWindow->setup2DRender();
-
+
winX -= world_view_rect.mLeft;
winY -= world_view_rect.mBottom;
LLUI::loadIdentity();
+ glLoadIdentity();
LLUI::translate((F32) winX*1.0f/LLFontGL::sScaleX, (F32) winY*1.0f/(LLFontGL::sScaleY), -(((F32) winZ*2.f)-1.f));
- //glRotatef(angle * RAD_TO_DEG, axis.mV[VX], axis.mV[VY], axis.mV[VZ]);
- //glScalef(right_scale, up_scale, 1.f);
F32 right_x;
font.render(wstr, 0, 0, 0, color, LLFontGL::LEFT, LLFontGL::BASELINE, style, shadow, wstr.length(), 1000, &right_x);
+
LLUI::popMatrix();
-
+ gGL.popMatrix();
+
glMatrixMode(GL_PROJECTION);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
diff --git a/indra/newview/llhudtext.cpp b/indra/newview/llhudtext.cpp
index 8ad94b957d..8d1d27444b 100644
--- a/indra/newview/llhudtext.cpp
+++ b/indra/newview/llhudtext.cpp
@@ -555,7 +555,7 @@ void LLHUDText::renderText(BOOL for_select)
}
}
/// Reset the default color to white. The renderer expects this to be the default.
- glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+ gGL.color4f(1.0f, 1.0f, 1.0f, 1.0f);
if (for_select)
{
gGL.getTexUnit(0)->enable(LLTexUnit::TT_TEXTURE);
diff --git a/indra/newview/llimfloater.cpp b/indra/newview/llimfloater.cpp
index 1eac90371d..967f38bfd2 100644
--- a/indra/newview/llimfloater.cpp
+++ b/indra/newview/llimfloater.cpp
@@ -44,6 +44,7 @@
#include "llchiclet.h"
#include "llfloaterreg.h"
#include "llimfloatercontainer.h" // to replace separate IM Floaters with multifloater container
+#include "llinventoryfunctions.h"
#include "lllayoutstack.h"
#include "lllineeditor.h"
#include "lllogchat.h"
@@ -52,14 +53,20 @@
#include "llsyswellwindow.h"
#include "lltrans.h"
#include "llchathistory.h"
+#include "llnotifications.h"
#include "llviewerwindow.h"
#include "llvoicechannel.h"
#include "lltransientfloatermgr.h"
#include "llinventorymodel.h"
#include "llrootview.h"
-
#include "llspeakers.h"
+#include "llsidetray.h"
+
+
+static const S32 RECT_PADDING_NOT_INIT = -1;
+static const S32 RECT_PADDING_NEED_RECALC = -2;
+S32 LLIMFloater::sAllowedRectRightPadding = RECT_PADDING_NOT_INIT;
LLIMFloater::LLIMFloater(const LLUUID& session_id)
: LLTransientDockableFloater(NULL, true, session_id),
@@ -112,6 +119,8 @@ LLIMFloater::LLIMFloater(const LLUUID& session_id)
setOverlapsScreenChannel(true);
LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::IM, this);
+
+ setDocked(true);
}
void LLIMFloater::onFocusLost()
@@ -125,13 +134,12 @@ void LLIMFloater::onFocusReceived()
{
LLIMModel::getInstance()->setActiveSessionID(mSessionID);
- // return focus to the input field when active tab in the multitab container is clicked.
- if (isChatMultiTab() && mInputEditor)
+ LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, true);
+
+ if (getVisible())
{
- mInputEditor->setFocus(TRUE);
+ LLIMModel::instance().sendNoUnreadMessages(mSessionID);
}
-
- LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(mSessionID, true);
}
// virtual
@@ -271,6 +279,7 @@ BOOL LLIMFloater::postBuild()
mInputEditor->setCommitOnFocusLost( FALSE );
mInputEditor->setRevertOnEsc( FALSE );
mInputEditor->setReplaceNewlinesWithSpaces( FALSE );
+ mInputEditor->setPassDelete( TRUE );
std::string session_name(LLIMModel::instance().getName(mSessionID));
@@ -368,6 +377,8 @@ void LLIMFloater::onSlide()
//static
LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
{
+ closeHiddenIMToasts();
+
if (!gIMMgr->hasSession(session_id)) return NULL;
if(!isChatMultiTab())
@@ -407,12 +418,7 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
}
}
- if (floater_container)
- {
- //selecting the panel resets a chiclet's counter
- floater_container->selectFloater(floater);
- floater_container->setVisible(TRUE);
- }
+ floater->openFloater(floater->getKey());
}
else
{
@@ -444,25 +450,50 @@ LLIMFloater* LLIMFloater::show(const LLUUID& session_id)
return floater;
}
+//static
+bool LLIMFloater::resetAllowedRectPadding(const LLSD& newvalue)
+{
+ //reset allowed rect right padding if "SidebarCameraMovement" option
+ //or sidebar state changed
+ sAllowedRectRightPadding = RECT_PADDING_NEED_RECALC ;
+ return true;
+}
+
void LLIMFloater::getAllowedRect(LLRect& rect)
{
- rect = gViewerWindow->getWorldViewRectRaw();
- static S32 right_padding = 0;
- if (right_padding == 0)
+ if (sAllowedRectRightPadding == RECT_PADDING_NOT_INIT) //wasn't initialized
+ {
+ gSavedSettings.getControl("SidebarCameraMovement")->getSignal()->connect(boost::bind(&LLIMFloater::resetAllowedRectPadding, _2));
+
+ LLSideTray* side_bar = LLSideTray::getInstance();
+ side_bar->getCollapseSignal().connect(boost::bind(&LLIMFloater::resetAllowedRectPadding, _2));
+ sAllowedRectRightPadding = RECT_PADDING_NEED_RECALC;
+ }
+
+ rect = gViewerWindow->getWorldViewRectScaled();
+ if (sAllowedRectRightPadding == RECT_PADDING_NEED_RECALC) //recalc allowed rect right padding
{
LLPanel* side_bar_tabs =
gViewerWindow->getRootView()->getChild<LLPanel> (
"side_bar_tabs");
- right_padding = side_bar_tabs->getRect().getWidth();
+ sAllowedRectRightPadding = side_bar_tabs->getRect().getWidth();
LLTransientFloaterMgr::getInstance()->addControlView(side_bar_tabs);
+
+ if (gSavedSettings.getBOOL("SidebarCameraMovement") == FALSE)
+ {
+ LLSideTray* side_bar = LLSideTray::getInstance();
+
+ if (side_bar->getVisible() && !side_bar->getCollapsed())
+ sAllowedRectRightPadding += side_bar->getRect().getWidth();
+ }
}
- rect.mRight -= right_padding;
+ rect.mRight -= sAllowedRectRightPadding;
}
void LLIMFloater::setDocked(bool docked, bool pop_on_undock)
{
// update notification channel state
- LLNotificationsUI::LLScreenChannel* channel = dynamic_cast<LLNotificationsUI::LLScreenChannel*>
+ LLNotificationsUI::LLScreenChannel* channel = static_cast<LLNotificationsUI::LLScreenChannel*>
(LLNotificationsUI::LLChannelManager::getInstance()->
findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
@@ -481,7 +512,7 @@ void LLIMFloater::setDocked(bool docked, bool pop_on_undock)
void LLIMFloater::setVisible(BOOL visible)
{
- LLNotificationsUI::LLScreenChannel* channel = dynamic_cast<LLNotificationsUI::LLScreenChannel*>
+ LLNotificationsUI::LLScreenChannel* channel = static_cast<LLNotificationsUI::LLScreenChannel*>
(LLNotificationsUI::LLChannelManager::getInstance()->
findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
LLTransientDockableFloater::setVisible(visible);
@@ -493,11 +524,19 @@ void LLIMFloater::setVisible(BOOL visible)
channel->redrawToasts();
}
- if (visible && mChatHistory && mInputEditor)
+ BOOL is_minimized = visible && isChatMultiTab()
+ ? LLIMFloaterContainer::getInstance()->isMinimized()
+ : !visible;
+
+ if (!is_minimized && mChatHistory && mInputEditor)
{
//only if floater was construced and initialized from xml
updateMessages();
- mInputEditor->setFocus(TRUE);
+ //prevent stealing focus when opening a background IM tab (EXT-5387, checking focus for EXT-6781)
+ if (!isChatMultiTab() || hasFocus())
+ {
+ mInputEditor->setFocus(TRUE);
+ }
}
if(!visible)
@@ -515,8 +554,18 @@ BOOL LLIMFloater::getVisible()
if(isChatMultiTab())
{
LLIMFloaterContainer* im_container = LLIMFloaterContainer::getInstance();
+
+ // Treat inactive floater as invisible.
+ bool is_active = im_container->getActiveFloater() == this;
+
+ //torn off floater is always inactive
+ if (!is_active && getHost() != im_container)
+ {
+ return LLTransientDockableFloater::getVisible();
+ }
+
// getVisible() returns TRUE when Tabbed IM window is minimized.
- return !im_container->isMinimized() && im_container->getVisible();
+ return is_active && !im_container->isMinimized() && im_container->getVisible();
}
else
{
@@ -599,7 +648,16 @@ void LLIMFloater::updateMessages()
bool use_plain_text_chat_history = gSavedSettings.getBOOL("PlainTextChatHistory");
std::list<LLSD> messages;
- LLIMModel::instance().getMessages(mSessionID, messages, mLastMessageIndex+1);
+
+ // we shouldn't reset unread message counters if IM floater doesn't have focus
+ if (hasFocus())
+ {
+ LLIMModel::instance().getMessages(mSessionID, messages, mLastMessageIndex+1);
+ }
+ else
+ {
+ LLIMModel::instance().getMessagesSilently(mSessionID, messages, mLastMessageIndex+1);
+ }
if (messages.size())
{
@@ -619,17 +677,37 @@ void LLIMFloater::updateMessages()
LLUUID from_id = msg["from_id"].asUUID();
std::string from = msg["from"].asString();
std::string message = msg["message"].asString();
+ bool is_history = msg["is_history"].asBoolean();
LLChat chat;
chat.mFromID = from_id;
chat.mSessionID = mSessionID;
chat.mFromName = from;
chat.mTimeStr = time;
+ chat.mChatStyle = is_history ? CHAT_STYLE_HISTORY : chat.mChatStyle;
// process offer notification
if (msg.has("notification_id"))
{
chat.mNotifId = msg["notification_id"].asUUID();
+ // if notification exists - embed it
+ if (LLNotificationsUtil::find(chat.mNotifId) != NULL)
+ {
+ // remove embedded notification from channel
+ LLNotificationsUI::LLScreenChannel* channel = static_cast<LLNotificationsUI::LLScreenChannel*>
+ (LLNotificationsUI::LLChannelManager::getInstance()->
+ findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
+ if (getVisible())
+ {
+ // toast will be automatically closed since it is not storable toast
+ channel->hideToast(chat.mNotifId);
+ }
+ }
+ // if notification doesn't exist - try to use next message which should be log entry
+ else
+ {
+ continue;
+ }
}
//process text message
else
@@ -639,6 +717,19 @@ void LLIMFloater::updateMessages()
mChatHistory->appendMessage(chat, chat_args);
mLastMessageIndex = msg["index"].asInteger();
+
+ // if it is a notification - next message is a notification history log, so skip it
+ if (chat.mNotifId.notNull() && LLNotificationsUtil::find(chat.mNotifId) != NULL)
+ {
+ if (++iter == iter_end)
+ {
+ break;
+ }
+ else
+ {
+ mLastMessageIndex++;
+ }
+ }
}
}
}
@@ -664,15 +755,6 @@ void LLIMFloater::onInputEditorFocusReceived( LLFocusableElement* caller, void*
//in disconnected state IM input editor should be disabled
self->mInputEditor->setEnabled(!gDisconnected);
}
-
- // when IM Floater is a part of the multitab container LLTabContainer set focus to the first
- // child on tab button's mouse up. This leads input field lost focus. See EXT-3852.
- if (isChatMultiTab())
- {
- // So, clear control captured mouse to prevent LLTabContainer set focus on the panel's first child.
- // do not pass self->mInputEditor, this leads to have "Edit Text" mouse pointer wherever it is.
- gFocusMgr.setMouseCapture(NULL);
- }
}
// static
@@ -874,7 +956,7 @@ BOOL LLIMFloater::dropCallingCard(LLInventoryItem* item, BOOL drop)
{
if(drop)
{
- std::vector<LLUUID> ids;
+ uuid_vec_t ids;
ids.push_back(item->getCreatorUUID());
inviteToSession(ids);
}
@@ -907,7 +989,7 @@ BOOL LLIMFloater::dropCategory(LLInventoryCategory* category, BOOL drop)
}
else if(drop)
{
- std::vector<LLUUID> ids;
+ uuid_vec_t ids;
ids.reserve(count);
for(S32 i = 0; i < count; ++i)
{
@@ -944,7 +1026,7 @@ private:
LLUUID mSessionID;
};
-BOOL LLIMFloater::inviteToSession(const std::vector<LLUUID>& ids)
+BOOL LLIMFloater::inviteToSession(const uuid_vec_t& ids)
{
LLViewerRegion* region = gAgent.getRegion();
if (!region)
@@ -1035,6 +1117,41 @@ void LLIMFloater::removeTypingIndicator(const LLIMInfo* im_info)
}
// static
+void LLIMFloater::closeHiddenIMToasts()
+{
+ class IMToastMatcher: public LLNotificationsUI::LLScreenChannel::Matcher
+ {
+ public:
+ bool matches(const LLNotificationPtr notification) const
+ {
+ // "notifytoast" type of notifications is reserved for IM notifications
+ return "notifytoast" == notification->getType();
+ }
+ };
+
+ LLNotificationsUI::LLScreenChannel* channel = LLNotificationsUI::LLChannelManager::getNotificationScreenChannel();
+ if (channel != NULL)
+ {
+ channel->closeHiddenToasts(IMToastMatcher());
+ }
+}
+// static
+void LLIMFloater::confirmLeaveCallCallback(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ const LLSD& payload = notification["payload"];
+ LLUUID session_id = payload["session_id"];
+
+ LLFloater* im_floater = LLFloaterReg::findInstance("impanel", session_id);
+ if (option == 0 && im_floater != NULL)
+ {
+ im_floater->closeFloater();
+ }
+
+ return;
+}
+
+// static
bool LLIMFloater::isChatMultiTab()
{
// Restart is required in order to change chat window type.
@@ -1083,3 +1200,31 @@ void LLIMFloater::onIMChicletCreated( const LLUUID& session_id )
}
}
+
+void LLIMFloater::onClickCloseBtn()
+{
+
+ LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(
+ mSessionID);
+
+ if (session == NULL)
+ {
+ llwarns << "Empty session." << llendl;
+ return;
+ }
+
+ bool is_call_with_chat = session->isGroupSessionType()
+ || session->isAdHocSessionType() || session->isP2PSessionType();
+
+ LLVoiceChannel* voice_channel = LLIMModel::getInstance()->getVoiceChannel(mSessionID);
+
+ if (is_call_with_chat && voice_channel != NULL && voice_channel->isActive())
+ {
+ LLSD payload;
+ payload["session_id"] = mSessionID;
+ LLNotificationsUtil::add("ConfirmLeaveCall", LLSD(), payload, confirmLeaveCallCallback);
+ return;
+ }
+
+ LLFloater::onClickCloseBtn();
+}
diff --git a/indra/newview/llimfloater.h b/indra/newview/llimfloater.h
index 2f034d02b8..f1e68a2b3d 100644
--- a/indra/newview/llimfloater.h
+++ b/indra/newview/llimfloater.h
@@ -50,6 +50,7 @@ class LLInventoryCategory;
*/
class LLIMFloater : public LLTransientDockableFloater
{
+ LOG_CLASS(LLIMFloater);
public:
LLIMFloater(const LLUUID& session_id);
@@ -120,6 +121,10 @@ public:
virtual LLTransientFloaterMgr::ETransientGroup getGroup() { return LLTransientFloaterMgr::IM; }
+protected:
+ /* virtual */
+ void onClickCloseBtn();
+
private:
// process focus events to set a currently active session
/* virtual */ void onFocusLost();
@@ -129,7 +134,7 @@ private:
BOOL dropCategory(LLInventoryCategory* category, BOOL drop);
BOOL isInviteAllowed() const;
- BOOL inviteToSession(const std::vector<LLUUID>& agent_ids);
+ BOOL inviteToSession(const uuid_vec_t& agent_ids);
static void onInputEditorFocusReceived( LLFocusableElement* caller, void* userdata );
static void onInputEditorFocusLost(LLFocusableElement* caller, void* userdata);
@@ -148,6 +153,14 @@ private:
// Remove the "User is typing..." indicator.
void removeTypingIndicator(const LLIMInfo* im_info = NULL);
+ static void closeHiddenIMToasts();
+
+ static bool resetAllowedRectPadding(const LLSD& newvalue);
+ //need to keep this static for performance issues
+ static S32 sAllowedRectRightPadding;
+
+ static void confirmLeaveCallCallback(const LLSD& notification, const LLSD& response);
+
LLPanelChatControlPanel* mControlPanel;
LLUUID mSessionID;
S32 mLastMessageIndex;
diff --git a/indra/newview/llimfloatercontainer.cpp b/indra/newview/llimfloatercontainer.cpp
index 22eb9a51d2..9eb11a6ac4 100644
--- a/indra/newview/llimfloatercontainer.cpp
+++ b/indra/newview/llimfloatercontainer.cpp
@@ -37,7 +37,9 @@
#include "llfloaterreg.h"
#include "llimview.h"
#include "llavatariconctrl.h"
+#include "llgroupiconctrl.h"
#include "llagent.h"
+#include "lltransientfloatermgr.h"
//
// LLIMFloaterContainer
@@ -46,9 +48,13 @@ LLIMFloaterContainer::LLIMFloaterContainer(const LLSD& seed)
: LLMultiFloater(seed)
{
mAutoResize = FALSE;
+ LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::IM, this);
}
-LLIMFloaterContainer::~LLIMFloaterContainer(){}
+LLIMFloaterContainer::~LLIMFloaterContainer()
+{
+ LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::IM, this);
+}
BOOL LLIMFloaterContainer::postBuild()
{
@@ -90,85 +96,39 @@ void LLIMFloaterContainer::addFloater(LLFloater* floaterp,
LLUUID session_id = floaterp->getKey();
- if(gAgent.isInGroup(session_id))
+ LLIconCtrl* icon = 0;
+
+ if(gAgent.isInGroup(session_id, TRUE))
{
+ LLGroupIconCtrl::Params icon_params = LLUICtrlFactory::instance().getDefaultParams<LLGroupIconCtrl>();
+ icon_params.group_id = session_id;
+ icon = LLUICtrlFactory::instance().createWidget<LLGroupIconCtrl>(icon_params);
+
mSessions[session_id] = floaterp;
- LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(session_id);
- LLGroupMgr* gm = LLGroupMgr::getInstance();
- gm->addObserver(session_id, this);
floaterp->mCloseSignal.connect(boost::bind(&LLIMFloaterContainer::onCloseFloater, this, session_id));
-
- if (group_data && group_data->mInsigniaID.notNull())
- {
- mTabContainer->setTabImage(get_ptr_in_map(mSessions, session_id), group_data->mInsigniaID);
- }
- else
- {
- mTabContainer->setTabImage(floaterp, "Generic_Group");
- gm->sendGroupPropertiesRequest(session_id);
- }
}
else
{
LLUUID avatar_id = LLIMModel::getInstance()->getOtherParticipantID(session_id);
- LLAvatarPropertiesProcessor& app = LLAvatarPropertiesProcessor::instance();
- app.addObserver(avatar_id, this);
- floaterp->mCloseSignal.connect(boost::bind(&LLIMFloaterContainer::onCloseFloater, this, avatar_id));
- mSessions[avatar_id] = floaterp;
- LLUUID* icon_id_ptr = LLAvatarIconIDCache::getInstance()->get(avatar_id);
- if(icon_id_ptr && icon_id_ptr->notNull())
- {
- mTabContainer->setTabImage(floaterp, *icon_id_ptr);
- }
- else
- {
- mTabContainer->setTabImage(floaterp, "Generic_Person");
- app.sendAvatarPropertiesRequest(avatar_id);
- }
- }
-}
-
-void LLIMFloaterContainer::processProperties(void* data, enum EAvatarProcessorType type)
-{
- if (APT_PROPERTIES == type)
- {
- LLAvatarData* avatar_data = static_cast<LLAvatarData*>(data);
- if (avatar_data)
- {
- LLUUID avatar_id = avatar_data->avatar_id;
- LLUUID* cached_avatarId = LLAvatarIconIDCache::getInstance()->get(avatar_id);
- if(cached_avatarId && cached_avatarId->notNull() && avatar_data->image_id != *cached_avatarId)
- {
- LLAvatarIconIDCache::getInstance()->add(avatar_id,avatar_data->image_id);
- mTabContainer->setTabImage(get_ptr_in_map(mSessions, avatar_id), avatar_data->image_id);
- }
- }
- }
-}
+ LLAvatarIconCtrl::Params icon_params = LLUICtrlFactory::instance().getDefaultParams<LLAvatarIconCtrl>();
+ icon_params.avatar_id = avatar_id;
+ icon = LLUICtrlFactory::instance().createWidget<LLAvatarIconCtrl>(icon_params);
-void LLIMFloaterContainer::changed(const LLUUID& group_id, LLGroupChange gc)
-{
- if (GC_PROPERTIES == gc)
- {
- LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(group_id);
- if (group_data && group_data->mInsigniaID.notNull())
- {
- mTabContainer->setTabImage(get_ptr_in_map(mSessions, group_id), group_data->mInsigniaID);
- }
+ mSessions[session_id] = floaterp;
+ floaterp->mCloseSignal.connect(boost::bind(&LLIMFloaterContainer::onCloseFloater, this, session_id));
}
+ mTabContainer->setTabImage(floaterp, icon);
}
-void LLIMFloaterContainer::onCloseFloater(LLUUID id)
+void LLIMFloaterContainer::onCloseFloater(LLUUID& id)
{
- LLAvatarPropertiesProcessor::instance().removeObserver(id, this);
- LLGroupMgr::instance().removeObserver(id, this);
-
+ mSessions.erase(id);
}
void LLIMFloaterContainer::onNewMessageReceived(const LLSD& data)
{
- LLUUID session_id = data["from_id"].asUUID();
+ LLUUID session_id = data["session_id"].asUUID();
LLFloater* floaterp = get_ptr_in_map(mSessions, session_id);
LLFloater* current_floater = LLMultiFloater::getActiveFloater();
@@ -190,4 +150,20 @@ LLIMFloaterContainer* LLIMFloaterContainer::getInstance()
return LLFloaterReg::getTypedInstance<LLIMFloaterContainer>("im_container");
}
+void LLIMFloaterContainer::setMinimized(BOOL b)
+{
+ if (isMinimized() == b) return;
+
+ LLMultiFloater::setMinimized(b);
+ // Hide minimized floater (see EXT-5315)
+ setVisible(!b);
+
+ if (isMinimized()) return;
+
+ if (getActiveFloater())
+ {
+ getActiveFloater()->setVisible(TRUE);
+ }
+}
+
// EOF
diff --git a/indra/newview/llimfloatercontainer.h b/indra/newview/llimfloatercontainer.h
index bc06f0cbd3..f6cdc25ebd 100644
--- a/indra/newview/llimfloatercontainer.h
+++ b/indra/newview/llimfloatercontainer.h
@@ -43,7 +43,7 @@
class LLTabContainer;
-class LLIMFloaterContainer : public LLMultiFloater, public LLAvatarPropertiesObserver, public LLParticularGroupMgrObserver
+class LLIMFloaterContainer : public LLMultiFloater
{
public:
LLIMFloaterContainer(const LLSD& seed);
@@ -51,25 +51,24 @@ public:
/*virtual*/ BOOL postBuild();
/*virtual*/ void onOpen(const LLSD& key);
+ void onCloseFloater(LLUUID& id);
/*virtual*/ void addFloater(LLFloater* floaterp,
BOOL select_added_floater,
LLTabContainer::eInsertionPoint insertion_point = LLTabContainer::END);
- void processProperties(void* data, EAvatarProcessorType type);
- void changed(const LLUUID& group_id, LLGroupChange gc);
-
static LLFloater* getCurrentVoiceFloater();
static LLIMFloaterContainer* findInstance();
static LLIMFloaterContainer* getInstance();
+ virtual void setMinimized(BOOL b);
+
private:
typedef std::map<LLUUID,LLFloater*> avatarID_panel_map_t;
avatarID_panel_map_t mSessions;
- void onCloseFloater(LLUUID avatar_id);
void onNewMessageReceived(const LLSD& data);
};
diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp
index 4bdf5f42dc..0e3b78df7f 100644
--- a/indra/newview/llimpanel.cpp
+++ b/indra/newview/llimpanel.cpp
@@ -300,7 +300,7 @@ void LLFloaterIMPanel::onVolumeChange(LLUICtrl* source, void* user_data)
LLFloaterIMPanel* floaterp = (LLFloaterIMPanel*)user_data;
if (floaterp)
{
- gVoiceClient->setUserVolume(floaterp->mOtherParticipantUUID, (F32)source->getValue().asReal());
+ LLVoiceClient::getInstance()->setUserVolume(floaterp->mOtherParticipantUUID, (F32)source->getValue().asReal());
}
}
@@ -312,7 +312,7 @@ void LLFloaterIMPanel::draw()
BOOL enable_connect = (region && region->getCapability("ChatSessionRequest") != "")
&& mSessionInitialized
- && LLVoiceClient::voiceEnabled()
+ && LLVoiceClient::getInstance()->voiceEnabled()
&& mCallBackEnabled;
// hide/show start call and end call buttons
@@ -320,8 +320,8 @@ void LLFloaterIMPanel::draw()
if (!voice_channel)
return;
- childSetVisible("end_call_btn", LLVoiceClient::voiceEnabled() && voice_channel->getState() >= LLVoiceChannel::STATE_CALL_STARTED);
- childSetVisible("start_call_btn", LLVoiceClient::voiceEnabled() && voice_channel->getState() < LLVoiceChannel::STATE_CALL_STARTED);
+ childSetVisible("end_call_btn", LLVoiceClient::getInstance()->voiceEnabled() && voice_channel->getState() >= LLVoiceChannel::STATE_CALL_STARTED);
+ childSetVisible("start_call_btn", LLVoiceClient::getInstance()->voiceEnabled() && voice_channel->getState() < LLVoiceChannel::STATE_CALL_STARTED);
childSetEnabled("start_call_btn", enable_connect);
childSetEnabled("send_btn", !childGetValue("chat_editor").asString().empty());
@@ -384,11 +384,11 @@ void LLFloaterIMPanel::draw()
else
{
// refresh volume and mute checkbox
- childSetVisible("speaker_volume", LLVoiceClient::voiceEnabled() && voice_channel->isActive());
- childSetValue("speaker_volume", gVoiceClient->getUserVolume(mOtherParticipantUUID));
+ childSetVisible("speaker_volume", LLVoiceClient::getInstance()->voiceEnabled() && voice_channel->isActive());
+ childSetValue("speaker_volume", LLVoiceClient::getInstance()->getUserVolume(mOtherParticipantUUID));
childSetValue("mute_btn", LLMuteList::getInstance()->isMuted(mOtherParticipantUUID, LLMute::flagVoiceChat));
- childSetVisible("mute_btn", LLVoiceClient::voiceEnabled() && voice_channel->isActive());
+ childSetVisible("mute_btn", LLVoiceClient::getInstance()->voiceEnabled() && voice_channel->isActive());
}
LLFloater::draw();
}
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 0c64c2b032..ddfcd68e38 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -36,12 +36,14 @@
#include "llfloaterreg.h"
#include "llfontgl.h"
+#include "llgl.h"
#include "llrect.h"
#include "llerror.h"
#include "llbutton.h"
#include "llhttpclient.h"
#include "llsdutil_math.h"
#include "llstring.h"
+#include "lltextutil.h"
#include "lltrans.h"
#include "lluictrlfactory.h"
@@ -64,7 +66,6 @@
#include "llnearbychat.h"
#include "llspeakers.h" //for LLIMSpeakerMgr
#include "lltextbox.h"
-#include "lltextutil.h"
#include "llviewercontrol.h"
#include "llviewerparcelmgr.h"
@@ -77,6 +78,12 @@ const static std::string IM_FROM_ID("from_id");
const static std::string NO_SESSION("(IM Session Doesn't Exist)");
const static std::string ADHOC_NAME_SUFFIX(" Conference");
+const static std::string NEARBY_P2P_BY_OTHER("nearby_P2P_by_other");
+const static std::string NEARBY_P2P_BY_AGENT("nearby_P2P_by_agent");
+
+/** Timeout of outgoing session initialization (in seconds) */
+const static U32 SESSION_INITIALIZATION_TIMEOUT = 30;
+
std::string LLCallDialogManager::sPreviousSessionlName = "";
LLIMModel::LLIMSession::SType LLCallDialogManager::sPreviousSessionType = LLIMModel::LLIMSession::P2P_SESSION;
std::string LLCallDialogManager::sCurrentSessionlName = "";
@@ -88,6 +95,19 @@ const LLUUID LLOutgoingCallDialog::OCD_KEY = LLUUID("7CF78E11-0CFE-498D-ADB9-141
//
LLIMMgr* gIMMgr = NULL;
+
+BOOL LLSessionTimeoutTimer::tick()
+{
+ if (mSessionId.isNull()) return TRUE;
+
+ LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(mSessionId);
+ if (session && !session->mSessionInitialized)
+ {
+ gIMMgr->showSessionStartError("session_initialization_timed_out_error", mSessionId);
+ }
+ return TRUE;
+}
+
void toast_callback(const LLSD& msg){
// do not show toast in busy mode or it goes from agent
if (gAgent.getBusy() || gAgent.getID() == msg["from_id"])
@@ -143,7 +163,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, bool voice)
+LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string& name, const EInstantMessage& type, const LLUUID& other_participant_id, const uuid_vec_t& ids, bool voice)
: mSessionID(session_id),
mName(name),
mType(type),
@@ -211,6 +231,11 @@ LLIMModel::LLIMSession::LLIMSession(const LLUUID& session_id, const std::string&
//so we're already initialized
mSessionInitialized = true;
}
+ else
+ {
+ //tick returns TRUE - timer will be deleted after the tick
+ new LLSessionTimeoutTimer(mSessionID, SESSION_INITIALIZATION_TIMEOUT);
+ }
if (IM_NOTHING_SPECIAL == type)
{
@@ -232,9 +257,8 @@ 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)
{
- std::string you = LLTrans::getString("You");
- std::string started_call = LLTrans::getString("started_call");
- std::string joined_call = LLTrans::getString("joined_call");
+ std::string you_joined_call = LLTrans::getString("you_joined_call");
+ std::string you_started_call = LLTrans::getString("you_started_call");
std::string other_avatar_name = "";
std::string message;
@@ -252,13 +276,15 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
switch(new_state)
{
case LLVoiceChannel::STATE_CALL_STARTED :
- message = other_avatar_name + " " + started_call;
- LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message);
-
- break;
+ {
+ LLStringUtil::format_map_t string_args;
+ string_args["[NAME]"] = other_avatar_name;
+ message = LLTrans::getString("name_started_call", string_args);
+ LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);
+ break;
+ }
case LLVoiceChannel::STATE_CONNECTED :
- message = you + " " + joined_call;
- LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message);
+ LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, you_joined_call);
default:
break;
}
@@ -268,12 +294,11 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
switch(new_state)
{
case LLVoiceChannel::STATE_CALL_STARTED :
- message = you + " " + started_call;
- LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message);
+ LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, you_started_call);
break;
case LLVoiceChannel::STATE_CONNECTED :
- message = other_avatar_name + " " + joined_call;
- LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message);
+ message = LLTrans::getString("answered_call");
+ LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, message);
default:
break;
}
@@ -287,8 +312,7 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
switch(new_state)
{
case LLVoiceChannel::STATE_CONNECTED :
- message = you + " " + joined_call;
- LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message);
+ LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, you_joined_call);
default:
break;
}
@@ -298,8 +322,7 @@ void LLIMModel::LLIMSession::onVoiceChannelStateChanged(const LLVoiceChannel::ES
switch(new_state)
{
case LLVoiceChannel::STATE_CALL_STARTED :
- message = you + " " + started_call;
- LLIMModel::getInstance()->addMessageSilently(mSessionID, SYSTEM_FROM, LLUUID::null, message);
+ LLIMModel::getInstance()->addMessage(mSessionID, SYSTEM_FROM, LLUUID::null, you_started_call);
break;
default:
break;
@@ -319,13 +342,13 @@ LLIMModel::LLIMSession::~LLIMSession()
mSpeakers = NULL;
// End the text IM session if necessary
- if(gVoiceClient && mOtherParticipantID.notNull())
+ if(LLVoiceClient::getInstance() && mOtherParticipantID.notNull())
{
switch(mType)
{
case IM_NOTHING_SPECIAL:
case IM_SESSION_P2P_INVITE:
- gVoiceClient->endUserIMSession(mOtherParticipantID);
+ LLVoiceClient::getInstance()->endUserIMSession(mOtherParticipantID);
break;
default:
@@ -354,7 +377,7 @@ void LLIMModel::LLIMSession::sessionInitReplyReceived(const LLUUID& new_session_
}
}
-void LLIMModel::LLIMSession::addMessage(const std::string& from, const LLUUID& from_id, const std::string& utf8_text, const std::string& time)
+void LLIMModel::LLIMSession::addMessage(const std::string& from, const LLUUID& from_id, const std::string& utf8_text, const std::string& time, const bool is_history)
{
LLSD message;
message["from"] = from;
@@ -362,6 +385,7 @@ void LLIMModel::LLIMSession::addMessage(const std::string& from, const LLUUID& f
message["message"] = utf8_text;
message["time"] = time;
message["index"] = (LLSD::Integer)mMsgs.size();
+ message["is_history"] = is_history;
mMsgs.push_front(message);
@@ -390,7 +414,7 @@ void LLIMModel::LLIMSession::addMessagesFromHistory(const std::list<LLSD>& histo
std::string timestamp = msg[IM_TIME];
std::string text = msg[IM_TEXT];
- addMessage(from, from_id, text, timestamp);
+ addMessage(from, from_id, text, timestamp, true);
it++;
}
@@ -404,11 +428,11 @@ void LLIMModel::LLIMSession::chatFromLogFile(LLLogChat::ELogLineType type, const
if (type == LLLogChat::LOG_LINE)
{
- self->addMessage("", LLSD(), msg["message"].asString(), "");
+ self->addMessage("", LLSD(), msg["message"].asString(), "", true);
}
else if (type == LLLogChat::LOG_LLSD)
{
- self->addMessage(msg["from"].asString(), msg["from_id"].asUUID(), msg["message"].asString(), msg["time"].asString());
+ self->addMessage(msg["from"].asString(), msg["from_id"].asUUID(), msg["message"].asString(), msg["time"].asString(), true);
}
}
@@ -419,7 +443,7 @@ LLIMModel::LLIMSession* LLIMModel::findIMSession(const LLUUID& session_id) const
}
//*TODO consider switching to using std::set instead of std::list for holding LLUUIDs across the whole code
-LLIMModel::LLIMSession* LLIMModel::findAdHocIMSession(const std::vector<LLUUID>& ids)
+LLIMModel::LLIMSession* LLIMModel::findAdHocIMSession(const uuid_vec_t& ids)
{
S32 num = ids.size();
if (!num) return NULL;
@@ -436,7 +460,7 @@ LLIMModel::LLIMSession* LLIMModel::findAdHocIMSession(const std::vector<LLUUID>&
std::list<LLUUID> tmp_list(session->mInitialTargetIDs.begin(), session->mInitialTargetIDs.end());
- std::vector<LLUUID>::const_iterator iter = ids.begin();
+ uuid_vec_t::const_iterator iter = ids.begin();
while (iter != ids.end())
{
tmp_list.remove(*iter);
@@ -567,7 +591,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, bool voice)
+ const LLUUID& other_participant_id, const uuid_vec_t& ids, bool voice)
{
if (name.empty())
{
@@ -592,7 +616,7 @@ 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;
+ uuid_vec_t no_ids;
return newSession(session_id, name, type, other_participant_id, no_ids, voice);
}
@@ -604,10 +628,10 @@ bool LLIMModel::clearSession(const LLUUID& session_id)
return true;
}
-void LLIMModel::getMessages(const LLUUID& session_id, std::list<LLSD>& messages, int start_index)
+void LLIMModel::getMessagesSilently(const LLUUID& session_id, std::list<LLSD>& messages, int start_index)
{
LLIMSession* session = findIMSession(session_id);
- if (!session)
+ if (!session)
{
llwarns << "session " << session_id << "does not exist " << llendl;
return;
@@ -615,7 +639,7 @@ void LLIMModel::getMessages(const LLUUID& session_id, std::list<LLSD>& messages,
int i = session->mMsgs.size() - start_index;
- for (std::list<LLSD>::iterator iter = session->mMsgs.begin();
+ for (std::list<LLSD>::iterator iter = session->mMsgs.begin();
iter != session->mMsgs.end() && i > 0;
iter++)
{
@@ -624,6 +648,16 @@ void LLIMModel::getMessages(const LLUUID& session_id, std::list<LLSD>& messages,
messages.push_back(*iter);
i--;
}
+}
+
+void LLIMModel::sendNoUnreadMessages(const LLUUID& session_id)
+{
+ LLIMSession* session = findIMSession(session_id);
+ if (!session)
+ {
+ llwarns << "session " << session_id << "does not exist " << llendl;
+ return;
+ }
session->mNumUnread = 0;
session->mParticipantUnreadMessageCount = 0;
@@ -635,6 +669,13 @@ void LLIMModel::getMessages(const LLUUID& session_id, std::list<LLSD>& messages,
mNoUnreadMsgsSignal(arg);
}
+void LLIMModel::getMessages(const LLUUID& session_id, std::list<LLSD>& messages, int start_index)
+{
+ getMessagesSilently(session_id, messages, start_index);
+
+ sendNoUnreadMessages(session_id);
+}
+
bool LLIMModel::addToHistory(const LLUUID& session_id, const std::string& from, const LLUUID& from_id, const std::string& utf8_text) {
LLIMSession* session = findIMSession(session_id);
@@ -713,13 +754,22 @@ LLIMModel::LLIMSession* LLIMModel::addMessageSilently(const LLUUID& session_id,
return NULL;
}
- addToHistory(session_id, from, from_id, utf8_text);
- if (log2file) logToFile(session_id, from, from_id, utf8_text);
+ // replace interactive system message marker with correct from string value
+ std::string from_name = from;
+ if (INTERACTIVE_SYSTEM_FROM == from)
+ {
+ from_name = SYSTEM_FROM;
+ }
+
+ addToHistory(session_id, from_name, from_id, utf8_text);
+ if (log2file) logToFile(session_id, from_name, from_id, utf8_text);
session->mNumUnread++;
//update count of unread messages from real participant
- if (!(from_id.isNull() || from_id == gAgentID || SYSTEM_FROM == from))
+ if (!(from_id.isNull() || from_id == gAgentID || SYSTEM_FROM == from)
+ // we should increment counter for interactive system messages()
+ || INTERACTIVE_SYSTEM_FROM == from)
{
++(session->mParticipantUnreadMessageCount);
}
@@ -873,7 +923,7 @@ void LLIMModel::sendMessage(const std::string& utf8_text,
if((offline == IM_OFFLINE) && (LLVoiceClient::getInstance()->isOnlineSIP(other_participant_id)))
{
// User is online through the OOW connector, but not with a regular viewer. Try to send the message via SLVoice.
- sent = gVoiceClient->sendTextMessage(other_participant_id, utf8_text);
+ sent = LLVoiceClient::getInstance()->sendTextMessage(other_participant_id, utf8_text);
}
if(!sent)
@@ -948,7 +998,42 @@ void LLIMModel::sendMessage(const std::string& utf8_text,
}
// Add the recipient to the recent people list.
- LLRecentPeople::instance().add(other_participant_id);
+ bool is_not_group_id = LLGroupMgr::getInstance()->getGroupData(other_participant_id) == NULL;
+
+ if (is_not_group_id)
+ {
+
+#if 0
+ //use this code to add only online members
+ LLIMSpeakerMgr* speaker_mgr = LLIMModel::getInstance()->getSpeakerManager(im_session_id);
+ LLSpeakerMgr::speaker_list_t speaker_list;
+ speaker_mgr->getSpeakerList(&speaker_list, true);
+ for(LLSpeakerMgr::speaker_list_t::iterator it = speaker_list.begin(); it != speaker_list.end(); it++)
+ {
+ const LLPointer<LLSpeaker>& speakerp = *it;
+
+ LLRecentPeople::instance().add(speakerp->mID);
+ }
+#else
+ LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(im_session_id);
+ if( session == 0)//??? shouldn't really happen
+ {
+ LLRecentPeople::instance().add(other_participant_id);
+ }
+ else
+ {
+ for(uuid_vec_t::iterator it = session->mInitialTargetIDs.begin();
+ it!=session->mInitialTargetIDs.end();++it)
+ {
+ const LLUUID id = *it;
+
+ LLRecentPeople::instance().add(id);
+ }
+ }
+#endif
+ }
+
+
}
void session_starter_helper(
@@ -1069,7 +1154,7 @@ private:
bool LLIMModel::sendStartSession(
const LLUUID& temp_session_id,
const LLUUID& other_participant_id,
- const std::vector<LLUUID>& ids,
+ const uuid_vec_t& ids,
EInstantMessage dialog)
{
if ( dialog == IM_SESSION_GROUP_START )
@@ -1372,7 +1457,13 @@ void LLCallDialogManager::onVoiceChannelChanged(const LLUUID &session_id)
}
sSession = session;
- sSession->mVoiceChannel->setStateChangedCallback(boost::bind(LLCallDialogManager::onVoiceChannelStateChanged, _1, _2, _3));
+
+ static boost::signals2::connection prev_channel_state_changed_connection;
+ // disconnect previously connected callback to avoid have invalid sSession in onVoiceChannelStateChanged()
+ prev_channel_state_changed_connection.disconnect();
+ prev_channel_state_changed_connection =
+ sSession->mVoiceChannel->setStateChangedCallback(boost::bind(LLCallDialogManager::onVoiceChannelStateChanged, _1, _2, _3, _4));
+
if(sCurrentSessionlName != session->mName)
{
sPreviousSessionlName = sCurrentSessionlName;
@@ -1403,7 +1494,7 @@ void LLCallDialogManager::onVoiceChannelChanged(const LLUUID &session_id)
}
-void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction)
+void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction, bool ended_by_agent)
{
LLSD mCallDialogPayload;
LLOutgoingCallDialog* ocd = NULL;
@@ -1423,6 +1514,7 @@ void LLCallDialogManager::onVoiceChannelStateChanged(const LLVoiceChannel::EStat
mCallDialogPayload["state"] = new_state;
mCallDialogPayload["disconnected_channel_name"] = sSession->mName;
mCallDialogPayload["session_type"] = sSession->mSessionType;
+ mCallDialogPayload["ended_by_agent"] = ended_by_agent;
switch(new_state)
{
@@ -1468,6 +1560,13 @@ LLCallDialog::LLCallDialog(const LLSD& payload)
mLifetime(DEFAULT_LIFETIME)
{
setAutoFocus(FALSE);
+ // force docked state since this floater doesn't save it between recreations
+ setDocked(true);
+}
+
+LLCallDialog::~LLCallDialog()
+{
+ LLUI::removePopup(this);
}
void LLCallDialog::getAllowedRect(LLRect& rect)
@@ -1517,6 +1616,15 @@ void LLCallDialog::draw()
}
}
+// virtual
+void LLCallDialog::onOpen(const LLSD& key)
+{
+ LLDockableFloater::onOpen(key);
+
+ // it should be over the all floaters. EXT-5116
+ LLUI::addPopup(this);
+}
+
void LLCallDialog::setIcon(const LLSD& session_id, const LLSD& participant_id)
{
// *NOTE: 12/28/2009: check avaline calls: LLVoiceClient::isParticipantAvatar returns false for them
@@ -1609,7 +1717,15 @@ void LLOutgoingCallDialog::show(const LLSD& key)
channel_name = LLTextUtil::formatPhoneNumber(channel_name);
}
childSetTextArg("nearby", "[VOICE_CHANNEL_NAME]", channel_name);
- childSetTextArg("nearby_P2P", "[VOICE_CHANNEL_NAME]", mPayload["disconnected_channel_name"].asString());
+
+ // skipping "You will now be reconnected to nearby" in notification when call is ended by disabling voice,
+ // so no reconnection to nearby chat happens (EXT-4397)
+ bool voice_works = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking();
+ std::string reconnect_nearby = voice_works ? LLTrans::getString("reconnect_nearby") : std::string();
+ childSetTextArg("nearby", "[RECONNECT_NEARBY]", reconnect_nearby);
+
+ const std::string& nearby_str = mPayload["ended_by_agent"] ? NEARBY_P2P_BY_AGENT : NEARBY_P2P_BY_OTHER;
+ childSetTextArg(nearby_str, "[RECONNECT_NEARBY]", reconnect_nearby);
}
std::string callee_name = mPayload["session_name"].asString();
@@ -1643,11 +1759,14 @@ void LLOutgoingCallDialog::show(const LLSD& key)
{
case LLVoiceChannel::STATE_CALL_STARTED :
getChild<LLTextBox>("calling")->setVisible(true);
+ getChild<LLButton>("Cancel")->setVisible(true);
if(show_oldchannel)
{
getChild<LLTextBox>("leaving")->setVisible(true);
}
break;
+ // STATE_READY is here to show appropriate text for ad-hoc and group calls when floater is shown(EXT-6893)
+ case LLVoiceChannel::STATE_READY :
case LLVoiceChannel::STATE_RINGING :
if(show_oldchannel)
{
@@ -1664,7 +1783,8 @@ void LLOutgoingCallDialog::show(const LLSD& key)
case LLVoiceChannel::STATE_HUNG_UP :
if (mPayload["session_type"].asInteger() == LLIMModel::LLIMSession::P2P_SESSION)
{
- getChild<LLTextBox>("nearby_P2P")->setVisible(true);
+ const std::string& nearby_str = mPayload["ended_by_agent"] ? NEARBY_P2P_BY_AGENT : NEARBY_P2P_BY_OTHER;
+ getChild<LLTextBox>(nearby_str)->setVisible(true);
}
else
{
@@ -1683,7 +1803,8 @@ 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_P2P_by_other")->setVisible(false);
+ getChild<LLTextBox>("nearby_P2P_by_agent")->setVisible(false);
getChild<LLTextBox>("nearby")->setVisible(false);
getChild<LLTextBox>("noanswer")->setVisible(false);
}
@@ -1726,8 +1847,8 @@ LLCallDialog(payload)
void LLIncomingCallDialog::onLifetimeExpired()
{
- // check whether a call is valid or not
- if (LLVoiceClient::getInstance()->findSession(mPayload["caller_id"].asUUID()))
+ std::string session_handle = mPayload["session_handle"].asString();
+ if (LLVoiceClient::getInstance()->isValidChannel(session_handle))
{
// restart notification's timer if call is still valid
mLifetimeTimer.start();
@@ -1820,15 +1941,24 @@ void LLIncomingCallDialog::onOpen(const LLSD& key)
{
LLCallDialog::onOpen(key);
+ LLStringUtil::format_map_t args;
+ LLGroupData data;
+ // if it's a group call, retrieve group name to use it in question
+ if (gAgent.getGroupData(key["session_id"].asUUID(), data))
+ {
+ args["[GROUP]"] = data.mName;
+ }
// tell the user which voice channel they would be leaving
LLVoiceChannel *voice = LLVoiceChannel::getCurrentVoiceChannel();
if (voice && !voice->getSessionName().empty())
{
- childSetTextArg("question", "[CURRENT_CHAT]", voice->getSessionName());
+ args["[CURRENT_CHAT]"] = voice->getSessionName();
+ childSetText("question", getString(key["question_type"].asString(), args));
}
else
{
- childSetTextArg("question", "[CURRENT_CHAT]", getString("localchat"));
+ args["[CURRENT_CHAT]"] = getString("localchat");
+ childSetText("question", getString(key["question_type"].asString(), args));
}
}
@@ -1946,8 +2076,9 @@ void LLIncomingCallDialog::processCallResponse(S32 response)
// send notification message to the corresponding chat
if (mPayload["notify_box_type"].asString() == "VoiceInviteGroup" || mPayload["notify_box_type"].asString() == "VoiceInviteAdHoc")
{
- std::string started_call = LLTrans::getString("started_call");
- std::string message = mPayload["caller_name"].asString() + " " + started_call;
+ LLStringUtil::format_map_t string_args;
+ string_args["[NAME]"] = mPayload["caller_name"].asString();
+ std::string message = LLTrans::getString("name_started_call", string_args);
LLIMModel::getInstance()->addMessageSilently(session_id, SYSTEM_FROM, LLUUID::null, message);
}
}
@@ -1961,10 +2092,10 @@ void LLIncomingCallDialog::processCallResponse(S32 response)
{
if (type == IM_SESSION_P2P_INVITE)
{
- if(gVoiceClient)
+ if(LLVoiceClient::getInstance())
{
std::string s = mPayload["session_handle"].asString();
- gVoiceClient->declineInvite(s);
+ LLVoiceClient::getInstance()->declineInvite(s);
}
}
else
@@ -2052,11 +2183,8 @@ bool inviteUserResponse(const LLSD& notification, const LLSD& response)
{
if (type == IM_SESSION_P2P_INVITE)
{
- if(gVoiceClient)
- {
- std::string s = payload["session_handle"].asString();
- gVoiceClient->declineInvite(s);
- }
+ std::string s = payload["session_handle"].asString();
+ LLVoiceClient::getInstance()->declineInvite(s);
}
else
{
@@ -2183,12 +2311,20 @@ void LLIMMgr::addSystemMessage(const LLUUID& session_id, const std::string& mess
}
else // going to IM session
{
+ message = LLTrans::getString(message_name + "-im");
+ message.setArgs(args);
if (hasSession(session_id))
{
- message = LLTrans::getString(message_name + "-im");
- message.setArgs(args);
gIMMgr->addMessage(session_id, LLUUID::null, SYSTEM_FROM, message.getString());
}
+ // log message to file
+ else
+ {
+ std::string session_name;
+ // since we select user to share item with - his name is already in cache
+ gCacheName->getFullName(args["user_id"], session_name);
+ LLIMModel::instance().logToFile(session_name, SYSTEM_FROM, LLUUID::null, message.getString());
+ }
}
}
@@ -2361,6 +2497,8 @@ void LLIMMgr::inviteToSession(
}
std::string notify_box_type;
+ // voice invite question is different from default only for group call (EXT-7118)
+ std::string question_type = "VoiceInviteQuestionDefault";
BOOL ad_hoc_invite = FALSE;
if(type == IM_SESSION_P2P_INVITE)
@@ -2372,6 +2510,7 @@ void LLIMMgr::inviteToSession(
{
//only really old school groups have voice invitations
notify_box_type = "VoiceInviteGroup";
+ question_type = "VoiceInviteQuestionGroup";
}
else if ( inv_type == INVITATION_TYPE_VOICE )
{
@@ -2396,6 +2535,7 @@ void LLIMMgr::inviteToSession(
payload["session_handle"] = session_handle;
payload["session_uri"] = session_uri;
payload["notify_box_type"] = notify_box_type;
+ payload["question_type"] = question_type;
LLVoiceChannel* channelp = LLVoiceChannel::getChannelByID(session_id);
if (channelp && channelp->callStarted())
@@ -2623,6 +2763,12 @@ bool LLIMMgr::endCall(const LLUUID& session_id)
if (!voice_channel) return false;
voice_channel->deactivate();
+ LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(session_id);
+ if (im_session)
+ {
+ // need to update speakers' state
+ im_session->mSpeakers->update(FALSE);
+ }
return true;
}
@@ -2962,7 +3108,7 @@ public:
return;
}
- if(!LLVoiceClient::voiceEnabled())
+ if(!LLVoiceClient::getInstance()->voiceEnabled() || !LLVoiceClient::getInstance()->isVoiceWorking())
{
// Don't display voice invites unless the user has voice enabled.
return;
diff --git a/indra/newview/llimview.h b/indra/newview/llimview.h
index 1c7aaa3f1b..ffa8a16797 100644
--- a/indra/newview/llimview.h
+++ b/indra/newview/llimview.h
@@ -34,6 +34,7 @@
#define LL_LLIMVIEW_H
#include "lldockablefloater.h"
+#include "lleventtimer.h"
#include "llinstantmessage.h"
#include "lllogchat.h"
@@ -45,7 +46,24 @@ class LLFriendObserver;
class LLCallDialogManager;
class LLIMSpeakerMgr;
+/**
+ * Timeout Timer for outgoing Ad-Hoc/Group IM sessions which being initialized by the server
+ */
+class LLSessionTimeoutTimer : public LLEventTimer
+{
+public:
+ LLSessionTimeoutTimer(const LLUUID& session_id, F32 period) : LLEventTimer(period), mSessionId(session_id) {}
+ virtual ~LLSessionTimeoutTimer() {};
+ /* virtual */ BOOL tick();
+
+private:
+ LLUUID mSessionId;
+};
+
+/**
+ * Model (MVC) for IM Sessions
+ */
class LLIMModel : public LLSingleton<LLIMModel>
{
public:
@@ -61,12 +79,12 @@ public:
} SType;
LLIMSession(const LLUUID& session_id, const std::string& name,
- const EInstantMessage& type, const LLUUID& other_participant_id, const std::vector<LLUUID>& ids, bool voice);
+ const EInstantMessage& type, const LLUUID& other_participant_id, const uuid_vec_t& ids, bool voice);
virtual ~LLIMSession();
void sessionInitReplyReceived(const LLUUID& new_session_id);
void addMessagesFromHistory(const std::list<LLSD>& history);
- void addMessage(const std::string& from, const LLUUID& from_id, const std::string& utf8_text, const std::string& time);
+ void addMessage(const std::string& from, const LLUUID& from_id, const std::string& utf8_text, const std::string& time, const bool is_history = false);
void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction);
/** @deprecated */
@@ -93,7 +111,7 @@ public:
EInstantMessage mType;
SType mSessionType;
LLUUID mOtherParticipantID;
- std::vector<LLUUID> mInitialTargetIDs;
+ uuid_vec_t mInitialTargetIDs;
std::string mHistoryFileName;
// connection to voice channel state change signal
@@ -152,7 +170,7 @@ public:
* Find an Ad-Hoc IM Session with specified participants
* @return first found Ad-Hoc session or NULL if the session does not exist
*/
- LLIMSession* findAdHocIMSession(const std::vector<LLUUID>& ids);
+ LLIMSession* findAdHocIMSession(const uuid_vec_t& ids);
/**
* Rebind session data to a new session id.
@@ -167,7 +185,7 @@ 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, bool voice = false);
+ const uuid_vec_t& 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);
@@ -178,6 +196,17 @@ public:
bool clearSession(const LLUUID& session_id);
/**
+ * Populate supplied std::list with messages starting from index specified by start_index without
+ * emitting no unread messages signal.
+ */
+ void getMessagesSilently(const LLUUID& session_id, std::list<LLSD>& messages, int start_index = 0);
+
+ /**
+ * Sends no unread messages signal.
+ */
+ void sendNoUnreadMessages(const LLUUID& session_id);
+
+ /**
* Populate supplied std::list with messages starting from index specified by start_index
*/
void getMessages(const LLUUID& session_id, std::list<LLSD>& messages, int start_index = 0);
@@ -244,7 +273,7 @@ public:
static void sendLeaveSession(const LLUUID& session_id, const LLUUID& other_participant_id);
static bool sendStartSession(const LLUUID& temp_session_id, const LLUUID& other_participant_id,
- const std::vector<LLUUID>& ids, EInstantMessage dialog);
+ const uuid_vec_t& ids, EInstantMessage dialog);
static void sendTypingState(LLUUID session_id, LLUUID other_participant_id, BOOL typing);
static void sendMessage(const std::string& utf8_text, const LLUUID& im_session_id,
const LLUUID& other_participant_id, EInstantMessage dialog);
@@ -452,7 +481,7 @@ public:
static void initClass();
static void onVoiceChannelChanged(const LLUUID &session_id);
- static void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction);
+ static void onVoiceChannelStateChanged(const LLVoiceChannel::EState& old_state, const LLVoiceChannel::EState& new_state, const LLVoiceChannel::EDirection& direction, bool ended_by_agent);
protected:
static std::string sPreviousSessionlName;
@@ -466,12 +495,13 @@ class LLCallDialog : public LLDockableFloater
{
public:
LLCallDialog(const LLSD& payload);
- ~LLCallDialog() {}
+ ~LLCallDialog();
virtual BOOL postBuild();
// check timer state
/*virtual*/ void draw();
+ /*virtual*/ void onOpen(const LLSD& key);
protected:
// lifetime timer for a notification
diff --git a/indra/newview/llinspect.cpp b/indra/newview/llinspect.cpp
index c7b651f37c..81cfce53b1 100644
--- a/indra/newview/llinspect.cpp
+++ b/indra/newview/llinspect.cpp
@@ -32,6 +32,7 @@
#include "llinspect.h"
+#include "lltooltip.h"
#include "llcontrol.h" // LLCachedControl
#include "llui.h" // LLUI::sSettingsGroups
#include "llviewermenu.h"
@@ -104,6 +105,26 @@ BOOL LLInspect::handleHover(S32 x, S32 y, MASK mask)
return LLView::handleHover(x, y, mask);
}
+BOOL LLInspect::handleToolTip(S32 x, S32 y, MASK mask)
+{
+ BOOL handled = FALSE;
+
+
+ //delegate handling of tooltip to the hovered child
+ LLView* child_handler = childFromPoint(x,y);
+ if (child_handler && !child_handler->getToolTip().empty())// show tooltip if a view has non-empty tooltip message
+ {
+ //build LLInspector params to get correct tooltip setting, etc. background image
+ LLInspector::Params params;
+ params.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>());
+ params.message = child_handler->getToolTip();
+ //set up delay if there is no visible tooltip at this moment
+ params.delay_time = LLToolTipMgr::instance().toolTipVisible() ? 0.f : LLUI::sSettingGroups["config"]->getF32( "ToolTipDelay" );
+ LLToolTipMgr::instance().show(params);
+ handled = TRUE;
+ }
+ return handled;
+}
// virtual
void LLInspect::onMouseLeave(S32 x, S32 y, MASK mask)
{
diff --git a/indra/newview/llinspect.h b/indra/newview/llinspect.h
index f8c86618d2..6d994a8d7c 100644
--- a/indra/newview/llinspect.h
+++ b/indra/newview/llinspect.h
@@ -47,6 +47,7 @@ public:
/*virtual*/ void draw();
/*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask);
/*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
/// Start open animation
diff --git a/indra/newview/llinspectavatar.cpp b/indra/newview/llinspectavatar.cpp
index b2cdc0738f..d9fdc876db 100644
--- a/indra/newview/llinspectavatar.cpp
+++ b/indra/newview/llinspectavatar.cpp
@@ -51,12 +51,14 @@
#include "llviewermenu.h"
#include "llvoiceclient.h"
#include "llviewerobjectlist.h"
+#include "lltransientfloatermgr.h"
// Linden libraries
#include "llfloater.h"
#include "llfloaterreg.h"
#include "llmenubutton.h"
#include "lltooltip.h" // positionViewNearMouse()
+#include "lltrans.h"
#include "lluictrl.h"
#include "llavatariconctrl.h"
@@ -71,7 +73,7 @@ class LLFetchAvatarData;
// Avatar Inspector, a small information window used when clicking
// on avatar names in the 2D UI and in the ambient inspector widget for
// the 3D world.
-class LLInspectAvatar : public LLInspect
+class LLInspectAvatar : public LLInspect, LLTransientFloater
{
friend class LLFloaterReg;
@@ -97,6 +99,8 @@ public:
// gear menu is not open
/* virtual */ void onMouseLeave(S32 x, S32 y, MASK mask);
+ virtual LLTransientFloaterMgr::ETransientGroup getGroup() { return LLTransientFloaterMgr::GLOBAL; }
+
private:
// Make network requests for all the data to display in this view.
// Used on construction and if avatar id changes.
@@ -120,6 +124,7 @@ private:
void onClickTeleport();
void onClickInviteToGroup();
void onClickPay();
+ void onClickShare();
void onToggleMute();
void onClickReport();
void onClickFreeze();
@@ -133,6 +138,7 @@ private:
void onVolumeChange(const LLSD& data);
bool enableMute();
bool enableUnmute();
+ bool enableTeleportOffer();
// Is used to determine if "Add friend" option should be enabled in gear menu
bool isNotFriend();
@@ -213,6 +219,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.Share", boost::bind(&LLInspectAvatar::onClickShare, this));
mCommitCallbackRegistrar.add("InspectAvatar.ToggleMute", boost::bind(&LLInspectAvatar::onToggleMute, this));
mCommitCallbackRegistrar.add("InspectAvatar.Freeze",
boost::bind(&LLInspectAvatar::onClickFreeze, this));
@@ -230,11 +237,15 @@ LLInspectAvatar::LLInspectAvatar(const LLSD& sd)
boost::bind(&LLInspectAvatar::onVisibleZoomIn, this));
mEnableCallbackRegistrar.add("InspectAvatar.Gear.Enable", boost::bind(&LLInspectAvatar::isNotFriend, this));
mEnableCallbackRegistrar.add("InspectAvatar.Gear.EnableCall", boost::bind(&LLAvatarActions::canCall));
+ mEnableCallbackRegistrar.add("InspectAvatar.Gear.EnableTeleportOffer", boost::bind(&LLInspectAvatar::enableTeleportOffer, 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.
+
+ LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::GLOBAL, this);
+ LLTransientFloater::init(this);
}
LLInspectAvatar::~LLInspectAvatar()
@@ -243,6 +254,8 @@ LLInspectAvatar::~LLInspectAvatar()
// view
delete mPropertiesRequest;
mPropertiesRequest = NULL;
+
+ LLTransientFloaterMgr::getInstance()->removeControlView(this);
}
/*virtual*/
@@ -368,7 +381,11 @@ void LLInspectAvatar::requestUpdate()
void LLInspectAvatar::processAvatarData(LLAvatarData* data)
{
LLStringUtil::format_map_t args;
- args["[BORN_ON]"] = data->born_on;
+ {
+ std::string birth_date = LLTrans::getString("AvatarBirthDateFormat");
+ LLStringUtil::format(birth_date, LLSD().with("datetime", (S32) data->born_on.secondsSinceEpoch()));
+ args["[BORN_ON]"] = birth_date;
+ }
args["[AGE]"] = LLDateUtil::ageFromDate(data->born_on, LLDate::now());
args["[SL_PROFILE]"] = data->about_text;
args["[RW_PROFILE"] = data->fl_about_text;
@@ -524,8 +541,7 @@ void LLInspectAvatar::toggleSelectedVoice(bool enabled)
void LLInspectAvatar::updateVolumeSlider()
{
-
- bool voice_enabled = gVoiceClient->getVoiceEnabled(mAvatarID);
+ bool voice_enabled = LLVoiceClient::getInstance()->getVoiceEnabled(mAvatarID);
// Do not display volume slider and mute button if it
// is ourself or we are not in a voice channel together
@@ -554,8 +570,8 @@ void LLInspectAvatar::updateVolumeSlider()
LLUICtrl* volume_slider = getChild<LLUICtrl>("volume_slider");
volume_slider->setEnabled( !is_muted );
- const F32 DEFAULT_VOLUME = 0.5f;
F32 volume;
+
if (is_muted)
{
// it's clearer to display their volume as zero
@@ -564,14 +580,7 @@ void LLInspectAvatar::updateVolumeSlider()
else
{
// actual volume
- volume = gVoiceClient->getUserVolume(mAvatarID);
-
- // *HACK: Voice client doesn't have any data until user actually
- // says something.
- if (volume == 0.f)
- {
- volume = DEFAULT_VOLUME;
- }
+ volume = LLVoiceClient::getInstance()->getUserVolume(mAvatarID);
}
volume_slider->setValue( (F64)volume );
}
@@ -600,7 +609,7 @@ void LLInspectAvatar::onClickMuteVolume()
void LLInspectAvatar::onVolumeChange(const LLSD& data)
{
F32 volume = (F32)data.asReal();
- gVoiceClient->setUserVolume(mAvatarID, volume);
+ LLVoiceClient::getInstance()->setUserVolume(mAvatarID, volume);
}
void LLInspectAvatar::nameUpdatedCallback(
@@ -678,6 +687,12 @@ void LLInspectAvatar::onClickPay()
closeFloater();
}
+void LLInspectAvatar::onClickShare()
+{
+ LLAvatarActions::share(mAvatarID);
+ closeFloater();
+}
+
void LLInspectAvatar::onToggleMute()
{
LLMute mute(mAvatarID, mAvatarName, LLMute::AGENT);
@@ -756,6 +771,11 @@ bool LLInspectAvatar::enableUnmute()
}
}
+bool LLInspectAvatar::enableTeleportOffer()
+{
+ return LLAvatarActions::canOfferTeleport(mAvatarID);
+}
+
//////////////////////////////////////////////////////////////////////////////
// LLInspectAvatarUtil
//////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llinspectobject.cpp b/indra/newview/llinspectobject.cpp
index 91cbbbf430..a2b5ffbac4 100644
--- a/indra/newview/llinspectobject.cpp
+++ b/indra/newview/llinspectobject.cpp
@@ -480,7 +480,7 @@ void LLInspectObject::updateCreator(LLSelectNode* nodep)
// Objects cannot be created by a group, so use agent URL format
LLUUID creator_id = nodep->mPermissions->getCreator();
std::string creator_url =
- LLSLURL::buildCommand("agent", creator_id, "about");
+ LLSLURL("agent", creator_id, "about").getSLURLString();
args["[CREATOR]"] = creator_url;
// created by one user but owned by another
@@ -490,12 +490,12 @@ void LLInspectObject::updateCreator(LLSelectNode* nodep)
if (group_owned)
{
owner_id = nodep->mPermissions->getGroup();
- owner_url = LLSLURL::buildCommand("group", owner_id, "about");
+ owner_url = LLSLURL("group", owner_id, "about").getSLURLString();
}
else
{
owner_id = nodep->mPermissions->getOwner();
- owner_url = LLSLURL::buildCommand("agent", owner_id, "about");
+ owner_url = LLSLURL("agent", owner_id, "about").getSLURLString();
}
args["[OWNER]"] = owner_url;
diff --git a/indra/newview/llinspectremoteobject.cpp b/indra/newview/llinspectremoteobject.cpp
index 66e4a1bf66..97ff771658 100644
--- a/indra/newview/llinspectremoteobject.cpp
+++ b/indra/newview/llinspectremoteobject.cpp
@@ -176,11 +176,11 @@ void LLInspectRemoteObject::update()
{
if (mGroupOwned)
{
- owner = LLSLURL::buildCommand("group", mOwnerID, "about");
+ owner = LLSLURL("group", mOwnerID, "about").getSLURLString();
}
else
{
- owner = LLSLURL::buildCommand("agent", mOwnerID, "about");
+ owner = LLSLURL("agent", mOwnerID, "about").getSLURLString();
}
}
else
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index 19fbd7ade1..afaeddaaeb 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -33,21 +33,27 @@
#include "llviewerprecompiledheaders.h"
#include "llinventorybridge.h"
+// external projects
+#include "lltransfersourceasset.h"
+
#include "llagent.h"
+#include "llagentcamera.h"
#include "llagentwearables.h"
#include "llappearancemgr.h"
#include "llavataractions.h"
-#include "llfloatercustomize.h"
#include "llfloateropenobject.h"
#include "llfloaterreg.h"
#include "llfloaterworldmap.h"
#include "llfriendcard.h"
#include "llgesturemgr.h"
+#include "llgiveinventory.h"
#include "llimfloater.h"
#include "llimview.h"
#include "llinventoryclipboard.h"
+#include "llinventorydefines.h"
#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
+#include "llinventorymodelbackgroundfetch.h"
#include "llinventorypanel.h"
#include "llnotifications.h"
#include "llnotificationsutil.h"
@@ -55,9 +61,12 @@
#include "llpreviewgesture.h"
#include "llpreviewtexture.h"
#include "llselectmgr.h"
+#include "llsidepanelappearance.h"
#include "llsidetray.h"
#include "lltrans.h"
#include "llviewerassettype.h"
+#include "llviewerfoldertype.h"
+#include "llviewermenu.h"
#include "llviewermessage.h"
#include "llviewerobjectlist.h"
#include "llviewerwindow.h"
@@ -65,6 +74,18 @@
#include "llwearablelist.h"
#include "llpaneloutfitsinventory.h"
+typedef std::pair<LLUUID, LLUUID> two_uuids_t;
+typedef std::list<two_uuids_t> two_uuids_list_t;
+
+struct LLMoveInv
+{
+ LLUUID mObjectID;
+ LLUUID mCategoryID;
+ two_uuids_list_t mMoveList;
+ void (*mCallback)(S32, void*);
+ void* mUserData;
+};
+
using namespace LLOldEvents;
// Helpers
@@ -83,64 +104,32 @@ void dec_busy_count()
}
// Function declarations
-void wear_add_inventory_item_on_avatar(LLInventoryItem* item);
void remove_inventory_category_from_avatar(LLInventoryCategory* category);
void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_id);
bool move_task_inventory_callback(const LLSD& notification, const LLSD& response, LLMoveInv*);
bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& response);
-
-std::string ICON_NAME[ICON_NAME_COUNT] =
-{
- "Inv_Texture",
- "Inv_Sound",
- "Inv_CallingCard",
- "Inv_CallingCard",
- "Inv_Landmark",
- "Inv_Landmark",
- "Inv_Script",
- "Inv_Clothing",
- "Inv_Object",
- "Inv_Object",
- "Inv_Notecard",
- "Inv_Skin",
- "Inv_Snapshot",
-
- "Inv_BodyShape",
- "Inv_Skin",
- "Inv_Hair",
- "Inv_Eye",
- "Inv_Shirt",
- "Inv_Pants",
- "Inv_Shoe",
- "Inv_Socks",
- "Inv_Jacket",
- "Inv_Gloves",
- "Inv_Undershirt",
- "Inv_Underpants",
- "Inv_Skirt",
- "Inv_Alpha",
- "Inv_Tattoo",
-
- "Inv_Animation",
- "Inv_Gesture",
-
- "Inv_LinkItem",
- "Inv_LinkFolder"
-};
+void teleport_via_landmark(const LLUUID& asset_id);
// +=================================================+
// | LLInvFVBridge |
// +=================================================+
-LLInvFVBridge::LLInvFVBridge(LLInventoryPanel* inventory, const LLUUID& uuid) :
-mUUID(uuid), mInvType(LLInventoryType::IT_NONE)
+LLInvFVBridge::LLInvFVBridge(LLInventoryPanel* inventory,
+ LLFolderView* root,
+ const LLUUID& uuid) :
+ mUUID(uuid),
+ mRoot(root),
+ mInvType(LLInventoryType::IT_NONE),
+ mIsLink(FALSE)
{
mInventoryPanel = inventory->getHandle();
+ const LLInventoryObject* obj = getInventoryObject();
+ mIsLink = obj && obj->getIsLinkType();
}
const std::string& LLInvFVBridge::getName() const
{
- LLInventoryObject* obj = getInventoryObject();
+ const LLInventoryObject* obj = getInventoryObject();
if(obj)
{
return obj->getName();
@@ -156,7 +145,6 @@ const std::string& LLInvFVBridge::getDisplayName() const
// Folders have full perms
PermissionMask LLInvFVBridge::getPermissionMask() const
{
-
return PERM_ALL;
}
@@ -176,34 +164,7 @@ time_t LLInvFVBridge::getCreationDate() const
// Can be destroyed (or moved to trash)
BOOL LLInvFVBridge::isItemRemovable() const
{
- const LLInventoryModel* model = getInventoryModel();
- if(!model)
- {
- return FALSE;
- }
-
- // Can't delete an item that's in the library.
- if(!model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID()))
- {
- return FALSE;
- }
-
- // Disable delete from COF folder; have users explicitly choose "detach/take off".
- if (LLAppearanceManager::instance().getIsProtectedCOFItem(mUUID))
- {
- return FALSE;
- }
-
- const LLInventoryObject *obj = model->getItem(mUUID);
- if (obj && obj->getIsLinkType())
- {
- return TRUE;
- }
- if (get_is_item_worn(mUUID))
- {
- return FALSE;
- }
- return TRUE;
+ return get_is_item_removable(getInventoryModel(), mUUID);
}
// Can be moved to another folder
@@ -212,6 +173,11 @@ BOOL LLInvFVBridge::isItemMovable() const
return TRUE;
}
+BOOL LLInvFVBridge::isLink() const
+{
+ return mIsLink;
+}
+
/*virtual*/
/**
* @brief Adds this item into clipboard storage
@@ -226,13 +192,11 @@ void LLInvFVBridge::cutToClipboard()
// *TODO: make sure this does the right thing
void LLInvFVBridge::showProperties()
{
- LLSD key;
- key["id"] = mUUID;
- LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
+ show_item_profile(mUUID);
// Disable old properties floater; this is replaced by the sidepanel.
/*
- LLFloaterReg::showInstance("properties", mUUID);
+ LLFloaterReg::showInstance("properties", mUUID);
*/
}
@@ -256,7 +220,7 @@ void LLInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batc
{
if(LLAssetType::AT_GESTURE == item->getType())
{
- LLGestureManager::instance().deactivateGesture(item->getUUID());
+ LLGestureMgr::instance().deactivateGesture(item->getUUID());
}
}
}
@@ -272,7 +236,7 @@ void LLInvFVBridge::removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batc
{
if(LLAssetType::AT_GESTURE == descendent_items[j]->getType())
{
- LLGestureManager::instance().deactivateGesture(descendent_items[j]->getUUID());
+ LLGestureMgr::instance().deactivateGesture(descendent_items[j]->getUUID());
}
}
}
@@ -293,12 +257,27 @@ void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*
LLMessageSystem* msg = gMessageSystem;
const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
LLViewerInventoryItem* item = NULL;
- LLViewerInventoryCategory* cat = NULL;
- std::vector<LLUUID> move_ids;
+ uuid_vec_t move_ids;
LLInventoryModel::update_map_t update;
bool start_new_message = true;
S32 count = batch.count();
S32 i;
+
+ // first, hide any 'preview' floaters that correspond to the items
+ // being deleted.
+ for(i = 0; i < count; ++i)
+ {
+ bridge = (LLInvFVBridge*)(batch.get(i));
+ if(!bridge || !bridge->isItemRemovable()) continue;
+ item = (LLViewerInventoryItem*)model->getItem(bridge->getUUID());
+ if(item)
+ {
+ LLPreview::hide(item->getUUID());
+ }
+ }
+
+ // do the inventory move to trash
+
for(i = 0; i < count; ++i)
{
bridge = (LLInvFVBridge*)(batch.get(i));
@@ -308,7 +287,6 @@ void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*
{
if(item->getParentUUID() == trash_id) continue;
move_ids.push_back(item->getUUID());
- LLPreview::hide(item->getUUID());
--update[item->getParentUUID()];
++update[trash_id];
if(start_new_message)
@@ -340,11 +318,12 @@ void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*
gInventory.accountForUpdate(update);
update.clear();
}
+
for(i = 0; i < count; ++i)
{
bridge = (LLInvFVBridge*)(batch.get(i));
if(!bridge || !bridge->isItemRemovable()) continue;
- cat = (LLViewerInventoryCategory*)model->getCategory(bridge->getUUID());
+ LLViewerInventoryCategory* cat = (LLViewerInventoryCategory*)model->getCategory(bridge->getUUID());
if(cat)
{
if(cat->getParentUUID() == trash_id) continue;
@@ -379,8 +358,8 @@ void LLInvFVBridge::removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*
}
// move everything.
- std::vector<LLUUID>::iterator it = move_ids.begin();
- std::vector<LLUUID>::iterator end = move_ids.end();
+ uuid_vec_t::iterator it = move_ids.begin();
+ uuid_vec_t::iterator end = move_ids.end();
for(; it != end; ++it)
{
gInventory.moveObject((*it), trash_id);
@@ -456,7 +435,7 @@ BOOL LLInvFVBridge::isClipboardPasteableAsLink() const
}
}
const LLViewerInventoryCategory *cat = model->getCategory(objects.get(i));
- if (cat && !LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
+ if (cat && LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
{
return FALSE;
}
@@ -465,12 +444,14 @@ BOOL LLInvFVBridge::isClipboardPasteableAsLink() const
}
void hide_context_entries(LLMenuGL& menu,
- const menuentry_vec_t &entries_to_show,
- const menuentry_vec_t &disabled_entries)
+ const menuentry_vec_t &entries_to_show,
+ const menuentry_vec_t &disabled_entries)
{
const LLView::child_list_t *list = menu.getChildList();
- BOOL is_previous_entry_separator = FALSE;
+ // For removing double separators or leading separator. Start at true so that
+ // if the first element is a separator, it will not be shown.
+ BOOL is_previous_entry_separator = TRUE;
LLView::child_list_t::const_iterator itor;
for (itor = list->begin(); itor != list->end(); ++itor)
@@ -566,7 +547,16 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
if (show_asset_id)
{
items.push_back(std::string("Copy Asset UUID"));
- if ( (! ( isItemPermissive() || gAgent.isGodlike() ) )
+
+ bool is_asset_knowable = false;
+
+ LLViewerInventoryItem* inv_item = gInventory.getItem(mUUID);
+ if (inv_item)
+ {
+ is_asset_knowable = LLAssetType::lookupIsAssetIDKnowable(inv_item->getType());
+ }
+ if ( !is_asset_knowable // disable menu item for Inventory items with unknown asset. EXT-5308
+ || (! ( isItemPermissive() || gAgent.isGodlike() ) )
|| (flags & FIRST_SELECTED_ITEM) == 0)
{
disabled_items.push_back(std::string("Copy Asset UUID"));
@@ -582,13 +572,17 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
}
}
- items.push_back(std::string("Paste"));
- if (!isClipboardPasteable() || (flags & FIRST_SELECTED_ITEM) == 0)
+ // Don't allow items to be pasted directly into the COF.
+ if (!isCOFFolder())
+ {
+ items.push_back(std::string("Paste"));
+ }
+ if (!isClipboardPasteable() || ((flags & FIRST_SELECTED_ITEM) == 0))
{
disabled_items.push_back(std::string("Paste"));
}
- if (gAgent.isGodlike())
+ if (gSavedSettings.getBOOL("InventoryLinking"))
{
items.push_back(std::string("Paste As Link"));
if (!isClipboardPasteableAsLink() || (flags & FIRST_SELECTED_ITEM) == 0)
@@ -619,7 +613,13 @@ void LLInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
}
else
{
- items.push_back(std::string("Open"));
+ items.push_back(std::string("Share"));
+ if (!canShare())
+ {
+ disabled_items.push_back(std::string("Share"));
+ }
+
+ addOpenRightClickMenuOption(items);
items.push_back(std::string("Properties"));
getClipboardEntries(true, items, disabled_items, flags);
@@ -650,14 +650,15 @@ void LLInvFVBridge::addTrashContextMenuOptions(menuentry_vec_t &items,
void LLInvFVBridge::addDeleteContextMenuOptions(menuentry_vec_t &items,
menuentry_vec_t &disabled_items)
{
+
+ const LLInventoryObject *obj = getInventoryObject();
+
// Don't allow delete as a direct option from COF folder.
- if (isCOFFolder())
+ if (obj && obj->getIsLinkType() && isCOFFolder() && get_is_item_worn(mUUID))
{
return;
}
- const LLInventoryObject *obj = getInventoryObject();
-
// "Remove link" and "Delete" are the same operation.
if (obj && obj->getIsLinkType() && !get_is_item_worn(mUUID))
{
@@ -674,6 +675,17 @@ void LLInvFVBridge::addDeleteContextMenuOptions(menuentry_vec_t &items,
}
}
+void LLInvFVBridge::addOpenRightClickMenuOption(menuentry_vec_t &items)
+{
+ const LLInventoryObject *obj = getInventoryObject();
+ const BOOL is_link = (obj && obj->getIsLinkType());
+
+ if (is_link)
+ items.push_back(std::string("Open Original"));
+ else
+ items.push_back(std::string("Open"));
+}
+
// *TODO: remove this
BOOL LLInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const
{
@@ -694,7 +706,7 @@ BOOL LLInvFVBridge::startDrag(EDragAndDropType* type, LLUUID* id) const
if (*type == DAD_CATEGORY)
{
- gInventory.startBackgroundFetch(obj->getUUID());
+ LLInventoryModelBackgroundFetch::instance().start(obj->getUUID());
}
rv = TRUE;
@@ -767,7 +779,7 @@ BOOL LLInvFVBridge::isAgentInventory() const
BOOL LLInvFVBridge::isCOFFolder() const
{
- return LLAppearanceManager::instance().getIsInCOF(mUUID);
+ return LLAppearanceMgr::instance().getIsInCOF(mUUID);
}
BOOL LLInvFVBridge::isItemPermissive() const
@@ -781,21 +793,7 @@ void LLInvFVBridge::changeItemParent(LLInventoryModel* model,
const LLUUID& new_parent_id,
BOOL restamp)
{
- if(item->getParentUUID() != new_parent_id)
- {
- LLInventoryModel::update_list_t update;
- LLInventoryModel::LLCategoryUpdate old_folder(item->getParentUUID(),-1);
- update.push_back(old_folder);
- LLInventoryModel::LLCategoryUpdate new_folder(new_parent_id, 1);
- update.push_back(new_folder);
- gInventory.accountForUpdate(update);
-
- LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
- new_item->setParent(new_parent_id);
- new_item->updateParentOnServer(restamp);
- model->updateItem(new_item);
- model->notifyObservers();
- }
+ change_item_parent(model, item, new_parent_id, restamp);
}
// static
@@ -804,41 +802,14 @@ void LLInvFVBridge::changeCategoryParent(LLInventoryModel* model,
const LLUUID& new_parent_id,
BOOL restamp)
{
- // Can't move a folder into a child of itself.
- if (model->isObjectDescendentOf(new_parent_id, cat->getUUID()))
- {
- return;
- }
-
- LLInventoryModel::update_list_t update;
- LLInventoryModel::LLCategoryUpdate old_folder(cat->getParentUUID(), -1);
- update.push_back(old_folder);
- LLInventoryModel::LLCategoryUpdate new_folder(new_parent_id, 1);
- update.push_back(new_folder);
- model->accountForUpdate(update);
-
- LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat);
- new_cat->setParent(new_parent_id);
- new_cat->updateParentOnServer(restamp);
- model->updateCategory(new_cat);
- model->notifyObservers();
-}
-
-
-const std::string safe_inv_type_lookup(LLInventoryType::EType inv_type)
-{
- const std::string rv= LLInventoryType::lookup(inv_type);
- if(rv.empty())
- {
- return std::string("<invalid>");
- }
- return rv;
+ change_category_parent(model, cat, new_parent_id, restamp);
}
LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type,
LLAssetType::EType actual_asset_type,
LLInventoryType::EType inv_type,
LLInventoryPanel* inventory,
+ LLFolderView* root,
const LLUUID& uuid,
U32 flags)
{
@@ -848,104 +819,104 @@ LLInvFVBridge* LLInvFVBridge::createBridge(LLAssetType::EType asset_type,
case LLAssetType::AT_TEXTURE:
if(!(inv_type == LLInventoryType::IT_TEXTURE || inv_type == LLInventoryType::IT_SNAPSHOT))
{
- llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
+ llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << llendl;
}
- new_listener = new LLTextureBridge(inventory, uuid, inv_type);
+ new_listener = new LLTextureBridge(inventory, root, uuid, inv_type);
break;
case LLAssetType::AT_SOUND:
if(!(inv_type == LLInventoryType::IT_SOUND))
{
- llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
+ llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << llendl;
}
- new_listener = new LLSoundBridge(inventory, uuid);
+ new_listener = new LLSoundBridge(inventory, root, uuid);
break;
case LLAssetType::AT_LANDMARK:
if(!(inv_type == LLInventoryType::IT_LANDMARK))
{
- llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
+ llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << llendl;
}
- new_listener = new LLLandmarkBridge(inventory, uuid, flags);
+ new_listener = new LLLandmarkBridge(inventory, root, uuid, flags);
break;
case LLAssetType::AT_CALLINGCARD:
if(!(inv_type == LLInventoryType::IT_CALLINGCARD))
{
- llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
+ llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << llendl;
}
- new_listener = new LLCallingCardBridge(inventory, uuid);
+ new_listener = new LLCallingCardBridge(inventory, root, uuid);
break;
case LLAssetType::AT_SCRIPT:
if(!(inv_type == LLInventoryType::IT_LSL))
{
- llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
+ llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << llendl;
}
- new_listener = new LLScriptBridge(inventory, uuid);
+ new_listener = new LLItemBridge(inventory, root, uuid);
break;
case LLAssetType::AT_OBJECT:
if(!(inv_type == LLInventoryType::IT_OBJECT || inv_type == LLInventoryType::IT_ATTACHMENT))
{
- llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
+ llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << llendl;
}
- new_listener = new LLObjectBridge(inventory, uuid, inv_type, flags);
+ new_listener = new LLObjectBridge(inventory, root, uuid, inv_type, flags);
break;
case LLAssetType::AT_NOTECARD:
if(!(inv_type == LLInventoryType::IT_NOTECARD))
{
- llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
+ llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << llendl;
}
- new_listener = new LLNotecardBridge(inventory, uuid);
+ new_listener = new LLNotecardBridge(inventory, root, uuid);
break;
case LLAssetType::AT_ANIMATION:
if(!(inv_type == LLInventoryType::IT_ANIMATION))
{
- llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
+ llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << llendl;
}
- new_listener = new LLAnimationBridge(inventory, uuid);
+ new_listener = new LLAnimationBridge(inventory, root, uuid);
break;
case LLAssetType::AT_GESTURE:
if(!(inv_type == LLInventoryType::IT_GESTURE))
{
- llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
+ llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << llendl;
}
- new_listener = new LLGestureBridge(inventory, uuid);
+ new_listener = new LLGestureBridge(inventory, root, uuid);
break;
case LLAssetType::AT_LSL_TEXT:
if(!(inv_type == LLInventoryType::IT_LSL))
{
- llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
+ llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << llendl;
}
- new_listener = new LLLSLTextBridge(inventory, uuid);
+ new_listener = new LLLSLTextBridge(inventory, root, uuid);
break;
case LLAssetType::AT_CLOTHING:
case LLAssetType::AT_BODYPART:
if(!(inv_type == LLInventoryType::IT_WEARABLE))
{
- llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
+ llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << llendl;
}
- new_listener = new LLWearableBridge(inventory, uuid, asset_type, inv_type, (EWearableType)flags);
+ new_listener = new LLWearableBridge(inventory, root, uuid, asset_type, inv_type, (LLWearableType::EType)flags);
break;
case LLAssetType::AT_CATEGORY:
if (actual_asset_type == LLAssetType::AT_LINK_FOLDER)
{
// Create a link folder handler instead.
- new_listener = new LLLinkFolderBridge(inventory, uuid);
+ new_listener = new LLLinkFolderBridge(inventory, root, uuid);
break;
}
- new_listener = new LLFolderBridge(inventory, uuid);
+ new_listener = new LLFolderBridge(inventory, root, uuid);
break;
case LLAssetType::AT_LINK:
case LLAssetType::AT_LINK_FOLDER:
// Only should happen for broken links.
- new_listener = new LLLinkItemBridge(inventory, uuid);
+ new_listener = new LLLinkItemBridge(inventory, root, uuid);
break;
default:
llinfos << "Unhandled asset type (llassetstorage.h): "
@@ -977,16 +948,34 @@ void LLInvFVBridge::purgeItem(LLInventoryModel *model, const LLUUID &uuid)
}
}
-bool LLInvFVBridge::isInOutfitsSidePanel() const
+BOOL LLInvFVBridge::isInOutfitsSidePanel() const
{
LLInventoryPanel *my_panel = dynamic_cast<LLInventoryPanel*>(mInventoryPanel.get());
LLPanelOutfitsInventory *outfit_panel =
dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory"));
if (!outfit_panel)
- return false;
+ return FALSE;
return outfit_panel->isTabPanel(my_panel);
}
+BOOL LLInvFVBridge::canShare() const
+{
+ const LLInventoryModel* model = getInventoryModel();
+ if (!model) return FALSE;
+
+ const LLViewerInventoryItem *item = model->getItem(mUUID);
+ if (item)
+ {
+ if (!LLInventoryCollectFunctor::itemTransferCommonlyAllowed(item))
+ return FALSE;
+ return (BOOL)LLGiveInventory::isInventoryGiveAcceptable(item);
+ }
+
+ // All categories can be given.
+ const LLViewerInventoryCategory* cat = model->getCategory(mUUID);
+ return (cat != NULL);
+}
+
// +=================================================+
// | InventoryFVBridgeBuilder |
// +=================================================+
@@ -994,29 +983,31 @@ LLInvFVBridge* LLInventoryFVBridgeBuilder::createBridge(LLAssetType::EType asset
LLAssetType::EType actual_asset_type,
LLInventoryType::EType inv_type,
LLInventoryPanel* inventory,
+ LLFolderView* root,
const LLUUID& uuid,
U32 flags /* = 0x00 */) const
{
return LLInvFVBridge::createBridge(asset_type,
- actual_asset_type,
- inv_type,
- inventory,
- uuid,
- flags);
+ actual_asset_type,
+ inv_type,
+ inventory,
+ root,
+ uuid,
+ flags);
}
// +=================================================+
// | LLItemBridge |
// +=================================================+
-void LLItemBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+void LLItemBridge::performAction(LLInventoryModel* model, std::string action)
{
if ("goto" == action)
{
- gotoItem(folder);
+ gotoItem();
}
- if ("open" == action)
+ if ("open" == action || "open_original" == action)
{
openItem();
return;
@@ -1044,9 +1035,9 @@ void LLItemBridge::performAction(LLFolderView* folder, LLInventoryModel* model,
else if ("copy_uuid" == action)
{
// Single item only
- LLInventoryItem* item = model->getItem(mUUID);
+ LLViewerInventoryItem* item = static_cast<LLViewerInventoryItem*>(getItem());
if(!item) return;
- LLUUID asset_id = item->getAssetUUID();
+ LLUUID asset_id = item->getProtectedAssetUUID();
std::string buffer;
asset_id.toString(buffer);
@@ -1064,7 +1055,7 @@ void LLItemBridge::performAction(LLFolderView* folder, LLInventoryModel* model,
LLInventoryItem* itemp = model->getItem(mUUID);
if (!itemp) return;
- LLFolderViewItem* folder_view_itemp = folder->getItemByID(itemp->getParentUUID());
+ LLFolderViewItem* folder_view_itemp = mRoot->getItemByID(itemp->getParentUUID());
if (!folder_view_itemp) return;
folder_view_itemp->getListener()->pasteFromClipboard();
@@ -1076,7 +1067,7 @@ void LLItemBridge::performAction(LLFolderView* folder, LLInventoryModel* model,
LLInventoryItem* itemp = model->getItem(mUUID);
if (!itemp) return;
- LLFolderViewItem* folder_view_itemp = folder->getItemByID(itemp->getParentUUID());
+ LLFolderViewItem* folder_view_itemp = mRoot->getItemByID(itemp->getParentUUID());
if (!folder_view_itemp) return;
folder_view_itemp->getListener()->pasteLinkFromClipboard();
@@ -1086,8 +1077,8 @@ void LLItemBridge::performAction(LLFolderView* folder, LLInventoryModel* model,
void LLItemBridge::selectItem()
{
- LLViewerInventoryItem* item = (LLViewerInventoryItem*)getItem();
- if(item && !item->isComplete())
+ LLViewerInventoryItem* item = static_cast<LLViewerInventoryItem*>(getItem());
+ if(item && !item->isFinished())
{
item->fetchFromServer();
}
@@ -1095,7 +1086,7 @@ void LLItemBridge::selectItem()
void LLItemBridge::restoreItem()
{
- LLViewerInventoryItem* item = (LLViewerInventoryItem*)getItem();
+ LLViewerInventoryItem* item = static_cast<LLViewerInventoryItem*>(getItem());
if(item)
{
LLInventoryModel* model = getInventoryModel();
@@ -1107,7 +1098,10 @@ void LLItemBridge::restoreItem()
void LLItemBridge::restoreToWorld()
{
- LLViewerInventoryItem* itemp = (LLViewerInventoryItem*)getItem();
+ //Similar functionality to the drag and drop rez logic
+ bool remove_from_inventory = false;
+
+ LLViewerInventoryItem* itemp = static_cast<LLViewerInventoryItem*>(getItem());
if (itemp)
{
LLMessageSystem* msg = gMessageSystem;
@@ -1119,23 +1113,20 @@ void LLItemBridge::restoreToWorld()
msg->nextBlockFast(_PREHASH_InventoryData);
itemp->packMessage(msg);
msg->sendReliable(gAgent.getRegion()->getHost());
- }
-
- //Similar functionality to the drag and drop rez logic
- BOOL remove_from_inventory = FALSE;
-
- //remove local inventory copy, sim will deal with permissions and removing the item
- //from the actual inventory if its a no-copy etc
- if(!itemp->getPermissions().allowCopyBy(gAgent.getID()))
- {
- remove_from_inventory = TRUE;
- }
- // Check if it's in the trash. (again similar to the normal rez logic)
- const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- if(gInventory.isObjectDescendentOf(itemp->getUUID(), trash_id))
- {
- remove_from_inventory = TRUE;
+ //remove local inventory copy, sim will deal with permissions and removing the item
+ //from the actual inventory if its a no-copy etc
+ if(!itemp->getPermissions().allowCopyBy(gAgent.getID()))
+ {
+ remove_from_inventory = true;
+ }
+
+ // Check if it's in the trash. (again similar to the normal rez logic)
+ const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
+ if(gInventory.isObjectDescendentOf(itemp->getUUID(), trash_id))
+ {
+ remove_from_inventory = true;
+ }
}
if(remove_from_inventory)
@@ -1145,7 +1136,7 @@ void LLItemBridge::restoreToWorld()
}
}
-void LLItemBridge::gotoItem(LLFolderView *folder)
+void LLItemBridge::gotoItem()
{
LLInventoryObject *obj = getInventoryObject();
if (obj && obj->getIsLinkType())
@@ -1160,25 +1151,22 @@ void LLItemBridge::gotoItem(LLFolderView *folder)
LLUIImagePtr LLItemBridge::getIcon() const
{
- return LLUI::getUIImage(ICON_NAME[OBJECT_ICON_NAME]);
+ LLInventoryObject *obj = getInventoryObject();
+ if (obj)
+ {
+ return LLInventoryIcon::getIcon(obj->getType(),
+ LLInventoryType::IT_NONE,
+ mIsLink);
+ }
+
+ return LLInventoryIcon::getIcon(LLInventoryIcon::ICONNAME_OBJECT);
}
PermissionMask LLItemBridge::getPermissionMask() const
{
LLViewerInventoryItem* item = getItem();
PermissionMask perm_mask = 0;
- if(item)
- {
- BOOL copy = item->getPermissions().allowCopyBy(gAgent.getID());
- BOOL mod = item->getPermissions().allowModifyBy(gAgent.getID());
- BOOL xfer = item->getPermissions().allowOperationBy(PERM_TRANSFER,
- gAgent.getID());
-
- if (copy) perm_mask |= PERM_COPY;
- if (mod) perm_mask |= PERM_MODIFY;
- if (xfer) perm_mask |= PERM_TRANSFER;
-
- }
+ if (item) perm_mask = item->getPermissionMask();
return perm_mask;
}
@@ -1206,18 +1194,18 @@ void LLItemBridge::buildDisplayName(LLInventoryItem* item, std::string& name)
LLFontGL::StyleFlags LLItemBridge::getLabelStyle() const
{
U8 font = LLFontGL::NORMAL;
+ const LLViewerInventoryItem* item = getItem();
if (get_is_item_worn(mUUID))
{
// llinfos << "BOLD" << llendl;
font |= LLFontGL::BOLD;
}
-
- const LLViewerInventoryItem* item = getItem();
- if (item && item->getIsLinkType())
+ else if(item && item->getIsLinkType())
{
font |= LLFontGL::ITALIC;
}
+
return (LLFontGL::StyleFlags)font;
}
@@ -1323,13 +1311,65 @@ BOOL LLItemBridge::removeItem()
{
return FALSE;
}
+
+
// move it to the trash
LLPreview::hide(mUUID, TRUE);
LLInventoryModel* model = getInventoryModel();
if(!model) return FALSE;
- const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
+ const LLUUID& trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
LLViewerInventoryItem* item = getItem();
+ if (!item) return FALSE;
+ // Already in trash
+ if (model->isObjectDescendentOf(mUUID, trash_id)) return FALSE;
+
+ LLNotification::Params params("ConfirmItemDeleteHasLinks");
+ params.functor.function(boost::bind(&LLItemBridge::confirmRemoveItem, this, _1, _2));
+
+ // Check if this item has any links. If generic inventory linking is enabled,
+ // we can't do this check because we may have items in a folder somewhere that is
+ // not yet in memory, so we don't want false negatives. (If disabled, then we
+ // know we only have links in the Outfits folder which we explicitly fetch.)
+ if (!gSavedSettings.getBOOL("InventoryLinking"))
+ {
+ if (!item->getIsLinkType())
+ {
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t item_array;
+ LLLinkedItemIDMatches is_linked_item_match(mUUID);
+ gInventory.collectDescendentsIf(gInventory.getRootFolderID(),
+ cat_array,
+ item_array,
+ LLInventoryModel::INCLUDE_TRASH,
+ is_linked_item_match);
+
+ const U32 num_links = cat_array.size() + item_array.size();
+ if (num_links > 0)
+ {
+ // Warn if the user is will break any links when deleting this item.
+ LLNotifications::instance().add(params);
+ return FALSE;
+ }
+ }
+ }
+
+ LLNotifications::instance().forceResponse(params, 0);
+ return TRUE;
+}
+
+BOOL LLItemBridge::confirmRemoveItem(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (option != 0) return FALSE;
+
+ LLInventoryModel* model = getInventoryModel();
+ if (!model) return FALSE;
+
+ LLViewerInventoryItem* item = getItem();
+ if (!item) return FALSE;
+
+ const LLUUID& trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
// if item is not already in trash
if(item && !model->isObjectDescendentOf(mUUID, trash_id))
{
@@ -1338,11 +1378,7 @@ BOOL LLItemBridge::removeItem()
// delete was successful
return TRUE;
}
- else
- {
- // tried to delete already item in trash (should purge?)
- return FALSE;
- }
+ return FALSE;
}
BOOL LLItemBridge::isItemCopyable() const
@@ -1362,17 +1398,11 @@ BOOL LLItemBridge::isItemCopyable() const
return FALSE;
}
- if (gAgent.isGodlike())
- {
- // 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()));
- }
+ // 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;
+ // return (item->getPermissions().allowCopyBy(gAgent.getID()));
}
return FALSE;
}
@@ -1403,11 +1433,7 @@ BOOL LLItemBridge::isItemPermissive() const
LLViewerInventoryItem* item = getItem();
if(item)
{
- U32 mask = item->getPermissions().getMaskBase();
- if((mask & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED)
- {
- return TRUE;
- }
+ return item->getIsFullPerm();
}
return FALSE;
}
@@ -1464,30 +1490,7 @@ public:
// Can be destroyed (or moved to trash)
BOOL LLFolderBridge::isItemRemovable() const
{
- LLInventoryModel* model = getInventoryModel();
- if(!model)
- {
- return FALSE;
- }
-
- if(!model->isObjectDescendentOf(mUUID, gInventory.getRootFolderID()))
- {
- return FALSE;
- }
-
- LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- if( !avatar )
- {
- return FALSE;
- }
-
- LLInventoryCategory* category = model->getCategory(mUUID);
- if( !category )
- {
- return FALSE;
- }
-
- if(LLFolderType::lookupIsProtectedType(category->getPreferredType()))
+ if (!get_is_category_removable(getInventoryModel(), mUUID))
{
return FALSE;
}
@@ -1503,6 +1506,7 @@ BOOL LLFolderBridge::isItemRemovable() const
return FALSE;
}
}
+
return TRUE;
}
@@ -1521,7 +1525,12 @@ BOOL LLFolderBridge::isUpToDate() const
BOOL LLFolderBridge::isItemCopyable() const
{
- return TRUE;
+ if (gSavedSettings.getBOOL("InventoryLinking"))
+ {
+ // Can copy folders to paste-as-link, but not for straight paste.
+ return TRUE;
+ }
+ return FALSE;
}
BOOL LLFolderBridge::copyToClipboard() const
@@ -1630,8 +1639,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
LLInventoryModel* model = getInventoryModel();
if(!model) return FALSE;
- LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- if(!avatar) return FALSE;
+ if (!isAgentAvatarValid()) return FALSE;
// cannot drag categories into library
if(!isAgentInventory())
@@ -1655,7 +1663,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
// Is the destination the trash?
const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
BOOL move_is_into_trash = (mUUID == trash_id)
- || model->isObjectDescendentOf(mUUID, trash_id);
+ || model->isObjectDescendentOf(mUUID, trash_id);
BOOL is_movable = (!LLFolderType::lookupIsProtectedType(inv_cat->getPreferredType()));
const LLUUID current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);
@@ -1703,12 +1711,11 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
}
}
-
- accept = is_movable
- && (mUUID != cat_id) // Can't move a folder into itself
- && (mUUID != inv_cat->getParentUUID()) // Avoid moves that would change nothing
- && !(model->isObjectDescendentOf(mUUID, cat_id)); // Avoid circularity
- if(accept && drop)
+ accept = is_movable
+ && (mUUID != cat_id) // Can't move a folder into itself
+ && (mUUID != inv_cat->getParentUUID()) // Avoid moves that would change nothing
+ && !(model->isObjectDescendentOf(mUUID, cat_id)); // Avoid circularity
+ if (accept && drop)
{
// Look for any gestures and deactivate them
if (move_is_into_trash)
@@ -1717,9 +1724,9 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
{
LLInventoryItem* item = descendent_items[i];
if (item->getType() == LLAssetType::AT_GESTURE
- && LLGestureManager::instance().isGestureActive(item->getUUID()))
+ && LLGestureMgr::instance().isGestureActive(item->getUUID()))
{
- LLGestureManager::instance().deactivateGesture(item->getUUID());
+ LLGestureMgr::instance().deactivateGesture(item->getUUID());
}
}
}
@@ -1732,7 +1739,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
{
// traverse category and add all contents to currently worn.
BOOL append = true;
- LLAppearanceManager::instance().wearInventoryCategory(inv_cat, false, append);
+ LLAppearanceMgr::instance().wearInventoryCategory(inv_cat, false, append);
}
else
{
@@ -1740,28 +1747,30 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
gInventory.collectDescendents(inv_cat->getUUID(), cats, items, LLInventoryModel::EXCLUDE_TRASH);
- LLAppearanceManager::instance().linkAll(mUUID,items,NULL);
+ LLAppearanceMgr::instance().linkAll(mUUID,items,NULL);
}
}
else
{
#if SUPPORT_ENSEMBLES
- // BAP - should skip if dup.
- if (move_is_into_current_outfit)
- {
- LLAppearanceManager::instance().addEnsembleLink(inv_cat);
- }
- else
- {
- LLPointer<LLInventoryCallback> cb = NULL;
- link_inventory_item(
- gAgent.getID(),
- inv_cat->getUUID(),
- mUUID,
- inv_cat->getName(),
- LLAssetType::AT_LINK_FOLDER,
- cb);
- }
+ // BAP - should skip if dup.
+ if (move_is_into_current_outfit)
+ {
+ LLAppearanceMgr::instance().addEnsembleLink(inv_cat);
+ }
+ else
+ {
+ LLPointer<LLInventoryCallback> cb = NULL;
+ const std::string empty_description = "";
+ link_inventory_item(
+ gAgent.getID(),
+ inv_cat->getUUID(),
+ mUUID,
+ inv_cat->getName(),
+ empty_description,
+ LLAssetType::AT_LINK_FOLDER,
+ cb);
+ }
#endif
}
}
@@ -1778,7 +1787,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
}
}
}
- else if(LLToolDragAndDrop::SOURCE_WORLD == source)
+ else if (LLToolDragAndDrop::SOURCE_WORLD == source)
{
// content category has same ID as object itself
LLUUID object_id = inv_cat->getUUID();
@@ -1823,7 +1832,7 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id,
// this folder is coming from an object, as there is only one folder in an object, the root,
// we need to collect the entire contents and handle them as a group
- InventoryObjectList inventory_objects;
+ LLInventoryObject::object_list_t inventory_objects;
object->getInventoryContents(inventory_objects);
if (inventory_objects.empty())
@@ -1837,8 +1846,8 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id,
// coming from a task. Need to figure out if the person can
// move/copy this item.
- InventoryObjectList::iterator it = inventory_objects.begin();
- InventoryObjectList::iterator end = inventory_objects.end();
+ LLInventoryObject::object_list_t::iterator it = inventory_objects.begin();
+ LLInventoryObject::object_list_t::iterator end = inventory_objects.end();
for ( ; it != end; ++it)
{
// coming from a task. Need to figure out if the person can
@@ -1868,7 +1877,7 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id,
if(drop && accept)
{
it = inventory_objects.begin();
- InventoryObjectList::iterator first_it = inventory_objects.begin();
+ LLInventoryObject::object_list_t::iterator first_it = inventory_objects.begin();
LLMoveInv* move_inv = new LLMoveInv;
move_inv->mObjectID = object_id;
move_inv->mCategoryID = category_id;
@@ -1896,61 +1905,21 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id,
return accept;
}
-bool LLFindCOFValidItems::operator()(LLInventoryCategory* cat,
- LLInventoryItem* item)
-{
- // Valid COF items are:
- // - links to wearables (body parts or clothing)
- // - links to attachments
- // - links to gestures
- // - links to ensemble folders
- LLViewerInventoryItem *linked_item = ((LLViewerInventoryItem*)item)->getLinkedItem(); // BAP - safe?
- if (linked_item)
- {
- LLAssetType::EType type = linked_item->getType();
- return (type == LLAssetType::AT_CLOTHING ||
- type == LLAssetType::AT_BODYPART ||
- type == LLAssetType::AT_GESTURE ||
- type == LLAssetType::AT_OBJECT);
- }
- else
- {
- LLViewerInventoryCategory *linked_category = ((LLViewerInventoryItem*)item)->getLinkedCategory(); // BAP - safe?
- // BAP remove AT_NONE support after ensembles are fully working?
- return (linked_category &&
- ((linked_category->getPreferredType() == LLFolderType::FT_NONE) ||
- (LLFolderType::lookupIsEnsembleType(linked_category->getPreferredType()))));
- }
-}
-
-
-bool LLFindWearables::operator()(LLInventoryCategory* cat,
- LLInventoryItem* item)
-{
- if(item)
- {
- if((item->getType() == LLAssetType::AT_CLOTHING)
- || (item->getType() == LLAssetType::AT_BODYPART))
- {
- return TRUE;
- }
- }
- return FALSE;
-}
-
-
-
//Used by LLFolderBridge as callback for directory recursion.
-class LLRightClickInventoryFetchObserver : public LLInventoryFetchObserver
+class LLRightClickInventoryFetchObserver : public LLInventoryFetchItemsObserver
{
public:
- LLRightClickInventoryFetchObserver() :
+ LLRightClickInventoryFetchObserver(const uuid_vec_t& ids) :
+ LLInventoryFetchItemsObserver(ids),
mCopyItems(false)
{ };
- LLRightClickInventoryFetchObserver(const LLUUID& cat_id, bool copy_items) :
+ LLRightClickInventoryFetchObserver(const uuid_vec_t& ids,
+ const LLUUID& cat_id,
+ bool copy_items) :
+ LLInventoryFetchItemsObserver(ids),
mCatID(cat_id),
mCopyItems(copy_items)
- { };
+ { };
virtual void done()
{
// we've downloaded all the items, so repaint the dialog
@@ -1971,7 +1940,11 @@ protected:
class LLRightClickInventoryFetchDescendentsObserver : public LLInventoryFetchDescendentsObserver
{
public:
- LLRightClickInventoryFetchDescendentsObserver(bool copy_items) : mCopyItems(copy_items) {}
+ LLRightClickInventoryFetchDescendentsObserver(const uuid_vec_t& ids,
+ bool copy_items) :
+ LLInventoryFetchDescendentsObserver(ids),
+ mCopyItems(copy_items)
+ {}
~LLRightClickInventoryFetchDescendentsObserver() {}
virtual void done();
protected:
@@ -1982,7 +1955,7 @@ void LLRightClickInventoryFetchDescendentsObserver::done()
{
// Avoid passing a NULL-ref as mCompleteFolders.front() down to
// gInventory.collectDescendents()
- if( mCompleteFolders.empty() )
+ if( mComplete.empty() )
{
llwarns << "LLRightClickInventoryFetchDescendentsObserver::done with empty mCompleteFolders" << llendl;
dec_busy_count();
@@ -1996,7 +1969,7 @@ void LLRightClickInventoryFetchDescendentsObserver::done()
// happen.
LLInventoryModel::cat_array_t cat_array;
LLInventoryModel::item_array_t item_array;
- gInventory.collectDescendents(mCompleteFolders.front(),
+ gInventory.collectDescendents(mComplete.front(),
cat_array,
item_array,
LLInventoryModel::EXCLUDE_TRASH);
@@ -2014,14 +1987,14 @@ void LLRightClickInventoryFetchDescendentsObserver::done()
}
#endif
- LLRightClickInventoryFetchObserver* outfit;
- outfit = new LLRightClickInventoryFetchObserver(mCompleteFolders.front(), mCopyItems);
- LLInventoryFetchObserver::item_ref_t ids;
+ uuid_vec_t ids;
for(S32 i = 0; i < count; ++i)
{
ids.push_back(item_array.get(i)->getUUID());
}
+ LLRightClickInventoryFetchObserver* outfit = new LLRightClickInventoryFetchObserver(ids, mComplete.front(), mCopyItems);
+
// clean up, and remove this as an observer since the call to the
// outfit could notify observers and throw us into an infinite
// loop.
@@ -2034,19 +2007,19 @@ void LLRightClickInventoryFetchDescendentsObserver::done()
inc_busy_count();
// do the fetch
- outfit->fetchItems(ids);
+ outfit->startFetch();
outfit->done(); //Not interested in waiting and this will be right 99% of the time.
//Uncomment the following code for laggy Inventory UI.
-/* if(outfit->isEverythingComplete())
+/* if(outfit->isFinished())
{
- // everything is already here - call done.
- outfit->done();
+ // everything is already here - call done.
+ outfit->done();
}
else
{
- // it's all on it's way - add an observer, and the inventory
- // will call done for us when everything is here.
- gInventory.addObserver(outfit);
+ // it's all on it's way - add an observer, and the inventory
+ // will call done for us when everything is here.
+ gInventory.addObserver(outfit);
}*/
}
@@ -2060,7 +2033,8 @@ void LLRightClickInventoryFetchDescendentsObserver::done()
class LLInventoryCopyAndWearObserver : public LLInventoryObserver
{
public:
- LLInventoryCopyAndWearObserver(const LLUUID& cat_id, int count) :mCatID(cat_id), mContentsCount(count), mFolderAdded(FALSE) {}
+ LLInventoryCopyAndWearObserver(const LLUUID& cat_id, int count) :
+ mCatID(cat_id), mContentsCount(count), mFolderAdded(FALSE) {}
virtual ~LLInventoryCopyAndWearObserver() {}
virtual void changed(U32 mask);
@@ -2099,7 +2073,7 @@ void LLInventoryCopyAndWearObserver::changed(U32 mask)
if (NULL == category)
{
llwarns << "gInventory.getCategory(" << mCatID
- << ") was NULL" << llendl;
+ << ") was NULL" << llendl;
}
else
{
@@ -2107,7 +2081,7 @@ void LLInventoryCopyAndWearObserver::changed(U32 mask)
mContentsCount)
{
gInventory.removeObserver(this);
- LLAppearanceManager::instance().wearInventoryCategory(category, FALSE, TRUE);
+ LLAppearanceMgr::instance().wearInventoryCategory(category, FALSE, TRUE);
delete this;
}
}
@@ -2118,11 +2092,11 @@ void LLInventoryCopyAndWearObserver::changed(U32 mask)
-void LLFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)
{
if ("open" == action)
{
- LLFolderViewFolder *f = dynamic_cast<LLFolderViewFolder *>(folder->getItemByID(mUUID));
+ LLFolderViewFolder *f = dynamic_cast<LLFolderViewFolder *>(mRoot->getItemByID(mUUID));
if (f)
{
f->setOpen(TRUE);
@@ -2157,7 +2131,7 @@ void LLFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model
if(!model) return;
LLViewerInventoryCategory* cat = getCategory();
if(!cat) return;
- LLAppearanceManager::instance().addEnsembleLink(cat,true);
+ LLAppearanceMgr::instance().addEnsembleLink(cat,true);
return;
}
#endif
@@ -2226,19 +2200,16 @@ void LLFolderBridge::determineFolderType()
{
LLInventoryModel* model = getInventoryModel();
LLViewerInventoryCategory* category = model->getCategory(mUUID);
- category->determineFolderType();
+ if (category)
+ {
+ category->determineFolderType();
+ }
}
}
BOOL LLFolderBridge::isItemRenameable() const
{
- LLViewerInventoryCategory* cat = (LLViewerInventoryCategory*)getCategory();
- if(cat && !LLFolderType::lookupIsProtectedType(cat->getPreferredType())
- && (cat->getOwnerID() == gAgent.getID()))
- {
- return TRUE;
- }
- return FALSE;
+ return get_is_category_renameable(getInventoryModel(), mUUID);
}
void LLFolderBridge::restoreItem()
@@ -2278,42 +2249,22 @@ LLUIImagePtr LLFolderBridge::getIcon() const
return getIcon(preferred_type);
}
+// static
LLUIImagePtr LLFolderBridge::getIcon(LLFolderType::EType preferred_type)
{
- // we only have one folder image now
- if (preferred_type == LLFolderType::FT_OUTFIT)
- {
- return LLUI::getUIImage("Inv_LookFolderClosed");
- }
- return LLUI::getUIImage("Inv_FolderClosed");
+ return LLUI::getUIImage(LLViewerFolderType::lookupIconName(preferred_type, FALSE));
}
LLUIImagePtr LLFolderBridge::getOpenIcon() const
{
- if (getPreferredType() == LLFolderType::FT_OUTFIT)
- {
- return LLUI::getUIImage("Inv_LookFolderOpen");
- }
- return LLUI::getUIImage("Inv_FolderOpen");
+ return LLUI::getUIImage(LLViewerFolderType::lookupIconName(getPreferredType(), TRUE));
+
}
BOOL LLFolderBridge::renameItem(const std::string& new_name)
{
- if(!isItemRenameable())
- return FALSE;
- LLInventoryModel* model = getInventoryModel();
- if(!model)
- return FALSE;
- LLViewerInventoryCategory* cat = getCategory();
- if(cat && (cat->getName() != new_name))
- {
- LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat);
- new_cat->rename(new_name);
- new_cat->updateServer(FALSE);
- model->updateCategory(new_cat);
+ rename_category(getInventoryModel(), mUUID, new_name);
- model->notifyObservers();
- }
// return FALSE because we either notified observers (& therefore
// rebuilt) or we didn't update.
return FALSE;
@@ -2367,36 +2318,7 @@ bool LLFolderBridge::removeItemResponse(const LLSD& notification, const LLSD& re
{
// move it to the trash
LLPreview::hide(mUUID);
- LLInventoryModel* model = getInventoryModel();
- if(!model) return FALSE;
-
- const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
-
- // Look for any gestures and deactivate them
- LLInventoryModel::cat_array_t descendent_categories;
- LLInventoryModel::item_array_t descendent_items;
- gInventory.collectDescendents( mUUID, descendent_categories, descendent_items, FALSE );
-
- for (LLInventoryModel::item_array_t::const_iterator iter = descendent_items.begin();
- iter != descendent_items.end();
- ++iter)
- {
- const LLViewerInventoryItem* item = (*iter);
- const LLUUID& item_id = item->getUUID();
- if (item->getType() == LLAssetType::AT_GESTURE
- && LLGestureManager::instance().isGestureActive(item_id))
- {
- LLGestureManager::instance().deactivateGesture(item_id);
- }
- }
-
- // go ahead and do the normal remove if no 'last calling
- // cards' are being removed.
- LLViewerInventoryCategory* cat = getCategory();
- if(cat)
- {
- LLInvFVBridge::changeCategoryParent(model, cat, trash_id, TRUE);
- }
+ remove_category(getInventoryModel(), mUUID);
return TRUE;
}
return FALSE;
@@ -2423,7 +2345,12 @@ void LLFolderBridge::pasteFromClipboard()
{
// move_inventory_item() is not enough,
//we have to update inventory locally too
- changeItemParent(model, dynamic_cast<LLViewerInventoryItem*>(item), parent_id, FALSE);
+ LLViewerInventoryItem* viitem = dynamic_cast<LLViewerInventoryItem*>(item);
+ llassert(viitem);
+ if (viitem)
+ {
+ changeItemParent(model, viitem, parent_id, FALSE);
+ }
}
else
{
@@ -2454,26 +2381,26 @@ void LLFolderBridge::pasteLinkFromClipboard()
++iter)
{
const LLUUID &object_id = (*iter);
-#if SUPPORT_ENSEMBLES
if (LLInventoryCategory *cat = model->getCategory(object_id))
{
+ const std::string empty_description = "";
link_inventory_item(
gAgent.getID(),
cat->getUUID(),
parent_id,
cat->getName(),
+ empty_description,
LLAssetType::AT_LINK_FOLDER,
LLPointer<LLInventoryCallback>(NULL));
}
- else
-#endif
- if (LLInventoryItem *item = model->getItem(object_id))
+ else if (LLInventoryItem *item = model->getItem(object_id))
{
link_inventory_item(
gAgent.getID(),
item->getLinkedUUID(),
parent_id,
item->getName(),
+ item->getDescription(),
LLAssetType::AT_LINK,
LLPointer<LLInventoryCallback>(NULL));
}
@@ -2495,11 +2422,13 @@ void LLFolderBridge::folderOptionsMenu()
if(!model) return;
const LLInventoryCategory* category = model->getCategory(mUUID);
+ if(!category) return;
+
LLFolderType::EType type = category->getPreferredType();
- const bool is_system_folder = category && LLFolderType::lookupIsProtectedType(type);
+ const bool is_system_folder = LLFolderType::lookupIsProtectedType(type);
// BAP change once we're no longer treating regular categories as ensembles.
- const bool is_ensemble = category && (type == LLFolderType::FT_NONE ||
- LLFolderType::lookupIsEnsembleType(type));
+ const bool is_ensemble = (type == LLFolderType::FT_NONE ||
+ LLFolderType::lookupIsEnsembleType(type));
// calling card related functionality for folders.
@@ -2560,7 +2489,7 @@ void LLFolderBridge::folderOptionsMenu()
mItems.push_back(std::string("Wear As Ensemble"));
}
mItems.push_back(std::string("Remove From Outfit"));
- if (!areAnyContentsWorn(model))
+ if (!LLAppearanceMgr::getCanRemoveFromCOF(mUUID))
{
disabled_items.push_back(std::string("Remove From Outfit"));
}
@@ -2585,35 +2514,6 @@ 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)
{
@@ -2629,10 +2529,17 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
const LLUUID lost_and_found_id = model->findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
if (lost_and_found_id == mUUID)
- {
+ {
// This is the lost+found folder.
- mItems.push_back(std::string("Empty Lost And Found"));
- }
+ mItems.push_back(std::string("Empty Lost And Found"));
+
+ mDisabledItems.push_back(std::string("New Folder"));
+ mDisabledItems.push_back(std::string("New Script"));
+ mDisabledItems.push_back(std::string("New Note"));
+ mDisabledItems.push_back(std::string("New Gesture"));
+ mDisabledItems.push_back(std::string("New Clothes"));
+ mDisabledItems.push_back(std::string("New Body Parts"));
+ }
if(trash_id == mUUID)
{
@@ -2650,8 +2557,7 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
LLViewerInventoryCategory *cat = getCategory();
// BAP removed protected check to re-enable standard ops in untyped folders.
// Not sure what the right thing is to do here.
- if (!isCOFFolder() && cat && cat->getPreferredType()!=LLFolderType::FT_OUTFIT /*&&
- LLAssetType::lookupIsProtectedCategoryType(cat->getPreferredType())*/)
+ if (!isCOFFolder() && cat && (cat->getPreferredType() != LLFolderType::FT_OUTFIT))
{
// Do not allow to create 2-level subfolder in the Calling Card/Friends folder. EXT-694.
if (!LLFriendCardsManager::instance().isCategoryInFriendFolder(cat))
@@ -2662,9 +2568,9 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
mItems.push_back(std::string("New Clothes"));
mItems.push_back(std::string("New Body Parts"));
- // Changing folder types is just a debug feature; this is fairly unsupported
+#if SUPPORT_ENSEMBLES
+ // Changing folder types is an unfinished unsupported feature
// and can lead to unexpected behavior if enabled.
-#if !LL_RELEASE_FOR_DOWNLOAD
mItems.push_back(std::string("Change Type"));
const LLViewerInventoryCategory *cat = getCategory();
if (cat && LLFolderType::lookupIsProtectedType(cat->getPreferredType()))
@@ -2683,7 +2589,7 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
addDeleteContextMenuOptions(mItems, mDisabledItems);
// EXT-4030: disallow deletion of currently worn outfit
- const LLViewerInventoryItem *base_outfit_link = LLAppearanceManager::instance().getBaseOutfitLink();
+ const LLViewerInventoryItem *base_outfit_link = LLAppearanceMgr::instance().getBaseOutfitLink();
if (base_outfit_link && (cat == base_outfit_link->getLinkedCategory()))
{
mDisabledItems.push_back(std::string("Delete"));
@@ -2713,17 +2619,18 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
mMenu = &menu;
sSelf = this;
- LLRightClickInventoryFetchDescendentsObserver* fetch = new LLRightClickInventoryFetchDescendentsObserver(FALSE);
- LLInventoryFetchDescendentsObserver::folder_ref_t folders;
+
+ uuid_vec_t folders;
LLViewerInventoryCategory* category = (LLViewerInventoryCategory*)model->getCategory(mUUID);
if (category)
{
folders.push_back(category->getUUID());
}
- fetch->fetchDescendents(folders);
+ LLRightClickInventoryFetchDescendentsObserver* fetch = new LLRightClickInventoryFetchDescendentsObserver(folders, FALSE);
+ fetch->startFetch();
inc_busy_count();
- if(fetch->isEverythingComplete())
+ if(fetch->isFinished())
{
// everything is already here - call done.
fetch->done();
@@ -2746,7 +2653,13 @@ void LLFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
mDisabledItems.push_back(std::string("Delete System Folder"));
}
-
+
+ mItems.push_back(std::string("Share"));
+ if (!canShare())
+ {
+ mDisabledItems.push_back(std::string("Share"));
+ }
+
hide_context_entries(menu, mItems, mDisabledItems);
}
@@ -2838,90 +2751,75 @@ void LLFolderBridge::createNewCategory(void* user_data)
void LLFolderBridge::createNewShirt(void* user_data)
{
- LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHIRT);
+ LLFolderBridge::createWearable((LLFolderBridge*)user_data, LLWearableType::WT_SHIRT);
}
void LLFolderBridge::createNewPants(void* user_data)
{
- LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_PANTS);
+ LLFolderBridge::createWearable((LLFolderBridge*)user_data, LLWearableType::WT_PANTS);
}
void LLFolderBridge::createNewShoes(void* user_data)
{
- LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHOES);
+ LLFolderBridge::createWearable((LLFolderBridge*)user_data, LLWearableType::WT_SHOES);
}
void LLFolderBridge::createNewSocks(void* user_data)
{
- LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SOCKS);
+ LLFolderBridge::createWearable((LLFolderBridge*)user_data, LLWearableType::WT_SOCKS);
}
void LLFolderBridge::createNewJacket(void* user_data)
{
- LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_JACKET);
+ LLFolderBridge::createWearable((LLFolderBridge*)user_data, LLWearableType::WT_JACKET);
}
void LLFolderBridge::createNewSkirt(void* user_data)
{
- LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SKIRT);
+ LLFolderBridge::createWearable((LLFolderBridge*)user_data, LLWearableType::WT_SKIRT);
}
void LLFolderBridge::createNewGloves(void* user_data)
{
- LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_GLOVES);
+ LLFolderBridge::createWearable((LLFolderBridge*)user_data, LLWearableType::WT_GLOVES);
}
void LLFolderBridge::createNewUndershirt(void* user_data)
{
- LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_UNDERSHIRT);
+ LLFolderBridge::createWearable((LLFolderBridge*)user_data, LLWearableType::WT_UNDERSHIRT);
}
void LLFolderBridge::createNewUnderpants(void* user_data)
{
- LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_UNDERPANTS);
+ LLFolderBridge::createWearable((LLFolderBridge*)user_data, LLWearableType::WT_UNDERPANTS);
}
void LLFolderBridge::createNewShape(void* user_data)
{
- LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SHAPE);
+ LLFolderBridge::createWearable((LLFolderBridge*)user_data, LLWearableType::WT_SHAPE);
}
void LLFolderBridge::createNewSkin(void* user_data)
{
- LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_SKIN);
+ LLFolderBridge::createWearable((LLFolderBridge*)user_data, LLWearableType::WT_SKIN);
}
void LLFolderBridge::createNewHair(void* user_data)
{
- LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_HAIR);
+ LLFolderBridge::createWearable((LLFolderBridge*)user_data, LLWearableType::WT_HAIR);
}
void LLFolderBridge::createNewEyes(void* user_data)
{
- LLFolderBridge::createWearable((LLFolderBridge*)user_data, WT_EYES);
+ LLFolderBridge::createWearable((LLFolderBridge*)user_data, LLWearableType::WT_EYES);
}
// static
-void LLFolderBridge::createWearable(LLFolderBridge* bridge, EWearableType type)
+void LLFolderBridge::createWearable(LLFolderBridge* bridge, LLWearableType::EType type)
{
if(!bridge) return;
LLUUID parent_id = bridge->getUUID();
- createWearable(parent_id, type);
-}
-
-// Separate function so can be called by global menu as well as right-click
-// menu.
-// static
-void LLFolderBridge::createWearable(const LLUUID &parent_id, EWearableType type)
-{
- LLWearable* wearable = LLWearableList::instance().createNewWearable(type);
- LLAssetType::EType asset_type = wearable->getAssetType();
- LLInventoryType::EType inv_type = LLInventoryType::IT_WEARABLE;
- create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
- parent_id, wearable->getTransactionID(), wearable->getName(),
- wearable->getDescription(), asset_type, inv_type, wearable->getType(),
- wearable->getPermissions().getMaskNextOwner(),
- LLPointer<LLInventoryCallback>(NULL));
+ LLAgentWearables::createWearable(type, false, parent_id);
}
void LLFolderBridge::modifyOutfit(BOOL append)
@@ -2931,9 +2829,7 @@ void LLFolderBridge::modifyOutfit(BOOL append)
LLViewerInventoryCategory* cat = getCategory();
if(!cat) return;
- // BAP - was:
- // wear_inventory_category_on_avatar( cat, append );
- LLAppearanceManager::instance().wearInventoryCategory( cat, FALSE, append );
+ LLAppearanceMgr::instance().wearInventoryCategory( cat, FALSE, append );
}
// helper stuff
@@ -2947,7 +2843,7 @@ bool move_task_inventory_callback(const LLSD& notification, const LLSD& response
{
if (cat_and_wear && cat_and_wear->mWear)
{
- InventoryObjectList inventory_objects;
+ LLInventoryObject::object_list_t inventory_objects;
object->getInventoryContents(inventory_objects);
int contents_count = inventory_objects.size()-1; //subtract one for containing folder
@@ -2957,8 +2853,8 @@ bool move_task_inventory_callback(const LLSD& notification, const LLSD& response
two_uuids_list_t::iterator move_it;
for (move_it = move_inv->mMoveList.begin();
- move_it != move_inv->mMoveList.end();
- ++move_it)
+ move_it != move_inv->mMoveList.end();
+ ++move_it)
{
object->moveInventory(move_it->first, move_it->second);
}
@@ -2988,31 +2884,36 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
return FALSE;
}
- LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- if(!avatar) return FALSE;
+ if (!isAgentAvatarValid()) return FALSE;
LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource();
BOOL accept = FALSE;
LLViewerObject* object = NULL;
if(LLToolDragAndDrop::SOURCE_AGENT == source)
{
-
BOOL is_movable = TRUE;
switch( inv_item->getActualType() )
{
- case LLAssetType::AT_CATEGORY:
- is_movable = !LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)inv_item)->getPreferredType());
- break;
- default:
- break;
+ case LLAssetType::AT_CATEGORY:
+ is_movable = !LLFolderType::lookupIsProtectedType(((LLInventoryCategory*)inv_item)->getPreferredType());
+ break;
+ default:
+ break;
}
const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
- BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id);
+ const BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id);
const LLUUID current_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
- BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);
- BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);
+ const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id);
+ const BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT);
+ const BOOL move_is_outof_current_outfit = LLAppearanceMgr::instance().getIsInCOF(inv_item->getUUID());
+ // Can't explicitly drag things out of the COF.
+ if (move_is_outof_current_outfit)
+ {
+ is_movable = FALSE;
+ }
+
if(is_movable && move_is_into_trash)
{
is_movable = inv_item->getIsLinkType() || !get_is_item_worn(inv_item->getUUID());
@@ -3037,9 +2938,9 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
if(accept && drop)
{
if (inv_item->getType() == LLAssetType::AT_GESTURE
- && LLGestureManager::instance().isGestureActive(inv_item->getUUID()) && move_is_into_trash)
+ && LLGestureMgr::instance().isGestureActive(inv_item->getUUID()) && move_is_into_trash)
{
- LLGestureManager::instance().deactivateGesture(inv_item->getUUID());
+ LLGestureMgr::instance().deactivateGesture(inv_item->getUUID());
}
// If an item is being dragged between windows, unselect
// everything in the active window so that we don't follow
@@ -3092,7 +2993,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
// BAP - should skip if dup.
if (move_is_into_current_outfit)
{
- LLAppearanceManager::instance().addCOFItemLink(inv_item);
+ LLAppearanceMgr::instance().addCOFItemLink(inv_item);
}
else
{
@@ -3102,6 +3003,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
inv_item->getLinkedUUID(),
mUUID,
inv_item->getName(),
+ inv_item->getDescription(),
LLAssetType::AT_LINK,
cb);
}
@@ -3162,6 +3064,9 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
}
else
{
+ // store dad inventory item to select added one later. See EXT-4347
+ set_dad_inventory_item(inv_item, mUUID);
+
LLNotification::Params params("MoveInventoryFromObject");
params.functor.function(boost::bind(move_task_inventory_callback, _1, _2, move_inv));
LLNotifications::instance().forceResponse(params, 0);
@@ -3175,13 +3080,13 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
if(drop)
{
copy_inventory_from_notecard(LLToolDragAndDrop::getInstance()->getObjectID(),
- LLToolDragAndDrop::getInstance()->getSourceID(), inv_item);
+ LLToolDragAndDrop::getInstance()->getSourceID(), inv_item);
}
}
else if(LLToolDragAndDrop::SOURCE_LIBRARY == source)
{
LLViewerInventoryItem* item = (LLViewerInventoryItem*)inv_item;
- if(item && item->isComplete())
+ if(item && item->isFinished())
{
accept = TRUE;
if(drop)
@@ -3204,21 +3109,12 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
}
// +=================================================+
-// | LLScriptBridge (DEPRECTED) |
-// +=================================================+
-
-LLUIImagePtr LLScriptBridge::getIcon() const
-{
- return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE);
-}
-
-// +=================================================+
// | LLTextureBridge |
// +=================================================+
LLUIImagePtr LLTextureBridge::getIcon() const
{
- return get_item_icon(LLAssetType::AT_TEXTURE, mInvType, 0, FALSE);
+ return LLInventoryIcon::getIcon(LLAssetType::AT_TEXTURE, mInvType);
}
void LLTextureBridge::openItem()
@@ -3258,7 +3154,13 @@ void LLTextureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
}
else
{
- items.push_back(std::string("Open"));
+ items.push_back(std::string("Share"));
+ if (!canShare())
+ {
+ disabled_items.push_back(std::string("Share"));
+ }
+
+ addOpenRightClickMenuOption(items);
items.push_back(std::string("Properties"));
getClipboardEntries(true, items, disabled_items, flags);
@@ -3274,7 +3176,7 @@ void LLTextureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
}
// virtual
-void LLTextureBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+void LLTextureBridge::performAction(LLInventoryModel* model, std::string action)
{
if ("save_as" == action)
{
@@ -3285,38 +3187,20 @@ void LLTextureBridge::performAction(LLFolderView* folder, LLInventoryModel* mode
preview_texture->openToSave();
}
}
- else LLItemBridge::performAction(folder, model, action);
+ else LLItemBridge::performAction(model, action);
}
// +=================================================+
// | LLSoundBridge |
// +=================================================+
-LLUIImagePtr LLSoundBridge::getIcon() const
-{
- return get_item_icon(LLAssetType::AT_SOUND, LLInventoryType::IT_SOUND, 0, FALSE);
-}
-
void LLSoundBridge::openItem()
{
- LLViewerInventoryItem* item = getItem();
-
+ const LLViewerInventoryItem* item = getItem();
if (item)
{
LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
}
-/*
-// Changed this back to the way it USED to work:
-// only open the preview dialog through the contextual right-click menu
-// double-click just plays the sound
-
- LLViewerInventoryItem* item = getItem();
- if(item)
- {
- openSoundPreview((void*)this);
- //send_uuid_sound_trigger(item->getAssetUUID(), 1.0);
- }
-*/
}
void LLSoundBridge::previewItem()
@@ -3346,6 +3230,11 @@ void LLSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
}
else
{
+ items.push_back(std::string("Share"));
+ if (!canShare())
+ {
+ disabled_items.push_back(std::string("Share"));
+ }
items.push_back(std::string("Sound Open"));
items.push_back(std::string("Properties"));
@@ -3362,11 +3251,14 @@ void LLSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
// | LLLandmarkBridge |
// +=================================================+
-LLLandmarkBridge::LLLandmarkBridge(LLInventoryPanel* inventory, const LLUUID& uuid, U32 flags/* = 0x00*/) :
-LLItemBridge(inventory, uuid)
+LLLandmarkBridge::LLLandmarkBridge(LLInventoryPanel* inventory,
+ LLFolderView* root,
+ const LLUUID& uuid,
+ U32 flags/* = 0x00*/) :
+ LLItemBridge(inventory, root, uuid)
{
mVisited = FALSE;
- if (flags & LLInventoryItem::II_FLAGS_LANDMARK_VISITED)
+ if (flags & LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED)
{
mVisited = TRUE;
}
@@ -3374,7 +3266,7 @@ LLItemBridge(inventory, uuid)
LLUIImagePtr LLLandmarkBridge::getIcon() const
{
- return get_item_icon(LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, mVisited, FALSE);
+ return LLInventoryIcon::getIcon(LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, mVisited, FALSE);
}
void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
@@ -3389,6 +3281,11 @@ void LLLandmarkBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
}
else
{
+ items.push_back(std::string("Share"));
+ if (!canShare())
+ {
+ disabled_items.push_back(std::string("Share"));
+ }
items.push_back(std::string("Landmark Open"));
items.push_back(std::string("Properties"));
@@ -3424,7 +3321,7 @@ void teleport_via_landmark(const LLUUID& asset_id)
}
// virtual
-void LLLandmarkBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+void LLLandmarkBridge::performAction(LLInventoryModel* model, std::string action)
{
if ("teleport" == action)
{
@@ -3448,7 +3345,7 @@ void LLLandmarkBridge::performAction(LLFolderView* folder, LLInventoryModel* mod
}
else
{
- LLItemBridge::performAction(folder, model, action);
+ LLItemBridge::performAction(model, action);
}
}
@@ -3475,35 +3372,33 @@ void LLLandmarkBridge::openItem()
{
LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
}
-/*
- LLViewerInventoryItem* item = getItem();
- if( item )
- {
- // Opening (double-clicking) a landmark immediately teleports,
- // but warns you the first time.
- // open_landmark(item);
- LLSD payload;
- payload["asset_id"] = item->getAssetUUID();
- LLNotificationsUtil::add("TeleportFromLandmark", LLSD(), payload);
- }
-*/
}
// +=================================================+
// | LLCallingCardObserver |
// +=================================================+
-void LLCallingCardObserver::changed(U32 mask)
+class LLCallingCardObserver : public LLFriendObserver
{
- mBridgep->refreshFolderViewItem();
-}
+public:
+ LLCallingCardObserver(LLCallingCardBridge* bridge) : mBridgep(bridge) {}
+ virtual ~LLCallingCardObserver() { mBridgep = NULL; }
+ virtual void changed(U32 mask)
+ {
+ mBridgep->refreshFolderViewItem();
+ }
+protected:
+ LLCallingCardBridge* mBridgep;
+};
// +=================================================+
// | LLCallingCardBridge |
// +=================================================+
-LLCallingCardBridge::LLCallingCardBridge( LLInventoryPanel* inventory, const LLUUID& uuid ) :
- LLItemBridge(inventory, uuid)
+LLCallingCardBridge::LLCallingCardBridge(LLInventoryPanel* inventory,
+ LLFolderView* root,
+ const LLUUID& uuid ) :
+ LLItemBridge(inventory, root, uuid)
{
mObserver = new LLCallingCardObserver(this);
LLAvatarTracker::instance().addObserver(mObserver);
@@ -3526,7 +3421,7 @@ void LLCallingCardBridge::refreshFolderViewItem()
}
// virtual
-void LLCallingCardBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+void LLCallingCardBridge::performAction(LLInventoryModel* model, std::string action)
{
if ("begin_im" == action)
{
@@ -3552,7 +3447,7 @@ void LLCallingCardBridge::performAction(LLFolderView* folder, LLInventoryModel*
LLAvatarActions::offerTeleport(item->getCreatorUUID());
}
}
- else LLItemBridge::performAction(folder, model, action);
+ else LLItemBridge::performAction(model, action);
}
LLUIImagePtr LLCallingCardBridge::getIcon() const
@@ -3563,7 +3458,7 @@ LLUIImagePtr LLCallingCardBridge::getIcon() const
{
online = LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID());
}
- return get_item_icon(LLAssetType::AT_CALLINGCARD, LLInventoryType::IT_CALLINGCARD, online, FALSE);
+ return LLInventoryIcon::getIcon(LLAssetType::AT_CALLINGCARD, LLInventoryType::IT_CALLINGCARD, online, FALSE);
}
std::string LLCallingCardBridge::getLabelSuffix() const
@@ -3588,11 +3483,11 @@ void LLCallingCardBridge::openItem()
LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
}
/*
- LLViewerInventoryItem* item = getItem();
- if(item && !item->getCreatorUUID().isNull())
- {
- LLAvatarActions::showProfile(item->getCreatorUUID());
- }
+ LLViewerInventoryItem* item = getItem();
+ if(item && !item->getCreatorUUID().isNull())
+ {
+ LLAvatarActions::showProfile(item->getCreatorUUID());
+ }
*/
}
@@ -3608,7 +3503,12 @@ void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
}
else
{
- items.push_back(std::string("Open"));
+ items.push_back(std::string("Share"));
+ if (!canShare())
+ {
+ disabled_items.push_back(std::string("Share"));
+ }
+ addOpenRightClickMenuOption(items);
items.push_back(std::string("Properties"));
getClipboardEntries(true, items, disabled_items, flags);
@@ -3617,7 +3517,11 @@ void LLCallingCardBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
BOOL good_card = (item
&& (LLUUID::null != item->getCreatorUUID())
&& (item->getCreatorUUID() != gAgent.getID()));
- BOOL user_online = (LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()));
+ BOOL user_online = FALSE;
+ if (item)
+ {
+ user_online = (LLAvatarTracker::instance().isBuddyOnline(item->getCreatorUUID()));
+ }
items.push_back(std::string("Send Instant Message Separator"));
items.push_back(std::string("Send Instant Message"));
items.push_back(std::string("Offer Teleport..."));
@@ -3647,16 +3551,16 @@ BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop,
// check the type
switch(cargo_type)
{
- case DAD_TEXTURE:
- case DAD_SOUND:
- case DAD_LANDMARK:
- case DAD_SCRIPT:
- case DAD_CLOTHING:
- case DAD_OBJECT:
- case DAD_NOTECARD:
- case DAD_BODYPART:
- case DAD_ANIMATION:
- case DAD_GESTURE:
+ case DAD_TEXTURE:
+ case DAD_SOUND:
+ case DAD_LANDMARK:
+ case DAD_SCRIPT:
+ case DAD_CLOTHING:
+ case DAD_OBJECT:
+ case DAD_NOTECARD:
+ case DAD_BODYPART:
+ case DAD_ANIMATION:
+ case DAD_GESTURE:
{
LLInventoryItem* inv_item = (LLInventoryItem*)cargo_data;
const LLPermissions& perm = inv_item->getPermissions();
@@ -3666,7 +3570,7 @@ BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop,
rv = TRUE;
if(drop)
{
- LLToolDragAndDrop::giveInventory(item->getCreatorUUID(),
+ LLGiveInventory::doGiveInventoryItem(item->getCreatorUUID(),
(LLInventoryItem*)cargo_data);
}
}
@@ -3679,7 +3583,7 @@ BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop,
}
break;
}
- case DAD_CATEGORY:
+ case DAD_CATEGORY:
{
LLInventoryCategory* inv_cat = (LLInventoryCategory*)cargo_data;
if( gInventory.getCategory( inv_cat->getUUID() ) )
@@ -3687,7 +3591,7 @@ BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop,
rv = TRUE;
if(drop)
{
- LLToolDragAndDrop::giveInventoryCategory(
+ LLGiveInventory::doGiveInventoryCategory(
item->getCreatorUUID(),
inv_cat);
}
@@ -3701,8 +3605,8 @@ BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop,
}
break;
}
- default:
- break;
+ default:
+ break;
}
}
return rv;
@@ -3712,42 +3616,22 @@ BOOL LLCallingCardBridge::dragOrDrop(MASK mask, BOOL drop,
// | LLNotecardBridge |
// +=================================================+
-LLUIImagePtr LLNotecardBridge::getIcon() const
-{
- return get_item_icon(LLAssetType::AT_NOTECARD, LLInventoryType::IT_NOTECARD, 0, FALSE);
-}
-
void LLNotecardBridge::openItem()
{
LLViewerInventoryItem* item = getItem();
-
if (item)
{
LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
}
-
-/*
- LLViewerInventoryItem* item = getItem();
- if (item)
- {
- LLFloaterReg::showInstance("preview_notecard", LLSD(item->getUUID()), TAKE_FOCUS_YES);
- }
-*/
}
-
// +=================================================+
// | LLGestureBridge |
// +=================================================+
-LLUIImagePtr LLGestureBridge::getIcon() const
-{
- return get_item_icon(LLAssetType::AT_GESTURE, LLInventoryType::IT_GESTURE, 0, FALSE);
-}
-
LLFontGL::StyleFlags LLGestureBridge::getLabelStyle() const
{
- if( LLGestureManager::instance().isGestureActive(mUUID) )
+ if( LLGestureMgr::instance().isGestureActive(mUUID) )
{
return LLFontGL::BOLD;
}
@@ -3759,9 +3643,11 @@ LLFontGL::StyleFlags LLGestureBridge::getLabelStyle() const
std::string LLGestureBridge::getLabelSuffix() const
{
- if( LLGestureManager::instance().isGestureActive(mUUID) )
+ if( LLGestureMgr::instance().isGestureActive(mUUID) )
{
- return LLItemBridge::getLabelSuffix() + " (active)";
+ LLStringUtil::format_map_t args;
+ args["[GESLABEL]"] = LLItemBridge::getLabelSuffix();
+ return LLTrans::getString("ActiveGesture", args);
}
else
{
@@ -3770,11 +3656,11 @@ std::string LLGestureBridge::getLabelSuffix() const
}
// virtual
-void LLGestureBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+void LLGestureBridge::performAction(LLInventoryModel* model, std::string action)
{
if (isAddAction(action))
{
- LLGestureManager::instance().activateGesture(mUUID);
+ LLGestureMgr::instance().activateGesture(mUUID);
LLViewerInventoryItem* item = gInventory.getItem(mUUID);
if (!item) return;
@@ -3786,7 +3672,7 @@ void LLGestureBridge::performAction(LLFolderView* folder, LLInventoryModel* mode
}
else if (isRemoveAction(action))
{
- LLGestureManager::instance().deactivateGesture(mUUID);
+ LLGestureMgr::instance().deactivateGesture(mUUID);
LLViewerInventoryItem* item = gInventory.getItem(mUUID);
if (!item) return;
@@ -3798,20 +3684,25 @@ void LLGestureBridge::performAction(LLFolderView* folder, LLInventoryModel* mode
}
else if("play" == action)
{
- if(!LLGestureManager::instance().isGestureActive(mUUID))
+ if(!LLGestureMgr::instance().isGestureActive(mUUID))
{
// we need to inform server about gesture activating to be consistent with LLPreviewGesture and LLGestureComboList.
BOOL inform_server = TRUE;
BOOL deactivate_similar = FALSE;
- LLGestureManager::instance().setGestureLoadedCallback(mUUID, boost::bind(&LLGestureBridge::playGesture, mUUID));
- LLGestureManager::instance().activateGestureWithAsset(mUUID, gInventory.getItem(mUUID)->getAssetUUID(), inform_server, deactivate_similar);
+ LLGestureMgr::instance().setGestureLoadedCallback(mUUID, boost::bind(&LLGestureBridge::playGesture, mUUID));
+ LLViewerInventoryItem* item = gInventory.getItem(mUUID);
+ llassert(item);
+ if (item)
+ {
+ LLGestureMgr::instance().activateGestureWithAsset(mUUID, item->getAssetUUID(), inform_server, deactivate_similar);
+ }
}
else
{
playGesture(mUUID);
}
}
- else LLItemBridge::performAction(folder, model, action);
+ else LLItemBridge::performAction(model, action);
}
void LLGestureBridge::openItem()
@@ -3823,12 +3714,12 @@ void LLGestureBridge::openItem()
LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
}
/*
- LLViewerInventoryItem* item = getItem();
- if (item)
- {
- LLPreviewGesture* preview = LLPreviewGesture::show(mUUID, LLUUID::null);
- preview->setFocus(TRUE);
- }
+ LLViewerInventoryItem* item = getItem();
+ if (item)
+ {
+ LLPreviewGesture* preview = LLPreviewGesture::show(mUUID, LLUUID::null);
+ preview->setFocus(TRUE);
+ }
*/
}
@@ -3845,7 +3736,7 @@ BOOL LLGestureBridge::removeItem()
// This will also force close the preview window, if it exists.
// This may actually delete *this, if mUUID is in the COF.
- LLGestureManager::instance().deactivateGesture(item_id);
+ LLGestureMgr::instance().deactivateGesture(item_id);
// If deactivateGesture deleted *this, then return out immediately.
if (!model->getObject(item_id))
@@ -3867,18 +3758,23 @@ void LLGestureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
}
else
{
+ items.push_back(std::string("Share"));
+ if (!canShare())
+ {
+ disabled_items.push_back(std::string("Share"));
+ }
bool is_sidepanel = isInOutfitsSidePanel();
if (!is_sidepanel)
{
- items.push_back(std::string("Open"));
+ addOpenRightClickMenuOption(items);
items.push_back(std::string("Properties"));
}
getClipboardEntries(true, items, disabled_items, flags);
items.push_back(std::string("Gesture Separator"));
- if (LLGestureManager::instance().isGestureActive(getUUID()))
+ if (LLGestureMgr::instance().isGestureActive(getUUID()))
{
items.push_back(std::string("Deactivate"));
}
@@ -3893,13 +3789,13 @@ void LLGestureBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
// static
void LLGestureBridge::playGesture(const LLUUID& item_id)
{
- if (LLGestureManager::instance().isGesturePlaying(item_id))
+ if (LLGestureMgr::instance().isGesturePlaying(item_id))
{
- LLGestureManager::instance().stopGesture(item_id);
+ LLGestureMgr::instance().stopGesture(item_id);
}
else
{
- LLGestureManager::instance().playGesture(item_id);
+ LLGestureMgr::instance().playGesture(item_id);
}
}
@@ -3908,11 +3804,6 @@ void LLGestureBridge::playGesture(const LLUUID& item_id)
// | LLAnimationBridge |
// +=================================================+
-LLUIImagePtr LLAnimationBridge::getIcon() const
-{
- return get_item_icon(LLAssetType::AT_ANIMATION, LLInventoryType::IT_ANIMATION, 0, FALSE);
-}
-
void LLAnimationBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
menuentry_vec_t items;
@@ -3925,6 +3816,11 @@ void LLAnimationBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
}
else
{
+ items.push_back(std::string("Share"));
+ if (!canShare())
+ {
+ disabled_items.push_back(std::string("Share"));
+ }
items.push_back(std::string("Animation Open"));
items.push_back(std::string("Properties"));
@@ -3940,7 +3836,7 @@ void LLAnimationBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
}
// virtual
-void LLAnimationBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+void LLAnimationBridge::performAction(LLInventoryModel* model, std::string action)
{
if ((action == "playworld") || (action == "playlocal"))
{
@@ -3959,7 +3855,7 @@ void LLAnimationBridge::performAction(LLFolderView* folder, LLInventoryModel* mo
}
else
{
- LLItemBridge::performAction(folder, model, action);
+ LLItemBridge::performAction(model, action);
}
}
@@ -3972,11 +3868,11 @@ void LLAnimationBridge::openItem()
LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
}
/*
- LLViewerInventoryItem* item = getItem();
- if (item)
- {
- LLFloaterReg::showInstance("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES);
- }
+ LLViewerInventoryItem* item = getItem();
+ if (item)
+ {
+ LLFloaterReg::showInstance("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES);
+ }
*/
}
@@ -3987,17 +3883,21 @@ void LLAnimationBridge::openItem()
// static
LLUUID LLObjectBridge::sContextMenuItemID;
-LLObjectBridge::LLObjectBridge(LLInventoryPanel* inventory, const LLUUID& uuid, LLInventoryType::EType type, U32 flags) :
-LLItemBridge(inventory, uuid), mInvType(type)
+LLObjectBridge::LLObjectBridge(LLInventoryPanel* inventory,
+ LLFolderView* root,
+ const LLUUID& uuid,
+ LLInventoryType::EType type,
+ U32 flags) :
+ LLItemBridge(inventory, root, uuid)
{
mAttachPt = (flags & 0xff); // low bye of inventory flags
-
- mIsMultiObject = ( flags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) ? TRUE: FALSE;
+ mIsMultiObject = ( flags & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS ) ? TRUE: FALSE;
+ mInvType = type;
}
LLUIImagePtr LLObjectBridge::getIcon() const
{
- return get_item_icon(LLAssetType::AT_OBJECT, mInvType, mAttachPt, mIsMultiObject );
+ return LLInventoryIcon::getIcon(LLAssetType::AT_OBJECT, mInvType, mAttachPt, mIsMultiObject);
}
LLInventoryObject* LLObjectBridge::getObject() const
@@ -4012,7 +3912,7 @@ LLInventoryObject* LLObjectBridge::getObject() const
}
// virtual
-void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+void LLObjectBridge::performAction(LLInventoryModel* model, std::string action)
{
if (isAddAction(action))
{
@@ -4023,7 +3923,7 @@ void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model
{
rez_attachment(item, NULL);
}
- else if(item && item->isComplete())
+ else if(item && item->isFinished())
{
// must be in library. copy it to our inventory and put it on.
LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(0);
@@ -4047,64 +3947,34 @@ void LLObjectBridge::performAction(LLFolderView* folder, LLInventoryModel* model
gMessageSystem->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
gMessageSystem->addUUIDFast(_PREHASH_ItemID, 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(item->getLinkedUUID());
- if (found_obj)
- {
- LLSelectMgr::getInstance()->remove(found_obj);
+
+ // this object might have been selected, so let the selection manager know it's gone now
+ LLViewerObject *found_obj = gObjectList.findObject(item->getLinkedUUID());
+ if (found_obj)
+ {
+ LLSelectMgr::getInstance()->remove(found_obj);
+ }
}
}
- else LLItemBridge::performAction(folder, model, action);
+ else LLItemBridge::performAction(model, action);
}
void LLObjectBridge::openItem()
{
- LLViewerInventoryItem* item = getItem();
-
- if (item)
- {
- LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
- }
-
- LLSD key;
- key["id"] = mUUID;
- LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
-
- // Disable old properties floater; this is replaced by the sidepanel.
- /*
- LLFloaterReg::showInstance("properties", mUUID);
- */
-}
-
-LLFontGL::StyleFlags LLObjectBridge::getLabelStyle() const
-{
- U8 font = LLFontGL::NORMAL;
-
- if(get_is_item_worn( mUUID ) )
- {
- font |= LLFontGL::BOLD;
- }
-
- LLInventoryItem* item = getItem();
- if (item && item->getIsLinkType())
- {
- font |= LLFontGL::ITALIC;
- }
-
- return (LLFontGL::StyleFlags)font;
+ // object double-click action is to wear/unwear object
+ performAction(getInventoryModel(),
+ get_is_item_worn(mUUID) ? "detach" : "attach");
}
std::string LLObjectBridge::getLabelSuffix() const
{
if (get_is_item_worn(mUUID))
{
- LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- std::string attachment_point_name = avatar->getAttachedPointName(mUUID);
+ std::string attachment_point_name = gAgentAvatarp->getAttachedPointName(mUUID);
// e.g. "(worn on ...)" / "(attached to ...)"
LLStringUtil::format_map_t args;
- args["[ATTACHMENT_POINT]"] = attachment_point_name.c_str();
+ args["[ATTACHMENT_POINT]"] = LLTrans::getString(attachment_point_name);
return LLItemBridge::getLabelSuffix() + LLTrans::getString("WornOnAttachmentPoint", args);
}
else
@@ -4119,10 +3989,10 @@ void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attach
payload["item_id"] = item->getLinkedUUID(); // Wear the base object in case this is a link.
S32 attach_pt = 0;
- if (gAgent.getAvatarObject() && attachment)
+ if (isAgentAvatarValid() && attachment)
{
- for (LLVOAvatar::attachment_map_t::iterator iter = gAgent.getAvatarObject()->mAttachmentPoints.begin();
- iter != gAgent.getAvatarObject()->mAttachmentPoints.end(); ++iter)
+ for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin();
+ iter != gAgentAvatarp->mAttachmentPoints.end(); ++iter)
{
if (iter->second == attachment)
{
@@ -4148,9 +4018,7 @@ void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attach
bool confirm_replace_attachment_rez(const LLSD& notification, const LLSD& response)
{
- LLVOAvatar *avatarp = gAgent.getAvatarObject();
-
- if (!avatarp->canAttachMoreObjects())
+ if (!gAgentAvatarp->canAttachMoreObjects())
{
LLSD args;
args["MAX_ATTACHMENTS"] = llformat("%d", MAX_AGENT_ATTACHMENTS);
@@ -4198,6 +4066,11 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
}
else
{
+ items.push_back(std::string("Share"));
+ if (!canShare())
+ {
+ disabled_items.push_back(std::string("Share"));
+ }
bool is_sidepanel = isInOutfitsSidePanel();
if (!is_sidepanel)
@@ -4212,18 +4085,14 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
LLInventoryItem *item = getItem();
if(item)
{
- LLVOAvatarSelf* avatarp = gAgent.getAvatarObject();
- if( !avatarp )
- {
- return;
- }
+ if (!isAgentAvatarValid()) return;
if( get_is_item_worn( mUUID ) )
{
items.push_back(std::string("Attach Separator"));
items.push_back(std::string("Detach From Yourself"));
}
- else if (!isItemInTrash() && !isLinkedObjectInTrash() && !isLinkedObjectMissing())
+ else if (!isItemInTrash() && !isLinkedObjectInTrash() && !isLinkedObjectMissing() && !isCOFFolder())
{
items.push_back(std::string("Attach Separator"));
items.push_back(std::string("Object Wear"));
@@ -4232,7 +4101,7 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
// commented out for DEV-32347
//items.push_back(std::string("Restore to Last Position"));
- if (!avatarp->canAttachMoreObjects())
+ if (!gAgentAvatarp->canAttachMoreObjects())
{
disabled_items.push_back(std::string("Object Wear"));
disabled_items.push_back(std::string("Attach To"));
@@ -4240,15 +4109,14 @@ void LLObjectBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
}
LLMenuGL* attach_menu = menu.findChildMenuByName("Attach To", TRUE);
LLMenuGL* attach_hud_menu = menu.findChildMenuByName("Attach To HUD", TRUE);
- LLVOAvatar *avatarp = gAgent.getAvatarObject();
if (attach_menu
&& (attach_menu->getChildCount() == 0)
&& attach_hud_menu
&& (attach_hud_menu->getChildCount() == 0)
- && avatarp)
+ && isAgentAvatarValid())
{
- for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin();
- iter != avatarp->mAttachmentPoints.end(); )
+ for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin();
+ iter != gAgentAvatarp->mAttachmentPoints.end(); )
{
LLVOAvatar::attachment_map_t::iterator curiter = iter++;
LLViewerJointAttachment* attachment = curiter->second;
@@ -4298,11 +4166,10 @@ BOOL LLObjectBridge::renameItem(const std::string& new_name)
model->notifyObservers();
- LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- if( avatar )
+ if (isAgentAvatarValid())
{
- LLViewerObject* obj = avatar->getWornAttachment( item->getUUID() );
- if( obj )
+ LLViewerObject* obj = gAgentAvatarp->getWornAttachment( item->getUUID() );
+ if(obj)
{
LLSelectMgr::getInstance()->deselectAll();
LLSelectMgr::getInstance()->addAsIndividual( obj, SELECT_ALL_TES, FALSE );
@@ -4320,11 +4187,6 @@ BOOL LLObjectBridge::renameItem(const std::string& new_name)
// | LLLSLTextBridge |
// +=================================================+
-LLUIImagePtr LLLSLTextBridge::getIcon() const
-{
- return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE);
-}
-
void LLLSLTextBridge::openItem()
{
LLViewerInventoryItem* item = getItem();
@@ -4333,44 +4195,23 @@ void LLLSLTextBridge::openItem()
{
LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
}
- /*
- LLViewerInventoryItem* item = getItem();
- if (item)
- {
- LLFloaterReg::showInstance("preview_script", LLSD(mUUID), TAKE_FOCUS_YES);
- }
- */
}
// +=================================================+
// | LLWearableBridge |
// +=================================================+
-// *NOTE: hack to get from avatar inventory to avatar
-void wear_inventory_item_on_avatar( LLInventoryItem* item )
+LLWearableBridge::LLWearableBridge(LLInventoryPanel* inventory,
+ LLFolderView* root,
+ const LLUUID& uuid,
+ LLAssetType::EType asset_type,
+ LLInventoryType::EType inv_type,
+ LLWearableType::EType wearable_type) :
+ LLItemBridge(inventory, root, uuid),
+ mAssetType( asset_type ),
+ mWearableType(wearable_type)
{
- if(item)
- {
- lldebugs << "wear_inventory_item_on_avatar( " << item->getName()
- << " )" << llendl;
-
- LLAppearanceManager::instance().addCOFItemLink(item);
- }
-}
-
-void wear_add_inventory_item_on_avatar( LLInventoryItem* item )
-{
- if(item)
- {
- lldebugs << "wear_add_inventory_item_on_avatar( " << item->getName()
- << " )" << llendl;
-
- LLWearableList::instance().getAsset(item->getAssetUUID(),
- item->getName(),
- item->getType(),
- LLWearableBridge::onWearAddOnAvatarArrived,
- new LLUUID(item->getUUID()));
- }
+ mInvType = inv_type;
}
void remove_inventory_category_from_avatar( LLInventoryCategory* category )
@@ -4380,15 +4221,13 @@ void remove_inventory_category_from_avatar( LLInventoryCategory* category )
<< " )" << llendl;
- if( gFloaterCustomize )
- {
- gFloaterCustomize->askToSaveIfDirty(
- boost::bind(remove_inventory_category_from_avatar_step2, _1, category->getUUID()));
- }
- else
+ if (gAgentCamera.cameraCustomizeAvatar())
{
- remove_inventory_category_from_avatar_step2(TRUE, category->getUUID() );
+ // switching to outfit editor should automagically save any currently edited wearable
+ LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit"));
}
+
+ remove_inventory_category_from_avatar_step2(TRUE, category->getUUID() );
}
struct OnRemoveStruct
@@ -4447,7 +4286,7 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_
if (item->getType() == LLAssetType::AT_BODYPART)
continue;
if (gAgent.isTeen() && item->isWearableType() &&
- (item->getWearableType() == WT_UNDERPANTS || item->getWearableType() == WT_UNDERSHIRT))
+ (item->getWearableType() == LLWearableType::WT_UNDERPANTS || item->getWearableType() == LLWearableType::WT_UNDERSHIRT))
continue;
if (get_is_item_worn(item->getUUID()))
{
@@ -4491,7 +4330,7 @@ void remove_inventory_category_from_avatar_step2( BOOL proceed, LLUUID category_
LLViewerInventoryItem *gest_item = gest_item_array.get(i);
if (get_is_item_worn(gest_item->getUUID()))
{
- LLGestureManager::instance().deactivateGesture( gest_item->getLinkedUUID() );
+ LLGestureMgr::instance().deactivateGesture( gest_item->getLinkedUUID() );
gInventory.updateItem( gest_item );
gInventory.notifyObservers();
}
@@ -4525,11 +4364,11 @@ std::string LLWearableBridge::getLabelSuffix() const
LLUIImagePtr LLWearableBridge::getIcon() const
{
- return get_item_icon(mAssetType, mInvType, mWearableType, FALSE);
+ return LLInventoryIcon::getIcon(mAssetType, mInvType, mWearableType, FALSE);
}
// virtual
-void LLWearableBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+void LLWearableBridge::performAction(LLInventoryModel* model, std::string action)
{
if (isAddAction(action))
{
@@ -4549,7 +4388,7 @@ void LLWearableBridge::performAction(LLFolderView* folder, LLInventoryModel* mod
removeFromAvatar();
return;
}
- else LLItemBridge::performAction(folder, model, action);
+ else LLItemBridge::performAction(model, action);
}
void LLWearableBridge::openItem()
@@ -4560,42 +4399,6 @@ void LLWearableBridge::openItem()
{
LLInvFVBridgeAction::doAction(item->getType(),mUUID,getInventoryModel());
}
- /*
- if( isItemInTrash() )
- {
- LLNotificationsUtil::add("CannotWearTrash");
- }
- else if(isAgentInventory())
- {
- if( !get_is_item_worn( mUUID ) )
- {
- wearOnAvatar();
- }
- }
- else
- {
- // must be in the inventory library. copy it to our inventory
- // and put it on right away.
- LLViewerInventoryItem* item = getItem();
- if(item && item->isComplete())
- {
- LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback();
- copy_inventory_item(
- gAgent.getID(),
- item->getPermissions().getOwner(),
- item->getUUID(),
- LLUUID::null,
- std::string(),
- cb);
- }
- else if(item)
- {
- // *TODO: We should fetch the item details, and then do
- // the operation above.
- LLNotificationsUtil::add("CannotWearInfoNotComplete");
- }
- }
- */
}
void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
@@ -4623,11 +4426,16 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
can_open = FALSE;
}
+ items.push_back(std::string("Share"));
+ if (!canShare())
+ {
+ disabled_items.push_back(std::string("Share"));
+ }
bool is_sidepanel = isInOutfitsSidePanel();
if (can_open && !is_sidepanel)
{
- items.push_back(std::string("Open"));
+ addOpenRightClickMenuOption(items);
}
if (!is_sidepanel)
@@ -4649,7 +4457,7 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
disabled_items.push_back(std::string("Wearable Edit"));
}
// Don't allow items to be worn if their baseobj is in the trash.
- if (isLinkedObjectInTrash() || isLinkedObjectMissing())
+ if (isLinkedObjectInTrash() || isLinkedObjectMissing() || isCOFFolder())
{
disabled_items.push_back(std::string("Wearable Wear"));
disabled_items.push_back(std::string("Wearable Add"));
@@ -4675,6 +4483,7 @@ void LLWearableBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
items.push_back(std::string("Wearable Wear"));
items.push_back(std::string("Wearable Add"));
disabled_items.push_back(std::string("Take Off"));
+ disabled_items.push_back(std::string("Wearable Edit"));
}
break;
default:
@@ -4694,7 +4503,7 @@ BOOL LLWearableBridge::canWearOnAvatar(void* user_data)
if(!self->isAgentInventory())
{
LLViewerInventoryItem* item = (LLViewerInventoryItem*)self->getItem();
- if(!item || !item->isComplete()) return FALSE;
+ if(!item || !item->isFinished()) return FALSE;
}
return (!get_is_item_worn(self->mUUID));
}
@@ -4721,21 +4530,7 @@ void LLWearableBridge::wearOnAvatar()
LLViewerInventoryItem* item = getItem();
if(item)
{
- if(!isAgentInventory())
- {
- LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback();
- copy_inventory_item(
- gAgent.getID(),
- item->getPermissions().getOwner(),
- item->getUUID(),
- LLUUID::null,
- std::string(),
- cb);
- }
- else
- {
- wear_inventory_item_on_avatar(item);
- }
+ LLAppearanceMgr::instance().wearItemOnAvatar(item->getUUID(), true, true);
}
}
@@ -4752,21 +4547,7 @@ void LLWearableBridge::wearAddOnAvatar()
LLViewerInventoryItem* item = getItem();
if(item)
{
- if(!isAgentInventory())
- {
- LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback();
- copy_inventory_item(
- gAgent.getID(),
- item->getPermissions().getOwner(),
- item->getUUID(),
- LLUUID::null,
- std::string(),
- cb);
- }
- else
- {
- wear_add_inventory_item_on_avatar(item);
- }
+ LLAppearanceMgr::instance().wearItemOnAvatar(item->getUUID(), true, false);
}
}
@@ -4843,20 +4624,7 @@ void LLWearableBridge::onEditOnAvatar(void* user_data)
void LLWearableBridge::editOnAvatar()
{
- LLUUID linked_id = gInventory.getLinkedItemID(mUUID);
- const LLWearable* wearable = gAgentWearables.getWearableFromItemID(linked_id);
- if( wearable )
- {
- // Set the tab to the right wearable.
- if (gFloaterCustomize)
- gFloaterCustomize->setCurrentWearableType( wearable->getType() );
-
- if( CAMERA_MODE_CUSTOMIZE_AVATAR != gAgent.getCameraMode() )
- {
- // Start Avatar Customization
- gAgent.changeCameraToCustomizeAvatar();
- }
- }
+ LLAgentWearables::editWearable(mUUID);
}
// static
@@ -4900,71 +4668,47 @@ void LLWearableBridge::onRemoveFromAvatarArrived(LLWearable* wearable,
{
if( get_is_item_worn( item_id ) )
{
- EWearableType type = wearable->getType();
+ LLWearableType::EType type = wearable->getType();
- if( !(type==WT_SHAPE || type==WT_SKIN || type==WT_HAIR || type==WT_EYES ) ) //&&
- //!((!gAgent.isTeen()) && ( type==WT_UNDERPANTS || type==WT_UNDERSHIRT )) )
+ if( !(type==LLWearableType::WT_SHAPE || type==LLWearableType::WT_SKIN || type==LLWearableType::WT_HAIR || type==LLWearableType::WT_EYES ) ) //&&
+ //!((!gAgent.isTeen()) && ( type==LLWearableType::WT_UNDERPANTS || type==LLWearableType::WT_UNDERSHIRT )) )
{
- // MULTI_WEARABLE: FIXME HACK - always remove all
bool do_remove_all = false;
- gAgentWearables.removeWearable( type, do_remove_all, 0 );
+ U32 index = gAgentWearables.getWearableIndex(wearable);
+ gAgentWearables.removeWearable( type, do_remove_all, index );
}
}
}
// Find and remove this item from the COF.
- // FIXME 2.1 - call removeCOFItemLinks in llappearancemgr instead.
- LLInventoryModel::item_array_t items = gInventory.collectLinkedItems(item_id, LLAppearanceManager::instance().getCOF());
- if (items.size() != 1)
- {
- llwarns << "Found " << items.size() << " COF links to " << item_id.asString() << ", expected 1" << llendl;
- }
- for (LLInventoryModel::item_array_t::const_iterator iter = items.begin();
- iter != items.end();
- ++iter)
- {
- const LLViewerInventoryItem *linked_item = (*iter);
- const LLUUID &item_id = linked_item->getUUID();
- gInventory.purgeObject(item_id);
- }
+ LLAppearanceMgr::instance().removeCOFItemLinks(item_id,false);
gInventory.notifyObservers();
delete on_remove_struct;
}
-/* static */
+// static
void LLWearableBridge::removeAllClothesFromAvatar()
{
// Remove COF links.
- for (S32 itype = WT_SHAPE; itype < WT_COUNT; ++itype)
+ for (S32 itype = LLWearableType::WT_SHAPE; itype < LLWearableType::WT_COUNT; ++itype)
{
- if (itype == WT_SHAPE || itype == WT_SKIN || itype == WT_HAIR || itype == WT_EYES)
- continue;
-
- // MULTI-WEARABLES: fixed to index 0
- LLViewerInventoryItem *item = dynamic_cast<LLViewerInventoryItem*>(
- gAgentWearables.getWearableInventoryItem((EWearableType)itype, 0));
- if (!item)
- continue;
- const LLUUID &item_id = gInventory.getLinkedItemID(item->getUUID());
- const LLWearable *wearable = gAgentWearables.getWearableFromItemID(item_id);
- if (!wearable)
+ if (itype == LLWearableType::WT_SHAPE || itype == LLWearableType::WT_SKIN || itype == LLWearableType::WT_HAIR || itype == LLWearableType::WT_EYES)
continue;
- // Find and remove this item from the COF.
- LLInventoryModel::item_array_t items = gInventory.collectLinkedItems(
- item_id, LLAppearanceManager::instance().getCOF());
- if (items.size() != 1)
- {
- llwarns << "Found " << items.size() << " COF links to " << item_id.asString() << ", expected 1" << llendl;
- }
- for (LLInventoryModel::item_array_t::const_iterator iter = items.begin();
- iter != items.end();
- ++iter)
+ for (S32 index = gAgentWearables.getWearableCount(itype)-1; index >= 0 ; --index)
{
- const LLViewerInventoryItem *linked_item = (*iter);
- const LLUUID &item_id = linked_item->getUUID();
- gInventory.purgeObject(item_id);
+ LLViewerInventoryItem *item = dynamic_cast<LLViewerInventoryItem*>(
+ gAgentWearables.getWearableInventoryItem((LLWearableType::EType)itype, index));
+ if (!item)
+ continue;
+ const LLUUID &item_id = item->getUUID();
+ const LLWearable *wearable = gAgentWearables.getWearableFromItemID(item_id);
+ if (!wearable)
+ continue;
+
+ // Find and remove this item from the COF.
+ LLAppearanceMgr::instance().removeCOFItemLinks(item_id,false);
}
}
gInventory.notifyObservers();
@@ -4973,7 +4717,7 @@ void LLWearableBridge::removeAllClothesFromAvatar()
LLAgentWearables::userRemoveAllClothes();
}
-/* static */
+// static
void LLWearableBridge::removeItemFromAvatar(LLViewerInventoryItem *item)
{
if (item)
@@ -4995,65 +4739,131 @@ void LLWearableBridge::removeFromAvatar()
}
}
-LLInvFVBridgeAction* LLInvFVBridgeAction::createAction(LLAssetType::EType asset_type,
- const LLUUID& uuid,LLInventoryModel* model)
-{
- LLInvFVBridgeAction* action = NULL;
- switch(asset_type)
- {
- case LLAssetType::AT_TEXTURE:
- action = new LLTextureBridgeAction(uuid,model);
- break;
-
- case LLAssetType::AT_SOUND:
- action = new LLSoundBridgeAction(uuid,model);
- break;
-
- case LLAssetType::AT_LANDMARK:
- action = new LLLandmarkBridgeAction(uuid,model);
- break;
-
- case LLAssetType::AT_CALLINGCARD:
- action = new LLCallingCardBridgeAction(uuid,model);
- break;
-
- case LLAssetType::AT_OBJECT:
- action = new LLObjectBridgeAction(uuid,model);
- break;
-
- case LLAssetType::AT_NOTECARD:
- action = new LLNotecardBridgeAction(uuid,model);
- break;
+// +=================================================+
+// | LLLinkItemBridge |
+// +=================================================+
+// For broken item links
- case LLAssetType::AT_ANIMATION:
- action = new LLAnimationBridgeAction(uuid,model);
- break;
+std::string LLLinkItemBridge::sPrefix("Link: ");
- case LLAssetType::AT_GESTURE:
- action = new LLGestureBridgeAction(uuid,model);
- break;
+void LLLinkItemBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+ // *TODO: Translate
+ lldebugs << "LLLink::buildContextMenu()" << llendl;
+ menuentry_vec_t items;
+ menuentry_vec_t disabled_items;
- case LLAssetType::AT_LSL_TEXT:
- action = new LLLSLTextBridgeAction(uuid,model);
- break;
+ items.push_back(std::string("Find Original"));
+ disabled_items.push_back(std::string("Find Original"));
+
+ if(isItemInTrash())
+ {
+ addTrashContextMenuOptions(items, disabled_items);
+ }
+ else
+ {
+ items.push_back(std::string("Properties"));
+ addDeleteContextMenuOptions(items, disabled_items);
+ }
+ hide_context_entries(menu, items, disabled_items);
+}
- case LLAssetType::AT_CLOTHING:
- case LLAssetType::AT_BODYPART:
- action = new LLWearableBridgeAction(uuid,model);
+// +=================================================+
+// | LLLinkBridge |
+// +=================================================+
+// For broken folder links.
+std::string LLLinkFolderBridge::sPrefix("Link: ");
+LLUIImagePtr LLLinkFolderBridge::getIcon() const
+{
+ LLFolderType::EType folder_type = LLFolderType::FT_NONE;
+ const LLInventoryObject *obj = getInventoryObject();
+ if (obj)
+ {
+ LLViewerInventoryCategory* cat = NULL;
+ LLInventoryModel* model = getInventoryModel();
+ if(model)
+ {
+ cat = (LLViewerInventoryCategory*)model->getCategory(obj->getLinkedUUID());
+ if (cat)
+ {
+ folder_type = cat->getPreferredType();
+ }
+ }
+ }
+ return LLFolderBridge::getIcon(folder_type);
+}
- break;
+void LLLinkFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
+{
+ // *TODO: Translate
+ lldebugs << "LLLink::buildContextMenu()" << llendl;
+ menuentry_vec_t items;
+ menuentry_vec_t disabled_items;
- default:
- break;
+ if (isItemInTrash())
+ {
+ addTrashContextMenuOptions(items, disabled_items);
}
- return action;
+ else
+ {
+ items.push_back(std::string("Find Original"));
+ addDeleteContextMenuOptions(items, disabled_items);
+ }
+ hide_context_entries(menu, items, disabled_items);
+}
+void LLLinkFolderBridge::performAction(LLInventoryModel* model, std::string action)
+{
+ if ("goto" == action)
+ {
+ gotoItem();
+ return;
+ }
+ LLItemBridge::performAction(model,action);
}
+void LLLinkFolderBridge::gotoItem()
+{
+ const LLUUID &cat_uuid = getFolderID();
+ if (!cat_uuid.isNull())
+ {
+ if (LLFolderViewItem *base_folder = mRoot->getItemByID(cat_uuid))
+ {
+ if (LLInventoryModel* model = getInventoryModel())
+ {
+ model->fetchDescendentsOf(cat_uuid);
+ }
+ base_folder->setOpen(TRUE);
+ mRoot->setSelectionFromRoot(base_folder,TRUE);
+ mRoot->scrollToShowSelection();
+ }
+ }
+}
+const LLUUID &LLLinkFolderBridge::getFolderID() const
+{
+ if (LLViewerInventoryItem *link_item = getItem())
+ {
+ if (const LLViewerInventoryCategory *cat = link_item->getLinkedCategory())
+ {
+ const LLUUID& cat_uuid = cat->getUUID();
+ return cat_uuid;
+ }
+ }
+ return LLUUID::null;
+}
+
+/********************************************************************************
+ **
+ ** BRIDGE ACTIONS
+ **/
-//static
+// static
void LLInvFVBridgeAction::doAction(LLAssetType::EType asset_type,
- const LLUUID& uuid,LLInventoryModel* model)
+ const LLUUID& uuid,
+ LLInventoryModel* model)
{
- LLInvFVBridgeAction* action = createAction(asset_type,uuid,model);
+ // Perform indirection in case of link.
+ const LLUUID& linked_uuid = gInventory.getLinkedItemID(uuid);
+
+ LLInvFVBridgeAction* action = createAction(asset_type,linked_uuid,model);
if(action)
{
action->doIt();
@@ -5061,143 +4871,218 @@ void LLInvFVBridgeAction::doAction(LLAssetType::EType asset_type,
}
}
-//static
+// static
void LLInvFVBridgeAction::doAction(const LLUUID& uuid, LLInventoryModel* model)
{
- LLAssetType::EType asset_type = model->getItem(uuid)->getType();
- LLInvFVBridgeAction* action = createAction(asset_type,uuid,model);
- if(action)
+ llassert(model);
+ LLViewerInventoryItem* item = model->getItem(uuid);
+ llassert(item);
+ if (item)
{
- action->doIt();
- delete action;
+ LLAssetType::EType asset_type = item->getType();
+ LLInvFVBridgeAction* action = createAction(asset_type,uuid,model);
+ if(action)
+ {
+ action->doIt();
+ delete action;
+ }
}
}
LLViewerInventoryItem* LLInvFVBridgeAction::getItem() const
{
- if(mModel)
+ if (mModel)
return (LLViewerInventoryItem*)mModel->getItem(mUUID);
return NULL;
}
-//virtual
-void LLTextureBridgeAction::doIt()
+class LLTextureBridgeAction: public LLInvFVBridgeAction
{
- if (getItem())
+ friend class LLInvFVBridgeAction;
+public:
+ virtual void doIt()
{
- LLFloaterReg::showInstance("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES);
+ if (getItem())
+ {
+ LLFloaterReg::showInstance("preview_texture", LLSD(mUUID), TAKE_FOCUS_YES);
+ }
+ LLInvFVBridgeAction::doIt();
}
+ virtual ~LLTextureBridgeAction(){}
+protected:
+ LLTextureBridgeAction(const LLUUID& id,LLInventoryModel* model) : LLInvFVBridgeAction(id,model) {}
+};
- LLInvFVBridgeAction::doIt();
-}
-
-//virtual
-void LLSoundBridgeAction::doIt()
+class LLSoundBridgeAction: public LLInvFVBridgeAction
{
- LLViewerInventoryItem* item = getItem();
- if(item)
+ friend class LLInvFVBridgeAction;
+public:
+ virtual void doIt()
{
- LLFloaterReg::showInstance("preview_sound", LLSD(mUUID), TAKE_FOCUS_YES);
+ LLViewerInventoryItem* item = getItem();
+ if (item)
+ {
+ LLFloaterReg::showInstance("preview_sound", LLSD(mUUID), TAKE_FOCUS_YES);
+ }
+ LLInvFVBridgeAction::doIt();
}
+ virtual ~LLSoundBridgeAction(){}
+protected:
+ LLSoundBridgeAction(const LLUUID& id,LLInventoryModel* model) : LLInvFVBridgeAction(id,model) {}
+};
- LLInvFVBridgeAction::doIt();
-}
-
-
-//virtual
-void LLLandmarkBridgeAction::doIt()
+class LLLandmarkBridgeAction: public LLInvFVBridgeAction
{
- LLViewerInventoryItem* item = getItem();
- if( item )
+ friend class LLInvFVBridgeAction;
+public:
+ virtual void doIt()
{
- // Opening (double-clicking) a landmark immediately teleports,
- // but warns you the first time.
- LLSD payload;
- payload["asset_id"] = item->getAssetUUID();
-
- LLSD args;
- args["LOCATION"] = item->getName();
-
- LLNotificationsUtil::add("TeleportFromLandmark", args, payload);
+ LLViewerInventoryItem* item = getItem();
+ if (item)
+ {
+ // Opening (double-clicking) a landmark immediately teleports,
+ // but warns you the first time.
+ LLSD payload;
+ payload["asset_id"] = item->getAssetUUID();
+
+ LLSD args;
+ args["LOCATION"] = item->getName();
+
+ LLNotificationsUtil::add("TeleportFromLandmark", args, payload);
+ }
+ LLInvFVBridgeAction::doIt();
}
+ virtual ~LLLandmarkBridgeAction(){}
+protected:
+ LLLandmarkBridgeAction(const LLUUID& id,LLInventoryModel* model) : LLInvFVBridgeAction(id,model) {}
+};
- LLInvFVBridgeAction::doIt();
-}
-
-
-//virtual
-void LLCallingCardBridgeAction::doIt()
+class LLCallingCardBridgeAction: public LLInvFVBridgeAction
{
- LLViewerInventoryItem* item = getItem();
- if(item && item->getCreatorUUID().notNull())
+ friend class LLInvFVBridgeAction;
+public:
+ virtual void doIt()
{
- LLAvatarActions::showProfile(item->getCreatorUUID());
+ LLViewerInventoryItem* item = getItem();
+ if (item && item->getCreatorUUID().notNull())
+ {
+ LLAvatarActions::showProfile(item->getCreatorUUID());
+ }
+ LLInvFVBridgeAction::doIt();
}
+ virtual ~LLCallingCardBridgeAction(){}
+protected:
+ LLCallingCardBridgeAction(const LLUUID& id,LLInventoryModel* model) : LLInvFVBridgeAction(id,model) {}
- LLInvFVBridgeAction::doIt();
-}
+};
-//virtual
-void
-LLNotecardBridgeAction::doIt()
+class LLNotecardBridgeAction
+: public LLInvFVBridgeAction
{
- LLViewerInventoryItem* item = getItem();
- if (item)
+ friend class LLInvFVBridgeAction;
+public:
+ virtual void doIt()
{
- LLFloaterReg::showInstance("preview_notecard", LLSD(item->getUUID()), TAKE_FOCUS_YES);
+ LLViewerInventoryItem* item = getItem();
+ if (item)
+ {
+ LLFloaterReg::showInstance("preview_notecard", LLSD(item->getUUID()), TAKE_FOCUS_YES);
+ }
+ LLInvFVBridgeAction::doIt();
}
+ virtual ~LLNotecardBridgeAction(){}
+protected:
+ LLNotecardBridgeAction(const LLUUID& id,LLInventoryModel* model) : LLInvFVBridgeAction(id,model) {}
+};
- LLInvFVBridgeAction::doIt();
-}
-
-//virtual
-void LLGestureBridgeAction::doIt()
+class LLGestureBridgeAction: public LLInvFVBridgeAction
{
- LLViewerInventoryItem* item = getItem();
- if (item)
+ friend class LLInvFVBridgeAction;
+public:
+ virtual void doIt()
{
- LLPreviewGesture* preview = LLPreviewGesture::show(mUUID, LLUUID::null);
- preview->setFocus(TRUE);
+ LLViewerInventoryItem* item = getItem();
+ if (item)
+ {
+ LLPreviewGesture* preview = LLPreviewGesture::show(mUUID, LLUUID::null);
+ preview->setFocus(TRUE);
+ }
+ LLInvFVBridgeAction::doIt();
}
+ virtual ~LLGestureBridgeAction(){}
+protected:
+ LLGestureBridgeAction(const LLUUID& id,LLInventoryModel* model) : LLInvFVBridgeAction(id,model) {}
+};
- LLInvFVBridgeAction::doIt();
-}
-
-//virtual
-void LLAnimationBridgeAction::doIt()
+class LLAnimationBridgeAction: public LLInvFVBridgeAction
{
- LLViewerInventoryItem* item = getItem();
- if (item)
+ friend class LLInvFVBridgeAction;
+public:
+ virtual void doIt()
{
- LLFloaterReg::showInstance("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES);
+ LLViewerInventoryItem* item = getItem();
+ if (item)
+ {
+ LLFloaterReg::showInstance("preview_anim", LLSD(mUUID), TAKE_FOCUS_YES);
+ }
+ LLInvFVBridgeAction::doIt();
}
+ virtual ~LLAnimationBridgeAction(){}
+protected:
+ LLAnimationBridgeAction(const LLUUID& id,LLInventoryModel* model) : LLInvFVBridgeAction(id,model) {}
+};
- LLInvFVBridgeAction::doIt();
-}
-
-
-//virtual
-void LLObjectBridgeAction::doIt()
+class LLObjectBridgeAction: public LLInvFVBridgeAction
{
- /*
- LLFloaterReg::showInstance("properties", mUUID);
- */
- LLInvFVBridgeAction::doIt();
-}
-
+ friend class LLInvFVBridgeAction;
+public:
+ virtual void doIt()
+ {
+ /*
+ LLFloaterReg::showInstance("properties", mUUID);
+ */
+ LLInvFVBridgeAction::doIt();
+ }
+ virtual ~LLObjectBridgeAction(){}
+protected:
+ LLObjectBridgeAction(const LLUUID& id,LLInventoryModel* model) : LLInvFVBridgeAction(id,model) {}
+};
-//virtual
-void LLLSLTextBridgeAction::doIt()
+class LLLSLTextBridgeAction: public LLInvFVBridgeAction
{
- LLViewerInventoryItem* item = getItem();
- if (item)
+ friend class LLInvFVBridgeAction;
+public:
+ virtual void doIt()
{
- LLFloaterReg::showInstance("preview_script", LLSD(mUUID), TAKE_FOCUS_YES);
+ LLViewerInventoryItem* item = getItem();
+ if (item)
+ {
+ LLFloaterReg::showInstance("preview_script", LLSD(mUUID), TAKE_FOCUS_YES);
+ }
+ LLInvFVBridgeAction::doIt();
}
+ virtual ~LLLSLTextBridgeAction(){}
+protected:
+ LLLSLTextBridgeAction(const LLUUID& id,LLInventoryModel* model) : LLInvFVBridgeAction(id,model) {}
+};
- LLInvFVBridgeAction::doIt();
-}
-
+class LLWearableBridgeAction: public LLInvFVBridgeAction
+{
+ friend class LLInvFVBridgeAction;
+public:
+ virtual void doIt()
+ {
+ wearOnAvatar();
+ }
+ virtual ~LLWearableBridgeAction(){}
+protected:
+ LLWearableBridgeAction(const LLUUID& id,LLInventoryModel* model) : LLInvFVBridgeAction(id,model) {}
+ BOOL isItemInTrash() const;
+ // return true if the item is in agent inventory. if false, it
+ // must be lost or in the inventory library.
+ BOOL isAgentInventory() const;
+ void wearOnAvatar();
+};
BOOL LLWearableBridgeAction::isItemInTrash() const
{
@@ -5226,182 +5111,118 @@ void LLWearableBridgeAction::wearOnAvatar()
LLViewerInventoryItem* item = getItem();
if(item)
{
- if(!isAgentInventory())
- {
- LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback();
- copy_inventory_item(
- gAgent.getID(),
- item->getPermissions().getOwner(),
- item->getUUID(),
- LLUUID::null,
- std::string(),
- cb);
- }
- else
- {
- wear_inventory_item_on_avatar(item);
- }
+ LLAppearanceMgr::instance().wearItemOnAvatar(item->getUUID(), true, true);
}
}
-//virtual
-void LLWearableBridgeAction::doIt()
+LLInvFVBridgeAction* LLInvFVBridgeAction::createAction(LLAssetType::EType asset_type,
+ const LLUUID& uuid,
+ LLInventoryModel* model)
{
- if(isItemInTrash())
- {
- LLNotificationsUtil::add("CannotWearTrash");
- }
- else if(isAgentInventory())
- {
- if(!get_is_item_worn(mUUID))
- {
- wearOnAvatar();
- }
- }
- else
+ LLInvFVBridgeAction* action = NULL;
+ switch(asset_type)
{
- // must be in the inventory library. copy it to our inventory
- // and put it on right away.
- LLViewerInventoryItem* item = getItem();
- if(item && item->isComplete())
- {
- LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback();
- copy_inventory_item(
- gAgent.getID(),
- item->getPermissions().getOwner(),
- item->getUUID(),
- LLUUID::null,
- std::string(),
- cb);
- }
- else if(item)
- {
- // *TODO: We should fetch the item details, and then do
- // the operation above.
- LLNotificationsUtil::add("CannotWearInfoNotComplete");
- }
+ case LLAssetType::AT_TEXTURE:
+ action = new LLTextureBridgeAction(uuid,model);
+ break;
+ case LLAssetType::AT_SOUND:
+ action = new LLSoundBridgeAction(uuid,model);
+ break;
+ case LLAssetType::AT_LANDMARK:
+ action = new LLLandmarkBridgeAction(uuid,model);
+ break;
+ case LLAssetType::AT_CALLINGCARD:
+ action = new LLCallingCardBridgeAction(uuid,model);
+ break;
+ case LLAssetType::AT_OBJECT:
+ action = new LLObjectBridgeAction(uuid,model);
+ break;
+ case LLAssetType::AT_NOTECARD:
+ action = new LLNotecardBridgeAction(uuid,model);
+ break;
+ case LLAssetType::AT_ANIMATION:
+ action = new LLAnimationBridgeAction(uuid,model);
+ break;
+ case LLAssetType::AT_GESTURE:
+ action = new LLGestureBridgeAction(uuid,model);
+ break;
+ case LLAssetType::AT_LSL_TEXT:
+ action = new LLLSLTextBridgeAction(uuid,model);
+ break;
+ case LLAssetType::AT_CLOTHING:
+ case LLAssetType::AT_BODYPART:
+ action = new LLWearableBridgeAction(uuid,model);
+ break;
+ default:
+ break;
}
-
- LLInvFVBridgeAction::doIt();
+ return action;
}
-// +=================================================+
-// | LLLinkItemBridge |
-// +=================================================+
-// For broken links
-
-std::string LLLinkItemBridge::sPrefix("Link: ");
+/** Bridge Actions
+ **
+ ********************************************************************************/
-
-LLUIImagePtr LLLinkItemBridge::getIcon() const
+/************************************************************************/
+/* Recent Inventory Panel related classes */
+/************************************************************************/
+void LLRecentItemsFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
- if (LLViewerInventoryItem *item = getItem())
- {
- return get_item_icon(item->getActualType(), item->getInventoryType(), 0, FALSE);
- }
- return get_item_icon(LLAssetType::AT_LINK, LLInventoryType::IT_NONE, 0, FALSE);
-}
+ LLFolderBridge::buildContextMenu(menu, flags);
-void LLLinkItemBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
-{
- // *TODO: Translate
- lldebugs << "LLLink::buildContextMenu()" << llendl;
- menuentry_vec_t items;
- menuentry_vec_t disabled_items;
+ menuentry_vec_t disabled_items, items = getMenuItems();
+
+ items.erase(std::remove(items.begin(), items.end(), std::string("New Body Parts")), items.end());
+ items.erase(std::remove(items.begin(), items.end(), std::string("New Clothes")), items.end());
+ items.erase(std::remove(items.begin(), items.end(), std::string("New Note")), items.end());
+ items.erase(std::remove(items.begin(), items.end(), std::string("New Gesture")), items.end());
+ items.erase(std::remove(items.begin(), items.end(), std::string("New Script")), items.end());
+ items.erase(std::remove(items.begin(), items.end(), std::string("New Folder")), items.end());
- items.push_back(std::string("Find Original"));
- disabled_items.push_back(std::string("Find Original"));
-
- if(isItemInTrash())
- {
- addTrashContextMenuOptions(items, disabled_items);
- }
- else
- {
- items.push_back(std::string("Properties"));
- addDeleteContextMenuOptions(items, disabled_items);
- }
hide_context_entries(menu, items, disabled_items);
}
-
-// +=================================================+
-// | LLLinkBridge |
-// +=================================================+
-// For broken links.
-
-std::string LLLinkFolderBridge::sPrefix("Link: ");
-
-
-LLUIImagePtr LLLinkFolderBridge::getIcon() const
+LLInvFVBridge* LLRecentInventoryBridgeBuilder::createBridge(
+ LLAssetType::EType asset_type,
+ LLAssetType::EType actual_asset_type,
+ LLInventoryType::EType inv_type,
+ LLInventoryPanel* inventory,
+ LLFolderView* root,
+ const LLUUID& uuid,
+ U32 flags /*= 0x00*/ ) const
{
- LLFolderType::EType preferred_type = LLFolderType::FT_NONE;
- if (LLViewerInventoryItem *item = getItem())
+ LLInvFVBridge* new_listener = NULL;
+ switch(asset_type)
{
- if (const LLViewerInventoryCategory* cat = item->getLinkedCategory())
- {
- preferred_type = cat->getPreferredType();
+ case LLAssetType::AT_CATEGORY:
+ if (actual_asset_type == LLAssetType::AT_LINK_FOLDER)
+ {
+ // *TODO: Create a link folder handler instead if it is necessary
+ new_listener = LLInventoryFVBridgeBuilder::createBridge(
+ asset_type,
+ actual_asset_type,
+ inv_type,
+ inventory,
+ root,
+ uuid,
+ flags);
+ break;
}
+ new_listener = new LLRecentItemsFolderBridge(inv_type, inventory, root, uuid);
+ break;
+ default:
+ new_listener = LLInventoryFVBridgeBuilder::createBridge(
+ asset_type,
+ actual_asset_type,
+ inv_type,
+ inventory,
+ root,
+ uuid,
+ flags);
}
- return LLFolderBridge::getIcon(preferred_type);
-}
-
-void LLLinkFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
-{
- // *TODO: Translate
- lldebugs << "LLLink::buildContextMenu()" << llendl;
- menuentry_vec_t items;
- menuentry_vec_t disabled_items;
-
- if (isItemInTrash())
- {
- addTrashContextMenuOptions(items, disabled_items);
- }
- else
- {
- items.push_back(std::string("Find Original"));
- addDeleteContextMenuOptions(items, disabled_items);
- }
- hide_context_entries(menu, items, disabled_items);
-}
+ return new_listener;
-void LLLinkFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
-{
- if ("goto" == action)
- {
- gotoItem(folder);
- return;
- }
- LLItemBridge::performAction(folder,model,action);
}
-void LLLinkFolderBridge::gotoItem(LLFolderView *folder)
-{
- const LLUUID &cat_uuid = getFolderID();
- if (!cat_uuid.isNull())
- {
- if (LLFolderViewItem *base_folder = folder->getItemByID(cat_uuid))
- {
- if (LLInventoryModel* model = getInventoryModel())
- {
- model->fetchDescendentsOf(cat_uuid);
- }
- base_folder->setOpen(TRUE);
- folder->setSelectionFromRoot(base_folder,TRUE);
- folder->scrollToShowSelection();
- }
- }
-}
-const LLUUID &LLLinkFolderBridge::getFolderID() const
-{
- if (LLViewerInventoryItem *link_item = getItem())
- {
- if (const LLViewerInventoryCategory *cat = link_item->getLinkedCategory())
- {
- const LLUUID& cat_uuid = cat->getUUID();
- return cat_uuid;
- }
- }
- return LLUUID::null;
-}
+// EOF
diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h
index 32504091cb..64d0f8d254 100644
--- a/indra/newview/llinventorybridge.h
+++ b/indra/newview/llinventorybridge.h
@@ -44,78 +44,13 @@
class LLInventoryPanel;
class LLInventoryModel;
class LLMenuGL;
-
-enum EInventoryIcon
-{
- TEXTURE_ICON_NAME,
- SOUND_ICON_NAME,
- CALLINGCARD_ONLINE_ICON_NAME,
- CALLINGCARD_OFFLINE_ICON_NAME,
- LANDMARK_ICON_NAME,
- LANDMARK_VISITED_ICON_NAME,
- SCRIPT_ICON_NAME,
- CLOTHING_ICON_NAME,
- OBJECT_ICON_NAME,
- OBJECT_MULTI_ICON_NAME,
- NOTECARD_ICON_NAME,
- BODYPART_ICON_NAME,
- SNAPSHOT_ICON_NAME,
-
- BODYPART_SHAPE_ICON_NAME,
- BODYPART_SKIN_ICON_NAME,
- BODYPART_HAIR_ICON_NAME,
- BODYPART_EYES_ICON_NAME,
- CLOTHING_SHIRT_ICON_NAME,
- CLOTHING_PANTS_ICON_NAME,
- CLOTHING_SHOES_ICON_NAME,
- CLOTHING_SOCKS_ICON_NAME,
- CLOTHING_JACKET_ICON_NAME,
- CLOTHING_GLOVES_ICON_NAME,
- CLOTHING_UNDERSHIRT_ICON_NAME,
- CLOTHING_UNDERPANTS_ICON_NAME,
- CLOTHING_SKIRT_ICON_NAME,
- CLOTHING_ALPHA_ICON_NAME,
- CLOTHING_TATTOO_ICON_NAME,
-
- ANIMATION_ICON_NAME,
- GESTURE_ICON_NAME,
-
- LINKITEM_ICON_NAME,
- LINKFOLDER_ICON_NAME,
-
- ICON_NAME_COUNT
-};
-
-extern std::string ICON_NAME[ICON_NAME_COUNT];
-
-typedef std::pair<LLUUID, LLUUID> two_uuids_t;
-typedef std::list<two_uuids_t> two_uuids_list_t;
-typedef std::pair<LLUUID, two_uuids_list_t> uuid_move_list_t;
-
-struct LLMoveInv
-{
- LLUUID mObjectID;
- LLUUID mCategoryID;
- two_uuids_list_t mMoveList;
- void (*mCallback)(S32, void*);
- void* mUserData;
-};
-
-struct LLAttachmentRezAction
-{
- LLUUID mItemID;
- S32 mAttachPt;
-};
+class LLCallingCardObserver;
+class LLViewerJointAttachment;
typedef std::vector<std::string> menuentry_vec_t;
-const std::string safe_inv_type_lookup(LLInventoryType::EType inv_type);
-void hide_context_entries(LLMenuGL& menu,
- const menuentry_vec_t &entries_to_show,
- const menuentry_vec_t &disabled_entries);
-
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInvFVBridge (& its derived classes)
+// Class LLInvFVBridge
//
// Short for Inventory-Folder-View-Bridge. This is an
// implementation class to be able to view inventory items.
@@ -134,25 +69,31 @@ public:
LLAssetType::EType actual_asset_type,
LLInventoryType::EType inv_type,
LLInventoryPanel* inventory,
+ LLFolderView* root,
const LLUUID& uuid,
U32 flags = 0x00);
virtual ~LLInvFVBridge() {}
- virtual const LLUUID& getUUID() const { return mUUID; }
+ BOOL isInOutfitsSidePanel() const; // allow context menus to be customized for side panel
+ BOOL canShare() const;
+ //--------------------------------------------------------------------
+ // LLInvFVBridge functionality
+ //--------------------------------------------------------------------
+ virtual const LLUUID& getUUID() const { return mUUID; }
+ virtual void clearDisplayName() {}
virtual void restoreItem() {}
virtual void restoreToWorld() {}
- // LLFolderViewEventListener functions
+ //--------------------------------------------------------------------
+ // Inherited LLFolderViewEventListener functions
+ //--------------------------------------------------------------------
virtual const std::string& getName() const;
virtual const std::string& getDisplayName() const;
virtual PermissionMask getPermissionMask() const;
virtual LLFolderType::EType getPreferredType() const;
virtual time_t getCreationDate() const;
- virtual LLFontGL::StyleFlags getLabelStyle() const
- {
- return LLFontGL::NORMAL;
- }
+ virtual LLFontGL::StyleFlags getLabelStyle() const { return LLFontGL::NORMAL; }
virtual std::string getLabelSuffix() const { return LLStringUtil::null; }
virtual void openItem() {}
virtual void closeItem() {}
@@ -163,7 +104,7 @@ public:
virtual BOOL isItemRemovable() const;
virtual BOOL isItemMovable() const;
virtual BOOL isItemInTrash() const;
-
+ virtual BOOL isLink() const;
//virtual BOOL removeItem() = 0;
virtual void removeBatch(LLDynamicArray<LLFolderViewEventListener*>& batch);
virtual void move(LLFolderViewEventListener* new_parent_bridge) {}
@@ -175,19 +116,14 @@ public:
virtual void pasteFromClipboard() {}
virtual void pasteLinkFromClipboard() {}
void getClipboardEntries(bool show_asset_id, menuentry_vec_t &items,
- menuentry_vec_t &disabled_items, U32 flags);
+ menuentry_vec_t &disabled_items, U32 flags);
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const;
virtual BOOL dragOrDrop(MASK mask, BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data) { return FALSE; }
virtual LLInventoryType::EType getInventoryType() const { return mInvType; }
-
- // LLInvFVBridge functionality
- virtual void clearDisplayName() {}
-
- // Allow context menus to be customized for side panel.
- bool isInOutfitsSidePanel() const;
+ virtual LLWearableType::EType getWearableType() const { return LLWearableType::WT_NONE; }
//--------------------------------------------------------------------
// Convenience functions for adding various common menu options.
@@ -197,9 +133,9 @@ protected:
menuentry_vec_t &disabled_items);
virtual void addDeleteContextMenuOptions(menuentry_vec_t &items,
menuentry_vec_t &disabled_items);
-
+ virtual void addOpenRightClickMenuOption(menuentry_vec_t &items);
protected:
- LLInvFVBridge(LLInventoryPanel* inventory, const LLUUID& uuid);
+ LLInvFVBridge(LLInventoryPanel* inventory, LLFolderView* root, const LLUUID& uuid);
LLInventoryObject* getInventoryObject() const;
LLInventoryModel* getInventoryModel() const;
@@ -208,7 +144,7 @@ protected:
BOOL isLinkedObjectMissing() const; // Is this a linked obj whose baseobj is not in inventory?
BOOL isAgentInventory() const; // false if lost or in the inventory library
- BOOL isCOFFolder() const; // true if COF or descendent of.
+ BOOL isCOFFolder() const; // true if COF or descendent of
virtual BOOL isItemPermissive() const;
static void changeItemParent(LLInventoryModel* model,
LLViewerInventoryItem* item,
@@ -221,40 +157,45 @@ protected:
void removeBatchNoCheck(LLDynamicArray<LLFolderViewEventListener*>& batch);
protected:
LLHandle<LLPanel> mInventoryPanel;
+ LLFolderView* mRoot;
const LLUUID mUUID; // item id
LLInventoryType::EType mInvType;
+ BOOL mIsLink;
void purgeItem(LLInventoryModel *model, const LLUUID &uuid);
};
-/**
- * This class intended to build Folder View Bridge via LLInvFVBridge::createBridge.
- * It can be overridden with another way of creation necessary Inventory-Folder-View-Bridge.
- */
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInvFVBridgeBuilder
+//
+// This class intended to build Folder View Bridge via LLInvFVBridge::createBridge.
+// It can be overridden with another way of creation necessary Inventory-Folder-View-Bridge.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLInventoryFVBridgeBuilder
{
public:
- virtual ~LLInventoryFVBridgeBuilder(){}
+ virtual ~LLInventoryFVBridgeBuilder() {}
virtual LLInvFVBridge* createBridge(LLAssetType::EType asset_type,
LLAssetType::EType actual_asset_type,
LLInventoryType::EType inv_type,
LLInventoryPanel* inventory,
+ LLFolderView* root,
const LLUUID& uuid,
U32 flags = 0x00) const;
};
-
class LLItemBridge : public LLInvFVBridge
{
public:
- LLItemBridge(LLInventoryPanel* inventory, const LLUUID& uuid) :
- LLInvFVBridge(inventory, uuid) {}
-
- virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action);
+ LLItemBridge(LLInventoryPanel* inventory,
+ LLFolderView* root,
+ const LLUUID& uuid) :
+ LLInvFVBridge(inventory, root, uuid) {}
+ virtual void performAction(LLInventoryModel* model, std::string action);
virtual void selectItem();
virtual void restoreItem();
virtual void restoreToWorld();
- virtual void gotoItem(LLFolderView *folder);
+ virtual void gotoItem();
virtual LLUIImagePtr getIcon() const;
virtual const std::string& getDisplayName() const;
virtual std::string getLabelSuffix() const;
@@ -269,30 +210,33 @@ public:
virtual BOOL hasChildren() const { return FALSE; }
virtual BOOL isUpToDate() const { return TRUE; }
- // override for LLInvFVBridge
- virtual void clearDisplayName() { mDisplayName.clear(); }
+ /*virtual*/ void clearDisplayName() { mDisplayName.clear(); }
LLViewerInventoryItem* getItem() const;
-
bool isAddAction(std::string action) const;
bool isRemoveAction(std::string action) const;
-
protected:
+ BOOL confirmRemoveItem(const LLSD& notification, const LLSD& response);
virtual BOOL isItemPermissive() const;
static void buildDisplayName(LLInventoryItem* item, std::string& name);
+
mutable std::string mDisplayName;
};
-
class LLFolderBridge : public LLInvFVBridge
{
- friend class LLInvFVBridge;
public:
- BOOL dragItemIntoFolder(LLInventoryItem* inv_item,
- BOOL drop);
- BOOL dragCategoryIntoFolder(LLInventoryCategory* inv_category,
- BOOL drop);
- virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action);
+ LLFolderBridge(LLInventoryPanel* inventory,
+ LLFolderView* root,
+ const LLUUID& uuid) :
+ LLInvFVBridge(inventory, root, uuid),
+ mCallingCards(FALSE),
+ mWearables(FALSE),
+ mMenu(NULL) {}
+ BOOL dragItemIntoFolder(LLInventoryItem* inv_item, BOOL drop);
+ BOOL dragCategoryIntoFolder(LLInventoryCategory* inv_category, BOOL drop);
+
+ virtual void performAction(LLInventoryModel* model, std::string action);
virtual void openItem();
virtual void closeItem();
virtual BOOL isItemRenameable() const;
@@ -326,23 +270,16 @@ public:
virtual BOOL isClipboardPasteableAsLink() const;
virtual BOOL copyToClipboard() const;
- static void createWearable(LLFolderBridge* bridge, EWearableType type);
- static void createWearable(const LLUUID &parent_folder_id, EWearableType type);
+ static void createWearable(LLFolderBridge* bridge, LLWearableType::EType type);
LLViewerInventoryCategory* getCategory() const;
protected:
- LLFolderBridge(LLInventoryPanel* inventory, const LLUUID& uuid)
- : LLInvFVBridge(inventory, uuid),
-
- mCallingCards(FALSE),
- mWearables(FALSE),
- mMenu(NULL) {}
-
- // menu callbacks
+ //--------------------------------------------------------------------
+ // Menu callbacks
+ //--------------------------------------------------------------------
static void pasteClipboard(void* user_data);
static void createNewCategory(void* user_data);
-
static void createNewShirt(void* user_data);
static void createNewPants(void* user_data);
static void createNewShoes(void* user_data);
@@ -358,15 +295,21 @@ protected:
static void createNewEyes(void* user_data);
BOOL checkFolderForContentsOfType(LLInventoryModel* model, LLInventoryCollectFunctor& typeToCheck);
- BOOL areAnyContentsWorn(LLInventoryModel* model) const;
void modifyOutfit(BOOL append);
void determineFolderType();
+ menuentry_vec_t getMenuItems() { return mItems; } // returns a copy of current menu items
+
+
+ //--------------------------------------------------------------------
+ // Messy hacks for handling folder options
+ //--------------------------------------------------------------------
public:
static LLFolderBridge* sSelf;
static void staticFolderOptionsMenu();
void folderOptionsMenu();
+
private:
BOOL mCallingCards;
BOOL mWearables;
@@ -375,206 +318,160 @@ private:
menuentry_vec_t mDisabledItems;
};
-// DEPRECATED
-class LLScriptBridge : public LLItemBridge
-{
- friend class LLInvFVBridge;
-public:
- LLUIImagePtr getIcon() const;
-
-protected:
- LLScriptBridge( LLInventoryPanel* inventory, const LLUUID& uuid ) :
- LLItemBridge(inventory, uuid) {}
-};
-
-
class LLTextureBridge : public LLItemBridge
{
- friend class LLInvFVBridge;
public:
+ LLTextureBridge(LLInventoryPanel* inventory,
+ LLFolderView* root,
+ const LLUUID& uuid,
+ LLInventoryType::EType type) :
+ LLItemBridge(inventory, root, uuid)
+ {
+ mInvType = type;
+ }
virtual LLUIImagePtr getIcon() const;
virtual void openItem();
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
- virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action);
-
-protected:
- LLTextureBridge(LLInventoryPanel* inventory, const LLUUID& uuid, LLInventoryType::EType type) :
- LLItemBridge(inventory, uuid), mInvType(type) {}
+ virtual void performAction(LLInventoryModel* model, std::string action);
bool canSaveTexture(void);
- LLInventoryType::EType mInvType;
};
class LLSoundBridge : public LLItemBridge
{
- friend class LLInvFVBridge;
public:
- virtual LLUIImagePtr getIcon() const;
+ LLSoundBridge(LLInventoryPanel* inventory,
+ LLFolderView* root,
+ const LLUUID& uuid) :
+ LLItemBridge(inventory, root, uuid) {}
virtual void openItem();
virtual void previewItem();
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
static void openSoundPreview(void*);
-
-protected:
- LLSoundBridge(LLInventoryPanel* inventory, const LLUUID& uuid) :
- LLItemBridge(inventory, uuid) {}
};
class LLLandmarkBridge : public LLItemBridge
{
- friend class LLInvFVBridge;
public:
- virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action);
+ LLLandmarkBridge(LLInventoryPanel* inventory,
+ LLFolderView* root,
+ const LLUUID& uuid,
+ U32 flags = 0x00);
+ virtual void performAction(LLInventoryModel* model, std::string action);
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
virtual LLUIImagePtr getIcon() const;
virtual void openItem();
-
-protected:
- LLLandmarkBridge(LLInventoryPanel* inventory, const LLUUID& uuid, U32 flags = 0x00);
-
protected:
BOOL mVisited;
};
-class LLCallingCardBridge;
-
-class LLCallingCardObserver : public LLFriendObserver
-{
-public:
- LLCallingCardObserver(LLCallingCardBridge* bridge) : mBridgep(bridge) {}
- virtual ~LLCallingCardObserver() { mBridgep = NULL; }
- virtual void changed(U32 mask);
-
-protected:
- LLCallingCardBridge* mBridgep;
-};
-
class LLCallingCardBridge : public LLItemBridge
{
- friend class LLInvFVBridge;
public:
+ LLCallingCardBridge(LLInventoryPanel* inventory,
+ LLFolderView* folder,
+ const LLUUID& uuid );
+ ~LLCallingCardBridge();
virtual std::string getLabelSuffix() const;
//virtual const std::string& getDisplayName() const;
virtual LLUIImagePtr getIcon() const;
- virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action);
+ virtual void performAction(LLInventoryModel* model, std::string action);
virtual void openItem();
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
- //virtual void renameItem(const std::string& new_name);
- //virtual BOOL removeItem();
virtual BOOL dragOrDrop(MASK mask, BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data);
void refreshFolderViewItem();
-
-protected:
- LLCallingCardBridge( LLInventoryPanel* inventory, const LLUUID& uuid );
- ~LLCallingCardBridge();
-
protected:
LLCallingCardObserver* mObserver;
};
-
class LLNotecardBridge : public LLItemBridge
{
- friend class LLInvFVBridge;
public:
- virtual LLUIImagePtr getIcon() const;
+ LLNotecardBridge(LLInventoryPanel* inventory,
+ LLFolderView* root,
+ const LLUUID& uuid) :
+ LLItemBridge(inventory, root, uuid) {}
virtual void openItem();
-
-protected:
- LLNotecardBridge(LLInventoryPanel* inventory, const LLUUID& uuid) :
- LLItemBridge(inventory, uuid) {}
};
class LLGestureBridge : public LLItemBridge
{
- friend class LLInvFVBridge;
public:
- virtual LLUIImagePtr getIcon() const;
-
+ LLGestureBridge(LLInventoryPanel* inventory,
+ LLFolderView* root,
+ const LLUUID& uuid) :
+ LLItemBridge(inventory, root, uuid) {}
// Only suffix for gesture items, not task items, because only
// gestures in your inventory can be active.
virtual LLFontGL::StyleFlags getLabelStyle() const;
virtual std::string getLabelSuffix() const;
-
- virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action);
+ virtual void performAction(LLInventoryModel* model, std::string action);
virtual void openItem();
virtual BOOL removeItem();
-
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
-
static void playGesture(const LLUUID& item_id);
-
-protected:
- LLGestureBridge(LLInventoryPanel* inventory, const LLUUID& uuid)
- : LLItemBridge(inventory, uuid) {}
};
-
class LLAnimationBridge : public LLItemBridge
{
- friend class LLInvFVBridge;
public:
- virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action);
+ LLAnimationBridge(LLInventoryPanel* inventory,
+ LLFolderView* root,
+ const LLUUID& uuid) :
+ LLItemBridge(inventory, root, uuid) {}
+ virtual void performAction(LLInventoryModel* model, std::string action);
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
-
- virtual LLUIImagePtr getIcon() const;
virtual void openItem();
-
-protected:
- LLAnimationBridge(LLInventoryPanel* inventory, const LLUUID& uuid) :
- LLItemBridge(inventory, uuid) {}
};
-
class LLObjectBridge : public LLItemBridge
{
- friend class LLInvFVBridge;
public:
+ LLObjectBridge(LLInventoryPanel* inventory,
+ LLFolderView* root,
+ const LLUUID& uuid,
+ LLInventoryType::EType type,
+ U32 flags);
virtual LLUIImagePtr getIcon() const;
- virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action);
+ virtual void performAction(LLInventoryModel* model, std::string action);
virtual void openItem();
- virtual LLFontGL::StyleFlags getLabelStyle() const;
virtual std::string getLabelSuffix() const;
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
virtual BOOL renameItem(const std::string& new_name);
-
LLInventoryObject* getObject() const;
-
-protected:
- LLObjectBridge(LLInventoryPanel* inventory, const LLUUID& uuid, LLInventoryType::EType type, U32 flags);
-
protected:
- static LLUUID sContextMenuItemID; // Only valid while the context menu is open.
- LLInventoryType::EType mInvType;
+ static LLUUID sContextMenuItemID; // Only valid while the context menu is open.
U32 mAttachPt;
BOOL mIsMultiObject;
};
-
class LLLSLTextBridge : public LLItemBridge
{
- friend class LLInvFVBridge;
public:
- virtual LLUIImagePtr getIcon() const;
+ LLLSLTextBridge(LLInventoryPanel* inventory,
+ LLFolderView* root,
+ const LLUUID& uuid ) :
+ LLItemBridge(inventory, root, uuid) {}
virtual void openItem();
-
-protected:
- LLLSLTextBridge( LLInventoryPanel* inventory, const LLUUID& uuid ) :
- LLItemBridge(inventory, uuid) {}
};
-
class LLWearableBridge : public LLItemBridge
{
- friend class LLInvFVBridge;
public:
+ LLWearableBridge(LLInventoryPanel* inventory,
+ LLFolderView* root,
+ const LLUUID& uuid,
+ LLAssetType::EType asset_type,
+ LLInventoryType::EType inv_type,
+ LLWearableType::EType wearable_type);
virtual LLUIImagePtr getIcon() const;
- virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action);
+ virtual void performAction(LLInventoryModel* model, std::string action);
virtual void openItem();
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
virtual std::string getLabelSuffix() const;
virtual BOOL renameItem(const std::string& new_name);
+ virtual LLWearableType::EType getWearableType() const { return mWearableType; }
static void onWearOnAvatar( void* userdata ); // Access to wearOnAvatar() from menu
static BOOL canWearOnAvatar( void* userdata );
@@ -594,61 +491,43 @@ public:
static void removeItemFromAvatar(LLViewerInventoryItem *item);
static void removeAllClothesFromAvatar();
void removeFromAvatar();
-
-protected:
- LLWearableBridge(LLInventoryPanel* inventory, const LLUUID& uuid, LLAssetType::EType asset_type, LLInventoryType::EType inv_type, EWearableType wearable_type) :
- LLItemBridge(inventory, uuid),
- mAssetType( asset_type ),
- mInvType(inv_type),
- mWearableType(wearable_type)
- {}
-
protected:
LLAssetType::EType mAssetType;
- LLInventoryType::EType mInvType;
- EWearableType mWearableType;
+ LLWearableType::EType mWearableType;
};
class LLLinkItemBridge : public LLItemBridge
{
- friend class LLInvFVBridge;
public:
+ LLLinkItemBridge(LLInventoryPanel* inventory,
+ LLFolderView* root,
+ const LLUUID& uuid) :
+ LLItemBridge(inventory, root, uuid) {}
virtual const std::string& getPrefix() { return sPrefix; }
-
- virtual LLUIImagePtr getIcon() const;
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
-
-protected:
- LLLinkItemBridge(LLInventoryPanel* inventory, const LLUUID& uuid) :
- LLItemBridge(inventory, uuid) {}
-
protected:
static std::string sPrefix;
};
-
class LLLinkFolderBridge : public LLItemBridge
{
- friend class LLInvFVBridge;
public:
+ LLLinkFolderBridge(LLInventoryPanel* inventory,
+ LLFolderView* root,
+ const LLUUID& uuid) :
+ LLItemBridge(inventory, root, uuid) {}
virtual const std::string& getPrefix() { return sPrefix; }
-
virtual LLUIImagePtr getIcon() const;
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
- virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action);
- virtual void gotoItem(LLFolderView *folder);
-
+ virtual void performAction(LLInventoryModel* model, std::string action);
+ virtual void gotoItem();
protected:
- LLLinkFolderBridge(LLInventoryPanel* inventory, const LLUUID& uuid) :
- LLItemBridge(inventory, uuid) {}
const LLUUID &getFolderID() const;
-
-protected:
static std::string sPrefix;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInvFVBridgeAction (& its derived classes)
+// Class LLInvFVBridgeAction
//
// This is an implementation class to be able to
// perform action to view inventory items.
@@ -658,159 +537,63 @@ class LLInvFVBridgeAction
{
public:
// This method is a convenience function which creates the correct
- // type of bridge action based on some basic information
+ // type of bridge action based on some basic information.
static LLInvFVBridgeAction* createAction(LLAssetType::EType asset_type,
- const LLUUID& uuid,LLInventoryModel* model);
-
+ const LLUUID& uuid,
+ LLInventoryModel* model);
static void doAction(LLAssetType::EType asset_type,
const LLUUID& uuid, LLInventoryModel* model);
static void doAction(const LLUUID& uuid, LLInventoryModel* model);
- virtual void doIt() { };
- virtual ~LLInvFVBridgeAction(){}//need this because of warning on OSX
+ virtual void doIt() {};
+ virtual ~LLInvFVBridgeAction() {} // need this because of warning on OSX
protected:
- LLInvFVBridgeAction(const LLUUID& id,LLInventoryModel* model):mUUID(id),mModel(model){}
-
+ LLInvFVBridgeAction(const LLUUID& id, LLInventoryModel* model) :
+ mUUID(id), mModel(model) {}
LLViewerInventoryItem* getItem() const;
protected:
- const LLUUID& mUUID; // item id
+ const LLUUID& mUUID; // item id
LLInventoryModel* mModel;
-
-};
-
-
-
-class LLTextureBridgeAction: public LLInvFVBridgeAction
-{
- friend class LLInvFVBridgeAction;
-public:
- virtual void doIt() ;
- virtual ~LLTextureBridgeAction(){}
-protected:
- LLTextureBridgeAction(const LLUUID& id,LLInventoryModel* model):LLInvFVBridgeAction(id,model){}
-
-};
-
-
-class LLSoundBridgeAction: public LLInvFVBridgeAction
-{
- friend class LLInvFVBridgeAction;
-public:
- virtual void doIt() ;
- virtual ~LLSoundBridgeAction(){}
-protected:
- LLSoundBridgeAction(const LLUUID& id,LLInventoryModel* model):LLInvFVBridgeAction(id,model){}
-
-};
-
-
-class LLLandmarkBridgeAction: public LLInvFVBridgeAction
-{
- friend class LLInvFVBridgeAction;
-public:
- virtual void doIt() ;
- virtual ~LLLandmarkBridgeAction(){}
-protected:
- LLLandmarkBridgeAction(const LLUUID& id,LLInventoryModel* model):LLInvFVBridgeAction(id,model){}
-
-};
-
-
-class LLCallingCardBridgeAction: public LLInvFVBridgeAction
-{
- friend class LLInvFVBridgeAction;
-public:
- virtual void doIt() ;
- virtual ~LLCallingCardBridgeAction(){}
-protected:
- LLCallingCardBridgeAction(const LLUUID& id,LLInventoryModel* model):LLInvFVBridgeAction(id,model){}
-
-};
-
-
-class LLNotecardBridgeAction: public LLInvFVBridgeAction
-{
- friend class LLInvFVBridgeAction;
-public:
- virtual void doIt() ;
- virtual ~LLNotecardBridgeAction(){}
-protected:
- LLNotecardBridgeAction(const LLUUID& id,LLInventoryModel* model):LLInvFVBridgeAction(id,model){}
-
-};
-
-
-class LLGestureBridgeAction: public LLInvFVBridgeAction
-{
- friend class LLInvFVBridgeAction;
-public:
- virtual void doIt() ;
- virtual ~LLGestureBridgeAction(){}
-protected:
- LLGestureBridgeAction(const LLUUID& id,LLInventoryModel* model):LLInvFVBridgeAction(id,model){}
-
-};
-
-
-class LLAnimationBridgeAction: public LLInvFVBridgeAction
-{
- friend class LLInvFVBridgeAction;
-public:
- virtual void doIt() ;
- virtual ~LLAnimationBridgeAction(){}
-protected:
- LLAnimationBridgeAction(const LLUUID& id,LLInventoryModel* model):LLInvFVBridgeAction(id,model){}
-
-};
-
-
-class LLObjectBridgeAction: public LLInvFVBridgeAction
-{
- friend class LLInvFVBridgeAction;
-public:
- virtual void doIt() ;
- virtual ~LLObjectBridgeAction(){}
-protected:
- LLObjectBridgeAction(const LLUUID& id,LLInventoryModel* model):LLInvFVBridgeAction(id,model){}
-
};
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Recent Inventory Panel related classes
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLLSLTextBridgeAction: public LLInvFVBridgeAction
+// Overridden version of the Inventory-Folder-View-Bridge for Folders
+class LLRecentItemsFolderBridge : public LLFolderBridge
{
- friend class LLInvFVBridgeAction;
public:
- virtual void doIt() ;
- virtual ~LLLSLTextBridgeAction(){}
-protected:
- LLLSLTextBridgeAction(const LLUUID& id,LLInventoryModel* model):LLInvFVBridgeAction(id,model){}
-
+ // Creates context menu for Folders related to Recent Inventory Panel.
+ // Uses base logic and than removes from visible items "New..." menu items.
+ LLRecentItemsFolderBridge(LLInventoryType::EType type,
+ LLInventoryPanel* inventory,
+ LLFolderView* root,
+ const LLUUID& uuid) :
+ LLFolderBridge(inventory, root, uuid)
+ {
+ mInvType = type;
+ }
+ /*virtual*/ void buildContextMenu(LLMenuGL& menu, U32 flags);
};
-
-class LLWearableBridgeAction: public LLInvFVBridgeAction
+// Bridge builder to create Inventory-Folder-View-Bridge for Recent Inventory Panel
+class LLRecentInventoryBridgeBuilder : public LLInventoryFVBridgeBuilder
{
- friend class LLInvFVBridgeAction;
public:
- virtual void doIt();
- virtual ~LLWearableBridgeAction(){}
-protected:
- LLWearableBridgeAction(const LLUUID& id,LLInventoryModel* model):LLInvFVBridgeAction(id,model){}
-
-
- BOOL isItemInTrash() const;
- // return true if the item is in agent inventory. if false, it
- // must be lost or in the inventory library.
- BOOL isAgentInventory() const;
-
- void wearOnAvatar();
-
+ // Overrides FolderBridge for Recent Inventory Panel.
+ // It use base functionality for bridges other than FolderBridge.
+ virtual LLInvFVBridge* createBridge(LLAssetType::EType asset_type,
+ LLAssetType::EType actual_asset_type,
+ LLInventoryType::EType inv_type,
+ LLInventoryPanel* inventory,
+ LLFolderView* root,
+ const LLUUID& uuid,
+ U32 flags = 0x00) const;
};
-void wear_inventory_item_on_avatar(LLInventoryItem* item);
-
-class LLViewerJointAttachment;
-void rez_attachment(LLViewerInventoryItem* item, LLViewerJointAttachment* attachment);
+void rez_attachment(LLViewerInventoryItem* item,
+ LLViewerJointAttachment* attachment);
// Move items from an in-world object's "Contents" folder to a specified
// folder in agent inventory.
@@ -820,13 +603,9 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id,
void (*callback)(S32, void*) = NULL,
void* user_data = NULL);
-
-
-void teleport_via_landmark(const LLUUID& asset_id);
-
// Utility function to hide all entries except those in the list
void hide_context_entries(LLMenuGL& menu,
- const menuentry_vec_t &entries_to_show,
- const menuentry_vec_t &disabled_entries);
+ const menuentry_vec_t &entries_to_show,
+ const menuentry_vec_t &disabled_entries);
#endif // LL_LLINVENTORYBRIDGE_H
diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index cd20d64ca8..6e829f2dc2 100644
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -37,9 +37,11 @@
// viewer includes
#include "llfoldervieweventlistener.h"
#include "llfolderviewitem.h"
-#include "llinventorymodel.h" // gInventory.backgroundFetchActive()
+#include "llinventorymodel.h"
+#include "llinventorymodelbackgroundfetch.h"
#include "llviewercontrol.h"
#include "llfolderview.h"
+#include "llinventorybridge.h"
// linden library includes
#include "lltrans.h"
@@ -47,13 +49,15 @@
LLInventoryFilter::FilterOps::FilterOps() :
mFilterObjectTypes(0xffffffffffffffffULL),
mFilterCategoryTypes(0xffffffffffffffffULL),
+ mFilterWearableTypes(0xffffffffffffffffULL),
mMinDate(time_min()),
mMaxDate(time_max()),
mHoursAgo(0),
mShowFolderState(SHOW_NON_EMPTY_FOLDERS),
mPermissions(PERM_NONE),
mFilterTypes(FILTERTYPE_OBJECT),
- mFilterUUID(LLUUID::null)
+ mFilterUUID(LLUUID::null),
+ mIncludeLinks(TRUE)
{
}
@@ -96,23 +100,23 @@ BOOL LLInventoryFilter::check(const LLFolderViewItem* item)
return TRUE;
}
- const LLFolderViewEventListener* listener = item->getListener();
mSubStringMatchOffset = mFilterSubString.size() ? item->getSearchableLabel().find(mFilterSubString) : std::string::npos;
const BOOL passed_filtertype = checkAgainstFilterType(item);
- const BOOL passed = passed_filtertype &&
- (mFilterSubString.size() == 0 || mSubStringMatchOffset != std::string::npos) &&
- ((listener->getPermissionMask() & mFilterOps.mPermissions) == mFilterOps.mPermissions);
+ const BOOL passed_permissions = checkAgainstPermissions(item);
+ const BOOL passed = (passed_filtertype &&
+ passed_permissions &&
+ (mFilterSubString.size() == 0 || mSubStringMatchOffset != std::string::npos));
return passed;
}
-BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item)
+BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item) const
{
const LLFolderViewEventListener* listener = item->getListener();
if (!listener) return FALSE;
- const LLInventoryType::EType object_type = listener->getInventoryType();
+ LLInventoryType::EType object_type = listener->getInventoryType();
const LLUUID object_id = listener->getUUID();
const LLInventoryObject *object = gInventory.getObject(object_id);
@@ -127,15 +131,15 @@ BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item)
if (object_type == LLInventoryType::IT_NONE)
{
if (object && object->getIsLinkType())
+ {
return FALSE;
+ }
}
else if ((1LL << object_type & mFilterOps.mFilterObjectTypes) == U64(0))
{
return FALSE;
}
}
- //
- ////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
@@ -159,8 +163,6 @@ BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item)
if ((1LL << cat->getPreferredType() & mFilterOps.mFilterCategoryTypes) == U64(0))
return FALSE;
}
- //
- ////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
@@ -173,8 +175,6 @@ BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item)
if (object->getLinkedUUID() != mFilterOps.mFilterUUID)
return FALSE;
}
- //
- ////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
@@ -196,12 +196,38 @@ BOOL LLInventoryFilter::checkAgainstFilterType(const LLFolderViewItem* item)
listener->getCreationDate() > mFilterOps.mMaxDate)
return FALSE;
}
- //
+
////////////////////////////////////////////////////////////////////////////////
+ // FILTERTYPE_WEARABLE
+ // Pass if this item is a wearable of the appropriate type
+ if (filterTypes & FILTERTYPE_WEARABLE)
+ {
+ LLWearableType::EType type = listener->getWearableType();
+ if ((0x1LL << type & mFilterOps.mFilterWearableTypes) == 0)
+ {
+ return FALSE;
+ }
+ }
return TRUE;
}
+BOOL LLInventoryFilter::checkAgainstPermissions(const LLFolderViewItem* item) const
+{
+ const LLFolderViewEventListener* listener = item->getListener();
+ if (!listener) return FALSE;
+
+ PermissionMask perm = listener->getPermissionMask();
+ const LLInvFVBridge *bridge = dynamic_cast<const LLInvFVBridge *>(item->getListener());
+ if (bridge && bridge->isLink())
+ {
+ const LLUUID& linked_uuid = gInventory.getLinkedItemID(bridge->getUUID());
+ const LLViewerInventoryItem *linked_item = gInventory.getItem(linked_uuid);
+ if (linked_item)
+ perm = linked_item->getPermissionMask();
+ }
+ return (perm & mFilterOps.mPermissions) == mFilterOps.mPermissions;
+}
const std::string& LLInventoryFilter::getFilterSubString(BOOL trim) const
{
@@ -217,6 +243,8 @@ std::string::size_type LLInventoryFilter::getStringMatchOffset() const
BOOL LLInventoryFilter::isNotDefault() const
{
return mFilterOps.mFilterObjectTypes != mDefaultFilterOps.mFilterObjectTypes
+ || mFilterOps.mFilterCategoryTypes != mDefaultFilterOps.mFilterCategoryTypes
+ || mFilterOps.mFilterWearableTypes != mDefaultFilterOps.mFilterWearableTypes
|| mFilterOps.mFilterTypes != FILTERTYPE_OBJECT
|| mFilterSubString.size()
|| mFilterOps.mPermissions != mDefaultFilterOps.mPermissions
@@ -228,6 +256,8 @@ BOOL LLInventoryFilter::isNotDefault() const
BOOL LLInventoryFilter::isActive() const
{
return mFilterOps.mFilterObjectTypes != 0xffffffffffffffffULL
+ || mFilterOps.mFilterCategoryTypes != 0xffffffffffffffffULL
+ || mFilterOps.mFilterWearableTypes != 0xffffffffffffffffULL
|| mFilterOps.mFilterTypes != FILTERTYPE_OBJECT
|| mFilterSubString.size()
|| mFilterOps.mPermissions != PERM_NONE
@@ -301,7 +331,35 @@ void LLInventoryFilter::setFilterCategoryTypes(U64 types)
setModified(FILTER_MORE_RESTRICTIVE);
}
}
- mFilterOps.mFilterTypes |= FILTERTYPE_CATEGORY;
+ mFilterOps.mFilterTypes |= FILTERTYPE_OBJECT;
+}
+
+void LLInventoryFilter::setFilterWearableTypes(U64 types)
+{
+ if (mFilterOps.mFilterWearableTypes != types)
+ {
+ // keep current items only if no type bits getting turned off
+ BOOL fewer_bits_set = (mFilterOps.mFilterWearableTypes & ~types);
+ BOOL more_bits_set = (~mFilterOps.mFilterWearableTypes & types);
+
+ mFilterOps.mFilterWearableTypes = types;
+ if (more_bits_set && fewer_bits_set)
+ {
+ // neither less or more restrive, both simultaneously
+ // so we need to filter from scratch
+ setModified(FILTER_RESTART);
+ }
+ else if (more_bits_set)
+ {
+ // target is only one of all requested types so more type bits == less restrictive
+ setModified(FILTER_LESS_RESTRICTIVE);
+ }
+ else if (fewer_bits_set)
+ {
+ setModified(FILTER_MORE_RESTRICTIVE);
+ }
+ }
+ mFilterOps.mFilterTypes |= FILTERTYPE_WEARABLE;
}
void LLInventoryFilter::setFilterUUID(const LLUUID& object_id)
@@ -328,9 +386,10 @@ void LLInventoryFilter::setFilterSubString(const std::string& string)
// appending new characters
const BOOL more_restrictive = mFilterSubString.size() < string.size() && !string.substr(0, mFilterSubString.size()).compare(mFilterSubString);
- mFilterSubString = string;
+ mFilterSubStringOrig = string;
+ LLStringUtil::trimHead(mFilterSubStringOrig);
+ mFilterSubString = mFilterSubStringOrig;
LLStringUtil::toUpper(mFilterSubString);
- LLStringUtil::trimHead(mFilterSubString);
if (less_restrictive)
{
setModified(FILTER_LESS_RESTRICTIVE);
@@ -449,6 +508,18 @@ void LLInventoryFilter::setHoursAgo(U32 hours)
mFilterOps.mFilterTypes |= FILTERTYPE_DATE;
}
+void LLInventoryFilter::setIncludeLinks(BOOL include_links)
+{
+ if (mFilterOps.mIncludeLinks != include_links)
+ {
+ if (!mFilterOps.mIncludeLinks)
+ setModified(FILTER_LESS_RESTRICTIVE);
+ else
+ setModified(FILTER_MORE_RESTRICTIVE);
+ }
+ mFilterOps.mIncludeLinks = include_links;
+}
+
void LLInventoryFilter::setShowFolderState(EFolderShow state)
{
if (mFilterOps.mShowFolderState != state)
@@ -713,7 +784,7 @@ const std::string& LLInventoryFilter::getFilterText()
filtered_by_all_types = FALSE;
}
- if (!gInventory.backgroundFetchActive()
+ if (!LLInventoryModelBackgroundFetch::instance().backgroundFetchActive()
&& filtered_by_type
&& !filtered_by_all_types)
{
@@ -824,6 +895,10 @@ U32 LLInventoryFilter::getHoursAgo() const
{
return mFilterOps.mHoursAgo;
}
+BOOL LLInventoryFilter::getIncludeLinks() const
+{
+ return mFilterOps.mIncludeLinks;
+}
LLInventoryFilter::EFolderShow LLInventoryFilter::getShowFolderState() const
{
return mFilterOps.mShowFolderState;
diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h
index b01554edc8..f740a6b333 100644
--- a/indra/newview/llinventoryfilter.h
+++ b/indra/newview/llinventoryfilter.h
@@ -59,10 +59,11 @@ public:
enum EFilterType
{
FILTERTYPE_NONE = 0,
- FILTERTYPE_OBJECT = 1, // normal default search-by-object-type
- FILTERTYPE_CATEGORY = 2, // search by folder type
- FILTERTYPE_UUID = 4, // find the object with UUID and any links to it
- FILTERTYPE_DATE = 8 // search by date range
+ FILTERTYPE_OBJECT = 0x1 << 0, // normal default search-by-object-type
+ FILTERTYPE_CATEGORY = 0x1 << 1, // search by folder type
+ FILTERTYPE_UUID = 0x1 << 2, // find the object with UUID and any links to it
+ FILTERTYPE_DATE = 0x1 << 3, // search by date range
+ FILTERTYPE_WEARABLE = 0x1 << 4 // search by wearable type
};
// REFACTOR: Change this to an enum.
@@ -81,9 +82,11 @@ public:
BOOL isFilterObjectTypesWith(LLInventoryType::EType t) const;
void setFilterCategoryTypes(U64 types);
void setFilterUUID(const LLUUID &object_id);
+ void setFilterWearableTypes(U64 types);
void setFilterSubString(const std::string& string);
const std::string& getFilterSubString(BOOL trim = FALSE) const;
+ const std::string& getFilterSubStringOrig() const { return mFilterSubStringOrig; }
BOOL hasFilterString() const;
void setFilterPermissions(PermissionMask perms);
@@ -97,11 +100,15 @@ public:
void setHoursAgo(U32 hours);
U32 getHoursAgo() const;
+ void setIncludeLinks(BOOL include_links);
+ BOOL getIncludeLinks() const;
+
// +-------------------------------------------------------------------+
// + Execution And Results
// +-------------------------------------------------------------------+
BOOL check(const LLFolderViewItem* item);
- BOOL checkAgainstFilterType(const LLFolderViewItem* item);
+ BOOL checkAgainstFilterType(const LLFolderViewItem* item) const;
+ BOOL checkAgainstPermissions(const LLFolderViewItem* item) const;
std::string::size_type getStringMatchOffset() const;
// +-------------------------------------------------------------------+
@@ -163,6 +170,7 @@ private:
U32 mFilterTypes;
U64 mFilterObjectTypes; // For _OBJECT
+ U64 mFilterWearableTypes;
U64 mFilterCategoryTypes; // For _CATEGORY
LLUUID mFilterUUID; // for UUID
@@ -171,6 +179,7 @@ private:
U32 mHoursAgo;
EFolderShow mShowFolderState;
PermissionMask mPermissions;
+ BOOL mIncludeLinks;
};
U32 mOrder;
@@ -181,6 +190,7 @@ private:
std::string::size_type mSubStringMatchOffset;
std::string mFilterSubString;
+ std::string mFilterSubStringOrig;
const std::string mName;
S32 mFilterGeneration;
diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp
index 33623539e9..37088064c6 100644
--- a/indra/newview/llinventoryfunctions.cpp
+++ b/indra/newview/llinventoryfunctions.cpp
@@ -1,5 +1,5 @@
/**
- * @file llfloaterinventory.cpp
+ * @file llinventoryfunctions.cpp
* @brief Implementation of the inventory view and associated stuff.
*
* $LicenseInfo:firstyear=2001&license=viewergpl$
@@ -41,6 +41,7 @@
#include "llagentwearables.h"
#include "llcallingcard.h"
#include "llfloaterreg.h"
+#include "llinventorydefines.h"
#include "llsdserialize.h"
#include "llfiltereditor.h"
#include "llspinctrl.h"
@@ -51,7 +52,7 @@
#include "llappearancemgr.h"
#include "llappviewer.h"
//#include "llfirstuse.h"
-#include "llfloatercustomize.h"
+#include "llfloaterinventory.h"
#include "llfocusmgr.h"
#include "llfolderview.h"
#include "llgesturemgr.h"
@@ -63,6 +64,7 @@
#include "llinventorypanel.h"
#include "lllineeditor.h"
#include "llmenugl.h"
+#include "llpanelmaininventory.h"
#include "llpreviewanim.h"
#include "llpreviewgesture.h"
#include "llpreviewnotecard.h"
@@ -73,6 +75,8 @@
#include "llscrollbar.h"
#include "llscrollcontainer.h"
#include "llselectmgr.h"
+#include "llsidetray.h"
+#include "llsidepanelinventory.h"
#include "lltabcontainer.h"
#include "lltooldraganddrop.h"
#include "lluictrlfactory.h"
@@ -86,6 +90,572 @@
BOOL LLInventoryState::sWearNewClothing = FALSE;
LLUUID LLInventoryState::sWearNewClothingTransactionID;
+// Generates a string containing the path to the item specified by
+// item_id.
+void append_path(const LLUUID& id, std::string& path)
+{
+ std::string temp;
+ const LLInventoryObject* obj = gInventory.getObject(id);
+ LLUUID parent_id;
+ if(obj) parent_id = obj->getParentUUID();
+ std::string forward_slash("/");
+ while(obj)
+ {
+ obj = gInventory.getCategory(parent_id);
+ if(obj)
+ {
+ temp.assign(forward_slash + obj->getName() + temp);
+ parent_id = obj->getParentUUID();
+ }
+ }
+ path.append(temp);
+}
+
+void change_item_parent(LLInventoryModel* model,
+ LLViewerInventoryItem* item,
+ const LLUUID& new_parent_id,
+ BOOL restamp)
+{
+ if (item->getParentUUID() != new_parent_id)
+ {
+ LLInventoryModel::update_list_t update;
+ LLInventoryModel::LLCategoryUpdate old_folder(item->getParentUUID(),-1);
+ update.push_back(old_folder);
+ LLInventoryModel::LLCategoryUpdate new_folder(new_parent_id, 1);
+ update.push_back(new_folder);
+ gInventory.accountForUpdate(update);
+
+ LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
+ new_item->setParent(new_parent_id);
+ new_item->updateParentOnServer(restamp);
+ model->updateItem(new_item);
+ model->notifyObservers();
+ }
+}
+
+void change_category_parent(LLInventoryModel* model,
+ LLViewerInventoryCategory* cat,
+ const LLUUID& new_parent_id,
+ BOOL restamp)
+{
+ if (!model || !cat)
+ {
+ return;
+ }
+
+ // Can't move a folder into a child of itself.
+ if (model->isObjectDescendentOf(new_parent_id, cat->getUUID()))
+ {
+ return;
+ }
+
+ LLInventoryModel::update_list_t update;
+ LLInventoryModel::LLCategoryUpdate old_folder(cat->getParentUUID(), -1);
+ update.push_back(old_folder);
+ LLInventoryModel::LLCategoryUpdate new_folder(new_parent_id, 1);
+ update.push_back(new_folder);
+ model->accountForUpdate(update);
+
+ LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat);
+ new_cat->setParent(new_parent_id);
+ new_cat->updateParentOnServer(restamp);
+ model->updateCategory(new_cat);
+ model->notifyObservers();
+}
+
+void remove_category(LLInventoryModel* model, const LLUUID& cat_id)
+{
+ if (!model || !get_is_category_removable(model, cat_id))
+ {
+ return;
+ }
+
+ // Look for any gestures and deactivate them
+ LLInventoryModel::cat_array_t descendent_categories;
+ LLInventoryModel::item_array_t descendent_items;
+ gInventory.collectDescendents(cat_id, descendent_categories, descendent_items, FALSE);
+
+ for (LLInventoryModel::item_array_t::const_iterator iter = descendent_items.begin();
+ iter != descendent_items.end();
+ ++iter)
+ {
+ const LLViewerInventoryItem* item = (*iter);
+ const LLUUID& item_id = item->getUUID();
+ if (item->getType() == LLAssetType::AT_GESTURE
+ && LLGestureMgr::instance().isGestureActive(item_id))
+ {
+ LLGestureMgr::instance().deactivateGesture(item_id);
+ }
+ }
+
+ LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id);
+ if (cat)
+ {
+ const LLUUID trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
+ change_category_parent(model, cat, trash_id, TRUE);
+ }
+}
+
+void rename_category(LLInventoryModel* model, const LLUUID& cat_id, const std::string& new_name)
+{
+ LLViewerInventoryCategory* cat;
+
+ if (!model ||
+ !get_is_category_renameable(model, cat_id) ||
+ (cat = model->getCategory(cat_id)) == NULL ||
+ cat->getName() == new_name)
+ {
+ return;
+ }
+
+ LLPointer<LLViewerInventoryCategory> new_cat = new LLViewerInventoryCategory(cat);
+ new_cat->rename(new_name);
+ new_cat->updateServer(FALSE);
+ model->updateCategory(new_cat);
+
+ model->notifyObservers();
+}
+
+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:
+ {
+ if (isAgentAvatarValid() && gAgentAvatarp->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 (LLGestureMgr::instance().isGestureActive(item->getLinkedUUID()))
+ return TRUE;
+ break;
+ default:
+ break;
+ }
+ return FALSE;
+}
+
+BOOL get_is_item_removable(const LLInventoryModel* model, const LLUUID& id)
+{
+ if (!model)
+ {
+ return FALSE;
+ }
+
+ // Can't delete an item that's in the library.
+ if (!model->isObjectDescendentOf(id, gInventory.getRootFolderID()))
+ {
+ return FALSE;
+ }
+
+ // Disable delete from COF folder; have users explicitly choose "detach/take off",
+ // unless the item is not worn but in the COF (i.e. is bugged).
+ if (LLAppearanceMgr::instance().getIsProtectedCOFItem(id))
+ {
+ if (get_is_item_worn(id))
+ {
+ return FALSE;
+ }
+ }
+
+ const LLInventoryObject *obj = model->getItem(id);
+ if (obj && obj->getIsLinkType())
+ {
+ return TRUE;
+ }
+ if (get_is_item_worn(id))
+ {
+ return FALSE;
+ }
+ return TRUE;
+}
+
+BOOL get_is_category_removable(const LLInventoryModel* model, const LLUUID& id)
+{
+ // This function doesn't check the folder's children.
+
+ if (!model)
+ {
+ return FALSE;
+ }
+
+ if (!model->isObjectDescendentOf(id, gInventory.getRootFolderID()))
+ {
+ return FALSE;
+ }
+
+ if (!isAgentAvatarValid()) return FALSE;
+
+ LLInventoryCategory* category = model->getCategory(id);
+ if (!category)
+ {
+ return FALSE;
+ }
+
+ if (LLFolderType::lookupIsProtectedType(category->getPreferredType()))
+ {
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+BOOL get_is_category_renameable(const LLInventoryModel* model, const LLUUID& id)
+{
+ if (!model)
+ {
+ return FALSE;
+ }
+
+ LLViewerInventoryCategory* cat = model->getCategory(id);
+
+ if (cat && !LLFolderType::lookupIsProtectedType(cat->getPreferredType()) &&
+ cat->getOwnerID() == gAgent.getID())
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+void show_task_item_profile(const LLUUID& item_uuid, const LLUUID& object_id)
+{
+ LLSideTray::getInstance()->showPanel("sidepanel_inventory", LLSD().with("id", item_uuid).with("object", object_id));
+}
+
+void show_item_profile(const LLUUID& item_uuid)
+{
+ LLUUID linked_uuid = gInventory.getLinkedItemID(item_uuid);
+ LLSideTray::getInstance()->showPanel("sidepanel_inventory", LLSD().with("id", linked_uuid));
+}
+
+void show_item_original(const LLUUID& item_uuid)
+{
+ //sidetray inventory panel
+ LLSidepanelInventory *sidepanel_inventory =
+ dynamic_cast<LLSidepanelInventory *>(LLSideTray::getInstance()->getPanel("sidepanel_inventory"));
+
+ bool reset_inventory_filter = !LLSideTray::getInstance()->isPanelActive("sidepanel_inventory");
+
+ LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel();
+ if (!active_panel)
+ {
+ //this may happen when there is no floatera and other panel is active in inventory tab
+
+ if (sidepanel_inventory)
+ {
+ sidepanel_inventory->showInventoryPanel();
+ }
+ }
+
+ active_panel = LLInventoryPanel::getActiveInventoryPanel();
+ if (!active_panel)
+ {
+ return;
+ }
+ active_panel->setSelection(gInventory.getLinkedItemID(item_uuid), TAKE_FOCUS_NO);
+
+ if(reset_inventory_filter)
+ {
+ //inventory floater
+ bool floater_inventory_visible = false;
+
+ LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
+ for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
+ {
+ LLFloaterInventory* floater_inventory = dynamic_cast<LLFloaterInventory*>(*iter);
+ if (floater_inventory)
+ {
+ LLPanelMainInventory* main_inventory = floater_inventory->getMainInventoryPanel();
+
+ main_inventory->onFilterEdit("");
+ }
+
+ if(floater_inventory->getVisible())
+ {
+ floater_inventory_visible = true;
+ }
+
+ }
+ if(sidepanel_inventory && !floater_inventory_visible)
+ {
+ LLPanelMainInventory* main_inventory = sidepanel_inventory->getMainInventoryPanel();
+
+ main_inventory->onFilterEdit("");
+ }
+ }
+}
+
+///----------------------------------------------------------------------------
+/// LLInventoryCollectFunctor implementations
+///----------------------------------------------------------------------------
+
+// static
+bool LLInventoryCollectFunctor::itemTransferCommonlyAllowed(const LLInventoryItem* item)
+{
+ if (!item)
+ return false;
+
+ switch(item->getType())
+ {
+ case LLAssetType::AT_CALLINGCARD:
+ return false;
+ break;
+ case LLAssetType::AT_OBJECT:
+ if (isAgentAvatarValid() && !gAgentAvatarp->isWearingAttachment(item->getUUID()))
+ return true;
+ break;
+ case LLAssetType::AT_BODYPART:
+ case LLAssetType::AT_CLOTHING:
+ if(!gAgentWearables.isWearingItem(item->getUUID()))
+ return true;
+ break;
+ default:
+ return true;
+ break;
+ }
+ return false;
+}
+
+bool LLIsType::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
+{
+ if(mType == LLAssetType::AT_CATEGORY)
+ {
+ if(cat) return TRUE;
+ }
+ if(item)
+ {
+ if(item->getType() == mType) return TRUE;
+ }
+ return FALSE;
+}
+
+bool LLIsNotType::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
+{
+ if(mType == LLAssetType::AT_CATEGORY)
+ {
+ if(cat) return FALSE;
+ }
+ if(item)
+ {
+ if(item->getType() == mType) return FALSE;
+ else return TRUE;
+ }
+ return TRUE;
+}
+
+bool LLIsTypeWithPermissions::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
+{
+ if(mType == LLAssetType::AT_CATEGORY)
+ {
+ if(cat)
+ {
+ return TRUE;
+ }
+ }
+ if(item)
+ {
+ if(item->getType() == mType)
+ {
+ LLPermissions perm = item->getPermissions();
+ if ((perm.getMaskBase() & mPerm) == mPerm)
+ {
+ return TRUE;
+ }
+ }
+ }
+ return FALSE;
+}
+
+bool LLBuddyCollector::operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item)
+{
+ if(item)
+ {
+ if((LLAssetType::AT_CALLINGCARD == item->getType())
+ && (!item->getCreatorUUID().isNull())
+ && (item->getCreatorUUID() != gAgent.getID()))
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
+
+bool LLUniqueBuddyCollector::operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item)
+{
+ if(item)
+ {
+ if((LLAssetType::AT_CALLINGCARD == item->getType())
+ && (item->getCreatorUUID().notNull())
+ && (item->getCreatorUUID() != gAgent.getID()))
+ {
+ mSeen.insert(item->getCreatorUUID());
+ return true;
+ }
+ }
+ return false;
+}
+
+
+bool LLParticularBuddyCollector::operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item)
+{
+ if(item)
+ {
+ if((LLAssetType::AT_CALLINGCARD == item->getType())
+ && (item->getCreatorUUID() == mBuddyID))
+ {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+
+bool LLNameCategoryCollector::operator()(
+ LLInventoryCategory* cat, LLInventoryItem* item)
+{
+ if(cat)
+ {
+ if (!LLStringUtil::compareInsensitive(mName, cat->getName()))
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
+bool LLFindCOFValidItems::operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item)
+{
+ // Valid COF items are:
+ // - links to wearables (body parts or clothing)
+ // - links to attachments
+ // - links to gestures
+ // - links to ensemble folders
+ LLViewerInventoryItem *linked_item = ((LLViewerInventoryItem*)item)->getLinkedItem();
+ if (linked_item)
+ {
+ LLAssetType::EType type = linked_item->getType();
+ return (type == LLAssetType::AT_CLOTHING ||
+ type == LLAssetType::AT_BODYPART ||
+ type == LLAssetType::AT_GESTURE ||
+ type == LLAssetType::AT_OBJECT);
+ }
+ else
+ {
+ LLViewerInventoryCategory *linked_category = ((LLViewerInventoryItem*)item)->getLinkedCategory();
+ // BAP remove AT_NONE support after ensembles are fully working?
+ return (linked_category &&
+ ((linked_category->getPreferredType() == LLFolderType::FT_NONE) ||
+ (LLFolderType::lookupIsEnsembleType(linked_category->getPreferredType()))));
+ }
+}
+
+bool LLFindWearables::operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item)
+{
+ if(item)
+ {
+ if((item->getType() == LLAssetType::AT_CLOTHING)
+ || (item->getType() == LLAssetType::AT_BODYPART))
+ {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+LLFindWearablesEx::LLFindWearablesEx(bool is_worn, bool include_body_parts)
+: mIsWorn(is_worn)
+, mIncludeBodyParts(include_body_parts)
+{}
+
+bool LLFindWearablesEx::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
+{
+ LLViewerInventoryItem *vitem = dynamic_cast<LLViewerInventoryItem*>(item);
+ if (!vitem) return false;
+
+ // Skip non-wearables.
+ if (!vitem->isWearableType() && vitem->getType() != LLAssetType::AT_OBJECT)
+ {
+ return false;
+ }
+
+ // Skip body parts if requested.
+ if (!mIncludeBodyParts && vitem->getType() == LLAssetType::AT_BODYPART)
+ {
+ return false;
+ }
+
+ return (bool) get_is_item_worn(item->getUUID()) == mIsWorn;
+}
+
+bool LLFindWearablesOfType::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
+{
+ if (!item) return false;
+ if (item->getType() != LLAssetType::AT_CLOTHING &&
+ item->getType() != LLAssetType::AT_BODYPART)
+ {
+ return false;
+ }
+
+ LLViewerInventoryItem *vitem = dynamic_cast<LLViewerInventoryItem*>(item);
+ if (!vitem || vitem->getWearableType() != mWearableType) return false;
+
+ return true;
+}
+
+void LLFindWearablesOfType::setType(LLWearableType::EType type)
+{
+ mWearableType = type;
+}
+
+bool LLFindNonRemovableObjects::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
+{
+ if (item)
+ {
+ return !get_is_item_removable(&gInventory, item->getUUID());
+ }
+ if (cat)
+ {
+ return !get_is_category_removable(&gInventory, cat->getUUID());
+ }
+
+ llwarns << "Not a category and not an item?" << llendl;
+ return false;
+}
+
+///----------------------------------------------------------------------------
+/// LLAssetIDMatches
+///----------------------------------------------------------------------------
+bool LLAssetIDMatches::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
+{
+ return (item && item->getAssetUUID() == mAssetID);
+}
+
+///----------------------------------------------------------------------------
+/// LLLinkedItemIDMatches
+///----------------------------------------------------------------------------
+bool LLLinkedItemIDMatches::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
+{
+ return (item &&
+ (item->getIsLinkType()) &&
+ (item->getLinkedUUID() == mBaseItemID)); // A linked item's assetID will be the compared-to item's itemID.
+}
+
void LLSaveFolderState::setApply(BOOL apply)
{
mApply = apply;
@@ -194,175 +764,3 @@ void LLOpenFoldersWithSelection::doFolder(LLFolderViewFolder* folder)
folder->getParentFolder()->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_UP);
}
}
-
-const std::string& get_item_icon_name(LLAssetType::EType asset_type,
- LLInventoryType::EType inventory_type,
- U32 attachment_point,
- BOOL item_is_multi )
-{
- EInventoryIcon idx = OBJECT_ICON_NAME;
- if ( item_is_multi )
- {
- idx = OBJECT_MULTI_ICON_NAME;
- }
-
- switch(asset_type)
- {
- case LLAssetType::AT_TEXTURE:
- if(LLInventoryType::IT_SNAPSHOT == inventory_type)
- {
- idx = SNAPSHOT_ICON_NAME;
- }
- else
- {
- idx = TEXTURE_ICON_NAME;
- }
- break;
-
- case LLAssetType::AT_SOUND:
- idx = SOUND_ICON_NAME;
- break;
- case LLAssetType::AT_CALLINGCARD:
- if(attachment_point!= 0)
- {
- idx = CALLINGCARD_ONLINE_ICON_NAME;
- }
- else
- {
- idx = CALLINGCARD_OFFLINE_ICON_NAME;
- }
- break;
- case LLAssetType::AT_LANDMARK:
- if(attachment_point!= 0)
- {
- idx = LANDMARK_VISITED_ICON_NAME;
- }
- else
- {
- idx = LANDMARK_ICON_NAME;
- }
- break;
- case LLAssetType::AT_SCRIPT:
- case LLAssetType::AT_LSL_TEXT:
- case LLAssetType::AT_LSL_BYTECODE:
- idx = SCRIPT_ICON_NAME;
- break;
- case LLAssetType::AT_CLOTHING:
- idx = CLOTHING_ICON_NAME;
- case LLAssetType::AT_BODYPART :
- if(LLAssetType::AT_BODYPART == asset_type)
- {
- idx = BODYPART_ICON_NAME;
- }
- switch(LLInventoryItem::II_FLAGS_WEARABLES_MASK & attachment_point)
- {
- case WT_SHAPE:
- idx = BODYPART_SHAPE_ICON_NAME;
- break;
- case WT_SKIN:
- idx = BODYPART_SKIN_ICON_NAME;
- break;
- case WT_HAIR:
- idx = BODYPART_HAIR_ICON_NAME;
- break;
- case WT_EYES:
- idx = BODYPART_EYES_ICON_NAME;
- break;
- case WT_SHIRT:
- idx = CLOTHING_SHIRT_ICON_NAME;
- break;
- case WT_PANTS:
- idx = CLOTHING_PANTS_ICON_NAME;
- break;
- case WT_SHOES:
- idx = CLOTHING_SHOES_ICON_NAME;
- break;
- case WT_SOCKS:
- idx = CLOTHING_SOCKS_ICON_NAME;
- break;
- case WT_JACKET:
- idx = CLOTHING_JACKET_ICON_NAME;
- break;
- case WT_GLOVES:
- idx = CLOTHING_GLOVES_ICON_NAME;
- break;
- case WT_UNDERSHIRT:
- idx = CLOTHING_UNDERSHIRT_ICON_NAME;
- break;
- case WT_UNDERPANTS:
- idx = CLOTHING_UNDERPANTS_ICON_NAME;
- break;
- case WT_SKIRT:
- idx = CLOTHING_SKIRT_ICON_NAME;
- break;
- case WT_ALPHA:
- idx = CLOTHING_ALPHA_ICON_NAME;
- break;
- case WT_TATTOO:
- idx = CLOTHING_TATTOO_ICON_NAME;
- break;
- default:
- // no-op, go with choice above
- break;
- }
- break;
- case LLAssetType::AT_NOTECARD:
- idx = NOTECARD_ICON_NAME;
- break;
- case LLAssetType::AT_ANIMATION:
- idx = ANIMATION_ICON_NAME;
- break;
- case LLAssetType::AT_GESTURE:
- idx = GESTURE_ICON_NAME;
- break;
- case LLAssetType::AT_LINK:
- idx = LINKITEM_ICON_NAME;
- break;
- case LLAssetType::AT_LINK_FOLDER:
- idx = LINKFOLDER_ICON_NAME;
- break;
- default:
- break;
- }
-
- return ICON_NAME[idx];
-}
-
-LLUIImagePtr get_item_icon(LLAssetType::EType asset_type,
- LLInventoryType::EType inventory_type,
- U32 attachment_point,
- BOOL item_is_multi)
-{
- 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 968db84819..6619a50d28 100644
--- a/indra/newview/llinventoryfunctions.h
+++ b/indra/newview/llinventoryfunctions.h
@@ -38,14 +38,357 @@
#include "llfolderview.h"
#include "llfolderviewitem.h"
+/********************************************************************************
+ ** **
+ ** MISCELLANEOUS GLOBAL FUNCTIONS
+ **/
+
+// Is this item or its baseitem is worn, attached, etc...
+BOOL get_is_item_worn(const LLUUID& id);
+
+BOOL get_is_item_removable(const LLInventoryModel* model, const LLUUID& id);
+
+BOOL get_is_category_removable(const LLInventoryModel* model, const LLUUID& id);
+
+BOOL get_is_category_renameable(const LLInventoryModel* model, const LLUUID& id);
+
+void show_item_profile(const LLUUID& item_uuid);
+void show_task_item_profile(const LLUUID& item_uuid, const LLUUID& object_id);
+
+void show_item_original(const LLUUID& item_uuid);
+
+void change_item_parent(LLInventoryModel* model,
+ LLViewerInventoryItem* item,
+ const LLUUID& new_parent_id,
+ BOOL restamp);
+
+void change_category_parent(LLInventoryModel* model,
+ LLViewerInventoryCategory* cat,
+ const LLUUID& new_parent_id,
+ BOOL restamp);
+
+void remove_category(LLInventoryModel* model, const LLUUID& cat_id);
+
+void rename_category(LLInventoryModel* model, const LLUUID& cat_id, const std::string& new_name);
+
+// Generates a string containing the path to the item specified by item_id.
+void append_path(const LLUUID& id, std::string& path);
+
+/** Miscellaneous global functions
+ ** **
+ *******************************************************************************/
+
+/********************************************************************************
+ ** **
+ ** INVENTORY COLLECTOR FUNCTIONS
+ **/
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryCollectFunctor
+//
+// Base class for LLInventoryModel::collectDescendentsIf() method
+// which accepts an instance of one of these objects to use as the
+// function to determine if it should be added. Derive from this class
+// and override the () operator to return TRUE if you want to collect
+// the category or item passed in.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLInventoryCollectFunctor
+{
+public:
+ virtual ~LLInventoryCollectFunctor(){};
+ virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) = 0;
+
+ static bool itemTransferCommonlyAllowed(const LLInventoryItem* item);
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLAssetIDMatches
+//
+// This functor finds inventory items pointing to the specified asset
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLViewerInventoryItem;
+
+class LLAssetIDMatches : public LLInventoryCollectFunctor
+{
+public:
+ LLAssetIDMatches(const LLUUID& asset_id) : mAssetID(asset_id) {}
+ virtual ~LLAssetIDMatches() {}
+ bool operator()(LLInventoryCategory* cat, LLInventoryItem* item);
+
+protected:
+ LLUUID mAssetID;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLLinkedItemIDMatches
+//
+// This functor finds inventory items linked to the specific inventory id.
+// Assumes the inventory id is itself not a linked item.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLLinkedItemIDMatches : public LLInventoryCollectFunctor
+{
+public:
+ LLLinkedItemIDMatches(const LLUUID& item_id) : mBaseItemID(item_id) {}
+ virtual ~LLLinkedItemIDMatches() {}
+ bool operator()(LLInventoryCategory* cat, LLInventoryItem* item);
+
+protected:
+ LLUUID mBaseItemID;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLIsType
+//
+// Implementation of a LLInventoryCollectFunctor which returns TRUE if
+// the type is the type passed in during construction.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLIsType : public LLInventoryCollectFunctor
+{
+public:
+ LLIsType(LLAssetType::EType type) : mType(type) {}
+ virtual ~LLIsType() {}
+ virtual bool operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item);
+protected:
+ LLAssetType::EType mType;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLIsNotType
+//
+// Implementation of a LLInventoryCollectFunctor which returns FALSE if the
+// type is the type passed in during construction, otherwise false.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLIsNotType : public LLInventoryCollectFunctor
+{
+public:
+ LLIsNotType(LLAssetType::EType type) : mType(type) {}
+ virtual ~LLIsNotType() {}
+ virtual bool operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item);
+protected:
+ LLAssetType::EType mType;
+};
+
+class LLIsTypeWithPermissions : public LLInventoryCollectFunctor
+{
+public:
+ LLIsTypeWithPermissions(LLAssetType::EType type, const PermissionBit perms, const LLUUID &agent_id, const LLUUID &group_id)
+ : mType(type), mPerm(perms), mAgentID(agent_id), mGroupID(group_id) {}
+ virtual ~LLIsTypeWithPermissions() {}
+ virtual bool operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item);
+protected:
+ LLAssetType::EType mType;
+ PermissionBit mPerm;
+ LLUUID mAgentID;
+ LLUUID mGroupID;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLBuddyCollector
+//
+// Simple class that collects calling cards that are not null, and not
+// the agent. Duplicates are possible.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLBuddyCollector : public LLInventoryCollectFunctor
+{
+public:
+ LLBuddyCollector() {}
+ virtual ~LLBuddyCollector() {}
+ virtual bool operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item);
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLUniqueBuddyCollector
+//
+// Simple class that collects calling cards that are not null, and not
+// the agent. Duplicates are discarded.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLUniqueBuddyCollector : public LLInventoryCollectFunctor
+{
+public:
+ LLUniqueBuddyCollector() {}
+ virtual ~LLUniqueBuddyCollector() {}
+ virtual bool operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item);
+
+protected:
+ std::set<LLUUID> mSeen;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLParticularBuddyCollector
+//
+// Simple class that collects calling cards that match a particular uuid
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLParticularBuddyCollector : public LLInventoryCollectFunctor
+{
+public:
+ LLParticularBuddyCollector(const LLUUID& id) : mBuddyID(id) {}
+ virtual ~LLParticularBuddyCollector() {}
+ virtual bool operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item);
+protected:
+ LLUUID mBuddyID;
+};
+
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLNameCategoryCollector
//
-// This is a collection of miscellaneous functions and classes
-// 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.
+// Collects categories based on case-insensitive match of prefix
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLNameCategoryCollector : public LLInventoryCollectFunctor
+{
+public:
+ LLNameCategoryCollector(const std::string& name) : mName(name) {}
+ virtual ~LLNameCategoryCollector() {}
+ virtual bool operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item);
+protected:
+ std::string mName;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLFindCOFValidItems
//
+// Collects items that can be legitimately linked to in the COF.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLFindCOFValidItems : public LLInventoryCollectFunctor
+{
+public:
+ LLFindCOFValidItems() {}
+ virtual ~LLFindCOFValidItems() {}
+ virtual bool operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item);
+
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLFindNonLinksByMask
+//
+//
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLFindByMask : public LLInventoryCollectFunctor
+{
+public:
+ LLFindByMask(U64 mask)
+ : mFilterMask(mask)
+ {}
+
+ virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item)
+ {
+ if(item && (mFilterMask & (1LL << item->getInventoryType())) )
+ {
+ return true;
+ }
+
+ return false;
+ }
+
+private:
+ U64 mFilterMask;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLFindNonLinksByMask
+//
+//
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLFindNonLinksByMask : public LLInventoryCollectFunctor
+{
+public:
+ LLFindNonLinksByMask(U64 mask)
+ : mFilterMask(mask)
+ {}
+
+ virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item)
+ {
+ if(item && !item->getIsLinkType() && (mFilterMask & (1LL << item->getInventoryType())) )
+ {
+ return true;
+ }
+
+ return false;
+ }
+
+ void setFilterMask(U64 mask)
+ {
+ mFilterMask = mask;
+ }
+
+private:
+ U64 mFilterMask;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLFindWearables
+//
+// Collects wearables based on item type.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLFindWearables : public LLInventoryCollectFunctor
+{
+public:
+ LLFindWearables() {}
+ virtual ~LLFindWearables() {}
+ virtual bool operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item);
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLFindWearablesEx
+//
+// Collects wearables based on given criteria.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLFindWearablesEx : public LLInventoryCollectFunctor
+{
+public:
+ LLFindWearablesEx(bool is_worn, bool include_body_parts = true);
+ virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item);
+private:
+ bool mIncludeBodyParts;
+ bool mIsWorn;
+};
+
+//Inventory collect functor collecting wearables of a specific wearable type
+class LLFindWearablesOfType : public LLInventoryCollectFunctor
+{
+public:
+ LLFindWearablesOfType(LLWearableType::EType type) : mWearableType(type) {}
+ virtual ~LLFindWearablesOfType() {}
+ virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item);
+ void setType(LLWearableType::EType type);
+
+private:
+ LLWearableType::EType mWearableType;
+};
+
+/** Filter out wearables-links */
+class LLFindActualWearablesOfType : public LLFindWearablesOfType
+{
+public:
+ LLFindActualWearablesOfType(LLWearableType::EType type) : LLFindWearablesOfType(type) {}
+ virtual ~LLFindActualWearablesOfType() {}
+ virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item)
+ {
+ if (item && item->getIsLinkType()) return false;
+ return LLFindWearablesOfType::operator()(cat, item);
+ }
+};
+
+// Collect non-removable folders and items.
+class LLFindNonRemovableObjects : public LLInventoryCollectFunctor
+{
+public:
+ virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item);
+};
+
+/** Inventory Collector Functions
+ ** **
+ *******************************************************************************/
class LLInventoryState
{
@@ -64,7 +407,7 @@ public:
virtual void doItem(LLFolderViewItem* item);
BOOL wasItemSelected() { return mItemSelected; }
protected:
- BOOL mItemSelected;
+ BOOL mItemSelected;
};
class LLOpenFilteredFolders : public LLFolderViewFunctor
@@ -99,19 +442,6 @@ public:
virtual void doItem(LLFolderViewItem* item);
};
-const std::string& get_item_icon_name(LLAssetType::EType asset_type,
- 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 );
-
-// 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/llinventoryicon.cpp b/indra/newview/llinventoryicon.cpp
new file mode 100644
index 0000000000..3090371a73
--- /dev/null
+++ b/indra/newview/llinventoryicon.cpp
@@ -0,0 +1,181 @@
+/**
+ * @file llinventoryicon.cpp
+ * @brief Implementation of the inventory icon.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llinventoryicon.h"
+
+#include "lldictionary.h"
+#include "llinventorydefines.h"
+#include "llui.h"
+#include "llwearabletype.h"
+
+struct IconEntry : public LLDictionaryEntry
+{
+ IconEntry(const std::string &item_name)
+ :
+ LLDictionaryEntry(item_name)
+ {}
+};
+
+class LLIconDictionary : public LLSingleton<LLIconDictionary>,
+ public LLDictionary<LLInventoryIcon::EIconName, IconEntry>
+{
+public:
+ LLIconDictionary();
+};
+
+LLIconDictionary::LLIconDictionary()
+{
+ addEntry(LLInventoryIcon::ICONNAME_TEXTURE, new IconEntry("Inv_Texture"));
+ addEntry(LLInventoryIcon::ICONNAME_SOUND, new IconEntry("Inv_Texture"));
+ addEntry(LLInventoryIcon::ICONNAME_CALLINGCARD_ONLINE, new IconEntry("Inv_CallingCard"));
+ addEntry(LLInventoryIcon::ICONNAME_CALLINGCARD_OFFLINE, new IconEntry("Inv_CallingCard"));
+ addEntry(LLInventoryIcon::ICONNAME_LANDMARK, new IconEntry("Inv_Landmark"));
+ addEntry(LLInventoryIcon::ICONNAME_LANDMARK_VISITED, new IconEntry("Inv_Landmark"));
+ addEntry(LLInventoryIcon::ICONNAME_SCRIPT, new IconEntry("Inv_Script"));
+ addEntry(LLInventoryIcon::ICONNAME_CLOTHING, new IconEntry("Inv_Clothing"));
+ addEntry(LLInventoryIcon::ICONNAME_OBJECT, new IconEntry("Inv_Object"));
+ addEntry(LLInventoryIcon::ICONNAME_OBJECT_MULTI, new IconEntry("Inv_Object_Multi"));
+ addEntry(LLInventoryIcon::ICONNAME_NOTECARD, new IconEntry("Inv_Notecard"));
+ addEntry(LLInventoryIcon::ICONNAME_BODYPART, new IconEntry("Inv_Skin"));
+ addEntry(LLInventoryIcon::ICONNAME_SNAPSHOT, new IconEntry("Inv_Snapshot"));
+
+ addEntry(LLInventoryIcon::ICONNAME_BODYPART_SHAPE, new IconEntry("Inv_BodyShape"));
+ addEntry(LLInventoryIcon::ICONNAME_BODYPART_SKIN, new IconEntry("Inv_Skin"));
+ addEntry(LLInventoryIcon::ICONNAME_BODYPART_HAIR, new IconEntry("Inv_Hair"));
+ addEntry(LLInventoryIcon::ICONNAME_BODYPART_EYES, new IconEntry("Inv_Eye"));
+
+ addEntry(LLInventoryIcon::ICONNAME_CLOTHING_SHIRT, new IconEntry("Inv_Shirt"));
+ addEntry(LLInventoryIcon::ICONNAME_CLOTHING_PANTS, new IconEntry("Inv_Pants"));
+ addEntry(LLInventoryIcon::ICONNAME_CLOTHING_SHOES, new IconEntry("Inv_Shoe"));
+ addEntry(LLInventoryIcon::ICONNAME_CLOTHING_SOCKS, new IconEntry("Inv_Socks"));
+ addEntry(LLInventoryIcon::ICONNAME_CLOTHING_JACKET, new IconEntry("Inv_Jacket"));
+ addEntry(LLInventoryIcon::ICONNAME_CLOTHING_GLOVES, new IconEntry("Inv_Gloves"));
+ addEntry(LLInventoryIcon::ICONNAME_CLOTHING_UNDERSHIRT, new IconEntry("Inv_Undershirt"));
+ addEntry(LLInventoryIcon::ICONNAME_CLOTHING_UNDERPANTS, new IconEntry("Inv_Underpants"));
+ addEntry(LLInventoryIcon::ICONNAME_CLOTHING_SKIRT, new IconEntry("Inv_Skirt"));
+ addEntry(LLInventoryIcon::ICONNAME_CLOTHING_ALPHA, new IconEntry("Inv_Alpha"));
+ addEntry(LLInventoryIcon::ICONNAME_CLOTHING_TATTOO, new IconEntry("Inv_Tattoo"));
+ addEntry(LLInventoryIcon::ICONNAME_ANIMATION, new IconEntry("Inv_Animation"));
+ addEntry(LLInventoryIcon::ICONNAME_GESTURE, new IconEntry("Inv_Gesture"));
+
+ addEntry(LLInventoryIcon::ICONNAME_LINKITEM, new IconEntry("Inv_LinkItem"));
+ addEntry(LLInventoryIcon::ICONNAME_LINKFOLDER, new IconEntry("Inv_LinkItem"));
+
+ addEntry(LLInventoryIcon::ICONNAME_NONE, new IconEntry("NONE"));
+}
+
+LLUIImagePtr LLInventoryIcon::getIcon(LLAssetType::EType asset_type,
+ LLInventoryType::EType inventory_type,
+ U32 misc_flag,
+ BOOL item_is_multi)
+{
+ const std::string& icon_name = getIconName(asset_type, inventory_type, misc_flag, item_is_multi);
+ return LLUI::getUIImage(icon_name);
+}
+
+LLUIImagePtr LLInventoryIcon::getIcon(EIconName idx)
+{
+ return LLUI::getUIImage(getIconName(idx));
+}
+
+const std::string& LLInventoryIcon::getIconName(LLAssetType::EType asset_type,
+ LLInventoryType::EType inventory_type,
+ U32 misc_flag,
+ BOOL item_is_multi)
+{
+ EIconName idx = ICONNAME_OBJECT;
+ if (item_is_multi)
+ {
+ idx = ICONNAME_OBJECT_MULTI;
+ }
+
+ switch(asset_type)
+ {
+ case LLAssetType::AT_TEXTURE:
+ idx = (inventory_type == LLInventoryType::IT_SNAPSHOT) ? ICONNAME_SNAPSHOT : ICONNAME_TEXTURE;
+ break;
+ case LLAssetType::AT_SOUND:
+ idx = ICONNAME_SOUND;
+ break;
+ case LLAssetType::AT_CALLINGCARD:
+ idx = (misc_flag != 0) ? ICONNAME_CALLINGCARD_ONLINE : ICONNAME_CALLINGCARD_OFFLINE;
+ break;
+ case LLAssetType::AT_LANDMARK:
+ idx = (misc_flag != 0) ? ICONNAME_LANDMARK_VISITED : ICONNAME_LANDMARK;
+ break;
+ case LLAssetType::AT_SCRIPT:
+ case LLAssetType::AT_LSL_TEXT:
+ case LLAssetType::AT_LSL_BYTECODE:
+ idx = ICONNAME_SCRIPT;
+ break;
+ case LLAssetType::AT_CLOTHING:
+ case LLAssetType::AT_BODYPART:
+ idx = assignWearableIcon(misc_flag);
+ break;
+ case LLAssetType::AT_NOTECARD:
+ idx = ICONNAME_NOTECARD;
+ break;
+ case LLAssetType::AT_ANIMATION:
+ idx = ICONNAME_ANIMATION;
+ break;
+ case LLAssetType::AT_GESTURE:
+ idx = ICONNAME_GESTURE;
+ break;
+ case LLAssetType::AT_LINK:
+ idx = ICONNAME_LINKITEM;
+ break;
+ case LLAssetType::AT_LINK_FOLDER:
+ idx = ICONNAME_LINKFOLDER;
+ break;
+ case LLAssetType::AT_OBJECT:
+ idx = ICONNAME_OBJECT;
+ break;
+ default:
+ break;
+ }
+
+ return getIconName(idx);
+}
+
+
+const std::string& LLInventoryIcon::getIconName(EIconName idx)
+{
+ const IconEntry *entry = LLIconDictionary::instance().lookup(idx);
+ return entry->mName;
+}
+
+LLInventoryIcon::EIconName LLInventoryIcon::assignWearableIcon(U32 misc_flag)
+{
+ const LLWearableType::EType wearable_type = LLWearableType::EType(LLInventoryItemFlags::II_FLAGS_WEARABLES_MASK & misc_flag);
+ return LLWearableType::getIconName(wearable_type);
+}
diff --git a/indra/newview/llinventoryicon.h b/indra/newview/llinventoryicon.h
new file mode 100644
index 0000000000..6e29012c4c
--- /dev/null
+++ b/indra/newview/llinventoryicon.h
@@ -0,0 +1,105 @@
+/**
+ * @file llinventoryfunctions.h
+ * @brief Miscellaneous inventory-related functions and classes
+ * class definition
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLINVENTORYICON_H
+#define LL_LLINVENTORYICON_H
+
+#include "llassettype.h"
+#include "llinventorytype.h"
+#include "lluiimage.h"
+
+class LLInventoryIcon
+{
+public:
+ enum EIconName
+ {
+ ICONNAME_TEXTURE,
+ ICONNAME_SOUND,
+ ICONNAME_CALLINGCARD_ONLINE,
+ ICONNAME_CALLINGCARD_OFFLINE,
+ ICONNAME_LANDMARK,
+ ICONNAME_LANDMARK_VISITED,
+ ICONNAME_SCRIPT,
+ ICONNAME_CLOTHING,
+ ICONNAME_OBJECT,
+ ICONNAME_OBJECT_MULTI,
+ ICONNAME_NOTECARD,
+ ICONNAME_BODYPART,
+ ICONNAME_SNAPSHOT,
+
+ ICONNAME_BODYPART_SHAPE,
+ ICONNAME_BODYPART_SKIN,
+ ICONNAME_BODYPART_HAIR,
+ ICONNAME_BODYPART_EYES,
+ ICONNAME_CLOTHING_SHIRT,
+ ICONNAME_CLOTHING_PANTS,
+ ICONNAME_CLOTHING_SHOES,
+ ICONNAME_CLOTHING_SOCKS,
+ ICONNAME_CLOTHING_JACKET,
+ ICONNAME_CLOTHING_GLOVES,
+ ICONNAME_CLOTHING_UNDERSHIRT,
+ ICONNAME_CLOTHING_UNDERPANTS,
+ ICONNAME_CLOTHING_SKIRT,
+ ICONNAME_CLOTHING_ALPHA,
+ ICONNAME_CLOTHING_TATTOO,
+
+ ICONNAME_ANIMATION,
+ ICONNAME_GESTURE,
+
+ ICONNAME_LINKITEM,
+ ICONNAME_LINKFOLDER,
+
+ ICONNAME_COUNT,
+
+ ICONNAME_NONE = -1
+ };
+
+ static const std::string& getIconName(LLAssetType::EType asset_type,
+ LLInventoryType::EType inventory_type = LLInventoryType::IT_NONE,
+ U32 misc_flag = 0, // different meanings depending on item type
+ BOOL item_is_multi = FALSE);
+ static const std::string& getIconName(EIconName idx);
+
+ static LLUIImagePtr getIcon(LLAssetType::EType asset_type,
+ LLInventoryType::EType inventory_type = LLInventoryType::IT_NONE,
+ U32 misc_flag = 0, // different meanings depending on item type
+ BOOL item_is_multi = FALSE);
+ static LLUIImagePtr getIcon(EIconName idx);
+
+protected:
+ static EIconName assignWearableIcon(U32 misc_flag);
+};
+#endif // LL_LLINVENTORYICON_H
+
+
+
diff --git a/indra/newview/llinventoryitemslist.cpp b/indra/newview/llinventoryitemslist.cpp
new file mode 100644
index 0000000000..14de5442d6
--- /dev/null
+++ b/indra/newview/llinventoryitemslist.cpp
@@ -0,0 +1,522 @@
+/**
+ * @file llinventoryitemslist.cpp
+ * @brief A list of inventory items represented by LLFlatListView.
+ *
+ * Class LLInventoryItemsList implements a flat list of inventory items.
+ * Class LLPanelInventoryListItem displays inventory item as an element
+ * of LLInventoryItemsList.
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llinventoryitemslist.h"
+
+// llcommon
+#include "llcommonutils.h"
+
+// llui
+#include "lliconctrl.h"
+#include "lltextutil.h"
+
+#include "llcallbacklist.h"
+#include "llinventoryfunctions.h"
+#include "llinventorymodel.h"
+#include "lltrans.h"
+
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+
+static const S32 WIDGET_SPACING = 3;
+
+LLPanelInventoryListItemBase* LLPanelInventoryListItemBase::create(LLViewerInventoryItem* item)
+{
+ LLPanelInventoryListItemBase* list_item = NULL;
+ if (item)
+ {
+ list_item = new LLPanelInventoryListItemBase(item);
+ list_item->init();
+ }
+ return list_item;
+}
+
+void LLPanelInventoryListItemBase::draw()
+{
+ if (getNeedsRefresh())
+ {
+ if (mItem)
+ {
+ updateItem(mItem->getName());
+ }
+ setNeedsRefresh(false);
+ }
+ LLPanel::draw();
+}
+
+// virtual
+void LLPanelInventoryListItemBase::updateItem(const std::string& name,
+ const LLStyle::Params& input_params)
+{
+ setIconImage(mIconImage);
+ setTitle(name, mHighlightedText, input_params);
+}
+
+void LLPanelInventoryListItemBase::addWidgetToLeftSide(const std::string& name, bool show_widget/* = true*/)
+{
+ LLUICtrl* ctrl = findChild<LLUICtrl>(name);
+ if(ctrl)
+ {
+ addWidgetToLeftSide(ctrl, show_widget);
+ }
+}
+
+void LLPanelInventoryListItemBase::addWidgetToLeftSide(LLUICtrl* ctrl, bool show_widget/* = true*/)
+{
+ mLeftSideWidgets.push_back(ctrl);
+ setShowWidget(ctrl, show_widget);
+}
+
+void LLPanelInventoryListItemBase::addWidgetToRightSide(const std::string& name, bool show_widget/* = true*/)
+{
+ LLUICtrl* ctrl = findChild<LLUICtrl>(name);
+ if(ctrl)
+ {
+ addWidgetToRightSide(ctrl, show_widget);
+ }
+}
+
+void LLPanelInventoryListItemBase::addWidgetToRightSide(LLUICtrl* ctrl, bool show_widget/* = true*/)
+{
+ mRightSideWidgets.push_back(ctrl);
+ setShowWidget(ctrl, show_widget);
+}
+
+void LLPanelInventoryListItemBase::setShowWidget(const std::string& name, bool show)
+{
+ LLUICtrl* widget = findChild<LLUICtrl>(name);
+ if(widget)
+ {
+ setShowWidget(widget, show);
+ }
+}
+
+void LLPanelInventoryListItemBase::setShowWidget(LLUICtrl* ctrl, bool show)
+{
+ // Enable state determines whether widget may become visible in setWidgetsVisible()
+ ctrl->setEnabled(show);
+}
+
+BOOL LLPanelInventoryListItemBase::postBuild()
+{
+ setIconCtrl(getChild<LLIconCtrl>("item_icon"));
+ setTitleCtrl(getChild<LLTextBox>("item_name"));
+
+ if (mItem)
+ {
+ mIconImage = LLInventoryIcon::getIcon(mItem->getType(), mItem->getInventoryType(), mItem->getFlags(), FALSE);
+ updateItem(mItem->getName());
+ }
+
+ setNeedsRefresh(true);
+
+ setWidgetsVisible(false);
+ reshapeWidgets();
+
+ return TRUE;
+}
+
+void LLPanelInventoryListItemBase::setValue(const LLSD& value)
+{
+ if (!value.isMap()) return;
+ if (!value.has("selected")) return;
+ childSetVisible("selected_icon", value["selected"]);
+}
+
+void LLPanelInventoryListItemBase::onMouseEnter(S32 x, S32 y, MASK mask)
+{
+ childSetVisible("hovered_icon", true);
+ LLPanel::onMouseEnter(x, y, mask);
+}
+
+void LLPanelInventoryListItemBase::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+ childSetVisible("hovered_icon", false);
+ LLPanel::onMouseLeave(x, y, mask);
+}
+
+const std::string& LLPanelInventoryListItemBase::getItemName() const
+{
+ if (!mItem)
+ {
+ return LLStringUtil::null;
+ }
+ return mItem->getName();
+}
+
+LLAssetType::EType LLPanelInventoryListItemBase::getType() const
+{
+ if (!mItem)
+ {
+ return LLAssetType::AT_NONE;
+ }
+ return mItem->getType();
+}
+
+LLWearableType::EType LLPanelInventoryListItemBase::getWearableType() const
+{
+ if (!mItem)
+ {
+ return LLWearableType::WT_NONE;
+ }
+ return mItem->getWearableType();
+}
+
+const std::string& LLPanelInventoryListItemBase::getDescription() const
+{
+ if (!mItem)
+ {
+ return LLStringUtil::null;
+ }
+ return mItem->getDescription();
+}
+
+S32 LLPanelInventoryListItemBase::notify(const LLSD& info)
+{
+ S32 rv = 0;
+ if(info.has("match_filter"))
+ {
+ mHighlightedText = info["match_filter"].asString();
+
+ std::string test(mTitleCtrl->getText());
+ LLStringUtil::toUpper(test);
+
+ if(mHighlightedText.empty() || std::string::npos != test.find(mHighlightedText))
+ {
+ rv = 0; // substring is found
+ }
+ else
+ {
+ rv = -1;
+ }
+
+ setNeedsRefresh(true);
+ }
+ else
+ {
+ rv = LLPanel::notify(info);
+ }
+ return rv;
+}
+
+LLPanelInventoryListItemBase::LLPanelInventoryListItemBase(LLViewerInventoryItem* item)
+: LLPanel()
+, mItem(item)
+, mIconCtrl(NULL)
+, mTitleCtrl(NULL)
+, mWidgetSpacing(WIDGET_SPACING)
+, mLeftWidgetsWidth(0)
+, mRightWidgetsWidth(0)
+, mNeedsRefresh(false)
+{
+}
+
+void LLPanelInventoryListItemBase::init()
+{
+ LLUICtrlFactory::getInstance()->buildPanel(this, "panel_inventory_item.xml");
+}
+
+class WidgetVisibilityChanger
+{
+public:
+ WidgetVisibilityChanger(bool visible) : mVisible(visible){}
+ void operator()(LLUICtrl* widget)
+ {
+ // Disabled widgets never become visible. see LLPanelInventoryListItemBase::setShowWidget()
+ widget->setVisible(mVisible && widget->getEnabled());
+ }
+private:
+ bool mVisible;
+};
+
+void LLPanelInventoryListItemBase::setWidgetsVisible(bool visible)
+{
+ std::for_each(mLeftSideWidgets.begin(), mLeftSideWidgets.end(), WidgetVisibilityChanger(visible));
+ std::for_each(mRightSideWidgets.begin(), mRightSideWidgets.end(), WidgetVisibilityChanger(visible));
+}
+
+void LLPanelInventoryListItemBase::reshapeWidgets()
+{
+ // disabled reshape left for now to reserve space for 'delete' button in LLPanelClothingListItem
+ /*reshapeLeftWidgets();*/
+ reshapeRightWidgets();
+ reshapeMiddleWidgets();
+}
+
+void LLPanelInventoryListItemBase::setIconImage(const LLUIImagePtr& image)
+{
+ if(image)
+ {
+ mIconImage = image;
+ mIconCtrl->setImage(mIconImage);
+ }
+}
+
+void LLPanelInventoryListItemBase::setTitle(const std::string& title,
+ const std::string& highlit_text,
+ const LLStyle::Params& input_params)
+{
+ mTitleCtrl->setToolTip(title);
+
+ LLTextUtil::textboxSetHighlightedVal(
+ mTitleCtrl,
+ input_params,
+ title,
+ highlit_text);
+}
+
+BOOL LLPanelInventoryListItemBase::handleToolTip( S32 x, S32 y, MASK mask)
+{
+ LLRect text_box_rect = mTitleCtrl->getRect();
+ if (text_box_rect.pointInRect(x, y) &&
+ mTitleCtrl->getTextPixelWidth() <= text_box_rect.getWidth())
+ {
+ return FALSE;
+ }
+ return LLPanel::handleToolTip(x, y, mask);
+}
+
+void LLPanelInventoryListItemBase::reshapeLeftWidgets()
+{
+ S32 widget_left = 0;
+ mLeftWidgetsWidth = 0;
+
+ widget_array_t::const_iterator it = mLeftSideWidgets.begin();
+ const widget_array_t::const_iterator it_end = mLeftSideWidgets.end();
+ for( ; it_end != it; ++it)
+ {
+ LLUICtrl* widget = *it;
+ if(!widget->getVisible())
+ {
+ continue;
+ }
+ LLRect widget_rect(widget->getRect());
+ widget_rect.setLeftTopAndSize(widget_left, widget_rect.mTop, widget_rect.getWidth(), widget_rect.getHeight());
+ widget->setShape(widget_rect);
+
+ widget_left += widget_rect.getWidth() + getWidgetSpacing();
+ mLeftWidgetsWidth = widget_rect.mRight;
+ }
+}
+
+void LLPanelInventoryListItemBase::reshapeRightWidgets()
+{
+ S32 widget_right = getLocalRect().getWidth();
+ S32 widget_left = widget_right;
+
+ widget_array_t::const_reverse_iterator it = mRightSideWidgets.rbegin();
+ const widget_array_t::const_reverse_iterator it_end = mRightSideWidgets.rend();
+ for( ; it_end != it; ++it)
+ {
+ LLUICtrl* widget = *it;
+ if(!widget->getVisible())
+ {
+ continue;
+ }
+ LLRect widget_rect(widget->getRect());
+ widget_left = widget_right - widget_rect.getWidth();
+ widget_rect.setLeftTopAndSize(widget_left, widget_rect.mTop, widget_rect.getWidth(), widget_rect.getHeight());
+ widget->setShape(widget_rect);
+
+ widget_right = widget_left - getWidgetSpacing();
+ }
+ mRightWidgetsWidth = getLocalRect().getWidth() - widget_left;
+}
+
+void LLPanelInventoryListItemBase::reshapeMiddleWidgets()
+{
+ LLRect icon_rect(mIconCtrl->getRect());
+ icon_rect.setLeftTopAndSize(mLeftWidgetsWidth + getWidgetSpacing(), icon_rect.mTop,
+ icon_rect.getWidth(), icon_rect.getHeight());
+ mIconCtrl->setShape(icon_rect);
+
+ S32 name_left = icon_rect.mRight + getWidgetSpacing();
+ S32 name_right = getLocalRect().getWidth() - mRightWidgetsWidth - getWidgetSpacing();
+ LLRect name_rect(mTitleCtrl->getRect());
+ name_rect.set(name_left, name_rect.mTop, name_right, name_rect.mBottom);
+ mTitleCtrl->setShape(name_rect);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+
+LLInventoryItemsList::Params::Params()
+{}
+
+LLInventoryItemsList::LLInventoryItemsList(const LLInventoryItemsList::Params& p)
+: LLFlatListViewEx(p)
+, mNeedsRefresh(false)
+, mForceRefresh(false)
+{
+ // TODO: mCommitOnSelectionChange is set to "false" in LLFlatListView
+ // but reset to true in all derived classes. This settings might need to
+ // be added to LLFlatListView::Params() and/or set to "true" by default.
+ setCommitOnSelectionChange(true);
+
+ setNoFilteredItemsMsg(LLTrans::getString("InventoryNoMatchingItems"));
+
+ gIdleCallbacks.addFunction(idle, this);
+}
+
+// virtual
+LLInventoryItemsList::~LLInventoryItemsList()
+{
+ gIdleCallbacks.deleteFunction(idle, this);
+}
+
+void LLInventoryItemsList::refreshList(const LLInventoryModel::item_array_t item_array)
+{
+ getIDs().clear();
+ LLInventoryModel::item_array_t::const_iterator it = item_array.begin();
+ for( ; item_array.end() != it; ++it)
+ {
+ getIDs().push_back((*it)->getUUID());
+ }
+ mNeedsRefresh = true;
+}
+
+boost::signals2::connection LLInventoryItemsList::setRefreshCompleteCallback(const commit_signal_t::slot_type& cb)
+{
+ return mRefreshCompleteSignal.connect(cb);
+}
+
+void LLInventoryItemsList::doIdle()
+{
+ if (!mNeedsRefresh) return;
+
+ if (isInVisibleChain() || mForceRefresh)
+ {
+ refresh();
+
+ mRefreshCompleteSignal(this, LLSD());
+ }
+}
+
+//static
+void LLInventoryItemsList::idle(void* user_data)
+{
+ LLInventoryItemsList* self = static_cast<LLInventoryItemsList*>(user_data);
+ if ( self )
+ { // Do the real idle
+ self->doIdle();
+ }
+}
+
+void LLInventoryItemsList::refresh()
+{
+ static const unsigned ADD_LIMIT = 50;
+
+ uuid_vec_t added_items;
+ uuid_vec_t removed_items;
+
+ computeDifference(getIDs(), added_items, removed_items);
+
+ bool add_limit_exceeded = false;
+ unsigned int nadded = 0;
+
+ uuid_vec_t::const_iterator it = added_items.begin();
+ for( ; added_items.end() != it; ++it)
+ {
+ if(nadded >= ADD_LIMIT)
+ {
+ add_limit_exceeded = true;
+ break;
+ }
+ LLViewerInventoryItem* item = gInventory.getItem(*it);
+ // Do not rearrange items on each adding, let's do that on filter call
+ llassert(item);
+ if (item)
+ {
+ addNewItem(item, false);
+ ++nadded;
+ }
+ }
+
+ it = removed_items.begin();
+ for( ; removed_items.end() != it; ++it)
+ {
+ removeItemByUUID(*it);
+ }
+
+ // Filter, rearrange and notify parent about shape changes
+ filterItems();
+
+ bool needs_refresh = add_limit_exceeded;
+ setNeedsRefresh(needs_refresh);
+ setForceRefresh(needs_refresh);
+}
+
+void LLInventoryItemsList::computeDifference(
+ const uuid_vec_t& vnew,
+ uuid_vec_t& vadded,
+ uuid_vec_t& vremoved)
+{
+ uuid_vec_t vcur;
+ {
+ std::vector<LLSD> vcur_values;
+ getValues(vcur_values);
+
+ for (size_t i=0; i<vcur_values.size(); i++)
+ vcur.push_back(vcur_values[i].asUUID());
+ }
+
+ LLCommonUtils::computeDifference(vnew, vcur, vadded, vremoved);
+}
+
+void LLInventoryItemsList::addNewItem(LLViewerInventoryItem* item, bool rearrange /*= true*/)
+{
+ if (!item)
+ {
+ llwarns << "No inventory item. Couldn't create flat list item." << llendl;
+ llassert(item != NULL);
+ }
+
+ LLPanelInventoryListItemBase *list_item = LLPanelInventoryListItemBase::create(item);
+ if (!list_item)
+ return;
+
+ bool is_item_added = addItem(list_item, item->getUUID(), ADD_BOTTOM, rearrange);
+ if (!is_item_added)
+ {
+ llwarns << "Couldn't add flat list item." << llendl;
+ llassert(is_item_added);
+ }
+}
+
+// EOF
diff --git a/indra/newview/llinventoryitemslist.h b/indra/newview/llinventoryitemslist.h
new file mode 100644
index 0000000000..5dc0bfe3de
--- /dev/null
+++ b/indra/newview/llinventoryitemslist.h
@@ -0,0 +1,294 @@
+/**
+ * @file llinventoryitemslist.h
+ * @brief A list of inventory items represented by LLFlatListView.
+ *
+ * Class LLInventoryItemsList implements a flat list of inventory items.
+ * Class LLPanelInventoryListItem displays inventory item as an element
+ * of LLInventoryItemsList.
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLINVENTORYITEMSLIST_H
+#define LL_LLINVENTORYITEMSLIST_H
+
+#include "lldarray.h"
+
+#include "llpanel.h"
+
+// newview
+#include "llflatlistview.h"
+#include "llviewerinventory.h"
+
+class LLIconCtrl;
+class LLTextBox;
+class LLViewerInventoryItem;
+
+/**
+ * @class LLPanelInventoryListItemBase
+ *
+ * Base class for Inventory flat list item. Panel consists of inventory icon
+ * and inventory item name.
+ * This class is able to display widgets(buttons) on left(before icon) and right(after text-box) sides
+ * of panel.
+ *
+ * How to use (see LLPanelClothingListItem for example):
+ * - implement init() to build panel from xml
+ * - create new xml file, fill it with widgets you want to dynamically show/hide/reshape on left/right sides
+ * - redefine postBuild()(call base implementation) and add needed widgets to needed sides,
+ *
+ */
+class LLPanelInventoryListItemBase : public LLPanel
+{
+public:
+ static LLPanelInventoryListItemBase* create(LLViewerInventoryItem* item);
+
+ virtual void draw();
+
+ /**
+ * Let item know it need to be refreshed in next draw()
+ */
+ void setNeedsRefresh(bool needs_refresh){ mNeedsRefresh = needs_refresh; }
+
+ bool getNeedsRefresh(){ return mNeedsRefresh; }
+
+ /**
+ * Add widget to left side
+ */
+ void addWidgetToLeftSide(const std::string& name, bool show_widget = true);
+ void addWidgetToLeftSide(LLUICtrl* ctrl, bool show_widget = true);
+
+ /**
+ * Add widget to right side, widget is supposed to be child of calling panel
+ */
+ void addWidgetToRightSide(const std::string& name, bool show_widget = true);
+ void addWidgetToRightSide(LLUICtrl* ctrl, bool show_widget = true);
+
+ /**
+ * Mark widgets as visible. Only visible widgets take part in reshaping children
+ */
+ void setShowWidget(const std::string& name, bool show);
+ void setShowWidget(LLUICtrl* ctrl, bool show);
+
+ /**
+ * Set spacing between widgets during reshape
+ */
+ void setWidgetSpacing(S32 spacing) { mWidgetSpacing = spacing; }
+
+ S32 getWidgetSpacing() { return mWidgetSpacing; }
+
+ /**
+ * Inheritors need to call base implementation of postBuild()
+ */
+ /*virtual*/ BOOL postBuild();
+
+ /**
+ * Handles item selection
+ */
+ /*virtual*/ void setValue(const LLSD& value);
+
+ /**
+ * Handles filter request
+ */
+ /*virtual*/ S32 notify(const LLSD& info);
+
+ /* Highlights item */
+ /*virtual*/ void onMouseEnter(S32 x, S32 y, MASK mask);
+ /* Removes item highlight */
+ /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
+
+ /** Get the name of a corresponding inventory item */
+ const std::string& getItemName() const;
+
+ /** Get the asset type of a corresponding inventory item */
+ LLAssetType::EType getType() const;
+
+ /** Get the wearable type of a corresponding inventory item */
+ LLWearableType::EType getWearableType() const;
+
+ /** Get the description of a corresponding inventory item */
+ const std::string& getDescription() const;
+
+ /** Get the associated inventory item */
+ LLViewerInventoryItem* getItem() const { return mItem; }
+
+ virtual ~LLPanelInventoryListItemBase(){}
+
+protected:
+
+ LLPanelInventoryListItemBase(LLViewerInventoryItem* item);
+
+ typedef std::vector<LLUICtrl*> widget_array_t;
+
+ /**
+ * Use it from a factory function to build panel, do not build panel in constructor
+ */
+ virtual void init();
+
+ /**
+ * Called after inventory item was updated, update panel widgets to reflect inventory changes.
+ */
+ virtual void updateItem(const std::string& name,
+ const LLStyle::Params& input_params = LLStyle::Params());
+
+ /** setter for mIconCtrl */
+ void setIconCtrl(LLIconCtrl* icon) { mIconCtrl = icon; }
+ /** setter for MTitleCtrl */
+ void setTitleCtrl(LLTextBox* tb) { mTitleCtrl = tb; }
+
+ void setLeftWidgetsWidth(S32 width) { mLeftWidgetsWidth = width; }
+ void setRightWidgetsWidth(S32 width) { mRightWidgetsWidth = width; }
+
+ /**
+ * Set all widgets from both side visible/invisible. Only enabled widgets
+ * (see setShowWidget()) can become visible
+ */
+ virtual void setWidgetsVisible(bool visible);
+
+ /**
+ * Reshape all child widgets - icon, text-box and side widgets
+ */
+ virtual void reshapeWidgets();
+
+ /** set wearable type icon image */
+ void setIconImage(const LLUIImagePtr& image);
+
+ /** Set item title - inventory item name usually */
+ virtual void setTitle(const std::string& title,
+ const std::string& highlit_text,
+ const LLStyle::Params& input_params = LLStyle::Params());
+
+ /**
+ * Show tool tip if item name text size > panel size
+ */
+ virtual BOOL handleToolTip( S32 x, S32 y, MASK mask);
+
+ LLViewerInventoryItem* mItem;
+
+private:
+
+ /** reshape left side widgets
+ * Deprecated for now. Disabled reshape left for now to reserve space for 'delete'
+ * button in LLPanelClothingListItem according to Neal's comment (https://codereview.productengine.com/secondlife/r/325/)
+ */
+ void reshapeLeftWidgets();
+
+ /** reshape right side widgets */
+ void reshapeRightWidgets();
+
+ /** reshape remaining widgets */
+ void reshapeMiddleWidgets();
+
+
+ LLIconCtrl* mIconCtrl;
+ LLTextBox* mTitleCtrl;
+
+ LLUIImagePtr mIconImage;
+ std::string mHighlightedText;
+
+ widget_array_t mLeftSideWidgets;
+ widget_array_t mRightSideWidgets;
+ S32 mWidgetSpacing;
+
+ S32 mLeftWidgetsWidth;
+ S32 mRightWidgetsWidth;
+ bool mNeedsRefresh;
+};
+
+//////////////////////////////////////////////////////////////////////////
+
+class LLInventoryItemsList : public LLFlatListViewEx
+{
+public:
+ struct Params : public LLInitParam::Block<Params, LLFlatListViewEx::Params>
+ {
+ Params();
+ };
+
+ virtual ~LLInventoryItemsList();
+
+ void refreshList(const LLDynamicArray<LLPointer<LLViewerInventoryItem> > item_array);
+
+ boost::signals2::connection setRefreshCompleteCallback(const commit_signal_t::slot_type& cb);
+
+ /**
+ * Let list know items need to be refreshed in next doIdle()
+ */
+ void setNeedsRefresh(bool needs_refresh){ mNeedsRefresh = needs_refresh; }
+
+ bool getNeedsRefresh(){ return mNeedsRefresh; }
+
+ /**
+ * Sets the flag indicating that the list needs to be refreshed even if it is
+ * not currently visible.
+ */
+ void setForceRefresh(bool force_refresh){ mForceRefresh = force_refresh; }
+
+ /**
+ * Idle routine used to refresh the list regardless of the current list
+ * visibility, unlike draw() which is called only for the visible list.
+ * This is needed for example to filter items of the list hidden by closed
+ * accordion tab.
+ */
+ void doIdle(); // Real idle routine
+ static void idle(void* user_data); // static glue to doIdle()
+
+protected:
+ friend class LLUICtrlFactory;
+ LLInventoryItemsList(const LLInventoryItemsList::Params& p);
+
+ uuid_vec_t& getIDs() { return mIDs; }
+
+ /**
+ * Refreshes list items, adds new items and removes deleted items.
+ * Called from doIdle() until all new items are added,
+ * maximum 50 items can be added during single call.
+ */
+ void refresh();
+
+ /**
+ * Compute difference between new items and current items, fills 'vadded' with added items,
+ * 'vremoved' with removed items. See LLCommonUtils::computeDifference
+ */
+ void computeDifference(const uuid_vec_t& vnew, uuid_vec_t& vadded, uuid_vec_t& vremoved);
+
+ /**
+ * Add an item to the list
+ */
+ virtual void addNewItem(LLViewerInventoryItem* item, bool rearrange = true);
+
+private:
+ uuid_vec_t mIDs; // IDs of items that were added in refreshList().
+ // Will be used in refresh() to determine added and removed ids
+ bool mNeedsRefresh;
+
+ bool mForceRefresh;
+
+ commit_signal_t mRefreshCompleteSignal;
+};
+
+#endif //LL_LLINVENTORYITEMSLIST_H
diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp
index 7ec976604a..b9e9f0fc0b 100644
--- a/indra/newview/llinventorymodel.cpp
+++ b/indra/newview/llinventorymodel.cpp
@@ -35,6 +35,7 @@
#include "llagent.h"
#include "llagentwearables.h"
+#include "llappearancemgr.h"
#include "llinventorypanel.h"
#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
@@ -57,32 +58,16 @@
#include "process.h"
#endif
-BOOL LLInventoryModel::sBackgroundFetchActive = FALSE;
-BOOL LLInventoryModel::sAllFoldersFetched = FALSE;
-BOOL LLInventoryModel::sMyInventoryFetchStarted = FALSE;
-BOOL LLInventoryModel::sLibraryFetchStarted = FALSE;
-S32 LLInventoryModel::sNumFetchRetries = 0;
-F32 LLInventoryModel::sMinTimeBetweenFetches = 0.3f;
-F32 LLInventoryModel::sMaxTimeBetweenFetches = 10.f;
-BOOL LLInventoryModel::sTimelyFetchPending = FALSE;
-LLFrameTimer LLInventoryModel::sFetchTimer;
-S16 LLInventoryModel::sBulkFetchCount = 0;
-BOOL LLInventoryModel::sFirstTimeInViewer2 = TRUE;
-
// Increment this if the inventory contents change in a non-backwards-compatible way.
// For viewer 2, the addition of link items makes a pre-viewer-2 cache incorrect.
const S32 LLInventoryModel::sCurrentInvCacheVersion = 2;
-
-// RN: for some reason, using std::queue in the header file confuses the compiler which things it's an xmlrpc_queue
-static std::deque<LLUUID> sFetchQueue;
+BOOL LLInventoryModel::sFirstTimeInViewer2 = TRUE;
///----------------------------------------------------------------------------
/// Local function declarations, constants, enums, and typedefs
///----------------------------------------------------------------------------
//BOOL decompress_file(const char* src_filename, const char* dst_filename);
-const F32 MAX_TIME_FOR_SINGLE_FETCH = 10.f;
-const S32 MAX_FETCH_RETRIES = 10;
const char CACHE_FORMAT_STRING[] = "%s.inv";
struct InventoryIDPtrLess
@@ -335,30 +320,18 @@ void LLInventoryModel::unlockDirectDescendentArrays(const LLUUID& cat_id)
// specifies 'type' as what it defaults to containing. The category is
// not necessarily only for that type. *NOTE: This will create a new
// inventory category on the fly if one does not exist.
-const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType t, bool create_folder, bool find_in_library)
-{
- const LLUUID &rv = findCatUUID(t, find_in_library);
- if(rv.isNull() && isInventoryUsable() && (create_folder && !find_in_library))
- {
- const LLUUID &root_id = gInventory.getRootFolderID();
- if(root_id.notNull())
- {
- return createNewCategory(root_id, t, LLStringUtil::null);
- }
- }
- return rv;
-}
-
-// Internal method which looks for a category with the specified
-// preferred type. Returns LLUUID::null if not found.
-const LLUUID &LLInventoryModel::findCatUUID(LLFolderType::EType preferred_type, bool find_in_library) const
+const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType preferred_type,
+ bool create_folder,
+ bool find_in_library)
{
+ LLUUID rv = LLUUID::null;
+
const LLUUID &root_id = (find_in_library) ? gInventory.getLibraryRootFolderID() : gInventory.getRootFolderID();
if(LLFolderType::FT_ROOT_INVENTORY == preferred_type)
{
- return root_id;
+ rv = root_id;
}
- if(root_id.notNull())
+ else if (root_id.notNull())
{
cat_array_t* cats = NULL;
cats = get_ptr_in_map(mParentChildCategoryTree, root_id);
@@ -369,12 +342,21 @@ const LLUUID &LLInventoryModel::findCatUUID(LLFolderType::EType preferred_type,
{
if(cats->get(i)->getPreferredType() == preferred_type)
{
- return cats->get(i)->getUUID();
+ rv = cats->get(i)->getUUID();
+ break;
}
}
}
}
- return LLUUID::null;
+
+ if(rv.isNull() && isInventoryUsable() && (create_folder && !find_in_library))
+ {
+ if(root_id.notNull())
+ {
+ return createNewCategory(root_id, preferred_type, LLStringUtil::null);
+ }
+ }
+ return rv;
}
// Convenience function to create a new category. You could call
@@ -585,6 +567,11 @@ const LLUUID& LLInventoryModel::getLinkedItemID(const LLUUID& object_id) const
return item->getLinkedUUID();
}
+LLViewerInventoryItem* LLInventoryModel::getLinkedItem(const LLUUID& object_id) const
+{
+ return object_id.notNull() ? getItem(getLinkedItemID(object_id)) : NULL;
+}
+
LLInventoryModel::item_array_t LLInventoryModel::collectLinkedItems(const LLUUID& id,
const LLUUID& start_folder_id)
{
@@ -599,27 +586,6 @@ LLInventoryModel::item_array_t LLInventoryModel::collectLinkedItems(const LLUUID
return items;
}
-// Generates a string containing the path to the item specified by
-// item_id.
-void LLInventoryModel::appendPath(const LLUUID& id, std::string& path) const
-{
- std::string temp;
- const LLInventoryObject* obj = getObject(id);
- LLUUID parent_id;
- if(obj) parent_id = obj->getParentUUID();
- std::string forward_slash("/");
- while(obj)
- {
- obj = getCategory(parent_id);
- if(obj)
- {
- temp.assign(forward_slash + obj->getName() + temp);
- parent_id = obj->getParentUUID();
- }
- }
- path.append(temp);
-}
-
bool LLInventoryModel::isInventoryUsable() const
{
bool result = false;
@@ -755,8 +721,20 @@ U32 LLInventoryModel::updateItem(const LLViewerInventoryItem* item)
// Valid UUID; set the item UUID and rename it
new_item->setCreator(id);
std::string avatar_name;
- // Fetch the currect name
- gCacheName->get(id, FALSE, boost::bind(&LLViewerInventoryItem::onCallingCardNameLookup, new_item.get(), _1, _2, _3));
+
+ if (gCacheName->getFullName(id, avatar_name))
+ {
+ new_item->rename(avatar_name);
+ mask |= LLInventoryObserver::LABEL;
+ }
+ else
+ {
+ // Fetch the current name
+ gCacheName->get(id, FALSE,
+ boost::bind(&LLViewerInventoryItem::onCallingCardNameLookup, new_item.get(),
+ _1, _2, _3));
+ }
+
}
}
else if (new_item->getType() == LLAssetType::AT_GESTURE)
@@ -1040,98 +1018,6 @@ void LLInventoryModel::purgeDescendentsOf(const LLUUID& id)
}
}
-void LLInventoryModel::deleteFromServer(LLDynamicArray<LLUUID>& category_ids,
- LLDynamicArray<LLUUID>& item_ids)
-{
- // Store off tre UUIDS of parents which are being deleted (thus no
- // need to increment) and the parents which are being modified. We
- // have to increment the version of the parent with each message
- // sent upstream since the dataserver will increment each unique
- // parent per update message.
- std::set<LLUUID> ignore_parents;
- update_map_t inc_parents;
-
- S32 i;
- S32 count = category_ids.count();
- BOOL start_new_message = TRUE;
- LLMessageSystem* msg = gMessageSystem;
- LLPointer<LLViewerInventoryCategory> cat;
- for(i = 0; i < count; i++)
- {
- if(start_new_message)
- {
- start_new_message = FALSE;
- msg->newMessageFast(_PREHASH_RemoveInventoryObjects);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- }
- LLUUID cat_id = category_ids.get(i);
-
- msg->nextBlockFast(_PREHASH_FolderData);
- msg->addUUIDFast(_PREHASH_FolderID, cat_id);
- cat = getCategory(cat_id);
- ignore_parents.insert(cat_id);
- addChangedMask(LLInventoryObserver::REMOVE | LLInventoryObserver::STRUCTURE, cat_id);
- if(cat.notNull() && (ignore_parents.find(cat->getParentUUID())==ignore_parents.end()))
- {
- --inc_parents[cat->getParentUUID()];
- }
- if(msg->isSendFullFast(_PREHASH_FolderData))
- {
- start_new_message = TRUE;
- msg->nextBlockFast(_PREHASH_ItemData);
- msg->addUUIDFast(_PREHASH_ItemID, LLUUID::null);
- gAgent.sendReliableMessage();
- accountForUpdate(inc_parents);
- inc_parents.clear();
- }
- }
-
- count = item_ids.count();
- std::set<LLUUID>::iterator not_ignored = ignore_parents.end();
- LLPointer<LLViewerInventoryItem> item;
- if((0 == count) && (!start_new_message))
- {
- msg->nextBlockFast(_PREHASH_ItemData);
- msg->addUUIDFast(_PREHASH_ItemID, LLUUID::null);
- }
- for(i = 0; i < count; i++)
- {
- if(start_new_message)
- {
- start_new_message = FALSE;
- msg->newMessageFast(_PREHASH_RemoveInventoryObjects);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->nextBlockFast(_PREHASH_FolderData);
- msg->addUUIDFast(_PREHASH_FolderID, LLUUID::null);
- }
- LLUUID item_id = item_ids.get(i);
- msg->nextBlockFast(_PREHASH_ItemData);
- msg->addUUIDFast(_PREHASH_ItemID, item_id);
- item = getItem(item_id);
- addChangedMask(LLInventoryObserver::REMOVE | LLInventoryObserver::STRUCTURE, item_id);
- if(item.notNull() && (ignore_parents.find(item->getParentUUID()) == not_ignored))
- {
- --inc_parents[item->getParentUUID()];
- }
- if(msg->isSendFullFast(_PREHASH_ItemData))
- {
- start_new_message = TRUE;
- gAgent.sendReliableMessage();
- accountForUpdate(inc_parents);
- inc_parents.clear();
- }
- }
- if(!start_new_message)
- {
- gAgent.sendReliableMessage();
- accountForUpdate(inc_parents);
- }
-}
-
// Add/remove an observer. If the observer is destroyed, be sure to
// remove it.
void LLInventoryModel::addObserver(LLInventoryObserver* observer)
@@ -1222,29 +1108,7 @@ void LLInventoryModel::addChangedMask(U32 mask, const LLUUID& referent)
}
}
-// This method to prepares a set of mock inventory which provides
-// minimal functionality before the actual arrival of inventory.
-/*
-void LLInventoryModel::mock(const LLUUID& root_id)
-{
- llinfos << "LLInventoryModel::mock() " << root_id << llendl;
- if(root_id.isNull())
- {
- llwarns << "Not a valid root id" << llendl;
- return;
- }
- LLPointer<LLViewerInventoryCategory> cat = new LLViewerInventoryCategory(
- root_id,
- LLUUID::null,
- LLAssetType::AT_CATEGORY,
- LLFolderType::lookupNewCategoryName(LLFolderType::FT_ROOT_INVENTORY),
- gAgent.getID());
- addCategory(cat);
- gInventory.buildParentChildMap();
-}
-*/
-
-//If we get back a normal response, handle it here
+// If we get back a normal response, handle it here
void LLInventoryModel::fetchInventoryResponder::result(const LLSD& content)
{
start_new_inventory_observer();
@@ -1317,7 +1181,7 @@ void LLInventoryModel::fetchInventoryResponder::error(U32 status, const std::str
gInventory.notifyObservers("fetchinventory");
}
-bool LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id)
+bool LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id) const
{
if(folder_id.isNull())
{
@@ -1342,544 +1206,7 @@ bool LLInventoryModel::fetchDescendentsOf(const LLUUID& folder_id)
//{
// known_descendents += items->count();
//}
- return cat->fetchDescendents();
-}
-
-//Initialize statics.
-bool LLInventoryModel::isBulkFetchProcessingComplete()
-{
- return sFetchQueue.empty() && sBulkFetchCount<=0;
-}
-
-class LLInventoryModelFetchDescendentsResponder: public LLHTTPClient::Responder
-{
- public:
- LLInventoryModelFetchDescendentsResponder(const LLSD& request_sd) : mRequestSD(request_sd) {};
- //LLInventoryModelFetchDescendentsResponder() {};
- void result(const LLSD& content);
- void error(U32 status, const std::string& reason);
- public:
- typedef std::vector<LLViewerInventoryCategory*> folder_ref_t;
- protected:
- LLSD mRequestSD;
-};
-
-//If we get back a normal response, handle it here
-void LLInventoryModelFetchDescendentsResponder::result(const LLSD& content)
-{
- if (content.has("folders"))
- {
-
- for(LLSD::array_const_iterator folder_it = content["folders"].beginArray();
- folder_it != content["folders"].endArray();
- ++folder_it)
- {
- LLSD folder_sd = *folder_it;
-
-
- //LLUUID agent_id = folder_sd["agent_id"];
-
- //if(agent_id != gAgent.getID()) //This should never happen.
- //{
- // llwarns << "Got a UpdateInventoryItem for the wrong agent."
- // << llendl;
- // break;
- //}
-
- LLUUID parent_id = folder_sd["folder_id"];
- LLUUID owner_id = folder_sd["owner_id"];
- S32 version = (S32)folder_sd["version"].asInteger();
- S32 descendents = (S32)folder_sd["descendents"].asInteger();
- LLPointer<LLViewerInventoryCategory> tcategory = new LLViewerInventoryCategory(owner_id);
-
- if (parent_id.isNull())
- {
- LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem;
- for(LLSD::array_const_iterator item_it = folder_sd["items"].beginArray();
- item_it != folder_sd["items"].endArray();
- ++item_it)
- {
- const LLUUID lost_uuid = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
- if (lost_uuid.notNull())
- {
- LLSD item = *item_it;
- titem->unpackMessage(item);
-
- LLInventoryModel::update_list_t update;
- LLInventoryModel::LLCategoryUpdate new_folder(lost_uuid, 1);
- update.push_back(new_folder);
- gInventory.accountForUpdate(update);
-
- titem->setParent(lost_uuid);
- titem->updateParentOnServer(FALSE);
- gInventory.updateItem(titem);
- gInventory.notifyObservers("fetchDescendents");
-
- }
- }
- }
-
- LLViewerInventoryCategory* pcat = gInventory.getCategory(parent_id);
- if (!pcat)
- {
- continue;
- }
-
- for(LLSD::array_const_iterator category_it = folder_sd["categories"].beginArray();
- category_it != folder_sd["categories"].endArray();
- ++category_it)
- {
- LLSD category = *category_it;
- tcategory->fromLLSD(category);
-
- if (LLInventoryModel::sMyInventoryFetchStarted ||
- LLInventoryModel::sLibraryFetchStarted)
- {
- sFetchQueue.push_back(tcategory->getUUID());
- }
- else if ( !gInventory.isCategoryComplete(tcategory->getUUID()) )
- {
- gInventory.updateCategory(tcategory);
- }
-
- }
- LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem;
- for(LLSD::array_const_iterator item_it = folder_sd["items"].beginArray();
- item_it != folder_sd["items"].endArray();
- ++item_it)
- {
- LLSD item = *item_it;
- titem->unpackMessage(item);
-
- gInventory.updateItem(titem);
- }
-
- // set version and descendentcount according to message.
- LLViewerInventoryCategory* cat = gInventory.getCategory(parent_id);
- if(cat)
- {
- cat->setVersion(version);
- cat->setDescendentCount(descendents);
- cat->determineFolderType();
- }
-
- }
- }
-
- if (content.has("bad_folders"))
- {
- for(LLSD::array_const_iterator folder_it = content["bad_folders"].beginArray();
- folder_it != content["bad_folders"].endArray();
- ++folder_it)
- {
- LLSD folder_sd = *folder_it;
-
- //These folders failed on the dataserver. We probably don't want to retry them.
- llinfos << "Folder " << folder_sd["folder_id"].asString()
- << "Error: " << folder_sd["error"].asString() << llendl;
- }
- }
-
- LLInventoryModel::incrBulkFetch(-1);
-
- if (LLInventoryModel::isBulkFetchProcessingComplete())
- {
- llinfos << "Inventory fetch completed" << llendl;
- LLInventoryModel::setAllFoldersFetched();
- }
-
- gInventory.notifyObservers("fetchDescendents");
-}
-
-//If we get back an error (not found, etc...), handle it here
-void LLInventoryModelFetchDescendentsResponder::error(U32 status, const std::string& reason)
-{
- llinfos << "LLInventoryModelFetchDescendentsResponder::error "
- << status << ": " << reason << llendl;
-
- LLInventoryModel::incrBulkFetch(-1);
-
- if (status==499) //timed out. Let's be awesome!
- {
- for(LLSD::array_const_iterator folder_it = mRequestSD["folders"].beginArray();
- folder_it != mRequestSD["folders"].endArray();
- ++folder_it)
- {
- LLSD folder_sd = *folder_it;
- LLUUID folder_id = folder_sd["folder_id"];
- sFetchQueue.push_front(folder_id);
- }
- }
- else
- {
- if (LLInventoryModel::isBulkFetchProcessingComplete())
- {
- LLInventoryModel::setAllFoldersFetched();
- }
- }
- gInventory.notifyObservers("fetchDescendents");
-}
-
-//static Bundle up a bunch of requests to send all at once.
-void LLInventoryModel::bulkFetch(std::string url)
-{
- //Background fetch is called from gIdleCallbacks in a loop until background fetch is stopped.
- //If there are items in sFetchQueue, we want to check the time since the last bulkFetch was
- //sent. If it exceeds our retry time, go ahead and fire off another batch.
- //Stopbackgroundfetch will be run from the Responder instead of here.
-
- S16 max_concurrent_fetches=8;
- F32 new_min_time = 0.5f; //HACK! Clean this up when old code goes away entirely.
- if (sMinTimeBetweenFetches < new_min_time) sMinTimeBetweenFetches=new_min_time; //HACK! See above.
-
- if(gDisconnected
- || sBulkFetchCount > max_concurrent_fetches
- || sFetchTimer.getElapsedTimeF32() < sMinTimeBetweenFetches)
- {
- return; // just bail if we are disconnected.
- }
-
- U32 folder_count=0;
- U32 max_batch_size=5;
-
- U32 sort_order = gSavedSettings.getU32("InventorySortOrder") & 0x1;
-
- LLSD body;
- LLSD body_lib;
- while( !(sFetchQueue.empty() ) && (folder_count < max_batch_size) )
- {
- if (sFetchQueue.front().isNull()) //DEV-17797
- {
- LLSD folder_sd;
- folder_sd["folder_id"] = LLUUID::null.asString();
- folder_sd["owner_id"] = gAgent.getID();
- folder_sd["sort_order"] = (LLSD::Integer)sort_order;
- folder_sd["fetch_folders"] = (LLSD::Boolean)FALSE;
- folder_sd["fetch_items"] = (LLSD::Boolean)TRUE;
- body["folders"].append(folder_sd);
- folder_count++;
- }
- else
- {
-
-
- LLViewerInventoryCategory* cat = gInventory.getCategory(sFetchQueue.front());
-
- if (cat)
- {
- if ( LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion())
- {
- LLSD folder_sd;
- folder_sd["folder_id"] = cat->getUUID();
- folder_sd["owner_id"] = cat->getOwnerID();
- folder_sd["sort_order"] = (LLSD::Integer)sort_order;
- folder_sd["fetch_folders"] = TRUE; //(LLSD::Boolean)sFullFetchStarted;
- folder_sd["fetch_items"] = (LLSD::Boolean)TRUE;
-
- if (ALEXANDRIA_LINDEN_ID == cat->getOwnerID())
- body_lib["folders"].append(folder_sd);
- else
- body["folders"].append(folder_sd);
- folder_count++;
- }
- if (sMyInventoryFetchStarted ||
- sLibraryFetchStarted)
- { //Already have this folder but append child folders to list.
- // add all children to queue
- parent_cat_map_t::iterator cat_it = gInventory.mParentChildCategoryTree.find(cat->getUUID());
- if (cat_it != gInventory.mParentChildCategoryTree.end())
- {
- cat_array_t* child_categories = cat_it->second;
-
- for (S32 child_num = 0; child_num < child_categories->count(); child_num++)
- {
- sFetchQueue.push_back(child_categories->get(child_num)->getUUID());
- }
- }
-
- }
- }
- }
- sFetchQueue.pop_front();
- }
-
- if (folder_count > 0)
- {
- sBulkFetchCount++;
- if (body["folders"].size())
- {
- LLHTTPClient::post(url, body, new LLInventoryModelFetchDescendentsResponder(body),300.0);
- }
- if (body_lib["folders"].size())
- {
- std::string url_lib = gAgent.getRegion()->getCapability("FetchLibDescendents");
- LLHTTPClient::post(url_lib, body_lib, new LLInventoryModelFetchDescendentsResponder(body_lib),300.0);
- }
- sFetchTimer.reset();
- }
- else if (isBulkFetchProcessingComplete())
- {
- setAllFoldersFetched();
- }
-}
-
-bool fetchQueueContainsNoDescendentsOf(const LLUUID& cat_id)
-{
- for (std::deque<LLUUID>::iterator it = sFetchQueue.begin();
- it != sFetchQueue.end(); ++it)
- {
- const LLUUID& fetch_id = *it;
- if (gInventory.isObjectDescendentOf(fetch_id, cat_id))
- return false;
- }
- return true;
-}
-
-/* static */
-bool LLInventoryModel::libraryFetchStarted()
-{
- return sLibraryFetchStarted;
-}
-
-/* static */
-bool LLInventoryModel::libraryFetchCompleted()
-{
- return libraryFetchStarted() && fetchQueueContainsNoDescendentsOf(gInventory.getLibraryRootFolderID());
-}
-
-/* static */
-bool LLInventoryModel::libraryFetchInProgress()
-{
- return libraryFetchStarted() && !libraryFetchCompleted();
-}
-
-/* static */
-bool LLInventoryModel::myInventoryFetchStarted()
-{
- return sMyInventoryFetchStarted;
-}
-
-/* static */
-bool LLInventoryModel::myInventoryFetchCompleted()
-{
- return myInventoryFetchStarted() && fetchQueueContainsNoDescendentsOf(gInventory.getRootFolderID());
-}
-
-/* static */
-bool LLInventoryModel::myInventoryFetchInProgress()
-{
- return myInventoryFetchStarted() && !myInventoryFetchCompleted();
-}
-
-// static
-bool LLInventoryModel::isEverythingFetched()
-{
- return sAllFoldersFetched;
-}
-
-//static
-BOOL LLInventoryModel::backgroundFetchActive()
-{
- return sBackgroundFetchActive;
-}
-
-void LLInventoryModel::startBackgroundFetch(const LLUUID& cat_id)
-{
- if (!sAllFoldersFetched)
- {
- sBackgroundFetchActive = TRUE;
- if (cat_id.isNull())
- {
- if (!sMyInventoryFetchStarted)
- {
- sMyInventoryFetchStarted = TRUE;
- sFetchQueue.push_back(gInventory.getRootFolderID());
- gIdleCallbacks.addFunction(&LLInventoryModel::backgroundFetch, NULL);
- }
- if (!sLibraryFetchStarted)
- {
- sLibraryFetchStarted = TRUE;
- sFetchQueue.push_back(gInventory.getLibraryRootFolderID());
- gIdleCallbacks.addFunction(&LLInventoryModel::backgroundFetch, NULL);
- }
- }
- else
- {
- // specific folder requests go to front of queue
- if (sFetchQueue.empty() || sFetchQueue.front() != cat_id)
- {
- sFetchQueue.push_front(cat_id);
- gIdleCallbacks.addFunction(&LLInventoryModel::backgroundFetch, NULL);
- }
- if (cat_id == gInventory.getLibraryRootFolderID())
- {
- sLibraryFetchStarted = TRUE;
- }
- if (cat_id == gInventory.getRootFolderID())
- {
- sMyInventoryFetchStarted = TRUE;
- }
- }
- }
-}
-
-//static
-void LLInventoryModel::findLostItems()
-{
- sBackgroundFetchActive = TRUE;
- sFetchQueue.push_back(LLUUID::null);
- gIdleCallbacks.addFunction(&LLInventoryModel::backgroundFetch, NULL);
-}
-
-//static
-void LLInventoryModel::stopBackgroundFetch()
-{
- if (sBackgroundFetchActive)
- {
- sBackgroundFetchActive = FALSE;
- gIdleCallbacks.deleteFunction(&LLInventoryModel::backgroundFetch, NULL);
- sBulkFetchCount=0;
- sMinTimeBetweenFetches=0.0f;
- }
-}
-
-// static
-void LLInventoryModel::setAllFoldersFetched()
-{
- if (sMyInventoryFetchStarted &&
- sLibraryFetchStarted)
- {
- sAllFoldersFetched = TRUE;
- }
- stopBackgroundFetch();
-}
-
-//static
-void LLInventoryModel::backgroundFetch(void*)
-{
- if (sBackgroundFetchActive && gAgent.getRegion())
- {
- //If we'll be using the capability, we'll be sending batches and the background thing isn't as important.
- std::string url = gAgent.getRegion()->getCapability("WebFetchInventoryDescendents");
- if (!url.empty())
- {
- bulkFetch(url);
- return;
- }
-
- //DEPRECATED OLD CODE FOLLOWS.
- // no more categories to fetch, stop fetch process
- if (sFetchQueue.empty())
- {
- llinfos << "Inventory fetch completed" << llendl;
-
- setAllFoldersFetched();
- return;
- }
-
- F32 fast_fetch_time = lerp(sMinTimeBetweenFetches, sMaxTimeBetweenFetches, 0.1f);
- F32 slow_fetch_time = lerp(sMinTimeBetweenFetches, sMaxTimeBetweenFetches, 0.5f);
- if (sTimelyFetchPending && sFetchTimer.getElapsedTimeF32() > slow_fetch_time)
- {
- // double timeouts on failure
- sMinTimeBetweenFetches = llmin(sMinTimeBetweenFetches * 2.f, 10.f);
- sMaxTimeBetweenFetches = llmin(sMaxTimeBetweenFetches * 2.f, 120.f);
- llinfos << "Inventory fetch times grown to (" << sMinTimeBetweenFetches << ", " << sMaxTimeBetweenFetches << ")" << llendl;
- // fetch is no longer considered "timely" although we will wait for full time-out
- sTimelyFetchPending = FALSE;
- }
-
- while(1)
- {
- if (sFetchQueue.empty())
- {
- break;
- }
-
- if(gDisconnected)
- {
- // just bail if we are disconnected.
- break;
- }
-
- LLViewerInventoryCategory* cat = gInventory.getCategory(sFetchQueue.front());
-
- // category has been deleted, remove from queue.
- if (!cat)
- {
- sFetchQueue.pop_front();
- continue;
- }
-
- if (sFetchTimer.getElapsedTimeF32() > sMinTimeBetweenFetches &&
- LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion())
- {
- // category exists but has no children yet, fetch the descendants
- // for now, just request every time and rely on retry timer to throttle
- if (cat->fetchDescendents())
- {
- sFetchTimer.reset();
- sTimelyFetchPending = TRUE;
- }
- else
- {
- // The catagory also tracks if it has expired and here it says it hasn't
- // yet. Get out of here because nothing is going to happen until we
- // update the timers.
- break;
- }
- }
- // do I have all my children?
- else if (gInventory.isCategoryComplete(sFetchQueue.front()))
- {
- // finished with this category, remove from queue
- sFetchQueue.pop_front();
-
- // add all children to queue
- parent_cat_map_t::iterator cat_it = gInventory.mParentChildCategoryTree.find(cat->getUUID());
- if (cat_it != gInventory.mParentChildCategoryTree.end())
- {
- cat_array_t* child_categories = cat_it->second;
-
- for (S32 child_num = 0; child_num < child_categories->count(); child_num++)
- {
- sFetchQueue.push_back(child_categories->get(child_num)->getUUID());
- }
- }
-
- // we received a response in less than the fast time
- if (sTimelyFetchPending && sFetchTimer.getElapsedTimeF32() < fast_fetch_time)
- {
- // shrink timeouts based on success
- sMinTimeBetweenFetches = llmax(sMinTimeBetweenFetches * 0.8f, 0.3f);
- sMaxTimeBetweenFetches = llmax(sMaxTimeBetweenFetches * 0.8f, 10.f);
- //llinfos << "Inventory fetch times shrunk to (" << sMinTimeBetweenFetches << ", " << sMaxTimeBetweenFetches << ")" << llendl;
- }
-
- sTimelyFetchPending = FALSE;
- continue;
- }
- else if (sFetchTimer.getElapsedTimeF32() > sMaxTimeBetweenFetches)
- {
- // received first packet, but our num descendants does not match db's num descendants
- // so try again later
- LLUUID fetch_id = sFetchQueue.front();
- sFetchQueue.pop_front();
-
- if (sNumFetchRetries++ < MAX_FETCH_RETRIES)
- {
- // push on back of queue
- sFetchQueue.push_back(fetch_id);
- }
- sTimelyFetchPending = FALSE;
- sFetchTimer.reset();
- break;
- }
-
- // not enough time has elapsed to do a new fetch
- break;
- }
- }
+ return cat->fetch();
}
void LLInventoryModel::cache(
@@ -1935,25 +1262,26 @@ void LLInventoryModel::addCategory(LLViewerInventoryCategory* category)
void LLInventoryModel::addItem(LLViewerInventoryItem* item)
{
- //llinfos << "LLInventoryModel::addItem()" << llendl;
-
- // This can happen if assettype enums from llassettype.h ever change.
- // For example, there is a known backwards compatibility issue in some viewer prototypes prior to when
- // the AT_LINK enum changed from 23 to 24.
- if ((item->getType() == LLAssetType::AT_NONE)
- || LLAssetType::lookup(item->getType()) == LLAssetType::badLookup())
- {
- llwarns << "Got bad asset type for item [ name: " << item->getName() << " type: " << item->getType() << " inv-type: " << item->getInventoryType() << " ], ignoring." << llendl;
- return;
- }
+ llassert(item);
if(item)
{
+ // This can happen if assettype enums from llassettype.h ever change.
+ // For example, there is a known backwards compatibility issue in some viewer prototypes prior to when
+ // the AT_LINK enum changed from 23 to 24.
+ if ((item->getType() == LLAssetType::AT_NONE)
+ || LLAssetType::lookup(item->getType()) == LLAssetType::badLookup())
+ {
+ llwarns << "Got bad asset type for item [ name: " << item->getName() << " type: " << item->getType() << " inv-type: " << item->getInventoryType() << " ], ignoring." << llendl;
+ return;
+ }
+
// This condition means that we tried to add a link without the baseobj being in memory.
// The item will show up as a broken link.
if (item->getIsBrokenLink())
{
llinfos << "Adding broken link [ name: " << item->getName() << " itemID: " << item->getUUID() << " assetID: " << item->getAssetUUID() << " ) parent: " << item->getParentUUID() << llendl;
}
+
mItemMap[item->getUUID()] = item;
}
}
@@ -2386,88 +1714,6 @@ bool LLInventoryModel::loadSkeleton(
return rv;
}
-bool LLInventoryModel::loadMeat(const LLSD& options, const LLUUID& owner_id)
-{
- llinfos << "importing inventory for " << owner_id << llendl;
- bool rv = true;
- for(LLSD::array_const_iterator it = options.beginArray(),
- end = options.endArray(); it != end; ++it)
- {
- LLSD name = (*it)["name"];
- LLSD item_id = (*it)["item_id"];
- LLSD parent_id = (*it)["parent_id"];
- LLSD asset_type = (*it)["type"];
- LLSD data_id = (*it)["data_id"];
- if(name.isDefined()
- && item_id.isDefined()
- && parent_id.isDefined()
- && asset_type.isDefined()
- && data_id.isDefined())
- {
- LLPointer<LLViewerInventoryItem> item = new LLViewerInventoryItem;
- item->rename(name.asString());
- item->setUUID(item_id.asUUID());
- item->setParent(parent_id.asUUID());
- LLAssetType::EType type = (LLAssetType::EType)asset_type.asInteger();
- item->setType(type);
-
- LLSD llsd_inv_type = (*it)["inv_type"];
- if(llsd_inv_type.isDefined())
- {
- LLInventoryType::EType inv_type = (LLInventoryType::EType)llsd_inv_type.asInteger();
- item->setInventoryType(inv_type);
- }
-
- if(LLAssetType::AT_CALLINGCARD == type)
- {
- LLPermissions perm;
- perm.init(data_id.asUUID(), owner_id, LLUUID::null, LLUUID::null);
- item->setPermissions(perm);
- }
- else
- {
- LLPermissions default_perm;
- default_perm.init(LLUUID::null, owner_id, LLUUID::null, LLUUID::null);
- LLSD llsd_perm_mask = (*it)["perm_mask"];
- if(llsd_perm_mask.isDefined())
- {
- PermissionMask perm_mask = llsd_perm_mask.asInteger();
- default_perm.initMasks(
- perm_mask, perm_mask, perm_mask, perm_mask, perm_mask);
- }
- else
- {
- default_perm.initMasks(
- PERM_NONE, PERM_NONE, PERM_NONE, PERM_NONE, PERM_NONE);
- }
- item->setPermissions(default_perm);
- item->setAssetUUID(data_id.asUUID());
- }
-
- LLSD flags = (*it)["flags"];
- if(flags.isDefined())
- {
- // Not sure how well LLSD.asInteger() maps to
- // unsigned long - using strtoul()
- item->setFlags(strtoul(flags.asString().c_str(), NULL, 0));
- }
-
- LLSD time = (*it)["time"];
- if(time.isDefined())
- {
- item->setCreationDate(time.asInteger());
- }
- addItem(item);
- }
- else
- {
- llwarns << "Unable to import near " << name.asString() << llendl;
- rv = false;
- }
- }
- return rv;
-}
-
// This is a brute force method to rebuild the entire parent-child
// relations. The overall operation has O(NlogN) performance, which
// should be sufficient for our needs.
@@ -2592,7 +1838,7 @@ void LLInventoryModel::buildParentChildMap()
}
count = items.count();
lost = 0;
- std::vector<LLUUID> lost_item_ids;
+ uuid_vec_t lost_item_ids;
for(i = 0; i < count; ++i)
{
LLPointer<LLViewerInventoryItem> item;
@@ -2631,7 +1877,7 @@ void LLInventoryModel::buildParentChildMap()
LLMessageSystem* msg = gMessageSystem;
BOOL start_new_message = TRUE;
const LLUUID lnf = findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
- for(std::vector<LLUUID>::iterator it = lost_item_ids.begin() ; it < lost_item_ids.end(); ++it)
+ for(uuid_vec_t::iterator it = lost_item_ids.begin() ; it < lost_item_ids.end(); ++it)
{
if(start_new_message)
{
@@ -2735,73 +1981,6 @@ bool LLUUIDAndName::operator>(const LLUUIDAndName& rhs) const
return (mID > rhs.mID);
}
-// Given the current state of the inventory items, figure out the
-// clone information. *FIX: This is sub-optimal, since we can insert
-// this information snurgically, but this makes sure the implementation
-// works before we worry about optimization.
-//void LLInventoryModel::recalculateCloneInformation()
-//{
-// //dumpInventory();
-//
-// // This implements a 'multi-map' like structure to keep track of
-// // how many clones we find.
-// typedef LLDynamicArray<LLViewerInventoryItem*> viewer_item_array_t;
-// typedef std::map<LLUUIDAndName, viewer_item_array_t*> clone_map_t;
-// clone_map_t clone_map;
-// LLUUIDAndName id_and_name;
-// viewer_item_array_t* clones = NULL;
-// LLViewerInventoryItem* item = NULL;
-// for(item = (LLViewerInventoryItem*)mItemMap.getFirstData();
-// item != NULL;
-// item = (LLViewerInventoryItem*)mItemMap.getNextData())
-// {
-// if(item->getType() == LLAssetType::AT_CALLINGCARD)
-// {
-// // if it's a calling card, we key off of the creator id, not
-// // the asset id.
-// id_and_name.mID = item->getCreatorUUID();
-// }
-// else
-// {
-// // if it's not a calling card, we key clones from the
-// // asset id.
-// id_and_name.mID = item->getAssetUUID();
-// }
-// if(id_and_name.mID == LLUUID::null)
-// {
-// continue;
-// }
-// id_and_name.mName = item->getName();
-// if(clone_map.checkData(id_and_name))
-// {
-// clones = clone_map.getData(id_and_name);
-// }
-// else
-// {
-// clones = new viewer_item_array_t;
-// clone_map.addData(id_and_name, clones);
-// }
-// clones->put(item);
-// }
-//
-// S32 count = 0;
-// for(clones = clone_map.getFirstData();
-// clones != NULL;
-// clones = clone_map.getNextData())
-// {
-// count = clones->count();
-// for(S32 i = 0; i < count; i++)
-// {
-// item = clones->get(i);
-// item->setCloneCount(count - 1);
-// //clones[i] = NULL;
-// }
-// delete clones;
-// }
-// clone_map.removeAllData();
-// //dumpInventory();
-//}
-
// static
bool LLInventoryModel::loadFromFile(const std::string& filename,
LLInventoryModel::cat_array_t& categories,
@@ -3091,7 +2270,7 @@ void LLInventoryModel::processRemoveInventoryItem(LLMessageSystem* msg, void**)
return;
}
S32 count = msg->getNumberOfBlocksFast(_PREHASH_InventoryData);
- std::vector<LLUUID> item_ids;
+ uuid_vec_t item_ids;
update_map_t update;
for(S32 i = 0; i < count; ++i)
{
@@ -3107,7 +2286,7 @@ void LLInventoryModel::processRemoveInventoryItem(LLMessageSystem* msg, void**)
}
}
gInventory.accountForUpdate(update);
- for(std::vector<LLUUID>::iterator it = item_ids.begin(); it != item_ids.end(); ++it)
+ for(uuid_vec_t::iterator it = item_ids.begin(); it != item_ids.end(); ++it)
{
gInventory.deleteObject(*it);
}
@@ -3187,7 +2366,7 @@ void LLInventoryModel::processRemoveInventoryFolder(LLMessageSystem* msg,
<< llendl;
return;
}
- std::vector<LLUUID> folder_ids;
+ uuid_vec_t folder_ids;
update_map_t update;
S32 count = msg->getNumberOfBlocksFast(_PREHASH_FolderData);
for(S32 i = 0; i < count; ++i)
@@ -3201,7 +2380,7 @@ void LLInventoryModel::processRemoveInventoryFolder(LLMessageSystem* msg,
}
}
gInventory.accountForUpdate(update);
- for(std::vector<LLUUID>::iterator it = folder_ids.begin(); it != folder_ids.end(); ++it)
+ for(uuid_vec_t::iterator it = folder_ids.begin(); it != folder_ids.end(); ++it)
{
gInventory.deleteObject(*it);
}
@@ -3268,7 +2447,9 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**)
}
LLUUID tid;
msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_TransactionID, tid);
+#ifndef LL_RELEASE_FOR_DOWNLOAD
llinfos << "Bulk inventory: " << tid << llendl;
+#endif
update_map_t update;
cat_array_t folders;
@@ -3314,7 +2495,7 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**)
count = msg->getNumberOfBlocksFast(_PREHASH_ItemData);
- std::vector<LLUUID> wearable_ids;
+ uuid_vec_t wearable_ids;
item_array_t items;
std::list<InventoryCallbackInfo> cblist;
for(i = 0; i < count; ++i)
@@ -3389,7 +2570,7 @@ void LLInventoryModel::processBulkUpdateInventory(LLMessageSystem* msg, void**)
{
LLViewerInventoryItem* wearable_item;
wearable_item = gInventory.getItem(wearable_ids[i]);
- wear_inventory_item_on_avatar(wearable_item);
+ LLAppearanceMgr::instance().wearItemOnAvatar(wearable_item->getUUID(), true, true);
}
}
@@ -3647,6 +2828,10 @@ static LLInventoryModel::item_array_t::iterator find_item_iter_by_uuid(LLInvento
}
// static
+// * @param[in, out] items - vector with items to be updated. It should be sorted in a right way
+// * before calling this method.
+// * @param src_item_id - LLUUID of inventory item to be moved in new position
+// * @param dest_item_id - LLUUID of inventory item before which source item should be placed.
void LLInventoryModel::updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& src_item_id, const LLUUID& dest_item_id)
{
LLInventoryModel::item_array_t::iterator it_src = find_item_iter_by_uuid(items, src_item_id);
@@ -3662,6 +2847,7 @@ void LLInventoryModel::updateItemsOrder(LLInventoryModel::item_array_t& items, c
items.insert(it_dest, src_item);
}
+//* @param[in] items vector of items in order to be saved.
void LLInventoryModel::saveItemsOrder(const LLInventoryModel::item_array_t& items)
{
int sortField = 0;
@@ -3705,6 +2891,8 @@ static void rearrange_item_order_by_sort_field(LLInventoryModel::item_array_t& i
std::sort(items.begin(), items.end(), sort_functor);
}
+// * @param source_item_id - LLUUID of the source item to be moved into new position
+// * @param target_item_id - LLUUID of the target item before which source item should be placed.
void LLInventoryModel::rearrangeFavoriteLandmarks(const LLUUID& source_item_id, const LLUUID& target_item_id)
{
LLInventoryModel::cat_array_t cats;
@@ -3761,207 +2949,6 @@ void LLInventoryModel::dumpInventory() const
}
///----------------------------------------------------------------------------
-/// LLInventoryCollectFunctor implementations
-///----------------------------------------------------------------------------
-
-// static
-bool LLInventoryCollectFunctor::itemTransferCommonlyAllowed(LLInventoryItem* item)
-{
- if (!item)
- return false;
-
- bool allowed = false;
- LLVOAvatarSelf* my_avatar = NULL;
-
- switch(item->getType())
- {
- case LLAssetType::AT_CALLINGCARD:
- // not allowed
- break;
-
- case LLAssetType::AT_OBJECT:
- my_avatar = gAgent.getAvatarObject();
- if(my_avatar && !my_avatar->isWearingAttachment(item->getUUID()))
- {
- allowed = true;
- }
- break;
-
- case LLAssetType::AT_BODYPART:
- case LLAssetType::AT_CLOTHING:
- if(!gAgentWearables.isWearingItem(item->getUUID()))
- {
- allowed = true;
- }
- break;
-
- default:
- allowed = true;
- break;
- }
-
- return allowed;
-}
-
-bool LLIsType::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
-{
- if(mType == LLAssetType::AT_CATEGORY)
- {
- if(cat) return TRUE;
- }
- if(item)
- {
- if(item->getType() == mType) return TRUE;
- }
- return FALSE;
-}
-
-bool LLIsNotType::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
-{
- if(mType == LLAssetType::AT_CATEGORY)
- {
- if(cat) return FALSE;
- }
- if(item)
- {
- if(item->getType() == mType) return FALSE;
- else return TRUE;
- }
- return TRUE;
-}
-
-bool LLIsTypeWithPermissions::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
-{
- if(mType == LLAssetType::AT_CATEGORY)
- {
- if(cat)
- {
- return TRUE;
- }
- }
- if(item)
- {
- if(item->getType() == mType)
- {
- LLPermissions perm = item->getPermissions();
- if ((perm.getMaskBase() & mPerm) == mPerm)
- {
- return TRUE;
- }
- }
- }
- return FALSE;
-}
-
-
-//bool LLIsClone::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
-//{
-// if(cat) return FALSE;
-// if(item)
-// {
-// if(mItemMap->getType() == LLAssetType::AT_CALLINGCARD)
-// {
-// if((item->getType() == LLAssetType::AT_CALLINGCARD)
-// && !(item->getCreatorUUID().isNull())
-// && (item->getCreatorUUID() == mItemMap->getCreatorUUID()))
-// {
-// return TRUE;
-// }
-// }
-// else
-// {
-// if((item->getType() == mItemMap->getType())
-// && !(item->getAssetUUID().isNull())
-// && (item->getAssetUUID() == mItemMap->getAssetUUID())
-// && (item->getName() == mItemMap->getName()))
-// {
-// return TRUE;
-// }
-// }
-// }
-// return FALSE;
-//}
-
-bool LLBuddyCollector::operator()(LLInventoryCategory* cat,
- LLInventoryItem* item)
-{
- if(item)
- {
- if((LLAssetType::AT_CALLINGCARD == item->getType())
- && (!item->getCreatorUUID().isNull())
- && (item->getCreatorUUID() != gAgent.getID()))
- {
- return true;
- }
- }
- return false;
-}
-
-
-bool LLUniqueBuddyCollector::operator()(LLInventoryCategory* cat,
- LLInventoryItem* item)
-{
- if(item)
- {
- if((LLAssetType::AT_CALLINGCARD == item->getType())
- && (item->getCreatorUUID().notNull())
- && (item->getCreatorUUID() != gAgent.getID()))
- {
- mSeen.insert(item->getCreatorUUID());
- return true;
- }
- }
- return false;
-}
-
-
-bool LLParticularBuddyCollector::operator()(LLInventoryCategory* cat,
- LLInventoryItem* item)
-{
- if(item)
- {
- if((LLAssetType::AT_CALLINGCARD == item->getType())
- && (item->getCreatorUUID() == mBuddyID))
- {
- return TRUE;
- }
- }
- return FALSE;
-}
-
-
-bool LLNameCategoryCollector::operator()(
- LLInventoryCategory* cat, LLInventoryItem* item)
-{
- if(cat)
- {
- if (!LLStringUtil::compareInsensitive(mName, cat->getName()))
- {
- return true;
- }
- }
- return false;
-}
-
-///----------------------------------------------------------------------------
-/// LLAssetIDMatches
-///----------------------------------------------------------------------------
-bool LLAssetIDMatches::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
-{
- return (item && item->getAssetUUID() == mAssetID);
-}
-
-///----------------------------------------------------------------------------
-/// LLLinkedItemIDMatches
-///----------------------------------------------------------------------------
-bool LLLinkedItemIDMatches::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
-{
- return (item &&
- (item->getIsLinkType()) &&
- (item->getLinkedUUID() == mBaseItemID)); // A linked item's assetID will be the compared-to item's itemID.
-}
-
-///----------------------------------------------------------------------------
/// Local function definitions
///----------------------------------------------------------------------------
diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h
index 2a2b48ce3c..7b56d0bdd1 100644
--- a/indra/newview/llinventorymodel.h
+++ b/indra/newview/llinventorymodel.h
@@ -58,17 +58,15 @@ class LLMessageSystem;
class LLInventoryCollectFunctor;
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryModel
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// LLInventoryModel
//
-// This class represents a collection of inventory, and provides
-// efficient ways to access that information. This class could in
-// theory be used for any place where you need inventory, though it
-// optimizes for time efficiency - not space efficiency, probably
-// making it inappropriate for use on tasks.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-
+// Represents a collection of inventory, and provides efficient ways to access
+// that information.
+// NOTE: This class could in theory be used for any place where you need
+// inventory, though it optimizes for time efficiency - not space efficiency,
+// probably making it inappropriate for use on tasks.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLInventoryModel
{
public:
@@ -81,83 +79,132 @@ public:
CHILDREN_MAYBE
};
- // These are used a lot...
typedef LLDynamicArray<LLPointer<LLViewerInventoryCategory> > cat_array_t;
typedef LLDynamicArray<LLPointer<LLViewerInventoryItem> > item_array_t;
typedef std::set<LLUUID> changed_items_t;
-
- // construction & destruction
- LLInventoryModel();
- ~LLInventoryModel();
-
- void cleanupInventory();
-
+
class fetchInventoryResponder : public LLHTTPClient::Responder
{
public:
fetchInventoryResponder(const LLSD& request_sd) : mRequestSD(request_sd) {};
void result(const LLSD& content);
-
void error(U32 status, const std::string& reason);
-
- public:
- typedef std::vector<LLViewerInventoryCategory*> folder_ref_t;
protected:
LLSD mRequestSD;
};
- //
- // Accessors
- //
+/********************************************************************************
+ ** **
+ ** INITIALIZATION/SETUP
+ **/
- // Check if one object has a parent chain up to the category specified by UUID.
- BOOL isObjectDescendentOf(const LLUUID& obj_id, const LLUUID& cat_id) const;
+ //--------------------------------------------------------------------
+ // Constructors / Destructors
+ //--------------------------------------------------------------------
+public:
+ LLInventoryModel();
+ ~LLInventoryModel();
+ void cleanupInventory();
+protected:
+ void empty(); // empty the entire contents
- // Get whatever special folder this object is a child of, if any.
- const LLViewerInventoryCategory *getFirstNondefaultParent(const LLUUID& obj_id) const;
+ //--------------------------------------------------------------------
+ // Initialization
+ //--------------------------------------------------------------------
+public:
+ // The inventory model usage is sensitive to the initial construction of the model
+ bool isInventoryUsable() const;
+private:
+ bool mIsAgentInvUsable; // used to handle an invalid inventory state
- // Get the object by id. Returns NULL if not found.
- // * WARNING: use the pointer returned for read operations - do
- // not modify the object values in place or you will break stuff.
- LLInventoryObject* getObject(const LLUUID& id) const;
+ //--------------------------------------------------------------------
+ // Root Folders
+ //--------------------------------------------------------------------
+public:
+ // The following are set during login with data from the server
+ void setRootFolderID(const LLUUID& id);
+ void setLibraryOwnerID(const LLUUID& id);
+ void setLibraryRootFolderID(const LLUUID& id);
- // Get the item by id. Returns NULL if not found.
- // * WARNING: use the pointer for read operations - use the
- // updateItem() method to actually modify values.
- LLViewerInventoryItem* getItem(const LLUUID& id) const;
+ const LLUUID &getRootFolderID() const;
+ const LLUUID &getLibraryOwnerID() const;
+ const LLUUID &getLibraryRootFolderID() const;
+private:
+ LLUUID mRootFolderID;
+ LLUUID mLibraryRootFolderID;
+ LLUUID mLibraryOwnerID;
+
+ //--------------------------------------------------------------------
+ // Structure
+ //--------------------------------------------------------------------
+public:
+ // Methods to load up inventory skeleton & meat. These are used
+ // during authentication. Returns true if everything parsed.
+ bool loadSkeleton(const LLSD& options, const LLUUID& owner_id);
+ void buildParentChildMap(); // brute force method to rebuild the entire parent-child relations
+ // Call on logout to save a terse representation.
+ void cache(const LLUUID& parent_folder_id, const LLUUID& agent_id);
+private:
+ // Information for tracking the actual inventory. We index this
+ // information in a lot of different ways so we can access
+ // the inventory using several different identifiers.
+ // mInventory member data is the 'master' list of inventory, and
+ // mCategoryMap and mItemMap store uuid->object mappings.
+ typedef std::map<LLUUID, LLPointer<LLViewerInventoryCategory> > cat_map_t;
+ typedef std::map<LLUUID, LLPointer<LLViewerInventoryItem> > item_map_t;
+ cat_map_t mCategoryMap;
+ item_map_t mItemMap;
+ // This last set of indices is used to map parents to children.
+ typedef std::map<LLUUID, cat_array_t*> parent_cat_map_t;
+ typedef std::map<LLUUID, item_array_t*> parent_item_map_t;
+ parent_cat_map_t mParentChildCategoryTree;
+ parent_item_map_t mParentChildItemTree;
- // Get the category by id. Returns NULL if not found.
- // * WARNING: use the pointer for read operations - use the
- // updateCategory() method to actually modify values.
- LLViewerInventoryCategory* getCategory(const LLUUID& id) const;
+ //--------------------------------------------------------------------
+ // Login
+ //--------------------------------------------------------------------
+public:
+ static BOOL getIsFirstTimeInViewer2();
+private:
+ static BOOL sFirstTimeInViewer2;
+ const static S32 sCurrentInvCacheVersion; // expected inventory cache version
- // Return the number of items or categories
- S32 getItemCount() const;
- S32 getCategoryCount() const;
+/** Initialization/Setup
+ ** **
+ *******************************************************************************/
+
+/********************************************************************************
+ ** **
+ ** ACCESSORS
+ **/
+
+ //--------------------------------------------------------------------
+ // Descendents
+ //--------------------------------------------------------------------
+public:
+ // Make sure we have the descendents in the structure. Returns true
+ // if a fetch was performed.
+ bool fetchDescendentsOf(const LLUUID& folder_id) const;
// Return the direct descendents of the id provided.Set passed
// in values to NULL if the call fails.
- // *WARNING: The array provided points straight into the guts of
- // this object, and should only be used for read operations, since
- // modifications may invalidate the internal state of the
- // inventory.
+ // NOTE: The array provided points straight into the guts of
+ // this object, and should only be used for read operations, since
+ // modifications may invalidate the internal state of the inventory.
void getDirectDescendentsOf(const LLUUID& cat_id,
cat_array_t*& categories,
item_array_t*& items) const;
- // SJB: Added version to lock the arrays to catch potential logic bugs
- void lockDirectDescendentArrays(const LLUUID& cat_id,
- cat_array_t*& categories,
- item_array_t*& items);
- void unlockDirectDescendentArrays(const LLUUID& cat_id);
-
// Starting with the object specified, add its descendents to the
// array provided, but do not add the inventory object specified
- // by id. There is no guaranteed order. Neither array will be
- // erased before adding objects to it. Do not store a copy of the
- // pointers collected - use them, and collect them again later if
- // you need to reference the same objects.
- enum { EXCLUDE_TRASH = FALSE, INCLUDE_TRASH = TRUE };
+ // by id. There is no guaranteed order.
+ // NOTE: Neither array will be erased before adding objects to it.
+ // Do not store a copy of the pointers collected - use them, and
+ // collect them again later if you need to reference the same objects.
+ enum {
+ EXCLUDE_TRASH = FALSE,
+ INCLUDE_TRASH = TRUE
+ };
void collectDescendents(const LLUUID& id,
cat_array_t& categories,
item_array_t& items,
@@ -173,156 +220,163 @@ public:
// Assumes item_id is itself not a linked item.
item_array_t collectLinkedItems(const LLUUID& item_id,
const LLUUID& start_folder_id = LLUUID::null);
+
+
+ // Check if one object has a parent chain up to the category specified by UUID.
+ BOOL isObjectDescendentOf(const LLUUID& obj_id, const LLUUID& cat_id) const;
+
+ //--------------------------------------------------------------------
+ // Find
+ //--------------------------------------------------------------------
+public:
+ // Returns the uuid of the category that specifies 'type' as what it
+ // defaults to containing. The category is not necessarily only for that type.
+ // NOTE: If create_folder is true, this will create a new inventory category
+ // on the fly if one does not exist. *NOTE: if find_in_library is true it
+ // will search in the user's library folder instead of "My Inventory"
+ const LLUUID findCategoryUUIDForType(LLFolderType::EType preferred_type,
+ bool create_folder = true,
+ bool find_in_library = false);
+
+ // Get whatever special folder this object is a child of, if any.
+ const LLViewerInventoryCategory *getFirstNondefaultParent(const LLUUID& obj_id) const;
- // Get the inventoryID that this item points to, else just return item_id
+ // Get the object by id. Returns NULL if not found.
+ // NOTE: Use the pointer returned for read operations - do
+ // not modify the object values in place or you will break stuff.
+ LLInventoryObject* getObject(const LLUUID& id) const;
+
+ // Get the item by id. Returns NULL if not found.
+ // NOTE: Use the pointer for read operations - use the
+ // updateItem() method to actually modify values.
+ LLViewerInventoryItem* getItem(const LLUUID& id) const;
+
+ // Get the category by id. Returns NULL if not found.
+ // NOTE: Use the pointer for read operations - use the
+ // updateCategory() method to actually modify values.
+ LLViewerInventoryCategory* getCategory(const LLUUID& id) const;
+
+ // Get the inventoryID or item that this item points to, else just return object_id
const LLUUID& getLinkedItemID(const LLUUID& object_id) const;
+ LLViewerInventoryItem* getLinkedItem(const LLUUID& object_id) const;
+private:
+ mutable LLPointer<LLViewerInventoryItem> mLastItem; // cache recent lookups
- // The inventory model usage is sensitive to the initial construction of the
- // model.
- bool isInventoryUsable() const;
+ //--------------------------------------------------------------------
+ // Count
+ //--------------------------------------------------------------------
+public:
+ // Return the number of items or categories
+ S32 getItemCount() const;
+ S32 getCategoryCount() const;
+
+/** Accessors
+ ** **
+ *******************************************************************************/
- //
- // Mutators
- //
+/********************************************************************************
+ ** **
+ ** MUTATORS
+ **/
- // Calling this method with an inventory item will either change
- // an existing item with a matching item_id, or will add the item
+public:
+ // Change an existing item with a matching item_id or add the item
// to the current inventory. Returns the change mask generated by
// the update. No notification will be sent to observers. This
// method will only generate network traffic if the item had to be
// reparented.
- // *NOTE: In usage, you will want to perform cache accounting
- // operations in LLInventoryModel::accountForUpdate() or
- // LLViewerInventoryItem::updateServer() before calling this
- // method.
+ // NOTE: In usage, you will want to perform cache accounting
+ // operations in LLInventoryModel::accountForUpdate() or
+ // LLViewerInventoryItem::updateServer() before calling this method.
U32 updateItem(const LLViewerInventoryItem* item);
- // Calling this method with an inventory category will either
- // change an existing item with the matching id, or it will add
+ // Change an existing item with the matching id or add
// the category. No notifcation will be sent to observers. This
// method will only generate network traffic if the item had to be
// reparented.
- // *NOTE: In usage, you will want to perform cache accounting
- // operations in LLInventoryModel::accountForUpdate() or
- // LLViewerInventoryCategory::updateServer() before calling this
- // method.
+ // NOTE: In usage, you will want to perform cache accounting
+ // operations in accountForUpdate() or LLViewerInventoryCategory::
+ // updateServer() before calling this method.
void updateCategory(const LLViewerInventoryCategory* cat);
- // This method will move the specified object id to the specified
- // category, update the internal structures. No cache accounting,
+ // Move the specified object id to the specified category and
+ // update the internal structures. No cache accounting,
// observer notification, or server update is performed.
void moveObject(const LLUUID& object_id, const LLUUID& cat_id);
- // delete a particular inventory object by ID. This will purge one
- // object from the internal data structures maintaining a
+ //--------------------------------------------------------------------
+ // Delete
+ //--------------------------------------------------------------------
+public:
+ // Delete a particular inventory object by ID. Will purge one
+ // object from the internal data structures, maintaining a
// consistent internal state. No cache accounting, observer
- // notification, or server update is performed. Purges linked items.
+ // notification, or server update is performed.
void deleteObject(const LLUUID& id);
+ void removeItem(const LLUUID& item_id);
- // delete a particular inventory object by ID, and delete it from
- // the server. Also updates linked items.
+ // Delete a particular inventory object by ID, and delete it from
+ // the server. Also updates linked items.
void purgeObject(const LLUUID& id);
- void updateLinkedObjectsFromPurge(const LLUUID& baseobj_id);
- // This is a method which collects the descendants of the id
+ // Collects and purges the descendants of the id
// provided. If the category is not found, no action is
// taken. This method goes through the long winded process of
// removing server representation of folders and items while doing
// cache accounting in a fairly efficient manner. This method does
// not notify observers (though maybe it should...)
void purgeDescendentsOf(const LLUUID& id);
+protected:
+ void updateLinkedObjectsFromPurge(const LLUUID& baseobj_id);
+
+ //--------------------------------------------------------------------
+ // Reorder
+ //--------------------------------------------------------------------
+public:
+ // Changes items order by insertion of the item identified by src_item_id
+ // before the item identified by dest_item_id. Both items must exist in items array.
+ // Sorting is stored after method is finished. Only src_item_id is moved before dest_item_id.
+ static void updateItemsOrder(LLInventoryModel::item_array_t& items,
+ const LLUUID& src_item_id,
+ const LLUUID& dest_item_id);
+
+ // Saves current order of the passed items using inventory item sort field.
+ // Resets 'items' sort fields and saves them on server.
+ // Is used to save order for Favorites folder.
+ void saveItemsOrder(const LLInventoryModel::item_array_t& items);
- // This method optimally removes the referenced categories and
- // items from the current agent's inventory in the database. It
- // performs all of the during deletion. The local representation
- // is not removed.
- void deleteFromServer(LLDynamicArray<LLUUID>& category_ids,
- LLDynamicArray<LLUUID>& item_ids);
-
- // Add/remove an observer. If the observer is destroyed, be sure
- // to remove it.
- void addObserver(LLInventoryObserver* observer);
- void removeObserver(LLInventoryObserver* observer);
- BOOL containsObserver(LLInventoryObserver* observer) const;
-
- //
- // Misc Methods
- //
-
- // findCategoryUUIDForType() returns the uuid of the category that
- // specifies 'type' as what it defaults to containing. The
- // category is not necessarily only for that type. *NOTE: If create_folder is true, this
- // will create a new inventory category on the fly if one does not exist. *NOTE: if find_in_library is
- // true it will search in the user's library folder instead of "My Inventory"
- // SDK: Added flag to specify whether the folder should be created if not found. This fixes the horrible
- // multiple trash can bug.
- const LLUUID findCategoryUUIDForType(LLFolderType::EType preferred_type, bool create_folder = true, bool find_in_library = false);
-
- // This gets called by the idle loop. It only updates if new
- // state is detected. Call notifyObservers() manually to update
- // regardless of whether state change has been indicated.
- void idleNotifyObservers();
-
- // Call this method to explicitly update everyone on a new state.
- // The optional argument 'service_name' is used by Agent Inventory Service [DEV-20328]
- void notifyObservers(const std::string service_name="");
-
- // This allows outsiders to tell the inventory if something has
- // been changed 'under the hood', but outside the control of the
- // inventory. For example, if we grant someone modify permissions,
- // then that changes the data structures for LLAvatarTracker, but
- // potentially affects inventory observers. This API makes sure
- // that the next notify will include that notification.
- void addChangedMask(U32 mask, const LLUUID& referent);
-
- const changed_items_t& getChangedIDs() const { return mChangedItemIDs; }
-
- // This method to prepares a set of mock inventory which provides
- // minimal functionality before the actual arrival of inventory.
- //void mock(const LLUUID& root_id);
-
- // Make sure we have the descendents in the structure. Returns true
- // if a fetch was performed.
- bool fetchDescendentsOf(const LLUUID& folder_id);
-
- // call this method to request the inventory.
- //void requestFromServer(const LLUUID& agent_id);
-
- // call this method on logout to save a terse representation
- void cache(const LLUUID& parent_folder_id, const LLUUID& agent_id);
-
- // Generates a string containing the path to the item specified by
- // item_id.
- void appendPath(const LLUUID& id, std::string& path) const;
-
- // message handling functionality
- static void registerCallbacks(LLMessageSystem* msg);
+ // Rearranges Landmarks inside Favorites folder.
+ // Moves source landmark before target one.
+ void rearrangeFavoriteLandmarks(const LLUUID& source_item_id, const LLUUID& target_item_id);
- // Convenience function to create a new category. You could call
- // updateCatgory() with a newly generated UUID category, but this
- // version will take care of details like what the name should be
- // based on preferred type. Returns the UUID of the new
- // category. If you want to use the default name based on type,
- // pass in a NULL to the 'name parameter.
+ //--------------------------------------------------------------------
+ // Creation
+ //--------------------------------------------------------------------
+public:
+ // Returns the UUID of the new category. If you want to use the default
+ // name based on type, pass in a NULL to the 'name' parameter.
LLUUID createNewCategory(const LLUUID& parent_id,
LLFolderType::EType preferred_type,
const std::string& name);
+protected:
+ // Internal methods that add inventory and make sure that all of
+ // the internal data structures are consistent. These methods
+ // should be passed pointers of newly created objects, and the
+ // instance will take over the memory management from there.
+ void addCategory(LLViewerInventoryCategory* category);
+ void addItem(LLViewerInventoryItem* item);
+
+/** Mutators
+ ** **
+ *******************************************************************************/
- // methods to load up inventory skeleton & meat. These are used
- // during authentication. return true if everything parsed.
- bool loadSkeleton(const LLSD& options, const LLUUID& owner_id);
- bool loadMeat(const LLSD& options, const LLUUID& owner_id);
-
- // This is a brute force method to rebuild the entire parent-child
- // relations.
- void buildParentChildMap();
-
- //
- // Category accounting.
- //
+/********************************************************************************
+ ** **
+ ** CATEGORY ACCOUNTING
+ **/
- // This structure represents the number of items added or removed
- // from a category.
+public:
+ // Represents the number of items added or removed from a category.
struct LLCategoryUpdate
{
LLCategoryUpdate() : mDescendentDelta(0) {}
@@ -334,8 +388,7 @@ public:
};
typedef std::vector<LLCategoryUpdate> update_list_t;
- // This structure eixts to make it easier to account for deltas in
- // a map.
+ // This exists to make it easier to account for deltas in a map.
struct LLInitializedS32
{
LLInitializedS32() : mValue(0) {}
@@ -346,104 +399,89 @@ public:
};
typedef std::map<LLUUID, LLInitializedS32> update_map_t;
- // Call these methods when there are category updates, but call
- // them *before* the actual update so the method can do descendent
- // accounting correctly.
+ // Call when there are category updates. Call them *before* the
+ // actual update so the method can do descendent accounting correctly.
void accountForUpdate(const LLCategoryUpdate& update) const;
void accountForUpdate(const update_list_t& updates);
void accountForUpdate(const update_map_t& updates);
- // Return child status of category children. yes/no/maybe
+ // Return (yes/no/maybe) child status of category children.
EHasChildren categoryHasChildren(const LLUUID& cat_id) const;
- // returns true iff category version is known and theoretical
+ // Returns true iff category version is known and theoretical
// descendents == actual descendents.
bool isCategoryComplete(const LLUUID& cat_id) const;
- // callbacks
- // Trigger a notification and empty the folder type (FT_TRASH or FT_LOST_AND_FOUND) if confirmed
- void emptyFolderType(const std::string notification, LLFolderType::EType folder_type);
- bool callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLFolderType::EType preferred_type);
-
- // Utility Functions
- void removeItem(const LLUUID& item_id);
-
- static void findLostItems();
-
- // Data about the agent's root folder and root library folder
- // are stored here, rather than in LLAgent where it used to be, because
- // gInventory is a singleton and represents the agent's inventory.
- // The "library" is actually the inventory of a special agent,
- // usually Alexandria Linden.
- const LLUUID &getRootFolderID() const;
- const LLUUID &getLibraryOwnerID() const;
- const LLUUID &getLibraryRootFolderID() const;
-
- // These are set during login with data from the server
- void setRootFolderID(const LLUUID& id);
- void setLibraryOwnerID(const LLUUID& id);
- void setLibraryRootFolderID(const LLUUID& id);
+/** Category Accounting
+ ** **
+ *******************************************************************************/
+/********************************************************************************
+ ** **
+ ** NOTIFICATIONS
+ **/
- /**
- * Changes items order by insertion of the item identified by src_item_id
- * BEFORE the item identified by dest_item_id. Both items must exist in items array.
- *
- * Sorting is stored after method is finished. Only src_item_id is moved before dest_item_id.
- *
- * @param[in, out] items - vector with items to be updated. It should be sorted in a right way
- * before calling this method.
- * @param src_item_id - LLUUID of inventory item to be moved in new position
- * @param dest_item_id - LLUUID of inventory item before which source item should be placed.
- */
- static void updateItemsOrder(LLInventoryModel::item_array_t& items, const LLUUID& src_item_id, const LLUUID& dest_item_id);
-
- /**
- * Saves current order of the passed items using inventory item sort field.
- *
- * It reset items' sort fields and saves them on server.
- * Is used to save order for Favorites folder.
- *
- * @param[in] items vector of items in order to be saved.
- */
- void saveItemsOrder(const LLInventoryModel::item_array_t& items);
+public:
+ // Called by the idle loop. Only updates if new state is detected. Call
+ // notifyObservers() manually to update regardless of whether state change
+ // has been indicated.
+ void idleNotifyObservers();
- /**
- * Rearranges Landmarks inside Favorites folder.
- * Moves source landmark before target one.
- *
- * @param source_item_id - LLUUID of the source item to be moved into new position
- * @param target_item_id - LLUUID of the target item before which source item should be placed.
- */
- void rearrangeFavoriteLandmarks(const LLUUID& source_item_id, const LLUUID& target_item_id);
+ // Call to explicitly update everyone on a new state. The optional argument
+ // 'service_name' is used by Agent Inventory Service [DEV-20328]
+ void notifyObservers(const std::string service_name="");
+ // Allows outsiders to tell the inventory if something has
+ // been changed 'under the hood', but outside the control of the
+ // inventory. The next notify will include that notification.
+ void addChangedMask(U32 mask, const LLUUID& referent);
+ const changed_items_t& getChangedIDs() const { return mChangedItemIDs; }
protected:
+ // Updates all linked items pointing to this id.
+ void addChangedMaskForLinks(const LLUUID& object_id, U32 mask);
+private:
+ // Flag set when notifyObservers is being called, to look for bugs
+ // where it's called recursively.
+ BOOL mIsNotifyObservers;
+ // Variables used to track what has changed since the last notify.
+ U32 mModifyMask;
+ changed_items_t mChangedItemIDs;
+
+ //--------------------------------------------------------------------
+ // Observers
+ //--------------------------------------------------------------------
+public:
+ // If the observer is destroyed, be sure to remove it.
+ void addObserver(LLInventoryObserver* observer);
+ void removeObserver(LLInventoryObserver* observer);
+ BOOL containsObserver(LLInventoryObserver* observer) const;
+private:
+ typedef std::set<LLInventoryObserver*> observer_list_t;
+ observer_list_t mObservers;
+
+/** Notifications
+ ** **
+ *******************************************************************************/
- // Internal methods which add inventory and make sure that all of
- // the internal data structures are consistent. These methods
- // should be passed pointers of newly created objects, and the
- // instance will take over the memory management from there.
- void addCategory(LLViewerInventoryCategory* category);
- void addItem(LLViewerInventoryItem* item);
-
- // ! DEPRECRATE ! Remove this and add it into findCategoryUUIDForType,
- // since that's the only function that uses this. It's too confusing
- // having both methods.
- //
- // Internal method which looks for a category with the specified
- // preferred type. Returns LLUUID::null if not found
- const LLUUID &findCatUUID(LLFolderType::EType preferred_type, bool find_in_library = false) const;
- // Empty the entire contents
- void empty();
+/********************************************************************************
+ ** **
+ ** MISCELLANEOUS
+ **/
- // Given the current state of the inventory items, figure out the
- // clone information. *FIX: This is sub-optimal, since we can
- // insert this information snurgically, but this makes sure the
- // implementation works before we worry about optimization.
- //void recalculateCloneInformation();
+ //--------------------------------------------------------------------
+ // Callbacks
+ //--------------------------------------------------------------------
+public:
+ // Trigger a notification and empty the folder type (FT_TRASH or FT_LOST_AND_FOUND) if confirmed
+ void emptyFolderType(const std::string notification, LLFolderType::EType folder_type);
+ bool callbackEmptyFolderType(const LLSD& notification, const LLSD& response, LLFolderType::EType preferred_type);
+ static void registerCallbacks(LLMessageSystem* msg);
- // file import/export.
+ //--------------------------------------------------------------------
+ // File I/O
+ //--------------------------------------------------------------------
+protected:
static bool loadFromFile(const std::string& filename,
cat_array_t& categories,
item_array_t& items,
@@ -452,360 +490,50 @@ protected:
const cat_array_t& categories,
const item_array_t& items);
- // message handling functionality
- //static void processUseCachedInventory(LLMessageSystem* msg, void**);
+ //--------------------------------------------------------------------
+ // Message handling functionality
+ //--------------------------------------------------------------------
+public:
static void processUpdateCreateInventoryItem(LLMessageSystem* msg, void**);
static void processRemoveInventoryItem(LLMessageSystem* msg, void**);
static void processUpdateInventoryFolder(LLMessageSystem* msg, void**);
static void processRemoveInventoryFolder(LLMessageSystem* msg, void**);
- //static void processExchangeCallingcard(LLMessageSystem* msg, void**);
- //static void processAddCallingcard(LLMessageSystem* msg, void**);
- //static void processDeclineCallingcard(LLMessageSystem* msg, void**);
static void processSaveAssetIntoInventory(LLMessageSystem* msg, void**);
static void processBulkUpdateInventory(LLMessageSystem* msg, void**);
static void processInventoryDescendents(LLMessageSystem* msg, void**);
static void processMoveInventoryItem(LLMessageSystem* msg, void**);
static void processFetchInventoryReply(LLMessageSystem* msg, void**);
-
+protected:
bool messageUpdateCore(LLMessageSystem* msg, bool do_accounting);
- // Updates all linked items pointing to this id.
- void addChangedMaskForLinks(const LLUUID& object_id, U32 mask);
-
+ //--------------------------------------------------------------------
+ // Locks
+ //--------------------------------------------------------------------
+public:
+ void lockDirectDescendentArrays(const LLUUID& cat_id,
+ cat_array_t*& categories,
+ item_array_t*& items);
+ void unlockDirectDescendentArrays(const LLUUID& cat_id);
protected:
cat_array_t* getUnlockedCatArray(const LLUUID& id);
item_array_t* getUnlockedItemArray(const LLUUID& id);
-
private:
- // Variables used to track what has changed since the last notify.
- U32 mModifyMask;
- changed_items_t mChangedItemIDs;
-
std::map<LLUUID, bool> mCategoryLock;
std::map<LLUUID, bool> mItemLock;
- // cache recent lookups
- mutable LLPointer<LLViewerInventoryItem> mLastItem;
-
- // This last set of indices is used to map parents to children.
- typedef std::map<LLUUID, cat_array_t*> parent_cat_map_t;
- typedef std::map<LLUUID, item_array_t*> parent_item_map_t;
- parent_cat_map_t mParentChildCategoryTree;
- parent_item_map_t mParentChildItemTree;
-
- typedef std::set<LLInventoryObserver*> observer_list_t;
- observer_list_t mObservers;
-
- // Agent inventory folder information.
- LLUUID mRootFolderID;
- LLUUID mLibraryRootFolderID;
- LLUUID mLibraryOwnerID;
-
- static BOOL sTimelyFetchPending;
- static S32 sNumFetchRetries;
- static LLFrameTimer sFetchTimer;
- static F32 sMinTimeBetweenFetches;
- static F32 sMaxTimeBetweenFetches;
-
- // Expected inventory cache version
- const static S32 sCurrentInvCacheVersion;
-
- // This flag is used to handle an invalid inventory state.
- bool mIsAgentInvUsable;
-
-private:
- // Information for tracking the actual inventory. We index this
- // information in a lot of different ways so we can access
- // the inventory using several different identifiers.
- // mInventory member data is the 'master' list of inventory, and
- // mCategoryMap and mItemMap store uuid->object mappings.
- typedef std::map<LLUUID, LLPointer<LLViewerInventoryCategory> > cat_map_t;
- typedef std::map<LLUUID, LLPointer<LLViewerInventoryItem> > item_map_t;
- //inv_map_t mInventory;
- cat_map_t mCategoryMap;
- item_map_t mItemMap;
-
- // Flag set when notifyObservers is being called, to look for bugs
- // where it's called recursively.
- BOOL mIsNotifyObservers;
+ //--------------------------------------------------------------------
+ // Debugging
+ //--------------------------------------------------------------------
public:
- // *NOTE: DEBUG functionality
void dumpInventory() const;
-
- ////////////////////////////////////////////////////////////////////////////////
- // Bulk fetch
-public:
- // Start and stop background breadth-first fetching of inventory contents.
- // This gets triggered when performing a filter-search
- void startBackgroundFetch(const LLUUID& cat_id = LLUUID::null);
- static BOOL backgroundFetchActive();
- static bool isEverythingFetched();
- static void backgroundFetch(void*); // background fetch idle function
- static void incrBulkFetch(S16 fetching) { sBulkFetchCount+=fetching; if (sBulkFetchCount<0) sBulkFetchCount=0; }
- static void stopBackgroundFetch(); // stop fetch process
- static bool isBulkFetchProcessingComplete();
-
- // Add categories to a list to be fetched in bulk.
- static void bulkFetch(std::string url);
-
- static bool libraryFetchStarted();
- static bool libraryFetchCompleted();
- static bool libraryFetchInProgress();
-
- static bool myInventoryFetchStarted();
- static bool myInventoryFetchCompleted();
- static bool myInventoryFetchInProgress();
-
-private:
- static BOOL sMyInventoryFetchStarted;
- static BOOL sLibraryFetchStarted;
- static BOOL sAllFoldersFetched;
- static void setAllFoldersFetched();
-
- // completing the fetch once per session should be sufficient
- static BOOL sBackgroundFetchActive;
- static S16 sBulkFetchCount;
-
- ////////////////////////////////////////////////////////////////////////////////
- // Login status
-public:
- static BOOL getIsFirstTimeInViewer2();
-private:
- static BOOL sFirstTimeInViewer2;
+/** Miscellaneous
+ ** **
+ *******************************************************************************/
};
// a special inventory model for the agent
extern LLInventoryModel gInventory;
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryCollectFunctor
-//
-// Base class for LLInventoryModel::collectDescendentsIf() method
-// which accepts an instance of one of these objects to use as the
-// function to determine if it should be added. Derive from this class
-// and override the () operator to return TRUE if you want to collect
-// the category or item passed in.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLInventoryCollectFunctor
-{
-public:
- virtual ~LLInventoryCollectFunctor(){};
- virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item) = 0;
-
- static bool itemTransferCommonlyAllowed(LLInventoryItem* item);
-};
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLAssetIDMatches
-//
-// This functor finds inventory items pointing to the specified asset
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLViewerInventoryItem;
-
-class LLAssetIDMatches : public LLInventoryCollectFunctor
-{
-public:
- LLAssetIDMatches(const LLUUID& asset_id) : mAssetID(asset_id) {}
- virtual ~LLAssetIDMatches() {}
- bool operator()(LLInventoryCategory* cat, LLInventoryItem* item);
-
-protected:
- LLUUID mAssetID;
-};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLLinkedItemIDMatches
-//
-// This functor finds inventory items linked to the specific inventory id.
-// Assumes the inventory id is itself not a linked item.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLLinkedItemIDMatches : public LLInventoryCollectFunctor
-{
-public:
- LLLinkedItemIDMatches(const LLUUID& item_id) : mBaseItemID(item_id) {}
- virtual ~LLLinkedItemIDMatches() {}
- bool operator()(LLInventoryCategory* cat, LLInventoryItem* item);
-
-protected:
- LLUUID mBaseItemID;
-};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLIsType
-//
-// Implementation of a LLInventoryCollectFunctor which returns TRUE if
-// the type is the type passed in during construction.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLIsType : public LLInventoryCollectFunctor
-{
-public:
- LLIsType(LLAssetType::EType type) : mType(type) {}
- virtual ~LLIsType() {}
- virtual bool operator()(LLInventoryCategory* cat,
- LLInventoryItem* item);
-protected:
- LLAssetType::EType mType;
-};
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLIsNotType
-//
-// Implementation of a LLInventoryCollectFunctor which returns FALSE if the
-// type is the type passed in during construction, otherwise false.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLIsNotType : public LLInventoryCollectFunctor
-{
-public:
- LLIsNotType(LLAssetType::EType type) : mType(type) {}
- virtual ~LLIsNotType() {}
- virtual bool operator()(LLInventoryCategory* cat,
- LLInventoryItem* item);
-protected:
- LLAssetType::EType mType;
-};
-
-class LLIsTypeWithPermissions : public LLInventoryCollectFunctor
-{
-public:
- LLIsTypeWithPermissions(LLAssetType::EType type, const PermissionBit perms, const LLUUID &agent_id, const LLUUID &group_id)
- : mType(type), mPerm(perms), mAgentID(agent_id), mGroupID(group_id) {}
- virtual ~LLIsTypeWithPermissions() {}
- virtual bool operator()(LLInventoryCategory* cat,
- LLInventoryItem* item);
-protected:
- LLAssetType::EType mType;
- PermissionBit mPerm;
- LLUUID mAgentID;
- LLUUID mGroupID;
-};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLIsClone
-//
-// Implementation of a LLInventoryCollectFunctor which returns TRUE if
-// the object is a clone of the item passed in during
-// construction.
-//
-// *NOTE: Since clone information is determined based off of asset id
-// (or creator with calling cards), if the id is NULL, it has no
-// clones - even itself.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-//class LLIsClone : public LLInventoryCollectFunctor
-//{
-//public:
-// LLIsClone(LLViewerInventoryItem* item) : mItem(item) {}
-// virtual ~LLIsClone() {}
-// virtual bool operator()(LLViewerInventoryCategory* cat,
-// LLViewerInventoryItem* item);
-//protected:
-// LLPointer<LLViewerInventoryItem> mItem;
-//};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLBuddyCollector
-//
-// Simple class that collects calling cards that are not null, and not
-// the agent. Duplicates are possible.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLBuddyCollector : public LLInventoryCollectFunctor
-{
-public:
- LLBuddyCollector() {}
- virtual ~LLBuddyCollector() {}
- virtual bool operator()(LLInventoryCategory* cat,
- LLInventoryItem* item);
-};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLUniqueBuddyCollector
-//
-// Simple class that collects calling cards that are not null, and not
-// the agent. Duplicates are discarded.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLUniqueBuddyCollector : public LLInventoryCollectFunctor
-{
-public:
- LLUniqueBuddyCollector() {}
- virtual ~LLUniqueBuddyCollector() {}
- virtual bool operator()(LLInventoryCategory* cat,
- LLInventoryItem* item);
-
-protected:
- std::set<LLUUID> mSeen;
-};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLParticularBuddyCollector
-//
-// Simple class that collects calling cards that match a particular uuid
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLParticularBuddyCollector : public LLInventoryCollectFunctor
-{
-public:
- LLParticularBuddyCollector(const LLUUID& id) : mBuddyID(id) {}
- virtual ~LLParticularBuddyCollector() {}
- virtual bool operator()(LLInventoryCategory* cat,
- LLInventoryItem* item);
-protected:
- LLUUID mBuddyID;
-};
-
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLNameCategoryCollector
-//
-// Collects categories based on case-insensitive match of prefix
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLNameCategoryCollector : public LLInventoryCollectFunctor
-{
-public:
- LLNameCategoryCollector(const std::string& name) : mName(name) {}
- virtual ~LLNameCategoryCollector() {}
- virtual bool operator()(LLInventoryCategory* cat,
- LLInventoryItem* item);
-protected:
- std::string mName;
-};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLFindCOFValidItems
-//
-// Collects items that can be legitimately linked to in the COF.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLFindCOFValidItems : public LLInventoryCollectFunctor
-{
-public:
- LLFindCOFValidItems() {}
- virtual ~LLFindCOFValidItems() {}
- virtual bool operator()(LLInventoryCategory* cat,
- LLInventoryItem* item);
-
-};
-
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLFindWearables
-//
-// Collects wearables based on item type.
-//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLFindWearables : public LLInventoryCollectFunctor
-{
-public:
- LLFindWearables() {}
- virtual ~LLFindWearables() {}
- virtual bool operator()(LLInventoryCategory* cat,
- LLInventoryItem* item);
-};
-
#endif // LL_LLINVENTORYMODEL_H
diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp
new file mode 100644
index 0000000000..ce44e37017
--- /dev/null
+++ b/indra/newview/llinventorymodelbackgroundfetch.cpp
@@ -0,0 +1,638 @@
+/**
+ * @file llinventorymodel.cpp
+ * @brief Implementation of the inventory model used to track agent inventory.
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llinventorymodelbackgroundfetch.h"
+
+#include "llagent.h"
+#include "llappviewer.h"
+#include "llcallbacklist.h"
+#include "llinventorypanel.h"
+#include "llviewercontrol.h"
+#include "llviewermessage.h"
+#include "llviewerregion.h"
+#include "llviewerwindow.h"
+
+const F32 MAX_TIME_FOR_SINGLE_FETCH = 10.f;
+const S32 MAX_FETCH_RETRIES = 10;
+
+LLInventoryModelBackgroundFetch::LLInventoryModelBackgroundFetch() :
+ mBackgroundFetchActive(FALSE),
+ mAllFoldersFetched(FALSE),
+ mRecursiveInventoryFetchStarted(FALSE),
+ mRecursiveLibraryFetchStarted(FALSE),
+ mNumFetchRetries(0),
+ mMinTimeBetweenFetches(0.3f),
+ mMaxTimeBetweenFetches(10.f),
+ mTimelyFetchPending(FALSE),
+ mBulkFetchCount(0)
+{
+}
+
+LLInventoryModelBackgroundFetch::~LLInventoryModelBackgroundFetch()
+{
+}
+
+bool LLInventoryModelBackgroundFetch::isBulkFetchProcessingComplete() const
+{
+ return mFetchQueue.empty() && mBulkFetchCount<=0;
+}
+
+bool LLInventoryModelBackgroundFetch::libraryFetchStarted() const
+{
+ return mRecursiveLibraryFetchStarted;
+}
+
+bool LLInventoryModelBackgroundFetch::libraryFetchCompleted() const
+{
+ return libraryFetchStarted() && fetchQueueContainsNoDescendentsOf(gInventory.getLibraryRootFolderID());
+}
+
+bool LLInventoryModelBackgroundFetch::libraryFetchInProgress() const
+{
+ return libraryFetchStarted() && !libraryFetchCompleted();
+}
+
+bool LLInventoryModelBackgroundFetch::inventoryFetchStarted() const
+{
+ return mRecursiveInventoryFetchStarted;
+}
+
+bool LLInventoryModelBackgroundFetch::inventoryFetchCompleted() const
+{
+ return inventoryFetchStarted() && fetchQueueContainsNoDescendentsOf(gInventory.getRootFolderID());
+}
+
+bool LLInventoryModelBackgroundFetch::inventoryFetchInProgress() const
+{
+ return inventoryFetchStarted() && !inventoryFetchCompleted();
+}
+
+bool LLInventoryModelBackgroundFetch::isEverythingFetched() const
+{
+ return mAllFoldersFetched;
+}
+
+BOOL LLInventoryModelBackgroundFetch::backgroundFetchActive() const
+{
+ return mBackgroundFetchActive;
+}
+
+void LLInventoryModelBackgroundFetch::start(const LLUUID& cat_id, BOOL recursive)
+{
+ if (!mAllFoldersFetched)
+ {
+ LL_DEBUGS("InventoryFetch") << "Start fetching category: " << cat_id << ", recursive: " << recursive << LL_ENDL;
+
+ mBackgroundFetchActive = TRUE;
+ if (cat_id.isNull())
+ {
+ if (!mRecursiveInventoryFetchStarted)
+ {
+ mRecursiveInventoryFetchStarted |= recursive;
+ mFetchQueue.push_back(FetchQueueInfo(gInventory.getRootFolderID(), recursive));
+ gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL);
+ }
+ if (!mRecursiveLibraryFetchStarted)
+ {
+ mRecursiveLibraryFetchStarted |= recursive;
+ mFetchQueue.push_back(FetchQueueInfo(gInventory.getLibraryRootFolderID(), recursive));
+ gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL);
+ }
+ }
+ else
+ {
+ // Specific folder requests go to front of queue.
+ if (mFetchQueue.empty() || mFetchQueue.front().mCatUUID != cat_id)
+ {
+ mFetchQueue.push_front(FetchQueueInfo(cat_id, recursive));
+ gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL);
+ }
+ if (cat_id == gInventory.getLibraryRootFolderID())
+ {
+ mRecursiveLibraryFetchStarted |= recursive;
+ }
+ if (cat_id == gInventory.getRootFolderID())
+ {
+ mRecursiveInventoryFetchStarted |= recursive;
+ }
+ }
+ }
+}
+
+void LLInventoryModelBackgroundFetch::findLostItems()
+{
+ mBackgroundFetchActive = TRUE;
+ mFetchQueue.push_back(FetchQueueInfo(LLUUID::null, TRUE));
+ gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL);
+}
+
+void LLInventoryModelBackgroundFetch::stopBackgroundFetch()
+{
+ if (mBackgroundFetchActive)
+ {
+ mBackgroundFetchActive = FALSE;
+ gIdleCallbacks.deleteFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL);
+ mBulkFetchCount=0;
+ mMinTimeBetweenFetches=0.0f;
+ }
+}
+
+void LLInventoryModelBackgroundFetch::setAllFoldersFetched()
+{
+ if (mRecursiveInventoryFetchStarted &&
+ mRecursiveLibraryFetchStarted)
+ {
+ mAllFoldersFetched = TRUE;
+ }
+ stopBackgroundFetch();
+}
+
+void LLInventoryModelBackgroundFetch::backgroundFetchCB(void *)
+{
+ LLInventoryModelBackgroundFetch::instance().backgroundFetch();
+}
+
+void LLInventoryModelBackgroundFetch::backgroundFetch()
+{
+ if (mBackgroundFetchActive && gAgent.getRegion())
+ {
+ // If we'll be using the capability, we'll be sending batches and the background thing isn't as important.
+ std::string url = gAgent.getRegion()->getCapability("WebFetchInventoryDescendents");
+ if (!url.empty())
+ {
+ bulkFetch(url);
+ return;
+ }
+
+#if 1
+ //--------------------------------------------------------------------------------
+ // DEPRECATED OLD CODE
+ //
+
+ // No more categories to fetch, stop fetch process.
+ if (mFetchQueue.empty())
+ {
+ llinfos << "Inventory fetch completed" << llendl;
+
+ setAllFoldersFetched();
+ return;
+ }
+
+ F32 fast_fetch_time = lerp(mMinTimeBetweenFetches, mMaxTimeBetweenFetches, 0.1f);
+ F32 slow_fetch_time = lerp(mMinTimeBetweenFetches, mMaxTimeBetweenFetches, 0.5f);
+ if (mTimelyFetchPending && mFetchTimer.getElapsedTimeF32() > slow_fetch_time)
+ {
+ // Double timeouts on failure.
+ mMinTimeBetweenFetches = llmin(mMinTimeBetweenFetches * 2.f, 10.f);
+ mMaxTimeBetweenFetches = llmin(mMaxTimeBetweenFetches * 2.f, 120.f);
+ llinfos << "Inventory fetch times grown to (" << mMinTimeBetweenFetches << ", " << mMaxTimeBetweenFetches << ")" << llendl;
+ // fetch is no longer considered "timely" although we will wait for full time-out.
+ mTimelyFetchPending = FALSE;
+ }
+
+ while(1)
+ {
+ if (mFetchQueue.empty())
+ {
+ break;
+ }
+
+ if(gDisconnected)
+ {
+ // Just bail if we are disconnected.
+ break;
+ }
+
+ const FetchQueueInfo info = mFetchQueue.front();
+ LLViewerInventoryCategory* cat = gInventory.getCategory(info.mCatUUID);
+
+ // Category has been deleted, remove from queue.
+ if (!cat)
+ {
+ mFetchQueue.pop_front();
+ continue;
+ }
+
+ if (mFetchTimer.getElapsedTimeF32() > mMinTimeBetweenFetches &&
+ LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion())
+ {
+ // Category exists but has no children yet, fetch the descendants
+ // for now, just request every time and rely on retry timer to throttle.
+ if (cat->fetch())
+ {
+ mFetchTimer.reset();
+ mTimelyFetchPending = TRUE;
+ }
+ else
+ {
+ // The catagory also tracks if it has expired and here it says it hasn't
+ // yet. Get out of here because nothing is going to happen until we
+ // update the timers.
+ break;
+ }
+ }
+ // Do I have all my children?
+ else if (gInventory.isCategoryComplete(info.mCatUUID))
+ {
+ // Finished with this category, remove from queue.
+ mFetchQueue.pop_front();
+
+ // Add all children to queue.
+ LLInventoryModel::cat_array_t* categories;
+ LLInventoryModel::item_array_t* items;
+ gInventory.getDirectDescendentsOf(cat->getUUID(), categories, items);
+ for (LLInventoryModel::cat_array_t::const_iterator it = categories->begin();
+ it != categories->end();
+ ++it)
+ {
+ mFetchQueue.push_back(FetchQueueInfo((*it)->getUUID(),info.mRecursive));
+ }
+
+ // We received a response in less than the fast time.
+ if (mTimelyFetchPending && mFetchTimer.getElapsedTimeF32() < fast_fetch_time)
+ {
+ // Shrink timeouts based on success.
+ mMinTimeBetweenFetches = llmax(mMinTimeBetweenFetches * 0.8f, 0.3f);
+ mMaxTimeBetweenFetches = llmax(mMaxTimeBetweenFetches * 0.8f, 10.f);
+ //llinfos << "Inventory fetch times shrunk to (" << mMinTimeBetweenFetches << ", " << mMaxTimeBetweenFetches << ")" << llendl;
+ }
+
+ mTimelyFetchPending = FALSE;
+ continue;
+ }
+ else if (mFetchTimer.getElapsedTimeF32() > mMaxTimeBetweenFetches)
+ {
+ // Received first packet, but our num descendants does not match db's num descendants
+ // so try again later.
+ mFetchQueue.pop_front();
+
+ if (mNumFetchRetries++ < MAX_FETCH_RETRIES)
+ {
+ // push on back of queue
+ mFetchQueue.push_back(info);
+ }
+ mTimelyFetchPending = FALSE;
+ mFetchTimer.reset();
+ break;
+ }
+
+ // Not enough time has elapsed to do a new fetch
+ break;
+ }
+
+ //
+ // DEPRECATED OLD CODE
+ //--------------------------------------------------------------------------------
+#endif
+ }
+}
+
+void LLInventoryModelBackgroundFetch::incrBulkFetch(S16 fetching)
+{
+ mBulkFetchCount += fetching;
+ if (mBulkFetchCount < 0)
+ {
+ mBulkFetchCount = 0;
+ }
+}
+
+
+class LLInventoryModelFetchDescendentsResponder: public LLHTTPClient::Responder
+{
+public:
+ LLInventoryModelFetchDescendentsResponder(const LLSD& request_sd, uuid_vec_t recursive_cats) :
+ mRequestSD(request_sd),
+ mRecursiveCatUUIDs(recursive_cats)
+ {};
+ //LLInventoryModelFetchDescendentsResponder() {};
+ void result(const LLSD& content);
+ void error(U32 status, const std::string& reason);
+protected:
+ BOOL getIsRecursive(const LLUUID& cat_id) const;
+private:
+ LLSD mRequestSD;
+ uuid_vec_t mRecursiveCatUUIDs; // hack for storing away which cat fetches are recursive
+};
+
+// If we get back a normal response, handle it here.
+void LLInventoryModelFetchDescendentsResponder::result(const LLSD& content)
+{
+ LLInventoryModelBackgroundFetch *fetcher = LLInventoryModelBackgroundFetch::getInstance();
+ if (content.has("folders"))
+ {
+
+ for(LLSD::array_const_iterator folder_it = content["folders"].beginArray();
+ folder_it != content["folders"].endArray();
+ ++folder_it)
+ {
+ LLSD folder_sd = *folder_it;
+
+
+ //LLUUID agent_id = folder_sd["agent_id"];
+
+ //if(agent_id != gAgent.getID()) //This should never happen.
+ //{
+ // llwarns << "Got a UpdateInventoryItem for the wrong agent."
+ // << llendl;
+ // break;
+ //}
+
+ LLUUID parent_id = folder_sd["folder_id"];
+ LLUUID owner_id = folder_sd["owner_id"];
+ S32 version = (S32)folder_sd["version"].asInteger();
+ S32 descendents = (S32)folder_sd["descendents"].asInteger();
+ LLPointer<LLViewerInventoryCategory> tcategory = new LLViewerInventoryCategory(owner_id);
+
+ if (parent_id.isNull())
+ {
+ LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem;
+ for(LLSD::array_const_iterator item_it = folder_sd["items"].beginArray();
+ item_it != folder_sd["items"].endArray();
+ ++item_it)
+ {
+ const LLUUID lost_uuid = gInventory.findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
+ if (lost_uuid.notNull())
+ {
+ LLSD item = *item_it;
+ titem->unpackMessage(item);
+
+ LLInventoryModel::update_list_t update;
+ LLInventoryModel::LLCategoryUpdate new_folder(lost_uuid, 1);
+ update.push_back(new_folder);
+ gInventory.accountForUpdate(update);
+
+ titem->setParent(lost_uuid);
+ titem->updateParentOnServer(FALSE);
+ gInventory.updateItem(titem);
+ gInventory.notifyObservers("fetchDescendents");
+
+ }
+ }
+ }
+
+ LLViewerInventoryCategory* pcat = gInventory.getCategory(parent_id);
+ if (!pcat)
+ {
+ continue;
+ }
+
+ for(LLSD::array_const_iterator category_it = folder_sd["categories"].beginArray();
+ category_it != folder_sd["categories"].endArray();
+ ++category_it)
+ {
+ LLSD category = *category_it;
+ tcategory->fromLLSD(category);
+
+ const BOOL recursive = getIsRecursive(tcategory->getUUID());
+
+ if (recursive)
+ {
+ fetcher->mFetchQueue.push_back(LLInventoryModelBackgroundFetch::FetchQueueInfo(tcategory->getUUID(), recursive));
+ }
+ else if ( !gInventory.isCategoryComplete(tcategory->getUUID()) )
+ {
+ gInventory.updateCategory(tcategory);
+ }
+
+ }
+ LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem;
+ for(LLSD::array_const_iterator item_it = folder_sd["items"].beginArray();
+ item_it != folder_sd["items"].endArray();
+ ++item_it)
+ {
+ LLSD item = *item_it;
+ titem->unpackMessage(item);
+
+ gInventory.updateItem(titem);
+ }
+
+ // Set version and descendentcount according to message.
+ LLViewerInventoryCategory* cat = gInventory.getCategory(parent_id);
+ if(cat)
+ {
+ cat->setVersion(version);
+ cat->setDescendentCount(descendents);
+ cat->determineFolderType();
+ }
+
+ }
+ }
+
+ if (content.has("bad_folders"))
+ {
+ for(LLSD::array_const_iterator folder_it = content["bad_folders"].beginArray();
+ folder_it != content["bad_folders"].endArray();
+ ++folder_it)
+ {
+ LLSD folder_sd = *folder_it;
+
+ // These folders failed on the dataserver. We probably don't want to retry them.
+ llinfos << "Folder " << folder_sd["folder_id"].asString()
+ << "Error: " << folder_sd["error"].asString() << llendl;
+ }
+ }
+
+ fetcher->incrBulkFetch(-1);
+
+ if (fetcher->isBulkFetchProcessingComplete())
+ {
+ llinfos << "Inventory fetch completed" << llendl;
+ fetcher->setAllFoldersFetched();
+ }
+
+ gInventory.notifyObservers("fetchDescendents");
+}
+
+// If we get back an error (not found, etc...), handle it here.
+void LLInventoryModelFetchDescendentsResponder::error(U32 status, const std::string& reason)
+{
+ LLInventoryModelBackgroundFetch *fetcher = LLInventoryModelBackgroundFetch::getInstance();
+
+ llinfos << "LLInventoryModelFetchDescendentsResponder::error "
+ << status << ": " << reason << llendl;
+
+ fetcher->incrBulkFetch(-1);
+
+ if (status==499) // timed out
+ {
+ for(LLSD::array_const_iterator folder_it = mRequestSD["folders"].beginArray();
+ folder_it != mRequestSD["folders"].endArray();
+ ++folder_it)
+ {
+ LLSD folder_sd = *folder_it;
+ LLUUID folder_id = folder_sd["folder_id"];
+ const BOOL recursive = getIsRecursive(folder_id);
+ fetcher->mFetchQueue.push_front(LLInventoryModelBackgroundFetch::FetchQueueInfo(folder_id, recursive));
+ }
+ }
+ else
+ {
+ if (fetcher->isBulkFetchProcessingComplete())
+ {
+ fetcher->setAllFoldersFetched();
+ }
+ }
+ gInventory.notifyObservers("fetchDescendents");
+}
+
+BOOL LLInventoryModelFetchDescendentsResponder::getIsRecursive(const LLUUID& cat_id) const
+{
+ return (std::find(mRecursiveCatUUIDs.begin(),mRecursiveCatUUIDs.end(), cat_id) != mRecursiveCatUUIDs.end());
+}
+
+// Bundle up a bunch of requests to send all at once.
+// static
+void LLInventoryModelBackgroundFetch::bulkFetch(std::string url)
+{
+ //Background fetch is called from gIdleCallbacks in a loop until background fetch is stopped.
+ //If there are items in mFetchQueue, we want to check the time since the last bulkFetch was
+ //sent. If it exceeds our retry time, go ahead and fire off another batch.
+ //Stopbackgroundfetch will be run from the Responder instead of here.
+
+ S16 max_concurrent_fetches=8;
+ F32 new_min_time = 0.5f; //HACK! Clean this up when old code goes away entirely.
+ if (mMinTimeBetweenFetches < new_min_time)
+ {
+ mMinTimeBetweenFetches=new_min_time; //HACK! See above.
+ }
+
+ if (gDisconnected ||
+ (mBulkFetchCount > max_concurrent_fetches) ||
+ (mFetchTimer.getElapsedTimeF32() < mMinTimeBetweenFetches))
+ {
+ return; // just bail if we are disconnected
+ }
+
+ U32 folder_count=0;
+ U32 max_batch_size=5;
+
+ U32 sort_order = gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER) & 0x1;
+
+ uuid_vec_t recursive_cats;
+
+ LLSD body;
+ LLSD body_lib;
+
+ while (!(mFetchQueue.empty()) && (folder_count < max_batch_size))
+ {
+ const FetchQueueInfo& fetch_info = mFetchQueue.front();
+ const LLUUID &cat_id = fetch_info.mCatUUID;
+ if (cat_id.isNull()) //DEV-17797
+ {
+ LLSD folder_sd;
+ folder_sd["folder_id"] = LLUUID::null.asString();
+ folder_sd["owner_id"] = gAgent.getID();
+ folder_sd["sort_order"] = (LLSD::Integer)sort_order;
+ folder_sd["fetch_folders"] = (LLSD::Boolean)FALSE;
+ folder_sd["fetch_items"] = (LLSD::Boolean)TRUE;
+ body["folders"].append(folder_sd);
+ folder_count++;
+ }
+ else
+ {
+ const LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id);
+
+ if (cat)
+ {
+ if (LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion())
+ {
+ LLSD folder_sd;
+ folder_sd["folder_id"] = cat->getUUID();
+ folder_sd["owner_id"] = cat->getOwnerID();
+ folder_sd["sort_order"] = (LLSD::Integer)sort_order;
+ folder_sd["fetch_folders"] = TRUE; //(LLSD::Boolean)sFullFetchStarted;
+ folder_sd["fetch_items"] = (LLSD::Boolean)TRUE;
+
+ if (ALEXANDRIA_LINDEN_ID == cat->getOwnerID())
+ body_lib["folders"].append(folder_sd);
+ else
+ body["folders"].append(folder_sd);
+ folder_count++;
+ }
+ // May already have this folder, but append child folders to list.
+ if (fetch_info.mRecursive)
+ {
+ LLInventoryModel::cat_array_t* categories;
+ LLInventoryModel::item_array_t* items;
+ gInventory.getDirectDescendentsOf(cat->getUUID(), categories, items);
+ for (LLInventoryModel::cat_array_t::const_iterator it = categories->begin();
+ it != categories->end();
+ ++it)
+ {
+ mFetchQueue.push_back(FetchQueueInfo((*it)->getUUID(), fetch_info.mRecursive));
+ }
+ }
+ }
+ }
+ if (fetch_info.mRecursive)
+ recursive_cats.push_back(cat_id);
+
+ mFetchQueue.pop_front();
+ }
+
+ if (folder_count > 0)
+ {
+ mBulkFetchCount++;
+ if (body["folders"].size())
+ {
+ LLInventoryModelFetchDescendentsResponder *fetcher = new LLInventoryModelFetchDescendentsResponder(body, recursive_cats);
+ LLHTTPClient::post(url, body, fetcher, 300.0);
+ }
+ if (body_lib["folders"].size())
+ {
+ std::string url_lib = gAgent.getRegion()->getCapability("FetchLibDescendents");
+
+ LLInventoryModelFetchDescendentsResponder *fetcher = new LLInventoryModelFetchDescendentsResponder(body_lib, recursive_cats);
+ LLHTTPClient::post(url_lib, body_lib, fetcher, 300.0);
+ }
+ mFetchTimer.reset();
+ }
+ else if (isBulkFetchProcessingComplete())
+ {
+ setAllFoldersFetched();
+ }
+}
+
+bool LLInventoryModelBackgroundFetch::fetchQueueContainsNoDescendentsOf(const LLUUID& cat_id) const
+{
+ for (fetch_queue_t::const_iterator it = mFetchQueue.begin();
+ it != mFetchQueue.end(); ++it)
+ {
+ const LLUUID& fetch_id = (*it).mCatUUID;
+ if (gInventory.isObjectDescendentOf(fetch_id, cat_id))
+ return false;
+ }
+ return true;
+}
+
+
diff --git a/indra/newview/llinventorymodelbackgroundfetch.h b/indra/newview/llinventorymodelbackgroundfetch.h
new file mode 100644
index 0000000000..04f96586d7
--- /dev/null
+++ b/indra/newview/llinventorymodelbackgroundfetch.h
@@ -0,0 +1,108 @@
+/**
+ * @file llinventorymodelbackgroundfetch.h
+ * @brief LLInventoryModelBackgroundFetch class header file
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLINVENTORYMODELBACKGROUNDFETCH_H
+#define LL_LLINVENTORYMODELBACKGROUNDFETCH_H
+
+#include "llsingleton.h"
+#include "lluuid.h"
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryModelBackgroundFetch
+//
+// This class handles background fetches, which are fetches of
+// inventory folder. Fetches can be recursive or not.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLInventoryModelBackgroundFetch : public LLSingleton<LLInventoryModelBackgroundFetch>
+{
+ friend class LLInventoryModelFetchDescendentsResponder;
+
+public:
+ LLInventoryModelBackgroundFetch();
+ ~LLInventoryModelBackgroundFetch();
+
+ // Start and stop background breadth-first fetching of inventory contents.
+ // This gets triggered when performing a filter-search.
+ void start(const LLUUID& cat_id = LLUUID::null, BOOL recursive = TRUE);
+
+ BOOL backgroundFetchActive() const;
+ bool isEverythingFetched() const; // completing the fetch once per session should be sufficient
+
+ bool libraryFetchStarted() const;
+ bool libraryFetchCompleted() const;
+ bool libraryFetchInProgress() const;
+
+ bool inventoryFetchStarted() const;
+ bool inventoryFetchCompleted() const;
+ bool inventoryFetchInProgress() const;
+
+ void findLostItems();
+protected:
+ void incrBulkFetch(S16 fetching);
+ bool isBulkFetchProcessingComplete() const;
+ void bulkFetch(std::string url);
+
+ void backgroundFetch();
+ static void backgroundFetchCB(void*); // background fetch idle function
+ void stopBackgroundFetch(); // stop fetch process
+
+ void setAllFoldersFetched();
+ bool fetchQueueContainsNoDescendentsOf(const LLUUID& cat_id) const;
+private:
+ BOOL mRecursiveInventoryFetchStarted;
+ BOOL mRecursiveLibraryFetchStarted;
+ BOOL mAllFoldersFetched;
+
+ BOOL mBackgroundFetchActive;
+ S16 mBulkFetchCount;
+ BOOL mTimelyFetchPending;
+ S32 mNumFetchRetries;
+
+ LLFrameTimer mFetchTimer;
+ F32 mMinTimeBetweenFetches;
+ F32 mMaxTimeBetweenFetches;
+
+ struct FetchQueueInfo
+ {
+ FetchQueueInfo(const LLUUID& id, BOOL recursive) :
+ mCatUUID(id), mRecursive(recursive)
+ {
+ }
+ LLUUID mCatUUID;
+ BOOL mRecursive;
+ };
+ typedef std::deque<FetchQueueInfo> fetch_queue_t;
+ fetch_queue_t mFetchQueue;
+};
+
+#endif // LL_LLINVENTORYMODELBACKGROUNDFETCH_H
+
diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp
index 2fb8aea4e9..bd6877d9d3 100644
--- a/indra/newview/llinventoryobserver.cpp
+++ b/indra/newview/llinventoryobserver.cpp
@@ -54,7 +54,6 @@
#include "llappviewer.h"
#include "lldbstrings.h"
#include "llviewerstats.h"
-#include "llmutelist.h"
#include "llnotificationsutil.h"
#include "llcallbacklist.h"
#include "llpreview.h"
@@ -63,6 +62,9 @@
#include "llsdutil.h"
#include <deque>
+const F32 LLInventoryFetchItemsObserver::FETCH_TIMER_EXPIRY = 60.0f;
+
+
LLInventoryObserver::LLInventoryObserver()
{
}
@@ -72,21 +74,51 @@ LLInventoryObserver::~LLInventoryObserver()
{
}
+LLInventoryFetchObserver::LLInventoryFetchObserver(const LLUUID& id)
+{
+ mIDs.clear();
+ if (id != LLUUID::null)
+ {
+ setFetchID(id);
+ }
+}
+
+LLInventoryFetchObserver::LLInventoryFetchObserver(const uuid_vec_t& ids)
+{
+ setFetchIDs(ids);
+}
+
+BOOL LLInventoryFetchObserver::isFinished() const
+{
+ return mIncomplete.empty();
+}
+
+void LLInventoryFetchObserver::setFetchIDs(const uuid_vec_t& ids)
+{
+ mIDs = ids;
+}
+void LLInventoryFetchObserver::setFetchID(const LLUUID& id)
+{
+ mIDs.clear();
+ mIDs.push_back(id);
+}
+
+
void LLInventoryCompletionObserver::changed(U32 mask)
{
// scan through the incomplete items and move or erase them as
// appropriate.
- if(!mIncomplete.empty())
+ if (!mIncomplete.empty())
{
- for(item_ref_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); )
+ for (uuid_vec_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); )
{
- LLViewerInventoryItem* item = gInventory.getItem(*it);
- if(!item)
+ const LLViewerInventoryItem* item = gInventory.getItem(*it);
+ if (!item)
{
it = mIncomplete.erase(it);
continue;
}
- if(item->isComplete())
+ if (item->isFinished())
{
mComplete.push_back(*it);
it = mIncomplete.erase(it);
@@ -94,7 +126,7 @@ void LLInventoryCompletionObserver::changed(U32 mask)
}
++it;
}
- if(mIncomplete.empty())
+ if (mIncomplete.empty())
{
done();
}
@@ -103,65 +135,79 @@ void LLInventoryCompletionObserver::changed(U32 mask)
void LLInventoryCompletionObserver::watchItem(const LLUUID& id)
{
- if(id.notNull())
+ if (id.notNull())
{
mIncomplete.push_back(id);
}
}
+LLInventoryFetchItemsObserver::LLInventoryFetchItemsObserver(const LLUUID& item_id) :
+ LLInventoryFetchObserver(item_id)
+{
+ mIDs.clear();
+ mIDs.push_back(item_id);
+}
-void LLInventoryFetchObserver::changed(U32 mask)
+LLInventoryFetchItemsObserver::LLInventoryFetchItemsObserver(const uuid_vec_t& item_ids) :
+ LLInventoryFetchObserver(item_ids)
{
+}
+
+void LLInventoryFetchItemsObserver::changed(U32 mask)
+{
+ lldebugs << this << " remaining incomplete " << mIncomplete.size()
+ << " complete " << mComplete.size()
+ << " wait period " << mFetchingPeriod.getRemainingTimeF32()
+ << llendl;
+
// scan through the incomplete items and move or erase them as
// appropriate.
- if(!mIncomplete.empty())
+ if (!mIncomplete.empty())
{
- for(item_ref_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); )
+
+ // Have we exceeded max wait time?
+ bool timeout_expired = mFetchingPeriod.hasExpired();
+
+ for (uuid_vec_t::iterator it = mIncomplete.begin(); it < mIncomplete.end(); )
{
- LLViewerInventoryItem* item = gInventory.getItem(*it);
- if(!item)
+ const LLUUID& item_id = (*it);
+ LLViewerInventoryItem* item = gInventory.getItem(item_id);
+ if (item && item->isFinished())
{
- if (mRetryIfMissing)
+ mComplete.push_back(item_id);
+ it = mIncomplete.erase(it);
+ }
+ else
+ {
+ if (timeout_expired)
{
- // BAP changed to skip these items, so we should keep retrying until they arrive.
- // Did not make this the default behavior because of uncertainty about impact -
- // could cause some observers that currently complete to wait forever.
- ++it;
+ // Just concede that this item hasn't arrived in reasonable time and continue on.
+ llwarns << "Fetcher timed out when fetching inventory item UUID: " << item_id << LL_ENDL;
+ it = mIncomplete.erase(it);
}
else
{
- // BUG: This can cause done() to get called prematurely below.
- // This happens with the LLGestureInventoryFetchObserver that
- // loads gestures at startup. JC
- it = mIncomplete.erase(it);
+ // Keep trying.
+ ++it;
}
- continue;
}
- if(item->isComplete())
- {
- mComplete.push_back(*it);
- it = mIncomplete.erase(it);
- continue;
- }
- ++it;
- }
- if(mIncomplete.empty())
- {
- done();
}
+
}
- //llinfos << "LLInventoryFetchObserver::changed() mComplete size " << mComplete.size() << llendl;
- //llinfos << "LLInventoryFetchObserver::changed() mIncomplete size " << mIncomplete.size() << llendl;
-}
-bool LLInventoryFetchObserver::isEverythingComplete() const
-{
- return mIncomplete.empty();
+ if (mIncomplete.empty())
+ {
+ lldebugs << this << " done at remaining incomplete "
+ << mIncomplete.size() << " complete " << mComplete.size() << llendl;
+ done();
+ }
+ //llinfos << "LLInventoryFetchItemsObserver::changed() mComplete size " << mComplete.size() << llendl;
+ //llinfos << "LLInventoryFetchItemsObserver::changed() mIncomplete size " << mIncomplete.size() << llendl;
}
void fetch_items_from_llsd(const LLSD& items_llsd)
{
- if (!items_llsd.size()) return;
+ if (!items_llsd.size() || gDisconnected) return;
LLSD body;
body[0]["cap_name"] = "FetchInventory";
body[1]["cap_name"] = "FetchLib";
@@ -181,6 +227,11 @@ void fetch_items_from_llsd(const LLSD& items_llsd)
for (S32 i=0; i<body.size(); i++)
{
+ if(!gAgent.getRegion())
+ {
+ llwarns<<"Agent's region is null"<<llendl;
+ break;
+ }
if (0 >= body[i].size()) continue;
std::string url = gAgent.getRegion()->getCapability(body[i]["cap_name"].asString());
@@ -196,7 +247,7 @@ void fetch_items_from_llsd(const LLSD& items_llsd)
for (S32 j=0; j<body[i]["items"].size(); j++)
{
LLSD item_entry = body[i]["items"][j];
- if(start_new_message)
+ if (start_new_message)
{
start_new_message = FALSE;
msg->newMessageFast(_PREHASH_FetchInventory);
@@ -207,30 +258,29 @@ void fetch_items_from_llsd(const LLSD& items_llsd)
msg->nextBlockFast(_PREHASH_InventoryData);
msg->addUUIDFast(_PREHASH_OwnerID, item_entry["owner_id"].asUUID());
msg->addUUIDFast(_PREHASH_ItemID, item_entry["item_id"].asUUID());
- if(msg->isSendFull(NULL))
+ if (msg->isSendFull(NULL))
{
start_new_message = TRUE;
gAgent.sendReliableMessage();
}
}
- if(!start_new_message)
+ if (!start_new_message)
{
gAgent.sendReliableMessage();
}
}
}
-void LLInventoryFetchObserver::fetchItems(
- const LLInventoryFetchObserver::item_ref_t& ids)
+void LLInventoryFetchItemsObserver::startFetch()
{
LLUUID owner_id;
LLSD items_llsd;
- for(item_ref_t::const_iterator it = ids.begin(); it < ids.end(); ++it)
+ for (uuid_vec_t::const_iterator it = mIDs.begin(); it < mIDs.end(); ++it)
{
LLViewerInventoryItem* item = gInventory.getItem(*it);
- if(item)
+ if (item)
{
- if(item->isComplete())
+ if (item->isFinished())
{
// It's complete, so put it on the complete container.
mComplete.push_back(*it);
@@ -246,7 +296,16 @@ void LLInventoryFetchObserver::fetchItems(
// assume it's agent inventory.
owner_id = gAgent.getID();
}
-
+
+ // Ignore categories since they're not items. We
+ // could also just add this to mComplete but not sure what the
+ // side-effects would be, so ignoring to be safe.
+ LLViewerInventoryCategory* cat = gInventory.getCategory(*it);
+ if (cat)
+ {
+ continue;
+ }
+
// It's incomplete, so put it on the incomplete container, and
// pack this on the message.
mIncomplete.push_back(*it);
@@ -257,87 +316,95 @@ void LLInventoryFetchObserver::fetchItems(
item_entry["item_id"] = (*it);
items_llsd.append(item_entry);
}
+
+ mFetchingPeriod.reset();
+ mFetchingPeriod.setTimerExpirySec(FETCH_TIMER_EXPIRY);
+
fetch_items_from_llsd(items_llsd);
}
+LLInventoryFetchDescendentsObserver::LLInventoryFetchDescendentsObserver(const LLUUID& cat_id) :
+ LLInventoryFetchObserver(cat_id)
+{
+}
+
+LLInventoryFetchDescendentsObserver::LLInventoryFetchDescendentsObserver(const uuid_vec_t& cat_ids) :
+ LLInventoryFetchObserver(cat_ids)
+{
+}
+
// virtual
void LLInventoryFetchDescendentsObserver::changed(U32 mask)
{
- for(folder_ref_t::iterator it = mIncompleteFolders.begin(); it < mIncompleteFolders.end();)
+ for (uuid_vec_t::iterator it = mIncomplete.begin(); it < mIncomplete.end();)
{
- LLViewerInventoryCategory* cat = gInventory.getCategory(*it);
- if(!cat)
+ const LLViewerInventoryCategory* cat = gInventory.getCategory(*it);
+ if (!cat)
{
- it = mIncompleteFolders.erase(it);
+ it = mIncomplete.erase(it);
continue;
}
- if(isComplete(cat))
+ if (isCategoryComplete(cat))
{
- mCompleteFolders.push_back(*it);
- it = mIncompleteFolders.erase(it);
+ mComplete.push_back(*it);
+ it = mIncomplete.erase(it);
continue;
}
++it;
}
- if(mIncompleteFolders.empty())
+ if (mIncomplete.empty())
{
done();
}
}
-void LLInventoryFetchDescendentsObserver::fetchDescendents(
- const folder_ref_t& ids)
+void LLInventoryFetchDescendentsObserver::startFetch()
{
- for(folder_ref_t::const_iterator it = ids.begin(); it != ids.end(); ++it)
+ for (uuid_vec_t::const_iterator it = mIDs.begin(); it != mIDs.end(); ++it)
{
LLViewerInventoryCategory* cat = gInventory.getCategory(*it);
- if(!cat) continue;
- if(!isComplete(cat))
+ if (!cat) continue;
+ if (!isCategoryComplete(cat))
{
- cat->fetchDescendents(); //blindly fetch it without seeing if anything else is fetching it.
- mIncompleteFolders.push_back(*it); //Add to list of things being downloaded for this observer.
+ cat->fetch(); //blindly fetch it without seeing if anything else is fetching it.
+ mIncomplete.push_back(*it); //Add to list of things being downloaded for this observer.
}
else
{
- mCompleteFolders.push_back(*it);
+ mComplete.push_back(*it);
}
}
}
-bool LLInventoryFetchDescendentsObserver::isEverythingComplete() const
-{
- return mIncompleteFolders.empty();
-}
-
-bool LLInventoryFetchDescendentsObserver::isComplete(LLViewerInventoryCategory* cat)
+BOOL LLInventoryFetchDescendentsObserver::isCategoryComplete(const LLViewerInventoryCategory* cat) const
{
const S32 version = cat->getVersion();
const S32 expected_num_descendents = cat->getDescendentCount();
if ((version == LLViewerInventoryCategory::VERSION_UNKNOWN) ||
(expected_num_descendents == LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN))
{
- return false;
+ return FALSE;
}
// it might be complete - check known descendents against
// currently available.
LLInventoryModel::cat_array_t* cats;
LLInventoryModel::item_array_t* items;
gInventory.getDirectDescendentsOf(cat->getUUID(), cats, items);
- if(!cats || !items)
+ if (!cats || !items)
{
llwarns << "Category '" << cat->getName() << "' descendents corrupted, fetch failed." << llendl;
// NULL means the call failed -- cats/items map doesn't exist (note: this does NOT mean
// that the cat just doesn't have any items or subfolders).
// Unrecoverable, so just return done so that this observer can be cleared
// from memory.
- return true;
+ return TRUE;
}
const S32 current_num_known_descendents = cats->count() + items->count();
// Got the number of descendents that we were expecting, so we're done.
if (current_num_known_descendents == expected_num_descendents)
{
- return true;
+ return TRUE;
}
// Error condition, but recoverable. This happens if something was added to the
@@ -346,125 +413,62 @@ bool LLInventoryFetchDescendentsObserver::isComplete(LLViewerInventoryCategory*
if (current_num_known_descendents >= expected_num_descendents)
{
llwarns << "Category '" << cat->getName() << "' expected descendentcount:" << expected_num_descendents << " descendents but got descendentcount:" << current_num_known_descendents << llendl;
- cat->setDescendentCount(current_num_known_descendents);
- return true;
+ const_cast<LLViewerInventoryCategory *>(cat)->setDescendentCount(current_num_known_descendents);
+ return TRUE;
}
- return false;
+ return FALSE;
}
-void LLInventoryFetchComboObserver::changed(U32 mask)
+LLInventoryFetchComboObserver::LLInventoryFetchComboObserver(const uuid_vec_t& folder_ids,
+ const uuid_vec_t& item_ids)
{
- if(!mIncompleteItems.empty())
- {
- for(item_ref_t::iterator it = mIncompleteItems.begin(); it < mIncompleteItems.end(); )
- {
- LLViewerInventoryItem* item = gInventory.getItem(*it);
- if(!item)
- {
- it = mIncompleteItems.erase(it);
- continue;
- }
- if(item->isComplete())
- {
- mCompleteItems.push_back(*it);
- it = mIncompleteItems.erase(it);
- continue;
- }
- ++it;
- }
- }
- if(!mIncompleteFolders.empty())
+ mFetchDescendents = new LLInventoryFetchDescendentsObserver(folder_ids);
+
+ uuid_vec_t pruned_item_ids;
+ for (uuid_vec_t::const_iterator item_iter = item_ids.begin();
+ item_iter != item_ids.end();
+ ++item_iter)
{
- for(folder_ref_t::iterator it = mIncompleteFolders.begin(); it < mIncompleteFolders.end();)
+ const LLUUID& item_id = (*item_iter);
+ const LLViewerInventoryItem* item = gInventory.getItem(item_id);
+ if (item && std::find(folder_ids.begin(), folder_ids.end(), item->getParentUUID()) == folder_ids.end())
{
- LLViewerInventoryCategory* cat = gInventory.getCategory(*it);
- if(!cat)
- {
- it = mIncompleteFolders.erase(it);
- continue;
- }
- if(gInventory.isCategoryComplete(*it))
- {
- mCompleteFolders.push_back(*it);
- it = mIncompleteFolders.erase(it);
- continue;
- }
- ++it;
+ continue;
}
+ pruned_item_ids.push_back(item_id);
}
- if(!mDone && mIncompleteItems.empty() && mIncompleteFolders.empty())
- {
- mDone = true;
- done();
- }
+
+ mFetchItems = new LLInventoryFetchItemsObserver(pruned_item_ids);
+ mFetchDescendents = new LLInventoryFetchDescendentsObserver(folder_ids);
}
-void LLInventoryFetchComboObserver::fetch(
- const folder_ref_t& folder_ids,
- const item_ref_t& item_ids)
+LLInventoryFetchComboObserver::~LLInventoryFetchComboObserver()
{
- lldebugs << "LLInventoryFetchComboObserver::fetch()" << llendl;
- for(folder_ref_t::const_iterator fit = folder_ids.begin(); fit != folder_ids.end(); ++fit)
- {
- LLViewerInventoryCategory* cat = gInventory.getCategory(*fit);
- if(!cat) continue;
- if(!gInventory.isCategoryComplete(*fit))
- {
- cat->fetchDescendents();
- lldebugs << "fetching folder " << *fit <<llendl;
- mIncompleteFolders.push_back(*fit);
- }
- else
- {
- mCompleteFolders.push_back(*fit);
- lldebugs << "completing folder " << *fit <<llendl;
- }
- }
+ mFetchItems->done();
+ mFetchDescendents->done();
+ delete mFetchItems;
+ delete mFetchDescendents;
+}
- // Now for the items - we fetch everything which is not a direct
- // descendent of an incomplete folder because the item will show
- // up in an inventory descendents message soon enough so we do not
- // have to fetch it individually.
- LLSD items_llsd;
- LLUUID owner_id;
- for(item_ref_t::const_iterator iit = item_ids.begin(); iit != item_ids.end(); ++iit)
+void LLInventoryFetchComboObserver::changed(U32 mask)
+{
+ mFetchItems->changed(mask);
+ mFetchDescendents->changed(mask);
+ if (mFetchItems->isFinished() && mFetchDescendents->isFinished())
{
- LLViewerInventoryItem* item = gInventory.getItem(*iit);
- if(!item)
- {
- lldebugs << "uanble to find item " << *iit << llendl;
- continue;
- }
- if(item->isComplete())
- {
- // It's complete, so put it on the complete container.
- mCompleteItems.push_back(*iit);
- lldebugs << "completing item " << *iit << llendl;
- continue;
- }
- else
- {
- mIncompleteItems.push_back(*iit);
- owner_id = item->getPermissions().getOwner();
- }
- if(std::find(mIncompleteFolders.begin(), mIncompleteFolders.end(), item->getParentUUID()) == mIncompleteFolders.end())
- {
- LLSD item_entry;
- item_entry["owner_id"] = owner_id;
- item_entry["item_id"] = (*iit);
- items_llsd.append(item_entry);
- }
- else
- {
- lldebugs << "not worrying about " << *iit << llendl;
- }
+ done();
}
- fetch_items_from_llsd(items_llsd);
+}
+
+void LLInventoryFetchComboObserver::startFetch()
+{
+ mFetchItems->startFetch();
+ mFetchDescendents->startFetch();
}
void LLInventoryExistenceObserver::watchItem(const LLUUID& id)
{
- if(id.notNull())
+ if (id.notNull())
{
mMIA.push_back(id);
}
@@ -474,12 +478,12 @@ void LLInventoryExistenceObserver::changed(U32 mask)
{
// scan through the incomplete items and move or erase them as
// appropriate.
- if(!mMIA.empty())
+ if (!mMIA.empty())
{
- for(item_ref_t::iterator it = mMIA.begin(); it < mMIA.end(); )
+ for (uuid_vec_t::iterator it = mMIA.begin(); it < mMIA.end(); )
{
LLViewerInventoryItem* item = gInventory.getItem(*it);
- if(!item)
+ if (!item)
{
++it;
continue;
@@ -487,20 +491,89 @@ void LLInventoryExistenceObserver::changed(U32 mask)
mExist.push_back(*it);
it = mMIA.erase(it);
}
- if(mMIA.empty())
+ if (mMIA.empty())
{
done();
}
}
}
-void LLInventoryAddedObserver::changed(U32 mask)
+void LLInventoryAddItemByAssetObserver::changed(U32 mask)
{
if(!(mask & LLInventoryObserver::ADD))
{
return;
}
+ // nothing is watched
+ if (mWatchedAssets.size() == 0)
+ {
+ return;
+ }
+
+ LLMessageSystem* msg = gMessageSystem;
+ if (!(msg->getMessageName() && (0 == strcmp(msg->getMessageName(), "UpdateCreateInventoryItem"))))
+ {
+ // this is not our message
+ return; // to prevent a crash. EXT-7921;
+ }
+
+ LLPointer<LLViewerInventoryItem> item = new LLViewerInventoryItem;
+ S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_InventoryData);
+ for(S32 i = 0; i < num_blocks; ++i)
+ {
+ item->unpackMessage(msg, _PREHASH_InventoryData, i);
+ const LLUUID& asset_uuid = item->getAssetUUID();
+ if (item->getUUID().notNull() && asset_uuid.notNull())
+ {
+ if (isAssetWatched(asset_uuid))
+ {
+ LL_DEBUGS("Inventory_Move") << "Found asset UUID: " << asset_uuid << LL_ENDL;
+ mAddedItems.push_back(item->getUUID());
+ }
+ }
+ }
+
+ if (mAddedItems.size() == mWatchedAssets.size())
+ {
+ done();
+ LL_DEBUGS("Inventory_Move") << "All watched items are added & processed." << LL_ENDL;
+ mAddedItems.clear();
+
+ // Unable to clean watched items here due to somebody can require to check them in current frame.
+ // set dirty state to clean them while next watch cycle.
+ mIsDirty = true;
+ }
+}
+
+void LLInventoryAddItemByAssetObserver::watchAsset(const LLUUID& asset_id)
+{
+ if(asset_id.notNull())
+ {
+ if (mIsDirty)
+ {
+ LL_DEBUGS("Inventory_Move") << "Watched items are dirty. Clean them." << LL_ENDL;
+ mWatchedAssets.clear();
+ mIsDirty = false;
+ }
+
+ mWatchedAssets.push_back(asset_id);
+ onAssetAdded(asset_id);
+ }
+}
+
+bool LLInventoryAddItemByAssetObserver::isAssetWatched( const LLUUID& asset_id )
+{
+ return std::find(mWatchedAssets.begin(), mWatchedAssets.end(), asset_id) != mWatchedAssets.end();
+}
+
+void LLInventoryAddedObserver::changed(U32 mask)
+{
+ if (!(mask & LLInventoryObserver::ADD))
+ {
+ return;
+ }
+
// *HACK: If this was in response to a packet off
// the network, figure out which item was updated.
LLMessageSystem* msg = gMessageSystem;
@@ -528,7 +601,7 @@ void LLInventoryAddedObserver::changed(U32 mask)
LLPointer<LLViewerInventoryItem> titem = new LLViewerInventoryItem;
S32 num_blocks = msg->getNumberOfBlocksFast(_PREHASH_InventoryData);
- for(S32 i = 0; i < num_blocks; ++i)
+ for (S32 i = 0; i < num_blocks; ++i)
{
titem->unpackMessage(msg, _PREHASH_InventoryData, i);
if (!(titem->getUUID().isNull()))
@@ -543,46 +616,45 @@ void LLInventoryAddedObserver::changed(U32 mask)
}
}
-LLInventoryTransactionObserver::LLInventoryTransactionObserver(
- const LLTransactionID& transaction_id) :
+LLInventoryTransactionObserver::LLInventoryTransactionObserver(const LLTransactionID& transaction_id) :
mTransactionID(transaction_id)
{
}
void LLInventoryTransactionObserver::changed(U32 mask)
{
- if(mask & LLInventoryObserver::ADD)
+ if (mask & LLInventoryObserver::ADD)
{
// This could be it - see if we are processing a bulk update
LLMessageSystem* msg = gMessageSystem;
- if(msg->getMessageName()
+ if (msg->getMessageName()
&& (0 == strcmp(msg->getMessageName(), "BulkUpdateInventory")))
{
// we have a match for the message - now check the
// transaction id.
LLUUID id;
msg->getUUIDFast(_PREHASH_AgentData, _PREHASH_TransactionID, id);
- if(id == mTransactionID)
+ if (id == mTransactionID)
{
// woo hoo, we found it
- folder_ref_t folders;
- item_ref_t items;
+ uuid_vec_t folders;
+ uuid_vec_t items;
S32 count;
count = msg->getNumberOfBlocksFast(_PREHASH_FolderData);
S32 i;
- for(i = 0; i < count; ++i)
+ for (i = 0; i < count; ++i)
{
msg->getUUIDFast(_PREHASH_FolderData, _PREHASH_FolderID, id, i);
- if(id.notNull())
+ if (id.notNull())
{
folders.push_back(id);
}
}
count = msg->getNumberOfBlocksFast(_PREHASH_ItemData);
- for(i = 0; i < count; ++i)
+ for (i = 0; i < count; ++i)
{
msg->getUUIDFast(_PREHASH_ItemData, _PREHASH_ItemID, id, i);
- if(id.notNull())
+ if (id.notNull())
{
items.push_back(id);
}
@@ -594,3 +666,105 @@ void LLInventoryTransactionObserver::changed(U32 mask)
}
}
}
+
+void LLInventoryCategoriesObserver::changed(U32 mask)
+{
+ if (!mCategoryMap.size())
+ return;
+
+ for (category_map_t::iterator iter = mCategoryMap.begin();
+ iter != mCategoryMap.end();
+ ++iter)
+ {
+ LLViewerInventoryCategory* category = gInventory.getCategory((*iter).first);
+ if (!category)
+ continue;
+
+ const S32 version = category->getVersion();
+ const S32 expected_num_descendents = category->getDescendentCount();
+ if ((version == LLViewerInventoryCategory::VERSION_UNKNOWN) ||
+ (expected_num_descendents == LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN))
+ {
+ continue;
+ }
+
+ // Check number of known descendents to find out whether it has changed.
+ LLInventoryModel::cat_array_t* cats;
+ LLInventoryModel::item_array_t* items;
+ gInventory.getDirectDescendentsOf((*iter).first, cats, items);
+ if (!cats || !items)
+ {
+ llwarns << "Category '" << category->getName() << "' descendents corrupted, fetch failed." << llendl;
+ // NULL means the call failed -- cats/items map doesn't exist (note: this does NOT mean
+ // that the cat just doesn't have any items or subfolders).
+ // Unrecoverable, so just skip this category.
+
+ llassert(cats != NULL && items != NULL);
+
+ continue;
+ }
+
+ const S32 current_num_known_descendents = cats->count() + items->count();
+
+ LLCategoryData cat_data = (*iter).second;
+
+ // If category version or descendents count has changed
+ // update category data in mCategoryMap and fire a callback.
+ if (version != cat_data.mVersion || current_num_known_descendents != cat_data.mDescendentsCount)
+ {
+ cat_data.mVersion = version;
+ cat_data.mDescendentsCount = current_num_known_descendents;
+
+ cat_data.mCallback();
+ }
+ }
+}
+
+bool LLInventoryCategoriesObserver::addCategory(const LLUUID& cat_id, callback_t cb)
+{
+ S32 version = LLViewerInventoryCategory::VERSION_UNKNOWN;
+ S32 current_num_known_descendents = LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN;
+ bool can_be_added = true;
+
+ LLViewerInventoryCategory* category = gInventory.getCategory(cat_id);
+ // If category could not be retrieved it might mean that
+ // inventory is unusable at the moment so the category is
+ // stored with VERSION_UNKNOWN and DESCENDENT_COUNT_UNKNOWN,
+ // it may be updated later.
+ if (category)
+ {
+ // Inventory category version is used to find out if some changes
+ // to a category have been made.
+ version = category->getVersion();
+
+ LLInventoryModel::cat_array_t* cats;
+ LLInventoryModel::item_array_t* items;
+ gInventory.getDirectDescendentsOf(cat_id, cats, items);
+ if (!cats || !items)
+ {
+ llwarns << "Category '" << category->getName() << "' descendents corrupted, fetch failed." << llendl;
+ // NULL means the call failed -- cats/items map doesn't exist (note: this does NOT mean
+ // that the cat just doesn't have any items or subfolders).
+ // Unrecoverable, so just return "false" meaning that the category can't be observed.
+ can_be_added = false;
+
+ llassert(cats != NULL && items != NULL);
+ }
+ else
+ {
+ current_num_known_descendents = cats->count() + items->count();
+ }
+ }
+
+ if (can_be_added)
+ {
+ mCategoryMap.insert(category_map_value_t(cat_id, LLCategoryData(cb, version, current_num_known_descendents)));
+ }
+
+ return can_be_added;
+}
+
+void LLInventoryCategoriesObserver::removeCategory(const LLUUID& cat_id)
+{
+ mCategoryMap.erase(cat_id);
+}
diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h
index d6dded52d4..4a88a65bf8 100644
--- a/indra/newview/llinventoryobserver.h
+++ b/indra/newview/llinventoryobserver.h
@@ -42,10 +42,9 @@ class LLViewerInventoryCategory;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLInventoryObserver
//
-// This class is designed to be a simple abstract base class which can
-// relay messages when the inventory changes.
+// A simple abstract base class that can relay messages when the inventory
+// changes.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
class LLInventoryObserver
{
public:
@@ -54,17 +53,17 @@ public:
// chaged() to see if the observer is interested in the change.
enum
{
- NONE = 0,
- LABEL = 1, // name changed
- INTERNAL = 2, // internal change (e.g. asset uuid different)
- ADD = 4, // something added
- REMOVE = 8, // something deleted
- STRUCTURE = 16, // structural change (eg item or folder moved)
- CALLING_CARD = 32, // (eg online, grant status, cancel)
- GESTURE = 64,
- REBUILD = 128, // item UI changed (eg item type different)
- SORT = 256, // folder needs to be resorted.
- ALL = 0xffffffff
+ NONE = 0,
+ LABEL = 1, // Name changed
+ INTERNAL = 2, // Internal change (e.g. asset uuid different)
+ ADD = 4, // Something added
+ REMOVE = 8, // Something deleted
+ STRUCTURE = 16, // Structural change (e.g. item or folder moved)
+ CALLING_CARD = 32, // Calling card change (e.g. online, grant status, cancel)
+ GESTURE = 64,
+ REBUILD = 128, // Item UI changed (e.g. item type different)
+ SORT = 256, // Folder needs to be resorted.
+ ALL = 0xffffffff
};
LLInventoryObserver();
virtual ~LLInventoryObserver();
@@ -73,182 +72,243 @@ public:
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryCompletionObserver
+// Class LLInventoryFetchObserver
//
-// Class which can be used as a base class for doing something when
-// when all observed items are locally complete. This class implements
-// the changed() method of LLInventoryObserver and declares a new
-// method named done() which is called when all watched items have
-// complete information in the inventory model.
+// Abstract class to handle fetching items, folders, etc.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLInventoryCompletionObserver : public LLInventoryObserver
+class LLInventoryFetchObserver : public LLInventoryObserver
{
public:
- LLInventoryCompletionObserver() {}
- virtual void changed(U32 mask);
+ LLInventoryFetchObserver(const LLUUID& id = LLUUID::null); // single item
+ LLInventoryFetchObserver(const uuid_vec_t& ids); // multiple items
+ void setFetchID(const LLUUID& id);
+ void setFetchIDs(const uuid_vec_t& ids);
- void watchItem(const LLUUID& id);
+ BOOL isFinished() const;
+ virtual void startFetch() = 0;
+ virtual void changed(U32 mask) = 0;
+ virtual void done() {};
protected:
- virtual void done() = 0;
-
- typedef std::vector<LLUUID> item_ref_t;
- item_ref_t mComplete;
- item_ref_t mIncomplete;
+ uuid_vec_t mComplete;
+ uuid_vec_t mIncomplete;
+ uuid_vec_t mIDs;
};
-
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-// Class LLInventoryFetchObserver
+// Class LLInventoryFetchItemsObserver
//
-// This class is much like the LLInventoryCompletionObserver, except
-// that it handles all the the fetching necessary. Override the done()
-// method to do the thing you want.
+// Fetches inventory items, calls done() when all inventory has arrived.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-class LLInventoryFetchObserver : public LLInventoryObserver
+class LLInventoryFetchItemsObserver : public LLInventoryFetchObserver
{
public:
- LLInventoryFetchObserver(bool retry_if_missing = false): mRetryIfMissing(retry_if_missing) {}
- virtual void changed(U32 mask);
-
- typedef std::vector<LLUUID> item_ref_t;
-
- bool isEverythingComplete() const;
- void fetchItems(const item_ref_t& ids);
- virtual void done() {};
-
-protected:
- bool mRetryIfMissing;
- item_ref_t mComplete;
- item_ref_t mIncomplete;
+ LLInventoryFetchItemsObserver(const LLUUID& item_id = LLUUID::null);
+ LLInventoryFetchItemsObserver(const uuid_vec_t& item_ids);
+
+ /*virtual*/ void startFetch();
+ /*virtual*/ void changed(U32 mask);
+private:
+ LLTimer mFetchingPeriod;
+
+ /**
+ * Period of waiting a notification when requested items get added into inventory.
+ */
+ static const F32 FETCH_TIMER_EXPIRY;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLInventoryFetchDescendentsObserver
//
-// This class is much like the LLInventoryCompletionObserver, except
-// that it handles fetching based on category. Override the done()
-// method to do the thing you want.
+// Fetches children of a category/folder, calls done() when all
+// inventory has arrived.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-class LLInventoryFetchDescendentsObserver : public LLInventoryObserver
+class LLInventoryFetchDescendentsObserver : public LLInventoryFetchObserver
{
public:
- LLInventoryFetchDescendentsObserver() {}
- virtual void changed(U32 mask);
-
- typedef std::vector<LLUUID> folder_ref_t;
- void fetchDescendents(const folder_ref_t& ids);
- bool isEverythingComplete() const;
- virtual void done() = 0;
+ LLInventoryFetchDescendentsObserver(const LLUUID& cat_id = LLUUID::null);
+ LLInventoryFetchDescendentsObserver(const uuid_vec_t& cat_ids);
+ /*virtual*/ void startFetch();
+ /*virtual*/ void changed(U32 mask);
protected:
- bool isComplete(LLViewerInventoryCategory* cat);
- folder_ref_t mIncompleteFolders;
- folder_ref_t mCompleteFolders;
+ BOOL isCategoryComplete(const LLViewerInventoryCategory* cat) const;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLInventoryFetchComboObserver
//
-// This class does an appropriate combination of fetch descendents and
-// item fetches based on completion of categories and items. Much like
-// the fetch and fetch descendents, this will call done() when everything
-// has arrived.
+// Does an appropriate combination of fetch descendents and
+// item fetches based on completion of categories and items. This is optimized
+// to not fetch item_ids that are descendents of any of the folder_ids.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLInventoryFetchComboObserver : public LLInventoryObserver
{
public:
- LLInventoryFetchComboObserver() : mDone(false) {}
- virtual void changed(U32 mask);
-
- typedef std::vector<LLUUID> folder_ref_t;
- typedef std::vector<LLUUID> item_ref_t;
- void fetch(const folder_ref_t& folder_ids, const item_ref_t& item_ids);
+ LLInventoryFetchComboObserver(const uuid_vec_t& folder_ids,
+ const uuid_vec_t& item_ids);
+ ~LLInventoryFetchComboObserver();
+ /*virtual*/ void changed(U32 mask);
+ void startFetch();
virtual void done() = 0;
-
protected:
- bool mDone;
- folder_ref_t mCompleteFolders;
- folder_ref_t mIncompleteFolders;
- item_ref_t mCompleteItems;
- item_ref_t mIncompleteItems;
+ LLInventoryFetchItemsObserver *mFetchItems;
+ LLInventoryFetchDescendentsObserver *mFetchDescendents;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLInventoryExistenceObserver
//
-// This class is used as a base class for doing somethign when all the
-// observed item ids exist in the inventory somewhere. You can derive
-// a class from this class and implement the done() method to do
-// something useful.
+// Used as a base class for doing something when all the
+// observed item ids exist in the inventory somewhere.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
class LLInventoryExistenceObserver : public LLInventoryObserver
{
public:
LLInventoryExistenceObserver() {}
- virtual void changed(U32 mask);
+ /*virtual*/ void changed(U32 mask);
void watchItem(const LLUUID& id);
+protected:
+ virtual void done() = 0;
+ uuid_vec_t mExist;
+ uuid_vec_t mMIA;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryMovedObserver
+//
+// This class is used as a base class for doing something when all the
+// item for observed asset ids were added into the inventory.
+// Derive a class from this class and implement the done() method to do
+// something useful.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+class LLInventoryAddItemByAssetObserver : public LLInventoryObserver
+{
+public:
+ LLInventoryAddItemByAssetObserver() : mIsDirty(false) {}
+ virtual void changed(U32 mask);
+
+ void watchAsset(const LLUUID& asset_id);
+ bool isAssetWatched(const LLUUID& asset_id);
protected:
+ virtual void onAssetAdded(const LLUUID& asset_id) {}
virtual void done() = 0;
typedef std::vector<LLUUID> item_ref_t;
- item_ref_t mExist;
- item_ref_t mMIA;
+ item_ref_t mAddedItems;
+ item_ref_t mWatchedAssets;
+
+private:
+ bool mIsDirty;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLInventoryAddedObserver
//
-// This class is used as a base class for doing something when
-// a new item arrives in inventory.
-// It does not watch for a certain UUID, rather it acts when anything is added
-// Derive a class from this class and implement the done() method to do
-// something useful.
+// Base class for doing something when a new item arrives in inventory.
+// It does not watch for a certain UUID, rather it acts when anything is added
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
class LLInventoryAddedObserver : public LLInventoryObserver
{
public:
LLInventoryAddedObserver() : mAdded() {}
- virtual void changed(U32 mask);
+ /*virtual*/ void changed(U32 mask);
protected:
virtual void done() = 0;
- typedef std::vector<LLUUID> item_ref_t;
- item_ref_t mAdded;
+ uuid_vec_t mAdded;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLInventoryTransactionObserver
//
-// Class which can be used as a base class for doing something when an
-// inventory transaction completes.
-//
-// *NOTE: This class is not quite complete. Avoid using unless you fix up it's
-// functionality gaps.
+// Base class for doing something when an inventory transaction completes.
+// NOTE: This class is not quite complete. Avoid using unless you fix up its
+// functionality gaps.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
class LLInventoryTransactionObserver : public LLInventoryObserver
{
public:
LLInventoryTransactionObserver(const LLTransactionID& transaction_id);
- virtual void changed(U32 mask);
+ /*virtual*/ void changed(U32 mask);
protected:
- typedef std::vector<LLUUID> folder_ref_t;
- typedef std::vector<LLUUID> item_ref_t;
- virtual void done(const folder_ref_t& folders, const item_ref_t& items) = 0;
+ virtual void done(const uuid_vec_t& folders, const uuid_vec_t& items) = 0;
LLTransactionID mTransactionID;
};
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryCompletionObserver
+//
+// Base class for doing something when when all observed items are locally
+// complete. Implements the changed() method of LLInventoryObserver
+// and declares a new method named done() which is called when all watched items
+// have complete information in the inventory model.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLInventoryCompletionObserver : public LLInventoryObserver
+{
+public:
+ LLInventoryCompletionObserver() {}
+ /*virtual*/ void changed(U32 mask);
-#endif // LL_LLINVENTORYOBSERVERS_H
+ void watchItem(const LLUUID& id);
+protected:
+ virtual void done() = 0;
+
+ uuid_vec_t mComplete;
+ uuid_vec_t mIncomplete;
+};
+
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryCategoriesObserver
+//
+// This class is used for monitoring a list of inventory categories
+// and firing a callback when there are changes in any of them.
+// Categories are identified by their UUIDs.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLInventoryCategoriesObserver : public LLInventoryObserver
+{
+public:
+ typedef boost::function<void()> callback_t;
+
+ LLInventoryCategoriesObserver() {};
+ virtual void changed(U32 mask);
+
+ /**
+ * Add cat_id to the list of observed categories with a
+ * callback fired on category being changed.
+ *
+ * @return "true" if category was added, "false" if it could
+ * not be found.
+ */
+ bool addCategory(const LLUUID& cat_id, callback_t cb);
+ void removeCategory(const LLUUID& cat_id);
+
+protected:
+ struct LLCategoryData
+ {
+ LLCategoryData(callback_t cb, S32 version, S32 num_descendents)
+ : mCallback(cb)
+ , mVersion(version)
+ , mDescendentsCount(num_descendents)
+ {}
+
+ callback_t mCallback;
+ S32 mVersion;
+ S32 mDescendentsCount;
+ };
+
+ typedef std::map<LLUUID, LLCategoryData> category_map_t;
+ typedef category_map_t::value_type category_map_value_t;
+
+ category_map_t mCategoryMap;
+};
+
+#endif // LL_LLINVENTORYOBSERVERS_H
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index a6d63e58f5..72d35af3b7 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -38,14 +38,18 @@
#include "llagent.h"
#include "llagentwearables.h"
#include "llappearancemgr.h"
+#include "llavataractions.h"
#include "llfloaterinventory.h"
#include "llfloaterreg.h"
#include "llimfloater.h"
#include "llimview.h"
#include "llinventorybridge.h"
+#include "llinventoryfunctions.h"
+#include "llinventorymodelbackgroundfetch.h"
#include "llsidepanelinventory.h"
#include "llsidetray.h"
#include "llscrollcontainer.h"
+#include "llviewerattachmenu.h"
#include "llviewerfoldertype.h"
#include "llvoavatarself.h"
@@ -78,11 +82,12 @@ protected:
LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :
LLPanel(p),
mInventoryObserver(NULL),
- mFolders(NULL),
+ mFolderRoot(NULL),
mScroller(NULL),
mSortOrderSetting(p.sort_order_setting),
mInventory(p.inventory),
mAllowMultiSelect(p.allow_multi_select),
+ mShowItemLinkOverlays(p.show_item_link_overlays),
mViewsInitialized(false),
mStartFolderString(p.start_folder),
mBuildDefaultHierarchy(true),
@@ -97,6 +102,7 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :
mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&LLInventoryPanel::doCreate, this, _2));
mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&LLInventoryPanel::attachObject, this, _2));
mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&LLInventoryPanel::beginIMSession, this));
+ mCommitCallbackRegistrar.add("Inventory.Share", boost::bind(&LLAvatarActions::shareWithAvatars));
if (mStartFolderString != "")
{
@@ -104,7 +110,7 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :
}
}
-BOOL LLInventoryPanel::postBuild()
+void LLInventoryPanel::initFromParams(const LLInventoryPanel::Params& params)
{
LLMemType mt(LLMemType::MTYPE_INVENTORY_POST_BUILD);
@@ -118,16 +124,18 @@ BOOL LLInventoryPanel::postBuild()
0);
LLFolderView::Params p;
p.name = getName();
+ p.title = getLabel();
p.rect = folder_rect;
p.parent_panel = this;
p.tool_tip = p.name;
- mFolders = LLUICtrlFactory::create<LLFolderView>(p);
- mFolders->setAllowMultiSelect(mAllowMultiSelect);
+ p.use_label_suffix = params.use_label_suffix;
+ mFolderRoot = LLUICtrlFactory::create<LLFolderView>(p);
+ mFolderRoot->setAllowMultiSelect(mAllowMultiSelect);
}
mCommitCallbackRegistrar.popScope();
- mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar);
+ mFolderRoot->setCallbackRegistrar(&mCommitCallbackRegistrar);
// Scroller
{
@@ -141,8 +149,9 @@ BOOL LLInventoryPanel::postBuild()
p.tab_stop(true);
mScroller = LLUICtrlFactory::create<LLScrollContainer>(p);
addChild(mScroller);
- mScroller->addChild(mFolders);
- mFolders->setScrollContainer(mScroller);
+ mScroller->addChild(mFolderRoot);
+ mFolderRoot->setScrollContainer(mScroller);
+ mFolderRoot->addChild(mFolderRoot->mStatusTextBox);
}
// Set up the callbacks from the inventory we're viewing, and then build everything.
@@ -165,22 +174,22 @@ BOOL LLInventoryPanel::postBuild()
{
setSortOrder(gSavedSettings.getU32(DEFAULT_SORT_ORDER));
}
- mFolders->setSortOrder(getFilter()->getSortOrder());
-
- return TRUE;
+ mFolderRoot->setSortOrder(getFilter()->getSortOrder());
}
LLInventoryPanel::~LLInventoryPanel()
{
- if (mFolders)
+ if (mFolderRoot)
{
- U32 sort_order = mFolders->getSortOrder();
+ U32 sort_order = mFolderRoot->getSortOrder();
if (mSortOrderSetting != INHERIT_SORT_ORDER)
{
gSavedSettings.setU32(mSortOrderSetting, sort_order);
}
}
+ gIdleCallbacks.deleteFunction(onIdle, this);
+
// LLView destructor will take care of the sub-views.
mInventory->removeObserver(mInventoryObserver);
delete mInventoryObserver;
@@ -190,15 +199,15 @@ LLInventoryPanel::~LLInventoryPanel()
void LLInventoryPanel::draw()
{
// Select the desired item (in case it wasn't loaded when the selection was requested)
- mFolders->updateSelection();
+ mFolderRoot->updateSelection();
LLPanel::draw();
}
LLInventoryFilter* LLInventoryPanel::getFilter()
{
- if (mFolders)
+ if (mFolderRoot)
{
- return mFolders->getFilter();
+ return mFolderRoot->getFilter();
}
return NULL;
}
@@ -216,6 +225,11 @@ void LLInventoryPanel::setFilterPermMask(PermissionMask filter_perm_mask)
getFilter()->setFilterPermissions(filter_perm_mask);
}
+void LLInventoryPanel::setFilterWearableTypes(U64 types)
+{
+ getFilter()->setFilterWearableTypes(types);
+}
+
void LLInventoryPanel::setFilterSubString(const std::string& string)
{
getFilter()->setFilterSubString(string);
@@ -226,9 +240,9 @@ void LLInventoryPanel::setSortOrder(U32 order)
getFilter()->setSortOrder(order);
if (getFilter()->isModified())
{
- mFolders->setSortOrder(order);
+ mFolderRoot->setSortOrder(order);
// try to keep selection onscreen, even if it wasn't to start with
- mFolders->scrollToShowSelection();
+ mFolderRoot->scrollToShowSelection();
}
}
@@ -242,6 +256,11 @@ void LLInventoryPanel::setHoursAgo(U32 hours)
getFilter()->setHoursAgo(hours);
}
+void LLInventoryPanel::setIncludeLinks(BOOL include_links)
+{
+ getFilter()->setIncludeLinks(include_links);
+}
+
void LLInventoryPanel::setShowFolderState(LLInventoryFilter::EFolderShow show)
{
getFilter()->setShowFolderState(show);
@@ -273,8 +292,8 @@ 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);
+ LLFolderViewItem* view_item = mFolderRoot->getItemByID(item_id);
+ LLFolderViewFolder* view_folder = mFolderRoot->getFolderByID(item_id);
//////////////////////////////
// LABEL Operation
@@ -289,8 +308,9 @@ void LLInventoryPanel::modelChanged(U32 mask)
if(bridge)
{ // Clear the display name first, so it gets properly re-built during refresh()
bridge->clearDisplayName();
+
+ view_item->refresh();
}
- view_item->refresh();
}
}
@@ -348,7 +368,7 @@ void LLInventoryPanel::modelChanged(U32 mask)
// Add the UI element for this item.
buildNewViews(item_id);
// Select any newly created object that has the auto rename at top of folder root set.
- if(mFolders->getRoot()->needsAutoRename())
+ if(mFolderRoot->getRoot()->needsAutoRename())
{
setSelection(item_id, FALSE);
}
@@ -363,7 +383,7 @@ void LLInventoryPanel::modelChanged(U32 mask)
// model_item's parent will be NULL.
if (view_item->getRoot() != view_item->getParent())
{
- LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolders->getItemByID(model_item->getParentUUID());
+ LLFolderViewFolder* new_parent = (LLFolderViewFolder*)mFolderRoot->getItemByID(model_item->getParentUUID());
// Item has been moved.
if (view_item->getParentFolder() != new_parent)
{
@@ -371,7 +391,7 @@ void LLInventoryPanel::modelChanged(U32 mask)
{
// Item is to be moved and we found its new parent in the panel's directory, so move the item's UI.
view_item->getParentFolder()->extractItem(view_item);
- view_item->addToFolder(new_parent, mFolders);
+ view_item->addToFolder(new_parent, mFolderRoot);
}
else
{
@@ -439,14 +459,14 @@ void LLInventoryPanel::initializeViews()
if (gAgent.isFirstLogin())
{
// Auto open the user's library
- LLFolderViewFolder* lib_folder = mFolders->getFolderByID(gInventory.getLibraryRootFolderID());
+ LLFolderViewFolder* lib_folder = mFolderRoot->getFolderByID(gInventory.getLibraryRootFolderID());
if (lib_folder)
{
lib_folder->setOpen(TRUE);
}
// Auto close the user's my inventory folder
- LLFolderViewFolder* my_inv_folder = mFolders->getFolderByID(gInventory.getRootFolderID());
+ LLFolderViewFolder* my_inv_folder = mFolderRoot->getFolderByID(gInventory.getRootFolderID());
if (my_inv_folder)
{
my_inv_folder->setOpenArrangeRecursively(FALSE, LLFolderViewFolder::RECURSE_DOWN);
@@ -457,7 +477,7 @@ void LLInventoryPanel::initializeViews()
void LLInventoryPanel::rebuildViewsFor(const LLUUID& id)
{
// Destroy the old view for this ID so we can rebuild it.
- LLFolderViewItem* old_view = mFolders->getItemByID(id);
+ LLFolderViewItem* old_view = mFolderRoot->getItemByID(id);
if (old_view && id.notNull())
{
old_view->destroyView();
@@ -474,10 +494,10 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
if (objectp)
{
const LLUUID &parent_id = objectp->getParentUUID();
- LLFolderViewFolder* parent_folder = (LLFolderViewFolder*)mFolders->getItemByID(parent_id);
+ LLFolderViewFolder* parent_folder = (LLFolderViewFolder*)mFolderRoot->getItemByID(parent_id);
if (id == mStartFolderID)
{
- parent_folder = mFolders;
+ parent_folder = mFolderRoot;
}
else if ((mStartFolderID != LLUUID::null) && (!gInventory.isObjectDescendentOf(id, mStartFolderID)))
{
@@ -501,19 +521,23 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
objectp->getType(),
LLInventoryType::IT_CATEGORY,
this,
+ mFolderRoot,
objectp->getUUID());
-
if (new_listener)
{
LLFolderViewFolder::Params params;
params.name = new_listener->getDisplayName();
params.icon = new_listener->getIcon();
params.icon_open = new_listener->getOpenIcon();
- params.root = mFolders;
+ if (mShowItemLinkOverlays) // if false, then links show up just like normal items
+ {
+ params.icon_overlay = LLUI::getUIImage("Inv_Link");
+ }
+ params.root = mFolderRoot;
params.listener = new_listener;
params.tool_tip = params.name;
LLFolderViewFolder* folderp = LLUICtrlFactory::create<LLFolderViewFolder>(params);
- folderp->setItemSortOrder(mFolders->getSortOrder());
+ folderp->setItemSortOrder(mFolderRoot->getSortOrder());
itemp = folderp;
// Hide the root folder, so we can show the contents of a folder flat
@@ -522,6 +546,11 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
{
folderp->setHidden(TRUE);
}
+ const LLViewerInventoryCategory *cat = dynamic_cast<LLViewerInventoryCategory *>(objectp);
+ if (cat && getIsHiddenFolderType(cat->getPreferredType()))
+ {
+ folderp->setHidden(TRUE);
+ }
}
}
else
@@ -532,6 +561,7 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
item->getActualType(),
item->getInventoryType(),
this,
+ mFolderRoot,
item->getUUID(),
item->getFlags());
@@ -541,8 +571,12 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
params.name = new_listener->getDisplayName();
params.icon = new_listener->getIcon();
params.icon_open = new_listener->getOpenIcon();
+ if (mShowItemLinkOverlays) // if false, then links show up just like normal items
+ {
+ params.icon_overlay = LLUI::getUIImage("Inv_Link");
+ }
params.creation_date = new_listener->getCreationDate();
- params.root = mFolders;
+ params.root = mFolderRoot;
params.listener = new_listener;
params.rect = LLRect (0, 0, 0, 0);
params.tool_tip = params.name;
@@ -552,7 +586,13 @@ void LLInventoryPanel::buildNewViews(const LLUUID& id)
if (itemp)
{
- itemp->addToFolder(parent_folder, mFolders);
+ itemp->addToFolder(parent_folder, mFolderRoot);
+
+ // Don't add children of hidden folders unless this is the panel's root folder.
+ if (itemp->getHidden() && (id != mStartFolderID))
+ {
+ return;
+ }
}
}
@@ -595,19 +635,19 @@ void LLInventoryPanel::openStartFolderOrMyInventory()
{
if (mStartFolderString != "")
{
- mFolders->openFolder(mStartFolderString);
+ mFolderRoot->openFolder(mStartFolderString);
}
else
{
// Find My Inventory folder and open it up by name
- for (LLView *child = mFolders->getFirstChild(); child; child = mFolders->findNextSibling(child))
+ for (LLView *child = mFolderRoot->getFirstChild(); child; child = mFolderRoot->findNextSibling(child))
{
LLFolderViewFolder *fchild = dynamic_cast<LLFolderViewFolder*>(child);
if (fchild && fchild->getListener() &&
(fchild->getListener()->getUUID() == gInventory.getRootFolderID()))
{
const std::string& child_name = child->getName();
- mFolders->openFolder(child_name);
+ mFolderRoot->openFolder(child_name);
break;
}
}
@@ -616,7 +656,7 @@ void LLInventoryPanel::openStartFolderOrMyInventory()
void LLInventoryPanel::openSelected()
{
- LLFolderViewItem* folder_item = mFolders->getCurSelectedItem();
+ LLFolderViewItem* folder_item = mFolderRoot->getCurSelectedItem();
if(!folder_item) return;
LLInvFVBridge* bridge = (LLInvFVBridge*)folder_item->getListener();
if(!bridge) return;
@@ -629,7 +669,7 @@ BOOL LLInventoryPanel::handleHover(S32 x, S32 y, MASK mask)
if(handled)
{
ECursorType cursor = getWindow()->getCursor();
- if (LLInventoryModel::backgroundFetchActive() && cursor == UI_CURSOR_ARROW)
+ if (LLInventoryModelBackgroundFetch::instance().backgroundFetchActive() && cursor == UI_CURSOR_ARROW)
{
// replace arrow cursor with arrow and hourglass cursor
getWindow()->setCursor(UI_CURSOR_WORKING);
@@ -652,23 +692,39 @@ BOOL LLInventoryPanel::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
// If folder view is empty the (x, y) point won't be in its rect
// so the handler must be called explicitly.
- if (!mFolders->hasVisibleChildren())
+ // but only if was not handled before. See EXT-6746.
+ if (!handled && !mFolderRoot->hasVisibleChildren())
{
- handled = mFolders->handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
+ handled = mFolderRoot->handleDragAndDrop(x, y, mask, drop, cargo_type, cargo_data, accept, tooltip_msg);
}
if (handled)
{
- mFolders->setDragAndDropThisFrame();
+ mFolderRoot->setDragAndDropThisFrame();
}
return handled;
}
+// virtual
+void LLInventoryPanel::onMouseEnter(S32 x, S32 y, MASK mask)
+{
+ LLPanel::onMouseEnter(x, y, mask);
+ // don't auto-scroll a list when cursor is over Inventory. See EXT-3981.
+ mFolderRoot->setEnableScroll(false);
+}
+
+// virtual
+void LLInventoryPanel::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+ LLPanel::onMouseLeave(x, y, mask);
+ mFolderRoot->setEnableScroll(true);
+}
+
void LLInventoryPanel::onFocusLost()
{
// inventory no longer handles cut/copy/paste/delete
- if (LLEditMenuHandler::gEditMenuHandler == mFolders)
+ if (LLEditMenuHandler::gEditMenuHandler == mFolderRoot)
{
LLEditMenuHandler::gEditMenuHandler = NULL;
}
@@ -679,39 +735,39 @@ void LLInventoryPanel::onFocusLost()
void LLInventoryPanel::onFocusReceived()
{
// inventory now handles cut/copy/paste/delete
- LLEditMenuHandler::gEditMenuHandler = mFolders;
+ LLEditMenuHandler::gEditMenuHandler = mFolderRoot;
LLPanel::onFocusReceived();
}
void LLInventoryPanel::openAllFolders()
{
- mFolders->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN);
- mFolders->arrangeAll();
+ mFolderRoot->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN);
+ mFolderRoot->arrangeAll();
}
void LLInventoryPanel::setSelection(const LLUUID& obj_id, BOOL take_keyboard_focus)
{
// Don't select objects in COF (e.g. to prevent refocus when items are worn).
const LLInventoryObject *obj = gInventory.getObject(obj_id);
- if (obj && obj->getParentUUID() == LLAppearanceManager::instance().getCOF())
+ if (obj && obj->getParentUUID() == LLAppearanceMgr::instance().getCOF())
{
return;
}
- mFolders->setSelectionByID(obj_id, take_keyboard_focus);
+ mFolderRoot->setSelectionByID(obj_id, take_keyboard_focus);
}
void LLInventoryPanel::setSelectCallback(const LLFolderView::signal_t::slot_type& cb)
{
- if (mFolders)
+ if (mFolderRoot)
{
- mFolders->setSelectCallback(cb);
+ mFolderRoot->setSelectCallback(cb);
}
}
void LLInventoryPanel::clearSelection()
{
- mFolders->clearSelection();
+ mFolderRoot->clearSelection();
}
void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& items, BOOL user_action)
@@ -725,23 +781,21 @@ void LLInventoryPanel::onSelectionChange(const std::deque<LLFolderViewItem*>& it
fv->startRenamingSelectedItem();
}
}
- // Seraph - Put determineFolderType in here for ensemble typing?
}
void LLInventoryPanel::doToSelected(const LLSD& userdata)
{
- mFolders->doToSelected(&gInventory, userdata);
+ mFolderRoot->doToSelected(&gInventory, userdata);
}
void LLInventoryPanel::doCreate(const LLSD& userdata)
{
- menu_create_inventory_item(mFolders, LLFolderBridge::sSelf, userdata);
+ menu_create_inventory_item(mFolderRoot, LLFolderBridge::sSelf, userdata);
}
bool LLInventoryPanel::beginIMSession()
{
- std::set<LLUUID> selected_items;
- mFolders->getSelectionList(selected_items);
+ std::set<LLUUID> selected_items = mFolderRoot->getSelectionList();
std::string name;
static int session_num = 1;
@@ -754,7 +808,7 @@ bool LLInventoryPanel::beginIMSession()
{
LLUUID item = *iter;
- LLFolderViewItem* folder_item = mFolders->getItemByID(item);
+ LLFolderViewItem* folder_item = mFolderRoot->getItemByID(item);
if(folder_item)
{
@@ -796,7 +850,7 @@ bool LLInventoryPanel::beginIMSession()
}
else
{
- LLFolderViewItem* folder_item = mFolders->getItemByID(item);
+ LLFolderViewItem* folder_item = mFolderRoot->getItemByID(item);
if(!folder_item) return true;
LLInvFVBridge* listenerp = (LLInvFVBridge*)folder_item->getListener();
@@ -838,50 +892,19 @@ bool LLInventoryPanel::beginIMSession()
bool LLInventoryPanel::attachObject(const LLSD& userdata)
{
- std::set<LLUUID> selected_items;
- mFolders->getSelectionList(selected_items);
-
- std::string joint_name = userdata.asString();
- LLVOAvatar *avatarp = static_cast<LLVOAvatar*>(gAgent.getAvatarObject());
- LLViewerJointAttachment* attachmentp = NULL;
- for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin();
- iter != avatarp->mAttachmentPoints.end(); )
- {
- LLVOAvatar::attachment_map_t::iterator curiter = iter++;
- LLViewerJointAttachment* attachment = curiter->second;
- if (attachment->getName() == joint_name)
- {
- attachmentp = attachment;
- break;
- }
- }
- if (attachmentp == NULL)
- {
- return true;
- }
-
+ // Copy selected item UUIDs to a vector.
+ std::set<LLUUID> selected_items = mFolderRoot->getSelectionList();
+ uuid_vec_t items;
for (std::set<LLUUID>::const_iterator set_iter = selected_items.begin();
set_iter != selected_items.end();
++set_iter)
{
- const LLUUID &id = *set_iter;
- LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getItem(id);
- if(item && gInventory.isObjectDescendentOf(id, gInventory.getRootFolderID()))
- {
- rez_attachment(item, attachmentp);
- }
- else if(item && item->isComplete())
- {
- // must be in library. copy it to our inventory and put it on.
- LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(attachmentp);
- copy_inventory_item(gAgent.getID(),
- item->getPermissions().getOwner(),
- item->getUUID(),
- LLUUID::null,
- std::string(),
- cb);
- }
+ items.push_back(*set_iter);
}
+
+ // Attach selected items.
+ LLViewerAttachMenu::attachObjects(items, userdata.asString());
+
gFocusMgr.setKeyboardFocus(NULL);
return true;
@@ -897,7 +920,7 @@ BOOL LLInventoryPanel::getSinceLogoff()
void LLInventoryPanel::dumpSelectionInformation(void* user_data)
{
LLInventoryPanel* iv = (LLInventoryPanel*)user_data;
- iv->mFolders->dumpSelectionInformation();
+ iv->mFolderRoot->dumpSelectionInformation();
}
BOOL is_inventorysp_active()
@@ -954,3 +977,43 @@ LLInventoryPanel* LLInventoryPanel::getActiveInventoryPanel(BOOL auto_open)
return NULL;
}
+
+void LLInventoryPanel::addHideFolderType(LLFolderType::EType folder_type)
+{
+ if (!getIsHiddenFolderType(folder_type))
+ {
+ mHiddenFolderTypes.push_back(folder_type);
+ }
+}
+
+BOOL LLInventoryPanel::getIsHiddenFolderType(LLFolderType::EType folder_type) const
+{
+ return (std::find(mHiddenFolderTypes.begin(), mHiddenFolderTypes.end(), folder_type) != mHiddenFolderTypes.end());
+}
+
+
+/************************************************************************/
+/* Recent Inventory Panel related class */
+/************************************************************************/
+class LLInventoryRecentItemsPanel;
+static LLDefaultChildRegistry::Register<LLInventoryRecentItemsPanel> t_recent_inventory_panel("recent_inventory_panel");
+
+static const LLRecentInventoryBridgeBuilder RECENT_ITEMS_BUILDER;
+class LLInventoryRecentItemsPanel : public LLInventoryPanel
+{
+public:
+ struct Params : public LLInitParam::Block<Params, LLInventoryPanel::Params>
+ {};
+
+protected:
+ LLInventoryRecentItemsPanel (const Params&);
+ friend class LLUICtrlFactory;
+};
+
+LLInventoryRecentItemsPanel::LLInventoryRecentItemsPanel( const Params& params)
+: LLInventoryPanel(params)
+{
+ // replace bridge builder to have necessary View bridges.
+ mInvFVBridgeBuilder = &RECENT_ITEMS_BUILDER;
+}
+
diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h
index ccff795a51..84603e8b4f 100644
--- a/indra/newview/llinventorypanel.h
+++ b/indra/newview/llinventorypanel.h
@@ -61,11 +61,10 @@ class LLTabContainer;
class LLInventoryPanel : public LLPanel
{
+ //--------------------------------------------------------------------
+ // Data
+ //--------------------------------------------------------------------
public:
- static const std::string DEFAULT_SORT_ORDER;
- static const std::string RECENTITEMS_SORT_ORDER;
- static const std::string INHERIT_SORT_ORDER;
-
struct Filter : public LLInitParam::Block<Filter>
{
Optional<U32> sort_order;
@@ -85,29 +84,35 @@ public:
Optional<std::string> sort_order_setting;
Optional<LLInventoryModel*> inventory;
Optional<bool> allow_multi_select;
+ Optional<bool> show_item_link_overlays;
Optional<Filter> filter;
Optional<std::string> start_folder;
+ Optional<bool> use_label_suffix;
Params()
: sort_order_setting("sort_order_setting"),
inventory("", &gInventory),
allow_multi_select("allow_multi_select", true),
+ show_item_link_overlays("show_item_link_overlays", false),
filter("filter"),
- start_folder("start_folder")
+ start_folder("start_folder"),
+ use_label_suffix("use_label_suffix", true)
{}
};
+ //--------------------------------------------------------------------
+ // Initialization
+ //--------------------------------------------------------------------
protected:
LLInventoryPanel(const Params&);
+ void initFromParams(const Params&);
friend class LLUICtrlFactory;
-
public:
virtual ~LLInventoryPanel();
+public:
LLInventoryModel* getModel() { return mInventory; }
- BOOL postBuild();
-
// LLView methods
void draw();
BOOL handleHover(S32 x, S32 y, MASK mask);
@@ -116,6 +121,10 @@ public:
void* cargo_data,
EAcceptance* accept,
std::string& tooltip_msg);
+
+ void onMouseEnter(S32 x, S32 y, MASK mask);
+ void onMouseLeave(S32 x, S32 y, MASK mask);
+
// LLUICtrl methods
/*virtual*/ void onFocusLost();
/*virtual*/ void onFocusReceived();
@@ -127,23 +136,23 @@ public:
void clearSelection();
LLInventoryFilter* getFilter();
void setFilterTypes(U64 filter, LLInventoryFilter::EFilterType = LLInventoryFilter::FILTERTYPE_OBJECT);
- U32 getFilterObjectTypes() const { return mFolders->getFilterObjectTypes(); }
+ U32 getFilterObjectTypes() const { return mFolderRoot->getFilterObjectTypes(); }
void setFilterPermMask(PermissionMask filter_perm_mask);
- U32 getFilterPermMask() const { return mFolders->getFilterPermissions(); }
+ U32 getFilterPermMask() const { return mFolderRoot->getFilterPermissions(); }
+ void setFilterWearableTypes(U64 filter);
void setFilterSubString(const std::string& string);
- const std::string getFilterSubString() { return mFolders->getFilterSubString(); }
- void setSortOrder(U32 order);
- U32 getSortOrder() { return mFolders->getSortOrder(); }
+ const std::string getFilterSubString() { return mFolderRoot->getFilterSubString(); }
void setSinceLogoff(BOOL sl);
void setHoursAgo(U32 hours);
BOOL getSinceLogoff();
-
+ void setIncludeLinks(BOOL include_links);
+
void setShowFolderState(LLInventoryFilter::EFolderShow show);
LLInventoryFilter::EFolderShow getShowFolderState();
- void setAllowMultiSelect(BOOL allow) { mFolders->setAllowMultiSelect(allow); }
+ void setAllowMultiSelect(BOOL allow) { mFolderRoot->setAllowMultiSelect(allow); }
// This method is called when something has changed about the inventory.
void modelChanged(U32 mask);
- LLFolderView* getRootFolder() { return mFolders; }
+ LLFolderView* getRootFolder() { return mFolderRoot; }
LLScrollContainer* getScrollableContainer() { return mScroller; }
void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
@@ -158,7 +167,7 @@ public:
static void dumpSelectionInformation(void* user_data);
void openSelected();
- void unSelectAll() { mFolders->setSelection(NULL, FALSE, FALSE); }
+ void unSelectAll() { mFolderRoot->setSelection(NULL, FALSE, FALSE); }
static void onIdle(void* user_data);
@@ -172,9 +181,9 @@ protected:
LLInventoryModel* mInventory;
LLInventoryObserver* mInventoryObserver;
BOOL mAllowMultiSelect;
- std::string mSortOrderSetting;
+ BOOL mShowItemLinkOverlays; // Shows link graphic over inventory item icons
- LLFolderView* mFolders;
+ LLFolderView* mFolderRoot;
LLScrollContainer* mScroller;
/**
@@ -186,6 +195,30 @@ protected:
*/
const LLInventoryFVBridgeBuilder* mInvFVBridgeBuilder;
+
+ //--------------------------------------------------------------------
+ // Sorting
+ //--------------------------------------------------------------------
+public:
+ static const std::string DEFAULT_SORT_ORDER;
+ static const std::string RECENTITEMS_SORT_ORDER;
+ static const std::string INHERIT_SORT_ORDER;
+
+ void setSortOrder(U32 order);
+ U32 getSortOrder() const { return mFolderRoot->getSortOrder(); }
+private:
+ std::string mSortOrderSetting;
+
+ //--------------------------------------------------------------------
+ // Hidden folders
+ //--------------------------------------------------------------------
+public:
+ void addHideFolderType(LLFolderType::EType folder_type);
+protected:
+ BOOL getIsHiddenFolderType(LLFolderType::EType folder_type) const;
+private:
+ std::vector<LLFolderType::EType> mHiddenFolderTypes;
+
//--------------------------------------------------------------------
// Initialization routines for building up the UI ("views")
//--------------------------------------------------------------------
diff --git a/indra/newview/lljoystickbutton.cpp b/indra/newview/lljoystickbutton.cpp
index 2cc5c8335d..c2a1923dfe 100644
--- a/indra/newview/lljoystickbutton.cpp
+++ b/indra/newview/lljoystickbutton.cpp
@@ -42,6 +42,7 @@
// Project includes
#include "llui.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llviewertexture.h"
#include "llviewertexturelist.h"
#include "llviewerwindow.h"
@@ -52,7 +53,6 @@
static LLDefaultChildRegistry::Register<LLJoystickAgentSlide> r1("joystick_slide");
static LLDefaultChildRegistry::Register<LLJoystickAgentTurn> r2("joystick_turn");
static LLDefaultChildRegistry::Register<LLJoystickCameraRotate> r3("joystick_rotate");
-static LLDefaultChildRegistry::Register<LLJoystickCameraZoom> r4("joystick_zoom");
static LLDefaultChildRegistry::Register<LLJoystickCameraTrack> r5("joystick_track");
@@ -482,25 +482,25 @@ void LLJoystickCameraRotate::onHeldDown()
// left-right rotation
if (dx > mHorizSlopNear)
{
- gAgent.unlockView();
- gAgent.setOrbitLeftKey(getOrbitRate());
+ gAgentCamera.unlockView();
+ gAgentCamera.setOrbitLeftKey(getOrbitRate());
}
else if (dx < -mHorizSlopNear)
{
- gAgent.unlockView();
- gAgent.setOrbitRightKey(getOrbitRate());
+ gAgentCamera.unlockView();
+ gAgentCamera.setOrbitRightKey(getOrbitRate());
}
// over/under rotation
if (dy > mVertSlopNear)
{
- gAgent.unlockView();
- gAgent.setOrbitUpKey(getOrbitRate());
+ gAgentCamera.unlockView();
+ gAgentCamera.setOrbitUpKey(getOrbitRate());
}
else if (dy < -mVertSlopNear)
{
- gAgent.unlockView();
- gAgent.setOrbitDownKey(getOrbitRate());
+ gAgentCamera.unlockView();
+ gAgentCamera.setOrbitDownKey(getOrbitRate());
}
}
@@ -625,176 +625,24 @@ void LLJoystickCameraTrack::onHeldDown()
if (dx > mVertSlopNear)
{
- gAgent.unlockView();
- gAgent.setPanRightKey(getOrbitRate());
+ gAgentCamera.unlockView();
+ gAgentCamera.setPanRightKey(getOrbitRate());
}
else if (dx < -mVertSlopNear)
{
- gAgent.unlockView();
- gAgent.setPanLeftKey(getOrbitRate());
+ gAgentCamera.unlockView();
+ gAgentCamera.setPanLeftKey(getOrbitRate());
}
// over/under rotation
if (dy > mVertSlopNear)
{
- gAgent.unlockView();
- gAgent.setPanUpKey(getOrbitRate());
+ gAgentCamera.unlockView();
+ gAgentCamera.setPanUpKey(getOrbitRate());
}
else if (dy < -mVertSlopNear)
{
- gAgent.unlockView();
- gAgent.setPanDownKey(getOrbitRate());
- }
-}
-
-
-
-//-------------------------------------------------------------------------------
-// LLJoystickCameraZoom
-//-------------------------------------------------------------------------------
-
-LLJoystickCameraZoom::LLJoystickCameraZoom(const LLJoystickCameraZoom::Params& p)
-: LLJoystick(p),
- mInTop( FALSE ),
- mInBottom( FALSE ),
- mPlusInImage(p.plus_image),
- mMinusInImage(p.minus_image)
-{
-}
-
-BOOL LLJoystickCameraZoom::handleMouseDown(S32 x, S32 y, MASK mask)
-{
- BOOL handled = LLJoystick::handleMouseDown(x, y, mask);
-
- if( handled )
- {
- if (mFirstMouse.mY > getRect().getHeight() / 2)
- {
- mInitialQuadrant = JQ_UP;
- }
- else
- {
- mInitialQuadrant = JQ_DOWN;
- }
- }
- return handled;
-}
-
-
-void LLJoystickCameraZoom::onHeldDown()
-{
- updateSlop();
-
- const F32 FAST_RATE = 2.5f; // two and a half times the normal rate
-
- S32 dy = mLastMouse.mY - mFirstMouse.mY + mInitialOffset.mY;
-
- if (dy > mVertSlopFar)
- {
- // Zoom in fast
- gAgent.unlockView();
- gAgent.setOrbitInKey(FAST_RATE);
- }
- else if (dy > mVertSlopNear)
- {
- // Zoom in slow
- gAgent.unlockView();
- gAgent.setOrbitInKey(getOrbitRate());
- }
- else if (dy < -mVertSlopFar)
- {
- // Zoom out fast
- gAgent.unlockView();
- gAgent.setOrbitOutKey(FAST_RATE);
- }
- else if (dy < -mVertSlopNear)
- {
- // Zoom out slow
- gAgent.unlockView();
- gAgent.setOrbitOutKey(getOrbitRate());
- }
-}
-
-// Only used for drawing
-void LLJoystickCameraZoom::setToggleState( BOOL top, BOOL bottom )
-{
- mInTop = top;
- mInBottom = bottom;
-}
-
-void LLJoystickCameraZoom::draw()
-{
- if( mInTop )
- {
- mPlusInImage->draw(0,0);
- }
- else
- if( mInBottom )
- {
- mMinusInImage->draw(0,0);
- }
- else
- {
- getImageUnselected()->draw( 0, 0 );
- }
-}
-
-void LLJoystickCameraZoom::updateSlop()
-{
- mVertSlopNear = getRect().getHeight() / 4;
- mVertSlopFar = getRect().getHeight() / 2;
-
- mHorizSlopNear = getRect().getWidth() / 4;
- mHorizSlopFar = getRect().getWidth() / 2;
-
- // Compute initial mouse offset based on initial quadrant.
- // Place the mouse evenly between the near and far zones.
- switch (mInitialQuadrant)
- {
- case JQ_ORIGIN:
- mInitialOffset.set(0, 0);
- break;
-
- case JQ_UP:
- mInitialOffset.mX = 0;
- mInitialOffset.mY = (mVertSlopNear + mVertSlopFar) / 2;
- break;
-
- case JQ_DOWN:
- mInitialOffset.mX = 0;
- mInitialOffset.mY = - (mVertSlopNear + mVertSlopFar) / 2;
- break;
-
- case JQ_LEFT:
- mInitialOffset.mX = - (mHorizSlopNear + mHorizSlopFar) / 2;
- mInitialOffset.mY = 0;
- break;
-
- case JQ_RIGHT:
- mInitialOffset.mX = (mHorizSlopNear + mHorizSlopFar) / 2;
- mInitialOffset.mY = 0;
- break;
-
- default:
- llerrs << "LLJoystick::LLJoystick() - bad switch case" << llendl;
- break;
- }
-
- return;
-}
-
-
-F32 LLJoystickCameraZoom::getOrbitRate()
-{
- F32 time = getElapsedHeldDownTime();
- if( time < NUDGE_TIME )
- {
- F32 rate = ORBIT_NUDGE_RATE + time * (1 - ORBIT_NUDGE_RATE)/ NUDGE_TIME;
-// llinfos << "rate " << rate << " time " << time << llendl;
- return rate;
- }
- else
- {
- return 1;
+ gAgentCamera.unlockView();
+ gAgentCamera.setPanDownKey(getOrbitRate());
}
}
diff --git a/indra/newview/lljoystickbutton.h b/indra/newview/lljoystickbutton.h
index 2b071a8999..1dd30036ab 100644
--- a/indra/newview/lljoystickbutton.h
+++ b/indra/newview/lljoystickbutton.h
@@ -183,44 +183,4 @@ public:
virtual void onHeldDown();
};
-
-// Zoom the camera in and out
-class LLJoystickCameraZoom
-: public LLJoystick
-{
-public:
- struct Params
- : public LLInitParam::Block<Params, LLJoystick::Params>
- {
- Optional<LLUIImage*> plus_image;
- Optional<LLUIImage*> minus_image;
-
- Params()
- : plus_image ("plus_image", NULL),
- minus_image ("minus_image", NULL)
- {
- held_down_delay.seconds(0.0);
- }
- };
- LLJoystickCameraZoom(const Params&);
-
- virtual void setToggleState( BOOL top, BOOL bottom );
-
- virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
- virtual void onHeldDown();
- virtual void draw();
-
-protected:
- virtual void updateSlop();
- F32 getOrbitRate();
-
-protected:
- BOOL mInTop;
- BOOL mInBottom;
- LLUIImagePtr mPlusInImage;
- LLUIImagePtr mMinusInImage;
-};
-
-
-
#endif // LL_LLJOYSTICKBUTTON_H
diff --git a/indra/newview/lllandmarkactions.cpp b/indra/newview/lllandmarkactions.cpp
index f25d2ef574..539ca97a93 100644
--- a/indra/newview/lllandmarkactions.cpp
+++ b/indra/newview/lllandmarkactions.cpp
@@ -36,6 +36,7 @@
#include "roles_constants.h"
#include "llinventory.h"
+#include "llinventoryfunctions.h"
#include "lllandmark.h"
#include "llparcel.h"
#include "llregionhandle.h"
@@ -298,7 +299,7 @@ void LLLandmarkActions::getSLURLfromPosGlobal(const LLVector3d& global_pos, slur
bool gotSimName = LLWorldMap::getInstance()->simNameFromPosGlobal(global_pos, sim_name);
if (gotSimName)
{
- std::string slurl = LLSLURL::buildSLURLfromPosGlobal(sim_name, global_pos, escaped);
+ std::string slurl = LLSLURL(sim_name, global_pos).getSLURLString();
cb(slurl);
return;
@@ -350,7 +351,7 @@ void LLLandmarkActions::onRegionResponseSLURL(slurl_callback_t cb,
bool gotSimName = LLWorldMap::getInstance()->simNameFromPosGlobal(global_pos, sim_name);
if (gotSimName)
{
- slurl = LLSLURL::buildSLURLfromPosGlobal(sim_name, global_pos, escaped);
+ slurl = LLSLURL(sim_name, global_pos).getSLURLString();
}
else
{
diff --git a/indra/newview/lllistcontextmenu.cpp b/indra/newview/lllistcontextmenu.cpp
new file mode 100644
index 0000000000..50e969f6bc
--- /dev/null
+++ b/indra/newview/lllistcontextmenu.cpp
@@ -0,0 +1,125 @@
+/**
+ * @file lllistcontextmenu.cpp
+ * @brief Base class of misc lists' context menus
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+
+#include "llviewerprecompiledheaders.h"
+
+#include "lllistcontextmenu.h"
+
+// libs
+#include "llmenugl.h" // for LLContextMenu
+
+// newview
+#include "llviewermenu.h" // for LLViewerMenuHolderGL
+
+LLListContextMenu::LLListContextMenu()
+: mMenu(NULL)
+{
+}
+
+LLListContextMenu::~LLListContextMenu()
+{
+ // do not forget delete LLContextMenu* mMenu.
+ // It can have registered Enable callbacks which are called from the LLMenuHolderGL::draw()
+ // via selected item (menu_item_call) by calling LLMenuItemCallGL::buildDrawLabel.
+ // we can have a crash via using callbacks of deleted instance of ContextMenu. EXT-4725
+
+ // menu holder deletes its menus on viewer exit, so we have no way to determine if instance
+ // of mMenu has already been deleted except of using LLHandle. EXT-4762.
+ if (!mMenuHandle.isDead())
+ {
+ mMenu->die();
+ mMenu = NULL;
+ }
+}
+
+void LLListContextMenu::show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y)
+{
+ if (mMenu)
+ {
+ //preventing parent (menu holder) from deleting already "dead" context menus on exit
+ LLView* parent = mMenu->getParent();
+ if (parent)
+ {
+ parent->removeChild(mMenu);
+ }
+ delete mMenu;
+ mMenu = NULL;
+ mUUIDs.clear();
+ }
+
+ if ( uuids.empty() )
+ {
+ return;
+ }
+
+ mUUIDs.resize(uuids.size());
+ std::copy(uuids.begin(), uuids.end(), mUUIDs.begin());
+
+ mMenu = createMenu();
+ if (!mMenu)
+ {
+ llwarns << "Context menu creation failed" << llendl;
+ return;
+ }
+
+ mMenuHandle = mMenu->getHandle();
+ mMenu->show(x, y);
+ LLMenuGL::showPopup(spawning_view, mMenu, x, y);
+}
+
+void LLListContextMenu::hide()
+{
+ if(mMenu)
+ {
+ mMenu->hide();
+ }
+}
+
+// static
+void LLListContextMenu::handleMultiple(functor_t functor, const uuid_vec_t& ids)
+{
+ uuid_vec_t::const_iterator it;
+ for (it = ids.begin(); it != ids.end(); ++it)
+ {
+ functor(*it);
+ }
+}
+
+// static
+LLContextMenu* LLListContextMenu::createFromFile(const std::string& filename)
+{
+ return LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>(
+ filename, LLContextMenu::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance());
+}
+
+// EOF
diff --git a/indra/newview/lllistcontextmenu.h b/indra/newview/lllistcontextmenu.h
new file mode 100644
index 0000000000..09540a833f
--- /dev/null
+++ b/indra/newview/lllistcontextmenu.h
@@ -0,0 +1,84 @@
+/**
+ * @file lllistcontextmenu.h
+ * @brief Base class of misc lists' context menus
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLLISTCONTEXTMENU_H
+#define LL_LLLISTCONTEXTMENU_H
+
+#include "llhandle.h"
+#include "lluuid.h"
+#include "llview.h"
+
+class LLView;
+class LLContextMenu;
+
+/**
+ * Context menu for single or multiple list items.
+ *
+ * Derived classes must implement contextMenu().
+ *
+ * Typical usage:
+ * <code>
+ * my_context_menu->show(parent_view, selected_list_items_ids, x, y);
+ * </code>
+ */
+class LLListContextMenu
+{
+public:
+ LLListContextMenu();
+ virtual ~LLListContextMenu();
+
+ /**
+ * Show the menu at specified coordinates.
+ *
+ * @param spawning_view View to spawn at.
+ * @param uuids An array of list items ids.
+ * @param x Horizontal coordinate in the spawn_view's coordinate frame.
+ * @param y Vertical coordinate in the spawn_view's coordinate frame.
+ */
+ virtual void show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y);
+
+ virtual void hide();
+
+protected:
+ typedef boost::function<void (const LLUUID& id)> functor_t;
+
+ virtual LLContextMenu* createMenu() = 0;
+
+ static LLContextMenu* createFromFile(const std::string& filename);
+ static void handleMultiple(functor_t functor, const uuid_vec_t& ids);
+
+ uuid_vec_t mUUIDs;
+ LLContextMenu* mMenu;
+ LLHandle<LLView> mMenuHandle;
+};
+
+#endif // LL_LLLISTCONTEXTMENU_H
diff --git a/indra/newview/lllocaltextureobject.cpp b/indra/newview/lllocaltextureobject.cpp
index 69eb5fce2f..116d9bc446 100644
--- a/indra/newview/lllocaltextureobject.cpp
+++ b/indra/newview/lllocaltextureobject.cpp
@@ -70,6 +70,7 @@ LLLocalTextureObject::LLLocalTextureObject(const LLLocalTextureObject& lto) :
if (!original_layer)
{
llerrs << "could not clone Local Texture Object: unable to extract texlayer!" << llendl;
+ continue;
}
LLTexLayer* new_layer = new LLTexLayer(*original_layer);
diff --git a/indra/newview/lllocationhistory.cpp b/indra/newview/lllocationhistory.cpp
index df93930d33..7906d9b20f 100644
--- a/indra/newview/lllocationhistory.cpp
+++ b/indra/newview/lllocationhistory.cpp
@@ -63,6 +63,7 @@ void LLLocationHistory::addItem(const LLLocationHistoryItem& item) {
mItems.erase(mItems.begin(), mItems.end()-max_items);
}
llassert((S32)mItems.size() <= max_items);
+ mChangedSignal(ADD);
}
/*
@@ -87,9 +88,10 @@ bool LLLocationHistory::touchItem(const LLLocationHistoryItem& item) {
void LLLocationHistory::removeItems()
{
mItems.clear();
+ mChangedSignal(CLEAR);
}
-bool LLLocationHistory::getMatchingItems(std::string substring, location_list_t& result) const
+bool LLLocationHistory::getMatchingItems(const std::string& substring, location_list_t& result) const
{
// *TODO: an STL algorithm would look nicer
result.clear();
@@ -160,7 +162,7 @@ void LLLocationHistory::load()
return;
}
- removeItems();
+ mItems.clear();// need to use a direct call of clear() method to avoid signal invocation
// add each line in the file to the list
std::string line;
@@ -179,5 +181,5 @@ void LLLocationHistory::load()
file.close();
- mLoadedSignal();
+ mChangedSignal(LOAD);
}
diff --git a/indra/newview/lllocationhistory.h b/indra/newview/lllocationhistory.h
index 5f9976f87a..fb71fbaa0f 100644
--- a/indra/newview/lllocationhistory.h
+++ b/indra/newview/lllocationhistory.h
@@ -41,11 +41,13 @@
#include <boost/function.hpp>
class LLSD;
-
+/**
+ * This enum is responsible for identifying of history item.
+ */
enum ELocationType {
- TYPED_REGION_SURL//region name or surl
- ,LANDMARK // name of landmark
- ,TELEPORT_HISTORY
+ TYPED_REGION_SLURL//item added after the user had typed a region name or slurl
+ ,LANDMARK // item has been loaded from landmark folder
+ ,TELEPORT_HISTORY // item from session teleport history
};
class LLLocationHistoryItem {
@@ -109,9 +111,16 @@ class LLLocationHistory: public LLSingleton<LLLocationHistory>
LOG_CLASS(LLLocationHistory);
public:
+ enum EChangeType
+ {
+ ADD
+ ,CLEAR
+ ,LOAD
+ };
+
typedef std::vector<LLLocationHistoryItem> location_list_t;
- typedef boost::function<void()> loaded_callback_t;
- typedef boost::signals2::signal<void()> loaded_signal_t;
+ typedef boost::function<void(EChangeType event)> history_changed_callback_t;
+ typedef boost::signals2::signal<void(EChangeType event)> history_changed_signal_t;
LLLocationHistory();
@@ -120,8 +129,8 @@ public:
void removeItems();
size_t getItemCount() const { return mItems.size(); }
const location_list_t& getItems() const { return mItems; }
- bool getMatchingItems(std::string substring, location_list_t& result) const;
- boost::signals2::connection setLoadedCallback(loaded_callback_t cb) { return mLoadedSignal.connect(cb); }
+ bool getMatchingItems(const std::string& substring, location_list_t& result) const;
+ boost::signals2::connection setChangedCallback(history_changed_callback_t cb) { return mChangedSignal.connect(cb); }
void save() const;
void load();
@@ -131,7 +140,7 @@ private:
location_list_t mItems;
std::string mFilename; /// File to store the history to.
- loaded_signal_t mLoadedSignal;
+ history_changed_signal_t mChangedSignal;
};
#endif
diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp
index 1b7ad6ab7e..53a11eff04 100644
--- a/indra/newview/lllocationinputctrl.cpp
+++ b/indra/newview/lllocationinputctrl.cpp
@@ -38,6 +38,7 @@
// common includes
#include "llbutton.h"
#include "llfocusmgr.h"
+#include "llhelp.h"
#include "llmenugl.h"
#include "llparcel.h"
#include "llstring.h"
@@ -52,7 +53,6 @@
#include "llinventoryobserver.h"
#include "lllandmarkactions.h"
#include "lllandmarklist.h"
-#include "lllocationhistory.h"
#include "llteleporthistory.h"
#include "llsidetray.h"
#include "llslurl.h"
@@ -109,7 +109,7 @@ public:
private:
/*virtual*/ void done()
{
- std::vector<LLUUID>::const_iterator it = mAdded.begin(), end = mAdded.end();
+ uuid_vec_t::const_iterator it = mAdded.begin(), end = mAdded.end();
for(; it != end; ++it)
{
LLInventoryItem* item = gInventory.getItem(*it);
@@ -176,7 +176,10 @@ private:
static LLDefaultChildRegistry::Register<LLLocationInputCtrl> r("location_input");
LLLocationInputCtrl::Params::Params()
-: add_landmark_image_enabled("add_landmark_image_enabled"),
+: icon_maturity_general("icon_maturity_general"),
+ icon_maturity_adult("icon_maturity_adult"),
+ icon_maturity_moderate("icon_maturity_moderate"),
+ add_landmark_image_enabled("add_landmark_image_enabled"),
add_landmark_image_disabled("add_landmark_image_disabled"),
add_landmark_image_hover("add_landmark_image_hover"),
add_landmark_image_selected("add_landmark_image_selected"),
@@ -185,13 +188,15 @@ LLLocationInputCtrl::Params::Params()
add_landmark_button("add_landmark_button"),
for_sale_button("for_sale_button"),
info_button("info_button"),
+ maturity_button("maturity_button"),
voice_icon("voice_icon"),
fly_icon("fly_icon"),
push_icon("push_icon"),
build_icon("build_icon"),
scripts_icon("scripts_icon"),
damage_icon("damage_icon"),
- damage_text("damage_text")
+ damage_text("damage_text"),
+ maturity_help_topic("maturity_help_topic")
{
}
@@ -204,7 +209,11 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
mForSaleBtn(NULL),
mInfoBtn(NULL),
mLandmarkImageOn(NULL),
- mLandmarkImageOff(NULL)
+ mLandmarkImageOff(NULL),
+ mIconMaturityGeneral(NULL),
+ mIconMaturityAdult(NULL),
+ mIconMaturityModerate(NULL),
+ mMaturityHelpTopic(p.maturity_help_topic)
{
// Lets replace default LLLineEditor with LLLocationLineEditor
// to make needed escaping while copying and cutting url
@@ -223,7 +232,6 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
params.default_text(LLStringUtil::null);
params.max_length_bytes(p.max_chars);
params.keystroke_callback(boost::bind(&LLComboBox::onTextEntry, this, _1));
- params.handle_edit_keys_directly(true);
params.commit_on_focus_lost(false);
params.follows.flags(FOLLOWS_ALL);
mTextEntry = LLUICtrlFactory::create<LLURLLineEditor>(params);
@@ -264,7 +272,25 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
mAddLandmarkBtn = LLUICtrlFactory::create<LLButton>(al_params);
enableAddLandmarkButton(true);
addChild(mAddLandmarkBtn);
-
+
+ if (p.icon_maturity_general())
+ {
+ mIconMaturityGeneral = p.icon_maturity_general;
+ }
+ if (p.icon_maturity_adult())
+ {
+ mIconMaturityAdult = p.icon_maturity_adult;
+ }
+ if(p.icon_maturity_moderate())
+ {
+ mIconMaturityModerate = p.icon_maturity_moderate;
+ }
+
+ LLButton::Params maturity_button = p.maturity_button;
+ mMaturityButton = LLUICtrlFactory::create<LLButton>(maturity_button);
+ addChild(mMaturityButton);
+ mMaturityButton->setClickedCallback(boost::bind(&LLLocationInputCtrl::onMaturityButtonClicked, this));
+
LLButton::Params for_sale_button = p.for_sale_button;
for_sale_button.tool_tip = LLTrans::getString("LocationCtrlForSaleTooltip");
for_sale_button.click_callback.function(
@@ -340,14 +366,29 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
getTextEntry()->setRightMouseUpCallback(boost::bind(&LLLocationInputCtrl::onTextEditorRightClicked,this,_2,_3,_4));
updateWidgetlayout();
+ // Connecting signal for updating location on "Show Coordinates" setting change.
+ LLControlVariable* coordinates_control = gSavedSettings.getControl("NavBarShowCoordinates").get();
+ if (coordinates_control)
+ {
+ mCoordinatesControlConnection = coordinates_control->getSignal()->connect(boost::bind(&LLLocationInputCtrl::refreshLocation, this));
+ }
+
+ // Connecting signal for updating parcel icons on "Show Parcel Properties" setting change.
+ LLControlVariable* parcel_properties_control = gSavedSettings.getControl("NavBarShowParcelProperties").get();
+ if (parcel_properties_control)
+ {
+ mParcelPropertiesControlConnection = parcel_properties_control->getSignal()->connect(boost::bind(&LLLocationInputCtrl::refreshParcelIcons, this));
+ }
+
// - Make the "Add landmark" button updated when either current parcel gets changed
// or a landmark gets created or removed from the inventory.
// - Update the location string on parcel change.
mParcelMgrConnection = LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(
boost::bind(&LLLocationInputCtrl::onAgentParcelChange, this));
-
- mLocationHistoryConnection = LLLocationHistory::getInstance()->setLoadedCallback(
- boost::bind(&LLLocationInputCtrl::onLocationHistoryLoaded, this));
+ // LLLocationHistory instance is being created before the location input control, so we have to update initial state of button manually.
+ mButton->setEnabled(LLLocationHistory::instance().getItemCount() > 0);
+ mLocationHistoryConnection = LLLocationHistory::getInstance()->setChangedCallback(
+ boost::bind(&LLLocationInputCtrl::onLocationHistoryChanged, this,_1));
mRemoveLandmarkObserver = new LLRemoveLandmarkObserver(this);
mAddLandmarkObserver = new LLAddLandmarkObserver(this);
@@ -359,8 +400,8 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
mAddLandmarkTooltip = LLTrans::getString("LocationCtrlAddLandmarkTooltip");
mEditLandmarkTooltip = LLTrans::getString("LocationCtrlEditLandmarkTooltip");
- getChild<LLView>("Location History")->setToolTip(LLTrans::getString("LocationCtrlComboBtnTooltip"));
- getChild<LLView>("Place Information")->setToolTip(LLTrans::getString("LocationCtrlInfoBtnTooltip"));
+ mButton->setToolTip(LLTrans::getString("LocationCtrlComboBtnTooltip"));
+ mInfoBtn->setToolTip(LLTrans::getString("LocationCtrlInfoBtnTooltip"));
}
LLLocationInputCtrl::~LLLocationInputCtrl()
@@ -373,6 +414,8 @@ LLLocationInputCtrl::~LLLocationInputCtrl()
LLViewerParcelMgr::getInstance()->removeObserver(mParcelChangeObserver);
delete mParcelChangeObserver;
+ mCoordinatesControlConnection.disconnect();
+ mParcelPropertiesControlConnection.disconnect();
mParcelMgrConnection.disconnect();
mLocationHistoryConnection.disconnect();
}
@@ -439,6 +482,7 @@ BOOL LLLocationInputCtrl::handleKeyHere(KEY key, MASK mask)
void LLLocationInputCtrl::onTextEntry(LLLineEditor* line_editor)
{
KEY key = gKeyboard->currentKey();
+ MASK mask = gKeyboard->currentMask(TRUE);
if (line_editor->getText().empty())
{
@@ -446,7 +490,7 @@ void LLLocationInputCtrl::onTextEntry(LLLineEditor* line_editor)
hideList();
}
// Typing? (moving cursor should not affect showing the list)
- else if (key != KEY_LEFT && key != KEY_RIGHT && key != KEY_HOME && key != KEY_END)
+ else if (mask != MASK_CONTROL && key != KEY_LEFT && key != KEY_RIGHT && key != KEY_HOME && key != KEY_END)
{
prearrangeList(line_editor->getText());
if (mList->getItemCount() != 0)
@@ -471,7 +515,10 @@ void LLLocationInputCtrl::onTextEntry(LLLineEditor* line_editor)
*/
void LLLocationInputCtrl::setText(const LLStringExplicit& text)
{
- mTextEntry->setText(text);
+ if (mTextEntry)
+ {
+ mTextEntry->setText(text);
+ }
mHasAutocompletedText = FALSE;
}
@@ -480,7 +527,9 @@ void LLLocationInputCtrl::setFocus(BOOL b)
LLComboBox::setFocus(b);
if (mTextEntry && b && !mList->getVisible())
+ {
mTextEntry->setFocus(TRUE);
+ }
}
void LLLocationInputCtrl::handleLoginComplete()
@@ -522,6 +571,25 @@ void LLLocationInputCtrl::draw()
LLComboBox::draw();
}
+void LLLocationInputCtrl::reshape(S32 width, S32 height, BOOL called_from_parent)
+{
+ LLComboBox::reshape(width, height, called_from_parent);
+
+ // Setting cursor to 0 to show the left edge of the text. See EXT-4967.
+ mTextEntry->setCursor(0);
+ if (mTextEntry->hasSelection())
+ {
+ // Deselecting because selection position is changed together with
+ // cursor position change.
+ mTextEntry->deselect();
+ }
+
+ if (isHumanReadableLocationVisible)
+ {
+ refreshMaturityButton();
+ }
+}
+
void LLLocationInputCtrl::onInfoButtonClicked()
{
LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "agent"));
@@ -555,15 +623,24 @@ void LLLocationInputCtrl::onAgentParcelChange()
refresh();
}
+void LLLocationInputCtrl::onMaturityButtonClicked()
+{
+ LLUI::sHelpImpl->showTopic(mMaturityHelpTopic);
+}
+
void LLLocationInputCtrl::onLandmarkLoaded(LLLandmark* lm)
{
(void) lm;
updateAddLandmarkButton();
}
-void LLLocationInputCtrl::onLocationHistoryLoaded()
+void LLLocationInputCtrl::onLocationHistoryChanged(LLLocationHistory::EChangeType event)
{
- rebuildLocationHistory();
+ if(event == LLLocationHistory::LOAD)
+ {
+ rebuildLocationHistory();
+ }
+ mButton->setEnabled(LLLocationHistory::instance().getItemCount() > 0);
}
void LLLocationInputCtrl::onLocationPrearrange(const LLSD& data)
@@ -607,8 +684,7 @@ void LLLocationInputCtrl::onLocationPrearrange(const LLSD& data)
value["global_pos"] = result->mGlobalPos.getValue();
std::string region_name = result->mTitle.substr(0, result->mTitle.find(','));
//TODO*: add Surl to teleportitem or parse region name from title
- value["tooltip"] = LLSLURL::buildSLURLfromPosGlobal(region_name,
- result->mGlobalPos, false);
+ value["tooltip"] = LLSLURL(region_name, result->mGlobalPos).getSLURLString();
add(result->getTitle(), value);
}
result = std::find_if(result + 1, th_items.end(), boost::bind(
@@ -651,8 +727,8 @@ void LLLocationInputCtrl::refreshLocation()
{
// Is one of our children focused?
if (LLUICtrl::hasFocus() || mButton->hasFocus() || mList->hasFocus() ||
- (mTextEntry && mTextEntry->hasFocus()) || (mAddLandmarkBtn->hasFocus()))
-
+ (mTextEntry && mTextEntry->hasFocus()) ||
+ (mAddLandmarkBtn->hasFocus()))
{
llwarns << "Location input should not be refreshed when having focus" << llendl;
return;
@@ -672,6 +748,9 @@ void LLLocationInputCtrl::refreshLocation()
// store human-readable location to compare it in changeLocationPresentation()
mHumanReadableLocation = location_name;
setText(location_name);
+ isHumanReadableLocationVisible = true;
+
+ refreshMaturityButton();
}
// returns new right edge
@@ -692,17 +771,20 @@ void LLLocationInputCtrl::refreshParcelIcons()
{
// Our "cursor" moving right to left
S32 x = mAddLandmarkBtn->getRect().mLeft;
-
- static LLUICachedControl<bool> show_properties("NavBarShowParcelProperties", false);
- if (show_properties)
- {
- LLViewerParcelMgr* vpm = LLViewerParcelMgr::getInstance();
- LLViewerRegion* agent_region = gAgent.getRegion();
- LLParcel* agent_parcel = vpm->getAgentParcel();
- if (!agent_region || !agent_parcel)
- return;
+ LLViewerParcelMgr* vpm = LLViewerParcelMgr::getInstance();
+ LLViewerRegion* agent_region = gAgent.getRegion();
+ LLParcel* agent_parcel = vpm->getAgentParcel();
+ if (!agent_region || !agent_parcel)
+ return;
+
+ mForSaleBtn->setVisible(vpm->canAgentBuyParcel(agent_parcel, false));
+
+ x = layout_widget(mForSaleBtn, x);
+
+ if (gSavedSettings.getBOOL("NavBarShowParcelProperties"))
+ {
LLParcel* current_parcel;
LLViewerRegion* selection_region = vpm->getSelectionRegion();
LLParcel* selected_parcel = vpm->getParcelSelection()->getParcel();
@@ -722,7 +804,6 @@ void LLLocationInputCtrl::refreshParcelIcons()
current_parcel = agent_parcel;
}
- bool allow_buy = vpm->canAgentBuyParcel(current_parcel, false);
bool allow_voice = vpm->allowAgentVoice(agent_region, current_parcel);
bool allow_fly = vpm->allowAgentFly(agent_region, current_parcel);
bool allow_push = vpm->allowAgentPush(agent_region, current_parcel);
@@ -731,7 +812,6 @@ void LLLocationInputCtrl::refreshParcelIcons()
bool allow_damage = vpm->allowAgentDamage(agent_region, current_parcel);
// Most icons are "block this ability"
- mForSaleBtn->setVisible(allow_buy);
mParcelIcon[VOICE_ICON]->setVisible( !allow_voice );
mParcelIcon[FLY_ICON]->setVisible( !allow_fly );
mParcelIcon[PUSH_ICON]->setVisible( !allow_push );
@@ -739,11 +819,10 @@ void LLLocationInputCtrl::refreshParcelIcons()
mParcelIcon[SCRIPTS_ICON]->setVisible( !allow_scripts );
mParcelIcon[DAMAGE_ICON]->setVisible( allow_damage );
mDamageText->setVisible(allow_damage);
-
- x = layout_widget(mForSaleBtn, x);
+
// Padding goes to left of both landmark star and for sale btn
x -= mAddLandmarkHPad;
-
+
// Slide the parcel icons rect from right to left, adjusting rectangles
for (S32 i = 0; i < ICON_COUNT; ++i)
{
@@ -755,18 +834,20 @@ void LLLocationInputCtrl::refreshParcelIcons()
}
else
{
- mForSaleBtn->setVisible(false);
for (S32 i = 0; i < ICON_COUNT; ++i)
{
mParcelIcon[i]->setVisible(false);
}
mDamageText->setVisible(false);
}
-
- S32 left_pad, right_pad;
- mTextEntry->getTextPadding(&left_pad, &right_pad);
- right_pad = mTextEntry->getRect().mRight - x;
- mTextEntry->setTextPadding(left_pad, right_pad);
+
+ if (mTextEntry)
+ {
+ S32 left_pad, right_pad;
+ mTextEntry->getTextPadding(&left_pad, &right_pad);
+ right_pad = mTextEntry->getRect().mRight - x;
+ mTextEntry->setTextPadding(left_pad, right_pad);
+ }
}
void LLLocationInputCtrl::refreshHealth()
@@ -785,7 +866,73 @@ void LLLocationInputCtrl::refreshHealth()
}
}
-void LLLocationInputCtrl::rebuildLocationHistory(std::string filter)
+void LLLocationInputCtrl::refreshMaturityButton()
+{
+ // Updating maturity rating icon.
+ LLViewerRegion* region = gAgent.getRegion();
+ if (!region)
+ return;
+
+ bool button_visible = true;
+ LLPointer<LLUIImage> rating_image = NULL;
+ std::string rating_tooltip;
+
+ U8 sim_access = region->getSimAccess();
+ switch(sim_access)
+ {
+ case SIM_ACCESS_PG:
+ rating_image = mIconMaturityGeneral;
+ rating_tooltip = LLTrans::getString("LocationCtrlGeneralIconTooltip");
+ break;
+
+ case SIM_ACCESS_ADULT:
+ rating_image = mIconMaturityAdult;
+ rating_tooltip = LLTrans::getString("LocationCtrlAdultIconTooltip");
+ break;
+
+ case SIM_ACCESS_MATURE:
+ rating_image = mIconMaturityModerate;
+ rating_tooltip = LLTrans::getString("LocationCtrlModerateIconTooltip");
+ break;
+
+ default:
+ button_visible = false;
+ break;
+ }
+
+ mMaturityButton->setVisible(button_visible);
+ mMaturityButton->setToolTip(rating_tooltip);
+ if(rating_image)
+ {
+ mMaturityButton->setImageUnselected(rating_image);
+ mMaturityButton->setImagePressed(rating_image);
+ }
+ if (mMaturityButton->getVisible())
+ {
+ positionMaturityButton();
+ }
+}
+
+void LLLocationInputCtrl::positionMaturityButton()
+{
+ const LLFontGL* font = mTextEntry->getFont();
+ if (!font)
+ return;
+
+ S32 left_pad, right_pad;
+ mTextEntry->getTextPadding(&left_pad, &right_pad);
+
+ // Calculate the right edge of rendered text + a whitespace.
+ left_pad = left_pad + font->getWidth(mTextEntry->getText()) + font->getWidth(" ");
+
+ LLRect rect = mMaturityButton->getRect();
+ mMaturityButton->setRect(rect.setOriginAndSize(left_pad, rect.mBottom, rect.getWidth(), rect.getHeight()));
+
+ // Hide icon if it text area is not width enough to display it, show otherwise.
+ mMaturityButton->setVisible(rect.mRight < mTextEntry->getRect().getWidth() - right_pad);
+}
+
+void LLLocationInputCtrl::rebuildLocationHistory(const std::string& filter)
{
LLLocationHistory::location_list_t filtered_items;
const LLLocationHistory::location_list_t* itemsp = NULL;
@@ -807,7 +954,7 @@ void LLLocationInputCtrl::rebuildLocationHistory(std::string filter)
LLSD value;
value["tooltip"] = it->getToolTip();
//location history can contain only typed locations
- value["item_type"] = TYPED_REGION_SURL;
+ value["item_type"] = TYPED_REGION_SLURL;
value["global_pos"] = it->mGlobalPos.getValue();
add(it->getLocation(), value);
}
@@ -885,16 +1032,25 @@ void LLLocationInputCtrl::updateWidgetlayout()
void LLLocationInputCtrl::changeLocationPresentation()
{
- //change location presentation only if user does not select/past anything and
- //human-readable region name is being displayed
+ if (!mTextEntry)
+ return;
+
+ //change location presentation only if user does not select/paste anything and
+ //human-readable region name is being displayed
std::string text = mTextEntry->getText();
LLStringUtil::trim(text);
- if(mTextEntry && !mTextEntry->hasSelection() && text == mHumanReadableLocation )
+ if(!mTextEntry->hasSelection() && text == mHumanReadableLocation)
{
//needs unescaped one
- mTextEntry->setText(LLAgentUI::buildSLURL(false));
+ LLSLURL slurl;
+ LLAgentUI::buildSLURL(slurl, false);
+ mTextEntry->setText(slurl.getSLURLString());
mTextEntry->selectAll();
- }
+
+ mMaturityButton->setVisible(FALSE);
+
+ isHumanReadableLocationVisible = false;
+ }
}
void LLLocationInputCtrl::onLocationContextMenuItemClicked(const LLSD& userdata)
@@ -909,7 +1065,6 @@ void LLLocationInputCtrl::onLocationContextMenuItemClicked(const LLSD& userdata)
{
gSavedSettings.setBOOL("NavBarShowParcelProperties",
!gSavedSettings.getBOOL("NavBarShowParcelProperties"));
- refreshParcelIcons();
}
else if (item == "landmark")
{
diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h
index a830b33f6f..fc7adf60b0 100644
--- a/indra/newview/lllocationinputctrl.h
+++ b/indra/newview/lllocationinputctrl.h
@@ -36,6 +36,7 @@
#include "llcombobox.h"
#include "lliconctrl.h" // Params
#include "lltextbox.h" // Params
+#include "lllocationhistory.h"
class LLLandmark;
@@ -63,13 +64,18 @@ public:
struct Params
: public LLInitParam::Block<Params, LLComboBox::Params>
{
- Optional<LLUIImage*> add_landmark_image_enabled,
+ Optional<LLUIImage*> icon_maturity_general,
+ icon_maturity_adult,
+ icon_maturity_moderate,
+ add_landmark_image_enabled,
add_landmark_image_disabled,
add_landmark_image_hover,
add_landmark_image_selected;
+ Optional<std::string> maturity_help_topic;
Optional<S32> icon_hpad,
add_landmark_hpad;
- Optional<LLButton::Params> add_landmark_button,
+ Optional<LLButton::Params> maturity_button,
+ add_landmark_button,
for_sale_button,
info_button;
Optional<LLIconCtrl::Params> voice_icon,
@@ -89,6 +95,7 @@ public:
/*virtual*/ void onFocusReceived();
/*virtual*/ void onFocusLost();
/*virtual*/ void draw();
+ /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
//========================================================================
// LLUICtrl interface
@@ -131,8 +138,10 @@ private:
void refreshParcelIcons();
// Refresh the value in the health percentage text field
void refreshHealth();
+ void refreshMaturityButton();
+ void positionMaturityButton();
- void rebuildLocationHistory(std::string filter = "");
+ void rebuildLocationHistory(const std::string& filter = LLStringUtil::null);
bool findTeleportItemsByTitle(const LLTeleportHistoryItem& item, const std::string& filter);
void setText(const LLStringExplicit& text);
void updateAddLandmarkButton();
@@ -142,13 +151,14 @@ private:
void changeLocationPresentation();
void onInfoButtonClicked();
- void onLocationHistoryLoaded();
+ void onLocationHistoryChanged(LLLocationHistory::EChangeType event);
void onLocationPrearrange(const LLSD& data);
void onTextEditorRightClicked(S32 x, S32 y, MASK mask);
void onLandmarkLoaded(LLLandmark* lm);
void onForSaleButtonClicked();
void onAddLandmarkButtonClicked();
void onAgentParcelChange();
+ void onMaturityButtonClicked();
// callbacks
bool onLocationContextMenuItemEnabled(const LLSD& userdata);
void onLocationContextMenuItemClicked(const LLSD& userdata);
@@ -160,7 +170,8 @@ private:
LLButton* mInfoBtn;
S32 mIconHPad; // pad between all icons
S32 mAddLandmarkHPad; // pad to left of landmark star
-
+
+ LLButton* mMaturityButton;
LLIconCtrl* mParcelIcon[ICON_COUNT];
LLTextBox* mDamageText;
@@ -168,15 +179,22 @@ private:
LLRemoveLandmarkObserver* mRemoveLandmarkObserver;
LLParcelChangeObserver* mParcelChangeObserver;
+ boost::signals2::connection mCoordinatesControlConnection;
+ boost::signals2::connection mParcelPropertiesControlConnection;
boost::signals2::connection mParcelMgrConnection;
boost::signals2::connection mLocationHistoryConnection;
LLUIImage* mLandmarkImageOn;
LLUIImage* mLandmarkImageOff;
+ LLPointer<LLUIImage> mIconMaturityGeneral;
+ LLPointer<LLUIImage> mIconMaturityAdult;
+ LLPointer<LLUIImage> mIconMaturityModerate;
std::string mAddLandmarkTooltip;
std::string mEditLandmarkTooltip;
// this field holds a human-readable form of the location string, it is needed to be able to compare copy-pated value and real location
std::string mHumanReadableLocation;
+ bool isHumanReadableLocationVisible;
+ std::string mMaturityHelpTopic;
};
#endif
diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp
index 96ce01c05f..be8b2363ad 100644
--- a/indra/newview/lllogchat.cpp
+++ b/indra/newview/lllogchat.cpp
@@ -39,12 +39,27 @@
#include "llviewercontrol.h"
#include "llinstantmessage.h"
+#include "llsingleton.h" // for LLSingleton
#include <boost/algorithm/string/trim.hpp>
#include <boost/algorithm/string/replace.hpp>
#include <boost/regex.hpp>
#include <boost/regex/v4/match_results.hpp>
+#if LL_MSVC
+// disable warning about boost::lexical_cast unreachable code
+// when it fails to parse the string
+#pragma warning (disable:4702)
+#endif
+
+#include <boost/date_time/gregorian/gregorian.hpp>
+#if LL_MSVC
+#pragma warning(pop) // Restore all warnings to the previous state
+#endif
+
+#include <boost/date_time/posix_time/posix_time.hpp>
+#include <boost/date_time/local_time_adjustor.hpp>
+
const S32 LOG_RECALL_SIZE = 2048;
const static std::string IM_TIME("time");
@@ -69,6 +84,8 @@ const static std::string MULTI_LINE_PREFIX(" ");
* Katar Ivercourt is Offline
* [3:00] Katar Ivercourt is Offline
* [2009/11/20 3:01] Corba ProductEngine is Offline
+ *
+ * Note: "You" was used as an avatar names in viewers of previous versions
*/
const static boost::regex TIMESTAMP_AND_STUFF("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+\\d{1,2}:\\d{2}\\]\\s+|\\[\\d{1,2}:\\d{2}\\]\\s+)?(.*)$");
@@ -78,11 +95,96 @@ const static boost::regex TIMESTAMP_AND_STUFF("^(\\[\\d{4}/\\d{1,2}/\\d{1,2}\\s+
*/
const static boost::regex NAME_AND_TEXT("(You:|Second Life:|[^\\s:]+\\s*[:]{1}|\\S+\\s+[^\\s:]+[:]{1})?(\\s*)(.*)");
+//is used to parse complex object names like "Xstreet SL Terminal v2.2.5 st"
+const static std::string NAME_TEXT_DIVIDER(": ");
+
+// is used for timestamps adjusting
+const static char* DATE_FORMAT("%Y/%m/%d %H:%M");
+const static char* TIME_FORMAT("%H:%M");
+
const static int IDX_TIMESTAMP = 1;
const static int IDX_STUFF = 2;
const static int IDX_NAME = 1;
const static int IDX_TEXT = 3;
+using namespace boost::posix_time;
+using namespace boost::gregorian;
+
+class LLLogChatTimeScanner: public LLSingleton<LLLogChatTimeScanner>
+{
+public:
+ LLLogChatTimeScanner()
+ {
+ // Note, date/time facets will be destroyed by string streams
+ mDateStream.imbue(std::locale(mDateStream.getloc(), new date_input_facet(DATE_FORMAT)));
+ mTimeStream.imbue(std::locale(mTimeStream.getloc(), new time_facet(TIME_FORMAT)));
+ mTimeStream.imbue(std::locale(mTimeStream.getloc(), new time_input_facet(DATE_FORMAT)));
+ }
+
+ date getTodayPacificDate()
+ {
+ typedef boost::date_time::local_adjustor<ptime, -8, no_dst> pst;
+ typedef boost::date_time::local_adjustor<ptime, -7, no_dst> pdt;
+ time_t t_time = time(NULL);
+ ptime p_time = LLStringOps::getPacificDaylightTime()
+ ? pdt::utc_to_local(from_time_t(t_time))
+ : pst::utc_to_local(from_time_t(t_time));
+ struct tm s_tm = to_tm(p_time);
+ return date_from_tm(s_tm);
+ }
+
+ void checkAndCutOffDate(std::string& time_str)
+ {
+ // Cuts off the "%Y/%m/%d" from string for todays timestamps.
+ // Assume that passed string has at least "%H:%M" time format.
+ date log_date(not_a_date_time);
+ date today(getTodayPacificDate());
+
+ // Parse the passed date
+ mDateStream.str(LLStringUtil::null);
+ mDateStream << time_str;
+ mDateStream >> log_date;
+ mDateStream.clear();
+
+ days zero_days(0);
+ days days_alive = today - log_date;
+
+ if ( days_alive == zero_days )
+ {
+ // Yep, today's so strip "%Y/%m/%d" info
+ ptime stripped_time(not_a_date_time);
+
+ mTimeStream.str(LLStringUtil::null);
+ mTimeStream << time_str;
+ mTimeStream >> stripped_time;
+ mTimeStream.clear();
+
+ time_str.clear();
+
+ mTimeStream.str(LLStringUtil::null);
+ mTimeStream << stripped_time;
+ mTimeStream >> time_str;
+ mTimeStream.clear();
+ }
+
+ LL_DEBUGS("LLChatLogParser")
+ << " log_date: "
+ << log_date
+ << " today: "
+ << today
+ << " days alive: "
+ << days_alive
+ << " new time: "
+ << time_str
+ << LL_ENDL;
+ }
+
+
+private:
+ std::stringstream mDateStream;
+ std::stringstream mTimeStream;
+};
+
//static
std::string LLLogChat::makeLogFileName(std::string filename)
{
@@ -160,10 +262,19 @@ void LLLogChat::saveHistory(const std::string& filename,
if (gSavedPerAccountSettings.getBOOL("LogTimestamp"))
item["time"] = LLLogChat::timestamp(gSavedPerAccountSettings.getBOOL("LogTimestampDate"));
- item["from"] = from;
item["from_id"] = from_id;
item["message"] = line;
+ //adding "Second Life:" for all system messages to make chat log history parsing more reliable
+ if (from.empty() && from_id.isNull())
+ {
+ item["from"] = SYSTEM_FROM;
+ }
+ else
+ {
+ item["from"] = from;
+ }
+
file << LLChatLogFormatter(item) << std::endl;
file.close();
@@ -363,7 +474,8 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im)
boost::trim(timestamp);
timestamp.erase(0, 1);
timestamp.erase(timestamp.length()-1, 1);
- im[IM_TIME] = timestamp;
+ LLLogChatTimeScanner::instance().checkAndCutOffDate(timestamp);
+ im[IM_TIME] = timestamp;
}
else
{
@@ -398,6 +510,18 @@ bool LLChatLogParser::parse(std::string& raw, LLSD& im)
im[IM_FROM_ID] = LLUUID::null;
}
+ //possibly a case of complex object names consisting of 3+ words
+ if (!has_name)
+ {
+ U32 divider_pos = stuff.find(NAME_TEXT_DIVIDER);
+ if (divider_pos != std::string::npos && divider_pos < (stuff.length() - NAME_TEXT_DIVIDER.length()))
+ {
+ im[IM_FROM] = stuff.substr(0, divider_pos);
+ im[IM_TEXT] = stuff.substr(divider_pos + NAME_TEXT_DIVIDER.length());
+ return true;
+ }
+ }
+
if (!has_name)
{
//text is mandatory
diff --git a/indra/newview/llloginhandler.cpp b/indra/newview/llloginhandler.cpp
index 1be3430e07..4e0a7594ba 100644
--- a/indra/newview/llloginhandler.cpp
+++ b/indra/newview/llloginhandler.cpp
@@ -35,12 +35,14 @@
#include "llloginhandler.h"
// viewer includes
+#include "llsecapi.h"
+#include "lllogininstance.h" // to check if logged in yet
#include "llpanellogin.h" // save_password_to_disk()
#include "llstartup.h" // getStartupState()
-#include "llurlsimstring.h"
+#include "llslurl.h"
#include "llviewercontrol.h" // gSavedSettings
#include "llviewernetwork.h" // EGridInfo
-#include "llviewerwindow.h" // getWindow()
+#include "llviewerwindow.h" // getWindow()
// library includes
#include "llmd5.h"
@@ -59,109 +61,33 @@ bool LLLoginHandler::parseDirectLogin(std::string url)
LLURI uri(url);
parse(uri.queryMap());
- if (/*mWebLoginKey.isNull() ||*/
- mFirstName.empty() ||
- mLastName.empty())
- {
- return false;
- }
- else
- {
- return true;
- }
+ // NOTE: Need to add direct login as per identity evolution
+ return true;
}
-
void LLLoginHandler::parse(const LLSD& queryMap)
{
- //mWebLoginKey = queryMap["web_login_key"].asUUID();
- mFirstName = queryMap["first_name"].asString();
- mLastName = queryMap["last_name"].asString();
- EGridInfo grid_choice = GRID_INFO_NONE;
- if (queryMap["grid"].asString() == "aditi")
- {
- grid_choice = GRID_INFO_ADITI;
- }
- else if (queryMap["grid"].asString() == "agni")
- {
- grid_choice = GRID_INFO_AGNI;
- }
- else if (queryMap["grid"].asString() == "siva")
- {
- grid_choice = GRID_INFO_SIVA;
- }
- else if (queryMap["grid"].asString() == "damballah")
- {
- grid_choice = GRID_INFO_DAMBALLAH;
- }
- else if (queryMap["grid"].asString() == "durga")
- {
- grid_choice = GRID_INFO_DURGA;
- }
- else if (queryMap["grid"].asString() == "shakti")
- {
- grid_choice = GRID_INFO_SHAKTI;
- }
- else if (queryMap["grid"].asString() == "soma")
- {
- grid_choice = GRID_INFO_SOMA;
- }
- else if (queryMap["grid"].asString() == "ganga")
- {
- grid_choice = GRID_INFO_GANGA;
- }
- else if (queryMap["grid"].asString() == "vaak")
- {
- grid_choice = GRID_INFO_VAAK;
- }
- else if (queryMap["grid"].asString() == "uma")
- {
- grid_choice = GRID_INFO_UMA;
- }
- else if (queryMap["grid"].asString() == "mohini")
- {
- grid_choice = GRID_INFO_MOHINI;
- }
- else if (queryMap["grid"].asString() == "yami")
- {
- grid_choice = GRID_INFO_YAMI;
- }
- else if (queryMap["grid"].asString() == "nandi")
- {
- grid_choice = GRID_INFO_NANDI;
- }
- else if (queryMap["grid"].asString() == "mitra")
+ if (queryMap.has("grid"))
{
- grid_choice = GRID_INFO_MITRA;
+ LLGridManager::getInstance()->setGridChoice(queryMap["grid"].asString());
}
- else if (queryMap["grid"].asString() == "radha")
- {
- grid_choice = GRID_INFO_RADHA;
- }
- else if (queryMap["grid"].asString() == "ravi")
- {
- grid_choice = GRID_INFO_RAVI;
- }
- else if (queryMap["grid"].asString() == "aruna")
- {
- grid_choice = GRID_INFO_ARUNA;
- }
-
- if(grid_choice != GRID_INFO_NONE)
- {
- LLViewerLogin::getInstance()->setGridChoice(grid_choice);
- }
-
+
+
std::string startLocation = queryMap["location"].asString();
-
+
if (startLocation == "specify")
{
- LLURLSimString::setString(queryMap["region"].asString());
+ LLStartUp::setStartSLURL(LLSLURL(LLGridManager::getInstance()->getGridLoginID(),
+ queryMap["region"].asString()));
+ }
+ else if (startLocation == "home")
+ {
+ LLStartUp::setStartSLURL(LLSLURL(LLSLURL::SIM_LOCATION_HOME));
}
- else if (!startLocation.empty()) // "last" or "home" or ??? (let LLURLSimString figure it out)
+ else if (startLocation == "last")
{
- LLURLSimString::setString(startLocation);
+ LLStartUp::setStartSLURL(LLSLURL(LLSLURL::SIM_LOCATION_LAST));
}
}
@@ -169,6 +95,13 @@ bool LLLoginHandler::handle(const LLSD& tokens,
const LLSD& query_map,
LLMediaCtrl* web)
{
+ // do nothing if we are already logged in
+ if (LLLoginInstance::getInstance()->authSuccess())
+ {
+ LL_WARNS_ONCE("SLURL") << "Already logged in! Ignoring login SLapp." << LL_ENDL;
+ return true;
+ }
+
if (tokens.size() == 1
&& tokens[0].asString() == "show")
{
@@ -212,40 +145,65 @@ bool LLLoginHandler::handle(const LLSD& tokens,
return true;
}
- std::string password = query_map["password"].asString();
-
- if (!password.empty())
+ if (LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP) //on splash page
{
- gSavedSettings.setBOOL("RememberPassword", TRUE);
-
- if (password.substr(0,3) != "$1$")
- {
- LLMD5 pass((unsigned char*)password.c_str());
- char md5pass[33]; /* Flawfinder: ignore */
- pass.hex_digest(md5pass);
- std::string hashed_password = ll_safe_string(md5pass, 32);
- LLStartUp::savePasswordToDisk(hashed_password);
- }
+ // as the login page may change from grid to grid, as well as
+ // things like username/password/etc, we simply refresh the
+ // login page to make sure everything is set up correctly
+ LLPanelLogin::loadLoginPage();
+ LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
}
-
+ return true;
+}
+
- if (LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP) //on splash page
+
+// Initialize the credentials
+// If the passed in URL contains login info, parse
+// that into a credential and web login key. Otherwise
+// check the command line. If the command line
+// does not contain any login creds, load the last saved
+// ones from the protected credential store.
+// This always returns with a credential structure set in the
+// login handler
+LLPointer<LLCredential> LLLoginHandler::initializeLoginInfo()
+{
+ LLPointer<LLCredential> result = NULL;
+ // so try to load it from the UserLoginInfo
+ result = loadSavedUserLoginInfo();
+ if (result.isNull())
+ {
+ result = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());
+ }
+
+ return result;
+}
+
+
+LLPointer<LLCredential> LLLoginHandler::loadSavedUserLoginInfo()
+{
+ // load the saved user login info into a LLCredential.
+ // perhaps this should be moved.
+ LLSD cmd_line_login = gSavedSettings.getLLSD("UserLoginInfo");
+ if (cmd_line_login.size() == 3)
{
- if (!mFirstName.empty() || !mLastName.empty())
- {
- // Fill in the name, and maybe the password
- LLPanelLogin::setFields(mFirstName, mLastName, password);
- }
-
- //if (mWebLoginKey.isNull())
- //{
- // LLPanelLogin::loadLoginPage();
- //}
- //else
- //{
- // LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
- //}
- LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
- }
- return true;
+
+ LLMD5 pass((unsigned char*)cmd_line_login[2].asString().c_str());
+ char md5pass[33]; /* Flawfinder: ignore */
+ pass.hex_digest(md5pass);
+ LLSD identifier = LLSD::emptyMap();
+ identifier["type"] = "agent";
+ identifier["first_name"] = cmd_line_login[0];
+ identifier["last_name"] = cmd_line_login[1];
+
+ LLSD authenticator = LLSD::emptyMap();
+ authenticator["type"] = "hash";
+ authenticator["algorithm"] = "md5";
+ authenticator["secret"] = md5pass;
+ // yuck, we'll fix this with mani's changes.
+ gSavedSettings.setBOOL("AutoLogin", TRUE);
+ return gSecAPIHandler->createCredential(LLGridManager::getInstance()->getGrid(),
+ identifier, authenticator);
+ }
+ return NULL;
}
diff --git a/indra/newview/llloginhandler.h b/indra/newview/llloginhandler.h
index ac4648761b..c15b998c91 100644
--- a/indra/newview/llloginhandler.h
+++ b/indra/newview/llloginhandler.h
@@ -34,6 +34,7 @@
#define LLLOGINHANDLER_H
#include "llcommandhandler.h"
+#include "llsecapi.h"
class LLLoginHandler : public LLCommandHandler
{
@@ -46,19 +47,15 @@ class LLLoginHandler : public LLCommandHandler
// secondlife:///app/login?first=Bob&last=Dobbs
bool parseDirectLogin(std::string url);
- std::string getFirstName() const { return mFirstName; }
- std::string getLastName() const { return mLastName; }
-
// Web-based login unsupported
//LLUUID getWebLoginKey() const { return mWebLoginKey; }
+ LLPointer<LLCredential> loadSavedUserLoginInfo();
+ LLPointer<LLCredential> initializeLoginInfo();
+
private:
void parse(const LLSD& queryMap);
-private:
- std::string mFirstName;
- std::string mLastName;
- //LLUUID mWebLoginKey;
};
extern LLLoginHandler gLoginHandler;
diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp
index 24c72c65ce..71604291e1 100644
--- a/indra/newview/lllogininstance.cpp
+++ b/indra/newview/lllogininstance.cpp
@@ -48,13 +48,16 @@
// newview
#include "llviewernetwork.h"
#include "llviewercontrol.h"
-#include "llurlsimstring.h"
+#include "llslurl.h"
+#include "llstartup.h"
#include "llfloaterreg.h"
#include "llnotifications.h"
#include "llwindow.h"
#if LL_LINUX || LL_SOLARIS
#include "lltrans.h"
#endif
+#include "llsecapi.h"
+#include "llstartup.h"
static const char * const TOS_REPLY_PUMP = "lllogininstance_tos_callback";
static const char * const TOS_LISTENER_NAME = "lllogininstance_tos";
@@ -83,14 +86,14 @@ LLLoginInstance::~LLLoginInstance()
{
}
-void LLLoginInstance::connect(const LLSD& credentials)
+void LLLoginInstance::connect(LLPointer<LLCredential> credentials)
{
std::vector<std::string> uris;
- LLViewerLogin::getInstance()->getLoginURIs(uris);
+ LLGridManager::getInstance()->getLoginURIs(uris);
connect(uris.front(), credentials);
}
-void LLLoginInstance::connect(const std::string& uri, const LLSD& credentials)
+void LLLoginInstance::connect(const std::string& uri, LLPointer<LLCredential> credentials)
{
mAttemptComplete = false; // Reset attempt complete at this point!
constructAuthParams(credentials);
@@ -102,7 +105,7 @@ void LLLoginInstance::reconnect()
// Sort of like connect, only using the pre-existing
// request params.
std::vector<std::string> uris;
- LLViewerLogin::getInstance()->getLoginURIs(uris);
+ LLGridManager::getInstance()->getLoginURIs(uris);
mLoginModule->connect(uris.front(), mRequestData);
}
@@ -118,7 +121,7 @@ LLSD LLLoginInstance::getResponse()
return mResponseData;
}
-void LLLoginInstance::constructAuthParams(const LLSD& credentials)
+void LLLoginInstance::constructAuthParams(LLPointer<LLCredential> user_credential)
{
// Set up auth request options.
//#define LL_MINIMIAL_REQUESTED_OPTIONS
@@ -145,8 +148,11 @@ void LLLoginInstance::constructAuthParams(const LLSD& credentials)
requested_options.append("adult_compliant");
//requested_options.append("inventory-targets");
requested_options.append("buddy-list");
+ requested_options.append("newuser-config");
requested_options.append("ui-config");
#endif
+ requested_options.append("map-server-url");
+ requested_options.append("voice-config");
requested_options.append("tutorial_setting");
requested_options.append("login-flags");
requested_options.append("global-textures");
@@ -155,20 +161,18 @@ void LLLoginInstance::constructAuthParams(const LLSD& credentials)
gSavedSettings.setBOOL("UseDebugMenus", TRUE);
requested_options.append("god-connect");
}
+
+ // (re)initialize the request params with creds.
+ LLSD request_params = user_credential->getLoginParams();
char hashed_mac_string[MD5HEX_STR_SIZE]; /* Flawfinder: ignore */
LLMD5 hashed_mac;
- hashed_mac.update( gMACAddress, MAC_ADDRESS_BYTES );
+ unsigned char MACAddress[MAC_ADDRESS_BYTES];
+ LLUUID::getNodeID(MACAddress);
+ hashed_mac.update( MACAddress, MAC_ADDRESS_BYTES );
hashed_mac.finalize();
hashed_mac.hex_digest(hashed_mac_string);
-
- // prepend "$1$" to the password to indicate its the md5'd version.
- std::string dpasswd("$1$");
- dpasswd.append(credentials["passwd"].asString());
-
- // (re)initialize the request params with creds.
- LLSD request_params(credentials);
- request_params["passwd"] = dpasswd;
+
request_params["start"] = construct_start_string();
request_params["skipoptional"] = mSkipOptionalUpdate;
request_params["agree_to_tos"] = false; // Always false here. Set true in
@@ -247,6 +251,15 @@ void LLLoginInstance::handleLoginFailure(const LLSD& event)
LLSD data(LLSD::emptyMap());
data["message"] = message_response;
data["reply_pump"] = TOS_REPLY_PUMP;
+ if(response.has("error_code"))
+ {
+ data["error_code"] = response["error_code"];
+ }
+ if(response.has("certificate"))
+ {
+ data["certificate"] = response["certificate"];
+ }
+
LLFloaterReg::showInstance("message_critical", data);
LLEventPumps::instance().obtain(TOS_REPLY_PUMP)
.listen(TOS_LISTENER_NAME,
@@ -352,20 +365,18 @@ void LLLoginInstance::updateApp(bool mandatory, const std::string& auth_msg)
payload["mandatory"] = mandatory;
/*
- We're constructing one of the following 6 strings here:
+ We're constructing one of the following 9 strings here:
"DownloadWindowsMandatory"
"DownloadWindowsReleaseForDownload"
"DownloadWindows"
"DownloadMacMandatory"
"DownloadMacReleaseForDownload"
"DownloadMac"
+ "DownloadLinuxMandatory"
+ "DownloadLinuxReleaseForDownload"
+ "DownloadLinux"
I've called them out explicitly in this comment so that they can be grepped for.
-
- Also, we assume that if we're not Windows we're Mac. If we ever intend to support
- Linux with autoupdate, this should be an explicit #elif LL_DARWIN, but
- we'd rather deliver the wrong message than no message, so until Linux is supported
- we'll leave it alone.
*/
std::string notification_name = "Download";
@@ -454,20 +465,31 @@ bool LLLoginInstance::updateDialogCallback(const LLSD& notification, const LLSD&
std::string construct_start_string()
{
std::string start;
- if (LLURLSimString::parse())
+ LLSLURL start_slurl = LLStartUp::getStartSLURL();
+ switch(start_slurl.getType())
{
- // a startup URL was specified
- std::string unescaped_start =
+ case LLSLURL::LOCATION:
+ {
+ // a startup URL was specified
+ LLVector3 position = start_slurl.getPosition();
+ std::string unescaped_start =
STRINGIZE( "uri:"
- << LLURLSimString::sInstance.mSimName << "&"
- << LLURLSimString::sInstance.mX << "&"
- << LLURLSimString::sInstance.mY << "&"
- << LLURLSimString::sInstance.mZ);
- start = xml_escape_string(unescaped_start);
- }
- else
- {
- start = gSavedSettings.getString("LoginLocation");
+ << start_slurl.getRegion() << "&"
+ << position[VX] << "&"
+ << position[VY] << "&"
+ << position[VZ]);
+ start = xml_escape_string(unescaped_start);
+ break;
+ }
+ case LLSLURL::HOME_LOCATION:
+ {
+ start = "home";
+ break;
+ }
+ default:
+ {
+ start = "last";
+ }
}
return start;
}
diff --git a/indra/newview/lllogininstance.h b/indra/newview/lllogininstance.h
index c8704eddb4..44271bb75e 100644
--- a/indra/newview/lllogininstance.h
+++ b/indra/newview/lllogininstance.h
@@ -36,6 +36,7 @@
#include "lleventdispatcher.h"
#include <boost/scoped_ptr.hpp>
#include <boost/function.hpp>
+#include "llsecapi.h"
class LLLogin;
class LLEventStream;
class LLNotificationsInterface;
@@ -48,8 +49,8 @@ public:
LLLoginInstance();
~LLLoginInstance();
- void connect(const LLSD& credential); // Connect to the current grid choice.
- void connect(const std::string& uri, const LLSD& credential); // Connect to the given uri.
+ void connect(LLPointer<LLCredential> credentials); // Connect to the current grid choice.
+ void connect(const std::string& uri, LLPointer<LLCredential> credentials); // Connect to the given uri.
void reconnect(); // reconnect using the current credentials.
void disconnect();
@@ -81,7 +82,7 @@ public:
void setUpdaterLauncher(const UpdaterLauncherCallback& ulc) { mUpdaterLauncher = ulc; }
private:
- void constructAuthParams(const LLSD& credentials);
+ void constructAuthParams(LLPointer<LLCredential> user_credentials);
void updateApp(bool mandatory, const std::string& message);
bool updateDialogCallback(const LLSD& notification, const LLSD& response);
diff --git a/indra/newview/llmachineid.cpp b/indra/newview/llmachineid.cpp
new file mode 100644
index 0000000000..53243e9807
--- /dev/null
+++ b/indra/newview/llmachineid.cpp
@@ -0,0 +1,269 @@
+/**
+ * @file llmachineid.cpp
+ * @brief retrieves unique machine ids
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "lluuid.h"
+#include "llmachineid.h"
+#if LL_WINDOWS
+#define _WIN32_DCOM
+#include <iostream>
+using namespace std;
+#include <comdef.h>
+#include <Wbemidl.h>
+#endif
+unsigned char static_unique_id[] = {0,0,0,0,0,0};
+bool static has_static_unique_id = false;
+
+// get an unique machine id.
+// NOT THREAD SAFE - do before setting up threads.
+// MAC Address doesn't work for Windows 7 since the first returned hardware MAC address changes with each reboot, Go figure??
+
+S32 LLMachineID::init()
+{
+ memset(static_unique_id,0,sizeof(static_unique_id));
+ S32 ret_code = 0;
+#if LL_WINDOWS
+# pragma comment(lib, "wbemuuid.lib")
+ size_t len = sizeof(static_unique_id);
+
+ // algorithm to detect BIOS serial number found at:
+ // http://msdn.microsoft.com/en-us/library/aa394077%28VS.85%29.aspx
+ // we can't use the MAC address since on Windows 7, the first returned MAC address changes with every reboot.
+
+
+ HRESULT hres;
+
+ // Step 1: --------------------------------------------------
+ // Initialize COM. ------------------------------------------
+
+ hres = CoInitializeEx(0, COINIT_MULTITHREADED);
+ if (FAILED(hres))
+ {
+ LL_DEBUGS("AppInit") << "Failed to initialize COM library. Error code = 0x" << hex << hres << LL_ENDL;
+ return 1; // Program has failed.
+ }
+
+ // Step 2: --------------------------------------------------
+ // Set general COM security levels --------------------------
+ // Note: If you are using Windows 2000, you need to specify -
+ // the default authentication credentials for a user by using
+ // a SOLE_AUTHENTICATION_LIST structure in the pAuthList ----
+ // parameter of CoInitializeSecurity ------------------------
+
+ hres = CoInitializeSecurity(
+ NULL,
+ -1, // COM authentication
+ NULL, // Authentication services
+ NULL, // Reserved
+ RPC_C_AUTHN_LEVEL_DEFAULT, // Default authentication
+ RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation
+ NULL, // Authentication info
+ EOAC_NONE, // Additional capabilities
+ NULL // Reserved
+ );
+
+
+ if (FAILED(hres))
+ {
+ LL_DEBUGS("AppInit") << "Failed to initialize security. Error code = 0x" << hex << hres << LL_ENDL;
+ CoUninitialize();
+ return 1; // Program has failed.
+ }
+
+ // Step 3: ---------------------------------------------------
+ // Obtain the initial locator to WMI -------------------------
+
+ IWbemLocator *pLoc = NULL;
+
+ hres = CoCreateInstance(
+ CLSID_WbemLocator,
+ 0,
+ CLSCTX_INPROC_SERVER,
+ IID_IWbemLocator, (LPVOID *) &pLoc);
+
+ if (FAILED(hres))
+ {
+ LL_DEBUGS("AppInit") << "Failed to create IWbemLocator object." << " Err code = 0x" << hex << hres << LL_ENDL;
+ CoUninitialize();
+ return 1; // Program has failed.
+ }
+
+ // Step 4: -----------------------------------------------------
+ // Connect to WMI through the IWbemLocator::ConnectServer method
+
+ IWbemServices *pSvc = NULL;
+
+ // Connect to the root\cimv2 namespace with
+ // the current user and obtain pointer pSvc
+ // to make IWbemServices calls.
+ hres = pLoc->ConnectServer(
+ _bstr_t(L"ROOT\\CIMV2"), // Object path of WMI namespace
+ NULL, // User name. NULL = current user
+ NULL, // User password. NULL = current
+ 0, // Locale. NULL indicates current
+ NULL, // Security flags.
+ 0, // Authority (e.g. Kerberos)
+ 0, // Context object
+ &pSvc // pointer to IWbemServices proxy
+ );
+
+ if (FAILED(hres))
+ {
+ LL_DEBUGS("AppInit") << "Could not connect. Error code = 0x" << hex << hres << LL_ENDL;
+ pLoc->Release();
+ CoUninitialize();
+ return 1; // Program has failed.
+ }
+
+ LL_DEBUGS("AppInit") << "Connected to ROOT\\CIMV2 WMI namespace" << LL_ENDL;
+
+
+ // Step 5: --------------------------------------------------
+ // Set security levels on the proxy -------------------------
+
+ hres = CoSetProxyBlanket(
+ pSvc, // Indicates the proxy to set
+ RPC_C_AUTHN_WINNT, // RPC_C_AUTHN_xxx
+ RPC_C_AUTHZ_NONE, // RPC_C_AUTHZ_xxx
+ NULL, // Server principal name
+ RPC_C_AUTHN_LEVEL_CALL, // RPC_C_AUTHN_LEVEL_xxx
+ RPC_C_IMP_LEVEL_IMPERSONATE, // RPC_C_IMP_LEVEL_xxx
+ NULL, // client identity
+ EOAC_NONE // proxy capabilities
+ );
+
+ if (FAILED(hres))
+ {
+ LL_DEBUGS("AppInit") << "Could not set proxy blanket. Error code = 0x" << hex << hres << LL_ENDL;
+ pSvc->Release();
+ pLoc->Release();
+ CoUninitialize();
+ return 1; // Program has failed.
+ }
+
+ // Step 6: --------------------------------------------------
+ // Use the IWbemServices pointer to make requests of WMI ----
+
+ // For example, get the name of the operating system
+ IEnumWbemClassObject* pEnumerator = NULL;
+ hres = pSvc->ExecQuery(
+ bstr_t("WQL"),
+ bstr_t("SELECT * FROM Win32_OperatingSystem"),
+ WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
+ NULL,
+ &pEnumerator);
+
+ if (FAILED(hres))
+ {
+ LL_DEBUGS("AppInit") << "Query for operating system name failed." << " Error code = 0x" << hex << hres << LL_ENDL;
+ pSvc->Release();
+ pLoc->Release();
+ CoUninitialize();
+ return 1; // Program has failed.
+ }
+
+ // Step 7: -------------------------------------------------
+ // Get the data from the query in step 6 -------------------
+
+ IWbemClassObject *pclsObj = NULL;
+ ULONG uReturn = 0;
+
+ while (pEnumerator)
+ {
+ HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
+ &pclsObj, &uReturn);
+
+ if(0 == uReturn)
+ {
+ break;
+ }
+
+ VARIANT vtProp;
+
+ // Get the value of the Name property
+ hr = pclsObj->Get(L"SerialNumber", 0, &vtProp, 0, 0);
+ LL_DEBUGS("AppInit") << " Serial Number : " << vtProp.bstrVal << LL_ENDL;
+ // use characters in the returned Serial Number to create a byte array of size len
+ BSTR serialNumber ( vtProp.bstrVal);
+ unsigned int j = 0;
+ while( vtProp.bstrVal[j] != 0)
+ {
+ for (unsigned int i = 0; i < len; i++)
+ {
+ if (vtProp.bstrVal[j] == 0)
+ break;
+
+ static_unique_id[i] = (unsigned int)(static_unique_id[i] + serialNumber[j]);
+ j++;
+ }
+ }
+ VariantClear(&vtProp);
+
+ pclsObj->Release();
+ pclsObj = NULL;
+ break;
+ }
+
+ // Cleanup
+ // ========
+
+ if (pSvc)
+ pSvc->Release();
+ if (pLoc)
+ pLoc->Release();
+ if (pEnumerator)
+ pEnumerator->Release();
+ CoUninitialize();
+ ret_code=0;
+#else
+ unsigned char * staticPtr = (unsigned char *)(&static_unique_id[0]);
+ ret_code = LLUUID::getNodeID(staticPtr);
+#endif
+ has_static_unique_id = true;
+ return ret_code;
+}
+
+
+S32 LLMachineID::getUniqueID(unsigned char *unique_id, size_t len)
+{
+ if (has_static_unique_id)
+ {
+ memcpy ( unique_id, &static_unique_id, len);
+ LL_DEBUGS("AppInit") << "UniqueID: " << unique_id[0] << unique_id[1]<< unique_id[2] << unique_id[3] << unique_id[4] << unique_id [5] << LL_ENDL;
+ return 1;
+ }
+ return 0;
+}
+
+
+
+
diff --git a/indra/newview/llmachineid.h b/indra/newview/llmachineid.h
new file mode 100644
index 0000000000..8160309b47
--- /dev/null
+++ b/indra/newview/llmachineid.h
@@ -0,0 +1,56 @@
+/**
+ * @file llmachineid.h
+ * @brief retrieves unique machine ids
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLMACHINEID_H
+#define LL_LLMACHINEID_H
+
+
+class LLMachineID
+{
+public:
+ LLMachineID();
+ virtual ~LLMachineID();
+ static S32 getUniqueID(unsigned char *unique_id, size_t len);
+ static S32 init();
+
+protected:
+
+private:
+
+
+};
+
+
+
+
+
+#endif // LL_LLMACHINEID_H
diff --git a/indra/newview/llmanip.cpp b/indra/newview/llmanip.cpp
index a96240e31c..957e88960d 100644
--- a/indra/newview/llmanip.cpp
+++ b/indra/newview/llmanip.cpp
@@ -43,6 +43,7 @@
#include "llviewertexturelist.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llviewercontrol.h"
#include "lldrawable.h"
#include "llfontgl.h"
@@ -180,7 +181,7 @@ F32 LLManip::getSubdivisionLevel(const LLVector3 &reference_point, const LLVecto
LLVector3 cam_to_reference;
if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
{
- cam_to_reference = LLVector3(1.f / gAgent.mHUDCurZoom, 0.f, 0.f);
+ cam_to_reference = LLVector3(1.f / gAgentCamera.mHUDCurZoom, 0.f, 0.f);
}
else
{
@@ -265,8 +266,8 @@ BOOL LLManip::getMousePointOnPlaneGlobal(LLVector3d& point, S32 x, S32 y, LLVect
if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
{
BOOL result = FALSE;
- F32 mouse_x = ((F32)x / gViewerWindow->getWorldViewWidthScaled() - 0.5f) * LLViewerCamera::getInstance()->getAspect() / gAgent.mHUDCurZoom;
- F32 mouse_y = ((F32)y / gViewerWindow->getWorldViewHeightScaled() - 0.5f) / gAgent.mHUDCurZoom;
+ F32 mouse_x = ((F32)x / gViewerWindow->getWorldViewWidthScaled() - 0.5f) * LLViewerCamera::getInstance()->getAspect() / gAgentCamera.mHUDCurZoom;
+ F32 mouse_y = ((F32)y / gViewerWindow->getWorldViewHeightScaled() - 0.5f) / gAgentCamera.mHUDCurZoom;
LLVector3 origin_agent = gAgent.getPosAgentFromGlobal(origin);
LLVector3 mouse_pos = LLVector3(0.f, -mouse_x, mouse_y);
@@ -304,15 +305,15 @@ BOOL LLManip::nearestPointOnLineFromMouse( S32 x, S32 y, const LLVector3& b1, co
if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
{
- F32 mouse_x = (((F32)x / gViewerWindow->getWindowWidthScaled()) - 0.5f) * LLViewerCamera::getInstance()->getAspect() / gAgent.mHUDCurZoom;
- F32 mouse_y = (((F32)y / gViewerWindow->getWindowHeightScaled()) - 0.5f) / gAgent.mHUDCurZoom;
+ F32 mouse_x = (((F32)x / gViewerWindow->getWindowWidthScaled()) - 0.5f) * LLViewerCamera::getInstance()->getAspect() / gAgentCamera.mHUDCurZoom;
+ F32 mouse_y = (((F32)y / gViewerWindow->getWindowHeightScaled()) - 0.5f) / gAgentCamera.mHUDCurZoom;
a1 = LLVector3(llmin(b1.mV[VX] - 0.1f, b2.mV[VX] - 0.1f, 0.f), -mouse_x, mouse_y);
a2 = a1 + LLVector3(1.f, 0.f, 0.f);
}
else
{
- a1 = gAgent.getCameraPositionAgent();
- a2 = gAgent.getCameraPositionAgent() + LLVector3(gViewerWindow->mouseDirectionGlobal(x, y));
+ a1 = gAgentCamera.getCameraPositionAgent();
+ a2 = gAgentCamera.getCameraPositionAgent() + LLVector3(gViewerWindow->mouseDirectionGlobal(x, y));
}
BOOL parallel = TRUE;
@@ -491,7 +492,7 @@ void LLManip::renderTickText(const LLVector3& pos, const std::string& text, cons
LLVector3 render_pos = pos;
if (hud_selection)
{
- F32 zoom_amt = gAgent.mHUDCurZoom;
+ F32 zoom_amt = gAgentCamera.mHUDCurZoom;
F32 inv_zoom_amt = 1.f / zoom_amt;
// scale text back up to counter-act zoom level
render_pos = pos * zoom_amt;
@@ -549,7 +550,7 @@ void LLManip::renderTickValue(const LLVector3& pos, F32 value, const std::string
LLVector3 render_pos = pos;
if (hud_selection)
{
- F32 zoom_amt = gAgent.mHUDCurZoom;
+ F32 zoom_amt = gAgentCamera.mHUDCurZoom;
F32 inv_zoom_amt = 1.f / zoom_amt;
// scale text back up to counter-act zoom level
render_pos = pos * zoom_amt;
diff --git a/indra/newview/llmaniprotate.cpp b/indra/newview/llmaniprotate.cpp
index 8535d52015..6747bcb9c9 100644
--- a/indra/newview/llmaniprotate.cpp
+++ b/indra/newview/llmaniprotate.cpp
@@ -45,6 +45,7 @@
// viewer includes
#include "llagent.h"
+#include "llagentcamera.h"
#include "llbox.h"
#include "llbutton.h"
#include "llviewercontrol.h"
@@ -64,6 +65,7 @@
#include "lldrawable.h"
#include "llglheaders.h"
#include "lltrans.h"
+#include "llvoavatarself.h"
const F32 RADIUS_PIXELS = 100.f; // size in screen space
const F32 SQ_RADIUS = RADIUS_PIXELS * RADIUS_PIXELS;
@@ -138,7 +140,7 @@ void LLManipRotate::render()
glPushMatrix();
if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
{
- F32 zoom = gAgent.mHUDCurZoom;
+ F32 zoom = gAgentCamera.mHUDCurZoom;
glScalef(zoom, zoom, zoom);
}
@@ -690,7 +692,7 @@ void LLManipRotate::drag( S32 x, S32 y )
LLSelectMgr::getInstance()->updateSelectionCenter();
// RN: just clear focus so camera doesn't follow spurious object updates
- gAgent.clearFocusObject();
+ gAgentCamera.clearFocusObject();
dialog_refresh_all();
}
@@ -730,7 +732,7 @@ void LLManipRotate::renderSnapGuides()
}
else
{
- cam_at_axis = center - gAgent.getCameraPositionAgent();
+ cam_at_axis = center - gAgentCamera.getCameraPositionAgent();
cam_at_axis.normVec();
}
@@ -738,7 +740,7 @@ void LLManipRotate::renderSnapGuides()
LLVector3 test_axis = constraint_axis;
BOOL constrain_to_ref_object = FALSE;
- if (mObjectSelection->getSelectType() == SELECT_TYPE_ATTACHMENT && gAgent.getAvatarObject())
+ if (mObjectSelection->getSelectType() == SELECT_TYPE_ATTACHMENT && isAgentAvatarValid())
{
test_axis = test_axis * ~grid_rotation;
}
@@ -765,7 +767,7 @@ void LLManipRotate::renderSnapGuides()
}
LLVector3 projected_snap_axis = world_snap_axis;
- if (mObjectSelection->getSelectType() == SELECT_TYPE_ATTACHMENT && gAgent.getAvatarObject())
+ if (mObjectSelection->getSelectType() == SELECT_TYPE_ATTACHMENT && isAgentAvatarValid())
{
projected_snap_axis = projected_snap_axis * grid_rotation;
}
@@ -1097,12 +1099,12 @@ BOOL LLManipRotate::updateVisiblity()
LLVector3 center = gAgent.getPosAgentFromGlobal( mRotationCenter );
if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
{
- mCenterToCam = LLVector3(-1.f / gAgent.mHUDCurZoom, 0.f, 0.f);
+ mCenterToCam = LLVector3(-1.f / gAgentCamera.mHUDCurZoom, 0.f, 0.f);
mCenterToCamNorm = mCenterToCam;
mCenterToCamMag = mCenterToCamNorm.normVec();
mRadiusMeters = RADIUS_PIXELS / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels();
- mRadiusMeters /= gAgent.mHUDCurZoom;
+ mRadiusMeters /= gAgentCamera.mHUDCurZoom;
mCenterToProfilePlaneMag = mRadiusMeters * mRadiusMeters / mCenterToCamMag;
mCenterToProfilePlane = -mCenterToProfilePlaneMag * mCenterToCamNorm;
@@ -1110,8 +1112,8 @@ BOOL LLManipRotate::updateVisiblity()
// x axis range is (-aspect * 0.5f, +aspect * 0.5)
// y axis range is (-0.5, 0.5)
// so use getWorldViewHeightRaw as scale factor when converting to pixel coordinates
- mCenterScreen.set((S32)((0.5f - center.mV[VY]) / gAgent.mHUDCurZoom * gViewerWindow->getWorldViewHeightScaled()),
- (S32)((center.mV[VZ] + 0.5f) / gAgent.mHUDCurZoom * gViewerWindow->getWorldViewHeightScaled()));
+ mCenterScreen.set((S32)((0.5f - center.mV[VY]) / gAgentCamera.mHUDCurZoom * gViewerWindow->getWorldViewHeightScaled()),
+ (S32)((center.mV[VZ] + 0.5f) / gAgentCamera.mHUDCurZoom * gViewerWindow->getWorldViewHeightScaled()));
visible = TRUE;
}
else
@@ -1119,7 +1121,7 @@ BOOL LLManipRotate::updateVisiblity()
visible = LLViewerCamera::getInstance()->projectPosAgentToScreen(center, mCenterScreen );
if( visible )
{
- mCenterToCam = gAgent.getCameraPositionAgent() - center;
+ mCenterToCam = gAgentCamera.getCameraPositionAgent() - center;
mCenterToCamNorm = mCenterToCam;
mCenterToCamMag = mCenterToCamNorm.normVec();
LLVector3 cameraAtAxis = LLViewerCamera::getInstance()->getAtAxis();
@@ -1165,7 +1167,7 @@ BOOL LLManipRotate::updateVisiblity()
LLQuaternion LLManipRotate::dragUnconstrained( S32 x, S32 y )
{
- LLVector3 cam = gAgent.getCameraPositionAgent();
+ LLVector3 cam = gAgentCamera.getCameraPositionAgent();
LLVector3 center = gAgent.getPosAgentFromGlobal( mRotationCenter );
mMouseCur = intersectMouseWithSphere( x, y, center, mRadiusMeters);
@@ -1281,7 +1283,7 @@ LLQuaternion LLManipRotate::dragConstrained( S32 x, S32 y )
LLVector3 axis2;
LLVector3 test_axis = constraint_axis;
- if (mObjectSelection->getSelectType() == SELECT_TYPE_ATTACHMENT && gAgent.getAvatarObject())
+ if (mObjectSelection->getSelectType() == SELECT_TYPE_ATTACHMENT && isAgentAvatarValid())
{
test_axis = test_axis * ~grid_rotation;
}
@@ -1305,7 +1307,7 @@ LLQuaternion LLManipRotate::dragConstrained( S32 x, S32 y )
axis1 = LLVector3::x_axis;
}
- if (mObjectSelection->getSelectType() == SELECT_TYPE_ATTACHMENT && gAgent.getAvatarObject())
+ if (mObjectSelection->getSelectType() == SELECT_TYPE_ATTACHMENT && isAgentAvatarValid())
{
axis1 = axis1 * grid_rotation;
}
@@ -1333,7 +1335,7 @@ LLQuaternion LLManipRotate::dragConstrained( S32 x, S32 y )
}
else
{
- cam_to_snap_plane = snap_plane_center - gAgent.getCameraPositionAgent();
+ cam_to_snap_plane = snap_plane_center - gAgentCamera.getCameraPositionAgent();
cam_to_snap_plane.normVec();
}
@@ -1383,7 +1385,7 @@ LLQuaternion LLManipRotate::dragConstrained( S32 x, S32 y )
}
else
{
- cam_to_snap_plane = snap_plane_center - gAgent.getCameraPositionAgent();
+ cam_to_snap_plane = snap_plane_center - gAgentCamera.getCameraPositionAgent();
cam_to_snap_plane.normVec();
}
@@ -1430,7 +1432,7 @@ LLQuaternion LLManipRotate::dragConstrained( S32 x, S32 y )
}
else
{
- cam_at_axis = snap_plane_center - gAgent.getCameraPositionAgent();
+ cam_at_axis = snap_plane_center - gAgentCamera.getCameraPositionAgent();
cam_at_axis.normVec();
}
@@ -1627,15 +1629,15 @@ void LLManipRotate::mouseToRay( S32 x, S32 y, LLVector3* ray_pt, LLVector3* ray_
{
if (LLSelectMgr::getInstance()->getSelection()->getSelectType() == SELECT_TYPE_HUD)
{
- F32 mouse_x = (((F32)x / gViewerWindow->getWorldViewRectScaled().getWidth()) - 0.5f) / gAgent.mHUDCurZoom;
- F32 mouse_y = ((((F32)y) / gViewerWindow->getWorldViewRectScaled().getHeight()) - 0.5f) / gAgent.mHUDCurZoom;
+ F32 mouse_x = (((F32)x / gViewerWindow->getWorldViewRectScaled().getWidth()) - 0.5f) / gAgentCamera.mHUDCurZoom;
+ F32 mouse_y = ((((F32)y) / gViewerWindow->getWorldViewRectScaled().getHeight()) - 0.5f) / gAgentCamera.mHUDCurZoom;
*ray_pt = LLVector3(-1.f, -mouse_x, mouse_y);
*ray_dir = LLVector3(1.f, 0.f, 0.f);
}
else
{
- *ray_pt = gAgent.getCameraPositionAgent();
+ *ray_pt = gAgentCamera.getCameraPositionAgent();
LLViewerCamera::getInstance()->projectScreenToPosAgent(x, y, ray_dir);
*ray_dir -= *ray_pt;
ray_dir->normVec();
diff --git a/indra/newview/llmanipscale.cpp b/indra/newview/llmanipscale.cpp
index ee3ffa2450..63643a7fc6 100644
--- a/indra/newview/llmanipscale.cpp
+++ b/indra/newview/llmanipscale.cpp
@@ -45,6 +45,7 @@
// viewer includes
#include "llagent.h"
+#include "llagentcamera.h"
#include "llbbox.h"
#include "llbox.h"
#include "llviewercontrol.h"
@@ -210,7 +211,7 @@ void LLManipScale::render()
glPushMatrix();
if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
{
- F32 zoom = gAgent.mHUDCurZoom;
+ F32 zoom = gAgentCamera.mHUDCurZoom;
glScalef(zoom, zoom, zoom);
}
@@ -227,11 +228,11 @@ void LLManipScale::render()
if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
{
mBoxHandleSize = BOX_HANDLE_BASE_SIZE * BOX_HANDLE_BASE_FACTOR / (F32) LLViewerCamera::getInstance()->getViewHeightInPixels();
- mBoxHandleSize /= gAgent.mHUDCurZoom;
+ mBoxHandleSize /= gAgentCamera.mHUDCurZoom;
}
else
{
- range = dist_vec(gAgent.getCameraPositionAgent(), center_agent);
+ range = dist_vec(gAgentCamera.getCameraPositionAgent(), center_agent);
range_from_agent = dist_vec(gAgent.getPositionAgent(), center_agent);
// Don't draw manip if object too far away
@@ -438,7 +439,7 @@ void LLManipScale::highlightManipulators(S32 x, S32 y)
LLMatrix4 cfr(OGL_TO_CFR_ROTATION);
transform *= cfr;
LLMatrix4 window_scale;
- F32 zoom_level = 2.f * gAgent.mHUDCurZoom;
+ F32 zoom_level = 2.f * gAgentCamera.mHUDCurZoom;
window_scale.initAll(LLVector3(zoom_level / LLViewerCamera::getInstance()->getAspect(), zoom_level, 0.f),
LLQuaternion::DEFAULT,
LLVector3::zero);
@@ -635,7 +636,7 @@ void LLManipScale::renderFaces( const LLBBox& bbox )
}
// Find nearest vertex
- LLVector3 orientWRTHead = bbox.agentToLocalBasis( bbox.getCenterAgent() - gAgent.getCameraPositionAgent() );
+ LLVector3 orientWRTHead = bbox.agentToLocalBasis( bbox.getCenterAgent() - gAgentCamera.getCameraPositionAgent() );
U32 nearest =
(orientWRTHead.mV[0] < 0.0f ? 1 : 0) +
(orientWRTHead.mV[1] < 0.0f ? 2 : 0) +
@@ -825,7 +826,7 @@ void LLManipScale::drag( S32 x, S32 y )
}
LLSelectMgr::getInstance()->updateSelectionCenter();
- gAgent.clearFocusObject();
+ gAgentCamera.clearFocusObject();
}
// Scale around the
@@ -1364,7 +1365,7 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox)
if(mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
{
- mSnapRegimeOffset = SNAP_GUIDE_SCREEN_OFFSET / gAgent.mHUDCurZoom;
+ mSnapRegimeOffset = SNAP_GUIDE_SCREEN_OFFSET / gAgentCamera.mHUDCurZoom;
}
else
@@ -1377,7 +1378,7 @@ void LLManipScale::updateSnapGuides(const LLBBox& bbox)
if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
{
cam_at_axis.setVec(1.f, 0.f, 0.f);
- snap_guide_length = SNAP_GUIDE_SCREEN_LENGTH / gAgent.mHUDCurZoom;
+ snap_guide_length = SNAP_GUIDE_SCREEN_LENGTH / gAgentCamera.mHUDCurZoom;
}
else
{
diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp
index 52fe31fbba..5f0c5e1795 100644
--- a/indra/newview/llmaniptranslate.cpp
+++ b/indra/newview/llmaniptranslate.cpp
@@ -42,6 +42,7 @@
#include "llrender.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llbbox.h"
#include "llbox.h"
#include "llviewercontrol.h"
@@ -437,12 +438,12 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask)
{
if (x < ROTATE_H_MARGIN)
{
- gAgent.cameraOrbitAround(rotate_angle);
+ gAgentCamera.cameraOrbitAround(rotate_angle);
rotated = TRUE;
}
else if (x > world_rect.getWidth() - ROTATE_H_MARGIN)
{
- gAgent.cameraOrbitAround(-rotate_angle);
+ gAgentCamera.cameraOrbitAround(-rotate_angle);
rotated = TRUE;
}
}
@@ -713,7 +714,7 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask)
// in position changes even when the mouse moves
object->setPosition(new_position_local);
rebuild(object);
- gAgent.getAvatarObject()->clampAttachmentPositions();
+ gAgentAvatarp->clampAttachmentPositions();
new_position_local = object->getPosition();
if (selectNode->mIndividualSelection)
@@ -789,7 +790,7 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask)
}
LLSelectMgr::getInstance()->updateSelectionCenter();
- gAgent.clearFocusObject();
+ gAgentCamera.clearFocusObject();
dialog_refresh_all(); // ??? is this necessary?
lldebugst(LLERR_USER_INPUT) << "hover handled by LLManipTranslate (active)" << llendl;
@@ -830,7 +831,7 @@ void LLManipTranslate::highlightManipulators(S32 x, S32 y)
LLMatrix4 cfr(OGL_TO_CFR_ROTATION);
transform *= cfr;
LLMatrix4 window_scale;
- F32 zoom_level = 2.f * gAgent.mHUDCurZoom;
+ F32 zoom_level = 2.f * gAgentCamera.mHUDCurZoom;
window_scale.initAll(LLVector3(zoom_level / LLViewerCamera::getInstance()->getAspect(), zoom_level, 0.f),
LLQuaternion::DEFAULT,
LLVector3::zero);
@@ -1075,7 +1076,7 @@ void LLManipTranslate::render()
gGL.pushMatrix();
if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
{
- F32 zoom = gAgent.mHUDCurZoom;
+ F32 zoom = gAgentCamera.mHUDCurZoom;
glScalef(zoom, zoom, zoom);
}
{
@@ -1239,7 +1240,7 @@ void LLManipTranslate::renderSnapGuides()
if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
{
- guide_size_meters = 1.f / gAgent.mHUDCurZoom;
+ guide_size_meters = 1.f / gAgentCamera.mHUDCurZoom;
mSnapOffsetMeters = mArrowLengthMeters * 1.5f;
}
else
@@ -1822,11 +1823,11 @@ void LLManipTranslate::renderTranslationHandles()
if (mObjectSelection->getSelectType() == SELECT_TYPE_HUD)
{
mArrowLengthMeters = mAxisArrowLength / gViewerWindow->getWorldViewHeightRaw();
- mArrowLengthMeters /= gAgent.mHUDCurZoom;
+ mArrowLengthMeters /= gAgentCamera.mHUDCurZoom;
}
else
{
- LLVector3 camera_pos_agent = gAgent.getCameraPositionAgent();
+ LLVector3 camera_pos_agent = gAgentCamera.getCameraPositionAgent();
F32 range = dist_vec(camera_pos_agent, selection_center);
F32 range_from_agent = dist_vec(gAgent.getPositionAgent(), selection_center);
@@ -2108,7 +2109,7 @@ void LLManipTranslate::renderTranslationHandles()
// Copied from LLDrawable::updateGeometry
LLVector3 pos_agent = first_object->getPositionAgent();
- LLVector3 camera_agent = gAgent.getCameraPositionAgent();
+ LLVector3 camera_agent = gAgentCamera.getCameraPositionAgent();
LLVector3 headPos = pos_agent - camera_agent;
LLVector3 orientWRTHead = headPos * invRotation;
@@ -2150,7 +2151,7 @@ void LLManipTranslate::renderTranslationHandles()
}
else
{
- camera_axis.setVec(gAgent.getCameraPositionAgent() - first_object->getPositionAgent());
+ camera_axis.setVec(gAgentCamera.getCameraPositionAgent() - first_object->getPositionAgent());
}
for (U32 i = 0; i < NUM_AXES*2; i++)
diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp
index 3c34d26692..7a4ed74c4c 100644
--- a/indra/newview/llmediactrl.cpp
+++ b/indra/newview/llmediactrl.cpp
@@ -78,10 +78,8 @@ LLMediaCtrl::LLMediaCtrl( const Params& p) :
mBorder(NULL),
mFrequentUpdates( true ),
mForceUpdate( false ),
- mOpenLinksInExternalBrowser( false ),
- mOpenLinksInInternalBrowser( false ),
- mTrusted( false ),
mHomePageUrl( "" ),
+ mTrusted(false),
mIgnoreUIScale( true ),
mAlwaysRefresh( false ),
mMediaSource( 0 ),
@@ -167,22 +165,12 @@ void LLMediaCtrl::setTakeFocusOnClick( bool take_focus )
}
////////////////////////////////////////////////////////////////////////////////
-// set flag that forces the embedded browser to open links in the external system browser
-void LLMediaCtrl::setOpenInExternalBrowser( bool valIn )
-{
- mOpenLinksInExternalBrowser = valIn;
-};
-
-////////////////////////////////////////////////////////////////////////////////
-// set flag that forces the embedded browser to open links in the internal browser floater
-void LLMediaCtrl::setOpenInInternalBrowser( bool valIn )
-{
- mOpenLinksInInternalBrowser = valIn;
-};
-
-////////////////////////////////////////////////////////////////////////////////
void LLMediaCtrl::setTrusted( bool valIn )
{
+ if(mMediaSource)
+ {
+ mMediaSource->setTrustedBrowser(valIn);
+ }
mTrusted = valIn;
}
@@ -632,6 +620,7 @@ bool LLMediaCtrl::ensureMediaSourceExists()
mMediaSource->setVisible( getVisible() );
mMediaSource->addObserver( this );
mMediaSource->setBackgroundColor( getBackgroundColor() );
+ mMediaSource->setTrustedBrowser(mTrusted);
if(mClearCache)
{
mMediaSource->clearCache();
@@ -724,14 +713,14 @@ void LLMediaCtrl::draw()
LLGLSUIDefault gls_ui;
LLGLDisable gls_alphaTest( GL_ALPHA_TEST );
- gGL.pushMatrix();
+ gGL.pushUIMatrix();
{
if (mIgnoreUIScale)
{
- glLoadIdentity();
+ gGL.loadUIIdentity();
// font system stores true screen origin, need to scale this by UI scale factor
// to get render origin for this view (with unit scale)
- gGL.translatef(floorf(LLFontGL::sCurOrigin.mX * LLUI::sGLScaleFactor.mV[VX]),
+ gGL.translateUI(floorf(LLFontGL::sCurOrigin.mX * LLUI::sGLScaleFactor.mV[VX]),
floorf(LLFontGL::sCurOrigin.mY * LLUI::sGLScaleFactor.mV[VY]),
LLFontGL::sCurOrigin.mZ);
}
@@ -825,7 +814,7 @@ void LLMediaCtrl::draw()
gGL.end();
gGL.setSceneBlendType(LLRender::BT_ALPHA);
}
- gGL.popMatrix();
+ gGL.popUIMatrix();
}
else
@@ -939,14 +928,12 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
case MEDIA_EVENT_CLICK_LINK_HREF:
{
LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, target is \"" << self->getClickTarget() << "\", uri is " << self->getClickURL() << LL_ENDL;
- onClickLinkHref(self);
};
break;
case MEDIA_EVENT_CLICK_LINK_NOFOLLOW:
{
LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CLICK_LINK_NOFOLLOW, uri is " << self->getClickURL() << LL_ENDL;
- onClickLinkNoFollow(self);
};
break;
@@ -975,100 +962,6 @@ void LLMediaCtrl::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event)
////////////////////////////////////////////////////////////////////////////////
//
-void LLMediaCtrl::onClickLinkHref( LLPluginClassMedia* self )
-{
- // retrieve the event parameters
- std::string url = self->getClickURL();
- U32 target_type = self->getClickTargetType();
-
- // is there is a target specified for the link?
- if (gSavedSettings.getBOOL("UseExternalBrowser") || target_type == LLPluginClassMedia::TARGET_EXTERNAL)
- {
- LLSD payload;
- payload["url"] = url;
- payload["target_type"] = LLSD::Integer(target_type);
- LLNotificationsUtil::add( "WebLaunchExternalTarget", LLSD(), payload, onClickLinkExternalTarget);
- }
- else if (target_type == LLPluginClassMedia::TARGET_BLANK)
- {
- clickLinkWithTarget(url, target_type);
- }
- else {
- const std::string protocol1( "http://" );
- const std::string protocol2( "https://" );
- if( mOpenLinksInExternalBrowser )
- {
- if ( !url.empty() )
- {
- if ( LLStringUtil::compareInsensitive( url.substr( 0, protocol1.length() ), protocol1 ) == 0 ||
- LLStringUtil::compareInsensitive( url.substr( 0, protocol2.length() ), protocol2 ) == 0 )
- {
- LLWeb::loadURLExternal( url );
- }
- }
- }
- else
- if( mOpenLinksInInternalBrowser )
- {
- if ( !url.empty() )
- {
- if ( LLStringUtil::compareInsensitive( url.substr( 0, protocol1.length() ), protocol1 ) == 0 ||
- LLStringUtil::compareInsensitive( url.substr( 0, protocol2.length() ), protocol2 ) == 0 )
- {
- llwarns << "Dead, unimplemented path that we used to send to the built-in browser long ago." << llendl;
- }
- }
- }
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-// static
-bool LLMediaCtrl::onClickLinkExternalTarget(const LLSD& notification, const LLSD& response )
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- if ( 0 == option )
- {
- LLSD payload = notification["payload"];
- std::string url = payload["url"].asString();
- S32 target_type = payload["target_type"].asInteger();
- clickLinkWithTarget(url, target_type);
- }
- return false;
-}
-
-
-////////////////////////////////////////////////////////////////////////////////
-// static
-void LLMediaCtrl::clickLinkWithTarget(const std::string& url, const S32& target_type )
-{
- if (gSavedSettings.getBOOL("UseExternalBrowser") || target_type == LLPluginClassMedia::TARGET_EXTERNAL)
- {
- // load target in an external browser
- LLWeb::loadURLExternal(url);
- }
- else if (target_type == LLPluginClassMedia::TARGET_BLANK)
- {
- // load target in the user's preferred browser
- LLWeb::loadURL(url);
- }
- else {
- // unsupported link target - shouldn't happen
- LL_WARNS("LinkTarget") << "Unsupported link target type" << LL_ENDL;
- }
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
-void LLMediaCtrl::onClickLinkNoFollow( LLPluginClassMedia* self )
-{
- // let the dispatcher handle blocking/throttling of SLURLs
- std::string url = self->getClickURL();
- LLURLDispatcher::dispatch(url, this, mTrusted);
-}
-
-////////////////////////////////////////////////////////////////////////////////
-//
std::string LLMediaCtrl::getCurrentNavUrl()
{
return mCurrentNavUrl;
diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h
index 60e0c4073b..310492fe02 100644
--- a/indra/newview/llmediactrl.h
+++ b/indra/newview/llmediactrl.h
@@ -99,8 +99,6 @@ public:
void navigateToLocalPage( const std::string& subdir, const std::string& filename_in );
bool canNavigateBack();
bool canNavigateForward();
- void setOpenInExternalBrowser( bool valIn );
- void setOpenInInternalBrowser( bool valIn );
std::string getCurrentNavUrl();
// By default, we do not handle "secondlife:///app/" SLURLs, because
@@ -162,25 +160,17 @@ public:
// Incoming media event dispatcher
virtual void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event);
- // handlers for individual events (could be done inside the switch in handleMediaEvent, they're just individual functions for clarity)
- void onClickLinkHref( LLPluginClassMedia* self );
- void onClickLinkNoFollow( LLPluginClassMedia* self );
-
protected:
void convertInputCoords(S32& x, S32& y);
private:
void onVisibilityChange ( const LLSD& new_visibility );
- static bool onClickLinkExternalTarget( const LLSD&, const LLSD& );
- static void clickLinkWithTarget(const std::string& url, const S32& target_type );
const S32 mTextureDepthBytes;
LLUUID mMediaTextureID;
LLViewBorder* mBorder;
bool mFrequentUpdates;
bool mForceUpdate;
- bool mOpenLinksInExternalBrowser;
- bool mOpenLinksInInternalBrowser;
bool mTrusted;
std::string mHomePageUrl;
std::string mCurrentNavUrl;
diff --git a/indra/newview/llmediadataclient.h b/indra/newview/llmediadataclient.h
index 75d32e707b..8dd72cb595 100755
--- a/indra/newview/llmediadataclient.h
+++ b/indra/newview/llmediadataclient.h
@@ -37,7 +37,7 @@
#include <queue>
#include "llrefcount.h"
#include "llpointer.h"
-#include "lltimer.h"
+#include "lleventtimer.h"
// Link seam for LLVOVolume
diff --git a/indra/newview/llmenucommands.cpp b/indra/newview/llmenucommands.cpp
index 8d950f072d..e6ca0dabda 100644
--- a/indra/newview/llmenucommands.cpp
+++ b/indra/newview/llmenucommands.cpp
@@ -42,7 +42,7 @@
#include "llstring.h"
#include "message.h"
-#include "llagent.h"
+#include "llagentcamera.h"
#include "llcallingcard.h"
#include "llviewercontrol.h"
//#include "llfirstuse.h"
@@ -66,7 +66,7 @@
void handle_mouselook(void*)
{
- gAgent.changeCameraToMouselook();
+ gAgentCamera.changeCameraToMouselook();
}
diff --git a/indra/newview/llmimetypes.cpp b/indra/newview/llmimetypes.cpp
index 235487cf46..7bddc0d84c 100644
--- a/indra/newview/llmimetypes.cpp
+++ b/indra/newview/llmimetypes.cpp
@@ -34,6 +34,7 @@
#include "llviewerprecompiledheaders.h"
#include "llmimetypes.h"
+#include "lltrans.h"
#include "llxmlnode.h"
#include "lluictrlfactory.h"
@@ -49,6 +50,7 @@ std::string sDefaultImpl;
// Returned when we don't know what impl to use
std::string sXMLFilename;
// Squirrel away XML filename so we know how to reset
+std::string DEFAULT_MIME_TYPE = "none/none";
/////////////////////////////////////////////////////////////////////////////
@@ -212,7 +214,7 @@ std::string LLMIMETypes::findIcon(const std::string& mime_type)
// static
std::string LLMIMETypes::findDefaultMimeType(const std::string& widget_type)
{
- std::string mime_type = "none/none";
+ std::string mime_type = getDefaultMimeType();
mime_widget_set_map_t::iterator it = sWidgetMap.find(widget_type);
if(it != sWidgetMap.end())
{
@@ -222,6 +224,18 @@ std::string LLMIMETypes::findDefaultMimeType(const std::string& widget_type)
}
// static
+const std::string& LLMIMETypes::getDefaultMimeType()
+{
+ return DEFAULT_MIME_TYPE;
+}
+
+const std::string& LLMIMETypes::getDefaultMimeTypeTranslation()
+{
+ static std::string mime_type = LLTrans::getString("DefaultMimeType");
+ return mime_type;
+}
+
+// static
std::string LLMIMETypes::findToolTip(const std::string& mime_type)
{
std::string tool_tip = "";
diff --git a/indra/newview/llmimetypes.h b/indra/newview/llmimetypes.h
index b217ce7a81..3461769ff3 100644
--- a/indra/newview/llmimetypes.h
+++ b/indra/newview/llmimetypes.h
@@ -66,6 +66,10 @@ public:
static std::string findDefaultMimeType(const std::string& widget_type);
// Canonical mime type associated with this widget set
+ static const std::string& getDefaultMimeType();
+
+ static const std::string& getDefaultMimeTypeTranslation();
+
static bool findAllowResize(const std::string& mime_type);
// accessor for flag to enable/disable media size edit fields
diff --git a/indra/newview/llmorphview.cpp b/indra/newview/llmorphview.cpp
index b95e8bd3a2..4c28e98e62 100644
--- a/indra/newview/llmorphview.cpp
+++ b/indra/newview/llmorphview.cpp
@@ -37,11 +37,11 @@
#include "lljoint.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "lldrawable.h"
#include "lldrawpoolavatar.h"
#include "llface.h"
//#include "llfirstuse.h"
-#include "llfloatercustomize.h"
#include "llfloatertools.h"
#include "llresmgr.h"
#include "lltoolmgr.h"
@@ -88,15 +88,14 @@ void LLMorphView::initialize()
mCameraYaw = 0.f;
mCameraDist = -1.f;
- LLVOAvatar *avatarp = gAgent.getAvatarObject();
- if (!avatarp || avatarp->isDead())
+ if (!isAgentAvatarValid() || gAgentAvatarp->isDead())
{
- gAgent.changeCameraToDefault();
+ gAgentCamera.changeCameraToDefault();
return;
}
- avatarp->stopMotion( ANIM_AGENT_BODY_NOISE );
- avatarp->mSpecialRenderMode = 3;
+ gAgentAvatarp->stopMotion( ANIM_AGENT_BODY_NOISE );
+ gAgentAvatarp->mSpecialRenderMode = 3;
// set up camera for close look at avatar
mOldCameraNearClip = LLViewerCamera::getInstance()->getNear();
@@ -110,11 +109,10 @@ void LLMorphView::shutdown()
{
LLVOAvatarSelf::onCustomizeEnd();
- LLVOAvatar *avatarp = gAgent.getAvatarObject();
- if(avatarp && !avatarp->isDead())
+ if (isAgentAvatarValid())
{
- avatarp->startMotion( ANIM_AGENT_BODY_NOISE );
- avatarp->mSpecialRenderMode = 0;
+ gAgentAvatarp->startMotion( ANIM_AGENT_BODY_NOISE );
+ gAgentAvatarp->mSpecialRenderMode = 0;
// reset camera
LLViewerCamera::getInstance()->setNear(mOldCameraNearClip);
}
@@ -132,14 +130,7 @@ void LLMorphView::setVisible(BOOL visible)
if (visible)
{
- llassert( !gFloaterCustomize );
- gFloaterCustomize = new LLFloaterCustomize();
- gFloaterCustomize->fetchInventory();
- gFloaterCustomize->openFloater();
-
- // Must do this _after_ gFloaterView is initialized.
- gFloaterCustomize->switchToDefaultSubpart();
-
+ // TODO: verify some user action has already opened outfit editor? - Nyx
initialize();
// First run dialog
@@ -147,13 +138,7 @@ void LLMorphView::setVisible(BOOL visible)
}
else
{
- if( gFloaterCustomize )
- {
- gFloaterView->removeChild( gFloaterCustomize );
- delete gFloaterCustomize;
- gFloaterCustomize = NULL;
- }
-
+ // TODO: verify some user action has already closed outfit editor ? - Nyx
shutdown();
}
}
@@ -163,15 +148,11 @@ void LLMorphView::updateCamera()
{
if (!mCameraTargetJoint)
{
- setCameraTargetJoint(gAgent.getAvatarObject()->getJoint("mHead"));
- }
-
- LLVOAvatar* avatar = gAgent.getAvatarObject();
- if( !avatar )
- {
- return;
- }
- LLJoint* root_joint = avatar->getRootJoint();
+ setCameraTargetJoint(gAgentAvatarp->getJoint("mHead"));
+ }
+ if (!isAgentAvatarValid()) return;
+
+ LLJoint* root_joint = gAgentAvatarp->getRootJoint();
if( !root_joint )
{
return;
@@ -187,7 +168,7 @@ void LLMorphView::updateCamera()
LLVector3d camera_pos = joint_pos + mCameraOffset * camera_rot_pitch * camera_rot_yaw * avatar_rot;
- gAgent.setCameraPosAndFocusGlobal( camera_pos, target_pos, gAgent.getID() );
+ gAgentCamera.setCameraPosAndFocusGlobal( camera_pos, target_pos, gAgent.getID() );
}
void LLMorphView::setCameraDrivenByKeys(BOOL b)
diff --git a/indra/newview/llmoveview.cpp b/indra/newview/llmoveview.cpp
index 4bf2bac649..afca9daa67 100644
--- a/indra/newview/llmoveview.cpp
+++ b/indra/newview/llmoveview.cpp
@@ -41,7 +41,8 @@
// Viewer includes
#include "llagent.h"
-#include "llvoavatarself.h" // to check gAgent.getAvatarObject()->isSitting()
+#include "llagentcamera.h"
+#include "llvoavatarself.h" // to check gAgentAvatarp->isSitting()
#include "llbottomtray.h"
#include "llbutton.h"
#include "llfloaterreg.h"
@@ -77,7 +78,6 @@ LLFloaterMove::LLFloaterMove(const LLSD& key)
mTurnRightButton(NULL),
mMoveUpButton(NULL),
mMoveDownButton(NULL),
- mStopFlyingButton(NULL),
mModeActionsPanel(NULL),
mCurrentMode(MM_WALK)
{
@@ -87,15 +87,24 @@ LLFloaterMove::LLFloaterMove(const LLSD& key)
BOOL LLFloaterMove::postBuild()
{
setIsChrome(TRUE);
+ setTitleVisible(TRUE); // restore title visibility after chrome applying
LLDockableFloater::postBuild();
+ // Code that implements floater buttons toggling when user moves via keyboard is located in LLAgent::propagate()
+
mForwardButton = getChild<LLJoystickAgentTurn>("forward btn");
mForwardButton->setHeldDownDelay(MOVE_BUTTON_DELAY);
mBackwardButton = getChild<LLJoystickAgentTurn>("backward btn");
mBackwardButton->setHeldDownDelay(MOVE_BUTTON_DELAY);
+ mSlideLeftButton = getChild<LLJoystickAgentSlide>("move left btn");
+ mSlideLeftButton->setHeldDownDelay(MOVE_BUTTON_DELAY);
+
+ mSlideRightButton = getChild<LLJoystickAgentSlide>("move right btn");
+ mSlideRightButton->setHeldDownDelay(MOVE_BUTTON_DELAY);
+
mTurnLeftButton = getChild<LLButton>("turn left btn");
mTurnLeftButton->setHeldDownDelay(MOVE_BUTTON_DELAY);
mTurnLeftButton->setHeldDownCallback(boost::bind(&LLFloaterMove::turnLeft, this));
@@ -112,8 +121,6 @@ BOOL LLFloaterMove::postBuild()
mMoveDownButton->setHeldDownCallback(boost::bind(&LLFloaterMove::moveDown, this));
- mStopFlyingButton = getChild<LLButton>("stop_fly_btn");
-
mModeActionsPanel = getChild<LLPanel>("panel_modes");
LLButton* btn;
@@ -126,13 +133,6 @@ BOOL LLFloaterMove::postBuild()
btn = getChild<LLButton>("mode_fly_btn");
btn->setCommitCallback(boost::bind(&LLFloaterMove::onFlyButtonClick, this));
- btn = getChild<LLButton>("stop_fly_btn");
- btn->setCommitCallback(boost::bind(&LLFloaterMove::onStopFlyingButtonClick, this));
-
-
-
- showFlyControls(false);
-
initModeTooltips();
initModeButtonMap();
@@ -206,7 +206,12 @@ void LLFloaterMove::setFlyingMode(BOOL fly)
if (instance)
{
instance->setFlyingModeImpl(fly);
- instance->showModeButtons(!fly);
+ LLVOAvatarSelf* avatar_object = gAgentAvatarp;
+ bool is_sitting = avatar_object
+ && (avatar_object->getRegion() != NULL)
+ && (!avatar_object->isDead())
+ && avatar_object->isSitting();
+ instance->showModeButtons(!fly && !is_sitting);
}
if (fly)
{
@@ -250,6 +255,12 @@ void LLFloaterMove::setSittingMode(BOOL bSitting)
else
{
LLPanelStandStopFlying::clearStandStopFlyingMode(LLPanelStandStopFlying::SSFM_STAND);
+
+ // show "Stop Flying" button if needed. EXT-871
+ if (gAgent.getFlying())
+ {
+ LLPanelStandStopFlying::setStandStopFlyingMode(LLPanelStandStopFlying::SSFM_STOP_FLYING);
+ }
}
enableInstance(!bSitting);
}
@@ -298,10 +309,6 @@ void LLFloaterMove::onFlyButtonClick()
{
setMovementMode(MM_FLY);
}
-void LLFloaterMove::onStopFlyingButtonClick()
-{
- setMovementMode(gAgent.getAlwaysRun() ? MM_RUN : MM_WALK);
-}
void LLFloaterMove::setMovementMode(const EMovementMode mode)
{
@@ -336,7 +343,7 @@ void LLFloaterMove::setMovementMode(const EMovementMode mode)
updateButtonsWithMovementMode(mode);
bool bHideModeButtons = MM_FLY == mode
- || (gAgent.getAvatarObject() && gAgent.getAvatarObject()->isSitting());
+ || (isAgentAvatarValid() && gAgentAvatarp->isSitting());
showModeButtons(!bHideModeButtons);
@@ -344,19 +351,9 @@ void LLFloaterMove::setMovementMode(const EMovementMode mode)
void LLFloaterMove::updateButtonsWithMovementMode(const EMovementMode newMode)
{
- showFlyControls(MM_FLY == newMode);
setModeTooltip(newMode);
setModeButtonToggleState(newMode);
-}
-
-void LLFloaterMove::showFlyControls(bool bShow)
-{
- mMoveUpButton->setVisible(bShow);
- mMoveDownButton->setVisible(bShow);
-
- // *TODO: mantipov: mStopFlyingButton from the FloaterMove is not used now.
- // It was not completly removed until functionality is reviewed by LL
- mStopFlyingButton->setVisible(FALSE);
+ setModeTitle(newMode);
}
void LLFloaterMove::initModeTooltips()
@@ -364,16 +361,28 @@ void LLFloaterMove::initModeTooltips()
control_tooltip_map_t walkTipMap;
walkTipMap.insert(std::make_pair(mForwardButton, getString("walk_forward_tooltip")));
walkTipMap.insert(std::make_pair(mBackwardButton, getString("walk_back_tooltip")));
+ walkTipMap.insert(std::make_pair(mSlideLeftButton, getString("walk_left_tooltip")));
+ walkTipMap.insert(std::make_pair(mSlideRightButton, getString("walk_right_tooltip")));
+ walkTipMap.insert(std::make_pair(mMoveUpButton, getString("jump_tooltip")));
+ walkTipMap.insert(std::make_pair(mMoveDownButton, getString("crouch_tooltip")));
mModeControlTooltipsMap[MM_WALK] = walkTipMap;
control_tooltip_map_t runTipMap;
runTipMap.insert(std::make_pair(mForwardButton, getString("run_forward_tooltip")));
runTipMap.insert(std::make_pair(mBackwardButton, getString("run_back_tooltip")));
+ runTipMap.insert(std::make_pair(mSlideLeftButton, getString("run_left_tooltip")));
+ runTipMap.insert(std::make_pair(mSlideRightButton, getString("run_right_tooltip")));
+ runTipMap.insert(std::make_pair(mMoveUpButton, getString("jump_tooltip")));
+ runTipMap.insert(std::make_pair(mMoveDownButton, getString("crouch_tooltip")));
mModeControlTooltipsMap[MM_RUN] = runTipMap;
control_tooltip_map_t flyTipMap;
flyTipMap.insert(std::make_pair(mForwardButton, getString("fly_forward_tooltip")));
flyTipMap.insert(std::make_pair(mBackwardButton, getString("fly_back_tooltip")));
+ flyTipMap.insert(std::make_pair(mSlideLeftButton, getString("fly_left_tooltip")));
+ flyTipMap.insert(std::make_pair(mSlideRightButton, getString("fly_right_tooltip")));
+ flyTipMap.insert(std::make_pair(mMoveUpButton, getString("fly_up_tooltip")));
+ flyTipMap.insert(std::make_pair(mMoveDownButton, getString("fly_down_tooltip")));
mModeControlTooltipsMap[MM_FLY] = flyTipMap;
setModeTooltip(MM_WALK);
@@ -395,9 +404,9 @@ void LLFloaterMove::initMovementMode()
}
setMovementMode(initMovementMode);
- if (gAgent.getAvatarObject())
+ if (isAgentAvatarValid())
{
- setEnabled(!gAgent.getAvatarObject()->isSitting());
+ setEnabled(!gAgentAvatarp->isSitting());
}
}
@@ -414,11 +423,30 @@ void LLFloaterMove::setModeTooltip(const EMovementMode mode)
}
}
+void LLFloaterMove::setModeTitle(const EMovementMode mode)
+{
+ std::string title;
+ switch(mode)
+ {
+ case MM_WALK:
+ title = getString("walk_title");
+ break;
+ case MM_RUN:
+ title = getString("run_title");
+ break;
+ case MM_FLY:
+ title = getString("fly_title");
+ break;
+ default:
+ // title should be provided for all modes
+ llassert(false);
+ break;
+ }
+ setTitle(title);
+}
+
/**
* Updates position of the floater to be center aligned with Move button.
- *
- * Because Tip floater created as dependent floater this method
- * must be called before "showQuickTips()" to get Tip floater be positioned at the right side of the floater
*/
void LLFloaterMove::updatePosition()
{
@@ -479,7 +507,7 @@ void LLFloaterMove::onOpen(const LLSD& key)
showModeButtons(FALSE);
}
- if (gAgent.getAvatarObject() && gAgent.getAvatarObject()->isSitting())
+ if (isAgentAvatarValid() && gAgentAvatarp->isSitting())
{
setSittingMode(TRUE);
showModeButtons(FALSE);
@@ -582,7 +610,7 @@ BOOL LLPanelStandStopFlying::postBuild()
void LLPanelStandStopFlying::setVisible(BOOL visible)
{
//we dont need to show the panel if these buttons are not activated
- if (gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK) visible = false;
+ if (gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK) visible = false;
if (visible)
{
@@ -684,10 +712,7 @@ void LLPanelStandStopFlying::onStandButtonClick()
gAgent.setControlFlags(AGENT_CONTROL_STAND_UP);
setFocus(FALSE); // EXT-482
-
- BOOL fly = gAgent.getFlying();
- mStopFlyingButton->setVisible(fly);
- setVisible(fly);
+ mStandButton->setVisible(FALSE); // force visibility changing to avoid seeing Stand & Move buttons at once.
}
void LLPanelStandStopFlying::onStopFlyingButtonClick()
diff --git a/indra/newview/llmoveview.h b/indra/newview/llmoveview.h
index 06463f02af..fcf643f050 100644
--- a/indra/newview/llmoveview.h
+++ b/indra/newview/llmoveview.h
@@ -86,13 +86,11 @@ private:
void onWalkButtonClick();
void onRunButtonClick();
void onFlyButtonClick();
- void onStopFlyingButtonClick();
void initMovementMode();
void setMovementMode(const EMovementMode mode);
- void showFlyControls(bool bShow);
void initModeTooltips();
void setModeTooltip(const EMovementMode mode);
- void showQuickTips(const EMovementMode mode);
+ void setModeTitle(const EMovementMode mode);
void initModeButtonMap();
void setModeButtonToggleState(const EMovementMode mode);
void updateButtonsWithMovementMode(const EMovementMode newMode);
@@ -103,12 +101,13 @@ public:
LLJoystickAgentTurn* mForwardButton;
LLJoystickAgentTurn* mBackwardButton;
+ LLJoystickAgentSlide* mSlideLeftButton;
+ LLJoystickAgentSlide* mSlideRightButton;
LLButton* mTurnLeftButton;
LLButton* mTurnRightButton;
LLButton* mMoveUpButton;
LLButton* mMoveDownButton;
private:
- LLButton* mStopFlyingButton;
LLPanel* mModeActionsPanel;
typedef std::map<LLView*, std::string> control_tooltip_map_t;
diff --git a/indra/newview/llmutelist.cpp b/indra/newview/llmutelist.cpp
index 2d3c4b187e..7cb192e026 100644
--- a/indra/newview/llmutelist.cpp
+++ b/indra/newview/llmutelist.cpp
@@ -128,68 +128,29 @@ LLMute::LLMute(const LLUUID& id, const std::string& name, EType type, U32 flags)
}
-std::string LLMute::getDisplayName() const
+std::string LLMute::getDisplayType() const
{
- std::string name_with_suffix = mName;
switch (mType)
{
case BY_NAME:
default:
- name_with_suffix += " " + LLTrans::getString("MuteByName");
+ return LLTrans::getString("MuteByName");
break;
case AGENT:
- name_with_suffix += " " + LLTrans::getString("MuteAgent");
+ return LLTrans::getString("MuteAgent");
break;
case OBJECT:
- name_with_suffix += " " + LLTrans::getString("MuteObject");
+ return LLTrans::getString("MuteObject");
break;
case GROUP:
- name_with_suffix += " " + LLTrans::getString("MuteGroup");
+ return LLTrans::getString("MuteGroup");
+ break;
+ case EXTERNAL:
+ return LLTrans::getString("MuteExternal");
break;
}
- return name_with_suffix;
}
-void LLMute::setFromDisplayName(const std::string& display_name)
-{
- size_t pos = 0;
- mName = display_name;
-
- pos = mName.rfind(" " + LLTrans::getString("MuteGroup"));
- if (pos != std::string::npos)
- {
- mName.erase(pos);
- mType = GROUP;
- return;
- }
-
- pos = mName.rfind(" " + LLTrans::getString("MuteObject"));
- if (pos != std::string::npos)
- {
- mName.erase(pos);
- mType = OBJECT;
- return;
- }
-
- pos = mName.rfind(" " + LLTrans::getString("MuteAgent"));
- if (pos != std::string::npos)
- {
- mName.erase(pos);
- mType = AGENT;
- return;
- }
-
- pos = mName.rfind(" " + LLTrans::getString("MuteByName"));
- if (pos != std::string::npos)
- {
- mName.erase(pos);
- mType = BY_NAME;
- return;
- }
-
- llwarns << "Unable to set mute from display name " << display_name << llendl;
- return;
-}
/* static */
LLMuteList* LLMuteList::getInstance()
@@ -345,6 +306,12 @@ BOOL LLMuteList::add(const LLMute& mute, U32 flags)
void LLMuteList::updateAdd(const LLMute& mute)
{
+ // External mutes (e.g. Avaline callers) are local only, don't send them to the server.
+ if (mute.mType == LLMute::EXTERNAL)
+ {
+ return;
+ }
+
// Update the database
LLMessageSystem* msg = gMessageSystem;
msg->newMessageFast(_PREHASH_UpdateMuteListEntry);
@@ -432,6 +399,12 @@ BOOL LLMuteList::remove(const LLMute& mute, U32 flags)
void LLMuteList::updateRemove(const LLMute& mute)
{
+ // External mutes are not sent to the server anyway, no need to remove them.
+ if (mute.mType == LLMute::EXTERNAL)
+ {
+ return;
+ }
+
LLMessageSystem* msg = gMessageSystem;
msg->newMessageFast(_PREHASH_RemoveMuteListEntry);
msg->nextBlockFast(_PREHASH_AgentData);
@@ -615,9 +588,14 @@ BOOL LLMuteList::saveToFile(const std::string& filename)
it != mMutes.end();
++it)
{
- it->mID.toString(id_string);
- const std::string& name = it->mName;
- fprintf(fp, "%d %s %s|%u\n", (S32)it->mType, id_string.c_str(), name.c_str(), it->mFlags);
+ // Don't save external mutes as they are not sent to the server and probably won't
+ //be valid next time anyway.
+ if (it->mType != LLMute::EXTERNAL)
+ {
+ it->mID.toString(id_string);
+ const std::string& name = it->mName;
+ fprintf(fp, "%d %s %s|%u\n", (S32)it->mType, id_string.c_str(), name.c_str(), it->mFlags);
+ }
}
fclose(fp);
return TRUE;
diff --git a/indra/newview/llmutelist.h b/indra/newview/llmutelist.h
index e1e81a24b4..79b556bdbb 100644
--- a/indra/newview/llmutelist.h
+++ b/indra/newview/llmutelist.h
@@ -45,7 +45,8 @@ class LLMute
{
public:
// Legacy mutes are BY_NAME and have null UUID.
- enum EType { BY_NAME = 0, AGENT = 1, OBJECT = 2, GROUP = 3, COUNT = 4 };
+ // EXTERNAL mutes are only processed through an external system (e.g. Voice) and not stored.
+ enum EType { BY_NAME = 0, AGENT = 1, OBJECT = 2, GROUP = 3, EXTERNAL = 4, COUNT = 5 };
// Bits in the mute flags. For backwards compatibility (since any mute list entries that were created before the flags existed
// will have a flags field of 0), some of the flags are "inverted".
@@ -63,14 +64,8 @@ public:
LLMute(const LLUUID& id, const std::string& name = std::string(), EType type = BY_NAME, U32 flags = 0);
- // Returns name + suffix based on type
- // For example: "James Tester (resident)"
- std::string getDisplayName() const;
-
- // Converts a UI name into just the agent or object name
- // For example: "James Tester (resident)" sets the name to "James Tester"
- // and the type to AGENT.
- void setFromDisplayName(const std::string& display_name);
+ // Returns localized type name of muted item
+ std::string getDisplayType() const;
public:
LLUUID mID; // agent or object id
diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp
index d579058c32..d09f729943 100644
--- a/indra/newview/llnamelistctrl.cpp
+++ b/indra/newview/llnamelistctrl.cpp
@@ -47,6 +47,8 @@
static LLDefaultChildRegistry::Register<LLNameListCtrl> r("name_list");
+static const S32 info_icon_size = 16;
+
void LLNameListCtrl::NameTypeNames::declareValues()
{
declare("INDIVIDUAL", LLNameListCtrl::INDIVIDUAL);
@@ -70,7 +72,7 @@ LLNameListCtrl::LLNameListCtrl(const LLNameListCtrl::Params& p)
// public
void LLNameListCtrl::addNameItem(const LLUUID& agent_id, EAddPosition pos,
- BOOL enabled, std::string& suffix)
+ BOOL enabled, const std::string& suffix)
{
//llinfos << "LLNameListCtrl::addNameItem " << agent_id << llendl;
@@ -79,7 +81,7 @@ void LLNameListCtrl::addNameItem(const LLUUID& agent_id, EAddPosition pos,
item.enabled = enabled;
item.target = INDIVIDUAL;
- addNameItemRow(item, pos);
+ addNameItemRow(item, pos, suffix);
}
// virtual, public
@@ -138,6 +140,44 @@ void LLNameListCtrl::showInspector(const LLUUID& avatar_id, bool is_group)
LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", avatar_id));
}
+void LLNameListCtrl::mouseOverHighlightNthItem( S32 target_index )
+{
+ S32 cur_index = getHighlightedItemInx();
+ if (cur_index != target_index)
+ {
+ if(0 <= cur_index && cur_index < (S32)getItemList().size())
+ {
+ LLScrollListItem* item = getItemList()[cur_index];
+ if (item)
+ {
+ LLScrollListText* cell = dynamic_cast<LLScrollListText*>(item->getColumn(mNameColumnIndex));
+ if (cell)
+ cell->setTextWidth(cell->getTextWidth() + info_icon_size);
+ }
+ else
+ {
+ llwarns << "highlighted name list item is NULL" << llendl;
+ }
+ }
+ if(target_index != -1)
+ {
+ LLScrollListItem* item = getItemList()[target_index];
+ LLScrollListText* cell = dynamic_cast<LLScrollListText*>(item->getColumn(mNameColumnIndex));
+ if (item)
+ {
+ if (cell)
+ cell->setTextWidth(cell->getTextWidth() - info_icon_size);
+ }
+ else
+ {
+ llwarns << "target name item is NULL" << llendl;
+ }
+ }
+ }
+
+ LLScrollListCtrl::mouseOverHighlightNthItem(target_index);
+}
+
//virtual
BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask)
{
@@ -164,7 +204,7 @@ BOOL LLNameListCtrl::handleToolTip(S32 x, S32 y, MASK mask)
// Spawn at right side of cell
LLPointer<LLUIImage> icon = LLUI::getUIImage("Info_Small");
- LLCoordGL pos( sticky_rect.mRight - 16, sticky_rect.mTop - (sticky_rect.getHeight() - icon->getHeight())/2 );
+ LLCoordGL pos( sticky_rect.mRight - info_icon_size, sticky_rect.mTop - (sticky_rect.getHeight() - icon->getHeight())/2 );
// Should we show a group or an avatar inspector?
bool is_group = hit_item->getValue()["is_group"].asBoolean();
@@ -228,7 +268,7 @@ LLScrollListItem* LLNameListCtrl::addElement(const LLSD& element, EAddPosition p
LLScrollListItem* LLNameListCtrl::addNameItemRow(
const LLNameListCtrl::NameItem& name_item,
EAddPosition pos,
- std::string& suffix)
+ const std::string& suffix)
{
LLUUID id = name_item.value().asUUID();
LLNameListItem* item = NULL;
@@ -339,8 +379,7 @@ void LLNameListCtrl::refresh(const LLUUID& id, const std::string& first,
LLScrollListItem* item = *iter;
if (item->getUUID() == id)
{
- LLScrollListCell* cell = (LLScrollListCell*)item->getColumn(0);
- cell = item->getColumn(mNameColumnIndex);
+ LLScrollListCell* cell = item->getColumn(mNameColumnIndex);
if (cell)
{
cell->setValue(fullname);
@@ -356,8 +395,9 @@ void LLNameListCtrl::refresh(const LLUUID& id, const std::string& first,
void LLNameListCtrl::refreshAll(const LLUUID& id, const std::string& first,
const std::string& last, BOOL is_group)
{
+ LLInstanceTrackerScopedGuard guard;
LLInstanceTracker<LLNameListCtrl>::instance_iter it;
- for (it = beginInstances(); it != endInstances(); ++it)
+ for (it = guard.beginInstances(); it != guard.endInstances(); ++it)
{
LLNameListCtrl& ctrl = *it;
ctrl.refresh(id, first, last, is_group);
diff --git a/indra/newview/llnamelistctrl.h b/indra/newview/llnamelistctrl.h
index 23b1cb6897..ee71db7540 100644
--- a/indra/newview/llnamelistctrl.h
+++ b/indra/newview/llnamelistctrl.h
@@ -90,11 +90,11 @@ public:
// Add a user to the list by name. It will be added, the name
// requested from the cache, and updated as necessary.
void addNameItem(const LLUUID& agent_id, EAddPosition pos = ADD_BOTTOM,
- BOOL enabled = TRUE, std::string& suffix = LLStringUtil::null);
+ BOOL enabled = TRUE, const std::string& suffix = LLStringUtil::null);
void addNameItem(NameItem& item, EAddPosition pos = ADD_BOTTOM);
/*virtual*/ LLScrollListItem* addElement(const LLSD& element, EAddPosition pos = ADD_BOTTOM, void* userdata = NULL);
- LLScrollListItem* addNameItemRow(const NameItem& value, EAddPosition pos = ADD_BOTTOM, std::string& suffix = LLStringUtil::null);
+ LLScrollListItem* addNameItemRow(const NameItem& value, EAddPosition pos = ADD_BOTTOM, const std::string& suffix = LLStringUtil::null);
// Add a user to the list by name. It will be added, the name
// requested from the cache, and updated as necessary.
@@ -120,6 +120,8 @@ public:
void setAllowCallingCardDrop(BOOL b) { mAllowCallingCardDrop = b; }
/*virtual*/ void updateColumns();
+
+ /*virtual*/ void mouseOverHighlightNthItem( S32 index );
private:
void showInspector(const LLUUID& avatar_id, bool is_group);
diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index 46cab0d868..fce666c9d4 100644
--- a/indra/newview/llnavigationbar.cpp
+++ b/indra/newview/llnavigationbar.cpp
@@ -48,11 +48,11 @@
#include "lllandmarkactions.h"
#include "lllocationhistory.h"
#include "lllocationinputctrl.h"
+#include "llpaneltopinfobar.h"
#include "llteleporthistory.h"
#include "llsearchcombobox.h"
#include "llsidetray.h"
#include "llslurl.h"
-#include "llurlsimstring.h"
#include "llurlregistry.h"
#include "llurldispatcher.h"
#include "llviewerinventory.h"
@@ -375,7 +375,6 @@ void LLNavigationBar::draw()
if(mPurgeTPHistoryItems)
{
LLTeleportHistory::getInstance()->purgeItems();
- onTeleportHistoryChanged();
mPurgeTPHistoryItems = false;
}
@@ -449,8 +448,20 @@ void LLNavigationBar::onLocationSelection()
// Will not teleport to empty location.
if (typed_location.empty())
return;
-
+ //get selected item from combobox item
LLSD value = mCmbLocation->getSelectedValue();
+ if(value.isUndefined() && !mCmbLocation->getTextEntry()->isDirty())
+ {
+ // At this point we know that: there is no selected item in list and text field has NOT been changed
+ // So there is no sense to try to change the location
+ return;
+ }
+ /* since navbar list support autocompletion it contains several types of item: landmark, teleport hystory item,
+ * typed by user slurl or region name. Let's find out which type of item the user has selected
+ * to make decision about adding this location into typed history. see mSaveToLocationHistory
+ * Note:
+ * Only TYPED_REGION_SLURL item will be added into LLLocationHistory
+ */
if(value.has("item_type"))
{
@@ -480,7 +491,7 @@ void LLNavigationBar::onLocationSelection()
case TELEPORT_HISTORY:
//in case of teleport item was selected, teleport by position too.
- case TYPED_REGION_SURL:
+ case TYPED_REGION_SLURL:
if(value.has("global_pos"))
{
gAgent.teleportViaLocation(LLVector3d(value["global_pos"]));
@@ -492,23 +503,38 @@ void LLNavigationBar::onLocationSelection()
break;
}
}
- //Let's parse surl or region name
+ //Let's parse slurl or region name
std::string region_name;
LLVector3 local_coords(128, 128, 0);
- S32 x = 0, y = 0, z = 0;
// Is the typed location a SLURL?
- if (LLSLURL::isSLURL(typed_location))
+ LLSLURL slurl = LLSLURL(typed_location);
+ if (slurl.getType() == LLSLURL::LOCATION)
{
- // Yes. Extract region name and local coordinates from it.
- if (LLURLSimString::parse(LLSLURL::stripProtocol(typed_location), &region_name, &x, &y, &z))
- local_coords.set(x, y, z);
- else
- return;
- }else
+ region_name = slurl.getRegion();
+ local_coords = slurl.getPosition();
+ }
+ else if(!slurl.isValid())
{
- // assume that an user has typed the {region name} or possible {region_name, parcel}
- region_name = typed_location.substr(0,typed_location.find(','));
+ // we have to do this check after previous, because LLUrlRegistry contains handlers for slurl too
+ // but we need to know whether typed_location is a simple http url.
+ if (LLUrlRegistry::instance().isUrl(typed_location))
+ {
+ // display http:// URLs in the media browser, or
+ // anything else is sent to the search floater
+ LLWeb::loadURL(typed_location);
+ return;
+ }
+ else
+ {
+ // assume that an user has typed the {region name} or possible {region_name, parcel}
+ region_name = typed_location.substr(0,typed_location.find(','));
+ }
+ }
+ else
+ {
+ // was an app slurl, home, whatever. Bail
+ return;
}
// Resolve the region name to its global coordinates.
@@ -531,7 +557,7 @@ void LLNavigationBar::onTeleportFinished(const LLVector3d& global_agent_pos)
return;
LLLocationHistory* lh = LLLocationHistory::getInstance();
- //TODO*: do we need convert surl into readable format?
+ //TODO*: do we need convert slurl into readable format?
std::string location;
/*NOTE:
* We can't use gAgent.getPositionAgent() in case of local teleport to build location.
@@ -540,10 +566,10 @@ void LLNavigationBar::onTeleportFinished(const LLVector3d& global_agent_pos)
*/
LLAgentUI::buildLocationString(location, LLAgentUI::LOCATION_FORMAT_NO_MATURITY,
gAgent.getPosAgentFromGlobal(global_agent_pos));
- std::string tooltip (LLSLURL::buildSLURLfromPosGlobal(gAgent.getRegion()->getName(), global_agent_pos, false));
+ std::string tooltip (LLSLURL(gAgent.getRegion()->getName(), global_agent_pos).getSLURLString());
LLLocationHistoryItem item (location,
- global_agent_pos, tooltip,TYPED_REGION_SURL);// we can add into history only TYPED location
+ global_agent_pos, tooltip,TYPED_REGION_SLURL);// we can add into history only TYPED location
//Touch it, if it is at list already, add new location otherwise
if ( !lh->touchItem(item) ) {
lh->addItem(item);
@@ -621,20 +647,7 @@ void LLNavigationBar::onRegionNameResponse(
// Invalid location?
if (!region_handle)
{
- // handle any secondlife:// SLapps, or
- // display http:// URLs in the media browser, or
- // anything else is sent to the search floater
- if (LLUrlRegistry::instance().isUrl(typed_location))
- {
- if (! LLURLDispatcher::dispatchFromTextEditor(typed_location))
- {
- LLWeb::loadURL(typed_location);
- }
- }
- else
- {
- invokeSearch(typed_location);
- }
+ invokeSearch(typed_location);
return;
}
@@ -642,7 +655,7 @@ void LLNavigationBar::onRegionNameResponse(
LLVector3d region_pos = from_region_handle(region_handle);
LLVector3d global_pos = region_pos + (LLVector3d) local_coords;
- llinfos << "Teleporting to: " << LLSLURL::buildSLURLfromPosGlobal(region_name, global_pos, false) << llendl;
+ llinfos << "Teleporting to: " << LLSLURL(region_name, global_pos).getSLURLString() << llendl;
gAgent.teleportViaLocation(global_pos);
}
@@ -701,6 +714,8 @@ void LLNavigationBar::onNavigationButtonHeldUp(LLButton* nav_button)
void LLNavigationBar::handleLoginComplete()
{
+ LLTeleportHistory::getInstance()->handleLoginComplete();
+ LLPanelTopInfoBar::instance().handleLoginComplete();
mCmbLocation->handleLoginComplete();
}
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index 8fc11d3929..1beaaf3cb4 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -49,7 +49,6 @@
#include "llchannelmanager.h"
#include "llagent.h" // gAgent
-#include "llfloaterscriptdebug.h"
#include "llchathistory.h"
#include "llstylemap.h"
@@ -107,7 +106,9 @@ BOOL LLNearbyChat::postBuild()
getDockTongue(), LLDockControl::TOP, boost::bind(&LLNearbyChat::getAllowedRect, this, _1)));
}
- setIsChrome(true);
+ //fix for EXT-4621
+ //chrome="true" prevents floater from stilling capture
+ setIsChrome(true);
//chrome="true" hides floater caption
if (mDragHandle)
mDragHandle->setTitleVisible(TRUE);
@@ -161,25 +162,6 @@ std::string appendTime()
void LLNearbyChat::addMessage(const LLChat& chat,bool archive,const LLSD &args)
{
- if (chat.mChatType == CHAT_TYPE_DEBUG_MSG)
- {
- if(gSavedSettings.getBOOL("ShowScriptErrors") == FALSE)
- return;
- if (gSavedSettings.getS32("ShowScriptErrorsLocation")== 1)// show error in window //("ScriptErrorsAsChat"))
- {
-
- LLColor4 txt_color;
-
- LLViewerChat::getChatColor(chat,txt_color);
-
- LLFloaterScriptDebug::addScriptLine(chat.mText,
- chat.mFromName,
- txt_color,
- chat.mFromID);
- return;
- }
- }
-
LLChat& tmp_chat = const_cast<LLChat&>(chat);
if(tmp_chat.mTimeStr.empty())
@@ -207,7 +189,7 @@ void LLNearbyChat::addMessage(const LLChat& chat,bool archive,const LLSD &args)
return;
}
- if (gSavedPerAccountSettings.getBOOL("LogChat"))
+ if (gSavedPerAccountSettings.getBOOL("LogNearbyChat"))
{
LLLogChat::saveHistory("chat", chat.mFromName, chat.mFromID, chat.mText);
}
@@ -278,6 +260,13 @@ void LLNearbyChat::processChatHistoryStyleUpdate(const LLSD& newvalue)
nearby_chat->updateChatHistoryStyle();
}
+bool isTwoWordsName(const std::string& name)
+{
+ //checking for a single space
+ S32 pos = name.find(' ', 0);
+ return std::string::npos != pos && name.rfind(' ', name.length()) == pos && 0 != pos && name.length()-1 != pos;
+}
+
void LLNearbyChat::loadHistory()
{
LLSD do_not_log;
@@ -303,6 +292,19 @@ void LLNearbyChat::loadHistory()
chat.mFromID = from_id;
chat.mText = msg[IM_TEXT].asString();
chat.mTimeStr = msg[IM_TIME].asString();
+ chat.mChatStyle = CHAT_STYLE_HISTORY;
+
+ chat.mSourceType = CHAT_SOURCE_AGENT;
+ if (from_id.isNull() && SYSTEM_FROM == from)
+ {
+ chat.mSourceType = CHAT_SOURCE_SYSTEM;
+
+ }
+ else if (from_id.isNull())
+ {
+ chat.mSourceType = isTwoWordsName(from) ? CHAT_SOURCE_UNKNOWN : CHAT_SOURCE_OBJECT;
+ }
+
addMessage(chat, true, do_not_log);
it++;
@@ -331,3 +333,14 @@ void LLNearbyChat::onFocusLost()
LLPanel::onFocusLost();
}
+BOOL LLNearbyChat::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+ //fix for EXT-6625
+ //highlight NearbyChat history whenever mouseclick happen in NearbyChat
+ //setting focus to eidtor will force onFocusLost() call that in its turn will change
+ //background opaque. This all happenn since NearByChat is "chrome" and didn't process focus change.
+
+ if(mChatHistory)
+ mChatHistory->setFocus(TRUE);
+ return LLDockableFloater::handleMouseDown(x, y, mask);
+}
diff --git a/indra/newview/llnearbychat.h b/indra/newview/llnearbychat.h
index 6ef2a1fee3..3c116dbe83 100644
--- a/indra/newview/llnearbychat.h
+++ b/indra/newview/llnearbychat.h
@@ -53,6 +53,8 @@ public:
void onNearbyChatContextMenuItemClicked(const LLSD& userdata);
bool onNearbyChatCheckContextMenuItem(const LLSD& userdata);
+ virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+
// focus overrides
/*virtual*/ void onFocusLost();
/*virtual*/ void onFocusReceived();
diff --git a/indra/newview/llnearbychatbar.cpp b/indra/newview/llnearbychatbar.cpp
index ad98a29fb2..a300e15edd 100644
--- a/indra/newview/llnearbychatbar.cpp
+++ b/indra/newview/llnearbychatbar.cpp
@@ -34,6 +34,7 @@
#include "message.h"
+#include "llappviewer.h"
#include "llfloaterreg.h"
#include "lltrans.h"
@@ -69,6 +70,33 @@ static LLChatTypeTrigger sChatTypeTriggers[] = {
{ "/shout" , CHAT_TYPE_SHOUT}
};
+//ext-7367
+//Problem: gesture list control (actually LLScrollListCtrl) didn't actually process mouse wheel message.
+// introduce new gesture list subclass to "eat" mouse wheel messages (and probably some other messages)
+class LLGestureScrollListCtrl: public LLScrollListCtrl
+{
+protected:
+ friend class LLUICtrlFactory;
+ LLGestureScrollListCtrl(const LLScrollListCtrl::Params& params)
+ :LLScrollListCtrl(params)
+ {
+ }
+public:
+ BOOL handleScrollWheel(S32 x, S32 y, S32 clicks)
+ {
+ LLScrollListCtrl::handleScrollWheel( x, y, clicks );
+ return TRUE;
+ }
+ //See EXT-6598
+ //Mouse hover over separator will result in not processing tooltip message
+ //So eat this message
+ BOOL handleToolTip(S32 x, S32 y, MASK mask)
+ {
+ LLScrollListCtrl::handleToolTip( x, y, mask );
+ return TRUE;
+ }
+};
+
LLGestureComboList::Params::Params()
: combo_button("combo_button"),
combo_list("combo_list")
@@ -79,6 +107,7 @@ LLGestureComboList::LLGestureComboList(const LLGestureComboList::Params& p)
: LLUICtrl(p)
, mLabel(p.label)
, mViewAllItemIndex(0)
+ , mGetMoreItemIndex(0)
{
LLButton::Params button_params = p.combo_button;
button_params.follows.flags(FOLLOWS_LEFT|FOLLOWS_BOTTOM|FOLLOWS_RIGHT);
@@ -89,25 +118,22 @@ LLGestureComboList::LLGestureComboList(const LLGestureComboList::Params& p)
addChild(mButton);
- LLScrollListCtrl::Params params = p.combo_list;
+ LLGestureScrollListCtrl::Params params(p.combo_list);
+
params.name("GestureComboList");
params.commit_callback.function(boost::bind(&LLGestureComboList::onItemSelected, this, _2));
params.visible(false);
params.commit_on_keyboard_movement(false);
- mList = LLUICtrlFactory::create<LLScrollListCtrl>(params);
-
- // *HACK: adding list as a child to FloaterViewHolder to make it fully visible without
- // making it top control (because it would cause problems).
- gViewerWindow->getFloaterViewHolder()->addChild(mList);
- mList->setVisible(FALSE);
+ mList = LLUICtrlFactory::create<LLGestureScrollListCtrl>(params);
+ addChild(mList);
//****************************Gesture Part********************************/
setCommitCallback(boost::bind(&LLGestureComboList::onCommitGesture, this));
// now register us as observer since we have a place to put the results
- LLGestureManager::instance().addObserver(this);
+ LLGestureMgr::instance().addObserver(this);
// refresh list from current active gestures
refreshGestures();
@@ -115,7 +141,7 @@ LLGestureComboList::LLGestureComboList(const LLGestureComboList::Params& p)
setFocusLostCallback(boost::bind(&LLGestureComboList::hideList, this));
}
-BOOL LLGestureComboList::handleKey(KEY key, MASK mask, BOOL called_from_parent)
+BOOL LLGestureComboList::handleKeyHere(KEY key, MASK mask)
{
BOOL handled = FALSE;
@@ -126,7 +152,7 @@ BOOL LLGestureComboList::handleKey(KEY key, MASK mask, BOOL called_from_parent)
}
else
{
- handled = mList->handleKey(key, mask, called_from_parent);
+ handled = mList->handleKeyHere(key, mask);
}
return handled;
@@ -135,18 +161,17 @@ BOOL LLGestureComboList::handleKey(KEY key, MASK mask, BOOL called_from_parent)
void LLGestureComboList::showList()
{
LLRect rect = mList->getRect();
- LLRect screen;
- mButton->localRectToScreen(getRect(), &screen);
+ LLRect button_rect = mButton->getRect();
// Calculating amount of space between the navigation bar and gestures combo
LLNavigationBar* nb = LLNavigationBar::getInstance();
S32 x, nb_bottom;
- nb->localPointToScreen(0, 0, &x, &nb_bottom);
+ nb->localPointToOtherView(0, 0, &x, &nb_bottom, this);
- S32 max_height = nb_bottom - screen.mTop;
+ S32 max_height = nb_bottom - button_rect.mTop;
mList->calcColumnWidths();
- rect.setOriginAndSize(screen.mLeft, screen.mTop, llmax(mList->getMaxContentWidth(),mButton->getRect().getWidth()), max_height);
+ rect.setOriginAndSize(button_rect.mLeft, button_rect.mTop, llmax(mList->getMaxContentWidth(),mButton->getRect().getWidth()), max_height);
mList->setRect(rect);
mList->fitContents( llmax(mList->getMaxContentWidth(),mButton->getRect().getWidth()), max_height);
@@ -156,6 +181,7 @@ void LLGestureComboList::showList()
// Show the list and push the button down
mButton->setToggleState(TRUE);
mList->setVisible(TRUE);
+ LLUI::addPopup(mList);
}
void LLGestureComboList::onButtonCommit()
@@ -188,6 +214,7 @@ void LLGestureComboList::hideList()
mButton->setToggleState(FALSE);
mList->setVisible(FALSE);
mList->mouseOverHighlightNthItem(-1);
+ LLUI::removePopup(mList);
gFocusMgr.setKeyboardFocus(NULL);
}
}
@@ -247,8 +274,8 @@ void LLGestureComboList::refreshGestures()
mList->clearRows();
mGestures.clear();
- LLGestureManager::item_map_t::const_iterator it;
- const LLGestureManager::item_map_t& active_gestures = LLGestureManager::instance().getActiveGestures();
+ LLGestureMgr::item_map_t::const_iterator it;
+ const LLGestureMgr::item_map_t& active_gestures = LLGestureMgr::instance().getActiveGestures();
LLSD::Integer idx(0);
for (it = active_gestures.begin(); it != active_gestures.end(); ++it)
{
@@ -263,9 +290,12 @@ void LLGestureComboList::refreshGestures()
sortByName();
- // store index followed by the last added Gesture and add View All item at bottom
- mViewAllItemIndex = idx;
-
+ // store indices for Get More and View All items (idx is the index followed by the last added Gesture)
+ mGetMoreItemIndex = idx;
+ mViewAllItemIndex = idx + 1;
+
+ // add Get More and View All items at the bottom
+ mList->addSimpleElement(LLTrans::getString("GetMoreGestures"), ADD_BOTTOM, LLSD(mGetMoreItemIndex));
mList->addSimpleElement(LLTrans::getString("ViewAllGestures"), ADD_BOTTOM, LLSD(mViewAllItemIndex));
// Insert label after sorting, at top, with separator below it
@@ -292,7 +322,7 @@ void LLGestureComboList::refreshGestures()
gesture = mGestures.at(index);
}
- if(gesture && LLGestureManager::instance().isGesturePlaying(gesture))
+ if(gesture && LLGestureMgr::instance().isGesturePlaying(gesture))
{
return;
}
@@ -321,10 +351,16 @@ void LLGestureComboList::onCommitGesture()
return;
}
+ if (mGetMoreItemIndex == index)
+ {
+ LLWeb::loadURLExternal(gSavedSettings.getString("GesturesMarketplaceURL"));
+ return;
+ }
+
LLMultiGesture* gesture = mGestures.at(index);
if(gesture)
{
- LLGestureManager::instance().playGesture(gesture);
+ LLGestureMgr::instance().playGesture(gesture);
if(!gesture->mReplaceText.empty())
{
LLNearbyChatBar::sendChatFromViewer(gesture->mReplaceText, CHAT_TYPE_NORMAL, FALSE);
@@ -335,7 +371,7 @@ void LLGestureComboList::onCommitGesture()
LLGestureComboList::~LLGestureComboList()
{
- LLGestureManager::instance().removeObserver(this);
+ LLGestureMgr::instance().removeObserver(this);
}
LLNearbyChatBar::LLNearbyChatBar()
@@ -353,6 +389,7 @@ BOOL LLNearbyChatBar::postBuild()
mChatBox->setCommitCallback(boost::bind(&LLNearbyChatBar::onChatBoxCommit, this));
mChatBox->setKeystrokeCallback(&onChatBoxKeystroke, this);
mChatBox->setFocusLostCallback(boost::bind(&onChatBoxFocusLost, _1, this));
+ mChatBox->setFocusReceivedCallback(boost::bind(&LLNearbyChatBar::onChatBoxFocusReceived, this));
mChatBox->setIgnoreArrowKeys( FALSE );
mChatBox->setCommitOnFocusLost( FALSE );
@@ -396,7 +433,6 @@ BOOL LLNearbyChatBar::handleKeyHere( KEY key, MASK mask )
{
BOOL handled = FALSE;
- // ALT-RETURN is reserved for windowed/fullscreen toggle
if( KEY_RETURN == key && mask == MASK_CONTROL)
{
// shout
@@ -407,32 +443,6 @@ BOOL LLNearbyChatBar::handleKeyHere( KEY key, MASK mask )
return handled;
}
-S32 LLNearbyChatBar::getMinWidth() const
-{
- static S32 min_width = -1;
-
- if (min_width < 0)
- {
- const std::string& s = getString("min_width");
- min_width = !s.empty() ? atoi(s.c_str()) : 300;
- }
-
- return min_width;
-}
-
-S32 LLNearbyChatBar::getMaxWidth() const
-{
- static S32 max_width = -1;
-
- if (max_width < 0)
- {
- const std::string& s = getString("max_width");
- max_width = !s.empty() ? atoi(s.c_str()) : 510;
- }
-
- return max_width;
-}
-
BOOL LLNearbyChatBar::matchChatTypeTrigger(const std::string& in_str, std::string* out_str)
{
U32 in_len = in_str.length();
@@ -505,7 +515,7 @@ void LLNearbyChatBar::onChatBoxKeystroke(LLLineEditor* caller, void* userdata)
std::string utf8_trigger = wstring_to_utf8str(raw_text);
std::string utf8_out_str(utf8_trigger);
- if (LLGestureManager::instance().matchPrefix(utf8_trigger, &utf8_out_str))
+ if (LLGestureMgr::instance().matchPrefix(utf8_trigger, &utf8_out_str))
{
std::string rest_of_match = utf8_out_str.substr(utf8_trigger.size());
self->mChatBox->setText(utf8_trigger + rest_of_match); // keep original capitalization for user-entered part
@@ -536,6 +546,11 @@ void LLNearbyChatBar::onChatBoxFocusLost(LLFocusableElement* caller, void* userd
gAgent.stopTyping();
}
+void LLNearbyChatBar::onChatBoxFocusReceived()
+{
+ mChatBox->setEnabled(!gDisconnected);
+}
+
EChatType LLNearbyChatBar::processChatTypeTriggers(EChatType type, std::string &str)
{
U32 length = str.length();
@@ -587,7 +602,7 @@ void LLNearbyChatBar::sendChat( EChatType type )
if (0 == channel)
{
// discard returned "found" boolean
- LLGestureManager::instance().triggerAndReviseString(utf8text, &utf8_revised_text);
+ LLGestureMgr::instance().triggerAndReviseString(utf8text, &utf8_revised_text);
}
else
{
@@ -836,8 +851,11 @@ public:
{
if (tokens.size() < 2) return false;
S32 channel = tokens[0].asInteger();
- std::string mesg = tokens[1].asString();
- send_chat_from_viewer(mesg, CHAT_TYPE_NORMAL, channel);
+
+ // Send unescaped message, see EXT-6353.
+ std::string unescaped_mesg (LLURI::unescape(tokens[1].asString()));
+
+ send_chat_from_viewer(unescaped_mesg, CHAT_TYPE_NORMAL, channel);
return true;
}
};
diff --git a/indra/newview/llnearbychatbar.h b/indra/newview/llnearbychatbar.h
index d9a7403611..83c174fd10 100644
--- a/indra/newview/llnearbychatbar.h
+++ b/indra/newview/llnearbychatbar.h
@@ -62,6 +62,7 @@ protected:
std::vector<LLMultiGesture*> mGestures;
std::string mLabel;
LLSD::Integer mViewAllItemIndex;
+ LLSD::Integer mGetMoreItemIndex;
public:
@@ -70,7 +71,7 @@ public:
LLCtrlListInterface* getListInterface() { return (LLCtrlListInterface*)mList; };
virtual void showList();
virtual void hideList();
- virtual BOOL handleKey(KEY key, MASK mask, BOOL called_from_parent);
+ virtual BOOL handleKeyHere(KEY key, MASK mask);
S32 getCurrentIndex() const;
void onItemSelected(const LLSD& data);
@@ -117,13 +118,11 @@ public:
static void sendChatFromViewer(const std::string &utf8text, EChatType type, BOOL animate);
static void sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL animate);
- S32 getMinWidth() const;
- S32 getMaxWidth() const;
-
protected:
static BOOL matchChatTypeTrigger(const std::string& in_str, std::string* out_str);
static void onChatBoxKeystroke(LLLineEditor* caller, void* userdata);
static void onChatBoxFocusLost(LLFocusableElement* caller, void* userdata);
+ void onChatBoxFocusReceived();
void sendChat( EChatType type );
void onChatBoxCommit();
diff --git a/indra/newview/llnearbychathandler.cpp b/indra/newview/llnearbychathandler.cpp
index be48770567..1fadb126e4 100644
--- a/indra/newview/llnearbychathandler.cpp
+++ b/indra/newview/llnearbychathandler.cpp
@@ -32,9 +32,12 @@
#include "llviewerprecompiledheaders.h"
+#include "llagentdata.h" // for gAgentID
#include "llnearbychathandler.h"
+#include "llbottomtray.h"
#include "llchatitemscontainerctrl.h"
+#include "llfloaterscriptdebug.h"
#include "llnearbychat.h"
#include "llrecentpeople.h"
@@ -55,7 +58,6 @@ LLToastPanelBase* createToastPanel()
return item;
}
-
class LLNearbyChatScreenChannel: public LLScreenChannelBase
{
public:
@@ -87,11 +89,7 @@ public:
{
for(std::vector<LLToast*>::iterator it = m_active_toasts.begin(); it != m_active_toasts.end(); ++it)
{
- LLToast* toast = (*it);
- toast->setVisible(FALSE);
- toast->stopTimer();
- m_toast_pool.push_back(toast);
-
+ addToToastPool((*it));
}
m_active_toasts.clear();
};
@@ -104,6 +102,14 @@ public:
}
protected:
+ void addToToastPool(LLToast* toast)
+ {
+ toast->setVisible(FALSE);
+ toast->stopTimer();
+ toast->setIsHidden(true);
+ m_toast_pool.push_back(toast);
+ }
+
void createOverflowToast(S32 bottom, F32 timer);
create_toast_panel_callback_t m_create_toast_panel_callback_t;
@@ -131,11 +137,12 @@ void LLNearbyChatScreenChannel::onToastFade(LLToast* toast)
//fade mean we put toast to toast pool
if(!toast)
return;
- m_toast_pool.push_back(toast);
std::vector<LLToast*>::iterator pos = std::find(m_active_toasts.begin(),m_active_toasts.end(),toast);
if(pos!=m_active_toasts.end())
m_active_toasts.erase(pos);
+
+ addToToastPool(toast);
arrangeToasts();
}
@@ -175,10 +182,11 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification)
if(m_active_toasts.size())
{
LLUUID fromID = notification["from_id"].asUUID(); // agent id or object id
+ std::string from = notification["from"].asString();
LLToast* toast = m_active_toasts[0];
LLNearbyChatToastPanel* panel = dynamic_cast<LLNearbyChatToastPanel*>(toast->getPanel());
- if(panel && panel->messageID() == fromID && panel->canAddText())
+ if(panel && panel->messageID() == fromID && panel->getFromName() == from && panel->canAddText())
{
panel->addMessage(notification);
toast->reshapeToPanel();
@@ -226,7 +234,7 @@ void LLNearbyChatScreenChannel::addNotification(LLSD& notification)
toast->reshapeToPanel();
toast->resetTimer();
- m_active_toasts.insert(m_active_toasts.begin(),toast);
+ m_active_toasts.push_back(toast);
arrangeToasts();
}
@@ -238,7 +246,14 @@ void LLNearbyChatScreenChannel::arrangeToasts()
hideToastsFromScreen();
- showToastsBottom();
+ showToastsBottom();
+}
+
+int sort_toasts_predicate(LLToast* first,LLToast* second)
+{
+ F32 v1 = first->getTimer()->getEventTimer().getElapsedTimeF32();
+ F32 v2 = second->getTimer()->getEventTimer().getElapsedTimeF32();
+ return v1 < v2;
}
void LLNearbyChatScreenChannel::showToastsBottom()
@@ -250,40 +265,41 @@ void LLNearbyChatScreenChannel::showToastsBottom()
S32 bottom = getRect().mBottom;
S32 margin = gSavedSettings.getS32("ToastGap");
+ //sort active toasts
+ std::sort(m_active_toasts.begin(),m_active_toasts.end(),sort_toasts_predicate);
+
+ //calc max visible item and hide other toasts.
+
for(std::vector<LLToast*>::iterator it = m_active_toasts.begin(); it != m_active_toasts.end(); ++it)
{
- LLToast* toast = (*it);
- S32 toast_top = bottom + toast->getRect().getHeight() + margin;
+ S32 toast_top = bottom + (*it)->getRect().getHeight() + margin;
if(toast_top > gFloaterView->getRect().getHeight())
{
while(it!=m_active_toasts.end())
{
- toast->setVisible(FALSE);
- toast->stopTimer();
- m_toast_pool.push_back(toast);
+ addToToastPool((*it));
it=m_active_toasts.erase(it);
}
break;
}
- else
- {
- toast_rect = toast->getRect();
- toast_rect.setLeftTopAndSize(getRect().mLeft , toast_top, toast_rect.getWidth() ,toast_rect.getHeight());
-
- toast->setRect(toast_rect);
- toast->setIsHidden(false);
- toast->setVisible(TRUE);
+ LLToast* toast = (*it);
+
+ toast_rect = toast->getRect();
+ toast_rect.setLeftTopAndSize(getRect().mLeft , bottom + toast_rect.getHeight(), toast_rect.getWidth() ,toast_rect.getHeight());
+
+ toast->setRect(toast_rect);
+ bottom += toast_rect.getHeight() - toast->getTopPad() + margin;
+ }
+
+ // use reverse order to provide correct z-order and avoid toast blinking
+
+ for(std::vector<LLToast*>::reverse_iterator it = m_active_toasts.rbegin(); it != m_active_toasts.rend(); ++it)
+ {
+ LLToast* toast = (*it);
+ toast->setIsHidden(false);
+ toast->setVisible(TRUE);
- if(!toast->hasFocus())
- {
- // Fixing Z-order of toasts (EXT-4862)
- // Next toast will be positioned under this one.
- gFloaterView->sendChildToBack(toast);
- }
-
- bottom = toast->getRect().mTop;
- }
}
}
@@ -319,9 +335,9 @@ LLNearbyChatHandler::~LLNearbyChatHandler()
void LLNearbyChatHandler::initChannel()
{
LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
+ LLView* chat_box = LLBottomTray::getInstance()->getChildView("chat_box");
S32 channel_right_bound = nearby_chat->getRect().mRight;
- S32 channel_width = nearby_chat->getRect().mRight;
- mChannel->init(channel_right_bound - channel_width, channel_right_bound);
+ mChannel->init(chat_box->getRect().mLeft, channel_right_bound);
}
@@ -344,9 +360,41 @@ void LLNearbyChatHandler::processChat(const LLChat& chat_msg, const LLSD &args)
//if(tmp_chat.mFromName.empty() && tmp_chat.mFromID!= LLUUID::null)
// tmp_chat.mFromName = tmp_chat.mFromID.asString();
}
+
+ // don't show toast and add message to chat history on receive debug message
+ // with disabled setting showing script errors or enabled setting to show script
+ // errors in separate window.
+ if (chat_msg.mChatType == CHAT_TYPE_DEBUG_MSG)
+ {
+ if(gSavedSettings.getBOOL("ShowScriptErrors") == FALSE)
+ return;
+
+ // don't process debug messages from not owned objects, see EXT-7762
+ if (gAgentID != chat_msg.mOwnerID)
+ {
+ return;
+ }
+
+ if (gSavedSettings.getS32("ShowScriptErrorsLocation")== 1)// show error in window //("ScriptErrorsAsChat"))
+ {
+
+ LLColor4 txt_color;
+
+ LLViewerChat::getChatColor(chat_msg,txt_color);
+
+ LLFloaterScriptDebug::addScriptLine(chat_msg.mText,
+ chat_msg.mFromName,
+ txt_color,
+ chat_msg.mFromID);
+ return;
+ }
+ }
+
nearby_chat->addMessage(chat_msg, true, args);
- if(nearby_chat->getVisible())
- return;//no need in toast if chat is visible
+ if( nearby_chat->getVisible()
+ || ( chat_msg.mSourceType == CHAT_SOURCE_AGENT
+ && gSavedSettings.getBOOL("UseChatBubbles") ) )
+ return;//no need in toast if chat is visible or if bubble chat is enabled
// Handle irc styled messages for toast panel
if (tmp_chat.mChatStyle == CHAT_STYLE_IRC)
diff --git a/indra/newview/llnetmap.cpp b/indra/newview/llnetmap.cpp
index 234fe13217..a8dee8a24a 100644
--- a/indra/newview/llnetmap.cpp
+++ b/indra/newview/llnetmap.cpp
@@ -49,6 +49,7 @@
// Viewer includes
#include "llagent.h"
+#include "llagentcamera.h"
#include "llappviewer.h" // for gDisconnected
#include "llcallingcard.h" // LLAvatarTracker
#include "lltracker.h"
@@ -87,7 +88,7 @@ LLNetMap::LLNetMap (const Params & p)
mCurPanX(0.f),
mCurPanY(0.f),
mUpdateNow(FALSE),
- mObjectImageCenterGlobal( gAgent.getCameraPositionGlobal() ),
+ mObjectImageCenterGlobal( gAgentCamera.getCameraPositionGlobal() ),
mObjectRawImagep(),
mObjectImagep(),
mClosestAgentToCursor(),
@@ -153,6 +154,18 @@ void LLNetMap::draw()
// Prepare a scissor region
F32 rotation = 0;
+ gGL.pushMatrix();
+ gGL.pushUIMatrix();
+
+ LLVector3 offset = gGL.getUITranslation();
+ LLVector3 scale = gGL.getUIScale();
+
+ glLoadIdentity();
+ gGL.loadUIIdentity();
+
+ glScalef(scale.mV[0], scale.mV[1], scale.mV[2]);
+ gGL.translatef(offset.mV[0], offset.mV[1], offset.mV[2]);
+
{
LLLocalClipRect clip(getLocalRect());
{
@@ -191,7 +204,7 @@ void LLNetMap::draw()
LLViewerRegion* regionp = *iter;
// Find x and y position relative to camera's center.
LLVector3 origin_agent = regionp->getOriginAgent();
- LLVector3 rel_region_pos = origin_agent - gAgent.getCameraPositionAgent();
+ LLVector3 rel_region_pos = origin_agent - gAgentCamera.getCameraPositionAgent();
F32 relative_x = (rel_region_pos.mV[0] / region_width) * mScale;
F32 relative_y = (rel_region_pos.mV[1] / region_width) * mScale;
@@ -252,7 +265,7 @@ void LLNetMap::draw()
LLVector3d old_center = mObjectImageCenterGlobal;
- LLVector3d new_center = gAgent.getCameraPositionGlobal();
+ LLVector3d new_center = gAgentCamera.getCameraPositionGlobal();
new_center.mdV[0] = (5.f/mObjectMapTPM)*floor(0.2f*mObjectMapTPM*new_center.mdV[0]);
new_center.mdV[1] = (5.f/mObjectMapTPM)*floor(0.2f*mObjectMapTPM*new_center.mdV[1]);
@@ -277,7 +290,7 @@ void LLNetMap::draw()
}
LLVector3 map_center_agent = gAgent.getPosAgentFromGlobal(mObjectImageCenterGlobal);
- map_center_agent -= gAgent.getCameraPositionAgent();
+ map_center_agent -= gAgentCamera.getCameraPositionAgent();
map_center_agent.mV[VX] *= mScale/region_width;
map_center_agent.mV[VY] *= mScale/region_width;
@@ -435,6 +448,9 @@ void LLNetMap::draw()
}
}
+ gGL.popMatrix();
+ gGL.popUIMatrix();
+
LLUICtrl::draw();
}
@@ -446,7 +462,7 @@ void LLNetMap::reshape(S32 width, S32 height, BOOL called_from_parent)
LLVector3 LLNetMap::globalPosToView( const LLVector3d& global_pos )
{
- LLVector3d relative_pos_global = global_pos - gAgent.getCameraPositionGlobal();
+ LLVector3d relative_pos_global = global_pos - gAgentCamera.getCameraPositionGlobal();
LLVector3 pos_local;
pos_local.setVec(relative_pos_global); // convert to floats from doubles
@@ -514,7 +530,7 @@ LLVector3d LLNetMap::viewPosToGlobal( S32 x, S32 y )
LLVector3d pos_global;
pos_global.setVec( pos_local );
- pos_global += gAgent.getCameraPositionGlobal();
+ pos_global += gAgentCamera.getCameraPositionGlobal();
return pos_global;
}
diff --git a/indra/newview/llnetmap.h b/indra/newview/llnetmap.h
index 3d7f3233ac..eb53d295b2 100644
--- a/indra/newview/llnetmap.h
+++ b/indra/newview/llnetmap.h
@@ -46,10 +46,6 @@ class LLImageRaw;
class LLTextBox;
class LLViewerTexture;
-const F32 MAP_SCALE_MIN = 64.f;
-const F32 MAP_SCALE_MID = 172.f;
-const F32 MAP_SCALE_MAX = 512.f;
-
class LLNetMap : public LLUICtrl
{
public:
diff --git a/indra/newview/llnotificationalerthandler.cpp b/indra/newview/llnotificationalerthandler.cpp
index 52de8355e9..60e41b64ac 100644
--- a/indra/newview/llnotificationalerthandler.cpp
+++ b/indra/newview/llnotificationalerthandler.cpp
@@ -36,6 +36,7 @@
#include "llnotificationhandler.h"
#include "llnotifications.h"
+#include "llprogressview.h"
#include "lltoastnotifypanel.h"
#include "llviewercontrol.h"
#include "llviewerwindow.h"
@@ -116,6 +117,11 @@ bool LLAlertHandler::processNotification(const LLSD& notify)
p.is_modal = mIsModal;
p.on_delete_toast = boost::bind(&LLAlertHandler::onDeleteToast, this, _1);
+ // Show alert in middle of progress view (during teleport) (EXT-1093)
+ LLProgressView* progress = gViewerWindow->getProgressView();
+ LLRect rc = progress && progress->getVisible() ? progress->getRect() : gViewerWindow->getWorldViewRectScaled();
+ mChannel->updatePositionAndSize(rc, rc);
+
LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
if(channel)
channel->addToast(p);
diff --git a/indra/newview/llnotificationhandler.h b/indra/newview/llnotificationhandler.h
index 5f4768e321..99a1fedcf3 100644
--- a/indra/newview/llnotificationhandler.h
+++ b/indra/newview/llnotificationhandler.h
@@ -42,6 +42,8 @@
#include "llinstantmessage.h"
#include "llnotificationptr.h"
+class LLIMFloater;
+
namespace LLNotificationsUI
{
// ENotificationType enumerates all possible types of notifications that could be met
@@ -122,9 +124,17 @@ protected:
class LLSysHandler : public LLEventHandler
{
public:
+ LLSysHandler();
virtual ~LLSysHandler() {};
virtual bool processNotification(const LLSD& notify)=0;
+
+protected :
+ static void init();
+ void removeExclusiveNotifications(const LLNotificationPtr& notif);
+
+ typedef std::list< std::set<std::string> > exclusive_notif_sets;
+ static exclusive_notif_sets sExclusiveNotificationGroups;
};
/**
@@ -171,6 +181,7 @@ public:
protected:
virtual void onDeleteToast(LLToast* toast);
+ virtual void onRejectToast(const LLUUID& id);
virtual void initChannel();
};
@@ -282,6 +293,11 @@ public:
static bool canAddNotifPanelToIM(const LLNotificationPtr& notification);
/**
+ * Checks whether notification can be used multiple times or not.
+ */
+ static bool isNotificationReusable(const LLNotificationPtr& notification);
+
+ /**
* Checks if passed notification can create IM session and be written into it.
*
* This method uses canLogToIM() & canSpawnIMSession().
@@ -289,6 +305,21 @@ public:
static bool canSpawnSessionAndLogToIM(const LLNotificationPtr& notification);
/**
+ * Checks if passed notification can create toast.
+ */
+ static bool canSpawnToast(const LLNotificationPtr& notification);
+
+ /**
+ * Determines whether IM floater is opened.
+ */
+ static bool isIMFloaterOpened(const LLNotificationPtr& notification);
+
+ /**
+ * Determines whether IM floater is focused.
+ */
+ static bool isIMFloaterFocused(const LLNotificationPtr& notification);
+
+ /**
* Writes notification message to IM session.
*/
static void logToIM(const EInstantMessage& session_type,
@@ -336,9 +367,27 @@ public:
static void addNotifPanelToIM(const LLNotificationPtr& notification);
/**
- * Reloads IM floater messages.
+ * Updates messages of IM floater.
+ */
+ static void updateIMFLoaterMesages(const LLUUID& session_id);
+
+ /**
+ * Updates messages of visible IM floater.
+ */
+ static void updateVisibleIMFLoaterMesages(const LLNotificationPtr& notification);
+
+ /**
+ * Decrements counter of IM messages.
+ */
+ static void decIMMesageCounter(const LLNotificationPtr& notification);
+
+private:
+
+ /**
+ * Find IM floater based on "from_id"
*/
- static void reloadIMFloaterMessages(const LLNotificationPtr& notification);
+ static LLIMFloater* findIMFloater(const LLNotificationPtr& notification);
+
};
}
diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp
index b8e0892b02..95b946f307 100644
--- a/indra/newview/llnotificationhandlerutil.cpp
+++ b/indra/newview/llnotificationhandlerutil.cpp
@@ -43,10 +43,78 @@
using namespace LLNotificationsUI;
+// static
+std::list< std::set<std::string> > LLSysHandler::sExclusiveNotificationGroups;
+
+// static
+void LLSysHandler::init()
+{
+ std::set<std::string> online_offline_group;
+ online_offline_group.insert("FriendOnline");
+ online_offline_group.insert("FriendOffline");
+
+ sExclusiveNotificationGroups.push_back(online_offline_group);
+}
+
+LLSysHandler::LLSysHandler()
+{
+ if(sExclusiveNotificationGroups.empty())
+ {
+ init();
+ }
+}
+
+void LLSysHandler::removeExclusiveNotifications(const LLNotificationPtr& notif)
+{
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel *>(mChannel);
+ if (channel == NULL)
+ {
+ return;
+ }
+
+ class ExclusiveMatcher: public LLScreenChannel::Matcher
+ {
+ public:
+ ExclusiveMatcher(const std::set<std::string>& excl_group,
+ const std::string& from_name) :
+ mExclGroup(excl_group), mFromName(from_name)
+ {
+ }
+ bool matches(const LLNotificationPtr notification) const
+ {
+ for (std::set<std::string>::const_iterator it = mExclGroup.begin(); it
+ != mExclGroup.end(); it++)
+ {
+ std::string from_name = LLHandlerUtil::getSubstitutionName(notification);
+ if (notification->getName() == *it && from_name == mFromName)
+ {
+ return true;
+ }
+ }
+ return false;
+ }
+ private:
+ const std::set<std::string>& mExclGroup;
+ const std::string& mFromName;
+ };
+
+
+ for (exclusive_notif_sets::iterator it = sExclusiveNotificationGroups.begin(); it
+ != sExclusiveNotificationGroups.end(); it++)
+ {
+ std::set<std::string> group = *it;
+ std::set<std::string>::iterator g_it = group.find(notif->getName());
+ if (g_it != group.end())
+ {
+ channel->killMatchedToasts(ExclusiveMatcher(group,
+ LLHandlerUtil::getSubstitutionName(notif)));
+ }
+ }
+}
+
const static std::string GRANTED_MODIFY_RIGHTS("GrantedModifyRights"),
REVOKED_MODIFY_RIGHTS("RevokedModifyRights"), OBJECT_GIVE_ITEM(
- "ObjectGiveItem"), OBJECT_GIVE_ITEM_UNKNOWN_USER(
- "ObjectGiveItemUnknownUser"), PAYMENT_RECIVED("PaymentRecived"),
+ "ObjectGiveItem"), PAYMENT_RECIVED("PaymentRecived"),
ADD_FRIEND_WITH_MESSAGE("AddFriendWithMessage"),
USER_GIVE_ITEM("UserGiveItem"),
INVENTORY_ACCEPTED("InventoryAccepted"),
@@ -54,9 +122,14 @@ const static std::string GRANTED_MODIFY_RIGHTS("GrantedModifyRights"),
OFFER_FRIENDSHIP("OfferFriendship"),
FRIENDSHIP_ACCEPTED("FriendshipAccepted"),
FRIENDSHIP_OFFERED("FriendshipOffered"),
+ FRIENDSHIP_ACCEPTED_BYME("FriendshipAcceptedByMe"),
+ FRIENDSHIP_DECLINED_BYME("FriendshipDeclinedByMe"),
FRIEND_ONLINE("FriendOnline"), FRIEND_OFFLINE("FriendOffline"),
SERVER_OBJECT_MESSAGE("ServerObjectMessage"),
- TELEPORT_OFFERED("TeleportOffered");
+ TELEPORT_OFFERED("TeleportOffered"),
+ TELEPORT_OFFER_SENT("TeleportOfferSent"),
+ IM_SYSTEM_MESSAGE_TIP("IMSystemMessageTip");
+
// static
bool LLHandlerUtil::canLogToIM(const LLNotificationPtr& notification)
@@ -66,9 +139,16 @@ bool LLHandlerUtil::canLogToIM(const LLNotificationPtr& notification)
|| PAYMENT_RECIVED == notification->getName()
|| OFFER_FRIENDSHIP == notification->getName()
|| FRIENDSHIP_OFFERED == notification->getName()
+ || FRIENDSHIP_ACCEPTED == notification->getName()
+ || FRIENDSHIP_ACCEPTED_BYME == notification->getName()
+ || FRIENDSHIP_DECLINED_BYME == notification->getName()
|| SERVER_OBJECT_MESSAGE == notification->getName()
|| INVENTORY_ACCEPTED == notification->getName()
- || INVENTORY_DECLINED == notification->getName();
+ || INVENTORY_DECLINED == notification->getName()
+ || USER_GIVE_ITEM == notification->getName()
+ || TELEPORT_OFFERED == notification->getName()
+ || TELEPORT_OFFER_SENT == notification->getName()
+ || IM_SYSTEM_MESSAGE_TIP == notification->getName();
}
// static
@@ -78,25 +158,33 @@ bool LLHandlerUtil::canLogToNearbyChat(const LLNotificationPtr& notification)
&& FRIEND_ONLINE != notification->getName()
&& FRIEND_OFFLINE != notification->getName()
&& INVENTORY_ACCEPTED != notification->getName()
- && INVENTORY_DECLINED != notification->getName();
+ && INVENTORY_DECLINED != notification->getName()
+ && IM_SYSTEM_MESSAGE_TIP != notification->getName();
}
// static
bool LLHandlerUtil::canSpawnIMSession(const LLNotificationPtr& notification)
{
return OFFER_FRIENDSHIP == notification->getName()
- || FRIENDSHIP_ACCEPTED == notification->getName()
|| USER_GIVE_ITEM == notification->getName()
- || INVENTORY_ACCEPTED == notification->getName()
- || INVENTORY_DECLINED == notification->getName();
+ || TELEPORT_OFFERED == notification->getName();
}
// static
bool LLHandlerUtil::canAddNotifPanelToIM(const LLNotificationPtr& notification)
{
- return OFFER_FRIENDSHIP == notification->getName();
+ return OFFER_FRIENDSHIP == notification->getName()
+ || USER_GIVE_ITEM == notification->getName()
+ || TELEPORT_OFFERED == notification->getName();
}
+// static
+bool LLHandlerUtil::isNotificationReusable(const LLNotificationPtr& notification)
+{
+ return OFFER_FRIENDSHIP == notification->getName()
+ || USER_GIVE_ITEM == notification->getName()
+ || TELEPORT_OFFERED == notification->getName();
+}
// static
bool LLHandlerUtil::canSpawnSessionAndLogToIM(const LLNotificationPtr& notification)
@@ -105,18 +193,91 @@ bool LLHandlerUtil::canSpawnSessionAndLogToIM(const LLNotificationPtr& notificat
}
// static
+bool LLHandlerUtil::canSpawnToast(const LLNotificationPtr& notification)
+{
+ if(INVENTORY_DECLINED == notification->getName()
+ || INVENTORY_ACCEPTED == notification->getName())
+ {
+ // return false for inventory accepted/declined notifications if respective IM window is open (EXT-5909)
+ return ! isIMFloaterOpened(notification);
+ }
+
+ if(FRIENDSHIP_ACCEPTED == notification->getName())
+ {
+ // don't show FRIENDSHIP_ACCEPTED if IM window is opened and focused - EXT-6441
+ return ! isIMFloaterFocused(notification);
+ }
+
+ if(OFFER_FRIENDSHIP == notification->getName()
+ || USER_GIVE_ITEM == notification->getName()
+ || TELEPORT_OFFERED == notification->getName())
+ {
+ // When ANY offer arrives, show toast, unless IM window is already open - EXT-5904
+ return ! isIMFloaterOpened(notification);
+ }
+
+ return true;
+}
+
+// static
+LLIMFloater* LLHandlerUtil::findIMFloater(const LLNotificationPtr& notification)
+{
+ LLUUID from_id = notification->getPayload()["from_id"];
+ LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, from_id);
+ return LLFloaterReg::findTypedInstance<LLIMFloater>("impanel", session_id);
+}
+
+// static
+bool LLHandlerUtil::isIMFloaterOpened(const LLNotificationPtr& notification)
+{
+ bool res = false;
+
+ LLIMFloater* im_floater = findIMFloater(notification);
+ if (im_floater != NULL)
+ {
+ res = im_floater->getVisible() == TRUE;
+ }
+
+ return res;
+}
+
+bool LLHandlerUtil::isIMFloaterFocused(const LLNotificationPtr& notification)
+{
+ bool res = false;
+
+ LLIMFloater* im_floater = findIMFloater(notification);
+ if (im_floater != NULL)
+ {
+ res = im_floater->hasFocus() == TRUE;
+ }
+
+ return res;
+}
+
+// static
void LLHandlerUtil::logToIM(const EInstantMessage& session_type,
const std::string& session_name, const std::string& from_name,
const std::string& message, const LLUUID& session_owner_id,
const LLUUID& from_id)
{
+ std::string from = from_name;
+ if (from_name.empty())
+ {
+ from = SYSTEM_FROM;
+ }
+
LLUUID session_id = LLIMMgr::computeSessionID(session_type,
session_owner_id);
LLIMModel::LLIMSession* session = LLIMModel::instance().findIMSession(
session_id);
if (session == NULL)
{
- LLIMModel::instance().logToFile(session_name, from_name, from_id, message);
+ // replace interactive system message marker with correct from string value
+ if (INTERACTIVE_SYSTEM_FROM == from_name)
+ {
+ from = SYSTEM_FROM;
+ }
+ LLIMModel::instance().logToFile(session_name, from, from_id, message);
}
else
{
@@ -127,8 +288,16 @@ void LLHandlerUtil::logToIM(const EInstantMessage& session_type,
// set searched session as active to avoid IM toast popup
LLIMModel::instance().setActiveSessionID(session_id);
- LLIMModel::instance().addMessage(session_id, from_name, from_id,
+ S32 unread = session->mNumUnread;
+ S32 participant_unread = session->mParticipantUnreadMessageCount;
+ LLIMModel::instance().addMessageSilently(session_id, from, from_id,
message);
+ // we shouldn't increment counters when logging, so restore them
+ session->mNumUnread = unread;
+ session->mParticipantUnreadMessageCount = participant_unread;
+
+ // update IM floater messages
+ updateIMFLoaterMesages(session_id);
// restore active session id
if (active_session_id.isNull())
@@ -153,21 +322,14 @@ void LLHandlerUtil::logToIMP2P(const LLNotificationPtr& notification, bool to_fi
{
const std::string name = LLHandlerUtil::getSubstitutionName(notification);
- std::string session_name = notification->getPayload().has(
+ const std::string& session_name = notification->getPayload().has(
"SESSION_NAME") ? notification->getPayload()["SESSION_NAME"].asString() : name;
// don't create IM p2p session with objects, it's necessary condition to log
- if (notification->getName() != OBJECT_GIVE_ITEM && notification->getName()
- != OBJECT_GIVE_ITEM_UNKNOWN_USER)
+ if (notification->getName() != OBJECT_GIVE_ITEM)
{
LLUUID from_id = notification->getPayload()["from_id"];
- //*HACK for ServerObjectMessage the sesson name is really weird, see EXT-4779
- if (SERVER_OBJECT_MESSAGE == notification->getName())
- {
- session_name = "chat";
- }
-
//there still appears a log history file with weird name " .txt"
if (" " == session_name || "{waiting}" == session_name || "{nobody}" == session_name)
{
@@ -176,13 +338,13 @@ void LLHandlerUtil::logToIMP2P(const LLNotificationPtr& notification, bool to_fi
if(to_file_only)
{
- logToIM(IM_NOTHING_SPECIAL, session_name, name, notification->getMessage(),
+ logToIM(IM_NOTHING_SPECIAL, session_name, "", notification->getMessage(),
LLUUID(), LLUUID());
}
else
{
- logToIM(IM_NOTHING_SPECIAL, session_name, name, notification->getMessage(),
- from_id, from_id);
+ logToIM(IM_NOTHING_SPECIAL, session_name, INTERACTIVE_SYSTEM_FROM, notification->getMessage(),
+ from_id, LLUUID());
}
}
}
@@ -199,6 +361,7 @@ void LLHandlerUtil::logGroupNoticeToIMGroup(
llwarns
<< "Group notice for unkown group: "
<< payload["group_id"].asUUID() << llendl;
+ return;
}
const std::string group_name = groupData.mName;
@@ -220,6 +383,8 @@ void LLHandlerUtil::logToNearbyChat(const LLNotificationPtr& notification, EChat
{
LLChat chat_msg(notification->getMessage());
chat_msg.mSourceType = type;
+ chat_msg.mFromName = SYSTEM_FROM;
+ chat_msg.mFromID = LLUUID::null;
nearby_chat->addMessage(chat_msg);
}
}
@@ -242,9 +407,24 @@ LLUUID LLHandlerUtil::spawnIMSession(const std::string& name, const LLUUID& from
// static
std::string LLHandlerUtil::getSubstitutionName(const LLNotificationPtr& notification)
{
- return notification->getSubstitutions().has("NAME")
+ std::string res = notification->getSubstitutions().has("NAME")
? notification->getSubstitutions()["NAME"]
: notification->getSubstitutions()["[NAME]"];
+ if (res.empty())
+ {
+ LLUUID from_id = notification->getPayload()["FROM_ID"];
+
+ //*TODO all keys everywhere should be made of the same case, there is a mix of keys in lower and upper cases
+ if (from_id.isNull())
+ {
+ from_id = notification->getPayload()["from_id"];
+ }
+ if(!gCacheName->getFullName(from_id, res))
+ {
+ res = "";
+ }
+ }
+ return res;
}
// static
@@ -261,34 +441,60 @@ void LLHandlerUtil::addNotifPanelToIM(const LLNotificationPtr& notification)
LLSD offer;
offer["notification_id"] = notification->getID();
- offer["from_id"] = notification->getPayload()["from_id"];
- offer["from"] = name;
- offer["time"] = LLLogChat::timestamp(true);
+ offer["from"] = SYSTEM_FROM;
+ offer["time"] = LLLogChat::timestamp(false);
+ offer["index"] = (LLSD::Integer)session->mMsgs.size();
session->mMsgs.push_front(offer);
- LLIMFloater::show(session_id);
+
+ // update IM floater and counters
+ LLSD arg;
+ arg["session_id"] = session_id;
+ arg["num_unread"] = ++(session->mNumUnread);
+ arg["participant_unread"] = ++(session->mParticipantUnreadMessageCount);
+ LLIMModel::getInstance()->mNewMsgSignal(arg);
}
// static
-void LLHandlerUtil::reloadIMFloaterMessages(
- const LLNotificationPtr& notification)
+void LLHandlerUtil::updateIMFLoaterMesages(const LLUUID& session_id)
{
+ LLIMFloater* im_floater = LLIMFloater::findInstance(session_id);
+ if (im_floater != NULL && im_floater->getVisible())
+ {
+ im_floater->updateMessages();
+ }
+}
+
+// static
+void LLHandlerUtil::updateVisibleIMFLoaterMesages(const LLNotificationPtr& notification)
+{
+ const std::string name = LLHandlerUtil::getSubstitutionName(notification);
+ LLUUID from_id = notification->getPayload()["from_id"];
+ LLUUID session_id = spawnIMSession(name, from_id);
+
+ updateIMFLoaterMesages(session_id);
+}
+
+// static
+void LLHandlerUtil::decIMMesageCounter(const LLNotificationPtr& notification)
+{
+ const std::string name = LLHandlerUtil::getSubstitutionName(notification);
LLUUID from_id = notification->getPayload()["from_id"];
LLUUID session_id = LLIMMgr::computeSessionID(IM_NOTHING_SPECIAL, from_id);
- LLIMFloater* im_floater = LLFloaterReg::findTypedInstance<LLIMFloater>(
- "impanel", session_id);
- if (im_floater != NULL)
- {
- LLIMModel::LLIMSession * session = LLIMModel::getInstance()->findIMSession(
- session_id);
- if(session != NULL)
- {
- session->mMsgs.clear();
- std::list<LLSD> chat_history;
- LLLogChat::loadAllHistory(session->mHistoryFileName, chat_history);
- session->addMessagesFromHistory(chat_history);
- }
- im_floater->reloadMessages();
+ LLIMModel::LLIMSession * session = LLIMModel::getInstance()->findIMSession(
+ session_id);
+
+ if (session == NULL)
+ {
+ return;
}
+
+ LLSD arg;
+ arg["session_id"] = session_id;
+ session->mNumUnread--;
+ arg["num_unread"] = session->mNumUnread;
+ session->mParticipantUnreadMessageCount--;
+ arg["participant_unread"] = session->mParticipantUnreadMessageCount;
+ LLIMModel::getInstance()->mNewMsgSignal(arg);
}
diff --git a/indra/newview/llnotificationofferhandler.cpp b/indra/newview/llnotificationofferhandler.cpp
index 8c13b0fafa..c5960a9040 100644
--- a/indra/newview/llnotificationofferhandler.cpp
+++ b/indra/newview/llnotificationofferhandler.cpp
@@ -103,6 +103,8 @@ bool LLOfferHandler::processNotification(const LLSD& notify)
}
else
{
+ notification->setReusable(LLHandlerUtil::isNotificationReusable(notification));
+
LLUUID session_id;
if (LLHandlerUtil::canSpawnIMSession(notification))
{
@@ -113,35 +115,54 @@ bool LLOfferHandler::processNotification(const LLSD& notify)
session_id = LLHandlerUtil::spawnIMSession(name, from_id);
}
- if (LLHandlerUtil::canAddNotifPanelToIM(notification))
+ bool show_toast = LLHandlerUtil::canSpawnToast(notification);
+ bool add_notid_to_im = LLHandlerUtil::canAddNotifPanelToIM(notification);
+ if (add_notid_to_im)
{
LLHandlerUtil::addNotifPanelToIM(notification);
- LLHandlerUtil::logToIMP2P(notification, true);
}
- else if (notification->getPayload().has("SUPPRESS_TOAST")
+
+ if (notification->getPayload().has("SUPPRESS_TOAST")
&& notification->getPayload()["SUPPRESS_TOAST"])
{
- LLHandlerUtil::logToIMP2P(notification);
LLNotificationsUtil::cancel(notification);
}
- else
+ else if(show_toast)
{
LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification);
-
+ // don't close notification on panel destroy since it will be used by IM floater
+ notify_box->setCloseNotificationOnDestroy(!add_notid_to_im);
LLToast::Params p;
p.notif_id = notification->getID();
p.notification = notification;
p.panel = notify_box;
p.on_delete_toast = boost::bind(&LLOfferHandler::onDeleteToast, this, _1);
+ // we not save offer notifications to the syswell floater that should be added to the IM floater
+ p.can_be_stored = !add_notid_to_im;
LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
if(channel)
channel->addToast(p);
- LLHandlerUtil::logToIMP2P(notification);
+ // if we not add notification to IM - add it to notification well
+ if (!add_notid_to_im)
+ {
+ // send a signal to the counter manager
+ mNewNotificationSignal();
+ }
+ }
- // send a signal to the counter manager
- mNewNotificationSignal();
+ if (LLHandlerUtil::canLogToIM(notification))
+ {
+ // log only to file if notif panel can be embedded to IM and IM is opened
+ if (add_notid_to_im && LLHandlerUtil::isIMFloaterOpened(notification))
+ {
+ LLHandlerUtil::logToIMP2P(notification, true);
+ }
+ else
+ {
+ LLHandlerUtil::logToIMP2P(notification);
+ }
}
}
}
@@ -155,9 +176,10 @@ bool LLOfferHandler::processNotification(const LLSD& notify)
}
else
{
- if (LLHandlerUtil::canAddNotifPanelToIM(notification))
+ if (LLHandlerUtil::canAddNotifPanelToIM(notification)
+ && !LLHandlerUtil::isIMFloaterOpened(notification))
{
- LLHandlerUtil::reloadIMFloaterMessages(notification);
+ LLHandlerUtil::decIMMesageCounter(notification);
}
mChannel->killToastByNotificationID(notification->getID());
}
@@ -170,8 +192,11 @@ bool LLOfferHandler::processNotification(const LLSD& notify)
void LLOfferHandler::onDeleteToast(LLToast* toast)
{
- // send a signal to the counter manager
- mDelNotificationSignal();
+ if (!LLHandlerUtil::canAddNotifPanelToIM(toast->getNotification()))
+ {
+ // send a signal to the counter manager
+ mDelNotificationSignal();
+ }
// send a signal to a listener to let him perform some action
// in this case listener is a SysWellWindow and it will remove a corresponding item from its list
@@ -185,7 +210,9 @@ void LLOfferHandler::onRejectToast(LLUUID& id)
if (notification
&& LLNotificationManager::getInstance()->getHandlerForNotification(
- notification->getType()) == this)
+ notification->getType()) == this
+ // don't delete notification since it may be used by IM floater
+ && !LLHandlerUtil::canAddNotifPanelToIM(notification))
{
LLNotifications::instance().cancel(notification);
}
diff --git a/indra/newview/llnotificationstorage.cpp b/indra/newview/llnotificationstorage.cpp
new file mode 100644
index 0000000000..20b40b4e1d
--- /dev/null
+++ b/indra/newview/llnotificationstorage.cpp
@@ -0,0 +1,227 @@
+/**
+* @file llnotificationstorage.cpp
+* @brief LLPersistentNotificationStorage class implementation
+*
+* $LicenseInfo:firstyear=2010&license=viewergpl$
+*
+* Copyright (c) 2010, Linden Research, Inc.
+*
+* Second Life Viewer Source Code
+* The source code in this file ("Source Code") is provided by Linden Lab
+* to you under the terms of the GNU General Public License, version 2.0
+* ("GPL"), unless you have obtained a separate licensing agreement
+* ("Other License"), formally executed by you and Linden Lab. Terms of
+* the GPL can be found in doc/GPL-license.txt in this distribution, or
+* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+*
+* There are special exceptions to the terms and conditions of the GPL as
+* it is applied to this Source Code. View the full text of the exception
+* in the file doc/FLOSS-exception.txt in this software distribution, or
+* online at
+* http://secondlifegrid.net/programs/open_source/licensing/flossexception
+*
+* By copying, modifying or distributing this software, you acknowledge
+* that you have read and understood your obligations described above,
+* and agree to abide by those obligations.
+*
+* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+* COMPLETENESS OR PERFORMANCE.
+* $/LicenseInfo$
+*/
+
+#include "llviewerprecompiledheaders.h" // must be first include
+#include "llnotificationstorage.h"
+
+#include "llxmlnode.h" // for linux compilers
+
+#include "llchannelmanager.h"
+#include "llscreenchannel.h"
+#include "llscriptfloater.h"
+#include "llsdserialize.h"
+#include "llviewermessage.h"
+
+//////////////////////////////////////////////////////////////////////////
+
+class LLResponderRegistry
+{
+public:
+
+ static void registerResponders();
+
+ static LLNotificationResponderInterface* createResponder(const std::string& notification_name, const LLSD& params);
+
+private:
+
+ template<typename RESPONDER_TYPE>
+ static LLNotificationResponderInterface* create(const LLSD& params)
+ {
+ RESPONDER_TYPE* responder = new RESPONDER_TYPE();
+ responder->fromLLSD(params);
+ return responder;
+ }
+
+ typedef boost::function<LLNotificationResponderInterface* (const LLSD& params)> responder_constructor_t;
+
+ static void add(const std::string& notification_name, const responder_constructor_t& ctr);
+
+private:
+
+ typedef std::map<std::string, responder_constructor_t> build_map_t;
+
+ static build_map_t sBuildMap;
+};
+
+//////////////////////////////////////////////////////////////////////////
+
+LLPersistentNotificationStorage::LLPersistentNotificationStorage()
+{
+ mFileName = gDirUtilp->getExpandedFilename ( LL_PATH_PER_SL_ACCOUNT, "open_notifications.xml" );
+}
+
+bool LLPersistentNotificationStorage::onPersistentChannelChanged(const LLSD& payload)
+{
+ // we ignore "load" messages, but rewrite the persistence file on any other
+ const std::string sigtype = payload["sigtype"].asString();
+ if ("load" != sigtype)
+ {
+ saveNotifications();
+ }
+ return false;
+}
+
+void LLPersistentNotificationStorage::saveNotifications()
+{
+ // TODO - think about save optimization.
+
+ llofstream notify_file(mFileName.c_str());
+ if (!notify_file.is_open())
+ {
+ llwarns << "Failed to open " << mFileName << llendl;
+ return;
+ }
+
+ LLSD output;
+ LLSD& data = output["data"];
+
+ LLNotificationChannelPtr history_channel = LLNotifications::instance().getChannel("Persistent");
+ LLNotificationSet::iterator it = history_channel->begin();
+
+ for ( ; history_channel->end() != it; ++it)
+ {
+ LLNotificationPtr notification = *it;
+
+ // After a notification was placed in Persist channel, it can become
+ // responded, expired or canceled - in this case we are should not save it
+ if(notification->isRespondedTo() || notification->isCancelled()
+ || notification->isExpired())
+ {
+ continue;
+ }
+
+ data.append(notification->asLLSD());
+ }
+
+ LLPointer<LLSDFormatter> formatter = new LLSDXMLFormatter();
+ formatter->format(output, notify_file, LLSDFormatter::OPTIONS_PRETTY);
+}
+
+void LLPersistentNotificationStorage::loadNotifications()
+{
+ LLResponderRegistry::registerResponders();
+
+ LLNotifications::instance().getChannel("Persistent")->
+ connectChanged(boost::bind(&LLPersistentNotificationStorage::onPersistentChannelChanged, this, _1));
+
+ llifstream notify_file(mFileName.c_str());
+ if (!notify_file.is_open())
+ {
+ llwarns << "Failed to open " << mFileName << llendl;
+ return;
+ }
+
+ LLSD input;
+ LLPointer<LLSDParser> parser = new LLSDXMLParser();
+ if (parser->parse(notify_file, input, LLSDSerialize::SIZE_UNLIMITED) < 0)
+ {
+ llwarns << "Failed to parse open notifications" << llendl;
+ return;
+ }
+
+ if (input.isUndefined())
+ {
+ return;
+ }
+
+ LLSD& data = input["data"];
+ if (data.isUndefined())
+ {
+ return;
+ }
+
+ using namespace LLNotificationsUI;
+ LLScreenChannel* notification_channel = dynamic_cast<LLScreenChannel*>(LLChannelManager::getInstance()->
+ findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
+
+ LLNotifications& instance = LLNotifications::instance();
+
+ for (LLSD::array_const_iterator notification_it = data.beginArray();
+ notification_it != data.endArray();
+ ++notification_it)
+ {
+ LLSD notification_params = *notification_it;
+ LLNotificationPtr notification(new LLNotification(notification_params));
+
+ LLNotificationResponderPtr responder(LLResponderRegistry::
+ createResponder(notification_params["name"], notification_params["responder"]));
+ notification->setResponseFunctor(responder);
+
+ instance.add(notification);
+
+ // hide script floaters so they don't confuse the user and don't overlap startup toast
+ LLScriptFloaterManager::getInstance()->setFloaterVisible(notification->getID(), false);
+
+ if(notification_channel)
+ {
+ // hide saved toasts so they don't confuse the user
+ notification_channel->hideToast(notification->getID());
+ }
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+LLResponderRegistry::build_map_t LLResponderRegistry::sBuildMap;
+
+void LLResponderRegistry::registerResponders()
+{
+ sBuildMap.clear();
+
+ add("ObjectGiveItem", &create<LLOfferInfo>);
+ add("UserGiveItem", &create<LLOfferInfo>);
+}
+
+LLNotificationResponderInterface* LLResponderRegistry::createResponder(const std::string& notification_name, const LLSD& params)
+{
+ build_map_t::const_iterator it = sBuildMap.find(notification_name);
+ if(sBuildMap.end() == it)
+ {
+ return NULL;
+ }
+ responder_constructor_t ctr = it->second;
+ return ctr(params);
+}
+
+void LLResponderRegistry::add(const std::string& notification_name, const responder_constructor_t& ctr)
+{
+ if(sBuildMap.find(notification_name) != sBuildMap.end())
+ {
+ llwarns << "Responder is already registered : " << notification_name << llendl;
+ llassert(!"Responder already registered");
+ }
+ sBuildMap[notification_name] = ctr;
+}
+
+// EOF
diff --git a/indra/newview/llnotificationstorage.h b/indra/newview/llnotificationstorage.h
new file mode 100644
index 0000000000..5050781a85
--- /dev/null
+++ b/indra/newview/llnotificationstorage.h
@@ -0,0 +1,65 @@
+/**
+* @file llnotificationstorage.h
+* @brief LLNotificationStorage class declaration
+*
+* $LicenseInfo:firstyear=2010&license=viewergpl$
+*
+* Copyright (c) 2010, Linden Research, Inc.
+*
+* Second Life Viewer Source Code
+* The source code in this file ("Source Code") is provided by Linden Lab
+* to you under the terms of the GNU General Public License, version 2.0
+* ("GPL"), unless you have obtained a separate licensing agreement
+* ("Other License"), formally executed by you and Linden Lab. Terms of
+* the GPL can be found in doc/GPL-license.txt in this distribution, or
+* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+*
+* There are special exceptions to the terms and conditions of the GPL as
+* it is applied to this Source Code. View the full text of the exception
+* in the file doc/FLOSS-exception.txt in this software distribution, or
+* online at
+* http://secondlifegrid.net/programs/open_source/licensing/flossexception
+*
+* By copying, modifying or distributing this software, you acknowledge
+* that you have read and understood your obligations described above,
+* and agree to abide by those obligations.
+*
+* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+* COMPLETENESS OR PERFORMANCE.
+* $/LicenseInfo$
+*/
+
+#ifndef LL_NOTIFICATIONSTORAGE_H
+#define LL_NOTIFICATIONSTORAGE_H
+
+#include "llnotifications.h"
+
+// Class that saves not responded(unread) notifications.
+// Unread notifications are saved in open_notifications.xml in SL account folder
+//
+// Notifications that should be saved(if unread) are marked with persist="true" in notifications.xml
+// Notifications using functor responders are saved automatically (see llviewermessage.cpp
+// lure_callback_reg for example).
+// Notifications using object responders(LLOfferInfo) need additional tuning. Responder object should
+// be a) serializable(implement LLNotificationResponderInterface),
+// b) registered with LLResponderRegistry (found in llnotificationstorage.cpp).
+class LLPersistentNotificationStorage : public LLSingleton<LLPersistentNotificationStorage>
+{
+ LOG_CLASS(LLPersistentNotificationStorage);
+public:
+
+ LLPersistentNotificationStorage();
+
+ void saveNotifications();
+
+ void loadNotifications();
+
+private:
+
+ bool onPersistentChannelChanged(const LLSD& payload);
+
+ std::string mFileName;
+};
+
+#endif // LL_NOTIFICATIONSTORAGE_H
diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp
index 83a2215ac6..a06a5770a2 100644
--- a/indra/newview/llnotificationtiphandler.cpp
+++ b/indra/newview/llnotificationtiphandler.cpp
@@ -40,10 +40,11 @@
#include "lltoastnotifypanel.h"
#include "llviewercontrol.h"
#include "llviewerwindow.h"
+#include "llnotificationmanager.h"
+#include "llpaneltiptoast.h"
using namespace LLNotificationsUI;
-
//--------------------------------------------------------------------------
LLTipHandler::LLTipHandler(e_notification_type type, const LLSD& id)
{
@@ -51,6 +52,10 @@ LLTipHandler::LLTipHandler(e_notification_type type, const LLSD& id)
// Getting a Channel for our notifications
mChannel = LLChannelManager::getInstance()->createNotificationChannel();
+
+ LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
+ if(channel)
+ channel->setOnRejectToastCallback(boost::bind(&LLTipHandler::onRejectToast, this, _1));
}
//--------------------------------------------------------------------------
@@ -101,11 +106,16 @@ bool LLTipHandler::processNotification(const LLSD& notify)
}
}
+ std::string session_name = notification->getPayload()["SESSION_NAME"];
const std::string name = notification->getSubstitutions()["NAME"];
+ if (session_name.empty())
+ {
+ session_name = name;
+ }
LLUUID from_id = notification->getPayload()["from_id"];
if (LLHandlerUtil::canLogToIM(notification))
{
- LLHandlerUtil::logToIM(IM_NOTHING_SPECIAL, name, name,
+ LLHandlerUtil::logToIM(IM_NOTHING_SPECIAL, session_name, name,
notification->getMessage(), from_id, from_id);
}
@@ -114,7 +124,13 @@ bool LLTipHandler::processNotification(const LLSD& notify)
LLHandlerUtil::spawnIMSession(name, from_id);
}
- LLToastNotifyPanel* notify_box = new LLToastNotifyPanel(notification);
+ // don't spawn toast for inventory accepted/declined offers if respective IM window is open (EXT-5909)
+ if (!LLHandlerUtil::canSpawnToast(notification))
+ {
+ return true;
+ }
+
+ LLToastPanel* notify_box = LLToastPanel::buidPanelFromNotification(notification);
LLToast::Params p;
p.notif_id = notification->getID();
@@ -124,6 +140,8 @@ bool LLTipHandler::processNotification(const LLSD& notify)
p.is_tip = true;
p.can_be_stored = false;
+ removeExclusiveNotifications(notification);
+
LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(mChannel);
if(channel)
channel->addToast(p);
@@ -142,4 +160,14 @@ void LLTipHandler::onDeleteToast(LLToast* toast)
//--------------------------------------------------------------------------
+void LLTipHandler::onRejectToast(const LLUUID& id)
+{
+ LLNotificationPtr notification = LLNotifications::instance().find(id);
+ if (notification
+ && LLNotificationManager::getInstance()->getHandlerForNotification(
+ notification->getType()) == this)
+ {
+ LLNotifications::instance().cancel(notification);
+ }
+}
diff --git a/indra/newview/lloutfitobserver.cpp b/indra/newview/lloutfitobserver.cpp
new file mode 100644
index 0000000000..03414b9964
--- /dev/null
+++ b/indra/newview/lloutfitobserver.cpp
@@ -0,0 +1,147 @@
+/**
+ * @file lloutfitobserver.cpp
+ * @brief Outfit observer facade.
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llappearancemgr.h"
+#include "lloutfitobserver.h"
+#include "llinventorymodel.h"
+#include "llviewerinventory.h"
+
+LLOutfitObserver::LLOutfitObserver() :
+ mCOFLastVersion(LLViewerInventoryCategory::VERSION_UNKNOWN)
+{
+ gInventory.addObserver(this);
+}
+
+LLOutfitObserver::~LLOutfitObserver()
+{
+ if (gInventory.containsObserver(this))
+ {
+ gInventory.removeObserver(this);
+ }
+}
+
+void LLOutfitObserver::changed(U32 mask)
+{
+ if (!gInventory.isInventoryUsable())
+ return;
+
+ checkCOF();
+
+ checkBaseOutfit();
+}
+
+// static
+S32 LLOutfitObserver::getCategoryVersion(const LLUUID& cat_id)
+{
+ LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id);
+ if (!cat)
+ return LLViewerInventoryCategory::VERSION_UNKNOWN;
+
+ return cat->getVersion();
+}
+
+// static
+const std::string& LLOutfitObserver::getCategoryName(const LLUUID& cat_id)
+{
+ LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id);
+ if (!cat)
+ return LLStringUtil::null;
+
+ return cat->getName();
+}
+
+bool LLOutfitObserver::checkCOF()
+{
+ LLUUID cof = LLAppearanceMgr::getInstance()->getCOF();
+ if (cof.isNull())
+ return false;
+
+ S32 cof_version = getCategoryVersion(cof);
+
+ if (cof_version == mCOFLastVersion)
+ return false;
+
+ mCOFLastVersion = cof_version;
+
+ // dirtiness state should be updated before sending signal
+ LLAppearanceMgr::getInstance()->updateIsDirty();
+ mCOFChanged();
+
+ return true;
+}
+
+void LLOutfitObserver::checkBaseOutfit()
+{
+ LLUUID baseoutfit_id =
+ LLAppearanceMgr::getInstance()->getBaseOutfitUUID();
+
+ if (baseoutfit_id == mBaseOutfitId)
+ {
+ if (baseoutfit_id.isNull())
+ return;
+
+ const S32 baseoutfit_ver = getCategoryVersion(baseoutfit_id);
+ const std::string& baseoutfit_name = getCategoryName(baseoutfit_id);
+
+ if (baseoutfit_ver == mBaseOutfitLastVersion
+ // renaming category doesn't change version, so it's need to check it
+ && baseoutfit_name == mLastBaseOutfitName)
+ return;
+ }
+ else
+ {
+ mBaseOutfitId = baseoutfit_id;
+ mBOFReplaced();
+
+ if (baseoutfit_id.isNull())
+ return;
+ }
+
+ mBaseOutfitLastVersion = getCategoryVersion(mBaseOutfitId);
+ mLastBaseOutfitName = getCategoryName(baseoutfit_id);
+
+ LLAppearanceMgr& app_mgr = LLAppearanceMgr::instance();
+ // dirtiness state should be updated before sending signal
+ app_mgr.updateIsDirty();
+ mBOFChanged();
+
+ if (mLastOutfitDirtiness != app_mgr.isOutfitDirty())
+ {
+ if(!app_mgr.isOutfitDirty())
+ {
+ mCOFSaved();
+ }
+ mLastOutfitDirtiness = app_mgr.isOutfitDirty();
+ }
+}
diff --git a/indra/newview/lloutfitobserver.h b/indra/newview/lloutfitobserver.h
new file mode 100644
index 0000000000..3a66b5ea9f
--- /dev/null
+++ b/indra/newview/lloutfitobserver.h
@@ -0,0 +1,99 @@
+/**
+ * @file lloutfitobserver.h
+ * @brief Outfit observer facade.
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_OUTFITOBSERVER_H
+#define LL_OUTFITOBSERVER_H
+
+#include "llsingleton.h"
+
+/**
+ * Outfit observer facade that provides simple possibility to subscribe on
+ * BOF(base outfit) replaced, BOF changed, COF(current outfit) changed events.
+ */
+class LLOutfitObserver: public LLInventoryObserver, public LLSingleton<LLOutfitObserver>
+{
+public:
+ virtual ~LLOutfitObserver();
+
+ friend class LLSingleton<LLOutfitObserver>;
+
+ virtual void changed(U32 mask);
+
+ void notifyOutfitLockChanged() { mOutfitLockChanged(); }
+
+ typedef boost::signals2::signal<void (void)> signal_t;
+
+ void addBOFReplacedCallback(const signal_t::slot_type& cb) { mBOFReplaced.connect(cb); }
+
+ void addBOFChangedCallback(const signal_t::slot_type& cb) { mBOFChanged.connect(cb); }
+
+ void addCOFChangedCallback(const signal_t::slot_type& cb) { mCOFChanged.connect(cb); }
+
+ void addCOFSavedCallback(const signal_t::slot_type& cb) { mCOFSaved.connect(cb); }
+
+ void addOutfitLockChangedCallback(const signal_t::slot_type& cb) { mOutfitLockChanged.connect(cb); }
+
+protected:
+ LLOutfitObserver();
+
+ /** Get a version of an inventory category specified by its UUID */
+ static S32 getCategoryVersion(const LLUUID& cat_id);
+
+ static const std::string& getCategoryName(const LLUUID& cat_id);
+
+ bool checkCOF();
+
+ void checkBaseOutfit();
+
+ //last version number of a COF category
+ S32 mCOFLastVersion;
+
+ LLUUID mBaseOutfitId;
+
+ S32 mBaseOutfitLastVersion;
+ std::string mLastBaseOutfitName;
+
+ bool mLastOutfitDirtiness;
+
+private:
+ signal_t mBOFReplaced;
+ signal_t mBOFChanged;
+ signal_t mCOFChanged;
+ signal_t mCOFSaved;
+
+ /**
+ * Signal for changing state of outfit lock.
+ */
+ signal_t mOutfitLockChanged;
+};
+
+#endif /* LL_OUTFITOBSERVER_H */
diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp
new file mode 100644
index 0000000000..c5043e1c3d
--- /dev/null
+++ b/indra/newview/lloutfitslist.cpp
@@ -0,0 +1,750 @@
+/**
+ * @file lloutfitslist.cpp
+ * @brief List of agent's outfits for My Appearance side panel.
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "lloutfitslist.h"
+
+// llcommon
+#include "llcommonutils.h"
+
+#include "llaccordionctrl.h"
+#include "llaccordionctrltab.h"
+#include "llagentwearables.h"
+#include "llappearancemgr.h"
+#include "llinventoryfunctions.h"
+#include "llinventorymodel.h"
+#include "lllistcontextmenu.h"
+#include "llnotificationsutil.h"
+#include "lloutfitobserver.h"
+#include "llsidetray.h"
+#include "lltransutil.h"
+#include "llviewermenu.h"
+#include "llvoavatar.h"
+#include "llvoavatarself.h"
+#include "llwearableitemslist.h"
+
+static bool is_tab_header_clicked(LLAccordionCtrlTab* tab, S32 y);
+
+static const LLOutfitTabNameComparator OUTFIT_TAB_NAME_COMPARATOR;
+
+/*virtual*/
+bool LLOutfitTabNameComparator::compare(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2) const
+{
+ std::string name1 = tab1->getTitle();
+ std::string name2 = tab2->getTitle();
+
+ LLStringUtil::toUpper(name1);
+ LLStringUtil::toUpper(name2);
+
+ return name1 < name2;
+}
+
+//////////////////////////////////////////////////////////////////////////
+
+class OutfitContextMenu : public LLListContextMenu
+{
+protected:
+ /* virtual */ LLContextMenu* createMenu()
+ {
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+ LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
+ LLUUID selected_id = mUUIDs.front();
+
+ registrar.add("Outfit.WearReplace",
+ boost::bind(&LLAppearanceMgr::replaceCurrentOutfit, &LLAppearanceMgr::instance(), selected_id));
+ registrar.add("Outfit.WearAdd",
+ boost::bind(&LLAppearanceMgr::addCategoryToCurrentOutfit, &LLAppearanceMgr::instance(), selected_id));
+ registrar.add("Outfit.TakeOff",
+ boost::bind(&LLAppearanceMgr::takeOffOutfit, &LLAppearanceMgr::instance(), selected_id));
+ registrar.add("Outfit.Edit", boost::bind(editOutfit));
+ registrar.add("Outfit.Rename", boost::bind(renameOutfit, selected_id));
+ registrar.add("Outfit.Delete", boost::bind(deleteOutfit, selected_id));
+
+ enable_registrar.add("Outfit.OnEnable", boost::bind(&OutfitContextMenu::onEnable, this, _2));
+ enable_registrar.add("Outfit.OnVisible", boost::bind(&OutfitContextMenu::onVisible, this, _2));
+
+ return createFromFile("menu_outfit_tab.xml");
+ }
+
+ bool onEnable(LLSD::String param)
+ {
+ LLUUID outfit_cat_id = mUUIDs.back();
+
+ if ("rename" == param)
+ {
+ return get_is_category_renameable(&gInventory, outfit_cat_id);
+ }
+ else if ("wear_add" == param)
+ {
+ return LLAppearanceMgr::getCanAddToCOF(outfit_cat_id);
+ }
+ else if ("take_off" == param)
+ {
+ return LLAppearanceMgr::getCanRemoveFromCOF(outfit_cat_id);
+ }
+
+ return true;
+ }
+
+ bool onVisible(LLSD::String param)
+ {
+ LLUUID outfit_cat_id = mUUIDs.back();
+ bool is_worn = LLAppearanceMgr::instance().getBaseOutfitUUID() == outfit_cat_id;
+
+ if ("edit" == param)
+ {
+ return is_worn;
+ }
+ else if ("wear_replace" == param)
+ {
+ return !is_worn;
+ }
+ else if ("delete" == param)
+ {
+ return LLAppearanceMgr::instance().getCanRemoveOutfit(outfit_cat_id);
+ }
+
+ return true;
+ }
+
+ static void editOutfit()
+ {
+ LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit"));
+ }
+
+ static void renameOutfit(const LLUUID& outfit_cat_id)
+ {
+ LLAppearanceMgr::instance().renameOutfit(outfit_cat_id);
+ }
+
+ static void deleteOutfit(const LLUUID& outfit_cat_id)
+ {
+ remove_category(&gInventory, outfit_cat_id);
+ }
+};
+
+//////////////////////////////////////////////////////////////////////////
+
+static LLRegisterPanelClassWrapper<LLOutfitsList> t_outfits_list("outfits_list");
+
+LLOutfitsList::LLOutfitsList()
+ : LLPanel()
+ , mAccordion(NULL)
+ , mListCommands(NULL)
+ , mIsInitialized(false)
+ , mItemSelected(false)
+{
+ mCategoriesObserver = new LLInventoryCategoriesObserver();
+
+ mOutfitMenu = new OutfitContextMenu();
+}
+
+LLOutfitsList::~LLOutfitsList()
+{
+ delete mOutfitMenu;
+
+ if (gInventory.containsObserver(mCategoriesObserver))
+ {
+ gInventory.removeObserver(mCategoriesObserver);
+ delete mCategoriesObserver;
+ }
+}
+
+BOOL LLOutfitsList::postBuild()
+{
+ mAccordion = getChild<LLAccordionCtrl>("outfits_accordion");
+ mAccordion->setComparator(&OUTFIT_TAB_NAME_COMPARATOR);
+
+ return TRUE;
+}
+
+//virtual
+void LLOutfitsList::onOpen(const LLSD& /*info*/)
+{
+ if (!mIsInitialized)
+ {
+ // *TODO: I'm not sure is this check necessary but it never match while developing.
+ if (!gInventory.isInventoryUsable())
+ return;
+
+ const LLUUID outfits = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+
+ // *TODO: I'm not sure is this check necessary but it never match while developing.
+ LLViewerInventoryCategory* category = gInventory.getCategory(outfits);
+ if (!category)
+ return;
+
+ gInventory.addObserver(mCategoriesObserver);
+
+ // Start observing changes in "My Outfits" category.
+ mCategoriesObserver->addCategory(outfits,
+ boost::bind(&LLOutfitsList::refreshList, this, outfits));
+
+ const LLUUID cof = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
+
+ // Start observing changes in Current Outfit category.
+ mCategoriesObserver->addCategory(cof, boost::bind(&LLOutfitsList::onCOFChanged, this));
+
+ LLOutfitObserver::instance().addBOFChangedCallback(boost::bind(&LLOutfitsList::highlightBaseOutfit, this));
+ LLOutfitObserver::instance().addBOFReplacedCallback(boost::bind(&LLOutfitsList::highlightBaseOutfit, this));
+
+ // Fetch "My Outfits" contents and refresh the list to display
+ // initially fetched items. If not all items are fetched now
+ // the observer will refresh the list as soon as the new items
+ // arrive.
+ category->fetch();
+ refreshList(outfits);
+ highlightBaseOutfit();
+
+ mIsInitialized = true;
+ }
+}
+
+void LLOutfitsList::refreshList(const LLUUID& category_id)
+{
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t item_array;
+
+ // Collect all sub-categories of a given category.
+ LLIsType is_category(LLAssetType::AT_CATEGORY);
+ gInventory.collectDescendentsIf(
+ category_id,
+ cat_array,
+ item_array,
+ LLInventoryModel::EXCLUDE_TRASH,
+ is_category);
+
+ uuid_vec_t vadded;
+ uuid_vec_t vremoved;
+
+ // Create added and removed items vectors.
+ computeDifference(cat_array, vadded, vremoved);
+
+ // Handle added tabs.
+ for (uuid_vec_t::const_iterator iter = vadded.begin();
+ iter != vadded.end();
+ ++iter)
+ {
+ const LLUUID cat_id = (*iter);
+ LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);
+ if (!cat) continue;
+
+ std::string name = cat->getName();
+
+ static LLXMLNodePtr accordionXmlNode = getAccordionTabXMLNode();
+ LLAccordionCtrlTab* tab = LLUICtrlFactory::defaultBuilder<LLAccordionCtrlTab>(accordionXmlNode, NULL, NULL);
+
+ tab->setName(name);
+ tab->setTitle(name);
+
+ // *TODO: LLUICtrlFactory::defaultBuilder does not use "display_children" from xml. Should be investigated.
+ tab->setDisplayChildren(false);
+ mAccordion->addCollapsibleCtrl(tab);
+
+ // Start observing the new outfit category.
+ LLWearableItemsList* list = tab->getChild<LLWearableItemsList>("wearable_items_list");
+ if (!mCategoriesObserver->addCategory(cat_id, boost::bind(&LLWearableItemsList::updateList, list, cat_id)))
+ {
+ // Remove accordion tab if category could not be added to observer.
+ mAccordion->removeCollapsibleCtrl(tab);
+ continue;
+ }
+
+ // Map the new tab with outfit category UUID.
+ mOutfitsMap.insert(LLOutfitsList::outfits_map_value_t(cat_id, tab));
+
+ tab->setRightMouseDownCallback(boost::bind(&LLOutfitsList::onAccordionTabRightClick, this,
+ _1, _2, _3, cat_id));
+
+ // Setting tab focus callback to monitor currently selected outfit.
+ tab->setFocusReceivedCallback(boost::bind(&LLOutfitsList::changeOutfitSelection, this, list, cat_id));
+
+ // Setting list commit callback to monitor currently selected wearable item.
+ list->setCommitCallback(boost::bind(&LLOutfitsList::onSelectionChange, this, _1));
+
+ // Setting list refresh callback to apply filter on list change.
+ list->setRefreshCompleteCallback(boost::bind(&LLOutfitsList::onFilteredWearableItemsListRefresh, this, _1));
+
+ list->setRightMouseDownCallback(boost::bind(&LLOutfitsList::onWearableItemsListRightClick, this, _1, _2, _3));
+
+ // Fetch the new outfit contents.
+ cat->fetch();
+
+ // Refresh the list of outfit items after fetch().
+ // Further list updates will be triggered by the category observer.
+ list->updateList(cat_id);
+
+ // If filter is currently applied we store the initial tab state and
+ // open it to show matched items if any.
+ if (!mFilterSubString.empty())
+ {
+ tab->notifyChildren(LLSD().with("action","store_state"));
+ tab->setDisplayChildren(true);
+
+ // Setting mForceRefresh flag will make the list refresh its contents
+ // even if it is not currently visible. This is required to apply the
+ // filter to the newly added list.
+ list->setForceRefresh(true);
+
+ list->setFilterSubString(mFilterSubString);
+ }
+ }
+
+ // Handle removed tabs.
+ for (uuid_vec_t::const_iterator iter=vremoved.begin(); iter != vremoved.end(); iter++)
+ {
+ outfits_map_t::iterator outfits_iter = mOutfitsMap.find((*iter));
+ if (outfits_iter != mOutfitsMap.end())
+ {
+ const LLUUID& outfit_id = outfits_iter->first;
+ LLAccordionCtrlTab* tab = outfits_iter->second;
+
+ // An outfit is removed from the list. Do the following:
+ // 1. Remove outfit category from observer to stop monitoring its changes.
+ mCategoriesObserver->removeCategory(outfit_id);
+
+ // 2. Remove the outfit from selection.
+ deselectOutfit(outfit_id);
+
+ // 3. Remove category UUID to accordion tab mapping.
+ mOutfitsMap.erase(outfits_iter);
+
+ // 4. Remove outfit tab from accordion.
+ mAccordion->removeCollapsibleCtrl(tab);
+ }
+ }
+
+ // Get changed items from inventory model and update outfit tabs
+ // which might have been renamed.
+ const LLInventoryModel::changed_items_t& changed_items = gInventory.getChangedIDs();
+ for (LLInventoryModel::changed_items_t::const_iterator items_iter = changed_items.begin();
+ items_iter != changed_items.end();
+ ++items_iter)
+ {
+ updateOutfitTab(*items_iter);
+ }
+
+ mAccordion->sort();
+}
+
+void LLOutfitsList::highlightBaseOutfit()
+{
+ // id of base outfit
+ LLUUID base_id = LLAppearanceMgr::getInstance()->getBaseOutfitUUID();
+ if (base_id != mHighlightedOutfitUUID)
+ {
+ if (mOutfitsMap[mHighlightedOutfitUUID])
+ {
+ mOutfitsMap[mHighlightedOutfitUUID]->setTitleFontStyle("NORMAL");
+ }
+
+ mHighlightedOutfitUUID = base_id;
+ }
+ if (mOutfitsMap[base_id])
+ {
+ mOutfitsMap[base_id]->setTitleFontStyle("BOLD");
+ }
+}
+
+void LLOutfitsList::onSelectionChange(LLUICtrl* ctrl)
+{
+ LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(ctrl);
+ if (!list) return;
+
+ LLViewerInventoryItem *item = gInventory.getItem(list->getSelectedUUID());
+ if (!item) return;
+
+ changeOutfitSelection(list, item->getParentUUID());
+}
+
+void LLOutfitsList::performAction(std::string action)
+{
+ if (mSelectedOutfitUUID.isNull()) return;
+
+ LLViewerInventoryCategory* cat = gInventory.getCategory(mSelectedOutfitUUID);
+ if (!cat) return;
+
+ if ("replaceoutfit" == action)
+ {
+ LLAppearanceMgr::instance().wearInventoryCategory( cat, FALSE, FALSE );
+ }
+ else if ("addtooutfit" == action)
+ {
+ LLAppearanceMgr::instance().wearInventoryCategory( cat, FALSE, TRUE );
+ }
+ else if ("rename_outfit" == action)
+ {
+ LLAppearanceMgr::instance().renameOutfit(mSelectedOutfitUUID);
+ }
+}
+
+void LLOutfitsList::setFilterSubString(const std::string& string)
+{
+ applyFilter(string);
+
+ mFilterSubString = string;
+}
+
+boost::signals2::connection LLOutfitsList::addSelectionChangeCallback(selection_change_callback_t cb)
+{
+ return mSelectionChangeSignal.connect(cb);
+}
+
+bool LLOutfitsList::hasItemSelected()
+{
+ return mItemSelected;
+}
+
+//////////////////////////////////////////////////////////////////////////
+// Private methods
+//////////////////////////////////////////////////////////////////////////
+LLXMLNodePtr LLOutfitsList::getAccordionTabXMLNode()
+{
+ LLXMLNodePtr xmlNode = NULL;
+ bool success = LLUICtrlFactory::getLayeredXMLNode("outfit_accordion_tab.xml", xmlNode);
+ if (!success)
+ {
+ llwarns << "Failed to read xml of Outfit's Accordion Tab from outfit_accordion_tab.xml" << llendl;
+ return NULL;
+ }
+
+ return xmlNode;
+}
+
+void LLOutfitsList::computeDifference(
+ const LLInventoryModel::cat_array_t& vcats,
+ uuid_vec_t& vadded,
+ uuid_vec_t& vremoved)
+{
+ uuid_vec_t vnew;
+ // Creating a vector of newly collected sub-categories UUIDs.
+ for (LLInventoryModel::cat_array_t::const_iterator iter = vcats.begin();
+ iter != vcats.end();
+ iter++)
+ {
+ vnew.push_back((*iter)->getUUID());
+ }
+
+ uuid_vec_t vcur;
+ // Creating a vector of currently displayed sub-categories UUIDs.
+ for (outfits_map_t::const_iterator iter = mOutfitsMap.begin();
+ iter != mOutfitsMap.end();
+ iter++)
+ {
+ vcur.push_back((*iter).first);
+ }
+
+ LLCommonUtils::computeDifference(vnew, vcur, vadded, vremoved);
+}
+
+void LLOutfitsList::updateOutfitTab(const LLUUID& category_id)
+{
+ outfits_map_t::iterator outfits_iter = mOutfitsMap.find(category_id);
+ if (outfits_iter != mOutfitsMap.end())
+ {
+ LLViewerInventoryCategory *cat = gInventory.getCategory(category_id);
+ if (!cat) return;
+
+ std::string name = cat->getName();
+
+ // Update tab name with the new category name.
+ LLAccordionCtrlTab* tab = outfits_iter->second;
+ if (tab)
+ {
+ tab->setName(name);
+ tab->setTitle(name);
+ }
+ }
+}
+
+void LLOutfitsList::changeOutfitSelection(LLWearableItemsList* list, const LLUUID& category_id)
+{
+ MASK mask = gKeyboard->currentMask(TRUE);
+
+ // Reset selection in all previously selected tabs except for the current
+ // if new selection is started.
+ if (list && !(mask & MASK_CONTROL))
+ {
+ for (wearables_lists_map_t::iterator iter = mSelectedListsMap.begin();
+ iter != mSelectedListsMap.end();
+ ++iter)
+ {
+ LLWearableItemsList* selected_list = (*iter).second;
+ if (selected_list != list)
+ {
+ selected_list->resetSelection();
+ }
+ }
+
+ // Clear current selection.
+ mSelectedListsMap.clear();
+ }
+
+ mItemSelected = list && (list->getSelectedItem() != NULL);
+
+ mSelectedListsMap.insert(wearables_lists_map_value_t(category_id, list));
+ setSelectedOutfitUUID(category_id);
+}
+
+void LLOutfitsList::setSelectedOutfitUUID(const LLUUID& category_id)
+{
+ mSelectionChangeSignal(mSelectedOutfitUUID = category_id);
+}
+
+void LLOutfitsList::deselectOutfit(const LLUUID& category_id)
+{
+ // Remove selected lists map entry.
+ mSelectedListsMap.erase(category_id);
+
+ // Reset selection if the outfit is selected.
+ if (category_id == mSelectedOutfitUUID)
+ {
+ setSelectedOutfitUUID(LLUUID::null);
+ }
+}
+
+void LLOutfitsList::restoreOutfitSelection(LLAccordionCtrlTab* tab, const LLUUID& category_id)
+{
+ // Try restoring outfit selection after filtering.
+ if (mAccordion->getSelectedTab() == tab)
+ {
+ setSelectedOutfitUUID(category_id);
+ }
+}
+
+void LLOutfitsList::onFilteredWearableItemsListRefresh(LLUICtrl* ctrl)
+{
+ if (!ctrl || mFilterSubString.empty())
+ return;
+
+ for (outfits_map_t::iterator
+ iter = mOutfitsMap.begin(),
+ iter_end = mOutfitsMap.end();
+ iter != iter_end; ++iter)
+ {
+ LLAccordionCtrlTab* tab = iter->second;
+ if (!tab) continue;
+
+ LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView());
+ if (list != ctrl) continue;
+
+ applyFilterToTab(iter->first, tab, mFilterSubString);
+ }
+}
+
+void LLOutfitsList::applyFilter(const std::string& new_filter_substring)
+{
+ mAccordion->setFilterSubString(new_filter_substring);
+
+ for (outfits_map_t::iterator
+ iter = mOutfitsMap.begin(),
+ iter_end = mOutfitsMap.end();
+ iter != iter_end; ++iter)
+ {
+ LLAccordionCtrlTab* tab = iter->second;
+ if (!tab) continue;
+
+ bool more_restrictive = mFilterSubString.size() < new_filter_substring.size() && !new_filter_substring.substr(0, mFilterSubString.size()).compare(mFilterSubString);
+
+ // Restore tab visibility in case of less restrictive filter
+ // to compare it with updated string if it was previously hidden.
+ if (!more_restrictive)
+ {
+ tab->setVisible(TRUE);
+ }
+
+ LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView());
+ if (list)
+ {
+ list->setFilterSubString(new_filter_substring);
+ }
+
+ if(mFilterSubString.empty() && !new_filter_substring.empty())
+ {
+ //store accordion tab state when filter is not empty
+ tab->notifyChildren(LLSD().with("action","store_state"));
+ }
+
+ if (!new_filter_substring.empty())
+ {
+ applyFilterToTab(iter->first, tab, new_filter_substring);
+
+ if (tab->getVisible())
+ {
+ // Open tab if it has passed the filter.
+ tab->setDisplayChildren(true);
+ }
+ else
+ {
+ // Set force refresh flag to refresh not visible list
+ // when some changes occur in it.
+ list->setForceRefresh(true);
+ }
+ }
+ else
+ {
+ // restore tab title when filter is empty
+ tab->setTitle(tab->getTitle());
+
+ //restore accordion state after all those accodrion tab manipulations
+ tab->notifyChildren(LLSD().with("action","restore_state"));
+
+ // Try restoring the tab selection.
+ restoreOutfitSelection(tab, iter->first);
+ }
+ }
+}
+
+void LLOutfitsList::applyFilterToTab(
+ const LLUUID& category_id,
+ LLAccordionCtrlTab* tab,
+ const std::string& filter_substring)
+{
+ if (!tab) return;
+ LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView());
+ if (!list) return;
+
+ std::string title = tab->getTitle();
+ LLStringUtil::toUpper(title);
+
+ std::string cur_filter = filter_substring;
+ LLStringUtil::toUpper(cur_filter);
+
+ tab->setTitle(tab->getTitle(), cur_filter);
+
+ if (std::string::npos == title.find(cur_filter))
+ {
+ // hide tab if its title doesn't pass filter
+ // and it has no visible items
+ tab->setVisible(list->size() > 0);
+
+ // remove title highlighting because it might
+ // have been previously highlighted by less restrictive filter
+ tab->setTitle(tab->getTitle());
+
+ // Remove the tab from selection.
+ deselectOutfit(category_id);
+ }
+ else
+ {
+ // Try restoring the tab selection.
+ restoreOutfitSelection(tab, category_id);
+ }
+}
+
+void LLOutfitsList::onAccordionTabRightClick(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& cat_id)
+{
+ LLAccordionCtrlTab* tab = dynamic_cast<LLAccordionCtrlTab*>(ctrl);
+ if(mOutfitMenu && is_tab_header_clicked(tab, y) && cat_id.notNull())
+ {
+ // Focus tab header to trigger tab selection change.
+ LLUICtrl* header = tab->findChild<LLUICtrl>("dd_header");
+ if (header)
+ {
+ header->setFocus(TRUE);
+ }
+
+ uuid_vec_t selected_uuids;
+ selected_uuids.push_back(cat_id);
+ mOutfitMenu->show(ctrl, selected_uuids, x, y);
+ }
+}
+
+void LLOutfitsList::onWearableItemsListRightClick(LLUICtrl* ctrl, S32 x, S32 y)
+{
+ LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(ctrl);
+ if (!list) return;
+
+ uuid_vec_t selected_uuids;
+
+ // Collect seleted items from all selected lists.
+ for (wearables_lists_map_t::iterator iter = mSelectedListsMap.begin();
+ iter != mSelectedListsMap.end();
+ ++iter)
+ {
+ uuid_vec_t uuids;
+ (*iter).second->getSelectedUUIDs(uuids);
+
+ S32 prev_size = selected_uuids.size();
+ selected_uuids.resize(prev_size + uuids.size());
+ std::copy(uuids.begin(), uuids.end(), selected_uuids.begin() + prev_size);
+ }
+
+ LLWearableItemsList::ContextMenu::instance().show(list, selected_uuids, x, y);
+}
+
+void LLOutfitsList::onCOFChanged()
+{
+ LLInventoryModel::changed_items_t changed_linked_items;
+
+ const LLInventoryModel::changed_items_t& changed_items = gInventory.getChangedIDs();
+ for (LLInventoryModel::changed_items_t::const_iterator iter = changed_items.begin();
+ iter != changed_items.end();
+ ++iter)
+ {
+ LLViewerInventoryItem* item = gInventory.getItem(*iter);
+ if (item)
+ {
+ // From gInventory we get the UUIDs of new links added to COF
+ // or removed from COF. These links UUIDs are not the same UUIDs
+ // that we have in each wearable items list. So we collect base items
+ // UUIDs to find all items or links that point to same base items in wearable
+ // items lists and update their worn state there.
+ changed_linked_items.insert(item->getLinkedUUID());
+ }
+ }
+
+ for (outfits_map_t::iterator iter = mOutfitsMap.begin();
+ iter != mOutfitsMap.end();
+ ++iter)
+ {
+ LLAccordionCtrlTab* tab = iter->second;
+ if (!tab) continue;
+
+ LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView());
+ if (!list) continue;
+
+ // Every list updates the labels of changed items or
+ // the links that point to these items.
+ list->updateChangedItems(changed_linked_items);
+ }
+}
+
+bool is_tab_header_clicked(LLAccordionCtrlTab* tab, S32 y)
+{
+ if(!tab || !tab->getHeaderVisible()) return false;
+
+ S32 header_bottom = tab->getLocalRect().getHeight() - tab->getHeaderHeight();
+ return y >= header_bottom;
+}
+
+// EOF
diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h
new file mode 100644
index 0000000000..df65f7187b
--- /dev/null
+++ b/indra/newview/lloutfitslist.h
@@ -0,0 +1,197 @@
+/**
+ * @file lloutfitslist.h
+ * @brief List of agent's outfits for My Appearance side panel.
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLOUTFITSLIST_H
+#define LL_LLOUTFITSLIST_H
+
+#include "llaccordionctrl.h"
+#include "llpanel.h"
+
+// newview
+#include "llinventorymodel.h"
+#include "llinventoryobserver.h"
+
+class LLAccordionCtrlTab;
+class LLWearableItemsList;
+class LLListContextMenu;
+
+/**
+ * @class LLOutfitTabNameComparator
+ *
+ * Comparator of outfit tabs.
+ */
+class LLOutfitTabNameComparator : public LLAccordionCtrl::LLTabComparator
+{
+ LOG_CLASS(LLOutfitTabNameComparator);
+
+public:
+ LLOutfitTabNameComparator() {};
+ virtual ~LLOutfitTabNameComparator() {};
+
+ /*virtual*/ bool compare(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2) const;
+};
+
+/**
+ * @class LLOutfitsList
+ *
+ * A list of agents's outfits from "My Outfits" inventory category
+ * which displays each outfit in an accordion tab with a flat list
+ * of items inside it.
+ *
+ * Starts fetching nevessary inventory content on first openning.
+ */
+class LLOutfitsList : public LLPanel
+{
+public:
+ typedef boost::function<void (const LLUUID&)> selection_change_callback_t;
+ typedef boost::signals2::signal<void (const LLUUID&)> selection_change_signal_t;
+
+ LLOutfitsList();
+ virtual ~LLOutfitsList();
+
+ /*virtual*/ BOOL postBuild();
+
+ /*virtual*/ void onOpen(const LLSD& info);
+
+ void refreshList(const LLUUID& category_id);
+
+ // highlits currently worn outfit tab text and unhighlights previously worn
+ void highlightBaseOutfit();
+
+ void performAction(std::string action);
+
+ void setFilterSubString(const std::string& string);
+
+ const LLUUID& getSelectedOutfitUUID() const { return mSelectedOutfitUUID; }
+
+ boost::signals2::connection addSelectionChangeCallback(selection_change_callback_t cb);
+
+ /**
+ * Returns true if there is a selection inside currently selected outfit
+ */
+ bool hasItemSelected();
+
+private:
+ /**
+ * Reads xml with accordion tab and Flat list from xml file.
+ *
+ * @return LLPointer to XMLNode with accordion tab and flat list.
+ */
+ LLXMLNodePtr getAccordionTabXMLNode();
+
+ /**
+ * Wrapper for LLCommonUtils::computeDifference. @see LLCommonUtils::computeDifference
+ */
+ void computeDifference(const LLInventoryModel::cat_array_t& vcats, uuid_vec_t& vadded, uuid_vec_t& vremoved);
+
+ /**
+ * Updates tab displaying outfit identified by category_id.
+ */
+ void updateOutfitTab(const LLUUID& category_id);
+
+ /**
+ * Resets previous selection and stores newly selected list and outfit id.
+ */
+ void changeOutfitSelection(LLWearableItemsList* list, const LLUUID& category_id);
+
+ /**
+ * Saves newly selected outfit ID.
+ */
+ void setSelectedOutfitUUID(const LLUUID& category_id);
+
+ /**
+ * Removes the outfit from selection.
+ */
+ void deselectOutfit(const LLUUID& category_id);
+
+ /**
+ * Try restoring selection for a temporary hidden tab.
+ *
+ * A tab may be hidden if it doesn't match current filter.
+ */
+ void restoreOutfitSelection(LLAccordionCtrlTab* tab, const LLUUID& category_id);
+
+ /**
+ * Called upon list refresh event to update tab visibility depending on
+ * the results of applying filter to the title and list items of the tab.
+ */
+ void onFilteredWearableItemsListRefresh(LLUICtrl* ctrl);
+
+ /**
+ * Highlights filtered items and hides tabs which haven't passed filter.
+ */
+ void applyFilter(const std::string& new_filter_substring);
+
+ /**
+ * Applies filter to the given tab
+ *
+ * @see applyFilter()
+ */
+ void applyFilterToTab(const LLUUID& category_id, LLAccordionCtrlTab* tab, const std::string& filter_substring);
+
+ void onAccordionTabRightClick(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& cat_id);
+ void onWearableItemsListRightClick(LLUICtrl* ctrl, S32 x, S32 y);
+ void onCOFChanged();
+
+ void onSelectionChange(LLUICtrl* ctrl);
+
+ static void onOutfitRename(const LLSD& notification, const LLSD& response);
+
+ LLInventoryCategoriesObserver* mCategoriesObserver;
+
+ LLAccordionCtrl* mAccordion;
+ LLPanel* mListCommands;
+
+ typedef std::map<LLUUID, LLWearableItemsList*> wearables_lists_map_t;
+ typedef wearables_lists_map_t::value_type wearables_lists_map_value_t;
+ wearables_lists_map_t mSelectedListsMap;
+
+ LLUUID mSelectedOutfitUUID;
+ // id of currently highlited outfit
+ LLUUID mHighlightedOutfitUUID;
+ selection_change_signal_t mSelectionChangeSignal;
+
+ std::string mFilterSubString;
+
+ typedef std::map<LLUUID, LLAccordionCtrlTab*> outfits_map_t;
+ typedef outfits_map_t::value_type outfits_map_value_t;
+ outfits_map_t mOutfitsMap;
+
+ LLListContextMenu* mOutfitMenu;
+
+ bool mIsInitialized;
+ /**
+ * True if there is a selection inside currently selected outfit
+ */
+ bool mItemSelected;
+};
+
+#endif //LL_LLOUTFITSLIST_H
diff --git a/indra/newview/lloutputmonitorctrl.cpp b/indra/newview/lloutputmonitorctrl.cpp
index 388fdeea7a..197a0ef728 100644
--- a/indra/newview/lloutputmonitorctrl.cpp
+++ b/indra/newview/lloutputmonitorctrl.cpp
@@ -142,7 +142,7 @@ void LLOutputMonitorCtrl::draw()
// Copied from llmediaremotectrl.cpp
// *TODO: Give the LLOutputMonitorCtrl an agent-id to monitor, then
- // call directly into gVoiceClient to ask if that agent-id is muted, is
+ // call directly into LLVoiceClient::getInstance() to ask if that agent-id is muted, is
// speaking, and what power. This avoids duplicating data, which can get
// out of sync.
const F32 LEVEL_0 = LLVoiceClient::OVERDRIVEN_POWER_LEVEL / 3.f;
@@ -151,14 +151,14 @@ void LLOutputMonitorCtrl::draw()
if (getVisible() && mAutoUpdate && !mIsMuted && mSpeakerId.notNull())
{
- setPower(gVoiceClient->getCurrentPower(mSpeakerId));
+ setPower(LLVoiceClient::getInstance()->getCurrentPower(mSpeakerId));
if(mIsAgentControl)
{
- setIsTalking(gVoiceClient->getUserPTTState());
+ setIsTalking(LLVoiceClient::getInstance()->getUserPTTState());
}
else
{
- setIsTalking(gVoiceClient->getIsSpeaking(mSpeakerId));
+ setIsTalking(LLVoiceClient::getInstance()->getIsSpeaking(mSpeakerId));
}
}
@@ -247,8 +247,13 @@ void LLOutputMonitorCtrl::draw()
gl_rect_2d(0, monh, monw, 0, sColorBound, FALSE);
}
-void LLOutputMonitorCtrl::setSpeakerId(const LLUUID& speaker_id)
+void LLOutputMonitorCtrl::setSpeakerId(const LLUUID& speaker_id, const LLUUID& session_id/* = LLUUID::null*/)
{
+ if (speaker_id.isNull() && mSpeakerId.notNull())
+ {
+ LLSpeakingIndicatorManager::unregisterSpeakingIndicator(mSpeakerId, this);
+ }
+
if (speaker_id.isNull() || speaker_id == mSpeakerId) return;
if (mSpeakerId.notNull())
@@ -256,8 +261,9 @@ void LLOutputMonitorCtrl::setSpeakerId(const LLUUID& speaker_id)
// Unregister previous registration to avoid crash. EXT-4782.
LLSpeakingIndicatorManager::unregisterSpeakingIndicator(mSpeakerId, this);
}
+
mSpeakerId = speaker_id;
- LLSpeakingIndicatorManager::registerSpeakingIndicator(mSpeakerId, this);
+ LLSpeakingIndicatorManager::registerSpeakingIndicator(mSpeakerId, this, session_id);
//mute management
if (mAutoUpdate)
@@ -297,7 +303,7 @@ void LLOutputMonitorCtrl::switchIndicator(bool switch_on)
}
// otherwise remember necessary state and mark itself as dirty.
- // State will be applied i next draw when parents chain became visible.
+ // State will be applied in next draw when parents chain becomes visible.
else
{
LL_DEBUGS("SpeakingIndicator") << "Indicator is not in visible chain, parent won't be notified: " << mSpeakerId << LL_ENDL;
@@ -311,7 +317,7 @@ void LLOutputMonitorCtrl::switchIndicator(bool switch_on)
//////////////////////////////////////////////////////////////////////////
void LLOutputMonitorCtrl::notifyParentVisibilityChanged()
{
- LL_DEBUGS("SpeakingIndicator") << "Notify parent that visibility was changed: " << mSpeakerId << " ,new_visibility: " << getVisible() << LL_ENDL;
+ LL_DEBUGS("SpeakingIndicator") << "Notify parent that visibility was changed: " << mSpeakerId << ", new_visibility: " << getVisible() << LL_ENDL;
LLSD params = LLSD().with("visibility_changed", getVisible());
diff --git a/indra/newview/lloutputmonitorctrl.h b/indra/newview/lloutputmonitorctrl.h
index 2bbfa251e9..3a83da67e2 100644
--- a/indra/newview/lloutputmonitorctrl.h
+++ b/indra/newview/lloutputmonitorctrl.h
@@ -86,7 +86,15 @@ public:
void setIsTalking(bool val) { mIsTalking = val; }
- void setSpeakerId(const LLUUID& speaker_id);
+ /**
+ * Sets avatar UUID to interact with voice channel.
+ *
+ * @param speaker_id LLUUID of an avatar whose voice level is displayed.
+ * @param session_id session UUID for which indicator should be shown only. Passed to LLSpeakingIndicatorManager
+ * If this parameter is set registered indicator will be shown only in voice channel
+ * which has the same session id (EXT-5562).
+ */
+ void setSpeakerId(const LLUUID& speaker_id, const LLUUID& session_id = LLUUID::null);
//called by mute list
virtual void onChange();
@@ -135,7 +143,7 @@ private:
LLPointer<LLUIImage> mImageLevel2;
LLPointer<LLUIImage> mImageLevel3;
- /** whether to deal with gVoiceClient directly */
+ /** whether to deal with LLVoiceClient::getInstance() directly */
bool mAutoUpdate;
/** uuid of a speaker being monitored */
diff --git a/indra/newview/lloverlaybar.cpp b/indra/newview/lloverlaybar.cpp
index 67e048885f..3f1b23ba14 100644
--- a/indra/newview/lloverlaybar.cpp
+++ b/indra/newview/lloverlaybar.cpp
@@ -258,7 +258,7 @@ void LLOverlayBar::refresh()
{
// update "remotes"
childSetVisible("media_remote_container", TRUE);
- childSetVisible("voice_remote_container", LLVoiceClient::voiceEnabled());
+ childSetVisible("voice_remote_container", LLVoiceClient::getInstance()->voiceEnabled());
childSetVisible("state_buttons", TRUE);
}
diff --git a/indra/newview/llpanelavatar.cpp b/indra/newview/llpanelavatar.cpp
index 4a7cdfc856..0b31ffc9a0 100644
--- a/indra/newview/llpanelavatar.cpp
+++ b/indra/newview/llpanelavatar.cpp
@@ -47,12 +47,11 @@
#include "lltooldraganddrop.h"
#include "llscrollcontainer.h"
#include "llavatariconctrl.h"
-#include "llweb.h"
-#include "llfloaterworldmap.h"
#include "llfloaterreg.h"
#include "llnotificationsutil.h"
#include "llvoiceclient.h"
#include "llnamebox.h"
+#include "lltrans.h"
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class LLDropTarget
@@ -165,7 +164,7 @@ BOOL LLPanelAvatarNotes::postBuild()
resetControls();
resetData();
- gVoiceClient->addObserver((LLVoiceClientStatusObserver*)this);
+ LLVoiceClient::getInstance()->addObserver((LLVoiceClientStatusObserver*)this);
return TRUE;
}
@@ -196,10 +195,9 @@ void LLPanelAvatarNotes::fillRightsData()
childSetValue("map_check",LLRelationship::GRANT_MAP_LOCATION & rights ? TRUE : FALSE);
childSetValue("objects_check",LLRelationship::GRANT_MODIFY_OBJECTS & rights ? TRUE : FALSE);
- childSetEnabled("status_check",TRUE);
- childSetEnabled("map_check",TRUE);
- childSetEnabled("objects_check",TRUE);
}
+
+ enableCheckboxes(NULL != relation);
}
void LLPanelAvatarNotes::onCommitNotes()
@@ -250,6 +248,17 @@ void LLPanelAvatarNotes::confirmModifyRights(bool grant, S32 rights)
void LLPanelAvatarNotes::onCommitRights()
{
+ const LLRelationship* buddy_relationship =
+ LLAvatarTracker::instance().getBuddyInfo(getAvatarId());
+
+ if (NULL == buddy_relationship)
+ {
+ // Lets have a warning log message instead of having a crash. EXT-4947.
+ llwarns << "Trying to modify rights for non-friend avatar. Skipped." << llendl;
+ return;
+ }
+
+
S32 rights = 0;
if(childGetValue("status_check").asBoolean())
@@ -259,8 +268,6 @@ void LLPanelAvatarNotes::onCommitRights()
if(childGetValue("objects_check").asBoolean())
rights |= LLRelationship::GRANT_MODIFY_OBJECTS;
- const LLRelationship* buddy_relationship =
- LLAvatarTracker::instance().getBuddyInfo(getAvatarId());
bool allow_modify_objects = childGetValue("objects_check").asBoolean();
// if modify objects checkbox clicked
@@ -304,9 +311,7 @@ void LLPanelAvatarNotes::resetControls()
//Disable "Add Friend" button for friends.
childSetEnabled("add_friend", TRUE);
- childSetEnabled("status_check",FALSE);
- childSetEnabled("map_check",FALSE);
- childSetEnabled("objects_check",FALSE);
+ enableCheckboxes(false);
}
void LLPanelAvatarNotes::onAddFriendButtonClick()
@@ -334,13 +339,22 @@ void LLPanelAvatarNotes::onShareButtonClick()
//*TODO not implemented.
}
+void LLPanelAvatarNotes::enableCheckboxes(bool enable)
+{
+ childSetEnabled("status_check", enable);
+ childSetEnabled("map_check", enable);
+ childSetEnabled("objects_check", enable);
+}
+
LLPanelAvatarNotes::~LLPanelAvatarNotes()
{
if(getAvatarId().notNull())
{
LLAvatarTracker::instance().removeParticularFriendObserver(getAvatarId(), this);
- if(LLVoiceClient::getInstance())
+ if(LLVoiceClient::instanceExists())
+ {
LLVoiceClient::getInstance()->removeObserver((LLVoiceClientStatusObserver*)this);
+ }
}
}
@@ -348,6 +362,9 @@ LLPanelAvatarNotes::~LLPanelAvatarNotes()
void LLPanelAvatarNotes::changed(U32 mask)
{
childSetEnabled("teleport", LLAvatarTracker::instance().isBuddyOnline(getAvatarId()));
+
+ // update rights to avoid have checkboxes enabled when friendship is terminated. EXT-4947.
+ fillRightsData();
}
// virtual
@@ -358,7 +375,7 @@ void LLPanelAvatarNotes::onChange(EStatusType status, const std::string &channel
return;
}
- childSetEnabled("call", LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking());
+ childSetEnabled("call", LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking());
}
void LLPanelAvatarNotes::setAvatarId(const LLUUID& id)
@@ -431,26 +448,25 @@ void LLPanelProfileTab::scrollToTop()
void LLPanelProfileTab::onMapButtonClick()
{
- std::string name;
- gCacheName->getFullName(getAvatarId(), name);
- gFloaterWorldMap->trackAvatar(getAvatarId(), name);
- LLFloaterReg::showInstance("world_map");
+ LLAvatarActions::showOnMap(getAvatarId());
}
void LLPanelProfileTab::updateButtons()
{
- bool is_avatar_online = LLAvatarTracker::instance().isBuddyOnline(getAvatarId());
+ bool is_buddy_online = LLAvatarTracker::instance().isBuddyOnline(getAvatarId());
if(LLAvatarActions::isFriend(getAvatarId()))
{
- childSetEnabled("teleport", is_avatar_online);
+ childSetEnabled("teleport", is_buddy_online);
}
else
{
childSetEnabled("teleport", true);
}
- bool enable_map_btn = is_avatar_online && gAgent.isGodlike() || is_agent_mappable(getAvatarId());
+ bool enable_map_btn = (is_buddy_online &&
+ is_agent_mappable(getAvatarId()))
+ || gAgent.isGodlike();
childSetEnabled("show_on_map_btn", enable_map_btn);
}
@@ -470,7 +486,6 @@ LLPanelAvatarProfile::LLPanelAvatarProfile()
BOOL LLPanelAvatarProfile::postBuild()
{
- childSetActionTextbox("homepage_edit", boost::bind(&LLPanelAvatarProfile::onHomepageTextboxClicked, this));
childSetCommitCallback("add_friend",(boost::bind(&LLPanelAvatarProfile::onAddFriendButtonClick,this)),NULL);
childSetCommitCallback("im",(boost::bind(&LLPanelAvatarProfile::onIMButtonClick,this)),NULL);
childSetCommitCallback("call",(boost::bind(&LLPanelAvatarProfile::onCallButtonClick,this)),NULL);
@@ -481,6 +496,7 @@ BOOL LLPanelAvatarProfile::postBuild()
&LLPanelAvatarProfile::onMapButtonClick, this)), NULL);
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+ registrar.add("Profile.ShowOnMap", boost::bind(&LLPanelAvatarProfile::onMapButtonClick, this));
registrar.add("Profile.Pay", boost::bind(&LLPanelAvatarProfile::pay, this));
registrar.add("Profile.Share", boost::bind(&LLPanelAvatarProfile::share, this));
registrar.add("Profile.BlockUnblock", boost::bind(&LLPanelAvatarProfile::toggleBlock, this));
@@ -490,9 +506,10 @@ BOOL LLPanelAvatarProfile::postBuild()
registrar.add("Profile.CSR", boost::bind(&LLPanelAvatarProfile::csr, this));
LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable;
+ enable.add("Profile.EnableShowOnMap", boost::bind(&LLPanelAvatarProfile::enableShowOnMap, this));
enable.add("Profile.EnableGod", boost::bind(&enable_god));
- enable.add("Profile.CheckItem", boost::bind(&LLPanelAvatarProfile::checkOverflowMenuItem, this, _2));
- enable.add("Profile.EnableItem", boost::bind(&LLPanelAvatarProfile::enableOverflowMenuItem, this, _2));
+ enable.add("Profile.EnableBlock", boost::bind(&LLPanelAvatarProfile::enableBlock, this));
+ enable.add("Profile.EnableUnblock", boost::bind(&LLPanelAvatarProfile::enableUnblock, this));
mProfileMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_profile_overflow.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
@@ -502,7 +519,7 @@ BOOL LLPanelAvatarProfile::postBuild()
pic = getChild<LLTextureCtrl>("real_world_pic");
pic->setFallbackImageName("default_profile_picture.j2c");
- gVoiceClient->addObserver((LLVoiceClientStatusObserver*)this);
+ LLVoiceClient::getInstance()->addObserver((LLVoiceClientStatusObserver*)this);
resetControls();
resetData();
@@ -629,7 +646,11 @@ void LLPanelAvatarProfile::fillCommonData(const LLAvatarData* avatar_data)
LLAvatarIconIDCache::getInstance()->remove(avatar_data->avatar_id);
LLStringUtil::format_map_t args;
- args["[REG_DATE]"] = avatar_data->born_on;
+ {
+ std::string birth_date = LLTrans::getString("AvatarBirthDateFormat");
+ LLStringUtil::format(birth_date, LLSD().with("datetime", (S32) avatar_data->born_on.secondsSinceEpoch()));
+ args["[REG_DATE]"] = birth_date;
+ }
args["[AGE]"] = LLDateUtil::ageFromDate( avatar_data->born_on, LLDate::now());
std::string register_date = getString("RegisterDateFormat", args);
childSetValue("register_date", register_date );
@@ -669,39 +690,38 @@ void LLPanelAvatarProfile::fillAccountStatus(const LLAvatarData* avatar_data)
childSetValue("acc_status_text", caption_text);
}
-bool LLPanelAvatarProfile::checkOverflowMenuItem(const LLSD& param)
+void LLPanelAvatarProfile::pay()
{
- std::string item = param.asString();
-
- if (item == "is_blocked")
- return LLAvatarActions::isBlocked(getAvatarId());
-
- return false;
+ LLAvatarActions::pay(getAvatarId());
}
-bool LLPanelAvatarProfile::enableOverflowMenuItem(const LLSD& param)
+void LLPanelAvatarProfile::share()
{
- std::string item = param.asString();
-
- if (item == "can_block")
- return LLAvatarActions::canBlock(getAvatarId());
+ LLAvatarActions::share(getAvatarId());
+}
- return false;
+void LLPanelAvatarProfile::toggleBlock()
+{
+ LLAvatarActions::toggleBlock(getAvatarId());
}
-void LLPanelAvatarProfile::pay()
+bool LLPanelAvatarProfile::enableShowOnMap()
{
- LLAvatarActions::pay(getAvatarId());
+ bool is_buddy_online = LLAvatarTracker::instance().isBuddyOnline(getAvatarId());
+
+ bool enable_map_btn = (is_buddy_online && is_agent_mappable(getAvatarId()))
+ || gAgent.isGodlike();
+ return enable_map_btn;
}
-void LLPanelAvatarProfile::share()
+bool LLPanelAvatarProfile::enableBlock()
{
- LLAvatarActions::share(getAvatarId());
+ return LLAvatarActions::canBlock(getAvatarId()) && !LLAvatarActions::isBlocked(getAvatarId());
}
-void LLPanelAvatarProfile::toggleBlock()
+bool LLPanelAvatarProfile::enableUnblock()
{
- LLAvatarActions::toggleBlock(getAvatarId());
+ return LLAvatarActions::isBlocked(getAvatarId());
}
void LLPanelAvatarProfile::kick()
@@ -726,20 +746,6 @@ void LLPanelAvatarProfile::csr()
LLAvatarActions::csr(getAvatarId(), name);
}
-void LLPanelAvatarProfile::onUrlTextboxClicked(const std::string& url)
-{
- LLWeb::loadURL(url);
-}
-
-void LLPanelAvatarProfile::onHomepageTextboxClicked()
-{
- std::string url = childGetValue("homepage_edit").asString();
- if(!url.empty())
- {
- onUrlTextboxClicked(url);
- }
-}
-
void LLPanelAvatarProfile::onAddFriendButtonClick()
{
LLAvatarActions::requestFriendshipDialog(getAvatarId());
@@ -787,8 +793,10 @@ LLPanelAvatarProfile::~LLPanelAvatarProfile()
if(getAvatarId().notNull())
{
LLAvatarTracker::instance().removeParticularFriendObserver(getAvatarId(), this);
- if(LLVoiceClient::getInstance())
+ if(LLVoiceClient::instanceExists())
+ {
LLVoiceClient::getInstance()->removeObserver((LLVoiceClientStatusObserver*)this);
+ }
}
}
@@ -806,7 +814,7 @@ void LLPanelAvatarProfile::onChange(EStatusType status, const std::string &chann
return;
}
- childSetEnabled("call", LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking());
+ childSetEnabled("call", LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking());
}
void LLPanelAvatarProfile::setAvatarId(const LLUUID& id)
diff --git a/indra/newview/llpanelavatar.h b/indra/newview/llpanelavatar.h
index 632590aa27..bb8df2ff9c 100644
--- a/indra/newview/llpanelavatar.h
+++ b/indra/newview/llpanelavatar.h
@@ -202,13 +202,12 @@ protected:
void unfreeze();
void csr();
- bool checkOverflowMenuItem(const LLSD& param);
- bool enableOverflowMenuItem(const LLSD& param);
+ bool enableShowOnMap();
+ bool enableBlock();
+ bool enableUnblock();
bool enableGod();
- void onUrlTextboxClicked(const std::string& url);
- void onHomepageTextboxClicked();
void onAddFriendButtonClick();
void onIMButtonClick();
void onCallButtonClick();
@@ -259,8 +258,8 @@ private:
};
/**
-* Panel for displaying Avatar's notes and modifying friend's rights.
-*/
+ * Panel for displaying Avatar's notes and modifying friend's rights.
+ */
class LLPanelAvatarNotes
: public LLPanelProfileTab
, public LLFriendObserver
@@ -311,6 +310,7 @@ protected:
void onCallButtonClick();
void onTeleportButtonClick();
void onShareButtonClick();
+ void enableCheckboxes(bool enable);
};
#endif // LL_LLPANELAVATAR_H
diff --git a/indra/newview/llpanelblockedlist.cpp b/indra/newview/llpanelblockedlist.cpp
index 362657a458..c72f0f8012 100644
--- a/indra/newview/llpanelblockedlist.cpp
+++ b/indra/newview/llpanelblockedlist.cpp
@@ -119,8 +119,13 @@ void LLPanelBlockedList::refreshBlockedList()
std::vector<LLMute>::iterator it;
for (it = mutes.begin(); it != mutes.end(); ++it)
{
- std::string display_name = it->getDisplayName();
- mBlockedList->addStringUUIDItem(display_name, it->mID, ADD_BOTTOM, TRUE);
+ LLScrollListItem::Params item_p;
+ item_p.enabled(TRUE);
+ item_p.value(it->mID); // link UUID of blocked item with ScrollListItem
+ item_p.columns.add().column("item_name").value(it->mName);//.type("text");
+ item_p.columns.add().column("item_type").value(it->getDisplayType());//.type("text").width(111);
+
+ mBlockedList->addRow(item_p, ADD_BOTTOM);
}
}
@@ -145,9 +150,7 @@ void LLPanelBlockedList::onRemoveBtnClick()
{
std::string name = mBlockedList->getSelectedItemLabel();
LLUUID id = mBlockedList->getStringUUIDSelectedItem();
- LLMute mute(id);
- mute.setFromDisplayName(name);
- // now mute.mName has the suffix trimmed off
+ LLMute mute(id, name);
S32 last_selected = mBlockedList->getFirstSelectedIndex();
if (LLMuteList::getInstance()->remove(mute))
@@ -183,7 +186,7 @@ void LLPanelBlockedList::onBlockByNameClick()
LLFloaterGetBlockedObjectName::show(&LLPanelBlockedList::callbackBlockByName);
}
-void LLPanelBlockedList::callbackBlockPicked(const std::vector<std::string>& names, const std::vector<LLUUID>& ids)
+void LLPanelBlockedList::callbackBlockPicked(const std::vector<std::string>& names, const uuid_vec_t& ids)
{
if (names.empty() || ids.empty()) return;
LLMute mute(ids[0], names[0], LLMute::AGENT);
diff --git a/indra/newview/llpanelblockedlist.h b/indra/newview/llpanelblockedlist.h
index 1ef16a02f4..a100577e43 100644
--- a/indra/newview/llpanelblockedlist.h
+++ b/indra/newview/llpanelblockedlist.h
@@ -78,7 +78,7 @@ private:
void onPickBtnClick();
void onBlockByNameClick();
- void callbackBlockPicked(const std::vector<std::string>& names, const std::vector<LLUUID>& ids);
+ void callbackBlockPicked(const std::vector<std::string>& names, const uuid_vec_t& ids);
static void callbackBlockByName(const std::string& text);
private:
diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp
index 1e46827c1a..70a7bf644b 100644
--- a/indra/newview/llpanelclassified.cpp
+++ b/indra/newview/llpanelclassified.cpp
@@ -41,6 +41,7 @@
#include "lldir.h"
#include "lldispatcher.h"
#include "llfloaterreg.h"
+#include "llhttpclient.h"
#include "llnotifications.h"
#include "llnotificationsutil.h"
#include "llparcel.h"
@@ -72,6 +73,7 @@
#include "llviewerwindow.h" // for window width, height
#include "llappviewer.h" // abortQuit()
#include "lltrans.h"
+#include "llscrollcontainer.h"
#include "llstatusbar.h"
const S32 MINIMUM_PRICE_FOR_LISTING = 50; // L$
@@ -82,6 +84,7 @@ const S32 DECLINE_TO_STATE = 0;
//static
std::list<LLPanelClassified*> LLPanelClassified::sAllPanels;
+std::list<LLPanelClassifiedInfo*> LLPanelClassifiedInfo::sAllPanels;
// "classifiedclickthrough"
// strings[0] = classified_id
@@ -102,15 +105,32 @@ public:
S32 teleport_clicks = atoi(strings[1].c_str());
S32 map_clicks = atoi(strings[2].c_str());
S32 profile_clicks = atoi(strings[3].c_str());
- LLPanelClassified::setClickThrough(classified_id, teleport_clicks,
- map_clicks,
- profile_clicks,
- false);
+
+ LLPanelClassifiedInfo::setClickThrough(
+ classified_id, teleport_clicks, map_clicks, profile_clicks, false);
+
return true;
}
};
static LLDispatchClassifiedClickThrough sClassifiedClickThrough;
+// Just to debug errors. Can be thrown away later.
+class LLClassifiedClickMessageResponder : public LLHTTPClient::Responder
+{
+ LOG_CLASS(LLClassifiedClickMessageResponder);
+
+public:
+ // If we get back an error (not found, etc...), handle it here
+ virtual void errorWithContent(
+ U32 status,
+ const std::string& reason,
+ const LLSD& content)
+ {
+ llwarns << "Sending click message failed (" << status << "): [" << reason << "]" << llendl;
+ llwarns << "Content: [" << content << "]" << llendl;
+ }
+};
+
/* Re-expose this if we need to have classified ad HTML detail
pages. JC
@@ -242,7 +262,7 @@ BOOL LLPanelClassified::postBuild()
mNameEditor->setCommitOnFocusLost(TRUE);
mNameEditor->setFocusReceivedCallback(boost::bind(focusReceived, _1, this));
mNameEditor->setCommitCallback(onCommitAny, this);
- mNameEditor->setPrevalidate( LLLineEditor::prevalidateASCII );
+ mNameEditor->setPrevalidate( LLTextValidate::validateASCII );
mDescEditor = getChild<LLTextEditor>("desc_editor");
mDescEditor->setCommitOnFocusLost(TRUE);
@@ -496,7 +516,7 @@ void LLPanelClassified::sendClassifiedInfoRequest()
if (!url.empty())
{
llinfos << "Classified stat request via capability" << llendl;
- LLHTTPClient::post(url, body, new LLClassifiedStatsResponder(((LLView*)this)->getHandle(), mClassifiedID));
+ LLHTTPClient::post(url, body, new LLClassifiedStatsResponder(mClassifiedID));
}
}
}
@@ -1072,7 +1092,7 @@ BOOL LLFloaterPriceForListing::postBuild()
LLLineEditor* edit = getChild<LLLineEditor>("price_edit");
if (edit)
{
- edit->setPrevalidate(LLLineEditor::prevalidateNonNegativeS32);
+ edit->setPrevalidate(LLTextValidate::validateNonNegativeS32);
std::string min_price = llformat("%d", MINIMUM_PRICE_FOR_LISTING);
edit->setText(min_price);
edit->selectAll();
@@ -1152,11 +1172,25 @@ void LLPanelClassified::setDefaultAccessCombo()
LLPanelClassifiedInfo::LLPanelClassifiedInfo()
: LLPanel()
, mInfoLoaded(false)
-{
+ , mScrollingPanel(NULL)
+ , mScrollContainer(NULL)
+ , mScrollingPanelMinHeight(0)
+ , mScrollingPanelWidth(0)
+ , mSnapshotStreched(false)
+ , mTeleportClicksOld(0)
+ , mMapClicksOld(0)
+ , mProfileClicksOld(0)
+ , mTeleportClicksNew(0)
+ , mMapClicksNew(0)
+ , mProfileClicksNew(0)
+ , mSnapshotCtrl(NULL)
+{
+ sAllPanels.push_back(this);
}
LLPanelClassifiedInfo::~LLPanelClassifiedInfo()
{
+ sAllPanels.remove(this);
}
// static
@@ -1173,6 +1207,15 @@ BOOL LLPanelClassifiedInfo::postBuild()
childSetAction("show_on_map_btn", boost::bind(&LLPanelClassifiedInfo::onMapClick, this));
childSetAction("teleport_btn", boost::bind(&LLPanelClassifiedInfo::onTeleportClick, this));
+ mScrollingPanel = getChild<LLPanel>("scroll_content_panel");
+ mScrollContainer = getChild<LLScrollContainer>("profile_scroll");
+
+ mScrollingPanelMinHeight = mScrollContainer->getScrolledViewRect().getHeight();
+ mScrollingPanelWidth = mScrollingPanel->getRect().getWidth();
+
+ mSnapshotCtrl = getChild<LLTextureCtrl>("classified_snapshot");
+ mSnapshotRect = getDefaultSnapshotRect();
+
return TRUE;
}
@@ -1186,9 +1229,32 @@ void LLPanelClassifiedInfo::setEditClassifiedCallback(const commit_callback_t& c
getChild<LLButton>("edit_btn")->setClickedCallback(cb);
}
+void LLPanelClassifiedInfo::reshape(S32 width, S32 height, BOOL called_from_parent /* = TRUE */)
+{
+ LLPanel::reshape(width, height, called_from_parent);
+
+ if (!mScrollContainer || !mScrollingPanel)
+ return;
+
+ static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
+
+ S32 scroll_height = mScrollContainer->getRect().getHeight();
+ if (mScrollingPanelMinHeight >= scroll_height)
+ {
+ mScrollingPanel->reshape(mScrollingPanelWidth, mScrollingPanelMinHeight);
+ }
+ else
+ {
+ mScrollingPanel->reshape(mScrollingPanelWidth + scrollbar_size, scroll_height);
+ }
+
+ mSnapshotRect = getDefaultSnapshotRect();
+ stretchSnapshot();
+}
+
void LLPanelClassifiedInfo::onOpen(const LLSD& key)
{
- LLUUID avatar_id = key["avatar_id"];
+ LLUUID avatar_id = key["classified_creator_id"];
if(avatar_id.isNull())
{
return;
@@ -1203,14 +1269,35 @@ void LLPanelClassifiedInfo::onOpen(const LLSD& key)
resetData();
resetControls();
+ scrollToTop();
setClassifiedId(key["classified_id"]);
- setClassifiedName(key["name"]);
- setDescription(key["desc"]);
- setSnapshotId(key["snapshot_id"]);
+ setClassifiedName(key["classified_name"]);
+ setDescription(key["classified_desc"]);
+ setSnapshotId(key["classified_snapshot_id"]);
+ setFromSearch(key["from_search"]);
+
+ llinfos << "Opening classified [" << getClassifiedName() << "] (" << getClassifiedId() << ")" << llendl;
LLAvatarPropertiesProcessor::getInstance()->addObserver(getAvatarId(), this);
LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoRequest(getClassifiedId());
+ gGenericDispatcher.addHandler("classifiedclickthrough", &sClassifiedClickThrough);
+
+ // While we're at it let's get the stats from the new table if that
+ // capability exists.
+ std::string url = gAgent.getRegion()->getCapability("SearchStatRequest");
+ if (!url.empty())
+ {
+ llinfos << "Classified stat request via capability" << llendl;
+ LLSD body;
+ body["classified_id"] = getClassifiedId();
+ LLHTTPClient::post(url, body, new LLClassifiedStatsResponder(getClassifiedId()));
+ }
+
+ // Update classified click stats.
+ // *TODO: Should we do this when opening not from search?
+ sendClickMessage("profile");
+
setInfoLoaded(false);
}
@@ -1226,20 +1313,32 @@ void LLPanelClassifiedInfo::processProperties(void* data, EAvatarProcessorType t
setSnapshotId(c_info->snapshot_id);
setParcelId(c_info->parcel_id);
setPosGlobal(c_info->pos_global);
+ setSimName(c_info->sim_name);
+
setClassifiedLocation(createLocationText(c_info->parcel_name, c_info->sim_name, c_info->pos_global));
childSetValue("category", LLClassifiedInfo::sCategories[c_info->category]);
static std::string mature_str = getString("type_mature");
static std::string pg_str = getString("type_pg");
static LLUIString price_str = getString("l$_price");
+ static std::string date_fmt = getString("date_fmt");
bool mature = is_cf_mature(c_info->flags);
childSetValue("content_type", mature ? mature_str : pg_str);
- childSetValue("auto_renew", is_cf_auto_renew(c_info->flags));
+ getChild<LLIconCtrl>("content_type_moderate")->setVisible(mature);
+ getChild<LLIconCtrl>("content_type_general")->setVisible(!mature);
+
+ std::string auto_renew_str = is_cf_auto_renew(c_info->flags) ?
+ getString("auto_renew_on") : getString("auto_renew_off");
+ childSetValue("auto_renew", auto_renew_str);
price_str.setArg("[PRICE]", llformat("%d", c_info->price_for_listing));
childSetValue("price_for_listing", LLSD(price_str));
+ std::string date_str = date_fmt;
+ LLStringUtil::format(date_str, LLSD().with("datetime", (S32) c_info->creation_date));
+ childSetText("creation_date", date_str);
+
setInfoLoaded(true);
}
}
@@ -1252,23 +1351,38 @@ void LLPanelClassifiedInfo::resetData()
setClassifiedLocation(LLStringUtil::null);
setClassifiedId(LLUUID::null);
setSnapshotId(LLUUID::null);
- mPosGlobal.clearVec();
- childSetValue("category", LLStringUtil::null);
- childSetValue("content_type", LLStringUtil::null);
+ setPosGlobal(LLVector3d::zero);
+ setParcelId(LLUUID::null);
+ setSimName(LLStringUtil::null);
+ setFromSearch(false);
+
+ // reset click stats
+ mTeleportClicksOld = 0;
+ mMapClicksOld = 0;
+ mProfileClicksOld = 0;
+ mTeleportClicksNew = 0;
+ mMapClicksNew = 0;
+ mProfileClicksNew = 0;
+
+ childSetText("category", LLStringUtil::null);
+ childSetText("content_type", LLStringUtil::null);
+ childSetText("click_through_text", LLStringUtil::null);
+ childSetText("price_for_listing", LLStringUtil::null);
+ childSetText("auto_renew", LLStringUtil::null);
+ childSetText("creation_date", LLStringUtil::null);
+ childSetText("click_through_text", LLStringUtil::null);
+ getChild<LLIconCtrl>("content_type_moderate")->setVisible(FALSE);
+ getChild<LLIconCtrl>("content_type_general")->setVisible(FALSE);
}
void LLPanelClassifiedInfo::resetControls()
{
- if(getAvatarId() == gAgent.getID())
- {
- childSetEnabled("edit_btn", TRUE);
- childSetVisible("edit_btn", TRUE);
- }
- else
- {
- childSetEnabled("edit_btn", FALSE);
- childSetVisible("edit_btn", FALSE);
- }
+ bool is_self = getAvatarId() == gAgent.getID();
+
+ childSetEnabled("edit_btn", is_self);
+ childSetVisible("edit_btn", is_self);
+ childSetVisible("price_layout_panel", is_self);
+ childSetVisible("clickthrough_layout_panel", is_self);
}
void LLPanelClassifiedInfo::setClassifiedName(const std::string& name)
@@ -1296,9 +1410,27 @@ void LLPanelClassifiedInfo::setClassifiedLocation(const std::string& location)
childSetValue("classified_location", location);
}
+std::string LLPanelClassifiedInfo::getClassifiedLocation()
+{
+ return childGetValue("classified_location").asString();
+}
+
void LLPanelClassifiedInfo::setSnapshotId(const LLUUID& id)
{
- childSetValue("classified_snapshot", id);
+ mSnapshotCtrl->setValue(id);
+ mSnapshotStreched = false;
+}
+
+void LLPanelClassifiedInfo::draw()
+{
+ LLPanel::draw();
+
+ // Stretch in draw because it takes some time to load a texture,
+ // going to try to stretch snapshot until texture is loaded
+ if(!mSnapshotStreched)
+ {
+ stretchSnapshot();
+ }
}
LLUUID LLPanelClassifiedInfo::getSnapshotId()
@@ -1307,6 +1439,69 @@ LLUUID LLPanelClassifiedInfo::getSnapshotId()
}
// static
+void LLPanelClassifiedInfo::setClickThrough(
+ const LLUUID& classified_id,
+ S32 teleport,
+ S32 map,
+ S32 profile,
+ bool from_new_table)
+{
+ llinfos << "Click-through data for classified " << classified_id << " arrived: ["
+ << teleport << ", " << map << ", " << profile << "] ("
+ << (from_new_table ? "new" : "old") << ")" << llendl;
+
+ for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter)
+ {
+ LLPanelClassifiedInfo* self = *iter;
+ if (self->getClassifiedId() != classified_id)
+ {
+ continue;
+ }
+
+ // *HACK: Skip LLPanelClassifiedEdit instances: they don't display clicks data.
+ // Those instances should not be in the list at all.
+ if (typeid(*self) != typeid(LLPanelClassifiedInfo))
+ {
+ continue;
+ }
+
+ llinfos << "Updating classified info panel" << llendl;
+
+ // We need to check to see if the data came from the new stat_table
+ // or the old classified table. We also need to cache the data from
+ // the two separate sources so as to display the aggregate totals.
+
+ if (from_new_table)
+ {
+ self->mTeleportClicksNew = teleport;
+ self->mMapClicksNew = map;
+ self->mProfileClicksNew = profile;
+ }
+ else
+ {
+ self->mTeleportClicksOld = teleport;
+ self->mMapClicksOld = map;
+ self->mProfileClicksOld = profile;
+ }
+
+ static LLUIString ct_str = self->getString("click_through_text_fmt");
+
+ ct_str.setArg("[TELEPORT]", llformat("%d", self->mTeleportClicksNew + self->mTeleportClicksOld));
+ ct_str.setArg("[MAP]", llformat("%d", self->mMapClicksNew + self->mMapClicksOld));
+ ct_str.setArg("[PROFILE]", llformat("%d", self->mProfileClicksNew + self->mProfileClicksOld));
+
+ self->childSetText("click_through_text", ct_str.getString());
+ // *HACK: remove this when there is enough room for click stats in the info panel
+ self->childSetToolTip("click_through_text", ct_str.getString());
+
+ llinfos << "teleport: " << llformat("%d", self->mTeleportClicksNew + self->mTeleportClicksOld)
+ << ", map: " << llformat("%d", self->mMapClicksNew + self->mMapClicksOld)
+ << ", profile: " << llformat("%d", self->mProfileClicksNew + self->mProfileClicksOld)
+ << llendl;
+ }
+}
+
+// static
std::string LLPanelClassifiedInfo::createLocationText(
const std::string& original_name,
const std::string& sim_name,
@@ -1337,8 +1532,100 @@ std::string LLPanelClassifiedInfo::createLocationText(
return location_text;
}
+void LLPanelClassifiedInfo::stretchSnapshot()
+{
+ // *NOTE dzaporozhan
+ // Could be moved to LLTextureCtrl
+
+ LLViewerFetchedTexture* texture = mSnapshotCtrl->getTexture();
+
+ if(!texture)
+ {
+ return;
+ }
+
+ if(0 == texture->getOriginalWidth() || 0 == texture->getOriginalHeight())
+ {
+ // looks like texture is not loaded yet
+ return;
+ }
+
+ LLRect rc = mSnapshotRect;
+ // *HACK dzaporozhan
+ // LLTextureCtrl uses BTN_HEIGHT_SMALL as bottom for texture which causes
+ // drawn texture to be smaller than expected. (see LLTextureCtrl::draw())
+ // Lets increase texture height to force texture look as expected.
+ rc.mBottom -= BTN_HEIGHT_SMALL;
+
+ F32 t_width = texture->getFullWidth();
+ F32 t_height = texture->getFullHeight();
+
+ F32 ratio = llmin<F32>( (rc.getWidth() / t_width), (rc.getHeight() / t_height) );
+
+ t_width *= ratio;
+ t_height *= ratio;
+
+ rc.setCenterAndSize(rc.getCenterX(), rc.getCenterY(), llfloor(t_width), llfloor(t_height));
+ mSnapshotCtrl->setShape(rc);
+
+ mSnapshotStreched = true;
+}
+
+LLRect LLPanelClassifiedInfo::getDefaultSnapshotRect()
+{
+ // Using scroll container makes getting default rect a hard task
+ // because rect in postBuild() and in first reshape() is not the same.
+ // Using snapshot_panel makes it easier to reshape snapshot.
+ return getChild<LLUICtrl>("snapshot_panel")->getLocalRect();
+}
+
+void LLPanelClassifiedInfo::scrollToTop()
+{
+ LLScrollContainer* scrollContainer = findChild<LLScrollContainer>("profile_scroll");
+ if (scrollContainer)
+ scrollContainer->goToTop();
+}
+
+// static
+// *TODO: move out of the panel
+void LLPanelClassifiedInfo::sendClickMessage(
+ const std::string& type,
+ bool from_search,
+ const LLUUID& classified_id,
+ const LLUUID& parcel_id,
+ const LLVector3d& global_pos,
+ const std::string& sim_name)
+{
+ // You're allowed to click on your own ads to reassure yourself
+ // that the system is working.
+ LLSD body;
+ body["type"] = type;
+ body["from_search"] = from_search;
+ body["classified_id"] = classified_id;
+ body["parcel_id"] = parcel_id;
+ body["dest_pos_global"] = global_pos.getValue();
+ body["region_name"] = sim_name;
+
+ std::string url = gAgent.getRegion()->getCapability("SearchStatTracking");
+ llinfos << "Sending click msg via capability (url=" << url << ")" << llendl;
+ llinfos << "body: [" << body << "]" << llendl;
+ LLHTTPClient::post(url, body, new LLClassifiedClickMessageResponder());
+}
+
+void LLPanelClassifiedInfo::sendClickMessage(const std::string& type)
+{
+ sendClickMessage(
+ type,
+ fromSearch(),
+ getClassifiedId(),
+ getParcelId(),
+ getPosGlobal(),
+ getSimName());
+}
+
void LLPanelClassifiedInfo::onMapClick()
{
+ sendClickMessage("map");
LLFloaterWorldMap::getInstance()->trackLocation(getPosGlobal());
LLFloaterReg::showInstance("world_map", "center");
}
@@ -1347,6 +1634,7 @@ void LLPanelClassifiedInfo::onTeleportClick()
{
if (!getPosGlobal().isExactlyZero())
{
+ sendClickMessage("teleport");
gAgent.teleportViaLocation(getPosGlobal());
LLFloaterWorldMap::getInstance()->trackLocation(getPosGlobal());
}
@@ -1355,6 +1643,7 @@ void LLPanelClassifiedInfo::onTeleportClick()
void LLPanelClassifiedInfo::onExit()
{
LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(), this);
+ gGenericDispatcher.addHandler("classifiedclickthrough", NULL); // deregister our handler
}
//////////////////////////////////////////////////////////////////////////
@@ -1367,7 +1656,9 @@ static const S32 CB_ITEM_PG = 1;
LLPanelClassifiedEdit::LLPanelClassifiedEdit()
: LLPanelClassifiedInfo()
, mIsNew(false)
+ , mIsNewWithErrors(false)
, mCanClose(false)
+ , mPublishFloater(NULL)
{
}
@@ -1419,22 +1710,17 @@ BOOL LLPanelClassifiedEdit::postBuild()
childSetAction("save_changes_btn", boost::bind(&LLPanelClassifiedEdit::onSaveClick, this));
childSetAction("set_to_curr_location_btn", boost::bind(&LLPanelClassifiedEdit::onSetLocationClick, this));
+ mSnapshotCtrl->setOnSelectCallback(boost::bind(&LLPanelClassifiedEdit::onTextureSelected, this));
+
return TRUE;
}
-void LLPanelClassifiedEdit::onOpen(const LLSD& key)
+void LLPanelClassifiedEdit::fillIn(const LLSD& key)
{
- LLUUID classified_id = key["classified_id"];
-
- mIsNew = classified_id.isNull();
+ setAvatarId(gAgent.getID());
- if(mIsNew)
+ if(key.isUndefined())
{
- setAvatarId(gAgent.getID());
-
- resetData();
- resetControls();
-
setPosGlobal(gAgent.getPositionGlobal());
LLUUID snapshot_id = LLUUID::null;
@@ -1457,22 +1743,55 @@ void LLPanelClassifiedEdit::onOpen(const LLSD& key)
childSetValue("classified_name", makeClassifiedName());
childSetValue("classified_desc", desc);
setSnapshotId(snapshot_id);
-
setClassifiedLocation(createLocationText(getLocationNotice(), region_name, getPosGlobal()));
-
// server will set valid parcel id
setParcelId(LLUUID::null);
+ }
+ else
+ {
+ setClassifiedId(key["classified_id"]);
+ setClassifiedName(key["name"]);
+ setDescription(key["desc"]);
+ setSnapshotId(key["snapshot_id"]);
+ setCategory((U32)key["category"].asInteger());
+ setContentType((U32)key["content_type"].asInteger());
+ setClassifiedLocation(key["location_text"]);
+ childSetValue("auto_renew", key["auto_renew"]);
+ childSetValue("price_for_listing", key["price_for_listing"].asInteger());
+ }
+}
+
+void LLPanelClassifiedEdit::onOpen(const LLSD& key)
+{
+ mIsNew = key.isUndefined();
+
+ scrollToTop();
+
+ // classified is not created yet
+ bool is_new = isNew() || isNewWithErrors();
+
+ if(is_new)
+ {
+ resetData();
+ resetControls();
- enableVerbs(true);
- enableEditing(true);
+ fillIn(key);
+
+ if(isNew())
+ {
+ LLAvatarPropertiesProcessor::getInstance()->addObserver(getAvatarId(), this);
+ }
}
else
{
LLPanelClassifiedInfo::onOpen(key);
- enableVerbs(false);
- enableEditing(false);
}
+ std::string save_btn_label = is_new ? getString("publish_label") : getString("save_label");
+ childSetLabelArg("save_changes_btn", "[LABEL]", save_btn_label);
+
+ enableVerbs(is_new);
+ enableEditing(is_new);
resetDirty();
setInfoLoaded(false);
}
@@ -1484,6 +1803,14 @@ void LLPanelClassifiedEdit::processProperties(void* data, EAvatarProcessorType t
LLAvatarClassifiedInfo* c_info = static_cast<LLAvatarClassifiedInfo*>(data);
if(c_info && getClassifiedId() == c_info->classified_id)
{
+ // see LLPanelClassifiedEdit::sendUpdate() for notes
+ mIsNewWithErrors = false;
+ // for just created classified - panel will probably be closed when we get here.
+ if(!getVisible())
+ {
+ return;
+ }
+
enableEditing(true);
setClassifiedName(c_info->name);
@@ -1492,18 +1819,23 @@ void LLPanelClassifiedEdit::processProperties(void* data, EAvatarProcessorType t
setPosGlobal(c_info->pos_global);
setClassifiedLocation(createLocationText(c_info->parcel_name, c_info->sim_name, c_info->pos_global));
- getChild<LLComboBox>("category")->setCurrentByIndex(c_info->category + 1);
- getChild<LLComboBox>("category")->resetDirty();
+ // *HACK see LLPanelClassifiedEdit::sendUpdate()
+ setCategory(c_info->category - 1);
bool mature = is_cf_mature(c_info->flags);
bool auto_renew = is_cf_auto_renew(c_info->flags);
- getChild<LLComboBox>("content_type")->setCurrentByIndex(mature ? CB_ITEM_MATURE : CB_ITEM_PG);
+ setContentType(mature ? CB_ITEM_MATURE : CB_ITEM_PG);
childSetValue("auto_renew", auto_renew);
childSetValue("price_for_listing", c_info->price_for_listing);
+ childSetEnabled("price_for_listing", isNew());
resetDirty();
setInfoLoaded(true);
+ enableVerbs(false);
+
+ // for just created classified - in case user opened edit panel before processProperties() callback
+ childSetLabelArg("save_changes_btn", "[LABEL]", getString("save_label"));
}
}
}
@@ -1534,19 +1866,24 @@ void LLPanelClassifiedEdit::resetDirty()
LLPanelClassifiedInfo::resetDirty();
getChild<LLUICtrl>("classified_snapshot")->resetDirty();
getChild<LLUICtrl>("classified_name")->resetDirty();
- getChild<LLUICtrl>("classified_desc")->resetDirty();
+
+ LLTextEditor* desc = getChild<LLTextEditor>("classified_desc");
+ // call blockUndo() to really reset dirty(and make isDirty work as intended)
+ desc->blockUndo();
+ desc->resetDirty();
+
getChild<LLUICtrl>("category")->resetDirty();
getChild<LLUICtrl>("content_type")->resetDirty();
getChild<LLUICtrl>("auto_renew")->resetDirty();
getChild<LLUICtrl>("price_for_listing")->resetDirty();
}
-void LLPanelClassifiedEdit::setSaveCallback(const commit_callback_t& cb)
+void LLPanelClassifiedEdit::setSaveCallback(const commit_signal_t::slot_type& cb)
{
- getChild<LLButton>("save_changes_btn")->setClickedCallback(cb);
+ mSaveButtonClickedSignal.connect(cb);
}
-void LLPanelClassifiedEdit::setCancelCallback(const commit_callback_t& cb)
+void LLPanelClassifiedEdit::setCancelCallback(const commit_signal_t::slot_type& cb)
{
getChild<LLButton>("cancel_btn")->setClickedCallback(cb);
}
@@ -1559,6 +1896,7 @@ void LLPanelClassifiedEdit::resetControls()
getChild<LLComboBox>("content_type")->setCurrentByIndex(0);
childSetValue("auto_renew", false);
childSetValue("price_for_listing", MINIMUM_PRICE_FOR_LISTING);
+ childSetEnabled("price_for_listing", TRUE);
}
bool LLPanelClassifiedEdit::canClose()
@@ -1566,20 +1904,54 @@ bool LLPanelClassifiedEdit::canClose()
return mCanClose;
}
+void LLPanelClassifiedEdit::draw()
+{
+ LLPanel::draw();
+
+ // Need to re-stretch on every draw because LLTextureCtrl::onSelectCallback
+ // does not trigger callbacks when user navigates through images.
+ stretchSnapshot();
+}
+
+void LLPanelClassifiedEdit::stretchSnapshot()
+{
+ LLPanelClassifiedInfo::stretchSnapshot();
+
+ getChild<LLUICtrl>("edit_icon")->setShape(mSnapshotCtrl->getRect());
+}
+
+U32 LLPanelClassifiedEdit::getContentType()
+{
+ LLComboBox* ct_cb = getChild<LLComboBox>("content_type");
+ return ct_cb->getCurrentIndex();
+}
+
+void LLPanelClassifiedEdit::setContentType(U32 content_type)
+{
+ LLComboBox* ct_cb = getChild<LLComboBox>("content_type");
+ ct_cb->setCurrentByIndex(content_type);
+ ct_cb->resetDirty();
+}
+
+bool LLPanelClassifiedEdit::getAutoRenew()
+{
+ return childGetValue("auto_renew").asBoolean();
+}
+
void LLPanelClassifiedEdit::sendUpdate()
{
LLAvatarClassifiedInfo c_data;
if(getClassifiedId().isNull())
{
- LLUUID id;
- id.generate();
- setClassifiedId(id);
+ setClassifiedId(LLUUID::generateNewID());
}
c_data.agent_id = gAgent.getID();
c_data.classified_id = getClassifiedId();
- c_data.category = getCategory();
+ // *HACK
+ // Categories on server start with 1 while combo-box index starts with 0
+ c_data.category = getCategory() + 1;
c_data.name = getClassifiedName();
c_data.description = getDescription();
c_data.parcel_id = getParcelId();
@@ -1589,12 +1961,27 @@ void LLPanelClassifiedEdit::sendUpdate()
c_data.price_for_listing = getPriceForListing();
LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoUpdate(&c_data);
+
+ if(isNew())
+ {
+ // Lets assume there will be some error.
+ // Successful sendClassifiedInfoUpdate will trigger processProperties and
+ // let us know there was no error.
+ mIsNewWithErrors = true;
+ }
}
U32 LLPanelClassifiedEdit::getCategory()
{
LLComboBox* cat_cb = getChild<LLComboBox>("category");
- return cat_cb->getCurrentIndex() + 1;
+ return cat_cb->getCurrentIndex();
+}
+
+void LLPanelClassifiedEdit::setCategory(U32 category)
+{
+ LLComboBox* cat_cb = getChild<LLComboBox>("category");
+ cat_cb->setCurrentByIndex(category);
+ cat_cb->resetDirty();
}
U8 LLPanelClassifiedEdit::getFlags()
@@ -1653,6 +2040,11 @@ S32 LLPanelClassifiedEdit::getPriceForListing()
return childGetValue("price_for_listing").asInteger();
}
+void LLPanelClassifiedEdit::setPriceForListing(S32 price)
+{
+ childSetValue("price_for_listing", price);
+}
+
void LLPanelClassifiedEdit::onSetLocationClick()
{
setPosGlobal(gAgent.getPositionGlobal());
@@ -1687,18 +2079,51 @@ void LLPanelClassifiedEdit::onSaveClick()
notifyInvalidName();
return;
}
- if(isNew())
+ if(isNew() || isNewWithErrors())
{
if(gStatusBar->getBalance() < getPriceForListing())
{
LLNotificationsUtil::add("ClassifiedInsufficientFunds");
return;
}
+
+ mPublishFloater = LLFloaterReg::findTypedInstance<LLPublishClassifiedFloater>(
+ "publish_classified", LLSD());
+
+ if(!mPublishFloater)
+ {
+ mPublishFloater = LLFloaterReg::getTypedInstance<LLPublishClassifiedFloater>(
+ "publish_classified", LLSD());
+
+ mPublishFloater->setPublishClickedCallback(boost::bind
+ (&LLPanelClassifiedEdit::onPublishFloaterPublishClicked, this));
+ }
+
+ // set spinner value before it has focus or value wont be set
+ mPublishFloater->setPrice(getPriceForListing());
+ mPublishFloater->openFloater(mPublishFloater->getKey());
+ mPublishFloater->center();
+ }
+ else
+ {
+ doSave();
}
+}
+void LLPanelClassifiedEdit::doSave()
+{
mCanClose = true;
sendUpdate();
resetDirty();
+
+ mSaveButtonClickedSignal(this, LLSD());
+}
+
+void LLPanelClassifiedEdit::onPublishFloaterPublishClicked()
+{
+ setPriceForListing(mPublishFloater->getPrice());
+
+ doSave();
}
std::string LLPanelClassifiedEdit::getLocationNotice()
@@ -1745,4 +2170,52 @@ void LLPanelClassifiedEdit::onTexturePickerMouseLeave(LLUICtrl* ctrl)
ctrl->setVisible(FALSE);
}
+void LLPanelClassifiedEdit::onTextureSelected()
+{
+ setSnapshotId(mSnapshotCtrl->getValue().asUUID());
+}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+LLPublishClassifiedFloater::LLPublishClassifiedFloater(const LLSD& key)
+ : LLFloater(key)
+{
+}
+
+LLPublishClassifiedFloater::~LLPublishClassifiedFloater()
+{
+}
+
+BOOL LLPublishClassifiedFloater::postBuild()
+{
+ LLFloater::postBuild();
+
+ childSetAction("publish_btn", boost::bind(&LLFloater::closeFloater, this, false));
+ childSetAction("cancel_btn", boost::bind(&LLFloater::closeFloater, this, false));
+
+ return TRUE;
+}
+
+void LLPublishClassifiedFloater::setPrice(S32 price)
+{
+ childSetValue("price_for_listing", price);
+}
+
+S32 LLPublishClassifiedFloater::getPrice()
+{
+ return childGetValue("price_for_listing").asInteger();
+}
+
+void LLPublishClassifiedFloater::setPublishClickedCallback(const commit_signal_t::slot_type& cb)
+{
+ getChild<LLButton>("publish_btn")->setClickedCallback(cb);
+}
+
+void LLPublishClassifiedFloater::setCancelClickedCallback(const commit_signal_t::slot_type& cb)
+{
+ getChild<LLButton>("cancel_btn")->setClickedCallback(cb);
+}
+
//EOF
diff --git a/indra/newview/llpanelclassified.h b/indra/newview/llpanelclassified.h
index e46806f576..1157649a16 100644
--- a/indra/newview/llpanelclassified.h
+++ b/indra/newview/llpanelclassified.h
@@ -55,6 +55,7 @@ class LLTextEditor;
class LLTextureCtrl;
class LLUICtrl;
class LLMessageSystem;
+class LLScrollContainer;
// *TODO deprecated, should be removed.
// New class implemented in ticket EXT-2095
@@ -201,8 +202,26 @@ private:
void* mUserData;
};
+class LLPublishClassifiedFloater : public LLFloater
+{
+public:
+ LLPublishClassifiedFloater(const LLSD& key);
+ virtual ~LLPublishClassifiedFloater();
+
+ /*virtual*/ BOOL postBuild();
+
+ void setPrice(S32 price);
+ S32 getPrice();
+
+ void setPublishClickedCallback(const commit_signal_t::slot_type& cb);
+ void setCancelClickedCallback(const commit_signal_t::slot_type& cb);
+
+private:
+};
+
class LLPanelClassifiedInfo : public LLPanel, public LLAvatarPropertiesObserver
{
+ LOG_CLASS(LLPanelClassifiedInfo);
public:
static LLPanelClassifiedInfo* create();
@@ -237,6 +256,8 @@ public:
void setClassifiedLocation(const std::string& location);
+ std::string getClassifiedLocation();
+
void setPosGlobal(const LLVector3d& pos) { mPosGlobal = pos; }
LLVector3d& getPosGlobal() { return mPosGlobal; }
@@ -245,14 +266,41 @@ public:
LLUUID getParcelId() { return mParcelId; }
+ void setSimName(const std::string& sim_name) { mSimName = sim_name; }
+
+ std::string getSimName() { return mSimName; }
+
+ void setFromSearch(bool val) { mFromSearch = val; }
+
+ bool fromSearch() { return mFromSearch; }
+
bool getInfoLoaded() { return mInfoLoaded; }
void setInfoLoaded(bool loaded) { mInfoLoaded = loaded; }
+ static void setClickThrough(
+ const LLUUID& classified_id,
+ S32 teleport,
+ S32 map,
+ S32 profile,
+ bool from_new_table);
+
+ static void sendClickMessage(
+ const std::string& type,
+ bool from_search,
+ const LLUUID& classified_id,
+ const LLUUID& parcel_id,
+ const LLVector3d& global_pos,
+ const std::string& sim_name);
+
void setExitCallback(const commit_callback_t& cb);
void setEditClassifiedCallback(const commit_callback_t& cb);
+ /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
+
+ /*virtual*/ void draw();
+
protected:
LLPanelClassifiedInfo();
@@ -266,21 +314,52 @@ protected:
const std::string& sim_name,
const LLVector3d& pos_global);
+ void stretchSnapshot();
+ void sendClickMessage(const std::string& type);
+
+ LLRect getDefaultSnapshotRect();
+
+ void scrollToTop();
+
void onMapClick();
void onTeleportClick();
void onExit();
+ bool mSnapshotStreched;
+ LLRect mSnapshotRect;
+ LLTextureCtrl* mSnapshotCtrl;
+
private:
LLUUID mAvatarId;
LLUUID mClassifiedId;
LLVector3d mPosGlobal;
LLUUID mParcelId;
+ std::string mSimName;
+ bool mFromSearch;
bool mInfoLoaded;
+
+ LLScrollContainer* mScrollContainer;
+ LLPanel* mScrollingPanel;
+
+ S32 mScrollingPanelMinHeight;
+ S32 mScrollingPanelWidth;
+
+ // Needed for stat tracking
+ S32 mTeleportClicksOld;
+ S32 mMapClicksOld;
+ S32 mProfileClicksOld;
+ S32 mTeleportClicksNew;
+ S32 mMapClicksNew;
+ S32 mProfileClicksNew;
+
+ typedef std::list<LLPanelClassifiedInfo*> panel_list_t;
+ static panel_list_t sAllPanels;
};
class LLPanelClassifiedEdit : public LLPanelClassifiedInfo
{
+ LOG_CLASS(LLPanelClassifiedEdit);
public:
static LLPanelClassifiedEdit* create();
@@ -289,6 +368,8 @@ public:
/*virtual*/ BOOL postBuild();
+ void fillIn(const LLSD& key);
+
/*virtual*/ void onOpen(const LLSD& key);
/*virtual*/ void processProperties(void* data, EAvatarProcessorType type);
@@ -297,31 +378,47 @@ public:
/*virtual*/ void resetDirty();
- void setSaveCallback(const commit_callback_t& cb);
+ void setSaveCallback(const commit_signal_t::slot_type& cb);
- void setCancelCallback(const commit_callback_t& cb);
+ void setCancelCallback(const commit_signal_t::slot_type& cb);
/*virtual*/ void resetControls();
bool isNew() { return mIsNew; }
+ bool isNewWithErrors() { return mIsNewWithErrors; }
+
bool canClose();
+ void draw();
+
+ void stretchSnapshot();
+
+ U32 getCategory();
+
+ void setCategory(U32 category);
+
+ U32 getContentType();
+
+ void setContentType(U32 content_type);
+
+ bool getAutoRenew();
+
+ S32 getPriceForListing();
+
protected:
LLPanelClassifiedEdit();
void sendUpdate();
- U32 getCategory();
-
void enableVerbs(bool enable);
void enableEditing(bool enable);
std::string makeClassifiedName();
- S32 getPriceForListing();
+ void setPriceForListing(S32 price);
U8 getFlags();
@@ -335,12 +432,23 @@ protected:
void onChange();
void onSaveClick();
+ void doSave();
+
+ void onPublishFloaterPublishClicked();
+
void onTexturePickerMouseEnter(LLUICtrl* ctrl);
void onTexturePickerMouseLeave(LLUICtrl* ctrl);
+ void onTextureSelected();
+
private:
bool mIsNew;
+ bool mIsNewWithErrors;
bool mCanClose;
+
+ LLPublishClassifiedFloater* mPublishFloater;
+
+ commit_signal_t mSaveButtonClickedSignal;
};
#endif // LL_LLPANELCLASSIFIED_H
diff --git a/indra/newview/llpanelcontents.cpp b/indra/newview/llpanelcontents.cpp
index 2a7d097f94..f4c0a842e7 100644
--- a/indra/newview/llpanelcontents.cpp
+++ b/indra/newview/llpanelcontents.cpp
@@ -40,6 +40,7 @@
#include "llerror.h"
#include "llfloaterreg.h"
#include "llfontgl.h"
+#include "llinventorydefines.h"
#include "llmaterialtable.h"
#include "llpermissionsflags.h"
#include "llrect.h"
@@ -180,7 +181,7 @@ void LLPanelContents::onClickNewScript(void *userdata)
LLTrans::getString("PanelContentsNewScript"),
desc,
LLSaleInfo::DEFAULT,
- LLViewerInventoryItem::II_FLAGS_NONE,
+ LLInventoryItemFlags::II_FLAGS_NONE,
time_corrected());
object->saveScript(new_item, TRUE, true);
diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp
index e7acc68b93..4402b2130f 100644
--- a/indra/newview/llpaneleditwearable.cpp
+++ b/indra/newview/llpaneleditwearable.cpp
@@ -50,6 +50,19 @@
#include "llaccordionctrltab.h"
#include "llagentwearables.h"
#include "llscrollingpanelparam.h"
+#include "llradiogroup.h"
+#include "llnotificationsutil.h"
+
+#include "llcolorswatch.h"
+#include "lltexturectrl.h"
+#include "lltextureentry.h"
+#include "llviewercontrol.h" // gSavedSettings
+#include "llviewertexturelist.h"
+#include "llagentcamera.h"
+#include "llmorphview.h"
+
+#include "llcommandhandler.h"
+#include "lltextutil.h"
// register panel with appropriate XML
static LLRegisterPanelClassWrapper<LLPanelEditWearable> t_edit_wearable("panel_edit_wearable");
@@ -88,6 +101,8 @@ enum ESubpart {
SUBPART_TATTOO
};
+using namespace LLVOAvatarDefines;
+
typedef std::vector<ESubpart> subpart_vec_t;
// Locally defined classes
@@ -107,25 +122,28 @@ public:
public:
struct WearableEntry : public LLDictionaryEntry
{
- WearableEntry(EWearableType type,
+ WearableEntry(LLWearableType::EType type,
const std::string &title,
const std::string &desc_title,
- U8 num_subparts, ... ); // number of subparts followed by a list of ESubparts
+ U8 num_color_swatches, // number of 'color_swatches'
+ U8 num_texture_pickers, // number of 'texture_pickers'
+ U8 num_subparts, ... ); // number of subparts followed by a list of ETextureIndex and ESubparts
- const EWearableType mWearableType;
+ const LLWearableType::EType mWearableType;
const std::string mTitle;
const std::string mDescTitle;
subpart_vec_t mSubparts;
-
+ texture_vec_t mColorSwatchCtrls;
+ texture_vec_t mTextureCtrls;
};
- struct Wearables : public LLDictionary<EWearableType, WearableEntry>
+ struct Wearables : public LLDictionary<LLWearableType::EType, WearableEntry>
{
Wearables();
} mWearables;
- const WearableEntry* getWearable(EWearableType type) const { return mWearables.lookup(type); }
+ const WearableEntry* getWearable(LLWearableType::EType type) const { return mWearables.lookup(type); }
//--------------------------------------------------------------------
// Subparts
@@ -158,6 +176,35 @@ public:
} mSubparts;
const SubpartEntry* getSubpart(ESubpart subpart) const { return mSubparts.lookup(subpart); }
+
+ //--------------------------------------------------------------------
+ // Picker Control Entries
+ //--------------------------------------------------------------------
+public:
+ struct PickerControlEntry : public LLDictionaryEntry
+ {
+ PickerControlEntry(ETextureIndex tex_index,
+ const std::string name,
+ const LLUUID default_image_id = LLUUID::null,
+ const bool allow_no_texture = false);
+ ETextureIndex mTextureIndex;
+ const std::string mControlName;
+ const LLUUID mDefaultImageId;
+ const bool mAllowNoTexture;
+ };
+
+ struct ColorSwatchCtrls : public LLDictionary<ETextureIndex, PickerControlEntry>
+ {
+ ColorSwatchCtrls();
+ } mColorSwatchCtrls;
+
+ struct TextureCtrls : public LLDictionary<ETextureIndex, PickerControlEntry>
+ {
+ TextureCtrls();
+ } mTextureCtrls;
+
+ const PickerControlEntry* getTexturePicker(ETextureIndex index) const { return mTextureCtrls.lookup(index); }
+ const PickerControlEntry* getColorSwatch(ETextureIndex index) const { return mColorSwatchCtrls.lookup(index); }
};
LLEditWearableDictionary::LLEditWearableDictionary()
@@ -172,26 +219,31 @@ LLEditWearableDictionary::~LLEditWearableDictionary()
LLEditWearableDictionary::Wearables::Wearables()
{
- addEntry(WT_SHAPE, new WearableEntry(WT_SHAPE,"edit_shape_title","shape_desc_text",9, SUBPART_SHAPE_HEAD, SUBPART_SHAPE_EYES, SUBPART_SHAPE_EARS, SUBPART_SHAPE_NOSE, SUBPART_SHAPE_MOUTH, SUBPART_SHAPE_CHIN, SUBPART_SHAPE_TORSO, SUBPART_SHAPE_LEGS, SUBPART_SHAPE_WHOLE));
- addEntry(WT_SKIN, new WearableEntry(WT_SKIN,"edit_skin_title","skin_desc_text",4, SUBPART_SKIN_COLOR, SUBPART_SKIN_FACEDETAIL, SUBPART_SKIN_MAKEUP, SUBPART_SKIN_BODYDETAIL));
- addEntry(WT_HAIR, new WearableEntry(WT_HAIR,"edit_hair_title","hair_desc_text",4, SUBPART_HAIR_COLOR, SUBPART_HAIR_STYLE, SUBPART_HAIR_EYEBROWS, SUBPART_HAIR_FACIAL));
- addEntry(WT_EYES, new WearableEntry(WT_EYES,"edit_eyes_title","eyes_desc_text",1, SUBPART_EYES));
- addEntry(WT_SHIRT, new WearableEntry(WT_SHIRT,"edit_shirt_title","shirt_desc_text",1, SUBPART_SHIRT));
- addEntry(WT_PANTS, new WearableEntry(WT_PANTS,"edit_pants_title","pants_desc_text",1, SUBPART_PANTS));
- addEntry(WT_SHOES, new WearableEntry(WT_SHOES,"edit_shoes_title","shoes_desc_text",1, SUBPART_SHOES));
- addEntry(WT_SOCKS, new WearableEntry(WT_SOCKS,"edit_socks_title","socks_desc_text",1, SUBPART_SOCKS));
- addEntry(WT_JACKET, new WearableEntry(WT_JACKET,"edit_jacket_title","jacket_desc_text",1, SUBPART_JACKET));
- addEntry(WT_GLOVES, new WearableEntry(WT_GLOVES,"edit_gloves_title","gloves_desc_text",1, SUBPART_GLOVES));
- addEntry(WT_UNDERSHIRT, new WearableEntry(WT_UNDERSHIRT,"edit_undershirt_title","undershirt_desc_text",1, SUBPART_UNDERSHIRT));
- addEntry(WT_UNDERPANTS, new WearableEntry(WT_UNDERPANTS,"edit_underpants_title","underpants_desc_text",1, SUBPART_UNDERPANTS));
- addEntry(WT_SKIRT, new WearableEntry(WT_SKIRT,"edit_skirt_title","skirt_desc_text",1, SUBPART_SKIRT));
- addEntry(WT_ALPHA, new WearableEntry(WT_ALPHA,"edit_alpha_title","alpha_desc_text",1, SUBPART_ALPHA));
- addEntry(WT_TATTOO, new WearableEntry(WT_TATTOO,"edit_tattoo_title","tattoo_desc_text",1, SUBPART_TATTOO));
-}
-
-LLEditWearableDictionary::WearableEntry::WearableEntry(EWearableType type,
+ // note the subpart that is listed first is treated as "default", regardless of what order is in enum.
+ // Please match the order presented in XUI. -Nyx
+ // this will affect what camera angle is shown when first editing a wearable
+ addEntry(LLWearableType::WT_SHAPE, new WearableEntry(LLWearableType::WT_SHAPE,"edit_shape_title","shape_desc_text",0,0,9, SUBPART_SHAPE_WHOLE, SUBPART_SHAPE_HEAD, SUBPART_SHAPE_EYES, SUBPART_SHAPE_EARS, SUBPART_SHAPE_NOSE, SUBPART_SHAPE_MOUTH, SUBPART_SHAPE_CHIN, SUBPART_SHAPE_TORSO, SUBPART_SHAPE_LEGS ));
+ addEntry(LLWearableType::WT_SKIN, new WearableEntry(LLWearableType::WT_SKIN,"edit_skin_title","skin_desc_text",0,3,4, TEX_HEAD_BODYPAINT, TEX_UPPER_BODYPAINT, TEX_LOWER_BODYPAINT, SUBPART_SKIN_COLOR, SUBPART_SKIN_FACEDETAIL, SUBPART_SKIN_MAKEUP, SUBPART_SKIN_BODYDETAIL));
+ addEntry(LLWearableType::WT_HAIR, new WearableEntry(LLWearableType::WT_HAIR,"edit_hair_title","hair_desc_text",0,1,4, TEX_HAIR, SUBPART_HAIR_COLOR, SUBPART_HAIR_STYLE, SUBPART_HAIR_EYEBROWS, SUBPART_HAIR_FACIAL));
+ addEntry(LLWearableType::WT_EYES, new WearableEntry(LLWearableType::WT_EYES,"edit_eyes_title","eyes_desc_text",0,1,1, TEX_EYES_IRIS, SUBPART_EYES));
+ addEntry(LLWearableType::WT_SHIRT, new WearableEntry(LLWearableType::WT_SHIRT,"edit_shirt_title","shirt_desc_text",1,1,1, TEX_UPPER_SHIRT, TEX_UPPER_SHIRT, SUBPART_SHIRT));
+ addEntry(LLWearableType::WT_PANTS, new WearableEntry(LLWearableType::WT_PANTS,"edit_pants_title","pants_desc_text",1,1,1, TEX_LOWER_PANTS, TEX_LOWER_PANTS, SUBPART_PANTS));
+ addEntry(LLWearableType::WT_SHOES, new WearableEntry(LLWearableType::WT_SHOES,"edit_shoes_title","shoes_desc_text",1,1,1, TEX_LOWER_SHOES, TEX_LOWER_SHOES, SUBPART_SHOES));
+ addEntry(LLWearableType::WT_SOCKS, new WearableEntry(LLWearableType::WT_SOCKS,"edit_socks_title","socks_desc_text",1,1,1, TEX_LOWER_SOCKS, TEX_LOWER_SOCKS, SUBPART_SOCKS));
+ addEntry(LLWearableType::WT_JACKET, new WearableEntry(LLWearableType::WT_JACKET,"edit_jacket_title","jacket_desc_text",1,2,1, TEX_UPPER_JACKET, TEX_UPPER_JACKET, TEX_LOWER_JACKET, SUBPART_JACKET));
+ addEntry(LLWearableType::WT_GLOVES, new WearableEntry(LLWearableType::WT_GLOVES,"edit_gloves_title","gloves_desc_text",1,1,1, TEX_UPPER_GLOVES, TEX_UPPER_GLOVES, SUBPART_GLOVES));
+ addEntry(LLWearableType::WT_UNDERSHIRT, new WearableEntry(LLWearableType::WT_UNDERSHIRT,"edit_undershirt_title","undershirt_desc_text",1,1,1, TEX_UPPER_UNDERSHIRT, TEX_UPPER_UNDERSHIRT, SUBPART_UNDERSHIRT));
+ addEntry(LLWearableType::WT_UNDERPANTS, new WearableEntry(LLWearableType::WT_UNDERPANTS,"edit_underpants_title","underpants_desc_text",1,1,1, TEX_LOWER_UNDERPANTS, TEX_LOWER_UNDERPANTS, SUBPART_UNDERPANTS));
+ addEntry(LLWearableType::WT_SKIRT, new WearableEntry(LLWearableType::WT_SKIRT,"edit_skirt_title","skirt_desc_text",1,1,1, TEX_SKIRT, TEX_SKIRT, SUBPART_SKIRT));
+ addEntry(LLWearableType::WT_ALPHA, new WearableEntry(LLWearableType::WT_ALPHA,"edit_alpha_title","alpha_desc_text",0,5,1, TEX_LOWER_ALPHA, TEX_UPPER_ALPHA, TEX_HEAD_ALPHA, TEX_EYES_ALPHA, TEX_HAIR_ALPHA, SUBPART_ALPHA));
+ addEntry(LLWearableType::WT_TATTOO, new WearableEntry(LLWearableType::WT_TATTOO,"edit_tattoo_title","tattoo_desc_text",1,3,1, TEX_HEAD_TATTOO, TEX_LOWER_TATTOO, TEX_UPPER_TATTOO, TEX_HEAD_TATTOO, SUBPART_TATTOO));
+}
+
+LLEditWearableDictionary::WearableEntry::WearableEntry(LLWearableType::EType type,
const std::string &title,
const std::string &desc_title,
+ U8 num_color_swatches,
+ U8 num_texture_pickers,
U8 num_subparts, ... ) :
LLDictionaryEntry(title),
mWearableType(type),
@@ -201,6 +253,18 @@ LLEditWearableDictionary::WearableEntry::WearableEntry(EWearableType type,
va_list argp;
va_start(argp, num_subparts);
+ for (U8 i = 0; i < num_color_swatches; ++i)
+ {
+ ETextureIndex index = (ETextureIndex)va_arg(argp,int);
+ mColorSwatchCtrls.push_back(index);
+ }
+
+ for (U8 i = 0; i < num_texture_pickers; ++i)
+ {
+ ETextureIndex index = (ETextureIndex)va_arg(argp,int);
+ mTextureCtrls.push_back(index);
+ }
+
for (U8 i = 0; i < num_subparts; ++i)
{
ESubpart part = (ESubpart)va_arg(argp,int);
@@ -265,12 +329,280 @@ LLEditWearableDictionary::SubpartEntry::SubpartEntry(ESubpart part,
{
}
+LLEditWearableDictionary::ColorSwatchCtrls::ColorSwatchCtrls()
+{
+ addEntry ( TEX_UPPER_SHIRT, new PickerControlEntry (TEX_UPPER_SHIRT, "Color/Tint" ));
+ addEntry ( TEX_LOWER_PANTS, new PickerControlEntry (TEX_LOWER_PANTS, "Color/Tint" ));
+ addEntry ( TEX_LOWER_SHOES, new PickerControlEntry (TEX_LOWER_SHOES, "Color/Tint" ));
+ addEntry ( TEX_LOWER_SOCKS, new PickerControlEntry (TEX_LOWER_SOCKS, "Color/Tint" ));
+ addEntry ( TEX_UPPER_JACKET, new PickerControlEntry (TEX_UPPER_JACKET, "Color/Tint" ));
+ addEntry ( TEX_SKIRT, new PickerControlEntry (TEX_SKIRT, "Color/Tint" ));
+ addEntry ( TEX_UPPER_GLOVES, new PickerControlEntry (TEX_UPPER_GLOVES, "Color/Tint" ));
+ addEntry ( TEX_UPPER_UNDERSHIRT, new PickerControlEntry (TEX_UPPER_UNDERSHIRT, "Color/Tint" ));
+ addEntry ( TEX_LOWER_UNDERPANTS, new PickerControlEntry (TEX_LOWER_UNDERPANTS, "Color/Tint" ));
+ addEntry ( TEX_HEAD_TATTOO, new PickerControlEntry(TEX_HEAD_TATTOO, "Color/Tint" ));
+}
+
+LLEditWearableDictionary::TextureCtrls::TextureCtrls()
+{
+ addEntry ( TEX_HEAD_BODYPAINT, new PickerControlEntry (TEX_HEAD_BODYPAINT, "Head Tattoos", LLUUID::null, TRUE ));
+ addEntry ( TEX_UPPER_BODYPAINT, new PickerControlEntry (TEX_UPPER_BODYPAINT, "Upper Tattoos", LLUUID::null, TRUE ));
+ addEntry ( TEX_LOWER_BODYPAINT, new PickerControlEntry (TEX_LOWER_BODYPAINT, "Lower Tattoos", LLUUID::null, TRUE ));
+ addEntry ( TEX_HAIR, new PickerControlEntry (TEX_HAIR, "Texture", LLUUID( gSavedSettings.getString( "UIImgDefaultHairUUID" ) ), FALSE ));
+ addEntry ( TEX_EYES_IRIS, new PickerControlEntry (TEX_EYES_IRIS, "Iris", LLUUID( gSavedSettings.getString( "UIImgDefaultEyesUUID" ) ), FALSE ));
+ addEntry ( TEX_UPPER_SHIRT, new PickerControlEntry (TEX_UPPER_SHIRT, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultShirtUUID" ) ), FALSE ));
+ addEntry ( TEX_LOWER_PANTS, new PickerControlEntry (TEX_LOWER_PANTS, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultPantsUUID" ) ), FALSE ));
+ addEntry ( TEX_LOWER_SHOES, new PickerControlEntry (TEX_LOWER_SHOES, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultShoesUUID" ) ), FALSE ));
+ addEntry ( TEX_LOWER_SOCKS, new PickerControlEntry (TEX_LOWER_SOCKS, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultSocksUUID" ) ), FALSE ));
+ addEntry ( TEX_UPPER_JACKET, new PickerControlEntry (TEX_UPPER_JACKET, "Upper Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultJacketUUID" ) ), FALSE ));
+ addEntry ( TEX_LOWER_JACKET, new PickerControlEntry (TEX_LOWER_JACKET, "Lower Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultJacketUUID" ) ), FALSE ));
+ addEntry ( TEX_SKIRT, new PickerControlEntry (TEX_SKIRT, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultSkirtUUID" ) ), FALSE ));
+ addEntry ( TEX_UPPER_GLOVES, new PickerControlEntry (TEX_UPPER_GLOVES, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultGlovesUUID" ) ), FALSE ));
+ addEntry ( TEX_UPPER_UNDERSHIRT, new PickerControlEntry (TEX_UPPER_UNDERSHIRT, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultUnderwearUUID" ) ), FALSE ));
+ addEntry ( TEX_LOWER_UNDERPANTS, new PickerControlEntry (TEX_LOWER_UNDERPANTS, "Fabric", LLUUID( gSavedSettings.getString( "UIImgDefaultUnderwearUUID" ) ), FALSE ));
+ addEntry ( TEX_LOWER_ALPHA, new PickerControlEntry (TEX_LOWER_ALPHA, "Lower Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE ));
+ addEntry ( TEX_UPPER_ALPHA, new PickerControlEntry (TEX_UPPER_ALPHA, "Upper Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE ));
+ addEntry ( TEX_HEAD_ALPHA, new PickerControlEntry (TEX_HEAD_ALPHA, "Head Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE ));
+ addEntry ( TEX_EYES_ALPHA, new PickerControlEntry (TEX_EYES_ALPHA, "Eye Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE ));
+ addEntry ( TEX_HAIR_ALPHA, new PickerControlEntry (TEX_HAIR_ALPHA, "Hair Alpha", LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) ), TRUE ));
+ addEntry ( TEX_LOWER_TATTOO, new PickerControlEntry (TEX_LOWER_TATTOO, "Lower Tattoo", LLUUID::null, TRUE ));
+ addEntry ( TEX_UPPER_TATTOO, new PickerControlEntry (TEX_UPPER_TATTOO, "Upper Tattoo", LLUUID::null, TRUE ));
+ addEntry ( TEX_HEAD_TATTOO, new PickerControlEntry (TEX_HEAD_TATTOO, "Head Tattoo", LLUUID::null, TRUE ));
+}
+
+LLEditWearableDictionary::PickerControlEntry::PickerControlEntry(ETextureIndex tex_index,
+ const std::string name,
+ const LLUUID default_image_id,
+ const bool allow_no_texture) :
+ LLDictionaryEntry(name),
+ mTextureIndex(tex_index),
+ mControlName(name),
+ mDefaultImageId(default_image_id),
+ mAllowNoTexture(allow_no_texture)
+{
+}
+
+// Helper functions.
+static const texture_vec_t null_texture_vec;
+
+// Specializations of this template function return a vector of texture indexes of particular control type
+// (i.e. LLColorSwatchCtrl or LLTextureCtrl) which are contained in given WearableEntry.
+template <typename T>
+const texture_vec_t&
+get_pickers_indexes(const LLEditWearableDictionary::WearableEntry *wearable_entry) { return null_texture_vec; }
+
+// Specializations of this template function return picker control entry for particular control type.
+template <typename T>
+const LLEditWearableDictionary::PickerControlEntry*
+get_picker_entry (const ETextureIndex index) { return NULL; }
+
+typedef boost::function<void(LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry*)> function_t;
+
+typedef struct PickerControlEntryNamePredicate
+{
+ PickerControlEntryNamePredicate(const std::string name) : mName (name) {};
+ bool operator()(const LLEditWearableDictionary::PickerControlEntry* entry) const
+ {
+ return (entry && entry->mName == mName);
+ }
+private:
+ const std::string mName;
+} PickerControlEntryNamePredicate;
+
+// A full specialization of get_pickers_indexes for LLColorSwatchCtrl
+template <>
+const texture_vec_t&
+get_pickers_indexes<LLColorSwatchCtrl> (const LLEditWearableDictionary::WearableEntry *wearable_entry)
+{
+ if (!wearable_entry)
+ {
+ llwarns << "could not get LLColorSwatchCtrl indexes for null wearable entry." << llendl;
+ return null_texture_vec;
+ }
+ return wearable_entry->mColorSwatchCtrls;
+}
+
+// A full specialization of get_pickers_indexes for LLTextureCtrl
+template <>
+const texture_vec_t&
+get_pickers_indexes<LLTextureCtrl> (const LLEditWearableDictionary::WearableEntry *wearable_entry)
+{
+ if (!wearable_entry)
+ {
+ llwarns << "could not get LLTextureCtrl indexes for null wearable entry." << llendl;
+ return null_texture_vec;
+ }
+ return wearable_entry->mTextureCtrls;
+}
+
+// A full specialization of get_picker_entry for LLColorSwatchCtrl
+template <>
+const LLEditWearableDictionary::PickerControlEntry*
+get_picker_entry<LLColorSwatchCtrl> (const ETextureIndex index)
+{
+ return LLEditWearableDictionary::getInstance()->getColorSwatch(index);
+}
+
+// A full specialization of get_picker_entry for LLTextureCtrl
+template <>
+const LLEditWearableDictionary::PickerControlEntry*
+get_picker_entry<LLTextureCtrl> (const ETextureIndex index)
+{
+ return LLEditWearableDictionary::getInstance()->getTexturePicker(index);
+}
+
+template <typename CtrlType, class Predicate>
+const LLEditWearableDictionary::PickerControlEntry*
+find_picker_ctrl_entry_if(LLWearableType::EType type, const Predicate pred)
+{
+ const LLEditWearableDictionary::WearableEntry *wearable_entry
+ = LLEditWearableDictionary::getInstance()->getWearable(type);
+ if (!wearable_entry)
+ {
+ llwarns << "could not get wearable dictionary entry for wearable of type: " << type << llendl;
+ return NULL;
+ }
+ const texture_vec_t& indexes = get_pickers_indexes<CtrlType>(wearable_entry);
+ for (texture_vec_t::const_iterator
+ iter = indexes.begin(),
+ iter_end = indexes.end();
+ iter != iter_end; ++iter)
+ {
+ const ETextureIndex te = *iter;
+ const LLEditWearableDictionary::PickerControlEntry* entry
+ = get_picker_entry<CtrlType>(te);
+ if (!entry)
+ {
+ llwarns << "could not get picker dictionary entry (" << te << ") for wearable of type: " << type << llendl;
+ continue;
+ }
+ if (pred(entry))
+ {
+ return entry;
+ }
+ }
+ return NULL;
+}
+
+template <typename CtrlType>
+void
+for_each_picker_ctrl_entry(LLPanel* panel, LLWearableType::EType type, function_t fun)
+{
+ if (!panel)
+ {
+ llwarns << "the panel wasn't passed for wearable of type: " << type << llendl;
+ return;
+ }
+ const LLEditWearableDictionary::WearableEntry *wearable_entry
+ = LLEditWearableDictionary::getInstance()->getWearable(type);
+ if (!wearable_entry)
+ {
+ llwarns << "could not get wearable dictionary entry for wearable of type: " << type << llendl;
+ return;
+ }
+ const texture_vec_t& indexes = get_pickers_indexes<CtrlType>(wearable_entry);
+ for (texture_vec_t::const_iterator
+ iter = indexes.begin(),
+ iter_end = indexes.end();
+ iter != iter_end; ++iter)
+ {
+ const ETextureIndex te = *iter;
+ const LLEditWearableDictionary::PickerControlEntry* entry
+ = get_picker_entry<CtrlType>(te);
+ if (!entry)
+ {
+ llwarns << "could not get picker dictionary entry (" << te << ") for wearable of type: " << type << llendl;
+ continue;
+ }
+ fun (panel, entry);
+ }
+}
+
+// The helper functions for pickers management
+static void init_color_swatch_ctrl(LLPanelEditWearable* self, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry)
+{
+ LLColorSwatchCtrl* color_swatch_ctrl = panel->getChild<LLColorSwatchCtrl>(entry->mControlName);
+ if (color_swatch_ctrl)
+ {
+ // Can't get the color from the wearable here, since the wearable may not be set when this is called.
+ color_swatch_ctrl->setOriginal(LLColor4::white);
+ }
+}
+
+static void init_texture_ctrl(LLPanelEditWearable* self, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry)
+{
+ LLTextureCtrl* texture_ctrl = panel->getChild<LLTextureCtrl>(entry->mControlName);
+ if (texture_ctrl)
+ {
+ texture_ctrl->setDefaultImageAssetID(entry->mDefaultImageId);
+ texture_ctrl->setAllowNoTexture(entry->mAllowNoTexture);
+ // Don't allow (no copy) or (notransfer) textures to be selected.
+ texture_ctrl->setImmediateFilterPermMask(PERM_NONE);
+ texture_ctrl->setNonImmediateFilterPermMask(PERM_NONE);
+ }
+}
+
+static void update_color_swatch_ctrl(LLPanelEditWearable* self, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry)
+{
+ LLColorSwatchCtrl* color_swatch_ctrl = panel->getChild<LLColorSwatchCtrl>(entry->mControlName);
+ if (color_swatch_ctrl)
+ {
+ color_swatch_ctrl->set(self->getWearable()->getClothesColor(entry->mTextureIndex));
+ }
+}
+
+static void update_texture_ctrl(LLPanelEditWearable* self, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry)
+{
+ LLTextureCtrl* texture_ctrl = panel->getChild<LLTextureCtrl>(entry->mControlName);
+ if (texture_ctrl)
+ {
+ LLUUID new_id;
+ LLLocalTextureObject *lto = self->getWearable()->getLocalTextureObject(entry->mTextureIndex);
+ if( lto && (lto->getID() != IMG_DEFAULT_AVATAR) )
+ {
+ new_id = lto->getID();
+ }
+ else
+ {
+ new_id = LLUUID::null;
+ }
+ LLUUID old_id = texture_ctrl->getImageAssetID();
+ if (old_id != new_id)
+ {
+ // texture has changed, close the floater to avoid DEV-22461
+ texture_ctrl->closeDependentFloater();
+ }
+ texture_ctrl->setImageAssetID(new_id);
+ }
+}
+
+static void set_enabled_color_swatch_ctrl(bool enabled, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry)
+{
+ LLColorSwatchCtrl* color_swatch_ctrl = panel->getChild<LLColorSwatchCtrl>(entry->mControlName);
+ if (color_swatch_ctrl)
+ {
+ color_swatch_ctrl->setEnabled(enabled);
+ }
+}
+
+static void set_enabled_texture_ctrl(bool enabled, LLPanel* panel, const LLEditWearableDictionary::PickerControlEntry* entry)
+{
+ LLTextureCtrl* texture_ctrl = panel->getChild<LLTextureCtrl>(entry->mControlName);
+ if (texture_ctrl)
+ {
+ texture_ctrl->setEnabled(enabled);
+ }
+}
// LLPanelEditWearable
LLPanelEditWearable::LLPanelEditWearable()
: LLPanel()
+ , mWearablePtr(NULL)
+ , mWearableItem(NULL)
{
+ mCommitCallbackRegistrar.add("ColorSwatch.Commit", boost::bind(&LLPanelEditWearable::onColorSwatchCommit, this, _1));
+ mCommitCallbackRegistrar.add("TexturePicker.Commit", boost::bind(&LLPanelEditWearable::onTexturePickerCommit, this, _1));
}
//virtual
@@ -279,6 +611,36 @@ LLPanelEditWearable::~LLPanelEditWearable()
}
+bool LLPanelEditWearable::changeHeightUnits(const LLSD& new_value)
+{
+ updateMetricLayout( new_value.asBoolean() );
+ updateTypeSpecificControls(LLWearableType::WT_SHAPE);
+ return true;
+}
+
+void LLPanelEditWearable::updateMetricLayout(BOOL new_value)
+{
+ LLUIString current_metric, replacment_metric;
+ current_metric = new_value ? mMeters : mFeet;
+ replacment_metric = new_value ? mFeet : mMeters;
+ mHeigthValue.setArg( "[METRIC1]", current_metric.getString() );
+ mReplacementMetricUrl.setArg( "[URL_METRIC2]", std::string("[secondlife:///app/metricsystem ") + replacment_metric.getString() + std::string("]"));
+}
+
+void LLPanelEditWearable::updateAvatarHeightLabel()
+{
+ mTxtAvatarHeight->setText(LLStringUtil::null);
+ LLStyle::Params param;
+ param.color = mAvatarHeigthLabelColor;
+ mTxtAvatarHeight->appendText(mHeigth, false, param);
+ param.color = mAvatarHeigthValueLabelColor;
+ mTxtAvatarHeight->appendText(mHeigthValue, false, param);
+ param.color = mAvatarHeigthLabelColor; // using mAvatarHeigthLabelColor for '/' separator
+ mTxtAvatarHeight->appendText(" / ", false, param);
+ mTxtAvatarHeight->appendText(this->mReplacementMetricUrl, false, param);
+}
+
+
// virtual
BOOL LLPanelEditWearable::postBuild()
{
@@ -290,11 +652,14 @@ BOOL LLPanelEditWearable::postBuild()
// handled at appearance panel level?
//mBtnBack->setClickedCallback(boost::bind(&LLPanelEditWearable::onBackButtonClicked, this));
- mTextEditor = getChild<LLTextEditor>("description");
+ mNameEditor = getChild<LLLineEditor>("description");
mPanelTitle = getChild<LLTextBox>("edit_wearable_title");
mDescTitle = getChild<LLTextBox>("description_text");
+ getChild<LLRadioGroup>("sex_radio")->setCommitCallback(boost::bind(&LLPanelEditWearable::onCommitSexChange, this));
+ getChild<LLButton>("save_as_button")->setCommitCallback(boost::bind(&LLPanelEditWearable::onSaveAsButtonClicked, this));
+
// The following panels will be shown/hidden based on what wearable we're editing
// body parts
mPanelShape = getChild<LLPanel>("edit_shape_panel");
@@ -315,8 +680,73 @@ BOOL LLPanelEditWearable::postBuild()
mPanelAlpha = getChild<LLPanel>("edit_alpha_panel");
mPanelTattoo = getChild<LLPanel>("edit_tattoo_panel");
+ mTxtAvatarHeight = mPanelShape->getChild<LLTextBox>("avatar_height");
+
mWearablePtr = NULL;
+ configureAlphaCheckbox(LLVOAvatarDefines::TEX_LOWER_ALPHA, "lower alpha texture invisible");
+ configureAlphaCheckbox(LLVOAvatarDefines::TEX_UPPER_ALPHA, "upper alpha texture invisible");
+ configureAlphaCheckbox(LLVOAvatarDefines::TEX_HEAD_ALPHA, "head alpha texture invisible");
+ configureAlphaCheckbox(LLVOAvatarDefines::TEX_EYES_ALPHA, "eye alpha texture invisible");
+ configureAlphaCheckbox(LLVOAvatarDefines::TEX_HAIR_ALPHA, "hair alpha texture invisible");
+
+ // configure tab expanded callbacks
+ for (U32 type_index = 0; type_index < (U32)LLWearableType::WT_COUNT; ++type_index)
+ {
+ LLWearableType::EType type = (LLWearableType::EType) type_index;
+ const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type);
+ if (!wearable_entry)
+ {
+ llwarns << "could not get wearable dictionary entry for wearable of type: " << type << llendl;
+ continue;
+ }
+ U8 num_subparts = wearable_entry->mSubparts.size();
+
+ for (U8 index = 0; index < num_subparts; ++index)
+ {
+ // dive into data structures to get the panel we need
+ ESubpart subpart_e = wearable_entry->mSubparts[index];
+ const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e);
+
+ if (!subpart_entry)
+ {
+ llwarns << "could not get wearable subpart dictionary entry for subpart: " << subpart_e << llendl;
+ continue;
+ }
+
+ const std::string accordion_tab = subpart_entry->mAccordionTab;
+
+ LLAccordionCtrlTab *tab = getChild<LLAccordionCtrlTab>(accordion_tab);
+
+ if (!tab)
+ {
+ llwarns << "could not get llaccordionctrltab from UI with name: " << accordion_tab << llendl;
+ continue;
+ }
+
+ // initialize callback to ensure camera view changes appropriately.
+ tab->setDropDownStateChangedCallback(boost::bind(&LLPanelEditWearable::onTabExpandedCollapsed,this,_2,index));
+ }
+
+ // initialize texture and color picker controls
+ for_each_picker_ctrl_entry <LLColorSwatchCtrl> (getPanel(type), type, boost::bind(init_color_swatch_ctrl, this, _1, _2));
+ for_each_picker_ctrl_entry <LLTextureCtrl> (getPanel(type), type, boost::bind(init_texture_ctrl, this, _1, _2));
+ }
+
+ // init all strings
+ mMeters = mPanelShape->getString("meters");
+ mFeet = mPanelShape->getString("feet");
+ mHeigth = mPanelShape->getString("height") + " ";
+ mHeigthValue = "[HEIGHT] [METRIC1]";
+ mReplacementMetricUrl = "[URL_METRIC2]";
+
+ std::string color = mPanelShape->getString("heigth_label_color");
+ mAvatarHeigthLabelColor = LLUIColorTable::instance().getColor(color, LLColor4::green);
+ color = mPanelShape->getString("heigth_value_label_color");
+ mAvatarHeigthValueLabelColor = LLUIColorTable::instance().getColor(color, LLColor4::green);
+ gSavedSettings.getControl("HeightUnits")->getSignal()->connect(boost::bind(&LLPanelEditWearable::changeHeightUnits, this, _2));
+ updateMetricLayout(gSavedSettings.getBOOL("HeightUnits"));
+
return TRUE;
}
@@ -328,7 +758,7 @@ BOOL LLPanelEditWearable::isDirty() const
if (mWearablePtr)
{
if (mWearablePtr->isDirty() ||
- mWearablePtr->getName().compare(mTextEditor->getText()) != 0)
+ mWearablePtr->getName().compare(mNameEditor->getText()) != 0)
{
isDirty = TRUE;
}
@@ -338,8 +768,12 @@ BOOL LLPanelEditWearable::isDirty() const
//virtual
void LLPanelEditWearable::draw()
{
- BOOL is_dirty = isDirty();
- mBtnRevert->setEnabled(is_dirty);
+ updateVerbs();
+ if (getWearable() && getWearable()->getType() == LLWearableType::WT_SHAPE)
+ {
+ //updating avatar height
+ updateTypeSpecificControls(LLWearableType::WT_SHAPE);
+ }
LLPanel::draw();
}
@@ -349,10 +783,9 @@ void LLPanelEditWearable::setWearable(LLWearable *wearable)
showWearable(mWearablePtr, FALSE);
mWearablePtr = wearable;
showWearable(mWearablePtr, TRUE);
-
- initializePanel();
}
+
//static
void LLPanelEditWearable::onRevertButtonClicked(void* userdata)
{
@@ -360,6 +793,158 @@ void LLPanelEditWearable::onRevertButtonClicked(void* userdata)
panel->revertChanges();
}
+void LLPanelEditWearable::onSaveAsButtonClicked()
+{
+ LLSD args;
+ args["DESC"] = mNameEditor->getText();
+
+ LLNotificationsUtil::add("SaveWearableAs", args, LLSD(), boost::bind(&LLPanelEditWearable::saveAsCallback, this, _1, _2));
+}
+
+void LLPanelEditWearable::saveAsCallback(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (0 == option)
+ {
+ std::string wearable_name = response["message"].asString();
+ LLStringUtil::trim(wearable_name);
+ if( !wearable_name.empty() )
+ {
+ mNameEditor->setText(wearable_name);
+ saveChanges();
+ }
+ }
+}
+
+void LLPanelEditWearable::onCommitSexChange()
+{
+ if (!isAgentAvatarValid()) return;
+
+ LLWearableType::EType type = mWearablePtr->getType();
+ U32 index = gAgentWearables.getWearableIndex(mWearablePtr);
+
+ if( !gAgentWearables.isWearableModifiable(type, index))
+ {
+ return;
+ }
+
+ LLViewerVisualParam* param = static_cast<LLViewerVisualParam*>(gAgentAvatarp->getVisualParam( "male" ));
+ if( !param )
+ {
+ return;
+ }
+
+ bool is_new_sex_male = (gSavedSettings.getU32("AvatarSex") ? SEX_MALE : SEX_FEMALE) == SEX_MALE;
+ LLWearable* wearable = gAgentWearables.getWearable(type, index);
+ if (wearable)
+ {
+ wearable->setVisualParamWeight(param->getID(), is_new_sex_male, FALSE);
+ }
+ param->setWeight( is_new_sex_male, FALSE );
+
+ gAgentAvatarp->updateSexDependentLayerSets( FALSE );
+
+ gAgentAvatarp->updateVisualParams();
+
+ updateScrollingPanelUI();
+}
+
+void LLPanelEditWearable::onTexturePickerCommit(const LLUICtrl* ctrl)
+{
+ const LLTextureCtrl* texture_ctrl = dynamic_cast<const LLTextureCtrl*>(ctrl);
+ if (!texture_ctrl)
+ {
+ llwarns << "got commit signal from not LLTextureCtrl." << llendl;
+ return;
+ }
+
+ if (getWearable())
+ {
+ LLWearableType::EType type = getWearable()->getType();
+ const PickerControlEntryNamePredicate name_pred(texture_ctrl->getName());
+ const LLEditWearableDictionary::PickerControlEntry* entry
+ = find_picker_ctrl_entry_if<LLTextureCtrl, PickerControlEntryNamePredicate>(type, name_pred);
+ if (entry)
+ {
+ // Set the new version
+ LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture(texture_ctrl->getImageAssetID());
+ if( image->getID().isNull() )
+ {
+ image = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT_AVATAR);
+ }
+ if (getWearable())
+ {
+ U32 index = gAgentWearables.getWearableIndex(getWearable());
+ gAgentAvatarp->setLocalTexture(entry->mTextureIndex, image, FALSE, index);
+ LLVisualParamHint::requestHintUpdates();
+ gAgentAvatarp->wearableUpdated(type, FALSE);
+ }
+ }
+ else
+ {
+ llwarns << "could not get texture picker dictionary entry for wearable of type: " << type << llendl;
+ }
+ }
+}
+
+void LLPanelEditWearable::onColorSwatchCommit(const LLUICtrl* ctrl)
+{
+ if (getWearable())
+ {
+ LLWearableType::EType type = getWearable()->getType();
+ const PickerControlEntryNamePredicate name_pred(ctrl->getName());
+ const LLEditWearableDictionary::PickerControlEntry* entry
+ = find_picker_ctrl_entry_if<LLColorSwatchCtrl, PickerControlEntryNamePredicate>(type, name_pred);
+ if (entry)
+ {
+ const LLColor4& old_color = getWearable()->getClothesColor(entry->mTextureIndex);
+ const LLColor4& new_color = LLColor4(ctrl->getValue());
+ if( old_color != new_color )
+ {
+ getWearable()->setClothesColor(entry->mTextureIndex, new_color, TRUE);
+ LLVisualParamHint::requestHintUpdates();
+ gAgentAvatarp->wearableUpdated(getWearable()->getType(), FALSE);
+ }
+ }
+ else
+ {
+ llwarns << "could not get color swatch dictionary entry for wearable of type: " << type << llendl;
+ }
+ }
+}
+
+void LLPanelEditWearable::updatePanelPickerControls(LLWearableType::EType type)
+{
+ LLPanel* panel = getPanel(type);
+ if (!panel)
+ return;
+
+ bool is_modifiable = false;
+ bool is_complete = false;
+ bool is_copyable = false;
+
+ if(mWearableItem)
+ {
+ const LLPermissions& perm = mWearableItem->getPermissions();
+ is_modifiable = perm.allowModifyBy(gAgent.getID(), gAgent.getGroupID());
+ is_copyable = perm.allowCopyBy(gAgent.getID(), gAgent.getGroupID());
+ is_complete = mWearableItem->isFinished();
+ }
+
+ if (is_modifiable && is_complete)
+ {
+ // Update picker controls
+ for_each_picker_ctrl_entry <LLColorSwatchCtrl> (panel, type, boost::bind(update_color_swatch_ctrl, this, _1, _2));
+ for_each_picker_ctrl_entry <LLTextureCtrl> (panel, type, boost::bind(update_texture_ctrl, this, _1, _2));
+ }
+
+ if (!is_modifiable || !is_complete || !is_copyable)
+ {
+ // Disable controls
+ for_each_picker_ctrl_entry <LLColorSwatchCtrl> (panel, type, boost::bind(set_enabled_color_swatch_ctrl, false, _1, _2));
+ for_each_picker_ctrl_entry <LLTextureCtrl> (panel, type, boost::bind(set_enabled_texture_ctrl, false, _1, _2));
+ }
+}
void LLPanelEditWearable::saveChanges()
{
@@ -371,10 +956,10 @@ void LLPanelEditWearable::saveChanges()
U32 index = gAgentWearables.getWearableIndex(mWearablePtr);
- if (mWearablePtr->getName().compare(mTextEditor->getText()) != 0)
+ if (mWearablePtr->getName().compare(mNameEditor->getText()) != 0)
{
// the name of the wearable has changed, re-save wearable with new name
- gAgentWearables.saveWearableAs(mWearablePtr->getType(), index, mTextEditor->getText(), FALSE);
+ gAgentWearables.saveWearableAs(mWearablePtr->getType(), index, mNameEditor->getText(), FALSE);
}
else
{
@@ -391,7 +976,7 @@ void LLPanelEditWearable::revertChanges()
}
mWearablePtr->revertValues();
- mTextEditor->setText(mWearablePtr->getName());
+ mNameEditor->setText(mWearablePtr->getName());
}
void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show)
@@ -401,95 +986,198 @@ void LLPanelEditWearable::showWearable(LLWearable* wearable, BOOL show)
return;
}
- EWearableType type = wearable->getType();
+ mWearableItem = gInventory.getItem(mWearablePtr->getItemID());
+ llassert(mWearableItem);
+
+ LLWearableType::EType type = wearable->getType();
LLPanel *targetPanel = NULL;
std::string title;
std::string description_title;
- const LLEditWearableDictionary::WearableEntry *entry = LLEditWearableDictionary::getInstance()->getWearable(type);
- if (!entry)
+ const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type);
+ if (!wearable_entry)
{
llwarns << "called LLPanelEditWearable::showWearable with an invalid wearable type! (" << type << ")" << llendl;
return;
}
targetPanel = getPanel(type);
- title = getString(entry->mTitle);
- description_title = getString(entry->mDescTitle);
+ title = getString(wearable_entry->mTitle);
+ description_title = getString(wearable_entry->mDescTitle);
+
+ // Update picker controls state
+ for_each_picker_ctrl_entry <LLColorSwatchCtrl> (targetPanel, type, boost::bind(set_enabled_color_swatch_ctrl, show, _1, _2));
+ for_each_picker_ctrl_entry <LLTextureCtrl> (targetPanel, type, boost::bind(set_enabled_texture_ctrl, show, _1, _2));
targetPanel->setVisible(show);
+ toggleTypeSpecificControls(type);
+
if (show)
{
mPanelTitle->setText(title);
mDescTitle->setText(description_title);
+
+ // set name
+ mNameEditor->setText(wearable->getName());
+
+ updatePanelPickerControls(type);
+ updateTypeSpecificControls(type);
+
+ // clear and rebuild visual param list
+ U8 num_subparts = wearable_entry->mSubparts.size();
+
+ for (U8 index = 0; index < num_subparts; ++index)
+ {
+ // dive into data structures to get the panel we need
+ ESubpart subpart_e = wearable_entry->mSubparts[index];
+ const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e);
+
+ if (!subpart_entry)
+ {
+ llwarns << "could not get wearable subpart dictionary entry for subpart: " << subpart_e << llendl;
+ continue;
+ }
+
+ const std::string scrolling_panel = subpart_entry->mParamList;
+ const std::string accordion_tab = subpart_entry->mAccordionTab;
+
+ LLScrollingPanelList *panel_list = getChild<LLScrollingPanelList>(scrolling_panel);
+ LLAccordionCtrlTab *tab = getChild<LLAccordionCtrlTab>(accordion_tab);
+
+ if (!panel_list)
+ {
+ llwarns << "could not get scrolling panel list: " << scrolling_panel << llendl;
+ continue;
+ }
+
+ if (!tab)
+ {
+ llwarns << "could not get llaccordionctrltab from UI with name: " << accordion_tab << llendl;
+ continue;
+ }
+
+ // what edit group do we want to extract params for?
+ const std::string edit_group = subpart_entry->mEditGroup;
+
+ // storage for ordered list of visual params
+ value_map_t sorted_params;
+ getSortedParams(sorted_params, edit_group);
+
+ LLJoint* jointp = gAgentAvatarp->getJoint( subpart_entry->mTargetJoint );
+ if (!jointp)
+ {
+ jointp = gAgentAvatarp->getJoint("mHead");
+ }
+
+ buildParamList(panel_list, sorted_params, tab, jointp);
+
+ updateScrollingPanelUI();
+ }
+ showDefaultSubpart();
+
+ updateVerbs();
}
+}
+void LLPanelEditWearable::showDefaultSubpart()
+{
+ changeCamera(0);
}
-void LLPanelEditWearable::initializePanel()
+void LLPanelEditWearable::onTabExpandedCollapsed(const LLSD& param, U8 index)
{
- if (!mWearablePtr)
+ bool expanded = param.asBoolean();
+
+ if (!mWearablePtr || !gAgentCamera.cameraCustomizeAvatar())
{
- // cannot initialize with a null reference.
+ // we don't have a valid wearable we're editing, or we've left the wearable editor
return;
}
- EWearableType type = mWearablePtr->getType();
+ if (expanded)
+ {
+ changeCamera(index);
+ }
- // set name
- mTextEditor->setText(mWearablePtr->getName());
+}
- // clear and rebuild visual param list
- const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type);
+void LLPanelEditWearable::changeCamera(U8 subpart)
+{
+ const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(mWearablePtr->getType());
if (!wearable_entry)
{
- llwarns << "could not get wearable dictionary entry for wearable of type: " << type << llendl;
+ llinfos << "could not get wearable dictionary entry for wearable type: " << mWearablePtr->getType() << llendl;
return;
}
- U8 num_subparts = wearable_entry->mSubparts.size();
- for (U8 index = 0; index < num_subparts; ++index)
+ if (subpart >= wearable_entry->mSubparts.size())
{
- // dive into data structures to get the panel we need
- ESubpart subpart_e = wearable_entry->mSubparts[index];
- const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e);
+ llinfos << "accordion tab expanded for invalid subpart. Wearable type: " << mWearablePtr->getType() << " subpart num: " << subpart << llendl;
+ return;
+ }
- if (!subpart_entry)
- {
- llwarns << "could not get wearable subpart dictionary entry for subpart: " << subpart_e << llendl;
- continue;
- }
+ ESubpart subpart_e = wearable_entry->mSubparts[subpart];
+ const LLEditWearableDictionary::SubpartEntry *subpart_entry = LLEditWearableDictionary::getInstance()->getSubpart(subpart_e);
- const std::string scrolling_panel = subpart_entry->mParamList;
- const std::string accordion_tab = subpart_entry->mAccordionTab;
+ if (!subpart_entry)
+ {
+ llwarns << "could not get wearable subpart dictionary entry for subpart: " << subpart_e << llendl;
+ return;
+ }
- LLScrollingPanelList *panel_list = getChild<LLScrollingPanelList>(scrolling_panel);
- LLAccordionCtrlTab *tab = getChild<LLAccordionCtrlTab>(accordion_tab);
+ // Update the camera
+ gMorphView->setCameraDistToDefault();
+ gMorphView->setCameraTargetJoint( gAgentAvatarp->getJoint( subpart_entry->mTargetJoint ) );
+ gMorphView->setCameraTargetOffset( subpart_entry->mTargetOffset );
+ gMorphView->setCameraOffset( subpart_entry->mCameraOffset );
+ if (gSavedSettings.getBOOL("AppearanceCameraMovement"))
+ {
+ gMorphView->updateCamera();
+ }
+}
- if (!panel_list)
- {
- llwarns << "could not get scrolling panel list: " << scrolling_panel << llendl;
- continue;
- }
+void LLPanelEditWearable::updateScrollingPanelList()
+{
+ updateScrollingPanelUI();
+}
+
+void LLPanelEditWearable::toggleTypeSpecificControls(LLWearableType::EType type)
+{
+ // Toggle controls specific to shape editing panel.
+ {
+ bool is_shape = (type == LLWearableType::WT_SHAPE);
+ childSetVisible("sex_radio", is_shape);
+ childSetVisible("female_icon", is_shape);
+ childSetVisible("male_icon", is_shape);
+ }
+}
- if (!tab)
+void LLPanelEditWearable::updateTypeSpecificControls(LLWearableType::EType type)
+{
+ const F32 ONE_METER = 1.0;
+ const F32 ONE_FOOT = 0.3048 * ONE_METER; // in meters
+ // Update controls specific to shape editing panel.
+ if (type == LLWearableType::WT_SHAPE)
+ {
+ // Update avatar height
+ F32 new_size = gAgentAvatarp->mBodySize.mV[VZ];
+ if (gSavedSettings.getBOOL("HeightUnits") == FALSE)
{
- llwarns << "could not get llaccordionctrltab from UI with name: " << accordion_tab << llendl;
- continue;
+ // convert meters to feet
+ new_size = new_size / ONE_FOOT;
}
- // what edit group do we want to extract params for?
- const std::string edit_group = subpart_entry->mEditGroup;
-
- // storage for ordered list of visual params
- value_map_t sorted_params;
- getSortedParams(sorted_params, edit_group);
+ std::string avatar_height_str = llformat("%.2f", new_size);
+ mHeigthValue.setArg("[HEIGHT]", avatar_height_str);
+ updateAvatarHeightLabel();
+ }
- buildParamList(panel_list, sorted_params, tab);
+ if (LLWearableType::WT_ALPHA == type)
+ {
+ updateAlphaCheckboxes();
- updateScrollingPanelUI();
+ initPreviousAlphaTextures();
}
-
}
void LLPanelEditWearable::updateScrollingPanelUI()
@@ -500,12 +1188,14 @@ void LLPanelEditWearable::updateScrollingPanelUI()
return;
}
- EWearableType type = mWearablePtr->getType();
+ LLWearableType::EType type = mWearablePtr->getType();
LLPanel *panel = getPanel(type);
if(panel && (mWearablePtr->getItemID().notNull()))
{
const LLEditWearableDictionary::WearableEntry *wearable_entry = LLEditWearableDictionary::getInstance()->getWearable(type);
+ llassert(wearable_entry);
+ if (!wearable_entry) return;
U8 num_subparts = wearable_entry->mSubparts.size();
LLScrollingPanelParam::sUpdateDelayFrames = 0;
@@ -530,67 +1220,67 @@ void LLPanelEditWearable::updateScrollingPanelUI()
}
}
-LLPanel* LLPanelEditWearable::getPanel(EWearableType type)
+LLPanel* LLPanelEditWearable::getPanel(LLWearableType::EType type)
{
switch (type)
{
- case WT_SHAPE:
+ case LLWearableType::WT_SHAPE:
return mPanelShape;
break;
- case WT_SKIN:
+ case LLWearableType::WT_SKIN:
return mPanelSkin;
break;
- case WT_HAIR:
+ case LLWearableType::WT_HAIR:
return mPanelHair;
break;
- case WT_EYES:
+ case LLWearableType::WT_EYES:
return mPanelEyes;
break;
- case WT_SHIRT:
+ case LLWearableType::WT_SHIRT:
return mPanelShirt;
break;
- case WT_PANTS:
+ case LLWearableType::WT_PANTS:
return mPanelPants;
break;
- case WT_SHOES:
+ case LLWearableType::WT_SHOES:
return mPanelShoes;
break;
- case WT_SOCKS:
+ case LLWearableType::WT_SOCKS:
return mPanelSocks;
break;
- case WT_JACKET:
+ case LLWearableType::WT_JACKET:
return mPanelJacket;
break;
- case WT_GLOVES:
+ case LLWearableType::WT_GLOVES:
return mPanelGloves;
break;
- case WT_UNDERSHIRT:
+ case LLWearableType::WT_UNDERSHIRT:
return mPanelUndershirt;
break;
- case WT_UNDERPANTS:
+ case LLWearableType::WT_UNDERPANTS:
return mPanelUnderpants;
break;
- case WT_SKIRT:
+ case LLWearableType::WT_SKIRT:
return mPanelSkirt;
break;
- case WT_ALPHA:
+ case LLWearableType::WT_ALPHA:
return mPanelAlpha;
break;
- case WT_TATTOO:
+ case LLWearableType::WT_TATTOO:
return mPanelTattoo;
break;
default:
@@ -602,7 +1292,7 @@ LLPanel* LLPanelEditWearable::getPanel(EWearableType type)
void LLPanelEditWearable::getSortedParams(value_map_t &sorted_params, const std::string &edit_group)
{
LLWearable::visual_param_vec_t param_list;
- ESex avatar_sex = gAgent.getAvatarObject()->getSex();
+ ESex avatar_sex = gAgentAvatarp->getSex();
mWearablePtr->getVisualParams(param_list);
@@ -626,7 +1316,7 @@ void LLPanelEditWearable::getSortedParams(value_map_t &sorted_params, const std:
}
}
-void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value_map_t &sorted_params, LLAccordionCtrlTab *tab)
+void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value_map_t &sorted_params, LLAccordionCtrlTab *tab, LLJoint* jointp)
{
// sorted_params is sorted according to magnitude of effect from
// least to greatest. Adding to the front of the child list
@@ -640,18 +1330,129 @@ void LLPanelEditWearable::buildParamList(LLScrollingPanelList *panel_list, value
{
LLPanel::Params p;
p.name("LLScrollingPanelParam");
- p.rect(LLRect(0, LLScrollingPanelParam::PARAM_PANEL_HEIGHT, LLScrollingPanelParam::PARAM_PANEL_WIDTH, 0 ));
- LLScrollingPanelParam* panel_param = new LLScrollingPanelParam( p, NULL, (*it).second, TRUE, this->getWearable());
+ LLScrollingPanelParam* panel_param = new LLScrollingPanelParam( p, NULL, (*it).second, TRUE, this->getWearable(), jointp);
height = panel_list->addPanel( panel_param );
}
-
- S32 width = tab->getRect().getWidth();
-
- tab->reshape(width,height + tab->getHeaderHeight()+10,FALSE);
}
}
+void LLPanelEditWearable::updateVerbs()
+{
+ bool can_copy = false;
+ if(mWearableItem)
+ {
+ can_copy = mWearableItem->getPermissions().allowCopyBy(gAgentID);
+ }
+ BOOL is_dirty = isDirty();
+
+ mBtnRevert->setEnabled(is_dirty);
+ childSetEnabled("save_as_button", is_dirty && can_copy);
+
+ if(isAgentAvatarValid())
+ {
+ // Update viewer's radio buttons (of RadioGroup with control_name="AvatarSex") of Avatar's gender
+ // with value from "AvatarSex" setting
+ gSavedSettings.setU32("AvatarSex", (gAgentAvatarp->getSex() == SEX_MALE) );
+ }
+
+}
+
+void LLPanelEditWearable::configureAlphaCheckbox(LLVOAvatarDefines::ETextureIndex te, const std::string& name)
+{
+ LLCheckBoxCtrl* checkbox = mPanelAlpha->getChild<LLCheckBoxCtrl>(name);
+ checkbox->setCommitCallback(boost::bind(&LLPanelEditWearable::onInvisibilityCommit, this, checkbox, te));
+
+ mAlphaCheckbox2Index[name] = te;
+}
+
+void LLPanelEditWearable::onInvisibilityCommit(LLCheckBoxCtrl* checkbox_ctrl, LLVOAvatarDefines::ETextureIndex te)
+{
+ if (!checkbox_ctrl) return;
+ if (!getWearable()) return;
+
+ llinfos << "onInvisibilityCommit, self " << this << " checkbox_ctrl " << checkbox_ctrl << llendl;
+
+ bool new_invis_state = checkbox_ctrl->get();
+ if (new_invis_state)
+ {
+ LLLocalTextureObject *lto = getWearable()->getLocalTextureObject(te);
+ mPreviousAlphaTexture[te] = lto->getID();
+
+ LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture( IMG_INVISIBLE );
+ U32 index = gAgentWearables.getWearableIndex(getWearable());
+ gAgentAvatarp->setLocalTexture(te, image, FALSE, index);
+ gAgentAvatarp->wearableUpdated(getWearable()->getType(), FALSE);
+ }
+ else
+ {
+ // Try to restore previous texture, if any.
+ LLUUID prev_id = mPreviousAlphaTexture[te];
+ if (prev_id.isNull() || (prev_id == IMG_INVISIBLE))
+ {
+ prev_id = LLUUID( gSavedSettings.getString( "UIImgDefaultAlphaUUID" ) );
+ }
+ if (prev_id.isNull()) return;
+
+ LLViewerFetchedTexture* image = LLViewerTextureManager::getFetchedTexture(prev_id);
+ if (!image) return;
+
+ U32 index = gAgentWearables.getWearableIndex(getWearable());
+ gAgentAvatarp->setLocalTexture(te, image, FALSE, index);
+ gAgentAvatarp->wearableUpdated(getWearable()->getType(), FALSE);
+ }
+
+ updatePanelPickerControls(getWearable()->getType());
+}
+
+void LLPanelEditWearable::updateAlphaCheckboxes()
+{
+ for(string_texture_index_map_t::iterator iter = mAlphaCheckbox2Index.begin();
+ iter != mAlphaCheckbox2Index.end(); ++iter )
+ {
+ LLVOAvatarDefines::ETextureIndex te = (LLVOAvatarDefines::ETextureIndex)iter->second;
+ LLCheckBoxCtrl* ctrl = mPanelAlpha->getChild<LLCheckBoxCtrl>(iter->first);
+ if (ctrl)
+ {
+ ctrl->set(!gAgentAvatarp->isTextureVisible(te, mWearablePtr));
+ }
+ }
+}
+
+void LLPanelEditWearable::initPreviousAlphaTextures()
+{
+ initPreviousAlphaTextureEntry(TEX_LOWER_ALPHA);
+ initPreviousAlphaTextureEntry(TEX_UPPER_ALPHA);
+ initPreviousAlphaTextureEntry(TEX_HEAD_ALPHA);
+ initPreviousAlphaTextureEntry(TEX_EYES_ALPHA);
+ initPreviousAlphaTextureEntry(TEX_LOWER_ALPHA);
+}
+
+void LLPanelEditWearable::initPreviousAlphaTextureEntry(LLVOAvatarDefines::ETextureIndex te)
+{
+ LLLocalTextureObject *lto = getWearable()->getLocalTextureObject(te);
+ if (lto)
+ {
+ mPreviousAlphaTexture[te] = lto->getID();
+ }
+}
+
+// handle secondlife:///app/metricsystem
+class LLMetricSystemHandler : public LLCommandHandler
+{
+public:
+ LLMetricSystemHandler() : LLCommandHandler("metricsystem", UNTRUSTED_THROTTLE) { }
+
+ bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
+ {
+ // change height units TRUE for meters and FALSE for feet
+ BOOL new_value = (gSavedSettings.getBOOL("HeightUnits") == FALSE) ? TRUE : FALSE;
+ gSavedSettings.setBOOL("HeightUnits", new_value);
+ return true;
+ }
+};
+LLMetricSystemHandler gMetricSystemHandler;
+// EOF
diff --git a/indra/newview/llpaneleditwearable.h b/indra/newview/llpaneleditwearable.h
index 4178659617..61441435cd 100644
--- a/indra/newview/llpaneleditwearable.h
+++ b/indra/newview/llpaneleditwearable.h
@@ -1,6 +1,6 @@
/**
- * @file llfloatercustomize.h
- * @brief The customize avatar floater, triggered by "Appearance..."
+ * @file llpaneleditwearable.h
+ * @brief A LLPanel dedicated to the editing of wearables.
*
* $LicenseInfo:firstyear=2009&license=viewergpl$
*
@@ -36,15 +36,19 @@
#include "llpanel.h"
#include "llscrollingpanellist.h"
#include "llmodaldialog.h"
-#include "llwearabledictionary.h"
+#include "llvoavatardefines.h"
+#include "llwearabletype.h"
+class LLCheckBoxCtrl;
class LLWearable;
-class LLTextEditor;
class LLTextBox;
+class LLViewerInventoryItem;
class LLViewerVisualParam;
class LLVisualParamHint;
class LLViewerJointMesh;
class LLAccordionCtrlTab;
+class LLJoint;
+class LLLineEditor;
class LLPanelEditWearable : public LLPanel
{
@@ -62,20 +66,56 @@ public:
void saveChanges();
void revertChanges();
+ void showDefaultSubpart();
+ void onTabExpandedCollapsed(const LLSD& param, U8 index);
+
+ void updateScrollingPanelList();
+
static void onRevertButtonClicked(void* userdata);
+ void onCommitSexChange();
+ void onSaveAsButtonClicked();
+ void saveAsCallback(const LLSD& notification, const LLSD& response);
+
private:
typedef std::map<F32, LLViewerVisualParam*> value_map_t;
void showWearable(LLWearable* wearable, BOOL show);
- void initializePanel();
void updateScrollingPanelUI();
- LLPanel* getPanel(EWearableType type);
+ LLPanel* getPanel(LLWearableType::EType type);
void getSortedParams(value_map_t &sorted_params, const std::string &edit_group);
- void buildParamList(LLScrollingPanelList *panel_list, value_map_t &sorted_params, LLAccordionCtrlTab *tab);
+ void buildParamList(LLScrollingPanelList *panel_list, value_map_t &sorted_params, LLAccordionCtrlTab *tab, LLJoint* jointp);
+ // update bottom bar buttons ("Save", "Revert", etc)
+ void updateVerbs();
+
+ void onColorSwatchCommit(const LLUICtrl*);
+ void onTexturePickerCommit(const LLUICtrl*);
+ void updatePanelPickerControls(LLWearableType::EType type);
+ void toggleTypeSpecificControls(LLWearableType::EType type);
+ void updateTypeSpecificControls(LLWearableType::EType type);
+
+ // changes camera angle to default for selected subpart
+ void changeCamera(U8 subpart);
+
+ //alpha mask checkboxes
+ void configureAlphaCheckbox(LLVOAvatarDefines::ETextureIndex te, const std::string& name);
+ void onInvisibilityCommit(LLCheckBoxCtrl* checkbox_ctrl, LLVOAvatarDefines::ETextureIndex te);
+ void updateAlphaCheckboxes();
+ void initPreviousAlphaTextures();
+ void initPreviousAlphaTextureEntry(LLVOAvatarDefines::ETextureIndex te);
+
+ // callback for HeightUnits parameter.
+ bool changeHeightUnits(const LLSD& new_value);
+
+ // updates current metric and replacemet metric label text
+ void updateMetricLayout(BOOL new_value);
+
+ // updates avatar height label
+ void updateAvatarHeightLabel();
// the pointer to the wearable we're editing. NULL means we're not editing a wearable.
LLWearable *mWearablePtr;
+ LLViewerInventoryItem* mWearableItem;
// these are constant no matter what wearable we're editing
LLButton *mBtnRevert;
@@ -83,11 +123,24 @@ private:
LLTextBox *mPanelTitle;
LLTextBox *mDescTitle;
+ LLTextBox *mTxtAvatarHeight;
+ // localized and parametrized strings that used to build avatar_height_label
+ std::string mMeters;
+ std::string mFeet;
+ std::string mHeigth;
+ LLUIString mHeigthValue;
+ LLUIString mReplacementMetricUrl;
+
+ // color for mHeigth string
+ LLUIColor mAvatarHeigthLabelColor;
+ // color for mHeigthValue string
+ LLUIColor mAvatarHeigthValueLabelColor;
+
// This text editor reference will change each time we edit a new wearable -
// it will be grabbed from the currently visible panel
- LLTextEditor *mTextEditor;
+ LLLineEditor *mNameEditor;
// The following panels will be shown/hidden based on what wearable we're editing
// body parts
@@ -109,6 +162,11 @@ private:
LLPanel *mPanelAlpha;
LLPanel *mPanelTattoo;
+ typedef std::map<std::string, LLVOAvatarDefines::ETextureIndex> string_texture_index_map_t;
+ string_texture_index_map_t mAlphaCheckbox2Index;
+
+ typedef std::map<LLVOAvatarDefines::ETextureIndex, LLUUID> s32_uuid_map_t;
+ s32_uuid_map_t mPreviousAlphaTexture;
};
#endif
diff --git a/indra/newview/llpanelface.cpp b/indra/newview/llpanelface.cpp
index 8c5208678e..b50c6442e1 100644
--- a/indra/newview/llpanelface.cpp
+++ b/indra/newview/llpanelface.cpp
@@ -265,10 +265,13 @@ void LLPanelFace::sendAlpha()
void LLPanelFace::sendGlow()
{
- LLSpinCtrl* mCtrlGlow = getChild<LLSpinCtrl>("glow");
- F32 glow = mCtrlGlow->get();
-
- LLSelectMgr::getInstance()->selectionSetGlow( glow );
+ LLSpinCtrl* mCtrlGlow = getChild<LLSpinCtrl>("glow");
+ llassert(mCtrlGlow);
+ if (mCtrlGlow)
+ {
+ F32 glow = mCtrlGlow->get();
+ LLSelectMgr::getInstance()->selectionSetGlow( glow );
+ }
}
struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor
@@ -286,6 +289,9 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor
LLCheckBoxCtrl* checkFlipScaleS = mPanel->getChild<LLCheckBoxCtrl>("checkbox flip s");
LLCheckBoxCtrl* checkFlipScaleT = mPanel->getChild<LLCheckBoxCtrl>("checkbox flip t");
LLComboBox* comboTexGen = mPanel->getChild<LLComboBox>("combobox texgen");
+ llassert(comboTexGen);
+ llassert(object);
+
if (ctrlTexScaleS)
{
valid = !ctrlTexScaleS->getTentative() || !checkFlipScaleS->getTentative();
@@ -296,7 +302,8 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor
{
value = -value;
}
- if (comboTexGen->getCurrentIndex() == 1)
+ if (comboTexGen &&
+ comboTexGen->getCurrentIndex() == 1)
{
value *= 0.5f;
}
@@ -314,7 +321,8 @@ struct LLPanelFaceSetTEFunctor : public LLSelectedTEFunctor
{
value = -value;
}
- if (comboTexGen->getCurrentIndex() == 1)
+ if (comboTexGen &&
+ comboTexGen->getCurrentIndex() == 1)
{
value *= 0.5f;
}
diff --git a/indra/newview/llpanelgenerictip.cpp b/indra/newview/llpanelgenerictip.cpp
new file mode 100644
index 0000000000..e0658554a4
--- /dev/null
+++ b/indra/newview/llpanelgenerictip.cpp
@@ -0,0 +1,51 @@
+/**
+ * @file llpanelgenerictip.cpp
+ * @brief Represents a generic panel for a notifytip notifications. As example:
+ * "SystemMessageTip", "Cancelled", "UploadWebSnapshotDone".
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpanelgenerictip.h"
+#include "llnotifications.h"
+
+
+LLPanelGenericTip::LLPanelGenericTip(
+ const LLNotificationPtr& notification) :
+ LLPanelTipToast(notification)
+{
+ LLUICtrlFactory::getInstance()->buildPanel(this, "panel_generic_tip.xml");
+
+ childSetValue("message", notification->getMessage());
+
+ // set line max count to 3 in case of a very long name
+ snapToMessageHeight(getChild<LLTextBox> ("message"), 3);
+}
+
diff --git a/indra/newview/llpanelgenerictip.h b/indra/newview/llpanelgenerictip.h
new file mode 100644
index 0000000000..defa069727
--- /dev/null
+++ b/indra/newview/llpanelgenerictip.h
@@ -0,0 +1,57 @@
+/**
+ * @file llpanelgenerictip.h
+ * @brief Represents a generic panel for a notifytip notifications. As example:
+ * "SystemMessageTip", "Cancelled", "UploadWebSnapshotDone".
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_PANELGENERICTIP_H
+#define LL_PANELGENERICTIP_H
+
+#include "llpaneltiptoast.h"
+
+/**
+ * Represents tip toast panel that contains only one child element - message text.
+ * This panel can be used for different cases of tip notifications.
+ */
+class LLPanelGenericTip: public LLPanelTipToast
+{
+ // disallow instantiation of this class
+private:
+ // grant privileges to instantiate this class to LLToastPanel
+ friend class LLToastPanel;
+ /**
+ * Generic toast tip panel.
+ * This is particular case of toast panel that decoupled from LLToastNotifyPanel.
+ * From now LLToastNotifyPanel is deprecated and will be removed after all panel
+ * types are represented in separate classes.
+ */
+ LLPanelGenericTip(const LLNotificationPtr& notification);
+};
+#endif /* LL_PANELGENERICTIP_H */
diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp
index 469f1c1739..d997b83cbb 100644
--- a/indra/newview/llpanelgroup.cpp
+++ b/indra/newview/llpanelgroup.cpp
@@ -59,6 +59,8 @@
#include "llaccordionctrltab.h"
#include "llaccordionctrl.h"
+#include "lltrans.h"
+
static LLRegisterPanelClassWrapper<LLPanelGroup> t_panel_group("panel_group_info_sidetray");
@@ -90,7 +92,7 @@ LLPanelGroup::LLPanelGroup()
: LLPanel(),
LLGroupMgrObserver( LLUUID() ),
mSkipRefresh(FALSE),
- mShowingNotifyDialog(false)
+ mButtonJoin(NULL)
{
// Set up the factory callbacks.
// Roles sub tabs
@@ -101,8 +103,10 @@ LLPanelGroup::LLPanelGroup()
LLPanelGroup::~LLPanelGroup()
{
LLGroupMgr::getInstance()->removeObserver(this);
- if(LLVoiceClient::getInstance())
+ if(LLVoiceClient::instanceExists())
+ {
LLVoiceClient::getInstance()->removeObserver(this);
+ }
}
void LLPanelGroup::onOpen(const LLSD& key)
@@ -159,10 +163,6 @@ BOOL LLPanelGroup::postBuild()
button = getChild<LLButton>("btn_chat");
button->setClickedCallback(onBtnGroupChatClicked, this);
- button = getChild<LLButton>("btn_join");
- button->setVisible(false);
- button->setEnabled(true);
-
button = getChild<LLButton>("btn_cancel");
button->setVisible(false); button->setEnabled(true);
@@ -174,7 +174,7 @@ BOOL LLPanelGroup::postBuild()
childSetCommitCallback("back",boost::bind(&LLPanelGroup::onBackBtnClick,this),NULL);
childSetCommitCallback("btn_create",boost::bind(&LLPanelGroup::onBtnCreate,this),NULL);
- childSetCommitCallback("btn_join",boost::bind(&LLPanelGroup::onBtnJoin,this),NULL);
+
childSetCommitCallback("btn_cancel",boost::bind(&LLPanelGroup::onBtnCancel,this),NULL);
LLPanelGroupTab* panel_general = findChild<LLPanelGroupTab>("group_general_tab_panel");
@@ -188,9 +188,19 @@ BOOL LLPanelGroup::postBuild()
if(panel_land) mTabs.push_back(panel_land);
if(panel_general)
+ {
panel_general->setupCtrls(this);
+ button = panel_general->getChild<LLButton>("btn_join");
+ button->setVisible(false);
+ button->setEnabled(true);
+
+ mButtonJoin = button;
+ mButtonJoin->setCommitCallback(boost::bind(&LLPanelGroup::onBtnJoin,this));
- gVoiceClient->addObserver(this);
+ mJoinText = panel_general->getChild<LLUICtrl>("join_cost_text");
+ }
+
+ LLVoiceClient::getInstance()->addObserver(this);
return TRUE;
}
@@ -311,7 +321,7 @@ void LLPanelGroup::onChange(EStatusType status, const std::string &channelURI, b
return;
}
- childSetEnabled("btn_call", LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking());
+ childSetEnabled("btn_call", LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking());
}
void LLPanelGroup::notifyObservers()
@@ -324,18 +334,16 @@ void LLPanelGroup::update(LLGroupChange gc)
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mID);
if(gdatap)
{
- childSetValue("group_name", gdatap->mName);
- childSetToolTip("group_name",gdatap->mName);
-
- LLButton* btn_join = getChild<LLButton>("btn_join");
- LLUICtrl* join_text = getChild<LLUICtrl>("join_cost_text");
-
+ std::string group_name = gdatap->mName.empty() ? LLTrans::getString("LoadingData") : gdatap->mName;
+ childSetValue("group_name", group_name);
+ childSetToolTip("group_name",group_name);
+
LLGroupData agent_gdatap;
- bool is_member = gAgent.getGroupData(mID,agent_gdatap);
+ bool is_member = gAgent.getGroupData(mID,agent_gdatap) || gAgent.isGodlike();
bool join_btn_visible = !is_member && gdatap->mOpenEnrollment;
- btn_join->setVisible(join_btn_visible);
- join_text->setVisible(join_btn_visible);
+ mButtonJoin->setVisible(join_btn_visible);
+ mJoinText->setVisible(join_btn_visible);
if(join_btn_visible)
{
@@ -351,7 +359,7 @@ void LLPanelGroup::update(LLGroupChange gc)
{
fee_buff = getString("group_join_free", string_args);
}
- childSetValue("join_cost_text",fee_buff);
+ mJoinText->setValue(fee_buff);
}
}
}
@@ -373,14 +381,15 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mID);
if(gdatap)
{
- childSetValue("group_name", gdatap->mName);
- childSetToolTip("group_name",gdatap->mName);
+ std::string group_name = gdatap->mName.empty() ? LLTrans::getString("LoadingData") : gdatap->mName;
+ childSetValue("group_name", group_name);
+ childSetToolTip("group_name",group_name);
}
LLButton* button_apply = findChild<LLButton>("btn_apply");
LLButton* button_refresh = findChild<LLButton>("btn_refresh");
LLButton* button_create = findChild<LLButton>("btn_create");
- LLButton* button_join = findChild<LLButton>("btn_join");
+
LLButton* button_cancel = findChild<LLButton>("btn_cancel");
LLButton* button_call = findChild<LLButton>("btn_call");
LLButton* button_chat = findChild<LLButton>("btn_chat");
@@ -417,8 +426,8 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
if(!tab_general || !tab_roles || !tab_notices || !tab_land)
return;
- if(button_join)
- button_join->setVisible(false);
+ if(mButtonJoin)
+ mButtonJoin->setVisible(false);
if(is_null_group_id)//creating new group
@@ -460,7 +469,7 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
}
LLGroupData agent_gdatap;
- bool is_member = gAgent.getGroupData(mID,agent_gdatap);
+ bool is_member = gAgent.getGroupData(mID,agent_gdatap) || gAgent.isGodlike();
tab_roles->setVisible(is_member);
tab_notices->setVisible(is_member);
@@ -478,6 +487,7 @@ void LLPanelGroup::setGroupID(const LLUUID& group_id)
}
reposButtons();
+ update(GC_ALL);//show/hide "join" button if data is already ready
}
bool LLPanelGroup::apply(LLPanelGroupTab* tab)
@@ -618,69 +628,4 @@ void LLPanelGroup::showNotice(const std::string& subject,
}
-bool LLPanelGroup::canClose()
-{
- if(getVisible() == false)
- return true;
-
- bool need_save = false;
- std::string mesg;
- for(std::vector<LLPanelGroupTab* >::iterator it = mTabs.begin();it!=mTabs.end();++it)
- if(need_save|=(*it)->needsApply(mesg))
- break;
- if(!need_save)
- return false;
- // If no message was provided, give a generic one.
- if (mesg.empty())
- {
- mesg = mDefaultNeedsApplyMesg;
- }
- // Create a notify box, telling the user about the unapplied tab.
- LLSD args;
- args["NEEDS_APPLY_MESSAGE"] = mesg;
- args["WANT_APPLY_MESSAGE"] = mWantApplyMesg;
-
- LLNotificationsUtil::add("SaveChanges", args, LLSD(), boost::bind(&LLPanelGroup::handleNotifyCallback,this, _1, _2));
-
- mShowingNotifyDialog = true;
-
- return false;
-}
-
-bool LLPanelGroup::notifyChildren(const LLSD& info)
-{
- if(info.has("request") && mID.isNull() )
- {
- std::string str_action = info["request"];
-
- if (str_action == "quit" )
- {
- canClose();
- return true;
- }
- if(str_action == "wait_quit")
- return mShowingNotifyDialog;
- }
- return false;
-}
-bool LLPanelGroup::handleNotifyCallback(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- mShowingNotifyDialog = false;
- switch (option)
- {
- case 0: // "Apply Changes"
- apply();
- break;
- case 1: // "Ignore Changes"
- break;
- case 2: // "Cancel"
- default:
- // Do nothing. The user is canceling the action.
- // If we were quitting, we didn't really mean it.
- LLAppViewer::instance()->abortQuit();
- break;
- }
- return false;
-}
diff --git a/indra/newview/llpanelgroup.h b/indra/newview/llpanelgroup.h
index 6e23eedffb..13a03b0713 100644
--- a/indra/newview/llpanelgroup.h
+++ b/indra/newview/llpanelgroup.h
@@ -37,7 +37,7 @@
#include "lltimer.h"
#include "llvoiceclient.h"
-struct LLOfferInfo;
+class LLOfferInfo;
const S32 UPDATE_MEMBERS_PER_FRAME = 500;
@@ -95,9 +95,6 @@ public:
LLOfferInfo* inventory_offer);
- bool notifyChildren (const LLSD& info);
- bool handleNotifyCallback(const LLSD&, const LLSD&);
-
protected:
virtual void update(LLGroupChange gc);
@@ -117,9 +114,6 @@ protected:
protected:
bool apply(LLPanelGroupTab* tab);
- bool canClose();
-
- bool mShowingNotifyDialog;
LLTimer mRefreshTimer;
@@ -130,6 +124,9 @@ protected:
std::vector<LLPanelGroupTab* > mTabs;
+ LLButton* mButtonJoin;
+ LLUICtrl* mJoinText;
+
};
class LLPanelGroupTab : public LLPanel
diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp
index 51fc670d87..555248e31a 100644
--- a/indra/newview/llpanelgroupgeneral.cpp
+++ b/indra/newview/llpanelgroupgeneral.cpp
@@ -111,6 +111,8 @@ BOOL LLPanelGroupGeneral::postBuild()
{
mListVisibleMembers->setDoubleClickCallback(openProfile, this);
mListVisibleMembers->setContextMenu(LLScrollListCtrl::MENU_AVATAR);
+
+ mListVisibleMembers->setSortCallback(boost::bind(&LLPanelGroupGeneral::sortMembersList,this,_1,_2,_3));
}
// Options
@@ -206,15 +208,18 @@ BOOL LLPanelGroupGeneral::postBuild()
void LLPanelGroupGeneral::setupCtrls(LLPanel* panel_group)
{
- mInsignia = panel_group->getChild<LLTextureCtrl>("insignia");
+ mInsignia = getChild<LLTextureCtrl>("insignia");
if (mInsignia)
{
mInsignia->setCommitCallback(onCommitAny, this);
- mDefaultIconID = mInsignia->getImageAssetID();
}
- mFounderName = panel_group->getChild<LLNameBox>("founder_name");
+ mFounderName = getChild<LLNameBox>("founder_name");
+
+
mGroupNameEditor = panel_group->getChild<LLLineEditor>("group_name_editor");
- mGroupNameEditor->setPrevalidate( LLLineEditor::prevalidateASCII );
+ mGroupNameEditor->setPrevalidate( LLTextValidate::validateASCII );
+
+
}
// static
@@ -650,7 +655,7 @@ void LLPanelGroupGeneral::update(LLGroupChange gc)
}
else
{
- mInsignia->setImageAssetID(mDefaultIconID);
+ mInsignia->setImageAssetName(mInsignia->getDefaultImageName());
}
}
@@ -814,15 +819,15 @@ void LLPanelGroupGeneral::reset()
mCtrlListGroup->set(true);
- mCtrlReceiveNotices->setEnabled(true);
+ mCtrlReceiveNotices->setEnabled(false);
mCtrlReceiveNotices->setVisible(true);
- mCtrlListGroup->setEnabled(true);
+ mCtrlListGroup->setEnabled(false);
mGroupNameEditor->setEnabled(TRUE);
mEditCharter->setEnabled(TRUE);
- mCtrlShowInGroupList->setEnabled(TRUE);
+ mCtrlShowInGroupList->setEnabled(false);
mComboMature->setEnabled(TRUE);
mCtrlOpenEnrollment->setEnabled(TRUE);
@@ -840,6 +845,8 @@ void LLPanelGroupGeneral::reset()
mInsignia->setEnabled(true);
+ mInsignia->setImageAssetName(mInsignia->getDefaultImageName());
+
{
std::string empty_str = "";
mEditCharter->setText(empty_str);
@@ -928,6 +935,8 @@ void LLPanelGroupGeneral::setGroupID(const LLUUID& id)
mCtrlListGroup->setEnabled(data.mID.notNull());
}
+ mCtrlShowInGroupList->setEnabled(data.mID.notNull());
+
mActiveTitleLabel = getChild<LLTextBox>("active_title_label");
mComboActiveTitle = getChild<LLComboBox>("active_title");
@@ -940,4 +949,18 @@ void LLPanelGroupGeneral::setGroupID(const LLUUID& id)
activate();
}
+S32 LLPanelGroupGeneral::sortMembersList(S32 col_idx,const LLScrollListItem* i1,const LLScrollListItem* i2)
+{
+ const LLScrollListCell *cell1 = i1->getColumn(col_idx);
+ const LLScrollListCell *cell2 = i2->getColumn(col_idx);
+
+ if(col_idx == 2)
+ {
+ if(LLStringUtil::compareDict(cell1->getValue().asString(),"Online") == 0 )
+ return 1;
+ if(LLStringUtil::compareDict(cell2->getValue().asString(),"Online") == 0 )
+ return -1;
+ }
+ return LLStringUtil::compareDict(cell1->getValue().asString(), cell2->getValue().asString());
+}
diff --git a/indra/newview/llpanelgroupgeneral.h b/indra/newview/llpanelgroupgeneral.h
index 7e90e43cf9..6f4fa994da 100644
--- a/indra/newview/llpanelgroupgeneral.h
+++ b/indra/newview/llpanelgroupgeneral.h
@@ -83,6 +83,8 @@ private:
static void onReceiveNotices(LLUICtrl* ctrl, void* data);
static void openProfile(void* data);
+ S32 sortMembersList(S32,const LLScrollListItem*,const LLScrollListItem*);
+
static bool joinDlgCB(const LLSD& notification, const LLSD& response);
void updateMembers();
@@ -93,7 +95,6 @@ private:
BOOL mChanged;
BOOL mFirstUse;
std::string mIncompleteMemberDataStr;
- LLUUID mDefaultIconID;
// Group information (include any updates in updateChanged)
LLLineEditor *mGroupNameEditor;
diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp
index 06a682c905..11d3768a3d 100644
--- a/indra/newview/llpanelgroupinvite.cpp
+++ b/indra/newview/llpanelgroupinvite.cpp
@@ -36,6 +36,7 @@
#include "llagent.h"
#include "llfloateravatarpicker.h"
#include "llbutton.h"
+#include "llcallingcard.h"
#include "llcombobox.h"
#include "llgroupactions.h"
#include "llgroupmgr.h"
@@ -56,7 +57,7 @@ public:
~impl();
void addUsers(const std::vector<std::string>& names,
- const std::vector<LLUUID>& agent_ids);
+ const uuid_vec_t& agent_ids);
void submitInvitations();
void addRoleNames(LLGroupMgrGroupData* gdatap);
void handleRemove();
@@ -68,7 +69,7 @@ public:
static void callbackClickRemove(void* userdata);
static void callbackSelect(LLUICtrl* ctrl, void* userdata);
static void callbackAddUsers(const std::vector<std::string>& names,
- const std::vector<LLUUID>& agent_ids,
+ const uuid_vec_t& agent_ids,
void* user_data);
bool inviteOwnerCallback(const LLSD& notification, const LLSD& response);
@@ -110,7 +111,7 @@ LLPanelGroupInvite::impl::~impl()
}
void LLPanelGroupInvite::impl::addUsers(const std::vector<std::string>& names,
- const std::vector<LLUUID>& agent_ids)
+ const uuid_vec_t& agent_ids)
{
std::string name;
LLUUID id;
@@ -360,7 +361,7 @@ void LLPanelGroupInvite::impl::callbackClickOK(void* userdata)
//static
void LLPanelGroupInvite::impl::callbackAddUsers(const std::vector<std::string>& names,
- const std::vector<LLUUID>& ids,
+ const uuid_vec_t& ids,
void* user_data)
{
impl* selfp = (impl*) user_data;
@@ -398,23 +399,20 @@ void LLPanelGroupInvite::clear()
mImplementation->mOKButton->setEnabled(FALSE);
}
-void LLPanelGroupInvite::addUsers(std::vector<LLUUID>& agent_ids)
+void LLPanelGroupInvite::addUsers(uuid_vec_t& agent_ids)
{
std::vector<std::string> names;
for (S32 i = 0; i < (S32)agent_ids.size(); i++)
{
LLUUID agent_id = agent_ids[i];
LLViewerObject* dest = gObjectList.findObject(agent_id);
+ std::string fullname;
if(dest && dest->isAvatar())
{
- std::string fullname;
- LLSD args;
LLNameValue* nvfirst = dest->getNVPair("FirstName");
LLNameValue* nvlast = dest->getNVPair("LastName");
if(nvfirst && nvlast)
{
- args["FIRST"] = std::string(nvfirst->getString());
- args["LAST"] = std::string(nvlast->getString());
fullname = std::string(nvfirst->getString()) + " " + std::string(nvlast->getString());
}
if (!fullname.empty())
@@ -427,10 +425,44 @@ void LLPanelGroupInvite::addUsers(std::vector<LLUUID>& agent_ids)
names.push_back("(Unknown)");
}
}
+ else
+ {
+ //looks like user try to invite offline friend
+ //for offline avatar_id gObjectList.findObject() will return null
+ //so we need to do this additional search in avatar tracker, see EXT-4732
+ if (LLAvatarTracker::instance().isBuddy(agent_id))
+ {
+ if (!gCacheName->getFullName(agent_id, fullname))
+ {
+ // actually it should happen, just in case
+ gCacheName->get(LLUUID(agent_id), false, boost::bind(
+ &LLPanelGroupInvite::addUserCallback, this, _1, _2,
+ _3));
+ // for this special case!
+ //when there is no cached name we should remove resident from agent_ids list to avoid breaking of sequence
+ // removed id will be added in callback
+ agent_ids.erase(agent_ids.begin() + i);
+ }
+ else
+ {
+ names.push_back(fullname);
+ }
+ }
+ }
}
mImplementation->addUsers(names, agent_ids);
}
+void LLPanelGroupInvite::addUserCallback(const LLUUID& id, const std::string& first_name, const std::string& last_name)
+{
+ std::vector<std::string> names;
+ uuid_vec_t agent_ids;
+ std::string full_name = first_name + " " + last_name;
+ agent_ids.push_back(id);
+ names.push_back(first_name + " " + last_name);
+
+ mImplementation->addUsers(names, agent_ids);
+}
void LLPanelGroupInvite::draw()
{
LLPanel::draw();
diff --git a/indra/newview/llpanelgroupinvite.h b/indra/newview/llpanelgroupinvite.h
index 37135b488a..2ed443ed46 100644
--- a/indra/newview/llpanelgroupinvite.h
+++ b/indra/newview/llpanelgroupinvite.h
@@ -42,7 +42,11 @@ public:
LLPanelGroupInvite(const LLUUID& group_id);
~LLPanelGroupInvite();
- void addUsers(std::vector<LLUUID>& agent_ids);
+ void addUsers(uuid_vec_t& agent_ids);
+ /**
+ * this callback is being used to add a user whose fullname isn't been loaded before invoking of addUsers().
+ */
+ void addUserCallback(const LLUUID& id, const std::string& first_name, const std::string& last_name);
void clear();
void update();
diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp
index 9023afc602..65fe7165c2 100644
--- a/indra/newview/llpanelgrouplandmoney.cpp
+++ b/indra/newview/llpanelgrouplandmoney.cpp
@@ -236,6 +236,7 @@ public:
std::string mCantViewParcelsText;
std::string mCantViewAccountsText;
+ std::string mEmptyParcelsText;
};
//*******************************************
@@ -452,6 +453,7 @@ void LLPanelGroupLandMoney::impl::processGroupLand(LLMessageSystem* msg)
// This power was removed to make group roles simpler
//if ( !gAgent.hasPowerInGroup(mGroupID, GP_LAND_VIEW_OWNED) ) return;
if (!gAgent.isInGroup(mPanel.mGroupID)) return;
+ mGroupParcelsp->setCommentText(mEmptyParcelsText);
std::string name;
std::string desc;
@@ -696,6 +698,7 @@ BOOL LLPanelGroupLandMoney::postBuild()
mImplementationp->mCantViewParcelsText = getString("cant_view_group_land_text");
mImplementationp->mCantViewAccountsText = getString("cant_view_group_accounting_text");
+ mImplementationp->mEmptyParcelsText = getString("epmty_view_group_land_text");
if ( mImplementationp->mMapButtonp )
{
@@ -1600,6 +1603,8 @@ void LLPanelGroupLandMoney::setGroupID(const LLUUID& id)
mImplementationp->mMoneySalesTabEHp->setGroupID(mGroupID);
}
+ mImplementationp->mBeenActivated = false;
+
activate();
}
diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp
index 6210973dae..ba50081fb2 100644
--- a/indra/newview/llpanelgroupnotices.cpp
+++ b/indra/newview/llpanelgroupnotices.cpp
@@ -38,12 +38,12 @@
#include "llinventory.h"
#include "llviewerinventory.h"
+#include "llinventorydefines.h"
#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
#include "llfloaterinventory.h"
#include "llagent.h"
#include "llagentui.h"
-#include "lltooldraganddrop.h"
#include "lllineeditor.h"
#include "lltexteditor.h"
@@ -59,6 +59,7 @@
#include "llviewerwindow.h"
#include "llviewermessage.h"
#include "llnotificationsutil.h"
+#include "llgiveinventory.h"
static LLRegisterPanelClassWrapper<LLPanelGroupNotices> t_panel_group_notices("panel_group_notices");
@@ -161,7 +162,7 @@ BOOL LLGroupDropTarget::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
{
LLViewerInventoryItem* inv_item = (LLViewerInventoryItem*)cargo_data;
if(gInventory.getItem(inv_item->getUUID())
- && LLToolDragAndDrop::isInventoryGroupGiveAcceptable(inv_item))
+ && LLGiveInventory::isInventoryGroupGiveAcceptable(inv_item))
{
// *TODO: get multiple object transfers working
*accept = ACCEPT_YES_COPY_SINGLE;
@@ -329,12 +330,12 @@ void LLPanelGroupNotices::setItem(LLPointer<LLInventoryItem> inv_item)
mInventoryItem = inv_item;
BOOL item_is_multi = FALSE;
- if ( inv_item->getFlags() & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS )
+ if ( inv_item->getFlags() & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS )
{
item_is_multi = TRUE;
};
- std::string icon_name = get_item_icon_name(inv_item->getType(),
+ std::string icon_name = LLInventoryIcon::getIconName(inv_item->getType(),
inv_item->getInventoryType(),
inv_item->getFlags(),
item_is_multi );
@@ -516,6 +517,11 @@ void LLPanelGroupNotices::processNotices(LLMessageSystem* msg)
mNoticesList->setEnabled(TRUE);
+ //save sort state and set unsorted state to prevent unnecessary
+ //sorting while adding notices
+ bool save_sort = mNoticesList->isSorted();
+ mNoticesList->setNeedsSort(false);
+
for (;i<count;++i)
{
msg->getUUID("Data","NoticeID",id,i);
@@ -526,6 +532,13 @@ void LLPanelGroupNotices::processNotices(LLMessageSystem* msg)
mNoticesList->setEnabled(FALSE);
return;
}
+
+ //with some network delays we can receive notice list more then once...
+ //so add only unique notices
+ S32 pos = mNoticesList->getItemIndex(id);
+
+ if(pos!=-1)//if items with this ID already in the list - skip it
+ continue;
msg->getString("Data","Subject",subj,i);
msg->getString("Data","FromName",name,i);
@@ -539,9 +552,9 @@ void LLPanelGroupNotices::processNotices(LLMessageSystem* msg)
row["columns"][0]["column"] = "icon";
if (has_attachment)
{
- std::string icon_name = get_item_icon_name(
+ std::string icon_name = LLInventoryIcon::getIconName(
(LLAssetType::EType)asset_type,
- LLInventoryType::IT_NONE,FALSE, FALSE);
+ LLInventoryType::IT_NONE);
row["columns"][0]["type"] = "icon";
row["columns"][0]["value"] = icon_name;
}
@@ -561,6 +574,7 @@ void LLPanelGroupNotices::processNotices(LLMessageSystem* msg)
mNoticesList->addElement(row, ADD_BOTTOM);
}
+ mNoticesList->setNeedsSort(save_sort);
mNoticesList->updateSort();
}
@@ -606,9 +620,8 @@ void LLPanelGroupNotices::showNotice(const std::string& subject,
{
mInventoryOffer = inventory_offer;
- std::string icon_name = get_item_icon_name(mInventoryOffer->mType,
- LLInventoryType::IT_TEXTURE,
- 0, FALSE);
+ std::string icon_name = LLInventoryIcon::getIconName(mInventoryOffer->mType,
+ LLInventoryType::IT_TEXTURE);
mViewInventoryIcon->setValue(icon_name);
mViewInventoryIcon->setVisible(TRUE);
@@ -652,6 +665,12 @@ void LLPanelGroupNotices::setGroupID(const LLUUID& id)
LLGroupDropTarget* target = getChild<LLGroupDropTarget> ("drop_target");
target->setPanel (this);
target->setGroup (mGroupID);
+
+ if(mViewMessage)
+ mViewMessage->clear();
+
+ if(mViewInventoryName)
+ mViewInventoryName->clear();
activate();
}
diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp
index c6287472fe..26e8a932aa 100644
--- a/indra/newview/llpanelgrouproles.cpp
+++ b/indra/newview/llpanelgrouproles.cpp
@@ -118,8 +118,7 @@ LLPanelGroupRoles::LLPanelGroupRoles()
mCurrentTab(NULL),
mRequestedTab( NULL ),
mSubTabContainer( NULL ),
- mFirstUse( TRUE ),
- mIgnoreTransition( FALSE )
+ mFirstUse( TRUE )
{
}
@@ -145,8 +144,6 @@ BOOL LLPanelGroupRoles::postBuild()
llwarns << "Invalid subtab panel: " << panel->getName() << llendl;
return FALSE;
}
- // Add click callbacks to all the tabs.
- mSubTabContainer->setCommitCallback(boost::bind(&LLPanelGroupRoles::handleClickSubTab, this));
// Hand the subtab a pointer to this LLPanelGroupRoles, so that it can
// look around for the widgets it is interested in.
@@ -155,6 +152,8 @@ BOOL LLPanelGroupRoles::postBuild()
//subtabp->addObserver(this);
}
+ // Add click callbacks to tab switching.
+ mSubTabContainer->setValidateBeforeCommit(boost::bind(&LLPanelGroupRoles::handleSubTabSwitch, this, _1));
// Set the current tab to whatever is currently being shown.
mCurrentTab = (LLPanelGroupTab*) mSubTabContainer->getCurrentPanel();
@@ -196,30 +195,17 @@ BOOL LLPanelGroupRoles::isVisibleByAgent(LLAgent* agentp)
}
-void LLPanelGroupRoles::handleClickSubTab()
+bool LLPanelGroupRoles::handleSubTabSwitch(const LLSD& data)
{
- // If we are already handling a transition,
- // ignore this.
- if (mIgnoreTransition)
- {
- return;
- }
-
- mRequestedTab = (LLPanelGroupTab*) mSubTabContainer->getCurrentPanel();
-
- // Make sure they aren't just clicking the same tab...
- if (mRequestedTab == mCurrentTab)
+ std::string panel_name = data.asString();
+
+ if(mRequestedTab != NULL)//we already have tab change request
{
- return;
+ return false;
}
- // Try to switch from the current panel to the panel the user selected.
- attemptTransition();
-}
+ mRequestedTab = static_cast<LLPanelGroupTab*>(mSubTabContainer->getPanelByName(panel_name));
-BOOL LLPanelGroupRoles::attemptTransition()
-{
- // Check if the current tab needs to be applied.
std::string mesg;
if (mCurrentTab && mCurrentTab->needsApply(mesg))
{
@@ -235,26 +221,14 @@ BOOL LLPanelGroupRoles::attemptTransition()
LLNotificationsUtil::add("PanelGroupApply", args, LLSD(),
boost::bind(&LLPanelGroupRoles::handleNotifyCallback, this, _1, _2));
mHasModal = TRUE;
- // We need to reselect the current tab, since it isn't finished.
- if (mSubTabContainer)
- {
- mIgnoreTransition = TRUE;
- mSubTabContainer->selectTabPanel( mCurrentTab );
- mIgnoreTransition = FALSE;
- }
+
// Returning FALSE will block a close action from finishing until
// we get a response back from the user.
- return FALSE;
- }
- else
- {
- // The current panel didn't have anything it needed to apply.
- if (mRequestedTab)
- {
- transitionToTab();
- }
- return TRUE;
+ return false;
}
+
+ transitionToTab();
+ return true;
}
void LLPanelGroupRoles::transitionToTab()
@@ -271,6 +245,7 @@ void LLPanelGroupRoles::transitionToTab()
// This is now the current tab;
mCurrentTab = mRequestedTab;
mCurrentTab->activate();
+ mRequestedTab = 0;
}
}
@@ -278,6 +253,7 @@ bool LLPanelGroupRoles::handleNotifyCallback(const LLSD& notification, const LLS
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
mHasModal = FALSE;
+ LLPanelGroupTab* transition_tab = mRequestedTab;
switch (option)
{
case 0: // "Apply Changes"
@@ -297,26 +273,20 @@ bool LLPanelGroupRoles::handleNotifyCallback(const LLSD& notification, const LLS
// Skip switching tabs.
break;
}
-
- // This panel's info successfully applied.
- // Switch to the next panel.
- // No break! Continue into 'Ignore Changes' which just switches tabs.
- mIgnoreTransition = TRUE;
- mSubTabContainer->selectTabPanel( mRequestedTab );
- mIgnoreTransition = FALSE;
transitionToTab();
+ mSubTabContainer->selectTabPanel( transition_tab );
+
break;
}
case 1: // "Ignore Changes"
// Switch to the requested panel without applying changes
cancel();
- mIgnoreTransition = TRUE;
- mSubTabContainer->selectTabPanel( mRequestedTab );
- mIgnoreTransition = FALSE;
transitionToTab();
+ mSubTabContainer->selectTabPanel( transition_tab );
break;
case 2: // "Cancel"
default:
+ mRequestedTab = NULL;
// Do nothing. The user is canceling the action.
break;
}
@@ -827,8 +797,39 @@ BOOL LLPanelGroupMembersSubTab::postBuildSubTab(LLView* root)
void LLPanelGroupMembersSubTab::setGroupID(const LLUUID& id)
{
+ //clear members list
+ if(mMembersList) mMembersList->deleteAllItems();
+ if(mAssignedRolesList) mAssignedRolesList->deleteAllItems();
+ if(mAllowedActionsList) mAllowedActionsList->deleteAllItems();
+
LLPanelGroupSubTab::setGroupID(id);
+}
+
+void LLPanelGroupRolesSubTab::setGroupID(const LLUUID& id)
+{
+ if(mRolesList) mRolesList->deleteAllItems();
+ if(mAssignedMembersList) mAssignedMembersList->deleteAllItems();
+ if(mAllowedActionsList) mAllowedActionsList->deleteAllItems();
+
+ if(mRoleName) mRoleName->clear();
+ if(mRoleDescription) mRoleDescription->clear();
+ if(mRoleTitle) mRoleTitle->clear();
+
+ mHasRoleChange = FALSE;
+
+ setFooterEnabled(FALSE);
+ LLPanelGroupSubTab::setGroupID(id);
+}
+void LLPanelGroupActionsSubTab::setGroupID(const LLUUID& id)
+{
+ if(mActionList) mActionList->deleteAllItems();
+ if(mActionRoles) mActionRoles->deleteAllItems();
+ if(mActionMembers) mActionMembers->deleteAllItems();
+
+ if(mActionDescription) mActionDescription->clear();
+
+ LLPanelGroupSubTab::setGroupID(id);
}
@@ -859,7 +860,7 @@ void LLPanelGroupMembersSubTab::handleMemberSelect()
if (selection.empty()) return;
// Build a vector of all selected members, and gather allowed actions.
- std::vector<LLUUID> selected_members;
+ uuid_vec_t selected_members;
U64 allowed_by_all = 0xffffffffffffLL;
U64 allowed_by_some = 0;
@@ -925,8 +926,8 @@ void LLPanelGroupMembersSubTab::handleMemberSelect()
if (cb_enable && (count > 0) && role_id == gdatap->mOwnerRole)
{
// Check if any owners besides this agent are selected.
- std::vector<LLUUID>::const_iterator member_iter;
- std::vector<LLUUID>::const_iterator member_end =
+ uuid_vec_t::const_iterator member_iter;
+ uuid_vec_t::const_iterator member_end =
selected_members.end();
for (member_iter = selected_members.begin();
member_iter != member_end;
@@ -952,7 +953,7 @@ void LLPanelGroupMembersSubTab::handleMemberSelect()
//now see if there are any role changes for the selected
//members and remember to include them
- std::vector<LLUUID>::iterator sel_mem_iter = selected_members.begin();
+ uuid_vec_t::iterator sel_mem_iter = selected_members.begin();
for (; sel_mem_iter != selected_members.end(); sel_mem_iter++)
{
LLRoleMemberChangeType type;
@@ -1009,7 +1010,7 @@ void LLPanelGroupMembersSubTab::handleMemberSelect()
check->setTentative(
(0 != count)
&& (selected_members.size() !=
- (std::vector<LLUUID>::size_type)count));
+ (uuid_vec_t::size_type)count));
//NOTE: as of right now a user can break the group
//by removing himself from a role if he is the
@@ -1084,7 +1085,7 @@ void LLPanelGroupMembersSubTab::onEjectMembers(void *userdata)
void LLPanelGroupMembersSubTab::handleEjectMembers()
{
//send down an eject message
- std::vector<LLUUID> selected_members;
+ uuid_vec_t selected_members;
std::vector<LLScrollListItem*> selection = mMembersList->getAllSelected();
if (selection.empty()) return;
@@ -1105,13 +1106,13 @@ void LLPanelGroupMembersSubTab::handleEjectMembers()
selected_members);
}
-void LLPanelGroupMembersSubTab::sendEjectNotifications(const LLUUID& group_id, const std::vector<LLUUID>& selected_members)
+void LLPanelGroupMembersSubTab::sendEjectNotifications(const LLUUID& group_id, const uuid_vec_t& selected_members)
{
LLGroupMgrGroupData* group_data = LLGroupMgr::getInstance()->getGroupData(group_id);
if (group_data)
{
- for (std::vector<LLUUID>::const_iterator i = selected_members.begin(); i != selected_members.end(); ++i)
+ for (uuid_vec_t::const_iterator i = selected_members.begin(); i != selected_members.end(); ++i)
{
LLSD args;
std::string name;
@@ -1437,7 +1438,7 @@ U64 LLPanelGroupMembersSubTab::getAgentPowersBasedOnRoleChanges(const LLUUID& ag
if ( role_change_datap )
{
- std::vector<LLUUID> roles_to_be_removed;
+ uuid_vec_t roles_to_be_removed;
for (role_change_data_map_t::iterator role = role_change_datap->begin();
role != role_change_datap->end(); ++ role)
@@ -1750,8 +1751,7 @@ BOOL LLPanelGroupRolesSubTab::postBuildSubTab(LLView* root)
mRoleTitle->setKeystrokeCallback(onPropertiesKey, this);
mRoleDescription->setCommitOnFocusLost(TRUE);
- mRoleDescription->setCommitCallback(onDescriptionCommit, this);
- mRoleDescription->setFocusReceivedCallback(boost::bind(onDescriptionFocus, _1, this));
+ mRoleDescription->setKeystrokeCallback(boost::bind(&LLPanelGroupRolesSubTab::onDescriptionKeyStroke, this, _1));
setFooterEnabled(FALSE);
@@ -2086,8 +2086,8 @@ void LLPanelGroupRolesSubTab::buildMembersList()
LLGroupRoleData* rdatap = (*rit).second;
if (rdatap)
{
- std::vector<LLUUID>::const_iterator mit = rdatap->getMembersBegin();
- std::vector<LLUUID>::const_iterator end = rdatap->getMembersEnd();
+ uuid_vec_t::const_iterator mit = rdatap->getMembersBegin();
+ uuid_vec_t::const_iterator end = rdatap->getMembersEnd();
for ( ; mit != end; ++mit)
{
mAssignedMembersList->addNameItem((*mit));
@@ -2207,14 +2207,10 @@ void LLPanelGroupRolesSubTab::onPropertiesKey(LLLineEditor* ctrl, void* user_dat
self->notifyObservers();
}
-// static
-void LLPanelGroupRolesSubTab::onDescriptionFocus(LLFocusableElement* ctrl, void* user_data)
+void LLPanelGroupRolesSubTab::onDescriptionKeyStroke(LLTextEditor* caller)
{
- LLPanelGroupRolesSubTab* self = static_cast<LLPanelGroupRolesSubTab*>(user_data);
- if (!self) return;
-
- self->mHasRoleChange = TRUE;
- self->notifyObservers();
+ mHasRoleChange = TRUE;
+ notifyObservers();
}
// static
diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h
index eac22a6338..cb7941ad9e 100644
--- a/indra/newview/llpanelgrouproles.h
+++ b/indra/newview/llpanelgrouproles.h
@@ -65,7 +65,7 @@ public:
virtual BOOL isVisibleByAgent(LLAgent* agentp);
- void handleClickSubTab();
+ bool handleSubTabSwitch(const LLSD& data);
// Checks if the current tab needs to be applied, and tries to switch to the requested tab.
BOOL attemptTransition();
@@ -93,7 +93,6 @@ protected:
LLPanelGroupTab* mRequestedTab;
LLTabContainer* mSubTabContainer;
BOOL mFirstUse;
- BOOL mIgnoreTransition;
std::string mDefaultNeedsApplyMesg;
std::string mWantApplyMesg;
@@ -173,7 +172,7 @@ public:
static void onEjectMembers(void*);
void handleEjectMembers();
- void sendEjectNotifications(const LLUUID& group_id, const std::vector<LLUUID>& selected_members);
+ void sendEjectNotifications(const LLUUID& group_id, const uuid_vec_t& selected_members);
static void onRoleCheck(LLUICtrl* check, void* user_data);
void handleRoleCheck(const LLUUID& role_id,
@@ -245,8 +244,9 @@ public:
static void onPropertiesKey(LLLineEditor*, void*);
+ void onDescriptionKeyStroke(LLTextEditor* caller);
+
static void onDescriptionCommit(LLUICtrl*, void*);
- static void onDescriptionFocus(LLFocusableElement*, void*);
static void onMemberVisibilityChange(LLUICtrl*, void*);
void handleMemberVisibilityChange(bool value);
@@ -258,6 +258,8 @@ public:
void handleDeleteRole();
void saveRoleChanges();
+
+ virtual void setGroupID(const LLUUID& id);
protected:
void handleActionCheck(LLUICtrl* ctrl, bool force);
LLSD createRoleItem(const LLUUID& role_id, std::string name, std::string title, S32 members);
@@ -295,6 +297,8 @@ public:
virtual void update(LLGroupChange gc);
void handleActionSelect();
+
+ virtual void setGroupID(const LLUUID& id);
protected:
LLScrollListCtrl* mActionList;
LLScrollListCtrl* mActionRoles;
diff --git a/indra/newview/llpanelimcontrolpanel.cpp b/indra/newview/llpanelimcontrolpanel.cpp
index cbd6f64a48..709bb83fe4 100644
--- a/indra/newview/llpanelimcontrolpanel.cpp
+++ b/indra/newview/llpanelimcontrolpanel.cpp
@@ -81,7 +81,8 @@ void LLPanelChatControlPanel::onVoiceChannelStateChanged(const LLVoiceChannel::E
void LLPanelChatControlPanel::updateCallButton()
{
- bool voice_enabled = LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking();
+ // hide/show call button
+ bool voice_enabled = LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking();
LLIMModel::LLIMSession* session = LLIMModel::getInstance()->findIMSession(mSessionId);
@@ -112,8 +113,10 @@ void LLPanelChatControlPanel::updateButtons(bool is_call_started)
LLPanelChatControlPanel::~LLPanelChatControlPanel()
{
mVoiceChannelStateChangeConnection.disconnect();
- if(LLVoiceClient::getInstance())
+ if(LLVoiceClient::instanceExists())
+ {
LLVoiceClient::getInstance()->removeObserver(this);
+ }
}
BOOL LLPanelChatControlPanel::postBuild()
@@ -122,7 +125,7 @@ BOOL LLPanelChatControlPanel::postBuild()
childSetAction("end_call_btn", boost::bind(&LLPanelChatControlPanel::onEndCallButtonClicked, this));
childSetAction("voice_ctrls_btn", boost::bind(&LLPanelChatControlPanel::onOpenVoiceControlsClicked, this));
- gVoiceClient->addObserver(this);
+ LLVoiceClient::getInstance()->addObserver(this);
return TRUE;
}
@@ -224,14 +227,6 @@ void LLPanelIMControlPanel::setSessionId(const LLUUID& session_id)
childSetEnabled("share_btn", FALSE);
childSetEnabled("teleport_btn", FALSE);
childSetEnabled("pay_btn", FALSE);
-
- getChild<LLTextBox>("avatar_name")->setValue(im_session->mName);
- getChild<LLTextBox>("avatar_name")->setToolTip(im_session->mName);
- }
- else
- {
- // If the participant is an avatar, fetch the currect name
- gCacheName->get(mAvatarID, FALSE, boost::bind(&LLPanelIMControlPanel::nameUpdatedCallback, this, _1, _2, _3, _4));
}
}
@@ -247,19 +242,6 @@ void LLPanelIMControlPanel::changed(U32 mask)
}
}
-void LLPanelIMControlPanel::nameUpdatedCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group)
-{
- if ( id == mAvatarID )
- {
- std::string avatar_name;
- avatar_name.assign(first);
- avatar_name.append(" ");
- avatar_name.append(last);
- getChild<LLTextBox>("avatar_name")->setValue(avatar_name);
- getChild<LLTextBox>("avatar_name")->setToolTip(avatar_name);
- }
-}
-
LLPanelGroupControlPanel::LLPanelGroupControlPanel(const LLUUID& session_id):
mParticipantList(NULL)
{
diff --git a/indra/newview/llpanelimcontrolpanel.h b/indra/newview/llpanelimcontrolpanel.h
index 3ab505a084..ce8fc58e56 100644
--- a/indra/newview/llpanelimcontrolpanel.h
+++ b/indra/newview/llpanelimcontrolpanel.h
@@ -89,9 +89,6 @@ public:
// LLFriendObserver trigger
virtual void changed(U32 mask);
-protected:
- void nameUpdatedCallback(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group);
-
private:
void onViewProfileButtonClicked();
void onAddFriendButtonClicked();
diff --git a/indra/newview/llpanellandaudio.cpp b/indra/newview/llpanellandaudio.cpp
index 6a4c909759..a92b4357ed 100644
--- a/indra/newview/llpanellandaudio.cpp
+++ b/indra/newview/llpanellandaudio.cpp
@@ -153,6 +153,13 @@ void LLPanelLandAudio::refresh()
mCheckParcelEnableVoice->set(allow_voice);
mCheckParcelVoiceLocal->set(!parcel->getParcelFlagUseEstateVoiceChannel());
+ // don't display urls if you're not able to change it
+ // much requested change in forums so people can't 'steal' urls
+ // NOTE: bug#2009 means this is still vunerable - however, bug
+ // should be closed since this bug opens up major security issues elsewhere.
+ bool obscure_music = ! can_change_media && parcel->getObscureMusic();
+
+ mMusicURLEdit->setDrawAsterixes(obscure_music);
mMusicURLEdit->setText(parcel->getMusicURL());
mMusicURLEdit->setEnabled( can_change_media );
}
diff --git a/indra/newview/llpanellandmarkinfo.cpp b/indra/newview/llpanellandmarkinfo.cpp
index 36a542cfa0..4ffd43cb0f 100644
--- a/indra/newview/llpanellandmarkinfo.cpp
+++ b/indra/newview/llpanellandmarkinfo.cpp
@@ -36,6 +36,7 @@
#include "llcombobox.h"
#include "lliconctrl.h"
+#include "llinventoryfunctions.h"
#include "lllineeditor.h"
#include "lltextbox.h"
#include "lltexteditor.h"
@@ -376,21 +377,53 @@ void LLPanelLandmarkInfo::createLandmark(const LLUUID& folder_id)
// static
std::string LLPanelLandmarkInfo::getFullFolderName(const LLViewerInventoryCategory* cat)
{
- std::string name = cat->getName();
+ std::string name;
LLUUID parent_id;
- // translate category name, if it's right below the root
- // FIXME: it can throw notification about non existent string in strings.xml
- if (cat->getParentUUID().notNull() && cat->getParentUUID() == gInventory.getRootFolderID())
+ llassert(cat);
+ if (cat)
{
- LLTrans::findString(name, "InvFolder " + name);
- }
+ name = cat->getName();
+ parent_id = cat->getParentUUID();
+ bool is_under_root_category = parent_id == gInventory.getRootFolderID();
- // we don't want "My Inventory" to appear in the name
- while ((parent_id = cat->getParentUUID()).notNull() && parent_id != gInventory.getRootFolderID())
- {
- cat = gInventory.getCategory(parent_id);
- name = cat->getName() + "/" + name;
+ // we don't want "My Inventory" to appear in the name
+ while ((parent_id = cat->getParentUUID()).notNull())
+ {
+ cat = gInventory.getCategory(parent_id);
+ llassert(cat);
+ if (cat)
+ {
+ if (is_under_root_category || cat->getParentUUID() == gInventory.getRootFolderID())
+ {
+ std::string localized_name;
+
+ // Looking for translation only for protected type categories
+ // to avoid warnings about non existent string in strings.xml.
+ bool is_protected_type = LLFolderType::lookupIsProtectedType(cat->getPreferredType());
+
+ if (is_under_root_category)
+ {
+ // translate category name, if it's right below the root
+ bool is_found = is_protected_type && LLTrans::findString(localized_name, "InvFolder " + name);
+ name = is_found ? localized_name : name;
+ }
+ else
+ {
+ bool is_found = is_protected_type && LLTrans::findString(localized_name, "InvFolder " + cat->getName());
+
+ // add translated category name to folder's full name
+ name = (is_found ? localized_name : cat->getName()) + "/" + name;
+ }
+
+ break;
+ }
+ else
+ {
+ name = cat->getName() + "/" + name;
+ }
+ }
+ }
}
return name;
@@ -406,21 +439,24 @@ void LLPanelLandmarkInfo::populateFoldersList()
// Put the "Landmarks" folder first in list.
LLUUID landmarks_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
- const LLViewerInventoryCategory* cat = gInventory.getCategory(landmarks_id);
- if (!cat)
+ const LLViewerInventoryCategory* lmcat = gInventory.getCategory(landmarks_id);
+ if (!lmcat)
{
llwarns << "Cannot find the landmarks folder" << llendl;
}
- std::string cat_full_name = getFullFolderName(cat);
- mFolderCombo->add(cat_full_name, cat->getUUID());
+ else
+ {
+ std::string cat_full_name = getFullFolderName(lmcat);
+ mFolderCombo->add(cat_full_name, lmcat->getUUID());
+ }
typedef std::vector<folder_pair_t> folder_vec_t;
folder_vec_t folders;
// Sort the folders by their full name.
for (S32 i = 0; i < cats.count(); i++)
{
- cat = cats.get(i);
- cat_full_name = getFullFolderName(cat);
+ const LLViewerInventoryCategory* cat = cats.get(i);
+ std::string cat_full_name = getFullFolderName(cat);
folders.push_back(folder_pair_t(cat->getUUID(), cat_full_name));
}
sort(folders.begin(), folders.end(), cmp_folders);
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index 7c1b0f6234..ce1131f45c 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -49,6 +49,7 @@
#include "lldndbutton.h"
#include "llfloaterworldmap.h"
#include "llfolderviewitem.h"
+#include "llinventorymodelbackgroundfetch.h"
#include "llinventorypanel.h"
#include "lllandmarkactions.h"
#include "llplacesinventorybridge.h"
@@ -69,6 +70,10 @@ static const std::string TRASH_BUTTON_NAME = "trash_btn";
// helper functions
static void filter_list(LLPlacesInventoryPanel* inventory_list, const std::string& string);
static bool category_has_descendents(LLPlacesInventoryPanel* inventory_list);
+static void collapse_all_folders(LLFolderView* root_folder);
+static void expand_all_folders(LLFolderView* root_folder);
+static bool has_expanded_folders(LLFolderView* root_folder);
+static bool has_collapsed_folders(LLFolderView* root_folder);
/**
* Functor counting expanded and collapsed folders in folder view tree to know
@@ -111,25 +116,76 @@ void LLCheckFolderState::doFolder(LLFolderViewFolder* folder)
}
}
+// Functor searching and opening a folder specified by UUID
+// in a folder view tree.
+class LLOpenFolderByID : public LLFolderViewFunctor
+{
+public:
+ LLOpenFolderByID(const LLUUID& folder_id)
+ : mFolderID(folder_id)
+ , mIsFolderOpen(false)
+ {}
+ virtual ~LLOpenFolderByID() {}
+ /*virtual*/ void doFolder(LLFolderViewFolder* folder);
+ /*virtual*/ void doItem(LLFolderViewItem* item) {}
+
+ bool isFolderOpen() { return mIsFolderOpen; }
+
+private:
+ bool mIsFolderOpen;
+ LLUUID mFolderID;
+};
+
+// virtual
+void LLOpenFolderByID::doFolder(LLFolderViewFolder* folder)
+{
+ if (folder->getListener() && folder->getListener()->getUUID() == mFolderID)
+ {
+ if (!folder->isOpen())
+ {
+ folder->setOpen(TRUE);
+ mIsFolderOpen = true;
+ }
+ }
+}
+
/**
* Bridge to support knowing when the inventory has changed to update Landmarks tab
* ShowFolderState filter setting to show all folders when the filter string is empty and
* empty folder message when Landmarks inventory category has no children.
+ * Ensures that "Landmarks" folder in the Library is open on strart up.
*/
class LLLandmarksPanelObserver : public LLInventoryObserver
{
public:
- LLLandmarksPanelObserver(LLLandmarksPanel* lp) : mLP(lp) {}
+ LLLandmarksPanelObserver(LLLandmarksPanel* lp)
+ : mLP(lp),
+ mIsLibraryLandmarksOpen(false)
+ {}
virtual ~LLLandmarksPanelObserver() {}
/*virtual*/ void changed(U32 mask);
private:
LLLandmarksPanel* mLP;
+ bool mIsLibraryLandmarksOpen;
};
void LLLandmarksPanelObserver::changed(U32 mask)
{
mLP->updateShowFolderState();
+
+ LLPlacesInventoryPanel* library = mLP->getLibraryInventoryPanel();
+ if (!mIsLibraryLandmarksOpen && library)
+ {
+ // Search for "Landmarks" folder in the Library and open it once on start up. See EXT-4827.
+ const LLUUID &landmarks_cat = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false, true);
+ if (landmarks_cat.notNull())
+ {
+ LLOpenFolderByID opener(landmarks_cat);
+ library->getRootFolder()->applyFunctorRecursively(opener);
+ mIsLibraryLandmarksOpen = opener.isFolderOpen();
+ }
+ }
}
LLLandmarksPanel::LLLandmarksPanel()
@@ -165,8 +221,6 @@ BOOL LLLandmarksPanel::postBuild()
// mast be called before any other initXXX methods to init Gear menu
initListCommandsHandlers();
- U32 sort_order = gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER);
- mSortByDate = sort_order & LLInventoryFilter::SO_DATE;
initFavoritesInventoryPanel();
initLandmarksInventoryPanel();
initMyInventoryPanel();
@@ -224,6 +278,17 @@ void LLLandmarksPanel::onShowOnMap()
doActionOnCurSelectedLandmark(boost::bind(&LLLandmarksPanel::doShowOnMap, this, _1));
}
+//virtual
+void LLLandmarksPanel::onShowProfile()
+{
+ LLFolderViewItem* cur_item = getCurSelectedItem();
+
+ if(!cur_item)
+ return;
+
+ cur_item->getListener()->performAction(mCurrentSelectedList->getModel(),"about");
+}
+
// virtual
void LLLandmarksPanel::onTeleport()
{
@@ -242,6 +307,25 @@ void LLLandmarksPanel::onTeleport()
}
// virtual
+bool LLLandmarksPanel::isSingleItemSelected()
+{
+ bool result = false;
+
+ if (mCurrentSelectedList != NULL)
+ {
+ LLPlacesFolderView* root_view =
+ static_cast<LLPlacesFolderView*>(mCurrentSelectedList->getRootFolder());
+
+ if (root_view->getSelectedCount() == 1)
+ {
+ result = isLandmarkSelected();
+ }
+ }
+
+ return result;
+}
+
+// virtual
void LLLandmarksPanel::updateVerbs()
{
if (!isTabVisible())
@@ -249,6 +333,7 @@ void LLLandmarksPanel::updateVerbs()
bool landmark_selected = isLandmarkSelected();
mTeleportBtn->setEnabled(landmark_selected && isActionEnabled("teleport"));
+ mShowProfile->setEnabled(landmark_selected && isActionEnabled("more_info"));
mShowOnMapBtn->setEnabled(landmark_selected && isActionEnabled("show_on_map"));
// TODO: mantipov: Uncomment when mShareBtn is supported
@@ -379,9 +464,9 @@ LLFolderViewItem* LLLandmarksPanel::selectItemInAccordionTab(LLPlacesInventoryPa
if (!inventory_list)
return NULL;
- LLFolderView* folder_view = inventory_list->getRootFolder();
+ LLFolderView* root = inventory_list->getRootFolder();
- LLFolderViewItem* item = folder_view->getItemByID(obj_id);
+ LLFolderViewItem* item = root->getItemByID(obj_id);
if (!item)
return NULL;
@@ -391,7 +476,7 @@ LLFolderViewItem* LLLandmarksPanel::selectItemInAccordionTab(LLPlacesInventoryPa
tab->changeOpenClose(false);
}
- folder_view->setSelection(item, FALSE, take_keyboard_focus);
+ root->setSelection(item, FALSE, take_keyboard_focus);
LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("landmarks_accordion");
LLRect screen_rc;
@@ -479,7 +564,7 @@ void LLLandmarksPanel::initLandmarksInventoryPanel()
// subscribe to have auto-rename functionality while creating New Folder
mLandmarksInventoryPanel->setSelectCallback(boost::bind(&LLInventoryPanel::onSelectionChange, mLandmarksInventoryPanel, _1, _2));
- initAccordion("tab_landmarks", mLandmarksInventoryPanel, true);
+ mMyLandmarksAccordionTab = initAccordion("tab_landmarks", mLandmarksInventoryPanel, true);
}
void LLLandmarksPanel::initMyInventoryPanel()
@@ -501,7 +586,7 @@ void LLLandmarksPanel::initLibraryInventoryPanel()
const LLUUID &landmarks_cat = gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false, true);
if (landmarks_cat.notNull())
{
- gInventory.startBackgroundFetch(landmarks_cat);
+ LLInventoryModelBackgroundFetch::instance().start(landmarks_cat);
}
// Expanding "Library" tab for new users who have no landmarks in "My Inventory".
@@ -515,24 +600,27 @@ void LLLandmarksPanel::initLandmarksPanel(LLPlacesInventoryPanel* inventory_list
if (!inventory_list->getFilter())
return;
+ inventory_list->getFilter()->setEmptyLookupMessage("PlacesNoMatchingItems");
inventory_list->setFilterTypes(0x1 << LLInventoryType::IT_LANDMARK);
inventory_list->setSelectCallback(boost::bind(&LLLandmarksPanel::onSelectionChange, this, inventory_list, _1, _2));
inventory_list->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
- updateSortOrder(inventory_list, mSortByDate);
+ bool sorting_order = gSavedSettings.getBOOL("LandmarksSortedByDate");
+ updateSortOrder(inventory_list, sorting_order);
LLPlacesFolderView* root_folder = dynamic_cast<LLPlacesFolderView*>(inventory_list->getRootFolder());
if (root_folder)
{
root_folder->setupMenuHandle(LLInventoryType::IT_CATEGORY, mGearFolderMenu->getHandle());
root_folder->setupMenuHandle(LLInventoryType::IT_LANDMARK, mGearLandmarkMenu->getHandle());
+
+ root_folder->setParentLandmarksPanel(this);
}
- root_folder->setParentLandmarksPanel(this);
inventory_list->saveFolderState();
}
-void LLLandmarksPanel::initAccordion(const std::string& accordion_tab_name, LLPlacesInventoryPanel* inventory_list, bool expand_tab)
+LLAccordionCtrlTab* LLLandmarksPanel::initAccordion(const std::string& accordion_tab_name, LLPlacesInventoryPanel* inventory_list, bool expand_tab)
{
LLAccordionCtrlTab* accordion_tab = getChild<LLAccordionCtrlTab>(accordion_tab_name);
@@ -540,6 +628,7 @@ void LLLandmarksPanel::initAccordion(const std::string& accordion_tab_name, LLPl
accordion_tab->setDropDownStateChangedCallback(
boost::bind(&LLLandmarksPanel::onAccordionExpandedCollapsed, this, _2, inventory_list));
accordion_tab->setDisplayChildren(expand_tab);
+ return accordion_tab;
}
void LLLandmarksPanel::onAccordionExpandedCollapsed(const LLSD& param, LLPlacesInventoryPanel* inventory_list)
@@ -563,7 +652,7 @@ void LLLandmarksPanel::onAccordionExpandedCollapsed(const LLSD& param, LLPlacesI
if (!gInventory.isCategoryComplete(cat_id))
*/
{
- gInventory.startBackgroundFetch(cat_id);
+ LLInventoryModelBackgroundFetch::instance().start(cat_id);
}
// Apply filter substring because it might have been changed
@@ -600,14 +689,12 @@ void LLLandmarksPanel::initListCommandsHandlers()
mListCommands->childSetAction(OPTIONS_BUTTON_NAME, boost::bind(&LLLandmarksPanel::onActionsButtonClick, this));
mListCommands->childSetAction(TRASH_BUTTON_NAME, boost::bind(&LLLandmarksPanel::onTrashButtonClick, this));
- mListCommands->getChild<LLButton>(ADD_BUTTON_NAME)->setHeldDownCallback(boost::bind(&LLLandmarksPanel::onAddButtonHeldDown, this));
- static const LLSD add_landmark_command("add_landmark");
- mListCommands->childSetAction(ADD_BUTTON_NAME, boost::bind(&LLLandmarksPanel::onAddAction, this, add_landmark_command));
LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>(TRASH_BUTTON_NAME);
trash_btn->setDragAndDropHandler(boost::bind(&LLLandmarksPanel::handleDragAndDropToTrash, this
, _4 // BOOL drop
, _5 // EDragAndDropType cargo_type
+ , _6 // void* cargo_data
, _7 // EAcceptance* accept
));
@@ -620,6 +707,8 @@ void LLLandmarksPanel::initListCommandsHandlers()
mGearLandmarkMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_places_gear_landmark.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
mGearFolderMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_places_gear_folder.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
mMenuAdd = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_place_add_button.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+
+ mListCommands->childSetAction(ADD_BUTTON_NAME, boost::bind(&LLLandmarksPanel::showActionMenu, this, mMenuAdd, ADD_BUTTON_NAME));
}
@@ -631,37 +720,30 @@ void LLLandmarksPanel::updateListCommands()
// keep Options & Add Landmark buttons always enabled
mListCommands->childSetEnabled(ADD_FOLDER_BUTTON_NAME, add_folder_enabled);
mListCommands->childSetEnabled(TRASH_BUTTON_NAME, trash_enabled);
- mListCommands->childSetEnabled(OPTIONS_BUTTON_NAME,getCurSelectedItem() != NULL);
}
void LLLandmarksPanel::onActionsButtonClick()
{
+ LLMenuGL* menu = mGearFolderMenu;
+
LLFolderViewItem* cur_item = NULL;
if(mCurrentSelectedList)
- cur_item = mCurrentSelectedList->getRootFolder()->getCurSelectedItem();
-
- if(!cur_item)
- return;
-
- LLFolderViewEventListener* listenerp = cur_item->getListener();
-
- LLMenuGL* menu =NULL;
- if (listenerp->getInventoryType() == LLInventoryType::IT_LANDMARK)
{
- menu = mGearLandmarkMenu;
- }
- else if (listenerp->getInventoryType() == LLInventoryType::IT_CATEGORY)
- {
- mGearFolderMenu->getChild<LLMenuItemCallGL>("expand")->setVisible(!cur_item->isOpen());
- mGearFolderMenu->getChild<LLMenuItemCallGL>("collapse")->setVisible(cur_item->isOpen());
- menu = mGearFolderMenu;
+ cur_item = mCurrentSelectedList->getRootFolder()->getCurSelectedItem();
+ if(!cur_item)
+ return;
+
+ LLFolderViewEventListener* listenerp = cur_item->getListener();
+ if(!listenerp)
+ return;
+
+ if (listenerp->getInventoryType() == LLInventoryType::IT_LANDMARK)
+ {
+ menu = mGearLandmarkMenu;
+ }
}
- showActionMenu(menu,OPTIONS_BUTTON_NAME);
-}
-void LLLandmarksPanel::onAddButtonHeldDown()
-{
- showActionMenu(mMenuAdd,ADD_BUTTON_NAME);
+ showActionMenu(menu,OPTIONS_BUTTON_NAME);
}
void LLLandmarksPanel::showActionMenu(LLMenuGL* menu, std::string spawning_view_name)
@@ -723,6 +805,17 @@ void LLLandmarksPanel::onAddAction(const LLSD& userdata) const
"category"), gInventory.findCategoryUUIDForType(
LLFolderType::FT_LANDMARK));
}
+ else
+ {
+ //in case My Landmarks tab is completely empty (thus cannot be determined as being selected)
+ menu_create_inventory_item(mLandmarksInventoryPanel->getRootFolder(), NULL, LLSD("category"),
+ gInventory.findCategoryUUIDForType(LLFolderType::FT_LANDMARK));
+
+ if (mMyLandmarksAccordionTab)
+ {
+ mMyLandmarksAccordionTab->changeOpenClose(false);
+ }
+ }
}
}
@@ -753,35 +846,47 @@ void LLLandmarksPanel::onClipboardAction(const LLSD& userdata) const
void LLLandmarksPanel::onFoldingAction(const LLSD& userdata)
{
- if(!mCurrentSelectedList) return;
-
- LLFolderView* root_folder = mCurrentSelectedList->getRootFolder();
std::string command_name = userdata.asString();
if ("expand_all" == command_name)
{
- root_folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN);
- root_folder->arrangeAll();
+ expand_all_folders(mFavoritesInventoryPanel->getRootFolder());
+ expand_all_folders(mLandmarksInventoryPanel->getRootFolder());
+ expand_all_folders(mMyInventoryPanel->getRootFolder());
+ expand_all_folders(mLibraryInventoryPanel->getRootFolder());
+
+ for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter)
+ {
+ (*iter)->changeOpenClose(false);
+ }
}
else if ("collapse_all" == command_name)
{
- root_folder->setOpenArrangeRecursively(FALSE, LLFolderViewFolder::RECURSE_DOWN);
+ collapse_all_folders(mFavoritesInventoryPanel->getRootFolder());
+ collapse_all_folders(mLandmarksInventoryPanel->getRootFolder());
+ collapse_all_folders(mMyInventoryPanel->getRootFolder());
+ collapse_all_folders(mLibraryInventoryPanel->getRootFolder());
- // The top level folder is invisible, it must be open to
- // display its sub-folders.
- root_folder->openTopLevelFolders();
- root_folder->arrangeAll();
+ for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter)
+ {
+ (*iter)->changeOpenClose(true);
+ }
}
- else if ( "sort_by_date" == command_name)
+ else if ("sort_by_date" == command_name)
{
- mSortByDate = !mSortByDate;
- updateSortOrder(mLandmarksInventoryPanel, mSortByDate);
- updateSortOrder(mMyInventoryPanel, mSortByDate);
- updateSortOrder(mLibraryInventoryPanel, mSortByDate);
+ bool sorting_order = gSavedSettings.getBOOL("LandmarksSortedByDate");
+ sorting_order=!sorting_order;
+ gSavedSettings.setBOOL("LandmarksSortedByDate",sorting_order);
+ updateSortOrder(mLandmarksInventoryPanel, sorting_order);
+ updateSortOrder(mMyInventoryPanel, sorting_order);
+ updateSortOrder(mLibraryInventoryPanel, sorting_order);
}
else
{
- root_folder->doToSelected(&gInventory, userdata);
+ if(mCurrentSelectedList)
+ {
+ mCurrentSelectedList->getRootFolder()->doToSelected(&gInventory, userdata);
+ }
}
}
@@ -791,7 +896,8 @@ bool LLLandmarksPanel::isActionChecked(const LLSD& userdata) const
if ( "sort_by_date" == command_name)
{
- return mSortByDate;
+ bool sorting_order = gSavedSettings.getBOOL("LandmarksSortedByDate");
+ return sorting_order;
}
return false;
@@ -801,53 +907,82 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const
{
std::string command_name = userdata.asString();
-
- LLPlacesFolderView* rootFolderView = mCurrentSelectedList ?
+ LLPlacesFolderView* root_folder_view = mCurrentSelectedList ?
static_cast<LLPlacesFolderView*>(mCurrentSelectedList->getRootFolder()) : NULL;
- if (NULL == rootFolderView) return false;
-
- // disable some commands for multi-selection. EXT-1757
- if (rootFolderView->getSelectedCount() > 1)
+ if ("collapse_all" == command_name)
{
- if ( "teleport" == command_name
- || "more_info" == command_name
- || "rename" == command_name
- || "show_on_map" == command_name
- || "copy_slurl" == command_name
- )
+ bool disable_collapse_all = !has_expanded_folders(mFavoritesInventoryPanel->getRootFolder())
+ && !has_expanded_folders(mLandmarksInventoryPanel->getRootFolder())
+ && !has_expanded_folders(mMyInventoryPanel->getRootFolder())
+ && !has_expanded_folders(mLibraryInventoryPanel->getRootFolder());
+ if (disable_collapse_all)
{
- return false;
+ for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter)
+ {
+ if ((*iter)->isExpanded())
+ {
+ disable_collapse_all = false;
+ break;
+ }
+ }
}
+ return !disable_collapse_all;
}
+ else if ("expand_all" == command_name)
+ {
+ bool disable_expand_all = !has_collapsed_folders(mFavoritesInventoryPanel->getRootFolder())
+ && !has_collapsed_folders(mLandmarksInventoryPanel->getRootFolder())
+ && !has_collapsed_folders(mMyInventoryPanel->getRootFolder())
+ && !has_collapsed_folders(mLibraryInventoryPanel->getRootFolder());
+ if (disable_expand_all)
+ {
+ for (accordion_tabs_t::const_iterator iter = mAccordionTabs.begin(); iter != mAccordionTabs.end(); ++iter)
+ {
+ if (!(*iter)->isExpanded())
+ {
+ disable_expand_all = false;
+ break;
+ }
+ }
+ }
- // disable some commands for Favorites accordion. EXT-1758
- if (mCurrentSelectedList == mFavoritesInventoryPanel)
+ return !disable_expand_all;
+ }
+ else if ("sort_by_date" == command_name)
{
- if ( "expand_all" == command_name
- || "collapse_all" == command_name
- || "sort_by_date" == command_name
- )
+ // disable "sort_by_date" for Favorites accordion because
+ // it has its own items order. EXT-1758
+ if (mCurrentSelectedList == mFavoritesInventoryPanel)
+ {
return false;
+ }
}
-
- LLCheckFolderState checker;
- rootFolderView->applyFunctorRecursively(checker);
-
- // We assume that the root folder is always expanded so we enable "collapse_all"
- // command when we have at least one more expanded folder.
- if (checker.getExpandedFolders() < 2 && "collapse_all" == command_name)
+ else if ( "paste" == command_name
+ || "cut" == command_name
+ || "copy" == command_name
+ || "delete" == command_name
+ || "collapse" == command_name
+ || "expand" == command_name
+ )
{
- return false;
+ return canSelectedBeModified(command_name);
}
-
- if (checker.getCollapsedFolders() < 1 && "expand_all" == command_name)
+ else if ( "teleport" == command_name
+ || "more_info" == command_name
+ || "show_on_map" == command_name
+ || "copy_slurl" == command_name
+ )
{
- return false;
+ // disable some commands for multi-selection. EXT-1757
+ return root_folder_view && root_folder_view->getSelectedCount() == 1;
}
-
- if("category" == command_name)
+ else if ("rename" == command_name)
+ {
+ return root_folder_view && root_folder_view->getSelectedCount() == 1 && canSelectedBeModified(command_name);
+ }
+ else if("category" == command_name)
{
// we can add folder only in Landmarks Accordion
if (mCurrentSelectedList == mLandmarksInventoryPanel)
@@ -855,18 +990,18 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const
// ... but except Received folder
return !isReceivedFolderSelected();
}
- else return false;
- }
- else if("paste" == command_name || "rename" == command_name || "cut" == command_name || "delete" == command_name)
- {
- return canSelectedBeModified(command_name);
+ //"Add a folder" is enabled by default (case when My Landmarks is empty)
+ else return true;
}
else if("create_pick" == command_name)
{
- std::set<LLUUID> selection;
- if ( mCurrentSelectedList && mCurrentSelectedList->getRootFolder()->getSelectionList(selection) )
+ if (mCurrentSelectedList)
{
- return ( 1 == selection.size() && !LLAgentPicksInfo::getInstance()->isPickLimitReached() );
+ std::set<LLUUID> selection = mCurrentSelectedList->getRootFolder()->getSelectionList();
+ if (!selection.empty())
+ {
+ return ( 1 == selection.size() && !LLAgentPicksInfo::getInstance()->isPickLimitReached() );
+ }
}
return false;
}
@@ -880,13 +1015,10 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const
void LLLandmarksPanel::onCustomAction(const LLSD& userdata)
{
- LLFolderViewItem* cur_item = getCurSelectedItem();
- if(!cur_item)
- return;
std::string command_name = userdata.asString();
if("more_info" == command_name)
{
- cur_item->getListener()->performAction(mCurrentSelectedList->getRootFolder(),mCurrentSelectedList->getModel(),"about");
+ onShowProfile();
}
else if ("teleport" == command_name)
{
@@ -918,6 +1050,9 @@ bool LLLandmarksPanel::canSelectedBeModified(const std::string& command_name) co
{
// validate own rules first
+ LLFolderViewItem* selected = getCurSelectedItem();
+ if (!selected) return false;
+
// nothing can be modified in Library
if (mLibraryInventoryPanel == mCurrentSelectedList) return false;
@@ -944,24 +1079,41 @@ bool LLLandmarksPanel::canSelectedBeModified(const std::string& command_name) co
}
// then ask LLFolderView permissions
+
+ LLFolderView* root_folder = mCurrentSelectedList->getRootFolder();
+
+ if ("copy" == command_name)
+ {
+ return root_folder->canCopy();
+ }
+ else if ("collapse" == command_name)
+ {
+ return selected->isOpen();
+ }
+ else if ("expand" == command_name)
+ {
+ return !selected->isOpen();
+ }
+
if (can_be_modified)
{
- LLFolderViewItem* selected = getCurSelectedItem();
+ LLFolderViewEventListener* listenerp = selected->getListener();
+
if ("cut" == command_name)
{
- can_be_modified = mCurrentSelectedList->getRootFolder()->canCut();
+ can_be_modified = root_folder->canCut();
}
else if ("rename" == command_name)
{
- can_be_modified = selected ? selected->getListener()->isItemRenameable() : false;
+ can_be_modified = listenerp ? listenerp->isItemRenameable() : false;
}
else if ("delete" == command_name)
{
- can_be_modified = selected ? selected->getListener()->isItemRemovable(): false;
+ can_be_modified = listenerp ? listenerp->isItemRemovable() && !listenerp->isItemInTrash() : false;
}
else if("paste" == command_name)
{
- return mCurrentSelectedList->getRootFolder()->canPaste();
+ can_be_modified = root_folder->canPaste();
}
else
{
@@ -983,7 +1135,7 @@ void LLLandmarksPanel::onPickPanelExit( LLPanelPickEdit* pick_panel, LLView* own
pick_panel = NULL;
}
-bool LLLandmarksPanel::handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept)
+bool LLLandmarksPanel::handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, void* cargo_data , EAcceptance* accept)
{
*accept = ACCEPT_NO;
@@ -999,7 +1151,21 @@ bool LLLandmarksPanel::handleDragAndDropToTrash(BOOL drop, EDragAndDropType carg
if (is_enabled && drop)
{
- onClipboardAction("delete");
+ // don't call onClipboardAction("delete")
+ // this lead to removing (N * 2 - 1) items if drag N>1 items into trash. EXT-6757
+ // So, let remove items one by one.
+ LLInventoryItem* item = static_cast<LLInventoryItem*>(cargo_data);
+ if (item)
+ {
+ LLFolderViewItem* fv_item = (mCurrentSelectedList && mCurrentSelectedList->getRootFolder()) ?
+ mCurrentSelectedList->getRootFolder()->getItemByID(item->getUUID()) : NULL;
+
+ if (fv_item)
+ {
+ // is Item Removable checked inside of remove()
+ fv_item->remove();
+ }
+ }
}
}
break;
@@ -1145,4 +1311,54 @@ static bool category_has_descendents(LLPlacesInventoryPanel* inventory_list)
return false;
}
+
+static void collapse_all_folders(LLFolderView* root_folder)
+{
+ if (!root_folder)
+ return;
+
+ root_folder->setOpenArrangeRecursively(FALSE, LLFolderViewFolder::RECURSE_DOWN);
+
+ // The top level folder is invisible, it must be open to
+ // display its sub-folders.
+ root_folder->openTopLevelFolders();
+ root_folder->arrangeAll();
+}
+
+static void expand_all_folders(LLFolderView* root_folder)
+{
+ if (!root_folder)
+ return;
+
+ root_folder->setOpenArrangeRecursively(TRUE, LLFolderViewFolder::RECURSE_DOWN);
+ root_folder->arrangeAll();
+}
+
+static bool has_expanded_folders(LLFolderView* root_folder)
+{
+ LLCheckFolderState checker;
+ root_folder->applyFunctorRecursively(checker);
+
+ // We assume that the root folder is always expanded so we enable "collapse_all"
+ // command when we have at least one more expanded folder.
+ if (checker.getExpandedFolders() < 2)
+ {
+ return false;
+ }
+
+ return true;
+}
+
+static bool has_collapsed_folders(LLFolderView* root_folder)
+{
+ LLCheckFolderState checker;
+ root_folder->applyFunctorRecursively(checker);
+
+ if (checker.getCollapsedFolders() < 1)
+ {
+ return false;
+ }
+
+ return true;
+}
// EOF
diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h
index cbbd10ac26..0e70c72f11 100644
--- a/indra/newview/llpanellandmarks.h
+++ b/indra/newview/llpanellandmarks.h
@@ -57,8 +57,10 @@ public:
/*virtual*/ BOOL postBuild();
/*virtual*/ void onSearchEdit(const std::string& string);
/*virtual*/ void onShowOnMap();
+ /*virtual*/ void onShowProfile();
/*virtual*/ void onTeleport();
/*virtual*/ void updateVerbs();
+ /*virtual*/ bool isSingleItemSelected();
void onSelectionChange(LLPlacesInventoryPanel* inventory_list, const std::deque<LLFolderViewItem*> &items, BOOL user_action);
void onSelectorButtonClicked();
@@ -78,6 +80,8 @@ public:
*/
void setItemSelected(const LLUUID& obj_id, BOOL take_keyboard_focus);
+ LLPlacesInventoryPanel* getLibraryInventoryPanel() { return mLibraryInventoryPanel; }
+
protected:
/**
* @return true - if current selected panel is not null and selected item is a landmark
@@ -110,7 +114,7 @@ private:
void initMyInventoryPanel();
void initLibraryInventoryPanel();
void initLandmarksPanel(LLPlacesInventoryPanel* inventory_list);
- void initAccordion(const std::string& accordion_tab_name, LLPlacesInventoryPanel* inventory_list, bool expand_tab);
+ LLAccordionCtrlTab* initAccordion(const std::string& accordion_tab_name, LLPlacesInventoryPanel* inventory_list, bool expand_tab);
void onAccordionExpandedCollapsed(const LLSD& param, LLPlacesInventoryPanel* inventory_list);
void deselectOtherThan(const LLPlacesInventoryPanel* inventory_list);
@@ -119,7 +123,6 @@ private:
void updateListCommands();
void onActionsButtonClick();
void showActionMenu(LLMenuGL* menu, std::string spawning_view_name);
- void onAddButtonHeldDown();
void onTrashButtonClick() const;
void onAddAction(const LLSD& command_name) const;
void onClipboardAction(const LLSD& command_name) const;
@@ -140,7 +143,7 @@ private:
/**
* Processes drag-n-drop of the Landmarks and folders into trash button.
*/
- bool handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept);
+ bool handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, void* cargo_data, EAcceptance* accept);
/**
* Landmark actions callbacks. Fire when a landmark is loaded from the list.
@@ -153,21 +156,22 @@ private:
void doCreatePick(LLLandmark* landmark);
private:
- LLPlacesInventoryPanel* mFavoritesInventoryPanel;
- LLPlacesInventoryPanel* mLandmarksInventoryPanel;
- LLPlacesInventoryPanel* mMyInventoryPanel;
- LLPlacesInventoryPanel* mLibraryInventoryPanel;
+ LLPlacesInventoryPanel* mFavoritesInventoryPanel;
+ LLPlacesInventoryPanel* mLandmarksInventoryPanel;
+ LLPlacesInventoryPanel* mMyInventoryPanel;
+ LLPlacesInventoryPanel* mLibraryInventoryPanel;
LLMenuGL* mGearLandmarkMenu;
LLMenuGL* mGearFolderMenu;
LLMenuGL* mMenuAdd;
- LLPlacesInventoryPanel* mCurrentSelectedList;
+ LLPlacesInventoryPanel* mCurrentSelectedList;
LLInventoryObserver* mInventoryObserver;
LLPanel* mListCommands;
- bool mSortByDate;
typedef std::vector<LLAccordionCtrlTab*> accordion_tabs_t;
accordion_tabs_t mAccordionTabs;
+
+ LLAccordionCtrlTab* mMyLandmarksAccordionTab;
};
#endif //LL_LLPANELLANDMARKS_H
diff --git a/indra/newview/llpanellandmedia.cpp b/indra/newview/llpanellandmedia.cpp
index 42ad9820a8..e834e229cd 100644
--- a/indra/newview/llpanellandmedia.cpp
+++ b/indra/newview/llpanellandmedia.cpp
@@ -153,7 +153,7 @@ void LLPanelLandMedia::refresh()
std::string mime_type = parcel->getMediaType();
if (mime_type.empty())
{
- mime_type = "none/none";
+ mime_type = LLMIMETypes::getDefaultMimeTypeTranslation();
}
setMediaType(mime_type);
mMediaTypeCombo->setEnabled( can_change_media );
@@ -218,7 +218,7 @@ void LLPanelLandMedia::refresh()
void LLPanelLandMedia::populateMIMECombo()
{
- std::string default_mime_type = "none/none";
+ std::string default_mime_type = LLMIMETypes::getDefaultMimeType();
std::string default_label;
LLMIMETypes::mime_widget_set_map_t::const_iterator it;
for (it = LLMIMETypes::sWidgetMap.begin(); it != LLMIMETypes::sWidgetMap.end(); ++it)
@@ -235,8 +235,7 @@ void LLPanelLandMedia::populateMIMECombo()
mMediaTypeCombo->add(info.mLabel, mime_type);
}
}
- // *TODO: The sort order is based on std::map key, which is
- // ASCII-sorted and is wrong in other languages. TRANSLATE
+
mMediaTypeCombo->add( default_label, default_mime_type, ADD_BOTTOM );
}
@@ -248,7 +247,15 @@ void LLPanelLandMedia::setMediaType(const std::string& mime_type)
std::string media_key = LLMIMETypes::widgetType(mime_type);
mMediaTypeCombo->setValue(media_key);
- childSetText("mime_type", mime_type);
+
+ std::string mime_str = mime_type;
+ if(LLMIMETypes::getDefaultMimeType() == mime_type)
+ {
+ // Instead of showing predefined "none/none" we are going to show something
+ // localizable - "none" for example (see EXT-6542)
+ mime_str = LLMIMETypes::getDefaultMimeTypeTranslation();
+ }
+ childSetText("mime_type", mime_str);
}
void LLPanelLandMedia::setMediaURL(const std::string& media_url)
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index df9002facc..144839b554 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -51,11 +51,12 @@
#include "llfocusmgr.h"
#include "lllineeditor.h"
#include "llnotificationsutil.h"
+#include "llsecapi.h"
#include "llstartup.h"
#include "lltextbox.h"
#include "llui.h"
#include "lluiconstants.h"
-#include "llurlsimstring.h"
+#include "llslurl.h"
#include "llversioninfo.h"
#include "llviewerhelp.h"
#include "llviewertexturelist.h"
@@ -77,6 +78,7 @@
#pragma warning(disable: 4355) // 'this' used in initializer list
#endif // LL_WINDOWS
+#include "llsdserialize.h"
#define USE_VIEWER_AUTH 0
const S32 BLACK_BORDER_HEIGHT = 160;
@@ -104,7 +106,6 @@ public:
LLLoginRefreshHandler gLoginRefreshHandler;
-
// helper class that trys to download a URL from a web site and calls a method
// on parent class indicating if the web server is working or not
class LLIamHereLogin : public LLHTTPClient::Responder
@@ -153,10 +154,6 @@ namespace {
boost::intrusive_ptr< LLIamHereLogin > gResponsePtr = 0;
};
-void set_start_location(LLUICtrl* ctrl, void* data)
-{
- LLURLSimString::setString(ctrl->getValue().asString());
-}
//---------------------------------------------------------------------------
// Public methods
@@ -187,6 +184,7 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
delete LLPanelLogin::sInstance;
}
+ mPasswordModified = FALSE;
LLPanelLogin::sInstance = this;
// add to front so we are the bottom-most child
@@ -213,41 +211,27 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
}
#if !USE_VIEWER_AUTH
- childSetPrevalidate("first_name_edit", LLLineEditor::prevalidateASCIIPrintableNoSpace);
- childSetPrevalidate("last_name_edit", LLLineEditor::prevalidateASCIIPrintableNoSpace);
-
- childSetCommitCallback("password_edit", mungePassword, this);
+ childSetPrevalidate("username_edit", LLTextValidate::validateASCIIPrintableNoPipe);
getChild<LLLineEditor>("password_edit")->setKeystrokeCallback(onPassKey, this);
// change z sort of clickable text to be behind buttons
- sendChildToBack(getChildView("channel_text"));
+ //sendChildToBack(getChildView("channel_text"));
sendChildToBack(getChildView("forgot_password_text"));
LLLineEditor* edit = getChild<LLLineEditor>("password_edit");
if (edit) edit->setDrawAsterixes(TRUE);
- LLComboBox* combo = getChild<LLComboBox>("start_location_combo");
-
- std::string sim_string = LLURLSimString::sInstance.mSimString;
- if(sim_string.empty())
- {
- LLURLSimString::setString(gSavedSettings.getString("LoginLocation"));
- }
-
- if (!sim_string.empty())
+ if(LLStartUp::getStartSLURL().getType() != LLSLURL::LOCATION)
{
- // Replace "<Type region name>" with this region name
- combo->remove(2);
- combo->add( sim_string );
- combo->setTextEntry(sim_string);
- combo->setCurrentByIndex( 2 );
+ LLSLURL slurl(gSavedSettings.getString("LoginLocation"));
+ LLStartUp::setStartSLURL(slurl);
}
-
- combo->setCommitCallback( &set_start_location, NULL );
+ updateLocationCombo(false);
LLComboBox* server_choice_combo = sInstance->getChild<LLComboBox>("server_combo");
server_choice_combo->setCommitCallback(onSelectServer, NULL);
server_choice_combo->setFocusLostCallback(boost::bind(onServerComboLostFocus, _1));
+ updateServerCombo();
childSetAction("connect_btn", onClickConnect, this);
@@ -257,10 +241,10 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
std::string version = llformat("%s (%d)",
LLVersionInfo::getShortVersion().c_str(),
LLVersionInfo::getBuild());
- LLTextBox* channel_text = getChild<LLTextBox>("channel_text");
- channel_text->setTextArg("[CHANNEL]", channel); // though not displayed
- channel_text->setTextArg("[VERSION]", version);
- channel_text->setClickedCallback(onClickVersion, this);
+ //LLTextBox* channel_text = getChild<LLTextBox>("channel_text");
+ //channel_text->setTextArg("[CHANNEL]", channel); // though not displayed
+ //channel_text->setTextArg("[VERSION]", version);
+ //channel_text->setClickedCallback(onClickVersion, this);
LLTextBox* forgot_password_text = getChild<LLTextBox>("forgot_password_text");
forgot_password_text->setClickedCallback(onClickForgotPassword, NULL);
@@ -286,34 +270,14 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
web_browser->setTabStop(FALSE);
// web_browser->navigateToLocalPage( "loading", "loading.html" );
- if (gSavedSettings.getBOOL("RegInClient"))
- {
- // need to follow links in the internal browser
- web_browser->setOpenInExternalBrowser( false );
-
- getChild<LLView>("login_widgets")->setVisible(false);
- }
- else
- {
- // make links open in external browser
- web_browser->setOpenInExternalBrowser( true );
-
- reshapeBrowser();
- }
+ reshapeBrowser();
// kick off a request to grab the url manually
gResponsePtr = LLIamHereLogin::build( this );
- std::string login_page = gSavedSettings.getString("LoginPage");
- if (login_page.empty())
- {
- login_page = getString( "real_url" );
- }
- LLHTTPClient::head( login_page, gResponsePtr );
-#if !USE_VIEWER_AUTH
- // Initialize visibility (and don't force visibility - use prefs)
- refreshLocation( false );
-#endif
+ LLHTTPClient::head( LLGridManager::getInstance()->getLoginPage(), gResponsePtr );
+
+ updateLocationCombo(false);
}
@@ -377,21 +341,6 @@ void LLPanelLogin::setSiteIsAlive( bool alive )
}
}
-void LLPanelLogin::mungePassword(LLUICtrl* caller, void* user_data)
-{
- LLPanelLogin* self = (LLPanelLogin*)user_data;
- LLLineEditor* editor = (LLLineEditor*)caller;
- std::string password = editor->getText();
-
- // Re-md5 if we've changed at all
- if (password != self->mIncomingPassword)
- {
- LLMD5 pass((unsigned char *)password.c_str());
- char munged_password[MD5HEX_STR_SIZE];
- pass.hex_digest(munged_password);
- self->mMungedPassword = munged_password;
- }
-}
LLPanelLogin::~LLPanelLogin()
{
@@ -454,12 +403,6 @@ void LLPanelLogin::draw()
// virtual
BOOL LLPanelLogin::handleKeyHere(KEY key, MASK mask)
{
- if (( KEY_RETURN == key ) && (MASK_ALT == mask))
- {
- gViewerWindow->toggleFullscreen(FALSE);
- return TRUE;
- }
-
if ( KEY_F1 == key )
{
LLViewerHelp* vhelp = LLViewerHelp::getInstance();
@@ -498,14 +441,14 @@ void LLPanelLogin::giveFocus()
if( sInstance )
{
// Grab focus and move cursor to first blank input field
- std::string first = sInstance->childGetText("first_name_edit");
+ std::string username = sInstance->childGetText("username_edit");
std::string pass = sInstance->childGetText("password_edit");
- BOOL have_first = !first.empty();
+ BOOL have_username = !username.empty();
BOOL have_pass = !pass.empty();
LLLineEditor* edit = NULL;
- if (have_first && !have_pass)
+ if (have_username && !have_pass)
{
// User saved his name but not his password. Move
// focus to password field.
@@ -514,7 +457,7 @@ void LLPanelLogin::giveFocus()
else
{
// User doesn't have a name, so start there.
- edit = sInstance->getChild<LLLineEditor>("first_name_edit");
+ edit = sInstance->getChild<LLLineEditor>("username_edit");
}
if (edit)
@@ -531,13 +474,12 @@ void LLPanelLogin::showLoginWidgets()
{
sInstance->childSetVisible("login_widgets", true);
LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
- web_browser->setOpenInExternalBrowser( true );
sInstance->reshapeBrowser();
// *TODO: Append all the usual login parameters, like first_login=Y etc.
std::string splash_screen_url = sInstance->getString("real_url");
web_browser->navigateTo( splash_screen_url, "text/html" );
- LLUICtrl* first_name_edit = sInstance->getChild<LLUICtrl>("first_name_edit");
- first_name_edit->setFocus(TRUE);
+ LLUICtrl* username_edit = sInstance->getChild<LLUICtrl>("username_edit");
+ username_edit->setFocus(TRUE);
}
// static
@@ -559,77 +501,127 @@ void LLPanelLogin::show(const LLRect &rect,
}
// static
-void LLPanelLogin::setFields(const std::string& firstname,
- const std::string& lastname,
- const std::string& password)
+void LLPanelLogin::setFields(LLPointer<LLCredential> credential,
+ BOOL remember)
{
if (!sInstance)
{
llwarns << "Attempted fillFields with no login view shown" << llendl;
return;
}
+ LL_INFOS("Credentials") << "Setting login fields to " << *credential << LL_ENDL;
- sInstance->childSetText("first_name_edit", firstname);
- sInstance->childSetText("last_name_edit", lastname);
-
- // Max "actual" password length is 16 characters.
- // Hex digests are always 32 characters.
- if (password.length() == 32)
+ LLSD identifier = credential->getIdentifier();
+ if((std::string)identifier["type"] == "agent")
+ {
+ sInstance->childSetText("username_edit", (std::string)identifier["first_name"] + " " +
+ (std::string)identifier["last_name"]);
+ }
+ else if((std::string)identifier["type"] == "account")
+ {
+ sInstance->childSetText("username_edit", (std::string)identifier["account_name"]);
+ }
+ else
+ {
+ sInstance->childSetText("username_edit", std::string());
+ }
+ // if the password exists in the credential, set the password field with
+ // a filler to get some stars
+ LLSD authenticator = credential->getAuthenticator();
+ LL_INFOS("Credentials") << "Setting authenticator field " << authenticator["type"].asString() << LL_ENDL;
+ if(authenticator.isMap() &&
+ authenticator.has("secret") &&
+ (authenticator["secret"].asString().size() > 0))
{
+
// This is a MD5 hex digest of a password.
// We don't actually use the password input field,
// fill it with MAX_PASSWORD characters so we get a
// nice row of asterixes.
const std::string filler("123456789!123456");
- sInstance->childSetText("password_edit", filler);
- sInstance->mIncomingPassword = filler;
- sInstance->mMungedPassword = password;
+ sInstance->childSetText("password_edit", std::string("123456789!123456"));
}
else
{
- // this is a normal text password
- sInstance->childSetText("password_edit", password);
- sInstance->mIncomingPassword = password;
- LLMD5 pass((unsigned char *)password.c_str());
- char munged_password[MD5HEX_STR_SIZE];
- pass.hex_digest(munged_password);
- sInstance->mMungedPassword = munged_password;
+ sInstance->childSetText("password_edit", std::string());
}
+ sInstance->childSetValue("remember_check", remember);
}
// static
-void LLPanelLogin::addServer(const std::string& server, S32 domain_name)
+void LLPanelLogin::getFields(LLPointer<LLCredential>& credential,
+ BOOL& remember)
{
if (!sInstance)
{
- llwarns << "Attempted addServer with no login view shown" << llendl;
+ llwarns << "Attempted getFields with no login view shown" << llendl;
return;
}
+
+ // load the credential so we can pass back the stored password or hash if the user did
+ // not modify the password field.
+
+ credential = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());
- LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo");
- combo->add(server, LLSD(domain_name) );
- combo->setCurrentByIndex(0);
-}
-
-// static
-void LLPanelLogin::getFields(std::string *firstname,
- std::string *lastname,
- std::string *password)
-{
- if (!sInstance)
+ LLSD identifier = LLSD::emptyMap();
+ LLSD authenticator = LLSD::emptyMap();
+
+ if(credential.notNull())
{
- llwarns << "Attempted getFields with no login view shown" << llendl;
- return;
+ authenticator = credential->getAuthenticator();
}
- *firstname = sInstance->childGetText("first_name_edit");
- LLStringUtil::trim(*firstname);
-
- *lastname = sInstance->childGetText("last_name_edit");
- LLStringUtil::trim(*lastname);
+ std::string username = sInstance->childGetText("username_edit");
+ LLStringUtil::trim(username);
+ std::string password = sInstance->childGetText("password_edit");
- *password = sInstance->mMungedPassword;
+ LL_INFOS2("Credentials", "Authentication") << "retrieving username:" << username << LL_ENDL;
+ // determine if the username is a first/last form or not.
+ size_t separator_index = username.find_first_of(' ');
+ if (separator_index == username.npos)
+ {
+ LL_INFOS2("Credentials", "Authentication") << "account: " << username << LL_ENDL;
+ // single username, so this is a 'clear' identifier
+ identifier["type"] = CRED_IDENTIFIER_TYPE_ACCOUNT;
+ identifier["account_name"] = username;
+
+ if (LLPanelLogin::sInstance->mPasswordModified)
+ {
+ authenticator = LLSD::emptyMap();
+ // password is plaintext
+ authenticator["type"] = CRED_AUTHENTICATOR_TYPE_CLEAR;
+ authenticator["secret"] = password;
+ }
+ }
+ else
+ {
+ std::string first = username.substr(0, separator_index);
+ std::string last = username.substr(separator_index, username.npos);
+ LLStringUtil::trim(last);
+
+ if (last.find_first_of(' ') == last.npos)
+ {
+ LL_INFOS2("Credentials", "Authentication") << "agent: " << username << LL_ENDL;
+ // traditional firstname / lastname
+ identifier["type"] = CRED_IDENTIFIER_TYPE_AGENT;
+ identifier["first_name"] = first;
+ identifier["last_name"] = last;
+
+ if (LLPanelLogin::sInstance->mPasswordModified)
+ {
+ authenticator = LLSD::emptyMap();
+ authenticator["type"] = CRED_AUTHENTICATOR_TYPE_HASH;
+ authenticator["algorithm"] = "md5";
+ LLMD5 pass((const U8 *)password.c_str());
+ char md5pass[33]; /* Flawfinder: ignore */
+ pass.hex_digest(md5pass);
+ authenticator["secret"] = md5pass;
+ }
+ }
+ }
+ credential = gSecAPIHandler->createCredential(LLGridManager::getInstance()->getGrid(), identifier, authenticator);
+ remember = sInstance->childGetValue("remember_check");
}
// static
@@ -649,62 +641,112 @@ BOOL LLPanelLogin::isGridComboDirty()
}
// static
-void LLPanelLogin::getLocation(std::string &location)
+BOOL LLPanelLogin::areCredentialFieldsDirty()
{
if (!sInstance)
{
- llwarns << "Attempted getLocation with no login view shown" << llendl;
- return;
+ llwarns << "Attempted getServer with no login view shown" << llendl;
}
-
- LLComboBox* combo = sInstance->getChild<LLComboBox>("start_location_combo");
- location = combo->getValue().asString();
+ else
+ {
+ std::string username = sInstance->childGetText("username_edit");
+ LLStringUtil::trim(username);
+ std::string password = sInstance->childGetText("password_edit");
+ LLLineEditor* ctrl = sInstance->getChild<LLLineEditor>("username_edit");
+ if(ctrl && ctrl->isDirty())
+ {
+ return true;
+ }
+ ctrl = sInstance->getChild<LLLineEditor>("password_edit");
+ if(ctrl && ctrl->isDirty())
+ {
+ return true;
+ }
+ }
+ return false;
}
+
// static
-void LLPanelLogin::refreshLocation( bool force_visible )
+void LLPanelLogin::updateLocationCombo( bool force_visible )
{
- if (!sInstance) return;
-
-#if USE_VIEWER_AUTH
- loadLoginPage();
-#else
- BOOL show_start = TRUE;
-
- if ( ! force_visible )
+ if (!sInstance)
+ {
+ return;
+ }
+
+ LLComboBox* combo = sInstance->getChild<LLComboBox>("start_location_combo");
+
+ switch(LLStartUp::getStartSLURL().getType())
{
- // Don't show on first run after install
- // Otherwise ShowStartLocation defaults to true.
- show_start = gSavedSettings.getBOOL("ShowStartLocation")
- && gSavedSettings.getBOOL("HadFirstSuccessfulLogin");
+ case LLSLURL::LOCATION:
+ {
+
+ combo->setCurrentByIndex( 2 );
+ combo->setTextEntry(LLStartUp::getStartSLURL().getLocationString());
+ break;
+ }
+ case LLSLURL::HOME_LOCATION:
+ combo->setCurrentByIndex(1);
+ break;
+ default:
+ combo->setCurrentByIndex(0);
+ break;
}
-
+
+ BOOL show_start = TRUE;
+
+ if ( ! force_visible )
+ show_start = gSavedSettings.getBOOL("ShowStartLocation");
+
sInstance->childSetVisible("start_location_combo", show_start);
sInstance->childSetVisible("start_location_text", show_start);
-
+
BOOL show_server = gSavedSettings.getBOOL("ForceShowGrid");
+ sInstance->childSetVisible("server_combo_text", show_server);
sInstance->childSetVisible("server_combo", show_server);
-
-#endif
}
// static
-void LLPanelLogin::updateLocationUI()
+void LLPanelLogin::updateStartSLURL()
{
if (!sInstance) return;
- std::string sim_string = LLURLSimString::sInstance.mSimString;
- if (!sim_string.empty())
+ LLComboBox* combo = sInstance->getChild<LLComboBox>("start_location_combo");
+ S32 index = combo->getCurrentIndex();
+
+ switch (index)
{
- // Replace "<Type region name>" with this region name
- LLComboBox* combo = sInstance->getChild<LLComboBox>("start_location_combo");
- combo->remove(2);
- combo->add( sim_string );
- combo->setTextEntry(sim_string);
- combo->setCurrentByIndex( 2 );
+ case 0:
+ {
+ LLStartUp::setStartSLURL(LLSLURL(LLSLURL::SIM_LOCATION_LAST));
+ break;
+ }
+ case 1:
+ {
+ LLStartUp::setStartSLURL(LLSLURL(LLSLURL::SIM_LOCATION_HOME));
+ break;
+ }
+ default:
+ {
+ LLSLURL slurl = LLSLURL(combo->getValue().asString());
+ if(slurl.getType() == LLSLURL::LOCATION)
+ {
+ // we've changed the grid, so update the grid selection
+ LLStartUp::setStartSLURL(slurl);
+ }
+ break;
+ }
}
}
+
+void LLPanelLogin::setLocation(const LLSLURL& slurl)
+{
+ LLStartUp::setStartSLURL(slurl);
+ updateServer();
+}
+
// static
void LLPanelLogin::closePanel()
{
@@ -738,15 +780,13 @@ void LLPanelLogin::loadLoginPage()
std::ostringstream oStr;
- std::string login_page = gSavedSettings.getString("LoginPage");
- if (login_page.empty())
- {
- login_page = sInstance->getString( "real_url" );
- }
+ std::string login_page = LLGridManager::getInstance()->getLoginPage();
+
oStr << login_page;
// Use the right delimeter depending on how LLURI parses the URL
LLURI login_page_uri = LLURI(login_page);
+
std::string first_query_delimiter = "&";
if (login_page_uri.queryMap().size() == 0)
{
@@ -778,11 +818,10 @@ void LLPanelLogin::loadLoginPage()
curl_free(curl_version);
// Grid
- char* curl_grid = curl_escape(LLViewerLogin::getInstance()->getGridLabel().c_str(), 0);
+ char* curl_grid = curl_escape(LLGridManager::getInstance()->getGridLoginID().c_str(), 0);
oStr << "&grid=" << curl_grid;
curl_free(curl_grid);
-
- gViewerWindow->setMenuBackgroundColor(false, !LLViewerLogin::getInstance()->isInProductionGrid());
+ gViewerWindow->setMenuBackgroundColor(false, !LLGridManager::getInstance()->isInProductionGrid());
gLoginMenuBarView->setBackgroundColor(gMenuBarView->getBackgroundColor());
@@ -807,30 +846,20 @@ void LLPanelLogin::loadLoginPage()
location = gSavedSettings.getString("LoginLocation");
}
- std::string firstname, lastname;
+ std::string username;
if(gSavedSettings.getLLSD("UserLoginInfo").size() == 3)
{
LLSD cmd_line_login = gSavedSettings.getLLSD("UserLoginInfo");
- firstname = cmd_line_login[0].asString();
- lastname = cmd_line_login[1].asString();
+ username = cmd_line_login[0].asString() + " " + cmd_line_login[1];
password = cmd_line_login[2].asString();
}
- if (firstname.empty())
- {
- firstname = gSavedSettings.getString("FirstName");
- }
-
- if (lastname.empty())
- {
- lastname = gSavedSettings.getString("LastName");
- }
char* curl_region = curl_escape(region.c_str(), 0);
- oStr <<"firstname=" << firstname <<
- "&lastname=" << lastname << "&location=" << location << "&region=" << curl_region;
+ oStr <<"username=" << username <<
+ "&location=" << location << "&region=" << curl_region;
curl_free(curl_region);
@@ -846,8 +875,7 @@ void LLPanelLogin::loadLoginPage()
{
oStr << "&auto_login=TRUE";
}
- if (gSavedSettings.getBOOL("ShowStartLocation")
- && gSavedSettings.getBOOL("HadFirstSuccessfulLogin"))
+ if (gSavedSettings.getBOOL("ShowStartLocation"))
{
oStr << "&show_start_location=TRUE";
}
@@ -864,7 +892,7 @@ void LLPanelLogin::loadLoginPage()
#endif
LLMediaCtrl* web_browser = sInstance->getChild<LLMediaCtrl>("login_html");
-
+
// navigate to the "real" page
if (gSavedSettings.getBOOL("RegInClient"))
{
@@ -913,39 +941,66 @@ void LLPanelLogin::onClickConnect(void *)
// JC - Make sure the fields all get committed.
sInstance->setFocus(FALSE);
- std::string first = sInstance->childGetText("first_name_edit");
- std::string last = sInstance->childGetText("last_name_edit");
- LLComboBox* combo = sInstance->getChild<LLComboBox>("start_location_combo");
- std::string combo_text = combo->getSimple();
-
- bool has_first_and_last = !(first.empty() || last.empty());
- bool has_location = false;
-
- if(combo_text=="<Type region name>" || combo_text =="")
+ LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo");
+ LLSD combo_val = combo->getSelectedValue();
+ if (combo_val.isUndefined())
{
- // *NOTE: Mani - Location field is not always committed by this point!
- // This may be duplicate work, but better than not doing the work!
- LLURLSimString::sInstance.setString("");
+ combo_val = combo->getValue();
}
- else
+ if(combo_val.isUndefined())
{
- // *NOTE: Mani - Location field is not always committed by this point!
- LLURLSimString::sInstance.setString(combo_text);
- has_location = true;
+ LLNotificationsUtil::add("StartRegionEmpty");
+ return;
+ }
+ try
+ {
+ LLGridManager::getInstance()->setGridChoice(combo_val.asString());
}
-
- if(!has_first_and_last)
+ catch (LLInvalidGridName ex)
{
- LLNotificationsUtil::add("MustHaveAccountToLogIn");
+ LLSD args;
+ args["GRID"] = combo_val.asString();
+ LLNotificationsUtil::add("InvalidGrid", args);
+ return;
}
- else if(!has_location)
+ updateStartSLURL();
+ std::string username = sInstance->childGetText("username_edit");
+
+
+ if(username.empty())
{
- LLNotificationsUtil::add("StartRegionEmpty");
+ // user must type in something into the username field
+ LLNotificationsUtil::add("MustHaveAccountToLogIn");
}
else
{
- // has both first and last name typed
- sInstance->mCallback(0, sInstance->mCallbackData);
+ LLPointer<LLCredential> cred;
+ BOOL remember;
+ getFields(cred, remember);
+ std::string identifier_type;
+ cred->identifierType(identifier_type);
+ LLSD allowed_credential_types;
+ LLGridManager::getInstance()->getLoginIdentifierTypes(allowed_credential_types);
+
+ // check the typed in credential type against the credential types expected by the server.
+ for(LLSD::array_iterator i = allowed_credential_types.beginArray();
+ i != allowed_credential_types.endArray();
+ i++)
+ {
+
+ if(i->asString() == identifier_type)
+ {
+ // yay correct credential type
+ sInstance->mCallback(0, sInstance->mCallbackData);
+ return;
+ }
+ }
+
+ // Right now, maingrid is the only thing that is picky about
+ // credential format, as it doesn't yet allow account (single username)
+ // format creds. - Rox. James, we wanna fix the message when we change
+ // this.
+ LLNotificationsUtil::add("InvalidCredentialFormat");
}
}
}
@@ -1003,66 +1058,105 @@ void LLPanelLogin::onClickHelp(void*)
// static
void LLPanelLogin::onPassKey(LLLineEditor* caller, void* user_data)
{
+ LLPanelLogin *This = (LLPanelLogin *) user_data;
+ This->mPasswordModified = TRUE;
if (gKeyboard->getKeyDown(KEY_CAPSLOCK) && sCapslockDidNotification == FALSE)
{
- LLNotificationsUtil::add("CapsKeyOn");
+// *TODO: use another way to notify user about enabled caps lock, see EXT-6858
sCapslockDidNotification = TRUE;
}
}
-// static
-void LLPanelLogin::onSelectServer(LLUICtrl*, void*)
-{
- // *NOTE: The paramters for this method are ignored.
- // LLPanelLogin::onServerComboLostFocus(LLFocusableElement* fe, void*)
- // calls this method.
- // The user twiddled with the grid choice ui.
- // apply the selection to the grid setting.
- std::string grid_label;
- S32 grid_index;
-
- LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo");
- LLSD combo_val = combo->getValue();
-
- if (LLSD::TypeInteger == combo_val.type())
+void LLPanelLogin::updateServer()
+{
+ try
{
- grid_index = combo->getValue().asInteger();
- if ((S32)GRID_INFO_OTHER == grid_index)
+ updateServerCombo();
+ // if they've selected another grid, we should load the credentials
+ // for that grid and set them to the UI.
+ if(sInstance && !sInstance->areCredentialFieldsDirty())
{
- // This happens if the user specifies a custom grid
- // via command line.
- grid_label = combo->getSimple();
+ LLPointer<LLCredential> credential = gSecAPIHandler->loadCredential(LLGridManager::getInstance()->getGrid());
+ bool remember = sInstance->childGetValue("remember_check");
+ sInstance->setFields(credential, remember);
}
+ // grid changed so show new splash screen (possibly)
+ loadLoginPage();
+ updateLocationCombo(LLStartUp::getStartSLURL().getType() == LLSLURL::LOCATION);
}
- else
+ catch (LLInvalidGridName ex)
{
- // no valid selection, return other
- grid_index = (S32)GRID_INFO_OTHER;
- grid_label = combo_val.asString();
+ // do nothing
}
+}
- // This new seelction will override preset uris
- // from the command line.
- LLViewerLogin* vl = LLViewerLogin::getInstance();
- vl->resetURIs();
- if(grid_index != GRID_INFO_OTHER)
+void LLPanelLogin::updateServerCombo()
+{
+ if (!sInstance)
{
- vl->setGridChoice((EGridInfo)grid_index);
+ return;
}
- else
+ // We add all of the possible values, sorted, and then add a bar and the current value at the top
+ LLComboBox* server_choice_combo = sInstance->getChild<LLComboBox>("server_combo");
+ server_choice_combo->removeall();
+
+ std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids(!gSavedSettings.getBOOL("ShowBetaGrids"));
+
+ for (std::map<std::string, std::string>::iterator grid_choice = known_grids.begin();
+ grid_choice != known_grids.end();
+ grid_choice++)
{
- vl->setGridChoice(grid_label);
+ if (!grid_choice->first.empty())
+ {
+ server_choice_combo->add(grid_choice->second, grid_choice->first, ADD_SORTED);
+ }
}
+
+ server_choice_combo->addSeparator(ADD_TOP);
+
+ server_choice_combo->add(LLGridManager::getInstance()->getGridLabel(),
+ LLGridManager::getInstance()->getGrid(), ADD_TOP);
+
+ server_choice_combo->selectFirstItem();
+}
- // grid changed so show new splash screen (possibly)
- loadLoginPage();
+// static
+void LLPanelLogin::onSelectServer(LLUICtrl*, void*)
+{
+ // *NOTE: The paramters for this method are ignored.
+ // LLPanelLogin::onServerComboLostFocus(LLFocusableElement* fe, void*)
+ // calls this method.
+ LL_INFOS("AppInit") << "onSelectServer" << LL_ENDL;
+ // The user twiddled with the grid choice ui.
+ // apply the selection to the grid setting.
+ LLPointer<LLCredential> credential;
+
+ LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo");
+ LLSD combo_val = combo->getSelectedValue();
+ if (combo_val.isUndefined())
+ {
+ combo_val = combo->getValue();
+ }
+
+ combo = sInstance->getChild<LLComboBox>("start_location_combo");
+ combo->setCurrentByIndex(1);
+ LLStartUp::setStartSLURL(LLSLURL(gSavedSettings.getString("LoginLocation")));
+ LLGridManager::getInstance()->setGridChoice(combo_val.asString());
+ // This new selection will override preset uris
+ // from the command line.
+ updateServer();
+ updateLocationCombo(false);
+ updateLoginPanelLinks();
}
void LLPanelLogin::onServerComboLostFocus(LLFocusableElement* fe)
{
- if (!sInstance) return;
+ if (!sInstance)
+ {
+ return;
+ }
LLComboBox* combo = sInstance->getChild<LLComboBox>("server_combo");
if(fe == combo)
@@ -1070,3 +1164,15 @@ void LLPanelLogin::onServerComboLostFocus(LLFocusableElement* fe)
onSelectServer(combo, NULL);
}
}
+
+void LLPanelLogin::updateLoginPanelLinks()
+{
+ LLSD grid_data;
+ LLGridManager::getInstance()->getGridInfo(grid_data);
+ bool system_grid = grid_data.has(GRID_IS_SYSTEM_GRID_VALUE);
+
+ // need to call through sInstance, as it's called from onSelectServer, which
+ // is static.
+ sInstance->childSetVisible("create_new_account_text", system_grid);
+ sInstance->childSetVisible("forgot_password_text", system_grid);
+}
diff --git a/indra/newview/llpanellogin.h b/indra/newview/llpanellogin.h
index 1fdc3a9361..aa6884ea97 100644
--- a/indra/newview/llpanellogin.h
+++ b/indra/newview/llpanellogin.h
@@ -41,6 +41,8 @@
class LLLineEditor;
class LLUIImage;
class LLPanelLoginListener;
+class LLSLURL;
+class LLCredential;
class LLPanelLogin:
public LLPanel,
@@ -65,20 +67,15 @@ public:
void (*callback)(S32 option, void* user_data),
void* callback_data);
- // Remember password checkbox is set via gSavedSettings "RememberPassword"
- static void setFields(const std::string& firstname, const std::string& lastname,
- const std::string& password);
+ static void setFields(LLPointer<LLCredential> credential, BOOL remember);
- static void addServer(const std::string& server, S32 domain_name);
- static void refreshLocation( bool force_visible );
- static void updateLocationUI();
-
- static void getFields(std::string *firstname, std::string *lastname,
- std::string *password);
+ static void getFields(LLPointer<LLCredential>& credential, BOOL& remember);
static BOOL isGridComboDirty();
- static void getLocation(std::string &location);
-
+ static BOOL areCredentialFieldsDirty();
+ static void setLocation(const LLSLURL& slurl);
+
+ static void updateLocationCombo(bool force_visible); // simply update the combo box
static void closePanel();
void setSiteIsAlive( bool alive );
@@ -86,10 +83,10 @@ public:
static void loadLoginPage();
static void giveFocus();
static void setAlwaysRefresh(bool refresh);
- static void mungePassword(LLUICtrl* caller, void* user_data);
// inherited from LLViewerMediaObserver
/*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event);
+ static void updateServer(); // update the combo box, change the login page to the new server, clear the combo
private:
friend class LLPanelLoginListener;
@@ -103,6 +100,10 @@ private:
static void onPassKey(LLLineEditor* caller, void* user_data);
static void onSelectServer(LLUICtrl*, void*);
static void onServerComboLostFocus(LLFocusableElement*);
+ static void updateServerCombo();
+ static void updateStartSLURL();
+
+ static void updateLoginPanelLinks();
private:
LLPointer<LLUIImage> mLogoImage;
@@ -111,8 +112,7 @@ private:
void (*mCallback)(S32 option, void *userdata);
void* mCallbackData;
- std::string mIncomingPassword;
- std::string mMungedPassword;
+ BOOL mPasswordModified;
static LLPanelLogin* sInstance;
static BOOL sCapslockDidNotification;
diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp
index 1895993a8e..9eece81861 100644
--- a/indra/newview/llpanelmaininventory.cpp
+++ b/indra/newview/llpanelmaininventory.cpp
@@ -34,16 +34,19 @@
#include "llpanelmaininventory.h"
#include "llagent.h"
+#include "llavataractions.h"
#include "lldndbutton.h"
#include "lleconomy.h"
#include "llfilepicker.h"
#include "llfloaterinventory.h"
#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
+#include "llinventorymodelbackgroundfetch.h"
#include "llinventorypanel.h"
#include "llfiltereditor.h"
#include "llfloaterreg.h"
#include "llpreviewtexture.h"
+#include "llresmgr.h"
#include "llscrollcontainer.h"
#include "llsdserialize.h"
#include "llspinctrl.h"
@@ -114,10 +117,11 @@ LLPanelMainInventory::LLPanelMainInventory()
mCommitCallbackRegistrar.add("Inventory.ShowFilters", boost::bind(&LLPanelMainInventory::toggleFindOptions, this));
mCommitCallbackRegistrar.add("Inventory.ResetFilters", boost::bind(&LLPanelMainInventory::resetFilters, this));
mCommitCallbackRegistrar.add("Inventory.SetSortBy", boost::bind(&LLPanelMainInventory::setSortBy, this, _2));
+ mCommitCallbackRegistrar.add("Inventory.Share", boost::bind(&LLAvatarActions::shareWithAvatars));
// Controls
// *TODO: Just use persistant settings for each of these
- U32 sort_order = gSavedSettings.getU32("InventorySortOrder");
+ U32 sort_order = gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER);
BOOL sort_by_name = ! ( sort_order & LLInventoryFilter::SO_DATE );
BOOL sort_folders_by_name = ( sort_order & LLInventoryFilter::SO_FOLDERS_BY_NAME );
BOOL sort_system_folders_to_top = ( sort_order & LLInventoryFilter::SO_SYSTEM_FOLDERS_TO_TOP );
@@ -145,7 +149,7 @@ BOOL LLPanelMainInventory::postBuild()
if (mActivePanel)
{
// "All Items" is the previous only view, so it gets the InventorySortOrder
- mActivePanel->setSortOrder(gSavedSettings.getU32("InventorySortOrder"));
+ mActivePanel->setSortOrder(gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER));
mActivePanel->getFilter()->markDefault();
mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
mActivePanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mActivePanel, _1, _2));
@@ -163,7 +167,7 @@ BOOL LLPanelMainInventory::postBuild()
// Now load the stored settings from disk, if available.
std::ostringstream filterSaveName;
filterSaveName << gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, FILTERS_FILENAME);
- llinfos << "LLPanelMainInventory::init: reading from " << filterSaveName << llendl;
+ llinfos << "LLPanelMainInventory::init: reading from " << filterSaveName.str() << llendl;
llifstream file(filterSaveName.str());
LLSD savedFilterState;
if (file.is_open())
@@ -418,12 +422,10 @@ void LLPanelMainInventory::onFilterEdit(const std::string& search_string )
return;
}
- gInventory.startBackgroundFetch();
+ LLInventoryModelBackgroundFetch::instance().start();
- std::string uppercase_search_string = search_string;
- LLStringUtil::toUpper(uppercase_search_string);
- mFilterSubString = uppercase_search_string;
- if (mActivePanel->getFilterSubString().empty() && uppercase_search_string.empty())
+ mFilterSubString = search_string;
+ if (mActivePanel->getFilterSubString().empty() && mFilterSubString.empty())
{
// current filter and new filter empty, do nothing
return;
@@ -437,7 +439,7 @@ void LLPanelMainInventory::onFilterEdit(const std::string& search_string )
}
// set new filter string
- mActivePanel->setFilterSubString(mFilterSubString);
+ setFilterSubString(mFilterSubString);
}
@@ -490,6 +492,10 @@ void LLPanelMainInventory::onFilterSelected()
{
return;
}
+
+ BOOL recent_active = ("Recent Items" == mActivePanel->getName());
+ childSetVisible("add_btn_panel", !recent_active);
+
setFilterSubString(mFilterSubString);
LLInventoryFilter* filter = mActivePanel->getFilter();
LLFloaterInventoryFinder *finder = getFinder();
@@ -500,7 +506,7 @@ void LLPanelMainInventory::onFilterSelected()
if (filter->isActive())
{
// If our filter is active we may be the first thing requiring a fetch so we better start it here.
- gInventory.startBackgroundFetch();
+ LLInventoryModelBackgroundFetch::instance().start();
}
setFilterTextFromFilter();
}
@@ -540,7 +546,7 @@ BOOL LLPanelMainInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
// virtual
void LLPanelMainInventory::changed(U32)
{
- // empty, but must have this defined for abstract base class.
+ updateItemcountText();
}
@@ -552,6 +558,34 @@ void LLPanelMainInventory::draw()
mFilterEditor->setText(mFilterSubString);
}
LLPanel::draw();
+ updateItemcountText();
+}
+
+void LLPanelMainInventory::updateItemcountText()
+{
+ LLLocale locale(LLLocale::USER_LOCALE);
+ std::string item_count_string;
+ LLResMgr::getInstance()->getIntegerString(item_count_string, gInventory.getItemCount());
+
+ LLStringUtil::format_map_t string_args;
+ string_args["[ITEM_COUNT]"] = item_count_string;
+ string_args["[FILTER]"] = getFilterText();
+
+ std::string text = "";
+
+ if (LLInventoryModelBackgroundFetch::instance().backgroundFetchActive())
+ {
+ text = getString("ItemcountFetching", string_args);
+ }
+ else if (LLInventoryModelBackgroundFetch::instance().isEverythingFetched())
+ {
+ text = getString("ItemcountCompleted", string_args);
+ }
+ else
+ {
+ text = getString("ItemcountUnknown");
+ }
+ childSetText("ItemcountText",text);
}
void LLPanelMainInventory::setFilterTextFromFilter()
@@ -570,10 +604,10 @@ void LLPanelMainInventory::toggleFindOptions()
finder->openFloater();
LLFloater* parent_floater = gFloaterView->getParentFloater(this);
- if (parent_floater) // Seraph: Fix this, shouldn't be null even for sidepanel
+ if (parent_floater)
parent_floater->addDependentFloater(mFinderHandle);
// start background fetch of folders
- gInventory.startBackgroundFetch();
+ LLInventoryModelBackgroundFetch::instance().start();
}
else
{
@@ -866,14 +900,12 @@ void LLFloaterInventoryFinder::selectNoTypes(void* user_data)
void LLPanelMainInventory::initListCommandsHandlers()
{
- mListCommands = getChild<LLPanel>("bottom_panel");
-
- mListCommands->childSetAction("options_gear_btn", boost::bind(&LLPanelMainInventory::onGearButtonClick, this));
- mListCommands->childSetAction("trash_btn", boost::bind(&LLPanelMainInventory::onTrashButtonClick, this));
- mListCommands->childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddButtonClick, this));
+ childSetAction("options_gear_btn", boost::bind(&LLPanelMainInventory::onGearButtonClick, this));
+ childSetAction("trash_btn", boost::bind(&LLPanelMainInventory::onTrashButtonClick, this));
+ childSetAction("add_btn", boost::bind(&LLPanelMainInventory::onAddButtonClick, this));
- LLDragAndDropButton* trash_btn = mListCommands->getChild<LLDragAndDropButton>("trash_btn");
- trash_btn->setDragAndDropHandler(boost::bind(&LLPanelMainInventory::handleDragAndDropToTrash, this
+ mTrashButton = getChild<LLDragAndDropButton>("trash_btn");
+ mTrashButton->setDragAndDropHandler(boost::bind(&LLPanelMainInventory::handleDragAndDropToTrash, this
, _4 // BOOL drop
, _5 // EDragAndDropType cargo_type
, _7 // EAcceptance* accept
@@ -889,7 +921,7 @@ void LLPanelMainInventory::updateListCommands()
{
bool trash_enabled = isActionEnabled("delete");
- mListCommands->childSetEnabled("trash_btn", trash_enabled);
+ mTrashButton->setEnabled(trash_enabled);
}
void LLPanelMainInventory::onGearButtonClick()
@@ -1003,7 +1035,10 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
}
const LLUUID item_id = current_item->getListener()->getUUID();
LLViewerInventoryItem *item = gInventory.getItem(item_id);
- item->regenerateLink();
+ if (item)
+ {
+ item->regenerateLink();
+ }
active_panel->setSelection(item_id, TAKE_FOCUS_NO);
}
if (command_name == "find_original")
@@ -1013,7 +1048,7 @@ void LLPanelMainInventory::onCustomAction(const LLSD& userdata)
{
return;
}
- current_item->getListener()->performAction(getActivePanel()->getRootFolder(), getActivePanel()->getModel(), "goto");
+ current_item->getListener()->performAction(getActivePanel()->getModel(), "goto");
}
if (command_name == "find_links")
@@ -1058,19 +1093,18 @@ BOOL LLPanelMainInventory::isActionEnabled(const LLSD& userdata)
if (command_name == "delete")
{
BOOL can_delete = FALSE;
- LLFolderView *folder = getActivePanel()->getRootFolder();
- if (folder)
+ LLFolderView* root = getActivePanel()->getRootFolder();
+ if (root)
{
can_delete = TRUE;
- std::set<LLUUID> selection_set;
- folder->getSelectionList(selection_set);
+ std::set<LLUUID> selection_set = root->getSelectionList();
if (selection_set.empty()) return FALSE;
for (std::set<LLUUID>::iterator iter = selection_set.begin();
iter != selection_set.end();
++iter)
{
const LLUUID &item_id = (*iter);
- LLFolderViewItem *item = folder->getItemByID(item_id);
+ LLFolderViewItem *item = root->getItemByID(item_id);
const LLFolderViewEventListener *listener = item->getListener();
llassert(listener);
if (!listener) return FALSE;
@@ -1153,7 +1187,7 @@ void LLPanelMainInventory::setUploadCostIfNeeded()
LLMenuItemBranchGL* upload_menu = mMenuAdd->findChild<LLMenuItemBranchGL>("upload");
if(upload_menu)
{
- S32 upload_cost = -1;//LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
+ S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
std::string cost_str;
// getPriceUpload() returns -1 if no data available yet.
diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h
index d9ea0da2da..82b72ac224 100644
--- a/indra/newview/llpanelmaininventory.h
+++ b/indra/newview/llpanelmaininventory.h
@@ -36,6 +36,7 @@
#include "llpanel.h"
#include "llinventoryobserver.h"
+#include "lldndbutton.h"
#include "llfolderview.h"
@@ -83,6 +84,7 @@ public:
void setSelectCallback(const LLFolderView::signal_t::slot_type& cb);
+ void onFilterEdit(const std::string& search_string );
protected:
//
// Misc functions
@@ -97,7 +99,7 @@ protected:
void onClearSearch();
static void onFoldersByName(void *user_data);
static BOOL checkFoldersByName(void *user_data);
- void onFilterEdit(const std::string& search_string );
+
static BOOL incrementalFind(LLFolderViewItem* first_item, const char *find_text, BOOL backward);
void onFilterSelected();
@@ -113,7 +115,8 @@ protected:
void setSortBy(const LLSD& userdata);
void saveTexture(const LLSD& userdata);
bool isSaveTextureEnabled(const LLSD& userdata);
-
+ void updateItemcountText();
+
private:
LLFloaterInventoryFinder* getFinder();
@@ -144,7 +147,7 @@ protected:
*/
void setUploadCostIfNeeded();
private:
- LLPanel* mListCommands;
+ LLDragAndDropButton* mTrashButton;
LLMenuGL* mMenuGearDefault;
LLMenuGL* mMenuAdd;
diff --git a/indra/newview/llpanelme.cpp b/indra/newview/llpanelme.cpp
index a68552a91e..3f620869e0 100644
--- a/indra/newview/llpanelme.cpp
+++ b/indra/newview/llpanelme.cpp
@@ -36,11 +36,13 @@
#include "llavatarconstants.h"
#include "llpanelme.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llagentwearables.h"
#include "lliconctrl.h"
#include "llsidetray.h"
#include "lltabcontainer.h"
#include "lltexturectrl.h"
+#include "llviewercontrol.h"
#define PICKER_SECOND_LIFE "2nd_life_pic"
#define PICKER_FIRST_LIFE "real_world_pic"
@@ -61,7 +63,6 @@ BOOL LLPanelMe::postBuild()
LLPanelProfile::postBuild();
getTabContainer()[PANEL_PROFILE]->childSetAction("edit_profile_btn", boost::bind(&LLPanelMe::onEditProfileClicked, this), this);
- getTabContainer()[PANEL_PROFILE]->childSetAction("edit_appearance_btn", boost::bind(&LLPanelMe::onEditAppearanceClicked, this), this);
return TRUE;
}
@@ -70,18 +71,16 @@ void LLPanelMe::onOpen(const LLSD& key)
{
LLPanelProfile::onOpen(key);
- if(key.isUndefined() || key.has("edit_my_profile"))
+ // Force Edit My Profile if this is the first time when user is opening Me Panel (EXT-5068)
+ bool opened = gSavedSettings.getBOOL("MePanelOpened");
+ // In some cases Side Tray my call onOpen() twice, check getCollapsed() to be sure this
+ // is the last time onOpen() is called
+ if( !opened && !LLSideTray::getInstance()->getCollapsed() )
{
- // Open Edit My Profile panel by default (through Side Tray -> My Profile) (EXT-4823)
buildEditPanel();
openPanel(mEditPanel, getAvatarId());
- }
- else if(mEditPanel)
- {
- // When opening Me Panel through Side Tray LLPanelMe::onOpen() is called twice.
- // First time key can be undefined and second time - key may contain some data.
- // Lets close Edit Panel if key does contain some data on second call.
- closePanel(mEditPanel);
+
+ gSavedSettings.setBOOL("MePanelOpened", true);
}
}
@@ -141,14 +140,6 @@ void LLPanelMe::onEditProfileClicked()
togglePanel(mEditPanel, getAvatarId()); // open
}
-void LLPanelMe::onEditAppearanceClicked()
-{
- if (gAgentWearables.areWearablesLoaded())
- {
- gAgent.changeCameraToCustomizeAvatar();
- }
-}
-
void LLPanelMe::onSaveChangesClicked()
{
LLAvatarData data = LLAvatarData();
diff --git a/indra/newview/llpanelme.h b/indra/newview/llpanelme.h
index 1325192bbf..f2b38de3d6 100644
--- a/indra/newview/llpanelme.h
+++ b/indra/newview/llpanelme.h
@@ -63,7 +63,6 @@ private:
void buildEditPanel();
void onEditProfileClicked();
- void onEditAppearanceClicked();
void onSaveChangesClicked();
void onCancelClicked();
diff --git a/indra/newview/llpanelnearbymedia.cpp b/indra/newview/llpanelnearbymedia.cpp
new file mode 100644
index 0000000000..6411cd802d
--- /dev/null
+++ b/indra/newview/llpanelnearbymedia.cpp
@@ -0,0 +1,1243 @@
+/**
+ * @file llpanelnearbymedia.cpp
+ * @brief Management interface for muting and controlling nearby media
+ *
+ * $LicenseInfo:firstyear=2005&license=viewergpl$
+ *
+ * Copyright (c) 2005-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpanelnearbymedia.h"
+
+#include "llaudioengine.h"
+#include "llcheckboxctrl.h"
+#include "llcombobox.h"
+#include "llresizebar.h"
+#include "llresizehandle.h"
+#include "llscrolllistctrl.h"
+#include "llscrolllistitem.h"
+#include "llscrolllistcell.h"
+#include "llslider.h"
+#include "llsliderctrl.h"
+#include "llagent.h"
+#include "llagentui.h"
+#include "llbutton.h"
+#include "lltextbox.h"
+#include "llviewermedia.h"
+#include "llviewerparcelmedia.h"
+#include "llviewerregion.h"
+#include "llviewermediafocus.h"
+#include "llviewerparcelmgr.h"
+#include "llparcel.h"
+#include "llpluginclassmedia.h"
+#include "llvovolume.h"
+#include "llstatusbar.h"
+#include "llsdutil.h"
+
+#include "llfloaterreg.h"
+#include "llfloaterpreference.h" // for the gear icon
+#include "lltabcontainer.h"
+
+#include <stringize.h>
+
+extern LLControlGroup gSavedSettings;
+
+static const LLUUID PARCEL_MEDIA_LIST_ITEM_UUID = LLUUID("CAB5920F-E484-4233-8621-384CF373A321");
+static const LLUUID PARCEL_AUDIO_LIST_ITEM_UUID = LLUUID("DF4B020D-8A24-4B95-AB5D-CA970D694822");
+
+//
+// LLPanelNearByMedia
+//
+
+
+LLPanelNearByMedia::LLPanelNearByMedia()
+: mMediaList(NULL),
+ mEnableAllCtrl(NULL),
+ mAllMediaDisabled(false),
+ mDebugInfoVisible(false),
+ mParcelMediaItem(NULL),
+ mParcelAudioItem(NULL)
+{
+ mHoverTimer.stop();
+
+ mParcelAudioAutoStart = gSavedSettings.getBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING) &&
+ gSavedSettings.getBOOL("MediaTentativeAutoPlay");
+
+ gSavedSettings.getControl(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING)->getSignal()->connect(boost::bind(&LLPanelNearByMedia::handleMediaAutoPlayChanged, this, _2));
+
+ mCommitCallbackRegistrar.add("MediaListCtrl.EnableAll", boost::bind(&LLPanelNearByMedia::onClickEnableAll, this));
+ mCommitCallbackRegistrar.add("MediaListCtrl.DisableAll", boost::bind(&LLPanelNearByMedia::onClickDisableAll, this));
+ mCommitCallbackRegistrar.add("MediaListCtrl.GoMediaPrefs", boost::bind(&LLPanelNearByMedia::onAdvancedButtonClick, this));
+ mCommitCallbackRegistrar.add("MediaListCtrl.MoreLess", boost::bind(&LLPanelNearByMedia::onMoreLess, this));
+ mCommitCallbackRegistrar.add("SelectedMediaCtrl.Stop", boost::bind(&LLPanelNearByMedia::onClickSelectedMediaStop, this));
+ mCommitCallbackRegistrar.add("SelectedMediaCtrl.Play", boost::bind(&LLPanelNearByMedia::onClickSelectedMediaPlay, this));
+ mCommitCallbackRegistrar.add("SelectedMediaCtrl.Pause", boost::bind(&LLPanelNearByMedia::onClickSelectedMediaPause, this));
+ mCommitCallbackRegistrar.add("SelectedMediaCtrl.Mute", boost::bind(&LLPanelNearByMedia::onClickSelectedMediaMute, this));
+ mCommitCallbackRegistrar.add("SelectedMediaCtrl.Volume", boost::bind(&LLPanelNearByMedia::onCommitSelectedMediaVolume, this));
+ mCommitCallbackRegistrar.add("SelectedMediaCtrl.Zoom", boost::bind(&LLPanelNearByMedia::onClickSelectedMediaZoom, this));
+ mCommitCallbackRegistrar.add("SelectedMediaCtrl.Unzoom", boost::bind(&LLPanelNearByMedia::onClickSelectedMediaUnzoom, this));
+
+ LLUICtrlFactory::instance().buildPanel(this, "panel_nearby_media.xml");
+}
+
+LLPanelNearByMedia::~LLPanelNearByMedia()
+{
+}
+
+BOOL LLPanelNearByMedia::postBuild()
+{
+ LLPanel::postBuild();
+
+ const S32 RESIZE_BAR_THICKNESS = 6;
+ LLResizeBar::Params p;
+ p.rect = LLRect(0, RESIZE_BAR_THICKNESS, getRect().getWidth(), 0);
+ p.name = "resizebar_bottom";
+ p.min_size = getRect().getHeight();
+ p.side = LLResizeBar::BOTTOM;
+ p.resizing_view = this;
+ addChild( LLUICtrlFactory::create<LLResizeBar>(p) );
+
+ p.rect = LLRect( 0, getRect().getHeight(), RESIZE_BAR_THICKNESS, 0);
+ p.name = "resizebar_left";
+ p.min_size = getRect().getWidth();
+ p.side = LLResizeBar::LEFT;
+ addChild( LLUICtrlFactory::create<LLResizeBar>(p) );
+
+ LLResizeHandle::Params resize_handle_p;
+ resize_handle_p.rect = LLRect( 0, RESIZE_HANDLE_HEIGHT, RESIZE_HANDLE_WIDTH, 0 );
+ resize_handle_p.mouse_opaque(false);
+ resize_handle_p.min_width(getRect().getWidth());
+ resize_handle_p.min_height(getRect().getHeight());
+ resize_handle_p.corner(LLResizeHandle::LEFT_BOTTOM);
+ addChild(LLUICtrlFactory::create<LLResizeHandle>(resize_handle_p));
+
+ mNearbyMediaPanel = getChild<LLUICtrl>("nearby_media_panel");
+ mMediaList = getChild<LLScrollListCtrl>("media_list");
+ mEnableAllCtrl = getChild<LLUICtrl>("all_nearby_media_enable_btn");
+ mDisableAllCtrl = getChild<LLUICtrl>("all_nearby_media_disable_btn");
+ mShowCtrl = getChild<LLComboBox>("show_combo");
+
+ // Dynamic (selection-dependent) controls
+ mStopCtrl = getChild<LLUICtrl>("stop");
+ mPlayCtrl = getChild<LLUICtrl>("play");
+ mPauseCtrl = getChild<LLUICtrl>("pause");
+ mMuteCtrl = getChild<LLUICtrl>("mute");
+ mVolumeSliderCtrl = getChild<LLUICtrl>("volume_slider_ctrl");
+ mZoomCtrl = getChild<LLUICtrl>("zoom");
+ mUnzoomCtrl = getChild<LLUICtrl>("unzoom");
+ mVolumeSlider = getChild<LLSlider>("volume_slider");
+ mMuteBtn = getChild<LLButton>("mute_btn");
+
+ mEmptyNameString = getString("empty_item_text");
+ mParcelMediaName = getString("parcel_media_name");
+ mParcelAudioName = getString("parcel_audio_name");
+ mPlayingString = getString("playing_suffix");
+
+ mMediaList->setDoubleClickCallback(onZoomMedia, this);
+ mMediaList->sortByColumnIndex(PROXIMITY_COLUMN, TRUE);
+ mMediaList->sortByColumnIndex(VISIBILITY_COLUMN, FALSE);
+
+ refreshList();
+ updateControls();
+ updateColumns();
+
+ LLView* minimized_controls = getChildView("minimized_controls");
+ mMoreRect = getRect();
+ mLessRect = getRect();
+ mLessRect.mBottom = minimized_controls->getRect().mBottom;
+
+ getChild<LLUICtrl>("more_btn")->setVisible(false);
+ onMoreLess();
+
+ return TRUE;
+}
+
+void LLPanelNearByMedia::handleMediaAutoPlayChanged(const LLSD& newvalue)
+{
+ // update mParcelAudioAutoStart if AUTO_PLAY_MEDIA_SETTING changes
+ mParcelAudioAutoStart = gSavedSettings.getBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING) &&
+ gSavedSettings.getBOOL("MediaTentativeAutoPlay");
+}
+
+/*virtual*/
+void LLPanelNearByMedia::onMouseEnter(S32 x, S32 y, MASK mask)
+{
+ mHoverTimer.stop();
+ LLPanel::onMouseEnter(x,y,mask);
+}
+
+
+/*virtual*/
+void LLPanelNearByMedia::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+ mHoverTimer.start();
+ LLPanel::onMouseLeave(x,y,mask);
+}
+
+/*virtual*/
+void LLPanelNearByMedia::onTopLost()
+{
+ setVisible(FALSE);
+}
+
+
+/*virtual*/
+void LLPanelNearByMedia::handleVisibilityChange ( BOOL new_visibility )
+{
+ if (new_visibility)
+ {
+ mHoverTimer.start(); // timer will be stopped when mouse hovers over panel
+ }
+ else
+ {
+ mHoverTimer.stop();
+ }
+}
+
+/*virtual*/
+void LLPanelNearByMedia::reshape(S32 width, S32 height, BOOL called_from_parent)
+{
+ LLPanel::reshape(width, height, called_from_parent);
+
+ LLButton* more_less_btn = getChild<LLButton>("more_less_btn");
+ if (more_less_btn->getValue().asBoolean())
+ {
+ mMoreRect = getRect();
+ }
+
+}
+
+const F32 AUTO_CLOSE_FADE_TIME_START= 4.0f;
+const F32 AUTO_CLOSE_FADE_TIME_END = 5.0f;
+
+/*virtual*/
+void LLPanelNearByMedia::draw()
+{
+ // keep bottom of panel on screen
+ LLRect screen_rect = calcScreenRect();
+ if (screen_rect.mBottom < 0)
+ {
+ LLRect new_rect = getRect();
+ new_rect.mBottom += 0 - screen_rect.mBottom;
+ setShape(new_rect);
+ }
+
+ refreshList();
+ updateControls();
+
+ F32 alpha = mHoverTimer.getStarted()
+ ? clamp_rescale(mHoverTimer.getElapsedTimeF32(), AUTO_CLOSE_FADE_TIME_START, AUTO_CLOSE_FADE_TIME_END, 1.f, 0.f)
+ : 1.0f;
+ LLViewDrawContext context(alpha);
+
+ LLPanel::draw();
+
+ if (alpha == 0.f)
+ {
+ setVisible(false);
+ }
+}
+
+/*virtual*/
+BOOL LLPanelNearByMedia::handleHover(S32 x, S32 y, MASK mask)
+{
+ LLPanel::handleHover(x, y, mask);
+
+ // If we are hovering over this panel, make sure to clear any hovered media
+ // ID. Note that the more general solution would be to clear this ID when
+ // the mouse leaves the in-scene view, but that proved to be problematic.
+ // See EXT-5517
+ LLViewerMediaFocus::getInstance()->clearHover();
+
+ // Always handle
+ return true;
+}
+
+bool LLPanelNearByMedia::getParcelAudioAutoStart()
+{
+ return mParcelAudioAutoStart;
+}
+
+LLScrollListItem* LLPanelNearByMedia::addListItem(const LLUUID &id)
+{
+ if (NULL == mMediaList) return NULL;
+
+ // Just set up the columns -- the values will be filled in by updateListItem().
+
+ LLSD row;
+ row["id"] = id;
+
+ LLSD &columns = row["columns"];
+
+ columns[CHECKBOX_COLUMN]["column"] = "media_checkbox_ctrl";
+ columns[CHECKBOX_COLUMN]["type"] = "checkbox";
+ //if(mDebugInfoVisible)
+ {
+ columns[PROXIMITY_COLUMN]["column"] = "media_proximity";
+ columns[PROXIMITY_COLUMN]["value"] = "";
+ columns[VISIBILITY_COLUMN]["column"] = "media_visibility";
+ columns[VISIBILITY_COLUMN]["value"] = "";
+ columns[CLASS_COLUMN]["column"] = "media_class";
+ columns[CLASS_COLUMN]["type"] = "text";
+ columns[CLASS_COLUMN]["value"] = "";
+ }
+ columns[NAME_COLUMN]["column"] = "media_name";
+ columns[NAME_COLUMN]["type"] = "text";
+ columns[NAME_COLUMN]["value"] = "";
+ //if(mDebugInfoVisible)
+ {
+ columns[DEBUG_COLUMN]["column"] = "media_debug";
+ columns[DEBUG_COLUMN]["type"] = "text";
+ columns[DEBUG_COLUMN]["value"] = "";
+ }
+
+ LLScrollListItem* new_item = mMediaList->addElement(row);
+ if (NULL != new_item)
+ {
+ LLScrollListCheck* scroll_list_check = dynamic_cast<LLScrollListCheck*>(new_item->getColumn(CHECKBOX_COLUMN));
+ if (scroll_list_check)
+ {
+ LLCheckBoxCtrl *check = scroll_list_check->getCheckBox();
+ check->setCommitCallback(boost::bind(&LLPanelNearByMedia::onCheckItem, this, _1, id));
+ }
+ }
+ return new_item;
+}
+
+void LLPanelNearByMedia::updateListItem(LLScrollListItem* item, LLViewerMediaImpl* impl)
+{
+ std::string item_name;
+ std::string item_tooltip;
+ std::string debug_str;
+ LLPanelNearByMedia::MediaClass media_class = MEDIA_CLASS_ALL;
+
+ getNameAndUrlHelper(impl, item_name, item_tooltip, mEmptyNameString);
+ // Focused
+ if (impl->hasFocus())
+ {
+ media_class = MEDIA_CLASS_FOCUSED;
+ }
+ // Is attached to another avatar?
+ else if (impl->isAttachedToAnotherAvatar())
+ {
+ media_class = MEDIA_CLASS_ON_OTHERS;
+ }
+ // Outside agent parcel
+ else if (!impl->isInAgentParcel())
+ {
+ media_class = MEDIA_CLASS_OUTSIDE_PARCEL;
+ }
+ else {
+ // inside parcel
+ media_class = MEDIA_CLASS_WITHIN_PARCEL;
+ }
+
+ if(mDebugInfoVisible)
+ {
+ debug_str += llformat("%g/", (float)impl->getInterest());
+
+ // proximity distance is actually distance squared -- display it as straight distance.
+ debug_str += llformat("%g/", fsqrtf(impl->getProximityDistance()));
+
+ // s += llformat("%g/", (float)impl->getCPUUsage());
+ // s += llformat("%g/", (float)impl->getApproximateTextureInterest());
+ debug_str += llformat("%g/", (float)(NULL == impl->getSomeObject()) ? 0.0 : impl->getSomeObject()->getPixelArea());
+
+ debug_str += LLPluginClassMedia::priorityToString(impl->getPriority());
+
+ if(impl->hasMedia())
+ {
+ debug_str += '@';
+ }
+ else if(impl->isPlayable())
+ {
+ debug_str += '+';
+ }
+ else if(impl->isForcedUnloaded())
+ {
+ debug_str += '!';
+ }
+ }
+
+ updateListItem(item,
+ item_name,
+ item_tooltip,
+ impl->getProximity(),
+ impl->isMediaDisabled(),
+ impl->hasMedia(),
+ impl->isMediaTimeBased() && impl->isMediaPlaying(),
+ media_class,
+ debug_str);
+}
+
+void LLPanelNearByMedia::updateListItem(LLScrollListItem* item,
+ const std::string &item_name,
+ const std::string &item_tooltip,
+ S32 proximity,
+ bool is_disabled,
+ bool has_media,
+ bool is_time_based_and_playing,
+ LLPanelNearByMedia::MediaClass media_class,
+ const std::string &debug_str)
+{
+ LLScrollListCell* cell = item->getColumn(PROXIMITY_COLUMN);
+ if(cell)
+ {
+ // since we are forced to sort by text, encode sort order as string
+ std::string proximity_string = STRINGIZE(proximity);
+ std::string old_proximity_string = cell->getValue().asString();
+ if(proximity_string != old_proximity_string)
+ {
+ cell->setValue(proximity_string);
+ mMediaList->setNeedsSort(true);
+ }
+ }
+
+ cell = item->getColumn(CHECKBOX_COLUMN);
+ if(cell)
+ {
+ cell->setValue(!is_disabled);
+ }
+
+ cell = item->getColumn(VISIBILITY_COLUMN);
+ if(cell)
+ {
+ S32 old_visibility = cell->getValue();
+ // *HACK ALERT: force ordering of Media before Audio before the rest of the list
+ S32 new_visibility =
+ item->getUUID() == PARCEL_MEDIA_LIST_ITEM_UUID ? 3
+ : item->getUUID() == PARCEL_AUDIO_LIST_ITEM_UUID ? 2
+ : (has_media) ? 1
+ : ((is_disabled) ? 0
+ : -1);
+ cell->setValue(STRINGIZE(new_visibility));
+ if (new_visibility != old_visibility)
+ {
+ mMediaList->setNeedsSort(true);
+ }
+ }
+
+ cell = item->getColumn(NAME_COLUMN);
+ if(cell)
+ {
+ std::string name = item_name;
+ std::string old_name = cell->getValue().asString();
+ if (has_media)
+ {
+ name += " " + mPlayingString;
+ }
+ if (name != old_name)
+ {
+ cell->setValue(name);
+ }
+ cell->setToolTip(item_tooltip);
+
+ // *TODO: Make these font styles/colors configurable via XUI
+ U8 font_style = LLFontGL::NORMAL;
+ LLColor4 cell_color = LLColor4::white;
+
+ // Only colorize by class in debug
+ if (mDebugInfoVisible)
+ {
+ switch (media_class) {
+ case MEDIA_CLASS_FOCUSED:
+ cell_color = LLColor4::yellow;
+ break;
+ case MEDIA_CLASS_ON_OTHERS:
+ cell_color = LLColor4::red;
+ break;
+ case MEDIA_CLASS_OUTSIDE_PARCEL:
+ cell_color = LLColor4::orange;
+ break;
+ case MEDIA_CLASS_WITHIN_PARCEL:
+ default:
+ break;
+ }
+ }
+ if (is_disabled)
+ {
+ if (mDebugInfoVisible)
+ {
+ font_style |= LLFontGL::ITALIC;
+ cell_color = LLColor4::black;
+ }
+ else {
+ // Dim it if it is disabled
+ cell_color.setAlpha(0.25);
+ }
+ }
+ // Dim it if it isn't "showing"
+ else if (!has_media)
+ {
+ cell_color.setAlpha(0.25);
+ }
+ // Bold it if it is time-based media and it is playing
+ else if (is_time_based_and_playing)
+ {
+ if (mDebugInfoVisible) font_style |= LLFontGL::BOLD;
+ }
+ cell->setColor(cell_color);
+ LLScrollListText *text_cell = dynamic_cast<LLScrollListText*> (cell);
+ if (text_cell)
+ {
+ text_cell->setFontStyle(font_style);
+ }
+ }
+
+ cell = item->getColumn(CLASS_COLUMN);
+ if(cell)
+ {
+ // TODO: clean this up!
+ cell->setValue(STRINGIZE(media_class));
+ }
+
+ if(mDebugInfoVisible)
+ {
+ cell = item->getColumn(DEBUG_COLUMN);
+ if(cell)
+ {
+ cell->setValue(debug_str);
+ }
+ }
+}
+
+void LLPanelNearByMedia::removeListItem(const LLUUID &id)
+{
+ if (NULL == mMediaList) return;
+
+ mMediaList->deleteSingleItem(mMediaList->getItemIndex(id));
+}
+
+void LLPanelNearByMedia::refreshParcelItems()
+{
+ //
+ // First add/remove the "fake" items Parcel Media and Parcel Audio.
+ // These items will have special UUIDs
+ // PARCEL_MEDIA_LIST_ITEM_UUID
+ // PARCEL_AUDIO_LIST_ITEM_UUID
+ //
+ // Get the filter choice.
+ const LLSD &choice_llsd = mShowCtrl->getSelectedValue();
+ MediaClass choice = (MediaClass)choice_llsd.asInteger();
+ // Only show "special parcel items" if "All" or "Within" filter
+ // (and if media is "enabled")
+ bool should_include = (choice == MEDIA_CLASS_ALL || choice == MEDIA_CLASS_WITHIN_PARCEL);
+
+ // First Parcel Media: add or remove it as necessary
+ if (gSavedSettings.getBOOL("AudioStreamingMedia") &&should_include && LLViewerMedia::hasParcelMedia())
+ {
+ // Yes, there is parcel media.
+ if (NULL == mParcelMediaItem)
+ {
+ mParcelMediaItem = addListItem(PARCEL_MEDIA_LIST_ITEM_UUID);
+ mMediaList->setNeedsSort(true);
+ }
+ }
+ else {
+ if (NULL != mParcelMediaItem) {
+ removeListItem(PARCEL_MEDIA_LIST_ITEM_UUID);
+ mParcelMediaItem = NULL;
+ mMediaList->setNeedsSort(true);
+ }
+ }
+
+ // ... then update it
+ if (NULL != mParcelMediaItem)
+ {
+ std::string name, url, tooltip;
+ if (!LLViewerParcelMgr::getInstance()->getAgentParcel()->getObscureMedia())
+ {
+ getNameAndUrlHelper(LLViewerParcelMedia::getParcelMedia(), name, url, "");
+ if (name.empty() || name == url)
+ {
+ tooltip = url;
+ }
+ else {
+ tooltip = name + " : " + url;
+ }
+ }
+ LLViewerMediaImpl *impl = LLViewerParcelMedia::getParcelMedia();
+ updateListItem(mParcelMediaItem,
+ mParcelMediaName,
+ tooltip,
+ -2, // Proximity closer than anything else, before Parcel Audio
+ impl == NULL || impl->isMediaDisabled(),
+ impl != NULL && !LLViewerParcelMedia::getURL().empty(),
+ impl != NULL && impl->isMediaTimeBased() && impl->isMediaPlaying(),
+ MEDIA_CLASS_ALL,
+ "parcel media");
+ }
+
+ // Next Parcel Audio: add or remove it as necessary (don't show if disabled in prefs)
+ if (should_include && LLViewerMedia::hasParcelAudio() && gSavedSettings.getBOOL("AudioStreamingMusic"))
+ {
+ // Yes, there is parcel audio.
+ if (NULL == mParcelAudioItem)
+ {
+ mParcelAudioItem = addListItem(PARCEL_AUDIO_LIST_ITEM_UUID);
+ mMediaList->setNeedsSort(true);
+ }
+ }
+ else {
+ if (NULL != mParcelAudioItem) {
+ removeListItem(PARCEL_AUDIO_LIST_ITEM_UUID);
+ mParcelAudioItem = NULL;
+ mMediaList->setNeedsSort(true);
+ }
+ }
+
+ // ... then update it
+ if (NULL != mParcelAudioItem)
+ {
+ bool is_playing = LLViewerMedia::isParcelAudioPlaying();
+
+ std::string url;
+ if (!LLViewerParcelMgr::getInstance()->getAgentParcel()->getObscureMusic())
+ {
+ url = LLViewerMedia::getParcelAudioURL();
+ }
+ updateListItem(mParcelAudioItem,
+ mParcelAudioName,
+ url,
+ -1, // Proximity after Parcel Media, but closer than anything else
+ (!is_playing),
+ is_playing,
+ is_playing,
+ MEDIA_CLASS_ALL,
+ "parcel audio");
+ }
+}
+
+void LLPanelNearByMedia::refreshList()
+{
+ bool all_items_deleted = false;
+
+ if(!mMediaList)
+ {
+ // None of this makes any sense if the media list isn't there.
+ return;
+ }
+
+ // Check whether the debug column has been shown/hidden.
+ bool debug_info_visible = gSavedSettings.getBOOL("MediaPerformanceManagerDebug");
+ if(debug_info_visible != mDebugInfoVisible)
+ {
+ mDebugInfoVisible = debug_info_visible;
+
+ // Clear all items so the list gets regenerated.
+ mMediaList->deleteAllItems();
+ mParcelAudioItem = NULL;
+ mParcelMediaItem = NULL;
+ all_items_deleted = true;
+
+ updateColumns();
+ }
+
+ refreshParcelItems();
+
+ // Get the canonical list from LLViewerMedia
+ LLViewerMedia::impl_list impls = LLViewerMedia::getPriorityList();
+ LLViewerMedia::impl_list::iterator priority_iter;
+
+ U32 enabled_count = 0;
+ U32 disabled_count = 0;
+
+ // iterate over the impl list, creating rows as necessary.
+ for(priority_iter = impls.begin(); priority_iter != impls.end(); priority_iter++)
+ {
+ LLViewerMediaImpl *impl = *priority_iter;
+
+ // If we just emptied out the list, every flag needs to be reset.
+ if(all_items_deleted)
+ {
+ impl->setInNearbyMediaList(false);
+ }
+
+ if (!impl->isParcelMedia())
+ {
+ LLUUID media_id = impl->getMediaTextureID();
+ S32 proximity = impl->getProximity();
+ // This is expensive (i.e. a linear search) -- don't use it here. We now use mInNearbyMediaList instead.
+ //S32 index = mMediaList->getItemIndex(media_id);
+ if (proximity < 0 || !shouldShow(impl))
+ {
+ if (impl->getInNearbyMediaList())
+ {
+ // There's a row for this impl -- remove it.
+ removeListItem(media_id);
+ impl->setInNearbyMediaList(false);
+ }
+ }
+ else
+ {
+ if (!impl->getInNearbyMediaList())
+ {
+ // We don't have a row for this impl -- add one.
+ addListItem(media_id);
+ impl->setInNearbyMediaList(true);
+ }
+ }
+ // Update counts
+ if (impl->isMediaDisabled())
+ {
+ disabled_count++;
+ }
+ else {
+ enabled_count++;
+ }
+ }
+ }
+ mDisableAllCtrl->setEnabled((gSavedSettings.getBOOL("AudioStreamingMusic") ||
+ gSavedSettings.getBOOL("AudioStreamingMedia")) &&
+ (LLViewerMedia::isAnyMediaShowing() ||
+ LLViewerMedia::isParcelMediaPlaying() ||
+ LLViewerMedia::isParcelAudioPlaying()));
+
+ mEnableAllCtrl->setEnabled( (gSavedSettings.getBOOL("AudioStreamingMusic") ||
+ gSavedSettings.getBOOL("AudioStreamingMedia")) &&
+ (disabled_count > 0 ||
+ // parcel media (if we have it, and it isn't playing, enable "start")
+ (LLViewerMedia::hasParcelMedia() && ! LLViewerMedia::isParcelMediaPlaying()) ||
+ // parcel audio (if we have it, and it isn't playing, enable "start")
+ (LLViewerMedia::hasParcelAudio() && ! LLViewerMedia::isParcelAudioPlaying())));
+
+ // Iterate over the rows in the control, updating ones whose impl exists, and deleting ones whose impl has gone away.
+ std::vector<LLScrollListItem*> items = mMediaList->getAllData();
+
+ for (std::vector<LLScrollListItem*>::iterator item_it = items.begin();
+ item_it != items.end();
+ ++item_it)
+ {
+ LLScrollListItem* item = (*item_it);
+ LLUUID row_id = item->getUUID();
+
+ if (row_id != PARCEL_MEDIA_LIST_ITEM_UUID &&
+ row_id != PARCEL_AUDIO_LIST_ITEM_UUID)
+ {
+ LLViewerMediaImpl* impl = LLViewerMedia::getMediaImplFromTextureID(row_id);
+ if(impl)
+ {
+ updateListItem(item, impl);
+ }
+ else
+ {
+ // This item's impl has been deleted -- remove the row.
+ // Removing the row won't throw off our iteration, since we have a local copy of the array.
+ // We just need to make sure we don't access this item after the delete.
+ removeListItem(row_id);
+ }
+ }
+ }
+
+ // Set the selection to whatever media impl the media focus/hover is on.
+ // This is an experiment, and can be removed by ifdefing out these 4 lines.
+ LLUUID media_target = LLViewerMediaFocus::getInstance()->getControlsMediaID();
+ if(media_target.notNull())
+ {
+ mMediaList->selectByID(media_target);
+ }
+}
+
+void LLPanelNearByMedia::updateColumns()
+{
+ if (!mDebugInfoVisible)
+ {
+ if (mMediaList->getColumn(CHECKBOX_COLUMN)) mMediaList->getColumn(VISIBILITY_COLUMN)->setWidth(-1);
+ if (mMediaList->getColumn(VISIBILITY_COLUMN)) mMediaList->getColumn(VISIBILITY_COLUMN)->setWidth(-1);
+ if (mMediaList->getColumn(PROXIMITY_COLUMN)) mMediaList->getColumn(PROXIMITY_COLUMN)->setWidth(-1);
+ if (mMediaList->getColumn(CLASS_COLUMN)) mMediaList->getColumn(CLASS_COLUMN)->setWidth(-1);
+ if (mMediaList->getColumn(DEBUG_COLUMN)) mMediaList->getColumn(DEBUG_COLUMN)->setWidth(-1);
+ }
+ else {
+ if (mMediaList->getColumn(CHECKBOX_COLUMN)) mMediaList->getColumn(VISIBILITY_COLUMN)->setWidth(20);
+ if (mMediaList->getColumn(VISIBILITY_COLUMN)) mMediaList->getColumn(VISIBILITY_COLUMN)->setWidth(20);
+ if (mMediaList->getColumn(PROXIMITY_COLUMN)) mMediaList->getColumn(PROXIMITY_COLUMN)->setWidth(30);
+ if (mMediaList->getColumn(CLASS_COLUMN)) mMediaList->getColumn(CLASS_COLUMN)->setWidth(20);
+ if (mMediaList->getColumn(DEBUG_COLUMN)) mMediaList->getColumn(DEBUG_COLUMN)->setWidth(200);
+ }
+}
+
+void LLPanelNearByMedia::onClickEnableAll()
+{
+ LLViewerMedia::setAllMediaEnabled(true);
+}
+
+void LLPanelNearByMedia::onClickDisableAll()
+{
+ LLViewerMedia::setAllMediaEnabled(false);
+}
+
+void LLPanelNearByMedia::onClickEnableParcelMedia()
+{
+ if ( ! LLViewerMedia::isParcelMediaPlaying() )
+ {
+ LLViewerParcelMedia::play(LLViewerParcelMgr::getInstance()->getAgentParcel());
+ }
+}
+
+void LLPanelNearByMedia::onClickDisableParcelMedia()
+{
+ // This actually unloads the impl, as opposed to "stop"ping the media
+ LLViewerParcelMedia::stop();
+}
+
+void LLPanelNearByMedia::onCheckItem(LLUICtrl* ctrl, const LLUUID &row_id)
+{
+ LLCheckBoxCtrl* check = static_cast<LLCheckBoxCtrl*>(ctrl);
+
+ setDisabled(row_id, ! check->getValue());
+}
+
+bool LLPanelNearByMedia::setDisabled(const LLUUID &row_id, bool disabled)
+{
+ if (row_id == PARCEL_AUDIO_LIST_ITEM_UUID)
+ {
+ if (disabled) onClickParcelAudioStop();
+ else onClickParcelAudioStart();
+ return true;
+ }
+ else if (row_id == PARCEL_MEDIA_LIST_ITEM_UUID)
+ {
+ if (disabled) onClickDisableParcelMedia();
+ else onClickEnableParcelMedia();
+ return true;
+ }
+ else {
+ LLViewerMediaImpl* impl = LLViewerMedia::getMediaImplFromTextureID(row_id);
+ if(impl)
+ {
+ impl->setDisabled(disabled, true);
+ return true;
+ }
+ }
+ return false;
+}
+
+//static
+void LLPanelNearByMedia::onZoomMedia(void* user_data)
+{
+ LLPanelNearByMedia* panelp = (LLPanelNearByMedia*)user_data;
+ LLUUID media_id = panelp->mMediaList->getValue().asUUID();
+
+ LLViewerMediaFocus::getInstance()->focusZoomOnMedia(media_id);
+}
+
+void LLPanelNearByMedia::onClickParcelMediaPlay()
+{
+ LLViewerParcelMedia::play(LLViewerParcelMgr::getInstance()->getAgentParcel());
+}
+
+void LLPanelNearByMedia::onClickParcelMediaStop()
+{
+ if (LLViewerParcelMedia::getParcelMedia())
+ {
+ // This stops the media playing, as opposed to unloading it like
+ // LLViewerParcelMedia::stop() does
+ LLViewerParcelMedia::getParcelMedia()->stop();
+ }
+}
+
+void LLPanelNearByMedia::onClickParcelMediaPause()
+{
+ LLViewerParcelMedia::pause();
+}
+
+void LLPanelNearByMedia::onClickParcelAudioStart()
+{
+ // User *explicitly* started the internet stream, so keep the stream
+ // playing and updated as they cross to other parcels etc.
+ mParcelAudioAutoStart = true;
+
+ if (!gAudiop)
+ return;
+
+ gAudiop->startInternetStream(LLViewerMedia::getParcelAudioURL());
+}
+
+void LLPanelNearByMedia::onClickParcelAudioPlay()
+{
+ // User *explicitly* started the internet stream, so keep the stream
+ // playing and updated as they cross to other parcels etc.
+ mParcelAudioAutoStart = true;
+
+ if (!gAudiop)
+ return;
+
+ if (LLAudioEngine::AUDIO_PAUSED == gAudiop->isInternetStreamPlaying())
+ {
+ // 'false' means unpause
+ gAudiop->pauseInternetStream(false);
+ }
+ else {
+ gAudiop->startInternetStream(LLViewerMedia::getParcelAudioURL());
+ }
+}
+
+void LLPanelNearByMedia::onClickParcelAudioStop()
+{
+ // User *explicitly* stopped the internet stream, so don't
+ // re-start audio when i.e. they move to another parcel, until
+ // they explicitly start it again.
+ mParcelAudioAutoStart = false;
+
+ if (!gAudiop)
+ return;
+
+ gAudiop->stopInternetStream();
+}
+
+void LLPanelNearByMedia::onClickParcelAudioPause()
+{
+ if (!gAudiop)
+ return;
+
+ // 'true' means pause
+ gAudiop->pauseInternetStream(true);
+}
+
+bool LLPanelNearByMedia::shouldShow(LLViewerMediaImpl* impl)
+{
+ const LLSD &choice_llsd = mShowCtrl->getSelectedValue();
+ MediaClass choice = (MediaClass)choice_llsd.asInteger();
+
+ switch (choice)
+ {
+ case MEDIA_CLASS_ALL:
+ return true;
+ break;
+ case MEDIA_CLASS_WITHIN_PARCEL:
+ return impl->isInAgentParcel();
+ break;
+ case MEDIA_CLASS_OUTSIDE_PARCEL:
+ return ! impl->isInAgentParcel();
+ break;
+ case MEDIA_CLASS_ON_OTHERS:
+ return impl->isAttachedToAnotherAvatar();
+ break;
+ default:
+ break;
+ }
+ return true;
+}
+
+void LLPanelNearByMedia::onAdvancedButtonClick()
+{
+ // bring up the prefs floater
+ LLFloaterPreference* prefsfloater = dynamic_cast<LLFloaterPreference*>(LLFloaterReg::showInstance("preferences"));
+ if (prefsfloater)
+ {
+ // grab the 'audio' panel from the preferences floater and
+ // bring it the front!
+ LLTabContainer* tabcontainer = prefsfloater->getChild<LLTabContainer>("pref core");
+ LLPanel* audiopanel = prefsfloater->getChild<LLPanel>("audio");
+ if (tabcontainer && audiopanel)
+ {
+ tabcontainer->selectTabPanel(audiopanel);
+ }
+ }
+}
+
+void LLPanelNearByMedia::onMoreLess()
+{
+ bool is_more = getChild<LLUICtrl>("more_btn")->getVisible();
+ mNearbyMediaPanel->setVisible(is_more);
+
+ // enable resizing when expanded
+ getChildView("resizebar_bottom")->setEnabled(is_more);
+
+ LLRect new_rect = is_more ? mMoreRect : mLessRect;
+ new_rect.translate(getRect().mRight - new_rect.mRight, getRect().mTop - new_rect.mTop);
+
+ setShape(new_rect);
+
+ getChild<LLUICtrl>("more_btn")->setVisible(!is_more);
+ getChild<LLUICtrl>("less_btn")->setVisible(is_more);
+}
+
+void LLPanelNearByMedia::updateControls()
+{
+ LLUUID selected_media_id = mMediaList->getValue().asUUID();
+
+ if (selected_media_id == PARCEL_AUDIO_LIST_ITEM_UUID)
+ {
+ if (!LLViewerMedia::hasParcelAudio() || !gSavedSettings.getBOOL("AudioStreamingMusic"))
+ {
+ // disable controls if audio streaming music is disabled from preference
+ showDisabledControls();
+ }
+ else {
+ showTimeBasedControls(LLViewerMedia::isParcelAudioPlaying(),
+ false, // include_zoom
+ false, // is_zoomed
+ gSavedSettings.getBOOL("MuteMusic"),
+ gSavedSettings.getF32("AudioLevelMusic") );
+ }
+ }
+ else if (selected_media_id == PARCEL_MEDIA_LIST_ITEM_UUID)
+ {
+ if (!LLViewerMedia::hasParcelMedia() || !gSavedSettings.getBOOL("AudioStreamingMedia"))
+ {
+ // disable controls if audio streaming media is disabled from preference
+ showDisabledControls();
+ }
+ else {
+ LLViewerMediaImpl* impl = LLViewerParcelMedia::getParcelMedia();
+ if (NULL == impl)
+ {
+ // Just means it hasn't started yet
+ showBasicControls(false, false, false, false, 0);
+ }
+ else if (impl->isMediaTimeBased())
+ {
+ showTimeBasedControls(impl->isMediaPlaying(),
+ false, // include_zoom
+ false, // is_zoomed
+ impl->getVolume() == 0.0,
+ impl->getVolume() );
+ }
+ else {
+ // non-time-based parcel media
+ showBasicControls(LLViewerMedia::isParcelMediaPlaying(),
+ false,
+ false,
+ impl->getVolume() == 0.0,
+ impl->getVolume());
+ }
+ }
+ }
+ else {
+ LLViewerMediaImpl* impl = LLViewerMedia::getMediaImplFromTextureID(selected_media_id);
+
+ if (NULL == impl || !gSavedSettings.getBOOL("AudioStreamingMedia"))
+ {
+ showDisabledControls();
+ }
+ else {
+ if (impl->isMediaTimeBased())
+ {
+ showTimeBasedControls(impl->isMediaPlaying(),
+ ! impl->isParcelMedia(), // include_zoom
+ LLViewerMediaFocus::getInstance()->isZoomed(),
+ impl->getVolume() == 0.0,
+ impl->getVolume());
+ }
+ else {
+ showBasicControls(!impl->isMediaDisabled(),
+ ! impl->isParcelMedia(), // include_zoom
+ LLViewerMediaFocus::getInstance()->isZoomed(),
+ impl->getVolume() == 0.0,
+ impl->getVolume());
+ }
+ }
+ }
+}
+
+void LLPanelNearByMedia::showBasicControls(bool playing, bool include_zoom, bool is_zoomed, bool muted, F32 volume)
+{
+ mStopCtrl->setVisible(playing);
+ mPlayCtrl->setVisible(!playing);
+ mPauseCtrl->setVisible(false);
+ mVolumeSliderCtrl->setVisible(true);
+ mMuteCtrl->setVisible(true);
+ mMuteBtn->setValue(muted);
+ mVolumeSlider->setValue(volume);
+ mZoomCtrl->setVisible(include_zoom && !is_zoomed);
+ mUnzoomCtrl->setVisible(include_zoom && is_zoomed);
+ mStopCtrl->setEnabled(true);
+ mZoomCtrl->setEnabled(true);
+}
+
+void LLPanelNearByMedia::showTimeBasedControls(bool playing, bool include_zoom, bool is_zoomed, bool muted, F32 volume)
+{
+ mStopCtrl->setVisible(true);
+ mPlayCtrl->setVisible(!playing);
+ mPauseCtrl->setVisible(playing);
+ mMuteCtrl->setVisible(true);
+ mVolumeSliderCtrl->setVisible(true);
+ mZoomCtrl->setVisible(include_zoom);
+ mZoomCtrl->setVisible(include_zoom && !is_zoomed);
+ mUnzoomCtrl->setVisible(include_zoom && is_zoomed);
+ mStopCtrl->setEnabled(true);
+ mZoomCtrl->setEnabled(true);
+ mMuteBtn->setValue(muted);
+ mVolumeSlider->setValue(volume);
+}
+
+void LLPanelNearByMedia::showDisabledControls()
+{
+ mStopCtrl->setVisible(true);
+ mPlayCtrl->setVisible(false);
+ mPauseCtrl->setVisible(false);
+ mMuteCtrl->setVisible(false);
+ mVolumeSliderCtrl->setVisible(false);
+ mZoomCtrl->setVisible(true);
+ mUnzoomCtrl->setVisible(false);
+ mStopCtrl->setEnabled(false);
+ mZoomCtrl->setEnabled(false);
+}
+
+void LLPanelNearByMedia::onClickSelectedMediaStop()
+{
+ setDisabled(mMediaList->getValue().asUUID(), true);
+}
+
+void LLPanelNearByMedia::onClickSelectedMediaPlay()
+{
+ LLUUID selected_media_id = mMediaList->getValue().asUUID();
+
+ // First enable it
+ setDisabled(selected_media_id, false);
+
+ // Special code to make play "unpause" if time-based and playing
+ if (selected_media_id != PARCEL_AUDIO_LIST_ITEM_UUID)
+ {
+ LLViewerMediaImpl *impl = (selected_media_id == PARCEL_MEDIA_LIST_ITEM_UUID) ?
+ ((LLViewerMediaImpl*)LLViewerParcelMedia::getParcelMedia()) : LLViewerMedia::getMediaImplFromTextureID(selected_media_id);
+ if (NULL != impl)
+ {
+ if (impl->isMediaTimeBased() && impl->isMediaPaused())
+ {
+ // Aha! It's really time-based media that's paused, so unpause
+ impl->play();
+ return;
+ }
+ else if (impl->isParcelMedia())
+ {
+ LLViewerParcelMedia::play(LLViewerParcelMgr::getInstance()->getAgentParcel());
+ }
+ }
+ }
+}
+
+void LLPanelNearByMedia::onClickSelectedMediaPause()
+{
+ LLUUID selected_media_id = mMediaList->getValue().asUUID();
+ if (selected_media_id == PARCEL_AUDIO_LIST_ITEM_UUID)
+ {
+ onClickParcelAudioPause();
+ }
+ else if (selected_media_id == PARCEL_MEDIA_LIST_ITEM_UUID)
+ {
+ onClickParcelMediaPause();
+ }
+ else {
+ LLViewerMediaImpl* impl = LLViewerMedia::getMediaImplFromTextureID(selected_media_id);
+ if (NULL != impl && impl->isMediaTimeBased() && impl->isMediaPlaying())
+ {
+ impl->pause();
+ }
+ }
+}
+
+void LLPanelNearByMedia::onClickSelectedMediaMute()
+{
+ LLUUID selected_media_id = mMediaList->getValue().asUUID();
+ if (selected_media_id == PARCEL_AUDIO_LIST_ITEM_UUID)
+ {
+ gSavedSettings.setBOOL("MuteMusic", mMuteBtn->getValue());
+ }
+ else {
+ LLViewerMediaImpl* impl = (selected_media_id == PARCEL_MEDIA_LIST_ITEM_UUID) ?
+ ((LLViewerMediaImpl*)LLViewerParcelMedia::getParcelMedia()) : LLViewerMedia::getMediaImplFromTextureID(selected_media_id);
+ if (NULL != impl)
+ {
+ F32 volume = impl->getVolume();
+ if(volume > 0.0)
+ {
+ impl->setVolume(0.0);
+ }
+ else if (mVolumeSlider->getValueF32() == 0.0)
+ {
+ impl->setVolume(1.0);
+ mVolumeSlider->setValue(1.0);
+ }
+ else
+ {
+ impl->setVolume(mVolumeSlider->getValueF32());
+ }
+ }
+ }
+}
+
+void LLPanelNearByMedia::onCommitSelectedMediaVolume()
+{
+ LLUUID selected_media_id = mMediaList->getValue().asUUID();
+ if (selected_media_id == PARCEL_AUDIO_LIST_ITEM_UUID)
+ {
+ F32 vol = mVolumeSlider->getValueF32();
+ gSavedSettings.setF32("AudioLevelMusic", vol);
+ }
+ else {
+ LLViewerMediaImpl* impl = (selected_media_id == PARCEL_MEDIA_LIST_ITEM_UUID) ?
+ ((LLViewerMediaImpl*)LLViewerParcelMedia::getParcelMedia()) : LLViewerMedia::getMediaImplFromTextureID(selected_media_id);
+ if (NULL != impl)
+ {
+ impl->setVolume(mVolumeSlider->getValueF32());
+ }
+ }
+}
+
+void LLPanelNearByMedia::onClickSelectedMediaZoom()
+{
+ LLUUID selected_media_id = mMediaList->getValue().asUUID();
+ if (selected_media_id == PARCEL_AUDIO_LIST_ITEM_UUID || selected_media_id == PARCEL_MEDIA_LIST_ITEM_UUID)
+ return;
+ LLViewerMediaFocus::getInstance()->focusZoomOnMedia(selected_media_id);
+}
+
+void LLPanelNearByMedia::onClickSelectedMediaUnzoom()
+{
+ LLViewerMediaFocus::getInstance()->unZoom();
+}
+
+
+// static
+void LLPanelNearByMedia::getNameAndUrlHelper(LLViewerMediaImpl* impl, std::string& name, std::string & url, const std::string &defaultName)
+{
+ if (NULL == impl) return;
+
+ name = impl->getName();
+ url = impl->getCurrentMediaURL(); // This is the URL the media impl actually has loaded
+ if (url.empty())
+ {
+ url = impl->getMediaEntryURL(); // This is the current URL from the media data
+ }
+ if (url.empty())
+ {
+ url = impl->getHomeURL(); // This is the home URL from the media data
+ }
+ if (name.empty())
+ {
+ name = url;
+ }
+ if (name.empty())
+ {
+ name = defaultName;
+ }
+}
+
diff --git a/indra/newview/llpanelnearbymedia.h b/indra/newview/llpanelnearbymedia.h
new file mode 100644
index 0000000000..3cecf8e40c
--- /dev/null
+++ b/indra/newview/llpanelnearbymedia.h
@@ -0,0 +1,189 @@
+/**
+ * @file llpanelnearbymedia.h
+ * @brief Management interface for muting and controlling nearby media
+ *
+ * $LicenseInfo:firstyear=2005&license=viewergpl$
+ *
+ * Copyright (c) 2005-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPANELNEARBYMEDIA_H
+#define LL_LLPANELNEARBYMEDIA_H
+
+#include "llpanel.h"
+
+class LLPanelNearbyMedia;
+class LLButton;
+class LLScrollListCtrl;
+class LLSlider;
+class LLSliderCtrl;
+class LLCheckBoxCtrl;
+class LLTextBox;
+class LLComboBox;
+class LLViewerMediaImpl;
+
+class LLPanelNearByMedia : public LLPanel
+{
+public:
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void draw();
+ /*virtual*/ void onMouseEnter(S32 x, S32 y, MASK mask);
+ /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
+ /*virtual*/ void onTopLost();
+ /*virtual*/ void handleVisibilityChange ( BOOL new_visibility );
+ /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent);
+ /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
+
+ // this is part of the nearby media *dialog* so we can track whether
+ // the user *implicitly* wants audio on or off via their *explicit*
+ // interaction with our buttons.
+ bool getParcelAudioAutoStart();
+
+ // callback for when the auto play media preference changes
+ // to update mParcelAudioAutoStart
+ void handleMediaAutoPlayChanged(const LLSD& newvalue);
+
+ LLPanelNearByMedia();
+ virtual ~LLPanelNearByMedia();
+
+private:
+
+ enum ColumnIndex {
+ CHECKBOX_COLUMN = 0,
+ PROXIMITY_COLUMN = 1,
+ VISIBILITY_COLUMN = 2,
+ CLASS_COLUMN = 3,
+ NAME_COLUMN = 4,
+ DEBUG_COLUMN = 5
+ };
+
+ // Media "class" enumeration
+ enum MediaClass {
+ MEDIA_CLASS_ALL = 0,
+ MEDIA_CLASS_FOCUSED = 1,
+ MEDIA_CLASS_WITHIN_PARCEL = 2,
+ MEDIA_CLASS_OUTSIDE_PARCEL = 3,
+ MEDIA_CLASS_ON_OTHERS = 4
+ };
+
+ // Add/remove an LLViewerMediaImpl to/from the list
+ LLScrollListItem* addListItem(const LLUUID &id);
+ void updateListItem(LLScrollListItem* item, LLViewerMediaImpl* impl);
+ void updateListItem(LLScrollListItem* item,
+ const std::string &item_name,
+ const std::string &item_tooltip,
+ S32 proximity,
+ bool is_disabled,
+ bool has_media,
+ bool is_time_based_and_playing,
+ MediaClass media_class,
+ const std::string &debug_str);
+ void removeListItem(const LLUUID &id);
+
+ // Refresh the list in the UI
+ void refreshList();
+
+ void refreshParcelItems();
+
+ // UI Callbacks
+ void onClickEnableAll();
+ void onClickDisableAll();
+ void onClickEnableParcelMedia();
+ void onClickDisableParcelMedia();
+ void onClickMuteParcelMedia();
+ void onParcelMediaVolumeSlider();
+ void onClickParcelMediaPlay();
+ void onClickParcelMediaStop();
+ void onClickParcelMediaPause();
+ void onClickParcelAudioPlay();
+ void onClickParcelAudioStop();
+ void onClickParcelAudioStart();
+ void onClickParcelAudioPause();
+ void onCheckAutoPlay();
+ void onAdvancedButtonClick();
+ void onMoreLess();
+
+ void onCheckItem(LLUICtrl* ctrl, const LLUUID &row_id);
+
+ static void onZoomMedia(void* user_data);
+
+private:
+ bool setDisabled(const LLUUID &id, bool disabled);
+
+ static void getNameAndUrlHelper(LLViewerMediaImpl* impl, std::string& name, std::string & url, const std::string &defaultName);
+
+ void updateColumns();
+
+ bool shouldShow(LLViewerMediaImpl* impl);
+
+ void showBasicControls(bool playing, bool include_zoom, bool is_zoomed, bool muted, F32 volume);
+ void showTimeBasedControls(bool playing, bool include_zoom, bool is_zoomed, bool muted, F32 volume);
+ void showDisabledControls();
+ void updateControls();
+
+ void onClickSelectedMediaStop();
+ void onClickSelectedMediaPlay();
+ void onClickSelectedMediaPause();
+ void onClickSelectedMediaMute();
+ void onCommitSelectedMediaVolume();
+ void onClickSelectedMediaZoom();
+ void onClickSelectedMediaUnzoom();
+
+ LLUICtrl* mNearbyMediaPanel;
+ LLScrollListCtrl* mMediaList;
+ LLUICtrl* mEnableAllCtrl;
+ LLUICtrl* mDisableAllCtrl;
+ LLComboBox* mShowCtrl;
+
+ // Dynamic (selection-dependent) controls
+ LLUICtrl* mStopCtrl;
+ LLUICtrl* mPlayCtrl;
+ LLUICtrl* mPauseCtrl;
+ LLUICtrl* mMuteCtrl;
+ LLUICtrl* mVolumeSliderCtrl;
+ LLUICtrl* mZoomCtrl;
+ LLUICtrl* mUnzoomCtrl;
+ LLSlider* mVolumeSlider;
+ LLButton* mMuteBtn;
+
+ bool mAllMediaDisabled;
+ bool mDebugInfoVisible;
+ bool mParcelAudioAutoStart;
+ std::string mEmptyNameString;
+ std::string mPlayingString;
+ std::string mParcelMediaName;
+ std::string mParcelAudioName;
+
+ LLRect mMoreRect;
+ LLRect mLessRect;
+ LLFrameTimer mHoverTimer;
+ LLScrollListItem* mParcelMediaItem;
+ LLScrollListItem* mParcelAudioItem;
+};
+
+
+#endif // LL_LLPANELNEARBYMEDIA_H
diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp
index e8ae006968..ca1361c84b 100644
--- a/indra/newview/llpanelobjectinventory.cpp
+++ b/indra/newview/llpanelobjectinventory.cpp
@@ -46,10 +46,12 @@
#include "roles_constants.h"
#include "llagent.h"
+#include "llavataractions.h"
#include "llcallbacklist.h"
-#include "llfloaterbuycurrency.h"
+#include "llbuycurrencyhtml.h"
#include "llfloaterreg.h"
#include "llinventorybridge.h"
+#include "llinventorydefines.h"
#include "llinventoryfilter.h"
#include "llinventoryfunctions.h"
#include "llpreviewanim.h"
@@ -81,16 +83,17 @@ protected:
mutable std::string mDisplayName;
LLPanelObjectInventory* mPanel;
U32 mFlags;
+ LLAssetType::EType mAssetType;
+ LLInventoryType::EType mInventoryType;
LLInventoryItem* findItem() const;
public:
- LLTaskInvFVBridge(
- LLPanelObjectInventory* panel,
- const LLUUID& uuid,
- const std::string& name,
- U32 flags=0);
- virtual ~LLTaskInvFVBridge( void ) {}
+ LLTaskInvFVBridge(LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name,
+ U32 flags=0);
+ virtual ~LLTaskInvFVBridge() {}
virtual LLFontGL::StyleFlags getLabelStyle() const { return LLFontGL::NORMAL; }
virtual std::string getLabelSuffix() const { return LLStringUtil::null; }
@@ -111,6 +114,7 @@ public:
virtual time_t getCreationDate() const;
virtual LLUIImagePtr getIcon() const;
virtual void openItem();
+ virtual BOOL canOpenItem() const { return FALSE; }
virtual void closeItem() {}
virtual void previewItem();
virtual void selectItem() {}
@@ -128,10 +132,12 @@ public:
virtual void pasteFromClipboard();
virtual void pasteLinkFromClipboard();
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
- virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action);
+ virtual void performAction(LLInventoryModel* model, std::string action);
virtual BOOL isUpToDate() const { return TRUE; }
virtual BOOL hasChildren() const { return FALSE; }
virtual LLInventoryType::EType getInventoryType() const { return LLInventoryType::IT_NONE; }
+ virtual LLWearableType::EType getWearableType() const { return LLWearableType::WT_NONE; }
+
// LLDragAndDropBridge functionality
virtual BOOL startDrag(EDragAndDropType* type, LLUUID* id) const;
virtual BOOL dragOrDrop(MASK mask, BOOL drop,
@@ -147,9 +153,16 @@ LLTaskInvFVBridge::LLTaskInvFVBridge(
mUUID(uuid),
mName(name),
mPanel(panel),
- mFlags(flags)
+ mFlags(flags),
+ mAssetType(LLAssetType::AT_NONE),
+ mInventoryType(LLInventoryType::IT_NONE)
{
-
+ const LLInventoryItem *item = findItem();
+ if (item)
+ {
+ mAssetType = item->getType();
+ mInventoryType = item->getInventoryType();
+ }
}
LLInventoryItem* LLTaskInvFVBridge::findItem() const
@@ -164,20 +177,7 @@ LLInventoryItem* LLTaskInvFVBridge::findItem() const
void LLTaskInvFVBridge::showProperties()
{
- LLSD key;
- key["object"] = mPanel->getTaskUUID();
- key["id"] = mUUID;
- LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
-
-
- // Disable old properties floater; this is replaced by the sidepanel.
- /*
- LLFloaterProperties* floater = LLFloaterReg::showTypedInstance<LLFloaterProperties>("properties", mUUID);
- if (floater)
- {
- floater->setObjectID(mPanel->getTaskUUID());
- }
- */
+ show_task_item_profile(mUUID, mPanel->getTaskUUID());
}
struct LLBuyInvItemData
@@ -343,13 +343,9 @@ time_t LLTaskInvFVBridge::getCreationDate() const
LLUIImagePtr LLTaskInvFVBridge::getIcon() const
{
- BOOL item_is_multi = FALSE;
- if ( mFlags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS )
- {
- item_is_multi = TRUE;
- }
+ const BOOL item_is_multi = (mFlags & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS);
- return get_item_icon(LLAssetType::AT_OBJECT, LLInventoryType::IT_OBJECT, 0, item_is_multi );
+ return LLInventoryIcon::getIcon(mAssetType, mInventoryType, 0, item_is_multi );
}
void LLTaskInvFVBridge::openItem()
@@ -369,8 +365,7 @@ BOOL LLTaskInvFVBridge::isItemRenameable() const
LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
if(object)
{
- LLInventoryItem* item;
- item = (LLInventoryItem*)(object->getInventoryObject(mUUID));
+ LLInventoryItem* item = (LLInventoryItem*)(object->getInventoryObject(mUUID));
if(item && gAgent.allowOperation(PERM_MODIFY, item->getPermissions(),
GP_OBJECT_MANIPULATE, GOD_LIKE))
{
@@ -595,7 +590,7 @@ BOOL LLTaskInvFVBridge::dragOrDrop(MASK mask, BOOL drop,
}
// virtual
-void LLTaskInvFVBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+void LLTaskInvFVBridge::performAction(LLInventoryModel* model, std::string action)
{
if (action == "task_buy")
{
@@ -609,7 +604,9 @@ void LLTaskInvFVBridge::performAction(LLFolderView* folder, LLInventoryModel* mo
{
if (price > 0 && price > gStatusBar->getBalance())
{
- LLFloaterBuyCurrency::buyCurrency("This costs", price);
+ LLStringUtil::format_map_t args;
+ args["AMOUNT"] = llformat("%d", price);
+ LLBuyCurrencyHTML::openCurrencyFloater( LLTrans::getString("this_costs", args), price );
}
else
{
@@ -671,7 +668,7 @@ void LLTaskInvFVBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
}
}
}
- else
+ else if (canOpenItem())
{
items.push_back(std::string("Task Open"));
if (!isItemCopyable())
@@ -717,6 +714,8 @@ public:
virtual BOOL dragOrDrop(MASK mask, BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data);
+ virtual BOOL canOpenItem() const { return TRUE; }
+ virtual void openItem();
};
LLTaskCategoryBridge::LLTaskCategoryBridge(
@@ -751,7 +750,8 @@ void LLTaskCategoryBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
{
std::vector<std::string> items;
std::vector<std::string> disabled_items;
- items.push_back(std::string("Task Open"));
+ items.push_back(std::string("--no options--"));
+ disabled_items.push_back(std::string("--no options--"));
hide_context_entries(menu, items, disabled_items);
}
@@ -762,6 +762,10 @@ BOOL LLTaskCategoryBridge::hasChildren() const
return FALSE;
}
+void LLTaskCategoryBridge::openItem()
+{
+}
+
BOOL LLTaskCategoryBridge::startDrag(EDragAndDropType* type, LLUUID* id) const
{
//llinfos << "LLTaskInvFVBridge::startDrag()" << llendl;
@@ -770,8 +774,8 @@ BOOL LLTaskCategoryBridge::startDrag(EDragAndDropType* type, LLUUID* id) const
LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
if(object)
{
- LLInventoryItem* inv = NULL;
- if((inv = (LLInventoryItem*)object->getInventoryObject(mUUID)))
+ const LLInventoryItem *inv = dynamic_cast<LLInventoryItem*>(object->getInventoryObject(mUUID));
+ if (inv)
{
const LLPermissions& perm = inv->getPermissions();
bool can_copy = gAgent.allowOperation(PERM_COPY, perm,
@@ -863,33 +867,15 @@ BOOL LLTaskCategoryBridge::dragOrDrop(MASK mask, BOOL drop,
class LLTaskTextureBridge : public LLTaskInvFVBridge
{
public:
- LLTaskTextureBridge(
- LLPanelObjectInventory* panel,
- const LLUUID& uuid,
- const std::string& name,
- LLInventoryType::EType it);
+ LLTaskTextureBridge(LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name) :
+ LLTaskInvFVBridge(panel, uuid, name) {}
- virtual LLUIImagePtr getIcon() const;
+ virtual BOOL canOpenItem() const { return TRUE; }
virtual void openItem();
-protected:
- LLInventoryType::EType mInventoryType;
};
-LLTaskTextureBridge::LLTaskTextureBridge(
- LLPanelObjectInventory* panel,
- const LLUUID& uuid,
- const std::string& name,
- LLInventoryType::EType it) :
- LLTaskInvFVBridge(panel, uuid, name),
- mInventoryType(it)
-{
-}
-
-LLUIImagePtr LLTaskTextureBridge::getIcon() const
-{
- return get_item_icon(LLAssetType::AT_TEXTURE, mInventoryType, 0, FALSE);
-}
-
void LLTaskTextureBridge::openItem()
{
llinfos << "LLTaskTextureBridge::openItem()" << llendl;
@@ -908,31 +894,18 @@ void LLTaskTextureBridge::openItem()
class LLTaskSoundBridge : public LLTaskInvFVBridge
{
public:
- LLTaskSoundBridge(
- LLPanelObjectInventory* panel,
- const LLUUID& uuid,
- const std::string& name);
+ LLTaskSoundBridge(LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name) :
+ LLTaskInvFVBridge(panel, uuid, name) {}
- virtual LLUIImagePtr getIcon() const;
+ virtual BOOL canOpenItem() const { return TRUE; }
virtual void openItem();
- virtual void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action);
+ virtual void performAction(LLInventoryModel* model, std::string action);
virtual void buildContextMenu(LLMenuGL& menu, U32 flags);
static void openSoundPreview(void* data);
};
-LLTaskSoundBridge::LLTaskSoundBridge(
- LLPanelObjectInventory* panel,
- const LLUUID& uuid,
- const std::string& name) :
- LLTaskInvFVBridge(panel, uuid, name)
-{
-}
-
-LLUIImagePtr LLTaskSoundBridge::getIcon() const
-{
- return get_item_icon(LLAssetType::AT_SOUND, LLInventoryType::IT_SOUND, 0, FALSE);
-}
-
void LLTaskSoundBridge::openItem()
{
openSoundPreview((void*)this);
@@ -952,7 +925,7 @@ void LLTaskSoundBridge::openSoundPreview(void* data)
}
// virtual
-void LLTaskSoundBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+void LLTaskSoundBridge::performAction(LLInventoryModel* model, std::string action)
{
if (action == "task_play")
{
@@ -962,7 +935,7 @@ void LLTaskSoundBridge::performAction(LLFolderView* folder, LLInventoryModel* mo
send_sound_trigger(item->getAssetUUID(), 1.0);
}
}
- LLTaskInvFVBridge::performAction(folder, model, action);
+ LLTaskInvFVBridge::performAction(model, action);
}
void LLTaskSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
@@ -1003,9 +976,8 @@ void LLTaskSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
}
}
}
- else
+ else if (canOpenItem())
{
- items.push_back(std::string("Task Open"));
if (!isItemCopyable())
{
disabled_items.push_back(std::string("Task Open"));
@@ -1034,28 +1006,12 @@ void LLTaskSoundBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
class LLTaskLandmarkBridge : public LLTaskInvFVBridge
{
public:
- LLTaskLandmarkBridge(
- LLPanelObjectInventory* panel,
- const LLUUID& uuid,
- const std::string& name);
-
- virtual LLUIImagePtr getIcon() const;
+ LLTaskLandmarkBridge(LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name) :
+ LLTaskInvFVBridge(panel, uuid, name) {}
};
-LLTaskLandmarkBridge::LLTaskLandmarkBridge(
- LLPanelObjectInventory* panel,
- const LLUUID& uuid,
- const std::string& name) :
- LLTaskInvFVBridge(panel, uuid, name)
-{
-}
-
-LLUIImagePtr LLTaskLandmarkBridge::getIcon() const
-{
- return get_item_icon(LLAssetType::AT_LANDMARK, LLInventoryType::IT_LANDMARK, 0, FALSE);
-}
-
-
///----------------------------------------------------------------------------
/// Class LLTaskCallingCardBridge
///----------------------------------------------------------------------------
@@ -1063,29 +1019,15 @@ LLUIImagePtr LLTaskLandmarkBridge::getIcon() const
class LLTaskCallingCardBridge : public LLTaskInvFVBridge
{
public:
- LLTaskCallingCardBridge(
- LLPanelObjectInventory* panel,
- const LLUUID& uuid,
- const std::string& name);
+ LLTaskCallingCardBridge(LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name) :
+ LLTaskInvFVBridge(panel, uuid, name) {}
- virtual LLUIImagePtr getIcon() const;
virtual BOOL isItemRenameable() const;
virtual BOOL renameItem(const std::string& new_name);
};
-LLTaskCallingCardBridge::LLTaskCallingCardBridge(
- LLPanelObjectInventory* panel,
- const LLUUID& uuid,
- const std::string& name) :
- LLTaskInvFVBridge(panel, uuid, name)
-{
-}
-
-LLUIImagePtr LLTaskCallingCardBridge::getIcon() const
-{
- return get_item_icon(LLAssetType::AT_CALLINGCARD, LLInventoryType::IT_CALLINGCARD, 0, FALSE);
-}
-
BOOL LLTaskCallingCardBridge::isItemRenameable() const
{
return FALSE;
@@ -1104,37 +1046,23 @@ BOOL LLTaskCallingCardBridge::renameItem(const std::string& new_name)
class LLTaskScriptBridge : public LLTaskInvFVBridge
{
public:
- LLTaskScriptBridge(
- LLPanelObjectInventory* panel,
- const LLUUID& uuid,
- const std::string& name);
+ LLTaskScriptBridge(LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name) :
+ LLTaskInvFVBridge(panel, uuid, name) {}
- virtual LLUIImagePtr getIcon() const;
//static BOOL enableIfCopyable( void* userdata );
};
-LLTaskScriptBridge::LLTaskScriptBridge(
- LLPanelObjectInventory* panel,
- const LLUUID& uuid,
- const std::string& name) :
- LLTaskInvFVBridge(panel, uuid, name)
-{
-}
-
-LLUIImagePtr LLTaskScriptBridge::getIcon() const
-{
- return get_item_icon(LLAssetType::AT_SCRIPT, LLInventoryType::IT_LSL, 0, FALSE);
-}
-
-
class LLTaskLSLBridge : public LLTaskScriptBridge
{
public:
- LLTaskLSLBridge(
- LLPanelObjectInventory* panel,
- const LLUUID& uuid,
- const std::string& name);
+ LLTaskLSLBridge(LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name) :
+ LLTaskScriptBridge(panel, uuid, name) {}
+ virtual BOOL canOpenItem() const { return TRUE; }
virtual void openItem();
virtual BOOL removeItem();
//virtual void buildContextMenu(LLMenuGL& menu);
@@ -1142,14 +1070,6 @@ public:
//static void copyToInventory(void* userdata);
};
-LLTaskLSLBridge::LLTaskLSLBridge(
- LLPanelObjectInventory* panel,
- const LLUUID& uuid,
- const std::string& name) :
- LLTaskScriptBridge(panel, uuid, name)
-{
-}
-
void LLTaskLSLBridge::openItem()
{
llinfos << "LLTaskLSLBridge::openItem() " << mUUID << llendl;
@@ -1185,33 +1105,13 @@ BOOL LLTaskLSLBridge::removeItem()
class LLTaskObjectBridge : public LLTaskInvFVBridge
{
public:
- LLTaskObjectBridge(
- LLPanelObjectInventory* panel,
- const LLUUID& uuid,
- const std::string& name);
-
- virtual LLUIImagePtr getIcon() const;
+ LLTaskObjectBridge(LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name,
+ U32 flags = 0) :
+ LLTaskInvFVBridge(panel, uuid, name, flags) {}
};
-LLTaskObjectBridge::LLTaskObjectBridge(
- LLPanelObjectInventory* panel,
- const LLUUID& uuid,
- const std::string& name) :
- LLTaskInvFVBridge(panel, uuid, name)
-{
-}
-
-LLUIImagePtr LLTaskObjectBridge::getIcon() const
-{
- BOOL item_is_multi = FALSE;
- if ( mFlags & LLInventoryItem::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS )
- {
- item_is_multi = TRUE;
- }
-
- return get_item_icon(LLAssetType::AT_OBJECT, LLInventoryType::IT_OBJECT, 0, item_is_multi);
-}
-
///----------------------------------------------------------------------------
/// Class LLTaskNotecardBridge
///----------------------------------------------------------------------------
@@ -1219,29 +1119,16 @@ LLUIImagePtr LLTaskObjectBridge::getIcon() const
class LLTaskNotecardBridge : public LLTaskInvFVBridge
{
public:
- LLTaskNotecardBridge(
- LLPanelObjectInventory* panel,
- const LLUUID& uuid,
- const std::string& name);
+ LLTaskNotecardBridge(LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name) :
+ LLTaskInvFVBridge(panel, uuid, name) {}
- virtual LLUIImagePtr getIcon() const;
+ virtual BOOL canOpenItem() const { return TRUE; }
virtual void openItem();
virtual BOOL removeItem();
};
-LLTaskNotecardBridge::LLTaskNotecardBridge(
- LLPanelObjectInventory* panel,
- const LLUUID& uuid,
- const std::string& name) :
- LLTaskInvFVBridge(panel, uuid, name)
-{
-}
-
-LLUIImagePtr LLTaskNotecardBridge::getIcon() const
-{
- return get_item_icon(LLAssetType::AT_NOTECARD, LLInventoryType::IT_NOTECARD, 0, FALSE);
-}
-
void LLTaskNotecardBridge::openItem()
{
LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
@@ -1272,29 +1159,16 @@ BOOL LLTaskNotecardBridge::removeItem()
class LLTaskGestureBridge : public LLTaskInvFVBridge
{
public:
- LLTaskGestureBridge(
- LLPanelObjectInventory* panel,
- const LLUUID& uuid,
- const std::string& name);
+ LLTaskGestureBridge(LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name) :
+ LLTaskInvFVBridge(panel, uuid, name) {}
- virtual LLUIImagePtr getIcon() const;
+ virtual BOOL canOpenItem() const { return TRUE; }
virtual void openItem();
virtual BOOL removeItem();
};
-LLTaskGestureBridge::LLTaskGestureBridge(
- LLPanelObjectInventory* panel,
- const LLUUID& uuid,
- const std::string& name) :
- LLTaskInvFVBridge(panel, uuid, name)
-{
-}
-
-LLUIImagePtr LLTaskGestureBridge::getIcon() const
-{
- return get_item_icon(LLAssetType::AT_GESTURE, LLInventoryType::IT_GESTURE, 0, FALSE);
-}
-
void LLTaskGestureBridge::openItem()
{
LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
@@ -1319,29 +1193,16 @@ BOOL LLTaskGestureBridge::removeItem()
class LLTaskAnimationBridge : public LLTaskInvFVBridge
{
public:
- LLTaskAnimationBridge(
- LLPanelObjectInventory* panel,
- const LLUUID& uuid,
- const std::string& name);
+ LLTaskAnimationBridge(LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name) :
+ LLTaskInvFVBridge(panel, uuid, name) {}
- virtual LLUIImagePtr getIcon() const;
+ virtual BOOL canOpenItem() const { return TRUE; }
virtual void openItem();
virtual BOOL removeItem();
};
-LLTaskAnimationBridge::LLTaskAnimationBridge(
- LLPanelObjectInventory* panel,
- const LLUUID& uuid,
- const std::string& name) :
- LLTaskInvFVBridge(panel, uuid, name)
-{
-}
-
-LLUIImagePtr LLTaskAnimationBridge::getIcon() const
-{
- return get_item_icon(LLAssetType::AT_ANIMATION, LLInventoryType::IT_ANIMATION, 0, FALSE);
-}
-
void LLTaskAnimationBridge::openItem()
{
LLViewerObject* object = gObjectList.findObject(mPanel->getTaskUUID());
@@ -1370,33 +1231,18 @@ BOOL LLTaskAnimationBridge::removeItem()
class LLTaskWearableBridge : public LLTaskInvFVBridge
{
public:
- LLTaskWearableBridge(
- LLPanelObjectInventory* panel,
- const LLUUID& uuid,
- const std::string& name,
- LLAssetType::EType asset_type,
- U32 flags);
+ LLTaskWearableBridge(LLPanelObjectInventory* panel,
+ const LLUUID& uuid,
+ const std::string& name,
+ U32 flags) :
+ LLTaskInvFVBridge(panel, uuid, name, flags) {}
virtual LLUIImagePtr getIcon() const;
-
-protected:
- LLAssetType::EType mAssetType;
};
-LLTaskWearableBridge::LLTaskWearableBridge(
- LLPanelObjectInventory* panel,
- const LLUUID& uuid,
- const std::string& name,
- LLAssetType::EType asset_type,
- U32 flags) :
- LLTaskInvFVBridge(panel, uuid, name, flags),
- mAssetType( asset_type )
-{
-}
-
LLUIImagePtr LLTaskWearableBridge::getIcon() const
{
- return get_item_icon(mAssetType, LLInventoryType::IT_WEARABLE, mFlags, FALSE );
+ return LLInventoryIcon::getIcon(mAssetType, mInventoryType, mFlags, FALSE );
}
@@ -1408,31 +1254,31 @@ LLTaskInvFVBridge* LLTaskInvFVBridge::createObjectBridge(LLPanelObjectInventory*
LLInventoryObject* object)
{
LLTaskInvFVBridge* new_bridge = NULL;
+ const LLInventoryItem* item = dynamic_cast<LLInventoryItem*>(object);
+ const U32 itemflags = ( NULL == item ? 0 : item->getFlags() );
LLAssetType::EType type = object->getType();
- LLInventoryItem* item = NULL;
+
switch(type)
{
case LLAssetType::AT_TEXTURE:
- item = (LLInventoryItem*)object;
new_bridge = new LLTaskTextureBridge(panel,
- object->getUUID(),
- object->getName(),
- item->getInventoryType());
+ object->getUUID(),
+ object->getName());
break;
case LLAssetType::AT_SOUND:
new_bridge = new LLTaskSoundBridge(panel,
- object->getUUID(),
- object->getName());
+ object->getUUID(),
+ object->getName());
break;
case LLAssetType::AT_LANDMARK:
new_bridge = new LLTaskLandmarkBridge(panel,
- object->getUUID(),
- object->getName());
+ object->getUUID(),
+ object->getName());
break;
case LLAssetType::AT_CALLINGCARD:
new_bridge = new LLTaskCallingCardBridge(panel,
- object->getUUID(),
- object->getName());
+ object->getUUID(),
+ object->getName());
break;
case LLAssetType::AT_SCRIPT:
// OLD SCRIPTS DEPRECATED - JC
@@ -1443,44 +1289,41 @@ LLTaskInvFVBridge* LLTaskInvFVBridge::createObjectBridge(LLPanelObjectInventory*
break;
case LLAssetType::AT_OBJECT:
new_bridge = new LLTaskObjectBridge(panel,
- object->getUUID(),
- object->getName());
+ object->getUUID(),
+ object->getName(),
+ itemflags);
break;
case LLAssetType::AT_NOTECARD:
new_bridge = new LLTaskNotecardBridge(panel,
- object->getUUID(),
- object->getName());
+ object->getUUID(),
+ object->getName());
break;
case LLAssetType::AT_ANIMATION:
new_bridge = new LLTaskAnimationBridge(panel,
- object->getUUID(),
- object->getName());
+ object->getUUID(),
+ object->getName());
break;
case LLAssetType::AT_GESTURE:
new_bridge = new LLTaskGestureBridge(panel,
- object->getUUID(),
- object->getName());
+ object->getUUID(),
+ object->getName());
break;
case LLAssetType::AT_CLOTHING:
case LLAssetType::AT_BODYPART:
- item = (LLInventoryItem*)object;
new_bridge = new LLTaskWearableBridge(panel,
- object->getUUID(),
- object->getName(),
- type,
- item->getFlags());
+ object->getUUID(),
+ object->getName(),
+ itemflags);
break;
case LLAssetType::AT_CATEGORY:
new_bridge = new LLTaskCategoryBridge(panel,
- object->getUUID(),
- object->getName());
+ object->getUUID(),
+ object->getName());
break;
case LLAssetType::AT_LSL_TEXT:
new_bridge = new LLTaskLSLBridge(panel,
- object->getUUID(),
- object->getName());
- break;
-
+ object->getUUID(),
+ object->getName());
break;
default:
llinfos << "Unhandled inventory type (llassetstorage.h): "
@@ -1517,6 +1360,7 @@ LLPanelObjectInventory::LLPanelObjectInventory(const LLPanelObjectInventory::Par
mCommitCallbackRegistrar.add("Inventory.DoCreate", boost::bind(&do_nothing));
mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&do_nothing));
mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&do_nothing));
+ mCommitCallbackRegistrar.add("Inventory.Share", boost::bind(&LLAvatarActions::shareWithAvatars));
}
// Destroys the object
@@ -1568,25 +1412,32 @@ void LLPanelObjectInventory::reset()
{
clearContents();
- setBorderVisible(FALSE);
+ //setBorderVisible(FALSE);
mCommitCallbackRegistrar.pushScope(); // push local callbacks
LLRect dummy_rect(0, 1, 1, 0);
LLFolderView::Params p;
p.name = "task inventory";
+ p.title = "task inventory";
p.task_id = getTaskUUID();
p.parent_panel = this;
- p.tool_tip= p.name;
+ p.tool_tip= LLTrans::getString("PanelContentsTooltip");
mFolders = LLUICtrlFactory::create<LLFolderView>(p);
// this ensures that we never say "searching..." or "no items found"
mFolders->getFilter()->setShowFolderState(LLInventoryFilter::SHOW_ALL_FOLDERS);
mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar);
+ if (hasFocus())
+ {
+ LLEditMenuHandler::gEditMenuHandler = mFolders;
+ }
+
LLRect scroller_rect(0, getRect().getHeight(), getRect().getWidth(), 0);
LLScrollContainer::Params scroll_p;
scroll_p.name("task inventory scroller");
scroll_p.rect(scroller_rect);
+ scroll_p.tab_stop(true);
scroll_p.follows.flags(FOLLOWS_ALL);
mScroller = LLUICtrlFactory::create<LLScrollContainer>(scroll_p);
addChild(mScroller);
@@ -1598,7 +1449,7 @@ void LLPanelObjectInventory::reset()
}
void LLPanelObjectInventory::inventoryChanged(LLViewerObject* object,
- InventoryObjectList* inventory,
+ LLInventoryObject::object_list_t* inventory,
S32 serial_num,
void* data)
{
@@ -1615,7 +1466,7 @@ void LLPanelObjectInventory::inventoryChanged(LLViewerObject* object,
// refresh any properties floaters that are hanging around.
if(inventory)
{
- for (InventoryObjectList::const_iterator iter = inventory->begin();
+ for (LLInventoryObject::object_list_t::const_iterator iter = inventory->begin();
iter != inventory->end(); )
{
LLInventoryObject* item = *iter++;
@@ -1636,9 +1487,9 @@ void LLPanelObjectInventory::updateInventory()
// We're still interested in this task's inventory.
std::set<LLUUID> selected_items;
BOOL inventory_has_focus = FALSE;
- if (mHaveInventory && mFolders->getNumSelectedDescendants())
+ if (mHaveInventory)
{
- mFolders->getSelectionList(selected_items);
+ selected_items = mFolders->getSelectionList();
inventory_has_focus = gFocusMgr.childHasKeyboardFocus(mFolders);
}
@@ -1648,7 +1499,7 @@ void LLPanelObjectInventory::updateInventory()
if (objectp)
{
LLInventoryObject* inventory_root = objectp->getInventoryRoot();
- InventoryObjectList contents;
+ LLInventoryObject::object_list_t contents;
objectp->getInventoryContents(contents);
if (inventory_root)
{
@@ -1702,7 +1553,7 @@ void LLPanelObjectInventory::updateInventory()
// leads to an N^2 based on the category count. This could be greatly
// speeded with an efficient multimap implementation, but we don't
// have that in our current arsenal.
-void LLPanelObjectInventory::createFolderViews(LLInventoryObject* inventory_root, InventoryObjectList& contents)
+void LLPanelObjectInventory::createFolderViews(LLInventoryObject* inventory_root, LLInventoryObject::object_list_t& contents)
{
if (!inventory_root)
{
@@ -1731,7 +1582,7 @@ void LLPanelObjectInventory::createFolderViews(LLInventoryObject* inventory_root
typedef std::pair<LLInventoryObject*, LLFolderViewFolder*> obj_folder_pair;
-void LLPanelObjectInventory::createViewsForCategory(InventoryObjectList* inventory,
+void LLPanelObjectInventory::createViewsForCategory(LLInventoryObject::object_list_t* inventory,
LLInventoryObject* parent,
LLFolderViewFolder* folder)
{
@@ -1740,8 +1591,8 @@ void LLPanelObjectInventory::createViewsForCategory(InventoryObjectList* invento
LLTaskInvFVBridge* bridge;
LLFolderViewItem* view;
- InventoryObjectList::iterator it = inventory->begin();
- InventoryObjectList::iterator end = inventory->end();
+ LLInventoryObject::object_list_t::iterator it = inventory->begin();
+ LLInventoryObject::object_list_t::iterator end = inventory->end();
for( ; it != end; ++it)
{
LLInventoryObject* obj = *it;
diff --git a/indra/newview/llpanelobjectinventory.h b/indra/newview/llpanelobjectinventory.h
index bc339ece35..d015929841 100644
--- a/indra/newview/llpanelobjectinventory.h
+++ b/indra/newview/llpanelobjectinventory.h
@@ -82,12 +82,12 @@ public:
protected:
void reset();
/*virtual*/ void inventoryChanged(LLViewerObject* object,
- InventoryObjectList* inventory,
+ LLInventoryObject::object_list_t* inventory,
S32 serial_num,
void* user_data);
void updateInventory();
- void createFolderViews(LLInventoryObject* inventory_root, InventoryObjectList& contents);
- void createViewsForCategory(InventoryObjectList* inventory,
+ void createFolderViews(LLInventoryObject* inventory_root, LLInventoryObject::object_list_t& contents);
+ void createViewsForCategory(LLInventoryObject::object_list_t* inventory,
LLInventoryObject* parent,
LLFolderViewFolder* folder);
void clearContents();
diff --git a/indra/newview/llpanelonlinestatus.cpp b/indra/newview/llpanelonlinestatus.cpp
new file mode 100644
index 0000000000..6ba015b11c
--- /dev/null
+++ b/indra/newview/llpanelonlinestatus.cpp
@@ -0,0 +1,60 @@
+/**
+ * @file llpanelonlinestatus.cpp
+ * @brief Represents a class of online status tip toast panels.
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llnotifications.h"
+#include "llpanelonlinestatus.h"
+
+LLPanelOnlineStatus::LLPanelOnlineStatus(
+ const LLNotificationPtr& notification) :
+ LLPanelTipToast(notification)
+{
+
+ LLUICtrlFactory::getInstance()->buildPanel(this,
+ "panel_online_status_toast.xml");
+
+
+ childSetValue("avatar_icon", notification->getPayload()["FROM_ID"]);
+ childSetValue("message", notification->getMessage());
+
+ if (notification->getPayload().has("respond_on_mousedown")
+ && notification->getPayload()["respond_on_mousedown"])
+ {
+ setMouseDownCallback(boost::bind(&LLNotification::respond,
+ notification, notification->getResponseTemplate()));
+ }
+
+ // set line max count to 3 in case of a very long name
+ snapToMessageHeight(getChild<LLTextBox> ("message"), 3);
+
+}
diff --git a/indra/newview/llpanelonlinestatus.h b/indra/newview/llpanelonlinestatus.h
new file mode 100644
index 0000000000..b47050c3a2
--- /dev/null
+++ b/indra/newview/llpanelonlinestatus.h
@@ -0,0 +1,53 @@
+/**
+ * @file llpanelonlinestatus.h
+ * @brief Represents a class of online status tip toast panels.
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+
+#include "llpaneltiptoast.h"
+
+#ifndef LL_PANELONLINESTATUS_H
+#define LL_PANELONLINESTATUS_H
+
+/**
+ * Represents online tip toast panel.
+ */
+class LLPanelOnlineStatus : public LLPanelTipToast
+{
+ // disallow instantiation of this class
+private:
+ // grant privileges to instantiate this class to LLToastPanel
+ friend class LLToastPanel;
+
+ LLPanelOnlineStatus(const LLNotificationPtr& notification);
+ virtual ~LLPanelOnlineStatus() {}
+};
+
+#endif /* LL_PANELONLINESTATUS_H */
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp
new file mode 100644
index 0000000000..5fac7efb84
--- /dev/null
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -0,0 +1,932 @@
+/**
+ * @file llpaneloutfitedit.cpp
+ * @brief Displays outfit edit information in Side Tray.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpaneloutfitedit.h"
+
+// *TODO: reorder includes to match the coding standard
+#include "llagent.h"
+#include "llagentcamera.h"
+#include "llagentwearables.h"
+#include "llappearancemgr.h"
+#include "lloutfitobserver.h"
+#include "llcofwearables.h"
+#include "llfilteredwearablelist.h"
+#include "llinventory.h"
+#include "llinventoryitemslist.h"
+#include "llviewercontrol.h"
+#include "llui.h"
+#include "llfloater.h"
+#include "llfloaterreg.h"
+#include "llinventoryfunctions.h"
+#include "llinventorypanel.h"
+#include "llviewermenu.h"
+#include "llviewerwindow.h"
+#include "llviewerinventory.h"
+#include "llbutton.h"
+#include "llcombobox.h"
+#include "llfiltereditor.h"
+#include "llfloaterinventory.h"
+#include "llinventorybridge.h"
+#include "llinventorymodel.h"
+#include "llinventorymodelbackgroundfetch.h"
+#include "llloadingindicator.h"
+#include "llpaneloutfitsinventory.h"
+#include "lluiconstants.h"
+#include "llsaveoutfitcombobtn.h"
+#include "llscrolllistctrl.h"
+#include "lltextbox.h"
+#include "lltrans.h"
+#include "lluictrlfactory.h"
+#include "llsdutil.h"
+#include "llsidepanelappearance.h"
+#include "lltoggleablemenu.h"
+#include "llwearablelist.h"
+#include "llwearableitemslist.h"
+#include "llwearabletype.h"
+#include "llweb.h"
+
+static LLRegisterPanelClassWrapper<LLPanelOutfitEdit> t_outfit_edit("panel_outfit_edit");
+
+const U64 WEARABLE_MASK = (1LL << LLInventoryType::IT_WEARABLE);
+const U64 ATTACHMENT_MASK = (1LL << LLInventoryType::IT_ATTACHMENT) | (1LL << LLInventoryType::IT_OBJECT);
+const U64 ALL_ITEMS_MASK = WEARABLE_MASK | ATTACHMENT_MASK;
+
+static const std::string REVERT_BTN("revert_btn");
+
+class LLShopURLDispatcher
+{
+public:
+ std::string resolveURL(LLWearableType::EType wearable_type, ESex sex);
+ std::string resolveURL(LLAssetType::EType asset_type, ESex sex);
+};
+
+std::string LLShopURLDispatcher::resolveURL(LLWearableType::EType wearable_type, ESex sex)
+{
+ const std::string prefix = "MarketplaceURL";
+ const std::string sex_str = (sex == SEX_MALE) ? "Male" : "Female";
+ const std::string type_str = LLWearableType::getTypeName(wearable_type);
+
+ std::string setting_name = prefix;
+
+ switch (wearable_type)
+ {
+ case LLWearableType::WT_ALPHA:
+ case LLWearableType::WT_NONE:
+ case LLWearableType::WT_INVALID: // just in case, this shouldn't happen
+ case LLWearableType::WT_COUNT: // just in case, this shouldn't happen
+ break;
+
+ default:
+ setting_name += '_';
+ setting_name += type_str;
+ setting_name += sex_str;
+ break;
+ }
+
+ return gSavedSettings.getString(setting_name);
+}
+
+std::string LLShopURLDispatcher::resolveURL(LLAssetType::EType asset_type, ESex sex)
+{
+ const std::string prefix = "MarketplaceURL";
+ const std::string sex_str = (sex == SEX_MALE) ? "Male" : "Female";
+ const std::string type_str = LLAssetType::lookup(asset_type);
+
+ std::string setting_name = prefix;
+
+ switch (asset_type)
+ {
+ case LLAssetType::AT_CLOTHING:
+ case LLAssetType::AT_OBJECT:
+ case LLAssetType::AT_BODYPART:
+ setting_name += '_';
+ setting_name += type_str;
+ setting_name += sex_str;
+ break;
+
+ // to suppress warnings
+ default:
+ break;
+ }
+
+ return gSavedSettings.getString(setting_name);
+}
+
+class LLPanelOutfitEditGearMenu
+{
+public:
+ static LLMenuGL* create()
+ {
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+
+ registrar.add("Wearable.Create", boost::bind(onCreate, _2));
+
+ LLMenuGL* menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>(
+ "menu_cof_gear.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance());
+ llassert(menu);
+ if (menu)
+ {
+ populateCreateWearableSubmenus(menu);
+ menu->buildDrawLabels();
+ }
+
+ return menu;
+ }
+
+private:
+ static void onCreate(const LLSD& param)
+ {
+ LLWearableType::EType type = LLWearableType::typeNameToType(param.asString());
+ if (type == LLWearableType::WT_NONE)
+ {
+ llwarns << "Invalid wearable type" << llendl;
+ return;
+ }
+
+ LLAgentWearables::createWearable(type, true);
+ }
+
+ // Populate the menu with items like "New Skin", "New Pants", etc.
+ static void populateCreateWearableSubmenus(LLMenuGL* menu)
+ {
+ LLView* menu_clothes = gMenuHolder->findChildView("COF.Gear.New_Clothes", FALSE);
+ LLView* menu_bp = gMenuHolder->findChildView("COF.Geear.New_Body_Parts", FALSE);
+
+ if (!menu_clothes || !menu_bp)
+ {
+ llassert(menu_clothes && menu_bp);
+ return;
+ }
+
+ for (U8 i = LLWearableType::WT_SHAPE; i != (U8) LLWearableType::WT_COUNT; ++i)
+ {
+ LLWearableType::EType type = (LLWearableType::EType) i;
+ const std::string& type_name = LLWearableType::getTypeName(type);
+
+ LLMenuItemCallGL::Params p;
+ p.name = type_name;
+ p.label = LLWearableType::getTypeDefaultNewName(type);
+ p.on_click.function_name = "Wearable.Create";
+ p.on_click.parameter = LLSD(type_name);
+
+ LLView* parent = LLWearableType::getAssetType(type) == LLAssetType::AT_CLOTHING ?
+ menu_clothes : menu_bp;
+ LLUICtrlFactory::create<LLMenuItemCallGL>(p, parent);
+ }
+ }
+};
+
+class LLCOFDragAndDropObserver : public LLInventoryAddItemByAssetObserver
+{
+public:
+ LLCOFDragAndDropObserver(LLInventoryModel* model);
+
+ virtual ~LLCOFDragAndDropObserver();
+
+ virtual void done();
+
+private:
+ LLInventoryModel* mModel;
+};
+
+inline LLCOFDragAndDropObserver::LLCOFDragAndDropObserver(LLInventoryModel* model):
+ mModel(model)
+{
+ if (model != NULL)
+ {
+ model->addObserver(this);
+ }
+}
+
+inline LLCOFDragAndDropObserver::~LLCOFDragAndDropObserver()
+{
+ if (mModel != NULL && mModel->containsObserver(this))
+ {
+ mModel->removeObserver(this);
+ }
+}
+
+void LLCOFDragAndDropObserver::done()
+{
+ LLAppearanceMgr::instance().updateAppearanceFromCOF();
+}
+
+LLPanelOutfitEdit::LLPanelOutfitEdit()
+: LLPanel(),
+ mSearchFilter(NULL),
+ mCOFWearables(NULL),
+ mInventoryItemsPanel(NULL),
+ mGearMenu(NULL),
+ mCOFDragAndDropObserver(NULL),
+ mInitialized(false),
+ mAddWearablesPanel(NULL),
+ mFolderViewFilterCmbBox(NULL),
+ mListViewFilterCmbBox(NULL)
+{
+ mSavedFolderState = new LLSaveFolderState();
+ mSavedFolderState->setApply(FALSE);
+
+
+ LLOutfitObserver& observer = LLOutfitObserver::instance();
+ observer.addBOFReplacedCallback(boost::bind(&LLPanelOutfitEdit::updateCurrentOutfitName, this));
+ observer.addBOFChangedCallback(boost::bind(&LLPanelOutfitEdit::updateVerbs, this));
+ observer.addOutfitLockChangedCallback(boost::bind(&LLPanelOutfitEdit::updateVerbs, this));
+ observer.addCOFChangedCallback(boost::bind(&LLPanelOutfitEdit::update, this));
+
+ gAgentWearables.addLoadingStartedCallback(boost::bind(&LLPanelOutfitEdit::onOutfitChanging, this, true));
+ gAgentWearables.addLoadedCallback(boost::bind(&LLPanelOutfitEdit::onOutfitChanging, this, false));
+
+ mFolderViewItemTypes.reserve(NUM_FOLDER_VIEW_ITEM_TYPES);
+ for (U32 i = 0; i < NUM_FOLDER_VIEW_ITEM_TYPES; i++)
+ {
+ mFolderViewItemTypes.push_back(LLLookItemType());
+ }
+
+}
+
+LLPanelOutfitEdit::~LLPanelOutfitEdit()
+{
+ delete mSavedFolderState;
+
+ delete mCOFDragAndDropObserver;
+
+ while (!mListViewItemTypes.empty()) {
+ delete mListViewItemTypes.back();
+ mListViewItemTypes.pop_back();
+ }
+}
+
+BOOL LLPanelOutfitEdit::postBuild()
+{
+ // gInventory.isInventoryUsable() no longer needs to be tested per Richard's fix for race conditions between inventory and panels
+
+ mFolderViewItemTypes[FVIT_ALL] = LLLookItemType(getString("Filter.All"), ALL_ITEMS_MASK);
+ mFolderViewItemTypes[FVIT_WEARABLE] = LLLookItemType(getString("Filter.Clothes/Body"), WEARABLE_MASK);
+ mFolderViewItemTypes[FVIT_ATTACHMENT] = LLLookItemType(getString("Filter.Objects"), ATTACHMENT_MASK);
+
+ //order is important, see EListViewItemType for order information
+ mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.All"), new LLFindByMask(ALL_ITEMS_MASK)));
+ mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.Clothing"), new LLIsType(LLAssetType::AT_CLOTHING)));
+ mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.Bodyparts"), new LLIsType(LLAssetType::AT_BODYPART)));
+ mListViewItemTypes.push_back(new LLFilterItem(getString("Filter.Objects"), new LLFindByMask(ATTACHMENT_MASK)));;
+ mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("shape"), new LLFindActualWearablesOfType(LLWearableType::WT_SHAPE)));
+ mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("skin"), new LLFindActualWearablesOfType(LLWearableType::WT_SKIN)));
+ mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("hair"), new LLFindActualWearablesOfType(LLWearableType::WT_HAIR)));
+ mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("eyes"), new LLFindActualWearablesOfType(LLWearableType::WT_EYES)));
+ mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("shirt"), new LLFindActualWearablesOfType(LLWearableType::WT_SHIRT)));
+ mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("pants"), new LLFindActualWearablesOfType(LLWearableType::WT_PANTS)));
+ mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("shoes"), new LLFindActualWearablesOfType(LLWearableType::WT_SHOES)));
+ mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("socks"), new LLFindActualWearablesOfType(LLWearableType::WT_SOCKS)));
+ mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("jacket"), new LLFindActualWearablesOfType(LLWearableType::WT_JACKET)));
+ mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("gloves"), new LLFindActualWearablesOfType(LLWearableType::WT_GLOVES)));
+ mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("undershirt"), new LLFindActualWearablesOfType(LLWearableType::WT_UNDERSHIRT)));
+ mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("underpants"), new LLFindActualWearablesOfType(LLWearableType::WT_UNDERPANTS)));
+ mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("skirt"), new LLFindActualWearablesOfType(LLWearableType::WT_SKIRT)));
+ mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("alpha"), new LLFindActualWearablesOfType(LLWearableType::WT_ALPHA)));
+ mListViewItemTypes.push_back(new LLFilterItem(LLTrans::getString("tattoo"), new LLFindActualWearablesOfType(LLWearableType::WT_TATTOO)));
+
+ mCurrentOutfitName = getChild<LLTextBox>("curr_outfit_name");
+ mStatus = getChild<LLTextBox>("status");
+
+ mFolderViewBtn = getChild<LLButton>("folder_view_btn");
+ mListViewBtn = getChild<LLButton>("list_view_btn");
+
+ childSetCommitCallback("filter_button", boost::bind(&LLPanelOutfitEdit::showWearablesFilter, this), NULL);
+ childSetCommitCallback("folder_view_btn", boost::bind(&LLPanelOutfitEdit::showWearablesFolderView, this), NULL);
+ childSetCommitCallback("list_view_btn", boost::bind(&LLPanelOutfitEdit::showWearablesListView, this), NULL);
+ childSetCommitCallback("wearables_gear_menu_btn", boost::bind(&LLPanelOutfitEdit::onGearButtonClick, this, _1), NULL);
+ childSetCommitCallback("gear_menu_btn", boost::bind(&LLPanelOutfitEdit::onGearButtonClick, this, _1), NULL);
+ childSetCommitCallback("shop_btn", boost::bind(&LLPanelOutfitEdit::onShopButtonClicked, this), NULL);
+
+ mCOFWearables = getChild<LLCOFWearables>("cof_wearables_list");
+ mCOFWearables->setCommitCallback(boost::bind(&LLPanelOutfitEdit::filterWearablesBySelectedItem, this));
+
+ mCOFWearables->getCOFCallbacks().mAddWearable = boost::bind(&LLPanelOutfitEdit::onAddWearableClicked, this);
+ mCOFWearables->getCOFCallbacks().mEditWearable = boost::bind(&LLPanelOutfitEdit::onEditWearableClicked, this);
+ mCOFWearables->getCOFCallbacks().mDeleteWearable = boost::bind(&LLPanelOutfitEdit::onRemoveFromOutfitClicked, this);
+ mCOFWearables->getCOFCallbacks().mMoveWearableCloser = boost::bind(&LLPanelOutfitEdit::moveWearable, this, true);
+ mCOFWearables->getCOFCallbacks().mMoveWearableFurther = boost::bind(&LLPanelOutfitEdit::moveWearable, this, false);
+
+ mAddWearablesPanel = getChild<LLPanel>("add_wearables_panel");
+
+ mInventoryItemsPanel = getChild<LLInventoryPanel>("folder_view");
+ mInventoryItemsPanel->setFilterTypes(ALL_ITEMS_MASK);
+ mInventoryItemsPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
+ mInventoryItemsPanel->setSelectCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this, _1, _2));
+ mInventoryItemsPanel->getRootFolder()->setReshapeCallback(boost::bind(&LLPanelOutfitEdit::onInventorySelectionChange, this, _1, _2));
+
+ mCOFDragAndDropObserver = new LLCOFDragAndDropObserver(mInventoryItemsPanel->getModel());
+
+ mFolderViewFilterCmbBox = getChild<LLComboBox>("folder_view_filter_combobox");
+ mFolderViewFilterCmbBox->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onFolderViewFilterCommitted, this, _1));
+ mFolderViewFilterCmbBox->removeall();
+ for (U32 i = 0; i < mFolderViewItemTypes.size(); ++i)
+ {
+ mFolderViewFilterCmbBox->add(mFolderViewItemTypes[i].displayName);
+ }
+ mFolderViewFilterCmbBox->setCurrentByIndex(FVIT_ALL);
+
+ mListViewFilterCmbBox = getChild<LLComboBox>("list_view_filter_combobox");
+ mListViewFilterCmbBox->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onListViewFilterCommitted, this, _1));
+ mListViewFilterCmbBox->removeall();
+ for (U32 i = 0; i < mListViewItemTypes.size(); ++i)
+ {
+ mListViewFilterCmbBox->add(mListViewItemTypes[i]->displayName);
+ }
+ mListViewFilterCmbBox->setCurrentByIndex(LVIT_ALL);
+
+ mSearchFilter = getChild<LLFilterEditor>("look_item_filter");
+ mSearchFilter->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onSearchEdit, this, _2));
+
+ childSetAction("show_add_wearables_btn", boost::bind(&LLPanelOutfitEdit::onAddMoreButtonClicked, this));
+
+ childSetAction("add_to_outfit_btn", boost::bind(&LLPanelOutfitEdit::onAddToOutfitClicked, this));
+
+ mEditWearableBtn = getChild<LLButton>("edit_wearable_btn");
+ mEditWearableBtn->setEnabled(FALSE);
+ mEditWearableBtn->setVisible(FALSE);
+ mEditWearableBtn->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onEditWearableClicked, this));
+
+ childSetAction(REVERT_BTN, boost::bind(&LLAppearanceMgr::wearBaseOutfit, LLAppearanceMgr::getInstance()));
+
+ mWearablesListViewPanel = getChild<LLPanel>("filtered_wearables_panel");
+ mWearableItemsList = getChild<LLInventoryItemsList>("list_view");
+
+ mSaveComboBtn.reset(new LLSaveOutfitComboBtn(this));
+ return TRUE;
+}
+
+// virtual
+void LLPanelOutfitEdit::onOpen(const LLSD& key)
+{
+ if (!mInitialized)
+ {
+ // *TODO: this method is called even panel is not visible to user because its parent layout panel is hidden.
+ // So, we can defer initializing a bit.
+ mWearableListManager = new LLFilteredWearableListManager(mWearableItemsList, mListViewItemTypes[LVIT_ALL]->collector);
+ mWearableListManager->populateList();
+ displayCurrentOutfit();
+ mInitialized = true;
+ }
+}
+
+void LLPanelOutfitEdit::moveWearable(bool closer_to_body)
+{
+ LLUUID item_id = mCOFWearables->getSelectedUUID();
+ if (item_id.isNull()) return;
+
+ LLViewerInventoryItem* wearable_to_move = gInventory.getItem(item_id);
+ LLAppearanceMgr::getInstance()->moveWearable(wearable_to_move, closer_to_body);
+}
+
+void LLPanelOutfitEdit::toggleAddWearablesPanel()
+{
+ BOOL current_visibility = mAddWearablesPanel->getVisible();
+ showAddWearablesPanel(!current_visibility);
+}
+
+void LLPanelOutfitEdit::showAddWearablesPanel(bool show_add_wearables)
+{
+ mAddWearablesPanel->setVisible(show_add_wearables);
+
+ childSetValue("show_add_wearables_btn", show_add_wearables);
+
+ updateFiltersVisibility();
+ childSetVisible("filter_button", show_add_wearables);
+
+ //search filter should be disabled
+ if (!show_add_wearables)
+ {
+ childSetValue("filter_button", false);
+
+ mFolderViewFilterCmbBox->setVisible(false);
+ mListViewFilterCmbBox->setVisible(false);
+
+ showWearablesFilter();
+ }
+
+ //switching button bars
+ childSetVisible("no_add_wearables_button_bar", !show_add_wearables);
+ childSetVisible("add_wearables_button_bar", show_add_wearables);
+}
+
+void LLPanelOutfitEdit::showWearablesFilter()
+{
+ bool filter_visible = childGetValue("filter_button");
+
+ childSetVisible("filter_panel", filter_visible);
+
+ if(!filter_visible)
+ {
+ mSearchFilter->clear();
+ onSearchEdit(LLStringUtil::null);
+ }
+}
+
+void LLPanelOutfitEdit::showWearablesListView()
+{
+ if(switchPanels(mInventoryItemsPanel, mWearablesListViewPanel))
+ {
+ mFolderViewBtn->setToggleState(FALSE);
+ mFolderViewBtn->setImageOverlay(getString("folder_view_off"), mFolderViewBtn->getImageOverlayHAlign());
+ mListViewBtn->setImageOverlay(getString("list_view_on"), mListViewBtn->getImageOverlayHAlign());
+ updateFiltersVisibility();
+ }
+ mListViewBtn->setToggleState(TRUE);
+}
+
+void LLPanelOutfitEdit::showWearablesFolderView()
+{
+ if(switchPanels(mWearablesListViewPanel, mInventoryItemsPanel))
+ {
+ mListViewBtn->setToggleState(FALSE);
+ mListViewBtn->setImageOverlay(getString("list_view_off"), mListViewBtn->getImageOverlayHAlign());
+ mFolderViewBtn->setImageOverlay(getString("folder_view_on"), mFolderViewBtn->getImageOverlayHAlign());
+ updateFiltersVisibility();
+ }
+ mFolderViewBtn->setToggleState(TRUE);
+}
+
+void LLPanelOutfitEdit::updateFiltersVisibility()
+{
+ mListViewFilterCmbBox->setVisible(mWearablesListViewPanel->getVisible());
+ mFolderViewFilterCmbBox->setVisible(mInventoryItemsPanel->getVisible());
+}
+
+void LLPanelOutfitEdit::onFolderViewFilterCommitted(LLUICtrl* ctrl)
+{
+ S32 curr_filter_type = mFolderViewFilterCmbBox->getCurrentIndex();
+ if (curr_filter_type < 0) return;
+
+ mInventoryItemsPanel->setFilterTypes(mFolderViewItemTypes[curr_filter_type].inventoryMask);
+
+ mSavedFolderState->setApply(TRUE);
+ mInventoryItemsPanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+
+ LLOpenFoldersWithSelection opener;
+ mInventoryItemsPanel->getRootFolder()->applyFunctorRecursively(opener);
+ mInventoryItemsPanel->getRootFolder()->scrollToShowSelection();
+
+ LLInventoryModelBackgroundFetch::instance().start();
+}
+
+void LLPanelOutfitEdit::onListViewFilterCommitted(LLUICtrl* ctrl)
+{
+ S32 curr_filter_type = mListViewFilterCmbBox->getCurrentIndex();
+ if (curr_filter_type < 0) return;
+
+ mWearableListManager->setFilterCollector(mListViewItemTypes[curr_filter_type]->collector);
+}
+
+void LLPanelOutfitEdit::onSearchEdit(const std::string& string)
+{
+ if (mSearchString != string)
+ {
+ mSearchString = string;
+
+ // Searches are case-insensitive
+ LLStringUtil::toUpper(mSearchString);
+ LLStringUtil::trimHead(mSearchString);
+ }
+
+ if (mSearchString == "")
+ {
+ mInventoryItemsPanel->setFilterSubString(LLStringUtil::null);
+ mWearableItemsList->setFilterSubString(LLStringUtil::null);
+ // re-open folders that were initially open
+ mSavedFolderState->setApply(TRUE);
+ mInventoryItemsPanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+ LLOpenFoldersWithSelection opener;
+ mInventoryItemsPanel->getRootFolder()->applyFunctorRecursively(opener);
+ mInventoryItemsPanel->getRootFolder()->scrollToShowSelection();
+ }
+
+ LLInventoryModelBackgroundFetch::instance().start();
+
+ if (mInventoryItemsPanel->getFilterSubString().empty() && mSearchString.empty())
+ {
+ // current filter and new filter empty, do nothing
+ return;
+ }
+
+ // save current folder open state if no filter currently applied
+ if (mInventoryItemsPanel->getRootFolder()->getFilterSubString().empty())
+ {
+ mSavedFolderState->setApply(FALSE);
+ mInventoryItemsPanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+ }
+
+ // set new filter string
+ mInventoryItemsPanel->setFilterSubString(mSearchString);
+ mWearableItemsList->setFilterSubString(mSearchString);
+
+}
+
+void LLPanelOutfitEdit::onAddToOutfitClicked(void)
+{
+ LLUUID selected_id;
+ if (mInventoryItemsPanel->getVisible())
+ {
+ LLFolderViewItem* curr_item = mInventoryItemsPanel->getRootFolder()->getCurSelectedItem();
+ if (!curr_item) return;
+
+ LLFolderViewEventListener* listenerp = curr_item->getListener();
+ if (!listenerp) return;
+
+ selected_id = listenerp->getUUID();
+ }
+ else if (mWearablesListViewPanel->getVisible())
+ {
+ selected_id = mWearableItemsList->getSelectedUUID();
+ }
+
+ if (selected_id.isNull()) return;
+
+ LLAppearanceMgr::getInstance()->wearItemOnAvatar(selected_id);
+}
+
+void LLPanelOutfitEdit::onAddWearableClicked(void)
+{
+ LLPanelDummyClothingListItem* item = dynamic_cast<LLPanelDummyClothingListItem*>(mCOFWearables->getSelectedItem());
+
+ if(item)
+ {
+ showFilteredWearablesListView(item->getWearableType());
+ }
+}
+
+void LLPanelOutfitEdit::onReplaceBodyPartMenuItemClicked(LLUUID selected_item_id)
+{
+ LLViewerInventoryItem* item = gInventory.getLinkedItem(selected_item_id);
+
+ if (item && item->getType() == LLAssetType::AT_BODYPART)
+ {
+ showFilteredWearablesListView(item->getWearableType());
+ }
+}
+
+void LLPanelOutfitEdit::onShopButtonClicked()
+{
+ static LLShopURLDispatcher url_resolver;
+
+ std::string url;
+ std::vector<LLPanel*> selected_items;
+ mCOFWearables->getSelectedItems(selected_items);
+
+ ESex sex = gSavedSettings.getU32("AvatarSex") ? SEX_MALE : SEX_FEMALE;
+
+ if (selected_items.size() == 1)
+ {
+ LLWearableType::EType type = LLWearableType::WT_NONE;
+ LLPanel* item = selected_items.front();
+
+ // LLPanelDummyClothingListItem is lower then LLPanelInventoryListItemBase in hierarchy tree
+ if (LLPanelDummyClothingListItem* dummy_item = dynamic_cast<LLPanelDummyClothingListItem*>(item))
+ {
+ type = dummy_item->getWearableType();
+ }
+ else if (LLPanelInventoryListItemBase* real_item = dynamic_cast<LLPanelInventoryListItemBase*>(item))
+ {
+ type = real_item->getWearableType();
+ }
+
+ // WT_INVALID comes for attachments
+ if (type != LLWearableType::WT_INVALID)
+ {
+ url = url_resolver.resolveURL(type, sex);
+ }
+ }
+
+ if (url.empty())
+ {
+ url = url_resolver.resolveURL(mCOFWearables->getExpandedAccordionAssetType(), sex);
+ }
+
+ LLWeb::loadURLExternal(url);
+}
+
+void LLPanelOutfitEdit::onRemoveFromOutfitClicked(void)
+{
+ LLUUID id_to_remove = mCOFWearables->getSelectedUUID();
+
+ LLAppearanceMgr::getInstance()->removeItemFromAvatar(id_to_remove);
+}
+
+
+void LLPanelOutfitEdit::onEditWearableClicked(void)
+{
+ LLUUID selected_item_id = mCOFWearables->getSelectedUUID();
+ if (selected_item_id.notNull())
+ {
+ gAgentWearables.editWearable(selected_item_id);
+ }
+}
+
+void LLPanelOutfitEdit::onInventorySelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action)
+{
+ LLFolderViewItem* current_item = mInventoryItemsPanel->getRootFolder()->getCurSelectedItem();
+ if (!current_item)
+ {
+ return;
+ }
+
+ LLViewerInventoryItem* item = current_item->getInventoryItem();
+ if (!item) return;
+
+ switch (item->getType())
+ {
+ case LLAssetType::AT_CLOTHING:
+ case LLAssetType::AT_BODYPART:
+ case LLAssetType::AT_OBJECT:
+ default:
+ break;
+ }
+
+ /* Removing add to look inline button (not part of mvp for viewer 2)
+ LLRect btn_rect(current_item->getLocalRect().mRight - 50,
+ current_item->getLocalRect().mTop,
+ current_item->getLocalRect().mRight - 30,
+ current_item->getLocalRect().mBottom);
+
+ mAddToLookBtn->setRect(btn_rect);
+ mAddToLookBtn->setEnabled(TRUE);
+ if (!mAddToLookBtn->getVisible())
+ {
+ mAddToLookBtn->setVisible(TRUE);
+ }
+
+ current_item->addChild(mAddToLookBtn); */
+}
+
+
+void LLPanelOutfitEdit::applyFolderViewFilter(EFolderViewItemType type)
+{
+ mFolderViewFilterCmbBox->setCurrentByIndex(type);
+ mFolderViewFilterCmbBox->onCommit();
+}
+
+void LLPanelOutfitEdit::applyListViewFilter(EListViewItemType type)
+{
+ mListViewFilterCmbBox->setCurrentByIndex(type);
+ mListViewFilterCmbBox->onCommit();
+}
+
+void LLPanelOutfitEdit::filterWearablesBySelectedItem(void)
+{
+ if (!mAddWearablesPanel->getVisible()) return;
+
+ uuid_vec_t ids;
+ mCOFWearables->getSelectedUUIDs(ids);
+
+ bool nothing_selected = ids.empty();
+ bool one_selected = ids.size() == 1;
+ bool more_than_one_selected = ids.size() > 1;
+ bool is_dummy_item = (ids.size() && dynamic_cast<LLPanelDummyClothingListItem*>(mCOFWearables->getSelectedItem()));
+
+ //resetting selection if no item is selected or than one item is selected
+ if (nothing_selected || more_than_one_selected)
+ {
+ if (nothing_selected)
+ {
+ showWearablesFolderView();
+ applyFolderViewFilter(FVIT_ALL);
+ }
+
+ if (more_than_one_selected)
+ {
+ showWearablesListView();
+ applyListViewFilter(LVIT_ALL);
+ }
+
+ return;
+ }
+
+
+ //filter wearables by a type represented by a dummy item
+ if (one_selected && is_dummy_item)
+ {
+ onAddWearableClicked();
+ return;
+ }
+
+ LLViewerInventoryItem* item = gInventory.getItem(ids[0]);
+ if (!item && ids[0].notNull())
+ {
+ //Inventory misses an item with non-zero id
+ showWearablesListView();
+ applyListViewFilter(LVIT_ALL);
+ return;
+ }
+
+ if (one_selected && !is_dummy_item)
+ {
+ if (item->isWearableType())
+ {
+ //single clothing or bodypart item is selected
+ showFilteredWearablesListView(item->getWearableType());
+ return;
+ }
+ else
+ {
+ //attachment is selected
+ showWearablesListView();
+ applyListViewFilter(LVIT_ATTACHMENT);
+ return;
+ }
+ }
+
+}
+
+
+
+void LLPanelOutfitEdit::update()
+{
+ mCOFWearables->refresh();
+
+ updateVerbs();
+}
+
+BOOL LLPanelOutfitEdit::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg)
+{
+ if (cargo_data == NULL)
+ {
+ llwarns << "cargo_data is NULL" << llendl;
+ return TRUE;
+ }
+
+ switch (cargo_type)
+ {
+ case DAD_BODYPART:
+ case DAD_CLOTHING:
+ case DAD_OBJECT:
+ case DAD_LINK:
+ *accept = ACCEPT_YES_MULTI;
+ break;
+ default:
+ *accept = ACCEPT_NO;
+ }
+
+ if (drop)
+ {
+ LLInventoryItem* item = static_cast<LLInventoryItem*>(cargo_data);
+
+ if (LLAssetType::lookupIsAssetIDKnowable(item->getType()))
+ {
+ mCOFDragAndDropObserver->watchAsset(item->getAssetUUID());
+
+ /*
+ * Adding request to wear item. If the item is a link, then getLinkedUUID() will
+ * return the ID of the linked item. Otherwise it will return the item's ID. The
+ * second argument is used to delay the appearance update until all dragged items
+ * are added to optimize user experience.
+ */
+ LLAppearanceMgr::instance().addCOFItemLink(item->getLinkedUUID(), false);
+ }
+ else
+ {
+ // if asset id is not available for the item we must wear it immediately (attachments only)
+ LLAppearanceMgr::instance().addCOFItemLink(item->getLinkedUUID(), true);
+ }
+ }
+
+ return TRUE;
+}
+
+void LLPanelOutfitEdit::displayCurrentOutfit()
+{
+ if (!getVisible())
+ {
+ setVisible(TRUE);
+ }
+
+ updateCurrentOutfitName();
+
+ update();
+}
+
+void LLPanelOutfitEdit::updateCurrentOutfitName()
+{
+ std::string current_outfit_name;
+ if (LLAppearanceMgr::getInstance()->getBaseOutfitName(current_outfit_name))
+ {
+ mCurrentOutfitName->setText(current_outfit_name);
+ }
+ else
+ {
+ mCurrentOutfitName->setText(getString("No Outfit"));
+ }
+}
+
+//private
+void LLPanelOutfitEdit::updateVerbs()
+{
+ bool outfit_is_dirty = LLAppearanceMgr::getInstance()->isOutfitDirty();
+ bool outfit_locked = LLAppearanceMgr::getInstance()->isOutfitLocked();
+ bool has_baseoutfit = LLAppearanceMgr::getInstance()->getBaseOutfitUUID().notNull();
+
+ mSaveComboBtn->setSaveBtnEnabled(!outfit_locked && outfit_is_dirty);
+ childSetEnabled(REVERT_BTN, outfit_is_dirty && has_baseoutfit);
+
+ mSaveComboBtn->setMenuItemEnabled("save_outfit", !outfit_locked && outfit_is_dirty);
+
+ mStatus->setText(outfit_is_dirty ? getString("unsaved_changes") : getString("now_editing"));
+
+ updateCurrentOutfitName();
+}
+
+bool LLPanelOutfitEdit::switchPanels(LLPanel* switch_from_panel, LLPanel* switch_to_panel)
+{
+ if(switch_from_panel && switch_to_panel && !switch_to_panel->getVisible())
+ {
+ switch_from_panel->setVisible(FALSE);
+ switch_to_panel->setVisible(TRUE);
+ return true;
+ }
+ return false;
+}
+
+void LLPanelOutfitEdit::onGearButtonClick(LLUICtrl* clicked_button)
+{
+ if(!mGearMenu)
+ {
+ mGearMenu = LLPanelOutfitEditGearMenu::create();
+ }
+
+ S32 menu_y = mGearMenu->getRect().getHeight() + clicked_button->getRect().getHeight();
+ LLMenuGL::showPopup(clicked_button, mGearMenu, 0, menu_y);
+}
+
+void LLPanelOutfitEdit::onAddMoreButtonClicked()
+{
+ toggleAddWearablesPanel();
+ filterWearablesBySelectedItem();
+}
+
+void LLPanelOutfitEdit::showFilteredWearablesListView(LLWearableType::EType type)
+{
+ showAddWearablesPanel(true);
+ showWearablesListView();
+
+ //e_list_view_item_type implicitly contains LLWearableType::EType starting from LVIT_SHAPE
+ applyListViewFilter((EListViewItemType) (LVIT_SHAPE + type));
+}
+
+static void update_status_widget_rect(LLView * widget, S32 right_border)
+{
+ LLRect rect = widget->getRect();
+ rect.mRight = right_border;
+
+ widget->setShape(rect);
+}
+
+void LLPanelOutfitEdit::onOutfitChanging(bool started)
+{
+ static LLLoadingIndicator* indicator = getChild<LLLoadingIndicator>("edit_outfit_loading_indicator");
+ static LLView* status_panel = getChild<LLView>("outfit_name_and_status");
+ static S32 indicator_delta = status_panel->getRect().getWidth() - indicator->getRect().mLeft;
+
+ S32 delta = started ? indicator_delta : 0;
+ S32 right_border = status_panel->getRect().getWidth() - delta;
+
+ update_status_widget_rect(mCurrentOutfitName, right_border);
+ update_status_widget_rect(mStatus, right_border);
+
+ indicator->setVisible(started);
+}
+
+// EOF
diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h
new file mode 100644
index 0000000000..484f3fcb9f
--- /dev/null
+++ b/indra/newview/llpaneloutfitedit.h
@@ -0,0 +1,229 @@
+/**
+ * @file llpaneloutfitedit.h
+ * @brief Displays outfit edit information in Side Tray.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2004-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPANELOUTFITEDIT_H
+#define LL_LLPANELOUTFITEDIT_H
+
+#include "llpanel.h"
+
+#include "v3dmath.h"
+#include "lluuid.h"
+
+#include "lliconctrl.h"
+
+#include "llremoteparcelrequest.h"
+#include "llinventory.h"
+#include "llinventoryfunctions.h"
+#include "llinventoryitemslist.h"
+#include "llinventorymodel.h"
+
+class LLButton;
+class LLCOFWearables;
+class LLComboBox;
+class LLTextBox;
+class LLInventoryCategory;
+class LLOutfitObserver;
+class LLCOFDragAndDropObserver;
+class LLInventoryPanel;
+class LLSaveFolderState;
+class LLFolderViewItem;
+class LLScrollListCtrl;
+class LLToggleableMenu;
+class LLFilterEditor;
+class LLFilteredWearableListManager;
+class LLMenuGL;
+class LLFindNonLinksByMask;
+class LLFindWearablesOfType;
+class LLSaveOutfitComboBtn;
+
+class LLPanelOutfitEdit : public LLPanel
+{
+ LOG_CLASS(LLPanelOutfitEdit);
+public:
+
+ // NOTE: initialize mFolderViewItemTypes at the index of any new enum you add in the LLPanelOutfitEdit() constructor
+ typedef enum e_folder_view_item_type
+ {
+ FVIT_ALL = 0,
+ FVIT_WEARABLE, // clothing or shape
+ FVIT_ATTACHMENT,
+ NUM_FOLDER_VIEW_ITEM_TYPES
+ } EFolderViewItemType;
+
+ //should reflect order from LLWearableType::EType
+ typedef enum e_list_view_item_type
+ {
+ LVIT_ALL = 0,
+ LVIT_CLOTHING,
+ LVIT_BODYPART,
+ LVIT_ATTACHMENT,
+ LVIT_SHAPE,
+ LVIT_SKIN,
+ LVIT_HAIR,
+ LVIT_EYES,
+ LVIT_SHIRT,
+ LVIT_PANTS,
+ LVIT_SHOES,
+ LVIT_SOCKS,
+ LVIT_JACKET,
+ LVIT_GLOVES,
+ LVIT_UNDERSHIRT,
+ LVIT_UNDERPANTS,
+ LVIT_SKIRT,
+ LVIT_ALPHA,
+ LVIT_TATTOO,
+ NUM_LIST_VIEW_ITEM_TYPES
+ } EListViewItemType;
+
+ struct LLLookItemType {
+ std::string displayName;
+ U64 inventoryMask;
+ LLLookItemType() : displayName("NONE"), inventoryMask(0) {}
+ LLLookItemType(std::string name, U64 mask) : displayName(name), inventoryMask(mask) {}
+ };
+
+ struct LLFilterItem {
+ std::string displayName;
+ LLInventoryCollectFunctor* collector;
+ LLFilterItem() : displayName("NONE"), collector(NULL) {}
+ LLFilterItem(std::string name, LLInventoryCollectFunctor* _collector) : displayName(name), collector(_collector) {}
+ ~LLFilterItem() { delete collector; }
+
+ //the struct is not supposed to by copied, either way the destructor kills collector
+ //LLPointer is not used as it requires LLInventoryCollectFunctor to extend LLRefCount what it doesn't do
+ private:
+ LLFilterItem(const LLFilterItem& filter_item) {};
+ };
+
+ LLPanelOutfitEdit();
+ /*virtual*/ ~LLPanelOutfitEdit();
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void onOpen(const LLSD& key);
+
+ void moveWearable(bool closer_to_body);
+
+ void toggleAddWearablesPanel();
+ void showAddWearablesPanel(bool show__add_wearables);
+
+ //following methods operate with "add wearables" panel
+ void showWearablesFilter();
+ void showWearablesListView();
+ void showWearablesFolderView();
+
+ void updateFiltersVisibility();
+
+ void onFolderViewFilterCommitted(LLUICtrl* ctrl);
+ void onListViewFilterCommitted(LLUICtrl* ctrl);
+ void onSearchEdit(const std::string& string);
+ void onInventorySelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
+ void onAddToOutfitClicked(void);
+
+ void applyFolderViewFilter(EFolderViewItemType type);
+ void applyListViewFilter(EListViewItemType type);
+
+ /**
+ * Filter items in views of Add Wearables Panel and show appropriate view depending on currently selected COF item(s)
+ * No COF items selected - shows the folder view, reset filter
+ * 1 COF item selected - shows the list view and filters wearables there by a wearable type of the selected item
+ * More than 1 COF item selected - shows the list view and filters it by a type of the selected item (attachment or clothing)
+ */
+ void filterWearablesBySelectedItem(void);
+
+ void onRemoveFromOutfitClicked(void);
+ void onEditWearableClicked(void);
+ void onAddWearableClicked(void);
+ void onReplaceBodyPartMenuItemClicked(LLUUID selected_item_id);
+ void onShopButtonClicked();
+
+ void displayCurrentOutfit();
+ void updateCurrentOutfitName();
+
+ void update();
+
+ void updateVerbs();
+ /**
+ * @brief Helper function. Shows one panel instead of another.
+ * If panels already switched does nothing and returns false.
+ * @param switch_from_panel panel to hide
+ * @param switch_to_panel panel to show
+ * @retun returns true if switching happened, false if not.
+ */
+ bool switchPanels(LLPanel* switch_from_panel, LLPanel* switch_to_panel);
+
+ virtual BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
+ EDragAndDropType cargo_type,
+ void* cargo_data,
+ EAcceptance* accept,
+ std::string& tooltip_msg);
+
+private:
+
+ void onGearButtonClick(LLUICtrl* clicked_button);
+ void onAddMoreButtonClicked();
+ void showFilteredWearablesListView(LLWearableType::EType type);
+ void onOutfitChanging(bool started);
+
+
+ LLTextBox* mCurrentOutfitName;
+ LLTextBox* mStatus;
+ LLInventoryPanel* mInventoryItemsPanel;
+ LLFilterEditor* mSearchFilter;
+ LLSaveFolderState* mSavedFolderState;
+ std::string mSearchString;
+ LLButton* mEditWearableBtn;
+ LLButton* mFolderViewBtn;
+ LLButton* mListViewBtn;
+ LLPanel* mAddWearablesPanel;
+
+ LLComboBox* mFolderViewFilterCmbBox;
+ LLComboBox* mListViewFilterCmbBox;
+
+ LLFilteredWearableListManager* mWearableListManager;
+ LLInventoryItemsList* mWearableItemsList;
+ LLPanel* mWearablesListViewPanel;
+
+ LLCOFDragAndDropObserver* mCOFDragAndDropObserver;
+
+ std::vector<LLLookItemType> mFolderViewItemTypes;
+ std::vector<LLFilterItem*> mListViewItemTypes;
+
+ LLCOFWearables* mCOFWearables;
+ LLMenuGL* mGearMenu;
+ bool mInitialized;
+ std::auto_ptr<LLSaveOutfitComboBtn> mSaveComboBtn;
+
+
+
+};
+
+#endif // LL_LLPANELOUTFITEDIT_H
diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp
index c2f2d32142..714d9cd4c5 100644
--- a/indra/newview/llpaneloutfitsinventory.cpp
+++ b/indra/newview/llpaneloutfitsinventory.cpp
@@ -42,11 +42,17 @@
#include "llfloaterworldmap.h"
#include "llfloaterinventory.h"
#include "llfoldervieweventlistener.h"
+#include "llinventorybridge.h"
#include "llinventoryfunctions.h"
+#include "llinventorymodelbackgroundfetch.h"
#include "llinventorypanel.h"
#include "lllandmark.h"
#include "lllineeditor.h"
#include "llmodaldialog.h"
+#include "llnotificationsutil.h"
+#include "lloutfitobserver.h"
+#include "lloutfitslist.h"
+#include "llsaveoutfitcombobtn.h"
#include "llsidepanelappearance.h"
#include "llsidetray.h"
#include "lltabcontainer.h"
@@ -65,97 +71,214 @@ static const std::string OUTFITS_TAB_NAME = "outfitslist_tab";
static const std::string COF_TAB_NAME = "cof_tab";
static LLRegisterPanelClassWrapper<LLPanelOutfitsInventory> t_inventory("panel_outfits_inventory");
-bool LLPanelOutfitsInventory::sShowDebugEditor = false;
-class LLOutfitSaveAsDialog : public LLModalDialog
+class LLOutfitListGearMenu
{
+public:
+ LLOutfitListGearMenu(LLOutfitsList* olist)
+ : mOutfitList(olist),
+ mMenu(NULL)
+ {
+ llassert_always(mOutfitList);
+
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+ LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
+
+ registrar.add("Gear.Wear", boost::bind(&LLOutfitListGearMenu::onWear, this));
+ registrar.add("Gear.TakeOff", boost::bind(&LLOutfitListGearMenu::onTakeOff, this));
+ registrar.add("Gear.Delete", boost::bind(&LLOutfitListGearMenu::onDelete, this));
+ registrar.add("Gear.Create", boost::bind(&LLOutfitListGearMenu::onCreate, this, _2));
+
+ enable_registrar.add("Gear.OnEnable", boost::bind(&LLOutfitListGearMenu::onEnable, this, _2));
+ enable_registrar.add("Gear.OnVisible", boost::bind(&LLOutfitListGearMenu::onVisible, this, _2));
+
+ mMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>(
+ "menu_outfit_gear.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+ llassert(mMenu);
+ }
+
+ LLMenuGL* getMenu() { return mMenu; }
+
+ void show(LLView* spawning_view)
+ {
+ if (!mMenu) return;
+
+ updateItemsVisibility();
+ mMenu->buildDrawLabels();
+ mMenu->updateParent(LLMenuGL::sMenuContainer);
+ S32 menu_x = 0;
+ S32 menu_y = spawning_view->getRect().getHeight() + mMenu->getRect().getHeight();
+ LLMenuGL::showPopup(spawning_view, mMenu, menu_x, menu_y);
+ }
+
+ void updateItemsVisibility()
+ {
+ if (!mMenu) return;
+
+ bool have_selection = getSelectedOutfitID().notNull();
+ mMenu->setItemVisible("sepatator1", have_selection);
+ mMenu->setItemVisible("sepatator2", have_selection);
+ mMenu->arrangeAndClear(); // update menu height
+ }
+
private:
- std::string mItemName;
- std::string mTempItemName;
-
- boost::signals2::signal<void (const std::string&)> mSaveAsSignal;
+ const LLUUID& getSelectedOutfitID()
+ {
+ return mOutfitList->getSelectedOutfitUUID();
+ }
-public:
- LLOutfitSaveAsDialog( const LLSD& key )
- : LLModalDialog( key ),
- mTempItemName(key.asString())
+ LLViewerInventoryCategory* getSelectedOutfit()
+ {
+ const LLUUID& selected_outfit_id = getSelectedOutfitID();
+ if (selected_outfit_id.isNull())
+ {
+ return NULL;
+ }
+
+ LLViewerInventoryCategory* cat = gInventory.getCategory(selected_outfit_id);
+ return cat;
+ }
+
+ void onWear()
{
+ LLViewerInventoryCategory* selected_outfit = getSelectedOutfit();
+ if (selected_outfit)
+ {
+ LLAppearanceMgr::instance().wearInventoryCategory(
+ selected_outfit, /*copy=*/ FALSE, /*append=*/ FALSE);
+ }
}
-
- BOOL postBuild()
+
+ void onTakeOff()
{
- getChild<LLUICtrl>("Save")->setCommitCallback(boost::bind(&LLOutfitSaveAsDialog::onSave, this ));
- getChild<LLUICtrl>("Cancel")->setCommitCallback(boost::bind(&LLOutfitSaveAsDialog::onCancel, this ));
-
- childSetTextArg("name ed", "[DESC]", mTempItemName);
- return TRUE;
+ const LLUUID& selected_outfit_id = getSelectedOutfitID();
+ if (selected_outfit_id.notNull())
+ {
+ LLAppearanceMgr::instance().takeOffOutfit(selected_outfit_id);
+ }
}
- void setSaveAsCommit( const boost::signals2::signal<void (const std::string&)>::slot_type& cb )
+ void onDelete()
{
- mSaveAsSignal.connect(cb);
+ const LLUUID& selected_outfit_id = getSelectedOutfitID();
+ if (selected_outfit_id.notNull())
+ {
+ remove_category(&gInventory, selected_outfit_id);
+ }
}
- virtual void onOpen(const LLSD& key)
+ void onCreate(const LLSD& data)
{
- LLLineEditor* edit = getChild<LLLineEditor>("name ed");
- if (edit)
+ LLWearableType::EType type = LLWearableType::typeNameToType(data.asString());
+ if (type == LLWearableType::WT_NONE)
{
- edit->setFocus(TRUE);
- edit->selectAll();
+ llwarns << "Invalid wearable type" << llendl;
+ return;
}
+
+ LLAgentWearables::createWearable(type, true);
}
- void onSave()
+ bool onEnable(LLSD::String param)
{
- mItemName = childGetValue("name ed").asString();
- LLStringUtil::trim(mItemName);
- if( !mItemName.empty() )
+ const LLUUID& selected_outfit_id = getSelectedOutfitID();
+ if (selected_outfit_id.isNull()) // no selection or invalid outfit selected
{
- mSaveAsSignal(mItemName);
- closeFloater(); // destroys this object
+ return false;
}
+
+ if ("delete" == param)
+ {
+ return LLAppearanceMgr::instance().getCanRemoveOutfit(selected_outfit_id);
+ }
+ else if ("take_off" == param)
+ {
+ return LLAppearanceMgr::getCanRemoveFromCOF(selected_outfit_id);
+ }
+
+ return true;
}
- void onCancel()
+ bool onVisible(LLSD::String param)
{
- closeFloater(); // destroys this object
+ const LLUUID& selected_outfit_id = getSelectedOutfitID();
+ if (selected_outfit_id.isNull()) // no selection or invalid outfit selected
+ {
+ return false;
+ }
+
+ bool is_worn = LLAppearanceMgr::instance().getBaseOutfitUUID() == selected_outfit_id;
+
+ if ("wear" == param)
+ {
+ return !is_worn;
+ }
+
+ return true;
}
+
+ LLOutfitsList* mOutfitList;
+ LLMenuGL* mMenu;
};
-
+
LLPanelOutfitsInventory::LLPanelOutfitsInventory() :
- mActivePanel(NULL),
- mParent(NULL)
+ mMyOutfitsPanel(NULL),
+ mCurrentOutfitPanel(NULL),
+ mGearMenu(NULL),
+ mInitialized(false)
{
mSavedFolderState = new LLSaveFolderState();
mSavedFolderState->setApply(FALSE);
+ gAgentWearables.addLoadedCallback(boost::bind(&LLPanelOutfitsInventory::onWearablesLoaded, this));
+ gAgentWearables.addLoadingStartedCallback(boost::bind(&LLPanelOutfitsInventory::onWearablesLoading, this));
- static bool registered_dialog = false;
- if (!registered_dialog)
- {
- LLFloaterReg::add("outfit_save_as", "floater_outfit_save_as.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLOutfitSaveAsDialog>);
- registered_dialog = true;
- }
+ LLOutfitObserver& observer = LLOutfitObserver::instance();
+ observer.addBOFChangedCallback(boost::bind(&LLPanelOutfitsInventory::updateVerbs, this));
+ observer.addCOFChangedCallback(boost::bind(&LLPanelOutfitsInventory::updateVerbs, this));
+ observer.addOutfitLockChangedCallback(boost::bind(&LLPanelOutfitsInventory::updateVerbs, this));
}
LLPanelOutfitsInventory::~LLPanelOutfitsInventory()
{
+ delete mGearMenu;
delete mSavedFolderState;
}
// virtual
BOOL LLPanelOutfitsInventory::postBuild()
{
- sShowDebugEditor = gSavedSettings.getBOOL("ShowDebugAppearanceEditor");
initTabPanels();
initListCommandsHandlers();
+ // Fetch your outfits folder so that the links are in memory.
+ // ( This is only necessary if we want to show a warning if a user deletes an item that has a
+ // a link in an outfit, see "ConfirmItemDeleteHasLinks". )
+ const LLUUID &outfits_cat = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTFIT, false);
+ if (outfits_cat.notNull())
+ {
+ LLInventoryModelBackgroundFetch::instance().start(outfits_cat);
+ }
+
+ mSaveComboBtn.reset(new LLSaveOutfitComboBtn(this, true));
+
return TRUE;
}
// virtual
void LLPanelOutfitsInventory::onOpen(const LLSD& key)
{
+ if (!mInitialized)
+ {
+ LLSidepanelAppearance* panel_appearance = getAppearanceSP();
+ if (panel_appearance)
+ {
+ // *TODO: move these methods to LLPanelOutfitsInventory?
+ panel_appearance->fetchInventory();
+ panel_appearance->refreshCurrentOutfitName();
+ }
+ mInitialized = true;
+ }
+
// Make sure we know which tab is selected, update the filter,
// and update verbs.
onTabChange();
@@ -184,30 +307,27 @@ void LLPanelOutfitsInventory::onOpen(const LLSD& key)
void LLPanelOutfitsInventory::updateVerbs()
{
- if (mParent)
- {
- mParent->updateVerbs();
- }
-
if (mListCommands)
{
- mListCommands->childSetVisible("look_edit_btn",sShowDebugEditor);
updateListCommands();
}
}
-void LLPanelOutfitsInventory::setParent(LLSidepanelAppearance* parent)
-{
- mParent = parent;
-}
-
// virtual
void LLPanelOutfitsInventory::onSearchEdit(const std::string& string)
{
mFilterSubString = string;
+
+ // TODO: add handling "My Outfits" tab.
+ if (!isCOFPanelActive())
+ {
+ mMyOutfitsPanel->setFilterSubString(string);
+ return;
+ }
+
if (string == "")
{
- mActivePanel->setFilterSubString(LLStringUtil::null);
+ getActivePanel()->setFilterSubString(LLStringUtil::null);
// re-open folders that were initially open
mSavedFolderState->setApply(TRUE);
@@ -217,9 +337,9 @@ void LLPanelOutfitsInventory::onSearchEdit(const std::string& string)
getRootFolder()->scrollToShowSelection();
}
- gInventory.startBackgroundFetch();
+ LLInventoryModelBackgroundFetch::instance().start();
- if (mActivePanel->getFilterSubString().empty() && string.empty())
+ if (getActivePanel()->getFilterSubString().empty() && string.empty())
{
// current filter and new filter empty, do nothing
return;
@@ -233,24 +353,42 @@ void LLPanelOutfitsInventory::onSearchEdit(const std::string& string)
}
// set new filter string
- mActivePanel->setFilterSubString(string);
+ getActivePanel()->setFilterSubString(string);
}
void LLPanelOutfitsInventory::onWearButtonClick()
{
- LLFolderViewEventListener* listenerp = getCorrectListenerForAction();
- if (listenerp)
+ // TODO: Remove if/else, add common interface
+ // for "My Outfits" and "Wearing" tabs.
+ if (!isCOFPanelActive())
+ {
+ mMyOutfitsPanel->performAction("replaceoutfit");
+ }
+ else
{
- listenerp->performAction(NULL, NULL,"replaceoutfit");
+ LLFolderViewEventListener* listenerp = getCorrectListenerForAction();
+ if (listenerp)
+ {
+ listenerp->performAction(NULL, "replaceoutfit");
+ }
}
}
void LLPanelOutfitsInventory::onAdd()
{
- LLFolderViewEventListener* listenerp = getCorrectListenerForAction();
- if (listenerp)
+ // TODO: Remove if/else, add common interface
+ // for "My Outfits" and "Wearing" tabs.
+ if (!isCOFPanelActive())
+ {
+ mMyOutfitsPanel->performAction("addtooutfit");
+ }
+ else
{
- listenerp->performAction(NULL, NULL,"addtooutfit");
+ LLFolderViewEventListener* listenerp = getCorrectListenerForAction();
+ if (listenerp)
+ {
+ listenerp->performAction(NULL, "addtooutfit");
+ }
}
}
@@ -259,7 +397,7 @@ void LLPanelOutfitsInventory::onRemove()
LLFolderViewEventListener* listenerp = getCorrectListenerForAction();
if (listenerp)
{
- listenerp->performAction(NULL, NULL,"removefromoutfit");
+ listenerp->performAction(NULL, "removefromoutfit");
}
}
@@ -267,37 +405,70 @@ void LLPanelOutfitsInventory::onEdit()
{
}
+bool LLPanelOutfitsInventory::onSaveCommit(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if (0 == option)
+ {
+ std::string outfit_name = response["message"].asString();
+ LLStringUtil::trim(outfit_name);
+ if( !outfit_name.empty() )
+ {
+ LLUUID outfit_folder = LLAppearanceMgr::getInstance()->makeNewOutfitLinks(outfit_name);
+
+ LLSidepanelAppearance* panel_appearance = getAppearanceSP();
+ if (panel_appearance)
+ {
+ panel_appearance->showOutfitsInventoryPanel();
+ }
+
+ if (mAppearanceTabs)
+ {
+ mAppearanceTabs->selectTabByName(OUTFITS_TAB_NAME);
+ }
+ }
+ }
+
+ return false;
+}
+
+
+
void LLPanelOutfitsInventory::onSave()
{
std::string outfit_name;
- if (!LLAppearanceManager::getInstance()->getBaseOutfitName(outfit_name))
+ if (!LLAppearanceMgr::getInstance()->getBaseOutfitName(outfit_name))
{
outfit_name = LLViewerFolderType::lookupNewCategoryName(LLFolderType::FT_OUTFIT);
}
+ LLSD args;
+ args["DESC"] = outfit_name;
+
+ LLSD payload;
+ //payload["ids"].append(*it);
+
+ LLNotificationsUtil::add("SaveOutfitAs", args, payload, boost::bind(&LLPanelOutfitsInventory::onSaveCommit, this, _1, _2));
+
+ //)
+
+/*
LLOutfitSaveAsDialog* save_as_dialog = LLFloaterReg::showTypedInstance<LLOutfitSaveAsDialog>("outfit_save_as", LLSD(outfit_name), TRUE);
if (save_as_dialog)
{
save_as_dialog->setSaveAsCommit(boost::bind(&LLPanelOutfitsInventory::onSaveCommit, this, _1 ));
- }
-}
-
-void LLPanelOutfitsInventory::onSaveCommit(const std::string& outfit_name)
-{
- LLUUID outfit_folder = gAgentWearables.makeNewOutfitLinks(outfit_name);
- LLSD key;
- LLSideTray::getInstance()->showPanel("panel_outfits_inventory", key);
-
- if (mAppearanceTabs)
- {
- mAppearanceTabs->selectTabByName(OUTFITS_TAB_NAME);
- }
+ }*/
}
void LLPanelOutfitsInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action)
{
updateVerbs();
+
+ // TODO: add handling "My Outfits" tab.
+ if (!isCOFPanelActive())
+ return;
+
if (getRootFolder()->needsAutoRename() && items.size())
{
getRootFolder()->startRenamingSelectedItem();
@@ -305,23 +476,12 @@ void LLPanelOutfitsInventory::onSelectionChange(const std::deque<LLFolderViewIte
}
}
-void LLPanelOutfitsInventory::onSelectorButtonClicked()
-{
- LLFolderViewItem* cur_item = getRootFolder()->getCurSelectedItem();
-
- LLFolderViewEventListener* listenerp = cur_item->getListener();
- if (getIsCorrectType(listenerp))
- {
- LLSD key;
- key["type"] = "look";
- key["id"] = listenerp->getUUID();
-
- LLSideTray::getInstance()->showPanel("sidepanel_appearance", key);
- }
-}
-
LLFolderViewEventListener *LLPanelOutfitsInventory::getCorrectListenerForAction()
{
+ // TODO: add handling "My Outfits" tab.
+ if (!isCOFPanelActive())
+ return NULL;
+
LLFolderViewItem* current_item = getRootFolder()->getCurSelectedItem();
if (!current_item)
return NULL;
@@ -349,7 +509,13 @@ bool LLPanelOutfitsInventory::getIsCorrectType(const LLFolderViewEventListener *
LLFolderView *LLPanelOutfitsInventory::getRootFolder()
{
- return mActivePanel->getRootFolder();
+ return getActivePanel()->getRootFolder();
+}
+
+//static
+LLPanelOutfitsInventory* LLPanelOutfitsInventory::findInstance()
+{
+ return dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory"));
}
//////////////////////////////////////////////////////////////////////////////////
@@ -359,13 +525,10 @@ void LLPanelOutfitsInventory::initListCommandsHandlers()
{
mListCommands = getChild<LLPanel>("bottom_panel");
- mListCommands->childSetAction("options_gear_btn", boost::bind(&LLPanelOutfitsInventory::onGearButtonClick, this));
+ mListCommands->childSetAction("options_gear_btn", boost::bind(&LLPanelOutfitsInventory::showGearMenu, this));
mListCommands->childSetAction("trash_btn", boost::bind(&LLPanelOutfitsInventory::onTrashButtonClick, 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
@@ -373,48 +536,28 @@ void LLPanelOutfitsInventory::initListCommandsHandlers()
, _7 // EAcceptance* accept
));
- mCommitCallbackRegistrar.add("panel_outfits_inventory_gear_default.Custom.Action",
- boost::bind(&LLPanelOutfitsInventory::onCustomAction, this, _2));
- mEnableCallbackRegistrar.add("panel_outfits_inventory_gear_default.Enable",
- boost::bind(&LLPanelOutfitsInventory::isActionEnabled, this, _2));
- mMenuGearDefault = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("panel_outfits_inventory_gear_default.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+ mGearMenu = new LLOutfitListGearMenu(mMyOutfitsPanel);
}
void LLPanelOutfitsInventory::updateListCommands()
{
bool trash_enabled = isActionEnabled("delete");
- bool wear_enabled = isActionEnabled("wear");
- bool make_outfit_enabled = isActionEnabled("make_outfit");
+ bool wear_enabled = !gAgentWearables.isCOFChangeInProgress() && isActionEnabled("wear");
+ bool wear_visible = !isCOFPanelActive();
+ bool make_outfit_enabled = isActionEnabled("save_outfit");
mListCommands->childSetEnabled("trash_btn", trash_enabled);
mListCommands->childSetEnabled("wear_btn", wear_enabled);
- mListCommands->childSetVisible("wear_btn", wear_enabled);
- mListCommands->childSetEnabled("make_outfit_btn", make_outfit_enabled);
-}
-
-void LLPanelOutfitsInventory::onGearButtonClick()
-{
- showActionMenu(mMenuGearDefault,"options_gear_btn");
+ mListCommands->childSetVisible("wear_btn", wear_visible);
+ mSaveComboBtn->setMenuItemEnabled("save_outfit", make_outfit_enabled);
}
-void LLPanelOutfitsInventory::onAddButtonClick()
+void LLPanelOutfitsInventory::showGearMenu()
{
- onSave();
-}
+ if (!mGearMenu) return;
-void LLPanelOutfitsInventory::showActionMenu(LLMenuGL* menu, std::string spawning_view_name)
-{
- if (menu)
- {
- menu->buildDrawLabels();
- menu->updateParent(LLMenuGL::sMenuContainer);
- LLView* spawning_view = getChild<LLView> (spawning_view_name);
- S32 menu_x, menu_y;
- //show menu in co-ordinates of panel
- spawning_view->localPointToOtherView(0, spawning_view->getRect().getHeight(), &menu_x, &menu_y, this);
- menu_y += menu->getRect().getHeight();
- LLMenuGL::showPopup(this, menu, menu_x, menu_y);
- }
+ LLView* spawning_view = getChild<LLView>("options_gear_btn");
+ mGearMenu->show(spawning_view);
}
void LLPanelOutfitsInventory::onTrashButtonClick()
@@ -425,7 +568,25 @@ void LLPanelOutfitsInventory::onTrashButtonClick()
void LLPanelOutfitsInventory::onClipboardAction(const LLSD& userdata)
{
std::string command_name = userdata.asString();
- getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name);
+ if (isCOFPanelActive())
+ {
+ getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name);
+ }
+ else // "My Outfits" tab active
+ {
+ if (command_name == "delete")
+ {
+ const LLUUID& selected_outfit_id = mMyOutfitsPanel->getSelectedOutfitUUID();
+ if (selected_outfit_id.notNull())
+ {
+ remove_category(&gInventory, selected_outfit_id);
+ }
+ }
+ else
+ {
+ llwarns << "Unrecognized action" << llendl;
+ }
+ }
updateListCommands();
updateVerbs();
}
@@ -479,32 +640,40 @@ BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata)
if (command_name == "delete" || command_name == "remove")
{
BOOL can_delete = FALSE;
- LLFolderView *folder = getActivePanel()->getRootFolder();
- if (folder)
+
+ if (isCOFPanelActive())
{
- std::set<LLUUID> selection_set;
- folder->getSelectionList(selection_set);
- can_delete = (selection_set.size() > 0);
- for (std::set<LLUUID>::iterator iter = selection_set.begin();
- iter != selection_set.end();
- ++iter)
+ LLFolderView* root = getActivePanel()->getRootFolder();
+ if (root)
{
- const LLUUID &item_id = (*iter);
- LLFolderViewItem *item = folder->getItemByID(item_id);
- can_delete &= item->getListener()->isItemRemovable();
+ std::set<LLUUID> selection_set = root->getSelectionList();
+ can_delete = (selection_set.size() > 0);
+ for (std::set<LLUUID>::iterator iter = selection_set.begin();
+ iter != selection_set.end();
+ ++iter)
+ {
+ const LLUUID &item_id = (*iter);
+ LLFolderViewItem *item = root->getItemByID(item_id);
+ can_delete &= item->getListener()->isItemRemovable();
+ }
}
- return can_delete;
}
- return FALSE;
+ else // "My Outfits" tab active
+ {
+ const LLUUID& selected_outfit = mMyOutfitsPanel->getSelectedOutfitUUID();
+ // first condition prevents trash btn from enabling when items are selected inside outfit (EXT-7847)
+ can_delete = !mMyOutfitsPanel->hasItemSelected() && LLAppearanceMgr::instance().getCanRemoveOutfit(selected_outfit);
+ }
+
+ return can_delete;
}
if (command_name == "remove_link")
{
BOOL can_delete = FALSE;
- LLFolderView *folder = getActivePanel()->getRootFolder();
- if (folder)
+ LLFolderView* root = getActivePanel()->getRootFolder();
+ if (root)
{
- std::set<LLUUID> selection_set;
- folder->getSelectionList(selection_set);
+ std::set<LLUUID> selection_set = root->getSelectionList();
can_delete = (selection_set.size() > 0);
for (std::set<LLUUID>::iterator iter = selection_set.begin();
iter != selection_set.end();
@@ -531,10 +700,14 @@ BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata)
{
return FALSE;
}
+ return hasItemsSelected();
}
- if (command_name == "make_outfit")
+ if (command_name == "save_outfit")
{
- return TRUE;
+ bool outfit_locked = LLAppearanceMgr::getInstance()->isOutfitLocked();
+ bool outfit_dirty =LLAppearanceMgr::getInstance()->isOutfitDirty();
+ // allow save only if outfit isn't locked and is dirty
+ return !outfit_locked && outfit_dirty;
}
if (command_name == "edit" ||
@@ -549,12 +722,19 @@ BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata)
bool LLPanelOutfitsInventory::hasItemsSelected()
{
bool has_items_selected = false;
- LLFolderView *folder = getActivePanel()->getRootFolder();
- if (folder)
+
+ if (isCOFPanelActive())
+ {
+ LLFolderView* root = getActivePanel()->getRootFolder();
+ if (root)
+ {
+ std::set<LLUUID> selection_set = root->getSelectionList();
+ has_items_selected = (selection_set.size() > 0);
+ }
+ }
+ else // My Outfits Tab is active
{
- std::set<LLUUID> selection_set;
- folder->getSelectionList(selection_set);
- has_items_selected = (selection_set.size() > 0);
+ has_items_selected = mMyOutfitsPanel->getSelectedOutfitUUID().notNull();
}
return has_items_selected;
}
@@ -581,74 +761,84 @@ bool LLPanelOutfitsInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropTy
void LLPanelOutfitsInventory::initTabPanels()
{
- LLInventoryPanel *cof_panel = getChild<LLInventoryPanel>(COF_TAB_NAME);
- cof_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
- mTabPanels.push_back(cof_panel);
+ mCurrentOutfitPanel = getChild<LLInventoryPanel>(COF_TAB_NAME);
+ mCurrentOutfitPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
+ mCurrentOutfitPanel->setSelectCallback(boost::bind(&LLPanelOutfitsInventory::onTabSelectionChange, this, mCurrentOutfitPanel, _1, _2));
- LLInventoryPanel *myoutfits_panel = getChild<LLInventoryPanel>(OUTFITS_TAB_NAME);
- myoutfits_panel->setFilterTypes(1LL << LLFolderType::FT_OUTFIT, LLInventoryFilter::FILTERTYPE_CATEGORY);
- myoutfits_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
- mTabPanels.push_back(myoutfits_panel);
-
- for (tabpanels_vec_t::iterator iter = mTabPanels.begin();
- iter != mTabPanels.end();
- ++iter)
- {
- LLInventoryPanel *panel = (*iter);
- panel->setSelectCallback(boost::bind(&LLPanelOutfitsInventory::onTabSelectionChange, this, panel, _1, _2));
- }
+ mMyOutfitsPanel = getChild<LLOutfitsList>(OUTFITS_TAB_NAME);
+ mMyOutfitsPanel->addSelectionChangeCallback(boost::bind(&LLPanelOutfitsInventory::updateVerbs, this));
mAppearanceTabs = getChild<LLTabContainer>("appearance_tabs");
mAppearanceTabs->setCommitCallback(boost::bind(&LLPanelOutfitsInventory::onTabChange, this));
- mActivePanel = (LLInventoryPanel*)mAppearanceTabs->getCurrentPanel();
}
void LLPanelOutfitsInventory::onTabSelectionChange(LLInventoryPanel* tab_panel, const std::deque<LLFolderViewItem*> &items, BOOL user_action)
{
if (user_action && items.size() > 0)
{
- for (tabpanels_vec_t::iterator iter = mTabPanels.begin();
- iter != mTabPanels.end();
- ++iter)
+ // TODO: add handling "My Outfits" tab.
+ if (isCOFPanelActive())
{
- LLInventoryPanel *panel = (*iter);
- if (panel == tab_panel)
- {
- mActivePanel = panel;
- }
- else
- {
- panel->getRootFolder()->clearSelection();
- }
+ onSelectionChange(items, user_action);
+ }
+ else
+ {
+ mCurrentOutfitPanel->getRootFolder()->clearSelection();
}
}
- onSelectionChange(items, user_action);
}
void LLPanelOutfitsInventory::onTabChange()
{
- mActivePanel = (LLInventoryPanel*)childGetVisibleTab("appearance_tabs");
- if (!mActivePanel)
+ // TODO: add handling "My Outfits" tab.
+ if (isCOFPanelActive())
{
- return;
+ mCurrentOutfitPanel->setFilterSubString(mFilterSubString);
+ }
+ else
+ {
+ mMyOutfitsPanel->setFilterSubString(mFilterSubString);
+ mMyOutfitsPanel->onOpen(LLSD());
}
- mActivePanel->setFilterSubString(mFilterSubString);
+
updateVerbs();
}
BOOL LLPanelOutfitsInventory::isTabPanel(LLInventoryPanel *panel) const
{
- for(tabpanels_vec_t::const_iterator it = mTabPanels.begin();
- it != mTabPanels.end();
- ++it)
+ // TODO: add handling "My Outfits" tab.
+ if (mCurrentOutfitPanel == panel)
{
- if (*it == panel)
- return TRUE;
+ return TRUE;
}
return FALSE;
}
BOOL LLPanelOutfitsInventory::isCOFPanelActive() const
{
- return (getActivePanel()->getName() == COF_TAB_NAME);
+ return (childGetVisibleTab("appearance_tabs")->getName() == COF_TAB_NAME);
+}
+
+void LLPanelOutfitsInventory::setWearablesLoading(bool val)
+{
+ mListCommands->childSetEnabled("wear_btn", !val);
+}
+
+void LLPanelOutfitsInventory::onWearablesLoaded()
+{
+ setWearablesLoading(false);
+}
+
+void LLPanelOutfitsInventory::onWearablesLoading()
+{
+ setWearablesLoading(true);
+}
+
+// static
+LLSidepanelAppearance* LLPanelOutfitsInventory::getAppearanceSP()
+{
+ static LLSidepanelAppearance* panel_appearance =
+ dynamic_cast<LLSidepanelAppearance*>
+ (LLSideTray::getInstance()->getPanel("sidepanel_appearance"));
+ return panel_appearance;
}
diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h
index ab25ef0a49..eabfda7f8c 100644
--- a/indra/newview/llpaneloutfitsinventory.h
+++ b/indra/newview/llpaneloutfitsinventory.h
@@ -40,14 +40,18 @@ class LLFolderView;
class LLFolderViewItem;
class LLFolderViewEventListener;
class LLInventoryPanel;
+class LLOutfitsList;
class LLSaveFolderState;
class LLButton;
class LLMenuGL;
class LLSidepanelAppearance;
class LLTabContainer;
+class LLSaveOutfitComboBtn;
+class LLOutfitListGearMenu;
class LLPanelOutfitsInventory : public LLPanel
{
+ LOG_CLASS(LLPanelOutfitsInventory);
public:
LLPanelOutfitsInventory();
virtual ~LLPanelOutfitsInventory();
@@ -61,45 +65,46 @@ public:
void onEdit();
void onSave();
- void onSaveCommit(const std::string& item_name);
+ bool onSaveCommit(const LLSD& notification, const LLSD& response);
void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
- void onSelectorButtonClicked();
// If a compatible listener type is selected, then return a pointer to that.
// Otherwise, return NULL.
LLFolderViewEventListener* getCorrectListenerForAction();
- void setParent(LLSidepanelAppearance *parent);
LLFolderView* getRootFolder();
+ static LLSidepanelAppearance* getAppearanceSP();
+
+ static LLPanelOutfitsInventory* findInstance();
protected:
void updateVerbs();
bool getIsCorrectType(const LLFolderViewEventListener *listenerp) const;
private:
- LLSidepanelAppearance* mParent;
LLSaveFolderState* mSavedFolderState;
LLTabContainer* mAppearanceTabs;
std::string mFilterSubString;
-
+ std::auto_ptr<LLSaveOutfitComboBtn> mSaveComboBtn;
public:
//////////////////////////////////////////////////////////////////////////////////
// tab panels
- LLInventoryPanel* getActivePanel() { return mActivePanel; }
- const LLInventoryPanel* getActivePanel() const { return mActivePanel; }
+ // TODO: change getActivePanel() to return the active tab instead of returning
+ // a pointer to "Wearing" inventory panel.
+ LLInventoryPanel* getActivePanel() { return mCurrentOutfitPanel; }
+
BOOL isTabPanel(LLInventoryPanel *panel) const;
-
+ BOOL isCOFPanelActive() const;
+
protected:
void initTabPanels();
void onTabSelectionChange(LLInventoryPanel* tab_panel, const std::deque<LLFolderViewItem*> &items, BOOL user_action);
void onTabChange();
- BOOL isCOFPanelActive() const;
private:
- LLInventoryPanel* mActivePanel;
- typedef std::vector<LLInventoryPanel *> tabpanels_vec_t;
- tabpanels_vec_t mTabPanels;
+ LLOutfitsList* mMyOutfitsPanel;
+ LLInventoryPanel* mCurrentOutfitPanel;
// tab panels //
////////////////////////////////////////////////////////////////////////////////
@@ -110,25 +115,26 @@ private:
protected:
void initListCommandsHandlers();
void updateListCommands();
- void onGearButtonClick();
void onWearButtonClick();
- void onAddButtonClick();
- void showActionMenu(LLMenuGL* menu, std::string spawning_view_name);
+ void showGearMenu();
void onTrashButtonClick();
void onClipboardAction(const LLSD& userdata);
BOOL isActionEnabled(const LLSD& command_name);
void onCustomAction(const LLSD& command_name);
bool handleDragAndDropToTrash(BOOL drop, EDragAndDropType cargo_type, EAcceptance* accept);
bool hasItemsSelected();
+ void setWearablesLoading(bool val);
+ void onWearablesLoaded();
+ void onWearablesLoading();
private:
LLPanel* mListCommands;
- LLMenuGL* mMenuGearDefault;
+ LLOutfitListGearMenu* mGearMenu;
LLMenuGL* mMenuAdd;
// List Commands //
////////////////////////////////////////////////////////////////////////////////
///
-public:
- static bool sShowDebugEditor;
+
+ bool mInitialized;
};
#endif //LL_LLPANELOUTFITSINVENTORY_H
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 423ee61e25..6dd800c0c6 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -36,6 +36,7 @@
#include "llfloaterreg.h"
#include "llmenugl.h"
#include "llnotificationsutil.h"
+#include "lleventtimer.h"
#include "llfiltereditor.h"
#include "lltabcontainer.h"
#include "lluictrlfactory.h"
@@ -133,13 +134,13 @@ public:
typedef std::map < LLUUID, LLVector3d > id_to_pos_map_t;
LLAvatarItemDistanceComparator() {};
- void updateAvatarsPositions(std::vector<LLVector3d>& positions, std::vector<LLUUID>& uuids)
+ void updateAvatarsPositions(std::vector<LLVector3d>& positions, uuid_vec_t& uuids)
{
std::vector<LLVector3d>::const_iterator
pos_it = positions.begin(),
pos_end = positions.end();
- std::vector<LLUUID>::const_iterator
+ uuid_vec_t::const_iterator
id_it = uuids.begin(),
id_end = uuids.end();
@@ -177,8 +178,8 @@ public:
protected:
virtual bool doCompare(const LLAvatarListItem* item1, const LLAvatarListItem* item2) const
{
- LLPointer<LLSpeaker> lhs = LLLocalSpeakerMgr::instance().findSpeaker(item1->getAvatarId());
- LLPointer<LLSpeaker> rhs = LLLocalSpeakerMgr::instance().findSpeaker(item2->getAvatarId());
+ LLPointer<LLSpeaker> lhs = LLActiveSpeakerMgr::instance().findSpeaker(item1->getAvatarId());
+ LLPointer<LLSpeaker> rhs = LLActiveSpeakerMgr::instance().findSpeaker(item2->getAvatarId());
if ( lhs.notNull() && rhs.notNull() )
{
// Compare by last speaking time
@@ -442,6 +443,7 @@ public:
LLPanelPeople::LLPanelPeople()
: LLPanel(),
mFilterSubString(LLStringUtil::null),
+ mFilterSubStringOrig(LLStringUtil::null),
mFilterEditor(NULL),
mTabContainer(NULL),
mOnlineFriendList(NULL),
@@ -462,8 +464,10 @@ LLPanelPeople::~LLPanelPeople()
delete mFriendListUpdater;
delete mRecentListUpdater;
- if(LLVoiceClient::getInstance())
+ if(LLVoiceClient::instanceExists())
+ {
LLVoiceClient::getInstance()->removeObserver(this);
+ }
LLView::deleteViewByHandle(mGroupPlusMenuHandle);
LLView::deleteViewByHandle(mNearbyViewSortMenuHandle);
@@ -509,13 +513,19 @@ BOOL LLPanelPeople::postBuild()
mNearbyList = getChild<LLPanel>(NEARBY_TAB_NAME)->getChild<LLAvatarList>("avatar_list");
mNearbyList->setNoItemsCommentText(getString("no_one_near"));
+ mNearbyList->setNoItemsMsg(getString("no_one_near"));
+ mNearbyList->setNoFilteredItemsMsg(getString("no_one_filtered_near"));
mNearbyList->setShowIcons("NearbyListShowIcons");
mRecentList = getChild<LLPanel>(RECENT_TAB_NAME)->getChild<LLAvatarList>("avatar_list");
- mRecentList->setNoItemsCommentText(getString("no_people"));
+ mRecentList->setNoItemsCommentText(getString("no_recent_people"));
+ mRecentList->setNoItemsMsg(getString("no_recent_people"));
+ mRecentList->setNoFilteredItemsMsg(getString("no_filtered_recent_people"));
mRecentList->setShowIcons("RecentListShowIcons");
mGroupList = getChild<LLGroupList>("group_list");
+ mGroupList->setNoItemsMsg(getString("no_groups_msg"));
+ mGroupList->setNoFilteredItemsMsg(getString("no_filtered_groups_msg"));
mNearbyList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu);
mRecentList->setContextMenu(&LLPanelPeopleMenus::gNearbyMenu);
@@ -614,7 +624,7 @@ BOOL LLPanelPeople::postBuild()
if(recent_view_sort)
mRecentViewSortMenuHandle = recent_view_sort->getHandle();
- gVoiceClient->addObserver(this);
+ LLVoiceClient::getInstance()->addObserver(this);
// call this method in case some list is empty and buttons can be in inconsistent state
updateButtons();
@@ -636,6 +646,25 @@ void LLPanelPeople::onChange(EStatusType status, const std::string &channelURI,
updateButtons();
}
+void LLPanelPeople::updateFriendListHelpText()
+{
+ // show special help text for just created account to help finding friends. EXT-4836
+ static LLTextBox* no_friends_text = getChild<LLTextBox>("no_friends_help_text");
+
+ // Seems sometimes all_friends can be empty because of issue with Inventory loading (clear cache, slow connection...)
+ // So, lets check all lists to avoid overlapping the text with online list. See EXT-6448.
+ bool any_friend_exists = mAllFriendList->filterHasMatches() || mOnlineFriendList->filterHasMatches();
+ no_friends_text->setVisible(!any_friend_exists);
+ if (no_friends_text->getVisible())
+ {
+ //update help text for empty lists
+ std::string message_name = mFilterSubString.empty() ? "no_friends_msg" : "no_filtered_friends_msg";
+ LLStringUtil::format_map_t args;
+ args["[SEARCH_TERM]"] = LLURI::escape(mFilterSubStringOrig);
+ no_friends_text->setText(getString(message_name, args));
+ }
+}
+
void LLPanelPeople::updateFriendList()
{
if (!mOnlineFriendList || !mAllFriendList)
@@ -647,8 +676,8 @@ void LLPanelPeople::updateFriendList()
av_tracker.copyBuddyList(all_buddies);
// save them to the online and all friends vectors
- LLAvatarList::uuid_vector_t& online_friendsp = mOnlineFriendList->getIDs();
- LLAvatarList::uuid_vector_t& all_friendsp = mAllFriendList->getIDs();
+ uuid_vec_t& online_friendsp = mOnlineFriendList->getIDs();
+ uuid_vec_t& all_friendsp = mAllFriendList->getIDs();
all_friendsp.clear();
online_friendsp.clear();
@@ -667,11 +696,6 @@ void LLPanelPeople::updateFriendList()
lldebugs << "Friends Cards were not found" << llendl;
}
- // show special help text for just created account to help found friends. EXT-4836
- static LLTextBox* no_friends_text = getChild<LLTextBox>("no_friends_msg");
- no_friends_text->setVisible(all_friendsp.size() == 0);
-
-
LLAvatarTracker::buddy_map_t::const_iterator buddy_it = all_buddies.begin();
for (; buddy_it != all_buddies.end(); ++buddy_it)
{
@@ -680,9 +704,15 @@ void LLPanelPeople::updateFriendList()
online_friendsp.push_back(buddy_id);
}
- mOnlineFriendList->setDirty();
- mAllFriendList->setDirty();
-
+ /*
+ * Avatarlists will be hidden by showFriendsAccordionsIfNeeded(), if they do not have items.
+ * But avatarlist can be updated only if it is visible @see LLAvatarList::draw();
+ * So we need to do force update of lists to avoid inconsistency of data and view of avatarlist.
+ */
+ mOnlineFriendList->setDirty(true, !mOnlineFriendList->filterHasMatches());// do force update if list do NOT have items
+ mAllFriendList->setDirty(true, !mAllFriendList->filterHasMatches());
+ //update trash and other buttons according to a selected item
+ updateButtons();
showFriendsAccordionsIfNeeded();
}
@@ -697,7 +727,7 @@ void LLPanelPeople::updateNearbyList()
mNearbyList->setDirty();
DISTANCE_COMPARATOR.updateAvatarsPositions(positions, mNearbyList->getIDs());
- LLLocalSpeakerMgr::instance().update(TRUE);
+ LLActiveSpeakerMgr::instance().update(TRUE);
}
void LLPanelPeople::updateRecentList()
@@ -732,7 +762,7 @@ void LLPanelPeople::buttonSetAction(const std::string& btn_name, const commit_si
bool LLPanelPeople::isFriendOnline(const LLUUID& id)
{
- LLAvatarList::uuid_vector_t ids = mOnlineFriendList->getIDs();
+ uuid_vec_t ids = mOnlineFriendList->getIDs();
return std::find(ids.begin(), ids.end(), id) != ids.end();
}
@@ -745,7 +775,7 @@ void LLPanelPeople::updateButtons()
//bool recent_tab_active = (cur_tab == RECENT_TAB_NAME);
LLUUID selected_id;
- std::vector<LLUUID> selected_uuids;
+ uuid_vec_t selected_uuids;
getCurrentItemIDs(selected_uuids);
bool item_selected = (selected_uuids.size() == 1);
bool multiple_selected = (selected_uuids.size() >= 1);
@@ -795,7 +825,7 @@ void LLPanelPeople::updateButtons()
}
}
- bool enable_calls = gVoiceClient->voiceWorking() && gVoiceClient->voiceEnabled();
+ bool enable_calls = LLVoiceClient::getInstance()->isVoiceWorking() && LLVoiceClient::getInstance()->voiceEnabled();
buttonSetEnabled("teleport_btn", friends_tab_active && item_selected && isFriendOnline(selected_uuids.front()));
buttonSetEnabled("view_profile_btn", item_selected);
@@ -841,7 +871,7 @@ LLUUID LLPanelPeople::getCurrentItemID() const
return LLUUID::null;
}
-void LLPanelPeople::getCurrentItemIDs(std::vector<LLUUID>& selected_uuids) const
+void LLPanelPeople::getCurrentItemIDs(uuid_vec_t& selected_uuids) const
{
std::string cur_tab = getActiveTabName();
@@ -954,10 +984,11 @@ bool LLPanelPeople::isRealGroup()
void LLPanelPeople::onFilterEdit(const std::string& search_string)
{
- std::string search_upper = search_string;
+ mFilterSubStringOrig = search_string;
+ LLStringUtil::trimHead(mFilterSubStringOrig);
// Searches are case-insensitive
+ std::string search_upper = mFilterSubStringOrig;
LLStringUtil::toUpper(search_upper);
- LLStringUtil::trimHead(search_upper);
if (mFilterSubString == search_upper)
return;
@@ -972,11 +1003,11 @@ void LLPanelPeople::onFilterEdit(const std::string& search_string)
// Apply new filter.
- mNearbyList->setNameFilter(mFilterSubString);
- mOnlineFriendList->setNameFilter(mFilterSubString);
- mAllFriendList->setNameFilter(mFilterSubString);
- mRecentList->setNameFilter(mFilterSubString);
- mGroupList->setNameFilter(mFilterSubString);
+ mNearbyList->setNameFilter(mFilterSubStringOrig);
+ mOnlineFriendList->setNameFilter(mFilterSubStringOrig);
+ mAllFriendList->setNameFilter(mFilterSubStringOrig);
+ mRecentList->setNameFilter(mFilterSubStringOrig);
+ mGroupList->setNameFilter(mFilterSubStringOrig);
setAccordionCollapsedByUser("tab_online", false);
setAccordionCollapsedByUser("tab_all", false);
@@ -1052,10 +1083,10 @@ void LLPanelPeople::onAddFriendButtonClicked()
}
}
-bool LLPanelPeople::isItemsFreeOfFriends(const std::vector<LLUUID>& uuids)
+bool LLPanelPeople::isItemsFreeOfFriends(const uuid_vec_t& uuids)
{
const LLAvatarTracker& av_tracker = LLAvatarTracker::instance();
- for ( std::vector<LLUUID>::const_iterator
+ for ( uuid_vec_t::const_iterator
id = uuids.begin(),
id_end = uuids.end();
id != id_end; ++id )
@@ -1083,7 +1114,7 @@ void LLPanelPeople::onAddFriendWizButtonClicked()
void LLPanelPeople::onDeleteFriendButtonClicked()
{
- std::vector<LLUUID> selected_uuids;
+ uuid_vec_t selected_uuids;
getCurrentItemIDs(selected_uuids);
if (selected_uuids.size() == 1)
@@ -1110,7 +1141,7 @@ void LLPanelPeople::onChatButtonClicked()
void LLPanelPeople::onImButtonClicked()
{
- std::vector<LLUUID> selected_uuids;
+ uuid_vec_t selected_uuids;
getCurrentItemIDs(selected_uuids);
if ( selected_uuids.size() == 1 )
{
@@ -1132,7 +1163,7 @@ void LLPanelPeople::onActivateButtonClicked()
// static
void LLPanelPeople::onAvatarPicked(
const std::vector<std::string>& names,
- const std::vector<LLUUID>& ids)
+ const uuid_vec_t& ids)
{
if (!names.empty() && !ids.empty())
LLAvatarActions::requestFriendshipDialog(ids[0], names[0]);
@@ -1282,7 +1313,7 @@ bool LLPanelPeople::onRecentViewSortMenuItemCheck(const LLSD& userdata)
void LLPanelPeople::onCallButtonClicked()
{
- std::vector<LLUUID> selected_uuids;
+ uuid_vec_t selected_uuids;
getCurrentItemIDs(selected_uuids);
if (selected_uuids.size() == 1)
@@ -1418,6 +1449,11 @@ void LLPanelPeople::showFriendsAccordionsIfNeeded()
// Rearrange accordions
LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion");
accordion->arrange();
+
+ // *TODO: new no_matched_tabs_text attribute was implemented in accordion (EXT-7368).
+ // this code should be refactored to use it
+ // keep help text in a synchronization with accordions visibility.
+ updateFriendListHelpText();
}
}
@@ -1431,9 +1467,6 @@ void LLPanelPeople::onFriendListRefreshComplete(LLUICtrl*ctrl, const LLSD& param
{
showAccordion("tab_all", param.asInteger());
}
-
- LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion");
- accordion->arrange();
}
void LLPanelPeople::setAccordionCollapsedByUser(LLUICtrl* acc_tab, bool collapsed)
diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h
index 6d3d436156..17c45a034b 100644
--- a/indra/newview/llpanelpeople.h
+++ b/indra/newview/llpanelpeople.h
@@ -73,17 +73,18 @@ private:
} ESortOrder;
// methods indirectly called by the updaters
+ void updateFriendListHelpText();
void updateFriendList();
void updateNearbyList();
void updateRecentList();
bool isFriendOnline(const LLUUID& id);
- bool isItemsFreeOfFriends(const std::vector<LLUUID>& uuids);
+ bool isItemsFreeOfFriends(const uuid_vec_t& uuids);
void updateButtons();
std::string getActiveTabName() const;
LLUUID getCurrentItemID() const;
- void getCurrentItemIDs(std::vector<LLUUID>& selected_uuids) const;
+ void getCurrentItemIDs(uuid_vec_t& selected_uuids) const;
void buttonSetVisible(std::string btn_name, BOOL visible);
void buttonSetEnabled(const std::string& btn_name, bool enabled);
void buttonSetAction(const std::string& btn_name, const commit_signal_t::slot_type& cb);
@@ -134,7 +135,7 @@ private:
// misc callbacks
static void onAvatarPicked(
const std::vector<std::string>& names,
- const std::vector<LLUUID>& ids);
+ const uuid_vec_t& ids);
void onFriendsAccordionExpandedCollapsed(LLUICtrl* ctrl, const LLSD& param, LLAvatarList* avatar_list);
@@ -168,6 +169,7 @@ private:
Updater* mRecentListUpdater;
std::string mFilterSubString;
+ std::string mFilterSubStringOrig;
};
#endif //LL_LLPANELPEOPLE_H
diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp
index 7e184c78a8..93be0bda9e 100644
--- a/indra/newview/llpanelpeoplemenus.cpp
+++ b/indra/newview/llpanelpeoplemenus.cpp
@@ -39,8 +39,10 @@
#include "llpanelpeoplemenus.h"
// newview
+#include "llagent.h"
#include "llagentdata.h" // for gAgentID
#include "llavataractions.h"
+#include "llcallingcard.h" // for LLAvatarTracker
#include "llviewermenu.h" // for gMenuHolder
namespace LLPanelPeopleMenus
@@ -48,64 +50,6 @@ namespace LLPanelPeopleMenus
NearbyMenu gNearbyMenu;
-//== ContextMenu ==============================================================
-
-ContextMenu::ContextMenu()
-: mMenu(NULL)
-{
-}
-
-ContextMenu::~ContextMenu()
-{
- // do not forget delete LLContextMenu* mMenu.
- // It can have registered Enable callbacks which are called from the LLMenuHolderGL::draw()
- // via selected item (menu_item_call) by calling LLMenuItemCallGL::buildDrawLabel.
- // we can have a crash via using callbacks of deleted instance of ContextMenu. EXT-4725
-
- // menu holder deletes its menus on viewer exit, so we have no way to determine if instance
- // of mMenu has already been deleted except of using LLHandle. EXT-4762.
- if (!mMenuHandle.isDead())
- {
- mMenu->die();
- mMenu = NULL;
- }
-}
-
-void ContextMenu::show(LLView* spawning_view, const std::vector<LLUUID>& uuids, S32 x, S32 y)
-{
- if (mMenu)
- {
- //preventing parent (menu holder) from deleting already "dead" context menus on exit
- LLView* parent = mMenu->getParent();
- if (parent)
- {
- parent->removeChild(mMenu);
- }
- delete mMenu;
- mMenu = NULL;
- mUUIDs.clear();
- }
-
- if ( uuids.empty() )
- return;
-
- mUUIDs.resize(uuids.size());
- std::copy(uuids.begin(), uuids.end(), mUUIDs.begin());
-
- mMenu = createMenu();
- mMenuHandle = mMenu->getHandle();
- mMenu->show(x, y);
- LLMenuGL::showPopup(spawning_view, mMenu, x, y);
-}
-
-void ContextMenu::hide()
-{
- if(mMenu)
- {
- mMenu->hide();
- }
-}
-
//== NearbyMenu ===============================================================
LLContextMenu* NearbyMenu::createMenu()
@@ -121,10 +65,11 @@ LLContextMenu* NearbyMenu::createMenu()
const LLUUID& id = mUUIDs.front();
registrar.add("Avatar.Profile", boost::bind(&LLAvatarActions::showProfile, id));
registrar.add("Avatar.AddFriend", boost::bind(&LLAvatarActions::requestFriendshipDialog, id));
+ registrar.add("Avatar.RemoveFriend", boost::bind(&LLAvatarActions::removeFriendDialog, id));
registrar.add("Avatar.IM", boost::bind(&LLAvatarActions::startIM, id));
registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startCall, id));
registrar.add("Avatar.OfferTeleport", boost::bind(&NearbyMenu::offerTeleport, this));
- registrar.add("Avatar.ShowOnMap", boost::bind(&LLAvatarActions::startIM, id)); // *TODO: unimplemented
+ registrar.add("Avatar.ShowOnMap", boost::bind(&LLAvatarActions::showOnMap, id));
registrar.add("Avatar.Share", boost::bind(&LLAvatarActions::share, id));
registrar.add("Avatar.Pay", boost::bind(&LLAvatarActions::pay, id));
registrar.add("Avatar.BlockUnblock", boost::bind(&LLAvatarActions::toggleBlock, id));
@@ -133,8 +78,7 @@ LLContextMenu* NearbyMenu::createMenu()
enable_registrar.add("Avatar.CheckItem", boost::bind(&NearbyMenu::checkContextMenuItem, this, _2));
// create the context menu from the XUI
- return LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>(
- "menu_people_nearby.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance());
+ return createFromFile("menu_people_nearby.xml");
}
else
{
@@ -143,14 +87,13 @@ LLContextMenu* NearbyMenu::createMenu()
// registrar.add("Avatar.AddFriend", boost::bind(&LLAvatarActions::requestFriendshipDialog, mUUIDs)); // *TODO: unimplemented
registrar.add("Avatar.IM", boost::bind(&LLAvatarActions::startConference, mUUIDs));
registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startAdhocCall, mUUIDs));
+ registrar.add("Avatar.RemoveFriend",boost::bind(&LLAvatarActions::removeFriendsDialog, mUUIDs));
// registrar.add("Avatar.Share", boost::bind(&LLAvatarActions::startIM, mUUIDs)); // *TODO: unimplemented
// registrar.add("Avatar.Pay", boost::bind(&LLAvatarActions::pay, mUUIDs)); // *TODO: unimplemented
enable_registrar.add("Avatar.EnableItem", boost::bind(&NearbyMenu::enableContextMenuItem, this, _2));
// create the context menu from the XUI
- return LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>
- ("menu_people_nearby_multiselect.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance());
-
+ return createFromFile("menu_people_nearby_multiselect.xml");
}
}
@@ -172,9 +115,15 @@ bool NearbyMenu::enableContextMenuItem(const LLSD& userdata)
// - there are selected people
// - and there are no friends among selection yet.
+ //EXT-7389 - disable for more than 1
+ if(mUUIDs.size() > 1)
+ {
+ return false;
+ }
+
bool result = (mUUIDs.size() > 0);
- std::vector<LLUUID>::const_iterator
+ uuid_vec_t::const_iterator
id = mUUIDs.begin(),
uuids_end = mUUIDs.end();
@@ -191,13 +140,43 @@ bool NearbyMenu::enableContextMenuItem(const LLSD& userdata)
}
else if (item == std::string("can_delete"))
{
- const LLUUID& id = mUUIDs.front();
- return LLAvatarActions::isFriend(id);
+ // We can remove friends if:
+ // - there are selected people
+ // - and there are only friends among selection.
+
+ bool result = (mUUIDs.size() > 0);
+
+ uuid_vec_t::const_iterator
+ id = mUUIDs.begin(),
+ uuids_end = mUUIDs.end();
+
+ for (;id != uuids_end; ++id)
+ {
+ if ( !LLAvatarActions::isFriend(*id) )
+ {
+ result = false;
+ break;
+ }
+ }
+
+ return result;
}
else if (item == std::string("can_call"))
{
return LLAvatarActions::canCall();
}
+ else if (item == std::string("can_show_on_map"))
+ {
+ const LLUUID& id = mUUIDs.front();
+
+ return (LLAvatarTracker::instance().isBuddyOnline(id) && is_agent_mappable(id))
+ || gAgent.isGodlike();
+ }
+ else if(item == std::string("can_offer_teleport"))
+ {
+ const LLUUID& id = mUUIDs.front();
+ return LLAvatarActions::canOfferTeleport(id);
+ }
return false;
}
diff --git a/indra/newview/llpanelpeoplemenus.h b/indra/newview/llpanelpeoplemenus.h
index 913638d8c8..e1f8790135 100644
--- a/indra/newview/llpanelpeoplemenus.h
+++ b/indra/newview/llpanelpeoplemenus.h
@@ -33,42 +33,15 @@
#ifndef LL_LLPANELPEOPLEMENUS_H
#define LL_LLPANELPEOPLEMENUS_H
-#include "llavatarlistitem.h"
+#include "lllistcontextmenu.h"
namespace LLPanelPeopleMenus
{
/**
- * Base context menu.
- */
-class ContextMenu : public LLAvatarListItem::ContextMenu
-{
-public:
- ContextMenu();
- virtual ~ContextMenu();
-
- /**
- * Show the menu at specified coordinates.
- *
- * @param uuids - an array of avatar or group ids
- */
- /*virtual*/ void show(LLView* spawning_view, const std::vector<LLUUID>& uuids, S32 x, S32 y);
-
- virtual void hide();
-
-protected:
-
- virtual LLContextMenu* createMenu() = 0;
-
- std::vector<LLUUID> mUUIDs;
- LLContextMenu* mMenu;
- LLHandle<LLView> mMenuHandle;
-};
-
-/**
* Menu used in the nearby people list.
*/
-class NearbyMenu : public ContextMenu
+class NearbyMenu : public LLListContextMenu
{
public:
/*virtual*/ LLContextMenu* createMenu();
diff --git a/indra/newview/llpanelpermissions.cpp b/indra/newview/llpanelpermissions.cpp
index 8b8b1bed37..71d16a08b4 100644
--- a/indra/newview/llpanelpermissions.cpp
+++ b/indra/newview/llpanelpermissions.cpp
@@ -142,9 +142,9 @@ LLPanelPermissions::LLPanelPermissions() :
BOOL LLPanelPermissions::postBuild()
{
childSetCommitCallback("Object Name",LLPanelPermissions::onCommitName,this);
- childSetPrevalidate("Object Name",LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("Object Name",LLTextValidate::validateASCIIPrintableNoPipe);
childSetCommitCallback("Object Description",LLPanelPermissions::onCommitDesc,this);
- childSetPrevalidate("Object Description",LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("Object Description",LLTextValidate::validateASCIIPrintableNoPipe);
getChild<LLUICtrl>("button set group")->setCommitCallback(boost::bind(&LLPanelPermissions::onClickGroup,this));
@@ -195,8 +195,8 @@ void LLPanelPermissions::disableAll()
childSetEnabled("Owner Name", FALSE);
childSetEnabled("Group:", FALSE);
- childSetText("Group Name", LLStringUtil::null);
- childSetEnabled("Group Name", FALSE);
+ childSetText("Group Name Proxy", LLStringUtil::null);
+ childSetEnabled("Group Name Proxy", FALSE);
childSetEnabled("button set group", FALSE);
childSetText("Object Name", LLStringUtil::null);
diff --git a/indra/newview/llpanelpick.cpp b/indra/newview/llpanelpick.cpp
index 5ac0587550..f0dc493ebe 100644
--- a/indra/newview/llpanelpick.cpp
+++ b/indra/newview/llpanelpick.cpp
@@ -72,12 +72,6 @@
#define XML_BTN_ON_TXTR "edit_icon"
#define XML_BTN_SAVE "save_changes_btn"
-#define SAVE_BTN_LABEL "[WHAT]"
-#define LABEL_PICK = "Pick"
-#define LABEL_CHANGES = "Changes"
-
-std::string SET_LOCATION_NOTICE("(will update after save)");
-
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
@@ -150,8 +144,6 @@ BOOL LLPanelPickInfo::postBuild()
{
mSnapshotCtrl = getChild<LLTextureCtrl>(XML_SNAPSHOT);
- childSetLabelArg(XML_BTN_SAVE, SAVE_BTN_LABEL, std::string("Pick"));
-
childSetAction("teleport_btn", boost::bind(&LLPanelPickInfo::onClickTeleport, this));
childSetAction("show_on_map_btn", boost::bind(&LLPanelPickInfo::onClickMap, this));
childSetAction("back_btn", boost::bind(&LLPanelPickInfo::onClickBack, this));
@@ -410,7 +402,7 @@ void LLPanelPickEdit::onOpen(const LLSD& key)
childSetValue("pick_name", pick_name.empty() ? region_name : pick_name);
childSetValue("pick_desc", pick_desc);
setSnapshotId(snapshot_id);
- setPickLocation(createLocationText(SET_LOCATION_NOTICE, pick_name, region_name, getPosGlobal()));
+ setPickLocation(createLocationText(getLocationNotice(), pick_name, region_name, getPosGlobal()));
enableSaveButton(true);
}
@@ -578,7 +570,7 @@ void LLPanelPickEdit::onClickSetLocation()
region_name = region->getName();
}
- setPickLocation(createLocationText(SET_LOCATION_NOTICE, parcel_name, region_name, getPosGlobal()));
+ setPickLocation(createLocationText(getLocationNotice(), parcel_name, region_name, getPosGlobal()));
mLocationChanged = true;
enableSaveButton(TRUE);
@@ -595,6 +587,12 @@ void LLPanelPickEdit::onClickSave()
notifyParent(params);
}
+std::string LLPanelPickEdit::getLocationNotice()
+{
+ static std::string notice = getString("location_notice");
+ return notice;
+}
+
void LLPanelPickEdit::processProperties(void* data, EAvatarProcessorType type)
{
if(mNeedData)
diff --git a/indra/newview/llpanelpick.h b/indra/newview/llpanelpick.h
index 4f27760a8d..94ee2f83ab 100644
--- a/indra/newview/llpanelpick.h
+++ b/indra/newview/llpanelpick.h
@@ -248,6 +248,8 @@ protected:
*/
void onClickSave();
+ std::string getLocationNotice();
+
protected:
bool mLocationChanged;
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index ada65c98a4..bde8d02885 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -140,10 +140,11 @@ public:
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_creator_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;
+ params["from_search"] = true;
LLSideTray::getInstance()->showPanel("panel_profile_view", params);
}
@@ -174,31 +175,6 @@ LLClassifiedHandler gClassifiedHandler;
//////////////////////////////////////////////////////////////////////////
-/**
- * Copy&Pasted from old LLPanelClassified. This class does nothing at the moment.
- * Subscribing to "classifiedclickthrough" removes a few warnings.
- */
-class LLClassifiedClickThrough : public LLDispatchHandler
-{
-public:
-
- // "classifiedclickthrough"
- // strings[0] = classified_id
- // strings[1] = teleport_clicks
- // strings[2] = map_clicks
- // strings[3] = profile_clicks
- virtual bool operator()(
- const LLDispatcher* dispatcher,
- const std::string& key,
- const LLUUID& invoice,
- const sparam_t& strings)
- {
- if (strings.size() != 4)
- return false;
-
- return true;
- }
-};
//-----------------------------------------------------------------------------
// LLPanelPicks
@@ -216,13 +192,9 @@ LLPanelPicks::LLPanelPicks()
mPicksAccTab(NULL),
mClassifiedsAccTab(NULL),
mPanelClassifiedInfo(NULL),
- mPanelClassifiedEdit(NULL),
- mClickThroughDisp(NULL),
mNoClassifieds(false),
mNoPicks(false)
{
- mClickThroughDisp = new LLClassifiedClickThrough();
- gGenericDispatcher.addHandler("classifiedclickthrough", mClickThroughDisp);
}
LLPanelPicks::~LLPanelPicks()
@@ -231,8 +203,6 @@ LLPanelPicks::~LLPanelPicks()
{
LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(),this);
}
-
- delete mClickThroughDisp;
}
void* LLPanelPicks::create(void* data /* = NULL */)
@@ -318,7 +288,8 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type)
LLAvatarClassifieds* c_info = static_cast<LLAvatarClassifieds*>(data);
if(c_info && getAvatarId() == c_info->target_id)
{
- mClassifiedsList->clear();
+ // do not clear classified list in case we will receive two or more data packets.
+ // list has been cleared in updateData(). (fix for EXT-6436)
LLAvatarClassifieds::classifieds_list_t::const_iterator it = c_info->classifieds_list.begin();
for(; c_info->classifieds_list.end() != it; ++it)
@@ -351,7 +322,14 @@ void LLPanelPicks::processProperties(void* data, EAvatarProcessorType type)
if (mNoPicks && mNoClassifieds)
{
- childSetValue("picks_panel_text", LLTrans::getString("NoPicksClassifiedsText"));
+ if(getAvatarId() == gAgentID)
+ {
+ childSetValue("picks_panel_text", LLTrans::getString("NoPicksClassifiedsText"));
+ }
+ else
+ {
+ childSetValue("picks_panel_text", LLTrans::getString("NoAvatarPicksClassifiedsText"));
+ }
}
}
@@ -407,6 +385,9 @@ BOOL LLPanelPicks::postBuild()
registar.add("Pick.Teleport", boost::bind(&LLPanelPicks::onClickTeleport, this));
registar.add("Pick.Map", boost::bind(&LLPanelPicks::onClickMap, this));
registar.add("Pick.Delete", boost::bind(&LLPanelPicks::onClickDelete, this));
+ LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registar;
+ enable_registar.add("Pick.Enable", boost::bind(&LLPanelPicks::onEnableMenuItem, this, _2));
+
mPopupMenu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>("menu_picks.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar plus_registar;
@@ -443,6 +424,22 @@ bool LLPanelPicks::isActionEnabled(const LLSD& userdata) const
return true;
}
+bool LLPanelPicks::isClassifiedPublished(LLClassifiedItem* c_item)
+{
+ if(c_item)
+ {
+ LLPanelClassifiedEdit* panel = mEditClassifiedPanels[c_item->getClassifiedId()];
+ if(panel)
+ {
+ return !panel->isNewWithErrors();
+ }
+
+ // we've got this classified from server - it's published
+ return true;
+ }
+ return false;
+}
+
void LLPanelPicks::onAccordionStateChanged(const LLAccordionCtrlTab* acc_tab)
{
if(!mPicksAccTab->getDisplayChildren())
@@ -600,7 +597,11 @@ void LLPanelPicks::onClickTeleport()
if(pick_item)
pos = pick_item->getPosGlobal();
else if(c_item)
+ {
pos = c_item->getPosGlobal();
+ LLPanelClassifiedInfo::sendClickMessage("teleport", false,
+ c_item->getClassifiedId(), LLUUID::null, pos, LLStringUtil::null);
+ }
if (!pos.isExactlyZero())
{
@@ -619,7 +620,11 @@ void LLPanelPicks::onClickMap()
if (pick_item)
pos = pick_item->getPosGlobal();
else if(c_item)
+ {
+ LLPanelClassifiedInfo::sendClickMessage("map", false,
+ c_item->getClassifiedId(), LLUUID::null, pos, LLStringUtil::null);
pos = c_item->getPosGlobal();
+ }
LLFloaterWorldMap::getInstance()->trackLocation(pos);
LLFloaterReg::showInstance("world_map", "center");
@@ -671,6 +676,12 @@ void LLPanelPicks::updateButtons()
childSetEnabled(XML_BTN_INFO, has_selected);
childSetEnabled(XML_BTN_TELEPORT, has_selected);
childSetEnabled(XML_BTN_SHOW_ON_MAP, has_selected);
+
+ LLClassifiedItem* c_item = dynamic_cast<LLClassifiedItem*>(mClassifiedsList->getSelectedItem());
+ if(c_item)
+ {
+ childSetEnabled(XML_BTN_INFO, isClassifiedPublished(c_item));
+ }
}
void LLPanelPicks::setProfilePanel(LLPanelProfile* profile_panel)
@@ -707,9 +718,10 @@ void LLPanelPicks::createNewPick()
void LLPanelPicks::createNewClassified()
{
- createClassifiedEditPanel();
+ LLPanelClassifiedEdit* panel = NULL;
+ createClassifiedEditPanel(&panel);
- getProfilePanel()->openPanel(mPanelClassifiedEdit, LLSD());
+ getProfilePanel()->openPanel(panel, LLSD());
}
void LLPanelPicks::onClickInfo()
@@ -749,26 +761,20 @@ void LLPanelPicks::openClassifiedInfo()
if (selected_value.isUndefined()) return;
LLClassifiedItem* c_item = getSelectedClassifiedItem();
+ LLSD params;
+ params["classified_id"] = c_item->getClassifiedId();
+ params["classified_creator_id"] = c_item->getAvatarId();
+ params["classified_snapshot_id"] = c_item->getSnapshotId();
+ params["classified_name"] = c_item->getClassifiedName();
+ params["classified_desc"] = c_item->getDescription();
+ params["from_search"] = false;
- openClassifiedInfo(c_item->getClassifiedId(), c_item->getAvatarId(),
- c_item->getSnapshotId(), c_item->getClassifiedName(),
- c_item->getDescription());
+ openClassifiedInfo(params);
}
-void LLPanelPicks::openClassifiedInfo(const LLUUID &classified_id,
- const LLUUID &avatar_id,
- const LLUUID &snapshot_id,
- const std::string &name, const std::string &desc)
+void LLPanelPicks::openClassifiedInfo(const LLSD &params)
{
createClassifiedInfoPanel();
-
- LLSD params;
- 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);
}
@@ -800,11 +806,10 @@ void LLPanelPicks::onPanelClassifiedSave(LLPanelClassifiedEdit* panel)
if(panel->isNew())
{
+ mEditClassifiedPanels[panel->getClassifiedId()] = panel;
+
LLClassifiedItem* c_item = new LLClassifiedItem(getAvatarId(), panel->getClassifiedId());
-
- c_item->setClassifiedName(panel->getClassifiedName());
- c_item->setDescription(panel->getDescription());
- c_item->setSnapshotId(panel->getSnapshotId());
+ c_item->fillIn(panel);
LLSD c_value;
c_value.insert(CLASSIFIED_ID, c_item->getClassifiedId());
@@ -820,6 +825,15 @@ void LLPanelPicks::onPanelClassifiedSave(LLPanelClassifiedEdit* panel)
mClassifiedsAccTab->changeOpenClose(false);
showAccordion("tab_classifieds", true);
}
+ else if(panel->isNewWithErrors())
+ {
+ LLClassifiedItem* c_item = dynamic_cast<LLClassifiedItem*>(mClassifiedsList->getSelectedItem());
+ llassert(c_item);
+ if (c_item)
+ {
+ c_item->fillIn(panel);
+ }
+ }
else
{
onPanelClassifiedClose(panel);
@@ -843,10 +857,13 @@ void LLPanelPicks::onPanelClassifiedClose(LLPanelClassifiedInfo* panel)
{
LLClassifiedItem* c_item = dynamic_cast<LLClassifiedItem*>(
mClassifiedsList->getItemByValue(values[n]));
-
- c_item->setClassifiedName(panel->getClassifiedName());
- c_item->setDescription(panel->getDescription());
- c_item->setSnapshotId(panel->getSnapshotId());
+ llassert(c_item);
+ if (c_item)
+ {
+ c_item->setClassifiedName(panel->getClassifiedName());
+ c_item->setDescription(panel->getDescription());
+ c_item->setSnapshotId(panel->getSnapshotId());
+ }
}
}
}
@@ -877,15 +894,16 @@ void LLPanelPicks::createClassifiedInfoPanel()
}
}
-void LLPanelPicks::createClassifiedEditPanel()
+void LLPanelPicks::createClassifiedEditPanel(LLPanelClassifiedEdit** panel)
{
- if(!mPanelClassifiedEdit)
+ if(panel)
{
- mPanelClassifiedEdit = LLPanelClassifiedEdit::create();
- mPanelClassifiedEdit->setExitCallback(boost::bind(&LLPanelPicks::onPanelClassifiedClose, this, mPanelClassifiedEdit));
- mPanelClassifiedEdit->setSaveCallback(boost::bind(&LLPanelPicks::onPanelClassifiedSave, this, mPanelClassifiedEdit));
- mPanelClassifiedEdit->setCancelCallback(boost::bind(&LLPanelPicks::onPanelClassifiedClose, this, mPanelClassifiedEdit));
- mPanelClassifiedEdit->setVisible(FALSE);
+ LLPanelClassifiedEdit* new_panel = LLPanelClassifiedEdit::create();
+ new_panel->setExitCallback(boost::bind(&LLPanelPicks::onPanelClassifiedClose, this, new_panel));
+ new_panel->setSaveCallback(boost::bind(&LLPanelPicks::onPanelClassifiedSave, this, new_panel));
+ new_panel->setCancelCallback(boost::bind(&LLPanelPicks::onPanelClassifiedClose, this, new_panel));
+ new_panel->setVisible(FALSE);
+ *panel = new_panel;
}
}
@@ -957,17 +975,32 @@ void LLPanelPicks::onPanelClassifiedEdit()
}
LLClassifiedItem* c_item = dynamic_cast<LLClassifiedItem*>(mClassifiedsList->getSelectedItem());
-
- createClassifiedEditPanel();
+ llassert(c_item);
+ if (!c_item)
+ {
+ return;
+ }
LLSD params;
params["classified_id"] = c_item->getClassifiedId();
- params["avatar_id"] = c_item->getAvatarId();
+ params["classified_creator_id"] = c_item->getAvatarId();
params["snapshot_id"] = c_item->getSnapshotId();
params["name"] = c_item->getClassifiedName();
params["desc"] = c_item->getDescription();
-
- getProfilePanel()->openPanel(mPanelClassifiedEdit, params);
+ params["category"] = (S32)c_item->getCategory();
+ params["content_type"] = (S32)c_item->getContentType();
+ params["auto_renew"] = c_item->getAutoRenew();
+ params["price_for_listing"] = c_item->getPriceForListing();
+ params["location_text"] = c_item->getLocationText();
+
+ LLPanelClassifiedEdit* panel = mEditClassifiedPanels[c_item->getClassifiedId()];
+ if(!panel)
+ {
+ createClassifiedEditPanel(&panel);
+ mEditClassifiedPanels[c_item->getClassifiedId()] = panel;
+ }
+ getProfilePanel()->openPanel(panel, params);
+ panel->setPosGlobal(c_item->getPosGlobal());
}
void LLPanelPicks::onClickMenuEdit()
@@ -982,6 +1015,20 @@ void LLPanelPicks::onClickMenuEdit()
}
}
+bool LLPanelPicks::onEnableMenuItem(const LLSD& user_data)
+{
+ std::string param = user_data.asString();
+
+ LLClassifiedItem* c_item = dynamic_cast<LLClassifiedItem*>(mClassifiedsList->getSelectedItem());
+ if(c_item && "info" == param)
+ {
+ // dont show Info panel if classified was not created
+ return isClassifiedPublished(c_item);
+ }
+
+ return true;
+}
+
inline LLPanelProfile* LLPanelPicks::getProfilePanel()
{
llassert_always(NULL != mProfilePanel);
@@ -1170,6 +1217,24 @@ void LLClassifiedItem::setValue(const LLSD& value)
childSetVisible("selected_icon", value["selected"]);
}
+void LLClassifiedItem::fillIn(LLPanelClassifiedEdit* panel)
+{
+ if(!panel)
+ {
+ return;
+ }
+
+ setClassifiedName(panel->getClassifiedName());
+ setDescription(panel->getDescription());
+ setSnapshotId(panel->getSnapshotId());
+ setCategory(panel->getCategory());
+ setContentType(panel->getContentType());
+ setAutoRenew(panel->getAutoRenew());
+ setPriceForListing(panel->getPriceForListing());
+ setPosGlobal(panel->getPosGlobal());
+ setLocationText(panel->getClassifiedLocation());
+}
+
void LLClassifiedItem::setClassifiedName(const std::string& name)
{
childSetValue("name", name);
diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h
index 3f757e482e..a98b8c413e 100644
--- a/indra/newview/llpanelpicks.h
+++ b/indra/newview/llpanelpicks.h
@@ -55,7 +55,6 @@ class LLPanelPickEdit;
class LLToggleableMenu;
class LLPanelClassifiedInfo;
class LLPanelClassifiedEdit;
-class LLClassifiedClickThrough;
// *TODO
// Panel Picks has been consolidated with Classifieds (EXT-2095), give LLPanelPicks
@@ -99,6 +98,8 @@ private:
void onPlusMenuItemClicked(const LLSD& param);
bool isActionEnabled(const LLSD& userdata) const;
+ bool isClassifiedPublished(LLClassifiedItem* c_item);
+
void onListCommit(const LLFlatListView* f_list);
void onAccordionStateChanged(const LLAccordionCtrlTab* acc_tab);
@@ -115,14 +116,14 @@ private:
void onPanelClassifiedEdit();
void onClickMenuEdit();
+ bool onEnableMenuItem(const LLSD& user_data);
+
void createNewPick();
void createNewClassified();
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);
+ void openClassifiedInfo(const LLSD& params);
friend class LLPanelProfile;
void showAccordion(const std::string& name, bool show);
@@ -143,7 +144,7 @@ private:
void createPickInfoPanel();
void createPickEditPanel();
void createClassifiedInfoPanel();
- void createClassifiedEditPanel();
+ void createClassifiedEditPanel(LLPanelClassifiedEdit** panel);
LLMenuGL* mPopupMenu;
LLPanelProfile* mProfilePanel;
@@ -152,15 +153,19 @@ private:
LLFlatListView* mClassifiedsList;
LLPanelPickInfo* mPanelPickInfo;
LLPanelClassifiedInfo* mPanelClassifiedInfo;
- LLPanelClassifiedEdit* mPanelClassifiedEdit;
LLPanelPickEdit* mPanelPickEdit;
LLToggleableMenu* mPlusMenu;
+ // <classified_id, edit_panel>
+ typedef std::map<LLUUID, LLPanelClassifiedEdit*> panel_classified_edit_map_t;
+
+ // This map is needed for newly created classifieds. The purpose of panel is to
+ // sit in this map and listen to LLPanelClassifiedEdit::processProperties callback.
+ panel_classified_edit_map_t mEditClassifiedPanels;
+
LLAccordionCtrlTab* mPicksAccTab;
LLAccordionCtrlTab* mClassifiedsAccTab;
- LLClassifiedClickThrough* mClickThroughDisp;
-
//true if picks list is empty after processing picks
bool mNoPicks;
//true if classifieds list is empty after processing classifieds
@@ -250,6 +255,8 @@ public:
/*virtual*/ void setValue(const LLSD& value);
+ void fillIn(LLPanelClassifiedEdit* panel);
+
LLUUID getAvatarId() {return mAvatarId;}
void setAvatarId(const LLUUID& avatar_id) {mAvatarId = avatar_id;}
@@ -260,7 +267,11 @@ public:
void setPosGlobal(const LLVector3d& pos) { mPosGlobal = pos; }
- const LLVector3d& getPosGlobal() { return mPosGlobal; }
+ const LLVector3d getPosGlobal() { return mPosGlobal; }
+
+ void setLocationText(const std::string location) { mLocationText = location; }
+
+ std::string getLocationText() { return mLocationText; }
void setClassifiedName (const std::string& name);
@@ -274,10 +285,31 @@ public:
LLUUID getSnapshotId();
+ void setCategory(U32 cat) { mCategory = cat; }
+
+ U32 getCategory() { return mCategory; }
+
+ void setContentType(U32 ct) { mContentType = ct; }
+
+ U32 getContentType() { return mContentType; }
+
+ void setAutoRenew(U32 renew) { mAutoRenew = renew; }
+
+ bool getAutoRenew() { return mAutoRenew; }
+
+ void setPriceForListing(S32 price) { mPriceForListing = price; }
+
+ S32 getPriceForListing() { return mPriceForListing; }
+
private:
LLUUID mAvatarId;
LLUUID mClassifiedId;
LLVector3d mPosGlobal;
+ std::string mLocationText;
+ U32 mCategory;
+ U32 mContentType;
+ bool mAutoRenew;
+ S32 mPriceForListing;
};
#endif // LL_LLPANELPICKS_H
diff --git a/indra/newview/llpanelplaceinfo.cpp b/indra/newview/llpanelplaceinfo.cpp
index 9ebc8ca2b9..f6133d4446 100644
--- a/indra/newview/llpanelplaceinfo.cpp
+++ b/indra/newview/llpanelplaceinfo.cpp
@@ -256,7 +256,7 @@ void LLPanelPlaceInfo::reshape(S32 width, S32 height, BOOL called_from_parent)
static LLUICachedControl<S32> scrollbar_size ("UIScrollbarSize", 0);
S32 scroll_height = mScrollContainer->getRect().getHeight();
- if (mScrollingPanelMinHeight >= scroll_height)
+ if (mScrollingPanelMinHeight > scroll_height)
{
mScrollingPanel->reshape(mScrollingPanelWidth, mScrollingPanelMinHeight);
}
diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp
index 9e5f9da0ea..1f979b0ef1 100644
--- a/indra/newview/llpanelplaceprofile.cpp
+++ b/indra/newview/llpanelplaceprofile.cpp
@@ -50,7 +50,7 @@
#include "llagentui.h"
#include "llappviewer.h"
#include "llcallbacklist.h"
-#include "llfloaterbuycurrency.h"
+#include "llbuycurrencyhtml.h"
#include "llstatusbar.h"
#include "llviewercontrol.h"
#include "llviewerparcelmgr.h"
@@ -84,7 +84,9 @@ LLPanelPlaceProfile::LLPanelPlaceProfile()
// virtual
LLPanelPlaceProfile::~LLPanelPlaceProfile()
-{}
+{
+ gIdleCallbacks.deleteFunction(&LLPanelPlaceProfile::updateYouAreHereBanner, this);
+}
// virtual
BOOL LLPanelPlaceProfile::postBuild()
@@ -567,9 +569,13 @@ void LLPanelPlaceProfile::onForSaleBannerClick()
if(parcel->getLocalID() == mSelectedParcelID &&
mLastSelectedRegionID ==selected_region->getRegionID())
{
- if(parcel->getSalePrice() - gStatusBar->getBalance() > 0)
+ S32 price = parcel->getSalePrice();
+
+ if(price - gStatusBar->getBalance() > 0)
{
- LLFloaterBuyCurrency::buyCurrency("Buying selected land ", parcel->getSalePrice());
+ LLStringUtil::format_map_t args;
+ args["AMOUNT"] = llformat("%d", price);
+ LLBuyCurrencyHTML::openCurrencyFloater( LLTrans::getString("buying_selected_land", args), price );
}
else
{
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index a49386cb5c..705b196ef1 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -252,6 +252,9 @@ BOOL LLPanelPlaces::postBuild()
mOverflowBtn = getChild<LLButton>("overflow_btn");
mOverflowBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onOverflowButtonClicked, this));
+ mPlaceInfoBtn = getChild<LLButton>("profile_btn");
+ mPlaceInfoBtn->setClickedCallback(boost::bind(&LLPanelPlaces::onProfileButtonClicked, this));
+
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
registrar.add("Places.OverflowMenu.Action", boost::bind(&LLPanelPlaces::onOverflowMenuItemClicked, this, _2));
LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
@@ -278,6 +281,11 @@ BOOL LLPanelPlaces::postBuild()
mFilterEditor = getChild<LLFilterEditor>("Filter");
if (mFilterEditor)
{
+ //when list item is being clicked the filter editor looses focus
+ //committing on focus lost leads to detaching list items
+ //BUT a detached list item cannot be made selected and must not be clicked onto
+ mFilterEditor->setCommitOnFocusLost(false);
+
mFilterEditor->setCommitCallback(boost::bind(&LLPanelPlaces::onFilterEdit, this, _2, false));
}
@@ -520,8 +528,7 @@ void LLPanelPlaces::onFilterEdit(const std::string& search_string, bool force_fi
std::string string = search_string;
// Searches are case-insensitive
- LLStringUtil::toUpper(string);
- LLStringUtil::trimHead(string);
+ // but we don't convert the typed string to upper-case so that it can be fed to the web search as-is.
mActivePanel->onSearchEdit(string);
}
@@ -546,7 +553,9 @@ void LLPanelPlaces::onTeleportButtonClicked()
{
LLSD payload;
payload["asset_id"] = mItem->getAssetUUID();
- LLNotificationsUtil::add("TeleportFromLandmark", LLSD(), payload);
+ LLSD args;
+ args["LOCATION"] = mItem->getName();
+ LLNotificationsUtil::add("TeleportFromLandmark", args, payload);
}
else if (mPlaceInfoType == AGENT_INFO_TYPE ||
mPlaceInfoType == REMOTE_PLACE_INFO_TYPE ||
@@ -606,8 +615,21 @@ void LLPanelPlaces::onShowOnMapButtonClicked()
}
else
{
- if (mActivePanel)
+ if (mActivePanel && mActivePanel->isSingleItemSelected())
+ {
mActivePanel->onShowOnMap();
+ }
+ else
+ {
+ LLFloaterWorldMap* worldmap_instance = LLFloaterWorldMap::getInstance();
+ LLVector3d global_pos = gAgent.getPositionGlobal();
+
+ if (!global_pos.isExactlyZero() && worldmap_instance)
+ {
+ worldmap_instance->trackLocation(global_pos);
+ LLFloaterReg::showInstance("world_map", "center");
+ }
+ }
}
}
@@ -738,6 +760,14 @@ void LLPanelPlaces::onOverflowButtonClicked()
LLMenuGL::showPopup(this, menu, rect.mRight, rect.mTop);
}
+void LLPanelPlaces::onProfileButtonClicked()
+{
+ if (!mActivePanel)
+ return;
+
+ mActivePanel->onShowProfile();
+}
+
bool LLPanelPlaces::onOverflowMenuItemEnable(const LLSD& param)
{
std::string value = param.asString();
@@ -1001,21 +1031,22 @@ void LLPanelPlaces::changedGlobalPos(const LLVector3d &global_pos)
updateVerbs();
}
-void LLPanelPlaces::showAddedLandmarkInfo(const std::vector<LLUUID>& items)
+void LLPanelPlaces::showAddedLandmarkInfo(const uuid_vec_t& items)
{
- for (std::vector<LLUUID>::const_iterator item_iter = items.begin();
+ for (uuid_vec_t::const_iterator item_iter = items.begin();
item_iter != items.end();
++item_iter)
{
const LLUUID& item_id = (*item_iter);
- if(!highlight_offered_item(item_id))
+ if(!highlight_offered_object(item_id))
{
continue;
}
LLInventoryItem* item = gInventory.getItem(item_id);
- if (LLAssetType::AT_LANDMARK == item->getType())
+ llassert(item);
+ if (item && (LLAssetType::AT_LANDMARK == item->getType()) )
{
// Created landmark is passed to Places panel to allow its editing.
// If the panel is closed we don't reopen it until created landmark is loaded.
@@ -1023,7 +1054,6 @@ void LLPanelPlaces::showAddedLandmarkInfo(const std::vector<LLUUID>& items)
{
setItem(item);
}
- break;
}
}
}
@@ -1048,14 +1078,14 @@ void LLPanelPlaces::updateVerbs()
mTeleportBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn);
mShowOnMapBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn);
- mOverflowBtn->setVisible(!is_create_landmark_visible && !isLandmarkEditModeOn);
+ mOverflowBtn->setVisible(is_place_info_visible && !is_create_landmark_visible && !isLandmarkEditModeOn);
mEditBtn->setVisible(mPlaceInfoType == LANDMARK_INFO_TYPE && !isLandmarkEditModeOn);
mSaveBtn->setVisible(isLandmarkEditModeOn);
mCancelBtn->setVisible(isLandmarkEditModeOn);
mCloseBtn->setVisible(is_create_landmark_visible && !isLandmarkEditModeOn);
+ mPlaceInfoBtn->setVisible(!is_place_info_visible && !is_create_landmark_visible && !isLandmarkEditModeOn);
- mShowOnMapBtn->setEnabled(!is_create_landmark_visible && !isLandmarkEditModeOn && have_3d_pos);
- mOverflowBtn->setEnabled(is_place_info_visible && !is_create_landmark_visible);
+ mPlaceInfoBtn->setEnabled(!is_create_landmark_visible && !isLandmarkEditModeOn && have_3d_pos);
if (is_place_info_visible)
{
diff --git a/indra/newview/llpanelplaces.h b/indra/newview/llpanelplaces.h
index 78fcbbb11d..7a77fc9300 100644
--- a/indra/newview/llpanelplaces.h
+++ b/indra/newview/llpanelplaces.h
@@ -73,7 +73,7 @@ public:
void changedGlobalPos(const LLVector3d &global_pos);
// Opens landmark info panel when agent creates or receives landmark.
- void showAddedLandmarkInfo(const std::vector<LLUUID>& items);
+ void showAddedLandmarkInfo(const uuid_vec_t& items);
void setItem(LLInventoryItem* item);
@@ -98,6 +98,7 @@ private:
bool onOverflowMenuItemEnable(const LLSD& param);
void onCreateLandmarkButtonClicked(const LLUUID& folder_id);
void onBackButtonClicked();
+ void onProfileButtonClicked();
void toggleMediaPanel();
void togglePickPanel(BOOL visible);
@@ -128,6 +129,7 @@ private:
LLButton* mCancelBtn;
LLButton* mCloseBtn;
LLButton* mOverflowBtn;
+ LLButton* mPlaceInfoBtn;
LLPlacesInventoryObserver* mInventoryObserver;
LLPlacesParcelObserver* mParcelObserver;
diff --git a/indra/newview/llpanelplacestab.cpp b/indra/newview/llpanelplacestab.cpp
index 9806b8c64d..0f3c51fb4f 100644
--- a/indra/newview/llpanelplacestab.cpp
+++ b/indra/newview/llpanelplacestab.cpp
@@ -56,6 +56,7 @@ void LLPanelPlacesTab::setPanelPlacesButtons(LLPanelPlaces* panel)
{
mTeleportBtn = panel->getChild<LLButton>("teleport_btn");
mShowOnMapBtn = panel->getChild<LLButton>("map_btn");
+ mShowProfile = panel->getChild<LLButton>("profile_btn");
}
void LLPanelPlacesTab::onRegionResponse(const LLVector3d& landmark_global_pos,
@@ -70,10 +71,7 @@ void LLPanelPlacesTab::onRegionResponse(const LLVector3d& landmark_global_pos,
std::string sl_url;
if ( gotSimName )
{
- F32 region_x = (F32)fmod( landmark_global_pos.mdV[VX], (F64)REGION_WIDTH_METERS );
- F32 region_y = (F32)fmod( landmark_global_pos.mdV[VY], (F64)REGION_WIDTH_METERS );
-
- sl_url = LLSLURL::buildSLURL(sim_name, llround(region_x), llround(region_y), llround((F32)landmark_global_pos.mdV[VZ]));
+ sl_url = LLSLURL(sim_name, landmark_global_pos).getSLURLString();
}
else
{
diff --git a/indra/newview/llpanelplacestab.h b/indra/newview/llpanelplacestab.h
index ce77a42259..4a155afd71 100644
--- a/indra/newview/llpanelplacestab.h
+++ b/indra/newview/llpanelplacestab.h
@@ -45,7 +45,9 @@ public:
virtual void onSearchEdit(const std::string& string) = 0;
virtual void updateVerbs() = 0; // Updates buttons at the bottom of Places panel
virtual void onShowOnMap() = 0;
+ virtual void onShowProfile() = 0;
virtual void onTeleport() = 0;
+ virtual bool isSingleItemSelected() = 0;
bool isTabVisible(); // Check if parent TabContainer is visible.
@@ -62,6 +64,7 @@ public:
protected:
LLButton* mTeleportBtn;
LLButton* mShowOnMapBtn;
+ LLButton* mShowProfile;
// Search string for filtering landmarks and teleport history locations
static std::string sFilterSubString;
diff --git a/indra/newview/llpanelprimmediacontrols.cpp b/indra/newview/llpanelprimmediacontrols.cpp
index 2dc3a62637..0648d99685 100644
--- a/indra/newview/llpanelprimmediacontrols.cpp
+++ b/indra/newview/llpanelprimmediacontrols.cpp
@@ -31,8 +31,8 @@
#include "llviewerprecompiledheaders.h"
-//LLPanelPrimMediaControls
#include "llagent.h"
+#include "llagentcamera.h"
#include "llparcel.h"
#include "llpanel.h"
#include "llselectmgr.h"
@@ -64,7 +64,6 @@
#include "llvovolume.h"
#include "llweb.h"
#include "llwindow.h"
-
#include "llfloatertools.h" // to enable hide if build tools are up
// Functions pulled from pipeline.cpp
@@ -351,6 +350,11 @@ void LLPanelPrimMediaControls::updateShape()
mHomeCtrl->setEnabled(has_focus && can_navigate);
LLPluginClassMediaOwner::EMediaStatus result = ((media_impl != NULL) && media_impl->hasMedia()) ? media_plugin->getStatus() : LLPluginClassMediaOwner::MEDIA_NONE;
+ mVolumeCtrl->setVisible(has_focus);
+ mVolumeCtrl->setEnabled(has_focus);
+ mVolumeSliderCtrl->setEnabled(has_focus && shouldVolumeSliderBeVisible());
+ mVolumeSliderCtrl->setVisible(has_focus && shouldVolumeSliderBeVisible());
+
if(media_plugin && media_plugin->pluginSupportsMediaTime())
{
mReloadCtrl->setEnabled(false);
@@ -463,11 +467,15 @@ void LLPanelPrimMediaControls::updateShape()
mSkipBackCtrl->setVisible(FALSE);
mSkipBackCtrl->setEnabled(FALSE);
- mVolumeCtrl->setVisible(FALSE);
- mVolumeSliderCtrl->setVisible(FALSE);
- mVolumeCtrl->setEnabled(FALSE);
- mVolumeSliderCtrl->setEnabled(FALSE);
-
+ if(media_impl->getVolume() <= 0.0)
+ {
+ mMuteBtn->setToggleState(true);
+ }
+ else
+ {
+ mMuteBtn->setToggleState(false);
+ }
+
if (mMediaPanelScroll)
{
mMediaPanelScroll->setVisible(has_focus);
@@ -724,10 +732,10 @@ void LLPanelPrimMediaControls::draw()
mMediaControlsStack->updateLayout();
// adjust for layout stack spacing
- S32 space = mMediaControlsStack->getPanelSpacing() + 1;
+ S32 space = mMediaControlsStack->getPanelSpacing() + 2;
LLRect controls_bg_area = mMediaControlsStack->getRect();
- controls_bg_area.mTop += space;
+ controls_bg_area.mTop += space + 2;
// adjust to ignore space from volume slider
controls_bg_area.mBottom += mVolumeSliderCtrl->getRect().getHeight();
@@ -736,7 +744,7 @@ void LLPanelPrimMediaControls::draw()
controls_bg_area.mLeft += mLeftBookend->getRect().getWidth() - space;
// ignore space from right bookend padding
- controls_bg_area.mRight -= mRightBookend->getRect().getWidth() - space;
+ controls_bg_area.mRight -= mRightBookend->getRect().getWidth() - space - 2;
// draw control background UI image
mBackgroundImage->draw( controls_bg_area, UI_VERTEX_COLOR % alpha);
@@ -1010,7 +1018,7 @@ void LLPanelPrimMediaControls::updateZoom()
{
case ZOOM_NONE:
{
- gAgent.setFocusOnAvatar(TRUE, ANIMATE);
+ gAgentCamera.setFocusOnAvatar(TRUE, ANIMATE);
break;
}
case ZOOM_FAR:
@@ -1030,14 +1038,15 @@ void LLPanelPrimMediaControls::updateZoom()
}
default:
{
- gAgent.setFocusOnAvatar(TRUE, ANIMATE);
+ gAgentCamera.setFocusOnAvatar(TRUE, ANIMATE);
break;
}
}
if (zoom_padding > 0.0f)
- {
- LLViewerMediaFocus::setCameraZoom(getTargetObject(), mTargetObjectNormal, zoom_padding);
+ {
+ // since we only zoom into medium for now, always set zoom_in constraint to true
+ LLViewerMediaFocus::setCameraZoom(getTargetObject(), mTargetObjectNormal, zoom_padding, true);
}
// Remember the object ID/face we zoomed into, so we can update the zoom icon appropriately
diff --git a/indra/newview/llpanelprimmediacontrols.h b/indra/newview/llpanelprimmediacontrols.h
index 743cec70a1..2e0de7866c 100644
--- a/indra/newview/llpanelprimmediacontrols.h
+++ b/indra/newview/llpanelprimmediacontrols.h
@@ -58,6 +58,16 @@ public:
void updateShape();
bool isMouseOver();
+
+ enum EZoomLevel
+ {
+ ZOOM_NONE = 0,
+ ZOOM_FAR,
+ ZOOM_MEDIUM,
+ ZOOM_NEAR
+ };
+
+ EZoomLevel getZoomLevel() const { return mCurrentZoom; }
void nextZoomLevel();
void resetZoomLevel(bool reset_camera = true);
void close();
@@ -66,13 +76,6 @@ public:
void setMediaFace(LLPointer<LLViewerObject> objectp, S32 face, viewer_media_t media_impl, LLVector3 pick_normal = LLVector3::zero);
- enum EZoomLevel
- {
- ZOOM_NONE = 0,
- ZOOM_FAR,
- ZOOM_MEDIUM,
- ZOOM_NEAR
- };
static const EZoomLevel kZoomLevels[];
static const int kNumZoomLevels;
diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp
index b5d85dfd4b..18da8dd48c 100644
--- a/indra/newview/llpanelprofile.cpp
+++ b/indra/newview/llpanelprofile.cpp
@@ -171,15 +171,13 @@ void LLPanelProfile::onOpen(const LLSD& key)
}
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);
+ LLSD params = key;
+ params.erase("show_tab_panel");
+ params.erase("open_tab_name");
+ picks->openClassifiedInfo(params);
}
}
}
diff --git a/indra/newview/llpanelteleporthistory.cpp b/indra/newview/llpanelteleporthistory.cpp
index 90c8f2551f..1048e3fcc0 100644
--- a/indra/newview/llpanelteleporthistory.cpp
+++ b/indra/newview/llpanelteleporthistory.cpp
@@ -348,7 +348,7 @@ LLContextMenu* LLTeleportHistoryPanel::ContextMenu::createMenu()
void LLTeleportHistoryPanel::ContextMenu::onTeleport()
{
- LLTeleportHistoryStorage::getInstance()->goToItem(mIndex);
+ confirmTeleport(mIndex);
}
void LLTeleportHistoryPanel::ContextMenu::onInfo()
@@ -477,6 +477,12 @@ void LLTeleportHistoryPanel::onSearchEdit(const std::string& string)
}
// virtual
+bool LLTeleportHistoryPanel::isSingleItemSelected()
+{
+ return mLastSelectedFlatlList && mLastSelectedFlatlList->getSelectedItem();
+}
+
+// virtual
void LLTeleportHistoryPanel::onShowOnMap()
{
if (!mLastSelectedFlatlList)
@@ -496,6 +502,20 @@ void LLTeleportHistoryPanel::onShowOnMap()
}
}
+//virtual
+void LLTeleportHistoryPanel::onShowProfile()
+{
+ if (!mLastSelectedFlatlList)
+ return;
+
+ LLTeleportHistoryFlatItem* itemp = dynamic_cast<LLTeleportHistoryFlatItem *> (mLastSelectedFlatlList->getSelectedItem());
+
+ if(!itemp)
+ return;
+
+ LLTeleportHistoryFlatItem::showPlaceInfoPanel(itemp->getIndex());
+}
+
// virtual
void LLTeleportHistoryPanel::onTeleport()
{
@@ -507,7 +527,7 @@ void LLTeleportHistoryPanel::onTeleport()
return;
// teleport to existing item in history, so we don't add it again
- mTeleportHistory->goToItem(itemp->getIndex());
+ confirmTeleport(itemp->getIndex());
}
/*
@@ -543,6 +563,7 @@ void LLTeleportHistoryPanel::updateVerbs()
if (!mLastSelectedFlatlList)
{
mTeleportBtn->setEnabled(false);
+ mShowProfile->setEnabled(false);
mShowOnMapBtn->setEnabled(false);
return;
}
@@ -550,6 +571,7 @@ void LLTeleportHistoryPanel::updateVerbs()
LLTeleportHistoryFlatItem* itemp = dynamic_cast<LLTeleportHistoryFlatItem *> (mLastSelectedFlatlList->getSelectedItem());
mTeleportBtn->setEnabled(NULL != itemp);
+ mShowProfile->setEnabled(NULL != itemp);
mShowOnMapBtn->setEnabled(NULL != itemp);
}
@@ -626,16 +648,18 @@ void LLTeleportHistoryPanel::refresh()
LLDate tab_boundary_date = LLDate::now();
LLFlatListView* curr_flat_view = NULL;
+ std::string filter_string = sFilterSubString;
+ LLStringUtil::toUpper(filter_string);
U32 added_items = 0;
while (mCurrentItem >= 0)
{
// Filtering
- if (!sFilterSubString.empty())
+ if (!filter_string.empty())
{
std::string landmark_title(items[mCurrentItem].mTitle);
LLStringUtil::toUpper(landmark_title);
- if( std::string::npos == landmark_title.find(sFilterSubString) )
+ if( std::string::npos == landmark_title.find(filter_string) )
{
mCurrentItem--;
continue;
@@ -684,7 +708,7 @@ void LLTeleportHistoryPanel::refresh()
.getFlatItemForPersistentItem(&mContextMenu,
items[mCurrentItem],
mCurrentItem,
- sFilterSubString);
+ filter_string);
if ( !curr_flat_view->addItem(item, LLUUID::null, ADD_BOTTOM, false) )
llerrs << "Couldn't add flat item to teleport history." << llendl;
if (mLastSelectedItemIndex == mCurrentItem)
@@ -707,6 +731,8 @@ void LLTeleportHistoryPanel::refresh()
}
}
+ mHistoryAccordion->setFilterSubString(sFilterSubString);
+
mHistoryAccordion->arrange();
updateVerbs();
@@ -1058,3 +1084,27 @@ void LLTeleportHistoryPanel::onAccordionExpand(LLUICtrl* ctrl, const LLSD& param
mLastSelectedFlatlList->resetSelection();
}
}
+
+// static
+void LLTeleportHistoryPanel::confirmTeleport(S32 hist_idx)
+{
+ LLSD args;
+ args["HISTORY_ENTRY"] = LLTeleportHistoryStorage::getInstance()->getItems()[hist_idx].mTitle;
+ LLNotificationsUtil::add("TeleportToHistoryEntry", args, LLSD(),
+ boost::bind(&LLTeleportHistoryPanel::onTeleportConfirmation, _1, _2, hist_idx));
+}
+
+// Called when user reacts upon teleport confirmation dialog.
+// static
+bool LLTeleportHistoryPanel::onTeleportConfirmation(const LLSD& notification, const LLSD& response, S32 hist_idx)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+
+ if (0 == option)
+ {
+ // Teleport to given history item.
+ LLTeleportHistoryStorage::getInstance()->goToItem(hist_idx);
+ }
+
+ return false;
+}
diff --git a/indra/newview/llpanelteleporthistory.h b/indra/newview/llpanelteleporthistory.h
index 4eeaec7705..87e7044222 100644
--- a/indra/newview/llpanelteleporthistory.h
+++ b/indra/newview/llpanelteleporthistory.h
@@ -47,6 +47,7 @@ class LLFlatListView;
class LLTeleportHistoryPanel : public LLPanelPlacesTab
{
public:
+ // *TODO: derive from LLListContextMenu?
class ContextMenu
{
public:
@@ -73,9 +74,11 @@ public:
/*virtual*/ void onSearchEdit(const std::string& string);
/*virtual*/ void onShowOnMap();
+ /*virtual*/ void onShowProfile();
/*virtual*/ void onTeleport();
///*virtual*/ void onCopySLURL();
/*virtual*/ void updateVerbs();
+ /*virtual*/ bool isSingleItemSelected();
private:
@@ -103,6 +106,9 @@ private:
bool isAccordionCollapsedByUser(LLUICtrl* acc_tab);
void onAccordionExpand(LLUICtrl* ctrl, const LLSD& param);
+ static void confirmTeleport(S32 hist_idx);
+ static bool onTeleportConfirmation(const LLSD& notification, const LLSD& response, S32 hist_idx);
+
LLTeleportHistoryStorage* mTeleportHistory;
LLAccordionCtrl* mHistoryAccordion;
@@ -119,4 +125,6 @@ private:
LLHandle<LLView> mGearMenuHandle;
};
+
+
#endif //LL_LLPANELTELEPORTHISTORY_H
diff --git a/indra/newview/llpaneltiptoast.cpp b/indra/newview/llpaneltiptoast.cpp
new file mode 100644
index 0000000000..23367df41a
--- /dev/null
+++ b/indra/newview/llpaneltiptoast.cpp
@@ -0,0 +1,69 @@
+/**
+ * @file llpaneltiptoast.cpp
+ * @brief Represents a base class of tip toast panels.
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpaneltiptoast.h"
+
+BOOL LLPanelTipToast::postBuild()
+{
+ mMessageText= findChild<LLUICtrl>("message");
+
+ if (mMessageText != NULL)
+ {
+ mMessageText->setMouseUpCallback(boost::bind(&LLPanelTipToast::onMessageTextClick,this));
+ setMouseUpCallback(boost::bind(&LLPanelTipToast::onPanelClick, this, _2, _3, _4));
+ }
+ else
+ {
+ llassert(!"Can't find child 'message' text box.");
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+void LLPanelTipToast::onMessageTextClick()
+{
+ // notify parent toast about need hide
+ LLSD info;
+ info["action"] = "hide_toast";
+ notifyParent(info);
+}
+
+void LLPanelTipToast::onPanelClick(S32 x, S32 y, MASK mask)
+{
+ if (!mMessageText->getRect().pointInRect(x, y))
+ {
+ onMessageTextClick();
+ }
+}
diff --git a/indra/newview/llpaneltiptoast.h b/indra/newview/llpaneltiptoast.h
new file mode 100644
index 0000000000..e8678aa1d3
--- /dev/null
+++ b/indra/newview/llpaneltiptoast.h
@@ -0,0 +1,57 @@
+/**
+ * @file llpaneltiptoast.h
+ * @brief Represents a base class of tip toast panels.
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+
+#include "lltoastpanel.h"
+
+#ifndef LL_PANELTOASTTIP_H
+#define LL_PANELTOASTTIP_H
+
+/**
+ * Base class for tip toast panels.
+ *
+ * Tip toast panels are required to have text message box named as 'message'.
+ */
+class LLPanelTipToast : public LLToastPanel
+{
+ LOG_CLASS(LLPanelTipToast);
+public:
+ LLPanelTipToast(const LLNotificationPtr& notification): LLToastPanel(notification) {}
+ virtual BOOL postBuild();
+private:
+ void onMessageTextClick();
+ void onPanelClick(S32 x, S32 y, MASK mask);
+
+ LLUICtrl* mMessageText;
+};
+
+#endif /* LL_PANELTOASTTIP_H */
diff --git a/indra/newview/llpaneltopinfobar.cpp b/indra/newview/llpaneltopinfobar.cpp
new file mode 100644
index 0000000000..68dc1cdf71
--- /dev/null
+++ b/indra/newview/llpaneltopinfobar.cpp
@@ -0,0 +1,426 @@
+/**
+ * @file llpaneltopinfobar.cpp
+ * @brief Coordinates and Parcel Settings information panel definition
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpaneltopinfobar.h"
+
+#include "llagent.h"
+#include "llagentui.h"
+#include "llclipboard.h"
+#include "lllandmarkactions.h"
+#include "lllocationinputctrl.h"
+#include "llnotificationsutil.h"
+#include "llparcel.h"
+#include "llsidetray.h"
+#include "llslurl.h"
+#include "llstatusbar.h"
+#include "llviewercontrol.h"
+#include "llviewerinventory.h"
+#include "llviewermenu.h"
+#include "llviewerparcelmgr.h"
+#include "llviewerregion.h"
+
+class LLPanelTopInfoBar::LLParcelChangeObserver : public LLParcelObserver
+{
+public:
+ LLParcelChangeObserver(LLPanelTopInfoBar* topInfoBar) : mTopInfoBar(topInfoBar) {}
+
+private:
+ /*virtual*/ void changed()
+ {
+ if (mTopInfoBar)
+ {
+ mTopInfoBar->updateParcelIcons();
+ }
+ }
+
+ LLPanelTopInfoBar* mTopInfoBar;
+};
+
+LLPanelTopInfoBar::LLPanelTopInfoBar(): mParcelChangedObserver(0)
+{
+ LLUICtrl::CommitCallbackRegistry::currentRegistrar()
+ .add("TopInfoBar.Action", boost::bind(&LLPanelTopInfoBar::onContextMenuItemClicked, this, _2));
+
+ LLUICtrlFactory::getInstance()->buildPanel(this, "panel_topinfo_bar.xml");
+}
+
+LLPanelTopInfoBar::~LLPanelTopInfoBar()
+{
+ if (mParcelChangedObserver)
+ {
+ LLViewerParcelMgr::getInstance()->removeObserver(mParcelChangedObserver);
+ delete mParcelChangedObserver;
+ }
+
+ if (mParcelPropsCtrlConnection.connected())
+ {
+ mParcelPropsCtrlConnection.disconnect();
+ }
+
+ if (mParcelMgrConnection.connected())
+ {
+ mParcelMgrConnection.disconnect();
+ }
+
+ if (mShowCoordsCtrlConnection.connected())
+ {
+ mShowCoordsCtrlConnection.disconnect();
+ }
+}
+
+void LLPanelTopInfoBar::initParcelIcons()
+{
+ mParcelIcon[VOICE_ICON] = getChild<LLIconCtrl>("voice_icon");
+ mParcelIcon[FLY_ICON] = getChild<LLIconCtrl>("fly_icon");
+ mParcelIcon[PUSH_ICON] = getChild<LLIconCtrl>("push_icon");
+ mParcelIcon[BUILD_ICON] = getChild<LLIconCtrl>("build_icon");
+ mParcelIcon[SCRIPTS_ICON] = getChild<LLIconCtrl>("scripts_icon");
+ mParcelIcon[DAMAGE_ICON] = getChild<LLIconCtrl>("damage_icon");
+
+ mParcelIcon[VOICE_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, VOICE_ICON));
+ mParcelIcon[FLY_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, FLY_ICON));
+ mParcelIcon[PUSH_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, PUSH_ICON));
+ mParcelIcon[BUILD_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, BUILD_ICON));
+ mParcelIcon[SCRIPTS_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, SCRIPTS_ICON));
+ mParcelIcon[DAMAGE_ICON]->setMouseDownCallback(boost::bind(&LLPanelTopInfoBar::onParcelIconClick, this, DAMAGE_ICON));
+
+ mDamageText->setText(LLStringExplicit("100%"));
+}
+
+void LLPanelTopInfoBar::handleLoginComplete()
+{
+ // An agent parcel update hasn't occurred yet, so
+ // we have to manually set location and the icons.
+ update();
+}
+
+BOOL LLPanelTopInfoBar::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+ show_topinfobar_context_menu(this, x, y);
+ return TRUE;
+}
+
+BOOL LLPanelTopInfoBar::postBuild()
+{
+ mInfoBtn = getChild<LLButton>("place_info_btn");
+ mInfoBtn->setClickedCallback(boost::bind(&LLPanelTopInfoBar::onInfoButtonClicked, this));
+
+ mParcelInfoText = getChild<LLTextBox>("parcel_info_text");
+ mDamageText = getChild<LLTextBox>("damage_text");
+
+ initParcelIcons();
+
+ mParcelChangedObserver = new LLParcelChangeObserver(this);
+ LLViewerParcelMgr::getInstance()->addObserver(mParcelChangedObserver);
+
+ // Connecting signal for updating parcel icons on "Show Parcel Properties" setting change.
+ LLControlVariable* ctrl = gSavedSettings.getControl("NavBarShowParcelProperties").get();
+ if (ctrl)
+ {
+ mParcelPropsCtrlConnection = ctrl->getSignal()->connect(boost::bind(&LLPanelTopInfoBar::updateParcelIcons, this));
+ }
+
+ // Connecting signal for updating parcel text on "Show Coordinates" setting change.
+ ctrl = gSavedSettings.getControl("NavBarShowCoordinates").get();
+ if (ctrl)
+ {
+ mShowCoordsCtrlConnection = ctrl->getSignal()->connect(boost::bind(&LLPanelTopInfoBar::onNavBarShowParcelPropertiesCtrlChanged, this));
+ }
+
+ mParcelMgrConnection = LLViewerParcelMgr::getInstance()->addAgentParcelChangedCallback(
+ boost::bind(&LLPanelTopInfoBar::onAgentParcelChange, this));
+
+ return TRUE;
+}
+
+void LLPanelTopInfoBar::onNavBarShowParcelPropertiesCtrlChanged()
+{
+ std::string new_text;
+
+ // don't need to have separate show_coords variable; if user requested the coords to be shown
+ // they will be added during the next call to the draw() method.
+ buildLocationString(new_text, false);
+ setParcelInfoText(new_text);
+}
+
+void LLPanelTopInfoBar::draw()
+{
+ updateParcelInfoText();
+ updateHealth();
+
+ LLPanel::draw();
+}
+
+void LLPanelTopInfoBar::buildLocationString(std::string& loc_str, bool show_coords)
+{
+ LLAgentUI::ELocationFormat format =
+ (show_coords ? LLAgentUI::LOCATION_FORMAT_FULL : LLAgentUI::LOCATION_FORMAT_NO_COORDS);
+
+ if (!LLAgentUI::buildLocationString(loc_str, format))
+ {
+ loc_str = "???";
+ }
+}
+
+void LLPanelTopInfoBar::setParcelInfoText(const std::string& new_text)
+{
+ const LLFontGL* font = mParcelInfoText->getDefaultFont();
+ S32 new_text_width = font->getWidth(new_text);
+
+ mParcelInfoText->setText(new_text);
+
+ LLRect rect = mParcelInfoText->getRect();
+ rect.setOriginAndSize(rect.mLeft, rect.mBottom, new_text_width, rect.getHeight());
+
+ mParcelInfoText->reshape(rect.getWidth(), rect.getHeight(), TRUE);
+ mParcelInfoText->setRect(rect);
+ layoutParcelIcons();
+}
+
+void LLPanelTopInfoBar::update()
+{
+ std::string new_text;
+
+ // don't need to have separate show_coords variable; if user requested the coords to be shown
+ // they will be added during the next call to the draw() method.
+ buildLocationString(new_text, false);
+ setParcelInfoText(new_text);
+
+ updateParcelIcons();
+}
+
+void LLPanelTopInfoBar::updateParcelInfoText()
+{
+ static LLUICachedControl<bool> show_coords("NavBarShowCoordinates", false);
+
+ if (show_coords)
+ {
+ std::string new_text;
+
+ buildLocationString(new_text, show_coords);
+ setParcelInfoText(new_text);
+ }
+}
+
+void LLPanelTopInfoBar::updateParcelIcons()
+{
+ LLViewerParcelMgr* vpm = LLViewerParcelMgr::getInstance();
+
+ LLViewerRegion* agent_region = gAgent.getRegion();
+ LLParcel* agent_parcel = vpm->getAgentParcel();
+ if (!agent_region || !agent_parcel)
+ return;
+
+ if (gSavedSettings.getBOOL("NavBarShowParcelProperties"))
+ {
+ LLParcel* current_parcel;
+ LLViewerRegion* selection_region = vpm->getSelectionRegion();
+ LLParcel* selected_parcel = vpm->getParcelSelection()->getParcel();
+
+ // If agent is in selected parcel we use its properties because
+ // they are updated more often by LLViewerParcelMgr than agent parcel properties.
+ // See LLViewerParcelMgr::processParcelProperties().
+ // This is needed to reflect parcel restrictions changes without having to leave
+ // the parcel and then enter it again. See EXT-2987
+ if (selected_parcel && selected_parcel->getLocalID() == agent_parcel->getLocalID()
+ && selection_region == agent_region)
+ {
+ current_parcel = selected_parcel;
+ }
+ else
+ {
+ current_parcel = agent_parcel;
+ }
+
+ bool allow_voice = vpm->allowAgentVoice(agent_region, current_parcel);
+ bool allow_fly = vpm->allowAgentFly(agent_region, current_parcel);
+ bool allow_push = vpm->allowAgentPush(agent_region, current_parcel);
+ bool allow_build = vpm->allowAgentBuild(current_parcel); // true when anyone is allowed to build. See EXT-4610.
+ bool allow_scripts = vpm->allowAgentScripts(agent_region, current_parcel);
+ bool allow_damage = vpm->allowAgentDamage(agent_region, current_parcel);
+
+ // Most icons are "block this ability"
+ mParcelIcon[VOICE_ICON]->setVisible( !allow_voice );
+ mParcelIcon[FLY_ICON]->setVisible( !allow_fly );
+ mParcelIcon[PUSH_ICON]->setVisible( !allow_push );
+ mParcelIcon[BUILD_ICON]->setVisible( !allow_build );
+ mParcelIcon[SCRIPTS_ICON]->setVisible( !allow_scripts );
+ mParcelIcon[DAMAGE_ICON]->setVisible( allow_damage );
+ mDamageText->setVisible(allow_damage);
+
+ layoutParcelIcons();
+ }
+ else
+ {
+ for (S32 i = 0; i < ICON_COUNT; ++i)
+ {
+ mParcelIcon[i]->setVisible(false);
+ }
+ mDamageText->setVisible(false);
+ }
+}
+
+void LLPanelTopInfoBar::updateHealth()
+{
+ static LLUICachedControl<bool> show_icons("NavBarShowParcelProperties", false);
+
+ // *FIXME: Status bar owns health information, should be in agent
+ if (show_icons && gStatusBar)
+ {
+ static S32 last_health = -1;
+ S32 health = gStatusBar->getHealth();
+ if (health != last_health)
+ {
+ std::string text = llformat("%d%%", health);
+ mDamageText->setText(text);
+ last_health = health;
+ }
+ }
+}
+
+void LLPanelTopInfoBar::layoutParcelIcons()
+{
+ // TODO: remove hard-coded values and read them as xml parameters
+ static const int FIRST_ICON_HPAD = 32;
+ static const int LAST_ICON_HPAD = 11;
+
+ S32 left = mParcelInfoText->getRect().mRight + FIRST_ICON_HPAD;
+
+ left = layoutWidget(mDamageText, left);
+
+ for (int i = ICON_COUNT - 1; i >= 0; --i)
+ {
+ left = layoutWidget(mParcelIcon[i], left);
+ }
+
+ LLRect rect = getRect();
+ rect.set(rect.mLeft, rect.mTop, left + LAST_ICON_HPAD, rect.mBottom);
+ setRect(rect);
+}
+
+S32 LLPanelTopInfoBar::layoutWidget(LLUICtrl* ctrl, S32 left)
+{
+ // TODO: remove hard-coded values and read them as xml parameters
+ static const int ICON_HPAD = 2;
+
+ if (ctrl->getVisible())
+ {
+ LLRect rect = ctrl->getRect();
+ rect.mRight = left + rect.getWidth();
+ rect.mLeft = left;
+
+ ctrl->setRect(rect);
+ left += rect.getWidth() + ICON_HPAD;
+ }
+
+ return left;
+}
+
+void LLPanelTopInfoBar::onParcelIconClick(EParcelIcon icon)
+{
+ switch (icon)
+ {
+ case VOICE_ICON:
+ LLNotificationsUtil::add("NoVoice");
+ break;
+ case FLY_ICON:
+ LLNotificationsUtil::add("NoFly");
+ break;
+ case PUSH_ICON:
+ LLNotificationsUtil::add("PushRestricted");
+ break;
+ case BUILD_ICON:
+ LLNotificationsUtil::add("NoBuild");
+ break;
+ case SCRIPTS_ICON:
+ {
+ LLViewerRegion* region = gAgent.getRegion();
+ if(region && region->getRegionFlags() & REGION_FLAGS_ESTATE_SKIP_SCRIPTS)
+ {
+ LLNotificationsUtil::add("ScriptsStopped");
+ }
+ else if(region && region->getRegionFlags() & REGION_FLAGS_SKIP_SCRIPTS)
+ {
+ LLNotificationsUtil::add("ScriptsNotRunning");
+ }
+ else
+ {
+ LLNotificationsUtil::add("NoOutsideScripts");
+ }
+ break;
+ }
+ case DAMAGE_ICON:
+ LLNotificationsUtil::add("NotSafe");
+ break;
+ case ICON_COUNT:
+ break;
+ // no default to get compiler warning when a new icon gets added
+ }
+}
+
+void LLPanelTopInfoBar::onAgentParcelChange()
+{
+ update();
+}
+
+void LLPanelTopInfoBar::onContextMenuItemClicked(const LLSD::String& item)
+{
+ if (item == "landmark")
+ {
+ LLViewerInventoryItem* landmark = LLLandmarkActions::findLandmarkForAgentPos();
+
+ if(landmark == NULL)
+ {
+ LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "create_landmark"));
+ }
+ else
+ {
+ LLSideTray::getInstance()->showPanel("panel_places",
+ LLSD().with("type", "landmark").with("id",landmark->getUUID()));
+ }
+ }
+ else if (item == "copy")
+ {
+ LLSLURL slurl;
+ LLAgentUI::buildSLURL(slurl, false);
+ LLUIString location_str(slurl.getSLURLString());
+
+ gClipboard.copyFromString(location_str);
+ }
+}
+
+void LLPanelTopInfoBar::onInfoButtonClicked()
+{
+ LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "agent"));
+}
diff --git a/indra/newview/llpaneltopinfobar.h b/indra/newview/llpaneltopinfobar.h
new file mode 100644
index 0000000000..e417a06a64
--- /dev/null
+++ b/indra/newview/llpaneltopinfobar.h
@@ -0,0 +1,159 @@
+/**
+ * @file llpaneltopinfobar.h
+ * @brief Coordinates and Parcel Settings information panel definition
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LLPANELTOPINFOBAR_H_
+#define LLPANELTOPINFOBAR_H_
+
+#include "llpanel.h"
+
+class LLButton;
+class LLTextBox;
+class LLIconCtrl;
+class LLParcelChangeObserver;
+
+class LLPanelTopInfoBar : public LLPanel, public LLSingleton<LLPanelTopInfoBar>
+{
+ LOG_CLASS(LLPanelTopInfoBar);
+
+public:
+ LLPanelTopInfoBar();
+ ~LLPanelTopInfoBar();
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void draw();
+
+ /**
+ * Updates location and parcel icons on login complete
+ */
+ void handleLoginComplete();
+
+private:
+ class LLParcelChangeObserver;
+
+ friend class LLParcelChangeObserver;
+
+ enum EParcelIcon
+ {
+ VOICE_ICON = 0,
+ FLY_ICON,
+ PUSH_ICON,
+ BUILD_ICON,
+ SCRIPTS_ICON,
+ DAMAGE_ICON,
+ ICON_COUNT
+ };
+
+ /**
+ * Initializes parcel icons controls. Called from the constructor.
+ */
+ void initParcelIcons();
+
+ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
+
+ /**
+ * Handles clicks on the parcel icons.
+ */
+ void onParcelIconClick(EParcelIcon icon);
+
+ /**
+ * Handles clicks on the info buttons.
+ */
+ void onInfoButtonClicked();
+
+ /**
+ * Called when agent changes the parcel.
+ */
+ void onAgentParcelChange();
+
+ /**
+ * Called when context menu item is clicked.
+ */
+ void onContextMenuItemClicked(const LLSD::String& userdata);
+
+ /**
+ * Called when user checks/unchecks Show Coordinates menu item.
+ */
+ void onNavBarShowParcelPropertiesCtrlChanged();
+
+ /**
+ * Shorthand to call updateParcelInfoText() and updateParcelIcons().
+ */
+ void update();
+
+ /**
+ * Updates parcel info text (mParcelInfoText).
+ */
+ void updateParcelInfoText();
+
+ /**
+ * Updates parcel icons (mParcelIcon[]).
+ */
+ void updateParcelIcons();
+
+ /**
+ * Updates health information (mDamageText).
+ */
+ void updateHealth();
+
+ /**
+ * Lays out all parcel icons starting from right edge of the mParcelInfoText + 11px
+ * (see screenshots in EXT-5808 for details).
+ */
+ void layoutParcelIcons();
+
+ /**
+ * Lays out a widget. Widget's rect mLeft becomes equal to the 'left' argument.
+ */
+ S32 layoutWidget(LLUICtrl* ctrl, S32 left);
+
+ /**
+ * Generates location string and returns it in the loc_str parameter.
+ */
+ void buildLocationString(std::string& loc_str, bool show_coords);
+
+ /**
+ * Sets new value to the mParcelInfoText and updates the size of the top bar.
+ */
+ void setParcelInfoText(const std::string& new_text);
+
+ LLButton* mInfoBtn;
+ LLTextBox* mParcelInfoText;
+ LLTextBox* mDamageText;
+ LLIconCtrl* mParcelIcon[ICON_COUNT];
+ LLParcelChangeObserver* mParcelChangedObserver;
+
+ boost::signals2::connection mParcelPropsCtrlConnection;
+ boost::signals2::connection mShowCoordsCtrlConnection;
+ boost::signals2::connection mParcelMgrConnection;
+};
+
+#endif /* LLPANELTOPINFOBAR_H_ */
diff --git a/indra/newview/llpanelvoiceeffect.cpp b/indra/newview/llpanelvoiceeffect.cpp
new file mode 100644
index 0000000000..fd470798ee
--- /dev/null
+++ b/indra/newview/llpanelvoiceeffect.cpp
@@ -0,0 +1,169 @@
+/**
+ * @file llpanelvoiceeffect.cpp
+ * @author Aimee
+ * @brief Panel to select Voice Morphs.
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llpanelvoiceeffect.h"
+
+#include "llcombobox.h"
+#include "llfloaterreg.h"
+#include "llpanel.h"
+#include "lltrans.h"
+#include "lltransientfloatermgr.h"
+#include "llvoiceclient.h"
+
+static LLRegisterPanelClassWrapper<LLPanelVoiceEffect> t_panel_voice_effect("panel_voice_effect");
+
+LLPanelVoiceEffect::LLPanelVoiceEffect()
+ : mVoiceEffectCombo(NULL)
+{
+ mCommitCallbackRegistrar.add("Voice.CommitVoiceEffect", boost::bind(&LLPanelVoiceEffect::onCommitVoiceEffect, this));
+}
+
+LLPanelVoiceEffect::~LLPanelVoiceEffect()
+{
+ LLView* combo_list_view = mVoiceEffectCombo->getChildView("ComboBox");
+ LLTransientFloaterMgr::getInstance()->removeControlView(combo_list_view);
+
+ if(LLVoiceClient::instanceExists())
+ {
+ LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface();
+ if (effect_interface)
+ {
+ effect_interface->removeObserver(this);
+ }
+ }
+}
+
+// virtual
+BOOL LLPanelVoiceEffect::postBuild()
+{
+ mVoiceEffectCombo = getChild<LLComboBox>("voice_effect");
+
+ // Need to tell LLTransientFloaterMgr about the combo list, otherwise it can't
+ // be clicked while in a docked floater as it extends outside the floater area.
+ LLView* combo_list_view = mVoiceEffectCombo->getChildView("ComboBox");
+ LLTransientFloaterMgr::getInstance()->addControlView(combo_list_view);
+
+ LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface();
+ if (effect_interface)
+ {
+ effect_interface->addObserver(this);
+ }
+
+ update(true);
+
+ return TRUE;
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// PRIVATE SECTION
+//////////////////////////////////////////////////////////////////////////
+
+void LLPanelVoiceEffect::onCommitVoiceEffect()
+{
+ LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface();
+ if (!effect_interface)
+ {
+ mVoiceEffectCombo->setEnabled(false);
+ return;
+ }
+
+ LLSD value = mVoiceEffectCombo->getValue();
+ if (value.asInteger() == PREVIEW_VOICE_EFFECTS)
+ {
+ // Open the Voice Morph preview floater
+ LLFloaterReg::showInstance("voice_effect");
+ }
+ else if (value.asInteger() == GET_VOICE_EFFECTS)
+ {
+ // Open the voice morphing info web page
+ LLWeb::loadURL(LLTrans::getString("voice_morphing_url"));
+ }
+ else
+ {
+ effect_interface->setVoiceEffect(value.asUUID());
+ }
+
+ mVoiceEffectCombo->setValue(effect_interface->getVoiceEffect());
+}
+
+// virtual
+void LLPanelVoiceEffect::onVoiceEffectChanged(bool effect_list_updated)
+{
+ update(effect_list_updated);
+}
+
+void LLPanelVoiceEffect::update(bool list_updated)
+{
+ if (mVoiceEffectCombo)
+ {
+ LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface();
+ if (list_updated)
+ {
+ // Add the default "No Voice Morph" entry.
+ mVoiceEffectCombo->removeall();
+ mVoiceEffectCombo->add(getString("no_voice_effect"), LLUUID::null);
+ mVoiceEffectCombo->addSeparator();
+
+ // Add entries for each Voice Morph.
+ const voice_effect_list_t& effect_list = effect_interface->getVoiceEffectList();
+ if (!effect_list.empty())
+ {
+ for (voice_effect_list_t::const_iterator it = effect_list.begin(); it != effect_list.end(); ++it)
+ {
+ mVoiceEffectCombo->add(it->first, it->second, ADD_BOTTOM);
+ }
+
+ mVoiceEffectCombo->addSeparator();
+ }
+
+ // Add the fixed entries to go to the preview floater or marketing page.
+ mVoiceEffectCombo->add(getString("preview_voice_effects"), PREVIEW_VOICE_EFFECTS);
+ mVoiceEffectCombo->add(getString("get_voice_effects"), GET_VOICE_EFFECTS);
+ }
+
+ if (effect_interface && LLVoiceClient::instance().isVoiceWorking())
+ {
+ // Select the current Voice Morph.
+ mVoiceEffectCombo->setValue(effect_interface->getVoiceEffect());
+ mVoiceEffectCombo->setEnabled(true);
+ }
+ else
+ {
+ // If voice isn't working or Voice Effects are not supported disable the control.
+ mVoiceEffectCombo->setValue(LLUUID::null);
+ mVoiceEffectCombo->setEnabled(false);
+ }
+ }
+}
diff --git a/indra/newview/llpanelvoiceeffect.h b/indra/newview/llpanelvoiceeffect.h
new file mode 100644
index 0000000000..b5bf2f05a8
--- /dev/null
+++ b/indra/newview/llpanelvoiceeffect.h
@@ -0,0 +1,73 @@
+/**
+ * @file llpanelvoiceeffect.h
+ * @author Aimee
+ * @brief Panel to select Voice Effects.
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_PANELVOICEEFFECT_H
+#define LL_PANELVOICEEFFECT_H
+
+#include "llpanel.h"
+#include "llvoiceclient.h"
+
+class LLComboBox;
+
+class LLPanelVoiceEffect
+ : public LLPanel
+ , public LLVoiceEffectObserver
+{
+public:
+ LOG_CLASS(LLPanelVoiceEffect);
+
+ LLPanelVoiceEffect();
+ virtual ~LLPanelVoiceEffect();
+
+ virtual BOOL postBuild();
+
+private:
+ void onCommitVoiceEffect();
+ void update(bool list_updated);
+
+ /// Called by voice effect provider when voice effect list is changed.
+ virtual void onVoiceEffectChanged(bool effect_list_updated);
+
+ // Fixed entries in the Voice Morph list
+ typedef enum e_voice_effect_combo_items
+ {
+ NO_VOICE_EFFECT = 0,
+ PREVIEW_VOICE_EFFECTS = 1,
+ GET_VOICE_EFFECTS = 2
+ } EVoiceEffectComboItems;
+
+ LLComboBox* mVoiceEffectCombo;
+};
+
+
+#endif //LL_PANELVOICEEFFECT_H
diff --git a/indra/newview/llpanelvolumepulldown.cpp b/indra/newview/llpanelvolumepulldown.cpp
index 74e37efe4e..ae52bd3703 100644
--- a/indra/newview/llpanelvolumepulldown.cpp
+++ b/indra/newview/llpanelvolumepulldown.cpp
@@ -56,6 +56,8 @@
// Default constructor
LLPanelVolumePulldown::LLPanelVolumePulldown()
{
+ mHoverTimer.stop();
+
mCommitCallbackRegistrar.add("Vol.setControlFalse", boost::bind(&LLPanelVolumePulldown::setControlFalse, this, _2));
mCommitCallbackRegistrar.add("Vol.GoAudioPrefs", boost::bind(&LLPanelVolumePulldown::onAdvancedButtonClick, this, _2));
LLUICtrlFactory::instance().buildPanel(this, "panel_volume_pulldown.xml");
@@ -77,6 +79,11 @@ void LLPanelVolumePulldown::onMouseEnter(S32 x, S32 y, MASK mask)
LLPanel::onMouseEnter(x,y,mask);
}
+/*virtual*/
+void LLPanelVolumePulldown::onTopLost()
+{
+ setVisible(FALSE);
+}
/*virtual*/
void LLPanelVolumePulldown::onMouseLeave(S32 x, S32 y, MASK mask)
@@ -91,19 +98,12 @@ void LLPanelVolumePulldown::handleVisibilityChange ( BOOL new_visibility )
if (new_visibility)
{
mHoverTimer.start(); // timer will be stopped when mouse hovers over panel
- gFocusMgr.setTopCtrl(this);
}
else
{
mHoverTimer.stop();
- gFocusMgr.setTopCtrl(NULL);
- }
-}
-/*virtual*/
-void LLPanelVolumePulldown::onTopLost()
-{
- setVisible(FALSE);
+ }
}
void LLPanelVolumePulldown::onAdvancedButtonClick(const LLSD& user_data)
diff --git a/indra/newview/llpanelvolumepulldown.h b/indra/newview/llpanelvolumepulldown.h
index 9f20caa1a8..7fb025f329 100644
--- a/indra/newview/llpanelvolumepulldown.h
+++ b/indra/newview/llpanelvolumepulldown.h
@@ -47,8 +47,8 @@ class LLPanelVolumePulldown : public LLPanel
/*virtual*/ void draw();
/*virtual*/ void onMouseEnter(S32 x, S32 y, MASK mask);
/*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
- /*virtual*/ void handleVisibilityChange ( BOOL new_visibility );
/*virtual*/ void onTopLost();
+ /*virtual*/ void handleVisibilityChange ( BOOL new_visibility );
/*virtual*/ BOOL postBuild();
private:
diff --git a/indra/newview/llparticipantlist.cpp b/indra/newview/llparticipantlist.cpp
index 1c4004c37a..8fe78a0f81 100644
--- a/indra/newview/llparticipantlist.cpp
+++ b/indra/newview/llparticipantlist.cpp
@@ -37,8 +37,11 @@
#include "llavataractions.h"
#include "llagent.h"
+#include "llimview.h"
+#include "llnotificationsutil.h"
#include "llparticipantlist.h"
#include "llspeakers.h"
+#include "llviewercontrol.h"
#include "llviewermenu.h"
#include "llvoiceclient.h"
@@ -49,8 +52,159 @@
static const LLAvatarItemAgentOnTopComparator AGENT_ON_TOP_NAME_COMPARATOR;
+// helper function to update AvatarList Item's indicator in the voice participant list
+static void update_speaker_indicator(const LLAvatarList* const avatar_list, const LLUUID& avatar_uuid, bool is_muted)
+{
+ LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*>(avatar_list->getItemByValue(avatar_uuid));
+ if (item)
+ {
+ LLOutputMonitorCtrl* indicator = item->getChild<LLOutputMonitorCtrl>("speaking_indicator");
+ indicator->setIsMuted(is_muted);
+ }
+}
+
+
+// See EXT-4301.
+/**
+ * class LLAvalineUpdater - observe the list of voice participants in session and check
+ * presence of Avaline Callers among them.
+ *
+ * LLAvalineUpdater is a LLVoiceClientParticipantObserver. It provides two kinds of validation:
+ * - whether Avaline caller presence among participants;
+ * - whether watched Avaline caller still exists in voice channel.
+ * Both validations have callbacks which will notify subscriber if any of event occur.
+ *
+ * @see findAvalineCaller()
+ * @see checkIfAvalineCallersExist()
+ */
+class LLAvalineUpdater : public LLVoiceClientParticipantObserver
+{
+public:
+ typedef boost::function<void(const LLUUID& speaker_id)> process_avaline_callback_t;
+
+ LLAvalineUpdater(process_avaline_callback_t found_cb, process_avaline_callback_t removed_cb)
+ : mAvalineFoundCallback(found_cb)
+ , mAvalineRemovedCallback(removed_cb)
+ {
+ LLVoiceClient::getInstance()->addObserver(this);
+ }
+ ~LLAvalineUpdater()
+ {
+ if (LLVoiceClient::instanceExists())
+ {
+ LLVoiceClient::getInstance()->removeObserver(this);
+ }
+ }
+
+ /**
+ * Adds UUID of Avaline caller to watch.
+ *
+ * @see checkIfAvalineCallersExist().
+ */
+ void watchAvalineCaller(const LLUUID& avaline_caller_id)
+ {
+ mAvalineCallers.insert(avaline_caller_id);
+ }
+
+ void onParticipantsChanged()
+ {
+ uuid_set_t participant_uuids;
+ LLVoiceClient::getInstance()->getParticipantList(participant_uuids);
+
+
+ // check whether Avaline caller exists among voice participants
+ // and notify Participant List
+ findAvalineCaller(participant_uuids);
+
+ // check whether watched Avaline callers still present among voice participant
+ // and remove if absents.
+ checkIfAvalineCallersExist(participant_uuids);
+ }
+
+private:
+ typedef std::set<LLUUID> uuid_set_t;
+
+ /**
+ * Finds Avaline callers among voice participants and calls mAvalineFoundCallback.
+ *
+ * When Avatar is in group call with Avaline caller and then ends call Avaline caller stays
+ * in Group Chat floater (exists in LLSpeakerMgr). If Avatar starts call with that group again
+ * Avaline caller is added to voice channel AFTER Avatar is connected to group call.
+ * But Voice Control Panel (VCP) is filled from session LLSpeakerMgr and there is no information
+ * if a speaker is Avaline caller.
+ *
+ * In this case this speaker is created as avatar and will be recreated when it appears in
+ * Avatar's Voice session.
+ *
+ * @see LLParticipantList::onAvalineCallerFound()
+ */
+ void findAvalineCaller(const uuid_set_t& participant_uuids)
+ {
+ uuid_set_t::const_iterator it = participant_uuids.begin(), it_end = participant_uuids.end();
+
+ for(; it != it_end; ++it)
+ {
+ const LLUUID& participant_id = *it;
+ if (!LLVoiceClient::getInstance()->isParticipantAvatar(participant_id))
+ {
+ LL_DEBUGS("Avaline") << "Avaline caller found among voice participants: " << participant_id << LL_ENDL;
+
+ if (mAvalineFoundCallback)
+ {
+ mAvalineFoundCallback(participant_id);
+ }
+ }
+ }
+ }
+
+ /**
+ * Finds Avaline callers which are not anymore among voice participants and calls mAvalineRemovedCallback.
+ *
+ * The problem is when Avaline caller ends a call it is removed from Voice Client session but
+ * still exists in LLSpeakerMgr. Server does not send such information.
+ * This method implements a HUCK to notify subscribers that watched Avaline callers by class
+ * are not anymore in the call.
+ *
+ * @see LLParticipantList::onAvalineCallerRemoved()
+ */
+ void checkIfAvalineCallersExist(const uuid_set_t& participant_uuids)
+ {
+ uuid_set_t::iterator it = mAvalineCallers.begin();
+ uuid_set_t::const_iterator participants_it_end = participant_uuids.end();
+
+ while (it != mAvalineCallers.end())
+ {
+ const LLUUID participant_id = *it;
+ LL_DEBUGS("Avaline") << "Check avaline caller: " << participant_id << LL_ENDL;
+ bool not_found = participant_uuids.find(participant_id) == participants_it_end;
+ if (not_found)
+ {
+ LL_DEBUGS("Avaline") << "Watched Avaline caller is not found among voice participants: " << participant_id << LL_ENDL;
+
+ // notify Participant List
+ if (mAvalineRemovedCallback)
+ {
+ mAvalineRemovedCallback(participant_id);
+ }
+
+ // remove from the watch list
+ mAvalineCallers.erase(it++);
+ }
+ else
+ {
+ ++it;
+ }
+ }
+ }
+
+ process_avaline_callback_t mAvalineFoundCallback;
+ process_avaline_callback_t mAvalineRemovedCallback;
+
+ uuid_set_t mAvalineCallers;
+};
+
LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list, bool use_context_menu/* = true*/,
- bool exclude_agent /*= true*/):
+ bool exclude_agent /*= true*/, bool can_toggle_icons /*= true*/):
mSpeakerMgr(data_source),
mAvatarList(avatar_list),
mSortOrder(E_SORT_BY_NAME)
@@ -58,6 +212,9 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av
, mExcludeAgent(exclude_agent)
, mValidateSpeakerCallback(NULL)
{
+ mAvalineUpdater = new LLAvalineUpdater(boost::bind(&LLParticipantList::onAvalineCallerFound, this, _1),
+ boost::bind(&LLParticipantList::onAvalineCallerRemoved, this, _1));
+
mSpeakerAddListener = new SpeakerAddListener(*this);
mSpeakerRemoveListener = new SpeakerRemoveListener(*this);
mSpeakerClearListener = new SpeakerClearListener(*this);
@@ -70,6 +227,8 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av
mSpeakerMgr->addListener(mSpeakerModeratorListener, "update_moderator");
mAvatarList->setNoItemsCommentText(LLTrans::getString("LoadingData"));
+ LL_DEBUGS("SpeakingIndicator") << "Set session for speaking indicators: " << mSpeakerMgr->getSessionID() << LL_ENDL;
+ mAvatarList->setSessionID(mSpeakerMgr->getSessionID());
mAvatarListDoubleClickConnection = mAvatarList->setItemDoubleClickCallback(boost::bind(&LLParticipantList::onAvatarListDoubleClicked, this, _1));
mAvatarListRefreshConnection = mAvatarList->setRefreshCompleteCallback(boost::bind(&LLParticipantList::onAvatarListRefreshed, this, _1, _2));
// Set onAvatarListDoubleClicked as default on_return action.
@@ -85,6 +244,12 @@ LLParticipantList::LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* av
mAvatarList->setContextMenu(NULL);
}
+ if (use_context_menu && can_toggle_icons)
+ {
+ mAvatarList->setShowIcons("ParticipantListShowIcons");
+ mAvatarListToggleIconsConnection = gSavedSettings.getControl("ParticipantListShowIcons")->getSignal()->connect(boost::bind(&LLAvatarList::toggleIcons, mAvatarList));
+ }
+
//Lets fill avatarList with existing speakers
LLSpeakerMgr::speaker_list_t speaker_list;
mSpeakerMgr->getSpeakerList(&speaker_list, true);
@@ -111,6 +276,7 @@ LLParticipantList::~LLParticipantList()
mAvatarListDoubleClickConnection.disconnect();
mAvatarListRefreshConnection.disconnect();
mAvatarListReturnConnection.disconnect();
+ mAvatarListToggleIconsConnection.disconnect();
// It is possible Participant List will be re-created from LLCallFloater::onCurrentChannelChanged()
// See ticket EXT-3427
@@ -127,6 +293,9 @@ LLParticipantList::~LLParticipantList()
}
mAvatarList->setContextMenu(NULL);
+ mAvatarList->setComparator(NULL);
+
+ delete mAvalineUpdater;
}
void LLParticipantList::setSpeakingIndicatorsVisible(BOOL visible)
@@ -197,9 +366,72 @@ void LLParticipantList::onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param)
}
}
}
+
+ // update voice mute state of all items. See EXT-7235
+ LLSpeakerMgr::speaker_list_t speaker_list;
+
+ // Use also participants which are not in voice session now (the second arg is TRUE).
+ // They can already have mModeratorMutedVoice set from the previous voice session
+ // and LLSpeakerVoiceModerationEvent will not be sent when speaker manager is updated next time.
+ mSpeakerMgr->getSpeakerList(&speaker_list, TRUE);
+ for(LLSpeakerMgr::speaker_list_t::iterator it = speaker_list.begin(); it != speaker_list.end(); it++)
+ {
+ const LLPointer<LLSpeaker>& speakerp = *it;
+
+ update_speaker_indicator(list, speakerp->mID, speakerp->mModeratorMutedVoice);
+ }
}
}
+/*
+Seems this method is not necessary after onAvalineCallerRemoved was implemented;
+
+It does nothing because list item is always created with correct class type for Avaline caller.
+For now Avaline Caller is removed from the LLSpeakerMgr List when it is removed from the Voice Client
+session.
+This happens in two cases: if Avaline Caller ends call itself or if Resident ends group call.
+
+Probably Avaline caller should be removed from the LLSpeakerMgr list ONLY if it ends call itself.
+Asked in EXT-4301.
+*/
+void LLParticipantList::onAvalineCallerFound(const LLUUID& participant_id)
+{
+ LLPanel* item = mAvatarList->getItemByValue(participant_id);
+
+ if (NULL == item)
+ {
+ LL_WARNS("Avaline") << "Something wrong. Unable to find item for: " << participant_id << LL_ENDL;
+ return;
+ }
+
+ if (typeid(*item) == typeid(LLAvalineListItem))
+ {
+ LL_DEBUGS("Avaline") << "Avaline caller has already correct class type for: " << participant_id << LL_ENDL;
+ // item representing an Avaline caller has a correct type already.
+ return;
+ }
+
+ LL_DEBUGS("Avaline") << "remove item from the list and re-add it: " << participant_id << LL_ENDL;
+
+ // remove UUID from LLAvatarList::mIDs to be able add it again.
+ uuid_vec_t& ids = mAvatarList->getIDs();
+ uuid_vec_t::iterator pos = std::find(ids.begin(), ids.end(), participant_id);
+ ids.erase(pos);
+
+ // remove item directly
+ mAvatarList->removeItem(item);
+
+ // re-add avaline caller with a correct class instance.
+ addAvatarIDExceptAgent(participant_id);
+}
+
+void LLParticipantList::onAvalineCallerRemoved(const LLUUID& participant_id)
+{
+ LL_DEBUGS("Avaline") << "Removing avaline caller from the list: " << participant_id << LL_ENDL;
+
+ mSpeakerMgr->removeAvalineSpeaker(participant_id);
+}
+
void LLParticipantList::setSortOrder(EParticipantSortOrder order)
{
if ( mSortOrder != order )
@@ -246,8 +478,8 @@ bool LLParticipantList::onAddItemEvent(LLPointer<LLOldEvents::LLEvent> event, co
bool LLParticipantList::onRemoveItemEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
{
- LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs();
- LLAvatarList::uuid_vector_t::iterator pos = std::find(group_members.begin(), group_members.end(), event->getValue().asUUID());
+ uuid_vec_t& group_members = mAvatarList->getIDs();
+ uuid_vec_t::iterator pos = std::find(group_members.begin(), group_members.end(), event->getValue().asUUID());
if(pos != group_members.end())
{
group_members.erase(pos);
@@ -258,7 +490,7 @@ bool LLParticipantList::onRemoveItemEvent(LLPointer<LLOldEvents::LLEvent> event,
bool LLParticipantList::onClearListEvent(LLPointer<LLOldEvents::LLEvent> event, const LLSD& userdata)
{
- LLAvatarList::uuid_vector_t& group_members = mAvatarList->getIDs();
+ uuid_vec_t& group_members = mAvatarList->getIDs();
group_members.clear();
mAvatarList->setDirty();
return true;
@@ -300,12 +532,7 @@ bool LLParticipantList::onSpeakerMuteEvent(LLPointer<LLOldEvents::LLEvent> event
// update UI on confirmation of moderator mutes
if (event->getValue().asString() == "voice")
{
- LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*>(mAvatarList->getItemByValue(speakerp->mID));
- if (item)
- {
- LLOutputMonitorCtrl* indicator = item->getChild<LLOutputMonitorCtrl>("speaking_indicator");
- indicator->setIsMuted(speakerp->mModeratorMutedVoice);
- }
+ update_speaker_indicator(mAvatarList, speakerp->mID, speakerp->mModeratorMutedVoice);
}
return true;
}
@@ -345,8 +572,19 @@ void LLParticipantList::addAvatarIDExceptAgent(const LLUUID& avatar_id)
if (mExcludeAgent && gAgent.getID() == avatar_id) return;
if (mAvatarList->contains(avatar_id)) return;
- mAvatarList->getIDs().push_back(avatar_id);
- mAvatarList->setDirty();
+ bool is_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(avatar_id);
+
+ if (is_avatar)
+ {
+ mAvatarList->getIDs().push_back(avatar_id);
+ mAvatarList->setDirty();
+ }
+ else
+ {
+ std::string display_name = LLVoiceClient::getInstance()->getDisplayName(avatar_id);
+ mAvatarList->addAvalineItem(avatar_id, mSpeakerMgr->getSessionID(), display_name.empty() ? display_name : LLTrans::getString("AvatarNameWaiting"));
+ mAvalineUpdater->watchAvalineCaller(avatar_id);
+ }
adjustParticipant(avatar_id);
}
@@ -427,40 +665,41 @@ LLContextMenu* LLParticipantList::LLParticipantListMenu::createMenu()
registrar.add("ParticipantList.ModerateVoice", boost::bind(&LLParticipantList::LLParticipantListMenu::moderateVoice, this, _2));
enable_registrar.add("ParticipantList.EnableItem", boost::bind(&LLParticipantList::LLParticipantListMenu::enableContextMenuItem, this, _2));
+ enable_registrar.add("ParticipantList.EnableItem.Moderate", boost::bind(&LLParticipantList::LLParticipantListMenu::enableModerateContextMenuItem, this, _2));
enable_registrar.add("ParticipantList.CheckItem", boost::bind(&LLParticipantList::LLParticipantListMenu::checkContextMenuItem, this, _2));
// create the context menu from the XUI
- LLContextMenu* main_menu = LLUICtrlFactory::getInstance()->createFromFile<LLContextMenu>(
- "menu_participant_list.xml", LLMenuGL::sMenuContainer, LLViewerMenuHolderGL::child_registry_t::instance());
+ LLContextMenu* main_menu = createFromFile("menu_participant_list.xml");
// Don't show sort options for P2P chat
bool is_sort_visible = (mParent.mAvatarList && mParent.mAvatarList->size() > 1);
main_menu->setItemVisible("SortByName", is_sort_visible);
main_menu->setItemVisible("SortByRecentSpeakers", is_sort_visible);
+ main_menu->setItemVisible("Moderator Options Separator", isGroupModerator());
main_menu->setItemVisible("Moderator Options", isGroupModerator());
+ main_menu->setItemVisible("View Icons Separator", mParent.mAvatarListToggleIconsConnection.connected());
+ main_menu->setItemVisible("View Icons", mParent.mAvatarListToggleIconsConnection.connected());
main_menu->arrangeAndClear();
return main_menu;
}
-void LLParticipantList::LLParticipantListMenu::show(LLView* spawning_view, const std::vector<LLUUID>& uuids, S32 x, S32 y)
+void LLParticipantList::LLParticipantListMenu::show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y)
{
- LLPanelPeopleMenus::ContextMenu::show(spawning_view, uuids, x, y);
-
if (uuids.size() == 0) return;
- const LLUUID speaker_id = mUUIDs.front();
+ LLListContextMenu::show(spawning_view, uuids, x, y);
+
+ const LLUUID& speaker_id = mUUIDs.front();
BOOL is_muted = isMuted(speaker_id);
if (is_muted)
{
LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceMuteSelected", false);
- LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceMuteOthers", false);
}
else
{
LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceUnMuteSelected", false);
- LLMenuGL::sMenuContainer->childSetVisible("ModerateVoiceUnMuteOthers", false);
}
}
@@ -500,10 +739,26 @@ void LLParticipantList::LLParticipantListMenu::toggleMute(const LLSD& userdata,
{
return;
}
+ LLAvatarListItem* item = dynamic_cast<LLAvatarListItem*>(mParent.mAvatarList->getItemByValue(speaker_id));
+ if (NULL == item) return;
- name = speakerp->mDisplayName;
+ name = item->getAvatarName();
- LLMute mute(speaker_id, name, speakerp->mType == LLSpeaker::SPEAKER_AGENT ? LLMute::AGENT : LLMute::OBJECT);
+ LLMute::EType mute_type;
+ switch (speakerp->mType)
+ {
+ case LLSpeaker::SPEAKER_AGENT:
+ mute_type = LLMute::AGENT;
+ break;
+ case LLSpeaker::SPEAKER_OBJECT:
+ mute_type = LLMute::OBJECT;
+ break;
+ case LLSpeaker::SPEAKER_EXTERNAL:
+ default:
+ mute_type = LLMute::EXTERNAL;
+ break;
+ }
+ LLMute mute(speaker_id, name, mute_type);
if (!is_muted)
{
@@ -549,16 +804,17 @@ void LLParticipantList::LLParticipantListMenu::moderateVoice(const LLSD& userdat
if (!gAgent.getRegion()) return;
bool moderate_selected = userdata.asString() == "selected";
- const LLUUID& selected_avatar_id = mUUIDs.front();
- bool is_muted = isMuted(selected_avatar_id);
if (moderate_selected)
{
+ const LLUUID& selected_avatar_id = mUUIDs.front();
+ bool is_muted = isMuted(selected_avatar_id);
moderateVoiceParticipant(selected_avatar_id, is_muted);
}
else
{
- moderateVoiceOtherParticipants(selected_avatar_id, is_muted);
+ bool unmute_all = userdata.asString() == "unmute_all";
+ moderateVoiceAllParticipants(unmute_all);
}
}
@@ -571,40 +827,62 @@ void LLParticipantList::LLParticipantListMenu::moderateVoiceParticipant(const LL
}
}
-void LLParticipantList::LLParticipantListMenu::moderateVoiceOtherParticipants(const LLUUID& excluded_avatar_id, bool unmute)
+void LLParticipantList::LLParticipantListMenu::moderateVoiceAllParticipants(bool unmute)
{
LLIMSpeakerMgr* mgr = dynamic_cast<LLIMSpeakerMgr*>(mParent.mSpeakerMgr);
if (mgr)
{
- mgr->moderateVoiceOtherParticipants(excluded_avatar_id, unmute);
+ if (!unmute)
+ {
+ LLSD payload;
+ payload["session_id"] = mgr->getSessionID();
+ LLNotificationsUtil::add("ConfirmMuteAll", LLSD(), payload, confirmMuteAllCallback);
+ return;
+ }
+
+ mgr->moderateVoiceAllParticipants(unmute);
+ }
+}
+
+// static
+void LLParticipantList::LLParticipantListMenu::confirmMuteAllCallback(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ // if Cancel pressed
+ if (option == 1)
+ {
+ return;
+ }
+
+ const LLSD& payload = notification["payload"];
+ const LLUUID& session_id = payload["session_id"];
+
+ LLIMSpeakerMgr * speaker_manager = dynamic_cast<LLIMSpeakerMgr*> (
+ LLIMModel::getInstance()->getSpeakerManager(session_id));
+ if (speaker_manager)
+ {
+ speaker_manager->moderateVoiceAllParticipants(false);
}
+
+ return;
}
+
bool LLParticipantList::LLParticipantListMenu::enableContextMenuItem(const LLSD& userdata)
{
std::string item = userdata.asString();
+ const LLUUID& participant_id = mUUIDs.front();
+
+ // For now non of "can_view_profile" action and menu actions listed below except "can_block"
+ // can be performed for Avaline callers.
+ bool is_participant_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(participant_id);
+ if (!is_participant_avatar && "can_block" != item) return false;
+
if (item == "can_mute_text" || "can_block" == item || "can_share" == item || "can_im" == item
|| "can_pay" == item)
{
return mUUIDs.front() != gAgentID;
}
- else if (item == "can_allow_text_chat")
- {
- return isGroupModerator();
- }
- else if ("can_moderate_voice" == item)
- {
- if (isGroupModerator())
- {
- LLPointer<LLSpeaker> speakerp = mParent.mSpeakerMgr->findSpeaker(mUUIDs.front());
- if (speakerp.notNull())
- {
- // not in voice participants can not be moderated
- return speakerp->isInVoiceChannel();
- }
- }
- return false;
- }
else if (item == std::string("can_add"))
{
// We can add friends if:
@@ -613,7 +891,7 @@ bool LLParticipantList::LLParticipantListMenu::enableContextMenuItem(const LLSD&
bool result = (mUUIDs.size() > 0);
- std::vector<LLUUID>::const_iterator
+ uuid_vec_t::const_iterator
id = mUUIDs.begin(),
uuids_end = mUUIDs.end();
@@ -630,13 +908,43 @@ bool LLParticipantList::LLParticipantListMenu::enableContextMenuItem(const LLSD&
else if (item == "can_call")
{
bool not_agent = mUUIDs.front() != gAgentID;
- bool can_call = not_agent && LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking();
+ bool can_call = not_agent && LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking();
return can_call;
}
return true;
}
+/*
+Processed menu items with such parameters:
+ can_allow_text_chat
+ can_moderate_voice
+*/
+bool LLParticipantList::LLParticipantListMenu::enableModerateContextMenuItem(const LLSD& userdata)
+{
+ // only group moderators can perform actions related to this "enable callback"
+ if (!isGroupModerator()) return false;
+
+ const LLUUID& participant_id = mUUIDs.front();
+ LLPointer<LLSpeaker> speakerp = mParent.mSpeakerMgr->findSpeaker(participant_id);
+
+ // not in voice participants can not be moderated
+ bool speaker_in_voice = speakerp.notNull() && speakerp->isInVoiceChannel();
+
+ const std::string& item = userdata.asString();
+
+ if ("can_moderate_voice" == item)
+ {
+ return speaker_in_voice;
+ }
+
+ // For now non of menu actions except "can_moderate_voice" can be performed for Avaline callers.
+ bool is_participant_avatar = LLVoiceClient::getInstance()->isParticipantAvatar(participant_id);
+ if (!is_participant_avatar) return false;
+
+ return true;
+}
+
bool LLParticipantList::LLParticipantListMenu::checkContextMenuItem(const LLSD& userdata)
{
std::string item = userdata.asString();
diff --git a/indra/newview/llparticipantlist.h b/indra/newview/llparticipantlist.h
index e1b1b5af00..3fe45fa591 100644
--- a/indra/newview/llparticipantlist.h
+++ b/indra/newview/llparticipantlist.h
@@ -32,12 +32,13 @@
#include "llviewerprecompiledheaders.h"
#include "llevent.h"
-#include "llpanelpeoplemenus.h"
#include "llavatarlist.h" // for LLAvatarItemRecentSpeakerComparator
+#include "lllistcontextmenu.h"
class LLSpeakerMgr;
class LLAvatarList;
class LLUICtrl;
+class LLAvalineUpdater;
class LLParticipantList
{
@@ -46,7 +47,7 @@ class LLParticipantList
typedef boost::function<bool (const LLUUID& speaker_id)> validate_speaker_callback_t;
- LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list, bool use_context_menu = true, bool exclude_agent = true);
+ LLParticipantList(LLSpeakerMgr* data_source, LLAvatarList* avatar_list, bool use_context_menu = true, bool exclude_agent = true, bool can_toggle_icons = true);
~LLParticipantList();
void setSpeakingIndicatorsVisible(BOOL visible);
@@ -147,16 +148,17 @@ class LLParticipantList
/**
* Menu used in the participant list.
*/
- class LLParticipantListMenu : public LLPanelPeopleMenus::ContextMenu
+ class LLParticipantListMenu : public LLListContextMenu
{
public:
LLParticipantListMenu(LLParticipantList& parent):mParent(parent){};
/*virtual*/ LLContextMenu* createMenu();
- /*virtual*/ void show(LLView* spawning_view, const std::vector<LLUUID>& uuids, S32 x, S32 y);
+ /*virtual*/ void show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y);
protected:
LLParticipantList& mParent;
private:
bool enableContextMenuItem(const LLSD& userdata);
+ bool enableModerateContextMenuItem(const LLSD& userdata);
bool checkContextMenuItem(const LLSD& userdata);
void sortParticipantList(const LLSD& userdata);
@@ -185,7 +187,7 @@ class LLParticipantList
* @param userdata can be "selected" or "others".
*
* @see moderateVoiceParticipant()
- * @see moderateVoiceOtherParticipants()
+ * @see moderateVoiceAllParticipants()
*/
void moderateVoice(const LLSD& userdata);
@@ -198,22 +200,22 @@ class LLParticipantList
* @param[in] avatar_id UUID of avatar to be processed
* @param[in] unmute if true - specified avatar will be muted, otherwise - unmuted.
*
- * @see moderateVoiceOtherParticipants()
+ * @see moderateVoiceAllParticipants()
*/
void moderateVoiceParticipant(const LLUUID& avatar_id, bool unmute);
/**
- * Mutes/Unmutes all avatars except specified for current group voice chat.
+ * Mutes/Unmutes all avatars 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 if true - avatars will be muted, otherwise - unmuted.
*
* @see moderateVoiceParticipant()
*/
- void moderateVoiceOtherParticipants(const LLUUID& excluded_avatar_id, bool unmute);
+ void moderateVoiceAllParticipants(bool unmute);
+
+ static void confirmMuteAllCallback(const LLSD& notification, const LLSD& response);
};
/**
@@ -235,6 +237,9 @@ class LLParticipantList
void onAvatarListDoubleClicked(LLUICtrl* ctrl);
void onAvatarListRefreshed(LLUICtrl* ctrl, const LLSD& param);
+ void onAvalineCallerFound(const LLUUID& participant_id);
+ void onAvalineCallerRemoved(const LLUUID& participant_id);
+
/**
* Adjusts passed participant to work properly.
*
@@ -268,7 +273,9 @@ class LLParticipantList
boost::signals2::connection mAvatarListDoubleClickConnection;
boost::signals2::connection mAvatarListRefreshConnection;
boost::signals2::connection mAvatarListReturnConnection;
+ boost::signals2::connection mAvatarListToggleIconsConnection;
LLPointer<LLAvatarItemRecentSpeakerComparator> mSortByRecentSpeakers;
validate_speaker_callback_t mValidateSpeakerCallback;
+ LLAvalineUpdater* mAvalineUpdater;
};
diff --git a/indra/newview/llplacesinventorybridge.cpp b/indra/newview/llplacesinventorybridge.cpp
index 4fe69f295c..f59a55cb8b 100644
--- a/indra/newview/llplacesinventorybridge.cpp
+++ b/indra/newview/llplacesinventorybridge.cpp
@@ -122,7 +122,7 @@ void LLPlacesFolderBridge::buildContextMenu(LLMenuGL& menu, U32 flags)
}
//virtual
-void LLPlacesFolderBridge::performAction(LLFolderView* folder, LLInventoryModel* model, std::string action)
+void LLPlacesFolderBridge::performAction(LLInventoryModel* model, std::string action)
{
if ("expand" == action)
{
@@ -136,7 +136,7 @@ void LLPlacesFolderBridge::performAction(LLFolderView* folder, LLInventoryModel*
}
else
{
- LLFolderBridge::performAction(folder, model, action);
+ LLFolderBridge::performAction(model, action);
}
}
@@ -158,6 +158,7 @@ LLInvFVBridge* LLPlacesInventoryBridgeBuilder::createBridge(
LLAssetType::EType actual_asset_type,
LLInventoryType::EType inv_type,
LLInventoryPanel* inventory,
+ LLFolderView* root,
const LLUUID& uuid,
U32 flags/* = 0x00*/) const
{
@@ -167,9 +168,9 @@ LLInvFVBridge* LLPlacesInventoryBridgeBuilder::createBridge(
case LLAssetType::AT_LANDMARK:
if(!(inv_type == LLInventoryType::IT_LANDMARK))
{
- llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << safe_inv_type_lookup(inv_type) << " on uuid " << uuid << llendl;
+ llwarns << LLAssetType::lookup(asset_type) << " asset has inventory type " << LLInventoryType::lookupHumanReadable(inv_type) << " on uuid " << uuid << llendl;
}
- new_listener = new LLPlacesLandmarkBridge(inv_type, inventory, uuid, flags);
+ new_listener = new LLPlacesLandmarkBridge(inv_type, inventory, root, uuid, flags);
break;
case LLAssetType::AT_CATEGORY:
if (actual_asset_type == LLAssetType::AT_LINK_FOLDER)
@@ -180,11 +181,12 @@ LLInvFVBridge* LLPlacesInventoryBridgeBuilder::createBridge(
actual_asset_type,
inv_type,
inventory,
+ root,
uuid,
flags);
break;
}
- new_listener = new LLPlacesFolderBridge(inv_type, inventory, uuid);
+ new_listener = new LLPlacesFolderBridge(inv_type, inventory, root, uuid);
break;
default:
new_listener = LLInventoryFVBridgeBuilder::createBridge(
@@ -192,6 +194,7 @@ LLInvFVBridge* LLPlacesInventoryBridgeBuilder::createBridge(
actual_asset_type,
inv_type,
inventory,
+ root,
uuid,
flags);
}
diff --git a/indra/newview/llplacesinventorybridge.h b/indra/newview/llplacesinventorybridge.h
index 66a8e8e54d..7e5170cc33 100644
--- a/indra/newview/llplacesinventorybridge.h
+++ b/indra/newview/llplacesinventorybridge.h
@@ -48,8 +48,15 @@ public:
/*virtual*/ void buildContextMenu(LLMenuGL& menu, U32 flags);
protected:
- LLPlacesLandmarkBridge(LLInventoryType::EType type, LLInventoryPanel* inventory, const LLUUID& uuid, U32 flags = 0x00)
- : LLLandmarkBridge(inventory, uuid, flags) {mInvType = type;}
+ LLPlacesLandmarkBridge(LLInventoryType::EType type,
+ LLInventoryPanel* inventory,
+ LLFolderView* root,
+ const LLUUID& uuid,
+ U32 flags = 0x00) :
+ LLLandmarkBridge(inventory, root, uuid, flags)
+ {
+ mInvType = type;
+ }
};
/**
@@ -61,12 +68,17 @@ class LLPlacesFolderBridge : public LLFolderBridge
public:
/*virtual*/ void buildContextMenu(LLMenuGL& menu, U32 flags);
- /*virtual*/ void performAction(LLFolderView* folder, LLInventoryModel* model, std::string action);
+ /*virtual*/ void performAction(LLInventoryModel* model, std::string action);
protected:
- LLPlacesFolderBridge(LLInventoryType::EType type, LLInventoryPanel* inventory, const LLUUID& uuid)
- : LLFolderBridge(inventory, uuid) {mInvType = type;}
-
+ LLPlacesFolderBridge(LLInventoryType::EType type,
+ LLInventoryPanel* inventory,
+ LLFolderView* root,
+ const LLUUID& uuid) :
+ LLFolderBridge(inventory, root, uuid)
+ {
+ mInvType = type;
+ }
LLFolderViewFolder* getFolder();
};
@@ -79,13 +91,13 @@ protected:
class LLPlacesInventoryBridgeBuilder : public LLInventoryFVBridgeBuilder
{
public:
- /*virtual*/ LLInvFVBridge* createBridge(
- LLAssetType::EType asset_type,
- LLAssetType::EType actual_asset_type,
- LLInventoryType::EType inv_type,
- LLInventoryPanel* inventory,
- const LLUUID& uuid,
- U32 flags = 0x00) const;
+ /*virtual*/ LLInvFVBridge* createBridge(LLAssetType::EType asset_type,
+ LLAssetType::EType actual_asset_type,
+ LLInventoryType::EType inv_type,
+ LLInventoryPanel* inventory,
+ LLFolderView* root,
+ const LLUUID& uuid,
+ U32 flags = 0x00) const;
};
#endif // LL_LLPLACESINVENTORYBRIDGE_H
diff --git a/indra/newview/llplacesinventorypanel.cpp b/indra/newview/llplacesinventorypanel.cpp
index 8edeebaeeb..0930a7be7f 100644
--- a/indra/newview/llplacesinventorypanel.cpp
+++ b/indra/newview/llplacesinventorypanel.cpp
@@ -68,9 +68,9 @@ BOOL LLPlacesInventoryPanel::postBuild()
// clear Contents();
{
- mFolders->destroyView();
- mFolders->getParent()->removeChild(mFolders);
- mFolders->die();
+ mFolderRoot->destroyView();
+ mFolderRoot->getParent()->removeChild(mFolderRoot);
+ mFolderRoot->die();
if( mScroller )
{
@@ -78,7 +78,7 @@ BOOL LLPlacesInventoryPanel::postBuild()
mScroller->die();
mScroller = NULL;
}
- mFolders = NULL;
+ mFolderRoot = NULL;
}
@@ -92,15 +92,16 @@ BOOL LLPlacesInventoryPanel::postBuild()
0);
LLPlacesFolderView::Params p;
p.name = getName();
+ p.title = getLabel();
p.rect = folder_rect;
p.parent_panel = this;
- mFolders = (LLFolderView*)LLUICtrlFactory::create<LLPlacesFolderView>(p);
- mFolders->setAllowMultiSelect(mAllowMultiSelect);
+ mFolderRoot = (LLFolderView*)LLUICtrlFactory::create<LLPlacesFolderView>(p);
+ mFolderRoot->setAllowMultiSelect(mAllowMultiSelect);
}
mCommitCallbackRegistrar.popScope();
- mFolders->setCallbackRegistrar(&mCommitCallbackRegistrar);
+ mFolderRoot->setCallbackRegistrar(&mCommitCallbackRegistrar);
// scroller
{
@@ -115,13 +116,14 @@ BOOL LLPlacesInventoryPanel::postBuild()
mScroller = LLUICtrlFactory::create<LLScrollContainer>(p);
}
addChild(mScroller);
- mScroller->addChild(mFolders);
+ mScroller->addChild(mFolderRoot);
- mFolders->setScrollContainer(mScroller);
+ mFolderRoot->setScrollContainer(mScroller);
+ mFolderRoot->addChild(mFolderRoot->mStatusTextBox);
// cut subitems
- mFolders->setUseEllipses(true);
+ mFolderRoot->setUseEllipses(true);
return TRUE;
}
@@ -130,17 +132,17 @@ BOOL LLPlacesInventoryPanel::postBuild()
void LLPlacesInventoryPanel::saveFolderState()
{
mSavedFolderState->setApply(FALSE);
- getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+ mFolderRoot->applyFunctorRecursively(*mSavedFolderState);
}
// re-open folders which state was saved
void LLPlacesInventoryPanel::restoreFolderState()
{
mSavedFolderState->setApply(TRUE);
- getRootFolder()->applyFunctorRecursively(*mSavedFolderState);
+ mFolderRoot->applyFunctorRecursively(*mSavedFolderState);
LLOpenFoldersWithSelection opener;
- getRootFolder()->applyFunctorRecursively(opener);
- getRootFolder()->scrollToShowSelection();
+ mFolderRoot->applyFunctorRecursively(opener);
+ mFolderRoot->scrollToShowSelection();
}
S32 LLPlacesInventoryPanel::notify(const LLSD& info)
@@ -150,11 +152,11 @@ S32 LLPlacesInventoryPanel::notify(const LLSD& info)
std::string str_action = info["action"];
if(str_action == "select_first")
{
- return getRootFolder()->notify(info);
+ return mFolderRoot->notify(info);
}
else if(str_action == "select_last")
{
- return getRootFolder()->notify(info);
+ return mFolderRoot->notify(info);
}
}
return 0;
@@ -174,6 +176,15 @@ S32 LLPlacesInventoryPanel::notify(const LLSD& info)
// PUBLIC METHODS
//////////////////////////////////////////////////////////////////////////
+LLPlacesFolderView::LLPlacesFolderView(const LLFolderView::Params& p)
+: LLFolderView(p)
+{
+ // we do not need auto select functionality in places landmarks, so override default behavior.
+ // this disables applying of the LLSelectFirstFilteredItem in LLFolderView::doIdle.
+ // Fixed issues: EXT-1631, EXT-4994.
+ mAutoSelectOverride = TRUE;
+}
+
BOOL LLPlacesFolderView::handleRightMouseDown(S32 x, S32 y, MASK mask)
{
// let children to change selection first
diff --git a/indra/newview/llplacesinventorypanel.h b/indra/newview/llplacesinventorypanel.h
index 86937e7c7f..04c6758eae 100644
--- a/indra/newview/llplacesinventorypanel.h
+++ b/indra/newview/llplacesinventorypanel.h
@@ -67,7 +67,7 @@ private:
class LLPlacesFolderView : public LLFolderView
{
public:
- LLPlacesFolderView(const LLFolderView::Params& p) : LLFolderView(p) {};
+ LLPlacesFolderView(const LLFolderView::Params& p);
/**
* Handles right mouse down
*
diff --git a/indra/newview/llpopupview.cpp b/indra/newview/llpopupview.cpp
new file mode 100644
index 0000000000..4523bf2ba4
--- /dev/null
+++ b/indra/newview/llpopupview.cpp
@@ -0,0 +1,238 @@
+/**
+ * @file llpopupview.cpp
+ * @brief Holds transient popups
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+#include "llviewerprecompiledheaders.h"
+
+#include "llpopupview.h"
+
+static LLRegisterPanelClassWrapper<LLPopupView> r("popup_holder");
+
+bool view_visible_and_enabled(LLView* viewp)
+{
+ return viewp->getVisible() && viewp->getEnabled();
+}
+
+bool view_visible(LLView* viewp)
+{
+ return viewp->getVisible();
+}
+
+
+LLPopupView::LLPopupView()
+{
+ // register ourself as handler of UI popups
+ LLUI::setPopupFuncs(boost::bind(&LLPopupView::addPopup, this, _1), boost::bind(&LLPopupView::removePopup, this, _1), boost::bind(&LLPopupView::clearPopups, this));
+}
+
+LLPopupView::~LLPopupView()
+{
+ // set empty callback function so we can't handle popups anymore
+ LLUI::setPopupFuncs(LLUI::add_popup_t(), LLUI::remove_popup_t(), LLUI::clear_popups_t());
+}
+
+void LLPopupView::draw()
+{
+ S32 screen_x, screen_y;
+
+ // remove dead popups
+ for (popup_list_t::iterator popup_it = mPopups.begin();
+ popup_it != mPopups.end();)
+ {
+ if (!popup_it->get())
+ {
+ mPopups.erase(popup_it++);
+ }
+ else
+ {
+ popup_it++;
+ }
+ }
+
+ // draw in reverse order (most recent is on top)
+ for (popup_list_t::reverse_iterator popup_it = mPopups.rbegin();
+ popup_it != mPopups.rend();)
+ {
+ LLView* popup = popup_it->get();
+
+ if (popup->getVisible())
+ {
+ popup->localPointToScreen(0, 0, &screen_x, &screen_y);
+
+ LLUI::pushMatrix();
+ {
+ LLUI::translate( (F32) screen_x, (F32) screen_y, 0.f);
+ popup->draw();
+ }
+ LLUI::popMatrix();
+ }
+ ++popup_it;
+ }
+
+ LLPanel::draw();
+}
+
+BOOL LLPopupView::handleMouseEvent(boost::function<BOOL(LLView*, S32, S32)> func,
+ boost::function<bool(LLView*)> predicate,
+ S32 x, S32 y,
+ bool close_popups)
+{
+ BOOL handled = FALSE;
+
+ // make a copy of list of popups, in case list is modified during mouse event handling
+ popup_list_t popups(mPopups);
+ for (popup_list_t::iterator popup_it = popups.begin(), popup_end = popups.end();
+ popup_it != popup_end;
+ ++popup_it)
+ {
+ LLView* popup = popup_it->get();
+ if (!popup
+ || !predicate(popup))
+ {
+ continue;
+ }
+
+ S32 popup_x, popup_y;
+ if (localPointToOtherView(x, y, &popup_x, &popup_y, popup)
+ && popup->pointInView(popup_x, popup_y))
+ {
+ if (func(popup, popup_x, popup_y))
+ {
+ handled = TRUE;
+ break;
+ }
+ }
+
+ if (close_popups)
+ {
+ mPopups.remove(*popup_it);
+ popup->onTopLost();
+ }
+ }
+
+ return handled;
+}
+
+
+BOOL LLPopupView::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+ if (!handleMouseEvent(boost::bind(&LLMouseHandler::handleMouseDown, _1, _2, _3, mask), view_visible_and_enabled, x, y, true))
+ {
+ return FALSE;
+ }
+ return TRUE;
+}
+
+BOOL LLPopupView::handleMouseUp(S32 x, S32 y, MASK mask)
+{
+ return handleMouseEvent(boost::bind(&LLMouseHandler::handleMouseUp, _1, _2, _3, mask), view_visible_and_enabled, x, y, false);
+}
+
+BOOL LLPopupView::handleMiddleMouseDown(S32 x, S32 y, MASK mask)
+{
+ if (!handleMouseEvent(boost::bind(&LLMouseHandler::handleMiddleMouseDown, _1, _2, _3, mask), view_visible_and_enabled, x, y, true))
+ {
+ return FALSE;
+ }
+ return TRUE;
+}
+
+BOOL LLPopupView::handleMiddleMouseUp(S32 x, S32 y, MASK mask)
+{
+ return handleMouseEvent(boost::bind(&LLMouseHandler::handleMiddleMouseUp, _1, _2, _3, mask), view_visible_and_enabled, x, y, false);
+}
+
+BOOL LLPopupView::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+ if (!handleMouseEvent(boost::bind(&LLMouseHandler::handleRightMouseDown, _1, _2, _3, mask), view_visible_and_enabled, x, y, true))
+ {
+ return FALSE;
+ }
+ return TRUE;
+}
+
+BOOL LLPopupView::handleRightMouseUp(S32 x, S32 y, MASK mask)
+{
+ return handleMouseEvent(boost::bind(&LLMouseHandler::handleRightMouseUp, _1, _2, _3, mask), view_visible_and_enabled, x, y, false);
+}
+
+BOOL LLPopupView::handleDoubleClick(S32 x, S32 y, MASK mask)
+{
+ return handleMouseEvent(boost::bind(&LLMouseHandler::handleDoubleClick, _1, _2, _3, mask), view_visible_and_enabled, x, y, false);
+}
+
+BOOL LLPopupView::handleHover(S32 x, S32 y, MASK mask)
+{
+ return handleMouseEvent(boost::bind(&LLMouseHandler::handleHover, _1, _2, _3, mask), view_visible_and_enabled, x, y, false);
+}
+
+BOOL LLPopupView::handleScrollWheel(S32 x, S32 y, S32 clicks)
+{
+ return handleMouseEvent(boost::bind(&LLMouseHandler::handleScrollWheel, _1, _2, _3, clicks), view_visible_and_enabled, x, y, false);
+}
+
+BOOL LLPopupView::handleToolTip(S32 x, S32 y, MASK mask)
+{
+ return handleMouseEvent(boost::bind(&LLMouseHandler::handleToolTip, _1, _2, _3, mask), view_visible, x, y, false);
+}
+
+void LLPopupView::addPopup(LLView* popup)
+{
+ if (popup)
+ {
+ mPopups.remove(popup->getHandle());
+ mPopups.push_front(popup->getHandle());
+ }
+}
+
+void LLPopupView::removePopup(LLView* popup)
+{
+ if (popup)
+ {
+ mPopups.remove(popup->getHandle());
+ popup->onTopLost();
+ }
+}
+
+void LLPopupView::clearPopups()
+{
+ for (popup_list_t::iterator popup_it = mPopups.begin();
+ popup_it != mPopups.end();)
+ {
+ LLView* popup = popup_it->get();
+
+ popup_list_t::iterator cur_popup_it = popup_it;
+ ++popup_it;
+
+ mPopups.erase(cur_popup_it);
+ popup->onTopLost();
+ }
+}
+
diff --git a/indra/newview/llpopupview.h b/indra/newview/llpopupview.h
new file mode 100644
index 0000000000..1ec61d5450
--- /dev/null
+++ b/indra/newview/llpopupview.h
@@ -0,0 +1,67 @@
+/**
+ * @file llpopupview.h
+ * @brief Holds transient popups
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLPOPUPVIEW_H
+#define LL_LLPOPUPVIEW_H
+
+#include "llpanel.h"
+
+class LLPopupView : public LLPanel
+{
+public:
+ LLPopupView();
+ ~LLPopupView();
+
+ /*virtual*/ void draw();
+ /*virtual*/ BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleMouseUp(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleMiddleMouseDown(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleMiddleMouseUp(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleRightMouseDown(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleRightMouseUp(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleDoubleClick(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
+ /*virtual*/ BOOL handleScrollWheel(S32 x, S32 y, S32 clicks);
+ /*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask);
+
+ void addPopup(LLView* popup);
+ void removePopup(LLView* popup);
+ void clearPopups();
+
+ typedef std::list<LLHandle<LLView> > popup_list_t;
+ popup_list_t getCurrentPopups() { return mPopups; }
+
+private:
+ BOOL handleMouseEvent(boost::function<BOOL(LLView*, S32, S32)>, boost::function<bool(LLView*)>, S32 x, S32 y, bool close_popups);
+ popup_list_t mPopups;
+};
+#endif //LL_LLROOTVIEW_H
diff --git a/indra/newview/llpreview.cpp b/indra/newview/llpreview.cpp
index 0b0c03e9e9..dd31a62642 100644
--- a/indra/newview/llpreview.cpp
+++ b/indra/newview/llpreview.cpp
@@ -36,7 +36,7 @@
#include "llpreview.h"
#include "lllineeditor.h"
-#include "llinventory.h"
+#include "llinventorydefines.h"
#include "llinventorymodel.h"
#include "llresmgr.h"
#include "lltextbox.h"
@@ -138,7 +138,7 @@ void LLPreview::onCommit()
const LLViewerInventoryItem *item = dynamic_cast<const LLViewerInventoryItem*>(getItem());
if(item)
{
- if (!item->isComplete())
+ if (!item->isFinished())
{
// We are attempting to save an item that was never loaded
llwarns << "LLPreview::onCommit() called with mIsComplete == FALSE"
@@ -179,10 +179,9 @@ void LLPreview::onCommit()
// update the object itself.
if( item->getType() == LLAssetType::AT_OBJECT )
{
- LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- if( avatar )
+ if (isAgentAvatarValid())
{
- LLViewerObject* obj = avatar->getWornAttachment( item->getUUID() );
+ LLViewerObject* obj = gAgentAvatarp->getWornAttachment( item->getUUID() );
if( obj )
{
LLSelectMgr::getInstance()->deselectAll();
diff --git a/indra/newview/llpreviewanim.cpp b/indra/newview/llpreviewanim.cpp
index 92bd4dc62b..262961b73b 100644
--- a/indra/newview/llpreviewanim.cpp
+++ b/indra/newview/llpreviewanim.cpp
@@ -71,7 +71,7 @@ BOOL LLPreviewAnim::postBuild()
const LLInventoryItem* item = getItem();
if(item)
{
- gAgent.getAvatarObject()->createMotion(item->getAssetUUID()); // preload the animation
+ gAgentAvatarp->createMotion(item->getAssetUUID()); // preload the animation
childSetText("desc", item->getDescription());
}
@@ -79,7 +79,7 @@ BOOL LLPreviewAnim::postBuild()
childSetAction("Anim audition btn",auditionAnim, this);
childSetCommitCallback("desc", LLPreview::onText, this);
- childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);
return LLPreview::postBuild();
}
@@ -125,10 +125,7 @@ void LLPreviewAnim::playAnim( void *userdata )
{
self->mPauseRequest = NULL;
gAgent.sendAnimationRequest(itemID, ANIM_REQUEST_START);
-
- LLVOAvatar* avatar = gAgent.getAvatarObject();
- LLMotion* motion = avatar->findMotion(itemID);
-
+ LLMotion* motion = gAgentAvatarp->findMotion(itemID);
if (motion)
{
motion->setDeactivateCallback(&endAnimCallback, (void *)(new LLHandle<LLFloater>(self->getHandle())));
@@ -136,7 +133,7 @@ void LLPreviewAnim::playAnim( void *userdata )
}
else
{
- gAgent.getAvatarObject()->stopMotion(itemID);
+ gAgentAvatarp->stopMotion(itemID);
gAgent.sendAnimationRequest(itemID, ANIM_REQUEST_STOP);
}
}
@@ -161,10 +158,8 @@ void LLPreviewAnim::auditionAnim( void *userdata )
if (self->childGetValue("Anim audition btn").asBoolean() )
{
self->mPauseRequest = NULL;
- gAgent.getAvatarObject()->startMotion(item->getAssetUUID());
-
- LLVOAvatar* avatar = gAgent.getAvatarObject();
- LLMotion* motion = avatar->findMotion(itemID);
+ gAgentAvatarp->startMotion(item->getAssetUUID());
+ LLMotion* motion = gAgentAvatarp->findMotion(itemID);
if (motion)
{
@@ -173,7 +168,7 @@ void LLPreviewAnim::auditionAnim( void *userdata )
}
else
{
- gAgent.getAvatarObject()->stopMotion(itemID);
+ gAgentAvatarp->stopMotion(itemID);
gAgent.sendAnimationRequest(itemID, ANIM_REQUEST_STOP);
}
}
@@ -186,11 +181,9 @@ void LLPreviewAnim::onClose(bool app_quitting)
if(item)
{
- gAgent.getAvatarObject()->stopMotion(item->getAssetUUID());
+ gAgentAvatarp->stopMotion(item->getAssetUUID());
gAgent.sendAnimationRequest(item->getAssetUUID(), ANIM_REQUEST_STOP);
-
- LLVOAvatar* avatar = gAgent.getAvatarObject();
- LLMotion* motion = avatar->findMotion(item->getAssetUUID());
+ LLMotion* motion = gAgentAvatarp->findMotion(item->getAssetUUID());
if (motion)
{
diff --git a/indra/newview/llpreviewgesture.cpp b/indra/newview/llpreviewgesture.cpp
index 53e351e66e..ff315d3c53 100644
--- a/indra/newview/llpreviewgesture.cpp
+++ b/indra/newview/llpreviewgesture.cpp
@@ -31,52 +31,31 @@
*/
#include "llviewerprecompiledheaders.h"
-
#include "llpreviewgesture.h"
-#include <algorithm>
-
-// libraries
-#include "lldatapacker.h"
-#include "lldarray.h"
-#include "llstring.h"
-#include "lldir.h"
-#include "llfloaterreg.h"
-#include "llmultigesture.h"
-#include "llnotificationsutil.h"
-#include "llvfile.h"
-
-// newview
-#include "llagent.h" // todo: remove
+#include "llagent.h"
+#include "llanimstatelabels.h"
#include "llanimationstates.h"
+#include "llappviewer.h" // gVFS
#include "llassetuploadresponders.h"
-#include "llbutton.h"
#include "llcheckboxctrl.h"
#include "llcombobox.h"
#include "lldelayedgestureerror.h"
-#include "llfloatergesture.h" // for some label constants
+#include "llfloaterreg.h"
#include "llgesturemgr.h"
+#include "llinventorydefines.h"
+#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
-#include "llkeyboard.h"
-#include "lllineeditor.h"
+#include "llinventorymodelbackgroundfetch.h"
+#include "llmultigesture.h"
+#include "llnotificationsutil.h"
#include "llradiogroup.h"
-#include "llscrolllistctrl.h"
-#include "llscrolllistitem.h"
-#include "llscrolllistcell.h"
-#include "lltextbox.h"
-#include "lluictrlfactory.h"
-#include "llviewerinventory.h"
-#include "llviewerobject.h"
+#include "llresmgr.h"
+#include "lltrans.h"
+#include "llvfile.h"
#include "llviewerobjectlist.h"
#include "llviewerregion.h"
#include "llviewerstats.h"
-#include "llviewerwindow.h" // busycount
-#include "llvoavatarself.h"
-#include "llappviewer.h" // gVFS
-#include "llanimstatelabels.h"
-#include "llresmgr.h"
-#include "lltrans.h"
-
std::string NONE_LABEL;
std::string SHIFT_LABEL;
@@ -97,7 +76,7 @@ protected:
void LLInventoryGestureAvailable::done()
{
- for(item_ref_t::iterator it = mComplete.begin(); it != mComplete.end(); ++it)
+ for(uuid_vec_t::iterator it = mComplete.begin(); it != mComplete.end(); ++it)
{
LLPreviewGesture* preview = LLFloaterReg::findTypedInstance<LLPreviewGesture>("preview_gesture", *it);
if(preview)
@@ -131,14 +110,14 @@ LLPreviewGesture* LLPreviewGesture::show(const LLUUID& item_id, const LLUUID& ob
// Start speculative download of sounds and animations
const LLUUID animation_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_ANIMATION);
- gInventory.startBackgroundFetch(animation_folder_id);
+ LLInventoryModelBackgroundFetch::instance().start(animation_folder_id);
const LLUUID sound_folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_SOUND);
- gInventory.startBackgroundFetch(sound_folder_id);
+ LLInventoryModelBackgroundFetch::instance().start(sound_folder_id);
// this will call refresh when we have everything.
LLViewerInventoryItem* item = (LLViewerInventoryItem*)preview->getItem();
- if (item && !item->isComplete())
+ if (item && !item->isFinished())
{
LLInventoryGestureAvailable* observer;
observer = new LLInventoryGestureAvailable();
@@ -269,7 +248,7 @@ BOOL LLPreviewGesture::canClose()
// virtual
void LLPreviewGesture::onClose(bool app_quitting)
{
- LLGestureManager::instance().stopGesture(mPreviewGesture);
+ LLGestureMgr::instance().stopGesture(mPreviewGesture);
}
// virtual
@@ -293,13 +272,13 @@ bool LLPreviewGesture::handleSaveChangesDialog(const LLSD& notification, const L
switch(option)
{
case 0: // "Yes"
- LLGestureManager::instance().stopGesture(mPreviewGesture);
+ LLGestureMgr::instance().stopGesture(mPreviewGesture);
mCloseAfterSave = TRUE;
onClickSave(this);
break;
case 1: // "No"
- LLGestureManager::instance().stopGesture(mPreviewGesture);
+ LLGestureMgr::instance().stopGesture(mPreviewGesture);
mDirty = FALSE; // Force the dirty flag because user has clicked NO on confirm save dialog...
closeFloater();
break;
@@ -472,7 +451,7 @@ BOOL LLPreviewGesture::postBuild()
edit = getChild<LLLineEditor>("wait_time_editor");
edit->setEnabled(FALSE);
edit->setVisible(FALSE);
- edit->setPrevalidate(LLLineEditor::prevalidateFloat);
+ edit->setPrevalidate(LLTextValidate::validateFloat);
// edit->setKeystrokeCallback(onKeystrokeCommit, this);
edit->setCommitOnFocusLost(TRUE);
edit->setCommitCallback(onCommitWaitTime, this);
@@ -504,10 +483,10 @@ BOOL LLPreviewGesture::postBuild()
if (item)
{
childSetText("desc", item->getDescription());
- childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);
childSetText("name", item->getName());
- childSetPrevalidate("name", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("name", &LLTextValidate::validateASCIIPrintableNoPipe);
}
return LLPreview::postBuild();
@@ -645,7 +624,7 @@ void LLPreviewGesture::refresh()
LLPreview::refresh();
// If previewing or item is incomplete, all controls are disabled
LLViewerInventoryItem* item = (LLViewerInventoryItem*)getItem();
- bool is_complete = (item && item->isComplete()) ? true : false;
+ bool is_complete = (item && item->isFinished()) ? true : false;
if (mPreviewGesture || !is_complete)
{
@@ -784,7 +763,7 @@ void LLPreviewGesture::refresh()
mOptionsText->setText(optionstext);
- BOOL active = LLGestureManager::instance().isGestureActive(mItemUUID);
+ BOOL active = LLGestureMgr::instance().isGestureActive(mItemUUID);
mActiveCheck->set(active);
// Can only preview if there are steps
@@ -829,7 +808,9 @@ void LLPreviewGesture::loadAsset()
const LLInventoryItem* item = getItem();
if (!item)
{
- mAssetStatus = PREVIEW_ASSET_ERROR;
+ // Don't set asset status here; we may not have set the item id yet
+ // (e.g. when this gets called initially)
+ //mAssetStatus = PREVIEW_ASSET_ERROR;
return;
}
@@ -1138,10 +1119,10 @@ void LLPreviewGesture::saveIfNeeded()
// If this gesture is active, then we need to update the in-memory
// active map with the new pointer.
- if (!delayedUpload && LLGestureManager::instance().isGestureActive(mItemUUID))
+ if (!delayedUpload && LLGestureMgr::instance().isGestureActive(mItemUUID))
{
// gesture manager now owns the pointer
- LLGestureManager::instance().replaceGesture(mItemUUID, gesture, asset_id);
+ LLGestureMgr::instance().replaceGesture(mItemUUID, gesture, asset_id);
// replaceGesture may deactivate other gestures so let the
// inventory know.
@@ -1702,13 +1683,13 @@ void LLPreviewGesture::onClickDelete(void* data)
void LLPreviewGesture::onCommitActive(LLUICtrl* ctrl, void* data)
{
LLPreviewGesture* self = (LLPreviewGesture*)data;
- if (!LLGestureManager::instance().isGestureActive(self->mItemUUID))
+ if (!LLGestureMgr::instance().isGestureActive(self->mItemUUID))
{
- LLGestureManager::instance().activateGesture(self->mItemUUID);
+ LLGestureMgr::instance().activateGesture(self->mItemUUID);
}
else
{
- LLGestureManager::instance().deactivateGesture(self->mItemUUID);
+ LLGestureMgr::instance().deactivateGesture(self->mItemUUID);
}
// Make sure the (active) label in the inventory gets updated.
@@ -1747,14 +1728,14 @@ void LLPreviewGesture::onClickPreview(void* data)
self->mPreviewBtn->setLabel(self->getString("stop_txt"));
// play it, and delete when done
- LLGestureManager::instance().playGesture(self->mPreviewGesture);
+ LLGestureMgr::instance().playGesture(self->mPreviewGesture);
self->refresh();
}
else
{
// Will call onDonePreview() below
- LLGestureManager::instance().stopGesture(self->mPreviewGesture);
+ LLGestureMgr::instance().stopGesture(self->mPreviewGesture);
self->refresh();
}
diff --git a/indra/newview/llpreviewgesture.h b/indra/newview/llpreviewgesture.h
index 5968e936ef..b141b14445 100644
--- a/indra/newview/llpreviewgesture.h
+++ b/indra/newview/llpreviewgesture.h
@@ -34,10 +34,9 @@
#define LL_LLPREVIEWGESTURE_H
#include "llassettype.h"
-#include "llmultigesture.h"
#include "llpreview.h"
+#include "llmultigesture.h"
-class LLMultiGesture;
class LLLineEditor;
class LLTextBox;
class LLCheckBoxCtrl;
@@ -45,7 +44,6 @@ class LLComboBox;
class LLScrollListCtrl;
class LLScrollListItem;
class LLButton;
-class LLGestureStep;
class LLRadioGroup;
class LLVFS;
@@ -140,7 +138,7 @@ protected:
static void onDonePreview(LLMultiGesture* gesture, void* data);
-protected:
+private:
// LLPreview contains mDescEditor
LLLineEditor* mTriggerEditor;
LLTextBox* mReplaceText;
@@ -173,4 +171,4 @@ protected:
BOOL mDirty;
};
-#endif
+#endif // LL_LLPREVIEWGESTURE_H
diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp
index cc70360528..fb7ac0d86b 100644
--- a/indra/newview/llpreviewnotecard.cpp
+++ b/indra/newview/llpreviewnotecard.cpp
@@ -35,12 +35,15 @@
#include "llpreviewnotecard.h"
#include "llinventory.h"
+#include "llinventoryfunctions.h" // for change_item_parent()
#include "llagent.h"
#include "llassetuploadresponders.h"
+#include "lldraghandle.h"
#include "llviewerwindow.h"
#include "llbutton.h"
#include "llfloaterreg.h"
+#include "llinventorydefines.h"
#include "llinventorymodel.h"
#include "lllineeditor.h"
#include "llnotificationsutil.h"
@@ -90,12 +93,18 @@ BOOL LLPreviewNotecard::postBuild()
childSetAction("Save", onClickSave, this);
childSetVisible("lock", FALSE);
+ childSetAction("Delete", onClickDelete, this);
+ childSetEnabled("Delete", false);
+
const LLInventoryItem* item = getItem();
childSetCommitCallback("desc", LLPreview::onText, this);
if (item)
+ {
childSetText("desc", item->getDescription());
- childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetEnabled("Delete", true);
+ }
+ childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);
return LLPreview::postBuild();
}
@@ -188,6 +197,20 @@ void LLPreviewNotecard::refreshFromInventory(const LLUUID& new_item_id)
loadAsset();
}
+void LLPreviewNotecard::updateTitleButtons()
+{
+ LLPreview::updateTitleButtons();
+
+ LLUICtrl* lock_btn = getChild<LLUICtrl>("lock");
+ if(lock_btn->getVisible() && !isMinimized()) // lock button stays visible if floater is minimized.
+ {
+ LLRect lock_rc = lock_btn->getRect();
+ LLRect buttons_rect = getDragHandle()->getButtonsRect();
+ buttons_rect.mLeft = lock_rc.mLeft;
+ getDragHandle()->setButtonsRect(buttons_rect);
+ }
+}
+
void LLPreviewNotecard::loadAsset()
{
// request the asset.
@@ -358,6 +381,17 @@ void LLPreviewNotecard::onClickSave(void* user_data)
}
}
+
+// static
+void LLPreviewNotecard::onClickDelete(void* user_data)
+{
+ LLPreviewNotecard* preview = (LLPreviewNotecard*)user_data;
+ if(preview)
+ {
+ preview->deleteNotecard();
+ }
+}
+
struct LLSaveNotecardInfo
{
LLPreviewNotecard* mSelf;
@@ -450,6 +484,18 @@ bool LLPreviewNotecard::saveIfNeeded(LLInventoryItem* copyitem)
return true;
}
+void LLPreviewNotecard::deleteNotecard()
+{
+ LLViewerInventoryItem* item = gInventory.getItem(mItemUUID);
+ if (item != NULL)
+ {
+ const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
+ change_item_parent(&gInventory, item, trash_id, FALSE);
+ }
+
+ closeFloater();
+}
+
// static
void LLPreviewNotecard::onSaveComplete(const LLUUID& asset_uuid, void* user_data, S32 status, LLExtStat ext_status) // StoreAssetData callback (fixed)
{
diff --git a/indra/newview/llpreviewnotecard.h b/indra/newview/llpreviewnotecard.h
index 5b8cf1c2f6..98de99aa33 100644
--- a/indra/newview/llpreviewnotecard.h
+++ b/indra/newview/llpreviewnotecard.h
@@ -79,9 +79,12 @@ public:
protected:
+ void updateTitleButtons();
virtual void loadAsset();
bool saveIfNeeded(LLInventoryItem* copyitem = NULL);
+ void deleteNotecard();
+
static void onLoadComplete(LLVFS *vfs,
const LLUUID& asset_uuid,
LLAssetType::EType type,
@@ -89,6 +92,8 @@ protected:
static void onClickSave(void* data);
+ static void onClickDelete(void* data);
+
static void onSaveComplete(const LLUUID& asset_uuid,
void* user_data,
S32 status, LLExtStat ext_status);
diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp
index 7bcbe334ff..7b926f468d 100644
--- a/indra/newview/llpreviewscript.cpp
+++ b/indra/newview/llpreviewscript.cpp
@@ -41,6 +41,7 @@
#include "llcombobox.h"
#include "lldir.h"
#include "llfloaterreg.h"
+#include "llinventorydefines.h"
#include "llinventorymodel.h"
#include "llkeyboard.h"
#include "lllineeditor.h"
@@ -661,7 +662,9 @@ void LLScriptEdCore::onBtnDynamicHelp()
live_help_floater = new LLFloater(LLSD());
LLUICtrlFactory::getInstance()->buildFloater(live_help_floater, "floater_lsl_guide.xml", NULL);
LLFloater* parent = dynamic_cast<LLFloater*>(getParent());
- parent->addDependentFloater(live_help_floater, TRUE);
+ llassert(parent);
+ if (parent)
+ parent->addDependentFloater(live_help_floater, TRUE);
live_help_floater->childSetCommitCallback("lock_check", onCheckLock, this);
live_help_floater->childSetValue("lock_check", gSavedSettings.getBOOL("ScriptHelpFollowsCursor"));
live_help_floater->childSetCommitCallback("history_combo", onHelpComboCommit, this);
@@ -953,9 +956,13 @@ BOOL LLPreviewLSL::postBuild()
{
const LLInventoryItem* item = getItem();
+ llassert(item);
+ if (item)
+ {
+ childSetText("desc", item->getDescription());
+ }
childSetCommitCallback("desc", LLPreview::onText, this);
- childSetText("desc", item->getDescription());
- childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);
return LLPreview::postBuild();
}
@@ -1084,8 +1091,7 @@ void LLPreviewLSL::onSave(void* userdata, BOOL close_after_save)
// Save needs to compile the text in the buffer. If the compile
// succeeds, then save both assets out to the database. If the compile
-// fails, go ahead and save the text anyway so that the user doesn't
-// get too fucked.
+// fails, go ahead and save the text anyway.
void LLPreviewLSL::saveIfNeeded()
{
// llinfos << "LLPreviewLSL::saveIfNeeded()" << llendl;
@@ -1573,7 +1579,7 @@ void LLLiveLSLEditor::loadAsset()
DEFAULT_SCRIPT_NAME,
DEFAULT_SCRIPT_DESC,
LLSaleInfo::DEFAULT,
- LLInventoryItem::II_FLAGS_NONE,
+ LLInventoryItemFlags::II_FLAGS_NONE,
time_corrected());
mAssetStatus = PREVIEW_ASSET_LOADED;
}
@@ -1817,7 +1823,7 @@ void LLLiveLSLEditor::saveIfNeeded()
return;
}
- if(mItem.isNull() || !mItem->isComplete())
+ if(mItem.isNull() || !mItem->isFinished())
{
// $NOTE: While the error message may not be exactly correct,
// it's pretty close.
diff --git a/indra/newview/llpreviewsound.cpp b/indra/newview/llpreviewsound.cpp
index d7fd252fb6..44b828854b 100644
--- a/indra/newview/llpreviewsound.cpp
+++ b/indra/newview/llpreviewsound.cpp
@@ -75,7 +75,7 @@ BOOL LLPreviewSound::postBuild()
button->setSoundFlags(LLView::SILENT);
childSetCommitCallback("desc", LLPreview::onText, this);
- childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);
return LLPreview::postBuild();
}
diff --git a/indra/newview/llpreviewtexture.cpp b/indra/newview/llpreviewtexture.cpp
index dfc67d0126..22a1ef94a7 100644
--- a/indra/newview/llpreviewtexture.cpp
+++ b/indra/newview/llpreviewtexture.cpp
@@ -116,7 +116,8 @@ BOOL LLPreviewTexture::postBuild()
}
childSetAction("save_tex_btn", LLPreviewTexture::onSaveAsBtn, this);
- childSetVisible("save_tex_btn", canSaveAs());
+ childSetVisible("save_tex_btn", true);
+ childSetEnabled("save_tex_btn", canSaveAs());
if (!mCopyToInv)
{
@@ -126,7 +127,7 @@ BOOL LLPreviewTexture::postBuild()
{
childSetCommitCallback("desc", LLPreview::onText, this);
childSetText("desc", item->getDescription());
- childSetPrevalidate("desc", &LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("desc", &LLTextValidate::validateASCIIPrintableNoPipe);
}
}
@@ -248,6 +249,7 @@ void LLPreviewTexture::draw()
}
}
}
+
}
@@ -282,18 +284,52 @@ void LLPreviewTexture::saveAs()
// virtual
void LLPreviewTexture::reshape(S32 width, S32 height, BOOL called_from_parent)
{
-// mLastHeight = 0;
-// mLastWidth = 0;
- mUpdateDimensions = TRUE;
LLPreview::reshape(width, height, called_from_parent);
+
+ LLRect dim_rect;
+ childGetRect("dimensions", dim_rect);
+
+ S32 horiz_pad = 2 * (LLPANEL_BORDER_WIDTH + PREVIEW_PAD) + PREVIEW_RESIZE_HANDLE_SIZE;
+
+ // add space for dimensions and aspect ratio
+ S32 info_height = dim_rect.mTop + CLIENT_RECT_VPAD;
+
+ LLRect client_rect(horiz_pad, getRect().getHeight(), getRect().getWidth() - horiz_pad, 0);
+ client_rect.mTop -= (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD);
+ client_rect.mBottom += PREVIEW_BORDER + CLIENT_RECT_VPAD + info_height ;
+
+ S32 client_width = client_rect.getWidth();
+ S32 client_height = client_rect.getHeight();
+
+ if (mAspectRatio > 0.f)
+ {
+ if(mAspectRatio > 1.f)
+ {
+ client_height = llceil((F32)client_width / mAspectRatio);
+ if(client_height > client_rect.getHeight())
+ {
+ client_height = client_rect.getHeight();
+ client_width = llceil((F32)client_height * mAspectRatio);
+ }
+ }
+ else//mAspectRatio < 1.f
+ {
+ client_width = llceil((F32)client_height * mAspectRatio);
+ if(client_width > client_rect.getWidth())
+ {
+ client_width = client_rect.getWidth();
+ client_height = llceil((F32)client_width / mAspectRatio);
+ }
+ }
+ }
+
+ mClientRect.setLeftTopAndSize(client_rect.getCenterX() - (client_width / 2), client_rect.getCenterY() + (client_height / 2), client_width, client_height);
+
}
// virtual
void LLPreviewTexture::onFocusReceived()
{
- mLastHeight = 0;
- mLastWidth = 0;
- mUpdateDimensions = TRUE;
LLPreview::onFocusReceived();
}
@@ -304,12 +340,12 @@ void LLPreviewTexture::openToSave()
// static
void LLPreviewTexture::onFileLoadedForSave(BOOL success,
- LLViewerFetchedTexture *src_vi,
- LLImageRaw* src,
- LLImageRaw* aux_src,
- S32 discard_level,
- BOOL final,
- void* userdata)
+ LLViewerFetchedTexture *src_vi,
+ LLImageRaw* src,
+ LLImageRaw* aux_src,
+ S32 discard_level,
+ BOOL final,
+ void* userdata)
{
LLUUID* item_uuid = (LLUUID*) userdata;
@@ -364,13 +400,19 @@ void LLPreviewTexture::updateDimensions()
{
if (!mImage)
return;
+
+ if(mImage->getFullWidth() == 0 || mImage->getFullHeight() == 0)
+ {
+ return;
+ }
+
mUpdateDimensions = FALSE;
-
- // set text on dimensions display (should be moved out of here and into a callback of some sort)
+
childSetTextArg("dimensions", "[WIDTH]", llformat("%d", mImage->getFullWidth()));
childSetTextArg("dimensions", "[HEIGHT]", llformat("%d", mImage->getFullHeight()));
+
LLRect dim_rect;
childGetRect("dimensions", dim_rect);
@@ -379,34 +421,68 @@ void LLPreviewTexture::updateDimensions()
// add space for dimensions and aspect ratio
S32 info_height = dim_rect.mTop + CLIENT_RECT_VPAD;
- LLRect client_rect(horiz_pad, getRect().getHeight(), getRect().getWidth() - horiz_pad, 0);
- client_rect.mTop -= (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD);
- client_rect.mBottom += PREVIEW_BORDER + CLIENT_RECT_VPAD + info_height ;
+ S32 screen_width = gFloaterView->getSnapRect().getWidth();
+ S32 screen_height = gFloaterView->getSnapRect().getHeight();
- S32 client_width = client_rect.getWidth();
- S32 client_height = client_rect.getHeight();
+ S32 max_image_width = screen_width - 2*horiz_pad;
+ S32 max_image_height = screen_height - (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD)
+ - (PREVIEW_BORDER + CLIENT_RECT_VPAD + info_height);
+
+ S32 client_width = llmin(max_image_width,mImage->getFullWidth());
+ S32 client_height = llmin(max_image_height,mImage->getFullHeight());
if (mAspectRatio > 0.f)
{
if(mAspectRatio > 1.f)
{
client_height = llceil((F32)client_width / mAspectRatio);
- if(client_height > client_rect.getHeight())
+ if(client_height > max_image_height)
{
- client_height = client_rect.getHeight();
+ client_height = max_image_height;
client_width = llceil((F32)client_height * mAspectRatio);
}
}
- else
+ else//mAspectRatio < 1.f
{
client_width = llceil((F32)client_height * mAspectRatio);
- if(client_width > client_rect.getWidth())
+ if(client_width > max_image_width)
{
- client_width = client_rect.getWidth();
+ client_width = max_image_width;
client_height = llceil((F32)client_width / mAspectRatio);
}
}
}
+ else
+ {
+
+ if(client_height > max_image_height)
+ {
+ F32 ratio = (F32)max_image_height/client_height;
+ client_height = max_image_height;
+ client_width = llceil((F32)client_height * ratio);
+ }
+
+ if(client_width > max_image_width)
+ {
+ F32 ratio = (F32)max_image_width/client_width;
+ client_width = max_image_width;
+ client_height = llceil((F32)client_width * ratio);
+ }
+ }
+
+ //now back to whole floater
+ S32 floater_width = llmax(getMinWidth(),client_width + 2*horiz_pad);
+ S32 floater_height = llmax(getMinHeight(),client_height + (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD)
+ + (PREVIEW_BORDER + CLIENT_RECT_VPAD + info_height));
+
+ //reshape floater
+ reshape( floater_width, floater_height );
+ gFloaterView->adjustToFitScreen(this, FALSE);
+
+ //setup image rect...
+ LLRect client_rect(horiz_pad, getRect().getHeight(), getRect().getWidth() - horiz_pad, 0);
+ client_rect.mTop -= (PREVIEW_HEADER_SIZE + CLIENT_RECT_VPAD);
+ client_rect.mBottom += PREVIEW_BORDER + CLIENT_RECT_VPAD + info_height ;
mClientRect.setLeftTopAndSize(client_rect.getCenterX() - (client_width / 2), client_rect.getCenterY() + (client_height / 2), client_width, client_height);
@@ -468,8 +544,9 @@ void LLPreviewTexture::loadAsset()
mImage->setBoostLevel(LLViewerTexture::BOOST_PREVIEW);
mImage->forceToSaveRawImage(0) ;
mAssetStatus = PREVIEW_ASSET_LOADING;
+ mUpdateDimensions = TRUE;
updateDimensions();
- childSetVisible("save_tex_btn", canSaveAs());
+ childSetEnabled("save_tex_btn", canSaveAs());
}
LLPreview::EAssetStatus LLPreviewTexture::getAssetStatus()
@@ -487,7 +564,12 @@ void LLPreviewTexture::updateImageID()
if(item)
{
mImageID = item->getAssetUUID();
- mShowKeepDiscard = item->getPermissions().getCreator() != gAgent.getID();
+
+ // here's the old logic...
+ //mShowKeepDiscard = item->getPermissions().getCreator() != gAgent.getID();
+ // here's the new logic... 'cos we hate disappearing buttons.
+ mShowKeepDiscard = TRUE;
+
mCopyToInv = FALSE;
mIsCopyable = item->checkPermissionsSet(PERM_ITEM_UNRESTRICTED);
}
diff --git a/indra/newview/llprogressview.cpp b/indra/newview/llprogressview.cpp
index 7a48f890e0..9b5e38d0aa 100644
--- a/indra/newview/llprogressview.cpp
+++ b/indra/newview/llprogressview.cpp
@@ -68,15 +68,16 @@ const F32 TOTAL_LOGIN_TIME = 10.f; // seconds, wild guess at time from GL contex
S32 gLastStartAnimationFrame = 0; // human-style indexing, first image = 1
const S32 ANIMATION_FRAMES = 1; //13;
+static LLRegisterPanelClassWrapper<LLProgressView> r("progress_view");
+
+
// XUI: Translate
-LLProgressView::LLProgressView(const LLRect &rect)
+LLProgressView::LLProgressView()
: LLPanel(),
mPercentDone( 0.f ),
mMouseDownInActiveArea( false ),
mUpdateEvents("LLProgressView")
{
- LLUICtrlFactory::getInstance()->buildPanel(this, "panel_progress.xml");
- reshape(rect.getWidth(), rect.getHeight());
mUpdateEvents.listen("self", boost::bind(&LLProgressView::handleUpdate, this, _1));
}
@@ -92,6 +93,9 @@ BOOL LLProgressView::postBuild()
getChild<LLTextBox>("message_text")->setClickedCallback(onClickMessage, this);
+ // hidden initially, until we need it
+ LLPanel::setVisible(FALSE);
+
sInstance = this;
return TRUE;
}
@@ -126,17 +130,23 @@ BOOL LLProgressView::handleKeyHere(KEY key, MASK mask)
void LLProgressView::setVisible(BOOL visible)
{
+ // hiding progress view
if (getVisible() && !visible)
{
mFadeTimer.start();
+ // hiding progress view, so show menu bars
+ LLUI::getRootView()->getChildView("menu_bar_holder")->setVisible(TRUE);
}
+ // showing progress view
else if (!getVisible() && visible)
{
- gFocusMgr.setTopCtrl(this);
+ // showing progress view, so hide menu bars
+ LLUI::getRootView()->getChildView("menu_bar_holder")->setVisible(FALSE);
+
setFocus(TRUE);
mFadeTimer.stop();
mProgressTimer.start();
- LLPanel::setVisible(visible);
+ LLPanel::setVisible(TRUE);
}
}
@@ -146,7 +156,7 @@ void LLProgressView::draw()
static LLTimer timer;
// Paint bitmap if we've got one
- glPushMatrix();
+ glPushMatrix();
if (gStartTexture)
{
LLGLSUIDefault gls_ui;
@@ -187,6 +197,8 @@ void LLProgressView::draw()
// Fade is complete, release focus
gFocusMgr.releaseFocusIfNeeded( this );
LLPanel::setVisible(FALSE);
+ mFadeTimer.stop();
+
gStartTexture = NULL;
}
return;
@@ -223,7 +235,10 @@ void LLProgressView::setCancelButtonVisible(BOOL b, const std::string& label)
// static
void LLProgressView::onCancelButtonClicked(void*)
{
- if (gAgent.getTeleportState() == LLAgent::TELEPORT_NONE)
+ // Quitting viewer here should happen only when "Quit" button is pressed while starting up.
+ // Check for startup state is used here instead of teleport state to avoid quitting when
+ // cancel is pressed while teleporting inside region (EXT-4911)
+ if (LLStartUp::getStartupState() < STATE_STARTED)
{
LLAppViewer::instance()->requestQuit();
}
diff --git a/indra/newview/llprogressview.h b/indra/newview/llprogressview.h
index 6853674d88..374b14be83 100644
--- a/indra/newview/llprogressview.h
+++ b/indra/newview/llprogressview.h
@@ -44,7 +44,7 @@ class LLProgressBar;
class LLProgressView : public LLPanel
{
public:
- LLProgressView(const LLRect& rect);
+ LLProgressView();
virtual ~LLProgressView();
BOOL postBuild();
diff --git a/indra/newview/llrecentpeople.cpp b/indra/newview/llrecentpeople.cpp
index bd46b5b56a..62c2ddfd9f 100644
--- a/indra/newview/llrecentpeople.cpp
+++ b/indra/newview/llrecentpeople.cpp
@@ -63,7 +63,7 @@ bool LLRecentPeople::contains(const LLUUID& id) const
return mPeople.find(id) != mPeople.end();
}
-void LLRecentPeople::get(std::vector<LLUUID>& result) const
+void LLRecentPeople::get(uuid_vec_t& result) const
{
result.clear();
for (recent_people_t::const_iterator pos = mPeople.begin(); pos != mPeople.end(); ++pos)
diff --git a/indra/newview/llrecentpeople.h b/indra/newview/llrecentpeople.h
index e0f2faaec5..c718997f7e 100644
--- a/indra/newview/llrecentpeople.h
+++ b/indra/newview/llrecentpeople.h
@@ -79,7 +79,7 @@ public:
*
* @param result where to put the result.
*/
- void get(std::vector<LLUUID>& result) const;
+ void get(uuid_vec_t& result) const;
const LLDate& getDate(const LLUUID& id) const;
diff --git a/indra/newview/llrootview.h b/indra/newview/llrootview.h
index 760b1a7a4c..38029e3a9d 100644
--- a/indra/newview/llrootview.h
+++ b/indra/newview/llrootview.h
@@ -35,6 +35,7 @@
#include "llview.h"
#include "lluictrlfactory.h"
+#include "lltooltip.h"
class LLRootViewRegistry : public LLChildRegistry<LLRootViewRegistry>
{};
diff --git a/indra/newview/llsaveoutfitcombobtn.cpp b/indra/newview/llsaveoutfitcombobtn.cpp
new file mode 100644
index 0000000000..9518b0cbb3
--- /dev/null
+++ b/indra/newview/llsaveoutfitcombobtn.cpp
@@ -0,0 +1,98 @@
+/**
+ * @file llsaveoutfitcombobtn.cpp
+ * @brief Represents outfit save/save as combo button.
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llappearancemgr.h"
+#include "llpaneloutfitsinventory.h"
+#include "llsidepanelappearance.h"
+#include "llsaveoutfitcombobtn.h"
+#include "llviewermenu.h"
+
+static const std::string SAVE_BTN("save_btn");
+static const std::string SAVE_FLYOUT_BTN("save_flyout_btn");
+
+LLSaveOutfitComboBtn::LLSaveOutfitComboBtn(LLPanel* parent, bool saveAsDefaultAction):
+ mParent(parent), mSaveAsDefaultAction(saveAsDefaultAction)
+{
+ // register action mapping before creating menu
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar save_registar;
+ save_registar.add("Outfit.Save.Action", boost::bind(
+ &LLSaveOutfitComboBtn::saveOutfit, this, false));
+ save_registar.add("Outfit.SaveAs.Action", boost::bind(
+ &LLSaveOutfitComboBtn::saveOutfit, this, true));
+
+ mParent->childSetAction(SAVE_BTN, boost::bind(&LLSaveOutfitComboBtn::saveOutfit, this, mSaveAsDefaultAction));
+ mParent->childSetAction(SAVE_FLYOUT_BTN, boost::bind(&LLSaveOutfitComboBtn::showSaveMenu, this));
+
+ mSaveMenu = LLUICtrlFactory::getInstance()->createFromFile<
+ LLToggleableMenu> ("menu_save_outfit.xml", gMenuHolder,
+ LLViewerMenuHolderGL::child_registry_t::instance());
+}
+
+void LLSaveOutfitComboBtn::showSaveMenu()
+{
+ S32 x, y;
+ LLUI::getMousePositionLocal(mParent, &x, &y);
+
+ mSaveMenu->updateParent(LLMenuGL::sMenuContainer);
+ LLMenuGL::showPopup(mParent, mSaveMenu, x, y);
+}
+
+void LLSaveOutfitComboBtn::saveOutfit(bool as_new)
+{
+ if (!as_new && LLAppearanceMgr::getInstance()->updateBaseOutfit())
+ {
+ // we don't need to ask for an outfit name, and updateBaseOutfit() successfully saved.
+ // If updateBaseOutfit fails, ask for an outfit name anyways
+ return;
+ }
+
+ LLPanelOutfitsInventory* panel_outfits_inventory =
+ LLPanelOutfitsInventory::findInstance();
+ if (panel_outfits_inventory)
+ {
+ panel_outfits_inventory->onSave();
+ }
+
+ //*TODO how to get to know when base outfit is updated or new outfit is created?
+}
+
+void LLSaveOutfitComboBtn::setMenuItemEnabled(const std::string& item, bool enabled)
+{
+ mSaveMenu->setItemEnabled("save_outfit", enabled);
+}
+
+void LLSaveOutfitComboBtn::setSaveBtnEnabled(bool enabled)
+{
+ mParent->childSetEnabled(SAVE_BTN, enabled);
+}
diff --git a/indra/newview/llsaveoutfitcombobtn.h b/indra/newview/llsaveoutfitcombobtn.h
new file mode 100644
index 0000000000..fec7122194
--- /dev/null
+++ b/indra/newview/llsaveoutfitcombobtn.h
@@ -0,0 +1,60 @@
+/**
+ * @file llsaveoutfitcombobtn.h
+ * @brief Represents outfit save/save as combo button.
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLSAVEOUTFITCOMBOBTN_H
+#define LL_LLSAVEOUTFITCOMBOBTN_H
+
+class LLButton;
+
+#include "lltoggleablemenu.h"
+
+/**
+ * Represents outfit Save/Save As combo button.
+ */
+class LLSaveOutfitComboBtn
+{
+ LOG_CLASS(LLSaveOutfitComboBtn);
+public:
+ LLSaveOutfitComboBtn(LLPanel* parent, bool saveAsDefaultAction = false);
+
+ void showSaveMenu();
+ void saveOutfit(bool as_new = false);
+ void setMenuItemEnabled(const std::string& item, bool enabled);
+ void setSaveBtnEnabled(bool enabled);
+
+private:
+ bool mSaveAsDefaultAction;
+ LLPanel* mParent;
+ LLToggleableMenu* mSaveMenu;
+};
+
+#endif // LL_LLSAVEOUTFITCOMBOBTN_H
diff --git a/indra/newview/llscreenchannel.cpp b/indra/newview/llscreenchannel.cpp
index 7c2e7e3319..de1da248c1 100644
--- a/indra/newview/llscreenchannel.cpp
+++ b/indra/newview/llscreenchannel.cpp
@@ -47,7 +47,6 @@
#include "llsyswellwindow.h"
#include "llimfloater.h"
#include "llscriptfloater.h"
-#include "llfontgl.h"
#include <algorithm>
@@ -79,17 +78,12 @@ LLScreenChannelBase::~LLScreenChannelBase()
bool LLScreenChannelBase::isHovering()
{
- bool res = mHoveredToast != NULL;
- if (!res)
+ if (!mHoveredToast)
{
- return res;
+ return false;
}
- S32 x, y;
- mHoveredToast->screenPointToLocal(gViewerWindow->getCurrentMouseX(),
- gViewerWindow->getCurrentMouseY(), &x, &y);
- res = mHoveredToast->pointInView(x, y) == TRUE;
- return res;
+ return mHoveredToast->isHovered();
}
void LLScreenChannelBase::updatePositionAndSize(LLRect old_world_rect, LLRect new_world_rect)
@@ -479,12 +473,15 @@ void LLScreenChannel::showToastsBottom()
{
if(it != mToastList.rbegin())
{
- bottom = (*(it-1)).toast->getRect().mTop;
+ LLToast* toast = (*(it-1)).toast;
+ bottom = toast->getRect().mTop - toast->getTopPad();
toast_margin = gSavedSettings.getS32("ToastGap");
}
toast_rect = (*it).toast->getRect();
- toast_rect.setOriginAndSize(getRect().mLeft, bottom + toast_margin, toast_rect.getWidth() ,toast_rect.getHeight());
+ toast_rect.setOriginAndSize(getRect().mRight - toast_rect.getWidth(),
+ bottom + toast_margin, toast_rect.getWidth(),
+ toast_rect.getHeight());
(*it).toast->setRect(toast_rect);
if(floater && floater->overlapsScreenChannel())
@@ -584,7 +581,6 @@ void LLScreenChannel::showToastsTop()
void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer)
{
LLRect toast_rect;
- LLRect tbox_rect;
LLToast::Params p;
p.lifetime_secs = timer;
p.enable_hide_btn = false;
@@ -595,34 +591,26 @@ void LLScreenChannel::createStartUpToast(S32 notif_num, F32 timer)
mStartUpToastPanel->setOnFadeCallback(boost::bind(&LLScreenChannel::onStartUpToastHide, this));
+ LLPanel* wrapper_panel = mStartUpToastPanel->getChild<LLPanel>("wrapper_panel");
LLTextBox* text_box = mStartUpToastPanel->getChild<LLTextBox>("toast_text");
std::string text = LLTrans::getString("StartUpNotifications");
- tbox_rect = text_box->getRect();
- S32 tbox_width = tbox_rect.getWidth();
- S32 tbox_vpad = text_box->getVPad();
- S32 text_width = text_box->getDefaultFont()->getWidth(text);
- S32 text_height = text_box->getTextPixelHeight();
-
- // EXT - 3703 (Startup toast message doesn't fit toast width)
- // Calculating TextBox HEIGHT needed to include the whole string according to the given WIDTH of the TextBox.
- S32 new_tbox_height = (text_width/tbox_width + 1) * text_height;
- // Calculating TOP position of TextBox
- S32 new_tbox_top = new_tbox_height + tbox_vpad + gSavedSettings.getS32("ToastGap");
- // Calculating toast HEIGHT according to the new TextBox size
- S32 toast_height = new_tbox_height + tbox_vpad * 2;
-
- tbox_rect.setLeftTopAndSize(tbox_rect.mLeft, new_tbox_top, tbox_rect.getWidth(), new_tbox_height);
- text_box->setRect(tbox_rect);
-
toast_rect = mStartUpToastPanel->getRect();
mStartUpToastPanel->reshape(getRect().getWidth(), toast_rect.getHeight(), true);
- toast_rect.setLeftTopAndSize(0, toast_height + gSavedSettings.getS32("ToastGap"), getRect().getWidth(), toast_height);
- mStartUpToastPanel->setRect(toast_rect);
text_box->setValue(text);
text_box->setVisible(TRUE);
+
+ S32 old_height = text_box->getRect().getHeight();
+ text_box->reshapeToFitText();
+ text_box->setOrigin(text_box->getRect().mLeft, (wrapper_panel->getRect().getHeight() - text_box->getRect().getHeight())/2);
+ S32 new_height = text_box->getRect().getHeight();
+ S32 height_delta = new_height - old_height;
+
+ toast_rect.setLeftTopAndSize(0, toast_rect.getHeight() + height_delta +gSavedSettings.getS32("ToastGap"), getRect().getWidth(), toast_rect.getHeight());
+ mStartUpToastPanel->setRect(toast_rect);
+
addChild(mStartUpToastPanel);
mStartUpToastPanel->setVisible(TRUE);
@@ -691,7 +679,10 @@ void LLNotificationsUI::LLScreenChannel::startFadingToasts()
while (it != mToastList.end())
{
ToastElem& elem = *it;
- elem.toast->startFading();
+ if (elem.toast->getVisible())
+ {
+ elem.toast->startFading();
+ }
++it;
}
}
@@ -711,9 +702,32 @@ void LLScreenChannel::hideToast(const LLUUID& notification_id)
if(mToastList.end() != it)
{
ToastElem te = *it;
- te.toast->setVisible(FALSE);
- te.toast->stopTimer();
- mToastList.erase(it);
+ te.toast->hide();
+ }
+}
+
+void LLScreenChannel::closeHiddenToasts(const Matcher& matcher)
+{
+ // since we can't guarantee that close toast operation doesn't change mToastList
+ // we collect matched toasts that should be closed into separate list
+ std::list<ToastElem> toasts;
+ for (std::vector<ToastElem>::iterator it = mToastList.begin(); it
+ != mToastList.end(); it++)
+ {
+ LLToast * toast = it->toast;
+ // add to list valid toast that match to provided matcher criteria
+ if (toast != NULL && !toast->isDead() && toast->getNotification() != NULL
+ && !toast->getVisible() && matcher.matches(toast->getNotification()))
+ {
+ toasts.push_back(*it);
+ }
+ }
+
+ // close collected toasts
+ for (std::list<ToastElem>::iterator it = toasts.begin(); it
+ != toasts.end(); it++)
+ {
+ it->toast->closeFloater();
}
}
@@ -777,23 +791,16 @@ void LLScreenChannel::onToastHover(LLToast* toast, bool mouse_enter)
{
// because of LLViewerWindow::updateUI() that NOT ALWAYS calls onMouseEnter BEFORE onMouseLeave
// we must check hovering directly to prevent incorrect setting for hovering in a channel
- S32 x,y;
if (mouse_enter)
{
- toast->screenPointToLocal(gViewerWindow->getCurrentMouseX(),
- gViewerWindow->getCurrentMouseY(), &x, &y);
- bool hover = toast->pointInView(x, y) == TRUE;
- if (hover)
+ if (toast->isHovered())
{
mHoveredToast = toast;
}
}
else if (mHoveredToast != NULL)
{
- mHoveredToast->screenPointToLocal(gViewerWindow->getCurrentMouseX(),
- gViewerWindow->getCurrentMouseY(), &x, &y);
- bool hover = mHoveredToast->pointInView(x, y) == TRUE;
- if (!hover)
+ if (!mHoveredToast->isHovered())
{
mHoveredToast = NULL;
}
diff --git a/indra/newview/llscreenchannel.h b/indra/newview/llscreenchannel.h
index 88053d87d9..46c5fed7b6 100644
--- a/indra/newview/llscreenchannel.h
+++ b/indra/newview/llscreenchannel.h
@@ -173,6 +173,12 @@ public:
void hideToastsFromScreen();
// hide toast by notification id
void hideToast(const LLUUID& notification_id);
+
+ /**
+ * Closes hidden matched toasts from channel.
+ */
+ void closeHiddenToasts(const Matcher& matcher);
+
// removes all toasts from a channel
void removeToastsFromChannel();
// show all toasts in a channel
diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp
index 0d9cf06bc3..b68fc3b002 100644
--- a/indra/newview/llscriptfloater.cpp
+++ b/indra/newview/llscriptfloater.cpp
@@ -38,9 +38,11 @@
#include "llchiclet.h"
#include "llfloaterreg.h"
#include "llnotifications.h"
+#include "llnotificationsutil.h"
#include "llscreenchannel.h"
#include "llsyswellwindow.h"
#include "lltoastnotifypanel.h"
+#include "lltrans.h"
#include "llviewerwindow.h"
#include "llimfloater.h"
@@ -65,17 +67,14 @@ LLUUID notification_id_to_object_id(const LLUUID& notification_id)
LLScriptFloater::LLScriptFloater(const LLSD& key)
: LLDockableFloater(NULL, true, key)
, mScriptForm(NULL)
+, mSaveFloaterPosition(false)
{
setMouseDownCallback(boost::bind(&LLScriptFloater::onMouseDown, this));
setOverlapsScreenChannel(true);
}
-bool LLScriptFloater::toggle(const LLUUID& object_id)
+bool LLScriptFloater::toggle(const LLUUID& notification_id)
{
- // Force chiclet toggle on here because first onFocusReceived() will not toggle it on.
- LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(object_id, true);
-
- LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(object_id);
LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", notification_id);
// show existing floater
@@ -89,51 +88,57 @@ bool LLScriptFloater::toggle(const LLUUID& object_id)
else
{
floater->setVisible(TRUE);
- floater->setFocus(TRUE);
- return true;
+ floater->setFocus(FALSE);
}
}
// create and show new floater
else
{
- show(object_id);
- return true;
+ show(notification_id);
}
+
+ LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(notification_id, true);
+ return true;
}
-LLScriptFloater* LLScriptFloater::show(const LLUUID& object_id)
+LLScriptFloater* LLScriptFloater::show(const LLUUID& notification_id)
{
- LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(object_id);
-
- LLScriptFloater* floater = LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", notification_id);
- floater->setObjectId(object_id);
- floater->createForm(object_id);
+ LLScriptFloater* floater = LLFloaterReg::getTypedInstance<LLScriptFloater>("script_floater", notification_id);
+ floater->setNotificationId(notification_id);
+ floater->createForm(notification_id);
- if (floater->getDockControl() == NULL)
- {
- LLChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(object_id);
- if (chiclet == NULL)
- {
- llerror("Dock chiclet for LLScriptFloater doesn't exist", 0);
- }
- else
- {
- LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);
- }
+ //LLDialog(LLGiveInventory and LLLoadURL) should no longer steal focus (see EXT-5445)
+ floater->setAutoFocus(FALSE);
- floater->setDockControl(new LLDockControl(chiclet, floater, floater->getDockTongue(),
- LLDockControl::TOP, boost::bind(&LLScriptFloater::getAllowedRect, floater, _1)));
+ if(LLScriptFloaterManager::OBJ_SCRIPT == LLScriptFloaterManager::getObjectType(notification_id))
+ {
+ floater->setSavePosition(true);
+ floater->restorePosition();
+ }
+ else
+ {
+ floater->dockToChiclet(true);
}
+ //LLDialog(LLGiveInventory and LLLoadURL) should no longer steal focus (see EXT-5445)
+ LLFloaterReg::showTypedInstance<LLScriptFloater>("script_floater", notification_id, FALSE);
+
return floater;
}
+void LLScriptFloater::setNotificationId(const LLUUID& id)
+{
+ mNotificationId = id;
+ // Lets save object id now while notification exists
+ mObjectId = notification_id_to_object_id(id);
+}
+
void LLScriptFloater::getAllowedRect(LLRect& rect)
{
- rect = gViewerWindow->getWorldViewRectRaw();
+ rect = gViewerWindow->getWorldViewRectScaled();
}
-void LLScriptFloater::createForm(const LLUUID& object_id)
+void LLScriptFloater::createForm(const LLUUID& notification_id)
{
// delete old form
if(mScriptForm)
@@ -142,22 +147,24 @@ void LLScriptFloater::createForm(const LLUUID& object_id)
mScriptForm->die();
}
- LLNotificationPtr notification = LLNotifications::getInstance()->find(
- LLScriptFloaterManager::getInstance()->findNotificationId(object_id));
+ LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
if(NULL == notification)
{
return;
}
// create new form
- mScriptForm = new LLToastNotifyPanel(notification);
+ LLRect toast_rect = getRect();
+ // LLToastNotifyPanel will fit own content in vertical direction,
+ // but it needs an initial rect to properly calculate its width
+ // Use an initial rect of the script floater to make the floater window more configurable.
+ mScriptForm = new LLToastNotifyPanel(notification, toast_rect);
addChild(mScriptForm);
// position form on floater
mScriptForm->setOrigin(0, 0);
// make floater size fit form size
- LLRect toast_rect = getRect();
LLRect panel_rect = mScriptForm->getRect();
toast_rect.setLeftTopAndSize(toast_rect.mLeft, toast_rect.mTop, panel_rect.getWidth(), panel_rect.getHeight() + getHeaderHeight());
setShape(toast_rect);
@@ -165,9 +172,11 @@ void LLScriptFloater::createForm(const LLUUID& object_id)
void LLScriptFloater::onClose(bool app_quitting)
{
- if(getObjectId().notNull())
+ savePosition();
+
+ if(getNotificationId().notNull())
{
- LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(getObjectId());
+ LLScriptFloaterManager::getInstance()->onRemoveNotification(getNotificationId());
}
}
@@ -175,6 +184,8 @@ void LLScriptFloater::setDocked(bool docked, bool pop_on_undock /* = true */)
{
LLDockableFloater::setDocked(docked, pop_on_undock);
+ savePosition();
+
hideToastsIfNeeded();
}
@@ -186,7 +197,7 @@ void LLScriptFloater::setVisible(BOOL visible)
if(!visible)
{
- LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getObjectId());
+ LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getNotificationId());
if(chiclet)
{
chiclet->setToggleState(false);
@@ -196,10 +207,10 @@ void LLScriptFloater::setVisible(BOOL visible)
void LLScriptFloater::onMouseDown()
{
- if(getObjectId().notNull())
+ if(getNotificationId().notNull())
{
// Remove new message icon
- LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getObjectId());
+ LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(getNotificationId());
if (chiclet == NULL)
{
llerror("Dock chiclet for LLScriptFloater doesn't exist", 0);
@@ -211,17 +222,76 @@ void LLScriptFloater::onMouseDown()
}
}
+void LLScriptFloater::savePosition()
+{
+ if(getSavePosition() && mObjectId.notNull())
+ {
+ LLScriptFloaterManager::FloaterPositionInfo fpi = {getRect(), isDocked()};
+ LLScriptFloaterManager::getInstance()->saveFloaterPosition(mObjectId, fpi);
+ }
+}
+
+void LLScriptFloater::restorePosition()
+{
+ LLScriptFloaterManager::FloaterPositionInfo fpi;
+ if(LLScriptFloaterManager::getInstance()->getFloaterPosition(mObjectId, fpi))
+ {
+ dockToChiclet(fpi.mDockState);
+ if(!fpi.mDockState)
+ {
+ // Un-docked floater is opened in 0,0, now move it to saved position
+ translate(fpi.mRect.mLeft - getRect().mLeft, fpi.mRect.mTop - getRect().mTop);
+ }
+ }
+ else
+ {
+ dockToChiclet(true);
+ }
+}
+
void LLScriptFloater::onFocusLost()
{
- LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(getObjectId(), false);
+ if(getNotificationId().notNull())
+ {
+ LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(getNotificationId(), false);
+ }
}
void LLScriptFloater::onFocusReceived()
{
// first focus will be received before setObjectId() call - don't toggle chiclet
- if(getObjectId().notNull())
+ if(getNotificationId().notNull())
+ {
+ LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(getNotificationId(), true);
+ }
+}
+
+void LLScriptFloater::dockToChiclet(bool dock)
+{
+ if (getDockControl() == NULL)
{
- LLBottomTray::getInstance()->getChicletPanel()->setChicletToggleState(getObjectId(), true);
+ LLChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLChiclet>(getNotificationId());
+ if (chiclet == NULL)
+ {
+ llwarns << "Dock chiclet for LLScriptFloater doesn't exist" << llendl;
+ return;
+ }
+ else
+ {
+ LLBottomTray::getInstance()->getChicletPanel()->scrollToChiclet(chiclet);
+ }
+
+ // Stop saving position while we dock floater
+ bool save = getSavePosition();
+ setSavePosition(false);
+
+ setDockControl(new LLDockControl(chiclet, this, getDockTongue(),
+ LLDockControl::TOP, boost::bind(&LLScriptFloater::getAllowedRect, this, _1)));
+
+ setDocked(dock);
+
+ // Restore saving
+ setSavePosition(save);
}
}
@@ -246,200 +316,237 @@ void LLScriptFloater::hideToastsIfNeeded()
void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)
{
- // get scripted Object's ID
- LLUUID object_id = notification_id_to_object_id(notification_id);
- if(object_id.isNull())
+ if(notification_id.isNull())
{
- llwarns << "Invalid notification, no object id" << llendl;
+ llwarns << "Invalid notification ID" << llendl;
return;
}
+ // get scripted Object's ID
+ LLUUID object_id = notification_id_to_object_id(notification_id);
+
// Need to indicate of "new message" for object chiclets according to requirements
// specified in the Message Bar design specification. See EXT-3142.
bool set_new_message = false;
+ EObjectType obj_type = getObjectType(notification_id);
- // If an Object spawns more-than-one floater, only the newest one is shown.
- // The previous is automatically closed.
- script_notification_map_t::iterator it = mNotifications.find(object_id);
- if(it != mNotifications.end())
+ // LLDialog can spawn only one instance, LLLoadURL and LLGiveInventory can spawn unlimited number of instances
+ if(OBJ_SCRIPT == obj_type)
{
- LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(object_id);
- if(chiclet)
+ // If an Object spawns more-than-one floater, only the newest one is shown.
+ // The previous is automatically closed.
+ script_notification_map_t::const_iterator it = findUsingObjectId(object_id);
+ if(it != mNotifications.end())
{
- // Pass the new_message icon state further.
- set_new_message = chiclet->getShowNewMessagesIcon();
- }
+ LLIMChiclet* chiclet = LLBottomTray::getInstance()->getChicletPanel()->findChiclet<LLIMChiclet>(it->first);
+ if(chiclet)
+ {
+ // Pass the new_message icon state further.
+ set_new_message = chiclet->getShowNewMessagesIcon();
+ }
- LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", it->second.notification_id);
- if(floater)
- {
- // Generate chiclet with a "new message" indicator if a docked window was opened but not in focus. See EXT-3142.
- set_new_message |= !floater->hasFocus();
- }
+ LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", it->first);
+ if(floater)
+ {
+ // Generate chiclet with a "new message" indicator if a docked window was opened but not in focus. See EXT-3142.
+ set_new_message |= !floater->hasFocus();
+ }
- onRemoveNotification(it->second.notification_id);
+ onRemoveNotification(it->first);
+ }
}
- LLNotificationData nd = {notification_id};
- mNotifications.insert(std::make_pair(object_id, nd));
+ mNotifications.insert(std::make_pair(notification_id, object_id));
// Create inventory offer chiclet for offer type notifications
- LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
- if( notification && notification->getType() == "offer" )
+ if( OBJ_GIVE_INVENTORY == obj_type )
{
- LLBottomTray::instance().getChicletPanel()->createChiclet<LLInvOfferChiclet>(object_id);
+ LLBottomTray::instance().getChicletPanel()->createChiclet<LLInvOfferChiclet>(notification_id);
}
else
{
- LLBottomTray::getInstance()->getChicletPanel()->createChiclet<LLScriptChiclet>(object_id);
+ LLBottomTray::getInstance()->getChicletPanel()->createChiclet<LLScriptChiclet>(notification_id);
}
- LLIMWellWindow::getInstance()->addObjectRow(object_id, set_new_message);
+ LLIMWellWindow::getInstance()->addObjectRow(notification_id, set_new_message);
LLSD data;
- data["object_id"] = object_id;
+ data["notification_id"] = notification_id;
data["new_message"] = set_new_message;
data["unread"] = 1; // each object has got only one floater
mNewObjectSignal(data);
- toggleScriptFloater(object_id, set_new_message);
+ toggleScriptFloater(notification_id, set_new_message);
}
void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)
{
- LLUUID object_id = findObjectId(notification_id);
- if(object_id.isNull())
+ if(notification_id.isNull())
{
- llwarns << "Invalid notification, no object id" << llendl;
+ llwarns << "Invalid notification ID" << llendl;
return;
}
- using namespace LLNotificationsUI;
-
- // remove related toast
- LLUUID channel_id(gSavedSettings.getString("NotificationChannelUUID"));
- LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>
- (LLChannelManager::getInstance()->findChannelByID(channel_id));
- LLUUID n_toast_id = findNotificationToastId(object_id);
- if(channel && n_toast_id.notNull())
- {
- channel->killToastByNotificationID(n_toast_id);
- }
-
// remove related chiclet
- LLBottomTray::getInstance()->getChicletPanel()->removeChiclet(object_id);
+ LLBottomTray::getInstance()->getChicletPanel()->removeChiclet(notification_id);
- LLIMWellWindow::getInstance()->removeObjectRow(object_id);
+ LLIMWellWindow::getInstance()->removeObjectRow(notification_id);
// close floater
LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", notification_id);
if(floater)
{
- floater->setObjectId(LLUUID::null);
+ floater->savePosition();
+ floater->setNotificationId(LLUUID::null);
floater->closeFloater();
}
- mNotifications.erase(object_id);
-}
-
-void LLScriptFloaterManager::removeNotificationByObjectId(const LLUUID& object_id)
-{
- // Check we have not removed notification yet
- LLNotificationPtr notification = LLNotifications::getInstance()->find(
- findNotificationId(object_id));
- if(notification)
- {
- onRemoveNotification(notification->getID());
- }
+ mNotifications.erase(notification_id);
}
-void LLScriptFloaterManager::toggleScriptFloater(const LLUUID& object_id, bool set_new_message)
+void LLScriptFloaterManager::toggleScriptFloater(const LLUUID& notification_id, bool set_new_message)
{
- // kill toast
- using namespace LLNotificationsUI;
- LLScreenChannel* channel = dynamic_cast<LLScreenChannel*>(LLChannelManager::getInstance()->findChannelByID(
- LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
- if(channel)
- {
- channel->killToastByNotificationID(findNotificationToastId(object_id));
- }
-
LLSD data;
- data["object_id"] = object_id;
+ data["notification_id"] = notification_id;
data["new_message"] = set_new_message;
mToggleFloaterSignal(data);
// toggle floater
- LLScriptFloater::toggle(object_id);
+ LLScriptFloater::toggle(notification_id);
}
-void LLScriptFloaterManager::setNotificationToastId(const LLUUID& object_id, const LLUUID& notification_id)
+LLUUID LLScriptFloaterManager::findObjectId(const LLUUID& notification_id)
{
- script_notification_map_t::iterator it = mNotifications.find(object_id);
+ script_notification_map_t::const_iterator it = mNotifications.find(notification_id);
if(mNotifications.end() != it)
{
- it->second.toast_notification_id = notification_id;
+ return it->second;
}
+ return LLUUID::null;
}
-LLUUID LLScriptFloaterManager::findObjectId(const LLUUID& notification_id)
+LLUUID LLScriptFloaterManager::findNotificationId(const LLUUID& object_id)
{
- if(notification_id.notNull())
+ if(object_id.notNull())
{
- script_notification_map_t::const_iterator it = mNotifications.begin();
- for(; mNotifications.end() != it; ++it)
+ script_notification_map_t::const_iterator it = findUsingObjectId(object_id);
+ if(mNotifications.end() != it)
{
- if(notification_id == it->second.notification_id)
- {
- return it->first;
- }
+ return it->first;
}
}
return LLUUID::null;
}
-LLUUID LLScriptFloaterManager::findNotificationId(const LLUUID& object_id)
+// static
+LLScriptFloaterManager::EObjectType LLScriptFloaterManager::getObjectType(const LLUUID& notification_id)
{
- script_notification_map_t::const_iterator it = mNotifications.find(object_id);
- if(mNotifications.end() != it)
+ if(notification_id.isNull())
{
- return it->second.notification_id;
+ llwarns << "Invalid notification ID" << llendl;
+ return OBJ_UNKNOWN;
}
- return LLUUID::null;
-}
-LLUUID LLScriptFloaterManager::findNotificationToastId(const LLUUID& object_id)
-{
- script_notification_map_t::const_iterator it = mNotifications.find(object_id);
- if(mNotifications.end() != it)
+ static const object_type_map TYPE_MAP = initObjectTypeMap();
+
+ LLNotificationPtr notification = LLNotificationsUtil::find(notification_id);
+ object_type_map::const_iterator it = TYPE_MAP.find(notification->getName());
+ if(it != TYPE_MAP.end())
{
- return it->second.toast_notification_id;
+ return it->second;
}
- return LLUUID::null;
+
+ llwarns << "Unknown object type" << llendl;
+ return OBJ_UNKNOWN;
}
-//static
-void LLScriptFloaterManager::onToastButtonClick(const LLSD&notification, const LLSD&response)
+// static
+std::string LLScriptFloaterManager::getObjectName(const LLUUID& notification_id)
{
- S32 option = LLNotification::getSelectedOption(notification, response);
- LLUUID object_id = notification["payload"]["object_id"].asUUID();
+ using namespace LLNotificationsUI;
+ LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
+ if(!notification)
+ {
+ llwarns << "Invalid notification" << llendl;
+ return LLStringUtil::null;
+ }
- switch(option)
+ std::string text;
+
+ switch(LLScriptFloaterManager::getObjectType(notification_id))
{
- case 0: // "Open"
- LLScriptFloaterManager::getInstance()->toggleScriptFloater(object_id);
+ case LLScriptFloaterManager::OBJ_SCRIPT:
+ text = notification->getSubstitutions()["TITLE"].asString();
break;
- case 1: // "Ignore"
- LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(object_id);
+ case LLScriptFloaterManager::OBJ_LOAD_URL:
+ text = notification->getSubstitutions()["OBJECTNAME"].asString();
break;
- case 2: // "Block"
- LLMuteList::getInstance()->add(LLMute(object_id, notification["substitutions"]["TITLE"], LLMute::OBJECT));
- LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(object_id);
+ case LLScriptFloaterManager::OBJ_GIVE_INVENTORY:
+ text = notification->getSubstitutions()["OBJECTFROMNAME"].asString();
break;
default:
- llwarns << "Unexpected value" << llendl;
+ text = LLTrans::getString("object");
break;
}
+
+ return text;
+}
+
+//static
+LLScriptFloaterManager::object_type_map LLScriptFloaterManager::initObjectTypeMap()
+{
+ object_type_map type_map;
+ type_map["ScriptDialog"] = OBJ_SCRIPT;
+ type_map["ScriptDialogGroup"] = OBJ_SCRIPT;
+ type_map["LoadWebPage"] = OBJ_LOAD_URL;
+ type_map["ObjectGiveItem"] = OBJ_GIVE_INVENTORY;
+ return type_map;
+}
+
+LLScriptFloaterManager::script_notification_map_t::const_iterator LLScriptFloaterManager::findUsingObjectId(const LLUUID& object_id)
+{
+ script_notification_map_t::const_iterator it = mNotifications.begin();
+ for(; mNotifications.end() != it; ++it)
+ {
+ if(object_id == it->second)
+ {
+ return it;
+ }
+ }
+ return mNotifications.end();
+}
+
+void LLScriptFloaterManager::saveFloaterPosition(const LLUUID& object_id, const FloaterPositionInfo& fpi)
+{
+ if(object_id.notNull())
+ {
+ LLScriptFloaterManager::getInstance()->mFloaterPositions[object_id] = fpi;
+ }
+ else
+ {
+ llwarns << "Invalid object id" << llendl;
+ }
+}
+
+bool LLScriptFloaterManager::getFloaterPosition(const LLUUID& object_id, FloaterPositionInfo& fpi)
+{
+ floater_position_map_t::const_iterator it = mFloaterPositions.find(object_id);
+ if(LLScriptFloaterManager::getInstance()->mFloaterPositions.end() != it)
+ {
+ fpi = it->second;
+ return true;
+ }
+ return false;
+}
+
+void LLScriptFloaterManager::setFloaterVisible(const LLUUID& notification_id, bool visible)
+{
+ LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>(
+ "script_floater", notification_id);
+ if(floater)
+ {
+ floater->setVisible(visible);
+ }
}
// EOF
diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h
index f86605c5d1..dc0cfc2400 100644
--- a/indra/newview/llscriptfloater.h
+++ b/indra/newview/llscriptfloater.h
@@ -48,6 +48,15 @@ class LLScriptFloaterManager : public LLSingleton<LLScriptFloaterManager>
// know how script notifications should look like.
public:
+ typedef enum e_object_type
+ {
+ OBJ_SCRIPT,
+ OBJ_GIVE_INVENTORY,
+ OBJ_LOAD_URL,
+
+ OBJ_UNKNOWN
+ }EObjectType;
+
/**
* Handles new notifications.
* Saves notification and object ids, removes old notification if needed, creates script chiclet
@@ -62,11 +71,6 @@ public:
void onRemoveNotification(const LLUUID& notification_id);
/**
- * Wrapper for onRemoveNotification, removes notification by object id.
- */
- void removeNotificationByObjectId(const LLUUID& object_id);
-
- /**
* Toggles script floater.
* Removes "new message" icon from chiclet and removes notification toast.
*/
@@ -76,38 +80,49 @@ public:
LLUUID findNotificationId(const LLUUID& object_id);
- LLUUID findNotificationToastId(const LLUUID& object_id);
+ static EObjectType getObjectType(const LLUUID& notification_id);
- /**
- * Associate notification toast id with object id.
- */
- void setNotificationToastId(const LLUUID& object_id, const LLUUID& notification_id);
-
- /**
- * Callback for notification toast buttons.
- */
- static void onToastButtonClick(const LLSD&notification, const LLSD&response);
+ static std::string getObjectName(const LLUUID& notification_id);
typedef boost::signals2::signal<void(const LLSD&)> object_signal_t;
boost::signals2::connection addNewObjectCallback(const object_signal_t::slot_type& cb) { return mNewObjectSignal.connect(cb); }
boost::signals2::connection addToggleObjectFloaterCallback(const object_signal_t::slot_type& cb) { return mToggleFloaterSignal.connect(cb); }
-private:
-
- struct LLNotificationData
+ struct FloaterPositionInfo
{
- LLUUID notification_id;
- LLUUID toast_notification_id;
+ LLRect mRect;
+ bool mDockState;
};
- // <object_id, notification_data>
- typedef std::map<LLUUID, LLNotificationData> script_notification_map_t;
+ void saveFloaterPosition(const LLUUID& object_id, const FloaterPositionInfo& fpi);
+
+ bool getFloaterPosition(const LLUUID& object_id, FloaterPositionInfo& fpi);
+
+ void setFloaterVisible(const LLUUID& notification_id, bool visible);
+
+protected:
+
+ typedef std::map<std::string, EObjectType> object_type_map;
+
+ static object_type_map initObjectTypeMap();
+
+ // <notification_id, object_id>
+ typedef std::map<LLUUID, LLUUID> script_notification_map_t;
+
+ script_notification_map_t::const_iterator findUsingObjectId(const LLUUID& object_id);
+
+private:
script_notification_map_t mNotifications;
object_signal_t mNewObjectSignal;
object_signal_t mToggleFloaterSignal;
+
+ // <object_id, floater position>
+ typedef std::map<LLUUID, FloaterPositionInfo> floater_position_map_t;
+
+ floater_position_map_t mFloaterPositions;
};
/**
@@ -136,9 +151,9 @@ public:
*/
static LLScriptFloater* show(const LLUUID& object_id);
- const LLUUID& getObjectId() { return mObjectId; }
+ const LLUUID& getNotificationId() { return mNotificationId; }
- void setObjectId(const LLUUID& id) { mObjectId = id; }
+ void setNotificationId(const LLUUID& id);
/**
* Close notification if script floater is closed.
@@ -155,6 +170,14 @@ public:
*/
/*virtual*/ void setVisible(BOOL visible);
+ bool getSavePosition() { return mSaveFloaterPosition; }
+
+ void setSavePosition(bool save) { mSaveFloaterPosition = save; }
+
+ void savePosition();
+
+ void restorePosition();
+
protected:
/**
@@ -178,9 +201,13 @@ protected:
/*virtual*/ void onFocusReceived();
+ void dockToChiclet(bool dock);
+
private:
LLToastNotifyPanel* mScriptForm;
+ LLUUID mNotificationId;
LLUUID mObjectId;
+ bool mSaveFloaterPosition;
};
#endif //LL_SCRIPTFLOATER_H
diff --git a/indra/newview/llscrollingpanelparam.cpp b/indra/newview/llscrollingpanelparam.cpp
index 32a915608e..6f5238f0a1 100644
--- a/indra/newview/llscrollingpanelparam.cpp
+++ b/indra/newview/llscrollingpanelparam.cpp
@@ -42,24 +42,21 @@
#include "llbutton.h"
#include "llsliderctrl.h"
#include "llagent.h"
+#include "llviewborder.h"
#include "llvoavatarself.h"
// Constants for LLPanelVisualParam
const F32 LLScrollingPanelParam::PARAM_STEP_TIME_THRESHOLD = 0.25f;
-const S32 LLScrollingPanelParam::BTN_BORDER = 2;
const S32 LLScrollingPanelParam::PARAM_HINT_WIDTH = 128;
const S32 LLScrollingPanelParam::PARAM_HINT_HEIGHT = 128;
-const S32 LLScrollingPanelParam::PARAM_HINT_LABEL_HEIGHT = 16;
-const S32 LLScrollingPanelParam::PARAM_PANEL_WIDTH = 2 * (3* BTN_BORDER + PARAM_HINT_WIDTH + LLPANEL_BORDER_WIDTH);
-const S32 LLScrollingPanelParam::PARAM_PANEL_HEIGHT = 2 * BTN_BORDER + PARAM_HINT_HEIGHT + PARAM_HINT_LABEL_HEIGHT + 4 * LLPANEL_BORDER_WIDTH;
// LLScrollingPanelParam
//static
S32 LLScrollingPanelParam::sUpdateDelayFrames = 0;
LLScrollingPanelParam::LLScrollingPanelParam( const LLPanel::Params& panel_params,
- LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable )
+ LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, LLJoint* jointp )
: LLScrollingPanel( panel_params ),
mParam(param),
mAllowModify(allow_modify),
@@ -67,15 +64,18 @@ LLScrollingPanelParam::LLScrollingPanelParam( const LLPanel::Params& panel_param
{
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_scrolling_param.xml");
+ // *HACK To avoid hard coding texture position, lets use border's position for texture.
+ LLViewBorder* left_border = getChild<LLViewBorder>("left_border");
+
static LLUICachedControl<S32> slider_ctrl_height ("UISliderctrlHeight", 0);
- S32 pos_x = 2 * LLPANEL_BORDER_WIDTH;
- S32 pos_y = 3 * LLPANEL_BORDER_WIDTH + slider_ctrl_height;
+ S32 pos_x = left_border->getRect().mLeft + left_border->getBorderWidth();
+ S32 pos_y = left_border->getRect().mBottom + left_border->getBorderWidth();
F32 min_weight = param->getMinWeight();
F32 max_weight = param->getMaxWeight();
- mHintMin = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, (LLViewerVisualParam*) wearable->getVisualParam(param->getID()), min_weight);
- pos_x += PARAM_HINT_WIDTH + 3 * BTN_BORDER;
- mHintMax = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, (LLViewerVisualParam*) wearable->getVisualParam(param->getID()), max_weight );
+ mHintMin = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, (LLViewerVisualParam*) wearable->getVisualParam(param->getID()), wearable, min_weight, jointp);
+ pos_x = getChild<LLViewBorder>("right_border")->getRect().mLeft + left_border->getBorderWidth();
+ mHintMax = new LLVisualParamHint( pos_x, pos_y, PARAM_HINT_WIDTH, PARAM_HINT_HEIGHT, mesh, (LLViewerVisualParam*) wearable->getVisualParam(param->getID()), wearable, max_weight, jointp );
mHintMin->setAllowsUpdates( FALSE );
mHintMax->setAllowsUpdates( FALSE );
@@ -162,39 +162,39 @@ void LLScrollingPanelParam::draw()
childSetVisible("less", mHintMin->getVisible());
childSetVisible("more", mHintMax->getVisible());
+ // hide borders if texture has been loaded
+ childSetVisible("left_border", !mHintMin->getVisible());
+ childSetVisible("right_border", !mHintMax->getVisible());
+
// Draw all the children except for the labels
childSetVisible( "min param text", FALSE );
childSetVisible( "max param text", FALSE );
LLPanel::draw();
// Draw the hints over the "less" and "more" buttons.
- glPushMatrix();
+ gGL.pushUIMatrix();
{
const LLRect& r = mHintMin->getRect();
- F32 left = (F32)(r.mLeft + BTN_BORDER);
- F32 bot = (F32)(r.mBottom + BTN_BORDER);
- glTranslatef(left, bot, 0.f);
+ gGL.translateUI((F32)r.mLeft, (F32)r.mBottom, 0.f);
mHintMin->draw();
}
- glPopMatrix();
+ gGL.popUIMatrix();
- glPushMatrix();
+ gGL.pushUIMatrix();
{
const LLRect& r = mHintMax->getRect();
- F32 left = (F32)(r.mLeft + BTN_BORDER);
- F32 bot = (F32)(r.mBottom + BTN_BORDER);
- glTranslatef(left, bot, 0.f);
+ gGL.translateUI((F32)r.mLeft, (F32)r.mBottom, 0.f);
mHintMax->draw();
}
- glPopMatrix();
+ gGL.popUIMatrix();
// Draw labels on top of the buttons
childSetVisible( "min param text", TRUE );
- drawChild(getChild<LLView>("min param text"), BTN_BORDER, BTN_BORDER);
+ drawChild(getChild<LLView>("min param text"));
childSetVisible( "max param text", TRUE );
- drawChild(getChild<LLView>("max param text"), BTN_BORDER, BTN_BORDER);
+ drawChild(getChild<LLView>("max param text"));
}
// static
@@ -209,7 +209,7 @@ void LLScrollingPanelParam::onSliderMoved(LLUICtrl* ctrl, void* userdata)
if (current_weight != new_weight )
{
self->mWearable->setVisualParamWeight( param->getID(), new_weight, FALSE );
- gAgent.getAvatarObject()->updateVisualParams();
+ gAgentAvatarp->updateVisualParams();
}
}
@@ -298,7 +298,7 @@ void LLScrollingPanelParam::onHintHeldDown( LLVisualParamHint* hint )
&& new_percent < slider->getMaxValue())
{
mWearable->setVisualParamWeight( hint->getVisualParam()->getID(), new_weight, FALSE);
- gAgent.getAvatarObject()->updateVisualParams();
+ gAgentAvatarp->updateVisualParams();
slider->setValue( weightToPercent( new_weight ) );
}
@@ -344,8 +344,7 @@ void LLScrollingPanelParam::onHintMaxMouseUp( void* userdata )
F32 elapsed_time = self->mMouseDownTimer.getElapsedTimeF32();
- LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- if (avatar)
+ if (isAgentAvatarValid())
{
LLVisualParamHint* hint = self->mHintMax;
diff --git a/indra/newview/llscrollingpanelparam.h b/indra/newview/llscrollingpanelparam.h
index 8c5db64816..3cdfd188a8 100644
--- a/indra/newview/llscrollingpanelparam.h
+++ b/indra/newview/llscrollingpanelparam.h
@@ -42,12 +42,13 @@ class LLViewerVisualParam;
class LLWearable;
class LLVisualParamHint;
class LLViewerVisualParam;
+class LLJoint;
class LLScrollingPanelParam : public LLScrollingPanel
{
public:
LLScrollingPanelParam( const LLPanel::Params& panel_params,
- LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable );
+ LLViewerJointMesh* mesh, LLViewerVisualParam* param, BOOL allow_modify, LLWearable* wearable, LLJoint* jointp );
virtual ~LLScrollingPanelParam();
virtual void draw();
@@ -75,13 +76,8 @@ public:
// Constants for LLPanelVisualParam
const static F32 PARAM_STEP_TIME_THRESHOLD;
- const static S32 BTN_BORDER;
const static S32 PARAM_HINT_WIDTH;
const static S32 PARAM_HINT_HEIGHT;
- const static S32 PARAM_HINT_LABEL_HEIGHT;
- const static S32 PARAM_PANEL_WIDTH;
- const static S32 PARAM_PANEL_HEIGHT;
-
public:
LLViewerVisualParam* mParam;
diff --git a/indra/newview/llsearchcombobox.cpp b/indra/newview/llsearchcombobox.cpp
index 93a70b6471..a130878176 100644
--- a/indra/newview/llsearchcombobox.cpp
+++ b/indra/newview/llsearchcombobox.cpp
@@ -78,6 +78,7 @@ LLSearchComboBox::LLSearchComboBox(const Params&p)
button_params.click_callback.function(boost::bind(&LLSearchComboBox::onSelectionCommit, this));
mSearchButton = LLUICtrlFactory::create<LLButton>(button_params);
mTextEntry->addChild(mSearchButton);
+ mTextEntry->setPassDelete(TRUE);
setButtonVisible(p.dropdown_button_visible);
mTextEntry->setCommitCallback(boost::bind(&LLComboBox::onTextCommit, this, _2));
diff --git a/indra/newview/llsecapi.cpp b/indra/newview/llsecapi.cpp
new file mode 100644
index 0000000000..6389fd292c
--- /dev/null
+++ b/indra/newview/llsecapi.cpp
@@ -0,0 +1,197 @@
+/**
+ * @file llsecapi.cpp
+ * @brief Security API for services such as certificate handling
+ * secure local storage, etc.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlife.com/developers/opensource/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlife.com/developers/opensource/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+
+#include "llviewerprecompiledheaders.h"
+#include "llsecapi.h"
+#include "llsechandler_basic.h"
+#include <openssl/evp.h>
+#include <openssl/err.h>
+#include <map>
+#include "llhttpclient.h"
+
+
+
+std::map<std::string, LLPointer<LLSecAPIHandler> > gHandlerMap;
+LLPointer<LLSecAPIHandler> gSecAPIHandler;
+
+void initializeSecHandler()
+{
+ ERR_load_crypto_strings();
+ OpenSSL_add_all_algorithms();
+
+ gHandlerMap[BASIC_SECHANDLER] = new LLSecAPIBasicHandler();
+
+
+ // Currently, we only have the Basic handler, so we can point the main sechandler
+ // pointer to the basic handler. Later, we'll create a wrapper handler that
+ // selects the appropriate sechandler as needed, for instance choosing the
+ // mac keyring handler, with fallback to the basic sechandler
+ gSecAPIHandler = gHandlerMap[BASIC_SECHANDLER];
+
+ // initialize all SecAPIHandlers
+ std::string exception_msg;
+ std::map<std::string, LLPointer<LLSecAPIHandler> >::const_iterator itr;
+ for(itr = gHandlerMap.begin(); itr != gHandlerMap.end(); ++itr)
+ {
+ LLPointer<LLSecAPIHandler> handler = (*itr).second;
+ try
+ {
+ handler->init();
+ }
+ catch (LLProtectedDataException e)
+ {
+ exception_msg = e.getMessage();
+ }
+ }
+ if (!exception_msg.empty()) // an exception was thrown.
+ {
+ throw LLProtectedDataException(exception_msg.c_str());
+ }
+
+}
+// start using a given security api handler. If the string is empty
+// the default is used
+LLPointer<LLSecAPIHandler> getSecHandler(const std::string& handler_type)
+{
+ if (gHandlerMap.find(handler_type) != gHandlerMap.end())
+ {
+ return gHandlerMap[handler_type];
+ }
+ else
+ {
+ return LLPointer<LLSecAPIHandler>(NULL);
+ }
+}
+// register a handler
+void registerSecHandler(const std::string& handler_type,
+ LLPointer<LLSecAPIHandler>& handler)
+{
+ gHandlerMap[handler_type] = handler;
+}
+
+std::ostream& operator <<(std::ostream& s, const LLCredential& cred)
+{
+ return s << (std::string)cred;
+}
+
+
+// secapiSSLCertVerifyCallback
+// basic callback called when a cert verification is requested.
+// calls SECAPI to validate the context
+// not initialized in the above initialization function, due to unit tests
+// see llappviewer
+
+int secapiSSLCertVerifyCallback(X509_STORE_CTX *ctx, void *param)
+{
+ LLURLRequest *req = (LLURLRequest *)param;
+ LLPointer<LLCertificateStore> store = gSecAPIHandler->getCertificateStore("");
+ LLPointer<LLCertificateChain> chain = gSecAPIHandler->getCertificateChain(ctx);
+ LLSD validation_params = LLSD::emptyMap();
+ LLURI uri(req->getURL());
+ validation_params[CERT_HOSTNAME] = uri.hostName();
+ try
+ {
+ // we rely on libcurl to validate the hostname, as libcurl does more extensive validation
+ // leaving our hostname validation call mechanism for future additions with respect to
+ // OS native (Mac keyring, windows CAPI) validation.
+ store->validate(VALIDATION_POLICY_SSL & (~VALIDATION_POLICY_HOSTNAME), chain, validation_params);
+ }
+ catch (LLCertValidationTrustException& cert_exception)
+ {
+ LL_WARNS("AppInit") << "Cert not trusted: " << cert_exception.getMessage() << LL_ENDL;
+ return 0;
+ }
+ catch (LLCertException& cert_exception)
+ {
+ LL_WARNS("AppInit") << "cert error " << cert_exception.getMessage() << LL_ENDL;
+ return 0;
+ }
+ catch (...)
+ {
+ LL_WARNS("AppInit") << "cert error " << LL_ENDL;
+ return 0;
+ }
+ return 1;
+}
+
+LLSD LLCredential::getLoginParams()
+{
+ LLSD result = LLSD::emptyMap();
+ try
+ {
+ if (mIdentifier["type"].asString() == "agent")
+ {
+ // legacy credential
+ result["passwd"] = "$1$" + mAuthenticator["secret"].asString();
+ result["first"] = mIdentifier["first_name"];
+ result["last"] = mIdentifier["last_name"];
+
+ }
+ else if (mIdentifier["type"].asString() == "account")
+ {
+ result["username"] = mIdentifier["account_name"];
+ result["passwd"] = mAuthenticator["secret"];
+
+ }
+ }
+ catch (...)
+ {
+ // we could have corrupt data, so simply return a null login param if so
+ LL_WARNS("AppInit") << "Invalid credential" << LL_ENDL;
+ }
+ return result;
+}
+
+void LLCredential::identifierType(std::string &idType)
+{
+ if(mIdentifier.has("type"))
+ {
+ idType = mIdentifier["type"].asString();
+ }
+ else {
+ idType = std::string();
+
+ }
+}
+
+void LLCredential::authenticatorType(std::string &idType)
+{
+ if(mAuthenticator.has("type"))
+ {
+ idType = mAuthenticator["type"].asString();
+ }
+ else {
+ idType = std::string();
+
+ }
+}
diff --git a/indra/newview/llsecapi.h b/indra/newview/llsecapi.h
new file mode 100644
index 0000000000..5a1a3879d4
--- /dev/null
+++ b/indra/newview/llsecapi.h
@@ -0,0 +1,498 @@
+/**
+ * @file llsecapi.h
+ * @brief Security API for services such as certificate handling
+ * secure local storage, etc.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlife.com/developers/opensource/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlife.com/developers/opensource/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LLSECAPI_H
+#define LLSECAPI_H
+#include <vector>
+#include <openssl/x509.h>
+#include <ostream>
+
+#ifdef LL_WINDOWS
+#pragma warning(disable:4250)
+#endif // LL_WINDOWS
+
+// All error handling is via exceptions.
+
+
+#define CERT_SUBJECT_NAME "subject_name"
+#define CERT_ISSUER_NAME "issuer_name"
+#define CERT_NAME_CN "commonName"
+
+#define CERT_SUBJECT_NAME_STRING "subject_name_string"
+#define CERT_ISSUER_NAME_STRING "issuer_name_string"
+
+#define CERT_SERIAL_NUMBER "serial_number"
+
+#define CERT_VALID_FROM "valid_from"
+#define CERT_VALID_TO "valid_to"
+#define CERT_SHA1_DIGEST "sha1_digest"
+#define CERT_MD5_DIGEST "md5_digest"
+#define CERT_HOSTNAME "hostname"
+#define CERT_BASIC_CONSTRAINTS "basicConstraints"
+#define CERT_BASIC_CONSTRAINTS_CA "CA"
+#define CERT_BASIC_CONSTRAINTS_PATHLEN "pathLen"
+
+#define CERT_KEY_USAGE "keyUsage"
+#define CERT_KU_DIGITAL_SIGNATURE "digitalSignature"
+#define CERT_KU_NON_REPUDIATION "nonRepudiation"
+#define CERT_KU_KEY_ENCIPHERMENT "keyEncipherment"
+#define CERT_KU_DATA_ENCIPHERMENT "dataEncipherment"
+#define CERT_KU_KEY_AGREEMENT "keyAgreement"
+#define CERT_KU_CERT_SIGN "certSigning"
+#define CERT_KU_CRL_SIGN "crlSigning"
+#define CERT_KU_ENCIPHER_ONLY "encipherOnly"
+#define CERT_KU_DECIPHER_ONLY "decipherOnly"
+
+#define BASIC_SECHANDLER "BASIC_SECHANDLER"
+#define CERT_VALIDATION_DATE "validation_date"
+
+#define CERT_EXTENDED_KEY_USAGE "extendedKeyUsage"
+#define CERT_EKU_SERVER_AUTH SN_server_auth
+
+#define CERT_SUBJECT_KEY_IDENTFIER "subjectKeyIdentifier"
+#define CERT_AUTHORITY_KEY_IDENTIFIER "authorityKeyIdentifier"
+#define CERT_AUTHORITY_KEY_IDENTIFIER_ID "authorityKeyIdentifierId"
+#define CERT_AUTHORITY_KEY_IDENTIFIER_NAME "authorityKeyIdentifierName"
+#define CERT_AUTHORITY_KEY_IDENTIFIER_SERIAL "authorityKeyIdentifierSerial"
+
+// validate the current time lies within
+// the validation period of the cert
+#define VALIDATION_POLICY_TIME 1
+
+// validate that the CA, or some cert in the chain
+// lies within the certificate store
+#define VALIDATION_POLICY_TRUSTED 2
+
+// validate that the subject name of
+// the cert contains the passed in hostname
+// or validates against the hostname
+#define VALIDATION_POLICY_HOSTNAME 4
+
+
+// validate that the cert contains the SSL EKU
+#define VALIDATION_POLICY_SSL_KU 8
+
+// validate that the cert contains the SSL EKU
+#define VALIDATION_POLICY_CA_KU 16
+
+#define VALIDATION_POLICY_CA_BASIC_CONSTRAINTS 32
+
+// validate that the cert is correct for SSL
+#define VALIDATION_POLICY_SSL (VALIDATION_POLICY_TIME | \
+ VALIDATION_POLICY_HOSTNAME | \
+ VALIDATION_POLICY_TRUSTED | \
+ VALIDATION_POLICY_SSL_KU | \
+ VALIDATION_POLICY_CA_BASIC_CONSTRAINTS | \
+ VALIDATION_POLICY_CA_KU)
+
+
+
+
+
+
+class LLProtectedDataException
+{
+public:
+ LLProtectedDataException(const char *msg)
+ {
+ LL_WARNS("SECAPI") << "Protected Data Error: " << (std::string)msg << LL_ENDL;
+ mMsg = (std::string)msg;
+ }
+ std::string getMessage() { return mMsg; }
+protected:
+ std::string mMsg;
+};
+
+// class LLCertificate
+// parent class providing an interface for certifiate.
+// LLCertificates are considered unmodifiable
+// Certificates are pulled out of stores, or created via
+// factory calls
+class LLCertificate : public LLRefCount
+{
+ LOG_CLASS(LLCertificate);
+public:
+ LLCertificate() {}
+
+ virtual ~LLCertificate() {}
+
+ // return a PEM encoded certificate. The encoding
+ // includes the -----BEGIN CERTIFICATE----- and end certificate elements
+ virtual std::string getPem() const=0;
+
+ // return a DER encoded certificate
+ virtual std::vector<U8> getBinary() const=0;
+
+ // return an LLSD object containing information about the certificate
+ // such as its name, signature, expiry time, serial number
+ virtual void getLLSD(LLSD& llsd)=0;
+
+ // return an openSSL X509 struct for the certificate
+ virtual X509* getOpenSSLX509() const=0;
+
+};
+
+// class LLCertificateVector
+// base class for a list of certificates.
+
+
+class LLCertificateVector : public LLRefCount
+{
+
+public:
+
+ LLCertificateVector() {};
+ virtual ~LLCertificateVector() {};
+
+ // base iterator implementation class, providing
+ // the functionality needed for the iterator class.
+ class iterator_impl : public LLRefCount
+ {
+ public:
+ iterator_impl() {};
+ virtual ~iterator_impl() {};
+ virtual void seek(bool incr)=0;
+ virtual LLPointer<iterator_impl> clone() const=0;
+ virtual bool equals(const LLPointer<iterator_impl>& _iter) const=0;
+ virtual LLPointer<LLCertificate> get()=0;
+ };
+
+ // iterator class
+ class iterator
+ {
+ public:
+ iterator(LLPointer<iterator_impl> impl) : mImpl(impl) {}
+ iterator() : mImpl(NULL) {}
+ iterator(const iterator& _iter) {mImpl = _iter.mImpl->clone(); }
+ ~iterator() {}
+ iterator& operator++() { if(mImpl.notNull()) mImpl->seek(true); return *this;}
+ iterator& operator--() { if(mImpl.notNull()) mImpl->seek(false); return *this;}
+
+ iterator operator++(int) { iterator result = *this; if(mImpl.notNull()) mImpl->seek(true); return result;}
+ iterator operator--(int) { iterator result = *this; if(mImpl.notNull()) mImpl->seek(false); return result;}
+ LLPointer<LLCertificate> operator*() { return mImpl->get(); }
+
+ LLPointer<iterator_impl> mImpl;
+ protected:
+ friend bool operator==(const LLCertificateVector::iterator& _lhs, const LLCertificateVector::iterator& _rhs);
+ bool equals(const iterator& _iter) const { return mImpl->equals(_iter.mImpl); }
+ };
+
+ // numeric indexer
+ virtual LLPointer<LLCertificate> operator[](int)=0;
+
+ // Iteration
+ virtual iterator begin()=0;
+
+ virtual iterator end()=0;
+
+ // find a cert given params
+ virtual iterator find(const LLSD& params) =0;
+
+ // return the number of certs in the store
+ virtual int size() const = 0;
+
+ // append the cert to the store. if a copy of the cert already exists in the store, it is removed first
+ virtual void add(LLPointer<LLCertificate> cert)=0;
+
+ // insert the cert to the store. if a copy of the cert already exists in the store, it is removed first
+ virtual void insert(iterator location, LLPointer<LLCertificate> cert)=0;
+
+ // remove a certificate from the store
+ virtual LLPointer<LLCertificate> erase(iterator cert)=0;
+};
+
+// class LLCertificateChain
+// Class representing a chain of certificates in order, with the
+// first element being the child cert.
+class LLCertificateChain : virtual public LLCertificateVector
+{
+
+public:
+ LLCertificateChain() {}
+
+ virtual ~LLCertificateChain() {}
+
+};
+
+// class LLCertificateStore
+// represents a store of certificates, typically a store of root CA
+// certificates. The store can be persisted, and can be used to validate
+// a cert chain
+//
+class LLCertificateStore : virtual public LLCertificateVector
+{
+
+public:
+
+ LLCertificateStore() {}
+ virtual ~LLCertificateStore() {}
+
+ // persist the store
+ virtual void save()=0;
+
+ // return the store id
+ virtual std::string storeId() const=0;
+
+ // validate a certificate chain given the params.
+ // Will throw exceptions on error
+
+ virtual void validate(int validation_policy,
+ LLPointer<LLCertificateChain> cert_chain,
+ const LLSD& validation_params) =0;
+
+};
+
+
+inline
+bool operator==(const LLCertificateVector::iterator& _lhs, const LLCertificateVector::iterator& _rhs)
+{
+ return _lhs.equals(_rhs);
+}
+inline
+bool operator!=(const LLCertificateVector::iterator& _lhs, const LLCertificateVector::iterator& _rhs)
+{
+ return !(_lhs == _rhs);
+}
+
+
+#define CRED_IDENTIFIER_TYPE_ACCOUNT "account"
+#define CRED_IDENTIFIER_TYPE_AGENT "agent"
+#define CRED_AUTHENTICATOR_TYPE_CLEAR "clear"
+#define CRED_AUTHENTICATOR_TYPE_HASH "hash"
+//
+// LLCredential - interface for credentials providing the following functionality:
+// * persistance of credential information based on grid (for saving username/password)
+// * serialization to an OGP identifier/authenticator pair
+//
+class LLCredential : public LLRefCount
+{
+public:
+
+ LLCredential() {}
+
+ LLCredential(const std::string& grid)
+ {
+ mGrid = grid;
+ mIdentifier = LLSD::emptyMap();
+ mAuthenticator = LLSD::emptyMap();
+ }
+
+ virtual ~LLCredential() {}
+
+ virtual void setCredentialData(const LLSD& identifier, const LLSD& authenticator)
+ {
+ mIdentifier = identifier;
+ mAuthenticator = authenticator;
+ }
+ virtual LLSD getIdentifier() { return mIdentifier; }
+ virtual void identifierType(std::string& idType);
+ virtual LLSD getAuthenticator() { return mAuthenticator; }
+ virtual void authenticatorType(std::string& authType);
+ virtual LLSD getLoginParams();
+ virtual std::string getGrid() { return mGrid; }
+
+
+ virtual void clearAuthenticator() { mAuthenticator = LLSD(); }
+ virtual std::string userID() const { return std::string("unknown");}
+ virtual std::string asString() const { return std::string("unknown");}
+ operator std::string() const { return asString(); }
+protected:
+ LLSD mIdentifier;
+ LLSD mAuthenticator;
+ std::string mGrid;
+};
+
+std::ostream& operator <<(std::ostream& s, const LLCredential& cred);
+
+
+// All error handling is via exceptions.
+
+class LLCertException
+{
+public:
+ LLCertException(LLPointer<LLCertificate> cert, const char* msg)
+ {
+
+ mCert = cert;
+
+ LL_WARNS("SECAPI") << "Certificate Error: " << (std::string)msg << LL_ENDL;
+ mMsg = (std::string)msg;
+ }
+ LLPointer<LLCertificate> getCert() { return mCert; }
+ std::string getMessage() { return mMsg; }
+protected:
+ LLPointer<LLCertificate> mCert;
+ std::string mMsg;
+};
+
+class LLInvalidCertificate : public LLCertException
+{
+public:
+ LLInvalidCertificate(LLPointer<LLCertificate> cert) : LLCertException(cert, "CertInvalid")
+ {
+ }
+protected:
+};
+
+class LLCertValidationTrustException : public LLCertException
+{
+public:
+ LLCertValidationTrustException(LLPointer<LLCertificate> cert) : LLCertException(cert, "CertUntrusted")
+ {
+ }
+protected:
+};
+
+class LLCertValidationHostnameException : public LLCertException
+{
+public:
+ LLCertValidationHostnameException(std::string hostname,
+ LLPointer<LLCertificate> cert) : LLCertException(cert, "CertInvalidHostname")
+ {
+ mHostname = hostname;
+ }
+
+ std::string getHostname() { return mHostname; }
+protected:
+ std::string mHostname;
+};
+
+class LLCertValidationExpirationException : public LLCertException
+{
+public:
+ LLCertValidationExpirationException(LLPointer<LLCertificate> cert,
+ LLDate current_time) : LLCertException(cert, "CertExpired")
+ {
+ mTime = current_time;
+ }
+ LLDate GetTime() { return mTime; }
+protected:
+ LLDate mTime;
+};
+
+class LLCertKeyUsageValidationException : public LLCertException
+{
+public:
+ LLCertKeyUsageValidationException(LLPointer<LLCertificate> cert) : LLCertException(cert, "CertKeyUsage")
+ {
+ }
+protected:
+};
+
+class LLCertBasicConstraintsValidationException : public LLCertException
+{
+public:
+ LLCertBasicConstraintsValidationException(LLPointer<LLCertificate> cert) : LLCertException(cert, "CertBasicConstraints")
+ {
+ }
+protected:
+};
+
+class LLCertValidationInvalidSignatureException : public LLCertException
+{
+public:
+ LLCertValidationInvalidSignatureException(LLPointer<LLCertificate> cert) : LLCertException(cert, "CertInvalidSignature")
+ {
+ }
+protected:
+};
+
+// LLSecAPIHandler Class
+// Interface handler class for the various security storage handlers.
+class LLSecAPIHandler : public LLRefCount
+{
+public:
+
+
+ LLSecAPIHandler() {}
+ virtual ~LLSecAPIHandler() {}
+
+ // initialize the SecAPIHandler
+ virtual void init() {};
+
+ // instantiate a certificate from a pem string
+ virtual LLPointer<LLCertificate> getCertificate(const std::string& pem_cert)=0;
+
+
+
+ // instiate a certificate from an openssl X509 structure
+ virtual LLPointer<LLCertificate> getCertificate(X509* openssl_cert)=0;
+
+ // instantiate a chain from an X509_STORE_CTX
+ virtual LLPointer<LLCertificateChain> getCertificateChain(const X509_STORE_CTX* chain)=0;
+
+ // instantiate a cert store given it's id. if a persisted version
+ // exists, it'll be loaded. If not, one will be created (but not
+ // persisted)
+ virtual LLPointer<LLCertificateStore> getCertificateStore(const std::string& store_id)=0;
+
+ // persist data in a protected store
+ virtual void setProtectedData(const std::string& data_type,
+ const std::string& data_id,
+ const LLSD& data)=0;
+
+ // retrieve protected data
+ virtual LLSD getProtectedData(const std::string& data_type,
+ const std::string& data_id)=0;
+
+ // delete a protected data item from the store
+ virtual void deleteProtectedData(const std::string& data_type,
+ const std::string& data_id)=0;
+
+ virtual LLPointer<LLCredential> createCredential(const std::string& grid,
+ const LLSD& identifier,
+ const LLSD& authenticator)=0;
+
+ virtual LLPointer<LLCredential> loadCredential(const std::string& grid)=0;
+
+ virtual void saveCredential(LLPointer<LLCredential> cred, bool save_authenticator)=0;
+
+ virtual void deleteCredential(LLPointer<LLCredential> cred)=0;
+
+};
+
+void initializeSecHandler();
+
+// retrieve a security api depending on the api type
+LLPointer<LLSecAPIHandler> getSecHandler(const std::string& handler_type);
+
+void registerSecHandler(const std::string& handler_type,
+ LLPointer<LLSecAPIHandler>& handler);
+
+extern LLPointer<LLSecAPIHandler> gSecAPIHandler;
+
+
+int secapiSSLCertVerifyCallback(X509_STORE_CTX *ctx, void *param);
+
+
+#endif // LL_SECAPI_H
diff --git a/indra/newview/llsechandler_basic.cpp b/indra/newview/llsechandler_basic.cpp
new file mode 100644
index 0000000000..e191e50c4b
--- /dev/null
+++ b/indra/newview/llsechandler_basic.cpp
@@ -0,0 +1,1665 @@
+/**
+ * @file llsechandler_basic.cpp
+ * @brief Security API for services such as certificate handling
+ * secure local storage, etc.
+ *
+ * $LicenseInfo:firstyear=2003&license=viewergpl$
+ *
+ * Copyright (c) 2003-2000, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlife.com/developers/opensource/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlife.com/developers/opensource/flossexception
+ *
+LLS * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+
+#include "llviewerprecompiledheaders.h"
+#include "llsecapi.h"
+#include "llsechandler_basic.h"
+#include "llsdserialize.h"
+#include "llviewernetwork.h"
+#include "llxorcipher.h"
+#include "llfile.h"
+#include "lldir.h"
+#include "llviewercontrol.h"
+#include <vector>
+#include <ios>
+#include <openssl/ossl_typ.h>
+#include <openssl/x509.h>
+#include <openssl/x509v3.h>
+#include <openssl/pem.h>
+#include <openssl/asn1.h>
+#include <openssl/rand.h>
+#include <openssl/err.h>
+#include <iostream>
+#include <iomanip>
+#include <time.h>
+#include "llmachineid.h"
+
+
+
+// 128 bits of salt data...
+#define STORE_SALT_SIZE 16
+#define BUFFER_READ_SIZE 256
+std::string cert_string_from_asn1_string(ASN1_STRING* value);
+std::string cert_string_from_octet_string(ASN1_OCTET_STRING* value);
+
+LLSD _basic_constraints_ext(X509* cert);
+LLSD _key_usage_ext(X509* cert);
+LLSD _ext_key_usage_ext(X509* cert);
+LLSD _subject_key_identifier_ext(X509 *cert);
+LLSD _authority_key_identifier_ext(X509* cert);
+
+LLBasicCertificate::LLBasicCertificate(const std::string& pem_cert)
+{
+
+ // BIO_new_mem_buf returns a read only bio, but takes a void* which isn't const
+ // so we need to cast it.
+ BIO * pem_bio = BIO_new_mem_buf((void*)pem_cert.c_str(), pem_cert.length());
+ if(pem_bio == NULL)
+ {
+ LL_WARNS("SECAPI") << "Could not allocate an openssl memory BIO." << LL_ENDL;
+ throw LLInvalidCertificate(this);
+ }
+ mCert = NULL;
+ PEM_read_bio_X509(pem_bio, &mCert, 0, NULL);
+ BIO_free(pem_bio);
+ if (!mCert)
+ {
+ throw LLInvalidCertificate(this);
+ }
+}
+
+
+LLBasicCertificate::LLBasicCertificate(X509* pCert)
+{
+ if (!pCert || !pCert->cert_info)
+ {
+ throw LLInvalidCertificate(this);
+ }
+ mCert = X509_dup(pCert);
+}
+
+LLBasicCertificate::~LLBasicCertificate()
+{
+ if(mCert)
+ {
+ X509_free(mCert);
+ }
+}
+
+//
+// retrieve the pem using the openssl functionality
+std::string LLBasicCertificate::getPem() const
+{
+ char * pem_bio_chars = NULL;
+ // a BIO is the equivalent of a 'std::stream', and
+ // can be a file, mem stream, whatever. Grab a memory based
+ // BIO for the result
+ BIO *pem_bio = BIO_new(BIO_s_mem());
+ if (!pem_bio)
+ {
+ LL_WARNS("SECAPI") << "Could not allocate an openssl memory BIO." << LL_ENDL;
+ return std::string();
+ }
+ PEM_write_bio_X509(pem_bio, mCert);
+ int length = BIO_get_mem_data(pem_bio, &pem_bio_chars);
+ std::string result = std::string(pem_bio_chars, length);
+ BIO_free(pem_bio);
+ return result;
+}
+
+// get the DER encoding for the cert
+// DER is a binary encoding format for certs...
+std::vector<U8> LLBasicCertificate::getBinary() const
+{
+ U8 * der_bio_data = NULL;
+ // get a memory bio
+ BIO *der_bio = BIO_new(BIO_s_mem());
+ if (!der_bio)
+ {
+ LL_WARNS("SECAPI") << "Could not allocate an openssl memory BIO." << LL_ENDL;
+ return std::vector<U8>();
+ }
+ i2d_X509_bio(der_bio, mCert);
+ int length = BIO_get_mem_data(der_bio, &der_bio_data);
+ std::vector<U8> result(length);
+ // vectors are guranteed to be a contiguous chunk of memory.
+ memcpy(&result[0], der_bio_data, length);
+ BIO_free(der_bio);
+ return result;
+}
+
+
+void LLBasicCertificate::getLLSD(LLSD &llsd)
+{
+ if (mLLSDInfo.isUndefined())
+ {
+ _initLLSD();
+ }
+ llsd = mLLSDInfo;
+}
+
+// Initialize the LLSD info for the certificate
+LLSD& LLBasicCertificate::_initLLSD()
+{
+
+ // call the various helpers to build the LLSD
+ mLLSDInfo[CERT_SUBJECT_NAME] = cert_name_from_X509_NAME(X509_get_subject_name(mCert));
+ mLLSDInfo[CERT_ISSUER_NAME] = cert_name_from_X509_NAME(X509_get_issuer_name(mCert));
+ mLLSDInfo[CERT_SUBJECT_NAME_STRING] = cert_string_name_from_X509_NAME(X509_get_subject_name(mCert));
+ mLLSDInfo[CERT_ISSUER_NAME_STRING] = cert_string_name_from_X509_NAME(X509_get_issuer_name(mCert));
+ ASN1_INTEGER *sn = X509_get_serialNumber(mCert);
+ if (sn != NULL)
+ {
+ mLLSDInfo[CERT_SERIAL_NUMBER] = cert_string_from_asn1_integer(sn);
+ }
+
+ mLLSDInfo[CERT_VALID_TO] = cert_date_from_asn1_time(X509_get_notAfter(mCert));
+ mLLSDInfo[CERT_VALID_FROM] = cert_date_from_asn1_time(X509_get_notBefore(mCert));
+ mLLSDInfo[CERT_SHA1_DIGEST] = cert_get_digest("sha1", mCert);
+ mLLSDInfo[CERT_MD5_DIGEST] = cert_get_digest("md5", mCert);
+ // add the known extensions
+ mLLSDInfo[CERT_BASIC_CONSTRAINTS] = _basic_constraints_ext(mCert);
+ mLLSDInfo[CERT_KEY_USAGE] = _key_usage_ext(mCert);
+ mLLSDInfo[CERT_EXTENDED_KEY_USAGE] = _ext_key_usage_ext(mCert);
+ mLLSDInfo[CERT_SUBJECT_KEY_IDENTFIER] = _subject_key_identifier_ext(mCert);
+ mLLSDInfo[CERT_AUTHORITY_KEY_IDENTIFIER] = _authority_key_identifier_ext(mCert);
+ return mLLSDInfo;
+}
+
+// Retrieve the basic constraints info
+LLSD _basic_constraints_ext(X509* cert)
+{
+ LLSD result;
+ BASIC_CONSTRAINTS *bs = (BASIC_CONSTRAINTS *)X509_get_ext_d2i(cert, NID_basic_constraints, NULL, NULL);
+ if(bs)
+ {
+ result = LLSD::emptyMap();
+ // Determines whether the cert can be used as a CA
+ result[CERT_BASIC_CONSTRAINTS_CA] = (bool)bs->ca;
+
+ if(bs->pathlen)
+ {
+ // the pathlen determines how deep a certificate chain can be from
+ // this CA
+ if((bs->pathlen->type == V_ASN1_NEG_INTEGER)
+ || !bs->ca)
+ {
+ result[CERT_BASIC_CONSTRAINTS_PATHLEN] = 0;
+ }
+ else
+ {
+ result[CERT_BASIC_CONSTRAINTS_PATHLEN] = (int)ASN1_INTEGER_get(bs->pathlen);
+ }
+ }
+
+ }
+ return result;
+}
+
+// retrieve the key usage, which specifies how the cert can be used.
+//
+LLSD _key_usage_ext(X509* cert)
+{
+ LLSD result;
+ ASN1_STRING *usage_str = (ASN1_STRING *)X509_get_ext_d2i(cert, NID_key_usage, NULL, NULL);
+ if(usage_str)
+ {
+ result = LLSD::emptyArray();
+ long usage = 0;
+ if(usage_str->length > 0)
+ {
+ usage = usage_str->data[0];
+ if(usage_str->length > 1)
+ {
+ usage |= usage_str->data[1] << 8;
+ }
+ }
+ ASN1_STRING_free(usage_str);
+ if(usage)
+ {
+ if(usage & KU_DIGITAL_SIGNATURE) result.append(LLSD((std::string)CERT_KU_DIGITAL_SIGNATURE));
+ if(usage & KU_NON_REPUDIATION) result.append(LLSD((std::string)CERT_KU_NON_REPUDIATION));
+ if(usage & KU_KEY_ENCIPHERMENT) result.append(LLSD((std::string)CERT_KU_KEY_ENCIPHERMENT));
+ if(usage & KU_DATA_ENCIPHERMENT) result.append(LLSD((std::string)CERT_KU_DATA_ENCIPHERMENT));
+ if(usage & KU_KEY_AGREEMENT) result.append(LLSD((std::string)CERT_KU_KEY_AGREEMENT));
+ if(usage & KU_KEY_CERT_SIGN) result.append(LLSD((std::string)CERT_KU_CERT_SIGN));
+ if(usage & KU_CRL_SIGN) result.append(LLSD((std::string)CERT_KU_CRL_SIGN));
+ if(usage & KU_ENCIPHER_ONLY) result.append(LLSD((std::string)CERT_KU_ENCIPHER_ONLY));
+ if(usage & KU_DECIPHER_ONLY) result.append(LLSD((std::string)CERT_KU_DECIPHER_ONLY));
+ }
+ }
+ return result;
+}
+
+// retrieve the extended key usage for the cert
+LLSD _ext_key_usage_ext(X509* cert)
+{
+ LLSD result;
+ EXTENDED_KEY_USAGE *eku = (EXTENDED_KEY_USAGE *)X509_get_ext_d2i(cert, NID_ext_key_usage, NULL, NULL);
+ if(eku)
+ {
+ result = LLSD::emptyArray();
+ while(sk_ASN1_OBJECT_num(eku))
+ {
+ ASN1_OBJECT *usage = sk_ASN1_OBJECT_pop(eku);
+ if(usage)
+ {
+ int nid = OBJ_obj2nid(usage);
+ if (nid)
+ {
+ std::string sn = OBJ_nid2sn(nid);
+ result.append(sn);
+ }
+ ASN1_OBJECT_free(usage);
+ }
+ }
+ }
+ return result;
+}
+
+// retrieve the subject key identifier of the cert
+LLSD _subject_key_identifier_ext(X509 *cert)
+{
+ LLSD result;
+ ASN1_OCTET_STRING *skeyid = (ASN1_OCTET_STRING *)X509_get_ext_d2i(cert, NID_subject_key_identifier, NULL, NULL);
+ if(skeyid)
+ {
+ result = cert_string_from_octet_string(skeyid);
+ }
+ return result;
+}
+
+// retrieve the authority key identifier of the cert
+LLSD _authority_key_identifier_ext(X509* cert)
+{
+ LLSD result;
+ AUTHORITY_KEYID *akeyid = (AUTHORITY_KEYID *)X509_get_ext_d2i(cert, NID_authority_key_identifier, NULL, NULL);
+ if(akeyid)
+ {
+ result = LLSD::emptyMap();
+ if(akeyid->keyid)
+ {
+ result[CERT_AUTHORITY_KEY_IDENTIFIER_ID] = cert_string_from_octet_string(akeyid->keyid);
+ }
+ if(akeyid->serial)
+ {
+ result[CERT_AUTHORITY_KEY_IDENTIFIER_SERIAL] = cert_string_from_asn1_integer(akeyid->serial);
+ }
+ }
+
+ // we ignore the issuer name in the authority key identifier, we check the issue name via
+ // the the issuer name entry in the cert.
+
+
+ return result;
+}
+
+// retrieve an openssl x509 object,
+// which must be freed by X509_free
+X509* LLBasicCertificate::getOpenSSLX509() const
+{
+ return X509_dup(mCert);
+}
+
+// generate a single string containing the subject or issuer
+// name of the cert.
+std::string cert_string_name_from_X509_NAME(X509_NAME* name)
+{
+ char * name_bio_chars = NULL;
+ // get a memory bio
+ BIO *name_bio = BIO_new(BIO_s_mem());
+ // stream the name into the bio. The name will be in the 'short name' format
+ X509_NAME_print_ex(name_bio, name, 0, XN_FLAG_RFC2253);
+ int length = BIO_get_mem_data(name_bio, &name_bio_chars);
+ std::string result = std::string(name_bio_chars, length);
+ BIO_free(name_bio);
+ return result;
+}
+
+// generate an LLSD from a certificate name (issuer or subject name).
+// the name will be strings indexed by the 'long form'
+LLSD cert_name_from_X509_NAME(X509_NAME* name)
+{
+ LLSD result = LLSD::emptyMap();
+ int name_entries = X509_NAME_entry_count(name);
+ for (int entry_index=0; entry_index < name_entries; entry_index++)
+ {
+ char buffer[32];
+ X509_NAME_ENTRY *entry = X509_NAME_get_entry(name, entry_index);
+
+ std::string name_value = std::string((const char*)M_ASN1_STRING_data(X509_NAME_ENTRY_get_data(entry)),
+ M_ASN1_STRING_length(X509_NAME_ENTRY_get_data(entry)));
+
+ ASN1_OBJECT* name_obj = X509_NAME_ENTRY_get_object(entry);
+ OBJ_obj2txt(buffer, sizeof(buffer), name_obj, 0);
+ std::string obj_buffer_str = std::string(buffer);
+ result[obj_buffer_str] = name_value;
+ }
+
+ return result;
+}
+
+// Generate a string from an ASN1 integer. ASN1 Integers are
+// bignums, so they can be 'infinitely' long, therefore we
+// cannot simply use a conversion to U64 or something.
+// We retrieve as a readable string for UI
+
+std::string cert_string_from_asn1_integer(ASN1_INTEGER* value)
+{
+ std::string result;
+ BIGNUM *bn = ASN1_INTEGER_to_BN(value, NULL);
+ if(bn)
+ {
+ char * ascii_bn = BN_bn2hex(bn);
+
+ if(ascii_bn)
+ {
+ result = ascii_bn;
+ OPENSSL_free(ascii_bn);
+ }
+ BN_free(bn);
+ }
+ return result;
+}
+
+// Generate a string from an OCTET string.
+// we retrieve as a
+
+std::string cert_string_from_octet_string(ASN1_OCTET_STRING* value)
+{
+
+ std::stringstream result;
+ result << std::hex << std::setprecision(2);
+ for (int i=0; i < value->length; i++)
+ {
+ if (i != 0)
+ {
+ result << ":";
+ }
+ result << std::setfill('0') << std::setw(2) << (int)value->data[i];
+ }
+ return result.str();
+}
+
+// Generate a string from an ASN1 integer. ASN1 Integers are
+// bignums, so they can be 'infinitely' long, therefore we
+// cannot simply use a conversion to U64 or something.
+// We retrieve as a readable string for UI
+
+std::string cert_string_from_asn1_string(ASN1_STRING* value)
+{
+ char * string_bio_chars = NULL;
+ std::string result;
+ // get a memory bio
+ BIO *string_bio = BIO_new(BIO_s_mem());
+ if(!string_bio)
+ {
+ // stream the name into the bio. The name will be in the 'short name' format
+ ASN1_STRING_print_ex(string_bio, value, ASN1_STRFLGS_RFC2253);
+ int length = BIO_get_mem_data(string_bio, &string_bio_chars);
+ result = std::string(string_bio_chars, length);
+ BIO_free(string_bio);
+ }
+ else
+ {
+ LL_WARNS("SECAPI") << "Could not allocate an openssl memory BIO." << LL_ENDL;
+ }
+
+ return result;
+}
+
+// retrieve a date structure from an ASN1 time, for
+// validity checking.
+LLDate cert_date_from_asn1_time(ASN1_TIME* asn1_time)
+{
+
+ struct tm timestruct = {0};
+ int i = asn1_time->length;
+
+ if (i < 10)
+ {
+ return LLDate();
+ }
+ // convert the date from the ASN1 time (which is a string in ZULU time), to
+ // a timeval.
+ timestruct.tm_year = (asn1_time->data[0]-'0') * 10 + (asn1_time->data[1]-'0');
+
+ /* Deal with Year 2000 */
+ if (timestruct.tm_year < 70)
+ timestruct.tm_year += 100;
+
+ timestruct.tm_mon = (asn1_time->data[2]-'0') * 10 + (asn1_time->data[3]-'0') - 1;
+ timestruct.tm_mday = (asn1_time->data[4]-'0') * 10 + (asn1_time->data[5]-'0');
+ timestruct.tm_hour = (asn1_time->data[6]-'0') * 10 + (asn1_time->data[7]-'0');
+ timestruct.tm_min = (asn1_time->data[8]-'0') * 10 + (asn1_time->data[9]-'0');
+ timestruct.tm_sec = (asn1_time->data[10]-'0') * 10 + (asn1_time->data[11]-'0');
+
+#if LL_WINDOWS
+ return LLDate((F64)_mkgmtime(&timestruct));
+#else // LL_WINDOWS
+ return LLDate((F64)timegm(&timestruct));
+#endif // LL_WINDOWS
+}
+
+
+// Generate a string containing a digest. The digest time is 'ssh1' or
+// 'md5', and the resulting string is of the form "aa:12:5c:' and so on
+std::string cert_get_digest(const std::string& digest_type, X509 *cert)
+{
+ unsigned char digest_data[BUFFER_READ_SIZE];
+ unsigned int len = sizeof(digest_data);
+ std::stringstream result;
+ const EVP_MD* digest = NULL;
+ // we could use EVP_get_digestbyname, but that requires initializer code which
+ // would require us to complicate things by plumbing it into the system.
+ if (digest_type == "md5")
+ {
+ digest = EVP_md5();
+ }
+ else if (digest_type == "sha1")
+ {
+ digest = EVP_sha1();
+ }
+ else
+ {
+ return std::string();
+ }
+
+ X509_digest(cert, digest, digest_data, &len);
+ result << std::hex << std::setprecision(2);
+ for (unsigned int i=0; i < len; i++)
+ {
+ if (i != 0)
+ {
+ result << ":";
+ }
+ result << std::setfill('0') << std::setw(2) << (int)digest_data[i];
+ }
+ return result.str();
+}
+
+
+// class LLBasicCertificateVector
+// This class represents a list of certificates, implemented by a vector of certificate pointers.
+// it contains implementations of the virtual functions for iterators, search, add, remove, etc.
+//
+
+// Find a certificate in the list.
+// It will find a cert that has minimally the params listed, with the values being the same
+LLBasicCertificateVector::iterator LLBasicCertificateVector::find(const LLSD& params)
+{
+ BOOL found = FALSE;
+ // loop through the entire vector comparing the values in the certs
+ // against those passed in via the params.
+ // params should be a map. Only the items specified in the map will be
+ // checked, but they must match exactly, even if they're maps or arrays.
+
+ for(iterator cert = begin();
+ cert != end();
+ cert++)
+ {
+
+ found= TRUE;
+ LLSD cert_info;
+ (*cert)->getLLSD(cert_info);
+ for (LLSD::map_const_iterator param = params.beginMap();
+ param != params.endMap();
+ param++)
+ {
+
+ if (!cert_info.has((std::string)param->first) ||
+ (!valueCompareLLSD(cert_info[(std::string)param->first], param->second)))
+ {
+ found = FALSE;
+ break;
+ }
+ }
+ if (found)
+ {
+ return (cert);
+ }
+ }
+ return end();
+}
+
+// Insert a certificate into the store. If the certificate already
+// exists in the store, nothing is done.
+void LLBasicCertificateVector::insert(iterator _iter,
+ LLPointer<LLCertificate> cert)
+{
+ LLSD cert_info;
+ cert->getLLSD(cert_info);
+ if (cert_info.isMap() && cert_info.has(CERT_SHA1_DIGEST))
+ {
+ LLSD existing_cert_info = LLSD::emptyMap();
+ existing_cert_info[CERT_MD5_DIGEST] = cert_info[CERT_MD5_DIGEST];
+ if(find(existing_cert_info) == end())
+ {
+ BasicIteratorImpl *basic_iter = dynamic_cast<BasicIteratorImpl*>(_iter.mImpl.get());
+ llassert(basic_iter);
+ if (basic_iter)
+ {
+ mCerts.insert(basic_iter->mIter, cert);
+ }
+ }
+ }
+}
+
+// remove a certificate from the store
+LLPointer<LLCertificate> LLBasicCertificateVector::erase(iterator _iter)
+{
+
+ if (_iter != end())
+ {
+ BasicIteratorImpl *basic_iter = dynamic_cast<BasicIteratorImpl*>(_iter.mImpl.get());
+ LLPointer<LLCertificate> result = (*_iter);
+ mCerts.erase(basic_iter->mIter);
+ return result;
+ }
+ return NULL;
+}
+
+
+//
+// LLBasicCertificateStore
+// This class represents a store of CA certificates. The basic implementation
+// uses a pem file such as the legacy CA.pem stored in the existing
+// SL implementation.
+LLBasicCertificateStore::LLBasicCertificateStore(const std::string& filename)
+{
+ mFilename = filename;
+ load_from_file(filename);
+}
+
+void LLBasicCertificateStore::load_from_file(const std::string& filename)
+{
+ // scan the PEM file extracting each certificate
+ if (!LLFile::isfile(filename))
+ {
+ return;
+ }
+
+ BIO* file_bio = BIO_new(BIO_s_file());
+ if(file_bio)
+ {
+ if (BIO_read_filename(file_bio, filename.c_str()) > 0)
+ {
+ X509 *cert_x509 = NULL;
+ while((PEM_read_bio_X509(file_bio, &cert_x509, 0, NULL)) &&
+ (cert_x509 != NULL))
+ {
+ try
+ {
+ add(new LLBasicCertificate(cert_x509));
+ }
+ catch (...)
+ {
+ LL_WARNS("SECAPI") << "Failure creating certificate from the certificate store file." << LL_ENDL;
+ }
+ X509_free(cert_x509);
+ cert_x509 = NULL;
+ }
+ BIO_free(file_bio);
+ }
+ }
+ else
+ {
+ LL_WARNS("SECAPI") << "Could not allocate a file BIO" << LL_ENDL;
+ }
+}
+
+
+LLBasicCertificateStore::~LLBasicCertificateStore()
+{
+}
+
+
+// persist the store
+void LLBasicCertificateStore::save()
+{
+ llofstream file_store(mFilename, llofstream::binary);
+ if(!file_store.fail())
+ {
+ for(iterator cert = begin();
+ cert != end();
+ cert++)
+ {
+ std::string pem = (*cert)->getPem();
+ if(!pem.empty())
+ {
+ file_store << (*cert)->getPem() << std::endl;
+ }
+ }
+ file_store.close();
+ }
+ else
+ {
+ LL_WARNS("SECAPI") << "Could not open certificate store " << mFilename << "for save" << LL_ENDL;
+ }
+}
+
+// return the store id
+std::string LLBasicCertificateStore::storeId() const
+{
+ // this is the basic handler which uses the CA.pem store,
+ // so we ignore this.
+ return std::string("");
+}
+
+
+//
+// LLBasicCertificateChain
+// This class represents a chain of certs, each cert being signed by the next cert
+// in the chain. Certs must be properly signed by the parent
+LLBasicCertificateChain::LLBasicCertificateChain(const X509_STORE_CTX* store)
+{
+
+ // we're passed in a context, which contains a cert, and a blob of untrusted
+ // certificates which compose the chain.
+ if((store == NULL) || (store->cert == NULL))
+ {
+ LL_WARNS("SECAPI") << "An invalid store context was passed in when trying to create a certificate chain" << LL_ENDL;
+ return;
+ }
+ // grab the child cert
+ LLPointer<LLCertificate> current = new LLBasicCertificate(store->cert);
+
+ add(current);
+ if(store->untrusted != NULL)
+ {
+ // if there are other certs in the chain, we build up a vector
+ // of untrusted certs so we can search for the parents of each
+ // consecutive cert.
+ LLBasicCertificateVector untrusted_certs;
+ for(int i = 0; i < sk_X509_num(store->untrusted); i++)
+ {
+ LLPointer<LLCertificate> cert = new LLBasicCertificate(sk_X509_value(store->untrusted, i));
+ untrusted_certs.add(cert);
+
+ }
+ while(untrusted_certs.size() > 0)
+ {
+ LLSD find_data = LLSD::emptyMap();
+ LLSD cert_data;
+ current->getLLSD(cert_data);
+ // we simply build the chain via subject/issuer name as the
+ // client should not have passed in multiple CA's with the same
+ // subject name. If they did, it'll come out in the wash during
+ // validation.
+ find_data[CERT_SUBJECT_NAME_STRING] = cert_data[CERT_ISSUER_NAME_STRING];
+ LLBasicCertificateVector::iterator issuer = untrusted_certs.find(find_data);
+ if (issuer != untrusted_certs.end())
+ {
+ current = untrusted_certs.erase(issuer);
+ add(current);
+ }
+ else
+ {
+ break;
+ }
+ }
+ }
+}
+
+
+// subdomain wildcard specifiers can be divided into 3 parts
+// the part before the first *, the part after the first * but before
+// the second *, and the part after the second *.
+// It then iterates over the second for each place in the string
+// that it matches. ie if the subdomain was testfoofoobar, and
+// the wildcard was test*foo*bar, it would match test, then
+// recursively match foofoobar and foobar
+
+bool _cert_subdomain_wildcard_match(const std::string& subdomain,
+ const std::string& wildcard)
+{
+ // split wildcard into the portion before the *, and the portion after
+
+ int wildcard_pos = wildcard.find_first_of('*');
+ // check the case where there is no wildcard.
+ if(wildcard_pos == wildcard.npos)
+ {
+ return (subdomain == wildcard);
+ }
+
+ // we need to match the first part of the subdomain string up to the wildcard
+ // position
+ if(subdomain.substr(0, wildcard_pos) != wildcard.substr(0, wildcard_pos))
+ {
+ // the first portions of the strings didn't match
+ return FALSE;
+ }
+
+ // as the portion of the wildcard string before the * matched, we need to check the
+ // portion afterwards. Grab that portion.
+ std::string new_wildcard_string = wildcard.substr( wildcard_pos+1, wildcard.npos);
+ if(new_wildcard_string.empty())
+ {
+ // we had nothing after the *, so it's an automatic match
+ return TRUE;
+ }
+
+ // grab the portion of the remaining wildcard string before the next '*'. We need to find this
+ // within the remaining subdomain string. and then recursively check.
+ std::string new_wildcard_match_string = new_wildcard_string.substr(0, new_wildcard_string.find_first_of('*'));
+
+ // grab the portion of the subdomain after the part that matched the initial wildcard portion
+ std::string new_subdomain = subdomain.substr(wildcard_pos, subdomain.npos);
+
+ // iterate through the current subdomain, finding instances of the match string.
+ int sub_pos = new_subdomain.find_first_of(new_wildcard_match_string);
+ while(sub_pos != std::string::npos)
+ {
+ new_subdomain = new_subdomain.substr(sub_pos, std::string::npos);
+ if(_cert_subdomain_wildcard_match(new_subdomain, new_wildcard_string))
+ {
+ return TRUE;
+ }
+ sub_pos = new_subdomain.find_first_of(new_wildcard_match_string, 1);
+
+
+ }
+ // didn't find any instances of the match string that worked in the subdomain, so fail.
+ return FALSE;
+}
+
+
+// RFC2459 does not address wildcards as part of it's name matching
+// specification, and there is no RFC specifying wildcard matching,
+// RFC2818 does a few statements about wildcard matching, but is very
+// general. Generally, wildcard matching is per implementation, although
+// it's pretty similar.
+// in our case, we use the '*' wildcard character only, within each
+// subdomain. The hostname and the CN specification should have the
+// same number of subdomains.
+// We then iterate that algorithm over each subdomain.
+bool _cert_hostname_wildcard_match(const std::string& hostname, const std::string& common_name)
+{
+ std::string new_hostname = hostname;
+ std::string new_cn = common_name;
+
+ // find the last '.' in the hostname and the match name.
+ int subdomain_pos = new_hostname.find_last_of('.');
+ int subcn_pos = new_cn.find_last_of('.');
+
+ // if the last char is a '.', strip it
+ if(subdomain_pos == (new_hostname.length()-1))
+ {
+ new_hostname = new_hostname.substr(0, subdomain_pos);
+ subdomain_pos = new_hostname.find_last_of('.');
+ }
+ if(subcn_pos == (new_cn.length()-1))
+ {
+ new_cn = new_cn.substr(0, subcn_pos);
+ subcn_pos = new_cn.find_last_of('.');
+ }
+
+ // Check to see if there are any further '.' in the string.
+ while((subcn_pos != std::string::npos) && (subdomain_pos != std::string::npos))
+ {
+ // snip out last subdomain in both the match string and the hostname
+ // The last bit for 'my.current.host.com' would be 'com'
+ std::string cn_part = new_cn.substr(subcn_pos+1, std::string::npos);
+ std::string hostname_part = new_hostname.substr(subdomain_pos+1, std::string::npos);
+
+ if(!_cert_subdomain_wildcard_match(new_hostname.substr(subdomain_pos+1, std::string::npos),
+ cn_part))
+ {
+ return FALSE;
+ }
+ new_hostname = new_hostname.substr(0, subdomain_pos);
+ new_cn = new_cn.substr(0, subcn_pos);
+ subdomain_pos = new_hostname.find_last_of('.');
+ subcn_pos = new_cn.find_last_of('.');
+ }
+ // check to see if the most significant portion of the common name is '*'. If so, we can
+ // simply return success as child domains are also matched.
+ if(new_cn == "*")
+ {
+ // if it's just a '*' we support all child domains as well, so '*.
+ return TRUE;
+ }
+
+ return _cert_subdomain_wildcard_match(new_hostname, new_cn);
+
+}
+
+// validate that the LLSD array in llsd_set contains the llsd_value
+bool _LLSDArrayIncludesValue(const LLSD& llsd_set, LLSD llsd_value)
+{
+ for(LLSD::array_const_iterator set_value = llsd_set.beginArray();
+ set_value != llsd_set.endArray();
+ set_value++)
+ {
+ if(valueCompareLLSD((*set_value), llsd_value))
+ {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+void _validateCert(int validation_policy,
+ LLPointer<LLCertificate> cert,
+ const LLSD& validation_params,
+ int depth)
+{
+
+ LLSD current_cert_info;
+ cert->getLLSD(current_cert_info);
+ // check basic properties exist in the cert
+ if(!current_cert_info.has(CERT_SUBJECT_NAME) || !current_cert_info.has(CERT_SUBJECT_NAME_STRING))
+ {
+ throw LLCertException(cert, "Cert doesn't have a Subject Name");
+ }
+
+ if(!current_cert_info.has(CERT_ISSUER_NAME_STRING))
+ {
+ throw LLCertException(cert, "Cert doesn't have an Issuer Name");
+ }
+
+ // check basic properties exist in the cert
+ if(!current_cert_info.has(CERT_VALID_FROM) || !current_cert_info.has(CERT_VALID_TO))
+ {
+ throw LLCertException(cert, "Cert doesn't have an expiration period");
+ }
+ if (!current_cert_info.has(CERT_SHA1_DIGEST))
+ {
+ throw LLCertException(cert, "No SHA1 digest");
+ }
+
+ if (validation_policy & VALIDATION_POLICY_TIME)
+ {
+
+ LLDate validation_date(time(NULL));
+ if(validation_params.has(CERT_VALIDATION_DATE))
+ {
+ validation_date = validation_params[CERT_VALIDATION_DATE];
+ }
+
+ if((validation_date < current_cert_info[CERT_VALID_FROM].asDate()) ||
+ (validation_date > current_cert_info[CERT_VALID_TO].asDate()))
+ {
+ throw LLCertValidationExpirationException(cert, validation_date);
+ }
+ }
+ if (validation_policy & VALIDATION_POLICY_SSL_KU)
+ {
+ if (current_cert_info.has(CERT_KEY_USAGE) && current_cert_info[CERT_KEY_USAGE].isArray() &&
+ (!(_LLSDArrayIncludesValue(current_cert_info[CERT_KEY_USAGE],
+ LLSD((std::string)CERT_KU_DIGITAL_SIGNATURE))) ||
+ !(_LLSDArrayIncludesValue(current_cert_info[CERT_KEY_USAGE],
+ LLSD((std::string)CERT_KU_KEY_ENCIPHERMENT)))))
+ {
+ throw LLCertKeyUsageValidationException(cert);
+ }
+ // only validate EKU if the cert has it
+ if(current_cert_info.has(CERT_EXTENDED_KEY_USAGE) && current_cert_info[CERT_EXTENDED_KEY_USAGE].isArray() &&
+ (!_LLSDArrayIncludesValue(current_cert_info[CERT_EXTENDED_KEY_USAGE],
+ LLSD((std::string)CERT_EKU_SERVER_AUTH))))
+ {
+ throw LLCertKeyUsageValidationException(cert);
+ }
+ }
+ if (validation_policy & VALIDATION_POLICY_CA_KU)
+ {
+ if (current_cert_info.has(CERT_KEY_USAGE) && current_cert_info[CERT_KEY_USAGE].isArray() &&
+ (!_LLSDArrayIncludesValue(current_cert_info[CERT_KEY_USAGE],
+ (std::string)CERT_KU_CERT_SIGN)))
+ {
+ throw LLCertKeyUsageValidationException(cert);
+ }
+ }
+
+ // validate basic constraints
+ if ((validation_policy & VALIDATION_POLICY_CA_BASIC_CONSTRAINTS) &&
+ current_cert_info.has(CERT_BASIC_CONSTRAINTS) &&
+ current_cert_info[CERT_BASIC_CONSTRAINTS].isMap())
+ {
+ if(!current_cert_info[CERT_BASIC_CONSTRAINTS].has(CERT_BASIC_CONSTRAINTS_CA) ||
+ !current_cert_info[CERT_BASIC_CONSTRAINTS][CERT_BASIC_CONSTRAINTS_CA])
+ {
+ throw LLCertBasicConstraintsValidationException(cert);
+ }
+ if (current_cert_info[CERT_BASIC_CONSTRAINTS].has(CERT_BASIC_CONSTRAINTS_PATHLEN) &&
+ ((current_cert_info[CERT_BASIC_CONSTRAINTS][CERT_BASIC_CONSTRAINTS_PATHLEN].asInteger() != 0) &&
+ (depth > current_cert_info[CERT_BASIC_CONSTRAINTS][CERT_BASIC_CONSTRAINTS_PATHLEN].asInteger())))
+ {
+ throw LLCertBasicConstraintsValidationException(cert);
+ }
+ }
+}
+
+bool _verify_signature(LLPointer<LLCertificate> parent,
+ LLPointer<LLCertificate> child)
+{
+ bool verify_result = FALSE;
+ LLSD cert1, cert2;
+ parent->getLLSD(cert1);
+ child->getLLSD(cert2);
+ X509 *signing_cert = parent->getOpenSSLX509();
+ X509 *child_cert = child->getOpenSSLX509();
+ if((signing_cert != NULL) && (child_cert != NULL))
+ {
+ EVP_PKEY *pkey = X509_get_pubkey(signing_cert);
+
+
+ if(pkey)
+ {
+ int verify_code = X509_verify(child_cert, pkey);
+ verify_result = ( verify_code > 0);
+ EVP_PKEY_free(pkey);
+ }
+ else
+ {
+ LL_WARNS("SECAPI") << "Could not validate the cert chain signature, as the public key of the signing cert could not be retrieved" << LL_ENDL;
+ }
+
+ }
+ else
+ {
+ LL_WARNS("SECAPI") << "Signature verification failed as there are no certs in the chain" << LL_ENDL;
+ }
+ if(child_cert)
+ {
+ X509_free(child_cert);
+ }
+ if(signing_cert)
+ {
+ X509_free(signing_cert);
+ }
+ return verify_result;
+}
+
+
+// validate the certificate chain against a store.
+// There are many aspects of cert validatioin policy involved in
+// trust validation. The policies in this validation algorithm include
+// * Hostname matching for SSL certs
+// * Expiration time matching
+// * Signature validation
+// * Chain trust (is the cert chain trusted against the store)
+// * Basic constraints
+// * key usage and extended key usage
+// TODO: We should add 'authority key identifier' for chaining.
+// This algorithm doesn't simply validate the chain by itself
+// and verify the last cert is in the certificate store, or points
+// to a cert in the store. It validates whether any cert in the chain
+// is trusted in the store, even if it's not the last one.
+void LLBasicCertificateStore::validate(int validation_policy,
+ LLPointer<LLCertificateChain> cert_chain,
+ const LLSD& validation_params)
+{
+
+ if(cert_chain->size() < 1)
+ {
+ throw LLCertException(NULL, "No certs in chain");
+ }
+ iterator current_cert = cert_chain->begin();
+ LLSD current_cert_info;
+ LLSD validation_date;
+ if (validation_params.has(CERT_VALIDATION_DATE))
+ {
+ validation_date = validation_params[CERT_VALIDATION_DATE];
+ }
+
+ if (validation_policy & VALIDATION_POLICY_HOSTNAME)
+ {
+ (*current_cert)->getLLSD(current_cert_info);
+ if(!validation_params.has(CERT_HOSTNAME))
+ {
+ throw LLCertException((*current_cert), "No hostname passed in for validation");
+ }
+ if(!current_cert_info.has(CERT_SUBJECT_NAME) || !current_cert_info[CERT_SUBJECT_NAME].has(CERT_NAME_CN))
+ {
+ throw LLInvalidCertificate((*current_cert));
+ }
+
+ LL_DEBUGS("SECAPI") << "Validating the hostname " << validation_params[CERT_HOSTNAME].asString() <<
+ "against the cert CN " << current_cert_info[CERT_SUBJECT_NAME][CERT_NAME_CN].asString() << LL_ENDL;
+ if(!_cert_hostname_wildcard_match(validation_params[CERT_HOSTNAME].asString(),
+ current_cert_info[CERT_SUBJECT_NAME][CERT_NAME_CN].asString()))
+ {
+ throw LLCertValidationHostnameException(validation_params[CERT_HOSTNAME].asString(),
+ (*current_cert));
+ }
+ }
+
+ // check the cache of already validated certs
+ X509* cert_x509 = (*current_cert)->getOpenSSLX509();
+ if(!cert_x509)
+ {
+ throw LLInvalidCertificate((*current_cert));
+ }
+ std::string sha1_hash((const char *)cert_x509->sha1_hash, SHA_DIGEST_LENGTH);
+ t_cert_cache::iterator cache_entry = mTrustedCertCache.find(sha1_hash);
+ if(cache_entry != mTrustedCertCache.end())
+ {
+ LL_DEBUGS("SECAPI") << "Found cert in cache" << LL_ENDL;
+ // this cert is in the cache, so validate the time.
+ if (validation_policy & VALIDATION_POLICY_TIME)
+ {
+ LLDate validation_date(time(NULL));
+ if(validation_params.has(CERT_VALIDATION_DATE))
+ {
+ validation_date = validation_params[CERT_VALIDATION_DATE];
+ }
+
+ if((validation_date < cache_entry->second.first) ||
+ (validation_date > cache_entry->second.second))
+ {
+ throw LLCertValidationExpirationException((*current_cert), validation_date);
+ }
+ }
+ // successfully found in cache
+ return;
+ }
+ if(current_cert_info.isUndefined())
+ {
+ (*current_cert)->getLLSD(current_cert_info);
+ }
+ LLDate from_time = current_cert_info[CERT_VALID_FROM].asDate();
+ LLDate to_time = current_cert_info[CERT_VALID_TO].asDate();
+ int depth = 0;
+ LLPointer<LLCertificate> previous_cert;
+ // loop through the cert chain, validating the current cert against the next one.
+ while(current_cert != cert_chain->end())
+ {
+
+ int local_validation_policy = validation_policy;
+ if(current_cert == cert_chain->begin())
+ {
+ // for the child cert, we don't validate CA stuff
+ local_validation_policy &= ~(VALIDATION_POLICY_CA_KU |
+ VALIDATION_POLICY_CA_BASIC_CONSTRAINTS);
+ }
+ else
+ {
+ // for non-child certs, we don't validate SSL Key usage
+ local_validation_policy &= ~VALIDATION_POLICY_SSL_KU;
+ if(!_verify_signature((*current_cert),
+ previous_cert))
+ {
+ throw LLCertValidationInvalidSignatureException(previous_cert);
+ }
+ }
+ _validateCert(local_validation_policy,
+ (*current_cert),
+ validation_params,
+ depth);
+
+ // look for a CA in the CA store that may belong to this chain.
+ LLSD cert_search_params = LLSD::emptyMap();
+ // is the cert itself in the store?
+ cert_search_params[CERT_SHA1_DIGEST] = current_cert_info[CERT_SHA1_DIGEST];
+ LLCertificateStore::iterator found_store_cert = find(cert_search_params);
+ if(found_store_cert != end())
+ {
+ mTrustedCertCache[sha1_hash] = std::pair<LLDate, LLDate>(from_time, to_time);
+ return;
+ }
+
+ // is the parent in the cert store?
+
+ cert_search_params = LLSD::emptyMap();
+ cert_search_params[CERT_SUBJECT_NAME_STRING] = current_cert_info[CERT_ISSUER_NAME_STRING];
+ if (current_cert_info.has(CERT_AUTHORITY_KEY_IDENTIFIER))
+ {
+ LLSD cert_aki = current_cert_info[CERT_AUTHORITY_KEY_IDENTIFIER];
+ if(cert_aki.has(CERT_AUTHORITY_KEY_IDENTIFIER_ID))
+ {
+ cert_search_params[CERT_SUBJECT_KEY_IDENTFIER] = cert_aki[CERT_AUTHORITY_KEY_IDENTIFIER_ID];
+ }
+ if(cert_aki.has(CERT_AUTHORITY_KEY_IDENTIFIER_SERIAL))
+ {
+ cert_search_params[CERT_SERIAL_NUMBER] = cert_aki[CERT_AUTHORITY_KEY_IDENTIFIER_SERIAL];
+ }
+ }
+ found_store_cert = find(cert_search_params);
+
+ if(found_store_cert != end())
+ {
+ // validate the store cert against the depth
+ _validateCert(validation_policy & VALIDATION_POLICY_CA_BASIC_CONSTRAINTS,
+ (*found_store_cert),
+ LLSD(),
+ depth);
+
+ // verify the signature of the CA
+ if(!_verify_signature((*found_store_cert),
+ (*current_cert)))
+ {
+ throw LLCertValidationInvalidSignatureException(*current_cert);
+ }
+ // successfully validated.
+ mTrustedCertCache[sha1_hash] = std::pair<LLDate, LLDate>(from_time, to_time);
+ return;
+ }
+ previous_cert = (*current_cert);
+ current_cert++;
+ depth++;
+ if(current_cert != cert_chain->end())
+ {
+ (*current_cert)->getLLSD(current_cert_info);
+ }
+ }
+ if (validation_policy & VALIDATION_POLICY_TRUSTED)
+ {
+ // we reached the end without finding a trusted cert.
+ throw LLCertValidationTrustException((*cert_chain)[cert_chain->size()-1]);
+
+ }
+ mTrustedCertCache[sha1_hash] = std::pair<LLDate, LLDate>(from_time, to_time);
+}
+
+
+// LLSecAPIBasicHandler Class
+// Interface handler class for the various security storage handlers.
+
+// We read the file on construction, and write it on destruction. This
+// means multiple processes cannot modify the datastore.
+LLSecAPIBasicHandler::LLSecAPIBasicHandler(const std::string& protected_data_file,
+ const std::string& legacy_password_path)
+{
+ mProtectedDataFilename = protected_data_file;
+ mProtectedDataMap = LLSD::emptyMap();
+ mLegacyPasswordPath = legacy_password_path;
+
+}
+
+LLSecAPIBasicHandler::LLSecAPIBasicHandler()
+{
+}
+
+
+void LLSecAPIBasicHandler::init()
+{
+ mProtectedDataMap = LLSD::emptyMap();
+ if (mProtectedDataFilename.length() == 0)
+ {
+ mProtectedDataFilename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,
+ "bin_conf.dat");
+ mLegacyPasswordPath = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "password.dat");
+
+ mProtectedDataFilename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,
+ "bin_conf.dat");
+ std::string store_file = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,
+ "CA.pem");
+
+
+ LL_DEBUGS("SECAPI") << "Loading certificate store from " << store_file << LL_ENDL;
+ mStore = new LLBasicCertificateStore(store_file);
+
+ // grab the application CA.pem file that contains the well-known certs shipped
+ // with the product
+ std::string ca_file_path = gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, "CA.pem");
+ llinfos << "app path " << ca_file_path << llendl;
+ LLBasicCertificateStore app_ca_store = LLBasicCertificateStore(ca_file_path);
+
+ // push the applicate CA files into the store, therefore adding any new CA certs that
+ // updated
+ for(LLCertificateVector::iterator i = app_ca_store.begin();
+ i != app_ca_store.end();
+ i++)
+ {
+ mStore->add(*i);
+ }
+
+ }
+ _readProtectedData(); // initialize mProtectedDataMap
+ // may throw LLProtectedDataException if saved datamap is not decryptable
+}
+LLSecAPIBasicHandler::~LLSecAPIBasicHandler()
+{
+ _writeProtectedData();
+}
+
+void LLSecAPIBasicHandler::_readProtectedData()
+{
+ // attempt to load the file into our map
+ LLPointer<LLSDParser> parser = new LLSDXMLParser();
+ llifstream protected_data_stream(mProtectedDataFilename.c_str(),
+ llifstream::binary);
+
+ if (!protected_data_stream.fail()) {
+ int offset;
+ U8 salt[STORE_SALT_SIZE];
+ U8 buffer[BUFFER_READ_SIZE];
+ U8 decrypted_buffer[BUFFER_READ_SIZE];
+ int decrypted_length;
+ unsigned char unique_id[MAC_ADDRESS_BYTES];
+ LLMachineID::getUniqueID(unique_id, sizeof(unique_id));
+ LLXORCipher cipher(unique_id, sizeof(unique_id));
+
+ // read in the salt and key
+ protected_data_stream.read((char *)salt, STORE_SALT_SIZE);
+ offset = 0;
+ if (protected_data_stream.gcount() < STORE_SALT_SIZE)
+ {
+ throw LLProtectedDataException("Config file too short.");
+ }
+
+ cipher.decrypt(salt, STORE_SALT_SIZE);
+
+ // totally lame. As we're not using the OS level protected data, we need to
+ // at least obfuscate the data. We do this by using a salt stored at the head of the file
+ // to encrypt the data, therefore obfuscating it from someone using simple existing tools.
+ // We do include the MAC address as part of the obfuscation, which would require an
+ // attacker to get the MAC address as well as the protected store, which improves things
+ // somewhat. It would be better to use the password, but as this store
+ // will be used to store the SL password when the user decides to have SL remember it,
+ // so we can't use that. OS-dependent store implementations will use the OS password/storage
+ // mechanisms and are considered to be more secure.
+ // We've a strong intent to move to OS dependent protected data stores.
+
+
+ // read in the rest of the file.
+ EVP_CIPHER_CTX ctx;
+ EVP_CIPHER_CTX_init(&ctx);
+ EVP_DecryptInit(&ctx, EVP_rc4(), salt, NULL);
+ // allocate memory:
+ std::string decrypted_data;
+
+ while(protected_data_stream.good()) {
+ // read data as a block:
+ protected_data_stream.read((char *)buffer, BUFFER_READ_SIZE);
+
+ EVP_DecryptUpdate(&ctx, decrypted_buffer, &decrypted_length,
+ buffer, protected_data_stream.gcount());
+ decrypted_data.append((const char *)decrypted_buffer, protected_data_stream.gcount());
+ }
+
+ // RC4 is a stream cipher, so we don't bother to EVP_DecryptFinal, as there is
+ // no block padding.
+ EVP_CIPHER_CTX_cleanup(&ctx);
+ std::istringstream parse_stream(decrypted_data);
+ if (parser->parse(parse_stream, mProtectedDataMap,
+ LLSDSerialize::SIZE_UNLIMITED) == LLSDParser::PARSE_FAILURE)
+ {
+ throw LLProtectedDataException("Config file cannot be decrypted.");
+ }
+ }
+}
+
+void LLSecAPIBasicHandler::_writeProtectedData()
+{
+ std::ostringstream formatted_data_ostream;
+ U8 salt[STORE_SALT_SIZE];
+ U8 buffer[BUFFER_READ_SIZE];
+ U8 encrypted_buffer[BUFFER_READ_SIZE];
+
+
+ if(mProtectedDataMap.isUndefined())
+ {
+ LLFile::remove(mProtectedDataFilename);
+ return;
+ }
+ // create a string with the formatted data.
+ LLSDSerialize::toXML(mProtectedDataMap, formatted_data_ostream);
+ std::istringstream formatted_data_istream(formatted_data_ostream.str());
+ // generate the seed
+ RAND_bytes(salt, STORE_SALT_SIZE);
+
+
+ // write to a temp file so we don't clobber the initial file if there is
+ // an error.
+ std::string tmp_filename = mProtectedDataFilename + ".tmp";
+
+ llofstream protected_data_stream(tmp_filename.c_str(),
+ llofstream::binary);
+ try
+ {
+
+ EVP_CIPHER_CTX ctx;
+ EVP_CIPHER_CTX_init(&ctx);
+ EVP_EncryptInit(&ctx, EVP_rc4(), salt, NULL);
+ unsigned char unique_id[MAC_ADDRESS_BYTES];
+ LLMachineID::getUniqueID(unique_id, sizeof(unique_id));
+ LLXORCipher cipher(unique_id, sizeof(unique_id));
+ cipher.encrypt(salt, STORE_SALT_SIZE);
+ protected_data_stream.write((const char *)salt, STORE_SALT_SIZE);
+
+ while (formatted_data_istream.good())
+ {
+ formatted_data_istream.read((char *)buffer, BUFFER_READ_SIZE);
+ if(formatted_data_istream.gcount() == 0)
+ {
+ break;
+ }
+ int encrypted_length;
+ EVP_EncryptUpdate(&ctx, encrypted_buffer, &encrypted_length,
+ buffer, formatted_data_istream.gcount());
+ protected_data_stream.write((const char *)encrypted_buffer, encrypted_length);
+ }
+
+ // no EVP_EncrypteFinal, as this is a stream cipher
+ EVP_CIPHER_CTX_cleanup(&ctx);
+
+ protected_data_stream.close();
+ }
+ catch (...)
+ {
+ // it's good practice to clean up any secure information on error
+ // (even though this file isn't really secure. Perhaps in the future
+ // it may be, however.
+ LLFile::remove(tmp_filename);
+ throw LLProtectedDataException("Error writing Protected Data Store");
+ }
+
+ // move the temporary file to the specified file location.
+ if((((LLFile::isfile(mProtectedDataFilename) != 0) &&
+ (LLFile::remove(mProtectedDataFilename) != 0))) ||
+ (LLFile::rename(tmp_filename, mProtectedDataFilename)))
+ {
+ LLFile::remove(tmp_filename);
+ throw LLProtectedDataException("Could not overwrite protected data store");
+ }
+}
+
+// instantiate a certificate from a pem string
+LLPointer<LLCertificate> LLSecAPIBasicHandler::getCertificate(const std::string& pem_cert)
+{
+ LLPointer<LLCertificate> result = new LLBasicCertificate(pem_cert);
+ return result;
+}
+
+
+
+// instiate a certificate from an openssl X509 structure
+LLPointer<LLCertificate> LLSecAPIBasicHandler::getCertificate(X509* openssl_cert)
+{
+ LLPointer<LLCertificate> result = new LLBasicCertificate(openssl_cert);
+ return result;
+}
+
+// instantiate a chain from an X509_STORE_CTX
+LLPointer<LLCertificateChain> LLSecAPIBasicHandler::getCertificateChain(const X509_STORE_CTX* chain)
+{
+ LLPointer<LLCertificateChain> result = new LLBasicCertificateChain(chain);
+ return result;
+}
+
+// instantiate a cert store given it's id. if a persisted version
+// exists, it'll be loaded. If not, one will be created (but not
+// persisted)
+LLPointer<LLCertificateStore> LLSecAPIBasicHandler::getCertificateStore(const std::string& store_id)
+{
+ return mStore;
+}
+
+// retrieve protected data
+LLSD LLSecAPIBasicHandler::getProtectedData(const std::string& data_type,
+ const std::string& data_id)
+{
+
+ if (mProtectedDataMap.has(data_type) &&
+ mProtectedDataMap[data_type].isMap() &&
+ mProtectedDataMap[data_type].has(data_id))
+ {
+ return mProtectedDataMap[data_type][data_id];
+ }
+
+ return LLSD();
+}
+
+void LLSecAPIBasicHandler::deleteProtectedData(const std::string& data_type,
+ const std::string& data_id)
+{
+ if (mProtectedDataMap.has(data_type) &&
+ mProtectedDataMap[data_type].isMap() &&
+ mProtectedDataMap[data_type].has(data_id))
+ {
+ mProtectedDataMap[data_type].erase(data_id);
+ }
+}
+
+
+//
+// persist data in a protected store
+//
+void LLSecAPIBasicHandler::setProtectedData(const std::string& data_type,
+ const std::string& data_id,
+ const LLSD& data)
+{
+ if (!mProtectedDataMap.has(data_type) || !mProtectedDataMap[data_type].isMap()) {
+ mProtectedDataMap[data_type] = LLSD::emptyMap();
+ }
+
+ mProtectedDataMap[data_type][data_id] = data;
+}
+
+//
+// Create a credential object from an identifier and authenticator. credentials are
+// per grid.
+LLPointer<LLCredential> LLSecAPIBasicHandler::createCredential(const std::string& grid,
+ const LLSD& identifier,
+ const LLSD& authenticator)
+{
+ LLPointer<LLSecAPIBasicCredential> result = new LLSecAPIBasicCredential(grid);
+ result->setCredentialData(identifier, authenticator);
+ return result;
+}
+
+// Load a credential from the credential store, given the grid
+LLPointer<LLCredential> LLSecAPIBasicHandler::loadCredential(const std::string& grid)
+{
+ LLSD credential = getProtectedData("credential", grid);
+ LLPointer<LLSecAPIBasicCredential> result = new LLSecAPIBasicCredential(grid);
+ if(credential.isMap() &&
+ credential.has("identifier"))
+ {
+
+ LLSD identifier = credential["identifier"];
+ LLSD authenticator;
+ if (credential.has("authenticator"))
+ {
+ authenticator = credential["authenticator"];
+ }
+ result->setCredentialData(identifier, authenticator);
+ }
+ else
+ {
+ // credential was not in protected storage, so pull the credential
+ // from the legacy store.
+ std::string first_name = gSavedSettings.getString("FirstName");
+ std::string last_name = gSavedSettings.getString("LastName");
+
+ if ((first_name != "") &&
+ (last_name != ""))
+ {
+ LLSD identifier = LLSD::emptyMap();
+ LLSD authenticator;
+ identifier["type"] = "agent";
+ identifier["first_name"] = first_name;
+ identifier["last_name"] = last_name;
+
+ std::string legacy_password = _legacyLoadPassword();
+ if (legacy_password.length() > 0)
+ {
+ authenticator = LLSD::emptyMap();
+ authenticator["type"] = "hash";
+ authenticator["algorithm"] = "md5";
+ authenticator["secret"] = legacy_password;
+ }
+ result->setCredentialData(identifier, authenticator);
+ }
+ }
+ return result;
+}
+
+// Save the credential to the credential store. Save the authenticator also if requested.
+// That feature is used to implement the 'remember password' functionality.
+void LLSecAPIBasicHandler::saveCredential(LLPointer<LLCredential> cred, bool save_authenticator)
+{
+ LLSD credential = LLSD::emptyMap();
+ credential["identifier"] = cred->getIdentifier();
+ if (save_authenticator)
+ {
+ credential["authenticator"] = cred->getAuthenticator();
+ }
+ LL_DEBUGS("SECAPI") << "Saving Credential " << cred->getGrid() << ":" << cred->userID() << " " << save_authenticator << LL_ENDL;
+ setProtectedData("credential", cred->getGrid(), credential);
+ //*TODO: If we're saving Agni credentials, should we write the
+ // credentials to the legacy password.dat/etc?
+ _writeProtectedData();
+}
+
+// Remove a credential from the credential store.
+void LLSecAPIBasicHandler::deleteCredential(LLPointer<LLCredential> cred)
+{
+ LLSD undefVal;
+ deleteProtectedData("credential", cred->getGrid());
+ cred->setCredentialData(undefVal, undefVal);
+ _writeProtectedData();
+}
+
+// load the legacy hash for agni, and decrypt it given the
+// mac address
+std::string LLSecAPIBasicHandler::_legacyLoadPassword()
+{
+ const S32 HASHED_LENGTH = 32;
+ std::vector<U8> buffer(HASHED_LENGTH);
+ llifstream password_file(mLegacyPasswordPath, llifstream::binary);
+
+ if(password_file.fail())
+ {
+ return std::string("");
+ }
+
+ password_file.read((char*)&buffer[0], buffer.size());
+ if(password_file.gcount() != buffer.size())
+ {
+ return std::string("");
+ }
+
+ // Decipher with MAC address
+ unsigned char unique_id[MAC_ADDRESS_BYTES];
+ LLMachineID::getUniqueID(unique_id, sizeof(unique_id));
+ LLXORCipher cipher(unique_id, sizeof(unique_id));
+ cipher.decrypt(&buffer[0], buffer.size());
+
+ return std::string((const char*)&buffer[0], buffer.size());
+}
+
+
+// return an identifier for the user
+std::string LLSecAPIBasicCredential::userID() const
+{
+ if (!mIdentifier.isMap())
+ {
+ return mGrid + "(null)";
+ }
+ else if ((std::string)mIdentifier["type"] == "agent")
+ {
+ return (std::string)mIdentifier["first_name"] + "_" + (std::string)mIdentifier["last_name"];
+ }
+ else if ((std::string)mIdentifier["type"] == "account")
+ {
+ return (std::string)mIdentifier["account_name"];
+ }
+
+ return "unknown";
+
+}
+
+// return a printable user identifier
+std::string LLSecAPIBasicCredential::asString() const
+{
+ if (!mIdentifier.isMap())
+ {
+ return mGrid + ":(null)";
+ }
+ else if ((std::string)mIdentifier["type"] == "agent")
+ {
+ return mGrid + ":" + (std::string)mIdentifier["first_name"] + " " + (std::string)mIdentifier["last_name"];
+ }
+ else if ((std::string)mIdentifier["type"] == "account")
+ {
+ return mGrid + ":" + (std::string)mIdentifier["account_name"];
+ }
+
+ return mGrid + ":(unknown type)";
+}
+
+
+bool valueCompareLLSD(const LLSD& lhs, const LLSD& rhs)
+{
+ if (lhs.type() != rhs.type())
+ {
+ return FALSE;
+ }
+ if (lhs.isMap())
+ {
+ // iterate through the map, verifying the right hand side has all of the
+ // values that the left hand side has.
+ for (LLSD::map_const_iterator litt = lhs.beginMap();
+ litt != lhs.endMap();
+ litt++)
+ {
+ if (!rhs.has(litt->first))
+ {
+ return FALSE;
+ }
+ }
+
+ // Now validate that the left hand side has everything the
+ // right hand side has, and that the values are equal.
+ for (LLSD::map_const_iterator ritt = rhs.beginMap();
+ ritt != rhs.endMap();
+ ritt++)
+ {
+ if (!lhs.has(ritt->first))
+ {
+ return FALSE;
+ }
+ if (!valueCompareLLSD(lhs[ritt->first], ritt->second))
+ {
+ return FALSE;
+ }
+ }
+ return TRUE;
+ }
+ else if (lhs.isArray())
+ {
+ LLSD::array_const_iterator ritt = rhs.beginArray();
+ // iterate through the array, comparing
+ for (LLSD::array_const_iterator litt = lhs.beginArray();
+ litt != lhs.endArray();
+ litt++)
+ {
+ if (!valueCompareLLSD(*ritt, *litt))
+ {
+ return FALSE;
+ }
+ ritt++;
+ }
+
+ return (ritt == rhs.endArray());
+ }
+ else
+ {
+ // simple type, compare as string
+ return (lhs.asString() == rhs.asString());
+ }
+
+}
diff --git a/indra/newview/llsechandler_basic.h b/indra/newview/llsechandler_basic.h
new file mode 100644
index 0000000000..356ea7efcb
--- /dev/null
+++ b/indra/newview/llsechandler_basic.h
@@ -0,0 +1,296 @@
+/**
+ * @file llsechandler_basic.h
+ * @brief Security API for services such as certificate handling
+ * secure local storage, etc.
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlife.com/developers/opensource/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlife.com/developers/opensource/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LLSECHANDLER_BASIC
+#define LLSECHANDLER_BASIC
+
+#include "llsecapi.h"
+#include <vector>
+#include <openssl/x509.h>
+
+// helpers
+extern LLSD cert_name_from_X509_NAME(X509_NAME* name);
+extern std::string cert_string_name_from_X509_NAME(X509_NAME* name);
+extern std::string cert_string_from_asn1_integer(ASN1_INTEGER* value);
+extern LLDate cert_date_from_asn1_time(ASN1_TIME* asn1_time);
+extern std::string cert_get_digest(const std::string& digest_type, X509 *cert);
+
+
+// class LLCertificate
+//
+class LLBasicCertificate : public LLCertificate
+{
+public:
+ LOG_CLASS(LLBasicCertificate);
+
+ LLBasicCertificate(const std::string& pem_cert);
+ LLBasicCertificate(X509* openSSLX509);
+
+ virtual ~LLBasicCertificate();
+
+ virtual std::string getPem() const;
+ virtual std::vector<U8> getBinary() const;
+ virtual void getLLSD(LLSD &llsd);
+
+ virtual X509* getOpenSSLX509() const;
+
+ // set llsd elements for testing
+ void setLLSD(const std::string name, const LLSD& value) { mLLSDInfo[name] = value; }
+
+protected:
+
+ // certificates are stored as X509 objects, as validation and
+ // other functionality is via openssl
+ X509* mCert;
+
+ LLSD& _initLLSD();
+ LLSD mLLSDInfo;
+};
+
+
+// class LLBasicCertificateVector
+// Class representing a list of certificates
+// This implementation uses a stl vector of certificates.
+class LLBasicCertificateVector : virtual public LLCertificateVector
+{
+
+public:
+ LLBasicCertificateVector() {}
+
+ virtual ~LLBasicCertificateVector() {}
+
+ // Implementation of the basic iterator implementation.
+ // The implementation uses a vector iterator derived from
+ // the vector in the LLBasicCertificateVector class
+ class BasicIteratorImpl : public iterator_impl
+ {
+ public:
+ BasicIteratorImpl(std::vector<LLPointer<LLCertificate> >::iterator _iter) { mIter = _iter;}
+ virtual ~BasicIteratorImpl() {};
+ // seek forward or back. Used by the operator++/operator-- implementations
+ virtual void seek(bool incr)
+ {
+ if(incr)
+ {
+ mIter++;
+ }
+ else
+ {
+ mIter--;
+ }
+ }
+ // create a copy of the iterator implementation class, used by the iterator copy constructor
+ virtual LLPointer<iterator_impl> clone() const
+ {
+ return new BasicIteratorImpl(mIter);
+ }
+
+ virtual bool equals(const LLPointer<iterator_impl>& _iter) const
+ {
+ const BasicIteratorImpl *rhs_iter = dynamic_cast<const BasicIteratorImpl *>(_iter.get());
+ llassert(rhs_iter);
+ if (!rhs_iter) return 0;
+ return (mIter == rhs_iter->mIter);
+ }
+ virtual LLPointer<LLCertificate> get()
+ {
+ return *mIter;
+ }
+ protected:
+ friend class LLBasicCertificateVector;
+ std::vector<LLPointer<LLCertificate> >::iterator mIter;
+ };
+
+ // numeric index of the vector
+ virtual LLPointer<LLCertificate> operator[](int _index) { return mCerts[_index];}
+
+ // Iteration
+ virtual iterator begin() { return iterator(new BasicIteratorImpl(mCerts.begin())); }
+
+ virtual iterator end() { return iterator(new BasicIteratorImpl(mCerts.end())); }
+
+ // find a cert given params
+ virtual iterator find(const LLSD& params);
+
+ // return the number of certs in the store
+ virtual int size() const { return mCerts.size(); }
+
+ // insert the cert to the store. if a copy of the cert already exists in the store, it is removed first
+ virtual void add(LLPointer<LLCertificate> cert) { insert(end(), cert); }
+
+ // insert the cert to the store. if a copy of the cert already exists in the store, it is removed first
+ virtual void insert(iterator _iter, LLPointer<LLCertificate> cert);
+
+ // remove a certificate from the store
+ virtual LLPointer<LLCertificate> erase(iterator _iter);
+
+protected:
+ std::vector<LLPointer<LLCertificate> >mCerts;
+};
+
+// class LLCertificateStore
+// represents a store of certificates, typically a store of root CA
+// certificates. The store can be persisted, and can be used to validate
+// a cert chain
+//
+class LLBasicCertificateStore : virtual public LLBasicCertificateVector, public LLCertificateStore
+{
+public:
+ LLBasicCertificateStore(const std::string& filename);
+ void load_from_file(const std::string& filename);
+
+ virtual ~LLBasicCertificateStore();
+
+ // persist the store
+ virtual void save();
+
+ // return the store id
+ virtual std::string storeId() const;
+
+ // validate a certificate chain against a certificate store, using the
+ // given validation policy.
+ virtual void validate(int validation_policy,
+ LLPointer<LLCertificateChain> ca_chain,
+ const LLSD& validation_params);
+
+protected:
+ std::vector<LLPointer<LLCertificate> > mCerts;
+
+ // cache of cert sha1 hashes to from/to date pairs, to improve
+ // performance of cert trust. Note, these are not the CA certs,
+ // but the certs that have been validated against this store.
+ typedef std::map<std::string, std::pair<LLDate, LLDate> > t_cert_cache;
+ t_cert_cache mTrustedCertCache;
+
+ std::string mFilename;
+};
+
+// class LLCertificateChain
+// Class representing a chain of certificates in order, with the
+// first element being the child cert.
+class LLBasicCertificateChain : virtual public LLBasicCertificateVector, public LLCertificateChain
+{
+
+public:
+ LLBasicCertificateChain(const X509_STORE_CTX * store);
+
+ virtual ~LLBasicCertificateChain() {}
+
+};
+
+
+
+// LLSecAPIBasicCredential class
+class LLSecAPIBasicCredential : public LLCredential
+{
+public:
+ LLSecAPIBasicCredential(const std::string& grid) : LLCredential(grid) {}
+ virtual ~LLSecAPIBasicCredential() {}
+ // return a value representing the user id, (could be guid, name, whatever)
+ virtual std::string userID() const;
+
+ // printible string identifying the credential.
+ virtual std::string asString() const;
+};
+
+// LLSecAPIBasicHandler Class
+// Interface handler class for the various security storage handlers.
+class LLSecAPIBasicHandler : public LLSecAPIHandler
+{
+public:
+
+ LLSecAPIBasicHandler(const std::string& protected_data_filename,
+ const std::string& legacy_password_path);
+ LLSecAPIBasicHandler();
+
+ void init();
+
+ virtual ~LLSecAPIBasicHandler();
+
+ // instantiate a certificate from a pem string
+ virtual LLPointer<LLCertificate> getCertificate(const std::string& pem_cert);
+
+
+ // instiate a certificate from an openssl X509 structure
+ virtual LLPointer<LLCertificate> getCertificate(X509* openssl_cert);
+
+ // instantiate a chain from an X509_STORE_CTX
+ virtual LLPointer<LLCertificateChain> getCertificateChain(const X509_STORE_CTX* chain);
+
+ // instantiate a cert store given it's id. if a persisted version
+ // exists, it'll be loaded. If not, one will be created (but not
+ // persisted)
+ virtual LLPointer<LLCertificateStore> getCertificateStore(const std::string& store_id);
+
+ // persist data in a protected store
+ virtual void setProtectedData(const std::string& data_type,
+ const std::string& data_id,
+ const LLSD& data);
+
+ // retrieve protected data
+ virtual LLSD getProtectedData(const std::string& data_type,
+ const std::string& data_id);
+
+ // delete a protected data item from the store
+ virtual void deleteProtectedData(const std::string& data_type,
+ const std::string& data_id);
+
+ // credential management routines
+
+ virtual LLPointer<LLCredential> createCredential(const std::string& grid,
+ const LLSD& identifier,
+ const LLSD& authenticator);
+
+ virtual LLPointer<LLCredential> loadCredential(const std::string& grid);
+
+ virtual void saveCredential(LLPointer<LLCredential> cred, bool save_authenticator);
+
+ virtual void deleteCredential(LLPointer<LLCredential> cred);
+
+protected:
+ void _readProtectedData();
+ void _writeProtectedData();
+ std::string _legacyLoadPassword();
+
+ std::string mProtectedDataFilename;
+ LLSD mProtectedDataMap;
+ LLPointer<LLBasicCertificateStore> mStore;
+
+ std::string mLegacyPasswordPath;
+};
+
+bool valueCompareLLSD(const LLSD& lhs, const LLSD& rhs);
+
+#endif // LLSECHANDLER_BASIC
+
+
+
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 9540894646..af16b962e6 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -56,6 +56,7 @@
// viewer includes
#include "llagent.h"
+#include "llagentcamera.h"
#include "llviewerwindow.h"
#include "lldrawable.h"
#include "llfloaterinspect.h"
@@ -1474,7 +1475,7 @@ void LLSelectMgr::selectionSetImage(const LLUUID& imageid)
object->sendTEUpdate();
// 1 particle effect per object
LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
- effectp->setSourceObject(gAgent.getAvatarObject());
+ effectp->setSourceObject(gAgentAvatarp);
effectp->setTargetObject(object);
effectp->setDuration(LL_HUD_DUR_SHORT);
effectp->setColor(LLColor4U(gAgent.getEffectColor()));
@@ -2434,7 +2435,7 @@ BOOL LLSelectMgr::selectGetCreator(LLUUID& result_id, std::string& name)
if (identical)
{
- name = LLSLURL::buildCommand("agent", first_id, "inspect");
+ name = LLSLURL("agent", first_id, "inspect").getSLURLString();
}
else
{
@@ -2493,11 +2494,11 @@ BOOL LLSelectMgr::selectGetOwner(LLUUID& result_id, std::string& name)
BOOL public_owner = (first_id.isNull() && !first_group_owned);
if (first_group_owned)
{
- name = LLSLURL::buildCommand("group", first_id, "inspect");
+ name = LLSLURL("group", first_id, "inspect").getSLURLString();
}
else if(!public_owner)
{
- name = LLSLURL::buildCommand("agent", first_id, "inspect");
+ name = LLSLURL("agent", first_id, "inspect").getSLURLString();
}
else
{
@@ -2557,7 +2558,7 @@ BOOL LLSelectMgr::selectGetLastOwner(LLUUID& result_id, std::string& name)
BOOL public_owner = (first_id.isNull());
if(!public_owner)
{
- name = LLSLURL::buildCommand("agent", first_id, "inspect");
+ name = LLSLURL("agent", first_id, "inspect").getSLURLString();
}
else
{
@@ -2872,7 +2873,7 @@ bool LLSelectMgr::confirmDelete(const LLSD& notification, const LLSD& response,
effectp->setDuration(duration);
}
- gAgent.setLookAt(LOOKAT_TARGET_CLEAR);
+ gAgentCamera.setLookAt(LOOKAT_TARGET_CLEAR);
// Keep track of how many objects have been deleted.
F64 obj_delete_count = LLViewerStats::getInstance()->getStat(LLViewerStats::ST_OBJECT_DELETE_COUNT);
@@ -3618,19 +3619,19 @@ void LLSelectMgr::sendAttach(U8 attachment_point)
{
LLViewerObject* attach_object = mSelectedObjects->getFirstRootObject();
- if (!attach_object || !gAgent.getAvatarObject() || mSelectedObjects->mSelectType != SELECT_TYPE_WORLD)
+ if (!attach_object || !isAgentAvatarValid() || mSelectedObjects->mSelectType != SELECT_TYPE_WORLD)
{
return;
}
-#if ENABLE_MULTIATTACHMENTS
- attachment_point |= ATTACHMENT_ADD;
-#endif
BOOL build_mode = LLToolMgr::getInstance()->inEdit();
// Special case: Attach to default location for this object.
if (0 == attachment_point ||
- get_if_there(gAgent.getAvatarObject()->mAttachmentPoints, (S32)attachment_point, (LLViewerJointAttachment*)NULL))
+ get_if_there(gAgentAvatarp->mAttachmentPoints, (S32)attachment_point, (LLViewerJointAttachment*)NULL))
{
+#if ENABLE_MULTIATTACHMENTS
+ attachment_point |= ATTACHMENT_ADD;
+#endif
sendListToRegions(
"ObjectAttach",
packAgentIDAndSessionAndAttachment,
@@ -4391,7 +4392,7 @@ void LLSelectMgr::processObjectProperties(LLMessageSystem* msg, void** user_data
msg->getStringFast(_PREHASH_ObjectData, _PREHASH_SitName, sit_name, i);
//unpack TE IDs
- std::vector<LLUUID> texture_ids;
+ uuid_vec_t texture_ids;
S32 size = msg->getSizeFast(_PREHASH_ObjectData, i, _PREHASH_TextureID);
if (size > 0)
{
@@ -4626,8 +4627,8 @@ void LLSelectMgr::updateSilhouettes()
{
S32 num_sils_genned = 0;
- LLVector3d cameraPos = gAgent.getCameraPositionGlobal();
- F32 currentCameraZoom = gAgent.getCurrentCameraBuildOffset();
+ LLVector3d cameraPos = gAgentCamera.getCameraPositionGlobal();
+ F32 currentCameraZoom = gAgentCamera.getCurrentCameraBuildOffset();
if (!mSilhouetteImagep)
{
@@ -4648,7 +4649,7 @@ void LLSelectMgr::updateSilhouettes()
} func;
getSelection()->applyToObjects(&func);
- mLastCameraPos = gAgent.getCameraPositionGlobal();
+ mLastCameraPos = gAgentCamera.getCameraPositionGlobal();
}
std::vector<LLViewerObject*> changed_objects;
@@ -4910,22 +4911,23 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
LLGLEnable blend(GL_BLEND);
LLGLDepthTest gls_depth(GL_TRUE, GL_FALSE);
- LLVOAvatar* avatar = gAgent.getAvatarObject();
- if (for_hud && avatar)
+ if (isAgentAvatarValid() && for_hud)
{
- LLBBox hud_bbox = avatar->getHUDBBox();
+ LLBBox hud_bbox = gAgentAvatarp->getHUDBBox();
- F32 cur_zoom = gAgent.mHUDCurZoom;
+ F32 cur_zoom = gAgentCamera.mHUDCurZoom;
// set up transform to encompass bounding box of HUD
glMatrixMode(GL_PROJECTION);
- glPushMatrix();
+ gGL.pushMatrix();
glLoadIdentity();
F32 depth = llmax(1.f, hud_bbox.getExtentLocal().mV[VX] * 1.1f);
glOrtho(-0.5f * LLViewerCamera::getInstance()->getAspect(), 0.5f * LLViewerCamera::getInstance()->getAspect(), -0.5f, 0.5f, 0.f, depth);
glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
+ gGL.pushMatrix();
+ gGL.pushUIMatrix();
+ gGL.loadUIIdentity();
glLoadIdentity();
glLoadMatrixf(OGL_TO_CFR_ROTATION); // Load Cory's favorite reference frame
glTranslatef(-hud_bbox.getCenterLocal().mV[VX] + (depth *0.5f), 0.f, 0.f);
@@ -4934,17 +4936,18 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
if (mSelectedObjects->getNumNodes())
{
LLUUID inspect_item_id= LLUUID::null;
-#if 0
LLFloaterInspect* inspect_instance = LLFloaterReg::getTypedInstance<LLFloaterInspect>("inspect");
- if(inspect_instance)
+ if(inspect_instance && inspect_instance->getVisible())
{
inspect_item_id = inspect_instance->getSelectedUUID();
}
-#endif
- LLSidepanelTaskInfo *panel_task_info = LLSidepanelTaskInfo::getActivePanel();
- if (panel_task_info)
+ else
{
- inspect_item_id = panel_task_info->getSelectedUUID();
+ LLSidepanelTaskInfo *panel_task_info = LLSidepanelTaskInfo::getActivePanel();
+ if (panel_task_info)
+ {
+ inspect_item_id = panel_task_info->getSelectedUUID();
+ }
}
LLUUID focus_item_id = LLViewerMediaFocus::getInstance()->getFocusedObjectID();
@@ -5019,13 +5022,14 @@ void LLSelectMgr::renderSilhouettes(BOOL for_hud)
}
}
- if (for_hud && avatar)
+ if (isAgentAvatarValid() && for_hud)
{
glMatrixMode(GL_PROJECTION);
- glPopMatrix();
+ gGL.popMatrix();
glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
+ gGL.popMatrix();
+ gGL.popUIMatrix();
stop_glerror();
}
@@ -5203,13 +5207,13 @@ void LLSelectNode::saveColors()
}
}
-void LLSelectNode::saveTextures(const std::vector<LLUUID>& textures)
+void LLSelectNode::saveTextures(const uuid_vec_t& textures)
{
if (mObject.notNull())
{
mSavedTextures.clear();
- for (std::vector<LLUUID>::const_iterator texture_it = textures.begin();
+ for (uuid_vec_t::const_iterator texture_it = textures.begin();
texture_it != textures.end(); ++texture_it)
{
mSavedTextures.push_back(*texture_it);
@@ -5374,7 +5378,10 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
}
glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
+ gGL.pushMatrix();
+ gGL.pushUIMatrix();
+ gGL.loadUIIdentity();
+
if (!is_hud_object)
{
glLoadIdentity();
@@ -5391,9 +5398,9 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
if (volume)
{
F32 silhouette_thickness;
- if (is_hud_object && gAgent.getAvatarObject())
+ if (isAgentAvatarValid() && is_hud_object)
{
- silhouette_thickness = LLSelectMgr::sHighlightThickness / gAgent.mHUDCurZoom;
+ silhouette_thickness = LLSelectMgr::sHighlightThickness / gAgentCamera.mHUDCurZoom;
}
else
{
@@ -5413,7 +5420,7 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
LLGLEnable fog(GL_FOG);
glFogi(GL_FOG_MODE, GL_LINEAR);
float d = (LLViewerCamera::getInstance()->getPointOfInterest()-LLViewerCamera::getInstance()->getOrigin()).magVec();
- LLColor4 fogCol = color * (F32)llclamp((LLSelectMgr::getInstance()->getSelectionCenterGlobal()-gAgent.getCameraPositionGlobal()).magVec()/(LLSelectMgr::getInstance()->getBBoxOfSelection().getExtentLocal().magVec()*4), 0.0, 1.0);
+ LLColor4 fogCol = color * (F32)llclamp((LLSelectMgr::getInstance()->getSelectionCenterGlobal()-gAgentCamera.getCameraPositionGlobal()).magVec()/(LLSelectMgr::getInstance()->getBBoxOfSelection().getExtentLocal().magVec()*4), 0.0, 1.0);
glFogf(GL_FOG_START, d);
glFogf(GL_FOG_END, d*(1 + (LLViewerCamera::getInstance()->getView() / LLViewerCamera::getInstance()->getDefaultFOV())));
glFogfv(GL_FOG_COLOR, fogCol.mV);
@@ -5493,7 +5500,8 @@ void LLSelectNode::renderOneSilhouette(const LLColor4 &color)
gGL.end();
gGL.flush();
}
- glPopMatrix();
+ gGL.popMatrix();
+ gGL.popUIMatrix();
}
//
@@ -5527,13 +5535,12 @@ void dialog_refresh_all()
LLFloaterProperties::dirtyAll();
-#if 0
LLFloaterInspect* inspect_instance = LLFloaterReg::getTypedInstance<LLFloaterInspect>("inspect");
if(inspect_instance)
{
inspect_instance->dirty();
}
-#endif
+
LLSidepanelTaskInfo *panel_task_info = LLSidepanelTaskInfo::getActivePanel();
if (panel_task_info)
{
@@ -5601,20 +5608,20 @@ void LLSelectMgr::updateSelectionCenter()
{
mSelectedObjects->mSelectType = getSelectTypeForObject(object);
- if (mSelectedObjects->mSelectType == SELECT_TYPE_ATTACHMENT && gAgent.getAvatarObject())
+ if (mSelectedObjects->mSelectType == SELECT_TYPE_ATTACHMENT && isAgentAvatarValid())
{
- mPauseRequest = gAgent.getAvatarObject()->requestPause();
+ mPauseRequest = gAgentAvatarp->requestPause();
}
else
{
mPauseRequest = NULL;
}
- if (mSelectedObjects->mSelectType != SELECT_TYPE_HUD && gAgent.getAvatarObject())
+ if (mSelectedObjects->mSelectType != SELECT_TYPE_HUD && isAgentAvatarValid())
{
// reset hud ZOOM
- gAgent.mHUDTargetZoom = 1.f;
- gAgent.mHUDCurZoom = 1.f;
+ gAgentCamera.mHUDTargetZoom = 1.f;
+ gAgentCamera.mHUDCurZoom = 1.f;
}
mShowSelection = FALSE;
@@ -5633,10 +5640,10 @@ void LLSelectMgr::updateSelectionCenter()
LLViewerObject* object = node->getObject();
if (!object)
continue;
- LLViewerObject *myAvatar = gAgent.getAvatarObject();
+
LLViewerObject *root = object->getRootEdit();
if (mSelectedObjects->mSelectType == SELECT_TYPE_WORLD && // not an attachment
- !root->isChild(myAvatar) && // not the object you're sitting on
+ !root->isChild(gAgentAvatarp) && // not the object you're sitting on
!object->isAvatar()) // not another avatar
{
mShowSelection = TRUE;
@@ -5706,26 +5713,26 @@ void LLSelectMgr::updatePointAt()
select_offset.setVec(pick.mObjectOffset);
select_offset.rotVec(~click_object->getRenderRotation());
- gAgent.setPointAt(POINTAT_TARGET_SELECT, click_object, select_offset);
- gAgent.setLookAt(LOOKAT_TARGET_SELECT, click_object, select_offset);
+ gAgentCamera.setPointAt(POINTAT_TARGET_SELECT, click_object, select_offset);
+ gAgentCamera.setLookAt(LOOKAT_TARGET_SELECT, click_object, select_offset);
}
else
{
// didn't click on an object this time, revert to pointing at center of first object
- gAgent.setPointAt(POINTAT_TARGET_SELECT, mSelectedObjects->getFirstObject());
- gAgent.setLookAt(LOOKAT_TARGET_SELECT, mSelectedObjects->getFirstObject());
+ gAgentCamera.setPointAt(POINTAT_TARGET_SELECT, mSelectedObjects->getFirstObject());
+ gAgentCamera.setLookAt(LOOKAT_TARGET_SELECT, mSelectedObjects->getFirstObject());
}
}
else
{
- gAgent.setPointAt(POINTAT_TARGET_CLEAR);
- gAgent.setLookAt(LOOKAT_TARGET_CLEAR);
+ gAgentCamera.setPointAt(POINTAT_TARGET_CLEAR);
+ gAgentCamera.setLookAt(LOOKAT_TARGET_CLEAR);
}
}
else
{
- gAgent.setPointAt(POINTAT_TARGET_CLEAR);
- gAgent.setLookAt(LOOKAT_TARGET_CLEAR);
+ gAgentCamera.setPointAt(POINTAT_TARGET_CLEAR);
+ gAgentCamera.setLookAt(LOOKAT_TARGET_CLEAR);
}
}
@@ -5915,20 +5922,20 @@ BOOL LLSelectMgr::setForceSelection(BOOL force)
void LLSelectMgr::resetAgentHUDZoom()
{
- gAgent.mHUDTargetZoom = 1.f;
- gAgent.mHUDCurZoom = 1.f;
+ gAgentCamera.mHUDTargetZoom = 1.f;
+ gAgentCamera.mHUDCurZoom = 1.f;
}
void LLSelectMgr::getAgentHUDZoom(F32 &target_zoom, F32 &current_zoom) const
{
- target_zoom = gAgent.mHUDTargetZoom;
- current_zoom = gAgent.mHUDCurZoom;
+ target_zoom = gAgentCamera.mHUDTargetZoom;
+ current_zoom = gAgentCamera.mHUDCurZoom;
}
void LLSelectMgr::setAgentHUDZoom(F32 target_zoom, F32 current_zoom)
{
- gAgent.mHUDTargetZoom = target_zoom;
- gAgent.mHUDCurZoom = current_zoom;
+ gAgentCamera.mHUDTargetZoom = target_zoom;
+ gAgentCamera.mHUDCurZoom = current_zoom;
}
/////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llselectmgr.h b/indra/newview/llselectmgr.h
index 00474827ca..668c04cf15 100644
--- a/indra/newview/llselectmgr.h
+++ b/indra/newview/llselectmgr.h
@@ -147,7 +147,7 @@ public:
void setObject(LLViewerObject* object);
// *NOTE: invalidate stored textures and colors when # faces change
void saveColors();
- void saveTextures(const std::vector<LLUUID>& textures);
+ void saveTextures(const uuid_vec_t& textures);
void saveTextureScaleRatios();
BOOL allowOperationOnNode(PermissionBit op, U64 group_proxy_power) const;
@@ -183,7 +183,7 @@ public:
std::string mSitName;
U64 mCreationDate;
std::vector<LLColor4> mSavedColors;
- std::vector<LLUUID> mSavedTextures;
+ uuid_vec_t mSavedTextures;
std::vector<LLVector3> mTextureScaleRatios;
std::vector<LLVector3> mSilhouetteVertices; // array of vertices to render silhouette of object
std::vector<LLVector3> mSilhouetteNormals; // array of normals to render silhouette of object
@@ -257,7 +257,6 @@ public:
LLObjectSelection();
void updateEffects();
- void cleanupNodes();
BOOL isEmpty() const;
@@ -281,11 +280,6 @@ public:
template <typename T> bool getSelectedTEValue(LLSelectedTEGetFunctor<T>* func, T& res);
template <typename T> bool isMultipleTEValue(LLSelectedTEGetFunctor<T>* func, const T& ignore_value);
- void addNode(LLSelectNode *nodep);
- void addNodeAtEnd(LLSelectNode *nodep);
- void moveNodeToFront(LLSelectNode *nodep);
- void removeNode(LLSelectNode *nodep);
- void deleteAllNodes(); // Delete all nodes
S32 getNumNodes();
LLSelectNode* findNode(LLViewerObject* objectp);
@@ -313,6 +307,15 @@ public:
ESelectType getSelectType() const { return mSelectType; }
private:
+ void addNode(LLSelectNode *nodep);
+ void addNodeAtEnd(LLSelectNode *nodep);
+ void moveNodeToFront(LLSelectNode *nodep);
+ void removeNode(LLSelectNode *nodep);
+ void deleteAllNodes();
+ void cleanupNodes();
+
+
+private:
list_t mList;
const LLObjectSelection &operator=(const LLObjectSelection &);
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index 43215f86bd..0d1be91125 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -34,6 +34,7 @@
#include "llaccordionctrltab.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llagentwearables.h"
#include "llappearancemgr.h"
#include "llinventorypanel.h"
@@ -41,20 +42,25 @@
#include "llfloaterreg.h"
#include "llfloaterworldmap.h"
#include "llfoldervieweventlistener.h"
+#include "lloutfitobserver.h"
#include "llpaneleditwearable.h"
#include "llpaneloutfitsinventory.h"
+#include "llsidetray.h"
#include "lltextbox.h"
#include "lluictrlfactory.h"
+#include "llviewercontrol.h"
#include "llviewerregion.h"
#include "llvoavatarself.h"
#include "llwearable.h"
static LLRegisterPanelClassWrapper<LLSidepanelAppearance> t_appearance("sidepanel_appearance");
-class LLCurrentlyWornFetchObserver : public LLInventoryFetchObserver
+class LLCurrentlyWornFetchObserver : public LLInventoryFetchItemsObserver
{
public:
- LLCurrentlyWornFetchObserver(LLSidepanelAppearance *panel) :
+ LLCurrentlyWornFetchObserver(const uuid_vec_t &ids,
+ LLSidepanelAppearance *panel) :
+ LLInventoryFetchItemsObserver(ids),
mPanel(panel)
{}
~LLCurrentlyWornFetchObserver() {}
@@ -68,39 +74,25 @@ private:
LLSidepanelAppearance *mPanel;
};
-class LLWatchForOutfitRenameObserver : public LLInventoryObserver
-{
-public:
- LLWatchForOutfitRenameObserver(LLSidepanelAppearance *panel) :
- mPanel(panel)
- {}
- virtual void changed(U32 mask);
-
-private:
- LLSidepanelAppearance *mPanel;
-};
-
-void LLWatchForOutfitRenameObserver::changed(U32 mask)
-{
- if (mask & LABEL)
- {
- mPanel->refreshCurrentOutfitName();
- }
-}
-
LLSidepanelAppearance::LLSidepanelAppearance() :
LLPanel(),
mFilterSubString(LLStringUtil::null),
mFilterEditor(NULL),
- mLookInfo(NULL),
- mCurrOutfitPanel(NULL)
+ mOutfitEdit(NULL),
+ mCurrOutfitPanel(NULL),
+ mOpened(false)
{
+ LLOutfitObserver& outfit_observer = LLOutfitObserver::instance();
+ outfit_observer.addBOFReplacedCallback(boost::bind(&LLSidepanelAppearance::refreshCurrentOutfitName, this, ""));
+ outfit_observer.addBOFChangedCallback(boost::bind(&LLSidepanelAppearance::refreshCurrentOutfitName, this, ""));
+ outfit_observer.addCOFChangedCallback(boost::bind(&LLSidepanelAppearance::refreshCurrentOutfitName, this, ""));
+
+ gAgentWearables.addLoadingStartedCallback(boost::bind(&LLSidepanelAppearance::setWearablesLoading, this, true));
+ gAgentWearables.addLoadedCallback(boost::bind(&LLSidepanelAppearance::setWearablesLoading, this, false));
}
LLSidepanelAppearance::~LLSidepanelAppearance()
{
- gInventory.removeObserver(mOutfitRenameWatcher);
- delete mOutfitRenameWatcher;
}
// virtual
@@ -112,8 +104,7 @@ BOOL LLSidepanelAppearance::postBuild()
mEditAppearanceBtn = getChild<LLButton>("editappearance_btn");
mEditAppearanceBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onEditAppearanceButtonClicked, this));
- mEditBtn = getChild<LLButton>("edit_btn");
- mEditBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onEditButtonClicked, this));
+ childSetAction("edit_outfit_btn", boost::bind(&LLSidepanelAppearance::showOutfitEditPanel, this));
mNewOutfitBtn = getChild<LLButton>("newlook_btn");
mNewOutfitBtn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onNewOutfitButtonClicked, this));
@@ -126,15 +117,14 @@ BOOL LLSidepanelAppearance::postBuild()
}
mPanelOutfitsInventory = dynamic_cast<LLPanelOutfitsInventory *>(getChild<LLPanel>("panel_outfits_inventory"));
- mPanelOutfitsInventory->setParent(this);
- mLookInfo = dynamic_cast<LLPanelLookInfo*>(getChild<LLPanel>("panel_look_info"));
- if (mLookInfo)
+ mOutfitEdit = dynamic_cast<LLPanelOutfitEdit*>(getChild<LLPanel>("panel_outfit_edit"));
+ if (mOutfitEdit)
{
- LLButton* back_btn = mLookInfo->getChild<LLButton>("back_btn");
+ LLButton* back_btn = mOutfitEdit->getChild<LLButton>("back_btn");
if (back_btn)
{
- back_btn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onBackButtonClicked, this));
+ back_btn->setClickedCallback(boost::bind(&LLSidepanelAppearance::showOutfitsInventoryPanel, this));
}
}
@@ -145,18 +135,18 @@ BOOL LLSidepanelAppearance::postBuild()
LLButton* edit_wearable_back_btn = mEditWearable->getChild<LLButton>("back_btn");
if (edit_wearable_back_btn)
{
- edit_wearable_back_btn->setClickedCallback(boost::bind(&LLSidepanelAppearance::onEditWearBackClicked, this));
+ edit_wearable_back_btn->setClickedCallback(boost::bind(&LLSidepanelAppearance::showOutfitEditPanel, this));
}
}
mCurrentLookName = getChild<LLTextBox>("currentlook_name");
- mOutfitDirtyTag = getChild<LLTextBox>("currentlook_title");
+ mOutfitStatus = getChild<LLTextBox>("currentlook_status");
mCurrOutfitPanel = getChild<LLPanel>("panel_currentlook");
- mOutfitRenameWatcher = new LLWatchForOutfitRenameObserver(this);
- gInventory.addObserver(mOutfitRenameWatcher);
+
+ setVisibleCallback(boost::bind(&LLSidepanelAppearance::onVisibilityChange,this,_2));
return TRUE;
}
@@ -164,28 +154,57 @@ BOOL LLSidepanelAppearance::postBuild()
// virtual
void LLSidepanelAppearance::onOpen(const LLSD& key)
{
- fetchInventory();
- refreshCurrentOutfitName();
- updateVerbs();
-
- if (mPanelOutfitsInventory)
+ if (!key.has("type"))
{
- mPanelOutfitsInventory->onOpen(key);
+ // No specific panel requested.
+ // If we're opened for the first time then show My Outfits.
+ // Else do nothing.
+ if (!mOpened)
+ {
+ showOutfitsInventoryPanel();
+ }
+ }
+ else
+ {
+ // Switch to the requested panel.
+ // *TODO: replace this crap with LLSideTrayPanelContainer
+ std::string type = key["type"].asString();
+ if (type == "my_outfits")
+ {
+ showOutfitsInventoryPanel();
+ }
+ else if (type == "edit_outfit")
+ {
+ showOutfitEditPanel();
+ }
+ else if (type == "edit_shape")
+ {
+ showWearableEditPanel();
+ }
}
- if(key.size() == 0)
- return;
-
- toggleLookInfoPanel(TRUE);
- updateVerbs();
-
- mLookInfoType = key["type"].asString();
+ mOpened = true;
+}
- if (mLookInfoType == "look")
+void LLSidepanelAppearance::onVisibilityChange(const LLSD &new_visibility)
+{
+ if (new_visibility.asBoolean())
{
- LLInventoryCategory *pLook = gInventory.getCategory(key["id"].asUUID());
- if (pLook)
- mLookInfo->displayLookInfo(pLook);
+ if ((mOutfitEdit && mOutfitEdit->getVisible()) || (mEditWearable && mEditWearable->getVisible()))
+ {
+ if (!gAgentCamera.cameraCustomizeAvatar() && gSavedSettings.getBOOL("AppearanceCameraMovement"))
+ {
+ gAgentCamera.changeCameraToCustomizeAvatar();
+ }
+ }
+ }
+ else
+ {
+ if (gAgentCamera.cameraCustomizeAvatar() && gSavedSettings.getBOOL("AppearanceCameraMovement"))
+ {
+ gAgentCamera.changeCameraToDefault();
+ gAgentCamera.resetView();
+ }
}
}
@@ -196,8 +215,7 @@ void LLSidepanelAppearance::onFilterEdit(const std::string& search_string)
mFilterSubString = search_string;
// Searches are case-insensitive
- LLStringUtil::toUpper(mFilterSubString);
- LLStringUtil::trimHead(mFilterSubString);
+ // but we don't convert the typed string to upper-case so that it can be fed to the web search as-is.
mPanelOutfitsInventory->onSearchEdit(mFilterSubString);
}
@@ -205,7 +223,7 @@ void LLSidepanelAppearance::onFilterEdit(const std::string& search_string)
void LLSidepanelAppearance::onOpenOutfitButtonClicked()
{
- const LLViewerInventoryItem *outfit_link = LLAppearanceManager::getInstance()->getBaseOutfitLink();
+ const LLViewerInventoryItem *outfit_link = LLAppearanceMgr::getInstance()->getBaseOutfitLink();
if (!outfit_link)
return;
if (!outfit_link->getIsLinkType())
@@ -218,116 +236,162 @@ void LLSidepanelAppearance::onOpenOutfitButtonClicked()
LLInventoryPanel *inventory_panel = tab_outfits->findChild<LLInventoryPanel>("outfitslist_tab");
if (inventory_panel)
{
- LLFolderView *folder = inventory_panel->getRootFolder();
- LLFolderViewItem *outfit_folder = folder->getItemByID(outfit_link->getLinkedUUID());
+ LLFolderView* root = inventory_panel->getRootFolder();
+ LLFolderViewItem *outfit_folder = root->getItemByID(outfit_link->getLinkedUUID());
if (outfit_folder)
{
outfit_folder->setOpen(!outfit_folder->isOpen());
- folder->setSelectionFromRoot(outfit_folder,TRUE);
- folder->scrollToShowSelection();
+ root->setSelectionFromRoot(outfit_folder,TRUE);
+ root->scrollToShowSelection();
}
}
}
}
+// *TODO: obsolete?
void LLSidepanelAppearance::onEditAppearanceButtonClicked()
{
if (gAgentWearables.areWearablesLoaded())
{
- gAgent.changeCameraToCustomizeAvatar();
+ gAgentCamera.changeCameraToCustomizeAvatar();
}
}
-void LLSidepanelAppearance::onEditButtonClicked()
-{
- toggleLookInfoPanel(FALSE);
- toggleWearableEditPanel(TRUE, NULL);
- /*if (mLookInfo->getVisible())
- {
- }
- else
- {
- mPanelOutfitsInventory->onEdit();
- }*/
-}
-
void LLSidepanelAppearance::onNewOutfitButtonClicked()
{
- if (!mLookInfo->getVisible())
+ if (!mOutfitEdit->getVisible())
{
mPanelOutfitsInventory->onSave();
}
}
+void LLSidepanelAppearance::showOutfitsInventoryPanel()
+{
+ toggleWearableEditPanel(FALSE);
+ toggleOutfitEditPanel(FALSE);
+ togglMyOutfitsPanel(TRUE);
+}
-void LLSidepanelAppearance::onBackButtonClicked()
+void LLSidepanelAppearance::showOutfitEditPanel()
{
- toggleLookInfoPanel(FALSE);
+ togglMyOutfitsPanel(FALSE);
+ toggleWearableEditPanel(FALSE, NULL, TRUE); // don't switch out of edit appearance mode
+ toggleOutfitEditPanel(TRUE);
}
-void LLSidepanelAppearance::onEditWearBackClicked()
+void LLSidepanelAppearance::showWearableEditPanel(LLWearable *wearable /* = NULL*/)
{
- mEditWearable->saveChanges();
- toggleWearableEditPanel(FALSE, NULL);
- toggleLookInfoPanel(TRUE);
+ togglMyOutfitsPanel(FALSE);
+ toggleOutfitEditPanel(FALSE, TRUE); // don't switch out of edit appearance mode
+ toggleWearableEditPanel(TRUE, wearable);
}
-void LLSidepanelAppearance::toggleLookInfoPanel(BOOL visible)
+void LLSidepanelAppearance::togglMyOutfitsPanel(BOOL visible)
{
- if (!mLookInfo)
+ if (!mPanelOutfitsInventory || mPanelOutfitsInventory->getVisible() == visible)
+ {
+ // visibility isn't changing, hence nothing to do
return;
+ }
+
+ mPanelOutfitsInventory->setVisible(visible);
- mLookInfo->setVisible(visible);
- mPanelOutfitsInventory->setVisible(!visible);
- mFilterEditor->setVisible(!visible);
- mEditBtn->setVisible(!visible);
- mNewOutfitBtn->setVisible(!visible);
- mCurrOutfitPanel->setVisible(!visible);
+ // *TODO: Move these controls to panel_outfits_inventory.xml
+ // so that we don't need to toggle them explicitly.
+ mFilterEditor->setVisible(visible);
+ mNewOutfitBtn->setVisible(visible);
+ mCurrOutfitPanel->setVisible(visible);
+
+ if (visible)
+ {
+ mPanelOutfitsInventory->onOpen(LLSD());
+ }
}
-void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *wearable)
+void LLSidepanelAppearance::toggleOutfitEditPanel(BOOL visible, BOOL disable_camera_switch)
{
+ if (!mOutfitEdit || mOutfitEdit->getVisible() == visible)
+ {
+ // visibility isn't changing, hence nothing to do
+ return;
+ }
+
+ mOutfitEdit->setVisible(visible);
+
+ if (visible)
+ {
+ mOutfitEdit->onOpen(LLSD());
+ if (!disable_camera_switch && gSavedSettings.getBOOL("AppearanceCameraMovement") )
+ {
+ gAgentCamera.changeCameraToCustomizeAvatar();
+ }
+ }
+ else if (!disable_camera_switch && gSavedSettings.getBOOL("AppearanceCameraMovement") )
+ {
+ gAgentCamera.changeCameraToDefault();
+ gAgentCamera.resetView();
+ }
+}
+
+void LLSidepanelAppearance::toggleWearableEditPanel(BOOL visible, LLWearable *wearable, BOOL disable_camera_switch)
+{
+ if (!mEditWearable || mEditWearable->getVisible() == visible)
+ {
+ // visibility isn't changing, hence nothing to do
+ return;
+ }
+
if (!wearable)
{
- wearable = gAgentWearables.getWearable(WT_SHAPE, 0);
+ wearable = gAgentWearables.getWearable(LLWearableType::WT_SHAPE, 0);
}
- if (!mEditWearable || !wearable)
+ if (!wearable)
{
return;
}
+ // Toggle panel visibility.
mEditWearable->setVisible(visible);
- mFilterEditor->setVisible(!visible);
- mPanelOutfitsInventory->setVisible(!visible);
-}
-
-void LLSidepanelAppearance::updateVerbs()
-{
- bool is_look_info_visible = mLookInfo->getVisible();
- if (!is_look_info_visible)
+ if (visible)
{
- const bool is_correct_type = (mPanelOutfitsInventory->getCorrectListenerForAction() != NULL);
- mEditBtn->setEnabled(is_correct_type);
+ if (!disable_camera_switch && gSavedSettings.getBOOL("AppearanceCameraMovement") )
+ {
+ gAgentCamera.changeCameraToCustomizeAvatar();
+ }
+ mEditWearable->setWearable(wearable);
+ mEditWearable->onOpen(LLSD()); // currently no-op, just for consistency
}
else
{
- mEditBtn->setEnabled(FALSE);
+ // Save changes if closing.
+ mEditWearable->saveChanges();
+ if (!disable_camera_switch && gSavedSettings.getBOOL("AppearanceCameraMovement") )
+ {
+ gAgentCamera.changeCameraToDefault();
+ gAgentCamera.resetView();
+ }
}
}
void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string& name)
{
- mOutfitDirtyTag->setVisible(LLAppearanceManager::getInstance()->isOutfitDirty());
+ // Set current outfit status (wearing/unsaved).
+ bool dirty = LLAppearanceMgr::getInstance()->isOutfitDirty();
+ std::string cof_status_str = getString(dirty ? "Unsaved Changes" : "Now Wearing");
+ mOutfitStatus->setText(cof_status_str);
+
if (name == "")
{
std::string outfit_name;
- if (LLAppearanceManager::getInstance()->getBaseOutfitName(outfit_name))
+ if (LLAppearanceMgr::getInstance()->getBaseOutfitName(outfit_name))
{
mCurrentLookName->setText(outfit_name);
return;
}
- mCurrentLookName->setText(getString("No Outfit"));
+
+ std::string look_name = gAgentWearables.isCOFChangeInProgress() ? "" : getString("No Outfit");
+ mCurrentLookName->setText(look_name);
mOpenOutfitBtn->setEnabled(FALSE);
}
else
@@ -339,11 +403,13 @@ void LLSidepanelAppearance::refreshCurrentOutfitName(const std::string& name)
}
//static
-void LLSidepanelAppearance::editWearable(LLWearable *wearable, void *data)
+void LLSidepanelAppearance::editWearable(LLWearable *wearable, LLView *data)
{
- LLSidepanelAppearance *panel = (LLSidepanelAppearance*) data;
- panel->toggleLookInfoPanel(FALSE);
- panel->toggleWearableEditPanel(TRUE, wearable);
+ LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(data);
+ if (panel)
+ {
+ panel->showWearableEditPanel(wearable);
+ }
}
// Fetch currently worn items and only enable the New Look button after everything's been
@@ -352,23 +418,24 @@ void LLSidepanelAppearance::fetchInventory()
{
mNewOutfitBtn->setEnabled(false);
- LLInventoryFetchObserver::item_ref_t ids;
+ uuid_vec_t ids;
LLUUID item_id;
- for(S32 type = (S32)WT_SHAPE; type < (S32)WT_COUNT; ++type)
+ for(S32 type = (S32)LLWearableType::WT_SHAPE; type < (S32)LLWearableType::WT_COUNT; ++type)
{
- // MULTI_WEARABLE:
- item_id = gAgentWearables.getWearableItemID((EWearableType)type,0);
- if(item_id.notNull())
+ for (U32 index = 0; index < gAgentWearables.getWearableCount((LLWearableType::EType)type); ++index)
{
- ids.push_back(item_id);
+ item_id = gAgentWearables.getWearableItemID((LLWearableType::EType)type, index);
+ if(item_id.notNull())
+ {
+ ids.push_back(item_id);
+ }
}
}
- LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- if( avatar )
+ if (isAgentAvatarValid())
{
- for (LLVOAvatar::attachment_map_t::const_iterator iter = avatar->mAttachmentPoints.begin();
- iter != avatar->mAttachmentPoints.end(); ++iter)
+ for (LLVOAvatar::attachment_map_t::const_iterator iter = gAgentAvatarp->mAttachmentPoints.begin();
+ iter != gAgentAvatarp->mAttachmentPoints.end(); ++iter)
{
LLViewerJointAttachment* attachment = iter->second;
if (!attachment) continue;
@@ -385,11 +452,11 @@ void LLSidepanelAppearance::fetchInventory()
}
}
- LLCurrentlyWornFetchObserver *fetch_worn = new LLCurrentlyWornFetchObserver(this);
- fetch_worn->fetchItems(ids);
+ LLCurrentlyWornFetchObserver *fetch_worn = new LLCurrentlyWornFetchObserver(ids, this);
+ fetch_worn->startFetch();
// If no items to be fetched, done will never be triggered.
- // TODO: Change LLInventoryFetchObserver::fetchItems to trigger done() on this condition.
- if (fetch_worn->isEverythingComplete())
+ // TODO: Change LLInventoryFetchItemsObserver::fetchItems to trigger done() on this condition.
+ if (fetch_worn->isFinished())
{
fetch_worn->done();
}
@@ -403,3 +470,25 @@ void LLSidepanelAppearance::inventoryFetched()
{
mNewOutfitBtn->setEnabled(true);
}
+
+void LLSidepanelAppearance::setWearablesLoading(bool val)
+{
+ childSetVisible("wearables_loading_indicator", val);
+ childSetVisible("edit_outfit_btn", !val);
+}
+
+void LLSidepanelAppearance::showDefaultSubpart()
+{
+ if (mEditWearable->getVisible())
+ {
+ mEditWearable->showDefaultSubpart();
+ }
+}
+
+void LLSidepanelAppearance::updateScrollingPanelList()
+{
+ if (mEditWearable->getVisible())
+ {
+ mEditWearable->updateScrollingPanelList();
+ }
+}
diff --git a/indra/newview/llsidepanelappearance.h b/indra/newview/llsidepanelappearance.h
index aa2e67fd16..812d6362ef 100644
--- a/indra/newview/llsidepanelappearance.h
+++ b/indra/newview/llsidepanelappearance.h
@@ -36,17 +36,17 @@
#include "llinventoryobserver.h"
#include "llinventory.h"
-#include "llpanellookinfo.h"
+#include "llpaneloutfitedit.h"
class LLFilterEditor;
class LLCurrentlyWornFetchObserver;
-class LLWatchForOutfitRenameObserver;
class LLPanelEditWearable;
class LLWearable;
class LLPanelOutfitsInventory;
class LLSidepanelAppearance : public LLPanel
{
+ LOG_CLASS(LLSidepanelAppearance);
public:
LLSidepanelAppearance();
virtual ~LLSidepanelAppearance();
@@ -56,51 +56,52 @@ public:
void refreshCurrentOutfitName(const std::string& name = "");
- static void editWearable(LLWearable *wearable, void *data);
+ static void editWearable(LLWearable *wearable, LLView *data);
void fetchInventory();
void inventoryFetched();
- void updateVerbs();
void onNewOutfitButtonClicked();
+ void showOutfitsInventoryPanel();
+ void showOutfitEditPanel();
+ void showWearableEditPanel(LLWearable *wearable = NULL);
+ void setWearablesLoading(bool val);
+ void showDefaultSubpart();
+ void updateScrollingPanelList();
+
private:
void onFilterEdit(const std::string& search_string);
+ void onVisibilityChange ( const LLSD& new_visibility );
void onOpenOutfitButtonClicked();
void onEditAppearanceButtonClicked();
- void onEditButtonClicked();
- void onBackButtonClicked();
- void onEditWearBackClicked();
- void toggleLookInfoPanel(BOOL visible);
- void toggleWearableEditPanel(BOOL visible, LLWearable* wearable);
+
+ void togglMyOutfitsPanel(BOOL visible);
+ void toggleOutfitEditPanel(BOOL visible, BOOL disable_camera_switch = FALSE);
+ void toggleWearableEditPanel(BOOL visible, LLWearable* wearable = NULL, BOOL disable_camera_switch = FALSE);
LLFilterEditor* mFilterEditor;
LLPanelOutfitsInventory* mPanelOutfitsInventory;
- LLPanelLookInfo* mLookInfo;
+ LLPanelOutfitEdit* mOutfitEdit;
LLPanelEditWearable* mEditWearable;
LLButton* mOpenOutfitBtn;
LLButton* mEditAppearanceBtn;
- LLButton* mEditBtn;
LLButton* mNewOutfitBtn;
LLPanel* mCurrOutfitPanel;
LLTextBox* mCurrentLookName;
- LLTextBox* mOutfitDirtyTag;
+ LLTextBox* mOutfitStatus;
// Used to make sure the user's inventory is in memory.
LLCurrentlyWornFetchObserver* mFetchWorn;
- // Used to update title when currently worn outfit gets renamed.
- LLWatchForOutfitRenameObserver* mOutfitRenameWatcher;
-
// Search string for filtering landmarks and teleport
// history locations
std::string mFilterSubString;
- // Information type currently shown in Look Information panel
- std::string mLookInfoType;
-
+ // Gets set to true when we're opened for the first time.
+ bool mOpened;
};
#endif //LL_LLSIDEPANELAPPEARANCE_H
diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp
index 3fd5309947..63b6fe5ef0 100644
--- a/indra/newview/llsidepanelinventory.cpp
+++ b/indra/newview/llsidepanelinventory.cpp
@@ -33,6 +33,7 @@
#include "llsidepanelinventory.h"
#include "llagent.h"
+#include "llavataractions.h"
#include "llbutton.h"
#include "llinventorybridge.h"
#include "llinventorypanel.h"
@@ -41,6 +42,7 @@
#include "llsidepaneltaskinfo.h"
#include "lltabcontainer.h"
#include "llselectmgr.h"
+#include "llweb.h"
static LLRegisterPanelClassWrapper<LLSidepanelInventory> t_inventory("sidepanel_inventory");
@@ -62,13 +64,16 @@ BOOL LLSidepanelInventory::postBuild()
// UI elements from inventory panel
{
mInventoryPanel = getChild<LLPanel>("sidepanel__inventory_panel");
-
+
mInfoBtn = mInventoryPanel->getChild<LLButton>("info_btn");
mInfoBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onInfoButtonClicked, this));
mShareBtn = mInventoryPanel->getChild<LLButton>("share_btn");
mShareBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onShareButtonClicked, this));
+ LLButton* shop_btn = mInventoryPanel->getChild<LLButton>("shop_btn");
+ shop_btn->setClickedCallback(boost::bind(&LLSidepanelInventory::onShopButtonClicked, this));
+
mWearBtn = mInventoryPanel->getChild<LLButton>("wear_btn");
mWearBtn->setClickedCallback(boost::bind(&LLSidepanelInventory::onWearButtonClicked, this));
@@ -83,6 +88,16 @@ BOOL LLSidepanelInventory::postBuild()
mPanelMainInventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
mPanelMainInventory->setSelectCallback(boost::bind(&LLSidepanelInventory::onSelectionChange, this, _1, _2));
+ LLTabContainer* tabs = mPanelMainInventory->getChild<LLTabContainer>("inventory filter tabs");
+ tabs->setCommitCallback(boost::bind(&LLSidepanelInventory::updateVerbs, this));
+
+ /*
+ EXT-4846 : "Can we suppress the "Landmarks" and "My Favorites" folder since they have their own Task Panel?"
+ Deferring this until 2.1.
+ LLInventoryPanel *my_inventory_panel = mPanelMainInventory->getChild<LLInventoryPanel>("All Items");
+ my_inventory_panel->addHideFolderType(LLFolderType::FT_LANDMARK);
+ my_inventory_panel->addHideFolderType(LLFolderType::FT_FAVORITE);
+ */
}
// UI elements from item panel
@@ -143,6 +158,12 @@ void LLSidepanelInventory::onInfoButtonClicked()
void LLSidepanelInventory::onShareButtonClicked()
{
+ LLAvatarActions::shareWithAvatars();
+}
+
+void LLSidepanelInventory::onShopButtonClicked()
+{
+ LLWeb::loadURLExternal(gSavedSettings.getString("MarketplaceURL"));
}
void LLSidepanelInventory::performActionOnSelection(const std::string &action)
@@ -153,7 +174,7 @@ void LLSidepanelInventory::performActionOnSelection(const std::string &action)
{
return;
}
- current_item->getListener()->performAction(panel_main_inventory->getActivePanel()->getRootFolder(), panel_main_inventory->getActivePanel()->getModel(), action);
+ current_item->getListener()->performAction(panel_main_inventory->getActivePanel()->getModel(), action);
}
void LLSidepanelInventory::onWearButtonClicked()
@@ -244,7 +265,9 @@ void LLSidepanelInventory::updateVerbs()
mPlayBtn->setEnabled(FALSE);
mTeleportBtn->setVisible(FALSE);
mTeleportBtn->setEnabled(FALSE);
-
+
+ mShareBtn->setEnabled(canShare());
+
const LLInventoryItem *item = getSelectedItem();
if (!item)
return;
@@ -252,7 +275,6 @@ void LLSidepanelInventory::updateVerbs()
bool is_single_selection = getSelectedCount() == 1;
mInfoBtn->setEnabled(is_single_selection);
- mShareBtn->setEnabled(is_single_selection);
switch(item->getInventoryType())
{
@@ -277,6 +299,25 @@ void LLSidepanelInventory::updateVerbs()
}
}
+bool LLSidepanelInventory::canShare()
+{
+ LLPanelMainInventory* panel_main_inventory =
+ mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
+
+ LLFolderView* root_folder =
+ panel_main_inventory->getActivePanel()->getRootFolder();
+
+ LLFolderViewItem* current_item = root_folder->hasVisibleChildren()
+ ? root_folder->getCurSelectedItem()
+ : NULL;
+
+ LLInvFVBridge* bridge = current_item
+ ? dynamic_cast <LLInvFVBridge*> (current_item->getListener())
+ : NULL;
+
+ return bridge ? bridge->canShare() : false;
+}
+
LLInventoryItem *LLSidepanelInventory::getSelectedItem()
{
LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
@@ -293,8 +334,7 @@ LLInventoryItem *LLSidepanelInventory::getSelectedItem()
U32 LLSidepanelInventory::getSelectedCount()
{
LLPanelMainInventory *panel_main_inventory = mInventoryPanel->getChild<LLPanelMainInventory>("panel_main_inventory");
- std::set<LLUUID> selection_list;
- panel_main_inventory->getActivePanel()->getRootFolder()->getSelectionList(selection_list);
+ std::set<LLUUID> selection_list = panel_main_inventory->getActivePanel()->getRootFolder()->getSelectionList();
return selection_list.size();
}
diff --git a/indra/newview/llsidepanelinventory.h b/indra/newview/llsidepanelinventory.h
index ee11fb6b54..13275d14c0 100644
--- a/indra/newview/llsidepanelinventory.h
+++ b/indra/newview/llsidepanelinventory.h
@@ -51,8 +51,13 @@ public:
/*virtual*/ void onOpen(const LLSD& key);
LLInventoryPanel* getActivePanel(); // Returns an active inventory panel, if any.
+ LLPanelMainInventory* getMainInventoryPanel() const { return mPanelMainInventory; }
BOOL isMainInventoryPanelActive() const;
+ void showItemInfoPanel();
+ void showTaskInfoPanel();
+ void showInventoryPanel();
+
protected:
// Tracks highlighted (selected) item in inventory panel.
LLInventoryItem *getSelectedItem();
@@ -60,10 +65,8 @@ protected:
void onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action);
// "wear", "teleport", etc.
void performActionOnSelection(const std::string &action);
+ bool canShare();
- void showItemInfoPanel();
- void showTaskInfoPanel();
- void showInventoryPanel();
void updateVerbs();
//
@@ -78,6 +81,7 @@ private:
protected:
void onInfoButtonClicked();
void onShareButtonClicked();
+ void onShopButtonClicked();
void onWearButtonClicked();
void onPlayButtonClicked();
void onTeleportButtonClicked();
diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp
index 94fe95d215..0ec351965a 100644
--- a/indra/newview/llsidepaneliteminfo.cpp
+++ b/indra/newview/llsidepaneliteminfo.cpp
@@ -40,6 +40,7 @@
#include "llbutton.h"
#include "llfloaterreg.h"
#include "llgroupactions.h"
+#include "llinventorydefines.h"
#include "llinventorymodel.h"
#include "llinventoryobserver.h"
#include "lllineeditor.h"
@@ -109,9 +110,9 @@ BOOL LLSidepanelItemInfo::postBuild()
{
LLSidepanelInventorySubpanel::postBuild();
- childSetPrevalidate("LabelItemName",&LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("LabelItemName",&LLTextValidate::validateASCIIPrintableNoPipe);
getChild<LLUICtrl>("LabelItemName")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onCommitName,this));
- childSetPrevalidate("LabelItemDesc",&LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("LabelItemDesc",&LLTextValidate::validateASCIIPrintableNoPipe);
getChild<LLUICtrl>("LabelItemDesc")->setCommitCallback(boost::bind(&LLSidepanelItemInfo:: onCommitDescription, this));
// Creator information
getChild<LLUICtrl>("BtnCreator")->setCommitCallback(boost::bind(&LLSidepanelItemInfo::onClickCreator,this));
@@ -231,20 +232,23 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)
// PERMISSIONS LOOKUP //
////////////////////////
+ llassert(item);
+ if (!item) return;
+
// do not enable the UI for incomplete items.
- BOOL is_complete = item->isComplete();
+ BOOL is_complete = item->isFinished();
const BOOL cannot_restrict_permissions = LLInventoryType::cannotRestrictPermissions(item->getInventoryType());
const BOOL is_calling_card = (item->getInventoryType() == LLInventoryType::IT_CALLINGCARD);
const LLPermissions& perm = item->getPermissions();
const BOOL can_agent_manipulate = gAgent.allowOperation(PERM_OWNER, perm,
- GP_OBJECT_MANIPULATE);
+ GP_OBJECT_MANIPULATE);
const BOOL can_agent_sell = gAgent.allowOperation(PERM_OWNER, perm,
- GP_OBJECT_SET_SALE) &&
+ GP_OBJECT_SET_SALE) &&
!cannot_restrict_permissions;
const BOOL is_link = item->getIsLinkType();
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- bool not_in_trash = item && (item->getUUID() != trash_id) && !gInventory.isObjectDescendentOf(item->getUUID(), trash_id);
+ bool not_in_trash = (item->getUUID() != trash_id) && !gInventory.isObjectDescendentOf(item->getUUID(), trash_id);
// You need permission to modify the object to modify an inventory
// item in it.
@@ -436,9 +440,9 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)
if (item->getType() == LLAssetType::AT_OBJECT)
{
U32 flags = item->getFlags();
- slam_perm = flags & LLInventoryItem::II_FLAGS_OBJECT_SLAM_PERM;
- overwrite_everyone = flags & LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE;
- overwrite_group = flags & LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP;
+ slam_perm = flags & LLInventoryItemFlags::II_FLAGS_OBJECT_SLAM_PERM;
+ overwrite_everyone = flags & LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE;
+ overwrite_group = flags & LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP;
}
std::string perm_string;
@@ -739,7 +743,7 @@ void LLSidepanelItemInfo::onCommitPermissions()
CheckNextOwnerTransfer->get(), PERM_TRANSFER);
}
if(perm != item->getPermissions()
- && item->isComplete())
+ && item->isFinished())
{
LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
new_item->setPermissions(perm);
@@ -749,7 +753,7 @@ void LLSidepanelItemInfo::onCommitPermissions()
if((perm.getMaskNextOwner()!=item->getPermissions().getMaskNextOwner())
&& (item->getType() == LLAssetType::AT_OBJECT))
{
- flags |= LLInventoryItem::II_FLAGS_OBJECT_SLAM_PERM;
+ flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_SLAM_PERM;
}
// If everyone permissions have changed (and this is an object)
// then set the overwrite everyone permissions flag so they
@@ -757,7 +761,7 @@ void LLSidepanelItemInfo::onCommitPermissions()
if ((perm.getMaskEveryone()!=item->getPermissions().getMaskEveryone())
&& (item->getType() == LLAssetType::AT_OBJECT))
{
- flags |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE;
+ flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_EVERYONE;
}
// If group permissions have changed (and this is an object)
// then set the overwrite group permissions flag so they
@@ -765,7 +769,7 @@ void LLSidepanelItemInfo::onCommitPermissions()
if ((perm.getMaskGroup()!=item->getPermissions().getMaskGroup())
&& (item->getType() == LLAssetType::AT_OBJECT))
{
- flags |= LLInventoryItem::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP;
+ flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP;
}
new_item->setFlags(flags);
if(mObjectID.isNull())
@@ -869,7 +873,7 @@ void LLSidepanelItemInfo::updateSaleInfo()
sale_info.setSaleType(LLSaleInfo::FS_NOT);
}
if(sale_info != item->getSaleInfo()
- && item->isComplete())
+ && item->isFinished())
{
LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
@@ -877,7 +881,7 @@ void LLSidepanelItemInfo::updateSaleInfo()
if (item->getType() == LLAssetType::AT_OBJECT)
{
U32 flags = new_item->getFlags();
- flags |= LLInventoryItem::II_FLAGS_OBJECT_SLAM_SALE;
+ flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_SLAM_SALE;
new_item->setFlags(flags);
}
diff --git a/indra/newview/llsidepaneltaskinfo.cpp b/indra/newview/llsidepaneltaskinfo.cpp
index 0b8f66c5f3..3ab71eac64 100644
--- a/indra/newview/llsidepaneltaskinfo.cpp
+++ b/indra/newview/llsidepaneltaskinfo.cpp
@@ -80,6 +80,7 @@ static LLRegisterPanelClassWrapper<LLSidepanelTaskInfo> t_task_info("sidepanel_t
LLSidepanelTaskInfo::LLSidepanelTaskInfo()
{
setMouseOpaque(FALSE);
+ LLSelectMgr::instance().mUpdateSignal.connect(boost::bind(&LLSidepanelTaskInfo::refreshAll, this));
}
@@ -100,13 +101,15 @@ BOOL LLSidepanelTaskInfo::postBuild()
mPayBtn->setClickedCallback(boost::bind(&LLSidepanelTaskInfo::onPayButtonClicked, this));
mBuyBtn = getChild<LLButton>("buy_btn");
mBuyBtn->setClickedCallback(boost::bind(&LLSidepanelTaskInfo::onBuyButtonClicked, this));
+ mDetailsBtn = getChild<LLButton>("details_btn");
+ mDetailsBtn->setClickedCallback(boost::bind(&LLSidepanelTaskInfo::onDetailsButtonClicked, this));
mLabelGroupName = getChild<LLNameBox>("Group Name Proxy");
childSetCommitCallback("Object Name", LLSidepanelTaskInfo::onCommitName,this);
- childSetPrevalidate("Object Name", LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("Object Name", LLTextValidate::validateASCIIPrintableNoPipe);
childSetCommitCallback("Object Description", LLSidepanelTaskInfo::onCommitDesc,this);
- childSetPrevalidate("Object Description", LLLineEditor::prevalidateASCIIPrintableNoPipe);
+ childSetPrevalidate("Object Description", LLTextValidate::validateASCIIPrintableNoPipe);
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);
@@ -123,10 +126,8 @@ BOOL LLSidepanelTaskInfo::postBuild()
return TRUE;
}
-// virtual
-void LLSidepanelTaskInfo::setVisible(BOOL visible)
+/*virtual*/ void LLSidepanelTaskInfo::handleVisibilityChange ( BOOL visible )
{
- LLPanel::setVisible(visible);
if (visible)
{
sActivePanel = this;
@@ -135,9 +136,12 @@ void LLSidepanelTaskInfo::setVisible(BOOL visible)
else
{
sActivePanel = NULL;
+ // drop selection reference
+ mObjectSelection = NULL;
}
}
+
void LLSidepanelTaskInfo::disableAll()
{
childSetEnabled("perm_modify", FALSE);
@@ -268,7 +272,6 @@ void LLSidepanelTaskInfo::refresh()
// BUG: fails if a root and non-root are both single-selected.
const BOOL is_perm_modify = (mObjectSelection->getFirstRootNode() && LLSelectMgr::getInstance()->selectGetRootsModify()) ||
LLSelectMgr::getInstance()->selectGetModify();
- const LLFocusableElement* keyboard_focus_view = gFocusMgr.getKeyboardFocus();
S32 string_index = 0;
std::string MODIFY_INFO_STRINGS[] =
@@ -362,14 +365,14 @@ void LLSidepanelTaskInfo::refresh()
if (is_one_object)
{
- if (keyboard_focus_view != LineEditorObjectName)
+ if (!LineEditorObjectName->hasFocus())
{
childSetText("Object Name",nodep->mName);
}
if (LineEditorObjectDesc)
{
- if (keyboard_focus_view != LineEditorObjectDesc)
+ if (!LineEditorObjectDesc->hasFocus())
{
LineEditorObjectDesc->setText(nodep->mDescription);
}
@@ -1122,6 +1125,15 @@ void LLSidepanelTaskInfo::updateVerbs()
//mEditBtn->setEnabled(obj && obj->permModify());
*/
+ LLSafeHandle<LLObjectSelection> object_selection = LLSelectMgr::getInstance()->getSelection();
+ const BOOL multi_select = (object_selection->getNumNodes() > 1);
+
+ mOpenBtn->setVisible(!multi_select);
+ mPayBtn->setVisible(!multi_select);
+ mBuyBtn->setVisible(!multi_select);
+ mDetailsBtn->setVisible(multi_select);
+ mDetailsBtn->setEnabled(multi_select);
+
mOpenBtn->setEnabled(enable_object_open());
mPayBtn->setEnabled(enable_pay_object());
mBuyBtn->setEnabled(enable_buy_object());
@@ -1145,6 +1157,11 @@ void LLSidepanelTaskInfo::onBuyButtonClicked()
doClickAction(CLICK_ACTION_BUY);
}
+void LLSidepanelTaskInfo::onDetailsButtonClicked()
+{
+ LLFloaterReg::showInstance("inspect", LLSD());
+}
+
// virtual
void LLSidepanelTaskInfo::save()
{
@@ -1161,9 +1178,30 @@ void LLSidepanelTaskInfo::save()
onCommitIncludeInSearch(getChild<LLCheckBoxCtrl>("search_check"), this);
}
+// removes keyboard focus so that all fields can be updated
+// and then restored focus
+void LLSidepanelTaskInfo::refreshAll()
+{
+ // update UI as soon as we have an object
+ // but remove keyboard focus first so fields are free to update
+ LLFocusableElement* focus = NULL;
+ if (hasFocus())
+ {
+ focus = gFocusMgr.getKeyboardFocus();
+ setFocus(FALSE);
+ }
+ refresh();
+ if (focus)
+ {
+ focus->setFocus(TRUE);
+ }
+}
+
+
void LLSidepanelTaskInfo::setObjectSelection(LLObjectSelectionHandle selection)
{
mObjectSelection = selection;
+ refreshAll();
}
LLSidepanelTaskInfo* LLSidepanelTaskInfo::getActivePanel()
diff --git a/indra/newview/llsidepaneltaskinfo.h b/indra/newview/llsidepaneltaskinfo.h
index cf36c20767..010173e84e 100644
--- a/indra/newview/llsidepaneltaskinfo.h
+++ b/indra/newview/llsidepaneltaskinfo.h
@@ -54,7 +54,7 @@ public:
virtual ~LLSidepanelTaskInfo();
/*virtual*/ BOOL postBuild();
- /*virtual*/ void setVisible(BOOL visible);
+ /*virtual*/ void handleVisibilityChange ( BOOL new_visibility );
void setObjectSelection(LLObjectSelectionHandle selection);
@@ -67,6 +67,8 @@ protected:
/*virtual*/ void save();
/*virtual*/ void updateVerbs();
+ void refreshAll(); // ignore current keyboard focus and update all fields
+
// statics
static void onClickClaim(void*);
static void onClickRelease(void*);
@@ -109,16 +111,18 @@ protected:
void onOpenButtonClicked();
void onPayButtonClicked();
void onBuyButtonClicked();
+ void onDetailsButtonClicked();
private:
LLButton* mOpenBtn;
LLButton* mPayBtn;
LLButton* mBuyBtn;
+ LLButton* mDetailsBtn;
protected:
LLViewerObject* getObject();
private:
LLViewerObject* mObject;
- LLObjectSelectionHandle mObjectSelection;
+ LLObjectSelectionHandle mObjectSelection;
static LLSidepanelTaskInfo* sActivePanel;
};
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index 50c47e293e..fed39c362e 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -34,7 +34,8 @@
#include "lltextbox.h"
-#include "llagent.h"
+#include "llagentcamera.h"
+#include "llappviewer.h"
#include "llbottomtray.h"
#include "llsidetray.h"
#include "llviewerwindow.h"
@@ -248,6 +249,11 @@ LLSideTray::LLSideTray(Params& params)
// panel_name should be specified via "parameter" attribute.
commit.add("SideTray.ShowPanel", boost::bind(&LLSideTray::showPanel, this, _2, LLUUID::null));
LLTransientFloaterMgr::getInstance()->addControlView(this);
+ LLView* side_bar_tabs = gViewerWindow->getRootView()->getChildView("side_bar_tabs");
+ if (side_bar_tabs != NULL)
+ {
+ LLTransientFloaterMgr::getInstance()->addControlView(side_bar_tabs);
+ }
LLPanel::Params p;
p.name = "buttons_panel";
@@ -267,9 +273,18 @@ BOOL LLSideTray::postBuild()
collapseSideBar();
setMouseOpaque(false);
+
+ LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLSideTray::handleLoginComplete, this));
+
return true;
}
+void LLSideTray::handleLoginComplete()
+{
+ //reset tab to "home" tab if it was changesd during login process
+ selectTabByName("sidebar_home");
+}
+
LLSideTrayTab* LLSideTray::getTab(const std::string& name)
{
return getChild<LLSideTrayTab>(name,false);
@@ -464,6 +479,9 @@ void LLSideTray::reflectCollapseChange()
}
gFloaterView->refresh();
+
+ LLSD new_value = mCollapsed;
+ mCollapseSignal(this,new_value);
}
void LLSideTray::arrange()
@@ -541,7 +559,6 @@ void LLSideTray::collapseSideBar()
//mActiveTab->setVisible(FALSE);
reflectCollapseChange();
setFocus( FALSE );
-
}
void LLSideTray::expandSideBar()
@@ -566,7 +583,6 @@ void LLSideTray::expandSideBar()
LLButton* btn = btn_it->second;
btn->setImageOverlay( mActiveTab->mImageSelected );
}
-
}
void LLSideTray::highlightFocused()
@@ -633,6 +649,7 @@ LLPanel* LLSideTray::showPanel (const std::string& panel_name, const LLSD& para
{
panel->onOpen(params);
}
+
return panel;
}
}
@@ -715,17 +732,12 @@ bool LLSideTray::isPanelActive(const std::string& panel_name)
return (panel->getName() == panel_name);
}
-
-// *TODO: Eliminate magic constants.
-static const S32 fake_offset = 132;
-static const S32 fake_top_offset = 18;
-
void LLSideTray::updateSidetrayVisibility()
{
// set visibility of parent container based on collapsed state
if (getParent())
{
- getParent()->setVisible(!mCollapsed && !gAgent.cameraMouselook());
+ getParent()->setVisible(!mCollapsed && !gAgentCamera.cameraMouselook());
}
}
diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h
index b1c8675793..3a8d308425 100644
--- a/indra/newview/llsidetray.h
+++ b/indra/newview/llsidetray.h
@@ -94,7 +94,7 @@ public:
* if no such tab - return NULL, otherwise a pointer to the panel
* Pass params as array, or they may be overwritten(example - params["name"]="nearby")
*/
- LLPanel* showPanel (const std::string& panel_name, const LLSD& params);
+ LLPanel* showPanel (const std::string& panel_name, const LLSD& params = LLSD());
/**
* Toggling Side Tray tab which contains "sub_panel" child of "panel_name" panel.
@@ -102,7 +102,7 @@ public:
* otherwise Side Tray is collapsed.
* params are passed to "panel_name" panel onOpen().
*/
- void togglePanel (LLPanel* &sub_panel, const std::string& panel_name, const LLSD& params);
+ void togglePanel (LLPanel* &sub_panel, const std::string& panel_name, const LLSD& params = LLSD());
/*
* get the panel (don't show it or do anything else with it)
@@ -139,6 +139,8 @@ public:
LLPanel* getButtonsPanel() { return mButtonsPanel; }
+ bool getCollapsed() { return mCollapsed; }
+
public:
virtual ~LLSideTray(){};
@@ -157,6 +159,10 @@ public:
void updateSidetrayVisibility();
+ commit_signal_t& getCollapseSignal() { return mCollapseSignal; }
+
+ void handleLoginComplete();
+
protected:
LLSideTrayTab* getTab (const std::string& name);
@@ -185,6 +191,8 @@ private:
child_vector_t mTabs;
LLSideTrayTab* mActiveTab;
+ commit_signal_t mCollapseSignal;
+
LLButton* mCollapseButton;
bool mCollapsed;
diff --git a/indra/newview/llslurl.cpp b/indra/newview/llslurl.cpp
index 3343ee88bd..0df7035f84 100644
--- a/indra/newview/llslurl.cpp
+++ b/indra/newview/llslurl.cpp
@@ -1,10 +1,11 @@
/**
- * @file llslurl.cpp
- * @brief SLURL manipulation
+ * @file llurlsimstring.cpp (was llsimurlstring.cpp)
+ * @brief Handles "SLURL fragments" like Ahern/123/45 for
+ * startup processing, login screen, prefs, etc.
*
- * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
*
- * Copyright (c) 2009, Linden Research, Inc.
+ * Copyright (c) 2006-2010, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
@@ -12,13 +13,12 @@
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * online at http://secondlife.com/developers/opensource/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * online at http://secondlife.com/developers/opensource/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
@@ -34,128 +34,453 @@
#include "llslurl.h"
-#include "llweb.h"
+#include "llpanellogin.h"
+#include "llviewercontrol.h"
+#include "llviewernetwork.h"
+#include "llfiltersd2xmlrpc.h"
+#include "curl/curl.h"
+const char* LLSLURL::SLURL_HTTP_SCHEME = "http";
+const char* LLSLURL::SLURL_HTTPS_SCHEME = "https";
+const char* LLSLURL::SLURL_SECONDLIFE_SCHEME = "secondlife";
+const char* LLSLURL::SLURL_SECONDLIFE_PATH = "secondlife";
+const char* LLSLURL::SLURL_COM = "slurl.com";
+// For DnD - even though www.slurl.com redirects to slurl.com in a browser, you can copy and drag
+// text with www.slurl.com or a link explicitly pointing at www.slurl.com so testing for this
+// version is required also.
-const std::string LLSLURL::PREFIX_SL_HELP = "secondlife://app.";
-const std::string LLSLURL::PREFIX_SL = "sl://";
-const std::string LLSLURL::PREFIX_SECONDLIFE = "secondlife://";
-const std::string LLSLURL::PREFIX_SLURL_OLD = "http://slurl.com/secondlife/";
-const std::string LLSLURL::PREFIX_SLURL = "http://maps.secondlife.com/secondlife/";
+const char* LLSLURL::WWW_SLURL_COM = "www.slurl.com";
+const char* LLSLURL::SECONDLIFE_COM = "secondlife.com";
+const char* LLSLURL::MAPS_SECONDLIFE_COM = "maps.secondlife.com";
+const char* LLSLURL::SLURL_X_GRID_LOCATION_INFO_SCHEME = "x-grid-location-info";
+const char* LLSLURL::SLURL_APP_PATH = "app";
+const char* LLSLURL::SLURL_REGION_PATH = "region";
+const char* LLSLURL::SIM_LOCATION_HOME = "home";
+const char* LLSLURL::SIM_LOCATION_LAST = "last";
-const std::string LLSLURL::APP_TOKEN = "app/";
-
-// static
-std::string LLSLURL::stripProtocol(const std::string& url)
+// resolve a simstring from a slurl
+LLSLURL::LLSLURL(const std::string& slurl)
{
- std::string stripped = url;
- if (matchPrefix(stripped, PREFIX_SL_HELP))
- {
- stripped.erase(0, PREFIX_SL_HELP.length());
- }
- else if (matchPrefix(stripped, PREFIX_SL))
- {
- stripped.erase(0, PREFIX_SL.length());
- }
- else if (matchPrefix(stripped, PREFIX_SECONDLIFE))
+ // by default we go to agni.
+ mType = INVALID;
+ LL_INFOS("AppInit") << "SLURL: " << slurl << LL_ENDL;
+ if(slurl == SIM_LOCATION_HOME)
{
- stripped.erase(0, PREFIX_SECONDLIFE.length());
+ mType = HOME_LOCATION;
}
- else if (matchPrefix(stripped, PREFIX_SLURL))
+ else if(slurl.empty() || (slurl == SIM_LOCATION_LAST))
{
- stripped.erase(0, PREFIX_SLURL.length());
+
+ mType = LAST_LOCATION;
}
- else if (matchPrefix(stripped, PREFIX_SLURL_OLD))
+ else
{
- stripped.erase(0, PREFIX_SLURL_OLD.length());
+ LLURI slurl_uri;
+ // parse the slurl as a uri
+ if(slurl.find(':') == std::string::npos)
+ {
+ // There may be no scheme ('secondlife:' etc.) passed in. In that case
+ // we want to normalize the slurl by putting the appropriate scheme
+ // in front of the slurl. So, we grab the appropriate slurl base
+ // from the grid manager which may be http://slurl.com/secondlife/ for maingrid, or
+ // https://<hostname>/region/ for Standalone grid (the word region, not the region name)
+ // these slurls are typically passed in from the 'starting location' box on the login panel,
+ // where the user can type in <regionname>/<x>/<y>/<z>
+ std::string fixed_slurl = LLGridManager::getInstance()->getSLURLBase();
+ // the slurl that was passed in might have a prepended /, or not. So,
+ // we strip off the prepended '/' so we don't end up with http://slurl.com/secondlife/<region>/<x>/<y>/<z>
+ // or some such.
+
+ if(slurl[0] == '/')
+ {
+ fixed_slurl += slurl.substr(1);
+ }
+ else
+ {
+ fixed_slurl += slurl;
+ }
+ // We then load the slurl into a LLURI form
+ slurl_uri = LLURI(fixed_slurl);
+ }
+ else
+ {
+ // as we did have a scheme, implying a URI style slurl, we
+ // simply parse it as a URI
+ slurl_uri = LLURI(slurl);
+ }
+
+ LLSD path_array = slurl_uri.pathArray();
+
+ // determine whether it's a maingrid URI or an Standalone/open style URI
+ // by looking at the scheme. If it's a 'secondlife:' slurl scheme or
+ // 'sl:' scheme, we know it's maingrid
+
+ // At the end of this if/else block, we'll have determined the grid,
+ // and the slurl type (APP or LOCATION)
+ if(slurl_uri.scheme() == LLSLURL::SLURL_SECONDLIFE_SCHEME)
+ {
+ // parse a maingrid style slurl. We know the grid is maingrid
+ // so grab it.
+ // A location slurl for maingrid (with the special schemes) can be in the form
+ // secondlife://<regionname>/<x>/<y>/<z>
+ // or
+ // secondlife://<Grid>/secondlife/<region>/<x>/<y>/<z>
+ // where if grid is empty, it specifies Agni
+
+ // An app style slurl for maingrid can be
+ // secondlife://<Grid>/app/<app parameters>
+ // where an empty grid implies Agni
+
+ // we'll start by checking the top of the 'path' which will be
+ // either 'app', 'secondlife', or <x>.
+
+ // default to maingrid
+
+ mGrid = MAINGRID;
+
+ if ((path_array[0].asString() == LLSLURL::SLURL_SECONDLIFE_PATH) ||
+ (path_array[0].asString() == LLSLURL::SLURL_APP_PATH))
+ {
+ // it's in the form secondlife://<grid>/(app|secondlife)
+ // so parse the grid name to derive the grid ID
+ if (!slurl_uri.hostName().empty())
+ {
+ mGrid = LLGridManager::getInstance()->getGridByLabel(slurl_uri.hostName());
+ }
+ else if(path_array[0].asString() == LLSLURL::SLURL_SECONDLIFE_PATH)
+ {
+ // If the slurl is in the form secondlife:///secondlife/<region> form,
+ // then we are in fact on maingrid.
+ mGrid = MAINGRID;
+ }
+ else if(path_array[0].asString() == LLSLURL::SLURL_APP_PATH)
+ {
+ // for app style slurls, where no grid name is specified, assume the currently
+ // selected or logged in grid.
+ mGrid = LLGridManager::getInstance()->getGrid();
+ }
+
+ if(mGrid.empty())
+ {
+ // we couldn't find the grid in the grid manager, so bail
+ return;
+ }
+ // set the type as appropriate.
+ if(path_array[0].asString() == LLSLURL::SLURL_SECONDLIFE_PATH)
+ {
+ mType = LOCATION;
+ }
+ else
+ {
+ mType = APP;
+ }
+ path_array.erase(0);
+ }
+ else
+ {
+ // it wasn't a /secondlife/<region> or /app/<params>, so it must be secondlife://<region>
+ // therefore the hostname will be the region name, and it's a location type
+ mType = LOCATION;
+ // 'normalize' it so the region name is in fact the head of the path_array
+ path_array.insert(0, slurl_uri.hostName());
+ }
+ }
+ else if((slurl_uri.scheme() == LLSLURL::SLURL_HTTP_SCHEME) ||
+ (slurl_uri.scheme() == LLSLURL::SLURL_HTTPS_SCHEME) ||
+ (slurl_uri.scheme() == LLSLURL::SLURL_X_GRID_LOCATION_INFO_SCHEME))
+ {
+ // *HACK: ignore http://secondlife.com/ URLs so that we can use
+ // http://secondlife.com/app/ redirect URLs
+ // This is only necessary while the server returns Release Note
+ // urls using this format rather that pointing to the wiki
+ if ((slurl_uri.scheme() == LLSLURL::SLURL_HTTP_SCHEME ||
+ slurl_uri.scheme() == LLSLURL::SLURL_HTTPS_SCHEME) &&
+ slurl_uri.hostName() == LLSLURL::SECONDLIFE_COM)
+ return;
+
+ // We're dealing with either a Standalone style slurl or slurl.com slurl
+ if ((slurl_uri.hostName() == LLSLURL::SLURL_COM) ||
+ (slurl_uri.hostName() == LLSLURL::WWW_SLURL_COM) ||
+ (slurl_uri.hostName() == LLSLURL::MAPS_SECONDLIFE_COM))
+ {
+ // slurl.com implies maingrid
+ mGrid = MAINGRID;
+ }
+ else
+ {
+ // As it's a Standalone grid/open, we will always have a hostname, as Standalone/open style
+ // urls are properly formed, unlike the stinky maingrid style
+ mGrid = slurl_uri.hostName();
+ }
+ if (path_array.size() == 0)
+ {
+ // um, we need a path...
+ return;
+ }
+
+ // we need to normalize the urls so
+ // the path portion starts with the 'command' that we want to do
+ // it can either be region or app.
+ if ((path_array[0].asString() == LLSLURL::SLURL_REGION_PATH) ||
+ (path_array[0].asString() == LLSLURL::SLURL_SECONDLIFE_PATH))
+ {
+ // strip off 'region' or 'secondlife'
+ path_array.erase(0);
+ // it's a location
+ mType = LOCATION;
+ }
+ else if (path_array[0].asString() == LLSLURL::SLURL_APP_PATH)
+ {
+ mType = APP;
+ path_array.erase(0);
+ // leave app appended.
+ }
+ else
+ {
+ // not a valid https/http/x-grid-location-info slurl, so it'll likely just be a URL
+ return;
+ }
+ }
+ else
+ {
+ // invalid scheme, so bail
+ return;
+ }
+
+
+ if(path_array.size() == 0)
+ {
+ // we gotta have some stuff after the specifier as to whether it's a region or command
+ return;
+ }
+
+ // now that we know whether it's an app slurl or a location slurl,
+ // parse the slurl into the proper data structures.
+ if(mType == APP)
+ {
+ // grab the app command type and strip it (could be a command to jump somewhere,
+ // or whatever )
+ mAppCmd = path_array[0].asString();
+ path_array.erase(0);
+
+ // Grab the parameters
+ mAppPath = path_array;
+ // and the query
+ mAppQuery = slurl_uri.query();
+ mAppQueryMap = slurl_uri.queryMap();
+ return;
+ }
+ else if(mType == LOCATION)
+ {
+ // at this point, head of the path array should be [ <region>, <x>, <y>, <z> ] where x, y and z
+ // are collectively optional
+ // are optional
+ mRegion = LLURI::unescape(path_array[0].asString());
+ path_array.erase(0);
+
+ // parse the x, y, z
+ if(path_array.size() >= 3)
+ {
+
+ mPosition = LLVector3(path_array);
+ if((F32(mPosition[VX]) < 0.f) ||
+ (mPosition[VX] > REGION_WIDTH_METERS) ||
+ (F32(mPosition[VY]) < 0.f) ||
+ (mPosition[VY] > REGION_WIDTH_METERS) ||
+ (F32(mPosition[VZ]) < 0.f) ||
+ (mPosition[VZ] > REGION_HEIGHT_METERS))
+ {
+ mType = INVALID;
+ return;
+ }
+
+ }
+ else
+ {
+ // if x, y and z were not fully passed in, go to the middle of the region.
+ // teleport will adjust the actual location to make sure you're on the ground
+ // and such
+ mPosition = LLVector3(REGION_WIDTH_METERS/2, REGION_WIDTH_METERS/2, 0);
+ }
+ }
}
+}
-
- return stripped;
+
+// Create a slurl for the middle of the region
+LLSLURL::LLSLURL(const std::string& grid,
+ const std::string& region)
+{
+ mGrid = grid;
+ mRegion = region;
+ mType = LOCATION;
+ mPosition = LLVector3((F64)REGION_WIDTH_METERS/2, (F64)REGION_WIDTH_METERS/2, 0);
}
-// static
-bool LLSLURL::isSLURL(const std::string& url)
+
+
+// create a slurl given the position. The position will be modded with the region
+// width handling global positions as well
+LLSLURL::LLSLURL(const std::string& grid,
+ const std::string& region,
+ const LLVector3& position)
{
- if (matchPrefix(url, PREFIX_SL_HELP)) return true;
- if (matchPrefix(url, PREFIX_SL)) return true;
- if (matchPrefix(url, PREFIX_SECONDLIFE)) return true;
- if (matchPrefix(url, PREFIX_SLURL)) return true;
- if (matchPrefix(url, PREFIX_SLURL_OLD)) return true;
-
- return false;
+ mGrid = grid;
+ mRegion = region;
+ S32 x = llround( (F32)fmod( position[VX], (F32)REGION_WIDTH_METERS ) );
+ S32 y = llround( (F32)fmod( position[VY], (F32)REGION_WIDTH_METERS ) );
+ S32 z = llround( (F32)position[VZ] );
+ mType = LOCATION;
+ mPosition = LLVector3(x, y, z);
}
-// static
-bool LLSLURL::isSLURLCommand(const std::string& url)
-{
- if (matchPrefix(url, PREFIX_SL + APP_TOKEN) ||
- matchPrefix(url, PREFIX_SECONDLIFE + "/" + APP_TOKEN) ||
- matchPrefix(url, PREFIX_SLURL + APP_TOKEN) ||
- matchPrefix(url, PREFIX_SLURL_OLD + APP_TOKEN) )
- {
- return true;
- }
- return false;
+// create a simstring
+LLSLURL::LLSLURL(const std::string& region,
+ const LLVector3& position)
+{
+ *this = LLSLURL(LLGridManager::getInstance()->getGrid(),
+ region, position);
}
-// static
-bool LLSLURL::isSLURLHelp(const std::string& url)
+// create a slurl from a global position
+LLSLURL::LLSLURL(const std::string& grid,
+ const std::string& region,
+ const LLVector3d& global_position)
{
- return matchPrefix(url, PREFIX_SL_HELP);
+ *this = LLSLURL(grid,
+ region, LLVector3(global_position.mdV[VX],
+ global_position.mdV[VY],
+ global_position.mdV[VZ]));
}
-// static
-std::string LLSLURL::buildSLURL(const std::string& regionname, S32 x, S32 y, S32 z)
+// create a slurl from a global position
+LLSLURL::LLSLURL(const std::string& region,
+ const LLVector3d& global_position)
{
- std::string slurl = PREFIX_SLURL + regionname + llformat("/%d/%d/%d",x,y,z);
- slurl = LLWeb::escapeURL( slurl );
- return slurl;
+ *this = LLSLURL(LLGridManager::getInstance()->getGrid(),
+ region, global_position);
}
-// static
-std::string LLSLURL::buildCommand(const char* noun, const LLUUID& id, const char* verb)
+LLSLURL::LLSLURL(const std::string& command, const LLUUID&id, const std::string& verb)
{
- std::string slurl = llformat("secondlife:///app/%s/%s/%s",
- noun, id.asString().c_str(), verb);
- return slurl;
+ mType = APP;
+ mAppCmd = command;
+ mAppPath = LLSD::emptyArray();
+ mAppPath.append(LLSD(id));
+ mAppPath.append(LLSD(verb));
}
-// static
-std::string LLSLURL::buildUnescapedSLURL(const std::string& regionname, S32 x, S32 y, S32 z)
+
+std::string LLSLURL::getSLURLString() const
{
- std::string unescapedslurl = PREFIX_SLURL + regionname + llformat("/%d/%d/%d",x,y,z);
- return unescapedslurl;
+ switch(mType)
+ {
+ case HOME_LOCATION:
+ return SIM_LOCATION_HOME;
+ case LAST_LOCATION:
+ return SIM_LOCATION_LAST;
+ case LOCATION:
+ {
+ // lookup the grid
+ S32 x = llround( (F32)mPosition[VX] );
+ S32 y = llround( (F32)mPosition[VY] );
+ S32 z = llround( (F32)mPosition[VZ] );
+ return LLGridManager::getInstance()->getSLURLBase(mGrid) +
+ LLURI::escape(mRegion) + llformat("/%d/%d/%d",x,y,z);
+ }
+ case APP:
+ {
+ std::ostringstream app_url;
+ app_url << LLGridManager::getInstance()->getAppSLURLBase() << "/" << mAppCmd;
+ for(LLSD::array_const_iterator i = mAppPath.beginArray();
+ i != mAppPath.endArray();
+ i++)
+ {
+ app_url << "/" << i->asString();
+ }
+ if(mAppQuery.length() > 0)
+ {
+ app_url << "?" << mAppQuery;
+ }
+ return app_url.str();
+ }
+ default:
+ LL_WARNS("AppInit") << "Unexpected SLURL type for SLURL string" << (int)mType << LL_ENDL;
+ return std::string();
+ }
}
-// static
-std::string LLSLURL::buildSLURLfromPosGlobal(const std::string& regionname,
- const LLVector3d& global_pos,
- bool escaped /*= true*/)
+std::string LLSLURL::getLoginString() const
{
- S32 x, y, z;
- globalPosToXYZ(global_pos, x, y, z);
- if(escaped)
+
+ std::stringstream unescaped_start;
+ switch(mType)
{
- return buildSLURL(regionname, x, y, z);
+ case LOCATION:
+ unescaped_start << "uri:"
+ << mRegion << "&"
+ << llround(mPosition[0]) << "&"
+ << llround(mPosition[1]) << "&"
+ << llround(mPosition[2]);
+ break;
+ case HOME_LOCATION:
+ unescaped_start << "home";
+ break;
+ case LAST_LOCATION:
+ unescaped_start << "last";
+ break;
+ default:
+ LL_WARNS("AppInit") << "Unexpected SLURL type for login string" << (int)mType << LL_ENDL;
+ break;
}
- else
+ return xml_escape_string(unescaped_start.str());
+}
+
+bool LLSLURL::operator==(const LLSLURL& rhs)
+{
+ if(rhs.mType != mType) return false;
+ switch(mType)
{
- return buildUnescapedSLURL(regionname, x, y, z);
+ case LOCATION:
+ return ((mGrid == rhs.mGrid) &&
+ (mRegion == rhs.mRegion) &&
+ (mPosition == rhs.mPosition));
+ case APP:
+ return getSLURLString() == rhs.getSLURLString();
+
+ case HOME_LOCATION:
+ case LAST_LOCATION:
+ return true;
+ default:
+ return false;
}
}
-// static
-bool LLSLURL::matchPrefix(const std::string& url, const std::string& prefix)
+bool LLSLURL::operator !=(const LLSLURL& rhs)
{
- std::string test_prefix = url.substr(0, prefix.length());
- LLStringUtil::toLower(test_prefix);
- return test_prefix == prefix;
+ return !(*this == rhs);
}
-void LLSLURL::globalPosToXYZ(const LLVector3d& pos, S32& x, S32& y, S32& z)
+std::string LLSLURL::getLocationString() const
{
- x = llround((F32)fmod(pos.mdV[VX], (F64)REGION_WIDTH_METERS));
- y = llround((F32)fmod(pos.mdV[VY], (F64)REGION_WIDTH_METERS));
- z = llround((F32)pos.mdV[VZ]);
+ return llformat("%s/%d/%d/%d",
+ mRegion.c_str(),
+ (int)llround(mPosition[0]),
+ (int)llround(mPosition[1]),
+ (int)llround(mPosition[2]));
}
+std::string LLSLURL::asString() const
+{
+ std::ostringstream result;
+ result << " mAppCmd:" << getAppCmd() <<
+ " mAppPath:" + getAppPath().asString() <<
+ " mAppQueryMap:" + getAppQueryMap().asString() <<
+ " mAppQuery: " + getAppQuery() <<
+ " mGrid: " + getGrid() <<
+ " mRegion: " + getRegion() <<
+ " mPosition: " <<
+ " mType: " << mType <<
+ " mPosition: " << mPosition;
+ return result.str();
+}
+
diff --git a/indra/newview/llslurl.h b/indra/newview/llslurl.h
index 21b32ce409..e9b0e7f52a 100644
--- a/indra/newview/llslurl.h
+++ b/indra/newview/llslurl.h
@@ -1,10 +1,11 @@
-/**
+/**
* @file llslurl.h
- * @brief SLURL manipulation
+ * @brief Handles "SLURL fragments" like Ahern/123/45 for
+ * startup processing, login screen, prefs, etc.
*
- * $LicenseInfo:firstyear=2009&license=viewergpl$
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
*
- * Copyright (c) 2009, Linden Research, Inc.
+ * Copyright (c) 2006-2010, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
@@ -12,13 +13,12 @@
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * online at http://secondlife.com/developers/opensource/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * online at http://secondlife.com/developers/opensource/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
@@ -29,79 +29,85 @@
* COMPLETENESS OR PERFORMANCE.
* $/LicenseInfo$
*/
+#ifndef LLSLURL_H
+#define LLSLURL_H
-#ifndef LL_SLURL_H
-#define LL_SLURL_H
+#include "llstring.h"
-#include <string>
-// IAN BUG: where should this live?
-// IAN BUG: are static utility functions right? See LLUUID.
-// question of whether to have a LLSLURL object or a
-// some of this was moved from LLURLDispatcher
+// represents a location in a grid
-/**
- * SLURL manipulation
- */
class LLSLURL
{
public:
- static const std::string PREFIX_SL_HELP;
- static const std::string PREFIX_SL;
- static const std::string PREFIX_SECONDLIFE;
- static const std::string PREFIX_SLURL;
- static const std::string PREFIX_SLURL_OLD;
-
- static const std::string APP_TOKEN;
-
- /**
- * Is this any sort of secondlife:// or sl:// URL?
- */
- static bool isSLURL(const std::string& url);
-
- /**
- * Is this a special secondlife://app/ URL?
- */
- static bool isSLURLCommand(const std::string& url);
-
- /**
- * Not sure what it is.
- */
- static bool isSLURLHelp(const std::string& url);
-
- /**
- * builds: http://slurl.com/secondlife/Region%20Name/x/y/z/ escaping result url.
- */
- static std::string buildSLURL(const std::string& regionname, S32 x, S32 y, S32 z);
-
- /// Build a SLURL like secondlife:///app/agent/<uuid>/inspect
- static std::string buildCommand(const char* noun, const LLUUID& id, const char* verb);
-
- /**
- * builds: http://slurl.com/secondlife/Region Name/x/y/z/ without escaping result url.
- */
- static std::string buildUnescapedSLURL(const std::string& regionname, S32 x, S32 y, S32 z);
-
- /**
- * builds SLURL from global position. Returns escaped or unescaped url.
- * Returns escaped url by default.
- */
- static std::string buildSLURLfromPosGlobal(const std::string& regionname,
- const LLVector3d& global_pos,
- bool escaped = true);
- /**
- * Strip protocol part from the URL.
- */
- static std::string stripProtocol(const std::string& url);
-
- /**
- * Convert global position to X, Y Z
- */
- static void globalPosToXYZ(const LLVector3d& pos, S32& x, S32& y, S32& z);
-
-private:
- static bool matchPrefix(const std::string& url, const std::string& prefix);
-
+ static const char* SLURL_HTTPS_SCHEME;
+ static const char* SLURL_HTTP_SCHEME;
+ static const char* SLURL_SL_SCHEME;
+ static const char* SLURL_SECONDLIFE_SCHEME;
+ static const char* SLURL_SECONDLIFE_PATH;
+ static const char* SLURL_COM;
+ static const char* WWW_SLURL_COM;
+ static const char* SECONDLIFE_COM;
+ static const char* MAPS_SECONDLIFE_COM;
+ static const char* SLURL_X_GRID_LOCATION_INFO_SCHEME;
+ static LLSLURL START_LOCATION;
+ static const char* SIM_LOCATION_HOME;
+ static const char* SIM_LOCATION_LAST;
+ static const char* SLURL_APP_PATH;
+ static const char* SLURL_REGION_PATH;
+
+ enum SLURL_TYPE {
+ INVALID,
+ LOCATION,
+ HOME_LOCATION,
+ LAST_LOCATION,
+ APP,
+ HELP
+ };
+
+
+ LLSLURL(): mType(INVALID) { }
+ LLSLURL(const std::string& slurl);
+ LLSLURL(const std::string& grid, const std::string& region);
+ LLSLURL(const std::string& region, const LLVector3& position);
+ LLSLURL(const std::string& grid, const std::string& region, const LLVector3& position);
+ LLSLURL(const std::string& grid, const std::string& region, const LLVector3d& global_position);
+ LLSLURL(const std::string& region, const LLVector3d& global_position);
+ LLSLURL(const std::string& command, const LLUUID&id, const std::string& verb);
+
+ SLURL_TYPE getType() const { return mType; }
+
+ std::string getSLURLString() const;
+ std::string getLoginString() const;
+ std::string getLocationString() const;
+ std::string getGrid() const { return mGrid; }
+ std::string getRegion() const { return mRegion; }
+ LLVector3 getPosition() const { return mPosition; }
+ std::string getAppCmd() const { return mAppCmd; }
+ std::string getAppQuery() const { return mAppQuery; }
+ LLSD getAppQueryMap() const { return mAppQueryMap; }
+ LLSD getAppPath() const { return mAppPath; }
+
+ bool isValid() const { return mType != INVALID; }
+ bool isSpatial() const { return (mType == LAST_LOCATION) || (mType == HOME_LOCATION) || (mType == LOCATION); }
+
+ bool operator==(const LLSLURL& rhs);
+ bool operator!=(const LLSLURL&rhs);
+
+ std::string asString() const ;
+
+protected:
+ SLURL_TYPE mType;
+
+ // used for Apps and Help
+ std::string mAppCmd;
+ LLSD mAppPath;
+ LLSD mAppQueryMap;
+ std::string mAppQuery;
+
+ std::string mGrid; // reference to grid manager grid
+ std::string mRegion;
+ LLVector3 mPosition;
};
-#endif
+#endif // LLSLURL_H
diff --git a/indra/newview/llspatialpartition.cpp b/indra/newview/llspatialpartition.cpp
index 2a57d48f16..d6e9256fee 100644
--- a/indra/newview/llspatialpartition.cpp
+++ b/indra/newview/llspatialpartition.cpp
@@ -3380,7 +3380,8 @@ LLDrawInfo::LLDrawInfo(U16 start, U16 end, U32 count, U32 offset,
mVSize(0.f),
mGroup(NULL),
mFace(NULL),
- mDistance(0.f)
+ mDistance(0.f),
+ mDrawMode(LLRender::TRIANGLES)
{
mDebugColor = (rand() << 16) + rand();
if (mStart >= mVertexBuffer->getRequestedVerts() ||
diff --git a/indra/newview/llspatialpartition.h b/indra/newview/llspatialpartition.h
index 64c2a9acbc..7896488379 100644
--- a/indra/newview/llspatialpartition.h
+++ b/indra/newview/llspatialpartition.h
@@ -93,6 +93,7 @@ public:
LLFace* mFace; //associated face
F32 mDistance;
LLVector3 mExtents[2];
+ U32 mDrawMode;
struct CompareTexture
{
diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp
index c5c311ed33..d7de050636 100644
--- a/indra/newview/llspeakbutton.cpp
+++ b/indra/newview/llspeakbutton.cpp
@@ -59,9 +59,9 @@ LLSpeakButton::Params::Params()
void LLSpeakButton::draw()
{
- // gVoiceClient is the authoritative global source of info regarding our open-mic state, we merely reflect that state.
- bool openmic = gVoiceClient->getUserPTTState();
- bool voiceenabled = gVoiceClient->voiceEnabled();
+ // LLVoiceClient::getInstance() is the authoritative global source of info regarding our open-mic state, we merely reflect that state.
+ bool openmic = LLVoiceClient::getInstance()->getUserPTTState();
+ bool voiceenabled = LLVoiceClient::getInstance()->voiceEnabled();
mSpeakBtn->setToggleState(openmic && voiceenabled);
mOutputMonitor->setIsMuted(!voiceenabled);
LLUICtrl::draw();
@@ -176,11 +176,11 @@ void LLSpeakButton::setLabelVisible(bool visible)
void LLSpeakButton::onMouseDown_SpeakBtn()
{
bool down = true;
- gVoiceClient->inputUserControlState(down); // this method knows/care about whether this translates into a toggle-to-talk or down-to-talk
+ LLVoiceClient::getInstance()->inputUserControlState(down); // this method knows/care about whether this translates into a toggle-to-talk or down-to-talk
}
void LLSpeakButton::onMouseUp_SpeakBtn()
{
bool down = false;
- gVoiceClient->inputUserControlState(down);
+ LLVoiceClient::getInstance()->inputUserControlState(down);
}
diff --git a/indra/newview/llspeakers.cpp b/indra/newview/llspeakers.cpp
index 786fa24e65..bf00b47c21 100644
--- a/indra/newview/llspeakers.cpp
+++ b/indra/newview/llspeakers.cpp
@@ -37,7 +37,6 @@
#include "llagent.h"
#include "llappviewer.h"
#include "llimview.h"
-#include "llmutelist.h"
#include "llsdutil.h"
#include "lluicolortable.h"
#include "llviewerobjectlist.h"
@@ -85,7 +84,7 @@ void LLSpeaker::onAvatarNameLookup(const LLUUID& id, const std::string& first, c
bool LLSpeaker::isInVoiceChannel()
{
- return mStatus == LLSpeaker::STATUS_VOICE_ACTIVE || mStatus == LLSpeaker::STATUS_MUTED;
+ return mStatus <= LLSpeaker::STATUS_VOICE_ACTIVE || mStatus == LLSpeaker::STATUS_MUTED;
}
LLSpeakerUpdateModeratorEvent::LLSpeakerUpdateModeratorEvent(LLSpeaker* source)
@@ -175,6 +174,11 @@ BOOL LLSpeakerActionTimer::tick()
return TRUE;
}
+void LLSpeakerActionTimer::unset()
+{
+ mActionCallback = 0;
+}
+
LLSpeakersDelayActionsStorage::LLSpeakersDelayActionsStorage(LLSpeakerActionTimer::action_callback_t action_cb, F32 action_delay)
: mActionCallback(action_cb)
, mActionDelay(action_delay)
@@ -205,7 +209,7 @@ void LLSpeakersDelayActionsStorage::setActionTimer(const LLUUID& speaker_id)
}
}
-void LLSpeakersDelayActionsStorage::unsetActionTimer(const LLUUID& speaker_id, bool delete_it)
+void LLSpeakersDelayActionsStorage::unsetActionTimer(const LLUUID& speaker_id)
{
if (mActionTimersMap.size() == 0) return;
@@ -213,10 +217,7 @@ void LLSpeakersDelayActionsStorage::unsetActionTimer(const LLUUID& speaker_id, b
if (it_speaker != mActionTimersMap.end())
{
- if (delete_it)
- {
- delete it_speaker->second;
- }
+ it_speaker->second->unset();
mActionTimersMap.erase(it_speaker);
}
}
@@ -233,8 +234,7 @@ void LLSpeakersDelayActionsStorage::removeAllTimers()
bool LLSpeakersDelayActionsStorage::onTimerActionCallback(const LLUUID& speaker_id)
{
- bool delete_it = false; // we're *in* this timer, return true to delete it, don't manually delete it
- unsetActionTimer(speaker_id, delete_it);
+ unsetActionTimer(speaker_id);
if (mActionCallback)
{
@@ -251,6 +251,8 @@ bool LLSpeakersDelayActionsStorage::onTimerActionCallback(const LLUUID& speaker_
LLSpeakerMgr::LLSpeakerMgr(LLVoiceChannel* channelp) :
mVoiceChannel(channelp)
+, mVoiceModerated(false)
+, mModerateModeHandledFirstTime(false)
{
static LLUICachedControl<F32> remove_delay ("SpeakerParticipantRemoveDelay", 10.0);
@@ -293,15 +295,40 @@ LLPointer<LLSpeaker> LLSpeakerMgr::setSpeaker(const LLUUID& id, const std::strin
}
}
- bool delete_it = true;
- mSpeakerDelayRemover->unsetActionTimer(speakerp->mID, delete_it);
-
+ mSpeakerDelayRemover->unsetActionTimer(speakerp->mID);
return speakerp;
}
+// *TODO: Once way to request the current voice channel moderation mode is implemented
+// this method with related code should be removed.
+/*
+ Initializes "moderate_mode" of voice session on first join.
+
+ This is WORKAROUND because a way to request the current voice channel moderation mode exists
+ but is not implemented in viewer yet. See EXT-6937.
+*/
+void LLSpeakerMgr::initVoiceModerateMode()
+{
+ if (!mModerateModeHandledFirstTime && (mVoiceChannel && mVoiceChannel->isActive()))
+ {
+ LLPointer<LLSpeaker> speakerp;
+
+ if (mSpeakers.find(gAgentID) != mSpeakers.end())
+ {
+ speakerp = mSpeakers[gAgentID];
+ }
+
+ if (speakerp.notNull())
+ {
+ mVoiceModerated = speakerp->mModeratorMutedVoice;
+ mModerateModeHandledFirstTime = true;
+ }
+ }
+}
+
void LLSpeakerMgr::update(BOOL resort_ok)
{
- if (!gVoiceClient)
+ if (!LLVoiceClient::getInstance())
{
return;
}
@@ -315,7 +342,7 @@ void LLSpeakerMgr::update(BOOL resort_ok)
}
// update status of all current speakers
- BOOL voice_channel_active = (!mVoiceChannel && gVoiceClient->inProximalChannel()) || (mVoiceChannel && mVoiceChannel->isActive());
+ BOOL voice_channel_active = (!mVoiceChannel && LLVoiceClient::getInstance()->inProximalChannel()) || (mVoiceChannel && mVoiceChannel->isActive());
for (speaker_map_t::iterator speaker_it = mSpeakers.begin(); speaker_it != mSpeakers.end();)
{
LLUUID speaker_id = speaker_it->first;
@@ -323,21 +350,21 @@ void LLSpeakerMgr::update(BOOL resort_ok)
speaker_map_t::iterator cur_speaker_it = speaker_it++;
- if (voice_channel_active && gVoiceClient->getVoiceEnabled(speaker_id))
+ if (voice_channel_active && LLVoiceClient::getInstance()->getVoiceEnabled(speaker_id))
{
- speakerp->mSpeechVolume = gVoiceClient->getCurrentPower(speaker_id);
- BOOL moderator_muted_voice = gVoiceClient->getIsModeratorMuted(speaker_id);
+ speakerp->mSpeechVolume = LLVoiceClient::getInstance()->getCurrentPower(speaker_id);
+ BOOL moderator_muted_voice = LLVoiceClient::getInstance()->getIsModeratorMuted(speaker_id);
if (moderator_muted_voice != speakerp->mModeratorMutedVoice)
{
speakerp->mModeratorMutedVoice = moderator_muted_voice;
speakerp->fireEvent(new LLSpeakerVoiceModerationEvent(speakerp));
}
- if (gVoiceClient->getOnMuteList(speaker_id) || speakerp->mModeratorMutedVoice)
+ if (LLVoiceClient::getInstance()->getOnMuteList(speaker_id) || speakerp->mModeratorMutedVoice)
{
speakerp->mStatus = LLSpeaker::STATUS_MUTED;
}
- else if (gVoiceClient->getIsSpeaking(speaker_id))
+ else if (LLVoiceClient::getInstance()->getIsSpeaking(speaker_id))
{
// reset inactivity expiration
if (speakerp->mStatus != LLSpeaker::STATUS_SPEAKING)
@@ -419,19 +446,21 @@ void LLSpeakerMgr::update(BOOL resort_ok)
void LLSpeakerMgr::updateSpeakerList()
{
// are we bound to the currently active voice channel?
- if ((!mVoiceChannel && gVoiceClient->inProximalChannel()) || (mVoiceChannel && mVoiceChannel->isActive()))
- {
- LLVoiceClient::participantMap* participants = gVoiceClient->getParticipantList();
- if(participants)
+ if ((!mVoiceChannel && LLVoiceClient::getInstance()->inProximalChannel()) || (mVoiceChannel && mVoiceChannel->isActive()))
+ {
+ std::set<LLUUID> participants;
+ LLVoiceClient::getInstance()->getParticipantList(participants);
+ // add new participants to our list of known speakers
+ for (std::set<LLUUID>::iterator participant_it = participants.begin();
+ participant_it != participants.end();
+ ++participant_it)
{
- LLVoiceClient::participantMap::iterator participant_it;
+ setSpeaker(*participant_it,
+ LLVoiceClient::getInstance()->getDisplayName(*participant_it),
+ LLSpeaker::STATUS_VOICE_ACTIVE,
+ (LLVoiceClient::getInstance()->isParticipantAvatar(*participant_it)?LLSpeaker::SPEAKER_AGENT:LLSpeaker::SPEAKER_EXTERNAL));
+
- // add new participants to our list of known speakers
- for (participant_it = participants->begin(); participant_it != participants->end(); ++participant_it)
- {
- LLVoiceClient::participantState* participantp = participant_it->second;
- setSpeaker(participantp->mAvatarID, participantp->mDisplayName, LLSpeaker::STATUS_VOICE_ACTIVE, (participantp->isAvatar()?LLSpeaker::SPEAKER_AGENT:LLSpeaker::SPEAKER_EXTERNAL));
- }
}
}
}
@@ -521,7 +550,7 @@ void LLSpeakerMgr::speakerChatted(const LLUUID& speaker_id)
BOOL LLSpeakerMgr::isVoiceActive()
{
// mVoiceChannel = NULL means current voice channel, whatever it is
- return LLVoiceClient::voiceEnabled() && mVoiceChannel && mVoiceChannel->isActive();
+ return LLVoiceClient::getInstance()->voiceEnabled() && mVoiceChannel && mVoiceChannel->isActive();
}
@@ -761,43 +790,26 @@ void LLIMSpeakerMgr::moderateVoiceParticipant(const LLUUID& avatar_id, bool unmu
new ModerationResponder(getSessionID()));
}
-void LLIMSpeakerMgr::moderateVoiceOtherParticipants(const LLUUID& excluded_avatar_id, bool unmute_everyone_else)
+void LLIMSpeakerMgr::moderateVoiceAllParticipants( bool unmute_everyone )
{
- // *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);
+ if (mVoiceModerated == !unmute_everyone)
+ {
+ // session already in requested state. Just force participants which do not match it.
+ forceVoiceModeratedMode(mVoiceModerated);
+ }
+ else
+ {
+ // otherwise set moderated mode for a whole session.
+ moderateVoiceSession(getSessionID(), !unmute_everyone);
+ }
}
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;
+ mVoiceModerated = session_update["moderated_mode"]["voice"];
}
}
@@ -817,6 +829,20 @@ void LLIMSpeakerMgr::moderateVoiceSession(const LLUUID& session_id, bool disallo
LLHTTPClient::post(url, data, new ModerationResponder(session_id));
}
+void LLIMSpeakerMgr::forceVoiceModeratedMode(bool should_be_muted)
+{
+ for (speaker_map_t::iterator speaker_it = mSpeakers.begin(); speaker_it != mSpeakers.end(); ++speaker_it)
+ {
+ LLUUID speaker_id = speaker_it->first;
+ LLSpeaker* speakerp = speaker_it->second;
+
+ // participant does not match requested state
+ if (should_be_muted != (bool)speakerp->mModeratorMutedVoice)
+ {
+ moderateVoiceParticipant(speaker_id, !should_be_muted);
+ }
+ }
+}
//
// LLActiveSpeakerMgr
@@ -881,7 +907,7 @@ void LLLocalSpeakerMgr::updateSpeakerList()
}
// pick up non-voice speakers in chat range
- std::vector<LLUUID> avatar_ids;
+ uuid_vec_t avatar_ids;
std::vector<LLVector3d> positions;
LLWorld::getInstance()->getAvatars(&avatar_ids, &positions, gAgent.getPositionGlobal(), CHAT_NORMAL_RADIUS);
for(U32 i=0; i<avatar_ids.size(); i++)
diff --git a/indra/newview/llspeakers.h b/indra/newview/llspeakers.h
index ddc3632f07..4a250de82f 100644
--- a/indra/newview/llspeakers.h
+++ b/indra/newview/llspeakers.h
@@ -34,6 +34,7 @@
#define LL_LLSPEAKERS_H
#include "llevent.h"
+#include "lleventtimer.h"
#include "llspeakers.h"
#include "llvoicechannel.h"
@@ -155,6 +156,13 @@ public:
*/
virtual BOOL tick();
+ /**
+ * Clears the callback.
+ *
+ * Use this instead of deleteing this object.
+ * The next call to tick() will return true and that will destroy this object.
+ */
+ void unset();
private:
action_callback_t mActionCallback;
LLUUID mSpeakerId;
@@ -180,7 +188,7 @@ public:
*
* @see onTimerActionCallback()
*/
- void unsetActionTimer(const LLUUID& speaker_id, bool delete_it);
+ void unsetActionTimer(const LLUUID& speaker_id);
void removeAllTimers();
private:
@@ -188,7 +196,6 @@ private:
* Callback of the each instance of LLSpeakerActionTimer.
*
* Unsets an appropriate timer instance and calls action callback for specified speacker_id.
- * It always returns false to not use LLEventTimer::updateClass functionality of timer deleting.
*
* @see unsetActionTimer()
*/
@@ -227,6 +234,21 @@ public:
LLVoiceChannel* getVoiceChannel() { return mVoiceChannel; }
const LLUUID getSessionID();
+ /**
+ * Removes avaline speaker.
+ *
+ * This is a HACK due to server does not send information that Avaline caller ends call.
+ * It can be removed when server is updated. See EXT-4301 for details
+ */
+ bool removeAvalineSpeaker(const LLUUID& speaker_id) { return removeSpeaker(speaker_id); }
+
+ /**
+ * Initializes mVoiceModerated depend on LLSpeaker::mModeratorMutedVoice of agent's participant.
+ *
+ * Is used only to implement workaround to initialize mVoiceModerated on first join to group chat. See EXT-6937
+ */
+ void initVoiceModerateMode();
+
protected:
virtual void updateSpeakerList();
void setSpeakerNotInChannel(LLSpeaker* speackerp);
@@ -243,6 +265,14 @@ protected:
* time out speakers when they are not part of current session
*/
LLSpeakersDelayActionsStorage* mSpeakerDelayRemover;
+
+ // *TODO: should be moved back into LLIMSpeakerMgr when a way to request the current voice channel
+ // moderation mode is implemented: See EXT-6937
+ bool mVoiceModerated;
+
+ // *TODO: To be removed when a way to request the current voice channel
+ // moderation mode is implemented: See EXT-6937
+ bool mModerateModeHandledFirstTime;
};
class LLIMSpeakerMgr : public LLSpeakerMgr
@@ -264,22 +294,21 @@ public:
* @param[in] avatar_id UUID of avatar to be processed
* @param[in] unmute if false - specified avatar will be muted, otherwise - unmuted.
*
- * @see moderateVoiceOtherParticipants()
+ * @see moderateVoiceAllParticipants()
*/
void moderateVoiceParticipant(const LLUUID& avatar_id, bool unmute);
/**
- * Mutes/Unmutes all avatars except specified for current group voice chat.
+ * Mutes/Unmutes all avatars 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.
+ * It calls forceVoiceModeratedMode() in case of session is already in requested state.
*
- * @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.
+ * @param[in] unmute_everyone if false - avatars will be muted, otherwise - unmuted.
*
* @see moderateVoiceParticipant()
*/
- void moderateVoiceOtherParticipants(const LLUUID& excluded_avatar_id, bool unmute_everyone_else);
+ void moderateVoiceAllParticipants(bool unmute_everyone);
void processSessionUpdate(const LLSD& session_update);
@@ -288,7 +317,11 @@ protected:
void moderateVoiceSession(const LLUUID& session_id, bool disallow_voice);
- LLUUID mReverseVoiceModeratedAvatarID;
+ /**
+ * Process all participants to mute/unmute them according to passed voice session state.
+ */
+ void forceVoiceModeratedMode(bool should_be_muted);
+
};
class LLActiveSpeakerMgr : public LLSpeakerMgr, public LLSingleton<LLActiveSpeakerMgr>
diff --git a/indra/newview/llspeakingindicatormanager.cpp b/indra/newview/llspeakingindicatormanager.cpp
index d33c050ee4..ea7601517d 100644
--- a/indra/newview/llspeakingindicatormanager.cpp
+++ b/indra/newview/llspeakingindicatormanager.cpp
@@ -65,8 +65,12 @@ public:
*
* @param speaker_id LLUUID of an avatar whose speaking indicator is registered.
* @param speaking_indicator instance of the speaking indicator to be registered.
+ * @param session_id session UUID for which indicator should be shown only.
+ * If this parameter is set registered indicator will be shown only in voice channel
+ * which has the same session id (EXT-5562).
*/
- void registerSpeakingIndicator(const LLUUID& speaker_id, LLSpeakingIndicator* const speaking_indicator);
+ void registerSpeakingIndicator(const LLUUID& speaker_id, LLSpeakingIndicator* const speaking_indicator,
+ const LLUUID& session_id = LLUUID::null);
/**
* Removes passed speaking indicator from observing.
@@ -103,7 +107,7 @@ private:
* So, method does not calculate difference between these list it only switches off already
* switched on indicators and switches on indicators of voice channel participants
*/
- void onChange();
+ void onParticipantsChanged();
/**
* Changes state of indicators specified by LLUUIDs
@@ -138,20 +142,23 @@ private:
//////////////////////////////////////////////////////////////////////////
// PUBLIC SECTION
//////////////////////////////////////////////////////////////////////////
-void SpeakingIndicatorManager::registerSpeakingIndicator(const LLUUID& speaker_id, LLSpeakingIndicator* const speaking_indicator)
+void SpeakingIndicatorManager::registerSpeakingIndicator(const LLUUID& speaker_id, LLSpeakingIndicator* const speaking_indicator,
+ const LLUUID& session_id)
{
// do not exclude agent's indicators. They should be processed in the same way as others. See EXT-3889.
- LL_DEBUGS("SpeakingIndicator") << "Registering indicator: " << speaker_id << "|"<< speaking_indicator << LL_ENDL;
+ LL_DEBUGS("SpeakingIndicator") << "Registering indicator: " << speaker_id << "|"<< speaking_indicator << ", session: " << session_id << LL_ENDL;
ensureInstanceDoesNotExist(speaking_indicator);
+ speaking_indicator->setTargetSessionID(session_id);
+
speaking_indicator_value_t value_type(speaker_id, speaking_indicator);
mSpeakingIndicators.insert(value_type);
speaker_ids_t speakers_uuids;
- BOOL is_in_same_voice = LLVoiceClient::getInstance()->findParticipantByID(speaker_id) != NULL;
+ BOOL is_in_same_voice = LLVoiceClient::getInstance()->isParticipant(speaker_id);
speakers_uuids.insert(speaker_id);
switchSpeakerIndicators(speakers_uuids, is_in_same_voice);
@@ -198,12 +205,12 @@ void SpeakingIndicatorManager::sOnCurrentChannelChanged(const LLUUID& /*session_
mSwitchedIndicatorsOn.clear();
}
-void SpeakingIndicatorManager::onChange()
+void SpeakingIndicatorManager::onParticipantsChanged()
{
LL_DEBUGS("SpeakingIndicator") << "Voice participant list was changed, updating indicators" << LL_ENDL;
speaker_ids_t speakers_uuids;
- LLVoiceClient::getInstance()->getParticipantsUUIDSet(speakers_uuids);
+ LLVoiceClient::getInstance()->getParticipantList(speakers_uuids);
LL_DEBUGS("SpeakingIndicator") << "Switching all OFF, count: " << mSwitchedIndicatorsOn.size() << LL_ENDL;
// switch all indicators off
@@ -217,6 +224,13 @@ void SpeakingIndicatorManager::onChange()
void SpeakingIndicatorManager::switchSpeakerIndicators(const speaker_ids_t& speakers_uuids, BOOL switch_on)
{
+ LLVoiceChannel* voice_channel = LLVoiceChannel::getCurrentVoiceChannel();
+ LLUUID session_id;
+ if (voice_channel)
+ {
+ session_id = voice_channel->getSessionID();
+ }
+
speaker_ids_t::const_iterator it_uuid = speakers_uuids.begin();
for (; it_uuid != speakers_uuids.end(); ++it_uuid)
{
@@ -224,18 +238,36 @@ void SpeakingIndicatorManager::switchSpeakerIndicators(const speaker_ids_t& spea
indicator_range_t it_range = mSpeakingIndicators.equal_range(*it_uuid);
indicator_const_iterator it_indicator = it_range.first;
bool was_found = false;
+ bool was_switched_on = false;
for (; it_indicator != it_range.second; ++it_indicator)
{
was_found = true;
LLSpeakingIndicator* indicator = (*it_indicator).second;
- indicator->switchIndicator(switch_on);
+
+ BOOL switch_current_on = switch_on;
+
+ // we should show indicator for specified voice session only if this is current channel. EXT-5562.
+ if (switch_current_on && indicator->getTargetSessionID().notNull())
+ {
+ switch_current_on = indicator->getTargetSessionID() == session_id;
+ LL_DEBUGS("SpeakingIndicator") << "Session: " << session_id << ", target: " << indicator->getTargetSessionID() << ", the same? = " << switch_current_on << LL_ENDL;
+ }
+ was_switched_on = was_switched_on || switch_current_on;
+
+ indicator->switchIndicator(switch_current_on);
+
}
if (was_found)
{
LL_DEBUGS("SpeakingIndicator") << mSpeakingIndicators.count(*it_uuid) << " indicators where found" << LL_ENDL;
- if (switch_on)
+ if (switch_on && !was_switched_on)
+ {
+ LL_DEBUGS("SpeakingIndicator") << "but non of them where switched on" << LL_ENDL;
+ }
+
+ if (was_switched_on)
{
// store switched on indicator to be able switch it off
mSwitchedIndicatorsOn.insert(*it_uuid);
@@ -274,9 +306,10 @@ void SpeakingIndicatorManager::ensureInstanceDoesNotExist(LLSpeakingIndicator* c
/* LLSpeakingIndicatorManager namespace implementation */
/************************************************************************/
-void LLSpeakingIndicatorManager::registerSpeakingIndicator(const LLUUID& speaker_id, LLSpeakingIndicator* const speaking_indicator)
+void LLSpeakingIndicatorManager::registerSpeakingIndicator(const LLUUID& speaker_id, LLSpeakingIndicator* const speaking_indicator,
+ const LLUUID& session_id)
{
- SpeakingIndicatorManager::instance().registerSpeakingIndicator(speaker_id, speaking_indicator);
+ SpeakingIndicatorManager::instance().registerSpeakingIndicator(speaker_id, speaking_indicator, session_id);
}
void LLSpeakingIndicatorManager::unregisterSpeakingIndicator(const LLUUID& speaker_id, const LLSpeakingIndicator* const speaking_indicator)
diff --git a/indra/newview/llspeakingindicatormanager.h b/indra/newview/llspeakingindicatormanager.h
index ce0158f7d8..8d7aba1d6c 100644
--- a/indra/newview/llspeakingindicatormanager.h
+++ b/indra/newview/llspeakingindicatormanager.h
@@ -35,10 +35,28 @@
#ifndef LL_LLSPEAKINGINDICATORMANAGER_H
#define LL_LLSPEAKINGINDICATORMANAGER_H
+class SpeakingIndicatorManager;
+
class LLSpeakingIndicator
{
public:
+ virtual ~LLSpeakingIndicator(){}
virtual void switchIndicator(bool switch_on) = 0;
+
+private:
+ friend class SpeakingIndicatorManager;
+ // Accessors for target voice session UUID.
+ // They are intended to be used only from SpeakingIndicatorManager to ensure target session is
+ // the same indicator was registered with.
+ void setTargetSessionID(const LLUUID& session_id) { mTargetSessionID = session_id; }
+ const LLUUID& getTargetSessionID() { return mTargetSessionID; }
+
+ /**
+ * session UUID for which indicator should be shown only.
+ * If it is set, registered indicator will be shown only in voice channel
+ * which has the same session id (EXT-5562).
+ */
+ LLUUID mTargetSessionID;
};
// See EXT-3976.
@@ -52,8 +70,12 @@ namespace LLSpeakingIndicatorManager
*
* @param speaker_id LLUUID of an avatar whose speaker indicator is registered.
* @param speaking_indicator instance of the speaker indicator to be registered.
+ * @param session_id session UUID for which indicator should be shown only.
+ * If this parameter is set registered indicator will be shown only in voice channel
+ * which has the same session id (EXT-5562).
*/
- void registerSpeakingIndicator(const LLUUID& speaker_id, LLSpeakingIndicator* const speaking_indicator);
+ void registerSpeakingIndicator(const LLUUID& speaker_id, LLSpeakingIndicator* const speaking_indicator,
+ const LLUUID& session_id);
/**
* Removes passed speaking indicator from observing.
diff --git a/indra/newview/llsplitbutton.cpp b/indra/newview/llsplitbutton.cpp
index ffd9bc7624..e5323db466 100644
--- a/indra/newview/llsplitbutton.cpp
+++ b/indra/newview/llsplitbutton.cpp
@@ -165,7 +165,7 @@ void LLSplitButton::showButtons()
// register ourselves as a "top" control
// effectively putting us into a special draw layer
- gFocusMgr.setTopCtrl(this);
+ gViewerWindow->addPopup(this);
mItemsPanel->setFocus(TRUE);
@@ -182,10 +182,7 @@ void LLSplitButton::hideButtons()
mArrowBtn->setToggleState(FALSE);
setUseBoundingRect(FALSE);
- if(gFocusMgr.getTopCtrl() == this)
- {
- gFocusMgr.setTopCtrl(NULL);
- }
+ gViewerWindow->removePopup(this);
}
diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp
index a402dfc3d1..96088fed9c 100644
--- a/indra/newview/llstartup.cpp
+++ b/indra/newview/llstartup.cpp
@@ -62,6 +62,7 @@
#include "llimfloater.h"
#include "lllocationhistory.h"
#include "llimageworker.h"
+
#include "llloginflags.h"
#include "llmd5.h"
#include "llmemorystream.h"
@@ -88,6 +89,7 @@
#include "v3math.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llagentpicksinfo.h"
#include "llagentwearables.h"
#include "llagentpilot.h"
@@ -115,15 +117,15 @@
#include "llimagebmp.h"
#include "llinventorybridge.h"
#include "llinventorymodel.h"
+#include "llinventorymodelbackgroundfetch.h"
#include "llfriendcard.h"
#include "llkeyboard.h"
#include "llloginhandler.h" // gLoginHandler, SLURL support
#include "lllogininstance.h" // Host the login module.
#include "llpanellogin.h"
#include "llmutelist.h"
-#include "llpanelavatar.h"
#include "llavatarpropertiesprocessor.h"
-#include "llpanelevent.h"
+#include "llfloaterevent.h"
#include "llpanelclassified.h"
#include "llpanelpick.h"
#include "llpanelplace.h"
@@ -135,16 +137,17 @@
#include "llsecondlifeurls.h"
#include "llselectmgr.h"
#include "llsky.h"
+#include "llsidetray.h"
#include "llstatview.h"
-#include "lltrans.h"
#include "llstatusbar.h" // sendMoneyBalanceRequest(), owns L$ balance
#include "llsurface.h"
#include "lltexturecache.h"
#include "lltexturefetch.h"
#include "lltoolmgr.h"
+#include "lltrans.h"
#include "llui.h"
#include "llurldispatcher.h"
-#include "llurlsimstring.h"
+#include "llslurl.h"
#include "llurlhistory.h"
#include "llurlwhitelist.h"
#include "llvieweraudio.h"
@@ -189,20 +192,16 @@
#include "llinventorybridge.h"
#include "llappearancemgr.h"
#include "llavatariconctrl.h"
+#include "llvoicechannel.h"
#include "lllogin.h"
#include "llevents.h"
#include "llstartuplistener.h"
#if LL_WINDOWS
-#include "llwindebug.h"
#include "lldxhardware.h"
#endif
-#if (LL_LINUX || LL_SOLARIS) && LL_GTK
-#include <glib/gspawn.h>
-#endif
-
//
// exported globals
//
@@ -225,15 +224,16 @@ extern S32 gStartImageHeight;
static bool gGotUseCircuitCodeAck = false;
static std::string sInitialOutfit;
static std::string sInitialOutfitGender; // "male" or "female"
+static boost::signals2::connection sWearablesLoadedCon;
static bool gUseCircuitCallbackCalled = false;
EStartupState LLStartUp::gStartupState = STATE_FIRST;
+LLSLURL LLStartUp::sStartSLURL;
-// *NOTE:Mani - to reconcile with giab changes...
-static std::string gFirstname;
-static std::string gLastname;
-static std::string gPassword;
+static LLPointer<LLCredential> gUserCredential;
+static std::string gDisplayName;
+static BOOL gRememberPassword = TRUE;
static U64 gFirstSimHandle = 0;
static LLHost gFirstSim;
@@ -250,7 +250,6 @@ boost::scoped_ptr<LLStartupListener> LLStartUp::sListener(new LLStartupListener(
void login_show();
void login_callback(S32 option, void* userdata);
-bool is_hex_string(U8* str, S32 len);
void show_first_run_dialog();
bool first_run_dialog_callback(const LLSD& notification, const LLSD& response);
void set_startup_status(const F32 frac, const std::string& string, const std::string& msg);
@@ -263,6 +262,9 @@ bool callback_choose_gender(const LLSD& notification, const LLSD& response);
void init_start_screen(S32 location_id);
void release_start_screen();
void reset_login();
+LLSD transform_cert_args(LLPointer<LLCertificate> cert);
+void general_cert_done(const LLSD& notification, const LLSD& response);
+void trust_cert_done(const LLSD& notification, const LLSD& response);
void apply_udp_blacklist(const std::string& csv);
bool process_login_success_response();
void transition_back_to_login_panel(const std::string& emsg);
@@ -365,7 +367,7 @@ bool idle_startup()
if ( STATE_FIRST == LLStartUp::getStartupState() )
{
- gViewerWindow->showCursor();
+ gViewerWindow->showCursor();
gViewerWindow->getWindow()->setCursor(UI_CURSOR_WAIT);
/////////////////////////////////////////////////
@@ -382,13 +384,22 @@ bool idle_startup()
{
LLNotificationsUtil::add("DisplaySetToRecommended");
}
+ else if ((gSavedSettings.getS32("LastGPUClass") != LLFeatureManager::getInstance()->getGPUClass()) &&
+ (gSavedSettings.getS32("LastGPUClass") != -1))
+ {
+ LLNotificationsUtil::add("DisplaySetToRecommended");
+ }
else if (!gViewerWindow->getInitAlert().empty())
{
LLNotificationsUtil::add(gViewerWindow->getInitAlert());
}
gSavedSettings.setS32("LastFeatureVersion", LLFeatureManager::getInstance()->getVersion());
+ gSavedSettings.setS32("LastGPUClass", LLFeatureManager::getInstance()->getGPUClass());
+ // load dynamic GPU/feature tables from website (S3)
+ LLFeatureManager::getInstance()->fetchHTTPTables();
+
std::string xml_file = LLUI::locateSkin("xui_version.xml");
LLXMLNodePtr root;
bool xml_ok = false;
@@ -565,7 +576,7 @@ bool idle_startup()
gXferManager->setUseAckThrottling(TRUE);
gXferManager->setAckThrottleBPS(xfer_throttle_bps);
}
- gAssetStorage = new LLViewerAssetStorage(msg, gXferManager, gVFS);
+ gAssetStorage = new LLViewerAssetStorage(msg, gXferManager, gVFS, gStaticVFS);
F32 dropPercent = gSavedSettings.getF32("PacketDropPercentage");
@@ -663,69 +674,25 @@ bool idle_startup()
//
// Log on to system
//
- if (!LLStartUp::sSLURLCommand.empty())
- {
- // this might be a secondlife:///app/login URL
- gLoginHandler.parseDirectLogin(LLStartUp::sSLURLCommand);
- }
- if (!gLoginHandler.getFirstName().empty()
- || !gLoginHandler.getLastName().empty()
- /*|| !gLoginHandler.getWebLoginKey().isNull()*/ )
- {
- // We have at least some login information on a SLURL
- gFirstname = gLoginHandler.getFirstName();
- gLastname = gLoginHandler.getLastName();
- LL_DEBUGS("LLStartup") << "STATE_FIRST: setting gFirstname, gLastname from gLoginHandler: '" << gFirstname << "' '" << gLastname << "'" << LL_ENDL;
-
- // Show the login screen if we don't have everything
- show_connect_box =
- gFirstname.empty() || gLastname.empty();
- }
- else if(gSavedSettings.getLLSD("UserLoginInfo").size() == 3)
- {
- LLSD cmd_line_login = gSavedSettings.getLLSD("UserLoginInfo");
- gFirstname = cmd_line_login[0].asString();
- gLastname = cmd_line_login[1].asString();
- LL_DEBUGS("LLStartup") << "Setting gFirstname, gLastname from gSavedSettings(\"UserLoginInfo\"): '" << gFirstname << "' '" << gLastname << "'" << LL_ENDL;
-
- LLMD5 pass((unsigned char*)cmd_line_login[2].asString().c_str());
- char md5pass[33]; /* Flawfinder: ignore */
- pass.hex_digest(md5pass);
- gPassword = md5pass;
-
-#ifdef USE_VIEWER_AUTH
- show_connect_box = true;
-#else
- show_connect_box = false;
-#endif
- gSavedSettings.setBOOL("AutoLogin", TRUE);
- }
- else if (gSavedSettings.getBOOL("AutoLogin"))
- {
- gFirstname = gSavedSettings.getString("FirstName");
- gLastname = gSavedSettings.getString("LastName");
- LL_DEBUGS("LLStartup") << "AutoLogin: setting gFirstname, gLastname from gSavedSettings(\"First|LastName\"): '" << gFirstname << "' '" << gLastname << "'" << LL_ENDL;
- gPassword = LLStartUp::loadPasswordFromDisk();
- gSavedSettings.setBOOL("RememberPassword", TRUE);
-
-#ifdef USE_VIEWER_AUTH
- show_connect_box = true;
-#else
- show_connect_box = false;
-#endif
+ if (gUserCredential.isNull())
+ {
+ gUserCredential = gLoginHandler.initializeLoginInfo();
}
- else
+ if (gUserCredential.isNull())
{
- // if not automatically logging in, display login dialog
- // a valid grid is selected
- gFirstname = gSavedSettings.getString("FirstName");
- gLastname = gSavedSettings.getString("LastName");
- LL_DEBUGS("LLStartup") << "normal login: setting gFirstname, gLastname from gSavedSettings(\"First|LastName\"): '" << gFirstname << "' '" << gLastname << "'" << LL_ENDL;
- gPassword = LLStartUp::loadPasswordFromDisk();
- show_connect_box = true;
+ show_connect_box = TRUE;
+ }
+ else if (gSavedSettings.getBOOL("AutoLogin"))
+ {
+ gRememberPassword = TRUE;
+ gSavedSettings.setBOOL("RememberPassword", TRUE);
+ show_connect_box = false;
+ }
+ else
+ {
+ gRememberPassword = gSavedSettings.getBOOL("RememberPassword");
+ show_connect_box = TRUE;
}
-
-
// Go to the next startup state
LLStartUp::setStartupState( STATE_BROWSER_INIT );
return FALSE;
@@ -757,8 +724,10 @@ bool idle_startup()
// Load all the name information out of the login view
// NOTE: Hits "Attempted getFields with no login view shown" warning, since we don't
// show the login view until login_show() is called below.
- // LLPanelLogin::getFields(gFirstname, gLastname, gPassword);
-
+ if (gUserCredential.isNull())
+ {
+ gUserCredential = gLoginHandler.initializeLoginInfo();
+ }
if (gNoRender)
{
LL_ERRS("AppInit") << "Need to autologin or use command line with norender!" << LL_ENDL;
@@ -766,13 +735,19 @@ bool idle_startup()
// Make sure the process dialog doesn't hide things
gViewerWindow->setShowProgress(FALSE);
+ initialize_edit_menu();
+
// Show the login dialog
login_show();
// connect dialog is already shown, so fill in the names
- LLPanelLogin::setFields( gFirstname, gLastname, gPassword);
-
+ if (gUserCredential.notNull())
+ {
+ LLPanelLogin::setFields( gUserCredential, gRememberPassword);
+ }
LLPanelLogin::giveFocus();
+ gSavedSettings.setBOOL("FirstRunThisInstall", FALSE);
+
LLStartUp::setStartupState( STATE_LOGIN_WAIT ); // Wait for user input
}
else
@@ -798,13 +773,13 @@ bool idle_startup()
gLoginMenuBarView->setVisible( TRUE );
gLoginMenuBarView->setEnabled( TRUE );
+ // Hide the splash screen
+ LLSplashScreen::hide();
+
// Push our window frontmost
gViewerWindow->getWindow()->show();
display_startup();
- //DEV-10530. do cleanup. remove at some later date. jan-2009
- LLFloaterPreference::cleanupBadSetting();
-
// DEV-16927. The following code removes errant keystrokes that happen while the window is being
// first made visible.
#ifdef _WIN32
@@ -832,42 +807,39 @@ bool idle_startup()
gViewerWindow->moveProgressViewToFront();
//reset the values that could have come in from a slurl
- // DEV-42215: Make sure they're not empty -- gFirstname and gLastname
+ // DEV-42215: Make sure they're not empty -- gUserCredential
// might already have been set from gSavedSettings, and it's too bad
// to overwrite valid values with empty strings.
- if (! gLoginHandler.getFirstName().empty() && ! gLoginHandler.getLastName().empty())
- {
- gFirstname = gLoginHandler.getFirstName();
- gLastname = gLoginHandler.getLastName();
- LL_DEBUGS("LLStartup") << "STATE_LOGIN_CLEANUP: setting gFirstname, gLastname from gLoginHandler: '" << gFirstname << "' '" << gLastname << "'" << LL_ENDL;
- }
if (show_connect_box)
{
// TODO if not use viewer auth
// Load all the name information out of the login view
- LLPanelLogin::getFields(&gFirstname, &gLastname, &gPassword);
+ LLPanelLogin::getFields(gUserCredential, gRememberPassword);
// end TODO
// HACK: Try to make not jump on login
gKeyboard->resetKeys();
}
- if (!gFirstname.empty() && !gLastname.empty())
- {
- gSavedSettings.setString("FirstName", gFirstname);
- gSavedSettings.setString("LastName", gLastname);
-
- LL_INFOS("AppInit") << "Attempting login as: " << gFirstname << " " << gLastname << LL_ENDL;
- gDebugInfo["LoginName"] = gFirstname + " " + gLastname;
+ // save the credentials
+ std::string userid = "unknown";
+ if(gUserCredential.notNull())
+ {
+ userid = gUserCredential->userID();
+ gSecAPIHandler->saveCredential(gUserCredential, gRememberPassword);
}
-
+ gSavedSettings.setBOOL("RememberPassword", gRememberPassword);
+ LL_INFOS("AppInit") << "Attempting login as: " << userid << LL_ENDL;
+ gDebugInfo["LoginName"] = userid;
+
// create necessary directories
// *FIX: these mkdir's should error check
- gDirUtilp->setLindenUserDir(gFirstname, gLastname);
+ gDirUtilp->setLindenUserDir(userid);
LLFile::mkdir(gDirUtilp->getLindenUserDir());
-
+
// Set PerAccountSettingsFile to the default value.
+ std::string per_account_settings_file = LLAppViewer::instance()->getSettingsFilename("Default", "PerAccount");
gSavedSettings.setString("PerAccountSettingsFile",
gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT,
LLAppViewer::instance()->getSettingsFilename("Default", "PerAccount")));
@@ -885,21 +857,19 @@ bool idle_startup()
}
//Default the path if one isn't set.
- if (gSavedPerAccountSettings.getString("InstantMessageLogFolder").empty())
+ // *NOTE: unable to check variable differ from "InstantMessageLogPath" because it was
+ // provided in pre 2.0 viewer. See EXT-6661
+ if (gSavedPerAccountSettings.getString("InstantMessageLogPath").empty())
{
gDirUtilp->setChatLogsDir(gDirUtilp->getOSUserAppDir());
- std::string chat_log_dir = gDirUtilp->getChatLogsDir();
- std::string chat_log_top_folder=gDirUtilp->getBaseFileName(chat_log_dir);
- gSavedPerAccountSettings.setString("InstantMessageLogPath",chat_log_dir);
- gSavedPerAccountSettings.setString("InstantMessageLogFolder",chat_log_top_folder);
+ gSavedPerAccountSettings.setString("InstantMessageLogPath", gDirUtilp->getChatLogsDir());
}
else
{
gDirUtilp->setChatLogsDir(gSavedPerAccountSettings.getString("InstantMessageLogPath"));
}
+ gDirUtilp->setPerAccountChatLogsDir(userid);
- gDirUtilp->setPerAccountChatLogsDir(gFirstname, gLastname);
-
LLFile::mkdir(gDirUtilp->getChatLogsDir());
LLFile::mkdir(gDirUtilp->getPerAccountChatLogsDir());
@@ -920,11 +890,7 @@ bool idle_startup()
if (show_connect_box)
{
- std::string location;
- LLPanelLogin::getLocation( location );
- LLURLSimString::setString( location );
-
- // END TODO
+ LLSLURL slurl;
LLPanelLogin::closePanel();
}
@@ -936,6 +902,9 @@ bool idle_startup()
// Load Avatars icons cache
LLAvatarIconIDCache::getInstance()->load();
+
+ // Load media plugin cookies
+ LLViewerMedia::loadCookieFile();
//-------------------------------------------------
// Handle startup progress screen
@@ -945,26 +914,21 @@ bool idle_startup()
// their last location, or some URL "-url //sim/x/y[/z]"
// All accounts have both a home and a last location, and we don't support
// more locations than that. Choose the appropriate one. JC
- if (LLURLSimString::parse())
- {
- // a startup URL was specified
- agent_location_id = START_LOCATION_ID_URL;
-
- // doesn't really matter what location_which is, since
- // gAgentStartLookAt will be overwritten when the
- // UserLoginLocationReply arrives
- location_which = START_LOCATION_ID_LAST;
- }
- else if (gSavedSettings.getString("LoginLocation") == "last" )
- {
- agent_location_id = START_LOCATION_ID_LAST; // last location
- location_which = START_LOCATION_ID_LAST;
- }
- else
- {
- agent_location_id = START_LOCATION_ID_HOME; // home
- location_which = START_LOCATION_ID_HOME;
- }
+ switch (LLStartUp::getStartSLURL().getType())
+ {
+ case LLSLURL::LOCATION:
+ agent_location_id = START_LOCATION_ID_URL;
+ location_which = START_LOCATION_ID_LAST;
+ break;
+ case LLSLURL::LAST_LOCATION:
+ agent_location_id = START_LOCATION_ID_LAST;
+ location_which = START_LOCATION_ID_LAST;
+ break;
+ default:
+ agent_location_id = START_LOCATION_ID_HOME;
+ location_which = START_LOCATION_ID_HOME;
+ break;
+ }
gViewerWindow->getWindow()->setCursor(UI_CURSOR_WAIT);
@@ -991,7 +955,7 @@ bool idle_startup()
if(STATE_LOGIN_AUTH_INIT == LLStartUp::getStartupState())
{
- gDebugInfo["GridName"] = LLViewerLogin::getInstance()->getGridLabel();
+ gDebugInfo["GridName"] = LLGridManager::getInstance()->getGridLabel();
// Update progress status and the display loop.
auth_desc = LLTrans::getString("LoginInProgress");
@@ -1015,11 +979,7 @@ bool idle_startup()
// This call to LLLoginInstance::connect() starts the
// authentication process.
- LLSD credentials;
- credentials["first"] = gFirstname;
- credentials["last"] = gLastname;
- credentials["passwd"] = gPassword;
- login->connect(credentials);
+ login->connect(gUserCredential);
LLStartUp::setStartupState( STATE_LOGIN_CURL_UNSTUCK );
return FALSE;
@@ -1039,15 +999,16 @@ bool idle_startup()
if(STATE_LOGIN_PROCESS_RESPONSE == LLStartUp::getStartupState())
{
std::ostringstream emsg;
- emsg << "Login failed.\n";
+ emsg << LLTrans::getString("LoginFailed") << "\n";
if(LLLoginInstance::getInstance()->authFailure())
{
LL_INFOS("LLStartup") << "Login failed, LLLoginInstance::getResponse(): "
<< LLLoginInstance::getInstance()->getResponse() << LL_ENDL;
+ LLSD response = LLLoginInstance::getInstance()->getResponse();
// Still have error conditions that may need some
// sort of handling.
- std::string reason_response = LLLoginInstance::getInstance()->getResponse("reason");
- std::string message_response = LLLoginInstance::getInstance()->getResponse("message");
+ std::string reason_response = response["reason"];
+ std::string message_response = response["message"];
if(!message_response.empty())
{
@@ -1067,8 +1028,8 @@ bool idle_startup()
if(reason_response == "key")
{
// Couldn't login because user/password is wrong
- // Clear the password
- gPassword = "";
+ // Clear the credential
+ gUserCredential->clearAuthenticator();
}
if(reason_response == "update"
@@ -1081,18 +1042,65 @@ bool idle_startup()
LLLoginInstance::getInstance()->disconnect();
LLAppViewer::instance()->forceQuit();
}
- else
+ else
{
- // Don't pop up a notification in the TOS case because
- // LLFloaterTOS::onCancel() already scolded the user.
- if (reason_response != "tos")
+ if (reason_response != "tos")
{
- LLSD args;
- args["ERROR_MESSAGE"] = emsg.str();
- LL_INFOS("LLStartup") << "Notification: " << args << LL_ENDL;
- LLNotificationsUtil::add("ErrorMessage", args, LLSD(), login_alert_done);
+ // Don't pop up a notification in the TOS case because
+ // LLFloaterTOS::onCancel() already scolded the user.
+ std::string error_code;
+ if(response.has("errorcode"))
+ {
+ error_code = response["errorcode"].asString();
+ }
+ if ((reason_response == "CURLError") &&
+ (error_code == "SSL_CACERT" || error_code == "SSL_PEER_CERTIFICATE") &&
+ response.has("certificate"))
+ {
+ // This was a certificate error, so grab the certificate
+ // and throw up the appropriate dialog.
+ LLPointer<LLCertificate> certificate = gSecAPIHandler->getCertificate(response["certificate"]);
+ if(certificate)
+ {
+ LLSD args = transform_cert_args(certificate);
+
+ if(error_code == "SSL_CACERT")
+ {
+ // if we are handling an untrusted CA, throw up the dialog
+ // with the 'trust this CA' button.
+ LLNotificationsUtil::add("TrustCertificateError", args, response,
+ trust_cert_done);
+
+ show_connect_box = true;
+ }
+ else
+ {
+ // the certificate exception returns a unique string for each type of exception.
+ // we grab this string via the LLUserAuth object, and use that to grab the localized
+ // string.
+ args["REASON"] = LLTrans::getString(message_response);
+
+ LLNotificationsUtil::add("GeneralCertificateError", args, response,
+ general_cert_done);
+
+ reset_login();
+ gSavedSettings.setBOOL("AutoLogin", FALSE);
+ show_connect_box = true;
+
+ }
+
+ }
+ }
+ else
+ {
+ // This wasn't a certificate error, so throw up the normal
+ // notificatioin message.
+ LLSD args;
+ args["ERROR_MESSAGE"] = emsg.str();
+ LL_INFOS("LLStartup") << "Notification: " << args << LL_ENDL;
+ LLNotificationsUtil::add("ErrorMessage", args, LLSD(), login_alert_done);
+ }
}
-
//setup map of datetime strings to codes and slt & local time offset from utc
// *TODO: Does this need to be here?
LLStringOps::setupDatetimeInfo (false);
@@ -1105,7 +1113,10 @@ bool idle_startup()
if(process_login_success_response())
{
// Pass the user information to the voice chat server interface.
- gVoiceClient->userAuthorized(gFirstname, gLastname, gAgentID);
+ LLVoiceClient::getInstance()->userAuthorized(gUserCredential->userID(), gAgentID);
+ // create the default proximal channel
+ LLVoiceChannel::initClass();
+ LLGridManager::getInstance()->setFavorite();
LLStartUp::setStartupState( STATE_WORLD_INIT);
}
else
@@ -1116,6 +1127,7 @@ bool idle_startup()
LLNotificationsUtil::add("ErrorMessage", args, LLSD(), login_alert_done);
transition_back_to_login_panel(emsg.str());
show_connect_box = true;
+ return FALSE;
}
}
return FALSE;
@@ -1133,6 +1145,7 @@ bool idle_startup()
// Finish agent initialization. (Requires gSavedSettings, builds camera)
gAgent.init();
+ gAgentCamera.init();
set_underclothes_menu_options();
// Since we connected, save off the settings so the user doesn't have to
@@ -1171,7 +1184,7 @@ bool idle_startup()
// World initialization must be done after above window init
// User might have overridden far clip
- LLWorld::getInstance()->setLandFarClip( gAgent.mDrawDistance );
+ LLWorld::getInstance()->setLandFarClip(gAgentCamera.mDrawDistance);
// Before we create the first region, we need to set the agent's mOriginGlobal
// This is necessary because creating objects before this is set will result in a
@@ -1196,6 +1209,7 @@ bool idle_startup()
display_startup();
LLStartUp::setStartupState( STATE_MULTIMEDIA_INIT );
+
return FALSE;
}
@@ -1284,6 +1298,10 @@ bool idle_startup()
LLAppViewer::instance()->loadNameCache();
}
+ // update the voice settings *after* gCacheName initialization
+ // so that we can construct voice UI that relies on the name cache
+ LLVoiceClient::getInstance()->updateSettings();
+
//gCacheName is required for nearby chat history loading
//so I just moved nearby history loading a few states further
if (!gNoRender && gSavedPerAccountSettings.getBOOL("LogShowHistory"))
@@ -1334,8 +1352,8 @@ bool idle_startup()
gAgent.setPositionAgent(agent_start_position_region);
gAgent.resetAxes(gAgentStartLookAt);
- gAgent.stopCameraAnimation();
- gAgent.resetCamera();
+ gAgentCamera.stopCameraAnimation();
+ gAgentCamera.resetCamera();
// Initialize global class data needed for surfaces (i.e. textures)
if (!gNoRender)
@@ -1698,6 +1716,13 @@ bool idle_startup()
<< " kbps" << LL_ENDL;
gViewerThrottle.setMaxBandwidth(FAST_RATE_BPS / 1024.f);
}
+
+ // Set the show start location to true, now that the user has logged
+ // on with this install.
+ gSavedSettings.setBOOL("ShowStartLocation", TRUE);
+
+ LLSideTray::getInstance()->showPanel("panel_home", LLSD());
+
}
// We're successfully logged in.
@@ -1732,7 +1757,7 @@ bool idle_startup()
{
LL_DEBUGS("AppInit") << "Gesture Manager loading " << gesture_options.size()
<< LL_ENDL;
- std::vector<LLUUID> item_ids;
+ uuid_vec_t item_ids;
for(LLSD::array_const_iterator resp_it = gesture_options.beginArray(),
end = gesture_options.endArray(); resp_it != end; ++resp_it)
{
@@ -1746,7 +1771,7 @@ bool idle_startup()
// Could schedule and delay these for later.
const BOOL no_inform_server = FALSE;
const BOOL no_deactivate_similar = FALSE;
- LLGestureManager::instance().activateGestureWithAsset(item_id, asset_id,
+ LLGestureMgr::instance().activateGestureWithAsset(item_id, asset_id,
no_inform_server,
no_deactivate_similar);
// We need to fetch the inventory items for these gestures
@@ -1755,7 +1780,8 @@ bool idle_startup()
}
}
// no need to add gesture to inventory observer, it's already made in constructor
- LLGestureManager::instance().fetchItems(item_ids);
+ LLGestureMgr::instance().setFetchIDs(item_ids);
+ LLGestureMgr::instance().startFetch();
}
}
gDisplaySwapBuffers = TRUE;
@@ -1791,9 +1817,12 @@ bool idle_startup()
// thus, do not show this alert.
if (!gAgent.isFirstLogin())
{
- bool url_ok = LLURLSimString::sInstance.parse();
- if ((url_ok && gAgentStartLocation == "url") ||
- (!url_ok && ((gAgentStartLocation == gSavedSettings.getString("LoginLocation")))))
+ llinfos << "gAgentStartLocation : " << gAgentStartLocation << llendl;
+ LLSLURL start_slurl = LLStartUp::getStartSLURL();
+
+ if (((start_slurl.getType() == LLSLURL::LOCATION) && (gAgentStartLocation == "url")) ||
+ ((start_slurl.getType() == LLSLURL::LAST_LOCATION) && (gAgentStartLocation == "last")) ||
+ ((start_slurl.getType() == LLSLURL::HOME_LOCATION) && (gAgentStartLocation == "home")))
{
// Start location is OK
// Disabled code to restore camera location and focus if logging in to default location
@@ -1801,38 +1830,44 @@ bool idle_startup()
if (samename)
{
// restore old camera pos
- gAgent.setFocusOnAvatar(FALSE, FALSE);
- gAgent.setCameraPosAndFocusGlobal(gSavedSettings.getVector3d("CameraPosOnLogout"), gSavedSettings.getVector3d("FocusPosOnLogout"), LLUUID::null);
+ gAgentCamera.setFocusOnAvatar(FALSE, FALSE);
+ gAgentCamera.setCameraPosAndFocusGlobal(gSavedSettings.getVector3d("CameraPosOnLogout"), gSavedSettings.getVector3d("FocusPosOnLogout"), LLUUID::null);
BOOL limit_hit = FALSE;
- gAgent.calcCameraPositionTargetGlobal(&limit_hit);
+ gAgentCamera.calcCameraPositionTargetGlobal(&limit_hit);
if (limit_hit)
{
- gAgent.setFocusOnAvatar(TRUE, FALSE);
+ gAgentCamera.setFocusOnAvatar(TRUE, FALSE);
}
- gAgent.stopCameraAnimation();
+ gAgentCamera.stopCameraAnimation();
}
}
else
{
std::string msg;
- if (url_ok)
- {
- msg = "AvatarMovedDesired";
- }
- else if (gSavedSettings.getString("LoginLocation") == "home")
+ switch(start_slurl.getType())
{
- msg = "AvatarMovedHome";
- }
- else
- {
- msg = "AvatarMovedLast";
+ case LLSLURL::LOCATION:
+ {
+
+ msg = "AvatarMovedDesired";
+ break;
+ }
+ case LLSLURL::HOME_LOCATION:
+ {
+ msg = "AvatarMovedHome";
+ break;
+ }
+ default:
+ {
+ msg = "AvatarMovedLast";
+ }
}
LLNotificationsUtil::add(msg);
}
}
//DEV-17797. get null folder. Any items found here moved to Lost and Found
- LLInventoryModel::findLostItems();
+ LLInventoryModelBackgroundFetch::instance().findLostItems();
LLStartUp::setStartupState( STATE_PRECACHE );
timeout.reset();
@@ -1850,7 +1885,7 @@ bool idle_startup()
if (gAgent.isFirstLogin()
&& !sInitialOutfit.empty() // registration set up an outfit
&& !sInitialOutfitGender.empty() // and a gender
- && gAgent.getAvatarObject() // can't wear clothes without object
+ && isAgentAvatarValid() // can't wear clothes without object
&& !gAgent.isGenderChosen() ) // nothing already loading
{
// Start loading the wearables, textures, gestures
@@ -1858,7 +1893,7 @@ bool idle_startup()
}
// wait precache-delay and for agent's avatar or a lot longer.
- if(((timeout_frac > 1.f) && gAgent.getAvatarObject())
+ if(((timeout_frac > 1.f) && isAgentAvatarValid())
|| (timeout_frac > 3.f))
{
LLStartUp::setStartupState( STATE_WEARABLES_WAIT );
@@ -1877,17 +1912,6 @@ bool idle_startup()
}
}
- // If this is the very first time the user has logged into viewer2+ (from a legacy viewer, or new account)
- // then auto-populate outfits from the library into the My Outfits folder.
- static bool check_populate_my_outfits = true;
- if (check_populate_my_outfits &&
- (LLInventoryModel::getIsFirstTimeInViewer2()
- || gSavedSettings.getBOOL("MyOutfitsAutofill")))
- {
- gAgentWearables.populateMyOutfitsFolder();
- }
- check_populate_my_outfits = false;
-
return TRUE;
}
@@ -1925,8 +1949,8 @@ bool idle_startup()
if (gAgent.isFirstLogin())
{
// wait for avatar to be completely loaded
- if (gAgent.getAvatarObject()
- && gAgent.getAvatarObject()->isFullyLoaded())
+ if (isAgentAvatarValid()
+ && gAgentAvatarp->isFullyLoaded())
{
//llinfos << "avatar fully loaded" << llendl;
LLStartUp::setStartupState( STATE_CLEANUP );
@@ -2006,9 +2030,6 @@ bool idle_startup()
LLStartUp::setStartupState( STATE_STARTED );
- // Mark that we have successfully logged in at least once
- gSavedSettings.setBOOL("HadFirstSuccessfulLogin", TRUE);
-
// Unmute audio if desired and setup volumes.
// Unmute audio if desired and setup volumes.
// This is a not-uncommon crash site, so surround it with
@@ -2055,20 +2076,9 @@ void login_show()
#endif
LLPanelLogin::show( gViewerWindow->getWindowRectScaled(),
- bUseDebugLogin,
+ bUseDebugLogin || gSavedSettings.getBOOL("SecondLifeEnterprise"),
login_callback, NULL );
- // UI textures have been previously loaded in doPreloadImages()
-
- LL_DEBUGS("AppInit") << "Setting Servers" << LL_ENDL;
-
- LLPanelLogin::addServer(LLViewerLogin::getInstance()->getGridLabel(), LLViewerLogin::getInstance()->getGridChoice());
-
- LLViewerLogin* vl = LLViewerLogin::getInstance();
- for(int grid_index = GRID_INFO_ADITI; grid_index < GRID_INFO_OTHER; ++grid_index)
- {
- LLPanelLogin::addServer(vl->getKnownGridLabel((EGridInfo)grid_index), grid_index);
- }
}
// Callback for when login screen is closed. Option 0 = connect, option 1 = quit.
@@ -2084,9 +2094,6 @@ void login_callback(S32 option, void *userdata)
}
else if (QUIT_OPTION == option) // *TODO: THIS CODE SEEMS TO BE UNREACHABLE!!!!! login_callback is never called with option equal to QUIT_OPTION
{
- // Make sure we don't save the password if the user is trying to clear it.
- std::string first, last, password;
- LLPanelLogin::getFields(&first, &last, &password);
if (!gSavedSettings.getBOOL("RememberPassword"))
{
// turn off the setting and write out to disk
@@ -2109,142 +2116,6 @@ void login_callback(S32 option, void *userdata)
}
}
-
-// static
-std::string LLStartUp::loadPasswordFromDisk()
-{
- // Only load password if we also intend to save it (otherwise the user
- // wonders what we're doing behind his back). JC
- BOOL remember_password = gSavedSettings.getBOOL("RememberPassword");
- if (!remember_password)
- {
- return std::string("");
- }
-
- std::string hashed_password("");
-
- // Look for legacy "marker" password from settings.ini
- hashed_password = gSavedSettings.getString("Marker");
- if (!hashed_password.empty())
- {
- // Stomp the Marker entry.
- gSavedSettings.setString("Marker", "");
-
- // Return that password.
- return hashed_password;
- }
-
- std::string filepath = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,
- "password.dat");
- LLFILE* fp = LLFile::fopen(filepath, "rb"); /* Flawfinder: ignore */
- if (!fp)
- {
- return hashed_password;
- }
-
- // UUID is 16 bytes, written into ASCII is 32 characters
- // without trailing \0
- const S32 HASHED_LENGTH = 32;
- U8 buffer[HASHED_LENGTH+1];
-
- if (1 != fread(buffer, HASHED_LENGTH, 1, fp))
- {
- return hashed_password;
- }
-
- fclose(fp);
-
- // Decipher with MAC address
- LLXORCipher cipher(gMACAddress, 6);
- cipher.decrypt(buffer, HASHED_LENGTH);
-
- buffer[HASHED_LENGTH] = '\0';
-
- // Check to see if the mac address generated a bad hashed
- // password. It should be a hex-string or else the mac adress has
- // changed. This is a security feature to make sure that if you
- // get someone's password.dat file, you cannot hack their account.
- if(is_hex_string(buffer, HASHED_LENGTH))
- {
- hashed_password.assign((char*)buffer);
- }
-
- return hashed_password;
-}
-
-
-// static
-void LLStartUp::savePasswordToDisk(const std::string& hashed_password)
-{
- std::string filepath = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,
- "password.dat");
- LLFILE* fp = LLFile::fopen(filepath, "wb"); /* Flawfinder: ignore */
- if (!fp)
- {
- return;
- }
-
- // Encipher with MAC address
- const S32 HASHED_LENGTH = 32;
- U8 buffer[HASHED_LENGTH+1];
-
- LLStringUtil::copy((char*)buffer, hashed_password.c_str(), HASHED_LENGTH+1);
-
- LLXORCipher cipher(gMACAddress, 6);
- cipher.encrypt(buffer, HASHED_LENGTH);
-
- if (fwrite(buffer, HASHED_LENGTH, 1, fp) != 1)
- {
- LL_WARNS("AppInit") << "Short write" << LL_ENDL;
- }
-
- fclose(fp);
-}
-
-
-// static
-void LLStartUp::deletePasswordFromDisk()
-{
- std::string filepath = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,
- "password.dat");
- LLFile::remove(filepath);
-}
-
-
-bool is_hex_string(U8* str, S32 len)
-{
- bool rv = true;
- U8* c = str;
- while(rv && len--)
- {
- switch(*c)
- {
- case '0':
- case '1':
- case '2':
- case '3':
- case '4':
- case '5':
- case '6':
- case '7':
- case '8':
- case '9':
- case 'a':
- case 'b':
- case 'c':
- case 'd':
- case 'e':
- case 'f':
- ++c;
- break;
- default:
- rv = false;
- break;
- }
- }
- return rv;
-}
-
void show_first_run_dialog()
{
LLNotificationsUtil::add("FirstRun", LLSD(), LLSD(), first_run_dialog_callback);
@@ -2286,7 +2157,7 @@ bool login_alert_status(const LLSD& notification, const LLSD& response)
// break;
case 2: // Teleport
// Restart the login process, starting at our home locaton
- LLURLSimString::setString("home");
+ LLStartUp::setStartSLURL(LLSLURL(LLSLURL::SIM_LOCATION_HOME));
LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
break;
default:
@@ -2473,7 +2344,7 @@ void register_viewer_callbacks(LLMessageSystem* msg)
msg->setHandlerFunc("MapBlockReply", LLWorldMapMessage::processMapBlockReply);
msg->setHandlerFunc("MapItemReply", LLWorldMapMessage::processMapItemReply);
- msg->setHandlerFunc("EventInfoReply", LLPanelEvent::processEventInfoReply);
+ msg->setHandlerFunc("EventInfoReply", LLFloaterEvent::processEventInfoReply);
msg->setHandlerFunc("PickInfoReply", &LLAvatarPropertiesProcessor::processPickInfoReply);
// msg->setHandlerFunc("ClassifiedInfoReply", LLPanelClassified::processClassifiedInfoReply);
msg->setHandlerFunc("ClassifiedInfoReply", LLAvatarPropertiesProcessor::processClassifiedInfoReply);
@@ -2503,84 +2374,163 @@ void asset_callback_nothing(LLVFS*, const LLUUID&, LLAssetType::EType, void*, S3
}
// *HACK: Must match name in Library or agent inventory
+const std::string ROOT_GESTURES_FOLDER = "Gestures";
const std::string COMMON_GESTURES_FOLDER = "Common Gestures";
const std::string MALE_GESTURES_FOLDER = "Male Gestures";
const std::string FEMALE_GESTURES_FOLDER = "Female Gestures";
-const std::string MALE_OUTFIT_FOLDER = "Male Shape & Outfit";
-const std::string FEMALE_OUTFIT_FOLDER = "Female Shape & Outfit";
+const std::string SPEECH_GESTURES_FOLDER = "Speech Gestures";
+const std::string OTHER_GESTURES_FOLDER = "Other Gestures";
const S32 OPT_CLOSED_WINDOW = -1;
const S32 OPT_MALE = 0;
const S32 OPT_FEMALE = 1;
-
+const S32 OPT_TRUST_CERT = 0;
+const S32 OPT_CANCEL_TRUST = 1;
+
bool callback_choose_gender(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+{
+
+ // These defaults are returned from the server on login. They are set in login.xml.
+ // If no default is returned from the server, they are retrieved from settings.xml.
+
+ S32 option = LLNotification::getSelectedOption(notification, response);
switch(option)
{
- case OPT_MALE:
- LLStartUp::loadInitialOutfit( MALE_OUTFIT_FOLDER, "male" );
- break;
-
- case OPT_FEMALE:
- case OPT_CLOSED_WINDOW:
- default:
- LLStartUp::loadInitialOutfit( FEMALE_OUTFIT_FOLDER, "female" );
- break;
+ case OPT_MALE:
+ LLStartUp::loadInitialOutfit( gSavedSettings.getString("DefaultMaleAvatar"), "male" );
+ break;
+
+ case OPT_FEMALE:
+ case OPT_CLOSED_WINDOW:
+ default:
+ LLStartUp::loadInitialOutfit( gSavedSettings.getString("DefaultFemaleAvatar"), "female" );
+ break;
}
return false;
}
+void LLStartUp::copyLibraryGestures(const std::string& same_gender_gestures)
+{
+ llinfos << "Copying library gestures" << llendl;
+
+ // Copy gestures
+ LLUUID lib_gesture_cat_id =
+ gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE,false,true);
+ if (lib_gesture_cat_id.isNull())
+ {
+ llwarns << "Unable to copy gestures, source category not found" << llendl;
+ }
+ LLUUID dst_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_GESTURE);
+
+ std::vector<std::string> gesture_folders_to_copy;
+ gesture_folders_to_copy.push_back(MALE_GESTURES_FOLDER);
+ gesture_folders_to_copy.push_back(FEMALE_GESTURES_FOLDER);
+ gesture_folders_to_copy.push_back(COMMON_GESTURES_FOLDER);
+ gesture_folders_to_copy.push_back(SPEECH_GESTURES_FOLDER);
+ gesture_folders_to_copy.push_back(OTHER_GESTURES_FOLDER);
+
+ for(std::vector<std::string>::iterator it = gesture_folders_to_copy.begin();
+ it != gesture_folders_to_copy.end();
+ ++it)
+ {
+ std::string& folder_name = *it;
+
+ LLPointer<LLInventoryCallback> cb(NULL);
+
+ if (folder_name == same_gender_gestures ||
+ folder_name == COMMON_GESTURES_FOLDER ||
+ folder_name == OTHER_GESTURES_FOLDER)
+ {
+ cb = new ActivateGestureCallback;
+ }
+
+
+ LLUUID cat_id = findDescendentCategoryIDByName(lib_gesture_cat_id,folder_name);
+ if (cat_id.isNull())
+ {
+ llwarns << "failed to find gesture folder for " << folder_name << llendl;
+ }
+ else
+ {
+ llinfos << "initiating fetch and copy for " << folder_name << " cat_id " << cat_id << llendl;
+ LLAppearanceMgr* app_mgr = LLAppearanceMgr::getInstance();
+ callAfterCategoryFetch(cat_id,
+ boost::bind(&LLAppearanceMgr::shallowCopyCategory,
+ app_mgr,
+ cat_id,
+ dst_id,
+ cb));
+ }
+ }
+}
+
void LLStartUp::loadInitialOutfit( const std::string& outfit_folder_name,
const std::string& gender_name )
{
+ llinfos << "starting" << llendl;
+
// Not going through the processAgentInitialWearables path, so need to set this here.
- LLAppearanceManager::instance().setAttachmentInvLinkEnable(true);
+ LLAppearanceMgr::instance().setAttachmentInvLinkEnable(true);
// Initiate creation of COF, since we're also bypassing that.
gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
S32 gender = 0;
- std::string gestures;
+ std::string same_gender_gestures;
if (gender_name == "male")
{
gender = OPT_MALE;
- gestures = MALE_GESTURES_FOLDER;
+ same_gender_gestures = MALE_GESTURES_FOLDER;
}
else
{
gender = OPT_FEMALE;
- gestures = FEMALE_GESTURES_FOLDER;
+ same_gender_gestures = FEMALE_GESTURES_FOLDER;
}
// try to find the outfit - if not there, create some default
// wearables.
- LLInventoryModel::cat_array_t cat_array;
- LLInventoryModel::item_array_t item_array;
- LLNameCategoryCollector has_name(outfit_folder_name);
- gInventory.collectDescendentsIf(gInventory.getLibraryRootFolderID(),
- cat_array,
- item_array,
- LLInventoryModel::EXCLUDE_TRASH,
- has_name);
- if (0 == cat_array.count())
+ LLUUID cat_id = findDescendentCategoryIDByName(
+ gInventory.getLibraryRootFolderID(),
+ outfit_folder_name);
+ if (cat_id.isNull())
{
gAgentWearables.createStandardWearables(gender);
}
else
{
- LLInventoryCategory* cat = cat_array.get(0);
+ sWearablesLoadedCon = gAgentWearables.addLoadedCallback(LLStartUp::saveInitialOutfit);
+
bool do_copy = true;
bool do_append = false;
- LLAppearanceManager::instance().wearInventoryCategory(cat, do_copy, do_append);
+ LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);
+ LLAppearanceMgr::instance().wearInventoryCategory(cat, do_copy, do_append);
}
- LLAppearanceManager::instance().wearOutfitByName(gestures);
- LLAppearanceManager::instance().wearOutfitByName(COMMON_GESTURES_FOLDER);
+ // Copy gestures
+ copyLibraryGestures(same_gender_gestures);
+
// This is really misnamed -- it means we have started loading
// an outfit/shape that will give the avatar a gender eventually. JC
gAgent.setGenderChosen(TRUE);
}
+//static
+void LLStartUp::saveInitialOutfit()
+{
+ if (sInitialOutfit.empty()) return;
+
+ if (sWearablesLoadedCon.connected())
+ {
+ sWearablesLoadedCon.disconnect();
+ }
+ LLAppearanceMgr::getInstance()->makeNewOutfitLinks(sInitialOutfit,false);
+}
+
+std::string& LLStartUp::getInitialOutfitName()
+{
+ return sInitialOutfit;
+}
+
// Loads a bitmap to display during load
void init_start_screen(S32 location_id)
{
@@ -2696,6 +2646,8 @@ void LLStartUp::postStartupState()
void reset_login()
{
+ gAgentWearables.cleanup();
+ gAgentCamera.cleanup();
gAgent.cleanup();
LLWorld::getInstance()->destroyClass();
@@ -2714,13 +2666,6 @@ void reset_login()
//---------------------------------------------------------------------------
-std::string LLStartUp::sSLURLCommand;
-
-bool LLStartUp::canGoFullscreen()
-{
- return gStartupState >= STATE_WORLD_INIT;
-}
-
// Initialize all plug-ins except the web browser (which was initialized
// early, before the login screen). JC
void LLStartUp::multimediaInit()
@@ -2747,41 +2692,146 @@ void LLStartUp::fontInit()
bool LLStartUp::dispatchURL()
{
// ok, if we've gotten this far and have a startup URL
- if (!sSLURLCommand.empty())
+ if (!getStartSLURL().isValid())
{
- LLMediaCtrl* web = NULL;
- const bool trusted_browser = false;
- LLURLDispatcher::dispatch(sSLURLCommand, web, trusted_browser);
+ return false;
}
- else if (LLURLSimString::parse())
- {
+ if(getStartSLURL().getType() != LLSLURL::APP)
+ {
+
// If we started with a location, but we're already
// at that location, don't pop dialogs open.
LLVector3 pos = gAgent.getPositionAgent();
- F32 dx = pos.mV[VX] - (F32)LLURLSimString::sInstance.mX;
- F32 dy = pos.mV[VY] - (F32)LLURLSimString::sInstance.mY;
+ LLVector3 slurlpos = getStartSLURL().getPosition();
+ F32 dx = pos.mV[VX] - slurlpos.mV[VX];
+ F32 dy = pos.mV[VY] - slurlpos.mV[VY];
const F32 SLOP = 2.f; // meters
- if( LLURLSimString::sInstance.mSimName != gAgent.getRegion()->getName()
+ if( getStartSLURL().getRegion() != gAgent.getRegion()->getName()
|| (dx*dx > SLOP*SLOP)
|| (dy*dy > SLOP*SLOP) )
{
- std::string url = LLURLSimString::getURL();
- LLMediaCtrl* web = NULL;
- const bool trusted_browser = false;
- LLURLDispatcher::dispatch(url, web, trusted_browser);
+ LLURLDispatcher::dispatch(getStartSLURL().getSLURLString(),
+ NULL, false);
}
return true;
}
return false;
}
+void LLStartUp::setStartSLURL(const LLSLURL& slurl)
+{
+ sStartSLURL = slurl;
+ switch(slurl.getType())
+ {
+ case LLSLURL::HOME_LOCATION:
+ {
+ gSavedSettings.setString("LoginLocation", LLSLURL::SIM_LOCATION_HOME);
+ break;
+ }
+ case LLSLURL::LAST_LOCATION:
+ {
+ gSavedSettings.setString("LoginLocation", LLSLURL::SIM_LOCATION_LAST);
+ break;
+ }
+ default:
+ LLGridManager::getInstance()->setGridChoice(slurl.getGrid());
+ break;
+ }
+}
+
bool login_alert_done(const LLSD& notification, const LLSD& response)
{
LLPanelLogin::giveFocus();
return false;
}
+// parse the certificate information into args for the
+// certificate notifications
+LLSD transform_cert_args(LLPointer<LLCertificate> cert)
+{
+ LLSD args = LLSD::emptyMap();
+ std::string value;
+ LLSD cert_info;
+ cert->getLLSD(cert_info);
+ // convert all of the elements in the cert into
+ // args for the xml dialog, so we have flexability to
+ // display various parts of the cert by only modifying
+ // the cert alert dialog xml.
+ for(LLSD::map_iterator iter = cert_info.beginMap();
+ iter != cert_info.endMap();
+ iter++)
+ {
+ // key usage and extended key usage
+ // are actually arrays, and we want to format them as comma separated
+ // strings, so special case those.
+ LLSDSerialize::toXML(cert_info[iter->first], std::cout);
+ if((iter->first== std::string(CERT_KEY_USAGE)) |
+ (iter->first == std::string(CERT_EXTENDED_KEY_USAGE)))
+ {
+ value = "";
+ LLSD usage = cert_info[iter->first];
+ for (LLSD::array_iterator usage_iter = usage.beginArray();
+ usage_iter != usage.endArray();
+ usage_iter++)
+ {
+
+ if(usage_iter != usage.beginArray())
+ {
+ value += ", ";
+ }
+
+ value += (*usage_iter).asString();
+ }
+
+ }
+ else
+ {
+ value = iter->second.asString();
+ }
+
+ std::string name = iter->first;
+ std::transform(name.begin(), name.end(), name.begin(),
+ (int(*)(int))toupper);
+ args[name.c_str()] = value;
+ }
+ return args;
+}
+
+
+// when we handle a cert error, give focus back to the login panel
+void general_cert_done(const LLSD& notification, const LLSD& response)
+{
+ LLStartUp::setStartupState( STATE_LOGIN_SHOW );
+ LLPanelLogin::giveFocus();
+}
+
+// check to see if the user wants to trust the cert.
+// if they do, add it to the cert store and
+void trust_cert_done(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotification::getSelectedOption(notification, response);
+ switch(option)
+ {
+ case OPT_TRUST_CERT:
+ {
+ LLPointer<LLCertificate> cert = gSecAPIHandler->getCertificate(notification["payload"]["certificate"]);
+ LLPointer<LLCertificateStore> store = gSecAPIHandler->getCertificateStore(gSavedSettings.getString("CertStore"));
+ store->add(cert);
+ store->save();
+ LLStartUp::setStartupState( STATE_LOGIN_CLEANUP );
+ break;
+ }
+ case OPT_CANCEL_TRUST:
+ reset_login();
+ gSavedSettings.setBOOL("AutoLogin", FALSE);
+ LLStartUp::setStartupState( STATE_LOGIN_SHOW );
+ default:
+ LLPanelLogin::giveFocus();
+ break;
+ }
+
+}
void apply_udp_blacklist(const std::string& csv)
{
@@ -2829,33 +2879,45 @@ bool process_login_success_response()
text = response["secure_session_id"].asString();
if(!text.empty()) gAgent.mSecureSessionID.set(text);
- text = response["first_name"].asString();
- if(!text.empty())
- {
- // Remove quotes from string. Login.cgi sends these to force
- // names that look like numbers into strings.
- gFirstname.assign(text);
- LLStringUtil::replaceChar(gFirstname, '"', ' ');
- LLStringUtil::trim(gFirstname);
- }
- text = response["last_name"].asString();
- if(!text.empty())
+ // if the response contains a display name, use that,
+ // otherwise if the response contains a first and/or last name,
+ // use those. Otherwise use the credential identifier
+
+ gDisplayName = "";
+ if (response.has("display_name"))
{
- gLastname.assign(text);
+ gDisplayName.assign(response["display_name"].asString());
+ if(!gDisplayName.empty())
+ {
+ // Remove quotes from string. Login.cgi sends these to force
+ // names that look like numbers into strings.
+ LLStringUtil::replaceChar(gDisplayName, '"', ' ');
+ LLStringUtil::trim(gDisplayName);
+ }
}
- gSavedSettings.setString("FirstName", gFirstname);
- gSavedSettings.setString("LastName", gLastname);
-
- if (gSavedSettings.getBOOL("RememberPassword"))
+ if(gDisplayName.empty())
{
- // Successful login means the password is valid, so save it.
- LLStartUp::savePasswordToDisk(gPassword);
+ if(response.has("first_name"))
+ {
+ gDisplayName.assign(response["first_name"].asString());
+ LLStringUtil::replaceChar(gDisplayName, '"', ' ');
+ LLStringUtil::trim(gDisplayName);
+ }
+ if(response.has("last_name"))
+ {
+ text.assign(response["last_name"].asString());
+ LLStringUtil::replaceChar(text, '"', ' ');
+ LLStringUtil::trim(text);
+ if(!gDisplayName.empty())
+ {
+ gDisplayName += " ";
+ }
+ gDisplayName += text;
+ }
}
- else
+ if(gDisplayName.empty())
{
- // Don't leave password from previous session sitting around
- // during this login session.
- LLStartUp::deletePasswordFromDisk();
+ gDisplayName.assign(gUserCredential->asString());
}
// this is their actual ability to access content
@@ -2871,7 +2933,9 @@ bool process_login_success_response()
text = response["agent_region_access"].asString();
if (!text.empty())
{
- int preferredMaturity = LLAgent::convertTextToMaturity(text[0]);
+ U32 preferredMaturity =
+ llmin((U32)LLAgent::convertTextToMaturity(text[0]),
+ gSavedSettings.getU32("PreferredMaturity"));
gSavedSettings.setU32("PreferredMaturity", preferredMaturity);
}
// During the AO transition, this flag will be true. Then the flag will
@@ -2947,7 +3011,7 @@ bool process_login_success_response()
// replace the default help URL format
gSavedSettings.setString("HelpURLFormat",text);
- // don't fall back to Nebraska's pre-connection static help
+ // don't fall back to Standalone's pre-connection static help
gSavedSettings.setBOOL("HelpUseLocal", false);
}
@@ -3010,6 +3074,37 @@ bool process_login_success_response()
LLStringOps::setupDatetimeInfo(pacific_daylight_time);
}
+ // set up the voice configuration. Ultimately, we should pass this up as part of each voice
+ // channel if we need to move to multiple voice servers per grid.
+ LLSD voice_config_info = response["voice-config"];
+ if(voice_config_info.has("VoiceServerType"))
+ {
+ gSavedSettings.setString("VoiceServerType", voice_config_info["VoiceServerType"].asString());
+ }
+
+ // Request the map server url
+ std::string map_server_url = response["map-server-url"];
+ if(!map_server_url.empty())
+ {
+ gSavedSettings.setString("MapServerURL", map_server_url);
+ }
+
+ // Default male and female avatars allowing the user to choose their avatar on first login.
+ // These may be passed up by SLE to allow choice of enterprise avatars instead of the standard
+ // "new ruth." Not to be confused with 'initial-outfit' below
+ LLSD newuser_config = response["newuser-config"][0];
+ if(newuser_config.has("DefaultFemaleAvatar"))
+ {
+ gSavedSettings.setString("DefaultFemaleAvatar", newuser_config["DefaultFemaleAvatar"].asString());
+ }
+ if(newuser_config.has("DefaultMaleAvatar"))
+ {
+ gSavedSettings.setString("DefaultMaleAvatar", newuser_config["DefaultMaleAvatar"].asString());
+ }
+
+ // Initial outfit for the user.
+ // QUESTION: Why can't we simply simply set the users outfit directly
+ // from a web page into the user info on the server? - Roxie
LLSD initial_outfit = response["initial-outfit"][0];
if(initial_outfit.size())
{
@@ -3053,10 +3148,17 @@ bool process_login_success_response()
}
}
+ // Start the process of fetching the OpenID session cookie for this user login
+ std::string openid_url = response["openid_url"];
+ if(!openid_url.empty())
+ {
+ std::string openid_token = response["openid_token"];
+ LLViewerMedia::openIDSetup(openid_url, openid_token);
+ }
bool success = false;
// JC: gesture loading done below, when we have an asset system
- // in place. Don't delete/clear user_credentials until then.
+ // in place. Don't delete/clear gUserCredentials until then.
if(gAgentID.notNull()
&& gAgentSessionID.notNull()
&& gMessageSystem->mOurCircuitCode
diff --git a/indra/newview/llstartup.h b/indra/newview/llstartup.h
index 92fe9521d3..cf3c030f08 100644
--- a/indra/newview/llstartup.h
+++ b/indra/newview/llstartup.h
@@ -38,6 +38,7 @@
class LLViewerTexture ;
class LLEventPump;
class LLStartupListener;
+class LLSLURL;
// functions
bool idle_startup();
@@ -80,9 +81,6 @@ extern LLPointer<LLViewerTexture> gStartTexture;
class LLStartUp
{
public:
- static bool canGoFullscreen();
- // returns true if we are far enough along in startup to allow
- // going full screen
// Always use this to set gStartupState so changes are logged
static void setStartupState( EStartupState state );
@@ -95,32 +93,30 @@ public:
// Load default fonts not already loaded at start screen
static void fontInit();
+ static void copyLibraryGestures(const std::string& same_gender_gestures);
+
// outfit_folder_name can be a folder anywhere in your inventory,
// but the name must be a case-sensitive exact match.
// gender_name is either "male" or "female"
static void loadInitialOutfit( const std::string& outfit_folder_name,
const std::string& gender_name );
- // Load MD5 of user's password from local disk file.
- static std::string loadPasswordFromDisk();
-
- // Record MD5 of user's password for subsequent login.
- static void savePasswordToDisk(const std::string& hashed_password);
-
- // Delete the saved password local disk file.
- static void deletePasswordFromDisk();
+ //save loaded initial outfit into My Outfits category
+ static void saveInitialOutfit();
+
+ static std::string& getInitialOutfitName();
static bool dispatchURL();
// if we have a SLURL or sim string ("Ahern/123/45") that started
// the viewer, dispatch it
- static std::string sSLURLCommand;
- // *HACK: On startup, if we were passed a secondlife://app/do/foo
- // command URL, store it for later processing.
-
static void postStartupState();
+ static void setStartSLURL(const LLSLURL& slurl);
+ static LLSLURL& getStartSLURL() { return sStartSLURL; }
private:
+ static LLSLURL sStartSLURL;
+
static std::string startupStateToString(EStartupState state);
static EStartupState gStartupState; // Do not set directly, use LLStartup::setStartupState
static boost::scoped_ptr<LLEventPump> sStateWatcher;
diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp
index bff32af228..8c8fbdc88c 100644
--- a/indra/newview/llstatusbar.cpp
+++ b/indra/newview/llstatusbar.cpp
@@ -36,11 +36,14 @@
// viewer includes
#include "llagent.h"
+#include "llagentcamera.h"
#include "llbutton.h"
#include "llcommandhandler.h"
#include "llviewercontrol.h"
#include "llfloaterbuycurrency.h"
+#include "llbuycurrencyhtml.h"
#include "llfloaterlagmeter.h"
+#include "llpanelnearbymedia.h"
#include "llpanelvolumepulldown.h"
#include "llfloaterregioninfo.h"
#include "llfloaterscriptdebug.h"
@@ -49,6 +52,7 @@
#include "llkeyboard.h"
#include "lllineeditor.h"
#include "llmenugl.h"
+#include "llrootview.h"
#include "llsd.h"
#include "lltextbox.h"
#include "llui.h"
@@ -61,6 +65,7 @@
#include "llresmgr.h"
#include "llworld.h"
#include "llstatgraph.h"
+#include "llviewermedia.h"
#include "llviewermenu.h" // for gMenuBarView
#include "llviewerparcelmgr.h"
#include "llviewerthrottle.h"
@@ -130,7 +135,6 @@ LLStatusBar::LLStatusBar(const LLRect& rect)
// status bar can possible overlay menus?
setMouseOpaque(FALSE);
- setIsChrome(TRUE);
// size of day of the weeks and year
sDays.reserve(7);
@@ -140,9 +144,39 @@ LLStatusBar::LLStatusBar(const LLRect& rect)
mHealthTimer = new LLFrameTimer();
LLUICtrlFactory::getInstance()->buildPanel(this,"panel_status_bar.xml");
+}
+
+LLStatusBar::~LLStatusBar()
+{
+ delete mBalanceTimer;
+ mBalanceTimer = NULL;
+
+ delete mHealthTimer;
+ mHealthTimer = NULL;
+
+ // LLView destructor cleans up children
+}
- // status bar can never get a tab
- setFocusRoot(FALSE);
+//-----------------------------------------------------------------------
+// Overrides
+//-----------------------------------------------------------------------
+
+// virtual
+void LLStatusBar::draw()
+{
+ refresh();
+ LLPanel::draw();
+}
+
+BOOL LLStatusBar::handleRightMouseDown(S32 x, S32 y, MASK mask)
+{
+ show_navbar_context_menu(this,x,y);
+ return TRUE;
+}
+
+BOOL LLStatusBar::postBuild()
+{
+ gMenuBarView->setRightMouseDownCallback(boost::bind(&show_navbar_context_menu, _1, _2, _3));
// build date necessary data (must do after panel built)
setupDate();
@@ -158,7 +192,10 @@ LLStatusBar::LLStatusBar(const LLRect& rect)
mBtnVolume = getChild<LLButton>( "volume_btn" );
mBtnVolume->setClickedCallback( onClickVolume, this );
mBtnVolume->setMouseEnterCallback(boost::bind(&LLStatusBar::onMouseEnterVolume, this));
- mBtnVolume->setIsChrome(TRUE);
+
+ mMediaToggle = getChild<LLButton>("media_toggle_btn");
+ mMediaToggle->setClickedCallback( &LLStatusBar::onClickMediaToggle, this );
+ mMediaToggle->setMouseEnterCallback(boost::bind(&LLStatusBar::onMouseEnterNearbyMedia, this));
gSavedSettings.getControl("MuteAudio")->getSignal()->connect(boost::bind(&LLStatusBar::onVolumeChanged, this, _2));
@@ -206,51 +243,13 @@ LLStatusBar::LLStatusBar(const LLRect& rect)
mPanelVolumePulldown = new LLPanelVolumePulldown();
addChild(mPanelVolumePulldown);
-
- LLRect volume_pulldown_rect = mPanelVolumePulldown->getRect();
- LLButton* volbtn = getChild<LLButton>( "volume_btn" );
- volume_pulldown_rect.setLeftTopAndSize(volbtn->getRect().mLeft -
- (volume_pulldown_rect.getWidth() - volbtn->getRect().getWidth())/2,
- volbtn->calcScreenRect().mBottom,
- volume_pulldown_rect.getWidth(),
- volume_pulldown_rect.getHeight());
-
- mPanelVolumePulldown->setShape(volume_pulldown_rect);
mPanelVolumePulldown->setFollows(FOLLOWS_TOP|FOLLOWS_RIGHT);
mPanelVolumePulldown->setVisible(FALSE);
-}
-LLStatusBar::~LLStatusBar()
-{
- delete mBalanceTimer;
- mBalanceTimer = NULL;
-
- delete mHealthTimer;
- mHealthTimer = NULL;
-
- // LLView destructor cleans up children
-}
-
-//-----------------------------------------------------------------------
-// Overrides
-//-----------------------------------------------------------------------
-
-// virtual
-void LLStatusBar::draw()
-{
- refresh();
- LLPanel::draw();
-}
-
-BOOL LLStatusBar::handleRightMouseDown(S32 x, S32 y, MASK mask)
-{
- show_navbar_context_menu(this,x,y);
- return TRUE;
-}
-
-BOOL LLStatusBar::postBuild()
-{
- gMenuBarView->setRightMouseDownCallback(boost::bind(&show_navbar_context_menu, _1, _2, _3));
+ mPanelNearByMedia = new LLPanelNearByMedia();
+ addChild(mPanelNearByMedia);
+ mPanelNearByMedia->setFollows(FOLLOWS_TOP|FOLLOWS_RIGHT);
+ mPanelNearByMedia->setVisible(FALSE);
return TRUE;
}
@@ -316,7 +315,7 @@ void LLStatusBar::refresh()
childSetVisible("scriptout", false);
}
- if (gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK &&
+ if (gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK &&
((region && region->getAllowDamage()) || (parcel && parcel->getAllowDamage())))
{
// set visibility based on flashing
@@ -356,13 +355,25 @@ void LLStatusBar::refresh()
// update the master volume button state
bool mute_audio = LLAppViewer::instance()->getMasterSystemAudioMute();
mBtnVolume->setToggleState(mute_audio);
+
+ // Disable media toggle if there's no media, parcel media, and no parcel audio
+ // (or if media is disabled)
+ bool button_enabled = (gSavedSettings.getBOOL("AudioStreamingMusic")||gSavedSettings.getBOOL("AudioStreamingMedia")) &&
+ (LLViewerMedia::hasInWorldMedia() || LLViewerMedia::hasParcelMedia() || LLViewerMedia::hasParcelAudio());
+ mMediaToggle->setEnabled(button_enabled);
+ // Note the "sense" of the toggle is opposite whether media is playing or not
+ bool any_media_playing = (LLViewerMedia::isAnyMediaShowing() ||
+ LLViewerMedia::isParcelMediaPlaying() ||
+ LLViewerMedia::isParcelAudioPlaying());
+ mMediaToggle->setValue(!any_media_playing);
}
void LLStatusBar::setVisibleForMouselook(bool visible)
{
mTextTime->setVisible(visible);
- getChild<LLUICtrl>("buycurrency")->setVisible(visible);
- getChild<LLUICtrl>("buyL")->setVisible(visible);
+ getChild<LLUICtrl>("balance_bg")->setVisible(visible);
+ mBtnVolume->setVisible(visible);
+ mMediaToggle->setVisible(visible);
mSGBandwidth->setVisible(visible);
mSGPacketLoss->setVisible(visible);
setBackgroundVisible(visible);
@@ -382,18 +393,21 @@ void LLStatusBar::setBalance(S32 balance)
{
std::string money_str = LLResMgr::getInstance()->getMonetaryString( balance );
- LLButton* btn_buy_currency = getChild<LLButton>("buycurrency");
+ LLTextBox* balance_box = getChild<LLTextBox>("balance");
LLStringUtil::format_map_t string_args;
string_args["[AMT]"] = llformat("%s", money_str.c_str());
- std::string labe_str = getString("buycurrencylabel", string_args);
- btn_buy_currency->setLabel(labe_str);
+ std::string label_str = getString("buycurrencylabel", string_args);
+ balance_box->setValue(label_str);
- // Resize the balance button so that the label fits it, and the button expands to the left.
- // *TODO: LLButton should have an option where to expand.
+ // Resize the L$ balance background to be wide enough for your balance plus the buy button
{
- S32 saved_right = btn_buy_currency->getRect().mRight;
- btn_buy_currency->autoResize();
- btn_buy_currency->translate(saved_right - btn_buy_currency->getRect().mRight, 0);
+ const S32 HPAD = 24;
+ LLRect balance_rect = balance_box->getTextBoundingRect();
+ LLRect buy_rect = getChildView("buyL")->getRect();
+ LLView* balance_bg_view = getChildView("balance_bg");
+ LLRect balance_bg_rect = balance_bg_view->getRect();
+ balance_bg_rect.mLeft = balance_bg_rect.mRight - (buy_rect.getWidth() + balance_rect.getWidth() + HPAD);
+ balance_bg_view->setShape(balance_bg_rect);
}
if (mBalance && (fabs((F32)(mBalance - balance)) > gSavedSettings.getF32("UISndMoneyChangeThreshold")))
@@ -436,11 +450,9 @@ void LLStatusBar::setHealth(S32 health)
{
if (mHealth > (health + gSavedSettings.getF32("UISndHealthReductionThreshold")))
{
- LLVOAvatar *me;
-
- if ((me = gAgent.getAvatarObject()))
+ if (isAgentAvatarValid())
{
- if (me->getSex() == SEX_FEMALE)
+ if (gAgentAvatarp->getSex() == SEX_FEMALE)
{
make_ui_sound("UISndHealthReductionF");
}
@@ -500,7 +512,9 @@ S32 LLStatusBar::getSquareMetersLeft() const
void LLStatusBar::onClickBuyCurrency()
{
- LLFloaterBuyCurrency::buyCurrency();
+ // open a currency floater - actual one open depends on
+ // value specified in settings.xml
+ LLBuyCurrencyHTML::openCurrencyFloater();
}
static void onClickHealth(void* )
@@ -513,13 +527,51 @@ static void onClickScriptDebug(void*)
LLFloaterScriptDebug::show(LLUUID::null);
}
-//static
-void LLStatusBar::onMouseEnterVolume(LLUICtrl* ctrl)
+void LLStatusBar::onMouseEnterVolume()
{
+ LLButton* volbtn = getChild<LLButton>( "volume_btn" );
+ LLRect vol_btn_rect = volbtn->getRect();
+ LLRect volume_pulldown_rect = mPanelVolumePulldown->getRect();
+ volume_pulldown_rect.setLeftTopAndSize(vol_btn_rect.mLeft -
+ (volume_pulldown_rect.getWidth() - vol_btn_rect.getWidth())/2,
+ vol_btn_rect.mBottom,
+ volume_pulldown_rect.getWidth(),
+ volume_pulldown_rect.getHeight());
+
+ mPanelVolumePulldown->setShape(volume_pulldown_rect);
+
+
// show the master volume pull-down
- gStatusBar->mPanelVolumePulldown->setVisible(TRUE);
+ LLUI::clearPopups();
+ LLUI::addPopup(mPanelVolumePulldown);
+ mPanelNearByMedia->setVisible(FALSE);
+ mPanelVolumePulldown->setVisible(TRUE);
}
+void LLStatusBar::onMouseEnterNearbyMedia()
+{
+ LLView* popup_holder = gViewerWindow->getRootView()->getChildView("popup_holder");
+ LLRect nearby_media_rect = mPanelNearByMedia->getRect();
+ LLButton* nearby_media_btn = getChild<LLButton>( "media_toggle_btn" );
+ LLRect nearby_media_btn_rect = nearby_media_btn->getRect();
+ nearby_media_rect.setLeftTopAndSize(nearby_media_btn_rect.mLeft -
+ (nearby_media_rect.getWidth() - nearby_media_btn_rect.getWidth())/2,
+ nearby_media_btn_rect.mBottom,
+ nearby_media_rect.getWidth(),
+ nearby_media_rect.getHeight());
+ // force onscreen
+ nearby_media_rect.translate(popup_holder->getRect().getWidth() - nearby_media_rect.mRight, 0);
+
+ // show the master volume pull-down
+ mPanelNearByMedia->setShape(nearby_media_rect);
+ LLUI::clearPopups();
+ LLUI::addPopup(mPanelNearByMedia);
+
+ mPanelVolumePulldown->setVisible(FALSE);
+ mPanelNearByMedia->setVisible(TRUE);
+}
+
+
static void onClickVolume(void* data)
{
// toggle the master mute setting
@@ -527,6 +579,15 @@ static void onClickVolume(void* data)
LLAppViewer::instance()->setMasterSystemAudioMute(!mute_audio);
}
+//static
+void LLStatusBar::onClickMediaToggle(void* data)
+{
+ LLStatusBar *status_bar = (LLStatusBar*)data;
+ // "Selected" means it was showing the "play" icon (so media was playing), and now it shows "pause", so turn off media
+ bool enable = ! status_bar->mMediaToggle->getValue();
+ LLViewerMedia::setAllMediaEnabled(enable);
+}
+
// sets the static variables necessary for the date
void LLStatusBar::setupDate()
{
diff --git a/indra/newview/llstatusbar.h b/indra/newview/llstatusbar.h
index 21a98dd753..e5240fcc3e 100644
--- a/indra/newview/llstatusbar.h
+++ b/indra/newview/llstatusbar.h
@@ -48,6 +48,7 @@ class LLUUID;
class LLFrameTimer;
class LLStatGraph;
class LLPanelVolumePulldown;
+class LLPanelNearByMedia;
class LLStatusBar
: public LLPanel
@@ -87,6 +88,8 @@ public:
S32 getSquareMetersCommitted() const;
S32 getSquareMetersLeft() const;
+ LLPanelNearByMedia* getNearbyMediaPanel() { return mPanelNearByMedia; }
+
private:
// simple method to setup the part that holds the date
void setupDate();
@@ -94,9 +97,13 @@ private:
void onClickBuyCurrency();
void onVolumeChanged(const LLSD& newvalue);
- static void onMouseEnterVolume(LLUICtrl* ctrl);
+ void onMouseEnterVolume();
+ void onMouseEnterNearbyMedia();
+ void onClickScreen(S32 x, S32 y);
static void onClickStatGraph(void* data);
+ static void onClickMediaToggle(void* data);
+
private:
LLTextBox *mTextHealth;
LLTextBox *mTextTime;
@@ -105,6 +112,7 @@ private:
LLStatGraph *mSGPacketLoss;
LLButton *mBtnVolume;
+ LLButton *mMediaToggle;
S32 mBalance;
S32 mHealth;
@@ -113,6 +121,7 @@ private:
LLFrameTimer* mBalanceTimer;
LLFrameTimer* mHealthTimer;
LLPanelVolumePulldown* mPanelVolumePulldown;
+ LLPanelNearByMedia* mPanelNearByMedia;
static std::vector<std::string> sDays;
static std::vector<std::string> sMonths;
static const U32 MAX_DATE_STRING_LENGTH;
diff --git a/indra/newview/llstylemap.cpp b/indra/newview/llstylemap.cpp
index 2485563cbc..8fab3bb361 100644
--- a/indra/newview/llstylemap.cpp
+++ b/indra/newview/llstylemap.cpp
@@ -49,13 +49,15 @@ const LLStyle::Params &LLStyleMap::lookupAgent(const LLUUID &source)
if (source != LLUUID::null && source != gAgent.getID() )
{
style_params.color.control = "HTMLLinkColor";
+ style_params.readonly_color.control = "HTMLLinkColor";
style_params.link_href =
- LLSLURL::buildCommand("agent", source, "inspect");
+ LLSLURL("agent", source, "inspect").getSLURLString();
}
else
{
// Make the resident's own name white and don't make the name clickable.
style_params.color = LLColor4::white;
+ style_params.readonly_color = LLColor4::white;
}
mMap[source] = style_params;
@@ -75,11 +77,13 @@ const LLStyle::Params &LLStyleMap::lookup(const LLUUID& id, const std::string& l
if (id != LLUUID::null && !link.empty())
{
style_params.color.control = "HTMLLinkColor";
+ style_params.readonly_color.control = "HTMLLinkColor";
style_params.link_href = link;
}
else
{
style_params.color = LLColor4::white;
+ style_params.readonly_color = LLColor4::white;
}
mMap[id] = style_params;
}
diff --git a/indra/newview/llsurface.cpp b/indra/newview/llsurface.cpp
index 1d479bac8c..ddb5d08e07 100644
--- a/indra/newview/llsurface.cpp
+++ b/indra/newview/llsurface.cpp
@@ -44,6 +44,7 @@
#include "llviewerobjectlist.h"
#include "llregionhandle.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llappviewer.h"
#include "llworld.h"
#include "llviewercontrol.h"
@@ -606,7 +607,7 @@ void LLSurface::moveZ(const S32 x, const S32 y, const F32 delta)
void LLSurface::updatePatchVisibilities(LLAgent &agent)
{
- LLVector3 pos_region = mRegionp->getPosRegionFromGlobal(gAgent.getCameraPositionGlobal());
+ LLVector3 pos_region = mRegionp->getPosRegionFromGlobal(gAgentCamera.getCameraPositionGlobal());
LLSurfacePatch *patchp;
diff --git a/indra/newview/llsyswellwindow.cpp b/indra/newview/llsyswellwindow.cpp
index ba15053381..cb65756764 100644
--- a/indra/newview/llsyswellwindow.cpp
+++ b/indra/newview/llsyswellwindow.cpp
@@ -56,13 +56,11 @@ LLSysWellWindow::LLSysWellWindow(const LLSD& key) : LLTransientDockableFloater(N
mChannel(NULL),
mMessageList(NULL),
mSysWellChiclet(NULL),
- mSeparator(NULL),
NOTIFICATION_WELL_ANCHOR_NAME("notification_well_panel"),
- IM_WELL_ANCHOR_NAME("im_well_panel")
+ IM_WELL_ANCHOR_NAME("im_well_panel"),
+ mIsReshapedByUser(false)
{
- mTypedItemsCount[IT_NOTIFICATION] = 0;
- mTypedItemsCount[IT_INSTANT_MESSAGE] = 0;
setOverlapsScreenChannel(true);
}
@@ -74,18 +72,6 @@ BOOL LLSysWellWindow::postBuild()
// get a corresponding channel
initChannel();
- LLPanel::Params params;
- mSeparator = LLUICtrlFactory::create<LLPanel>(params);
- LLUICtrlFactory::instance().buildPanel(mSeparator, "panel_separator.xml");
-
- LLRect rc = mSeparator->getRect();
- rc.setOriginAndSize(0, 0, mMessageList->getItemsRect().getWidth(), rc.getHeight());
- mSeparator->setRect(rc);
- mSeparator->setFollows(FOLLOWS_LEFT | FOLLOWS_RIGHT | FOLLOWS_TOP);
- mSeparator->setVisible(FALSE);
-
- mMessageList->addItem(mSeparator);
-
// click on SysWell Window should clear "new message" state (and 'Lit' status). EXT-3147.
// mouse up callback is not called in this case.
setMouseDownCallback(boost::bind(&LLSysWellWindow::releaseNewMessagesState, this));
@@ -100,6 +86,13 @@ void LLSysWellWindow::setMinimized(BOOL minimize)
}
//---------------------------------------------------------------------------------
+void LLSysWellWindow::handleReshape(const LLRect& rect, bool by_user)
+{
+ mIsReshapedByUser |= by_user; // mark floater that it is reshaped by user
+ LLTransientDockableFloater::handleReshape(rect, by_user);
+}
+
+//---------------------------------------------------------------------------------
void LLSysWellWindow::onStartUpToastClick(S32 x, S32 y, MASK mask)
{
// just set floater visible. Screen channels will be cleared.
@@ -122,7 +115,7 @@ void LLSysWellWindow::removeItemByID(const LLUUID& id)
{
if(mMessageList->removeItemByValue(id))
{
- handleItemRemoved(IT_NOTIFICATION);
+ mSysWellChiclet->updateWidget(isWindowEmpty());
reshapeWindow();
}
else
@@ -211,22 +204,25 @@ void LLSysWellWindow::reshapeWindow()
// it includes height from floater top to list top and from floater bottom and list bottom
static S32 parent_list_delta_height = getRect().getHeight() - mMessageList->getRect().getHeight();
- S32 notif_list_height = mMessageList->getItemsRect().getHeight() + 2 * mMessageList->getBorderWidth();
+ if (!mIsReshapedByUser) // Don't reshape Well window, if it ever was reshaped by user. See EXT-5715.
+ {
+ S32 notif_list_height = mMessageList->getItemsRect().getHeight() + 2 * mMessageList->getBorderWidth();
- LLRect curRect = getRect();
+ LLRect curRect = getRect();
- S32 new_window_height = notif_list_height + parent_list_delta_height;
+ S32 new_window_height = notif_list_height + parent_list_delta_height;
- if (new_window_height > MAX_WINDOW_HEIGHT)
- {
- new_window_height = MAX_WINDOW_HEIGHT;
- }
- S32 newY = curRect.mTop + new_window_height - curRect.getHeight();
- S32 newWidth = curRect.getWidth() < MIN_WINDOW_WIDTH ? MIN_WINDOW_WIDTH
+ if (new_window_height > MAX_WINDOW_HEIGHT)
+ {
+ new_window_height = MAX_WINDOW_HEIGHT;
+ }
+ S32 newY = curRect.mTop + new_window_height - curRect.getHeight();
+ S32 newWidth = curRect.getWidth() < MIN_WINDOW_WIDTH ? MIN_WINDOW_WIDTH
: curRect.getWidth();
- curRect.setLeftTopAndSize(curRect.mLeft, newY, newWidth, new_window_height);
- reshape(curRect.getWidth(), curRect.getHeight(), TRUE);
- setRect(curRect);
+ curRect.setLeftTopAndSize(curRect.mLeft, newY, newWidth, new_window_height);
+ reshape(curRect.getWidth(), curRect.getHeight(), TRUE);
+ setRect(curRect);
+ }
// update notification channel state
// update on a window reshape is important only when a window is visible and docked
@@ -247,76 +243,7 @@ void LLSysWellWindow::releaseNewMessagesState()
//---------------------------------------------------------------------------------
bool LLSysWellWindow::isWindowEmpty()
{
- // keep in mind, mSeparator is always in the list
- return mMessageList->size() == 1;
-}
-
-// *TODO: mantipov: probably is deprecated
-void LLSysWellWindow::handleItemAdded(EItemType added_item_type)
-{
- bool should_be_shown = ++mTypedItemsCount[added_item_type] == 1 && anotherTypeExists(added_item_type);
-
- if (should_be_shown && !mSeparator->getVisible())
- {
- mSeparator->setVisible(TRUE);
-
- // refresh list to recalculate mSeparator position
- mMessageList->reshape(mMessageList->getRect().getWidth(), mMessageList->getRect().getHeight());
- }
-
- //fix for EXT-3254
- //set limits for min_height.
- S32 parent_list_delta_height = getRect().getHeight() - mMessageList->getRect().getHeight();
-
- std::vector<LLPanel*> items;
- mMessageList->getItems(items);
-
- if(items.size()>1)//first item is separator
- {
- S32 min_height;
- S32 min_width;
- getResizeLimits(&min_width,&min_height);
-
- min_height = items[1]->getRect().getHeight() + 2 * mMessageList->getBorderWidth() + parent_list_delta_height;
-
- setResizeLimits(min_width,min_height);
- }
- mSysWellChiclet->updateWidget(isWindowEmpty());
-}
-
-void LLSysWellWindow::handleItemRemoved(EItemType removed_item_type)
-{
- bool should_be_hidden = --mTypedItemsCount[removed_item_type] == 0;
-
- if (should_be_hidden && mSeparator->getVisible())
- {
- mSeparator->setVisible(FALSE);
-
- // refresh list to recalculate mSeparator position
- mMessageList->reshape(mMessageList->getRect().getWidth(), mMessageList->getRect().getHeight());
- }
- mSysWellChiclet->updateWidget(isWindowEmpty());
-}
-
-bool LLSysWellWindow::anotherTypeExists(EItemType item_type)
-{
- bool exists = false;
- switch(item_type)
- {
- case IT_INSTANT_MESSAGE:
- if (mTypedItemsCount[IT_NOTIFICATION] > 0)
- {
- exists = true;
- }
- break;
- case IT_NOTIFICATION:
- if (mTypedItemsCount[IT_INSTANT_MESSAGE] > 0)
- {
- exists = true;
- }
- break;
- }
- return exists;
+ return mMessageList->size() == 0;
}
/************************************************************************/
@@ -404,7 +331,10 @@ BOOL LLIMWellWindow::RowPanel::handleMouseDown(S32 x, S32 y, MASK mask)
{
// Pass the mouse down event to the chiclet (EXT-596).
if (!mChiclet->pointInView(x, y) && !mCloseBtn->getRect().pointInRect(x, y)) // prevent double call of LLIMChiclet::onMouseDown()
+ {
mChiclet->onMouseDown();
+ return TRUE;
+ }
return LLPanel::handleMouseDown(x, y, mask);
}
@@ -418,16 +348,16 @@ BOOL LLIMWellWindow::RowPanel::handleRightMouseDown(S32 x, S32 y, MASK mask)
/* ObjectRowPanel implementation */
/************************************************************************/
-LLIMWellWindow::ObjectRowPanel::ObjectRowPanel(const LLUUID& object_id, bool new_message/* = false*/)
+LLIMWellWindow::ObjectRowPanel::ObjectRowPanel(const LLUUID& notification_id, bool new_message/* = false*/)
: LLPanel()
, mChiclet(NULL)
{
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_active_object_row.xml", NULL);
- initChiclet(object_id);
+ initChiclet(notification_id);
LLTextBox* obj_name = getChild<LLTextBox>("object_name");
- obj_name->setValue(getObjectName(object_id));
+ obj_name->setValue(LLScriptFloaterManager::getObjectName(notification_id));
mCloseBtn = getChild<LLButton>("hide_btn");
mCloseBtn->setCommitCallback(boost::bind(&LLIMWellWindow::ObjectRowPanel::onClosePanel, this));
@@ -438,90 +368,18 @@ LLIMWellWindow::ObjectRowPanel::~ObjectRowPanel()
{
}
-std::string LLIMWellWindow::ObjectRowPanel::getObjectName(const LLUUID& object_id)
-{
- using namespace LLNotificationsUI;
- LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(object_id);
- LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
- if(!notification)
- {
- llwarns << "Invalid notification" << llendl;
- return LLStringUtil::null;
- }
-
- std::string text;
-
- switch(getObjectType(notification))
- {
- case OBJ_SCRIPT:
- text = notification->getSubstitutions()["TITLE"].asString();
- break;
- case OBJ_LOAD_URL:
- text = notification->getSubstitutions()["OBJECTNAME"].asString();
- break;
- case OBJ_GIVE_INVENTORY:
- text = notification->getSubstitutions()["NAME"].asString();
- break;
- default:
- text = getString("unknown_obj");
- break;
- }
-
- return text;
-}
-
//---------------------------------------------------------------------------------
void LLIMWellWindow::ObjectRowPanel::onClosePanel()
{
- LLScriptFloaterManager::getInstance()->removeNotificationByObjectId(mChiclet->getSessionId());
-}
-
-//static
-LLIMWellWindow::ObjectRowPanel::object_type_map LLIMWellWindow::ObjectRowPanel::initObjectTypeMap()
-{
- object_type_map type_map;
- type_map["ScriptDialog"] = OBJ_SCRIPT;
- type_map["LoadWebPage"] = OBJ_LOAD_URL;
- type_map["ObjectGiveItem"] = OBJ_GIVE_INVENTORY;
- return type_map;
+ LLScriptFloaterManager::getInstance()->onRemoveNotification(mChiclet->getSessionId());
}
-// static
-LLIMWellWindow::ObjectRowPanel::EObjectType LLIMWellWindow::ObjectRowPanel::getObjectType(const LLNotificationPtr& notification)
+void LLIMWellWindow::ObjectRowPanel::initChiclet(const LLUUID& notification_id, bool new_message/* = false*/)
{
- if(!notification)
- {
- llwarns << "Invalid notification" << llendl;
- return OBJ_UNKNOWN;
- }
-
- static object_type_map type_map = initObjectTypeMap();
- std::string name = notification->getName();
- object_type_map::const_iterator it = type_map.find(name);
- if(it != type_map.end())
- {
- return it->second;
- }
-
- llwarns << "Unknown object type" << llendl;
- return OBJ_UNKNOWN;
-}
-
-void LLIMWellWindow::ObjectRowPanel::initChiclet(const LLUUID& object_id, bool new_message/* = false*/)
-{
- using namespace LLNotificationsUI;
- LLUUID notification_id = LLScriptFloaterManager::getInstance()->findNotificationId(object_id);
- LLNotificationPtr notification = LLNotifications::getInstance()->find(notification_id);
- if(!notification)
- {
- llwarns << "Invalid notification" << llendl;
- return;
- }
-
// Choose which of the pre-created chiclets to use.
- switch(getObjectType(notification))
+ switch(LLScriptFloaterManager::getObjectType(notification_id))
{
- case OBJ_GIVE_INVENTORY:
+ case LLScriptFloaterManager::OBJ_GIVE_INVENTORY:
mChiclet = getChild<LLInvOfferChiclet>("inv_offer_chiclet");
break;
default:
@@ -530,8 +388,7 @@ void LLIMWellWindow::ObjectRowPanel::initChiclet(const LLUUID& object_id, bool n
}
mChiclet->setVisible(true);
- mChiclet->setSessionId(object_id);
-// mChiclet->setShowNewMessagesIcon(new_message);
+ mChiclet->setSessionId(notification_id);
}
//---------------------------------------------------------------------------------
@@ -552,7 +409,10 @@ BOOL LLIMWellWindow::ObjectRowPanel::handleMouseDown(S32 x, S32 y, MASK mask)
{
// Pass the mouse down event to the chiclet (EXT-596).
if (!mChiclet->pointInView(x, y) && !mCloseBtn->getRect().pointInRect(x, y)) // prevent double call of LLIMChiclet::onMouseDown()
+ {
mChiclet->onMouseDown();
+ return TRUE;
+ }
return LLPanel::handleMouseDown(x, y, mask);
}
@@ -615,8 +475,7 @@ void LLNotificationWellWindow::addItem(LLSysWellItem::Params p)
LLSysWellItem* new_item = new LLSysWellItem(p);
if (mMessageList->addItem(new_item, value, ADD_TOP))
{
- handleItemAdded(IT_NOTIFICATION);
-
+ mSysWellChiclet->updateWidget(isWindowEmpty());
reshapeWindow();
new_item->setOnItemCloseCallback(boost::bind(&LLNotificationWellWindow::onItemClose, this, _1));
@@ -780,10 +639,10 @@ void LLIMWellWindow::sessionIDUpdated(const LLUUID& old_session_id, const LLUUID
}
}
-LLChiclet* LLIMWellWindow::findObjectChiclet(const LLUUID& object_id)
+LLChiclet* LLIMWellWindow::findObjectChiclet(const LLUUID& notification_id)
{
LLChiclet* res = NULL;
- ObjectRowPanel* panel = mMessageList->getTypedItemByValue<ObjectRowPanel>(object_id);
+ ObjectRowPanel* panel = mMessageList->getTypedItemByValue<ObjectRowPanel>(notification_id);
if (panel != NULL)
{
res = panel->mChiclet;
@@ -811,9 +670,9 @@ void LLIMWellWindow::addIMRow(const LLUUID& sessionId, S32 chicletCounter,
const std::string& name, const LLUUID& otherParticipantId)
{
RowPanel* item = new RowPanel(this, sessionId, chicletCounter, name, otherParticipantId);
- if (mMessageList->insertItemAfter(mSeparator, item, sessionId))
+ if (mMessageList->addItem(item, sessionId))
{
- handleItemAdded(IT_INSTANT_MESSAGE);
+ mSysWellChiclet->updateWidget(isWindowEmpty());
}
else
{
@@ -838,7 +697,7 @@ void LLIMWellWindow::delIMRow(const LLUUID& sessionId)
if (mMessageList->removeItemByValue(sessionId))
{
- handleItemRemoved(IT_INSTANT_MESSAGE);
+ mSysWellChiclet->updateWidget(isWindowEmpty());
}
else
{
@@ -861,33 +720,33 @@ void LLIMWellWindow::delIMRow(const LLUUID& sessionId)
}
}
-void LLIMWellWindow::addObjectRow(const LLUUID& object_id, bool new_message/* = false*/)
+void LLIMWellWindow::addObjectRow(const LLUUID& notification_id, bool new_message/* = false*/)
{
- if (mMessageList->getItemByValue(object_id) == NULL)
+ if (mMessageList->getItemByValue(notification_id) == NULL)
{
- ObjectRowPanel* item = new ObjectRowPanel(object_id, new_message);
- if (mMessageList->insertItemAfter(mSeparator, item, object_id))
+ ObjectRowPanel* item = new ObjectRowPanel(notification_id, new_message);
+ if (mMessageList->addItem(item, notification_id))
{
- handleItemAdded(IT_INSTANT_MESSAGE);
+ mSysWellChiclet->updateWidget(isWindowEmpty());
}
else
{
- llwarns << "Unable to add Object Row into the list, objectID: " << object_id << llendl;
+ llwarns << "Unable to add Object Row into the list, notificationID: " << notification_id << llendl;
item->die();
}
reshapeWindow();
}
}
-void LLIMWellWindow::removeObjectRow(const LLUUID& object_id)
+void LLIMWellWindow::removeObjectRow(const LLUUID& notification_id)
{
- if (mMessageList->removeItemByValue(object_id))
+ if (mMessageList->removeItemByValue(notification_id))
{
- handleItemRemoved(IT_INSTANT_MESSAGE);
+ mSysWellChiclet->updateWidget(isWindowEmpty());
}
else
{
- llwarns << "Unable to remove Object Row from the list, objectID: " << object_id << llendl;
+ llwarns << "Unable to remove Object Row from the list, notificationID: " << notification_id << llendl;
}
reshapeWindow();
@@ -967,8 +826,7 @@ void LLIMWellWindow::closeAllImpl()
ObjectRowPanel* obj_panel = dynamic_cast <ObjectRowPanel*> (panel);
if (obj_panel)
{
- LLScriptFloaterManager::instance()
- .removeNotificationByObjectId(*iter);
+ LLScriptFloaterManager::instance().onRemoveNotification(*iter);
}
}
}
diff --git a/indra/newview/llsyswellwindow.h b/indra/newview/llsyswellwindow.h
index 0c81d1f369..c8215c71ee 100644
--- a/indra/newview/llsyswellwindow.h
+++ b/indra/newview/llsyswellwindow.h
@@ -70,6 +70,7 @@ public:
/*virtual*/ void setDocked(bool docked, bool pop_on_undock = true);
// override LLFloater's minimization according to EXT-1216
/*virtual*/ void setMinimized(BOOL minimize);
+ /*virtual*/ void handleReshape(const LLRect& rect, bool by_user);
void onStartUpToastClick(S32 x, S32 y, MASK mask);
@@ -81,20 +82,12 @@ public:
protected:
- typedef enum{
- IT_NOTIFICATION,
- IT_INSTANT_MESSAGE
- }EItemType;
-
// gets a rect that bounds possible positions for the SysWellWindow on a screen (EXT-1111)
void getAllowedRect(LLRect& rect);
// init Window's channel
virtual void initChannel();
- void handleItemAdded(EItemType added_item_type);
- void handleItemRemoved(EItemType removed_item_type);
- bool anotherTypeExists(EItemType item_type) ;
const std::string NOTIFICATION_WELL_ANCHOR_NAME;
const std::string IM_WELL_ANCHOR_NAME;
@@ -112,16 +105,7 @@ protected:
*/
LLSysWellChiclet* mSysWellChiclet;
- /**
- * Special panel which is used as separator of Notifications & IM Rows.
- * It is always presents in the list and shown when it is necessary.
- * It should be taken into account when reshaping and checking list size
- */
- LLPanel* mSeparator;
-
- typedef std::map<EItemType, S32> typed_items_count_t;
- typed_items_count_t mTypedItemsCount;
-
+ bool mIsReshapedByUser;
};
/**
@@ -188,8 +172,8 @@ public:
/*virtual*/ void sessionRemoved(const LLUUID& session_id);
/*virtual*/ void sessionIDUpdated(const LLUUID& old_session_id, const LLUUID& new_session_id);
- void addObjectRow(const LLUUID& object_id, bool new_message = false);
- void removeObjectRow(const LLUUID& object_id);
+ void addObjectRow(const LLUUID& notification_id, bool new_message = false);
+ void removeObjectRow(const LLUUID& notification_id);
void addIMRow(const LLUUID& session_id);
bool hasIMRow(const LLUUID& session_id);
@@ -201,7 +185,7 @@ protected:
private:
LLChiclet * findIMChiclet(const LLUUID& sessionId);
- LLChiclet* findObjectChiclet(const LLUUID& object_id);
+ LLChiclet* findObjectChiclet(const LLUUID& notification_id);
void addIMRow(const LLUUID& sessionId, S32 chicletCounter, const std::string& name, const LLUUID& otherParticipantId);
void delIMRow(const LLUUID& sessionId);
@@ -235,17 +219,8 @@ private:
class ObjectRowPanel: public LLPanel
{
- typedef enum e_object_type
- {
- OBJ_UNKNOWN,
-
- OBJ_SCRIPT,
- OBJ_GIVE_INVENTORY,
- OBJ_LOAD_URL
- }EObjectType;
-
public:
- ObjectRowPanel(const LLUUID& object_id, bool new_message = false);
+ ObjectRowPanel(const LLUUID& notification_id, bool new_message = false);
virtual ~ObjectRowPanel();
/*virtual*/ void onMouseEnter(S32 x, S32 y, MASK mask);
/*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
@@ -254,12 +229,8 @@ private:
private:
void onClosePanel();
- static EObjectType getObjectType(const LLNotificationPtr& notification);
- void initChiclet(const LLUUID& object_id, bool new_message = false);
- std::string getObjectName(const LLUUID& object_id);
+ void initChiclet(const LLUUID& notification_id, bool new_message = false);
- typedef std::map<std::string, EObjectType> object_type_map;
- static object_type_map initObjectTypeMap();
public:
LLIMChiclet* mChiclet;
private:
diff --git a/indra/newview/llteleporthistory.cpp b/indra/newview/llteleporthistory.cpp
index dcc85392f7..cac3b58464 100644
--- a/indra/newview/llteleporthistory.cpp
+++ b/indra/newview/llteleporthistory.cpp
@@ -38,6 +38,7 @@
#include "llsdserialize.h"
#include "llagent.h"
+#include "llvoavatarself.h"
#include "llslurl.h"
#include "llviewercontrol.h" // for gSavedSettings
#include "llviewerparcelmgr.h"
@@ -108,6 +109,16 @@ void LLTeleportHistory::onTeleportFailed()
}
}
+void LLTeleportHistory::handleLoginComplete()
+{
+ if( mGotInitialUpdate )
+ {
+ return;
+ }
+ updateCurrentLocation(gAgent.getPositionGlobal());
+}
+
+
void LLTeleportHistory::updateCurrentLocation(const LLVector3d& new_pos)
{
if (mRequestedItem != -1) // teleport within the history in progress?
@@ -117,6 +128,17 @@ void LLTeleportHistory::updateCurrentLocation(const LLVector3d& new_pos)
}
else
{
+ //EXT-7034
+ //skip initial update if agent avatar is no valid yet
+ //this may happen when updateCurrentLocation called while login process
+ //sometimes isAgentAvatarValid return false and in this case new_pos
+ //(which actually is gAgent.getPositionGlobal() ) is invalid
+ //if this position will be saved then teleport back will teleport user to wrong position
+ if ( !mGotInitialUpdate && !isAgentAvatarValid() )
+ {
+ return ;
+ }
+
// If we're getting the initial location update
// while we already have a (loaded) non-empty history,
// there's no need to purge forward items or add a new item.
@@ -136,6 +158,7 @@ void LLTeleportHistory::updateCurrentLocation(const LLVector3d& new_pos)
if (mCurrentItem < 0 || mCurrentItem >= (int) mItems.size()) // sanity check
{
llwarns << "Invalid current item. (this should not happen)" << llendl;
+ llassert(!"Invalid current teleport histiry item");
return;
}
LLVector3 new_pos_local = gAgent.getPosAgentFromGlobal(new_pos);
@@ -166,6 +189,17 @@ void LLTeleportHistory::onHistoryChanged()
void LLTeleportHistory::purgeItems()
{
+ if (mItems.size() == 0) // no entries yet (we're called before login)
+ {
+ // If we don't return here the history will get into inconsistent state, hence:
+ // 1) updateCurrentLocation() will malfunction,
+ // so further teleports will not properly update the history;
+ // 2) mHistoryChangedSignal subscribers will be notified
+ // of such an invalid change. (EXT-6798)
+ // Both should not happen.
+ return;
+ }
+
if (mItems.size() > 0)
{
mItems.erase(mItems.begin(), mItems.end()-1);
diff --git a/indra/newview/llteleporthistory.h b/indra/newview/llteleporthistory.h
index a82bec7c4f..e035451e71 100644
--- a/indra/newview/llteleporthistory.h
+++ b/indra/newview/llteleporthistory.h
@@ -136,6 +136,10 @@ public:
* @see load()
*/
void dump() const;
+ /**
+ * Process login complete event. Basically put current location into history
+ */
+ void handleLoginComplete();
private:
diff --git a/indra/newview/llteleporthistorystorage.cpp b/indra/newview/llteleporthistorystorage.cpp
index c635f91423..430d62e15e 100644
--- a/indra/newview/llteleporthistorystorage.cpp
+++ b/indra/newview/llteleporthistorystorage.cpp
@@ -89,6 +89,13 @@ void LLTeleportHistoryStorage::onTeleportHistoryChange()
if (!th)
return;
+ // Hacky sanity check. (EXT-6798)
+ if (th->getItems().size() == 0)
+ {
+ llassert(!"Inconsistent teleport history state");
+ return;
+ }
+
const LLTeleportHistoryItem &item = th->getItems()[th->getCurrentItemIndex()];
addItem(item.mTitle, item.mGlobalPos);
diff --git a/indra/newview/lltexglobalcolor.cpp b/indra/newview/lltexglobalcolor.cpp
index d7840fb435..347f8bf627 100644
--- a/indra/newview/lltexglobalcolor.cpp
+++ b/indra/newview/lltexglobalcolor.cpp
@@ -1,6 +1,6 @@
/**
* @file lltexlayerglobalcolor.cpp
- * @brief SERAPH - ADD IN
+ * @brief Color for texture layers.
*
* $LicenseInfo:firstyear=2008&license=viewergpl$
*
diff --git a/indra/newview/lltexlayer.cpp b/indra/newview/lltexlayer.cpp
index ddb6405c41..5d51e32515 100644
--- a/indra/newview/lltexlayer.cpp
+++ b/indra/newview/lltexlayer.cpp
@@ -37,6 +37,7 @@
#include "llagent.h"
#include "llimagej2c.h"
#include "llimagetga.h"
+#include "llnotificationsutil.h"
#include "llvfile.h"
#include "llvfs.h"
#include "llviewerstats.h"
@@ -49,12 +50,50 @@
#include "llui.h"
#include "llagentwearables.h"
#include "llwearable.h"
+#include "llviewercontrol.h"
#include "llviewervisualparam.h"
//#include "../tools/imdebug/imdebug.h"
using namespace LLVOAvatarDefines;
+class LLTexLayerInfo
+{
+ friend class LLTexLayer;
+ friend class LLTexLayerTemplate;
+ friend class LLTexLayerInterface;
+public:
+ LLTexLayerInfo();
+ ~LLTexLayerInfo();
+
+ BOOL parseXml(LLXmlTreeNode* node);
+ BOOL createVisualParams(LLVOAvatar *avatar);
+ BOOL isUserSettable() { return mLocalTexture != -1; }
+ S32 getLocalTexture() const { return mLocalTexture; }
+ BOOL getOnlyAlpha() const { return mUseLocalTextureAlphaOnly; }
+ std::string getName() const { return mName; }
+
+private:
+ std::string mName;
+
+ BOOL mWriteAllChannels; // Don't use masking. Just write RGBA into buffer,
+ LLTexLayerInterface::ERenderPass mRenderPass;
+
+ std::string mGlobalColor;
+ LLColor4 mFixedColor;
+
+ S32 mLocalTexture;
+ std::string mStaticImageFileName;
+ BOOL mStaticImageIsMask;
+ BOOL mUseLocalTextureAlphaOnly; // Ignore RGB channels from the input texture. Use alpha as a mask
+ BOOL mIsVisibilityMask;
+
+ typedef std::vector< std::pair< std::string,BOOL > > morph_name_list_t;
+ morph_name_list_t mMorphNameList;
+ param_color_info_list_t mParamColorInfoList;
+ param_alpha_info_list_t mParamAlphaInfoList;
+};
+
//-----------------------------------------------------------------------------
// LLBakedUploadData()
//-----------------------------------------------------------------------------
@@ -80,12 +119,14 @@ LLTexLayerSetBuffer::LLTexLayerSetBuffer(LLTexLayerSet* const owner,
S32 width, S32 height) :
// ORDER_LAST => must render these after the hints are created.
LLViewerDynamicTexture( width, height, 4, LLViewerDynamicTexture::ORDER_LAST, TRUE ),
- mNeedsUpdate( TRUE ),
- mNeedsUpload( FALSE ),
- mUploadPending( FALSE ), // Not used for any logic here, just to sync sending of updates
+ mNeedsUpdate(TRUE),
+ mNeedsUpload(FALSE),
+ mUploadPending(FALSE), // Not used for any logic here, just to sync sending of updates
+ mNumLowresUploads(0),
mTexLayerSet(owner)
{
LLTexLayerSetBuffer::sGLByteCount += getSize();
+ mNeedsUploadTimer.start();
}
LLTexLayerSetBuffer::~LLTexLayerSetBuffer()
@@ -99,6 +140,12 @@ LLTexLayerSetBuffer::~LLTexLayerSetBuffer()
}
//virtual
+S8 LLTexLayerSetBuffer::getType() const
+{
+ return LLViewerDynamicTexture::LL_TEX_LAYER_SET_BUFFER ;
+}
+
+//virtual
void LLTexLayerSetBuffer::restoreGLTexture()
{
LLViewerDynamicTexture::restoreGLTexture() ;
@@ -118,8 +165,8 @@ void LLTexLayerSetBuffer::dumpTotalByteCount()
void LLTexLayerSetBuffer::requestUpdate()
{
+ conditionalRestartUploadTimer();
mNeedsUpdate = TRUE;
-
// If we're in the middle of uploading a baked texture, we don't care about it any more.
// When it's downloaded, ignore it.
mUploadID.setNull();
@@ -127,20 +174,33 @@ void LLTexLayerSetBuffer::requestUpdate()
void LLTexLayerSetBuffer::requestUpload()
{
- if (!mNeedsUpload)
+ conditionalRestartUploadTimer();
+ mNeedsUpload = TRUE;
+ mNumLowresUploads = 0;
+ mUploadPending = TRUE;
+}
+
+void LLTexLayerSetBuffer::conditionalRestartUploadTimer()
+{
+ // If we requested a new upload but haven't even uploaded
+ // a low res version of our last upload request, then
+ // keep the timer ticking instead of resetting it.
+ if (mNeedsUpload && (mNumLowresUploads == 0))
+ {
+ mNeedsUploadTimer.unpause();
+ }
+ else
{
- mNeedsUpload = TRUE;
- mUploadPending = TRUE;
+ mNeedsUploadTimer.reset();
+ mNeedsUploadTimer.start();
}
}
void LLTexLayerSetBuffer::cancelUpload()
{
- if (mNeedsUpload)
- {
- mNeedsUpload = FALSE;
- }
+ mNeedsUpload = FALSE;
mUploadPending = FALSE;
+ mNeedsUploadTimer.pause();
}
void LLTexLayerSetBuffer::pushProjection() const
@@ -166,12 +226,14 @@ void LLTexLayerSetBuffer::popProjection() const
BOOL LLTexLayerSetBuffer::needsRender()
{
- const LLVOAvatarSelf* avatar = mTexLayerSet->getAvatar();
- BOOL upload_now = mNeedsUpload && mTexLayerSet->isLocalTextureDataFinal();
- BOOL needs_update = gAgentQueryManager.hasNoPendingQueries() && (mNeedsUpdate || upload_now) && !avatar->mAppearanceAnimating;
+ llassert(mTexLayerSet->getAvatar() == gAgentAvatarp);
+ if (!isAgentAvatarValid()) return FALSE;
+
+ const BOOL upload_now = isReadyToUpload();
+ BOOL needs_update = (mNeedsUpdate || upload_now) && !gAgentAvatarp->mAppearanceAnimating;
if (needs_update)
{
- BOOL invalid_skirt = avatar->getBakedTE(mTexLayerSet) == LLVOAvatarDefines::TEX_SKIRT_BAKED && !avatar->isWearingWearableType(WT_SKIRT);
+ BOOL invalid_skirt = gAgentAvatarp->getBakedTE(mTexLayerSet) == LLVOAvatarDefines::TEX_SKIRT_BAKED && !gAgentAvatarp->isWearingWearableType(LLWearableType::WT_SKIRT);
if (invalid_skirt)
{
// we were trying to create a skirt texture
@@ -181,10 +243,10 @@ BOOL LLTexLayerSetBuffer::needsRender()
}
else
{
- needs_update &= (avatar->isSelf() || (avatar->isVisible() && !avatar->isCulled()));
needs_update &= mTexLayerSet->isLocalTextureDataAvailable();
}
}
+
return needs_update;
}
@@ -211,7 +273,7 @@ BOOL LLTexLayerSetBuffer::render()
// do we need to upload, and do we have sufficient data to create an uploadable composite?
// When do we upload the texture if gAgent.mNumPendingQueries is non-zero?
- BOOL upload_now = (gAgentQueryManager.hasNoPendingQueries() && mNeedsUpload && mTexLayerSet->isLocalTextureDataFinal());
+ const BOOL upload_now = isReadyToUpload();
BOOL success = TRUE;
@@ -220,23 +282,25 @@ BOOL LLTexLayerSetBuffer::render()
success &= mTexLayerSet->render( mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight );
gGL.flush();
- if( upload_now )
+ if(upload_now)
{
if (!success)
{
- llinfos << "Failed attempt to bake " << mTexLayerSet->getBodyRegion() << llendl;
+ llinfos << "Failed attempt to bake " << mTexLayerSet->getBodyRegionName() << llendl;
mUploadPending = FALSE;
}
else
{
if (mTexLayerSet->isVisible())
{
+ mTexLayerSet->getAvatar()->debugBakedTextureUpload(mTexLayerSet->getBakedTexIndex(), FALSE); // FALSE for start of upload, TRUE for finish.
readBackAndUpload();
}
else
{
mUploadPending = FALSE;
mNeedsUpload = FALSE;
+ mNeedsUploadTimer.pause();
mTexLayerSet->getAvatar()->setNewBakedTexture(mTexLayerSet->getBakedTexIndex(),IMG_INVISIBLE);
}
}
@@ -253,11 +317,50 @@ BOOL LLTexLayerSetBuffer::render()
return success;
}
-bool LLTexLayerSetBuffer::isInitialized(void) const
+BOOL LLTexLayerSetBuffer::isInitialized(void) const
{
return mGLTexturep.notNull() && mGLTexturep->isGLTextureCreated();
}
+BOOL LLTexLayerSetBuffer::uploadPending() const
+{
+ return mUploadPending;
+}
+
+BOOL LLTexLayerSetBuffer::uploadNeeded() const
+{
+ return mNeedsUpload;
+}
+
+BOOL LLTexLayerSetBuffer::uploadInProgress() const
+{
+ return !mUploadID.isNull();
+}
+
+BOOL LLTexLayerSetBuffer::isReadyToUpload() const
+{
+ if (!mNeedsUpload) return FALSE; // Don't need to upload if we haven't requested one.
+ if (!gAgentQueryManager.hasNoPendingQueries()) return FALSE; // Can't upload if there are pending queries.
+
+ // If we requested an upload and have the final LOD ready, then upload.
+ const BOOL can_highest_lod = mTexLayerSet->isLocalTextureDataFinal();
+ if (can_highest_lod) return TRUE;
+
+ const U32 texture_timeout = gSavedSettings.getU32("AvatarBakedTextureTimeout");
+ if (texture_timeout)
+ {
+ // The timeout period increases exponentially between every lowres upload in order to prevent
+ // spamming the server with frequent uploads.
+ const U32 texture_timeout_threshold = texture_timeout*(1 << mNumLowresUploads);
+
+ // If we hit our timeout and have textures available at even lower resolution, then upload.
+ const BOOL is_upload_textures_timeout = mNeedsUploadTimer.getElapsedTimeF32() >= texture_timeout_threshold;
+ const BOOL has_lower_lod = mTexLayerSet->isLocalTextureDataAvailable();
+ if (has_lower_lod && is_upload_textures_timeout) return TRUE;
+ }
+ return FALSE;
+}
+
BOOL LLTexLayerSetBuffer::updateImmediate()
{
mNeedsUpdate = TRUE;
@@ -275,42 +378,33 @@ BOOL LLTexLayerSetBuffer::updateImmediate()
void LLTexLayerSetBuffer::readBackAndUpload()
{
- // pointers for storing data to upload
- U8* baked_color_data = new U8[ mFullWidth * mFullHeight * 4 ];
-
- glReadPixels(mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, GL_RGBA, GL_UNSIGNED_BYTE, baked_color_data );
- stop_glerror();
-
- llinfos << "Baked " << mTexLayerSet->getBodyRegion() << llendl;
+ llinfos << "Uploading baked " << mTexLayerSet->getBodyRegionName() << llendl;
LLViewerStats::getInstance()->incStat(LLViewerStats::ST_TEX_BAKES);
- llassert( gAgent.getAvatarObject() == mTexLayerSet->getAvatar() );
-
- // We won't need our caches since we're baked now. (Techically, we won't
- // really be baked until this image is sent to the server and the Avatar
- // Appearance message is received.)
+ // Don't need caches since we're baked now. (note: we won't *really* be baked
+ // until this image is sent to the server and the Avatar Appearance message is received.)
mTexLayerSet->deleteCaches();
- LLGLSUIDefault gls_ui;
+ // Get the COLOR information from our texture
+ U8* baked_color_data = new U8[ mFullWidth * mFullHeight * 4 ];
+ glReadPixels(mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, GL_RGBA, GL_UNSIGNED_BYTE, baked_color_data );
+ stop_glerror();
+ // Get the MASK information from our texture
+ LLGLSUIDefault gls_ui;
LLPointer<LLImageRaw> baked_mask_image = new LLImageRaw(mFullWidth, mFullHeight, 1 );
U8* baked_mask_data = baked_mask_image->getData();
-
mTexLayerSet->gatherMorphMaskAlpha(baked_mask_data, mFullWidth, mFullHeight);
- // writes into baked_color_data
- const char* comment_text = NULL;
- S32 baked_image_components = 5; // red green blue [bump] clothing
+ // Create the baked image from our color and mask information
+ const S32 baked_image_components = 5; // red green blue [bump] clothing
LLPointer<LLImageRaw> baked_image = new LLImageRaw( mFullWidth, mFullHeight, baked_image_components );
U8* baked_image_data = baked_image->getData();
-
- comment_text = LINDEN_J2C_COMMENT_PREFIX "RGBHM"; // 5 channels: rgb, heightfield/alpha, mask
-
S32 i = 0;
- for( S32 u = 0; u < mFullWidth; u++ )
+ for (S32 u=0; u < mFullWidth; u++)
{
- for( S32 v = 0; v < mFullHeight; v++ )
+ for (S32 v=0; v < mFullHeight; v++)
{
baked_image_data[5*i + 0] = baked_color_data[4*i + 0];
baked_image_data[5*i + 1] = baked_color_data[4*i + 1];
@@ -323,21 +417,19 @@ void LLTexLayerSetBuffer::readBackAndUpload()
LLPointer<LLImageJ2C> compressedImage = new LLImageJ2C;
compressedImage->setRate(0.f);
- LLTransactionID tid;
- LLAssetID asset_id;
- tid.generate();
- asset_id = tid.makeAssetID(gAgent.getSecureSessionID());
-
- BOOL res = false;
- if( compressedImage->encode(baked_image, comment_text))
+ const char* comment_text = LINDEN_J2C_COMMENT_PREFIX "RGBHM"; // writes into baked_color_data. 5 channels (rgb, heightfield/alpha, mask)
+ if (compressedImage->encode(baked_image, comment_text))
{
- res = LLVFile::writeFile(compressedImage->getData(), compressedImage->getDataSize(),
- gVFS, asset_id, LLAssetType::AT_TEXTURE);
- if (res)
+ LLTransactionID tid;
+ tid.generate();
+ const LLAssetID asset_id = tid.makeAssetID(gAgent.getSecureSessionID());
+ if (LLVFile::writeFile(compressedImage->getData(), compressedImage->getDataSize(),
+ gVFS, asset_id, LLAssetType::AT_TEXTURE))
{
- LLPointer<LLImageJ2C> integrity_test = new LLImageJ2C;
+ // Read back the file and validate.
BOOL valid = FALSE;
- S32 file_size;
+ LLPointer<LLImageJ2C> integrity_test = new LLImageJ2C;
+ S32 file_size = 0;
U8* data = LLVFile::readFile(gVFS, asset_id, LLAssetType::AT_TEXTURE, &file_size);
if (data)
{
@@ -348,29 +440,26 @@ void LLTexLayerSetBuffer::readBackAndUpload()
integrity_test->setLastError("Unable to read entire file");
}
- if( valid )
+ if (valid)
{
- // baked_upload_data is owned by the responder and deleted after the request completes
- LLBakedUploadData* baked_upload_data =
- new LLBakedUploadData(gAgent.getAvatarObject(), this->mTexLayerSet, asset_id);
+ // Baked_upload_data is owned by the responder and deleted after the request completes.
+ LLBakedUploadData* baked_upload_data = new LLBakedUploadData(gAgentAvatarp,
+ this->mTexLayerSet,
+ asset_id);
mUploadID = asset_id;
-
- // upload the image
- std::string url = gAgent.getRegion()->getCapability("UploadBakedTexture");
+ // Upload the image
+ const std::string url = gAgent.getRegion()->getCapability("UploadBakedTexture");
if(!url.empty()
- && !LLPipeline::sForceOldBakedUpload) // Toggle the debug setting UploadBakedTexOld to change between the new caps method and old method
+ && !LLPipeline::sForceOldBakedUpload) // toggle debug setting UploadBakedTexOld to change between the new caps method and old method
{
- llinfos << "Baked texture upload via capability of " << mUploadID << " to " << url << llendl;
-
LLSD body = LLSD::emptyMap();
+ // The responder will call LLTexLayerSetBuffer::onTextureUploadComplete()
LLHTTPClient::post(url, body, new LLSendTexLayerResponder(body, mUploadID, LLAssetType::AT_TEXTURE, baked_upload_data));
- // Responder will call LLTexLayerSetBuffer::onTextureUploadComplete()
+ llinfos << "Baked texture upload via capability of " << mUploadID << " to " << url << llendl;
}
else
{
- llinfos << "Baked texture upload via Asset Store." << llendl;
- // gAssetStorage->storeAssetData(mTransactionID, LLAssetType::AT_IMAGE_JPEG, &uploadCallback, (void *)this, FALSE);
gAssetStorage->storeAssetData(tid,
LLAssetType::AT_TEXTURE,
LLTexLayerSetBuffer::onTextureUploadComplete,
@@ -378,23 +467,53 @@ void LLTexLayerSetBuffer::readBackAndUpload()
TRUE, // temp_file
TRUE, // is_priority
TRUE); // store_local
+ llinfos << "Baked texture upload via Asset Store." << llendl;
+ }
+
+ const BOOL highest_lod = mTexLayerSet->isLocalTextureDataFinal();
+ if (highest_lod)
+ {
+ // Sending the final LOD for the baked texture. All done, pause
+ // the upload timer so we know how long it took.
+ mNeedsUpload = FALSE;
+ mNeedsUploadTimer.pause();
+ }
+ else
+ {
+ // Sending a lower level LOD for the baked texture. Restart the upload timer.
+ mNumLowresUploads++;
+ mNeedsUploadTimer.unpause();
+ mNeedsUploadTimer.reset();
+ }
+
+ // Print out notification that we uploaded this texture.
+ if (gSavedSettings.getBOOL("DebugAvatarRezTime"))
+ {
+ std::string lod_str = highest_lod ? "HighRes" : "LowRes";
+ LLSD args;
+ args["EXISTENCE"] = llformat("%d",(U32)mTexLayerSet->getAvatar()->debugGetExistenceTimeElapsedF32());
+ args["TIME"] = llformat("%d",(U32)mNeedsUploadTimer.getElapsedTimeF32());
+ args["BODYREGION"] = mTexLayerSet->getBodyRegionName();
+ args["RESOLUTION"] = lod_str;
+ LLNotificationsUtil::add("AvatarRezSelfBakeNotification",args);
+ llinfos << "Uploading [ name: " << mTexLayerSet->getBodyRegionName() << " res:" << lod_str << " time:" << (U32)mNeedsUploadTimer.getElapsedTimeF32() << " ]" << llendl;
}
-
- mNeedsUpload = FALSE;
}
else
{
+ // The read back and validate operation failed. Remove the uploaded file.
mUploadPending = FALSE;
- llinfos << "unable to create baked upload file: corrupted" << llendl;
LLVFile file(gVFS, asset_id, LLAssetType::AT_TEXTURE, LLVFile::WRITE);
file.remove();
+ llinfos << "Unable to create baked upload file (reason: corrupted)." << llendl;
}
}
}
- if (!res)
+ else
{
+ // The VFS write file operation failed.
mUploadPending = FALSE;
- llinfos << "unable to create baked upload file" << llendl;
+ llinfos << "Unable to create baked upload file (reason: failed to write file)" << llendl;
}
delete [] baked_color_data;
@@ -409,14 +528,11 @@ void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid,
{
LLBakedUploadData* baked_upload_data = (LLBakedUploadData*)userdata;
- LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
-
- if (0 == result &&
- avatar &&
- !avatar->isDead() &&
- baked_upload_data->mAvatar == avatar && // Sanity check: only the user's avatar should be uploading textures.
- baked_upload_data->mTexLayerSet->hasComposite()
- )
+ if ((result == 0) &&
+ isAgentAvatarValid() &&
+ !gAgentAvatarp->isDead() &&
+ (baked_upload_data->mAvatar == gAgentAvatarp) && // Sanity check: only the user's avatar should be uploading textures.
+ (baked_upload_data->mTexLayerSet->hasComposite()))
{
LLTexLayerSetBuffer* layerset_buffer = baked_upload_data->mTexLayerSet->getComposite();
@@ -435,15 +551,14 @@ void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid,
{
// This is the upload we're currently waiting for.
layerset_buffer->mUploadID.setNull();
- layerset_buffer->mUploadPending = FALSE;
-
if (result >= 0)
{
- LLVOAvatarDefines::ETextureIndex baked_te = avatar->getBakedTE(layerset_buffer->mTexLayerSet);
+ layerset_buffer->mUploadPending = FALSE;
+ LLVOAvatarDefines::ETextureIndex baked_te = gAgentAvatarp->getBakedTE(layerset_buffer->mTexLayerSet);
// Update baked texture info with the new UUID
U64 now = LLFrameTimer::getTotalTime(); // Record starting time
llinfos << "Baked texture upload took " << (S32)((now - baked_upload_data->mStartTime) / 1000) << " ms" << llendl;
- avatar->setNewBakedTexture(baked_te, uuid);
+ gAgentAvatarp->setNewBakedTexture(baked_te, uuid);
}
else
{
@@ -457,7 +572,7 @@ void LLTexLayerSetBuffer::onTextureUploadComplete(const LLUUID& uuid,
llinfos << "Received baked texture out of date, ignored." << llendl;
}
- avatar->dirtyMesh();
+ gAgentAvatarp->dirtyMesh();
}
else
{
@@ -755,7 +870,7 @@ BOOL LLTexLayerSet::isBodyRegion(const std::string& region) const
return mInfo->mBodyRegion == region;
}
-const std::string LLTexLayerSet::getBodyRegion() const
+const std::string LLTexLayerSet::getBodyRegionName() const
{
return mInfo->mBodyRegion;
}
@@ -785,7 +900,7 @@ void LLTexLayerSet::cancelUpload()
void LLTexLayerSet::createComposite()
{
- if( !mComposite )
+ if(!mComposite)
{
S32 width = mInfo->mWidth;
S32 height = mInfo->mHeight;
@@ -820,7 +935,15 @@ void LLTexLayerSet::updateComposite()
LLTexLayerSetBuffer* LLTexLayerSet::getComposite()
{
- createComposite();
+ if (!mComposite)
+ {
+ createComposite();
+ }
+ return mComposite;
+}
+
+const LLTexLayerSetBuffer* LLTexLayerSet::getComposite() const
+{
return mComposite;
}
@@ -903,11 +1026,11 @@ void LLTexLayerSet::applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_
mAvatar->applyMorphMask(tex_data, width, height, num_components, mBakedTexIndex);
}
-BOOL LLTexLayerSet::isMorphValid()
+BOOL LLTexLayerSet::isMorphValid() const
{
- for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
+ for(layer_list_t::const_iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
{
- LLTexLayerInterface* layer = *iter;
+ const LLTexLayerInterface* layer = *iter;
if (layer && !layer->isMorphValid())
{
return FALSE;
@@ -1028,7 +1151,7 @@ BOOL LLTexLayerInfo::parseXml(LLXmlTreeNode* node)
}
if (mLocalTexture == TEX_NUM_INDICES)
{
- llwarns << "<texture> element has invalid local_texure attribute: " << mName << " " << local_texture_name << llendl;
+ llwarns << "<texture> element has invalid local_texture attribute: " << mName << " " << local_texture_name << llendl;
return FALSE;
}
}
@@ -1123,14 +1246,14 @@ BOOL LLTexLayerInfo::createVisualParams(LLVOAvatar *avatar)
LLTexLayerInterface::LLTexLayerInterface(LLTexLayerSet* const layer_set):
mTexLayerSet( layer_set ),
mMorphMasksValid( FALSE ),
- mStaticImageInvalid( FALSE ),
mInfo(NULL),
mHasMorph(FALSE)
{
}
LLTexLayerInterface::LLTexLayerInterface(const LLTexLayerInterface &layer, LLWearable *wearable):
- mTexLayerSet( layer.mTexLayerSet )
+ mTexLayerSet( layer.mTexLayerSet ),
+ mInfo(NULL)
{
// don't add visual params for cloned layers
setInfo(layer.getInfo(), wearable);
@@ -1140,11 +1263,12 @@ LLTexLayerInterface::LLTexLayerInterface(const LLTexLayerInterface &layer, LLWea
BOOL LLTexLayerInterface::setInfo(const LLTexLayerInfo *info, LLWearable* wearable ) // This sets mInfo and calls initialization functions
{
- //llassert(mInfo == NULL); // nyx says this is probably bogus but needs investigating
- if (mInfo != NULL) // above llassert(), but softened into a warning
- {
- llwarns << "BAD STUFF! mInfo != NULL" << llendl;
- }
+ // setInfo should only be called once. Code is not robust enough to handle redefinition of a texlayer.
+ // Not a critical warning, but could be useful for debugging later issues. -Nyx
+ if (mInfo != NULL)
+ {
+ llwarns << "mInfo != NULL" << llendl;
+ }
mInfo = info;
//mID = info->mID; // No ID
@@ -1235,17 +1359,17 @@ void LLTexLayerInterface::invalidateMorphMasks()
mMorphMasksValid = FALSE;
}
-LLViewerVisualParam* LLTexLayerInterface::getVisualParamPtr(S32 index)
+LLViewerVisualParam* LLTexLayerInterface::getVisualParamPtr(S32 index) const
{
LLViewerVisualParam *result = NULL;
- for (param_color_list_t::iterator color_iter = mParamColorList.begin(); color_iter != mParamColorList.end() && !result; ++color_iter)
+ for (param_color_list_t::const_iterator color_iter = mParamColorList.begin(); color_iter != mParamColorList.end() && !result; ++color_iter)
{
if ((*color_iter)->getID() == index)
{
result = *color_iter;
}
}
- for (param_alpha_list_t::iterator alpha_iter = mParamAlphaList.begin(); alpha_iter != mParamAlphaList.end() && !result; ++alpha_iter)
+ for (param_alpha_list_t::const_iterator alpha_iter = mParamAlphaList.begin(); alpha_iter != mParamAlphaList.end() && !result; ++alpha_iter)
{
if ((*alpha_iter)->getID() == index)
{
@@ -1499,7 +1623,7 @@ BOOL LLTexLayer::render(S32 x, S32 y, S32 width, S32 height)
return success;
}
-U8* LLTexLayer::getAlphaData()
+const U8* LLTexLayer::getAlphaData() const
{
LLCRC alpha_mask_crc;
const LLUUID& uuid = getUUID();
@@ -1515,7 +1639,7 @@ U8* LLTexLayer::getAlphaData()
U32 cache_index = alpha_mask_crc.getCRC();
- alpha_cache_t::iterator iter2 = mAlphaCache.find(cache_index);
+ alpha_cache_t::const_iterator iter2 = mAlphaCache.find(cache_index);
return (iter2 == mAlphaCache.end()) ? 0 : iter2->second;
}
@@ -1738,7 +1862,7 @@ BOOL LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
void LLTexLayer::addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32 height)
{
S32 size = width * height;
- U8* alphaData = getAlphaData();
+ const U8* alphaData = getAlphaData();
if (!alphaData && hasAlphaParams())
{
LLColor4 net_color;
@@ -1761,7 +1885,7 @@ void LLTexLayer::addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32
}
}
-/*virtual*/ BOOL LLTexLayer::isInvisibleAlphaMask()
+/*virtual*/ BOOL LLTexLayer::isInvisibleAlphaMask() const
{
if (mLocalTextureObject)
{
@@ -1774,8 +1898,7 @@ void LLTexLayer::addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32
return FALSE;
}
-// private helper function
-LLUUID LLTexLayer::getUUID()
+LLUUID LLTexLayer::getUUID() const
{
LLUUID uuid;
if( getInfo()->mLocalTexture != -1 )
@@ -1834,7 +1957,7 @@ LLTexLayerTemplate::~LLTexLayerTemplate()
return LLTexLayerInterface::setInfo(info, wearable);
}
-U32 LLTexLayerTemplate::updateWearableCache()
+U32 LLTexLayerTemplate::updateWearableCache() const
{
mWearableCache.clear();
@@ -1844,7 +1967,7 @@ U32 LLTexLayerTemplate::updateWearableCache()
//this isn't a cloneable layer
return 0;
}
- EWearableType wearable_type = LLVOAvatarDictionary::getTEWearableType((ETextureIndex)te);
+ LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType((ETextureIndex)te);
U32 num_wearables = gAgentWearables.getWearableCount(wearable_type);
U32 added = 0;
for (U32 i = 0; i < num_wearables; i++)
@@ -1859,7 +1982,7 @@ U32 LLTexLayerTemplate::updateWearableCache()
}
return added;
}
-LLTexLayer* LLTexLayerTemplate::getLayer(U32 i)
+LLTexLayer* LLTexLayerTemplate::getLayer(U32 i) const
{
if (mWearableCache.size() <= i)
{
@@ -1881,6 +2004,11 @@ LLTexLayer* LLTexLayerTemplate::getLayer(U32 i)
/*virtual*/ BOOL LLTexLayerTemplate::render(S32 x, S32 y, S32 width, S32 height)
{
+ if(!mInfo)
+ {
+ return FALSE ;
+ }
+
BOOL success = TRUE;
updateWearableCache();
for (wearable_cache_t::const_iterator iter = mWearableCache.begin(); iter!= mWearableCache.end(); iter++)
@@ -1963,7 +2091,7 @@ LLTexLayer* LLTexLayerTemplate::getLayer(U32 i)
}
}
-/*virtual*/ BOOL LLTexLayerTemplate::isInvisibleAlphaMask()
+/*virtual*/ BOOL LLTexLayerTemplate::isInvisibleAlphaMask() const
{
U32 num_wearables = updateWearableCache();
for (U32 i = 0; i < num_wearables; i++)
@@ -1987,19 +2115,17 @@ LLTexLayer* LLTexLayerTemplate::getLayer(U32 i)
//-----------------------------------------------------------------------------
LLTexLayerInterface* LLTexLayerSet::findLayerByName(const std::string& name)
{
- for( layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
+ for (layer_list_t::iterator iter = mLayerList.begin(); iter != mLayerList.end(); iter++ )
{
LLTexLayerInterface* layer = *iter;
-
if (layer->getName() == name)
{
return layer;
}
}
- for( layer_list_t::iterator iter = mMaskLayerList.begin(); iter != mMaskLayerList.end(); iter++ )
+ for (layer_list_t::iterator iter = mMaskLayerList.begin(); iter != mMaskLayerList.end(); iter++ )
{
LLTexLayerInterface* layer = *iter;
-
if (layer->getName() == name)
{
return layer;
@@ -2044,7 +2170,7 @@ LLTexLayerStaticImageList::~LLTexLayerStaticImageList()
deleteCachedImages();
}
-void LLTexLayerStaticImageList::dumpByteCount()
+void LLTexLayerStaticImageList::dumpByteCount() const
{
llinfos << "Avatar Static Textures " <<
"KB GL:" << (mGLBytes / 1024) <<
@@ -2159,4 +2285,23 @@ BOOL LLTexLayerStaticImageList::loadImageRaw(const std::string& file_name, LLIma
return success;
}
+const std::string LLTexLayerSetBuffer::dumpTextureInfo() const
+{
+ if (!isAgentAvatarValid()) return "";
+
+ const BOOL is_high_res = !mNeedsUpload;
+ const U32 num_low_res = mNumLowresUploads;
+ const U32 upload_time = (U32)mNeedsUploadTimer.getElapsedTimeF32();
+ const std::string local_texture_info = gAgentAvatarp->debugDumpLocalTextureDataInfo(mTexLayerSet);
+
+ std::string status = "CREATING ";
+ if (!uploadNeeded()) status = "DONE ";
+ if (uploadInProgress()) status = "UPLOADING";
+ std::string text = llformat("[%s] [HiRes:%d LoRes:%d] [Elapsed:%d] %s",
+ status.c_str(),
+ is_high_res, num_low_res,
+ upload_time,
+ local_texture_info.c_str());
+ return text;
+}
diff --git a/indra/newview/lltexlayer.h b/indra/newview/lltexlayer.h
index 5be58f64a9..cb2e1faaa6 100644
--- a/indra/newview/lltexlayer.h
+++ b/indra/newview/lltexlayer.h
@@ -1,6 +1,6 @@
/**
* @file lltexlayer.h
- * @brief A texture layer. Used for avatars.
+ * @brief Texture layer classes. Used for avatars.
*
* $LicenseInfo:firstyear=2002&license=viewergpl$
*
@@ -35,40 +35,31 @@
#include <deque>
#include "lldynamictexture.h"
-#include "llwearable.h"
#include "llvoavatardefines.h"
+#include "lltexlayerparams.h"
class LLVOAvatar;
class LLVOAvatarSelf;
class LLImageTGA;
class LLImageRaw;
class LLXmlTreeNode;
-class LLPolyMorphTarget;
class LLTexLayerSet;
class LLTexLayerSetInfo;
class LLTexLayerInfo;
class LLTexLayerSetBuffer;
-class LLTexLayerParamColor;
-class LLTexLayerParamColorInfo;
-class LLTexLayerParamAlpha;
-class LLTexLayerParamAlphaInfo;
class LLWearable;
class LLViewerVisualParam;
-typedef std::vector<LLTexLayerParamColor *> param_color_list_t;
-typedef std::vector<LLTexLayerParamAlpha *> param_alpha_list_t;
-typedef std::vector<LLTexLayerParamColorInfo *> param_color_info_list_t;
-typedef std::vector<LLTexLayerParamAlphaInfo *> param_alpha_info_list_t;
-
-
-//-----------------------------------------------------------------------------
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// LLTexLayerInterface
-// Interface class to generalize functionality shared by LLTexLayer and LLTexLayerTemplate.
-
+//
+// Interface class to generalize functionality shared by LLTexLayer
+// and LLTexLayerTemplate.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLTexLayerInterface
{
public:
- enum ERenderPass
+ enum ERenderPass
{
RP_COLOR,
RP_BUMP,
@@ -79,84 +70,78 @@ public:
LLTexLayerInterface(const LLTexLayerInterface &layer, LLWearable *wearable);
virtual ~LLTexLayerInterface() {}
- const LLTexLayerInfo* getInfo() const { return mInfo; }
- virtual BOOL setInfo(const LLTexLayerInfo *info, LLWearable* wearable ); // This sets mInfo and calls initialization functions
virtual BOOL render(S32 x, S32 y, S32 width, S32 height) = 0;
- void requestUpdate();
- LLTexLayerSet* const getTexLayerSet() const { return mTexLayerSet; }
-
virtual void deleteCaches() = 0;
- void invalidateMorphMasks();
- virtual void setHasMorph(BOOL newval) { mHasMorph = newval; }
- BOOL hasMorph() { return mHasMorph; }
- BOOL isMorphValid() { return mMorphMasksValid; }
+ virtual BOOL blendAlphaTexture(S32 x, S32 y, S32 width, S32 height) = 0;
+ virtual BOOL isInvisibleAlphaMask() const = 0;
+
+ const LLTexLayerInfo* getInfo() const { return mInfo; }
+ virtual BOOL setInfo(const LLTexLayerInfo *info, LLWearable* wearable); // sets mInfo, calls initialization functions
const std::string& getName() const;
- ERenderPass getRenderPass() const;
- const std::string& getGlobalColor() const;
+ const LLTexLayerSet* const getTexLayerSet() const { return mTexLayerSet; }
+ LLTexLayerSet* const getTexLayerSet() { return mTexLayerSet; }
- virtual BOOL blendAlphaTexture( S32 x, S32 y, S32 width, S32 height) = 0;
- virtual void gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height) = 0;
- BOOL hasAlphaParams() const { return !mParamAlphaList.empty(); }
- BOOL isVisibilityMask() const;
- virtual BOOL isInvisibleAlphaMask() = 0;
+ void invalidateMorphMasks();
+ virtual void setHasMorph(BOOL newval) { mHasMorph = newval; }
+ BOOL hasMorph() const { return mHasMorph; }
+ BOOL isMorphValid() const { return mMorphMasksValid; }
- LLTexLayerSet* getLayerSet() {return mTexLayerSet;}
+ void requestUpdate();
+ virtual void gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height) = 0;
+ BOOL hasAlphaParams() const { return !mParamAlphaList.empty(); }
- LLViewerVisualParam* getVisualParamPtr(S32 index);
+ ERenderPass getRenderPass() const;
+ BOOL isVisibilityMask() const;
+protected:
+ const std::string& getGlobalColor() const;
+ LLViewerVisualParam* getVisualParamPtr(S32 index) const;
protected:
- LLTexLayerSet* const mTexLayerSet;
+ LLTexLayerSet* const mTexLayerSet;
+ const LLTexLayerInfo* mInfo;
+ BOOL mMorphMasksValid;
+ BOOL mHasMorph;
// Layers can have either mParamColorList, mGlobalColor, or mFixedColor. They are looked for in that order.
param_color_list_t mParamColorList;
+ param_alpha_list_t mParamAlphaList;
// mGlobalColor name stored in mInfo
// mFixedColor value stored in mInfo
- param_alpha_list_t mParamAlphaList;
-
- BOOL mMorphMasksValid;
- BOOL mStaticImageInvalid;
-
- BOOL mHasMorph;
-
- const LLTexLayerInfo *mInfo;
-
};
-//-----------------------------------------------------------------------------
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// LLTexLayerTemplate
-// Template class
-// Only exists for llvoavatarself
-
+//
+// Only exists for llvoavatarself.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLTexLayerTemplate : public LLTexLayerInterface
{
public:
LLTexLayerTemplate(LLTexLayerSet* const layer_set);
LLTexLayerTemplate(const LLTexLayerTemplate &layer);
/*virtual*/ ~LLTexLayerTemplate();
-
/*virtual*/ BOOL render(S32 x, S32 y, S32 width, S32 height);
- /*virtual*/ BOOL setInfo(const LLTexLayerInfo *info, LLWearable* wearable ); // This sets mInfo and calls initialization functions
- /*virtual*/ BOOL blendAlphaTexture( S32 x, S32 y, S32 width, S32 height); // Multiplies a single alpha texture against the frame buffer
+ /*virtual*/ BOOL setInfo(const LLTexLayerInfo *info, LLWearable* wearable); // This sets mInfo and calls initialization functions
+ /*virtual*/ BOOL blendAlphaTexture(S32 x, S32 y, S32 width, S32 height); // Multiplies a single alpha texture against the frame buffer
/*virtual*/ void gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height);
/*virtual*/ void setHasMorph(BOOL newval);
/*virtual*/ void deleteCaches();
- /*virtual*/ BOOL isInvisibleAlphaMask();
-
+ /*virtual*/ BOOL isInvisibleAlphaMask() const;
+protected:
+ U32 updateWearableCache() const;
+ LLTexLayer* getLayer(U32 i) const;
private:
- U32 updateWearableCache();
- LLTexLayer* getLayer(U32 i);
typedef std::vector<LLWearable*> wearable_cache_t;
- wearable_cache_t mWearableCache;
-
+ mutable wearable_cache_t mWearableCache; // mutable b/c most get- require updating this cache
};
-//-----------------------------------------------------------------------------
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// LLTexLayer
-// A single texture layer
-// Only exists for llvoavatarself
-
+//
+// A single texture layer. Only exists for llvoavatarself.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLTexLayer : public LLTexLayerInterface
{
public:
@@ -165,79 +150,37 @@ public:
LLTexLayer(const LLTexLayerTemplate &layer_template, LLLocalTextureObject *lto, LLWearable *wearable);
/*virtual*/ ~LLTexLayer();
- /*virtual*/ BOOL setInfo(const LLTexLayerInfo *info, LLWearable* wearable ); // This sets mInfo and calls initialization functions
+ /*virtual*/ BOOL setInfo(const LLTexLayerInfo *info, LLWearable* wearable); // This sets mInfo and calls initialization functions
/*virtual*/ BOOL render(S32 x, S32 y, S32 width, S32 height);
/*virtual*/ void deleteCaches();
- U8* getAlphaData();
+ const U8* getAlphaData() const;
BOOL findNetColor(LLColor4* color) const;
- /*virtual*/ BOOL blendAlphaTexture( S32 x, S32 y, S32 width, S32 height); // Multiplies a single alpha texture against the frame buffer
+ /*virtual*/ BOOL blendAlphaTexture(S32 x, S32 y, S32 width, S32 height); // Multiplies a single alpha texture against the frame buffer
/*virtual*/ void gatherAlphaMasks(U8 *data, S32 originX, S32 originY, S32 width, S32 height);
BOOL renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLColor4 &layer_color);
void addAlphaMask(U8 *data, S32 originX, S32 originY, S32 width, S32 height);
- /*virtual*/ BOOL isInvisibleAlphaMask();
+ /*virtual*/ BOOL isInvisibleAlphaMask() const;
- void setLTO(LLLocalTextureObject *lto) { mLocalTextureObject = lto; }
- LLLocalTextureObject* getLTO() { return mLocalTextureObject; }
-
- static void calculateTexLayerColor(const param_color_list_t &param_list, LLColor4 &net_color);
+ void setLTO(LLLocalTextureObject *lto) { mLocalTextureObject = lto; }
+ LLLocalTextureObject* getLTO() { return mLocalTextureObject; }
+ static void calculateTexLayerColor(const param_color_list_t &param_list, LLColor4 &net_color);
+protected:
+ LLUUID getUUID() const;
private:
- LLUUID getUUID();
-
typedef std::map<U32, U8*> alpha_cache_t;
alpha_cache_t mAlphaCache;
- LLLocalTextureObject *mLocalTextureObject;
-};
-
-// Make private
-class LLTexLayerInfo
-{
- friend class LLTexLayer;
- friend class LLTexLayerTemplate;
- friend class LLTexLayerInterface;
-public:
- LLTexLayerInfo();
- ~LLTexLayerInfo();
-
- BOOL parseXml(LLXmlTreeNode* node);
- BOOL createVisualParams(LLVOAvatar *avatar);
- BOOL isUserSettable() { return mLocalTexture != -1; }
- S32 getLocalTexture() const { return mLocalTexture; }
- BOOL getOnlyAlpha() const { return mUseLocalTextureAlphaOnly; }
- std::string getName() const { return mName; }
-
-private:
- std::string mName;
-
- BOOL mWriteAllChannels; // Don't use masking. Just write RGBA into buffer,
- LLTexLayer::ERenderPass mRenderPass;
-
- std::string mGlobalColor;
- LLColor4 mFixedColor;
-
- S32 mLocalTexture;
- std::string mStaticImageFileName;
- BOOL mStaticImageIsMask;
- BOOL mUseLocalTextureAlphaOnly; // Ignore RGB channels from the input texture. Use alpha as a mask
- BOOL mIsVisibilityMask;
-
- typedef std::vector< std::pair< std::string,BOOL > > morph_name_list_t;
- morph_name_list_t mMorphNameList;
- param_color_info_list_t mParamColorInfoList;
- param_alpha_info_list_t mParamAlphaInfoList;
+ LLLocalTextureObject* mLocalTextureObject;
};
-//
-// LLTexLayer
-//-----------------------------------------------------------------------------
-
-//-----------------------------------------------------------------------------
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// LLTexLayerSet
-// An ordered set of texture layers that get composited into a single texture.
-// Only exists for llvoavatarself
-
+//
+// An ordered set of texture layers that gets composited into a single texture.
+// Only exists for llvoavatarself.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLTexLayerSet
{
friend class LLTexLayerSetBuffer;
@@ -245,172 +188,171 @@ public:
LLTexLayerSet(LLVOAvatarSelf* const avatar);
~LLTexLayerSet();
- const LLTexLayerSetInfo* getInfo() const { return mInfo; }
- BOOL setInfo(const LLTexLayerSetInfo *info); // This sets mInfo and calls initialization functions
-
- BOOL render(S32 x, S32 y, S32 width, S32 height);
- void renderAlphaMaskTextures(S32 x, S32 y, S32 width, S32 height, bool forceClear = false);
-
- BOOL isBodyRegion(const std::string& region) const;
- LLTexLayerSetBuffer* getComposite();
- void requestUpdate();
- void requestUpload();
- void cancelUpload();
- void updateComposite();
- BOOL isLocalTextureDataAvailable() const;
- BOOL isLocalTextureDataFinal() const;
- void createComposite();
- void destroyComposite();
- void setUpdatesEnabled(BOOL b);
- BOOL getUpdatesEnabled() const { return mUpdatesEnabled; }
- void deleteCaches();
- void gatherMorphMaskAlpha(U8 *data, S32 width, S32 height);
- void applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components);
- BOOL isMorphValid();
- void invalidateMorphMasks();
- LLTexLayerInterface* findLayerByName(const std::string& name);
- void cloneTemplates(LLLocalTextureObject *lto, LLVOAvatarDefines::ETextureIndex tex_index, LLWearable* wearable);
+ const LLTexLayerSetInfo* getInfo() const { return mInfo; }
+ BOOL setInfo(const LLTexLayerSetInfo *info); // This sets mInfo and calls initialization functions
+
+ BOOL render(S32 x, S32 y, S32 width, S32 height);
+ void renderAlphaMaskTextures(S32 x, S32 y, S32 width, S32 height, bool forceClear = false);
+
+ BOOL isBodyRegion(const std::string& region) const;
+ LLTexLayerSetBuffer* getComposite();
+ const LLTexLayerSetBuffer* getComposite() const; // Do not create one if it doesn't exist.
+ void requestUpdate();
+ void requestUpload();
+ void cancelUpload();
+ void updateComposite();
+ BOOL isLocalTextureDataAvailable() const;
+ BOOL isLocalTextureDataFinal() const;
+ void createComposite();
+ void destroyComposite();
+ void setUpdatesEnabled(BOOL b);
+ BOOL getUpdatesEnabled() const { return mUpdatesEnabled; }
+ void deleteCaches();
+ void gatherMorphMaskAlpha(U8 *data, S32 width, S32 height);
+ void applyMorphMask(U8* tex_data, S32 width, S32 height, S32 num_components);
+ BOOL isMorphValid() const;
+ void invalidateMorphMasks();
+ LLTexLayerInterface* findLayerByName(const std::string& name);
+ void cloneTemplates(LLLocalTextureObject *lto, LLVOAvatarDefines::ETextureIndex tex_index, LLWearable* wearable);
- LLVOAvatarSelf* getAvatar() const { return mAvatar; }
- const std::string getBodyRegion() const;
- BOOL hasComposite() const { return (mComposite.notNull()); }
+ LLVOAvatarSelf* getAvatar() const { return mAvatar; }
+ const std::string getBodyRegionName() const;
+ BOOL hasComposite() const { return (mComposite.notNull()); }
LLVOAvatarDefines::EBakedTextureIndex getBakedTexIndex() { return mBakedTexIndex; }
- void setBakedTexIndex( LLVOAvatarDefines::EBakedTextureIndex index) { mBakedTexIndex = index; }
- BOOL isVisible() const { return mIsVisible; }
+ void setBakedTexIndex(LLVOAvatarDefines::EBakedTextureIndex index) { mBakedTexIndex = index; }
+ BOOL isVisible() const { return mIsVisible; }
-public:
- static BOOL sHasCaches;
-
- typedef std::vector<LLTexLayerInterface *> layer_list_t;
+ static BOOL sHasCaches;
private:
- layer_list_t mLayerList;
- layer_list_t mMaskLayerList;
+ typedef std::vector<LLTexLayerInterface *> layer_list_t;
+ layer_list_t mLayerList;
+ layer_list_t mMaskLayerList;
LLPointer<LLTexLayerSetBuffer> mComposite;
- LLVOAvatarSelf* const mAvatar; // Backlink only; don't make this an LLPointer.
- BOOL mUpdatesEnabled;
- BOOL mIsVisible;
+ LLVOAvatarSelf* const mAvatar; // note: backlink only; don't make this an LLPointer.
+ BOOL mUpdatesEnabled;
+ BOOL mIsVisible;
LLVOAvatarDefines::EBakedTextureIndex mBakedTexIndex;
-
- const LLTexLayerSetInfo *mInfo;
+ const LLTexLayerSetInfo* mInfo;
};
-// Contains shared layer set data
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// LLTexLayerSetInfo
+//
+// Contains shared layer set data.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLTexLayerSetInfo
{
friend class LLTexLayerSet;
public:
LLTexLayerSetInfo();
~LLTexLayerSetInfo();
-
BOOL parseXml(LLXmlTreeNode* node);
void createVisualParams(LLVOAvatar *avatar);
-
private:
std::string mBodyRegion;
S32 mWidth;
S32 mHeight;
std::string mStaticAlphaFileName;
BOOL mClearAlpha; // Set alpha to 1 for this layerset (if there is no mStaticAlphaFileName)
-
typedef std::vector<LLTexLayerInfo*> layer_info_list_t;
layer_info_list_t mLayerInfoList;
};
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// LLTexLayerSetBuffer
+//
// The composite image that a LLTexLayerSet writes to. Each LLTexLayerSet has one.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLTexLayerSetBuffer : public LLViewerDynamicTexture
{
public:
LLTexLayerSetBuffer(LLTexLayerSet* const owner, S32 width, S32 height);
virtual ~LLTexLayerSetBuffer();
-
+ /*virtual*/ S8 getType() const;
virtual void preRender(BOOL clear_depth);
virtual void postRender(BOOL success);
virtual BOOL render();
BOOL updateImmediate();
- bool isInitialized(void) const;
- BOOL needsRender();
+
+ BOOL isInitialized(void) const;
+ BOOL uploadPending() const; // We are expecting a new texture to be uploaded at some point
+ BOOL uploadNeeded() const; // We need to upload a new texture
+ BOOL uploadInProgress() const; // We have started uploading a new texture and are awaiting the result
+
+ /*virtual*/ BOOL needsRender();
void requestUpdate();
void requestUpload();
void cancelUpload();
- BOOL uploadPending() { return mUploadPending; }
- BOOL render( S32 x, S32 y, S32 width, S32 height );
+ BOOL render(S32 x, S32 y, S32 width, S32 height);
void readBackAndUpload();
-
static void onTextureUploadComplete(const LLUUID& uuid,
void* userdata,
S32 result, LLExtStat ext_status);
static void dumpTotalByteCount();
+ const std::string dumpTextureInfo() const;
+ virtual void restoreGLTexture();
+ virtual void destroyGLTexture();
- virtual void restoreGLTexture();
- virtual void destroyGLTexture();
-private:
+protected:
void pushProjection() const;
void popProjection() const;
-
+ BOOL isReadyToUpload() const;
+ void conditionalRestartUploadTimer();
+
private:
LLTexLayerSet* const mTexLayerSet;
-
- BOOL mNeedsUpdate;
- BOOL mNeedsUpload;
- BOOL mUploadPending;
- LLUUID mUploadID; // Identifys the current upload process (null if none). Used to avoid overlaps (eg, when the user rapidly makes two changes outside of Face Edit)
-
+ BOOL mNeedsUpdate; // whether we need to update our baked textures
+ BOOL mNeedsUpload; // whether we need to send our baked textures to the server
+ U32 mNumLowresUploads; // number of times we've sent a lowres version of our baked textures to the server
+ BOOL mUploadPending; // whether we have received back the new baked textures
+ LLUUID mUploadID; // the current upload process (null if none). Used to avoid overlaps, e.g. when the user rapidly makes two changes outside of Face Edit.
static S32 sGLByteCount;
+ LLFrameTimer mNeedsUploadTimer; // Tracks time since upload was requested
};
-//
-// LLTexLayerSet
-//-----------------------------------------------------------------------------
-
-//-----------------------------------------------------------------------------
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// LLTexLayerStaticImageList
//
-
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLTexLayerStaticImageList : public LLSingleton<LLTexLayerStaticImageList>
{
public:
LLTexLayerStaticImageList();
~LLTexLayerStaticImageList();
-
LLViewerTexture* getTexture(const std::string& file_name, BOOL is_mask);
- LLImageTGA* getImageTGA(const std::string& file_name);
-
- void deleteCachedImages();
- void dumpByteCount();
-
-private:
- BOOL loadImageRaw(const std::string& file_name, LLImageRaw* image_raw);
-
+ LLImageTGA* getImageTGA(const std::string& file_name);
+ void deleteCachedImages();
+ void dumpByteCount() const;
+protected:
+ BOOL loadImageRaw(const std::string& file_name, LLImageRaw* image_raw);
private:
- LLStringTable mImageNames;
-
- typedef std::map< const char*, LLPointer<LLViewerTexture> > texture_map_t;
- texture_map_t mStaticImageList;
- typedef std::map< const char*, LLPointer<LLImageTGA> > image_tga_map_t;
- image_tga_map_t mStaticImageListTGA;
-
- S32 mGLBytes;
- S32 mTGABytes;
+ LLStringTable mImageNames;
+ typedef std::map<const char*, LLPointer<LLViewerTexture> > texture_map_t;
+ texture_map_t mStaticImageList;
+ typedef std::map<const char*, LLPointer<LLImageTGA> > image_tga_map_t;
+ image_tga_map_t mStaticImageListTGA;
+ S32 mGLBytes;
+ S32 mTGABytes;
};
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// LLBakedUploadData
+//
// Used by LLTexLayerSetBuffer for a callback.
-// Note to anyone merging branches - this supercedes the previous fix
-// for DEV-31590 "Heap corruption and crash after outfit changes",
-// here and in lltexlayer.cpp. Equally correct and a bit simpler.
-class LLBakedUploadData
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+struct LLBakedUploadData
{
-public:
- LLBakedUploadData(const LLVOAvatarSelf* avatar, LLTexLayerSet* layerset, const LLUUID& id);
+ LLBakedUploadData(const LLVOAvatarSelf* avatar,
+ LLTexLayerSet* layerset,
+ const LLUUID& id);
~LLBakedUploadData() {}
-
const LLUUID mID;
- const LLVOAvatarSelf* mAvatar; // just backlink, don't LLPointer
+ const LLVOAvatarSelf* mAvatar; // note: backlink only; don't LLPointer
LLTexLayerSet* mTexLayerSet;
- const U64 mStartTime; // Used to measure time baked texture upload requires
+ const U64 mStartTime; // for measuring baked texture upload time
};
-
#endif // LL_LLTEXLAYER_H
diff --git a/indra/newview/lltexlayerparams.cpp b/indra/newview/lltexlayerparams.cpp
index d55468841d..f2d1b5d032 100644
--- a/indra/newview/lltexlayerparams.cpp
+++ b/indra/newview/lltexlayerparams.cpp
@@ -1,6 +1,6 @@
/**
* @file lltexlayerparams.cpp
- * @brief SERAPH - ADD IN
+ * @brief Texture layer parameters
*
* $LicenseInfo:firstyear=2002&license=viewergpl$
*
@@ -33,7 +33,7 @@
#include "lltexlayerparams.h"
-#include "llagent.h"
+#include "llagentcamera.h"
#include "llimagetga.h"
#include "lltexlayer.h"
#include "llvoavatarself.h"
@@ -180,7 +180,7 @@ void LLTexLayerParamAlpha::setWeight(F32 weight, BOOL upload_bake)
if ((mAvatar->getSex() & getSex()) && (mAvatar->isSelf() && !mIsDummy)) // only trigger a baked texture update if we're changing a wearable's visual param.
{
- if (gAgent.cameraCustomizeAvatar())
+ if (gAgentCamera.cameraCustomizeAvatar())
{
upload_bake = FALSE;
}
@@ -234,8 +234,8 @@ BOOL LLTexLayerParamAlpha::getSkip() const
}
}
- EWearableType type = (EWearableType)getWearableType();
- if ((type != WT_INVALID) && !avatar->isWearingWearableType(type))
+ LLWearableType::EType type = (LLWearableType::EType)getWearableType();
+ if ((type != LLWearableType::WT_INVALID) && !avatar->isWearingWearableType(type))
{
return TRUE;
}
diff --git a/indra/newview/lltexlayerparams.h b/indra/newview/lltexlayerparams.h
index 93d01352d4..7747ee1ebf 100644
--- a/indra/newview/lltexlayerparams.h
+++ b/indra/newview/lltexlayerparams.h
@@ -42,6 +42,10 @@ class LLViewerTexture;
class LLVOAvatar;
class LLWearable;
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// LLTexLayerParam
+//
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLTexLayerParam : public LLViewerVisualParam
{
public:
@@ -55,9 +59,10 @@ protected:
LLVOAvatar* mAvatar;
};
-//-----------------------------------------------------------------------------
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// LLTexLayerParamAlpha
//
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLTexLayerParamAlpha : public LLTexLayerParam
{
public:
@@ -124,9 +129,10 @@ private:
// LLTexLayerParamAlpha
//-----------------------------------------------------------------------------
-//-----------------------------------------------------------------------------
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// LLTexLayerParamColor
//
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLTexLayerParamColor : public LLTexLayerParam
{
public:
@@ -184,8 +190,9 @@ private:
S32 mNumColors;
};
-//
-// LLTexLayerParamColor
-//-----------------------------------------------------------------------------
+typedef std::vector<LLTexLayerParamColor *> param_color_list_t;
+typedef std::vector<LLTexLayerParamAlpha *> param_alpha_list_t;
+typedef std::vector<LLTexLayerParamColorInfo *> param_color_info_list_t;
+typedef std::vector<LLTexLayerParamAlphaInfo *> param_alpha_info_list_t;
#endif
diff --git a/indra/newview/lltexturecache.cpp b/indra/newview/lltexturecache.cpp
index a7f26f1df1..9ad2322765 100644
--- a/indra/newview/lltexturecache.cpp
+++ b/indra/newview/lltexturecache.cpp
@@ -51,7 +51,8 @@
// cache/textures/[0-F]/UUID.texture
// Actual texture body files
-const S32 TEXTURE_CACHE_ENTRY_SIZE = 1024;
+//note: there is no good to define 1024 for TEXTURE_CACHE_ENTRY_SIZE while FIRST_PACKET_SIZE is 600 on sim side.
+const S32 TEXTURE_CACHE_ENTRY_SIZE = FIRST_PACKET_SIZE;//1024;
const F32 TEXTURE_CACHE_PURGE_AMOUNT = .20f; // % amount to reduce the cache by when it exceeds its limit
const F32 TEXTURE_CACHE_LRU_SIZE = .10f; // % amount for LRU list (low overhead to regenerate)
@@ -400,7 +401,8 @@ bool LLTextureCacheRemoteWorker::doRead()
// Second state / stage : identify the cache or not...
if (!done && (mState == CACHE))
{
- idx = mCache->getHeaderCacheEntry(mID, mImageSize);
+ LLTextureCache::Entry entry ;
+ idx = mCache->getHeaderCacheEntry(mID, entry);
if (idx < 0)
{
// The texture is *not* cached. We're done here...
@@ -409,6 +411,7 @@ bool LLTextureCacheRemoteWorker::doRead()
}
else
{
+ mImageSize = entry.mImageSize ;
// If the read offset is bigger than the header cache, we read directly from the body
// Note that currently, we *never* read with offset from the cache, so the result is *always* HEADER
mState = mOffset < TEXTURE_CACHE_ENTRY_SIZE ? HEADER : BODY;
@@ -530,13 +533,14 @@ bool LLTextureCacheRemoteWorker::doRead()
bool LLTextureCacheRemoteWorker::doWrite()
{
bool done = false;
- S32 idx = -1;
+ S32 idx = -1;
// First state / stage : check that what we're trying to cache is in an OK shape
if (mState == INIT)
{
llassert_always(mOffset == 0); // We currently do not support write offsets
llassert_always(mDataSize > 0); // Things will go badly wrong if mDataSize is nul or negative...
+ llassert_always(mImageSize >= mDataSize);
mState = CACHE;
}
@@ -546,14 +550,19 @@ bool LLTextureCacheRemoteWorker::doWrite()
if (!done && (mState == CACHE))
{
bool alreadyCached = false;
- S32 cur_imagesize = 0;
+ LLTextureCache::Entry entry ;
+
// Checks if this image is already in the entry list
- idx = mCache->getHeaderCacheEntry(mID, cur_imagesize);
- if (idx >= 0 && (cur_imagesize >= 0))
+ idx = mCache->getHeaderCacheEntry(mID, entry);
+ if(idx < 0)
+ {
+ idx = mCache->setHeaderCacheEntry(mID, entry, mImageSize, mDataSize); // create the new entry.
+ }
+ else
{
- alreadyCached = true; // already there and non empty
+ alreadyCached = mCache->updateEntry(idx, entry, mImageSize, mDataSize); // update the existing entry.
}
- idx = mCache->setHeaderCacheEntry(mID, mImageSize); // create or touch the entry
+
if (idx < 0)
{
llwarns << "LLTextureCacheWorker: " << mID
@@ -563,10 +572,6 @@ bool LLTextureCacheRemoteWorker::doWrite()
}
else
{
- if (cur_imagesize > 0 && (mImageSize != cur_imagesize))
- {
- alreadyCached = false; // re-write the header if the size changed in all cases
- }
if (alreadyCached && (mDataSize <= TEXTURE_CACHE_ENTRY_SIZE))
{
// Small texture already cached case: we're done with writing
@@ -629,7 +634,7 @@ bool LLTextureCacheRemoteWorker::doWrite()
{
llassert(mDataSize > TEXTURE_CACHE_ENTRY_SIZE); // wouldn't make sense to be here otherwise...
S32 file_size = mDataSize - TEXTURE_CACHE_ENTRY_SIZE;
- if ((file_size > 0) && mCache->updateTextureEntryList(mID, file_size))
+
{
// build the cache file name from the UUID
std::string filename = mCache->getTextureFileName(mID);
@@ -647,10 +652,7 @@ bool LLTextureCacheRemoteWorker::doWrite()
done = true;
}
}
- else
- {
- mDataSize = 0; // no data written
- }
+
// Nothing else to do at that point...
done = true;
}
@@ -741,7 +743,7 @@ LLTextureCache::LLTextureCache(bool threaded)
mHeaderMutex(NULL),
mListMutex(NULL),
mHeaderAPRFile(NULL),
- mReadOnly(FALSE),
+ mReadOnly(TRUE), //do not allow to change the texture cache until setReadOnly() is called.
mTexturesSizeTotal(0),
mDoPurge(FALSE)
{
@@ -749,6 +751,8 @@ LLTextureCache::LLTextureCache(bool threaded)
LLTextureCache::~LLTextureCache()
{
+ clearDeleteList() ;
+ writeUpdatedEntries() ;
}
//////////////////////////////////////////////////////////////////////////////
@@ -756,6 +760,9 @@ LLTextureCache::~LLTextureCache()
//virtual
S32 LLTextureCache::update(U32 max_time_ms)
{
+ static LLFrameTimer timer ;
+ static const F32 MAX_TIME_INTERVAL = 300.f ; //seconds.
+
S32 res;
res = LLWorkerThread::update(max_time_ms);
@@ -791,6 +798,12 @@ S32 LLTextureCache::update(U32 max_time_ms)
responder->completed(success);
}
+ if(!res && timer.getElapsedTimeF32() > MAX_TIME_INTERVAL)
+ {
+ timer.reset() ;
+ writeUpdatedEntries() ;
+ }
+
return res;
}
@@ -813,58 +826,6 @@ std::string LLTextureCache::getTextureFileName(const LLUUID& id)
return filename;
}
-bool LLTextureCache::updateTextureEntryList(const LLUUID& id, S32 bodysize)
-{
- bool res = false;
- bool purge = false;
- {
- LLMutexLock lock(&mHeaderMutex);
- size_map_t::iterator iter1 = mTexturesSizeMap.find(id);
- if (iter1 == mTexturesSizeMap.end() || iter1->second < bodysize)
- {
- llassert_always(bodysize > 0);
-
- S32 oldbodysize = 0;
- if (iter1 != mTexturesSizeMap.end())
- {
- oldbodysize = iter1->second;
- }
-
- Entry entry;
- S32 idx = openAndReadEntry(id, entry, false);
- if (idx < 0)
- {
- llwarns << "Failed to open entry: " << id << llendl;
- removeHeaderCacheEntry(id);
- LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool());
- return false;
- }
- else if (oldbodysize != entry.mBodySize)
- {
- // TODO: change to llwarns
- llerrs << "Entry mismatch in mTextureSizeMap / mHeaderIDMap"
- << " idx=" << idx << " oldsize=" << oldbodysize << " entrysize=" << entry.mBodySize << llendl;
- }
- entry.mBodySize = bodysize;
- writeEntryAndClose(idx, entry);
-
- mTexturesSizeTotal -= oldbodysize;
- mTexturesSizeTotal += bodysize;
-
- if (mTexturesSizeTotal > sCacheMaxTexturesSize)
- {
- purge = true;
- }
- res = true;
- }
- }
- if (purge)
- {
- mDoPurge = TRUE;
- }
- return res;
-}
-
//debug
BOOL LLTextureCache::isInCache(const LLUUID& id)
{
@@ -922,13 +883,16 @@ U32 LLTextureCache::sCacheMaxEntries = MAX_REASONABLE_FILE_SIZE / TEXTURE_CACHE_
S64 LLTextureCache::sCacheMaxTexturesSize = 0; // no limit
const char* entries_filename = "texture.entries";
const char* cache_filename = "texture.cache";
-const char* textures_dirname = "textures";
+const char* old_textures_dirname = "textures";
+//change the location of the texture cache to prevent from being deleted by old version viewers.
+const char* textures_dirname = "texturecache";
void LLTextureCache::setDirNames(ELLPath location)
{
std::string delem = gDirUtilp->getDirDelimiter();
- mHeaderEntriesFileName = gDirUtilp->getExpandedFilename(location, entries_filename);
- mHeaderDataFileName = gDirUtilp->getExpandedFilename(location, cache_filename);
+
+ mHeaderEntriesFileName = gDirUtilp->getExpandedFilename(location, textures_dirname, entries_filename);
+ mHeaderDataFileName = gDirUtilp->getExpandedFilename(location, textures_dirname, cache_filename);
mTexturesDirName = gDirUtilp->getExpandedFilename(location, textures_dirname);
}
@@ -940,16 +904,38 @@ void LLTextureCache::purgeCache(ELLPath location)
{
setDirNames(location);
llassert_always(mHeaderAPRFile == NULL);
- LLAPRFile::remove(mHeaderEntriesFileName, getLocalAPRFilePool());
- LLAPRFile::remove(mHeaderDataFileName, getLocalAPRFilePool());
+
+ //remove the legacy cache if exists
+ std::string texture_dir = mTexturesDirName ;
+ mTexturesDirName = gDirUtilp->getExpandedFilename(location, old_textures_dirname);
+ if(LLFile::isdir(mTexturesDirName))
+ {
+ std::string file_name = gDirUtilp->getExpandedFilename(location, entries_filename);
+ LLAPRFile::remove(file_name, getLocalAPRFilePool());
+
+ file_name = gDirUtilp->getExpandedFilename(location, cache_filename);
+ LLAPRFile::remove(file_name, getLocalAPRFilePool());
+
+ purgeAllTextures(true);
+ }
+ mTexturesDirName = texture_dir ;
}
+
+ //remove the current texture cache.
purgeAllTextures(true);
}
-S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL read_only)
+//is called in the main thread before initCache(...) is called.
+void LLTextureCache::setReadOnly(BOOL read_only)
{
- mReadOnly = read_only;
-
+ mReadOnly = read_only ;
+}
+
+//called in the main thread.
+S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL disable_texture_cache)
+{
+ llassert_always(getPending() == 0) ; //should not start accessing the texture cache before initialized.
+
S64 header_size = (max_size * 2) / 10;
S64 max_entries = header_size / TEXTURE_CACHE_ENTRY_SIZE;
sCacheMaxEntries = (S32)(llmin((S64)sCacheMaxEntries, max_entries));
@@ -961,6 +947,15 @@ S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL read_only)
sCacheMaxTexturesSize = max_size;
max_size -= sCacheMaxTexturesSize;
+ if(disable_texture_cache) //the texture cache is disabled
+ {
+ llinfos << "The texture cache is disabled!" << llendl ;
+ setReadOnly(TRUE) ;
+ purgeAllTextures(true);
+
+ return max_size ;
+ }
+
LL_INFOS("TextureCache") << "Headers: " << sCacheMaxEntries
<< " Textures size: " << sCacheMaxTexturesSize/(1024*1024) << " MB" << LL_ENDL;
@@ -969,6 +964,7 @@ S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL read_only)
if (!mReadOnly)
{
LLFile::mkdir(mTexturesDirName);
+
const char* subdirs = "0123456789abcdef";
for (S32 i=0; i<16; i++)
{
@@ -979,6 +975,8 @@ S64 LLTextureCache::initCache(ELLPath location, S64 max_size, BOOL read_only)
readHeaderCache();
purgeTextures(true); // calc mTexturesSize and make some room in the texture cache if we need it
+ llassert_always(getPending() == 0) ; //should not start accessing the texture cache before initialized.
+
return max_size; // unused cache space
}
@@ -990,7 +988,10 @@ LLAPRFile* LLTextureCache::openHeaderEntriesFile(bool readonly, S32 offset)
llassert_always(mHeaderAPRFile == NULL);
apr_int32_t flags = readonly ? APR_READ|APR_BINARY : APR_READ|APR_WRITE|APR_BINARY;
mHeaderAPRFile = new LLAPRFile(mHeaderEntriesFileName, flags, getLocalAPRFilePool());
- mHeaderAPRFile->seek(APR_SET, offset);
+ if(offset > 0)
+ {
+ mHeaderAPRFile->seek(APR_SET, offset);
+ }
return mHeaderAPRFile;
}
@@ -1010,6 +1011,12 @@ void LLTextureCache::readEntriesHeader()
LLAPRFile::readEx(mHeaderEntriesFileName, (U8*)&mHeaderEntriesInfo, 0, sizeof(EntriesInfo),
getLocalAPRFilePool());
}
+ else //create an empty entries header.
+ {
+ mHeaderEntriesInfo.mVersion = sHeaderCacheVersion ;
+ mHeaderEntriesInfo.mEntries = 0 ;
+ writeEntriesHeader() ;
+ }
}
void LLTextureCache::writeEntriesHeader()
@@ -1022,8 +1029,7 @@ void LLTextureCache::writeEntriesHeader()
}
}
-static S32 mHeaderEntriesMaxWriteIdx = 0;
-
+//mHeaderMutex is locked before calling this.
S32 LLTextureCache::openAndReadEntry(const LLUUID& id, Entry& entry, bool create)
{
S32 idx = -1;
@@ -1063,8 +1069,7 @@ S32 LLTextureCache::openAndReadEntry(const LLUUID& id, Entry& entry, bool create
if (iter3 != mHeaderIDMap.end() && iter3->second >= 0)
{
idx = iter3->second;
- mHeaderIDMap.erase(oldid);
- mTexturesSizeMap.erase(oldid);
+ removeCachedTexture(oldid) ;//remove the existing cached texture to release the entry index.
break;
}
}
@@ -1074,20 +1079,9 @@ S32 LLTextureCache::openAndReadEntry(const LLUUID& id, Entry& entry, bool create
}
if (idx >= 0)
{
- // Set the header index
- mHeaderIDMap[id] = idx;
- llassert_always(mTexturesSizeMap.erase(id) == 0);
- // Initialize the entry (will get written later)
- entry.init(id, time(NULL));
- // Update Header
- writeEntriesHeader();
- // Write Entry
- S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry);
- LLAPRFile* aprfile = openHeaderEntriesFile(false, offset);
- S32 bytes_written = aprfile->write((void*)&entry, (S32)sizeof(Entry));
- llassert_always(bytes_written == sizeof(Entry));
- mHeaderEntriesMaxWriteIdx = llmax(mHeaderEntriesMaxWriteIdx, idx);
- closeHeaderEntriesFile();
+ entry.mID = id ;
+ entry.mImageSize = -1 ; //mark it is a brand-new entry.
+ entry.mBodySize = 0 ;
}
}
}
@@ -1096,37 +1090,135 @@ S32 LLTextureCache::openAndReadEntry(const LLUUID& id, Entry& entry, bool create
// Remove this entry from the LRU if it exists
mLRU.erase(id);
// Read the entry
- S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry);
- LLAPRFile* aprfile = openHeaderEntriesFile(true, offset);
- S32 bytes_read = aprfile->read((void*)&entry, (S32)sizeof(Entry));
- llassert_always(bytes_read == sizeof(Entry));
- llassert_always(entry.mImageSize == 0 || entry.mImageSize == -1 || entry.mImageSize > entry.mBodySize);
- closeHeaderEntriesFile();
+ idx_entry_map_t::iterator iter = mUpdatedEntryMap.find(idx) ;
+ if(iter != mUpdatedEntryMap.end())
+ {
+ entry = iter->second ;
+ }
+ else
+ {
+ readEntryFromHeaderImmediately(idx, entry) ;
+ }
+ if(entry.mImageSize <= entry.mBodySize)//it happens on 64-bit systems, do not know why
+ {
+ llwarns << "corrupted entry: " << id << " entry image size: " << entry.mImageSize << " entry body size: " << entry.mBodySize << llendl ;
+
+ //erase this entry and the cached texture from the cache.
+ std::string tex_filename = getTextureFileName(id);
+ removeEntry(idx, entry, tex_filename) ;
+ mUpdatedEntryMap.erase(idx) ;
+ idx = -1 ;
+ }
}
return idx;
}
-void LLTextureCache::writeEntryAndClose(S32 idx, Entry& entry)
+//mHeaderMutex is locked before calling this.
+void LLTextureCache::writeEntryToHeaderImmediately(S32 idx, Entry& entry, bool write_header)
+{
+ LLAPRFile* aprfile ;
+ S32 bytes_written ;
+ S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry);
+ if(write_header)
+ {
+ aprfile = openHeaderEntriesFile(false, 0);
+ bytes_written = aprfile->write((U8*)&mHeaderEntriesInfo, sizeof(EntriesInfo)) ;
+ llassert_always(bytes_written == sizeof(EntriesInfo));
+ mHeaderAPRFile->seek(APR_SET, offset);
+ }
+ else
+ {
+ aprfile = openHeaderEntriesFile(false, offset);
+ }
+ bytes_written = aprfile->write((void*)&entry, (S32)sizeof(Entry));
+ llassert_always(bytes_written == sizeof(Entry));
+ closeHeaderEntriesFile();
+ mUpdatedEntryMap.erase(idx) ;
+}
+
+//mHeaderMutex is locked before calling this.
+void LLTextureCache::readEntryFromHeaderImmediately(S32 idx, Entry& entry)
+{
+ S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry);
+ LLAPRFile* aprfile = openHeaderEntriesFile(true, offset);
+ S32 bytes_read = aprfile->read((void*)&entry, (S32)sizeof(Entry));
+ llassert_always(bytes_read == sizeof(Entry));
+ closeHeaderEntriesFile();
+}
+
+//mHeaderMutex is locked before calling this.
+//update an existing entry time stamp, delay writing.
+void LLTextureCache::updateEntryTimeStamp(S32 idx, Entry& entry)
{
+ static const U32 MAX_ENTRIES_WITHOUT_TIME_STAMP = (U32)(LLTextureCache::sCacheMaxEntries * 0.75f) ;
+
+ if(mHeaderEntriesInfo.mEntries < MAX_ENTRIES_WITHOUT_TIME_STAMP)
+ {
+ return ; //there are enough empty entry index space, no need to stamp time.
+ }
+
if (idx >= 0)
{
if (!mReadOnly)
{
- entry.mTime = time(NULL);
- llassert_always(entry.mImageSize == 0 || entry.mImageSize == -1 || entry.mImageSize > entry.mBodySize);
- if (entry.mBodySize > 0)
- {
- mTexturesSizeMap[entry.mID] = entry.mBodySize;
- }
-// llinfos << "Updating TE: " << idx << ": " << id << " Size: " << entry.mBodySize << " Time: " << entry.mTime << llendl;
- S32 offset = sizeof(EntriesInfo) + idx * sizeof(Entry);
- LLAPRFile* aprfile = openHeaderEntriesFile(false, offset);
- S32 bytes_written = aprfile->write((void*)&entry, (S32)sizeof(Entry));
- llassert_always(bytes_written == sizeof(Entry));
- mHeaderEntriesMaxWriteIdx = llmax(mHeaderEntriesMaxWriteIdx, idx);
- closeHeaderEntriesFile();
+ entry.mTime = time(NULL);
+ mUpdatedEntryMap[idx] = entry ;
+ }
+ }
+}
+
+//update an existing entry, write to header file immediately.
+bool LLTextureCache::updateEntry(S32 idx, Entry& entry, S32 new_image_size, S32 new_data_size)
+{
+ S32 new_body_size = llmax(0, new_data_size - TEXTURE_CACHE_ENTRY_SIZE) ;
+
+ if(new_image_size == entry.mImageSize && new_body_size == entry.mBodySize)
+ {
+ return true ; //nothing changed.
+ }
+ else
+ {
+ bool purge = false ;
+
+ lockHeaders() ;
+
+ bool update_header = false ;
+ if(entry.mImageSize < 0) //is a brand-new entry
+ {
+ mHeaderIDMap[entry.mID] = idx;
+ mTexturesSizeMap[entry.mID] = new_body_size ;
+ mTexturesSizeTotal += new_body_size ;
+
+ // Update Header
+ update_header = true ;
+ }
+ else if (entry.mBodySize != new_body_size)
+ {
+ //already in mHeaderIDMap.
+ mTexturesSizeMap[entry.mID] = new_body_size ;
+ mTexturesSizeTotal -= entry.mBodySize ;
+ mTexturesSizeTotal += new_body_size ;
+ }
+ entry.mTime = time(NULL);
+ entry.mImageSize = new_image_size ;
+ entry.mBodySize = new_body_size ;
+
+ writeEntryToHeaderImmediately(idx, entry, update_header) ;
+
+ if (mTexturesSizeTotal > sCacheMaxTexturesSize)
+ {
+ purge = true;
+ }
+
+ unlockHeaders() ;
+
+ if (purge)
+ {
+ mDoPurge = TRUE;
}
}
+
+ return false ;
}
U32 LLTextureCache::openAndReadEntries(std::vector<Entry>& entries)
@@ -1138,7 +1230,17 @@ U32 LLTextureCache::openAndReadEntries(std::vector<Entry>& entries)
mFreeList.clear();
mTexturesSizeTotal = 0;
- LLAPRFile* aprfile = openHeaderEntriesFile(false, (S32)sizeof(EntriesInfo));
+ LLAPRFile* aprfile = NULL;
+ if(mUpdatedEntryMap.empty())
+ {
+ aprfile = openHeaderEntriesFile(true, (S32)sizeof(EntriesInfo));
+ }
+ else //update the header file first.
+ {
+ aprfile = openHeaderEntriesFile(false, 0);
+ updatedHeaderEntriesFile() ;
+ aprfile->seek(APR_SET, (S32)sizeof(EntriesInfo));
+ }
for (U32 idx=0; idx<num_entries; idx++)
{
Entry entry;
@@ -1152,19 +1254,15 @@ U32 LLTextureCache::openAndReadEntries(std::vector<Entry>& entries)
}
entries.push_back(entry);
// llinfos << "ENTRY: " << entry.mTime << " TEX: " << entry.mID << " IDX: " << idx << " Size: " << entry.mImageSize << llendl;
- if (entry.mImageSize < 0)
+ if(entry.mImageSize > entry.mBodySize)
{
- mFreeList.insert(idx);
+ mHeaderIDMap[entry.mID] = idx;
+ mTexturesSizeMap[entry.mID] = entry.mBodySize;
+ mTexturesSizeTotal += entry.mBodySize;
}
else
{
- mHeaderIDMap[entry.mID] = idx;
- if (entry.mBodySize > 0)
- {
- mTexturesSizeMap[entry.mID] = entry.mBodySize;
- mTexturesSizeTotal += entry.mBodySize;
- }
- llassert_always(entry.mImageSize == 0 || entry.mImageSize > entry.mBodySize);
+ mFreeList.insert(idx);
}
}
closeHeaderEntriesFile();
@@ -1184,11 +1282,51 @@ void LLTextureCache::writeEntriesAndClose(const std::vector<Entry>& entries)
S32 bytes_written = aprfile->write((void*)(&entries[idx]), (S32)sizeof(Entry));
llassert_always(bytes_written == sizeof(Entry));
}
- mHeaderEntriesMaxWriteIdx = llmax(mHeaderEntriesMaxWriteIdx, num_entries-1);
closeHeaderEntriesFile();
}
}
+void LLTextureCache::writeUpdatedEntries()
+{
+ lockHeaders() ;
+ if (!mReadOnly && !mUpdatedEntryMap.empty())
+ {
+ openHeaderEntriesFile(false, 0);
+ updatedHeaderEntriesFile() ;
+ closeHeaderEntriesFile();
+ }
+ unlockHeaders() ;
+}
+
+//mHeaderMutex is locked and mHeaderAPRFile is created before calling this.
+void LLTextureCache::updatedHeaderEntriesFile()
+{
+ if (!mReadOnly && !mUpdatedEntryMap.empty() && mHeaderAPRFile)
+ {
+ //entriesInfo
+ mHeaderAPRFile->seek(APR_SET, 0);
+ S32 bytes_written = mHeaderAPRFile->write((U8*)&mHeaderEntriesInfo, sizeof(EntriesInfo)) ;
+ llassert_always(bytes_written == sizeof(EntriesInfo));
+
+ //write each updated entry
+ S32 entry_size = (S32)sizeof(Entry) ;
+ S32 prev_idx = -1 ;
+ S32 delta_idx ;
+ for (idx_entry_map_t::iterator iter = mUpdatedEntryMap.begin(); iter != mUpdatedEntryMap.end(); ++iter)
+ {
+ delta_idx = iter->first - prev_idx - 1;
+ prev_idx = iter->first ;
+ if(delta_idx)
+ {
+ mHeaderAPRFile->seek(APR_CUR, delta_idx * entry_size);
+ }
+
+ bytes_written = mHeaderAPRFile->write((void*)(&iter->second), entry_size);
+ llassert_always(bytes_written == entry_size);
+ }
+ mUpdatedEntryMap.clear() ;
+ }
+}
//----------------------------------------------------------------------------
// Called from either the main thread or the worker thread
@@ -1216,12 +1354,11 @@ void LLTextureCache::readHeaderCache()
U32 empty_entries = 0;
typedef std::pair<U32, S32> lru_data_t;
std::set<lru_data_t> lru;
- std::set<LLUUID> purge_list;
+ std::set<U32> purge_list;
for (U32 i=0; i<num_entries; i++)
{
Entry& entry = entries[i];
- const LLUUID& id = entry.mID;
- if (entry.mImageSize < 0)
+ if (entry.mImageSize <= 0)
{
// This will be in the Free List, don't put it in the LRU
++empty_entries;
@@ -1234,9 +1371,8 @@ void LLTextureCache::readHeaderCache()
if (entry.mBodySize > entry.mImageSize)
{
// Shouldn't happen, failsafe only
- llwarns << "Bad entry: " << i << ": " << id << ": BodySize: " << entry.mBodySize << llendl;
- purge_list.insert(entry.mID);
- entry.mImageSize = -1; // empty/available
+ llwarns << "Bad entry: " << i << ": " << entry.mID << ": BodySize: " << entry.mBodySize << llendl;
+ purge_list.insert(i);
}
}
}
@@ -1251,14 +1387,9 @@ void LLTextureCache::readHeaderCache()
{
for (std::set<lru_data_t>::iterator iter = lru.begin(); iter != lru.end(); ++iter)
{
- S32 idx = iter->second;
- if (entries[idx].mImageSize >= 0)
- {
- purge_list.insert(entries[idx].mID);
- entries[idx].mImageSize = -1;
- if (purge_list.size() >= entries_to_purge)
- break;
- }
+ purge_list.insert(iter->second);
+ if (purge_list.size() >= entries_to_purge)
+ break;
}
}
llassert_always(purge_list.size() >= entries_to_purge);
@@ -1268,9 +1399,7 @@ void LLTextureCache::readHeaderCache()
S32 lru_entries = (S32)((F32)sCacheMaxEntries * TEXTURE_CACHE_LRU_SIZE);
for (std::set<lru_data_t>::iterator iter = lru.begin(); iter != lru.end(); ++iter)
{
- S32 idx = iter->second;
- const LLUUID& id = entries[idx].mID;
- mLRU.insert(id);
+ mLRU.insert(entries[iter->second].mID);
// llinfos << "LRU: " << iter->first << " : " << iter->second << llendl;
if (--lru_entries <= 0)
break;
@@ -1279,12 +1408,10 @@ void LLTextureCache::readHeaderCache()
if (purge_list.size() > 0)
{
- for (std::set<LLUUID>::iterator iter = purge_list.begin(); iter != purge_list.end(); ++iter)
+ for (std::set<U32>::iterator iter = purge_list.begin(); iter != purge_list.end(); ++iter)
{
- const LLUUID& id = *iter;
- bool res = removeHeaderCacheEntry(id); // sets entry size on disk to -1
- llassert_always(res);
- LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool());
+ std::string tex_filename = getTextureFileName(entries[*iter].mID);
+ removeEntry((S32)*iter, entries[*iter], tex_filename);
}
// If we removed any entries, we need to rebuild the entries list,
// write the header, and call this again
@@ -1292,13 +1419,14 @@ void LLTextureCache::readHeaderCache()
for (U32 i=0; i<num_entries; i++)
{
const Entry& entry = entries[i];
- if (entry.mImageSize >=0)
+ if (entry.mImageSize > 0)
{
new_entries.push_back(entry);
}
}
llassert_always(new_entries.size() <= sCacheMaxEntries);
mHeaderEntriesInfo.mEntries = new_entries.size();
+ writeEntriesHeader();
writeEntriesAndClose(new_entries);
mHeaderMutex.unlock(); // unlock the mutex before calling again
readHeaderCache(); // repeat with new entries file
@@ -1306,7 +1434,7 @@ void LLTextureCache::readHeaderCache()
}
else
{
- writeEntriesAndClose(entries);
+ //entries are not changed, nothing here.
}
}
}
@@ -1334,8 +1462,9 @@ void LLTextureCache::purgeAllTextures(bool purge_directories)
}
if (purge_directories)
{
+ gDirUtilp->deleteFilesInDir(mTexturesDirName, mask);
LLFile::rmdir(mTexturesDirName);
- }
+ }
}
mHeaderIDMap.clear();
mTexturesSizeMap.clear();
@@ -1371,7 +1500,6 @@ void LLTextureCache::purgeTextures(bool validate)
U32 num_entries = openAndReadEntries(entries);
if (!num_entries)
{
- writeEntriesAndClose(entries);
return; // nothing to purge
}
@@ -1390,6 +1518,10 @@ void LLTextureCache::purgeTextures(bool validate)
time_idx_set.insert(std::make_pair(entries[idx].mTime, idx));
// llinfos << "TIME: " << entries[idx].mTime << " TEX: " << entries[idx].mID << " IDX: " << idx << " Size: " << entries[idx].mImageSize << llendl;
}
+ else
+ {
+ llerrs << "mTexturesSizeMap / mHeaderIDMap corrupted." << llendl ;
+ }
}
}
@@ -1441,11 +1573,8 @@ void LLTextureCache::purgeTextures(bool validate)
{
purge_count++;
LL_DEBUGS("TextureCache") << "PURGING: " << filename << LL_ENDL;
- LLAPRFile::remove(filename, getLocalAPRFilePool());
+ removeEntry(idx, entries[idx], filename) ;
cache_size -= entries[idx].mBodySize;
- mTexturesSizeTotal -= entries[idx].mBodySize;
- entries[idx].mBodySize = 0;
- mTexturesSizeMap.erase(entries[idx].mID);
}
}
@@ -1492,40 +1621,37 @@ LLTextureCacheWorker* LLTextureCache::getWriter(handle_t handle)
// Called from work thread
// Reads imagesize from the header, updates timestamp
-S32 LLTextureCache::getHeaderCacheEntry(const LLUUID& id, S32& imagesize)
+S32 LLTextureCache::getHeaderCacheEntry(const LLUUID& id, Entry& entry)
{
- LLMutexLock lock(&mHeaderMutex);
- Entry entry;
+ LLMutexLock lock(&mHeaderMutex);
S32 idx = openAndReadEntry(id, entry, false);
if (idx >= 0)
- {
- imagesize = entry.mImageSize;
- writeEntryAndClose(idx, entry); // updates time
+ {
+ updateEntryTimeStamp(idx, entry); // updates time
}
return idx;
}
// Writes imagesize to the header, updates timestamp
-S32 LLTextureCache::setHeaderCacheEntry(const LLUUID& id, S32 imagesize)
+S32 LLTextureCache::setHeaderCacheEntry(const LLUUID& id, Entry& entry, S32 imagesize, S32 datasize)
{
mHeaderMutex.lock();
- llassert_always(imagesize >= 0);
- Entry entry;
S32 idx = openAndReadEntry(id, entry, true);
+ mHeaderMutex.unlock();
+
if (idx >= 0)
{
- entry.mImageSize = imagesize;
- writeEntryAndClose(idx, entry);
- mHeaderMutex.unlock();
+ updateEntry(idx, entry, imagesize, datasize);
}
else // retry
{
- mHeaderMutex.unlock();
readHeaderCache(); // We couldn't write an entry, so refresh the LRU
+
mHeaderMutex.lock();
llassert_always(!mLRU.empty() || mHeaderEntriesInfo.mEntries < sCacheMaxEntries);
mHeaderMutex.unlock();
- idx = setHeaderCacheEntry(id, imagesize); // assert above ensures no inf. recursion
+
+ idx = setHeaderCacheEntry(id, entry, imagesize, datasize); // assert above ensures no inf. recursion
}
return idx;
}
@@ -1573,6 +1699,11 @@ bool LLTextureCache::readComplete(handle_t handle, bool abort)
{
worker = iter->second;
complete = worker->complete();
+
+ if(!complete && abort)
+ {
+ abortRequest(handle, true) ;
+ }
}
if (worker && (complete || abort))
{
@@ -1649,34 +1780,56 @@ void LLTextureCache::addCompleted(Responder* responder, bool success)
//////////////////////////////////////////////////////////////////////////////
-// Called from MAIN thread (endWork())
-// Ensure that mHeaderMutex is locked first!
-bool LLTextureCache::removeHeaderCacheEntry(const LLUUID& id)
+//called after mHeaderMutex is locked.
+void LLTextureCache::removeCachedTexture(const LLUUID& id)
{
- Entry entry;
- S32 idx = openAndReadEntry(id, entry, false);
- if (idx >= 0)
+ if(mTexturesSizeMap.find(id) != mTexturesSizeMap.end())
+ {
+ mTexturesSizeTotal -= mTexturesSizeMap[id] ;
+ mTexturesSizeMap.erase(id);
+ }
+ mHeaderIDMap.erase(id);
+ LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool());
+}
+
+//called after mHeaderMutex is locked.
+void LLTextureCache::removeEntry(S32 idx, Entry& entry, std::string& filename)
+{
+ if(idx >= 0) //valid entry
{
entry.mImageSize = -1;
entry.mBodySize = 0;
- writeEntryAndClose(idx, entry);
- mFreeList.insert(idx);
- mHeaderIDMap.erase(id);
- mTexturesSizeMap.erase(id);
- return true;
+ mHeaderIDMap.erase(entry.mID);
+ mTexturesSizeMap.erase(entry.mID);
+
+ mTexturesSizeTotal -= entry.mBodySize;
+ mFreeList.insert(idx);
}
- return false;
+
+ LLAPRFile::remove(filename, getLocalAPRFilePool());
}
-void LLTextureCache::removeFromCache(const LLUUID& id)
+bool LLTextureCache::removeFromCache(const LLUUID& id)
{
//llwarns << "Removing texture from cache: " << id << llendl;
+ bool ret = false ;
if (!mReadOnly)
{
- LLMutexLock lock(&mHeaderMutex);
- removeHeaderCacheEntry(id);
- LLAPRFile::remove(getTextureFileName(id), getLocalAPRFilePool());
+ lockHeaders() ;
+
+ Entry entry;
+ S32 idx = openAndReadEntry(id, entry, false);
+ std::string tex_filename = getTextureFileName(id);
+ removeEntry(idx, entry, tex_filename) ;
+ if (idx >= 0)
+ {
+ writeEntryToHeaderImmediately(idx, entry);
+ ret = true;
+ }
+
+ unlockHeaders() ;
}
+ return ret ;
}
//////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/lltexturecache.h b/indra/newview/lltexturecache.h
index 64ec881fc3..0fceee3011 100644
--- a/indra/newview/lltexturecache.h
+++ b/indra/newview/lltexturecache.h
@@ -68,6 +68,7 @@ private:
Entry(const LLUUID& id, S32 imagesize, S32 bodysize, U32 time) :
mID(id), mImageSize(imagesize), mBodySize(bodysize), mTime(time) {}
void init(const LLUUID& id, U32 time) { mID = id, mImageSize = 0; mBodySize = 0; mTime = time; }
+ Entry& operator=(const Entry& entry) {mID = entry.mID, mImageSize = entry.mImageSize; mBodySize = entry.mBodySize; mTime = entry.mTime; return *this;}
LLUUID mID; // 16 bytes
S32 mImageSize; // total size of image if known
S32 mBodySize; // size of body file in body cache
@@ -109,7 +110,8 @@ public:
/*virtual*/ S32 update(U32 max_time_ms);
void purgeCache(ELLPath location);
- S64 initCache(ELLPath location, S64 maxsize, BOOL read_only);
+ void setReadOnly(BOOL read_only) ;
+ S64 initCache(ELLPath location, S64 maxsize, BOOL disable_texture_cache);
handle_t readFromCache(const std::string& local_filename, const LLUUID& id, U32 priority, S32 offset, S32 size,
ReadResponder* responder);
@@ -122,7 +124,7 @@ public:
bool writeComplete(handle_t handle, bool abort = false);
void prioritizeWrite(handle_t handle);
- void removeFromCache(const LLUUID& id);
+ bool removeFromCache(const LLUUID& id);
// For LLTextureCacheWorker::Responder
LLTextureCacheWorker* getReader(handle_t handle);
@@ -142,7 +144,6 @@ public:
protected:
// Accessed by LLTextureCacheWorker
- bool updateTextureEntryList(const LLUUID& id, S32 size);
std::string getLocalFileName(const LLUUID& id);
std::string getTextureFileName(const LLUUID& id);
void addCompleted(Responder* responder, bool success);
@@ -160,12 +161,18 @@ private:
void readEntriesHeader();
void writeEntriesHeader();
S32 openAndReadEntry(const LLUUID& id, Entry& entry, bool create);
- void writeEntryAndClose(S32 idx, Entry& entry);
+ bool updateEntry(S32 idx, Entry& entry, S32 new_image_size, S32 new_body_size);
+ void updateEntryTimeStamp(S32 idx, Entry& entry) ;
U32 openAndReadEntries(std::vector<Entry>& entries);
void writeEntriesAndClose(const std::vector<Entry>& entries);
- S32 getHeaderCacheEntry(const LLUUID& id, S32& imagesize);
- S32 setHeaderCacheEntry(const LLUUID& id, S32 imagesize);
- bool removeHeaderCacheEntry(const LLUUID& id);
+ void readEntryFromHeaderImmediately(S32 idx, Entry& entry) ;
+ void writeEntryToHeaderImmediately(S32 idx, Entry& entry, bool write_header = false) ;
+ void removeEntry(S32 idx, Entry& entry, std::string& filename);
+ void removeCachedTexture(const LLUUID& id) ;
+ S32 getHeaderCacheEntry(const LLUUID& id, Entry& entry);
+ S32 setHeaderCacheEntry(const LLUUID& id, Entry& entry, S32 imagesize, S32 datasize);
+ void writeUpdatedEntries() ;
+ void updatedHeaderEntriesFile() ;
void lockHeaders() { mHeaderMutex.lock(); }
void unlockHeaders() { mHeaderMutex.unlock(); }
@@ -204,6 +211,9 @@ private:
S64 mTexturesSizeTotal;
LLAtomic32<BOOL> mDoPurge;
+ typedef std::map<S32, Entry> idx_entry_map_t;
+ idx_entry_map_t mUpdatedEntryMap;
+
// Statics
static F32 sHeaderCacheVersion;
static U32 sCacheMaxEntries;
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index 2b846d33fc..a1ab051021 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -48,6 +48,7 @@
#include "llfoldervieweventlistener.h"
#include "llinventory.h"
#include "llinventoryfunctions.h"
+#include "llinventorymodelbackgroundfetch.h"
#include "llinventoryobserver.h"
#include "llinventorypanel.h"
#include "llfloaterinventory.h"
@@ -1053,7 +1054,7 @@ public:
{
// We need to find textures in all folders, so get the main
// background download going.
- gInventory.startBackgroundFetch();
+ LLInventoryModelBackgroundFetch::instance().start();
gInventory.removeObserver(this);
delete this;
}
@@ -1074,9 +1075,9 @@ BOOL LLTextureCtrl::handleMouseDown(S32 x, S32 y, MASK mask)
{
showPicker(FALSE);
//grab textures first...
- gInventory.startBackgroundFetch(gInventory.findCategoryUUIDForType(LLFolderType::FT_TEXTURE));
+ LLInventoryModelBackgroundFetch::instance().start(gInventory.findCategoryUUIDForType(LLFolderType::FT_TEXTURE));
//...then start full inventory fetch.
- gInventory.startBackgroundFetch();
+ LLInventoryModelBackgroundFetch::instance().start();
handled = TRUE;
}
@@ -1136,6 +1137,20 @@ void LLTextureCtrl::onFloaterCommit(ETexturePickOp op)
}
}
+void LLTextureCtrl::setImageAssetName(const std::string& name)
+{
+ LLPointer<LLUIImage> imagep = LLUI::getUIImage(name);
+ if(imagep)
+ {
+ LLViewerFetchedTexture* pTexture = dynamic_cast<LLViewerFetchedTexture*>(imagep->getImage().get());
+ if(pTexture)
+ {
+ LLUUID id = pTexture->getID();
+ setImageAssetID(id);
+ }
+ }
+}
+
void LLTextureCtrl::setImageAssetID( const LLUUID& asset_id )
{
if( mImageAssetID != asset_id )
@@ -1247,25 +1262,52 @@ void LLTextureCtrl::draw()
mTentativeLabel->setVisible( !mTexturep.isNull() && getTentative() );
-
// Show "Loading..." string on the top left corner while this texture is loading.
// Using the discard level, do not show the string if the texture is almost but not
// fully loaded.
- if ( mTexturep.notNull() &&
- (!mTexturep->isFullyLoaded()) &&
- (mShowLoadingPlaceholder == TRUE) &&
- (mTexturep->getDiscardLevel() != 1) &&
- (mTexturep->getDiscardLevel() != 0))
+ if (mTexturep.notNull() &&
+ (!mTexturep->isFullyLoaded()) &&
+ (mShowLoadingPlaceholder == TRUE))
{
+ U32 v_offset = 25;
LLFontGL* font = LLFontGL::getFontSansSerif();
- font->renderUTF8(
- mLoadingPlaceholderString, 0,
- llfloor(interior.mLeft+3),
- llfloor(interior.mTop-25),
- LLColor4::white,
- LLFontGL::LEFT,
- LLFontGL::BASELINE,
- LLFontGL::DROP_SHADOW);
+
+ // Don't show as loaded if the texture is almost fully loaded (i.e. discard1) unless god
+ if ((mTexturep->getDiscardLevel() > 1) || gAgent.isGodlike())
+ {
+ font->renderUTF8(
+ mLoadingPlaceholderString,
+ 0,
+ llfloor(interior.mLeft+3),
+ llfloor(interior.mTop-v_offset),
+ LLColor4::white,
+ LLFontGL::LEFT,
+ LLFontGL::BASELINE,
+ LLFontGL::DROP_SHADOW);
+ }
+
+ // Optionally show more detailed information.
+ if (gSavedSettings.getBOOL("DebugAvatarRezTime"))
+ {
+ LLFontGL* font = LLFontGL::getFontSansSerif();
+ std::string tdesc;
+ // Show what % the texture has loaded (0 to 100%, 100 is highest), and what level of detail (5 to 0, 0 is best).
+
+ v_offset += 12;
+ tdesc = llformat(" PK : %d%%", U32(mTexturep->getDownloadProgress()*100.0));
+ font->renderUTF8(tdesc, 0, llfloor(interior.mLeft+3), llfloor(interior.mTop-v_offset),
+ LLColor4::white, LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::DROP_SHADOW);
+
+ v_offset += 12;
+ tdesc = llformat(" LVL: %d", mTexturep->getDiscardLevel());
+ font->renderUTF8(tdesc, 0, llfloor(interior.mLeft+3), llfloor(interior.mTop-v_offset),
+ LLColor4::white, LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::DROP_SHADOW);
+
+ v_offset += 12;
+ tdesc = llformat(" ID : %s...", (mImageAssetID.asString().substr(0,7)).c_str());
+ font->renderUTF8(tdesc, 0, llfloor(interior.mLeft+3), llfloor(interior.mTop-v_offset),
+ LLColor4::white, LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::DROP_SHADOW);
+ }
}
LLUICtrl::draw();
diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h
index 8ca92c3d87..bcd0a083f2 100644
--- a/indra/newview/lltexturectrl.h
+++ b/indra/newview/lltexturectrl.h
@@ -128,7 +128,7 @@ public:
virtual void clear();
// Takes a UUID, wraps get/setImageAssetID
- virtual void setValue(const LLSD& value );
+ virtual void setValue(const LLSD& value);
virtual LLSD getValue() const;
// LLTextureCtrl interface
@@ -142,6 +142,8 @@ public:
const LLUUID& getImageItemID() { return mImageItemID; }
+ virtual void setImageAssetName(const std::string& name);
+
void setImageAssetID(const LLUUID &image_asset_id);
const LLUUID& getImageAssetID() const { return mImageAssetID; }
@@ -183,6 +185,8 @@ public:
void setShowLoadingPlaceholder(BOOL showLoadingPlaceholder);
+ LLViewerFetchedTexture* getTexture() { return mTexturep; }
+
private:
BOOL allowDrop(LLInventoryItem* item);
BOOL doDrop(LLInventoryItem* item);
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index 404b79bfaf..ceed90e210 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -73,13 +73,11 @@ private:
}
virtual void completed(bool success)
{
- mFetcher->lockQueue();
LLTextureFetchWorker* worker = mFetcher->getWorker(mID);
if (worker)
{
worker->callbackCacheRead(success, mFormattedImage, mImageSize, mImageLocal);
}
- mFetcher->unlockQueue();
}
private:
LLTextureFetch* mFetcher;
@@ -95,13 +93,11 @@ private:
}
virtual void completed(bool success)
{
- mFetcher->lockQueue();
LLTextureFetchWorker* worker = mFetcher->getWorker(mID);
if (worker)
{
worker->callbackCacheWrite(success);
}
- mFetcher->unlockQueue();
}
private:
LLTextureFetch* mFetcher;
@@ -117,13 +113,11 @@ private:
}
virtual void completed(bool success, LLImageRaw* raw, LLImageRaw* aux)
{
- mFetcher->lockQueue();
LLTextureFetchWorker* worker = mFetcher->getWorker(mID);
if (worker)
{
worker->callbackDecoded(success, raw, aux);
}
- mFetcher->unlockQueue();
}
private:
LLTextureFetch* mFetcher;
@@ -166,13 +160,16 @@ public:
void setGetStatus(U32 status, const std::string& reason)
{
+ LLMutexLock lock(&mWorkMutex);
+
mGetStatus = status;
mGetReason = reason;
}
+ void setCanUseHTTP(bool can_use_http) {mCanUseHTTP = can_use_http;}
+ bool getCanUseHTTP()const {return mCanUseHTTP ;}
+
protected:
- LLTextureFetchWorker(LLTextureFetch* fetcher, const LLUUID& id, const LLHost& host,
- F32 priority, S32 discard, S32 size);
LLTextureFetchWorker(LLTextureFetch* fetcher, const std::string& url, const LLUUID& id, const LLHost& host,
F32 priority, S32 discard, S32 size);
@@ -219,8 +216,15 @@ private:
QUEUED = 1,
SENT_SIM = 2
};
+ enum e_write_to_cache_state //mWriteToCacheState
+ {
+ NOT_WRITE = 0,
+ CAN_WRITE = 1,
+ SHOULD_WRITE = 2
+ };
static const char* sStateDescs[];
e_state mState;
+ e_write_to_cache_state mWriteToCacheState;
LLTextureFetch* mFetcher;
LLPointer<LLImageFormatted> mFormattedImage;
LLPointer<LLImageRaw> mRawImage;
@@ -246,15 +250,17 @@ private:
S32 mRequestedSize;
S32 mDesiredSize;
S32 mFileSize;
- S32 mCachedSize;
- BOOL mLoaded;
+ S32 mCachedSize;
e_request_state mSentRequest;
handle_t mDecodeHandle;
+ BOOL mLoaded;
BOOL mDecoded;
BOOL mWritten;
BOOL mNeedsAux;
BOOL mHaveAllData;
BOOL mInLocalCache;
+ bool mCanUseHTTP ;
+ bool mCanUseNET ; //can get from asset server.
S32 mHTTPFailCount;
S32 mRetryAttempt;
S32 mActiveCount;
@@ -296,7 +302,10 @@ public:
const LLChannelDescriptors& channels,
const LLIOPipe::buffer_ptr_t& buffer)
{
- if ((gSavedSettings.getBOOL("LogTextureDownloadsToViewerLog")) || (gSavedSettings.getBOOL("LogTextureDownloadsToSimulator")))
+ static LLCachedControl<bool> log_to_viewer_log(gSavedSettings,"LogTextureDownloadsToViewerLog");
+ static LLCachedControl<bool> log_to_sim(gSavedSettings,"LogTextureDownloadsToSimulator");
+
+ if (log_to_viewer_log || log_to_sim)
{
mFetcher->mTextureInfo.setRequestStartTime(mID, mStartTime);
U64 timeNow = LLTimer::getTotalTime();
@@ -307,7 +316,6 @@ public:
}
lldebugs << "HTTP COMPLETE: " << mID << llendl;
- mFetcher->lockQueue();
LLTextureFetchWorker* worker = mFetcher->getWorker(mID);
if (worker)
{
@@ -321,11 +329,7 @@ public:
partial = true;
}
}
- else
- {
- worker->setGetStatus(status, reason);
-// llwarns << status << ": " << reason << llendl;
- }
+
if (!success)
{
worker->setGetStatus(status, reason);
@@ -339,7 +343,6 @@ public:
mFetcher->removeFromHTTPQueue(mID);
llwarns << "Worker not found: " << mID << llendl;
}
- mFetcher->unlockQueue();
}
private:
@@ -380,6 +383,7 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher,
S32 size) // Desired size
: LLWorkerClass(fetcher, "TextureFetch"),
mState(INIT),
+ mWriteToCacheState(NOT_WRITE),
mFetcher(fetcher),
mID(id),
mHost(host),
@@ -408,6 +412,7 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher,
mNeedsAux(FALSE),
mHaveAllData(FALSE),
mInLocalCache(FALSE),
+ mCanUseHTTP(true),
mHTTPFailCount(0),
mRetryAttempt(0),
mActiveCount(0),
@@ -418,6 +423,8 @@ LLTextureFetchWorker::LLTextureFetchWorker(LLTextureFetch* fetcher,
mTotalPackets(0),
mImageCodec(IMG_CODEC_INVALID)
{
+ mCanUseNET = mUrl.empty() ;
+
calcWorkPriority();
mType = host.isOk() ? LLImageBase::TYPE_AVATAR_BAKE : LLImageBase::TYPE_NORMAL;
// llinfos << "Create: " << mID << " mHost:" << host << " Discard=" << discard << llendl;
@@ -437,11 +444,11 @@ LLTextureFetchWorker::~LLTextureFetchWorker()
// << " Desired=" << mDesiredDiscard << llendl;
llassert_always(!haveWork());
lockWorkMutex();
- if (mCacheReadHandle != LLTextureCache::nullHandle())
+ if (mCacheReadHandle != LLTextureCache::nullHandle() && mFetcher->mTextureCache)
{
mFetcher->mTextureCache->readComplete(mCacheReadHandle, true);
}
- if (mCacheWriteHandle != LLTextureCache::nullHandle())
+ if (mCacheWriteHandle != LLTextureCache::nullHandle() && mFetcher->mTextureCache)
{
mFetcher->mTextureCache->writeComplete(mCacheWriteHandle, true);
}
@@ -494,9 +501,10 @@ void LLTextureFetchWorker::setupPacketData()
U32 LLTextureFetchWorker::calcWorkPriority()
{
-// llassert_always(mImagePriority >= 0 && mImagePriority <= LLViewerTexture::maxDecodePriority());
- static F32 PRIORITY_SCALE = (F32)LLWorkerThread::PRIORITY_LOWBITS / LLViewerFetchedTexture::maxDecodePriority();
- mWorkPriority = (U32)(mImagePriority * PRIORITY_SCALE);
+ //llassert_always(mImagePriority >= 0 && mImagePriority <= LLViewerFetchedTexture::maxDecodePriority());
+ static const F32 PRIORITY_SCALE = (F32)LLWorkerThread::PRIORITY_LOWBITS / LLViewerFetchedTexture::maxDecodePriority();
+
+ mWorkPriority = llmin((U32)LLWorkerThread::PRIORITY_LOWBITS, (U32)(mImagePriority * PRIORITY_SCALE));
return mWorkPriority;
}
@@ -574,14 +582,26 @@ bool LLTextureFetchWorker::doWork(S32 param)
{
LLMutexLock lock(&mWorkMutex);
- if ((mFetcher->isQuitting() || mImagePriority < 1.0f || getFlags(LLWorkerClass::WCF_DELETE_REQUESTED)))
+ if ((mFetcher->isQuitting() || getFlags(LLWorkerClass::WCF_DELETE_REQUESTED)))
{
- if (mState < WRITE_TO_CACHE)
+ if (mState < DECODE_IMAGE)
{
return true; // abort
}
}
-
+ if(mImagePriority < 1.0f)
+ {
+ if (mState == INIT || mState == LOAD_FROM_NETWORK || mState == LOAD_FROM_SIMULATOR)
+ {
+ return true; // abort
+ }
+ }
+ if(mState > CACHE_POST && !mCanUseNET && !mCanUseHTTP)
+ {
+ //nowhere to get data, abort.
+ return true ;
+ }
+
if (mFetcher->mDebugPause)
{
return false; // debug: don't do any work
@@ -597,7 +617,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
}
if (mState == INIT)
- {
+ {
mRawImage = NULL ;
mRequestedDiscard = -1;
mLoadedDiscard = -1;
@@ -636,23 +656,27 @@ bool LLTextureFetchWorker::doWork(S32 param)
return false;
}
mFileSize = 0;
- mLoaded = FALSE;
- setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); // Set priority first since Responder may change it
-
- CacheReadResponder* responder = new CacheReadResponder(mFetcher, mID, mFormattedImage);
+ mLoaded = FALSE;
+
if (mUrl.compare(0, 7, "file://") == 0)
{
+ setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); // Set priority first since Responder may change it
+
// read file from local disk
std::string filename = mUrl.substr(7, std::string::npos);
+ CacheReadResponder* responder = new CacheReadResponder(mFetcher, mID, mFormattedImage);
mCacheReadHandle = mFetcher->mTextureCache->readFromCache(filename, mID, cache_priority,
offset, size, responder);
}
else if (mUrl.empty())
{
+ setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); // Set priority first since Responder may change it
+
+ CacheReadResponder* responder = new CacheReadResponder(mFetcher, mID, mFormattedImage);
mCacheReadHandle = mFetcher->mTextureCache->readFromCache(mID, cache_priority,
offset, size, responder);
}
- else
+ else if(mCanUseHTTP)
{
if (!(mUrl.compare(0, 7, "http://") == 0))
{
@@ -661,8 +685,11 @@ bool LLTextureFetchWorker::doWork(S32 param)
}
setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
mState = SEND_HTTP_REQ;
- delete responder;
- responder = NULL;
+ }
+ else
+ {
+ setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
+ mState = LOAD_FROM_NETWORK;
}
}
@@ -696,6 +723,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
llassert_always(mFormattedImage->getDataSize() > 0);
mLoadedDiscard = mDesiredDiscard;
mState = DECODE_IMAGE;
+ mWriteToCacheState = NOT_WRITE ;
LL_DEBUGS("Texture") << mID << ": Cached. Bytes: " << mFormattedImage->getDataSize()
<< " Size: " << llformat("%dx%d",mFormattedImage->getWidth(),mFormattedImage->getHeight())
<< " Desired Discard: " << mDesiredDiscard << " Desired Size: " << mDesiredSize << LL_ENDL;
@@ -720,10 +748,10 @@ bool LLTextureFetchWorker::doWork(S32 param)
if (mState == LOAD_FROM_NETWORK)
{
- bool get_url = gSavedSettings.getBOOL("ImagePipelineUseHTTP");
- if (!mUrl.empty()) get_url = false;
+ static LLCachedControl<bool> use_http(gSavedSettings,"ImagePipelineUseHTTP");
+
// if (mHost != LLHost::invalid) get_url = false;
- if ( get_url )
+ if ( use_http && mCanUseHTTP && mUrl.empty())//get http url.
{
LLViewerRegion* region = NULL;
if (mHost == LLHost::invalid)
@@ -733,28 +761,39 @@ bool LLTextureFetchWorker::doWork(S32 param)
if (region)
{
- std::string http_url = region->getCapability("GetTexture");
+ std::string http_url = region->getHttpUrl() ;
if (!http_url.empty())
{
mUrl = http_url + "/?texture_id=" + mID.asString().c_str();
+ mWriteToCacheState = CAN_WRITE ; //because this texture has a fixed texture id.
+ }
+ else
+ {
+ mCanUseHTTP = false ;
}
}
else
{
// This will happen if not logged in or if a region deoes not have HTTP Texture enabled
//llwarns << "Region not found for host: " << mHost << llendl;
+ mCanUseHTTP = false;
}
}
- if (!mUrl.empty())
+ if (mCanUseHTTP && !mUrl.empty())
{
mState = LLTextureFetchWorker::SEND_HTTP_REQ;
setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
+ if(mWriteToCacheState != NOT_WRITE)
+ {
+ mWriteToCacheState = CAN_WRITE ;
+ }
// don't return, fall through to next state
}
- else if (mSentRequest == UNSENT)
+ else if (mSentRequest == UNSENT && mCanUseNET)
{
// Add this to the network queue and sit here.
// LLTextureFetch::update() will send off a request which will change our state
+ mWriteToCacheState = CAN_WRITE ;
mRequestedSize = mDesiredSize;
mRequestedDiscard = mDesiredDiscard;
mSentRequest = QUEUED;
@@ -791,6 +830,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
}
setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
mState = DECODE_IMAGE;
+ mWriteToCacheState = SHOULD_WRITE ;
}
else
{
@@ -802,6 +842,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
if (mState == SEND_HTTP_REQ)
{
+ if(mCanUseHTTP)
{
const S32 HTTP_QUEUE_MAX_SIZE = 8;
// *TODO: Integrate this with llviewerthrottle
@@ -867,6 +908,10 @@ bool LLTextureFetchWorker::doWork(S32 param)
}
// fall through
}
+ else //can not use http fetch.
+ {
+ return true ; //abort
+ }
}
if (mState == WAIT_HTTP_REQ)
@@ -880,7 +925,16 @@ bool LLTextureFetchWorker::doWork(S32 param)
if (mGetStatus == HTTP_NOT_FOUND)
{
mHTTPFailCount = max_attempts = 1; // Don't retry
- llinfos << "Texture missing from server (404): " << mUrl << llendl;
+ llwarns << "Texture missing from server (404): " << mUrl << llendl;
+
+ //roll back to try UDP
+ if(mCanUseNET)
+ {
+ mState = INIT ;
+ mCanUseHTTP = false ;
+ setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
+ return false ;
+ }
}
else if (mGetStatus == HTTP_SERVICE_UNAVAILABLE)
{
@@ -891,6 +945,17 @@ bool LLTextureFetchWorker::doWork(S32 param)
max_attempts = mHTTPFailCount+1; // Keep retrying
LL_INFOS_ONCE("Texture") << "Texture server busy (503): " << mUrl << LL_ENDL;
}
+ else if(mGetStatus >= HTTP_MULTIPLE_CHOICES && mGetStatus < HTTP_BAD_REQUEST) //http re-direct
+ {
+ ++mHTTPFailCount;
+ max_attempts = 5 ; //try at most 5 times to avoid infinite redirection loop.
+
+ llwarns << "HTTP GET failed because of redirection: " << mUrl
+ << " Status: " << mGetStatus << " Reason: '" << mGetReason << llendl ;
+
+ //assign to the new url
+ mUrl = mGetReason ;
+ }
else
{
const S32 HTTP_MAX_RETRY_COUNT = 3;
@@ -900,6 +965,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
<< " Status: " << mGetStatus << " Reason: '" << mGetReason << "'"
<< " Attempt:" << mHTTPFailCount+1 << "/" << max_attempts << llendl;
}
+
if (mHTTPFailCount >= max_attempts)
{
if (cur_size > 0)
@@ -934,10 +1000,15 @@ bool LLTextureFetchWorker::doWork(S32 param)
}
llassert_always(mBufferSize == cur_size + mRequestedSize);
- if (mHaveAllData)
+ if (mHaveAllData && mRequestedDiscard == 0) //the image file is fully loaded.
{
mFileSize = mBufferSize;
}
+ else //the file size is unknown.
+ {
+ mFileSize = mBufferSize + 1 ; //flag the file is not fully loaded.
+ }
+
U8* buffer = new U8[mBufferSize];
if (cur_size > 0)
{
@@ -952,6 +1023,10 @@ bool LLTextureFetchWorker::doWork(S32 param)
mBufferSize = 0;
mLoadedDiscard = mRequestedDiscard;
mState = DECODE_IMAGE;
+ if(mWriteToCacheState != NOT_WRITE)
+ {
+ mWriteToCacheState = SHOULD_WRITE ;
+ }
setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority);
return false;
}
@@ -987,7 +1062,12 @@ bool LLTextureFetchWorker::doWork(S32 param)
}
if (mLoadedDiscard < 0)
{
- llerrs << "Decode entered with invalid mLoadedDiscard. ID = " << mID << llendl;
+ //llerrs << "Decode entered with invalid mLoadedDiscard. ID = " << mID << llendl;
+
+ //abort, don't decode
+ mState = DONE;
+ setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority);
+ return true;
}
setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); // Set priority first since Responder may change it
mRawImage = NULL;
@@ -1046,7 +1126,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
if (mState == WRITE_TO_CACHE)
{
- if (mInLocalCache || mSentRequest == UNSENT || mFormattedImage.isNull())
+ if (mWriteToCacheState != SHOULD_WRITE || mFormattedImage.isNull())
{
// If we're in a local cache or we didn't actually receive any new data,
// or we failed to load anything, skip
@@ -1054,6 +1134,17 @@ bool LLTextureFetchWorker::doWork(S32 param)
return false;
}
S32 datasize = mFormattedImage->getDataSize();
+ if(mFileSize < datasize)//This could happen when http fetching and sim fetching mixed.
+ {
+ if(mHaveAllData)
+ {
+ mFileSize = datasize ;
+ }
+ else
+ {
+ mFileSize = datasize + 1 ; //flag not fully loaded.
+ }
+ }
llassert_always(datasize);
setPriority(LLWorkerThread::PRIORITY_LOW | mWorkPriority); // Set priority first since Responder may change it
U32 cache_priority = mWorkPriority;
@@ -1429,23 +1520,22 @@ LLTextureFetch::LLTextureFetch(LLTextureCache* cache, LLImageDecodeThread* image
LLTextureFetch::~LLTextureFetch()
{
+ clearDeleteList() ;
+
// ~LLQueuedThread() called here
}
bool LLTextureFetch::createRequest(const std::string& url, const LLUUID& id, const LLHost& host, F32 priority,
- S32 w, S32 h, S32 c, S32 desired_discard, bool needs_aux)
+ S32 w, S32 h, S32 c, S32 desired_discard, bool needs_aux, bool can_use_http)
{
if (mDebugPause)
{
return false;
}
- LLTextureFetchWorker* worker = NULL;
- LLMutexLock lock(&mQueueMutex);
- map_t::iterator iter = mRequestMap.find(id);
- if (iter != mRequestMap.end())
+ LLTextureFetchWorker* worker = getWorker(id) ;
+ if (worker)
{
- worker = iter->second;
if (worker->mHost != host)
{
llwarns << "LLTextureFetch::createRequest " << id << " called with multiple hosts: "
@@ -1494,41 +1584,50 @@ bool LLTextureFetch::createRequest(const std::string& url, const LLUUID& id, con
return false; // need to wait for previous aborted request to complete
}
worker->lockWorkMutex();
+ worker->mActiveCount++;
+ worker->mNeedsAux = needs_aux;
worker->setImagePriority(priority);
worker->setDesiredDiscard(desired_discard, desired_size);
- worker->unlockWorkMutex();
+ worker->setCanUseHTTP(can_use_http) ;
if (!worker->haveWork())
{
worker->mState = LLTextureFetchWorker::INIT;
+ worker->unlockWorkMutex();
+
worker->addWork(0, LLWorkerThread::PRIORITY_HIGH | worker->mWorkPriority);
}
+ else
+ {
+ worker->unlockWorkMutex();
+ }
}
else
{
worker = new LLTextureFetchWorker(this, url, id, host, priority, desired_discard, desired_size);
+ lockQueue() ;
mRequestMap[id] = worker;
+ unlockQueue() ;
+
+ worker->lockWorkMutex();
+ worker->mActiveCount++;
+ worker->mNeedsAux = needs_aux;
+ worker->setCanUseHTTP(can_use_http) ;
+ worker->unlockWorkMutex();
}
- worker->mActiveCount++;
- worker->mNeedsAux = needs_aux;
+
// llinfos << "REQUESTED: " << id << " Discard: " << desired_discard << llendl;
return true;
}
-void LLTextureFetch::deleteRequest(const LLUUID& id, bool cancel)
-{
- LLMutexLock lock(&mQueueMutex);
- LLTextureFetchWorker* worker = getWorker(id);
- if (worker)
- {
- removeRequest(worker, cancel);
- }
-}
-
// protected
void LLTextureFetch::addToNetworkQueue(LLTextureFetchWorker* worker)
{
+ lockQueue() ;
+ bool in_request_map = (mRequestMap.find(worker->mID) != mRequestMap.end()) ;
+ unlockQueue() ;
+
LLMutexLock lock(&mNetworkQueueMutex);
- if (mRequestMap.find(worker->mID) != mRequestMap.end())
+ if (in_request_map)
{
// only add to the queue if in the request map
// i.e. a delete has not been requested
@@ -1564,10 +1663,34 @@ void LLTextureFetch::removeFromHTTPQueue(const LLUUID& id)
mHTTPTextureQueue.erase(id);
}
-// call lockQueue() first!
+void LLTextureFetch::deleteRequest(const LLUUID& id, bool cancel)
+{
+ lockQueue() ;
+ LLTextureFetchWorker* worker = getWorkerAfterLock(id);
+ if (worker)
+ {
+ size_t erased_1 = mRequestMap.erase(worker->mID);
+ unlockQueue() ;
+
+ llassert_always(erased_1 > 0) ;
+
+ removeFromNetworkQueue(worker, cancel);
+ llassert_always(!(worker->getFlags(LLWorkerClass::WCF_DELETE_REQUESTED))) ;
+
+ worker->scheduleDelete();
+ }
+ else
+ {
+ unlockQueue() ;
+ }
+}
+
void LLTextureFetch::removeRequest(LLTextureFetchWorker* worker, bool cancel)
{
+ lockQueue() ;
size_t erased_1 = mRequestMap.erase(worker->mID);
+ unlockQueue() ;
+
llassert_always(erased_1 > 0) ;
removeFromNetworkQueue(worker, cancel);
llassert_always(!(worker->getFlags(LLWorkerClass::WCF_DELETE_REQUESTED))) ;
@@ -1575,8 +1698,26 @@ void LLTextureFetch::removeRequest(LLTextureFetchWorker* worker, bool cancel)
worker->scheduleDelete();
}
+S32 LLTextureFetch::getNumRequests()
+{
+ lockQueue() ;
+ S32 size = (S32)mRequestMap.size();
+ unlockQueue() ;
+
+ return size ;
+}
+
+S32 LLTextureFetch::getNumHTTPRequests()
+{
+ mNetworkQueueMutex.lock() ;
+ S32 size = (S32)mHTTPTextureQueue.size();
+ mNetworkQueueMutex.unlock() ;
+
+ return size ;
+}
+
// call lockQueue() first!
-LLTextureFetchWorker* LLTextureFetch::getWorker(const LLUUID& id)
+LLTextureFetchWorker* LLTextureFetch::getWorkerAfterLock(const LLUUID& id)
{
LLTextureFetchWorker* res = NULL;
map_t::iterator iter = mRequestMap.find(id);
@@ -1587,12 +1728,18 @@ LLTextureFetchWorker* LLTextureFetch::getWorker(const LLUUID& id)
return res;
}
+LLTextureFetchWorker* LLTextureFetch::getWorker(const LLUUID& id)
+{
+ LLMutexLock lock(&mQueueMutex) ;
+
+ return getWorkerAfterLock(id) ;
+}
+
bool LLTextureFetch::getRequestFinished(const LLUUID& id, S32& discard_level,
LLPointer<LLImageRaw>& raw, LLPointer<LLImageRaw>& aux)
{
bool res = false;
- LLMutexLock lock(&mQueueMutex);
LLTextureFetchWorker* worker = getWorker(id);
if (worker)
{
@@ -1644,7 +1791,6 @@ bool LLTextureFetch::getRequestFinished(const LLUUID& id, S32& discard_level,
bool LLTextureFetch::updateRequestPriority(const LLUUID& id, F32 priority)
{
bool res = false;
- LLMutexLock lock(&mQueueMutex);
LLTextureFetchWorker* worker = getWorker(id);
if (worker)
{
@@ -1664,7 +1810,8 @@ S32 LLTextureFetch::update(U32 max_time_ms)
{
S32 res;
- mMaxBandwidth = gSavedSettings.getF32("ThrottleBandwidthKBPS");
+ static LLCachedControl<F32> band_width(gSavedSettings,"ThrottleBandwidthKBPS");
+ mMaxBandwidth = band_width ;
res = LLWorkerThread::update(max_time_ms);
@@ -1686,6 +1833,26 @@ S32 LLTextureFetch::update(U32 max_time_ms)
return res;
}
+//called in the MAIN thread after the TextureCacheThread shuts down.
+void LLTextureFetch::shutDownTextureCacheThread()
+{
+ if(mTextureCache)
+ {
+ llassert_always(mTextureCache->isQuitting() || mTextureCache->isStopped()) ;
+ mTextureCache = NULL ;
+ }
+}
+
+//called in the MAIN thread after the ImageDecodeThread shuts down.
+void LLTextureFetch::shutDownImageDecodeThread()
+{
+ if(mImageDecodeThread)
+ {
+ llassert_always(mImageDecodeThread->isQuitting() || mImageDecodeThread->isStopped()) ;
+ mImageDecodeThread = NULL ;
+ }
+}
+
// WORKER THREAD
void LLTextureFetch::startThread()
{
@@ -1760,8 +1927,6 @@ void LLTextureFetch::sendRequestListToSimulators()
}
timer.reset();
- LLMutexLock lock(&mQueueMutex);
-
// Send requests
typedef std::set<LLTextureFetchWorker*,LLTextureFetchWorker::Compare> request_list_t;
typedef std::map< LLHost, request_list_t > work_request_map_t;
@@ -1852,7 +2017,9 @@ void LLTextureFetch::sendRequestListToSimulators()
// llinfos << "IMAGE REQUEST: " << req->mID << " Discard: " << req->mDesiredDiscard
// << " Packet: " << packet << " Priority: " << req->mImagePriority << llendl;
- if ((gSavedSettings.getBOOL("LogTextureDownloadsToViewerLog")) || (gSavedSettings.getBOOL("LogTextureDownloadsToSimulator")))
+ static LLCachedControl<bool> log_to_viewer_log(gSavedSettings,"LogTextureDownloadsToViewerLog");
+ static LLCachedControl<bool> log_to_sim(gSavedSettings,"LogTextureDownloadsToSimulator");
+ if (log_to_viewer_log || log_to_sim)
{
mTextureInfo.setRequestStartTime(req->mID, LLTimer::getTotalTime());
mTextureInfo.setRequestOffset(req->mID, 0);
@@ -1970,7 +2137,6 @@ bool LLTextureFetchWorker::insertPacket(S32 index, U8* data, S32 size)
bool LLTextureFetch::receiveImageHeader(const LLHost& host, const LLUUID& id, U8 codec, U16 packets, U32 totalbytes,
U16 data_size, U8* data)
{
- LLMutexLock lock(&mQueueMutex);
LLTextureFetchWorker* worker = getWorker(id);
bool res = true;
@@ -2003,7 +2169,9 @@ bool LLTextureFetch::receiveImageHeader(const LLHost& host, const LLUUID& id, U8
if (!res)
{
++mBadPacketCount;
+ mNetworkQueueMutex.lock() ;
mCancelQueue[host].insert(id);
+ mNetworkQueueMutex.unlock() ;
return false;
}
@@ -2024,7 +2192,6 @@ bool LLTextureFetch::receiveImageHeader(const LLHost& host, const LLUUID& id, U8
bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U16 packet_num, U16 data_size, U8* data)
{
- LLMutexLock lock(&mQueueMutex);
LLTextureFetchWorker* worker = getWorker(id);
bool res = true;
@@ -2048,7 +2215,9 @@ bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U1
if (!res)
{
++mBadPacketCount;
+ mNetworkQueueMutex.lock() ;
mCancelQueue[host].insert(id);
+ mNetworkQueueMutex.unlock() ;
return false;
}
@@ -2071,7 +2240,10 @@ bool LLTextureFetch::receiveImagePacket(const LLHost& host, const LLUUID& id, U1
if(packet_num >= (worker->mTotalPackets - 1))
{
- if ((gSavedSettings.getBOOL("LogTextureDownloadsToViewerLog")) || (gSavedSettings.getBOOL("LogTextureDownloadsToSimulator")))
+ static LLCachedControl<bool> log_to_viewer_log(gSavedSettings,"LogTextureDownloadsToViewerLog");
+ static LLCachedControl<bool> log_to_sim(gSavedSettings,"LogTextureDownloadsToSimulator");
+
+ if (log_to_viewer_log || log_to_sim)
{
U64 timeNow = LLTimer::getTotalTime();
mTextureInfo.setRequestSize(id, worker->mFileSize);
@@ -2088,7 +2260,6 @@ BOOL LLTextureFetch::isFromLocalCache(const LLUUID& id)
{
BOOL from_cache = FALSE ;
- LLMutexLock lock(&mQueueMutex);
LLTextureFetchWorker* worker = getWorker(id);
if (worker)
{
@@ -2101,7 +2272,7 @@ BOOL LLTextureFetch::isFromLocalCache(const LLUUID& id)
}
S32 LLTextureFetch::getFetchState(const LLUUID& id, F32& data_progress_p, F32& requested_priority_p,
- U32& fetch_priority_p, F32& fetch_dtime_p, F32& request_dtime_p)
+ U32& fetch_priority_p, F32& fetch_dtime_p, F32& request_dtime_p, bool& can_use_http)
{
S32 state = LLTextureFetchWorker::INVALID;
F32 data_progress = 0.0f;
@@ -2110,7 +2281,6 @@ S32 LLTextureFetch::getFetchState(const LLUUID& id, F32& data_progress_p, F32& r
F32 request_dtime = 999999.f;
U32 fetch_priority = 0;
- LLMutexLock lock(&mQueueMutex);
LLTextureFetchWorker* worker = getWorker(id);
if (worker && worker->haveWork())
{
@@ -2140,6 +2310,7 @@ S32 LLTextureFetch::getFetchState(const LLUUID& id, F32& data_progress_p, F32& r
requested_priority = worker->mImagePriority;
}
fetch_priority = worker->getPriority();
+ can_use_http = worker->getCanUseHTTP() ;
worker->unlockWorkMutex();
}
data_progress_p = data_progress;
diff --git a/indra/newview/lltexturefetch.h b/indra/newview/lltexturefetch.h
index 373e38a83c..634e590fe0 100644
--- a/indra/newview/lltexturefetch.h
+++ b/indra/newview/lltexturefetch.h
@@ -58,9 +58,11 @@ public:
~LLTextureFetch();
/*virtual*/ S32 update(U32 max_time_ms);
+ void shutDownTextureCacheThread() ; //called in the main thread after the TextureCacheThread shuts down.
+ void shutDownImageDecodeThread() ; //called in the main thread after the ImageDecodeThread shuts down.
bool createRequest(const std::string& url, const LLUUID& id, const LLHost& host, F32 priority,
- S32 w, S32 h, S32 c, S32 discard, bool needs_aux);
+ S32 w, S32 h, S32 c, S32 discard, bool needs_aux, bool can_use_http);
void deleteRequest(const LLUUID& id, bool cancel);
bool getRequestFinished(const LLUUID& id, S32& discard_level,
LLPointer<LLImageRaw>& raw, LLPointer<LLImageRaw>& aux);
@@ -75,15 +77,16 @@ public:
// Debug
BOOL isFromLocalCache(const LLUUID& id);
S32 getFetchState(const LLUUID& id, F32& decode_progress_p, F32& requested_priority_p,
- U32& fetch_priority_p, F32& fetch_dtime_p, F32& request_dtime_p);
+ U32& fetch_priority_p, F32& fetch_dtime_p, F32& request_dtime_p, bool& can_use_http);
void dump();
- S32 getNumRequests() { return mRequestMap.size(); }
- S32 getNumHTTPRequests() { return mHTTPTextureQueue.size(); }
+ S32 getNumRequests() ;
+ S32 getNumHTTPRequests() ;
// Public for access by callbacks
void lockQueue() { mQueueMutex.lock(); }
void unlockQueue() { mQueueMutex.unlock(); }
LLTextureFetchWorker* getWorker(const LLUUID& id);
+ LLTextureFetchWorker* getWorkerAfterLock(const LLUUID& id);
LLTextureInfo* getTextureInfo() { return &mTextureInfo; }
@@ -92,7 +95,7 @@ protected:
void removeFromNetworkQueue(LLTextureFetchWorker* worker, bool cancel);
void addToHTTPQueue(const LLUUID& id);
void removeFromHTTPQueue(const LLUUID& id);
- S32 getHTTPQueueSize() { return (S32)mHTTPTextureQueue.size(); }
+ S32 getHTTPQueueSize() { return getNumHTTPRequests(); }
void removeRequest(LLTextureFetchWorker* worker, bool cancel);
// Called from worker thread (during doWork)
void processCurlRequests();
@@ -111,8 +114,8 @@ public:
S32 mBadPacketCount;
private:
- LLMutex mQueueMutex;
- LLMutex mNetworkQueueMutex;
+ LLMutex mQueueMutex; //to protect mRequestMap only
+ LLMutex mNetworkQueueMutex; //to protect mNetworkQueue, mHTTPTextureQueue and mCancelQueue.
LLTextureCache* mTextureCache;
LLImageDecodeThread* mImageDecodeThread;
diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp
index 98731f90f4..8ea4dbeb04 100644
--- a/indra/newview/lltextureview.cpp
+++ b/indra/newview/lltextureview.cpp
@@ -54,12 +54,19 @@
#include "llviewertexture.h"
#include "llviewertexturelist.h"
#include "llvovolume.h"
+
+// For avatar texture view
+#include "llvoavatarself.h"
+#include "lltexlayer.h"
+
extern F32 texmem_lower_bound_scale;
LLTextureView *gTextureView = NULL;
LLTextureSizeView *gTextureSizeView = NULL;
LLTextureSizeView *gTextureCategoryView = NULL;
+#define HIGH_PRIORITY 100000000.f
+
//static
std::set<LLViewerFetchedTexture*> LLTextureView::sDebugImages;
@@ -375,6 +382,105 @@ LLRect LLTextureBar::getRequiredRect()
////////////////////////////////////////////////////////////////////////////
+class LLAvatarTexBar : public LLView
+{
+public:
+ struct Params : public LLInitParam::Block<Params, LLView::Params>
+ {
+ Mandatory<LLTextureView*> texture_view;
+ Params()
+ : texture_view("texture_view")
+ {
+ S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f);
+ rect(LLRect(0,0,100,line_height * 4));
+ }
+ };
+
+ LLAvatarTexBar(const Params& p)
+ : LLView(p),
+ mTextureView(p.texture_view)
+ {}
+
+ virtual void draw();
+ virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
+ virtual LLRect getRequiredRect(); // Return the height of this object, given the set options.
+
+private:
+ LLTextureView* mTextureView;
+};
+
+void LLAvatarTexBar::draw()
+{
+ if (!gSavedSettings.getBOOL("DebugAvatarRezTime")) return;
+
+ LLVOAvatarSelf* avatarp = gAgentAvatarp;
+ if (!avatarp) return;
+
+ const S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f);
+ const S32 v_offset = 0;
+ const S32 l_offset = 3;
+
+ //----------------------------------------------------------------------------
+ LLGLSUIDefault gls_ui;
+ LLColor4 color;
+
+ U32 line_num = 1;
+ for (LLVOAvatarDefines::LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDefines::LLVOAvatarDictionary::getInstance()->getBakedTextures().begin();
+ baked_iter != LLVOAvatarDefines::LLVOAvatarDictionary::getInstance()->getBakedTextures().end();
+ ++baked_iter)
+ {
+ const LLVOAvatarDefines::EBakedTextureIndex baked_index = baked_iter->first;
+ const LLTexLayerSet *layerset = avatarp->debugGetLayerSet(baked_index);
+ if (!layerset) continue;
+ const LLTexLayerSetBuffer *layerset_buffer = layerset->getComposite();
+ if (!layerset_buffer) continue;
+
+ LLColor4 text_color = LLColor4::white;
+
+ if (layerset_buffer->uploadNeeded())
+ {
+ text_color = LLColor4::red;
+ }
+ if (layerset_buffer->uploadInProgress())
+ {
+ text_color = LLColor4::magenta;
+ }
+ std::string text = layerset_buffer->dumpTextureInfo();
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, l_offset, v_offset + line_height*line_num,
+ text_color, LLFontGL::LEFT, LLFontGL::TOP); //, LLFontGL::BOLD, LLFontGL::DROP_SHADOW_SOFT);
+ line_num++;
+ }
+ const U32 texture_timeout = gSavedSettings.getU32("AvatarBakedTextureTimeout");
+ const U32 override_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel");
+
+ LLColor4 header_color(1.f, 1.f, 1.f, 0.9f);
+
+ const std::string texture_timeout_str = texture_timeout ? llformat("%d",texture_timeout) : "Disabled";
+ const std::string override_tex_discard_level_str = override_tex_discard_level ? llformat("%d",override_tex_discard_level) : "Disabled";
+ std::string header_text = llformat("[ Timeout('AvatarBakedTextureTimeout'):%s ] [ LOD_Override('TextureDiscardLevel'):%s ]", texture_timeout_str.c_str(), override_tex_discard_level_str.c_str());
+ LLFontGL::getFontMonospace()->renderUTF8(header_text, 0, l_offset, v_offset + line_height*line_num,
+ header_color, LLFontGL::LEFT, LLFontGL::TOP); //, LLFontGL::BOLD, LLFontGL::DROP_SHADOW_SOFT);
+ line_num++;
+ std::string section_text = "Avatar Textures Information:";
+ LLFontGL::getFontMonospace()->renderUTF8(section_text, 0, 0, v_offset + line_height*line_num,
+ header_color, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::BOLD, LLFontGL::DROP_SHADOW_SOFT);
+}
+
+BOOL LLAvatarTexBar::handleMouseDown(S32 x, S32 y, MASK mask)
+{
+ return FALSE;
+}
+
+LLRect LLAvatarTexBar::getRequiredRect()
+{
+ LLRect rect;
+ rect.mTop = 100;
+ if (!gSavedSettings.getBOOL("DebugAvatarRezTime")) rect.mTop = 0;
+ return rect;
+}
+
+////////////////////////////////////////////////////////////////////////////
+
class LLGLTexMemBar : public LLView
{
public:
@@ -412,13 +518,17 @@ void LLGLTexMemBar::draw()
F32 cache_usage = (F32)BYTES_TO_MEGA_BYTES(LLAppViewer::getTextureCache()->getUsage()) ;
F32 cache_max_usage = (F32)BYTES_TO_MEGA_BYTES(LLAppViewer::getTextureCache()->getMaxUsage()) ;
S32 line_height = (S32)(LLFontGL::getFontMonospace()->getLineHeight() + .5f);
- S32 v_offset = (S32)((texture_bar_height + 2.5f) * mTextureView->mNumTextureBars + 2.5f);
+ S32 v_offset = (S32)((texture_bar_height + 2.2f) * mTextureView->mNumTextureBars + 2.0f);
//----------------------------------------------------------------------------
LLGLSUIDefault gls_ui;
LLColor4 text_color(1.f, 1.f, 1.f, 0.75f);
LLColor4 color;
- std::string text;
+ std::string text = "";
+
+ LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*6,
+ text_color, LLFontGL::LEFT, LLFontGL::TOP);
+
text = llformat("GL Tot: %d/%d MB Bound: %d/%d MB Raw Tot: %d MB Bias: %.2f Cache: %.1f/%.1f MB",
total_mem,
max_total_mem,
@@ -560,7 +670,8 @@ BOOL LLGLTexMemBar::handleMouseDown(S32 x, S32 y, MASK mask)
LLRect LLGLTexMemBar::getRequiredRect()
{
LLRect rect;
- rect.mTop = 8;
+ //rect.mTop = 50;
+ rect.mTop = 0;
return rect;
}
@@ -640,6 +751,7 @@ LLTextureView::LLTextureView(const LLTextureView::Params& p)
setDisplayChildren(TRUE);
mGLTexMemBar = 0;
+ mAvatarTexBar = 0;
}
LLTextureView::~LLTextureView()
@@ -647,6 +759,9 @@ LLTextureView::~LLTextureView()
// Children all cleaned up by default view destructor.
delete mGLTexMemBar;
mGLTexMemBar = 0;
+
+ delete mAvatarTexBar;
+ mAvatarTexBar = 0;
}
typedef std::pair<F32,LLViewerFetchedTexture*> decode_pair_t;
@@ -658,6 +773,15 @@ struct compare_decode_pair
}
};
+struct KillView
+{
+ void operator()(LLView* viewp)
+ {
+ viewp->getParent()->removeChild(viewp);
+ viewp->die();
+ }
+};
+
void LLTextureView::draw()
{
if (!mFreezeView)
@@ -665,12 +789,23 @@ void LLTextureView::draw()
// LLViewerObject *objectp;
// S32 te;
- for_each(mTextureBars.begin(), mTextureBars.end(), DeletePointer());
+ for_each(mTextureBars.begin(), mTextureBars.end(), KillView());
mTextureBars.clear();
-
- delete mGLTexMemBar;
- mGLTexMemBar = 0;
-
+
+ if (mGLTexMemBar)
+ {
+ removeChild(mGLTexMemBar);
+ mGLTexMemBar->die();
+ mGLTexMemBar = 0;
+ }
+
+ if (mAvatarTexBar)
+ {
+ removeChild(mAvatarTexBar);
+ mAvatarTexBar->die();
+ mAvatarTexBar = 0;
+ }
+
typedef std::multiset<decode_pair_t, compare_decode_pair > display_list_t;
display_list_t display_image_list;
@@ -683,6 +818,10 @@ void LLTextureView::draw()
iter != gTextureList.mImageList.end(); )
{
LLPointer<LLViewerFetchedTexture> imagep = *iter++;
+ if(!imagep->hasFetcher())
+ {
+ continue ;
+ }
S32 cur_discard = imagep->getDiscardLevel();
S32 desired_discard = imagep->mDesiredDiscardLevel;
@@ -691,7 +830,7 @@ void LLTextureView::draw()
{
S32 tex_mem = imagep->hasGLTexture() ? imagep->getTextureMemory() : 0 ;
llinfos << imagep->getID()
- << "\t" << tex_mem
+ << "\t" << tex_mem
<< "\t" << imagep->getBoostLevel()
<< "\t" << imagep->getDecodePriority()
<< "\t" << imagep->getWidth()
@@ -706,19 +845,6 @@ void LLTextureView::draw()
++debug_count; // for breakpoints
}
-#if 0
- if (imagep->getDontDiscard())
- {
- continue;
- }
-
- if (imagep->isMissingAsset())
- {
- continue;
- }
-#endif
-
-#define HIGH_PRIORITY 100000000.f
F32 pri;
if (mOrderFetch)
{
@@ -737,59 +863,55 @@ void LLTextureView::draw()
if (!mOrderFetch)
{
-#if 1
- if (pri < HIGH_PRIORITY && LLSelectMgr::getInstance())
- {
- struct f : public LLSelectedTEFunctor
+ if (pri < HIGH_PRIORITY && LLSelectMgr::getInstance())
{
- LLViewerFetchedTexture* mImage;
- f(LLViewerFetchedTexture* image) : mImage(image) {}
- virtual bool apply(LLViewerObject* object, S32 te)
+ struct f : public LLSelectedTEFunctor
+ {
+ LLViewerFetchedTexture* mImage;
+ f(LLViewerFetchedTexture* image) : mImage(image) {}
+ virtual bool apply(LLViewerObject* object, S32 te)
+ {
+ return (mImage == object->getTEImage(te));
+ }
+ } func(imagep);
+ const bool firstonly = true;
+ bool match = LLSelectMgr::getInstance()->getSelection()->applyToTEs(&func, firstonly);
+ if (match)
{
- return (mImage == object->getTEImage(te));
+ pri += 3*HIGH_PRIORITY;
}
- } func(imagep);
- const bool firstonly = true;
- bool match = LLSelectMgr::getInstance()->getSelection()->applyToTEs(&func, firstonly);
- if (match)
- {
- pri += 3*HIGH_PRIORITY;
}
- }
-#endif
-#if 1
- if (pri < HIGH_PRIORITY && (cur_discard< 0 || desired_discard < cur_discard))
- {
- LLSelectNode* hover_node = LLSelectMgr::instance().getHoverNode();
- if (hover_node)
+
+ if (pri < HIGH_PRIORITY && (cur_discard< 0 || desired_discard < cur_discard))
{
- LLViewerObject *objectp = hover_node->getObject();
- if (objectp)
+ LLSelectNode* hover_node = LLSelectMgr::instance().getHoverNode();
+ if (hover_node)
{
- S32 tex_count = objectp->getNumTEs();
- for (S32 i = 0; i < tex_count; i++)
+ LLViewerObject *objectp = hover_node->getObject();
+ if (objectp)
{
- if (imagep == objectp->getTEImage(i))
+ S32 tex_count = objectp->getNumTEs();
+ for (S32 i = 0; i < tex_count; i++)
{
- pri += 2*HIGH_PRIORITY;
- break;
+ if (imagep == objectp->getTEImage(i))
+ {
+ pri += 2*HIGH_PRIORITY;
+ break;
+ }
}
}
}
}
- }
-#endif
-#if 1
- if (pri > 0.f && pri < HIGH_PRIORITY)
- {
- if (imagep->mLastPacketTimer.getElapsedTimeF32() < 1.f ||
- imagep->mFetchDeltaTime < 0.25f)
+
+ if (pri > 0.f && pri < HIGH_PRIORITY)
{
- pri += 1*HIGH_PRIORITY;
+ if (imagep->mLastPacketTimer.getElapsedTimeF32() < 1.f ||
+ imagep->mFetchDeltaTime < 0.25f)
+ {
+ pri += 1*HIGH_PRIORITY;
+ }
}
}
-#endif
- }
if (pri > 0.0f)
{
@@ -830,11 +952,21 @@ void LLTextureView::draw()
sortChildren(LLTextureBar::sort());
LLGLTexMemBar::Params tmbp;
+ LLRect tmbr;
tmbp.name("gl texmem bar");
+ tmbp.rect(tmbr);
tmbp.texture_view(this);
mGLTexMemBar = LLUICtrlFactory::create<LLGLTexMemBar>(tmbp);
- addChild(mGLTexMemBar);
-
+ addChildInBack(mGLTexMemBar);
+
+ LLAvatarTexBar::Params atbp;
+ LLRect atbr;
+ atbp.name("gl avatartex bar");
+ atbp.texture_view(this);
+ atbp.rect(atbr);
+ mAvatarTexBar = LLUICtrlFactory::create<LLAvatarTexBar>(atbp);
+ addChild(mAvatarTexBar);
+
reshape(getRect().getWidth(), getRect().getHeight(), TRUE);
/*
diff --git a/indra/newview/lltextureview.h b/indra/newview/lltextureview.h
index 435a55df83..dfd9c42c2c 100644
--- a/indra/newview/lltextureview.h
+++ b/indra/newview/lltextureview.h
@@ -38,11 +38,13 @@
class LLViewerFetchedTexture;
class LLTextureBar;
class LLGLTexMemBar;
+class LLAvatarTexBar;
class LLTextureView : public LLContainerView
{
friend class LLTextureBar;
friend class LLGLTexMemBar;
+ friend class LLAvatarTexBar;
protected:
LLTextureView(const Params&);
friend class LLUICtrlFactory;
@@ -73,7 +75,7 @@ private:
U32 mNumTextureBars;
LLGLTexMemBar* mGLTexMemBar;
-
+ LLAvatarTexBar* mAvatarTexBar;
public:
static std::set<LLViewerFetchedTexture*> sDebugImages;
};
diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp
index 110d158e2d..9abfab300c 100644
--- a/indra/newview/lltoast.cpp
+++ b/indra/newview/lltoast.cpp
@@ -41,6 +41,16 @@
using namespace LLNotificationsUI;
+/*virtual*/
+BOOL LLToastLifeTimer::tick()
+{
+ if (mEventTimer.hasExpired())
+ {
+ mToast->expire();
+ }
+ return FALSE;
+}
+
//--------------------------------------------------------------------------
LLToast::Params::Params()
: can_fade("can_fade", true),
@@ -68,12 +78,19 @@ LLToast::LLToast(const LLToast::Params& p)
mNotification(p.notification),
mIsHidden(false),
mHideBtnPressed(false),
- mIsTip(p.is_tip)
+ mIsTip(p.is_tip),
+ mWrapperPanel(NULL)
{
+ mTimer.reset(new LLToastLifeTimer(this, p.lifetime_secs));
+
LLUICtrlFactory::getInstance()->buildFloater(this, "panel_toast.xml", NULL);
setCanDrag(FALSE);
+ mWrapperPanel = getChild<LLPanel>("wrapper_panel");
+ mWrapperPanel->setMouseEnterCallback(boost::bind(&LLToast::onToastMouseEnter, this));
+ mWrapperPanel->setMouseLeaveCallback(boost::bind(&LLToast::onToastMouseLeave, this));
+
if(mPanel)
{
insertPanel(mPanel);
@@ -83,6 +100,8 @@ LLToast::LLToast(const LLToast::Params& p)
{
mHideBtn = getChild<LLButton>("hide_btn");
mHideBtn->setClickedCallback(boost::bind(&LLToast::hide,this));
+ mHideBtn->setMouseEnterCallback(boost::bind(&LLToast::onToastMouseEnter, this));
+ mHideBtn->setMouseLeaveCallback(boost::bind(&LLToast::onToastMouseLeave, this));
}
// init callbacks if present
@@ -98,33 +117,13 @@ BOOL LLToast::postBuild()
{
if(!mCanFade)
{
- mTimer.stop();
- }
-
- if (mIsTip)
- {
- mTextEditor = mPanel->getChild<LLTextEditor>("text_editor_box");
-
- if (mTextEditor)
- {
- mTextEditor->setMouseUpCallback(boost::bind(&LLToast::hide,this));
- mPanel->setMouseUpCallback(boost::bind(&LLToast::handleTipToastClick, this, _2, _3, _4));
- }
+ mTimer->stop();
}
return TRUE;
}
//--------------------------------------------------------------------------
-void LLToast::handleTipToastClick(S32 x, S32 y, MASK mask)
-{
- if (!mTextEditor->getRect().pointInRect(x, y))
- {
- hide();
- }
-}
-
-//--------------------------------------------------------------------------
void LLToast::setHideButtonEnabled(bool enabled)
{
if(mHideBtn)
@@ -138,40 +137,48 @@ LLToast::~LLToast()
}
//--------------------------------------------------------------------------
-void LLToast::setAndStartTimer(F32 period)
+void LLToast::hide()
{
- if(mCanFade)
+ setVisible(FALSE);
+ mTimer->stop();
+ mIsHidden = true;
+ mOnFadeSignal(this);
+}
+
+void LLToast::onFocusLost()
+{
+ if(mWrapperPanel && !isBackgroundVisible())
{
- mToastLifetime = period;
- mTimer.start();
+ // Lets make wrapper panel behave like a floater
+ setBackgroundOpaque(FALSE);
}
}
-//--------------------------------------------------------------------------
-bool LLToast::lifetimeHasExpired()
+void LLToast::onFocusReceived()
{
- if (mTimer.getStarted())
+ if(mWrapperPanel && !isBackgroundVisible())
{
- F32 elapsed_time = mTimer.getElapsedTimeF32();
- if ((mToastLifetime - elapsed_time) <= mToastFadingTime)
- {
- setBackgroundOpaque(FALSE);
- }
- if (elapsed_time > mToastLifetime)
- {
- return true;
- }
+ // Lets make wrapper panel behave like a floater
+ setBackgroundOpaque(TRUE);
}
- return false;
}
-//--------------------------------------------------------------------------
-void LLToast::hide()
+S32 LLToast::getTopPad()
{
- setVisible(FALSE);
- mTimer.stop();
- mIsHidden = true;
- mOnFadeSignal(this);
+ if(mWrapperPanel)
+ {
+ return getRect().getHeight() - mWrapperPanel->getRect().getHeight();
+ }
+ return 0;
+}
+
+S32 LLToast::getRightPad()
+{
+ if(mWrapperPanel)
+ {
+ return getRect().getWidth() - mWrapperPanel->getRect().getWidth();
+ }
+ return 0;
}
//--------------------------------------------------------------------------
@@ -179,12 +186,13 @@ void LLToast::setCanFade(bool can_fade)
{
mCanFade = can_fade;
if(!mCanFade)
- mTimer.stop();
+ mTimer->stop();
}
//--------------------------------------------------------------------------
-void LLToast::tick()
+void LLToast::expire()
{
+ // if toast has fade property - hide it
if(mCanFade)
{
hide();
@@ -199,34 +207,48 @@ void LLToast::reshapeToPanel()
if(!panel)
return;
- LLRect panel_rect;
+ LLRect panel_rect = panel->getRect();
- panel_rect = panel->getRect();
- reshape(panel_rect.getWidth(), panel_rect.getHeight());
panel_rect.setLeftTopAndSize(0, panel_rect.getHeight(), panel_rect.getWidth(), panel_rect.getHeight());
- panel->setRect(panel_rect);
+ panel->setShape(panel_rect);
LLRect toast_rect = getRect();
- toast_rect.setLeftTopAndSize(toast_rect.mLeft,toast_rect.mTop,panel_rect.getWidth(), panel_rect.getHeight());
- setRect(toast_rect);
+ toast_rect.setLeftTopAndSize(toast_rect.mLeft, toast_rect.mTop,
+ panel_rect.getWidth() + getRightPad(), panel_rect.getHeight() + getTopPad());
+ setShape(toast_rect);
}
void LLToast::insertPanel(LLPanel* panel)
{
- addChild(panel);
+ mWrapperPanel->addChild(panel);
reshapeToPanel();
}
//--------------------------------------------------------------------------
void LLToast::draw()
{
- if(lifetimeHasExpired())
+ LLFloater::draw();
+
+ if(!isBackgroundVisible())
{
- tick();
+ // Floater background is invisible, lets make wrapper panel look like a
+ // floater - draw shadow.
+ drawShadow(mWrapperPanel);
+
+ // Shadow will probably overlap close button, lets redraw the button
+ if(mHideBtn)
+ {
+ drawChild(mHideBtn);
+ }
}
- LLFloater::draw();
+ // if timer started and remaining time <= fading time
+ if (mTimer->getStarted() && (mToastLifetime
+ - mTimer->getEventTimer().getElapsedTimeF32()) <= mToastFadingTime)
+ {
+ setBackgroundOpaque(FALSE);
+ }
}
//--------------------------------------------------------------------------
@@ -245,11 +267,20 @@ void LLToast::setVisible(BOOL show)
if(show)
{
setBackgroundOpaque(TRUE);
- if(!mTimer.getStarted() && mCanFade)
+ if(!mTimer->getStarted() && mCanFade)
+ {
+ mTimer->start();
+ }
+ if (!getVisible())
{
- mTimer.start();
+ LLModalDialog::setFrontmost(FALSE);
}
- LLModalDialog::setFrontmost(FALSE);
+ }
+ else
+ {
+ //hide "hide" button in case toast was hidden without mouse_leave
+ if(mHideBtn)
+ mHideBtn->setVisible(show);
}
LLFloater::setVisible(show);
if(mPanel)
@@ -261,43 +292,78 @@ void LLToast::setVisible(BOOL show)
}
}
-//--------------------------------------------------------------------------
-void LLToast::onMouseEnter(S32 x, S32 y, MASK mask)
+void LLToast::onToastMouseEnter()
{
- mOnToastHoverSignal(this, MOUSE_ENTER);
+ LLRect panel_rc = mWrapperPanel->calcScreenRect();
+ LLRect button_rc;
+ if(mHideBtn)
+ {
+ button_rc = mHideBtn->calcScreenRect();
+ }
- setBackgroundOpaque(TRUE);
+ S32 x, y;
+ LLUI::getMousePositionScreen(&x, &y);
- //toasts fading is management by Screen Channel
-
- sendChildToFront(mHideBtn);
- if(mHideBtn && mHideBtn->getEnabled())
- mHideBtn->setVisible(TRUE);
- mOnMouseEnterSignal(this);
+ if(panel_rc.pointInRect(x, y) || button_rc.pointInRect(x, y))
+ {
+ mOnToastHoverSignal(this, MOUSE_ENTER);
- LLModalDialog::onMouseEnter(x, y, mask);
+ setBackgroundOpaque(TRUE);
+
+ //toasts fading is management by Screen Channel
+
+ sendChildToFront(mHideBtn);
+ if(mHideBtn && mHideBtn->getEnabled())
+ {
+ mHideBtn->setVisible(TRUE);
+ }
+ mOnMouseEnterSignal(this);
+ mToastMouseEnterSignal(this, getValue());
+ }
}
-//--------------------------------------------------------------------------
-void LLToast::onMouseLeave(S32 x, S32 y, MASK mask)
-{
- mOnToastHoverSignal(this, MOUSE_LEAVE);
+void LLToast::onToastMouseLeave()
+{
+ LLRect panel_rc = mWrapperPanel->calcScreenRect();
+ LLRect button_rc;
+ if(mHideBtn)
+ {
+ button_rc = mHideBtn->calcScreenRect();
+ }
- //toasts fading is management by Screen Channel
+ S32 x, y;
+ LLUI::getMousePositionScreen(&x, &y);
- if(mHideBtn && mHideBtn->getEnabled())
+ if( !panel_rc.pointInRect(x, y) && !button_rc.pointInRect(x, y))
{
- if( mHideBtnPressed )
+ mOnToastHoverSignal(this, MOUSE_LEAVE);
+
+ //toasts fading is management by Screen Channel
+
+ if(mHideBtn && mHideBtn->getEnabled())
{
- mHideBtnPressed = false;
- return;
+ if( mHideBtnPressed )
+ {
+ mHideBtnPressed = false;
+ return;
+ }
+ mHideBtn->setVisible(FALSE);
}
- mHideBtn->setVisible(FALSE);
+ mToastMouseLeaveSignal(this, getValue());
}
-
- LLModalDialog::onMouseLeave(x, y, mask);
}
+void LLToast::setBackgroundOpaque(BOOL b)
+{
+ if(mWrapperPanel && !isBackgroundVisible())
+ {
+ mWrapperPanel->setBackgroundOpaque(b);
+ }
+ else
+ {
+ LLModalDialog::setBackgroundOpaque(b);
+ }
+}
void LLNotificationsUI::LLToast::stopFading()
{
@@ -315,6 +381,13 @@ void LLNotificationsUI::LLToast::startFading()
}
}
+bool LLToast::isHovered()
+{
+ S32 x, y;
+ LLUI::getMousePositionScreen(&x, &y);
+ return mWrapperPanel->calcScreenRect().pointInRect(x, y);
+}
+
//--------------------------------------------------------------------------
BOOL LLToast::handleMouseDown(S32 x, S32 y, MASK mask)
@@ -339,4 +412,13 @@ bool LLToast::isNotificationValid()
//--------------------------------------------------------------------------
+S32 LLToast::notifyParent(const LLSD& info)
+{
+ if (info.has("action") && "hide_toast" == info["action"].asString())
+ {
+ hide();
+ return 1;
+ }
+ return LLModalDialog::notifyParent(info);
+}
diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h
index 3d25fd4f02..4211f21ef1 100644
--- a/indra/newview/lltoast.h
+++ b/indra/newview/lltoast.h
@@ -36,7 +36,7 @@
#include "llpanel.h"
#include "llmodaldialog.h"
-#include "lltimer.h"
+#include "lleventtimer.h"
#include "llnotificationptr.h"
#include "llviewercontrol.h"
@@ -48,12 +48,34 @@
namespace LLNotificationsUI
{
+class LLToast;
+/**
+ * Timer for toasts.
+ */
+class LLToastLifeTimer: public LLEventTimer
+{
+public:
+ LLToastLifeTimer(LLToast* toast, F32 period) : mToast(toast), LLEventTimer(period){}
+
+ /*virtual*/
+ BOOL tick();
+ void stop() { mEventTimer.stop(); }
+ void start() { mEventTimer.start(); }
+ void restart() {mEventTimer.reset(); }
+ BOOL getStarted() { return mEventTimer.getStarted(); }
+
+ LLTimer& getEventTimer() { return mEventTimer;}
+private :
+ LLToast* mToast;
+};
+
/**
* Represents toast pop-up.
* This is a parent view for all toast panels.
*/
class LLToast : public LLModalDialog
{
+ friend class LLToastLifeTimer;
public:
typedef boost::function<void (LLToast* toast)> toast_callback_t;
typedef boost::signals2::signal<void (LLToast* toast)> toast_signal_t;
@@ -86,8 +108,6 @@ public:
// Toast handlers
virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask);
- virtual void onMouseEnter(S32 x, S32 y, MASK mask);
- virtual void onMouseLeave(S32 x, S32 y, MASK mask);
//Fading
@@ -97,6 +117,7 @@ public:
/** Start fading timer */
virtual void startFading();
+ bool isHovered();
// Operating with toasts
// insert a panel to a toast
@@ -108,20 +129,32 @@ public:
LLPanel* getPanel() { return mPanel; }
// enable/disable Toast's Hide button
void setHideButtonEnabled(bool enabled);
- // initialize and start Toast's timer
- void setAndStartTimer(F32 period);
//
- void resetTimer() { mTimer.start(); }
+ void resetTimer() { mTimer->start(); }
//
- void stopTimer() { mTimer.stop(); }
+ void stopTimer() { mTimer->stop(); }
+ //
+ LLToastLifeTimer* getTimer() { return mTimer.get();}
//
virtual void draw();
//
virtual void setVisible(BOOL show);
+
+ /*virtual*/ void setBackgroundOpaque(BOOL b);
//
virtual void hide();
+ /*virtual*/ void onFocusLost();
+ /*virtual*/ void onFocusReceived();
+
+ /**
+ * Returns padding between floater top and wrapper_panel top.
+ * This padding should be taken into account when positioning or reshaping toasts
+ */
+ S32 getTopPad();
+
+ S32 getRightPad();
// get/set Toast's flags or states
// get information whether the notification corresponding to the toast is valid or not
@@ -154,28 +187,33 @@ public:
toast_hover_check_signal_t mOnToastHoverSignal;
boost::signals2::connection setOnToastHoverCallback(toast_hover_check_callback_t cb) { return mOnToastHoverSignal.connect(cb); }
+ boost::signals2::connection setMouseEnterCallback( const commit_signal_t::slot_type& cb ) { return mToastMouseEnterSignal.connect(cb); };
+ boost::signals2::connection setMouseLeaveCallback( const commit_signal_t::slot_type& cb ) { return mToastMouseLeaveSignal.connect(cb); };
+
+ virtual S32 notifyParent(const LLSD& info);
private:
- void handleTipToastClick(S32 x, S32 y, MASK mask);
+ void onToastMouseEnter();
+
+ void onToastMouseLeave();
- // check timer
- bool lifetimeHasExpired();
- // on timer finished function
- void tick();
+ void expire();
LLUUID mNotificationID;
LLUUID mSessionID;
LLNotificationPtr mNotification;
+ LLPanel* mWrapperPanel;
+
// timer counts a lifetime of a toast
- LLTimer mTimer;
+ std::auto_ptr<LLToastLifeTimer> mTimer;
+
F32 mToastLifetime; // in seconds
F32 mToastFadingTime; // in seconds
LLPanel* mPanel;
LLButton* mHideBtn;
- LLTextEditor* mTextEditor;
LLColor4 mBgColor;
bool mCanFade;
@@ -184,6 +222,9 @@ private:
bool mHideBtnPressed;
bool mIsHidden; // this flag is TRUE when a toast has faded or was hidden with (x) button (EXT-1849)
bool mIsTip;
+
+ commit_signal_t mToastMouseEnterSignal;
+ commit_signal_t mToastMouseLeaveSignal;
};
}
diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp
index c3ccb9380b..7ba256c870 100644
--- a/indra/newview/lltoastalertpanel.cpp
+++ b/indra/newview/lltoastalertpanel.cpp
@@ -50,6 +50,8 @@
#include "llnotifications.h"
#include "llfunctorregistry.h"
#include "llrootview.h"
+#include "lltransientfloatermgr.h"
+#include "llviewercontrol.h" // for gSavedSettings
const S32 MAX_ALLOWED_MSG_WIDTH = 400;
const F32 DEFAULT_BUTTON_DELAY = 0.5f;
@@ -170,6 +172,7 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
params.tab_stop(false);
params.wrap(true);
params.follows.flags(FOLLOWS_LEFT | FOLLOWS_TOP);
+ params.allow_scroll(true);
LLTextBox * msg_box = LLUICtrlFactory::create<LLTextBox> (params);
// Compute max allowable height for the dialog text, so we can allocate
@@ -178,9 +181,16 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
gFloaterView->getRect().getHeight()
- LINE_HEIGHT // title bar
- 3*VPAD - BTN_HEIGHT;
+ // reshape to calculate real text width and height
msg_box->reshape( MAX_ALLOWED_MSG_WIDTH, max_allowed_msg_height );
msg_box->setValue(msg);
- msg_box->reshapeToFitText();
+
+ S32 pixel_width = msg_box->getTextPixelWidth();
+ S32 pixel_height = msg_box->getTextPixelHeight();
+
+ // We should use some space to prevent set textbox's scroller visible when it is unnecessary.
+ msg_box->reshape( llmin(MAX_ALLOWED_MSG_WIDTH,pixel_width + 2 * msg_box->getHPad() + HPAD),
+ llmin(max_allowed_msg_height,pixel_height + 2 * msg_box->getVPad()) ) ;
const LLRect& text_rect = msg_box->getRect();
S32 dialog_width = llmax( btn_total_width, text_rect.getWidth() ) + 2 * HPAD;
@@ -237,13 +247,72 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
msg_box->setRect( rect );
LLToastPanel::addChild(msg_box);
- // Buttons
- S32 button_left = (LLToastPanel::getRect().getWidth() - btn_total_width) / 2;
+ // (Optional) Edit Box
+ if (!edit_text_name.empty())
+ {
+ S32 y = VPAD + BTN_HEIGHT + VPAD/2;
+ mLineEditor = LLUICtrlFactory::getInstance()->createFromFile<LLLineEditor>("alert_line_editor.xml", this, LLPanel::child_registry_t::instance());
+ if (mLineEditor)
+ {
+ LLRect leditor_rect = LLRect( HPAD, y+EDITOR_HEIGHT, dialog_width-HPAD, y);
+ mLineEditor->setName(edit_text_name);
+ mLineEditor->reshape(leditor_rect.getWidth(), leditor_rect.getHeight());
+ mLineEditor->setRect(leditor_rect);
+ mLineEditor->setText(edit_text_contents);
+
+ // decrease limit of line editor of teleport offer dialog to avoid truncation of
+ // location URL in invitation message, see EXT-6891
+ if ("OfferTeleport" == mNotification->getName())
+ {
+ mLineEditor->setMaxTextLength(gSavedSettings.getS32(
+ "teleport_offer_invitation_max_length"));
+ }
+ else
+ {
+ mLineEditor->setMaxTextLength(STD_STRING_STR_LEN - 1);
+ }
+
+ LLToastPanel::addChild(mLineEditor);
+
+ mLineEditor->setDrawAsterixes(is_password);
+
+ setEditTextArgs(notification->getSubstitutions());
+
+ mLineEditor->setFollowsLeft();
+ mLineEditor->setFollowsRight();
+
+ // find form text input field
+ LLSD form_text;
+ for (LLSD::array_const_iterator it = form_sd.beginArray(); it != form_sd.endArray(); ++it)
+ {
+ std::string type = (*it)["type"].asString();
+ if (type == "text")
+ {
+ form_text = (*it);
+ }
+ }
+
+ // if form text input field has width attribute
+ if (form_text.has("width"))
+ {
+ // adjust floater width to fit line editor
+ S32 editor_width = form_text["width"];
+ LLRect editor_rect = mLineEditor->getRect();
+ U32 width_delta = editor_width - editor_rect.getWidth();
+ LLRect toast_rect = getRect();
+ reshape(toast_rect.getWidth() + width_delta, toast_rect.getHeight());
+ }
+ }
+ }
+
+ // Buttons
+ S32 button_left = (LLToastPanel::getRect().getWidth() - btn_total_width) / 2;
+
for( S32 i = 0; i < num_options; i++ )
{
LLRect button_rect;
-
+
LLButton* btn = LLUICtrlFactory::getInstance()->createFromFile<LLButton>("alert_button.xml", this, LLPanel::child_registry_t::instance());
if(btn)
{
@@ -251,7 +320,7 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
btn->setRect(button_rect.setOriginAndSize( button_left, VPAD, button_width, BTN_HEIGHT ));
btn->setLabel(options[i].second);
btn->setFont(font);
-
+
btn->setClickedCallback(boost::bind(&LLToastAlertPanel::onButtonPressed, this, _2, i));
mButtonData[i].mButton = btn;
@@ -266,32 +335,6 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
button_left += button_width + BTN_HPAD;
}
- // (Optional) Edit Box
- if (!edit_text_name.empty())
- {
- S32 y = VPAD + BTN_HEIGHT + VPAD/2;
- mLineEditor = LLUICtrlFactory::getInstance()->createFromFile<LLLineEditor>("alert_line_editor.xml", this, LLPanel::child_registry_t::instance());
-
- if (mLineEditor)
- {
- LLRect leditor_rect = LLRect( HPAD, y+EDITOR_HEIGHT, dialog_width-HPAD, y);
- mLineEditor->setName(edit_text_name);
- mLineEditor->reshape(leditor_rect.getWidth(), leditor_rect.getHeight());
- mLineEditor->setRect(leditor_rect);
- mLineEditor->setText(edit_text_contents);
- mLineEditor->setMaxTextLength(STD_STRING_STR_LEN - 1);
-
- // make sure all edit keys get handled properly (DEV-22396)
- mLineEditor->setHandleEditKeysDirectly(TRUE);
-
- LLToastPanel::addChild(mLineEditor);
-
- mLineEditor->setDrawAsterixes(is_password);
-
- setEditTextArgs(notification->getSubstitutions());
- }
- }
-
std::string ignore_label;
if (form->getIgnoreType() == LLNotificationForm::IGNORE_WITH_DEFAULT_RESPONSE)
@@ -315,6 +358,9 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
mDefaultBtnTimer.start();
mDefaultBtnTimer.setTimerExpirySec(DEFAULT_BUTTON_DELAY);
}
+
+ LLTransientFloaterMgr::instance().addControlView(
+ LLTransientFloaterMgr::GLOBAL, this);
}
bool LLToastAlertPanel::setCheckBox( const std::string& check_title, const std::string& check_control )
@@ -368,6 +414,8 @@ void LLToastAlertPanel::setVisible( BOOL visible )
LLToastAlertPanel::~LLToastAlertPanel()
{
+ LLTransientFloaterMgr::instance().removeControlView(
+ LLTransientFloaterMgr::GLOBAL, this);
}
BOOL LLToastAlertPanel::hasTitleBar() const
diff --git a/indra/newview/lltoastgroupnotifypanel.cpp b/indra/newview/lltoastgroupnotifypanel.cpp
index add61c00cf..7eac3867d5 100644
--- a/indra/newview/lltoastgroupnotifypanel.cpp
+++ b/indra/newview/lltoastgroupnotifypanel.cpp
@@ -133,9 +133,8 @@ LLToastGroupNotifyPanel::LLToastGroupNotifyPanel(LLNotificationPtr& notification
childSetActionTextbox("attachment", boost::bind(
&LLToastGroupNotifyPanel::onClickAttachment, this));
- LLUIImagePtr attachIconImg = get_item_icon(mInventoryOffer->mType,
- LLInventoryType::IT_TEXTURE,
- 0, FALSE);
+ LLUIImagePtr attachIconImg = LLInventoryIcon::getIcon(mInventoryOffer->mType,
+ LLInventoryType::IT_TEXTURE);
pAttachIcon->setValue(attachIconImg->getName());
}
diff --git a/indra/newview/lltoastimpanel.cpp b/indra/newview/lltoastimpanel.cpp
index 7ae2404203..26d3bd5192 100644
--- a/indra/newview/lltoastimpanel.cpp
+++ b/indra/newview/lltoastimpanel.cpp
@@ -66,12 +66,13 @@ LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) : LLToastPanel(p.notif
std::string font_size = LLFontGL::sizeFromFont(fontp);
style_params.font.name(font_name);
style_params.font.size(font_size);
- style_params.font.style = "UNDERLINE";
+
//Handle IRC styled /me messages.
std::string prefix = p.message.substr(0, 4);
if (prefix == "/me " || prefix == "/me'")
{
+ //style_params.font.style = "UNDERLINE";
mMessage->clear();
style_params.font.style ="ITALIC";
@@ -82,7 +83,8 @@ LLToastIMPanel::LLToastIMPanel(LLToastIMPanel::Params &p) : LLToastPanel(p.notif
}
else
{
- mMessage->setValue(p.message);
+ style_params.font.style = "NORMAL";
+ mMessage->setText(p.message, style_params);
}
mAvatarName->setValue(p.from);
@@ -141,32 +143,6 @@ BOOL LLToastIMPanel::handleToolTip(S32 x, S32 y, MASK mask)
return LLToastPanel::handleToolTip(x, y, mask);
}
-void LLToastIMPanel::showInspector()
-{
- LLIMModel::LLIMSession* im_session = LLIMModel::getInstance()->findIMSession(mSessionID);
- if(!im_session)
- {
- llwarns << "Invalid IM session" << llendl;
- return;
- }
-
- switch(im_session->mSessionType)
- {
- case LLIMModel::LLIMSession::P2P_SESSION:
- LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", mAvatarID));
- break;
- case LLIMModel::LLIMSession::GROUP_SESSION:
- LLFloaterReg::showInstance("inspect_group", LLSD().with("group_id", mSessionID));
- break;
- case LLIMModel::LLIMSession::ADHOC_SESSION:
- LLFloaterReg::showInstance("inspect_avatar", LLSD().with("avatar_id", im_session->mOtherParticipantID));
- break;
- default:
- llwarns << "Unknown IM session type" << llendl;
- break;
- }
-}
-
void LLToastIMPanel::spawnNameToolTip()
{
// Spawn at right side of the name textbox.
@@ -176,7 +152,7 @@ void LLToastIMPanel::spawnNameToolTip()
LLToolTip::Params params;
params.background_visible(false);
- params.click_callback(boost::bind(&LLToastIMPanel::showInspector, this));
+ params.click_callback(boost::bind(&LLFloaterReg::showInstance, "inspect_avatar", LLSD().with("avatar_id", mAvatarID), FALSE));
params.delay_time(0.0f); // spawn instantly on hover
params.image(LLUI::getUIImage("Info_Small"));
params.message("");
@@ -201,7 +177,7 @@ void LLToastIMPanel::spawnGroupIconToolTip()
LLInspector::Params params;
params.fillFrom(LLUICtrlFactory::instance().getDefaultParams<LLInspector>());
- params.click_callback(boost::bind(&LLToastIMPanel::showInspector, this));
+ params.click_callback(boost::bind(&LLFloaterReg::showInstance, "inspect_group", LLSD().with("group_id", mSessionID), FALSE));
params.delay_time(0.100f);
params.image(LLUI::getUIImage("Info_Small"));
params.message(g_data.mName);
@@ -214,16 +190,15 @@ void LLToastIMPanel::spawnGroupIconToolTip()
void LLToastIMPanel::initIcon()
{
- LLIconCtrl* sys_msg_icon = getChild<LLIconCtrl>("sys_msg_icon");
-
mAvatarIcon->setVisible(FALSE);
mGroupIcon->setVisible(FALSE);
- sys_msg_icon->setVisible(FALSE);
mAdhocIcon->setVisible(FALSE);
if(mAvatarName->getValue().asString() == SYSTEM_FROM)
{
- sys_msg_icon->setVisible(TRUE);
+ // "sys_msg_icon" was disabled by Erica in the changeset: 5109 (85181bc92cbe)
+ // and "dummy widget" warnings appeared in log.
+ // It does not make sense to have such image with empty name. Removed for EXT-5057.
}
else
{
diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp
index 4d741456c4..38f67720b7 100644
--- a/indra/newview/lltoastnotifypanel.cpp
+++ b/indra/newview/lltoastnotifypanel.cpp
@@ -44,24 +44,34 @@
#include "llrect.h"
#include "lltrans.h"
#include "llnotificationsutil.h"
+#include "llviewermessage.h"
+#include "llimfloater.h"
const S32 BOTTOM_PAD = VPAD * 3;
+const S32 IGNORE_BTN_TOP_DELTA = 3*VPAD;//additional ignore_btn padding
S32 BUTTON_WIDTH = 90;
//static
const LLFontGL* LLToastNotifyPanel::sFont = NULL;
const LLFontGL* LLToastNotifyPanel::sFontSmall = NULL;
-LLToastNotifyPanel::LLToastNotifyPanel(LLNotificationPtr& notification) :
+LLToastNotifyPanel::button_click_signal_t LLToastNotifyPanel::sButtonClickSignal;
+
+LLToastNotifyPanel::LLToastNotifyPanel(LLNotificationPtr& notification, const LLRect& rect) :
LLToastPanel(notification),
mTextBox(NULL),
mInfoPanel(NULL),
mControlPanel(NULL),
mNumOptions(0),
mNumButtons(0),
-mAddedDefaultBtn(false)
+mAddedDefaultBtn(false),
+mCloseNotificationOnDestroy(true)
{
LLUICtrlFactory::getInstance()->buildPanel(this, "panel_notification.xml");
+ if(rect != LLRect::null)
+ {
+ this->setShape(rect);
+ }
mInfoPanel = getChild<LLPanel>("info_panel");
mControlPanel = getChild<LLPanel>("control_panel");
BUTTON_WIDTH = gSavedSettings.getS32("ToastButtonWidth");
@@ -127,14 +137,6 @@ mAddedDefaultBtn(false)
{
std::vector<index_button_pair_t> buttons;
buttons.reserve(mNumOptions);
- for (S32 i = 0; i < mNumOptions; i++)
- {
- LLSD form_element = form->getElement(i);
- if (form_element["type"].asString() != "button")
- {
- continue;
- }
- }
S32 buttons_width = 0;
// create all buttons and accumulate they total width to reshape mControlPanel
for (S32 i = 0; i < mNumOptions; i++)
@@ -155,27 +157,66 @@ mAddedDefaultBtn(false)
}
else
{
- //try get an average left_pad to spread out buttons
- S32 left_pad = (getRect().getWidth() - buttons_width) / (S32(buttons.size() + 1));
- // left_pad can be < 2*HPAD if we have a lot of buttons.
- if(left_pad < 2*HPAD)
+ const S32 button_panel_width = mControlPanel->getRect().getWidth();// do not change width of the panel
+ S32 button_panel_height = mControlPanel->getRect().getHeight();
+ //try get an average h_pad to spread out buttons
+ S32 h_pad = (button_panel_width - buttons_width) / (S32(buttons.size()));
+ if(h_pad < 2*HPAD)
+ {
+ /*
+ * Probably it is a scriptdialog toast
+ * for a scriptdialog toast h_pad can be < 2*HPAD if we have a lot of buttons.
+ * In last case set default h_pad to avoid heaping of buttons
+ */
+ S32 button_per_row = button_panel_width / BUTTON_WIDTH;
+ h_pad = (button_panel_width % BUTTON_WIDTH) / (button_per_row - 1);// -1 because we do not need space after last button in a row
+ if(h_pad < 2*HPAD) // still not enough space between buttons ?
+ {
+ h_pad = 2*HPAD;
+ }
+ }
+ if (mIsScriptDialog)
{
- //Probably it is a scriptdialog toast, set default left_pad
- left_pad = 2*HPAD;
+ // we are using default width for script buttons so we can determinate button_rows
+ //to get a number of rows we divide the required width of the buttons to button_panel_width
+ S32 button_rows = llceil(F32(buttons.size() - 1) * (BUTTON_WIDTH + h_pad) / button_panel_width);
+ //S32 button_rows = (buttons.size() - 1) * (BUTTON_WIDTH + h_pad) / button_panel_width;
+ //reserve one row for the ignore_btn
+ button_rows++;
+ //calculate required panel height for scripdialog notification.
+ button_panel_height = button_rows * (BTN_HEIGHT + VPAD) + IGNORE_BTN_TOP_DELTA + BOTTOM_PAD;
}
- //how many rows we need to fit all buttons with current width of the panel
- S32 button_rows = (buttons_width + left_pad * S32(buttons.size() + 1)) / getRect().getWidth() + 1;
- //calculate required panel height
- S32 button_panel_height = button_rows *( BTN_HEIGHT + VPAD) + BOTTOM_PAD;
-
- adjustPanelForScriptNotice(getRect().getWidth(), button_panel_height);
- //we begin from lefttop angle and go to rightbottom.
- updateButtonsLayout(buttons, left_pad, button_panel_height);
+ else
+ {
+ // in common case buttons can have different widths so we need to calculate button_rows according to buttons_width
+ //S32 button_rows = llceil(F32(buttons.size()) * (buttons_width + h_pad) / button_panel_width);
+ S32 button_rows = llceil(F32((buttons.size() - 1) * h_pad + buttons_width) / button_panel_width);
+ //calculate required panel height
+ button_panel_height = button_rows * (BTN_HEIGHT + VPAD) + BOTTOM_PAD;
+ }
+
+ // we need to keep min width and max height to make visible all buttons, because width of the toast can not be changed
+ adjustPanelForScriptNotice(button_panel_width, button_panel_height);
+ updateButtonsLayout(buttons, h_pad);
+ // save buttons for later use in disableButtons()
+ mButtons.assign(buttons.begin(), buttons.end());
}
}
// adjust panel's height to the text size
mInfoPanel->setFollowsAll();
snapToMessageHeight(mTextBox, MAX_LENGTH);
+
+ if(notification->isReusable())
+ {
+ mButtonClickConnection = sButtonClickSignal.connect(
+ boost::bind(&LLToastNotifyPanel::onToastPanelButtonClicked, this, _1, _2));
+
+ if(notification->isRespondedTo())
+ {
+ // User selected an option in toast, now disable required buttons in IM window
+ disableRespondedOptions(notification);
+ }
+ }
}
void LLToastNotifyPanel::addDefaultButton()
{
@@ -202,7 +243,8 @@ LLButton* LLToastNotifyPanel::createButton(const LLSD& form_element, BOOL is_opt
mBtnCallbackData.push_back(userdata);
LLButton::Params p;
- const LLFontGL* font = form_element["index"].asInteger() == -1 ? sFontSmall: sFont; // for ignore button in script dialog
+ bool is_ignore_btn = form_element["index"].asInteger() == -1;
+ const LLFontGL* font = is_ignore_btn ? sFontSmall: sFont; // for ignore button in script dialog
p.name(form_element["name"].asString());
p.label(form_element["text"].asString());
p.font(font);
@@ -210,18 +252,25 @@ LLButton* LLToastNotifyPanel::createButton(const LLSD& form_element, BOOL is_opt
p.click_callback.function(boost::bind(&LLToastNotifyPanel::onClickButton, userdata));
p.rect.width = BUTTON_WIDTH;
p.auto_resize = false;
- p.follows.flags(FOLLOWS_RIGHT | FOLLOWS_LEFT | FOLLOWS_BOTTOM);
+ p.follows.flags(FOLLOWS_LEFT | FOLLOWS_BOTTOM);
if (mIsCaution)
{
p.image_color(LLUIColorTable::instance().getColor("ButtonCautionImageColor"));
p.image_color_disabled(LLUIColorTable::instance().getColor("ButtonCautionImageColor"));
}
+ // for the scriptdialog buttons we use fixed button size. This is a limit!
if (!mIsScriptDialog && font->getWidth(form_element["text"].asString()) > BUTTON_WIDTH)
{
p.rect.width = 1;
p.auto_resize = true;
}
-
+ else if (mIsScriptDialog && is_ignore_btn)
+ {
+ // this is ignore button,make it smaller
+ p.rect.height = BTN_HEIGHT_SMALL;
+ p.rect.width = 1;
+ p.auto_resize = true;
+ }
LLButton* btn = LLUICtrlFactory::create<LLButton>(p);
mNumButtons++;
btn->autoResize();
@@ -235,44 +284,61 @@ LLButton* LLToastNotifyPanel::createButton(const LLSD& form_element, BOOL is_opt
LLToastNotifyPanel::~LLToastNotifyPanel()
{
+ mButtonClickConnection.disconnect();
+
std::for_each(mBtnCallbackData.begin(), mBtnCallbackData.end(), DeletePointer());
- if (LLNotificationsUtil::find(mNotification->getID()) != NULL)
+ if (mCloseNotificationOnDestroy && LLNotificationsUtil::find(mNotification->getID()) != NULL)
{
- LLNotifications::getInstance()->cancel(mNotification);
+ // let reusable notification be deleted
+ mNotification->setReusable(false);
+ if (!mNotification->isPersistent())
+ {
+ LLNotifications::getInstance()->cancel(mNotification);
+ }
}
}
-void LLToastNotifyPanel::updateButtonsLayout(const std::vector<index_button_pair_t>& buttons, S32 left_pad, S32 top)
+
+void LLToastNotifyPanel::updateButtonsLayout(const std::vector<index_button_pair_t>& buttons, S32 h_pad)
{
- S32 left = left_pad;
+ S32 left = 0;
+ //reserve place for ignore button
+ S32 bottom_offset = mIsScriptDialog ? (BTN_HEIGHT + IGNORE_BTN_TOP_DELTA + BOTTOM_PAD) : BOTTOM_PAD;
+ S32 max_width = mControlPanel->getRect().getWidth();
LLButton* ignore_btn = NULL;
for (std::vector<index_button_pair_t>::const_iterator it = buttons.begin(); it != buttons.end(); it++)
{
- if(left + it->second->getRect().getWidth() + 2*HPAD > getRect().getWidth())
- {
- // looks like we need to add button to the next row
- left = left_pad;
- top-= (BTN_HEIGHT + VPAD);
- }
- LLRect btn_rect(it->second->getRect());
- if(mIsScriptDialog && it->first == -1)
+ if (it->first == -1)
{
- //this is ignore button ( index == -1) we need to add it into new extra row at the end
ignore_btn = it->second;
continue;
}
- btn_rect.setLeftTopAndSize(left, top, btn_rect.getWidth(), btn_rect.getHeight());
- it->second->setRect(btn_rect);
- left = btn_rect.mLeft + btn_rect.getWidth() + left_pad;
- addChild(it->second, -1);
+ LLButton* btn = it->second;
+ LLRect btn_rect(btn->getRect());
+ if (left + btn_rect.getWidth() > max_width)// whether there is still some place for button+h_pad in the mControlPanel
+ {
+ // looks like we need to add button to the next row
+ left = 0;
+ bottom_offset += (BTN_HEIGHT + VPAD);
+ }
+ //we arrange buttons from bottom to top for backward support of old script
+ btn_rect.setOriginAndSize(left, bottom_offset, btn_rect.getWidth(), btn_rect.getHeight());
+ btn->setRect(btn_rect);
+ left = btn_rect.mLeft + btn_rect.getWidth() + h_pad;
+ mControlPanel->addChild(btn, -1);
}
- if(ignore_btn)
+ if (mIsScriptDialog && ignore_btn != NULL)
{
- LLRect btn_rect(ignore_btn->getRect());
- btn_rect.setOriginAndSize(getRect().getWidth() - btn_rect.getWidth() - left_pad,
- BOTTOM_PAD,// move button at the bottom edge
- btn_rect.getWidth(), btn_rect.getHeight());
- ignore_btn->setRect(btn_rect);
- addChild(ignore_btn, -1);
+ LLRect ignore_btn_rect(ignore_btn->getRect());
+ S32 buttons_per_row = max_width / BUTTON_WIDTH; //assume that h_pad far less than BUTTON_WIDTH
+ S32 ignore_btn_left = buttons_per_row * BUTTON_WIDTH + (buttons_per_row - 1) * h_pad - ignore_btn_rect.getWidth();
+ if (ignore_btn_left + ignore_btn_rect.getWidth() > max_width)// make sure that the ignore button is in panel
+ {
+ ignore_btn_left = max_width - ignore_btn_rect.getWidth() - 2 * HPAD;
+ }
+ ignore_btn_rect.setOriginAndSize(ignore_btn_left, BOTTOM_PAD,// always move ignore button at the bottom
+ ignore_btn_rect.getWidth(), ignore_btn_rect.getHeight());
+ ignore_btn->setRect(ignore_btn_rect);
+ mControlPanel->addChild(ignore_btn, -1);
}
}
@@ -280,20 +346,124 @@ void LLToastNotifyPanel::adjustPanelForScriptNotice(S32 button_panel_width, S32
{
//adjust layout
// we need to keep min width and max height to make visible all buttons, because width of the toast can not be changed
- LLRect button_rect = mControlPanel->getRect();
reshape(getRect().getWidth(), mInfoPanel->getRect().getHeight() + button_panel_height + VPAD);
- button_rect.set(0, button_rect.mBottom + button_panel_height, button_rect.getWidth(), button_rect.mBottom);
- mControlPanel->reshape(button_rect.getWidth(), button_panel_height);
- mControlPanel->setRect(button_rect);
+ mControlPanel->reshape( button_panel_width, button_panel_height);
}
void LLToastNotifyPanel::adjustPanelForTipNotice()
{
LLRect info_rect = mInfoPanel->getRect();
LLRect this_rect = getRect();
-
+ //we don't need display ControlPanel for tips because they doesn't contain any buttons.
mControlPanel->setVisible(FALSE);
reshape(getRect().getWidth(), mInfoPanel->getRect().getHeight());
+
+ if (mNotification->getPayload().has("respond_on_mousedown")
+ && mNotification->getPayload()["respond_on_mousedown"] )
+ {
+ mInfoPanel->setMouseDownCallback(
+ boost::bind(&LLNotification::respond,
+ mNotification,
+ mNotification->getResponseTemplate()));
+ }
+}
+
+typedef std::set<std::string> button_name_set_t;
+typedef std::map<std::string, button_name_set_t> disable_button_map_t;
+
+disable_button_map_t initUserGiveItemDisableButtonMap()
+{
+ // see EXT-5905 for disable rules
+
+ disable_button_map_t disable_map;
+ button_name_set_t buttons;
+
+ buttons.insert("Show");
+ disable_map.insert(std::make_pair("Show", buttons));
+
+ buttons.insert("Discard");
+ disable_map.insert(std::make_pair("Discard", buttons));
+
+ buttons.insert("Mute");
+ disable_map.insert(std::make_pair("Mute", buttons));
+
+ return disable_map;
+}
+
+disable_button_map_t initTeleportOfferedDisableButtonMap()
+{
+ disable_button_map_t disable_map;
+ button_name_set_t buttons;
+
+ buttons.insert("Teleport");
+ buttons.insert("Cancel");
+
+ disable_map.insert(std::make_pair("Teleport", buttons));
+ disable_map.insert(std::make_pair("Cancel", buttons));
+
+ return disable_map;
+}
+
+disable_button_map_t initFriendshipOfferedDisableButtonMap()
+{
+ disable_button_map_t disable_map;
+ button_name_set_t buttons;
+
+ buttons.insert("Accept");
+ buttons.insert("Decline");
+
+ disable_map.insert(std::make_pair("Accept", buttons));
+ disable_map.insert(std::make_pair("Decline", buttons));
+
+ return disable_map;
+}
+
+button_name_set_t getButtonDisableList(const std::string& notification_name, const std::string& button_name)
+{
+ static disable_button_map_t user_give_item_disable_map = initUserGiveItemDisableButtonMap();
+ static disable_button_map_t teleport_offered_disable_map = initTeleportOfferedDisableButtonMap();
+ static disable_button_map_t friendship_offered_disable_map = initFriendshipOfferedDisableButtonMap();
+
+ disable_button_map_t::const_iterator it;
+ disable_button_map_t::const_iterator it_end;
+ disable_button_map_t search_map;
+
+ if("UserGiveItem" == notification_name)
+ {
+ search_map = user_give_item_disable_map;
+ }
+ else if("TeleportOffered" == notification_name)
+ {
+ search_map = teleport_offered_disable_map;
+ }
+ else if("OfferFriendship" == notification_name)
+ {
+ search_map = friendship_offered_disable_map;
+ }
+
+ it = search_map.find(button_name);
+ it_end = search_map.end();
+
+ if(it_end != it)
+ {
+ return it->second;
+ }
+ return button_name_set_t();
+}
+
+void LLToastNotifyPanel::disableButtons(const std::string& notification_name, const std::string& selected_button)
+{
+ button_name_set_t buttons = getButtonDisableList(notification_name, selected_button);
+
+ std::vector<index_button_pair_t>::const_iterator it = mButtons.begin();
+ for ( ; it != mButtons.end(); it++)
+ {
+ LLButton* btn = it->second;
+ if(buttons.find(btn->getName()) != buttons.end())
+ {
+ btn->setEnabled(FALSE);
+ }
+ }
}
// static
@@ -308,5 +478,89 @@ void LLToastNotifyPanel::onClickButton(void* data)
{
response[button_name] = true;
}
+
+ bool is_reusable = self->mNotification->isReusable();
+ // When we call respond(), LLOfferInfo will delete itself in inventory_offer_callback(),
+ // lets copy it while it's still valid.
+ LLOfferInfo* old_info = static_cast<LLOfferInfo*>(self->mNotification->getResponder());
+ LLOfferInfo* new_info = NULL;
+ if(is_reusable && old_info)
+ {
+ new_info = new LLOfferInfo(*old_info);
+ self->mNotification->setResponder(new_info);
+ }
+
self->mNotification->respond(response);
+
+ if(is_reusable)
+ {
+ sButtonClickSignal(self->mNotification->getID(), button_name);
+ }
+ else
+ {
+ // disable all buttons
+ self->mControlPanel->setEnabled(FALSE);
+ }
+}
+
+void LLToastNotifyPanel::onToastPanelButtonClicked(const LLUUID& notification_id, const std::string btn_name)
+{
+ if(mNotification->getID() == notification_id)
+ {
+ disableButtons(mNotification->getName(), btn_name);
+ }
+}
+
+void LLToastNotifyPanel::disableRespondedOptions(LLNotificationPtr& notification)
+{
+ LLSD response = notification->getResponse();
+ for (LLSD::map_const_iterator response_it = response.beginMap();
+ response_it != response.endMap(); ++response_it)
+ {
+ if (response_it->second.isBoolean() && response_it->second.asBoolean())
+ {
+ // that after multiple responses there can be many pressed buttons
+ // need to process them all
+ disableButtons(notification->getName(), response_it->first);
+ }
+ }
+}
+
+
+//////////////////////////////////////////////////////////////////////////
+
+LLIMToastNotifyPanel::LLIMToastNotifyPanel(LLNotificationPtr& pNotification, const LLUUID& session_id, const LLRect& rect /* = LLRect::null */)
+ : mSessionID(session_id), LLToastNotifyPanel(pNotification, rect)
+{
+ mTextBox->setFollowsAll();
}
+
+LLIMToastNotifyPanel::~LLIMToastNotifyPanel()
+{
+ // We shouldn't delete notification when IM floater exists
+ // since that notification will be reused by IM floater.
+ // This may happened when IM floater reloads messages, exactly when user
+ // changes layout of IM chat log(disable/enable plaintext mode).
+ // See EXT-6500
+ LLIMFloater* im_floater = LLIMFloater::findInstance(mSessionID);
+ if (im_floater != NULL && !im_floater->isDead())
+ {
+ mCloseNotificationOnDestroy = false;
+ }
+}
+
+void LLIMToastNotifyPanel::reshape(S32 width, S32 height, BOOL called_from_parent /* = TRUE */)
+{
+ S32 text_height = mTextBox->getTextBoundingRect().getHeight();
+ S32 widget_height = mTextBox->getRect().getHeight();
+ S32 delta = text_height - widget_height;
+ LLRect rc = getRect();
+
+ rc.setLeftTopAndSize(rc.mLeft, rc.mTop, width, height + delta);
+ height = rc.getHeight();
+ width = rc.getWidth();
+
+ LLToastPanel::reshape(width, height, called_from_parent);
+}
+
+// EOF
diff --git a/indra/newview/lltoastnotifypanel.h b/indra/newview/lltoastnotifypanel.h
index 1f50c21f6f..a6644c0a7a 100644
--- a/indra/newview/lltoastnotifypanel.h
+++ b/indra/newview/lltoastnotifypanel.h
@@ -49,13 +49,28 @@ class LLNotificationForm;
* Notification panel should be used for notifications that require a response from the user.
*
* Replaces class LLNotifyBox.
+ *
+ * @deprecated this class will be removed after all toast panel types are
+ * implemented in separate classes.
*/
class LLToastNotifyPanel: public LLToastPanel
{
public:
- LLToastNotifyPanel(LLNotificationPtr&);
+ /**
+ * Constructor for LLToastNotifyPanel.
+ *
+ * @param pNotification a shared pointer to LLNotification
+ * @param rect an initial rectangle of the toast panel.
+ * If it is null then a loaded from xml rectangle will be used.
+ * @see LLNotification
+ * @deprecated if you intend to instantiate LLToastNotifyPanel - it's point to
+ * implement right class for desired toast panel. @see LLGenericTipPanel as example.
+ */
+ LLToastNotifyPanel(LLNotificationPtr& pNotification, const LLRect& rect = LLRect::null);
virtual ~LLToastNotifyPanel();
+ LLPanel * getControlPanel() { return mControlPanel; }
+ void setCloseNotificationOnDestroy(bool close) { mCloseNotificationOnDestroy = close; }
protected:
LLButton* createButton(const LLSD& form_element, BOOL is_option);
@@ -67,13 +82,26 @@ protected:
};
std::vector<InstanceAndS32*> mBtnCallbackData;
-private:
+ bool mCloseNotificationOnDestroy;
typedef std::pair<int,LLButton*> index_button_pair_t;
void adjustPanelForScriptNotice(S32 max_width, S32 max_height);
void adjustPanelForTipNotice();
void addDefaultButton();
- void updateButtonsLayout(const std::vector<index_button_pair_t>& buttons, S32 left_pad, S32 top);
+ /*
+ * It lays out buttons of the notification in mControlPanel.
+ * Buttons will be placed from BOTTOM to TOP.
+ * @param h_pad horizontal space between buttons. It is depend on number of buttons.
+ * @param buttons vector of button to be added.
+ */
+ void updateButtonsLayout(const std::vector<index_button_pair_t>& buttons, S32 h_pad);
+
+ /**
+ * Disable specific button(s) based on notification name and clicked button
+ */
+ void disableButtons(const std::string& notification_name, const std::string& selected_button);
+
+ std::vector<index_button_pair_t> mButtons;
// panel elements
LLTextBase* mTextBox;
@@ -83,6 +111,21 @@ private:
// internal handler for button being clicked
static void onClickButton(void* data);
+ typedef boost::signals2::signal <void (const LLUUID& notification_id, const std::string btn_name)>
+ button_click_signal_t;
+ static button_click_signal_t sButtonClickSignal;
+ boost::signals2::connection mButtonClickConnection;
+
+ /**
+ * handle sButtonClickSignal (to disable buttons) across all panels with given notification_id
+ */
+ void onToastPanelButtonClicked(const LLUUID& notification_id, const std::string btn_name);
+
+ /**
+ * Process response data. Will disable selected options
+ */
+ void disableRespondedOptions(LLNotificationPtr& notification);
+
bool mIsTip;
bool mAddedDefaultBtn;
bool mIsScriptDialog;
@@ -96,4 +139,18 @@ private:
static const LLFontGL* sFontSmall;
};
+class LLIMToastNotifyPanel : public LLToastNotifyPanel
+{
+public:
+
+ LLIMToastNotifyPanel(LLNotificationPtr& pNotification, const LLUUID& session_id, const LLRect& rect = LLRect::null);
+
+ ~LLIMToastNotifyPanel();
+
+ /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE);
+
+protected:
+ LLUUID mSessionID;
+};
+
#endif /* LLTOASTNOTIFYPANEL_H_ */
diff --git a/indra/newview/lltoastpanel.cpp b/indra/newview/lltoastpanel.cpp
index 755e647777..71598b3169 100644
--- a/indra/newview/lltoastpanel.cpp
+++ b/indra/newview/lltoastpanel.cpp
@@ -32,14 +32,15 @@
#include "llviewerprecompiledheaders.h"
-#include "lltoastpanel.h"
-
+#include "llpanelgenerictip.h"
+#include "llpanelonlinestatus.h"
#include "llnotifications.h"
+#include "lltoastpanel.h"
//static
const S32 LLToastPanel::MIN_PANEL_HEIGHT = 40; // VPAD(4)*2 + ICON_HEIGHT(32)
-LLToastPanel::LLToastPanel(LLNotificationPtr& notification)
+LLToastPanel::LLToastPanel(const LLNotificationPtr& notification)
{
mNotification = notification;
}
@@ -91,3 +92,30 @@ void LLToastPanel::snapToMessageHeight(LLTextBase* message, S32 maxLineCount)
}
}
+// static
+LLToastPanel* LLToastPanel::buidPanelFromNotification(
+ const LLNotificationPtr& notification)
+{
+ LLToastPanel* res = NULL;
+
+ //process tip toast panels
+ if ("notifytip" == notification->getType())
+ {
+ // if it is online/offline notification
+ if ("FriendOffline" == notification->getName() || "FriendOnline" == notification->getName())
+ {
+ res = new LLPanelOnlineStatus(notification);
+ }
+ // in all other case we use generic tip panel
+ else
+ {
+ res = new LLPanelGenericTip(notification);
+ }
+ }
+ /*
+ else if(...)
+ create all other specific non-public toast panel
+ */
+
+ return res;
+}
diff --git a/indra/newview/lltoastpanel.h b/indra/newview/lltoastpanel.h
index f1dd7d7a86..54243e52fa 100644
--- a/indra/newview/lltoastpanel.h
+++ b/indra/newview/lltoastpanel.h
@@ -53,13 +53,21 @@ public:
*/
class LLToastPanel: public LLPanel {
public:
- LLToastPanel(LLNotificationPtr&);
+ LLToastPanel(const LLNotificationPtr&);
virtual ~LLToastPanel() = 0;
virtual std::string getTitle();
virtual const LLUUID& getID();
static const S32 MIN_PANEL_HEIGHT;
+
+ /**
+ * Builder method for constructing notification specific panels.
+ * Normally type of created panels shouldn't be publicated and should be hidden
+ * from other functionality.
+ */
+ static LLToastPanel* buidPanelFromNotification(
+ const LLNotificationPtr& notification);
protected:
LLNotificationPtr mNotification;
void snapToMessageHeight(LLTextBase* message, S32 maxLineCount);
diff --git a/indra/newview/lltoolbar.cpp b/indra/newview/lltoolbar.cpp
index 404eab9249..d45915499a 100644
--- a/indra/newview/lltoolbar.cpp
+++ b/indra/newview/lltoolbar.cpp
@@ -212,23 +212,16 @@ void LLToolBar::layoutButtons()
// this function may be called before postBuild(), in which case mResizeHandle won't have been set up yet.
if(mResizeHandle != NULL)
{
- if(!gViewerWindow->getWindow()->getFullscreen())
- {
- // Only when running in windowed mode on the Mac, leave room for a resize widget on the right edge of the bar.
- width -= RESIZE_HANDLE_WIDTH;
-
- LLRect r;
- r.mLeft = width - pad;
- r.mBottom = 0;
- r.mRight = r.mLeft + RESIZE_HANDLE_WIDTH;
- r.mTop = r.mBottom + RESIZE_HANDLE_HEIGHT;
- mResizeHandle->setRect(r);
- mResizeHandle->setVisible(TRUE);
- }
- else
- {
- mResizeHandle->setVisible(FALSE);
- }
+ // Only when running in windowed mode on the Mac, leave room for a resize widget on the right edge of the bar.
+ width -= RESIZE_HANDLE_WIDTH;
+
+ LLRect r;
+ r.mLeft = width - pad;
+ r.mBottom = 0;
+ r.mRight = r.mLeft + RESIZE_HANDLE_WIDTH;
+ r.mTop = r.mBottom + RESIZE_HANDLE_HEIGHT;
+ mResizeHandle->setRect(r);
+ mResizeHandle->setVisible(TRUE);
}
#endif // LL_DARWIN
}
diff --git a/indra/newview/lltoolcomp.cpp b/indra/newview/lltoolcomp.cpp
index fff18df442..d05bfc53e5 100644
--- a/indra/newview/lltoolcomp.cpp
+++ b/indra/newview/lltoolcomp.cpp
@@ -54,6 +54,7 @@
#include "llviewerobject.h"
#include "llviewerwindow.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llfloatertools.h"
#include "llviewercontrol.h"
@@ -784,7 +785,7 @@ BOOL LLToolCompGun::handleScrollWheel(S32 x, S32 y, S32 clicks)
{
if (clicks > 0)
{
- gAgent.changeCameraToDefault();
+ gAgentCamera.changeCameraToDefault();
}
return TRUE;
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index 125c62474e..c862c02b82 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -37,7 +37,7 @@
#include "llnotificationsutil.h"
// project headers
#include "llagent.h"
-#include "llagentui.h"
+#include "llagentcamera.h"
#include "llagentwearables.h"
#include "llappearancemgr.h"
#include "lldictionary.h"
@@ -45,29 +45,26 @@
#include "llfloaterreg.h"
#include "llfloatertools.h"
#include "llgesturemgr.h"
+#include "llgiveinventory.h"
#include "llhudmanager.h"
#include "llhudeffecttrail.h"
#include "llimview.h"
#include "llinventorybridge.h"
-#include "llmutelist.h"
+#include "llinventorydefines.h"
+#include "llinventoryfunctions.h"
#include "llpreviewnotecard.h"
-#include "llrecentpeople.h"
#include "llrootview.h"
#include "llselectmgr.h"
#include "lltoolmgr.h"
#include "lltooltip.h"
#include "lltrans.h"
#include "llviewerobjectlist.h"
+#include "llviewerregion.h"
#include "llviewerstats.h"
#include "llviewerwindow.h"
#include "llvoavatarself.h"
#include "llworld.h"
-// MAX ITEMS is based on (sizeof(uuid)+2) * count must be < MTUBYTES
-// or 18 * count < 1200 => count < 1200/18 => 66. I've cut it down a
-// bit from there to give some pad.
-const S32 MAX_ITEMS = 42;
-
// syntactic sugar
#define callMemberFunction(object,ptrToMember) ((object).*(ptrToMember))
@@ -79,7 +76,7 @@ public:
virtual bool operator()(LLInventoryCategory* cat,
LLInventoryItem* item)
{
- if(cat && (cat->getPreferredType() == LLFolderType::FT_NONE))
+ if (cat && (cat->getPreferredType() == LLFolderType::FT_NONE))
{
return true;
}
@@ -95,8 +92,8 @@ public:
virtual bool operator()(LLInventoryCategory* cat,
LLInventoryItem* item)
{
- if(item) return true;
- if(cat && (cat->getPreferredType() == LLFolderType::FT_NONE))
+ if (item) return true;
+ if (cat && (cat->getPreferredType() == LLFolderType::FT_NONE))
{
return true;
}
@@ -123,18 +120,18 @@ bool LLDroppableItem::operator()(LLInventoryCategory* cat,
LLInventoryItem* item)
{
bool allowed = false;
- if(item)
+ if (item)
{
allowed = itemTransferCommonlyAllowed(item);
- if(allowed
+ if (allowed
&& mIsTransfer
&& !item->getPermissions().allowOperationBy(PERM_TRANSFER,
gAgent.getID()))
{
allowed = false;
}
- if(allowed && !item->getPermissions().allowCopyBy(gAgent.getID()))
+ if (allowed && !item->getPermissions().allowCopyBy(gAgent.getID()))
{
++mCountLosing;
}
@@ -142,29 +139,6 @@ bool LLDroppableItem::operator()(LLInventoryCategory* cat,
return allowed;
}
-class LLUncopyableItems : public LLInventoryCollectFunctor
-{
-public:
- LLUncopyableItems() {}
- virtual ~LLUncopyableItems() {}
- virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item);
-};
-
-bool LLUncopyableItems::operator()(LLInventoryCategory* cat,
- LLInventoryItem* item)
-{
- bool uncopyable = false;
- if(item)
- {
- if (itemTransferCommonlyAllowed(item) &&
- !item->getPermissions().allowCopyBy(gAgent.getID()))
- {
- uncopyable = true;
- }
- }
- return uncopyable;
-}
-
class LLDropCopyableItems : public LLInventoryCollectFunctor
{
public:
@@ -179,10 +153,10 @@ bool LLDropCopyableItems::operator()(
LLInventoryItem* item)
{
bool allowed = false;
- if(item)
+ if (item)
{
allowed = itemTransferCommonlyAllowed(item);
- if(allowed &&
+ if (allowed &&
!item->getPermissions().allowCopyBy(gAgent.getID()))
{
// whoops, can't copy it - don't allow it.
@@ -192,47 +166,16 @@ bool LLDropCopyableItems::operator()(
return allowed;
}
-class LLGiveable : public LLInventoryCollectFunctor
-{
-public:
- LLGiveable() : mCountLosing(0) {}
- virtual ~LLGiveable() {}
- virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item);
-
- S32 countNoCopy() const { return mCountLosing; }
-protected:
- S32 mCountLosing;
-};
-
-bool LLGiveable::operator()(LLInventoryCategory* cat, LLInventoryItem* item)
-{
- // All categories can be given.
- if (cat)
- return true;
-
- bool allowed = false;
- if(item)
- {
- allowed = itemTransferCommonlyAllowed(item);
- if(allowed &&
- !item->getPermissions().allowOperationBy(PERM_TRANSFER,
- gAgent.getID()))
- {
- allowed = FALSE;
- }
- if(allowed &&
- !item->getPermissions().allowCopyBy(gAgent.getID()))
- {
- ++mCountLosing;
- }
- }
- return allowed;
-}
-
+// Starts a fetch on folders and items. This is really not used
+// as an observer in the traditional sense; we're just using it to
+// request a fetch and we don't care about when/if the response arrives.
class LLCategoryFireAndForget : public LLInventoryFetchComboObserver
{
public:
- LLCategoryFireAndForget() {}
+ LLCategoryFireAndForget(const uuid_vec_t& folder_ids,
+ const uuid_vec_t& item_ids) :
+ LLInventoryFetchComboObserver(folder_ids, item_ids)
+ {}
~LLCategoryFireAndForget() {}
virtual void done()
{
@@ -241,11 +184,13 @@ public:
}
};
-class LLCategoryDropObserver : public LLInventoryFetchObserver
+class LLCategoryDropObserver : public LLInventoryFetchItemsObserver
{
public:
LLCategoryDropObserver(
+ const uuid_vec_t& ids,
const LLUUID& obj_id, LLToolDragAndDrop::ESource src) :
+ LLInventoryFetchItemsObserver(ids),
mObjectID(obj_id),
mSource(src)
{}
@@ -261,16 +206,16 @@ void LLCategoryDropObserver::done()
{
gInventory.removeObserver(this);
LLViewerObject* dst_obj = gObjectList.findObject(mObjectID);
- if(dst_obj)
+ if (dst_obj)
{
// *FIX: coalesce these...
LLInventoryItem* item = NULL;
- item_ref_t::iterator it = mComplete.begin();
- item_ref_t::iterator end = mComplete.end();
+ uuid_vec_t::iterator it = mComplete.begin();
+ uuid_vec_t::iterator end = mComplete.end();
for(; it < end; ++it)
{
item = gInventory.getItem(*it);
- if(item)
+ if (item)
{
LLToolDragAndDrop::dropInventory(
dst_obj,
@@ -282,7 +227,7 @@ void LLCategoryDropObserver::done()
}
delete this;
}
-
+/* Doesn't seem to be used anymore.
class LLCategoryDropDescendentsObserver : public LLInventoryFetchDescendentsObserver
{
public:
@@ -303,8 +248,8 @@ void LLCategoryDropDescendentsObserver::done()
{
gInventory.removeObserver(this);
- folder_ref_t::iterator it = mCompleteFolders.begin();
- folder_ref_t::iterator end = mCompleteFolders.end();
+ uuid_vec_t::iterator it = mComplete.begin();
+ uuid_vec_t::iterator end = mComplete.end();
LLViewerInventoryCategory::cat_array_t cats;
LLViewerInventoryItem::item_array_t items;
for(; it != end; ++it)
@@ -317,20 +262,20 @@ void LLCategoryDropDescendentsObserver::done()
}
S32 count = items.count();
- if(count)
+ if (count)
{
std::set<LLUUID> unique_ids;
for(S32 i = 0; i < count; ++i)
{
unique_ids.insert(items.get(i)->getUUID());
}
- LLInventoryFetchObserver::item_ref_t ids;
- std::back_insert_iterator<LLInventoryFetchObserver::item_ref_t> copier(ids);
+ uuid_vec_t ids;
+ std::back_insert_iterator<uuid_vec_t> copier(ids);
std::copy(unique_ids.begin(), unique_ids.end(), copier);
LLCategoryDropObserver* dropper;
- dropper = new LLCategoryDropObserver(mObjectID, mSource);
- dropper->fetchItems(ids);
- if(dropper->isEverythingComplete())
+ dropper = new LLCategoryDropObserver(ids, mObjectID, mSource);
+ dropper->startFetch();
+ if (dropper->isDone())
{
dropper->done();
}
@@ -341,6 +286,7 @@ void LLCategoryDropDescendentsObserver::done()
}
delete this;
}
+*/
LLToolDragAndDrop::DragAndDropEntry::DragAndDropEntry(dragOrDrop3dImpl f_none,
dragOrDrop3dImpl f_self,
@@ -410,9 +356,12 @@ void LLToolDragAndDrop::setDragStart(S32 x, S32 y)
BOOL LLToolDragAndDrop::isOverThreshold(S32 x,S32 y)
{
- const S32 MIN_MANHATTAN_DIST = 3;
- S32 manhattan_dist = llabs( x - mDragStartX ) + llabs( y - mDragStartY );
- return manhattan_dist >= MIN_MANHATTAN_DIST;
+ static LLCachedControl<S32> drag_and_drop_threshold(gSavedSettings,"DragAndDropDistanceThreshold");
+
+ S32 mouse_delta_x = x - mDragStartX;
+ S32 mouse_delta_y = y - mDragStartY;
+
+ return (mouse_delta_x * mouse_delta_x) + (mouse_delta_y * mouse_delta_y) > drag_and_drop_threshold * drag_and_drop_threshold;
}
void LLToolDragAndDrop::beginDrag(EDragAndDropType type,
@@ -421,7 +370,7 @@ void LLToolDragAndDrop::beginDrag(EDragAndDropType type,
const LLUUID& source_id,
const LLUUID& object_id)
{
- if(type == DAD_NONE)
+ if (type == DAD_NONE)
{
llwarns << "Attempted to start drag without a cargo type" << llendl;
return;
@@ -437,24 +386,24 @@ void LLToolDragAndDrop::beginDrag(EDragAndDropType type,
setMouseCapture( TRUE );
LLToolMgr::getInstance()->setTransientTool( this );
mCursor = UI_CURSOR_NO;
- if((mCargoTypes[0] == DAD_CATEGORY)
+ if ((mCargoTypes[0] == DAD_CATEGORY)
&& ((mSource == SOURCE_AGENT) || (mSource == SOURCE_LIBRARY)))
{
LLInventoryCategory* cat = gInventory.getCategory(cargo_id);
// go ahead and fire & forget the descendents if we are not
// dragging a protected folder.
- if(cat)
+ if (cat)
{
LLViewerInventoryCategory::cat_array_t cats;
LLViewerInventoryItem::item_array_t items;
LLNoPreferredTypeOrItem is_not_preferred;
- LLInventoryFetchComboObserver::folder_ref_t folder_ids;
- LLInventoryFetchComboObserver::item_ref_t item_ids;
- if(is_not_preferred(cat, NULL))
+ uuid_vec_t folder_ids;
+ uuid_vec_t item_ids;
+ if (is_not_preferred(cat, NULL))
{
folder_ids.push_back(cargo_id);
}
- gInventory.collectDescendentsIf(
+ gInventory.collectDescendentsIf (
cargo_id,
cats,
items,
@@ -471,10 +420,11 @@ void LLToolDragAndDrop::beginDrag(EDragAndDropType type,
{
item_ids.push_back(items.get(i)->getUUID());
}
- if(!folder_ids.empty() || !item_ids.empty())
+ if (!folder_ids.empty() || !item_ids.empty())
{
- LLCategoryFireAndForget fetcher;
- fetcher.fetch(folder_ids, item_ids);
+ LLCategoryFireAndForget *fetcher = new LLCategoryFireAndForget(folder_ids, item_ids);
+ fetcher->startFetch();
+ delete fetcher;
}
}
}
@@ -482,7 +432,7 @@ void LLToolDragAndDrop::beginDrag(EDragAndDropType type,
void LLToolDragAndDrop::beginMultiDrag(
const std::vector<EDragAndDropType> types,
- const std::vector<LLUUID>& cargo_ids,
+ const uuid_vec_t& cargo_ids,
ESource source,
const LLUUID& source_id)
{
@@ -492,7 +442,7 @@ void LLToolDragAndDrop::beginMultiDrag(
std::vector<EDragAndDropType>::const_iterator types_it;
for (types_it = types.begin(); types_it != types.end(); ++types_it)
{
- if(DAD_NONE == *types_it)
+ if (DAD_NONE == *types_it)
{
llwarns << "Attempted to start drag without a cargo type" << llendl;
return;
@@ -506,7 +456,7 @@ void LLToolDragAndDrop::beginMultiDrag(
setMouseCapture( TRUE );
LLToolMgr::getInstance()->setTransientTool( this );
mCursor = UI_CURSOR_NO;
- if((mSource == SOURCE_AGENT) || (mSource == SOURCE_LIBRARY))
+ if ((mSource == SOURCE_AGENT) || (mSource == SOURCE_LIBRARY))
{
// find categories (i.e. inventory folders) in the cargo.
LLInventoryCategory* cat = NULL;
@@ -515,16 +465,16 @@ void LLToolDragAndDrop::beginMultiDrag(
for(S32 i = 0; i < count; ++i)
{
cat = gInventory.getCategory(cargo_ids[i]);
- if(cat)
+ if (cat)
{
LLViewerInventoryCategory::cat_array_t cats;
LLViewerInventoryItem::item_array_t items;
LLNoPreferredType is_not_preferred;
- if(is_not_preferred(cat, NULL))
+ if (is_not_preferred(cat, NULL))
{
cat_ids.insert(cat->getUUID());
}
- gInventory.collectDescendentsIf(
+ gInventory.collectDescendentsIf (
cat->getUUID(),
cats,
items,
@@ -537,14 +487,13 @@ void LLToolDragAndDrop::beginMultiDrag(
}
}
}
- if(!cat_ids.empty())
+ if (!cat_ids.empty())
{
- LLInventoryFetchComboObserver::folder_ref_t folder_ids;
- LLInventoryFetchComboObserver::item_ref_t item_ids;
- std::back_insert_iterator<LLInventoryFetchDescendentsObserver::folder_ref_t> copier(folder_ids);
+ uuid_vec_t folder_ids;
+ uuid_vec_t item_ids;
+ std::back_insert_iterator<uuid_vec_t> copier(folder_ids);
std::copy(cat_ids.begin(), cat_ids.end(), copier);
- LLCategoryFireAndForget fetcher;
- fetcher.fetch(folder_ids, item_ids);
+ LLCategoryFireAndForget fetcher(folder_ids, item_ids);
}
}
}
@@ -569,7 +518,7 @@ void LLToolDragAndDrop::onMouseCaptureLost()
BOOL LLToolDragAndDrop::handleMouseUp( S32 x, S32 y, MASK mask )
{
- if( hasMouseCapture() )
+ if (hasMouseCapture())
{
EAcceptance acceptance = ACCEPT_NO;
dragOrDrop( x, y, mask, TRUE, &acceptance );
@@ -580,7 +529,7 @@ BOOL LLToolDragAndDrop::handleMouseUp( S32 x, S32 y, MASK mask )
ECursorType LLToolDragAndDrop::acceptanceToCursor( EAcceptance acceptance )
{
- switch( acceptance )
+ switch (acceptance)
{
case ACCEPT_YES_MULTI:
if (mCargoIDs.size() > 1)
@@ -697,7 +646,7 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop,
mToolTipMsg.clear();
- if(top_view)
+ if (top_view)
{
handled = TRUE;
@@ -762,7 +711,7 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop,
}
}
- if(!handled)
+ if (!handled)
{
handled = TRUE;
@@ -820,7 +769,7 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, BOOL drop,
}
}
- if ( !handled )
+ if (!handled)
{
dragOrDrop3D( x, y, mask, drop, acceptance );
}
@@ -873,7 +822,7 @@ void LLToolDragAndDrop::pick(const LLPickInfo& pick_info)
if (hit_obj->isAttachment() && !hit_obj->isHUDAttachment())
{
LLVOAvatar* avatar = LLVOAvatar::findAvatarFromAttachment( hit_obj );
- if( !avatar )
+ if (!avatar)
{
mLastAccept = ACCEPT_NO;
mCursor = UI_CURSOR_NO;
@@ -885,7 +834,7 @@ void LLToolDragAndDrop::pick(const LLPickInfo& pick_info)
if (hit_obj->isAvatar())
{
- if(((LLVOAvatar*) hit_obj)->isSelf())
+ if (((LLVOAvatar*) hit_obj)->isSelf())
{
target = DT_SELF;
hit_face = -1;
@@ -959,7 +908,7 @@ void LLToolDragAndDrop::pick(const LLPickInfo& pick_info)
gViewerWindow->getWindow()->setCursor( cursor );
mLastHitPos = pick_info.mPosGlobal;
- mLastCameraPos = gAgent.getCameraPositionGlobal();
+ mLastCameraPos = gAgentCamera.getCameraPositionGlobal();
}
// static
@@ -971,7 +920,7 @@ BOOL LLToolDragAndDrop::handleDropTextureProtections(LLViewerObject* hit_obj,
// Always succeed if....
// texture is from the library
// or already in the contents of the object
- if(SOURCE_LIBRARY == source)
+ if (SOURCE_LIBRARY == source)
{
// dropping a texture from the library always just works.
return TRUE;
@@ -999,7 +948,7 @@ BOOL LLToolDragAndDrop::handleDropTextureProtections(LLViewerObject* hit_obj,
if (!item) return FALSE;
LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
- if(!item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID()))
+ if (!item->getPermissions().allowOperationBy(PERM_COPY, gAgent.getID()))
{
// Check that we can add the texture as inventory to the object
if (willObjectAcceptInventory(hit_obj,item) < ACCEPT_YES_COPY_SINGLE )
@@ -1007,20 +956,20 @@ BOOL LLToolDragAndDrop::handleDropTextureProtections(LLViewerObject* hit_obj,
return FALSE;
}
// make sure the object has the texture in it's inventory.
- if(SOURCE_AGENT == source)
+ if (SOURCE_AGENT == source)
{
// Remove the texture from local inventory. The server
// will actually remove the item from agent inventory.
gInventory.deleteObject(item->getUUID());
gInventory.notifyObservers();
}
- else if(SOURCE_WORLD == source)
+ else if (SOURCE_WORLD == source)
{
// *FIX: if the objects are in different regions, and the
// source region has crashed, you can bypass these
// permissions.
LLViewerObject* src_obj = gObjectList.findObject(src_id);
- if(src_obj)
+ if (src_obj)
{
src_obj->removeInventory(item->getUUID());
}
@@ -1035,7 +984,7 @@ BOOL LLToolDragAndDrop::handleDropTextureProtections(LLViewerObject* hit_obj,
// TODO: Check to see if adding the item was successful; if not, then
// we should return false here.
}
- else if(!item->getPermissions().allowOperationBy(PERM_TRANSFER,
+ else if (!item->getPermissions().allowOperationBy(PERM_TRANSFER,
gAgent.getID()))
{
// Check that we can add the texture as inventory to the object
@@ -1067,7 +1016,7 @@ void LLToolDragAndDrop::dropTextureAllFaces(LLViewerObject* hit_obj,
}
LLUUID asset_id = item->getAssetUUID();
BOOL success = handleDropTextureProtections(hit_obj, item, source, src_id);
- if(!success)
+ if (!success)
{
return;
}
@@ -1109,7 +1058,7 @@ void LLToolDragAndDrop::dropTextureOneFace(LLViewerObject* hit_obj,
}
LLUUID asset_id = item->getAssetUUID();
BOOL success = handleDropTextureProtections(hit_obj, item, source, src_id);
- if(!success)
+ if (!success)
{
return;
}
@@ -1132,32 +1081,32 @@ void LLToolDragAndDrop::dropScript(LLViewerObject* hit_obj,
{
// *HACK: In order to resolve SL-22177, we need to block drags
// from notecards and objects onto other objects.
- if((SOURCE_WORLD == LLToolDragAndDrop::getInstance()->mSource)
+ if ((SOURCE_WORLD == LLToolDragAndDrop::getInstance()->mSource)
|| (SOURCE_NOTECARD == LLToolDragAndDrop::getInstance()->mSource))
{
llwarns << "Call to LLToolDragAndDrop::dropScript() from world"
<< " or notecard." << llendl;
return;
}
- if(hit_obj && item)
+ if (hit_obj && item)
{
LLPointer<LLViewerInventoryItem> new_script = new LLViewerInventoryItem(item);
- if(!item->getPermissions().allowCopyBy(gAgent.getID()))
+ if (!item->getPermissions().allowCopyBy(gAgent.getID()))
{
- if(SOURCE_AGENT == source)
+ if (SOURCE_AGENT == source)
{
// Remove the script from local inventory. The server
// will actually remove the item from agent inventory.
gInventory.deleteObject(item->getUUID());
gInventory.notifyObservers();
}
- else if(SOURCE_WORLD == source)
+ else if (SOURCE_WORLD == source)
{
// *FIX: if the objects are in different regions, and
// the source region has crashed, you can bypass
// these permissions.
LLViewerObject* src_obj = gObjectList.findObject(src_id);
- if(src_obj)
+ if (src_obj)
{
src_obj->removeInventory(item->getUUID());
}
@@ -1173,7 +1122,7 @@ void LLToolDragAndDrop::dropScript(LLViewerObject* hit_obj,
// VEFFECT: SetScript
LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
- effectp->setSourceObject(gAgent.getAvatarObject());
+ effectp->setSourceObject(gAgentAvatarp);
effectp->setTargetObject(hit_obj);
effectp->setDuration(LL_HUD_DUR_SHORT);
effectp->setColor(LLColor4U(gAgent.getEffectColor()));
@@ -1197,7 +1146,7 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target,
LLViewerInventoryItem* item;
LLViewerInventoryCategory* cat;
locateInventory(item, cat);
- if(!item || !item->isComplete()) return;
+ if (!item || !item->isFinished()) return;
//if (regionp
// && (regionp->getRegionFlags() & REGION_FLAGS_SANDBOX))
@@ -1208,7 +1157,7 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target,
// this will remove the object from inventory after rez. Only
// bother with this check if we would not normally remove from
// inventory.
- if(!remove_from_inventory
+ if (!remove_from_inventory
&& !item->getPermissions().allowCopyBy(gAgent.getID()))
{
remove_from_inventory = TRUE;
@@ -1219,7 +1168,7 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target,
// hitting objects that were clipped by the near plane or culled
// on the viewer.
LLUUID ray_target_id;
- if( raycast_target )
+ if (raycast_target)
{
ray_target_id = raycast_target->getID();
}
@@ -1231,7 +1180,7 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target,
// Check if it's in the trash.
bool is_in_trash = false;
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
+ if (gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
{
is_in_trash = true;
remove_from_inventory = TRUE;
@@ -1289,7 +1238,7 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target,
pack_permissions_slam(msg, item->getFlags(), item->getPermissions());
LLUUID folder_id = item->getParentUUID();
- if((SOURCE_LIBRARY == mSource) || (is_in_trash))
+ if ((SOURCE_LIBRARY == mSource) || (is_in_trash))
{
// since it's coming from the library or trash, we want to not
// 'take' it back to the same place.
@@ -1323,7 +1272,7 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target,
gViewerWindow->getWindow()->incBusyCount();
}
- if(remove_from_inventory)
+ if (remove_from_inventory)
{
// Delete it from inventory immediately so that users cannot
// easily bypass copy protection in laggy situations. If the
@@ -1334,7 +1283,7 @@ void LLToolDragAndDrop::dropObject(LLViewerObject* raycast_target,
// VEFFECT: DropObject
LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
- effectp->setSourceObject(gAgent.getAvatarObject());
+ effectp->setSourceObject(gAgentAvatarp);
effectp->setPositionGlobal(mLastHitPos);
effectp->setDuration(LL_HUD_DUR_SHORT);
effectp->setColor(LLColor4U(gAgent.getEffectColor()));
@@ -1349,7 +1298,7 @@ void LLToolDragAndDrop::dropInventory(LLViewerObject* hit_obj,
{
// *HACK: In order to resolve SL-22177, we need to block drags
// from notecards and objects onto other objects.
- if((SOURCE_WORLD == LLToolDragAndDrop::getInstance()->mSource)
+ if ((SOURCE_WORLD == LLToolDragAndDrop::getInstance()->mSource)
|| (SOURCE_NOTECARD == LLToolDragAndDrop::getInstance()->mSource))
{
llwarns << "Call to LLToolDragAndDrop::dropInventory() from world"
@@ -1361,9 +1310,9 @@ void LLToolDragAndDrop::dropInventory(LLViewerObject* hit_obj,
time_t creation_date = time_corrected();
new_item->setCreationDate(creation_date);
- if(!item->getPermissions().allowCopyBy(gAgent.getID()))
+ if (!item->getPermissions().allowCopyBy(gAgent.getID()))
{
- if(SOURCE_AGENT == source)
+ if (SOURCE_AGENT == source)
{
// Remove the inventory item from local inventory. The
// server will actually remove the item from agent
@@ -1371,13 +1320,13 @@ void LLToolDragAndDrop::dropInventory(LLViewerObject* hit_obj,
gInventory.deleteObject(item->getUUID());
gInventory.notifyObservers();
}
- else if(SOURCE_WORLD == source)
+ else if (SOURCE_WORLD == source)
{
// *FIX: if the objects are in different regions, and the
// source region has crashed, you can bypass these
// permissions.
LLViewerObject* src_obj = gObjectList.findObject(src_id);
- if(src_obj)
+ if (src_obj)
{
src_obj->removeInventory(item->getUUID());
}
@@ -1397,423 +1346,13 @@ void LLToolDragAndDrop::dropInventory(LLViewerObject* hit_obj,
// VEFFECT: AddToInventory
LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
- effectp->setSourceObject(gAgent.getAvatarObject());
+ effectp->setSourceObject(gAgentAvatarp);
effectp->setTargetObject(hit_obj);
effectp->setDuration(LL_HUD_DUR_SHORT);
effectp->setColor(LLColor4U(gAgent.getEffectColor()));
gFloaterTools->dirty();
}
-void LLToolDragAndDrop::giveInventory(const LLUUID& to_agent,
- LLInventoryItem* item,
- const LLUUID& im_session_id)
-
-{
- llinfos << "LLToolDragAndDrop::giveInventory()" << llendl;
- if(!isInventoryGiveAcceptable(item))
- {
- return;
- }
- if(item->getPermissions().allowCopyBy(gAgent.getID()))
- {
- // just give it away.
- LLToolDragAndDrop::commitGiveInventoryItem(to_agent, item, im_session_id);
- }
- else
- {
- // ask if the agent is sure.
- LLSD payload;
- payload["agent_id"] = to_agent;
- payload["item_id"] = item->getUUID();
- LLNotificationsUtil::add("CannotCopyWarning", LLSD(), payload,
- &LLToolDragAndDrop::handleCopyProtectedItem);
- }
-}
-// static
-bool LLToolDragAndDrop::handleCopyProtectedItem(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- LLInventoryItem* item = NULL;
- switch(option)
- {
- case 0: // "Yes"
- item = gInventory.getItem(notification["payload"]["item_id"].asUUID());
- if(item)
- {
- LLToolDragAndDrop::commitGiveInventoryItem(notification["payload"]["agent_id"].asUUID(),
- item);
- // delete it for now - it will be deleted on the server
- // quickly enough.
- gInventory.deleteObject(notification["payload"]["item_id"].asUUID());
- gInventory.notifyObservers();
- }
- else
- {
- LLNotificationsUtil::add("CannotGiveItem");
- }
- break;
-
- default: // no, cancel, whatever, who cares, not yes.
- LLNotificationsUtil::add("TransactionCancelled");
- break;
- }
- return false;
-}
-
-// static
-void LLToolDragAndDrop::commitGiveInventoryItem(const LLUUID& to_agent,
- LLInventoryItem* item,
- const LLUUID& im_session_id)
-{
- if(!item) return;
- std::string name;
- LLAgentUI::buildFullname(name);
- LLUUID transaction_id;
- transaction_id.generate();
- const S32 BUCKET_SIZE = sizeof(U8) + UUID_BYTES;
- U8 bucket[BUCKET_SIZE];
- bucket[0] = (U8)item->getType();
- memcpy(&bucket[1], &(item->getUUID().mData), UUID_BYTES); /* Flawfinder: ignore */
- pack_instant_message(
- gMessageSystem,
- gAgent.getID(),
- FALSE,
- gAgent.getSessionID(),
- to_agent,
- name,
- item->getName(),
- IM_ONLINE,
- IM_INVENTORY_OFFERED,
- transaction_id,
- 0,
- LLUUID::null,
- gAgent.getPositionAgent(),
- NO_TIMESTAMP,
- bucket,
- BUCKET_SIZE);
- gAgent.sendReliableMessage();
-
- // VEFFECT: giveInventory
- LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
- effectp->setSourceObject(gAgent.getAvatarObject());
- effectp->setTargetObject(gObjectList.findObject(to_agent));
- effectp->setDuration(LL_HUD_DUR_SHORT);
- effectp->setColor(LLColor4U(gAgent.getEffectColor()));
- gFloaterTools->dirty();
-
- LLMuteList::getInstance()->autoRemove(to_agent, LLMuteList::AR_INVENTORY);
-
- // If this item was given by drag-and-drop into an IM panel, log this action in the IM panel chat.
- if (im_session_id != LLUUID::null)
- {
- LLSD args;
- gIMMgr->addSystemMessage(im_session_id, "inventory_item_offered", args);
- }
-
- // add buddy to recent people list
- LLRecentPeople::instance().add(to_agent);
-}
-
-void LLToolDragAndDrop::giveInventoryCategory(const LLUUID& to_agent,
- LLInventoryCategory* cat,
- const LLUUID& im_session_id)
-
-{
- if(!cat) return;
- llinfos << "LLToolDragAndDrop::giveInventoryCategory() - "
- << cat->getUUID() << llendl;
-
- LLVOAvatar* my_avatar = gAgent.getAvatarObject();
- if( !my_avatar )
- {
- return;
- }
-
- // Test out how many items are being given.
- LLViewerInventoryCategory::cat_array_t cats;
- LLViewerInventoryItem::item_array_t items;
- LLGiveable giveable;
- gInventory.collectDescendentsIf(cat->getUUID(),
- cats,
- items,
- LLInventoryModel::EXCLUDE_TRASH,
- giveable);
- S32 count = cats.count();
- bool complete = true;
- for(S32 i = 0; i < count; ++i)
- {
- if(!gInventory.isCategoryComplete(cats.get(i)->getUUID()))
- {
- complete = false;
- break;
- }
- }
- if(!complete)
- {
- LLNotificationsUtil::add("IncompleteInventory");
- return;
- }
- count = items.count() + cats.count();
- if(count > MAX_ITEMS)
- {
- LLNotificationsUtil::add("TooManyItems");
- return;
- }
- else if(count == 0)
- {
- LLNotificationsUtil::add("NoItems");
- return;
- }
- else
- {
- if(0 == giveable.countNoCopy())
- {
- LLToolDragAndDrop::commitGiveInventoryCategory(to_agent, cat, im_session_id);
- }
- else
- {
- LLSD args;
- args["COUNT"] = llformat("%d",giveable.countNoCopy());
- LLSD payload;
- payload["agent_id"] = to_agent;
- payload["folder_id"] = cat->getUUID();
- LLNotificationsUtil::add("CannotCopyCountItems", args, payload, &LLToolDragAndDrop::handleCopyProtectedCategory);
- }
- }
-}
-
-
-// static
-bool LLToolDragAndDrop::handleCopyProtectedCategory(const LLSD& notification, const LLSD& response)
-{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- LLInventoryCategory* cat = NULL;
- switch(option)
- {
- case 0: // "Yes"
- cat = gInventory.getCategory(notification["payload"]["folder_id"].asUUID());
- if(cat)
- {
- LLToolDragAndDrop::commitGiveInventoryCategory(notification["payload"]["agent_id"].asUUID(),
- cat);
- LLViewerInventoryCategory::cat_array_t cats;
- LLViewerInventoryItem::item_array_t items;
- LLUncopyableItems remove;
- gInventory.collectDescendentsIf(cat->getUUID(),
- cats,
- items,
- LLInventoryModel::EXCLUDE_TRASH,
- remove);
- S32 count = items.count();
- for(S32 i = 0; i < count; ++i)
- {
- gInventory.deleteObject(items.get(i)->getUUID());
- }
- gInventory.notifyObservers();
- }
- else
- {
- LLNotificationsUtil::add("CannotGiveCategory");
- }
- break;
-
- default: // no, cancel, whatever, who cares, not yes.
- LLNotificationsUtil::add("TransactionCancelled");
- break;
- }
- return false;
-}
-
-// static
-void LLToolDragAndDrop::commitGiveInventoryCategory(const LLUUID& to_agent,
- LLInventoryCategory* cat,
- const LLUUID& im_session_id)
-
-{
- if(!cat) return;
- llinfos << "LLToolDragAndDrop::commitGiveInventoryCategory() - "
- << cat->getUUID() << llendl;
-
- // add buddy to recent people list
- LLRecentPeople::instance().add(to_agent);
-
- // Test out how many items are being given.
- LLViewerInventoryCategory::cat_array_t cats;
- LLViewerInventoryItem::item_array_t items;
- LLGiveable giveable;
- gInventory.collectDescendentsIf(cat->getUUID(),
- cats,
- items,
- LLInventoryModel::EXCLUDE_TRASH,
- giveable);
-
- // MAX ITEMS is based on (sizeof(uuid)+2) * count must be <
- // MTUBYTES or 18 * count < 1200 => count < 1200/18 =>
- // 66. I've cut it down a bit from there to give some pad.
- S32 count = items.count() + cats.count();
- if(count > MAX_ITEMS)
- {
- LLNotificationsUtil::add("TooManyItems");
- return;
- }
- else if(count == 0)
- {
- LLNotificationsUtil::add("NoItems");
- return;
- }
- else
- {
- std::string name;
- LLAgentUI::buildFullname(name);
- LLUUID transaction_id;
- transaction_id.generate();
- S32 bucket_size = (sizeof(U8) + UUID_BYTES) * (count + 1);
- U8* bucket = new U8[bucket_size];
- U8* pos = bucket;
- U8 type = (U8)cat->getType();
- memcpy(pos, &type, sizeof(U8)); /* Flawfinder: ignore */
- pos += sizeof(U8);
- memcpy(pos, &(cat->getUUID()), UUID_BYTES); /* Flawfinder: ignore */
- pos += UUID_BYTES;
- S32 i;
- count = cats.count();
- for(i = 0; i < count; ++i)
- {
- memcpy(pos, &type, sizeof(U8)); /* Flawfinder: ignore */
- pos += sizeof(U8);
- memcpy(pos, &(cats.get(i)->getUUID()), UUID_BYTES); /* Flawfinder: ignore */
- pos += UUID_BYTES;
- }
- count = items.count();
- for(i = 0; i < count; ++i)
- {
- type = (U8)items.get(i)->getType();
- memcpy(pos, &type, sizeof(U8)); /* Flawfinder: ignore */
- pos += sizeof(U8);
- memcpy(pos, &(items.get(i)->getUUID()), UUID_BYTES); /* Flawfinder: ignore */
- pos += UUID_BYTES;
- }
- pack_instant_message(
- gMessageSystem,
- gAgent.getID(),
- FALSE,
- gAgent.getSessionID(),
- to_agent,
- name,
- cat->getName(),
- IM_ONLINE,
- IM_INVENTORY_OFFERED,
- transaction_id,
- 0,
- LLUUID::null,
- gAgent.getPositionAgent(),
- NO_TIMESTAMP,
- bucket,
- bucket_size);
- gAgent.sendReliableMessage();
- delete[] bucket;
-
- // VEFFECT: giveInventoryCategory
- LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
- effectp->setSourceObject(gAgent.getAvatarObject());
- effectp->setTargetObject(gObjectList.findObject(to_agent));
- effectp->setDuration(LL_HUD_DUR_SHORT);
- effectp->setColor(LLColor4U(gAgent.getEffectColor()));
- gFloaterTools->dirty();
-
- LLMuteList::getInstance()->autoRemove(to_agent, LLMuteList::AR_INVENTORY);
-
- // If this item was given by drag-and-drop into an IM panel, log this action in the IM panel chat.
- if (im_session_id != LLUUID::null)
- {
- LLSD args;
- gIMMgr->addSystemMessage(im_session_id, "inventory_item_offered", args);
- }
- }
-}
-
-// static
-BOOL LLToolDragAndDrop::isInventoryGiveAcceptable(LLInventoryItem* item)
-{
- if(!item)
- {
- return FALSE;
- }
- if(!item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID()))
- {
- return FALSE;
- }
- BOOL copyable = FALSE;
- if(item->getPermissions().allowCopyBy(gAgent.getID())) copyable = TRUE;
-
- LLVOAvatarSelf* my_avatar = gAgent.getAvatarObject();
- if(!my_avatar)
- {
- return FALSE;
- }
-
- BOOL acceptable = TRUE;
- switch(item->getType())
- {
- case LLAssetType::AT_OBJECT:
- if(my_avatar->isWearingAttachment(item->getUUID()))
- {
- acceptable = FALSE;
- }
- break;
- case LLAssetType::AT_BODYPART:
- case LLAssetType::AT_CLOTHING:
- if(!copyable && gAgentWearables.isWearingItem(item->getUUID()))
- {
- acceptable = FALSE;
- }
- break;
- default:
- break;
- }
- return acceptable;
-}
-
-// Static
-BOOL LLToolDragAndDrop::isInventoryGroupGiveAcceptable(LLInventoryItem* item)
-{
- if(!item)
- {
- return FALSE;
- }
-
- // These permissions are double checked in the simulator in
- // LLGroupNoticeInventoryItemFetch::result().
- if(!item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID()))
- {
- return FALSE;
- }
- if(!item->getPermissions().allowCopyBy(gAgent.getID()))
- {
- return FALSE;
- }
-
- LLVOAvatarSelf* my_avatar = gAgent.getAvatarObject();
- if(!my_avatar)
- {
- return FALSE;
- }
-
- BOOL acceptable = TRUE;
- switch(item->getType())
- {
- case LLAssetType::AT_OBJECT:
- if(my_avatar->isWearingAttachment(item->getUUID()))
- {
- acceptable = FALSE;
- }
- break;
- default:
- break;
- }
- return acceptable;
-}
-
// accessor that looks at permissions, copyability, and names of
// inventory items to determine if a drop would be ok.
EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LLInventoryItem* item)
@@ -1822,14 +1361,14 @@ EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LL
if (!item || !obj) return ACCEPT_NO;
// HACK: downcast
LLViewerInventoryItem* vitem = (LLViewerInventoryItem*)item;
- if (!vitem->isComplete()) return ACCEPT_NO;
+ if (!vitem->isFinished()) return ACCEPT_NO;
if (vitem->getIsLinkType()) return ACCEPT_NO; // No giving away links
// deny attempts to drop from an object onto itself. This is to
// help make sure that drops that are from an object to an object
// don't have to worry about order of evaluation. Think of this
// like check for self in assignment.
- if(obj->getID() == item->getParentUUID())
+ if (obj->getID() == item->getParentUUID())
{
return ACCEPT_NO;
}
@@ -1838,19 +1377,17 @@ EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LL
// gAgent.getGroupID())
// && (obj->mPermModify || obj->mFlagAllowInventoryAdd));
BOOL worn = FALSE;
- LLVOAvatarSelf* my_avatar = NULL;
switch(item->getType())
{
case LLAssetType::AT_OBJECT:
- my_avatar = gAgent.getAvatarObject();
- if(my_avatar && my_avatar->isWearingAttachment(item->getUUID()))
+ if (isAgentAvatarValid() && gAgentAvatarp->isWearingAttachment(item->getUUID()))
{
worn = TRUE;
}
break;
case LLAssetType::AT_BODYPART:
case LLAssetType::AT_CLOTHING:
- if(gAgentWearables.isWearingItem(item->getUUID()))
+ if (gAgentWearables.isWearingItem(item->getUUID()))
{
worn = TRUE;
}
@@ -1861,7 +1398,7 @@ EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LL
const LLPermissions& perm = item->getPermissions();
BOOL modify = (obj->permModify() || obj->flagAllowInventoryAdd());
BOOL transfer = FALSE;
- if((obj->permYouOwner() && (perm.getOwner() == gAgent.getID()))
+ if ((obj->permYouOwner() && (perm.getOwner() == gAgent.getID()))
|| perm.allowOperationBy(PERM_TRANSFER, gAgent.getID()))
{
transfer = TRUE;
@@ -1869,15 +1406,15 @@ EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LL
BOOL volume = (LL_PCODE_VOLUME == obj->getPCode());
BOOL attached = obj->isAttachment();
BOOL unrestricted = ((perm.getMaskBase() & PERM_ITEM_UNRESTRICTED) == PERM_ITEM_UNRESTRICTED) ? TRUE : FALSE;
- if(attached && !unrestricted)
+ if (attached && !unrestricted)
{
return ACCEPT_NO_LOCKED;
}
- else if(modify && transfer && volume && !worn)
+ else if (modify && transfer && volume && !worn)
{
return ACCEPT_YES_MULTI;
}
- else if(!modify)
+ else if (!modify)
{
return ACCEPT_NO_LOCKED;
}
@@ -1885,12 +1422,42 @@ EAcceptance LLToolDragAndDrop::willObjectAcceptInventory(LLViewerObject* obj, LL
}
+static void give_inventory_cb(const LLSD& notification, const LLSD& response)
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ // if Cancel pressed
+ if (option == 1)
+ {
+ return;
+ }
+
+ LLSD payload = notification["payload"];
+ const LLUUID& session_id = payload["session_id"];
+ const LLUUID& agent_id = payload["agent_id"];
+ LLViewerInventoryItem * inv_item = gInventory.getItem(payload["item_id"]);
+ if (NULL == inv_item)
+ {
+ llassert(NULL != inv_item);
+ return;
+ }
+
+ if (LLGiveInventory::doGiveInventoryItem(agent_id, inv_item, session_id))
+ {
+ if ("avatarpicker" == payload["d&d_dest"].asString())
+ {
+ LLFloaterReg::hideInstance("avatar_picker");
+ }
+ LLNotificationsUtil::add("ItemsShared");
+ }
+}
+
// function used as drag-and-drop handler for simple agent give inventory requests
//static
bool LLToolDragAndDrop::handleGiveDragAndDrop(LLUUID dest_agent, LLUUID session_id, BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data,
- EAcceptance* accept)
+ EAcceptance* accept,
+ const LLSD& dest)
{
// check the type
switch(cargo_type)
@@ -1908,14 +1475,28 @@ bool LLToolDragAndDrop::handleGiveDragAndDrop(LLUUID dest_agent, LLUUID session_
case DAD_CALLINGCARD:
{
LLViewerInventoryItem* inv_item = (LLViewerInventoryItem*)cargo_data;
- if(gInventory.getItem(inv_item->getUUID())
- && LLToolDragAndDrop::isInventoryGiveAcceptable(inv_item))
+ if (gInventory.getItem(inv_item->getUUID())
+ && LLGiveInventory::isInventoryGiveAcceptable(inv_item))
{
// *TODO: get multiple object transfers working
*accept = ACCEPT_YES_COPY_SINGLE;
- if(drop)
+ if (drop)
{
- LLToolDragAndDrop::giveInventory(dest_agent, inv_item, session_id);
+ LLIMModel::LLIMSession * session = LLIMModel::instance().findIMSession(session_id);
+ if (NULL == session)
+ {
+ llassert(NULL != session);
+ return false;
+ }
+ LLSD substitutions;
+ substitutions["RESIDENTS"] = session->mName;
+ substitutions["ITEMS"] = inv_item->getName();
+ LLSD payload;
+ payload["agent_id"] = dest_agent;
+ payload["item_id"] = inv_item->getUUID();
+ payload["session_id"] = session_id;
+ payload["d&d_dest"] = dest.asString();
+ LLNotificationsUtil::add("ShareItemsConfirmation", substitutions, payload, &give_inventory_cb);
}
}
else
@@ -1931,13 +1512,13 @@ bool LLToolDragAndDrop::handleGiveDragAndDrop(LLUUID dest_agent, LLUUID session_
case DAD_CATEGORY:
{
LLViewerInventoryCategory* inv_cat = (LLViewerInventoryCategory*)cargo_data;
- if( gInventory.getCategory( inv_cat->getUUID() ) )
+ if (gInventory.getCategory(inv_cat->getUUID()))
{
// *TODO: get multiple object transfers working
*accept = ACCEPT_YES_COPY_SINGLE;
- if(drop)
+ if (drop)
{
- LLToolDragAndDrop::giveInventoryCategory(dest_agent, inv_cat, session_id);
+ LLGiveInventory::doGiveInventoryCategory(dest_agent, inv_cat, session_id);
}
}
else
@@ -1976,7 +1557,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezAttachmentFromInv(
{
lldebugs << "LLToolDragAndDrop::dad3dRezAttachmentFromInv()" << llendl;
// must be in the user's inventory
- if(mSource != SOURCE_AGENT && mSource != SOURCE_LIBRARY)
+ if (mSource != SOURCE_AGENT && mSource != SOURCE_LIBRARY)
{
return ACCEPT_NO;
}
@@ -1984,25 +1565,24 @@ EAcceptance LLToolDragAndDrop::dad3dRezAttachmentFromInv(
LLViewerInventoryItem* item;
LLViewerInventoryCategory* cat;
locateInventory(item, cat);
- if(!item || !item->isComplete()) return ACCEPT_NO;
+ if (!item || !item->isFinished()) return ACCEPT_NO;
// must not be in the trash
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- if( gInventory.isObjectDescendentOf( item->getUUID(), trash_id ) )
+ if (gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
{
return ACCEPT_NO;
}
// must not be already wearing it
- LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- if( !avatar || avatar->isWearingAttachment(item->getUUID()) )
+ if (!isAgentAvatarValid() || gAgentAvatarp->isWearingAttachment(item->getUUID()))
{
return ACCEPT_NO;
}
- if( drop )
+ if (drop)
{
- if(mSource == SOURCE_LIBRARY)
+ if (mSource == SOURCE_LIBRARY)
{
LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(0);
copy_inventory_item(
@@ -2034,10 +1614,9 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnLand(
LLViewerInventoryItem* item;
LLViewerInventoryCategory* cat;
locateInventory(item, cat);
- if(!item || !item->isComplete()) return ACCEPT_NO;
+ if (!item || !item->isFinished()) return ACCEPT_NO;
- LLVOAvatarSelf* my_avatar = gAgent.getAvatarObject();
- if( !my_avatar || my_avatar->isWearingAttachment( item->getUUID() ) )
+ if (!isAgentAvatarValid() || gAgentAvatarp->isWearingAttachment(item->getUUID()))
{
return ACCEPT_NO;
}
@@ -2062,7 +1641,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnLand(
// check if the item can be copied. If not, send that to the sim
// which will remove the inventory item.
- if(!item->getPermissions().allowCopyBy(gAgent.getID()))
+ if (!item->getPermissions().allowCopyBy(gAgent.getID()))
{
accept = ACCEPT_YES_SINGLE;
remove_inventory = TRUE;
@@ -2070,13 +1649,13 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnLand(
// Check if it's in the trash.
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
+ if (gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
{
accept = ACCEPT_YES_SINGLE;
remove_inventory = TRUE;
}
- if(drop)
+ if (drop)
{
dropObject(obj, TRUE, FALSE, remove_inventory);
}
@@ -2097,24 +1676,23 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnObject(
LLViewerInventoryItem* item;
LLViewerInventoryCategory* cat;
locateInventory(item, cat);
- if(!item || !item->isComplete()) return ACCEPT_NO;
- LLVOAvatarSelf* my_avatar = gAgent.getAvatarObject();
- if( !my_avatar || my_avatar->isWearingAttachment( item->getUUID() ) )
+ if (!item || !item->isFinished()) return ACCEPT_NO;
+ if (!isAgentAvatarValid() || gAgentAvatarp->isWearingAttachment(item->getUUID()))
{
return ACCEPT_NO;
}
- if((mask & MASK_CONTROL))
+ if ((mask & MASK_CONTROL))
{
// *HACK: In order to resolve SL-22177, we need to block drags
// from notecards and objects onto other objects.
- if(mSource == SOURCE_NOTECARD)
+ if (mSource == SOURCE_NOTECARD)
{
return ACCEPT_NO;
}
EAcceptance rv = willObjectAcceptInventory(obj, item);
- if(drop && (ACCEPT_YES_SINGLE <= rv))
+ if (drop && (ACCEPT_YES_SINGLE <= rv))
{
dropInventory(obj, item, mSource, mSourceID);
}
@@ -2140,7 +1718,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnObject(
// check if the item can be copied. If not, send that to the sim
// which will remove the inventory item.
- if(!item->getPermissions().allowCopyBy(gAgent.getID()))
+ if (!item->getPermissions().allowCopyBy(gAgent.getID()))
{
accept = ACCEPT_YES_SINGLE;
remove_inventory = TRUE;
@@ -2148,13 +1726,13 @@ EAcceptance LLToolDragAndDrop::dad3dRezObjectOnObject(
// Check if it's in the trash.
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- if(gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
+ if (gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
{
accept = ACCEPT_YES_SINGLE;
remove_inventory = TRUE;
}
- if(drop)
+ if (drop)
{
dropObject(obj, FALSE, FALSE, remove_inventory);
}
@@ -2169,7 +1747,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezScript(
// *HACK: In order to resolve SL-22177, we need to block drags
// from notecards and objects onto other objects.
- if((SOURCE_WORLD == mSource) || (SOURCE_NOTECARD == mSource))
+ if ((SOURCE_WORLD == mSource) || (SOURCE_NOTECARD == mSource))
{
return ACCEPT_NO;
}
@@ -2177,9 +1755,9 @@ EAcceptance LLToolDragAndDrop::dad3dRezScript(
LLViewerInventoryItem* item;
LLViewerInventoryCategory* cat;
locateInventory(item, cat);
- if(!item || !item->isComplete()) return ACCEPT_NO;
+ if (!item || !item->isFinished()) return ACCEPT_NO;
EAcceptance rv = willObjectAcceptInventory(obj, item);
- if(drop && (ACCEPT_YES_SINGLE <= rv))
+ if (drop && (ACCEPT_YES_SINGLE <= rv))
{
// rez in the script active by default, rez in inactive if the
// control key is being held down.
@@ -2207,7 +1785,7 @@ EAcceptance LLToolDragAndDrop::dad3dTextureObject(
// *HACK: In order to resolve SL-22177, we need to block drags
// from notecards and objects onto other objects.
- if((SOURCE_WORLD == mSource) || (SOURCE_NOTECARD == mSource))
+ if ((SOURCE_WORLD == mSource) || (SOURCE_NOTECARD == mSource))
{
return ACCEPT_NO;
}
@@ -2215,29 +1793,29 @@ EAcceptance LLToolDragAndDrop::dad3dTextureObject(
LLViewerInventoryItem* item;
LLViewerInventoryCategory* cat;
locateInventory(item, cat);
- if(!item || !item->isComplete()) return ACCEPT_NO;
+ if (!item || !item->isFinished()) return ACCEPT_NO;
EAcceptance rv = willObjectAcceptInventory(obj, item);
- if((mask & MASK_CONTROL))
+ if ((mask & MASK_CONTROL))
{
- if((ACCEPT_YES_SINGLE <= rv) && drop)
+ if ((ACCEPT_YES_SINGLE <= rv) && drop)
{
dropInventory(obj, item, mSource, mSourceID);
}
return rv;
}
- if(!obj->permModify())
+ if (!obj->permModify())
{
return ACCEPT_NO_LOCKED;
}
//If texture !copyable don't texture or you'll never get it back.
- if(!item->getPermissions().allowCopyBy(gAgent.getID()))
+ if (!item->getPermissions().allowCopyBy(gAgent.getID()))
{
return ACCEPT_NO;
}
- if(drop && (ACCEPT_YES_SINGLE <= rv))
+ if (drop && (ACCEPT_YES_SINGLE <= rv))
{
- if((mask & MASK_SHIFT))
+ if ((mask & MASK_SHIFT))
{
dropTextureAllFaces(obj, item, mSource, mSourceID);
}
@@ -2248,7 +1826,7 @@ EAcceptance LLToolDragAndDrop::dad3dTextureObject(
// VEFFECT: SetTexture
LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
- effectp->setSourceObject(gAgent.getAvatarObject());
+ effectp->setSourceObject(gAgentAvatarp);
effectp->setTargetObject(obj);
effectp->setDuration(LL_HUD_DUR_SHORT);
effectp->setColor(LLColor4U(gAgent.getEffectColor()));
@@ -2262,9 +1840,9 @@ EAcceptance LLToolDragAndDrop::dad3dTextureSelf(
LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
{
lldebugs << "LLToolDragAndDrop::dad3dTextureAvatar()" << llendl;
- if(drop)
+ if (drop)
{
- if( !(mask & MASK_SHIFT) )
+ if (!(mask & MASK_SHIFT))
{
dropTextureOneFaceAvatar( (LLVOAvatar*)obj, face, (LLInventoryItem*)mCargoData);
}
@@ -2280,18 +1858,18 @@ EAcceptance LLToolDragAndDrop::dad3dWearItem(
LLViewerInventoryItem* item;
LLViewerInventoryCategory* cat;
locateInventory(item, cat);
- if(!item || !item->isComplete()) return ACCEPT_NO;
+ if (!item || !item->isFinished()) return ACCEPT_NO;
- if(mSource == SOURCE_AGENT || mSource == SOURCE_LIBRARY)
+ if (mSource == SOURCE_AGENT || mSource == SOURCE_LIBRARY)
{
// it's in the agent inventory
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- if( gInventory.isObjectDescendentOf( item->getUUID(), trash_id ) )
+ if (gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
{
return ACCEPT_NO;
}
- if( drop )
+ if (drop)
{
// Don't wear anything until initial wearables are loaded, can
// destroy clothing items.
@@ -2300,24 +1878,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearItem(
LLNotificationsUtil::add("CanNotChangeAppearanceUntilLoaded");
return ACCEPT_NO;
}
-
- if(mSource == SOURCE_LIBRARY)
- {
- // create item based on that one, and put it on if that
- // was a success.
- LLPointer<LLInventoryCallback> cb = new WearOnAvatarCallback();
- copy_inventory_item(
- gAgent.getID(),
- item->getPermissions().getOwner(),
- item->getUUID(),
- LLUUID::null,
- std::string(),
- cb);
- }
- else
- {
- wear_inventory_item_on_avatar( item );
- }
+ LLAppearanceMgr::instance().wearItemOnAvatar(item->getUUID(),true, !(mask & MASK_CONTROL));
}
return ACCEPT_YES_MULTI;
}
@@ -2335,21 +1896,21 @@ EAcceptance LLToolDragAndDrop::dad3dActivateGesture(
LLViewerInventoryItem* item;
LLViewerInventoryCategory* cat;
locateInventory(item, cat);
- if(!item || !item->isComplete()) return ACCEPT_NO;
+ if (!item || !item->isFinished()) return ACCEPT_NO;
- if(mSource == SOURCE_AGENT || mSource == SOURCE_LIBRARY)
+ if (mSource == SOURCE_AGENT || mSource == SOURCE_LIBRARY)
{
// it's in the agent inventory
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- if( gInventory.isObjectDescendentOf( item->getUUID(), trash_id ) )
+ if (gInventory.isObjectDescendentOf(item->getUUID(), trash_id))
{
return ACCEPT_NO;
}
- if( drop )
+ if (drop)
{
LLUUID item_id;
- if(mSource == SOURCE_LIBRARY)
+ if (mSource == SOURCE_LIBRARY)
{
// create item based on that one, and put it on if that
// was a success.
@@ -2364,7 +1925,7 @@ EAcceptance LLToolDragAndDrop::dad3dActivateGesture(
}
else
{
- LLGestureManager::instance().activateGesture(item->getUUID());
+ LLGestureMgr::instance().activateGesture(item->getUUID());
gInventory.updateItem(item);
gInventory.notifyObservers();
}
@@ -2384,7 +1945,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory(
LLViewerInventoryItem* item;
LLViewerInventoryCategory* category;
locateInventory(item, category);
- if(!category) return ACCEPT_NO;
+ if (!category) return ACCEPT_NO;
if (drop)
{
@@ -2397,26 +1958,26 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory(
}
}
- if(mSource == SOURCE_AGENT)
+ if (mSource == SOURCE_AGENT)
{
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
- if( gInventory.isObjectDescendentOf( category->getUUID(), trash_id ) )
+ if (gInventory.isObjectDescendentOf(category->getUUID(), trash_id))
{
return ACCEPT_NO;
}
- if(drop)
+ if (drop)
{
BOOL append = ( (mask & MASK_SHIFT) ? TRUE : FALSE );
- LLAppearanceManager::instance().wearInventoryCategory(category, false, append);
+ LLAppearanceMgr::instance().wearInventoryCategory(category, false, append);
}
return ACCEPT_YES_MULTI;
}
- else if(mSource == SOURCE_LIBRARY)
+ else if (mSource == SOURCE_LIBRARY)
{
- if(drop)
+ if (drop)
{
- LLAppearanceManager::instance().wearInventoryCategory(category, true, false);
+ LLAppearanceMgr::instance().wearInventoryCategory(category, true, false);
}
return ACCEPT_YES_MULTI;
}
@@ -2435,7 +1996,7 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventory(
// *HACK: In order to resolve SL-22177, we need to block drags
// from notecards and objects onto other objects.
- if((SOURCE_WORLD == mSource) || (SOURCE_NOTECARD == mSource))
+ if ((SOURCE_WORLD == mSource) || (SOURCE_NOTECARD == mSource))
{
return ACCEPT_NO;
}
@@ -2443,7 +2004,7 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventory(
LLViewerInventoryItem* item;
LLViewerInventoryCategory* cat;
locateInventory(item, cat);
- if(!item || !item->isComplete()) return ACCEPT_NO;
+ if (!item || !item->isFinished()) return ACCEPT_NO;
LLViewerObject* root_object = obj;
if (obj && obj->getParent())
{
@@ -2455,7 +2016,7 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventory(
}
EAcceptance rv = willObjectAcceptInventory(root_object, item);
- if(root_object && drop && (ACCEPT_YES_COPY_SINGLE <= rv))
+ if (root_object && drop && (ACCEPT_YES_COPY_SINGLE <= rv))
{
dropInventory(root_object, item, mSource, mSourceID);
}
@@ -2499,7 +2060,7 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory(
LLDroppableItem droppable(!obj->permYouOwner());
LLInventoryModel::cat_array_t cats;
LLInventoryModel::item_array_t items;
- gInventory.collectDescendentsIf(cat->getUUID(),
+ gInventory.collectDescendentsIf (cat->getUUID(),
cats,
items,
LLInventoryModel::EXCLUDE_TRASH,
@@ -2528,7 +2089,7 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory(
{
const LLViewerInventoryCategory *cat = (*cat_iter);
rv = gInventory.isCategoryComplete(cat->getUUID()) ? ACCEPT_YES_MULTI : ACCEPT_NO;
- if(rv < ACCEPT_YES_SINGLE)
+ if (rv < ACCEPT_YES_SINGLE)
{
lldebugs << "Category " << cat->getUUID() << "is not complete." << llendl;
break;
@@ -2561,7 +2122,7 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory(
// If every item is accepted, send it on
if (drop && (ACCEPT_YES_COPY_SINGLE <= rv))
{
- LLInventoryFetchObserver::item_ref_t ids;
+ uuid_vec_t ids;
for (LLInventoryModel::item_array_t::const_iterator item_iter = items.begin();
item_iter != items.end();
++item_iter)
@@ -2569,9 +2130,9 @@ EAcceptance LLToolDragAndDrop::dad3dUpdateInventoryCategory(
const LLViewerInventoryItem *item = (*item_iter);
ids.push_back(item->getUUID());
}
- LLCategoryDropObserver* dropper = new LLCategoryDropObserver(obj->getID(), mSource);
- dropper->fetchItems(ids);
- if(dropper->isEverythingComplete())
+ LLCategoryDropObserver* dropper = new LLCategoryDropObserver(ids, obj->getID(), mSource);
+ dropper->startFetch();
+ if (dropper->isFinished())
{
dropper->done();
}
@@ -2596,29 +2157,28 @@ EAcceptance LLToolDragAndDrop::dad3dGiveInventoryObject(
lldebugs << "LLToolDragAndDrop::dad3dGiveInventoryObject()" << llendl;
// item has to be in agent inventory.
- if(mSource != SOURCE_AGENT) return ACCEPT_NO;
+ if (mSource != SOURCE_AGENT) return ACCEPT_NO;
// find the item now.
LLViewerInventoryItem* item;
LLViewerInventoryCategory* cat;
locateInventory(item, cat);
- if(!item || !item->isComplete()) return ACCEPT_NO;
- if(!item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID()))
+ if (!item || !item->isFinished()) return ACCEPT_NO;
+ if (!item->getPermissions().allowOperationBy(PERM_TRANSFER, gAgent.getID()))
{
// cannot give away no-transfer objects
return ACCEPT_NO;
}
- LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- if(avatar && avatar->isWearingAttachment( item->getUUID() ) )
+ if (isAgentAvatarValid() && gAgentAvatarp->isWearingAttachment(item->getUUID()))
{
// You can't give objects that are attached to you
return ACCEPT_NO;
}
- if( obj && avatar )
+ if (obj && isAgentAvatarValid())
{
- if(drop)
+ if (drop)
{
- giveInventory(obj->getID(), item );
+ LLGiveInventory::doGiveInventoryItem(obj->getID(), item );
}
// *TODO: deal with all the issues surrounding multi-object
// inventory transfers.
@@ -2633,18 +2193,18 @@ EAcceptance LLToolDragAndDrop::dad3dGiveInventory(
{
lldebugs << "LLToolDragAndDrop::dad3dGiveInventory()" << llendl;
// item has to be in agent inventory.
- if(mSource != SOURCE_AGENT) return ACCEPT_NO;
+ if (mSource != SOURCE_AGENT) return ACCEPT_NO;
LLViewerInventoryItem* item;
LLViewerInventoryCategory* cat;
locateInventory(item, cat);
- if(!item || !item->isComplete()) return ACCEPT_NO;
- if(!isInventoryGiveAcceptable(item))
+ if (!item || !item->isFinished()) return ACCEPT_NO;
+ if (!LLGiveInventory::isInventoryGiveAcceptable(item))
{
return ACCEPT_NO;
}
- if(drop && obj)
+ if (drop && obj)
{
- giveInventory(obj->getID(), item);
+ LLGiveInventory::doGiveInventoryItem(obj->getID(), item);
}
// *TODO: deal with all the issues surrounding multi-object
// inventory transfers.
@@ -2655,13 +2215,13 @@ EAcceptance LLToolDragAndDrop::dad3dGiveInventoryCategory(
LLViewerObject* obj, S32 face, MASK mask, BOOL drop)
{
lldebugs << "LLToolDragAndDrop::dad3dGiveInventoryCategory()" << llendl;
- if(drop && obj)
+ if (drop && obj)
{
LLViewerInventoryItem* item;
LLViewerInventoryCategory* cat;
locateInventory(item, cat);
- if(!cat) return ACCEPT_NO;
- giveInventoryCategory(obj->getID(), cat);
+ if (!cat) return ACCEPT_NO;
+ LLGiveInventory::doGiveInventoryCategory(obj->getID(), cat);
}
// *TODO: deal with all the issues surrounding multi-object
// inventory transfers.
@@ -2676,14 +2236,14 @@ EAcceptance LLToolDragAndDrop::dad3dRezFromObjectOnLand(
LLViewerInventoryItem* item = NULL;
LLViewerInventoryCategory* cat = NULL;
locateInventory(item, cat);
- if(!item || !item->isComplete()) return ACCEPT_NO;
+ if (!item || !item->isFinished()) return ACCEPT_NO;
- if(!gAgent.allowOperation(PERM_COPY, item->getPermissions())
+ if (!gAgent.allowOperation(PERM_COPY, item->getPermissions())
|| !item->getPermissions().allowTransferTo(LLUUID::null))
{
return ACCEPT_NO_LOCKED;
}
- if(drop)
+ if (drop)
{
dropObject(obj, TRUE, TRUE, FALSE);
}
@@ -2697,8 +2257,8 @@ EAcceptance LLToolDragAndDrop::dad3dRezFromObjectOnObject(
LLViewerInventoryItem* item;
LLViewerInventoryCategory* cat;
locateInventory(item, cat);
- if(!item || !item->isComplete()) return ACCEPT_NO;
- if((mask & MASK_CONTROL))
+ if (!item || !item->isFinished()) return ACCEPT_NO;
+ if ((mask & MASK_CONTROL))
{
// *HACK: In order to resolve SL-22177, we need to block drags
// from notecards and objects onto other objects.
@@ -2706,19 +2266,19 @@ EAcceptance LLToolDragAndDrop::dad3dRezFromObjectOnObject(
// *HACK: uncomment this when appropriate
//EAcceptance rv = willObjectAcceptInventory(obj, item);
- //if(drop && (ACCEPT_YES_SINGLE <= rv))
+ //if (drop && (ACCEPT_YES_SINGLE <= rv))
//{
// dropInventory(obj, item, mSource, mSourceID);
//}
//return rv;
}
- if(!item->getPermissions().allowCopyBy(gAgent.getID(),
+ if (!item->getPermissions().allowCopyBy(gAgent.getID(),
gAgent.getGroupID())
|| !item->getPermissions().allowTransferTo(LLUUID::null))
{
return ACCEPT_NO_LOCKED;
}
- if(drop)
+ if (drop)
{
dropObject(obj, FALSE, TRUE, FALSE);
}
@@ -2734,23 +2294,23 @@ EAcceptance LLToolDragAndDrop::dad3dCategoryOnLand(
LLInventoryItem* item;
LLInventoryCategory* cat;
locateInventory(item, cat);
- if(!cat) return ACCEPT_NO;
+ if (!cat) return ACCEPT_NO;
EAcceptance rv = ACCEPT_NO;
// find all the items in the category
LLViewerInventoryCategory::cat_array_t cats;
LLViewerInventoryItem::item_array_t items;
LLDropCopyableItems droppable;
- gInventory.collectDescendentsIf(cat->getUUID(),
+ gInventory.collectDescendentsIf (cat->getUUID(),
cats,
items,
LLInventoryModel::EXCLUDE_TRASH,
droppable);
- if(items.count() > 0)
+ if (items.count() > 0)
{
rv = ACCEPT_YES_SINGLE;
}
- if((rv >= ACCEPT_YES_COPY_SINGLE) && drop)
+ if ((rv >= ACCEPT_YES_COPY_SINGLE) && drop)
{
createContainer(items, cat->getName());
return ACCEPT_NO;
@@ -2773,19 +2333,19 @@ EAcceptance LLToolDragAndDrop::dad3dAssetOnLand(
LLViewerInventoryItem::item_array_t items;
LLViewerInventoryItem::item_array_t copyable_items;
locateMultipleInventory(items, cats);
- if(!items.count()) return ACCEPT_NO;
+ if (!items.count()) return ACCEPT_NO;
EAcceptance rv = ACCEPT_NO;
for (S32 i = 0; i < items.count(); i++)
{
LLInventoryItem* item = items[i];
- if(item->getPermissions().allowCopyBy(gAgent.getID()))
+ if (item->getPermissions().allowCopyBy(gAgent.getID()))
{
copyable_items.put(item);
rv = ACCEPT_YES_SINGLE;
}
}
- if((rv >= ACCEPT_YES_COPY_SINGLE) && drop)
+ if ((rv >= ACCEPT_YES_COPY_SINGLE) && drop)
{
createContainer(copyable_items, NULL);
}
@@ -2800,20 +2360,20 @@ LLInventoryObject* LLToolDragAndDrop::locateInventory(
{
item = NULL;
cat = NULL;
- if(mCargoIDs.empty()) return NULL;
- if((mSource == SOURCE_AGENT) || (mSource == SOURCE_LIBRARY))
+ if (mCargoIDs.empty()) return NULL;
+ if ((mSource == SOURCE_AGENT) || (mSource == SOURCE_LIBRARY))
{
// The object should be in user inventory.
item = (LLViewerInventoryItem*)gInventory.getItem(mCargoIDs[mCurItemIndex]);
cat = (LLViewerInventoryCategory*)gInventory.getCategory(mCargoIDs[mCurItemIndex]);
}
- else if(mSource == SOURCE_WORLD)
+ else if (mSource == SOURCE_WORLD)
{
// This object is in some task inventory somewhere.
LLViewerObject* obj = gObjectList.findObject(mSourceID);
- if(obj)
+ if (obj)
{
- if((mCargoTypes[mCurItemIndex] == DAD_CATEGORY)
+ if ((mCargoTypes[mCurItemIndex] == DAD_CATEGORY)
|| (mCargoTypes[mCurItemIndex] == DAD_ROOT_CATEGORY))
{
cat = (LLViewerInventoryCategory*)obj->getInventoryObject(mCargoIDs[mCurItemIndex]);
@@ -2824,16 +2384,16 @@ LLInventoryObject* LLToolDragAndDrop::locateInventory(
}
}
}
- else if(mSource == SOURCE_NOTECARD)
+ else if (mSource == SOURCE_NOTECARD)
{
LLPreviewNotecard* preview = LLFloaterReg::findTypedInstance<LLPreviewNotecard>("preview_notecard", mSourceID);
- if(preview)
+ if (preview)
{
item = (LLViewerInventoryItem*)preview->getDragItem();
}
}
- if(item) return item;
- if(cat) return cat;
+ if (item) return item;
+ if (cat) return cat;
return NULL;
}
@@ -2841,8 +2401,8 @@ LLInventoryObject* LLToolDragAndDrop::locateInventory(
LLInventoryObject* LLToolDragAndDrop::locateMultipleInventory(LLViewerInventoryCategory::cat_array_t& cats,
LLViewerInventoryItem::item_array_t& items)
{
- if(mCargoIDs.count() == 0) return NULL;
- if((mSource == SOURCE_AGENT) || (mSource == SOURCE_LIBRARY))
+ if (mCargoIDs.count() == 0) return NULL;
+ if ((mSource == SOURCE_AGENT) || (mSource == SOURCE_LIBRARY))
{
// The object should be in user inventory.
for (S32 i = 0; i < mCargoIDs.count(); i++)
@@ -2859,13 +2419,13 @@ LLInventoryObject* LLToolDragAndDrop::locateMultipleInventory(LLViewerInventoryC
}
}
}
- else if(mSource == SOURCE_WORLD)
+ else if (mSource == SOURCE_WORLD)
{
// This object is in some task inventory somewhere.
LLViewerObject* obj = gObjectList.findObject(mSourceID);
- if(obj)
+ if (obj)
{
- if((mCargoType == DAD_CATEGORY)
+ if ((mCargoType == DAD_CATEGORY)
|| (mCargoType == DAD_ROOT_CATEGORY))
{
// The object should be in user inventory.
@@ -2891,17 +2451,17 @@ LLInventoryObject* LLToolDragAndDrop::locateMultipleInventory(LLViewerInventoryC
}
}
}
- else if(mSource == SOURCE_NOTECARD)
+ else if (mSource == SOURCE_NOTECARD)
{
LLPreviewNotecard* card;
card = (LLPreviewNotecard*)LLPreview::find(mSourceID);
- if(card)
+ if (card)
{
items.put((LLInventoryItem*)card->getDragItem());
}
}
- if(items.count()) return items[0];
- if(cats.count()) return cats[0];
+ if (items.count()) return items[0];
+ if (cats.count()) return cats[0];
return NULL;
}
*/
diff --git a/indra/newview/lltooldraganddrop.h b/indra/newview/lltooldraganddrop.h
index 79b2bc32a3..36e69c1db3 100644
--- a/indra/newview/lltooldraganddrop.h
+++ b/indra/newview/lltooldraganddrop.h
@@ -81,7 +81,7 @@ public:
const LLUUID& source_id = LLUUID::null,
const LLUUID& object_id = LLUUID::null);
void beginMultiDrag(const std::vector<EDragAndDropType> types,
- const std::vector<LLUUID>& cargo_ids,
+ const uuid_vec_t& cargo_ids,
ESource source,
const LLUUID& source_id = LLUUID::null);
void endDrag();
@@ -125,7 +125,7 @@ protected:
std::vector<EDragAndDropType> mCargoTypes;
//void* mCargoData;
- std::vector<LLUUID> mCargoIDs;
+ uuid_vec_t mCargoIDs;
ESource mSource;
LLUUID mSourceID;
LLUUID mObjectID;
@@ -214,28 +214,10 @@ protected:
LLToolDragAndDrop::ESource source,
const LLUUID& src_id);
-
- // give inventory item functionality
- static bool handleCopyProtectedItem(const LLSD& notification, const LLSD& response);
- static void commitGiveInventoryItem(const LLUUID& to_agent,
- LLInventoryItem* item,
- const LLUUID &im_session_id = LLUUID::null);
-
- // give inventory category functionality
- static bool handleCopyProtectedCategory(const LLSD& notification, const LLSD& response);
- static void commitGiveInventoryCategory(const LLUUID& to_agent,
- LLInventoryCategory* cat,
- const LLUUID &im_session_id = LLUUID::null);
-
public:
// helper functions
static BOOL isInventoryDropAcceptable(LLViewerObject* obj, LLInventoryItem* item) { return (ACCEPT_YES_COPY_SINGLE <= willObjectAcceptInventory(obj, item)); }
- // This simple helper function assumes you are attempting to
- // transfer item. returns true if you can give, otherwise false.
- static BOOL isInventoryGiveAcceptable(LLInventoryItem* item);
- static BOOL isInventoryGroupGiveAcceptable(LLInventoryItem* item);
-
BOOL dadUpdateInventory(LLViewerObject* obj, BOOL drop);
BOOL dadUpdateInventoryCategory(LLViewerObject* obj, BOOL drop);
@@ -261,17 +243,11 @@ public:
ESource source,
const LLUUID& src_id);
- static void giveInventory(const LLUUID& to_agent,
- LLInventoryItem* item,
- const LLUUID &session_id = LLUUID::null);
- static void giveInventoryCategory(const LLUUID& to_agent,
- LLInventoryCategory* item,
- const LLUUID &session_id = LLUUID::null);
-
static bool handleGiveDragAndDrop(LLUUID agent, LLUUID session, BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data,
- EAcceptance* accept);
+ EAcceptance* accept,
+ const LLSD& dest = LLSD());
// Classes used for determining 3d drag and drop types.
private:
diff --git a/indra/newview/lltoolfocus.cpp b/indra/newview/lltoolfocus.cpp
index 2320ae57df..032714cabf 100644
--- a/indra/newview/lltoolfocus.cpp
+++ b/indra/newview/lltoolfocus.cpp
@@ -42,6 +42,7 @@
// Viewer includes
#include "llagent.h"
+#include "llagentcamera.h"
#include "llbutton.h"
#include "llviewercontrol.h"
#include "lldrawable.h"
@@ -167,19 +168,17 @@ void LLToolCamera::pickCallback(const LLPickInfo& pick_info)
}
}
- if( CAMERA_MODE_CUSTOMIZE_AVATAR == gAgent.getCameraMode() )
+ if( CAMERA_MODE_CUSTOMIZE_AVATAR == gAgentCamera.getCameraMode() )
{
BOOL good_customize_avatar_hit = FALSE;
if( hit_obj )
{
- LLVOAvatar* avatar = gAgent.getAvatarObject();
- if( hit_obj == avatar)
+ if (isAgentAvatarValid() && (hit_obj == gAgentAvatarp))
{
// It's you
good_customize_avatar_hit = TRUE;
}
- else
- if( hit_obj->isAttachment() && hit_obj->permYouOwner() )
+ else if (hit_obj->isAttachment() && hit_obj->permYouOwner())
{
// It's an attachment that you're wearing
good_customize_avatar_hit = TRUE;
@@ -207,23 +206,23 @@ void LLToolCamera::pickCallback(const LLPickInfo& pick_info)
// ...clicked on a world object, so focus at its position
if (!hit_obj->isHUDAttachment())
{
- gAgent.setFocusOnAvatar(FALSE, ANIMATE);
- gAgent.setFocusGlobal(pick_info);
+ gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE);
+ gAgentCamera.setFocusGlobal(pick_info);
}
}
else if (!pick_info.mPosGlobal.isExactlyZero())
{
// Hit the ground
- gAgent.setFocusOnAvatar(FALSE, ANIMATE);
- gAgent.setFocusGlobal(pick_info);
+ gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE);
+ gAgentCamera.setFocusGlobal(pick_info);
}
if (!(pick_info.mKeyMask & MASK_ALT) &&
- gAgent.cameraThirdPerson() &&
+ gAgentCamera.cameraThirdPerson() &&
gViewerWindow->getLeftMouseDown() &&
!gSavedSettings.getBOOL("FreezeTime") &&
- (hit_obj == gAgent.getAvatarObject() ||
- (hit_obj && hit_obj->isAttachment() && LLVOAvatar::findAvatarFromAttachment(hit_obj)->isSelf())))
+ (hit_obj == gAgentAvatarp ||
+ (hit_obj && hit_obj->isAttachment() && LLVOAvatar::findAvatarFromAttachment(hit_obj)->isSelf())))
{
LLToolCamera::getInstance()->mMouseSteering = TRUE;
}
@@ -232,14 +231,14 @@ void LLToolCamera::pickCallback(const LLPickInfo& pick_info)
LLToolCamera::getInstance()->mValidClickPoint = TRUE;
- if( CAMERA_MODE_CUSTOMIZE_AVATAR == gAgent.getCameraMode() )
+ if( CAMERA_MODE_CUSTOMIZE_AVATAR == gAgentCamera.getCameraMode() )
{
- gAgent.setFocusOnAvatar(FALSE, FALSE);
+ gAgentCamera.setFocusOnAvatar(FALSE, FALSE);
- LLVector3d cam_pos = gAgent.getCameraPositionGlobal();
- cam_pos -= LLVector3d(LLViewerCamera::getInstance()->getLeftAxis() * gAgent.calcCustomizeAvatarUIOffset( cam_pos ));
+ LLVector3d cam_pos = gAgentCamera.getCameraPositionGlobal();
+ cam_pos -= LLVector3d(LLViewerCamera::getInstance()->getLeftAxis() * gAgentCamera.calcCustomizeAvatarUIOffset( cam_pos ));
- gAgent.setCameraPosAndFocusGlobal( cam_pos, pick_info.mPosGlobal, pick_info.mObjectID);
+ gAgentCamera.setCameraPosAndFocusGlobal( cam_pos, pick_info.mPosGlobal, pick_info.mObjectID);
}
}
@@ -280,10 +279,10 @@ BOOL LLToolCamera::handleMouseUp(S32 x, S32 y, MASK mask)
{
if (mValidClickPoint)
{
- if( CAMERA_MODE_CUSTOMIZE_AVATAR == gAgent.getCameraMode() )
+ if( CAMERA_MODE_CUSTOMIZE_AVATAR == gAgentCamera.getCameraMode() )
{
LLCoordGL mouse_pos;
- LLVector3 focus_pos = gAgent.getPosAgentFromGlobal(gAgent.getFocusGlobal());
+ LLVector3 focus_pos = gAgent.getPosAgentFromGlobal(gAgentCamera.getFocusGlobal());
BOOL success = LLViewerCamera::getInstance()->projectPosAgentToScreen(focus_pos, mouse_pos);
if (success)
{
@@ -369,12 +368,12 @@ BOOL LLToolCamera::handleHover(S32 x, S32 y, MASK mask)
if (dx != 0)
{
- gAgent.cameraOrbitAround( -dx * RADIANS_PER_PIXEL );
+ gAgentCamera.cameraOrbitAround( -dx * RADIANS_PER_PIXEL );
}
if (dy != 0)
{
- gAgent.cameraOrbitOver( -dy * RADIANS_PER_PIXEL );
+ gAgentCamera.cameraOrbitOver( -dy * RADIANS_PER_PIXEL );
}
gViewerWindow->moveCursorToCenter();
@@ -388,8 +387,8 @@ BOOL LLToolCamera::handleHover(S32 x, S32 y, MASK mask)
// Pan tool
if (hasMouseCapture())
{
- LLVector3d camera_to_focus = gAgent.getCameraPositionGlobal();
- camera_to_focus -= gAgent.getFocusGlobal();
+ LLVector3d camera_to_focus = gAgentCamera.getCameraPositionGlobal();
+ camera_to_focus -= gAgentCamera.getFocusGlobal();
F32 dist = (F32) camera_to_focus.normVec();
// Fudge factor for pan
@@ -397,12 +396,12 @@ BOOL LLToolCamera::handleHover(S32 x, S32 y, MASK mask)
if (dx != 0)
{
- gAgent.cameraPanLeft( dx * meters_per_pixel );
+ gAgentCamera.cameraPanLeft( dx * meters_per_pixel );
}
if (dy != 0)
{
- gAgent.cameraPanUp( -dy * meters_per_pixel );
+ gAgentCamera.cameraPanUp( -dy * meters_per_pixel );
}
gViewerWindow->moveCursorToCenter();
@@ -419,7 +418,7 @@ BOOL LLToolCamera::handleHover(S32 x, S32 y, MASK mask)
if (dx != 0)
{
- gAgent.cameraOrbitAround( -dx * RADIANS_PER_PIXEL );
+ gAgentCamera.cameraOrbitAround( -dx * RADIANS_PER_PIXEL );
}
const F32 IN_FACTOR = 0.99f;
@@ -428,11 +427,11 @@ BOOL LLToolCamera::handleHover(S32 x, S32 y, MASK mask)
{
if (mMouseSteering)
{
- gAgent.cameraOrbitOver( -dy * RADIANS_PER_PIXEL );
+ gAgentCamera.cameraOrbitOver( -dy * RADIANS_PER_PIXEL );
}
else
{
- gAgent.cameraZoomIn( pow( IN_FACTOR, dy ) );
+ gAgentCamera.cameraZoomIn( pow( IN_FACTOR, dy ) );
}
}
diff --git a/indra/newview/lltoolgrab.cpp b/indra/newview/lltoolgrab.cpp
index d837a334f1..9bd08287f3 100644
--- a/indra/newview/lltoolgrab.cpp
+++ b/indra/newview/lltoolgrab.cpp
@@ -46,6 +46,7 @@
// newview headers
#include "llagent.h"
+#include "llagentcamera.h"
#include "lldrawable.h"
#include "llfloatertools.h"
#include "llhudeffect.h"
@@ -225,7 +226,7 @@ BOOL LLToolGrab::handleObjectHit(const LLPickInfo& info)
// non-touchable objects. If it has a touch handler, we
// do grab it (so llDetectedGrab works), but movement is
// blocked on the server side. JC
- if (gAgent.cameraMouselook())
+ if (gAgentCamera.cameraMouselook())
{
mMode = GRAB_LOCKED;
}
@@ -285,8 +286,8 @@ BOOL LLToolGrab::handleObjectHit(const LLPickInfo& info)
LLVector3 local_edit_point = gAgent.getPosAgentFromGlobal(info.mPosGlobal);
local_edit_point -= edit_object->getPositionAgent();
local_edit_point = local_edit_point * ~edit_object->getRenderRotation();
- gAgent.setPointAt(POINTAT_TARGET_GRAB, edit_object, local_edit_point );
- gAgent.setLookAt(LOOKAT_TARGET_SELECT, edit_object, local_edit_point );
+ gAgentCamera.setPointAt(POINTAT_TARGET_GRAB, edit_object, local_edit_point );
+ gAgentCamera.setLookAt(LOOKAT_TARGET_SELECT, edit_object, local_edit_point );
}
// on transient grabs (clicks on world objects), kill the grab immediately
@@ -390,7 +391,7 @@ void LLToolGrab::startGrab()
// This planar drag starts at the grab point
mDragStartPointGlobal = grab_start_global;
- mDragStartFromCamera = grab_start_global - gAgent.getCameraPositionGlobal();
+ mDragStartFromCamera = grab_start_global - gAgentCamera.getCameraPositionGlobal();
LLMessageSystem *msg = gMessageSystem;
msg->newMessageFast(_PREHASH_ObjectGrab);
@@ -502,7 +503,7 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask)
mVerticalDragging = FALSE;
mDragStartPointGlobal = gViewerWindow->clickPointInWorldGlobal(x, y, objectp);
- mDragStartFromCamera = mDragStartPointGlobal - gAgent.getCameraPositionGlobal();
+ mDragStartFromCamera = mDragStartPointGlobal - gAgentCamera.getCameraPositionGlobal();
}
else if (!mVerticalDragging && (mask == MASK_VERTICAL) )
{
@@ -510,7 +511,7 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask)
mVerticalDragging = TRUE;
mDragStartPointGlobal = gViewerWindow->clickPointInWorldGlobal(x, y, objectp);
- mDragStartFromCamera = mDragStartPointGlobal - gAgent.getCameraPositionGlobal();
+ mDragStartFromCamera = mDragStartPointGlobal - gAgentCamera.getCameraPositionGlobal();
}
const F32 RADIANS_PER_PIXEL_X = 0.01f;
@@ -598,7 +599,7 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask)
// need to return offset from mGrabStartPoint
LLVector3d grab_point_global;
- grab_point_global = gAgent.getCameraPositionGlobal() + mGrabHiddenOffsetFromCamera;
+ grab_point_global = gAgentCamera.getCameraPositionGlobal() + mGrabHiddenOffsetFromCamera;
/* Snap to grid disabled for grab tool - very confusing
// Handle snapping to grid, but only when the tool is formally selected.
@@ -632,7 +633,7 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask)
grab_point_global = LLWorld::getInstance()->clipToVisibleRegions(mDragStartPointGlobal, grab_point_global);
// propagate constrained grab point back to grab offset
- mGrabHiddenOffsetFromCamera = grab_point_global - gAgent.getCameraPositionGlobal();
+ mGrabHiddenOffsetFromCamera = grab_point_global - gAgentCamera.getCameraPositionGlobal();
// Handle auto-rotation at screen edge.
LLVector3 grab_pos_agent = gAgent.getPosAgentFromGlobal( grab_point_global );
@@ -646,24 +647,24 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask)
// ...build mode moves camera about focus point
if (grab_center_gl.mX < ROTATE_H_MARGIN)
{
- if (gAgent.getFocusOnAvatar())
+ if (gAgentCamera.getFocusOnAvatar())
{
gAgent.yaw(rotate_angle);
}
else
{
- gAgent.cameraOrbitAround(rotate_angle);
+ gAgentCamera.cameraOrbitAround(rotate_angle);
}
}
else if (grab_center_gl.mX > gViewerWindow->getWorldViewWidthScaled() - ROTATE_H_MARGIN)
{
- if (gAgent.getFocusOnAvatar())
+ if (gAgentCamera.getFocusOnAvatar())
{
gAgent.yaw(-rotate_angle);
}
else
{
- gAgent.cameraOrbitAround(-rotate_angle);
+ gAgentCamera.cameraOrbitAround(-rotate_angle);
}
}
@@ -705,17 +706,17 @@ void LLToolGrab::handleHoverActive(S32 x, S32 y, MASK mask)
// once we've initiated a drag, lock the camera down
if (mHasMoved)
{
- if (!gAgent.cameraMouselook() &&
+ if (!gAgentCamera.cameraMouselook() &&
!objectp->isHUDAttachment() &&
- objectp->getRoot() == gAgent.getAvatarObject()->getRoot())
+ objectp->getRoot() == gAgentAvatarp->getRoot())
{
// force focus to point in space where we were looking previously
- gAgent.setFocusGlobal(gAgent.calcFocusPositionTargetGlobal(), LLUUID::null);
- gAgent.setFocusOnAvatar(FALSE, ANIMATE);
+ gAgentCamera.setFocusGlobal(gAgentCamera.calcFocusPositionTargetGlobal(), LLUUID::null);
+ gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE);
}
else
{
- gAgent.clearFocusObject();
+ gAgentCamera.clearFocusObject();
}
}
@@ -814,7 +815,7 @@ void LLToolGrab::handleHoverNonPhysical(S32 x, S32 y, MASK mask)
}
// need to return offset from mGrabStartPoint
- LLVector3d grab_point_global = gAgent.getCameraPositionGlobal() + mGrabHiddenOffsetFromCamera;
+ LLVector3d grab_point_global = gAgentCamera.getCameraPositionGlobal() + mGrabHiddenOffsetFromCamera;
grab_pos_region = objectp->getRegion()->getPosRegionFromGlobal( grab_point_global );
}
@@ -872,8 +873,8 @@ void LLToolGrab::handleHoverNonPhysical(S32 x, S32 y, MASK mask)
LLVector3 local_edit_point = pick.mIntersection;
local_edit_point -= objectp->getPositionAgent();
local_edit_point = local_edit_point * ~objectp->getRenderRotation();
- gAgent.setPointAt(POINTAT_TARGET_GRAB, objectp, local_edit_point );
- gAgent.setLookAt(LOOKAT_TARGET_SELECT, objectp, local_edit_point );
+ gAgentCamera.setPointAt(POINTAT_TARGET_GRAB, objectp, local_edit_point );
+ gAgentCamera.setLookAt(LOOKAT_TARGET_SELECT, objectp, local_edit_point );
}
@@ -885,28 +886,6 @@ void LLToolGrab::handleHoverNonPhysical(S32 x, S32 y, MASK mask)
// Not dragging. Just showing affordances
void LLToolGrab::handleHoverInactive(S32 x, S32 y, MASK mask)
{
- const F32 ROTATE_ANGLE_PER_SECOND = 40.f * DEG_TO_RAD;
- const F32 rotate_angle = ROTATE_ANGLE_PER_SECOND / gFPSClamped;
-
- // Look for cursor against the edge of the screen
- // Only works in fullscreen
- if (gSavedSettings.getBOOL("WindowFullScreen"))
- {
- if (gAgent.cameraThirdPerson() )
- {
- if (x == 0)
- {
- gAgent.yaw(rotate_angle);
- //gAgent.setControlFlags(AGENT_CONTROL_YAW_POS);
- }
- else if (x == (gViewerWindow->getWorldViewWidthScaled() - 1) )
- {
- gAgent.yaw(-rotate_angle);
- //gAgent.setControlFlags(AGENT_CONTROL_YAW_NEG);
- }
- }
- }
-
// JC - TODO - change cursor based on gGrabBtnVertical, gGrabBtnSpin
lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolGrab (inactive-not over editable object)" << llendl;
gViewerWindow->setCursor(UI_CURSOR_TOOLGRAB);
@@ -994,7 +973,7 @@ void LLToolGrab::onMouseCaptureLost()
return;
}
// First, fix cursor placement
- if( !gAgent.cameraMouselook()
+ if( !gAgentCamera.cameraMouselook()
&& (GRAB_ACTIVE_CENTER == mMode))
{
if (objectp->isHUDAttachment())
@@ -1035,8 +1014,8 @@ void LLToolGrab::onMouseCaptureLost()
mGrabPick.mObjectID.setNull();
LLSelectMgr::getInstance()->updateSelectionCenter();
- gAgent.setPointAt(POINTAT_TARGET_CLEAR);
- gAgent.setLookAt(LOOKAT_TARGET_CLEAR);
+ gAgentCamera.setPointAt(POINTAT_TARGET_CLEAR);
+ gAgentCamera.setLookAt(LOOKAT_TARGET_CLEAR);
dialog_refresh_all();
}
@@ -1128,7 +1107,7 @@ LLVector3d LLToolGrab::getGrabPointGlobal()
case GRAB_ACTIVE_CENTER:
case GRAB_NONPHYSICAL:
case GRAB_LOCKED:
- return gAgent.getCameraPositionGlobal() + mGrabHiddenOffsetFromCamera;
+ return gAgentCamera.getCameraPositionGlobal() + mGrabHiddenOffsetFromCamera;
case GRAB_NOOBJECT:
case GRAB_INACTIVE:
diff --git a/indra/newview/lltoolgun.cpp b/indra/newview/lltoolgun.cpp
index a441d653c7..c815f1e96a 100644
--- a/indra/newview/lltoolgun.cpp
+++ b/indra/newview/lltoolgun.cpp
@@ -36,6 +36,7 @@
#include "llviewerwindow.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llviewercontrol.h"
#include "llsky.h"
#include "llappviewer.h"
@@ -83,7 +84,7 @@ BOOL LLToolGun::handleMouseDown(S32 x, S32 y, MASK mask)
BOOL LLToolGun::handleHover(S32 x, S32 y, MASK mask)
{
- if( gAgent.cameraMouselook() && mIsSelected )
+ if( gAgentCamera.cameraMouselook() && mIsSelected )
{
const F32 NOMINAL_MOUSE_SENSITIVITY = 0.0025f;
diff --git a/indra/newview/lltoolmgr.cpp b/indra/newview/lltoolmgr.cpp
index fd12163fd3..a8696c22ef 100644
--- a/indra/newview/lltoolmgr.cpp
+++ b/indra/newview/lltoolmgr.cpp
@@ -56,6 +56,7 @@
#include "lltoolobjpicker.h"
#include "lltoolpipette.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llviewercontrol.h"
#include "llviewerjoystick.h"
#include "llviewermenu.h"
@@ -262,7 +263,7 @@ void LLToolMgr::toggleBuildMode()
else
{
// manually disable edit mode, but do not affect the camera
- gAgent.resetView(false);
+ gAgentCamera.resetView(false);
LLFloaterReg::hideInstance("build");
gViewerWindow->showCursor();
}
@@ -271,7 +272,7 @@ void LLToolMgr::toggleBuildMode()
}
else
{
- ECameraMode camMode = gAgent.getCameraMode();
+ ECameraMode camMode = gAgentCamera.getCameraMode();
if (CAMERA_MODE_MOUSELOOK == camMode || CAMERA_MODE_CUSTOMIZE_AVATAR == camMode)
{
// pull the user out of mouselook or appearance mode when entering build mode
@@ -286,13 +287,13 @@ void LLToolMgr::toggleBuildMode()
handle_toggle_flycam();
}
- if (gAgent.getFocusOnAvatar())
+ if (gAgentCamera.getFocusOnAvatar())
{
// zoom in if we're looking at the avatar
- gAgent.setFocusOnAvatar(FALSE, ANIMATE);
- gAgent.setFocusGlobal(gAgent.getPositionGlobal() + 2.0 * LLVector3d(gAgent.getAtAxis()));
- gAgent.cameraZoomIn(0.666f);
- gAgent.cameraOrbitOver( 30.f * DEG_TO_RAD );
+ gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE);
+ gAgentCamera.setFocusGlobal(gAgent.getPositionGlobal() + 2.0 * LLVector3d(gAgent.getAtAxis()));
+ gAgentCamera.cameraZoomIn(0.666f);
+ gAgentCamera.cameraOrbitOver( 30.f * DEG_TO_RAD );
}
}
@@ -303,7 +304,7 @@ void LLToolMgr::toggleBuildMode()
// Could be first use
//LLFirstUse::useBuild();
- gAgent.resetView(false);
+ gAgentCamera.resetView(false);
// avoid spurious avatar movements
LLViewerJoystick::getInstance()->setNeedsReset();
@@ -317,7 +318,7 @@ bool LLToolMgr::inBuildMode()
// cameraMouselook() actually starts returning true. Also, appearance edit
// sets build mode to true, so let's exclude that.
bool b=(inEdit()
- && !gAgent.cameraMouselook()
+ && !gAgentCamera.cameraMouselook()
&& mCurrentToolset != gFaceEditToolset);
return b;
diff --git a/indra/newview/lltoolmorph.cpp b/indra/newview/lltoolmorph.cpp
index 4fb75f7a49..fa21b1a866 100644
--- a/indra/newview/lltoolmorph.cpp
+++ b/indra/newview/lltoolmorph.cpp
@@ -49,7 +49,6 @@
#include "lldrawable.h"
#include "lldrawpoolavatar.h"
#include "llface.h"
-#include "llfloatercustomize.h"
#include "llmorphview.h"
#include "llresmgr.h"
#include "llselectmgr.h"
@@ -79,22 +78,25 @@ LLVisualParamHint::LLVisualParamHint(
S32 width, S32 height,
LLViewerJointMesh *mesh,
LLViewerVisualParam *param,
- F32 param_weight)
+ LLWearable *wearable,
+ F32 param_weight,
+ LLJoint* jointp)
:
LLViewerDynamicTexture(width, height, 3, LLViewerDynamicTexture::ORDER_MIDDLE, TRUE ),
mNeedsUpdate( TRUE ),
mIsVisible( FALSE ),
mJointMesh( mesh ),
mVisualParam( param ),
+ mWearablePtr( wearable ),
mVisualParamWeight( param_weight ),
mAllowsUpdates( TRUE ),
mDelayFrames( 0 ),
mRect( pos_x, pos_y + height, pos_x + width, pos_y ),
- mLastParamWeight(0.f)
+ mLastParamWeight(0.f),
+ mCamTargetJoint(jointp)
{
LLVisualParamHint::sInstances.insert( this );
- mBackgroundp = LLUI::getUIImage("avatar_thumb_bkgrnd.j2c");
-
+ mBackgroundp = LLUI::getUIImage("avatar_thumb_bkgrnd.png");
llassert(width != 0);
llassert(height != 0);
@@ -108,6 +110,12 @@ LLVisualParamHint::~LLVisualParamHint()
LLVisualParamHint::sInstances.erase( this );
}
+//virtual
+S8 LLVisualParamHint::getType() const
+{
+ return LLViewerDynamicTexture::LL_VISUAL_PARAM_HINT ;
+}
+
//-----------------------------------------------------------------------------
// static
// requestHintUpdates()
@@ -139,22 +147,20 @@ void LLVisualParamHint::requestHintUpdates( LLVisualParamHint* exception1, LLVis
BOOL LLVisualParamHint::needsRender()
{
- return mNeedsUpdate && mDelayFrames-- <= 0 && !gAgent.getAvatarObject()->mAppearanceAnimating && mAllowsUpdates;
+ return mNeedsUpdate && mDelayFrames-- <= 0 && !gAgentAvatarp->mAppearanceAnimating && mAllowsUpdates;
}
void LLVisualParamHint::preRender(BOOL clear_depth)
{
- LLVOAvatarSelf* avatarp = gAgent.getAvatarObject();
-
mLastParamWeight = mVisualParam->getWeight();
- mVisualParam->setWeight(mVisualParamWeight, FALSE);
- avatarp->setVisualParamWeight(mVisualParam->getID(), mVisualParamWeight, FALSE);
- avatarp->setVisualParamWeight("Blink_Left", 0.f);
- avatarp->setVisualParamWeight("Blink_Right", 0.f);
- avatarp->updateComposites();
- avatarp->updateVisualParams();
- avatarp->updateGeometry(avatarp->mDrawable);
- avatarp->updateLOD();
+ mWearablePtr->setVisualParamWeight(mVisualParam->getID(), mVisualParamWeight, FALSE);
+ gAgentAvatarp->setVisualParamWeight(mVisualParam->getID(), mVisualParamWeight, FALSE);
+ gAgentAvatarp->setVisualParamWeight("Blink_Left", 0.f);
+ gAgentAvatarp->setVisualParamWeight("Blink_Right", 0.f);
+ gAgentAvatarp->updateComposites();
+ gAgentAvatarp->updateVisualParams();
+ gAgentAvatarp->updateGeometry(gAgentAvatarp->mDrawable);
+ gAgentAvatarp->updateLOD();
LLViewerDynamicTexture::preRender(clear_depth);
}
@@ -165,15 +171,17 @@ void LLVisualParamHint::preRender(BOOL clear_depth)
BOOL LLVisualParamHint::render()
{
LLVisualParamReset::sDirty = TRUE;
- LLVOAvatar* avatarp = gAgent.getAvatarObject();
+
+ gGL.pushUIMatrix();
+ gGL.loadUIIdentity();
glMatrixMode(GL_PROJECTION);
- glPushMatrix();
+ gGL.pushMatrix();
glLoadIdentity();
glOrtho(0.0f, mFullWidth, 0.0f, mFullHeight, -1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
+ gGL.pushMatrix();
glLoadIdentity();
LLGLSUIDefault gls_ui;
@@ -181,37 +189,22 @@ BOOL LLVisualParamHint::render()
mBackgroundp->draw(0, 0, mFullWidth, mFullHeight);
glMatrixMode(GL_PROJECTION);
- glPopMatrix();
+ gGL.popMatrix();
glMatrixMode(GL_MODELVIEW);
- glPopMatrix();
+ gGL.popMatrix();
mNeedsUpdate = FALSE;
mIsVisible = TRUE;
- LLViewerJointMesh* cam_target_joint = NULL;
- const std::string& cam_target_mesh_name = mVisualParam->getCameraTargetName();
- if( !cam_target_mesh_name.empty() )
- {
- cam_target_joint = (LLViewerJointMesh*)avatarp->getJoint( cam_target_mesh_name );
- }
- if( !cam_target_joint )
- {
- cam_target_joint = (LLViewerJointMesh*)gMorphView->getCameraTargetJoint();
- }
- if( !cam_target_joint )
- {
- cam_target_joint = (LLViewerJointMesh*)avatarp->getJoint("mHead");
- }
-
LLQuaternion avatar_rotation;
- LLJoint* root_joint = avatarp->getRootJoint();
+ LLJoint* root_joint = gAgentAvatarp->getRootJoint();
if( root_joint )
{
avatar_rotation = root_joint->getWorldRotation();
}
- LLVector3 target_joint_pos = cam_target_joint->getWorldPosition();
+ LLVector3 target_joint_pos = mCamTargetJoint->getWorldPosition();
LLVector3 target_offset( 0, 0, mVisualParam->getCameraElevation() );
LLVector3 target_pos = target_joint_pos + (target_offset * avatar_rotation);
@@ -227,26 +220,29 @@ BOOL LLVisualParamHint::render()
LLViewerCamera::getInstance()->setAspect((F32)mFullWidth / (F32)mFullHeight);
LLViewerCamera::getInstance()->setOriginAndLookAt(
- camera_pos, // camera
- LLVector3(0.f, 0.f, 1.f), // up
- target_pos ); // point of interest
+ camera_pos, // camera
+ LLVector3::z_axis, // up
+ target_pos ); // point of interest
LLViewerCamera::getInstance()->setPerspective(FALSE, mOrigin.mX, mOrigin.mY, mFullWidth, mFullHeight, FALSE);
- if (avatarp->mDrawable.notNull())
+ if (gAgentAvatarp->mDrawable.notNull())
{
- LLDrawPoolAvatar *avatarPoolp = (LLDrawPoolAvatar *)avatarp->mDrawable->getFace(0)->getPool();
+ LLDrawPoolAvatar *avatarPoolp = (LLDrawPoolAvatar *)gAgentAvatarp->mDrawable->getFace(0)->getPool();
LLGLDepthTest gls_depth(GL_TRUE, GL_TRUE);
gGL.setAlphaRejectSettings(LLRender::CF_ALWAYS);
gGL.setSceneBlendType(LLRender::BT_REPLACE);
- avatarPoolp->renderAvatars(avatarp); // renders only one avatar
+ avatarPoolp->renderAvatars(gAgentAvatarp); // renders only one avatar
gGL.setSceneBlendType(LLRender::BT_ALPHA);
gGL.setAlphaRejectSettings(LLRender::CF_DEFAULT);
}
- avatarp->setVisualParamWeight(mVisualParam->getID(), mLastParamWeight);
- mVisualParam->setWeight(mLastParamWeight, FALSE);
+ gAgentAvatarp->setVisualParamWeight(mVisualParam->getID(), mLastParamWeight);
+ mWearablePtr->setVisualParamWeight(mVisualParam->getID(), mLastParamWeight, FALSE);
+ gAgentAvatarp->updateVisualParams();
gGL.color4f(1,1,1,1);
mGLTexturep->setGLTextureCreated(true);
+ gGL.popUIMatrix();
+
return TRUE;
}
@@ -286,6 +282,12 @@ LLVisualParamReset::LLVisualParamReset() : LLViewerDynamicTexture(1, 1, 1, ORDER
{
}
+//virtual
+S8 LLVisualParamReset::getType() const
+{
+ return LLViewerDynamicTexture::LL_VISUAL_PARAM_RESET ;
+}
+
//-----------------------------------------------------------------------------
// render()
//-----------------------------------------------------------------------------
@@ -293,10 +295,9 @@ BOOL LLVisualParamReset::render()
{
if (sDirty)
{
- LLVOAvatarSelf* avatarp = gAgent.getAvatarObject();
- avatarp->updateComposites();
- avatarp->updateVisualParams();
- avatarp->updateGeometry(avatarp->mDrawable);
+ gAgentAvatarp->updateComposites();
+ gAgentAvatarp->updateVisualParams();
+ gAgentAvatarp->updateGeometry(gAgentAvatarp->mDrawable);
sDirty = FALSE;
}
diff --git a/indra/newview/lltoolmorph.h b/indra/newview/lltoolmorph.h
index b7df718ba2..cbab5e765f 100644
--- a/indra/newview/lltoolmorph.h
+++ b/indra/newview/lltoolmorph.h
@@ -47,6 +47,7 @@
class LLViewerJointMesh;
class LLPolyMesh;
class LLViewerObject;
+class LLJoint;
//-----------------------------------------------------------------------------
// LLVisualParamHint
@@ -62,7 +63,11 @@ public:
S32 width, S32 height,
LLViewerJointMesh *mesh,
LLViewerVisualParam *param,
- F32 param_weight);
+ LLWearable *wearable,
+ F32 param_weight,
+ LLJoint* jointp);
+
+ /*virtual*/ S8 getType() const ;
BOOL needsRender();
void preRender(BOOL clear_depth);
@@ -87,11 +92,13 @@ protected:
BOOL mIsVisible; // is this distortion hint visible?
LLViewerJointMesh* mJointMesh; // mesh that this distortion applies to
LLViewerVisualParam* mVisualParam; // visual param applied by this hint
+ LLWearable* mWearablePtr; // wearable we're editing
F32 mVisualParamWeight; // weight for this visual parameter
BOOL mAllowsUpdates; // updates are blocked unless this is true
S32 mDelayFrames; // updates are blocked for this many frames
LLRect mRect;
F32 mLastParamWeight;
+ LLJoint* mCamTargetJoint; // joint to target with preview camera
LLUIImagePtr mBackgroundp;
@@ -107,6 +114,7 @@ protected:
public:
LLVisualParamReset();
/*virtual */ BOOL render();
+ /*virtual*/ S8 getType() const ;
static BOOL sDirty;
};
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index bf1e307d71..ae244cd8a1 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -39,6 +39,7 @@
#include "llparcel.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llviewercontrol.h"
#include "llfocusmgr.h"
//#include "llfirstuse.h"
@@ -180,10 +181,10 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
parent = object->getRootEdit();
}
-
- BOOL touchable = (object && object->flagHandleTouch())
- || (parent && parent->flagHandleTouch());
-
+ if (handleMediaClick(mPick))
+ {
+ return TRUE;
+ }
// If it's a left-click, and we have a special action, do it.
if (useClickAction(mask, object, parent))
@@ -204,15 +205,15 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
// touch behavior down below...
break;
case CLICK_ACTION_SIT:
-
- if ((gAgent.getAvatarObject() != NULL) && (!gAgent.getAvatarObject()->isSitting())) // agent not already sitting
{
- handle_object_sit_or_stand();
- // put focus in world when sitting on an object
- gFocusMgr.setKeyboardFocus(NULL);
- return TRUE;
- } // else nothing (fall through to touch)
-
+ if (isAgentAvatarValid() && !gAgentAvatarp->isSitting()) // agent not already sitting
+ {
+ handle_object_sit_or_stand();
+ // put focus in world when sitting on an object
+ gFocusMgr.setKeyboardFocus(NULL);
+ return TRUE;
+ } // else nothing (fall through to touch)
+ }
case CLICK_ACTION_PAY:
if ((object && object->flagTakesMoney())
|| (parent && parent->flagTakesMoney()))
@@ -263,7 +264,7 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
if (object)
{
- gAgent.setFocusOnAvatar(FALSE, ANIMATE);
+ gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE);
LLBBox bbox = object->getBoundingBoxAgent() ;
F32 angle_of_view = llmax(0.1f, LLViewerCamera::getInstance()->getAspect() > 1.f ? LLViewerCamera::getInstance()->getView() * LLViewerCamera::getInstance()->getAspect() : LLViewerCamera::getInstance()->getView());
@@ -273,7 +274,7 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
obj_to_cam.normVec();
LLVector3d object_center_global = gAgent.getPosGlobalFromAgent(bbox.getCenterAgent());
- gAgent.setCameraPosAndFocusGlobal(object_center_global + LLVector3d(obj_to_cam * distance),
+ gAgentCamera.setCameraPosAndFocusGlobal(object_center_global + LLVector3d(obj_to_cam * distance),
object_center_global,
mPick.mObjectID );
}
@@ -285,14 +286,12 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
}
}
- if (handleMediaClick(mPick))
- {
- return TRUE;
- }
-
// put focus back "in world"
gFocusMgr.setKeyboardFocus(NULL);
+ BOOL touchable = (object && object->flagHandleTouch())
+ || (parent && parent->flagHandleTouch());
+
// Switch to grab tool if physical or triggerable
if (object &&
!object->isAvatar() &&
@@ -329,14 +328,14 @@ BOOL LLToolPie::pickLeftMouseDownCallback()
}
object = (LLViewerObject*)object->getParent();
}
- if (object && object == gAgent.getAvatarObject())
+ if (object && object == gAgentAvatarp)
{
// we left clicked on avatar, switch to focus mode
LLToolMgr::getInstance()->setTransientTool(LLToolCamera::getInstance());
gViewerWindow->hideCursor();
LLToolCamera::getInstance()->setMouseCapture(TRUE);
LLToolCamera::getInstance()->pickCallback(mPick);
- gAgent.setFocusOnAvatar(TRUE, TRUE);
+ gAgentCamera.setFocusOnAvatar(TRUE, TRUE);
return TRUE;
}
@@ -410,26 +409,28 @@ ECursorType cursor_from_object(LLViewerObject* object)
switch(click_action)
{
case CLICK_ACTION_SIT:
- if ((gAgent.getAvatarObject() != NULL) && (!gAgent.getAvatarObject()->isSitting())) // not already sitting?
{
- cursor = UI_CURSOR_HAND;
+ if (isAgentAvatarValid() && !gAgentAvatarp->isSitting()) // not already sitting?
+ {
+ cursor = UI_CURSOR_TOOLSIT;
+ }
}
break;
case CLICK_ACTION_BUY:
- cursor = UI_CURSOR_HAND;
+ cursor = UI_CURSOR_TOOLBUY;
break;
case CLICK_ACTION_OPEN:
// Open always opens the parent.
if (parent && parent->allowOpen())
{
- cursor = UI_CURSOR_HAND;
+ cursor = UI_CURSOR_TOOLOPEN;
}
break;
case CLICK_ACTION_PAY:
if ((object && object->flagTakesMoney())
|| (parent && parent->flagTakesMoney()))
{
- cursor = UI_CURSOR_HAND;
+ cursor = UI_CURSOR_TOOLBUY;
}
break;
case CLICK_ACTION_ZOOM:
@@ -496,6 +497,8 @@ void LLToolPie::selectionPropertiesReceived()
BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
{
mHoverPick = gViewerWindow->pickImmediate(x, y, FALSE);
+ // perform a separate pick that detects transparent objects since they respond to 1-click actions
+ LLPickInfo click_action_pick = gViewerWindow->pickImmediate(x, y, TRUE);
// Show screen-space highlight glow effect
bool show_highlight = false;
@@ -507,21 +510,23 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask)
parent = object->getRootEdit();
}
- if (object && useClickAction(mask, object, parent))
+ LLViewerObject* click_action_object = click_action_pick.getObject();
+ if (handleMediaHover(mHoverPick))
{
+ // *NOTE: If you think the hover glow conflicts with the media outline, you
+ // could disable it here.
show_highlight = true;
- ECursorType cursor = cursor_from_object(object);
- gViewerWindow->setCursor(cursor);
+ // cursor set by media object
lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl;
}
- else if (handleMediaHover(mHoverPick))
+ else if (click_action_object && useClickAction(mask, click_action_object, click_action_object->getRootEdit()))
{
- // *NOTE: If you think the hover glow conflicts with the media outline, you
- // could disable it here.
show_highlight = true;
- // cursor set by media object
+ ECursorType cursor = cursor_from_object(click_action_object);
+ gViewerWindow->setCursor(cursor);
lldebugst(LLERR_USER_INPUT) << "hover handled by LLToolPie (inactive)" << llendl;
}
+
else if ((object && !object->isAvatar() && object->usePhysics())
|| (parent && !parent->isAvatar() && parent->usePhysics()))
{
@@ -592,7 +597,7 @@ BOOL LLToolPie::handleMouseUp(S32 x, S32 y, MASK mask)
mGrabMouseButtonDown = FALSE;
LLToolMgr::getInstance()->clearTransientTool();
- gAgent.setLookAt(LOOKAT_TARGET_CONVERSATION, obj); // maybe look at object/person clicked on
+ gAgentCamera.setLookAt(LOOKAT_TARGET_CONVERSATION, obj); // maybe look at object/person clicked on
return LLTool::handleMouseUp(x, y, mask);
}
@@ -901,6 +906,16 @@ BOOL LLToolPie::handleTooltipObject( LLViewerObject* hover_object, std::string l
|| !existing_inspector->getVisible()
|| existing_inspector->getKey()["object_id"].asUUID() != hover_object->getID()))
{
+
+ // Add price to tooltip for items on sale
+ bool for_sale = for_sale_selection(nodep);
+ if(for_sale)
+ {
+ LLStringUtil::format_map_t args;
+ args["[PRICE]"] = llformat ("%d", nodep->mSaleInfo.getSalePrice());
+ tooltip_msg.append(LLTrans::getString("TooltipPrice", args) );
+ }
+
if (nodep->mName.empty())
{
tooltip_msg.append(LLTrans::getString("TooltipNoName"));
@@ -931,7 +946,7 @@ BOOL LLToolPie::handleTooltipObject( LLViewerObject* hover_object, std::string l
if (media_impl.notNull() && (media_impl->hasMedia()))
{
is_media_displaying = true;
- LLStringUtil::format_map_t args;
+ //LLStringUtil::format_map_t args;
media_plugin = media_impl->getMediaPlugin();
if(media_plugin)
@@ -955,10 +970,13 @@ BOOL LLToolPie::handleTooltipObject( LLViewerObject* hover_object, std::string l
}
}
- // Avoid showing tip over media that's displaying
+
+ // Avoid showing tip over media that's displaying unless it's for sale
// also check the primary node since sometimes it can have an action even though
// the root node doesn't
- bool needs_tip = !is_media_displaying &&
+
+ bool needs_tip = (!is_media_displaying ||
+ for_sale) &&
(has_media ||
needs_tooltip(nodep) ||
needs_tooltip(LLSelectMgr::getInstance()->getPrimaryHoverNode()));
@@ -1249,6 +1267,7 @@ bool LLToolPie::handleMediaClick(const LLPickInfo& pick)
if (!parcel ||
objectp.isNull() ||
+ objectp->isHUDAttachment() ||
pick.mObjectFace < 0 ||
pick.mObjectFace >= objectp->getNumTEs())
{
@@ -1263,11 +1282,10 @@ bool LLToolPie::handleMediaClick(const LLPickInfo& pick)
return false;
LLMediaEntry* mep = (tep->hasMedia()) ? tep->getMediaData() : NULL;
-
if(!mep)
return false;
- viewer_media_t media_impl = mep ? LLViewerMedia::getMediaImplFromTextureID(mep->getMediaID()) : NULL;
+ viewer_media_t media_impl = LLViewerMedia::getMediaImplFromTextureID(mep->getMediaID());
if (gSavedSettings.getBOOL("MediaOnAPrimUI"))
{
@@ -1485,6 +1503,12 @@ BOOL LLToolPie::pickRightMouseDownCallback()
while( object && object->isAttachment())
{
object = (LLViewerObject*)object->getParent();
+ llassert(object);
+ }
+
+ if (!object)
+ {
+ return TRUE; // unexpected, but escape
}
// Object is an avatar, so check for mute by id.
diff --git a/indra/newview/lltoolplacer.cpp b/indra/newview/lltoolplacer.cpp
index 612bcc03bd..91f01f0b36 100644
--- a/indra/newview/lltoolplacer.cpp
+++ b/indra/newview/lltoolplacer.cpp
@@ -56,11 +56,13 @@
#include "llvolumemessage.h"
#include "llhudmanager.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llaudioengine.h"
#include "llhudeffecttrail.h"
#include "llviewerobjectlist.h"
#include "llviewercamera.h"
#include "llviewerstats.h"
+#include "llvoavatarself.h"
// linden library headers
#include "llprimitive.h"
@@ -120,7 +122,7 @@ BOOL LLToolPlacer::raycastForNewObjPos( S32 x, S32 y, LLViewerObject** hit_obj,
}
// Make sure the surface isn't too far away.
- LLVector3d ray_start_global = gAgent.getCameraPositionGlobal();
+ LLVector3d ray_start_global = gAgentCamera.getCameraPositionGlobal();
F32 dist_to_surface_sq = (F32)((surface_pos_global - ray_start_global).magVecSquared());
if( dist_to_surface_sq > (max_dist_from_camera * max_dist_from_camera) )
{
@@ -432,7 +434,7 @@ BOOL LLToolPlacer::addObject( LLPCode pcode, S32 x, S32 y, U8 use_physics )
// VEFFECT: AddObject
LLHUDEffectSpiral *effectp = (LLHUDEffectSpiral *)LLHUDManager::getInstance()->createViewerEffect(LLHUDObject::LL_HUD_EFFECT_BEAM, TRUE);
- effectp->setSourceObject((LLViewerObject*)gAgent.getAvatarObject());
+ effectp->setSourceObject((LLViewerObject*)gAgentAvatarp);
effectp->setPositionGlobal(regionp->getPosGlobalFromRegion(ray_end_region));
effectp->setDuration(LL_HUD_DUR_SHORT);
effectp->setColor(LLColor4U(gAgent.getEffectColor()));
diff --git a/indra/newview/lltoolselect.cpp b/indra/newview/lltoolselect.cpp
index 97e2865179..2065ba1791 100644
--- a/indra/newview/lltoolselect.cpp
+++ b/indra/newview/lltoolselect.cpp
@@ -35,6 +35,7 @@
#include "lltoolselect.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llviewercontrol.h"
#include "lldrawable.h"
#include "llmanip.h"
@@ -167,9 +168,9 @@ LLObjectSelectionHandle LLToolSelect::handleObjectSelection(const LLPickInfo& pi
LLSelectMgr::getInstance()->setAgentHUDZoom(target_zoom, current_zoom);
}
- if (!gAgent.getFocusOnAvatar() && // if camera not glued to avatar
- LLVOAvatar::findAvatarFromAttachment(object) != gAgent.getAvatarObject() && // and it's not one of your attachments
- object != gAgent.getAvatarObject()) // and it's not you
+ if (!gAgentCamera.getFocusOnAvatar() && // if camera not glued to avatar
+ LLVOAvatar::findAvatarFromAttachment(object) != gAgentAvatarp && // and it's not one of your attachments
+ object != gAgentAvatarp) // and it's not you
{
// have avatar turn to face the selected object(s)
LLVector3d selection_center = LLSelectMgr::getInstance()->getSelectionCenterGlobal();
diff --git a/indra/newview/lltracker.cpp b/indra/newview/lltracker.cpp
index 407cc23d0d..cc074287c4 100644
--- a/indra/newview/lltracker.cpp
+++ b/indra/newview/lltracker.cpp
@@ -39,6 +39,7 @@
#include "llgl.h"
#include "llrender.h"
#include "llinventory.h"
+#include "llinventorydefines.h"
#include "llpointer.h"
#include "llstring.h"
#include "lluuid.h"
@@ -50,6 +51,7 @@
#include "llappviewer.h"
#include "lltracker.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llcallingcard.h"
#include "llfloaterworldmap.h"
#include "llhudtext.h"
@@ -480,14 +482,14 @@ void LLTracker::renderBeacon(LLVector3d pos_global,
const std::string& label )
{
sCheesyBeacon = gSavedSettings.getBOOL("CheesyBeacon");
- LLVector3d to_vec = pos_global - gAgent.getCameraPositionGlobal();
+ LLVector3d to_vec = pos_global - gAgentCamera.getCameraPositionGlobal();
F32 dist = (F32)to_vec.magVec();
F32 color_frac = 1.f;
if (dist > 0.99f * LLViewerCamera::getInstance()->getFar())
{
color_frac = 0.4f;
- // pos_global = gAgent.getCameraPositionGlobal() + 0.99f*(LLViewerCamera::getInstance()->getFar()/dist)*to_vec;
+ // pos_global = gAgentCamera.getCameraPositionGlobal() + 0.99f*(LLViewerCamera::getInstance()->getFar()/dist)*to_vec;
}
else
{
@@ -741,10 +743,10 @@ void LLTracker::setLandmarkVisited()
LLInventoryItem* i = gInventory.getItem( mTrackedLandmarkItemID );
LLViewerInventoryItem* item = (LLViewerInventoryItem*)i;
if ( item
- && !(item->getFlags()&LLInventoryItem::II_FLAGS_LANDMARK_VISITED))
+ && !(item->getFlags()&LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED))
{
U32 flags = item->getFlags();
- flags |= LLInventoryItem::II_FLAGS_LANDMARK_VISITED;
+ flags |= LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED;
item->setFlags(flags);
LLMessageSystem* msg = gMessageSystem;
msg->newMessage("ChangeInventoryItemFlags");
@@ -797,7 +799,7 @@ void LLTracker::cacheLandmarkPosition()
mLandmarkHasBeenVisited = FALSE;
LLInventoryItem* item = gInventory.getItem(mTrackedLandmarkItemID);
if ( item
- && item->getFlags()&LLInventoryItem::II_FLAGS_LANDMARK_VISITED)
+ && item->getFlags()&LLInventoryItemFlags::II_FLAGS_LANDMARK_VISITED)
{
mLandmarkHasBeenVisited = TRUE;
}
diff --git a/indra/newview/lluploaddialog.cpp b/indra/newview/lluploaddialog.cpp
index 577b5952e5..22c7d670f8 100644
--- a/indra/newview/lluploaddialog.cpp
+++ b/indra/newview/lluploaddialog.cpp
@@ -91,7 +91,7 @@ LLUploadDialog::LLUploadDialog( const std::string& msg)
setMessage(msg);
// The dialog view is a root view
- gFocusMgr.setTopCtrl( this );
+ gViewerWindow->addPopup(this);
}
void LLUploadDialog::setMessage( const std::string& msg)
diff --git a/indra/newview/llurl.cpp b/indra/newview/llurl.cpp
index ab65ead4c5..83a5839a93 100644
--- a/indra/newview/llurl.cpp
+++ b/indra/newview/llurl.cpp
@@ -286,5 +286,11 @@ const char * LLURL::getFullPath()
return(sReturnString);
}
+const char * LLURL::getAuthority()
+{
+ strncpy(LLURL::sReturnString,mAuthority, LL_MAX_PATH -1); /* Flawfinder: ignore */
+ LLURL::sReturnString[LL_MAX_PATH -1] = '\0';
+ return(sReturnString);
+}
char LLURL::sReturnString[LL_MAX_PATH] = "";
diff --git a/indra/newview/llurl.h b/indra/newview/llurl.h
index 9a089dd835..e41b83d29f 100644
--- a/indra/newview/llurl.h
+++ b/indra/newview/llurl.h
@@ -79,6 +79,7 @@ public:
virtual const char *getFQURL() const;
virtual const char *getFullPath();
+ virtual const char *getAuthority();
virtual const char *updateRelativePath(const LLURL &url);
diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp
index 0b6bd4b401..cbaa7248a2 100644
--- a/indra/newview/llurldispatcher.cpp
+++ b/indra/newview/llurldispatcher.cpp
@@ -4,7 +4,7 @@
*
* $LicenseInfo:firstyear=2007&license=viewergpl$
*
- * Copyright (c) 2007-2009, Linden Research, Inc.
+ * Copyright (c) 2010, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
@@ -12,13 +12,12 @@
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * online at http://secondlife.com/developers/opensource/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * online at http://secondlife.com/developers/opensource/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
@@ -45,10 +44,10 @@
#include "llsidetray.h"
#include "llslurl.h"
#include "llstartup.h" // gStartupState
-#include "llurlsimstring.h"
#include "llweb.h"
#include "llworldmapmessage.h"
#include "llurldispatcherlistener.h"
+#include "llviewernetwork.h"
// library includes
#include "llnotificationsutil.h"
@@ -59,25 +58,25 @@ static LLURLDispatcherListener sURLDispatcherListener;
class LLURLDispatcherImpl
{
public:
- static bool dispatch(const std::string& url,
+ static bool dispatch(const LLSLURL& slurl,
LLMediaCtrl* web,
bool trusted_browser);
// returns true if handled or explicitly blocked.
- static bool dispatchRightClick(const std::string& url);
+ static bool dispatchRightClick(const LLSLURL& slurl);
private:
- static bool dispatchCore(const std::string& url,
+ static bool dispatchCore(const LLSLURL& slurl,
bool right_mouse,
LLMediaCtrl* web,
bool trusted_browser);
// handles both left and right click
- static bool dispatchHelp(const std::string& url, bool right_mouse);
+ static bool dispatchHelp(const LLSLURL& slurl, bool right_mouse);
// Handles sl://app.floater.html.help by showing Help floater.
// Returns true if handled.
- static bool dispatchApp(const std::string& url,
+ static bool dispatchApp(const LLSLURL& slurl,
bool right_mouse,
LLMediaCtrl* web,
bool trusted_browser);
@@ -85,16 +84,16 @@ private:
// by showing panel in Search floater.
// Returns true if handled or explicitly blocked.
- static bool dispatchRegion(const std::string& url, bool right_mouse);
+ static bool dispatchRegion(const LLSLURL& slurl, bool right_mouse);
// handles secondlife://Ahern/123/45/67/
// Returns true if handled.
- static void regionHandleCallback(U64 handle, const std::string& url,
+ static void regionHandleCallback(U64 handle, const LLSLURL& slurl,
const LLUUID& snapshot_id, bool teleport);
// Called by LLWorldMap when a location has been resolved to a
// region name
- static void regionNameCallback(U64 handle, const std::string& url,
+ static void regionNameCallback(U64 handle, const LLSLURL& slurl,
const LLUUID& snapshot_id, bool teleport);
// Called by LLWorldMap when a region name has been resolved to a
// location in-world, used by places-panel display.
@@ -103,65 +102,58 @@ private:
};
// static
-bool LLURLDispatcherImpl::dispatchCore(const std::string& url,
+bool LLURLDispatcherImpl::dispatchCore(const LLSLURL& slurl,
bool right_mouse,
LLMediaCtrl* web,
bool trusted_browser)
{
- if (url.empty()) return false;
- //if (dispatchHelp(url, right_mouse)) return true;
- if (dispatchApp(url, right_mouse, web, trusted_browser)) return true;
- if (dispatchRegion(url, right_mouse)) return true;
+ //if (dispatchHelp(slurl, right_mouse)) return true;
+ switch(slurl.getType())
+ {
+ case LLSLURL::APP:
+ return dispatchApp(slurl, right_mouse, web, trusted_browser);
+ case LLSLURL::LOCATION:
+ return dispatchRegion(slurl, right_mouse);
+ default:
+ return false;
+ }
/*
// Inform the user we can't handle this
std::map<std::string, std::string> args;
- args["SLURL"] = url;
+ args["SLURL"] = slurl;
r;
*/
-
- return false;
}
// static
-bool LLURLDispatcherImpl::dispatch(const std::string& url,
+bool LLURLDispatcherImpl::dispatch(const LLSLURL& slurl,
LLMediaCtrl* web,
bool trusted_browser)
{
- llinfos << "url: " << url << llendl;
const bool right_click = false;
- return dispatchCore(url, right_click, web, trusted_browser);
+ return dispatchCore(slurl, right_click, web, trusted_browser);
}
// static
-bool LLURLDispatcherImpl::dispatchRightClick(const std::string& url)
+bool LLURLDispatcherImpl::dispatchRightClick(const LLSLURL& slurl)
{
- llinfos << "url: " << url << llendl;
const bool right_click = true;
LLMediaCtrl* web = NULL;
const bool trusted_browser = false;
- return dispatchCore(url, right_click, web, trusted_browser);
+ return dispatchCore(slurl, right_click, web, trusted_browser);
}
// static
-bool LLURLDispatcherImpl::dispatchApp(const std::string& url,
+bool LLURLDispatcherImpl::dispatchApp(const LLSLURL& slurl,
bool right_mouse,
LLMediaCtrl* web,
bool trusted_browser)
{
- // ensure the URL is in the secondlife:///app/ format
- if (!LLSLURL::isSLURLCommand(url))
- {
- return false;
- }
-
- LLURI uri(url);
- LLSD pathArray = uri.pathArray();
- pathArray.erase(0); // erase "app"
- std::string cmd = pathArray.get(0);
- pathArray.erase(0); // erase "cmd"
+ llinfos << "cmd: " << slurl.getAppCmd() << " path: " << slurl.getAppPath() << " query: " << slurl.getAppQuery() << llendl;
+ const LLSD& query_map = LLURI::queryMap(slurl.getAppQuery());
bool handled = LLCommandDispatcher::dispatch(
- cmd, pathArray, uri.queryMap(), web, trusted_browser);
+ slurl.getAppCmd(), slurl.getAppPath(), query_map, web, trusted_browser);
// alert if we didn't handle this secondlife:///app/ SLURL
// (but still return true because it is a valid app SLURL)
@@ -173,109 +165,73 @@ bool LLURLDispatcherImpl::dispatchApp(const std::string& url,
}
// static
-bool LLURLDispatcherImpl::dispatchRegion(const std::string& url, bool right_mouse)
+bool LLURLDispatcherImpl::dispatchRegion(const LLSLURL& slurl, bool right_mouse)
{
- if (!LLSLURL::isSLURL(url))
- {
- return false;
- }
-
+ if(slurl.getType() != LLSLURL::LOCATION)
+ {
+ return false;
+ }
// Before we're logged in, need to update the startup screen
// to tell the user where they are going.
if (LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP)
{
- // Parse it and stash in globals, it will be dispatched in
- // STATE_CLEANUP.
- LLURLSimString::setString(url);
// We're at the login screen, so make sure user can see
// the login location box to know where they are going.
- LLPanelLogin::refreshLocation( true );
+ LLPanelLogin::setLocation(slurl);
return true;
}
- std::string sim_string = LLSLURL::stripProtocol(url);
- std::string region_name;
- S32 x = 128;
- S32 y = 128;
- S32 z = 0;
- LLURLSimString::parse(sim_string, &region_name, &x, &y, &z);
-
// LLFloaterURLDisplay functionality moved to LLPanelPlaces in Side Tray.
- //LLFloaterURLDisplay* url_displayp = LLFloaterReg::getTypedInstance<LLFloaterURLDisplay>("preview_url",LLSD());
- //if(url_displayp) url_displayp->setName(region_name);
+ //LLFloaterURLDisplay* slurl_displayp = LLFloaterReg::getTypedInstance<LLFloaterURLDisplay>("preview_url",LLSD());
+ //if(slurl_displayp) slurl_displayp->setName(region_name);
// Request a region handle by name
- LLWorldMapMessage::getInstance()->sendNamedRegionRequest(region_name,
+ LLWorldMapMessage::getInstance()->sendNamedRegionRequest(slurl.getRegion(),
LLURLDispatcherImpl::regionNameCallback,
- url,
+ slurl.getSLURLString(),
false); // don't teleport
return true;
}
/*static*/
-void LLURLDispatcherImpl::regionNameCallback(U64 region_handle, const std::string& url, const LLUUID& snapshot_id, bool teleport)
+void LLURLDispatcherImpl::regionNameCallback(U64 region_handle, const LLSLURL& slurl, const LLUUID& snapshot_id, bool teleport)
{
- std::string sim_string = LLSLURL::stripProtocol(url);
- std::string region_name;
- S32 x = 128;
- S32 y = 128;
- S32 z = 0;
- LLURLSimString::parse(sim_string, &region_name, &x, &y, &z);
-
- LLVector3 local_pos;
- local_pos.mV[VX] = (F32)x;
- local_pos.mV[VY] = (F32)y;
- local_pos.mV[VZ] = (F32)z;
+
+ if(slurl.getType() == LLSLURL::LOCATION)
+ {
+ regionHandleCallback(region_handle, slurl, snapshot_id, teleport);
+ }
+}
-
- // determine whether the point is in this region
- if ((x >= 0) && (x < REGION_WIDTH_UNITS) &&
- (y >= 0) && (y < REGION_WIDTH_UNITS))
- {
- // if so, we're done
- regionHandleCallback(region_handle, url, snapshot_id, teleport);
- }
+/* static */
+void LLURLDispatcherImpl::regionHandleCallback(U64 region_handle, const LLSLURL& slurl, const LLUUID& snapshot_id, bool teleport)
+{
- else
+ // we can't teleport cross grid at this point
+ if((!LLGridManager::getInstance()->isSystemGrid(slurl.getGrid()) || !LLGridManager::getInstance()->isSystemGrid()) &&
+ (slurl.getGrid() != LLGridManager::getInstance()->getGrid()))
{
- // otherwise find the new region from the location
+ LLSD args;
+ args["SLURL"] = slurl.getLocationString();
+ args["CURRENT_GRID"] = LLGridManager::getInstance()->getGridLabel();
+ LLSD grid_info;
+ LLGridManager::getInstance()->getGridInfo(slurl.getGrid(), grid_info);
- // add the position to get the new region
- LLVector3d global_pos = from_region_handle(region_handle) + LLVector3d(local_pos);
-
- U64 new_region_handle = to_region_handle(global_pos);
- LLWorldMapMessage::getInstance()->sendHandleRegionRequest(new_region_handle,
- LLURLDispatcherImpl::regionHandleCallback,
- url, teleport);
+ if(grid_info.has(GRID_LABEL_VALUE))
+ {
+ args["GRID"] = grid_info[GRID_LABEL_VALUE].asString();
+ }
+ else
+ {
+ args["GRID"] = slurl.getGrid();
+ }
+ LLNotificationsUtil::add("CantTeleportToGrid", args);
+ return;
}
-}
-
-/* static */
-void LLURLDispatcherImpl::regionHandleCallback(U64 region_handle, const std::string& url, const LLUUID& snapshot_id, bool teleport)
-{
- std::string sim_string = LLSLURL::stripProtocol(url);
- std::string region_name;
- S32 x = 128;
- S32 y = 128;
- S32 z = 0;
- LLURLSimString::parse(sim_string, &region_name, &x, &y, &z);
-
- // remap x and y to local coordinates
- S32 local_x = x % REGION_WIDTH_UNITS;
- S32 local_y = y % REGION_WIDTH_UNITS;
- if (local_x < 0)
- local_x += REGION_WIDTH_UNITS;
- if (local_y < 0)
- local_y += REGION_WIDTH_UNITS;
- LLVector3 local_pos;
- local_pos.mV[VX] = (F32)local_x;
- local_pos.mV[VY] = (F32)local_y;
- local_pos.mV[VZ] = (F32)z;
-
LLVector3d global_pos = from_region_handle(region_handle);
- global_pos += LLVector3d(local_pos);
+ global_pos += LLVector3d(slurl.getPosition());
if (teleport)
{
@@ -299,8 +255,8 @@ void LLURLDispatcherImpl::regionHandleCallback(U64 region_handle, const std::str
// LLFloaterURLDisplay functionality moved to LLPanelPlaces in Side Tray.
// // display informational floater, allow user to click teleport btn
-// LLFloaterURLDisplay* url_displayp = LLFloaterReg::getTypedInstance<LLFloaterURLDisplay>("preview_url",LLSD());
-// if(url_displayp)
+// LLFloaterURLDisplay* slurl_displayp = LLFloaterReg::getTypedInstance<LLFloaterURLDisplay>("preview_url",LLSD());
+// if(slurl_displayp)
// {
// url_displayp->displayParcelInfo(region_handle, local_pos);
// if(snapshot_id.notNull())
@@ -315,7 +271,7 @@ void LLURLDispatcherImpl::regionHandleCallback(U64 region_handle, const std::str
//---------------------------------------------------------------------------
// Teleportation links are handled here because they are tightly coupled
-// to URL parsing and sim-fragment parsing
+// to SLURL parsing and sim-fragment parsing
class LLTeleportHandler : public LLCommandHandler
{
public:
@@ -331,18 +287,21 @@ public:
// a global position, and teleport to it
if (tokens.size() < 1) return false;
- // Region names may be %20 escaped.
- std::string region_name = LLURLSimString::unescapeRegionName(tokens[0]);
-
- // build secondlife://De%20Haro/123/45/67 for use in callback
- std::string url = LLSLURL::PREFIX_SECONDLIFE;
- for (int i = 0; i < tokens.size(); ++i)
+ LLVector3 coords(128, 128, 0);
+ if (tokens.size() <= 4)
{
- url += tokens[i].asString() + "/";
+ coords = LLVector3(tokens[1].asReal(),
+ tokens[2].asReal(),
+ tokens[3].asReal());
}
+
+ // Region names may be %20 escaped.
+
+ std::string region_name = LLURI::unescape(tokens[0]);
+
LLWorldMapMessage::getInstance()->sendNamedRegionRequest(region_name,
LLURLDispatcherImpl::regionHandleCallback,
- url,
+ LLSLURL(region_name, coords).getSLURLString(),
true); // teleport
return true;
}
@@ -352,21 +311,21 @@ LLTeleportHandler gTeleportHandler;
//---------------------------------------------------------------------------
// static
-bool LLURLDispatcher::dispatch(const std::string& url,
+bool LLURLDispatcher::dispatch(const std::string& slurl,
LLMediaCtrl* web,
bool trusted_browser)
{
- return LLURLDispatcherImpl::dispatch(url, web, trusted_browser);
+ return LLURLDispatcherImpl::dispatch(LLSLURL(slurl), web, trusted_browser);
}
// static
-bool LLURLDispatcher::dispatchRightClick(const std::string& url)
+bool LLURLDispatcher::dispatchRightClick(const std::string& slurl)
{
- return LLURLDispatcherImpl::dispatchRightClick(url);
+ return LLURLDispatcherImpl::dispatchRightClick(LLSLURL(slurl));
}
// static
-bool LLURLDispatcher::dispatchFromTextEditor(const std::string& url)
+bool LLURLDispatcher::dispatchFromTextEditor(const std::string& slurl)
{
// *NOTE: Text editors are considered sources of trusted URLs
// in order to make avatar profile links in chat history work.
@@ -376,5 +335,7 @@ bool LLURLDispatcher::dispatchFromTextEditor(const std::string& url)
// *TODO: Make this trust model more refined. JC
const bool trusted_browser = true;
LLMediaCtrl* web = NULL;
- return LLURLDispatcherImpl::dispatch(url, web, trusted_browser);
+ return LLURLDispatcherImpl::dispatch(LLSLURL(slurl), web, trusted_browser);
}
+
+
diff --git a/indra/newview/llurldispatcher.h b/indra/newview/llurldispatcher.h
index ff8a351253..407e417e58 100644
--- a/indra/newview/llurldispatcher.h
+++ b/indra/newview/llurldispatcher.h
@@ -2,9 +2,9 @@
* @file llurldispatcher.h
* @brief Central registry for all SL URL handlers
*
- * $LicenseInfo:firstyear=2007&license=viewergpl$
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
*
- * Copyright (c) 2007-2009, Linden Research, Inc.
+ * Copyright (c) 2007-2010, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
@@ -12,13 +12,12 @@
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * online at http://secondlife.com/developers/opensource/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * online at http://secondlife.com/developers/opensource/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
@@ -31,16 +30,16 @@
*/
#ifndef LLURLDISPATCHER_H
#define LLURLDISPATCHER_H
-
class LLMediaCtrl;
class LLURLDispatcher
{
public:
- static bool dispatch(const std::string& url,
+
+ static bool dispatch(const std::string& slurl,
LLMediaCtrl* web,
- bool trusted_browser);
+ bool trusted_browser);
// At startup time and on clicks in internal web browsers,
// teleport, open map, or run requested command.
// @param url
@@ -54,9 +53,9 @@ public:
// that navigates to trusted (Linden Lab) pages.
// Returns true if someone handled the URL.
- static bool dispatchRightClick(const std::string& url);
+ static bool dispatchRightClick(const std::string& slurl);
- static bool dispatchFromTextEditor(const std::string& url);
+ static bool dispatchFromTextEditor(const std::string& slurl);
};
#endif
diff --git a/indra/newview/llurllineeditorctrl.cpp b/indra/newview/llurllineeditorctrl.cpp
index 258c3ddd75..8488527185 100644
--- a/indra/newview/llurllineeditorctrl.cpp
+++ b/indra/newview/llurllineeditorctrl.cpp
@@ -72,7 +72,7 @@ void LLURLLineEditor::cut()
if( need_to_rollback )
{
rollback.doRollback( this );
- reportBadKeystroke();
+ LLUI::reportBadKeystroke();
}
else
if( mKeystrokeCallback )
@@ -89,15 +89,10 @@ void LLURLLineEditor::copyEscapedURLToClipboard()
const std::string unescaped_text = wstring_to_utf8str(mText.getWString().substr(left_pos, length));
LLWString text_to_copy;
- if (LLSLURL::isSLURL(unescaped_text))
+ if (LLSLURL(unescaped_text).isValid())
text_to_copy = utf8str_to_wstring(LLWeb::escapeURL(unescaped_text));
else
text_to_copy = utf8str_to_wstring(unescaped_text);
gClipboard.copyFromString( text_to_copy );
}
-// Makes UISndBadKeystroke sound
-void LLURLLineEditor::reportBadKeystroke()
-{
- make_ui_sound("UISndBadKeystroke");
-}
diff --git a/indra/newview/llurllineeditorctrl.h b/indra/newview/llurllineeditorctrl.h
index 618f29dfbf..ebe417e855 100644
--- a/indra/newview/llurllineeditorctrl.h
+++ b/indra/newview/llurllineeditorctrl.h
@@ -55,8 +55,6 @@ protected:
private:
// util function to escape selected text and copy it to clipboard
void copyEscapedURLToClipboard();
- // send a beep signal if keystroke is bad. As it is private at LLLineEditor we need own function
- void reportBadKeystroke();
// Helper class to do rollback if needed
class LLURLLineEditorRollback
diff --git a/indra/newview/llviewerassetstorage.cpp b/indra/newview/llviewerassetstorage.cpp
index bb49804aff..c3a6b7111b 100644
--- a/indra/newview/llviewerassetstorage.cpp
+++ b/indra/newview/llviewerassetstorage.cpp
@@ -41,15 +41,16 @@
#include "llagent.h"
LLViewerAssetStorage::LLViewerAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,
- LLVFS *vfs, const LLHost &upstream_host)
- : LLAssetStorage(msg, xfer, vfs, upstream_host)
+ LLVFS *vfs, LLVFS *static_vfs,
+ const LLHost &upstream_host)
+ : LLAssetStorage(msg, xfer, vfs, static_vfs, upstream_host)
{
}
LLViewerAssetStorage::LLViewerAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,
- LLVFS *vfs)
- : LLAssetStorage(msg, xfer, vfs)
+ LLVFS *vfs, LLVFS *static_vfs)
+ : LLAssetStorage(msg, xfer, vfs, static_vfs)
{
}
diff --git a/indra/newview/llviewerassetstorage.h b/indra/newview/llviewerassetstorage.h
index 512b590a1b..8e7ea3471d 100644
--- a/indra/newview/llviewerassetstorage.h
+++ b/indra/newview/llviewerassetstorage.h
@@ -42,10 +42,10 @@ class LLViewerAssetStorage : public LLAssetStorage
{
public:
LLViewerAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,
- LLVFS *vfs, const LLHost &upstream_host);
+ LLVFS *vfs, LLVFS *static_vfs, const LLHost &upstream_host);
LLViewerAssetStorage(LLMessageSystem *msg, LLXferManager *xfer,
- LLVFS *vfs);
+ LLVFS *vfs, LLVFS *static_vfs);
using LLAssetStorage::storeAssetData;
virtual void storeAssetData(
diff --git a/indra/newview/llviewerattachmenu.cpp b/indra/newview/llviewerattachmenu.cpp
new file mode 100644
index 0000000000..f7f5ec72fd
--- /dev/null
+++ b/indra/newview/llviewerattachmenu.cpp
@@ -0,0 +1,139 @@
+/**
+ * @file llviewerattachmenu.cpp
+ * @brief "Attach to" / "Attach to HUD" submenus.
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llviewerattachmenu.h"
+
+// project includes
+#include "llagent.h"
+#include "llinventorybridge.h" // for rez_attachment()
+#include "llinventorymodel.h"
+#include "llviewerinventory.h"
+#include "llviewermenu.h" // for gMenuHolder
+#include "llvoavatarself.h"
+
+// linden libraries
+#include "llmenugl.h"
+#include "lltrans.h"
+
+// static
+void LLViewerAttachMenu::populateMenus(const std::string& attach_to_menu_name, const std::string& attach_to_hud_menu_name)
+{
+ // *TODO: share this code with other similar menus
+ // (inventory panel context menu, in-world object menu).
+
+ if (attach_to_menu_name.empty() || attach_to_hud_menu_name.empty() || !isAgentAvatarValid()) return;
+
+ LLContextMenu* attach_menu = gMenuHolder->getChild<LLContextMenu>(attach_to_menu_name);
+ LLContextMenu* attach_hud_menu = gMenuHolder->getChild<LLContextMenu>(attach_to_hud_menu_name);
+
+ if (!attach_menu || attach_menu->getChildCount() != 0 ||
+ !attach_hud_menu || attach_hud_menu->getChildCount() != 0)
+ {
+ return;
+ }
+
+ // Populate "Attach to..." / "Attach to HUD..." submenus.
+ for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin();
+ iter != gAgentAvatarp->mAttachmentPoints.end(); )
+ {
+ LLVOAvatar::attachment_map_t::iterator curiter = iter++;
+ LLViewerJointAttachment* attachment = curiter->second;
+ LLMenuItemCallGL::Params p;
+ std::string submenu_name = attachment->getName();
+ std::string translated_submenu_name;
+
+ if (LLTrans::findString(translated_submenu_name, submenu_name))
+ {
+ p.name = (" ") + translated_submenu_name + " ";
+ }
+ else
+ {
+ p.name = submenu_name;
+ }
+
+ LLSD cbparams;
+ cbparams["index"] = curiter->first;
+ cbparams["label"] = attachment->getName();
+ p.on_click.function_name = "Object.Attach";
+ p.on_click.parameter = LLSD(attachment->getName());
+ p.on_enable.function_name = "Attachment.Label";
+ p.on_enable.parameter = cbparams;
+
+ LLMenuItemCallGL* item = LLUICtrlFactory::create<LLMenuItemCallGL>(p);
+ LLView* parent_menu = attachment->getIsHUDAttachment() ? attach_hud_menu : attach_menu;
+ parent_menu->addChild(item);
+ }
+}
+
+// static
+void LLViewerAttachMenu::attachObjects(const uuid_vec_t& items, const std::string& joint_name)
+{
+ LLViewerJointAttachment* attachmentp = NULL;
+ for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin();
+ iter != gAgentAvatarp->mAttachmentPoints.end(); )
+ {
+ LLVOAvatar::attachment_map_t::iterator curiter = iter++;
+ LLViewerJointAttachment* attachment = curiter->second;
+ if (attachment->getName() == joint_name)
+ {
+ attachmentp = attachment;
+ break;
+ }
+ }
+ if (attachmentp == NULL)
+ {
+ return;
+ }
+
+ for (uuid_vec_t::const_iterator it = items.begin(); it != items.end(); ++it)
+ {
+ const LLUUID &id = *it;
+ LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getLinkedItem(id);
+ if(item && gInventory.isObjectDescendentOf(id, gInventory.getRootFolderID()))
+ {
+ rez_attachment(item, attachmentp);
+ }
+ else if(item && item->isFinished())
+ {
+ // must be in library. copy it to our inventory and put it on.
+ LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(attachmentp);
+ copy_inventory_item(gAgent.getID(),
+ item->getPermissions().getOwner(),
+ item->getUUID(),
+ LLUUID::null,
+ std::string(),
+ cb);
+ }
+ }
+}
diff --git a/indra/newview/llviewerattachmenu.h b/indra/newview/llviewerattachmenu.h
new file mode 100644
index 0000000000..d1db9914f3
--- /dev/null
+++ b/indra/newview/llviewerattachmenu.h
@@ -0,0 +1,43 @@
+/**
+ * @file llviewerattachmenu.h
+ * @brief "Attach to" / "Attach to HUD" submenus.
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLVIEWERATTACHMENU_H
+#define LL_LLVIEWERATTACHMENU_H
+
+class LLViewerAttachMenu
+{
+public:
+ static void populateMenus(const std::string& attach_to_menu_name, const std::string& attach_to_hud_menu_name);
+ static void attachObjects(const uuid_vec_t& items, const std::string& joint_name);
+};
+
+#endif // LL_LLVIEWERATTACHMENU_H
diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp
index 934981b0ad..1094f030bf 100644
--- a/indra/newview/llvieweraudio.cpp
+++ b/indra/newview/llvieweraudio.cpp
@@ -34,6 +34,7 @@
#include "llaudioengine.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llappviewer.h"
#include "llvieweraudio.h"
#include "llviewercamera.h"
@@ -51,7 +52,7 @@ void init_audio()
llwarns << "Failed to create an appropriate Audio Engine" << llendl;
return;
}
- LLVector3d lpos_global = gAgent.getCameraPositionGlobal();
+ LLVector3d lpos_global = gAgentCamera.getCameraPositionGlobal();
LLVector3 lpos_global_f;
lpos_global_f.setVec(lpos_global);
@@ -144,7 +145,7 @@ void audio_update_volume(bool force_update)
{
F32 music_volume = gSavedSettings.getF32("AudioLevelMusic");
BOOL music_muted = gSavedSettings.getBOOL("MuteMusic");
- music_volume = mute_volume * master_volume * (music_volume*music_volume);
+ music_volume = mute_volume * master_volume * music_volume;
gAudiop->setInternetStreamGain ( music_muted ? 0.f : music_volume );
}
@@ -152,25 +153,25 @@ void audio_update_volume(bool force_update)
// Streaming Media
F32 media_volume = gSavedSettings.getF32("AudioLevelMedia");
BOOL media_muted = gSavedSettings.getBOOL("MuteMedia");
- media_volume = mute_volume * master_volume * (media_volume*media_volume);
+ media_volume = mute_volume * master_volume * media_volume;
LLViewerMedia::setVolume( media_muted ? 0.0f : media_volume );
// Voice
- if (gVoiceClient)
+ if (LLVoiceClient::getInstance())
{
F32 voice_volume = gSavedSettings.getF32("AudioLevelVoice");
voice_volume = mute_volume * master_volume * voice_volume;
BOOL voice_mute = gSavedSettings.getBOOL("MuteVoice");
- gVoiceClient->setVoiceVolume(voice_mute ? 0.f : voice_volume);
- gVoiceClient->setMicGain(voice_mute ? 0.f : gSavedSettings.getF32("AudioLevelMic"));
+ LLVoiceClient::getInstance()->setVoiceVolume(voice_mute ? 0.f : voice_volume);
+ LLVoiceClient::getInstance()->setMicGain(voice_mute ? 0.f : gSavedSettings.getF32("AudioLevelMic"));
if (!gViewerWindow->getActive() && (gSavedSettings.getBOOL("MuteWhenMinimized")))
{
- gVoiceClient->setMuteMic(true);
+ LLVoiceClient::getInstance()->setMuteMic(true);
}
else
{
- gVoiceClient->setMuteMic(false);
+ LLVoiceClient::getInstance()->setMuteMic(false);
}
}
}
@@ -180,7 +181,7 @@ void audio_update_listener()
if (gAudiop)
{
// update listener position because agent has moved
- LLVector3d lpos_global = gAgent.getCameraPositionGlobal();
+ LLVector3d lpos_global = gAgentCamera.getCameraPositionGlobal();
LLVector3 lpos_global_f;
lpos_global_f.setVec(lpos_global);
@@ -203,7 +204,7 @@ void audio_update_wind(bool force_update)
if (region)
{
static F32 last_camera_water_height = -1000.f;
- LLVector3 camera_pos = gAgent.getCameraPositionAgent();
+ LLVector3 camera_pos = gAgentCamera.getCameraPositionAgent();
F32 camera_water_height = camera_pos.mV[VZ] - region->getWaterHeight();
//
@@ -251,7 +252,7 @@ void audio_update_wind(bool force_update)
{
// initialize wind volume (force_update) by using large volume_delta
// which is sufficient to completely turn off or turn on wind noise
- volume_delta = max_wind_volume;
+ volume_delta = 1.f;
}
// mute wind when not flying
diff --git a/indra/newview/llviewercamera.cpp b/indra/newview/llviewercamera.cpp
index bd4f172907..aa82c216d9 100644
--- a/indra/newview/llviewercamera.cpp
+++ b/indra/newview/llviewercamera.cpp
@@ -37,6 +37,7 @@
// Viewer includes
#include "llagent.h"
+#include "llagentcamera.h"
#include "llviewercontrol.h"
#include "llviewerobjectlist.h"
#include "llviewerregion.h"
@@ -338,7 +339,12 @@ void LLViewerCamera::setPerspective(BOOL for_selection,
{
// make a tiny little viewport
// anything drawn into this viewport will be "selected"
- GLint* viewport = (GLint*) gGLViewport;
+
+ GLint viewport[4];
+ viewport[0] = gViewerWindow->getWorldViewRectRaw().mLeft;
+ viewport[1] = gViewerWindow->getWorldViewRectRaw().mBottom;
+ viewport[2] = gViewerWindow->getWorldViewRectRaw().getWidth();
+ viewport[3] = gViewerWindow->getWorldViewRectRaw().getHeight();
proj_mat = gl_pick_matrix(x+width/2.f, y_from_bot+height/2.f, (GLfloat) width, (GLfloat) height, viewport);
@@ -349,7 +355,7 @@ void LLViewerCamera::setPerspective(BOOL for_selection,
}
else
{
- z_far = gAgent.mDrawDistance;
+ z_far = gAgentCamera.mDrawDistance;
}
}
else
@@ -405,6 +411,9 @@ void LLViewerCamera::setPerspective(BOOL for_selection,
if (for_selection && (width > 1 || height > 1))
{
+ // NB: as of this writing, i believe the code below is broken (doesn't take into account the world view, assumes entire window)
+ // however, it is also unused (the GL matricies are used for selection, (see LLCamera::sphereInFrustum())) and so i'm not
+ // comfortable hacking on it.
calculateFrustumPlanesFromWindow((F32)(x - width / 2) / (F32)gViewerWindow->getWindowWidthScaled() - 0.5f,
(F32)(y_from_bot - height / 2) / (F32)gViewerWindow->getWindowHeightScaled() - 0.5f,
(F32)(x + width / 2) / (F32)gViewerWindow->getWindowWidthScaled() - 0.5f,
diff --git a/indra/newview/llviewerchat.cpp b/indra/newview/llviewerchat.cpp
index 8de87eb602..320456e1e2 100644
--- a/indra/newview/llviewerchat.cpp
+++ b/indra/newview/llviewerchat.cpp
@@ -37,6 +37,7 @@
#include "llagent.h" // gAgent
#include "lluicolortable.h"
#include "llviewercontrol.h" // gSavedSettings
+#include "llinstantmessage.h" //SYSTEM_FROM
// LLViewerChat
@@ -55,7 +56,7 @@ void LLViewerChat::getChatColor(const LLChat& chat, LLColor4& r_color)
r_color = LLUIColorTable::instance().getColor("SystemChatColor");
break;
case CHAT_SOURCE_AGENT:
- if (chat.mFromID.isNull())
+ if (chat.mFromID.isNull() || SYSTEM_FROM == chat.mFromName)
{
r_color = LLUIColorTable::instance().getColor("SystemChatColor");
}
diff --git a/indra/newview/llviewercontrol.cpp b/indra/newview/llviewercontrol.cpp
index 64eabe65cf..f2c9fbf78d 100644
--- a/indra/newview/llviewercontrol.cpp
+++ b/indra/newview/llviewercontrol.cpp
@@ -41,6 +41,7 @@
// For Listeners
#include "llaudioengine.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llconsole.h"
#include "lldrawpoolterrain.h"
#include "llflexibleobject.h"
@@ -69,10 +70,11 @@
#include "llvosurfacepatch.h"
#include "llvowlsky.h"
#include "llrender.h"
-#include "llbottomtray.h"
#include "llnavigationbar.h"
#include "llfloatertools.h"
#include "llpaneloutfitsinventory.h"
+#include "llpanellogin.h"
+#include "llpaneltopinfobar.h"
#ifdef TOGGLE_HACKED_GODLIKE_VIEWER
BOOL gHackGodmode = FALSE;
@@ -102,7 +104,7 @@ static bool handleRenderAvatarMouselookChanged(const LLSD& newvalue)
static bool handleRenderFarClipChanged(const LLSD& newvalue)
{
F32 draw_distance = (F32) newvalue.asReal();
- gAgent.mDrawDistance = draw_distance;
+ gAgentCamera.mDrawDistance = draw_distance;
LLWorld::getInstance()->setLandFarClip(draw_distance);
return true;
}
@@ -411,10 +413,7 @@ bool handleHighResSnapshotChanged(const LLSD& newvalue)
bool handleVoiceClientPrefsChanged(const LLSD& newvalue)
{
- if(gVoiceClient)
- {
- gVoiceClient->updateSettings();
- }
+ LLVoiceClient::getInstance()->updateSettings();
return true;
}
@@ -442,6 +441,12 @@ bool handleVelocityInterpolate(const LLSD& newvalue)
return true;
}
+bool handleForceShowGrid(const LLSD& newvalue)
+{
+ LLPanelLogin::updateServer( );
+ return true;
+}
+
bool toggle_agent_pause(const LLSD& newvalue)
{
if ( newvalue.asBoolean() )
@@ -455,33 +460,13 @@ bool toggle_agent_pause(const LLSD& newvalue)
return true;
}
-bool toggle_show_gesture_button(const LLSD& newvalue)
-{
- LLBottomTray::getInstance()->showGestureButton(newvalue.asBoolean());
- return true;
-}
-
-bool toggle_show_move_button(const LLSD& newvalue)
-{
- LLBottomTray::getInstance()->showMoveButton(newvalue.asBoolean());
- return true;
-}
-
-bool toggle_show_camera_button(const LLSD& newvalue)
+bool toggle_show_navigation_panel(const LLSD& newvalue)
{
- LLBottomTray::getInstance()->showCameraButton(newvalue.asBoolean());
- return true;
-}
+ bool value = newvalue.asBoolean();
-bool toggle_show_snapshot_button(const LLSD& newvalue)
-{
- LLBottomTray::getInstance()->showSnapshotButton(newvalue.asBoolean());
- return true;
-}
+ LLNavigationBar::getInstance()->showNavigationPanel(value);
+ gSavedSettings.setBOOL("ShowMiniLocationPanel", !value);
-bool toggle_show_navigation_panel(const LLSD& newvalue)
-{
- LLNavigationBar::getInstance()->showNavigationPanel(newvalue.asBoolean());
return true;
}
@@ -491,9 +476,13 @@ bool toggle_show_favorites_panel(const LLSD& newvalue)
return true;
}
-bool toggle_show_appearance_editor(const LLSD& newvalue)
+bool toggle_show_mini_location_panel(const LLSD& newvalue)
{
- LLPanelOutfitsInventory::sShowDebugEditor = newvalue.asBoolean();
+ bool value = newvalue.asBoolean();
+
+ LLPanelTopInfoBar::getInstance()->setVisible(value);
+ gSavedSettings.setBOOL("ShowNavbarNavigationPanel", !value);
+
return true;
}
@@ -510,6 +499,7 @@ void settings_setup_listeners()
gSavedSettings.getControl("FirstPersonAvatarVisible")->getSignal()->connect(boost::bind(&handleRenderAvatarMouselookChanged, _2));
gSavedSettings.getControl("RenderFarClip")->getSignal()->connect(boost::bind(&handleRenderFarClipChanged, _2));
gSavedSettings.getControl("RenderTerrainDetail")->getSignal()->connect(boost::bind(&handleTerrainDetailChanged, _2));
+ gSavedSettings.getControl("RenderUseTriStrips")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
gSavedSettings.getControl("RenderAnimateTrees")->getSignal()->connect(boost::bind(&handleResetVertexBuffersChanged, _2));
gSavedSettings.getControl("RenderAvatarVP")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
gSavedSettings.getControl("VertexShaderEnable")->getSignal()->connect(boost::bind(&handleSetShaderChanged, _2));
@@ -638,14 +628,11 @@ void settings_setup_listeners()
gSavedSettings.getControl("QAMode")->getSignal()->connect(boost::bind(&show_debug_menus));
gSavedSettings.getControl("UseDebugMenus")->getSignal()->connect(boost::bind(&show_debug_menus));
gSavedSettings.getControl("AgentPause")->getSignal()->connect(boost::bind(&toggle_agent_pause, _2));
- gSavedSettings.getControl("ShowGestureButton")->getSignal()->connect(boost::bind(&toggle_show_gesture_button, _2));
- gSavedSettings.getControl("ShowMoveButton")->getSignal()->connect(boost::bind(&toggle_show_move_button, _2));
- gSavedSettings.getControl("ShowCameraButton")->getSignal()->connect(boost::bind(&toggle_show_camera_button, _2));
- 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("ShowMiniLocationPanel")->getSignal()->connect(boost::bind(&toggle_show_mini_location_panel, _2));
gSavedSettings.getControl("ShowObjectRenderingCost")->getSignal()->connect(boost::bind(&toggle_show_object_render_cost, _2));
+ gSavedSettings.getControl("ForceShowGrid")->getSignal()->connect(boost::bind(&handleForceShowGrid, _2));
}
#if TEST_CACHED_CONTROL
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index ba256d70e8..ab6ff88073 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -38,6 +38,7 @@
#include "llrender.h"
#include "llglheaders.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llviewercontrol.h"
#include "llcoord.h"
#include "llcriticaldamp.h"
@@ -113,7 +114,6 @@ void render_hud_attachments();
void render_ui_3d();
void render_ui_2d();
void render_disconnected_background();
-void render_hud_elements();
void display_startup()
{
@@ -169,14 +169,13 @@ void display_startup()
void display_update_camera()
{
LLMemType mt_uc(LLMemType::MTYPE_DISPLAY_UPDATE_CAMERA);
- llpushcallstacks ;
// TODO: cut draw distance down if customizing avatar?
// TODO: cut draw distance on per-parcel basis?
// Cut draw distance in half when customizing avatar,
// but on the viewer only.
- F32 final_far = gAgent.mDrawDistance;
- if (CAMERA_MODE_CUSTOMIZE_AVATAR == gAgent.getCameraMode())
+ F32 final_far = gAgentCamera.mDrawDistance;
+ if (CAMERA_MODE_CUSTOMIZE_AVATAR == gAgentCamera.getCameraMode())
{
final_far *= 0.5f;
}
@@ -345,9 +344,9 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
const F32 TELEPORT_ARRIVAL_DELAY = 2.f; // Time to preload the world before raising the curtain after we've actually already arrived.
S32 attach_count = 0;
- if (gAgent.getAvatarObject())
+ if (isAgentAvatarValid())
{
- attach_count = gAgent.getAvatarObject()->getAttachmentCount();
+ attach_count = gAgentAvatarp->getAttachmentCount();
}
F32 teleport_save_time = TELEPORT_EXPIRY + TELEPORT_EXPIRY_PER_ATTACHMENT * attach_count;
F32 teleport_elapsed = gTeleportDisplayTimer.getElapsedTimeF32();
@@ -394,7 +393,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
gAgent.setTeleportMessage(
LLAgent::sTeleportProgressMessages["arriving"]);
gTextureList.mForceResetTextureStats = TRUE;
- gAgent.resetView(TRUE, TRUE);
+ gAgentCamera.resetView(TRUE, TRUE);
break;
case LLAgent::TELEPORT_ARRIVING:
@@ -598,7 +597,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
LLPipeline::sFastAlpha = gSavedSettings.getBOOL("RenderFastAlpha");
LLPipeline::sUseFarClip = gSavedSettings.getBOOL("RenderUseFarClip");
- LLVOAvatar::sMaxVisible = gSavedSettings.getS32("RenderAvatarMaxVisible");
+ LLVOAvatar::sMaxVisible = (U32)gSavedSettings.getS32("RenderAvatarMaxVisible");
LLPipeline::sDelayVBUpdate = gSavedSettings.getBOOL("RenderDelayVBUpdate");
S32 occlusion = LLPipeline::sUseOcclusion;
@@ -700,8 +699,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
// Doing this here gives hardware occlusion queries extra time to complete
LLAppViewer::instance()->pingMainloopTimeout("Display:UpdateImages");
LLError::LLCallStacks::clear() ;
- llpushcallstacks ;
-
+
{
LLMemType mt_iu(LLMemType::MTYPE_DISPLAY_IMAGE_UPDATE);
LLFastTimer t(FTM_IMAGE_UPDATE);
@@ -719,7 +717,6 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
LLImageGL::deleteDeadTextures();
stop_glerror();
}
- llpushcallstacks ;
///////////////////////////////////
//
// StateSort
@@ -732,6 +729,7 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
{
LLViewerCamera::sCurCameraID = LLViewerCamera::CAMERA_WORLD;
LLMemType mt_ss(LLMemType::MTYPE_DISPLAY_STATE_SORT);
+ gPipeline.sAllowRebuildPriorityGroup = TRUE ;
gPipeline.stateSort(*LLViewerCamera::getInstance(), result);
stop_glerror();
@@ -921,9 +919,9 @@ void render_hud_attachments()
glh::matrix4f current_mod = glh_get_current_modelview();
// clamp target zoom level to reasonable values
- gAgent.mHUDTargetZoom = llclamp(gAgent.mHUDTargetZoom, 0.1f, 1.f);
+ gAgentCamera.mHUDTargetZoom = llclamp(gAgentCamera.mHUDTargetZoom, 0.1f, 1.f);
// smoothly interpolate current zoom level
- gAgent.mHUDCurZoom = lerp(gAgent.mHUDCurZoom, gAgent.mHUDTargetZoom, LLCriticalDamp::getInterpolant(0.03f));
+ gAgentCamera.mHUDCurZoom = lerp(gAgentCamera.mHUDCurZoom, gAgentCamera.mHUDTargetZoom, LLCriticalDamp::getInterpolant(0.03f));
if (LLPipeline::sShowHUDAttachments && !gDisconnected && setup_hud_matrices())
{
@@ -990,6 +988,7 @@ void render_hud_attachments()
LLSpatialGroup::sNoDelete = FALSE;
render_hud_elements();
+
//restore type mask
gPipeline.setRenderTypeMask(mask);
if (has_ui)
@@ -1031,11 +1030,10 @@ LLRect get_whole_screen_region()
bool get_hud_matrices(const LLRect& screen_region, glh::matrix4f &proj, glh::matrix4f &model)
{
- LLVOAvatar* my_avatarp = gAgent.getAvatarObject();
- if (my_avatarp && my_avatarp->hasHUDAttachment())
+ if (isAgentAvatarValid() && gAgentAvatarp->hasHUDAttachment())
{
- F32 zoom_level = gAgent.mHUDCurZoom;
- LLBBox hud_bbox = my_avatarp->getHUDBBox();
+ F32 zoom_level = gAgentCamera.mHUDCurZoom;
+ LLBBox hud_bbox = gAgentAvatarp->getHUDBBox();
F32 hud_depth = llmax(1.f, hud_bbox.getExtentLocal().mV[VX] * 1.1f);
proj = gl_ortho(-0.5f * LLViewerCamera::getInstance()->getAspect(), 0.5f * LLViewerCamera::getInstance()->getAspect(), -0.5f, 0.5f, 0.f, hud_depth);
@@ -1129,7 +1127,6 @@ void render_ui(F32 zoom_factor, int subfield)
}
{
-
gGL.color4f(1,1,1,1);
if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
{
@@ -1300,14 +1297,14 @@ void render_ui_2d()
gGL.getTexUnit(0)->setTextureBlendType(LLTexUnit::TB_MULT);
// render outline for HUD
- if (gAgent.getAvatarObject() && gAgent.mHUDCurZoom < 0.98f)
+ if (isAgentAvatarValid() && gAgentCamera.mHUDCurZoom < 0.98f)
{
glPushMatrix();
S32 half_width = (gViewerWindow->getWorldViewWidthScaled() / 2);
S32 half_height = (gViewerWindow->getWorldViewHeightScaled() / 2);
glScalef(LLUI::sGLScaleFactor.mV[0], LLUI::sGLScaleFactor.mV[1], 1.f);
glTranslatef((F32)half_width, (F32)half_height, 0.f);
- F32 zoom = gAgent.mHUDCurZoom;
+ F32 zoom = gAgentCamera.mHUDCurZoom;
glScalef(zoom,zoom,1.f);
gGL.color4fv(LLColor4::white.mV);
gl_rect_2d(-half_width, half_height, half_width, -half_height, FALSE);
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 29114c33c5..efe59744bc 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -40,7 +40,6 @@
#include "llcompilequeue.h"
#include "llcallfloater.h"
#include "llfloaterabout.h"
-#include "llfloateractivespeakers.h"
#include "llfloateranimpreview.h"
#include "llfloaterauction.h"
#include "llfloateravatarpicker.h"
@@ -50,11 +49,13 @@
#include "llfloaterbuy.h"
#include "llfloaterbuycontents.h"
#include "llfloaterbuycurrency.h"
+#include "llfloaterbuycurrencyhtml.h"
#include "llfloaterbuyland.h"
#include "llfloaterbulkpermission.h"
#include "llfloaterbump.h"
#include "llfloatercamera.h"
#include "llfloaterdaycycle.h"
+#include "llfloaterevent.h"
#include "llfloatersearch.h"
#include "llfloaterenvsettings.h"
#include "llfloaterfonttest.h"
@@ -77,7 +78,6 @@
#include "llfloatermap.h"
#include "llfloatermemleak.h"
#include "llfloaternamedesc.h"
-#include "llfloaternearbymedia.h"
#include "llfloaternotificationsconsole.h"
#include "llfloateropenobject.h"
#include "llfloaterpay.h"
@@ -103,6 +103,7 @@
#include "llfloateruipreview.h"
#include "llfloaterurldisplay.h"
#include "llfloatervoicedevicesettings.h"
+#include "llfloatervoiceeffect.h"
#include "llfloaterwater.h"
#include "llfloaterwhitelistentry.h"
#include "llfloaterwindlight.h"
@@ -117,6 +118,7 @@
#include "llmoveview.h"
#include "llnearbychat.h"
#include "llpanelblockedlist.h"
+#include "llpanelclassified.h"
#include "llpreviewanim.h"
#include "llpreviewgesture.h"
#include "llpreviewnotecard.h"
@@ -134,7 +136,6 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterAboutUtil::registerFloater();
LLFloaterReg::add("about_land", "floater_about_land.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLand>);
- LLFloaterReg::add("active_speakers", "floater_active_speakers.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterActiveSpeakers>);
LLFloaterReg::add("auction", "floater_auction.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAuction>);
LLFloaterReg::add("avatar_picker", "floater_avatar_picker.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarPicker>);
LLFloaterReg::add("avatar_textures", "floater_avatar_textures.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterAvatarTextures>);
@@ -142,6 +143,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("beacons", "floater_beacons.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBeacons>);
LLFloaterReg::add("bulk_perms", "floater_bulk_perms.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBulkPermission>);
LLFloaterReg::add("buy_currency", "floater_buy_currency.xml", &LLFloaterBuyCurrency::buildFloater);
+ LLFloaterReg::add("buy_currency_html", "floater_buy_currency_html.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBuyCurrencyHTML>);
LLFloaterReg::add("buy_land", "floater_buy_land.xml", &LLFloaterBuyLand::buildFloater);
LLFloaterReg::add("buy_object", "floater_buy_object.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBuy>);
LLFloaterReg::add("buy_object_contents", "floater_buy_contents.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBuyContents>);
@@ -150,7 +152,6 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("bumps", "floater_bumps.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterBump>);
LLFloaterReg::add("camera", "floater_camera.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCamera>);
- //LLFloaterReg::add("chat", "floater_chat_history.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterChat>);
LLFloaterReg::add("nearby_chat", "floater_nearby_chat.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLNearbyChat>);
LLFloaterReg::add("compile_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterCompileQueue>);
@@ -160,6 +161,8 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("env_settings", "floater_env_settings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEnvSettings>);
LLFloaterReg::add("env_water", "floater_water.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWater>);
LLFloaterReg::add("env_windlight", "floater_windlight_options.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWindLight>);
+
+ LLFloaterReg::add("event", "floater_event.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterEvent>);
LLFloaterReg::add("font_test", "floater_font_test.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterFontTest>);
@@ -194,7 +197,6 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("mute_object_by_name", "floater_mute_object.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterGetBlockedObjectName>);
LLFloaterReg::add("mini_map", "floater_map.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMap>);
- LLFloaterReg::add("nearby_media", "floater_nearby_media.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNearbyMedia>);
LLFloaterReg::add("notifications_console", "floater_notifications_console.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotificationConsole>);
LLFloaterReg::add("notification_well_window", "floater_sys_well.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLNotificationWellWindow>);
@@ -218,6 +220,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("preview_sound", "floater_preview_sound.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPreviewSound>, "preview");
LLFloaterReg::add("preview_texture", "floater_preview_texture.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPreviewTexture>, "preview");
LLFloaterReg::add("properties", "floater_inventory_item_properties.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterProperties>);
+ LLFloaterReg::add("publish_classified", "floater_publish_classified.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLPublishClassifiedFloater>);
LLFloaterReg::add("telehubs", "floater_telehub.xml",&LLFloaterReg::build<LLFloaterTelehub>);
LLFloaterReg::add("test_inspectors", "floater_test_inspectors.xml",
@@ -253,7 +256,8 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("upload_sound", "floater_sound_preview.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSoundPreview>, "upload");
LLFloaterReg::add("voice_controls", "floater_voice_controls.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLCallFloater>);
-
+ LLFloaterReg::add("voice_effect", "floater_voice_effect.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterVoiceEffect>);
+
LLFloaterReg::add("whitelist_entry", "floater_whitelist_entry.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWhiteListEntry>);
LLFloaterWindowSizeUtil::registerFloater();
LLFloaterReg::add("world_map", "floater_world_map.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterWorldMap>);
diff --git a/indra/newview/llviewerfoldertype.cpp b/indra/newview/llviewerfoldertype.cpp
index 033d35d80a..3105a6ec43 100644
--- a/indra/newview/llviewerfoldertype.cpp
+++ b/indra/newview/llviewerfoldertype.cpp
@@ -43,13 +43,16 @@ struct ViewerFolderEntry : public LLDictionaryEntry
{
// Constructor for non-ensembles
ViewerFolderEntry(const std::string &new_category_name, // default name when creating a new category of this type
- const std::string &icon_name, // name of the folder icon
- BOOL is_quiet // folder doesn't need a UI update when changed
+ const std::string &icon_name_open, // name of the folder icon
+ const std::string &icon_name_closed,
+ BOOL is_quiet, // folder doesn't need a UI update when changed
+ const std::string &dictionary_name = empty_string // no reverse lookup needed on non-ensembles, so in most cases just leave this blank
)
:
- LLDictionaryEntry(empty_string), // no reverse lookup needed on non-ensembles, so just leave this blank
- mIconName(icon_name),
+ LLDictionaryEntry(dictionary_name),
mNewCategoryName(new_category_name),
+ mIconNameOpen(icon_name_open),
+ mIconNameClosed(icon_name_closed),
mIsQuiet(is_quiet)
{
mAllowedNames.clear();
@@ -63,7 +66,11 @@ struct ViewerFolderEntry : public LLDictionaryEntry
)
:
LLDictionaryEntry(xui_name),
- mIconName(icon_name),
+ /* Just use default icons until we actually support ensembles
+ mIconNameOpen(icon_name),
+ mIconNameClosed(icon_name),
+ */
+ mIconNameOpen("Inv_FolderOpen"), mIconNameClosed("Inv_FolderClosed"),
mNewCategoryName(new_category_name),
mIsQuiet(FALSE)
{
@@ -84,7 +91,8 @@ struct ViewerFolderEntry : public LLDictionaryEntry
}
return false;
}
- const std::string mIconName;
+ const std::string mIconNameOpen;
+ const std::string mIconNameClosed;
const std::string mNewCategoryName;
typedef std::vector<std::string> name_vec_t;
name_vec_t mAllowedNames;
@@ -102,33 +110,40 @@ protected:
LLViewerFolderDictionary::LLViewerFolderDictionary()
{
- initEnsemblesFromFile();
-
- // NEW CATEGORY NAME FOLDER ICON NAME QUIET?
- // |-------------------------|-------------------------------|-----------|
- addEntry(LLFolderType::FT_TEXTURE, new ViewerFolderEntry("Textures", "inv_folder_texture.tga", FALSE));
- addEntry(LLFolderType::FT_SOUND, new ViewerFolderEntry("Sounds", "inv_folder_sound.tga", FALSE));
- addEntry(LLFolderType::FT_CALLINGCARD, new ViewerFolderEntry("Calling Cards", "inv_folder_callingcard.tga", FALSE));
- addEntry(LLFolderType::FT_LANDMARK, new ViewerFolderEntry("Landmarks", "inv_folder_landmark.tga", FALSE));
- addEntry(LLFolderType::FT_CLOTHING, new ViewerFolderEntry("Clothing", "inv_folder_clothing.tga", FALSE));
- addEntry(LLFolderType::FT_OBJECT, new ViewerFolderEntry("Objects", "inv_folder_object.tga", FALSE));
- addEntry(LLFolderType::FT_NOTECARD, new ViewerFolderEntry("Notecards", "inv_folder_notecard.tga", FALSE));
- addEntry(LLFolderType::FT_ROOT_INVENTORY, new ViewerFolderEntry("My Inventory", "", FALSE));
- addEntry(LLFolderType::FT_LSL_TEXT, new ViewerFolderEntry("Scripts", "inv_folder_script.tga", FALSE));
- addEntry(LLFolderType::FT_BODYPART, new ViewerFolderEntry("Body Parts", "inv_folder_bodypart.tga", FALSE));
- addEntry(LLFolderType::FT_TRASH, new ViewerFolderEntry("Trash", "inv_folder_trash.tga", TRUE));
- addEntry(LLFolderType::FT_SNAPSHOT_CATEGORY, new ViewerFolderEntry("Photo Album", "inv_folder_snapshot.tga", FALSE));
- addEntry(LLFolderType::FT_LOST_AND_FOUND, new ViewerFolderEntry("Lost And Found", "inv_folder_lostandfound.tga", TRUE));
- addEntry(LLFolderType::FT_ANIMATION, new ViewerFolderEntry("Animations", "inv_folder_animation.tga", FALSE));
- addEntry(LLFolderType::FT_GESTURE, new ViewerFolderEntry("Gestures", "inv_folder_gesture.tga", FALSE));
- addEntry(LLFolderType::FT_FAVORITE, new ViewerFolderEntry("Favorites", "inv_folder_plain_closed.tga", FALSE));
+ // NEW CATEGORY NAME FOLDER OPEN FOLDER CLOSED QUIET?
+ // |-------------------------|-----------------------|----------------------|-----------|
+ addEntry(LLFolderType::FT_TEXTURE, new ViewerFolderEntry("Textures", "Inv_SysOpen", "Inv_SysClosed", FALSE));
+ addEntry(LLFolderType::FT_SOUND, new ViewerFolderEntry("Sounds", "Inv_SysOpen", "Inv_SysClosed", FALSE));
+ addEntry(LLFolderType::FT_CALLINGCARD, new ViewerFolderEntry("Calling Cards", "Inv_SysOpen", "Inv_SysClosed", FALSE));
+ addEntry(LLFolderType::FT_LANDMARK, new ViewerFolderEntry("Landmarks", "Inv_SysOpen", "Inv_SysClosed", FALSE));
+ addEntry(LLFolderType::FT_CLOTHING, new ViewerFolderEntry("Clothing", "Inv_SysOpen", "Inv_SysClosed", FALSE));
+ addEntry(LLFolderType::FT_OBJECT, new ViewerFolderEntry("Objects", "Inv_SysOpen", "Inv_SysClosed", FALSE));
+ addEntry(LLFolderType::FT_NOTECARD, new ViewerFolderEntry("Notecards", "Inv_SysOpen", "Inv_SysClosed", FALSE));
+ addEntry(LLFolderType::FT_ROOT_INVENTORY, new ViewerFolderEntry("My Inventory", "Inv_SysOpen", "Inv_SysClosed", FALSE));
+ addEntry(LLFolderType::FT_LSL_TEXT, new ViewerFolderEntry("Scripts", "Inv_SysOpen", "Inv_SysClosed", FALSE));
+ addEntry(LLFolderType::FT_BODYPART, new ViewerFolderEntry("Body Parts", "Inv_SysOpen", "Inv_SysClosed", FALSE));
+ addEntry(LLFolderType::FT_TRASH, new ViewerFolderEntry("Trash", "Inv_TrashOpen", "Inv_TrashClosed", TRUE));
+ addEntry(LLFolderType::FT_SNAPSHOT_CATEGORY, new ViewerFolderEntry("Photo Album", "Inv_SysOpen", "Inv_SysClosed", FALSE));
+ addEntry(LLFolderType::FT_LOST_AND_FOUND, new ViewerFolderEntry("Lost And Found", "Inv_LostOpen", "Inv_LostClosed", TRUE));
+ addEntry(LLFolderType::FT_ANIMATION, new ViewerFolderEntry("Animations", "Inv_SysOpen", "Inv_SysClosed", FALSE));
+ addEntry(LLFolderType::FT_GESTURE, new ViewerFolderEntry("Gestures", "Inv_SysOpen", "Inv_SysClosed", FALSE));
+ addEntry(LLFolderType::FT_FAVORITE, new ViewerFolderEntry("Favorites", "Inv_SysOpen", "Inv_SysClosed", FALSE));
- addEntry(LLFolderType::FT_CURRENT_OUTFIT, new ViewerFolderEntry("Current Outfit", "inv_folder_current_outfit.tga",TRUE));
- addEntry(LLFolderType::FT_OUTFIT, new ViewerFolderEntry("New Outfit", "inv_folder_outfit.tga", TRUE));
- addEntry(LLFolderType::FT_MY_OUTFITS, new ViewerFolderEntry("My Outfits", "inv_folder_my_outfits.tga", TRUE));
- addEntry(LLFolderType::FT_INBOX, new ViewerFolderEntry("Inbox", "inv_folder_inbox.tga", FALSE));
+ addEntry(LLFolderType::FT_CURRENT_OUTFIT, new ViewerFolderEntry("Current Outfit", "Inv_SysOpen", "Inv_SysClosed", TRUE));
+ addEntry(LLFolderType::FT_OUTFIT, new ViewerFolderEntry("New Outfit", "Inv_LookFolderOpen", "Inv_LookFolderClosed", TRUE));
+ addEntry(LLFolderType::FT_MY_OUTFITS, new ViewerFolderEntry("My Outfits", "Inv_SysOpen", "Inv_SysClosed", TRUE));
+ addEntry(LLFolderType::FT_INBOX, new ViewerFolderEntry("Inbox", "Inv_SysOpen", "Inv_SysClosed", FALSE));
- addEntry(LLFolderType::FT_NONE, new ViewerFolderEntry("New Folder", "inv_folder_plain_closed.tga", FALSE));
+ addEntry(LLFolderType::FT_NONE, new ViewerFolderEntry("New Folder", "Inv_FolderOpen", "Inv_FolderClosed", FALSE, "default"));
+
+#if SUPPORT_ENSEMBLES
+ initEnsemblesFromFile();
+#else
+ for (U32 type = (U32)LLFolderType::FT_ENSEMBLE_START; type <= (U32)LLFolderType::FT_ENSEMBLE_END; ++type)
+ {
+ addEntry((LLFolderType::EType)type, new ViewerFolderEntry("New Folder", "Inv_FolderOpen", "Inv_FolderClosed", FALSE));
+ }
+#endif
}
bool LLViewerFolderDictionary::initEnsemblesFromFile()
@@ -213,13 +228,25 @@ LLFolderType::EType LLViewerFolderType::lookupTypeFromXUIName(const std::string
return LLViewerFolderDictionary::getInstance()->lookup(name);
}
-const std::string &LLViewerFolderType::lookupIconName(LLFolderType::EType folder_type)
+const std::string &LLViewerFolderType::lookupIconName(LLFolderType::EType folder_type, BOOL is_open)
{
const ViewerFolderEntry *entry = LLViewerFolderDictionary::getInstance()->lookup(folder_type);
if (entry)
{
- return entry->mIconName;
+ if (is_open)
+ return entry->mIconNameOpen;
+ else
+ return entry->mIconNameClosed;
+ }
+
+ // Error condition. Return something so that we don't show a grey box in inventory view.
+ const ViewerFolderEntry *default_entry = LLViewerFolderDictionary::getInstance()->lookup(LLFolderType::FT_NONE);
+ if (default_entry)
+ {
+ return default_entry->mIconNameClosed;
}
+
+ // Should not get here unless there's something corrupted with the FT_NONE entry.
return badLookup();
}
diff --git a/indra/newview/llviewerfoldertype.h b/indra/newview/llviewerfoldertype.h
index dd9360da90..3744ac20f8 100644
--- a/indra/newview/llviewerfoldertype.h
+++ b/indra/newview/llviewerfoldertype.h
@@ -44,7 +44,7 @@ public:
static const std::string& lookupXUIName(EType folder_type); // name used by the UI
static LLFolderType::EType lookupTypeFromXUIName(const std::string& name);
- static const std::string& lookupIconName(EType folder_type); // folder icon name
+ static const std::string& lookupIconName(EType folder_type, BOOL is_open = FALSE); // folder icon name
static BOOL lookupIsQuietType(EType folder_type); // folder doesn't require UI update when changes have occured
static const std::string& lookupNewCategoryName(EType folder_type); // default name when creating new category
static LLFolderType::EType lookupTypeFromNewCategoryName(const std::string& name); // default name when creating new category
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index 3001992630..3430f265ae 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -36,18 +36,23 @@
#include "llnotificationsutil.h"
#include "llsdserialize.h"
#include "message.h"
-#include "indra_constants.h"
#include "llagent.h"
+#include "llagentcamera.h"
+#include "llagentwearables.h"
#include "llviewerfoldertype.h"
#include "llfolderview.h"
#include "llviewercontrol.h"
#include "llconsole.h"
+#include "llinventorydefines.h"
+#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
+#include "llinventorymodelbackgroundfetch.h"
#include "llgesturemgr.h"
#include "llsidetray.h"
#include "llinventorybridge.h"
+#include "llinventorypanel.h"
#include "llfloaterinventory.h"
#include "llviewerassettype.h"
@@ -57,9 +62,79 @@
#include "llviewerwindow.h"
#include "lltrans.h"
#include "llappearancemgr.h"
-#include "llfloatercustomize.h"
#include "llcommandhandler.h"
#include "llviewermessage.h"
+#include "llsidepanelappearance.h"
+
+///----------------------------------------------------------------------------
+/// Helper class to store special inventory item names
+///----------------------------------------------------------------------------
+class LLLocalizedInventoryItemsDictionary : public LLSingleton<LLLocalizedInventoryItemsDictionary>
+{
+public:
+ std::map<std::string, std::string> mInventoryItemsDict;
+
+ LLLocalizedInventoryItemsDictionary()
+ {
+ mInventoryItemsDict["New Shape"] = LLTrans::getString("New Shape");
+ mInventoryItemsDict["New Skin"] = LLTrans::getString("New Skin");
+ mInventoryItemsDict["New Hair"] = LLTrans::getString("New Hair");
+ mInventoryItemsDict["New Eyes"] = LLTrans::getString("New Eyes");
+ mInventoryItemsDict["New Shirt"] = LLTrans::getString("New Shirt");
+ mInventoryItemsDict["New Pants"] = LLTrans::getString("New Pants");
+ mInventoryItemsDict["New Shoes"] = LLTrans::getString("New Shoes");
+ mInventoryItemsDict["New Socks"] = LLTrans::getString("New Socks");
+ mInventoryItemsDict["New Jacket"] = LLTrans::getString("New Jacket");
+ mInventoryItemsDict["New Gloves"] = LLTrans::getString("New Gloves");
+ mInventoryItemsDict["New Undershirt"] = LLTrans::getString("New Undershirt");
+ mInventoryItemsDict["New Underpants"] = LLTrans::getString("New Underpants");
+ mInventoryItemsDict["New Skirt"] = LLTrans::getString("New Skirt");
+ mInventoryItemsDict["New Alpha"] = LLTrans::getString("New Alpha");
+ mInventoryItemsDict["New Tattoo"] = LLTrans::getString("New Tattoo");
+ mInventoryItemsDict["Invalid Wearable"] = LLTrans::getString("Invalid Wearable");
+
+ mInventoryItemsDict["New Script"] = LLTrans::getString("New Script");
+ mInventoryItemsDict["New Folder"] = LLTrans::getString("New Folder");
+ mInventoryItemsDict["Contents"] = LLTrans::getString("Contents");
+
+ mInventoryItemsDict["Gesture"] = LLTrans::getString("Gesture");
+ mInventoryItemsDict["Male Gestures"] = LLTrans::getString("Male Gestures");
+ mInventoryItemsDict["Female Gestures"] = LLTrans::getString("Female Gestures");
+ mInventoryItemsDict["Other Gestures"] = LLTrans::getString("Other Gestures");
+ mInventoryItemsDict["Speech Gestures"] = LLTrans::getString("Speech Gestures");
+ mInventoryItemsDict["Common Gestures"] = LLTrans::getString("Common Gestures");
+
+ //predefined gestures
+
+ //male
+ mInventoryItemsDict["Male - Excuse me"] = LLTrans::getString("Male - Excuse me");
+ mInventoryItemsDict["Male - Get lost"] = LLTrans::getString("Male - Get lost");
+ mInventoryItemsDict["Male - Blow kiss"] = LLTrans::getString("Male - Blow kiss");
+ mInventoryItemsDict["Male - Boo"] = LLTrans::getString("Male - Boo");
+ mInventoryItemsDict["Male - Bored"] = LLTrans::getString("Male - Bored");
+ mInventoryItemsDict["Male - Hey"] = LLTrans::getString("Male - Hey");
+ mInventoryItemsDict["Male - Laugh"] = LLTrans::getString("Male - Laugh");
+ mInventoryItemsDict["Male - Repulsed"] = LLTrans::getString("Male - Repulsed");
+ mInventoryItemsDict["Male - Shrug"] = LLTrans::getString("Male - Shrug");
+ mInventoryItemsDict["Male - Stick tougue out"] = LLTrans::getString("Male - Stick tougue out");
+ mInventoryItemsDict["Male - Wow"] = LLTrans::getString("Male - Wow");
+
+ //female
+ mInventoryItemsDict["Female - Excuse me"] = LLTrans::getString("Female - Excuse me");
+ mInventoryItemsDict["Female - Get lost"] = LLTrans::getString("Female - Get lost");
+ mInventoryItemsDict["Female - Blow kiss"] = LLTrans::getString("Female - Blow kiss");
+ mInventoryItemsDict["Female - Boo"] = LLTrans::getString("Female - Boo");
+ mInventoryItemsDict["Female - Bored"] = LLTrans::getString("Female - Bored");
+ mInventoryItemsDict["Female - Hey"] = LLTrans::getString("Female - Hey");
+ mInventoryItemsDict["Female - Laugh"] = LLTrans::getString("Female - Laugh");
+ mInventoryItemsDict["Female - Repulsed"] = LLTrans::getString("Female - Repulsed");
+ mInventoryItemsDict["Female - Shrug"] = LLTrans::getString("Female - Shrug");
+ mInventoryItemsDict["Female - Stick tougue out"]= LLTrans::getString("Female - Stick tougue out");
+ mInventoryItemsDict["Female - Wow"] = LLTrans::getString("Female - Wow");
+
+ }
+};
+
///----------------------------------------------------------------------------
/// Local function declarations, constants, enums, and typedefs
@@ -100,7 +175,7 @@ public:
const std::string verb = params[1].asString();
if (verb == "select")
{
- std::vector<LLUUID> items_to_open;
+ uuid_vec_t items_to_open;
items_to_open.push_back(inventory_id);
//inventory_handler is just a stub, because we don't know from who this offer
open_inventory_offer(items_to_open, "inventory_handler");
@@ -260,10 +335,14 @@ void LLViewerInventoryItem::fetchFromServer(void) const
// we have to check region. It can be null after region was destroyed. See EXT-245
if (region)
{
- if( ALEXANDRIA_LINDEN_ID.getString() == mPermissions.getOwner().getString())
- url = region->getCapability("FetchLib");
- else
- url = region->getCapability("FetchInventory");
+ if(gAgent.getID() != mPermissions.getOwner())
+ {
+ url = region->getCapability("FetchLib");
+ }
+ else
+ {
+ url = region->getCapability("FetchInventory");
+ }
}
else
{
@@ -311,6 +390,18 @@ BOOL LLViewerInventoryItem::unpackMessage(LLSD item)
BOOL LLViewerInventoryItem::unpackMessage(LLMessageSystem* msg, const char* block, S32 block_num)
{
BOOL rv = LLInventoryItem::unpackMessage(msg, block, block_num);
+
+ std::string localized_str;
+
+ std::map<std::string, std::string>::const_iterator dictionary_iter;
+
+ dictionary_iter = LLLocalizedInventoryItemsDictionary::getInstance()->mInventoryItemsDict.find(mName);
+
+ if(dictionary_iter != LLLocalizedInventoryItemsDictionary::getInstance()->mInventoryItemsDict.end())
+ {
+ mName = dictionary_iter->second;
+ }
+
mIsComplete = TRUE;
return rv;
}
@@ -511,11 +602,12 @@ void LLViewerInventoryCategory::removeFromServer( void )
gAgent.sendReliableMessage();
}
-bool LLViewerInventoryCategory::fetchDescendents()
+bool LLViewerInventoryCategory::fetch()
{
if((VERSION_UNKNOWN == mVersion)
&& mDescendentsRequested.hasExpired()) //Expired check prevents multiple downloads.
{
+ LL_DEBUGS("InventoryFetch") << "Fetching category children: " << mName << ", UUID: " << mUUID << LL_ENDL;
const F32 FETCH_TIMER_EXPIRY = 10.0f;
mDescendentsRequested.reset();
mDescendentsRequested.setTimerExpirySec(FETCH_TIMER_EXPIRY);
@@ -525,7 +617,7 @@ bool LLViewerInventoryCategory::fetchDescendents()
// 2 = folders by date
// Need to mask off anything but the first bit.
// This comes from LLInventoryFilter from llfolderview.h
- U32 sort_order = gSavedSettings.getU32("InventorySortOrder") & 0x1;
+ U32 sort_order = gSavedSettings.getU32(LLInventoryPanel::DEFAULT_SORT_ORDER) & 0x1;
// *NOTE: For bug EXT-2879, originally commented out
// gAgent.getRegion()->getCapability in order to use the old
@@ -536,7 +628,7 @@ bool LLViewerInventoryCategory::fetchDescendents()
std::string url = gAgent.getRegion()->getCapability("WebFetchInventoryDescendents");
if (!url.empty()) //Capability found. Build up LLSD and use it.
{
- gInventory.startBackgroundFetch(mUUID);
+ LLInventoryModelBackgroundFetch::instance().start(mUUID, false);
}
else
{ //Deprecated, but if we don't have a capability, use the old system.
@@ -649,6 +741,8 @@ bool LLViewerInventoryCategory::exportFileLocal(LLFILE* fp) const
void LLViewerInventoryCategory::determineFolderType()
{
+ /* Do NOT uncomment this code. This is for future 2.1 support of ensembles.
+ llassert(FALSE);
LLFolderType::EType original_type = getPreferredType();
if (LLFolderType::lookupIsProtectedType(original_type))
return;
@@ -671,8 +765,8 @@ void LLViewerInventoryCategory::determineFolderType()
return;
if (item->isWearableType())
{
- const EWearableType wearable_type = item->getWearableType();
- const std::string& wearable_name = LLWearableDictionary::getTypeName(wearable_type);
+ const LLWearableType::EType wearable_type = item->getWearableType();
+ const std::string& wearable_name = LLWearableType::getTypeName(wearable_type);
U64 valid_folder_types = LLViewerFolderType::lookupValidFolderTypes(wearable_name);
folder_valid |= valid_folder_types;
folder_invalid |= ~valid_folder_types;
@@ -692,6 +786,8 @@ void LLViewerInventoryCategory::determineFolderType()
{
changeType(LLFolderType::FT_NONE);
}
+ llassert(FALSE);
+ */
}
void LLViewerInventoryCategory::changeType(LLFolderType::EType new_folder_type)
@@ -779,19 +875,25 @@ void WearOnAvatarCallback::fire(const LLUUID& inv_item)
LLViewerInventoryItem *item = gInventory.getItem(inv_item);
if (item)
{
- wear_inventory_item_on_avatar(item);
+ LLAppearanceMgr::instance().wearItemOnAvatar(inv_item, true, mReplace);
}
}
void ModifiedCOFCallback::fire(const LLUUID& inv_item)
{
- LLAppearanceManager::instance().updateAppearanceFromCOF();
- if( CAMERA_MODE_CUSTOMIZE_AVATAR == gAgent.getCameraMode() )
+ LLAppearanceMgr::instance().updateAppearanceFromCOF();
+
+ // Start editing the item if previously requested.
+ gAgentWearables.editWearableIfRequested(inv_item);
+
+ // TODO: camera mode may not be changed if a debug setting is tweaked
+ if( gAgentCamera.cameraCustomizeAvatar() )
{
// If we're in appearance editing mode, the current tab may need to be refreshed
- if (gFloaterCustomize)
+ LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLSideTray::getInstance()->getPanel("sidepanel_appearance"));
+ if (panel)
{
- gFloaterCustomize->switchToDefaultSubpart();
+ panel->showDefaultSubpart();
}
}
}
@@ -820,8 +922,13 @@ void ActivateGestureCallback::fire(const LLUUID& inv_item)
{
if (inv_item.isNull())
return;
+ LLViewerInventoryItem* item = gInventory.getItem(inv_item);
+ if (!item)
+ return;
+ if (item->getType() != LLAssetType::AT_GESTURE)
+ return;
- LLGestureManager::instance().activateGesture(inv_item);
+ LLGestureMgr::instance().activateGesture(inv_item);
}
void CreateGestureCallback::fire(const LLUUID& inv_item)
@@ -829,7 +936,7 @@ void CreateGestureCallback::fire(const LLUUID& inv_item)
if (inv_item.isNull())
return;
- LLGestureManager::instance().activateGesture(inv_item);
+ LLGestureMgr::instance().activateGesture(inv_item);
LLViewerInventoryItem* item = gInventory.getItem(inv_item);
if (!item) return;
@@ -854,10 +961,29 @@ void create_inventory_item(const LLUUID& agent_id, const LLUUID& session_id,
const LLUUID& parent, const LLTransactionID& transaction_id,
const std::string& name,
const std::string& desc, LLAssetType::EType asset_type,
- LLInventoryType::EType inv_type, EWearableType wtype,
+ LLInventoryType::EType inv_type, LLWearableType::EType wtype,
U32 next_owner_perm,
LLPointer<LLInventoryCallback> cb)
{
+ //check if name is equal to one of special inventory items names
+ //EXT-5839
+ std::string server_name = name;
+
+ {
+ std::map<std::string, std::string>::const_iterator dictionary_iter;
+
+ for (dictionary_iter = LLLocalizedInventoryItemsDictionary::getInstance()->mInventoryItemsDict.begin();
+ dictionary_iter != LLLocalizedInventoryItemsDictionary::getInstance()->mInventoryItemsDict.end();
+ dictionary_iter++)
+ {
+ const std::string& localized_name = dictionary_iter->second;
+ if(localized_name == name)
+ {
+ server_name = dictionary_iter->first;
+ }
+ }
+ }
+
LLMessageSystem* msg = gMessageSystem;
msg->newMessageFast(_PREHASH_CreateInventoryItem);
msg->nextBlock(_PREHASH_AgentData);
@@ -871,7 +997,7 @@ void create_inventory_item(const LLUUID& agent_id, const LLUUID& session_id,
msg->addS8Fast(_PREHASH_Type, (S8)asset_type);
msg->addS8Fast(_PREHASH_InvType, (S8)inv_type);
msg->addU8Fast(_PREHASH_WearableType, (U8)wtype);
- msg->addStringFast(_PREHASH_Name, name);
+ msg->addStringFast(_PREHASH_Name, server_name);
msg->addStringFast(_PREHASH_Description, desc);
gAgent.sendReliableMessage();
@@ -914,6 +1040,7 @@ void link_inventory_item(
const LLUUID& item_id,
const LLUUID& parent_id,
const std::string& new_name,
+ const std::string& new_description,
const LLAssetType::EType asset_type,
LLPointer<LLInventoryCallback> cb)
{
@@ -939,7 +1066,6 @@ void link_inventory_item(
}
LLUUID transaction_id;
- std::string desc = "Broken link"; // This should only show if the object can't find its baseobj.
LLInventoryType::EType inv_type = LLInventoryType::IT_NONE;
if (dynamic_cast<const LLInventoryCategory *>(baseobj))
{
@@ -970,7 +1096,7 @@ void link_inventory_item(
msg->addS8Fast(_PREHASH_Type, (S8)asset_type);
msg->addS8Fast(_PREHASH_InvType, (S8)inv_type);
msg->addStringFast(_PREHASH_Name, new_name);
- msg->addStringFast(_PREHASH_Description, desc);
+ msg->addStringFast(_PREHASH_Description, new_description);
}
gAgent.sendReliableMessage();
}
@@ -1066,7 +1192,7 @@ const std::string NEW_NOTECARD_NAME = "New Note"; // *TODO:Translate? (probably
const std::string NEW_GESTURE_NAME = "New Gesture"; // *TODO:Translate? (probably not)
// ! REFACTOR ! Really need to refactor this so that it's not a bunch of if-then statements...
-void menu_create_inventory_item(LLFolderView* folder, LLFolderBridge *bridge, const LLSD& userdata, const LLUUID& default_parent_uuid)
+void menu_create_inventory_item(LLFolderView* root, LLFolderBridge *bridge, const LLSD& userdata, const LLUUID& default_parent_uuid)
{
std::string type_name = userdata.asString();
@@ -1090,7 +1216,7 @@ void menu_create_inventory_item(LLFolderView* folder, LLFolderBridge *bridge, co
LLUUID category = gInventory.createNewCategory(parent_id, preferred_type, LLStringUtil::null);
gInventory.notifyObservers();
- folder->setSelectionByID(category, TRUE);
+ root->setSelectionByID(category, TRUE);
}
else if ("lsl" == type_name)
{
@@ -1122,20 +1248,18 @@ void menu_create_inventory_item(LLFolderView* folder, LLFolderBridge *bridge, co
else
{
// Use for all clothing and body parts. Adding new wearable types requires updating LLWearableDictionary.
- EWearableType wearable_type = LLWearableDictionary::typeNameToType(type_name);
- if (wearable_type >= WT_SHAPE && wearable_type < WT_COUNT)
+ LLWearableType::EType wearable_type = LLWearableType::typeNameToType(type_name);
+ if (wearable_type >= LLWearableType::WT_SHAPE && wearable_type < LLWearableType::WT_COUNT)
{
- LLAssetType::EType asset_type = LLWearableDictionary::getAssetType(wearable_type);
- LLFolderType::EType folder_type = LLFolderType::assetTypeToFolderType(asset_type);
- const LLUUID parent_id = bridge ? bridge->getUUID() : gInventory.findCategoryUUIDForType(folder_type);
- LLFolderBridge::createWearable(parent_id, wearable_type);
+ const LLUUID parent_id = bridge ? bridge->getUUID() : LLUUID::null;
+ LLAgentWearables::createWearable(wearable_type, false, parent_id);
}
else
{
llwarns << "Can't create unrecognized type " << type_name << llendl;
}
}
- folder->setNeedsAutoRename(TRUE);
+ root->setNeedsAutoRename(TRUE);
}
LLAssetType::EType LLViewerInventoryItem::getType() const
@@ -1161,6 +1285,40 @@ const LLUUID& LLViewerInventoryItem::getAssetUUID() const
return LLInventoryItem::getAssetUUID();
}
+const LLUUID& LLViewerInventoryItem::getProtectedAssetUUID() const
+{
+ if (const LLViewerInventoryItem *linked_item = getLinkedItem())
+ {
+ return linked_item->getProtectedAssetUUID();
+ }
+
+ // check for conditions under which we may return a visible UUID to the user
+ bool item_is_fullperm = getIsFullPerm();
+ bool agent_is_godlike = gAgent.isGodlikeWithoutAdminMenuFakery();
+ if (item_is_fullperm || agent_is_godlike)
+ {
+ return LLInventoryItem::getAssetUUID();
+ }
+
+ return LLUUID::null;
+}
+
+const bool LLViewerInventoryItem::getIsFullPerm() const
+{
+ LLPermissions item_permissions = getPermissions();
+
+ // modify-ok & copy-ok & transfer-ok
+ return ( item_permissions.allowOperationBy(PERM_MODIFY,
+ gAgent.getID(),
+ gAgent.getGroupID()) &&
+ item_permissions.allowOperationBy(PERM_COPY,
+ gAgent.getID(),
+ gAgent.getGroupID()) &&
+ item_permissions.allowOperationBy(PERM_TRANSFER,
+ gAgent.getID(),
+ gAgent.getGroupID()) );
+}
+
const std::string& LLViewerInventoryItem::getName() const
{
if (const LLViewerInventoryItem *linked_item = getLinkedItem())
@@ -1429,14 +1587,13 @@ bool LLViewerInventoryItem::isWearableType() const
return (getInventoryType() == LLInventoryType::IT_WEARABLE);
}
-EWearableType LLViewerInventoryItem::getWearableType() const
+LLWearableType::EType LLViewerInventoryItem::getWearableType() const
{
if (!isWearableType())
{
- llwarns << "item is not a wearable" << llendl;
- return WT_INVALID;
+ return LLWearableType::WT_INVALID;
}
- return EWearableType(getFlags() & LLInventoryItem::II_FLAGS_WEARABLES_MASK);
+ return LLWearableType::EType(getFlags() & LLInventoryItemFlags::II_FLAGS_WEARABLES_MASK);
}
@@ -1542,6 +1699,20 @@ bool LLViewerInventoryItem::checkPermissionsSet(PermissionMask mask) const
return ((curr_mask & mask) == mask);
}
+PermissionMask LLViewerInventoryItem::getPermissionMask() const
+{
+ const LLPermissions& permissions = getPermissions();
+
+ BOOL copy = permissions.allowCopyBy(gAgent.getID());
+ BOOL mod = permissions.allowModifyBy(gAgent.getID());
+ BOOL xfer = permissions.allowOperationBy(PERM_TRANSFER, gAgent.getID());
+ PermissionMask perm_mask = 0;
+ if (copy) perm_mask |= PERM_COPY;
+ if (mod) perm_mask |= PERM_MODIFY;
+ if (xfer) perm_mask |= PERM_TRANSFER;
+ return perm_mask;
+}
+
//----------
void LLViewerInventoryItem::onCallingCardNameLookup(const LLUUID& id, const std::string& first_name, const std::string& last_name)
diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h
index c24f76c87a..d0d3ad693e 100644
--- a/indra/newview/llviewerinventory.h
+++ b/indra/newview/llviewerinventory.h
@@ -63,16 +63,18 @@ protected:
public:
virtual LLAssetType::EType getType() const;
virtual const LLUUID& getAssetUUID() const;
+ virtual const LLUUID& getProtectedAssetUUID() const; // returns LLUUID::null if current agent does not have permission to expose this asset's UUID to the user
virtual const std::string& getName() const;
virtual S32 getSortField() const;
virtual void setSortField(S32 sortField);
virtual const LLPermissions& getPermissions() const;
+ virtual const bool getIsFullPerm() const; // 'fullperm' in the popular sense: modify-ok & copy-ok & transfer-ok, no special god rules applied
virtual const LLUUID& getCreatorUUID() const;
virtual const std::string& getDescription() const;
virtual const LLSaleInfo& getSaleInfo() const;
virtual LLInventoryType::EType getInventoryType() const;
virtual bool isWearableType() const;
- virtual EWearableType getWearableType() const;
+ virtual LLWearableType::EType getWearableType() const;
virtual U32 getFlags() const;
virtual time_t getCreationDate() const;
virtual U32 getCRC32() const; // really more of a checksum.
@@ -136,7 +138,7 @@ public:
bool importFileLocal(LLFILE* fp);
// new methods
- BOOL isComplete() const { return mIsComplete; }
+ BOOL isFinished() const { return mIsComplete; }
void setComplete(BOOL complete) { mIsComplete = complete; }
//void updateAssetOnServer() const;
@@ -157,6 +159,7 @@ public:
// Checks the items permissions (for owner, group, or everyone) and returns true if all mask bits are set.
bool checkPermissionsSet(PermissionMask mask) const;
+ PermissionMask getPermissionMask() const;
// callback
void onCallingCardNameLookup(const LLUUID& id, const std::string& first_name, const std::string& last_name);
@@ -210,7 +213,7 @@ public:
void setVersion(S32 version) { mVersion = version; }
// Returns true if a fetch was issued.
- bool fetchDescendents();
+ bool fetch();
// used to help make cacheing more robust - for example, if
// someone is getting 4 packets but logs out after 3. the viewer
@@ -240,7 +243,13 @@ public:
class WearOnAvatarCallback : public LLInventoryCallback
{
+public:
+ WearOnAvatarCallback(bool do_replace = false) : mReplace(do_replace) {}
+
void fire(const LLUUID& inv_item);
+
+protected:
+ bool mReplace;
};
class ModifiedCOFCallback : public LLInventoryCallback
@@ -308,14 +317,14 @@ public:
extern LLInventoryCallbackManager gInventoryCallbacks;
-#define NOT_WEARABLE (EWearableType)0
+#define NOT_WEARABLE (LLWearableType::EType)0
// *TODO: Find a home for these
void create_inventory_item(const LLUUID& agent_id, const LLUUID& session_id,
const LLUUID& parent, const LLTransactionID& transaction_id,
const std::string& name,
const std::string& desc, LLAssetType::EType asset_type,
- LLInventoryType::EType inv_type, EWearableType wtype,
+ LLInventoryType::EType inv_type, LLWearableType::EType wtype,
U32 next_owner_perm,
LLPointer<LLInventoryCallback> cb);
@@ -337,6 +346,7 @@ void link_inventory_item(
const LLUUID& item_id,
const LLUUID& parent_id,
const std::string& new_name,
+ const std::string& new_description,
const LLAssetType::EType asset_type,
LLPointer<LLInventoryCallback> cb);
@@ -354,7 +364,7 @@ void copy_inventory_from_notecard(const LLUUID& object_id,
U32 callback_id = 0);
-void menu_create_inventory_item(LLFolderView* folder,
+void menu_create_inventory_item(LLFolderView* root,
LLFolderBridge* bridge,
const LLSD& userdata,
const LLUUID& default_parent_uuid = LLUUID::null);
diff --git a/indra/newview/llviewerjointmesh.cpp b/indra/newview/llviewerjointmesh.cpp
index 1a67fc0966..7225aa1523 100644
--- a/indra/newview/llviewerjointmesh.cpp
+++ b/indra/newview/llviewerjointmesh.cpp
@@ -626,7 +626,7 @@ U32 LLViewerJointMesh::drawShape( F32 pixelArea, BOOL first_pass, BOOL is_dummy)
mFace->mVertexBuffer->drawRange(LLRender::TRIANGLES, start, end, count, offset);
glPopMatrix();
}
- gPipeline.addTrianglesDrawn(count/3);
+ gPipeline.addTrianglesDrawn(count);
triangle_count += count;
diff --git a/indra/newview/llviewerjoystick.cpp b/indra/newview/llviewerjoystick.cpp
index b593fbfb00..240a539f2e 100644
--- a/indra/newview/llviewerjoystick.cpp
+++ b/indra/newview/llviewerjoystick.cpp
@@ -43,6 +43,7 @@
#include "llselectmgr.h"
#include "llviewermenu.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llfocusmgr.h"
@@ -106,7 +107,7 @@ void LLViewerJoystick::setOverrideCamera(bool val)
if (mOverrideCamera)
{
- gAgent.changeCameraToDefault();
+ gAgentCamera.changeCameraToDefault();
}
}
@@ -162,7 +163,7 @@ LLViewerJoystick::LLViewerJoystick()
memset(mBtn, 0, sizeof(mBtn));
// factor in bandwidth? bandwidth = gViewerStats->mKBitStat
- mPerfScale = 4000.f / gSysCPU.getMhz();
+ mPerfScale = 4000.f / gSysCPU.getMHz(); // hmm. why?
}
// -----------------------------------------------------------------------------
@@ -432,7 +433,7 @@ void LLViewerJoystick::agentPitch(F32 pitch_inc)
void LLViewerJoystick::agentYaw(F32 yaw_inc)
{
// Cannot steer some vehicles in mouselook if the script grabs the controls
- if (gAgent.cameraMouselook() && !gSavedSettings.getBOOL("JoystickMouselookYaw"))
+ if (gAgentCamera.cameraMouselook() && !gSavedSettings.getBOOL("JoystickMouselookYaw"))
{
gAgent.rotate(-yaw_inc, gAgent.getReferenceUpVector());
}
@@ -1005,7 +1006,7 @@ bool LLViewerJoystick::toggleFlycam()
if (!mOverrideCamera)
{
- gAgent.changeCameraToDefault();
+ gAgentCamera.changeCameraToDefault();
}
if (gAwayTimer.getElapsedTimeF32() > MIN_AFK_TIME)
diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp
index f757155b94..dd7390a907 100644
--- a/indra/newview/llviewerkeyboard.cpp
+++ b/indra/newview/llviewerkeyboard.cpp
@@ -36,6 +36,7 @@
#include "llviewerkeyboard.h"
#include "llmath.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llnearbychatbar.h"
#include "llviewercontrol.h"
#include "llfocusmgr.h"
@@ -279,22 +280,22 @@ F32 get_orbit_rate()
void camera_spin_around_ccw( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
- gAgent.unlockView();
- gAgent.setOrbitLeftKey( get_orbit_rate() );
+ gAgentCamera.unlockView();
+ gAgentCamera.setOrbitLeftKey( get_orbit_rate() );
}
void camera_spin_around_cw( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
- gAgent.unlockView();
- gAgent.setOrbitRightKey( get_orbit_rate() );
+ gAgentCamera.unlockView();
+ gAgentCamera.setOrbitRightKey( get_orbit_rate() );
}
void camera_spin_around_ccw_sitting( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
- if (gAgent.rotateGrabbed() || gAgent.sitCameraEnabled())
+ if (gAgent.rotateGrabbed() || gAgentCamera.sitCameraEnabled())
{
//send keystrokes, but do not change camera
agent_turn_right(s);
@@ -302,7 +303,7 @@ void camera_spin_around_ccw_sitting( EKeystate s )
else
{
//change camera but do not send keystrokes
- gAgent.setOrbitLeftKey( get_orbit_rate() );
+ gAgentCamera.setOrbitLeftKey( get_orbit_rate() );
}
}
@@ -310,7 +311,7 @@ void camera_spin_around_ccw_sitting( EKeystate s )
void camera_spin_around_cw_sitting( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
- if (gAgent.rotateGrabbed() || gAgent.sitCameraEnabled())
+ if (gAgent.rotateGrabbed() || gAgentCamera.sitCameraEnabled())
{
//send keystrokes, but do not change camera
agent_turn_left(s);
@@ -318,7 +319,7 @@ void camera_spin_around_cw_sitting( EKeystate s )
else
{
//change camera but do not send keystrokes
- gAgent.setOrbitRightKey( get_orbit_rate() );
+ gAgentCamera.setOrbitRightKey( get_orbit_rate() );
}
}
@@ -326,22 +327,22 @@ void camera_spin_around_cw_sitting( EKeystate s )
void camera_spin_over( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
- gAgent.unlockView();
- gAgent.setOrbitUpKey( get_orbit_rate() );
+ gAgentCamera.unlockView();
+ gAgentCamera.setOrbitUpKey( get_orbit_rate() );
}
void camera_spin_under( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
- gAgent.unlockView();
- gAgent.setOrbitDownKey( get_orbit_rate() );
+ gAgentCamera.unlockView();
+ gAgentCamera.setOrbitDownKey( get_orbit_rate() );
}
void camera_spin_over_sitting( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
- if (gAgent.upGrabbed() || gAgent.sitCameraEnabled())
+ if (gAgent.upGrabbed() || gAgentCamera.sitCameraEnabled())
{
//send keystrokes, but do not change camera
agent_jump(s);
@@ -349,7 +350,7 @@ void camera_spin_over_sitting( EKeystate s )
else
{
//change camera but do not send keystrokes
- gAgent.setOrbitUpKey( get_orbit_rate() );
+ gAgentCamera.setOrbitUpKey( get_orbit_rate() );
}
}
@@ -357,7 +358,7 @@ void camera_spin_over_sitting( EKeystate s )
void camera_spin_under_sitting( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
- if (gAgent.downGrabbed() || gAgent.sitCameraEnabled())
+ if (gAgent.downGrabbed() || gAgentCamera.sitCameraEnabled())
{
//send keystrokes, but do not change camera
agent_push_down(s);
@@ -365,35 +366,35 @@ void camera_spin_under_sitting( EKeystate s )
else
{
//change camera but do not send keystrokes
- gAgent.setOrbitDownKey( get_orbit_rate() );
+ gAgentCamera.setOrbitDownKey( get_orbit_rate() );
}
}
void camera_move_forward( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
- gAgent.unlockView();
- gAgent.setOrbitInKey( get_orbit_rate() );
+ gAgentCamera.unlockView();
+ gAgentCamera.setOrbitInKey( get_orbit_rate() );
}
void camera_move_backward( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
- gAgent.unlockView();
- gAgent.setOrbitOutKey( get_orbit_rate() );
+ gAgentCamera.unlockView();
+ gAgentCamera.setOrbitOutKey( get_orbit_rate() );
}
void camera_move_forward_sitting( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
- if (gAgent.forwardGrabbed() || gAgent.sitCameraEnabled())
+ if (gAgent.forwardGrabbed() || gAgentCamera.sitCameraEnabled())
{
agent_push_forward(s);
}
else
{
- gAgent.setOrbitInKey( get_orbit_rate() );
+ gAgentCamera.setOrbitInKey( get_orbit_rate() );
}
}
@@ -402,70 +403,70 @@ void camera_move_backward_sitting( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
- if (gAgent.backwardGrabbed() || gAgent.sitCameraEnabled())
+ if (gAgent.backwardGrabbed() || gAgentCamera.sitCameraEnabled())
{
agent_push_backward(s);
}
else
{
- gAgent.setOrbitOutKey( get_orbit_rate() );
+ gAgentCamera.setOrbitOutKey( get_orbit_rate() );
}
}
void camera_pan_up( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
- gAgent.unlockView();
- gAgent.setPanUpKey( get_orbit_rate() );
+ gAgentCamera.unlockView();
+ gAgentCamera.setPanUpKey( get_orbit_rate() );
}
void camera_pan_down( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
- gAgent.unlockView();
- gAgent.setPanDownKey( get_orbit_rate() );
+ gAgentCamera.unlockView();
+ gAgentCamera.setPanDownKey( get_orbit_rate() );
}
void camera_pan_left( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
- gAgent.unlockView();
- gAgent.setPanLeftKey( get_orbit_rate() );
+ gAgentCamera.unlockView();
+ gAgentCamera.setPanLeftKey( get_orbit_rate() );
}
void camera_pan_right( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
- gAgent.unlockView();
- gAgent.setPanRightKey( get_orbit_rate() );
+ gAgentCamera.unlockView();
+ gAgentCamera.setPanRightKey( get_orbit_rate() );
}
void camera_pan_in( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
- gAgent.unlockView();
- gAgent.setPanInKey( get_orbit_rate() );
+ gAgentCamera.unlockView();
+ gAgentCamera.setPanInKey( get_orbit_rate() );
}
void camera_pan_out( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
- gAgent.unlockView();
- gAgent.setPanOutKey( get_orbit_rate() );
+ gAgentCamera.unlockView();
+ gAgentCamera.setPanOutKey( get_orbit_rate() );
}
void camera_move_forward_fast( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
- gAgent.unlockView();
- gAgent.setOrbitInKey(2.5f);
+ gAgentCamera.unlockView();
+ gAgentCamera.setOrbitInKey(2.5f);
}
void camera_move_backward_fast( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
- gAgent.unlockView();
- gAgent.setOrbitOutKey(2.5f);
+ gAgentCamera.unlockView();
+ gAgentCamera.setOrbitOutKey(2.5f);
}
@@ -473,7 +474,7 @@ void edit_avatar_spin_ccw( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
gMorphView->setCameraDrivenByKeys( TRUE );
- gAgent.setOrbitLeftKey( get_orbit_rate() );
+ gAgentCamera.setOrbitLeftKey( get_orbit_rate() );
//gMorphView->orbitLeft( get_orbit_rate() );
}
@@ -482,7 +483,7 @@ void edit_avatar_spin_cw( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
gMorphView->setCameraDrivenByKeys( TRUE );
- gAgent.setOrbitRightKey( get_orbit_rate() );
+ gAgentCamera.setOrbitRightKey( get_orbit_rate() );
//gMorphView->orbitRight( get_orbit_rate() );
}
@@ -490,7 +491,7 @@ void edit_avatar_spin_over( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
gMorphView->setCameraDrivenByKeys( TRUE );
- gAgent.setOrbitUpKey( get_orbit_rate() );
+ gAgentCamera.setOrbitUpKey( get_orbit_rate() );
//gMorphView->orbitUp( get_orbit_rate() );
}
@@ -499,7 +500,7 @@ void edit_avatar_spin_under( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
gMorphView->setCameraDrivenByKeys( TRUE );
- gAgent.setOrbitDownKey( get_orbit_rate() );
+ gAgentCamera.setOrbitDownKey( get_orbit_rate() );
//gMorphView->orbitDown( get_orbit_rate() );
}
@@ -507,7 +508,7 @@ void edit_avatar_move_forward( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
gMorphView->setCameraDrivenByKeys( TRUE );
- gAgent.setOrbitInKey( get_orbit_rate() );
+ gAgentCamera.setOrbitInKey( get_orbit_rate() );
//gMorphView->orbitIn();
}
@@ -516,7 +517,7 @@ void edit_avatar_move_backward( EKeystate s )
{
if( KEYSTATE_UP == s ) return;
gMorphView->setCameraDrivenByKeys( TRUE );
- gAgent.setOrbitOutKey( get_orbit_rate() );
+ gAgentCamera.setOrbitOutKey( get_orbit_rate() );
//gMorphView->orbitOut();
}
@@ -868,7 +869,7 @@ S32 LLViewerKeyboard::loadBindings(const std::string& filename)
EKeyboardMode LLViewerKeyboard::getMode()
{
- if ( gAgent.cameraMouselook() )
+ if ( gAgentCamera.cameraMouselook() )
{
return MODE_FIRST_PERSON;
}
@@ -876,7 +877,7 @@ EKeyboardMode LLViewerKeyboard::getMode()
{
return MODE_EDIT_AVATAR;
}
- else if (gAgent.getAvatarObject() && gAgent.getAvatarObject()->isSitting())
+ else if (isAgentAvatarValid() && gAgentAvatarp->isSitting())
{
return MODE_SITTING;
}
diff --git a/indra/newview/llviewermedia.cpp b/indra/newview/llviewermedia.cpp
index 9ced0194a2..d7190f26a3 100644
--- a/indra/newview/llviewermedia.cpp
+++ b/indra/newview/llviewermedia.cpp
@@ -33,6 +33,7 @@
#include "llviewerprecompiledheaders.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llviewermedia.h"
#include "llviewermediafocus.h"
#include "llmimetypes.h"
@@ -45,11 +46,16 @@
#include "llviewertexturelist.h"
#include "llvovolume.h"
#include "llpluginclassmedia.h"
+#include "llplugincookiestore.h"
#include "llviewerwindow.h"
#include "llfocusmgr.h"
#include "llcallbacklist.h"
#include "llparcel.h"
#include "llaudioengine.h" // for gAudiop
+#include "llurldispatcher.h"
+#include "llvoavatar.h"
+#include "llvoavatarself.h"
+#include "llviewerregion.h"
#include "llevent.h" // LLSimpleListener
#include "llnotificationsutil.h"
@@ -57,11 +63,16 @@
#include "llkeyboard.h"
#include "llmutelist.h"
//#include "llfirstuse.h"
+#include "llwindow.h"
#include <boost/bind.hpp> // for SkinFolder listener
#include <boost/signals2.hpp>
/*static*/ const char* LLViewerMedia::AUTO_PLAY_MEDIA_SETTING = "ParcelMediaAutoPlayEnable";
+/*static*/ const char* LLViewerMedia::SHOW_MEDIA_ON_OTHERS_SETTING = "MediaShowOnOthers";
+/*static*/ const char* LLViewerMedia::SHOW_MEDIA_WITHIN_PARCEL_SETTING = "MediaShowWithinParcel";
+/*static*/ const char* LLViewerMedia::SHOW_MEDIA_OUTSIDE_PARCEL_SETTING = "MediaShowOutsideParcel";
+
// Move this to its own file.
@@ -247,12 +258,53 @@ public:
LLViewerMediaImpl *mMediaImpl;
bool mInitialized;
};
+
+class LLViewerMediaOpenIDResponder : public LLHTTPClient::Responder
+{
+LOG_CLASS(LLViewerMediaOpenIDResponder);
+public:
+ LLViewerMediaOpenIDResponder( )
+ {
+ }
+
+ ~LLViewerMediaOpenIDResponder()
+ {
+ }
+
+ /* virtual */ void completedHeader(U32 status, const std::string& reason, const LLSD& content)
+ {
+ LL_DEBUGS("MediaAuth") << "status = " << status << ", reason = " << reason << LL_ENDL;
+ LL_DEBUGS("MediaAuth") << content << LL_ENDL;
+ std::string cookie = content["set-cookie"].asString();
+
+ LLViewerMedia::openIDCookieResponse(cookie);
+ }
+
+ /* virtual */ void completedRaw(
+ U32 status,
+ const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+ {
+ // This is just here to disable the default behavior (attempting to parse the response as llsd).
+ // We don't care about the content of the response, only the set-cookie header.
+ }
+
+};
+
+LLPluginCookieStore *LLViewerMedia::sCookieStore = NULL;
+LLURL LLViewerMedia::sOpenIDURL;
+std::string LLViewerMedia::sOpenIDCookie;
static LLViewerMedia::impl_list sViewerMediaImplList;
static LLViewerMedia::impl_id_map sViewerMediaTextureIDMap;
static LLTimer sMediaCreateTimer;
static const F32 LLVIEWERMEDIA_CREATE_DELAY = 1.0f;
static F32 sGlobalVolume = 1.0f;
static F64 sLowestLoadableImplInterest = 0.0f;
+static bool sAnyMediaShowing = false;
+static boost::signals2::connection sTeleportFinishConnection;
+static std::string sUpdatedCookies;
+static const char *PLUGIN_COOKIE_FILE_NAME = "plugin_cookies.txt";
//////////////////////////////////////////////////////////////////////////////////////////
static void add_media_impl(LLViewerMediaImpl* media)
@@ -365,8 +417,7 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s
// The current media URL is not empty.
// If (the media was already loaded OR the media was set to autoplay) AND this update didn't come from this agent,
// do a navigate.
- bool auto_play = (media_impl->mMediaAutoPlay && gSavedSettings.getBOOL(AUTO_PLAY_MEDIA_SETTING));
-
+ bool auto_play = media_impl->isAutoPlayable();
if((was_loaded || auto_play) && !update_from_self)
{
needs_navigate = url_changed;
@@ -389,8 +440,7 @@ viewer_media_t LLViewerMedia::updateMediaImpl(LLMediaEntry* media_entry, const s
media_impl->setHomeURL(media_entry->getHomeURL());
media_impl->mMediaAutoPlay = media_entry->getAutoPlay();
media_impl->mMediaEntryURL = media_entry->getCurrentURL();
-
- if(media_impl->mMediaAutoPlay && gSavedSettings.getBOOL(AUTO_PLAY_MEDIA_SETTING))
+ if(media_impl->isAutoPlayable())
{
needs_navigate = true;
}
@@ -683,16 +733,31 @@ static bool proximity_comparitor(const LLViewerMediaImpl* i1, const LLViewerMedi
}
}
+static LLFastTimer::DeclareTimer FTM_MEDIA_UPDATE("Update Media");
+
//////////////////////////////////////////////////////////////////////////////////////////
// static
void LLViewerMedia::updateMedia(void *dummy_arg)
{
+ LLFastTimer t1(FTM_MEDIA_UPDATE);
+
+ // Enable/disable the plugin read thread
+ LLPluginProcessParent::setUseReadThread(gSavedSettings.getBOOL("PluginUseReadThread"));
+
+ sAnyMediaShowing = false;
+ sUpdatedCookies = getCookieStore()->getChangedCookies();
+ if(!sUpdatedCookies.empty())
+ {
+ lldebugs << "updated cookies will be sent to all loaded plugins: " << llendl;
+ lldebugs << sUpdatedCookies << llendl;
+ }
+
impl_list::iterator iter = sViewerMediaImplList.begin();
impl_list::iterator end = sViewerMediaImplList.end();
- for(; iter != end; iter++)
+ for(; iter != end;)
{
- LLViewerMediaImpl* pimpl = *iter;
+ LLViewerMediaImpl* pimpl = *iter++;
pimpl->update();
pimpl->calculateInterest();
}
@@ -712,7 +777,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
std::vector<LLViewerMediaImpl*> proximity_order;
bool inworld_media_enabled = gSavedSettings.getBOOL("AudioStreamingMedia");
- bool needs_first_run = LLViewerMedia::needsMediaFirstRun();
+ bool inworld_audio_enabled = gSavedSettings.getBOOL("AudioStreamingMusic");
U32 max_instances = gSavedSettings.getU32("PluginInstancesTotal");
U32 max_normal = gSavedSettings.getU32("PluginInstancesNormal");
U32 max_low = gSavedSettings.getU32("PluginInstancesLow");
@@ -818,7 +883,7 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
impl_count_total++;
}
-
+
// Overrides if the window is minimized or we lost focus (taking care
// not to accidentally "raise" the priority either)
if (!gViewerWindow->getActive() /* viewer window minimized? */
@@ -838,15 +903,16 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
if(!pimpl->getUsedInUI())
{
new_priority = LLPluginClassMedia::PRIORITY_UNLOADED;
- if(needs_first_run)
- {
- // Don't do this more than once in this loop.
- needs_first_run = false;
- LLViewerMedia::displayMediaFirstRun();
- }
}
}
-
+ // update the audio stream here as well
+ if( !inworld_audio_enabled)
+ {
+ if(LLViewerMedia::isParcelAudioPlaying() && gAudiop && LLViewerMedia::hasParcelAudio())
+ {
+ gAudiop->stopInternetStream();
+ }
+ }
pimpl->setPriority(new_priority);
if(pimpl->getUsedInUI())
@@ -860,6 +926,12 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
}
total_cpu += pimpl->getCPUUsage();
+
+ if (!pimpl->getUsedInUI() && pimpl->hasMedia())
+ {
+ sAnyMediaShowing = true;
+ }
+
}
// Re-calculate this every time.
@@ -901,70 +973,463 @@ void LLViewerMedia::updateMedia(void *dummy_arg)
//////////////////////////////////////////////////////////////////////////////////////////
// static
-void LLViewerMedia::initClass()
+bool LLViewerMedia::isAnyMediaShowing()
{
- gIdleCallbacks.addFunction(LLViewerMedia::updateMedia, NULL);
+ return sAnyMediaShowing;
}
//////////////////////////////////////////////////////////////////////////////////////////
// static
-void LLViewerMedia::cleanupClass()
+void LLViewerMedia::setAllMediaEnabled(bool val)
{
- gIdleCallbacks.deleteFunction(LLViewerMedia::updateMedia, NULL);
+ // Set "tentative" autoplay first. We need to do this here or else
+ // re-enabling won't start up the media below.
+ gSavedSettings.setBOOL("MediaTentativeAutoPlay", val);
+
+ // Then
+ impl_list::iterator iter = sViewerMediaImplList.begin();
+ impl_list::iterator end = sViewerMediaImplList.end();
+
+ for(; iter != end; iter++)
+ {
+ LLViewerMediaImpl* pimpl = *iter;
+ if (!pimpl->getUsedInUI())
+ {
+ pimpl->setDisabled(!val);
+ }
+ }
+
+ // Also do Parcel Media and Parcel Audio
+ if (val)
+ {
+ if (!LLViewerMedia::isParcelMediaPlaying() && LLViewerMedia::hasParcelMedia())
+ {
+ LLViewerParcelMedia::play(LLViewerParcelMgr::getInstance()->getAgentParcel());
+ }
+
+ if (gSavedSettings.getBOOL("AudioStreamingMusic") &&
+ !LLViewerMedia::isParcelAudioPlaying() &&
+ gAudiop &&
+ LLViewerMedia::hasParcelAudio())
+ {
+ gAudiop->startInternetStream(LLViewerMedia::getParcelAudioURL());
+ }
+ }
+ else {
+ // This actually unloads the impl, as opposed to "stop"ping the media
+ LLViewerParcelMedia::stop();
+ if (gAudiop) gAudiop->stopInternetStream();
+ }
}
-
//////////////////////////////////////////////////////////////////////////////////////////
// static
-bool LLViewerMedia::needsMediaFirstRun()
+bool LLViewerMedia::isParcelMediaPlaying()
{
- return gWarningSettings.getBOOL("FirstStreamingMedia");
+ return (LLViewerMedia::hasParcelMedia() && LLViewerParcelMedia::getParcelMedia() && LLViewerParcelMedia::getParcelMedia()->hasMedia());
}
-//////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////
// static
-void LLViewerMedia::displayMediaFirstRun()
+bool LLViewerMedia::isParcelAudioPlaying()
{
- gWarningSettings.setBOOL("FirstStreamingMedia", FALSE);
+ return (LLViewerMedia::hasParcelAudio() && gAudiop && LLAudioEngine::AUDIO_PLAYING == gAudiop->isInternetStreamPlaying());
+}
- LLNotificationsUtil::add("ParcelCanPlayMedia", LLSD(), LLSD(),
- boost::bind(firstRunCallback, _1, _2));
+/////////////////////////////////////////////////////////////////////////////////////////
+// static
+void LLViewerMedia::clearAllCookies()
+{
+ // Clear all cookies for all plugins
+ impl_list::iterator iter = sViewerMediaImplList.begin();
+ impl_list::iterator end = sViewerMediaImplList.end();
+ for (; iter != end; iter++)
+ {
+ LLViewerMediaImpl* pimpl = *iter;
+ if(pimpl->mMediaSource)
+ {
+ pimpl->mMediaSource->clear_cookies();
+ }
+ }
+
+ // Clear all cookies from the cookie store
+ getCookieStore()->setAllCookies("");
+
+ // FIXME: this may not be sufficient, since the on-disk cookie file won't get written until some browser instance exits cleanly.
+ // It also won't clear cookies for other accounts, or for any account if we're not logged in, and won't do anything at all if there are no webkit plugins loaded.
+ // Until such time as we can centralize cookie storage, the following hack should cover these cases:
+
+ // HACK: Look for cookie files in all possible places and delete them.
+ // NOTE: this assumes knowledge of what happens inside the webkit plugin (it's what adds 'browser_profile' to the path and names the cookie file)
+
+ // Places that cookie files can be:
+ // <getOSUserAppDir>/browser_profile/cookies
+ // <getOSUserAppDir>/first_last/browser_profile/cookies (note that there may be any number of these!)
+ // <getOSUserAppDir>/first_last/plugin_cookies.txt (note that there may be any number of these!)
+
+ std::string base_dir = gDirUtilp->getOSUserAppDir() + gDirUtilp->getDirDelimiter();
+ std::string target;
+ std::string filename;
+
+ lldebugs << "base dir = " << base_dir << llendl;
+
+ // The non-logged-in version is easy
+ target = base_dir;
+ target += "browser_profile";
+ target += gDirUtilp->getDirDelimiter();
+ target += "cookies";
+ lldebugs << "target = " << target << llendl;
+ if(LLFile::isfile(target))
+ {
+ LLFile::remove(target);
+ }
+
+ // the hard part: iterate over all user directories and delete the cookie file from each one
+ while(gDirUtilp->getNextFileInDir(base_dir, "*_*", filename, false))
+ {
+ target = base_dir;
+ target += filename;
+ target += gDirUtilp->getDirDelimiter();
+ target += "browser_profile";
+ target += gDirUtilp->getDirDelimiter();
+ target += "cookies";
+ lldebugs << "target = " << target << llendl;
+ if(LLFile::isfile(target))
+ {
+ LLFile::remove(target);
+ }
+
+ // Other accounts may have new-style cookie files too -- delete them as well
+ target = base_dir;
+ target += filename;
+ target += gDirUtilp->getDirDelimiter();
+ target += PLUGIN_COOKIE_FILE_NAME;
+ lldebugs << "target = " << target << llendl;
+ if(LLFile::isfile(target))
+ {
+ LLFile::remove(target);
+ }
+ }
+
+ // If we have an OpenID cookie, re-add it to the cookie store.
+ setOpenIDCookie();
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// static
+void LLViewerMedia::clearAllCaches()
+{
+ // Clear all plugins' caches
+ impl_list::iterator iter = sViewerMediaImplList.begin();
+ impl_list::iterator end = sViewerMediaImplList.end();
+ for (; iter != end; iter++)
+ {
+ LLViewerMediaImpl* pimpl = *iter;
+ pimpl->clearCache();
+ }
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// static
+void LLViewerMedia::setCookiesEnabled(bool enabled)
+{
+ // Set the "cookies enabled" flag for all loaded plugins
+ impl_list::iterator iter = sViewerMediaImplList.begin();
+ impl_list::iterator end = sViewerMediaImplList.end();
+ for (; iter != end; iter++)
+ {
+ LLViewerMediaImpl* pimpl = *iter;
+ if(pimpl->mMediaSource)
+ {
+ pimpl->mMediaSource->enable_cookies(enabled);
+ }
+ }
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// static
+void LLViewerMedia::setProxyConfig(bool enable, const std::string &host, int port)
+{
+ // Set the proxy config for all loaded plugins
+ impl_list::iterator iter = sViewerMediaImplList.begin();
+ impl_list::iterator end = sViewerMediaImplList.end();
+ for (; iter != end; iter++)
+ {
+ LLViewerMediaImpl* pimpl = *iter;
+ if(pimpl->mMediaSource)
+ {
+ pimpl->mMediaSource->proxy_setup(enable, host, port);
+ }
+ }
}
-//////////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////////
+// static
+/////////////////////////////////////////////////////////////////////////////////////////
// static
-bool LLViewerMedia::firstRunCallback(const LLSD& notification, const LLSD& response)
+LLPluginCookieStore *LLViewerMedia::getCookieStore()
{
- S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
- if (option == 0)
+ if(sCookieStore == NULL)
{
- // user has elected to automatically play media.
- gSavedSettings.setBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING, TRUE);
- gSavedSettings.setBOOL("AudioStreamingMusic", TRUE);
- gSavedSettings.setBOOL("AudioStreamingMedia", TRUE);
+ sCookieStore = new LLPluginCookieStore;
+ }
+
+ return sCookieStore;
+}
- LLParcel *parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
-
- if (parcel)
+/////////////////////////////////////////////////////////////////////////////////////////
+// static
+void LLViewerMedia::loadCookieFile()
+{
+ // build filename for each user
+ std::string resolved_filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, PLUGIN_COOKIE_FILE_NAME);
+
+ if (resolved_filename.empty())
+ {
+ llinfos << "can't get path to plugin cookie file - probably not logged in yet." << llendl;
+ return;
+ }
+
+ // open the file for reading
+ llifstream file(resolved_filename);
+ if (!file.is_open())
+ {
+ llwarns << "can't load plugin cookies from file \"" << PLUGIN_COOKIE_FILE_NAME << "\"" << llendl;
+ return;
+ }
+
+ getCookieStore()->readAllCookies(file, true);
+
+ file.close();
+
+ // send the clear_cookies message to all loaded plugins
+ impl_list::iterator iter = sViewerMediaImplList.begin();
+ impl_list::iterator end = sViewerMediaImplList.end();
+ for (; iter != end; iter++)
+ {
+ LLViewerMediaImpl* pimpl = *iter;
+ if(pimpl->mMediaSource)
{
- // play media right now, if available
- LLViewerParcelMedia::play(parcel);
-
- // play music right now, if available
- std::string music_url = parcel->getMusicURL();
- if (gAudiop && !music_url.empty())
- gAudiop->startInternetStream(music_url);
+ pimpl->mMediaSource->clear_cookies();
}
}
- else
+
+ // If we have an OpenID cookie, re-add it to the cookie store.
+ setOpenIDCookie();
+}
+
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// static
+void LLViewerMedia::saveCookieFile()
+{
+ // build filename for each user
+ std::string resolved_filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, PLUGIN_COOKIE_FILE_NAME);
+
+ if (resolved_filename.empty())
+ {
+ llinfos << "can't get path to plugin cookie file - probably not logged in yet." << llendl;
+ return;
+ }
+
+ // open a file for writing
+ llofstream file (resolved_filename);
+ if (!file.is_open())
+ {
+ llwarns << "can't open plugin cookie file \"" << PLUGIN_COOKIE_FILE_NAME << "\" for writing" << llendl;
+ return;
+ }
+
+ getCookieStore()->writePersistentCookies(file);
+
+ file.close();
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// static
+void LLViewerMedia::addCookie(const std::string &name, const std::string &value, const std::string &domain, const LLDate &expires, const std::string &path, bool secure)
+{
+ std::stringstream cookie;
+
+ cookie << name << "=" << LLPluginCookieStore::quoteString(value);
+
+ if(expires.notNull())
+ {
+ cookie << "; expires=" << expires.asRFC1123();
+ }
+
+ cookie << "; domain=" << domain;
+
+ cookie << "; path=" << path;
+
+ if(secure)
+ {
+ cookie << "; secure";
+ }
+
+ getCookieStore()->setCookies(cookie.str());
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// static
+void LLViewerMedia::addSessionCookie(const std::string &name, const std::string &value, const std::string &domain, const std::string &path, bool secure)
+{
+ // A session cookie just has a NULL date.
+ addCookie(name, value, domain, LLDate(), path, secure);
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// static
+void LLViewerMedia::removeCookie(const std::string &name, const std::string &domain, const std::string &path )
+{
+ // To remove a cookie, add one with the same name, domain, and path that expires in the past.
+
+ addCookie(name, "", domain, LLDate(LLDate::now().secondsSinceEpoch() - 1.0), path);
+}
+
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// static
+void LLViewerMedia::setOpenIDCookie()
+{
+ if(!sOpenIDCookie.empty())
+ {
+ // The LLURL can give me the 'authority', which is of the form: [username[:password]@]hostname[:port]
+ // We want just the hostname for the cookie code, but LLURL doesn't seem to have a way to extract that.
+ // We therefore do it here.
+ std::string authority = sOpenIDURL.mAuthority;
+ std::string::size_type host_start = authority.find('@');
+ if(host_start == std::string::npos)
+ {
+ // no username/password
+ host_start = 0;
+ }
+ else
+ {
+ // Hostname starts after the @.
+ // (If the hostname part is empty, this may put host_start at the end of the string. In that case, it will end up passing through an empty hostname, which is correct.)
+ ++host_start;
+ }
+ std::string::size_type host_end = authority.rfind(':');
+ if((host_end == std::string::npos) || (host_end < host_start))
+ {
+ // no port
+ host_end = authority.size();
+ }
+
+ getCookieStore()->setCookiesFromHost(sOpenIDCookie, authority.substr(host_start, host_end - host_start));
+ }
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// static
+void LLViewerMedia::openIDSetup(const std::string &openid_url, const std::string &openid_token)
+{
+ LL_DEBUGS("MediaAuth") << "url = \"" << openid_url << "\", token = \"" << openid_token << "\"" << LL_ENDL;
+
+ // post the token to the url
+ // the responder will need to extract the cookie(s).
+
+ // Save the OpenID URL for later -- we may need the host when adding the cookie.
+ sOpenIDURL.init(openid_url.c_str());
+
+ // We shouldn't ever do this twice, but just in case this code gets repurposed later, clear existing cookies.
+ sOpenIDCookie.clear();
+
+ LLSD headers = LLSD::emptyMap();
+ // Keep LLHTTPClient from adding an "Accept: application/llsd+xml" header
+ headers["Accept"] = "*/*";
+ // and use the expected content-type for a post, instead of the LLHTTPClient::postRaw() default of "application/octet-stream"
+ headers["Content-Type"] = "application/x-www-form-urlencoded";
+
+ // postRaw() takes ownership of the buffer and releases it later, so we need to allocate a new buffer here.
+ size_t size = openid_token.size();
+ U8 *data = new U8[size];
+ memcpy(data, openid_token.data(), size);
+
+ LLHTTPClient::postRaw(
+ openid_url,
+ data,
+ size,
+ new LLViewerMediaOpenIDResponder(),
+ headers);
+
+}
+
+/////////////////////////////////////////////////////////////////////////////////////////
+// static
+void LLViewerMedia::openIDCookieResponse(const std::string &cookie)
+{
+ LL_DEBUGS("MediaAuth") << "Cookie received: \"" << cookie << "\"" << LL_ENDL;
+
+ sOpenIDCookie += cookie;
+
+ setOpenIDCookie();
+}
+
+bool LLViewerMedia::hasInWorldMedia()
+{
+ if (sInWorldMediaDisabled) return false;
+ impl_list::iterator iter = sViewerMediaImplList.begin();
+ impl_list::iterator end = sViewerMediaImplList.end();
+ // This should be quick, because there should be very few non-in-world-media impls
+ for (; iter != end; iter++)
{
- gSavedSettings.setBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING, FALSE);
- gSavedSettings.setBOOL("AudioStreamingMedia", FALSE);
- gSavedSettings.setBOOL("AudioStreamingMusic", FALSE);
+ LLViewerMediaImpl* pimpl = *iter;
+ if (!pimpl->getUsedInUI() && !pimpl->isParcelMedia())
+ {
+ // Found an in-world media impl
+ return true;
+ }
}
return false;
}
+//////////////////////////////////////////////////////////////////////////////////////////
+// static
+bool LLViewerMedia::hasParcelMedia()
+{
+ return !LLViewerParcelMedia::getURL().empty();
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// static
+bool LLViewerMedia::hasParcelAudio()
+{
+ return !LLViewerMedia::getParcelAudioURL().empty();
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// static
+std::string LLViewerMedia::getParcelAudioURL()
+{
+ return LLViewerParcelMgr::getInstance()->getAgentParcel()->getMusicURL();
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// static
+void LLViewerMedia::initClass()
+{
+ gIdleCallbacks.addFunction(LLViewerMedia::updateMedia, NULL);
+ sTeleportFinishConnection = LLViewerParcelMgr::getInstance()->
+ setTeleportFinishedCallback(boost::bind(&LLViewerMedia::onTeleportFinished));
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// static
+void LLViewerMedia::cleanupClass()
+{
+ gIdleCallbacks.deleteFunction(LLViewerMedia::updateMedia, NULL);
+ sTeleportFinishConnection.disconnect();
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+// static
+void LLViewerMedia::onTeleportFinished()
+{
+ // On teleport, clear this setting (i.e. set it to true)
+ gSavedSettings.setBOOL("MediaTentativeAutoPlay", true);
+}
//////////////////////////////////////////////////////////////////////////////////////////
// LLViewerMediaImpl
@@ -1011,7 +1476,8 @@ LLViewerMediaImpl::LLViewerMediaImpl( const LLUUID& texture_id,
mBackgroundColor(LLColor4::white),
mNavigateSuspended(false),
mNavigateSuspendedDeferred(false),
- mIsUpdated(false)
+ mIsUpdated(false),
+ mTrustedBrowser(false)
{
// Set up the mute list observer if it hasn't been set up already.
@@ -1038,11 +1504,6 @@ LLViewerMediaImpl::LLViewerMediaImpl( const LLUUID& texture_id,
//////////////////////////////////////////////////////////////////////////////////////////
LLViewerMediaImpl::~LLViewerMediaImpl()
{
- if( gEditMenuHandler == this )
- {
- gEditMenuHandler = NULL;
- }
-
destroyMediaSource();
LLViewerMediaTexture::removeMediaImplFromTexture(mTextureId) ;
@@ -1102,7 +1563,10 @@ void LLViewerMediaImpl::createMediaSource()
}
else if(! mMimeType.empty())
{
- initializeMedia(mMimeType);
+ if (!initializeMedia(mMimeType))
+ {
+ LL_WARNS("Media") << "Failed to initialize media for mime type " << mMimeType << LL_ENDL;
+ }
}
}
@@ -1122,6 +1586,7 @@ void LLViewerMediaImpl::destroyMediaSource()
if(mMediaSource)
{
+ mMediaSource->setDeleteOK(true) ;
delete mMediaSource;
mMediaSource = NULL;
}
@@ -1150,6 +1615,19 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_
std::string user_data_path = gDirUtilp->getOSUserAppDir();
user_data_path += gDirUtilp->getDirDelimiter();
+ // Fix for EXT-5960 - make browser profile specific to user (cache, cookies etc.)
+ // If the linden username returned is blank, that can only mean we are
+ // at the login page displaying login Web page or Web browser test via Develop menu.
+ // In this case we just use whatever gDirUtilp->getOSUserAppDir() gives us (this
+ // is what we always used before this change)
+ std::string linden_user_dir = gDirUtilp->getLindenUserDir();
+ if ( ! linden_user_dir.empty() )
+ {
+ // gDirUtilp->getLindenUserDir() is whole path, not just Linden name
+ user_data_path = linden_user_dir;
+ user_data_path += gDirUtilp->getDirDelimiter();
+ };
+
// See if the plugin executable exists
llstat s;
if(LLFile::stat(launcher_name, &s))
@@ -1164,7 +1642,22 @@ LLPluginClassMedia* LLViewerMediaImpl::newSourceFromMediaType(std::string media_
{
LLPluginClassMedia* media_source = new LLPluginClassMedia(owner);
media_source->setSize(default_width, default_height);
- if (media_source->init(launcher_name, plugin_name, gSavedSettings.getBOOL("PluginAttachDebuggerToPlugins"), user_data_path))
+ media_source->setUserDataPath(user_data_path);
+ media_source->setLanguageCode(LLUI::getLanguage());
+
+ // collect 'cookies enabled' setting from prefs and send to embedded browser
+ bool cookies_enabled = gSavedSettings.getBOOL( "CookiesEnabled" );
+ media_source->enable_cookies( cookies_enabled );
+
+ // collect 'plugins enabled' setting from prefs and send to embedded browser
+ bool plugins_enabled = gSavedSettings.getBOOL( "BrowserPluginsEnabled" );
+ media_source->setPluginsEnabled( plugins_enabled );
+
+ // collect 'javascript enabled' setting from prefs and send to embedded browser
+ bool javascript_enabled = gSavedSettings.getBOOL( "BrowserJavascriptEnabled" );
+ media_source->setJavascriptEnabled( javascript_enabled );
+
+ if (media_source->init(launcher_name, plugin_name, gSavedSettings.getBOOL("PluginAttachDebuggerToPlugins")))
{
return media_source;
}
@@ -1225,14 +1718,27 @@ bool LLViewerMediaImpl::initializePlugin(const std::string& media_type)
media_source->focus(mHasFocus);
media_source->setBackgroundColor(mBackgroundColor);
+ media_source->proxy_setup(gSavedSettings.getBOOL("BrowserProxyEnabled"), gSavedSettings.getString("BrowserProxyAddress"), gSavedSettings.getS32("BrowserProxyPort"));
+
if(mClearCache)
{
mClearCache = false;
media_source->clear_cache();
}
+ // TODO: Only send cookies to plugins that need them
+ // Ideally, the plugin should tell us whether it handles cookies or not -- either via the init response or through a separate message.
+ // Due to the ordering of messages, it's possible we wouldn't get that information back in time to send cookies before sending a navigate message,
+ // which could cause odd race conditions.
+ std::string all_cookies = LLViewerMedia::getCookieStore()->getAllCookies();
+ lldebugs << "setting cookies: " << all_cookies << llendl;
+ if(!all_cookies.empty())
+ {
+ media_source->set_cookies(all_cookies);
+ }
+
mMediaSource = media_source;
-
+ mMediaSource->setDeleteOK(false) ;
updateVolume();
return true;
@@ -1249,6 +1755,9 @@ void LLViewerMediaImpl::loadURI()
{
if(mMediaSource)
{
+ // trim whitespace from front and back of URL - fixes EXT-5363
+ LLStringUtil::trim( mMediaURL );
+
// *HACK: we don't know if the URI coming in is properly escaped
// (the contract doesn't specify whether it is escaped or not.
// but LLQtWebKit expects it to be, so we do our best to encode
@@ -1267,29 +1776,22 @@ void LLViewerMediaImpl::loadURI()
llinfos << "Asking media source to load URI: " << uri << llendl;
mMediaSource->loadURI( uri );
-
+
+ // A non-zero mPreviousMediaTime means that either this media was previously unloaded by the priority code while playing/paused,
+ // or a seek happened before the media loaded. In either case, seek to the saved time.
+ if(mPreviousMediaTime != 0.0f)
+ {
+ seek(mPreviousMediaTime);
+ }
+
if(mPreviousMediaState == MEDIA_PLAYING)
{
// This media was playing before this instance was unloaded.
-
- if(mPreviousMediaTime != 0.0f)
- {
- // Seek back to where we left off, if possible.
- seek(mPreviousMediaTime);
- }
-
start();
}
else if(mPreviousMediaState == MEDIA_PAUSED)
{
// This media was paused before this instance was unloaded.
-
- if(mPreviousMediaTime != 0.0f)
- {
- // Seek back to where we left off, if possible.
- seek(mPreviousMediaTime);
- }
-
pause();
}
else
@@ -1348,6 +1850,10 @@ void LLViewerMediaImpl::pause()
{
mMediaSource->pause();
}
+ else
+ {
+ mPreviousMediaState = MEDIA_PAUSED;
+ }
}
//////////////////////////////////////////////////////////////////////////////////////////
@@ -1357,6 +1863,10 @@ void LLViewerMediaImpl::start()
{
mMediaSource->start();
}
+ else
+ {
+ mPreviousMediaState = MEDIA_PLAYING;
+ }
}
//////////////////////////////////////////////////////////////////////////////////////////
@@ -1366,6 +1876,11 @@ void LLViewerMediaImpl::seek(F32 time)
{
mMediaSource->seek(time);
}
+ else
+ {
+ // Save the seek time to be set when the media is loaded.
+ mPreviousMediaTime = time;
+ }
}
//////////////////////////////////////////////////////////////////////////////////////////
@@ -1414,7 +1929,28 @@ void LLViewerMediaImpl::updateVolume()
{
if(mMediaSource)
{
- mMediaSource->setVolume(mRequestedVolume * LLViewerMedia::getVolume());
+ // always scale the volume by the global media volume
+ F32 volume = mRequestedVolume * LLViewerMedia::getVolume();
+
+ if (mProximityCamera > 0)
+ {
+ if (mProximityCamera > gSavedSettings.getF32("MediaRollOffMax"))
+ {
+ volume = 0;
+ }
+ else if (mProximityCamera > gSavedSettings.getF32("MediaRollOffMin"))
+ {
+ // attenuated_volume = 1 / (roll_off_rate * (d - min))^2
+ // the +1 is there so that for distance 0 the volume stays the same
+ F64 adjusted_distance = mProximityCamera - gSavedSettings.getF32("MediaRollOffMin");
+ F64 attenuation = 1.0 + (gSavedSettings.getF32("MediaRollOffRate") * adjusted_distance);
+ attenuation = 1.0 / (attenuation * attenuation);
+ // the attenuation multiplier should never be more than one since that would increase volume
+ volume = volume * llmin(1.0, attenuation);
+ }
+ }
+
+ mMediaSource->setVolume(volume);
}
}
@@ -1745,7 +2281,7 @@ void LLViewerMediaImpl::navigateInternal()
// This helps in supporting legacy media content where the server the media resides on returns a bogus MIME type
// but the parcel owner has correctly set the MIME type in the parcel media settings.
- if(!mMimeType.empty() && (mMimeType != "none/none"))
+ if(!mMimeType.empty() && (mMimeType != LLMIMETypes::getDefaultMimeType()))
{
std::string plugin_basename = LLMIMETypes::implType(mMimeType);
if(!plugin_basename.empty())
@@ -1839,9 +2375,12 @@ bool LLViewerMediaImpl::handleKeyHere(KEY key, MASK mask)
if(!result)
{
- result = mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_DOWN ,key, mask);
+
+ LLSD native_key_data = gViewerWindow->getWindow()->getNativeKeyData();
+
+ result = mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_DOWN ,key, mask, native_key_data);
// Since the viewer internal event dispatching doesn't give us key-up events, simulate one here.
- (void)mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_UP ,key, mask);
+ (void)mMediaSource->keyEvent(LLPluginClassMedia::KEY_EVENT_UP ,key, mask, native_key_data);
}
}
@@ -1859,7 +2398,9 @@ bool LLViewerMediaImpl::handleUnicodeCharHere(llwchar uni_char)
if (uni_char >= 32 // discard 'control' characters
&& uni_char != 127) // SDL thinks this is 'delete' - yuck.
{
- mMediaSource->textInput(wstring_to_utf8str(LLWString(1, uni_char)), gKeyboard->currentMask(FALSE));
+ LLSD native_key_data = gViewerWindow->getWindow()->getNativeKeyData();
+
+ mMediaSource->textInput(wstring_to_utf8str(LLWString(1, uni_char)), gKeyboard->currentMask(FALSE), native_key_data);
}
}
@@ -1920,6 +2461,18 @@ void LLViewerMediaImpl::update()
}
}
}
+ else
+ {
+ updateVolume();
+
+ // If we didn't just create the impl, it may need to get cookie updates.
+ if(!sUpdatedCookies.empty())
+ {
+ // TODO: Only send cookies to plugins that need them
+ mMediaSource->set_cookies(sUpdatedCookies);
+ }
+ }
+
if(mMediaSource == NULL)
{
@@ -2111,6 +2664,21 @@ void LLViewerMediaImpl::scaleMouse(S32 *mouse_x, S32 *mouse_y)
#endif
}
+
+
+//////////////////////////////////////////////////////////////////////////////////////////
+bool LLViewerMediaImpl::isMediaTimeBased()
+{
+ bool result = false;
+
+ if(mMediaSource)
+ {
+ result = mMediaSource->pluginSupportsMediaTime();
+ }
+
+ return result;
+}
+
//////////////////////////////////////////////////////////////////////////////////////////
bool LLViewerMediaImpl::isMediaPlaying()
{
@@ -2157,7 +2725,7 @@ void LLViewerMediaImpl::resetPreviousMediaState()
//////////////////////////////////////////////////////////////////////////////////////////
//
-void LLViewerMediaImpl::setDisabled(bool disabled)
+void LLViewerMediaImpl::setDisabled(bool disabled, bool forcePlayOnEnable)
{
if(mIsDisabled != disabled)
{
@@ -2172,7 +2740,7 @@ void LLViewerMediaImpl::setDisabled(bool disabled)
else
{
// We just (re)enabled this media. Do a navigate if auto-play is in order.
- if(mMediaAutoPlay && gSavedSettings.getBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING))
+ if(isAutoPlayable() || forcePlayOnEnable)
{
navigateTo(mMediaEntryURL, "", true, true);
}
@@ -2199,6 +2767,12 @@ bool LLViewerMediaImpl::isForcedUnloaded() const
}
}
+ // If this media's class is not supposed to be shown, unload
+ if (!shouldShowBasedOnClass())
+ {
+ return true;
+ }
+
return false;
}
@@ -2232,6 +2806,41 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla
{
switch(event)
{
+ case MEDIA_EVENT_CLICK_LINK_NOFOLLOW:
+ {
+ LL_DEBUGS("Media") << "MEDIA_EVENT_CLICK_LINK_NOFOLLOW, uri is: " << plugin->getClickURL() << LL_ENDL;
+ std::string url = plugin->getClickURL();
+ LLURLDispatcher::dispatch(url, NULL, mTrustedBrowser);
+
+ }
+ break;
+ case MEDIA_EVENT_CLICK_LINK_HREF:
+ {
+ LL_DEBUGS("Media") << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, target is \"" << plugin->getClickTarget() << "\", uri is " << plugin->getClickURL() << LL_ENDL;
+ // retrieve the event parameters
+ std::string url = plugin->getClickURL();
+ U32 target_type = plugin->getClickTargetType();
+
+ switch (target_type)
+ {
+ case LLPluginClassMedia::TARGET_EXTERNAL:
+ // force url to external browser
+ LLWeb::loadURLExternal(url);
+ break;
+ case LLPluginClassMedia::TARGET_BLANK:
+ // open in SL media browser or external browser based on user pref
+ LLWeb::loadURL(url);
+ break;
+ case LLPluginClassMedia::TARGET_NONE:
+ // ignore this click and let media plugin handle it
+ break;
+ case LLPluginClassMedia::TARGET_OTHER:
+ LL_WARNS("LinkTarget") << "Unsupported link target type" << LL_ENDL;
+ break;
+ default: break;
+ }
+ };
+ break;
case MEDIA_EVENT_PLUGIN_FAILED_LAUNCH:
{
// The plugin failed to load properly. Make sure the timer doesn't retry.
@@ -2353,6 +2962,13 @@ void LLViewerMediaImpl::handleMediaEvent(LLPluginClassMedia* plugin, LLPluginCla
////////////////////////////////////////////////////////////////////////////////
// virtual
+void LLViewerMediaImpl::handleCookieSet(LLPluginClassMedia* self, const std::string &cookie)
+{
+ LLViewerMedia::getCookieStore()->setCookies(cookie);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// virtual
void
LLViewerMediaImpl::cut()
{
@@ -2440,8 +3056,17 @@ void LLViewerMediaImpl::calculateInterest()
if(!mObjectList.empty())
{
// Just use the first object in the list. We could go through the list and find the closest object, but this should work well enough.
- LLVector3d global_delta = gAgent.getPositionGlobal() - (*mObjectList.begin())->getPositionGlobal();
+ std::list< LLVOVolume* >::iterator iter = mObjectList.begin() ;
+ LLVOVolume* objp = *iter ;
+ llassert_always(objp != NULL) ;
+
+ LLVector3d obj_global = objp->getPositionGlobal() ;
+ LLVector3d agent_global = gAgent.getPositionGlobal() ;
+ LLVector3d global_delta = agent_global - obj_global ;
mProximityDistance = global_delta.magVecSquared(); // use distance-squared because it's cheaper and sorts the same.
+
+ LLVector3d camera_delta = gAgentCamera.getCameraPositionGlobal() - obj_global;
+ mProximityCamera = camera_delta.magVec();
}
if(mNeedsMuteCheck)
@@ -2453,16 +3078,25 @@ void LLViewerMediaImpl::calculateInterest()
for(; iter != mObjectList.end() ; ++iter)
{
LLVOVolume *obj = *iter;
- if(LLMuteList::getInstance()->isMuted(obj->getID()))
+ llassert(obj);
+ if (!obj) continue;
+ if(LLMuteList::getInstance() &&
+ LLMuteList::getInstance()->isMuted(obj->getID()))
+ {
mIsMuted = true;
+ }
else
{
// We won't have full permissions data for all objects. Attempt to mute objects when we can tell their owners are muted.
- LLPermissions* obj_perm = LLSelectMgr::getInstance()->findObjectPermissions(obj);
- if(obj_perm)
+ if (LLSelectMgr::getInstance())
{
- if(LLMuteList::getInstance()->isMuted(obj_perm->getOwner()))
- mIsMuted = true;
+ LLPermissions* obj_perm = LLSelectMgr::getInstance()->findObjectPermissions(obj);
+ if(obj_perm)
+ {
+ if(LLMuteList::getInstance() &&
+ LLMuteList::getInstance()->isMuted(obj_perm->getOwner()))
+ mIsMuted = true;
+ }
}
}
}
@@ -2684,3 +3318,113 @@ void LLViewerMediaImpl::setTextureID(LLUUID id)
}
}
+//////////////////////////////////////////////////////////////////////////////////////////
+//
+bool LLViewerMediaImpl::isAutoPlayable() const
+{
+ return (mMediaAutoPlay &&
+ gSavedSettings.getBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING) &&
+ gSavedSettings.getBOOL("MediaTentativeAutoPlay"));
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+//
+bool LLViewerMediaImpl::shouldShowBasedOnClass() const
+{
+ // If this is parcel media or in the UI, return true always
+ if (getUsedInUI() || isParcelMedia()) return true;
+
+ bool attached_to_another_avatar = isAttachedToAnotherAvatar();
+ bool inside_parcel = isInAgentParcel();
+
+ // llinfos << " hasFocus = " << hasFocus() <<
+ // " others = " << (attached_to_another_avatar && gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_ON_OTHERS_SETTING)) <<
+ // " within = " << (inside_parcel && gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_WITHIN_PARCEL_SETTING)) <<
+ // " outside = " << (!inside_parcel && gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_OUTSIDE_PARCEL_SETTING)) << llendl;
+
+ // If it has focus, we should show it
+ // This is incorrect, and causes EXT-6750 (disabled attachment media still plays)
+// if (hasFocus())
+// return true;
+
+ // If it is attached to an avatar and the pref is off, we shouldn't show it
+ if (attached_to_another_avatar)
+ return gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_ON_OTHERS_SETTING);
+
+ if (inside_parcel)
+ return gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_WITHIN_PARCEL_SETTING);
+ else
+ return gSavedSettings.getBOOL(LLViewerMedia::SHOW_MEDIA_OUTSIDE_PARCEL_SETTING);
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+//
+bool LLViewerMediaImpl::isAttachedToAnotherAvatar() const
+{
+ bool result = false;
+
+ std::list< LLVOVolume* >::const_iterator iter = mObjectList.begin();
+ std::list< LLVOVolume* >::const_iterator end = mObjectList.end();
+ for ( ; iter != end; iter++)
+ {
+ if (isObjectAttachedToAnotherAvatar(*iter))
+ {
+ result = true;
+ break;
+ }
+ }
+ return result;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+//
+//static
+bool LLViewerMediaImpl::isObjectAttachedToAnotherAvatar(LLVOVolume *obj)
+{
+ bool result = false;
+ LLXform *xform = obj;
+ // Walk up parent chain
+ while (NULL != xform)
+ {
+ LLViewerObject *object = dynamic_cast<LLViewerObject*> (xform);
+ if (NULL != object)
+ {
+ LLVOAvatar *avatar = object->asAvatar();
+ if ((NULL != avatar) && (avatar != gAgentAvatarp))
+ {
+ result = true;
+ break;
+ }
+ }
+ xform = xform->getParent();
+ }
+ return result;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+//
+bool LLViewerMediaImpl::isInAgentParcel() const
+{
+ bool result = false;
+
+ std::list< LLVOVolume* >::const_iterator iter = mObjectList.begin();
+ std::list< LLVOVolume* >::const_iterator end = mObjectList.end();
+ for ( ; iter != end; iter++)
+ {
+ LLVOVolume *object = *iter;
+ if (LLViewerMediaImpl::isObjectInAgentParcel(object))
+ {
+ result = true;
+ break;
+ }
+ }
+ return result;
+}
+
+//////////////////////////////////////////////////////////////////////////////////////////
+//
+// static
+bool LLViewerMediaImpl::isObjectInAgentParcel(LLVOVolume *obj)
+{
+ return (LLViewerParcelMgr::getInstance()->inAgentParcel(obj->getPositionGlobal()));
+}
diff --git a/indra/newview/llviewermedia.h b/indra/newview/llviewermedia.h
index ff18ed605a..8626f4469e 100644
--- a/indra/newview/llviewermedia.h
+++ b/indra/newview/llviewermedia.h
@@ -44,12 +44,15 @@
#include "llpluginclassmedia.h"
#include "v4color.h"
+#include "llurl.h"
+
class LLViewerMediaImpl;
class LLUUID;
class LLViewerMediaTexture;
class LLMediaEntry;
-class LLVOVolume ;
+class LLVOVolume;
class LLMimeDiscoveryResponder;
+class LLPluginCookieStore;
typedef LLPointer<LLViewerMediaImpl> viewer_media_t;
///////////////////////////////////////////////////////////////////////////////
@@ -73,55 +76,95 @@ class LLViewerMediaImpl;
class LLViewerMedia
{
LOG_CLASS(LLViewerMedia);
- public:
-
- // String to get/set media autoplay in gSavedSettings
- static const char *AUTO_PLAY_MEDIA_SETTING;
+public:
- typedef std::vector<LLViewerMediaImpl*> impl_list;
-
- typedef std::map<LLUUID, LLViewerMediaImpl*> impl_id_map;
-
- // Special case early init for just web browser component
- // so we can show login screen. See .cpp file for details. JC
-
- static viewer_media_t newMediaImpl(const LLUUID& texture_id,
- S32 media_width = 0,
- S32 media_height = 0,
- U8 media_auto_scale = false,
- U8 media_loop = false);
-
- static viewer_media_t updateMediaImpl(LLMediaEntry* media_entry, const std::string& previous_url, bool update_from_self);
- static LLViewerMediaImpl* getMediaImplFromTextureID(const LLUUID& texture_id);
- static std::string getCurrentUserAgent();
- static void updateBrowserUserAgent();
- static bool handleSkinCurrentChanged(const LLSD& /*newvalue*/);
- static bool textureHasMedia(const LLUUID& texture_id);
- static void setVolume(F32 volume);
-
- static void updateMedia(void* dummy_arg = NULL);
-
- static void initClass();
- static void cleanupClass();
-
- static F32 getVolume();
- static void muteListChanged();
- static void setInWorldMediaDisabled(bool disabled);
- static bool getInWorldMediaDisabled();
-
- static bool isInterestingEnough(const LLVOVolume* object, const F64 &object_interest);
+ // String to get/set media autoplay in gSavedSettings
+ static const char* AUTO_PLAY_MEDIA_SETTING;
+ static const char* SHOW_MEDIA_ON_OTHERS_SETTING;
+ static const char* SHOW_MEDIA_WITHIN_PARCEL_SETTING;
+ static const char* SHOW_MEDIA_OUTSIDE_PARCEL_SETTING;
- // Returns the priority-sorted list of all media impls.
- static impl_list &getPriorityList();
-
- // This is the comparitor used to sort the list.
- static bool priorityComparitor(const LLViewerMediaImpl* i1, const LLViewerMediaImpl* i2);
-
- // For displaying the media first-run dialog.
- static bool needsMediaFirstRun();
- static void displayMediaFirstRun();
- static bool firstRunCallback(const LLSD& notification, const LLSD& response);
-
+ typedef std::vector<LLViewerMediaImpl*> impl_list;
+
+ typedef std::map<LLUUID, LLViewerMediaImpl*> impl_id_map;
+
+ // Special case early init for just web browser component
+ // so we can show login screen. See .cpp file for details. JC
+
+ static viewer_media_t newMediaImpl(const LLUUID& texture_id,
+ S32 media_width = 0,
+ S32 media_height = 0,
+ U8 media_auto_scale = false,
+ U8 media_loop = false);
+
+ static viewer_media_t updateMediaImpl(LLMediaEntry* media_entry, const std::string& previous_url, bool update_from_self);
+ static LLViewerMediaImpl* getMediaImplFromTextureID(const LLUUID& texture_id);
+ static std::string getCurrentUserAgent();
+ static void updateBrowserUserAgent();
+ static bool handleSkinCurrentChanged(const LLSD& /*newvalue*/);
+ static bool textureHasMedia(const LLUUID& texture_id);
+ static void setVolume(F32 volume);
+
+ // Is any media currently "showing"? Includes Parcel Media. Does not include media in the UI.
+ static bool isAnyMediaShowing();
+ // Set all media enabled or disabled, depending on val. Does not include media in the UI.
+ static void setAllMediaEnabled(bool val);
+
+ static void updateMedia(void* dummy_arg = NULL);
+
+ static void initClass();
+ static void cleanupClass();
+
+ static F32 getVolume();
+ static void muteListChanged();
+ static void setInWorldMediaDisabled(bool disabled);
+ static bool getInWorldMediaDisabled();
+
+ static bool isInterestingEnough(const LLVOVolume* object, const F64 &object_interest);
+
+ // Returns the priority-sorted list of all media impls.
+ static impl_list &getPriorityList();
+
+ // This is the comparitor used to sort the list.
+ static bool priorityComparitor(const LLViewerMediaImpl* i1, const LLViewerMediaImpl* i2);
+
+ // These are just helper functions for the convenience of others working with media
+ static bool hasInWorldMedia();
+ static std::string getParcelAudioURL();
+ static bool hasParcelMedia();
+ static bool hasParcelAudio();
+ static bool isParcelMediaPlaying();
+ static bool isParcelAudioPlaying();
+
+ // Clear all cookies for all plugins
+ static void clearAllCookies();
+
+ // Clear all plugins' caches
+ static void clearAllCaches();
+
+ // Set the "cookies enabled" flag for all loaded plugins
+ static void setCookiesEnabled(bool enabled);
+
+ // Set the proxy config for all loaded plugins
+ static void setProxyConfig(bool enable, const std::string &host, int port);
+
+ static LLPluginCookieStore *getCookieStore();
+ static void loadCookieFile();
+ static void saveCookieFile();
+ static void addCookie(const std::string &name, const std::string &value, const std::string &domain, const LLDate &expires, const std::string &path = std::string("/"), bool secure = false );
+ static void addSessionCookie(const std::string &name, const std::string &value, const std::string &domain, const std::string &path = std::string("/"), bool secure = false );
+ static void removeCookie(const std::string &name, const std::string &domain, const std::string &path = std::string("/") );
+
+ static void openIDSetup(const std::string &openid_url, const std::string &openid_token);
+ static void openIDCookieResponse(const std::string &cookie);
+
+private:
+ static void setOpenIDCookie();
+ static void onTeleportFinished();
+
+ static LLPluginCookieStore *sCookieStore;
+ static LLURL sOpenIDURL;
+ static std::string sOpenIDCookie;
};
// Implementation functions not exported into header file
@@ -204,18 +247,20 @@ public:
void updateImagesMediaStreams();
LLUUID getMediaTextureID() const;
- void suspendUpdates(bool suspend) { mSuspendUpdates = suspend; };
+ void suspendUpdates(bool suspend) { mSuspendUpdates = suspend; }
void setVisible(bool visible);
- bool getVisible() const { return mVisible; };
+ bool getVisible() const { return mVisible; }
+ bool isVisible() const { return mVisible; }
+ bool isMediaTimeBased();
bool isMediaPlaying();
bool isMediaPaused();
bool hasMedia() const;
- bool isMediaFailed() const { return mMediaSourceFailed; };
+ bool isMediaFailed() const { return mMediaSourceFailed; }
void setMediaFailed(bool val) { mMediaSourceFailed = val; }
void resetPreviousMediaState();
- void setDisabled(bool disabled);
+ void setDisabled(bool disabled, bool forcePlayOnEnable = false);
bool isMediaDisabled() const { return mIsDisabled; };
void setInNearbyMediaList(bool in_list) { mInNearbyMediaList = in_list; }
@@ -227,10 +272,10 @@ public:
// returns true if this instance could be playable based on autoplay setting, current load state, etc.
bool isPlayable() const;
- void setIsParcelMedia(bool is_parcel_media) { mIsParcelMedia = is_parcel_media; };
- bool isParcelMedia() const { return mIsParcelMedia; };
+ void setIsParcelMedia(bool is_parcel_media) { mIsParcelMedia = is_parcel_media; }
+ bool isParcelMedia() const { return mIsParcelMedia; }
- ECursorType getLastSetCursor() { return mLastSetCursor; };
+ ECursorType getLastSetCursor() { return mLastSetCursor; }
// utility function to create a ready-to-use media instance from a desired media type.
static LLPluginClassMedia* newSourceFromMediaType(std::string media_type, LLPluginClassMediaOwner *owner /* may be NULL */, S32 default_width, S32 default_height);
@@ -267,6 +312,7 @@ public:
// Inherited from LLPluginClassMediaOwner
/*virtual*/ void handleMediaEvent(LLPluginClassMedia* plugin, LLPluginClassMediaOwner::EMediaEvent);
+ /*virtual*/ void handleCookieSet(LLPluginClassMedia* self, const std::string &cookie);
// LLEditMenuHandler overrides
/*virtual*/ void cut();
@@ -307,6 +353,9 @@ public:
void setLowPrioritySizeLimit(int size);
void setTextureID(LLUUID id = LLUUID::null);
+
+ bool isTrustedBrowser() { return mTrustedBrowser; }
+ void setTrustedBrowser(bool trusted) { mTrustedBrowser = trusted; }
typedef enum
{
@@ -331,6 +380,18 @@ public:
void cancelMimeTypeProbe();
+ // Is this media attached to an avatar *not* self
+ bool isAttachedToAnotherAvatar() const;
+
+ // Is this media in the agent's parcel?
+ bool isInAgentParcel() const;
+
+private:
+ bool isAutoPlayable() const;
+ bool shouldShowBasedOnClass() const;
+ static bool isObjectAttachedToAnotherAvatar(LLVOVolume *obj);
+ static bool isObjectInAgentParcel(LLVOVolume *obj);
+
private:
// a single media url with some data and an impl.
LLPluginClassMedia* mMediaSource;
@@ -370,14 +431,16 @@ private:
bool mIsParcelMedia;
S32 mProximity;
F64 mProximityDistance;
+ F64 mProximityCamera;
LLMimeDiscoveryResponder *mMimeTypeProbe;
bool mMediaAutoPlay;
std::string mMediaEntryURL;
- bool mInNearbyMediaList; // used by LLFloaterNearbyMedia::refreshList() for performance reasons
+ bool mInNearbyMediaList; // used by LLPanelNearbyMedia::refreshList() for performance reasons
bool mClearCache;
LLColor4 mBackgroundColor;
bool mNavigateSuspended;
bool mNavigateSuspendedDeferred;
+ bool mTrustedBrowser;
private:
BOOL mIsUpdated ;
diff --git a/indra/newview/llviewermediafocus.cpp b/indra/newview/llviewermediafocus.cpp
index a0ac9c2091..02e450b223 100644
--- a/indra/newview/llviewermediafocus.cpp
+++ b/indra/newview/llviewermediafocus.cpp
@@ -38,6 +38,7 @@
#include "llpanelprimmediacontrols.h"
#include "llpluginclassmedia.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "lltoolpie.h"
#include "llviewercamera.h"
#include "llviewermedia.h"
@@ -126,7 +127,7 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac
if(face_auto_zoom && ! parcel->getMediaPreventCameraZoom())
{
// Zoom in on this face
- mMediaControls.get()->resetZoomLevel();
+ mMediaControls.get()->resetZoomLevel(false);
mMediaControls.get()->nextZoomLevel();
}
else
@@ -157,7 +158,6 @@ void LLViewerMediaFocus::setFocusFace(LLPointer<LLViewerObject> objectp, S32 fac
mFocusedObjectFace = 0;
}
}
-
}
void LLViewerMediaFocus::clearFocus()
@@ -198,11 +198,11 @@ bool LLViewerMediaFocus::getFocus()
}
// This function selects an ideal viewing distance based on the focused object, pick normal, and padding value
-void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor)
+void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor, bool zoom_in_only)
{
if (object)
{
- gAgent.setFocusOnAvatar(FALSE, ANIMATE);
+ gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE);
LLBBox bbox = object->getBoundingBoxAgent();
LLVector3d center = gAgent.getPosGlobalFromAgent(bbox.getCenterAgent());
@@ -215,6 +215,8 @@ void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal,
// We need the aspect ratio, and the 3 components of the bbox as height, width, and depth.
F32 aspect_ratio = getBBoxAspectRatio(bbox, normal, &height, &width, &depth);
F32 camera_aspect = LLViewerCamera::getInstance()->getAspect();
+
+ lldebugs << "normal = " << normal << ", aspect_ratio = " << aspect_ratio << ", camera_aspect = " << camera_aspect << llendl;
// We will normally use the side of the volume aligned with the short side of the screen (i.e. the height for
// a screen in a landscape aspect ratio), however there is an edge case where the aspect ratio of the object is
@@ -231,11 +233,15 @@ void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal,
{
angle_of_view = llmax(0.1f, LLViewerCamera::getInstance()->getView() * LLViewerCamera::getInstance()->getAspect());
distance = width * 0.5 * padding_factor / tan(angle_of_view * 0.5f );
+
+ lldebugs << "using width (" << width << "), angle_of_view = " << angle_of_view << ", distance = " << distance << llendl;
}
else
{
angle_of_view = llmax(0.1f, LLViewerCamera::getInstance()->getView());
distance = height * 0.5 * padding_factor / tan(angle_of_view * 0.5f );
+
+ lldebugs << "using height (" << height << "), angle_of_view = " << angle_of_view << ", distance = " << distance << llendl;
}
distance += depth * 0.5;
@@ -261,7 +267,7 @@ void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal,
// orientation with respect to the face. In other words, if before zoom
// the media appears "upside down" from the camera, after zooming it will
// still be upside down, but at least it will not flip.
- LLVector3d cur_camera_pos = LLVector3d(gAgent.getCameraPositionGlobal());
+ LLVector3d cur_camera_pos = LLVector3d(gAgentCamera.getCameraPositionGlobal());
LLVector3d delta = (cur_camera_pos - camera_pos);
F64 len = delta.length();
delta.normalize();
@@ -269,12 +275,21 @@ void LLViewerMediaFocus::setCameraZoom(LLViewerObject* object, LLVector3 normal,
camera_pos += 0.01 * len * delta;
}
- gAgent.setCameraPosAndFocusGlobal(camera_pos, target_pos, object->getID() );
+ // If we are not allowing zooming out and the old camera position is closer to
+ // the center then the new intended camera position, don't move camera and return
+ if (zoom_in_only &&
+ (dist_vec_squared(gAgentCamera.getCameraPositionGlobal(), target_pos) < dist_vec_squared(camera_pos, target_pos)))
+ {
+ return;
+ }
+
+ gAgentCamera.setCameraPosAndFocusGlobal(camera_pos, target_pos, object->getID() );
+
}
else
{
// If we have no object, focus back on the avatar.
- gAgent.setFocusOnAvatar(TRUE, ANIMATE);
+ gAgentCamera.setFocusOnAvatar(TRUE, ANIMATE);
}
}
void LLViewerMediaFocus::onFocusReceived()
@@ -431,40 +446,38 @@ F32 LLViewerMediaFocus::getBBoxAspectRatio(const LLBBox& bbox, const LLVector3&
LLVector3 bbox_max = bbox.getExtentLocal();
F32 dot1 = 0.f;
F32 dot2 = 0.f;
+
+ lldebugs << "bounding box local size = " << bbox_max << ", local_normal = " << local_normal << llendl;
// The largest component of the localized normal vector is the depth component
// meaning that the other two are the legs of the rectangle.
local_normal.abs();
- if(local_normal.mV[VX] > local_normal.mV[VY])
+
+ // Using temporary variables for these makes the logic a bit more readable.
+ bool XgtY = (local_normal.mV[VX] > local_normal.mV[VY]);
+ bool XgtZ = (local_normal.mV[VX] > local_normal.mV[VZ]);
+ bool YgtZ = (local_normal.mV[VY] > local_normal.mV[VZ]);
+
+ if(XgtY && XgtZ)
{
- if(local_normal.mV[VX] > local_normal.mV[VZ])
- {
- // Use the y and z comps
- comp1.mV[VY] = bbox_max.mV[VY];
- comp2.mV[VZ] = bbox_max.mV[VZ];
- *depth = bbox_max.mV[VX];
- }
- else
- {
- // Use the x and y comps
- comp1.mV[VY] = bbox_max.mV[VY];
- comp2.mV[VZ] = bbox_max.mV[VZ];
- *depth = bbox_max.mV[VZ];
- }
+ lldebugs << "x component of normal is longest, using y and z" << llendl;
+ comp1.mV[VY] = bbox_max.mV[VY];
+ comp2.mV[VZ] = bbox_max.mV[VZ];
+ *depth = bbox_max.mV[VX];
}
- else if(local_normal.mV[VY] > local_normal.mV[VZ])
+ else if(!XgtY && YgtZ)
{
- // Use the x and z comps
+ lldebugs << "y component of normal is longest, using x and z" << llendl;
comp1.mV[VX] = bbox_max.mV[VX];
comp2.mV[VZ] = bbox_max.mV[VZ];
*depth = bbox_max.mV[VY];
}
else
{
- // Use the x and y comps
- comp1.mV[VY] = bbox_max.mV[VY];
- comp2.mV[VZ] = bbox_max.mV[VZ];
- *depth = bbox_max.mV[VX];
+ lldebugs << "z component of normal is longest, using x and y" << llendl;
+ comp1.mV[VX] = bbox_max.mV[VX];
+ comp2.mV[VY] = bbox_max.mV[VY];
+ *depth = bbox_max.mV[VZ];
}
// The height is the vector closest to vertical in the bbox coordinate space (highest dot product value)
@@ -474,12 +487,20 @@ F32 LLViewerMediaFocus::getBBoxAspectRatio(const LLBBox& bbox, const LLVector3&
{
*height = comp1.length();
*width = comp2.length();
+
+ lldebugs << "comp1 = " << comp1 << ", height = " << *height << llendl;
+ lldebugs << "comp2 = " << comp2 << ", width = " << *width << llendl;
}
else
{
*height = comp2.length();
*width = comp1.length();
+
+ lldebugs << "comp2 = " << comp2 << ", height = " << *height << llendl;
+ lldebugs << "comp1 = " << comp1 << ", width = " << *width << llendl;
}
+
+ lldebugs << "returning " << (*width / *height) << llendl;
// Return the aspect ratio.
return *width / *height;
@@ -551,6 +572,19 @@ void LLViewerMediaFocus::focusZoomOnMedia(LLUUID media_id)
}
}
+void LLViewerMediaFocus::unZoom()
+{
+ if(mMediaControls.get())
+ {
+ mMediaControls.get()->resetZoomLevel();
+ }
+}
+
+bool LLViewerMediaFocus::isZoomed() const
+{
+ return (mMediaControls.get() && mMediaControls.get()->getZoomLevel() != LLPanelPrimMediaControls::ZOOM_NONE);
+}
+
LLUUID LLViewerMediaFocus::getControlsMediaID()
{
if(getFocusedMediaImpl())
diff --git a/indra/newview/llviewermediafocus.h b/indra/newview/llviewermediafocus.h
index 89ee0ae283..d9ddc7432b 100644
--- a/indra/newview/llviewermediafocus.h
+++ b/indra/newview/llviewermediafocus.h
@@ -66,7 +66,7 @@ public:
void update();
- static void setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor);
+ static void setCameraZoom(LLViewerObject* object, LLVector3 normal, F32 padding_factor, bool zoom_in_only = false);
static F32 getBBoxAspectRatio(const LLBBox& bbox, const LLVector3& normal, F32* height, F32* width, F32* depth);
bool isFocusedOnFace(LLPointer<LLViewerObject> objectp, S32 face);
@@ -85,6 +85,9 @@ public:
// Try to focus/zoom on the specified media (if it's on an object in world).
void focusZoomOnMedia(LLUUID media_id);
+ // Are we zoomed in?
+ bool isZoomed() const;
+ void unZoom();
// Return the ID of the media instance the controls are currently attached to (either focus or hover).
LLUUID getControlsMediaID();
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index a83baf7f9a..635cc361f3 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -42,8 +42,10 @@
// newview includes
#include "llagent.h"
+#include "llagentcamera.h"
#include "llagentwearables.h"
#include "llagentpilot.h"
+#include "llbottomtray.h"
#include "llcompilequeue.h"
#include "llconsole.h"
#include "lldebugview.h"
@@ -51,8 +53,7 @@
//#include "llfirstuse.h"
#include "llfloaterbuy.h"
#include "llfloaterbuycontents.h"
-#include "llfloaterbuycurrency.h"
-#include "llfloatercustomize.h"
+#include "llbuycurrencyhtml.h"
#include "llfloatergodtools.h"
#include "llfloaterinventory.h"
#include "llfloaterland.h"
@@ -71,6 +72,8 @@
#include "llhudmanager.h"
#include "llimview.h"
#include "llinventorybridge.h"
+#include "llinventorydefines.h"
+#include "llinventoryfunctions.h"
#include "llpanellogin.h"
#include "llpanelblockedlist.h"
#include "llmenucommands.h"
@@ -85,6 +88,7 @@
#include "lltoolmgr.h"
#include "lltoolpie.h"
#include "lltoolselectland.h"
+#include "lltrans.h"
#include "llviewergenericmessage.h"
#include "llviewerhelp.h"
#include "llviewermenufile.h" // init_menu_file()
@@ -102,6 +106,8 @@
#include "llfloatercamera.h"
#include "lluilistener.h"
#include "llappearancemgr.h"
+#include "lltrans.h"
+#include "lleconomy.h"
using namespace LLVOAvatarDefines;
@@ -131,6 +137,7 @@ extern BOOL gDebugWindowProc;
LLMenuBarGL *gMenuBarView = NULL;
LLViewerMenuHolderGL *gMenuHolder = NULL;
LLMenuGL *gPopupMenuView = NULL;
+LLMenuGL *gEditMenu = NULL;
LLMenuBarGL *gLoginMenuBarView = NULL;
// Pie menus
@@ -285,8 +292,8 @@ void handle_toggle_pg(void*);
void handle_dump_attachments(void *);
void handle_dump_avatar_local_textures(void*);
void handle_debug_avatar_textures(void*);
-void handle_grab_texture(void*);
-BOOL enable_grab_texture(void*);
+void handle_grab_baked_texture(void*);
+BOOL enable_grab_baked_texture(void*);
void handle_dump_region_object_cache(void*);
BOOL enable_save_into_inventory(void*);
@@ -378,8 +385,10 @@ void init_menus()
///
/// Context menus
///
+
const widget_registry_t& registry =
LLViewerMenuHolderGL::child_registry_t::instance();
+ gEditMenu = LLUICtrlFactory::createFromFile<LLMenuGL>("menu_edit.xml", gMenuHolder, registry);
gMenuAvatarSelf = LLUICtrlFactory::createFromFile<LLContextMenu>(
"menu_avatar_self.xml", gMenuHolder, registry);
gMenuAvatarOther = LLUICtrlFactory::createFromFile<LLContextMenu>(
@@ -421,7 +430,7 @@ void init_menus()
gPopupMenuView->setBackgroundColor( color );
// If we are not in production, use a different color to make it apparent.
- if (LLViewerLogin::getInstance()->isInProductionGrid())
+ if (LLGridManager::getInstance()->isInProductionGrid())
{
color = LLUIColorTable::instance().getColor( "MenuBarBgColor" );
}
@@ -433,10 +442,11 @@ void init_menus()
gMenuBarView->setRect(LLRect(0, top, 0, top - MENU_BAR_HEIGHT));
gMenuBarView->setBackgroundColor( color );
- gMenuHolder->addChild(gMenuBarView);
+ LLView* menu_bar_holder = gViewerWindow->getRootView()->getChildView("menu_bar_holder");
+ menu_bar_holder->addChild(gMenuBarView);
gViewerWindow->setMenuBackgroundColor(false,
- LLViewerLogin::getInstance()->isInProductionGrid());
+ LLGridManager::getInstance()->isInProductionGrid());
// Assume L$10 for now, the server will tell us the real cost at login
// *TODO:Also fix cost in llfolderview.cpp for Inventory menus
@@ -468,9 +478,10 @@ void init_menus()
gLoginMenuBarView = LLUICtrlFactory::getInstance()->createFromFile<LLMenuBarGL>("menu_login.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
gLoginMenuBarView->arrangeAndClear();
LLRect menuBarRect = gLoginMenuBarView->getRect();
- gLoginMenuBarView->setRect(LLRect(menuBarRect.mLeft, menuBarRect.mTop, gViewerWindow->getRootView()->getRect().getWidth() - menuBarRect.mLeft, menuBarRect.mBottom));
+ menuBarRect.setLeftTopAndSize(0, menu_bar_holder->getRect().getHeight(), menuBarRect.getWidth(), menuBarRect.getHeight());
+ gLoginMenuBarView->setRect(menuBarRect);
gLoginMenuBarView->setBackgroundColor( color );
- gMenuHolder->addChild(gLoginMenuBarView);
+ menu_bar_holder->addChild(gLoginMenuBarView);
// tooltips are on top of EVERYTHING, including menus
gViewerWindow->getRootView()->sendChildToFront(gToolTipView);
@@ -1449,28 +1460,28 @@ class LLAdvancedGrabBakedTexture : public view_listener_t
std::string texture_type = userdata.asString();
if ("iris" == texture_type)
{
- handle_grab_texture( (void*)TEX_EYES_BAKED );
+ handle_grab_baked_texture( (void*)BAKED_EYES );
}
else if ("head" == texture_type)
{
- handle_grab_texture( (void*)TEX_HEAD_BAKED );
+ handle_grab_baked_texture( (void*)BAKED_HEAD );
}
else if ("upper" == texture_type)
{
- handle_grab_texture( (void*)TEX_UPPER_BAKED );
+ handle_grab_baked_texture( (void*)BAKED_UPPER );
}
else if ("lower" == texture_type)
{
- handle_grab_texture( (void*)TEX_SKIRT_BAKED );
+ handle_grab_baked_texture( (void*)BAKED_LOWER );
}
else if ("skirt" == texture_type)
{
- handle_grab_texture( (void*)TEX_SKIRT_BAKED );
+ handle_grab_baked_texture( (void*)BAKED_SKIRT );
}
else if ("hair" == texture_type)
{
- handle_grab_texture( (void*)TEX_HAIR_BAKED );
-}
+ handle_grab_baked_texture( (void*)BAKED_HAIR );
+ }
return true;
}
@@ -1485,23 +1496,27 @@ class LLAdvancedEnableGrabBakedTexture : public view_listener_t
if ("iris" == texture_type)
{
- new_value = enable_grab_texture( (void*)TEX_EYES_BAKED );
+ new_value = enable_grab_baked_texture( (void*)BAKED_EYES );
}
else if ("head" == texture_type)
{
- new_value = enable_grab_texture( (void*)TEX_HEAD_BAKED );
+ new_value = enable_grab_baked_texture( (void*)BAKED_HEAD );
}
else if ("upper" == texture_type)
{
- new_value = enable_grab_texture( (void*)TEX_UPPER_BAKED );
+ new_value = enable_grab_baked_texture( (void*)BAKED_UPPER );
}
else if ("lower" == texture_type)
{
- new_value = enable_grab_texture( (void*)TEX_LOWER_BAKED );
+ new_value = enable_grab_baked_texture( (void*)BAKED_LOWER );
}
else if ("skirt" == texture_type)
{
- new_value = enable_grab_texture( (void*)TEX_SKIRT_BAKED );
+ new_value = enable_grab_baked_texture( (void*)BAKED_SKIRT );
+ }
+ else if ("hair" == texture_type)
+ {
+ new_value = enable_grab_baked_texture( (void*)BAKED_HAIR );
}
return new_value;
@@ -1795,9 +1810,10 @@ class LLAdvancedDebugAvatarTextures : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
-#ifndef LL_RELEASE_FOR_DOWNLOAD
- handle_debug_avatar_textures(NULL);
-#endif
+ if (gAgent.isGodlike())
+ {
+ handle_debug_avatar_textures(NULL);
+ }
return true;
}
};
@@ -2387,18 +2403,14 @@ void handle_object_touch()
msg->sendMessage(object->getRegion()->getHost());
}
-bool enable_object_touch()
-{
- LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
- return obj && obj->flagHandleTouch();
-}
-
// One object must have touch sensor
class LLObjectEnableTouch : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- bool new_value = enable_object_touch();
+ LLViewerObject* obj = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
+
+ bool new_value = obj && obj->flagHandleTouch();
// Update label based on the node touch name if available.
std::string touch_text;
@@ -2477,18 +2489,18 @@ class LLObjectBuild : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- if (gAgent.getFocusOnAvatar() && !LLToolMgr::getInstance()->inEdit() && gSavedSettings.getBOOL("EditCameraMovement") )
+ if (gAgentCamera.getFocusOnAvatar() && !LLToolMgr::getInstance()->inEdit() && gSavedSettings.getBOOL("EditCameraMovement") )
{
// zoom in if we're looking at the avatar
- gAgent.setFocusOnAvatar(FALSE, ANIMATE);
- gAgent.setFocusGlobal(LLToolPie::getInstance()->getPick());
- gAgent.cameraZoomIn(0.666f);
- gAgent.cameraOrbitOver( 30.f * DEG_TO_RAD );
+ gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE);
+ gAgentCamera.setFocusGlobal(LLToolPie::getInstance()->getPick());
+ gAgentCamera.cameraZoomIn(0.666f);
+ gAgentCamera.cameraOrbitOver( 30.f * DEG_TO_RAD );
gViewerWindow->moveCursorToCenter();
}
else if ( gSavedSettings.getBOOL("EditCameraMovement") )
{
- gAgent.setFocusGlobal(LLToolPie::getInstance()->getPick());
+ gAgentCamera.setFocusGlobal(LLToolPie::getInstance()->getPick());
gViewerWindow->moveCursorToCenter();
}
@@ -2506,7 +2518,7 @@ void handle_object_edit()
{
LLViewerParcelMgr::getInstance()->deselectLand();
- if (gAgent.getFocusOnAvatar() && !LLToolMgr::getInstance()->inEdit())
+ if (gAgentCamera.getFocusOnAvatar() && !LLToolMgr::getInstance()->inEdit())
{
LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
@@ -2514,19 +2526,19 @@ void handle_object_edit()
{
// always freeze camera in space, even if camera doesn't move
// so, for example, follow cam scripts can't affect you when in build mode
- gAgent.setFocusGlobal(gAgent.calcFocusPositionTargetGlobal(), LLUUID::null);
- gAgent.setFocusOnAvatar(FALSE, ANIMATE);
+ gAgentCamera.setFocusGlobal(gAgentCamera.calcFocusPositionTargetGlobal(), LLUUID::null);
+ gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE);
}
else
{
- gAgent.setFocusOnAvatar(FALSE, ANIMATE);
+ gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE);
LLViewerObject* selected_objectp = selection->getFirstRootObject();
if (selected_objectp)
{
// zoom in on object center instead of where we clicked, as we need to see the manipulator handles
- gAgent.setFocusGlobal(selected_objectp->getPositionGlobal(), selected_objectp->getID());
- gAgent.cameraZoomIn(0.666f);
- gAgent.cameraOrbitOver( 30.f * DEG_TO_RAD );
+ gAgentCamera.setFocusGlobal(selected_objectp->getPositionGlobal(), selected_objectp->getID());
+ gAgentCamera.cameraZoomIn(0.666f);
+ gAgentCamera.cameraOrbitOver( 30.f * DEG_TO_RAD );
gViewerWindow->moveCursorToCenter();
}
}
@@ -2555,7 +2567,7 @@ void handle_object_inspect()
key["task"] = "task";
LLSideTray::getInstance()->showPanel("sidepanel_inventory", key);
}
-
+
/*
// Old floater properties
LLFloaterReg::showInstance("inspect", LLSD());
@@ -2571,19 +2583,19 @@ class LLLandBuild : public view_listener_t
{
LLViewerParcelMgr::getInstance()->deselectLand();
- if (gAgent.getFocusOnAvatar() && !LLToolMgr::getInstance()->inEdit() && gSavedSettings.getBOOL("EditCameraMovement") )
+ if (gAgentCamera.getFocusOnAvatar() && !LLToolMgr::getInstance()->inEdit() && gSavedSettings.getBOOL("EditCameraMovement") )
{
// zoom in if we're looking at the avatar
- gAgent.setFocusOnAvatar(FALSE, ANIMATE);
- gAgent.setFocusGlobal(LLToolPie::getInstance()->getPick());
- gAgent.cameraZoomIn(0.666f);
- gAgent.cameraOrbitOver( 30.f * DEG_TO_RAD );
+ gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE);
+ gAgentCamera.setFocusGlobal(LLToolPie::getInstance()->getPick());
+ gAgentCamera.cameraZoomIn(0.666f);
+ gAgentCamera.cameraOrbitOver( 30.f * DEG_TO_RAD );
gViewerWindow->moveCursorToCenter();
}
else if ( gSavedSettings.getBOOL("EditCameraMovement") )
{
// otherwise just move focus
- gAgent.setFocusGlobal(LLToolPie::getInstance()->getPick());
+ gAgentCamera.setFocusGlobal(LLToolPie::getInstance()->getPick());
gViewerWindow->moveCursorToCenter();
}
@@ -2686,11 +2698,10 @@ class LLSelfEnableRemoveAllAttachments : public view_listener_t
bool handleEvent(const LLSD& userdata)
{
bool new_value = false;
- if (gAgent.getAvatarObject())
+ if (isAgentAvatarValid())
{
- LLVOAvatar* avatarp = gAgent.getAvatarObject();
- for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin();
- iter != avatarp->mAttachmentPoints.end(); )
+ for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin();
+ iter != gAgentAvatarp->mAttachmentPoints.end(); )
{
LLVOAvatar::attachment_map_t::iterator curiter = iter++;
LLViewerJointAttachment* attachment = curiter->second;
@@ -2818,14 +2829,14 @@ bool handle_go_to()
LLViewerParcelMgr::getInstance()->deselectLand();
- if (gAgent.getAvatarObject() && !gSavedSettings.getBOOL("AutoPilotLocksCamera"))
+ if (isAgentAvatarValid() && !gSavedSettings.getBOOL("AutoPilotLocksCamera"))
{
- gAgent.setFocusGlobal(gAgent.getFocusTargetGlobal(), gAgent.getAvatarObject()->getID());
+ gAgentCamera.setFocusGlobal(gAgentCamera.getFocusTargetGlobal(), gAgentAvatarp->getID());
}
else
{
// Snap camera back to behind avatar
- gAgent.setFocusOnAvatar(TRUE, ANIMATE);
+ gAgentCamera.setFocusOnAvatar(TRUE, ANIMATE);
}
// Could be first use
@@ -3267,14 +3278,6 @@ void handle_buy_object(LLSaleInfo sale_info)
return;
}
- S32 price = sale_info.getSalePrice();
-
- if (price > 0 && price > gStatusBar->getBalance())
- {
- LLFloaterBuyCurrency::buyCurrency("This object costs", price);
- return;
- }
-
LLFloaterBuy::show(sale_info);
}
@@ -3357,7 +3360,7 @@ class LLSelfStandUp : public view_listener_t
bool enable_standup_self()
{
- bool new_value = gAgent.getAvatarObject() && gAgent.getAvatarObject()->isSitting();
+ bool new_value = isAgentAvatarValid() && gAgentAvatarp->isSitting();
return new_value;
}
@@ -3455,7 +3458,7 @@ void set_god_level(U8 god_level)
if(gViewerWindow)
{
gViewerWindow->setMenuBackgroundColor(god_level > GOD_NOT,
- LLViewerLogin::getInstance()->isInProductionGrid());
+ LLGridManager::getInstance()->isInProductionGrid());
}
LLSD args;
@@ -3495,7 +3498,7 @@ BOOL check_toggle_hacked_godmode(void*)
bool enable_toggle_hacked_godmode(void*)
{
- return !LLViewerLogin::getInstance()->isInProductionGrid();
+ return !LLGridManager::getInstance()->isInProductionGrid();
}
#endif
@@ -3554,9 +3557,15 @@ bool LLHaveCallingcard::operator()(LLInventoryCategory* cat,
BOOL is_agent_mappable(const LLUUID& agent_id)
{
- return (LLAvatarActions::isFriend(agent_id) &&
- LLAvatarTracker::instance().getBuddyInfo(agent_id)->isOnline() &&
- LLAvatarTracker::instance().getBuddyInfo(agent_id)->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION)
+ const LLRelationship* buddy_info = NULL;
+ bool is_friend = LLAvatarActions::isFriend(agent_id);
+
+ if (is_friend)
+ buddy_info = LLAvatarTracker::instance().getBuddyInfo(agent_id);
+
+ return (buddy_info &&
+ buddy_info->isOnline() &&
+ buddy_info->isRightGrantedFrom(LLRelationship::GRANT_MAP_LOCATION)
);
}
@@ -3610,6 +3619,14 @@ class LLEditEnableCustomizeAvatar : public view_listener_t
}
};
+class LLEnableEditShape : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ return gAgentWearables.isWearableModifiable(LLWearableType::WT_SHAPE, 0);
+ }
+};
+
bool enable_sit_object()
{
LLViewerObject* object = LLSelectMgr::getInstance()->getSelection()->getPrimaryObject();
@@ -3680,9 +3697,9 @@ class LLLandSit : public view_listener_t
LLVector3d posGlobal = LLToolPie::getInstance()->getPick().mPosGlobal;
LLQuaternion target_rot;
- if (gAgent.getAvatarObject())
+ if (isAgentAvatarValid())
{
- target_rot = gAgent.getAvatarObject()->getRotation();
+ target_rot = gAgentAvatarp->getRotation();
}
else
{
@@ -3704,17 +3721,15 @@ void reset_view_final( BOOL proceed );
void handle_reset_view()
{
- if( (CAMERA_MODE_CUSTOMIZE_AVATAR == gAgent.getCameraMode()) && gFloaterCustomize )
- {
- // Show dialog box if needed.
- gFloaterCustomize->askToSaveIfDirty( reset_view_final );
- }
- else
+ if (gAgentCamera.cameraCustomizeAvatar())
{
- gAgent.switchCameraPreset(CAMERA_PRESET_REAR_VIEW);
- reset_view_final( TRUE );
- LLFloaterCamera::resetCameraMode();
+ // switching to outfit selector should automagically save any currently edited wearable
+ LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "my_outfits"));
}
+
+ gAgentCamera.switchCameraPreset(CAMERA_PRESET_REAR_VIEW);
+ reset_view_final( TRUE );
+ LLFloaterCamera::resetCameraMode();
}
class LLViewResetView : public view_listener_t
@@ -3734,15 +3749,15 @@ void reset_view_final( BOOL proceed )
return;
}
- gAgent.resetView(TRUE, TRUE);
- gAgent.setLookAt(LOOKAT_TARGET_CLEAR);
+ gAgentCamera.resetView(TRUE, TRUE);
+ gAgentCamera.setLookAt(LOOKAT_TARGET_CLEAR);
}
class LLViewLookAtLastChatter : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- gAgent.lookAtLastChat();
+ gAgentCamera.lookAtLastChat();
return true;
}
};
@@ -3751,27 +3766,18 @@ class LLViewMouselook : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- if (!gAgent.cameraMouselook())
+ if (!gAgentCamera.cameraMouselook())
{
- gAgent.changeCameraToMouselook();
+ gAgentCamera.changeCameraToMouselook();
}
else
{
- gAgent.changeCameraToDefault();
+ gAgentCamera.changeCameraToDefault();
}
return true;
}
};
-class LLViewFullscreen : public view_listener_t
-{
- bool handleEvent(const LLSD& userdata)
- {
- gViewerWindow->toggleFullscreen(TRUE);
- return true;
- }
-};
-
class LLViewDefaultUISize : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -3845,15 +3851,15 @@ BOOL enable_deed_object_to_group(void*)
* No longer able to support viewer side manipulations in this way
*
void god_force_inv_owner_permissive(LLViewerObject* object,
- InventoryObjectList* inventory,
+ LLInventoryObject::object_list_t* inventory,
S32 serial_num,
void*)
{
typedef std::vector<LLPointer<LLViewerInventoryItem> > item_array_t;
item_array_t items;
- InventoryObjectList::const_iterator inv_it = inventory->begin();
- InventoryObjectList::const_iterator inv_end = inventory->end();
+ LLInventoryObject::object_list_t::const_iterator inv_it = inventory->begin();
+ LLInventoryObject::object_list_t::const_iterator inv_end = inventory->end();
for ( ; inv_it != inv_end; ++inv_it)
{
if(((*inv_it)->getType() != LLAssetType::AT_CATEGORY))
@@ -3976,9 +3982,9 @@ void handle_god_request_avatar_geometry(void *)
void derez_objects(EDeRezDestination dest, const LLUUID& dest_id)
{
- if(gAgent.cameraMouselook())
+ if(gAgentCamera.cameraMouselook())
{
- gAgent.changeCameraToDefault();
+ gAgentCamera.changeCameraToDefault();
}
//gInventoryView->setPanelOpen(TRUE);
@@ -4360,7 +4366,7 @@ BOOL enable_take()
return TRUE;
#else
# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
- if (!LLViewerLogin::getInstance()->isInProductionGrid()
+ if (!LLGridManager::getInstance()->isInProductionGrid()
&& gAgent.isGodlike())
{
return TRUE;
@@ -4395,8 +4401,9 @@ void handle_buy_or_take()
}
else
{
- LLFloaterBuyCurrency::buyCurrency(
- "Buying this costs", total_price);
+ LLStringUtil::format_map_t args;
+ args["AMOUNT"] = llformat("%d", total_price);
+ LLBuyCurrencyHTML::openCurrencyFloater( LLTrans::getString( "BuyingCosts", args ), total_price );
}
}
else
@@ -4415,35 +4422,22 @@ bool visible_take_object()
return !is_selection_buy_not_take() && enable_take();
}
+bool tools_visible_buy_object()
+{
+ return is_selection_buy_not_take();
+}
+
+bool tools_visible_take_object()
+{
+ return !is_selection_buy_not_take();
+}
+
class LLToolsEnableBuyOrTake : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
bool is_buy = is_selection_buy_not_take();
bool new_value = is_buy ? enable_buy_object() : enable_take();
-
- // Update label
- std::string label;
- std::string buy_text;
- std::string take_text;
- std::string param = userdata.asString();
- std::string::size_type offset = param.find(",");
- if (offset != param.npos)
- {
- buy_text = param.substr(0, offset);
- take_text = param.substr(offset+1);
- }
- if (is_buy)
- {
- label = buy_text;
- }
- else
- {
- label = take_text;
- }
- gMenuHolder->childSetText("Pie Object Take", label);
- gMenuHolder->childSetText("Menu Object Take", label);
-
return new_value;
}
};
@@ -4539,6 +4533,16 @@ void handle_buy()
BOOL valid = LLSelectMgr::getInstance()->selectGetSaleInfo(sale_info);
if (!valid) return;
+ S32 price = sale_info.getSalePrice();
+
+ if (price > 0 && price > gStatusBar->getBalance())
+ {
+ LLStringUtil::format_map_t args;
+ args["AMOUNT"] = llformat("%d", price);
+ LLBuyCurrencyHTML::openCurrencyFloater( LLTrans::getString("this_object_costs", args), price );
+ return;
+ }
+
if (sale_info.getSaleType() == LLSaleInfo::FS_CONTENTS)
{
handle_buy_contents(sale_info);
@@ -4584,13 +4588,9 @@ BOOL sitting_on_selection()
}
// Need to determine if avatar is sitting on this object
- LLVOAvatar* avatar = gAgent.getAvatarObject();
- if (!avatar)
- {
- return FALSE;
- }
+ if (!isAgentAvatarValid()) return FALSE;
- return (avatar->isSitting() && avatar->getRoot() == root_object);
+ return (gAgentAvatarp->isSitting() && gAgentAvatarp->getRoot() == root_object);
}
class LLToolsSaveToInventory : public view_listener_t
@@ -4842,9 +4842,10 @@ class LLToolsEnableUnlink : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
+ LLViewerObject* first_editable_object = LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject();
bool new_value = LLSelectMgr::getInstance()->selectGetAllRootsValid() &&
- LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject() &&
- !LLSelectMgr::getInstance()->getSelection()->getFirstEditableObject()->isAttachment();
+ first_editable_object &&
+ !first_editable_object->isAttachment();
return new_value;
}
};
@@ -4987,7 +4988,7 @@ bool enable_object_delete()
TRUE;
#else
# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
- (!LLViewerLogin::getInstance()->isInProductionGrid()
+ (!LLGridManager::getInstance()->isInProductionGrid()
&& gAgent.isGodlike()) ||
# endif
LLSelectMgr::getInstance()->canDoDelete();
@@ -5031,7 +5032,7 @@ class LLViewEnableLastChatter : public view_listener_t
bool handleEvent(const LLSD& userdata)
{
// *TODO: add check that last chatter is in range
- bool new_value = (gAgent.cameraThirdPerson() && gAgent.getLastChatter().notNull());
+ bool new_value = (gAgentCamera.cameraThirdPerson() && gAgent.getLastChatter().notNull());
return new_value;
}
};
@@ -5145,7 +5146,7 @@ void print_agent_nvpairs(void*)
llinfos << "Can't find agent object" << llendl;
}
- llinfos << "Camera at " << gAgent.getCameraPositionGlobal() << llendl;
+ llinfos << "Camera at " << gAgentCamera.getCameraPositionGlobal() << llendl;
}
void show_debug_menus()
@@ -5182,10 +5183,6 @@ void toggle_debug_menus(void*)
{
BOOL visible = ! gSavedSettings.getBOOL("UseDebugMenus");
gSavedSettings.setBOOL("UseDebugMenus", visible);
- if(visible)
- {
- //LLFirstUse::useDebugMenus();
- }
show_debug_menus();
}
@@ -5330,13 +5327,23 @@ class LLWorldCreateLandmark : public view_listener_t
}
};
+class LLWorldPlaceProfile : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ LLSideTray::getInstance()->showPanel("panel_places", LLSD().with("type", "agent"));
+
+ return true;
+ }
+};
+
void handle_look_at_selection(const LLSD& param)
{
- const F32 PADDING_FACTOR = 2.f;
+ const F32 PADDING_FACTOR = 1.75f;
BOOL zoom = (param.asString() == "zoom");
if (!LLSelectMgr::getInstance()->getSelection()->isEmpty())
{
- gAgent.setFocusOnAvatar(FALSE, ANIMATE);
+ gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE);
LLBBox selection_bbox = LLSelectMgr::getInstance()->getBBoxOfSelection();
F32 angle_of_view = llmax(0.1f, LLViewerCamera::getInstance()->getAspect() > 1.f ? LLViewerCamera::getInstance()->getView() * LLViewerCamera::getInstance()->getAspect() : LLViewerCamera::getInstance()->getView());
@@ -5352,14 +5359,19 @@ void handle_look_at_selection(const LLSD& param)
}
if (zoom)
{
- gAgent.setCameraPosAndFocusGlobal(LLSelectMgr::getInstance()->getSelectionCenterGlobal() + LLVector3d(obj_to_cam * distance),
- LLSelectMgr::getInstance()->getSelectionCenterGlobal(),
- object_id );
+ // Make sure we are not increasing the distance between the camera and object
+ LLVector3d orig_distance = gAgentCamera.getCameraPositionGlobal() - LLSelectMgr::getInstance()->getSelectionCenterGlobal();
+ distance = llmin(distance, (F32) orig_distance.length());
+
+ gAgentCamera.setCameraPosAndFocusGlobal(LLSelectMgr::getInstance()->getSelectionCenterGlobal() + LLVector3d(obj_to_cam * distance),
+ LLSelectMgr::getInstance()->getSelectionCenterGlobal(),
+ object_id );
+
}
else
{
- gAgent.setFocusGlobal( LLSelectMgr::getInstance()->getSelectionCenterGlobal(), object_id );
- }
+ gAgentCamera.setFocusGlobal( LLSelectMgr::getInstance()->getSelectionCenterGlobal(), object_id );
+ }
}
}
@@ -5371,7 +5383,7 @@ void handle_zoom_to_object(LLUUID object_id)
if (object)
{
- gAgent.setFocusOnAvatar(FALSE, ANIMATE);
+ gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE);
LLBBox bbox = object->getBoundingBoxAgent() ;
F32 angle_of_view = llmax(0.1f, LLViewerCamera::getInstance()->getAspect() > 1.f ? LLViewerCamera::getInstance()->getView() * LLViewerCamera::getInstance()->getAspect() : LLViewerCamera::getInstance()->getView());
@@ -5383,7 +5395,7 @@ void handle_zoom_to_object(LLUUID object_id)
LLVector3d object_center_global = gAgent.getPosGlobalFromAgent(bbox.getCenterAgent());
- gAgent.setCameraPosAndFocusGlobal(object_center_global + LLVector3d(obj_to_cam * distance),
+ gAgentCamera.setCameraPosAndFocusGlobal(object_center_global + LLVector3d(obj_to_cam * distance),
object_center_global,
object_id );
}
@@ -5501,6 +5513,37 @@ bool enable_pay_object()
return false;
}
+bool visible_object_stand_up()
+{
+ // 'Object Stand Up' menu item is visible when agent is sitting on selection
+ return sitting_on_selection();
+}
+
+bool visible_object_sit()
+{
+ // 'Object Sit' menu item is visible when agent is not sitting on selection
+ bool is_sit_visible = !sitting_on_selection();
+ if (is_sit_visible)
+ {
+ LLMenuItemGL* sit_menu_item = gMenuHolder->getChild<LLMenuItemGL>("Object Sit");
+ // Init default 'Object Sit' menu item label
+ static const LLStringExplicit sit_text(sit_menu_item->getLabel());
+ // Update label
+ std::string label;
+ LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode();
+ if (node && node->mValid && !node->mSitName.empty())
+ {
+ label.assign(node->mSitName);
+ }
+ else
+ {
+ label = sit_text;
+ }
+ sit_menu_item->setLabel(label);
+ }
+ return is_sit_visible;
+}
+
class LLObjectEnableSitOrStand : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -5515,34 +5558,6 @@ class LLObjectEnableSitOrStand : public view_listener_t
new_value = true;
}
}
- // Update label
- std::string label;
- std::string sit_text;
- std::string stand_text;
- std::string param = userdata.asString();
- std::string::size_type offset = param.find(",");
- if (offset != param.npos)
- {
- sit_text = param.substr(0, offset);
- stand_text = param.substr(offset+1);
- }
- if (sitting_on_selection())
- {
- label = stand_text;
- }
- else
- {
- LLSelectNode* node = LLSelectMgr::getInstance()->getSelection()->getFirstRootNode();
- if (node && node->mValid && !node->mSitName.empty())
- {
- label.assign(node->mSitName);
- }
- else
- {
- label = sit_text;
- }
- }
- gMenuHolder->childSetText("Object Sit", label);
return new_value;
}
@@ -5576,10 +5591,17 @@ void handle_viewer_disable_message_log(void*)
void handle_customize_avatar()
{
- if (gAgentWearables.areWearablesLoaded())
- {
- gAgent.changeCameraToCustomizeAvatar();
- }
+ LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "my_outfits"));
+}
+
+void handle_edit_outfit()
+{
+ LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit"));
+}
+
+void handle_edit_shape()
+{
+ LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_shape"));
}
void handle_report_abuse()
@@ -5591,11 +5613,9 @@ void handle_report_abuse()
void handle_buy_currency()
{
- LLFloaterBuyCurrency::buyCurrency();
+ LLBuyCurrencyHTML::openCurrencyFloater();
}
-
-
class LLFloaterVisible : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
@@ -5625,19 +5645,39 @@ class LLShowSidetrayPanel : public view_listener_t
bool handleEvent(const LLSD& userdata)
{
std::string panel_name = userdata.asString();
- // Open up either the sidepanel or new floater.
- if (LLSideTray::getInstance()->isPanelActive(panel_name))
+ // Toggle the panel
+ if (!LLSideTray::getInstance()->isPanelActive(panel_name))
{
- LLFloaterInventory::showAgentInventory();
+ // LLFloaterInventory::showAgentInventory();
+ LLSideTray::getInstance()->showPanel(panel_name, LLSD());
}
else
{
- LLSideTray::getInstance()->showPanel(panel_name, LLSD());
+ LLSideTray::getInstance()->collapseSideBar();
}
return true;
}
};
+class LLSidetrayPanelVisible : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ std::string panel_name = userdata.asString();
+ // Toggle the panel
+ if (LLSideTray::getInstance()->isPanelActive(panel_name))
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+
+ }
+};
+
+
bool callback_show_url(const LLSD& notification, const LLSD& response)
{
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
@@ -5746,18 +5786,18 @@ class LLLandEdit : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- if (gAgent.getFocusOnAvatar() && gSavedSettings.getBOOL("EditCameraMovement") )
+ if (gAgentCamera.getFocusOnAvatar() && gSavedSettings.getBOOL("EditCameraMovement") )
{
// zoom in if we're looking at the avatar
- gAgent.setFocusOnAvatar(FALSE, ANIMATE);
- gAgent.setFocusGlobal(LLToolPie::getInstance()->getPick());
+ gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE);
+ gAgentCamera.setFocusGlobal(LLToolPie::getInstance()->getPick());
- gAgent.cameraOrbitOver( F_PI * 0.25f );
+ gAgentCamera.cameraOrbitOver( F_PI * 0.25f );
gViewerWindow->moveCursorToCenter();
}
else if ( gSavedSettings.getBOOL("EditCameraMovement") )
{
- gAgent.setFocusGlobal(LLToolPie::getInstance()->getPick());
+ gAgentCamera.setFocusGlobal(LLToolPie::getInstance()->getPick());
gViewerWindow->moveCursorToCenter();
}
@@ -5816,7 +5856,7 @@ private:
S32 index = userdata.asInteger();
LLViewerJointAttachment* attachment_point = NULL;
if (index > 0)
- attachment_point = get_if_there(gAgent.getAvatarObject()->mAttachmentPoints, index, (LLViewerJointAttachment*)NULL);
+ attachment_point = get_if_there(gAgentAvatarp->mAttachmentPoints, index, (LLViewerJointAttachment*)NULL);
confirm_replace_attachment(0, attachment_point);
}
return true;
@@ -5837,8 +5877,8 @@ void near_attach_object(BOOL success, void *user_data)
U8 attachment_id = 0;
if (attachment)
{
- for (LLVOAvatar::attachment_map_t::const_iterator iter = gAgent.getAvatarObject()->mAttachmentPoints.begin();
- iter != gAgent.getAvatarObject()->mAttachmentPoints.end(); ++iter)
+ for (LLVOAvatar::attachment_map_t::const_iterator iter = gAgentAvatarp->mAttachmentPoints.begin();
+ iter != gAgentAvatarp->mAttachmentPoints.end(); ++iter)
{
if (iter->second == attachment)
{
@@ -5883,7 +5923,7 @@ void confirm_replace_attachment(S32 option, void* user_data)
walkToSpot -= delta;
gAgent.startAutoPilotGlobal(gAgent.getPosGlobalFromAgent(walkToSpot), "Attach", NULL, near_attach_object, user_data, stop_distance);
- gAgent.clearFocusObject();
+ gAgentCamera.clearFocusObject();
}
}
}
@@ -5963,7 +6003,7 @@ class LLAttachmentDetachFromPoint : public view_listener_t
{
bool handleEvent(const LLSD& user_data)
{
- const LLViewerJointAttachment *attachment = get_if_there(gAgent.getAvatarObject()->mAttachmentPoints, user_data.asInteger(), (LLViewerJointAttachment*)NULL);
+ const LLViewerJointAttachment *attachment = get_if_there(gAgentAvatarp->mAttachmentPoints, user_data.asInteger(), (LLViewerJointAttachment*)NULL);
if (attachment->getNumObjects() > 0)
{
gMessageSystem->newMessage("ObjectDetach");
@@ -5991,7 +6031,7 @@ static bool onEnableAttachmentLabel(LLUICtrl* ctrl, const LLSD& data)
LLMenuItemGL* menu = dynamic_cast<LLMenuItemGL*>(ctrl);
if (menu)
{
- const LLViewerJointAttachment *attachment = get_if_there(gAgent.getAvatarObject()->mAttachmentPoints, data["index"].asInteger(), (LLViewerJointAttachment*)NULL);
+ const LLViewerJointAttachment *attachment = get_if_there(gAgentAvatarp->mAttachmentPoints, data["index"].asInteger(), (LLViewerJointAttachment*)NULL);
if (attachment)
{
label = data["label"].asString();
@@ -6069,10 +6109,12 @@ class LLAttachmentDetach : public view_listener_t
//Adding an observer for a Jira 2422 and needs to be a fetch observer
//for Jira 3119
-class LLWornItemFetchedObserver : public LLInventoryFetchObserver
+class LLWornItemFetchedObserver : public LLInventoryFetchItemsObserver
{
public:
- LLWornItemFetchedObserver() {}
+ LLWornItemFetchedObserver(const LLUUID& worn_item_id) :
+ LLInventoryFetchItemsObserver(worn_item_id)
+ {}
virtual ~LLWornItemFetchedObserver() {}
protected:
@@ -6109,7 +6151,7 @@ class LLAttachmentEnableDrop : public view_listener_t
if (object && LLSelectMgr::getInstance()->getSelection()->contains(object,SELECT_ALL_TES ))
{
S32 attachmentID = ATTACHMENT_ID_FROM_STATE(object->getState());
- attachment = get_if_there(gAgent.getAvatarObject()->mAttachmentPoints, attachmentID, (LLViewerJointAttachment*)NULL);
+ attachment = get_if_there(gAgentAvatarp->mAttachmentPoints, attachmentID, (LLViewerJointAttachment*)NULL);
if (attachment)
{
@@ -6126,13 +6168,9 @@ class LLAttachmentEnableDrop : public view_listener_t
// when the item finishes fetching worst case scenario
// if a fetch is already out there (being sent from a slow sim)
// we refetch and there are 2 fetches
- LLWornItemFetchedObserver* wornItemFetched = new LLWornItemFetchedObserver();
- LLInventoryFetchObserver::item_ref_t items; //add item to the inventory item to be fetched
-
- items.push_back((*attachment_iter)->getItemID());
-
- wornItemFetched->fetchItems(items);
- gInventory.addObserver(wornItemFetched);
+ LLWornItemFetchedObserver* worn_item_fetched = new LLWornItemFetchedObserver((*attachment_iter)->getItemID());
+ worn_item_fetched->startFetch();
+ gInventory.addObserver(worn_item_fetched);
}
}
}
@@ -6241,8 +6279,8 @@ class LLAttachmentPointFilled : public view_listener_t
bool handleEvent(const LLSD& user_data)
{
bool enable = false;
- LLVOAvatar::attachment_map_t::iterator found_it = gAgent.getAvatarObject()->mAttachmentPoints.find(user_data.asInteger());
- if (found_it != gAgent.getAvatarObject()->mAttachmentPoints.end())
+ LLVOAvatar::attachment_map_t::iterator found_it = gAgentAvatarp->mAttachmentPoints.find(user_data.asInteger());
+ if (found_it != gAgentAvatarp->mAttachmentPoints.end())
{
enable = found_it->second->getNumObjects() > 0;
}
@@ -6378,7 +6416,6 @@ class LLToolsSelectedScriptAction : public view_listener_t
else
{
llwarns << "Failed to generate LLFloaterScriptQueue with action: " << action << llendl;
- delete queue;
}
return true;
}
@@ -6439,13 +6476,13 @@ void handle_selected_texture_info(void*)
void handle_test_male(void*)
{
- LLAppearanceManager::instance().wearOutfitByName("Male Shape & Outfit");
+ LLAppearanceMgr::instance().wearOutfitByName("Male Shape & Outfit");
//gGestureList.requestResetFromServer( TRUE );
}
void handle_test_female(void*)
{
- LLAppearanceManager::instance().wearOutfitByName("Female Shape & Outfit");
+ LLAppearanceMgr::instance().wearOutfitByName("Female Shape & Outfit");
//gGestureList.requestResetFromServer( FALSE );
}
@@ -6460,15 +6497,10 @@ void handle_toggle_pg(void*)
void handle_dump_attachments(void*)
{
- LLVOAvatar* avatar = gAgent.getAvatarObject();
- if( !avatar )
- {
- llinfos << "NO AVATAR" << llendl;
- return;
- }
+ if(!isAgentAvatarValid()) return;
- for (LLVOAvatar::attachment_map_t::iterator iter = avatar->mAttachmentPoints.begin();
- iter != avatar->mAttachmentPoints.end(); )
+ for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin();
+ iter != gAgentAvatarp->mAttachmentPoints.end(); )
{
LLVOAvatar::attachment_map_t::iterator curiter = iter++;
LLViewerJointAttachment* attachment = curiter->second;
@@ -6607,7 +6639,7 @@ bool enable_object_take_copy()
all_valid = true;
#ifndef HACKED_GODLIKE_VIEWER
# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
- if (LLViewerLogin::getInstance()->isInProductionGrid()
+ if (LLGridManager::getInstance()->isInProductionGrid()
|| !gAgent.isGodlike())
# endif
{
@@ -6669,7 +6701,7 @@ BOOL enable_save_into_inventory(void*)
return TRUE;
#else
# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
- if (!LLViewerLogin::getInstance()->isInProductionGrid()
+ if (!LLGridManager::getInstance()->isInProductionGrid()
&& gAgent.isGodlike())
{
return TRUE;
@@ -6730,7 +6762,7 @@ class LLViewEnableMouselook : public view_listener_t
{
// You can't go directly from customize avatar to mouselook.
// TODO: write code with appropriate dialogs to handle this transition.
- bool new_value = (CAMERA_MODE_CUSTOMIZE_AVATAR != gAgent.getCameraMode() && !gSavedSettings.getBOOL("FreezeTime"));
+ bool new_value = (CAMERA_MODE_CUSTOMIZE_AVATAR != gAgentCamera.getCameraMode() && !gSavedSettings.getBOOL("FreezeTime"));
return new_value;
}
};
@@ -6867,7 +6899,8 @@ class LLToolsEditLinkedParts : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- BOOL select_individuals = gSavedSettings.getBOOL("EditLinkedParts");
+ BOOL select_individuals = !gSavedSettings.getBOOL("EditLinkedParts");
+ gSavedSettings.setBOOL( "EditLinkedParts", select_individuals );
if (select_individuals)
{
LLSelectMgr::getInstance()->demoteSelectionToIndividuals();
@@ -6887,7 +6920,7 @@ void reload_vertex_shader(void *)
void handle_dump_avatar_local_textures(void*)
{
- gAgent.getAvatarObject()->dumpLocalTextures();
+ gAgentAvatarp->dumpLocalTextures();
}
void handle_dump_timers()
@@ -6904,89 +6937,78 @@ void handle_debug_avatar_textures(void*)
}
}
-void handle_grab_texture(void* data)
+void handle_grab_baked_texture(void* data)
{
- ETextureIndex tex_index = (ETextureIndex)((intptr_t)data);
- const LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- if ( avatar )
- {
- // MULTI-WEARABLE: change to support an index
- const LLUUID& asset_id = avatar->grabLocalTexture(tex_index, 0);
- LL_INFOS("texture") << "Adding baked texture " << asset_id << " to inventory." << llendl;
- LLAssetType::EType asset_type = LLAssetType::AT_TEXTURE;
- LLInventoryType::EType inv_type = LLInventoryType::IT_TEXTURE;
- const LLUUID folder_id = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(asset_type));
- if(folder_id.notNull())
- {
- std::string name = "Unknown";
- const LLVOAvatarDictionary::TextureEntry *texture_dict = LLVOAvatarDictionary::getInstance()->getTexture(tex_index);
- if (texture_dict->mIsBakedTexture)
- {
- EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex;
- name = "Baked " + LLVOAvatarDictionary::getInstance()->getBakedTexture(baked_index)->mNameCapitalized;
- }
- name += " Texture";
-
- LLUUID item_id;
- item_id.generate();
- LLPermissions perm;
- perm.init(gAgentID,
- gAgentID,
- LLUUID::null,
- LLUUID::null);
- U32 next_owner_perm = PERM_MOVE | PERM_TRANSFER;
- perm.initMasks(PERM_ALL,
- PERM_ALL,
- PERM_NONE,
- PERM_NONE,
- next_owner_perm);
- time_t creation_date_now = time_corrected();
- LLPointer<LLViewerInventoryItem> item
- = new LLViewerInventoryItem(item_id,
- folder_id,
- perm,
- asset_id,
- asset_type,
- inv_type,
- name,
- LLStringUtil::null,
- LLSaleInfo::DEFAULT,
- LLInventoryItem::II_FLAGS_NONE,
- creation_date_now);
-
- item->updateServer(TRUE);
- gInventory.updateItem(item);
- gInventory.notifyObservers();
-
- // Show the preview panel for textures to let
- // user know that the image is now in inventory.
- LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
- if(active_panel)
- {
- LLFocusableElement* focus_ctrl = gFocusMgr.getKeyboardFocus();
+ EBakedTextureIndex baked_tex_index = (EBakedTextureIndex)((intptr_t)data);
+ if (!isAgentAvatarValid()) return;
- active_panel->setSelection(item_id, TAKE_FOCUS_NO);
- active_panel->openSelected();
- //LLFloaterInventory::dumpSelectionInformation((void*)view);
- // restore keyboard focus
- gFocusMgr.setKeyboardFocus(focus_ctrl);
- }
- }
- else
- {
- llwarns << "Can't find a folder to put it in" << llendl;
+ const LLUUID& asset_id = gAgentAvatarp->grabBakedTexture(baked_tex_index);
+ LL_INFOS("texture") << "Adding baked texture " << asset_id << " to inventory." << llendl;
+ LLAssetType::EType asset_type = LLAssetType::AT_TEXTURE;
+ LLInventoryType::EType inv_type = LLInventoryType::IT_TEXTURE;
+ const LLUUID folder_id = gInventory.findCategoryUUIDForType(LLFolderType::assetTypeToFolderType(asset_type));
+ if(folder_id.notNull())
+ {
+ std::string name;
+ name = "Baked " + LLVOAvatarDictionary::getInstance()->getBakedTexture(baked_tex_index)->mNameCapitalized + " Texture";
+
+ LLUUID item_id;
+ item_id.generate();
+ LLPermissions perm;
+ perm.init(gAgentID,
+ gAgentID,
+ LLUUID::null,
+ LLUUID::null);
+ U32 next_owner_perm = PERM_MOVE | PERM_TRANSFER;
+ perm.initMasks(PERM_ALL,
+ PERM_ALL,
+ PERM_NONE,
+ PERM_NONE,
+ next_owner_perm);
+ time_t creation_date_now = time_corrected();
+ LLPointer<LLViewerInventoryItem> item
+ = new LLViewerInventoryItem(item_id,
+ folder_id,
+ perm,
+ asset_id,
+ asset_type,
+ inv_type,
+ name,
+ LLStringUtil::null,
+ LLSaleInfo::DEFAULT,
+ LLInventoryItemFlags::II_FLAGS_NONE,
+ creation_date_now);
+
+ item->updateServer(TRUE);
+ gInventory.updateItem(item);
+ gInventory.notifyObservers();
+
+ // Show the preview panel for textures to let
+ // user know that the image is now in inventory.
+ LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
+ if(active_panel)
+ {
+ LLFocusableElement* focus_ctrl = gFocusMgr.getKeyboardFocus();
+
+ active_panel->setSelection(item_id, TAKE_FOCUS_NO);
+ active_panel->openSelected();
+ //LLFloaterInventory::dumpSelectionInformation((void*)view);
+ // restore keyboard focus
+ gFocusMgr.setKeyboardFocus(focus_ctrl);
}
}
+ else
+ {
+ llwarns << "Can't find a folder to put it in" << llendl;
+ }
}
-BOOL enable_grab_texture(void* data)
+BOOL enable_grab_baked_texture(void* data)
{
- ETextureIndex index = (ETextureIndex)((intptr_t)data);
- const LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- if ( avatar )
+ EBakedTextureIndex index = (EBakedTextureIndex)((intptr_t)data);
+ if (isAgentAvatarValid())
{
- // MULTI-WEARABLE:
- return avatar->canGrabLocalTexture(index,0);
+ return gAgentAvatarp->canGrabBakedTexture(index);
}
return FALSE;
}
@@ -7025,7 +7047,7 @@ LLVOAvatar* find_avatar_from_object( const LLUUID& object_id )
void handle_disconnect_viewer(void *)
{
- LLAppViewer::instance()->forceDisconnect("Testing viewer disconnect");
+ LLAppViewer::instance()->forceDisconnect(LLTrans::getString("TestingDisconnect"));
}
void force_error_breakpoint(void *)
@@ -7176,7 +7198,7 @@ void handle_web_browser_test(const LLSD& param)
{
url = "about:blank";
}
- LLWeb::loadURL(url);
+ LLWeb::loadURLInternal(url);
}
void handle_buy_currency_test(void*)
@@ -7197,12 +7219,11 @@ void handle_buy_currency_test(void*)
void handle_rebake_textures(void*)
{
- LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- if (!avatar) return;
+ if (!isAgentAvatarValid()) return;
// Slam pending upload count to "unstick" things
bool slam_for_debug = true;
- avatar->forceBakeAllTextures(slam_for_debug);
+ gAgentAvatarp->forceBakeAllTextures(slam_for_debug);
}
void toggle_visibility(void* user_data)
@@ -7446,8 +7467,8 @@ class LLEditEnableTakeOff : public view_listener_t
bool handleEvent(const LLSD& userdata)
{
std::string clothing = userdata.asString();
- EWearableType type = LLWearableDictionary::typeNameToType(clothing);
- if (type >= WT_SHAPE && type < WT_COUNT)
+ LLWearableType::EType type = LLWearableType::typeNameToType(clothing);
+ if (type >= LLWearableType::WT_SHAPE && type < LLWearableType::WT_COUNT)
return LLAgentWearables::selfHasWearable(type);
return false;
}
@@ -7462,11 +7483,14 @@ class LLEditTakeOff : public view_listener_t
LLWearableBridge::removeAllClothesFromAvatar();
else
{
- EWearableType type = LLWearableDictionary::typeNameToType(clothing);
- if (type >= WT_SHAPE && type < WT_COUNT)
+ LLWearableType::EType type = LLWearableType::typeNameToType(clothing);
+ if (type >= LLWearableType::WT_SHAPE
+ && type < LLWearableType::WT_COUNT
+ && (gAgentWearables.getWearableCount(type) > 0))
{
- // MULTI-WEARABLES
- LLViewerInventoryItem *item = dynamic_cast<LLViewerInventoryItem*>(gAgentWearables.getWearableInventoryItem(type,0));
+ // MULTI-WEARABLES: assuming user wanted to remove top shirt.
+ U32 wearable_index = gAgentWearables.getWearableCount(type) - 1;
+ LLViewerInventoryItem *item = dynamic_cast<LLViewerInventoryItem*>(gAgentWearables.getWearableInventoryItem(type,wearable_index));
LLWearableBridge::removeItemFromAvatar(item);
}
@@ -7602,6 +7626,60 @@ class LLWorldDayCycle : public view_listener_t
}
};
+class LLWorldToggleMovementControls : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ LLBottomTray::getInstance()->toggleMovementControls();
+ return true;
+ }
+};
+
+class LLWorldToggleCameraControls : public view_listener_t
+{
+ bool handleEvent(const LLSD& userdata)
+ {
+ LLBottomTray::getInstance()->toggleCameraControls();
+ return true;
+ }
+};
+
+class LLUploadCostCalculator : public view_listener_t
+{
+ std::string mCostStr;
+
+ bool handleEvent(const LLSD& userdata)
+ {
+ std::string menu_name = userdata.asString();
+ gMenuHolder->childSetLabelArg(menu_name, "[COST]", mCostStr);
+
+ return true;
+ }
+
+ void calculateCost();
+
+public:
+ LLUploadCostCalculator()
+ {
+ calculateCost();
+ }
+};
+
+void LLUploadCostCalculator::calculateCost()
+{
+ S32 upload_cost = LLGlobalEconomy::Singleton::getInstance()->getPriceUpload();
+
+ // getPriceUpload() returns -1 if no data available yet.
+ if(upload_cost >= 0)
+ {
+ mCostStr = llformat("%d", upload_cost);
+ }
+ else
+ {
+ mCostStr = llformat("%d", gSavedSettings.getU32("DefaultUploadCost"));
+ }
+}
+
void show_navbar_context_menu(LLView* ctrl, S32 x, S32 y)
{
static LLMenuGL* show_navbar_context_menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_hide_navbar.xml",
@@ -7615,6 +7693,55 @@ void show_navbar_context_menu(LLView* ctrl, S32 x, S32 y)
LLMenuGL::showPopup(ctrl, show_navbar_context_menu, x, y);
}
+void show_topinfobar_context_menu(LLView* ctrl, S32 x, S32 y)
+{
+ static LLMenuGL* show_topbarinfo_context_menu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>("menu_topinfobar.xml",
+ gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+
+ LLMenuItemGL* landmark_item = show_topbarinfo_context_menu->getChild<LLMenuItemGL>("Landmark");
+ if (!LLLandmarkActions::landmarkAlreadyExists())
+ {
+ landmark_item->setLabel(LLTrans::getString("AddLandmarkNavBarMenu"));
+ }
+ else
+ {
+ landmark_item->setLabel(LLTrans::getString("EditLandmarkNavBarMenu"));
+ }
+
+ if(gMenuHolder->hasVisibleMenu())
+ {
+ gMenuHolder->hideMenus();
+ }
+
+ show_topbarinfo_context_menu->buildDrawLabels();
+ show_topbarinfo_context_menu->updateParent(LLMenuGL::sMenuContainer);
+ LLMenuGL::showPopup(ctrl, show_topbarinfo_context_menu, x, y);
+}
+
+void initialize_edit_menu()
+{
+ view_listener_t::addMenu(new LLEditUndo(), "Edit.Undo");
+ view_listener_t::addMenu(new LLEditRedo(), "Edit.Redo");
+ view_listener_t::addMenu(new LLEditCut(), "Edit.Cut");
+ view_listener_t::addMenu(new LLEditCopy(), "Edit.Copy");
+ view_listener_t::addMenu(new LLEditPaste(), "Edit.Paste");
+ view_listener_t::addMenu(new LLEditDelete(), "Edit.Delete");
+ view_listener_t::addMenu(new LLEditSelectAll(), "Edit.SelectAll");
+ view_listener_t::addMenu(new LLEditDeselect(), "Edit.Deselect");
+ view_listener_t::addMenu(new LLEditDuplicate(), "Edit.Duplicate");
+ view_listener_t::addMenu(new LLEditTakeOff(), "Edit.TakeOff");
+ view_listener_t::addMenu(new LLEditEnableUndo(), "Edit.EnableUndo");
+ view_listener_t::addMenu(new LLEditEnableRedo(), "Edit.EnableRedo");
+ view_listener_t::addMenu(new LLEditEnableCut(), "Edit.EnableCut");
+ view_listener_t::addMenu(new LLEditEnableCopy(), "Edit.EnableCopy");
+ view_listener_t::addMenu(new LLEditEnablePaste(), "Edit.EnablePaste");
+ view_listener_t::addMenu(new LLEditEnableDelete(), "Edit.EnableDelete");
+ view_listener_t::addMenu(new LLEditEnableSelectAll(), "Edit.EnableSelectAll");
+ view_listener_t::addMenu(new LLEditEnableDeselect(), "Edit.EnableDeselect");
+ view_listener_t::addMenu(new LLEditEnableDuplicate(), "Edit.EnableDuplicate");
+
+}
+
void initialize_menus()
{
// A parameterized event handler used as ctrl-8/9/0 zoom controls below.
@@ -7641,7 +7768,8 @@ void initialize_menus()
// Generic enable and visible
// Don't prepend MenuName.Foo because these can be used in any menu.
enable.add("IsGodCustomerService", boost::bind(&is_god_customer_service));
- enable.add("IsGodCustomerService", boost::bind(&is_god_customer_service));
+
+ view_listener_t::addEnable(new LLUploadCostCalculator(), "Upload.CalculateCosts");
// Agent
commit.add("Agent.toggleFlying", boost::bind(&LLAgent::toggleFlying));
@@ -7650,30 +7778,12 @@ void initialize_menus()
// File menu
init_menu_file();
- // Edit menu
- view_listener_t::addMenu(new LLEditUndo(), "Edit.Undo");
- view_listener_t::addMenu(new LLEditRedo(), "Edit.Redo");
- view_listener_t::addMenu(new LLEditCut(), "Edit.Cut");
- view_listener_t::addMenu(new LLEditCopy(), "Edit.Copy");
- view_listener_t::addMenu(new LLEditPaste(), "Edit.Paste");
- view_listener_t::addMenu(new LLEditDelete(), "Edit.Delete");
- view_listener_t::addMenu(new LLEditSelectAll(), "Edit.SelectAll");
- view_listener_t::addMenu(new LLEditDeselect(), "Edit.Deselect");
- view_listener_t::addMenu(new LLEditDuplicate(), "Edit.Duplicate");
- view_listener_t::addMenu(new LLEditTakeOff(), "Edit.TakeOff");
-
- view_listener_t::addMenu(new LLEditEnableUndo(), "Edit.EnableUndo");
- view_listener_t::addMenu(new LLEditEnableRedo(), "Edit.EnableRedo");
- view_listener_t::addMenu(new LLEditEnableCut(), "Edit.EnableCut");
- view_listener_t::addMenu(new LLEditEnableCopy(), "Edit.EnableCopy");
- view_listener_t::addMenu(new LLEditEnablePaste(), "Edit.EnablePaste");
- view_listener_t::addMenu(new LLEditEnableDelete(), "Edit.EnableDelete");
- view_listener_t::addMenu(new LLEditEnableSelectAll(), "Edit.EnableSelectAll");
- view_listener_t::addMenu(new LLEditEnableDeselect(), "Edit.EnableDeselect");
- view_listener_t::addMenu(new LLEditEnableDuplicate(), "Edit.EnableDuplicate");
view_listener_t::addMenu(new LLEditEnableTakeOff(), "Edit.EnableTakeOff");
view_listener_t::addMenu(new LLEditEnableCustomizeAvatar(), "Edit.EnableCustomizeAvatar");
+ view_listener_t::addMenu(new LLEnableEditShape(), "Edit.EnableEditShape");
commit.add("CustomizeAvatar", boost::bind(&handle_customize_avatar));
+ commit.add("EditOutfit", boost::bind(&handle_edit_outfit));
+ commit.add("EditShape", boost::bind(&handle_edit_shape));
// View menu
view_listener_t::addMenu(new LLViewMouselook(), "View.Mouselook");
@@ -7687,7 +7797,6 @@ void initialize_menus()
view_listener_t::addMenu(new LLZoomer(1.2f), "View.ZoomOut");
view_listener_t::addMenu(new LLZoomer(1/1.2f), "View.ZoomIn");
view_listener_t::addMenu(new LLZoomer(DEFAULT_FIELD_OF_VIEW, false), "View.ZoomDefault");
- view_listener_t::addMenu(new LLViewFullscreen(), "View.Fullscreen");
view_listener_t::addMenu(new LLViewDefaultUISize(), "View.DefaultUISize");
view_listener_t::addMenu(new LLViewEnableMouselook(), "View.EnableMouselook");
@@ -7704,6 +7813,7 @@ void initialize_menus()
commit.add("World.Chat", boost::bind(&handle_chat, (void*)NULL));
view_listener_t::addMenu(new LLWorldAlwaysRun(), "World.AlwaysRun");
view_listener_t::addMenu(new LLWorldCreateLandmark(), "World.CreateLandmark");
+ view_listener_t::addMenu(new LLWorldPlaceProfile(), "World.PlaceProfile");
view_listener_t::addMenu(new LLWorldSetHomeLocation(), "World.SetHomeLocation");
view_listener_t::addMenu(new LLWorldTeleportHome(), "World.TeleportHome");
view_listener_t::addMenu(new LLWorldSetAway(), "World.SetAway");
@@ -7721,6 +7831,9 @@ void initialize_menus()
view_listener_t::addMenu(new LLWorldPostProcess(), "World.PostProcess");
view_listener_t::addMenu(new LLWorldDayCycle(), "World.DayCycle");
+ view_listener_t::addMenu(new LLWorldToggleMovementControls(), "World.Toggle.MovementControls");
+ view_listener_t::addMenu(new LLWorldToggleCameraControls(), "World.Toggle.CameraControls");
+
// Tools menu
view_listener_t::addMenu(new LLToolsSelectTool(), "Tools.SelectTool");
view_listener_t::addMenu(new LLToolsSelectOnlyMyObjects(), "Tools.SelectOnlyMyObjects");
@@ -7750,12 +7863,11 @@ void initialize_menus()
view_listener_t::addMenu(new LLToolsEnableUnlink(), "Tools.EnableUnlink");
view_listener_t::addMenu(new LLToolsEnableBuyOrTake(), "Tools.EnableBuyOrTake");
enable.add("Tools.EnableTakeCopy", boost::bind(&enable_object_take_copy));
+ enable.add("Tools.VisibleBuyObject", boost::bind(&tools_visible_buy_object));
+ enable.add("Tools.VisibleTakeObject", boost::bind(&tools_visible_take_object));
view_listener_t::addMenu(new LLToolsEnableSaveToInventory(), "Tools.EnableSaveToInventory");
view_listener_t::addMenu(new LLToolsEnableSaveToObjectInventory(), "Tools.EnableSaveToObjectInventory");
- /*view_listener_t::addMenu(new LLToolsVisibleBuyObject(), "Tools.VisibleBuyObject");
- view_listener_t::addMenu(new LLToolsVisibleTakeObject(), "Tools.VisibleTakeObject");*/
-
// Help menu
// most items use the ShowFloater method
@@ -7950,7 +8062,6 @@ void initialize_menus()
view_listener_t::addMenu(new LLAvatarEnableAddFriend(), "Avatar.EnableAddFriend");
enable.add("Avatar.EnableFreezeEject", boost::bind(&enable_freeze_eject, _2));
- enable.add("Avatar.EnableFreezeEject", boost::bind(&enable_freeze_eject, _2));
// Object pie menu
view_listener_t::addMenu(new LLObjectBuild(), "Object.Build");
@@ -7972,12 +8083,14 @@ void initialize_menus()
commit.add("Object.Open", boost::bind(&handle_object_open));
commit.add("Object.Take", boost::bind(&handle_take));
enable.add("Object.EnableOpen", boost::bind(&enable_object_open));
- enable.add("Object.EnableTouch", boost::bind(&enable_object_touch));
view_listener_t::addMenu(new LLObjectEnableTouch(), "Object.EnableTouch");
view_listener_t::addMenu(new LLObjectEnableSitOrStand(), "Object.EnableSitOrStand");
enable.add("Object.EnableDelete", boost::bind(&enable_object_delete));
enable.add("Object.EnableWear", boost::bind(&object_selected_and_point_valid));
+ enable.add("Object.StandUpVisible", boost::bind(&visible_object_stand_up));
+ enable.add("Object.SitVisible", boost::bind(&visible_object_sit));
+
view_listener_t::addMenu(new LLObjectEnableReturn(), "Object.EnableReturn");
view_listener_t::addMenu(new LLObjectEnableReportAbuse(), "Object.EnableReportAbuse");
@@ -8022,6 +8135,7 @@ void initialize_menus()
view_listener_t::addMenu(new LLFloaterVisible(), "FloaterVisible");
view_listener_t::addMenu(new LLShowSidetrayPanel(), "ShowSidetrayPanel");
+ view_listener_t::addMenu(new LLSidetrayPanelVisible(), "SidetrayPanelVisible");
view_listener_t::addMenu(new LLSomethingSelected(), "SomethingSelected");
view_listener_t::addMenu(new LLSomethingSelectedNoHUD(), "SomethingSelectedNoHUD");
view_listener_t::addMenu(new LLEditableSelected(), "EditableSelected");
diff --git a/indra/newview/llviewermenu.h b/indra/newview/llviewermenu.h
index d3c34f0de4..e0497139a5 100644
--- a/indra/newview/llviewermenu.h
+++ b/indra/newview/llviewermenu.h
@@ -44,6 +44,7 @@ class LLParcelSelection;
class LLObjectSelection;
class LLSelectNode;
+void initialize_edit_menu();
void init_menus();
void cleanup_menus();
@@ -52,6 +53,7 @@ void toggle_debug_menus(void*);
void show_context_menu( S32 x, S32 y, MASK mask );
void show_build_mode_context_menu(S32 x, S32 y, MASK mask);
void show_navbar_context_menu(LLView* ctrl, S32 x, S32 y);
+void show_topinfobar_context_menu(LLView* ctrl, S32 x, S32 y);
BOOL enable_save_into_inventory(void*);
void handle_reset_view();
void handle_cut(void*);
@@ -157,6 +159,7 @@ extern const std::string SAVE_INTO_INVENTORY;
extern LLMenuBarGL* gMenuBarView;
//extern LLView* gMenuBarHolder;
+extern LLMenuGL* gEditMenu;
extern LLMenuGL* gPopupMenuView;
extern LLViewerMenuHolderGL* gMenuHolder;
extern LLMenuBarGL* gLoginMenuBarView;
diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp
index 6bad8843fd..f741e1bc10 100644
--- a/indra/newview/llviewermenufile.cpp
+++ b/indra/newview/llviewermenufile.cpp
@@ -36,9 +36,10 @@
// project includes
#include "llagent.h"
+#include "llagentcamera.h"
#include "llfilepicker.h"
#include "llfloaterreg.h"
-#include "llfloaterbuycurrency.h"
+#include "llbuycurrencyhtml.h"
#include "llfloatersnapshot.h"
#include "llimage.h"
#include "llimagebmp.h"
@@ -140,9 +141,9 @@ std::string build_extensions_string(LLFilePicker::ELoadFilter filter)
**/
const std::string upload_pick(void* data)
{
- if( gAgent.cameraMouselook() )
+ if( gAgentCamera.cameraMouselook() )
{
- gAgent.changeCameraToDefault();
+ gAgentCamera.changeCameraToDefault();
// This doesn't seem necessary. JC
// display();
}
@@ -289,9 +290,9 @@ class LLFileUploadBulk : public view_listener_t
{
bool handleEvent(const LLSD& userdata)
{
- if( gAgent.cameraMouselook() )
+ if( gAgentCamera.cameraMouselook() )
{
- gAgent.changeCameraToDefault();
+ gAgentCamera.changeCameraToDefault();
}
// TODO:
@@ -411,7 +412,6 @@ class LLFileTakeSnapshotToDisk : public view_listener_t
{
gViewerWindow->playSnapshotAnimAndSound();
- LLImageBase::setSizeOverride(TRUE);
LLPointer<LLImageFormatted> formatted;
switch(LLFloaterSnapshot::ESnapshotFormat(gSavedSettings.getS32("SnapshotFormat")))
{
@@ -426,12 +426,12 @@ class LLFileTakeSnapshotToDisk : public view_listener_t
break;
default:
llwarns << "Unknown Local Snapshot format" << llendl;
- LLImageBase::setSizeOverride(FALSE);
return true;
}
+ formatted->enableOverSize() ;
formatted->encode(raw, 0);
- LLImageBase::setSizeOverride(FALSE);
+ formatted->disableOverSize() ;
gViewerWindow->saveImageNumbered(formatted);
}
return true;
@@ -796,84 +796,88 @@ void upload_done_callback(const LLUUID& uuid, void* user_data, S32 result, LLExt
//LLAssetType::EType pref_loc = data->mPreferredLocation;
BOOL is_balance_sufficient = TRUE;
- if(result >= 0)
+ if(data)
{
- LLFolderType::EType dest_loc = (data->mPreferredLocation == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(data->mAssetInfo.mType) : data->mPreferredLocation;
-
- if (LLAssetType::AT_SOUND == data->mAssetInfo.mType ||
- LLAssetType::AT_TEXTURE == data->mAssetInfo.mType ||
- LLAssetType::AT_ANIMATION == data->mAssetInfo.mType)
+ if (result >= 0)
{
- // Charge the user for the upload.
- LLViewerRegion* region = gAgent.getRegion();
-
- if(!(can_afford_transaction(expected_upload_cost)))
- {
- LLFloaterBuyCurrency::buyCurrency(
- llformat(LLTrans::getString("UploadingCosts").c_str(),
- data->mAssetInfo.getName().c_str()),
- expected_upload_cost);
- is_balance_sufficient = FALSE;
- }
- else if(region)
+ LLFolderType::EType dest_loc = (data->mPreferredLocation == LLFolderType::FT_NONE) ? LLFolderType::assetTypeToFolderType(data->mAssetInfo.mType) : data->mPreferredLocation;
+
+ if (LLAssetType::AT_SOUND == data->mAssetInfo.mType ||
+ LLAssetType::AT_TEXTURE == data->mAssetInfo.mType ||
+ LLAssetType::AT_ANIMATION == data->mAssetInfo.mType)
{
- // Charge user for upload
- gStatusBar->debitBalance(expected_upload_cost);
+ // Charge the user for the upload.
+ LLViewerRegion* region = gAgent.getRegion();
- LLMessageSystem* msg = gMessageSystem;
- msg->newMessageFast(_PREHASH_MoneyTransferRequest);
- msg->nextBlockFast(_PREHASH_AgentData);
- msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
- msg->nextBlockFast(_PREHASH_MoneyData);
- msg->addUUIDFast(_PREHASH_SourceID, gAgent.getID());
- msg->addUUIDFast(_PREHASH_DestID, LLUUID::null);
- msg->addU8("Flags", 0);
- // we tell the sim how much we were expecting to pay so it
- // can respond to any discrepancy
- msg->addS32Fast(_PREHASH_Amount, expected_upload_cost);
- msg->addU8Fast(_PREHASH_AggregatePermNextOwner, (U8)LLAggregatePermissions::AP_EMPTY);
- msg->addU8Fast(_PREHASH_AggregatePermInventory, (U8)LLAggregatePermissions::AP_EMPTY);
- msg->addS32Fast(_PREHASH_TransactionType, TRANS_UPLOAD_CHARGE);
- msg->addStringFast(_PREHASH_Description, NULL);
- msg->sendReliable(region->getHost());
+ if(!(can_afford_transaction(expected_upload_cost)))
+ {
+ LLStringUtil::format_map_t args;
+ args["NAME"] = data->mAssetInfo.getName();
+ args["AMOUNT"] = llformat("%d", expected_upload_cost);
+ LLBuyCurrencyHTML::openCurrencyFloater( LLTrans::getString("UploadingCosts", args), expected_upload_cost );
+ is_balance_sufficient = FALSE;
+ }
+ else if(region)
+ {
+ // Charge user for upload
+ gStatusBar->debitBalance(expected_upload_cost);
+
+ LLMessageSystem* msg = gMessageSystem;
+ msg->newMessageFast(_PREHASH_MoneyTransferRequest);
+ msg->nextBlockFast(_PREHASH_AgentData);
+ msg->addUUIDFast(_PREHASH_AgentID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_SessionID, gAgent.getSessionID());
+ msg->nextBlockFast(_PREHASH_MoneyData);
+ msg->addUUIDFast(_PREHASH_SourceID, gAgent.getID());
+ msg->addUUIDFast(_PREHASH_DestID, LLUUID::null);
+ msg->addU8("Flags", 0);
+ // we tell the sim how much we were expecting to pay so it
+ // can respond to any discrepancy
+ msg->addS32Fast(_PREHASH_Amount, expected_upload_cost);
+ msg->addU8Fast(_PREHASH_AggregatePermNextOwner, (U8)LLAggregatePermissions::AP_EMPTY);
+ msg->addU8Fast(_PREHASH_AggregatePermInventory, (U8)LLAggregatePermissions::AP_EMPTY);
+ msg->addS32Fast(_PREHASH_TransactionType, TRANS_UPLOAD_CHARGE);
+ msg->addStringFast(_PREHASH_Description, NULL);
+ msg->sendReliable(region->getHost());
+ }
}
- }
- if(is_balance_sufficient)
- {
- // Actually add the upload to inventory
- llinfos << "Adding " << uuid << " to inventory." << llendl;
- const LLUUID folder_id = gInventory.findCategoryUUIDForType(dest_loc);
- if(folder_id.notNull())
+ if(is_balance_sufficient)
{
- U32 next_owner_perms = data->mNextOwnerPerm;
- if(PERM_NONE == next_owner_perms)
+ // Actually add the upload to inventory
+ llinfos << "Adding " << uuid << " to inventory." << llendl;
+ const LLUUID folder_id = gInventory.findCategoryUUIDForType(dest_loc);
+ if(folder_id.notNull())
{
- next_owner_perms = PERM_MOVE | PERM_TRANSFER;
+ U32 next_owner_perms = data->mNextOwnerPerm;
+ if(PERM_NONE == next_owner_perms)
+ {
+ next_owner_perms = PERM_MOVE | PERM_TRANSFER;
+ }
+ create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
+ folder_id, data->mAssetInfo.mTransactionID, data->mAssetInfo.getName(),
+ data->mAssetInfo.getDescription(), data->mAssetInfo.mType,
+ data->mInventoryType, NOT_WEARABLE, next_owner_perms,
+ LLPointer<LLInventoryCallback>(NULL));
+ }
+ else
+ {
+ llwarns << "Can't find a folder to put it in" << llendl;
}
- create_inventory_item(gAgent.getID(), gAgent.getSessionID(),
- folder_id, data->mAssetInfo.mTransactionID, data->mAssetInfo.getName(),
- data->mAssetInfo.getDescription(), data->mAssetInfo.mType,
- data->mInventoryType, NOT_WEARABLE, next_owner_perms,
- LLPointer<LLInventoryCallback>(NULL));
- }
- else
- {
- llwarns << "Can't find a folder to put it in" << llendl;
}
}
- }
- else // if(result >= 0)
- {
- LLSD args;
- args["FILE"] = LLInventoryType::lookupHumanReadable(data->mInventoryType);
- args["REASON"] = std::string(LLAssetStorage::getErrorString(result));
- LLNotificationsUtil::add("CannotUploadReason", args);
+ else // if(result >= 0)
+ {
+ LLSD args;
+ args["FILE"] = LLInventoryType::lookupHumanReadable(data->mInventoryType);
+ args["REASON"] = std::string(LLAssetStorage::getErrorString(result));
+ LLNotificationsUtil::add("CannotUploadReason", args);
+ }
}
LLUploadDialog::modalUploadFinished();
delete data;
+ data = NULL;
// *NOTE: This is a pretty big hack. What this does is check the
// file picker if there are any more pending uploads. If so,
@@ -996,8 +1000,11 @@ void upload_new_resource(const LLTransactionID &tid, LLAssetType::EType asset_ty
S32 balance = gStatusBar->getBalance();
if (balance < expected_upload_cost)
{
+ LLStringUtil::format_map_t args;
+ args["NAME"] = name;
+ args["AMOUNT"] = llformat("%d", expected_upload_cost);
// insufficient funds, bail on this upload
- LLFloaterBuyCurrency::buyCurrency("Uploading costs", expected_upload_cost);
+ LLBuyCurrencyHTML::openCurrencyFloater( LLTrans::getString("UploadingCosts", args), expected_upload_cost );
return;
}
}
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 143d95d27e..bf4eb6ec33 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -32,14 +32,17 @@
#include "llviewerprecompiledheaders.h"
#include "llviewermessage.h"
+#include "boost/lexical_cast.hpp"
#include "llanimationstates.h"
#include "llaudioengine.h"
#include "llavataractions.h"
#include "lscript_byteformat.h"
#include "lleconomy.h"
+#include "lleventtimer.h"
#include "llfloaterreg.h"
#include "llfollowcamparams.h"
+#include "llinventorydefines.h"
#include "llregionhandle.h"
#include "llsdserialize.h"
#include "llteleportflags.h"
@@ -50,9 +53,9 @@
#include "mean_collision_data.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llcallingcard.h"
-//#include "llfirstuse.h"
-#include "llfloaterbuycurrency.h"
+#include "llbuycurrencyhtml.h"
#include "llfloaterbuyland.h"
#include "llfloaterland.h"
#include "llfloaterregioninfo.h"
@@ -61,13 +64,13 @@
#include "llfloaterpreference.h"
#include "llhudeffecttrail.h"
#include "llhudmanager.h"
+#include "llinventoryfunctions.h"
#include "llinventoryobserver.h"
#include "llinventorypanel.h"
#include "llnearbychat.h"
#include "llnotifications.h"
#include "llnotificationsutil.h"
#include "llpanelgrouplandmoney.h"
-#include "llpanelplaces.h"
#include "llrecentpeople.h"
#include "llscriptfloater.h"
#include "llselectmgr.h"
@@ -104,13 +107,15 @@
#include "llpanelplaceprofile.h"
#include <boost/algorithm/string/split.hpp> //
-
-#if LL_WINDOWS // For Windows specific error handler
-#include "llwindebug.h" // For the invalid message handler
-#endif
+#include <boost/regex.hpp>
#include "llnotificationmanager.h" //
+#if LL_MSVC
+// disable boost::lexical_cast warning
+#pragma warning (disable:4702)
+#endif
+
//
// Constants
//
@@ -192,9 +197,21 @@ bool friendship_offer_callback(const LLSD& notification, const LLSD& response)
msg->nextBlockFast(_PREHASH_FolderData);
msg->addUUIDFast(_PREHASH_FolderID, fid);
msg->sendReliable(LLHost(payload["sender"].asString()));
+
+ LLSD payload = notification["payload"];
+ payload["SUPPRESS_TOAST"] = true;
+ LLNotificationsUtil::add("FriendshipAcceptedByMe",
+ notification["substitutions"], payload);
break;
}
case 1: // Decline
+ {
+ LLSD payload = notification["payload"];
+ payload["SUPPRESS_TOAST"] = true;
+ LLNotificationsUtil::add("FriendshipDeclinedByMe",
+ notification["substitutions"], payload);
+ }
+ // fall-through
case 2: // Send IM - decline and start IM session
{
// decline
@@ -259,7 +276,9 @@ void give_money(const LLUUID& uuid, LLViewerRegion* region, S32 amount, BOOL is_
}
else
{
- LLFloaterBuyCurrency::buyCurrency("Giving", amount);
+ LLStringUtil::format_map_t args;
+ args["AMOUNT"] = llformat("%d", amount);
+ LLBuyCurrencyHTML::openCurrencyFloater( LLTrans::getString("giving", args), amount );
}
}
@@ -673,6 +692,52 @@ bool join_group_response(const LLSD& notification, const LLSD& response)
return false;
}
+
+static void highlight_inventory_items_in_panel(const std::vector<LLUUID>& items, LLInventoryPanel *inventory_panel)
+{
+ if (NULL == inventory_panel) return;
+
+ for (std::vector<LLUUID>::const_iterator item_iter = items.begin();
+ item_iter != items.end();
+ ++item_iter)
+ {
+ const LLUUID& item_id = (*item_iter);
+ if(!highlight_offered_object(item_id))
+ {
+ continue;
+ }
+
+ LLInventoryItem* item = gInventory.getItem(item_id);
+ llassert(item);
+ if (!item) {
+ continue;
+ }
+
+ LL_DEBUGS("Inventory_Move") << "Highlighting inventory item: " << item->getName() << ", " << item_id << LL_ENDL;
+ LLFolderView* fv = inventory_panel->getRootFolder();
+ if (fv)
+ {
+ LLFolderViewItem* fv_item = fv->getItemByID(item_id);
+ if (fv_item)
+ {
+ LLFolderViewItem* fv_folder = fv_item->getParentFolder();
+ if (fv_folder)
+ {
+ // Parent folders can be different in case of 2 consecutive drag and drop
+ // operations when the second one is started before the first one completes.
+ LL_DEBUGS("Inventory_Move") << "Open folder: " << fv_folder->getName() << LL_ENDL;
+ fv_folder->setOpen(TRUE);
+ if (fv_folder->isSelected())
+ {
+ fv->changeSelection(fv_folder, FALSE);
+ }
+ }
+ fv->changeSelection(fv_item, TRUE);
+ }
+ }
+ }
+}
+
static LLNotificationFunctorRegistration jgr_1("JoinGroup", join_group_response);
static LLNotificationFunctorRegistration jgr_2("JoinedTooManyGroupsMember", join_group_response);
static LLNotificationFunctorRegistration jgr_3("JoinGroupCanAfford", join_group_response);
@@ -681,10 +746,25 @@ static LLNotificationFunctorRegistration jgr_3("JoinGroupCanAfford", join_group_
//-----------------------------------------------------------------------------
// Instant Message
//-----------------------------------------------------------------------------
-class LLOpenAgentOffer : public LLInventoryFetchObserver
+class LLOpenAgentOffer : public LLInventoryFetchItemsObserver
{
public:
- LLOpenAgentOffer(const std::string& from_name) : mFromName(from_name) {}
+ LLOpenAgentOffer(const LLUUID& object_id,
+ const std::string& from_name) :
+ LLInventoryFetchItemsObserver(object_id),
+ mFromName(from_name) {}
+ /*virtual*/ void startFetch()
+ {
+ for (uuid_vec_t::const_iterator it = mIDs.begin(); it < mIDs.end(); ++it)
+ {
+ LLViewerInventoryCategory* cat = gInventory.getCategory(*it);
+ if (cat)
+ {
+ mComplete.push_back((*it));
+ }
+ }
+ LLInventoryFetchItemsObserver::startFetch();
+ }
/*virtual*/ void done()
{
open_inventory_offer(mComplete, mFromName);
@@ -695,6 +775,110 @@ private:
std::string mFromName;
};
+/**
+ * Class to observe adding of new items moved from the world to user's inventory to select them in inventory.
+ *
+ * We can't create it each time items are moved because "drop" event is sent separately for each
+ * element even while multi-dragging. We have to have the only instance of the observer. See EXT-4347.
+ */
+class LLViewerInventoryMoveFromWorldObserver : public LLInventoryAddItemByAssetObserver
+{
+public:
+ LLViewerInventoryMoveFromWorldObserver()
+ : LLInventoryAddItemByAssetObserver()
+ , mActivePanel(NULL)
+ {
+
+ }
+
+ void setMoveIntoFolderID(const LLUUID& into_folder_uuid) {mMoveIntoFolderID = into_folder_uuid; }
+
+private:
+ /*virtual */void onAssetAdded(const LLUUID& asset_id)
+ {
+ // Store active Inventory panel.
+ mActivePanel = LLInventoryPanel::getActiveInventoryPanel();
+
+ // Store selected items (without destination folder)
+ mSelectedItems.clear();
+ if (mActivePanel)
+ {
+ mSelectedItems = mActivePanel->getRootFolder()->getSelectionList();
+ }
+ mSelectedItems.erase(mMoveIntoFolderID);
+ }
+
+ /**
+ * Selects added inventory items watched by their Asset UUIDs if selection was not changed since
+ * all items were started to watch (dropped into a folder).
+ */
+ void done()
+ {
+ // if selection is not changed since watch started lets hightlight new items.
+ if (mActivePanel && !isSelectionChanged())
+ {
+ LL_DEBUGS("Inventory_Move") << "Selecting new items..." << LL_ENDL;
+ mActivePanel->clearSelection();
+ highlight_inventory_items_in_panel(mAddedItems, mActivePanel);
+ }
+ }
+
+ /**
+ * Returns true if selected inventory items were changed since moved inventory items were started to watch.
+ */
+ bool isSelectionChanged()
+ {
+ const LLInventoryPanel * const current_active_panel = LLInventoryPanel::getActiveInventoryPanel();
+
+ if (NULL == mActivePanel || current_active_panel != mActivePanel)
+ {
+ return true;
+ }
+
+ // get selected items (without destination folder)
+ selected_items_t selected_items = mActivePanel->getRootFolder()->getSelectionList();
+ selected_items.erase(mMoveIntoFolderID);
+
+ // compare stored & current sets of selected items
+ selected_items_t different_items;
+ std::set_symmetric_difference(mSelectedItems.begin(), mSelectedItems.end(),
+ selected_items.begin(), selected_items.end(), std::inserter(different_items, different_items.begin()));
+
+ LL_DEBUGS("Inventory_Move") << "Selected firstly: " << mSelectedItems.size()
+ << ", now: " << selected_items.size() << ", difference: " << different_items.size() << LL_ENDL;
+
+ return different_items.size() > 0;
+ }
+
+ LLInventoryPanel *mActivePanel;
+ typedef std::set<LLUUID> selected_items_t;
+ selected_items_t mSelectedItems;
+
+ /**
+ * UUID of FolderViewFolder into which watched items are moved.
+ *
+ * Destination FolderViewFolder becomes selected while mouse hovering (when dragged items are dropped).
+ *
+ * If mouse is moved out it set unselected and number of selected items is changed
+ * even if selected items in Inventory stay the same.
+ * So, it is used to update stored selection list.
+ *
+ * @see onAssetAdded()
+ * @see isSelectionChanged()
+ */
+ LLUUID mMoveIntoFolderID;
+};
+
+LLViewerInventoryMoveFromWorldObserver* gInventoryMoveObserver = NULL;
+
+void set_dad_inventory_item(LLInventoryItem* inv_item, const LLUUID& into_folder_uuid)
+{
+ start_new_inventory_observer();
+
+ gInventoryMoveObserver->setMoveIntoFolderID(into_folder_uuid);
+ gInventoryMoveObserver->watchAsset(inv_item->getAssetUUID());
+}
+
//unlike the FetchObserver for AgentOffer, we only make one
//instance of the AddedObserver for TaskOffers
//and it never dies. We do this because we don't know the UUID of
@@ -705,6 +889,33 @@ class LLOpenTaskOffer : public LLInventoryAddedObserver
protected:
/*virtual*/ void done()
{
+ for (uuid_vec_t::iterator it = mAdded.begin(); it != mAdded.end();)
+ {
+ const LLUUID& item_uuid = *it;
+ bool was_moved = false;
+ LLInventoryObject* added_object = gInventory.getObject(item_uuid);
+ if (added_object)
+ {
+ // cast to item to get Asset UUID
+ LLInventoryItem* added_item = dynamic_cast<LLInventoryItem*>(added_object);
+ if (added_item)
+ {
+ const LLUUID& asset_uuid = added_item->getAssetUUID();
+ if (gInventoryMoveObserver->isAssetWatched(asset_uuid))
+ {
+ LL_DEBUGS("Inventory_Move") << "Found asset UUID: " << asset_uuid << LL_ENDL;
+ was_moved = true;
+ }
+ }
+ }
+
+ if (was_moved)
+ {
+ it = mAdded.erase(it);
+ }
+ else ++it;
+ }
+
open_inventory_offer(mAdded, "");
mAdded.clear();
}
@@ -733,13 +944,21 @@ void start_new_inventory_observer()
gNewInventoryObserver = new LLOpenTaskOffer;
gInventory.addObserver(gNewInventoryObserver);
}
+
+ if (!gInventoryMoveObserver) //inventory move from the world observer
+ {
+ // Observer is deleted by gInventory
+ gInventoryMoveObserver = new LLViewerInventoryMoveFromWorldObserver;
+ gInventory.addObserver(gInventoryMoveObserver);
+ }
}
-class LLDiscardAgentOffer : public LLInventoryFetchComboObserver
+class LLDiscardAgentOffer : public LLInventoryFetchItemsObserver
{
LOG_CLASS(LLDiscardAgentOffer);
public:
LLDiscardAgentOffer(const LLUUID& folder_id, const LLUUID& object_id) :
+ LLInventoryFetchItemsObserver(object_id),
mFolderID(folder_id),
mObjectID(object_id) {}
virtual ~LLDiscardAgentOffer() {}
@@ -822,21 +1041,26 @@ bool check_offer_throttle(const std::string& from_name, bool check_only)
{
// Use the name of the last item giver, who is probably the person
// spamming you.
- std::ostringstream message;
- message << LLAppViewer::instance()->getSecondLifeTitle();
+
+ LLStringUtil::format_map_t arg;
+ std::string log_msg;
+ std::ostringstream time ;
+ time<<OFFER_THROTTLE_TIME;
+
+ arg["APP_NAME"] = LLAppViewer::instance()->getSecondLifeTitle();
+ arg["TIME"] = time.str();
+
if (!from_name.empty())
{
- message << ": Items coming in too fast from " << from_name;
+ arg["FROM_NAME"] = from_name;
+ log_msg = LLTrans::getString("ItemsComingInTooFastFrom", arg);
}
else
{
- message << ": Items coming in too fast";
+ log_msg = LLTrans::getString("ItemsComingInTooFast", arg);
}
- message << ", automatic preview disabled for "
- << OFFER_THROTTLE_TIME << " seconds.";
//this is kinda important, so actually put it on screen
- std::string log_msg = message.str();
LLSD args;
args["MESSAGE"] = log_msg;
LLNotificationsUtil::add("SystemMessage", args);
@@ -853,125 +1077,119 @@ bool check_offer_throttle(const std::string& from_name, bool check_only)
}
}
-void open_inventory_offer(const std::vector<LLUUID>& items, const std::string& from_name)
+void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_name)
{
- for (std::vector<LLUUID>::const_iterator item_iter = items.begin();
- item_iter != items.end();
- ++item_iter)
+ for (uuid_vec_t::const_iterator obj_iter = objects.begin();
+ obj_iter != objects.end();
+ ++obj_iter)
{
- const LLUUID& item_id = (*item_iter);
- if(!highlight_offered_item(item_id))
+ const LLUUID& obj_id = (*obj_iter);
+ if(!highlight_offered_object(obj_id))
{
continue;
}
- LLInventoryItem* item = gInventory.getItem(item_id);
+ const LLInventoryObject *obj = gInventory.getObject(obj_id);
+ if (!obj)
+ {
+ llwarns << "Cannot find object [ itemID:" << obj_id << " ] to open." << llendl;
+ continue;
+ }
- ////////////////////////////////////////////////////////////////////////////////
- // Special handling for various types.
- const LLAssetType::EType asset_type = item->getType();
- if (check_offer_throttle(from_name, false)) // If we are throttled, don't display
- {
- LL_DEBUGS("Messaging") << "Highlighting inventory item: " << item->getUUID() << LL_ENDL;
- // If we opened this ourselves, focus it
- const BOOL take_focus = from_name.empty() ? TAKE_FOCUS_YES : TAKE_FOCUS_NO;
- switch(asset_type)
+ const LLAssetType::EType asset_type = obj->getActualType();
+
+ // Either an inventory item or a category.
+ const LLInventoryItem* item = dynamic_cast<const LLInventoryItem*>(obj);
+ if (item)
+ {
+ ////////////////////////////////////////////////////////////////////////////////
+ // Special handling for various types.
+ if (check_offer_throttle(from_name, false)) // If we are throttled, don't display
{
- case LLAssetType::AT_NOTECARD:
- {
- LLFloaterReg::showInstance("preview_notecard", LLSD(item_id), take_focus);
- break;
- }
- case LLAssetType::AT_LANDMARK:
- {
- LLInventoryCategory* parent_folder = gInventory.getCategory(item->getParentUUID());
- if ("inventory_handler" == from_name)
- {
- //we have to filter inventory_handler messages to avoid notification displaying
- LLSideTray::getInstance()->showPanel("panel_places",
- LLSD().with("type", "landmark").with("id", item->getUUID()));
- }
- else if("group_offer" == from_name)
+ LL_DEBUGS("Messaging") << "Highlighting inventory item: " << item->getUUID() << LL_ENDL;
+ // If we opened this ourselves, focus it
+ const BOOL take_focus = from_name.empty() ? TAKE_FOCUS_YES : TAKE_FOCUS_NO;
+ switch(asset_type)
+ {
+ case LLAssetType::AT_NOTECARD:
{
- // do not open inventory when we open group notice attachment because
- // we already opened landmark info panel
- // "group_offer" is passed by LLOpenTaskGroupOffer
-
- continue;
+ LLFloaterReg::showInstance("preview_notecard", LLSD(obj_id), take_focus);
+ break;
}
- else if(from_name.empty())
+ case LLAssetType::AT_LANDMARK:
{
- // we receive a message from LLOpenTaskOffer, it mean that new landmark has been added.
- LLSD args;
- args["LANDMARK_NAME"] = item->getName();
- args["FOLDER_NAME"] = std::string(parent_folder ? parent_folder->getName() : "unknown");
- LLNotificationsUtil::add("LandmarkCreated", args);
- // Created landmark is passed to Places panel to allow its editing. In fact panel should be already displayed.
- // If the panel is closed we don't reopen it until created landmark is loaded.
- //TODO*:: dserduk(7/12/09) remove LLPanelPlaces dependency from here
- LLPanelPlaces *places_panel = dynamic_cast<LLPanelPlaces*>(LLSideTray::getInstance()->getPanel("panel_places"));
- if (places_panel)
+ LLInventoryCategory* parent_folder = gInventory.getCategory(item->getParentUUID());
+ if ("inventory_handler" == from_name)
{
- // Landmark creation handling is moved to LLPanelPlaces::showAddedLandmarkInfo()
- // TODO* LLPanelPlaces dependency is going to be removed. See EXT-4347.
- if("create_landmark" == places_panel->getPlaceInfoType() && !places_panel->getItem())
- {
- //places_panel->setItem(item);
- }
- // we are opening a group notice attachment
- else
- {
- LLSD args;
- args["type"] = "landmark";
- args["id"] = item_id;
- LLSideTray::getInstance()->showPanel("panel_places", args);
- }
+ //we have to filter inventory_handler messages to avoid notification displaying
+ LLSideTray::getInstance()->showPanel("panel_places",
+ LLSD().with("type", "landmark").with("id", item->getUUID()));
+ }
+ else if("group_offer" == from_name)
+ {
+ // "group_offer" is passed by LLOpenTaskGroupOffer
+ // Notification about added landmark will be generated under the "from_name.empty()" called from LLOpenTaskOffer::done().
+ LLSD args;
+ args["type"] = "landmark";
+ args["id"] = obj_id;
+ LLSideTray::getInstance()->showPanel("panel_places", args);
+
+ continue;
+ }
+ else if(from_name.empty())
+ {
+ // we receive a message from LLOpenTaskOffer, it mean that new landmark has been added.
+ LLSD args;
+ args["LANDMARK_NAME"] = item->getName();
+ args["FOLDER_NAME"] = std::string(parent_folder ? parent_folder->getName() : "unknown");
+ LLNotificationsUtil::add("LandmarkCreated", args);
}
}
+ break;
+ case LLAssetType::AT_TEXTURE:
+ {
+ LLFloaterReg::showInstance("preview_texture", LLSD(obj_id), take_focus);
+ break;
+ }
+ case LLAssetType::AT_ANIMATION:
+ LLFloaterReg::showInstance("preview_anim", LLSD(obj_id), take_focus);
+ break;
+ case LLAssetType::AT_SCRIPT:
+ LLFloaterReg::showInstance("preview_script", LLSD(obj_id), take_focus);
+ break;
+ case LLAssetType::AT_SOUND:
+ LLFloaterReg::showInstance("preview_sound", LLSD(obj_id), take_focus);
+ break;
+ default:
+ break;
}
- break;
- case LLAssetType::AT_TEXTURE:
- {
- LLFloaterReg::showInstance("preview_texture", LLSD(item_id), take_focus);
- break;
- }
- case LLAssetType::AT_ANIMATION:
- LLFloaterReg::showInstance("preview_anim", LLSD(item_id), take_focus);
- break;
- case LLAssetType::AT_SCRIPT:
- LLFloaterReg::showInstance("preview_script", LLSD(item_id), take_focus);
- break;
- case LLAssetType::AT_SOUND:
- LLFloaterReg::showInstance("preview_sound", LLSD(item_id), take_focus);
- break;
- default:
- break;
}
}
-
+
////////////////////////////////////////////////////////////////////////////////
// Highlight item if it's not in the trash, lost+found, or COF
- const BOOL auto_open = gSavedSettings.getBOOL("ShowInInventory") &&
+ const BOOL auto_open =
+ gSavedSettings.getBOOL("ShowInInventory") &&
(asset_type != LLAssetType::AT_CALLINGCARD) &&
- (item->getInventoryType() != LLInventoryType::IT_ATTACHMENT) &&
+ !(item && item->getInventoryType() != LLInventoryType::IT_ATTACHMENT) &&
!from_name.empty();
LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(auto_open);
if(active_panel)
{
- LL_DEBUGS("Messaging") << "Highlighting" << item_id << LL_ENDL;
+ LL_DEBUGS("Messaging") << "Highlighting" << obj_id << LL_ENDL;
LLFocusableElement* focus_ctrl = gFocusMgr.getKeyboardFocus();
- active_panel->setSelection(item_id, TAKE_FOCUS_NO);
+ active_panel->setSelection(obj_id, TAKE_FOCUS_NO);
gFocusMgr.setKeyboardFocus(focus_ctrl);
}
}
}
-bool highlight_offered_item(const LLUUID& item_id)
+bool highlight_offered_object(const LLUUID& obj_id)
{
- LLInventoryItem* item = gInventory.getItem(item_id);
- if(!item)
+ const LLInventoryObject* obj = gInventory.getObject(obj_id);
+ if(!obj)
{
- LL_WARNS("Messaging") << "Unable to show inventory item: " << item_id << LL_ENDL;
+ LL_WARNS("Messaging") << "Unable to show inventory item: " << obj_id << LL_ENDL;
return false;
}
@@ -980,7 +1198,7 @@ bool highlight_offered_item(const LLUUID& item_id)
// notification (e.g. trash, cof, lost-and-found).
if(!gAgent.getAFK())
{
- const LLViewerInventoryCategory *parent = gInventory.getFirstNondefaultParent(item_id);
+ const LLViewerInventoryCategory *parent = gInventory.getFirstNondefaultParent(obj_id);
if (parent)
{
const LLFolderType::EType parent_type = parent->getPreferredType();
@@ -1033,7 +1251,6 @@ void inventory_offer_mute_callback(const LLUUID& blocked_id,
bool matches(const LLNotificationPtr notification) const
{
if(notification->getName() == "ObjectGiveItem"
- || notification->getName() == "ObjectGiveItemUnknownUser"
|| notification->getName() == "UserGiveItem")
{
return (notification->getPayload()["from_id"].asUUID() == blocked_id);
@@ -1048,6 +1265,16 @@ void inventory_offer_mute_callback(const LLUUID& blocked_id,
gSavedSettings.getString("NotificationChannelUUID")), OfferMatcher(blocked_id));
}
+LLOfferInfo::LLOfferInfo()
+ : LLNotificationResponderInterface()
+ , mFromGroup(FALSE)
+ , mFromObject(FALSE)
+ , mIM(IM_NOTHING_SPECIAL)
+ , mType(LLAssetType::AT_NONE)
+ , mPersist(false)
+{
+}
+
LLOfferInfo::LLOfferInfo(const LLSD& sd)
{
mIM = (EInstantMessage)sd["im_type"].asInteger();
@@ -1061,6 +1288,23 @@ LLOfferInfo::LLOfferInfo(const LLSD& sd)
mFromName = sd["from_name"].asString();
mDesc = sd["description"].asString();
mHost = LLHost(sd["sender"].asString());
+ mPersist = sd["persist"].asBoolean();
+}
+
+LLOfferInfo::LLOfferInfo(const LLOfferInfo& info)
+{
+ mIM = info.mIM;
+ mFromID = info.mFromID;
+ mFromGroup = info.mFromGroup;
+ mFromObject = info.mFromObject;
+ mTransactionID = info.mTransactionID;
+ mFolderID = info.mFolderID;
+ mObjectID = info.mObjectID;
+ mType = info.mType;
+ mFromName = info.mFromName;
+ mDesc = info.mDesc;
+ mHost = info.mHost;
+ mPersist = info.mPersist;
}
LLSD LLOfferInfo::asLLSD()
@@ -1077,9 +1321,15 @@ LLSD LLOfferInfo::asLLSD()
sd["from_name"] = mFromName;
sd["description"] = mDesc;
sd["sender"] = mHost.getIPandPort();
+ sd["persist"] = mPersist;
return sd;
}
+void LLOfferInfo::fromLLSD(const LLSD& params)
+{
+ *this = params;
+}
+
void LLOfferInfo::send_auto_receive_response(void)
{
LLMessageSystem* msg = gMessageSystem;
@@ -1119,6 +1369,21 @@ void LLOfferInfo::send_auto_receive_response(void)
}
}
+void LLOfferInfo::handleRespond(const LLSD& notification, const LLSD& response)
+{
+ initRespondFunctionMap();
+
+ const std::string name = notification["name"].asString();
+ if(mRespondFunctions.find(name) == mRespondFunctions.end())
+ {
+ llwarns << "Unexpected notification name : " << name << llendl;
+ llassert(!"Unexpected notification name");
+ return;
+ }
+
+ mRespondFunctions[name](notification, response);
+}
+
bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD& response)
{
LLChat chat;
@@ -1165,11 +1430,9 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
// This is an offer from an agent. In this case, the back
// end has already copied the items into your inventory,
// so we can fetch it out of our inventory.
- LLInventoryFetchObserver::item_ref_t items;
- items.push_back(mObjectID);
- LLOpenAgentOffer* open_agent_offer = new LLOpenAgentOffer(from_string);
- open_agent_offer->fetchItems(items);
- if(catp || (itemp && itemp->isComplete()))
+ LLOpenAgentOffer* open_agent_offer = new LLOpenAgentOffer(mObjectID, from_string);
+ open_agent_offer->startFetch();
+ if(catp || (itemp && itemp->isFinished()))
{
open_agent_offer->done();
}
@@ -1226,13 +1489,9 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
// Disabled logging to old chat floater to fix crash in group notices - EXT-4149
// LLFloaterChat::addChatHistory(chat);
- LLInventoryFetchComboObserver::folder_ref_t folders;
- LLInventoryFetchComboObserver::item_ref_t items;
- items.push_back(mObjectID);
- LLDiscardAgentOffer* discard_agent_offer;
- discard_agent_offer = new LLDiscardAgentOffer(mFolderID, mObjectID);
- discard_agent_offer->fetch(folders, items);
- if(catp || (itemp && itemp->isComplete()))
+ LLDiscardAgentOffer* discard_agent_offer = new LLDiscardAgentOffer(mFolderID, mObjectID);
+ discard_agent_offer->startFetch();
+ if (catp || (itemp && itemp->isFinished()))
{
discard_agent_offer->done();
}
@@ -1261,11 +1520,10 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
gInventory.addObserver(opener);
}
- // Remove script dialog because there is no need in it no more.
- LLUUID object_id = notification["payload"]["object_id"].asUUID();
- LLScriptFloaterManager::instance().removeNotificationByObjectId(object_id);
-
- delete this;
+ if(!mPersist)
+ {
+ delete this;
+ }
return false;
}
@@ -1304,13 +1562,6 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const
msg->addUUIDFast(_PREHASH_RegionID, LLUUID::null);
msg->addVector3Fast(_PREHASH_Position, gAgent.getPositionAgent());
LLInventoryObserver* opener = NULL;
- LLViewerInventoryCategory* catp = NULL;
- catp = (LLViewerInventoryCategory*)gInventory.getCategory(mObjectID);
- LLViewerInventoryItem* itemp = NULL;
- if(!catp)
- {
- itemp = (LLViewerInventoryItem*)gInventory.getItem(mObjectID);
- }
std::string from_string; // Used in the pop-up.
std::string chatHistory_string; // Used in chat history.
@@ -1438,14 +1689,34 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const
gInventory.addObserver(opener);
}
- // Remove script dialog because there is no need in it no more.
- LLUUID object_id = notification["payload"]["object_id"].asUUID();
- LLScriptFloaterManager::instance().removeNotificationByObjectId(object_id);
-
- delete this;
+ if(!mPersist)
+ {
+ delete this;
+ }
return false;
}
+class LLPostponedOfferNotification: public LLPostponedNotification
+{
+protected:
+ /* virtual */
+ void modifyNotificationParams()
+ {
+ LLSD substitutions = mParams.substitutions;
+ substitutions["NAME"] = mName;
+ mParams.substitutions = substitutions;
+ }
+};
+
+void LLOfferInfo::initRespondFunctionMap()
+{
+ if(mRespondFunctions.empty())
+ {
+ mRespondFunctions["ObjectGiveItem"] = boost::bind(&LLOfferInfo::inventory_task_offer_callback, this, _1, _2);
+ mRespondFunctions["UserGiveItem"] = boost::bind(&LLOfferInfo::inventory_offer_callback, this, _1, _2);
+ }
+}
+
void inventory_offer_handler(LLOfferInfo* info)
{
//Until throttling is implmented, busy mode should reject inventory instead of silently
@@ -1497,7 +1768,9 @@ void inventory_offer_handler(LLOfferInfo* info)
std::string typestr = ll_safe_string(LLAssetType::lookupHumanReadable(info->mType));
if (!typestr.empty())
{
- args["OBJECTTYPE"] = typestr;
+ // human readable matches string name from strings.xml
+ // lets get asset type localized name
+ args["OBJECTTYPE"] = LLTrans::getString(typestr);
}
else
{
@@ -1510,30 +1783,6 @@ void inventory_offer_handler(LLOfferInfo* info)
return;
}
- // Name cache callbacks don't store userdata, so can't save
- // off the LLOfferInfo. Argh.
- BOOL name_found = FALSE;
- if (info->mFromGroup)
- {
- std::string group_name;
- if (gCacheName->getGroupName(info->mFromID, group_name))
- {
- args["FIRST"] = group_name;
- args["LAST"] = "";
- name_found = TRUE;
- }
- }
- else
- {
- std::string first_name, last_name;
- if (gCacheName->getName(info->mFromID, first_name, last_name))
- {
- args["FIRST"] = first_name;
- args["LAST"] = last_name;
- name_found = TRUE;
- }
- }
-
// If mObjectID is null then generate the object_id based on msg to prevent
// multiple creation of chiclets for same object.
LLUUID object_id = info->mObjectID;
@@ -1548,9 +1797,9 @@ void inventory_offer_handler(LLOfferInfo* info)
payload["give_inventory_notification"] = FALSE;
args["OBJECTFROMNAME"] = info->mFromName;
args["NAME"] = info->mFromName;
- args["NAME_SLURL"] = LLSLURL::buildCommand("agent", info->mFromID, "about");
+ args["NAME_SLURL"] = LLSLURL("agent", info->mFromID, "about").getSLURLString();
std::string verb = "select?name=" + LLURI::escape(msg);
- args["ITEM_SLURL"] = LLSLURL::buildCommand("inventory", info->mObjectID, verb.c_str());
+ args["ITEM_SLURL"] = LLSLURL("inventory", info->mObjectID, verb.c_str()).getSLURLString();
LLNotification::Params p("ObjectGiveItem");
@@ -1560,23 +1809,27 @@ void inventory_offer_handler(LLOfferInfo* info)
// Inventory Slurls don't currently work for non agent transfers, so only display the object name.
args["ITEM_SLURL"] = msg;
// Note: sets inventory_task_offer_callback as the callback
- p.substitutions(args).payload(payload).functor.function(boost::bind(&LLOfferInfo::inventory_task_offer_callback, info, _1, _2));
- p.name = name_found ? "ObjectGiveItem" : "ObjectGiveItemUnknownUser";
+ p.substitutions(args).payload(payload).functor.responder(LLNotificationResponderPtr(info));
+ info->mPersist = true;
+ p.name = "ObjectGiveItem";
// Pop up inv offer chiclet and let the user accept (keep), or reject (and silently delete) the inventory.
- LLNotifications::instance().add(p);
+ LLPostponedNotification::add<LLPostponedOfferNotification>(p, info->mFromID, info->mFromGroup == TRUE);
}
else // Agent -> Agent Inventory Offer
{
+ p.responder = info;
// Note: sets inventory_offer_callback as the callback
- p.substitutions(args).payload(payload).functor.function(boost::bind(&LLOfferInfo::inventory_offer_callback, info, _1, _2));
+ // *TODO fix memory leak
+ // inventory_offer_callback() is not invoked if user received notification and
+ // closes viewer(without responding the notification)
+ p.substitutions(args).payload(payload).functor.responder(LLNotificationResponderPtr(info));
+ info->mPersist = true;
p.name = "UserGiveItem";
// Prefetch the item into your local inventory.
- LLInventoryFetchObserver::item_ref_t items;
- items.push_back(info->mObjectID);
- LLInventoryFetchObserver* fetch_item = new LLInventoryFetchObserver();
- fetch_item->fetchItems(items);
- if(fetch_item->isEverythingComplete())
+ LLInventoryFetchItemsObserver* fetch_item = new LLInventoryFetchItemsObserver(info->mObjectID);
+ fetch_item->startFetch();
+ if(fetch_item->isFinished())
{
fetch_item->done();
}
@@ -1591,8 +1844,8 @@ void inventory_offer_handler(LLOfferInfo* info)
// Inform user that there is a script floater via toast system
{
payload["give_inventory_notification"] = TRUE;
- LLNotificationPtr notification = LLNotifications::instance().add(p.payload(payload));
- LLScriptFloaterManager::getInstance()->setNotificationToastId(object_id, notification->getID());
+ p.payload = payload;
+ LLPostponedNotification::add<LLPostponedOfferNotification>(p, info->mFromID, false);
}
}
}
@@ -1657,6 +1910,88 @@ bool inspect_remote_object_callback(const LLSD& notification, const LLSD& respon
}
static LLNotificationFunctorRegistration inspect_remote_object_callback_reg("ServerObjectMessage", inspect_remote_object_callback);
+class LLPostponedServerObjectNotification: public LLPostponedNotification
+{
+protected:
+ /* virtual */
+ void modifyNotificationParams()
+ {
+ LLSD payload = mParams.payload;
+ payload["SESSION_NAME"] = mName;
+ mParams.payload = payload;
+ }
+};
+
+static bool parse_lure_bucket(const std::string& bucket,
+ U64& region_handle,
+ LLVector3& pos,
+ LLVector3& look_at,
+ U8& region_access)
+{
+ // tokenize the bucket
+ typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
+ boost::char_separator<char> sep("|", "", boost::keep_empty_tokens);
+ tokenizer tokens(bucket, sep);
+ tokenizer::iterator iter = tokens.begin();
+
+ S32 gx,gy,rx,ry,rz,lx,ly,lz;
+ try
+ {
+ gx = boost::lexical_cast<S32>((*(iter)).c_str());
+ gy = boost::lexical_cast<S32>((*(++iter)).c_str());
+ rx = boost::lexical_cast<S32>((*(++iter)).c_str());
+ ry = boost::lexical_cast<S32>((*(++iter)).c_str());
+ rz = boost::lexical_cast<S32>((*(++iter)).c_str());
+ lx = boost::lexical_cast<S32>((*(++iter)).c_str());
+ ly = boost::lexical_cast<S32>((*(++iter)).c_str());
+ lz = boost::lexical_cast<S32>((*(++iter)).c_str());
+ }
+ catch( boost::bad_lexical_cast& )
+ {
+ LL_WARNS("parse_lure_bucket")
+ << "Couldn't parse lure bucket."
+ << LL_ENDL;
+ return false;
+ }
+ // Grab region access
+ region_access = SIM_ACCESS_MIN;
+ if (++iter != tokens.end())
+ {
+ std::string access_str((*iter).c_str());
+ LLStringUtil::trim(access_str);
+ if ( access_str == "A" )
+ {
+ region_access = SIM_ACCESS_ADULT;
+ }
+ else if ( access_str == "M" )
+ {
+ region_access = SIM_ACCESS_MATURE;
+ }
+ else if ( access_str == "PG" )
+ {
+ region_access = SIM_ACCESS_PG;
+ }
+ }
+
+ pos.setVec((F32)rx, (F32)ry, (F32)rz);
+ look_at.setVec((F32)lx, (F32)ly, (F32)lz);
+
+ region_handle = to_region_handle(gx, gy);
+ return true;
+}
+
+class LLPostponedIMSystemTipNotification: public LLPostponedNotification
+{
+protected:
+ /* virtual */
+ void modifyNotificationParams()
+ {
+ LLSD payload = mParams.payload;
+ payload["SESSION_NAME"] = mName;
+ mParams.payload = payload;
+ }
+};
+
void process_improved_im(LLMessageSystem *msg, void **user_data)
{
if (gNoRender)
@@ -1726,17 +2061,20 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
std::string separator_string(": ");
LLSD args;
+ LLSD payload;
+ LLNotification::Params params;
+
switch(dialog)
{
case IM_CONSOLE_AND_CHAT_HISTORY:
- // These are used for system messages, hence don't need the name,
- // as it is always "Second Life".
- // *TODO: Translate
args["MESSAGE"] = message;
+ args["NAME"] = name;
+ payload["from_id"] = from_id;
- // Note: don't put the message in the IM history, even though was sent
- // via the IM mechanism.
- LLNotificationsUtil::add("SystemMessageTip",args);
+ params.name = "IMSystemMessageTip";
+ params.substitutions = args;
+ params.payload = payload;
+ LLPostponedNotification::add<LLPostponedIMSystemTipNotification>(params, from_id, false);
break;
case IM_NOTHING_SPECIAL:
@@ -1758,7 +2096,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
// initiated by the other party) then...
std::string my_name;
LLAgentUI::buildFullname(my_name);
- std::string response = gSavedPerAccountSettings.getString("BusyModeResponse2");
+ std::string response = gSavedPerAccountSettings.getString("BusyModeResponse");
pack_instant_message(
gMessageSystem,
gAgent.getID(),
@@ -1849,6 +2187,11 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
}
else
{
+ /*
+ EXT-5099
+ currently there is no way to store in history only...
+ using LLNotificationsUtil::add will add message to Nearby Chat
+
// muted user, so don't start an IM session, just record line in chat
// history. Pretend the chat is from a local agent,
// so it will go into the history but not be shown on screen.
@@ -1856,6 +2199,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
LLSD args;
args["MESSAGE"] = buffer;
LLNotificationsUtil::add("SystemMessageTip", args);
+ */
}
}
break;
@@ -1953,7 +2297,6 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
// For requested notices, we don't want to send the popups.
if (dialog != IM_GROUP_NOTICE_REQUESTED)
{
- LLSD payload;
payload["subject"] = subj;
payload["message"] = mes;
payload["sender_name"] = name;
@@ -2016,7 +2359,8 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
LLSD args;
args["MESSAGE"] = message;
- LLNotificationsUtil::add("JoinGroup", args, payload, join_group_response);
+ // we shouldn't pass callback functor since it is registered in LLFunctorRegistration
+ LLNotificationsUtil::add("JoinGroup", args, payload);
}
}
break;
@@ -2077,10 +2421,8 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
if (is_muted)
{
// Prefetch the offered item so that it can be discarded by the appropriate observer. (EXT-4331)
- LLInventoryFetchObserver::item_ref_t items;
- items.push_back(info->mObjectID);
- LLInventoryFetchObserver* fetch_item = new LLInventoryFetchObserver();
- fetch_item->fetchItems(items);
+ LLInventoryFetchItemsObserver* fetch_item = new LLInventoryFetchItemsObserver(info->mObjectID);
+ fetch_item->startFetch();
delete fetch_item;
// Same as closing window
@@ -2186,10 +2528,13 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
chat.mFromID = from_id ^ gAgent.getSessionID();
}
+ chat.mSourceType = CHAT_SOURCE_OBJECT;
+
if(SYSTEM_FROM == name)
{
// System's UUID is NULL (fixes EXT-4766)
- chat.mFromID = from_id = LLUUID::null;
+ chat.mFromID = LLUUID::null;
+ chat.mSourceType = CHAT_SOURCE_SYSTEM;
}
LLSD query_string;
@@ -2201,22 +2546,19 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
query_string["groupowned"] = "true";
}
- std::ostringstream link;
- link << "secondlife:///app/objectim/" << session_id << LLURI::mapToQueryString(query_string);
-
- chat.mURL = link.str();
+ chat.mURL = LLSLURL("objectim", session_id, "").getSLURLString();
chat.mText = message;
- chat.mSourceType = CHAT_SOURCE_OBJECT;
// Note: lie to Nearby Chat, pretending that this is NOT an IM, because
// IMs from obejcts don't open IM sessions.
LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
- if(nearby_chat)
+ if(SYSTEM_FROM != name && nearby_chat)
{
+ chat.mOwnerID = from_id;
LLSD args;
- args["owner_id"] = from_id;
args["slurl"] = location;
- nearby_chat->addMessage(chat, true, args);
+ args["type"] = LLNotificationsUI::NT_NEARBYCHAT;
+ LLNotificationsUI::LLNotificationManager::instance().onChat(chat, args);
}
@@ -2234,13 +2576,16 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
payload["slurl"] = location;
payload["name"] = name;
std::string session_name;
- gCacheName->getFullName(from_id, session_name);
- payload["SESSION_NAME"] = session_name;
if (from_group)
{
payload["group_owned"] = "true";
}
- LLNotificationsUtil::add("ServerObjectMessage", substitutions, payload);
+
+ LLNotification::Params params("ServerObjectMessage");
+ params.substitutions = substitutions;
+ params.payload = payload;
+
+ LLPostponedNotification::add<LLPostponedServerObjectNotification>(params, from_id, false);
}
break;
case IM_FROM_TASK_AS_ALERT:
@@ -2281,15 +2626,34 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
}
else
{
+ LLVector3 pos, look_at;
+ U64 region_handle;
+ U8 region_access;
+ std::string region_info = ll_safe_string((char*)binary_bucket, binary_bucket_size);
+ std::string region_access_str = LLStringUtil::null;
+ std::string region_access_icn = LLStringUtil::null;
+
+ if (parse_lure_bucket(region_info, region_handle, pos, look_at, region_access))
+ {
+ region_access_str = LLViewerRegion::accessToString(region_access);
+ region_access_icn = LLViewerRegion::getAccessIcon(region_access);
+ }
+
LLSD args;
// *TODO: Translate -> [FIRST] [LAST] (maybe)
- args["NAME"] = name;
+ args["NAME_SLURL"] = LLSLURL("agent", from_id, "about").getSLURLString();
args["MESSAGE"] = message;
+ args["MATURITY_STR"] = region_access_str;
+ args["MATURITY_ICON"] = region_access_icn;
LLSD payload;
payload["from_id"] = from_id;
payload["lure_id"] = session_id;
payload["godlike"] = FALSE;
- LLNotificationsUtil::add("TeleportOffered", args, payload);
+
+ LLNotification::Params params("TeleportOffered");
+ params.substitutions = args;
+ params.payload = payload;
+ LLPostponedNotification::add<LLPostponedOfferNotification>( params, from_id, false);
}
}
break;
@@ -2349,7 +2713,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
}
else
{
- args["[NAME]"] = name;
+ args["NAME_SLURL"] = LLSLURL("agent", from_id, "about").getSLURLString();
if(message.empty())
{
//support for frienship offers from clients before July 2008
@@ -2358,7 +2722,10 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
else
{
args["[MESSAGE]"] = message;
- LLNotificationsUtil::add("OfferFriendship", args, payload);
+ LLNotification::Params params("OfferFriendship");
+ params.substitutions = args;
+ params.payload = payload;
+ LLPostponedNotification::add<LLPostponedOfferNotification>( params, from_id, false);
}
}
}
@@ -2402,7 +2769,7 @@ void busy_message (LLMessageSystem* msg, LLUUID from_id)
{
std::string my_name;
LLAgentUI::buildFullname(my_name);
- std::string response = gSavedPerAccountSettings.getString("BusyModeResponse2");
+ std::string response = gSavedPerAccountSettings.getString("BusyModeResponse");
pack_instant_message(
gMessageSystem,
gAgent.getID(),
@@ -2718,7 +3085,7 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
// object inspect for an object that is chatting with you
LLSD args;
args["type"] = LLNotificationsUI::NT_NEARBYCHAT;
- args["owner_id"] = owner_id;
+ chat.mOwnerID = owner_id;
LLNotificationsUI::LLNotificationManager::instance().onChat(chat, args);
}
@@ -2799,7 +3166,9 @@ void process_teleport_progress(LLMessageSystem* msg, void**)
class LLFetchInWelcomeArea : public LLInventoryFetchDescendentsObserver
{
public:
- LLFetchInWelcomeArea() {}
+ LLFetchInWelcomeArea(const uuid_vec_t &ids) :
+ LLInventoryFetchDescendentsObserver(ids)
+ {}
virtual void done()
{
LLIsType is_landmark(LLAssetType::AT_LANDMARK);
@@ -2810,8 +3179,8 @@ public:
LLInventoryModel::cat_array_t land_cats;
LLInventoryModel::item_array_t land_items;
- folder_ref_t::iterator it = mCompleteFolders.begin();
- folder_ref_t::iterator end = mCompleteFolders.end();
+ uuid_vec_t::iterator it = mComplete.begin();
+ uuid_vec_t::iterator end = mComplete.end();
for(; it != end; ++it)
{
gInventory.collectDescendentsIf(
@@ -2872,7 +3241,7 @@ BOOL LLPostTeleportNotifiers::tick()
if ( gAgent.getTeleportState() == LLAgent::TELEPORT_NONE )
{
// get callingcards and landmarks available to the user arriving.
- LLInventoryFetchDescendentsObserver::folder_ref_t folders;
+ uuid_vec_t folders;
const LLUUID callingcard_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CALLINGCARD);
if(callingcard_id.notNull())
folders.push_back(callingcard_id);
@@ -2881,9 +3250,9 @@ BOOL LLPostTeleportNotifiers::tick()
folders.push_back(folder_id);
if(!folders.empty())
{
- LLFetchInWelcomeArea* fetcher = new LLFetchInWelcomeArea;
- fetcher->fetchDescendents(folders);
- if(fetcher->isEverythingComplete())
+ LLFetchInWelcomeArea* fetcher = new LLFetchInWelcomeArea(folders);
+ fetcher->startFetch();
+ if(fetcher->isFinished())
{
fetcher->done();
}
@@ -2912,6 +3281,9 @@ void process_teleport_finish(LLMessageSystem* msg, void**)
LL_WARNS("Messaging") << "Got teleport notification for wrong agent!" << LL_ENDL;
return;
}
+
+ // Teleport is finished; it can't be cancelled now.
+ gViewerWindow->setProgressCancelButtonVisible(FALSE);
// Do teleport effect for where you're leaving
// VEFFECT: TeleportStart
@@ -2957,18 +3329,18 @@ void process_teleport_finish(LLMessageSystem* msg, void**)
/*
// send camera update to new region
- gAgent.updateCamera();
+ gAgentCamera.updateCamera();
// likewise make sure the camera is behind the avatar
- gAgent.resetView(TRUE);
+ gAgentCamera.resetView(TRUE);
LLVector3 shift_vector = regionp->getPosRegionFromGlobal(gAgent.getRegion()->getOriginGlobal());
gAgent.setRegion(regionp);
gObjectList.shiftObjects(shift_vector);
- if (gAgent.getAvatarObject())
+ if (isAgentAvatarValid())
{
- gAgent.getAvatarObject()->clearChatText();
- gAgent.slamLookAt(look_at);
+ gAgentAvatarp->clearChatText();
+ gAgentCamera.slamLookAt(look_at);
}
gAgent.setPositionAgent(pos);
gAssetStorage->setUpstream(sim);
@@ -3047,8 +3419,7 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
std::string version_channel;
msg->getString("SimData", "ChannelVersion", version_channel);
- LLVOAvatar* avatarp = gAgent.getAvatarObject();
- if (!avatarp)
+ if (!isAgentAvatarValid())
{
// Could happen if you were immediately god-teleported away on login,
// maybe other cases. Continue, but warn.
@@ -3069,7 +3440,7 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
<< x << ":" << y
<< " current pos " << gAgent.getPositionGlobal()
<< LL_ENDL;
- LLAppViewer::instance()->forceDisconnect("You were sent to an invalid region.");
+ LLAppViewer::instance()->forceDisconnect(LLTrans::getString("SentToInvalidRegion"));
return;
}
@@ -3092,9 +3463,9 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
if( is_teleport )
{
// Force the camera back onto the agent, don't animate.
- gAgent.setFocusOnAvatar(TRUE, FALSE);
- gAgent.slamLookAt(look_at);
- gAgent.updateCamera();
+ gAgentCamera.setFocusOnAvatar(TRUE, FALSE);
+ gAgentCamera.slamLookAt(look_at);
+ gAgentCamera.updateCamera();
gAgent.setTeleportState( LLAgent::TELEPORT_START_ARRIVAL );
@@ -3102,18 +3473,24 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
// know what you look like.
gAgent.sendAgentSetAppearance();
- if (avatarp)
+ if (isAgentAvatarValid())
{
// Chat the "back" SLURL. (DEV-4907)
+ LLSLURL slurl;
+ gAgent.getTeleportSourceSLURL(slurl);
+ LLSD substitution = LLSD().with("[T_SLURL]", slurl.getSLURLString());
+ std::string completed_from = LLAgent::sTeleportProgressMessages["completed_from"];
+ LLStringUtil::format(completed_from, substitution);
+
LLSD args;
- args["MESSAGE"] = "Teleport completed from " + gAgent.getTeleportSourceSLURL();
+ args["MESSAGE"] = completed_from;
LLNotificationsUtil::add("SystemMessageTip", args);
// Set the new position
- avatarp->setPositionAgent(agent_pos);
- avatarp->clearChat();
- avatarp->slamPosition();
+ gAgentAvatarp->setPositionAgent(agent_pos);
+ gAgentAvatarp->clearChat();
+ gAgentAvatarp->slamPosition();
}
}
else
@@ -3139,7 +3516,7 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
global_agent_pos[1] += y;
look_at = (LLVector3)beacon_pos - global_agent_pos;
look_at.normVec();
- gAgent.slamLookAt(look_at);
+ gAgentCamera.slamLookAt(look_at);
}
}
@@ -3173,9 +3550,9 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
gAgent.clearBusy();
}
- if (avatarp)
+ if (isAgentAvatarValid())
{
- avatarp->mFootPlane.clearVec();
+ gAgentAvatarp->mFootPlane.clearVec();
}
// send walk-vs-run status
@@ -3316,7 +3693,7 @@ void send_agent_update(BOOL force_send, BOOL send_reliable)
LLQuaternion body_rotation = gAgent.getFrameAgent().getQuaternion();
LLQuaternion head_rotation = gAgent.getHeadRotation();
- camera_pos_agent = gAgent.getCameraPositionAgent();
+ camera_pos_agent = gAgentCamera.getCameraPositionAgent();
render_state = gAgent.getRenderState();
@@ -3439,7 +3816,7 @@ void send_agent_update(BOOL force_send, BOOL send_reliable)
msg->addVector3Fast(_PREHASH_CameraAtAxis, LLViewerCamera::getInstance()->getAtAxis());
msg->addVector3Fast(_PREHASH_CameraLeftAxis, LLViewerCamera::getInstance()->getLeftAxis());
msg->addVector3Fast(_PREHASH_CameraUpAxis, LLViewerCamera::getInstance()->getUpAxis());
- msg->addF32Fast(_PREHASH_Far, gAgent.mDrawDistance);
+ msg->addF32Fast(_PREHASH_Far, gAgentCamera.mDrawDistance);
msg->addU32Fast(_PREHASH_ControlFlags, control_flags);
@@ -4076,7 +4453,7 @@ void process_avatar_appearance(LLMessageSystem *mesgsys, void **user_data)
mesgsys->getUUIDFast(_PREHASH_Sender, _PREHASH_ID, uuid);
LLVOAvatar* avatarp = (LLVOAvatar *)gObjectList.findObject(uuid);
- if( avatarp )
+ if (avatarp)
{
avatarp->processAvatarAppearance( mesgsys );
}
@@ -4091,7 +4468,7 @@ void process_camera_constraint(LLMessageSystem *mesgsys, void **user_data)
LLVector4 cameraCollidePlane;
mesgsys->getVector4Fast(_PREHASH_CameraCollidePlane, _PREHASH_Plane, cameraCollidePlane);
- gAgent.setCameraCollidePlane(cameraCollidePlane);
+ gAgentCamera.setCameraCollidePlane(cameraCollidePlane);
}
void near_sit_object(BOOL success, void *data)
@@ -4124,20 +4501,21 @@ void process_avatar_sit_response(LLMessageSystem *mesgsys, void **user_data)
BOOL force_mouselook;
mesgsys->getBOOLFast(_PREHASH_SitTransform, _PREHASH_ForceMouselook, force_mouselook);
- LLVOAvatar* avatar = gAgent.getAvatarObject();
-
- if (avatar && dist_vec_squared(camera_eye, camera_at) > 0.0001f)
+ if (isAgentAvatarValid() && dist_vec_squared(camera_eye, camera_at) > 0.0001f)
{
- gAgent.setSitCamera(sitObjectID, camera_eye, camera_at);
+ gAgentCamera.setSitCamera(sitObjectID, camera_eye, camera_at);
}
- gAgent.setForceMouselook(force_mouselook);
+ gAgentCamera.setForceMouselook(force_mouselook);
+ // Forcing turning off flying here to prevent flying after pressing "Stand"
+ // to stand up from an object. See EXT-1655.
+ gAgent.setFlying(FALSE);
LLViewerObject* object = gObjectList.findObject(sitObjectID);
if (object)
{
LLVector3 sit_spot = object->getPositionAgent() + (sitPosition * object->getRotation());
- if (!use_autopilot || (avatar && avatar->isSitting() && avatar->getRoot() == object->getRoot()))
+ if (!use_autopilot || isAgentAvatarValid() && gAgentAvatarp->isSitting() && gAgentAvatarp->getRoot() == object->getRoot())
{
//we're already sitting on this object, so don't autopilot
}
@@ -4445,27 +4823,103 @@ void process_money_balance_reply( LLMessageSystem* msg, void** )
// have missed something during an event.
// *TODO: Translate
LLSD args;
- args["MESSAGE"] = desc;
+
// this is a marker to retrieve avatar name from server message:
// "<avatar name> paid you L$"
const std::string marker = "paid you L$";
+ args["MESSAGE"] = desc;
+
// extract avatar name from system message
- std::string name = desc.substr(0, desc.find(marker, 0));
+ S32 marker_pos = desc.find(marker, 0);
+
+ std::string base_name = desc.substr(0, marker_pos);
+
+ std::string name = base_name;
LLStringUtil::trim(name);
// if name extracted and name cache contains avatar id send loggable notification
LLUUID from_id;
if(name.size() > 0 && gCacheName->getUUID(name, from_id))
{
+ //description always comes not localized. lets fix this
+
+ //ammount paid
+ std::string ammount = desc.substr(marker_pos + marker.length(),desc.length() - marker.length() - marker_pos);
+
+ //reform description
+ LLStringUtil::format_map_t str_args;
+ str_args["NAME"] = base_name;
+ str_args["AMOUNT"] = ammount;
+ std::string new_description = LLTrans::getString("paid_you_ldollars", str_args);
+
+
+ args["MESSAGE"] = new_description;
args["NAME"] = name;
LLSD payload;
payload["from_id"] = from_id;
LLNotificationsUtil::add("PaymentRecived", args, payload);
}
+ //AD *HACK: Parsing incoming string to localize messages that come from server! EXT-5986
+ // It's only a temporarily and ineffective measure. It doesn't affect performance much
+ // because we get here only for specific type of messages, but anyway it is not right to do it!
+ // *TODO: Server-side changes should be made and this code removed.
else
{
+ if(desc.find("You paid")==0)
+ {
+ // Regular expression for message parsing- change it in case of server-side changes.
+ // Each set of parenthesis will later be used to find arguments of message we generate
+ // in the end of this if- (.*) gives us name of money receiver, (\\d+)-amount of money we pay
+ // and ([^$]*)- reason of payment
+ boost::regex expr("You paid (?:.{0}|(.*) )L\\$(\\d+)\\s?([^$]*)\\.");
+ boost::match_results <std::string::const_iterator> matches;
+ if(boost::regex_match(desc, matches, expr))
+ {
+ // Name of full localizable notification string
+ // there are four types of this string- with name of receiver and reason of payment,
+ // without name and without reason (both may also be absent simultaneously).
+ // example of string without name - You paid L$100 to create a group.
+ // example of string without reason - You paid Smdby Linden L$100.
+ // example of string with reason and name - You paid Smbdy Linden L$100 for a land access pass.
+ // example of string with no info - You paid L$50.
+ std::string line = "you_paid_ldollars_no_name";
+
+ // arguments of string which will be in notification
+ LLStringUtil::format_map_t str_args;
+
+ // extracting amount of money paid (without L$ symbols). It is always present.
+ str_args["[AMOUNT]"] = std::string(matches[2]);
+
+ // extracting name of person/group you are paying (it may be absent)
+ std::string name = std::string(matches[1]);
+ if(!name.empty())
+ {
+ str_args["[NAME]"] = name;
+ line = "you_paid_ldollars";
+ }
+
+ // extracting reason of payment (it may be absent)
+ std::string reason = std::string(matches[3]);
+ if (reason.empty())
+ {
+ line = name.empty() ? "you_paid_ldollars_no_info" : "you_paid_ldollars_no_reason";
+ }
+ else
+ {
+ std::string localized_reason;
+ // if we haven't found localized string for reason of payment leave it as it was
+ str_args["[REASON]"] = LLTrans::findString(localized_reason, reason) ? localized_reason : reason;
+ }
+
+ // forming final message string by retrieving localized version from xml
+ // and applying previously found arguments
+ line = LLTrans::getString(line, str_args);
+ args["MESSAGE"] = line;
+ }
+ }
+
LLNotificationsUtil::add("SystemMessage", args);
}
@@ -4494,6 +4948,10 @@ bool handle_special_notification_callback(const LLSD& notification, const LLSD&
gSavedSettings.setU32("PreferredMaturity", preferredMaturity);
gAgent.sendMaturityPreferenceToServer(preferredMaturity);
+ // notify user that the maturity preference has been changed
+ LLSD args;
+ args["RATING"] = LLViewerRegion::accessToString(preferredMaturity);
+ LLNotificationsUtil::add("PreferredMaturityChanged", args);
}
return false;
@@ -5102,14 +5560,14 @@ void process_derez_container(LLMessageSystem *msg, void**)
}
void container_inventory_arrived(LLViewerObject* object,
- InventoryObjectList* inventory,
+ LLInventoryObject::object_list_t* inventory,
S32 serial_num,
void* data)
{
LL_DEBUGS("Messaging") << "container_inventory_arrived()" << LL_ENDL;
- if( gAgent.cameraMouselook() )
+ if( gAgentCamera.cameraMouselook() )
{
- gAgent.changeCameraToDefault();
+ gAgentCamera.changeCameraToDefault();
}
LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel();
@@ -5122,8 +5580,8 @@ void container_inventory_arrived(LLViewerObject* object,
LLFolderType::FT_NONE,
LLTrans::getString("AcquiredItems"));
- InventoryObjectList::const_iterator it = inventory->begin();
- InventoryObjectList::const_iterator end = inventory->end();
+ LLInventoryObject::object_list_t::const_iterator it = inventory->begin();
+ LLInventoryObject::object_list_t::const_iterator end = inventory->end();
for ( ; it != end; ++it)
{
if ((*it)->getType() != LLAssetType::AT_CATEGORY)
@@ -5159,7 +5617,7 @@ void container_inventory_arrived(LLViewerObject* object,
{
// we're going to get one fake root category as well as the
// one actual object
- InventoryObjectList::iterator it = inventory->begin();
+ LLInventoryObject::object_list_t::iterator it = inventory->begin();
if ((*it)->getType() == LLAssetType::AT_CATEGORY)
{
@@ -5334,13 +5792,13 @@ void process_teleport_local(LLMessageSystem *msg,void**)
}
gAgent.setPositionAgent(pos);
- gAgent.slamLookAt(look_at);
+ gAgentCamera.slamLookAt(look_at);
// likewise make sure the camera is behind the avatar
- gAgent.resetView(TRUE, TRUE);
+ gAgentCamera.resetView(TRUE, TRUE);
// send camera update to new region
- gAgent.updateCamera();
+ gAgentCamera.updateCamera();
send_agent_update(TRUE, TRUE);
@@ -5422,7 +5880,9 @@ void send_group_notice(const LLUUID& group_id,
bool handle_lure_callback(const LLSD& notification, const LLSD& response)
{
std::string text = response["message"].asString();
- text.append("\r\n").append(LLAgentUI::buildSLURL());
+ LLSLURL slurl;
+ LLAgentUI::buildSLURL(slurl);
+ text.append("\r\n").append(slurl.getSLURLString());
S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
if(0 == option)
@@ -5452,6 +5912,8 @@ bool handle_lure_callback(const LLSD& notification, const LLSD& response)
args["TO_NAME"] = target_name;
LLSD payload;
+
+ //*TODO please rewrite all keys to the same case, lower or upper
payload["from_id"] = target_id;
payload["SESSION_NAME"] = target_name;
payload["SUPPRESS_TOAST"] = true;
@@ -5472,8 +5934,12 @@ void handle_lure(const LLUUID& invitee)
}
// Prompt for a message to the invited user.
-void handle_lure(const std::vector<LLUUID>& ids)
+void handle_lure(const uuid_vec_t& ids)
{
+ if (ids.empty()) return;
+
+ if (!gAgent.getRegion()) return;
+
LLSD edit_args;
edit_args["REGION"] = gAgent.getRegion()->getName();
@@ -5859,7 +6325,7 @@ void process_covenant_reply(LLMessageSystem* msg, void**)
LLFloaterBuyLand::updateEstateName(estate_name);
std::string owner_name =
- LLSLURL::buildCommand("agent", estate_owner_id, "inspect");
+ LLSLURL("agent", estate_owner_id, "inspect").getSLURLString();
LLPanelEstateCovenant::updateEstateOwnerName(owner_name);
LLPanelLandCovenant::updateEstateOwnerName(owner_name);
LLFloaterBuyLand::updateEstateOwnerName(owner_name);
@@ -6039,3 +6505,4 @@ void LLOfferInfo::forceResponse(InventoryOfferResponse response)
params.functor.function(boost::bind(&LLOfferInfo::inventory_offer_callback, this, _1, _2));
LLNotifications::instance().forceResponse(params, response);
}
+
diff --git a/indra/newview/llviewermessage.h b/indra/newview/llviewermessage.h
index 7dd629dcfd..eca253ee03 100644
--- a/indra/newview/llviewermessage.h
+++ b/indra/newview/llviewermessage.h
@@ -40,6 +40,7 @@
#include "lluuid.h"
#include "message.h"
#include "stdenums.h"
+#include "llnotifications.h"
//
// Forward declarations
@@ -129,7 +130,7 @@ void process_frozen_message(LLMessageSystem* msg, void**);
void process_derez_container(LLMessageSystem *msg, void**);
void container_inventory_arrived(LLViewerObject* object,
- std::list<LLPointer<LLInventoryObject> >* inventory, //InventoryObjectList
+ std::list<LLPointer<LLInventoryObject> >* inventory, //LLInventoryObject::object_list_t
S32 serial_num,
void* data);
@@ -157,7 +158,7 @@ void send_group_notice(const LLUUID& group_id,
const LLInventoryItem* item);
void handle_lure(const LLUUID& invitee);
-void handle_lure(const std::vector<LLUUID>& ids);
+void handle_lure(const uuid_vec_t& ids);
// always from gAgent and
// routes through the gAgent's current simulator
@@ -201,20 +202,23 @@ void invalid_message_callback(LLMessageSystem*, void*, EMessageException);
void process_initiate_download(LLMessageSystem* msg, void**);
void start_new_inventory_observer();
-void open_inventory_offer(const std::vector<LLUUID>& items, const std::string& from_name);
+void open_inventory_offer(const uuid_vec_t& items, const std::string& from_name);
// Returns true if item is not in certain "quiet" folder which don't need UI
// notification (e.g. trash, cof, lost-and-found) and agent is not AFK, false otherwise.
// Returns false if item is not found.
-bool highlight_offered_item(const LLUUID& item_id);
+bool highlight_offered_object(const LLUUID& obj_id);
-struct LLOfferInfo
+void set_dad_inventory_item(LLInventoryItem* inv_item, const LLUUID& into_folder_uuid);
+
+class LLOfferInfo : public LLNotificationResponderInterface
{
- LLOfferInfo()
- : mFromGroup(FALSE), mFromObject(FALSE),
- mIM(IM_NOTHING_SPECIAL), mType(LLAssetType::AT_NONE) {};
+public:
+ LLOfferInfo();
LLOfferInfo(const LLSD& sd);
+ LLOfferInfo(const LLOfferInfo& info);
+
void forceResponse(InventoryOfferResponse response);
EInstantMessage mIM;
@@ -228,12 +232,27 @@ struct LLOfferInfo
std::string mFromName;
std::string mDesc;
LLHost mHost;
+ bool mPersist;
+
+ // LLNotificationResponderInterface implementation
+ /*virtual*/ LLSD asLLSD();
+ /*virtual*/ void fromLLSD(const LLSD& params);
+ /*virtual*/ void handleRespond(const LLSD& notification, const LLSD& response);
- LLSD asLLSD();
void send_auto_receive_response(void);
+
+ // TODO - replace all references with handleRespond()
bool inventory_offer_callback(const LLSD& notification, const LLSD& response);
bool inventory_task_offer_callback(const LLSD& notification, const LLSD& response);
+private:
+
+ void initRespondFunctionMap();
+
+ typedef boost::function<bool (const LLSD&, const LLSD&)> respond_function_t;
+ typedef std::map<std::string, respond_function_t> respond_function_map_t;
+
+ respond_function_map_t mRespondFunctions;
};
void process_feature_disabled_message(LLMessageSystem* msg, void**);
diff --git a/indra/newview/llviewernetwork.cpp b/indra/newview/llviewernetwork.cpp
index 987d23630a..fec112b9e7 100644
--- a/indra/newview/llviewernetwork.cpp
+++ b/indra/newview/llviewernetwork.cpp
@@ -5,7 +5,7 @@
*
* $LicenseInfo:firstyear=2006&license=viewergpl$
*
- * Copyright (c) 2006-2009, Linden Research, Inc.
+ * Copyright (c) 2006-2010, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
@@ -13,13 +13,12 @@
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * online at http://secondlife.com/developers/opensource/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * online at http://secondlife.com/developers/opensource/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
@@ -34,303 +33,542 @@
#include "llviewerprecompiledheaders.h"
#include "llviewernetwork.h"
+#include "llviewercontrol.h"
+#include "llsdserialize.h"
+#include "llsecapi.h"
+#include "llweb.h"
-#include "llevents.h"
-#include "net.h"
+
+const char* DEFAULT_LOGIN_PAGE = "http://secondlife.com/app/login/";
-#include "llviewercontrol.h"
-#include "lllogin.h"
+const char* SYSTEM_GRID_SLURL_BASE = "secondlife://%s/secondlife/";
+const char* MAIN_GRID_SLURL_BASE = "http://maps.secondlife.com/secondlife/";
+const char* SYSTEM_GRID_APP_SLURL_BASE = "secondlife:///app";
-struct LLGridData
-{
- const char* mLabel;
- const char* mName;
- const char* mLoginURI;
- const char* mHelperURI;
-};
+const char* DEFAULT_SLURL_BASE = "https://%s/region/";
+const char* DEFAULT_APP_SLURL_BASE = "x-grid-location-info://%s/app";
-static LLGridData gGridInfo[GRID_INFO_COUNT] =
+LLGridManager::LLGridManager()
{
- { "None", "", "", ""},
- { "Aditi",
- "util.aditi.lindenlab.com",
- "https://login.aditi.lindenlab.com/cgi-bin/login.cgi",
- "http://aditi-secondlife.webdev.lindenlab.com/helpers/" },
- { "Agni",
- "util.agni.lindenlab.com",
- "https://login.agni.lindenlab.com/cgi-bin/login.cgi",
- "https://secondlife.com/helpers/" },
- { "Aruna",
- "util.aruna.lindenlab.com",
- "https://login.aruna.lindenlab.com/cgi-bin/login.cgi",
- "http://aruna-secondlife.webdev.lindenlab.com/helpers/" },
- { "Bharati",
- "util.bharati.lindenlab.com",
- "https://login.bharati.lindenlab.com/cgi-bin/login.cgi",
- "http://bharati-secondlife.webdev.lindenlab.com/helpers/" },
- { "Chandra",
- "util.chandra.lindenlab.com",
- "https://login.chandra.lindenlab.com/cgi-bin/login.cgi",
- "http://chandra-secondlife.webdev.lindenlab.com/helpers/" },
- { "Damballah",
- "util.damballah.lindenlab.com",
- "https://login.damballah.lindenlab.com/cgi-bin/login.cgi",
- "http://damballah-secondlife.webdev.lindenlab.com/helpers/" },
- { "Danu",
- "util.danu.lindenlab.com",
- "https://login.danu.lindenlab.com/cgi-bin/login.cgi",
- "http://danu-secondlife.webdev.lindenlab.com/helpers/" },
- { "Durga",
- "util.durga.lindenlab.com",
- "https://login.durga.lindenlab.com/cgi-bin/login.cgi",
- "http://durga-secondlife.webdev.lindenlab.com/helpers/" },
- { "Ganga",
- "util.ganga.lindenlab.com",
- "https://login.ganga.lindenlab.com/cgi-bin/login.cgi",
- "http://ganga-secondlife.webdev.lindenlab.com/helpers/" },
- { "Mitra",
- "util.mitra.lindenlab.com",
- "https://login.mitra.lindenlab.com/cgi-bin/login.cgi",
- "http://mitra-secondlife.webdev.lindenlab.com/helpers/" },
- { "Mohini",
- "util.mohini.lindenlab.com",
- "https://login.mohini.lindenlab.com/cgi-bin/login.cgi",
- "http://mohini-secondlife.webdev.lindenlab.com/helpers/" },
- { "Nandi",
- "util.nandi.lindenlab.com",
- "https://login.nandi.lindenlab.com/cgi-bin/login.cgi",
- "http://nandi-secondlife.webdev.lindenlab.com/helpers/" },
- { "Parvati",
- "util.parvati.lindenlab.com",
- "https://login.parvati.lindenlab.com/cgi-bin/login.cgi",
- "http://parvati-secondlife.webdev.lindenlab.com/helpers/" },
- { "Radha",
- "util.radha.lindenlab.com",
- "https://login.radha.lindenlab.com/cgi-bin/login.cgi",
- "http://radha-secondlife.webdev.lindenlab.com/helpers/" },
- { "Ravi",
- "util.ravi.lindenlab.com",
- "https://login.ravi.lindenlab.com/cgi-bin/login.cgi",
- "http://ravi-secondlife.webdev.lindenlab.com/helpers/" },
- { "Siva",
- "util.siva.lindenlab.com",
- "https://login.siva.lindenlab.com/cgi-bin/login.cgi",
- "http://siva-secondlife.webdev.lindenlab.com/helpers/" },
- { "Shakti",
- "util.shakti.lindenlab.com",
- "https://login.shakti.lindenlab.com/cgi-bin/login.cgi",
- "http://shakti-secondlife.webdev.lindenlab.com/helpers/" },
- { "Skanda",
- "util.skanda.lindenlab.com",
- "https://login.skanda.lindenlab.com/cgi-bin/login.cgi",
- "http://skanda-secondlife.webdev.lindenlab.com/helpers/" },
- { "Soma",
- "util.soma.lindenlab.com",
- "https://login.soma.lindenlab.com/cgi-bin/login.cgi",
- "http://soma-secondlife.webdev.lindenlab.com/helpers/" },
- { "Uma",
- "util.uma.lindenlab.com",
- "https://login.uma.lindenlab.com/cgi-bin/login.cgi",
- "http://uma-secondlife.webdev.lindenlab.com/helpers/" },
- { "Vaak",
- "util.vaak.lindenlab.com",
- "https://login.vaak.lindenlab.com/cgi-bin/login.cgi",
- "http://vaak-secondlife.webdev.lindenlab.com/helpers/" },
- { "Yami",
- "util.yami.lindenlab.com",
- "https://login.yami.lindenlab.com/cgi-bin/login.cgi",
- "http://yami-secondlife.webdev.lindenlab.com/helpers/" },
- { "Local",
- "localhost",
- "https://login.dmz.lindenlab.com/cgi-bin/login.cgi",
- "" },
- { "Other",
- "",
- "https://login.dmz.lindenlab.com/cgi-bin/login.cgi",
- "" }
-};
-
-const EGridInfo DEFAULT_GRID_CHOICE = GRID_INFO_AGNI;
-
-
-unsigned char gMACAddress[MAC_ADDRESS_BYTES]; /* Flawfinder: ignore */
-
-LLViewerLogin::LLViewerLogin() :
- mGridChoice(DEFAULT_GRID_CHOICE)
+ // by default, we use the 'grids.xml' file in the user settings directory
+ // this file is an LLSD file containing multiple grid definitions.
+ // This file does not contain definitions for secondlife.com grids,
+ // as that would be a security issue when they are overwritten by
+ // an attacker. Don't want someone snagging a password.
+ std::string grid_file = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS,
+ "grids.xml");
+ initialize(grid_file);
+
+}
+
+
+LLGridManager::LLGridManager(const std::string& grid_file)
{
+ // initialize with an explicity grid file for testing.
+ initialize(grid_file);
}
- LLViewerLogin::~LLViewerLogin()
- {
- }
+//
+// LLGridManager - class for managing the list of known grids, and the current
+// selection
+//
+
+
+//
+// LLGridManager::initialze - initialize the list of known grids based
+// on the fixed list of linden grids (fixed for security reasons)
+// the grids.xml file
+// and the command line.
+void LLGridManager::initialize(const std::string& grid_file)
+{
+ // default grid list.
+ // Don't move to a modifiable file for security reasons,
+ mGrid.clear() ;
+ // set to undefined
+ mGridList = LLSD();
+ mGridFile = grid_file;
+ // as we don't want an attacker to override our grid list
+ // to point the default grid to an invalid grid
+ addSystemGrid("None", "", "", "", DEFAULT_LOGIN_PAGE);
+
-void LLViewerLogin::setGridChoice(EGridInfo grid)
-{
- if(grid < 0 || grid >= GRID_INFO_COUNT)
- {
- llerrs << "Invalid grid index specified." << llendl;
- return;
- }
- if(mGridChoice != grid || gSavedSettings.getS32("ServerChoice") != grid)
+ addSystemGrid("Agni",
+ MAINGRID,
+ "https://login.agni.lindenlab.com/cgi-bin/login.cgi",
+ "https://secondlife.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Aditi",
+ "util.aditi.lindenlab.com",
+ "https://login.aditi.lindenlab.com/cgi-bin/login.cgi",
+ "http://aditi-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Aruna",
+ "util.aruna.lindenlab.com",
+ "https://login.aruna.lindenlab.com/cgi-bin/login.cgi",
+ "http://aruna-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Bharati",
+ "util.bharati.lindenlab.com",
+ "https://login.bharati.lindenlab.com/cgi-bin/login.cgi",
+ "http://bharati-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Chandra",
+ "util.chandra.lindenlab.com",
+ "https://login.chandra.lindenlab.com/cgi-bin/login.cgi",
+ "http://chandra-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Damballah",
+ "util.damballah.lindenlab.com",
+ "https://login.damballah.lindenlab.com/cgi-bin/login.cgi",
+ "http://damballah-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Danu",
+ "util.danu.lindenlab.com",
+ "https://login.danu.lindenlab.com/cgi-bin/login.cgi",
+ "http://danu-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Durga",
+ "util.durga.lindenlab.com",
+ "https://login.durga.lindenlab.com/cgi-bin/login.cgi",
+ "http://durga-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Ganga",
+ "util.ganga.lindenlab.com",
+ "https://login.ganga.lindenlab.com/cgi-bin/login.cgi",
+ "http://ganga-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Mitra",
+ "util.mitra.lindenlab.com",
+ "https://login.mitra.lindenlab.com/cgi-bin/login.cgi",
+ "http://mitra-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Mohini",
+ "util.mohini.lindenlab.com",
+ "https://login.mohini.lindenlab.com/cgi-bin/login.cgi",
+ "http://mohini-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Nandi",
+ "util.nandi.lindenlab.com",
+ "https://login.nandi.lindenlab.com/cgi-bin/login.cgi",
+ "http://nandi-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Parvati",
+ "util.parvati.lindenlab.com",
+ "https://login.parvati.lindenlab.com/cgi-bin/login.cgi",
+ "http://parvati-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Radha",
+ "util.radha.lindenlab.com",
+ "https://login.radha.lindenlab.com/cgi-bin/login.cgi",
+ "http://radha-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Ravi",
+ "util.ravi.lindenlab.com",
+ "https://login.ravi.lindenlab.com/cgi-bin/login.cgi",
+ "http://ravi-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Siva",
+ "util.siva.lindenlab.com",
+ "https://login.siva.lindenlab.com/cgi-bin/login.cgi",
+ "http://siva-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Shakti",
+ "util.shakti.lindenlab.com",
+ "https://login.shakti.lindenlab.com/cgi-bin/login.cgi",
+ "http://shakti-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Soma",
+ "util.soma.lindenlab.com",
+ "https://login.soma.lindenlab.com/cgi-bin/login.cgi",
+ "http://soma-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Uma",
+ "util.uma.lindenlab.com",
+ "https://login.uma.lindenlab.com/cgi-bin/login.cgi",
+ "http://uma-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Vaak",
+ "util.vaak.lindenlab.com",
+ "https://login.vaak.lindenlab.com/cgi-bin/login.cgi",
+ "http://vaak-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Yami",
+ "util.yami.lindenlab.com",
+ "https://login.yami.lindenlab.com/cgi-bin/login.cgi",
+ "http://yami-secondlife.webdev.lindenlab.com/helpers/",
+ DEFAULT_LOGIN_PAGE);
+ addSystemGrid("Local (Linden)",
+ "localhost",
+ "https://login.dmz.lindenlab.com/cgi-bin/login.cgi",
+ "",
+ DEFAULT_LOGIN_PAGE);
+
+
+ LLSD other_grids;
+ llifstream llsd_xml;
+ if (!grid_file.empty())
{
- mGridChoice = grid;
- if(GRID_INFO_LOCAL == mGridChoice)
- {
- mGridName = LOOPBACK_ADDRESS_STRING;
- }
- else if(GRID_INFO_OTHER == mGridChoice)
+ llsd_xml.open( grid_file.c_str(), std::ios::in | std::ios::binary );
+
+ // parse through the gridfile, inserting grids into the list unless
+ // they overwrite a linden grid.
+ if( llsd_xml.is_open())
{
- // *FIX:Mani - could this possibly be valid?
- mGridName = "other";
- }
- else
+ LLSDSerialize::fromXMLDocument( other_grids, llsd_xml );
+ if(other_grids.isMap())
+ {
+ for(LLSD::map_iterator grid_itr = other_grids.beginMap();
+ grid_itr != other_grids.endMap();
+ ++grid_itr)
+ {
+ LLSD::String key_name = grid_itr->first;
+ LLSD grid = grid_itr->second;
+ // TODO: Make sure gridfile specified label is not
+ // a system grid label
+ LL_DEBUGS("GridManager") << "reading: " << key_name << LL_ENDL;
+ if (mGridList.has(key_name) &&
+ mGridList[key_name].has(GRID_IS_SYSTEM_GRID_VALUE))
+ {
+ LL_DEBUGS("GridManager") << "Cannot override grid " << key_name << " as it's a system grid" << LL_ENDL;
+ // If the system grid does exist in the grids file, and it's marked as a favorite, set it as a favorite.
+ if(grid_itr->second.has(GRID_IS_FAVORITE_VALUE) && grid_itr->second[GRID_IS_FAVORITE_VALUE].asBoolean() )
+ {
+ mGridList[key_name][GRID_IS_FAVORITE_VALUE] = TRUE;
+ }
+ }
+ else
+ {
+ try
+ {
+ addGrid(grid);
+ LL_DEBUGS("GridManager") << "Added grid: " << key_name << LL_ENDL;
+ }
+ catch (...)
+ {
+ }
+ }
+ }
+ llsd_xml.close();
+ }
+ }
+ }
+
+ // load a grid from the command line.
+ // if the actual grid name is specified from the command line,
+ // set it as the 'selected' grid.
+ std::string cmd_line_grid = gSavedSettings.getString("CmdLineGridChoice");
+ if(!cmd_line_grid.empty())
+ {
+ // try to find the grid assuming the command line parameter is
+ // the case-insensitive 'label' of the grid. ie 'Agni'
+ mGrid = getGridByLabel(cmd_line_grid);
+ if(mGrid.empty())
{
- mGridName = gGridInfo[mGridChoice].mLabel;
+ // if we couldn't find it, assume the
+ // requested grid is the actual grid 'name' or index,
+ // which would be the dns name of the grid (for non
+ // linden hosted grids)
+ // If the grid isn't there, that's ok, as it will be
+ // automatically added later.
+ mGrid = cmd_line_grid;
}
+
+ }
+ else
+ {
+ // if a grid was not passed in via the command line, grab it from the CurrentGrid setting.
+ // if there's no current grid, that's ok as it'll be either set by the value passed
+ // in via the login uri if that's specified, or will default to maingrid
+ mGrid = gSavedSettings.getString("CurrentGrid");
+ }
+
+ if(mGrid.empty())
+ {
+ // no grid was specified so default to maingrid
+ LL_DEBUGS("GridManager") << "Setting grid to MAINGRID as no grid has been specified " << LL_ENDL;
+ mGrid = MAINGRID;
+
+ }
+
+ // generate a 'grid list' entry for any command line parameter overrides
+ // or setting overides that we'll add to the grid list or override
+ // any grid list entries with.
+ LLSD grid = LLSD::emptyMap();
+
+ if(mGridList.has(mGrid))
+ {
+ grid = mGridList[mGrid];
+ }
+ else
+ {
+ grid[GRID_VALUE] = mGrid;
+ // add the grid with the additional values, or update the
+ // existing grid if it exists with the given values
+ addGrid(grid);
+ }
- gSavedSettings.setS32("ServerChoice", mGridChoice);
- gSavedSettings.setString("CustomServer", "");
+ LL_DEBUGS("GridManager") << "Selected grid is " << mGrid << LL_ENDL;
+ setGridChoice(mGrid);
+ if(mGridList[mGrid][GRID_LOGIN_URI_VALUE].isArray())
+ {
+ llinfos << "is array" << llendl;
}
}
-void LLViewerLogin::setGridChoice(const std::string& grid_name)
+LLGridManager::~LLGridManager()
{
- // Set the grid choice based on a string.
- // The string can be:
- // - a grid label from the gGridInfo table
- // - an ip address
- if(!grid_name.empty())
- {
- // find the grid choice from the user setting.
- int grid_index = GRID_INFO_NONE;
- for(;grid_index < GRID_INFO_OTHER; ++grid_index)
- {
- if(0 == LLStringUtil::compareInsensitive(gGridInfo[grid_index].mLabel, grid_name))
- {
- // Founding a matching label in the list...
- setGridChoice((EGridInfo)grid_index);
- break;
- }
- }
-
- if(GRID_INFO_OTHER == grid_index)
- {
- // *FIX:MEP Can and should we validate that this is an IP address?
- mGridChoice = GRID_INFO_OTHER;
- mGridName = grid_name;
- gSavedSettings.setS32("ServerChoice", mGridChoice);
- gSavedSettings.setString("CustomServer", mGridName);
- }
- }
+ saveFavorites();
}
-void LLViewerLogin::resetURIs()
+void LLGridManager::getGridInfo(const std::string &grid, LLSD& grid_info)
{
- // Clear URIs when picking a new server
- gSavedSettings.setLLSD("CmdLineLoginURI", LLSD::emptyArray());
- gSavedSettings.setString("CmdLineHelperURI", "");
+
+ grid_info = mGridList[grid];
+
+ // override any grid data with the command line info.
+
+ LLSD cmd_line_login_uri = gSavedSettings.getLLSD("CmdLineLoginURI");
+ if (cmd_line_login_uri.isString())
+ {
+ grid_info[GRID_LOGIN_URI_VALUE] = LLSD::emptyArray();
+ grid_info[GRID_LOGIN_URI_VALUE].append(cmd_line_login_uri);
+ }
+
+ // override the helper uri if it was passed in
+ std::string cmd_line_helper_uri = gSavedSettings.getString("CmdLineHelperURI");
+ if(!cmd_line_helper_uri.empty())
+ {
+ grid_info[GRID_HELPER_URI_VALUE] = cmd_line_helper_uri;
+ }
+
+ // override the login page if it was passed in
+ std::string cmd_line_login_page = gSavedSettings.getString("LoginPage");
+ if(!cmd_line_login_page.empty())
+ {
+ grid_info[GRID_LOGIN_PAGE_VALUE] = cmd_line_login_page;
+ }
}
-EGridInfo LLViewerLogin::getGridChoice() const
+
+//
+// LLGridManager::addGrid - add a grid to the grid list, populating the needed values
+// if they're not populated yet.
+//
+
+void LLGridManager::addGrid(LLSD& grid_data)
{
- return mGridChoice;
+ if (grid_data.isMap() && grid_data.has(GRID_VALUE))
+ {
+ std::string grid = utf8str_tolower(grid_data[GRID_VALUE]);
+
+ // grid should be in the form of a dns address
+ if (!grid.empty() &&
+ grid.find_first_not_of("abcdefghijklmnopqrstuvwxyz1234567890-_. ") != std::string::npos)
+ {
+ printf("grid name: %s", grid.c_str());
+ throw LLInvalidGridName(grid);
+ }
+
+ // populate the other values if they don't exist
+ if (!grid_data.has(GRID_LABEL_VALUE))
+ {
+ grid_data[GRID_LABEL_VALUE] = grid;
+ }
+ if (!grid_data.has(GRID_ID_VALUE))
+ {
+ grid_data[GRID_ID_VALUE] = grid;
+ }
+
+ // if the grid data doesn't include any of the URIs, then
+ // generate them from the grid, which should be a dns address
+ if (!grid_data.has(GRID_LOGIN_URI_VALUE))
+ {
+ grid_data[GRID_LOGIN_URI_VALUE] = LLSD::emptyArray();
+ grid_data[GRID_LOGIN_URI_VALUE].append(std::string("https://") +
+ grid + "/cgi-bin/login.cgi");
+ }
+ // Populate to the default values
+ if (!grid_data.has(GRID_LOGIN_PAGE_VALUE))
+ {
+ grid_data[GRID_LOGIN_PAGE_VALUE] = std::string("http://") + grid + "/app/login/";
+ }
+ if (!grid_data.has(GRID_HELPER_URI_VALUE))
+ {
+ grid_data[GRID_HELPER_URI_VALUE] = std::string("https://") + grid + "/helpers/";
+ }
+
+ if (!grid_data.has(GRID_LOGIN_IDENTIFIER_TYPES))
+ {
+ // non system grids and grids that haven't already been configured with values
+ // get both types of credentials.
+ grid_data[GRID_LOGIN_IDENTIFIER_TYPES] = LLSD::emptyArray();
+ grid_data[GRID_LOGIN_IDENTIFIER_TYPES].append(CRED_IDENTIFIER_TYPE_AGENT);
+ grid_data[GRID_LOGIN_IDENTIFIER_TYPES].append(CRED_IDENTIFIER_TYPE_ACCOUNT);
+ }
+
+ LL_DEBUGS("GridManager") << "ADDING: " << grid << LL_ENDL;
+ mGridList[grid] = grid_data;
+ }
}
-std::string LLViewerLogin::getGridLabel() const
+//
+// LLGridManager::addSystemGrid - helper for adding a system grid.
+void LLGridManager::addSystemGrid(const std::string& label,
+ const std::string& name,
+ const std::string& login,
+ const std::string& helper,
+ const std::string& login_page,
+ const std::string& login_id)
{
- if(mGridChoice == GRID_INFO_NONE)
+ LLSD grid = LLSD::emptyMap();
+ grid[GRID_VALUE] = name;
+ grid[GRID_LABEL_VALUE] = label;
+ grid[GRID_HELPER_URI_VALUE] = helper;
+ grid[GRID_LOGIN_URI_VALUE] = LLSD::emptyArray();
+ grid[GRID_LOGIN_URI_VALUE].append(login);
+ grid[GRID_LOGIN_PAGE_VALUE] = login_page;
+ grid[GRID_IS_SYSTEM_GRID_VALUE] = TRUE;
+ grid[GRID_LOGIN_IDENTIFIER_TYPES] = LLSD::emptyArray();
+ grid[GRID_LOGIN_IDENTIFIER_TYPES].append(CRED_IDENTIFIER_TYPE_AGENT);
+
+ grid[GRID_APP_SLURL_BASE] = SYSTEM_GRID_APP_SLURL_BASE;
+ if (login_id.empty())
+ {
+ grid[GRID_ID_VALUE] = name;
+ }
+ else
+ {
+ grid[GRID_ID_VALUE] = login_id;
+ }
+
+ // only add the system grids beyond agni to the visible list
+ // if we're building a debug version.
+ if (name == std::string(MAINGRID))
{
- return "None";
+ grid[GRID_SLURL_BASE] = MAIN_GRID_SLURL_BASE;
+ grid[GRID_IS_FAVORITE_VALUE] = TRUE;
}
- else if(mGridChoice < GRID_INFO_OTHER)
+ else
{
- return gGridInfo[mGridChoice].mLabel;
+ grid[GRID_SLURL_BASE] = llformat(SYSTEM_GRID_SLURL_BASE, label.c_str());
+ }
+ addGrid(grid);
+}
+
+// return a list of grid name -> grid label mappings for UI purposes
+std::map<std::string, std::string> LLGridManager::getKnownGrids(bool favorite_only)
+{
+ std::map<std::string, std::string> result;
+ for(LLSD::map_iterator grid_iter = mGridList.beginMap();
+ grid_iter != mGridList.endMap();
+ grid_iter++)
+ {
+ if(!favorite_only || grid_iter->second.has(GRID_IS_FAVORITE_VALUE))
+ {
+ result[grid_iter->first] = grid_iter->second[GRID_LABEL_VALUE].asString();
+ }
}
- return mGridName;
+ return result;
}
-std::string LLViewerLogin::getKnownGridLabel(EGridInfo grid_index) const
+
+void LLGridManager::setGridChoice(const std::string& grid)
{
- if(grid_index > GRID_INFO_NONE && grid_index < GRID_INFO_OTHER)
+ // Set the grid choice based on a string.
+ // The string can be:
+ // - a grid label from the gGridInfo table
+ // - a hostname
+ // - an ip address
+
+ // loop through. We could do just a hash lookup but we also want to match
+ // on label
+ std::string grid_name = grid;
+ if(!mGridList.has(grid_name))
+ {
+ // case insensitive
+ grid_name = getGridByLabel(grid);
+ }
+
+ if(grid_name.empty())
{
- return gGridInfo[grid_index].mLabel;
+ // the grid was not in the list of grids.
+ LLSD grid_data = LLSD::emptyMap();
+ grid_data[GRID_VALUE] = grid;
+ addGrid(grid_data);
}
- return gGridInfo[GRID_INFO_NONE].mLabel;
+ mGrid = grid;
+ gSavedSettings.setString("CurrentGrid", grid);
}
-void LLViewerLogin::getLoginURIs(std::vector<std::string>& uris) const
+std::string LLGridManager::getGridByLabel( const std::string &grid_label, bool case_sensitive)
{
- // return the login uri set on the command line.
- LLControlVariable* c = gSavedSettings.getControl("CmdLineLoginURI");
- if(c)
+ for(LLSD::map_iterator grid_iter = mGridList.beginMap();
+ grid_iter != mGridList.endMap();
+ grid_iter++)
{
- LLSD v = c->getValue();
- if(v.isArray())
+ if (grid_iter->second.has(GRID_LABEL_VALUE))
{
- for(LLSD::array_const_iterator itr = v.beginArray();
- itr != v.endArray(); ++itr)
+ if (0 == (case_sensitive?LLStringUtil::compareStrings(grid_label, grid_iter->second[GRID_LABEL_VALUE].asString()):
+ LLStringUtil::compareInsensitive(grid_label, grid_iter->second[GRID_LABEL_VALUE].asString())))
{
- std::string uri = itr->asString();
- if(!uri.empty())
- {
- uris.push_back(uri);
- }
- }
- }
- else
- {
- std::string uri = v.asString();
- if(!uri.empty())
- {
- uris.push_back(uri);
+ return grid_iter->first;
}
}
}
+ return std::string();
+}
- // If there was no command line uri...
- if(uris.empty())
+void LLGridManager::getLoginURIs(std::vector<std::string>& uris)
+{
+ uris.clear();
+ LLSD cmd_line_login_uri = gSavedSettings.getLLSD("CmdLineLoginURI");
+ if (cmd_line_login_uri.isString())
+ {
+ uris.push_back(cmd_line_login_uri);
+ return;
+ }
+ for (LLSD::array_iterator llsd_uri = mGridList[mGrid][GRID_LOGIN_URI_VALUE].beginArray();
+ llsd_uri != mGridList[mGrid][GRID_LOGIN_URI_VALUE].endArray();
+ llsd_uri++)
{
- // If its a known grid choice, get the uri from the table,
- // else try the grid name.
- if(mGridChoice > GRID_INFO_NONE && mGridChoice < GRID_INFO_OTHER)
- {
- uris.push_back(gGridInfo[mGridChoice].mLoginURI);
- }
- else
- {
- uris.push_back(mGridName);
- }
+ uris.push_back(llsd_uri->asString());
}
}
-std::string LLViewerLogin::getHelperURI() const
+std::string LLGridManager::getHelperURI()
{
- std::string helper_uri = gSavedSettings.getString("CmdLineHelperURI");
- if (helper_uri.empty())
+ std::string cmd_line_helper_uri = gSavedSettings.getString("CmdLineHelperURI");
+ if(!cmd_line_helper_uri.empty())
{
- // grab URI from selected grid
- if(mGridChoice > GRID_INFO_NONE && mGridChoice < GRID_INFO_OTHER)
- {
- helper_uri = gGridInfo[mGridChoice].mHelperURI;
- }
-
- if (helper_uri.empty())
- {
- // what do we do with unnamed/miscellaneous grids?
- // for now, operations that rely on the helper URI (currency/land purchasing) will fail
- }
+ return cmd_line_helper_uri;
}
- return helper_uri;
+ return mGridList[mGrid][GRID_HELPER_URI_VALUE];
+}
+
+std::string LLGridManager::getLoginPage()
+{
+ // override the login page if it was passed in
+ std::string cmd_line_login_page = gSavedSettings.getString("LoginPage");
+ if(!cmd_line_login_page.empty())
+ {
+ return cmd_line_login_page;
+ }
+
+ return mGridList[mGrid][GRID_LOGIN_PAGE_VALUE];
}
-bool LLViewerLogin::isInProductionGrid()
+bool LLGridManager::isInProductionGrid()
{
// *NOTE:Mani This used to compare GRID_INFO_AGNI to gGridChoice,
// but it seems that loginURI trumps that.
std::vector<std::string> uris;
getLoginURIs(uris);
+ if (uris.size() < 1)
+ {
+ return 1;
+ }
LLStringUtil::toLower(uris[0]);
if((uris[0].find("agni") != std::string::npos))
{
@@ -339,3 +577,51 @@ bool LLViewerLogin::isInProductionGrid()
return false;
}
+
+void LLGridManager::saveFavorites()
+{
+ // filter out just those marked as favorites
+ LLSD output_grid_list = LLSD::emptyMap();
+ for(LLSD::map_iterator grid_iter = mGridList.beginMap();
+ grid_iter != mGridList.endMap();
+ grid_iter++)
+ {
+ if(grid_iter->second.has(GRID_IS_FAVORITE_VALUE))
+ {
+ output_grid_list[grid_iter->first] = grid_iter->second;
+ }
+ }
+ llofstream llsd_xml;
+ llsd_xml.open( mGridFile.c_str(), std::ios::out | std::ios::binary);
+ LLSDSerialize::toPrettyXML(output_grid_list, llsd_xml);
+ llsd_xml.close();
+}
+
+
+// build a slurl for the given region within the selected grid
+std::string LLGridManager::getSLURLBase(const std::string& grid)
+{
+ std::string grid_base;
+ if(mGridList.has(grid) && mGridList[grid].has(GRID_SLURL_BASE))
+ {
+ return mGridList[grid][GRID_SLURL_BASE].asString();
+ }
+ else
+ {
+ return llformat(DEFAULT_SLURL_BASE, grid.c_str());
+ }
+}
+
+// build a slurl for the given region within the selected grid
+std::string LLGridManager::getAppSLURLBase(const std::string& grid)
+{
+ std::string grid_base;
+ if(mGridList.has(grid) && mGridList[grid].has(GRID_APP_SLURL_BASE))
+ {
+ return mGridList[grid][GRID_APP_SLURL_BASE].asString();
+ }
+ else
+ {
+ return llformat(DEFAULT_APP_SLURL_BASE, grid.c_str());
+ }
+}
diff --git a/indra/newview/llviewernetwork.h b/indra/newview/llviewernetwork.h
index edae6dc47b..8c3a15b7cf 100644
--- a/indra/newview/llviewernetwork.h
+++ b/indra/newview/llviewernetwork.h
@@ -5,7 +5,7 @@
*
* $LicenseInfo:firstyear=2006&license=viewergpl$
*
- * Copyright (c) 2006-2009, Linden Research, Inc.
+ * Copyright (c) 2006-2010, Linden Research, Inc.
*
* Second Life Viewer Source Code
* The source code in this file ("Source Code") is provided by Linden Lab
@@ -13,13 +13,12 @@
* ("GPL"), unless you have obtained a separate licensing agreement
* ("Other License"), formally executed by you and Linden Lab. Terms of
* the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ * online at http://secondlife.com/developers/opensource/gplv2
*
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * online at http://secondlife.com/developers/opensource/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
@@ -33,83 +32,124 @@
#ifndef LL_LLVIEWERNETWORK_H
#define LL_LLVIEWERNETWORK_H
+
+extern const char* DEFAULT_LOGIN_PAGE;
+
+#define GRID_VALUE "name"
+#define GRID_LABEL_VALUE "label"
+#define GRID_ID_VALUE "grid_login_id"
+#define GRID_LOGIN_URI_VALUE "login_uri"
+#define GRID_HELPER_URI_VALUE "helper_uri"
+#define GRID_LOGIN_PAGE_VALUE "login_page"
+#define GRID_IS_SYSTEM_GRID_VALUE "system_grid"
+#define GRID_IS_FAVORITE_VALUE "favorite"
+#define MAINGRID "util.agni.lindenlab.com"
+#define GRID_LOGIN_IDENTIFIER_TYPES "login_identifier_types"
+// defines slurl formats associated with various grids.
+// we need to continue to support existing forms, as slurls
+// are shared between viewers that may not understand newer
+// forms.
+#define GRID_SLURL_BASE "slurl_base"
+#define GRID_APP_SLURL_BASE "app_slurl_base"
-#include <boost/scoped_ptr.hpp>
-
-class LLHost;
-class LLLogin;
-
-enum EGridInfo
+class LLInvalidGridName
{
- GRID_INFO_NONE,
- GRID_INFO_ADITI,
- GRID_INFO_AGNI,
- GRID_INFO_ARUNA,
- GRID_INFO_BHARATI,
- GRID_INFO_CHANDRA,
- GRID_INFO_DAMBALLAH,
- GRID_INFO_DANU,
- GRID_INFO_DURGA,
- GRID_INFO_GANGA,
- GRID_INFO_MITRA,
- GRID_INFO_MOHINI,
- GRID_INFO_NANDI,
- GRID_INFO_PARVATI,
- GRID_INFO_RADHA,
- GRID_INFO_RAVI,
- GRID_INFO_SIVA,
- GRID_INFO_SHAKTI,
- GRID_INFO_SKANDA,
- GRID_INFO_SOMA,
- GRID_INFO_UMA,
- GRID_INFO_VAAK,
- GRID_INFO_YAMI,
- GRID_INFO_LOCAL,
- GRID_INFO_OTHER, // IP address set via command line option
- GRID_INFO_COUNT
+public:
+ LLInvalidGridName(std::string grid) : mGrid(grid)
+ {
+ }
+protected:
+ std::string mGrid;
};
+
/**
- * @brief A class to manage the viewer's login state.
+ * @brief A class to manage the grids available to the viewer
+ * including persistance. This class also maintains the currently
+ * selected grid.
*
**/
-class LLViewerLogin : public LLSingleton<LLViewerLogin>
+class LLGridManager : public LLSingleton<LLGridManager>
{
public:
- LLViewerLogin();
- ~LLViewerLogin();
-
- void setGridChoice(EGridInfo grid);
- void setGridChoice(const std::string& grid_name);
- void resetURIs();
+
+ // when the grid manager is instantiated, the default grids are automatically
+ // loaded, and the grids favorites list is loaded from the xml file.
+ LLGridManager(const std::string& grid_file);
+ LLGridManager();
+ ~LLGridManager();
+
+ void initialize(const std::string& grid_file);
+ // grid list management
+
+ // add a grid to the list of grids
+ void addGrid(LLSD& grid_info);
- /**
- * @brief Get the enumeration of the grid choice.
- * Should only return values > 0 && < GRID_INFO_COUNT
- **/
- EGridInfo getGridChoice() const;
-
- /**
- * @brief Get a readable label for the grid choice.
- * Returns the readable name for the grid choice.
- * If the grid is 'other', returns something
- * the string used to specifiy the grid.
- **/
- std::string getGridLabel() const;
-
- std::string getKnownGridLabel(EGridInfo grid_index) const;
-
- void getLoginURIs(std::vector<std::string>& uris) const;
- std::string getHelperURI() const;
+ // retrieve a map of grid-name <-> label
+ // by default only return the user visible grids
+ std::map<std::string, std::string> getKnownGrids(bool favorites_only=FALSE);
+
+ void getGridInfo(const std::string& grid, LLSD &grid_info);
+
+ // current grid management
+ // select a given grid as the current grid. If the grid
+ // is not a known grid, then it's assumed to be a dns name for the
+ // grid, and the various URIs will be automatically generated.
+ void setGridChoice(const std::string& grid);
+
+
+ std::string getGridLabel() { return mGridList[mGrid][GRID_LABEL_VALUE]; }
+ std::string getGrid() const { return mGrid; }
+ void getLoginURIs(std::vector<std::string>& uris);
+ std::string getHelperURI();
+ std::string getLoginPage();
+ std::string getGridLoginID() { return mGridList[mGrid][GRID_ID_VALUE]; }
+ std::string getLoginPage(const std::string& grid) { return mGridList[grid][GRID_LOGIN_PAGE_VALUE]; }
+ void getLoginIdentifierTypes(LLSD& idTypes) { idTypes = mGridList[mGrid][GRID_LOGIN_IDENTIFIER_TYPES]; }
+
+ // build a slurl for the given region within the selected grid
+ std::string getSLURLBase(const std::string& grid);
+ std::string getSLURLBase() { return getSLURLBase(mGrid); }
+
+ std::string getAppSLURLBase(const std::string& grid);
+ std::string getAppSLURLBase() { return getAppSLURLBase(mGrid); }
+
+ void getGridInfo(LLSD &grid_info) { getGridInfo(mGrid, grid_info); }
+
+ std::string getGridByLabel( const std::string &grid_label, bool case_sensitive = false);
+
+ bool isSystemGrid(const std::string& grid)
+ {
+ return mGridList.has(grid) &&
+ mGridList[grid].has(GRID_IS_SYSTEM_GRID_VALUE) &&
+ mGridList[grid][GRID_IS_SYSTEM_GRID_VALUE].asBoolean();
+ }
+ bool isSystemGrid() { return isSystemGrid(mGrid); }
+ // Mark this grid as a favorite that should be persisited on 'save'
+ // this is currently used to persist a grid after a successful login
+ void setFavorite() { mGridList[mGrid][GRID_IS_FAVORITE_VALUE] = TRUE; }
+
bool isInProductionGrid();
+ void saveFavorites();
+ void clearFavorites();
+
+protected:
-private:
- EGridInfo mGridChoice;
- std::string mGridName;
+ // helper function for adding the predefined grids
+ void addSystemGrid(const std::string& label,
+ const std::string& name,
+ const std::string& login,
+ const std::string& helper,
+ const std::string& login_page,
+ const std::string& login_id = "");
+
+
+ std::string mGrid;
+ std::string mGridFile;
+ LLSD mGridList;
};
const S32 MAC_ADDRESS_BYTES = 6;
-extern unsigned char gMACAddress[MAC_ADDRESS_BYTES]; /* Flawfinder: ignore */
#endif
diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp
index 886f1d9ef5..ee89680fea 100644
--- a/indra/newview/llviewerobject.cpp
+++ b/indra/newview/llviewerobject.cpp
@@ -46,6 +46,7 @@
#include "llfontgl.h"
#include "llframetimer.h"
#include "llinventory.h"
+#include "llinventorydefines.h"
#include "llmaterialtable.h"
#include "llmutelist.h"
#include "llnamevalue.h"
@@ -60,6 +61,7 @@
#include "llaudiosourcevo.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llbbox.h"
#include "llbox.h"
#include "llcylinder.h"
@@ -133,7 +135,15 @@ LLViewerObject *LLViewerObject::createObject(const LLUUID &id, const LLPCode pco
{
if (id == gAgentID)
{
- res = new LLVOAvatarSelf(id, pcode, regionp);
+ if (!gAgentAvatarp)
+ {
+ gAgentAvatarp = new LLVOAvatarSelf(id, pcode, regionp);
+ }
+ else
+ {
+ gAgentAvatarp->updateRegion(regionp);
+ }
+ res = gAgentAvatarp;
}
else
{
@@ -222,7 +232,7 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
mClickAction(0),
mAttachmentItemID(LLUUID::null)
{
- if(!is_global)
+ if (!is_global)
{
llassert(mRegionp);
}
@@ -234,7 +244,7 @@ LLViewerObject::LLViewerObject(const LLUUID &id, const LLPCode pcode, LLViewerRe
mPositionRegion = LLVector3(0.f, 0.f, 0.f);
- if(!is_global)
+ if (!is_global && mRegionp)
{
mPositionAgent = mRegionp->getOriginAgent();
}
@@ -376,11 +386,10 @@ void LLViewerObject::markDead()
if (flagAnimSource())
{
- LLVOAvatar* avatarp = gAgent.getAvatarObject();
- if (avatarp && !avatarp->isDead())
+ if (isAgentAvatarValid())
{
// stop motions associated with this object
- avatarp->stopMotionFromSource(mID);
+ gAgentAvatarp->stopMotionFromSource(mID);
}
}
@@ -2001,6 +2010,9 @@ BOOL LLViewerObject::isActive() const
BOOL LLViewerObject::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
{
+ static LLFastTimer::DeclareTimer ftm("Viewer Object");
+ LLFastTimer t(ftm);
+
if (mDead)
{
// It's dead. Don't update it.
@@ -2166,8 +2178,8 @@ void LLViewerObject::deleteInventoryItem(const LLUUID& item_id)
{
if(mInventory)
{
- InventoryObjectList::iterator it = mInventory->begin();
- InventoryObjectList::iterator end = mInventory->end();
+ LLInventoryObject::object_list_t::iterator it = mInventory->begin();
+ LLInventoryObject::object_list_t::iterator end = mInventory->end();
for( ; it != end; ++it )
{
if((*it)->getUUID() == item_id)
@@ -2477,7 +2489,7 @@ void LLViewerObject::processTaskInv(LLMessageSystem* msg, void** user_data)
}
else
{
- object->mInventory = new InventoryObjectList();
+ object->mInventory = new LLInventoryObject::object_list_t();
}
LLPointer<LLInventoryObject> obj;
obj = new LLInventoryObject(object->mID, LLUUID::null,
@@ -2533,7 +2545,7 @@ void LLViewerObject::loadTaskInvFile(const std::string& filename)
}
else
{
- mInventory = new InventoryObjectList;
+ mInventory = new LLInventoryObject::object_list_t;
}
while(ifs.good())
{
@@ -2666,8 +2678,8 @@ LLInventoryObject* LLViewerObject::getInventoryObject(const LLUUID& item_id)
LLInventoryObject* rv = NULL;
if(mInventory)
{
- InventoryObjectList::iterator it = mInventory->begin();
- InventoryObjectList::iterator end = mInventory->end();
+ LLInventoryObject::object_list_t::iterator it = mInventory->begin();
+ LLInventoryObject::object_list_t::iterator end = mInventory->end();
for ( ; it != end; ++it)
{
if((*it)->getUUID() == item_id)
@@ -2680,12 +2692,12 @@ LLInventoryObject* LLViewerObject::getInventoryObject(const LLUUID& item_id)
return rv;
}
-void LLViewerObject::getInventoryContents(InventoryObjectList& objects)
+void LLViewerObject::getInventoryContents(LLInventoryObject::object_list_t& objects)
{
if(mInventory)
{
- InventoryObjectList::iterator it = mInventory->begin();
- InventoryObjectList::iterator end = mInventory->end();
+ LLInventoryObject::object_list_t::iterator it = mInventory->begin();
+ LLInventoryObject::object_list_t::iterator end = mInventory->end();
for( ; it != end; ++it)
{
if ((*it)->getType() != LLAssetType::AT_CATEGORY)
@@ -2715,8 +2727,8 @@ LLViewerInventoryItem* LLViewerObject::getInventoryItemByAsset(const LLUUID& ass
{
LLViewerInventoryItem* item = NULL;
- InventoryObjectList::iterator it = mInventory->begin();
- InventoryObjectList::iterator end = mInventory->end();
+ LLInventoryObject::object_list_t::iterator it = mInventory->begin();
+ LLInventoryObject::object_list_t::iterator end = mInventory->end();
for( ; it != end; ++it)
{
LLInventoryObject* obj = *it;
@@ -2754,7 +2766,7 @@ void LLViewerObject::setPixelAreaAndAngle(LLAgent &agent)
return;
}
- LLVector3 viewer_pos_agent = agent.getCameraPositionAgent();
+ LLVector3 viewer_pos_agent = gAgentCamera.getCameraPositionAgent();
LLVector3 pos_agent = getRenderPosition();
F32 dx = viewer_pos_agent.mV[VX] - pos_agent.mV[VX];
@@ -4019,9 +4031,15 @@ LLBBox LLViewerObject::getBoundingBoxAgent() const
{
LLVector3 position_agent;
LLQuaternion rot;
+ LLViewerObject* avatar_parent = NULL;
LLViewerObject* root_edit = (LLViewerObject*)getRootEdit();
- LLViewerObject* avatar_parent = (LLViewerObject*)root_edit->getParent();
- if (avatar_parent && avatar_parent->isAvatar() && root_edit->mDrawable.notNull())
+ if (root_edit)
+ {
+ avatar_parent = (LLViewerObject*)root_edit->getParent();
+ }
+
+ if (avatar_parent && avatar_parent->isAvatar() &&
+ root_edit && root_edit->mDrawable.notNull() && root_edit->mDrawable->getXform()->getParent())
{
LLXform* parent_xform = root_edit->mDrawable->getXform()->getParent();
position_agent = (getPositionEdit() * parent_xform->getWorldRotation()) + parent_xform->getWorldPosition();
@@ -4072,8 +4090,8 @@ S32 LLViewerObject::countInventoryContents(LLAssetType::EType type)
S32 count = 0;
if( mInventory )
{
- InventoryObjectList::const_iterator it = mInventory->begin();
- InventoryObjectList::const_iterator end = mInventory->end();
+ LLInventoryObject::object_list_t::const_iterator it = mInventory->begin();
+ LLInventoryObject::object_list_t::const_iterator end = mInventory->end();
for( ; it != end ; ++it )
{
if( (*it)->getType() == type )
@@ -4709,7 +4727,7 @@ BOOL LLViewerObject::permYouOwner() const
return TRUE;
#else
# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
- if (!LLViewerLogin::getInstance()->isInProductionGrid()
+ if (!LLGridManager::getInstance()->isInProductionGrid()
&& (gAgent.getGodLevel() >= GOD_MAINTENANCE))
{
return TRUE;
@@ -4746,7 +4764,7 @@ BOOL LLViewerObject::permOwnerModify() const
return TRUE;
#else
# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
- if (!LLViewerLogin::getInstance()->isInProductionGrid()
+ if (!LLGridManager::getInstance()->isInProductionGrid()
&& (gAgent.getGodLevel() >= GOD_MAINTENANCE))
{
return TRUE;
@@ -4770,7 +4788,7 @@ BOOL LLViewerObject::permModify() const
return TRUE;
#else
# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
- if (!LLViewerLogin::getInstance()->isInProductionGrid()
+ if (!LLGridManager::getInstance()->isInProductionGrid()
&& (gAgent.getGodLevel() >= GOD_MAINTENANCE))
{
return TRUE;
@@ -4794,7 +4812,7 @@ BOOL LLViewerObject::permCopy() const
return TRUE;
#else
# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
- if (!LLViewerLogin::getInstance()->isInProductionGrid()
+ if (!LLGridManager::getInstance()->isInProductionGrid()
&& (gAgent.getGodLevel() >= GOD_MAINTENANCE))
{
return TRUE;
@@ -4818,7 +4836,7 @@ BOOL LLViewerObject::permMove() const
return TRUE;
#else
# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
- if (!LLViewerLogin::getInstance()->isInProductionGrid()
+ if (!LLGridManager::getInstance()->isInProductionGrid()
&& (gAgent.getGodLevel() >= GOD_MAINTENANCE))
{
return TRUE;
@@ -4842,7 +4860,7 @@ BOOL LLViewerObject::permTransfer() const
return TRUE;
#else
# ifdef TOGGLE_HACKED_GODLIKE_VIEWER
- if (!LLViewerLogin::getInstance()->isInProductionGrid()
+ if (!LLGridManager::getInstance()->isInProductionGrid()
&& (gAgent.getGodLevel() >= GOD_MAINTENANCE))
{
return TRUE;
@@ -4910,7 +4928,6 @@ void LLViewerObject::setIncludeInSearch(bool include_in_search)
void LLViewerObject::setRegion(LLViewerRegion *regionp)
{
- llassert(regionp);
mLatestRecvPacketID = 0;
mRegionp = regionp;
diff --git a/indra/newview/llviewerobject.h b/indra/newview/llviewerobject.h
index 266c40d493..be83fb7ef8 100644
--- a/indra/newview/llviewerobject.h
+++ b/indra/newview/llviewerobject.h
@@ -88,7 +88,7 @@ typedef enum e_object_update_type
// callback typedef for inventory
typedef void (*inventory_callback)(LLViewerObject*,
- InventoryObjectList*,
+ LLInventoryObject::object_list_t*,
S32 serial_num,
void*);
@@ -409,7 +409,7 @@ public:
void updateInventory(LLViewerInventoryItem* item, U8 key, bool is_new);
void updateInventoryLocal(LLInventoryItem* item, U8 key); // Update without messaging.
LLInventoryObject* getInventoryObject(const LLUUID& item_id);
- void getInventoryContents(InventoryObjectList& objects);
+ void getInventoryContents(LLInventoryObject::object_list_t& objects);
LLInventoryObject* getInventoryRoot();
LLViewerInventoryItem* getInventoryItemByAsset(const LLUUID& asset_id);
S16 getInventorySerial() const { return mInventorySerialNum; }
@@ -629,7 +629,7 @@ protected:
F32 mPixelArea; // Apparent area in pixels
// This is the object's inventory from the viewer's perspective.
- InventoryObjectList* mInventory;
+ LLInventoryObject::object_list_t* mInventory;
class LLInventoryCallbackInfo
{
public:
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index 96828ee1b6..752aeaaab0 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -47,6 +47,7 @@
#include "llviewerwindow.h"
#include "llnetmap.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "pipeline.h"
#include "llspatialpartition.h"
#include "lltooltip.h"
@@ -93,7 +94,7 @@ extern LLPipeline gPipeline;
// Statics for object lookup tables.
U32 LLViewerObjectList::sSimulatorMachineIndex = 1; // Not zero deliberately, to speed up index check.
-LLMap<U64, U32> LLViewerObjectList::sIPAndPortToIndex;
+std::map<U64, U32> LLViewerObjectList::sIPAndPortToIndex;
std::map<U64, LLUUID> LLViewerObjectList::sIndexAndLocalIDToUUID;
LLViewerObjectList::LLViewerObjectList()
@@ -288,7 +289,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
LLMemType mt(LLMemType::MTYPE_OBJECT_PROCESS_UPDATE);
LLFastTimer t(FTM_PROCESS_OBJECTS);
- LLVector3d camera_global = gAgent.getCameraPositionGlobal();
+ LLVector3d camera_global = gAgentCamera.getCameraPositionGlobal();
LLViewerObject *objectp;
S32 num_objects;
U32 local_id;
@@ -473,7 +474,6 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys,
if (objectp->getRegion() != regionp)
{ // Object changed region, so update it
- objectp->setRegion(regionp);
objectp->updateRegion(regionp); // for LLVOAvatar
}
}
@@ -571,10 +571,9 @@ void LLViewerObjectList::processCachedObjectUpdate(LLMessageSystem *mesgsys,
void LLViewerObjectList::dirtyAllObjectInventory()
{
- S32 count = mObjects.count();
- for(S32 i = 0; i < count; ++i)
+ for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter)
{
- mObjects[i]->dirtyInventory();
+ (*iter)->dirtyInventory();
}
}
@@ -587,14 +586,14 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent)
S32 num_updates, max_value;
if (NUM_BINS - 1 == mCurBin)
{
- num_updates = mObjects.count() - mCurLazyUpdateIndex;
- max_value = mObjects.count();
+ num_updates = (S32) mObjects.size() - mCurLazyUpdateIndex;
+ max_value = (S32) mObjects.size();
gTextureList.setUpdateStats(TRUE);
}
else
{
- num_updates = (mObjects.count() / NUM_BINS) + 1;
- max_value = llmin(mObjects.count(), mCurLazyUpdateIndex + num_updates);
+ num_updates = ((S32) mObjects.size() / NUM_BINS) + 1;
+ max_value = llmin((S32) mObjects.size(), mCurLazyUpdateIndex + num_updates);
}
@@ -615,7 +614,7 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent)
}
// Focused
- objectp = gAgent.getFocusObject();
+ objectp = gAgentCamera.getFocusObject();
if (objectp)
{
objectp->boostTexturePriority();
@@ -647,7 +646,7 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent)
}
mCurLazyUpdateIndex = max_value;
- if (mCurLazyUpdateIndex == mObjects.count())
+ if (mCurLazyUpdateIndex == mObjects.size())
{
mCurLazyUpdateIndex = 0;
}
@@ -694,20 +693,26 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
// Make a copy of the list in case something in idleUpdate() messes with it
std::vector<LLViewerObject*> idle_list;
- idle_list.reserve( mActiveObjects.size() );
+
+ static LLFastTimer::DeclareTimer idle_copy("Idle Copy");
- for (std::set<LLPointer<LLViewerObject> >::iterator active_iter = mActiveObjects.begin();
- active_iter != mActiveObjects.end(); active_iter++)
{
- objectp = *active_iter;
- if (objectp)
+ LLFastTimer t(idle_copy);
+ idle_list.reserve( mActiveObjects.size() );
+
+ for (std::set<LLPointer<LLViewerObject> >::iterator active_iter = mActiveObjects.begin();
+ active_iter != mActiveObjects.end(); active_iter++)
{
- idle_list.push_back( objectp );
- }
- else
- { // There shouldn't be any NULL pointers in the list, but they have caused
- // crashes before. This may be idleUpdate() messing with the list.
- llwarns << "LLViewerObjectList::update has a NULL objectp" << llendl;
+ objectp = *active_iter;
+ if (objectp)
+ {
+ idle_list.push_back( objectp );
+ }
+ else
+ { // There shouldn't be any NULL pointers in the list, but they have caused
+ // crashes before. This may be idleUpdate() messing with the list.
+ llwarns << "LLViewerObjectList::update has a NULL objectp" << llendl;
+ }
}
}
@@ -807,7 +812,7 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
}
*/
- LLViewerStats::getInstance()->mNumObjectsStat.addValue(mObjects.count());
+ LLViewerStats::getInstance()->mNumObjectsStat.addValue((S32) mObjects.size());
LLViewerStats::getInstance()->mNumActiveObjectsStat.addValue(num_active_objects);
LLViewerStats::getInstance()->mNumSizeCulledStat.addValue(mNumSizeCulled);
LLViewerStats::getInstance()->mNumVisCulledStat.addValue(mNumVisCulled);
@@ -815,9 +820,9 @@ void LLViewerObjectList::update(LLAgent &agent, LLWorld &world)
void LLViewerObjectList::clearDebugText()
{
- for (S32 i = 0; i < mObjects.count(); i++)
+ for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter)
{
- mObjects[i]->setDebugText("");
+ (*iter)->setDebugText("");
}
}
@@ -856,7 +861,7 @@ void LLViewerObjectList::cleanupReferences(LLViewerObject *objectp)
if (objectp->isOnMap())
{
- mMapObjects.removeObj(objectp);
+ removeFromMap(objectp);
}
// Don't clean up mObject references, these will be cleaned up more efficiently later!
@@ -889,6 +894,13 @@ void LLViewerObjectList::removeDrawable(LLDrawable* drawablep)
BOOL LLViewerObjectList::killObject(LLViewerObject *objectp)
{
+ // Don't ever kill gAgentAvatarp, just mark it as null region instead.
+ if (objectp == gAgentAvatarp)
+ {
+ objectp->setRegion(NULL);
+ return FALSE;
+ }
+
// When we're killing objects, all we do is mark them as dead.
// We clean up the dead objects later.
@@ -913,10 +925,10 @@ void LLViewerObjectList::killObjects(LLViewerRegion *regionp)
{
LLViewerObject *objectp;
- S32 i;
- for (i = 0; i < mObjects.count(); i++)
+
+ for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter)
{
- objectp = mObjects[i];
+ objectp = *iter;
if (objectp->mRegionp == regionp)
{
@@ -933,19 +945,19 @@ void LLViewerObjectList::killAllObjects()
// Used only on global destruction.
LLViewerObject *objectp;
- for (S32 i = 0; i < mObjects.count(); i++)
+ for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter)
{
- objectp = mObjects[i];
-
+ objectp = *iter;
killObject(objectp);
- llassert(objectp->isDead());
+ // Object must be dead, or it's the LLVOAvatarSelf which never dies.
+ llassert((objectp == gAgentAvatarp) || objectp->isDead());
}
cleanDeadObjects(FALSE);
if(!mObjects.empty())
{
- llwarns << "LLViewerObjectList::killAllObjects still has entries in mObjects: " << mObjects.count() << llendl;
+ llwarns << "LLViewerObjectList::killAllObjects still has entries in mObjects: " << mObjects.size() << llendl;
mObjects.clear();
}
@@ -970,16 +982,15 @@ void LLViewerObjectList::cleanDeadObjects(BOOL use_timer)
return;
}
- S32 i = 0;
S32 num_removed = 0;
LLViewerObject *objectp;
- while (i < mObjects.count())
+ for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); )
{
// Scan for all of the dead objects and remove any "global" references to them.
- objectp = mObjects[i];
+ objectp = *iter;
if (objectp->isDead())
{
- mObjects.remove(i);
+ iter = mObjects.erase(iter);
num_removed++;
if (num_removed == mNumDeadObjects)
@@ -990,8 +1001,7 @@ void LLViewerObjectList::cleanDeadObjects(BOOL use_timer)
}
else
{
- // iterate, this isn't a dead object.
- i++;
+ ++iter;
}
}
@@ -1041,12 +1051,11 @@ void LLViewerObjectList::shiftObjects(const LLVector3 &offset)
}
LLViewerObject *objectp;
- S32 i;
- for (i = 0; i < mObjects.count(); i++)
+ for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter)
{
- objectp = getObject(i);
+ objectp = *iter;
// There could be dead objects on the object list, so don't update stuff if the object is dead.
- if (objectp)
+ if (!objectp->isDead())
{
objectp->updatePositionCaches();
@@ -1076,9 +1085,9 @@ void LLViewerObjectList::renderObjectsForMap(LLNetMap &netmap)
F32 max_radius = gSavedSettings.getF32("MiniMapPrimMaxRadius");
- for (S32 i = 0; i < mMapObjects.count(); i++)
+ for (vobj_list_t::iterator iter = mMapObjects.begin(); iter != mMapObjects.end(); ++iter)
{
- LLViewerObject* objectp = mMapObjects[i];
+ LLViewerObject* objectp = *iter;
if (!objectp->getRegion() || objectp->isOrphaned() || objectp->isAttachment())
{
continue;
@@ -1144,21 +1153,14 @@ void LLViewerObjectList::renderObjectBounds(const LLVector3 &center)
{
}
-void LLViewerObjectList::renderObjectsForSelect(LLCamera &camera, const LLRect& screen_rect, BOOL pick_parcel_wall, BOOL render_transparent)
-{
- generatePickList(camera);
- renderPickList(screen_rect, pick_parcel_wall, render_transparent);
-}
-
void LLViewerObjectList::generatePickList(LLCamera &camera)
{
LLViewerObject *objectp;
S32 i;
// Reset all of the GL names to zero.
- for (i = 0; i < mObjects.count(); i++)
+ for (vobj_list_t::iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter)
{
- objectp = mObjects[i];
- objectp->mGLName = 0;
+ (*iter)->mGLName = 0;
}
mSelectPickList.clear();
@@ -1215,11 +1217,10 @@ void LLViewerObjectList::generatePickList(LLCamera &camera)
}
// add all hud objects to pick list
- LLVOAvatar* avatarp = gAgent.getAvatarObject();
- if (avatarp)
+ if (isAgentAvatarValid())
{
- for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin();
- iter != avatarp->mAttachmentPoints.end(); )
+ for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin();
+ iter != gAgentAvatarp->mAttachmentPoints.end(); )
{
LLVOAvatar::attachment_map_t::iterator curiter = iter++;
LLViewerJointAttachment* attachment = curiter->second;
@@ -1287,7 +1288,7 @@ void LLViewerObjectList::renderPickList(const LLRect& screen_rect, BOOL pick_par
gViewerWindow->renderSelections( TRUE, pick_parcel_wall, FALSE );
//fix for DEV-19335. Don't pick hud objects when customizing avatar (camera mode doesn't play nice with nametags).
- if (!gAgent.cameraCustomizeAvatar())
+ if (!gAgentCamera.cameraCustomizeAvatar())
{
// render pickable ui elements, like names, etc.
LLHUDObject::renderAllForSelect();
@@ -1321,17 +1322,19 @@ void LLViewerObjectList::addDebugBeacon(const LLVector3 &pos_agent,
const LLColor4 &text_color,
S32 line_width)
{
- LLDebugBeacon *beaconp = mDebugBeacons.reserve_block(1);
- beaconp->mPositionAgent = pos_agent;
- beaconp->mString = string;
- beaconp->mColor = color;
- beaconp->mTextColor = text_color;
- beaconp->mLineWidth = line_width;
+ LLDebugBeacon beacon;
+ beacon.mPositionAgent = pos_agent;
+ beacon.mString = string;
+ beacon.mColor = color;
+ beacon.mTextColor = text_color;
+ beacon.mLineWidth = line_width;
+
+ mDebugBeacons.push_back(beacon);
}
void LLViewerObjectList::resetObjectBeacons()
{
- mDebugBeacons.reset();
+ mDebugBeacons.clear();
}
LLViewerObject *LLViewerObjectList::createObjectViewer(const LLPCode pcode, LLViewerRegion *regionp)
@@ -1349,7 +1352,7 @@ LLViewerObject *LLViewerObjectList::createObjectViewer(const LLPCode pcode, LLVi
mUUIDObjectMap[fullid] = objectp;
- mObjects.put(objectp);
+ mObjects.push_back(objectp);
updateActive(objectp);
@@ -1388,7 +1391,7 @@ LLViewerObject *LLViewerObjectList::createObject(const LLPCode pcode, LLViewerRe
gMessageSystem->getSenderIP(),
gMessageSystem->getSenderPort());
- mObjects.put(objectp);
+ mObjects.push_back(objectp);
updateActive(objectp);
@@ -1411,11 +1414,11 @@ LLViewerObject *LLViewerObjectList::replaceObject(const LLUUID &id, const LLPCod
S32 LLViewerObjectList::findReferences(LLDrawable *drawablep) const
{
LLViewerObject *objectp;
- S32 i;
S32 num_refs = 0;
- for (i = 0; i < mObjects.count(); i++)
+
+ for (vobj_list_t::const_iterator iter = mObjects.begin(); iter != mObjects.end(); ++iter)
{
- objectp = mObjects[i];
+ objectp = *iter;
if (objectp->mDrawable.notNull())
{
num_refs += objectp->mDrawable->findReferences(drawablep);
@@ -1460,15 +1463,15 @@ void LLViewerObjectList::orphanize(LLViewerObject *childp, U32 parent_id, U32 ip
// Unknown parent, add to orpaned child list
U64 parent_info = getIndex(parent_id, ip, port);
- if (-1 == mOrphanParents.find(parent_info))
+ if (std::find(mOrphanParents.begin(), mOrphanParents.end(), parent_info) == mOrphanParents.end())
{
- mOrphanParents.put(parent_info);
+ mOrphanParents.push_back(parent_info);
}
LLViewerObjectList::OrphanInfo oi(parent_info, childp->mID);
- if (-1 == mOrphanChildren.find(oi))
+ if (std::find(mOrphanChildren.begin(), mOrphanChildren.end(), oi) == mOrphanChildren.end())
{
- mOrphanChildren.put(oi);
+ mOrphanChildren.push_back(oi);
mNumOrphans++;
}
}
@@ -1491,28 +1494,29 @@ void LLViewerObjectList::findOrphans(LLViewerObject* objectp, U32 ip, U32 port)
// See if we are a parent of an orphan.
// Note: This code is fairly inefficient but it should happen very rarely.
// It can be sped up if this is somehow a performance issue...
- if (0 == mOrphanParents.count())
+ if (mOrphanParents.empty())
{
// no known orphan parents
return;
}
- if (-1 == mOrphanParents.find(getIndex(objectp->mLocalID, ip, port)))
+ if (std::find(mOrphanParents.begin(), mOrphanParents.end(), getIndex(objectp->mLocalID, ip, port)) == mOrphanParents.end())
{
// did not find objectp in OrphanParent list
return;
}
- S32 i;
U64 parent_info = getIndex(objectp->mLocalID, ip, port);
BOOL orphans_found = FALSE;
// Iterate through the orphan list, and set parents of matching children.
- for (i = 0; i < mOrphanChildren.count(); i++)
- {
- if (mOrphanChildren[i].mParentInfo != parent_info)
+
+ for (std::vector<OrphanInfo>::iterator iter = mOrphanChildren.begin(); iter != mOrphanChildren.end(); )
+ {
+ if (iter->mParentInfo != parent_info)
{
+ ++iter;
continue;
}
- LLViewerObject *childp = findObject(mOrphanChildren[i].mChildInfo);
+ LLViewerObject *childp = findObject(iter->mChildInfo);
if (childp)
{
if (childp == objectp)
@@ -1546,29 +1550,35 @@ void LLViewerObjectList::findOrphans(LLViewerObject* objectp, U32 ip, U32 port)
objectp->addChild(childp);
orphans_found = TRUE;
+ ++iter;
}
else
{
llinfos << "Missing orphan child, removing from list" << llendl;
- mOrphanChildren.remove(i);
- i--;
+
+ iter = mOrphanChildren.erase(iter);
}
}
// Remove orphan parent and children from lists now that they've been found
- mOrphanParents.remove(mOrphanParents.find(parent_info));
-
- i = 0;
- while (i < mOrphanChildren.count())
{
- if (mOrphanChildren[i].mParentInfo == parent_info)
+ std::vector<U64>::iterator iter = std::find(mOrphanParents.begin(), mOrphanParents.end(), parent_info);
+ if (iter != mOrphanParents.end())
+ {
+ mOrphanParents.erase(iter);
+ }
+ }
+
+ for (std::vector<OrphanInfo>::iterator iter = mOrphanChildren.begin(); iter != mOrphanChildren.end(); )
+ {
+ if (iter->mParentInfo == parent_info)
{
- mOrphanChildren.remove(i);
+ iter = mOrphanChildren.erase(iter);
mNumOrphans--;
}
else
{
- i++;
+ ++iter;
}
}
diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h
index ace5c5038e..706966deae 100644
--- a/indra/newview/llviewerobjectlist.h
+++ b/indra/newview/llviewerobjectlist.h
@@ -38,8 +38,6 @@
// common includes
#include "llstat.h"
-#include "lldarrayptr.h"
-#include "llmap.h" // *TODO: switch to std::map
#include "llstring.h"
// project includes
@@ -50,7 +48,7 @@ class LLNetMap;
class LLDebugBeacon;
const U32 CLOSE_BIN_SIZE = 10;
-const U32 NUM_BINS = 16;
+const U32 NUM_BINS = 128;
// GL name = position in object list + GL_NAME_INDEX_OFFSET so that
// we can have special numbers like zero.
@@ -111,13 +109,12 @@ public:
void updateAvatarVisibility();
// Selection related stuff
- void renderObjectsForSelect(LLCamera &camera, const LLRect& screen_rect, BOOL pick_parcel_wall = FALSE, BOOL render_transparent = TRUE);
void generatePickList(LLCamera &camera);
void renderPickList(const LLRect& screen_rect, BOOL pick_parcel_wall, BOOL render_transparent);
LLViewerObject *getSelectedObject(const U32 object_id);
- inline S32 getNumObjects() { return mObjects.count(); }
+ inline S32 getNumObjects() { return (S32) mObjects.size(); }
void addToMap(LLViewerObject *objectp);
void removeFromMap(LLViewerObject *objectp);
@@ -131,7 +128,7 @@ public:
S32 findReferences(LLDrawable *drawablep) const; // Find references to drawable in all objects, and return value.
- S32 getOrphanParentCount() const { return mOrphanParents.count(); }
+ S32 getOrphanParentCount() const { return (S32) mOrphanParents.size(); }
S32 getOrphanCount() const { return mNumOrphans; }
void orphanize(LLViewerObject *childp, U32 parent_id, U32 ip, U32 port);
void findOrphans(LLViewerObject* objectp, U32 ip, U32 port);
@@ -179,26 +176,28 @@ public:
S32 mNumUnknownKills;
S32 mNumDeadObjects;
protected:
- LLDynamicArray<U64> mOrphanParents; // LocalID/ip,port of orphaned objects
- LLDynamicArray<OrphanInfo> mOrphanChildren; // UUID's of orphaned objects
+ std::vector<U64> mOrphanParents; // LocalID/ip,port of orphaned objects
+ std::vector<OrphanInfo> mOrphanChildren; // UUID's of orphaned objects
S32 mNumOrphans;
- LLDynamicArrayPtr<LLPointer<LLViewerObject>, 256> mObjects;
+ typedef std::vector<LLPointer<LLViewerObject> > vobj_list_t;
+
+ vobj_list_t mObjects;
std::set<LLPointer<LLViewerObject> > mActiveObjects;
- LLDynamicArrayPtr<LLPointer<LLViewerObject> > mMapObjects;
+ vobj_list_t mMapObjects;
typedef std::map<LLUUID, LLPointer<LLViewerObject> > vo_map;
vo_map mDeadObjects; // Need to keep multiple entries per UUID
std::map<LLUUID, LLPointer<LLViewerObject> > mUUIDObjectMap;
- LLDynamicArray<LLDebugBeacon> mDebugBeacons;
+ std::vector<LLDebugBeacon> mDebugBeacons;
S32 mCurLazyUpdateIndex;
static U32 sSimulatorMachineIndex;
- static LLMap<U64, U32> sIPAndPortToIndex;
+ static std::map<U64, U32> sIPAndPortToIndex;
static std::map<U64, LLUUID> sIndexAndLocalIDToUUID;
@@ -233,6 +232,10 @@ public:
extern LLViewerObjectList gObjectList;
// Inlines
+/**
+ * Note:
+ * it will return NULL for offline avatar_id
+ */
inline LLViewerObject *LLViewerObjectList::findObject(const LLUUID &id)
{
std::map<LLUUID, LLPointer<LLViewerObject> >::iterator iter = mUUIDObjectMap.find(id);
@@ -260,12 +263,16 @@ inline LLViewerObject *LLViewerObjectList::getObject(const S32 index)
inline void LLViewerObjectList::addToMap(LLViewerObject *objectp)
{
- mMapObjects.put(objectp);
+ mMapObjects.push_back(objectp);
}
inline void LLViewerObjectList::removeFromMap(LLViewerObject *objectp)
{
- mMapObjects.removeObj(objectp);
+ std::vector<LLPointer<LLViewerObject> >::iterator iter = std::find(mMapObjects.begin(), mMapObjects.end(), objectp);
+ if (iter != mMapObjects.end())
+ {
+ mMapObjects.erase(iter);
+ }
}
diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp
index c4fc2e5cab..202f8822e3 100644
--- a/indra/newview/llviewerparcelmedia.cpp
+++ b/indra/newview/llviewerparcelmedia.cpp
@@ -35,6 +35,7 @@
#include "llagent.h"
#include "llaudioengine.h"
+#include "llmimetypes.h"
#include "llviewercontrol.h"
#include "llviewermedia.h"
#include "llviewerregion.h"
@@ -105,15 +106,6 @@ void LLViewerParcelMedia::update(LLParcel* parcel)
std::string mediaUrl = std::string ( parcel->getMediaURL () );
std::string mediaCurrentUrl = std::string( parcel->getMediaCurrentURL());
- // First use warning
- if( (!mediaUrl.empty() ||
- !parcel->getMusicURL().empty())
- && LLViewerMedia::needsMediaFirstRun())
- {
- LLViewerMedia::displayMediaFirstRun();
- return;
- }
-
// if we have a current (link sharing) url, use it instead
if (mediaCurrentUrl != "" && parcel->getMediaType() == "text/html")
{
@@ -219,25 +211,29 @@ void LLViewerParcelMedia::play(LLParcel* parcel)
// A new impl will be created below.
}
}
-
- if(!sMediaImpl)
+
+ // Don't ever try to play if the media type is set to "none/none"
+ if(stricmp(mime_type.c_str(), LLMIMETypes::getDefaultMimeType().c_str()) != 0)
{
- LL_DEBUGS("Media") << "new media impl with mime type " << mime_type << ", url " << media_url << LL_ENDL;
-
- // There is no media impl, make a new one
- sMediaImpl = LLViewerMedia::newMediaImpl(
- placeholder_texture_id,
- media_width,
- media_height,
- media_auto_scale,
- media_loop);
- sMediaImpl->setIsParcelMedia(true);
- sMediaImpl->navigateTo(media_url, mime_type, true);
- }
+ if(!sMediaImpl)
+ {
+ LL_DEBUGS("Media") << "new media impl with mime type " << mime_type << ", url " << media_url << LL_ENDL;
+
+ // There is no media impl, make a new one
+ sMediaImpl = LLViewerMedia::newMediaImpl(
+ placeholder_texture_id,
+ media_width,
+ media_height,
+ media_auto_scale,
+ media_loop);
+ sMediaImpl->setIsParcelMedia(true);
+ sMediaImpl->navigateTo(media_url, mime_type, true);
+ }
- //LLFirstUse::useMedia();
+ //LLFirstUse::useMedia();
- LLViewerParcelMediaAutoPlay::playStarted();
+ LLViewerParcelMediaAutoPlay::playStarted();
+ }
}
// static
@@ -311,7 +307,7 @@ LLPluginClassMediaOwner::EMediaStatus LLViewerParcelMedia::getStatus()
// static
std::string LLViewerParcelMedia::getMimeType()
{
- return sMediaImpl.notNull() ? sMediaImpl->getMimeType() : "none/none";
+ return sMediaImpl.notNull() ? sMediaImpl->getMimeType() : LLMIMETypes::getDefaultMimeType();
}
//static
@@ -321,11 +317,14 @@ std::string LLViewerParcelMedia::getURL()
if(sMediaImpl.notNull())
url = sMediaImpl->getMediaURL();
- if (url.empty())
- url = LLViewerParcelMgr::getInstance()->getAgentParcel()->getMediaCurrentURL();
-
- if (url.empty())
- url = LLViewerParcelMgr::getInstance()->getAgentParcel()->getMediaURL();
+ if(stricmp(LLViewerParcelMgr::getInstance()->getAgentParcel()->getMediaType().c_str(), LLMIMETypes::getDefaultMimeType().c_str()) != 0)
+ {
+ if (url.empty())
+ url = LLViewerParcelMgr::getInstance()->getAgentParcel()->getMediaCurrentURL();
+
+ if (url.empty())
+ url = LLViewerParcelMgr::getInstance()->getAgentParcel()->getMediaURL();
+ }
return url;
}
diff --git a/indra/newview/llviewerparcelmediaautoplay.cpp b/indra/newview/llviewerparcelmediaautoplay.cpp
index ad2723b66b..032ad6635a 100644
--- a/indra/newview/llviewerparcelmediaautoplay.cpp
+++ b/indra/newview/llviewerparcelmediaautoplay.cpp
@@ -42,6 +42,7 @@
#include "message.h"
#include "llviewertexturelist.h" // for texture stats
#include "llagent.h"
+#include "llmimetypes.h"
const F32 AUTOPLAY_TIME = 5; // how many seconds before we autoplay
const F32 AUTOPLAY_SIZE = 24*24; // how big the texture must be (pixel area) before we autoplay
@@ -86,6 +87,7 @@ BOOL LLViewerParcelMediaAutoPlay::tick()
LLParcel *this_parcel = NULL;
LLViewerRegion *this_region = NULL;
std::string this_media_url;
+ std::string this_media_type;
LLUUID this_media_texture_id;
S32 this_parcel_id = 0;
LLUUID this_region_id;
@@ -101,7 +103,9 @@ BOOL LLViewerParcelMediaAutoPlay::tick()
if (this_parcel)
{
- this_media_url = std::string(this_parcel->getMediaURL());
+ this_media_url = this_parcel->getMediaURL();
+
+ this_media_type = this_parcel->getMediaType();
this_media_texture_id = this_parcel->getMediaID();
@@ -118,14 +122,15 @@ BOOL LLViewerParcelMediaAutoPlay::tick()
mLastRegionID = this_region_id;
}
- mTimeInParcel += mPeriod; // increase mTimeInParcel by the amount of time between ticks
+ mTimeInParcel += mPeriod; // increase mTimeInParcel by the amount of time between ticks
- if ((!mPlayed) && // if we've never played
- (mTimeInParcel > AUTOPLAY_TIME) && // and if we've been here for so many seconds
- (this_media_url.size() != 0) && // and if the parcel has media
- (LLViewerParcelMedia::sMediaImpl.isNull())) // and if the media is not already playing
+ if ((!mPlayed) && // if we've never played
+ (mTimeInParcel > AUTOPLAY_TIME) && // and if we've been here for so many seconds
+ (!this_media_url.empty()) && // and if the parcel has media
+ (stricmp(this_media_type.c_str(), LLMIMETypes::getDefaultMimeType().c_str()) != 0) &&
+ (LLViewerParcelMedia::sMediaImpl.isNull())) // and if the media is not already playing
{
- if (this_media_texture_id.notNull()) // and if the media texture is good
+ if (this_media_texture_id.notNull()) // and if the media texture is good
{
LLViewerMediaTexture *image = LLViewerTextureManager::getMediaTexture(this_media_texture_id, FALSE) ;
diff --git a/indra/newview/llviewerparcelmediaautoplay.h b/indra/newview/llviewerparcelmediaautoplay.h
index 1d80b4756c..40142c1dd1 100644
--- a/indra/newview/llviewerparcelmediaautoplay.h
+++ b/indra/newview/llviewerparcelmediaautoplay.h
@@ -33,7 +33,7 @@
#ifndef LLVIEWERPARCELMEDIAAUTOPLAY_H
#define LLVIEWERPARCELMEDIAAUTOPLAY_H
-#include "lltimer.h"
+#include "lleventtimer.h"
#include "lluuid.h"
// timer to automatically play media
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index a075a706e1..a591cc1e14 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -53,7 +53,7 @@
//#include "llfirstuse.h"
#include "llfloaterbuyland.h"
#include "llfloatergroups.h"
-#include "llfloaternearbymedia.h"
+#include "llpanelnearbymedia.h"
#include "llfloatersellland.h"
#include "llfloatertools.h"
#include "llparcelselection.h"
@@ -1762,6 +1762,12 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use
{
optionally_start_music(music_url);
}
+ else
+ {
+ llinfos << "Stopping parcel music (invalid audio stream URL)" << llendl;
+ // clears the URL
+ gAudiop->startInternetStream(LLStringUtil::null);
+ }
}
else if (!gAudiop->getInternetStreamURL().empty())
{
@@ -1789,12 +1795,13 @@ void optionally_start_music(const std::string& music_url)
{
// only play music when you enter a new parcel if the UI control for this
// was not *explicitly* stopped by the user. (part of SL-4878)
- LLFloaterNearbyMedia *nearby_media_floater = LLFloaterReg::findTypedInstance<LLFloaterNearbyMedia>("nearby_media");
- if ((nearby_media_floater &&
- nearby_media_floater->getParcelAudioAutoStart()) ||
+ LLPanelNearByMedia* nearby_media_panel = gStatusBar->getNearbyMediaPanel();;
+ if ((nearby_media_panel &&
+ nearby_media_panel->getParcelAudioAutoStart()) ||
// or they have expressed no opinion in the UI, but have autoplay on...
- (!nearby_media_floater &&
- gSavedSettings.getBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING)))
+ (!nearby_media_panel &&
+ gSavedSettings.getBOOL(LLViewerMedia::AUTO_PLAY_MEDIA_SETTING) &&
+ gSavedSettings.getBOOL("MediaTentativeAutoPlay")))
{
llinfos << "Starting parcel music " << music_url << llendl;
gAudiop->startInternetStream(music_url);
@@ -2178,7 +2185,8 @@ bool LLViewerParcelMgr::canAgentBuyParcel(LLParcel* parcel, bool forGroup) const
return true; // change this if want to make it gods only
}
- LLViewerRegion* regionp = LLViewerParcelMgr::getInstance()->getSelectionRegion();
+ LLVector3 parcel_coord = parcel->getCenterpoint();
+ LLViewerRegion* regionp = LLWorld::getInstance()->getRegionFromPosAgent(parcel_coord);
if (regionp)
{
U8 sim_access = regionp->getSimAccess();
diff --git a/indra/newview/llviewerparceloverlay.cpp b/indra/newview/llviewerparceloverlay.cpp
index 9de1ef7190..2d17ea7bcd 100644
--- a/indra/newview/llviewerparceloverlay.cpp
+++ b/indra/newview/llviewerparceloverlay.cpp
@@ -43,11 +43,11 @@
#include "v2math.h"
// newview includes
+#include "llagentcamera.h"
#include "llviewertexture.h"
#include "llviewercontrol.h"
#include "llsurface.h"
#include "llviewerregion.h"
-#include "llagent.h"
#include "llviewercamera.h"
#include "llviewertexturelist.h"
#include "llselectmgr.h"
@@ -760,7 +760,7 @@ S32 LLViewerParcelOverlay::renderPropertyLines ()
LLGLDepthTest mDepthTest(GL_TRUE);
// Find camera height off the ground (not from zero)
- F32 ground_height_at_camera = land.resolveHeightGlobal( gAgent.getCameraPositionGlobal() );
+ F32 ground_height_at_camera = land.resolveHeightGlobal( gAgentCamera.getCameraPositionGlobal() );
F32 camera_z = LLViewerCamera::getInstance()->getOrigin().mV[VZ];
F32 camera_height = camera_z - ground_height_at_camera;
@@ -791,7 +791,7 @@ S32 LLViewerParcelOverlay::renderPropertyLines ()
const S32 vertex_per_edge = 3 + 2 * (GRID_STEP-1) + 3;
// Stomp the camera into two dimensions
- LLVector3 camera_region = mRegion->getPosRegionFromGlobal( gAgent.getCameraPositionGlobal() );
+ LLVector3 camera_region = mRegion->getPosRegionFromGlobal( gAgentCamera.getCameraPositionGlobal() );
// Set up a cull plane 2 * PARCEL_GRID_STEP_METERS behind
// the camera. The cull plane normal is the camera's at axis.
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 77d2d493bd..da240cedbb 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -47,8 +47,10 @@
#include "v4math.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llcallingcard.h"
#include "llcaphttpsender.h"
+#include "llcommandhandler.h"
#include "lldir.h"
#include "lleventpoll.h"
#include "llfloatergodtools.h"
@@ -58,6 +60,7 @@
#include "llsdutil.h"
#include "llstartup.h"
#include "lltrans.h"
+#include "llurldispatcher.h"
#include "llviewerobjectlist.h"
#include "llviewerparceloverlay.h"
#include "llvlmanager.h"
@@ -82,6 +85,45 @@ extern BOOL gNoRender;
const F32 WATER_TEXTURE_SCALE = 8.f; // Number of times to repeat the water texture across a region
const S16 MAX_MAP_DIST = 10;
+// support for secondlife:///app/region/{REGION} SLapps
+// N.B. this is defined to work exactly like the classic secondlife://{REGION}
+// However, the later syntax cannot support spaces in the region name because
+// spaces (and %20 chars) are illegal in the hostname of an http URL. Some
+// browsers let you get away with this, but some do not (such as Qt's Webkit).
+// Hence we introduced the newer secondlife:///app/region alternative.
+class LLRegionHandler : public LLCommandHandler
+{
+public:
+ // requests will be throttled from a non-trusted browser
+ LLRegionHandler() : LLCommandHandler("region", UNTRUSTED_THROTTLE) {}
+
+ bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
+ {
+ // make sure that we at least have a region name
+ int num_params = params.size();
+ if (num_params < 1)
+ {
+ return false;
+ }
+
+ // build a secondlife://{PLACE} SLurl from this SLapp
+ std::string url = "secondlife://";
+ for (int i = 0; i < num_params; i++)
+ {
+ if (i > 0)
+ {
+ url += "/";
+ }
+ url += params[i].asString();
+ }
+
+ // Process the SLapp as if it was a secondlife://{PLACE} SLurl
+ LLURLDispatcher::dispatch(url, web, true);
+ return true;
+ }
+};
+LLRegionHandler gRegionHandler;
+
class BaseCapabilitiesComplete : public LLHTTPClient::Responder
{
LOG_CLASS(BaseCapabilitiesComplete);
@@ -174,6 +216,7 @@ LLViewerRegion::LLViewerRegion(const U64 &handle,
mColoName("unknown"),
mProductSKU("unknown"),
mProductName("unknown"),
+ mHttpUrl(""),
mCacheLoaded(FALSE),
mCacheEntriesCount(0),
mCacheID(),
@@ -585,6 +628,26 @@ std::string LLViewerRegion::accessToString(U8 sim_access)
}
// static
+std::string LLViewerRegion::getAccessIcon(U8 sim_access)
+{
+ switch(sim_access)
+ {
+ case SIM_ACCESS_MATURE:
+ return "Parcel_M_Dark";
+
+ case SIM_ACCESS_ADULT:
+ return "Parcel_R_Light";
+
+ case SIM_ACCESS_PG:
+ return "Parcel_PG_Light";
+
+ case SIM_ACCESS_MIN:
+ default:
+ return "";
+ }
+}
+
+// static
std::string LLViewerRegion::accessToShortString(U8 sim_access)
{
switch(sim_access) /* Flawfinder: ignore */
@@ -778,7 +841,7 @@ void LLViewerRegion::calculateCenterGlobal()
void LLViewerRegion::calculateCameraDistance()
{
- mCameraDistanceSquared = (F32)(gAgent.getCameraPositionGlobal() - getCenterGlobal()).magVecSquared();
+ mCameraDistanceSquared = (F32)(gAgentCamera.getCameraPositionGlobal() - getCenterGlobal()).magVecSquared();
}
std::ostream& operator<<(std::ostream &s, const LLViewerRegion &region)
@@ -1493,6 +1556,10 @@ void LLViewerRegion::setCapability(const std::string& name, const std::string& u
else
{
mCapabilities[name] = url;
+ if(name == "GetTexture")
+ {
+ mHttpUrl = url ;
+ }
}
}
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index 49d0900f2a..a9e7ef771c 100644
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -203,6 +203,9 @@ public:
// Returns "M", "PG", "A" etc.
static std::string accessToShortString(U8 sim_access);
+
+ // Return access icon name
+ static std::string getAccessIcon(U8 sim_access);
// helper function which just makes sure all interested parties
// can process the message.
@@ -288,6 +291,7 @@ public:
friend std::ostream& operator<<(std::ostream &s, const LLViewerRegion &region);
/// implements LLCapabilityProvider
virtual std::string getDescription() const;
+ std::string getHttpUrl() const { return mHttpUrl ;}
LLSpatialPartition* getSpatialPartition(U32 type);
public:
@@ -380,6 +384,7 @@ private:
std::string mColoName;
std::string mProductSKU;
std::string mProductName;
+ std::string mHttpUrl ;
// Maps local ids to cache entries.
diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp
index 8059f866ba..bdc34d0f18 100644
--- a/indra/newview/llviewerstats.cpp
+++ b/indra/newview/llviewerstats.cpp
@@ -52,6 +52,7 @@
#include "llsurface.h"
#include "llvlmanager.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llviewercontrol.h"
#include "llfloatertools.h"
#include "lldebugview.h"
@@ -577,11 +578,11 @@ void update_statistics(U32 frame_count)
// make sure we have a valid time delta for this frame
if (gFrameIntervalSeconds > 0.f)
{
- if (gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK)
+ if (gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK)
{
LLViewerStats::getInstance()->incStat(LLViewerStats::ST_MOUSELOOK_SECONDS, gFrameIntervalSeconds);
}
- else if (gAgent.getCameraMode() == CAMERA_MODE_CUSTOMIZE_AVATAR)
+ else if (gAgentCamera.getCameraMode() == CAMERA_MODE_CUSTOMIZE_AVATAR)
{
LLViewerStats::getInstance()->incStat(LLViewerStats::ST_AVATAR_EDIT_SECONDS, gFrameIntervalSeconds);
}
@@ -767,9 +768,11 @@ void send_stats()
system["ram"] = (S32) gSysMemory.getPhysicalMemoryKB();
system["os"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
system["cpu"] = gSysCPU.getCPUString();
+ unsigned char MACAddress[MAC_ADDRESS_BYTES];
+ LLUUID::getNodeID(MACAddress);
std::string macAddressString = llformat("%02x-%02x-%02x-%02x-%02x-%02x",
- gMACAddress[0],gMACAddress[1],gMACAddress[2],
- gMACAddress[3],gMACAddress[4],gMACAddress[5]);
+ MACAddress[0],MACAddress[1],MACAddress[2],
+ MACAddress[3],MACAddress[4],MACAddress[5]);
system["mac_address"] = macAddressString;
system["serial_number"] = LLAppViewer::instance()->getSerialNumber();
std::string gpu_desc = llformat(
@@ -827,7 +830,11 @@ void send_stats()
S32 window_height = gViewerWindow->getWindowHeightRaw();
S32 window_size = (window_width * window_height) / 1024;
misc["string_1"] = llformat("%d", window_size);
- // misc["string_2"] =
+ if (gDebugTimers.find(0) != gDebugTimers.end() && gFrameTimeSeconds > 0)
+ {
+ misc["string_2"] = llformat("Texture Time: %.2f, Total Time: %.2f", gDebugTimers[0].getElapsedTimeF32(), gFrameTimeSeconds);
+ }
+
// misc["int_1"] = LLSD::Integer(gSavedSettings.getU32("RenderQualityPerformance")); // Steve: 1.21
// misc["int_2"] = LLSD::Integer(gFrameStalls); // Steve: 1.21
diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp
index ea8af223c3..59efae4cb2 100644
--- a/indra/newview/llviewertexteditor.cpp
+++ b/indra/newview/llviewertexteditor.cpp
@@ -40,8 +40,8 @@
#include "llfloaterreg.h"
#include "llfloaterworldmap.h"
#include "llfocusmgr.h"
-#include "llinventory.h"
#include "llinventorybridge.h"
+#include "llinventorydefines.h"
#include "llinventorymodel.h"
#include "lllandmark.h"
#include "lllandmarkactions.h"
@@ -524,7 +524,10 @@ LLUIImagePtr LLEmbeddedItems::getItemImage(llwchar ext_char) const
break;
case LLAssetType::AT_SOUND: img_name = "Inv_Sound"; break;
case LLAssetType::AT_CLOTHING: img_name = "Inv_Clothing"; break;
- case LLAssetType::AT_OBJECT: img_name = "Inv_Object"; break;
+ case LLAssetType::AT_OBJECT:
+ img_name = LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS & item->getFlags() ?
+ "Inv_Object_Multi" : "Inv_Object";
+ break;
case LLAssetType::AT_CALLINGCARD: img_name = "Inv_CallingCard"; break;
case LLAssetType::AT_LANDMARK: img_name = "Inv_Landmark"; break;
case LLAssetType::AT_NOTECARD: img_name = "Inv_Notecard"; break;
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index 0ad269392d..9b5b210bf7 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -82,7 +82,7 @@ LLTexturePipelineTester* LLViewerTextureManager::sTesterp = NULL ;
S32 LLViewerTexture::sImageCount = 0;
S32 LLViewerTexture::sRawCount = 0;
S32 LLViewerTexture::sAuxCount = 0;
-LLTimer LLViewerTexture::sEvaluationTimer;
+LLFrameTimer LLViewerTexture::sEvaluationTimer;
F32 LLViewerTexture::sDesiredDiscardBias = 0.f;
F32 LLViewerTexture::sDesiredDiscardScale = 1.1f;
S32 LLViewerTexture::sBoundTextureMemoryInBytes = 0;
@@ -102,7 +102,7 @@ F32 LLViewerTexture::sCurrentTime = 0.0f ;
BOOL LLViewerTexture::sUseTextureAtlas = FALSE ;
const F32 desired_discard_bias_min = -2.0f; // -max number of levels to improve image quality by
-const F32 desired_discard_bias_max = 1.5f; // max number of levels to reduce image quality by
+const F32 desired_discard_bias_max = (F32)MAX_DISCARD_LEVEL; // max number of levels to reduce image quality by
const F64 log_2 = log(2.0);
//----------------------------------------------------------------------------------------------
@@ -293,6 +293,8 @@ void LLViewerTextureManager::init()
}
}
imagep->createGLTexture(0, image_raw);
+ //cache the raw image
+ imagep->setCachedRawImage(0, image_raw) ;
image_raw = NULL;
#else
LLViewerFetchedTexture::sDefaultImagep = LLViewerTextureManager::getFetchedTexture(IMG_DEFAULT, TRUE, LLViewerTexture::BOOST_UI);
@@ -367,7 +369,7 @@ S32 LLViewerTexture::getCategoryFromIndex(S32 index)
}
// tuning params
-const F32 discard_bias_delta = .05f;
+const F32 discard_bias_delta = .25f;
const F32 discard_delta_time = 0.5f;
const S32 min_non_tex_system_mem = (128<<20); // 128 MB
// non-const (used externally
@@ -490,13 +492,16 @@ void LLViewerTexture::init(bool firstinit)
mTextureState = NO_DELETE ;
mDontDiscard = FALSE;
+ mCanResetMaxVirtualSize = true ;
mMaxVirtualSize = 0.f;
mNeedsGLTexture = FALSE ;
mNeedsResetMaxVirtualSize = FALSE ;
mAdditionalDecodePriority = 0.f ;
mParcelMedia = NULL ;
mNumFaces = 0 ;
+ mNumVolumes = 0;
mFaceList.clear() ;
+ mVolumeList.clear();
}
//virtual
@@ -508,7 +513,7 @@ S8 LLViewerTexture::getType() const
void LLViewerTexture::cleanup()
{
mFaceList.clear() ;
-
+ mVolumeList.clear();
if(mGLTexturep)
{
mGLTexturep->cleanup();
@@ -586,6 +591,11 @@ void LLViewerTexture::forceImmediateUpdate()
{
}
+void LLViewerTexture::setResetMaxVirtualSizeFlag(bool flag)
+{
+ mCanResetMaxVirtualSize = flag ;
+}
+
void LLViewerTexture::addTextureStats(F32 virtual_size, BOOL needs_gltexture) const
{
if(needs_gltexture)
@@ -609,7 +619,7 @@ void LLViewerTexture::addTextureStats(F32 virtual_size, BOOL needs_gltexture) co
void LLViewerTexture::resetTextureStats()
{
- mMaxVirtualSize = 0.0f;
+ mMaxVirtualSize = 0.0f ;
mAdditionalDecodePriority = 0.f ;
mNeedsResetMaxVirtualSize = FALSE ;
}
@@ -661,6 +671,42 @@ S32 LLViewerTexture::getNumFaces() const
return mNumFaces ;
}
+
+//virtual
+void LLViewerTexture::addVolume(LLVOVolume* volumep)
+{
+ if( mNumVolumes >= mVolumeList.size())
+ {
+ mVolumeList.resize(2 * mNumVolumes + 1) ;
+ }
+ mVolumeList[mNumVolumes] = volumep ;
+ volumep->setIndexInTex(mNumVolumes) ;
+ mNumVolumes++ ;
+ mLastVolumeListUpdateTimer.reset() ;
+}
+
+//virtual
+void LLViewerTexture::removeVolume(LLVOVolume* volumep)
+{
+ if(mNumVolumes > 1)
+ {
+ S32 index = volumep->getIndexInTex() ;
+ mVolumeList[index] = mVolumeList[--mNumVolumes] ;
+ mVolumeList[index]->setIndexInTex(index) ;
+ }
+ else
+ {
+ mVolumeList.clear() ;
+ mNumVolumes = 0 ;
+ }
+ mLastVolumeListUpdateTimer.reset() ;
+}
+
+S32 LLViewerTexture::getNumVolumes() const
+{
+ return mNumVolumes ;
+}
+
void LLViewerTexture::reorganizeFaceList()
{
static const F32 MAX_WAIT_TIME = 20.f; // seconds
@@ -680,6 +726,27 @@ void LLViewerTexture::reorganizeFaceList()
mFaceList.erase(mFaceList.begin() + mNumFaces, mFaceList.end());
}
+void LLViewerTexture::reorganizeVolumeList()
+{
+ static const F32 MAX_WAIT_TIME = 20.f; // seconds
+ static const U32 MAX_EXTRA_BUFFER_SIZE = 4 ;
+
+ if(mNumVolumes + MAX_EXTRA_BUFFER_SIZE > mVolumeList.size())
+ {
+ return ;
+ }
+
+ if(mLastVolumeListUpdateTimer.getElapsedTimeF32() < MAX_WAIT_TIME)
+ {
+ return ;
+ }
+
+ mLastVolumeListUpdateTimer.reset() ;
+ mVolumeList.erase(mVolumeList.begin() + mNumVolumes, mVolumeList.end());
+}
+
+
+
//virtual
void LLViewerTexture::switchToCachedImage()
{
@@ -715,7 +782,7 @@ void LLViewerTexture::generateGLTexture()
LLImageGL* LLViewerTexture::getGLTexture() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep ;
}
@@ -732,7 +799,7 @@ BOOL LLViewerTexture::createGLTexture()
BOOL LLViewerTexture::createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename, BOOL to_create, S32 category)
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
BOOL ret = mGLTexturep->createGLTexture(discard_level, imageraw, usename, to_create, category) ;
@@ -740,63 +807,69 @@ BOOL LLViewerTexture::createGLTexture(S32 discard_level, const LLImageRaw* image
{
mFullWidth = mGLTexturep->getCurrentWidth() ;
mFullHeight = mGLTexturep->getCurrentHeight() ;
- mComponents = mGLTexturep->getComponents() ;
+ mComponents = mGLTexturep->getComponents() ;
}
return ret ;
}
+//virtual
+void LLViewerTexture::setCachedRawImage(S32 discard_level, LLImageRaw* imageraw)
+{
+ //nothing here.
+}
+
void LLViewerTexture::setExplicitFormat(LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format, BOOL swap_bytes)
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
mGLTexturep->setExplicitFormat(internal_format, primary_format, type_format, swap_bytes) ;
}
void LLViewerTexture::setAddressMode(LLTexUnit::eTextureAddressMode mode)
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
mGLTexturep->setAddressMode(mode) ;
}
void LLViewerTexture::setFilteringOption(LLTexUnit::eTextureFilterOptions option)
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
mGLTexturep->setFilteringOption(option) ;
}
//virtual
S32 LLViewerTexture::getWidth(S32 discard_level) const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getWidth(discard_level) ;
}
//virtual
S32 LLViewerTexture::getHeight(S32 discard_level) const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getHeight(discard_level) ;
}
S32 LLViewerTexture::getMaxDiscardLevel() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getMaxDiscardLevel() ;
}
S32 LLViewerTexture::getDiscardLevel() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getDiscardLevel() ;
}
S8 LLViewerTexture::getComponents() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getComponents() ;
}
LLGLuint LLViewerTexture::getTexName() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getTexName() ;
}
@@ -821,124 +894,124 @@ BOOL LLViewerTexture::getBoundRecently() const
LLTexUnit::eTextureType LLViewerTexture::getTarget(void) const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getTarget() ;
}
BOOL LLViewerTexture::setSubImage(const LLImageRaw* imageraw, S32 x_pos, S32 y_pos, S32 width, S32 height)
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->setSubImage(imageraw, x_pos, y_pos, width, height) ;
}
BOOL LLViewerTexture::setSubImage(const U8* datap, S32 data_width, S32 data_height, S32 x_pos, S32 y_pos, S32 width, S32 height)
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->setSubImage(datap, data_width, data_height, x_pos, y_pos, width, height) ;
}
void LLViewerTexture::setGLTextureCreated (bool initialized)
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
mGLTexturep->setGLTextureCreated (initialized) ;
}
void LLViewerTexture::setCategory(S32 category)
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
mGLTexturep->setCategory(category) ;
}
LLTexUnit::eTextureAddressMode LLViewerTexture::getAddressMode(void) const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getAddressMode() ;
}
S32 LLViewerTexture::getTextureMemory() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->mTextureMemory ;
}
LLGLenum LLViewerTexture::getPrimaryFormat() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getPrimaryFormat() ;
}
BOOL LLViewerTexture::getIsAlphaMask() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getIsAlphaMask() ;
}
BOOL LLViewerTexture::getMask(const LLVector2 &tc)
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getMask(tc) ;
}
F32 LLViewerTexture::getTimePassedSinceLastBound()
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getTimePassedSinceLastBound() ;
}
BOOL LLViewerTexture::getMissed() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getMissed() ;
}
BOOL LLViewerTexture::isJustBound() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->isJustBound() ;
}
void LLViewerTexture::forceUpdateBindStats(void) const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->forceUpdateBindStats() ;
}
U32 LLViewerTexture::getTexelsInAtlas() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getTexelsInAtlas() ;
}
U32 LLViewerTexture::getTexelsInGLTexture() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getTexelsInGLTexture() ;
}
BOOL LLViewerTexture::isGLTextureCreated() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->isGLTextureCreated() ;
}
S32 LLViewerTexture::getDiscardLevelInAtlas() const
{
- llassert_always(mGLTexturep.notNull()) ;
+ llassert(mGLTexturep.notNull()) ;
return mGLTexturep->getDiscardLevelInAtlas() ;
}
@@ -974,12 +1047,6 @@ void LLViewerTexture::updateBindStatsForTester()
//start of LLViewerFetchedTexture
//----------------------------------------------------------------------------------------------
-//static
-F32 LLViewerFetchedTexture::maxDecodePriority()
-{
- return 6000000.f;
-}
-
LLViewerFetchedTexture::LLViewerFetchedTexture(const LLUUID& id, const LLHost& host, BOOL usemipmaps)
: LLViewerTexture(id, usemipmaps),
mTargetHost(host)
@@ -1010,6 +1077,7 @@ void LLViewerFetchedTexture::init(bool firstinit)
mRequestedDiscardLevel = -1;
mRequestedDownloadPriority = 0.f;
mFullyLoaded = FALSE;
+ mCanUseHTTP = true ;
mDesiredDiscardLevel = MAX_DISCARD_LEVEL + 1;
mMinDesiredDiscardLevel = MAX_DISCARD_LEVEL + 1;
@@ -1196,20 +1264,30 @@ void LLViewerFetchedTexture::destroyTexture()
mFullyLoaded = FALSE ;
}
-//
-//do not change the discard level of the loaded texture image.
-BOOL LLViewerFetchedTexture::keepReuestedDiscardLevel()
+void LLViewerFetchedTexture::addToCreateTexture()
{
- if (!mLoadedCallbackList.empty())
+ bool force_update = false ;
+ if (getComponents() != mRawImage->getComponents())
{
- return TRUE ;
- }
+ // We've changed the number of components, so we need to move any
+ // objects using this pool to a different pool.
+ mComponents = mRawImage->getComponents();
+ mGLTexturep->setComponents(mComponents) ;
+ force_update = true ;
- return FALSE ;
-}
+ for(U32 i = 0 ; i < mNumFaces ; i++)
+ {
+ mFaceList[i]->dirtyTexture() ;
+ }
+
+ //discard the cached raw image and the saved raw image
+ mCachedRawImageReady = FALSE ;
+ mCachedRawDiscardLevel = -1 ;
+ mCachedRawImage = NULL ;
+ mSavedRawDiscardLevel = -1 ;
+ mSavedRawImage = NULL ;
+ }
-void LLViewerFetchedTexture::addToCreateTexture()
-{
if(isForSculptOnly())
{
//just update some variables, not to create a real GL texture.
@@ -1217,6 +1295,11 @@ void LLViewerFetchedTexture::addToCreateTexture()
mNeedsCreateTexture = FALSE ;
destroyRawImage();
}
+ else if(!force_update && getDiscardLevel() > -1 && getDiscardLevel() <= mRawDiscardLevel)
+ {
+ mNeedsCreateTexture = FALSE ;
+ destroyRawImage();
+ }
else
{
#if 1
@@ -1225,7 +1308,7 @@ void LLViewerFetchedTexture::addToCreateTexture()
//so do not scale down the over qualified image.
//Note: scaling down image is expensensive. Do it only when very necessary.
//
- if(mRequestedDiscardLevel <= mDesiredDiscardLevel && !keepReuestedDiscardLevel())
+ if(mRequestedDiscardLevel <= mDesiredDiscardLevel && !mForceToSaveRawImage)
{
S32 w = mFullWidth >> mRawDiscardLevel;
S32 h = mFullHeight >> mRawDiscardLevel;
@@ -1338,24 +1421,7 @@ BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/)
setActive() ;
}
- //
- // Iterate through the list of image loading callbacks to see
- // what sort of data they need.
- //
- // *TODO: Fix image callback code
- BOOL imageraw_callbacks = FALSE;
- for(callback_list_t::iterator iter = mLoadedCallbackList.begin();
- iter != mLoadedCallbackList.end(); )
- {
- LLLoadedCallbackEntry *entryp = *iter++;
- if (entryp->mNeedsImageRaw)
- {
- imageraw_callbacks = TRUE;
- break;
- }
- }
-
- if (!imageraw_callbacks)
+ if (!mForceToSaveRawImage)
{
mNeedsAux = FALSE;
destroyRawImage();
@@ -1367,22 +1433,28 @@ BOOL LLViewerFetchedTexture::createTexture(S32 usename/*= 0*/)
//virtual
void LLViewerFetchedTexture::setKnownDrawSize(S32 width, S32 height)
{
- if(mKnownDrawWidth != width || mKnownDrawHeight != height)
+ if(mKnownDrawWidth < width || mKnownDrawHeight < height)
{
- mKnownDrawWidth = width;
- mKnownDrawHeight = height;
+ mKnownDrawWidth = llmax(mKnownDrawWidth, width) ;
+ mKnownDrawHeight = llmax(mKnownDrawHeight, height) ;
mKnownDrawSizeChanged = TRUE ;
mFullyLoaded = FALSE ;
}
- addTextureStats((F32)(width * height));
+ addTextureStats((F32)(mKnownDrawWidth * mKnownDrawHeight));
}
//virtual
void LLViewerFetchedTexture::processTextureStats()
{
- if(mFullyLoaded)//already loaded
+ if(mFullyLoaded)
{
+ if(mDesiredDiscardLevel <= mMinDesiredDiscardLevel)//already loaded
+ {
+ return ;
+ }
+ mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, mMinDesiredDiscardLevel) ;
+ mFullyLoaded = FALSE ;
return ;
}
@@ -1416,6 +1488,7 @@ void LLViewerFetchedTexture::processTextureStats()
mDesiredDiscardLevel = (S8)llmin(log((F32)mFullWidth / mKnownDrawWidth) / log_2,
log((F32)mFullHeight / mKnownDrawHeight) / log_2) ;
mDesiredDiscardLevel = llclamp(mDesiredDiscardLevel, (S8)0, (S8)getMaxDiscardLevel()) ;
+ mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, mMinDesiredDiscardLevel) ;
}
mKnownDrawSizeChanged = FALSE ;
@@ -1426,6 +1499,13 @@ void LLViewerFetchedTexture::processTextureStats()
}
}
+const F32 MAX_PRIORITY_PIXEL = 999.f ; //pixel area
+const F32 PRIORITY_BOOST_LEVEL_FACTOR = 1000.f ; //boost level
+const F32 PRIORITY_DELTA_DISCARD_LEVEL_FACTOR = 100000.f ; //delta discard
+const S32 MAX_DELTA_DISCARD_LEVEL_FOR_PRIORITY = 4 ;
+const F32 PRIORITY_ADDITIONAL_FACTOR = 1000000.f ; //additional
+const S32 MAX_ADDITIONAL_LEVEL_FOR_PRIORITY = 8 ;
+const F32 PRIORITY_BOOST_HIGH_FACTOR = 10000000.f ;//boost high
F32 LLViewerFetchedTexture::calcDecodePriority()
{
#ifndef LL_RELEASE_FOR_DOWNLOAD
@@ -1435,41 +1515,36 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
}
#endif
- if(mFullyLoaded)//already loaded for static texture
- {
- return -4.0f ; //alreay fetched
- }
-
if (mNeedsCreateTexture)
{
return mDecodePriority; // no change while waiting to create
}
- if(mForceToSaveRawImage)
+ if(mFullyLoaded && !mForceToSaveRawImage)//already loaded for static texture
{
- return maxDecodePriority() ;
+ return -1.0f ; //alreay fetched
}
-
- S32 cur_discard = getDiscardLevel();
+
+ S32 cur_discard = getCurrentDiscardLevelForFetching();
bool have_all_data = (cur_discard >= 0 && (cur_discard <= mDesiredDiscardLevel));
F32 pixel_priority = fsqrtf(mMaxVirtualSize);
- F32 priority;
+ F32 priority = 0.f;
if (mIsMissingAsset)
{
priority = 0.0f;
}
else if(mDesiredDiscardLevel >= cur_discard && cur_discard > -1)
{
- priority = -1.0f ;
+ priority = -2.0f ;
}
else if(mCachedRawDiscardLevel > -1 && mDesiredDiscardLevel >= mCachedRawDiscardLevel)
{
- priority = -1.0f;
+ priority = -3.0f;
}
else if (mDesiredDiscardLevel > getMaxDiscardLevel())
{
// Don't decode anything we don't need
- priority = -1.0f;
+ priority = -4.0f;
}
else if ((mBoostLevel == LLViewerTexture::BOOST_UI || mBoostLevel == LLViewerTexture::BOOST_ICON) && !have_all_data)
{
@@ -1483,10 +1558,14 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
// Always want high boosted images
priority = 1.f;
}
+ else if(mForceToSaveRawImage)
+ {
+ //force to fetch the raw image.
+ priority = 1.f;
+ }
else
{
- // Leave the priority as-is
- return mDecodePriority;
+ priority = -5.f; //stop fetching
}
}
else if (cur_discard < 0)
@@ -1496,17 +1575,13 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
static const F64 log_2 = log(2.0);
F32 desired = (F32)(log(32.0/pixel_priority) / log_2);
S32 ddiscard = MAX_DISCARD_LEVEL - (S32)desired;
- ddiscard = llclamp(ddiscard, 0, 4);
- priority = (ddiscard+1)*100000.f;
+ ddiscard = llclamp(ddiscard, 0, MAX_DELTA_DISCARD_LEVEL_FOR_PRIORITY);
+ priority = (ddiscard + 1) * PRIORITY_DELTA_DISCARD_LEVEL_FACTOR;
}
else if ((mMinDiscardLevel > 0) && (cur_discard <= mMinDiscardLevel))
{
// larger mips are corrupted
- priority = -3.0f;
- }
- else if (cur_discard <= mDesiredDiscardLevel)
- {
- priority = -4.0f;
+ priority = -6.0f;
}
else
{
@@ -1523,51 +1598,59 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
// We haven't rendered this in a while, de-prioritize it
desired_discard += 2;
}
- //else
- //{
- // // We haven't rendered this in the last half second, and we have a cached raw image, leave the desired discard as-is
- // desired_discard = cur_discard;
- //}
+ else
+ {
+ // We haven't rendered this in the last half second, and we have a cached raw image, leave the desired discard as-is
+ desired_discard = cur_discard;
+ }
}
S32 ddiscard = cur_discard - desired_discard;
- ddiscard = llclamp(ddiscard, 0, 4);
- priority = (ddiscard+1)*100000.f;
+ ddiscard = llclamp(ddiscard, -1, MAX_DELTA_DISCARD_LEVEL_FOR_PRIORITY);
+ priority = (ddiscard + 1) * PRIORITY_DELTA_DISCARD_LEVEL_FACTOR;
}
// Priority Formula:
// BOOST_HIGH + ADDITIONAL PRI + DELTA DISCARD + BOOST LEVEL + PIXELS
- // [10,000,000] + [1-9,000,000] + [1-400,000] + [1-20,000] + [0-999]
+ // [10,000,000] + [1,000,000-9,000,000] + [100,000-500,000] + [1-20,000] + [0-999]
if (priority > 0.0f)
{
- pixel_priority = llclamp(pixel_priority, 0.0f, 999.f);
+ pixel_priority = llclamp(pixel_priority, 0.0f, MAX_PRIORITY_PIXEL);
- priority = pixel_priority + 1000.f * mBoostLevel;
+ priority += pixel_priority + PRIORITY_BOOST_LEVEL_FACTOR * mBoostLevel;
if ( mBoostLevel > BOOST_HIGH)
{
- priority += 10000000.f;
+ priority += PRIORITY_BOOST_HIGH_FACTOR;
}
if(mAdditionalDecodePriority > 0.0f)
{
- // 1-9
- S32 additional_priority = (S32)(1.0f + mAdditionalDecodePriority*8.0f + .5f); // round
- // priority range += 0-9,000,000
- priority += 1000000.f * (F32)additional_priority;
+ // priority range += 1,000,000.f-9,000,000.f
+ priority += PRIORITY_ADDITIONAL_FACTOR * (1.0 + mAdditionalDecodePriority * MAX_ADDITIONAL_LEVEL_FOR_PRIORITY);
}
}
return priority;
}
+
+//static
+F32 LLViewerFetchedTexture::maxDecodePriority()
+{
+ static const F32 max_priority = PRIORITY_BOOST_HIGH_FACTOR + //boost_high
+ PRIORITY_ADDITIONAL_FACTOR * (MAX_ADDITIONAL_LEVEL_FOR_PRIORITY + 1) + //additional (view dependent factors)
+ PRIORITY_DELTA_DISCARD_LEVEL_FACTOR * (MAX_DELTA_DISCARD_LEVEL_FOR_PRIORITY + 1) + //delta discard
+ PRIORITY_BOOST_LEVEL_FACTOR * (BOOST_MAX_LEVEL - 1) + //boost level
+ MAX_PRIORITY_PIXEL + 1.0f ; //pixel area.
+
+ return max_priority ;
+}
+
//============================================================================
void LLViewerFetchedTexture::setDecodePriority(F32 priority)
{
- //llassert(!mInImageList); // firing a lot, figure out why
- if (mInImageList) // above llassert() softened to a warning
- {
- llwarns << "BAD STUFF! mInImageList" << llendl;
- }
+ llassert(!mInImageList);
+
mDecodePriority = priority;
}
@@ -1587,6 +1670,11 @@ void LLViewerFetchedTexture::updateVirtualSize()
addTextureStats(0.f, FALSE) ;//reset
}
+ if(mForceToSaveRawImage)
+ {
+ setAdditionalDecodePriority(0.75f) ; //boost the fetching priority
+ }
+
for(U32 i = 0 ; i < mNumFaces ; i++)
{
LLFace* facep = mFaceList[i] ;
@@ -1596,8 +1684,31 @@ void LLViewerFetchedTexture::updateVirtualSize()
setAdditionalDecodePriority(facep->getImportanceToCamera()) ;
}
}
- mNeedsResetMaxVirtualSize = TRUE ;
+
+ if(mCanResetMaxVirtualSize)
+ {
+ mNeedsResetMaxVirtualSize = TRUE ;
+ }
reorganizeFaceList() ;
+ reorganizeVolumeList();
+}
+
+S32 LLViewerFetchedTexture::getCurrentDiscardLevelForFetching()
+{
+ S32 current_discard = getDiscardLevel() ;
+ if(mForceToSaveRawImage)
+ {
+ if(mSavedRawDiscardLevel < 0 || current_discard < 0)
+ {
+ current_discard = -1 ;
+ }
+ else
+ {
+ current_discard = llmax(current_discard, mSavedRawDiscardLevel) ;
+ }
+ }
+
+ return current_discard ;
}
bool LLViewerFetchedTexture::updateFetch()
@@ -1636,7 +1747,7 @@ bool LLViewerFetchedTexture::updateFetch()
return false; // process any raw image data in callbacks before replacing
}
- S32 current_discard = getDiscardLevel() ;
+ S32 current_discard = getCurrentDiscardLevelForFetching() ;
S32 desired_discard = getDesiredDiscardLevel();
F32 decode_priority = getDecodePriority();
decode_priority = llmax(decode_priority, 0.0f);
@@ -1646,14 +1757,6 @@ bool LLViewerFetchedTexture::updateFetch()
// Sets mRawDiscardLevel, mRawImage, mAuxRawImage
S32 fetch_discard = current_discard;
- if(mForceToSaveRawImage)
- {
- if(fetch_discard >= 0)
- {
- fetch_discard = llmax(fetch_discard, mSavedRawDiscardLevel) ;
- }
- }
-
if (mRawImage.notNull()) sRawCount--;
if (mAuxRawImage.notNull()) sAuxCount--;
bool finished = LLAppViewer::getTextureFetch()->getRequestFinished(getID(), fetch_discard, mRawImage, mAuxRawImage);
@@ -1666,7 +1769,7 @@ bool LLViewerFetchedTexture::updateFetch()
else
{
mFetchState = LLAppViewer::getTextureFetch()->getFetchState(mID, mDownloadProgress, mRequestedDownloadPriority,
- mFetchPriority, mFetchDeltaTime, mRequestDeltaTime);
+ mFetchPriority, mFetchDeltaTime, mRequestDeltaTime, mCanUseHTTP);
}
// We may have data ready regardless of whether or not we are finished (e.g. waiting on write)
@@ -1681,18 +1784,6 @@ bool LLViewerFetchedTexture::updateFetch()
if ((mRawImage->getDataSize() > 0 && mRawDiscardLevel >= 0) &&
(current_discard < 0 || mRawDiscardLevel < current_discard))
{
- if (getComponents() != mRawImage->getComponents())
- {
- // We've changed the number of components, so we need to move any
- // objects using this pool to a different pool.
- mComponents = mRawImage->getComponents();
- mGLTexturep->setComponents(mComponents) ;
-
- for(U32 i = 0 ; i < mNumFaces ; i++)
- {
- mFaceList[i]->dirtyTexture() ;
- }
- }
mFullWidth = mRawImage->getWidth() << mRawDiscardLevel;
mFullHeight = mRawImage->getHeight() << mRawDiscardLevel;
@@ -1758,18 +1849,6 @@ bool LLViewerFetchedTexture::updateFetch()
}
}
- if (!mDontDiscard)
- {
- if (mBoostLevel == 0)
- {
- desired_discard = llmax(desired_discard, current_discard-1);
- }
- else
- {
- desired_discard = llmax(desired_discard, current_discard-2);
- }
- }
-
bool make_request = true;
if (decode_priority <= 0)
{
@@ -1787,8 +1866,20 @@ bool LLViewerFetchedTexture::updateFetch()
//{
// make_request = false;
//}
- else
+
+ if(make_request)
{
+ //load the texture progressively.
+ S32 delta_level = (mBoostLevel > LLViewerTexture::BOOST_NONE) ? 2 : 1 ;
+ if(current_discard < 0)
+ {
+ desired_discard = llmax(desired_discard, getMaxDiscardLevel() - delta_level);
+ }
+ else
+ {
+ desired_discard = llmax(desired_discard, current_discard - delta_level);
+ }
+
if (mIsFetching)
{
if (mRequestedDiscardLevel <= desired_discard)
@@ -1808,17 +1899,23 @@ bool LLViewerFetchedTexture::updateFetch()
if (make_request)
{
S32 w=0, h=0, c=0;
- if (current_discard >= 0)
+ if (getDiscardLevel() >= 0)
{
w = mGLTexturep->getWidth(0);
h = mGLTexturep->getHeight(0);
c = mComponents;
}
+
+ const U32 override_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel");
+ if (override_tex_discard_level != 0)
+ {
+ desired_discard = override_tex_discard_level;
+ }
// bypass texturefetch directly by pulling from LLTextureCache
bool fetch_request_created = false;
fetch_request_created = LLAppViewer::getTextureFetch()->createRequest(mUrl, getID(),getTargetHost(), decode_priority,
- w, h, c, desired_discard, needsAux());
+ w, h, c, desired_discard, needsAux(), mCanUseHTTP);
if (fetch_request_created)
{
@@ -1826,7 +1923,7 @@ bool LLViewerFetchedTexture::updateFetch()
mIsFetching = TRUE;
mRequestedDiscardLevel = desired_discard;
mFetchState = LLAppViewer::getTextureFetch()->getFetchState(mID, mDownloadProgress, mRequestedDownloadPriority,
- mFetchPriority, mFetchDeltaTime, mRequestDeltaTime);
+ mFetchPriority, mFetchDeltaTime, mRequestDeltaTime, mCanUseHTTP);
}
// if createRequest() failed, we're finishing up a request for this UUID,
@@ -1849,73 +1946,6 @@ bool LLViewerFetchedTexture::updateFetch()
return mIsFetching ? true : false;
}
-//
-//force to fetch a new raw image for this texture
-//
-BOOL LLViewerFetchedTexture::forceFetch()
-{
- if(!mForceToSaveRawImage)
- {
- return false ;
- }
- //if(mDesiredSavedRawDiscardLevel < getDiscardLevel())
- {
- //no need to force fetching. normal fetching flow will do the work.
- //return false ;
- }
- //if (mNeedsCreateTexture)
- {
- // We may be fetching still (e.g. waiting on write)
- // but don't check until we've processed the raw data we have
- //return false;
- }
- if(mIsFetching)
- {
- return false ;
- }
- if (mIsMissingAsset)
- {
- mForceToSaveRawImage = false ;
- llassert_always(!mHasFetcher);
- return false; // skip
- }
- if (!mLoadedCallbackList.empty() && mRawImage.notNull())
- {
- return false; // process any raw image data in callbacks before replacing
- }
- if(mRawImage.notNull() && mRawDiscardLevel <= mDesiredSavedRawDiscardLevel)
- {
- return false ; // mRawImage is enough
- }
-
- S32 desired_discard = mDesiredSavedRawDiscardLevel ;
- S32 current_discard = getDiscardLevel();
-
- bool fetch_request_created = false;
- S32 w=0, h=0, c=0;
- if (current_discard >= 0)
- {
- w = getWidth(0);
- h = getHeight(0);
- c = getComponents();
- }
- setDecodePriority(maxDecodePriority()) ;
- fetch_request_created = LLAppViewer::getTextureFetch()->createRequest(mUrl, getID(),getTargetHost(), getDecodePriority(),
- w, h, c, desired_discard, needsAux());
-
- if (fetch_request_created)
- {
- mHasFetcher = TRUE;
- mIsFetching = TRUE;
- mRequestedDiscardLevel = desired_discard ;
-
- mFetchState = LLAppViewer::getTextureFetch()->getFetchState(mID, mDownloadProgress, mRequestedDownloadPriority,
- mFetchPriority, mFetchDeltaTime, mRequestDeltaTime);
- }
-
- return mIsFetching ? true : false;
-}
-
void LLViewerFetchedTexture::setIsMissingAsset()
{
if (mUrl.empty())
@@ -1957,6 +1987,10 @@ void LLViewerFetchedTexture::setLoadedCallback( loaded_callback_func loaded_call
LLLoadedCallbackEntry* entryp = new LLLoadedCallbackEntry(loaded_callback, discard_level, keep_imageraw, userdata);
mLoadedCallbackList.push_back(entryp);
mNeedsAux |= needs_aux;
+ if(keep_imageraw)
+ {
+ forceToSaveRawImage(discard_level) ;
+ }
if (mNeedsAux && mAuxRawImage.isNull() && getDiscardLevel() >= 0)
{
// We need aux data, but we've already loaded the image, and it didn't have any
@@ -2030,10 +2064,13 @@ bool LLViewerFetchedTexture::doLoadedCallbacks()
bool run_raw_callbacks = false;
bool need_readback = false;
+ mMinDesiredDiscardLevel = MAX_DISCARD_LEVEL + 1;
for(callback_list_t::iterator iter = mLoadedCallbackList.begin();
iter != mLoadedCallbackList.end(); )
{
LLLoadedCallbackEntry *entryp = *iter++;
+ mMinDesiredDiscardLevel = llmin(mMinDesiredDiscardLevel, (S8)entryp->mDesiredDiscard) ;
+
if (entryp->mNeedsImageRaw)
{
if (mNeedsAux)
@@ -2165,6 +2202,7 @@ bool LLViewerFetchedTexture::doLoadedCallbacks()
if (mLoadedCallbackList.empty())
{
gTextureList.mCallbackList.erase(this);
+ mMinDesiredDiscardLevel = MAX_DISCARD_LEVEL + 1;
}
// Done with any raw image data at this point (will be re-created if we still have callbacks)
@@ -2205,8 +2243,15 @@ LLImageRaw* LLViewerFetchedTexture::reloadRawImage(S8 discard_level)
if(mSavedRawDiscardLevel >= 0 && mSavedRawDiscardLevel <= discard_level)
{
- mRawImage = new LLImageRaw(getWidth(discard_level), getHeight(discard_level), getComponents()) ;
- mRawImage->copy(getSavedRawImage()) ;
+ if(mSavedRawDiscardLevel != discard_level)
+ {
+ mRawImage = new LLImageRaw(getWidth(discard_level), getHeight(discard_level), getComponents()) ;
+ mRawImage->copy(getSavedRawImage()) ;
+ }
+ else
+ {
+ mRawImage = getSavedRawImage() ;
+ }
mRawDiscardLevel = discard_level ;
}
else
@@ -2216,13 +2261,18 @@ LLImageRaw* LLViewerFetchedTexture::reloadRawImage(S8 discard_level)
{
mRawImage = mCachedRawImage ;
mRawDiscardLevel = mCachedRawDiscardLevel;
-
- forceToSaveRawImage(discard_level) ;
}
else //cached raw image is good enough, copy it.
{
- mRawImage = new LLImageRaw(getWidth(discard_level), getHeight(discard_level), getComponents()) ;
- mRawImage->copy(mCachedRawImage) ;
+ if(mCachedRawDiscardLevel != discard_level)
+ {
+ mRawImage = new LLImageRaw(getWidth(discard_level), getHeight(discard_level), getComponents()) ;
+ mRawImage->copy(mCachedRawImage) ;
+ }
+ else
+ {
+ mRawImage = mCachedRawImage ;
+ }
mRawDiscardLevel = discard_level ;
}
}
@@ -2238,24 +2288,22 @@ void LLViewerFetchedTexture::destroyRawImage()
if (mRawImage.notNull())
{
- sRawCount--;
- setCachedRawImage() ;
+ sRawCount--;
- if(mForceToSaveRawImage)
+ if(mIsRawImageValid)
{
- saveRawImage() ;
- }
+ if(mForceToSaveRawImage)
+ {
+ saveRawImage() ;
+ }
+ setCachedRawImage() ;
+ }
}
mRawImage = NULL;
mAuxRawImage = NULL;
mIsRawImageValid = FALSE;
mRawDiscardLevel = INVALID_DISCARD_LEVEL;
-
- if(mForceToSaveRawImage)
- {
- forceFetch() ;
- }
}
//use the mCachedRawImage to (re)generate the gl texture.
@@ -2282,6 +2330,18 @@ void LLViewerFetchedTexture::switchToCachedImage()
}
}
+//cache the imageraw forcefully.
+//virtual
+void LLViewerFetchedTexture::setCachedRawImage(S32 discard_level, LLImageRaw* imageraw)
+{
+ if(imageraw != mRawImage.get())
+ {
+ mCachedRawImage = imageraw ;
+ mCachedRawDiscardLevel = discard_level ;
+ mCachedRawImageReady = TRUE ;
+ }
+}
+
void LLViewerFetchedTexture::setCachedRawImage()
{
if(mRawImage == mCachedRawImage)
@@ -2330,17 +2390,12 @@ void LLViewerFetchedTexture::setCachedRawImage()
{
--i ;
}
- //if(mForSculpt)
- //{
- // mRawImage->scaleDownWithoutBlending(w >> i, h >> i) ;
- //}
- //else
- {
- mRawImage->scale(w >> i, h >> i) ;
- }
+
+ mRawImage->scale(w >> i, h >> i) ;
}
mCachedRawImage = mRawImage ;
- mCachedRawDiscardLevel = mRawDiscardLevel + i ;
+ mRawDiscardLevel += i ;
+ mCachedRawDiscardLevel = mRawDiscardLevel ;
}
}
@@ -2361,7 +2416,7 @@ void LLViewerFetchedTexture::checkCachedRawSculptImage()
void LLViewerFetchedTexture::saveRawImage()
{
- if(mRawImage.isNull() || mSavedRawDiscardLevel == mRawDiscardLevel)
+ if(mRawImage.isNull() || mRawImage == mSavedRawImage || (mSavedRawDiscardLevel >= 0 && mSavedRawDiscardLevel <= mRawDiscardLevel))
{
return ;
}
@@ -2379,12 +2434,22 @@ void LLViewerFetchedTexture::saveRawImage()
void LLViewerFetchedTexture::forceToSaveRawImage(S32 desired_discard)
{
- if(!mForceToSaveRawImage && (mDesiredSavedRawDiscardLevel < 0 || mDesiredSavedRawDiscardLevel > desired_discard))
+ if(!mForceToSaveRawImage || mDesiredSavedRawDiscardLevel < 0 || mDesiredSavedRawDiscardLevel > desired_discard)
{
mForceToSaveRawImage = TRUE ;
mDesiredSavedRawDiscardLevel = desired_discard ;
- forceFetch() ;
+ //copy from the cached raw image if exists.
+ if(mCachedRawImage.notNull() && mRawImage.isNull() )
+ {
+ mRawImage = mCachedRawImage ;
+ mRawDiscardLevel = mCachedRawDiscardLevel ;
+
+ saveRawImage() ;
+
+ mRawImage = NULL ;
+ mRawDiscardLevel = INVALID_DISCARD_LEVEL ;
+ }
}
}
void LLViewerFetchedTexture::destroySavedRawImage()
@@ -2410,7 +2475,7 @@ BOOL LLViewerFetchedTexture::hasSavedRawImage() const
F32 LLViewerFetchedTexture::getElapsedLastReferencedSavedRawImageTime() const
{
- return mLastReferencedSavedRawImageTime - sCurrentTime ;
+ return sCurrentTime - mLastReferencedSavedRawImageTime ;
}
//----------------------------------------------------------------------------------------------
//atlasing
@@ -2687,7 +2752,7 @@ void LLViewerLODTexture::processTextureStats()
}
else
{
- if(isLargeImage() && !isJustBound() && mAdditionalDecodePriority < 1.0f)
+ if(isLargeImage() && !isJustBound() && mAdditionalDecodePriority < 0.3f)
{
//if is a big image and not being used recently, nor close to the view point, do not load hi-res data.
mMaxVirtualSize = llmin(mMaxVirtualSize, (F32)LLViewerTexture::sMinLargeImageSize) ;
@@ -2707,7 +2772,7 @@ void LLViewerLODTexture::processTextureStats()
mCalculatedDiscardLevel = discard_level;
}
}
- if (mBoostLevel < LLViewerTexture::BOOST_HIGH)
+ if (mBoostLevel < LLViewerTexture::BOOST_SCULPTED)
{
discard_level += sDesiredDiscardBias;
discard_level *= sDesiredDiscardScale; // scale
@@ -2733,8 +2798,7 @@ void LLViewerLODTexture::processTextureStats()
//
S32 current_discard = getDiscardLevel();
- if ((sDesiredDiscardBias > 0.0f) &&
- (current_discard >= 0 && mDesiredDiscardLevel >= current_discard))
+ if (sDesiredDiscardBias > 0.0f && mBoostLevel < LLViewerTexture::BOOST_SCULPTED && current_discard >= 0)
{
// Limit the amount of GL memory bound each frame
if ( BYTES_TO_MEGA_BYTES(sBoundTextureMemoryInBytes) > sMaxBoundTextureMemInMegaBytes * texmem_middle_bound_scale &&
@@ -2751,6 +2815,11 @@ void LLViewerLODTexture::processTextureStats()
}
}
}
+
+ if(mForceToSaveRawImage && mDesiredSavedRawDiscardLevel >= 0)
+ {
+ mDesiredDiscardLevel = llmin(mDesiredDiscardLevel, (S8)mDesiredSavedRawDiscardLevel) ;
+ }
}
void LLViewerLODTexture::scaleDown()
@@ -2873,12 +2942,11 @@ LLViewerMediaTexture::~LLViewerMediaTexture()
void LLViewerMediaTexture::reinit(BOOL usemipmaps /* = TRUE */)
{
- mGLTexturep = NULL ;
- init(false);
+ llassert(mGLTexturep.notNull()) ;
+
mUseMipMaps = usemipmaps ;
getLastReferencedTimer()->reset() ;
-
- generateGLTexture() ;
+ mGLTexturep->setUseMipMaps(mUseMipMaps) ;
mGLTexturep->setNeedsAlphaAndPickMask(FALSE) ;
}
@@ -2983,6 +3051,10 @@ void LLViewerMediaTexture::initVirtualSize()
void LLViewerMediaTexture::addMediaToFace(LLFace* facep)
{
+ if(facep)
+ {
+ facep->setHasMedia(true) ;
+ }
if(!mIsPlaying)
{
return ; //no need to add the face because the media is not in playing.
@@ -2993,14 +3065,16 @@ void LLViewerMediaTexture::addMediaToFace(LLFace* facep)
void LLViewerMediaTexture::removeMediaFromFace(LLFace* facep)
{
- if(!mIsPlaying)
- {
- return ; //no need to remove the face because the media is not in playing.
- }
if(!facep)
{
return ;
}
+ facep->setHasMedia(false) ;
+
+ if(!mIsPlaying)
+ {
+ return ; //no need to remove the face because the media is not in playing.
+ }
mIsPlaying = FALSE ; //set to remove the media from the face.
switchTexture(facep) ;
@@ -3250,8 +3324,12 @@ F32 LLViewerMediaTexture::getMaxVirtualSize()
}
}
- mNeedsResetMaxVirtualSize = TRUE ;
+ if(mCanResetMaxVirtualSize)
+ {
+ mNeedsResetMaxVirtualSize = TRUE ;
+ }
reorganizeFaceList() ;
+ reorganizeVolumeList();
return mMaxVirtualSize ;
}
diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h
index 79d9c4e7bb..361f56e02f 100644
--- a/indra/newview/llviewertexture.h
+++ b/indra/newview/llviewertexture.h
@@ -134,7 +134,9 @@ public:
static S32 getIndexFromCategory(S32 category) ;
static S32 getCategoryFromIndex(S32 index) ;
- typedef std::vector<LLFace*> ll_face_list_t ;
+ typedef std::vector<LLFace*> ll_face_list_t;
+ typedef std::vector<LLVOVolume*> ll_volume_list_t;
+
protected:
virtual ~LLViewerTexture();
@@ -164,6 +166,7 @@ public:
void addTextureStats(F32 virtual_size, BOOL needs_gltexture = TRUE) const;
void resetTextureStats();
+ void setResetMaxVirtualSizeFlag(bool flag) ;
virtual F32 getMaxVirtualSize() ;
@@ -178,6 +181,11 @@ public:
S32 getNumFaces() const;
const ll_face_list_t* getFaceList() const {return &mFaceList;}
+ virtual void addVolume(LLVOVolume* volumep);
+ virtual void removeVolume(LLVOVolume* volumep);
+ S32 getNumVolumes() const;
+ const ll_volume_list_t* getVolumeList() const { return &mVolumeList; }
+
void generateGLTexture() ;
void destroyGLTexture() ;
@@ -191,6 +199,7 @@ public:
LLGLuint getTexName() const ;
BOOL createGLTexture() ;
BOOL createGLTexture(S32 discard_level, const LLImageRaw* imageraw, S32 usename = 0, BOOL to_create = TRUE, S32 category = LLViewerTexture::OTHER);
+ virtual void setCachedRawImage(S32 discard_level, LLImageRaw* imageraw) ;
void setFilteringOption(LLTexUnit::eTextureFilterOptions option);
void setExplicitFormat(LLGLint internal_format, LLGLenum primary_format, LLGLenum type_format = 0, BOOL swap_bytes = FALSE);
@@ -242,7 +251,7 @@ protected:
void cleanup() ;
void init(bool firstinit) ;
void reorganizeFaceList() ;
-
+ void reorganizeVolumeList() ;
private:
//note: do not make this function public.
/*virtual*/ LLImageGL* getGLTexture() const ;
@@ -255,6 +264,7 @@ protected:
S32 mFullHeight;
BOOL mUseMipMaps ;
S8 mComponents;
+ bool mCanResetMaxVirtualSize;
mutable F32 mMaxVirtualSize; // The largest virtual size of the image, in pixels - how much data to we need?
mutable S8 mNeedsGLTexture;
mutable BOOL mNeedsResetMaxVirtualSize ;
@@ -269,6 +279,10 @@ protected:
U32 mNumFaces ;
LLFrameTimer mLastFaceListUpdateTimer ;
+ ll_volume_list_t mVolumeList;
+ U32 mNumVolumes;
+ LLFrameTimer mLastVolumeListUpdateTimer;
+
//do not use LLPointer here.
LLViewerMediaTexture* mParcelMedia ;
@@ -280,15 +294,15 @@ protected:
INACTIVE, //not be used for the last certain period (i.e., 30 seconds).
ACTIVE, //just being used, can become inactive if not being used for a certain time (10 seconds).
NO_DELETE = 99 //stay in memory, can not be removed.
- } LLGLTexureState;
- LLGLTexureState mTextureState ;
+ } LLGLTextureState;
+ LLGLTextureState mTextureState ;
public:
static const U32 sCurrentFileVersion;
static S32 sImageCount;
static S32 sRawCount;
static S32 sAuxCount;
- static LLTimer sEvaluationTimer;
+ static LLFrameTimer sEvaluationTimer;
static F32 sDesiredDiscardBias;
static F32 sDesiredDiscardScale;
static S32 sBoundTextureMemoryInBytes;
@@ -436,23 +450,26 @@ public:
BOOL isCachedRawImageReady() const {return mCachedRawImageReady ;}
BOOL isRawImageValid()const { return mIsRawImageValid ; }
void forceToSaveRawImage(S32 desired_discard = 0) ;
+ /*virtual*/ void setCachedRawImage(S32 discard_level, LLImageRaw* imageraw) ;
void destroySavedRawImage() ;
LLImageRaw* getSavedRawImage() ;
BOOL hasSavedRawImage() const ;
F32 getElapsedLastReferencedSavedRawImageTime() const ;
BOOL isFullyLoaded() const;
+ BOOL hasFetcher() const { return mHasFetcher;}
+ void setCanUseHTTP(bool can_use_http) {mCanUseHTTP = can_use_http;}
+
protected:
/*virtual*/ void switchToCachedImage();
+ S32 getCurrentDiscardLevelForFetching() ;
private:
void init(bool firstinit) ;
void cleanup() ;
void saveRawImage() ;
- BOOL forceFetch() ;
void setCachedRawImage() ;
- BOOL keepReuestedDiscardLevel();
//for atlas
void resetFaceAtlas() ;
@@ -492,6 +509,7 @@ protected:
S8 mIsRawImageValid;
S8 mHasFetcher; // We've made a fecth request
S8 mIsFetching; // Fetch request is active
+ bool mCanUseHTTP ; //This texture can be fetched through http if true.
mutable S8 mIsMissingAsset; // True if we know that there is no image asset with this image id in the database.
diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp
index ee934ab9c5..1e3311dafe 100644
--- a/indra/newview/llviewertexturelist.cpp
+++ b/indra/newview/llviewertexturelist.cpp
@@ -478,7 +478,7 @@ LLViewerFetchedTexture* LLViewerTextureList::createImage(const LLUUID &image_id,
}
else
{
- //by default, the texure can not be removed from memory even if it is not used.
+ //by default, the texture can not be removed from memory even if it is not used.
//here turn this off
//if this texture should be set to NO_DELETE, call setNoDelete() afterwards.
imagep->forceActive() ;
@@ -502,10 +502,11 @@ void LLViewerTextureList::addImageToList(LLViewerFetchedTexture *image)
{
llerrs << "LLViewerTextureList::addImageToList - Image already in list" << llendl;
}
- if ((mImageList.insert(image)).second != true)
+ if((mImageList.insert(image)).second != true)
{
- llwarns << "BAD STUFF! (mImageList.insert(image)).second != true" << llendl;
+ llerrs << "Error happens when insert image to mImageList!" << llendl ;
}
+
image->setInImageList(TRUE) ;
}
@@ -522,10 +523,11 @@ void LLViewerTextureList::removeImageFromList(LLViewerFetchedTexture *image)
}
llerrs << "LLViewerTextureList::removeImageFromList - Image not in list" << llendl;
}
- if (mImageList.erase(image) != 1)
- {
- llwarns << "BAD STUFF! mImageList.erase(image) != 1" << llendl;
- }
+ if(mImageList.erase(image) != 1)
+ {
+ llerrs << "Error happens when remove image from mImageList!" << llendl ;
+ }
+
image->setInImageList(FALSE) ;
}
diff --git a/indra/newview/llviewervisualparam.cpp b/indra/newview/llviewervisualparam.cpp
index fad398e00b..1dc09a64ac 100644
--- a/indra/newview/llviewervisualparam.cpp
+++ b/indra/newview/llviewervisualparam.cpp
@@ -45,7 +45,7 @@
//-----------------------------------------------------------------------------
LLViewerVisualParamInfo::LLViewerVisualParamInfo()
:
- mWearableType( WT_INVALID ),
+ mWearableType( LLWearableType::WT_INVALID ),
mCrossWearable(FALSE),
mCamDist( 0.5f ),
mCamAngle( 0.f ),
@@ -77,7 +77,7 @@ BOOL LLViewerVisualParamInfo::parseXml(LLXmlTreeNode *node)
static LLStdStringHandle wearable_string = LLXmlTree::addAttributeString("wearable");
if( node->getFastAttributeString( wearable_string, wearable) )
{
- mWearableType = LLWearableDictionary::typeNameToType( wearable );
+ mWearableType = LLWearableType::typeNameToType( wearable );
}
static LLStdStringHandle edit_group_string = LLXmlTree::addAttributeString("edit_group");
@@ -99,8 +99,6 @@ BOOL LLViewerVisualParamInfo::parseXml(LLXmlTreeNode *node)
node->getFastAttributeF32( camera_angle_string, mCamAngle ); // in degrees
static LLStdStringHandle camera_elevation_string = LLXmlTree::addAttributeString("camera_elevation");
node->getFastAttributeF32( camera_elevation_string, mCamElevation );
- static LLStdStringHandle camera_target_string = LLXmlTree::addAttributeString("camera_target");
- node->getFastAttributeString( camera_target_string, mCamTargetName );
mCamAngle += 180;
diff --git a/indra/newview/llviewervisualparam.h b/indra/newview/llviewervisualparam.h
index 1a3975eb99..f38c01fa6c 100644
--- a/indra/newview/llviewervisualparam.h
+++ b/indra/newview/llviewervisualparam.h
@@ -60,7 +60,6 @@ protected:
F32 mCamDist;
F32 mCamAngle; // degrees
F32 mCamElevation;
- std::string mCamTargetName;
F32 mEditGroupDisplayOrder;
BOOL mShowSimple; // show edit controls when in "simple ui" mode?
F32 mSimpleMin; // when in simple UI, apply this minimum, range 0.f to 100.f
@@ -104,7 +103,6 @@ public:
F32 getCameraDistance() const { return getInfo()->mCamDist; }
F32 getCameraAngle() const { return getInfo()->mCamAngle; } // degrees
F32 getCameraElevation() const { return getInfo()->mCamElevation; }
- const std::string& getCameraTargetName() const { return getInfo()->mCamTargetName; }
BOOL getShowSimple() const { return getInfo()->mShowSimple; }
F32 getSimpleMin() const { return getInfo()->mSimpleMin; }
diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp
index 315b7c52cf..c9c0b72528 100644
--- a/indra/newview/llviewerwindow.cpp
+++ b/indra/newview/llviewerwindow.cpp
@@ -44,6 +44,8 @@
#include <fstream>
#include <algorithm>
+#include "llagent.h"
+#include "llagentcamera.h"
#include "llfloaterreg.h"
#include "llpanellogin.h"
#include "llviewerkeyboard.h"
@@ -83,7 +85,6 @@
#include "lltooltip.h"
#include "llmediaentry.h"
#include "llurldispatcher.h"
-#include "llurlsimstring.h"
// newview includes
#include "llagent.h"
@@ -105,7 +106,6 @@
#include "llfloaterbuildoptions.h"
#include "llfloaterbuyland.h"
#include "llfloatercamera.h"
-#include "llfloatercustomize.h"
#include "llfloaterland.h"
#include "llfloaterinspect.h"
#include "llfloatermap.h"
@@ -131,6 +131,7 @@
#include "llmorphview.h"
#include "llmoveview.h"
#include "llnavigationbar.h"
+#include "llpopupview.h"
#include "llpreviewtexture.h"
#include "llprogressview.h"
#include "llresmgr.h"
@@ -200,6 +201,7 @@
#include "llnearbychat.h"
#include "llviewerwindowlistener.h"
+#include "llpaneltopinfobar.h"
#if LL_WINDOWS
#include <tchar.h> // For Unicode conversion methods
@@ -362,9 +364,9 @@ public:
agent_center_text = llformat("AgentCenter %f %f %f",
(F32)(tvector.mdV[VX]), (F32)(tvector.mdV[VY]), (F32)(tvector.mdV[VZ]));
- if (gAgent.getAvatarObject())
+ if (isAgentAvatarValid())
{
- tvector = gAgent.getPosGlobalFromAgent(gAgent.getAvatarObject()->mRoot.getWorldPosition());
+ tvector = gAgent.getPosGlobalFromAgent(gAgentAvatarp->mRoot.getWorldPosition());
agent_root_center_text = llformat("AgentRootCenter %f %f %f",
(F32)(tvector.mdV[VX]), (F32)(tvector.mdV[VY]), (F32)(tvector.mdV[VZ]));
}
@@ -382,7 +384,7 @@ public:
agent_left_text = llformat("AgentLeftAxis %f %f %f",
(F32)(tvector.mdV[VX]), (F32)(tvector.mdV[VY]), (F32)(tvector.mdV[VZ]));
- tvector = gAgent.getCameraPositionGlobal();
+ tvector = gAgentCamera.getCameraPositionGlobal();
camera_center_text = llformat("CameraCenter %f %f %f",
(F32)(tvector.mdV[VX]), (F32)(tvector.mdV[VY]), (F32)(tvector.mdV[VZ]));
@@ -486,6 +488,10 @@ public:
}
ypos += y_inc;
+ addText(xpos, ypos, llformat("UI Verts/Calls: %d/%d", LLRender::sUIVerts, LLRender::sUICalls));
+ LLRender::sUICalls = LLRender::sUIVerts = 0;
+ ypos += y_inc;
+
addText(xpos,ypos, llformat("%d/%d Nodes visible", gPipeline.mNumVisibleNodes, LLSpatialGroup::sNodeCount));
ypos += y_inc;
@@ -615,114 +621,112 @@ BOOL LLViewerWindow::handleAnyMouseClick(LLWindow *window, LLCoordGL pos, MASK
x = llround((F32)x / mDisplayScale.mV[VX]);
y = llround((F32)y / mDisplayScale.mV[VY]);
- if (down)
- {
- buttonstatestr = "down" ;
- }
- else
- {
- buttonstatestr = "up" ;
- }
-
- switch (clicktype)
- {
- case LLMouseHandler::CLICK_LEFT:
- mLeftMouseDown = down;
- buttonname = "Left";
- break;
- case LLMouseHandler::CLICK_RIGHT:
- mRightMouseDown = down;
- buttonname = "Right";
- break;
- case LLMouseHandler::CLICK_MIDDLE:
- mMiddleMouseDown = down;
- buttonname = "Middle";
- break;
- case LLMouseHandler::CLICK_DOUBLELEFT:
- mLeftMouseDown = down;
- buttonname = "Left Double Click";
- break;
- }
-
- LLView::sMouseHandlerMessage.clear();
+ // only send mouse clicks to UI if UI is visible
+ if(gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
+ {
- if (gMenuBarView)
- {
- // stop ALT-key access to menu
- gMenuBarView->resetMenuTrigger();
- }
+ if (down)
+ {
+ buttonstatestr = "down" ;
+ }
+ else
+ {
+ buttonstatestr = "up" ;
+ }
+
+ switch (clicktype)
+ {
+ case LLMouseHandler::CLICK_LEFT:
+ mLeftMouseDown = down;
+ buttonname = "Left";
+ break;
+ case LLMouseHandler::CLICK_RIGHT:
+ mRightMouseDown = down;
+ buttonname = "Right";
+ break;
+ case LLMouseHandler::CLICK_MIDDLE:
+ mMiddleMouseDown = down;
+ buttonname = "Middle";
+ break;
+ case LLMouseHandler::CLICK_DOUBLELEFT:
+ mLeftMouseDown = down;
+ buttonname = "Left Double Click";
+ break;
+ }
+
+ LLView::sMouseHandlerMessage.clear();
- if (gDebugClicks)
- {
- llinfos << "ViewerWindow " << buttonname << " mouse " << buttonstatestr << " at " << x << "," << y << llendl;
- }
+ if (gMenuBarView)
+ {
+ // stop ALT-key access to menu
+ gMenuBarView->resetMenuTrigger();
+ }
- // Make sure we get a corresponding mouseup event, even if the mouse leaves the window
- if (down)
- mWindow->captureMouse();
- else
- mWindow->releaseMouse();
+ if (gDebugClicks)
+ {
+ llinfos << "ViewerWindow " << buttonname << " mouse " << buttonstatestr << " at " << x << "," << y << llendl;
+ }
- // Indicate mouse was active
- LLUI::resetMouseIdleTimer();
+ // Make sure we get a corresponding mouseup event, even if the mouse leaves the window
+ if (down)
+ mWindow->captureMouse();
+ else
+ mWindow->releaseMouse();
- // Don't let the user move the mouse out of the window until mouse up.
- if( LLToolMgr::getInstance()->getCurrentTool()->clipMouseWhenDown() )
- {
- mWindow->setMouseClipping(down);
- }
+ // Indicate mouse was active
+ LLUI::resetMouseIdleTimer();
- LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture();
- if( mouse_captor )
- {
- S32 local_x;
- S32 local_y;
- mouse_captor->screenPointToLocal( x, y, &local_x, &local_y );
- if (LLView::sDebugMouseHandling)
+ // Don't let the user move the mouse out of the window until mouse up.
+ if( LLToolMgr::getInstance()->getCurrentTool()->clipMouseWhenDown() )
{
- llinfos << buttonname << " Mouse " << buttonstatestr << " handled by captor " << mouse_captor->getName() << llendl;
+ mWindow->setMouseClipping(down);
}
- return mouse_captor->handleAnyMouseClick(local_x, local_y, mask, clicktype, down);
- }
- // Topmost view gets a chance before the hierarchy
- LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl();
- if (top_ctrl)
- {
- S32 local_x, local_y;
- top_ctrl->screenPointToLocal( x, y, &local_x, &local_y );
- if (down)
+ LLMouseHandler* mouse_captor = gFocusMgr.getMouseCapture();
+ if( mouse_captor )
{
- if (top_ctrl->pointInView(local_x, local_y))
- {
- return top_ctrl->handleAnyMouseClick(local_x, local_y, mask, clicktype, down) ;
- }
- else
+ S32 local_x;
+ S32 local_y;
+ mouse_captor->screenPointToLocal( x, y, &local_x, &local_y );
+ if (LLView::sDebugMouseHandling)
{
- gFocusMgr.setTopCtrl(NULL);
+ llinfos << buttonname << " Mouse " << buttonstatestr << " handled by captor " << mouse_captor->getName() << llendl;
}
+ return mouse_captor->handleAnyMouseClick(local_x, local_y, mask, clicktype, down);
}
- else
+
+ // Topmost view gets a chance before the hierarchy
+ //LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl();
+ //if (top_ctrl)
+ //{
+ // S32 local_x, local_y;
+ // top_ctrl->screenPointToLocal( x, y, &local_x, &local_y );
+ // if (top_ctrl->pointInView(local_x, local_y))
+ // {
+ // return top_ctrl->handleAnyMouseClick(local_x, local_y, mask, clicktype, down) ;
+ // }
+ // else
+ // {
+ // if (down)
+ // {
+ // gFocusMgr.setTopCtrl(NULL);
+ // }
+ // }
+ //}
+
+ // Give the UI views a chance to process the click
+ if( mRootView->handleAnyMouseClick(x, y, mask, clicktype, down) )
{
- if (top_ctrl->pointInView(local_x, local_y) && top_ctrl->handleMouseUp(local_x, local_y, mask))
+ if (LLView::sDebugMouseHandling)
{
- return TRUE;
+ llinfos << buttonname << " Mouse " << buttonstatestr << " " << LLView::sMouseHandlerMessage << llendl;
}
+ return TRUE;
}
- }
-
- // Give the UI views a chance to process the click
- if( mRootView->handleAnyMouseClick(x, y, mask, clicktype, down) )
- {
- if (LLView::sDebugMouseHandling)
+ else if (LLView::sDebugMouseHandling)
{
- llinfos << buttonname << " Mouse " << buttonstatestr << " " << LLView::sMouseHandlerMessage << llendl;
+ llinfos << buttonname << " Mouse " << buttonstatestr << " not handled by view" << llendl;
}
- return TRUE;
- }
- else if (LLView::sDebugMouseHandling)
- {
- llinfos << buttonname << " Mouse " << buttonstatestr << " not handled by view" << llendl;
}
// Do not allow tool manager to handle mouseclicks if we have disconnected
@@ -778,7 +782,7 @@ BOOL LLViewerWindow::handleRightMouseDown(LLWindow *window, LLCoordGL pos, MASK
// *HACK: this should be rolled into the composite tool logic, not
// hardcoded at the top level.
- if (CAMERA_MODE_CUSTOMIZE_AVATAR != gAgent.getCameraMode() && LLToolMgr::getInstance()->getCurrentTool() != LLToolPie::getInstance())
+ if (CAMERA_MODE_CUSTOMIZE_AVATAR != gAgentCamera.getCameraMode() && LLToolMgr::getInstance()->getCurrentTool() != LLToolPie::getInstance())
{
// If the current tool didn't process the click, we should show
// the pie menu. This can be done by passing the event to the pie
@@ -799,7 +803,7 @@ BOOL LLViewerWindow::handleRightMouseUp(LLWindow *window, LLCoordGL pos, MASK m
BOOL LLViewerWindow::handleMiddleMouseDown(LLWindow *window, LLCoordGL pos, MASK mask)
{
BOOL down = TRUE;
- gVoiceClient->middleMouseState(true);
+ LLVoiceClient::getInstance()->middleMouseState(true);
handleAnyMouseClick(window,pos,mask,LLMouseHandler::CLICK_MIDDLE,down);
// Always handled as far as the OS is concerned.
@@ -826,18 +830,16 @@ LLWindowCallbacks::DragNDropResult LLViewerWindow::handleDragNDrop( LLWindow *wi
if (slurl_dnd_enabled)
{
- // special case SLURLs
- if ( LLSLURL::isSLURL( data ) )
+ LLSLURL dropped_slurl(data);
+ if(dropped_slurl.isSpatial())
{
if (drop)
{
- LLURLDispatcher::dispatch( data, NULL, true );
- LLURLSimString::setStringRaw( LLSLURL::stripProtocol( data ) );
- LLPanelLogin::refreshLocation( true );
- LLPanelLogin::updateLocationUI();
+ LLURLDispatcher::dispatch( dropped_slurl.getSLURLString(), NULL, true );
+ return LLWindowCallbacks::DND_MOVE;
}
- return LLWindowCallbacks::DND_MOVE;
- };
+ return LLWindowCallbacks::DND_COPY;
+ }
}
if (prim_media_dnd_enabled)
@@ -852,39 +854,51 @@ LLWindowCallbacks::DragNDropResult LLViewerWindow::handleDragNDrop( LLWindow *wi
LLVOVolume *obj = dynamic_cast<LLVOVolume*>(static_cast<LLViewerObject*>(pick_info.getObject()));
- if (obj && obj->permModify() && !obj->getRegion()->getCapability("ObjectMedia").empty())
+ if (obj && !obj->getRegion()->getCapability("ObjectMedia").empty())
{
LLTextureEntry *te = obj->getTE(object_face);
- if (te)
+
+ // can modify URL if we can modify the object or we have navigate permissions
+ bool allow_modify_url = obj->permModify() || obj->hasMediaPermission( te->getMediaData(), LLVOVolume::MEDIA_PERM_INTERACT );
+
+ if (te && allow_modify_url )
{
if (drop)
{
- if (! te->hasMedia())
+ // object does NOT have media already
+ if ( ! te->hasMedia() )
{
- // Create new media entry
- LLSD media_data;
- // XXX Should we really do Home URL too?
- media_data[LLMediaEntry::HOME_URL_KEY] = url;
- media_data[LLMediaEntry::CURRENT_URL_KEY] = url;
- media_data[LLMediaEntry::AUTO_PLAY_KEY] = true;
- obj->syncMediaData(object_face, media_data, true, true);
- // XXX This shouldn't be necessary, should it ?!?
- if (obj->getMediaImpl(object_face))
- obj->getMediaImpl(object_face)->navigateReload();
- obj->sendMediaDataUpdate();
-
- result = LLWindowCallbacks::DND_COPY;
+ // we are allowed to modify the object
+ if ( obj->permModify() )
+ {
+ // Create new media entry
+ LLSD media_data;
+ // XXX Should we really do Home URL too?
+ media_data[LLMediaEntry::HOME_URL_KEY] = url;
+ media_data[LLMediaEntry::CURRENT_URL_KEY] = url;
+ media_data[LLMediaEntry::AUTO_PLAY_KEY] = true;
+ obj->syncMediaData(object_face, media_data, true, true);
+ // XXX This shouldn't be necessary, should it ?!?
+ if (obj->getMediaImpl(object_face))
+ obj->getMediaImpl(object_face)->navigateReload();
+ obj->sendMediaDataUpdate();
+
+ result = LLWindowCallbacks::DND_COPY;
+ }
}
- else {
- // Check the whitelist
- if (te->getMediaData()->checkCandidateUrl(url))
+ else
+ // object HAS media already
+ {
+ // URL passes the whitelist
+ if (te->getMediaData()->checkCandidateUrl( url ) )
{
// just navigate to the URL
if (obj->getMediaImpl(object_face))
{
obj->getMediaImpl(object_face)->navigateTo(url);
}
- else {
+ else
+ {
// This is very strange. Navigation should
// happen via the Impl, but we don't have one.
// This sends it to the server, which /should/
@@ -895,13 +909,15 @@ LLWindowCallbacks::DragNDropResult LLViewerWindow::handleDragNDrop( LLWindow *wi
obj->sendMediaDataUpdate();
}
result = LLWindowCallbacks::DND_LINK;
+
}
}
LLSelectMgr::getInstance()->unhighlightObjectOnly(mDragHoveredObject);
mDragHoveredObject = NULL;
}
- else {
+ else
+ {
// Check the whitelist, if there's media (otherwise just show it)
if (te->getMediaData() == NULL || te->getMediaData()->checkCandidateUrl(url))
{
@@ -913,6 +929,7 @@ LLWindowCallbacks::DragNDropResult LLViewerWindow::handleDragNDrop( LLWindow *wi
LLSelectMgr::getInstance()->highlightObjectOnly(mDragHoveredObject);
}
result = (! te->hasMedia()) ? LLWindowCallbacks::DND_COPY : LLWindowCallbacks::DND_LINK;
+
}
}
}
@@ -940,7 +957,7 @@ LLWindowCallbacks::DragNDropResult LLViewerWindow::handleDragNDrop( LLWindow *wi
BOOL LLViewerWindow::handleMiddleMouseUp(LLWindow *window, LLCoordGL pos, MASK mask)
{
BOOL down = FALSE;
- gVoiceClient->middleMouseState(false);
+ LLVoiceClient::getInstance()->middleMouseState(false);
handleAnyMouseClick(window,pos,mask,LLMouseHandler::CLICK_MIDDLE,down);
// Always handled as far as the OS is concerned.
@@ -982,6 +999,7 @@ void LLViewerWindow::handleMouseLeave(LLWindow *window)
// Note: we won't get this if we have captured the mouse.
llassert( gFocusMgr.getMouseCapture() == NULL );
mMouseInWindow = FALSE;
+ LLToolTipMgr::instance().blockToolTips();
}
BOOL LLViewerWindow::handleCloseRequest(LLWindow *window)
@@ -1056,7 +1074,7 @@ void LLViewerWindow::handleFocusLost(LLWindow *window)
BOOL LLViewerWindow::handleTranslatedKeyDown(KEY key, MASK mask, BOOL repeated)
{
// Let the voice chat code check for its PTT key. Note that this never affects event processing.
- gVoiceClient->keyDown(key, mask);
+ LLVoiceClient::getInstance()->keyDown(key, mask);
if (gAwayTimer.getElapsedTimeF32() > MIN_AFK_TIME)
{
@@ -1078,7 +1096,7 @@ BOOL LLViewerWindow::handleTranslatedKeyDown(KEY key, MASK mask, BOOL repeated)
BOOL LLViewerWindow::handleTranslatedKeyUp(KEY key, MASK mask)
{
// Let the voice chat code check for its PTT key. Note that this never affects event processing.
- gVoiceClient->keyUp(key, mask);
+ LLVoiceClient::getInstance()->keyUp(key, mask);
return FALSE;
}
@@ -1100,28 +1118,7 @@ BOOL LLViewerWindow::handleActivate(LLWindow *window, BOOL activated)
mActive = TRUE;
send_agent_resume();
gAgent.clearAFK();
- if (mWindow->getFullscreen() && !mIgnoreActivate)
- {
- if (!LLApp::isExiting() )
- {
- if (LLStartUp::getStartupState() >= STATE_STARTED)
- {
- // if we're in world, show a progress bar to hide reloading of textures
- llinfos << "Restoring GL during activate" << llendl;
- restoreGL("Restoring...");
- }
- else
- {
- // otherwise restore immediately
- restoreGL();
- }
- }
- else
- {
- llwarns << "Activating while quitting" << llendl;
- }
- }
-
+
// Unmute audio
audio_update_volume();
}
@@ -1135,18 +1132,13 @@ BOOL LLViewerWindow::handleActivate(LLWindow *window, BOOL activated)
}
// SL-53351: Make sure we're not in mouselook when minimised, to prevent control issues
- if (gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK)
+ if (gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK)
{
- gAgent.changeCameraToDefault();
+ gAgentCamera.changeCameraToDefault();
}
send_agent_pause();
-
- if (mWindow->getFullscreen() && !mIgnoreActivate)
- {
- llinfos << "Stopping GL during deactivation" << llendl;
- stopGL();
- }
+
// Mute audio
audio_update_volume();
}
@@ -1155,7 +1147,7 @@ BOOL LLViewerWindow::handleActivate(LLWindow *window, BOOL activated)
BOOL LLViewerWindow::handleActivateApp(LLWindow *window, BOOL activating)
{
- //if (!activating) gAgent.changeCameraToDefault();
+ //if (!activating) gAgentCamera.changeCameraToDefault();
LLViewerJoystick::getInstance()->setNeedsReset(true);
return FALSE;
@@ -1313,12 +1305,10 @@ LLViewerWindow::LLViewerWindow(
const std::string& title, const std::string& name,
S32 x, S32 y,
S32 width, S32 height,
- BOOL fullscreen, BOOL ignore_pixel_depth)
+ BOOL fullscreen, BOOL ignore_pixel_depth) // fullscreen is no longer used
:
mWindow(NULL),
mActive(TRUE),
- mWantFullscreen(fullscreen),
- mShowFullscreenProgress(FALSE),
mWindowRectRaw(0, height, width, 0),
mWindowRectScaled(0, height, width, 0),
mWorldViewRectRaw(0, height, width, 0),
@@ -1333,9 +1323,9 @@ LLViewerWindow::LLViewerWindow(
mIgnoreActivate( FALSE ),
mResDirty(false),
mStatesDirty(false),
- mIsFullscreenChecked(false),
mCurrResolutionIndex(0),
- mViewerWindowListener(new LLViewerWindowListener(this))
+ mViewerWindowListener(new LLViewerWindowListener(this)),
+ mProgressView(NULL)
{
LLNotificationChannel::buildChannel("VW_alerts", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alert"));
LLNotificationChannel::buildChannel("VW_alertmodal", "Visible", LLNotificationFilters::filterBy<std::string>(&LLNotification::getType, "alertmodal"));
@@ -1368,7 +1358,7 @@ LLViewerWindow::LLViewerWindow(
if (NULL == mWindow)
{
- LLSplashScreen::update("Shutting down...");
+ LLSplashScreen::update(LLTrans::getString("ShuttingDown"));
#if LL_LINUX || LL_SOLARIS
llwarns << "Unable to create window, be sure screen is set at 32-bit color and your graphics driver is configured correctly. See README-linux.txt or README-solaris.txt for further information."
<< llendl;
@@ -1414,6 +1404,7 @@ LLViewerWindow::LLViewerWindow(
if (LLFeatureManager::getInstance()->isSafe()
|| (gSavedSettings.getS32("LastFeatureVersion") != LLFeatureManager::getInstance()->getVersion())
+ || (gSavedSettings.getS32("LastGPUClass") != LLFeatureManager::getInstance()->getGPUClass())
|| (gSavedSettings.getBOOL("ProbeHardwareOnStartup")))
{
LLFeatureManager::getInstance()->applyRecommendedSettings();
@@ -1537,11 +1528,13 @@ void LLViewerWindow::initBase()
mWorldViewPlaceholder = main_view->getChildView("world_view_rect")->getHandle();
mNonSideTrayView = main_view->getChildView("non_side_tray_view")->getHandle();
mFloaterViewHolder = main_view->getChildView("floater_view_holder")->getHandle();
+ mPopupView = main_view->getChild<LLPopupView>("popup_holder");
// Constrain floaters to inside the menu and status bar regions.
gFloaterView = main_view->getChild<LLFloaterView>("Floater View");
gSnapshotFloaterView = main_view->getChild<LLSnapshotFloaterView>("Snapshot Floater View");
+
// Console
llassert( !gConsole );
LLConsole::Params cp;
@@ -1569,9 +1562,11 @@ void LLViewerWindow::initBase()
gDebugView->init();
gToolTipView = getRootView()->getChild<LLToolTipView>("tooltip view");
+ // Initialize busy response message when logged in
+ LLAppViewer::instance()->setOnLoginCompletedCallback(boost::bind(&LLFloaterPreference::initBusyResponse));
+
// Add the progress bar view (startup view), which overrides everything
- mProgressView = new LLProgressView(full_window);
- getRootView()->addChild(mProgressView);
+ mProgressView = getRootView()->getChild<LLProgressView>("progress_view");
setShowProgress(FALSE);
setProgressCancelButtonVisible(FALSE);
@@ -1590,8 +1585,8 @@ void LLViewerWindow::initWorldUI()
gIMMgr = LLIMMgr::getInstance();
- getRootView()->sendChildToFront(gFloaterView);
- getRootView()->sendChildToFront(gSnapshotFloaterView);
+ //getRootView()->sendChildToFront(gFloaterView);
+ //getRootView()->sendChildToFront(gSnapshotFloaterView);
// new bottom panel
LLPanel* bottom_tray_container = getRootView()->getChild<LLPanel>("bottom_tray_container");
@@ -1649,24 +1644,18 @@ void LLViewerWindow::initWorldUI()
navbar->showFavoritesPanel(FALSE);
}
- if (!gSavedSettings.getBOOL("ShowCameraButton"))
- {
- LLBottomTray::getInstance()->showCameraButton(FALSE);
- }
+ // Top Info bar
+ LLPanel* topinfo_bar_container = getRootView()->getChild<LLPanel>("topinfo_bar_container");
+ LLPanelTopInfoBar* topinfo_bar = LLPanelTopInfoBar::getInstance();
- if (!gSavedSettings.getBOOL("ShowSnapshotButton"))
- {
- LLBottomTray::getInstance()->showSnapshotButton(FALSE);
- }
+ topinfo_bar->setShape(topinfo_bar_container->getLocalRect());
- if (!gSavedSettings.getBOOL("ShowMoveButton"))
- {
- LLBottomTray::getInstance()->showMoveButton(FALSE);
- }
+ topinfo_bar_container->addChild(topinfo_bar);
+ topinfo_bar_container->setVisible(TRUE);
- if (!gSavedSettings.getBOOL("ShowGestureButton"))
+ if (!gSavedSettings.getBOOL("ShowMiniLocationPanel"))
{
- LLBottomTray::getInstance()->showGestureButton(FALSE);
+ topinfo_bar->setVisible(FALSE);
}
if ( gHUDView == NULL )
@@ -1726,7 +1715,11 @@ void LLViewerWindow::shutdownViews()
// destroy the nav bar, not currently part of gViewerWindow
// *TODO: Make LLNavigationBar part of gViewerWindow
delete LLNavigationBar::getInstance();
-
+
+ // destroy menus after instantiating navbar above, as it needs
+ // access to gMenuHolder
+ cleanup_menus();
+
// Delete all child views.
delete mRootView;
mRootView = NULL;
@@ -1889,24 +1882,17 @@ void LLViewerWindow::reshape(S32 width, S32 height)
sendShapeToSim();
-
- // store the mode the user wants (even if not there yet)
- gSavedSettings.setBOOL("WindowFullScreen", mWantFullscreen);
-
// store new settings for the mode we are in, regardless
- if (!mWindow->getFullscreen())
- {
- // Only save size if not maximized
- BOOL maximized = mWindow->getMaximized();
- gSavedSettings.setBOOL("WindowMaximized", maximized);
+ // Only save size if not maximized
+ BOOL maximized = mWindow->getMaximized();
+ gSavedSettings.setBOOL("WindowMaximized", maximized);
- LLCoordScreen window_size;
- if (!maximized
- && mWindow->getSize(&window_size))
- {
- gSavedSettings.setS32("WindowWidth", window_size.mX);
- gSavedSettings.setS32("WindowHeight", window_size.mY);
- }
+ LLCoordScreen window_size;
+ if (!maximized
+ && mWindow->getSize(&window_size))
+ {
+ gSavedSettings.setS32("WindowWidth", window_size.mX);
+ gSavedSettings.setS32("WindowHeight", window_size.mY);
}
LLViewerStats::getInstance()->setStat(LLViewerStats::ST_WINDOW_WIDTH, (F64)width);
@@ -1931,7 +1917,7 @@ void LLViewerWindow::setNormalControlsVisible( BOOL visible )
// ...and set the menu color appropriately.
setMenuBackgroundColor(gAgent.getGodLevel() > GOD_NOT,
- LLViewerLogin::getInstance()->isInProductionGrid());
+ LLGridManager::getInstance()->isInProductionGrid());
}
if ( gStatusBar )
@@ -1952,15 +1938,15 @@ void LLViewerWindow::setMenuBackgroundColor(bool god_mode, bool dev_grid)
LLSD args;
LLColor4 new_bg_color;
- if(god_mode && LLViewerLogin::getInstance()->isInProductionGrid())
+ if(god_mode && LLGridManager::getInstance()->isInProductionGrid())
{
new_bg_color = LLUIColorTable::instance().getColor( "MenuBarGodBgColor" );
}
- else if(god_mode && !LLViewerLogin::getInstance()->isInProductionGrid())
+ else if(god_mode && !LLGridManager::getInstance()->isInProductionGrid())
{
new_bg_color = LLUIColorTable::instance().getColor( "MenuNonProductionGodBgColor" );
}
- else if(!god_mode && !LLViewerLogin::getInstance()->isInProductionGrid())
+ else if(!god_mode && !LLGridManager::getInstance()->isInProductionGrid())
{
new_bg_color = LLUIColorTable::instance().getColor( "MenuNonProductionBgColor" );
}
@@ -1984,21 +1970,24 @@ void LLViewerWindow::drawDebugText()
{
gGL.color4f(1,1,1,1);
gGL.pushMatrix();
+ gGL.pushUIMatrix();
{
// scale view by UI global scale factor and aspect ratio correction factor
- glScalef(mDisplayScale.mV[VX], mDisplayScale.mV[VY], 1.f);
+ gGL.scaleUI(mDisplayScale.mV[VX], mDisplayScale.mV[VY], 1.f);
mDebugText->draw();
}
+ gGL.popUIMatrix();
gGL.popMatrix();
+
gGL.flush();
}
void LLViewerWindow::draw()
{
-#if LL_DEBUG
+//#if LL_DEBUG
LLView::sIsDrawing = TRUE;
-#endif
+//#endif
stop_glerror();
LLUI::setLineWidth(1.f);
@@ -2037,9 +2026,11 @@ void LLViewerWindow::draw()
// No translation needed, this view is glued to 0,0
gGL.pushMatrix();
+ LLUI::pushMatrix();
{
+
// scale view by UI global scale factor and aspect ratio correction factor
- glScalef(mDisplayScale.mV[VX], mDisplayScale.mV[VY], 1.f);
+ gGL.scaleUI(mDisplayScale.mV[VX], mDisplayScale.mV[VY], 1.f);
LLVector2 old_scale_factor = LLUI::sGLScaleFactor;
// apply camera zoom transform (for high res screenshots)
@@ -2061,7 +2052,7 @@ void LLViewerWindow::draw()
// Draw tool specific overlay on world
LLToolMgr::getInstance()->getCurrentTool()->draw();
- if( gAgent.cameraMouselook() )
+ if( gAgentCamera.cameraMouselook() || LLFloaterCamera::inFreeCameraMode() )
{
drawMouselookInstructions();
stop_glerror();
@@ -2105,22 +2096,25 @@ void LLViewerWindow::draw()
LLUI::sGLScaleFactor = old_scale_factor;
}
+ LLUI::popMatrix();
gGL.popMatrix();
-#if LL_DEBUG
+//#if LL_DEBUG
LLView::sIsDrawing = FALSE;
-#endif
+//#endif
}
// Takes a single keydown event, usually when UI is visible
BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
{
+ // hide tooltips on keypress
+ LLToolTipMgr::instance().blockToolTips();
+
if (gFocusMgr.getKeyboardFocus()
&& !(mask & (MASK_CONTROL | MASK_ALT))
&& !gFocusMgr.getKeystrokesOnly())
{
// We have keyboard focus, and it's not an accelerator
-
if (key < 0x80)
{
// Not a special key, so likely (we hope) to generate a character. Let it fall through to character handler first.
@@ -2128,68 +2122,48 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
}
}
- // hide tooltips on keypress
- LLToolTipMgr::instance().blockToolTips();
-
- // Explicit hack for debug menu.
- if ((MASK_ALT & mask) &&
- (MASK_CONTROL & mask) &&
- ('D' == key || 'd' == key))
+ // let menus handle navigation keys for navigation
+ if ((gMenuBarView && gMenuBarView->handleKey(key, mask, TRUE))
+ ||(gLoginMenuBarView && gLoginMenuBarView->handleKey(key, mask, TRUE))
+ ||(gMenuHolder && gMenuHolder->handleKey(key, mask, TRUE)))
{
- toggle_debug_menus(NULL);
+ return TRUE;
}
- // Explicit hack for debug menu.
- if ((mask == (MASK_SHIFT | MASK_CONTROL)) &&
- ('G' == key || 'g' == key))
+ // give menus a chance to handle modified (Ctrl, Alt) shortcut keys before current focus
+ // as long as focus isn't locked
+ if (mask & (MASK_CONTROL | MASK_ALT) && !gFocusMgr.focusLocked())
{
- if (LLStartUp::getStartupState() < STATE_LOGIN_CLEANUP) //on splash page
+ if ((gMenuBarView && gMenuBarView->handleAcceleratorKey(key, mask))
+ ||(gLoginMenuBarView && gLoginMenuBarView->handleAcceleratorKey(key, mask)))
{
- BOOL visible = ! gSavedSettings.getBOOL("ForceShowGrid");
- gSavedSettings.setBOOL("ForceShowGrid", visible);
-
- // Initialize visibility (and don't force visibility - use prefs)
- LLPanelLogin::refreshLocation( false );
+ return TRUE;
}
}
- // Debugging view for unified notifications: CTRL-SHIFT-5
- // *FIXME: Having this special-cased right here (just so this can be invoked from the login screen) sucks.
- if ((MASK_SHIFT & mask)
- && (!(MASK_ALT & mask))
- && (MASK_CONTROL & mask)
- && ('5' == key))
+ // give floaters first chance to handle TAB key
+ // so frontmost floater gets focus
+ // if nothing has focus, go to first or last UI element as appropriate
+ if (key == KEY_TAB && (mask & MASK_CONTROL || gFocusMgr.getKeyboardFocus() == NULL))
{
- //LLFloaterNotificationConsole::showInstance();
- LLFloaterReg::showInstance("notifications_console");
- return TRUE;
- }
-
- // handle escape key
- //if (key == KEY_ESCAPE && mask == MASK_NONE)
- //{
+ if (gMenuHolder) gMenuHolder->hideMenus();
- // *TODO: get this to play well with mouselook and hidden
- // cursor modes, etc, and re-enable.
- //if (gFocusMgr.getMouseCapture())
- //{
- // gFocusMgr.setMouseCapture(NULL);
- // return TRUE;
- //}
- //}
+ // if CTRL-tabbing (and not just TAB with no focus), go into window cycle mode
+ gFloaterView->setCycleMode((mask & MASK_CONTROL) != 0);
- // let menus handle navigation keys
- if (gMenuBarView && gMenuBarView->handleKey(key, mask, TRUE))
- {
- return TRUE;
- }
- // let menus handle navigation keys
- if (gLoginMenuBarView && gLoginMenuBarView->handleKey(key, mask, TRUE))
- {
+ // do CTRL-TAB and CTRL-SHIFT-TAB logic
+ if (mask & MASK_SHIFT)
+ {
+ mRootView->focusPrevRoot();
+ }
+ else
+ {
+ mRootView->focusNextRoot();
+ }
return TRUE;
}
- //some of context menus use this container, let context menu handle navigation keys
- if(gMenuHolder && gMenuHolder->handleKey(key, mask, TRUE))
+ // hidden edit menu for cut/copy/paste
+ if (gEditMenu && gEditMenu->handleAcceleratorKey(key, mask))
{
return TRUE;
}
@@ -2242,7 +2216,7 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
}
// Try for a new-format gesture
- if (LLGestureManager::instance().triggerGesture(key, mask))
+ if (LLGestureMgr::instance().triggerGesture(key, mask))
{
return TRUE;
}
@@ -2254,50 +2228,10 @@ BOOL LLViewerWindow::handleKey(KEY key, MASK mask)
return TRUE;
}
- // Topmost view gets a chance before the hierarchy
- // *FIX: get rid of this?
- //LLUICtrl* top_ctrl = gFocusMgr.getTopCtrl();
- //if (top_ctrl)
- //{
- // if( top_ctrl->handleKey( key, mask, TRUE ) )
- // {
- // return TRUE;
- // }
- //}
-
- // give floaters first chance to handle TAB key
- // so frontmost floater gets focus
- if (key == KEY_TAB)
- {
- // if nothing has focus, go to first or last UI element as appropriate
- if (mask & MASK_CONTROL || gFocusMgr.getKeyboardFocus() == NULL)
- {
- if (gMenuHolder) gMenuHolder->hideMenus();
- // if CTRL-tabbing (and not just TAB with no focus), go into window cycle mode
- gFloaterView->setCycleMode((mask & MASK_CONTROL) != 0);
-
- // do CTRL-TAB and CTRL-SHIFT-TAB logic
- if (mask & MASK_SHIFT)
- {
- mRootView->focusPrevRoot();
- }
- else
- {
- mRootView->focusNextRoot();
- }
- return TRUE;
- }
- }
-
- // give menus a chance to handle keys
- if (gMenuBarView && gMenuBarView->handleAcceleratorKey(key, mask))
- {
- return TRUE;
- }
-
- // give menus a chance to handle keys
- if (gLoginMenuBarView && gLoginMenuBarView->handleAcceleratorKey(key, mask))
+ // give menus a chance to handle unmodified accelerator keys
+ if ((gMenuBarView && gMenuBarView->handleAcceleratorKey(key, mask))
+ ||(gLoginMenuBarView && gLoginMenuBarView->handleAcceleratorKey(key, mask)))
{
return TRUE;
}
@@ -2396,11 +2330,35 @@ void LLViewerWindow::handleScrollWheel(S32 clicks)
// Zoom the camera in and out behavior
if(top_ctrl == 0 && getWorldViewRectScaled().pointInRect(mCurrentMousePoint.mX, mCurrentMousePoint.mY) )
- gAgent.handleScrollWheel(clicks);
+ gAgentCamera.handleScrollWheel(clicks);
return;
}
+void LLViewerWindow::addPopup(LLView* popup)
+{
+ if (mPopupView)
+ {
+ mPopupView->addPopup(popup);
+ }
+}
+
+void LLViewerWindow::removePopup(LLView* popup)
+{
+ if (mPopupView)
+ {
+ mPopupView->removePopup(popup);
+ }
+}
+
+void LLViewerWindow::clearPopups()
+{
+ if (mPopupView)
+ {
+ mPopupView->clearPopups();
+ }
+}
+
void LLViewerWindow::moveCursorToCenter()
{
if (! gSavedSettings.getBOOL("DisableMouseWarp"))
@@ -2457,12 +2415,19 @@ void append_xui_tooltip(LLView* viewp, LLToolTip::Params& params)
// event processing.
void LLViewerWindow::updateUI()
{
+ static LLFastTimer::DeclareTimer ftm("Update UI");
+ LLFastTimer t(ftm);
+
static std::string last_handle_msg;
+ LLConsole::updateClass();
+
// animate layout stacks so we have up to date rect for world view
LLLayoutStack::updateClass();
- updateWorldViewRect();
+ // use full window for world view when not rendering UI
+ bool world_view_uses_full_window = gAgentCamera.cameraMouselook() || !gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI);
+ updateWorldViewRect(world_view_uses_full_window);
LLView::sMouseHandlerMessage.clear();
@@ -2512,68 +2477,99 @@ void LLViewerWindow::updateUI()
root_view = mRootView;
}
- // include all ancestors of captor_view as automatically having mouse
- if (captor_view)
+ // only update mouse hover set when UI is visible (since we shouldn't send hover events to invisible UI
+ if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
{
- LLView* captor_parent_view = captor_view->getParent();
- while(captor_parent_view)
+ // include all ancestors of captor_view as automatically having mouse
+ if (captor_view)
{
- mouse_hover_set.insert(captor_parent_view->getHandle());
- captor_parent_view = captor_parent_view->getParent();
+ LLView* captor_parent_view = captor_view->getParent();
+ while(captor_parent_view)
+ {
+ mouse_hover_set.insert(captor_parent_view->getHandle());
+ captor_parent_view = captor_parent_view->getParent();
+ }
}
- }
- // aggregate visible views that contain mouse cursor in display order
+ // aggregate visible views that contain mouse cursor in display order
+ LLPopupView::popup_list_t popups = mPopupView->getCurrentPopups();
- // while the top_ctrl contains the mouse cursor, only it and its descendants will receive onMouseEnter events
- if (top_ctrl && top_ctrl->calcScreenBoundingRect().pointInRect(x, y))
- {
- // iterator over contents of top_ctrl, and throw into mouse_hover_set
- for (LLView::tree_iterator_t it = top_ctrl->beginTreeDFS();
- it != top_ctrl->endTreeDFS();
- ++it)
+ for(LLPopupView::popup_list_t::iterator popup_it = popups.begin(); popup_it != popups.end(); ++popup_it)
{
- LLView* viewp = *it;
- if (viewp->getVisible()
- && viewp->calcScreenBoundingRect().pointInRect(x, y))
+ LLView* popup = popup_it->get();
+ if (popup && popup->calcScreenBoundingRect().pointInRect(x, y))
{
- // we have a view that contains the mouse, add it to the set
- mouse_hover_set.insert(viewp->getHandle());
+ // iterator over contents of top_ctrl, and throw into mouse_hover_set
+ for (LLView::tree_iterator_t it = popup->beginTreeDFS();
+ it != popup->endTreeDFS();
+ ++it)
+ {
+ LLView* viewp = *it;
+ if (viewp->getVisible()
+ && viewp->calcScreenBoundingRect().pointInRect(x, y))
+ {
+ // we have a view that contains the mouse, add it to the set
+ mouse_hover_set.insert(viewp->getHandle());
+ }
+ else
+ {
+ // skip this view and all of its children
+ it.skipDescendants();
+ }
+ }
}
- else
+ }
+
+ // while the top_ctrl contains the mouse cursor, only it and its descendants will receive onMouseEnter events
+ if (top_ctrl && top_ctrl->calcScreenBoundingRect().pointInRect(x, y))
+ {
+ // iterator over contents of top_ctrl, and throw into mouse_hover_set
+ for (LLView::tree_iterator_t it = top_ctrl->beginTreeDFS();
+ it != top_ctrl->endTreeDFS();
+ ++it)
{
- // skip this view and all of its children
- it.skipDescendants();
+ LLView* viewp = *it;
+ if (viewp->getVisible()
+ && viewp->calcScreenBoundingRect().pointInRect(x, y))
+ {
+ // we have a view that contains the mouse, add it to the set
+ mouse_hover_set.insert(viewp->getHandle());
+ }
+ else
+ {
+ // skip this view and all of its children
+ it.skipDescendants();
+ }
}
}
- }
- else
- {
- // walk UI tree in depth-first order
- for (LLView::tree_iterator_t it = root_view->beginTreeDFS();
- it != root_view->endTreeDFS();
- ++it)
+ else
{
- LLView* viewp = *it;
- // calculating the screen rect involves traversing the parent, so this is less than optimal
- if (viewp->getVisible()
- && viewp->calcScreenBoundingRect().pointInRect(x, y))
+ // walk UI tree in depth-first order
+ for (LLView::tree_iterator_t it = root_view->beginTreeDFS();
+ it != root_view->endTreeDFS();
+ ++it)
{
+ LLView* viewp = *it;
+ // calculating the screen rect involves traversing the parent, so this is less than optimal
+ if (viewp->getVisible()
+ && viewp->calcScreenBoundingRect().pointInRect(x, y))
+ {
- // if this view is mouse opaque, nothing behind it should be in mouse_hover_set
- if (viewp->getMouseOpaque())
+ // if this view is mouse opaque, nothing behind it should be in mouse_hover_set
+ if (viewp->getMouseOpaque())
+ {
+ // constrain further iteration to children of this widget
+ it = viewp->beginTreeDFS();
+ }
+
+ // we have a view that contains the mouse, add it to the set
+ mouse_hover_set.insert(viewp->getHandle());
+ }
+ else
{
- // constrain further iteration to children of this widget
- it = viewp->beginTreeDFS();
+ // skip this view and all of its children
+ it.skipDescendants();
}
-
- // we have a view that contains the mouse, add it to the set
- mouse_hover_set.insert(viewp->getHandle());
- }
- else
- {
- // skip this view and all of its children
- it.skipDescendants();
}
}
}
@@ -2617,156 +2613,170 @@ void LLViewerWindow::updateUI()
// store resulting hover set for next frame
swap(mMouseHoverViews, mouse_hover_set);
- if( mouse_captor )
- {
- // Pass hover events to object capturing mouse events.
- S32 local_x;
- S32 local_y;
- mouse_captor->screenPointToLocal( x, y, &local_x, &local_y );
- handled = mouse_captor->handleHover(local_x, local_y, mask);
- if (LLView::sDebugMouseHandling)
- {
- llinfos << "Hover handled by captor " << mouse_captor->getName() << llendl;
- }
+ // only handle hover events when UI is enabled
+ if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
+ {
- if( !handled )
+ if( mouse_captor )
{
- lldebugst(LLERR_USER_INPUT) << "hover not handled by mouse captor" << llendl;
+ // Pass hover events to object capturing mouse events.
+ S32 local_x;
+ S32 local_y;
+ mouse_captor->screenPointToLocal( x, y, &local_x, &local_y );
+ handled = mouse_captor->handleHover(local_x, local_y, mask);
+ if (LLView::sDebugMouseHandling)
+ {
+ llinfos << "Hover handled by captor " << mouse_captor->getName() << llendl;
+ }
+
+ if( !handled )
+ {
+ lldebugst(LLERR_USER_INPUT) << "hover not handled by mouse captor" << llendl;
+ }
}
- }
- else
- {
- if (top_ctrl)
+ else
{
- S32 local_x, local_y;
- top_ctrl->screenPointToLocal( x, y, &local_x, &local_y );
- handled = top_ctrl->pointInView(local_x, local_y) && top_ctrl->handleHover(local_x, local_y, mask);
- handled_by_top_ctrl = TRUE;
- }
+ if (top_ctrl)
+ {
+ S32 local_x, local_y;
+ top_ctrl->screenPointToLocal( x, y, &local_x, &local_y );
+ handled = top_ctrl->pointInView(local_x, local_y) && top_ctrl->handleHover(local_x, local_y, mask);
+ handled_by_top_ctrl = TRUE;
+ }
- if ( !handled )
- {
- // x and y are from last time mouse was in window
- // mMouseInWindow tracks *actual* mouse location
- if (mMouseInWindow && mRootView->handleHover(x, y, mask) )
+ if ( !handled )
{
- if (LLView::sDebugMouseHandling && LLView::sMouseHandlerMessage != last_handle_msg)
+ // x and y are from last time mouse was in window
+ // mMouseInWindow tracks *actual* mouse location
+ if (mMouseInWindow && mRootView->handleHover(x, y, mask) )
{
- last_handle_msg = LLView::sMouseHandlerMessage;
- llinfos << "Hover" << LLView::sMouseHandlerMessage << llendl;
+ if (LLView::sDebugMouseHandling && LLView::sMouseHandlerMessage != last_handle_msg)
+ {
+ last_handle_msg = LLView::sMouseHandlerMessage;
+ llinfos << "Hover" << LLView::sMouseHandlerMessage << llendl;
+ }
+ handled = TRUE;
+ }
+ else if (LLView::sDebugMouseHandling)
+ {
+ if (last_handle_msg != LLStringUtil::null)
+ {
+ last_handle_msg.clear();
+ llinfos << "Hover not handled by view" << llendl;
+ }
}
- handled = TRUE;
}
- else if (LLView::sDebugMouseHandling)
+
+ if (!handled)
{
- if (last_handle_msg != LLStringUtil::null)
+ LLTool *tool = LLToolMgr::getInstance()->getCurrentTool();
+
+ if(mMouseInWindow && tool)
{
- last_handle_msg.clear();
- llinfos << "Hover not handled by view" << llendl;
+ handled = tool->handleHover(x, y, mask);
}
}
}
- if (!handled)
+ // Show a new tool tip (or update one that is already shown)
+ BOOL tool_tip_handled = FALSE;
+ std::string tool_tip_msg;
+ if( handled
+ && !mWindow->isCursorHidden())
{
- LLTool *tool = LLToolMgr::getInstance()->getCurrentTool();
+ LLRect screen_sticky_rect = mRootView->getLocalRect();
+ S32 local_x, local_y;
- if(mMouseInWindow && tool)
+ if (gSavedSettings.getBOOL("DebugShowXUINames"))
{
- handled = tool->handleHover(x, y, mask);
- }
- }
- }
+ LLToolTip::Params params;
- // Show a new tool tip (or update one that is already shown)
- BOOL tool_tip_handled = FALSE;
- std::string tool_tip_msg;
- if( handled
- && !mWindow->isCursorHidden())
- {
- LLRect screen_sticky_rect = mRootView->getLocalRect();
- S32 local_x, local_y;
-
- if (gSavedSettings.getBOOL("DebugShowXUINames"))
- {
- LLToolTip::Params params;
-
- LLView* tooltip_view = mRootView;
- LLView::tree_iterator_t end_it = mRootView->endTreeDFS();
- for (LLView::tree_iterator_t it = mRootView->beginTreeDFS(); it != end_it; ++it)
- {
- LLView* viewp = *it;
- LLRect screen_rect;
- viewp->localRectToScreen(viewp->getLocalRect(), &screen_rect);
- if (!(viewp->getVisible()
- && screen_rect.pointInRect(x, y)))
- {
- it.skipDescendants();
- }
- // only report xui names for LLUICtrls,
- // and blacklist the various containers we don't care about
- else if (dynamic_cast<LLUICtrl*>(viewp)
- && viewp != gMenuHolder
- && viewp != gFloaterView
- && viewp != gConsole)
+ LLView* tooltip_view = mRootView;
+ LLView::tree_iterator_t end_it = mRootView->endTreeDFS();
+ for (LLView::tree_iterator_t it = mRootView->beginTreeDFS(); it != end_it; ++it)
{
- if (dynamic_cast<LLFloater*>(viewp))
+ LLView* viewp = *it;
+ LLRect screen_rect;
+ viewp->localRectToScreen(viewp->getLocalRect(), &screen_rect);
+ if (!(viewp->getVisible()
+ && screen_rect.pointInRect(x, y)))
{
- // constrain search to descendants of this (frontmost) floater
- // by resetting iterator
- it = viewp->beginTreeDFS();
+ it.skipDescendants();
}
-
- // if we are in a new part of the tree (not a descendent of current tooltip_view)
- // then push the results for tooltip_view and start with a new potential view
- // NOTE: this emulates visiting only the leaf nodes that meet our criteria
- if (!viewp->hasAncestor(tooltip_view))
+ // only report xui names for LLUICtrls,
+ // and blacklist the various containers we don't care about
+ else if (dynamic_cast<LLUICtrl*>(viewp)
+ && viewp != gMenuHolder
+ && viewp != gFloaterView
+ && viewp != gConsole)
{
- append_xui_tooltip(tooltip_view, params);
- screen_sticky_rect.intersectWith(tooltip_view->calcScreenRect());
+ if (dynamic_cast<LLFloater*>(viewp))
+ {
+ // constrain search to descendants of this (frontmost) floater
+ // by resetting iterator
+ it = viewp->beginTreeDFS();
+ }
+
+ // if we are in a new part of the tree (not a descendent of current tooltip_view)
+ // then push the results for tooltip_view and start with a new potential view
+ // NOTE: this emulates visiting only the leaf nodes that meet our criteria
+ if (!viewp->hasAncestor(tooltip_view))
+ {
+ append_xui_tooltip(tooltip_view, params);
+ screen_sticky_rect.intersectWith(tooltip_view->calcScreenRect());
+ }
+ tooltip_view = viewp;
}
- tooltip_view = viewp;
}
- }
- append_xui_tooltip(tooltip_view, params);
- screen_sticky_rect.intersectWith(tooltip_view->calcScreenRect());
-
- params.sticky_rect = screen_sticky_rect;
- params.max_width = 400;
+ append_xui_tooltip(tooltip_view, params);
+ screen_sticky_rect.intersectWith(tooltip_view->calcScreenRect());
+
+ params.sticky_rect = screen_sticky_rect;
+ params.max_width = 400;
- LLToolTipMgr::instance().show(params);
- }
- // if there is a mouse captor, nothing else gets a tooltip
- else if (mouse_captor)
- {
- mouse_captor->screenPointToLocal(x, y, &local_x, &local_y);
- tool_tip_handled = mouse_captor->handleToolTip(local_x, local_y, mask);
- }
- else
- {
- // next is top_ctrl
- if (!tool_tip_handled && top_ctrl)
- {
- top_ctrl->screenPointToLocal(x, y, &local_x, &local_y);
- tool_tip_handled = top_ctrl->handleToolTip(local_x, local_y, mask );
+ LLToolTipMgr::instance().show(params);
}
-
- if (!tool_tip_handled)
+ // if there is a mouse captor, nothing else gets a tooltip
+ else if (mouse_captor)
{
- local_x = x; local_y = y;
- tool_tip_handled = mRootView->handleToolTip(local_x, local_y, mask );
+ mouse_captor->screenPointToLocal(x, y, &local_x, &local_y);
+ tool_tip_handled = mouse_captor->handleToolTip(local_x, local_y, mask);
}
-
- LLTool* current_tool = LLToolMgr::getInstance()->getCurrentTool();
- if (!tool_tip_handled && current_tool)
+ else
{
- current_tool->screenPointToLocal(x, y, &local_x, &local_y);
- tool_tip_handled = current_tool->handleToolTip(local_x, local_y, mask );
+ // next is top_ctrl
+ if (!tool_tip_handled && top_ctrl)
+ {
+ top_ctrl->screenPointToLocal(x, y, &local_x, &local_y);
+ tool_tip_handled = top_ctrl->handleToolTip(local_x, local_y, mask );
+ }
+
+ if (!tool_tip_handled)
+ {
+ local_x = x; local_y = y;
+ tool_tip_handled = mRootView->handleToolTip(local_x, local_y, mask );
+ }
+
+ LLTool* current_tool = LLToolMgr::getInstance()->getCurrentTool();
+ if (!tool_tip_handled && current_tool)
+ {
+ current_tool->screenPointToLocal(x, y, &local_x, &local_y);
+ tool_tip_handled = current_tool->handleToolTip(local_x, local_y, mask );
+ }
}
+ }
+ }
+ else
+ { // just have tools handle hover when UI is turned off
+ LLTool *tool = LLToolMgr::getInstance()->getCurrentTool();
+
+ if(mMouseInWindow && tool)
+ {
+ handled = tool->handleHover(x, y, mask);
}
- }
-
+ }
+
updateLayout();
mLastMousePoint = mCurrentMousePoint;
@@ -2882,6 +2892,11 @@ void LLViewerWindow::updateMouseDelta()
void LLViewerWindow::updateKeyboardFocus()
{
+ if (!gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
+ {
+ gFocusMgr.setKeyboardFocus(NULL);
+ }
+
// clean up current focus
LLUICtrl* cur_focus = dynamic_cast<LLUICtrl*>(gFocusMgr.getKeyboardFocus());
if (cur_focus)
@@ -2984,19 +2999,24 @@ void LLViewerWindow::updateWorldViewRect(bool use_full_window)
new_world_rect.mTop = llround((F32)new_world_rect.mTop * mDisplayScale.mV[VY]);
}
+ if (gSavedSettings.getBOOL("SidebarCameraMovement") == FALSE)
+ {
+ // use right edge of window, ignoring sidebar
+ new_world_rect.mRight = mWindowRectRaw.mRight;
+ }
+
if (mWorldViewRectRaw != new_world_rect)
{
- LLRect old_world_rect = mWorldViewRectRaw;
mWorldViewRectRaw = new_world_rect;
gResizeScreenTexture = TRUE;
LLViewerCamera::getInstance()->setViewHeightInPixels( mWorldViewRectRaw.getHeight() );
LLViewerCamera::getInstance()->setAspect( getWorldViewAspectRatio() );
+ LLRect old_world_rect_scaled = mWorldViewRectScaled;
mWorldViewRectScaled = calcScaledRect(mWorldViewRectRaw, mDisplayScale);
// sending a signal with a new WorldView rect
- old_world_rect = calcScaledRect(old_world_rect, mDisplayScale);
- mOnWorldViewRectUpdated(old_world_rect, mWorldViewRectScaled);
+ mOnWorldViewRectUpdated(old_world_rect_scaled, mWorldViewRectScaled);
}
}
@@ -3036,7 +3056,6 @@ void LLViewerWindow::saveLastMouse(const LLCoordGL &point)
// Must be called after displayObjects is called, which sets the mGLName parameter
// NOTE: This function gets called 3 times:
// render_ui_3d: FALSE, FALSE, TRUE
-// renderObjectsForSelect: TRUE, pick_parcel_wall, FALSE
// render_hud_elements: FALSE, FALSE, FALSE
void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls, BOOL for_hud )
{
@@ -3066,7 +3085,7 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls,
// setup HUD render
if (selection->getSelectType() == SELECT_TYPE_HUD && LLSelectMgr::getInstance()->getSelection()->getObjectCount())
{
- LLBBox hud_bbox = gAgent.getAvatarObject()->getHUDBBox();
+ LLBBox hud_bbox = gAgentAvatarp->getHUDBBox();
// set up transform to encompass bounding box of HUD
glMatrixMode(GL_PROJECTION);
@@ -3093,7 +3112,7 @@ void LLViewerWindow::renderSelections( BOOL for_gl_pick, BOOL pick_parcel_walls,
glPushMatrix();
if (selection->getSelectType() == SELECT_TYPE_HUD)
{
- F32 zoom = gAgent.mHUDCurZoom;
+ F32 zoom = gAgentCamera.mHUDCurZoom;
glScalef(zoom, zoom, zoom);
}
@@ -3212,7 +3231,7 @@ LLVector3d LLViewerWindow::clickPointInWorldGlobal(S32 x, S32 y_from_bot, LLView
// world at the location of the mouse click
LLVector3 mouse_direction_global = mouseDirectionGlobal( x, y_from_bot );
- LLVector3d relative_object = clicked_object->getPositionGlobal() - gAgent.getCameraPositionGlobal();
+ LLVector3d relative_object = clicked_object->getPositionGlobal() - gAgentCamera.getCameraPositionGlobal();
// make mouse vector as long as object vector, so it touchs a point near
// where the user clicked on the object
@@ -3221,7 +3240,7 @@ LLVector3d LLViewerWindow::clickPointInWorldGlobal(S32 x, S32 y_from_bot, LLView
LLVector3d new_pos;
new_pos.setVec(mouse_direction_global);
// transform mouse vector back to world coords
- new_pos += gAgent.getCameraPositionGlobal();
+ new_pos += gAgentCamera.getCameraPositionGlobal();
return new_pos;
}
@@ -3488,7 +3507,7 @@ LLVector3 LLViewerWindow::mousePointHUD(const S32 x, const S32 y) const
F32 hud_x = -((F32)x - center_x) / height;
F32 hud_y = ((F32)y - center_y) / height;
- return LLVector3(0.f, hud_x/gAgent.mHUDCurZoom, hud_y/gAgent.mHUDCurZoom);
+ return LLVector3(0.f, hud_x/gAgentCamera.mHUDCurZoom, hud_y/gAgentCamera.mHUDCurZoom);
}
// Returns unit vector relative to camera in camera space
@@ -3535,7 +3554,7 @@ BOOL LLViewerWindow::mousePointOnPlaneGlobal(LLVector3d& point, const S32 x, con
LLVector3d plane_normal_global_d;
plane_normal_global_d.setVec(plane_normal_global);
F64 plane_mouse_dot = (plane_normal_global_d * mouse_direction_global_d);
- LLVector3d plane_origin_camera_rel = plane_point_global - gAgent.getCameraPositionGlobal();
+ LLVector3d plane_origin_camera_rel = plane_point_global - gAgentCamera.getCameraPositionGlobal();
F64 mouse_look_at_scale = (plane_normal_global_d * plane_origin_camera_rel)
/ plane_mouse_dot;
if (llabs(plane_mouse_dot) < 0.00001)
@@ -3549,7 +3568,7 @@ BOOL LLViewerWindow::mousePointOnPlaneGlobal(LLVector3d& point, const S32 x, con
mouse_look_at_scale = plane_origin_camera_rel.magVec() / (plane_origin_dir * mouse_direction_global_d);
}
- point = gAgent.getCameraPositionGlobal() + mouse_look_at_scale * mouse_direction_global_d;
+ point = gAgentCamera.getCameraPositionGlobal() + mouse_look_at_scale * mouse_direction_global_d;
return mouse_look_at_scale > 0.0;
}
@@ -3567,12 +3586,12 @@ BOOL LLViewerWindow::mousePointOnLandGlobal(const S32 x, const S32 y, LLVector3d
const F32 SECOND_PASS_STEP = 0.1f; // meters
LLVector3d camera_pos_global;
- camera_pos_global = gAgent.getCameraPositionGlobal();
+ camera_pos_global = gAgentCamera.getCameraPositionGlobal();
LLVector3d probe_point_global;
LLVector3 probe_point_region;
// walk forwards to find the point
- for (mouse_dir_scale = FIRST_PASS_STEP; mouse_dir_scale < gAgent.mDrawDistance; mouse_dir_scale += FIRST_PASS_STEP)
+ for (mouse_dir_scale = FIRST_PASS_STEP; mouse_dir_scale < gAgentCamera.mDrawDistance; mouse_dir_scale += FIRST_PASS_STEP)
{
LLVector3d mouse_direction_global_d;
mouse_direction_global_d.setVec(mouse_direction_global * mouse_dir_scale);
@@ -3751,18 +3770,7 @@ void LLViewerWindow::movieSize(S32 new_width, S32 new_height)
BORDERHEIGHT = size.mY- y;
LLCoordScreen new_size(new_width + BORDERWIDTH,
new_height + BORDERHEIGHT);
- BOOL disable_sync = gSavedSettings.getBOOL("DisableVerticalSync");
- if (gViewerWindow->mWindow->getFullscreen())
- {
- gViewerWindow->changeDisplaySettings(FALSE,
- new_size,
- disable_sync,
- TRUE);
- }
- else
- {
- gViewerWindow->mWindow->setSize(new_size);
- }
+ gViewerWindow->mWindow->setSize(new_size);
}
}
@@ -3956,9 +3964,6 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
// PRE SNAPSHOT
gDisplaySwapBuffers = FALSE;
- // if not showing ui, use full window to render world view
- updateWorldViewRect(!show_ui);
-
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
setCursor(UI_CURSOR_WAIT);
@@ -4031,6 +4036,9 @@ BOOL LLViewerWindow::rawSnapshot(LLImageRaw *raw, S32 image_width, S32 image_hei
//else: keep the current scene scale, re-scale it if necessary after reading out.
}
+ // if not showing ui, use full window to render world view
+ updateWorldViewRect(!show_ui);
+
S32 buffer_x_offset = llfloor(((window_width - snapshot_width) * scale_factor) / 2.f);
S32 buffer_y_offset = llfloor(((window_height - snapshot_height) * scale_factor) / 2.f);
@@ -4514,7 +4522,7 @@ void LLViewerWindow::restoreGL(const std::string& progress_message)
gResizeScreenTexture = TRUE;
- if (gFloaterCustomize && gFloaterCustomize->getVisible())
+ if (gAgentCamera.cameraCustomizeAvatar())
{
LLVisualParamHint::requestHintUpdates();
}
@@ -4548,51 +4556,12 @@ void LLViewerWindow::initFonts(F32 zoom_factor)
LLFontGL::loadDefaultFonts();
}
-void LLViewerWindow::toggleFullscreen(BOOL show_progress)
-{
- if (mWindow)
- {
- mWantFullscreen = mWindow->getFullscreen() ? FALSE : TRUE;
- mIsFullscreenChecked = mWindow->getFullscreen() ? FALSE : TRUE;
- mShowFullscreenProgress = show_progress;
- }
-}
-
-void LLViewerWindow::getTargetWindow(BOOL& fullscreen, S32& width, S32& height) const
-{
- fullscreen = mWantFullscreen;
-
- if (mWindow
- && mWindow->getFullscreen() == mWantFullscreen)
- {
- width = getWindowWidthRaw();
- height = getWindowHeightRaw();
- }
- else if (mWantFullscreen)
- {
- width = gSavedSettings.getS32("FullScreenWidth");
- height = gSavedSettings.getS32("FullScreenHeight");
- }
- else
- {
- width = gSavedSettings.getS32("WindowWidth");
- height = gSavedSettings.getS32("WindowHeight");
- }
-}
-
void LLViewerWindow::requestResolutionUpdate()
{
mResDirty = true;
}
-void LLViewerWindow::requestResolutionUpdate(bool fullscreen_checked)
-{
- mResDirty = true;
- mWantFullscreen = fullscreen_checked;
- mIsFullscreenChecked = fullscreen_checked;
-}
-
-BOOL LLViewerWindow::checkSettings()
+void LLViewerWindow::checkSettings()
{
if (mStatesDirty)
{
@@ -4604,70 +4573,9 @@ BOOL LLViewerWindow::checkSettings()
// We want to update the resolution AFTER the states getting refreshed not before.
if (mResDirty)
{
- if (gSavedSettings.getBOOL("FullScreenAutoDetectAspectRatio"))
- {
- getWindow()->setNativeAspectRatio(0.f);
- }
- else
- {
- getWindow()->setNativeAspectRatio(gSavedSettings.getF32("FullScreenAspectRatio"));
- }
-
reshape(getWindowWidthRaw(), getWindowHeightRaw());
-
- // force aspect ratio
- if (mIsFullscreenChecked)
- {
- LLViewerCamera::getInstance()->setAspect( getWorldViewAspectRatio() );
- }
-
mResDirty = false;
- }
-
- BOOL is_fullscreen = mWindow->getFullscreen();
- if(mWantFullscreen)
- {
- LLCoordScreen screen_size;
- LLCoordScreen desired_screen_size(gSavedSettings.getS32("FullScreenWidth"),
- gSavedSettings.getS32("FullScreenHeight"));
- getWindow()->getSize(&screen_size);
- if(!is_fullscreen ||
- screen_size.mX != desired_screen_size.mX
- || screen_size.mY != desired_screen_size.mY)
- {
- if (!LLStartUp::canGoFullscreen())
- {
- return FALSE;
- }
-
- LLGLState::checkStates();
- LLGLState::checkTextureChannels();
- changeDisplaySettings(TRUE,
- desired_screen_size,
- gSavedSettings.getBOOL("DisableVerticalSync"),
- mShowFullscreenProgress);
-
- LLGLState::checkStates();
- LLGLState::checkTextureChannels();
- mStatesDirty = true;
- return TRUE;
- }
- }
- else
- {
- if(is_fullscreen)
- {
- // Changing to windowed mode.
- changeDisplaySettings(FALSE,
- LLCoordScreen(gSavedSettings.getS32("WindowWidth"),
- gSavedSettings.getS32("WindowHeight")),
- TRUE,
- mShowFullscreenProgress);
- mStatesDirty = true;
- return TRUE;
- }
- }
- return FALSE;
+ }
}
void LLViewerWindow::restartDisplay(BOOL show_progress_bar)
@@ -4676,7 +4584,7 @@ void LLViewerWindow::restartDisplay(BOOL show_progress_bar)
stopGL();
if (show_progress_bar)
{
- restoreGL("Changing Resolution...");
+ restoreGL(LLTrans::getString("ProgressChangingResolution"));
}
else
{
@@ -4684,38 +4592,23 @@ void LLViewerWindow::restartDisplay(BOOL show_progress_bar)
}
}
-BOOL LLViewerWindow::changeDisplaySettings(BOOL fullscreen, LLCoordScreen size, BOOL disable_vsync, BOOL show_progress_bar)
+BOOL LLViewerWindow::changeDisplaySettings(LLCoordScreen size, BOOL disable_vsync, BOOL show_progress_bar)
{
BOOL was_maximized = gSavedSettings.getBOOL("WindowMaximized");
- mWantFullscreen = fullscreen;
- mShowFullscreenProgress = show_progress_bar;
- gSavedSettings.setBOOL("WindowFullScreen", mWantFullscreen);
//gResizeScreenTexture = TRUE;
- BOOL old_fullscreen = mWindow->getFullscreen();
- if (!old_fullscreen && fullscreen && !LLStartUp::canGoFullscreen())
- {
- // Not allowed to switch to fullscreen now, so exit early.
- // *NOTE: This case should never be reached, but just-in-case.
- return TRUE;
- }
-
U32 fsaa = gSavedSettings.getU32("RenderFSAASamples");
U32 old_fsaa = mWindow->getFSAASamples();
- // going from windowed to windowed
- if (!old_fullscreen && !fullscreen)
+ // if not maximized, use the request size
+ if (!mWindow->getMaximized())
{
- // if not maximized, use the request size
- if (!mWindow->getMaximized())
- {
- mWindow->setSize(size);
- }
+ mWindow->setSize(size);
+ }
- if (fsaa == old_fsaa)
- {
- return TRUE;
- }
+ if (fsaa == old_fsaa)
+ {
+ return TRUE;
}
// Close floaters that don't handle settings change
@@ -4732,23 +4625,15 @@ BOOL LLViewerWindow::changeDisplaySettings(BOOL fullscreen, LLCoordScreen size,
LLCoordScreen old_size;
LLCoordScreen old_pos;
mWindow->getSize(&old_size);
- BOOL got_position = mWindow->getPosition(&old_pos);
- if (!old_fullscreen && fullscreen && got_position)
- {
- // switching from windowed to fullscreen, so save window position
- gSavedSettings.setS32("WindowX", old_pos.mX);
- gSavedSettings.setS32("WindowY", old_pos.mY);
- }
-
mWindow->setFSAASamples(fsaa);
- result_first_try = mWindow->switchContext(fullscreen, size, disable_vsync);
+ result_first_try = mWindow->switchContext(false, size, disable_vsync);
if (!result_first_try)
{
// try to switch back
mWindow->setFSAASamples(old_fsaa);
- result_second_try = mWindow->switchContext(old_fullscreen, old_size, disable_vsync);
+ result_second_try = mWindow->switchContext(false, old_size, disable_vsync);
if (!result_second_try)
{
@@ -4763,7 +4648,7 @@ BOOL LLViewerWindow::changeDisplaySettings(BOOL fullscreen, LLCoordScreen size,
llinfos << "Restoring GL during resolution change" << llendl;
if (show_progress_bar)
{
- restoreGL("Changing Resolution...");
+ restoreGL(LLTrans::getString("ProgressChangingResolution"));
}
else
{
@@ -4780,19 +4665,8 @@ BOOL LLViewerWindow::changeDisplaySettings(BOOL fullscreen, LLCoordScreen size,
}
BOOL success = result_first_try || result_second_try;
- if (success)
- {
-#if LL_WINDOWS
- // Only trigger a reshape after switching to fullscreen; otherwise rely on the windows callback
- // (otherwise size is wrong; this is the entire window size, reshape wants the visible window size)
- if (fullscreen && result_first_try)
-#endif
- {
- reshape(size.mX, size.mY);
- }
- }
- if (!mWindow->getFullscreen() && success)
+ if (success)
{
// maximize window if was maximized, else reposition
if (was_maximized)
@@ -4810,45 +4684,14 @@ BOOL LLViewerWindow::changeDisplaySettings(BOOL fullscreen, LLCoordScreen size,
mIgnoreActivate = FALSE;
gFocusMgr.setKeyboardFocus(keyboard_focus);
- mWantFullscreen = mWindow->getFullscreen();
- mShowFullscreenProgress = FALSE;
return success;
}
-
-F32 LLViewerWindow::getDisplayAspectRatio() const
-{
- if (mWindow->getFullscreen())
- {
- if (gSavedSettings.getBOOL("FullScreenAutoDetectAspectRatio"))
- {
- return mWindow->getNativeAspectRatio();
- }
- else
- {
- return gSavedSettings.getF32("FullScreenAspectRatio");
- }
- }
- else
- {
- return mWindow->getNativeAspectRatio();
- }
-}
-
-
F32 LLViewerWindow::getWorldViewAspectRatio() const
{
F32 world_aspect = (F32)mWorldViewRectRaw.getWidth() / (F32)mWorldViewRectRaw.getHeight();
- //F32 window_aspect = (F32)mWindowRectRaw.getWidth() / (F32)mWindowRectRaw.getHeight();
- if (mWindow->getFullscreen())
- {
- return world_aspect * mWindow->getPixelAspectRatio();
- }
- else
- {
- return world_aspect;
- }
+ return world_aspect;
}
void LLViewerWindow::calcDisplayScale()
@@ -4856,27 +4699,13 @@ void LLViewerWindow::calcDisplayScale()
F32 ui_scale_factor = gSavedSettings.getF32("UIScaleFactor");
LLVector2 display_scale;
display_scale.setVec(llmax(1.f / mWindow->getPixelAspectRatio(), 1.f), llmax(mWindow->getPixelAspectRatio(), 1.f));
- F32 height_normalization = gSavedSettings.getBOOL("UIAutoScale") ? ((F32)mWindowRectRaw.getHeight() / display_scale.mV[VY]) / 768.f : 1.f;
- if(mWindow->getFullscreen())
- {
- display_scale *= (ui_scale_factor * height_normalization);
- }
- else
- {
- display_scale *= ui_scale_factor;
- }
+ display_scale *= ui_scale_factor;
// limit minimum display scale
if (display_scale.mV[VX] < MIN_DISPLAY_SCALE || display_scale.mV[VY] < MIN_DISPLAY_SCALE)
{
display_scale *= MIN_DISPLAY_SCALE / llmin(display_scale.mV[VX], display_scale.mV[VY]);
}
-
- if (mWindow->getFullscreen())
- {
- display_scale.mV[0] = llround(display_scale.mV[0], 2.0f/(F32) mWindowRectRaw.getWidth());
- display_scale.mV[1] = llround(display_scale.mV[1], 2.0f/(F32) mWindowRectRaw.getHeight());
- }
if (display_scale != mDisplayScale)
{
@@ -4957,9 +4786,9 @@ bool LLViewerWindow::onAlert(const LLSD& notify)
// If we're in mouselook, the mouse is hidden and so the user can't click
// the dialog buttons. In that case, change to First Person instead.
- if( gAgent.cameraMouselook() )
+ if( gAgentCamera.cameraMouselook() )
{
- gAgent.changeCameraToDefault();
+ gAgentCamera.changeCameraToDefault();
}
return false;
}
@@ -5071,7 +4900,7 @@ void LLPickInfo::fetchResults()
{
mPickType = PICK_OBJECT;
}
- mObjectOffset = gAgent.calcFocusOffset(objectp, intersection, mPickPt.mX, mPickPt.mY);
+ mObjectOffset = gAgentCamera.calcFocusOffset(objectp, intersection, mPickPt.mX, mPickPt.mY);
mObjectID = objectp->mID;
mObjectFace = (te_offset == NO_FACE) ? -1 : (S32)te_offset;
diff --git a/indra/newview/llviewerwindow.h b/indra/newview/llviewerwindow.h
index bfce65f2ba..1e0200a075 100644
--- a/indra/newview/llviewerwindow.h
+++ b/indra/newview/llviewerwindow.h
@@ -69,6 +69,7 @@ class LLHUDIcon;
class LLWindow;
class LLRootView;
class LLViewerWindowListener;
+class LLPopupView;
#define PICK_HALF_WIDTH 5
#define PICK_DIAMETER (2 * PICK_HALF_WIDTH + 1)
@@ -261,10 +262,6 @@ public:
// Is window of our application frontmost?
BOOL getActive() const { return mActive; }
- void getTargetWindow(BOOL& fullscreen, S32& width, S32& height) const;
- // The 'target' is where the user wants the window to be. It may not be
- // there yet, because we may be supressing fullscreen prior to login.
-
const std::string& getInitAlert() { return mInitAlert; }
//
@@ -300,6 +297,11 @@ public:
BOOL handleKey(KEY key, MASK mask);
void handleScrollWheel (S32 clicks);
+ // add and remove views from "popup" layer
+ void addPopup(LLView* popup);
+ void removePopup(LLView* popup);
+ void clearPopups();
+
// Hide normal UI when a logon fails, re-show everything when logon is attempted again
void setNormalControlsVisible( BOOL visible );
void setMenuBackgroundColor(bool god_mode = false, bool dev_grid = false);
@@ -374,17 +376,12 @@ public:
// Prints window implementation details
void dumpState();
- // Request display setting changes
- void toggleFullscreen(BOOL show_progress);
-
// handle shutting down GL and bringing it back up
- void requestResolutionUpdate(bool fullscreen_checked);
- void requestResolutionUpdate(); // doesn't affect fullscreen
- BOOL checkSettings();
+ void requestResolutionUpdate();
+ void checkSettings();
void restartDisplay(BOOL show_progress_bar);
- BOOL changeDisplaySettings(BOOL fullscreen, LLCoordScreen size, BOOL disable_vsync, BOOL show_progress_bar);
+ BOOL changeDisplaySettings(LLCoordScreen size, BOOL disable_vsync, BOOL show_progress_bar);
BOOL getIgnoreDestroyWindow() { return mIgnoreActivate; }
- F32 getDisplayAspectRatio() const;
F32 getWorldViewAspectRatio() const;
const LLVector2& getDisplayScale() const { return mDisplayScale; }
void calcDisplayScale();
@@ -409,8 +406,6 @@ public:
protected:
BOOL mActive;
- BOOL mWantFullscreen;
- BOOL mShowFullscreenProgress;
LLRect mWindowRectRaw; // whole window, including UI
LLRect mWindowRectScaled; // whole window, scaled by UI size
@@ -458,12 +453,12 @@ protected:
LLHandle<LLView> mWorldViewPlaceholder; // widget that spans the portion of screen dedicated to rendering the 3d world
LLHandle<LLView> mNonSideTrayView; // parent of world view + bottom bar, etc...everything but the side tray
LLHandle<LLView> mFloaterViewHolder; // container for floater_view
+ LLPopupView* mPopupView; // container for transient popups
class LLDebugText* mDebugText; // Internal class for debug text
bool mResDirty;
bool mStatesDirty;
- bool mIsFullscreenChecked; // Did the user check the fullscreen checkbox in the display settings
U32 mCurrResolutionIndex;
boost::scoped_ptr<LLViewerWindowListener> mViewerWindowListener;
@@ -477,7 +472,7 @@ protected:
private:
// Object temporarily hovered over while dragging
LLPointer<LLViewerObject> mDragHoveredObject;
-};
+};
void toggle_flying(void*);
void toggle_first_person();
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 4235f97eab..4ef166fb71 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -1,6 +1,6 @@
/**
* @File llvoavatar.cpp
- * @brief Implementation of LLVOAvatar class which is a derivation fo LLViewerObject
+ * @brief Implementation of LLVOAvatar class which is a derivation of LLViewerObject
*
* $LicenseInfo:firstyear=2001&license=viewergpl$
*
@@ -48,6 +48,7 @@
#include "sound_ids.h"
#include "llagent.h" // Get state values from here
+#include "llagentcamera.h"
#include "llagentwearables.h"
#include "llanimationstates.h"
#include "llavatarpropertiesprocessor.h"
@@ -65,7 +66,9 @@
#include "llkeyframewalkmotion.h"
#include "llmutelist.h"
#include "llmoveview.h"
+#include "llnotificationsutil.h"
#include "llquantize.h"
+#include "llrand.h"
#include "llregionhandle.h"
#include "llresmgr.h"
#include "llselectmgr.h"
@@ -93,6 +96,12 @@
#include "llvoiceclient.h"
#include "llvoicevisualizer.h" // Ventrella
+#include "lldebugmessagebox.h"
+extern F32 SPEED_ADJUST_MAX;
+extern F32 SPEED_ADJUST_MAX_SEC;
+extern F32 ANIM_SPEED_MAX;
+extern F32 ANIM_SPEED_MIN;
+
#if LL_MSVC
// disable boost::lexical_cast warning
#pragma warning (disable:4702)
@@ -586,7 +595,7 @@ LLVOAvatarSkeletonInfo* LLVOAvatar::sAvatarSkeletonInfo = NULL;
LLVOAvatar::LLVOAvatarXmlInfo* LLVOAvatar::sAvatarXmlInfo = NULL;
LLVOAvatarDictionary *LLVOAvatar::sAvatarDictionary = NULL;
S32 LLVOAvatar::sFreezeCounter = 0;
-S32 LLVOAvatar::sMaxVisible = 50;
+U32 LLVOAvatar::sMaxVisible = 12;
F32 LLVOAvatar::sRenderDistance = 256.f;
S32 LLVOAvatar::sNumVisibleAvatars = 0;
S32 LLVOAvatar::sNumLODChangesThisFrame = 0;
@@ -655,6 +664,7 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
mNameMute(FALSE),
mRenderGroupTitles(sRenderGroupTitles),
mNameAppearance(FALSE),
+ mNameCloud(FALSE),
mFirstTEMessageReceived( FALSE ),
mFirstAppearanceMessageReceived( FALSE ),
mCulled( FALSE ),
@@ -664,6 +674,8 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
mTexEyeColor( NULL ),
mNeedsSkin(FALSE),
mUpdatePeriod(1),
+ mFullyLoaded(FALSE),
+ mPreviousFullyLoaded(FALSE),
mFullyLoadedInitialized(FALSE),
mSupportsAlphaLayers(FALSE)
{
@@ -743,8 +755,11 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
mOohMorph = NULL;
mAahMorph = NULL;
- mCurrentGesticulationLevel = 0;
+ mCurrentGesticulationLevel = 0;
+ mRuthTimer.reset();
+ mRuthDebugTimer.reset();
+ mDebugExistenceTimer.reset();
}
//------------------------------------------------------------------------
@@ -752,12 +767,28 @@ LLVOAvatar::LLVOAvatar(const LLUUID& id,
//------------------------------------------------------------------------
LLVOAvatar::~LLVOAvatar()
{
- lldebugs << "LLVOAvatar Destructor (0x" << this << ") id:" << mID << llendl;
-
- if (isSelf())
+ if (gSavedSettings.getBOOL("DebugAvatarRezTime"))
{
- gAgent.setAvatarObject(NULL);
+ if (!mFullyLoaded)
+ {
+ llinfos << "REZTIME: [ " << (U32)mDebugExistenceTimer.getElapsedTimeF32() << "sec ] Avatar '" << getFullname() << "' left after " << (U32)mRuthDebugTimer.getElapsedTimeF32() << " seconds as cloud." << llendl;
+ LLSD args;
+ args["EXISTENCE"] = llformat("%d",(U32)mDebugExistenceTimer.getElapsedTimeF32());
+ args["TIME"] = llformat("%d",(U32)mRuthDebugTimer.getElapsedTimeF32());
+ args["NAME"] = getFullname();
+ LLNotificationsUtil::add("AvatarRezLeftCloudNotification",args);
+ }
+ else
+ {
+ llinfos << "REZTIME: [ " << (U32)mDebugExistenceTimer.getElapsedTimeF32() << "sec ] Avatar '" << getFullname() << "' left." << llendl;
+ LLSD args;
+ args["EXISTENCE"] = llformat("%d",(U32)mDebugExistenceTimer.getElapsedTimeF32());
+ args["NAME"] = getFullname();
+ LLNotificationsUtil::add("AvatarRezLeftNotification",args);
+ }
+
}
+ lldebugs << "LLVOAvatar Destructor (0x" << this << ") id:" << mID << llendl;
mRoot.removeAllChildren();
@@ -828,7 +859,7 @@ BOOL LLVOAvatar::isFullyBaked()
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
{
if (!isTextureDefined(mBakedTextureDatas[i].mTextureIndex)
- && ( (i != BAKED_SKIRT) || isWearingWearableType(WT_SKIRT) ) )
+ && ( (i != BAKED_SKIRT) || isWearingWearableType(LLWearableType::WT_SKIRT) ) )
{
return FALSE;
}
@@ -885,7 +916,7 @@ BOOL LLVOAvatar::areAllNearbyInstancesBaked(S32& grey_avatars)
// static
void LLVOAvatar::dumpBakedStatus()
{
- LLVector3d camera_pos_global = gAgent.getCameraPositionGlobal();
+ LLVector3d camera_pos_global = gAgentCamera.getCameraPositionGlobal();
for (std::vector<LLCharacter*>::iterator iter = LLCharacter::sInstances.begin();
iter != LLCharacter::sInstances.end(); ++iter)
@@ -964,15 +995,14 @@ void LLVOAvatar::dumpBakedStatus()
//static
void LLVOAvatar::restoreGL()
{
- LLVOAvatar* self = gAgent.getAvatarObject();
- if (!self)
- return;
- self->setCompositeUpdatesEnabled(TRUE);
- for (U32 i = 0; i < self->mBakedTextureDatas.size(); i++)
+ if (!isAgentAvatarValid()) return;
+
+ gAgentAvatarp->setCompositeUpdatesEnabled(TRUE);
+ for (U32 i = 0; i < gAgentAvatarp->mBakedTextureDatas.size(); i++)
{
- self->invalidateComposite(self->mBakedTextureDatas[i].mTexLayerSet, FALSE);
+ gAgentAvatarp->invalidateComposite(gAgentAvatarp->mBakedTextureDatas[i].mTexLayerSet, FALSE);
}
- self->updateMeshTextures();
+ gAgentAvatarp->updateMeshTextures();
}
//static
@@ -1115,6 +1145,17 @@ void LLVOAvatar::initClass()
{
llerrs << "Error parsing skeleton node in avatar XML file: " << skeleton_path << llendl;
}
+
+ gAnimLibrary.animStateSetString(ANIM_AGENT_BODY_NOISE,"body_noise");
+ gAnimLibrary.animStateSetString(ANIM_AGENT_BREATHE_ROT,"breathe_rot");
+ gAnimLibrary.animStateSetString(ANIM_AGENT_EDITING,"editing");
+ gAnimLibrary.animStateSetString(ANIM_AGENT_EYE,"eye");
+ gAnimLibrary.animStateSetString(ANIM_AGENT_FLY_ADJUST,"fly_adjust");
+ gAnimLibrary.animStateSetString(ANIM_AGENT_HAND_MOTION,"hand_motion");
+ gAnimLibrary.animStateSetString(ANIM_AGENT_HEAD_ROT,"head_rot");
+ gAnimLibrary.animStateSetString(ANIM_AGENT_PELVIS_FIX,"pelvis_fix");
+ gAnimLibrary.animStateSetString(ANIM_AGENT_TARGET,"target");
+ gAnimLibrary.animStateSetString(ANIM_AGENT_WALK_ADJUST,"walk_adjust");
}
@@ -1226,7 +1267,11 @@ void LLVOAvatar::initInstance(void)
registerMotion( ANIM_AGENT_EXPRESS_TOOTHSMILE, LLEmote::create );
registerMotion( ANIM_AGENT_EXPRESS_WINK, LLEmote::create );
registerMotion( ANIM_AGENT_EXPRESS_WORRY, LLEmote::create );
+ registerMotion( ANIM_AGENT_FEMALE_RUN_NEW, LLKeyframeWalkMotion::create );
+ registerMotion( ANIM_AGENT_FEMALE_WALK, LLKeyframeWalkMotion::create );
+ registerMotion( ANIM_AGENT_FEMALE_WALK_NEW, LLKeyframeWalkMotion::create );
registerMotion( ANIM_AGENT_RUN, LLKeyframeWalkMotion::create );
+ registerMotion( ANIM_AGENT_RUN_NEW, LLKeyframeWalkMotion::create );
registerMotion( ANIM_AGENT_STAND, LLKeyframeStandMotion::create );
registerMotion( ANIM_AGENT_STAND_1, LLKeyframeStandMotion::create );
registerMotion( ANIM_AGENT_STAND_2, LLKeyframeStandMotion::create );
@@ -1236,6 +1281,7 @@ void LLVOAvatar::initInstance(void)
registerMotion( ANIM_AGENT_TURNLEFT, LLKeyframeWalkMotion::create );
registerMotion( ANIM_AGENT_TURNRIGHT, LLKeyframeWalkMotion::create );
registerMotion( ANIM_AGENT_WALK, LLKeyframeWalkMotion::create );
+ registerMotion( ANIM_AGENT_WALK_NEW, LLKeyframeWalkMotion::create );
// motions without a start/stop bit
registerMotion( ANIM_AGENT_BODY_NOISE, LLBodyNoiseMotion::create );
@@ -1271,7 +1317,8 @@ void LLVOAvatar::initInstance(void)
//VTPause(); // VTune
- mVoiceVisualizer->setVoiceEnabled( gVoiceClient->getVoiceEnabled( mID ) );
+ mVoiceVisualizer->setVoiceEnabled( LLVoiceClient::getInstance()->getVoiceEnabled( mID ) );
+
}
const LLVector3 LLVOAvatar::getRenderPosition() const
@@ -1492,9 +1539,9 @@ BOOL LLVOAvatar::parseSkeletonFile(const std::string& filename)
//-------------------------------------------------------------------------
// parse the file
//-------------------------------------------------------------------------
- BOOL success = sSkeletonXMLTree.parseFile( filename, FALSE );
+ BOOL parsesuccess = sSkeletonXMLTree.parseFile( filename, FALSE );
- if (!success)
+ if (!parsesuccess)
{
llerrs << "Can't parse skeleton file: " << filename << llendl;
return FALSE;
@@ -1505,11 +1552,13 @@ BOOL LLVOAvatar::parseSkeletonFile(const std::string& filename)
if (!root)
{
llerrs << "No root node found in avatar skeleton file: " << filename << llendl;
+ return FALSE;
}
if( !root->hasName( "linden_skeleton" ) )
{
llerrs << "Invalid avatar skeleton file header: " << filename << llendl;
+ return FALSE;
}
std::string version;
@@ -1517,6 +1566,7 @@ BOOL LLVOAvatar::parseSkeletonFile(const std::string& filename)
if( !root->getFastAttributeString( version_string, version ) || (version != "1.0") )
{
llerrs << "Invalid avatar skeleton file version: " << version << " in file: " << filename << llendl;
+ return FALSE;
}
return TRUE;
@@ -2076,12 +2126,27 @@ U32 LLVOAvatar::processUpdateMessage(LLMessageSystem *mesgsys,
LLMemType mt(LLMemType::MTYPE_AVATAR);
LLVector3 old_vel = getVelocity();
+ const BOOL has_name = !getNVPair("FirstName");
+
// Do base class updates...
U32 retval = LLViewerObject::processUpdateMessage(mesgsys, user_data, block_num, update_type, dp);
+ // Print out arrival information once we have name of avatar.
+ if (gSavedSettings.getBOOL("DebugAvatarRezTime"))
+ {
+ if (has_name && getNVPair("FirstName"))
+ {
+ mDebugExistenceTimer.reset();
+ LLSD args;
+ args["EXISTENCE"] = llformat("%d",(U32)mDebugExistenceTimer.getElapsedTimeF32());
+ args["NAME"] = getFullname();
+ LLNotificationsUtil::add("AvatarRezArrivedNotification",args);
+ llinfos << "REZTIME: [ " << (U32)mDebugExistenceTimer.getElapsedTimeF32() << "sec ] Avatar '" << getFullname() << "' arrived." << llendl;
+ }
+ }
if(retval & LLViewerObject::INVALID_UPDATE)
{
- if(this == gAgent.getAvatarObject())
+ if (isSelf())
{
//tell sim to cancel this update
gAgent.teleportViaLocation(gAgent.getPositionGlobal());
@@ -2114,6 +2179,33 @@ static LLFastTimer::DeclareTimer FTM_AVATAR_UPDATE("Update Avatar");
static LLFastTimer::DeclareTimer FTM_JOINT_UPDATE("Update Joints");
//------------------------------------------------------------------------
+// LLVOAvatar::dumpAnimationState()
+//------------------------------------------------------------------------
+void LLVOAvatar::dumpAnimationState()
+{
+ llinfos << "==============================================" << llendl;
+ for (LLVOAvatar::AnimIterator it = mSignaledAnimations.begin(); it != mSignaledAnimations.end(); ++it)
+ {
+ LLUUID id = it->first;
+ std::string playtag = "";
+ if (mPlayingAnimations.find(id) != mPlayingAnimations.end())
+ {
+ playtag = "*";
+ }
+ llinfos << gAnimLibrary.animationName(id) << playtag << llendl;
+ }
+ for (LLVOAvatar::AnimIterator it = mPlayingAnimations.begin(); it != mPlayingAnimations.end(); ++it)
+ {
+ LLUUID id = it->first;
+ bool is_signaled = mSignaledAnimations.find(id) != mSignaledAnimations.end();
+ if (!is_signaled)
+ {
+ llinfos << gAnimLibrary.animationName(id) << "!S" << llendl;
+ }
+ }
+}
+
+//------------------------------------------------------------------------
// idleUpdate()
//------------------------------------------------------------------------
BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
@@ -2192,13 +2284,16 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
// store off last frame's root position to be consistent with camera position
LLVector3 root_pos_last = mRoot.getWorldPosition();
BOOL detailed_update = updateCharacter(agent);
- BOOL voice_enabled = gVoiceClient->getVoiceEnabled( mID ) && gVoiceClient->inProximalChannel();
if (gNoRender)
{
return TRUE;
}
+ static LLUICachedControl<bool> visualizers_in_calls("ShowVoiceVisualizersInCalls", false);
+ bool voice_enabled = (visualizers_in_calls || LLVoiceClient::getInstance()->inProximalChannel()) &&
+ LLVoiceClient::getInstance()->getVoiceEnabled(mID);
+
idleUpdateVoiceVisualizer( voice_enabled );
idleUpdateMisc( detailed_update );
idleUpdateAppearanceAnimation();
@@ -2213,13 +2308,14 @@ BOOL LLVOAvatar::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
idleUpdateNameTag( root_pos_last );
idleUpdateRenderCost();
idleUpdateTractorBeam();
+
return TRUE;
}
void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled)
{
// disable voice visualizer when in mouselook
- mVoiceVisualizer->setVoiceEnabled( voice_enabled && !(isSelf() && gAgent.cameraMouselook()) );
+ mVoiceVisualizer->setVoiceEnabled( voice_enabled && !(isSelf() && gAgentCamera.cameraMouselook()) );
if ( voice_enabled )
{
//----------------------------------------------------------------
@@ -2247,7 +2343,7 @@ void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled)
else { llinfos << "oops - CurrentGesticulationLevel can be only 0, 1, or 2" << llendl; }
// this is the call that Karl S. created for triggering gestures from within the code.
- LLGestureManager::instance().triggerAndReviseString( gestureString );
+ LLGestureMgr::instance().triggerAndReviseString( gestureString );
}
}
@@ -2260,7 +2356,7 @@ void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled)
// Notice the calls to "gAwayTimer.reset()". This resets the timer that determines how long the avatar has been
// "away", so that the avatar doesn't lapse into away-mode (and slump over) while the user is still talking.
//-----------------------------------------------------------------------------------------------------------------
- if (gVoiceClient->getIsSpeaking( mID ))
+ if (LLVoiceClient::getInstance()->getIsSpeaking( mID ))
{
if (!mVoiceVisualizer->getCurrentlySpeaking())
{
@@ -2269,7 +2365,7 @@ void LLVOAvatar::idleUpdateVoiceVisualizer(bool voice_enabled)
//printf( "gAwayTimer.reset();\n" );
}
- mVoiceVisualizer->setSpeakingAmplitude( gVoiceClient->getCurrentPower( mID ) );
+ mVoiceVisualizer->setSpeakingAmplitude( LLVoiceClient::getInstance()->getCurrentPower( mID ) );
if( isSelf() )
{
@@ -2498,7 +2594,7 @@ F32 LLVOAvatar::calcMorphAmount()
void LLVOAvatar::idleUpdateLipSync(bool voice_enabled)
{
// Use the Lipsync_Ooh and Lipsync_Aah morphs for lip sync
- if ( voice_enabled && (gVoiceClient->lipSyncEnabled()) && gVoiceClient->getIsSpeaking( mID ) )
+ if ( voice_enabled && (LLVoiceClient::getInstance()->lipSyncEnabled()) && LLVoiceClient::getInstance()->getIsSpeaking( mID ) )
{
F32 ooh_morph_amount = 0.0f;
F32 aah_morph_amount = 0.0f;
@@ -2532,6 +2628,17 @@ void LLVOAvatar::idleUpdateLoadingEffect()
// update visibility when avatar is partially loaded
if (updateIsFullyLoaded()) // changed?
{
+ if (isFullyLoaded() && isSelf())
+ {
+ static bool first_fully_visible = true;
+ if (first_fully_visible)
+ {
+ llinfos << "self isFullyLoaded, first_fully_visible" << llendl;
+
+ first_fully_visible = false;
+ LLAppearanceMgr::instance().onFirstFullyVisible();
+ }
+ }
if (isFullyLoaded())
{
deleteParticleSource();
@@ -2654,7 +2761,7 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
if (isSelf())
{
render_name = render_name
- && !gAgent.cameraMouselook()
+ && !gAgentCamera.cameraMouselook()
&& (visible_chat || (gSavedSettings.getBOOL("RenderNameShowSelf")
&& gSavedSettings.getS32("AvatarNameTagMode") ));
}
@@ -2752,17 +2859,33 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
if (mNameText.notNull() && firstname && lastname)
{
- BOOL is_away = mSignaledAnimations.find(ANIM_AGENT_AWAY) != mSignaledAnimations.end();
- BOOL is_busy = mSignaledAnimations.find(ANIM_AGENT_BUSY) != mSignaledAnimations.end();
- BOOL is_appearance = mSignaledAnimations.find(ANIM_AGENT_CUSTOMIZE) != mSignaledAnimations.end();
- BOOL is_muted;
- if (isSelf())
- {
- is_muted = FALSE;
- }
- else
+ const BOOL is_away = mSignaledAnimations.find(ANIM_AGENT_AWAY) != mSignaledAnimations.end();
+ const BOOL is_busy = mSignaledAnimations.find(ANIM_AGENT_BUSY) != mSignaledAnimations.end();
+ const BOOL is_appearance = mSignaledAnimations.find(ANIM_AGENT_CUSTOMIZE) != mSignaledAnimations.end();
+ const BOOL is_muted = isSelf() ? FALSE : LLMuteList::getInstance()->isMuted(getID());
+ const BOOL is_cloud = getIsCloud();
+
+ if (gSavedSettings.getBOOL("DebugAvatarRezTime"))
{
- is_muted = LLMuteList::getInstance()->isMuted(getID());
+ if (is_appearance != mNameAppearance)
+ {
+ if (is_appearance)
+ {
+ LLSD args;
+ args["EXISTENCE"] = llformat("%d",(U32)mDebugExistenceTimer.getElapsedTimeF32());
+ args["NAME"] = getFullname();
+ LLNotificationsUtil::add("AvatarRezEnteredAppearanceNotification",args);
+ llinfos << "REZTIME: [ " << (U32)mDebugExistenceTimer.getElapsedTimeF32() << "sec ] Avatar '" << getFullname() << "' entered appearance mode." << llendl;
+ }
+ else
+ {
+ LLSD args;
+ args["EXISTENCE"] = llformat("%d",(U32)mDebugExistenceTimer.getElapsedTimeF32());
+ args["NAME"] = getFullname();
+ LLNotificationsUtil::add("AvatarRezLeftAppearanceNotification",args);
+ llinfos << "REZTIME: [ " << (U32)mDebugExistenceTimer.getElapsedTimeF32() << "sec ] Avatar '" << getFullname() << "' left appearance mode." << llendl;
+ }
+ }
}
if (mNameString.empty() ||
@@ -2770,7 +2893,9 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
(!title && !mTitle.empty()) ||
(title && mTitle != title->getString()) ||
(is_away != mNameAway || is_busy != mNameBusy || is_muted != mNameMute)
- || is_appearance != mNameAppearance)
+ || is_appearance != mNameAppearance
+ || is_cloud != mNameCloud
+ )
{
std::string line;
if (!sRenderGroupTitles)
@@ -2824,7 +2949,12 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
}
line += ")";
}
- if (is_appearance)
+ if (is_cloud)
+ {
+ line += "\n";
+ line += "(" + LLTrans::getString("LoadingData") + ")";
+ }
+ else if (is_appearance)
{
line += "\n";
line += LLTrans::getString("AvatarEditingAppearance");
@@ -2833,6 +2963,7 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
mNameBusy = is_busy;
mNameMute = is_muted;
mNameAppearance = is_appearance;
+ mNameCloud = is_cloud;
mTitle = title ? title->getString() : "";
LLStringFn::replace_ascii_controlchars(mTitle,LL_UNKNOWN_CHAR);
mNameString = utf8str_to_wstring(line);
@@ -2917,14 +3048,7 @@ void LLVOAvatar::idleUpdateNameTag(const LLVector3& root_pos_last)
}
else
{
- if (gSavedSettings.getBOOL("SmallAvatarNames"))
- {
- mNameText->setFont(LLFontGL::getFontSansSerif());
- }
- else
- {
- mNameText->setFont(LLFontGL::getFontSansSerifBig());
- }
+ mNameText->setFont(LLFontGL::getFontSansSerif());
mNameText->setTextAlignment(LLHUDText::ALIGN_TEXT_CENTER);
mNameText->setFadeDistance(CHAT_NORMAL_RADIUS, 5.f);
mNameText->setVisibleOffScreen(FALSE);
@@ -3049,23 +3173,23 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
{ // muted avatars update at 16 hz
mUpdatePeriod = 16;
}
- else if (visible && mVisibilityRank <= LLVOAvatar::sMaxVisible * 0.25f)
+ else if (visible && mVisibilityRank <= LLVOAvatar::sMaxVisible)
{ //first 25% of max visible avatars are not impostored
mUpdatePeriod = 1;
}
- else if (visible && mVisibilityRank > LLVOAvatar::sMaxVisible * 0.75f)
- { //back 25% of max visible avatars are slow updating impostors
- mUpdatePeriod = 8;
- }
- else if (visible && mVisibilityRank > (U32) LLVOAvatar::sMaxVisible)
+ else if (visible && mVisibilityRank > LLVOAvatar::sMaxVisible * 4)
{ //background avatars are REALLY slow updating impostors
mUpdatePeriod = 16;
}
+ else if (visible && mVisibilityRank > LLVOAvatar::sMaxVisible * 3)
+ { //back 25% of max visible avatars are slow updating impostors
+ mUpdatePeriod = 8;
+ }
else if (visible && mImpostorPixelArea <= impostor_area)
{ // stuff in between gets an update period based on pixel area
mUpdatePeriod = llclamp((S32) sqrtf(impostor_area*4.f/mImpostorPixelArea), 2, 8);
}
- else if (visible && mVisibilityRank > LLVOAvatar::sMaxVisible * 0.25f)
+ else if (visible && mVisibilityRank > LLVOAvatar::sMaxVisible)
{ // force nearby impostors in ultra crowded areas
mUpdatePeriod = 2;
}
@@ -3079,7 +3203,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
if (!visible)
{
- //updateMotions(LLCharacter::HIDDEN_UPDATE);
+ updateMotions(LLCharacter::HIDDEN_UPDATE);
return FALSE;
}
@@ -3218,7 +3342,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
}
}
LLVector3 fwdDir = lerp(primDir, velDir, clamp_rescale(speed, 0.5f, 2.0f, 0.0f, 1.0f));
- if (isSelf() && gAgent.cameraMouselook())
+ if (isSelf() && gAgentCamera.cameraMouselook())
{
// make sure fwdDir stays in same general direction as primdir
if (gAgent.getFlying())
@@ -3249,7 +3373,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
// When moving very slow, the pelvis is allowed to deviate from the
// forward direction to allow it to hold it's position while the torso
// and head turn. Once in motion, it must conform however.
- BOOL self_in_mouselook = isSelf() && gAgent.cameraMouselook();
+ BOOL self_in_mouselook = isSelf() && gAgentCamera.cameraMouselook();
LLVector3 pelvisDir( mRoot.getWorldMatrix().getFwdRow4().mV );
F32 pelvis_rot_threshold = clamp_rescale(speed, 0.1f, 1.0f, PELVIS_ROT_THRESHOLD_SLOW, PELVIS_ROT_THRESHOLD_FAST);
@@ -3427,7 +3551,7 @@ BOOL LLVOAvatar::updateCharacter(LLAgent &agent)
// AUDIO_STEP_LO_SPEED, AUDIO_STEP_HI_SPEED,
// AUDIO_STEP_LO_GAIN, AUDIO_STEP_HI_GAIN );
- const F32 STEP_VOLUME = 0.5f;
+ const F32 STEP_VOLUME = 0.1f;
const LLUUID& step_sound_id = getStepSound();
LLVector3d foot_pos_global = gAgent.getPosGlobalFromAgent(foot_pos_agent);
@@ -3660,7 +3784,7 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
mMeshLOD[MESH_ID_LOWER_BODY]->updateJointGeometry();
mMeshLOD[MESH_ID_UPPER_BODY]->updateJointGeometry();
- if( isWearingWearableType( WT_SKIRT ) )
+ if( isWearingWearableType( LLWearableType::WT_SKIRT ) )
{
mMeshLOD[MESH_ID_SKIRT]->updateJointGeometry();
}
@@ -3820,7 +3944,7 @@ U32 LLVOAvatar::renderSkinned(EAvatarRenderPass pass)
U32 LLVOAvatar::renderTransparent(BOOL first_pass)
{
U32 num_indices = 0;
- if( isWearingWearableType( WT_SKIRT ) && (mIsDummy || isTextureVisible(TEX_SKIRT_BAKED)) )
+ if( isWearingWearableType( LLWearableType::WT_SKIRT ) && (mIsDummy || isTextureVisible(TEX_SKIRT_BAKED)) )
{
gGL.setAlphaRejectSettings(LLRender::CF_GREATER, 0.25f);
num_indices += mMeshLOD[MESH_ID_SKIRT]->render(mAdjustedPixelArea, FALSE);
@@ -4023,7 +4147,7 @@ void LLVOAvatar::updateTextures()
mHasGrey = FALSE; // debug
for (U32 texture_index = 0; texture_index < getNumTEs(); texture_index++)
{
- EWearableType wearable_type = LLVOAvatarDictionary::getTEWearableType((ETextureIndex)texture_index);
+ LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType((ETextureIndex)texture_index);
U32 num_wearables = gAgentWearables.getWearableCount(wearable_type);
const LLTextureEntry *te = getTE(texture_index);
const F32 texel_area_ratio = fabs(te->mScaleS * te->mScaleT);
@@ -4048,6 +4172,7 @@ void LLVOAvatar::updateTextures()
// Spam if this is a baked texture, not set to default image, without valid host info
if (isIndexBakedTexture((ETextureIndex)texture_index)
&& imagep->getID() != IMG_DEFAULT_AVATAR
+ && imagep->getID() != IMG_INVISIBLE
&& !imagep->getTargetHost().isOk())
{
LL_WARNS_ONCE("Texture") << "LLVOAvatar::updateTextures No host for texture "
@@ -4084,8 +4209,15 @@ void LLVOAvatar::addBakedTextureStats( LLViewerFetchedTexture* imagep, F32 pixel
{
mMaxPixelArea = llmax(pixel_area, mMaxPixelArea);
mMinPixelArea = llmin(pixel_area, mMinPixelArea);
+ imagep->resetTextureStats();
+ imagep->setResetMaxVirtualSizeFlag(false) ;
+ imagep->setCanUseHTTP(false) ; //turn off http fetching for baked textures.
imagep->addTextureStats(pixel_area / texel_area_ratio);
imagep->setBoostLevel(boost_level);
+ if(boost_level == LLViewerTexture::BOOST_AVATAR_BAKED_SELF)
+ {
+ imagep->setAdditionalDecodePriority(1.0f) ;
+ }
}
//virtual
@@ -4358,34 +4490,79 @@ void LLVOAvatar::resetAnimations()
flushAllMotions();
}
-//-----------------------------------------------------------------------------
-// startMotion()
-// id is the asset if of the animation to start
-// time_offset is the offset into the animation at which to start playing
-//-----------------------------------------------------------------------------
-BOOL LLVOAvatar::startMotion(const LLUUID& id, F32 time_offset)
+// Override selectively based on avatar sex and whether we're using new
+// animations.
+LLUUID LLVOAvatar::remapMotionID(const LLUUID& id)
{
- LLMemType mt(LLMemType::MTYPE_AVATAR);
-
+ BOOL use_new_walk_run = gSavedSettings.getBOOL("UseNewWalkRun");
+ LLUUID result = id;
+
// start special case female walk for female avatars
if (getSex() == SEX_FEMALE)
{
if (id == ANIM_AGENT_WALK)
{
- return LLCharacter::startMotion(ANIM_AGENT_FEMALE_WALK, time_offset);
+ if (use_new_walk_run)
+ result = ANIM_AGENT_FEMALE_WALK_NEW;
+ else
+ result = ANIM_AGENT_FEMALE_WALK;
+ }
+ else if (id == ANIM_AGENT_RUN)
+ {
+ // There is no old female run animation, so only override
+ // in one case.
+ if (use_new_walk_run)
+ result = ANIM_AGENT_FEMALE_RUN_NEW;
}
else if (id == ANIM_AGENT_SIT)
{
- return LLCharacter::startMotion(ANIM_AGENT_SIT_FEMALE, time_offset);
+ result = ANIM_AGENT_SIT_FEMALE;
+ }
+ }
+ else
+ {
+ // Male avatar.
+ if (id == ANIM_AGENT_WALK)
+ {
+ if (use_new_walk_run)
+ result = ANIM_AGENT_WALK_NEW;
}
+ else if (id == ANIM_AGENT_RUN)
+ {
+ if (use_new_walk_run)
+ result = ANIM_AGENT_RUN_NEW;
+ }
+
}
- if (isSelf() && id == ANIM_AGENT_AWAY)
+ return result;
+
+}
+
+//-----------------------------------------------------------------------------
+// startMotion()
+// id is the asset if of the animation to start
+// time_offset is the offset into the animation at which to start playing
+//-----------------------------------------------------------------------------
+BOOL LLVOAvatar::startMotion(const LLUUID& id, F32 time_offset)
+{
+ LLMemType mt(LLMemType::MTYPE_AVATAR);
+
+ lldebugs << "motion requested " << id.asString() << " " << gAnimLibrary.animationName(id) << llendl;
+
+ LLUUID remap_id = remapMotionID(id);
+
+ if (remap_id != id)
+ {
+ lldebugs << "motion resultant " << remap_id.asString() << " " << gAnimLibrary.animationName(remap_id) << llendl;
+ }
+
+ if (isSelf() && remap_id == ANIM_AGENT_AWAY)
{
gAgent.setAFK();
}
- return LLCharacter::startMotion(id, time_offset);
+ return LLCharacter::startMotion(remap_id, time_offset);
}
//-----------------------------------------------------------------------------
@@ -4393,21 +4570,21 @@ BOOL LLVOAvatar::startMotion(const LLUUID& id, F32 time_offset)
//-----------------------------------------------------------------------------
BOOL LLVOAvatar::stopMotion(const LLUUID& id, BOOL stop_immediate)
{
- if (isSelf())
- {
- gAgent.onAnimStop(id);
- }
+ lldebugs << "motion requested " << id.asString() << " " << gAnimLibrary.animationName(id) << llendl;
- if (id == ANIM_AGENT_WALK)
+ LLUUID remap_id = remapMotionID(id);
+
+ if (remap_id != id)
{
- LLCharacter::stopMotion(ANIM_AGENT_FEMALE_WALK, stop_immediate);
+ lldebugs << "motion resultant " << remap_id.asString() << " " << gAnimLibrary.animationName(remap_id) << llendl;
}
- else if (id == ANIM_AGENT_SIT)
+
+ if (isSelf())
{
- LLCharacter::stopMotion(ANIM_AGENT_SIT_FEMALE, stop_immediate);
+ gAgent.onAnimStop(remap_id);
}
- return LLCharacter::stopMotion(id, stop_immediate);
+ return LLCharacter::stopMotion(remap_id, stop_immediate);
}
//-----------------------------------------------------------------------------
@@ -4810,7 +4987,7 @@ BOOL LLVOAvatar::loadAvatar()
}
// Uncomment to enable avatar_lad.xml debugging.
-/* std::ofstream file;
+ std::ofstream file;
file.open("avatar_lad.log");
for( LLViewerVisualParam* param = (LLViewerVisualParam*) getFirstVisualParam();
param;
@@ -4820,7 +4997,7 @@ BOOL LLVOAvatar::loadAvatar()
file << std::endl;
}
- file.close();*/
+ file.close();
return TRUE;
}
@@ -5188,7 +5365,7 @@ BOOL LLVOAvatar::updateJointLODs()
{
if (isSelf())
{
- if(gAgent.cameraCustomizeAvatar() || gAgent.cameraMouselook())
+ if(gAgentCamera.cameraCustomizeAvatar() || gAgentCamera.cameraMouselook())
{
mAdjustedPixelArea = MAX_PIXEL_AREA;
}
@@ -5334,7 +5511,7 @@ void LLVOAvatar::updateShadowFaces()
// Render sprite
sprite.setNormal(normal);
- if (isSelf() && gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK)
+ if (isSelf() && gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK)
{
sprite.setColor(0.f, 0.f, 0.f, 0.f);
}
@@ -5367,7 +5544,7 @@ void LLVOAvatar::updateShadowFaces()
// Render sprite
sprite.setNormal(normal);
- if (isSelf() && gAgent.getCameraMode() == CAMERA_MODE_MOUSELOOK)
+ if (isSelf() && gAgentCamera.getCameraMode() == CAMERA_MODE_MOUSELOOK)
{
sprite.setColor(0.f, 0.f, 0.f, 0.f);
}
@@ -5422,7 +5599,7 @@ BOOL LLVOAvatar::setParent(LLViewerObject* parent)
ret = LLViewerObject::setParent(parent);
if (isSelf())
{
- gAgent.resetCamera();
+ gAgentCamera.resetCamera();
}
}
else
@@ -5462,6 +5639,14 @@ LLViewerJointAttachment* LLVOAvatar::getTargetAttachmentPoint(LLViewerObject* vi
{
S32 attachmentID = ATTACHMENT_ID_FROM_STATE(viewer_object->getState());
+ // This should never happen unless the server didn't process the attachment point
+ // correctly, but putting this check in here to be safe.
+ if (attachmentID & ATTACHMENT_ADD)
+ {
+ llwarns << "Got an attachment with ATTACHMENT_ADD mask, removing ( attach pt:" << attachmentID << " )" << llendl;
+ attachmentID &= ~ATTACHMENT_ADD;
+ }
+
LLViewerJointAttachment* attachment = get_if_there(mAttachmentPoints, attachmentID, (LLViewerJointAttachment*)NULL);
if (!attachment)
@@ -5607,15 +5792,15 @@ void LLVOAvatar::sitOnObject(LLViewerObject *sit_object)
//LLFirstUse::useSit();
gAgent.setFlying(FALSE);
- gAgent.setThirdPersonHeadOffset(LLVector3::zero);
+ gAgentCamera.setThirdPersonHeadOffset(LLVector3::zero);
//interpolate to new camera position
- gAgent.startCameraAnimation();
+ gAgentCamera.startCameraAnimation();
// make sure we are not trying to autopilot
gAgent.stopAutoPilot();
- gAgent.setupSitCamera();
- if (gAgent.getForceMouselook())
+ gAgentCamera.setupSitCamera();
+ if (gAgentCamera.getForceMouselook())
{
- gAgent.changeCameraToMouselook();
+ gAgentCamera.changeCameraToMouselook();
}
}
@@ -5633,6 +5818,8 @@ void LLVOAvatar::sitOnObject(LLViewerObject *sit_object)
mDrawable->mXform.setRotation(mDrawable->getWorldRotation() * inv_obj_rot);
gPipeline.markMoved(mDrawable, TRUE);
+ // Notice that removing sitDown() from here causes avatars sitting on
+ // objects to be not rendered for new arrivals. See EXT-6835 and EXT-1655.
sitDown(TRUE);
mRoot.getXform()->setParent(&sit_object->mDrawable->mXform); // LLVOAvatar::sitOnObject
mRoot.setPosition(getPosition());
@@ -5702,9 +5889,9 @@ void LLVOAvatar::getOffObject()
//reset orientation
// mRoot.setRotation(avWorldRot);
- gAgent.setThirdPersonHeadOffset(LLVector3(0.f, 0.f, 1.f));
+ gAgentCamera.setThirdPersonHeadOffset(LLVector3(0.f, 0.f, 1.f));
- gAgent.setSitCamera(LLUUID::null);
+ gAgentCamera.setSitCamera(LLUUID::null);
}
}
@@ -5767,11 +5954,6 @@ void LLVOAvatar::invalidateAll()
{
}
-// virtual
-void LLVOAvatar::setCompositeUpdatesEnabled( BOOL b )
-{
-}
-
void LLVOAvatar::onGlobalColorChanged(const LLTexGlobalColor* global_color, BOOL upload_bake )
{
if (global_color == mTexSkinColor)
@@ -5810,27 +5992,29 @@ BOOL LLVOAvatar::isVisible() const
&& (mDrawable->isVisible() || mIsDummy);
}
-// call periodically to keep isFullyLoaded up to date.
-// returns true if the value has changed.
-BOOL LLVOAvatar::updateIsFullyLoaded()
+// Determine if we have enough avatar data to render
+BOOL LLVOAvatar::getIsCloud()
{
- // a "heuristic" to determine if we have enough avatar data to render
- // (to avoid rendering a "Ruth" - DEV-3168)
- BOOL loading = FALSE;
-
- // do we have a shape?
+ // Do we have a shape?
if (visualParamWeightsAreDefault())
{
- loading = TRUE;
+ return TRUE;
}
if (!isTextureDefined(TEX_LOWER_BAKED) ||
!isTextureDefined(TEX_UPPER_BAKED) ||
!isTextureDefined(TEX_HEAD_BAKED))
{
- loading = TRUE;
+ return TRUE;
}
-
+ return FALSE;
+}
+
+// call periodically to keep isFullyLoaded up to date.
+// returns true if the value has changed.
+BOOL LLVOAvatar::updateIsFullyLoaded()
+{
+ const BOOL loading = getIsCloud();
updateRuthTimer(loading);
return processFullyLoadedChange(loading);
}
@@ -5845,19 +6029,28 @@ void LLVOAvatar::updateRuthTimer(bool loading)
if (mPreviousFullyLoaded)
{
mRuthTimer.reset();
+ if (gSavedSettings.getBOOL("DebugAvatarRezTime"))
+ {
+ llinfos << "REZTIME: [ " << (U32)mDebugExistenceTimer.getElapsedTimeF32() << "sec ] Avatar '" << getFullname() << "' became cloud." << llendl;
+ LLSD args;
+ args["EXISTENCE"] = llformat("%d",(U32)mDebugExistenceTimer.getElapsedTimeF32());
+ args["TIME"] = llformat("%d",(U32)mRuthDebugTimer.getElapsedTimeF32());
+ args["NAME"] = getFullname();
+ LLNotificationsUtil::add("AvatarRezCloudNotification",args);
+ }
+ mRuthDebugTimer.reset();
}
- const F32 LOADING_TIMEOUT = 120.f;
- if (mRuthTimer.getElapsedTimeF32() > LOADING_TIMEOUT)
+ const F32 LOADING_TIMEOUT__SECONDS = 120.f;
+ if (mRuthTimer.getElapsedTimeF32() > LOADING_TIMEOUT__SECONDS)
{
- /*
llinfos << "Ruth Timer timeout: Missing texture data for '" << getFullname() << "' "
<< "( Params loaded : " << !visualParamWeightsAreDefault() << " ) "
<< "( Lower : " << isTextureDefined(TEX_LOWER_BAKED) << " ) "
<< "( Upper : " << isTextureDefined(TEX_UPPER_BAKED) << " ) "
<< "( Head : " << isTextureDefined(TEX_HEAD_BAKED) << " )."
<< llendl;
- */
+
LLAvatarPropertiesProcessor::getInstance()->sendAvatarTexturesRequest(getID());
mRuthTimer.reset();
}
@@ -5873,7 +6066,19 @@ BOOL LLVOAvatar::processFullyLoadedChange(bool loading)
mFullyLoaded = (mFullyLoadedTimer.getElapsedTimeF32() > PAUSE);
-
+ if (gSavedSettings.getBOOL("DebugAvatarRezTime"))
+ {
+ if (!mPreviousFullyLoaded && !loading && mFullyLoaded)
+ {
+ llinfos << "REZTIME: [ " << (U32)mDebugExistenceTimer.getElapsedTimeF32() << "sec ] Avatar '" << getFullname() << "' resolved in " << (U32)mRuthDebugTimer.getElapsedTimeF32() << " seconds." << llendl;
+ LLSD args;
+ args["EXISTENCE"] = llformat("%d",(U32)mDebugExistenceTimer.getElapsedTimeF32());
+ args["TIME"] = llformat("%d",(U32)mRuthDebugTimer.getElapsedTimeF32());
+ args["NAME"] = getFullname();
+ LLNotificationsUtil::add("AvatarRezNotification",args);
+ }
+ }
+
// did our loading state "change" from last call?
const S32 UPDATE_RATE = 30;
BOOL changed =
@@ -5924,7 +6129,7 @@ void LLVOAvatar::updateMeshTextures()
}
}
- const BOOL self_customizing = isSelf() && gAgent.cameraCustomizeAvatar(); // During face edit mode, we don't use baked textures
+ const BOOL self_customizing = isSelf() && gAgentCamera.cameraCustomizeAvatar(); // During face edit mode, we don't use baked textures
const BOOL other_culled = !isSelf() && mCulled;
std::vector<BOOL> is_layer_baked;
@@ -6177,7 +6382,7 @@ void LLVOAvatar::releaseComponentTextures()
const LLVOAvatarDictionary::BakedEntry * bakedDicEntry = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index);
// skip if this is a skirt and av is not wearing one, or if we don't have a baked texture UUID
if (!isTextureDefined(bakedDicEntry->mTextureIndex)
- && ( (baked_index != BAKED_SKIRT) || isWearingWearableType(WT_SKIRT) ))
+ && ( (baked_index != BAKED_SKIRT) || isWearingWearableType(LLWearableType::WT_SKIRT) ))
{
continue;
}
@@ -6250,6 +6455,14 @@ BOOL LLVOAvatar::teToColorParams( ETextureIndex te, U32 *param_name )
param_name[2] = 923; //"skirt_blue";
break;
+ case TEX_HEAD_TATTOO:
+ case TEX_LOWER_TATTOO:
+ case TEX_UPPER_TATTOO:
+ param_name[0] = 1071; //"tattoo_red";
+ param_name[1] = 1072; //"tattoo_green";
+ param_name[2] = 1073; //"tattoo_blue";
+ break;
+
default:
llassert(0);
return FALSE;
@@ -6290,16 +6503,13 @@ LLColor4 LLVOAvatar::getDummyColor()
void LLVOAvatar::dumpAvatarTEs( const std::string& context ) const
{
- /* const char* te_name[] = {
- "TEX_HEAD_BODYPAINT ",
- "TEX_UPPER_SHIRT ", */
llinfos << (isSelf() ? "Self: " : "Other: ") << context << llendl;
for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin();
iter != LLVOAvatarDictionary::getInstance()->getTextures().end();
++iter)
{
const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second;
- // TODO: handle multiple textures for self
+ // TODO: MULTI-WEARABLE: handle multiple textures for self
const LLViewerTexture* te_image = getImage(iter->first,0);
if( !te_image )
{
@@ -6325,23 +6535,23 @@ void LLVOAvatar::dumpAvatarTEs( const std::string& context ) const
}
// Unlike most wearable functions, this works for both self and other.
-BOOL LLVOAvatar::isWearingWearableType(EWearableType type) const
+BOOL LLVOAvatar::isWearingWearableType(LLWearableType::EType type) const
{
if (mIsDummy) return TRUE;
switch(type)
{
- case WT_SHAPE:
- case WT_SKIN:
- case WT_HAIR:
- case WT_EYES:
+ case LLWearableType::WT_SHAPE:
+ case LLWearableType::WT_SKIN:
+ case LLWearableType::WT_HAIR:
+ case LLWearableType::WT_EYES:
return TRUE; // everyone has all bodyparts
default:
break; // Do nothing
}
/* switch(type)
- case WT_SHIRT:
+ case LLWearableType::WT_SHIRT:
indicator_te = TEX_UPPER_SHIRT; */
for (LLVOAvatarDictionary::Textures::const_iterator tex_iter = LLVOAvatarDictionary::getInstance()->getTextures().begin();
tex_iter != LLVOAvatarDictionary::getInstance()->getTextures().end();
@@ -6479,6 +6689,41 @@ void LLVOAvatar::onFirstTEMessageReceived()
}
//-----------------------------------------------------------------------------
+// bool visualParamWeightsAreDefault()
+//-----------------------------------------------------------------------------
+bool LLVOAvatar::visualParamWeightsAreDefault()
+{
+ bool rtn = true;
+
+ bool is_wearing_skirt = isWearingWearableType(LLWearableType::WT_SKIRT);
+ for (LLVisualParam *param = getFirstVisualParam();
+ param;
+ param = getNextVisualParam())
+ {
+ if (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE)
+ {
+ LLViewerVisualParam* vparam = dynamic_cast<LLViewerVisualParam*>(param);
+ llassert(vparam);
+ bool is_skirt_param = vparam &&
+ LLWearableType::WT_SKIRT == vparam->getWearableType();
+ if (param->getWeight() != param->getDefaultWeight() &&
+ // we have to not care whether skirt weights are default, if we're not actually wearing a skirt
+ (is_wearing_skirt || !is_skirt_param))
+ {
+ //llinfos << "param '" << param->getName() << "'=" << param->getWeight() << " which differs from default=" << param->getDefaultWeight() << llendl;
+ rtn = false;
+ break;
+ }
+ }
+ }
+
+ //llinfos << "params are default ? " << int(rtn) << llendl;
+
+ return rtn;
+}
+
+
+//-----------------------------------------------------------------------------
// processAvatarAppearance()
//-----------------------------------------------------------------------------
void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
@@ -6546,16 +6791,17 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
{
releaseComponentTextures();
}
-
-
+
// parse visual params
S32 num_blocks = mesgsys->getNumberOfBlocksFast(_PREHASH_VisualParam);
- if( num_blocks > 1 )
+ bool drop_visual_params_debug = gSavedSettings.getBOOL("BlockSomeAvatarAppearanceVisualParams") && (ll_rand(2) == 0); // pretend that ~12% of AvatarAppearance messages arrived without a VisualParam block, for testing
+ if( num_blocks > 1 && !drop_visual_params_debug)
{
BOOL params_changed = FALSE;
BOOL interp_params = FALSE;
LLVisualParam* param = getFirstVisualParam();
+ llassert(param); // if this ever fires, we should do the same as when num_blocks<=1
if (!param)
{
llwarns << "No visual params!" << llendl;
@@ -6571,8 +6817,8 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
if( !param )
{
- llwarns << "Number of params in AvatarAppearance msg does not match number of params in avatar xml file." << llendl;
- return;
+ // more visual params supplied than expected - just process what we know about
+ break;
}
U8 value;
@@ -6597,14 +6843,10 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
}
}
- while( param && (param->getGroup() != VISUAL_PARAM_GROUP_TWEAKABLE) )
- {
- param = getNextVisualParam();
- }
- if( param )
+ const S32 expected_tweakable_count = getVisualParamCountInGroup(VISUAL_PARAM_GROUP_TWEAKABLE);
+ if (num_blocks != expected_tweakable_count)
{
- llwarns << "Number of params in AvatarAppearance msg does not match number of params in avatar xml file." << llendl;
- return;
+ llinfos << "Number of params in AvatarAppearance msg (" << num_blocks << ") does not match number of tweakable params in avatar xml file (" << expected_tweakable_count << "). Processing what we can. object: " << getID() << llendl;
}
if (params_changed)
@@ -6621,16 +6863,37 @@ void LLVOAvatar::processAvatarAppearance( LLMessageSystem* mesgsys )
updateSexDependentLayerSets( FALSE );
}
}
+
+ llassert( getSex() == ((getVisualParamWeight( "male" ) > 0.5f) ? SEX_MALE : SEX_FEMALE) );
}
else
{
- llwarns << "AvatarAppearance msg received without any parameters, object: " << getID() << llendl;
+ // AvatarAppearance message arrived without visual params
+ if (drop_visual_params_debug)
+ {
+ llinfos << "Debug-faked lack of parameters on AvatarAppearance for object: " << getID() << llendl;
+ }
+ else
+ {
+ llinfos << "AvatarAppearance msg received without any parameters, object: " << getID() << llendl;
+ }
+
+ // this isn't really a problem if we already have a non-default shape
+ if (visualParamWeightsAreDefault())
+ {
+ // re-request appearance, hoping that it comes back with a shape next time
+ llinfos << "Re-requesting AvatarAppearance for object: " << getID() << llendl;
+ LLAvatarPropertiesProcessor::getInstance()->sendAvatarTexturesRequest(getID());
+ }
+ else
+ {
+ llinfos << "That's okay, we already have a non-default shape for object: " << getID() << llendl;
+ // we don't really care.
+ }
}
setCompositeUpdatesEnabled( TRUE );
- llassert( getSex() == ((getVisualParamWeight( "male" ) > 0.5f) ? SEX_MALE : SEX_FEMALE) );
-
// If all of the avatars are completely baked, release the global image caches to conserve memory.
LLVOAvatar::cullAvatarsByPixelArea();
@@ -6845,8 +7108,7 @@ void LLVOAvatar::useBakedTexture( const LLUUID& id )
// static
void LLVOAvatar::dumpArchetypeXML( void* )
{
- LLVOAvatar* avatar = gAgent.getAvatarObject();
- LLAPRFile outfile ;
+ LLAPRFile outfile;
outfile.open(gDirUtilp->getExpandedFilename(LL_PATH_CHARACTER,"new archetype.xml"), LL_APR_WB );
apr_file_t* file = outfile.getFileHandle() ;
if (!file)
@@ -6859,12 +7121,12 @@ void LLVOAvatar::dumpArchetypeXML( void* )
apr_file_printf( file, "\n\t<archetype name=\"???\">\n" );
// only body parts, not clothing.
- for (S32 type = WT_SHAPE; type <= WT_EYES; type++)
+ for (S32 type = LLWearableType::WT_SHAPE; type <= LLWearableType::WT_EYES; type++)
{
- const std::string& wearable_name = LLWearableDictionary::getTypeName((EWearableType)type);
+ const std::string& wearable_name = LLWearableType::getTypeName((LLWearableType::EType)type);
apr_file_printf( file, "\n\t\t<!-- wearable: %s -->\n", wearable_name.c_str() );
- for (LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam())
+ for (LLVisualParam* param = gAgentAvatarp->getFirstVisualParam(); param; param = gAgentAvatarp->getNextVisualParam())
{
LLViewerVisualParam* viewer_param = (LLViewerVisualParam*)param;
if( (viewer_param->getWearableType() == type) &&
@@ -6880,7 +7142,7 @@ void LLVOAvatar::dumpArchetypeXML( void* )
if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex)te) == type)
{
// MULTIPLE_WEARABLES: extend to multiple wearables?
- LLViewerTexture* te_image = avatar->getImage((ETextureIndex)te, 0);
+ LLViewerTexture* te_image = ((LLVOAvatar *)(gAgentAvatarp))->getImage((ETextureIndex)te, 0);
if( te_image )
{
std::string uuid_str;
@@ -7655,6 +7917,8 @@ void LLVOAvatar::idleUpdateRenderCost()
static const U32 ARC_BODY_PART_COST = 20;
static const U32 ARC_LIMIT = 2048;
+ static std::set<LLUUID> all_textures;
+
if (!gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_SHAME))
{
return;
@@ -7667,7 +7931,7 @@ void LLVOAvatar::idleUpdateRenderCost()
{
const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)baked_index);
ETextureIndex tex_index = baked_dict->mTextureIndex;
- if ((tex_index != TEX_SKIRT_BAKED) || (isWearingWearableType(WT_SKIRT)))
+ if ((tex_index != TEX_SKIRT_BAKED) || (isWearingWearableType(LLWearableType::WT_SKIRT)))
{
if (isTextureVisible(tex_index))
{
@@ -7700,7 +7964,45 @@ void LLVOAvatar::idleUpdateRenderCost()
}
}
}
+ // Diagnostic output to identify all avatar-related textures.
+ // Does not affect rendering cost calculation.
+ // Could be wrapped in a debug option if output becomes problematic.
+ if (isSelf())
+ {
+ // print any attachment textures we didn't already know about.
+ for (std::set<LLUUID>::iterator it = textures.begin(); it != textures.end(); ++it)
+ {
+ LLUUID image_id = *it;
+ if( image_id.isNull() || image_id == IMG_DEFAULT || image_id == IMG_DEFAULT_AVATAR)
+ continue;
+ if (all_textures.find(image_id) == all_textures.end())
+ {
+ // attachment texture not previously seen.
+ llinfos << "attachment_texture: " << image_id.asString() << llendl;
+ all_textures.insert(image_id);
+ }
+ }
+ // print any avatar textures we didn't already know about
+ for (LLVOAvatarDictionary::Textures::const_iterator iter = LLVOAvatarDictionary::getInstance()->getTextures().begin();
+ iter != LLVOAvatarDictionary::getInstance()->getTextures().end();
+ ++iter)
+ {
+ const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second;
+ // TODO: MULTI-WEARABLE: handle multiple textures for self
+ const LLViewerTexture* te_image = getImage(iter->first,0);
+ if (!te_image)
+ continue;
+ LLUUID image_id = te_image->getID();
+ if( image_id.isNull() || image_id == IMG_DEFAULT || image_id == IMG_DEFAULT_AVATAR)
+ continue;
+ if (all_textures.find(image_id) == all_textures.end())
+ {
+ llinfos << "local_texture: " << texture_dict->mName << ": " << image_id << llendl;
+ all_textures.insert(image_id);
+ }
+ }
+ }
cost += textures.size() * LLVOVolume::ARC_TEXTURE_COST;
setDebugText(llformat("%d", cost));
@@ -7775,3 +8077,26 @@ BOOL LLVOAvatar::isTextureDefined(LLVOAvatarDefines::ETextureIndex te, U32 index
getImage(te, index)->getID() != IMG_DEFAULT);
}
+//virtual
+BOOL LLVOAvatar::isTextureVisible(LLVOAvatarDefines::ETextureIndex type, U32 index) const
+{
+ if (isIndexLocalTexture(type))
+ {
+ return isTextureDefined(type, index);
+ }
+ else
+ {
+ // baked textures can use TE images directly
+ return ((isTextureDefined(type) || isSelf())
+ && (getTEImage(type)->getID() != IMG_INVISIBLE
+ || LLDrawPoolAlpha::sShowDebugAlpha));
+ }
+}
+
+//virtual
+BOOL LLVOAvatar::isTextureVisible(LLVOAvatarDefines::ETextureIndex type, LLWearable *wearable) const
+{
+ // non-self avatars don't have wearables
+ return FALSE;
+}
+
diff --git a/indra/newview/llvoavatar.h b/indra/newview/llvoavatar.h
index a5815df20a..4259bb8e73 100644
--- a/indra/newview/llvoavatar.h
+++ b/indra/newview/llvoavatar.h
@@ -1,6 +1,6 @@
/**
* @file llvoavatar.h
- * @brief Declaration of LLVOAvatar class which is a derivation fo
+ * @brief Declaration of LLVOAvatar class which is a derivation of
* LLViewerObject
*
* $LicenseInfo:firstyear=2001&license=viewergpl$
@@ -71,9 +71,10 @@ class LLTexGlobalColor;
class LLVOAvatarBoneInfo;
class LLVOAvatarSkeletonInfo;
-//------------------------------------------------------------------------
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// LLVOAvatar
-//------------------------------------------------------------------------
+//
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLVOAvatar :
public LLViewerObject,
public LLCharacter
@@ -138,13 +139,13 @@ public:
virtual void updateSpatialExtents(LLVector3& newMin, LLVector3 &newMax);
virtual void getSpatialExtents(LLVector3& newMin, LLVector3& newMax);
virtual BOOL lineSegmentIntersect(const LLVector3& start, const LLVector3& end,
- S32 face = -1, // which face to check, -1 = ALL_SIDES
- BOOL pick_transparent = FALSE,
- S32* face_hit = NULL, // which face was hit
- LLVector3* intersection = NULL, // return the intersection point
- LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point
- LLVector3* normal = NULL, // return the surface normal at the intersection point
- LLVector3* bi_normal = NULL); // return the surface bi-normal at the intersection point
+ S32 face = -1, // which face to check, -1 = ALL_SIDES
+ BOOL pick_transparent = FALSE,
+ S32* face_hit = NULL, // which face was hit
+ LLVector3* intersection = NULL, // return the intersection point
+ LLVector2* tex_coord = NULL, // return the texture coordinates of the intersection point
+ LLVector3* normal = NULL, // return the surface normal at the intersection point
+ LLVector3* bi_normal = NULL); // return the surface bi-normal at the intersection point
//--------------------------------------------------------------------
// LLCharacter interface and related
@@ -157,12 +158,14 @@ public:
virtual LLJoint* getCharacterJoint(U32 num);
virtual BOOL allocateCharacterJoints(U32 num);
+ virtual LLUUID remapMotionID(const LLUUID& id);
virtual BOOL startMotion(const LLUUID& id, F32 time_offset = 0.f);
virtual BOOL stopMotion(const LLUUID& id, BOOL stop_immediate = FALSE);
virtual void stopMotionFromSource(const LLUUID& source_id);
virtual void requestStopMotion(LLMotion* motion);
LLMotion* findMotion(const LLUUID& id) const;
void startDefaultMotions();
+ void dumpAnimationState();
virtual LLJoint* getJoint(const std::string &name);
virtual LLJoint* getRootJoint() { return &mRoot; }
@@ -220,8 +223,8 @@ public:
public:
static S32 sRenderName;
static BOOL sRenderGroupTitles;
- static S32 sMaxVisible;
- static F32 sRenderDistance; //distance at which avatars will render (affected by control "RenderAvatarMaxVisible")
+ static U32 sMaxVisible; //(affected by control "RenderAvatarMaxVisible")
+ static F32 sRenderDistance; //distance at which avatars will render.
static BOOL sShowAnimationDebug; // show animation debug info
static BOOL sUseImpostors; //use impostors for far away avatars
static BOOL sShowFootPlane; // show foot collision plane reported by server
@@ -246,8 +249,10 @@ public:
//--------------------------------------------------------------------
public:
BOOL isFullyLoaded() const;
+ bool visualParamWeightsAreDefault();
protected:
- virtual BOOL updateIsFullyLoaded();
+ virtual BOOL getIsCloud();
+ BOOL updateIsFullyLoaded();
BOOL processFullyLoadedChange(bool loading);
void updateRuthTimer(bool loading);
F32 calcMorphAmount();
@@ -460,7 +465,9 @@ public:
//--------------------------------------------------------------------
public:
virtual BOOL isTextureDefined(LLVOAvatarDefines::ETextureIndex type, U32 index = 0) const;
- BOOL isTextureVisible(LLVOAvatarDefines::ETextureIndex index) const;
+ virtual BOOL isTextureVisible(LLVOAvatarDefines::ETextureIndex type, U32 index = 0) const;
+ virtual BOOL isTextureVisible(LLVOAvatarDefines::ETextureIndex type, LLWearable *wearable) const;
+
protected:
BOOL isFullyBaked();
static BOOL areAllNearbyInstancesBaked(S32& grey_avatars);
@@ -526,7 +533,9 @@ protected:
public:
virtual void invalidateComposite(LLTexLayerSet* layerset, BOOL upload_result);
virtual void invalidateAll();
- virtual void setCompositeUpdatesEnabled(BOOL b);
+ virtual void setCompositeUpdatesEnabled(bool b) {}
+ virtual void setCompositeUpdatesEnabled(U32 index, bool b) {}
+ virtual bool isCompositeUpdateEnabled(U32 index) { return false; }
//--------------------------------------------------------------------
// Static texture/mesh/baked dictionary
@@ -565,7 +574,7 @@ public:
void updateMeshData();
protected:
void releaseMeshData();
- /*virtual*/ void restoreMeshData();
+ virtual void restoreMeshData();
private:
BOOL mDirtyMesh;
BOOL mMeshTexturesDirty;
@@ -642,7 +651,7 @@ public:
**/
public:
- virtual BOOL isWearingWearableType(EWearableType type ) const;
+ virtual BOOL isWearingWearableType(LLWearableType::EType type ) const;
//--------------------------------------------------------------------
// Attachments
@@ -826,6 +835,7 @@ private:
BOOL mNameBusy;
BOOL mNameMute;
BOOL mNameAppearance;
+ BOOL mNameCloud;
BOOL mRenderGroupTitles;
//--------------------------------------------------------------------
@@ -887,6 +897,9 @@ private:
** DIAGNOSTICS
**/
+ //--------------------------------------------------------------------
+ // General
+ //--------------------------------------------------------------------
public:
static void dumpArchetypeXML(void*);
static void dumpBakedStatus();
@@ -906,6 +919,16 @@ private:
F32 mAdjustedPixelArea;
std::string mDebugText;
+
+ //--------------------------------------------------------------------
+ // Avatar Rez Metrics
+ //--------------------------------------------------------------------
+public:
+ F32 debugGetExistenceTimeElapsedF32() const { return mDebugExistenceTimer.getElapsedTimeF32(); }
+protected:
+ LLFrameTimer mRuthDebugTimer; // For tracking how long it takes for av to rez
+ LLFrameTimer mDebugExistenceTimer; // Debugging for how long the avatar has been in memory.
+
/** Diagnostics
** **
*******************************************************************************/
@@ -1023,14 +1046,4 @@ protected: // Shared with LLVOAvatarSelf
}; // LLVOAvatar
-//------------------------------------------------------------------------
-// Inlines
-//------------------------------------------------------------------------
-inline BOOL LLVOAvatar::isTextureVisible(LLVOAvatarDefines::ETextureIndex te) const
-{
- return ((isTextureDefined(te) || isSelf())
- && (getTEImage(te)->getID() != IMG_INVISIBLE
- || LLDrawPoolAlpha::sShowDebugAlpha));
-}
-
#endif // LL_VO_AVATAR_H
diff --git a/indra/newview/llvoavatardefines.cpp b/indra/newview/llvoavatardefines.cpp
index 49c4a1a6c8..ed0a4f147d 100644
--- a/indra/newview/llvoavatardefines.cpp
+++ b/indra/newview/llvoavatardefines.cpp
@@ -46,31 +46,31 @@ using namespace LLVOAvatarDefines;
LLVOAvatarDictionary::Textures::Textures()
{
- addEntry(TEX_HEAD_BODYPAINT, new TextureEntry("head_bodypaint", TRUE, BAKED_NUM_INDICES, "", WT_SKIN));
- addEntry(TEX_UPPER_SHIRT, new TextureEntry("upper_shirt", TRUE, BAKED_NUM_INDICES, "UIImgDefaultShirtUUID", WT_SHIRT));
- addEntry(TEX_LOWER_PANTS, new TextureEntry("lower_pants", TRUE, BAKED_NUM_INDICES, "UIImgDefaultPantsUUID", WT_PANTS));
- addEntry(TEX_EYES_IRIS, new TextureEntry("eyes_iris", TRUE, BAKED_NUM_INDICES, "UIImgDefaultEyesUUID", WT_EYES));
- addEntry(TEX_HAIR, new TextureEntry("hair_grain", TRUE, BAKED_NUM_INDICES, "UIImgDefaultHairUUID", WT_HAIR));
- addEntry(TEX_UPPER_BODYPAINT, new TextureEntry("upper_bodypaint", TRUE, BAKED_NUM_INDICES, "", WT_SKIN));
- addEntry(TEX_LOWER_BODYPAINT, new TextureEntry("lower_bodypaint", TRUE, BAKED_NUM_INDICES, "", WT_SKIN));
- addEntry(TEX_LOWER_SHOES, new TextureEntry("lower_shoes", TRUE, BAKED_NUM_INDICES, "UIImgDefaultShoesUUID", WT_SHOES));
- addEntry(TEX_LOWER_SOCKS, new TextureEntry("lower_socks", TRUE, BAKED_NUM_INDICES, "UIImgDefaultSocksUUID", WT_SOCKS));
- addEntry(TEX_UPPER_JACKET, new TextureEntry("upper_jacket", TRUE, BAKED_NUM_INDICES, "UIImgDefaultJacketUUID", WT_JACKET));
- addEntry(TEX_LOWER_JACKET, new TextureEntry("lower_jacket", TRUE, BAKED_NUM_INDICES, "UIImgDefaultJacketUUID", WT_JACKET));
- addEntry(TEX_UPPER_GLOVES, new TextureEntry("upper_gloves", TRUE, BAKED_NUM_INDICES, "UIImgDefaultGlovesUUID", WT_GLOVES));
- addEntry(TEX_UPPER_UNDERSHIRT, new TextureEntry("upper_undershirt", TRUE, BAKED_NUM_INDICES, "UIImgDefaultUnderwearUUID", WT_UNDERSHIRT));
- addEntry(TEX_LOWER_UNDERPANTS, new TextureEntry("lower_underpants", TRUE, BAKED_NUM_INDICES, "UIImgDefaultUnderwearUUID", WT_UNDERPANTS));
- addEntry(TEX_SKIRT, new TextureEntry("skirt", TRUE, BAKED_NUM_INDICES, "UIImgDefaultSkirtUUID", WT_SKIRT));
+ addEntry(TEX_HEAD_BODYPAINT, new TextureEntry("head_bodypaint", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_SKIN));
+ addEntry(TEX_UPPER_SHIRT, new TextureEntry("upper_shirt", TRUE, BAKED_NUM_INDICES, "UIImgDefaultShirtUUID", LLWearableType::WT_SHIRT));
+ addEntry(TEX_LOWER_PANTS, new TextureEntry("lower_pants", TRUE, BAKED_NUM_INDICES, "UIImgDefaultPantsUUID", LLWearableType::WT_PANTS));
+ addEntry(TEX_EYES_IRIS, new TextureEntry("eyes_iris", TRUE, BAKED_NUM_INDICES, "UIImgDefaultEyesUUID", LLWearableType::WT_EYES));
+ addEntry(TEX_HAIR, new TextureEntry("hair_grain", TRUE, BAKED_NUM_INDICES, "UIImgDefaultHairUUID", LLWearableType::WT_HAIR));
+ addEntry(TEX_UPPER_BODYPAINT, new TextureEntry("upper_bodypaint", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_SKIN));
+ addEntry(TEX_LOWER_BODYPAINT, new TextureEntry("lower_bodypaint", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_SKIN));
+ addEntry(TEX_LOWER_SHOES, new TextureEntry("lower_shoes", TRUE, BAKED_NUM_INDICES, "UIImgDefaultShoesUUID", LLWearableType::WT_SHOES));
+ addEntry(TEX_LOWER_SOCKS, new TextureEntry("lower_socks", TRUE, BAKED_NUM_INDICES, "UIImgDefaultSocksUUID", LLWearableType::WT_SOCKS));
+ addEntry(TEX_UPPER_JACKET, new TextureEntry("upper_jacket", TRUE, BAKED_NUM_INDICES, "UIImgDefaultJacketUUID", LLWearableType::WT_JACKET));
+ addEntry(TEX_LOWER_JACKET, new TextureEntry("lower_jacket", TRUE, BAKED_NUM_INDICES, "UIImgDefaultJacketUUID", LLWearableType::WT_JACKET));
+ addEntry(TEX_UPPER_GLOVES, new TextureEntry("upper_gloves", TRUE, BAKED_NUM_INDICES, "UIImgDefaultGlovesUUID", LLWearableType::WT_GLOVES));
+ addEntry(TEX_UPPER_UNDERSHIRT, new TextureEntry("upper_undershirt", TRUE, BAKED_NUM_INDICES, "UIImgDefaultUnderwearUUID", LLWearableType::WT_UNDERSHIRT));
+ addEntry(TEX_LOWER_UNDERPANTS, new TextureEntry("lower_underpants", TRUE, BAKED_NUM_INDICES, "UIImgDefaultUnderwearUUID", LLWearableType::WT_UNDERPANTS));
+ addEntry(TEX_SKIRT, new TextureEntry("skirt", TRUE, BAKED_NUM_INDICES, "UIImgDefaultSkirtUUID", LLWearableType::WT_SKIRT));
- addEntry(TEX_LOWER_ALPHA, new TextureEntry("lower_alpha", TRUE, BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID", WT_ALPHA));
- addEntry(TEX_UPPER_ALPHA, new TextureEntry("upper_alpha", TRUE, BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID", WT_ALPHA));
- addEntry(TEX_HEAD_ALPHA, new TextureEntry("head_alpha", TRUE, BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID", WT_ALPHA));
- addEntry(TEX_EYES_ALPHA, new TextureEntry("eyes_alpha", TRUE, BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID", WT_ALPHA));
- addEntry(TEX_HAIR_ALPHA, new TextureEntry("hair_alpha", TRUE, BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID", WT_ALPHA));
+ addEntry(TEX_LOWER_ALPHA, new TextureEntry("lower_alpha", TRUE, BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID", LLWearableType::WT_ALPHA));
+ addEntry(TEX_UPPER_ALPHA, new TextureEntry("upper_alpha", TRUE, BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID", LLWearableType::WT_ALPHA));
+ addEntry(TEX_HEAD_ALPHA, new TextureEntry("head_alpha", TRUE, BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID", LLWearableType::WT_ALPHA));
+ addEntry(TEX_EYES_ALPHA, new TextureEntry("eyes_alpha", TRUE, BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID", LLWearableType::WT_ALPHA));
+ addEntry(TEX_HAIR_ALPHA, new TextureEntry("hair_alpha", TRUE, BAKED_NUM_INDICES, "UIImgDefaultAlphaUUID", LLWearableType::WT_ALPHA));
- addEntry(TEX_HEAD_TATTOO, new TextureEntry("head_tattoo", TRUE, BAKED_NUM_INDICES, "", WT_TATTOO));
- addEntry(TEX_UPPER_TATTOO, new TextureEntry("upper_tattoo", TRUE, BAKED_NUM_INDICES, "", WT_TATTOO));
- addEntry(TEX_LOWER_TATTOO, new TextureEntry("lower_tattoo", TRUE, BAKED_NUM_INDICES, "", WT_TATTOO));
+ addEntry(TEX_HEAD_TATTOO, new TextureEntry("head_tattoo", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_TATTOO));
+ addEntry(TEX_UPPER_TATTOO, new TextureEntry("upper_tattoo", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_TATTOO));
+ addEntry(TEX_LOWER_TATTOO, new TextureEntry("lower_tattoo", TRUE, BAKED_NUM_INDICES, "", LLWearableType::WT_TATTOO));
addEntry(TEX_HEAD_BAKED, new TextureEntry("head-baked", FALSE, BAKED_HEAD));
addEntry(TEX_UPPER_BAKED, new TextureEntry("upper-baked", FALSE, BAKED_UPPER));
@@ -86,34 +86,34 @@ LLVOAvatarDictionary::BakedTextures::BakedTextures()
addEntry(BAKED_HEAD, new BakedEntry(TEX_HEAD_BAKED,
"head", "a4b9dc38-e13b-4df9-b284-751efb0566ff",
3, TEX_HEAD_BODYPAINT, TEX_HEAD_TATTOO, TEX_HEAD_ALPHA,
- 5, WT_SHAPE, WT_SKIN, WT_HAIR, WT_TATTOO, WT_ALPHA));
+ 5, LLWearableType::WT_SHAPE, LLWearableType::WT_SKIN, LLWearableType::WT_HAIR, LLWearableType::WT_TATTOO, LLWearableType::WT_ALPHA));
addEntry(BAKED_UPPER, new BakedEntry(TEX_UPPER_BAKED,
"upper_body", "5943ff64-d26c-4a90-a8c0-d61f56bd98d4",
7, TEX_UPPER_SHIRT,TEX_UPPER_BODYPAINT, TEX_UPPER_JACKET,
TEX_UPPER_GLOVES, TEX_UPPER_UNDERSHIRT, TEX_UPPER_TATTOO, TEX_UPPER_ALPHA,
- 8, WT_SHAPE, WT_SKIN, WT_SHIRT, WT_JACKET, WT_GLOVES, WT_UNDERSHIRT, WT_TATTOO, WT_ALPHA));
+ 8, LLWearableType::WT_SHAPE, LLWearableType::WT_SKIN, LLWearableType::WT_SHIRT, LLWearableType::WT_JACKET, LLWearableType::WT_GLOVES, LLWearableType::WT_UNDERSHIRT, LLWearableType::WT_TATTOO, LLWearableType::WT_ALPHA));
addEntry(BAKED_LOWER, new BakedEntry(TEX_LOWER_BAKED,
"lower_body", "2944ee70-90a7-425d-a5fb-d749c782ed7d",
8, TEX_LOWER_PANTS,TEX_LOWER_BODYPAINT,TEX_LOWER_SHOES, TEX_LOWER_SOCKS,
TEX_LOWER_JACKET, TEX_LOWER_UNDERPANTS, TEX_LOWER_TATTOO, TEX_LOWER_ALPHA,
- 9, WT_SHAPE, WT_SKIN, WT_PANTS, WT_SHOES, WT_SOCKS, WT_JACKET, WT_UNDERPANTS, WT_TATTOO, WT_ALPHA));
+ 9, LLWearableType::WT_SHAPE, LLWearableType::WT_SKIN, LLWearableType::WT_PANTS, LLWearableType::WT_SHOES, LLWearableType::WT_SOCKS, LLWearableType::WT_JACKET, LLWearableType::WT_UNDERPANTS, LLWearableType::WT_TATTOO, LLWearableType::WT_ALPHA));
addEntry(BAKED_EYES, new BakedEntry(TEX_EYES_BAKED,
"eyes", "27b1bc0f-979f-4b13-95fe-b981c2ba9788",
2, TEX_EYES_IRIS, TEX_EYES_ALPHA,
- 2, WT_EYES, WT_ALPHA));
+ 2, LLWearableType::WT_EYES, LLWearableType::WT_ALPHA));
addEntry(BAKED_SKIRT, new BakedEntry(TEX_SKIRT_BAKED,
"skirt", "03e7e8cb-1368-483b-b6f3-74850838ba63",
1, TEX_SKIRT,
- 1, WT_SKIRT));
+ 1, LLWearableType::WT_SKIRT));
addEntry(BAKED_HAIR, new BakedEntry(TEX_HAIR_BAKED,
"hair", "a60e85a9-74e8-48d8-8a2d-8129f28d9b61",
2, TEX_HAIR, TEX_HAIR_ALPHA,
- 2, WT_HAIR, WT_ALPHA));
+ 2, LLWearableType::WT_HAIR, LLWearableType::WT_ALPHA));
}
LLVOAvatarDictionary::Meshes::Meshes()
@@ -170,7 +170,7 @@ LLVOAvatarDictionary::TextureEntry::TextureEntry(const std::string &name,
bool is_local_texture,
EBakedTextureIndex baked_texture_index,
const std::string &default_image_name,
- EWearableType wearable_type) :
+ LLWearableType::EType wearable_type) :
LLDictionaryEntry(name),
mIsLocalTexture(is_local_texture),
mIsBakedTexture(!is_local_texture),
@@ -216,7 +216,7 @@ LLVOAvatarDictionary::BakedEntry::BakedEntry(ETextureIndex tex_index,
// Read in wearables
for (U8 i=0; i < num_wearables; i++)
{
- EWearableType t = (EWearableType)va_arg(argp,int);
+ LLWearableType::EType t = (LLWearableType::EType)va_arg(argp,int);
mWearables.push_back(t);
}
}
@@ -261,7 +261,7 @@ const LLUUID LLVOAvatarDictionary::getDefaultTextureImageID(ETextureIndex index)
}
// static
-EWearableType LLVOAvatarDictionary::getTEWearableType(ETextureIndex index )
+LLWearableType::EType LLVOAvatarDictionary::getTEWearableType(ETextureIndex index )
{
return getInstance()->getTexture(index)->mWearableType;
}
diff --git a/indra/newview/llvoavatardefines.h b/indra/newview/llvoavatardefines.h
index cf3d318159..9c4ee7e716 100644
--- a/indra/newview/llvoavatardefines.h
+++ b/indra/newview/llvoavatardefines.h
@@ -114,7 +114,7 @@ enum EMeshIndex
typedef std::vector<ETextureIndex> texture_vec_t;
typedef std::vector<EBakedTextureIndex> bakedtexture_vec_t;
typedef std::vector<EMeshIndex> mesh_vec_t;
-typedef std::vector<EWearableType> wearables_vec_t;
+typedef std::vector<LLWearableType::EType> wearables_vec_t;
//------------------------------------------------------------------------
// LLVOAvatarDictionary
@@ -145,9 +145,9 @@ public:
bool is_local_texture,
EBakedTextureIndex baked_texture_index = BAKED_NUM_INDICES,
const std::string& default_image_name = "",
- EWearableType wearable_type = WT_INVALID);
+ LLWearableType::EType wearable_type = LLWearableType::WT_INVALID);
const std::string mDefaultImageName;
- const EWearableType mWearableType;
+ const LLWearableType::EType mWearableType;
// It's either a local texture xor baked
BOOL mIsLocalTexture;
BOOL mIsBakedTexture;
@@ -225,7 +225,7 @@ public:
static const LLUUID getDefaultTextureImageID(ETextureIndex index);
// Given a texture entry, determine which wearable type owns it.
- static EWearableType getTEWearableType(ETextureIndex index);
+ static LLWearableType::EType getTEWearableType(ETextureIndex index);
}; // End LLVOAvatarDictionary
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index b1ea8a1bbb..91af5fefde 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -44,15 +44,19 @@
#include "pipeline.h"
#include "llagent.h" // Get state values from here
+#include "llagentcamera.h"
#include "llagentwearables.h"
#include "llhudeffecttrail.h"
#include "llhudmanager.h"
+#include "llinventoryfunctions.h"
+#include "llnotificationsutil.h"
#include "llselectmgr.h"
#include "lltoolgrab.h" // for needsRenderBeam
#include "lltoolmgr.h" // for needsRenderBeam
#include "lltoolmorph.h"
#include "lltrans.h"
#include "llviewercamera.h"
+#include "llviewercontrol.h"
#include "llviewermenu.h"
#include "llviewerobjectlist.h"
#include "llviewerstats.h"
@@ -66,6 +70,14 @@
#include <boost/lexical_cast.hpp>
+LLVOAvatarSelf *gAgentAvatarp = NULL;
+BOOL isAgentAvatarValid()
+{
+ return (gAgentAvatarp &&
+ (gAgentAvatarp->getRegion() != NULL) &&
+ (!gAgentAvatarp->isDead()));
+}
+
using namespace LLVOAvatarDefines;
/*********************************************************************************
@@ -77,14 +89,14 @@ using namespace LLVOAvatarDefines;
struct LocalTextureData
{
LocalTextureData() :
- mIsBakedReady(FALSE),
+ mIsBakedReady(false),
mDiscard(MAX_DISCARD_LEVEL+1),
mImage(NULL),
mWearableID(IMG_DEFAULT_AVATAR),
mTexEntry(NULL)
{}
LLPointer<LLViewerFetchedTexture> mImage;
- BOOL mIsBakedReady;
+ bool mIsBakedReady;
S32 mDiscard;
LLUUID mWearableID; // UUID of the wearable that this texture belongs to, not of the image itself
LLTextureEntry *mTexEntry;
@@ -93,15 +105,7 @@ struct LocalTextureData
//-----------------------------------------------------------------------------
// Callback data
//-----------------------------------------------------------------------------
-struct LLAvatarTexData
-{
- LLAvatarTexData(const LLUUID& id, ETextureIndex index) :
- mAvatarID(id),
- mIndex(index)
- {}
- LLUUID mAvatarID;
- ETextureIndex mIndex;
-};
+
/**
**
@@ -132,9 +136,10 @@ LLVOAvatarSelf::LLVOAvatarSelf(const LLUUID& id,
mLastRegionHandle(0),
mRegionCrossingCount(0)
{
- gAgent.setAvatarObject(this);
gAgentWearables.setAvatarObject(this);
-
+
+ mMotionController.mIsSelf = TRUE;
+
lldebugs << "Marking avatar as self " << id << llendl;
}
@@ -147,6 +152,23 @@ void LLVOAvatarSelf::initInstance()
// adds attachment points to mScreen among other things
LLVOAvatar::initInstance();
+ llinfos << "Self avatar object created. Starting timer." << llendl;
+ mDebugSelfLoadTimer.reset();
+ // clear all times to -1 for debugging
+ for (U32 i =0; i < LLVOAvatarDefines::TEX_NUM_INDICES; ++i)
+ {
+ for (U32 j = 0; j <= MAX_DISCARD_LEVEL; ++j)
+ {
+ mDebugTextureLoadTimes[i][j] = -1.0f;
+ }
+ }
+
+ for (U32 i =0; i < LLVOAvatarDefines::BAKED_NUM_INDICES; ++i)
+ {
+ mDebugBakedTextureTimes[i][0] = -1.0f;
+ mDebugBakedTextureTimes[i][1] = -1.0f;
+ }
+
status &= buildMenus();
if (!status)
{
@@ -174,7 +196,7 @@ void LLVOAvatarSelf::markDead()
param;
param = (LLViewerVisualParam*) getNextVisualParam())
{
- if (param->getWearableType() != WT_INVALID)
+ if (param->getWearableType() != LLWearableType::WT_INVALID)
{
param->setIsDummy(TRUE);
}
@@ -211,6 +233,8 @@ BOOL LLVOAvatarSelf::buildSkeletonSelf(const LLVOAvatarSkeletonInfo *info)
LLVector3 scale(1.f, aspect, 1.f);
mScreenp->setScale(scale);
mScreenp->setWorldPosition(LLVector3::zero);
+ // need to update screen agressively when sidebar opens/closes, for example
+ mScreenp->mUpdateXform = TRUE;
return TRUE;
}
@@ -487,7 +511,7 @@ BOOL LLVOAvatarSelf::buildMenus()
{
LLMenuItemCallGL::Params item_params;
item_params.name = attachment->getName();
- item_params.label = attachment->getName();
+ item_params.label = LLTrans::getString(attachment->getName());
item_params.on_click.function_name = "Object.AttachToAvatar";
item_params.on_click.parameter = attach_index;
item_params.on_enable.function_name = "Object.EnableWear";
@@ -508,12 +532,17 @@ BOOL LLVOAvatarSelf::buildMenus()
return TRUE;
}
+void LLVOAvatarSelf::cleanup()
+{
+ markDead();
+ delete mScreenp;
+ mScreenp = NULL;
+ mRegionp = NULL;
+}
+
LLVOAvatarSelf::~LLVOAvatarSelf()
{
- gAgent.setAvatarObject(NULL);
- gAgentWearables.setAvatarObject(NULL);
- delete mScreenp;
- mScreenp = NULL;
+ cleanup();
}
/**
@@ -604,6 +633,17 @@ BOOL LLVOAvatarSelf::updateCharacter(LLAgent &agent)
}
// virtual
+BOOL LLVOAvatarSelf::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
+{
+ if (!isAgentAvatarValid())
+ {
+ return TRUE;
+ }
+ LLVOAvatar::idleUpdate(agent, world, time);
+ return TRUE;
+}
+
+// virtual
LLJoint *LLVOAvatarSelf::getJoint(const std::string &name)
{
if (mScreenp)
@@ -614,7 +654,8 @@ LLJoint *LLVOAvatarSelf::getJoint(const std::string &name)
return LLVOAvatar::getJoint(name);
}
-/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake )
+// virtual
+BOOL LLVOAvatarSelf::setVisualParamWeight(LLVisualParam *which_param, F32 weight, BOOL upload_bake )
{
if (!which_param)
{
@@ -624,7 +665,8 @@ LLJoint *LLVOAvatarSelf::getJoint(const std::string &name)
return setParamWeight(param,weight,upload_bake);
}
-/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(const char* param_name, F32 weight, BOOL upload_bake )
+// virtual
+BOOL LLVOAvatarSelf::setVisualParamWeight(const char* param_name, F32 weight, BOOL upload_bake )
{
if (!param_name)
{
@@ -634,7 +676,8 @@ LLJoint *LLVOAvatarSelf::getJoint(const std::string &name)
return setParamWeight(param,weight,upload_bake);
}
-/*virtual*/ BOOL LLVOAvatarSelf::setVisualParamWeight(S32 index, F32 weight, BOOL upload_bake )
+// virtual
+BOOL LLVOAvatarSelf::setVisualParamWeight(S32 index, F32 weight, BOOL upload_bake )
{
LLViewerVisualParam *param = (LLViewerVisualParam*) LLCharacter::getVisualParam(index);
return setParamWeight(param,weight,upload_bake);
@@ -649,7 +692,7 @@ BOOL LLVOAvatarSelf::setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL
if (param->getCrossWearable())
{
- EWearableType type = (EWearableType)param->getWearableType();
+ LLWearableType::EType type = (LLWearableType::EType)param->getWearableType();
U32 size = gAgentWearables.getWearableCount(type);
for (U32 count = 0; count < size; ++count)
{
@@ -667,15 +710,6 @@ BOOL LLVOAvatarSelf::setParamWeight(LLViewerVisualParam *param, F32 weight, BOOL
/*virtual*/
void LLVOAvatarSelf::updateVisualParams()
{
- for (U32 type = 0; type < WT_COUNT; type++)
- {
- LLWearable *wearable = gAgentWearables.getTopWearable((EWearableType)type);
- if (wearable)
- {
- wearable->writeToAvatar();
- }
- }
-
LLVOAvatar::updateVisualParams();
}
@@ -686,7 +720,14 @@ void LLVOAvatarSelf::idleUpdateAppearanceAnimation()
gAgentWearables.animateAllWearableParams(calcMorphAmount(), FALSE);
// apply wearable visual params to avatar
- updateVisualParams();
+ for (U32 type = 0; type < LLWearableType::WT_COUNT; type++)
+ {
+ LLWearable *wearable = gAgentWearables.getTopWearable((LLWearableType::EType)type);
+ if (wearable)
+ {
+ wearable->writeToAvatar();
+ }
+ }
//allow avatar to process updates
LLVOAvatar::idleUpdateAppearanceAnimation();
@@ -759,6 +800,7 @@ void LLVOAvatarSelf::removeMissingBakedTextures()
{
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
{
+ mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled(TRUE);
invalidateComposite(mBakedTextureDatas[i].mTexLayerSet, FALSE);
}
updateMeshTextures();
@@ -769,7 +811,8 @@ void LLVOAvatarSelf::removeMissingBakedTextures()
//virtual
void LLVOAvatarSelf::updateRegion(LLViewerRegion *regionp)
{
- if (regionp->getHandle() != mLastRegionHandle)
+ setRegion(regionp);
+ if (!regionp || (regionp->getHandle() != mLastRegionHandle))
{
if (mLastRegionHandle != 0)
{
@@ -783,7 +826,10 @@ void LLVOAvatarSelf::updateRegion(LLViewerRegion *regionp)
max = llmax(delta, max);
LLViewerStats::getInstance()->setStat(LLViewerStats::ST_CROSSING_MAX, max);
}
- mLastRegionHandle = regionp->getHandle();
+ if (regionp)
+ {
+ mLastRegionHandle = regionp->getHandle();
+ }
}
mRegionCrossingTimer.reset();
}
@@ -812,10 +858,10 @@ void LLVOAvatarSelf::idleUpdateTractorBeam()
{
LLObjectSelectionHandle selection = LLSelectMgr::getInstance()->getSelection();
- if (gAgent.mPointAt.notNull())
+ if (gAgentCamera.mPointAt.notNull())
{
// get point from pointat effect
- mBeam->setPositionGlobal(gAgent.mPointAt->getPointAtPosGlobal());
+ mBeam->setPositionGlobal(gAgentCamera.mPointAt->getPointAtPosGlobal());
mBeam->triggerLocal();
}
else if (selection->getFirstRootObject() &&
@@ -866,7 +912,7 @@ void LLVOAvatarSelf::restoreMeshData()
//llinfos << "Restoring" << llendl;
mMeshValid = TRUE;
updateJointLODs();
- updateAttachmentVisibility(gAgent.getCameraMode());
+ updateAttachmentVisibility(gAgentCamera.getCameraMode());
// force mesh update as LOD might not have changed to trigger this
gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_GEOMETRY, TRUE);
@@ -910,17 +956,17 @@ void LLVOAvatarSelf::updateAttachmentVisibility(U32 camera_mode)
}
}
-/*virtual*/ BOOL LLVOAvatarSelf::isWearingWearableType(EWearableType type ) const
+/*virtual*/ BOOL LLVOAvatarSelf::isWearingWearableType(LLWearableType::EType type ) const
{
return gAgentWearables.getWearableCount(type) > 0;
}
//-----------------------------------------------------------------------------
-// updatedWearable( EWearableType type )
+// updatedWearable( LLWearableType::EType type )
// forces an update to any baked textures relevant to type.
// will force an upload of the resulting bake if the second parameter is TRUE
//-----------------------------------------------------------------------------
-void LLVOAvatarSelf::wearableUpdated( EWearableType type, BOOL upload_result )
+void LLVOAvatarSelf::wearableUpdated( LLWearableType::EType type, BOOL upload_result )
{
for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin();
baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end();
@@ -928,17 +974,19 @@ void LLVOAvatarSelf::wearableUpdated( EWearableType type, BOOL upload_result )
{
const LLVOAvatarDictionary::BakedEntry *baked_dict = baked_iter->second;
const LLVOAvatarDefines::EBakedTextureIndex index = baked_iter->first;
+
if (baked_dict)
{
for (LLVOAvatarDefines::wearables_vec_t::const_iterator type_iter = baked_dict->mWearables.begin();
type_iter != baked_dict->mWearables.end();
++type_iter)
{
- const EWearableType comp_type = *type_iter;
+ const LLWearableType::EType comp_type = *type_iter;
if (comp_type == type)
{
if (mBakedTextureDatas[index].mTexLayerSet)
{
+ mBakedTextureDatas[index].mTexLayerSet->setUpdatesEnabled(true);
invalidateComposite(mBakedTextureDatas[index].mTexLayerSet, upload_result);
}
break;
@@ -1012,7 +1060,7 @@ const LLViewerJointAttachment *LLVOAvatarSelf::attachObject(LLViewerObject *view
return 0;
}
- updateAttachmentVisibility(gAgent.getCameraMode());
+ updateAttachmentVisibility(gAgentCamera.getCameraMode());
// Then make sure the inventory is in sync with the avatar.
@@ -1020,7 +1068,7 @@ const LLViewerJointAttachment *LLVOAvatarSelf::attachObject(LLViewerObject *view
if (attachment->isObjectAttached(viewer_object))
{
const LLUUID& attachment_id = viewer_object->getItemID();
- LLAppearanceManager::instance().registerAttachment(attachment_id);
+ LLAppearanceMgr::instance().registerAttachment(attachment_id);
}
return attachment;
@@ -1053,13 +1101,13 @@ BOOL LLVOAvatarSelf::detachObject(LLViewerObject *viewer_object)
// Make sure the inventory is in sync with the avatar.
// Update COF contents, don't trigger appearance update.
- if (gAgent.getAvatarObject() == NULL)
+ if (!isAgentAvatarValid())
{
llinfos << "removeItemLinks skipped, avatar is under destruction" << llendl;
}
else
{
- LLAppearanceManager::instance().unregisterAttachment(attachment_id);
+ LLAppearanceMgr::instance().unregisterAttachment(attachment_id);
}
return TRUE;
@@ -1069,19 +1117,19 @@ BOOL LLVOAvatarSelf::detachObject(LLViewerObject *viewer_object)
U32 LLVOAvatarSelf::getNumWearables(LLVOAvatarDefines::ETextureIndex i) const
{
- EWearableType type = LLVOAvatarDictionary::getInstance()->getTEWearableType(i);
+ LLWearableType::EType type = LLVOAvatarDictionary::getInstance()->getTEWearableType(i);
return gAgentWearables.getWearableCount(type);
}
// virtual
void LLVOAvatarSelf::localTextureLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src_raw, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata)
{
- //llinfos << "onLocalTextureLoaded: " << src_vi->getID() << llendl;
const LLUUID& src_id = src_vi->getID();
LLAvatarTexData *data = (LLAvatarTexData *)userdata;
ETextureIndex index = data->mIndex;
if (!isIndexLocalTexture(index)) return;
+
LLLocalTextureObject *local_tex_obj = getLocalTextureObject(index, 0);
// fix for EXT-268. Preventing using of NULL pointer
@@ -1100,11 +1148,11 @@ void LLVOAvatarSelf::localTextureLoaded(BOOL success, LLViewerFetchedTexture *sr
discard_level < local_tex_obj->getDiscard())
{
local_tex_obj->setDiscard(discard_level);
- if (!gAgent.cameraCustomizeAvatar())
+ if (!gAgentCamera.cameraCustomizeAvatar())
{
requestLayerSetUpdate(index);
}
- else if (gAgent.cameraCustomizeAvatar())
+ else if (gAgentCamera.cameraCustomizeAvatar())
{
LLVisualParamHint::requestHintUpdates();
}
@@ -1197,7 +1245,7 @@ BOOL LLVOAvatarSelf::isLocalTextureDataAvailable(const LLTexLayerSet* layerset)
++local_tex_iter)
{
const ETextureIndex tex_index = *local_tex_iter;
- const EWearableType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index);
+ const LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index);
const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type);
for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++)
{
@@ -1219,6 +1267,9 @@ BOOL LLVOAvatarSelf::isLocalTextureDataAvailable(const LLTexLayerSet* layerset)
//-----------------------------------------------------------------------------
BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLTexLayerSet* layerset) const
{
+ const U32 desired_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel");
+ // const U32 desired_tex_discard_level = 0; // hack to not bake textures on lower discard levels.
+
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
{
if (layerset == mBakedTextureDatas[i].mTexLayerSet)
@@ -1229,11 +1280,11 @@ BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLTexLayerSet* layerset) cons
++local_tex_iter)
{
const ETextureIndex tex_index = *local_tex_iter;
- const EWearableType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index);
+ const LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index);
const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type);
for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++)
{
- if (getLocalDiscardLevel(*local_tex_iter, wearable_index) != 0)
+ if (getLocalDiscardLevel(*local_tex_iter, wearable_index) > (S32)(desired_tex_discard_level))
{
return FALSE;
}
@@ -1246,13 +1297,49 @@ BOOL LLVOAvatarSelf::isLocalTextureDataFinal(const LLTexLayerSet* layerset) cons
return FALSE;
}
+BOOL LLVOAvatarSelf::isAllLocalTextureDataFinal() const
+{
+ const U32 desired_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel");
+ // const U32 desired_tex_discard_level = 0; // hack to not bake textures on lower discard levels
+
+ for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
+ {
+ const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i);
+ for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin();
+ local_tex_iter != baked_dict->mLocalTextures.end();
+ ++local_tex_iter)
+ {
+ const ETextureIndex tex_index = *local_tex_iter;
+ const LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index);
+ const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type);
+ for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++)
+ {
+ if (getLocalDiscardLevel(*local_tex_iter, wearable_index) > (S32)(desired_tex_discard_level))
+ {
+ return FALSE;
+ }
+ }
+ }
+ }
+ return TRUE;
+}
+
+BOOL LLVOAvatarSelf::isBakedTextureFinal(const LLVOAvatarDefines::EBakedTextureIndex index) const
+{
+ const LLTexLayerSet *layerset = mBakedTextureDatas[index].mTexLayerSet;
+ if (!layerset) return FALSE;
+ const LLTexLayerSetBuffer *layerset_buffer = layerset->getComposite();
+ if (!layerset_buffer) return FALSE;
+ return !layerset_buffer->uploadNeeded();
+}
+
BOOL LLVOAvatarSelf::isTextureDefined(LLVOAvatarDefines::ETextureIndex type, U32 index) const
{
LLUUID id;
BOOL isDefined = TRUE;
if (isIndexLocalTexture(type))
{
- const EWearableType wearable_type = LLVOAvatarDictionary::getTEWearableType(type);
+ const LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(type);
const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type);
if (index >= wearable_count)
{
@@ -1278,20 +1365,50 @@ BOOL LLVOAvatarSelf::isTextureDefined(LLVOAvatarDefines::ETextureIndex type, U32
return isDefined;
}
+//virtual
+BOOL LLVOAvatarSelf::isTextureVisible(LLVOAvatarDefines::ETextureIndex type, U32 index) const
+{
+ if (isIndexBakedTexture(type))
+ {
+ return LLVOAvatar::isTextureVisible(type, (U32)0);
+ }
+
+ LLUUID tex_id = getLocalTextureID(type,index);
+ return (tex_id != IMG_INVISIBLE)
+ || (LLDrawPoolAlpha::sShowDebugAlpha);
+}
+
+//virtual
+BOOL LLVOAvatarSelf::isTextureVisible(LLVOAvatarDefines::ETextureIndex type, LLWearable *wearable) const
+{
+ if (isIndexBakedTexture(type))
+ {
+ return LLVOAvatar::isTextureVisible(type);
+ }
+
+ U32 index = gAgentWearables.getWearableIndex(wearable);
+ return isTextureVisible(type,index);
+}
+
+
//-----------------------------------------------------------------------------
-// virtual
// requestLayerSetUploads()
//-----------------------------------------------------------------------------
void LLVOAvatarSelf::requestLayerSetUploads()
{
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
{
- ETextureIndex tex_index = mBakedTextureDatas[i].mTextureIndex;
- BOOL layer_baked = isTextureDefined(tex_index, gAgentWearables.getWearableCount(tex_index));
- if (!layer_baked && mBakedTextureDatas[i].mTexLayerSet)
- {
- mBakedTextureDatas[i].mTexLayerSet->requestUpload();
- }
+ requestLayerSetUpload((EBakedTextureIndex)i);
+ }
+}
+
+void LLVOAvatarSelf::requestLayerSetUpload(LLVOAvatarDefines::EBakedTextureIndex i)
+{
+ ETextureIndex tex_index = mBakedTextureDatas[i].mTextureIndex;
+ const BOOL layer_baked = isTextureDefined(tex_index, gAgentWearables.getWearableCount(tex_index));
+ if (!layer_baked && mBakedTextureDatas[i].mTexLayerSet)
+ {
+ mBakedTextureDatas[i].mTexLayerSet->requestUpload();
}
}
@@ -1305,8 +1422,8 @@ bool LLVOAvatarSelf::hasPendingBakedUploads() const
{
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
{
- BOOL upload_pending = (mBakedTextureDatas[i].mTexLayerSet && mBakedTextureDatas[i].mTexLayerSet->getComposite()->uploadPending());
- if (upload_pending)
+ LLTexLayerSet* layerset = mBakedTextureDatas[i].mTexLayerSet;
+ if (layerset && layerset->getComposite() && layerset->getComposite()->uploadPending())
{
return true;
}
@@ -1320,7 +1437,7 @@ void LLVOAvatarSelf::invalidateComposite( LLTexLayerSet* layerset, BOOL upload_r
{
return;
}
- // llinfos << "LLVOAvatar::invalidComposite() " << layerset->getBodyRegion() << llendl;
+ // llinfos << "LLVOAvatar::invalidComposite() " << layerset->getBodyRegionName() << llendl;
layerset->requestUpdate();
layerset->invalidateMorphMasks();
@@ -1342,22 +1459,37 @@ void LLVOAvatarSelf::invalidateAll()
{
invalidateComposite(mBakedTextureDatas[i].mTexLayerSet, TRUE);
}
+ mDebugSelfLoadTimer.reset();
}
//-----------------------------------------------------------------------------
// setCompositeUpdatesEnabled()
//-----------------------------------------------------------------------------
-void LLVOAvatarSelf::setCompositeUpdatesEnabled( BOOL b )
+void LLVOAvatarSelf::setCompositeUpdatesEnabled( bool b )
{
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
{
- if (mBakedTextureDatas[i].mTexLayerSet )
- {
- mBakedTextureDatas[i].mTexLayerSet->setUpdatesEnabled( b );
- }
+ setCompositeUpdatesEnabled(i, b);
}
}
+void LLVOAvatarSelf::setCompositeUpdatesEnabled(U32 index, bool b)
+{
+ if (mBakedTextureDatas[index].mTexLayerSet )
+ {
+ mBakedTextureDatas[index].mTexLayerSet->setUpdatesEnabled( b );
+ }
+}
+
+bool LLVOAvatarSelf::isCompositeUpdateEnabled(U32 index)
+{
+ if (mBakedTextureDatas[index].mTexLayerSet)
+ {
+ return mBakedTextureDatas[index].mTexLayerSet->getUpdatesEnabled();
+ }
+ return false;
+}
+
void LLVOAvatarSelf::setupComposites()
{
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
@@ -1376,7 +1508,7 @@ void LLVOAvatarSelf::updateComposites()
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
{
if (mBakedTextureDatas[i].mTexLayerSet
- && ((i != BAKED_SKIRT) || isWearingWearableType(WT_SKIRT)))
+ && ((i != BAKED_SKIRT) || isWearingWearableType(LLWearableType::WT_SKIRT)))
{
mBakedTextureDatas[i].mTexLayerSet->updateComposite();
}
@@ -1455,7 +1587,7 @@ void LLVOAvatarSelf::setLocalTexture(ETextureIndex type, LLViewerTexture* src_te
llerrs << "Tried to set local texture with invalid type: (" << (U32) type << ", " << index << ")" << llendl;
return;
}
- EWearableType wearable_type = LLVOAvatarDictionary::getInstance()->getTEWearableType(type);
+ LLWearableType::EType wearable_type = LLVOAvatarDictionary::getInstance()->getTEWearableType(type);
if (!gAgentWearables.getWearable(wearable_type,index))
{
// no wearable is loaded, cannot set the texture.
@@ -1490,11 +1622,11 @@ void LLVOAvatarSelf::setLocalTexture(ETextureIndex type, LLViewerTexture* src_te
if (tex_discard >= 0 && tex_discard <= desired_discard)
{
local_tex_obj->setDiscard(tex_discard);
- if (isSelf() && !gAgent.cameraCustomizeAvatar())
+ if (isSelf() && !gAgentCamera.cameraCustomizeAvatar())
{
requestLayerSetUpdate(type);
}
- else if (isSelf() && gAgent.cameraCustomizeAvatar())
+ else if (isSelf() && gAgentCamera.cameraCustomizeAvatar())
{
LLVisualParamHint::requestHintUpdates();
}
@@ -1634,23 +1766,24 @@ void LLVOAvatarSelf::onLocalTextureLoaded(BOOL success, LLViewerFetchedTexture *
void LLVOAvatarSelf::dumpTotalLocalTextureByteCount()
{
S32 gl_bytes = 0;
- gAgent.getAvatarObject()->getLocalTextureByteCount(&gl_bytes);
+ gAgentAvatarp->getLocalTextureByteCount(&gl_bytes);
llinfos << "Total Avatar LocTex GL:" << (gl_bytes/1024) << "KB" << llendl;
}
-BOOL LLVOAvatarSelf::updateIsFullyLoaded()
+BOOL LLVOAvatarSelf::getIsCloud()
{
- BOOL loading = FALSE;
-
- // do we have a shape?
- if (visualParamWeightsAreDefault())
+ // do we have our body parts?
+ if (gAgentWearables.getWearableCount(LLWearableType::WT_SHAPE) == 0 ||
+ gAgentWearables.getWearableCount(LLWearableType::WT_HAIR) == 0 ||
+ gAgentWearables.getWearableCount(LLWearableType::WT_EYES) == 0 ||
+ gAgentWearables.getWearableCount(LLWearableType::WT_SKIN) == 0)
{
- loading = TRUE;
+ return TRUE;
}
if (!isTextureDefined(TEX_HAIR, 0))
{
- loading = TRUE;
+ return TRUE;
}
if (!mPreviousFullyLoaded)
@@ -1658,111 +1791,227 @@ BOOL LLVOAvatarSelf::updateIsFullyLoaded()
if (!isLocalTextureDataAvailable(mBakedTextureDatas[BAKED_LOWER].mTexLayerSet) &&
(!isTextureDefined(TEX_LOWER_BAKED, 0)))
{
- loading = TRUE;
+ return TRUE;
}
if (!isLocalTextureDataAvailable(mBakedTextureDatas[BAKED_UPPER].mTexLayerSet) &&
(!isTextureDefined(TEX_UPPER_BAKED, 0)))
{
- loading = TRUE;
+ return TRUE;
}
for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
{
- if (i == BAKED_SKIRT && !isWearingWearableType(WT_SKIRT))
+ if (i == BAKED_SKIRT && !isWearingWearableType(LLWearableType::WT_SKIRT))
continue;
- BakedTextureData& texture_data = mBakedTextureDatas[i];
+ const BakedTextureData& texture_data = mBakedTextureDatas[i];
if (!isTextureDefined(texture_data.mTextureIndex, 0))
continue;
// Check for the case that texture is defined but not sufficiently loaded to display anything.
- LLViewerTexture* baked_img = getImage( texture_data.mTextureIndex, 0 );
+ const LLViewerTexture* baked_img = getImage( texture_data.mTextureIndex, 0 );
if (!baked_img || !baked_img->hasGLTexture())
{
- loading = TRUE;
+ return TRUE;
}
+ }
+
+ }
+ return FALSE;
+}
+
+/*static*/
+void LLVOAvatarSelf::debugOnTimingLocalTexLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata)
+{
+ gAgentAvatarp->debugTimingLocalTexLoaded(success, src_vi, src, aux_src, discard_level, final, userdata);
+}
+
+void LLVOAvatarSelf::debugTimingLocalTexLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata)
+{
+ LLAvatarTexData *data = (LLAvatarTexData *)userdata;
+ if (!data)
+ {
+ return;
+ }
+
+ ETextureIndex index = data->mIndex;
+
+ if (index < 0 || index >= TEX_NUM_INDICES)
+ {
+ return;
+ }
+
+ if (discard_level >=0 && discard_level <= MAX_DISCARD_LEVEL) // ignore discard level -1, as it means we have no data.
+ {
+ mDebugTextureLoadTimes[(U32)index][(U32)discard_level] = mDebugSelfLoadTimer.getElapsedTimeF32();
+ }
+ if (final)
+ {
+ delete data;
+ }
+}
+void LLVOAvatarSelf::debugBakedTextureUpload(EBakedTextureIndex index, BOOL finished)
+{
+ U32 done = 0;
+ if (finished)
+ {
+ done = 1;
+ }
+ mDebugBakedTextureTimes[index][done] = mDebugSelfLoadTimer.getElapsedTimeF32();
+}
+
+const std::string LLVOAvatarSelf::debugDumpLocalTextureDataInfo(const LLTexLayerSet* layerset) const
+{
+ std::string text="";
+
+ text = llformat("[Final:%d Avail:%d] ",isLocalTextureDataFinal(layerset), isLocalTextureDataAvailable(layerset));
+
+ /* if (layerset == mBakedTextureDatas[BAKED_HEAD].mTexLayerSet)
+ return getLocalDiscardLevel(TEX_HEAD_BODYPAINT) >= 0; */
+ for (LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDictionary::getInstance()->getBakedTextures().begin();
+ baked_iter != LLVOAvatarDictionary::getInstance()->getBakedTextures().end();
+ ++baked_iter)
+ {
+ const EBakedTextureIndex baked_index = baked_iter->first;
+ if (layerset == mBakedTextureDatas[baked_index].mTexLayerSet)
+ {
+ const LLVOAvatarDictionary::BakedEntry *baked_dict = baked_iter->second;
+ text += llformat("%d-%s ( ",baked_index, baked_dict->mName.c_str());
+ for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin();
+ local_tex_iter != baked_dict->mLocalTextures.end();
+ ++local_tex_iter)
+ {
+ const ETextureIndex tex_index = *local_tex_iter;
+ const LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index);
+ const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type);
+ if (wearable_count > 0)
+ {
+ text += LLWearableType::getTypeName(wearable_type) + ":";
+ for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++)
+ {
+ const U32 discard_level = getLocalDiscardLevel(tex_index, wearable_index);
+ std::string discard_str = llformat("%d ",discard_level);
+ text += llformat("%d ",discard_level);
+ }
+ }
+ }
+ text += ")";
+ break;
}
+ }
+ return text;
+}
+
+const std::string LLVOAvatarSelf::debugDumpAllLocalTextureDataInfo() const
+{
+ std::string text;
+ const U32 override_tex_discard_level = gSavedSettings.getU32("TextureDiscardLevel");
+ for (U32 i = 0; i < mBakedTextureDatas.size(); i++)
+ {
+ const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture((EBakedTextureIndex)i);
+ BOOL is_texture_final = TRUE;
+ for (texture_vec_t::const_iterator local_tex_iter = baked_dict->mLocalTextures.begin();
+ local_tex_iter != baked_dict->mLocalTextures.end();
+ ++local_tex_iter)
+ {
+ const ETextureIndex tex_index = *local_tex_iter;
+ const LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(tex_index);
+ const U32 wearable_count = gAgentWearables.getWearableCount(wearable_type);
+ for (U32 wearable_index = 0; wearable_index < wearable_count; wearable_index++)
+ {
+ is_texture_final &= (getLocalDiscardLevel(*local_tex_iter, wearable_index) <= (S32)(override_tex_discard_level));
+ }
+ }
+ text += llformat("%s:%d ",baked_dict->mName.c_str(),is_texture_final);
}
- return processFullyLoadedChange(loading);
+ return text;
}
-const LLUUID& LLVOAvatarSelf::grabLocalTexture(ETextureIndex type, U32 index) const
+const LLUUID& LLVOAvatarSelf::grabBakedTexture(EBakedTextureIndex baked_index) const
{
- if (canGrabLocalTexture(type, index))
+ if (canGrabBakedTexture(baked_index))
{
- return getTEImage( type )->getID();
+ ETextureIndex tex_index = LLVOAvatarDictionary::bakedToLocalTextureIndex(baked_index);
+ if (tex_index == TEX_NUM_INDICES)
+ {
+ return LLUUID::null;
+ }
+ return getTEImage( tex_index )->getID();
}
return LLUUID::null;
}
-BOOL LLVOAvatarSelf::canGrabLocalTexture(ETextureIndex type, U32 index) const
+BOOL LLVOAvatarSelf::canGrabBakedTexture(EBakedTextureIndex baked_index) const
{
+ ETextureIndex tex_index = LLVOAvatarDictionary::bakedToLocalTextureIndex(baked_index);
+ if (tex_index == TEX_NUM_INDICES)
+ {
+ return FALSE;
+ }
// Check if the texture hasn't been baked yet.
- if (!isTextureDefined(type, index))
+ if (!isTextureDefined(tex_index, 0))
{
- lldebugs << "getTEImage( " << (U32) type << ", " << index << " )->getID() == IMG_DEFAULT_AVATAR" << llendl;
+ lldebugs << "getTEImage( " << (U32) tex_index << " )->getID() == IMG_DEFAULT_AVATAR" << llendl;
return FALSE;
}
- if (gAgent.isGodlike())
+ if (gAgent.isGodlikeWithoutAdminMenuFakery())
return TRUE;
// Check permissions of textures that show up in the
// baked texture. We don't want people copying people's
// work via baked textures.
- /* switch(type)
- case TEX_EYES_BAKED:
- textures.push_back(TEX_EYES_IRIS); */
- const LLVOAvatarDictionary::TextureEntry *texture_dict = LLVOAvatarDictionary::getInstance()->getTexture(type);
- if (!texture_dict->mIsUsedByBakedTexture) return FALSE;
- const EBakedTextureIndex baked_index = texture_dict->mBakedTextureIndex;
const LLVOAvatarDictionary::BakedEntry *baked_dict = LLVOAvatarDictionary::getInstance()->getBakedTexture(baked_index);
for (texture_vec_t::const_iterator iter = baked_dict->mLocalTextures.begin();
iter != baked_dict->mLocalTextures.end();
++iter)
{
const ETextureIndex t_index = (*iter);
- lldebugs << "Checking index " << (U32) t_index << llendl;
- // MULTI-WEARABLE: old method. replace.
- const LLUUID& texture_id = getTEImage( t_index )->getID();
- if (texture_id != IMG_DEFAULT_AVATAR)
- {
- // Search inventory for this texture.
- LLViewerInventoryCategory::cat_array_t cats;
- LLViewerInventoryItem::item_array_t items;
- LLAssetIDMatches asset_id_matches(texture_id);
- gInventory.collectDescendentsIf(LLUUID::null,
- cats,
- items,
- LLInventoryModel::INCLUDE_TRASH,
- asset_id_matches);
-
- BOOL can_grab = FALSE;
- lldebugs << "item count for asset " << texture_id << ": " << items.count() << llendl;
- if (items.count())
+ LLWearableType::EType wearable_type = LLVOAvatarDictionary::getTEWearableType(t_index);
+ U32 count = gAgentWearables.getWearableCount(wearable_type);
+ lldebugs << "Checking index " << (U32) t_index << " count: " << count << llendl;
+
+ for (U32 wearable_index = 0; wearable_index < count; ++wearable_index)
+ {
+ LLWearable *wearable = gAgentWearables.getWearable(wearable_type, wearable_index);
+ if (wearable)
{
- // search for full permissions version
- for (S32 i = 0; i < items.count(); i++)
+ const LLLocalTextureObject *texture = wearable->getLocalTextureObject((S32)t_index);
+ const LLUUID& texture_id = texture->getID();
+ if (texture_id != IMG_DEFAULT_AVATAR)
{
- LLInventoryItem* itemp = items[i];
- LLPermissions item_permissions = itemp->getPermissions();
- if ( item_permissions.allowOperationBy(
- PERM_MODIFY, gAgent.getID(), gAgent.getGroupID()) &&
- item_permissions.allowOperationBy(
- PERM_COPY, gAgent.getID(), gAgent.getGroupID()) &&
- item_permissions.allowOperationBy(
- PERM_TRANSFER, gAgent.getID(), gAgent.getGroupID()) )
+ // Search inventory for this texture.
+ LLViewerInventoryCategory::cat_array_t cats;
+ LLViewerInventoryItem::item_array_t items;
+ LLAssetIDMatches asset_id_matches(texture_id);
+ gInventory.collectDescendentsIf(LLUUID::null,
+ cats,
+ items,
+ LLInventoryModel::INCLUDE_TRASH,
+ asset_id_matches);
+
+ BOOL can_grab = FALSE;
+ lldebugs << "item count for asset " << texture_id << ": " << items.count() << llendl;
+ if (items.count())
{
- can_grab = TRUE;
- break;
+ // search for full permissions version
+ for (S32 i = 0; i < items.count(); i++)
+ {
+ LLViewerInventoryItem* itemp = items[i];
+ if (itemp->getIsFullPerm())
+ {
+ can_grab = TRUE;
+ break;
+ }
+ }
}
+ if (!can_grab) return FALSE;
}
}
- if (!can_grab) return FALSE;
}
}
@@ -1781,7 +2030,11 @@ void LLVOAvatarSelf::addLocalTextureStats( ETextureIndex type, LLViewerFetchedTe
F32 desired_pixels;
desired_pixels = llmin(mPixelArea, (F32)getTexImageArea());
imagep->setBoostLevel(getAvatarBoostLevel());
+
+ imagep->resetTextureStats();
+ imagep->setResetMaxVirtualSizeFlag(false) ;
imagep->addTextureStats( desired_pixels / texel_area_ratio );
+ imagep->setAdditionalDecodePriority(1.0f) ;
imagep->forceUpdateBindStats() ;
if (imagep->getDiscardLevel() < 0)
{
@@ -1798,7 +2051,7 @@ void LLVOAvatarSelf::addLocalTextureStats( ETextureIndex type, LLViewerFetchedTe
LLLocalTextureObject* LLVOAvatarSelf::getLocalTextureObject(LLVOAvatarDefines::ETextureIndex i, U32 wearable_index) const
{
- EWearableType type = LLVOAvatarDictionary::getInstance()->getTEWearableType(i);
+ LLWearableType::EType type = LLVOAvatarDictionary::getInstance()->getTEWearableType(i);
LLWearable* wearable = gAgentWearables.getWearable(type, wearable_index);
if (wearable)
{
@@ -1853,6 +2106,7 @@ void LLVOAvatarSelf::setNewBakedTexture( ETextureIndex te, const LLUUID& uuid )
const LLVOAvatarDictionary::TextureEntry *texture_dict = LLVOAvatarDictionary::getInstance()->getTexture(te);
if (texture_dict->mIsBakedTexture)
{
+ debugBakedTextureUpload(texture_dict->mBakedTextureIndex, TRUE); // FALSE for start of upload, TRUE for finish.
llinfos << "New baked texture: " << texture_dict->mName << " UUID: " << uuid <<llendl;
}
else
@@ -1865,6 +2119,76 @@ void LLVOAvatarSelf::setNewBakedTexture( ETextureIndex te, const LLUUID& uuid )
if (!hasPendingBakedUploads())
{
gAgent.sendAgentSetAppearance();
+
+ if (gSavedSettings.getBOOL("DebugAvatarRezTime"))
+ {
+ LLSD args;
+ args["EXISTENCE"] = llformat("%d",(U32)mDebugExistenceTimer.getElapsedTimeF32());
+ args["TIME"] = llformat("%d",(U32)mDebugSelfLoadTimer.getElapsedTimeF32());
+ if (isAllLocalTextureDataFinal())
+ {
+ LLNotificationsUtil::add("AvatarRezSelfBakedDoneNotification",args);
+ }
+ else
+ {
+ args["STATUS"] = debugDumpAllLocalTextureDataInfo();
+ LLNotificationsUtil::add("AvatarRezSelfBakedUpdateNotification",args);
+ }
+ }
+
+ outputRezDiagnostics();
+ }
+}
+
+void LLVOAvatarSelf::outputRezDiagnostics() const
+{
+ const F32 final_time = mDebugSelfLoadTimer.getElapsedTimeF32();
+ llinfos << "REZTIME: Myself rez stats:" << llendl;
+ llinfos << "\t Time from avatar creation to load wearables: " << (S32)mDebugTimeWearablesLoaded << llendl;
+ llinfos << "\t Time from avatar creation to de-cloud: " << (S32)mDebugTimeAvatarVisible << llendl;
+ llinfos << "\t Time from avatar creation to de-cloud for others: " << (S32)final_time << llendl;
+ llinfos << "\t Load time for each texture: " << llendl;
+ for (U32 i = 0; i < LLVOAvatarDefines::TEX_NUM_INDICES; ++i)
+ {
+ std::stringstream out;
+ out << "\t\t (" << i << ") ";
+ U32 j=0;
+ for (j=0; j <= MAX_DISCARD_LEVEL; j++)
+ {
+ out << "\t";
+ S32 load_time = (S32)mDebugTextureLoadTimes[i][j];
+ if (load_time == -1)
+ {
+ out << "*";
+ if (j == 0)
+ break;
+ }
+ else
+ {
+ out << load_time;
+ }
+ }
+
+ // Don't print out non-existent textures.
+ if (j != 0)
+ llinfos << out.str() << llendl;
+ }
+ llinfos << "\t Time points for each upload (start / finish)" << llendl;
+ for (U32 i = 0; i < LLVOAvatarDefines::BAKED_NUM_INDICES; ++i)
+ {
+ llinfos << "\t\t (" << i << ") \t" << (S32)mDebugBakedTextureTimes[i][0] << " / " << (S32)mDebugBakedTextureTimes[i][1] << llendl;
+ }
+
+ for (LLVOAvatarDefines::LLVOAvatarDictionary::BakedTextures::const_iterator baked_iter = LLVOAvatarDefines::LLVOAvatarDictionary::getInstance()->getBakedTextures().begin();
+ baked_iter != LLVOAvatarDefines::LLVOAvatarDictionary::getInstance()->getBakedTextures().end();
+ ++baked_iter)
+ {
+ const LLVOAvatarDefines::EBakedTextureIndex baked_index = baked_iter->first;
+ const LLTexLayerSet *layerset = debugGetLayerSet(baked_index);
+ if (!layerset) continue;
+ const LLTexLayerSetBuffer *layerset_buffer = layerset->getComposite();
+ if (!layerset_buffer) continue;
+ llinfos << layerset_buffer->dumpTextureInfo() << llendl;
}
}
@@ -1894,9 +2218,7 @@ void LLVOAvatarSelf::processRebakeAvatarTextures(LLMessageSystem* msg, void**)
{
LLUUID texture_id;
msg->getUUID("TextureData", "TextureID", texture_id);
-
- LLVOAvatarSelf* self = gAgent.getAvatarObject();
- if (!self) return;
+ if (!isAgentAvatarValid()) return;
// If this is a texture corresponding to one of our baked entries,
// just rebake that layer set.
@@ -1913,13 +2235,13 @@ void LLVOAvatarSelf::processRebakeAvatarTextures(LLMessageSystem* msg, void**)
const LLVOAvatarDictionary::TextureEntry *texture_dict = iter->second;
if (texture_dict->mIsBakedTexture)
{
- if (texture_id == self->getTEImage(index)->getID())
+ if (texture_id == gAgentAvatarp->getTEImage(index)->getID())
{
- LLTexLayerSet* layer_set = self->getLayerSet(index);
+ LLTexLayerSet* layer_set = gAgentAvatarp->getLayerSet(index);
if (layer_set)
{
llinfos << "TAT: rebake - matched entry " << (S32)index << llendl;
- self->invalidateComposite(layer_set, TRUE);
+ gAgentAvatarp->invalidateComposite(layer_set, TRUE);
found = TRUE;
LLViewerStats::getInstance()->incStat(LLViewerStats::ST_TEX_REBAKES);
}
@@ -1930,12 +2252,12 @@ void LLVOAvatarSelf::processRebakeAvatarTextures(LLMessageSystem* msg, void**)
// If texture not found, rebake all entries.
if (!found)
{
- self->forceBakeAllTextures();
+ gAgentAvatarp->forceBakeAllTextures();
}
else
{
// Not sure if this is necessary, but forceBakeAllTextures() does it.
- self->updateMeshTextures();
+ gAgentAvatarp->updateMeshTextures();
}
}
@@ -1966,7 +2288,6 @@ void LLVOAvatarSelf::forceBakeAllTextures(bool slam_for_debug)
// Don't know if this is needed
updateMeshTextures();
-
}
//-----------------------------------------------------------------------------
@@ -2015,10 +2336,9 @@ void LLVOAvatarSelf::onCustomizeStart()
// static
void LLVOAvatarSelf::onCustomizeEnd()
{
- LLVOAvatarSelf *avatarp = gAgent.getAvatarObject();
- if (avatarp)
+ if (isAgentAvatarValid())
{
- avatarp->invalidateAll();
+ gAgentAvatarp->invalidateAll();
}
}
@@ -2187,7 +2507,6 @@ LLGLuint LLVOAvatarSelf::getScratchTexName( LLGLenum format, S32& components, U3
{
case GL_LUMINANCE: components = 1; internal_format = GL_LUMINANCE8; break;
case GL_ALPHA: components = 1; internal_format = GL_ALPHA8; break;
- case GL_COLOR_INDEX: components = 1; internal_format = GL_COLOR_INDEX8_EXT; break;
case GL_LUMINANCE_ALPHA: components = 2; internal_format = GL_LUMINANCE8_ALPHA8; break;
case GL_RGB: components = 3; internal_format = GL_RGB8; break;
case GL_RGBA: components = 4; internal_format = GL_RGBA8; break;
diff --git a/indra/newview/llvoavatarself.h b/indra/newview/llvoavatarself.h
index dc70996f0b..55b4fd87c8 100644
--- a/indra/newview/llvoavatarself.h
+++ b/indra/newview/llvoavatarself.h
@@ -39,9 +39,10 @@
struct LocalTextureData;
-//------------------------------------------------------------------------
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// LLVOAvatarSelf
-//------------------------------------------------------------------------
+//
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
class LLVOAvatarSelf :
public LLVOAvatar
{
@@ -55,7 +56,8 @@ public:
LLVOAvatarSelf(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp);
virtual ~LLVOAvatarSelf();
virtual void markDead();
- virtual void initInstance(); // Called after construction to initialize the class.
+ virtual void initInstance(); // Called after construction to initialize the class.
+ void cleanup();
protected:
/*virtual*/ BOOL loadAvatar();
BOOL loadAvatarSelf();
@@ -77,6 +79,7 @@ protected:
//--------------------------------------------------------------------
public:
/*virtual*/ void updateRegion(LLViewerRegion *regionp);
+ /*virtual*/ BOOL idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time);
//--------------------------------------------------------------------
// LLCharacter interface and related
@@ -120,9 +123,7 @@ public:
// Loading state
//--------------------------------------------------------------------
public:
- /*virtual*/ BOOL updateIsFullyLoaded();
-private:
- BOOL mIsBaked; // are the stored baked textures up to date?
+ /*virtual*/ BOOL getIsCloud();
//--------------------------------------------------------------------
// Region state
@@ -176,8 +177,12 @@ public:
bool areTexturesCurrent() const;
BOOL isLocalTextureDataAvailable(const LLTexLayerSet* layerset) const;
BOOL isLocalTextureDataFinal(const LLTexLayerSet* layerset) const;
+ BOOL isBakedTextureFinal(const LLVOAvatarDefines::EBakedTextureIndex index) const;
// If you want to check all textures of a given type, pass gAgentWearables.getWearableCount() for index
/*virtual*/ BOOL isTextureDefined(LLVOAvatarDefines::ETextureIndex type, U32 index) const;
+ /*virtual*/ BOOL isTextureVisible(LLVOAvatarDefines::ETextureIndex type, U32 index = 0) const;
+ /*virtual*/ BOOL isTextureVisible(LLVOAvatarDefines::ETextureIndex type, LLWearable *wearable) const;
+
//--------------------------------------------------------------------
// Local Textures
@@ -187,8 +192,6 @@ public:
LLViewerFetchedTexture* getLocalTextureGL(LLVOAvatarDefines::ETextureIndex type, U32 index) const;
const LLUUID& getLocalTextureID(LLVOAvatarDefines::ETextureIndex type, U32 index) const;
void setLocalTextureTE(U8 te, LLViewerTexture* image, U32 index);
- const LLUUID& grabLocalTexture(LLVOAvatarDefines::ETextureIndex type, U32 index) const;
- BOOL canGrabLocalTexture(LLVOAvatarDefines::ETextureIndex type, U32 index) const;
/*virtual*/ void setLocalTexture(LLVOAvatarDefines::ETextureIndex type, LLViewerTexture* tex, BOOL baked_version_exits, U32 index);
protected:
/*virtual*/ void setBakedReady(LLVOAvatarDefines::ETextureIndex type, BOOL baked_version_exists, U32 index);
@@ -222,6 +225,7 @@ protected:
//--------------------------------------------------------------------
public:
void requestLayerSetUploads();
+ void requestLayerSetUpload(LLVOAvatarDefines::EBakedTextureIndex i);
void requestLayerSetUpdate(LLVOAvatarDefines::ETextureIndex i);
LLTexLayerSet* getLayerSet(LLVOAvatarDefines::ETextureIndex index) const;
@@ -231,10 +235,16 @@ public:
public:
/* virtual */ void invalidateComposite(LLTexLayerSet* layerset, BOOL upload_result);
/* virtual */ void invalidateAll();
- /* virtual */ void setCompositeUpdatesEnabled(BOOL b); // only works for self
+ /* virtual */ void setCompositeUpdatesEnabled(bool b); // only works for self
+ /* virtual */ void setCompositeUpdatesEnabled(U32 index, bool b);
+ /* virtual */ bool isCompositeUpdateEnabled(U32 index);
void setupComposites();
void updateComposites();
+ const LLUUID& grabBakedTexture(LLVOAvatarDefines::EBakedTextureIndex baked_index) const;
+ BOOL canGrabBakedTexture(LLVOAvatarDefines::EBakedTextureIndex baked_index) const;
+
+
//--------------------------------------------------------------------
// Scratch textures (used for compositing)
//--------------------------------------------------------------------
@@ -269,8 +279,8 @@ protected:
**/
public:
- /*virtual*/ BOOL isWearingWearableType(EWearableType type) const;
- void wearableUpdated(EWearableType type, BOOL upload_result);
+ /*virtual*/ BOOL isWearingWearableType(LLWearableType::EType type) const;
+ void wearableUpdated(LLWearableType::EType type, BOOL upload_result);
protected:
U32 getNumWearables(LLVOAvatarDefines::ETextureIndex i) const;
@@ -319,15 +329,54 @@ public:
** DIAGNOSTICS
**/
+ //--------------------------------------------------------------------
+ // General
+ //--------------------------------------------------------------------
public:
static void dumpTotalLocalTextureByteCount();
void dumpLocalTextures() const;
static void dumpScratchTextureByteCount();
+ //--------------------------------------------------------------------
+ // Avatar Rez Metrics
+ //--------------------------------------------------------------------
+public:
+ struct LLAvatarTexData
+ {
+ LLAvatarTexData(const LLUUID& id, LLVOAvatarDefines::ETextureIndex index) :
+ mAvatarID(id),
+ mIndex(index)
+ {}
+ LLUUID mAvatarID;
+ LLVOAvatarDefines::ETextureIndex mIndex;
+ };
+ void debugWearablesLoaded() { mDebugTimeWearablesLoaded = mDebugSelfLoadTimer.getElapsedTimeF32(); }
+ void debugAvatarVisible() { mDebugTimeAvatarVisible = mDebugSelfLoadTimer.getElapsedTimeF32(); }
+ void outputRezDiagnostics() const;
+ void debugBakedTextureUpload(LLVOAvatarDefines::EBakedTextureIndex index, BOOL finished);
+ static void debugOnTimingLocalTexLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata);
+
+ BOOL isAllLocalTextureDataFinal() const;
+
+ const LLTexLayerSet* debugGetLayerSet(LLVOAvatarDefines::EBakedTextureIndex index) const { return mBakedTextureDatas[index].mTexLayerSet; }
+ const std::string debugDumpLocalTextureDataInfo(const LLTexLayerSet* layerset) const; // Lists out state of this particular baked texture layer
+ const std::string debugDumpAllLocalTextureDataInfo() const; // Lists out which baked textures are at highest LOD
+private:
+ LLFrameTimer mDebugSelfLoadTimer;
+ F32 mDebugTimeWearablesLoaded;
+ F32 mDebugTimeAvatarVisible;
+ F32 mDebugTextureLoadTimes[LLVOAvatarDefines::TEX_NUM_INDICES][MAX_DISCARD_LEVEL+1]; // load time for each texture at each discard level
+ F32 mDebugBakedTextureTimes[LLVOAvatarDefines::BAKED_NUM_INDICES][2]; // time to start upload and finish upload of each baked texture
+ void debugTimingLocalTexLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata);
+
/** Diagnostics
** **
*******************************************************************************/
};
+extern LLVOAvatarSelf *gAgentAvatarp;
+
+BOOL isAgentAvatarValid();
+
#endif // LL_VO_AVATARSELF_H
diff --git a/indra/newview/llvoclouds.cpp b/indra/newview/llvoclouds.cpp
index 177cb16c50..5153cef709 100644
--- a/indra/newview/llvoclouds.cpp
+++ b/indra/newview/llvoclouds.cpp
@@ -77,9 +77,11 @@ BOOL LLVOClouds::isActive() const
return TRUE;
}
-
BOOL LLVOClouds::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
{
+ static LLFastTimer::DeclareTimer ftm("Idle Clouds");
+ LLFastTimer t(ftm);
+
if (!(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_CLOUDS)))
{
return TRUE;
diff --git a/indra/newview/llvograss.cpp b/indra/newview/llvograss.cpp
index e311f07912..a82afbeb76 100644
--- a/indra/newview/llvograss.cpp
+++ b/indra/newview/llvograss.cpp
@@ -37,7 +37,7 @@
#include "imageids.h"
#include "llviewercontrol.h"
-#include "llagent.h"
+#include "llagentcamera.h"
#include "llnotificationsutil.h"
#include "lldrawable.h"
#include "llface.h"
@@ -306,7 +306,7 @@ BOOL LLVOGrass::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
void LLVOGrass::setPixelAreaAndAngle(LLAgent &agent)
{
// This should be the camera's center, as soon as we move to all region-local.
- LLVector3 relative_position = getPositionAgent() - agent.getCameraPositionAgent();
+ LLVector3 relative_position = getPositionAgent() - gAgentCamera.getCameraPositionAgent();
F32 range = relative_position.length();
F32 max_scale = getMaxScale();
diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index bb09a18cc3..070663e22f 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -72,9 +72,9 @@ private:
void LLVoiceCallCapResponder::error(U32 status, const std::string& reason)
{
- llwarns << "LLVoiceCallCapResponder::error("
+ LL_WARNS("Voice") << "LLVoiceCallCapResponder::error("
<< status << ": " << reason << ")"
- << llendl;
+ << LL_ENDL;
LLVoiceChannel* channelp = LLVoiceChannel::getChannelByID(mSessionID);
if ( channelp )
{
@@ -104,8 +104,8 @@ void LLVoiceCallCapResponder::result(const LLSD& content)
LLSD::map_const_iterator iter;
for(iter = content.beginMap(); iter != content.endMap(); ++iter)
{
- llinfos << "LLVoiceCallCapResponder::result got "
- << iter->first << llendl;
+ LL_DEBUGS("Voice") << "LLVoiceCallCapResponder::result got "
+ << iter->first << LL_ENDL;
}
channelp->setChannelInfo(
@@ -122,7 +122,8 @@ LLVoiceChannel::LLVoiceChannel(const LLUUID& session_id, const std::string& sess
mState(STATE_NO_CHANNEL_INFO),
mSessionName(session_name),
mCallDirection(OUTGOING_CALL),
- mIgnoreNextSessionLeave(FALSE)
+ mIgnoreNextSessionLeave(FALSE),
+ mCallEndedByAgent(false)
{
mNotifyArgs["VOICE_CHANNEL_NAME"] = mSessionName;
@@ -130,18 +131,16 @@ LLVoiceChannel::LLVoiceChannel(const LLUUID& session_id, const std::string& sess
{
// a voice channel already exists for this session id, so this instance will be orphaned
// the end result should simply be the failure to make voice calls
- llwarns << "Duplicate voice channels registered for session_id " << session_id << llendl;
+ LL_WARNS("Voice") << "Duplicate voice channels registered for session_id " << session_id << LL_ENDL;
}
-
- LLVoiceClient::getInstance()->addObserver(this);
}
LLVoiceChannel::~LLVoiceChannel()
{
- // Don't use LLVoiceClient::getInstance() here -- this can get called during atexit() time and that singleton MAY have already been destroyed.
- if(gVoiceClient)
+ // Must check instance exists here, the singleton MAY have already been destroyed.
+ if(LLVoiceClient::instanceExists())
{
- gVoiceClient->removeObserver(this);
+ LLVoiceClient::getInstance()->removeObserver(this);
}
sVoiceChannelMap.erase(mSessionID);
@@ -161,13 +160,13 @@ void LLVoiceChannel::setChannelInfo(
if (mURI.empty())
{
LLNotificationsUtil::add("VoiceChannelJoinFailed", mNotifyArgs);
- llwarns << "Received empty URI for channel " << mSessionName << llendl;
+ LL_WARNS("Voice") << "Received empty URI for channel " << mSessionName << LL_ENDL;
deactivate();
}
else if (mCredentials.empty())
{
LLNotificationsUtil::add("VoiceChannelJoinFailed", mNotifyArgs);
- llwarns << "Received empty credentials for channel " << mSessionName << llendl;
+ LL_WARNS("Voice") << "Received empty credentials for channel " << mSessionName << LL_ENDL;
deactivate();
}
else
@@ -282,13 +281,14 @@ void LLVoiceChannel::deactivate()
//Default mic is OFF when leaving voice calls
if (gSavedSettings.getBOOL("AutoDisengageMic") &&
sCurrentVoiceChannel == this &&
- gVoiceClient->getUserPTTState())
+ LLVoiceClient::getInstance()->getUserPTTState())
{
gSavedSettings.setBOOL("PTTCurrentlyEnabled", true);
- gVoiceClient->inputUserControlState(true);
+ LLVoiceClient::getInstance()->inputUserControlState(true);
}
}
-
+ LLVoiceClient::getInstance()->removeObserver(this);
+
if (sCurrentVoiceChannel == this)
{
// default channel is proximal channel
@@ -328,7 +328,9 @@ void LLVoiceChannel::activate()
{
setState(STATE_CALL_STARTED);
}
-
+
+ LLVoiceClient::getInstance()->addObserver(this);
+
//do not send earlier, channel should be initialized, should not be in STATE_NO_CHANNEL_INFO state
sCurrentVoiceChannelChangedSignal(this->mSessionID);
}
@@ -370,6 +372,11 @@ LLVoiceChannel* LLVoiceChannel::getChannelByURI(std::string uri)
}
}
+LLVoiceChannel* LLVoiceChannel::getCurrentVoiceChannel()
+{
+ return sCurrentVoiceChannel;
+}
+
void LLVoiceChannel::updateSessionID(const LLUUID& new_session_id)
{
sVoiceChannelMap.erase(sVoiceChannelMap.find(mSessionID));
@@ -412,7 +419,7 @@ void LLVoiceChannel::doSetState(const EState& new_state)
EState old_state = mState;
mState = new_state;
if (!mStateChangedCallback.empty())
- mStateChangedCallback(old_state, mState, mCallDirection);
+ mStateChangedCallback(old_state, mState, mCallDirection, mCallEndedByAgent);
}
//static
@@ -421,7 +428,6 @@ void LLVoiceChannel::initClass()
sCurrentVoiceChannel = LLVoiceChannelProximal::getInstance();
}
-
//static
void LLVoiceChannel::suspend()
{
@@ -437,7 +443,7 @@ void LLVoiceChannel::resume()
{
if (sSuspended)
{
- if (gVoiceClient->voiceEnabled())
+ if (LLVoiceClient::getInstance()->voiceEnabled())
{
if (sSuspendedVoiceChannel)
{
@@ -507,9 +513,9 @@ void LLVoiceChannelGroup::activate()
#endif
//Mic default state is OFF on initiating/joining Ad-Hoc/Group calls
- if (gVoiceClient->getUserPTTState() && gVoiceClient->getPTTIsToggle())
+ if (LLVoiceClient::getInstance()->getUserPTTState() && LLVoiceClient::getInstance()->getPTTIsToggle())
{
- gVoiceClient->inputUserControlState(true);
+ LLVoiceClient::getInstance()->inputUserControlState(true);
}
}
@@ -556,7 +562,7 @@ void LLVoiceChannelGroup::setChannelInfo(
else
{
//*TODO: notify user
- llwarns << "Received invalid credentials for channel " << mSessionName << llendl;
+ LL_WARNS("Voice") << "Received invalid credentials for channel " << mSessionName << LL_ENDL;
deactivate();
}
}
@@ -655,7 +661,6 @@ void LLVoiceChannelGroup::setState(EState state)
LLVoiceChannelProximal::LLVoiceChannelProximal() :
LLVoiceChannel(LLUUID::null, LLStringUtil::null)
{
- activate();
}
BOOL LLVoiceChannelProximal::isActive()
@@ -667,13 +672,13 @@ void LLVoiceChannelProximal::activate()
{
if (callStarted()) return;
- LLVoiceChannel::activate();
-
- if (callStarted())
+ if((LLVoiceChannel::sCurrentVoiceChannel != this) && (LLVoiceChannel::getState() == STATE_CONNECTED))
{
- // this implicitly puts you back in the spatial channel
- LLVoiceClient::getInstance()->leaveNonSpatialChannel();
+ // we're connected to a non-spatial channel, so disconnect.
+ LLVoiceClient::getInstance()->leaveNonSpatialChannel();
}
+ LLVoiceChannel::activate();
+
}
void LLVoiceChannelProximal::onChange(EStatusType type, const std::string &channelURI, bool proximal)
@@ -703,7 +708,7 @@ void LLVoiceChannelProximal::handleStatusChange(EStatusType status)
return;
case STATUS_VOICE_DISABLED:
//skip showing "Voice not available at your current location" when agent voice is disabled (EXT-4749)
- if(LLVoiceClient::voiceEnabled() && gVoiceClient->voiceWorking())
+ if(LLVoiceClient::getInstance()->voiceEnabled() && LLVoiceClient::getInstance()->isVoiceWorking())
{
//TODO: remove or redirect this call status notification
// LLCallInfoDialog::show("unavailable", mNotifyArgs);
@@ -763,7 +768,7 @@ LLVoiceChannelP2P::LLVoiceChannelP2P(const LLUUID& session_id, const std::string
void LLVoiceChannelP2P::handleStatusChange(EStatusType type)
{
- llinfos << "P2P CALL CHANNEL STATUS CHANGE: incoming=" << int(mReceivedCall) << " newstatus=" << LLVoiceClientStatusObserver::status2string(type) << " (mState=" << mState << ")" << llendl;
+ LL_INFOS("Voice") << "P2P CALL CHANNEL STATUS CHANGE: incoming=" << int(mReceivedCall) << " newstatus=" << LLVoiceClientStatusObserver::status2string(type) << " (mState=" << mState << ")" << LL_ENDL;
// status updates
switch(type)
@@ -779,12 +784,19 @@ void LLVoiceChannelP2P::handleStatusChange(EStatusType type)
}
else
{
- // other user hung up
+ // other user hung up, so we didn't end the call
+ mCallEndedByAgent = false;
}
deactivate();
}
mIgnoreNextSessionLeave = FALSE;
return;
+ case STATUS_JOINING:
+ // because we join session we expect to process session leave event in the future. EXT-7371
+ // may be this should be done in the LLVoiceChannel::handleStatusChange.
+ mIgnoreNextSessionLeave = FALSE;
+ break;
+
default:
break;
}
@@ -810,6 +822,9 @@ void LLVoiceChannelP2P::activate()
{
if (callStarted()) return;
+ //call will be counted as ended by user unless this variable is changed in handleStatusChange()
+ mCallEndedByAgent = true;
+
LLVoiceChannel::activate();
if (callStarted())
@@ -833,9 +848,9 @@ void LLVoiceChannelP2P::activate()
LLRecentPeople::instance().add(mOtherUserID);
//Default mic is ON on initiating/joining P2P calls
- if (!gVoiceClient->getUserPTTState() && gVoiceClient->getPTTIsToggle())
+ if (!LLVoiceClient::getInstance()->getUserPTTState() && LLVoiceClient::getInstance()->getPTTIsToggle())
{
- gVoiceClient->inputUserControlState(true);
+ LLVoiceClient::getInstance()->inputUserControlState(true);
}
}
}
@@ -882,9 +897,9 @@ void LLVoiceChannelP2P::setSessionHandle(const std::string& handle, const std::s
else
{
LL_WARNS("Voice") << "incoming SIP URL is not provided. Channel may not work properly." << LL_ENDL;
- // In case of incoming AvaLine call generated URI will be differ from original one.
- // This is because Avatar-2-Avatar URI is based on avatar UUID but Avaline is not.
- // See LLVoiceClient::sessionAddedEvent() -> setUUIDFromStringHash()
+ // In the case of an incoming AvaLine call, the generated URI will be different from the
+ // original one. This is because the P2P URI is based on avatar UUID but Avaline is not.
+ // See LLVoiceClient::sessionAddedEvent()
setURI(LLVoiceClient::getInstance()->sipURIFromID(mOtherUserID));
}
@@ -898,7 +913,7 @@ void LLVoiceChannelP2P::setSessionHandle(const std::string& handle, const std::s
void LLVoiceChannelP2P::setState(EState state)
{
- llinfos << "P2P CALL STATE CHANGE: incoming=" << int(mReceivedCall) << " oldstate=" << mState << " newstate=" << state << llendl;
+ LL_INFOS("Voice") << "P2P CALL STATE CHANGE: incoming=" << int(mReceivedCall) << " oldstate=" << mState << " newstate=" << state << LL_ENDL;
if (mReceivedCall) // incoming call
{
diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h
index cb86671305..074f9b8bba 100644
--- a/indra/newview/llvoicechannel.h
+++ b/indra/newview/llvoicechannel.h
@@ -58,7 +58,7 @@ public:
OUTGOING_CALL
} EDirection;
- typedef boost::signals2::signal<void(const EState& old_state, const EState& new_state, const EDirection& direction)> state_changed_signal_t;
+ typedef boost::signals2::signal<void(const EState& old_state, const EState& new_state, const EDirection& direction, bool ended_by_agent)> state_changed_signal_t;
// on current channel changed signal
typedef boost::function<void(const LLUUID& session_id)> channel_changed_callback_t;
@@ -98,7 +98,8 @@ public:
static LLVoiceChannel* getChannelByID(const LLUUID& session_id);
static LLVoiceChannel* getChannelByURI(std::string uri);
- static LLVoiceChannel* getCurrentVoiceChannel() { return sCurrentVoiceChannel; }
+ static LLVoiceChannel* getCurrentVoiceChannel();
+
static void initClass();
static void suspend();
@@ -112,7 +113,7 @@ protected:
void doSetState(const EState& state);
void setURI(std::string uri);
- // there can be two directions ICOMING and OUTGOING
+ // there can be two directions INCOMING and OUTGOING
EDirection mCallDirection;
std::string mURI;
@@ -122,6 +123,8 @@ protected:
std::string mSessionName;
LLSD mNotifyArgs;
LLSD mCallDialogPayload;
+ // true if call was ended by agent
+ bool mCallEndedByAgent;
BOOL mIgnoreNextSessionLeave;
LLHandle<LLPanel> mLoginNotificationHandle;
diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp
index f3bfc2e86c..e8635d7f1a 100644
--- a/indra/newview/llvoiceclient.cpp
+++ b/indra/newview/llvoiceclient.cpp
@@ -1,6 +1,6 @@
/**
* @file llvoiceclient.cpp
- * @brief Implementation of LLVoiceClient class which is the interface to the voice client process.
+ * @brief Voice client delegation class implementation.
*
* $LicenseInfo:firstyear=2001&license=viewergpl$
*
@@ -17,8 +17,7 @@
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
@@ -32,5304 +31,348 @@
#include "llviewerprecompiledheaders.h"
#include "llvoiceclient.h"
-
-#include <boost/tokenizer.hpp>
-
-// library includes
-#include "llnotificationsutil.h"
-#include "llsdserialize.h"
-#include "llsdutil.h"
-
-
-// project includes
-#include "llvoavatar.h"
-#include "llbufferstream.h"
-#include "llfile.h"
-#ifdef LL_STANDALONE
-# include "expat.h"
-#else
-# include "expat/expat.h"
-#endif
-#include "llcallbacklist.h"
-#include "llcallingcard.h" // for LLFriendObserver
-#include "llviewerregion.h"
-#include "llviewernetwork.h" // for gGridChoice
-#include "llbase64.h"
#include "llviewercontrol.h"
-#include "llkeyboard.h"
-#include "llappviewer.h" // for gDisconnected, gDisableVoice
-#include "llmutelist.h" // to check for muted avatars
-#include "llagent.h"
-#include "llcachename.h"
-#include "llimview.h" // for LLIMMgr
-#include "llparcel.h"
-#include "llviewerparcelmgr.h"
-//#include "llfirstuse.h"
-#include "llspeakers.h"
-#include "lltrans.h"
#include "llviewerwindow.h"
-#include "llviewercamera.h"
-#include "llvoavatarself.h"
-#include "llvoicechannel.h"
-
-// for base64 decoding
-#include "apr_base64.h"
-
-// for SHA1 hash
-#include "apr_sha1.h"
-
-// for MD5 hash
-#include "llmd5.h"
-
-#define USE_SESSION_GROUPS 0
-
-static bool sConnectingToAgni = false;
-F32 LLVoiceClient::OVERDRIVEN_POWER_LEVEL = 0.7f;
-
-const F32 SPEAKING_TIMEOUT = 1.f;
-
-const int VOICE_MAJOR_VERSION = 1;
-const int VOICE_MINOR_VERSION = 0;
-
-LLVoiceClient *gVoiceClient = NULL;
-
-// Don't retry connecting to the daemon more frequently than this:
-const F32 CONNECT_THROTTLE_SECONDS = 1.0f;
-
-// Don't send positional updates more frequently than this:
-const F32 UPDATE_THROTTLE_SECONDS = 0.1f;
-
-const F32 LOGIN_RETRY_SECONDS = 10.0f;
-const int MAX_LOGIN_RETRIES = 12;
-
-static void setUUIDFromStringHash(LLUUID &uuid, const std::string &str)
-{
- LLMD5 md5_uuid;
- md5_uuid.update((const unsigned char*)str.data(), str.size());
- md5_uuid.finalize();
- md5_uuid.raw_digest(uuid.mData);
-}
-
-static int scale_mic_volume(float volume)
-{
- // incoming volume has the range [0.0 ... 2.0], with 1.0 as the default.
- // 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 to Vivox levels as follows: 0.0 -> 30, 0.5 -> 50, 1.0 -> 70
- return 30 + (int)(volume * 40.0f);
-}
-
-class LLViewerVoiceAccountProvisionResponder :
- public LLHTTPClient::Responder
-{
-public:
- LLViewerVoiceAccountProvisionResponder(int retries)
- {
- mRetries = retries;
- }
+#include "llvoicevivox.h"
+#include "llviewernetwork.h"
+#include "llcommandhandler.h"
+#include "llhttpnode.h"
+#include "llnotificationsutil.h"
+#include "llsdserialize.h"
+#include "llui.h"
- virtual void error(U32 status, const std::string& reason)
- {
- if ( mRetries > 0 )
- {
- LL_WARNS("Voice") << "ProvisionVoiceAccountRequest returned an error, retrying. status = " << status << ", reason = \"" << reason << "\"" << LL_ENDL;
- if ( gVoiceClient ) gVoiceClient->requestVoiceAccountProvision(
- mRetries - 1);
- }
- else
- {
- LL_WARNS("Voice") << "ProvisionVoiceAccountRequest returned an error, too many retries (giving up). status = " << status << ", reason = \"" << reason << "\"" << LL_ENDL;
- if ( gVoiceClient ) gVoiceClient->giveUp();
- }
- }
+const F32 LLVoiceClient::OVERDRIVEN_POWER_LEVEL = 0.7f;
- virtual void result(const LLSD& content)
- {
- if ( gVoiceClient )
- {
- std::string voice_sip_uri_hostname;
- std::string voice_account_server_uri;
-
- LL_DEBUGS("Voice") << "ProvisionVoiceAccountRequest response:" << ll_pretty_print_sd(content) << LL_ENDL;
-
- if(content.has("voice_sip_uri_hostname"))
- voice_sip_uri_hostname = content["voice_sip_uri_hostname"].asString();
-
- // this key is actually misnamed -- it will be an entire URI, not just a hostname.
- if(content.has("voice_account_server_name"))
- voice_account_server_uri = content["voice_account_server_name"].asString();
-
- gVoiceClient->login(
- content["username"].asString(),
- content["password"].asString(),
- voice_sip_uri_hostname,
- voice_account_server_uri);
- }
- }
+const F32 LLVoiceClient::VOLUME_MIN = 0.f;
+const F32 LLVoiceClient::VOLUME_DEFAULT = 0.5f;
+const F32 LLVoiceClient::VOLUME_MAX = 1.0f;
-private:
- int mRetries;
-};
-/**
- * @class LLVivoxProtocolParser
- * @brief This class helps construct new LLIOPipe specializations
- * @see LLIOPipe
- *
- * THOROUGH_DESCRIPTION
- */
-class LLVivoxProtocolParser : public LLIOPipe
+// Support for secondlife:///app/voice SLapps
+class LLVoiceHandler : public LLCommandHandler
{
- LOG_CLASS(LLVivoxProtocolParser);
public:
- LLVivoxProtocolParser();
- virtual ~LLVivoxProtocolParser();
-
-protected:
- /* @name LLIOPipe virtual implementations
- */
- //@{
- /**
- * @brief Process the data in buffer
- */
- virtual EStatus process_impl(
- const LLChannelDescriptors& channels,
- buffer_ptr_t& buffer,
- bool& eos,
- LLSD& context,
- LLPumpIO* pump);
- //@}
-
- std::string mInput;
-
- // Expat control members
- XML_Parser parser;
- int responseDepth;
- bool ignoringTags;
- bool isEvent;
- int ignoreDepth;
-
- // Members for processing responses. The values are transient and only valid within a call to processResponse().
- bool squelchDebugOutput;
- int returnCode;
- int statusCode;
- std::string statusString;
- std::string requestId;
- std::string actionString;
- std::string connectorHandle;
- std::string versionID;
- std::string accountHandle;
- std::string sessionHandle;
- std::string sessionGroupHandle;
- std::string alias;
- std::string applicationString;
-
- // Members for processing events. The values are transient and only valid within a call to processResponse().
- std::string eventTypeString;
- int state;
- std::string uriString;
- bool isChannel;
- bool incoming;
- bool enabled;
- std::string nameString;
- std::string audioMediaString;
- std::string displayNameString;
- std::string deviceString;
- int participantType;
- bool isLocallyMuted;
- bool isModeratorMuted;
- bool isSpeaking;
- int volume;
- F32 energy;
- std::string messageHeader;
- std::string messageBody;
- std::string notificationType;
- bool hasText;
- bool hasAudio;
- bool hasVideo;
- bool terminated;
- std::string blockMask;
- std::string presenceOnly;
- std::string autoAcceptMask;
- std::string autoAddAsBuddy;
- int numberOfAliases;
- std::string subscriptionHandle;
- std::string subscriptionType;
-
-
- // Members for processing text between tags
- std::string textBuffer;
- bool accumulateText;
-
- void reset();
-
- void processResponse(std::string tag);
-
-static void XMLCALL ExpatStartTag(void *data, const char *el, const char **attr);
-static void XMLCALL ExpatEndTag(void *data, const char *el);
-static void XMLCALL ExpatCharHandler(void *data, const XML_Char *s, int len);
-
- void StartTag(const char *tag, const char **attr);
- void EndTag(const char *tag);
- void CharData(const char *buffer, int length);
-
-};
-
-LLVivoxProtocolParser::LLVivoxProtocolParser()
-{
- parser = NULL;
- parser = XML_ParserCreate(NULL);
-
- reset();
-}
+ // requests will be throttled from a non-trusted browser
+ LLVoiceHandler() : LLCommandHandler("voice", UNTRUSTED_THROTTLE) {}
-void LLVivoxProtocolParser::reset()
-{
- responseDepth = 0;
- ignoringTags = false;
- accumulateText = false;
- energy = 0.f;
- hasText = false;
- hasAudio = false;
- hasVideo = false;
- terminated = false;
- ignoreDepth = 0;
- isChannel = false;
- incoming = false;
- enabled = false;
- isEvent = false;
- isLocallyMuted = false;
- isModeratorMuted = false;
- isSpeaking = false;
- participantType = 0;
- squelchDebugOutput = false;
- returnCode = -1;
- state = 0;
- statusCode = 0;
- volume = 0;
- textBuffer.clear();
- alias.clear();
- numberOfAliases = 0;
- applicationString.clear();
-}
-
-//virtual
-LLVivoxProtocolParser::~LLVivoxProtocolParser()
-{
- if (parser)
- XML_ParserFree(parser);
-}
-
-// virtual
-LLIOPipe::EStatus LLVivoxProtocolParser::process_impl(
- const LLChannelDescriptors& channels,
- buffer_ptr_t& buffer,
- bool& eos,
- LLSD& context,
- LLPumpIO* pump)
-{
- LLBufferStream istr(channels, buffer.get());
- std::ostringstream ostr;
- while (istr.good())
+ bool handle(const LLSD& params, const LLSD& query_map, LLMediaCtrl* web)
{
- char buf[1024];
- istr.read(buf, sizeof(buf));
- mInput.append(buf, istr.gcount());
- }
-
- // Look for input delimiter(s) in the input buffer. If one is found, send the message to the xml parser.
- int start = 0;
- int delim;
- while((delim = mInput.find("\n\n\n", start)) != std::string::npos)
- {
-
- // Reset internal state of the LLVivoxProtocolParser (no effect on the expat parser)
- reset();
-
- XML_ParserReset(parser, NULL);
- XML_SetElementHandler(parser, ExpatStartTag, ExpatEndTag);
- XML_SetCharacterDataHandler(parser, ExpatCharHandler);
- XML_SetUserData(parser, this);
- XML_Parse(parser, mInput.data() + start, delim - start, false);
-
- // If this message isn't set to be squelched, output the raw XML received.
- if(!squelchDebugOutput)
+ if (params[0].asString() == "effects")
{
- LL_DEBUGS("Voice") << "parsing: " << mInput.substr(start, delim - start) << LL_ENDL;
- }
-
- start = delim + 3;
- }
-
- if(start != 0)
- mInput = mInput.substr(start);
-
- LL_DEBUGS("VivoxProtocolParser") << "at end, mInput is: " << mInput << LL_ENDL;
-
- if(!gVoiceClient->mConnected)
- {
- // If voice has been disabled, we just want to close the socket. This does so.
- LL_INFOS("Voice") << "returning STATUS_STOP" << LL_ENDL;
- return STATUS_STOP;
- }
-
- return STATUS_OK;
-}
-
-void XMLCALL LLVivoxProtocolParser::ExpatStartTag(void *data, const char *el, const char **attr)
-{
- if (data)
- {
- LLVivoxProtocolParser *object = (LLVivoxProtocolParser*)data;
- object->StartTag(el, attr);
- }
-}
-
-// --------------------------------------------------------------------------------
-
-void XMLCALL LLVivoxProtocolParser::ExpatEndTag(void *data, const char *el)
-{
- if (data)
- {
- LLVivoxProtocolParser *object = (LLVivoxProtocolParser*)data;
- object->EndTag(el);
- }
-}
-
-// --------------------------------------------------------------------------------
-
-void XMLCALL LLVivoxProtocolParser::ExpatCharHandler(void *data, const XML_Char *s, int len)
-{
- if (data)
- {
- LLVivoxProtocolParser *object = (LLVivoxProtocolParser*)data;
- object->CharData(s, len);
- }
-}
-
-// --------------------------------------------------------------------------------
-
-
-void LLVivoxProtocolParser::StartTag(const char *tag, const char **attr)
-{
- // Reset the text accumulator. We shouldn't have strings that are inturrupted by new tags
- textBuffer.clear();
- // only accumulate text if we're not ignoring tags.
- accumulateText = !ignoringTags;
-
- if (responseDepth == 0)
- {
- isEvent = !stricmp("Event", tag);
-
- if (!stricmp("Response", tag) || isEvent)
- {
- // Grab the attributes
- while (*attr)
+ LLVoiceEffectInterface* effect_interface = LLVoiceClient::instance().getVoiceEffectInterface();
+ // If the voice client doesn't support voice effects, we can't handle effects SLapps
+ if (!effect_interface)
{
- const char *key = *attr++;
- const char *value = *attr++;
-
- if (!stricmp("requestId", key))
- {
- requestId = value;
- }
- else if (!stricmp("action", key))
- {
- actionString = value;
- }
- else if (!stricmp("type", key))
- {
- eventTypeString = value;
- }
+ return false;
}
- }
- LL_DEBUGS("VivoxProtocolParser") << tag << " (" << responseDepth << ")" << LL_ENDL;
- }
- else
- {
- if (ignoringTags)
- {
- LL_DEBUGS("VivoxProtocolParser") << "ignoring tag " << tag << " (depth = " << responseDepth << ")" << LL_ENDL;
- }
- else
- {
- LL_DEBUGS("VivoxProtocolParser") << tag << " (" << responseDepth << ")" << LL_ENDL;
-
- // Ignore the InputXml stuff so we don't get confused
- if (!stricmp("InputXml", tag))
- {
- ignoringTags = true;
- ignoreDepth = responseDepth;
- accumulateText = false;
- LL_DEBUGS("VivoxProtocolParser") << "starting ignore, ignoreDepth is " << ignoreDepth << LL_ENDL;
- }
- else if (!stricmp("CaptureDevices", tag))
- {
- gVoiceClient->clearCaptureDevices();
- }
- else if (!stricmp("RenderDevices", tag))
- {
- gVoiceClient->clearRenderDevices();
- }
- else if (!stricmp("CaptureDevice", tag))
- {
- deviceString.clear();
- }
- else if (!stricmp("RenderDevice", tag))
- {
- deviceString.clear();
- }
- else if (!stricmp("Buddies", tag))
+ // Support secondlife:///app/voice/effects/refresh to update the voice effect list with new effects
+ if (params[1].asString() == "refresh")
{
- gVoiceClient->deleteAllBuddies();
+ effect_interface->refreshVoiceEffectLists(false);
+ return true;
}
- else if (!stricmp("BlockRules", tag))
- {
- gVoiceClient->deleteAllBlockRules();
- }
- else if (!stricmp("AutoAcceptRules", tag))
- {
- gVoiceClient->deleteAllAutoAcceptRules();
- }
-
- }
- }
- responseDepth++;
-}
-
-// --------------------------------------------------------------------------------
-
-void LLVivoxProtocolParser::EndTag(const char *tag)
-{
- const std::string& string = textBuffer;
-
- responseDepth--;
-
- if (ignoringTags)
- {
- if (ignoreDepth == responseDepth)
- {
- LL_DEBUGS("VivoxProtocolParser") << "end of ignore" << LL_ENDL;
- ignoringTags = false;
- }
- else
- {
- LL_DEBUGS("VivoxProtocolParser") << "ignoring tag " << tag << " (depth = " << responseDepth << ")" << LL_ENDL;
- }
- }
-
- if (!ignoringTags)
- {
- LL_DEBUGS("VivoxProtocolParser") << "processing tag " << tag << " (depth = " << responseDepth << ")" << LL_ENDL;
-
- // Closing a tag. Finalize the text we've accumulated and reset
- if (!stricmp("ReturnCode", tag))
- returnCode = strtol(string.c_str(), NULL, 10);
- else if (!stricmp("SessionHandle", tag))
- sessionHandle = string;
- else if (!stricmp("SessionGroupHandle", tag))
- sessionGroupHandle = string;
- else if (!stricmp("StatusCode", tag))
- statusCode = strtol(string.c_str(), NULL, 10);
- else if (!stricmp("StatusString", tag))
- statusString = string;
- else if (!stricmp("ParticipantURI", tag))
- uriString = string;
- else if (!stricmp("Volume", tag))
- volume = strtol(string.c_str(), NULL, 10);
- else if (!stricmp("Energy", tag))
- energy = (F32)strtod(string.c_str(), NULL);
- else if (!stricmp("IsModeratorMuted", tag))
- isModeratorMuted = !stricmp(string.c_str(), "true");
- else if (!stricmp("IsSpeaking", tag))
- isSpeaking = !stricmp(string.c_str(), "true");
- else if (!stricmp("Alias", tag))
- alias = string;
- else if (!stricmp("NumberOfAliases", tag))
- numberOfAliases = strtol(string.c_str(), NULL, 10);
- else if (!stricmp("Application", tag))
- applicationString = string;
- else if (!stricmp("ConnectorHandle", tag))
- connectorHandle = string;
- else if (!stricmp("VersionID", tag))
- versionID = string;
- else if (!stricmp("AccountHandle", tag))
- accountHandle = string;
- else if (!stricmp("State", tag))
- state = strtol(string.c_str(), NULL, 10);
- else if (!stricmp("URI", tag))
- uriString = string;
- else if (!stricmp("IsChannel", tag))
- isChannel = !stricmp(string.c_str(), "true");
- else if (!stricmp("Incoming", tag))
- incoming = !stricmp(string.c_str(), "true");
- else if (!stricmp("Enabled", tag))
- enabled = !stricmp(string.c_str(), "true");
- else if (!stricmp("Name", tag))
- nameString = string;
- else if (!stricmp("AudioMedia", tag))
- audioMediaString = string;
- else if (!stricmp("ChannelName", tag))
- nameString = string;
- else if (!stricmp("DisplayName", tag))
- displayNameString = string;
- else if (!stricmp("Device", tag))
- deviceString = string;
- else if (!stricmp("AccountName", tag))
- nameString = string;
- else if (!stricmp("ParticipantType", tag))
- participantType = strtol(string.c_str(), NULL, 10);
- else if (!stricmp("IsLocallyMuted", tag))
- isLocallyMuted = !stricmp(string.c_str(), "true");
- else if (!stricmp("MicEnergy", tag))
- energy = (F32)strtod(string.c_str(), NULL);
- else if (!stricmp("ChannelName", tag))
- nameString = string;
- else if (!stricmp("ChannelURI", tag))
- uriString = string;
- else if (!stricmp("BuddyURI", tag))
- uriString = string;
- else if (!stricmp("Presence", tag))
- statusString = string;
- else if (!stricmp("CaptureDevice", tag))
- {
- gVoiceClient->addCaptureDevice(deviceString);
- }
- else if (!stricmp("RenderDevice", tag))
- {
- gVoiceClient->addRenderDevice(deviceString);
- }
- else if (!stricmp("Buddy", tag))
- {
- gVoiceClient->processBuddyListEntry(uriString, displayNameString);
- }
- else if (!stricmp("BlockRule", tag))
- {
- gVoiceClient->addBlockRule(blockMask, presenceOnly);
- }
- else if (!stricmp("BlockMask", tag))
- blockMask = string;
- else if (!stricmp("PresenceOnly", tag))
- presenceOnly = string;
- else if (!stricmp("AutoAcceptRule", tag))
- {
- gVoiceClient->addAutoAcceptRule(autoAcceptMask, autoAddAsBuddy);
- }
- else if (!stricmp("AutoAcceptMask", tag))
- autoAcceptMask = string;
- else if (!stricmp("AutoAddAsBuddy", tag))
- autoAddAsBuddy = string;
- else if (!stricmp("MessageHeader", tag))
- messageHeader = string;
- else if (!stricmp("MessageBody", tag))
- messageBody = string;
- else if (!stricmp("NotificationType", tag))
- notificationType = string;
- else if (!stricmp("HasText", tag))
- hasText = !stricmp(string.c_str(), "true");
- else if (!stricmp("HasAudio", tag))
- hasAudio = !stricmp(string.c_str(), "true");
- else if (!stricmp("HasVideo", tag))
- hasVideo = !stricmp(string.c_str(), "true");
- else if (!stricmp("Terminated", tag))
- terminated = !stricmp(string.c_str(), "true");
- else if (!stricmp("SubscriptionHandle", tag))
- subscriptionHandle = string;
- else if (!stricmp("SubscriptionType", tag))
- subscriptionType = string;
-
- textBuffer.clear();
- accumulateText= false;
-
- if (responseDepth == 0)
- {
- // We finished all of the XML, process the data
- processResponse(tag);
- }
- }
-}
-
-// --------------------------------------------------------------------------------
-
-void LLVivoxProtocolParser::CharData(const char *buffer, int length)
-{
- /*
- This method is called for anything that isn't a tag, which can be text you
- want that lies between tags, and a lot of stuff you don't want like file formatting
- (tabs, spaces, CR/LF, etc).
-
- Only copy text if we are in accumulate mode...
- */
- if (accumulateText)
- textBuffer.append(buffer, length);
-}
-
-// --------------------------------------------------------------------------------
-
-void LLVivoxProtocolParser::processResponse(std::string tag)
-{
- LL_DEBUGS("VivoxProtocolParser") << tag << LL_ENDL;
-
- // SLIM SDK: the SDK now returns a statusCode of "200" (OK) for success. This is a change vs. previous SDKs.
- // According to Mike S., "The actual API convention is that responses with return codes of 0 are successful, regardless of the status code returned",
- // so I believe this will give correct behavior.
-
- if(returnCode == 0)
- statusCode = 0;
-
- if (isEvent)
- {
- const char *eventTypeCstr = eventTypeString.c_str();
- if (!stricmp(eventTypeCstr, "AccountLoginStateChangeEvent"))
- {
- gVoiceClient->accountLoginStateChangeEvent(accountHandle, statusCode, statusString, state);
- }
- else if (!stricmp(eventTypeCstr, "SessionAddedEvent"))
- {
- /*
- <Event type="SessionAddedEvent">
- <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg0</SessionGroupHandle>
- <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==0</SessionHandle>
- <Uri>sip:confctl-1408789@bhr.vivox.com</Uri>
- <IsChannel>true</IsChannel>
- <Incoming>false</Incoming>
- <ChannelName />
- </Event>
- */
- gVoiceClient->sessionAddedEvent(uriString, alias, sessionHandle, sessionGroupHandle, isChannel, incoming, nameString, applicationString);
- }
- else if (!stricmp(eventTypeCstr, "SessionRemovedEvent"))
- {
- gVoiceClient->sessionRemovedEvent(sessionHandle, sessionGroupHandle);
- }
- else if (!stricmp(eventTypeCstr, "SessionGroupAddedEvent"))
- {
- gVoiceClient->sessionGroupAddedEvent(sessionGroupHandle);
- }
- else if (!stricmp(eventTypeCstr, "MediaStreamUpdatedEvent"))
- {
- /*
- <Event type="MediaStreamUpdatedEvent">
- <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg0</SessionGroupHandle>
- <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==0</SessionHandle>
- <StatusCode>200</StatusCode>
- <StatusString>OK</StatusString>
- <State>2</State>
- <Incoming>false</Incoming>
- </Event>
- */
- gVoiceClient->mediaStreamUpdatedEvent(sessionHandle, sessionGroupHandle, statusCode, statusString, state, incoming);
- }
- else if (!stricmp(eventTypeCstr, "TextStreamUpdatedEvent"))
- {
- /*
- <Event type="TextStreamUpdatedEvent">
- <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg1</SessionGroupHandle>
- <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==1</SessionHandle>
- <Enabled>true</Enabled>
- <State>1</State>
- <Incoming>true</Incoming>
- </Event>
- */
- gVoiceClient->textStreamUpdatedEvent(sessionHandle, sessionGroupHandle, enabled, state, incoming);
- }
- else if (!stricmp(eventTypeCstr, "ParticipantAddedEvent"))
- {
- /*
- <Event type="ParticipantAddedEvent">
- <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg4</SessionGroupHandle>
- <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==4</SessionHandle>
- <ParticipantUri>sip:xI5auBZ60SJWIk606-1JGRQ==@bhr.vivox.com</ParticipantUri>
- <AccountName>xI5auBZ60SJWIk606-1JGRQ==</AccountName>
- <DisplayName />
- <ParticipantType>0</ParticipantType>
- </Event>
- */
- gVoiceClient->participantAddedEvent(sessionHandle, sessionGroupHandle, uriString, alias, nameString, displayNameString, participantType);
- }
- else if (!stricmp(eventTypeCstr, "ParticipantRemovedEvent"))
- {
- /*
- <Event type="ParticipantRemovedEvent">
- <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg4</SessionGroupHandle>
- <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==4</SessionHandle>
- <ParticipantUri>sip:xtx7YNV-3SGiG7rA1fo5Ndw==@bhr.vivox.com</ParticipantUri>
- <AccountName>xtx7YNV-3SGiG7rA1fo5Ndw==</AccountName>
- </Event>
- */
- gVoiceClient->participantRemovedEvent(sessionHandle, sessionGroupHandle, uriString, alias, nameString);
- }
- else if (!stricmp(eventTypeCstr, "ParticipantUpdatedEvent"))
- {
- /*
- <Event type="ParticipantUpdatedEvent">
- <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg0</SessionGroupHandle>
- <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==0</SessionHandle>
- <ParticipantUri>sip:xFnPP04IpREWNkuw1cOXlhw==@bhr.vivox.com</ParticipantUri>
- <IsModeratorMuted>false</IsModeratorMuted>
- <IsSpeaking>true</IsSpeaking>
- <Volume>44</Volume>
- <Energy>0.0879437</Energy>
- </Event>
- */
-
- // These happen so often that logging them is pretty useless.
- squelchDebugOutput = true;
-
- gVoiceClient->participantUpdatedEvent(sessionHandle, sessionGroupHandle, uriString, alias, isModeratorMuted, isSpeaking, volume, energy);
- }
- else if (!stricmp(eventTypeCstr, "AuxAudioPropertiesEvent"))
- {
- gVoiceClient->auxAudioPropertiesEvent(energy);
- }
- else if (!stricmp(eventTypeCstr, "BuddyPresenceEvent"))
- {
- gVoiceClient->buddyPresenceEvent(uriString, alias, statusString, applicationString);
- }
- else if (!stricmp(eventTypeCstr, "BuddyAndGroupListChangedEvent"))
- {
- // The buddy list was updated during parsing.
- // Need to recheck against the friends list.
- gVoiceClient->buddyListChanged();
- }
- else if (!stricmp(eventTypeCstr, "BuddyChangedEvent"))
- {
- /*
- <Event type="BuddyChangedEvent">
- <AccountHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==</AccountHandle>
- <BuddyURI>sip:x9fFHFZjOTN6OESF1DUPrZQ==@bhr.vivox.com</BuddyURI>
- <DisplayName>Monroe Tester</DisplayName>
- <BuddyData />
- <GroupID>0</GroupID>
- <ChangeType>Set</ChangeType>
- </Event>
- */
- // TODO: Question: Do we need to process this at all?
- }
- else if (!stricmp(eventTypeCstr, "MessageEvent"))
- {
- gVoiceClient->messageEvent(sessionHandle, uriString, alias, messageHeader, messageBody, applicationString);
- }
- else if (!stricmp(eventTypeCstr, "SessionNotificationEvent"))
- {
- gVoiceClient->sessionNotificationEvent(sessionHandle, uriString, notificationType);
- }
- else if (!stricmp(eventTypeCstr, "SubscriptionEvent"))
- {
- gVoiceClient->subscriptionEvent(uriString, subscriptionHandle, alias, displayNameString, applicationString, subscriptionType);
- }
- else if (!stricmp(eventTypeCstr, "SessionUpdatedEvent"))
- {
- /*
- <Event type="SessionUpdatedEvent">
- <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg0</SessionGroupHandle>
- <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==0</SessionHandle>
- <Uri>sip:confctl-9@bhd.vivox.com</Uri>
- <IsMuted>0</IsMuted>
- <Volume>50</Volume>
- <TransmitEnabled>1</TransmitEnabled>
- <IsFocused>0</IsFocused>
- <SpeakerPosition><Position><X>0</X><Y>0</Y><Z>0</Z></Position></SpeakerPosition>
- <SessionFontID>0</SessionFontID>
- </Event>
- */
- // We don't need to process this, but we also shouldn't warn on it, since that confuses people.
- }
-
- else if (!stricmp(eventTypeCstr, "SessionGroupRemovedEvent"))
- {
- /*
- <Event type="SessionGroupRemovedEvent">
- <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg0</SessionGroupHandle>
- </Event>
- */
- // We don't need to process this, but we also shouldn't warn on it, since that confuses people.
- }
- else
- {
- LL_WARNS("VivoxProtocolParser") << "Unknown event type " << eventTypeString << LL_ENDL;
}
+ return false;
}
- else
- {
- const char *actionCstr = actionString.c_str();
- if (!stricmp(actionCstr, "Connector.Create.1"))
- {
- gVoiceClient->connectorCreateResponse(statusCode, statusString, connectorHandle, versionID);
- }
- else if (!stricmp(actionCstr, "Account.Login.1"))
- {
- gVoiceClient->loginResponse(statusCode, statusString, accountHandle, numberOfAliases);
- }
- else if (!stricmp(actionCstr, "Session.Create.1"))
- {
- gVoiceClient->sessionCreateResponse(requestId, statusCode, statusString, sessionHandle);
- }
- else if (!stricmp(actionCstr, "SessionGroup.AddSession.1"))
- {
- gVoiceClient->sessionGroupAddSessionResponse(requestId, statusCode, statusString, sessionHandle);
- }
- else if (!stricmp(actionCstr, "Session.Connect.1"))
- {
- gVoiceClient->sessionConnectResponse(requestId, statusCode, statusString);
- }
- else if (!stricmp(actionCstr, "Account.Logout.1"))
- {
- gVoiceClient->logoutResponse(statusCode, statusString);
- }
- else if (!stricmp(actionCstr, "Connector.InitiateShutdown.1"))
- {
- gVoiceClient->connectorShutdownResponse(statusCode, statusString);
- }
- else if (!stricmp(actionCstr, "Account.ListBlockRules.1"))
- {
- gVoiceClient->accountListBlockRulesResponse(statusCode, statusString);
- }
- else if (!stricmp(actionCstr, "Account.ListAutoAcceptRules.1"))
- {
- gVoiceClient->accountListAutoAcceptRulesResponse(statusCode, statusString);
- }
- else if (!stricmp(actionCstr, "Session.Set3DPosition.1"))
- {
- // We don't need to process these, but they're so spammy we don't want to log them.
- squelchDebugOutput = true;
- }
-/*
- else if (!stricmp(actionCstr, "Account.ChannelGetList.1"))
- {
- gVoiceClient->channelGetListResponse(statusCode, statusString);
- }
- else if (!stricmp(actionCstr, "Connector.AccountCreate.1"))
- {
-
- }
- else if (!stricmp(actionCstr, "Connector.MuteLocalMic.1"))
- {
-
- }
- else if (!stricmp(actionCstr, "Connector.MuteLocalSpeaker.1"))
- {
-
- }
- else if (!stricmp(actionCstr, "Connector.SetLocalMicVolume.1"))
- {
-
- }
- else if (!stricmp(actionCstr, "Connector.SetLocalSpeakerVolume.1"))
- {
-
- }
- else if (!stricmp(actionCstr, "Session.ListenerSetPosition.1"))
- {
-
- }
- else if (!stricmp(actionCstr, "Session.SpeakerSetPosition.1"))
- {
-
- }
- else if (!stricmp(actionCstr, "Session.AudioSourceSetPosition.1"))
- {
-
- }
- else if (!stricmp(actionCstr, "Session.GetChannelParticipants.1"))
- {
-
- }
- else if (!stricmp(actionCstr, "Account.ChannelCreate.1"))
- {
-
- }
- else if (!stricmp(actionCstr, "Account.ChannelUpdate.1"))
- {
-
- }
- else if (!stricmp(actionCstr, "Account.ChannelDelete.1"))
- {
-
- }
- else if (!stricmp(actionCstr, "Account.ChannelCreateAndInvite.1"))
- {
-
- }
- else if (!stricmp(actionCstr, "Account.ChannelFolderCreate.1"))
- {
-
- }
- else if (!stricmp(actionCstr, "Account.ChannelFolderUpdate.1"))
- {
-
- }
- else if (!stricmp(actionCstr, "Account.ChannelFolderDelete.1"))
- {
-
- }
- else if (!stricmp(actionCstr, "Account.ChannelAddModerator.1"))
- {
-
- }
- else if (!stricmp(actionCstr, "Account.ChannelDeleteModerator.1"))
- {
-
- }
-*/
- }
-}
-
-///////////////////////////////////////////////////////////////////////////////////////////////
-
-class LLVoiceClientMuteListObserver : public LLMuteListObserver
-{
- /* virtual */ void onChange() { gVoiceClient->muteListChanged();}
-};
-
-class LLVoiceClientFriendsObserver : public LLFriendObserver
-{
-public:
- /* virtual */ void changed(U32 mask) { gVoiceClient->updateFriends(mask);}
-};
-
-static LLVoiceClientMuteListObserver mutelist_listener;
-static bool sMuteListListener_listening = false;
-
-static LLVoiceClientFriendsObserver *friendslist_listener = NULL;
-
-///////////////////////////////////////////////////////////////////////////////////////////////
-
-class LLVoiceClientCapResponder : public LLHTTPClient::Responder
-{
-public:
- LLVoiceClientCapResponder(void){};
-
- virtual void error(U32 status, const std::string& reason); // called with bad status codes
- virtual void result(const LLSD& content);
-
-private:
};
+LLVoiceHandler gVoiceHandler;
-void LLVoiceClientCapResponder::error(U32 status, const std::string& reason)
-{
- LL_WARNS("Voice") << "LLVoiceClientCapResponder::error("
- << status << ": " << reason << ")"
- << LL_ENDL;
-}
-
-void LLVoiceClientCapResponder::result(const LLSD& content)
-{
- LLSD::map_const_iterator iter;
-
- LL_DEBUGS("Voice") << "ParcelVoiceInfoRequest response:" << ll_pretty_print_sd(content) << LL_ENDL;
- if ( content.has("voice_credentials") )
- {
- LLSD voice_credentials = content["voice_credentials"];
- std::string uri;
- std::string credentials;
-
- if ( voice_credentials.has("channel_uri") )
- {
- uri = voice_credentials["channel_uri"].asString();
- }
- if ( voice_credentials.has("channel_credentials") )
- {
- credentials =
- voice_credentials["channel_credentials"].asString();
- }
-
- gVoiceClient->setSpatialChannel(uri, credentials);
- }
-}
-
-
-
-#if LL_WINDOWS
-static HANDLE sGatewayHandle = 0;
-
-static bool isGatewayRunning()
-{
- bool result = false;
- if(sGatewayHandle != 0)
- {
- DWORD waitresult = WaitForSingleObject(sGatewayHandle, 0);
- if(waitresult != WAIT_OBJECT_0)
- {
- result = true;
- }
- }
- return result;
-}
-static void killGateway()
-{
- if(sGatewayHandle != 0)
- {
- TerminateProcess(sGatewayHandle,0);
- }
-}
-
-#else // Mac and linux
-
-static pid_t sGatewayPID = 0;
-static bool isGatewayRunning()
-{
- bool result = false;
- if(sGatewayPID != 0)
- {
- // A kill with signal number 0 has no effect, just does error checking. It should return an error if the process no longer exists.
- if(kill(sGatewayPID, 0) == 0)
- {
- result = true;
- }
- }
- return result;
-}
-
-static void killGateway()
-{
- if(sGatewayPID != 0)
- {
- kill(sGatewayPID, SIGTERM);
- }
-}
-
-#endif
-
-class LLSpeakerVolumeStorage : public LLSingleton<LLSpeakerVolumeStorage>
-{
- LOG_CLASS(LLSpeakerVolumeStorage);
-public:
-
- /**
- * Sets internal voluem level for specified user.
- *
- * @param[in] speaker_id - LLUUID of user to store volume level for
- * @param[in] volume - external (vivox) volume level to be stored for user.
- */
- void storeSpeakerVolume(const LLUUID& speaker_id, F32 volume);
-
- /**
- * Gets stored external (vivox) volume level for specified speaker and
- * transforms it into internal (viewer) level.
- *
- * If specified user is not found default level will be returned. It is equivalent of
- * external level 0.5 from the 0.0..1.0 range.
- * Internal level is calculated as: internal = 400 * external^2
- * Maps 0.0 to 1.0 to internal values 0-400 with default 0.5 == 100
- *
- * @param[in] speaker_id - LLUUID of user to get his volume level
- */
- S32 getSpeakerVolume(const LLUUID& speaker_id);
-
-private:
- friend class LLSingleton<LLSpeakerVolumeStorage>;
- LLSpeakerVolumeStorage();
- ~LLSpeakerVolumeStorage();
-
- const static std::string SETTINGS_FILE_NAME;
-
- void load();
- void save();
-
- typedef std::map<LLUUID, F32> speaker_data_map_t;
- speaker_data_map_t mSpeakersData;
-};
-
-const std::string LLSpeakerVolumeStorage::SETTINGS_FILE_NAME = "volume_settings.xml";
-
-LLSpeakerVolumeStorage::LLSpeakerVolumeStorage()
-{
- load();
-}
-
-LLSpeakerVolumeStorage::~LLSpeakerVolumeStorage()
-{
- save();
-}
-
-void LLSpeakerVolumeStorage::storeSpeakerVolume(const LLUUID& speaker_id, F32 volume)
-{
- mSpeakersData[speaker_id] = volume;
-}
-
-S32 LLSpeakerVolumeStorage::getSpeakerVolume(const LLUUID& speaker_id)
-{
- // default internal level of user voice.
- const static LLUICachedControl<S32> DEFAULT_INTERNAL_VOLUME_LEVEL("VoiceDefaultInternalLevel", 100);
- S32 ret_val = DEFAULT_INTERNAL_VOLUME_LEVEL;
- speaker_data_map_t::const_iterator it = mSpeakersData.find(speaker_id);
-
- if (it != mSpeakersData.end())
- {
- F32 f_val = it->second;
- // volume can amplify by as much as 4x!
- S32 ivol = (S32)(400.f * f_val * f_val);
- ret_val = llclamp(ivol, 0, 400);
- }
- return ret_val;
-}
-
-void LLSpeakerVolumeStorage::load()
-{
- // load per-resident voice volume information
- std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SETTINGS_FILE_NAME);
-
- LLSD settings_llsd;
- llifstream file;
- file.open(filename);
- if (file.is_open())
- {
- LLSDSerialize::fromXML(settings_llsd, file);
- }
-
- for (LLSD::map_const_iterator iter = settings_llsd.beginMap();
- iter != settings_llsd.endMap(); ++iter)
- {
- mSpeakersData.insert(std::make_pair(LLUUID(iter->first), (F32)iter->second.asReal()));
- }
-}
-
-void LLSpeakerVolumeStorage::save()
-{
- // If we quit from the login screen we will not have an SL account
- // name. Don't try to save, otherwise we'll dump a file in
- // C:\Program Files\SecondLife\ or similar. JC
- std::string user_dir = gDirUtilp->getLindenUserDir();
- if (!user_dir.empty())
- {
- std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SETTINGS_FILE_NAME);
- LLSD settings_llsd;
-
- for(speaker_data_map_t::const_iterator iter = mSpeakersData.begin(); iter != mSpeakersData.end(); ++iter)
- {
- settings_llsd[iter->first.asString()] = iter->second;
- }
-
- llofstream file;
- file.open(filename);
- LLSDSerialize::toPrettyXML(settings_llsd, file);
- }
-}
-
-
-///////////////////////////////////////////////////////////////////////////////////////////////
-
-LLVoiceClient::LLVoiceClient() :
- mState(stateDisabled),
- mSessionTerminateRequested(false),
- mRelogRequested(false),
- mConnected(false),
- mPump(NULL),
-
- mTuningMode(false),
- mTuningEnergy(0.0f),
- mTuningMicVolume(0),
- mTuningMicVolumeDirty(true),
- mTuningSpeakerVolume(0),
- mTuningSpeakerVolumeDirty(true),
- mTuningExitState(stateDisabled),
-
- mAreaVoiceDisabled(false),
- mAudioSession(NULL),
- mAudioSessionChanged(false),
- mNextAudioSession(NULL),
-
- mCurrentParcelLocalID(0),
- mNumberOfAliases(0),
- mCommandCookie(0),
- mLoginRetryCount(0),
-
- mBuddyListMapPopulated(false),
- mBlockRulesListReceived(false),
- mAutoAcceptRulesListReceived(false),
- mCaptureDeviceDirty(false),
- mRenderDeviceDirty(false),
- mSpatialCoordsDirty(false),
-
- mPTTDirty(true),
- mPTT(true),
- mUsePTT(true),
- mPTTIsMiddleMouse(false),
- mPTTKey(0),
- mPTTIsToggle(false),
- mUserPTTState(false),
- mMuteMic(false),
- mFriendsListDirty(true),
-
- mEarLocation(0),
- mSpeakerVolumeDirty(true),
- mSpeakerMuteDirty(true),
- mMicVolume(0),
- mMicVolumeDirty(true),
-
- mVoiceEnabled(false),
- mWriteInProgress(false),
-
- mLipSyncEnabled(false)
-{
- gVoiceClient = this;
-
- mAPIVersion = LLTrans::getString("NotConnected");
-
- mSpeakerVolume = scale_speaker_volume(0);
-
-#if LL_DARWIN || LL_LINUX || LL_SOLARIS
- // HACK: THIS DOES NOT BELONG HERE
- // When the vivox daemon dies, the next write attempt on our socket generates a SIGPIPE, which kills us.
- // This should cause us to ignore SIGPIPE and handle the error through proper channels.
- // This should really be set up elsewhere. Where should it go?
- signal(SIGPIPE, SIG_IGN);
-
- // Since we're now launching the gateway with fork/exec instead of system(), we need to deal with zombie processes.
- // Ignoring SIGCHLD should prevent zombies from being created. Alternately, we could use wait(), but I'd rather not do that.
- signal(SIGCHLD, SIG_IGN);
-#endif
-
- // set up state machine
- setState(stateDisabled);
-
- gIdleCallbacks.addFunction(idle, this);
-}
-
-//---------------------------------------------------
-
-LLVoiceClient::~LLVoiceClient()
-{
-}
-
-//----------------------------------------------
-
-void LLVoiceClient::init(LLPumpIO *pump)
-{
- // constructor will set up gVoiceClient
- LLVoiceClient::getInstance()->mPump = pump;
- LLVoiceClient::getInstance()->updateSettings();
-}
-
-void LLVoiceClient::terminate()
-{
- if(gVoiceClient)
- {
-// gVoiceClient->leaveAudioSession();
- gVoiceClient->logout();
- // As of SDK version 4885, this should no longer be necessary. It will linger after the socket close if it needs to.
- // ms_sleep(2000);
- gVoiceClient->connectorShutdown();
- gVoiceClient->closeSocket(); // Need to do this now -- bad things happen if the destructor does it later.
-
- // This will do unpleasant things on windows.
-// killGateway();
-
- // Don't do this anymore -- LLSingleton will take care of deleting the object.
-// delete gVoiceClient;
-
- // Hint to other code not to access the voice client anymore.
- gVoiceClient = NULL;
- }
-}
-
-//---------------------------------------------------
-
-void LLVoiceClient::updateSettings()
-{
- setVoiceEnabled(gSavedSettings.getBOOL("EnableVoiceChat"));
- setUsePTT(gSavedSettings.getBOOL("PTTCurrentlyEnabled"));
- std::string keyString = gSavedSettings.getString("PushToTalkButton");
- setPTTKey(keyString);
- setPTTIsToggle(gSavedSettings.getBOOL("PushToTalkToggle"));
- setEarLocation(gSavedSettings.getS32("VoiceEarLocation"));
-
- std::string inputDevice = gSavedSettings.getString("VoiceInputAudioDevice");
- setCaptureDevice(inputDevice);
- std::string outputDevice = gSavedSettings.getString("VoiceOutputAudioDevice");
- setRenderDevice(outputDevice);
- F32 mic_level = gSavedSettings.getF32("AudioLevelMic");
- setMicGain(mic_level);
- setLipSyncEnabled(gSavedSettings.getBOOL("LipSyncEnabled"));
-}
-
-/////////////////////////////
-// utility functions
-
-bool LLVoiceClient::writeString(const std::string &str)
-{
- bool result = false;
- if(mConnected)
- {
- apr_status_t err;
- apr_size_t size = (apr_size_t)str.size();
- apr_size_t written = size;
-
- //MARK: Turn this on to log outgoing XML
-// LL_DEBUGS("Voice") << "sending: " << str << LL_ENDL;
-
- // check return code - sockets will fail (broken, etc.)
- err = apr_socket_send(
- mSocket->getSocket(),
- (const char*)str.data(),
- &written);
-
- if(err == 0)
- {
- // Success.
- result = true;
- }
- // TODO: handle partial writes (written is number of bytes written)
- // Need to set socket to non-blocking before this will work.
-// else if(APR_STATUS_IS_EAGAIN(err))
-// {
-// //
-// }
- else
- {
- // Assume any socket error means something bad. For now, just close the socket.
- char buf[MAX_STRING];
- LL_WARNS("Voice") << "apr error " << err << " ("<< apr_strerror(err, buf, MAX_STRING) << ") sending data to vivox daemon." << LL_ENDL;
- daemonDied();
- }
- }
-
- return result;
-}
-
-
-/////////////////////////////
-// session control messages
-void LLVoiceClient::connectorCreate()
-{
- std::ostringstream stream;
- std::string logpath = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "");
- std::string loglevel = "0";
-
- // Transition to stateConnectorStarted when the connector handle comes back.
- setState(stateConnectorStarting);
-
- std::string savedLogLevel = gSavedSettings.getString("VivoxDebugLevel");
-
- if(savedLogLevel != "-1")
- {
- LL_DEBUGS("Voice") << "creating connector with logging enabled" << LL_ENDL;
- loglevel = "10";
- }
-
- stream
- << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.Create.1\">"
- << "<ClientName>V2 SDK</ClientName>"
- << "<AccountManagementServer>" << mVoiceAccountServerURI << "</AccountManagementServer>"
- << "<Mode>Normal</Mode>"
- << "<Logging>"
- << "<Folder>" << logpath << "</Folder>"
- << "<FileNamePrefix>Connector</FileNamePrefix>"
- << "<FileNameSuffix>.log</FileNameSuffix>"
- << "<LogLevel>" << loglevel << "</LogLevel>"
- << "</Logging>"
- << "<Application>SecondLifeViewer.1</Application>"
- << "</Request>\n\n\n";
-
- writeString(stream.str());
-}
-
-void LLVoiceClient::connectorShutdown()
-{
- setState(stateConnectorStopping);
-
- if(!mConnectorHandle.empty())
- {
- std::ostringstream stream;
- stream
- << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.InitiateShutdown.1\">"
- << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>"
- << "</Request>"
- << "\n\n\n";
-
- mConnectorHandle.clear();
-
- writeString(stream.str());
- }
-}
-
-void LLVoiceClient::userAuthorized(const std::string& firstName, const std::string& lastName, const LLUUID &agentID)
-{
- mAccountFirstName = firstName;
- mAccountLastName = lastName;
-
- mAccountDisplayName = firstName;
- mAccountDisplayName += " ";
- mAccountDisplayName += lastName;
-
- LL_INFOS("Voice") << "name \"" << mAccountDisplayName << "\" , ID " << agentID << LL_ENDL;
-
- sConnectingToAgni = LLViewerLogin::getInstance()->isInProductionGrid();
-
- mAccountName = nameFromID(agentID);
-}
-
-void LLVoiceClient::requestVoiceAccountProvision(S32 retries)
-{
- if ( gAgent.getRegion() && mVoiceEnabled )
- {
- std::string url =
- gAgent.getRegion()->getCapability(
- "ProvisionVoiceAccountRequest");
-
- if ( url == "" ) return;
-
- LLHTTPClient::post(
- url,
- LLSD(),
- new LLViewerVoiceAccountProvisionResponder(retries));
- }
-}
-
-void LLVoiceClient::login(
- const std::string& account_name,
- const std::string& password,
- const std::string& voice_sip_uri_hostname,
- const std::string& voice_account_server_uri)
-{
- mVoiceSIPURIHostName = voice_sip_uri_hostname;
- mVoiceAccountServerURI = voice_account_server_uri;
-
- if(!mAccountHandle.empty())
- {
- // Already logged in.
- LL_WARNS("Voice") << "Called while already logged in." << LL_ENDL;
-
- // Don't process another login.
- return;
- }
- else if ( account_name != mAccountName )
- {
- //TODO: error?
- LL_WARNS("Voice") << "Wrong account name! " << account_name
- << " instead of " << mAccountName << LL_ENDL;
- }
- else
- {
- mAccountPassword = password;
- }
-
- std::string debugSIPURIHostName = gSavedSettings.getString("VivoxDebugSIPURIHostName");
-
- if( !debugSIPURIHostName.empty() )
- {
- mVoiceSIPURIHostName = debugSIPURIHostName;
- }
-
- if( mVoiceSIPURIHostName.empty() )
- {
- // we have an empty account server name
- // so we fall back to hardcoded defaults
-
- if(sConnectingToAgni)
- {
- // Use the release account server
- mVoiceSIPURIHostName = "bhr.vivox.com";
- }
- else
- {
- // Use the development account server
- mVoiceSIPURIHostName = "bhd.vivox.com";
- }
- }
-
- std::string debugAccountServerURI = gSavedSettings.getString("VivoxDebugVoiceAccountServerURI");
-
- if( !debugAccountServerURI.empty() )
- {
- mVoiceAccountServerURI = debugAccountServerURI;
- }
-
- if( mVoiceAccountServerURI.empty() )
- {
- // If the account server URI isn't specified, construct it from the SIP URI hostname
- mVoiceAccountServerURI = "https://www." + mVoiceSIPURIHostName + "/api2/";
- }
-}
-
-void LLVoiceClient::idle(void* user_data)
-{
- LLVoiceClient* self = (LLVoiceClient*)user_data;
- self->stateMachine();
-}
-
-std::string LLVoiceClient::state2string(LLVoiceClient::state inState)
-{
- std::string result = "UNKNOWN";
-
- // Prevent copy-paste errors when updating this list...
-#define CASE(x) case x: result = #x; break
-
- switch(inState)
- {
- CASE(stateDisableCleanup);
- CASE(stateDisabled);
- CASE(stateStart);
- CASE(stateDaemonLaunched);
- CASE(stateConnecting);
- CASE(stateConnected);
- CASE(stateIdle);
- CASE(stateMicTuningStart);
- CASE(stateMicTuningRunning);
- CASE(stateMicTuningStop);
- CASE(stateConnectorStart);
- CASE(stateConnectorStarting);
- CASE(stateConnectorStarted);
- CASE(stateLoginRetry);
- CASE(stateLoginRetryWait);
- CASE(stateNeedsLogin);
- CASE(stateLoggingIn);
- CASE(stateLoggedIn);
- CASE(stateCreatingSessionGroup);
- CASE(stateNoChannel);
- CASE(stateJoiningSession);
- CASE(stateSessionJoined);
- CASE(stateRunning);
- CASE(stateLeavingSession);
- CASE(stateSessionTerminated);
- CASE(stateLoggingOut);
- CASE(stateLoggedOut);
- CASE(stateConnectorStopping);
- CASE(stateConnectorStopped);
- CASE(stateConnectorFailed);
- CASE(stateConnectorFailedWaiting);
- CASE(stateLoginFailed);
- CASE(stateLoginFailedWaiting);
- CASE(stateJoinSessionFailed);
- CASE(stateJoinSessionFailedWaiting);
- CASE(stateJail);
- }
-
-#undef CASE
-
- return result;
-}
std::string LLVoiceClientStatusObserver::status2string(LLVoiceClientStatusObserver::EStatusType inStatus)
{
std::string result = "UNKNOWN";
- // Prevent copy-paste errors when updating this list...
+ // Prevent copy-paste errors when updating this list...
#define CASE(x) case x: result = #x; break
-
+
switch(inStatus)
{
- CASE(STATUS_LOGIN_RETRY);
- CASE(STATUS_LOGGED_IN);
- CASE(STATUS_JOINING);
- CASE(STATUS_JOINED);
- CASE(STATUS_LEFT_CHANNEL);
- CASE(STATUS_VOICE_DISABLED);
- CASE(STATUS_VOICE_ENABLED);
- CASE(BEGIN_ERROR_STATUS);
- CASE(ERROR_CHANNEL_FULL);
- CASE(ERROR_CHANNEL_LOCKED);
- CASE(ERROR_NOT_AVAILABLE);
- CASE(ERROR_UNKNOWN);
- default:
- break;
+ CASE(STATUS_LOGIN_RETRY);
+ CASE(STATUS_LOGGED_IN);
+ CASE(STATUS_JOINING);
+ CASE(STATUS_JOINED);
+ CASE(STATUS_LEFT_CHANNEL);
+ CASE(STATUS_VOICE_DISABLED);
+ CASE(BEGIN_ERROR_STATUS);
+ CASE(ERROR_CHANNEL_FULL);
+ CASE(ERROR_CHANNEL_LOCKED);
+ CASE(ERROR_NOT_AVAILABLE);
+ CASE(ERROR_UNKNOWN);
+ default:
+ break;
}
-
+
#undef CASE
return result;
}
-void LLVoiceClient::setState(state inState)
-{
- LL_DEBUGS("Voice") << "entering state " << state2string(inState) << LL_ENDL;
-
- mState = inState;
-}
-
-void LLVoiceClient::stateMachine()
-{
- if(gDisconnected)
- {
- // The viewer has been disconnected from the sim. Disable voice.
- setVoiceEnabled(false);
- }
-
- if(mVoiceEnabled)
- {
- updatePosition();
- }
- else if(mTuningMode)
- {
- // Tuning mode is special -- it needs to launch SLVoice even if voice is disabled.
- }
- else
- {
- if((getState() != stateDisabled) && (getState() != stateDisableCleanup))
- {
- // User turned off voice support. Send the cleanup messages, close the socket, and reset.
- if(!mConnected)
- {
- // if voice was turned off after the daemon was launched but before we could connect to it, we may need to issue a kill.
- LL_INFOS("Voice") << "Disabling voice before connection to daemon, terminating." << LL_ENDL;
- killGateway();
- }
-
- logout();
- connectorShutdown();
-
- setState(stateDisableCleanup);
- }
- }
-
- // Check for parcel boundary crossing
- {
- LLViewerRegion *region = gAgent.getRegion();
- LLParcel *parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
-
- if(region && parcel)
- {
- S32 parcelLocalID = parcel->getLocalID();
- std::string regionName = region->getName();
- std::string capURI = region->getCapability("ParcelVoiceInfoRequest");
-
-// LL_DEBUGS("Voice") << "Region name = \"" << regionName << "\", parcel local ID = " << parcelLocalID << ", cap URI = \"" << capURI << "\"" << LL_ENDL;
-
- // The region name starts out empty and gets filled in later.
- // Also, the cap gets filled in a short time after the region cross, but a little too late for our purposes.
- // If either is empty, wait for the next time around.
- if(!regionName.empty())
- {
- if(!capURI.empty())
- {
- if((parcelLocalID != mCurrentParcelLocalID) || (regionName != mCurrentRegionName))
- {
- // We have changed parcels. Initiate a parcel channel lookup.
- mCurrentParcelLocalID = parcelLocalID;
- mCurrentRegionName = regionName;
-
- parcelChanged();
- }
- }
- else
- {
- LL_WARNS_ONCE("Voice") << "region doesn't have ParcelVoiceInfoRequest capability. This is normal for a short time after teleporting, but bad if it persists for very long." << LL_ENDL;
- }
- }
- }
- }
-
- switch(getState())
- {
- //MARK: stateDisableCleanup
- case stateDisableCleanup:
- // Clean up and reset everything.
- closeSocket();
- deleteAllSessions();
- deleteAllBuddies();
-
- mConnectorHandle.clear();
- mAccountHandle.clear();
- mAccountPassword.clear();
- mVoiceAccountServerURI.clear();
-
- setState(stateDisabled);
- break;
-
- //MARK: stateDisabled
- case stateDisabled:
- if(mTuningMode || (mVoiceEnabled && !mAccountName.empty()))
- {
- setState(stateStart);
- }
- break;
-
- //MARK: stateStart
- case stateStart:
- if(gSavedSettings.getBOOL("CmdLineDisableVoice"))
- {
- // Voice is locked out, we must not launch the vivox daemon.
- setState(stateJail);
- }
- else if(!isGatewayRunning())
- {
- if(true)
- {
- // Launch the voice daemon
-
- // *FIX:Mani - Using the executable dir instead
- // of mAppRODataDir, the working directory from which the app
- // is launched.
- //std::string exe_path = gDirUtilp->getAppRODataDir();
- std::string exe_path = gDirUtilp->getExecutableDir();
- exe_path += gDirUtilp->getDirDelimiter();
-#if LL_WINDOWS
- exe_path += "SLVoice.exe";
-#elif LL_DARWIN
- exe_path += "../Resources/SLVoice";
-#else
- exe_path += "SLVoice";
-#endif
- // See if the vivox executable exists
- llstat s;
- if(!LLFile::stat(exe_path, &s))
- {
- // vivox executable exists. Build the command line and launch the daemon.
- // SLIM SDK: these arguments are no longer necessary.
-// std::string args = " -p tcp -h -c";
- std::string args;
- std::string loglevel = gSavedSettings.getString("VivoxDebugLevel");
-
- if(loglevel.empty())
- {
- loglevel = "-1"; // turn logging off completely
- }
-
- args += " -ll ";
- args += loglevel;
-
- LL_DEBUGS("Voice") << "Args for SLVoice: " << args << LL_ENDL;
-
-#if LL_WINDOWS
- PROCESS_INFORMATION pinfo;
- STARTUPINFOW sinfo;
- memset(&sinfo, 0, sizeof(sinfo));
-
- std::string exe_dir = gDirUtilp->getExecutableDir();
-
- llutf16string exe_path16 = utf8str_to_utf16str(exe_path);
- llutf16string exe_dir16 = utf8str_to_utf16str(exe_dir);
- llutf16string args16 = utf8str_to_utf16str(args);
- // Create a writeable copy to keep Windows happy.
- U16 *argscpy_16 = new U16[args16.size() + 1];
- wcscpy_s(argscpy_16,args16.size()+1,args16.c_str());
- if(!CreateProcessW(exe_path16.c_str(), argscpy_16, NULL, NULL, FALSE, 0, NULL, exe_dir16.c_str(), &sinfo, &pinfo))
- {
-// DWORD dwErr = GetLastError();
- }
- else
- {
- // foo = pinfo.dwProcessId; // get your pid here if you want to use it later on
- // CloseHandle(pinfo.hProcess); // stops leaks - nothing else
- sGatewayHandle = pinfo.hProcess;
- CloseHandle(pinfo.hThread); // stops leaks - nothing else
- }
-
- delete[] argscpy_16;
-#else // LL_WINDOWS
- // This should be the same for mac and linux
- {
- std::vector<std::string> arglist;
- arglist.push_back(exe_path);
-
- // Split the argument string into separate strings for each argument
- typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
- boost::char_separator<char> sep(" ");
- tokenizer tokens(args, sep);
- tokenizer::iterator token_iter;
-
- for(token_iter = tokens.begin(); token_iter != tokens.end(); ++token_iter)
- {
- arglist.push_back(*token_iter);
- }
-
- // create an argv vector for the child process
- char **fakeargv = new char*[arglist.size() + 1];
- int i;
- for(i=0; i < arglist.size(); i++)
- fakeargv[i] = const_cast<char*>(arglist[i].c_str());
-
- fakeargv[i] = NULL;
-
- fflush(NULL); // flush all buffers before the child inherits them
- pid_t id = vfork();
- if(id == 0)
- {
- // child
- execv(exe_path.c_str(), fakeargv);
-
- // If we reach this point, the exec failed.
- // Use _exit() instead of exit() per the vfork man page.
- _exit(0);
- }
-
- // parent
- delete[] fakeargv;
- sGatewayPID = id;
- }
-#endif // LL_WINDOWS
- mDaemonHost = LLHost(gSavedSettings.getString("VoiceHost").c_str(), gSavedSettings.getU32("VoicePort"));
- }
- else
- {
- LL_INFOS("Voice") << exe_path << " not found." << LL_ENDL;
- }
- }
- else
- {
- // SLIM SDK: port changed from 44124 to 44125.
- // We can connect to a client gateway running on another host. This is useful for testing.
- // To do this, launch the gateway on a nearby host like this:
- // vivox-gw.exe -p tcp -i 0.0.0.0:44125
- // and put that host's IP address here.
- mDaemonHost = LLHost(gSavedSettings.getString("VoiceHost"), gSavedSettings.getU32("VoicePort"));
- }
-
- mUpdateTimer.start();
- mUpdateTimer.setTimerExpirySec(CONNECT_THROTTLE_SECONDS);
-
- setState(stateDaemonLaunched);
-
- // Dirty the states we'll need to sync with the daemon when it comes up.
- mPTTDirty = true;
- mMicVolumeDirty = true;
- mSpeakerVolumeDirty = true;
- mSpeakerMuteDirty = true;
- // These only need to be set if they're not default (i.e. empty string).
- mCaptureDeviceDirty = !mCaptureDevice.empty();
- mRenderDeviceDirty = !mRenderDevice.empty();
-
- mMainSessionGroupHandle.clear();
- }
- break;
-
- //MARK: stateDaemonLaunched
- case stateDaemonLaunched:
- if(mUpdateTimer.hasExpired())
- {
- LL_DEBUGS("Voice") << "Connecting to vivox daemon" << LL_ENDL;
-
- mUpdateTimer.setTimerExpirySec(CONNECT_THROTTLE_SECONDS);
-
- if(!mSocket)
- {
- mSocket = LLSocket::create(gAPRPoolp, LLSocket::STREAM_TCP);
- }
-
- mConnected = mSocket->blockingConnect(mDaemonHost);
- if(mConnected)
- {
- setState(stateConnecting);
- }
- else
- {
- // If the connect failed, the socket may have been put into a bad state. Delete it.
- closeSocket();
- }
- }
- break;
-
- //MARK: stateConnecting
- case stateConnecting:
- // Can't do this until we have the pump available.
- if(mPump)
- {
- // MBW -- Note to self: pumps and pipes examples in
- // indra/test/io.cpp
- // indra/test/llpipeutil.{cpp|h}
-
- // Attach the pumps and pipes
-
- LLPumpIO::chain_t readChain;
-
- readChain.push_back(LLIOPipe::ptr_t(new LLIOSocketReader(mSocket)));
- readChain.push_back(LLIOPipe::ptr_t(new LLVivoxProtocolParser()));
-
- mPump->addChain(readChain, NEVER_CHAIN_EXPIRY_SECS);
-
- setState(stateConnected);
- }
-
- break;
-
- //MARK: stateConnected
- case stateConnected:
- // Initial devices query
- getCaptureDevicesSendMessage();
- getRenderDevicesSendMessage();
-
- mLoginRetryCount = 0;
-
- setState(stateIdle);
- break;
-
- //MARK: stateIdle
- case stateIdle:
- // This is the idle state where we're connected to the daemon but haven't set up a connector yet.
- if(mTuningMode)
- {
- mTuningExitState = stateIdle;
- setState(stateMicTuningStart);
- }
- else if(!mVoiceEnabled)
- {
- // We never started up the connector. This will shut down the daemon.
- setState(stateConnectorStopped);
- }
- else if(!mAccountName.empty())
- {
- LLViewerRegion *region = gAgent.getRegion();
-
- if(region)
- {
- if ( region->getCapability("ProvisionVoiceAccountRequest") != "" )
- {
- if ( mAccountPassword.empty() )
- {
- requestVoiceAccountProvision();
- }
- setState(stateConnectorStart);
- }
- else
- {
- LL_WARNS_ONCE("Voice") << "region doesn't have ProvisionVoiceAccountRequest capability!" << LL_ENDL;
- }
- }
- }
- break;
-
- //MARK: stateMicTuningStart
- case stateMicTuningStart:
- if(mUpdateTimer.hasExpired())
- {
- if(mCaptureDeviceDirty || mRenderDeviceDirty)
- {
- // These can't be changed while in tuning mode. Set them before starting.
- std::ostringstream stream;
-
- buildSetCaptureDevice(stream);
- buildSetRenderDevice(stream);
-
- if(!stream.str().empty())
- {
- writeString(stream.str());
- }
-
- // This will come around again in the same state and start the capture, after the timer expires.
- mUpdateTimer.start();
- mUpdateTimer.setTimerExpirySec(UPDATE_THROTTLE_SECONDS);
- }
- else
- {
- // duration parameter is currently unused, per Mike S.
- tuningCaptureStartSendMessage(10000);
-
- setState(stateMicTuningRunning);
- }
- }
-
- break;
-
- //MARK: stateMicTuningRunning
- case stateMicTuningRunning:
- if(!mTuningMode || mCaptureDeviceDirty || mRenderDeviceDirty)
- {
- // All of these conditions make us leave tuning mode.
- setState(stateMicTuningStop);
- }
- else
- {
- // process mic/speaker volume changes
- if(mTuningMicVolumeDirty || mTuningSpeakerVolumeDirty)
- {
- std::ostringstream stream;
-
- if(mTuningMicVolumeDirty)
- {
- LL_INFOS("Voice") << "setting tuning mic level to " << mTuningMicVolume << LL_ENDL;
- stream
- << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.SetMicLevel.1\">"
- << "<Level>" << mTuningMicVolume << "</Level>"
- << "</Request>\n\n\n";
- }
-
- if(mTuningSpeakerVolumeDirty)
- {
- stream
- << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.SetSpeakerLevel.1\">"
- << "<Level>" << mTuningSpeakerVolume << "</Level>"
- << "</Request>\n\n\n";
- }
-
- mTuningMicVolumeDirty = false;
- mTuningSpeakerVolumeDirty = false;
-
- if(!stream.str().empty())
- {
- writeString(stream.str());
- }
- }
- }
- break;
-
- //MARK: stateMicTuningStop
- case stateMicTuningStop:
- {
- // transition out of mic tuning
- tuningCaptureStopSendMessage();
-
- setState(mTuningExitState);
-
- // if we exited just to change devices, this will keep us from re-entering too fast.
- mUpdateTimer.start();
- mUpdateTimer.setTimerExpirySec(UPDATE_THROTTLE_SECONDS);
-
- }
- break;
-
- //MARK: stateConnectorStart
- case stateConnectorStart:
- if(!mVoiceEnabled)
- {
- // We were never logged in. This will shut down the connector.
- setState(stateLoggedOut);
- }
- else if(!mVoiceAccountServerURI.empty())
- {
- connectorCreate();
- }
- break;
-
- //MARK: stateConnectorStarting
- case stateConnectorStarting: // waiting for connector handle
- // connectorCreateResponse() will transition from here to stateConnectorStarted.
- break;
-
- //MARK: stateConnectorStarted
- case stateConnectorStarted: // connector handle received
- if(!mVoiceEnabled)
- {
- // We were never logged in. This will shut down the connector.
- setState(stateLoggedOut);
- }
- else
- {
- // The connector is started. Send a login message.
- setState(stateNeedsLogin);
- }
- break;
-
- //MARK: stateLoginRetry
- case stateLoginRetry:
- if(mLoginRetryCount == 0)
- {
- // First retry -- display a message to the user
- notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_LOGIN_RETRY);
- }
-
- mLoginRetryCount++;
-
- if(mLoginRetryCount > MAX_LOGIN_RETRIES)
- {
- LL_WARNS("Voice") << "too many login retries, giving up." << LL_ENDL;
- setState(stateLoginFailed);
- }
- else
- {
- LL_INFOS("Voice") << "will retry login in " << LOGIN_RETRY_SECONDS << " seconds." << LL_ENDL;
- mUpdateTimer.start();
- mUpdateTimer.setTimerExpirySec(LOGIN_RETRY_SECONDS);
- setState(stateLoginRetryWait);
- }
- break;
-
- //MARK: stateLoginRetryWait
- case stateLoginRetryWait:
- if(mUpdateTimer.hasExpired())
- {
- setState(stateNeedsLogin);
- }
- break;
-
- //MARK: stateNeedsLogin
- case stateNeedsLogin:
- if(!mAccountPassword.empty())
- {
- setState(stateLoggingIn);
- loginSendMessage();
- }
- break;
-
- //MARK: stateLoggingIn
- case stateLoggingIn: // waiting for account handle
- // loginResponse() will transition from here to stateLoggedIn.
- break;
-
- //MARK: stateLoggedIn
- case stateLoggedIn: // account handle received
-
- notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_LOGGED_IN);
-
- // request the current set of block rules (we'll need them when updating the friends list)
- accountListBlockRulesSendMessage();
-
- // request the current set of auto-accept rules
- accountListAutoAcceptRulesSendMessage();
-
- // Set up the mute list observer if it hasn't been set up already.
- if((!sMuteListListener_listening))
- {
- LLMuteList::getInstance()->addObserver(&mutelist_listener);
- sMuteListListener_listening = true;
- }
-
- // Set up the friends list observer if it hasn't been set up already.
- if(friendslist_listener == NULL)
- {
- friendslist_listener = new LLVoiceClientFriendsObserver;
- LLAvatarTracker::instance().addObserver(friendslist_listener);
- }
-
- // Set the initial state of mic mute, local speaker volume, etc.
- {
- std::ostringstream stream;
-
- buildLocalAudioUpdates(stream);
-
- if(!stream.str().empty())
- {
- writeString(stream.str());
- }
- }
-
-#if USE_SESSION_GROUPS
- // create the main session group
- sessionGroupCreateSendMessage();
-
- setState(stateCreatingSessionGroup);
-#else
- // Not using session groups -- skip the stateCreatingSessionGroup state.
- setState(stateNoChannel);
-
- // Initial kick-off of channel lookup logic
- parcelChanged();
-#endif
- break;
-
- //MARK: stateCreatingSessionGroup
- case stateCreatingSessionGroup:
- if(mSessionTerminateRequested || !mVoiceEnabled)
- {
- // TODO: Question: is this the right way out of this state
- setState(stateSessionTerminated);
- }
- else if(!mMainSessionGroupHandle.empty())
- {
- setState(stateNoChannel);
-
- // Start looped recording (needed for "panic button" anti-griefing tool)
- recordingLoopStart();
-
- // Initial kick-off of channel lookup logic
- parcelChanged();
- }
- break;
-
- //MARK: stateNoChannel
- case stateNoChannel:
- // Do this here as well as inside sendPositionalUpdate().
- // Otherwise, if you log in but don't join a proximal channel (such as when your login location has voice disabled), your friends list won't sync.
- sendFriendsListUpdates();
-
- if(mSessionTerminateRequested || !mVoiceEnabled)
- {
- // TODO: Question: Is this the right way out of this state?
- setState(stateSessionTerminated);
- }
- else if(mTuningMode)
- {
- mTuningExitState = stateNoChannel;
- setState(stateMicTuningStart);
- }
- else if(sessionNeedsRelog(mNextAudioSession))
- {
- requestRelog();
- setState(stateSessionTerminated);
- }
- else if(mNextAudioSession)
- {
- sessionState *oldSession = mAudioSession;
-
- mAudioSession = mNextAudioSession;
- if(!mAudioSession->mReconnect)
- {
- mNextAudioSession = NULL;
- }
-
- // The old session may now need to be deleted.
- reapSession(oldSession);
-
- if(!mAudioSession->mHandle.empty())
- {
- // Connect to a session by session handle
-
- sessionMediaConnectSendMessage(mAudioSession);
- }
- else
- {
- // Connect to a session by URI
- sessionCreateSendMessage(mAudioSession, true, false);
- }
-
- notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_JOINING);
- setState(stateJoiningSession);
- }
- else if(!mSpatialSessionURI.empty())
- {
- // If we're not headed elsewhere and have a spatial URI, return to spatial.
- switchChannel(mSpatialSessionURI, true, false, false, mSpatialSessionCredentials);
- }
- break;
-
- //MARK: stateJoiningSession
- case stateJoiningSession: // waiting for session handle
- // joinedAudioSession() will transition from here to stateSessionJoined.
- if(!mVoiceEnabled)
- {
- // User bailed out during connect -- jump straight to teardown.
- setState(stateSessionTerminated);
- }
- else if(mSessionTerminateRequested)
- {
- if(mAudioSession && !mAudioSession->mHandle.empty())
- {
- // Only allow direct exits from this state in p2p calls (for cancelling an invite).
- // Terminating a half-connected session on other types of calls seems to break something in the vivox gateway.
- if(mAudioSession->mIsP2P)
- {
- sessionMediaDisconnectSendMessage(mAudioSession);
- setState(stateSessionTerminated);
- }
- }
- }
- break;
-
- //MARK: stateSessionJoined
- case stateSessionJoined: // session handle received
- // It appears that I need to wait for BOTH the SessionGroup.AddSession response and the SessionStateChangeEvent with state 4
- // before continuing from this state. They can happen in either order, and if I don't wait for both, things can get stuck.
- // For now, the SessionGroup.AddSession response handler sets mSessionHandle and the SessionStateChangeEvent handler transitions to stateSessionJoined.
- // This is a cheap way to make sure both have happened before proceeding.
- if(mAudioSession && mAudioSession->mVoiceEnabled)
- {
- // Dirty state that may need to be sync'ed with the daemon.
- mPTTDirty = true;
- mSpeakerVolumeDirty = true;
- mSpatialCoordsDirty = true;
-
- setState(stateRunning);
-
- // Start the throttle timer
- mUpdateTimer.start();
- mUpdateTimer.setTimerExpirySec(UPDATE_THROTTLE_SECONDS);
-
- // Events that need to happen when a session is joined could go here.
- // Maybe send initial spatial data?
- notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_JOINED);
-
- }
- else if(!mVoiceEnabled)
- {
- // User bailed out during connect -- jump straight to teardown.
- setState(stateSessionTerminated);
- }
- else if(mSessionTerminateRequested)
- {
- // Only allow direct exits from this state in p2p calls (for cancelling an invite).
- // Terminating a half-connected session on other types of calls seems to break something in the vivox gateway.
- if(mAudioSession && mAudioSession->mIsP2P)
- {
- sessionMediaDisconnectSendMessage(mAudioSession);
- setState(stateSessionTerminated);
- }
- }
- break;
-
- //MARK: stateRunning
- case stateRunning: // steady state
- // Disabling voice or disconnect requested.
- if(!mVoiceEnabled || mSessionTerminateRequested)
- {
- leaveAudioSession();
- }
- else
- {
-
- // Figure out whether the PTT state needs to change
- {
- bool newPTT;
- if(mUsePTT)
- {
- // If configured to use PTT, track the user state.
- newPTT = mUserPTTState;
- }
- else
- {
- // If not configured to use PTT, it should always be true (otherwise the user will be unable to speak).
- newPTT = true;
- }
-
- if(mMuteMic)
- {
- // This always overrides any other PTT setting.
- newPTT = false;
- }
-
- // Dirty if state changed.
- if(newPTT != mPTT)
- {
- mPTT = newPTT;
- mPTTDirty = true;
- }
- }
-
- if(!inSpatialChannel())
- {
- // When in a non-spatial channel, never send positional updates.
- mSpatialCoordsDirty = false;
- }
- else
- {
- // Do the calculation that enforces the listener<->speaker tether (and also updates the real camera position)
- enforceTether();
- }
-
- // Send an update if the ptt state has changed (which shouldn't be able to happen that often -- the user can only click so fast)
- // or every 10hz, whichever is sooner.
- if((mAudioSession && mAudioSession->mVolumeDirty) || mPTTDirty || mSpeakerVolumeDirty || mUpdateTimer.hasExpired())
- {
- mUpdateTimer.setTimerExpirySec(UPDATE_THROTTLE_SECONDS);
- sendPositionalUpdate();
- }
- }
- break;
-
- //MARK: stateLeavingSession
- case stateLeavingSession: // waiting for terminate session response
- // The handler for the Session.Terminate response will transition from here to stateSessionTerminated.
- break;
-
- //MARK: stateSessionTerminated
- case stateSessionTerminated:
-
- // Must do this first, since it uses mAudioSession.
- notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_LEFT_CHANNEL);
-
- if(mAudioSession)
- {
- sessionState *oldSession = mAudioSession;
-
- mAudioSession = NULL;
- // We just notified status observers about this change. Don't do it again.
- mAudioSessionChanged = false;
-
- // The old session may now need to be deleted.
- reapSession(oldSession);
- }
- else
- {
- LL_WARNS("Voice") << "stateSessionTerminated with NULL mAudioSession" << LL_ENDL;
- }
-
- // Always reset the terminate request flag when we get here.
- mSessionTerminateRequested = false;
-
- if(mVoiceEnabled && !mRelogRequested)
- {
- // Just leaving a channel, go back to stateNoChannel (the "logged in but have no channel" state).
- setState(stateNoChannel);
- }
- else
- {
- // Shutting down voice, continue with disconnecting.
- logout();
-
- // The state machine will take it from here
- mRelogRequested = false;
- }
-
- break;
-
- //MARK: stateLoggingOut
- case stateLoggingOut: // waiting for logout response
- // The handler for the AccountLoginStateChangeEvent will transition from here to stateLoggedOut.
- break;
-
- //MARK: stateLoggedOut
- case stateLoggedOut: // logout response received
-
- // Once we're logged out, all these things are invalid.
- mAccountHandle.clear();
- deleteAllSessions();
- deleteAllBuddies();
-
- if(mVoiceEnabled && !mRelogRequested)
- {
- // User was logged out, but wants to be logged in. Send a new login request.
- setState(stateNeedsLogin);
- }
- else
- {
- // shut down the connector
- connectorShutdown();
- }
- break;
-
- //MARK: stateConnectorStopping
- case stateConnectorStopping: // waiting for connector stop
- // The handler for the Connector.InitiateShutdown response will transition from here to stateConnectorStopped.
- break;
-
- //MARK: stateConnectorStopped
- case stateConnectorStopped: // connector stop received
- setState(stateDisableCleanup);
- break;
-
- //MARK: stateConnectorFailed
- case stateConnectorFailed:
- setState(stateConnectorFailedWaiting);
- break;
- //MARK: stateConnectorFailedWaiting
- case stateConnectorFailedWaiting:
- if(!mVoiceEnabled)
- {
- setState(stateDisableCleanup);
- }
- break;
-
- //MARK: stateLoginFailed
- case stateLoginFailed:
- setState(stateLoginFailedWaiting);
- break;
- //MARK: stateLoginFailedWaiting
- case stateLoginFailedWaiting:
- if(!mVoiceEnabled)
- {
- setState(stateDisableCleanup);
- }
- break;
-
- //MARK: stateJoinSessionFailed
- case stateJoinSessionFailed:
- // Transition to error state. Send out any notifications here.
- if(mAudioSession)
- {
- LL_WARNS("Voice") << "stateJoinSessionFailed: (" << mAudioSession->mErrorStatusCode << "): " << mAudioSession->mErrorStatusString << LL_ENDL;
- }
- else
- {
- LL_WARNS("Voice") << "stateJoinSessionFailed with no current session" << LL_ENDL;
- }
-
- notifyStatusObservers(LLVoiceClientStatusObserver::ERROR_UNKNOWN);
- setState(stateJoinSessionFailedWaiting);
- break;
-
- //MARK: stateJoinSessionFailedWaiting
- case stateJoinSessionFailedWaiting:
- // Joining a channel failed, either due to a failed channel name -> sip url lookup or an error from the join message.
- // Region crossings may leave this state and try the join again.
- if(mSessionTerminateRequested)
- {
- setState(stateSessionTerminated);
- }
- break;
-
- //MARK: stateJail
- case stateJail:
- // We have given up. Do nothing.
- break;
-
- }
-
- if(mAudioSession && mAudioSession->mParticipantsChanged)
- {
- mAudioSession->mParticipantsChanged = false;
- mAudioSessionChanged = true;
- }
-
- if(mAudioSessionChanged)
- {
- mAudioSessionChanged = false;
- notifyParticipantObservers();
- }
-}
-
-void LLVoiceClient::closeSocket(void)
-{
- mSocket.reset();
- mConnected = false;
-}
-
-void LLVoiceClient::loginSendMessage()
-{
- std::ostringstream stream;
-
- bool autoPostCrashDumps = gSavedSettings.getBOOL("VivoxAutoPostCrashDumps");
-
- stream
- << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.Login.1\">"
- << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>"
- << "<AccountName>" << mAccountName << "</AccountName>"
- << "<AccountPassword>" << mAccountPassword << "</AccountPassword>"
- << "<AudioSessionAnswerMode>VerifyAnswer</AudioSessionAnswerMode>"
- << "<EnableBuddiesAndPresence>true</EnableBuddiesAndPresence>"
- << "<BuddyManagementMode>Application</BuddyManagementMode>"
- << "<ParticipantPropertyFrequency>5</ParticipantPropertyFrequency>"
- << (autoPostCrashDumps?"<AutopostCrashDumps>true</AutopostCrashDumps>":"")
- << "</Request>\n\n\n";
-
- writeString(stream.str());
-}
-
-void LLVoiceClient::logout()
-{
- // Ensure that we'll re-request provisioning before logging in again
- mAccountPassword.clear();
- mVoiceAccountServerURI.clear();
-
- setState(stateLoggingOut);
- logoutSendMessage();
-}
-
-void LLVoiceClient::logoutSendMessage()
-{
- if(!mAccountHandle.empty())
- {
- std::ostringstream stream;
- stream
- << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.Logout.1\">"
- << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
- << "</Request>"
- << "\n\n\n";
-
- mAccountHandle.clear();
- writeString(stream.str());
- }
-}
-void LLVoiceClient::accountListBlockRulesSendMessage()
-{
- if(!mAccountHandle.empty())
- {
- std::ostringstream stream;
-
- LL_DEBUGS("Voice") << "requesting block rules" << LL_ENDL;
-
- stream
- << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.ListBlockRules.1\">"
- << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
- << "</Request>"
- << "\n\n\n";
-
- writeString(stream.str());
- }
-}
-
-void LLVoiceClient::accountListAutoAcceptRulesSendMessage()
-{
- if(!mAccountHandle.empty())
- {
- std::ostringstream stream;
-
- LL_DEBUGS("Voice") << "requesting auto-accept rules" << LL_ENDL;
-
- stream
- << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.ListAutoAcceptRules.1\">"
- << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
- << "</Request>"
- << "\n\n\n";
-
- writeString(stream.str());
- }
-}
-
-void LLVoiceClient::sessionGroupCreateSendMessage()
-{
- if(!mAccountHandle.empty())
- {
- std::ostringstream stream;
-
- LL_DEBUGS("Voice") << "creating session group" << LL_ENDL;
-
- stream
- << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"SessionGroup.Create.1\">"
- << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
- << "<Type>Normal</Type>"
- << "</Request>"
- << "\n\n\n";
-
- writeString(stream.str());
- }
-}
-
-void LLVoiceClient::sessionCreateSendMessage(sessionState *session, bool startAudio, bool startText)
-{
- LL_DEBUGS("Voice") << "requesting create: " << session->mSIPURI << LL_ENDL;
-
- session->mCreateInProgress = true;
- if(startAudio)
- {
- session->mMediaConnectInProgress = true;
- }
-
- std::ostringstream stream;
- stream
- << "<Request requestId=\"" << session->mSIPURI << "\" action=\"Session.Create.1\">"
- << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
- << "<URI>" << session->mSIPURI << "</URI>";
-
- static const std::string allowed_chars =
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
- "0123456789"
- "-._~";
-
- if(!session->mHash.empty())
- {
- stream
- << "<Password>" << LLURI::escape(session->mHash, allowed_chars) << "</Password>"
- << "<PasswordHashAlgorithm>SHA1UserName</PasswordHashAlgorithm>";
- }
-
- stream
- << "<ConnectAudio>" << (startAudio?"true":"false") << "</ConnectAudio>"
- << "<ConnectText>" << (startText?"true":"false") << "</ConnectText>"
- << "<Name>" << mChannelName << "</Name>"
- << "</Request>\n\n\n";
- writeString(stream.str());
-}
-
-void LLVoiceClient::sessionGroupAddSessionSendMessage(sessionState *session, bool startAudio, bool startText)
-{
- LL_DEBUGS("Voice") << "requesting create: " << session->mSIPURI << LL_ENDL;
-
- session->mCreateInProgress = true;
- if(startAudio)
- {
- session->mMediaConnectInProgress = true;
- }
-
- std::string password;
- if(!session->mHash.empty())
- {
- static const std::string allowed_chars =
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
- "0123456789"
- "-._~"
- ;
- password = LLURI::escape(session->mHash, allowed_chars);
- }
-
- std::ostringstream stream;
- stream
- << "<Request requestId=\"" << session->mSIPURI << "\" action=\"SessionGroup.AddSession.1\">"
- << "<SessionGroupHandle>" << session->mGroupHandle << "</SessionGroupHandle>"
- << "<URI>" << session->mSIPURI << "</URI>"
- << "<Name>" << mChannelName << "</Name>"
- << "<ConnectAudio>" << (startAudio?"true":"false") << "</ConnectAudio>"
- << "<ConnectText>" << (startText?"true":"false") << "</ConnectText>"
- << "<Password>" << password << "</Password>"
- << "<PasswordHashAlgorithm>SHA1UserName</PasswordHashAlgorithm>"
- << "</Request>\n\n\n"
- ;
-
- writeString(stream.str());
-}
+///////////////////////////////////////////////////////////////////////////////////////////////
-void LLVoiceClient::sessionMediaConnectSendMessage(sessionState *session)
+LLVoiceClient::LLVoiceClient()
+ :
+ mVoiceModule(NULL),
+ m_servicePump(NULL),
+ mVoiceEffectEnabled(LLCachedControl<bool>(gSavedSettings, "VoiceMorphingEnabled")),
+ mVoiceEffectDefault(LLCachedControl<std::string>(gSavedPerAccountSettings, "VoiceEffectDefault"))
{
- LL_DEBUGS("Voice") << "connecting audio to session handle: " << session->mHandle << LL_ENDL;
-
- session->mMediaConnectInProgress = true;
-
- std::ostringstream stream;
-
- stream
- << "<Request requestId=\"" << session->mHandle << "\" action=\"Session.MediaConnect.1\">"
- << "<SessionGroupHandle>" << session->mGroupHandle << "</SessionGroupHandle>"
- << "<SessionHandle>" << session->mHandle << "</SessionHandle>"
- << "<Media>Audio</Media>"
- << "</Request>\n\n\n";
-
- writeString(stream.str());
}
-void LLVoiceClient::sessionTextConnectSendMessage(sessionState *session)
-{
- LL_DEBUGS("Voice") << "connecting text to session handle: " << session->mHandle << LL_ENDL;
-
- std::ostringstream stream;
-
- stream
- << "<Request requestId=\"" << session->mHandle << "\" action=\"Session.TextConnect.1\">"
- << "<SessionGroupHandle>" << session->mGroupHandle << "</SessionGroupHandle>"
- << "<SessionHandle>" << session->mHandle << "</SessionHandle>"
- << "</Request>\n\n\n";
-
- writeString(stream.str());
-}
+//---------------------------------------------------
+// Basic setup/shutdown
-void LLVoiceClient::sessionTerminate()
+LLVoiceClient::~LLVoiceClient()
{
- mSessionTerminateRequested = true;
}
-void LLVoiceClient::requestRelog()
+void LLVoiceClient::init(LLPumpIO *pump)
{
- mSessionTerminateRequested = true;
- mRelogRequested = true;
+ // Initialize all of the voice modules
+ m_servicePump = pump;
}
-
-void LLVoiceClient::leaveAudioSession()
+void LLVoiceClient::userAuthorized(const std::string& user_id, const LLUUID &agentID)
{
- if(mAudioSession)
+ // In the future, we should change this to allow voice module registration
+ // with a table lookup of sorts.
+ std::string voice_server = gSavedSettings.getString("VoiceServerType");
+ LL_DEBUGS("Voice") << "voice server type " << voice_server << LL_ENDL;
+ if(voice_server == "vivox")
{
- LL_DEBUGS("Voice") << "leaving session: " << mAudioSession->mSIPURI << LL_ENDL;
-
- switch(getState())
- {
- case stateNoChannel:
- // In this case, we want to pretend the join failed so our state machine doesn't get stuck.
- // Skip the join failed transition state so we don't send out error notifications.
- setState(stateJoinSessionFailedWaiting);
- break;
- case stateJoiningSession:
- case stateSessionJoined:
- case stateRunning:
- if(!mAudioSession->mHandle.empty())
- {
-
-#if RECORD_EVERYTHING
- // HACK: for testing only
- // Save looped recording
- std::string savepath("/tmp/vivoxrecording");
- {
- time_t now = time(NULL);
- const size_t BUF_SIZE = 64;
- char time_str[BUF_SIZE]; /* Flawfinder: ignore */
-
- strftime(time_str, BUF_SIZE, "%Y-%m-%dT%H:%M:%SZ", gmtime(&now));
- savepath += time_str;
- }
- recordingLoopSave(savepath);
-#endif
-
- sessionMediaDisconnectSendMessage(mAudioSession);
- setState(stateLeavingSession);
- }
- else
- {
- LL_WARNS("Voice") << "called with no session handle" << LL_ENDL;
- setState(stateSessionTerminated);
- }
- break;
- case stateJoinSessionFailed:
- case stateJoinSessionFailedWaiting:
- setState(stateSessionTerminated);
- break;
-
- default:
- LL_WARNS("Voice") << "called from unknown state" << LL_ENDL;
- break;
- }
+ mVoiceModule = (LLVoiceModuleInterface *)LLVivoxVoiceClient::getInstance();
}
else
{
- LL_WARNS("Voice") << "called with no active session" << LL_ENDL;
- setState(stateSessionTerminated);
+ mVoiceModule = NULL;
+ return;
}
+ mVoiceModule->init(m_servicePump);
+ mVoiceModule->userAuthorized(user_id, agentID);
}
-void LLVoiceClient::sessionTerminateSendMessage(sessionState *session)
-{
- std::ostringstream stream;
-
- LL_DEBUGS("Voice") << "Sending Session.Terminate with handle " << session->mHandle << LL_ENDL;
- stream
- << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.Terminate.1\">"
- << "<SessionHandle>" << session->mHandle << "</SessionHandle>"
- << "</Request>\n\n\n";
-
- writeString(stream.str());
-}
-void LLVoiceClient::sessionGroupTerminateSendMessage(sessionState *session)
-{
- std::ostringstream stream;
-
- LL_DEBUGS("Voice") << "Sending SessionGroup.Terminate with handle " << session->mGroupHandle << LL_ENDL;
- stream
- << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"SessionGroup.Terminate.1\">"
- << "<SessionGroupHandle>" << session->mGroupHandle << "</SessionGroupHandle>"
- << "</Request>\n\n\n";
-
- writeString(stream.str());
-}
-
-void LLVoiceClient::sessionMediaDisconnectSendMessage(sessionState *session)
-{
- std::ostringstream stream;
-
- LL_DEBUGS("Voice") << "Sending Session.MediaDisconnect with handle " << session->mHandle << LL_ENDL;
- stream
- << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.MediaDisconnect.1\">"
- << "<SessionGroupHandle>" << session->mGroupHandle << "</SessionGroupHandle>"
- << "<SessionHandle>" << session->mHandle << "</SessionHandle>"
- << "<Media>Audio</Media>"
- << "</Request>\n\n\n";
-
- writeString(stream.str());
-
-}
-
-void LLVoiceClient::sessionTextDisconnectSendMessage(sessionState *session)
-{
- std::ostringstream stream;
-
- LL_DEBUGS("Voice") << "Sending Session.TextDisconnect with handle " << session->mHandle << LL_ENDL;
- stream
- << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.TextDisconnect.1\">"
- << "<SessionGroupHandle>" << session->mGroupHandle << "</SessionGroupHandle>"
- << "<SessionHandle>" << session->mHandle << "</SessionHandle>"
- << "</Request>\n\n\n";
-
- writeString(stream.str());
-}
-
-void LLVoiceClient::getCaptureDevicesSendMessage()
-{
- std::ostringstream stream;
- stream
- << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.GetCaptureDevices.1\">"
- << "</Request>\n\n\n";
-
- writeString(stream.str());
-}
-
-void LLVoiceClient::getRenderDevicesSendMessage()
-{
- std::ostringstream stream;
- stream
- << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.GetRenderDevices.1\">"
- << "</Request>\n\n\n";
-
- writeString(stream.str());
-}
-
-void LLVoiceClient::clearCaptureDevices()
-{
- LL_DEBUGS("Voice") << "called" << LL_ENDL;
- mCaptureDevices.clear();
-}
-
-void LLVoiceClient::addCaptureDevice(const std::string& name)
-{
- LL_DEBUGS("Voice") << name << LL_ENDL;
-
- mCaptureDevices.push_back(name);
-}
-
-LLVoiceClient::deviceList *LLVoiceClient::getCaptureDevices()
+void LLVoiceClient::terminate()
{
- return &mCaptureDevices;
+ if (mVoiceModule) mVoiceModule->terminate();
+ mVoiceModule = NULL;
}
-void LLVoiceClient::setCaptureDevice(const std::string& name)
+const LLVoiceVersionInfo LLVoiceClient::getVersion()
{
- if(name == "Default")
+ if (mVoiceModule)
{
- if(!mCaptureDevice.empty())
- {
- mCaptureDevice.clear();
- mCaptureDeviceDirty = true;
- }
+ return mVoiceModule->getVersion();
}
else
{
- if(mCaptureDevice != name)
- {
- mCaptureDevice = name;
- mCaptureDeviceDirty = true;
- }
+ LLVoiceVersionInfo result;
+ result.serverVersion = std::string();
+ result.serverType = std::string();
+ return result;
}
}
-void LLVoiceClient::clearRenderDevices()
-{
- LL_DEBUGS("Voice") << "called" << LL_ENDL;
- mRenderDevices.clear();
-}
-
-void LLVoiceClient::addRenderDevice(const std::string& name)
-{
- LL_DEBUGS("Voice") << name << LL_ENDL;
- mRenderDevices.push_back(name);
-}
-
-LLVoiceClient::deviceList *LLVoiceClient::getRenderDevices()
+void LLVoiceClient::updateSettings()
{
- return &mRenderDevices;
+ if (mVoiceModule) mVoiceModule->updateSettings();
}
-void LLVoiceClient::setRenderDevice(const std::string& name)
-{
- if(name == "Default")
- {
- if(!mRenderDevice.empty())
- {
- mRenderDevice.clear();
- mRenderDeviceDirty = true;
- }
- }
- else
- {
- if(mRenderDevice != name)
- {
- mRenderDevice = name;
- mRenderDeviceDirty = true;
- }
- }
-
-}
+//--------------------------------------------------
+// tuning
void LLVoiceClient::tuningStart()
{
- mTuningMode = true;
- if(getState() >= stateNoChannel)
- {
- sessionTerminate();
- }
+ if (mVoiceModule) mVoiceModule->tuningStart();
}
void LLVoiceClient::tuningStop()
{
- mTuningMode = false;
+ if (mVoiceModule) mVoiceModule->tuningStop();
}
bool LLVoiceClient::inTuningMode()
{
- bool result = false;
- switch(getState())
- {
- case stateMicTuningRunning:
- result = true;
- break;
- default:
- break;
- }
- return result;
-}
-
-void LLVoiceClient::tuningRenderStartSendMessage(const std::string& name, bool loop)
-{
- mTuningAudioFile = name;
- std::ostringstream stream;
- stream
- << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.RenderAudioStart.1\">"
- << "<SoundFilePath>" << mTuningAudioFile << "</SoundFilePath>"
- << "<Loop>" << (loop?"1":"0") << "</Loop>"
- << "</Request>\n\n\n";
-
- writeString(stream.str());
-}
-
-void LLVoiceClient::tuningRenderStopSendMessage()
-{
- std::ostringstream stream;
- stream
- << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.RenderAudioStop.1\">"
- << "<SoundFilePath>" << mTuningAudioFile << "</SoundFilePath>"
- << "</Request>\n\n\n";
-
- writeString(stream.str());
-}
-
-void LLVoiceClient::tuningCaptureStartSendMessage(int duration)
-{
- LL_DEBUGS("Voice") << "sending CaptureAudioStart" << LL_ENDL;
-
- std::ostringstream stream;
- stream
- << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.CaptureAudioStart.1\">"
- << "<Duration>" << duration << "</Duration>"
- << "</Request>\n\n\n";
-
- writeString(stream.str());
-}
-
-void LLVoiceClient::tuningCaptureStopSendMessage()
-{
- LL_DEBUGS("Voice") << "sending CaptureAudioStop" << LL_ENDL;
-
- std::ostringstream stream;
- stream
- << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.CaptureAudioStop.1\">"
- << "</Request>\n\n\n";
-
- writeString(stream.str());
-
- mTuningEnergy = 0.0f;
-}
-
-void LLVoiceClient::tuningSetMicVolume(float volume)
-{
- int scaled_volume = scale_mic_volume(volume);
-
- if(scaled_volume != mTuningMicVolume)
- {
- mTuningMicVolume = scaled_volume;
- mTuningMicVolumeDirty = true;
- }
-}
-
-void LLVoiceClient::tuningSetSpeakerVolume(float volume)
-{
- int scaled_volume = scale_speaker_volume(volume);
-
- if(scaled_volume != mTuningSpeakerVolume)
+ if (mVoiceModule)
{
- mTuningSpeakerVolume = scaled_volume;
- mTuningSpeakerVolumeDirty = true;
+ return mVoiceModule->inTuningMode();
}
-}
-
-float LLVoiceClient::tuningGetEnergy(void)
-{
- return mTuningEnergy;
-}
-
-bool LLVoiceClient::deviceSettingsAvailable()
-{
- bool result = true;
-
- if(!mConnected)
- result = false;
-
- if(mRenderDevices.empty())
- result = false;
-
- return result;
-}
-
-void LLVoiceClient::refreshDeviceLists(bool clearCurrentList)
-{
- if(clearCurrentList)
- {
- clearCaptureDevices();
- clearRenderDevices();
- }
- getCaptureDevicesSendMessage();
- getRenderDevicesSendMessage();
-}
-
-void LLVoiceClient::daemonDied()
-{
- // The daemon died, so the connection is gone. Reset everything and start over.
- LL_WARNS("Voice") << "Connection to vivox daemon lost. Resetting state."<< LL_ENDL;
-
- // Try to relaunch the daemon
- setState(stateDisableCleanup);
-}
-
-void LLVoiceClient::giveUp()
-{
- // All has failed. Clean up and stop trying.
- closeSocket();
- deleteAllSessions();
- deleteAllBuddies();
-
- setState(stateJail);
-}
-
-static void oldSDKTransform (LLVector3 &left, LLVector3 &up, LLVector3 &at, LLVector3d &pos, LLVector3 &vel)
-{
- F32 nat[3], nup[3], nl[3], nvel[3]; // the new at, up, left vectors and the new position and velocity
- F64 npos[3];
-
- // The original XML command was sent like this:
- /*
- << "<Position>"
- << "<X>" << pos[VX] << "</X>"
- << "<Y>" << pos[VZ] << "</Y>"
- << "<Z>" << pos[VY] << "</Z>"
- << "</Position>"
- << "<Velocity>"
- << "<X>" << mAvatarVelocity[VX] << "</X>"
- << "<Y>" << mAvatarVelocity[VZ] << "</Y>"
- << "<Z>" << mAvatarVelocity[VY] << "</Z>"
- << "</Velocity>"
- << "<AtOrientation>"
- << "<X>" << l.mV[VX] << "</X>"
- << "<Y>" << u.mV[VX] << "</Y>"
- << "<Z>" << a.mV[VX] << "</Z>"
- << "</AtOrientation>"
- << "<UpOrientation>"
- << "<X>" << l.mV[VZ] << "</X>"
- << "<Y>" << u.mV[VY] << "</Y>"
- << "<Z>" << a.mV[VZ] << "</Z>"
- << "</UpOrientation>"
- << "<LeftOrientation>"
- << "<X>" << l.mV [VY] << "</X>"
- << "<Y>" << u.mV [VZ] << "</Y>"
- << "<Z>" << a.mV [VY] << "</Z>"
- << "</LeftOrientation>";
- */
-
-#if 1
- // This was the original transform done when building the XML command
- nat[0] = left.mV[VX];
- nat[1] = up.mV[VX];
- nat[2] = at.mV[VX];
-
- nup[0] = left.mV[VZ];
- nup[1] = up.mV[VY];
- nup[2] = at.mV[VZ];
-
- nl[0] = left.mV[VY];
- nl[1] = up.mV[VZ];
- nl[2] = at.mV[VY];
-
- npos[0] = pos.mdV[VX];
- npos[1] = pos.mdV[VZ];
- npos[2] = pos.mdV[VY];
-
- nvel[0] = vel.mV[VX];
- nvel[1] = vel.mV[VZ];
- nvel[2] = vel.mV[VY];
-
- for(int i=0;i<3;++i) {
- at.mV[i] = nat[i];
- up.mV[i] = nup[i];
- left.mV[i] = nl[i];
- pos.mdV[i] = npos[i];
- }
-
- // This was the original transform done in the SDK
- nat[0] = at.mV[2];
- nat[1] = 0; // y component of at vector is always 0, this was up[2]
- nat[2] = -1 * left.mV[2];
-
- // We override whatever the application gives us
- nup[0] = 0; // x component of up vector is always 0
- nup[1] = 1; // y component of up vector is always 1
- nup[2] = 0; // z component of up vector is always 0
-
- nl[0] = at.mV[0];
- nl[1] = 0; // y component of left vector is always zero, this was up[0]
- nl[2] = -1 * left.mV[0];
-
- npos[2] = pos.mdV[2] * -1.0;
- npos[1] = pos.mdV[1];
- npos[0] = pos.mdV[0];
-
- for(int i=0;i<3;++i) {
- at.mV[i] = nat[i];
- up.mV[i] = nup[i];
- left.mV[i] = nl[i];
- pos.mdV[i] = npos[i];
- }
-#else
- // This is the compose of the two transforms (at least, that's what I'm trying for)
- nat[0] = at.mV[VX];
- nat[1] = 0; // y component of at vector is always 0, this was up[2]
- nat[2] = -1 * up.mV[VZ];
-
- // We override whatever the application gives us
- nup[0] = 0; // x component of up vector is always 0
- nup[1] = 1; // y component of up vector is always 1
- nup[2] = 0; // z component of up vector is always 0
-
- nl[0] = left.mV[VX];
- nl[1] = 0; // y component of left vector is always zero, this was up[0]
- nl[2] = -1 * left.mV[VY];
-
- npos[0] = pos.mdV[VX];
- npos[1] = pos.mdV[VZ];
- npos[2] = pos.mdV[VY] * -1.0;
-
- nvel[0] = vel.mV[VX];
- nvel[1] = vel.mV[VZ];
- nvel[2] = vel.mV[VY];
-
- for(int i=0;i<3;++i) {
- at.mV[i] = nat[i];
- up.mV[i] = nup[i];
- left.mV[i] = nl[i];
- pos.mdV[i] = npos[i];
- }
-
-#endif
-}
-
-void LLVoiceClient::sendPositionalUpdate(void)
-{
- std::ostringstream stream;
-
- if(mSpatialCoordsDirty)
- {
- LLVector3 l, u, a, vel;
- LLVector3d pos;
-
- mSpatialCoordsDirty = false;
-
- // Always send both speaker and listener positions together.
- stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.Set3DPosition.1\">"
- << "<SessionHandle>" << getAudioSessionHandle() << "</SessionHandle>";
-
- stream << "<SpeakerPosition>";
-
-// LL_DEBUGS("Voice") << "Sending speaker position " << mAvatarPosition << LL_ENDL;
- l = mAvatarRot.getLeftRow();
- u = mAvatarRot.getUpRow();
- a = mAvatarRot.getFwdRow();
- pos = mAvatarPosition;
- vel = mAvatarVelocity;
-
- // SLIM SDK: the old SDK was doing a transform on the passed coordinates that the new one doesn't do anymore.
- // The old transform is replicated by this function.
- oldSDKTransform(l, u, a, pos, vel);
-
- stream
- << "<Position>"
- << "<X>" << pos.mdV[VX] << "</X>"
- << "<Y>" << pos.mdV[VY] << "</Y>"
- << "<Z>" << pos.mdV[VZ] << "</Z>"
- << "</Position>"
- << "<Velocity>"
- << "<X>" << vel.mV[VX] << "</X>"
- << "<Y>" << vel.mV[VY] << "</Y>"
- << "<Z>" << vel.mV[VZ] << "</Z>"
- << "</Velocity>"
- << "<AtOrientation>"
- << "<X>" << a.mV[VX] << "</X>"
- << "<Y>" << a.mV[VY] << "</Y>"
- << "<Z>" << a.mV[VZ] << "</Z>"
- << "</AtOrientation>"
- << "<UpOrientation>"
- << "<X>" << u.mV[VX] << "</X>"
- << "<Y>" << u.mV[VY] << "</Y>"
- << "<Z>" << u.mV[VZ] << "</Z>"
- << "</UpOrientation>"
- << "<LeftOrientation>"
- << "<X>" << l.mV [VX] << "</X>"
- << "<Y>" << l.mV [VY] << "</Y>"
- << "<Z>" << l.mV [VZ] << "</Z>"
- << "</LeftOrientation>";
-
- stream << "</SpeakerPosition>";
-
- stream << "<ListenerPosition>";
-
- LLVector3d earPosition;
- LLVector3 earVelocity;
- LLMatrix3 earRot;
-
- switch(mEarLocation)
- {
- case earLocCamera:
- default:
- earPosition = mCameraPosition;
- earVelocity = mCameraVelocity;
- earRot = mCameraRot;
- break;
-
- case earLocAvatar:
- earPosition = mAvatarPosition;
- earVelocity = mAvatarVelocity;
- earRot = mAvatarRot;
- break;
-
- case earLocMixed:
- earPosition = mAvatarPosition;
- earVelocity = mAvatarVelocity;
- earRot = mCameraRot;
- break;
- }
-
- l = earRot.getLeftRow();
- u = earRot.getUpRow();
- a = earRot.getFwdRow();
- pos = earPosition;
- vel = earVelocity;
-
-// LL_DEBUGS("Voice") << "Sending listener position " << earPosition << LL_ENDL;
-
- oldSDKTransform(l, u, a, pos, vel);
-
- stream
- << "<Position>"
- << "<X>" << pos.mdV[VX] << "</X>"
- << "<Y>" << pos.mdV[VY] << "</Y>"
- << "<Z>" << pos.mdV[VZ] << "</Z>"
- << "</Position>"
- << "<Velocity>"
- << "<X>" << vel.mV[VX] << "</X>"
- << "<Y>" << vel.mV[VY] << "</Y>"
- << "<Z>" << vel.mV[VZ] << "</Z>"
- << "</Velocity>"
- << "<AtOrientation>"
- << "<X>" << a.mV[VX] << "</X>"
- << "<Y>" << a.mV[VY] << "</Y>"
- << "<Z>" << a.mV[VZ] << "</Z>"
- << "</AtOrientation>"
- << "<UpOrientation>"
- << "<X>" << u.mV[VX] << "</X>"
- << "<Y>" << u.mV[VY] << "</Y>"
- << "<Z>" << u.mV[VZ] << "</Z>"
- << "</UpOrientation>"
- << "<LeftOrientation>"
- << "<X>" << l.mV [VX] << "</X>"
- << "<Y>" << l.mV [VY] << "</Y>"
- << "<Z>" << l.mV [VZ] << "</Z>"
- << "</LeftOrientation>";
-
-
- stream << "</ListenerPosition>";
-
- stream << "</Request>\n\n\n";
- }
-
- if(mAudioSession && mAudioSession->mVolumeDirty)
- {
- participantMap::iterator iter = mAudioSession->mParticipantsByURI.begin();
-
- mAudioSession->mVolumeDirty = false;
-
- for(; iter != mAudioSession->mParticipantsByURI.end(); iter++)
- {
- participantState *p = iter->second;
-
- if(p->mVolumeDirty)
- {
- // Can't set volume/mute for yourself
- if(!p->mIsSelf)
- {
- int volume = 56; // nominal default value
- bool mute = p->mOnMuteList;
-
- if(p->mUserVolume != -1)
- {
- // scale from user volume in the range 0-400 (with 100 as "normal") to vivox volume in the range 0-100 (with 56 as "normal")
- if(p->mUserVolume < 100)
- volume = (p->mUserVolume * 56) / 100;
- else
- volume = (((p->mUserVolume - 100) * (100 - 56)) / 300) + 56;
- }
- else if(p->mVolume != -1)
- {
- // Use the previously reported internal volume (comes in with a ParticipantUpdatedEvent)
- volume = p->mVolume;
- }
-
-
- if(mute)
- {
- // SetParticipantMuteForMe doesn't work in p2p sessions.
- // If we want the user to be muted, set their volume to 0 as well.
- // This isn't perfect, but it will at least reduce their volume to a minimum.
- volume = 0;
- }
-
- if(volume == 0)
- mute = true;
-
- LL_DEBUGS("Voice") << "Setting volume/mute for avatar " << p->mAvatarID << " to " << volume << (mute?"/true":"/false") << LL_ENDL;
-
- // SLIM SDK: Send both volume and mute commands.
-
- // Send a "volume for me" command for the user.
- stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.SetParticipantVolumeForMe.1\">"
- << "<SessionHandle>" << getAudioSessionHandle() << "</SessionHandle>"
- << "<ParticipantURI>" << p->mURI << "</ParticipantURI>"
- << "<Volume>" << volume << "</Volume>"
- << "</Request>\n\n\n";
-
- if(!mAudioSession->mIsP2P)
- {
- // Send a "mute for me" command for the user
- // Doesn't work in P2P sessions
- stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.SetParticipantMuteForMe.1\">"
- << "<SessionHandle>" << getAudioSessionHandle() << "</SessionHandle>"
- << "<ParticipantURI>" << p->mURI << "</ParticipantURI>"
- << "<Mute>" << (mute?"1":"0") << "</Mute>"
- << "<Scope>Audio</Scope>"
- << "</Request>\n\n\n";
- }
- }
-
- p->mVolumeDirty = false;
- }
- }
- }
-
- buildLocalAudioUpdates(stream);
-
- if(!stream.str().empty())
+ else
{
- writeString(stream.str());
+ return false;
}
-
- // Friends list updates can be huge, especially on the first voice login of an account with lots of friends.
- // Batching them all together can choke SLVoice, so send them in separate writes.
- sendFriendsListUpdates();
}
-void LLVoiceClient::buildSetCaptureDevice(std::ostringstream &stream)
+void LLVoiceClient::tuningSetMicVolume(float volume)
{
- if(mCaptureDeviceDirty)
- {
- LL_DEBUGS("Voice") << "Setting input device = \"" << mCaptureDevice << "\"" << LL_ENDL;
-
- stream
- << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.SetCaptureDevice.1\">"
- << "<CaptureDeviceSpecifier>" << mCaptureDevice << "</CaptureDeviceSpecifier>"
- << "</Request>"
- << "\n\n\n";
-
- mCaptureDeviceDirty = false;
- }
+ if (mVoiceModule) mVoiceModule->tuningSetMicVolume(volume);
}
-void LLVoiceClient::buildSetRenderDevice(std::ostringstream &stream)
+void LLVoiceClient::tuningSetSpeakerVolume(float volume)
{
- if(mRenderDeviceDirty)
- {
- LL_DEBUGS("Voice") << "Setting output device = \"" << mRenderDevice << "\"" << LL_ENDL;
-
- stream
- << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.SetRenderDevice.1\">"
- << "<RenderDeviceSpecifier>" << mRenderDevice << "</RenderDeviceSpecifier>"
- << "</Request>"
- << "\n\n\n";
- mRenderDeviceDirty = false;
- }
+ if (mVoiceModule) mVoiceModule->tuningSetSpeakerVolume(volume);
}
-void LLVoiceClient::buildLocalAudioUpdates(std::ostringstream &stream)
-{
- buildSetCaptureDevice(stream);
-
- buildSetRenderDevice(stream);
-
- if(mPTTDirty)
- {
- mPTTDirty = false;
-
- // Send a local mute command.
- // NOTE that the state of "PTT" is the inverse of "local mute".
- // (i.e. when PTT is true, we send a mute command with "false", and vice versa)
-
- LL_DEBUGS("Voice") << "Sending MuteLocalMic command with parameter " << (mPTT?"false":"true") << LL_ENDL;
-
- stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalMic.1\">"
- << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>"
- << "<Value>" << (mPTT?"false":"true") << "</Value>"
- << "</Request>\n\n\n";
-
- }
-
- if(mSpeakerMuteDirty)
- {
- const char *muteval = ((mSpeakerVolume <= scale_speaker_volume(0))?"true":"false");
-
- mSpeakerMuteDirty = false;
-
- LL_INFOS("Voice") << "Setting speaker mute to " << muteval << LL_ENDL;
-
- stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalSpeaker.1\">"
- << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>"
- << "<Value>" << muteval << "</Value>"
- << "</Request>\n\n\n";
-
- }
-
- if(mSpeakerVolumeDirty)
- {
- mSpeakerVolumeDirty = false;
-
- LL_INFOS("Voice") << "Setting speaker volume to " << mSpeakerVolume << LL_ENDL;
-
- stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.SetLocalSpeakerVolume.1\">"
- << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>"
- << "<Value>" << mSpeakerVolume << "</Value>"
- << "</Request>\n\n\n";
-
- }
-
- if(mMicVolumeDirty)
- {
- mMicVolumeDirty = false;
-
- LL_INFOS("Voice") << "Setting mic volume to " << mMicVolume << LL_ENDL;
-
- stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.SetLocalMicVolume.1\">"
- << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>"
- << "<Value>" << mMicVolume << "</Value>"
- << "</Request>\n\n\n";
- }
-
-
-}
-
-void LLVoiceClient::checkFriend(const LLUUID& id)
+float LLVoiceClient::tuningGetEnergy(void)
{
- std::string name;
- buddyListEntry *buddy = findBuddy(id);
-
- // Make sure we don't add a name before it's been looked up.
- if(gCacheName->getFullName(id, name))
+ if (mVoiceModule)
{
-
- const LLRelationship* relationInfo = LLAvatarTracker::instance().getBuddyInfo(id);
- bool canSeeMeOnline = false;
- if(relationInfo && relationInfo->isRightGrantedTo(LLRelationship::GRANT_ONLINE_STATUS))
- canSeeMeOnline = true;
-
- // When we get here, mNeedsSend is true and mInSLFriends is false. Change them as necessary.
-
- if(buddy)
- {
- // This buddy is already in both lists.
-
- if(name != buddy->mDisplayName)
- {
- // The buddy is in the list with the wrong name. Update it with the correct name.
- LL_WARNS("Voice") << "Buddy " << id << " has wrong name (\"" << buddy->mDisplayName << "\" should be \"" << name << "\"), updating."<< LL_ENDL;
- buddy->mDisplayName = name;
- buddy->mNeedsNameUpdate = true; // This will cause the buddy to be resent.
- }
- }
- else
- {
- // This buddy was not in the vivox list, needs to be added.
- buddy = addBuddy(sipURIFromID(id), name);
- buddy->mUUID = id;
- }
-
- // In all the above cases, the buddy is in the SL friends list (which is how we got here).
- buddy->mInSLFriends = true;
- buddy->mCanSeeMeOnline = canSeeMeOnline;
- buddy->mNameResolved = true;
-
+ return mVoiceModule->tuningGetEnergy();
}
else
{
- // This name hasn't been looked up yet. Don't do anything with this buddy list entry until it has.
- if(buddy)
- {
- buddy->mNameResolved = false;
- }
-
- // Initiate a lookup.
- // The "lookup completed" callback will ensure that the friends list is rechecked after it completes.
- lookupName(id);
+ return 0.0;
}
}
-void LLVoiceClient::clearAllLists()
-{
- // FOR TESTING ONLY
-
- // This will send the necessary commands to delete ALL buddies, autoaccept rules, and block rules SLVoice tells us about.
- buddyListMap::iterator buddy_it;
- for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end();)
- {
- buddyListEntry *buddy = buddy_it->second;
- buddy_it++;
-
- std::ostringstream stream;
-
- if(buddy->mInVivoxBuddies)
- {
- // delete this entry from the vivox buddy list
- buddy->mInVivoxBuddies = false;
- LL_DEBUGS("Voice") << "delete " << buddy->mURI << " (" << buddy->mDisplayName << ")" << LL_ENDL;
- stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.BuddyDelete.1\">"
- << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
- << "<BuddyURI>" << buddy->mURI << "</BuddyURI>"
- << "</Request>\n\n\n";
- }
-
- if(buddy->mHasBlockListEntry)
- {
- // Delete the associated block list entry (so the block list doesn't fill up with junk)
- buddy->mHasBlockListEntry = false;
- stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteBlockRule.1\">"
- << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
- << "<BlockMask>" << buddy->mURI << "</BlockMask>"
- << "</Request>\n\n\n";
- }
- if(buddy->mHasAutoAcceptListEntry)
- {
- // Delete the associated auto-accept list entry (so the auto-accept list doesn't fill up with junk)
- buddy->mHasAutoAcceptListEntry = false;
- stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteAutoAcceptRule.1\">"
- << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
- << "<AutoAcceptMask>" << buddy->mURI << "</AutoAcceptMask>"
- << "</Request>\n\n\n";
- }
- writeString(stream.str());
+//------------------------------------------------
+// devices
- }
-}
-
-void LLVoiceClient::sendFriendsListUpdates()
+bool LLVoiceClient::deviceSettingsAvailable()
{
- if(mBuddyListMapPopulated && mBlockRulesListReceived && mAutoAcceptRulesListReceived && mFriendsListDirty)
- {
- mFriendsListDirty = false;
-
- if(0)
- {
- // FOR TESTING ONLY -- clear all buddy list, block list, and auto-accept list entries.
- clearAllLists();
- return;
- }
-
- LL_INFOS("Voice") << "Checking vivox buddy list against friends list..." << LL_ENDL;
-
- buddyListMap::iterator buddy_it;
- for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end(); buddy_it++)
- {
- // reset the temp flags in the local buddy list
- buddy_it->second->mInSLFriends = false;
- }
-
- // correlate with the friends list
- {
- LLCollectAllBuddies collect;
- LLAvatarTracker::instance().applyFunctor(collect);
- LLCollectAllBuddies::buddy_map_t::const_iterator it = collect.mOnline.begin();
- LLCollectAllBuddies::buddy_map_t::const_iterator end = collect.mOnline.end();
-
- for ( ; it != end; ++it)
- {
- checkFriend(it->second);
- }
- it = collect.mOffline.begin();
- end = collect.mOffline.end();
- for ( ; it != end; ++it)
- {
- checkFriend(it->second);
- }
- }
-
- LL_INFOS("Voice") << "Sending friend list updates..." << LL_ENDL;
-
- for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end();)
- {
- buddyListEntry *buddy = buddy_it->second;
- buddy_it++;
-
- // Ignore entries that aren't resolved yet.
- if(buddy->mNameResolved)
- {
- std::ostringstream stream;
-
- if(buddy->mInSLFriends && (!buddy->mInVivoxBuddies || buddy->mNeedsNameUpdate))
- {
- if(mNumberOfAliases > 0)
- {
- // Add (or update) this entry in the vivox buddy list
- buddy->mInVivoxBuddies = true;
- buddy->mNeedsNameUpdate = false;
- LL_DEBUGS("Voice") << "add/update " << buddy->mURI << " (" << buddy->mDisplayName << ")" << LL_ENDL;
- stream
- << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.BuddySet.1\">"
- << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
- << "<BuddyURI>" << buddy->mURI << "</BuddyURI>"
- << "<DisplayName>" << buddy->mDisplayName << "</DisplayName>"
- << "<BuddyData></BuddyData>" // Without this, SLVoice doesn't seem to parse the command.
- << "<GroupID>0</GroupID>"
- << "</Request>\n\n\n";
- }
- }
- else if(!buddy->mInSLFriends)
- {
- // This entry no longer exists in your SL friends list. Remove all traces of it from the Vivox buddy list.
- if(buddy->mInVivoxBuddies)
- {
- // delete this entry from the vivox buddy list
- buddy->mInVivoxBuddies = false;
- LL_DEBUGS("Voice") << "delete " << buddy->mURI << " (" << buddy->mDisplayName << ")" << LL_ENDL;
- stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.BuddyDelete.1\">"
- << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
- << "<BuddyURI>" << buddy->mURI << "</BuddyURI>"
- << "</Request>\n\n\n";
- }
-
- if(buddy->mHasBlockListEntry)
- {
- // Delete the associated block list entry, if any
- buddy->mHasBlockListEntry = false;
- stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteBlockRule.1\">"
- << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
- << "<BlockMask>" << buddy->mURI << "</BlockMask>"
- << "</Request>\n\n\n";
- }
- if(buddy->mHasAutoAcceptListEntry)
- {
- // Delete the associated auto-accept list entry, if any
- buddy->mHasAutoAcceptListEntry = false;
- stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteAutoAcceptRule.1\">"
- << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
- << "<AutoAcceptMask>" << buddy->mURI << "</AutoAcceptMask>"
- << "</Request>\n\n\n";
- }
- }
-
- if(buddy->mInSLFriends)
- {
-
- if(buddy->mCanSeeMeOnline)
- {
- // Buddy should not be blocked.
-
- // If this buddy doesn't already have either a block or autoaccept list entry, we'll update their status when we receive a SubscriptionEvent.
-
- // If the buddy has a block list entry, delete it.
- if(buddy->mHasBlockListEntry)
- {
- buddy->mHasBlockListEntry = false;
- stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteBlockRule.1\">"
- << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
- << "<BlockMask>" << buddy->mURI << "</BlockMask>"
- << "</Request>\n\n\n";
-
-
- // If we just deleted a block list entry, add an auto-accept entry.
- if(!buddy->mHasAutoAcceptListEntry)
- {
- buddy->mHasAutoAcceptListEntry = true;
- stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.CreateAutoAcceptRule.1\">"
- << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
- << "<AutoAcceptMask>" << buddy->mURI << "</AutoAcceptMask>"
- << "<AutoAddAsBuddy>0</AutoAddAsBuddy>"
- << "</Request>\n\n\n";
- }
- }
- }
- else
- {
- // Buddy should be blocked.
-
- // If this buddy doesn't already have either a block or autoaccept list entry, we'll update their status when we receive a SubscriptionEvent.
-
- // If this buddy has an autoaccept entry, delete it
- if(buddy->mHasAutoAcceptListEntry)
- {
- buddy->mHasAutoAcceptListEntry = false;
- stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteAutoAcceptRule.1\">"
- << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
- << "<AutoAcceptMask>" << buddy->mURI << "</AutoAcceptMask>"
- << "</Request>\n\n\n";
-
- // If we just deleted an auto-accept entry, add a block list entry.
- if(!buddy->mHasBlockListEntry)
- {
- buddy->mHasBlockListEntry = true;
- stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.CreateBlockRule.1\">"
- << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
- << "<BlockMask>" << buddy->mURI << "</BlockMask>"
- << "<PresenceOnly>1</PresenceOnly>"
- << "</Request>\n\n\n";
- }
- }
- }
-
- if(!buddy->mInSLFriends && !buddy->mInVivoxBuddies)
- {
- // Delete this entry from the local buddy list. This should NOT invalidate the iterator,
- // since it has already been incremented to the next entry.
- deleteBuddy(buddy->mURI);
- }
-
- }
- writeString(stream.str());
- }
- }
- }
-}
-
-/////////////////////////////
-// Response/Event handlers
-
-void LLVoiceClient::connectorCreateResponse(int statusCode, std::string &statusString, std::string &connectorHandle, std::string &versionID)
-{
- if(statusCode != 0)
- {
- LL_WARNS("Voice") << "Connector.Create response failure: " << statusString << LL_ENDL;
- setState(stateConnectorFailed);
- }
- else
- {
- // Connector created, move forward.
- LL_INFOS("Voice") << "Connector.Create succeeded, Vivox SDK version is " << versionID << LL_ENDL;
- mAPIVersion = versionID;
- mConnectorHandle = connectorHandle;
- if(getState() == stateConnectorStarting)
- {
- setState(stateConnectorStarted);
- }
- }
-}
-
-void LLVoiceClient::loginResponse(int statusCode, std::string &statusString, std::string &accountHandle, int numberOfAliases)
-{
- LL_DEBUGS("Voice") << "Account.Login response (" << statusCode << "): " << statusString << LL_ENDL;
-
- // Status code of 20200 means "bad password". We may want to special-case that at some point.
-
- if ( statusCode == 401 )
- {
- // Login failure which is probably caused by the delay after a user's password being updated.
- LL_INFOS("Voice") << "Account.Login response failure (" << statusCode << "): " << statusString << LL_ENDL;
- setState(stateLoginRetry);
- }
- else if(statusCode != 0)
+ if (mVoiceModule)
{
- LL_WARNS("Voice") << "Account.Login response failure (" << statusCode << "): " << statusString << LL_ENDL;
- setState(stateLoginFailed);
+ return mVoiceModule->deviceSettingsAvailable();
}
else
{
- // Login succeeded, move forward.
- mAccountHandle = accountHandle;
- mNumberOfAliases = numberOfAliases;
- // This needs to wait until the AccountLoginStateChangeEvent is received.
-// if(getState() == stateLoggingIn)
-// {
-// setState(stateLoggedIn);
-// }
+ return false;
}
}
-void LLVoiceClient::sessionCreateResponse(std::string &requestId, int statusCode, std::string &statusString, std::string &sessionHandle)
-{
- sessionState *session = findSessionBeingCreatedByURI(requestId);
-
- if(session)
- {
- session->mCreateInProgress = false;
- }
-
- if(statusCode != 0)
- {
- LL_WARNS("Voice") << "Session.Create response failure (" << statusCode << "): " << statusString << LL_ENDL;
- if(session)
- {
- session->mErrorStatusCode = statusCode;
- session->mErrorStatusString = statusString;
- if(session == mAudioSession)
- {
- setState(stateJoinSessionFailed);
- }
- else
- {
- reapSession(session);
- }
- }
- }
- else
- {
- LL_INFOS("Voice") << "Session.Create response received (success), session handle is " << sessionHandle << LL_ENDL;
- if(session)
- {
- setSessionHandle(session, sessionHandle);
- }
- }
-}
-
-void LLVoiceClient::sessionGroupAddSessionResponse(std::string &requestId, int statusCode, std::string &statusString, std::string &sessionHandle)
-{
- sessionState *session = findSessionBeingCreatedByURI(requestId);
-
- if(session)
- {
- session->mCreateInProgress = false;
- }
-
- if(statusCode != 0)
- {
- LL_WARNS("Voice") << "SessionGroup.AddSession response failure (" << statusCode << "): " << statusString << LL_ENDL;
- if(session)
- {
- session->mErrorStatusCode = statusCode;
- session->mErrorStatusString = statusString;
- if(session == mAudioSession)
- {
- setState(stateJoinSessionFailed);
- }
- else
- {
- reapSession(session);
- }
- }
- }
- else
- {
- LL_DEBUGS("Voice") << "SessionGroup.AddSession response received (success), session handle is " << sessionHandle << LL_ENDL;
- if(session)
- {
- setSessionHandle(session, sessionHandle);
- }
- }
-}
-
-void LLVoiceClient::sessionConnectResponse(std::string &requestId, int statusCode, std::string &statusString)
+void LLVoiceClient::refreshDeviceLists(bool clearCurrentList)
{
- sessionState *session = findSession(requestId);
- if(statusCode != 0)
- {
- LL_WARNS("Voice") << "Session.Connect response failure (" << statusCode << "): " << statusString << LL_ENDL;
- if(session)
- {
- session->mMediaConnectInProgress = false;
- session->mErrorStatusCode = statusCode;
- session->mErrorStatusString = statusString;
- if(session == mAudioSession)
- setState(stateJoinSessionFailed);
- }
- }
- else
- {
- LL_DEBUGS("Voice") << "Session.Connect response received (success)" << LL_ENDL;
- }
+ if (mVoiceModule) mVoiceModule->refreshDeviceLists(clearCurrentList);
}
-void LLVoiceClient::logoutResponse(int statusCode, std::string &statusString)
-{
- if(statusCode != 0)
- {
- LL_WARNS("Voice") << "Account.Logout response failure: " << statusString << LL_ENDL;
- // Should this ever fail? do we care if it does?
- }
-}
-
-void LLVoiceClient::connectorShutdownResponse(int statusCode, std::string &statusString)
+void LLVoiceClient::setCaptureDevice(const std::string& name)
{
- if(statusCode != 0)
- {
- LL_WARNS("Voice") << "Connector.InitiateShutdown response failure: " << statusString << LL_ENDL;
- // Should this ever fail? do we care if it does?
- }
+ if (mVoiceModule) mVoiceModule->setCaptureDevice(name);
- mConnected = false;
-
- if(getState() == stateConnectorStopping)
- {
- setState(stateConnectorStopped);
- }
}
-void LLVoiceClient::sessionAddedEvent(
- std::string &uriString,
- std::string &alias,
- std::string &sessionHandle,
- std::string &sessionGroupHandle,
- bool isChannel,
- bool incoming,
- std::string &nameString,
- std::string &applicationString)
+void LLVoiceClient::setRenderDevice(const std::string& name)
{
- sessionState *session = NULL;
-
- LL_INFOS("Voice") << "session " << uriString << ", alias " << alias << ", name " << nameString << " handle " << sessionHandle << LL_ENDL;
-
- session = addSession(uriString, sessionHandle);
- if(session)
- {
- session->mGroupHandle = sessionGroupHandle;
- session->mIsChannel = isChannel;
- session->mIncoming = incoming;
- session->mAlias = alias;
-
- // Generate a caller UUID -- don't need to do this for channels
- if(!session->mIsChannel)
- {
- if(IDFromName(session->mSIPURI, session->mCallerID))
- {
- // Normal URI(base64-encoded UUID)
- }
- else if(!session->mAlias.empty() && IDFromName(session->mAlias, session->mCallerID))
- {
- // Wrong URI, but an alias is available. Stash the incoming URI as an alternate
- session->mAlternateSIPURI = session->mSIPURI;
-
- // and generate a proper URI from the ID.
- setSessionURI(session, sipURIFromID(session->mCallerID));
- }
- else
- {
- LL_INFOS("Voice") << "Could not generate caller id from uri, using hash of uri " << session->mSIPURI << LL_ENDL;
- setUUIDFromStringHash(session->mCallerID, session->mSIPURI);
- session->mSynthesizedCallerID = true;
-
- // Can't look up the name in this case -- we have to extract it from the URI.
- std::string namePortion = nameFromsipURI(session->mSIPURI);
- if(namePortion.empty())
- {
- // Didn't seem to be a SIP URI, just use the whole provided name.
- namePortion = nameString;
- }
-
- // Some incoming names may be separated with an underscore instead of a space. Fix this.
- LLStringUtil::replaceChar(namePortion, '_', ' ');
-
- // Act like we just finished resolving the name (this stores it in all the right places)
- avatarNameResolved(session->mCallerID, namePortion);
- }
-
- LL_INFOS("Voice") << "caller ID: " << session->mCallerID << LL_ENDL;
-
- if(!session->mSynthesizedCallerID)
- {
- // If we got here, we don't have a proper name. Initiate a lookup.
- lookupName(session->mCallerID);
- }
- }
- }
+ if (mVoiceModule) mVoiceModule->setRenderDevice(name);
}
-void LLVoiceClient::sessionGroupAddedEvent(std::string &sessionGroupHandle)
+const LLVoiceDeviceList& LLVoiceClient::getCaptureDevices()
{
- LL_DEBUGS("Voice") << "handle " << sessionGroupHandle << LL_ENDL;
-
-#if USE_SESSION_GROUPS
- if(mMainSessionGroupHandle.empty())
+ static LLVoiceDeviceList nullCaptureDevices;
+ if (mVoiceModule)
{
- // This is the first (i.e. "main") session group. Save its handle.
- mMainSessionGroupHandle = sessionGroupHandle;
+ return mVoiceModule->getCaptureDevices();
}
else
{
- LL_DEBUGS("Voice") << "Already had a session group handle " << mMainSessionGroupHandle << LL_ENDL;
+ return nullCaptureDevices;
}
-#endif
}
-void LLVoiceClient::joinedAudioSession(sessionState *session)
-{
- if(mAudioSession != session)
- {
- sessionState *oldSession = mAudioSession;
-
- mAudioSession = session;
- mAudioSessionChanged = true;
- // The old session may now need to be deleted.
- reapSession(oldSession);
- }
-
- // This is the session we're joining.
- if(getState() == stateJoiningSession)
- {
- setState(stateSessionJoined);
-
- // SLIM SDK: we don't always receive a participant state change for ourselves when joining a channel now.
- // Add the current user as a participant here.
- participantState *participant = session->addParticipant(sipURIFromName(mAccountName));
- if(participant)
- {
- participant->mIsSelf = true;
- lookupName(participant->mAvatarID);
-
- LL_INFOS("Voice") << "added self as participant \"" << participant->mAccountName
- << "\" (" << participant->mAvatarID << ")"<< LL_ENDL;
- }
-
- if(!session->mIsChannel)
- {
- // this is a p2p session. Make sure the other end is added as a participant.
- participantState *participant = session->addParticipant(session->mSIPURI);
- if(participant)
- {
- if(participant->mAvatarIDValid)
- {
- lookupName(participant->mAvatarID);
- }
- else if(!session->mName.empty())
- {
- participant->mDisplayName = session->mName;
- avatarNameResolved(participant->mAvatarID, session->mName);
- }
-
- // TODO: Question: Do we need to set up mAvatarID/mAvatarIDValid here?
- LL_INFOS("Voice") << "added caller as participant \"" << participant->mAccountName
- << "\" (" << participant->mAvatarID << ")"<< LL_ENDL;
- }
- }
- }
-}
-
-void LLVoiceClient::sessionRemovedEvent(
- std::string &sessionHandle,
- std::string &sessionGroupHandle)
+const LLVoiceDeviceList& LLVoiceClient::getRenderDevices()
{
- LL_INFOS("Voice") << "handle " << sessionHandle << LL_ENDL;
-
- sessionState *session = findSession(sessionHandle);
- if(session)
+ static LLVoiceDeviceList nullRenderDevices;
+ if (mVoiceModule)
{
- leftAudioSession(session);
-
- // This message invalidates the session's handle. Set it to empty.
- setSessionHandle(session);
-
- // This also means that the session's session group is now empty.
- // Terminate the session group so it doesn't leak.
- sessionGroupTerminateSendMessage(session);
-
- // Reset the media state (we now have no info)
- session->mMediaStreamState = streamStateUnknown;
- session->mTextStreamState = streamStateUnknown;
-
- // Conditionally delete the session
- reapSession(session);
+ return mVoiceModule->getRenderDevices();
}
else
{
- LL_WARNS("Voice") << "unknown session " << sessionHandle << " removed" << LL_ENDL;
+ return nullRenderDevices;
}
}
-void LLVoiceClient::reapSession(sessionState *session)
-{
- if(session)
- {
- if(!session->mHandle.empty())
- {
- LL_DEBUGS("Voice") << "NOT deleting session " << session->mSIPURI << " (non-null session handle)" << LL_ENDL;
- }
- else if(session->mCreateInProgress)
- {
- LL_DEBUGS("Voice") << "NOT deleting session " << session->mSIPURI << " (create in progress)" << LL_ENDL;
- }
- else if(session->mMediaConnectInProgress)
- {
- LL_DEBUGS("Voice") << "NOT deleting session " << session->mSIPURI << " (connect in progress)" << LL_ENDL;
- }
- else if(session == mAudioSession)
- {
- LL_DEBUGS("Voice") << "NOT deleting session " << session->mSIPURI << " (it's the current session)" << LL_ENDL;
- }
- else if(session == mNextAudioSession)
- {
- LL_DEBUGS("Voice") << "NOT deleting session " << session->mSIPURI << " (it's the next session)" << LL_ENDL;
- }
- else
- {
- // TODO: Question: Should we check for queued text messages here?
- // We don't have a reason to keep tracking this session, so just delete it.
- LL_DEBUGS("Voice") << "deleting session " << session->mSIPURI << LL_ENDL;
- deleteSession(session);
- session = NULL;
- }
- }
- else
- {
-// LL_DEBUGS("Voice") << "session is NULL" << LL_ENDL;
- }
-}
-// Returns true if the session seems to indicate we've moved to a region on a different voice server
-bool LLVoiceClient::sessionNeedsRelog(sessionState *session)
-{
- bool result = false;
-
- if(session != NULL)
- {
- // Only make this check for spatial channels (so it won't happen for group or p2p calls)
- if(session->mIsSpatial)
- {
- std::string::size_type atsign;
-
- atsign = session->mSIPURI.find("@");
-
- if(atsign != std::string::npos)
- {
- std::string urihost = session->mSIPURI.substr(atsign + 1);
- if(stricmp(urihost.c_str(), mVoiceSIPURIHostName.c_str()))
- {
- // The hostname in this URI is different from what we expect. This probably means we need to relog.
-
- // We could make a ProvisionVoiceAccountRequest and compare the result with the current values of
- // mVoiceSIPURIHostName and mVoiceAccountServerURI to be really sure, but this is a pretty good indicator.
-
- result = true;
- }
- }
- }
- }
-
- return result;
-}
+//--------------------------------------------------
+// participants
-void LLVoiceClient::leftAudioSession(
- sessionState *session)
+void LLVoiceClient::getParticipantList(std::set<LLUUID> &participants)
{
- if(mAudioSession == session)
+ if (mVoiceModule)
{
- switch(getState())
- {
- case stateJoiningSession:
- case stateSessionJoined:
- case stateRunning:
- case stateLeavingSession:
- case stateJoinSessionFailed:
- case stateJoinSessionFailedWaiting:
- // normal transition
- LL_DEBUGS("Voice") << "left session " << session->mHandle << " in state " << state2string(getState()) << LL_ENDL;
- setState(stateSessionTerminated);
- break;
-
- case stateSessionTerminated:
- // this will happen sometimes -- there are cases where we send the terminate and then go straight to this state.
- LL_WARNS("Voice") << "left session " << session->mHandle << " in state " << state2string(getState()) << LL_ENDL;
- break;
-
- default:
- LL_WARNS("Voice") << "unexpected SessionStateChangeEvent (left session) in state " << state2string(getState()) << LL_ENDL;
- setState(stateSessionTerminated);
- break;
- }
- }
-}
-
-void LLVoiceClient::accountLoginStateChangeEvent(
- std::string &accountHandle,
- int statusCode,
- std::string &statusString,
- int state)
-{
- LL_DEBUGS("Voice") << "state is " << state << LL_ENDL;
- /*
- According to Mike S., status codes for this event are:
- login_state_logged_out=0,
- login_state_logged_in = 1,
- login_state_logging_in = 2,
- login_state_logging_out = 3,
- login_state_resetting = 4,
- login_state_error=100
- */
-
- switch(state)
- {
- case 1:
- if(getState() == stateLoggingIn)
- {
- setState(stateLoggedIn);
- }
- break;
-
- case 3:
- // The user is in the process of logging out.
- setState(stateLoggingOut);
- break;
-
- case 0:
- // The user has been logged out.
- setState(stateLoggedOut);
- break;
-
- default:
- //Used to be a commented out warning
- LL_DEBUGS("Voice") << "unknown state: " << state << LL_ENDL;
- break;
- }
-}
-
-void LLVoiceClient::mediaStreamUpdatedEvent(
- std::string &sessionHandle,
- std::string &sessionGroupHandle,
- int statusCode,
- std::string &statusString,
- int state,
- bool incoming)
-{
- sessionState *session = findSession(sessionHandle);
-
- LL_DEBUGS("Voice") << "session " << sessionHandle << ", status code " << statusCode << ", string \"" << statusString << "\"" << LL_ENDL;
-
- if(session)
- {
- // We know about this session
-
- // Save the state for later use
- session->mMediaStreamState = state;
-
- switch(statusCode)
- {
- case 0:
- case 200:
- // generic success
- // Don't change the saved error code (it may have been set elsewhere)
- break;
- default:
- // save the status code for later
- session->mErrorStatusCode = statusCode;
- break;
- }
-
- switch(state)
- {
- case streamStateIdle:
- // Standard "left audio session"
- session->mVoiceEnabled = false;
- session->mMediaConnectInProgress = false;
- leftAudioSession(session);
- break;
-
- case streamStateConnected:
- session->mVoiceEnabled = true;
- session->mMediaConnectInProgress = false;
- joinedAudioSession(session);
- break;
-
- case streamStateRinging:
- if(incoming)
- {
- // Send the voice chat invite to the GUI layer
- // *TODO: Question: Should we correlate with the mute list here?
- session->mIMSessionID = LLIMMgr::computeSessionID(IM_SESSION_P2P_INVITE, session->mCallerID);
- session->mVoiceInvitePending = true;
- if(session->mName.empty())
- {
- lookupName(session->mCallerID);
- }
- else
- {
- // Act like we just finished resolving the name
- avatarNameResolved(session->mCallerID, session->mName);
- }
- }
- break;
-
- default:
- LL_WARNS("Voice") << "unknown state " << state << LL_ENDL;
- break;
-
- }
-
+ mVoiceModule->getParticipantList(participants);
}
else
{
- LL_WARNS("Voice") << "session " << sessionHandle << "not found"<< LL_ENDL;
+ participants = std::set<LLUUID>();
}
}
-void LLVoiceClient::textStreamUpdatedEvent(
- std::string &sessionHandle,
- std::string &sessionGroupHandle,
- bool enabled,
- int state,
- bool incoming)
+bool LLVoiceClient::isParticipant(const LLUUID &speaker_id)
{
- sessionState *session = findSession(sessionHandle);
-
- if(session)
- {
- // Save the state for later use
- session->mTextStreamState = state;
-
- // We know about this session
- switch(state)
- {
- case 0: // We see this when the text stream closes
- LL_DEBUGS("Voice") << "stream closed" << LL_ENDL;
- break;
-
- case 1: // We see this on an incoming call from the Connector
- // Try to send any text messages queued for this session.
- sendQueuedTextMessages(session);
-
- // Send the text chat invite to the GUI layer
- // TODO: Question: Should we correlate with the mute list here?
- session->mTextInvitePending = true;
- if(session->mName.empty())
- {
- lookupName(session->mCallerID);
- }
- else
- {
- // Act like we just finished resolving the name
- avatarNameResolved(session->mCallerID, session->mName);
- }
- break;
-
- default:
- LL_WARNS("Voice") << "unknown state " << state << LL_ENDL;
- break;
-
- }
- }
+ if(mVoiceModule)
+ {
+ return mVoiceModule->isParticipant(speaker_id);
+ }
+ return false;
}
-void LLVoiceClient::participantAddedEvent(
- std::string &sessionHandle,
- std::string &sessionGroupHandle,
- std::string &uriString,
- std::string &alias,
- std::string &nameString,
- std::string &displayNameString,
- int participantType)
-{
- sessionState *session = findSession(sessionHandle);
- if(session)
- {
- participantState *participant = session->addParticipant(uriString);
- if(participant)
- {
- participant->mAccountName = nameString;
-
- LL_DEBUGS("Voice") << "added participant \"" << participant->mAccountName
- << "\" (" << participant->mAvatarID << ")"<< LL_ENDL;
-
- if(participant->mAvatarIDValid)
- {
- // Initiate a lookup
- lookupName(participant->mAvatarID);
- }
- else
- {
- // If we don't have a valid avatar UUID, we need to fill in the display name to make the active speakers floater work.
- std::string namePortion = nameFromsipURI(uriString);
- if(namePortion.empty())
- {
- // Problem with the SIP URI, fall back to the display name
- namePortion = displayNameString;
- }
- if(namePortion.empty())
- {
- // Problems with both of the above, fall back to the account name
- namePortion = nameString;
- }
-
- // Set the display name (which is a hint to the active speakers window not to do its own lookup)
- participant->mDisplayName = namePortion;
- avatarNameResolved(participant->mAvatarID, namePortion);
- }
- }
- }
-}
-void LLVoiceClient::participantRemovedEvent(
- std::string &sessionHandle,
- std::string &sessionGroupHandle,
- std::string &uriString,
- std::string &alias,
- std::string &nameString)
-{
- sessionState *session = findSession(sessionHandle);
- if(session)
- {
- participantState *participant = session->findParticipant(uriString);
- if(participant)
- {
- session->removeParticipant(participant);
- }
- else
- {
- LL_DEBUGS("Voice") << "unknown participant " << uriString << LL_ENDL;
- }
- }
- else
- {
- LL_DEBUGS("Voice") << "unknown session " << sessionHandle << LL_ENDL;
- }
-}
+//--------------------------------------------------
+// text chat
-void LLVoiceClient::participantUpdatedEvent(
- std::string &sessionHandle,
- std::string &sessionGroupHandle,
- std::string &uriString,
- std::string &alias,
- bool isModeratorMuted,
- bool isSpeaking,
- int volume,
- F32 energy)
+BOOL LLVoiceClient::isSessionTextIMPossible(const LLUUID& id)
{
- sessionState *session = findSession(sessionHandle);
- if(session)
+ if (mVoiceModule)
{
- participantState *participant = session->findParticipant(uriString);
-
- if(participant)
- {
- participant->mIsSpeaking = isSpeaking;
- participant->mIsModeratorMuted = isModeratorMuted;
-
- // SLIM SDK: convert range: ensure that energy is set to zero if is_speaking is false
- if (isSpeaking)
- {
- participant->mSpeakingTimeout.reset();
- participant->mPower = energy;
- }
- else
- {
- participant->mPower = 0.0f;
- }
- participant->mVolume = volume;
-
-
- // *HACK: mantipov: added while working on EXT-3544
- /*
- Sometimes LLVoiceClient::participantUpdatedEvent callback is called BEFORE
- LLViewerChatterBoxSessionAgentListUpdates::post() sometimes AFTER.
-
- participantUpdatedEvent updates voice participant state in particular participantState::mIsModeratorMuted
- Originally we wanted to update session Speaker Manager to fire LLSpeakerVoiceModerationEvent to fix the EXT-3544 bug.
- Calling of the LLSpeakerMgr::update() method was added into LLIMMgr::processAgentListUpdates.
-
- But in case participantUpdatedEvent() is called after LLViewerChatterBoxSessionAgentListUpdates::post()
- voice participant mIsModeratorMuted is changed after speakers are updated in Speaker Manager
- and event is not fired.
-
- So, we have to call LLSpeakerMgr::update() here. In any case it is better than call it
- in LLCallFloater::draw()
- */
- LLVoiceChannel* voice_cnl = LLVoiceChannel::getCurrentVoiceChannel();
-
- // ignore session ID of local chat
- if (voice_cnl && voice_cnl->getSessionID().notNull())
- {
- LLSpeakerMgr* speaker_manager = LLIMModel::getInstance()->getSpeakerManager(voice_cnl->getSessionID());
- if (speaker_manager)
- {
- speaker_manager->update(true);
- }
- }
- }
- else
- {
- LL_WARNS("Voice") << "unknown participant: " << uriString << LL_ENDL;
- }
+ return mVoiceModule->isSessionTextIMPossible(id);
}
else
{
- LL_INFOS("Voice") << "unknown session " << sessionHandle << LL_ENDL;
- }
+ return FALSE;
+ }
}
-void LLVoiceClient::buddyPresenceEvent(
- std::string &uriString,
- std::string &alias,
- std::string &statusString,
- std::string &applicationString)
+BOOL LLVoiceClient::isSessionCallBackPossible(const LLUUID& id)
{
- buddyListEntry *buddy = findBuddy(uriString);
-
- if(buddy)
+ if (mVoiceModule)
{
- LL_DEBUGS("Voice") << "Presence event for " << buddy->mDisplayName << " status \"" << statusString << "\", application \"" << applicationString << "\""<< LL_ENDL;
- LL_DEBUGS("Voice") << "before: mOnlineSL = " << (buddy->mOnlineSL?"true":"false") << ", mOnlineSLim = " << (buddy->mOnlineSLim?"true":"false") << LL_ENDL;
-
- if(applicationString.empty())
- {
- // This presence event is from a client that doesn't set up the Application string. Do things the old-skool way.
- // NOTE: this will be needed to support people who aren't on the 3010-class SDK yet.
-
- if ( stricmp("Unknown", statusString.c_str())== 0)
- {
- // User went offline with a non-SLim-enabled viewer.
- buddy->mOnlineSL = false;
- }
- else if ( stricmp("Online", statusString.c_str())== 0)
- {
- // User came online with a non-SLim-enabled viewer.
- buddy->mOnlineSL = true;
- }
- else
- {
- // If the user is online through SLim, their status will be "Online-slc", "Away", or something else.
- // NOTE: we should never see this unless someone is running an OLD version of SLim -- the versions that should be in use now all set the application string.
- buddy->mOnlineSLim = true;
- }
- }
- else if(applicationString.find("SecondLifeViewer") != std::string::npos)
- {
- // This presence event is from a viewer that sets the application string
- if ( stricmp("Unknown", statusString.c_str())== 0)
- {
- // Viewer says they're offline
- buddy->mOnlineSL = false;
- }
- else
- {
- // Viewer says they're online
- buddy->mOnlineSL = true;
- }
- }
- else
- {
- // This presence event is from something which is NOT the SL viewer (assume it's SLim).
- if ( stricmp("Unknown", statusString.c_str())== 0)
- {
- // SLim says they're offline
- buddy->mOnlineSLim = false;
- }
- else
- {
- // SLim says they're online
- buddy->mOnlineSLim = true;
- }
- }
-
- LL_DEBUGS("Voice") << "after: mOnlineSL = " << (buddy->mOnlineSL?"true":"false") << ", mOnlineSLim = " << (buddy->mOnlineSLim?"true":"false") << LL_ENDL;
-
- // HACK -- increment the internal change serial number in the LLRelationship (without changing the actual status), so the UI notices the change.
- LLAvatarTracker::instance().setBuddyOnline(buddy->mUUID,LLAvatarTracker::instance().isBuddyOnline(buddy->mUUID));
-
- notifyFriendObservers();
+ return mVoiceModule->isSessionCallBackPossible(id);
}
else
{
- LL_DEBUGS("Voice") << "Presence for unknown buddy " << uriString << LL_ENDL;
+ return FALSE;
}
}
-void LLVoiceClient::messageEvent(
- std::string &sessionHandle,
- std::string &uriString,
- std::string &alias,
- std::string &messageHeader,
- std::string &messageBody,
- std::string &applicationString)
+BOOL LLVoiceClient::sendTextMessage(const LLUUID& participant_id, const std::string& message)
{
- LL_DEBUGS("Voice") << "Message event, session " << sessionHandle << " from " << uriString << LL_ENDL;
-// LL_DEBUGS("Voice") << " header " << messageHeader << ", body: \n" << messageBody << LL_ENDL;
-
- if(messageHeader.find("text/html") != std::string::npos)
+ if (mVoiceModule)
{
- std::string message;
-
- {
- const std::string startMarker = "<body";
- const std::string startMarker2 = ">";
- const std::string endMarker = "</body>";
- const std::string startSpan = "<span";
- const std::string endSpan = "</span>";
- std::string::size_type start;
- std::string::size_type end;
-
- // Default to displaying the raw string, so the message gets through.
- message = messageBody;
-
- // Find the actual message text within the XML fragment
- start = messageBody.find(startMarker);
- start = messageBody.find(startMarker2, start);
- end = messageBody.find(endMarker);
-
- if(start != std::string::npos)
- {
- start += startMarker2.size();
-
- if(end != std::string::npos)
- end -= start;
-
- message.assign(messageBody, start, end);
- }
- else
- {
- // Didn't find a <body>, try looking for a <span> instead.
- start = messageBody.find(startSpan);
- start = messageBody.find(startMarker2, start);
- end = messageBody.find(endSpan);
-
- if(start != std::string::npos)
- {
- start += startMarker2.size();
-
- if(end != std::string::npos)
- end -= start;
-
- message.assign(messageBody, start, end);
- }
- }
- }
-
-// LL_DEBUGS("Voice") << " raw message = \n" << message << LL_ENDL;
-
- // strip formatting tags
- {
- std::string::size_type start;
- std::string::size_type end;
-
- while((start = message.find('<')) != std::string::npos)
- {
- if((end = message.find('>', start + 1)) != std::string::npos)
- {
- // Strip out the tag
- message.erase(start, (end + 1) - start);
- }
- else
- {
- // Avoid an infinite loop
- break;
- }
- }
- }
-
- // Decode ampersand-escaped chars
- {
- std::string::size_type mark = 0;
-
- // The text may contain text encoded with &lt;, &gt;, and &amp;
- mark = 0;
- while((mark = message.find("&lt;", mark)) != std::string::npos)
- {
- message.replace(mark, 4, "<");
- mark += 1;
- }
-
- mark = 0;
- while((mark = message.find("&gt;", mark)) != std::string::npos)
- {
- message.replace(mark, 4, ">");
- mark += 1;
- }
-
- mark = 0;
- while((mark = message.find("&amp;", mark)) != std::string::npos)
- {
- message.replace(mark, 5, "&");
- mark += 1;
- }
- }
-
- // strip leading/trailing whitespace (since we always seem to get a couple newlines)
- LLStringUtil::trim(message);
-
-// LL_DEBUGS("Voice") << " stripped message = \n" << message << LL_ENDL;
-
- sessionState *session = findSession(sessionHandle);
- if(session)
- {
- bool is_busy = gAgent.getBusy();
- bool is_muted = LLMuteList::getInstance()->isMuted(session->mCallerID, session->mName, LLMute::flagTextChat);
- bool is_linden = LLMuteList::getInstance()->isLinden(session->mName);
- bool quiet_chat = false;
- LLChat chat;
-
- chat.mMuted = is_muted && !is_linden;
-
- if(!chat.mMuted)
- {
- chat.mFromID = session->mCallerID;
- chat.mFromName = session->mName;
- chat.mSourceType = CHAT_SOURCE_AGENT;
-
- if(is_busy && !is_linden)
- {
- quiet_chat = true;
- // TODO: Question: Return busy mode response here? Or maybe when session is started instead?
- }
-
- LL_DEBUGS("Voice") << "adding message, name " << session->mName << " session " << session->mIMSessionID << ", target " << session->mCallerID << LL_ENDL;
- gIMMgr->addMessage(session->mIMSessionID,
- session->mCallerID,
- session->mName.c_str(),
- message.c_str(),
- LLStringUtil::null, // default arg
- IM_NOTHING_SPECIAL, // default arg
- 0, // default arg
- LLUUID::null, // default arg
- LLVector3::zero, // default arg
- true); // prepend name and make it a link to the user's profile
- }
- }
- }
-}
-
-void LLVoiceClient::sessionNotificationEvent(std::string &sessionHandle, std::string &uriString, std::string &notificationType)
-{
- sessionState *session = findSession(sessionHandle);
-
- if(session)
- {
- participantState *participant = session->findParticipant(uriString);
- if(participant)
- {
- if (!stricmp(notificationType.c_str(), "Typing"))
- {
- // Other end started typing
- // TODO: The proper way to add a typing notification seems to be LLIMMgr::processIMTypingStart().
- // It requires an LLIMInfo for the message, which we don't have here.
- }
- else if (!stricmp(notificationType.c_str(), "NotTyping"))
- {
- // Other end stopped typing
- // TODO: The proper way to remove a typing notification seems to be LLIMMgr::processIMTypingStop().
- // It requires an LLIMInfo for the message, which we don't have here.
- }
- else
- {
- LL_DEBUGS("Voice") << "Unknown notification type " << notificationType << "for participant " << uriString << " in session " << session->mSIPURI << LL_ENDL;
- }
- }
- else
- {
- LL_DEBUGS("Voice") << "Unknown participant " << uriString << " in session " << session->mSIPURI << LL_ENDL;
- }
+ return mVoiceModule->sendTextMessage(participant_id, message);
}
else
{
- LL_DEBUGS("Voice") << "Unknown session handle " << sessionHandle << LL_ENDL;
- }
-}
-
-void LLVoiceClient::subscriptionEvent(std::string &buddyURI, std::string &subscriptionHandle, std::string &alias, std::string &displayName, std::string &applicationString, std::string &subscriptionType)
-{
- buddyListEntry *buddy = findBuddy(buddyURI);
-
- if(!buddy)
- {
- // Couldn't find buddy by URI, try converting the alias...
- if(!alias.empty())
- {
- LLUUID id;
- if(IDFromName(alias, id))
- {
- buddy = findBuddy(id);
- }
- }
- }
-
- if(buddy)
- {
- std::ostringstream stream;
-
- if(buddy->mCanSeeMeOnline)
- {
- // Sending the response will create an auto-accept rule
- buddy->mHasAutoAcceptListEntry = true;
- }
- else
- {
- // Sending the response will create a block rule
- buddy->mHasBlockListEntry = true;
- }
-
- if(buddy->mInSLFriends)
- {
- buddy->mInVivoxBuddies = true;
- }
-
- stream
- << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.SendSubscriptionReply.1\">"
- << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
- << "<BuddyURI>" << buddy->mURI << "</BuddyURI>"
- << "<RuleType>" << (buddy->mCanSeeMeOnline?"Allow":"Hide") << "</RuleType>"
- << "<AutoAccept>"<< (buddy->mInSLFriends?"1":"0")<< "</AutoAccept>"
- << "<SubscriptionHandle>" << subscriptionHandle << "</SubscriptionHandle>"
- << "</Request>"
- << "\n\n\n";
-
- writeString(stream.str());
- }
-}
-
-void LLVoiceClient::auxAudioPropertiesEvent(F32 energy)
-{
- LL_DEBUGS("Voice") << "got energy " << energy << LL_ENDL;
- mTuningEnergy = energy;
-}
-
-void LLVoiceClient::buddyListChanged()
-{
- // This is called after we receive a BuddyAndGroupListChangedEvent.
- mBuddyListMapPopulated = true;
- mFriendsListDirty = true;
-}
-
-void LLVoiceClient::muteListChanged()
-{
- // The user's mute list has been updated. Go through the current participant list and sync it with the mute list.
- if(mAudioSession)
- {
- participantMap::iterator iter = mAudioSession->mParticipantsByURI.begin();
-
- for(; iter != mAudioSession->mParticipantsByURI.end(); iter++)
- {
- participantState *p = iter->second;
-
- // Check to see if this participant is on the mute list already
- if(p->updateMuteState())
- mAudioSession->mVolumeDirty = true;
- }
- }
-}
-
-void LLVoiceClient::updateFriends(U32 mask)
-{
- if(mask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE | LLFriendObserver::POWERS))
- {
- // Just resend the whole friend list to the daemon
- mFriendsListDirty = true;
- }
-}
-
-/////////////////////////////
-// Managing list of participants
-LLVoiceClient::participantState::participantState(const std::string &uri) :
- mURI(uri),
- mPTT(false),
- mIsSpeaking(false),
- mIsModeratorMuted(false),
- mLastSpokeTimestamp(0.f),
- mPower(0.f),
- mVolume(-1),
- mOnMuteList(false),
- mUserVolume(-1),
- mVolumeDirty(false),
- mAvatarIDValid(false),
- mIsSelf(false)
-{
-}
-
-LLVoiceClient::participantState *LLVoiceClient::sessionState::addParticipant(const std::string &uri)
-{
- participantState *result = NULL;
- bool useAlternateURI = false;
-
- // Note: this is mostly the body of LLVoiceClient::sessionState::findParticipant(), but since we need to know if it
- // matched the alternate SIP URI (so we can add it properly), we need to reproduce it here.
- {
- participantMap::iterator iter = mParticipantsByURI.find(&uri);
-
- if(iter == mParticipantsByURI.end())
- {
- if(!mAlternateSIPURI.empty() && (uri == mAlternateSIPURI))
- {
- // This is a p2p session (probably with the SLIM client) with an alternate URI for the other participant.
- // Use mSIPURI instead, since it will be properly encoded.
- iter = mParticipantsByURI.find(&(mSIPURI));
- useAlternateURI = true;
- }
- }
-
- if(iter != mParticipantsByURI.end())
- {
- result = iter->second;
- }
- }
-
- if(!result)
- {
- // participant isn't already in one list or the other.
- result = new participantState(useAlternateURI?mSIPURI:uri);
- mParticipantsByURI.insert(participantMap::value_type(&(result->mURI), result));
- mParticipantsChanged = true;
-
- // Try to do a reverse transform on the URI to get the GUID back.
- {
- LLUUID id;
- if(IDFromName(result->mURI, id))
- {
- result->mAvatarIDValid = true;
- result->mAvatarID = id;
-
- if(result->updateMuteState())
- mVolumeDirty = true;
- }
- else
- {
- // Create a UUID by hashing the URI, but do NOT set mAvatarIDValid.
- // This tells both code in LLVoiceClient and code in llfloateractivespeakers.cpp that the ID will not be in the name cache.
- setUUIDFromStringHash(result->mAvatarID, uri);
- }
- }
-
- mParticipantsByUUID.insert(participantUUIDMap::value_type(&(result->mAvatarID), result));
-
- result->mUserVolume = LLSpeakerVolumeStorage::getInstance()->getSpeakerVolume(result->mAvatarID);
-
- LL_DEBUGS("Voice") << "participant \"" << result->mURI << "\" added." << LL_ENDL;
- }
-
- return result;
-}
-
-bool LLVoiceClient::participantState::updateMuteState()
-{
- bool result = false;
-
- if(mAvatarIDValid)
- {
- bool isMuted = LLMuteList::getInstance()->isMuted(mAvatarID, LLMute::flagVoiceChat);
- if(mOnMuteList != isMuted)
- {
- mOnMuteList = isMuted;
- mVolumeDirty = true;
- result = true;
- }
- }
- return result;
-}
-
-bool LLVoiceClient::participantState::isAvatar()
-{
- return mAvatarIDValid;
-}
-
-void LLVoiceClient::sessionState::removeParticipant(LLVoiceClient::participantState *participant)
-{
- if(participant)
- {
- participantMap::iterator iter = mParticipantsByURI.find(&(participant->mURI));
- participantUUIDMap::iterator iter2 = mParticipantsByUUID.find(&(participant->mAvatarID));
-
- LL_DEBUGS("Voice") << "participant \"" << participant->mURI << "\" (" << participant->mAvatarID << ") removed." << LL_ENDL;
-
- if(iter == mParticipantsByURI.end())
- {
- LL_ERRS("Voice") << "Internal error: participant " << participant->mURI << " not in URI map" << LL_ENDL;
- }
- else if(iter2 == mParticipantsByUUID.end())
- {
- LL_ERRS("Voice") << "Internal error: participant ID " << participant->mAvatarID << " not in UUID map" << LL_ENDL;
- }
- else if(iter->second != iter2->second)
- {
- LL_ERRS("Voice") << "Internal error: participant mismatch!" << LL_ENDL;
- }
- else
- {
- mParticipantsByURI.erase(iter);
- mParticipantsByUUID.erase(iter2);
-
- delete participant;
- mParticipantsChanged = true;
- }
- }
-}
-
-void LLVoiceClient::sessionState::removeAllParticipants()
-{
- LL_DEBUGS("Voice") << "called" << LL_ENDL;
-
- while(!mParticipantsByURI.empty())
- {
- removeParticipant(mParticipantsByURI.begin()->second);
- }
-
- if(!mParticipantsByUUID.empty())
- {
- LL_ERRS("Voice") << "Internal error: empty URI map, non-empty UUID map" << LL_ENDL;
- }
-}
-
-LLVoiceClient::participantMap *LLVoiceClient::getParticipantList(void)
-{
- participantMap *result = NULL;
- if(mAudioSession)
- {
- result = &(mAudioSession->mParticipantsByURI);
- }
- return result;
-}
-
-void LLVoiceClient::getParticipantsUUIDSet(std::set<LLUUID>& participant_uuids)
-{
- if (NULL == mAudioSession) return;
-
- participantUUIDMap::const_iterator it = mAudioSession->mParticipantsByUUID.begin(),
- it_end = mAudioSession->mParticipantsByUUID.end();
- for (; it != it_end; ++it)
- {
- participant_uuids.insert((*(*it).first));
- }
-}
-
-LLVoiceClient::participantState *LLVoiceClient::sessionState::findParticipant(const std::string &uri)
-{
- participantState *result = NULL;
-
- participantMap::iterator iter = mParticipantsByURI.find(&uri);
-
- if(iter == mParticipantsByURI.end())
- {
- if(!mAlternateSIPURI.empty() && (uri == mAlternateSIPURI))
- {
- // This is a p2p session (probably with the SLIM client) with an alternate URI for the other participant.
- // Look up the other URI
- iter = mParticipantsByURI.find(&(mSIPURI));
- }
- }
-
- if(iter != mParticipantsByURI.end())
- {
- result = iter->second;
- }
-
- return result;
+ return FALSE;
+ }
}
-LLVoiceClient::participantState* LLVoiceClient::sessionState::findParticipantByID(const LLUUID& id)
+void LLVoiceClient::endUserIMSession(const LLUUID& participant_id)
{
- participantState * result = NULL;
- participantUUIDMap::iterator iter = mParticipantsByUUID.find(&id);
-
- if(iter != mParticipantsByUUID.end())
+ if (mVoiceModule)
{
- result = iter->second;
+ mVoiceModule->endUserIMSession(participant_id);
}
-
- return result;
}
-LLVoiceClient::participantState* LLVoiceClient::findParticipantByID(const LLUUID& id)
-{
- participantState * result = NULL;
-
- if(mAudioSession)
- {
- result = mAudioSession->findParticipantByID(id);
- }
-
- return result;
-}
-
-
-void LLVoiceClient::parcelChanged()
-{
- if(getState() >= stateNoChannel)
- {
- // If the user is logged in, start a channel lookup.
- LL_DEBUGS("Voice") << "sending ParcelVoiceInfoRequest (" << mCurrentRegionName << ", " << mCurrentParcelLocalID << ")" << LL_ENDL;
-
- std::string url = gAgent.getRegion()->getCapability("ParcelVoiceInfoRequest");
- LLSD data;
- LLHTTPClient::post(
- url,
- data,
- new LLVoiceClientCapResponder);
- }
- else
- {
- // The transition to stateNoChannel needs to kick this off again.
- LL_INFOS("Voice") << "not logged in yet, deferring" << LL_ENDL;
- }
-}
-
-void LLVoiceClient::switchChannel(
- std::string uri,
- bool spatial,
- bool no_reconnect,
- bool is_p2p,
- std::string hash)
-{
- bool needsSwitch = false;
-
- LL_DEBUGS("Voice")
- << "called in state " << state2string(getState())
- << " with uri \"" << uri << "\""
- << (spatial?", spatial is true":", spatial is false")
- << LL_ENDL;
-
- switch(getState())
- {
- case stateJoinSessionFailed:
- case stateJoinSessionFailedWaiting:
- case stateNoChannel:
- // Always switch to the new URI from these states.
- needsSwitch = true;
- break;
-
- default:
- if(mSessionTerminateRequested)
- {
- // If a terminate has been requested, we need to compare against where the URI we're already headed to.
- if(mNextAudioSession)
- {
- if(mNextAudioSession->mSIPURI != uri)
- needsSwitch = true;
- }
- else
- {
- // mNextAudioSession is null -- this probably means we're on our way back to spatial.
- if(!uri.empty())
- {
- // We do want to process a switch in this case.
- needsSwitch = true;
- }
- }
- }
- else
- {
- // Otherwise, compare against the URI we're in now.
- if(mAudioSession)
- {
- if(mAudioSession->mSIPURI != uri)
- {
- needsSwitch = true;
- }
- }
- else
- {
- if(!uri.empty())
- {
- // mAudioSession is null -- it's not clear what case would cause this.
- // For now, log it as a warning and see if it ever crops up.
- LL_WARNS("Voice") << "No current audio session." << LL_ENDL;
- }
- }
- }
- break;
- }
-
- if(needsSwitch)
- {
- if(uri.empty())
- {
- // Leave any channel we may be in
- LL_DEBUGS("Voice") << "leaving channel" << LL_ENDL;
-
- sessionState *oldSession = mNextAudioSession;
- mNextAudioSession = NULL;
-
- // The old session may now need to be deleted.
- reapSession(oldSession);
-
- notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_VOICE_DISABLED);
- }
- else
- {
- LL_DEBUGS("Voice") << "switching to channel " << uri << LL_ENDL;
-
- mNextAudioSession = addSession(uri);
- mNextAudioSession->mHash = hash;
- mNextAudioSession->mIsSpatial = spatial;
- mNextAudioSession->mReconnect = !no_reconnect;
- mNextAudioSession->mIsP2P = is_p2p;
- }
-
- if(getState() <= stateNoChannel)
- {
- // We're already set up to join a channel, just needed to fill in the session URI
- }
- else
- {
- // State machine will come around and rejoin if uri/handle is not empty.
- sessionTerminate();
- }
- }
-}
+//----------------------------------------------
+// channels
-void LLVoiceClient::joinSession(sessionState *session)
+bool LLVoiceClient::inProximalChannel()
{
- mNextAudioSession = session;
-
- if(getState() <= stateNoChannel)
+ if (mVoiceModule)
{
- // We're already set up to join a channel, just needed to fill in the session handle
+ return mVoiceModule->inProximalChannel();
}
else
{
- // State machine will come around and rejoin if uri/handle is not empty.
- sessionTerminate();
+ return false;
}
}
@@ -5337,1905 +380,612 @@ void LLVoiceClient::setNonSpatialChannel(
const std::string &uri,
const std::string &credentials)
{
- switchChannel(uri, false, false, false, credentials);
+ if (mVoiceModule) mVoiceModule->setNonSpatialChannel(uri, credentials);
}
void LLVoiceClient::setSpatialChannel(
const std::string &uri,
const std::string &credentials)
{
- mSpatialSessionURI = uri;
- mSpatialSessionCredentials = credentials;
- mAreaVoiceDisabled = mSpatialSessionURI.empty();
-
- LL_DEBUGS("Voice") << "got spatial channel uri: \"" << uri << "\"" << LL_ENDL;
-
- if((mAudioSession && !(mAudioSession->mIsSpatial)) || (mNextAudioSession && !(mNextAudioSession->mIsSpatial)))
- {
- // User is in a non-spatial chat or joining a non-spatial chat. Don't switch channels.
- LL_INFOS("Voice") << "in non-spatial chat, not switching channels" << LL_ENDL;
- }
- else
- {
- switchChannel(mSpatialSessionURI, true, false, false, mSpatialSessionCredentials);
- }
+ if (mVoiceModule) mVoiceModule->setSpatialChannel(uri, credentials);
}
-void LLVoiceClient::callUser(const LLUUID &uuid)
+void LLVoiceClient::leaveNonSpatialChannel()
{
- std::string userURI = sipURIFromID(uuid);
-
- switchChannel(userURI, false, true, true);
+ if (mVoiceModule) mVoiceModule->leaveNonSpatialChannel();
}
-LLVoiceClient::sessionState* LLVoiceClient::startUserIMSession(const LLUUID &uuid)
-{
- // Figure out if a session with the user already exists
- sessionState *session = findSession(uuid);
- if(!session)
- {
- // No session with user, need to start one.
- std::string uri = sipURIFromID(uuid);
- session = addSession(uri);
- session->mIsSpatial = false;
- session->mReconnect = false;
- session->mIsP2P = true;
- session->mCallerID = uuid;
- }
-
- if(session)
- {
- if(session->mHandle.empty())
- {
- // Session isn't active -- start it up.
- sessionCreateSendMessage(session, false, true);
- }
- else
- {
- // Session is already active -- start up text.
- sessionTextConnectSendMessage(session);
- }
- }
-
- return session;
-}
-
-bool LLVoiceClient::sendTextMessage(const LLUUID& participant_id, const std::string& message)
+void LLVoiceClient::leaveChannel(void)
{
- bool result = false;
-
- // Attempt to locate the indicated session
- sessionState *session = startUserIMSession(participant_id);
- if(session)
- {
- // found the session, attempt to send the message
- session->mTextMsgQueue.push(message);
-
- // Try to send queued messages (will do nothing if the session is not open yet)
- sendQueuedTextMessages(session);
-
- // The message is queued, so we succeed.
- result = true;
- }
- else
- {
- LL_DEBUGS("Voice") << "Session not found for participant ID " << participant_id << LL_ENDL;
- }
-
- return result;
+ if (mVoiceModule) mVoiceModule->leaveChannel();
}
-void LLVoiceClient::sendQueuedTextMessages(sessionState *session)
+std::string LLVoiceClient::getCurrentChannel()
{
- if(session->mTextStreamState == 1)
+ if (mVoiceModule)
{
- if(!session->mTextMsgQueue.empty())
- {
- std::ostringstream stream;
-
- while(!session->mTextMsgQueue.empty())
- {
- std::string message = session->mTextMsgQueue.front();
- session->mTextMsgQueue.pop();
- stream
- << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.SendMessage.1\">"
- << "<SessionHandle>" << session->mHandle << "</SessionHandle>"
- << "<MessageHeader>text/HTML</MessageHeader>"
- << "<MessageBody>" << message << "</MessageBody>"
- << "</Request>"
- << "\n\n\n";
- }
- writeString(stream.str());
- }
+ return mVoiceModule->getCurrentChannel();
}
else
{
- // Session isn't connected yet, defer until later.
+ return std::string();
}
}
-void LLVoiceClient::endUserIMSession(const LLUUID &uuid)
-{
- // Figure out if a session with the user exists
- sessionState *session = findSession(uuid);
- if(session)
- {
- // found the session
- if(!session->mHandle.empty())
- {
- sessionTextDisconnectSendMessage(session);
- }
- }
- else
- {
- LL_DEBUGS("Voice") << "Session not found for participant ID " << uuid << LL_ENDL;
- }
-}
-
-bool LLVoiceClient::answerInvite(std::string &sessionHandle)
-{
- // this is only ever used to answer incoming p2p call invites.
-
- sessionState *session = findSession(sessionHandle);
- if(session)
- {
- session->mIsSpatial = false;
- session->mReconnect = false;
- session->mIsP2P = true;
- joinSession(session);
- return true;
- }
-
- return false;
-}
+//---------------------------------------
+// invitations
-bool LLVoiceClient::isOnlineSIP(const LLUUID &id)
+void LLVoiceClient::callUser(const LLUUID &uuid)
{
- bool result = false;
- buddyListEntry *buddy = findBuddy(id);
- if(buddy)
- {
- result = buddy->mOnlineSLim;
- LL_DEBUGS("Voice") << "Buddy " << buddy->mDisplayName << " is SIP " << (result?"online":"offline") << LL_ENDL;
- }
-
- if(!result)
- {
- // This user isn't on the buddy list or doesn't show online status through the buddy list, but could be a participant in an existing session if they initiated a text IM.
- sessionState *session = findSession(id);
- if(session && !session->mHandle.empty())
- {
- if((session->mTextStreamState != streamStateUnknown) || (session->mMediaStreamState > streamStateIdle))
- {
- LL_DEBUGS("Voice") << "Open session with " << id << " found, returning SIP online state" << LL_ENDL;
- // we have a p2p text session open with this user, so by definition they're online.
- result = true;
- }
- }
- }
-
- return result;
+ if (mVoiceModule) mVoiceModule->callUser(uuid);
}
-// Returns true if the indicated participant in the current audio session is really an SL avatar.
-// Currently this will be false only for PSTN callers into group chats, and PSTN p2p calls.
-bool LLVoiceClient::isParticipantAvatar(const LLUUID &id)
+bool LLVoiceClient::isValidChannel(std::string &session_handle)
{
- bool result = true;
- sessionState *session = findSession(id);
-
- if(session != NULL)
+ if (mVoiceModule)
{
- // this is a p2p session with the indicated caller, or the session with the specified UUID.
- if(session->mSynthesizedCallerID)
- result = false;
+ return mVoiceModule->isValidChannel(session_handle);
}
else
{
- // Didn't find a matching session -- check the current audio session for a matching participant
- if(mAudioSession != NULL)
- {
- participantState *participant = findParticipantByID(id);
- if(participant != NULL)
- {
- result = participant->isAvatar();
- }
- }
- }
-
- return result;
-}
-
-// Returns true if calling back the session URI after the session has closed is possible.
-// Currently this will be false only for PSTN P2P calls.
-bool LLVoiceClient::isSessionCallBackPossible(const LLUUID &session_id)
-{
- bool result = true;
- sessionState *session = findSession(session_id);
-
- if(session != NULL)
- {
- result = session->isCallBackPossible();
- }
-
- return result;
-}
-
-// Returns true if the session can accepte text IM's.
-// Currently this will be false only for PSTN P2P calls.
-bool LLVoiceClient::isSessionTextIMPossible(const LLUUID &session_id)
-{
- bool result = true;
- sessionState *session = findSession(session_id);
-
- if(session != NULL)
- {
- result = session->isTextIMPossible();
- }
-
- return result;
-}
-
-
-void LLVoiceClient::declineInvite(std::string &sessionHandle)
-{
- sessionState *session = findSession(sessionHandle);
- if(session)
- {
- sessionMediaDisconnectSendMessage(session);
- }
-}
-
-void LLVoiceClient::leaveNonSpatialChannel()
-{
- LL_DEBUGS("Voice")
- << "called in state " << state2string(getState())
- << LL_ENDL;
-
- // Make sure we don't rejoin the current session.
- sessionState *oldNextSession = mNextAudioSession;
- mNextAudioSession = NULL;
-
- // Most likely this will still be the current session at this point, but check it anyway.
- reapSession(oldNextSession);
-
- verifySessionState();
-
- sessionTerminate();
-}
-
-std::string LLVoiceClient::getCurrentChannel()
-{
- std::string result;
-
- if((getState() == stateRunning) && !mSessionTerminateRequested)
- {
- result = getAudioSessionURI();
+ return false;
}
-
- return result;
}
-bool LLVoiceClient::inProximalChannel()
+bool LLVoiceClient::answerInvite(std::string &channelHandle)
{
- bool result = false;
-
- if((getState() == stateRunning) && !mSessionTerminateRequested)
+ if (mVoiceModule)
{
- result = inSpatialChannel();
+ return mVoiceModule->answerInvite(channelHandle);
}
-
- return result;
-}
-
-std::string LLVoiceClient::sipURIFromID(const LLUUID &id)
-{
- std::string result;
- result = "sip:";
- result += nameFromID(id);
- result += "@";
- result += mVoiceSIPURIHostName;
-
- return result;
-}
-
-std::string LLVoiceClient::sipURIFromAvatar(LLVOAvatar *avatar)
-{
- std::string result;
- if(avatar)
- {
- result = "sip:";
- result += nameFromID(avatar->getID());
- result += "@";
- result += mVoiceSIPURIHostName;
- }
-
- return result;
-}
-
-std::string LLVoiceClient::nameFromAvatar(LLVOAvatar *avatar)
-{
- std::string result;
- if(avatar)
- {
- result = nameFromID(avatar->getID());
- }
- return result;
-}
-
-std::string LLVoiceClient::nameFromID(const LLUUID &uuid)
-{
- std::string result;
-
- if (uuid.isNull()) {
- //VIVOX, the uuid emtpy look for the mURIString and return that instead.
- //result.assign(uuid.mURIStringName);
- LLStringUtil::replaceChar(result, '_', ' ');
- return result;
- }
- // Prepending this apparently prevents conflicts with reserved names inside the vivox and diamondware code.
- result = "x";
-
- // Base64 encode and replace the pieces of base64 that are less compatible
- // with e-mail local-parts.
- // See RFC-4648 "Base 64 Encoding with URL and Filename Safe Alphabet"
- result += LLBase64::encode(uuid.mData, UUID_BYTES);
- LLStringUtil::replaceChar(result, '+', '-');
- LLStringUtil::replaceChar(result, '/', '_');
-
- // If you need to transform a GUID to this form on the Mac OS X command line, this will do so:
- // echo -n x && (echo e669132a-6c43-4ee1-a78d-6c82fff59f32 |xxd -r -p |openssl base64|tr '/+' '_-')
-
- // The reverse transform can be done with:
- // echo 'x5mkTKmxDTuGnjWyC__WfMg==' |cut -b 2- -|tr '_-' '/+' |openssl base64 -d|xxd -p
-
- return result;
-}
-
-bool LLVoiceClient::IDFromName(const std::string inName, LLUUID &uuid)
-{
- bool result = false;
-
- // SLIM SDK: The "name" may actually be a SIP URI such as: "sip:xFnPP04IpREWNkuw1cOXlhw==@bhr.vivox.com"
- // If it is, convert to a bare name before doing the transform.
- std::string name = nameFromsipURI(inName);
-
- // Doesn't look like a SIP URI, assume it's an actual name.
- if(name.empty())
- name = inName;
-
- // This will only work if the name is of the proper form.
- // As an example, the account name for Monroe Linden (UUID 1673cfd3-8229-4445-8d92-ec3570e5e587) is:
- // "xFnPP04IpREWNkuw1cOXlhw=="
-
- if((name.size() == 25) && (name[0] == 'x') && (name[23] == '=') && (name[24] == '='))
- {
- // The name appears to have the right form.
-
- // Reverse the transforms done by nameFromID
- std::string temp = name;
- LLStringUtil::replaceChar(temp, '-', '+');
- LLStringUtil::replaceChar(temp, '_', '/');
-
- U8 rawuuid[UUID_BYTES + 1];
- int len = apr_base64_decode_binary(rawuuid, temp.c_str() + 1);
- if(len == UUID_BYTES)
- {
- // The decode succeeded. Stuff the bits into the result's UUID
- memcpy(uuid.mData, rawuuid, UUID_BYTES);
- result = true;
- }
- }
-
- if(!result)
+ else
{
- // VIVOX: not a standard account name, just copy the URI name mURIString field
- // and hope for the best. bpj
- uuid.setNull(); // VIVOX, set the uuid field to nulls
+ return false;
}
-
- return result;
-}
-
-std::string LLVoiceClient::displayNameFromAvatar(LLVOAvatar *avatar)
-{
- return avatar->getFullname();
}
-std::string LLVoiceClient::sipURIFromName(std::string &name)
+void LLVoiceClient::declineInvite(std::string &channelHandle)
{
- std::string result;
- result = "sip:";
- result += name;
- result += "@";
- result += mVoiceSIPURIHostName;
-
-// LLStringUtil::toLower(result);
-
- return result;
+ if (mVoiceModule) mVoiceModule->declineInvite(channelHandle);
}
-std::string LLVoiceClient::nameFromsipURI(const std::string &uri)
-{
- std::string result;
- std::string::size_type sipOffset, atOffset;
- sipOffset = uri.find("sip:");
- atOffset = uri.find("@");
- if((sipOffset != std::string::npos) && (atOffset != std::string::npos))
- {
- result = uri.substr(sipOffset + 4, atOffset - (sipOffset + 4));
- }
-
- return result;
-}
+//------------------------------------------
+// Volume/gain
-bool LLVoiceClient::inSpatialChannel(void)
-{
- bool result = false;
-
- if(mAudioSession)
- result = mAudioSession->mIsSpatial;
-
- return result;
-}
-std::string LLVoiceClient::getAudioSessionURI()
+void LLVoiceClient::setVoiceVolume(F32 volume)
{
- std::string result;
-
- if(mAudioSession)
- result = mAudioSession->mSIPURI;
-
- return result;
+ if (mVoiceModule) mVoiceModule->setVoiceVolume(volume);
}
-std::string LLVoiceClient::getAudioSessionHandle()
+void LLVoiceClient::setMicGain(F32 volume)
{
- std::string result;
-
- if(mAudioSession)
- result = mAudioSession->mHandle;
-
- return result;
+ if (mVoiceModule) mVoiceModule->setMicGain(volume);
}
-/////////////////////////////
-// Sending updates of current state
+//------------------------------------------
+// enable/disable voice features
-void LLVoiceClient::enforceTether(void)
+bool LLVoiceClient::voiceEnabled()
{
- LLVector3d tethered = mCameraRequestedPosition;
-
- // constrain 'tethered' to within 50m of mAvatarPosition.
+ if (mVoiceModule)
{
- F32 max_dist = 50.0f;
- LLVector3d camera_offset = mCameraRequestedPosition - mAvatarPosition;
- F32 camera_distance = (F32)camera_offset.magVec();
- if(camera_distance > max_dist)
- {
- tethered = mAvatarPosition +
- (max_dist / camera_distance) * camera_offset;
- }
+ return mVoiceModule->voiceEnabled();
}
-
- if(dist_vec(mCameraPosition, tethered) > 0.1)
+ else
{
- mCameraPosition = tethered;
- mSpatialCoordsDirty = true;
+ return false;
}
}
-void LLVoiceClient::updatePosition(void)
-{
-
- if(gVoiceClient)
- {
- LLVOAvatar *agent = gAgent.getAvatarObject();
- LLViewerRegion *region = gAgent.getRegion();
- if(region && agent)
- {
- LLMatrix3 rot;
- LLVector3d pos;
-
- // TODO: If camera and avatar velocity are actually used by the voice system, we could compute them here...
- // They're currently always set to zero.
-
- // Send the current camera position to the voice code
- rot.setRows(LLViewerCamera::getInstance()->getAtAxis(), LLViewerCamera::getInstance()->getLeftAxis (), LLViewerCamera::getInstance()->getUpAxis());
- pos = gAgent.getRegion()->getPosGlobalFromRegion(LLViewerCamera::getInstance()->getOrigin());
-
- gVoiceClient->setCameraPosition(
- pos, // position
- LLVector3::zero, // velocity
- rot); // rotation matrix
-
- // Send the current avatar position to the voice code
- rot = agent->getRootJoint()->getWorldRotation().getMatrix3();
-
- pos = agent->getPositionGlobal();
- // TODO: Can we get the head offset from outside the LLVOAvatar?
-// pos += LLVector3d(mHeadOffset);
- pos += LLVector3d(0.f, 0.f, 1.f);
-
- gVoiceClient->setAvatarPosition(
- pos, // position
- LLVector3::zero, // velocity
- rot); // rotation matrix
- }
- }
-}
-
-void LLVoiceClient::setCameraPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot)
+void LLVoiceClient::setVoiceEnabled(bool enabled)
{
- mCameraRequestedPosition = position;
-
- if(mCameraVelocity != velocity)
- {
- mCameraVelocity = velocity;
- mSpatialCoordsDirty = true;
- }
-
- if(mCameraRot != rot)
- {
- mCameraRot = rot;
- mSpatialCoordsDirty = true;
- }
+ if (mVoiceModule) mVoiceModule->setVoiceEnabled(enabled);
}
-void LLVoiceClient::setAvatarPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot)
+void LLVoiceClient::setLipSyncEnabled(BOOL enabled)
{
- if(dist_vec(mAvatarPosition, position) > 0.1)
- {
- mAvatarPosition = position;
- mSpatialCoordsDirty = true;
- }
-
- if(mAvatarVelocity != velocity)
- {
- mAvatarVelocity = velocity;
- mSpatialCoordsDirty = true;
- }
-
- if(mAvatarRot != rot)
- {
- mAvatarRot = rot;
- mSpatialCoordsDirty = true;
- }
+ if (mVoiceModule) mVoiceModule->setLipSyncEnabled(enabled);
}
-bool LLVoiceClient::channelFromRegion(LLViewerRegion *region, std::string &name)
+BOOL LLVoiceClient::lipSyncEnabled()
{
- bool result = false;
-
- if(region)
+ if (mVoiceModule)
{
- name = region->getName();
+ return mVoiceModule->lipSyncEnabled();
}
-
- if(!name.empty())
- result = true;
-
- return result;
-}
-
-void LLVoiceClient::leaveChannel(void)
-{
- if(getState() == stateRunning)
+ else
{
- LL_DEBUGS("Voice") << "leaving channel for teleport/logout" << LL_ENDL;
- mChannelName.clear();
- sessionTerminate();
+ return false;
}
}
void LLVoiceClient::setMuteMic(bool muted)
{
- mMuteMic = muted;
+ if (mVoiceModule) mVoiceModule->setMuteMic(muted);
}
-bool LLVoiceClient::getMuteMic() const
-{
- return mMuteMic;
-}
+
+// ----------------------------------------------
+// PTT
void LLVoiceClient::setUserPTTState(bool ptt)
{
- mUserPTTState = ptt;
+ if (mVoiceModule) mVoiceModule->setUserPTTState(ptt);
}
bool LLVoiceClient::getUserPTTState()
{
- return mUserPTTState;
-}
-
-void LLVoiceClient::toggleUserPTTState(void)
-{
- mUserPTTState = !mUserPTTState;
-}
-
-void LLVoiceClient::setVoiceEnabled(bool enabled)
-{
- if (enabled != mVoiceEnabled)
+ if (mVoiceModule)
{
- mVoiceEnabled = enabled;
- LLVoiceClientStatusObserver::EStatusType status;
-
- if (enabled)
- {
- LLVoiceChannel::getCurrentVoiceChannel()->activate();
- status = LLVoiceClientStatusObserver::STATUS_VOICE_ENABLED;
- }
- else
- {
- // Turning voice off looses your current channel -- this makes sure the UI isn't out of sync when you re-enable it.
- LLVoiceChannel::getCurrentVoiceChannel()->deactivate();
- status = LLVoiceClientStatusObserver::STATUS_VOICE_DISABLED;
- }
-
- notifyStatusObservers(status);
- }
-}
-
-bool LLVoiceClient::voiceEnabled()
-{
- return gSavedSettings.getBOOL("EnableVoiceChat") && !gSavedSettings.getBOOL("CmdLineDisableVoice");
-}
-
-//AD *TODO: investigate possible merge of voiceWorking() and voiceEnabled() into one non-static method
-bool LLVoiceClient::voiceWorking()
-{
- //Added stateSessionTerminated state to avoid problems with call in parcels with disabled voice (EXT-4758)
- return (stateLoggedIn <= mState) && (mState <= stateSessionTerminated);
-}
-
-void LLVoiceClient::setLipSyncEnabled(BOOL enabled)
-{
- mLipSyncEnabled = enabled;
-}
-
-BOOL LLVoiceClient::lipSyncEnabled()
-{
-
- if ( mVoiceEnabled && stateDisabled != getState() )
- {
- return mLipSyncEnabled;
+ return mVoiceModule->getUserPTTState();
}
else
{
- return FALSE;
+ return false;
}
}
void LLVoiceClient::setUsePTT(bool usePTT)
{
- if(usePTT && !mUsePTT)
- {
- // When the user turns on PTT, reset the current state.
- mUserPTTState = false;
- }
- mUsePTT = usePTT;
+ if (mVoiceModule) mVoiceModule->setUsePTT(usePTT);
}
void LLVoiceClient::setPTTIsToggle(bool PTTIsToggle)
{
- if(!PTTIsToggle && mPTTIsToggle)
- {
- // When the user turns off toggle, reset the current state.
- mUserPTTState = false;
- }
-
- mPTTIsToggle = PTTIsToggle;
+ if (mVoiceModule) mVoiceModule->setPTTIsToggle(PTTIsToggle);
}
bool LLVoiceClient::getPTTIsToggle()
{
- return mPTTIsToggle;
-}
-
-void LLVoiceClient::setPTTKey(std::string &key)
-{
- if(key == "MiddleMouse")
+ if (mVoiceModule)
{
- mPTTIsMiddleMouse = true;
+ return mVoiceModule->getPTTIsToggle();
}
- else
- {
- mPTTIsMiddleMouse = false;
- if(!LLKeyboard::keyFromString(key, &mPTTKey))
- {
- // If the call failed, don't match any key.
- key = KEY_NONE;
- }
+ else {
+ return false;
}
-}
-void LLVoiceClient::setEarLocation(S32 loc)
-{
- if(mEarLocation != loc)
- {
- LL_DEBUGS("Voice") << "Setting mEarLocation to " << loc << LL_ENDL;
-
- mEarLocation = loc;
- mSpatialCoordsDirty = true;
- }
}
-void LLVoiceClient::setVoiceVolume(F32 volume)
+void LLVoiceClient::inputUserControlState(bool down)
{
- int scaled_volume = scale_speaker_volume(volume);
-
- if(scaled_volume != mSpeakerVolume)
- {
- int min_volume = scale_speaker_volume(0);
- if((scaled_volume == min_volume) || (mSpeakerVolume == min_volume))
- {
- mSpeakerMuteDirty = true;
- }
-
- mSpeakerVolume = scaled_volume;
- mSpeakerVolumeDirty = true;
- }
+ if (mVoiceModule) mVoiceModule->inputUserControlState(down);
}
-void LLVoiceClient::setMicGain(F32 volume)
+void LLVoiceClient::toggleUserPTTState(void)
{
- int scaled_volume = scale_mic_volume(volume);
-
- if(scaled_volume != mMicVolume)
- {
- mMicVolume = scaled_volume;
- mMicVolumeDirty = true;
- }
+ if (mVoiceModule) mVoiceModule->toggleUserPTTState();
}
void LLVoiceClient::keyDown(KEY key, MASK mask)
{
- if (gKeyboard->getKeyRepeated(key))
- {
- // ignore auto-repeat keys
- return;
- }
-
- if(!mPTTIsMiddleMouse)
- {
- bool down = (mPTTKey != KEY_NONE)
- && gKeyboard->getKeyDown(mPTTKey);
- inputUserControlState(down);
- }
+ if (mVoiceModule) mVoiceModule->keyDown(key, mask);
}
void LLVoiceClient::keyUp(KEY key, MASK mask)
{
- if(!mPTTIsMiddleMouse)
- {
- bool down = (mPTTKey != KEY_NONE)
- && gKeyboard->getKeyDown(mPTTKey);
- inputUserControlState(down);
- }
-}
-void LLVoiceClient::inputUserControlState(bool down)
-{
- if(mPTTIsToggle)
- {
- if(down) // toggle open-mic state on 'down'
- {
- toggleUserPTTState();
- }
- }
- else // set open-mic state as an absolute
- {
- setUserPTTState(down);
- }
+ if (mVoiceModule) mVoiceModule->keyUp(key, mask);
}
void LLVoiceClient::middleMouseState(bool down)
{
- if(mPTTIsMiddleMouse)
- {
- inputUserControlState(down);
- }
+ if (mVoiceModule) mVoiceModule->middleMouseState(down);
}
-/////////////////////////////
-// Accessors for data related to nearby speakers
+
+//-------------------------------------------
+// nearby speaker accessors
+
BOOL LLVoiceClient::getVoiceEnabled(const LLUUID& id)
{
- BOOL result = FALSE;
- participantState *participant = findParticipantByID(id);
- if(participant)
+ if (mVoiceModule)
{
- // I'm not sure what the semantics of this should be.
- // For now, if we have any data about the user that came through the chat channel, assume they're voice-enabled.
- result = TRUE;
- }
-
- return result;
-}
-
-BOOL LLVoiceClient::getIsSpeaking(const LLUUID& id)
-{
- BOOL result = FALSE;
-
- participantState *participant = findParticipantByID(id);
- if(participant)
+ return mVoiceModule->getVoiceEnabled(id);
+ }
+ else
{
- if (participant->mSpeakingTimeout.getElapsedTimeF32() > SPEAKING_TIMEOUT)
- {
- participant->mIsSpeaking = FALSE;
- }
- result = participant->mIsSpeaking;
+ return FALSE;
}
-
- return result;
}
-BOOL LLVoiceClient::getIsModeratorMuted(const LLUUID& id)
+std::string LLVoiceClient::getDisplayName(const LLUUID& id)
{
- BOOL result = FALSE;
-
- participantState *participant = findParticipantByID(id);
- if(participant)
+ if (mVoiceModule)
{
- result = participant->mIsModeratorMuted;
+ return mVoiceModule->getDisplayName(id);
}
-
- return result;
-}
-
-F32 LLVoiceClient::getCurrentPower(const LLUUID& id)
-{
- F32 result = 0;
- participantState *participant = findParticipantByID(id);
- if(participant)
+ else
{
- result = participant->mPower;
+ return std::string();
}
-
- return result;
}
-
-std::string LLVoiceClient::getDisplayName(const LLUUID& id)
+bool LLVoiceClient::isVoiceWorking() const
{
- std::string result;
- participantState *participant = findParticipantByID(id);
- if(participant)
+ if (mVoiceModule)
{
- result = participant->mDisplayName;
+ return mVoiceModule->isVoiceWorking();
}
-
- return result;
+ return false;
}
-
-BOOL LLVoiceClient::getUsingPTT(const LLUUID& id)
+BOOL LLVoiceClient::isParticipantAvatar(const LLUUID& id)
{
- BOOL result = FALSE;
-
- participantState *participant = findParticipantByID(id);
- if(participant)
+ if (mVoiceModule)
{
- // I'm not sure what the semantics of this should be.
- // Does "using PTT" mean they're configured with a push-to-talk button?
- // For now, we know there's no PTT mechanism in place, so nobody is using it.
+ return mVoiceModule->isParticipantAvatar(id);
}
-
- return result;
-}
-
-BOOL LLVoiceClient::getOnMuteList(const LLUUID& id)
-{
- BOOL result = FALSE;
-
- participantState *participant = findParticipantByID(id);
- if(participant)
+ else
{
- result = participant->mOnMuteList;
+ return FALSE;
}
-
- return result;
}
-// External accessiors. Maps 0.0 to 1.0 to internal values 0-400 with .5 == 100
-// internal = 400 * external^2
-F32 LLVoiceClient::getUserVolume(const LLUUID& id)
+BOOL LLVoiceClient::isOnlineSIP(const LLUUID& id)
{
- F32 result = 0.0f;
-
- participantState *participant = findParticipantByID(id);
- if(participant)
+ if (mVoiceModule)
{
- S32 ires = 100; // nominal default volume
-
- if(participant->mIsSelf)
- {
- // Always make it look like the user's own volume is set at the default.
- }
- else if(participant->mUserVolume != -1)
- {
- // Use the internal volume
- ires = participant->mUserVolume;
-
- // Enable this when debugging voice slider issues. It's way to spammy even for debug-level logging.
-// LL_DEBUGS("Voice") << "mapping from mUserVolume " << ires << LL_ENDL;
- }
- else if(participant->mVolume != -1)
- {
- // Map backwards from vivox volume
-
- // Enable this when debugging voice slider issues. It's way to spammy even for debug-level logging.
-// LL_DEBUGS("Voice") << "mapping from mVolume " << participant->mVolume << LL_ENDL;
-
- if(participant->mVolume < 56)
- {
- ires = (participant->mVolume * 100) / 56;
- }
- else
- {
- ires = (((participant->mVolume - 56) * 300) / (100 - 56)) + 100;
- }
- }
- result = sqrtf(((F32)ires) / 400.f);
+ return mVoiceModule->isOnlineSIP(id);
}
-
- // Enable this when debugging voice slider issues. It's way to spammy even for debug-level logging.
-// LL_DEBUGS("Voice") << "returning " << result << LL_ENDL;
-
- return result;
-}
-
-void LLVoiceClient::setUserVolume(const LLUUID& id, F32 volume)
-{
- if(mAudioSession)
+ else
{
- participantState *participant = findParticipantByID(id);
- if (participant)
- {
- // store this volume setting for future sessions
- LLSpeakerVolumeStorage::getInstance()->storeSpeakerVolume(id, volume);
-
- // volume can amplify by as much as 4x!
- S32 ivol = (S32)(400.f * volume * volume);
- participant->mUserVolume = llclamp(ivol, 0, 400);
- participant->mVolumeDirty = TRUE;
- mAudioSession->mVolumeDirty = TRUE;
- }
+ return FALSE;
}
}
-std::string LLVoiceClient::getGroupID(const LLUUID& id)
+BOOL LLVoiceClient::getIsSpeaking(const LLUUID& id)
{
- std::string result;
-
- participantState *participant = findParticipantByID(id);
- if(participant)
+ if (mVoiceModule)
{
- result = participant->mGroupID;
+ return mVoiceModule->getIsSpeaking(id);
}
-
- return result;
-}
-
-BOOL LLVoiceClient::getAreaVoiceDisabled()
-{
- return mAreaVoiceDisabled;
-}
-
-void LLVoiceClient::recordingLoopStart(int seconds, int deltaFramesPerControlFrame)
-{
-// LL_DEBUGS("Voice") << "sending SessionGroup.ControlRecording (Start)" << LL_ENDL;
-
- if(!mMainSessionGroupHandle.empty())
+ else
{
- std::ostringstream stream;
- stream
- << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"SessionGroup.ControlRecording.1\">"
- << "<SessionGroupHandle>" << mMainSessionGroupHandle << "</SessionGroupHandle>"
- << "<RecordingControlType>Start</RecordingControlType>"
- << "<DeltaFramesPerControlFrame>" << deltaFramesPerControlFrame << "</DeltaFramesPerControlFrame>"
- << "<Filename>" << "" << "</Filename>"
- << "<EnableAudioRecordingEvents>false</EnableAudioRecordingEvents>"
- << "<LoopModeDurationSeconds>" << seconds << "</LoopModeDurationSeconds>"
- << "</Request>\n\n\n";
-
-
- writeString(stream.str());
+ return FALSE;
}
}
-void LLVoiceClient::recordingLoopSave(const std::string& filename)
+BOOL LLVoiceClient::getIsModeratorMuted(const LLUUID& id)
{
-// LL_DEBUGS("Voice") << "sending SessionGroup.ControlRecording (Flush)" << LL_ENDL;
-
- if(mAudioSession != NULL && !mAudioSession->mGroupHandle.empty())
+ if (mVoiceModule)
{
- std::ostringstream stream;
- stream
- << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"SessionGroup.ControlRecording.1\">"
- << "<SessionGroupHandle>" << mMainSessionGroupHandle << "</SessionGroupHandle>"
- << "<RecordingControlType>Flush</RecordingControlType>"
- << "<Filename>" << filename << "</Filename>"
- << "</Request>\n\n\n";
-
- writeString(stream.str());
+ return mVoiceModule->getIsModeratorMuted(id);
}
-}
-
-void LLVoiceClient::recordingStop()
-{
-// LL_DEBUGS("Voice") << "sending SessionGroup.ControlRecording (Stop)" << LL_ENDL;
-
- if(mAudioSession != NULL && !mAudioSession->mGroupHandle.empty())
+ else
{
- std::ostringstream stream;
- stream
- << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"SessionGroup.ControlRecording.1\">"
- << "<SessionGroupHandle>" << mMainSessionGroupHandle << "</SessionGroupHandle>"
- << "<RecordingControlType>Stop</RecordingControlType>"
- << "</Request>\n\n\n";
-
- writeString(stream.str());
+ return FALSE;
}
}
-void LLVoiceClient::filePlaybackStart(const std::string& filename)
-{
-// LL_DEBUGS("Voice") << "sending SessionGroup.ControlPlayback (Start)" << LL_ENDL;
-
- if(mAudioSession != NULL && !mAudioSession->mGroupHandle.empty())
+F32 LLVoiceClient::getCurrentPower(const LLUUID& id)
+{
+ if (mVoiceModule)
{
- std::ostringstream stream;
- stream
- << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"SessionGroup.ControlPlayback.1\">"
- << "<SessionGroupHandle>" << mMainSessionGroupHandle << "</SessionGroupHandle>"
- << "<RecordingControlType>Start</RecordingControlType>"
- << "<Filename>" << filename << "</Filename>"
- << "</Request>\n\n\n";
-
- writeString(stream.str());
+ return mVoiceModule->getCurrentPower(id);
}
-}
-
-void LLVoiceClient::filePlaybackStop()
-{
-// LL_DEBUGS("Voice") << "sending SessionGroup.ControlPlayback (Stop)" << LL_ENDL;
-
- if(mAudioSession != NULL && !mAudioSession->mGroupHandle.empty())
+ else
{
- std::ostringstream stream;
- stream
- << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"SessionGroup.ControlPlayback.1\">"
- << "<SessionGroupHandle>" << mMainSessionGroupHandle << "</SessionGroupHandle>"
- << "<RecordingControlType>Stop</RecordingControlType>"
- << "</Request>\n\n\n";
-
- writeString(stream.str());
+ return 0.0;
}
}
-void LLVoiceClient::filePlaybackSetPaused(bool paused)
+BOOL LLVoiceClient::getOnMuteList(const LLUUID& id)
{
- // TODO: Implement once Vivox gives me a sample
+ if (mVoiceModule)
+ {
+ return mVoiceModule->getOnMuteList(id);
+ }
+ else
+ {
+ return FALSE;
+ }
}
-void LLVoiceClient::filePlaybackSetMode(bool vox, float speed)
+F32 LLVoiceClient::getUserVolume(const LLUUID& id)
{
- // TODO: Implement once Vivox gives me a sample
+ if (mVoiceModule)
+ {
+ return mVoiceModule->getUserVolume(id);
+ }
+ else
+ {
+ return 0.0;
+ }
}
-LLVoiceClient::sessionState::sessionState() :
- mErrorStatusCode(0),
- mMediaStreamState(streamStateUnknown),
- mTextStreamState(streamStateUnknown),
- mCreateInProgress(false),
- mMediaConnectInProgress(false),
- mVoiceInvitePending(false),
- mTextInvitePending(false),
- mSynthesizedCallerID(false),
- mIsChannel(false),
- mIsSpatial(false),
- mIsP2P(false),
- mIncoming(false),
- mVoiceEnabled(false),
- mReconnect(false),
- mVolumeDirty(false),
- mParticipantsChanged(false)
+void LLVoiceClient::setUserVolume(const LLUUID& id, F32 volume)
{
+ if (mVoiceModule) mVoiceModule->setUserVolume(id, volume);
}
-LLVoiceClient::sessionState::~sessionState()
-{
- removeAllParticipants();
-}
+//--------------------------------------------------
+// status observers
-bool LLVoiceClient::sessionState::isCallBackPossible()
+void LLVoiceClient::addObserver(LLVoiceClientStatusObserver* observer)
{
- // This may change to be explicitly specified by vivox in the future...
- // Currently, only PSTN P2P calls cannot be returned.
- // Conveniently, this is also the only case where we synthesize a caller UUID.
- return !mSynthesizedCallerID;
+ if (mVoiceModule) mVoiceModule->addObserver(observer);
}
-bool LLVoiceClient::sessionState::isTextIMPossible()
+void LLVoiceClient::removeObserver(LLVoiceClientStatusObserver* observer)
{
- // This may change to be explicitly specified by vivox in the future...
- return !mSynthesizedCallerID;
+ if (mVoiceModule) mVoiceModule->removeObserver(observer);
}
-
-LLVoiceClient::sessionIterator LLVoiceClient::sessionsBegin(void)
+void LLVoiceClient::addObserver(LLFriendObserver* observer)
{
- return mSessions.begin();
+ if (mVoiceModule) mVoiceModule->addObserver(observer);
}
-LLVoiceClient::sessionIterator LLVoiceClient::sessionsEnd(void)
+void LLVoiceClient::removeObserver(LLFriendObserver* observer)
{
- return mSessions.end();
+ if (mVoiceModule) mVoiceModule->removeObserver(observer);
}
-
-LLVoiceClient::sessionState *LLVoiceClient::findSession(const std::string &handle)
+void LLVoiceClient::addObserver(LLVoiceClientParticipantObserver* observer)
{
- sessionState *result = NULL;
- sessionMap::iterator iter = mSessionsByHandle.find(&handle);
- if(iter != mSessionsByHandle.end())
- {
- result = iter->second;
- }
-
- return result;
-}
-
-LLVoiceClient::sessionState *LLVoiceClient::findSessionBeingCreatedByURI(const std::string &uri)
-{
- sessionState *result = NULL;
- for(sessionIterator iter = sessionsBegin(); iter != sessionsEnd(); iter++)
- {
- sessionState *session = *iter;
- if(session->mCreateInProgress && (session->mSIPURI == uri))
- {
- result = session;
- break;
- }
- }
-
- return result;
+ if (mVoiceModule) mVoiceModule->addObserver(observer);
}
-LLVoiceClient::sessionState *LLVoiceClient::findSession(const LLUUID &participant_id)
+void LLVoiceClient::removeObserver(LLVoiceClientParticipantObserver* observer)
{
- sessionState *result = NULL;
-
- for(sessionIterator iter = sessionsBegin(); iter != sessionsEnd(); iter++)
- {
- sessionState *session = *iter;
- if((session->mCallerID == participant_id) || (session->mIMSessionID == participant_id))
- {
- result = session;
- break;
- }
- }
-
- return result;
+ if (mVoiceModule) mVoiceModule->removeObserver(observer);
}
-LLVoiceClient::sessionState *LLVoiceClient::addSession(const std::string &uri, const std::string &handle)
+std::string LLVoiceClient::sipURIFromID(const LLUUID &id)
{
- sessionState *result = NULL;
-
- if(handle.empty())
- {
- // No handle supplied.
- // Check whether there's already a session with this URI
- for(sessionIterator iter = sessionsBegin(); iter != sessionsEnd(); iter++)
- {
- sessionState *s = *iter;
- if((s->mSIPURI == uri) || (s->mAlternateSIPURI == uri))
- {
- // TODO: I need to think about this logic... it's possible that this case should raise an internal error.
- result = s;
- break;
- }
- }
- }
- else // (!handle.empty())
+ if (mVoiceModule)
{
- // Check for an existing session with this handle
- sessionMap::iterator iter = mSessionsByHandle.find(&handle);
-
- if(iter != mSessionsByHandle.end())
- {
- result = iter->second;
- }
- }
-
- if(!result)
- {
- // No existing session found.
-
- LL_DEBUGS("Voice") << "adding new session: handle " << handle << " URI " << uri << LL_ENDL;
- result = new sessionState();
- result->mSIPURI = uri;
- result->mHandle = handle;
-
- mSessions.insert(result);
-
- if(!result->mHandle.empty())
- {
- mSessionsByHandle.insert(sessionMap::value_type(&(result->mHandle), result));
- }
+ return mVoiceModule->sipURIFromID(id);
}
else
{
- // Found an existing session
-
- if(uri != result->mSIPURI)
- {
- // TODO: Should this be an internal error?
- LL_DEBUGS("Voice") << "changing uri from " << result->mSIPURI << " to " << uri << LL_ENDL;
- setSessionURI(result, uri);
- }
-
- if(handle != result->mHandle)
- {
- if(handle.empty())
- {
- // There's at least one race condition where where addSession was clearing an existing session handle, which caused things to break.
- LL_DEBUGS("Voice") << "NOT clearing handle " << result->mHandle << LL_ENDL;
- }
- else
- {
- // TODO: Should this be an internal error?
- LL_DEBUGS("Voice") << "changing handle from " << result->mHandle << " to " << handle << LL_ENDL;
- setSessionHandle(result, handle);
- }
- }
-
- LL_DEBUGS("Voice") << "returning existing session: handle " << handle << " URI " << uri << LL_ENDL;
+ return std::string();
}
-
- verifySessionState();
-
- return result;
}
-void LLVoiceClient::setSessionHandle(sessionState *session, const std::string &handle)
+LLVoiceEffectInterface* LLVoiceClient::getVoiceEffectInterface() const
{
- // Have to remove the session from the handle-indexed map before changing the handle, or things will break badly.
-
- if(!session->mHandle.empty())
- {
- // Remove session from the map if it should have been there.
- sessionMap::iterator iter = mSessionsByHandle.find(&(session->mHandle));
- if(iter != mSessionsByHandle.end())
- {
- if(iter->second != session)
- {
- LL_ERRS("Voice") << "Internal error: session mismatch!" << LL_ENDL;
- }
-
- mSessionsByHandle.erase(iter);
- }
- else
- {
- LL_ERRS("Voice") << "Internal error: session handle not found in map!" << LL_ENDL;
- }
- }
-
- session->mHandle = handle;
-
- if(!handle.empty())
- {
- mSessionsByHandle.insert(sessionMap::value_type(&(session->mHandle), session));
- }
-
- verifySessionState();
+ return getVoiceEffectEnabled() ? dynamic_cast<LLVoiceEffectInterface*>(mVoiceModule) : NULL;
}
-void LLVoiceClient::setSessionURI(sessionState *session, const std::string &uri)
-{
- // There used to be a map of session URIs to sessions, which made this complex....
- session->mSIPURI = uri;
+///////////////////
+// version checking
- verifySessionState();
-}
-
-void LLVoiceClient::deleteSession(sessionState *session)
+class LLViewerRequiredVoiceVersion : public LLHTTPNode
{
- // Remove the session from the handle map
- if(!session->mHandle.empty())
+ static BOOL sAlertedUser;
+ virtual void post(
+ LLHTTPNode::ResponsePtr response,
+ const LLSD& context,
+ const LLSD& input) const
{
- sessionMap::iterator iter = mSessionsByHandle.find(&(session->mHandle));
- if(iter != mSessionsByHandle.end())
+ //You received this messsage (most likely on region cross or
+ //teleport)
+ if ( input.has("body") && input["body"].has("major_version") )
{
- if(iter->second != session)
+ int major_voice_version =
+ input["body"]["major_version"].asInteger();
+ // int minor_voice_version =
+ // input["body"]["minor_version"].asInteger();
+ LLVoiceVersionInfo versionInfo = LLVoiceClient::getInstance()->getVersion();
+
+ if (major_voice_version > 1)
{
- LL_ERRS("Voice") << "Internal error: session mismatch" << LL_ENDL;
+ if (!sAlertedUser)
+ {
+ //sAlertedUser = TRUE;
+ LLNotificationsUtil::add("VoiceVersionMismatch");
+ gSavedSettings.setBOOL("EnableVoiceChat", FALSE); // toggles listener
+ }
}
- mSessionsByHandle.erase(iter);
}
}
+};
- // Remove the session from the URI map
- mSessions.erase(session);
-
- // At this point, the session should be unhooked from all lists and all state should be consistent.
- verifySessionState();
-
- // If this is the current audio session, clean up the pointer which will soon be dangling.
- if(mAudioSession == session)
- {
- mAudioSession = NULL;
- mAudioSessionChanged = true;
- }
-
- // ditto for the next audio session
- if(mNextAudioSession == session)
- {
- mNextAudioSession = NULL;
- }
-
- // delete the session
- delete session;
-}
-
-void LLVoiceClient::deleteAllSessions()
-{
- LL_DEBUGS("Voice") << "called" << LL_ENDL;
-
- while(!mSessions.empty())
- {
- deleteSession(*(sessionsBegin()));
- }
-
- if(!mSessionsByHandle.empty())
- {
- LL_ERRS("Voice") << "Internal error: empty session map, non-empty handle map" << LL_ENDL;
- }
-}
-
-void LLVoiceClient::verifySessionState(void)
+class LLViewerParcelVoiceInfo : public LLHTTPNode
{
- // This is mostly intended for debugging problems with session state management.
- LL_DEBUGS("Voice") << "Total session count: " << mSessions.size() << " , session handle map size: " << mSessionsByHandle.size() << LL_ENDL;
-
- for(sessionIterator iter = sessionsBegin(); iter != sessionsEnd(); iter++)
+ virtual void post(
+ LLHTTPNode::ResponsePtr response,
+ const LLSD& context,
+ const LLSD& input) const
{
- sessionState *session = *iter;
-
- LL_DEBUGS("Voice") << "session " << session << ": handle " << session->mHandle << ", URI " << session->mSIPURI << LL_ENDL;
+ //the parcel you are in has changed something about its
+ //voice information
- if(!session->mHandle.empty())
+ //this is a misnomer, as it can also be when you are not in
+ //a parcel at all. Should really be something like
+ //LLViewerVoiceInfoChanged.....
+ if ( input.has("body") )
{
- // every session with a non-empty handle needs to be in the handle map
- sessionMap::iterator i2 = mSessionsByHandle.find(&(session->mHandle));
- if(i2 == mSessionsByHandle.end())
- {
- LL_ERRS("Voice") << "internal error (handle " << session->mHandle << " not found in session map)" << LL_ENDL;
- }
- else
+ LLSD body = input["body"];
+
+ //body has "region_name" (str), "parcel_local_id"(int),
+ //"voice_credentials" (map).
+
+ //body["voice_credentials"] has "channel_uri" (str),
+ //body["voice_credentials"] has "channel_credentials" (str)
+
+ //if we really wanted to be extra careful,
+ //we'd check the supplied
+ //local parcel id to make sure it's for the same parcel
+ //we believe we're in
+ if ( body.has("voice_credentials") )
{
- if(i2->second != session)
+ LLSD voice_credentials = body["voice_credentials"];
+ std::string uri;
+ std::string credentials;
+
+ if ( voice_credentials.has("channel_uri") )
{
- LL_ERRS("Voice") << "internal error (handle " << session->mHandle << " in session map points to another session)" << LL_ENDL;
+ uri = voice_credentials["channel_uri"].asString();
}
+ if ( voice_credentials.has("channel_credentials") )
+ {
+ credentials =
+ voice_credentials["channel_credentials"].asString();
+ }
+
+ LLVoiceClient::getInstance()->setSpatialChannel(uri, credentials);
}
}
}
-
- // check that every entry in the handle map points to a valid session in the session set
- for(sessionMap::iterator iter = mSessionsByHandle.begin(); iter != mSessionsByHandle.end(); iter++)
- {
- sessionState *session = iter->second;
- sessionIterator i2 = mSessions.find(session);
- if(i2 == mSessions.end())
- {
- LL_ERRS("Voice") << "internal error (session for handle " << session->mHandle << " not found in session map)" << LL_ENDL;
- }
- else
- {
- if(session->mHandle != (*i2)->mHandle)
- {
- LL_ERRS("Voice") << "internal error (session for handle " << session->mHandle << " points to session with different handle " << (*i2)->mHandle << ")" << LL_ENDL;
- }
- }
- }
-}
+};
-LLVoiceClient::buddyListEntry::buddyListEntry(const std::string &uri) :
- mURI(uri)
-{
- mOnlineSL = false;
- mOnlineSLim = false;
- mCanSeeMeOnline = true;
- mHasBlockListEntry = false;
- mHasAutoAcceptListEntry = false;
- mNameResolved = false;
- mInVivoxBuddies = false;
- mInSLFriends = false;
- mNeedsNameUpdate = false;
-}
+const std::string LLSpeakerVolumeStorage::SETTINGS_FILE_NAME = "volume_settings.xml";
-void LLVoiceClient::processBuddyListEntry(const std::string &uri, const std::string &displayName)
+LLSpeakerVolumeStorage::LLSpeakerVolumeStorage()
{
- buddyListEntry *buddy = addBuddy(uri, displayName);
- buddy->mInVivoxBuddies = true;
+ load();
}
-LLVoiceClient::buddyListEntry *LLVoiceClient::addBuddy(const std::string &uri)
+LLSpeakerVolumeStorage::~LLSpeakerVolumeStorage()
{
- std::string empty;
- buddyListEntry *buddy = addBuddy(uri, empty);
- if(buddy->mDisplayName.empty())
- {
- buddy->mNameResolved = false;
- }
- return buddy;
+ save();
}
-LLVoiceClient::buddyListEntry *LLVoiceClient::addBuddy(const std::string &uri, const std::string &displayName)
+void LLSpeakerVolumeStorage::storeSpeakerVolume(const LLUUID& speaker_id, F32 volume)
{
- buddyListEntry *result = NULL;
- buddyListMap::iterator iter = mBuddyListMap.find(&uri);
-
- if(iter != mBuddyListMap.end())
- {
- // Found a matching buddy already in the map.
- LL_DEBUGS("Voice") << "adding existing buddy " << uri << LL_ENDL;
- result = iter->second;
- }
-
- if(!result)
+ if ((volume >= LLVoiceClient::VOLUME_MIN) && (volume <= LLVoiceClient::VOLUME_MAX))
{
- // participant isn't already in one list or the other.
- LL_DEBUGS("Voice") << "adding new buddy " << uri << LL_ENDL;
- result = new buddyListEntry(uri);
- result->mDisplayName = displayName;
-
- if(IDFromName(uri, result->mUUID))
- {
- // Extracted UUID from name successfully.
- }
- else
- {
- LL_DEBUGS("Voice") << "Couldn't find ID for buddy " << uri << " (\"" << displayName << "\")" << LL_ENDL;
- }
+ mSpeakersData[speaker_id] = volume;
- mBuddyListMap.insert(buddyListMap::value_type(&(result->mURI), result));
+ // Enable this when debugging voice slider issues. It's way to spammy even for debug-level logging.
+ // LL_DEBUGS("Voice") << "Stored volume = " << volume << " for " << id << LL_ENDL;
}
-
- return result;
-}
-
-LLVoiceClient::buddyListEntry *LLVoiceClient::findBuddy(const std::string &uri)
-{
- buddyListEntry *result = NULL;
- buddyListMap::iterator iter = mBuddyListMap.find(&uri);
- if(iter != mBuddyListMap.end())
- {
- result = iter->second;
- }
-
- return result;
-}
-
-LLVoiceClient::buddyListEntry *LLVoiceClient::findBuddy(const LLUUID &id)
-{
- buddyListEntry *result = NULL;
- buddyListMap::iterator iter;
-
- for(iter = mBuddyListMap.begin(); iter != mBuddyListMap.end(); iter++)
+ else
{
- if(iter->second->mUUID == id)
- {
- result = iter->second;
- break;
- }
+ LL_WARNS("Voice") << "Attempted to store out of range volume " << volume << " for " << speaker_id << LL_ENDL;
+ llassert(0);
}
-
- return result;
}
-LLVoiceClient::buddyListEntry *LLVoiceClient::findBuddyByDisplayName(const std::string &name)
+bool LLSpeakerVolumeStorage::getSpeakerVolume(const LLUUID& speaker_id, F32& volume)
{
- buddyListEntry *result = NULL;
- buddyListMap::iterator iter;
-
- for(iter = mBuddyListMap.begin(); iter != mBuddyListMap.end(); iter++)
- {
- if(iter->second->mDisplayName == name)
- {
- result = iter->second;
- break;
- }
- }
+ speaker_data_map_t::const_iterator it = mSpeakersData.find(speaker_id);
- return result;
-}
-
-void LLVoiceClient::deleteBuddy(const std::string &uri)
-{
- buddyListMap::iterator iter = mBuddyListMap.find(&uri);
- if(iter != mBuddyListMap.end())
- {
- LL_DEBUGS("Voice") << "deleting buddy " << uri << LL_ENDL;
- buddyListEntry *buddy = iter->second;
- mBuddyListMap.erase(iter);
- delete buddy;
- }
- else
+ if (it != mSpeakersData.end())
{
- LL_DEBUGS("Voice") << "attempt to delete nonexistent buddy " << uri << LL_ENDL;
- }
-
-}
+ volume = it->second;
-void LLVoiceClient::deleteAllBuddies(void)
-{
- while(!mBuddyListMap.empty())
- {
- deleteBuddy(*(mBuddyListMap.begin()->first));
- }
-
- // Don't want to correlate with friends list when we've emptied the buddy list.
- mBuddyListMapPopulated = false;
-
- // Don't want to correlate with friends list when we've reset the block rules.
- mBlockRulesListReceived = false;
- mAutoAcceptRulesListReceived = false;
-}
+ // Enable this when debugging voice slider issues. It's way to spammy even for debug-level logging.
+ // LL_DEBUGS("Voice") << "Retrieved stored volume = " << volume << " for " << id << LL_ENDL;
-void LLVoiceClient::deleteAllBlockRules(void)
-{
- // Clear the block list entry flags from all local buddy list entries
- buddyListMap::iterator buddy_it;
- for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end(); buddy_it++)
- {
- buddy_it->second->mHasBlockListEntry = false;
+ return true;
}
-}
-void LLVoiceClient::deleteAllAutoAcceptRules(void)
-{
- // Clear the auto-accept list entry flags from all local buddy list entries
- buddyListMap::iterator buddy_it;
- for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end(); buddy_it++)
- {
- buddy_it->second->mHasAutoAcceptListEntry = false;
- }
+ return false;
}
-void LLVoiceClient::addBlockRule(const std::string &blockMask, const std::string &presenceOnly)
+void LLSpeakerVolumeStorage::removeSpeakerVolume(const LLUUID& speaker_id)
{
- buddyListEntry *buddy = NULL;
-
- // blockMask is the SIP URI of a friends list entry
- buddyListMap::iterator iter = mBuddyListMap.find(&blockMask);
- if(iter != mBuddyListMap.end())
- {
- LL_DEBUGS("Voice") << "block list entry for " << blockMask << LL_ENDL;
- buddy = iter->second;
- }
+ mSpeakersData.erase(speaker_id);
- if(buddy == NULL)
- {
- LL_DEBUGS("Voice") << "block list entry for unknown buddy " << blockMask << LL_ENDL;
- buddy = addBuddy(blockMask);
- }
-
- if(buddy != NULL)
- {
- buddy->mHasBlockListEntry = true;
- }
+ // Enable this when debugging voice slider issues. It's way to spammy even for debug-level logging.
+ // LL_DEBUGS("Voice") << "Removing stored volume for " << id << LL_ENDL;
}
-void LLVoiceClient::addAutoAcceptRule(const std::string &autoAcceptMask, const std::string &autoAddAsBuddy)
+/* static */ F32 LLSpeakerVolumeStorage::transformFromLegacyVolume(F32 volume_in)
{
- buddyListEntry *buddy = NULL;
+ // Convert to linear-logarithmic [0.0..1.0] with 0.5 = 0dB
+ // from legacy characteristic composed of two square-curves
+ // that intersect at volume_in = 0.5, volume_out = 0.56
- // blockMask is the SIP URI of a friends list entry
- buddyListMap::iterator iter = mBuddyListMap.find(&autoAcceptMask);
- if(iter != mBuddyListMap.end())
- {
- LL_DEBUGS("Voice") << "auto-accept list entry for " << autoAcceptMask << LL_ENDL;
- buddy = iter->second;
- }
+ F32 volume_out = 0.f;
+ volume_in = llclamp(volume_in, 0.f, 1.0f);
- if(buddy == NULL)
+ if (volume_in <= 0.5f)
{
- LL_DEBUGS("Voice") << "auto-accept list entry for unknown buddy " << autoAcceptMask << LL_ENDL;
- buddy = addBuddy(autoAcceptMask);
+ volume_out = volume_in * volume_in * 4.f * 0.56f;
}
-
- if(buddy != NULL)
+ else
{
- buddy->mHasAutoAcceptListEntry = true;
+ volume_out = (1.f - 0.56f) * (4.f * volume_in * volume_in - 1.f) / 3.f + 0.56f;
}
-}
-void LLVoiceClient::accountListBlockRulesResponse(int statusCode, const std::string &statusString)
-{
- // Block list entries were updated via addBlockRule() during parsing. Just flag that we're done.
- mBlockRulesListReceived = true;
+ return volume_out;
}
-void LLVoiceClient::accountListAutoAcceptRulesResponse(int statusCode, const std::string &statusString)
+/* static */ F32 LLSpeakerVolumeStorage::transformToLegacyVolume(F32 volume_in)
{
- // Block list entries were updated via addBlockRule() during parsing. Just flag that we're done.
- mAutoAcceptRulesListReceived = true;
-}
+ // Convert from linear-logarithmic [0.0..1.0] with 0.5 = 0dB
+ // to legacy characteristic composed of two square-curves
+ // that intersect at volume_in = 0.56, volume_out = 0.5
-void LLVoiceClient::addObserver(LLVoiceClientParticipantObserver* observer)
-{
- mParticipantObservers.insert(observer);
-}
+ F32 volume_out = 0.f;
+ volume_in = llclamp(volume_in, 0.f, 1.0f);
-void LLVoiceClient::removeObserver(LLVoiceClientParticipantObserver* observer)
-{
- mParticipantObservers.erase(observer);
-}
-
-void LLVoiceClient::notifyParticipantObservers()
-{
- for (observer_set_t::iterator it = mParticipantObservers.begin();
- it != mParticipantObservers.end();
- )
+ if (volume_in <= 0.56f)
{
- LLVoiceClientParticipantObserver* observer = *it;
- observer->onChange();
- // In case onChange() deleted an entry.
- it = mParticipantObservers.upper_bound(observer);
+ volume_out = sqrt(volume_in / (4.f * 0.56f));
}
-}
-
-void LLVoiceClient::addObserver(LLVoiceClientStatusObserver* observer)
-{
- mStatusObservers.insert(observer);
-}
-
-void LLVoiceClient::removeObserver(LLVoiceClientStatusObserver* observer)
-{
- mStatusObservers.erase(observer);
-}
-
-void LLVoiceClient::notifyStatusObservers(LLVoiceClientStatusObserver::EStatusType status)
-{
- if(mAudioSession)
- {
- if(status == LLVoiceClientStatusObserver::ERROR_UNKNOWN)
- {
- switch(mAudioSession->mErrorStatusCode)
- {
- case 20713: status = LLVoiceClientStatusObserver::ERROR_CHANNEL_FULL; break;
- case 20714: status = LLVoiceClientStatusObserver::ERROR_CHANNEL_LOCKED; break;
- case 20715:
- //invalid channel, we may be using a set of poorly cached
- //info
- status = LLVoiceClientStatusObserver::ERROR_NOT_AVAILABLE;
- break;
- case 1009:
- //invalid username and password
- status = LLVoiceClientStatusObserver::ERROR_NOT_AVAILABLE;
- break;
- }
-
- // Reset the error code to make sure it won't be reused later by accident.
- mAudioSession->mErrorStatusCode = 0;
- }
- else if(status == LLVoiceClientStatusObserver::STATUS_LEFT_CHANNEL)
- {
- switch(mAudioSession->mErrorStatusCode)
- {
- case 404: // NOT_FOUND
- case 480: // TEMPORARILY_UNAVAILABLE
- case 408: // REQUEST_TIMEOUT
- // call failed because other user was not available
- // treat this as an error case
- status = LLVoiceClientStatusObserver::ERROR_NOT_AVAILABLE;
-
- // Reset the error code to make sure it won't be reused later by accident.
- mAudioSession->mErrorStatusCode = 0;
- break;
- }
- }
- }
-
- LL_DEBUGS("Voice")
- << " " << LLVoiceClientStatusObserver::status2string(status)
- << ", session URI " << getAudioSessionURI()
- << (inSpatialChannel()?", proximal is true":", proximal is false")
- << LL_ENDL;
-
- for (status_observer_set_t::iterator it = mStatusObservers.begin();
- it != mStatusObservers.end();
- )
+ else
{
- LLVoiceClientStatusObserver* observer = *it;
- observer->onChange(status, getAudioSessionURI(), inSpatialChannel());
- // In case onError() deleted an entry.
- it = mStatusObservers.upper_bound(observer);
+ volume_out = sqrt((3.f * (volume_in - 0.56f) / (1.f - 0.56f) + 1.f) / 4.f);
}
+ return volume_out;
}
-void LLVoiceClient::addObserver(LLFriendObserver* observer)
-{
- mFriendObservers.insert(observer);
-}
-
-void LLVoiceClient::removeObserver(LLFriendObserver* observer)
-{
- mFriendObservers.erase(observer);
-}
-
-void LLVoiceClient::notifyFriendObservers()
+void LLSpeakerVolumeStorage::load()
{
- for (friend_observer_set_t::iterator it = mFriendObservers.begin();
- it != mFriendObservers.end();
- )
- {
- LLFriendObserver* observer = *it;
- it++;
- // The only friend-related thing we notify on is online/offline transitions.
- observer->changed(LLFriendObserver::ONLINE);
- }
-}
+ // load per-resident voice volume information
+ std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SETTINGS_FILE_NAME);
-void LLVoiceClient::lookupName(const LLUUID &id)
-{
- BOOL is_group = FALSE;
- gCacheName->get(id, is_group, &LLVoiceClient::onAvatarNameLookup);
-}
+ LL_INFOS("Voice") << "Loading stored speaker volumes from: " << filename << LL_ENDL;
-//static
-void LLVoiceClient::onAvatarNameLookup(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group)
-{
- if(gVoiceClient)
+ LLSD settings_llsd;
+ llifstream file;
+ file.open(filename);
+ if (file.is_open())
{
- std::string name = llformat("%s %s", first.c_str(), last.c_str());
- gVoiceClient->avatarNameResolved(id, name);
+ LLSDSerialize::fromXML(settings_llsd, file);
}
-}
-void LLVoiceClient::avatarNameResolved(const LLUUID &id, const std::string &name)
-{
- // If the avatar whose name just resolved is on our friends list, resync the friends list.
- if(LLAvatarTracker::instance().getBuddyInfo(id) != NULL)
- {
- mFriendsListDirty = true;
- }
-
- // Iterate over all sessions.
- for(sessionIterator iter = sessionsBegin(); iter != sessionsEnd(); iter++)
+ for (LLSD::map_const_iterator iter = settings_llsd.beginMap();
+ iter != settings_llsd.endMap(); ++iter)
{
- sessionState *session = *iter;
-
- // Check for this user as a participant in this session
- participantState *participant = session->findParticipantByID(id);
- if(participant)
- {
- // Found -- fill in the name
- participant->mAccountName = name;
- // and post a "participants updated" message to listeners later.
- session->mParticipantsChanged = true;
- }
-
- // Check whether this is a p2p session whose caller name just resolved
- if(session->mCallerID == id)
- {
- // this session's "caller ID" just resolved. Fill in the name.
- session->mName = name;
- if(session->mTextInvitePending)
- {
- session->mTextInvitePending = false;
+ // Maintain compatibility with 1.23 non-linear saved volume levels
+ F32 volume = transformFromLegacyVolume((F32)iter->second.asReal());
- // We don't need to call gIMMgr->addP2PSession() here. The first incoming message will create the panel.
- }
- if(session->mVoiceInvitePending)
- {
- session->mVoiceInvitePending = false;
-
- gIMMgr->inviteToSession(
- session->mIMSessionID,
- session->mName,
- session->mCallerID,
- session->mName,
- IM_SESSION_P2P_INVITE,
- LLIMMgr::INVITATION_TYPE_VOICE,
- session->mHandle,
- session->mSIPURI);
- }
-
- }
+ storeSpeakerVolume(LLUUID(iter->first), volume);
}
}
-class LLViewerParcelVoiceInfo : public LLHTTPNode
+void LLSpeakerVolumeStorage::save()
{
- virtual void post(
- LLHTTPNode::ResponsePtr response,
- const LLSD& context,
- const LLSD& input) const
+ // If we quit from the login screen we will not have an SL account
+ // name. Don't try to save, otherwise we'll dump a file in
+ // C:\Program Files\SecondLife\ or similar. JC
+ std::string user_dir = gDirUtilp->getLindenUserDir();
+ if (!user_dir.empty())
{
- //the parcel you are in has changed something about its
- //voice information
-
- //this is a misnomer, as it can also be when you are not in
- //a parcel at all. Should really be something like
- //LLViewerVoiceInfoChanged.....
- if ( input.has("body") )
- {
- LLSD body = input["body"];
-
- //body has "region_name" (str), "parcel_local_id"(int),
- //"voice_credentials" (map).
-
- //body["voice_credentials"] has "channel_uri" (str),
- //body["voice_credentials"] has "channel_credentials" (str)
-
- //if we really wanted to be extra careful,
- //we'd check the supplied
- //local parcel id to make sure it's for the same parcel
- //we believe we're in
- if ( body.has("voice_credentials") )
- {
- LLSD voice_credentials = body["voice_credentials"];
- std::string uri;
- std::string credentials;
-
- if ( voice_credentials.has("channel_uri") )
- {
- uri = voice_credentials["channel_uri"].asString();
- }
- if ( voice_credentials.has("channel_credentials") )
- {
- credentials =
- voice_credentials["channel_credentials"].asString();
- }
+ std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, SETTINGS_FILE_NAME);
+ LLSD settings_llsd;
- gVoiceClient->setSpatialChannel(uri, credentials);
- }
- }
- }
-};
+ LL_INFOS("Voice") << "Saving stored speaker volumes to: " << filename << LL_ENDL;
-class LLViewerRequiredVoiceVersion : public LLHTTPNode
-{
- static BOOL sAlertedUser;
- virtual void post(
- LLHTTPNode::ResponsePtr response,
- const LLSD& context,
- const LLSD& input) const
- {
- //You received this messsage (most likely on region cross or
- //teleport)
- if ( input.has("body") && input["body"].has("major_version") )
+ for(speaker_data_map_t::const_iterator iter = mSpeakersData.begin(); iter != mSpeakersData.end(); ++iter)
{
- int major_voice_version =
- input["body"]["major_version"].asInteger();
-// int minor_voice_version =
-// input["body"]["minor_version"].asInteger();
+ // Maintain compatibility with 1.23 non-linear saved volume levels
+ F32 volume = transformToLegacyVolume(iter->second);
- if (gVoiceClient &&
- (major_voice_version > VOICE_MAJOR_VERSION) )
- {
- if (!sAlertedUser)
- {
- //sAlertedUser = TRUE;
- LLNotificationsUtil::add("VoiceVersionMismatch");
- gSavedSettings.setBOOL("EnableVoiceChat", FALSE); // toggles listener
- }
- }
+ settings_llsd[iter->first.asString()] = volume;
}
+
+ llofstream file;
+ file.open(filename);
+ LLSDSerialize::toPrettyXML(settings_llsd, file);
}
-};
+}
+
BOOL LLViewerRequiredVoiceVersion::sAlertedUser = FALSE;
LLHTTPRegistration<LLViewerParcelVoiceInfo>
- gHTTPRegistrationMessageParcelVoiceInfo(
- "/message/ParcelVoiceInfo");
+gHTTPRegistrationMessageParcelVoiceInfo(
+ "/message/ParcelVoiceInfo");
LLHTTPRegistration<LLViewerRequiredVoiceVersion>
- gHTTPRegistrationMessageRequiredVoiceVersion(
- "/message/RequiredVoiceVersion");
+gHTTPRegistrationMessageRequiredVoiceVersion(
+ "/message/RequiredVoiceVersion");
diff --git a/indra/newview/llvoiceclient.h b/indra/newview/llvoiceclient.h
index a96cf18e27..0e3d9a5435 100644
--- a/indra/newview/llvoiceclient.h
+++ b/indra/newview/llvoiceclient.h
@@ -17,8 +17,7 @@
* There are special exceptions to the terms and conditions of the GPL as
* it is applied to this Source Code. View the full text of the exception
* in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
*
* By copying, modifying or distributing this software, you acknowledge
* that you have read and understood your obligations described above,
@@ -33,7 +32,6 @@
#define LL_VOICE_CLIENT_H
class LLVOAvatar;
-class LLVivoxProtocolParser;
#include "lliopipe.h"
#include "llpumpio.h"
@@ -42,16 +40,25 @@ class LLVivoxProtocolParser;
#include "v3math.h"
#include "llframetimer.h"
#include "llviewerregion.h"
-#include "m3math.h" // LLMatrix3
+#include "llcallingcard.h" // for LLFriendObserver
+#include "llsecapi.h"
+#include "llcontrol.h"
+
+// devices
+
+typedef std::vector<std::string> LLVoiceDeviceList;
+
-class LLFriendObserver;
class LLVoiceClientParticipantObserver
{
public:
virtual ~LLVoiceClientParticipantObserver() { }
- virtual void onChange() = 0;
+ virtual void onParticipantsChanged() = 0;
};
+
+///////////////////////////////////
+/// @class LLVoiceClientStatusObserver
class LLVoiceClientStatusObserver
{
public:
@@ -65,11 +72,7 @@ public:
STATUS_JOINED,
STATUS_LEFT_CHANNEL,
STATUS_VOICE_DISABLED,
-
- // Adding STATUS_VOICE_ENABLED as pair status for STATUS_VOICE_DISABLED
- // See LLVoiceClient::setVoiceEnabled()
STATUS_VOICE_ENABLED,
-
BEGIN_ERROR_STATUS,
ERROR_CHANNEL_FULL,
ERROR_CHANNEL_LOCKED,
@@ -83,690 +86,447 @@ public:
static std::string status2string(EStatusType inStatus);
};
-class LLVoiceClient: public LLSingleton<LLVoiceClient>
+struct LLVoiceVersionInfo
{
- LOG_CLASS(LLVoiceClient);
- public:
- LLVoiceClient();
- ~LLVoiceClient();
-
- public:
- static void init(LLPumpIO *pump); // Call this once at application startup (creates connector)
- static void terminate(); // Call this to clean up during shutdown
-
- protected:
- bool writeString(const std::string &str);
-
- public:
-
- static F32 OVERDRIVEN_POWER_LEVEL;
+ std::string serverType;
+ std::string serverVersion;
+};
+
+//////////////////////////////////
+/// @class LLVoiceModuleInterface
+/// @brief Voice module interface
+///
+/// Voice modules should provide an implementation for this interface.
+/////////////////////////////////
- void updateSettings(); // call after loading settings and whenever they change
+class LLVoiceModuleInterface
+{
+public:
+ LLVoiceModuleInterface() {}
+ virtual ~LLVoiceModuleInterface() {}
- void getCaptureDevicesSendMessage();
- void getRenderDevicesSendMessage();
-
- void clearCaptureDevices();
- void addCaptureDevice(const std::string& name);
- void setCaptureDevice(const std::string& name);
-
- void clearRenderDevices();
- void addRenderDevice(const std::string& name);
- void setRenderDevice(const std::string& name);
-
- void tuningStart();
- void tuningStop();
- bool inTuningMode();
- bool inTuningStates();
-
- void tuningRenderStartSendMessage(const std::string& name, bool loop);
- void tuningRenderStopSendMessage();
+ virtual void init(LLPumpIO *pump)=0; // Call this once at application startup (creates connector)
+ virtual void terminate()=0; // Call this to clean up during shutdown
+
+ virtual void updateSettings()=0; // call after loading settings and whenever they change
+
+ virtual bool isVoiceWorking() const = 0; // connected to a voice server and voice channel
- void tuningCaptureStartSendMessage(int duration);
- void tuningCaptureStopSendMessage();
-
- void tuningSetMicVolume(float volume);
- void tuningSetSpeakerVolume(float volume);
- float tuningGetEnergy(void);
-
- // This returns true when it's safe to bring up the "device settings" dialog in the prefs.
- // i.e. when the daemon is running and connected, and the device lists are populated.
- bool deviceSettingsAvailable();
-
- // Requery the vivox daemon for the current list of input/output devices.
- // If you pass true for clearCurrentList, deviceSettingsAvailable() will be false until the query has completed
- // (use this if you want to know when it's done).
- // If you pass false, you'll have no way to know when the query finishes, but the device lists will not appear empty in the interim.
- void refreshDeviceLists(bool clearCurrentList = true);
-
- // Call this if the connection to the daemon terminates unexpectedly. It will attempt to reset everything and relaunch.
- void daemonDied();
+ virtual const LLVoiceVersionInfo& getVersion()=0;
+
+ /////////////////////
+ /// @name Tuning
+ //@{
+ virtual void tuningStart()=0;
+ virtual void tuningStop()=0;
+ virtual bool inTuningMode()=0;
+
+ virtual void tuningSetMicVolume(float volume)=0;
+ virtual void tuningSetSpeakerVolume(float volume)=0;
+ virtual float tuningGetEnergy(void)=0;
+ //@}
+
+ /////////////////////
+ /// @name Devices
+ //@{
+ // This returns true when it's safe to bring up the "device settings" dialog in the prefs.
+ // i.e. when the daemon is running and connected, and the device lists are populated.
+ virtual bool deviceSettingsAvailable()=0;
+
+ // Requery the vivox daemon for the current list of input/output devices.
+ // If you pass true for clearCurrentList, deviceSettingsAvailable() will be false until the query has completed
+ // (use this if you want to know when it's done).
+ // If you pass false, you'll have no way to know when the query finishes, but the device lists will not appear empty in the interim.
+ virtual void refreshDeviceLists(bool clearCurrentList = true)=0;
+
+ virtual void setCaptureDevice(const std::string& name)=0;
+ virtual void setRenderDevice(const std::string& name)=0;
+
+ virtual LLVoiceDeviceList& getCaptureDevices()=0;
+ virtual LLVoiceDeviceList& getRenderDevices()=0;
+
+ virtual void getParticipantList(std::set<LLUUID> &participants)=0;
+ virtual bool isParticipant(const LLUUID& speaker_id)=0;
+ //@}
+
+ ////////////////////////////
+ /// @ name Channel stuff
+ //@{
+ // returns true iff the user is currently in a proximal (local spatial) channel.
+ // Note that gestures should only fire if this returns true.
+ virtual bool inProximalChannel()=0;
+
+ virtual void setNonSpatialChannel(const std::string &uri,
+ const std::string &credentials)=0;
+
+ virtual void setSpatialChannel(const std::string &uri,
+ const std::string &credentials)=0;
+
+ virtual void leaveNonSpatialChannel()=0;
+
+ virtual void leaveChannel(void)=0;
+
+ // Returns the URI of the current channel, or an empty string if not currently in a channel.
+ // NOTE that it will return an empty string if it's in the process of joining a channel.
+ virtual std::string getCurrentChannel()=0;
+ //@}
+
+
+ //////////////////////////
+ /// @name invitations
+ //@{
+ // start a voice channel with the specified user
+ virtual void callUser(const LLUUID &uuid)=0;
+ virtual bool isValidChannel(std::string& channelHandle)=0;
+ virtual bool answerInvite(std::string &channelHandle)=0;
+ virtual void declineInvite(std::string &channelHandle)=0;
+ //@}
+
+ /////////////////////////
+ /// @name Volume/gain
+ //@{
+ virtual void setVoiceVolume(F32 volume)=0;
+ virtual void setMicGain(F32 volume)=0;
+ //@}
+
+ /////////////////////////
+ /// @name enable disable voice and features
+ //@{
+ virtual bool voiceEnabled()=0;
+ virtual void setVoiceEnabled(bool enabled)=0;
+ virtual void setLipSyncEnabled(BOOL enabled)=0;
+ virtual BOOL lipSyncEnabled()=0;
+ virtual void setMuteMic(bool muted)=0; // Use this to mute the local mic (for when the client is minimized, etc), ignoring user PTT state.
+ //@}
+
+ ////////////////////////
+ /// @name PTT
+ //@{
+ virtual void setUserPTTState(bool ptt)=0;
+ virtual bool getUserPTTState()=0;
+ virtual void setUsePTT(bool usePTT)=0;
+ virtual void setPTTIsToggle(bool PTTIsToggle)=0;
+ virtual bool getPTTIsToggle()=0;
+ virtual void toggleUserPTTState(void)=0;
+ virtual void inputUserControlState(bool down)=0; // interpret any sort of up-down mic-open control input according to ptt-toggle prefs
+
+ virtual void keyDown(KEY key, MASK mask)=0;
+ virtual void keyUp(KEY key, MASK mask)=0;
+ virtual void middleMouseState(bool down)=0;
+ //@}
+
+ //////////////////////////
+ /// @name nearby speaker accessors
+ //@{
+ virtual BOOL getVoiceEnabled(const LLUUID& id)=0; // true if we've received data for this avatar
+ virtual std::string getDisplayName(const LLUUID& id)=0;
+ virtual BOOL isOnlineSIP(const LLUUID &id)=0;
+ virtual BOOL isParticipantAvatar(const LLUUID &id)=0;
+ virtual BOOL getIsSpeaking(const LLUUID& id)=0;
+ virtual BOOL getIsModeratorMuted(const LLUUID& id)=0;
+ virtual F32 getCurrentPower(const LLUUID& id)=0; // "power" is related to "amplitude" in a defined way. I'm just not sure what the formula is...
+ virtual BOOL getOnMuteList(const LLUUID& id)=0;
+ virtual F32 getUserVolume(const LLUUID& id)=0;
+ virtual void setUserVolume(const LLUUID& id, F32 volume)=0; // set's volume for specified agent, from 0-1 (where .5 is nominal)
+ //@}
+
+ //////////////////////////
+ /// @name text chat
+ //@{
+ virtual BOOL isSessionTextIMPossible(const LLUUID& id)=0;
+ virtual BOOL isSessionCallBackPossible(const LLUUID& id)=0;
+ virtual BOOL sendTextMessage(const LLUUID& participant_id, const std::string& message)=0;
+ virtual void endUserIMSession(const LLUUID &uuid)=0;
+ //@}
+
+ // authorize the user
+ virtual void userAuthorized(const std::string& user_id,
+ const LLUUID &agentID)=0;
+
+ //////////////////////////////
+ /// @name Status notification
+ //@{
+ virtual void addObserver(LLVoiceClientStatusObserver* observer)=0;
+ virtual void removeObserver(LLVoiceClientStatusObserver* observer)=0;
+ virtual void addObserver(LLFriendObserver* observer)=0;
+ virtual void removeObserver(LLFriendObserver* observer)=0;
+ virtual void addObserver(LLVoiceClientParticipantObserver* observer)=0;
+ virtual void removeObserver(LLVoiceClientParticipantObserver* observer)=0;
+ //@}
+
+ virtual std::string sipURIFromID(const LLUUID &id)=0;
+ //@}
+
+};
- // Call this if we're just giving up on voice (can't provision an account, etc.). It will clean up and go away.
- void giveUp();
-
- /////////////////////////////
- // Response/Event handlers
- void connectorCreateResponse(int statusCode, std::string &statusString, std::string &connectorHandle, std::string &versionID);
- void loginResponse(int statusCode, std::string &statusString, std::string &accountHandle, int numberOfAliases);
- void sessionCreateResponse(std::string &requestId, int statusCode, std::string &statusString, std::string &sessionHandle);
- void sessionGroupAddSessionResponse(std::string &requestId, int statusCode, std::string &statusString, std::string &sessionHandle);
- void sessionConnectResponse(std::string &requestId, int statusCode, std::string &statusString);
- void logoutResponse(int statusCode, std::string &statusString);
- void connectorShutdownResponse(int statusCode, std::string &statusString);
-
- void accountLoginStateChangeEvent(std::string &accountHandle, int statusCode, std::string &statusString, int state);
- void mediaStreamUpdatedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, int statusCode, std::string &statusString, int state, bool incoming);
- void textStreamUpdatedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, bool enabled, int state, bool incoming);
- void sessionAddedEvent(std::string &uriString, std::string &alias, std::string &sessionHandle, std::string &sessionGroupHandle, bool isChannel, bool incoming, std::string &nameString, std::string &applicationString);
- void sessionGroupAddedEvent(std::string &sessionGroupHandle);
- void sessionRemovedEvent(std::string &sessionHandle, std::string &sessionGroupHandle);
- void participantAddedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, std::string &uriString, std::string &alias, std::string &nameString, std::string &displayNameString, int participantType);
- void participantRemovedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, std::string &uriString, std::string &alias, std::string &nameString);
- void participantUpdatedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, std::string &uriString, std::string &alias, bool isModeratorMuted, bool isSpeaking, int volume, F32 energy);
- void auxAudioPropertiesEvent(F32 energy);
- void buddyPresenceEvent(std::string &uriString, std::string &alias, std::string &statusString, std::string &applicationString);
- void messageEvent(std::string &sessionHandle, std::string &uriString, std::string &alias, std::string &messageHeader, std::string &messageBody, std::string &applicationString);
- void sessionNotificationEvent(std::string &sessionHandle, std::string &uriString, std::string &notificationType);
- void subscriptionEvent(std::string &buddyURI, std::string &subscriptionHandle, std::string &alias, std::string &displayName, std::string &applicationString, std::string &subscriptionType);
-
- void buddyListChanged();
- void muteListChanged();
- void updateFriends(U32 mask);
-
- /////////////////////////////
- // Sending updates of current state
-static void updatePosition(void);
- void setCameraPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot);
- void setAvatarPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot);
- bool channelFromRegion(LLViewerRegion *region, std::string &name);
- void leaveChannel(void); // call this on logout or teleport begin
-
- void setMuteMic(bool muted); // Use this to mute the local mic (for when the client is minimized, etc), ignoring user PTT state.
- bool getMuteMic() const;
- void setUserPTTState(bool ptt);
- bool getUserPTTState();
- void toggleUserPTTState(void);
- void inputUserControlState(bool down); // interpret any sort of up-down mic-open control input according to ptt-toggle prefs
- void setVoiceEnabled(bool enabled);
- static bool voiceEnabled();
- // Checks is voice working judging from mState
- // Returns true if vivox has successfully logged in and is not in error state
- bool voiceWorking();
- void setUsePTT(bool usePTT);
- void setPTTIsToggle(bool PTTIsToggle);
- bool getPTTIsToggle();
- void setPTTKey(std::string &key);
- void setEarLocation(S32 loc);
- void setVoiceVolume(F32 volume);
- void setMicGain(F32 volume);
- void setUserVolume(const LLUUID& id, F32 volume); // sets volume for specified agent, from 0-1 (where .5 is nominal)
- void setLipSyncEnabled(BOOL enabled);
- BOOL lipSyncEnabled();
-
- // PTT key triggering
- void keyDown(KEY key, MASK mask);
- void keyUp(KEY key, MASK mask);
- void middleMouseState(bool down);
-
- // Return the version of the Vivox library
- std::string getAPIVersion() const { return mAPIVersion; }
-
- /////////////////////////////
- // Accessors for data related to nearby speakers
- BOOL getVoiceEnabled(const LLUUID& id); // true if we've received data for this avatar
- BOOL getIsSpeaking(const LLUUID& id);
- BOOL getIsModeratorMuted(const LLUUID& id);
- F32 getCurrentPower(const LLUUID& id); // "power" is related to "amplitude" in a defined way. I'm just not sure what the formula is...
- BOOL getOnMuteList(const LLUUID& id);
- F32 getUserVolume(const LLUUID& id);
- std::string getDisplayName(const LLUUID& id);
-
- // MBW -- XXX -- Not sure how to get this data out of the TVC
- BOOL getUsingPTT(const LLUUID& id);
- std::string getGroupID(const LLUUID& id); // group ID if the user is in group chat (empty string if not applicable)
+//////////////////////////////////
+/// @class LLVoiceEffectObserver
+class LLVoiceEffectObserver
+{
+public:
+ virtual ~LLVoiceEffectObserver() { }
+ virtual void onVoiceEffectChanged(bool effect_list_updated) = 0;
+};
- /////////////////////////////
- BOOL getAreaVoiceDisabled(); // returns true if the area the avatar is in is speech-disabled.
- // Use this to determine whether to show a "no speech" icon in the menu bar.
-
- /////////////////////////////
- // Recording controls
- void recordingLoopStart(int seconds = 3600, int deltaFramesPerControlFrame = 200);
- void recordingLoopSave(const std::string& filename);
- void recordingStop();
-
- // Playback controls
- void filePlaybackStart(const std::string& filename);
- void filePlaybackStop();
- void filePlaybackSetPaused(bool paused);
- void filePlaybackSetMode(bool vox = false, float speed = 1.0f);
-
-
- // This is used by the string-keyed maps below, to avoid storing the string twice.
- // The 'const std::string *' in the key points to a string actually stored in the object referenced by the map.
- // The add and delete operations for each map allocate and delete in the right order to avoid dangling references.
- // The default compare operation would just compare pointers, which is incorrect, so they must use this comparitor instead.
- struct stringMapComparitor
- {
- bool operator()(const std::string* a, const std::string * b) const
- {
- return a->compare(*b) < 0;
- }
- };
-
- struct uuidMapComparitor
- {
- bool operator()(const LLUUID* a, const LLUUID * b) const
- {
- return *a < *b;
- }
- };
-
- struct participantState
- {
- public:
- participantState(const std::string &uri);
-
- bool updateMuteState();
- bool isAvatar();
-
- std::string mURI;
- LLUUID mAvatarID;
- std::string mAccountName;
- std::string mDisplayName;
- LLFrameTimer mSpeakingTimeout;
- F32 mLastSpokeTimestamp;
- F32 mPower;
- int mVolume;
- std::string mGroupID;
- int mUserVolume;
- bool mPTT;
- bool mIsSpeaking;
- bool mIsModeratorMuted;
- bool mOnMuteList; // true if this avatar is on the user's mute list (and should be muted)
- bool mVolumeDirty; // true if this participant needs a volume command sent (either mOnMuteList or mUserVolume has changed)
- bool mAvatarIDValid;
- bool mIsSelf;
- };
- typedef std::map<const std::string *, participantState*, stringMapComparitor> participantMap;
-
- typedef std::map<const LLUUID *, participantState*, uuidMapComparitor> participantUUIDMap;
-
- enum streamState
- {
- streamStateUnknown = 0,
- streamStateIdle = 1,
- streamStateConnected = 2,
- streamStateRinging = 3,
- };
-
- struct sessionState
- {
- public:
- sessionState();
- ~sessionState();
-
- participantState *addParticipant(const std::string &uri);
- // Note: after removeParticipant returns, the participant* that was passed to it will have been deleted.
- // Take care not to use the pointer again after that.
- void removeParticipant(participantState *participant);
- void removeAllParticipants();
-
- participantState *findParticipant(const std::string &uri);
- participantState *findParticipantByID(const LLUUID& id);
-
- bool isCallBackPossible();
- bool isTextIMPossible();
-
- std::string mHandle;
- std::string mGroupHandle;
- std::string mSIPURI;
- std::string mAlias;
- std::string mName;
- std::string mAlternateSIPURI;
- std::string mHash; // Channel password
- std::string mErrorStatusString;
- std::queue<std::string> mTextMsgQueue;
-
- LLUUID mIMSessionID;
- LLUUID mCallerID;
- int mErrorStatusCode;
- int mMediaStreamState;
- int mTextStreamState;
- bool mCreateInProgress; // True if a Session.Create has been sent for this session and no response has been received yet.
- bool mMediaConnectInProgress; // True if a Session.MediaConnect has been sent for this session and no response has been received yet.
- bool mVoiceInvitePending; // True if a voice invite is pending for this session (usually waiting on a name lookup)
- bool mTextInvitePending; // True if a text invite is pending for this session (usually waiting on a name lookup)
- bool mSynthesizedCallerID; // True if the caller ID is a hash of the SIP URI -- this means we shouldn't do a name lookup.
- bool mIsChannel; // True for both group and spatial channels (false for p2p, PSTN)
- bool mIsSpatial; // True for spatial channels
- bool mIsP2P;
- bool mIncoming;
- bool mVoiceEnabled;
- bool mReconnect; // Whether we should try to reconnect to this session if it's dropped
- // Set to true when the mute state of someone in the participant list changes.
- // The code will have to walk the list to find the changed participant(s).
- bool mVolumeDirty;
-
- bool mParticipantsChanged;
- participantMap mParticipantsByURI;
- participantUUIDMap mParticipantsByUUID;
- };
-
- participantState *findParticipantByID(const LLUUID& id);
- participantMap *getParticipantList(void);
- void getParticipantsUUIDSet(std::set<LLUUID>& participant_uuids);
-
- typedef std::map<const std::string*, sessionState*, stringMapComparitor> sessionMap;
- typedef std::set<sessionState*> sessionSet;
-
- typedef sessionSet::iterator sessionIterator;
- sessionIterator sessionsBegin(void);
- sessionIterator sessionsEnd(void);
-
- sessionState *findSession(const std::string &handle);
- sessionState *findSessionBeingCreatedByURI(const std::string &uri);
- sessionState *findSession(const LLUUID &participant_id);
- sessionState *findSessionByCreateID(const std::string &create_id);
-
- sessionState *addSession(const std::string &uri, const std::string &handle = LLStringUtil::null);
- void setSessionHandle(sessionState *session, const std::string &handle = LLStringUtil::null);
- void setSessionURI(sessionState *session, const std::string &uri);
- void deleteSession(sessionState *session);
- void deleteAllSessions(void);
+typedef std::multimap<const std::string, const LLUUID, LLDictionaryLess> voice_effect_list_t;
- void verifySessionState(void);
+//////////////////////////////////
+/// @class LLVoiceEffectInterface
+/// @brief Voice effect module interface
+///
+/// Voice effect modules should provide an implementation for this interface.
+/////////////////////////////////
- void joinedAudioSession(sessionState *session);
- void leftAudioSession(sessionState *session);
+class LLVoiceEffectInterface
+{
+public:
+ LLVoiceEffectInterface() {}
+ virtual ~LLVoiceEffectInterface() {}
+
+ //////////////////////////
+ /// @name Accessors
+ //@{
+ virtual bool setVoiceEffect(const LLUUID& id) = 0;
+ virtual const LLUUID getVoiceEffect() = 0;
+ virtual LLSD getVoiceEffectProperties(const LLUUID& id) = 0;
+
+ virtual void refreshVoiceEffectLists(bool clear_lists) = 0;
+ virtual const voice_effect_list_t &getVoiceEffectList() const = 0;
+ virtual const voice_effect_list_t &getVoiceEffectTemplateList() const = 0;
+ //@}
+
+ //////////////////////////////
+ /// @name Status notification
+ //@{
+ virtual void addObserver(LLVoiceEffectObserver* observer) = 0;
+ virtual void removeObserver(LLVoiceEffectObserver* observer) = 0;
+ //@}
+
+ //////////////////////////////
+ /// @name Preview buffer
+ //@{
+ virtual void enablePreviewBuffer(bool enable) = 0;
+ virtual void recordPreviewBuffer() = 0;
+ virtual void playPreviewBuffer(const LLUUID& effect_id = LLUUID::null) = 0;
+ virtual void stopPreviewBuffer() = 0;
+
+ virtual bool isPreviewRecording() = 0;
+ virtual bool isPreviewPlaying() = 0;
+ //@}
+};
- // This is called in several places where the session _may_ need to be deleted.
- // It contains logic for whether to delete the session or keep it around.
- void reapSession(sessionState *session);
-
- // Returns true if the session seems to indicate we've moved to a region on a different voice server
- bool sessionNeedsRelog(sessionState *session);
-
- struct buddyListEntry
- {
- buddyListEntry(const std::string &uri);
- std::string mURI;
- std::string mDisplayName;
- LLUUID mUUID;
- bool mOnlineSL;
- bool mOnlineSLim;
- bool mCanSeeMeOnline;
- bool mHasBlockListEntry;
- bool mHasAutoAcceptListEntry;
- bool mNameResolved;
- bool mInSLFriends;
- bool mInVivoxBuddies;
- bool mNeedsNameUpdate;
- };
-
- typedef std::map<const std::string*, buddyListEntry*, stringMapComparitor> buddyListMap;
-
- // This should be called when parsing a buddy list entry sent by SLVoice.
- void processBuddyListEntry(const std::string &uri, const std::string &displayName);
-
- buddyListEntry *addBuddy(const std::string &uri);
- buddyListEntry *addBuddy(const std::string &uri, const std::string &displayName);
- buddyListEntry *findBuddy(const std::string &uri);
- buddyListEntry *findBuddy(const LLUUID &id);
- buddyListEntry *findBuddyByDisplayName(const std::string &name);
- void deleteBuddy(const std::string &uri);
- void deleteAllBuddies(void);
-
- void deleteAllBlockRules(void);
- void addBlockRule(const std::string &blockMask, const std::string &presenceOnly);
- void deleteAllAutoAcceptRules(void);
- void addAutoAcceptRule(const std::string &autoAcceptMask, const std::string &autoAddAsBuddy);
- void accountListBlockRulesResponse(int statusCode, const std::string &statusString);
- void accountListAutoAcceptRulesResponse(int statusCode, const std::string &statusString);
-
- /////////////////////////////
- // session control messages
- void connectorCreate();
- void connectorShutdown();
-
- void requestVoiceAccountProvision(S32 retries = 3);
- void userAuthorized(
- const std::string& firstName,
- const std::string& lastName,
- const LLUUID &agentID);
- void login(
- const std::string& account_name,
- const std::string& password,
- const std::string& voice_sip_uri_hostname,
- const std::string& voice_account_server_uri);
- void loginSendMessage();
- void logout();
- void logoutSendMessage();
-
- void accountListBlockRulesSendMessage();
- void accountListAutoAcceptRulesSendMessage();
-
- void sessionGroupCreateSendMessage();
- void sessionCreateSendMessage(sessionState *session, bool startAudio = true, bool startText = false);
- void sessionGroupAddSessionSendMessage(sessionState *session, bool startAudio = true, bool startText = false);
- void sessionMediaConnectSendMessage(sessionState *session); // just joins the audio session
- void sessionTextConnectSendMessage(sessionState *session); // just joins the text session
- void sessionTerminateSendMessage(sessionState *session);
- void sessionGroupTerminateSendMessage(sessionState *session);
- void sessionMediaDisconnectSendMessage(sessionState *session);
- void sessionTextDisconnectSendMessage(sessionState *session);
-
- // Pokes the state machine to leave the audio session next time around.
- void sessionTerminate();
-
- // Pokes the state machine to shut down the connector and restart it.
- void requestRelog();
-
- // Does the actual work to get out of the audio session
- void leaveAudioSession();
-
- void addObserver(LLVoiceClientParticipantObserver* observer);
- void removeObserver(LLVoiceClientParticipantObserver* observer);
- void addObserver(LLVoiceClientStatusObserver* observer);
- void removeObserver(LLVoiceClientStatusObserver* observer);
+class LLVoiceClient: public LLSingleton<LLVoiceClient>
+{
+ LOG_CLASS(LLVoiceClient);
+public:
+ LLVoiceClient();
+ ~LLVoiceClient();
- void addObserver(LLFriendObserver* observer);
- void removeObserver(LLFriendObserver* observer);
-
- void lookupName(const LLUUID &id);
- static void onAvatarNameLookup(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group);
- void avatarNameResolved(const LLUUID &id, const std::string &name);
-
- typedef std::vector<std::string> deviceList;
+ void init(LLPumpIO *pump); // Call this once at application startup (creates connector)
+ void terminate(); // Call this to clean up during shutdown
+
+ const LLVoiceVersionInfo getVersion();
+
+ static const F32 OVERDRIVEN_POWER_LEVEL;
- deviceList *getCaptureDevices();
- deviceList *getRenderDevices();
-
- void setNonSpatialChannel(
- const std::string &uri,
- const std::string &credentials);
- void setSpatialChannel(
- const std::string &uri,
- const std::string &credentials);
- // start a voice session with the specified user
- void callUser(const LLUUID &uuid);
-
- // Send a text message to the specified user, initiating the session if necessary.
- bool sendTextMessage(const LLUUID& participant_id, const std::string& message);
-
- // close any existing text IM session with the specified user
- void endUserIMSession(const LLUUID &uuid);
-
- bool answerInvite(std::string &sessionHandle);
- void declineInvite(std::string &sessionHandle);
- void leaveNonSpatialChannel();
+ static const F32 VOLUME_MIN;
+ static const F32 VOLUME_DEFAULT;
+ static const F32 VOLUME_MAX;
- // Returns the URI of the current channel, or an empty string if not currently in a channel.
- // NOTE that it will return an empty string if it's in the process of joining a channel.
- std::string getCurrentChannel();
-
- // returns true iff the user is currently in a proximal (local spatial) channel.
- // Note that gestures should only fire if this returns true.
- bool inProximalChannel();
+ void updateSettings(); // call after loading settings and whenever they change
- std::string sipURIFromID(const LLUUID &id);
-
- // Returns true if the indicated user is online via SIP presence according to SLVoice.
- // Note that we only get SIP presence data for other users that are in our vivox buddy list.
- bool isOnlineSIP(const LLUUID &id);
-
- // Returns true if the indicated participant is really an SL avatar.
- // This should be used to control the state of the "profile" button.
- // Currently this will be false only for PSTN callers into group chats, and PSTN p2p calls.
- bool isParticipantAvatar(const LLUUID &id);
-
- // Returns true if calling back the session URI after the session has closed is possible.
- // Currently this will be false only for PSTN P2P calls.
- // NOTE: this will return true if the session can't be found.
- bool isSessionCallBackPossible(const LLUUID &session_id);
-
- // Returns true if the session can accepte text IM's.
- // Currently this will be false only for PSTN P2P calls.
- // NOTE: this will return true if the session can't be found.
- bool isSessionTextIMPossible(const LLUUID &session_id);
-
- private:
-
- // internal state for a simple state machine. This is used to deal with the asynchronous nature of some of the messages.
- // Note: if you change this list, please make corresponding changes to LLVoiceClient::state2string().
- enum state
- {
- stateDisableCleanup,
- stateDisabled, // Voice is turned off.
- stateStart, // Class is initialized, socket is created
- stateDaemonLaunched, // Daemon has been launched
- stateConnecting, // connect() call has been issued
- stateConnected, // connection to the daemon has been made, send some initial setup commands.
- stateIdle, // socket is connected, ready for messaging
- stateMicTuningStart,
- stateMicTuningRunning,
- stateMicTuningStop,
- stateConnectorStart, // connector needs to be started
- stateConnectorStarting, // waiting for connector handle
- stateConnectorStarted, // connector handle received
- stateLoginRetry, // need to retry login (failed due to changing password)
- stateLoginRetryWait, // waiting for retry timer
- stateNeedsLogin, // send login request
- stateLoggingIn, // waiting for account handle
- stateLoggedIn, // account handle received
- stateCreatingSessionGroup, // Creating the main session group
- stateNoChannel, //
- stateJoiningSession, // waiting for session handle
- stateSessionJoined, // session handle received
- stateRunning, // in session, steady state
- stateLeavingSession, // waiting for terminate session response
- stateSessionTerminated, // waiting for terminate session response
-
- stateLoggingOut, // waiting for logout response
- stateLoggedOut, // logout response received
- stateConnectorStopping, // waiting for connector stop
- stateConnectorStopped, // connector stop received
-
- // We go to this state if the login fails because the account needs to be provisioned.
-
- // error states. No way to recover from these yet.
- stateConnectorFailed,
- stateConnectorFailedWaiting,
- stateLoginFailed,
- stateLoginFailedWaiting,
- stateJoinSessionFailed,
- stateJoinSessionFailedWaiting,
-
- stateJail // Go here when all else has failed. Nothing will be retried, we're done.
- };
-
- state mState;
- bool mSessionTerminateRequested;
- bool mRelogRequested;
-
- void setState(state inState);
- state getState(void) { return mState; };
- static std::string state2string(state inState);
-
- void stateMachine();
- static void idle(void *user_data);
-
- LLHost mDaemonHost;
- LLSocket::ptr_t mSocket;
- bool mConnected;
-
- void closeSocket(void);
-
- LLPumpIO *mPump;
- friend class LLVivoxProtocolParser;
+ bool isVoiceWorking() const; // connected to a voice server and voice channel
+
+ // tuning
+ void tuningStart();
+ void tuningStop();
+ bool inTuningMode();
- std::string mAccountName;
- std::string mAccountPassword;
- std::string mAccountDisplayName;
- std::string mAccountFirstName;
- std::string mAccountLastName;
+ void tuningSetMicVolume(float volume);
+ void tuningSetSpeakerVolume(float volume);
+ float tuningGetEnergy(void);
- bool mTuningMode;
- float mTuningEnergy;
- std::string mTuningAudioFile;
- int mTuningMicVolume;
- bool mTuningMicVolumeDirty;
- int mTuningSpeakerVolume;
- bool mTuningSpeakerVolumeDirty;
- state mTuningExitState; // state to return to when we leave tuning mode.
+ // devices
+
+ // This returns true when it's safe to bring up the "device settings" dialog in the prefs.
+ // i.e. when the daemon is running and connected, and the device lists are populated.
+ bool deviceSettingsAvailable();
- std::string mSpatialSessionURI;
- std::string mSpatialSessionCredentials;
+ // Requery the vivox daemon for the current list of input/output devices.
+ // If you pass true for clearCurrentList, deviceSettingsAvailable() will be false until the query has completed
+ // (use this if you want to know when it's done).
+ // If you pass false, you'll have no way to know when the query finishes, but the device lists will not appear empty in the interim.
+ void refreshDeviceLists(bool clearCurrentList = true);
- std::string mMainSessionGroupHandle; // handle of the "main" session group.
-
- std::string mChannelName; // Name of the channel to be looked up
- bool mAreaVoiceDisabled;
- sessionState *mAudioSession; // Session state for the current audio session
- bool mAudioSessionChanged; // set to true when the above pointer gets changed, so observers can be notified.
+ void setCaptureDevice(const std::string& name);
+ void setRenderDevice(const std::string& name);
- sessionState *mNextAudioSession; // Session state for the audio session we're trying to join
+ const LLVoiceDeviceList& getCaptureDevices();
+ const LLVoiceDeviceList& getRenderDevices();
-// std::string mSessionURI; // URI of the session we're in.
-// std::string mSessionHandle; // returned by ?
-
- S32 mCurrentParcelLocalID; // Used to detect parcel boundary crossings
- std::string mCurrentRegionName; // Used to detect parcel boundary crossings
-
- std::string mConnectorHandle; // returned by "Create Connector" message
- std::string mAccountHandle; // returned by login message
- int mNumberOfAliases;
- U32 mCommandCookie;
+ ////////////////////////////
+ // Channel stuff
+ //
+
+ // returns true iff the user is currently in a proximal (local spatial) channel.
+ // Note that gestures should only fire if this returns true.
+ bool inProximalChannel();
+ void setNonSpatialChannel(
+ const std::string &uri,
+ const std::string &credentials);
+ void setSpatialChannel(
+ const std::string &uri,
+ const std::string &credentials);
+ void leaveNonSpatialChannel();
+
+ // Returns the URI of the current channel, or an empty string if not currently in a channel.
+ // NOTE that it will return an empty string if it's in the process of joining a channel.
+ std::string getCurrentChannel();
+ // start a voice channel with the specified user
+ void callUser(const LLUUID &uuid);
+ bool isValidChannel(std::string& channelHandle);
+ bool answerInvite(std::string &channelHandle);
+ void declineInvite(std::string &channelHandle);
+ void leaveChannel(void); // call this on logout or teleport begin
+
+
+ /////////////////////////////
+ // Sending updates of current state
- std::string mVoiceAccountServerURI;
- std::string mVoiceSIPURIHostName;
-
- int mLoginRetryCount;
-
- sessionMap mSessionsByHandle; // Active sessions, indexed by session handle. Sessions which are being initiated may not be in this map.
- sessionSet mSessions; // All sessions, not indexed. This is the canonical session list.
-
- bool mBuddyListMapPopulated;
- bool mBlockRulesListReceived;
- bool mAutoAcceptRulesListReceived;
- buddyListMap mBuddyListMap;
-
- deviceList mCaptureDevices;
- deviceList mRenderDevices;
- std::string mCaptureDevice;
- std::string mRenderDevice;
- bool mCaptureDeviceDirty;
- bool mRenderDeviceDirty;
-
- // This should be called when the code detects we have changed parcels.
- // It initiates the call to the server that gets the parcel channel.
- void parcelChanged();
-
- void switchChannel(std::string uri = std::string(), bool spatial = true, bool no_reconnect = false, bool is_p2p = false, std::string hash = "");
- void joinSession(sessionState *session);
-
-static std::string nameFromAvatar(LLVOAvatar *avatar);
-static std::string nameFromID(const LLUUID &id);
-static bool IDFromName(const std::string name, LLUUID &uuid);
-static std::string displayNameFromAvatar(LLVOAvatar *avatar);
- std::string sipURIFromAvatar(LLVOAvatar *avatar);
- std::string sipURIFromName(std::string &name);
-
- // Returns the name portion of the SIP URI if the string looks vaguely like a SIP URI, or an empty string if not.
-static std::string nameFromsipURI(const std::string &uri);
+ void setVoiceVolume(F32 volume);
+ void setMicGain(F32 volume);
+ void setUserVolume(const LLUUID& id, F32 volume); // set's volume for specified agent, from 0-1 (where .5 is nominal)
+ bool voiceEnabled();
+ void setLipSyncEnabled(BOOL enabled);
+ void setMuteMic(bool muted); // Use this to mute the local mic (for when the client is minimized, etc), ignoring user PTT state.
+ void setUserPTTState(bool ptt);
+ bool getUserPTTState();
+ void toggleUserPTTState(void);
+ void inputUserControlState(bool down); // interpret any sort of up-down mic-open control input according to ptt-toggle prefs
+ void setVoiceEnabled(bool enabled);
+
+ void setUsePTT(bool usePTT);
+ void setPTTIsToggle(bool PTTIsToggle);
+ bool getPTTIsToggle();
+
+ BOOL lipSyncEnabled();
+
+ // PTT key triggering
+ void keyDown(KEY key, MASK mask);
+ void keyUp(KEY key, MASK mask);
+ void middleMouseState(bool down);
+
+
+ /////////////////////////////
+ // Accessors for data related to nearby speakers
+ BOOL getVoiceEnabled(const LLUUID& id); // true if we've received data for this avatar
+ std::string getDisplayName(const LLUUID& id);
+ BOOL isOnlineSIP(const LLUUID &id);
+ BOOL isParticipantAvatar(const LLUUID &id);
+ BOOL getIsSpeaking(const LLUUID& id);
+ BOOL getIsModeratorMuted(const LLUUID& id);
+ F32 getCurrentPower(const LLUUID& id); // "power" is related to "amplitude" in a defined way. I'm just not sure what the formula is...
+ BOOL getOnMuteList(const LLUUID& id);
+ F32 getUserVolume(const LLUUID& id);
+
+ /////////////////////////////
+ BOOL getAreaVoiceDisabled(); // returns true if the area the avatar is in is speech-disabled.
+ // Use this to determine whether to show a "no speech" icon in the menu bar.
+ void getParticipantList(std::set<LLUUID> &participants);
+ bool isParticipant(const LLUUID& speaker_id);
+
+ //////////////////////////
+ /// @name text chat
+ //@{
+ BOOL isSessionTextIMPossible(const LLUUID& id);
+ BOOL isSessionCallBackPossible(const LLUUID& id);
+ BOOL sendTextMessage(const LLUUID& participant_id, const std::string& message);
+ void endUserIMSession(const LLUUID &uuid);
+ //@}
+
- bool inSpatialChannel(void);
- std::string getAudioSessionURI();
- std::string getAudioSessionHandle();
-
- void sendPositionalUpdate(void);
-
- void buildSetCaptureDevice(std::ostringstream &stream);
- void buildSetRenderDevice(std::ostringstream &stream);
- void buildLocalAudioUpdates(std::ostringstream &stream);
-
- void clearAllLists();
- void checkFriend(const LLUUID& id);
- void sendFriendsListUpdates();
-
- // start a text IM session with the specified user
- // This will be asynchronous, the session may be established at a future time.
- sessionState* startUserIMSession(const LLUUID& uuid);
- void sendQueuedTextMessages(sessionState *session);
-
- void enforceTether(void);
-
- bool mSpatialCoordsDirty;
-
- LLVector3d mCameraPosition;
- LLVector3d mCameraRequestedPosition;
- LLVector3 mCameraVelocity;
- LLMatrix3 mCameraRot;
-
- LLVector3d mAvatarPosition;
- LLVector3 mAvatarVelocity;
- LLMatrix3 mAvatarRot;
-
- bool mPTTDirty;
- bool mPTT;
-
- bool mUsePTT;
- bool mPTTIsMiddleMouse;
- KEY mPTTKey;
- bool mPTTIsToggle;
- bool mUserPTTState;
- bool mMuteMic;
-
- // Set to true when the friends list is known to have changed.
- bool mFriendsListDirty;
-
- enum
- {
- earLocCamera = 0, // ear at camera
- earLocAvatar, // ear at avatar
- earLocMixed // ear at avatar location/camera direction
- };
-
- S32 mEarLocation;
-
- bool mSpeakerVolumeDirty;
- bool mSpeakerMuteDirty;
- int mSpeakerVolume;
+ void userAuthorized(const std::string& user_id,
+ const LLUUID &agentID);
+
+ void addObserver(LLVoiceClientStatusObserver* observer);
+ void removeObserver(LLVoiceClientStatusObserver* observer);
+ void addObserver(LLFriendObserver* observer);
+ void removeObserver(LLFriendObserver* observer);
+ void addObserver(LLVoiceClientParticipantObserver* observer);
+ void removeObserver(LLVoiceClientParticipantObserver* observer);
+
+ std::string sipURIFromID(const LLUUID &id);
- int mMicVolume;
- bool mMicVolumeDirty;
-
- bool mVoiceEnabled;
- bool mWriteInProgress;
- std::string mWriteString;
-
- LLTimer mUpdateTimer;
-
- BOOL mLipSyncEnabled;
+ //////////////////////////
+ /// @name Voice effects
+ //@{
+ bool getVoiceEffectEnabled() const { return mVoiceEffectEnabled; };
+ LLUUID getVoiceEffectDefault() const { return LLUUID(mVoiceEffectDefault); };
- std::string mAPIVersion;
+ // Returns NULL if voice effects are not supported, or not enabled.
+ LLVoiceEffectInterface* getVoiceEffectInterface() const;
+ //@}
- typedef std::set<LLVoiceClientParticipantObserver*> observer_set_t;
- observer_set_t mParticipantObservers;
+protected:
+ LLVoiceModuleInterface* mVoiceModule;
+ LLPumpIO *m_servicePump;
- void notifyParticipantObservers();
+ LLCachedControl<bool> mVoiceEffectEnabled;
+ LLCachedControl<std::string> mVoiceEffectDefault;
+};
- typedef std::set<LLVoiceClientStatusObserver*> status_observer_set_t;
- status_observer_set_t mStatusObservers;
-
- void notifyStatusObservers(LLVoiceClientStatusObserver::EStatusType status);
+/**
+ * Speaker volume storage helper class
+ **/
+class LLSpeakerVolumeStorage : public LLSingleton<LLSpeakerVolumeStorage>
+{
+ LOG_CLASS(LLSpeakerVolumeStorage);
+public:
- typedef std::set<LLFriendObserver*> friend_observer_set_t;
- friend_observer_set_t mFriendObservers;
- void notifyFriendObservers();
+ /**
+ * Stores volume level for specified user.
+ *
+ * @param[in] speaker_id - LLUUID of user to store volume level for.
+ * @param[in] volume - volume level to be stored for user.
+ */
+ void storeSpeakerVolume(const LLUUID& speaker_id, F32 volume);
+
+ /**
+ * Gets stored volume level for specified speaker
+ *
+ * @param[in] speaker_id - LLUUID of user to retrieve volume level for.
+ * @param[out] volume - set to stored volume if found, otherwise unmodified.
+ * @return - true if a stored volume is found.
+ */
+ bool getSpeakerVolume(const LLUUID& speaker_id, F32& volume);
+
+ /**
+ * Removes stored volume level for specified user.
+ *
+ * @param[in] speaker_id - LLUUID of user to remove.
+ */
+ void removeSpeakerVolume(const LLUUID& speaker_id);
+
+private:
+ friend class LLSingleton<LLSpeakerVolumeStorage>;
+ LLSpeakerVolumeStorage();
+ ~LLSpeakerVolumeStorage();
+
+ const static std::string SETTINGS_FILE_NAME;
+
+ void load();
+ void save();
+
+ static F32 transformFromLegacyVolume(F32 volume_in);
+ static F32 transformToLegacyVolume(F32 volume_in);
+
+ typedef std::map<LLUUID, F32> speaker_data_map_t;
+ speaker_data_map_t mSpeakersData;
};
-extern LLVoiceClient *gVoiceClient;
-
#endif //LL_VOICE_CLIENT_H
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
new file mode 100644
index 0000000000..4dc9edb247
--- /dev/null
+++ b/indra/newview/llvoicevivox.cpp
@@ -0,0 +1,7879 @@
+ /**
+ * @file LLVivoxVoiceClient.cpp
+ * @brief Implementation of LLVivoxVoiceClient class which is the interface to the voice client process.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llvoicevivox.h"
+
+#include <boost/tokenizer.hpp>
+
+#include "llsdutil.h"
+
+#include "llvoavatarself.h"
+#include "llbufferstream.h"
+#include "llfile.h"
+#ifdef LL_STANDALONE
+# include "expat.h"
+#else
+# include "expat/expat.h"
+#endif
+#include "llcallbacklist.h"
+#include "llviewerregion.h"
+#include "llviewernetwork.h" // for gGridChoice
+#include "llbase64.h"
+#include "llviewercontrol.h"
+#include "llkeyboard.h"
+#include "llappviewer.h" // for gDisconnected, gDisableVoice
+#include "llmutelist.h" // to check for muted avatars
+#include "llagent.h"
+#include "llcachename.h"
+#include "llimview.h" // for LLIMMgr
+#include "llparcel.h"
+#include "llviewerparcelmgr.h"
+//#include "llfirstuse.h"
+#include "llspeakers.h"
+#include "lltrans.h"
+#include "llviewerwindow.h"
+#include "llviewercamera.h"
+
+#include "llfloaterfriends.h" //VIVOX, inorder to refresh communicate panel
+#include "llviewernetwork.h"
+#include "llnotificationsutil.h"
+
+#include "stringize.h"
+
+// for base64 decoding
+#include "apr_base64.h"
+
+#define USE_SESSION_GROUPS 0
+
+const F32 VOLUME_SCALE_VIVOX = 0.01f;
+
+const F32 SPEAKING_TIMEOUT = 1.f;
+
+static const std::string VOICE_SERVER_TYPE = "Vivox";
+
+// Don't retry connecting to the daemon more frequently than this:
+const F32 CONNECT_THROTTLE_SECONDS = 1.0f;
+
+// Don't send positional updates more frequently than this:
+const F32 UPDATE_THROTTLE_SECONDS = 0.1f;
+
+const F32 LOGIN_RETRY_SECONDS = 10.0f;
+const int MAX_LOGIN_RETRIES = 12;
+
+// Defines the maximum number of times(in a row) "stateJoiningSession" case for spatial channel is reached in stateMachine()
+// which is treated as normal. If this number is exceeded we suspect there is a problem with connection
+// to voice server (EXT-4313). When voice works correctly, there is from 1 to 15 times. 50 was chosen
+// to make sure we don't make mistake when slight connection problems happen- situation when connection to server is
+// blocked is VERY rare and it's better to sacrifice response time in this situation for the sake of stability.
+const int MAX_NORMAL_JOINING_SPATIAL_NUM = 50;
+
+// How often to check for expired voice fonts in seconds
+const F32 VOICE_FONT_EXPIRY_INTERVAL = 10.f;
+// Time of day at which Vivox expires voice font subscriptions.
+// Used to replace the time portion of received expiry timestamps.
+static const std::string VOICE_FONT_EXPIRY_TIME = "T05:00:00Z";
+
+// Maximum length of capture buffer recordings in seconds.
+const F32 CAPTURE_BUFFER_MAX_TIME = 10.f;
+
+
+static int scale_mic_volume(float volume)
+{
+ // incoming volume has the range [0.0 ... 2.0], with 1.0 as the default.
+ // 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 to Vivox levels as follows: 0.0 -> 30, 0.5 -> 50, 1.0 -> 70
+ return 30 + (int)(volume * 40.0f);
+
+}
+
+class LLVivoxVoiceAccountProvisionResponder :
+ public LLHTTPClient::Responder
+{
+public:
+ LLVivoxVoiceAccountProvisionResponder(int retries)
+ {
+ mRetries = retries;
+ }
+
+ virtual void error(U32 status, const std::string& reason)
+ {
+ if ( mRetries > 0 )
+ {
+ LL_WARNS("Voice") << "ProvisionVoiceAccountRequest returned an error, retrying. status = " << status << ", reason = \"" << reason << "\"" << LL_ENDL;
+ LLVivoxVoiceClient::getInstance()->requestVoiceAccountProvision(
+ mRetries - 1);
+ }
+ else
+ {
+ LL_WARNS("Voice") << "ProvisionVoiceAccountRequest returned an error, too many retries (giving up). status = " << status << ", reason = \"" << reason << "\"" << LL_ENDL;
+ LLVivoxVoiceClient::getInstance()->giveUp();
+ }
+ }
+
+ virtual void result(const LLSD& content)
+ {
+
+ std::string voice_sip_uri_hostname;
+ std::string voice_account_server_uri;
+
+ LL_DEBUGS("Voice") << "ProvisionVoiceAccountRequest response:" << ll_pretty_print_sd(content) << LL_ENDL;
+
+ if(content.has("voice_sip_uri_hostname"))
+ voice_sip_uri_hostname = content["voice_sip_uri_hostname"].asString();
+
+ // this key is actually misnamed -- it will be an entire URI, not just a hostname.
+ if(content.has("voice_account_server_name"))
+ voice_account_server_uri = content["voice_account_server_name"].asString();
+
+ LLVivoxVoiceClient::getInstance()->login(
+ content["username"].asString(),
+ content["password"].asString(),
+ voice_sip_uri_hostname,
+ voice_account_server_uri);
+
+ }
+
+private:
+ int mRetries;
+};
+
+
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+
+class LLVivoxVoiceClientMuteListObserver : public LLMuteListObserver
+{
+ /* virtual */ void onChange() { LLVivoxVoiceClient::getInstance()->muteListChanged();}
+};
+
+class LLVivoxVoiceClientFriendsObserver : public LLFriendObserver
+{
+public:
+ /* virtual */ void changed(U32 mask) { LLVivoxVoiceClient::getInstance()->updateFriends(mask);}
+};
+
+static LLVivoxVoiceClientMuteListObserver mutelist_listener;
+static bool sMuteListListener_listening = false;
+
+static LLVivoxVoiceClientFriendsObserver *friendslist_listener = NULL;
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+
+class LLVivoxVoiceClientCapResponder : public LLHTTPClient::Responder
+{
+public:
+ LLVivoxVoiceClientCapResponder(void){};
+
+ virtual void error(U32 status, const std::string& reason); // called with bad status codes
+ virtual void result(const LLSD& content);
+
+private:
+};
+
+void LLVivoxVoiceClientCapResponder::error(U32 status, const std::string& reason)
+{
+ LL_WARNS("Voice") << "LLVivoxVoiceClientCapResponder::error("
+ << status << ": " << reason << ")"
+ << LL_ENDL;
+}
+
+void LLVivoxVoiceClientCapResponder::result(const LLSD& content)
+{
+ LLSD::map_const_iterator iter;
+
+ LL_DEBUGS("Voice") << "ParcelVoiceInfoRequest response:" << ll_pretty_print_sd(content) << LL_ENDL;
+
+ if ( content.has("voice_credentials") )
+ {
+ LLSD voice_credentials = content["voice_credentials"];
+ std::string uri;
+ std::string credentials;
+
+ if ( voice_credentials.has("channel_uri") )
+ {
+ uri = voice_credentials["channel_uri"].asString();
+ }
+ if ( voice_credentials.has("channel_credentials") )
+ {
+ credentials =
+ voice_credentials["channel_credentials"].asString();
+ }
+
+ LLVivoxVoiceClient::getInstance()->setSpatialChannel(uri, credentials);
+ }
+}
+
+
+
+#if LL_WINDOWS
+static HANDLE sGatewayHandle = 0;
+
+static bool isGatewayRunning()
+{
+ bool result = false;
+ if(sGatewayHandle != 0)
+ {
+ DWORD waitresult = WaitForSingleObject(sGatewayHandle, 0);
+ if(waitresult != WAIT_OBJECT_0)
+ {
+ result = true;
+ }
+ }
+ return result;
+}
+static void killGateway()
+{
+ if(sGatewayHandle != 0)
+ {
+ TerminateProcess(sGatewayHandle,0);
+ }
+}
+
+#else // Mac and linux
+
+static pid_t sGatewayPID = 0;
+static bool isGatewayRunning()
+{
+ bool result = false;
+ if(sGatewayPID != 0)
+ {
+ // A kill with signal number 0 has no effect, just does error checking. It should return an error if the process no longer exists.
+ if(kill(sGatewayPID, 0) == 0)
+ {
+ result = true;
+ }
+ }
+ return result;
+}
+
+static void killGateway()
+{
+ if(sGatewayPID != 0)
+ {
+ kill(sGatewayPID, SIGTERM);
+ }
+}
+
+#endif
+
+///////////////////////////////////////////////////////////////////////////////////////////////
+
+LLVivoxVoiceClient::LLVivoxVoiceClient() :
+ mState(stateDisabled),
+ mSessionTerminateRequested(false),
+ mRelogRequested(false),
+ mConnected(false),
+ mPump(NULL),
+ mSpatialJoiningNum(0),
+
+ mTuningMode(false),
+ mTuningEnergy(0.0f),
+ mTuningMicVolume(0),
+ mTuningMicVolumeDirty(true),
+ mTuningSpeakerVolume(0),
+ mTuningSpeakerVolumeDirty(true),
+ mTuningExitState(stateDisabled),
+
+ mAreaVoiceDisabled(false),
+ mAudioSession(NULL),
+ mAudioSessionChanged(false),
+ mNextAudioSession(NULL),
+
+ mCurrentParcelLocalID(0),
+ mNumberOfAliases(0),
+ mCommandCookie(0),
+ mLoginRetryCount(0),
+
+ mBuddyListMapPopulated(false),
+ mBlockRulesListReceived(false),
+ mAutoAcceptRulesListReceived(false),
+
+ mCaptureDeviceDirty(false),
+ mRenderDeviceDirty(false),
+ mSpatialCoordsDirty(false),
+
+ mPTTDirty(true),
+ mPTT(true),
+ mUsePTT(true),
+ mPTTIsMiddleMouse(false),
+ mPTTKey(0),
+ mPTTIsToggle(false),
+ mUserPTTState(false),
+ mMuteMic(false),
+ mFriendsListDirty(true),
+
+ mEarLocation(0),
+ mSpeakerVolumeDirty(true),
+ mSpeakerMuteDirty(true),
+ mMicVolume(0),
+ mMicVolumeDirty(true),
+
+ mVoiceEnabled(false),
+ mWriteInProgress(false),
+
+ mLipSyncEnabled(false),
+
+ mVoiceFontsReceived(false),
+ mVoiceFontsNew(false),
+ mVoiceFontListDirty(false),
+
+ mCaptureBufferMode(false),
+ mCaptureBufferRecording(false),
+ mCaptureBufferRecorded(false),
+ mCaptureBufferPlaying(false),
+ mPlayRequestCount(0)
+{
+ mSpeakerVolume = scale_speaker_volume(0);
+
+ mVoiceVersion.serverVersion = "";
+ mVoiceVersion.serverType = VOICE_SERVER_TYPE;
+
+ // gMuteListp isn't set up at this point, so we defer this until later.
+// gMuteListp->addObserver(&mutelist_listener);
+
+
+#if LL_DARWIN || LL_LINUX || LL_SOLARIS
+ // HACK: THIS DOES NOT BELONG HERE
+ // When the vivox daemon dies, the next write attempt on our socket generates a SIGPIPE, which kills us.
+ // This should cause us to ignore SIGPIPE and handle the error through proper channels.
+ // This should really be set up elsewhere. Where should it go?
+ signal(SIGPIPE, SIG_IGN);
+
+ // Since we're now launching the gateway with fork/exec instead of system(), we need to deal with zombie processes.
+ // Ignoring SIGCHLD should prevent zombies from being created. Alternately, we could use wait(), but I'd rather not do that.
+ signal(SIGCHLD, SIG_IGN);
+#endif
+
+ // set up state machine
+ setState(stateDisabled);
+
+ gIdleCallbacks.addFunction(idle, this);
+}
+
+//---------------------------------------------------
+
+LLVivoxVoiceClient::~LLVivoxVoiceClient()
+{
+}
+
+//----------------------------------------------
+
+void LLVivoxVoiceClient::init(LLPumpIO *pump)
+{
+ // constructor will set up LLVoiceClient::getInstance()
+ LLVivoxVoiceClient::getInstance()->mPump = pump;
+}
+
+void LLVivoxVoiceClient::terminate()
+{
+ if(mConnected)
+ {
+ logout();
+ connectorShutdown();
+ closeSocket(); // Need to do this now -- bad things happen if the destructor does it later.
+ }
+ else
+ {
+ killGateway();
+ }
+}
+
+const LLVoiceVersionInfo& LLVivoxVoiceClient::getVersion()
+{
+ return mVoiceVersion;
+}
+
+//---------------------------------------------------
+
+void LLVivoxVoiceClient::updateSettings()
+{
+ setVoiceEnabled(gSavedSettings.getBOOL("EnableVoiceChat"));
+ setUsePTT(gSavedSettings.getBOOL("PTTCurrentlyEnabled"));
+ std::string keyString = gSavedSettings.getString("PushToTalkButton");
+ setPTTKey(keyString);
+ setPTTIsToggle(gSavedSettings.getBOOL("PushToTalkToggle"));
+ setEarLocation(gSavedSettings.getS32("VoiceEarLocation"));
+
+ std::string inputDevice = gSavedSettings.getString("VoiceInputAudioDevice");
+ setCaptureDevice(inputDevice);
+ std::string outputDevice = gSavedSettings.getString("VoiceOutputAudioDevice");
+ setRenderDevice(outputDevice);
+ F32 mic_level = gSavedSettings.getF32("AudioLevelMic");
+ setMicGain(mic_level);
+ setLipSyncEnabled(gSavedSettings.getBOOL("LipSyncEnabled"));
+}
+
+/////////////////////////////
+// utility functions
+
+bool LLVivoxVoiceClient::writeString(const std::string &str)
+{
+ bool result = false;
+ if(mConnected)
+ {
+ apr_status_t err;
+ apr_size_t size = (apr_size_t)str.size();
+ apr_size_t written = size;
+
+ //MARK: Turn this on to log outgoing XML
+// LL_DEBUGS("Voice") << "sending: " << str << LL_ENDL;
+
+ // check return code - sockets will fail (broken, etc.)
+ err = apr_socket_send(
+ mSocket->getSocket(),
+ (const char*)str.data(),
+ &written);
+
+ if(err == 0)
+ {
+ // Success.
+ result = true;
+ }
+ // TODO: handle partial writes (written is number of bytes written)
+ // Need to set socket to non-blocking before this will work.
+// else if(APR_STATUS_IS_EAGAIN(err))
+// {
+// //
+// }
+ else
+ {
+ // Assume any socket error means something bad. For now, just close the socket.
+ char buf[MAX_STRING];
+ LL_WARNS("Voice") << "apr error " << err << " ("<< apr_strerror(err, buf, MAX_STRING) << ") sending data to vivox daemon." << LL_ENDL;
+ daemonDied();
+ }
+ }
+
+ return result;
+}
+
+
+/////////////////////////////
+// session control messages
+void LLVivoxVoiceClient::connectorCreate()
+{
+ std::ostringstream stream;
+ std::string logpath = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "");
+ std::string loglevel = "0";
+
+ // Transition to stateConnectorStarted when the connector handle comes back.
+ setState(stateConnectorStarting);
+
+ std::string savedLogLevel = gSavedSettings.getString("VivoxDebugLevel");
+
+ if(savedLogLevel != "-1")
+ {
+ LL_DEBUGS("Voice") << "creating connector with logging enabled" << LL_ENDL;
+ loglevel = "10";
+ }
+
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.Create.1\">"
+ << "<ClientName>V2 SDK</ClientName>"
+ << "<AccountManagementServer>" << mVoiceAccountServerURI << "</AccountManagementServer>"
+ << "<Mode>Normal</Mode>"
+ << "<Logging>"
+ << "<Folder>" << logpath << "</Folder>"
+ << "<FileNamePrefix>Connector</FileNamePrefix>"
+ << "<FileNameSuffix>.log</FileNameSuffix>"
+ << "<LogLevel>" << loglevel << "</LogLevel>"
+ << "</Logging>"
+ << "<Application>SecondLifeViewer.1</Application>"
+ << "</Request>\n\n\n";
+
+ writeString(stream.str());
+}
+
+void LLVivoxVoiceClient::connectorShutdown()
+{
+ setState(stateConnectorStopping);
+
+ if(!mConnectorHandle.empty())
+ {
+ std::ostringstream stream;
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.InitiateShutdown.1\">"
+ << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>"
+ << "</Request>"
+ << "\n\n\n";
+
+ mConnectorHandle.clear();
+
+ writeString(stream.str());
+ }
+}
+
+void LLVivoxVoiceClient::userAuthorized(const std::string& user_id, const LLUUID &agentID)
+{
+
+ mAccountDisplayName = user_id;
+
+ LL_INFOS("Voice") << "name \"" << mAccountDisplayName << "\" , ID " << agentID << LL_ENDL;
+
+ mAccountName = nameFromID(agentID);
+}
+
+void LLVivoxVoiceClient::requestVoiceAccountProvision(S32 retries)
+{
+ if ( gAgent.getRegion() && mVoiceEnabled )
+ {
+ std::string url =
+ gAgent.getRegion()->getCapability(
+ "ProvisionVoiceAccountRequest");
+
+ if ( url == "" ) return;
+
+ LLHTTPClient::post(
+ url,
+ LLSD(),
+ new LLVivoxVoiceAccountProvisionResponder(retries));
+ }
+}
+
+void LLVivoxVoiceClient::login(
+ const std::string& account_name,
+ const std::string& password,
+ const std::string& voice_sip_uri_hostname,
+ const std::string& voice_account_server_uri)
+{
+ mVoiceSIPURIHostName = voice_sip_uri_hostname;
+ mVoiceAccountServerURI = voice_account_server_uri;
+
+ if(!mAccountHandle.empty())
+ {
+ // Already logged in.
+ LL_WARNS("Voice") << "Called while already logged in." << LL_ENDL;
+
+ // Don't process another login.
+ return;
+ }
+ else if ( account_name != mAccountName )
+ {
+ //TODO: error?
+ LL_WARNS("Voice") << "Wrong account name! " << account_name
+ << " instead of " << mAccountName << LL_ENDL;
+ }
+ else
+ {
+ mAccountPassword = password;
+ }
+
+ std::string debugSIPURIHostName = gSavedSettings.getString("VivoxDebugSIPURIHostName");
+
+ if( !debugSIPURIHostName.empty() )
+ {
+ mVoiceSIPURIHostName = debugSIPURIHostName;
+ }
+
+ if( mVoiceSIPURIHostName.empty() )
+ {
+ // we have an empty account server name
+ // so we fall back to hardcoded defaults
+
+ if(LLGridManager::getInstance()->isInProductionGrid())
+ {
+ // Use the release account server
+ mVoiceSIPURIHostName = "bhr.vivox.com";
+ }
+ else
+ {
+ // Use the development account server
+ mVoiceSIPURIHostName = "bhd.vivox.com";
+ }
+ }
+
+ std::string debugAccountServerURI = gSavedSettings.getString("VivoxDebugVoiceAccountServerURI");
+
+ if( !debugAccountServerURI.empty() )
+ {
+ mVoiceAccountServerURI = debugAccountServerURI;
+ }
+
+ if( mVoiceAccountServerURI.empty() )
+ {
+ // If the account server URI isn't specified, construct it from the SIP URI hostname
+ mVoiceAccountServerURI = "https://www." + mVoiceSIPURIHostName + "/api2/";
+ }
+}
+
+void LLVivoxVoiceClient::idle(void* user_data)
+{
+ LLVivoxVoiceClient* self = (LLVivoxVoiceClient*)user_data;
+ self->stateMachine();
+}
+
+std::string LLVivoxVoiceClient::state2string(LLVivoxVoiceClient::state inState)
+{
+ std::string result = "UNKNOWN";
+
+ // Prevent copy-paste errors when updating this list...
+#define CASE(x) case x: result = #x; break
+
+ switch(inState)
+ {
+ CASE(stateDisableCleanup);
+ CASE(stateDisabled);
+ CASE(stateStart);
+ CASE(stateDaemonLaunched);
+ CASE(stateConnecting);
+ CASE(stateConnected);
+ CASE(stateIdle);
+ CASE(stateMicTuningStart);
+ CASE(stateMicTuningRunning);
+ CASE(stateMicTuningStop);
+ CASE(stateCaptureBufferPaused);
+ CASE(stateCaptureBufferRecStart);
+ CASE(stateCaptureBufferRecording);
+ CASE(stateCaptureBufferPlayStart);
+ CASE(stateCaptureBufferPlaying);
+ CASE(stateConnectorStart);
+ CASE(stateConnectorStarting);
+ CASE(stateConnectorStarted);
+ CASE(stateLoginRetry);
+ CASE(stateLoginRetryWait);
+ CASE(stateNeedsLogin);
+ CASE(stateLoggingIn);
+ CASE(stateLoggedIn);
+ CASE(stateVoiceFontsWait);
+ CASE(stateVoiceFontsReceived);
+ CASE(stateCreatingSessionGroup);
+ CASE(stateNoChannel);
+ CASE(stateJoiningSession);
+ CASE(stateSessionJoined);
+ CASE(stateRunning);
+ CASE(stateLeavingSession);
+ CASE(stateSessionTerminated);
+ CASE(stateLoggingOut);
+ CASE(stateLoggedOut);
+ CASE(stateConnectorStopping);
+ CASE(stateConnectorStopped);
+ CASE(stateConnectorFailed);
+ CASE(stateConnectorFailedWaiting);
+ CASE(stateLoginFailed);
+ CASE(stateLoginFailedWaiting);
+ CASE(stateJoinSessionFailed);
+ CASE(stateJoinSessionFailedWaiting);
+ CASE(stateJail);
+ }
+
+#undef CASE
+
+ return result;
+}
+
+
+
+void LLVivoxVoiceClient::setState(state inState)
+{
+ LL_DEBUGS("Voice") << "entering state " << state2string(inState) << LL_ENDL;
+
+ mState = inState;
+}
+
+void LLVivoxVoiceClient::stateMachine()
+{
+ if(gDisconnected)
+ {
+ // The viewer has been disconnected from the sim. Disable voice.
+ setVoiceEnabled(false);
+ }
+
+ if(mVoiceEnabled)
+ {
+ updatePosition();
+ }
+ else if(mTuningMode)
+ {
+ // Tuning mode is special -- it needs to launch SLVoice even if voice is disabled.
+ }
+ else
+ {
+ if((getState() != stateDisabled) && (getState() != stateDisableCleanup))
+ {
+ // User turned off voice support. Send the cleanup messages, close the socket, and reset.
+ if(!mConnected)
+ {
+ // if voice was turned off after the daemon was launched but before we could connect to it, we may need to issue a kill.
+ LL_INFOS("Voice") << "Disabling voice before connection to daemon, terminating." << LL_ENDL;
+ killGateway();
+ }
+
+ logout();
+ connectorShutdown();
+
+ setState(stateDisableCleanup);
+ }
+ }
+
+ // Check for parcel boundary crossing
+ {
+ LLViewerRegion *region = gAgent.getRegion();
+ LLParcel *parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+
+ if(region && parcel)
+ {
+ S32 parcelLocalID = parcel->getLocalID();
+ std::string regionName = region->getName();
+ std::string capURI = region->getCapability("ParcelVoiceInfoRequest");
+
+// LL_DEBUGS("Voice") << "Region name = \"" << regionName << "\", parcel local ID = " << parcelLocalID << ", cap URI = \"" << capURI << "\"" << LL_ENDL;
+
+ // The region name starts out empty and gets filled in later.
+ // Also, the cap gets filled in a short time after the region cross, but a little too late for our purposes.
+ // If either is empty, wait for the next time around.
+ if(!regionName.empty())
+ {
+ if(!capURI.empty())
+ {
+ if((parcelLocalID != mCurrentParcelLocalID) || (regionName != mCurrentRegionName))
+ {
+ // We have changed parcels. Initiate a parcel channel lookup.
+ mCurrentParcelLocalID = parcelLocalID;
+ mCurrentRegionName = regionName;
+
+ parcelChanged();
+ }
+ }
+ else
+ {
+ LL_WARNS_ONCE("Voice") << "region doesn't have ParcelVoiceInfoRequest capability. This is normal for a short time after teleporting, but bad if it persists for very long." << LL_ENDL;
+ }
+ }
+ }
+ }
+
+ switch(getState())
+ {
+ //MARK: stateDisableCleanup
+ case stateDisableCleanup:
+ // Clean up and reset everything.
+ closeSocket();
+ deleteAllSessions();
+ deleteAllBuddies();
+ deleteAllVoiceFonts();
+ deleteVoiceFontTemplates();
+
+ mConnectorHandle.clear();
+ mAccountHandle.clear();
+ mAccountPassword.clear();
+ mVoiceAccountServerURI.clear();
+
+ setState(stateDisabled);
+ break;
+
+ //MARK: stateDisabled
+ case stateDisabled:
+ if(mTuningMode || (mVoiceEnabled && !mAccountName.empty()))
+ {
+ setState(stateStart);
+ }
+ break;
+
+ //MARK: stateStart
+ case stateStart:
+ if(gSavedSettings.getBOOL("CmdLineDisableVoice"))
+ {
+ // Voice is locked out, we must not launch the vivox daemon.
+ setState(stateJail);
+ }
+ else if(!isGatewayRunning())
+ {
+ if(true)
+ {
+ // Launch the voice daemon
+
+ // *FIX:Mani - Using the executable dir instead
+ // of mAppRODataDir, the working directory from which the app
+ // is launched.
+ //std::string exe_path = gDirUtilp->getAppRODataDir();
+ std::string exe_path = gDirUtilp->getExecutableDir();
+ exe_path += gDirUtilp->getDirDelimiter();
+#if LL_WINDOWS
+ exe_path += "SLVoice.exe";
+#elif LL_DARWIN
+ exe_path += "../Resources/SLVoice";
+#else
+ exe_path += "SLVoice";
+#endif
+ // See if the vivox executable exists
+ llstat s;
+ if(!LLFile::stat(exe_path, &s))
+ {
+ // vivox executable exists. Build the command line and launch the daemon.
+ // SLIM SDK: these arguments are no longer necessary.
+// std::string args = " -p tcp -h -c";
+ std::string args;
+ std::string cmd;
+ std::string loglevel = gSavedSettings.getString("VivoxDebugLevel");
+
+ if(loglevel.empty())
+ {
+ loglevel = "-1"; // turn logging off completely
+ }
+
+ args += " -ll ";
+ args += loglevel;
+
+ LL_DEBUGS("Voice") << "Args for SLVoice: " << args << LL_ENDL;
+
+#if LL_WINDOWS
+ PROCESS_INFORMATION pinfo;
+ STARTUPINFOA sinfo;
+
+ memset(&sinfo, 0, sizeof(sinfo));
+
+ std::string exe_dir = gDirUtilp->getAppRODataDir();
+ cmd = "SLVoice.exe";
+ cmd += args;
+
+ // So retarded. Windows requires that the second parameter to CreateProcessA be writable (non-const) string...
+ char *args2 = new char[args.size() + 1];
+ strcpy(args2, args.c_str());
+ if(!CreateProcessA(exe_path.c_str(), args2, NULL, NULL, FALSE, 0, NULL, exe_dir.c_str(), &sinfo, &pinfo))
+ {
+// DWORD dwErr = GetLastError();
+ }
+ else
+ {
+ // foo = pinfo.dwProcessId; // get your pid here if you want to use it later on
+ // CloseHandle(pinfo.hProcess); // stops leaks - nothing else
+ sGatewayHandle = pinfo.hProcess;
+ CloseHandle(pinfo.hThread); // stops leaks - nothing else
+ }
+
+ delete[] args2;
+#else // LL_WINDOWS
+ // This should be the same for mac and linux
+ {
+ std::vector<std::string> arglist;
+ arglist.push_back(exe_path);
+
+ // Split the argument string into separate strings for each argument
+ typedef boost::tokenizer<boost::char_separator<char> > tokenizer;
+ boost::char_separator<char> sep(" ");
+ tokenizer tokens(args, sep);
+ tokenizer::iterator token_iter;
+
+ for(token_iter = tokens.begin(); token_iter != tokens.end(); ++token_iter)
+ {
+ arglist.push_back(*token_iter);
+ }
+
+ // create an argv vector for the child process
+ char **fakeargv = new char*[arglist.size() + 1];
+ int i;
+ for(i=0; i < arglist.size(); i++)
+ fakeargv[i] = const_cast<char*>(arglist[i].c_str());
+
+ fakeargv[i] = NULL;
+
+ fflush(NULL); // flush all buffers before the child inherits them
+ pid_t id = vfork();
+ if(id == 0)
+ {
+ // child
+ execv(exe_path.c_str(), fakeargv);
+
+ // If we reach this point, the exec failed.
+ // Use _exit() instead of exit() per the vfork man page.
+ _exit(0);
+ }
+
+ // parent
+ delete[] fakeargv;
+ sGatewayPID = id;
+ }
+#endif // LL_WINDOWS
+ mDaemonHost = LLHost(gSavedSettings.getString("VivoxVoiceHost").c_str(), gSavedSettings.getU32("VivoxVoicePort"));
+ }
+ else
+ {
+ LL_INFOS("Voice") << exe_path << " not found." << LL_ENDL;
+ }
+ }
+ else
+ {
+ // SLIM SDK: port changed from 44124 to 44125.
+ // We can connect to a client gateway running on another host. This is useful for testing.
+ // To do this, launch the gateway on a nearby host like this:
+ // vivox-gw.exe -p tcp -i 0.0.0.0:44125
+ // and put that host's IP address here.
+ mDaemonHost = LLHost(gSavedSettings.getString("VivoxVoiceHost"), gSavedSettings.getU32("VivoxVoicePort"));
+ }
+
+ mUpdateTimer.start();
+ mUpdateTimer.setTimerExpirySec(CONNECT_THROTTLE_SECONDS);
+
+ setState(stateDaemonLaunched);
+
+ // Dirty the states we'll need to sync with the daemon when it comes up.
+ mPTTDirty = true;
+ mMicVolumeDirty = true;
+ mSpeakerVolumeDirty = true;
+ mSpeakerMuteDirty = true;
+ // These only need to be set if they're not default (i.e. empty string).
+ mCaptureDeviceDirty = !mCaptureDevice.empty();
+ mRenderDeviceDirty = !mRenderDevice.empty();
+
+ mMainSessionGroupHandle.clear();
+ }
+ break;
+
+ //MARK: stateDaemonLaunched
+ case stateDaemonLaunched:
+ if(mUpdateTimer.hasExpired())
+ {
+ LL_DEBUGS("Voice") << "Connecting to vivox daemon:" << mDaemonHost << LL_ENDL;
+
+ mUpdateTimer.setTimerExpirySec(CONNECT_THROTTLE_SECONDS);
+
+ if(!mSocket)
+ {
+ mSocket = LLSocket::create(gAPRPoolp, LLSocket::STREAM_TCP);
+ }
+
+ mConnected = mSocket->blockingConnect(mDaemonHost);
+ if(mConnected)
+ {
+ setState(stateConnecting);
+ }
+ else
+ {
+ // If the connect failed, the socket may have been put into a bad state. Delete it.
+ closeSocket();
+ }
+ }
+ break;
+
+ //MARK: stateConnecting
+ case stateConnecting:
+ // Can't do this until we have the pump available.
+ if(mPump)
+ {
+ // MBW -- Note to self: pumps and pipes examples in
+ // indra/test/io.cpp
+ // indra/test/llpipeutil.{cpp|h}
+
+ // Attach the pumps and pipes
+
+ LLPumpIO::chain_t readChain;
+
+ readChain.push_back(LLIOPipe::ptr_t(new LLIOSocketReader(mSocket)));
+ readChain.push_back(LLIOPipe::ptr_t(new LLVivoxProtocolParser()));
+
+ mPump->addChain(readChain, NEVER_CHAIN_EXPIRY_SECS);
+
+ setState(stateConnected);
+ }
+
+ break;
+
+ //MARK: stateConnected
+ case stateConnected:
+ // Initial devices query
+ getCaptureDevicesSendMessage();
+ getRenderDevicesSendMessage();
+
+ mLoginRetryCount = 0;
+
+ setState(stateIdle);
+ break;
+
+ //MARK: stateIdle
+ case stateIdle:
+ // This is the idle state where we're connected to the daemon but haven't set up a connector yet.
+ if(mTuningMode)
+ {
+ mTuningExitState = stateIdle;
+ setState(stateMicTuningStart);
+ }
+ else if(!mVoiceEnabled)
+ {
+ // We never started up the connector. This will shut down the daemon.
+ setState(stateConnectorStopped);
+ }
+ else if(!mAccountName.empty())
+ {
+ LLViewerRegion *region = gAgent.getRegion();
+
+ if(region)
+ {
+ if ( region->getCapability("ProvisionVoiceAccountRequest") != "" )
+ {
+ if ( mAccountPassword.empty() )
+ {
+ requestVoiceAccountProvision();
+ }
+ setState(stateConnectorStart);
+ }
+ else
+ {
+ LL_WARNS_ONCE("Voice") << "region doesn't have ProvisionVoiceAccountRequest capability!" << LL_ENDL;
+ }
+ }
+ }
+ break;
+
+ //MARK: stateMicTuningStart
+ case stateMicTuningStart:
+ if(mUpdateTimer.hasExpired())
+ {
+ if(mCaptureDeviceDirty || mRenderDeviceDirty)
+ {
+ // These can't be changed while in tuning mode. Set them before starting.
+ std::ostringstream stream;
+
+ buildSetCaptureDevice(stream);
+ buildSetRenderDevice(stream);
+
+ if(!stream.str().empty())
+ {
+ writeString(stream.str());
+ }
+
+ // This will come around again in the same state and start the capture, after the timer expires.
+ mUpdateTimer.start();
+ mUpdateTimer.setTimerExpirySec(UPDATE_THROTTLE_SECONDS);
+ }
+ else
+ {
+ // duration parameter is currently unused, per Mike S.
+ tuningCaptureStartSendMessage(10000);
+
+ setState(stateMicTuningRunning);
+ }
+ }
+
+ break;
+
+ //MARK: stateMicTuningRunning
+ case stateMicTuningRunning:
+ if(!mTuningMode || mCaptureDeviceDirty || mRenderDeviceDirty)
+ {
+ // All of these conditions make us leave tuning mode.
+ setState(stateMicTuningStop);
+ }
+ else
+ {
+ // process mic/speaker volume changes
+ if(mTuningMicVolumeDirty || mTuningSpeakerVolumeDirty)
+ {
+ std::ostringstream stream;
+
+ if(mTuningMicVolumeDirty)
+ {
+ LL_INFOS("Voice") << "setting tuning mic level to " << mTuningMicVolume << LL_ENDL;
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.SetMicLevel.1\">"
+ << "<Level>" << mTuningMicVolume << "</Level>"
+ << "</Request>\n\n\n";
+ }
+
+ if(mTuningSpeakerVolumeDirty)
+ {
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.SetSpeakerLevel.1\">"
+ << "<Level>" << mTuningSpeakerVolume << "</Level>"
+ << "</Request>\n\n\n";
+ }
+
+ mTuningMicVolumeDirty = false;
+ mTuningSpeakerVolumeDirty = false;
+
+ if(!stream.str().empty())
+ {
+ writeString(stream.str());
+ }
+ }
+ }
+ break;
+
+ //MARK: stateMicTuningStop
+ case stateMicTuningStop:
+ {
+ // transition out of mic tuning
+ tuningCaptureStopSendMessage();
+
+ setState(mTuningExitState);
+
+ // if we exited just to change devices, this will keep us from re-entering too fast.
+ mUpdateTimer.start();
+ mUpdateTimer.setTimerExpirySec(UPDATE_THROTTLE_SECONDS);
+
+ }
+ break;
+
+ //MARK: stateCaptureBufferPaused
+ case stateCaptureBufferPaused:
+ if (!mCaptureBufferMode)
+ {
+ // Leaving capture mode.
+
+ mCaptureBufferRecording = false;
+ mCaptureBufferRecorded = false;
+ mCaptureBufferPlaying = false;
+
+ // Return to stateNoChannel to trigger reconnection to a channel.
+ setState(stateNoChannel);
+ }
+ else if (mCaptureBufferRecording)
+ {
+ setState(stateCaptureBufferRecStart);
+ }
+ else if (mCaptureBufferPlaying)
+ {
+ setState(stateCaptureBufferPlayStart);
+ }
+ break;
+
+ //MARK: stateCaptureBufferRecStart
+ case stateCaptureBufferRecStart:
+ captureBufferRecordStartSendMessage();
+
+ // Flag that something is recorded to allow playback.
+ mCaptureBufferRecorded = true;
+
+ // Start the timer, recording will be stopped when it expires.
+ mCaptureTimer.start();
+ mCaptureTimer.setTimerExpirySec(CAPTURE_BUFFER_MAX_TIME);
+
+ // Update UI, should really use a separate callback.
+ notifyVoiceFontObservers();
+
+ setState(stateCaptureBufferRecording);
+ break;
+
+ //MARK: stateCaptureBufferRecording
+ case stateCaptureBufferRecording:
+ if (!mCaptureBufferMode || !mCaptureBufferRecording ||
+ mCaptureBufferPlaying || mCaptureTimer.hasExpired())
+ {
+ // Stop recording
+ captureBufferRecordStopSendMessage();
+ mCaptureBufferRecording = false;
+
+ // Update UI, should really use a separate callback.
+ notifyVoiceFontObservers();
+
+ setState(stateCaptureBufferPaused);
+ }
+ break;
+
+ //MARK: stateCaptureBufferPlayStart
+ case stateCaptureBufferPlayStart:
+ captureBufferPlayStartSendMessage(mPreviewVoiceFont);
+
+ // Store the voice font being previewed, so that we know to restart if it changes.
+ mPreviewVoiceFontLast = mPreviewVoiceFont;
+
+ // Update UI, should really use a separate callback.
+ notifyVoiceFontObservers();
+
+ setState(stateCaptureBufferPlaying);
+ break;
+
+ //MARK: stateCaptureBufferPlaying
+ case stateCaptureBufferPlaying:
+ if (mCaptureBufferPlaying && mPreviewVoiceFont != mPreviewVoiceFontLast)
+ {
+ // If the preview voice font changes, restart playing with the new font.
+ setState(stateCaptureBufferPlayStart);
+ }
+ else if (!mCaptureBufferMode || !mCaptureBufferPlaying || mCaptureBufferRecording)
+ {
+ // Stop playing.
+ captureBufferPlayStopSendMessage();
+ mCaptureBufferPlaying = false;
+
+ // Update UI, should really use a separate callback.
+ notifyVoiceFontObservers();
+
+ setState(stateCaptureBufferPaused);
+ }
+ break;
+
+ //MARK: stateConnectorStart
+ case stateConnectorStart:
+ if(!mVoiceEnabled)
+ {
+ // We were never logged in. This will shut down the connector.
+ setState(stateLoggedOut);
+ }
+ else if(!mVoiceAccountServerURI.empty())
+ {
+ connectorCreate();
+ }
+ break;
+
+ //MARK: stateConnectorStarting
+ case stateConnectorStarting: // waiting for connector handle
+ // connectorCreateResponse() will transition from here to stateConnectorStarted.
+ break;
+
+ //MARK: stateConnectorStarted
+ case stateConnectorStarted: // connector handle received
+ if(!mVoiceEnabled)
+ {
+ // We were never logged in. This will shut down the connector.
+ setState(stateLoggedOut);
+ }
+ else
+ {
+ // The connector is started. Send a login message.
+ setState(stateNeedsLogin);
+ }
+ break;
+
+ //MARK: stateLoginRetry
+ case stateLoginRetry:
+ if(mLoginRetryCount == 0)
+ {
+ // First retry -- display a message to the user
+ notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_LOGIN_RETRY);
+ }
+
+ mLoginRetryCount++;
+
+ if(mLoginRetryCount > MAX_LOGIN_RETRIES)
+ {
+ LL_WARNS("Voice") << "too many login retries, giving up." << LL_ENDL;
+ setState(stateLoginFailed);
+ LLSD args;
+ std::stringstream errs;
+ errs << mVoiceAccountServerURI << "\n:UDP: 3478, 3479, 5060, 5062, 12000-17000";
+ args["HOSTID"] = errs.str();
+ if (LLGridManager::getInstance()->isSystemGrid())
+ {
+ LLNotificationsUtil::add("NoVoiceConnect", args);
+ }
+ else
+ {
+ LLNotificationsUtil::add("NoVoiceConnect-GIAB", args);
+ }
+ }
+ else
+ {
+ LL_INFOS("Voice") << "will retry login in " << LOGIN_RETRY_SECONDS << " seconds." << LL_ENDL;
+ mUpdateTimer.start();
+ mUpdateTimer.setTimerExpirySec(LOGIN_RETRY_SECONDS);
+ setState(stateLoginRetryWait);
+ }
+ break;
+
+ //MARK: stateLoginRetryWait
+ case stateLoginRetryWait:
+ if(mUpdateTimer.hasExpired())
+ {
+ setState(stateNeedsLogin);
+ }
+ break;
+
+ //MARK: stateNeedsLogin
+ case stateNeedsLogin:
+ if(!mAccountPassword.empty())
+ {
+ setState(stateLoggingIn);
+ loginSendMessage();
+ }
+ break;
+
+ //MARK: stateLoggingIn
+ case stateLoggingIn: // waiting for account handle
+ // loginResponse() will transition from here to stateLoggedIn.
+ break;
+
+ //MARK: stateLoggedIn
+ case stateLoggedIn: // account handle received
+
+ notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_LOGGED_IN);
+
+ if (LLVoiceClient::instance().getVoiceEffectEnabled())
+ {
+ // Request the set of available voice fonts.
+ setState(stateVoiceFontsWait);
+ refreshVoiceEffectLists(true);
+ }
+ else
+ {
+ // If voice effects are disabled, pretend we've received them and carry on.
+ setState(stateVoiceFontsReceived);
+ }
+
+ // request the current set of block rules (we'll need them when updating the friends list)
+ accountListBlockRulesSendMessage();
+
+ // request the current set of auto-accept rules
+ accountListAutoAcceptRulesSendMessage();
+
+ // Set up the mute list observer if it hasn't been set up already.
+ if((!sMuteListListener_listening))
+ {
+ LLMuteList::getInstance()->addObserver(&mutelist_listener);
+ sMuteListListener_listening = true;
+ }
+
+ // Set up the friends list observer if it hasn't been set up already.
+ if(friendslist_listener == NULL)
+ {
+ friendslist_listener = new LLVivoxVoiceClientFriendsObserver;
+ LLAvatarTracker::instance().addObserver(friendslist_listener);
+ }
+
+ // Set the initial state of mic mute, local speaker volume, etc.
+ {
+ std::ostringstream stream;
+
+ buildLocalAudioUpdates(stream);
+
+ if(!stream.str().empty())
+ {
+ writeString(stream.str());
+ }
+ }
+ break;
+
+ //MARK: stateVoiceFontsWait
+ case stateVoiceFontsWait: // Await voice font list
+ // accountGetSessionFontsResponse() will transition from here to
+ // stateVoiceFontsReceived, to ensure we have the voice font list
+ // before attempting to create a session.
+ break;
+
+ //MARK: stateVoiceFontsReceived
+ case stateVoiceFontsReceived: // Voice font list received
+ // Set up the timer to check for expiring voice fonts
+ mVoiceFontExpiryTimer.start();
+ mVoiceFontExpiryTimer.setTimerExpirySec(VOICE_FONT_EXPIRY_INTERVAL);
+
+#if USE_SESSION_GROUPS
+ // create the main session group
+ setState(stateCreatingSessionGroup);
+ sessionGroupCreateSendMessage();
+#else
+ // Not using session groups -- skip the stateCreatingSessionGroup state.
+ setState(stateNoChannel);
+
+ // Initial kick-off of channel lookup logic
+ parcelChanged();
+#endif
+ break;
+
+ //MARK: stateCreatingSessionGroup
+ case stateCreatingSessionGroup:
+ if(mSessionTerminateRequested || !mVoiceEnabled)
+ {
+ // *TODO: Question: is this the right way out of this state
+ setState(stateSessionTerminated);
+ }
+ else if(!mMainSessionGroupHandle.empty())
+ {
+ setState(stateNoChannel);
+
+ // Start looped recording (needed for "panic button" anti-griefing tool)
+ recordingLoopStart();
+
+ // Initial kick-off of channel lookup logic
+ parcelChanged();
+ }
+ break;
+
+ //MARK: stateNoChannel
+ case stateNoChannel:
+
+ LL_DEBUGS("Voice") << "State No Channel" << LL_ENDL;
+ mSpatialJoiningNum = 0;
+ // Do this here as well as inside sendPositionalUpdate().
+ // Otherwise, if you log in but don't join a proximal channel (such as when your login location has voice disabled), your friends list won't sync.
+ sendFriendsListUpdates();
+
+ if(mSessionTerminateRequested || !mVoiceEnabled)
+ {
+ // TODO: Question: Is this the right way out of this state?
+ setState(stateSessionTerminated);
+ }
+ else if(mTuningMode)
+ {
+ mTuningExitState = stateNoChannel;
+ setState(stateMicTuningStart);
+ }
+ else if(mCaptureBufferMode)
+ {
+ setState(stateCaptureBufferPaused);
+ }
+ else if(sessionNeedsRelog(mNextAudioSession))
+ {
+ requestRelog();
+ setState(stateSessionTerminated);
+ }
+ else if(mNextAudioSession)
+ {
+ sessionState *oldSession = mAudioSession;
+
+ mAudioSession = mNextAudioSession;
+ mAudioSessionChanged = true;
+ if(!mAudioSession->mReconnect)
+ {
+ mNextAudioSession = NULL;
+ }
+
+ // The old session may now need to be deleted.
+ reapSession(oldSession);
+
+ if(!mAudioSession->mHandle.empty())
+ {
+ // Connect to a session by session handle
+
+ sessionMediaConnectSendMessage(mAudioSession);
+ }
+ else
+ {
+ // Connect to a session by URI
+ sessionCreateSendMessage(mAudioSession, true, false);
+ }
+
+ notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_JOINING);
+ setState(stateJoiningSession);
+ }
+ else if(!mSpatialSessionURI.empty())
+ {
+ // If we're not headed elsewhere and have a spatial URI, return to spatial.
+ switchChannel(mSpatialSessionURI, true, false, false, mSpatialSessionCredentials);
+ }
+ break;
+
+ //MARK: stateJoiningSession
+ case stateJoiningSession: // waiting for session handle
+
+ // If this is true we have problem with connection to voice server (EXT-4313).
+ // See descriptions of mSpatialJoiningNum and MAX_NORMAL_JOINING_SPATIAL_NUM.
+ if(mSpatialJoiningNum == MAX_NORMAL_JOINING_SPATIAL_NUM)
+ {
+ // Notify observers to let them know there is problem with voice
+ notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_VOICE_DISABLED);
+ llwarns << "There seems to be problem with connection to voice server. Disabling voice chat abilities." << llendl;
+ }
+
+ // Increase mSpatialJoiningNum only for spatial sessions- it's normal to reach this case for
+ // example for p2p many times while waiting for response, so it can't be used to detect errors
+ if(mAudioSession && mAudioSession->mIsSpatial)
+ {
+ mSpatialJoiningNum++;
+ }
+
+ // joinedAudioSession() will transition from here to stateSessionJoined.
+ if(!mVoiceEnabled)
+ {
+ // User bailed out during connect -- jump straight to teardown.
+ setState(stateSessionTerminated);
+ }
+ else if(mSessionTerminateRequested)
+ {
+ if(mAudioSession && !mAudioSession->mHandle.empty())
+ {
+ // Only allow direct exits from this state in p2p calls (for cancelling an invite).
+ // Terminating a half-connected session on other types of calls seems to break something in the vivox gateway.
+ if(mAudioSession->mIsP2P)
+ {
+ sessionMediaDisconnectSendMessage(mAudioSession);
+ setState(stateSessionTerminated);
+ }
+ }
+ }
+ break;
+
+ //MARK: stateSessionJoined
+ case stateSessionJoined: // session handle received
+
+ mSpatialJoiningNum = 0;
+ // It appears that I need to wait for BOTH the SessionGroup.AddSession response and the SessionStateChangeEvent with state 4
+ // before continuing from this state. They can happen in either order, and if I don't wait for both, things can get stuck.
+ // For now, the SessionGroup.AddSession response handler sets mSessionHandle and the SessionStateChangeEvent handler transitions to stateSessionJoined.
+ // This is a cheap way to make sure both have happened before proceeding.
+ if(mAudioSession && mAudioSession->mVoiceEnabled)
+ {
+ // Dirty state that may need to be sync'ed with the daemon.
+ mPTTDirty = true;
+ mSpeakerVolumeDirty = true;
+ mSpatialCoordsDirty = true;
+
+ setState(stateRunning);
+
+ // Start the throttle timer
+ mUpdateTimer.start();
+ mUpdateTimer.setTimerExpirySec(UPDATE_THROTTLE_SECONDS);
+
+ // Events that need to happen when a session is joined could go here.
+ // Maybe send initial spatial data?
+ notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_JOINED);
+
+ }
+ else if(!mVoiceEnabled)
+ {
+ // User bailed out during connect -- jump straight to teardown.
+ setState(stateSessionTerminated);
+ }
+ else if(mSessionTerminateRequested)
+ {
+ // Only allow direct exits from this state in p2p calls (for cancelling an invite).
+ // Terminating a half-connected session on other types of calls seems to break something in the vivox gateway.
+ if(mAudioSession && mAudioSession->mIsP2P)
+ {
+ sessionMediaDisconnectSendMessage(mAudioSession);
+ setState(stateSessionTerminated);
+ }
+ }
+ break;
+
+ //MARK: stateRunning
+ case stateRunning: // steady state
+ // Disabling voice or disconnect requested.
+ if(!mVoiceEnabled || mSessionTerminateRequested)
+ {
+ leaveAudioSession();
+ }
+ else
+ {
+
+ // Figure out whether the PTT state needs to change
+ {
+ bool newPTT;
+ if(mUsePTT)
+ {
+ // If configured to use PTT, track the user state.
+ newPTT = mUserPTTState;
+ }
+ else
+ {
+ // If not configured to use PTT, it should always be true (otherwise the user will be unable to speak).
+ newPTT = true;
+ }
+
+ if(mMuteMic)
+ {
+ // This always overrides any other PTT setting.
+ newPTT = false;
+ }
+
+ // Dirty if state changed.
+ if(newPTT != mPTT)
+ {
+ mPTT = newPTT;
+ mPTTDirty = true;
+ }
+ }
+
+ if(!inSpatialChannel())
+ {
+ // When in a non-spatial channel, never send positional updates.
+ mSpatialCoordsDirty = false;
+ }
+ else
+ {
+ // Do the calculation that enforces the listener<->speaker tether (and also updates the real camera position)
+ enforceTether();
+ }
+
+ // Do notifications for expiring Voice Fonts.
+ if (mVoiceFontExpiryTimer.hasExpired())
+ {
+ expireVoiceFonts();
+ mVoiceFontExpiryTimer.setTimerExpirySec(VOICE_FONT_EXPIRY_INTERVAL);
+ }
+
+ // Send an update only if the ptt or mute state has changed (which shouldn't be able to happen that often
+ // -- the user can only click so fast) or every 10hz, whichever is sooner.
+ // Sending for every volume update causes an excessive flood of messages whenever a volume slider is dragged.
+ if((mAudioSession && mAudioSession->mMuteDirty) || mPTTDirty || mUpdateTimer.hasExpired())
+ {
+ mUpdateTimer.setTimerExpirySec(UPDATE_THROTTLE_SECONDS);
+ sendPositionalUpdate();
+ }
+ }
+ break;
+
+ //MARK: stateLeavingSession
+ case stateLeavingSession: // waiting for terminate session response
+ // The handler for the Session.Terminate response will transition from here to stateSessionTerminated.
+ break;
+
+ //MARK: stateSessionTerminated
+ case stateSessionTerminated:
+
+ // Must do this first, since it uses mAudioSession.
+ notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_LEFT_CHANNEL);
+
+ if(mAudioSession)
+ {
+ sessionState *oldSession = mAudioSession;
+
+ mAudioSession = NULL;
+ // We just notified status observers about this change. Don't do it again.
+ mAudioSessionChanged = false;
+
+ // The old session may now need to be deleted.
+ reapSession(oldSession);
+ }
+ else
+ {
+ LL_WARNS("Voice") << "stateSessionTerminated with NULL mAudioSession" << LL_ENDL;
+ }
+
+ // Always reset the terminate request flag when we get here.
+ mSessionTerminateRequested = false;
+
+ if(mVoiceEnabled && !mRelogRequested)
+ {
+ // Just leaving a channel, go back to stateNoChannel (the "logged in but have no channel" state).
+ setState(stateNoChannel);
+ }
+ else
+ {
+ // Shutting down voice, continue with disconnecting.
+ logout();
+
+ // The state machine will take it from here
+ mRelogRequested = false;
+ }
+
+ break;
+
+ //MARK: stateLoggingOut
+ case stateLoggingOut: // waiting for logout response
+ // The handler for the AccountLoginStateChangeEvent will transition from here to stateLoggedOut.
+ break;
+
+ //MARK: stateLoggedOut
+ case stateLoggedOut: // logout response received
+
+ // Once we're logged out, all these things are invalid.
+ mAccountHandle.clear();
+ deleteAllSessions();
+ deleteAllBuddies();
+ deleteAllVoiceFonts();
+ deleteVoiceFontTemplates();
+
+ if(mVoiceEnabled && !mRelogRequested)
+ {
+ // User was logged out, but wants to be logged in. Send a new login request.
+ setState(stateNeedsLogin);
+ }
+ else
+ {
+ // shut down the connector
+ connectorShutdown();
+ }
+ break;
+
+ //MARK: stateConnectorStopping
+ case stateConnectorStopping: // waiting for connector stop
+ // The handler for the Connector.InitiateShutdown response will transition from here to stateConnectorStopped.
+ break;
+
+ //MARK: stateConnectorStopped
+ case stateConnectorStopped: // connector stop received
+ setState(stateDisableCleanup);
+ break;
+
+ //MARK: stateConnectorFailed
+ case stateConnectorFailed:
+ setState(stateConnectorFailedWaiting);
+ break;
+ //MARK: stateConnectorFailedWaiting
+ case stateConnectorFailedWaiting:
+ if(!mVoiceEnabled)
+ {
+ setState(stateDisableCleanup);
+ }
+ break;
+
+ //MARK: stateLoginFailed
+ case stateLoginFailed:
+ setState(stateLoginFailedWaiting);
+ break;
+ //MARK: stateLoginFailedWaiting
+ case stateLoginFailedWaiting:
+ if(!mVoiceEnabled)
+ {
+ setState(stateDisableCleanup);
+ }
+ break;
+
+ //MARK: stateJoinSessionFailed
+ case stateJoinSessionFailed:
+ // Transition to error state. Send out any notifications here.
+ if(mAudioSession)
+ {
+ LL_WARNS("Voice") << "stateJoinSessionFailed: (" << mAudioSession->mErrorStatusCode << "): " << mAudioSession->mErrorStatusString << LL_ENDL;
+ }
+ else
+ {
+ LL_WARNS("Voice") << "stateJoinSessionFailed with no current session" << LL_ENDL;
+ }
+
+ notifyStatusObservers(LLVoiceClientStatusObserver::ERROR_UNKNOWN);
+ setState(stateJoinSessionFailedWaiting);
+ break;
+
+ //MARK: stateJoinSessionFailedWaiting
+ case stateJoinSessionFailedWaiting:
+ // Joining a channel failed, either due to a failed channel name -> sip url lookup or an error from the join message.
+ // Region crossings may leave this state and try the join again.
+ if(mSessionTerminateRequested)
+ {
+ setState(stateSessionTerminated);
+ }
+ break;
+
+ //MARK: stateJail
+ case stateJail:
+ // We have given up. Do nothing.
+ break;
+
+ }
+
+ if (mAudioSessionChanged)
+ {
+ mAudioSessionChanged = false;
+ notifyParticipantObservers();
+ notifyVoiceFontObservers();
+ }
+ else if (mAudioSession && mAudioSession->mParticipantsChanged)
+ {
+ mAudioSession->mParticipantsChanged = false;
+ notifyParticipantObservers();
+ }
+}
+
+void LLVivoxVoiceClient::closeSocket(void)
+{
+ mSocket.reset();
+ mConnected = false;
+}
+
+void LLVivoxVoiceClient::loginSendMessage()
+{
+ std::ostringstream stream;
+
+ bool autoPostCrashDumps = gSavedSettings.getBOOL("VivoxAutoPostCrashDumps");
+
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.Login.1\">"
+ << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>"
+ << "<AccountName>" << mAccountName << "</AccountName>"
+ << "<AccountPassword>" << mAccountPassword << "</AccountPassword>"
+ << "<AudioSessionAnswerMode>VerifyAnswer</AudioSessionAnswerMode>"
+ << "<EnableBuddiesAndPresence>true</EnableBuddiesAndPresence>"
+ << "<BuddyManagementMode>Application</BuddyManagementMode>"
+ << "<ParticipantPropertyFrequency>5</ParticipantPropertyFrequency>"
+ << (autoPostCrashDumps?"<AutopostCrashDumps>true</AutopostCrashDumps>":"")
+ << "</Request>\n\n\n";
+
+ writeString(stream.str());
+}
+
+void LLVivoxVoiceClient::logout()
+{
+ // Ensure that we'll re-request provisioning before logging in again
+ mAccountPassword.clear();
+ mVoiceAccountServerURI.clear();
+
+ setState(stateLoggingOut);
+ logoutSendMessage();
+}
+
+void LLVivoxVoiceClient::logoutSendMessage()
+{
+ if(!mAccountHandle.empty())
+ {
+ std::ostringstream stream;
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.Logout.1\">"
+ << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
+ << "</Request>"
+ << "\n\n\n";
+
+ mAccountHandle.clear();
+
+ writeString(stream.str());
+ }
+}
+
+void LLVivoxVoiceClient::accountListBlockRulesSendMessage()
+{
+ if(!mAccountHandle.empty())
+ {
+ std::ostringstream stream;
+
+ LL_DEBUGS("Voice") << "requesting block rules" << LL_ENDL;
+
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.ListBlockRules.1\">"
+ << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
+ << "</Request>"
+ << "\n\n\n";
+
+ writeString(stream.str());
+ }
+}
+
+void LLVivoxVoiceClient::accountListAutoAcceptRulesSendMessage()
+{
+ if(!mAccountHandle.empty())
+ {
+ std::ostringstream stream;
+
+ LL_DEBUGS("Voice") << "requesting auto-accept rules" << LL_ENDL;
+
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.ListAutoAcceptRules.1\">"
+ << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
+ << "</Request>"
+ << "\n\n\n";
+
+ writeString(stream.str());
+ }
+}
+
+void LLVivoxVoiceClient::sessionGroupCreateSendMessage()
+{
+ if(!mAccountHandle.empty())
+ {
+ std::ostringstream stream;
+
+ LL_DEBUGS("Voice") << "creating session group" << LL_ENDL;
+
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"SessionGroup.Create.1\">"
+ << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
+ << "<Type>Normal</Type>"
+ << "</Request>"
+ << "\n\n\n";
+
+ writeString(stream.str());
+ }
+}
+
+void LLVivoxVoiceClient::sessionCreateSendMessage(sessionState *session, bool startAudio, bool startText)
+{
+ LL_DEBUGS("Voice") << "Requesting create: " << session->mSIPURI << LL_ENDL;
+
+ S32 font_index = getVoiceFontIndex(session->mVoiceFontID);
+ LL_DEBUGS("Voice") << "With voice font: " << session->mVoiceFontID << " (" << font_index << ")" << LL_ENDL;
+
+ session->mCreateInProgress = true;
+ if(startAudio)
+ {
+ session->mMediaConnectInProgress = true;
+ }
+
+ std::ostringstream stream;
+ stream
+ << "<Request requestId=\"" << session->mSIPURI << "\" action=\"Session.Create.1\">"
+ << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
+ << "<URI>" << session->mSIPURI << "</URI>";
+
+ static const std::string allowed_chars =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
+ "0123456789"
+ "-._~";
+
+ if(!session->mHash.empty())
+ {
+ stream
+ << "<Password>" << LLURI::escape(session->mHash, allowed_chars) << "</Password>"
+ << "<PasswordHashAlgorithm>SHA1UserName</PasswordHashAlgorithm>";
+ }
+
+ stream
+ << "<ConnectAudio>" << (startAudio?"true":"false") << "</ConnectAudio>"
+ << "<ConnectText>" << (startText?"true":"false") << "</ConnectText>"
+ << "<VoiceFontID>" << font_index << "</VoiceFontID>"
+ << "<Name>" << mChannelName << "</Name>"
+ << "</Request>\n\n\n";
+ writeString(stream.str());
+}
+
+void LLVivoxVoiceClient::sessionGroupAddSessionSendMessage(sessionState *session, bool startAudio, bool startText)
+{
+ LL_DEBUGS("Voice") << "Requesting create: " << session->mSIPURI << LL_ENDL;
+
+ S32 font_index = getVoiceFontIndex(session->mVoiceFontID);
+ LL_DEBUGS("Voice") << "With voice font: " << session->mVoiceFontID << " (" << font_index << ")" << LL_ENDL;
+
+ session->mCreateInProgress = true;
+ if(startAudio)
+ {
+ session->mMediaConnectInProgress = true;
+ }
+
+ std::string password;
+ if(!session->mHash.empty())
+ {
+ static const std::string allowed_chars =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
+ "0123456789"
+ "-._~"
+ ;
+ password = LLURI::escape(session->mHash, allowed_chars);
+ }
+
+ std::ostringstream stream;
+ stream
+ << "<Request requestId=\"" << session->mSIPURI << "\" action=\"SessionGroup.AddSession.1\">"
+ << "<SessionGroupHandle>" << session->mGroupHandle << "</SessionGroupHandle>"
+ << "<URI>" << session->mSIPURI << "</URI>"
+ << "<Name>" << mChannelName << "</Name>"
+ << "<ConnectAudio>" << (startAudio?"true":"false") << "</ConnectAudio>"
+ << "<ConnectText>" << (startText?"true":"false") << "</ConnectText>"
+ << "<VoiceFontID>" << font_index << "</VoiceFontID>"
+ << "<Password>" << password << "</Password>"
+ << "<PasswordHashAlgorithm>SHA1UserName</PasswordHashAlgorithm>"
+ << "</Request>\n\n\n"
+ ;
+
+ writeString(stream.str());
+}
+
+void LLVivoxVoiceClient::sessionMediaConnectSendMessage(sessionState *session)
+{
+ LL_DEBUGS("Voice") << "Connecting audio to session handle: " << session->mHandle << LL_ENDL;
+
+ S32 font_index = getVoiceFontIndex(session->mVoiceFontID);
+ LL_DEBUGS("Voice") << "With voice font: " << session->mVoiceFontID << " (" << font_index << ")" << LL_ENDL;
+
+ session->mMediaConnectInProgress = true;
+
+ std::ostringstream stream;
+
+ stream
+ << "<Request requestId=\"" << session->mHandle << "\" action=\"Session.MediaConnect.1\">"
+ << "<SessionGroupHandle>" << session->mGroupHandle << "</SessionGroupHandle>"
+ << "<SessionHandle>" << session->mHandle << "</SessionHandle>"
+ << "<VoiceFontID>" << font_index << "</VoiceFontID>"
+ << "<Media>Audio</Media>"
+ << "</Request>\n\n\n";
+
+ writeString(stream.str());
+}
+
+void LLVivoxVoiceClient::sessionTextConnectSendMessage(sessionState *session)
+{
+ LL_DEBUGS("Voice") << "connecting text to session handle: " << session->mHandle << LL_ENDL;
+
+ std::ostringstream stream;
+
+ stream
+ << "<Request requestId=\"" << session->mHandle << "\" action=\"Session.TextConnect.1\">"
+ << "<SessionGroupHandle>" << session->mGroupHandle << "</SessionGroupHandle>"
+ << "<SessionHandle>" << session->mHandle << "</SessionHandle>"
+ << "</Request>\n\n\n";
+
+ writeString(stream.str());
+}
+
+void LLVivoxVoiceClient::sessionTerminate()
+{
+ mSessionTerminateRequested = true;
+}
+
+void LLVivoxVoiceClient::requestRelog()
+{
+ mSessionTerminateRequested = true;
+ mRelogRequested = true;
+}
+
+
+void LLVivoxVoiceClient::leaveAudioSession()
+{
+ if(mAudioSession)
+ {
+ LL_DEBUGS("Voice") << "leaving session: " << mAudioSession->mSIPURI << LL_ENDL;
+
+ switch(getState())
+ {
+ case stateNoChannel:
+ // In this case, we want to pretend the join failed so our state machine doesn't get stuck.
+ // Skip the join failed transition state so we don't send out error notifications.
+ setState(stateJoinSessionFailedWaiting);
+ break;
+ case stateJoiningSession:
+ case stateSessionJoined:
+ case stateRunning:
+ if(!mAudioSession->mHandle.empty())
+ {
+
+#if RECORD_EVERYTHING
+ // HACK: for testing only
+ // Save looped recording
+ std::string savepath("/tmp/vivoxrecording");
+ {
+ time_t now = time(NULL);
+ const size_t BUF_SIZE = 64;
+ char time_str[BUF_SIZE]; /* Flawfinder: ignore */
+
+ strftime(time_str, BUF_SIZE, "%Y-%m-%dT%H:%M:%SZ", gmtime(&now));
+ savepath += time_str;
+ }
+ recordingLoopSave(savepath);
+#endif
+
+ sessionMediaDisconnectSendMessage(mAudioSession);
+ setState(stateLeavingSession);
+ }
+ else
+ {
+ LL_WARNS("Voice") << "called with no session handle" << LL_ENDL;
+ setState(stateSessionTerminated);
+ }
+ break;
+ case stateJoinSessionFailed:
+ case stateJoinSessionFailedWaiting:
+ setState(stateSessionTerminated);
+ break;
+
+ default:
+ LL_WARNS("Voice") << "called from unknown state" << LL_ENDL;
+ break;
+ }
+ }
+ else
+ {
+ LL_WARNS("Voice") << "called with no active session" << LL_ENDL;
+ setState(stateSessionTerminated);
+ }
+}
+
+void LLVivoxVoiceClient::sessionTerminateSendMessage(sessionState *session)
+{
+ std::ostringstream stream;
+
+ LL_DEBUGS("Voice") << "Sending Session.Terminate with handle " << session->mHandle << LL_ENDL;
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.Terminate.1\">"
+ << "<SessionHandle>" << session->mHandle << "</SessionHandle>"
+ << "</Request>\n\n\n";
+
+ writeString(stream.str());
+}
+
+void LLVivoxVoiceClient::sessionGroupTerminateSendMessage(sessionState *session)
+{
+ std::ostringstream stream;
+
+ LL_DEBUGS("Voice") << "Sending SessionGroup.Terminate with handle " << session->mGroupHandle << LL_ENDL;
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"SessionGroup.Terminate.1\">"
+ << "<SessionGroupHandle>" << session->mGroupHandle << "</SessionGroupHandle>"
+ << "</Request>\n\n\n";
+
+ writeString(stream.str());
+}
+
+void LLVivoxVoiceClient::sessionMediaDisconnectSendMessage(sessionState *session)
+{
+ std::ostringstream stream;
+
+ LL_DEBUGS("Voice") << "Sending Session.MediaDisconnect with handle " << session->mHandle << LL_ENDL;
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.MediaDisconnect.1\">"
+ << "<SessionGroupHandle>" << session->mGroupHandle << "</SessionGroupHandle>"
+ << "<SessionHandle>" << session->mHandle << "</SessionHandle>"
+ << "<Media>Audio</Media>"
+ << "</Request>\n\n\n";
+
+ writeString(stream.str());
+
+}
+
+void LLVivoxVoiceClient::sessionTextDisconnectSendMessage(sessionState *session)
+{
+ std::ostringstream stream;
+
+ LL_DEBUGS("Voice") << "Sending Session.TextDisconnect with handle " << session->mHandle << LL_ENDL;
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.TextDisconnect.1\">"
+ << "<SessionGroupHandle>" << session->mGroupHandle << "</SessionGroupHandle>"
+ << "<SessionHandle>" << session->mHandle << "</SessionHandle>"
+ << "</Request>\n\n\n";
+
+ writeString(stream.str());
+}
+
+void LLVivoxVoiceClient::getCaptureDevicesSendMessage()
+{
+ std::ostringstream stream;
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.GetCaptureDevices.1\">"
+ << "</Request>\n\n\n";
+
+ writeString(stream.str());
+}
+
+void LLVivoxVoiceClient::getRenderDevicesSendMessage()
+{
+ std::ostringstream stream;
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.GetRenderDevices.1\">"
+ << "</Request>\n\n\n";
+
+ writeString(stream.str());
+}
+
+void LLVivoxVoiceClient::clearCaptureDevices()
+{
+ LL_DEBUGS("Voice") << "called" << LL_ENDL;
+ mCaptureDevices.clear();
+}
+
+void LLVivoxVoiceClient::addCaptureDevice(const std::string& name)
+{
+ LL_DEBUGS("Voice") << name << LL_ENDL;
+
+ mCaptureDevices.push_back(name);
+}
+
+LLVoiceDeviceList& LLVivoxVoiceClient::getCaptureDevices()
+{
+ return mCaptureDevices;
+}
+
+void LLVivoxVoiceClient::setCaptureDevice(const std::string& name)
+{
+ if(name == "Default")
+ {
+ if(!mCaptureDevice.empty())
+ {
+ mCaptureDevice.clear();
+ mCaptureDeviceDirty = true;
+ }
+ }
+ else
+ {
+ if(mCaptureDevice != name)
+ {
+ mCaptureDevice = name;
+ mCaptureDeviceDirty = true;
+ }
+ }
+}
+
+void LLVivoxVoiceClient::clearRenderDevices()
+{
+ LL_DEBUGS("Voice") << "called" << LL_ENDL;
+ mRenderDevices.clear();
+}
+
+void LLVivoxVoiceClient::addRenderDevice(const std::string& name)
+{
+ LL_DEBUGS("Voice") << name << LL_ENDL;
+ mRenderDevices.push_back(name);
+}
+
+LLVoiceDeviceList& LLVivoxVoiceClient::getRenderDevices()
+{
+ return mRenderDevices;
+}
+
+void LLVivoxVoiceClient::setRenderDevice(const std::string& name)
+{
+ if(name == "Default")
+ {
+ if(!mRenderDevice.empty())
+ {
+ mRenderDevice.clear();
+ mRenderDeviceDirty = true;
+ }
+ }
+ else
+ {
+ if(mRenderDevice != name)
+ {
+ mRenderDevice = name;
+ mRenderDeviceDirty = true;
+ }
+ }
+
+}
+
+void LLVivoxVoiceClient::tuningStart()
+{
+ mTuningMode = true;
+ LL_DEBUGS("Voice") << "Starting tuning" << LL_ENDL;
+ if(getState() >= stateNoChannel)
+ {
+ LL_DEBUGS("Voice") << "no channel" << LL_ENDL;
+ sessionTerminate();
+ }
+}
+
+void LLVivoxVoiceClient::tuningStop()
+{
+ mTuningMode = false;
+}
+
+bool LLVivoxVoiceClient::inTuningMode()
+{
+ bool result = false;
+ switch(getState())
+ {
+ case stateMicTuningRunning:
+ result = true;
+ break;
+ default:
+ break;
+ }
+ return result;
+}
+
+void LLVivoxVoiceClient::tuningRenderStartSendMessage(const std::string& name, bool loop)
+{
+ mTuningAudioFile = name;
+ std::ostringstream stream;
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.RenderAudioStart.1\">"
+ << "<SoundFilePath>" << mTuningAudioFile << "</SoundFilePath>"
+ << "<Loop>" << (loop?"1":"0") << "</Loop>"
+ << "</Request>\n\n\n";
+
+ writeString(stream.str());
+}
+
+void LLVivoxVoiceClient::tuningRenderStopSendMessage()
+{
+ std::ostringstream stream;
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.RenderAudioStop.1\">"
+ << "<SoundFilePath>" << mTuningAudioFile << "</SoundFilePath>"
+ << "</Request>\n\n\n";
+
+ writeString(stream.str());
+}
+
+void LLVivoxVoiceClient::tuningCaptureStartSendMessage(int duration)
+{
+ LL_DEBUGS("Voice") << "sending CaptureAudioStart" << LL_ENDL;
+
+ std::ostringstream stream;
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.CaptureAudioStart.1\">"
+ << "<Duration>" << duration << "</Duration>"
+ << "</Request>\n\n\n";
+
+ writeString(stream.str());
+}
+
+void LLVivoxVoiceClient::tuningCaptureStopSendMessage()
+{
+ LL_DEBUGS("Voice") << "sending CaptureAudioStop" << LL_ENDL;
+
+ std::ostringstream stream;
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.CaptureAudioStop.1\">"
+ << "</Request>\n\n\n";
+
+ writeString(stream.str());
+
+ mTuningEnergy = 0.0f;
+}
+
+void LLVivoxVoiceClient::tuningSetMicVolume(float volume)
+{
+ int scaled_volume = scale_mic_volume(volume);
+
+ if(scaled_volume != mTuningMicVolume)
+ {
+ mTuningMicVolume = scaled_volume;
+ mTuningMicVolumeDirty = true;
+ }
+}
+
+void LLVivoxVoiceClient::tuningSetSpeakerVolume(float volume)
+{
+ int scaled_volume = scale_speaker_volume(volume);
+
+ if(scaled_volume != mTuningSpeakerVolume)
+ {
+ mTuningSpeakerVolume = scaled_volume;
+ mTuningSpeakerVolumeDirty = true;
+ }
+}
+
+float LLVivoxVoiceClient::tuningGetEnergy(void)
+{
+ return mTuningEnergy;
+}
+
+bool LLVivoxVoiceClient::deviceSettingsAvailable()
+{
+ bool result = true;
+
+ if(!mConnected)
+ result = false;
+
+ if(mRenderDevices.empty())
+ result = false;
+
+ return result;
+}
+
+void LLVivoxVoiceClient::refreshDeviceLists(bool clearCurrentList)
+{
+ if(clearCurrentList)
+ {
+ clearCaptureDevices();
+ clearRenderDevices();
+ }
+ getCaptureDevicesSendMessage();
+ getRenderDevicesSendMessage();
+}
+
+void LLVivoxVoiceClient::daemonDied()
+{
+ // The daemon died, so the connection is gone. Reset everything and start over.
+ LL_WARNS("Voice") << "Connection to vivox daemon lost. Resetting state."<< LL_ENDL;
+
+ // Try to relaunch the daemon
+ setState(stateDisableCleanup);
+}
+
+void LLVivoxVoiceClient::giveUp()
+{
+ // All has failed. Clean up and stop trying.
+ closeSocket();
+ deleteAllSessions();
+ deleteAllBuddies();
+
+ setState(stateJail);
+}
+
+static void oldSDKTransform (LLVector3 &left, LLVector3 &up, LLVector3 &at, LLVector3d &pos, LLVector3 &vel)
+{
+ F32 nat[3], nup[3], nl[3], nvel[3]; // the new at, up, left vectors and the new position and velocity
+ F64 npos[3];
+
+ // The original XML command was sent like this:
+ /*
+ << "<Position>"
+ << "<X>" << pos[VX] << "</X>"
+ << "<Y>" << pos[VZ] << "</Y>"
+ << "<Z>" << pos[VY] << "</Z>"
+ << "</Position>"
+ << "<Velocity>"
+ << "<X>" << mAvatarVelocity[VX] << "</X>"
+ << "<Y>" << mAvatarVelocity[VZ] << "</Y>"
+ << "<Z>" << mAvatarVelocity[VY] << "</Z>"
+ << "</Velocity>"
+ << "<AtOrientation>"
+ << "<X>" << l.mV[VX] << "</X>"
+ << "<Y>" << u.mV[VX] << "</Y>"
+ << "<Z>" << a.mV[VX] << "</Z>"
+ << "</AtOrientation>"
+ << "<UpOrientation>"
+ << "<X>" << l.mV[VZ] << "</X>"
+ << "<Y>" << u.mV[VY] << "</Y>"
+ << "<Z>" << a.mV[VZ] << "</Z>"
+ << "</UpOrientation>"
+ << "<LeftOrientation>"
+ << "<X>" << l.mV [VY] << "</X>"
+ << "<Y>" << u.mV [VZ] << "</Y>"
+ << "<Z>" << a.mV [VY] << "</Z>"
+ << "</LeftOrientation>";
+ */
+
+#if 1
+ // This was the original transform done when building the XML command
+ nat[0] = left.mV[VX];
+ nat[1] = up.mV[VX];
+ nat[2] = at.mV[VX];
+
+ nup[0] = left.mV[VZ];
+ nup[1] = up.mV[VY];
+ nup[2] = at.mV[VZ];
+
+ nl[0] = left.mV[VY];
+ nl[1] = up.mV[VZ];
+ nl[2] = at.mV[VY];
+
+ npos[0] = pos.mdV[VX];
+ npos[1] = pos.mdV[VZ];
+ npos[2] = pos.mdV[VY];
+
+ nvel[0] = vel.mV[VX];
+ nvel[1] = vel.mV[VZ];
+ nvel[2] = vel.mV[VY];
+
+ for(int i=0;i<3;++i) {
+ at.mV[i] = nat[i];
+ up.mV[i] = nup[i];
+ left.mV[i] = nl[i];
+ pos.mdV[i] = npos[i];
+ }
+
+ // This was the original transform done in the SDK
+ nat[0] = at.mV[2];
+ nat[1] = 0; // y component of at vector is always 0, this was up[2]
+ nat[2] = -1 * left.mV[2];
+
+ // We override whatever the application gives us
+ nup[0] = 0; // x component of up vector is always 0
+ nup[1] = 1; // y component of up vector is always 1
+ nup[2] = 0; // z component of up vector is always 0
+
+ nl[0] = at.mV[0];
+ nl[1] = 0; // y component of left vector is always zero, this was up[0]
+ nl[2] = -1 * left.mV[0];
+
+ npos[2] = pos.mdV[2] * -1.0;
+ npos[1] = pos.mdV[1];
+ npos[0] = pos.mdV[0];
+
+ for(int i=0;i<3;++i) {
+ at.mV[i] = nat[i];
+ up.mV[i] = nup[i];
+ left.mV[i] = nl[i];
+ pos.mdV[i] = npos[i];
+ }
+#else
+ // This is the compose of the two transforms (at least, that's what I'm trying for)
+ nat[0] = at.mV[VX];
+ nat[1] = 0; // y component of at vector is always 0, this was up[2]
+ nat[2] = -1 * up.mV[VZ];
+
+ // We override whatever the application gives us
+ nup[0] = 0; // x component of up vector is always 0
+ nup[1] = 1; // y component of up vector is always 1
+ nup[2] = 0; // z component of up vector is always 0
+
+ nl[0] = left.mV[VX];
+ nl[1] = 0; // y component of left vector is always zero, this was up[0]
+ nl[2] = -1 * left.mV[VY];
+
+ npos[0] = pos.mdV[VX];
+ npos[1] = pos.mdV[VZ];
+ npos[2] = pos.mdV[VY] * -1.0;
+
+ nvel[0] = vel.mV[VX];
+ nvel[1] = vel.mV[VZ];
+ nvel[2] = vel.mV[VY];
+
+ for(int i=0;i<3;++i) {
+ at.mV[i] = nat[i];
+ up.mV[i] = nup[i];
+ left.mV[i] = nl[i];
+ pos.mdV[i] = npos[i];
+ }
+
+#endif
+}
+
+void LLVivoxVoiceClient::sendPositionalUpdate(void)
+{
+ std::ostringstream stream;
+
+ if(mSpatialCoordsDirty)
+ {
+ LLVector3 l, u, a, vel;
+ LLVector3d pos;
+
+ mSpatialCoordsDirty = false;
+
+ // Always send both speaker and listener positions together.
+ stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.Set3DPosition.1\">"
+ << "<SessionHandle>" << getAudioSessionHandle() << "</SessionHandle>";
+
+ stream << "<SpeakerPosition>";
+
+// LL_DEBUGS("Voice") << "Sending speaker position " << mAvatarPosition << LL_ENDL;
+ l = mAvatarRot.getLeftRow();
+ u = mAvatarRot.getUpRow();
+ a = mAvatarRot.getFwdRow();
+ pos = mAvatarPosition;
+ vel = mAvatarVelocity;
+
+ // SLIM SDK: the old SDK was doing a transform on the passed coordinates that the new one doesn't do anymore.
+ // The old transform is replicated by this function.
+ oldSDKTransform(l, u, a, pos, vel);
+
+ stream
+ << "<Position>"
+ << "<X>" << pos.mdV[VX] << "</X>"
+ << "<Y>" << pos.mdV[VY] << "</Y>"
+ << "<Z>" << pos.mdV[VZ] << "</Z>"
+ << "</Position>"
+ << "<Velocity>"
+ << "<X>" << vel.mV[VX] << "</X>"
+ << "<Y>" << vel.mV[VY] << "</Y>"
+ << "<Z>" << vel.mV[VZ] << "</Z>"
+ << "</Velocity>"
+ << "<AtOrientation>"
+ << "<X>" << a.mV[VX] << "</X>"
+ << "<Y>" << a.mV[VY] << "</Y>"
+ << "<Z>" << a.mV[VZ] << "</Z>"
+ << "</AtOrientation>"
+ << "<UpOrientation>"
+ << "<X>" << u.mV[VX] << "</X>"
+ << "<Y>" << u.mV[VY] << "</Y>"
+ << "<Z>" << u.mV[VZ] << "</Z>"
+ << "</UpOrientation>"
+ << "<LeftOrientation>"
+ << "<X>" << l.mV [VX] << "</X>"
+ << "<Y>" << l.mV [VY] << "</Y>"
+ << "<Z>" << l.mV [VZ] << "</Z>"
+ << "</LeftOrientation>";
+
+ stream << "</SpeakerPosition>";
+
+ stream << "<ListenerPosition>";
+
+ LLVector3d earPosition;
+ LLVector3 earVelocity;
+ LLMatrix3 earRot;
+
+ switch(mEarLocation)
+ {
+ case earLocCamera:
+ default:
+ earPosition = mCameraPosition;
+ earVelocity = mCameraVelocity;
+ earRot = mCameraRot;
+ break;
+
+ case earLocAvatar:
+ earPosition = mAvatarPosition;
+ earVelocity = mAvatarVelocity;
+ earRot = mAvatarRot;
+ break;
+
+ case earLocMixed:
+ earPosition = mAvatarPosition;
+ earVelocity = mAvatarVelocity;
+ earRot = mCameraRot;
+ break;
+ }
+
+ l = earRot.getLeftRow();
+ u = earRot.getUpRow();
+ a = earRot.getFwdRow();
+ pos = earPosition;
+ vel = earVelocity;
+
+// LL_DEBUGS("Voice") << "Sending listener position " << earPosition << LL_ENDL;
+
+ oldSDKTransform(l, u, a, pos, vel);
+
+ stream
+ << "<Position>"
+ << "<X>" << pos.mdV[VX] << "</X>"
+ << "<Y>" << pos.mdV[VY] << "</Y>"
+ << "<Z>" << pos.mdV[VZ] << "</Z>"
+ << "</Position>"
+ << "<Velocity>"
+ << "<X>" << vel.mV[VX] << "</X>"
+ << "<Y>" << vel.mV[VY] << "</Y>"
+ << "<Z>" << vel.mV[VZ] << "</Z>"
+ << "</Velocity>"
+ << "<AtOrientation>"
+ << "<X>" << a.mV[VX] << "</X>"
+ << "<Y>" << a.mV[VY] << "</Y>"
+ << "<Z>" << a.mV[VZ] << "</Z>"
+ << "</AtOrientation>"
+ << "<UpOrientation>"
+ << "<X>" << u.mV[VX] << "</X>"
+ << "<Y>" << u.mV[VY] << "</Y>"
+ << "<Z>" << u.mV[VZ] << "</Z>"
+ << "</UpOrientation>"
+ << "<LeftOrientation>"
+ << "<X>" << l.mV [VX] << "</X>"
+ << "<Y>" << l.mV [VY] << "</Y>"
+ << "<Z>" << l.mV [VZ] << "</Z>"
+ << "</LeftOrientation>";
+
+
+ stream << "</ListenerPosition>";
+
+ stream << "</Request>\n\n\n";
+ }
+
+ if(mAudioSession && (mAudioSession->mVolumeDirty || mAudioSession->mMuteDirty))
+ {
+ participantMap::iterator iter = mAudioSession->mParticipantsByURI.begin();
+
+ mAudioSession->mVolumeDirty = false;
+ mAudioSession->mMuteDirty = false;
+
+ for(; iter != mAudioSession->mParticipantsByURI.end(); iter++)
+ {
+ participantState *p = iter->second;
+
+ if(p->mVolumeDirty)
+ {
+ // Can't set volume/mute for yourself
+ if(!p->mIsSelf)
+ {
+ // scale from the range 0.0-1.0 to vivox volume in the range 0-100
+ S32 volume = llround(p->mVolume / VOLUME_SCALE_VIVOX);
+ bool mute = p->mOnMuteList;
+
+ if(mute)
+ {
+ // SetParticipantMuteForMe doesn't work in p2p sessions.
+ // If we want the user to be muted, set their volume to 0 as well.
+ // This isn't perfect, but it will at least reduce their volume to a minimum.
+ volume = 0;
+ // Mark the current volume level as set to prevent incoming events
+ // changing it to 0, so that we can return to it when unmuting.
+ p->mVolumeSet = true;
+ }
+
+ if(volume == 0)
+ {
+ mute = true;
+ }
+
+ LL_DEBUGS("Voice") << "Setting volume/mute for avatar " << p->mAvatarID << " to " << volume << (mute?"/true":"/false") << LL_ENDL;
+
+ // SLIM SDK: Send both volume and mute commands.
+
+ // Send a "volume for me" command for the user.
+ stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.SetParticipantVolumeForMe.1\">"
+ << "<SessionHandle>" << getAudioSessionHandle() << "</SessionHandle>"
+ << "<ParticipantURI>" << p->mURI << "</ParticipantURI>"
+ << "<Volume>" << volume << "</Volume>"
+ << "</Request>\n\n\n";
+
+ if(!mAudioSession->mIsP2P)
+ {
+ // Send a "mute for me" command for the user
+ // Doesn't work in P2P sessions
+ stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.SetParticipantMuteForMe.1\">"
+ << "<SessionHandle>" << getAudioSessionHandle() << "</SessionHandle>"
+ << "<ParticipantURI>" << p->mURI << "</ParticipantURI>"
+ << "<Mute>" << (mute?"1":"0") << "</Mute>"
+ << "<Scope>Audio</Scope>"
+ << "</Request>\n\n\n";
+ }
+ }
+
+ p->mVolumeDirty = false;
+ }
+ }
+ }
+
+ buildLocalAudioUpdates(stream);
+
+ if(!stream.str().empty())
+ {
+ writeString(stream.str());
+ }
+
+ // Friends list updates can be huge, especially on the first voice login of an account with lots of friends.
+ // Batching them all together can choke SLVoice, so send them in separate writes.
+ sendFriendsListUpdates();
+}
+
+void LLVivoxVoiceClient::buildSetCaptureDevice(std::ostringstream &stream)
+{
+ if(mCaptureDeviceDirty)
+ {
+ LL_DEBUGS("Voice") << "Setting input device = \"" << mCaptureDevice << "\"" << LL_ENDL;
+
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.SetCaptureDevice.1\">"
+ << "<CaptureDeviceSpecifier>" << mCaptureDevice << "</CaptureDeviceSpecifier>"
+ << "</Request>"
+ << "\n\n\n";
+
+ mCaptureDeviceDirty = false;
+ }
+}
+
+void LLVivoxVoiceClient::buildSetRenderDevice(std::ostringstream &stream)
+{
+ if(mRenderDeviceDirty)
+ {
+ LL_DEBUGS("Voice") << "Setting output device = \"" << mRenderDevice << "\"" << LL_ENDL;
+
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.SetRenderDevice.1\">"
+ << "<RenderDeviceSpecifier>" << mRenderDevice << "</RenderDeviceSpecifier>"
+ << "</Request>"
+ << "\n\n\n";
+ mRenderDeviceDirty = false;
+ }
+}
+
+void LLVivoxVoiceClient::buildLocalAudioUpdates(std::ostringstream &stream)
+{
+ buildSetCaptureDevice(stream);
+
+ buildSetRenderDevice(stream);
+
+ if(mPTTDirty)
+ {
+ mPTTDirty = false;
+
+ // Send a local mute command.
+ // NOTE that the state of "PTT" is the inverse of "local mute".
+ // (i.e. when PTT is true, we send a mute command with "false", and vice versa)
+
+ LL_DEBUGS("Voice") << "Sending MuteLocalMic command with parameter " << (mPTT?"false":"true") << LL_ENDL;
+
+ stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalMic.1\">"
+ << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>"
+ << "<Value>" << (mPTT?"false":"true") << "</Value>"
+ << "</Request>\n\n\n";
+
+ }
+
+ if(mSpeakerMuteDirty)
+ {
+ const char *muteval = ((mSpeakerVolume <= scale_speaker_volume(0))?"true":"false");
+
+ mSpeakerMuteDirty = false;
+
+ LL_INFOS("Voice") << "Setting speaker mute to " << muteval << LL_ENDL;
+
+ stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalSpeaker.1\">"
+ << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>"
+ << "<Value>" << muteval << "</Value>"
+ << "</Request>\n\n\n";
+
+ }
+
+ if(mSpeakerVolumeDirty)
+ {
+ mSpeakerVolumeDirty = false;
+
+ LL_INFOS("Voice") << "Setting speaker volume to " << mSpeakerVolume << LL_ENDL;
+
+ stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.SetLocalSpeakerVolume.1\">"
+ << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>"
+ << "<Value>" << mSpeakerVolume << "</Value>"
+ << "</Request>\n\n\n";
+
+ }
+
+ if(mMicVolumeDirty)
+ {
+ mMicVolumeDirty = false;
+
+ LL_INFOS("Voice") << "Setting mic volume to " << mMicVolume << LL_ENDL;
+
+ stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.SetLocalMicVolume.1\">"
+ << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>"
+ << "<Value>" << mMicVolume << "</Value>"
+ << "</Request>\n\n\n";
+ }
+
+
+}
+
+void LLVivoxVoiceClient::checkFriend(const LLUUID& id)
+{
+ std::string name;
+ buddyListEntry *buddy = findBuddy(id);
+
+ // Make sure we don't add a name before it's been looked up.
+ if(gCacheName->getFullName(id, name))
+ {
+
+ const LLRelationship* relationInfo = LLAvatarTracker::instance().getBuddyInfo(id);
+ bool canSeeMeOnline = false;
+ if(relationInfo && relationInfo->isRightGrantedTo(LLRelationship::GRANT_ONLINE_STATUS))
+ canSeeMeOnline = true;
+
+ // When we get here, mNeedsSend is true and mInSLFriends is false. Change them as necessary.
+
+ if(buddy)
+ {
+ // This buddy is already in both lists.
+
+ if(name != buddy->mDisplayName)
+ {
+ // The buddy is in the list with the wrong name. Update it with the correct name.
+ LL_WARNS("Voice") << "Buddy " << id << " has wrong name (\"" << buddy->mDisplayName << "\" should be \"" << name << "\"), updating."<< LL_ENDL;
+ buddy->mDisplayName = name;
+ buddy->mNeedsNameUpdate = true; // This will cause the buddy to be resent.
+ }
+ }
+ else
+ {
+ // This buddy was not in the vivox list, needs to be added.
+ buddy = addBuddy(sipURIFromID(id), name);
+ buddy->mUUID = id;
+ }
+
+ // In all the above cases, the buddy is in the SL friends list (which is how we got here).
+ buddy->mInSLFriends = true;
+ buddy->mCanSeeMeOnline = canSeeMeOnline;
+ buddy->mNameResolved = true;
+
+ }
+ else
+ {
+ // This name hasn't been looked up yet. Don't do anything with this buddy list entry until it has.
+ if(buddy)
+ {
+ buddy->mNameResolved = false;
+ }
+
+ // Initiate a lookup.
+ // The "lookup completed" callback will ensure that the friends list is rechecked after it completes.
+ lookupName(id);
+ }
+}
+
+void LLVivoxVoiceClient::clearAllLists()
+{
+ // FOR TESTING ONLY
+
+ // This will send the necessary commands to delete ALL buddies, autoaccept rules, and block rules SLVoice tells us about.
+ buddyListMap::iterator buddy_it;
+ for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end();)
+ {
+ buddyListEntry *buddy = buddy_it->second;
+ buddy_it++;
+
+ std::ostringstream stream;
+
+ if(buddy->mInVivoxBuddies)
+ {
+ // delete this entry from the vivox buddy list
+ buddy->mInVivoxBuddies = false;
+ LL_DEBUGS("Voice") << "delete " << buddy->mURI << " (" << buddy->mDisplayName << ")" << LL_ENDL;
+ stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.BuddyDelete.1\">"
+ << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
+ << "<BuddyURI>" << buddy->mURI << "</BuddyURI>"
+ << "</Request>\n\n\n";
+ }
+
+ if(buddy->mHasBlockListEntry)
+ {
+ // Delete the associated block list entry (so the block list doesn't fill up with junk)
+ buddy->mHasBlockListEntry = false;
+ stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteBlockRule.1\">"
+ << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
+ << "<BlockMask>" << buddy->mURI << "</BlockMask>"
+ << "</Request>\n\n\n";
+ }
+ if(buddy->mHasAutoAcceptListEntry)
+ {
+ // Delete the associated auto-accept list entry (so the auto-accept list doesn't fill up with junk)
+ buddy->mHasAutoAcceptListEntry = false;
+ stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteAutoAcceptRule.1\">"
+ << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
+ << "<AutoAcceptMask>" << buddy->mURI << "</AutoAcceptMask>"
+ << "</Request>\n\n\n";
+ }
+
+ writeString(stream.str());
+
+ }
+}
+
+void LLVivoxVoiceClient::sendFriendsListUpdates()
+{
+ if(mBuddyListMapPopulated && mBlockRulesListReceived && mAutoAcceptRulesListReceived && mFriendsListDirty)
+ {
+ mFriendsListDirty = false;
+
+ if(0)
+ {
+ // FOR TESTING ONLY -- clear all buddy list, block list, and auto-accept list entries.
+ clearAllLists();
+ return;
+ }
+
+ LL_INFOS("Voice") << "Checking vivox buddy list against friends list..." << LL_ENDL;
+
+ buddyListMap::iterator buddy_it;
+ for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end(); buddy_it++)
+ {
+ // reset the temp flags in the local buddy list
+ buddy_it->second->mInSLFriends = false;
+ }
+
+ // correlate with the friends list
+ {
+ LLCollectAllBuddies collect;
+ LLAvatarTracker::instance().applyFunctor(collect);
+ LLCollectAllBuddies::buddy_map_t::const_iterator it = collect.mOnline.begin();
+ LLCollectAllBuddies::buddy_map_t::const_iterator end = collect.mOnline.end();
+
+ for ( ; it != end; ++it)
+ {
+ checkFriend(it->second);
+ }
+ it = collect.mOffline.begin();
+ end = collect.mOffline.end();
+ for ( ; it != end; ++it)
+ {
+ checkFriend(it->second);
+ }
+ }
+
+ LL_INFOS("Voice") << "Sending friend list updates..." << LL_ENDL;
+
+ for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end();)
+ {
+ buddyListEntry *buddy = buddy_it->second;
+ buddy_it++;
+
+ // Ignore entries that aren't resolved yet.
+ if(buddy->mNameResolved)
+ {
+ std::ostringstream stream;
+
+ if(buddy->mInSLFriends && (!buddy->mInVivoxBuddies || buddy->mNeedsNameUpdate))
+ {
+ if(mNumberOfAliases > 0)
+ {
+ // Add (or update) this entry in the vivox buddy list
+ buddy->mInVivoxBuddies = true;
+ buddy->mNeedsNameUpdate = false;
+ LL_DEBUGS("Voice") << "add/update " << buddy->mURI << " (" << buddy->mDisplayName << ")" << LL_ENDL;
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.BuddySet.1\">"
+ << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
+ << "<BuddyURI>" << buddy->mURI << "</BuddyURI>"
+ << "<DisplayName>" << buddy->mDisplayName << "</DisplayName>"
+ << "<BuddyData></BuddyData>" // Without this, SLVoice doesn't seem to parse the command.
+ << "<GroupID>0</GroupID>"
+ << "</Request>\n\n\n";
+ }
+ }
+ else if(!buddy->mInSLFriends)
+ {
+ // This entry no longer exists in your SL friends list. Remove all traces of it from the Vivox buddy list.
+ if(buddy->mInVivoxBuddies)
+ {
+ // delete this entry from the vivox buddy list
+ buddy->mInVivoxBuddies = false;
+ LL_DEBUGS("Voice") << "delete " << buddy->mURI << " (" << buddy->mDisplayName << ")" << LL_ENDL;
+ stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.BuddyDelete.1\">"
+ << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
+ << "<BuddyURI>" << buddy->mURI << "</BuddyURI>"
+ << "</Request>\n\n\n";
+ }
+
+ if(buddy->mHasBlockListEntry)
+ {
+ // Delete the associated block list entry, if any
+ buddy->mHasBlockListEntry = false;
+ stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteBlockRule.1\">"
+ << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
+ << "<BlockMask>" << buddy->mURI << "</BlockMask>"
+ << "</Request>\n\n\n";
+ }
+ if(buddy->mHasAutoAcceptListEntry)
+ {
+ // Delete the associated auto-accept list entry, if any
+ buddy->mHasAutoAcceptListEntry = false;
+ stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteAutoAcceptRule.1\">"
+ << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
+ << "<AutoAcceptMask>" << buddy->mURI << "</AutoAcceptMask>"
+ << "</Request>\n\n\n";
+ }
+ }
+
+ if(buddy->mInSLFriends)
+ {
+
+ if(buddy->mCanSeeMeOnline)
+ {
+ // Buddy should not be blocked.
+
+ // If this buddy doesn't already have either a block or autoaccept list entry, we'll update their status when we receive a SubscriptionEvent.
+
+ // If the buddy has a block list entry, delete it.
+ if(buddy->mHasBlockListEntry)
+ {
+ buddy->mHasBlockListEntry = false;
+ stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteBlockRule.1\">"
+ << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
+ << "<BlockMask>" << buddy->mURI << "</BlockMask>"
+ << "</Request>\n\n\n";
+
+
+ // If we just deleted a block list entry, add an auto-accept entry.
+ if(!buddy->mHasAutoAcceptListEntry)
+ {
+ buddy->mHasAutoAcceptListEntry = true;
+ stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.CreateAutoAcceptRule.1\">"
+ << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
+ << "<AutoAcceptMask>" << buddy->mURI << "</AutoAcceptMask>"
+ << "<AutoAddAsBuddy>0</AutoAddAsBuddy>"
+ << "</Request>\n\n\n";
+ }
+ }
+ }
+ else
+ {
+ // Buddy should be blocked.
+
+ // If this buddy doesn't already have either a block or autoaccept list entry, we'll update their status when we receive a SubscriptionEvent.
+
+ // If this buddy has an autoaccept entry, delete it
+ if(buddy->mHasAutoAcceptListEntry)
+ {
+ buddy->mHasAutoAcceptListEntry = false;
+ stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.DeleteAutoAcceptRule.1\">"
+ << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
+ << "<AutoAcceptMask>" << buddy->mURI << "</AutoAcceptMask>"
+ << "</Request>\n\n\n";
+
+ // If we just deleted an auto-accept entry, add a block list entry.
+ if(!buddy->mHasBlockListEntry)
+ {
+ buddy->mHasBlockListEntry = true;
+ stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.CreateBlockRule.1\">"
+ << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
+ << "<BlockMask>" << buddy->mURI << "</BlockMask>"
+ << "<PresenceOnly>1</PresenceOnly>"
+ << "</Request>\n\n\n";
+ }
+ }
+ }
+
+ if(!buddy->mInSLFriends && !buddy->mInVivoxBuddies)
+ {
+ // Delete this entry from the local buddy list. This should NOT invalidate the iterator,
+ // since it has already been incremented to the next entry.
+ deleteBuddy(buddy->mURI);
+ }
+
+ }
+ writeString(stream.str());
+ }
+ }
+ }
+}
+
+/////////////////////////////
+// Response/Event handlers
+
+void LLVivoxVoiceClient::connectorCreateResponse(int statusCode, std::string &statusString, std::string &connectorHandle, std::string &versionID)
+{
+ if(statusCode != 0)
+ {
+ LL_WARNS("Voice") << "Connector.Create response failure: " << statusString << LL_ENDL;
+ setState(stateConnectorFailed);
+ LLSD args;
+ std::stringstream errs;
+ errs << mVoiceAccountServerURI << "\n:UDP: 3478, 3479, 5060, 5062, 12000-17000";
+ args["HOSTID"] = errs.str();
+ if (LLGridManager::getInstance()->isSystemGrid())
+ {
+ LLNotificationsUtil::add("NoVoiceConnect", args);
+ }
+ else
+ {
+ LLNotificationsUtil::add("NoVoiceConnect-GIAB", args);
+ }
+ }
+ else
+ {
+ // Connector created, move forward.
+ LL_INFOS("Voice") << "Connector.Create succeeded, Vivox SDK version is " << versionID << LL_ENDL;
+ mVoiceVersion.serverVersion = versionID;
+ mConnectorHandle = connectorHandle;
+ if(getState() == stateConnectorStarting)
+ {
+ setState(stateConnectorStarted);
+ }
+ }
+}
+
+void LLVivoxVoiceClient::loginResponse(int statusCode, std::string &statusString, std::string &accountHandle, int numberOfAliases)
+{
+ LL_DEBUGS("Voice") << "Account.Login response (" << statusCode << "): " << statusString << LL_ENDL;
+
+ // Status code of 20200 means "bad password". We may want to special-case that at some point.
+
+ if ( statusCode == 401 )
+ {
+ // Login failure which is probably caused by the delay after a user's password being updated.
+ LL_INFOS("Voice") << "Account.Login response failure (" << statusCode << "): " << statusString << LL_ENDL;
+ setState(stateLoginRetry);
+ }
+ else if(statusCode != 0)
+ {
+ LL_WARNS("Voice") << "Account.Login response failure (" << statusCode << "): " << statusString << LL_ENDL;
+ setState(stateLoginFailed);
+ }
+ else
+ {
+ // Login succeeded, move forward.
+ mAccountHandle = accountHandle;
+ mNumberOfAliases = numberOfAliases;
+ // This needs to wait until the AccountLoginStateChangeEvent is received.
+// if(getState() == stateLoggingIn)
+// {
+// setState(stateLoggedIn);
+// }
+ }
+}
+
+void LLVivoxVoiceClient::sessionCreateResponse(std::string &requestId, int statusCode, std::string &statusString, std::string &sessionHandle)
+{
+ sessionState *session = findSessionBeingCreatedByURI(requestId);
+
+ if(session)
+ {
+ session->mCreateInProgress = false;
+ }
+
+ if(statusCode != 0)
+ {
+ LL_WARNS("Voice") << "Session.Create response failure (" << statusCode << "): " << statusString << LL_ENDL;
+ if(session)
+ {
+ session->mErrorStatusCode = statusCode;
+ session->mErrorStatusString = statusString;
+ if(session == mAudioSession)
+ {
+ setState(stateJoinSessionFailed);
+ }
+ else
+ {
+ reapSession(session);
+ }
+ }
+ }
+ else
+ {
+ LL_INFOS("Voice") << "Session.Create response received (success), session handle is " << sessionHandle << LL_ENDL;
+ if(session)
+ {
+ setSessionHandle(session, sessionHandle);
+ }
+ }
+}
+
+void LLVivoxVoiceClient::sessionGroupAddSessionResponse(std::string &requestId, int statusCode, std::string &statusString, std::string &sessionHandle)
+{
+ sessionState *session = findSessionBeingCreatedByURI(requestId);
+
+ if(session)
+ {
+ session->mCreateInProgress = false;
+ }
+
+ if(statusCode != 0)
+ {
+ LL_WARNS("Voice") << "SessionGroup.AddSession response failure (" << statusCode << "): " << statusString << LL_ENDL;
+ if(session)
+ {
+ session->mErrorStatusCode = statusCode;
+ session->mErrorStatusString = statusString;
+ if(session == mAudioSession)
+ {
+ setState(stateJoinSessionFailed);
+ }
+ else
+ {
+ reapSession(session);
+ }
+ }
+ }
+ else
+ {
+ LL_DEBUGS("Voice") << "SessionGroup.AddSession response received (success), session handle is " << sessionHandle << LL_ENDL;
+ if(session)
+ {
+ setSessionHandle(session, sessionHandle);
+ }
+ }
+}
+
+void LLVivoxVoiceClient::sessionConnectResponse(std::string &requestId, int statusCode, std::string &statusString)
+{
+ sessionState *session = findSession(requestId);
+ if(statusCode != 0)
+ {
+ LL_WARNS("Voice") << "Session.Connect response failure (" << statusCode << "): " << statusString << LL_ENDL;
+ if(session)
+ {
+ session->mMediaConnectInProgress = false;
+ session->mErrorStatusCode = statusCode;
+ session->mErrorStatusString = statusString;
+ if(session == mAudioSession)
+ setState(stateJoinSessionFailed);
+ }
+ }
+ else
+ {
+ LL_DEBUGS("Voice") << "Session.Connect response received (success)" << LL_ENDL;
+ }
+}
+
+void LLVivoxVoiceClient::logoutResponse(int statusCode, std::string &statusString)
+{
+ if(statusCode != 0)
+ {
+ LL_WARNS("Voice") << "Account.Logout response failure: " << statusString << LL_ENDL;
+ // Should this ever fail? do we care if it does?
+ }
+}
+
+void LLVivoxVoiceClient::connectorShutdownResponse(int statusCode, std::string &statusString)
+{
+ if(statusCode != 0)
+ {
+ LL_WARNS("Voice") << "Connector.InitiateShutdown response failure: " << statusString << LL_ENDL;
+ // Should this ever fail? do we care if it does?
+ }
+
+ mConnected = false;
+
+ if(getState() == stateConnectorStopping)
+ {
+ setState(stateConnectorStopped);
+ }
+}
+
+void LLVivoxVoiceClient::sessionAddedEvent(
+ std::string &uriString,
+ std::string &alias,
+ std::string &sessionHandle,
+ std::string &sessionGroupHandle,
+ bool isChannel,
+ bool incoming,
+ std::string &nameString,
+ std::string &applicationString)
+{
+ sessionState *session = NULL;
+
+ LL_INFOS("Voice") << "session " << uriString << ", alias " << alias << ", name " << nameString << " handle " << sessionHandle << LL_ENDL;
+
+ session = addSession(uriString, sessionHandle);
+ if(session)
+ {
+ session->mGroupHandle = sessionGroupHandle;
+ session->mIsChannel = isChannel;
+ session->mIncoming = incoming;
+ session->mAlias = alias;
+
+ // Generate a caller UUID -- don't need to do this for channels
+ if(!session->mIsChannel)
+ {
+ if(IDFromName(session->mSIPURI, session->mCallerID))
+ {
+ // Normal URI(base64-encoded UUID)
+ }
+ else if(!session->mAlias.empty() && IDFromName(session->mAlias, session->mCallerID))
+ {
+ // Wrong URI, but an alias is available. Stash the incoming URI as an alternate
+ session->mAlternateSIPURI = session->mSIPURI;
+
+ // and generate a proper URI from the ID.
+ setSessionURI(session, sipURIFromID(session->mCallerID));
+ }
+ else
+ {
+ LL_INFOS("Voice") << "Could not generate caller id from uri, using hash of uri " << session->mSIPURI << LL_ENDL;
+ session->mCallerID.generate(session->mSIPURI);
+ session->mSynthesizedCallerID = true;
+
+ // Can't look up the name in this case -- we have to extract it from the URI.
+ std::string namePortion = nameFromsipURI(session->mSIPURI);
+ if(namePortion.empty())
+ {
+ // Didn't seem to be a SIP URI, just use the whole provided name.
+ namePortion = nameString;
+ }
+
+ // Some incoming names may be separated with an underscore instead of a space. Fix this.
+ LLStringUtil::replaceChar(namePortion, '_', ' ');
+
+ // Act like we just finished resolving the name (this stores it in all the right places)
+ avatarNameResolved(session->mCallerID, namePortion);
+ }
+
+ LL_INFOS("Voice") << "caller ID: " << session->mCallerID << LL_ENDL;
+
+ if(!session->mSynthesizedCallerID)
+ {
+ // If we got here, we don't have a proper name. Initiate a lookup.
+ lookupName(session->mCallerID);
+ }
+ }
+ }
+}
+
+void LLVivoxVoiceClient::sessionGroupAddedEvent(std::string &sessionGroupHandle)
+{
+ LL_DEBUGS("Voice") << "handle " << sessionGroupHandle << LL_ENDL;
+
+#if USE_SESSION_GROUPS
+ if(mMainSessionGroupHandle.empty())
+ {
+ // This is the first (i.e. "main") session group. Save its handle.
+ mMainSessionGroupHandle = sessionGroupHandle;
+ }
+ else
+ {
+ LL_DEBUGS("Voice") << "Already had a session group handle " << mMainSessionGroupHandle << LL_ENDL;
+ }
+#endif
+}
+
+void LLVivoxVoiceClient::joinedAudioSession(sessionState *session)
+{
+ LL_DEBUGS("Voice") << "Joined Audio Session" << LL_ENDL;
+ if(mAudioSession != session)
+ {
+ sessionState *oldSession = mAudioSession;
+
+ mAudioSession = session;
+ mAudioSessionChanged = true;
+
+ // The old session may now need to be deleted.
+ reapSession(oldSession);
+ }
+
+ // This is the session we're joining.
+ if(getState() == stateJoiningSession)
+ {
+ setState(stateSessionJoined);
+
+ // SLIM SDK: we don't always receive a participant state change for ourselves when joining a channel now.
+ // Add the current user as a participant here.
+ participantState *participant = session->addParticipant(sipURIFromName(mAccountName));
+ if(participant)
+ {
+ participant->mIsSelf = true;
+ lookupName(participant->mAvatarID);
+
+ LL_INFOS("Voice") << "added self as participant \"" << participant->mAccountName
+ << "\" (" << participant->mAvatarID << ")"<< LL_ENDL;
+ }
+
+ if(!session->mIsChannel)
+ {
+ // this is a p2p session. Make sure the other end is added as a participant.
+ participantState *participant = session->addParticipant(session->mSIPURI);
+ if(participant)
+ {
+ if(participant->mAvatarIDValid)
+ {
+ lookupName(participant->mAvatarID);
+ }
+ else if(!session->mName.empty())
+ {
+ participant->mDisplayName = session->mName;
+ avatarNameResolved(participant->mAvatarID, session->mName);
+ }
+
+ // TODO: Question: Do we need to set up mAvatarID/mAvatarIDValid here?
+ LL_INFOS("Voice") << "added caller as participant \"" << participant->mAccountName
+ << "\" (" << participant->mAvatarID << ")"<< LL_ENDL;
+ }
+ }
+ }
+}
+
+void LLVivoxVoiceClient::sessionRemovedEvent(
+ std::string &sessionHandle,
+ std::string &sessionGroupHandle)
+{
+ LL_INFOS("Voice") << "handle " << sessionHandle << LL_ENDL;
+
+ sessionState *session = findSession(sessionHandle);
+ if(session)
+ {
+ leftAudioSession(session);
+
+ // This message invalidates the session's handle. Set it to empty.
+ setSessionHandle(session);
+
+ // This also means that the session's session group is now empty.
+ // Terminate the session group so it doesn't leak.
+ sessionGroupTerminateSendMessage(session);
+
+ // Reset the media state (we now have no info)
+ session->mMediaStreamState = streamStateUnknown;
+ session->mTextStreamState = streamStateUnknown;
+
+ // Conditionally delete the session
+ reapSession(session);
+ }
+ else
+ {
+ LL_WARNS("Voice") << "unknown session " << sessionHandle << " removed" << LL_ENDL;
+ }
+}
+
+void LLVivoxVoiceClient::reapSession(sessionState *session)
+{
+ if(session)
+ {
+ if(!session->mHandle.empty())
+ {
+ LL_DEBUGS("Voice") << "NOT deleting session " << session->mSIPURI << " (non-null session handle)" << LL_ENDL;
+ }
+ else if(session->mCreateInProgress)
+ {
+ LL_DEBUGS("Voice") << "NOT deleting session " << session->mSIPURI << " (create in progress)" << LL_ENDL;
+ }
+ else if(session->mMediaConnectInProgress)
+ {
+ LL_DEBUGS("Voice") << "NOT deleting session " << session->mSIPURI << " (connect in progress)" << LL_ENDL;
+ }
+ else if(session == mAudioSession)
+ {
+ LL_DEBUGS("Voice") << "NOT deleting session " << session->mSIPURI << " (it's the current session)" << LL_ENDL;
+ }
+ else if(session == mNextAudioSession)
+ {
+ LL_DEBUGS("Voice") << "NOT deleting session " << session->mSIPURI << " (it's the next session)" << LL_ENDL;
+ }
+ else
+ {
+ // TODO: Question: Should we check for queued text messages here?
+ // We don't have a reason to keep tracking this session, so just delete it.
+ LL_DEBUGS("Voice") << "deleting session " << session->mSIPURI << LL_ENDL;
+ deleteSession(session);
+ session = NULL;
+ }
+ }
+ else
+ {
+// LL_DEBUGS("Voice") << "session is NULL" << LL_ENDL;
+ }
+}
+
+// Returns true if the session seems to indicate we've moved to a region on a different voice server
+bool LLVivoxVoiceClient::sessionNeedsRelog(sessionState *session)
+{
+ bool result = false;
+
+ if(session != NULL)
+ {
+ // Only make this check for spatial channels (so it won't happen for group or p2p calls)
+ if(session->mIsSpatial)
+ {
+ std::string::size_type atsign;
+
+ atsign = session->mSIPURI.find("@");
+
+ if(atsign != std::string::npos)
+ {
+ std::string urihost = session->mSIPURI.substr(atsign + 1);
+ if(stricmp(urihost.c_str(), mVoiceSIPURIHostName.c_str()))
+ {
+ // The hostname in this URI is different from what we expect. This probably means we need to relog.
+
+ // We could make a ProvisionVoiceAccountRequest and compare the result with the current values of
+ // mVoiceSIPURIHostName and mVoiceAccountServerURI to be really sure, but this is a pretty good indicator.
+
+ result = true;
+ }
+ }
+ }
+ }
+
+ return result;
+}
+
+void LLVivoxVoiceClient::leftAudioSession(
+ sessionState *session)
+{
+ if(mAudioSession == session)
+ {
+ switch(getState())
+ {
+ case stateJoiningSession:
+ case stateSessionJoined:
+ case stateRunning:
+ case stateLeavingSession:
+ case stateJoinSessionFailed:
+ case stateJoinSessionFailedWaiting:
+ // normal transition
+ LL_DEBUGS("Voice") << "left session " << session->mHandle << " in state " << state2string(getState()) << LL_ENDL;
+ setState(stateSessionTerminated);
+ break;
+
+ case stateSessionTerminated:
+ // this will happen sometimes -- there are cases where we send the terminate and then go straight to this state.
+ LL_WARNS("Voice") << "left session " << session->mHandle << " in state " << state2string(getState()) << LL_ENDL;
+ break;
+
+ default:
+ LL_WARNS("Voice") << "unexpected SessionStateChangeEvent (left session) in state " << state2string(getState()) << LL_ENDL;
+ setState(stateSessionTerminated);
+ break;
+ }
+ }
+}
+
+void LLVivoxVoiceClient::accountLoginStateChangeEvent(
+ std::string &accountHandle,
+ int statusCode,
+ std::string &statusString,
+ int state)
+{
+ /*
+ According to Mike S., status codes for this event are:
+ login_state_logged_out=0,
+ login_state_logged_in = 1,
+ login_state_logging_in = 2,
+ login_state_logging_out = 3,
+ login_state_resetting = 4,
+ login_state_error=100
+ */
+
+ LL_DEBUGS("Voice") << "state change event: " << state << LL_ENDL;
+ switch(state)
+ {
+ case 1:
+ if(getState() == stateLoggingIn)
+ {
+ setState(stateLoggedIn);
+ }
+ break;
+
+ case 3:
+ // The user is in the process of logging out.
+ setState(stateLoggingOut);
+ break;
+
+ case 0:
+ // The user has been logged out.
+ setState(stateLoggedOut);
+ break;
+
+ default:
+ //Used to be a commented out warning
+ LL_DEBUGS("Voice") << "unknown state: " << state << LL_ENDL;
+ break;
+ }
+}
+
+void LLVivoxVoiceClient::mediaCompletionEvent(std::string &sessionGroupHandle, std::string &mediaCompletionType)
+{
+ if (mediaCompletionType == "AuxBufferAudioCapture")
+ {
+ mCaptureBufferRecording = false;
+ }
+ else if (mediaCompletionType == "AuxBufferAudioRender")
+ {
+ // Ignore all but the last stop event
+ if (--mPlayRequestCount <= 0)
+ {
+ mCaptureBufferPlaying = false;
+ }
+ }
+ else
+ {
+ LL_DEBUGS("Voice") << "Unknown MediaCompletionType: " << mediaCompletionType << LL_ENDL;
+ }
+}
+
+void LLVivoxVoiceClient::mediaStreamUpdatedEvent(
+ std::string &sessionHandle,
+ std::string &sessionGroupHandle,
+ int statusCode,
+ std::string &statusString,
+ int state,
+ bool incoming)
+{
+ sessionState *session = findSession(sessionHandle);
+
+ LL_DEBUGS("Voice") << "session " << sessionHandle << ", status code " << statusCode << ", string \"" << statusString << "\"" << LL_ENDL;
+
+ if(session)
+ {
+ // We know about this session
+
+ // Save the state for later use
+ session->mMediaStreamState = state;
+
+ switch(statusCode)
+ {
+ case 0:
+ case 200:
+ // generic success
+ // Don't change the saved error code (it may have been set elsewhere)
+ break;
+ default:
+ // save the status code for later
+ session->mErrorStatusCode = statusCode;
+ break;
+ }
+
+ switch(state)
+ {
+ case streamStateIdle:
+ // Standard "left audio session"
+ session->mVoiceEnabled = false;
+ session->mMediaConnectInProgress = false;
+ leftAudioSession(session);
+ break;
+
+ case streamStateConnected:
+ session->mVoiceEnabled = true;
+ session->mMediaConnectInProgress = false;
+ joinedAudioSession(session);
+ break;
+
+ case streamStateRinging:
+ if(incoming)
+ {
+ // Send the voice chat invite to the GUI layer
+ // TODO: Question: Should we correlate with the mute list here?
+ session->mIMSessionID = LLIMMgr::computeSessionID(IM_SESSION_P2P_INVITE, session->mCallerID);
+ session->mVoiceInvitePending = true;
+ if(session->mName.empty())
+ {
+ lookupName(session->mCallerID);
+ }
+ else
+ {
+ // Act like we just finished resolving the name
+ avatarNameResolved(session->mCallerID, session->mName);
+ }
+ }
+ break;
+
+ default:
+ LL_WARNS("Voice") << "unknown state " << state << LL_ENDL;
+ break;
+
+ }
+
+ }
+ else
+ {
+ LL_WARNS("Voice") << "session " << sessionHandle << "not found"<< LL_ENDL;
+ }
+}
+
+void LLVivoxVoiceClient::textStreamUpdatedEvent(
+ std::string &sessionHandle,
+ std::string &sessionGroupHandle,
+ bool enabled,
+ int state,
+ bool incoming)
+{
+ sessionState *session = findSession(sessionHandle);
+
+ if(session)
+ {
+ // Save the state for later use
+ session->mTextStreamState = state;
+
+ // We know about this session
+ switch(state)
+ {
+ case 0: // We see this when the text stream closes
+ LL_DEBUGS("Voice") << "stream closed" << LL_ENDL;
+ break;
+
+ case 1: // We see this on an incoming call from the Connector
+ // Try to send any text messages queued for this session.
+ sendQueuedTextMessages(session);
+
+ // Send the text chat invite to the GUI layer
+ // TODO: Question: Should we correlate with the mute list here?
+ session->mTextInvitePending = true;
+ if(session->mName.empty())
+ {
+ lookupName(session->mCallerID);
+ }
+ else
+ {
+ // Act like we just finished resolving the name
+ avatarNameResolved(session->mCallerID, session->mName);
+ }
+ break;
+
+ default:
+ LL_WARNS("Voice") << "unknown state " << state << LL_ENDL;
+ break;
+
+ }
+ }
+}
+
+void LLVivoxVoiceClient::participantAddedEvent(
+ std::string &sessionHandle,
+ std::string &sessionGroupHandle,
+ std::string &uriString,
+ std::string &alias,
+ std::string &nameString,
+ std::string &displayNameString,
+ int participantType)
+{
+ sessionState *session = findSession(sessionHandle);
+ if(session)
+ {
+ participantState *participant = session->addParticipant(uriString);
+ if(participant)
+ {
+ participant->mAccountName = nameString;
+
+ LL_DEBUGS("Voice") << "added participant \"" << participant->mAccountName
+ << "\" (" << participant->mAvatarID << ")"<< LL_ENDL;
+
+ if(participant->mAvatarIDValid)
+ {
+ // Initiate a lookup
+ lookupName(participant->mAvatarID);
+ }
+ else
+ {
+ // If we don't have a valid avatar UUID, we need to fill in the display name to make the active speakers floater work.
+ std::string namePortion = nameFromsipURI(uriString);
+ if(namePortion.empty())
+ {
+ // Problem with the SIP URI, fall back to the display name
+ namePortion = displayNameString;
+ }
+ if(namePortion.empty())
+ {
+ // Problems with both of the above, fall back to the account name
+ namePortion = nameString;
+ }
+
+ // Set the display name (which is a hint to the active speakers window not to do its own lookup)
+ participant->mDisplayName = namePortion;
+ avatarNameResolved(participant->mAvatarID, namePortion);
+ }
+ }
+ }
+}
+
+void LLVivoxVoiceClient::participantRemovedEvent(
+ std::string &sessionHandle,
+ std::string &sessionGroupHandle,
+ std::string &uriString,
+ std::string &alias,
+ std::string &nameString)
+{
+ sessionState *session = findSession(sessionHandle);
+ if(session)
+ {
+ participantState *participant = session->findParticipant(uriString);
+ if(participant)
+ {
+ session->removeParticipant(participant);
+ }
+ else
+ {
+ LL_DEBUGS("Voice") << "unknown participant " << uriString << LL_ENDL;
+ }
+ }
+ else
+ {
+ LL_DEBUGS("Voice") << "unknown session " << sessionHandle << LL_ENDL;
+ }
+}
+
+
+void LLVivoxVoiceClient::participantUpdatedEvent(
+ std::string &sessionHandle,
+ std::string &sessionGroupHandle,
+ std::string &uriString,
+ std::string &alias,
+ bool isModeratorMuted,
+ bool isSpeaking,
+ int volume,
+ F32 energy)
+{
+ sessionState *session = findSession(sessionHandle);
+ if(session)
+ {
+ participantState *participant = session->findParticipant(uriString);
+
+ if(participant)
+ {
+ participant->mIsSpeaking = isSpeaking;
+ participant->mIsModeratorMuted = isModeratorMuted;
+
+ // SLIM SDK: convert range: ensure that energy is set to zero if is_speaking is false
+ if (isSpeaking)
+ {
+ participant->mSpeakingTimeout.reset();
+ participant->mPower = energy;
+ }
+ else
+ {
+ participant->mPower = 0.0f;
+ }
+
+ // Ignore incoming volume level if it has been explicitly set, or there
+ // is a volume or mute change pending.
+ if ( !participant->mVolumeSet && !participant->mVolumeDirty)
+ {
+ participant->mVolume = (F32)volume * VOLUME_SCALE_VIVOX;
+ }
+
+ // *HACK: mantipov: added while working on EXT-3544
+ /*
+ Sometimes LLVoiceClient::participantUpdatedEvent callback is called BEFORE
+ LLViewerChatterBoxSessionAgentListUpdates::post() sometimes AFTER.
+
+ participantUpdatedEvent updates voice participant state in particular participantState::mIsModeratorMuted
+ Originally we wanted to update session Speaker Manager to fire LLSpeakerVoiceModerationEvent to fix the EXT-3544 bug.
+ Calling of the LLSpeakerMgr::update() method was added into LLIMMgr::processAgentListUpdates.
+
+ But in case participantUpdatedEvent() is called after LLViewerChatterBoxSessionAgentListUpdates::post()
+ voice participant mIsModeratorMuted is changed after speakers are updated in Speaker Manager
+ and event is not fired.
+
+ So, we have to call LLSpeakerMgr::update() here. In any case it is better than call it
+ in LLCallFloater::draw()
+ */
+ LLVoiceChannel* voice_cnl = LLVoiceChannel::getCurrentVoiceChannel();
+
+ // ignore session ID of local chat
+ if (voice_cnl && voice_cnl->getSessionID().notNull())
+ {
+ LLSpeakerMgr* speaker_manager = LLIMModel::getInstance()->getSpeakerManager(voice_cnl->getSessionID());
+ if (speaker_manager)
+ {
+ speaker_manager->update(true);
+
+ // also initialize voice moderate_mode depend on Agent's participant. See EXT-6937.
+ // *TODO: remove once a way to request the current voice channel moderation mode is implemented.
+ if (gAgentID == participant->mAvatarID)
+ {
+ speaker_manager->initVoiceModerateMode();
+ }
+ }
+ }
+ }
+ else
+ {
+ LL_WARNS("Voice") << "unknown participant: " << uriString << LL_ENDL;
+ }
+ }
+ else
+ {
+ LL_INFOS("Voice") << "unknown session " << sessionHandle << LL_ENDL;
+ }
+}
+
+void LLVivoxVoiceClient::buddyPresenceEvent(
+ std::string &uriString,
+ std::string &alias,
+ std::string &statusString,
+ std::string &applicationString)
+{
+ buddyListEntry *buddy = findBuddy(uriString);
+
+ if(buddy)
+ {
+ LL_DEBUGS("Voice") << "Presence event for " << buddy->mDisplayName << " status \"" << statusString << "\", application \"" << applicationString << "\""<< LL_ENDL;
+ LL_DEBUGS("Voice") << "before: mOnlineSL = " << (buddy->mOnlineSL?"true":"false") << ", mOnlineSLim = " << (buddy->mOnlineSLim?"true":"false") << LL_ENDL;
+
+ if(applicationString.empty())
+ {
+ // This presence event is from a client that doesn't set up the Application string. Do things the old-skool way.
+ // NOTE: this will be needed to support people who aren't on the 3010-class SDK yet.
+
+ if ( stricmp("Unknown", statusString.c_str())== 0)
+ {
+ // User went offline with a non-SLim-enabled viewer.
+ buddy->mOnlineSL = false;
+ }
+ else if ( stricmp("Online", statusString.c_str())== 0)
+ {
+ // User came online with a non-SLim-enabled viewer.
+ buddy->mOnlineSL = true;
+ }
+ else
+ {
+ // If the user is online through SLim, their status will be "Online-slc", "Away", or something else.
+ // NOTE: we should never see this unless someone is running an OLD version of SLim -- the versions that should be in use now all set the application string.
+ buddy->mOnlineSLim = true;
+ }
+ }
+ else if(applicationString.find("SecondLifeViewer") != std::string::npos)
+ {
+ // This presence event is from a viewer that sets the application string
+ if ( stricmp("Unknown", statusString.c_str())== 0)
+ {
+ // Viewer says they're offline
+ buddy->mOnlineSL = false;
+ }
+ else
+ {
+ // Viewer says they're online
+ buddy->mOnlineSL = true;
+ }
+ }
+ else
+ {
+ // This presence event is from something which is NOT the SL viewer (assume it's SLim).
+ if ( stricmp("Unknown", statusString.c_str())== 0)
+ {
+ // SLim says they're offline
+ buddy->mOnlineSLim = false;
+ }
+ else
+ {
+ // SLim says they're online
+ buddy->mOnlineSLim = true;
+ }
+ }
+
+ LL_DEBUGS("Voice") << "after: mOnlineSL = " << (buddy->mOnlineSL?"true":"false") << ", mOnlineSLim = " << (buddy->mOnlineSLim?"true":"false") << LL_ENDL;
+
+ // HACK -- increment the internal change serial number in the LLRelationship (without changing the actual status), so the UI notices the change.
+ LLAvatarTracker::instance().setBuddyOnline(buddy->mUUID,LLAvatarTracker::instance().isBuddyOnline(buddy->mUUID));
+
+ notifyFriendObservers();
+ }
+ else
+ {
+ LL_DEBUGS("Voice") << "Presence for unknown buddy " << uriString << LL_ENDL;
+ }
+}
+
+void LLVivoxVoiceClient::messageEvent(
+ std::string &sessionHandle,
+ std::string &uriString,
+ std::string &alias,
+ std::string &messageHeader,
+ std::string &messageBody,
+ std::string &applicationString)
+{
+ LL_DEBUGS("Voice") << "Message event, session " << sessionHandle << " from " << uriString << LL_ENDL;
+// LL_DEBUGS("Voice") << " header " << messageHeader << ", body: \n" << messageBody << LL_ENDL;
+
+ if(messageHeader.find("text/html") != std::string::npos)
+ {
+ std::string message;
+
+ {
+ const std::string startMarker = "<body";
+ const std::string startMarker2 = ">";
+ const std::string endMarker = "</body>";
+ const std::string startSpan = "<span";
+ const std::string endSpan = "</span>";
+ std::string::size_type start;
+ std::string::size_type end;
+
+ // Default to displaying the raw string, so the message gets through.
+ message = messageBody;
+
+ // Find the actual message text within the XML fragment
+ start = messageBody.find(startMarker);
+ start = messageBody.find(startMarker2, start);
+ end = messageBody.find(endMarker);
+
+ if(start != std::string::npos)
+ {
+ start += startMarker2.size();
+
+ if(end != std::string::npos)
+ end -= start;
+
+ message.assign(messageBody, start, end);
+ }
+ else
+ {
+ // Didn't find a <body>, try looking for a <span> instead.
+ start = messageBody.find(startSpan);
+ start = messageBody.find(startMarker2, start);
+ end = messageBody.find(endSpan);
+
+ if(start != std::string::npos)
+ {
+ start += startMarker2.size();
+
+ if(end != std::string::npos)
+ end -= start;
+
+ message.assign(messageBody, start, end);
+ }
+ }
+ }
+
+// LL_DEBUGS("Voice") << " raw message = \n" << message << LL_ENDL;
+
+ // strip formatting tags
+ {
+ std::string::size_type start;
+ std::string::size_type end;
+
+ while((start = message.find('<')) != std::string::npos)
+ {
+ if((end = message.find('>', start + 1)) != std::string::npos)
+ {
+ // Strip out the tag
+ message.erase(start, (end + 1) - start);
+ }
+ else
+ {
+ // Avoid an infinite loop
+ break;
+ }
+ }
+ }
+
+ // Decode ampersand-escaped chars
+ {
+ std::string::size_type mark = 0;
+
+ // The text may contain text encoded with &lt;, &gt;, and &amp;
+ mark = 0;
+ while((mark = message.find("&lt;", mark)) != std::string::npos)
+ {
+ message.replace(mark, 4, "<");
+ mark += 1;
+ }
+
+ mark = 0;
+ while((mark = message.find("&gt;", mark)) != std::string::npos)
+ {
+ message.replace(mark, 4, ">");
+ mark += 1;
+ }
+
+ mark = 0;
+ while((mark = message.find("&amp;", mark)) != std::string::npos)
+ {
+ message.replace(mark, 5, "&");
+ mark += 1;
+ }
+ }
+
+ // strip leading/trailing whitespace (since we always seem to get a couple newlines)
+ LLStringUtil::trim(message);
+
+// LL_DEBUGS("Voice") << " stripped message = \n" << message << LL_ENDL;
+
+ sessionState *session = findSession(sessionHandle);
+ if(session)
+ {
+ bool is_busy = gAgent.getBusy();
+ bool is_muted = LLMuteList::getInstance()->isMuted(session->mCallerID, session->mName, LLMute::flagTextChat);
+ bool is_linden = LLMuteList::getInstance()->isLinden(session->mName);
+ bool quiet_chat = false;
+ LLChat chat;
+
+ chat.mMuted = is_muted && !is_linden;
+
+ if(!chat.mMuted)
+ {
+ chat.mFromID = session->mCallerID;
+ chat.mFromName = session->mName;
+ chat.mSourceType = CHAT_SOURCE_AGENT;
+
+ if(is_busy && !is_linden)
+ {
+ quiet_chat = true;
+ // TODO: Question: Return busy mode response here? Or maybe when session is started instead?
+ }
+
+ LL_DEBUGS("Voice") << "adding message, name " << session->mName << " session " << session->mIMSessionID << ", target " << session->mCallerID << LL_ENDL;
+ gIMMgr->addMessage(session->mIMSessionID,
+ session->mCallerID,
+ session->mName.c_str(),
+ message.c_str(),
+ LLStringUtil::null, // default arg
+ IM_NOTHING_SPECIAL, // default arg
+ 0, // default arg
+ LLUUID::null, // default arg
+ LLVector3::zero, // default arg
+ true); // prepend name and make it a link to the user's profile
+
+ }
+ }
+ }
+}
+
+void LLVivoxVoiceClient::sessionNotificationEvent(std::string &sessionHandle, std::string &uriString, std::string &notificationType)
+{
+ sessionState *session = findSession(sessionHandle);
+
+ if(session)
+ {
+ participantState *participant = session->findParticipant(uriString);
+ if(participant)
+ {
+ if (!stricmp(notificationType.c_str(), "Typing"))
+ {
+ // Other end started typing
+ // TODO: The proper way to add a typing notification seems to be LLIMMgr::processIMTypingStart().
+ // It requires an LLIMInfo for the message, which we don't have here.
+ }
+ else if (!stricmp(notificationType.c_str(), "NotTyping"))
+ {
+ // Other end stopped typing
+ // TODO: The proper way to remove a typing notification seems to be LLIMMgr::processIMTypingStop().
+ // It requires an LLIMInfo for the message, which we don't have here.
+ }
+ else
+ {
+ LL_DEBUGS("Voice") << "Unknown notification type " << notificationType << "for participant " << uriString << " in session " << session->mSIPURI << LL_ENDL;
+ }
+ }
+ else
+ {
+ LL_DEBUGS("Voice") << "Unknown participant " << uriString << " in session " << session->mSIPURI << LL_ENDL;
+ }
+ }
+ else
+ {
+ LL_DEBUGS("Voice") << "Unknown session handle " << sessionHandle << LL_ENDL;
+ }
+}
+
+void LLVivoxVoiceClient::subscriptionEvent(std::string &buddyURI, std::string &subscriptionHandle, std::string &alias, std::string &displayName, std::string &applicationString, std::string &subscriptionType)
+{
+ buddyListEntry *buddy = findBuddy(buddyURI);
+
+ if(!buddy)
+ {
+ // Couldn't find buddy by URI, try converting the alias...
+ if(!alias.empty())
+ {
+ LLUUID id;
+ if(IDFromName(alias, id))
+ {
+ buddy = findBuddy(id);
+ }
+ }
+ }
+
+ if(buddy)
+ {
+ std::ostringstream stream;
+
+ if(buddy->mCanSeeMeOnline)
+ {
+ // Sending the response will create an auto-accept rule
+ buddy->mHasAutoAcceptListEntry = true;
+ }
+ else
+ {
+ // Sending the response will create a block rule
+ buddy->mHasBlockListEntry = true;
+ }
+
+ if(buddy->mInSLFriends)
+ {
+ buddy->mInVivoxBuddies = true;
+ }
+
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.SendSubscriptionReply.1\">"
+ << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
+ << "<BuddyURI>" << buddy->mURI << "</BuddyURI>"
+ << "<RuleType>" << (buddy->mCanSeeMeOnline?"Allow":"Hide") << "</RuleType>"
+ << "<AutoAccept>"<< (buddy->mInSLFriends?"1":"0")<< "</AutoAccept>"
+ << "<SubscriptionHandle>" << subscriptionHandle << "</SubscriptionHandle>"
+ << "</Request>"
+ << "\n\n\n";
+
+ writeString(stream.str());
+ }
+}
+
+void LLVivoxVoiceClient::auxAudioPropertiesEvent(F32 energy)
+{
+ LL_DEBUGS("Voice") << "got energy " << energy << LL_ENDL;
+ mTuningEnergy = energy;
+}
+
+void LLVivoxVoiceClient::buddyListChanged()
+{
+ // This is called after we receive a BuddyAndGroupListChangedEvent.
+ mBuddyListMapPopulated = true;
+ mFriendsListDirty = true;
+}
+
+void LLVivoxVoiceClient::muteListChanged()
+{
+ // The user's mute list has been updated. Go through the current participant list and sync it with the mute list.
+ if(mAudioSession)
+ {
+ participantMap::iterator iter = mAudioSession->mParticipantsByURI.begin();
+
+ for(; iter != mAudioSession->mParticipantsByURI.end(); iter++)
+ {
+ participantState *p = iter->second;
+
+ // Check to see if this participant is on the mute list already
+ if(p->updateMuteState())
+ mAudioSession->mVolumeDirty = true;
+ }
+ }
+}
+
+void LLVivoxVoiceClient::updateFriends(U32 mask)
+{
+ if(mask & (LLFriendObserver::ADD | LLFriendObserver::REMOVE | LLFriendObserver::POWERS))
+ {
+ // Just resend the whole friend list to the daemon
+ mFriendsListDirty = true;
+ }
+}
+
+/////////////////////////////
+// Managing list of participants
+LLVivoxVoiceClient::participantState::participantState(const std::string &uri) :
+ mURI(uri),
+ mPTT(false),
+ mIsSpeaking(false),
+ mIsModeratorMuted(false),
+ mLastSpokeTimestamp(0.f),
+ mPower(0.f),
+ mVolume(LLVoiceClient::VOLUME_DEFAULT),
+ mUserVolume(0),
+ mOnMuteList(false),
+ mVolumeSet(false),
+ mVolumeDirty(false),
+ mAvatarIDValid(false),
+ mIsSelf(false)
+{
+}
+
+LLVivoxVoiceClient::participantState *LLVivoxVoiceClient::sessionState::addParticipant(const std::string &uri)
+{
+ participantState *result = NULL;
+ bool useAlternateURI = false;
+
+ // Note: this is mostly the body of LLVivoxVoiceClient::sessionState::findParticipant(), but since we need to know if it
+ // matched the alternate SIP URI (so we can add it properly), we need to reproduce it here.
+ {
+ participantMap::iterator iter = mParticipantsByURI.find(uri);
+
+ if(iter == mParticipantsByURI.end())
+ {
+ if(!mAlternateSIPURI.empty() && (uri == mAlternateSIPURI))
+ {
+ // This is a p2p session (probably with the SLIM client) with an alternate URI for the other participant.
+ // Use mSIPURI instead, since it will be properly encoded.
+ iter = mParticipantsByURI.find(mSIPURI);
+ useAlternateURI = true;
+ }
+ }
+
+ if(iter != mParticipantsByURI.end())
+ {
+ result = iter->second;
+ }
+ }
+
+ if(!result)
+ {
+ // participant isn't already in one list or the other.
+ result = new participantState(useAlternateURI?mSIPURI:uri);
+ mParticipantsByURI.insert(participantMap::value_type(result->mURI, result));
+ mParticipantsChanged = true;
+
+ // Try to do a reverse transform on the URI to get the GUID back.
+ {
+ LLUUID id;
+ if(LLVivoxVoiceClient::getInstance()->IDFromName(result->mURI, id))
+ {
+ result->mAvatarIDValid = true;
+ result->mAvatarID = id;
+ }
+ else
+ {
+ // Create a UUID by hashing the URI, but do NOT set mAvatarIDValid.
+ // This indicates that the ID will not be in the name cache.
+ result->mAvatarID.generate(uri);
+ }
+ }
+
+
+ if(result->updateMuteState())
+ {
+ mMuteDirty = true;
+ }
+
+ mParticipantsByUUID.insert(participantUUIDMap::value_type(result->mAvatarID, result));
+
+ if (LLSpeakerVolumeStorage::getInstance()->getSpeakerVolume(result->mAvatarID, result->mVolume))
+ {
+ result->mVolumeDirty = true;
+ mVolumeDirty = true;
+ }
+
+ LL_DEBUGS("Voice") << "participant \"" << result->mURI << "\" added." << LL_ENDL;
+ }
+
+ return result;
+}
+
+bool LLVivoxVoiceClient::participantState::updateMuteState()
+{
+ bool result = false;
+
+
+
+ bool isMuted = LLMuteList::getInstance()->isMuted(mAvatarID, LLMute::flagVoiceChat);
+ if(mOnMuteList != isMuted)
+ {
+ mOnMuteList = isMuted;
+ mVolumeDirty = true;
+ result = true;
+ }
+ return result;
+}
+
+bool LLVivoxVoiceClient::participantState::isAvatar()
+{
+ return mAvatarIDValid;
+}
+
+void LLVivoxVoiceClient::sessionState::removeParticipant(LLVivoxVoiceClient::participantState *participant)
+{
+ if(participant)
+ {
+ participantMap::iterator iter = mParticipantsByURI.find(participant->mURI);
+ participantUUIDMap::iterator iter2 = mParticipantsByUUID.find(participant->mAvatarID);
+
+ LL_DEBUGS("Voice") << "participant \"" << participant->mURI << "\" (" << participant->mAvatarID << ") removed." << LL_ENDL;
+
+ if(iter == mParticipantsByURI.end())
+ {
+ LL_ERRS("Voice") << "Internal error: participant " << participant->mURI << " not in URI map" << LL_ENDL;
+ }
+ else if(iter2 == mParticipantsByUUID.end())
+ {
+ LL_ERRS("Voice") << "Internal error: participant ID " << participant->mAvatarID << " not in UUID map" << LL_ENDL;
+ }
+ else if(iter->second != iter2->second)
+ {
+ LL_ERRS("Voice") << "Internal error: participant mismatch!" << LL_ENDL;
+ }
+ else
+ {
+ mParticipantsByURI.erase(iter);
+ mParticipantsByUUID.erase(iter2);
+
+ delete participant;
+ mParticipantsChanged = true;
+ }
+ }
+}
+
+void LLVivoxVoiceClient::sessionState::removeAllParticipants()
+{
+ LL_DEBUGS("Voice") << "called" << LL_ENDL;
+
+ while(!mParticipantsByURI.empty())
+ {
+ removeParticipant(mParticipantsByURI.begin()->second);
+ }
+
+ if(!mParticipantsByUUID.empty())
+ {
+ LL_ERRS("Voice") << "Internal error: empty URI map, non-empty UUID map" << LL_ENDL;
+ }
+}
+
+void LLVivoxVoiceClient::getParticipantList(std::set<LLUUID> &participants)
+{
+ if(mAudioSession)
+ {
+ for(participantUUIDMap::iterator iter = mAudioSession->mParticipantsByUUID.begin();
+ iter != mAudioSession->mParticipantsByUUID.end();
+ iter++)
+ {
+ participants.insert(iter->first);
+ }
+ }
+}
+
+bool LLVivoxVoiceClient::isParticipant(const LLUUID &speaker_id)
+{
+ if(mAudioSession)
+ {
+ return (mAudioSession->mParticipantsByUUID.find(speaker_id) != mAudioSession->mParticipantsByUUID.end());
+ }
+ return false;
+}
+
+
+LLVivoxVoiceClient::participantState *LLVivoxVoiceClient::sessionState::findParticipant(const std::string &uri)
+{
+ participantState *result = NULL;
+
+ participantMap::iterator iter = mParticipantsByURI.find(uri);
+
+ if(iter == mParticipantsByURI.end())
+ {
+ if(!mAlternateSIPURI.empty() && (uri == mAlternateSIPURI))
+ {
+ // This is a p2p session (probably with the SLIM client) with an alternate URI for the other participant.
+ // Look up the other URI
+ iter = mParticipantsByURI.find(mSIPURI);
+ }
+ }
+
+ if(iter != mParticipantsByURI.end())
+ {
+ result = iter->second;
+ }
+
+ return result;
+}
+
+LLVivoxVoiceClient::participantState* LLVivoxVoiceClient::sessionState::findParticipantByID(const LLUUID& id)
+{
+ participantState * result = NULL;
+ participantUUIDMap::iterator iter = mParticipantsByUUID.find(id);
+
+ if(iter != mParticipantsByUUID.end())
+ {
+ result = iter->second;
+ }
+
+ return result;
+}
+
+LLVivoxVoiceClient::participantState* LLVivoxVoiceClient::findParticipantByID(const LLUUID& id)
+{
+ participantState * result = NULL;
+
+ if(mAudioSession)
+ {
+ result = mAudioSession->findParticipantByID(id);
+ }
+
+ return result;
+}
+
+
+void LLVivoxVoiceClient::parcelChanged()
+{
+ if(getState() >= stateNoChannel)
+ {
+ // If the user is logged in, start a channel lookup.
+ LL_DEBUGS("Voice") << "sending ParcelVoiceInfoRequest (" << mCurrentRegionName << ", " << mCurrentParcelLocalID << ")" << LL_ENDL;
+
+ std::string url = gAgent.getRegion()->getCapability("ParcelVoiceInfoRequest");
+ LLSD data;
+ LLHTTPClient::post(
+ url,
+ data,
+ new LLVivoxVoiceClientCapResponder);
+ }
+ else
+ {
+ // The transition to stateNoChannel needs to kick this off again.
+ LL_INFOS("Voice") << "not logged in yet, deferring" << LL_ENDL;
+ }
+}
+
+void LLVivoxVoiceClient::switchChannel(
+ std::string uri,
+ bool spatial,
+ bool no_reconnect,
+ bool is_p2p,
+ std::string hash)
+{
+ bool needsSwitch = false;
+
+ LL_DEBUGS("Voice")
+ << "called in state " << state2string(getState())
+ << " with uri \"" << uri << "\""
+ << (spatial?", spatial is true":", spatial is false")
+ << LL_ENDL;
+
+ switch(getState())
+ {
+ case stateJoinSessionFailed:
+ case stateJoinSessionFailedWaiting:
+ case stateNoChannel:
+ // Always switch to the new URI from these states.
+ needsSwitch = true;
+ break;
+
+ default:
+ if(mSessionTerminateRequested)
+ {
+ // If a terminate has been requested, we need to compare against where the URI we're already headed to.
+ if(mNextAudioSession)
+ {
+ if(mNextAudioSession->mSIPURI != uri)
+ needsSwitch = true;
+ }
+ else
+ {
+ // mNextAudioSession is null -- this probably means we're on our way back to spatial.
+ if(!uri.empty())
+ {
+ // We do want to process a switch in this case.
+ needsSwitch = true;
+ }
+ }
+ }
+ else
+ {
+ // Otherwise, compare against the URI we're in now.
+ if(mAudioSession)
+ {
+ if(mAudioSession->mSIPURI != uri)
+ {
+ needsSwitch = true;
+ }
+ }
+ else
+ {
+ if(!uri.empty())
+ {
+ // mAudioSession is null -- it's not clear what case would cause this.
+ // For now, log it as a warning and see if it ever crops up.
+ LL_WARNS("Voice") << "No current audio session." << LL_ENDL;
+ }
+ }
+ }
+ break;
+ }
+
+ if(needsSwitch)
+ {
+ if(uri.empty())
+ {
+ // Leave any channel we may be in
+ LL_DEBUGS("Voice") << "leaving channel" << LL_ENDL;
+
+ sessionState *oldSession = mNextAudioSession;
+ mNextAudioSession = NULL;
+
+ // The old session may now need to be deleted.
+ reapSession(oldSession);
+
+ notifyStatusObservers(LLVoiceClientStatusObserver::STATUS_VOICE_DISABLED);
+ }
+ else
+ {
+ LL_DEBUGS("Voice") << "switching to channel " << uri << LL_ENDL;
+
+ mNextAudioSession = addSession(uri);
+ mNextAudioSession->mHash = hash;
+ mNextAudioSession->mIsSpatial = spatial;
+ mNextAudioSession->mReconnect = !no_reconnect;
+ mNextAudioSession->mIsP2P = is_p2p;
+ }
+
+ if(getState() <= stateNoChannel)
+ {
+ // We're already set up to join a channel, just needed to fill in the session URI
+ }
+ else
+ {
+ // State machine will come around and rejoin if uri/handle is not empty.
+ sessionTerminate();
+ }
+ }
+}
+
+void LLVivoxVoiceClient::joinSession(sessionState *session)
+{
+ mNextAudioSession = session;
+
+ if(getState() <= stateNoChannel)
+ {
+ // We're already set up to join a channel, just needed to fill in the session handle
+ }
+ else
+ {
+ // State machine will come around and rejoin if uri/handle is not empty.
+ sessionTerminate();
+ }
+}
+
+void LLVivoxVoiceClient::setNonSpatialChannel(
+ const std::string &uri,
+ const std::string &credentials)
+{
+ switchChannel(uri, false, false, false, credentials);
+}
+
+void LLVivoxVoiceClient::setSpatialChannel(
+ const std::string &uri,
+ const std::string &credentials)
+{
+ mSpatialSessionURI = uri;
+ mSpatialSessionCredentials = credentials;
+ mAreaVoiceDisabled = mSpatialSessionURI.empty();
+
+ LL_DEBUGS("Voice") << "got spatial channel uri: \"" << uri << "\"" << LL_ENDL;
+
+ if((mAudioSession && !(mAudioSession->mIsSpatial)) || (mNextAudioSession && !(mNextAudioSession->mIsSpatial)))
+ {
+ // User is in a non-spatial chat or joining a non-spatial chat. Don't switch channels.
+ LL_INFOS("Voice") << "in non-spatial chat, not switching channels" << LL_ENDL;
+ }
+ else
+ {
+ switchChannel(mSpatialSessionURI, true, false, false, mSpatialSessionCredentials);
+ }
+}
+
+void LLVivoxVoiceClient::callUser(const LLUUID &uuid)
+{
+ std::string userURI = sipURIFromID(uuid);
+
+ switchChannel(userURI, false, true, true);
+}
+
+LLVivoxVoiceClient::sessionState* LLVivoxVoiceClient::startUserIMSession(const LLUUID &uuid)
+{
+ // Figure out if a session with the user already exists
+ sessionState *session = findSession(uuid);
+ if(!session)
+ {
+ // No session with user, need to start one.
+ std::string uri = sipURIFromID(uuid);
+ session = addSession(uri);
+
+ llassert(session);
+ if (!session) return NULL;
+
+ session->mIsSpatial = false;
+ session->mReconnect = false;
+ session->mIsP2P = true;
+ session->mCallerID = uuid;
+ }
+
+ if(session->mHandle.empty())
+ {
+ // Session isn't active -- start it up.
+ sessionCreateSendMessage(session, false, true);
+ }
+ else
+ {
+ // Session is already active -- start up text.
+ sessionTextConnectSendMessage(session);
+ }
+
+ return session;
+}
+
+BOOL LLVivoxVoiceClient::sendTextMessage(const LLUUID& participant_id, const std::string& message)
+{
+ bool result = false;
+
+ // Attempt to locate the indicated session
+ sessionState *session = startUserIMSession(participant_id);
+ if(session)
+ {
+ // found the session, attempt to send the message
+ session->mTextMsgQueue.push(message);
+
+ // Try to send queued messages (will do nothing if the session is not open yet)
+ sendQueuedTextMessages(session);
+
+ // The message is queued, so we succeed.
+ result = true;
+ }
+ else
+ {
+ LL_DEBUGS("Voice") << "Session not found for participant ID " << participant_id << LL_ENDL;
+ }
+
+ return result;
+}
+
+void LLVivoxVoiceClient::sendQueuedTextMessages(sessionState *session)
+{
+ if(session->mTextStreamState == 1)
+ {
+ if(!session->mTextMsgQueue.empty())
+ {
+ std::ostringstream stream;
+
+ while(!session->mTextMsgQueue.empty())
+ {
+ std::string message = session->mTextMsgQueue.front();
+ session->mTextMsgQueue.pop();
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.SendMessage.1\">"
+ << "<SessionHandle>" << session->mHandle << "</SessionHandle>"
+ << "<MessageHeader>text/HTML</MessageHeader>"
+ << "<MessageBody>" << message << "</MessageBody>"
+ << "</Request>"
+ << "\n\n\n";
+ }
+ writeString(stream.str());
+ }
+ }
+ else
+ {
+ // Session isn't connected yet, defer until later.
+ }
+}
+
+void LLVivoxVoiceClient::endUserIMSession(const LLUUID &uuid)
+{
+ // Figure out if a session with the user exists
+ sessionState *session = findSession(uuid);
+ if(session)
+ {
+ // found the session
+ if(!session->mHandle.empty())
+ {
+ sessionTextDisconnectSendMessage(session);
+ }
+ }
+ else
+ {
+ LL_DEBUGS("Voice") << "Session not found for participant ID " << uuid << LL_ENDL;
+ }
+}
+bool LLVivoxVoiceClient::isValidChannel(std::string &sessionHandle)
+{
+ return(findSession(sessionHandle) != NULL);
+
+}
+bool LLVivoxVoiceClient::answerInvite(std::string &sessionHandle)
+{
+ // this is only ever used to answer incoming p2p call invites.
+
+ sessionState *session = findSession(sessionHandle);
+ if(session)
+ {
+ session->mIsSpatial = false;
+ session->mReconnect = false;
+ session->mIsP2P = true;
+
+ joinSession(session);
+ return true;
+ }
+
+ return false;
+}
+
+BOOL LLVivoxVoiceClient::isOnlineSIP(const LLUUID &id)
+{
+ bool result = false;
+ buddyListEntry *buddy = findBuddy(id);
+ if(buddy)
+ {
+ result = buddy->mOnlineSLim;
+ LL_DEBUGS("Voice") << "Buddy " << buddy->mDisplayName << " is SIP " << (result?"online":"offline") << LL_ENDL;
+ }
+
+ if(!result)
+ {
+ // This user isn't on the buddy list or doesn't show online status through the buddy list, but could be a participant in an existing session if they initiated a text IM.
+ sessionState *session = findSession(id);
+ if(session && !session->mHandle.empty())
+ {
+ if((session->mTextStreamState != streamStateUnknown) || (session->mMediaStreamState > streamStateIdle))
+ {
+ LL_DEBUGS("Voice") << "Open session with " << id << " found, returning SIP online state" << LL_ENDL;
+ // we have a p2p text session open with this user, so by definition they're online.
+ result = true;
+ }
+ }
+ }
+
+ return result;
+}
+
+bool LLVivoxVoiceClient::isVoiceWorking() const
+{
+ //Added stateSessionTerminated state to avoid problems with call in parcels with disabled voice (EXT-4758)
+ // Condition with joining spatial num was added to take into account possible problems with connection to voice
+ // server(EXT-4313). See bug descriptions and comments for MAX_NORMAL_JOINING_SPATIAL_NUM for more info.
+ return (mSpatialJoiningNum < MAX_NORMAL_JOINING_SPATIAL_NUM) && (stateLoggedIn <= mState) && (mState <= stateSessionTerminated);
+}
+
+// Returns true if the indicated participant in the current audio session is really an SL avatar.
+// Currently this will be false only for PSTN callers into group chats, and PSTN p2p calls.
+BOOL LLVivoxVoiceClient::isParticipantAvatar(const LLUUID &id)
+{
+ BOOL result = TRUE;
+ sessionState *session = findSession(id);
+
+ if(session != NULL)
+ {
+ // this is a p2p session with the indicated caller, or the session with the specified UUID.
+ if(session->mSynthesizedCallerID)
+ result = FALSE;
+ }
+ else
+ {
+ // Didn't find a matching session -- check the current audio session for a matching participant
+ if(mAudioSession != NULL)
+ {
+ participantState *participant = findParticipantByID(id);
+ if(participant != NULL)
+ {
+ result = participant->isAvatar();
+ }
+ }
+ }
+
+ return result;
+}
+
+// Returns true if calling back the session URI after the session has closed is possible.
+// Currently this will be false only for PSTN P2P calls.
+BOOL LLVivoxVoiceClient::isSessionCallBackPossible(const LLUUID &session_id)
+{
+ BOOL result = TRUE;
+ sessionState *session = findSession(session_id);
+
+ if(session != NULL)
+ {
+ result = session->isCallBackPossible();
+ }
+
+ return result;
+}
+
+// Returns true if the session can accepte text IM's.
+// Currently this will be false only for PSTN P2P calls.
+BOOL LLVivoxVoiceClient::isSessionTextIMPossible(const LLUUID &session_id)
+{
+ bool result = TRUE;
+ sessionState *session = findSession(session_id);
+
+ if(session != NULL)
+ {
+ result = session->isTextIMPossible();
+ }
+
+ return result;
+}
+
+
+void LLVivoxVoiceClient::declineInvite(std::string &sessionHandle)
+{
+ sessionState *session = findSession(sessionHandle);
+ if(session)
+ {
+ sessionMediaDisconnectSendMessage(session);
+ }
+}
+
+void LLVivoxVoiceClient::leaveNonSpatialChannel()
+{
+ LL_DEBUGS("Voice")
+ << "called in state " << state2string(getState())
+ << LL_ENDL;
+
+ // Make sure we don't rejoin the current session.
+ sessionState *oldNextSession = mNextAudioSession;
+ mNextAudioSession = NULL;
+
+ // Most likely this will still be the current session at this point, but check it anyway.
+ reapSession(oldNextSession);
+
+ verifySessionState();
+
+ sessionTerminate();
+}
+
+std::string LLVivoxVoiceClient::getCurrentChannel()
+{
+ std::string result;
+
+ if((getState() == stateRunning) && !mSessionTerminateRequested)
+ {
+ result = getAudioSessionURI();
+ }
+
+ return result;
+}
+
+bool LLVivoxVoiceClient::inProximalChannel()
+{
+ bool result = false;
+
+ if((getState() == stateRunning) && !mSessionTerminateRequested)
+ {
+ result = inSpatialChannel();
+ }
+
+ return result;
+}
+
+std::string LLVivoxVoiceClient::sipURIFromID(const LLUUID &id)
+{
+ std::string result;
+ result = "sip:";
+ result += nameFromID(id);
+ result += "@";
+ result += mVoiceSIPURIHostName;
+
+ return result;
+}
+
+std::string LLVivoxVoiceClient::sipURIFromAvatar(LLVOAvatar *avatar)
+{
+ std::string result;
+ if(avatar)
+ {
+ result = "sip:";
+ result += nameFromID(avatar->getID());
+ result += "@";
+ result += mVoiceSIPURIHostName;
+ }
+
+ return result;
+}
+
+std::string LLVivoxVoiceClient::nameFromAvatar(LLVOAvatar *avatar)
+{
+ std::string result;
+ if(avatar)
+ {
+ result = nameFromID(avatar->getID());
+ }
+ return result;
+}
+
+std::string LLVivoxVoiceClient::nameFromID(const LLUUID &uuid)
+{
+ std::string result;
+
+ if (uuid.isNull()) {
+ //VIVOX, the uuid emtpy look for the mURIString and return that instead.
+ //result.assign(uuid.mURIStringName);
+ LLStringUtil::replaceChar(result, '_', ' ');
+ return result;
+ }
+ // Prepending this apparently prevents conflicts with reserved names inside the vivox code.
+ result = "x";
+
+ // Base64 encode and replace the pieces of base64 that are less compatible
+ // with e-mail local-parts.
+ // See RFC-4648 "Base 64 Encoding with URL and Filename Safe Alphabet"
+ result += LLBase64::encode(uuid.mData, UUID_BYTES);
+ LLStringUtil::replaceChar(result, '+', '-');
+ LLStringUtil::replaceChar(result, '/', '_');
+
+ // If you need to transform a GUID to this form on the Mac OS X command line, this will do so:
+ // echo -n x && (echo e669132a-6c43-4ee1-a78d-6c82fff59f32 |xxd -r -p |openssl base64|tr '/+' '_-')
+
+ // The reverse transform can be done with:
+ // echo 'x5mkTKmxDTuGnjWyC__WfMg==' |cut -b 2- -|tr '_-' '/+' |openssl base64 -d|xxd -p
+
+ return result;
+}
+
+bool LLVivoxVoiceClient::IDFromName(const std::string inName, LLUUID &uuid)
+{
+ bool result = false;
+
+ // SLIM SDK: The "name" may actually be a SIP URI such as: "sip:xFnPP04IpREWNkuw1cOXlhw==@bhr.vivox.com"
+ // If it is, convert to a bare name before doing the transform.
+ std::string name = nameFromsipURI(inName);
+
+ // Doesn't look like a SIP URI, assume it's an actual name.
+ if(name.empty())
+ name = inName;
+
+ // This will only work if the name is of the proper form.
+ // As an example, the account name for Monroe Linden (UUID 1673cfd3-8229-4445-8d92-ec3570e5e587) is:
+ // "xFnPP04IpREWNkuw1cOXlhw=="
+
+ if((name.size() == 25) && (name[0] == 'x') && (name[23] == '=') && (name[24] == '='))
+ {
+ // The name appears to have the right form.
+
+ // Reverse the transforms done by nameFromID
+ std::string temp = name;
+ LLStringUtil::replaceChar(temp, '-', '+');
+ LLStringUtil::replaceChar(temp, '_', '/');
+
+ U8 rawuuid[UUID_BYTES + 1];
+ int len = apr_base64_decode_binary(rawuuid, temp.c_str() + 1);
+ if(len == UUID_BYTES)
+ {
+ // The decode succeeded. Stuff the bits into the result's UUID
+ memcpy(uuid.mData, rawuuid, UUID_BYTES);
+ result = true;
+ }
+ }
+
+ if(!result)
+ {
+ // VIVOX: not a standard account name, just copy the URI name mURIString field
+ // and hope for the best. bpj
+ uuid.setNull(); // VIVOX, set the uuid field to nulls
+ }
+
+ return result;
+}
+
+std::string LLVivoxVoiceClient::displayNameFromAvatar(LLVOAvatar *avatar)
+{
+ return avatar->getFullname();
+}
+
+std::string LLVivoxVoiceClient::sipURIFromName(std::string &name)
+{
+ std::string result;
+ result = "sip:";
+ result += name;
+ result += "@";
+ result += mVoiceSIPURIHostName;
+
+// LLStringUtil::toLower(result);
+
+ return result;
+}
+
+std::string LLVivoxVoiceClient::nameFromsipURI(const std::string &uri)
+{
+ std::string result;
+
+ std::string::size_type sipOffset, atOffset;
+ sipOffset = uri.find("sip:");
+ atOffset = uri.find("@");
+ if((sipOffset != std::string::npos) && (atOffset != std::string::npos))
+ {
+ result = uri.substr(sipOffset + 4, atOffset - (sipOffset + 4));
+ }
+
+ return result;
+}
+
+bool LLVivoxVoiceClient::inSpatialChannel(void)
+{
+ bool result = false;
+
+ if(mAudioSession)
+ result = mAudioSession->mIsSpatial;
+
+ return result;
+}
+
+std::string LLVivoxVoiceClient::getAudioSessionURI()
+{
+ std::string result;
+
+ if(mAudioSession)
+ result = mAudioSession->mSIPURI;
+
+ return result;
+}
+
+std::string LLVivoxVoiceClient::getAudioSessionHandle()
+{
+ std::string result;
+
+ if(mAudioSession)
+ result = mAudioSession->mHandle;
+
+ return result;
+}
+
+
+/////////////////////////////
+// Sending updates of current state
+
+void LLVivoxVoiceClient::enforceTether(void)
+{
+ LLVector3d tethered = mCameraRequestedPosition;
+
+ // constrain 'tethered' to within 50m of mAvatarPosition.
+ {
+ F32 max_dist = 50.0f;
+ LLVector3d camera_offset = mCameraRequestedPosition - mAvatarPosition;
+ F32 camera_distance = (F32)camera_offset.magVec();
+ if(camera_distance > max_dist)
+ {
+ tethered = mAvatarPosition +
+ (max_dist / camera_distance) * camera_offset;
+ }
+ }
+
+ if(dist_vec(mCameraPosition, tethered) > 0.1)
+ {
+ mCameraPosition = tethered;
+ mSpatialCoordsDirty = true;
+ }
+}
+
+void LLVivoxVoiceClient::updatePosition(void)
+{
+
+ LLViewerRegion *region = gAgent.getRegion();
+ if(region && isAgentAvatarValid())
+ {
+ LLMatrix3 rot;
+ LLVector3d pos;
+
+ // TODO: If camera and avatar velocity are actually used by the voice system, we could compute them here...
+ // They're currently always set to zero.
+
+ // Send the current camera position to the voice code
+ rot.setRows(LLViewerCamera::getInstance()->getAtAxis(), LLViewerCamera::getInstance()->getLeftAxis (), LLViewerCamera::getInstance()->getUpAxis());
+ pos = gAgent.getRegion()->getPosGlobalFromRegion(LLViewerCamera::getInstance()->getOrigin());
+
+ LLVivoxVoiceClient::getInstance()->setCameraPosition(
+ pos, // position
+ LLVector3::zero, // velocity
+ rot); // rotation matrix
+
+ // Send the current avatar position to the voice code
+ rot = gAgentAvatarp->getRootJoint()->getWorldRotation().getMatrix3();
+ pos = gAgentAvatarp->getPositionGlobal();
+
+ // TODO: Can we get the head offset from outside the LLVOAvatar?
+ // pos += LLVector3d(mHeadOffset);
+ pos += LLVector3d(0.f, 0.f, 1.f);
+
+ LLVivoxVoiceClient::getInstance()->setAvatarPosition(
+ pos, // position
+ LLVector3::zero, // velocity
+ rot); // rotation matrix
+ }
+}
+
+void LLVivoxVoiceClient::setCameraPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot)
+{
+ mCameraRequestedPosition = position;
+
+ if(mCameraVelocity != velocity)
+ {
+ mCameraVelocity = velocity;
+ mSpatialCoordsDirty = true;
+ }
+
+ if(mCameraRot != rot)
+ {
+ mCameraRot = rot;
+ mSpatialCoordsDirty = true;
+ }
+}
+
+void LLVivoxVoiceClient::setAvatarPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot)
+{
+ if(dist_vec(mAvatarPosition, position) > 0.1)
+ {
+ mAvatarPosition = position;
+ mSpatialCoordsDirty = true;
+ }
+
+ if(mAvatarVelocity != velocity)
+ {
+ mAvatarVelocity = velocity;
+ mSpatialCoordsDirty = true;
+ }
+
+ if(mAvatarRot != rot)
+ {
+ mAvatarRot = rot;
+ mSpatialCoordsDirty = true;
+ }
+}
+
+bool LLVivoxVoiceClient::channelFromRegion(LLViewerRegion *region, std::string &name)
+{
+ bool result = false;
+
+ if(region)
+ {
+ name = region->getName();
+ }
+
+ if(!name.empty())
+ result = true;
+
+ return result;
+}
+
+void LLVivoxVoiceClient::leaveChannel(void)
+{
+ if(getState() == stateRunning)
+ {
+ LL_DEBUGS("Voice") << "leaving channel for teleport/logout" << LL_ENDL;
+ mChannelName.clear();
+ sessionTerminate();
+ }
+}
+
+void LLVivoxVoiceClient::setMuteMic(bool muted)
+{
+ mMuteMic = muted;
+}
+
+void LLVivoxVoiceClient::setUserPTTState(bool ptt)
+{
+ mUserPTTState = ptt;
+}
+
+bool LLVivoxVoiceClient::getUserPTTState()
+{
+ return mUserPTTState;
+}
+
+void LLVivoxVoiceClient::inputUserControlState(bool down)
+{
+ if(mPTTIsToggle)
+ {
+ if(down) // toggle open-mic state on 'down'
+ {
+ toggleUserPTTState();
+ }
+ }
+ else // set open-mic state as an absolute
+ {
+ setUserPTTState(down);
+ }
+}
+
+
+void LLVivoxVoiceClient::toggleUserPTTState(void)
+{
+ mUserPTTState = !mUserPTTState;
+}
+
+void LLVivoxVoiceClient::setVoiceEnabled(bool enabled)
+{
+ if (enabled != mVoiceEnabled)
+ {
+ // TODO: Refactor this so we don't call into LLVoiceChannel, but simply
+ // use the status observer
+ mVoiceEnabled = enabled;
+ LLVoiceClientStatusObserver::EStatusType status;
+
+
+ if (enabled)
+ {
+ LLVoiceChannel::getCurrentVoiceChannel()->activate();
+ status = LLVoiceClientStatusObserver::STATUS_VOICE_ENABLED;
+ }
+ else
+ {
+ // Turning voice off looses your current channel -- this makes sure the UI isn't out of sync when you re-enable it.
+ LLVoiceChannel::getCurrentVoiceChannel()->deactivate();
+ status = LLVoiceClientStatusObserver::STATUS_VOICE_DISABLED;
+ }
+ notifyStatusObservers(status);
+ }
+}
+
+bool LLVivoxVoiceClient::voiceEnabled()
+{
+ return gSavedSettings.getBOOL("EnableVoiceChat") && !gSavedSettings.getBOOL("CmdLineDisableVoice");
+}
+
+void LLVivoxVoiceClient::setLipSyncEnabled(BOOL enabled)
+{
+ mLipSyncEnabled = enabled;
+}
+
+BOOL LLVivoxVoiceClient::lipSyncEnabled()
+{
+
+ if ( mVoiceEnabled && stateDisabled != getState() )
+ {
+ return mLipSyncEnabled;
+ }
+ else
+ {
+ return FALSE;
+ }
+}
+
+void LLVivoxVoiceClient::setUsePTT(bool usePTT)
+{
+ if(usePTT && !mUsePTT)
+ {
+ // When the user turns on PTT, reset the current state.
+ mUserPTTState = false;
+ }
+ mUsePTT = usePTT;
+}
+
+void LLVivoxVoiceClient::setPTTIsToggle(bool PTTIsToggle)
+{
+ if(!PTTIsToggle && mPTTIsToggle)
+ {
+ // When the user turns off toggle, reset the current state.
+ mUserPTTState = false;
+ }
+
+ mPTTIsToggle = PTTIsToggle;
+}
+
+bool LLVivoxVoiceClient::getPTTIsToggle()
+{
+ return mPTTIsToggle;
+}
+
+void LLVivoxVoiceClient::setPTTKey(std::string &key)
+{
+ if(key == "MiddleMouse")
+ {
+ mPTTIsMiddleMouse = true;
+ }
+ else
+ {
+ mPTTIsMiddleMouse = false;
+ if(!LLKeyboard::keyFromString(key, &mPTTKey))
+ {
+ // If the call failed, don't match any key.
+ key = KEY_NONE;
+ }
+ }
+}
+
+void LLVivoxVoiceClient::setEarLocation(S32 loc)
+{
+ if(mEarLocation != loc)
+ {
+ LL_DEBUGS("Voice") << "Setting mEarLocation to " << loc << LL_ENDL;
+
+ mEarLocation = loc;
+ mSpatialCoordsDirty = true;
+ }
+}
+
+void LLVivoxVoiceClient::setVoiceVolume(F32 volume)
+{
+ int scaled_volume = scale_speaker_volume(volume);
+
+ if(scaled_volume != mSpeakerVolume)
+ {
+ int min_volume = scale_speaker_volume(0);
+ if((scaled_volume == min_volume) || (mSpeakerVolume == min_volume))
+ {
+ mSpeakerMuteDirty = true;
+ }
+
+ mSpeakerVolume = scaled_volume;
+ mSpeakerVolumeDirty = true;
+ }
+}
+
+void LLVivoxVoiceClient::setMicGain(F32 volume)
+{
+ int scaled_volume = scale_mic_volume(volume);
+
+ if(scaled_volume != mMicVolume)
+ {
+ mMicVolume = scaled_volume;
+ mMicVolumeDirty = true;
+ }
+}
+
+void LLVivoxVoiceClient::keyDown(KEY key, MASK mask)
+{
+ if (gKeyboard->getKeyRepeated(key))
+ {
+ // ignore auto-repeat keys
+ return;
+ }
+
+ if(!mPTTIsMiddleMouse)
+ {
+ bool down = (mPTTKey != KEY_NONE)
+ && gKeyboard->getKeyDown(mPTTKey);
+ inputUserControlState(down);
+ }
+
+
+}
+void LLVivoxVoiceClient::keyUp(KEY key, MASK mask)
+{
+ if(!mPTTIsMiddleMouse)
+ {
+ bool down = (mPTTKey != KEY_NONE)
+ && gKeyboard->getKeyDown(mPTTKey);
+ inputUserControlState(down);
+ }
+
+}
+void LLVivoxVoiceClient::middleMouseState(bool down)
+{
+ if(mPTTIsMiddleMouse)
+ {
+ if(mPTTIsMiddleMouse)
+ {
+ inputUserControlState(down);
+ }
+ }
+}
+
+/////////////////////////////
+// Accessors for data related to nearby speakers
+BOOL LLVivoxVoiceClient::getVoiceEnabled(const LLUUID& id)
+{
+ BOOL result = FALSE;
+ participantState *participant = findParticipantByID(id);
+ if(participant)
+ {
+ // I'm not sure what the semantics of this should be.
+ // For now, if we have any data about the user that came through the chat channel, assume they're voice-enabled.
+ result = TRUE;
+ }
+
+ return result;
+}
+
+std::string LLVivoxVoiceClient::getDisplayName(const LLUUID& id)
+{
+ std::string result;
+ participantState *participant = findParticipantByID(id);
+ if(participant)
+ {
+ result = participant->mDisplayName;
+ }
+
+ return result;
+}
+
+
+
+BOOL LLVivoxVoiceClient::getIsSpeaking(const LLUUID& id)
+{
+ BOOL result = FALSE;
+
+ participantState *participant = findParticipantByID(id);
+ if(participant)
+ {
+ if (participant->mSpeakingTimeout.getElapsedTimeF32() > SPEAKING_TIMEOUT)
+ {
+ participant->mIsSpeaking = FALSE;
+ }
+ result = participant->mIsSpeaking;
+ }
+
+ return result;
+}
+
+BOOL LLVivoxVoiceClient::getIsModeratorMuted(const LLUUID& id)
+{
+ BOOL result = FALSE;
+
+ participantState *participant = findParticipantByID(id);
+ if(participant)
+ {
+ result = participant->mIsModeratorMuted;
+ }
+
+ return result;
+}
+
+F32 LLVivoxVoiceClient::getCurrentPower(const LLUUID& id)
+{
+ F32 result = 0;
+ participantState *participant = findParticipantByID(id);
+ if(participant)
+ {
+ result = participant->mPower;
+ }
+
+ return result;
+}
+
+
+
+BOOL LLVivoxVoiceClient::getUsingPTT(const LLUUID& id)
+{
+ BOOL result = FALSE;
+
+ participantState *participant = findParticipantByID(id);
+ if(participant)
+ {
+ // I'm not sure what the semantics of this should be.
+ // Does "using PTT" mean they're configured with a push-to-talk button?
+ // For now, we know there's no PTT mechanism in place, so nobody is using it.
+ }
+
+ return result;
+}
+
+BOOL LLVivoxVoiceClient::getOnMuteList(const LLUUID& id)
+{
+ BOOL result = FALSE;
+
+ participantState *participant = findParticipantByID(id);
+ if(participant)
+ {
+ result = participant->mOnMuteList;
+ }
+
+ return result;
+}
+
+// External accessors.
+F32 LLVivoxVoiceClient::getUserVolume(const LLUUID& id)
+{
+ // Minimum volume will be returned for users with voice disabled
+ F32 result = LLVoiceClient::VOLUME_MIN;
+
+ participantState *participant = findParticipantByID(id);
+ if(participant)
+ {
+ result = participant->mVolume;
+
+ // Enable this when debugging voice slider issues. It's way to spammy even for debug-level logging.
+ // LL_DEBUGS("Voice") << "mVolume = " << result << " for " << id << LL_ENDL;
+ }
+
+ return result;
+}
+
+void LLVivoxVoiceClient::setUserVolume(const LLUUID& id, F32 volume)
+{
+ if(mAudioSession)
+ {
+ participantState *participant = findParticipantByID(id);
+ if (participant && !participant->mIsSelf)
+ {
+ if (!is_approx_equal(volume, LLVoiceClient::VOLUME_DEFAULT))
+ {
+ // Store this volume setting for future sessions if it has been
+ // changed from the default
+ LLSpeakerVolumeStorage::getInstance()->storeSpeakerVolume(id, volume);
+ }
+ else
+ {
+ // Remove stored volume setting if it is returned to the default
+ LLSpeakerVolumeStorage::getInstance()->removeSpeakerVolume(id);
+ }
+
+ participant->mVolume = llclamp(volume, LLVoiceClient::VOLUME_MIN, LLVoiceClient::VOLUME_MAX);
+ participant->mVolumeDirty = true;
+ mAudioSession->mVolumeDirty = true;
+ }
+ }
+}
+
+std::string LLVivoxVoiceClient::getGroupID(const LLUUID& id)
+{
+ std::string result;
+
+ participantState *participant = findParticipantByID(id);
+ if(participant)
+ {
+ result = participant->mGroupID;
+ }
+
+ return result;
+}
+
+BOOL LLVivoxVoiceClient::getAreaVoiceDisabled()
+{
+ return mAreaVoiceDisabled;
+}
+
+void LLVivoxVoiceClient::recordingLoopStart(int seconds, int deltaFramesPerControlFrame)
+{
+// LL_DEBUGS("Voice") << "sending SessionGroup.ControlRecording (Start)" << LL_ENDL;
+
+ if(!mMainSessionGroupHandle.empty())
+ {
+ std::ostringstream stream;
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"SessionGroup.ControlRecording.1\">"
+ << "<SessionGroupHandle>" << mMainSessionGroupHandle << "</SessionGroupHandle>"
+ << "<RecordingControlType>Start</RecordingControlType>"
+ << "<DeltaFramesPerControlFrame>" << deltaFramesPerControlFrame << "</DeltaFramesPerControlFrame>"
+ << "<Filename>" << "" << "</Filename>"
+ << "<EnableAudioRecordingEvents>false</EnableAudioRecordingEvents>"
+ << "<LoopModeDurationSeconds>" << seconds << "</LoopModeDurationSeconds>"
+ << "</Request>\n\n\n";
+
+
+ writeString(stream.str());
+ }
+}
+
+void LLVivoxVoiceClient::recordingLoopSave(const std::string& filename)
+{
+// LL_DEBUGS("Voice") << "sending SessionGroup.ControlRecording (Flush)" << LL_ENDL;
+
+ if(mAudioSession != NULL && !mAudioSession->mGroupHandle.empty())
+ {
+ std::ostringstream stream;
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"SessionGroup.ControlRecording.1\">"
+ << "<SessionGroupHandle>" << mMainSessionGroupHandle << "</SessionGroupHandle>"
+ << "<RecordingControlType>Flush</RecordingControlType>"
+ << "<Filename>" << filename << "</Filename>"
+ << "</Request>\n\n\n";
+
+ writeString(stream.str());
+ }
+}
+
+void LLVivoxVoiceClient::recordingStop()
+{
+// LL_DEBUGS("Voice") << "sending SessionGroup.ControlRecording (Stop)" << LL_ENDL;
+
+ if(mAudioSession != NULL && !mAudioSession->mGroupHandle.empty())
+ {
+ std::ostringstream stream;
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"SessionGroup.ControlRecording.1\">"
+ << "<SessionGroupHandle>" << mMainSessionGroupHandle << "</SessionGroupHandle>"
+ << "<RecordingControlType>Stop</RecordingControlType>"
+ << "</Request>\n\n\n";
+
+ writeString(stream.str());
+ }
+}
+
+void LLVivoxVoiceClient::filePlaybackStart(const std::string& filename)
+{
+// LL_DEBUGS("Voice") << "sending SessionGroup.ControlPlayback (Start)" << LL_ENDL;
+
+ if(mAudioSession != NULL && !mAudioSession->mGroupHandle.empty())
+ {
+ std::ostringstream stream;
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"SessionGroup.ControlPlayback.1\">"
+ << "<SessionGroupHandle>" << mMainSessionGroupHandle << "</SessionGroupHandle>"
+ << "<RecordingControlType>Start</RecordingControlType>"
+ << "<Filename>" << filename << "</Filename>"
+ << "</Request>\n\n\n";
+
+ writeString(stream.str());
+ }
+}
+
+void LLVivoxVoiceClient::filePlaybackStop()
+{
+// LL_DEBUGS("Voice") << "sending SessionGroup.ControlPlayback (Stop)" << LL_ENDL;
+
+ if(mAudioSession != NULL && !mAudioSession->mGroupHandle.empty())
+ {
+ std::ostringstream stream;
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"SessionGroup.ControlPlayback.1\">"
+ << "<SessionGroupHandle>" << mMainSessionGroupHandle << "</SessionGroupHandle>"
+ << "<RecordingControlType>Stop</RecordingControlType>"
+ << "</Request>\n\n\n";
+
+ writeString(stream.str());
+ }
+}
+
+void LLVivoxVoiceClient::filePlaybackSetPaused(bool paused)
+{
+ // TODO: Implement once Vivox gives me a sample
+}
+
+void LLVivoxVoiceClient::filePlaybackSetMode(bool vox, float speed)
+{
+ // TODO: Implement once Vivox gives me a sample
+}
+
+LLVivoxVoiceClient::sessionState::sessionState() :
+ mErrorStatusCode(0),
+ mMediaStreamState(streamStateUnknown),
+ mTextStreamState(streamStateUnknown),
+ mCreateInProgress(false),
+ mMediaConnectInProgress(false),
+ mVoiceInvitePending(false),
+ mTextInvitePending(false),
+ mSynthesizedCallerID(false),
+ mIsChannel(false),
+ mIsSpatial(false),
+ mIsP2P(false),
+ mIncoming(false),
+ mVoiceEnabled(false),
+ mReconnect(false),
+ mVolumeDirty(false),
+ mMuteDirty(false),
+ mParticipantsChanged(false)
+{
+}
+
+LLVivoxVoiceClient::sessionState::~sessionState()
+{
+ removeAllParticipants();
+}
+
+bool LLVivoxVoiceClient::sessionState::isCallBackPossible()
+{
+ // This may change to be explicitly specified by vivox in the future...
+ // Currently, only PSTN P2P calls cannot be returned.
+ // Conveniently, this is also the only case where we synthesize a caller UUID.
+ return !mSynthesizedCallerID;
+}
+
+bool LLVivoxVoiceClient::sessionState::isTextIMPossible()
+{
+ // This may change to be explicitly specified by vivox in the future...
+ return !mSynthesizedCallerID;
+}
+
+
+LLVivoxVoiceClient::sessionIterator LLVivoxVoiceClient::sessionsBegin(void)
+{
+ return mSessions.begin();
+}
+
+LLVivoxVoiceClient::sessionIterator LLVivoxVoiceClient::sessionsEnd(void)
+{
+ return mSessions.end();
+}
+
+
+LLVivoxVoiceClient::sessionState *LLVivoxVoiceClient::findSession(const std::string &handle)
+{
+ sessionState *result = NULL;
+ sessionMap::iterator iter = mSessionsByHandle.find(handle);
+ if(iter != mSessionsByHandle.end())
+ {
+ result = iter->second;
+ }
+
+ return result;
+}
+
+LLVivoxVoiceClient::sessionState *LLVivoxVoiceClient::findSessionBeingCreatedByURI(const std::string &uri)
+{
+ sessionState *result = NULL;
+ for(sessionIterator iter = sessionsBegin(); iter != sessionsEnd(); iter++)
+ {
+ sessionState *session = *iter;
+ if(session->mCreateInProgress && (session->mSIPURI == uri))
+ {
+ result = session;
+ break;
+ }
+ }
+
+ return result;
+}
+
+LLVivoxVoiceClient::sessionState *LLVivoxVoiceClient::findSession(const LLUUID &participant_id)
+{
+ sessionState *result = NULL;
+
+ for(sessionIterator iter = sessionsBegin(); iter != sessionsEnd(); iter++)
+ {
+ sessionState *session = *iter;
+ if((session->mCallerID == participant_id) || (session->mIMSessionID == participant_id))
+ {
+ result = session;
+ break;
+ }
+ }
+
+ return result;
+}
+
+LLVivoxVoiceClient::sessionState *LLVivoxVoiceClient::addSession(const std::string &uri, const std::string &handle)
+{
+ sessionState *result = NULL;
+
+ if(handle.empty())
+ {
+ // No handle supplied.
+ // Check whether there's already a session with this URI
+ for(sessionIterator iter = sessionsBegin(); iter != sessionsEnd(); iter++)
+ {
+ sessionState *s = *iter;
+ if((s->mSIPURI == uri) || (s->mAlternateSIPURI == uri))
+ {
+ // TODO: I need to think about this logic... it's possible that this case should raise an internal error.
+ result = s;
+ break;
+ }
+ }
+ }
+ else // (!handle.empty())
+ {
+ // Check for an existing session with this handle
+ sessionMap::iterator iter = mSessionsByHandle.find(handle);
+
+ if(iter != mSessionsByHandle.end())
+ {
+ result = iter->second;
+ }
+ }
+
+ if(!result)
+ {
+ // No existing session found.
+
+ LL_DEBUGS("Voice") << "adding new session: handle " << handle << " URI " << uri << LL_ENDL;
+ result = new sessionState();
+ result->mSIPURI = uri;
+ result->mHandle = handle;
+
+ if (LLVoiceClient::instance().getVoiceEffectEnabled())
+ {
+ result->mVoiceFontID = LLVoiceClient::instance().getVoiceEffectDefault();
+ }
+
+ mSessions.insert(result);
+
+ if(!result->mHandle.empty())
+ {
+ mSessionsByHandle.insert(sessionMap::value_type(result->mHandle, result));
+ }
+ }
+ else
+ {
+ // Found an existing session
+
+ if(uri != result->mSIPURI)
+ {
+ // TODO: Should this be an internal error?
+ LL_DEBUGS("Voice") << "changing uri from " << result->mSIPURI << " to " << uri << LL_ENDL;
+ setSessionURI(result, uri);
+ }
+
+ if(handle != result->mHandle)
+ {
+ if(handle.empty())
+ {
+ // There's at least one race condition where where addSession was clearing an existing session handle, which caused things to break.
+ LL_DEBUGS("Voice") << "NOT clearing handle " << result->mHandle << LL_ENDL;
+ }
+ else
+ {
+ // TODO: Should this be an internal error?
+ LL_DEBUGS("Voice") << "changing handle from " << result->mHandle << " to " << handle << LL_ENDL;
+ setSessionHandle(result, handle);
+ }
+ }
+
+ LL_DEBUGS("Voice") << "returning existing session: handle " << handle << " URI " << uri << LL_ENDL;
+ }
+
+ verifySessionState();
+
+ return result;
+}
+
+void LLVivoxVoiceClient::setSessionHandle(sessionState *session, const std::string &handle)
+{
+ // Have to remove the session from the handle-indexed map before changing the handle, or things will break badly.
+
+ if(!session->mHandle.empty())
+ {
+ // Remove session from the map if it should have been there.
+ sessionMap::iterator iter = mSessionsByHandle.find(session->mHandle);
+ if(iter != mSessionsByHandle.end())
+ {
+ if(iter->second != session)
+ {
+ LL_ERRS("Voice") << "Internal error: session mismatch!" << LL_ENDL;
+ }
+
+ mSessionsByHandle.erase(iter);
+ }
+ else
+ {
+ LL_ERRS("Voice") << "Internal error: session handle not found in map!" << LL_ENDL;
+ }
+ }
+
+ session->mHandle = handle;
+
+ if(!handle.empty())
+ {
+ mSessionsByHandle.insert(sessionMap::value_type(session->mHandle, session));
+ }
+
+ verifySessionState();
+}
+
+void LLVivoxVoiceClient::setSessionURI(sessionState *session, const std::string &uri)
+{
+ // There used to be a map of session URIs to sessions, which made this complex....
+ session->mSIPURI = uri;
+
+ verifySessionState();
+}
+
+void LLVivoxVoiceClient::deleteSession(sessionState *session)
+{
+ // Remove the session from the handle map
+ if(!session->mHandle.empty())
+ {
+ sessionMap::iterator iter = mSessionsByHandle.find(session->mHandle);
+ if(iter != mSessionsByHandle.end())
+ {
+ if(iter->second != session)
+ {
+ LL_ERRS("Voice") << "Internal error: session mismatch" << LL_ENDL;
+ }
+ mSessionsByHandle.erase(iter);
+ }
+ }
+
+ // Remove the session from the URI map
+ mSessions.erase(session);
+
+ // At this point, the session should be unhooked from all lists and all state should be consistent.
+ verifySessionState();
+
+ // If this is the current audio session, clean up the pointer which will soon be dangling.
+ if(mAudioSession == session)
+ {
+ mAudioSession = NULL;
+ mAudioSessionChanged = true;
+ }
+
+ // ditto for the next audio session
+ if(mNextAudioSession == session)
+ {
+ mNextAudioSession = NULL;
+ }
+
+ // delete the session
+ delete session;
+}
+
+void LLVivoxVoiceClient::deleteAllSessions()
+{
+ LL_DEBUGS("Voice") << "called" << LL_ENDL;
+
+ while(!mSessions.empty())
+ {
+ deleteSession(*(sessionsBegin()));
+ }
+
+ if(!mSessionsByHandle.empty())
+ {
+ LL_ERRS("Voice") << "Internal error: empty session map, non-empty handle map" << LL_ENDL;
+ }
+}
+
+void LLVivoxVoiceClient::verifySessionState(void)
+{
+ // This is mostly intended for debugging problems with session state management.
+ LL_DEBUGS("Voice") << "Total session count: " << mSessions.size() << " , session handle map size: " << mSessionsByHandle.size() << LL_ENDL;
+
+ for(sessionIterator iter = sessionsBegin(); iter != sessionsEnd(); iter++)
+ {
+ sessionState *session = *iter;
+
+ LL_DEBUGS("Voice") << "session " << session << ": handle " << session->mHandle << ", URI " << session->mSIPURI << LL_ENDL;
+
+ if(!session->mHandle.empty())
+ {
+ // every session with a non-empty handle needs to be in the handle map
+ sessionMap::iterator i2 = mSessionsByHandle.find(session->mHandle);
+ if(i2 == mSessionsByHandle.end())
+ {
+ LL_ERRS("Voice") << "internal error (handle " << session->mHandle << " not found in session map)" << LL_ENDL;
+ }
+ else
+ {
+ if(i2->second != session)
+ {
+ LL_ERRS("Voice") << "internal error (handle " << session->mHandle << " in session map points to another session)" << LL_ENDL;
+ }
+ }
+ }
+ }
+
+ // check that every entry in the handle map points to a valid session in the session set
+ for(sessionMap::iterator iter = mSessionsByHandle.begin(); iter != mSessionsByHandle.end(); iter++)
+ {
+ sessionState *session = iter->second;
+ sessionIterator i2 = mSessions.find(session);
+ if(i2 == mSessions.end())
+ {
+ LL_ERRS("Voice") << "internal error (session for handle " << session->mHandle << " not found in session map)" << LL_ENDL;
+ }
+ else
+ {
+ if(session->mHandle != (*i2)->mHandle)
+ {
+ LL_ERRS("Voice") << "internal error (session for handle " << session->mHandle << " points to session with different handle " << (*i2)->mHandle << ")" << LL_ENDL;
+ }
+ }
+ }
+}
+
+LLVivoxVoiceClient::buddyListEntry::buddyListEntry(const std::string &uri) :
+ mURI(uri)
+{
+ mOnlineSL = false;
+ mOnlineSLim = false;
+ mCanSeeMeOnline = true;
+ mHasBlockListEntry = false;
+ mHasAutoAcceptListEntry = false;
+ mNameResolved = false;
+ mInVivoxBuddies = false;
+ mInSLFriends = false;
+ mNeedsNameUpdate = false;
+}
+
+void LLVivoxVoiceClient::processBuddyListEntry(const std::string &uri, const std::string &displayName)
+{
+ buddyListEntry *buddy = addBuddy(uri, displayName);
+ buddy->mInVivoxBuddies = true;
+}
+
+LLVivoxVoiceClient::buddyListEntry *LLVivoxVoiceClient::addBuddy(const std::string &uri)
+{
+ std::string empty;
+ buddyListEntry *buddy = addBuddy(uri, empty);
+ if(buddy->mDisplayName.empty())
+ {
+ buddy->mNameResolved = false;
+ }
+ return buddy;
+}
+
+LLVivoxVoiceClient::buddyListEntry *LLVivoxVoiceClient::addBuddy(const std::string &uri, const std::string &displayName)
+{
+ buddyListEntry *result = NULL;
+ buddyListMap::iterator iter = mBuddyListMap.find(uri);
+
+ if(iter != mBuddyListMap.end())
+ {
+ // Found a matching buddy already in the map.
+ LL_DEBUGS("Voice") << "adding existing buddy " << uri << LL_ENDL;
+ result = iter->second;
+ }
+
+ if(!result)
+ {
+ // participant isn't already in one list or the other.
+ LL_DEBUGS("Voice") << "adding new buddy " << uri << LL_ENDL;
+ result = new buddyListEntry(uri);
+ result->mDisplayName = displayName;
+
+ if(IDFromName(uri, result->mUUID))
+ {
+ // Extracted UUID from name successfully.
+ }
+ else
+ {
+ LL_DEBUGS("Voice") << "Couldn't find ID for buddy " << uri << " (\"" << displayName << "\")" << LL_ENDL;
+ }
+
+ mBuddyListMap.insert(buddyListMap::value_type(result->mURI, result));
+ }
+
+ return result;
+}
+
+LLVivoxVoiceClient::buddyListEntry *LLVivoxVoiceClient::findBuddy(const std::string &uri)
+{
+ buddyListEntry *result = NULL;
+ buddyListMap::iterator iter = mBuddyListMap.find(uri);
+ if(iter != mBuddyListMap.end())
+ {
+ result = iter->second;
+ }
+
+ return result;
+}
+
+LLVivoxVoiceClient::buddyListEntry *LLVivoxVoiceClient::findBuddy(const LLUUID &id)
+{
+ buddyListEntry *result = NULL;
+ buddyListMap::iterator iter;
+
+ for(iter = mBuddyListMap.begin(); iter != mBuddyListMap.end(); iter++)
+ {
+ if(iter->second->mUUID == id)
+ {
+ result = iter->second;
+ break;
+ }
+ }
+
+ return result;
+}
+
+LLVivoxVoiceClient::buddyListEntry *LLVivoxVoiceClient::findBuddyByDisplayName(const std::string &name)
+{
+ buddyListEntry *result = NULL;
+ buddyListMap::iterator iter;
+
+ for(iter = mBuddyListMap.begin(); iter != mBuddyListMap.end(); iter++)
+ {
+ if(iter->second->mDisplayName == name)
+ {
+ result = iter->second;
+ break;
+ }
+ }
+
+ return result;
+}
+
+void LLVivoxVoiceClient::deleteBuddy(const std::string &uri)
+{
+ buddyListMap::iterator iter = mBuddyListMap.find(uri);
+ if(iter != mBuddyListMap.end())
+ {
+ LL_DEBUGS("Voice") << "deleting buddy " << uri << LL_ENDL;
+ buddyListEntry *buddy = iter->second;
+ mBuddyListMap.erase(iter);
+ delete buddy;
+ }
+ else
+ {
+ LL_DEBUGS("Voice") << "attempt to delete nonexistent buddy " << uri << LL_ENDL;
+ }
+
+}
+
+void LLVivoxVoiceClient::deleteAllBuddies(void)
+{
+ while(!mBuddyListMap.empty())
+ {
+ deleteBuddy(mBuddyListMap.begin()->first);
+ }
+
+ // Don't want to correlate with friends list when we've emptied the buddy list.
+ mBuddyListMapPopulated = false;
+
+ // Don't want to correlate with friends list when we've reset the block rules.
+ mBlockRulesListReceived = false;
+ mAutoAcceptRulesListReceived = false;
+}
+
+void LLVivoxVoiceClient::deleteAllBlockRules(void)
+{
+ // Clear the block list entry flags from all local buddy list entries
+ buddyListMap::iterator buddy_it;
+ for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end(); buddy_it++)
+ {
+ buddy_it->second->mHasBlockListEntry = false;
+ }
+}
+
+void LLVivoxVoiceClient::deleteAllAutoAcceptRules(void)
+{
+ // Clear the auto-accept list entry flags from all local buddy list entries
+ buddyListMap::iterator buddy_it;
+ for(buddy_it = mBuddyListMap.begin(); buddy_it != mBuddyListMap.end(); buddy_it++)
+ {
+ buddy_it->second->mHasAutoAcceptListEntry = false;
+ }
+}
+
+void LLVivoxVoiceClient::addBlockRule(const std::string &blockMask, const std::string &presenceOnly)
+{
+ buddyListEntry *buddy = NULL;
+
+ // blockMask is the SIP URI of a friends list entry
+ buddyListMap::iterator iter = mBuddyListMap.find(blockMask);
+ if(iter != mBuddyListMap.end())
+ {
+ LL_DEBUGS("Voice") << "block list entry for " << blockMask << LL_ENDL;
+ buddy = iter->second;
+ }
+
+ if(buddy == NULL)
+ {
+ LL_DEBUGS("Voice") << "block list entry for unknown buddy " << blockMask << LL_ENDL;
+ buddy = addBuddy(blockMask);
+ }
+
+ if(buddy != NULL)
+ {
+ buddy->mHasBlockListEntry = true;
+ }
+}
+
+void LLVivoxVoiceClient::addAutoAcceptRule(const std::string &autoAcceptMask, const std::string &autoAddAsBuddy)
+{
+ buddyListEntry *buddy = NULL;
+
+ // blockMask is the SIP URI of a friends list entry
+ buddyListMap::iterator iter = mBuddyListMap.find(autoAcceptMask);
+ if(iter != mBuddyListMap.end())
+ {
+ LL_DEBUGS("Voice") << "auto-accept list entry for " << autoAcceptMask << LL_ENDL;
+ buddy = iter->second;
+ }
+
+ if(buddy == NULL)
+ {
+ LL_DEBUGS("Voice") << "auto-accept list entry for unknown buddy " << autoAcceptMask << LL_ENDL;
+ buddy = addBuddy(autoAcceptMask);
+ }
+
+ if(buddy != NULL)
+ {
+ buddy->mHasAutoAcceptListEntry = true;
+ }
+}
+
+void LLVivoxVoiceClient::accountListBlockRulesResponse(int statusCode, const std::string &statusString)
+{
+ // Block list entries were updated via addBlockRule() during parsing. Just flag that we're done.
+ mBlockRulesListReceived = true;
+}
+
+void LLVivoxVoiceClient::accountListAutoAcceptRulesResponse(int statusCode, const std::string &statusString)
+{
+ // Block list entries were updated via addBlockRule() during parsing. Just flag that we're done.
+ mAutoAcceptRulesListReceived = true;
+}
+
+void LLVivoxVoiceClient::addObserver(LLVoiceClientParticipantObserver* observer)
+{
+ mParticipantObservers.insert(observer);
+}
+
+void LLVivoxVoiceClient::removeObserver(LLVoiceClientParticipantObserver* observer)
+{
+ mParticipantObservers.erase(observer);
+}
+
+void LLVivoxVoiceClient::notifyParticipantObservers()
+{
+ for (observer_set_t::iterator it = mParticipantObservers.begin();
+ it != mParticipantObservers.end();
+ )
+ {
+ LLVoiceClientParticipantObserver* observer = *it;
+ observer->onParticipantsChanged();
+ // In case onParticipantsChanged() deleted an entry.
+ it = mParticipantObservers.upper_bound(observer);
+ }
+}
+
+void LLVivoxVoiceClient::addObserver(LLVoiceClientStatusObserver* observer)
+{
+ mStatusObservers.insert(observer);
+}
+
+void LLVivoxVoiceClient::removeObserver(LLVoiceClientStatusObserver* observer)
+{
+ mStatusObservers.erase(observer);
+}
+
+void LLVivoxVoiceClient::notifyStatusObservers(LLVoiceClientStatusObserver::EStatusType status)
+{
+ if(mAudioSession)
+ {
+ if(status == LLVoiceClientStatusObserver::ERROR_UNKNOWN)
+ {
+ switch(mAudioSession->mErrorStatusCode)
+ {
+ case 20713: status = LLVoiceClientStatusObserver::ERROR_CHANNEL_FULL; break;
+ case 20714: status = LLVoiceClientStatusObserver::ERROR_CHANNEL_LOCKED; break;
+ case 20715:
+ //invalid channel, we may be using a set of poorly cached
+ //info
+ status = LLVoiceClientStatusObserver::ERROR_NOT_AVAILABLE;
+ break;
+ case 1009:
+ //invalid username and password
+ status = LLVoiceClientStatusObserver::ERROR_NOT_AVAILABLE;
+ break;
+ }
+
+ // Reset the error code to make sure it won't be reused later by accident.
+ mAudioSession->mErrorStatusCode = 0;
+ }
+ else if(status == LLVoiceClientStatusObserver::STATUS_LEFT_CHANNEL)
+ {
+ switch(mAudioSession->mErrorStatusCode)
+ {
+ case 404: // NOT_FOUND
+ case 480: // TEMPORARILY_UNAVAILABLE
+ case 408: // REQUEST_TIMEOUT
+ // call failed because other user was not available
+ // treat this as an error case
+ status = LLVoiceClientStatusObserver::ERROR_NOT_AVAILABLE;
+
+ // Reset the error code to make sure it won't be reused later by accident.
+ mAudioSession->mErrorStatusCode = 0;
+ break;
+ }
+ }
+ }
+
+ LL_DEBUGS("Voice")
+ << " " << LLVoiceClientStatusObserver::status2string(status)
+ << ", session URI " << getAudioSessionURI()
+ << (inSpatialChannel()?", proximal is true":", proximal is false")
+ << LL_ENDL;
+
+ for (status_observer_set_t::iterator it = mStatusObservers.begin();
+ it != mStatusObservers.end();
+ )
+ {
+ LLVoiceClientStatusObserver* observer = *it;
+ observer->onChange(status, getAudioSessionURI(), inSpatialChannel());
+ // In case onError() deleted an entry.
+ it = mStatusObservers.upper_bound(observer);
+ }
+
+}
+
+void LLVivoxVoiceClient::addObserver(LLFriendObserver* observer)
+{
+ mFriendObservers.insert(observer);
+}
+
+void LLVivoxVoiceClient::removeObserver(LLFriendObserver* observer)
+{
+ mFriendObservers.erase(observer);
+}
+
+void LLVivoxVoiceClient::notifyFriendObservers()
+{
+ for (friend_observer_set_t::iterator it = mFriendObservers.begin();
+ it != mFriendObservers.end();
+ )
+ {
+ LLFriendObserver* observer = *it;
+ it++;
+ // The only friend-related thing we notify on is online/offline transitions.
+ observer->changed(LLFriendObserver::ONLINE);
+ }
+}
+
+void LLVivoxVoiceClient::lookupName(const LLUUID &id)
+{
+ BOOL is_group = FALSE;
+ gCacheName->get(id, is_group, &LLVivoxVoiceClient::onAvatarNameLookup);
+}
+
+//static
+void LLVivoxVoiceClient::onAvatarNameLookup(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group)
+{
+ std::string name = llformat("%s %s", first.c_str(), last.c_str());
+ LLVivoxVoiceClient::getInstance()->avatarNameResolved(id, name);
+
+}
+
+void LLVivoxVoiceClient::avatarNameResolved(const LLUUID &id, const std::string &name)
+{
+ // If the avatar whose name just resolved is on our friends list, resync the friends list.
+ if(LLAvatarTracker::instance().getBuddyInfo(id) != NULL)
+ {
+ mFriendsListDirty = true;
+ }
+ // Iterate over all sessions.
+ for(sessionIterator iter = sessionsBegin(); iter != sessionsEnd(); iter++)
+ {
+ sessionState *session = *iter;
+ // Check for this user as a participant in this session
+ participantState *participant = session->findParticipantByID(id);
+ if(participant)
+ {
+ // Found -- fill in the name
+ participant->mAccountName = name;
+ // and post a "participants updated" message to listeners later.
+ session->mParticipantsChanged = true;
+ }
+
+ // Check whether this is a p2p session whose caller name just resolved
+ if(session->mCallerID == id)
+ {
+ // this session's "caller ID" just resolved. Fill in the name.
+ session->mName = name;
+ if(session->mTextInvitePending)
+ {
+ session->mTextInvitePending = false;
+
+ // We don't need to call gIMMgr->addP2PSession() here. The first incoming message will create the panel.
+ }
+ if(session->mVoiceInvitePending)
+ {
+ session->mVoiceInvitePending = false;
+
+ gIMMgr->inviteToSession(
+ session->mIMSessionID,
+ session->mName,
+ session->mCallerID,
+ session->mName,
+ IM_SESSION_P2P_INVITE,
+ LLIMMgr::INVITATION_TYPE_VOICE,
+ session->mHandle,
+ session->mSIPURI);
+ }
+
+ }
+ }
+}
+
+bool LLVivoxVoiceClient::setVoiceEffect(const LLUUID& id)
+{
+ if (!mAudioSession)
+ {
+ return false;
+ }
+
+ if (!id.isNull())
+ {
+ if (mVoiceFontMap.empty())
+ {
+ LL_DEBUGS("Voice") << "Voice fonts not available." << LL_ENDL;
+ return false;
+ }
+ else if (mVoiceFontMap.find(id) == mVoiceFontMap.end())
+ {
+ LL_DEBUGS("Voice") << "Invalid voice font " << id << LL_ENDL;
+ return false;
+ }
+ }
+
+ // *TODO: Check for expired fonts?
+ mAudioSession->mVoiceFontID = id;
+
+ // *TODO: Separate voice font defaults for spatial chat and IM?
+ gSavedPerAccountSettings.setString("VoiceEffectDefault", id.asString());
+
+ sessionSetVoiceFontSendMessage(mAudioSession);
+ notifyVoiceFontObservers();
+
+ return true;
+}
+
+const LLUUID LLVivoxVoiceClient::getVoiceEffect()
+{
+ return mAudioSession ? mAudioSession->mVoiceFontID : LLUUID::null;
+}
+
+LLSD LLVivoxVoiceClient::getVoiceEffectProperties(const LLUUID& id)
+{
+ LLSD sd;
+
+ voice_font_map_t::iterator iter = mVoiceFontMap.find(id);
+ if (iter != mVoiceFontMap.end())
+ {
+ sd["template_only"] = false;
+ }
+ else
+ {
+ // Voice effect is not in the voice font map, see if there is a template
+ iter = mVoiceFontTemplateMap.find(id);
+ if (iter == mVoiceFontTemplateMap.end())
+ {
+ LL_WARNS("Voice") << "Voice effect " << id << "not found." << LL_ENDL;
+ return sd;
+ }
+ sd["template_only"] = true;
+ }
+
+ voiceFontEntry *font = iter->second;
+ sd["name"] = font->mName;
+ sd["expiry_date"] = font->mExpirationDate;
+ sd["is_new"] = font->mIsNew;
+
+ return sd;
+}
+
+LLVivoxVoiceClient::voiceFontEntry::voiceFontEntry(LLUUID& id) :
+ mID(id),
+ mFontIndex(0),
+ mFontType(VOICE_FONT_TYPE_NONE),
+ mFontStatus(VOICE_FONT_STATUS_NONE),
+ mIsNew(false)
+{
+ mExpiryTimer.stop();
+ mExpiryWarningTimer.stop();
+}
+
+LLVivoxVoiceClient::voiceFontEntry::~voiceFontEntry()
+{
+}
+
+void LLVivoxVoiceClient::refreshVoiceEffectLists(bool clear_lists)
+{
+ if (clear_lists)
+ {
+ mVoiceFontsReceived = false;
+ deleteAllVoiceFonts();
+ deleteVoiceFontTemplates();
+ }
+
+ accountGetSessionFontsSendMessage();
+ accountGetTemplateFontsSendMessage();
+}
+
+const voice_effect_list_t& LLVivoxVoiceClient::getVoiceEffectList() const
+{
+ return mVoiceFontList;
+}
+
+const voice_effect_list_t& LLVivoxVoiceClient::getVoiceEffectTemplateList() const
+{
+ return mVoiceFontTemplateList;
+}
+
+void LLVivoxVoiceClient::addVoiceFont(const S32 font_index,
+ const std::string &name,
+ const std::string &description,
+ const LLDate &expiration_date,
+ bool has_expired,
+ const S32 font_type,
+ const S32 font_status,
+ const bool template_font)
+{
+ // Vivox SessionFontIDs are not guaranteed to remain the same between
+ // sessions or grids so use a UUID for the name.
+
+ // If received name is not a UUID, fudge one by hashing the name and type.
+ LLUUID font_id;
+ if (LLUUID::validate(name))
+ {
+ font_id = LLUUID(name);
+ }
+ else
+ {
+ font_id.generate(STRINGIZE(font_type << ":" << name));
+ }
+
+ voiceFontEntry *font = NULL;
+
+ voice_font_map_t& font_map = template_font ? mVoiceFontTemplateMap : mVoiceFontMap;
+ voice_effect_list_t& font_list = template_font ? mVoiceFontTemplateList : mVoiceFontList;
+
+ // Check whether we've seen this font before.
+ voice_font_map_t::iterator iter = font_map.find(font_id);
+ bool new_font = (iter == font_map.end());
+
+ // Override the has_expired flag if we have passed the expiration_date as a double check.
+ if (expiration_date.secondsSinceEpoch() < (LLDate::now().secondsSinceEpoch() + VOICE_FONT_EXPIRY_INTERVAL))
+ {
+ has_expired = true;
+ }
+
+ if (has_expired)
+ {
+ LL_DEBUGS("Voice") << "Expired " << (template_font ? "Template " : "")
+ << expiration_date.asString() << " " << font_id
+ << " (" << font_index << ") " << name << LL_ENDL;
+
+ // Remove existing session fonts that have expired since we last saw them.
+ if (!new_font && !template_font)
+ {
+ deleteVoiceFont(font_id);
+ }
+ return;
+ }
+
+ if (new_font)
+ {
+ // If it is a new font create a new entry.
+ font = new voiceFontEntry(font_id);
+ }
+ else
+ {
+ // Not a new font, update the existing entry
+ font = iter->second;
+ }
+
+ if (font)
+ {
+ font->mFontIndex = font_index;
+ // Use the description for the human readable name if available, as the
+ // "name" may be a UUID.
+ font->mName = description.empty() ? name : description;
+ font->mFontType = font_type;
+ font->mFontStatus = font_status;
+
+ // If the font is new or the expiration date has changed the expiry timers need updating.
+ if (!template_font && (new_font || font->mExpirationDate != expiration_date))
+ {
+ font->mExpirationDate = expiration_date;
+
+ // Set the expiry timer to trigger a notification when the voice font can no longer be used.
+ font->mExpiryTimer.start();
+ font->mExpiryTimer.setExpiryAt(expiration_date.secondsSinceEpoch() - VOICE_FONT_EXPIRY_INTERVAL);
+
+ // Set the warning timer to some interval before actual expiry.
+ S32 warning_time = gSavedSettings.getS32("VoiceEffectExpiryWarningTime");
+ if (warning_time != 0)
+ {
+ font->mExpiryWarningTimer.start();
+ F64 expiry_time = (expiration_date.secondsSinceEpoch() - (F64)warning_time);
+ font->mExpiryWarningTimer.setExpiryAt(expiry_time - VOICE_FONT_EXPIRY_INTERVAL);
+ }
+ else
+ {
+ // Disable the warning timer.
+ font->mExpiryWarningTimer.stop();
+ }
+
+ // Only flag new session fonts after the first time we have fetched the list.
+ if (mVoiceFontsReceived)
+ {
+ font->mIsNew = true;
+ mVoiceFontsNew = true;
+ }
+ }
+
+ LL_DEBUGS("Voice") << (template_font ? "Template " : "")
+ << font->mExpirationDate.asString() << " " << font->mID
+ << " (" << font->mFontIndex << ") " << name << LL_ENDL;
+
+ if (new_font)
+ {
+ font_map.insert(voice_font_map_t::value_type(font->mID, font));
+ font_list.insert(voice_effect_list_t::value_type(font->mName, font->mID));
+ }
+
+ mVoiceFontListDirty = true;
+
+ // Debugging stuff
+
+ if (font_type < VOICE_FONT_TYPE_NONE || font_type >= VOICE_FONT_TYPE_UNKNOWN)
+ {
+ LL_DEBUGS("Voice") << "Unknown voice font type: " << font_type << LL_ENDL;
+ }
+ if (font_status < VOICE_FONT_STATUS_NONE || font_status >= VOICE_FONT_STATUS_UNKNOWN)
+ {
+ LL_DEBUGS("Voice") << "Unknown voice font status: " << font_status << LL_ENDL;
+ }
+ }
+}
+
+void LLVivoxVoiceClient::expireVoiceFonts()
+{
+ // *TODO: If we are selling voice fonts in packs, there are probably
+ // going to be a number of fonts with the same expiration time, so would
+ // be more efficient to just keep a list of expiration times rather
+ // than checking each font individually.
+
+ bool have_expired = false;
+ bool will_expire = false;
+ bool expired_in_use = false;
+
+ LLUUID current_effect = LLVoiceClient::instance().getVoiceEffectDefault();
+
+ voice_font_map_t::iterator iter;
+ for (iter = mVoiceFontMap.begin(); iter != mVoiceFontMap.end(); ++iter)
+ {
+ voiceFontEntry* voice_font = iter->second;
+ LLFrameTimer& expiry_timer = voice_font->mExpiryTimer;
+ LLFrameTimer& warning_timer = voice_font->mExpiryWarningTimer;
+
+ // Check for expired voice fonts
+ if (expiry_timer.getStarted() && expiry_timer.hasExpired())
+ {
+ // Check whether it is the active voice font
+ if (voice_font->mID == current_effect)
+ {
+ // Reset to no voice effect.
+ setVoiceEffect(LLUUID::null);
+ expired_in_use = true;
+ }
+
+ LL_DEBUGS("Voice") << "Voice Font " << voice_font->mName << " has expired." << LL_ENDL;
+ deleteVoiceFont(voice_font->mID);
+ have_expired = true;
+ }
+
+ // Check for voice fonts that will expire in less that the warning time
+ if (warning_timer.getStarted() && warning_timer.hasExpired())
+ {
+ LL_DEBUGS("Voice") << "Voice Font " << voice_font->mName << " will expire soon." << LL_ENDL;
+ will_expire = true;
+ warning_timer.stop();
+ }
+ }
+
+ LLSD args;
+ args["URL"] = LLTrans::getString("voice_morphing_url");
+
+ // Give a notification if any voice fonts have expired.
+ if (have_expired)
+ {
+ if (expired_in_use)
+ {
+ LLNotificationsUtil::add("VoiceEffectsExpiredInUse", args);
+ }
+ else
+ {
+ LLNotificationsUtil::add("VoiceEffectsExpired", args);
+ }
+
+ // Refresh voice font lists in the UI.
+ notifyVoiceFontObservers();
+ }
+
+ // Give a warning notification if any voice fonts are due to expire.
+ if (will_expire)
+ {
+ S32 seconds = gSavedSettings.getS32("VoiceEffectExpiryWarningTime");
+ args["INTERVAL"] = llformat("%d", seconds / SEC_PER_DAY);
+
+ LLNotificationsUtil::add("VoiceEffectsWillExpire", args);
+ }
+}
+
+void LLVivoxVoiceClient::deleteVoiceFont(const LLUUID& id)
+{
+ // Remove the entry from the voice font list.
+ voice_effect_list_t::iterator list_iter = mVoiceFontList.begin();
+ while (list_iter != mVoiceFontList.end())
+ {
+ if (list_iter->second == id)
+ {
+ LL_DEBUGS("Voice") << "Removing " << id << " from the voice font list." << LL_ENDL;
+ mVoiceFontList.erase(list_iter++);
+ mVoiceFontListDirty = true;
+ }
+ else
+ {
+ ++list_iter;
+ }
+ }
+
+ // Find the entry in the voice font map and erase its data.
+ voice_font_map_t::iterator map_iter = mVoiceFontMap.find(id);
+ if (map_iter != mVoiceFontMap.end())
+ {
+ delete map_iter->second;
+ }
+
+ // Remove the entry from the voice font map.
+ mVoiceFontMap.erase(map_iter);
+}
+
+void LLVivoxVoiceClient::deleteAllVoiceFonts()
+{
+ mVoiceFontList.clear();
+
+ voice_font_map_t::iterator iter;
+ for (iter = mVoiceFontMap.begin(); iter != mVoiceFontMap.end(); ++iter)
+ {
+ delete iter->second;
+ }
+ mVoiceFontMap.clear();
+}
+
+void LLVivoxVoiceClient::deleteVoiceFontTemplates()
+{
+ mVoiceFontTemplateList.clear();
+
+ voice_font_map_t::iterator iter;
+ for (iter = mVoiceFontTemplateMap.begin(); iter != mVoiceFontTemplateMap.end(); ++iter)
+ {
+ delete iter->second;
+ }
+ mVoiceFontTemplateMap.clear();
+}
+
+S32 LLVivoxVoiceClient::getVoiceFontIndex(const LLUUID& id) const
+{
+ S32 result = 0;
+ if (!id.isNull())
+ {
+ voice_font_map_t::const_iterator it = mVoiceFontMap.find(id);
+ if (it != mVoiceFontMap.end())
+ {
+ result = it->second->mFontIndex;
+ }
+ else
+ {
+ LL_DEBUGS("Voice") << "Selected voice font " << id << " is not available." << LL_ENDL;
+ }
+ }
+ return result;
+}
+
+S32 LLVivoxVoiceClient::getVoiceFontTemplateIndex(const LLUUID& id) const
+{
+ S32 result = 0;
+ if (!id.isNull())
+ {
+ voice_font_map_t::const_iterator it = mVoiceFontTemplateMap.find(id);
+ if (it != mVoiceFontTemplateMap.end())
+ {
+ result = it->second->mFontIndex;
+ }
+ else
+ {
+ LL_DEBUGS("Voice") << "Selected voice font template " << id << " is not available." << LL_ENDL;
+ }
+ }
+ return result;
+}
+
+void LLVivoxVoiceClient::accountGetSessionFontsSendMessage()
+{
+ if(!mAccountHandle.empty())
+ {
+ std::ostringstream stream;
+
+ LL_DEBUGS("Voice") << "Requesting voice font list." << LL_ENDL;
+
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.GetSessionFonts.1\">"
+ << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
+ << "</Request>"
+ << "\n\n\n";
+
+ writeString(stream.str());
+ }
+}
+
+void LLVivoxVoiceClient::accountGetTemplateFontsSendMessage()
+{
+ if(!mAccountHandle.empty())
+ {
+ std::ostringstream stream;
+
+ LL_DEBUGS("Voice") << "Requesting voice font template list." << LL_ENDL;
+
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Account.GetTemplateFonts.1\">"
+ << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
+ << "</Request>"
+ << "\n\n\n";
+
+ writeString(stream.str());
+ }
+}
+
+void LLVivoxVoiceClient::sessionSetVoiceFontSendMessage(sessionState *session)
+{
+ S32 font_index = getVoiceFontIndex(session->mVoiceFontID);
+ LL_DEBUGS("Voice") << "Requesting voice font: " << session->mVoiceFontID << " (" << font_index << "), session handle: " << session->mHandle << LL_ENDL;
+
+ std::ostringstream stream;
+
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Session.SetVoiceFont.1\">"
+ << "<SessionHandle>" << session->mHandle << "</SessionHandle>"
+ << "<SessionFontID>" << font_index << "</SessionFontID>"
+ << "</Request>\n\n\n";
+
+ writeString(stream.str());
+}
+
+void LLVivoxVoiceClient::accountGetSessionFontsResponse(int statusCode, const std::string &statusString)
+{
+ // Voice font list entries were updated via addVoiceFont() during parsing.
+ if(getState() == stateVoiceFontsWait)
+ {
+ setState(stateVoiceFontsReceived);
+ }
+
+ notifyVoiceFontObservers();
+ mVoiceFontsReceived = true;
+}
+
+void LLVivoxVoiceClient::accountGetTemplateFontsResponse(int statusCode, const std::string &statusString)
+{
+ // Voice font list entries were updated via addVoiceFont() during parsing.
+ notifyVoiceFontObservers();
+}
+void LLVivoxVoiceClient::addObserver(LLVoiceEffectObserver* observer)
+{
+ mVoiceFontObservers.insert(observer);
+}
+
+void LLVivoxVoiceClient::removeObserver(LLVoiceEffectObserver* observer)
+{
+ mVoiceFontObservers.erase(observer);
+}
+
+void LLVivoxVoiceClient::notifyVoiceFontObservers()
+{
+ LL_DEBUGS("Voice") << "Notifying voice effect observers. Lists changed: " << mVoiceFontListDirty << LL_ENDL;
+
+ for (voice_font_observer_set_t::iterator it = mVoiceFontObservers.begin();
+ it != mVoiceFontObservers.end();
+ )
+ {
+ LLVoiceEffectObserver* observer = *it;
+ observer->onVoiceEffectChanged(mVoiceFontListDirty);
+ // In case onVoiceEffectChanged() deleted an entry.
+ it = mVoiceFontObservers.upper_bound(observer);
+ }
+ mVoiceFontListDirty = false;
+
+ // If new Voice Fonts have been added notify the user.
+ if (mVoiceFontsNew)
+ {
+ if(mVoiceFontsReceived)
+ {
+ LLNotificationsUtil::add("VoiceEffectsNew");
+ }
+ mVoiceFontsNew = false;
+ }
+}
+
+void LLVivoxVoiceClient::enablePreviewBuffer(bool enable)
+{
+ mCaptureBufferMode = enable;
+ if(mCaptureBufferMode && getState() >= stateNoChannel)
+ {
+ LL_DEBUGS("Voice") << "no channel" << LL_ENDL;
+ sessionTerminate();
+ }
+}
+
+void LLVivoxVoiceClient::recordPreviewBuffer()
+{
+ if (!mCaptureBufferMode)
+ {
+ LL_DEBUGS("Voice") << "Not in voice effect preview mode, cannot start recording." << LL_ENDL;
+ mCaptureBufferRecording = false;
+ return;
+ }
+
+ mCaptureBufferRecording = true;
+}
+
+void LLVivoxVoiceClient::playPreviewBuffer(const LLUUID& effect_id)
+{
+ if (!mCaptureBufferMode)
+ {
+ LL_DEBUGS("Voice") << "Not in voice effect preview mode, no buffer to play." << LL_ENDL;
+ mCaptureBufferRecording = false;
+ return;
+ }
+
+ if (!mCaptureBufferRecorded)
+ {
+ // Can't play until we have something recorded!
+ mCaptureBufferPlaying = false;
+ return;
+ }
+
+ mPreviewVoiceFont = effect_id;
+ mCaptureBufferPlaying = true;
+}
+
+void LLVivoxVoiceClient::stopPreviewBuffer()
+{
+ mCaptureBufferRecording = false;
+ mCaptureBufferPlaying = false;
+}
+
+bool LLVivoxVoiceClient::isPreviewRecording()
+{
+ return (mCaptureBufferMode && mCaptureBufferRecording);
+}
+
+bool LLVivoxVoiceClient::isPreviewPlaying()
+{
+ return (mCaptureBufferMode && mCaptureBufferPlaying);
+}
+
+void LLVivoxVoiceClient::captureBufferRecordStartSendMessage()
+{ if(!mAccountHandle.empty())
+ {
+ std::ostringstream stream;
+
+ LL_DEBUGS("Voice") << "Starting audio capture to buffer." << LL_ENDL;
+
+ // Start capture
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.StartBufferCapture.1\">"
+ << "</Request>"
+ << "\n\n\n";
+
+ // Unmute the mic
+ stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalMic.1\">"
+ << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>"
+ << "<Value>false</Value>"
+ << "</Request>\n\n\n";
+
+ // Dirty the PTT state so that it will get reset when we finishing previewing
+ mPTTDirty = true;
+
+ writeString(stream.str());
+ }
+}
+
+void LLVivoxVoiceClient::captureBufferRecordStopSendMessage()
+{
+ if(!mAccountHandle.empty())
+ {
+ std::ostringstream stream;
+
+ LL_DEBUGS("Voice") << "Stopping audio capture to buffer." << LL_ENDL;
+
+ // Mute the mic. PTT state was dirtied at recording start, so will be reset when finished previewing.
+ stream << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Connector.MuteLocalMic.1\">"
+ << "<ConnectorHandle>" << mConnectorHandle << "</ConnectorHandle>"
+ << "<Value>true</Value>"
+ << "</Request>\n\n\n";
+
+ // Stop capture
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.CaptureAudioStop.1\">"
+ << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
+ << "</Request>"
+ << "\n\n\n";
+
+ writeString(stream.str());
+ }
+}
+
+void LLVivoxVoiceClient::captureBufferPlayStartSendMessage(const LLUUID& voice_font_id)
+{
+ if(!mAccountHandle.empty())
+ {
+ // Track how may play requests are sent, so we know how many stop events to
+ // expect before play actually stops.
+ ++mPlayRequestCount;
+
+ std::ostringstream stream;
+
+ LL_DEBUGS("Voice") << "Starting audio buffer playback." << LL_ENDL;
+
+ S32 font_index = getVoiceFontTemplateIndex(voice_font_id);
+ LL_DEBUGS("Voice") << "With voice font: " << voice_font_id << " (" << font_index << ")" << LL_ENDL;
+
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.PlayAudioBuffer.1\">"
+ << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
+ << "<TemplateFontID>" << font_index << "</TemplateFontID>"
+ << "<FontDelta />"
+ << "</Request>"
+ << "\n\n\n";
+
+ writeString(stream.str());
+ }
+}
+
+void LLVivoxVoiceClient::captureBufferPlayStopSendMessage()
+{
+ if(!mAccountHandle.empty())
+ {
+ std::ostringstream stream;
+
+ LL_DEBUGS("Voice") << "Stopping audio buffer playback." << LL_ENDL;
+
+ stream
+ << "<Request requestId=\"" << mCommandCookie++ << "\" action=\"Aux.RenderAudioStop.1\">"
+ << "<AccountHandle>" << mAccountHandle << "</AccountHandle>"
+ << "</Request>"
+ << "\n\n\n";
+
+ writeString(stream.str());
+ }
+}
+
+LLVivoxProtocolParser::LLVivoxProtocolParser()
+{
+ parser = NULL;
+ parser = XML_ParserCreate(NULL);
+
+ reset();
+}
+
+void LLVivoxProtocolParser::reset()
+{
+ responseDepth = 0;
+ ignoringTags = false;
+ accumulateText = false;
+ energy = 0.f;
+ hasText = false;
+ hasAudio = false;
+ hasVideo = false;
+ terminated = false;
+ ignoreDepth = 0;
+ isChannel = false;
+ incoming = false;
+ enabled = false;
+ isEvent = false;
+ isLocallyMuted = false;
+ isModeratorMuted = false;
+ isSpeaking = false;
+ participantType = 0;
+ squelchDebugOutput = false;
+ returnCode = -1;
+ state = 0;
+ statusCode = 0;
+ volume = 0;
+ textBuffer.clear();
+ alias.clear();
+ numberOfAliases = 0;
+ applicationString.clear();
+}
+
+//virtual
+LLVivoxProtocolParser::~LLVivoxProtocolParser()
+{
+ if (parser)
+ XML_ParserFree(parser);
+}
+
+// virtual
+LLIOPipe::EStatus LLVivoxProtocolParser::process_impl(
+ const LLChannelDescriptors& channels,
+ buffer_ptr_t& buffer,
+ bool& eos,
+ LLSD& context,
+ LLPumpIO* pump)
+{
+ LLBufferStream istr(channels, buffer.get());
+ std::ostringstream ostr;
+ while (istr.good())
+ {
+ char buf[1024];
+ istr.read(buf, sizeof(buf));
+ mInput.append(buf, istr.gcount());
+ }
+
+ // Look for input delimiter(s) in the input buffer. If one is found, send the message to the xml parser.
+ int start = 0;
+ int delim;
+ while((delim = mInput.find("\n\n\n", start)) != std::string::npos)
+ {
+
+ // Reset internal state of the LLVivoxProtocolParser (no effect on the expat parser)
+ reset();
+
+ XML_ParserReset(parser, NULL);
+ XML_SetElementHandler(parser, ExpatStartTag, ExpatEndTag);
+ XML_SetCharacterDataHandler(parser, ExpatCharHandler);
+ XML_SetUserData(parser, this);
+ XML_Parse(parser, mInput.data() + start, delim - start, false);
+
+ // If this message isn't set to be squelched, output the raw XML received.
+ if(!squelchDebugOutput)
+ {
+ LL_DEBUGS("Voice") << "parsing: " << mInput.substr(start, delim - start) << LL_ENDL;
+ }
+
+ start = delim + 3;
+ }
+
+ if(start != 0)
+ mInput = mInput.substr(start);
+
+ LL_DEBUGS("VivoxProtocolParser") << "at end, mInput is: " << mInput << LL_ENDL;
+
+ if(!LLVivoxVoiceClient::getInstance()->mConnected)
+ {
+ // If voice has been disabled, we just want to close the socket. This does so.
+ LL_INFOS("Voice") << "returning STATUS_STOP" << LL_ENDL;
+ return STATUS_STOP;
+ }
+
+ return STATUS_OK;
+}
+
+void XMLCALL LLVivoxProtocolParser::ExpatStartTag(void *data, const char *el, const char **attr)
+{
+ if (data)
+ {
+ LLVivoxProtocolParser *object = (LLVivoxProtocolParser*)data;
+ object->StartTag(el, attr);
+ }
+}
+
+// --------------------------------------------------------------------------------
+
+void XMLCALL LLVivoxProtocolParser::ExpatEndTag(void *data, const char *el)
+{
+ if (data)
+ {
+ LLVivoxProtocolParser *object = (LLVivoxProtocolParser*)data;
+ object->EndTag(el);
+ }
+}
+
+// --------------------------------------------------------------------------------
+
+void XMLCALL LLVivoxProtocolParser::ExpatCharHandler(void *data, const XML_Char *s, int len)
+{
+ if (data)
+ {
+ LLVivoxProtocolParser *object = (LLVivoxProtocolParser*)data;
+ object->CharData(s, len);
+ }
+}
+
+// --------------------------------------------------------------------------------
+
+
+void LLVivoxProtocolParser::StartTag(const char *tag, const char **attr)
+{
+ // Reset the text accumulator. We shouldn't have strings that are inturrupted by new tags
+ textBuffer.clear();
+ // only accumulate text if we're not ignoring tags.
+ accumulateText = !ignoringTags;
+
+ if (responseDepth == 0)
+ {
+ isEvent = !stricmp("Event", tag);
+
+ if (!stricmp("Response", tag) || isEvent)
+ {
+ // Grab the attributes
+ while (*attr)
+ {
+ const char *key = *attr++;
+ const char *value = *attr++;
+
+ if (!stricmp("requestId", key))
+ {
+ requestId = value;
+ }
+ else if (!stricmp("action", key))
+ {
+ actionString = value;
+ }
+ else if (!stricmp("type", key))
+ {
+ eventTypeString = value;
+ }
+ }
+ }
+ LL_DEBUGS("VivoxProtocolParser") << tag << " (" << responseDepth << ")" << LL_ENDL;
+ }
+ else
+ {
+ if (ignoringTags)
+ {
+ LL_DEBUGS("VivoxProtocolParser") << "ignoring tag " << tag << " (depth = " << responseDepth << ")" << LL_ENDL;
+ }
+ else
+ {
+ LL_DEBUGS("VivoxProtocolParser") << tag << " (" << responseDepth << ")" << LL_ENDL;
+
+ // Ignore the InputXml stuff so we don't get confused
+ if (!stricmp("InputXml", tag))
+ {
+ ignoringTags = true;
+ ignoreDepth = responseDepth;
+ accumulateText = false;
+
+ LL_DEBUGS("VivoxProtocolParser") << "starting ignore, ignoreDepth is " << ignoreDepth << LL_ENDL;
+ }
+ else if (!stricmp("CaptureDevices", tag))
+ {
+ LLVivoxVoiceClient::getInstance()->clearCaptureDevices();
+ }
+ else if (!stricmp("RenderDevices", tag))
+ {
+ LLVivoxVoiceClient::getInstance()->clearRenderDevices();
+ }
+ else if (!stricmp("CaptureDevice", tag))
+ {
+ deviceString.clear();
+ }
+ else if (!stricmp("RenderDevice", tag))
+ {
+ deviceString.clear();
+ }
+ else if (!stricmp("Buddies", tag))
+ {
+ LLVivoxVoiceClient::getInstance()->deleteAllBuddies();
+ }
+ else if (!stricmp("BlockRules", tag))
+ {
+ LLVivoxVoiceClient::getInstance()->deleteAllBlockRules();
+ }
+ else if (!stricmp("AutoAcceptRules", tag))
+ {
+ LLVivoxVoiceClient::getInstance()->deleteAllAutoAcceptRules();
+ }
+ else if (!stricmp("SessionFont", tag))
+ {
+ id = 0;
+ nameString.clear();
+ descriptionString.clear();
+ expirationDate = LLDate();
+ hasExpired = false;
+ fontType = 0;
+ fontStatus = 0;
+ }
+ else if (!stricmp("TemplateFont", tag))
+ {
+ id = 0;
+ nameString.clear();
+ descriptionString.clear();
+ expirationDate = LLDate();
+ hasExpired = false;
+ fontType = 0;
+ fontStatus = 0;
+ }
+ else if (!stricmp("MediaCompletionType", tag))
+ {
+ mediaCompletionType.clear();
+ }
+ }
+ }
+ responseDepth++;
+}
+
+// --------------------------------------------------------------------------------
+
+void LLVivoxProtocolParser::EndTag(const char *tag)
+{
+ const std::string& string = textBuffer;
+
+ responseDepth--;
+
+ if (ignoringTags)
+ {
+ if (ignoreDepth == responseDepth)
+ {
+ LL_DEBUGS("VivoxProtocolParser") << "end of ignore" << LL_ENDL;
+ ignoringTags = false;
+ }
+ else
+ {
+ LL_DEBUGS("VivoxProtocolParser") << "ignoring tag " << tag << " (depth = " << responseDepth << ")" << LL_ENDL;
+ }
+ }
+
+ if (!ignoringTags)
+ {
+ LL_DEBUGS("VivoxProtocolParser") << "processing tag " << tag << " (depth = " << responseDepth << ")" << LL_ENDL;
+
+ // Closing a tag. Finalize the text we've accumulated and reset
+ if (!stricmp("ReturnCode", tag))
+ returnCode = strtol(string.c_str(), NULL, 10);
+ else if (!stricmp("SessionHandle", tag))
+ sessionHandle = string;
+ else if (!stricmp("SessionGroupHandle", tag))
+ sessionGroupHandle = string;
+ else if (!stricmp("StatusCode", tag))
+ statusCode = strtol(string.c_str(), NULL, 10);
+ else if (!stricmp("StatusString", tag))
+ statusString = string;
+ else if (!stricmp("ParticipantURI", tag))
+ uriString = string;
+ else if (!stricmp("Volume", tag))
+ volume = strtol(string.c_str(), NULL, 10);
+ else if (!stricmp("Energy", tag))
+ energy = (F32)strtod(string.c_str(), NULL);
+ else if (!stricmp("IsModeratorMuted", tag))
+ isModeratorMuted = !stricmp(string.c_str(), "true");
+ else if (!stricmp("IsSpeaking", tag))
+ isSpeaking = !stricmp(string.c_str(), "true");
+ else if (!stricmp("Alias", tag))
+ alias = string;
+ else if (!stricmp("NumberOfAliases", tag))
+ numberOfAliases = strtol(string.c_str(), NULL, 10);
+ else if (!stricmp("Application", tag))
+ applicationString = string;
+ else if (!stricmp("ConnectorHandle", tag))
+ connectorHandle = string;
+ else if (!stricmp("VersionID", tag))
+ versionID = string;
+ else if (!stricmp("AccountHandle", tag))
+ accountHandle = string;
+ else if (!stricmp("State", tag))
+ state = strtol(string.c_str(), NULL, 10);
+ else if (!stricmp("URI", tag))
+ uriString = string;
+ else if (!stricmp("IsChannel", tag))
+ isChannel = !stricmp(string.c_str(), "true");
+ else if (!stricmp("Incoming", tag))
+ incoming = !stricmp(string.c_str(), "true");
+ else if (!stricmp("Enabled", tag))
+ enabled = !stricmp(string.c_str(), "true");
+ else if (!stricmp("Name", tag))
+ nameString = string;
+ else if (!stricmp("AudioMedia", tag))
+ audioMediaString = string;
+ else if (!stricmp("ChannelName", tag))
+ nameString = string;
+ else if (!stricmp("DisplayName", tag))
+ displayNameString = string;
+ else if (!stricmp("Device", tag))
+ deviceString = string;
+ else if (!stricmp("AccountName", tag))
+ nameString = string;
+ else if (!stricmp("ParticipantType", tag))
+ participantType = strtol(string.c_str(), NULL, 10);
+ else if (!stricmp("IsLocallyMuted", tag))
+ isLocallyMuted = !stricmp(string.c_str(), "true");
+ else if (!stricmp("MicEnergy", tag))
+ energy = (F32)strtod(string.c_str(), NULL);
+ else if (!stricmp("ChannelName", tag))
+ nameString = string;
+ else if (!stricmp("ChannelURI", tag))
+ uriString = string;
+ else if (!stricmp("BuddyURI", tag))
+ uriString = string;
+ else if (!stricmp("Presence", tag))
+ statusString = string;
+ else if (!stricmp("CaptureDevice", tag))
+ {
+ LLVivoxVoiceClient::getInstance()->addCaptureDevice(deviceString);
+ }
+ else if (!stricmp("RenderDevice", tag))
+ {
+ LLVivoxVoiceClient::getInstance()->addRenderDevice(deviceString);
+ }
+ else if (!stricmp("Buddy", tag))
+ {
+ LLVivoxVoiceClient::getInstance()->processBuddyListEntry(uriString, displayNameString);
+ }
+ else if (!stricmp("BlockRule", tag))
+ {
+ LLVivoxVoiceClient::getInstance()->addBlockRule(blockMask, presenceOnly);
+ }
+ else if (!stricmp("BlockMask", tag))
+ blockMask = string;
+ else if (!stricmp("PresenceOnly", tag))
+ presenceOnly = string;
+ else if (!stricmp("AutoAcceptRule", tag))
+ {
+ LLVivoxVoiceClient::getInstance()->addAutoAcceptRule(autoAcceptMask, autoAddAsBuddy);
+ }
+ else if (!stricmp("AutoAcceptMask", tag))
+ autoAcceptMask = string;
+ else if (!stricmp("AutoAddAsBuddy", tag))
+ autoAddAsBuddy = string;
+ else if (!stricmp("MessageHeader", tag))
+ messageHeader = string;
+ else if (!stricmp("MessageBody", tag))
+ messageBody = string;
+ else if (!stricmp("NotificationType", tag))
+ notificationType = string;
+ else if (!stricmp("HasText", tag))
+ hasText = !stricmp(string.c_str(), "true");
+ else if (!stricmp("HasAudio", tag))
+ hasAudio = !stricmp(string.c_str(), "true");
+ else if (!stricmp("HasVideo", tag))
+ hasVideo = !stricmp(string.c_str(), "true");
+ else if (!stricmp("Terminated", tag))
+ terminated = !stricmp(string.c_str(), "true");
+ else if (!stricmp("SubscriptionHandle", tag))
+ subscriptionHandle = string;
+ else if (!stricmp("SubscriptionType", tag))
+ subscriptionType = string;
+ else if (!stricmp("SessionFont", tag))
+ {
+ LLVivoxVoiceClient::getInstance()->addVoiceFont(id, nameString, descriptionString, expirationDate, hasExpired, fontType, fontStatus, false);
+ }
+ else if (!stricmp("TemplateFont", tag))
+ {
+ LLVivoxVoiceClient::getInstance()->addVoiceFont(id, nameString, descriptionString, expirationDate, hasExpired, fontType, fontStatus, true);
+ }
+ else if (!stricmp("ID", tag))
+ {
+ id = strtol(string.c_str(), NULL, 10);
+ }
+ else if (!stricmp("Description", tag))
+ {
+ descriptionString = string;
+ }
+ else if (!stricmp("ExpirationDate", tag))
+ {
+ expirationDate = expiryTimeStampToLLDate(string);
+ }
+ else if (!stricmp("Expired", tag))
+ {
+ hasExpired = !stricmp(string.c_str(), "1");
+ }
+ else if (!stricmp("Type", tag))
+ {
+ fontType = strtol(string.c_str(), NULL, 10);
+ }
+ else if (!stricmp("Status", tag))
+ {
+ fontStatus = strtol(string.c_str(), NULL, 10);
+ }
+ else if (!stricmp("MediaCompletionType", tag))
+ {
+ mediaCompletionType = string;;
+ }
+
+ textBuffer.clear();
+ accumulateText= false;
+
+ if (responseDepth == 0)
+ {
+ // We finished all of the XML, process the data
+ processResponse(tag);
+ }
+ }
+}
+
+// --------------------------------------------------------------------------------
+
+void LLVivoxProtocolParser::CharData(const char *buffer, int length)
+{
+ /*
+ This method is called for anything that isn't a tag, which can be text you
+ want that lies between tags, and a lot of stuff you don't want like file formatting
+ (tabs, spaces, CR/LF, etc).
+
+ Only copy text if we are in accumulate mode...
+ */
+ if (accumulateText)
+ textBuffer.append(buffer, length);
+}
+
+// --------------------------------------------------------------------------------
+
+LLDate LLVivoxProtocolParser::expiryTimeStampToLLDate(const std::string& vivox_ts)
+{
+ // *HACK: Vivox reports the time incorrectly. LLDate also only parses a
+ // subset of valid ISO 8601 dates (only handles Z, not offsets).
+ // So just use the date portion and fix the time here.
+ std::string time_stamp = vivox_ts.substr(0, 10);
+ time_stamp += VOICE_FONT_EXPIRY_TIME;
+
+ LL_DEBUGS("VivoxProtocolParser") << "Vivox timestamp " << vivox_ts << " modified to: " << time_stamp << LL_ENDL;
+
+ return LLDate(time_stamp);
+}
+
+// --------------------------------------------------------------------------------
+
+void LLVivoxProtocolParser::processResponse(std::string tag)
+{
+ LL_DEBUGS("VivoxProtocolParser") << tag << LL_ENDL;
+
+ // SLIM SDK: the SDK now returns a statusCode of "200" (OK) for success. This is a change vs. previous SDKs.
+ // According to Mike S., "The actual API convention is that responses with return codes of 0 are successful, regardless of the status code returned",
+ // so I believe this will give correct behavior.
+
+ if(returnCode == 0)
+ statusCode = 0;
+
+ if (isEvent)
+ {
+ const char *eventTypeCstr = eventTypeString.c_str();
+ if (!stricmp(eventTypeCstr, "AccountLoginStateChangeEvent"))
+ {
+ LLVivoxVoiceClient::getInstance()->accountLoginStateChangeEvent(accountHandle, statusCode, statusString, state);
+ }
+ else if (!stricmp(eventTypeCstr, "SessionAddedEvent"))
+ {
+ /*
+ <Event type="SessionAddedEvent">
+ <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg0</SessionGroupHandle>
+ <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==0</SessionHandle>
+ <Uri>sip:confctl-1408789@bhr.vivox.com</Uri>
+ <IsChannel>true</IsChannel>
+ <Incoming>false</Incoming>
+ <ChannelName />
+ </Event>
+ */
+ LLVivoxVoiceClient::getInstance()->sessionAddedEvent(uriString, alias, sessionHandle, sessionGroupHandle, isChannel, incoming, nameString, applicationString);
+ }
+ else if (!stricmp(eventTypeCstr, "SessionRemovedEvent"))
+ {
+ LLVivoxVoiceClient::getInstance()->sessionRemovedEvent(sessionHandle, sessionGroupHandle);
+ }
+ else if (!stricmp(eventTypeCstr, "SessionGroupAddedEvent"))
+ {
+ LLVivoxVoiceClient::getInstance()->sessionGroupAddedEvent(sessionGroupHandle);
+ }
+ else if (!stricmp(eventTypeCstr, "MediaStreamUpdatedEvent"))
+ {
+ /*
+ <Event type="MediaStreamUpdatedEvent">
+ <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg0</SessionGroupHandle>
+ <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==0</SessionHandle>
+ <StatusCode>200</StatusCode>
+ <StatusString>OK</StatusString>
+ <State>2</State>
+ <Incoming>false</Incoming>
+ </Event>
+ */
+ LLVivoxVoiceClient::getInstance()->mediaStreamUpdatedEvent(sessionHandle, sessionGroupHandle, statusCode, statusString, state, incoming);
+ }
+ else if (!stricmp(eventTypeCstr, "MediaCompletionEvent"))
+ {
+ /*
+ <Event type="MediaCompletionEvent">
+ <SessionGroupHandle />
+ <MediaCompletionType>AuxBufferAudioCapture</MediaCompletionType>
+ </Event>
+ */
+ LLVivoxVoiceClient::getInstance()->mediaCompletionEvent(sessionGroupHandle, mediaCompletionType);
+ }
+ else if (!stricmp(eventTypeCstr, "TextStreamUpdatedEvent"))
+ {
+ /*
+ <Event type="TextStreamUpdatedEvent">
+ <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg1</SessionGroupHandle>
+ <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==1</SessionHandle>
+ <Enabled>true</Enabled>
+ <State>1</State>
+ <Incoming>true</Incoming>
+ </Event>
+ */
+ LLVivoxVoiceClient::getInstance()->textStreamUpdatedEvent(sessionHandle, sessionGroupHandle, enabled, state, incoming);
+ }
+ else if (!stricmp(eventTypeCstr, "ParticipantAddedEvent"))
+ {
+ /*
+ <Event type="ParticipantAddedEvent">
+ <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg4</SessionGroupHandle>
+ <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==4</SessionHandle>
+ <ParticipantUri>sip:xI5auBZ60SJWIk606-1JGRQ==@bhr.vivox.com</ParticipantUri>
+ <AccountName>xI5auBZ60SJWIk606-1JGRQ==</AccountName>
+ <DisplayName />
+ <ParticipantType>0</ParticipantType>
+ </Event>
+ */
+ LLVivoxVoiceClient::getInstance()->participantAddedEvent(sessionHandle, sessionGroupHandle, uriString, alias, nameString, displayNameString, participantType);
+ }
+ else if (!stricmp(eventTypeCstr, "ParticipantRemovedEvent"))
+ {
+ /*
+ <Event type="ParticipantRemovedEvent">
+ <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg4</SessionGroupHandle>
+ <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==4</SessionHandle>
+ <ParticipantUri>sip:xtx7YNV-3SGiG7rA1fo5Ndw==@bhr.vivox.com</ParticipantUri>
+ <AccountName>xtx7YNV-3SGiG7rA1fo5Ndw==</AccountName>
+ </Event>
+ */
+ LLVivoxVoiceClient::getInstance()->participantRemovedEvent(sessionHandle, sessionGroupHandle, uriString, alias, nameString);
+ }
+ else if (!stricmp(eventTypeCstr, "ParticipantUpdatedEvent"))
+ {
+ /*
+ <Event type="ParticipantUpdatedEvent">
+ <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg0</SessionGroupHandle>
+ <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==0</SessionHandle>
+ <ParticipantUri>sip:xFnPP04IpREWNkuw1cOXlhw==@bhr.vivox.com</ParticipantUri>
+ <IsModeratorMuted>false</IsModeratorMuted>
+ <IsSpeaking>true</IsSpeaking>
+ <Volume>44</Volume>
+ <Energy>0.0879437</Energy>
+ </Event>
+ */
+
+ // These happen so often that logging them is pretty useless.
+ squelchDebugOutput = true;
+
+ LLVivoxVoiceClient::getInstance()->participantUpdatedEvent(sessionHandle, sessionGroupHandle, uriString, alias, isModeratorMuted, isSpeaking, volume, energy);
+ }
+ else if (!stricmp(eventTypeCstr, "AuxAudioPropertiesEvent"))
+ {
+ // These are really spammy in tuning mode
+ squelchDebugOutput = true;
+
+ LLVivoxVoiceClient::getInstance()->auxAudioPropertiesEvent(energy);
+ }
+ else if (!stricmp(eventTypeCstr, "BuddyPresenceEvent"))
+ {
+ LLVivoxVoiceClient::getInstance()->buddyPresenceEvent(uriString, alias, statusString, applicationString);
+ }
+ else if (!stricmp(eventTypeCstr, "BuddyAndGroupListChangedEvent"))
+ {
+ // The buddy list was updated during parsing.
+ // Need to recheck against the friends list.
+ LLVivoxVoiceClient::getInstance()->buddyListChanged();
+ }
+ else if (!stricmp(eventTypeCstr, "BuddyChangedEvent"))
+ {
+ /*
+ <Event type="BuddyChangedEvent">
+ <AccountHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==</AccountHandle>
+ <BuddyURI>sip:x9fFHFZjOTN6OESF1DUPrZQ==@bhr.vivox.com</BuddyURI>
+ <DisplayName>Monroe Tester</DisplayName>
+ <BuddyData />
+ <GroupID>0</GroupID>
+ <ChangeType>Set</ChangeType>
+ </Event>
+ */
+ // TODO: Question: Do we need to process this at all?
+ }
+ else if (!stricmp(eventTypeCstr, "MessageEvent"))
+ {
+ LLVivoxVoiceClient::getInstance()->messageEvent(sessionHandle, uriString, alias, messageHeader, messageBody, applicationString);
+ }
+ else if (!stricmp(eventTypeCstr, "SessionNotificationEvent"))
+ {
+ LLVivoxVoiceClient::getInstance()->sessionNotificationEvent(sessionHandle, uriString, notificationType);
+ }
+ else if (!stricmp(eventTypeCstr, "SubscriptionEvent"))
+ {
+ LLVivoxVoiceClient::getInstance()->subscriptionEvent(uriString, subscriptionHandle, alias, displayNameString, applicationString, subscriptionType);
+ }
+ else if (!stricmp(eventTypeCstr, "SessionUpdatedEvent"))
+ {
+ /*
+ <Event type="SessionUpdatedEvent">
+ <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg0</SessionGroupHandle>
+ <SessionHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==0</SessionHandle>
+ <Uri>sip:confctl-9@bhd.vivox.com</Uri>
+ <IsMuted>0</IsMuted>
+ <Volume>50</Volume>
+ <TransmitEnabled>1</TransmitEnabled>
+ <IsFocused>0</IsFocused>
+ <SpeakerPosition><Position><X>0</X><Y>0</Y><Z>0</Z></Position></SpeakerPosition>
+ <SessionFontID>0</SessionFontID>
+ </Event>
+ */
+ // We don't need to process this, but we also shouldn't warn on it, since that confuses people.
+ }
+
+ else if (!stricmp(eventTypeCstr, "SessionGroupRemovedEvent"))
+ {
+ /*
+ <Event type="SessionGroupRemovedEvent">
+ <SessionGroupHandle>c1_m1000xFnPP04IpREWNkuw1cOXlhw==_sg0</SessionGroupHandle>
+ </Event>
+ */
+ // We don't need to process this, but we also shouldn't warn on it, since that confuses people.
+ }
+ else
+ {
+ LL_WARNS("VivoxProtocolParser") << "Unknown event type " << eventTypeString << LL_ENDL;
+ }
+ }
+ else
+ {
+ const char *actionCstr = actionString.c_str();
+ if (!stricmp(actionCstr, "Connector.Create.1"))
+ {
+ LLVivoxVoiceClient::getInstance()->connectorCreateResponse(statusCode, statusString, connectorHandle, versionID);
+ }
+ else if (!stricmp(actionCstr, "Account.Login.1"))
+ {
+ LLVivoxVoiceClient::getInstance()->loginResponse(statusCode, statusString, accountHandle, numberOfAliases);
+ }
+ else if (!stricmp(actionCstr, "Session.Create.1"))
+ {
+ LLVivoxVoiceClient::getInstance()->sessionCreateResponse(requestId, statusCode, statusString, sessionHandle);
+ }
+ else if (!stricmp(actionCstr, "SessionGroup.AddSession.1"))
+ {
+ LLVivoxVoiceClient::getInstance()->sessionGroupAddSessionResponse(requestId, statusCode, statusString, sessionHandle);
+ }
+ else if (!stricmp(actionCstr, "Session.Connect.1"))
+ {
+ LLVivoxVoiceClient::getInstance()->sessionConnectResponse(requestId, statusCode, statusString);
+ }
+ else if (!stricmp(actionCstr, "Account.Logout.1"))
+ {
+ LLVivoxVoiceClient::getInstance()->logoutResponse(statusCode, statusString);
+ }
+ else if (!stricmp(actionCstr, "Connector.InitiateShutdown.1"))
+ {
+ LLVivoxVoiceClient::getInstance()->connectorShutdownResponse(statusCode, statusString);
+ }
+ else if (!stricmp(actionCstr, "Account.ListBlockRules.1"))
+ {
+ LLVivoxVoiceClient::getInstance()->accountListBlockRulesResponse(statusCode, statusString);
+ }
+ else if (!stricmp(actionCstr, "Account.ListAutoAcceptRules.1"))
+ {
+ LLVivoxVoiceClient::getInstance()->accountListAutoAcceptRulesResponse(statusCode, statusString);
+ }
+ else if (!stricmp(actionCstr, "Session.Set3DPosition.1"))
+ {
+ // We don't need to process these, but they're so spammy we don't want to log them.
+ squelchDebugOutput = true;
+ }
+ else if (!stricmp(actionCstr, "Account.GetSessionFonts.1"))
+ {
+ LLVivoxVoiceClient::getInstance()->accountGetSessionFontsResponse(statusCode, statusString);
+ }
+ else if (!stricmp(actionCstr, "Account.GetTemplateFonts.1"))
+ {
+ LLVivoxVoiceClient::getInstance()->accountGetTemplateFontsResponse(statusCode, statusString);
+ }
+ /*
+ else if (!stricmp(actionCstr, "Account.ChannelGetList.1"))
+ {
+ LLVoiceClient::getInstance()->channelGetListResponse(statusCode, statusString);
+ }
+ else if (!stricmp(actionCstr, "Connector.AccountCreate.1"))
+ {
+
+ }
+ else if (!stricmp(actionCstr, "Connector.MuteLocalMic.1"))
+ {
+
+ }
+ else if (!stricmp(actionCstr, "Connector.MuteLocalSpeaker.1"))
+ {
+
+ }
+ else if (!stricmp(actionCstr, "Connector.SetLocalMicVolume.1"))
+ {
+
+ }
+ else if (!stricmp(actionCstr, "Connector.SetLocalSpeakerVolume.1"))
+ {
+
+ }
+ else if (!stricmp(actionCstr, "Session.ListenerSetPosition.1"))
+ {
+
+ }
+ else if (!stricmp(actionCstr, "Session.SpeakerSetPosition.1"))
+ {
+
+ }
+ else if (!stricmp(actionCstr, "Session.AudioSourceSetPosition.1"))
+ {
+
+ }
+ else if (!stricmp(actionCstr, "Session.GetChannelParticipants.1"))
+ {
+
+ }
+ else if (!stricmp(actionCstr, "Account.ChannelCreate.1"))
+ {
+
+ }
+ else if (!stricmp(actionCstr, "Account.ChannelUpdate.1"))
+ {
+
+ }
+ else if (!stricmp(actionCstr, "Account.ChannelDelete.1"))
+ {
+
+ }
+ else if (!stricmp(actionCstr, "Account.ChannelCreateAndInvite.1"))
+ {
+
+ }
+ else if (!stricmp(actionCstr, "Account.ChannelFolderCreate.1"))
+ {
+
+ }
+ else if (!stricmp(actionCstr, "Account.ChannelFolderUpdate.1"))
+ {
+
+ }
+ else if (!stricmp(actionCstr, "Account.ChannelFolderDelete.1"))
+ {
+
+ }
+ else if (!stricmp(actionCstr, "Account.ChannelAddModerator.1"))
+ {
+
+ }
+ else if (!stricmp(actionCstr, "Account.ChannelDeleteModerator.1"))
+ {
+
+ }
+ */
+ }
+}
+
diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h
new file mode 100644
index 0000000000..f858f8f74e
--- /dev/null
+++ b/indra/newview/llvoicevivox.h
@@ -0,0 +1,1053 @@
+/**
+ * @file llvoicevivox.h
+ * @brief Declaration of LLDiamondwareVoiceClient class which is the interface to the voice client process.
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+#ifndef LL_VOICE_VIVOX_H
+#define LL_VOICE_VIVOX_H
+
+class LLVOAvatar;
+class LLVivoxProtocolParser;
+
+#include "lliopipe.h"
+#include "llpumpio.h"
+#include "llchainio.h"
+#include "lliosocket.h"
+#include "v3math.h"
+#include "llframetimer.h"
+#include "llviewerregion.h"
+#include "llcallingcard.h" // for LLFriendObserver
+
+#ifdef LL_STANDALONE
+# include "expat.h"
+#else
+# include "expat/expat.h"
+#endif
+#include "llvoiceclient.h"
+
+
+class LLVivoxVoiceAccountProvisionResponder;
+class LLVivoxVoiceClientMuteListObserver;
+class LLVivoxVoiceClientFriendsObserver;
+
+
+class LLVivoxVoiceClient : public LLSingleton<LLVivoxVoiceClient>,
+ virtual public LLVoiceModuleInterface,
+ virtual public LLVoiceEffectInterface
+{
+ LOG_CLASS(LLVivoxVoiceClient);
+public:
+ LLVivoxVoiceClient();
+ virtual ~LLVivoxVoiceClient();
+
+
+ /// @name LLVoiceModuleInterface virtual implementations
+ /// @see LLVoiceModuleInterface
+ //@{
+ virtual void init(LLPumpIO *pump); // Call this once at application startup (creates connector)
+ virtual void terminate(); // Call this to clean up during shutdown
+
+ virtual const LLVoiceVersionInfo& getVersion();
+
+ virtual void updateSettings(); // call after loading settings and whenever they change
+
+ // Returns true if vivox has successfully logged in and is not in error state
+ virtual bool isVoiceWorking() const;
+
+ /////////////////////
+ /// @name Tuning
+ //@{
+ virtual void tuningStart();
+ virtual void tuningStop();
+ virtual bool inTuningMode();
+
+ virtual void tuningSetMicVolume(float volume);
+ virtual void tuningSetSpeakerVolume(float volume);
+ virtual float tuningGetEnergy(void);
+ //@}
+
+ /////////////////////
+ /// @name Devices
+ //@{
+ // This returns true when it's safe to bring up the "device settings" dialog in the prefs.
+ // i.e. when the daemon is running and connected, and the device lists are populated.
+ virtual bool deviceSettingsAvailable();
+
+ // Requery the vivox daemon for the current list of input/output devices.
+ // If you pass true for clearCurrentList, deviceSettingsAvailable() will be false until the query has completed
+ // (use this if you want to know when it's done).
+ // If you pass false, you'll have no way to know when the query finishes, but the device lists will not appear empty in the interim.
+ virtual void refreshDeviceLists(bool clearCurrentList = true);
+
+ virtual void setCaptureDevice(const std::string& name);
+ virtual void setRenderDevice(const std::string& name);
+
+ virtual LLVoiceDeviceList& getCaptureDevices();
+ virtual LLVoiceDeviceList& getRenderDevices();
+ //@}
+
+ virtual void getParticipantList(std::set<LLUUID> &participants);
+ virtual bool isParticipant(const LLUUID& speaker_id);
+
+ // Send a text message to the specified user, initiating the session if necessary.
+ virtual BOOL sendTextMessage(const LLUUID& participant_id, const std::string& message);
+
+ // close any existing text IM session with the specified user
+ virtual void endUserIMSession(const LLUUID &uuid);
+
+ // Returns true if calling back the session URI after the session has closed is possible.
+ // Currently this will be false only for PSTN P2P calls.
+ // NOTE: this will return true if the session can't be found.
+ virtual BOOL isSessionCallBackPossible(const LLUUID &session_id);
+
+ // Returns true if the session can accepte text IM's.
+ // Currently this will be false only for PSTN P2P calls.
+ // NOTE: this will return true if the session can't be found.
+ virtual BOOL isSessionTextIMPossible(const LLUUID &session_id);
+
+
+ ////////////////////////////
+ /// @name Channel stuff
+ //@{
+ // returns true iff the user is currently in a proximal (local spatial) channel.
+ // Note that gestures should only fire if this returns true.
+ virtual bool inProximalChannel();
+
+ virtual void setNonSpatialChannel(const std::string &uri,
+ const std::string &credentials);
+
+ virtual void setSpatialChannel(const std::string &uri,
+ const std::string &credentials);
+
+ virtual void leaveNonSpatialChannel();
+
+ virtual void leaveChannel(void);
+
+ // Returns the URI of the current channel, or an empty string if not currently in a channel.
+ // NOTE that it will return an empty string if it's in the process of joining a channel.
+ virtual std::string getCurrentChannel();
+ //@}
+
+
+ //////////////////////////
+ /// @name invitations
+ //@{
+ // start a voice channel with the specified user
+ virtual void callUser(const LLUUID &uuid);
+ virtual bool isValidChannel(std::string &channelHandle);
+ virtual bool answerInvite(std::string &channelHandle);
+ virtual void declineInvite(std::string &channelHandle);
+ //@}
+
+ /////////////////////////
+ /// @name Volume/gain
+ //@{
+ virtual void setVoiceVolume(F32 volume);
+ virtual void setMicGain(F32 volume);
+ //@}
+
+ /////////////////////////
+ /// @name enable disable voice and features
+ //@{
+ virtual bool voiceEnabled();
+ virtual void setVoiceEnabled(bool enabled);
+ virtual BOOL lipSyncEnabled();
+ virtual void setLipSyncEnabled(BOOL enabled);
+ virtual void setMuteMic(bool muted); // Use this to mute the local mic (for when the client is minimized, etc), ignoring user PTT state.
+ //@}
+
+ ////////////////////////
+ /// @name PTT
+ //@{
+ virtual void setUserPTTState(bool ptt);
+ virtual bool getUserPTTState();
+ virtual void setUsePTT(bool usePTT);
+ virtual void setPTTIsToggle(bool PTTIsToggle);
+ virtual bool getPTTIsToggle();
+ virtual void inputUserControlState(bool down); // interpret any sort of up-down mic-open control input according to ptt-toggle prefs
+ virtual void toggleUserPTTState(void);
+
+ virtual void keyDown(KEY key, MASK mask);
+ virtual void keyUp(KEY key, MASK mask);
+ virtual void middleMouseState(bool down);
+ //@}
+
+ //////////////////////////
+ /// @name nearby speaker accessors
+ //@{
+ virtual BOOL getVoiceEnabled(const LLUUID& id); // true if we've received data for this avatar
+ virtual std::string getDisplayName(const LLUUID& id);
+ virtual BOOL isOnlineSIP(const LLUUID &id);
+ virtual BOOL isParticipantAvatar(const LLUUID &id);
+ virtual BOOL getIsSpeaking(const LLUUID& id);
+ virtual BOOL getIsModeratorMuted(const LLUUID& id);
+ virtual F32 getCurrentPower(const LLUUID& id); // "power" is related to "amplitude" in a defined way. I'm just not sure what the formula is...
+ virtual BOOL getOnMuteList(const LLUUID& id);
+ virtual F32 getUserVolume(const LLUUID& id);
+ virtual void setUserVolume(const LLUUID& id, F32 volume); // set's volume for specified agent, from 0-1 (where .5 is nominal)
+ //@}
+
+ // authorize the user
+ virtual void userAuthorized(const std::string& user_id,
+ const LLUUID &agentID);
+
+ //////////////////////////////
+ /// @name Status notification
+ //@{
+ virtual void addObserver(LLVoiceClientStatusObserver* observer);
+ virtual void removeObserver(LLVoiceClientStatusObserver* observer);
+ virtual void addObserver(LLFriendObserver* observer);
+ virtual void removeObserver(LLFriendObserver* observer);
+ virtual void addObserver(LLVoiceClientParticipantObserver* observer);
+ virtual void removeObserver(LLVoiceClientParticipantObserver* observer);
+ //@}
+
+ virtual std::string sipURIFromID(const LLUUID &id);
+ //@}
+
+ /// @name LLVoiceEffectInterface virtual implementations
+ /// @see LLVoiceEffectInterface
+ //@{
+
+ //////////////////////////
+ /// @name Accessors
+ //@{
+ virtual bool setVoiceEffect(const LLUUID& id);
+ virtual const LLUUID getVoiceEffect();
+ virtual LLSD getVoiceEffectProperties(const LLUUID& id);
+
+ virtual void refreshVoiceEffectLists(bool clear_lists);
+ virtual const voice_effect_list_t& getVoiceEffectList() const;
+ virtual const voice_effect_list_t& getVoiceEffectTemplateList() const;
+ //@}
+
+ //////////////////////////////
+ /// @name Status notification
+ //@{
+ virtual void addObserver(LLVoiceEffectObserver* observer);
+ virtual void removeObserver(LLVoiceEffectObserver* observer);
+ //@}
+
+ //////////////////////////////
+ /// @name Effect preview buffer
+ //@{
+ virtual void enablePreviewBuffer(bool enable);
+ virtual void recordPreviewBuffer();
+ virtual void playPreviewBuffer(const LLUUID& effect_id = LLUUID::null);
+ virtual void stopPreviewBuffer();
+
+ virtual bool isPreviewRecording();
+ virtual bool isPreviewPlaying();
+ //@}
+
+ //@}
+
+
+protected:
+ //////////////////////
+ // Vivox Specific definitions
+
+ friend class LLVivoxVoiceAccountProvisionResponder;
+ friend class LLVivoxVoiceClientMuteListObserver;
+ friend class LLVivoxVoiceClientFriendsObserver;
+
+ enum streamState
+ {
+ streamStateUnknown = 0,
+ streamStateIdle = 1,
+ streamStateConnected = 2,
+ streamStateRinging = 3,
+ };
+ struct participantState
+ {
+ public:
+ participantState(const std::string &uri);
+
+ bool updateMuteState(); // true if mute state has changed
+ bool isAvatar();
+
+ std::string mURI;
+ LLUUID mAvatarID;
+ std::string mAccountName;
+ std::string mDisplayName;
+ LLFrameTimer mSpeakingTimeout;
+ F32 mLastSpokeTimestamp;
+ F32 mPower;
+ F32 mVolume;
+ std::string mGroupID;
+ int mUserVolume;
+ bool mPTT;
+ bool mIsSpeaking;
+ bool mIsModeratorMuted;
+ bool mOnMuteList; // true if this avatar is on the user's mute list (and should be muted)
+ bool mVolumeSet; // true if incoming volume messages should not change the volume
+ bool mVolumeDirty; // true if this participant needs a volume command sent (either mOnMuteList or mUserVolume has changed)
+ bool mAvatarIDValid;
+ bool mIsSelf;
+ };
+
+ typedef std::map<const std::string, participantState*> participantMap;
+ typedef std::map<const LLUUID, participantState*> participantUUIDMap;
+
+ struct sessionState
+ {
+ public:
+ sessionState();
+ ~sessionState();
+
+ participantState *addParticipant(const std::string &uri);
+ // Note: after removeParticipant returns, the participant* that was passed to it will have been deleted.
+ // Take care not to use the pointer again after that.
+ void removeParticipant(participantState *participant);
+ void removeAllParticipants();
+
+ participantState *findParticipant(const std::string &uri);
+ participantState *findParticipantByID(const LLUUID& id);
+
+ bool isCallBackPossible();
+ bool isTextIMPossible();
+
+ std::string mHandle;
+ std::string mGroupHandle;
+ std::string mSIPURI;
+ std::string mAlias;
+ std::string mName;
+ std::string mAlternateSIPURI;
+ std::string mHash; // Channel password
+ std::string mErrorStatusString;
+ std::queue<std::string> mTextMsgQueue;
+
+ LLUUID mIMSessionID;
+ LLUUID mCallerID;
+ int mErrorStatusCode;
+ int mMediaStreamState;
+ int mTextStreamState;
+ bool mCreateInProgress; // True if a Session.Create has been sent for this session and no response has been received yet.
+ bool mMediaConnectInProgress; // True if a Session.MediaConnect has been sent for this session and no response has been received yet.
+ bool mVoiceInvitePending; // True if a voice invite is pending for this session (usually waiting on a name lookup)
+ bool mTextInvitePending; // True if a text invite is pending for this session (usually waiting on a name lookup)
+ bool mSynthesizedCallerID; // True if the caller ID is a hash of the SIP URI -- this means we shouldn't do a name lookup.
+ bool mIsChannel; // True for both group and spatial channels (false for p2p, PSTN)
+ bool mIsSpatial; // True for spatial channels
+ bool mIsP2P;
+ bool mIncoming;
+ bool mVoiceEnabled;
+ bool mReconnect; // Whether we should try to reconnect to this session if it's dropped
+
+ // Set to true when the volume/mute state of someone in the participant list changes.
+ // The code will have to walk the list to find the changed participant(s).
+ bool mVolumeDirty;
+ bool mMuteDirty;
+
+ bool mParticipantsChanged;
+ participantMap mParticipantsByURI;
+ participantUUIDMap mParticipantsByUUID;
+
+ LLUUID mVoiceFontID;
+ };
+
+ // internal state for a simple state machine. This is used to deal with the asynchronous nature of some of the messages.
+ // Note: if you change this list, please make corresponding changes to LLVivoxVoiceClient::state2string().
+ enum state
+ {
+ stateDisableCleanup,
+ stateDisabled, // Voice is turned off.
+ stateStart, // Class is initialized, socket is created
+ stateDaemonLaunched, // Daemon has been launched
+ stateConnecting, // connect() call has been issued
+ stateConnected, // connection to the daemon has been made, send some initial setup commands.
+ stateIdle, // socket is connected, ready for messaging
+ stateMicTuningStart,
+ stateMicTuningRunning,
+ stateMicTuningStop,
+ stateCaptureBufferPaused,
+ stateCaptureBufferRecStart,
+ stateCaptureBufferRecording,
+ stateCaptureBufferPlayStart,
+ stateCaptureBufferPlaying,
+ stateConnectorStart, // connector needs to be started
+ stateConnectorStarting, // waiting for connector handle
+ stateConnectorStarted, // connector handle received
+ stateLoginRetry, // need to retry login (failed due to changing password)
+ stateLoginRetryWait, // waiting for retry timer
+ stateNeedsLogin, // send login request
+ stateLoggingIn, // waiting for account handle
+ stateLoggedIn, // account handle received
+ stateVoiceFontsWait, // Awaiting the list of voice fonts
+ stateVoiceFontsReceived, // List of voice fonts received
+ stateCreatingSessionGroup, // Creating the main session group
+ stateNoChannel, //
+ stateJoiningSession, // waiting for session handle
+ stateSessionJoined, // session handle received
+ stateRunning, // in session, steady state
+ stateLeavingSession, // waiting for terminate session response
+ stateSessionTerminated, // waiting for terminate session response
+
+ stateLoggingOut, // waiting for logout response
+ stateLoggedOut, // logout response received
+ stateConnectorStopping, // waiting for connector stop
+ stateConnectorStopped, // connector stop received
+
+ // We go to this state if the login fails because the account needs to be provisioned.
+
+ // error states. No way to recover from these yet.
+ stateConnectorFailed,
+ stateConnectorFailedWaiting,
+ stateLoginFailed,
+ stateLoginFailedWaiting,
+ stateJoinSessionFailed,
+ stateJoinSessionFailedWaiting,
+
+ stateJail // Go here when all else has failed. Nothing will be retried, we're done.
+ };
+
+ typedef std::map<std::string, sessionState*> sessionMap;
+
+
+
+ ///////////////////////////////////////////////////////
+ // Private Member Functions
+ //////////////////////////////////////////////////////
+
+ //////////////////////////////
+ /// @name TVC/Server management and communication
+ //@{
+ // Call this if the connection to the daemon terminates unexpectedly. It will attempt to reset everything and relaunch.
+ void daemonDied();
+
+ // Call this if we're just giving up on voice (can't provision an account, etc.). It will clean up and go away.
+ void giveUp();
+
+ // write to the tvc
+ bool writeString(const std::string &str);
+
+ void connectorCreate();
+ void connectorShutdown();
+ void closeSocket(void);
+
+ void requestVoiceAccountProvision(S32 retries = 3);
+ void login(
+ const std::string& account_name,
+ const std::string& password,
+ const std::string& voice_sip_uri_hostname,
+ const std::string& voice_account_server_uri);
+ void loginSendMessage();
+ void logout();
+ void logoutSendMessage();
+
+
+ //@}
+
+ //------------------------------------
+ // tuning
+
+ void tuningRenderStartSendMessage(const std::string& name, bool loop);
+ void tuningRenderStopSendMessage();
+
+ void tuningCaptureStartSendMessage(int duration);
+ void tuningCaptureStopSendMessage();
+
+ //----------------------------------
+ // devices
+ void clearCaptureDevices();
+ void addCaptureDevice(const std::string& name);
+ void clearRenderDevices();
+ void addRenderDevice(const std::string& name);
+ void buildSetAudioDevices(std::ostringstream &stream);
+
+ void getCaptureDevicesSendMessage();
+ void getRenderDevicesSendMessage();
+
+ // local audio updates
+ void buildLocalAudioUpdates(std::ostringstream &stream);
+
+
+ /////////////////////////////
+ // Response/Event handlers
+ void connectorCreateResponse(int statusCode, std::string &statusString, std::string &connectorHandle, std::string &versionID);
+ void loginResponse(int statusCode, std::string &statusString, std::string &accountHandle, int numberOfAliases);
+ void sessionCreateResponse(std::string &requestId, int statusCode, std::string &statusString, std::string &sessionHandle);
+ void sessionGroupAddSessionResponse(std::string &requestId, int statusCode, std::string &statusString, std::string &sessionHandle);
+ void sessionConnectResponse(std::string &requestId, int statusCode, std::string &statusString);
+ void logoutResponse(int statusCode, std::string &statusString);
+ void connectorShutdownResponse(int statusCode, std::string &statusString);
+
+ void accountLoginStateChangeEvent(std::string &accountHandle, int statusCode, std::string &statusString, int state);
+ void mediaCompletionEvent(std::string &sessionGroupHandle, std::string &mediaCompletionType);
+ void mediaStreamUpdatedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, int statusCode, std::string &statusString, int state, bool incoming);
+ void textStreamUpdatedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, bool enabled, int state, bool incoming);
+ void sessionAddedEvent(std::string &uriString, std::string &alias, std::string &sessionHandle, std::string &sessionGroupHandle, bool isChannel, bool incoming, std::string &nameString, std::string &applicationString);
+ void sessionGroupAddedEvent(std::string &sessionGroupHandle);
+ void sessionRemovedEvent(std::string &sessionHandle, std::string &sessionGroupHandle);
+ void participantAddedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, std::string &uriString, std::string &alias, std::string &nameString, std::string &displayNameString, int participantType);
+ void participantRemovedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, std::string &uriString, std::string &alias, std::string &nameString);
+ void participantUpdatedEvent(std::string &sessionHandle, std::string &sessionGroupHandle, std::string &uriString, std::string &alias, bool isModeratorMuted, bool isSpeaking, int volume, F32 energy);
+ void auxAudioPropertiesEvent(F32 energy);
+ void buddyPresenceEvent(std::string &uriString, std::string &alias, std::string &statusString, std::string &applicationString);
+ void messageEvent(std::string &sessionHandle, std::string &uriString, std::string &alias, std::string &messageHeader, std::string &messageBody, std::string &applicationString);
+ void sessionNotificationEvent(std::string &sessionHandle, std::string &uriString, std::string &notificationType);
+ void subscriptionEvent(std::string &buddyURI, std::string &subscriptionHandle, std::string &alias, std::string &displayName, std::string &applicationString, std::string &subscriptionType);
+
+ void buddyListChanged();
+ void muteListChanged();
+ void updateFriends(U32 mask);
+
+ /////////////////////////////
+ // Sending updates of current state
+ void updatePosition(void);
+ void setCameraPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot);
+ void setAvatarPosition(const LLVector3d &position, const LLVector3 &velocity, const LLMatrix3 &rot);
+ bool channelFromRegion(LLViewerRegion *region, std::string &name);
+
+ void setEarLocation(S32 loc);
+
+
+ /////////////////////////////
+ // Accessors for data related to nearby speakers
+
+ // MBW -- XXX -- Not sure how to get this data out of the TVC
+ BOOL getUsingPTT(const LLUUID& id);
+ std::string getGroupID(const LLUUID& id); // group ID if the user is in group chat (empty string if not applicable)
+
+ /////////////////////////////
+ BOOL getAreaVoiceDisabled(); // returns true if the area the avatar is in is speech-disabled.
+ // Use this to determine whether to show a "no speech" icon in the menu bar.
+
+
+ // PTT
+ void setPTTKey(std::string &key);
+
+ /////////////////////////////
+ // Recording controls
+ void recordingLoopStart(int seconds = 3600, int deltaFramesPerControlFrame = 200);
+ void recordingLoopSave(const std::string& filename);
+ void recordingStop();
+
+ // Playback controls
+ void filePlaybackStart(const std::string& filename);
+ void filePlaybackStop();
+ void filePlaybackSetPaused(bool paused);
+ void filePlaybackSetMode(bool vox = false, float speed = 1.0f);
+
+ participantState *findParticipantByID(const LLUUID& id);
+
+
+ ////////////////////////////////////////
+ // voice sessions.
+ typedef std::set<sessionState*> sessionSet;
+
+ typedef sessionSet::iterator sessionIterator;
+ sessionIterator sessionsBegin(void);
+ sessionIterator sessionsEnd(void);
+
+ sessionState *findSession(const std::string &handle);
+ sessionState *findSessionBeingCreatedByURI(const std::string &uri);
+ sessionState *findSession(const LLUUID &participant_id);
+ sessionState *findSessionByCreateID(const std::string &create_id);
+
+ sessionState *addSession(const std::string &uri, const std::string &handle = LLStringUtil::null);
+ void setSessionHandle(sessionState *session, const std::string &handle = LLStringUtil::null);
+ void setSessionURI(sessionState *session, const std::string &uri);
+ void deleteSession(sessionState *session);
+ void deleteAllSessions(void);
+
+ void verifySessionState(void);
+
+ void joinedAudioSession(sessionState *session);
+ void leftAudioSession(sessionState *session);
+
+ // This is called in several places where the session _may_ need to be deleted.
+ // It contains logic for whether to delete the session or keep it around.
+ void reapSession(sessionState *session);
+
+ // Returns true if the session seems to indicate we've moved to a region on a different voice server
+ bool sessionNeedsRelog(sessionState *session);
+
+
+ //////////////////////////////////////
+ // buddy list stuff, needed for SLIM later
+ struct buddyListEntry
+ {
+ buddyListEntry(const std::string &uri);
+ std::string mURI;
+ std::string mDisplayName;
+ LLUUID mUUID;
+ bool mOnlineSL;
+ bool mOnlineSLim;
+ bool mCanSeeMeOnline;
+ bool mHasBlockListEntry;
+ bool mHasAutoAcceptListEntry;
+ bool mNameResolved;
+ bool mInSLFriends;
+ bool mInVivoxBuddies;
+ bool mNeedsNameUpdate;
+ };
+
+ typedef std::map<std::string, buddyListEntry*> buddyListMap;
+
+ // This should be called when parsing a buddy list entry sent by SLVoice.
+ void processBuddyListEntry(const std::string &uri, const std::string &displayName);
+
+ buddyListEntry *addBuddy(const std::string &uri);
+ buddyListEntry *addBuddy(const std::string &uri, const std::string &displayName);
+ buddyListEntry *findBuddy(const std::string &uri);
+ buddyListEntry *findBuddy(const LLUUID &id);
+ buddyListEntry *findBuddyByDisplayName(const std::string &name);
+ void deleteBuddy(const std::string &uri);
+ void deleteAllBuddies(void);
+
+ void deleteAllBlockRules(void);
+ void addBlockRule(const std::string &blockMask, const std::string &presenceOnly);
+ void deleteAllAutoAcceptRules(void);
+ void addAutoAcceptRule(const std::string &autoAcceptMask, const std::string &autoAddAsBuddy);
+ void accountListBlockRulesResponse(int statusCode, const std::string &statusString);
+ void accountListAutoAcceptRulesResponse(int statusCode, const std::string &statusString);
+
+ /////////////////////////////
+ // session control messages
+
+ void accountListBlockRulesSendMessage();
+ void accountListAutoAcceptRulesSendMessage();
+
+ void sessionGroupCreateSendMessage();
+ void sessionCreateSendMessage(sessionState *session, bool startAudio = true, bool startText = false);
+ void sessionGroupAddSessionSendMessage(sessionState *session, bool startAudio = true, bool startText = false);
+ void sessionMediaConnectSendMessage(sessionState *session); // just joins the audio session
+ void sessionTextConnectSendMessage(sessionState *session); // just joins the text session
+ void sessionTerminateSendMessage(sessionState *session);
+ void sessionGroupTerminateSendMessage(sessionState *session);
+ void sessionMediaDisconnectSendMessage(sessionState *session);
+ void sessionTextDisconnectSendMessage(sessionState *session);
+
+ // Pokes the state machine to leave the audio session next time around.
+ void sessionTerminate();
+
+ // Pokes the state machine to shut down the connector and restart it.
+ void requestRelog();
+
+ // Does the actual work to get out of the audio session
+ void leaveAudioSession();
+
+ void lookupName(const LLUUID &id);
+ static void onAvatarNameLookup(const LLUUID& id, const std::string& first, const std::string& last, BOOL is_group);
+ void avatarNameResolved(const LLUUID &id, const std::string &name);
+
+ /////////////////////////////
+ // Voice fonts
+
+ void addVoiceFont(const S32 id,
+ const std::string &name,
+ const std::string &description,
+ const LLDate &expiration_date,
+ bool has_expired,
+ const S32 font_type,
+ const S32 font_status,
+ const bool template_font = false);
+ void accountGetSessionFontsResponse(int statusCode, const std::string &statusString);
+ void accountGetTemplateFontsResponse(int statusCode, const std::string &statusString);
+
+private:
+ LLVoiceVersionInfo mVoiceVersion;
+
+ state mState;
+ bool mSessionTerminateRequested;
+ bool mRelogRequested;
+ // Number of times (in a row) "stateJoiningSession" case for spatial channel is reached in stateMachine().
+ // The larger it is the greater is possibility there is a problem with connection to voice server.
+ // Introduced while fixing EXT-4313.
+ int mSpatialJoiningNum;
+
+ void setState(state inState);
+ state getState(void) { return mState; };
+ std::string state2string(state inState);
+
+ void stateMachine();
+ static void idle(void *user_data);
+
+ LLHost mDaemonHost;
+ LLSocket::ptr_t mSocket;
+ bool mConnected;
+
+
+ LLPumpIO *mPump;
+ friend class LLVivoxProtocolParser;
+
+ std::string mAccountName;
+ std::string mAccountPassword;
+ std::string mAccountDisplayName;
+
+ bool mTuningMode;
+ float mTuningEnergy;
+ std::string mTuningAudioFile;
+ int mTuningMicVolume;
+ bool mTuningMicVolumeDirty;
+ int mTuningSpeakerVolume;
+ bool mTuningSpeakerVolumeDirty;
+ state mTuningExitState; // state to return to when we leave tuning mode.
+
+ std::string mSpatialSessionURI;
+ std::string mSpatialSessionCredentials;
+
+ std::string mMainSessionGroupHandle; // handle of the "main" session group.
+
+ std::string mChannelName; // Name of the channel to be looked up
+ bool mAreaVoiceDisabled;
+ sessionState *mAudioSession; // Session state for the current audio session
+ bool mAudioSessionChanged; // set to true when the above pointer gets changed, so observers can be notified.
+
+ sessionState *mNextAudioSession; // Session state for the audio session we're trying to join
+
+// std::string mSessionURI; // URI of the session we're in.
+// std::string mSessionHandle; // returned by ?
+
+ S32 mCurrentParcelLocalID; // Used to detect parcel boundary crossings
+ std::string mCurrentRegionName; // Used to detect parcel boundary crossings
+
+ std::string mConnectorHandle; // returned by "Create Connector" message
+ std::string mAccountHandle; // returned by login message
+ int mNumberOfAliases;
+ U32 mCommandCookie;
+
+ std::string mVoiceAccountServerURI;
+ std::string mVoiceSIPURIHostName;
+
+ int mLoginRetryCount;
+
+ sessionMap mSessionsByHandle; // Active sessions, indexed by session handle. Sessions which are being initiated may not be in this map.
+ sessionSet mSessions; // All sessions, not indexed. This is the canonical session list.
+
+ bool mBuddyListMapPopulated;
+ bool mBlockRulesListReceived;
+ bool mAutoAcceptRulesListReceived;
+ buddyListMap mBuddyListMap;
+
+ LLVoiceDeviceList mCaptureDevices;
+ LLVoiceDeviceList mRenderDevices;
+
+ std::string mCaptureDevice;
+ std::string mRenderDevice;
+ bool mCaptureDeviceDirty;
+ bool mRenderDeviceDirty;
+
+ // This should be called when the code detects we have changed parcels.
+ // It initiates the call to the server that gets the parcel channel.
+ void parcelChanged();
+
+ void switchChannel(std::string uri = std::string(), bool spatial = true, bool no_reconnect = false, bool is_p2p = false, std::string hash = "");
+ void joinSession(sessionState *session);
+
+ std::string nameFromAvatar(LLVOAvatar *avatar);
+ std::string nameFromID(const LLUUID &id);
+ bool IDFromName(const std::string name, LLUUID &uuid);
+ std::string displayNameFromAvatar(LLVOAvatar *avatar);
+ std::string sipURIFromAvatar(LLVOAvatar *avatar);
+ std::string sipURIFromName(std::string &name);
+
+ // Returns the name portion of the SIP URI if the string looks vaguely like a SIP URI, or an empty string if not.
+ std::string nameFromsipURI(const std::string &uri);
+
+ bool inSpatialChannel(void);
+ std::string getAudioSessionURI();
+ std::string getAudioSessionHandle();
+
+ void sendPositionalUpdate(void);
+
+ void buildSetCaptureDevice(std::ostringstream &stream);
+ void buildSetRenderDevice(std::ostringstream &stream);
+
+ void clearAllLists();
+ void checkFriend(const LLUUID& id);
+ void sendFriendsListUpdates();
+
+ // start a text IM session with the specified user
+ // This will be asynchronous, the session may be established at a future time.
+ sessionState* startUserIMSession(const LLUUID& uuid);
+ void sendQueuedTextMessages(sessionState *session);
+
+ void enforceTether(void);
+
+ bool mSpatialCoordsDirty;
+
+ LLVector3d mCameraPosition;
+ LLVector3d mCameraRequestedPosition;
+ LLVector3 mCameraVelocity;
+ LLMatrix3 mCameraRot;
+
+ LLVector3d mAvatarPosition;
+ LLVector3 mAvatarVelocity;
+ LLMatrix3 mAvatarRot;
+
+ bool mPTTDirty;
+ bool mPTT;
+
+ bool mUsePTT;
+ bool mPTTIsMiddleMouse;
+ KEY mPTTKey;
+ bool mPTTIsToggle;
+ bool mUserPTTState;
+ bool mMuteMic;
+
+ // Set to true when the friends list is known to have changed.
+ bool mFriendsListDirty;
+
+ enum
+ {
+ earLocCamera = 0, // ear at camera
+ earLocAvatar, // ear at avatar
+ earLocMixed // ear at avatar location/camera direction
+ };
+
+ S32 mEarLocation;
+
+ bool mSpeakerVolumeDirty;
+ bool mSpeakerMuteDirty;
+ int mSpeakerVolume;
+
+ int mMicVolume;
+ bool mMicVolumeDirty;
+
+ bool mVoiceEnabled;
+ bool mWriteInProgress;
+ std::string mWriteString;
+ size_t mWriteOffset;
+
+ LLTimer mUpdateTimer;
+
+ BOOL mLipSyncEnabled;
+
+ typedef std::set<LLVoiceClientParticipantObserver*> observer_set_t;
+ observer_set_t mParticipantObservers;
+
+ void notifyParticipantObservers();
+
+ typedef std::set<LLVoiceClientStatusObserver*> status_observer_set_t;
+ status_observer_set_t mStatusObservers;
+
+ void notifyStatusObservers(LLVoiceClientStatusObserver::EStatusType status);
+
+ typedef std::set<LLFriendObserver*> friend_observer_set_t;
+ friend_observer_set_t mFriendObservers;
+ void notifyFriendObservers();
+
+ // Voice Fonts
+
+ void expireVoiceFonts();
+ void deleteVoiceFont(const LLUUID& id);
+ void deleteAllVoiceFonts();
+ void deleteVoiceFontTemplates();
+
+ S32 getVoiceFontIndex(const LLUUID& id) const;
+ S32 getVoiceFontTemplateIndex(const LLUUID& id) const;
+
+ void accountGetSessionFontsSendMessage();
+ void accountGetTemplateFontsSendMessage();
+ void sessionSetVoiceFontSendMessage(sessionState *session);
+
+ void notifyVoiceFontObservers();
+
+ typedef enum e_voice_font_type
+ {
+ VOICE_FONT_TYPE_NONE = 0,
+ VOICE_FONT_TYPE_ROOT = 1,
+ VOICE_FONT_TYPE_USER = 2,
+ VOICE_FONT_TYPE_UNKNOWN
+ } EVoiceFontType;
+
+ typedef enum e_voice_font_status
+ {
+ VOICE_FONT_STATUS_NONE = 0,
+ VOICE_FONT_STATUS_FREE = 1,
+ VOICE_FONT_STATUS_NOT_FREE = 2,
+ VOICE_FONT_STATUS_UNKNOWN
+ } EVoiceFontStatus;
+
+ struct voiceFontEntry
+ {
+ voiceFontEntry(LLUUID& id);
+ ~voiceFontEntry();
+
+ LLUUID mID;
+ S32 mFontIndex;
+ std::string mName;
+ LLDate mExpirationDate;
+ S32 mFontType;
+ S32 mFontStatus;
+ bool mIsNew;
+
+ LLFrameTimer mExpiryTimer;
+ LLFrameTimer mExpiryWarningTimer;
+ };
+
+ bool mVoiceFontsReceived;
+ bool mVoiceFontsNew;
+ bool mVoiceFontListDirty;
+ voice_effect_list_t mVoiceFontList;
+ voice_effect_list_t mVoiceFontTemplateList;
+
+ typedef std::map<const LLUUID, voiceFontEntry*> voice_font_map_t;
+ voice_font_map_t mVoiceFontMap;
+ voice_font_map_t mVoiceFontTemplateMap;
+
+ typedef std::set<LLVoiceEffectObserver*> voice_font_observer_set_t;
+ voice_font_observer_set_t mVoiceFontObservers;
+
+ LLFrameTimer mVoiceFontExpiryTimer;
+
+
+ // Audio capture buffer
+
+ void captureBufferRecordStartSendMessage();
+ void captureBufferRecordStopSendMessage();
+ void captureBufferPlayStartSendMessage(const LLUUID& voice_font_id = LLUUID::null);
+ void captureBufferPlayStopSendMessage();
+
+ bool mCaptureBufferMode; // Disconnected from voice channels while using the capture buffer.
+ bool mCaptureBufferRecording; // A voice sample is being captured.
+ bool mCaptureBufferRecorded; // A voice sample is captured in the buffer ready to play.
+ bool mCaptureBufferPlaying; // A voice sample is being played.
+
+ LLTimer mCaptureTimer;
+ LLUUID mPreviewVoiceFont;
+ LLUUID mPreviewVoiceFontLast;
+ S32 mPlayRequestCount;
+};
+
+/**
+ * @class LLVivoxProtocolParser
+ * @brief This class helps construct new LLIOPipe specializations
+ * @see LLIOPipe
+ *
+ * THOROUGH_DESCRIPTION
+ */
+class LLVivoxProtocolParser : public LLIOPipe
+{
+ LOG_CLASS(LLVivoxProtocolParser);
+public:
+ LLVivoxProtocolParser();
+ virtual ~LLVivoxProtocolParser();
+
+protected:
+ /* @name LLIOPipe virtual implementations
+ */
+ //@{
+ /**
+ * @brief Process the data in buffer
+ */
+ virtual EStatus process_impl(
+ const LLChannelDescriptors& channels,
+ buffer_ptr_t& buffer,
+ bool& eos,
+ LLSD& context,
+ LLPumpIO* pump);
+ //@}
+
+ std::string mInput;
+
+ // Expat control members
+ XML_Parser parser;
+ int responseDepth;
+ bool ignoringTags;
+ bool isEvent;
+ int ignoreDepth;
+
+ // Members for processing responses. The values are transient and only valid within a call to processResponse().
+ bool squelchDebugOutput;
+ int returnCode;
+ int statusCode;
+ std::string statusString;
+ std::string requestId;
+ std::string actionString;
+ std::string connectorHandle;
+ std::string versionID;
+ std::string accountHandle;
+ std::string sessionHandle;
+ std::string sessionGroupHandle;
+ std::string alias;
+ std::string applicationString;
+
+ // Members for processing events. The values are transient and only valid within a call to processResponse().
+ std::string eventTypeString;
+ int state;
+ std::string uriString;
+ bool isChannel;
+ bool incoming;
+ bool enabled;
+ std::string nameString;
+ std::string audioMediaString;
+ std::string deviceString;
+ std::string displayNameString;
+ int participantType;
+ bool isLocallyMuted;
+ bool isModeratorMuted;
+ bool isSpeaking;
+ int volume;
+ F32 energy;
+ std::string messageHeader;
+ std::string messageBody;
+ std::string notificationType;
+ bool hasText;
+ bool hasAudio;
+ bool hasVideo;
+ bool terminated;
+ std::string blockMask;
+ std::string presenceOnly;
+ std::string autoAcceptMask;
+ std::string autoAddAsBuddy;
+ int numberOfAliases;
+ std::string subscriptionHandle;
+ std::string subscriptionType;
+ S32 id;
+ std::string descriptionString;
+ LLDate expirationDate;
+ bool hasExpired;
+ S32 fontType;
+ S32 fontStatus;
+ std::string mediaCompletionType;
+
+ // Members for processing text between tags
+ std::string textBuffer;
+ bool accumulateText;
+
+ void reset();
+
+ void processResponse(std::string tag);
+
+ static void XMLCALL ExpatStartTag(void *data, const char *el, const char **attr);
+ static void XMLCALL ExpatEndTag(void *data, const char *el);
+ static void XMLCALL ExpatCharHandler(void *data, const XML_Char *s, int len);
+
+ void StartTag(const char *tag, const char **attr);
+ void EndTag(const char *tag);
+ void CharData(const char *buffer, int length);
+ LLDate expiryTimeStampToLLDate(const std::string& vivox_ts);
+};
+
+
+#endif //LL_VIVOX_VOICE_CLIENT_H
+
diff --git a/indra/newview/llvoinventorylistener.h b/indra/newview/llvoinventorylistener.h
index 335e867fca..1531e6e339 100644
--- a/indra/newview/llvoinventorylistener.h
+++ b/indra/newview/llvoinventorylistener.h
@@ -42,7 +42,7 @@ class LLVOInventoryListener
{
public:
virtual void inventoryChanged(LLViewerObject* object,
- InventoryObjectList* inventory,
+ LLInventoryObject::object_list_t* inventory,
S32 serial_num,
void* user_data) = 0;
diff --git a/indra/newview/llvopartgroup.cpp b/indra/newview/llvopartgroup.cpp
index 139d2fbd88..3ba4ecad0c 100644
--- a/indra/newview/llvopartgroup.cpp
+++ b/indra/newview/llvopartgroup.cpp
@@ -40,7 +40,7 @@
#include "message.h"
#include "v2math.h"
-#include "llagent.h"
+#include "llagentcamera.h"
#include "lldrawable.h"
#include "llface.h"
#include "llsky.h"
@@ -136,7 +136,7 @@ F32 LLVOPartGroup::getPartSize(S32 idx)
LLVector3 LLVOPartGroup::getCameraPosition() const
{
- return gAgent.getCameraPositionAgent();
+ return gAgentCamera.getCameraPositionAgent();
}
static LLFastTimer::DeclareTimer FTM_UPDATE_PARTICLES("Update Particles");
diff --git a/indra/newview/llvosky.cpp b/indra/newview/llvosky.cpp
index 0550ed770b..d73850cb49 100644
--- a/indra/newview/llvosky.cpp
+++ b/indra/newview/llvosky.cpp
@@ -41,6 +41,7 @@
#include "timing.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "lldrawable.h"
#include "llface.h"
#include "llcubemap.h"
@@ -357,7 +358,7 @@ LLVOSky::LLVOSky(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp)
mFace[i] = NULL;
}
- mCameraPosAgent = gAgent.getCameraPositionAgent();
+ mCameraPosAgent = gAgentCamera.getCameraPositionAgent();
mAtmHeight = ATM_HEIGHT;
mEarthCenter = LLVector3(mCameraPosAgent.mV[0], mCameraPosAgent.mV[1], -EARTH_RADIUS);
@@ -2034,7 +2035,7 @@ void LLVOSky::updateFog(const F32 distance)
const F32 water_height = gAgent.getRegion() ? gAgent.getRegion()->getWaterHeight() : 0.f;
// LLWorld::getInstance()->getWaterHeight();
- F32 camera_height = gAgent.getCameraPositionAgent().mV[2];
+ F32 camera_height = gAgentCamera.getCameraPositionAgent().mV[2];
F32 near_clip_height = LLViewerCamera::getInstance()->getAtAxis().mV[VZ] * LLViewerCamera::getInstance()->getNear();
camera_height += near_clip_height;
diff --git a/indra/newview/llvotextbubble.cpp b/indra/newview/llvotextbubble.cpp
index 75beab519e..428ef20006 100644
--- a/indra/newview/llvotextbubble.cpp
+++ b/indra/newview/llvotextbubble.cpp
@@ -84,6 +84,9 @@ BOOL LLVOTextBubble::isActive() const
BOOL LLVOTextBubble::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
{
+ static LLFastTimer::DeclareTimer ftm("Text Bubble");
+ LLFastTimer t(ftm);
+
F32 dt = mUpdateTimer.getElapsedTimeF32();
// Die after a few seconds.
if (dt > 1.5f)
diff --git a/indra/newview/llvotree.cpp b/indra/newview/llvotree.cpp
index 24f1c4bd24..eb5b6c6618 100644
--- a/indra/newview/llvotree.cpp
+++ b/indra/newview/llvotree.cpp
@@ -44,7 +44,7 @@
#include "material_codes.h"
#include "object_flags.h"
-#include "llagent.h"
+#include "llagentcamera.h"
#include "lldrawable.h"
#include "llface.h"
#include "llviewercamera.h"
@@ -66,12 +66,14 @@ const F32 LEAF_TOP = 1.0f;
const F32 LEAF_BOTTOM = 0.52f;
const F32 LEAF_WIDTH = 1.f;
-S32 LLVOTree::sLODVertexOffset[4];
-S32 LLVOTree::sLODVertexCount[4];
-S32 LLVOTree::sLODIndexOffset[4];
-S32 LLVOTree::sLODIndexCount[4];
-S32 LLVOTree::sLODSlices[4] = {10, 5, 4, 3};
-F32 LLVOTree::sLODAngles[4] = {30.f, 20.f, 15.f, 0.f};
+const S32 LLVOTree::sMAX_NUM_TREE_LOD_LEVELS = 4 ;
+
+S32 LLVOTree::sLODVertexOffset[sMAX_NUM_TREE_LOD_LEVELS];
+S32 LLVOTree::sLODVertexCount[sMAX_NUM_TREE_LOD_LEVELS];
+S32 LLVOTree::sLODIndexOffset[sMAX_NUM_TREE_LOD_LEVELS];
+S32 LLVOTree::sLODIndexCount[sMAX_NUM_TREE_LOD_LEVELS];
+S32 LLVOTree::sLODSlices[sMAX_NUM_TREE_LOD_LEVELS] = {10, 5, 4, 3};
+F32 LLVOTree::sLODAngles[sMAX_NUM_TREE_LOD_LEVELS] = {30.f, 20.f, 15.f, 0.00001f};
F32 LLVOTree::sTreeFactor = 1.f;
@@ -373,12 +375,11 @@ BOOL LLVOTree::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
}
}
- S32 trunk_LOD = 0;
+ S32 trunk_LOD = sMAX_NUM_TREE_LOD_LEVELS ;
F32 app_angle = getAppAngle()*LLVOTree::sTreeFactor;
- for (S32 j = 0; j < 4; j++)
+ for (S32 j = 0; j < sMAX_NUM_TREE_LOD_LEVELS; j++)
{
-
if (app_angle > LLVOTree::sLODAngles[j])
{
trunk_LOD = j;
@@ -444,17 +445,16 @@ void LLVOTree::setPixelAreaAndAngle(LLAgent &agent)
// Re-calculate mPixelArea accurately
// This should be the camera's center, as soon as we move to all region-local.
- LLVector3 relative_position = getPositionAgent() - agent.getCameraPositionAgent();
- F32 range = relative_position.length(); // ugh, square root
+ LLVector3 relative_position = getPositionAgent() - gAgentCamera.getCameraPositionAgent();
+ F32 range_squared = relative_position.lengthSquared() ;
F32 max_scale = mBillboardScale * getMaxScale();
F32 area = max_scale * (max_scale*mBillboardRatio);
// Compute pixels per meter at the given range
- F32 pixels_per_meter = LLViewerCamera::getInstance()->getViewHeightInPixels() /
- (tan(LLViewerCamera::getInstance()->getView()) * range);
+ F32 pixels_per_meter = LLViewerCamera::getInstance()->getViewHeightInPixels() / tan(LLViewerCamera::getInstance()->getView());
- mPixelArea = (pixels_per_meter) * (pixels_per_meter) * area;
+ mPixelArea = (pixels_per_meter) * (pixels_per_meter) * area / range_squared;
#if 0
// mAppAngle is a bit of voodoo;
// use the one calculated LLViewerObject::setPixelAreaAndAngle above
@@ -506,6 +506,13 @@ BOOL LLVOTree::updateGeometry(LLDrawable *drawable)
{
LLFastTimer ftm(FTM_UPDATE_TREE);
+ if(mTrunkLOD >= sMAX_NUM_TREE_LOD_LEVELS) //do not display the tree.
+ {
+ mReferenceBuffer = NULL ;
+ mDrawable->getFace(0)->mVertexBuffer = NULL ;
+ return TRUE ;
+ }
+
if (mReferenceBuffer.isNull() || mDrawable->getFace(0)->mVertexBuffer.isNull())
{
const F32 SRR3 = 0.577350269f; // sqrt(1/3)
@@ -523,7 +530,7 @@ BOOL LLVOTree::updateGeometry(LLDrawable *drawable)
face->mCenterAgent = getPositionAgent();
face->mCenterLocal = face->mCenterAgent;
- for (lod = 0; lod < 4; lod++)
+ for (lod = 0; lod < sMAX_NUM_TREE_LOD_LEVELS; lod++)
{
slices = sLODSlices[lod];
sLODVertexOffset[lod] = max_vertices;
@@ -700,7 +707,7 @@ BOOL LLVOTree::updateGeometry(LLDrawable *drawable)
// Generate the vertices
// Generate the indices
- for (lod = 0; lod < 4; lod++)
+ for (lod = 0; lod < sMAX_NUM_TREE_LOD_LEVELS; lod++)
{
slices = sLODSlices[lod];
F32 base_radius = 0.65f;
@@ -892,7 +899,6 @@ void LLVOTree::updateMesh()
S32 stop_depth = 0;
F32 alpha = 1.0;
-
U32 vert_count = 0;
U32 index_count = 0;
@@ -1141,7 +1147,7 @@ U32 LLVOTree::drawBranchPipeline(LLMatrix4& matrix, U16* indicesp, S32 trunk_LOD
glLoadMatrixf((F32*) scale_mat.mMatrix);
glDrawElements(GL_TRIANGLES, sLODIndexCount[trunk_LOD], GL_UNSIGNED_SHORT, indicesp + sLODIndexOffset[trunk_LOD]);
- gPipeline.addTrianglesDrawn(LEAF_INDICES/3);
+ gPipeline.addTrianglesDrawn(LEAF_INDICES);
stop_glerror();
ret += sLODIndexCount[trunk_LOD];
}
@@ -1191,7 +1197,7 @@ U32 LLVOTree::drawBranchPipeline(LLMatrix4& matrix, U16* indicesp, S32 trunk_LOD
glLoadMatrixf((F32*) scale_mat.mMatrix);
glDrawElements(GL_TRIANGLES, LEAF_INDICES, GL_UNSIGNED_SHORT, indicesp);
- gPipeline.addTrianglesDrawn(LEAF_INDICES/3);
+ gPipeline.addTrianglesDrawn(LEAF_INDICES);
stop_glerror();
ret += LEAF_INDICES;
}
@@ -1216,7 +1222,7 @@ U32 LLVOTree::drawBranchPipeline(LLMatrix4& matrix, U16* indicesp, S32 trunk_LOD
glLoadMatrixf((F32*) scale_mat.mMatrix);
glDrawElements(GL_TRIANGLES, LEAF_INDICES, GL_UNSIGNED_SHORT, indicesp);
- gPipeline.addTrianglesDrawn(LEAF_INDICES/3);
+ gPipeline.addTrianglesDrawn(LEAF_INDICES);
stop_glerror();
ret += LEAF_INDICES;
diff --git a/indra/newview/llvotree.h b/indra/newview/llvotree.h
index feac9e0675..036ad692b1 100644
--- a/indra/newview/llvotree.h
+++ b/indra/newview/llvotree.h
@@ -152,6 +152,7 @@ public:
};
static F32 sTreeFactor; // Tree level of detail factor
+ static const S32 sMAX_NUM_TREE_LOD_LEVELS ;
friend class LLDrawPoolTree;
protected:
diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp
index bfe38c14ba..24e2f745d4 100644
--- a/indra/newview/llvovolume.cpp
+++ b/indra/newview/llvovolume.cpp
@@ -192,6 +192,7 @@ LLVOVolume::LLVOVolume(const LLUUID &id, const LLPCode pcode, LLViewerRegion *re
mMediaImplList.resize(getNumTEs());
mLastFetchedMediaVersion = -1;
+ mIndexInTex = 0;
}
LLVOVolume::~LLVOVolume()
@@ -226,6 +227,11 @@ void LLVOVolume::markDead()
{
removeMediaImpl(i);
}
+
+ if (mSculptTexture.notNull())
+ {
+ mSculptTexture->removeVolume(this);
+ }
}
LLViewerObject::markDead();
@@ -363,7 +369,7 @@ U32 LLVOVolume::processUpdateMessage(LLMessageSystem *mesgsys,
S32 res2 = unpackTEMessage(*dp);
if (TEM_INVALID == res2)
{
- // Well, crap, there's something bogus in the data that we're unpacking.
+ // There's something bogus in the data that we're unpacking.
dp->dumpBufferToLog();
llwarns << "Flushing cache files" << llendl;
std::string mask;
@@ -597,6 +603,9 @@ BOOL LLVOVolume::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
{
LLViewerObject::idleUpdate(agent, world, time);
+ static LLFastTimer::DeclareTimer ftm("Volume");
+ LLFastTimer t(ftm);
+
if (mDead || mDrawable.isNull())
{
return TRUE;
@@ -618,6 +627,18 @@ BOOL LLVOVolume::idleUpdate(LLAgent &agent, LLWorld &world, const F64 &time)
mVolumeImpl->doIdleUpdate(agent, world, time);
}
+ const S32 MAX_ACTIVE_OBJECT_QUIET_FRAMES = 40;
+
+ if (mDrawable->isActive())
+ {
+ if (mDrawable->isRoot() &&
+ mDrawable->mQuietCount++ > MAX_ACTIVE_OBJECT_QUIET_FRAMES &&
+ (!mDrawable->getParent() || !mDrawable->getParent()->isActive()))
+ {
+ mDrawable->makeStatic();
+ }
+ }
+
return TRUE;
}
@@ -679,6 +700,7 @@ void LLVOVolume::updateTextureVirtualSize()
vsize = area;
imagep->setBoostLevel(LLViewerTexture::BOOST_HUD);
face->setPixelArea(area); // treat as full screen
+ face->setVirtualSize(vsize);
}
else
{
@@ -695,8 +717,7 @@ void LLVOVolume::updateTextureVirtualSize()
gPipeline.markRebuild(mDrawable, LLDrawable::REBUILD_TCOORD, FALSE);
}
}
-
- face->setVirtualSize(vsize);
+
if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_TEXTURE_AREA))
{
if (vsize < min_vsize) min_vsize = vsize;
@@ -725,7 +746,9 @@ void LLVOVolume::updateTextureVirtualSize()
{
LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
LLUUID id = sculpt_params->getSculptTexture();
- mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+
+ updateSculptTexture();
+
if (mSculptTexture.notNull())
{
mSculptTexture->setBoostLevel(llmax((S32)mSculptTexture->getBoostLevel(),
@@ -914,35 +937,56 @@ BOOL LLVOVolume::setVolume(const LLVolumeParams &volume_params, const S32 detail
{
mVolumeImpl->onSetVolume(volume_params, detail);
}
-
+
+ updateSculptTexture();
+
if (isSculpted())
{
- mSculptTexture = LLViewerTextureManager::getFetchedTexture(volume_params.getSculptID(), TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+ updateSculptTexture();
+
if (mSculptTexture.notNull())
{
- //ignore sculpt GL usage since bao fixed this in a separate branch
- if (!gGLActive)
- {
- gGLActive = TRUE;
- sculpt();
- gGLActive = FALSE;
- }
- else
- {
- sculpt();
- }
+ sculpt();
}
}
- else
- {
- mSculptTexture = NULL;
- }
return TRUE;
}
return FALSE;
}
+void LLVOVolume::updateSculptTexture()
+{
+ LLPointer<LLViewerFetchedTexture> old_sculpt = mSculptTexture;
+
+ if (isSculpted())
+ {
+ LLSculptParams *sculpt_params = (LLSculptParams *)getParameterEntry(LLNetworkData::PARAMS_SCULPT);
+ LLUUID id = sculpt_params->getSculptTexture();
+ if (id.notNull())
+ {
+ mSculptTexture = LLViewerTextureManager::getFetchedTexture(id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE);
+ }
+ }
+ else
+ {
+ mSculptTexture = NULL;
+ }
+
+ if (mSculptTexture != old_sculpt)
+ {
+ if (old_sculpt.notNull())
+ {
+ old_sculpt->removeVolume(this);
+ }
+ if (mSculptTexture.notNull())
+ {
+ mSculptTexture->addVolume(this);
+ }
+ }
+
+}
+
// sculpt replaces generate() for sculpted surfaces
void LLVOVolume::sculpt()
{
@@ -983,6 +1027,8 @@ void LLVOVolume::sculpt()
if(!raw_image)
{
+ llassert(discard_level < 0) ;
+
sculpt_width = 0;
sculpt_height = 0;
sculpt_data = NULL ;
@@ -1006,6 +1052,16 @@ void LLVOVolume::sculpt()
}
}
getVolume()->sculpt(sculpt_width, sculpt_height, sculpt_components, sculpt_data, discard_level);
+
+ //notify rebuild any other VOVolumes that reference this sculpty volume
+ for (S32 i = 0; i < mSculptTexture->getNumVolumes(); ++i)
+ {
+ LLVOVolume* volume = (*(mSculptTexture->getVolumeList()))[i];
+ if (volume != this && volume->getVolume() == getVolume())
+ {
+ gPipeline.markRebuild(volume->mDrawable, LLDrawable::REBUILD_GEOMETRY, FALSE);
+ }
+ }
}
}
@@ -1035,7 +1091,7 @@ BOOL LLVOVolume::calcLOD()
S32 cur_detail = 0;
F32 radius = getVolume()->mLODScaleBias.scaledVec(getScale()).length();
- F32 distance = llmin(mDrawable->mDistanceWRTCamera, MAX_LOD_DISTANCE);
+ F32 distance = mDrawable->mDistanceWRTCamera; //llmin(mDrawable->mDistanceWRTCamera, MAX_LOD_DISTANCE);
distance *= sDistanceFactor;
F32 rampDist = LLVOVolume::sLODFactor * 2;
@@ -1359,7 +1415,7 @@ BOOL LLVOVolume::updateGeometry(LLDrawable *drawable)
return res;
}
- dirtySpatialGroup();
+ dirtySpatialGroup(drawable->isState(LLDrawable::IN_REBUILD_Q1));
BOOL compiled = FALSE;
@@ -1462,7 +1518,14 @@ void LLVOVolume::updateFaceSize(S32 idx)
else
{
const LLVolumeFace& vol_face = getVolume()->getVolumeFace(idx);
- facep->setSize(vol_face.mVertices.size(), vol_face.mIndices.size());
+ if (LLPipeline::sUseTriStrips)
+ {
+ facep->setSize(vol_face.mVertices.size(), vol_face.mTriStrip.size());
+ }
+ else
+ {
+ facep->setSize(vol_face.mVertices.size(), vol_face.mIndices.size());
+ }
}
}
@@ -1793,6 +1856,11 @@ void LLVOVolume::syncMediaData(S32 texture_index, const LLSD &media_data, bool m
}
LLTextureEntry *te = getTE(texture_index);
+ if(!te)
+ {
+ return ;
+ }
+
LL_DEBUGS("MediaOnAPrim") << "BEFORE: texture_index = " << texture_index
<< " hasMedia = " << te->hasMedia() << " : "
<< ((NULL == te->getMediaData()) ? "NULL MEDIA DATA" : ll_pretty_print_sd(te->getMediaData()->asLLSD())) << llendl;
@@ -1910,9 +1978,13 @@ bool LLVOVolume::hasMediaPermission(const LLMediaEntry* media_entry, MediaPermTy
}
// Group permissions
- else if (0 != (media_perms & LLMediaEntry::PERM_GROUP) && permGroupOwner())
+ else if (0 != (media_perms & LLMediaEntry::PERM_GROUP))
{
- return true;
+ LLPermissions* obj_perm = LLSelectMgr::getInstance()->findObjectPermissions(this);
+ if (obj_perm && gAgent.isInGroup(obj_perm->getGroup()))
+ {
+ return true;
+ }
}
// Owner permissions
@@ -3212,6 +3284,11 @@ void LLVolumeGeometryManager::registerFace(LLSpatialGroup* group, LLFace* facep,
draw_info->mExtents[0] = facep->mExtents[0];
draw_info->mExtents[1] = facep->mExtents[1];
validate_draw_info(*draw_info);
+
+ if (LLPipeline::sUseTriStrips)
+ {
+ draw_info->mDrawMode = LLRender::TRIANGLE_STRIP;
+ }
}
}
@@ -3225,7 +3302,6 @@ static LLFastTimer::DeclareTimer FTM_REBUILD_VBO("VBO Rebuilt");
void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
{
- llpushcallstacks ;
if (group->changeLOD())
{
group->mLastUpdateDistance = group->mDistance;
@@ -3296,7 +3372,7 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
drawablep->updateFaceSize(i);
LLFace* facep = drawablep->getFace(i);
- if (cur_total > max_total)
+ if (cur_total > max_total || facep->getIndicesCount() <= 0 || facep->getGeomCount() <= 0)
{
facep->mVertexBuffer = NULL;
facep->mLastVertexBuffer = NULL;
@@ -3456,8 +3532,8 @@ void LLVolumeGeometryManager::rebuildGeom(LLSpatialGroup* group)
static LLFastTimer::DeclareTimer FTM_VOLUME_GEOM("Volume Geometry");
void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
{
- llpushcallstacks ;
- if (group->isState(LLSpatialGroup::MESH_DIRTY) && !group->isState(LLSpatialGroup::GEOM_DIRTY))
+ llassert(group);
+ if (group && group->isState(LLSpatialGroup::MESH_DIRTY) && !group->isState(LLSpatialGroup::GEOM_DIRTY))
{
LLFastTimer tm(FTM_VOLUME_GEOM);
S32 num_mapped_veretx_buffer = LLVertexBuffer::sMappedCount ;
@@ -3511,9 +3587,9 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
}
// don't forget alpha
- if( group != NULL &&
- !group->mVertexBuffer.isNull() &&
- group->mVertexBuffer->isLocked())
+ if(group != NULL &&
+ !group->mVertexBuffer.isNull() &&
+ group->mVertexBuffer->isLocked())
{
group->mVertexBuffer->setBuffer(0);
}
@@ -3539,7 +3615,7 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
group->clearState(LLSpatialGroup::MESH_DIRTY | LLSpatialGroup::NEW_DRAWINFO);
}
- if (group->isState(LLSpatialGroup::NEW_DRAWINFO))
+ if (group && group->isState(LLSpatialGroup::NEW_DRAWINFO))
{
llerrs << "WTF?" << llendl;
}
@@ -3547,7 +3623,6 @@ void LLVolumeGeometryManager::rebuildMesh(LLSpatialGroup* group)
void LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, std::vector<LLFace*>& faces, BOOL distance_sort)
{
- llpushcallstacks ;
//calculate maximum number of vertices to store in a single buffer
U32 max_vertices = (gSavedSettings.getS32("RenderMaxVBOSize")*1024)/LLVertexBuffer::calcStride(group->mSpatialPartition->mVertexDataMask);
max_vertices = llmin(max_vertices, (U32) 65535);
diff --git a/indra/newview/llvovolume.h b/indra/newview/llvovolume.h
index a287d34402..a8bb597f93 100644
--- a/indra/newview/llvovolume.h
+++ b/indra/newview/llvovolume.h
@@ -179,8 +179,10 @@ public:
/*virtual*/ BOOL setMaterial(const U8 material);
void setTexture(const S32 face);
-
+ S32 getIndexInTex() const {return mIndexInTex ;}
/*virtual*/ BOOL setVolume(const LLVolumeParams &volume_params, const S32 detail, bool unique_volume = false);
+ void updateSculptTexture();
+ void setIndexInTex(S32 index) { mIndexInTex = index ;}
void sculpt();
void updateRelativeXform();
/*virtual*/ BOOL updateGeometry(LLDrawable *drawable);
@@ -303,7 +305,7 @@ private:
LLPointer<LLViewerFetchedTexture> mLightTexture;
media_list_t mMediaImplList;
S32 mLastFetchedMediaVersion; // as fetched from the server, starts as -1
-
+ S32 mIndexInTex;
// statics
public:
static F32 sLODSlopDistanceFactor;// Changing this to zero, effectively disables the LOD transition slop
diff --git a/indra/newview/llvowlsky.cpp b/indra/newview/llvowlsky.cpp
index 0272a2ab34..1749ccef94 100644
--- a/indra/newview/llvowlsky.cpp
+++ b/indra/newview/llvowlsky.cpp
@@ -519,7 +519,7 @@ void LLVOWLSky::drawDome(void)
LLRender::TRIANGLE_STRIP,
0, strips_segment->getRequestedVerts()-1, strips_segment->getRequestedIndices(),
0);
- gPipeline.addTrianglesDrawn(strips_segment->getRequestedIndices() - 2);
+ gPipeline.addTrianglesDrawn(strips_segment->getRequestedIndices(), LLRender::TRIANGLE_STRIP);
}
#else
diff --git a/indra/newview/llwaterparammanager.cpp b/indra/newview/llwaterparammanager.cpp
index 8be8f494da..436cd478b4 100644
--- a/indra/newview/llwaterparammanager.cpp
+++ b/indra/newview/llwaterparammanager.cpp
@@ -54,6 +54,7 @@
#include "llviewercontrol.h"
#include "lldrawpoolwater.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llviewerregion.h"
#include "llwlparammanager.h"
@@ -434,7 +435,7 @@ F32 LLWaterParamManager::getFogDensity(void)
// modify if we're underwater
const F32 water_height = gAgent.getRegion() ? gAgent.getRegion()->getWaterHeight() : 0.f;
- F32 camera_height = gAgent.getCameraPositionAgent().mV[2];
+ F32 camera_height = gAgentCamera.getCameraPositionAgent().mV[2];
if(camera_height <= water_height)
{
// raise it to the underwater fog density modifier
diff --git a/indra/newview/llwearable.cpp b/indra/newview/llwearable.cpp
index acfbc23f62..46c736c853 100644
--- a/indra/newview/llwearable.cpp
+++ b/indra/newview/llwearable.cpp
@@ -33,36 +33,64 @@
#include "llviewerprecompiledheaders.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llagentwearables.h"
-#include "llfloatercustomize.h"
+#include "lldictionary.h"
#include "lllocaltextureobject.h"
#include "llnotificationsutil.h"
#include "llviewertexturelist.h"
#include "llinventorymodel.h"
#include "llinventoryobserver.h"
+#include "llsidepanelappearance.h"
+#include "llsidetray.h"
+#include "lltexlayer.h"
+#include "lltexglobalcolor.h"
+#include "lltrans.h"
#include "llviewerregion.h"
+#include "llvisualparam.h"
#include "llvoavatar.h"
#include "llvoavatarself.h"
#include "llvoavatardefines.h"
#include "llwearable.h"
-#include "lldictionary.h"
-#include "lltrans.h"
-#include "lltexlayer.h"
-#include "llvisualparam.h"
-#include "lltexglobalcolor.h"
using namespace LLVOAvatarDefines;
// static
S32 LLWearable::sCurrentDefinitionVersion = 1;
+// support class - remove for 2.1 (hackity hack hack)
+class LLOverrideBakedTextureUpdate
+{
+public:
+ LLOverrideBakedTextureUpdate(bool temp_state)
+ {
+ U32 num_bakes = (U32) LLVOAvatarDefines::BAKED_NUM_INDICES;
+ for( U32 index = 0; index < num_bakes; ++index )
+ {
+ composite_enabled[index] = gAgentAvatarp->isCompositeUpdateEnabled(index);
+ }
+ gAgentAvatarp->setCompositeUpdatesEnabled(temp_state);
+ }
+
+ ~LLOverrideBakedTextureUpdate()
+ {
+ U32 num_bakes = (U32)LLVOAvatarDefines::BAKED_NUM_INDICES;
+ for( U32 index = 0; index < num_bakes; ++index )
+ {
+ gAgentAvatarp->setCompositeUpdatesEnabled(index, composite_enabled[index]);
+ }
+ }
+private:
+ bool composite_enabled[LLVOAvatarDefines::BAKED_NUM_INDICES];
+};
+
// Private local functions
static std::string terse_F32_to_string(F32 f);
static std::string asset_id_to_filename(const LLUUID &asset_id);
LLWearable::LLWearable(const LLTransactionID& transaction_id) :
mDefinitionVersion(LLWearable::sCurrentDefinitionVersion),
- mType(WT_INVALID)
+ mType(LLWearableType::WT_INVALID)
{
mTransactionID = transaction_id;
mAssetID = mTransactionID.makeAssetID(gAgent.getSecureSessionID());
@@ -70,7 +98,7 @@ LLWearable::LLWearable(const LLTransactionID& transaction_id) :
LLWearable::LLWearable(const LLAssetID& asset_id) :
mDefinitionVersion( LLWearable::sCurrentDefinitionVersion ),
- mType(WT_INVALID)
+ mType(LLWearableType::WT_INVALID)
{
mAssetID = asset_id;
mTransactionID.setNull();
@@ -82,17 +110,17 @@ LLWearable::~LLWearable()
const std::string& LLWearable::getTypeLabel() const
{
- return LLWearableDictionary::getTypeLabel(mType);
+ return LLWearableType::getTypeLabel(mType);
}
const std::string& LLWearable::getTypeName() const
{
- return LLWearableDictionary::getTypeName(mType);
+ return LLWearableType::getTypeName(mType);
}
LLAssetType::EType LLWearable::getAssetType() const
{
- return LLWearableDictionary::getAssetType(mType);
+ return LLWearableType::getAssetType(mType);
}
BOOL LLWearable::exportFile(LLFILE* file) const
@@ -176,10 +204,9 @@ BOOL LLWearable::exportFile(LLFILE* file) const
void LLWearable::createVisualParams()
{
- LLVOAvatar* avatar = gAgent.getAvatarObject();
- for (LLViewerVisualParam* param = (LLViewerVisualParam*) avatar->getFirstVisualParam();
+ for (LLViewerVisualParam* param = (LLViewerVisualParam*) gAgentAvatarp->getFirstVisualParam();
param;
- param = (LLViewerVisualParam*) avatar->getNextVisualParam())
+ param = (LLViewerVisualParam*) gAgentAvatarp->getNextVisualParam())
{
if (param->getWearableType() == mType)
{
@@ -199,7 +226,7 @@ void LLWearable::createVisualParams()
param->resetDrivenParams();
if(!param->linkDrivenParams(boost::bind(wearable_function,(LLWearable*)this, _1), false))
{
- if( !param->linkDrivenParams(boost::bind(avatar_function,(LLVOAvatarSelf*)avatar,_1 ), true))
+ if( !param->linkDrivenParams(boost::bind(avatar_function,gAgentAvatarp,_1 ), true))
{
llwarns << "could not link driven params for wearable " << getName() << " id: " << param->getID() << llendl;
continue;
@@ -216,6 +243,10 @@ BOOL LLWearable::importFile( LLFILE* file )
char text_buffer[2048]; /* Flawfinder: ignore */
S32 fields_read = 0;
+ // suppress texlayerset updates while wearables are being imported. Layersets will be updated
+ // when the wearables are "worn", not loaded. Note state will be restored when this object is destroyed.
+ LLOverrideBakedTextureUpdate stop_bakes(false);
+
// read header and version
fields_read = fscanf( file, "LLWearable version %d\n", &mDefinitionVersion );
if( fields_read != 1 )
@@ -334,13 +365,13 @@ BOOL LLWearable::importFile( LLFILE* file )
llwarns << "Bad Wearable asset: bad type" << llendl;
return FALSE;
}
- if( 0 <= type && type < WT_COUNT )
+ if( 0 <= type && type < LLWearableType::WT_COUNT )
{
- setType((EWearableType)type);
+ setType((LLWearableType::EType)type);
}
else
{
- mType = WT_COUNT;
+ mType = LLWearableType::WT_COUNT;
llwarns << "Bad Wearable asset: bad type #" << type << llendl;
return FALSE;
}
@@ -413,6 +444,9 @@ BOOL LLWearable::importFile( LLFILE* file )
delete mSavedTEMap[te];
}
+ image->setLoadedCallback(LLVOAvatarSelf::debugOnTimingLocalTexLoaded,0,TRUE,FALSE, new LLVOAvatarSelf::LLAvatarTexData(id, (LLVOAvatarDefines::ETextureIndex)te));
+
+
LLUUID textureid(text_buffer);
mTEMap[te] = new LLLocalTextureObject(image, textureid);
mSavedTEMap[te] = new LLLocalTextureObject(image, textureid);
@@ -431,12 +465,7 @@ BOOL LLWearable::importFile( LLFILE* file )
// since this wearable was created.
BOOL LLWearable::isOldVersion() const
{
- LLVOAvatar* avatar = gAgent.getAvatarObject();
- llassert( avatar );
- if( !avatar )
- {
- return FALSE;
- }
+ if (!isAgentAvatarValid()) return FALSE;
if( LLWearable::sCurrentDefinitionVersion < mDefinitionVersion )
{
@@ -450,9 +479,9 @@ BOOL LLWearable::isOldVersion() const
}
S32 param_count = 0;
- for( LLViewerVisualParam* param = (LLViewerVisualParam*) avatar->getFirstVisualParam();
+ for( LLViewerVisualParam* param = (LLViewerVisualParam*) gAgentAvatarp->getFirstVisualParam();
param;
- param = (LLViewerVisualParam*) avatar->getNextVisualParam() )
+ param = (LLViewerVisualParam*) gAgentAvatarp->getNextVisualParam() )
{
if( (param->getWearableType() == mType) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) )
{
@@ -498,17 +527,11 @@ BOOL LLWearable::isOldVersion() const
// only if those values are the same as the defaults.
BOOL LLWearable::isDirty() const
{
- LLVOAvatar* avatar = gAgent.getAvatarObject();
- llassert( avatar );
- if( !avatar )
- {
- return FALSE;
- }
+ if (!isAgentAvatarValid()) return FALSE;
-
- for( LLViewerVisualParam* param = (LLViewerVisualParam*) avatar->getFirstVisualParam();
+ for( LLViewerVisualParam* param = (LLViewerVisualParam*) gAgentAvatarp->getFirstVisualParam();
param;
- param = (LLViewerVisualParam*) avatar->getNextVisualParam() )
+ param = (LLViewerVisualParam*) gAgentAvatarp->getNextVisualParam() )
{
if( (param->getWearableType() == mType)
&& (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE )
@@ -555,28 +578,15 @@ BOOL LLWearable::isDirty() const
}
}
- //if( gFloaterCustomize )
- //{
- // if( mDescription != gFloaterCustomize->getWearableDescription( mType ) )
- // {
- // return TRUE;
- // }
- //}
-
return FALSE;
}
void LLWearable::setParamsToDefaults()
{
- LLVOAvatar* avatar = gAgent.getAvatarObject();
- llassert( avatar );
- if( !avatar )
- {
- return;
- }
+ if (!isAgentAvatarValid()) return;
- for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() )
+ for( LLVisualParam* param = gAgentAvatarp->getFirstVisualParam(); param; param = gAgentAvatarp->getNextVisualParam() )
{
if( (((LLViewerVisualParam*)param)->getWearableType() == mType ) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) )
{
@@ -612,18 +622,12 @@ void LLWearable::setTexturesToDefaults()
// Updates the user's avatar's appearance
void LLWearable::writeToAvatar()
{
- LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- llassert( avatar );
- if( !avatar )
- {
- llerrs << "could not get avatar object to write to for wearable " << this->getName() << llendl;
- return;
- }
+ if (!isAgentAvatarValid()) return;
- ESex old_sex = avatar->getSex();
+ ESex old_sex = gAgentAvatarp->getSex();
// Pull params
- for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() )
+ for( LLVisualParam* param = gAgentAvatarp->getFirstVisualParam(); param; param = gAgentAvatarp->getNextVisualParam() )
{
// cross-wearable parameters are not authoritative, as they are driven by a different wearable. So don't copy the values to the
// avatar object if cross wearable. Cross wearable params get their values from the avatar, they shouldn't write the other way.
@@ -632,7 +636,7 @@ void LLWearable::writeToAvatar()
S32 param_id = param->getID();
F32 weight = getVisualParamWeight(param_id);
- avatar->setVisualParamWeight( param_id, weight, FALSE );
+ gAgentAvatarp->setVisualParamWeight( param_id, weight, FALSE );
}
}
@@ -652,15 +656,15 @@ void LLWearable::writeToAvatar()
image_id = LLVOAvatarDictionary::getDefaultTextureImageID((ETextureIndex) te);
}
LLViewerTexture* image = LLViewerTextureManager::getFetchedTexture( image_id, TRUE, LLViewerTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE );
- // MULTI-WEARABLE: replace hard-coded 0
- avatar->setLocalTextureTE(te, image, 0);
+ // MULTI-WEARABLE: assume index 0 will be used when writing to avatar. TODO: eliminate the need for this.
+ gAgentAvatarp->setLocalTextureTE(te, image, 0);
}
}
- ESex new_sex = avatar->getSex();
+ ESex new_sex = gAgentAvatarp->getSex();
if( old_sex != new_sex )
{
- avatar->updateSexDependentLayerSets( FALSE );
+ gAgentAvatarp->updateSexDependentLayerSets( FALSE );
}
// if( upload_bake )
@@ -672,41 +676,36 @@ void LLWearable::writeToAvatar()
// Updates the user's avatar's appearance, replacing this wearables' parameters and textures with default values.
// static
-void LLWearable::removeFromAvatar( EWearableType type, BOOL upload_bake )
+void LLWearable::removeFromAvatar( LLWearableType::EType type, BOOL upload_bake )
{
- LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- llassert( avatar );
- if( !avatar )
- {
- return;
- }
+ if (!isAgentAvatarValid()) return;
// You can't just remove body parts.
- if( (type == WT_SHAPE) ||
- (type == WT_SKIN) ||
- (type == WT_HAIR) ||
- (type == WT_EYES) )
+ if( (type == LLWearableType::WT_SHAPE) ||
+ (type == LLWearableType::WT_SKIN) ||
+ (type == LLWearableType::WT_HAIR) ||
+ (type == LLWearableType::WT_EYES) )
{
return;
}
// Pull params
- for( LLVisualParam* param = avatar->getFirstVisualParam(); param; param = avatar->getNextVisualParam() )
+ for( LLVisualParam* param = gAgentAvatarp->getFirstVisualParam(); param; param = gAgentAvatarp->getNextVisualParam() )
{
if( (((LLViewerVisualParam*)param)->getWearableType() == type) && (param->getGroup() == VISUAL_PARAM_GROUP_TWEAKABLE ) )
{
S32 param_id = param->getID();
- avatar->setVisualParamWeight( param_id, param->getDefaultWeight(), upload_bake );
+ gAgentAvatarp->setVisualParamWeight( param_id, param->getDefaultWeight(), upload_bake );
}
}
- if( gFloaterCustomize )
+ if( gAgentCamera.cameraCustomizeAvatar() )
{
- gFloaterCustomize->setWearable(type, NULL, PERM_ALL, TRUE);
+ LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit"));
}
- avatar->updateVisualParams();
- avatar->wearableUpdated(type, TRUE);
+ gAgentAvatarp->updateVisualParams();
+ gAgentAvatarp->wearableUpdated(type, FALSE);
// if( upload_bake )
// {
@@ -718,12 +717,7 @@ void LLWearable::removeFromAvatar( EWearableType type, BOOL upload_bake )
// Definition version is current: removes obsolete enties and creates default values for new ones.
void LLWearable::copyDataFrom(const LLWearable* src)
{
- LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- llassert( avatar );
- if( !avatar )
- {
- return;
- }
+ if (!isAgentAvatarValid()) return;
mDefinitionVersion = LLWearable::sCurrentDefinitionVersion;
@@ -736,9 +730,9 @@ void LLWearable::copyDataFrom(const LLWearable* src)
mSavedVisualParamMap.clear();
// Deep copy of mVisualParamMap (copies only those params that are current, filling in defaults where needed)
- for( LLViewerVisualParam* param = (LLViewerVisualParam*) avatar->getFirstVisualParam();
+ for (LLViewerVisualParam* param = (LLViewerVisualParam*) gAgentAvatarp->getFirstVisualParam();
param;
- param = (LLViewerVisualParam*) avatar->getNextVisualParam() )
+ param = (LLViewerVisualParam*) gAgentAvatarp->getNextVisualParam() )
{
if( (param->getWearableType() == mType) )
{
@@ -750,7 +744,7 @@ void LLWearable::copyDataFrom(const LLWearable* src)
destroyTextures();
// Deep copy of mTEMap (copies only those tes that are current, filling in defaults where needed)
- for( S32 te = 0; te < TEX_NUM_INDICES; te++ )
+ for (S32 te = 0; te < TEX_NUM_INDICES; te++)
{
if (LLVOAvatarDictionary::getTEWearableType((ETextureIndex) te) == mType)
{
@@ -759,12 +753,12 @@ void LLWearable::copyDataFrom(const LLWearable* src)
LLViewerFetchedTexture *image = NULL;
if(iter != src->mTEMap.end())
{
- image = src->getConstLocalTextureObject(te)->getImage();
- image_id = src->getConstLocalTextureObject(te)->getID();
+ image = src->getLocalTextureObject(te)->getImage();
+ image_id = src->getLocalTextureObject(te)->getID();
mTEMap[te] = new LLLocalTextureObject(image, image_id);
mSavedTEMap[te] = new LLLocalTextureObject(image, image_id);
- mTEMap[te]->setBakedReady(src->getConstLocalTextureObject(te)->getBakedReady());
- mTEMap[te]->setDiscard(src->getConstLocalTextureObject(te)->getDiscard());
+ mTEMap[te]->setBakedReady(src->getLocalTextureObject(te)->getBakedReady());
+ mTEMap[te]->setDiscard(src->getLocalTextureObject(te)->getDiscard());
}
else
{
@@ -792,7 +786,7 @@ const LLUUID& LLWearable::getItemID() const
return mItemID;
}
-void LLWearable::setType(EWearableType type)
+void LLWearable::setType(LLWearableType::EType type)
{
mType = type;
createVisualParams();
@@ -809,7 +803,7 @@ LLLocalTextureObject* LLWearable::getLocalTextureObject(S32 index)
return NULL;
}
-const LLLocalTextureObject* LLWearable::getConstLocalTextureObject(S32 index) const
+const LLLocalTextureObject* LLWearable::getLocalTextureObject(S32 index) const
{
te_map_t::const_iterator iter = mTEMap.find(index);
if( iter != mTEMap.end() )
@@ -843,14 +837,12 @@ void LLWearable::addVisualParam(LLVisualParam *param)
void LLWearable::setVisualParams()
{
- LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
-
for (visual_param_index_map_t::const_iterator iter = mVisualParamIndexMap.begin(); iter != mVisualParamIndexMap.end(); iter++)
{
S32 id = iter->first;
LLVisualParam *wearable_param = iter->second;
F32 value = wearable_param->getWeight();
- avatar->setVisualParamWeight(id, value, FALSE);
+ gAgentAvatarp->setVisualParamWeight(id, value, FALSE);
}
}
@@ -978,9 +970,11 @@ void LLWearable::revertValues()
syncImages(mSavedTEMap, mTEMap);
- if( gFloaterCustomize )
+
+ LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLSideTray::getInstance()->getPanel("sidepanel_appearance"));
+ if( panel )
{
- gFloaterCustomize->updateScrollingPanelList(TRUE);
+ panel->updateScrollingPanelList();
}
}
@@ -991,9 +985,8 @@ BOOL LLWearable::isOnTop() const
void LLWearable::createLayers(S32 te)
{
- LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- LLTexLayerSet *layer_set = avatar->getLayerSet((ETextureIndex)te);
- if( layer_set )
+ LLTexLayerSet *layer_set = gAgentAvatarp->getLayerSet((ETextureIndex)te);
+ if (layer_set)
{
layer_set->cloneTemplates(mTEMap[te], (ETextureIndex)te, this);
}
@@ -1018,9 +1011,11 @@ void LLWearable::saveValues()
// Deep copy of mTEMap (copies only those tes that are current, filling in defaults where needed)
syncImages(mTEMap, mSavedTEMap);
- if( gFloaterCustomize )
+
+ LLSidepanelAppearance *panel = dynamic_cast<LLSidepanelAppearance*>(LLSideTray::getInstance()->getPanel("sidepanel_appearance"));
+ if( panel )
{
- gFloaterCustomize->updateScrollingPanelList(TRUE);
+ panel->updateScrollingPanelList();
}
}
@@ -1090,10 +1085,9 @@ void LLWearable::destroyTextures()
void LLWearable::pullCrossWearableValues()
{
// scan through all of the avatar's visual parameters
- LLVOAvatar* avatar = gAgent.getAvatarObject();
- for (LLViewerVisualParam* param = (LLViewerVisualParam*) avatar->getFirstVisualParam();
+ for (LLViewerVisualParam* param = (LLViewerVisualParam*) gAgentAvatarp->getFirstVisualParam();
param;
- param = (LLViewerVisualParam*) avatar->getNextVisualParam())
+ param = (LLViewerVisualParam*) gAgentAvatarp->getNextVisualParam())
{
if( param )
{
@@ -1125,7 +1119,7 @@ void LLWearable::refreshName()
struct LLWearableSaveData
{
- EWearableType mType;
+ LLWearableType::EType mType;
};
void LLWearable::saveNewAsset() const
@@ -1188,7 +1182,7 @@ void LLWearable::saveNewAsset() const
void LLWearable::onSaveNewAssetComplete(const LLUUID& new_asset_id, void* userdata, S32 status, LLExtStat ext_status) // StoreAssetData callback (fixed)
{
LLWearableSaveData* data = (LLWearableSaveData*)userdata;
- const std::string& type_name = LLWearableDictionary::getTypeName(data->mType);
+ const std::string& type_name = LLWearableType::getTypeName(data->mType);
if(0 == status)
{
// Success
@@ -1214,7 +1208,7 @@ void LLWearable::onSaveNewAssetComplete(const LLUUID& new_asset_id, void* userda
std::ostream& operator<<(std::ostream &s, const LLWearable &w)
{
- s << "wearable " << LLWearableDictionary::getTypeName(w.mType) << "\n";
+ s << "wearable " << LLWearableType::getTypeName(w.mType) << "\n";
s << " Name: " << w.mName << "\n";
s << " Desc: " << w.mDescription << "\n";
//w.mPermissions
diff --git a/indra/newview/llwearable.h b/indra/newview/llwearable.h
index 7bd5305079..6b6067fd27 100644
--- a/indra/newview/llwearable.h
+++ b/indra/newview/llwearable.h
@@ -38,7 +38,7 @@
#include "llpermissions.h"
#include "llsaleinfo.h"
#include "llassetstorage.h"
-#include "llwearabledictionary.h"
+#include "llwearabletype.h"
#include "llfile.h"
#include "lllocaltextureobject.h"
@@ -68,8 +68,8 @@ public:
const LLUUID& getItemID() const;
const LLAssetID& getAssetID() const { return mAssetID; }
const LLTransactionID& getTransactionID() const { return mTransactionID; }
- EWearableType getType() const { return mType; }
- void setType(EWearableType type);
+ LLWearableType::EType getType() const { return mType; }
+ void setType(LLWearableType::EType type);
const std::string& getName() const { return mName; }
void setName(const std::string& name) { mName = name; }
const std::string& getDescription() const { return mDescription; }
@@ -81,7 +81,6 @@ public:
const std::string& getTypeLabel() const;
const std::string& getTypeName() const;
LLAssetType::EType getAssetType() const;
- LLLocalTextureObject* getLocalTextureObject(S32 index) const;
S32 getDefinitionVersion() const { return mDefinitionVersion; }
void setDefinitionVersion( S32 new_version ) { mDefinitionVersion = new_version; }
@@ -93,7 +92,7 @@ public:
void writeToAvatar();
void removeFromAvatar( BOOL upload_bake ) { LLWearable::removeFromAvatar( mType, upload_bake ); }
- static void removeFromAvatar( EWearableType type, BOOL upload_bake );
+ static void removeFromAvatar( LLWearableType::EType type, BOOL upload_bake );
BOOL exportFile(LLFILE* file) const;
BOOL importFile(LLFILE* file);
@@ -112,7 +111,7 @@ public:
void setItemID(const LLUUID& item_id);
LLLocalTextureObject* getLocalTextureObject(S32 index);
- const LLLocalTextureObject* getConstLocalTextureObject(S32 index) const;
+ const LLLocalTextureObject* getLocalTextureObject(S32 index) const;
void setLocalTextureObject(S32 index, LLLocalTextureObject &lto);
void addVisualParam(LLVisualParam *param);
@@ -156,7 +155,7 @@ private:
LLSaleInfo mSaleInfo;
LLAssetID mAssetID;
LLTransactionID mTransactionID;
- EWearableType mType;
+ LLWearableType::EType mType;
typedef std::map<S32, F32> param_map_t;
param_map_t mSavedVisualParamMap; // last saved version of visual params
diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp
new file mode 100644
index 0000000000..9c308359fa
--- /dev/null
+++ b/indra/newview/llwearableitemslist.cpp
@@ -0,0 +1,768 @@
+/**
+ * @file llwearableitemslist.cpp
+ * @brief A flat list of wearable items.
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llwearableitemslist.h"
+
+#include "lliconctrl.h"
+
+#include "llagentwearables.h"
+#include "llappearancemgr.h"
+#include "llinventoryfunctions.h"
+#include "llmenugl.h" // for LLContextMenu
+#include "lltransutil.h"
+#include "llviewerattachmenu.h"
+#include "llvoavatarself.h"
+
+class LLFindOutfitItems : public LLInventoryCollectFunctor
+{
+public:
+ LLFindOutfitItems() {}
+ virtual ~LLFindOutfitItems() {}
+ virtual bool operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item);
+};
+
+bool LLFindOutfitItems::operator()(LLInventoryCategory* cat,
+ LLInventoryItem* item)
+{
+ if(item)
+ {
+ if((item->getType() == LLAssetType::AT_CLOTHING)
+ || (item->getType() == LLAssetType::AT_BODYPART)
+ || (item->getType() == LLAssetType::AT_OBJECT))
+ {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+void LLPanelWearableListItem::onMouseEnter(S32 x, S32 y, MASK mask)
+{
+ LLPanelInventoryListItemBase::onMouseEnter(x, y, mask);
+ setWidgetsVisible(true);
+ reshapeWidgets();
+}
+
+void LLPanelWearableListItem::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+ LLPanelInventoryListItemBase::onMouseLeave(x, y, mask);
+ setWidgetsVisible(false);
+ reshapeWidgets();
+}
+
+LLPanelWearableListItem::LLPanelWearableListItem(LLViewerInventoryItem* item)
+: LLPanelInventoryListItemBase(item)
+{
+}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+// static
+LLPanelWearableOutfitItem* LLPanelWearableOutfitItem::create(LLViewerInventoryItem* item)
+{
+ LLPanelWearableOutfitItem* list_item = NULL;
+ if (item)
+ {
+ list_item = new LLPanelWearableOutfitItem(item);
+ list_item->init();
+ }
+ return list_item;
+}
+
+LLPanelWearableOutfitItem::LLPanelWearableOutfitItem(LLViewerInventoryItem* item)
+: LLPanelInventoryListItemBase(item)
+{
+}
+
+// virtual
+void LLPanelWearableOutfitItem::updateItem(const std::string& name,
+ const LLStyle::Params& input_params)
+{
+ std::string search_label = name;
+ LLStyle::Params style_params = input_params;
+
+ if (mItem && get_is_item_worn(mItem->getUUID()))
+ {
+ search_label += LLTrans::getString("worn");
+ style_params.font.style("BOLD");
+ }
+
+ LLPanelInventoryListItemBase::updateItem(search_label, style_params);
+}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+// static
+LLPanelClothingListItem* LLPanelClothingListItem::create(LLViewerInventoryItem* item)
+{
+ LLPanelClothingListItem* list_item = NULL;
+ if(item)
+ {
+ list_item = new LLPanelClothingListItem(item);
+ list_item->init();
+ }
+ return list_item;
+}
+
+LLPanelClothingListItem::LLPanelClothingListItem(LLViewerInventoryItem* item)
+ : LLPanelDeletableWearableListItem(item)
+{
+}
+
+LLPanelClothingListItem::~LLPanelClothingListItem()
+{
+}
+
+void LLPanelClothingListItem::init()
+{
+ LLUICtrlFactory::getInstance()->buildPanel(this, "panel_clothing_list_item.xml");
+}
+
+BOOL LLPanelClothingListItem::postBuild()
+{
+ LLPanelDeletableWearableListItem::postBuild();
+
+ addWidgetToRightSide("btn_move_up");
+ addWidgetToRightSide("btn_move_down");
+ addWidgetToRightSide("btn_lock");
+ addWidgetToRightSide("btn_edit_panel");
+
+ setWidgetsVisible(false);
+ reshapeWidgets();
+
+ return TRUE;
+}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+// static
+LLPanelBodyPartsListItem* LLPanelBodyPartsListItem::create(LLViewerInventoryItem* item)
+{
+ LLPanelBodyPartsListItem* list_item = NULL;
+ if(item)
+ {
+ list_item = new LLPanelBodyPartsListItem(item);
+ list_item->init();
+ }
+ return list_item;
+}
+
+LLPanelBodyPartsListItem::LLPanelBodyPartsListItem(LLViewerInventoryItem* item)
+: LLPanelWearableListItem(item)
+{
+}
+
+LLPanelBodyPartsListItem::~LLPanelBodyPartsListItem()
+{
+}
+
+void LLPanelBodyPartsListItem::init()
+{
+ LLUICtrlFactory::getInstance()->buildPanel(this, "panel_body_parts_list_item.xml");
+}
+
+BOOL LLPanelBodyPartsListItem::postBuild()
+{
+ LLPanelInventoryListItemBase::postBuild();
+
+ addWidgetToRightSide("btn_lock");
+ addWidgetToRightSide("btn_edit_panel");
+
+ return TRUE;
+}
+
+
+// static
+LLPanelDeletableWearableListItem* LLPanelDeletableWearableListItem::create(LLViewerInventoryItem* item)
+{
+ LLPanelDeletableWearableListItem* list_item = NULL;
+ if(item)
+ {
+ list_item = new LLPanelDeletableWearableListItem(item);
+ list_item->init();
+ }
+ return list_item;
+}
+
+LLPanelDeletableWearableListItem::LLPanelDeletableWearableListItem(LLViewerInventoryItem* item)
+: LLPanelWearableListItem(item)
+{
+}
+
+void LLPanelDeletableWearableListItem::init()
+{
+ LLUICtrlFactory::getInstance()->buildPanel(this, "panel_deletable_wearable_list_item.xml");
+}
+
+BOOL LLPanelDeletableWearableListItem::postBuild()
+{
+ LLPanelWearableListItem::postBuild();
+
+ addWidgetToLeftSide("btn_delete");
+
+ LLButton* delete_btn = getChild<LLButton>("btn_delete");
+ // Reserve space for 'delete' button event if it is invisible.
+ setLeftWidgetsWidth(delete_btn->getRect().mRight);
+
+ setWidgetsVisible(false);
+ reshapeWidgets();
+
+ return TRUE;
+}
+
+
+// static
+LLPanelAttachmentListItem* LLPanelAttachmentListItem::create(LLViewerInventoryItem* item)
+{
+ LLPanelAttachmentListItem* list_item = NULL;
+ if(item)
+ {
+ list_item = new LLPanelAttachmentListItem(item);
+ list_item->init();
+ }
+ return list_item;
+}
+
+void LLPanelAttachmentListItem::setTitle(const std::string& title,
+ const std::string& highlit_text,
+ const LLStyle::Params& input_params)
+{
+ std::string title_joint = title;
+
+ if (mItem && isAgentAvatarValid() && gAgentAvatarp->isWearingAttachment(mItem->getLinkedUUID()))
+ {
+ std::string joint = LLTrans::getString(gAgentAvatarp->getAttachedPointName(mItem->getLinkedUUID()));
+ title_joint = title + " (" + joint + ")";
+ }
+
+ LLPanelDeletableWearableListItem::setTitle(title_joint, highlit_text, input_params);
+}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+LLPanelDummyClothingListItem* LLPanelDummyClothingListItem::create(LLWearableType::EType w_type)
+{
+ LLPanelDummyClothingListItem* list_item = new LLPanelDummyClothingListItem(w_type);
+ list_item->init();
+ return list_item;
+}
+
+BOOL LLPanelDummyClothingListItem::postBuild()
+{
+ LLIconCtrl* icon = getChild<LLIconCtrl>("item_icon");
+ setIconCtrl(icon);
+ setTitleCtrl(getChild<LLTextBox>("item_name"));
+
+ addWidgetToRightSide("btn_add_panel");
+
+ setIconImage(LLInventoryIcon::getIcon(LLAssetType::AT_CLOTHING, LLInventoryType::IT_NONE, mWearableType, FALSE));
+ updateItem(wearableTypeToString(mWearableType));
+
+ // Make it look loke clothing item - reserve space for 'delete' button
+ setLeftWidgetsWidth(icon->getRect().mLeft);
+
+ setWidgetsVisible(false);
+ reshapeWidgets();
+
+ return TRUE;
+}
+
+LLWearableType::EType LLPanelDummyClothingListItem::getWearableType() const
+{
+ return mWearableType;
+}
+
+LLPanelDummyClothingListItem::LLPanelDummyClothingListItem(LLWearableType::EType w_type)
+ : LLPanelWearableListItem(NULL)
+ , mWearableType(w_type)
+{
+}
+
+void LLPanelDummyClothingListItem::init()
+{
+ LLUICtrlFactory::getInstance()->buildPanel(this, "panel_dummy_clothing_list_item.xml");
+}
+
+typedef std::map<LLWearableType::EType, std::string> clothing_to_string_map_t;
+
+clothing_to_string_map_t init_clothing_string_map()
+{
+ clothing_to_string_map_t w_map;
+ w_map.insert(std::make_pair(LLWearableType::WT_SHIRT, "shirt_not_worn"));
+ w_map.insert(std::make_pair(LLWearableType::WT_PANTS, "pants_not_worn"));
+ w_map.insert(std::make_pair(LLWearableType::WT_SHOES, "shoes_not_worn"));
+ w_map.insert(std::make_pair(LLWearableType::WT_SOCKS, "socks_not_worn"));
+ w_map.insert(std::make_pair(LLWearableType::WT_JACKET, "jacket_not_worn"));
+ w_map.insert(std::make_pair(LLWearableType::WT_GLOVES, "gloves_not_worn"));
+ w_map.insert(std::make_pair(LLWearableType::WT_UNDERSHIRT, "undershirt_not_worn"));
+ w_map.insert(std::make_pair(LLWearableType::WT_UNDERPANTS, "underpants_not_worn"));
+ w_map.insert(std::make_pair(LLWearableType::WT_SKIRT, "skirt_not_worn"));
+ w_map.insert(std::make_pair(LLWearableType::WT_ALPHA, "alpha_not_worn"));
+ w_map.insert(std::make_pair(LLWearableType::WT_TATTOO, "tattoo_not_worn"));
+ return w_map;
+}
+
+std::string LLPanelDummyClothingListItem::wearableTypeToString(LLWearableType::EType w_type)
+{
+ static const clothing_to_string_map_t w_map = init_clothing_string_map();
+ static const std::string invalid_str = LLTrans::getString("invalid_not_worn");
+
+ std::string type_str = invalid_str;
+ clothing_to_string_map_t::const_iterator it = w_map.find(w_type);
+ if(w_map.end() != it)
+ {
+ type_str = LLTrans::getString(it->second);
+ }
+ return type_str;
+}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+/*virtual*/
+bool LLWearableItemNameComparator::doCompare(const LLPanelInventoryListItemBase* wearable_item1, const LLPanelInventoryListItemBase* wearable_item2) const
+{
+ std::string name1 = wearable_item1->getItemName();
+ std::string name2 = wearable_item2->getItemName();
+
+ LLStringUtil::toUpper(name1);
+ LLStringUtil::toUpper(name2);
+
+ return name1 < name2;
+}
+
+/*virtual*/
+bool LLWearableItemTypeNameComparator::doCompare(const LLPanelInventoryListItemBase* wearable_item1, const LLPanelInventoryListItemBase* wearable_item2) const
+{
+ const LLAssetType::EType item_type1 = wearable_item1->getType();
+ const LLAssetType::EType item_type2 = wearable_item2->getType();
+
+ LLWearableItemTypeNameComparator::ETypeListOrder item_type_order1 = getTypeListOrder(item_type1);
+ LLWearableItemTypeNameComparator::ETypeListOrder item_type_order2 = getTypeListOrder(item_type2);
+
+ if (item_type_order1 != item_type_order2)
+ {
+ // If items are of different asset types we can compare them
+ // by types order in the list.
+ return item_type_order1 < item_type_order2;
+ }
+
+ if (item_type_order1 & TLO_NOT_CLOTHING)
+ {
+ // If both items are of the same asset type except AT_CLOTHING
+ // we can compare them by name.
+ return LLWearableItemNameComparator::doCompare(wearable_item1, wearable_item2);
+ }
+
+ const LLWearableType::EType item_wearable_type1 = wearable_item1->getWearableType();
+ const LLWearableType::EType item_wearable_type2 = wearable_item2->getWearableType();
+
+ if (item_wearable_type1 != item_wearable_type2)
+ {
+ // If items are of different clothing types they are compared
+ // by clothing types order determined in LLWearableType::EType.
+ return item_wearable_type1 < item_wearable_type2;
+ }
+ else
+ {
+ // If both items are of the same clothing type they are compared
+ // by description and place in reverse order i.e. outer layer item
+ // on top.
+ return wearable_item1->getDescription() > wearable_item2->getDescription();
+ }
+}
+
+// static
+LLWearableItemTypeNameComparator::ETypeListOrder LLWearableItemTypeNameComparator::getTypeListOrder(LLAssetType::EType item_type)
+{
+ switch (item_type)
+ {
+ case LLAssetType::AT_OBJECT:
+ return TLO_ATTACHMENT;
+
+ case LLAssetType::AT_CLOTHING:
+ return TLO_CLOTHING;
+
+ case LLAssetType::AT_BODYPART:
+ return TLO_BODYPART;
+
+ default:
+ return TLO_UNKNOWN;
+ }
+}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+static const LLWearableItemTypeNameComparator WEARABLE_TYPE_NAME_COMPARATOR;
+
+static const LLDefaultChildRegistry::Register<LLWearableItemsList> r("wearable_items_list");
+
+LLWearableItemsList::Params::Params()
+: standalone("standalone", true)
+{}
+
+LLWearableItemsList::LLWearableItemsList(const LLWearableItemsList::Params& p)
+: LLInventoryItemsList(p)
+{
+ setComparator(&WEARABLE_TYPE_NAME_COMPARATOR);
+ mIsStandalone = p.standalone;
+ if (mIsStandalone)
+ {
+ // Use built-in context menu.
+ setRightMouseDownCallback(boost::bind(&LLWearableItemsList::onRightClick, this, _2, _3));
+ }
+}
+
+// virtual
+LLWearableItemsList::~LLWearableItemsList()
+{}
+
+// virtual
+void LLWearableItemsList::addNewItem(LLViewerInventoryItem* item, bool rearrange /*= true*/)
+{
+ if (!item)
+ {
+ llwarns << "No inventory item. Couldn't create flat list item." << llendl;
+ llassert(item != NULL);
+ }
+
+ LLPanelWearableOutfitItem *list_item = LLPanelWearableOutfitItem::create(item);
+ if (!list_item)
+ return;
+
+ bool is_item_added = addItem(list_item, item->getUUID(), ADD_BOTTOM, rearrange);
+ if (!is_item_added)
+ {
+ llwarns << "Couldn't add flat list item." << llendl;
+ llassert(is_item_added);
+ }
+}
+
+void LLWearableItemsList::updateList(const LLUUID& category_id)
+{
+ LLInventoryModel::cat_array_t cat_array;
+ LLInventoryModel::item_array_t item_array;
+
+ LLFindOutfitItems collector = LLFindOutfitItems();
+ // collectDescendentsIf takes non-const reference:
+ gInventory.collectDescendentsIf(
+ category_id,
+ cat_array,
+ item_array,
+ LLInventoryModel::EXCLUDE_TRASH,
+ collector);
+
+ refreshList(item_array);
+}
+
+void LLWearableItemsList::updateChangedItems(const LLInventoryModel::changed_items_t& changed_items_uuids)
+{
+ typedef std::vector<LLPanel*> item_panel_list_t;
+
+ item_panel_list_t items;
+ getItems(items);
+
+ for (item_panel_list_t::iterator items_iter = items.begin();
+ items_iter != items.end();
+ ++items_iter)
+ {
+ LLPanelInventoryListItemBase* item = dynamic_cast<LLPanelInventoryListItemBase*>(*items_iter);
+ if (!item) continue;
+
+ LLViewerInventoryItem* inv_item = item->getItem();
+ if (!inv_item) continue;
+
+ LLUUID linked_uuid = inv_item->getLinkedUUID();
+
+ for (LLInventoryModel::changed_items_t::const_iterator iter = changed_items_uuids.begin();
+ iter != changed_items_uuids.end();
+ ++iter)
+ {
+ if (linked_uuid == *iter)
+ {
+ item->setNeedsRefresh(true);
+ }
+ }
+ }
+}
+
+void LLWearableItemsList::onRightClick(S32 x, S32 y)
+{
+ uuid_vec_t selected_uuids;
+
+ getSelectedUUIDs(selected_uuids);
+ if (selected_uuids.empty())
+ {
+ return;
+ }
+
+ ContextMenu::instance().show(this, selected_uuids, x, y);
+}
+
+//////////////////////////////////////////////////////////////////////////
+/// ContextMenu
+//////////////////////////////////////////////////////////////////////////
+
+LLWearableItemsList::ContextMenu::ContextMenu()
+: mParent(NULL)
+{
+}
+
+void LLWearableItemsList::ContextMenu::show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y)
+{
+ mParent = dynamic_cast<LLWearableItemsList*>(spawning_view);
+ LLListContextMenu::show(spawning_view, uuids, x, y);
+ mParent = NULL; // to avoid dereferencing an invalid pointer
+}
+
+// virtual
+LLContextMenu* LLWearableItemsList::ContextMenu::createMenu()
+{
+ LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+ const uuid_vec_t& ids = mUUIDs; // selected items IDs
+ LLUUID selected_id = ids.front(); // ID of the first selected item
+
+ functor_t wear = boost::bind(&LLAppearanceMgr::wearItemOnAvatar, LLAppearanceMgr::getInstance(), _1, true, true);
+ functor_t add = boost::bind(&LLAppearanceMgr::wearItemOnAvatar, LLAppearanceMgr::getInstance(), _1, true, false);
+ functor_t take_off = boost::bind(&LLAppearanceMgr::removeItemFromAvatar, LLAppearanceMgr::getInstance(), _1);
+
+ // Register handlers common for all wearable types.
+ registrar.add("Wearable.Wear", boost::bind(handleMultiple, wear, ids));
+ registrar.add("Wearable.Add", boost::bind(handleMultiple, add, ids));
+ registrar.add("Wearable.Edit", boost::bind(handleMultiple, LLAgentWearables::editWearable, ids));
+ registrar.add("Wearable.CreateNew", boost::bind(createNewWearable, selected_id));
+ registrar.add("Wearable.ShowOriginal", boost::bind(show_item_original, selected_id));
+ registrar.add("Wearable.TakeOffDetach", boost::bind(handleMultiple, take_off, ids));
+
+ // Register handlers for clothing.
+ registrar.add("Clothing.TakeOff", boost::bind(handleMultiple, take_off, ids));
+
+ // Register handlers for body parts.
+
+ // Register handlers for attachments.
+ registrar.add("Attachment.Detach", boost::bind(handleMultiple, take_off, ids));
+ registrar.add("Attachment.Profile", boost::bind(show_item_profile, selected_id));
+ registrar.add("Object.Attach", boost::bind(LLViewerAttachMenu::attachObjects, ids, _2));
+
+ // Create the menu.
+ LLContextMenu* menu = createFromFile("menu_wearable_list_item.xml");
+
+ // Determine which items should be visible/enabled.
+ updateItemsVisibility(menu);
+
+ // Update labels for the items requiring that.
+ updateItemsLabels(menu);
+ return menu;
+}
+
+void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu)
+{
+ if (!menu)
+ {
+ llwarns << "Invalid menu" << llendl;
+ return;
+ }
+
+ const uuid_vec_t& ids = mUUIDs; // selected items IDs
+ U32 mask = 0; // mask of selected items' types
+ U32 n_items = ids.size(); // number of selected items
+ U32 n_worn = 0; // number of worn items among the selected ones
+ U32 n_links = 0; // number of links among the selected items
+ U32 n_editable = 0; // number of editable items among the selected ones
+
+ for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it)
+ {
+ LLUUID id = *it;
+ LLViewerInventoryItem* item = gInventory.getItem(id);
+
+ if (!item)
+ {
+ llwarns << "Invalid item" << llendl;
+ // *NOTE: the logic below may not work in this case
+ continue;
+ }
+
+ updateMask(mask, item->getType());
+
+ bool is_link = item->getIsLinkType();
+ bool is_worn = get_is_item_worn(id);
+ bool is_editable = gAgentWearables.isWearableModifiable(id);
+
+ if (is_worn)
+ {
+ ++n_worn;
+ }
+ if (is_editable)
+ {
+ ++n_editable;
+ }
+ if (is_link)
+ {
+ ++n_links;
+ }
+ } // for
+
+ bool standalone = mParent ? mParent->isStandalone() : false;
+
+ // *TODO: eliminate multiple traversals over the menu items
+ setMenuItemVisible(menu, "wear_add", mask == MASK_CLOTHING && n_worn == 0);
+ setMenuItemEnabled(menu, "wear_add", n_items == 1 && canAddWearable(ids.front()));
+ setMenuItemVisible(menu, "wear", n_worn == 0);
+ setMenuItemVisible(menu, "edit", !standalone && mask & (MASK_CLOTHING|MASK_BODYPART));
+ setMenuItemEnabled(menu, "edit", n_editable == 1 && n_worn == 1 && n_items == 1);
+ setMenuItemVisible(menu, "create_new", mask & (MASK_CLOTHING|MASK_BODYPART) && n_items == 1);
+ setMenuItemVisible(menu, "show_original", !standalone);
+ setMenuItemEnabled(menu, "show_original", n_items == 1 && n_links == n_items);
+ setMenuItemVisible(menu, "take_off", mask == MASK_CLOTHING && n_worn == n_items);
+ setMenuItemVisible(menu, "detach", mask == MASK_ATTACHMENT && n_worn == n_items);
+ setMenuItemVisible(menu, "take_off_or_detach", mask == (MASK_ATTACHMENT|MASK_CLOTHING));
+ setMenuItemEnabled(menu, "take_off_or_detach", n_worn == n_items);
+ setMenuItemVisible(menu, "object_profile", !standalone);
+ setMenuItemEnabled(menu, "object_profile", n_items == 1);
+
+ // Populate or hide the "Attach to..." / "Attach to HUD..." submenus.
+ if (mask == MASK_ATTACHMENT && n_worn == 0)
+ {
+ LLViewerAttachMenu::populateMenus("wearable_attach_to", "wearable_attach_to_hud");
+ }
+ else
+ {
+ setMenuItemVisible(menu, "wearable_attach_to", false);
+ setMenuItemVisible(menu, "wearable_attach_to_hud", false);
+ }
+
+ if (mask & MASK_UNKNOWN)
+ {
+ llwarns << "Non-wearable items passed." << llendl;
+ }
+}
+
+void LLWearableItemsList::ContextMenu::updateItemsLabels(LLContextMenu* menu)
+{
+ llassert(menu);
+ if (!menu) return;
+
+ // Set proper label for the "Create new <WEARABLE_TYPE>" menu item.
+ LLViewerInventoryItem* item = gInventory.getLinkedItem(mUUIDs.back());
+ if (!item || !item->isWearableType()) return;
+
+ LLStringUtil::format_map_t args;
+ LLWearableType::EType w_type = item->getWearableType();
+ args["[WEARABLE_TYPE]"] = LLWearableType::getTypeDefaultNewName(w_type);
+ std::string new_label = LLTrans::getString("CreateNewWearable", args);
+
+ LLMenuItemGL* menu_item = menu->getChild<LLMenuItemGL>("create_new");
+ menu_item->setLabel(new_label);
+}
+
+// We need this method to convert non-zero BOOL values to exactly 1 (TRUE).
+// Otherwise code relying on a BOOL value being TRUE may fail
+// (I experienced a weird assert in LLView::drawChildren() because of that.
+// static
+void LLWearableItemsList::ContextMenu::setMenuItemVisible(LLContextMenu* menu, const std::string& name, bool val)
+{
+ menu->setItemVisible(name, val);
+}
+
+// static
+void LLWearableItemsList::ContextMenu::setMenuItemEnabled(LLContextMenu* menu, const std::string& name, bool val)
+{
+ menu->setItemEnabled(name, val);
+}
+
+// static
+void LLWearableItemsList::ContextMenu::updateMask(U32& mask, LLAssetType::EType at)
+{
+ if (at == LLAssetType::AT_CLOTHING)
+ {
+ mask |= MASK_CLOTHING;
+ }
+ else if (at == LLAssetType::AT_BODYPART)
+ {
+ mask |= MASK_BODYPART;
+ }
+ else if (at == LLAssetType::AT_OBJECT)
+ {
+ mask |= MASK_ATTACHMENT;
+ }
+ else
+ {
+ mask |= MASK_UNKNOWN;
+ }
+}
+
+// static
+void LLWearableItemsList::ContextMenu::createNewWearable(const LLUUID& item_id)
+{
+ LLViewerInventoryItem* item = gInventory.getLinkedItem(item_id);
+ if (!item || !item->isWearableType()) return;
+
+ LLAgentWearables::createWearable(item->getWearableType(), true);
+}
+
+// Can we wear another wearable of the given item's wearable type?
+// static
+bool LLWearableItemsList::ContextMenu::canAddWearable(const LLUUID& item_id)
+{
+ if (!gAgentWearables.areWearablesLoaded())
+ {
+ return false;
+ }
+
+ LLViewerInventoryItem* item = gInventory.getItem(item_id);
+ if (!item || item->getType() != LLAssetType::AT_CLOTHING)
+ {
+ return false;
+ }
+
+ U32 wearable_count = gAgentWearables.getWearableCount(item->getWearableType());
+ return wearable_count < LLAgentWearables::MAX_CLOTHING_PER_TYPE;
+}
+
+// EOF
diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h
new file mode 100644
index 0000000000..5dc06284c3
--- /dev/null
+++ b/indra/newview/llwearableitemslist.h
@@ -0,0 +1,382 @@
+/**
+ * @file llwearableitemslist.h
+ * @brief A flat list of wearable items.
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLWEARABLEITEMSLIST_H
+#define LL_LLWEARABLEITEMSLIST_H
+
+// libs
+#include "llpanel.h"
+#include "llsingleton.h"
+
+// newview
+#include "llinventoryitemslist.h"
+#include "llinventorymodel.h"
+#include "lllistcontextmenu.h"
+#include "llwearabletype.h"
+
+/**
+ * @class LLPanelWearableListItem
+ *
+ * Extends LLPanelInventoryListItemBase:
+ * - makes side widgets show on mouse_enter and hide on
+ * mouse_leave events.
+ * - provides callback for button clicks
+ */
+class LLPanelWearableListItem : public LLPanelInventoryListItemBase
+{
+ LOG_CLASS(LLPanelWearableListItem);
+public:
+
+ /**
+ * Shows buttons when mouse is over
+ */
+ /*virtual*/ void onMouseEnter(S32 x, S32 y, MASK mask);
+
+ /**
+ * Hides buttons when mouse is out
+ */
+ /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
+
+protected:
+
+ LLPanelWearableListItem(LLViewerInventoryItem* item);
+};
+
+/**
+ * @class LLPanelWearableOutfitItem
+ *
+ * Outfit item for "My Outfits" list.
+ * Extends LLPanelInventoryListItemBase with handling
+ * double click to wear the item.
+ */
+class LLPanelWearableOutfitItem : public LLPanelInventoryListItemBase
+{
+ LOG_CLASS(LLPanelWearableOutfitItem);
+public:
+ static LLPanelWearableOutfitItem* create(LLViewerInventoryItem* item);
+
+ /**
+ * Updates item name and (worn) suffix.
+ */
+ /*virtual*/ void updateItem(const std::string& name,
+ const LLStyle::Params& input_params = LLStyle::Params());
+
+protected:
+ LLPanelWearableOutfitItem(LLViewerInventoryItem* item);
+};
+
+class LLPanelDeletableWearableListItem : public LLPanelWearableListItem
+{
+ LOG_CLASS(LLPanelDeletableWearableListItem);
+public:
+
+ static LLPanelDeletableWearableListItem* create(LLViewerInventoryItem* item);
+
+ virtual ~LLPanelDeletableWearableListItem() {};
+
+ /*virtual*/ BOOL postBuild();
+
+ /**
+ * Make button visible during mouse over event.
+ */
+ inline void setShowDeleteButton(bool show) { setShowWidget("btn_delete", show); }
+
+protected:
+ LLPanelDeletableWearableListItem(LLViewerInventoryItem* item);
+
+ /*virtual*/ void init();
+};
+
+/** Outfit list item for an attachment */
+class LLPanelAttachmentListItem : public LLPanelDeletableWearableListItem
+{
+ LOG_CLASS(LLPanelAttachmentListItem);
+public:
+ static LLPanelAttachmentListItem* create(LLViewerInventoryItem* item);
+ virtual ~LLPanelAttachmentListItem() {};
+
+ /** Set item title. Joint name is added to the title in parenthesis */
+ /*virtual*/ void setTitle(const std::string& title,
+ const std::string& highlit_text,
+ const LLStyle::Params& input_params = LLStyle::Params());
+
+protected:
+ LLPanelAttachmentListItem(LLViewerInventoryItem* item) : LLPanelDeletableWearableListItem(item) {};
+};
+
+/**
+ * @class LLPanelClothingListItem
+ *
+ * Provides buttons for editing, moving, deleting a wearable.
+ */
+class LLPanelClothingListItem : public LLPanelDeletableWearableListItem
+{
+ LOG_CLASS(LLPanelClothingListItem);
+public:
+
+ static LLPanelClothingListItem* create(LLViewerInventoryItem* item);
+
+ virtual ~LLPanelClothingListItem();
+
+ /*virtual*/ BOOL postBuild();
+
+ /**
+ * Make button visible during mouse over event.
+ */
+ inline void setShowMoveUpButton(bool show) { setShowWidget("btn_move_up", show); }
+
+ inline void setShowMoveDownButton(bool show) { setShowWidget("btn_move_down", show); }
+ inline void setShowLockButton(bool show) { setShowWidget("btn_lock", show); }
+ inline void setShowEditButton(bool show) { setShowWidget("btn_edit_panel", show); }
+
+
+protected:
+
+ LLPanelClothingListItem(LLViewerInventoryItem* item);
+
+ /*virtual*/ void init();
+};
+
+class LLPanelBodyPartsListItem : public LLPanelWearableListItem
+{
+ LOG_CLASS(LLPanelBodyPartsListItem);
+public:
+
+ static LLPanelBodyPartsListItem* create(LLViewerInventoryItem* item);
+
+ virtual ~LLPanelBodyPartsListItem();
+
+ /*virtual*/ BOOL postBuild();
+
+ /**
+ * Make button visible during mouse over event.
+ */
+ inline void setShowLockButton(bool show) { setShowWidget("btn_lock", show); }
+ inline void setShowEditButton(bool show) { setShowWidget("btn_edit_panel", show); }
+
+protected:
+ LLPanelBodyPartsListItem(LLViewerInventoryItem* item);
+
+ /*virtual*/ void init();
+};
+
+
+/**
+ * @class LLPanelDummyClothingListItem
+ *
+ * A dummy item panel - displays grayed clothing icon, grayed title '<clothing> not worn' and 'add' button
+ */
+class LLPanelDummyClothingListItem : public LLPanelWearableListItem
+{
+public:
+ static LLPanelDummyClothingListItem* create(LLWearableType::EType w_type);
+
+ /*virtual*/ BOOL postBuild();
+ LLWearableType::EType getWearableType() const;
+
+protected:
+ LLPanelDummyClothingListItem(LLWearableType::EType w_type);
+
+ /*virtual*/ void init();
+
+ static std::string wearableTypeToString(LLWearableType::EType w_type);
+
+private:
+ LLWearableType::EType mWearableType;
+};
+
+/**
+ * @class LLWearableListItemComparator
+ *
+ * Abstract comparator of wearable list items.
+ */
+class LLWearableListItemComparator : public LLFlatListView::ItemComparator
+{
+ LOG_CLASS(LLWearableListItemComparator);
+
+public:
+ LLWearableListItemComparator() {};
+ virtual ~LLWearableListItemComparator() {};
+
+ virtual bool compare(const LLPanel* item1, const LLPanel* item2) const
+ {
+ const LLPanelInventoryListItemBase* wearable_item1 = dynamic_cast<const LLPanelInventoryListItemBase*>(item1);
+ const LLPanelInventoryListItemBase* wearable_item2 = dynamic_cast<const LLPanelInventoryListItemBase*>(item2);
+
+ if (!wearable_item1 || !wearable_item2)
+ {
+ llwarning("item1 and item2 cannot be null", 0);
+ return true;
+ }
+
+ return doCompare(wearable_item1, wearable_item2);
+ }
+
+protected:
+
+ /**
+ * Returns true if wearable_item1 < wearable_item2, false otherwise
+ * Implement this method in your particular comparator.
+ */
+ virtual bool doCompare(const LLPanelInventoryListItemBase* wearable_item1, const LLPanelInventoryListItemBase* wearable_item2) const = 0;
+};
+
+/**
+ * @class LLWearableItemNameComparator
+ *
+ * Comparator for sorting wearable list items by name.
+ */
+class LLWearableItemNameComparator : public LLWearableListItemComparator
+{
+ LOG_CLASS(LLWearableItemNameComparator);
+
+public:
+ LLWearableItemNameComparator() {};
+ virtual ~LLWearableItemNameComparator() {};
+
+protected:
+ /*virtual*/ bool doCompare(const LLPanelInventoryListItemBase* wearable_item1, const LLPanelInventoryListItemBase* wearable_item2) const;
+};
+
+/**
+ * @class LLWearableItemTypeNameComparator
+ *
+ * Comparator for sorting wearable list items by type and name.
+ */
+class LLWearableItemTypeNameComparator : public LLWearableItemNameComparator
+{
+ LOG_CLASS(LLWearableItemTypeNameComparator);
+
+public:
+ LLWearableItemTypeNameComparator() {};
+ virtual ~LLWearableItemTypeNameComparator() {};
+
+protected:
+ /**
+ * Returns "true" if wearable_item1 is placed before wearable_item2 sorted by the following:
+ * - Attachments (abc order)
+ * - Clothing
+ * - by type (types order determined in LLWearableType::EType)
+ * - outer layer on top
+ * - Body Parts (abc order),
+ * "false" otherwise.
+ */
+ /*virtual*/ bool doCompare(const LLPanelInventoryListItemBase* wearable_item1, const LLPanelInventoryListItemBase* wearable_item2) const;
+
+private:
+ enum ETypeListOrder
+ {
+ TLO_ATTACHMENT = 0x01,
+ TLO_CLOTHING = 0x02,
+ TLO_BODYPART = 0x04,
+ TLO_UNKNOWN = 0x08,
+
+ TLO_NOT_CLOTHING = TLO_ATTACHMENT | TLO_BODYPART | TLO_UNKNOWN
+ };
+
+ static LLWearableItemTypeNameComparator::ETypeListOrder getTypeListOrder(LLAssetType::EType item_type);
+};
+
+/**
+ * @class LLWearableItemsList
+ *
+ * A flat list of wearable inventory items.
+ * Collects all items that can be a part of an outfit from
+ * an inventory category specified by UUID and displays them
+ * as a flat list.
+ */
+class LLWearableItemsList : public LLInventoryItemsList
+{
+public:
+ /**
+ * Context menu.
+ *
+ * This menu is likely to be used from outside
+ * (e.g. for items selected across multiple wearable lists),
+ * so making it a singleton.
+ */
+ class ContextMenu : public LLListContextMenu, public LLSingleton<ContextMenu>
+ {
+ public:
+ ContextMenu();
+ /*virtual*/ void show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y);
+
+ protected:
+ enum {
+ MASK_CLOTHING = 0x01,
+ MASK_BODYPART = 0x02,
+ MASK_ATTACHMENT = 0x04,
+ MASK_UNKNOWN = 0x08,
+ };
+
+ /* virtual */ LLContextMenu* createMenu();
+ void updateItemsVisibility(LLContextMenu* menu);
+ void updateItemsLabels(LLContextMenu* menu);
+ static void setMenuItemVisible(LLContextMenu* menu, const std::string& name, bool val);
+ static void setMenuItemEnabled(LLContextMenu* menu, const std::string& name, bool val);
+ static void updateMask(U32& mask, LLAssetType::EType at);
+ static void createNewWearable(const LLUUID& item_id);
+ static bool canAddWearable(const LLUUID& item_id);
+
+ LLWearableItemsList* mParent;
+ };
+
+ struct Params : public LLInitParam::Block<Params, LLInventoryItemsList::Params>
+ {
+ Optional<bool> standalone;
+
+ Params();
+ };
+
+ virtual ~LLWearableItemsList();
+
+ /*virtual*/ void addNewItem(LLViewerInventoryItem* item, bool rearrange = true);
+
+ void updateList(const LLUUID& category_id);
+
+ /**
+ * Update items that match UUIDs from changed_items_uuids
+ * or links that point at such items.
+ */
+ void updateChangedItems(const LLInventoryModel::changed_items_t& changed_items_uuids);
+
+ bool isStandalone() const { return mIsStandalone; }
+
+protected:
+ friend class LLUICtrlFactory;
+ LLWearableItemsList(const LLWearableItemsList::Params& p);
+
+ void onRightClick(S32 x, S32 y);
+
+ bool mIsStandalone;
+};
+
+#endif //LL_LLWEARABLEITEMSLIST_H
diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp
index d6a9837b86..aedaeba42a 100644
--- a/indra/newview/llwearablelist.cpp
+++ b/indra/newview/llwearablelist.cpp
@@ -121,7 +121,7 @@ void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID
bool res = wearable->importFile( fp );
if (!res)
{
- if (wearable->getType() == WT_COUNT)
+ if (wearable->getType() == LLWearableType::WT_COUNT)
{
isNewWearable = TRUE;
}
@@ -228,15 +228,14 @@ LLWearable* LLWearableList::createCopy(const LLWearable* old_wearable, const std
return wearable;
}
-LLWearable* LLWearableList::createNewWearable( EWearableType type )
+LLWearable* LLWearableList::createNewWearable( LLWearableType::EType type )
{
lldebugs << "LLWearableList::createNewWearable()" << llendl;
LLWearable *wearable = generateNewWearable();
wearable->setType( type );
- std::string name = "New ";
- name.append( wearable->getTypeLabel() );
+ std::string name = LLTrans::getString( LLWearableType::getTypeDefaultNewName(wearable->getType()) );
wearable->setName( name );
LLPermissions perm;
diff --git a/indra/newview/llwearablelist.h b/indra/newview/llwearablelist.h
index cf1a9bddff..16ef11b8bd 100644
--- a/indra/newview/llwearablelist.h
+++ b/indra/newview/llwearablelist.h
@@ -39,6 +39,12 @@
#include "llassetstorage.h"
// Globally constructed; be careful that there's no dependency with gAgent.
+/*
+ BUG: mList's system of mapping between assetIDs and wearables is flawed
+ since LLWearable* has an associated itemID, and you can have multiple
+ inventory items pointing to the same asset (i.e. more than one ItemID
+ per assetID). EXT-6252
+*/
class LLWearableList : public LLSingleton<LLWearableList>
{
public:
@@ -55,7 +61,7 @@ public:
void* userdata);
LLWearable* createCopy(const LLWearable* old_wearable, const std::string& new_name = std::string());
- LLWearable* createNewWearable(EWearableType type);
+ LLWearable* createNewWearable(LLWearableType::EType type);
// Callback
static void processGetAssetReply(const char* filename, const LLAssetID& assetID, void* user_data, S32 status, LLExtStat ext_status);
diff --git a/indra/newview/llwearabletype.cpp b/indra/newview/llwearabletype.cpp
new file mode 100644
index 0000000000..2a14ace38c
--- /dev/null
+++ b/indra/newview/llwearabletype.cpp
@@ -0,0 +1,138 @@
+/**
+ * @file llwearabletype.cpp
+ * @brief LLWearableType class implementation
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+#include "llwearabletype.h"
+#include "llinventoryfunctions.h"
+#include "lltrans.h"
+
+struct WearableEntry : public LLDictionaryEntry
+{
+ WearableEntry(const std::string &name,
+ const std::string& default_new_name,
+ LLAssetType::EType assetType,
+ LLInventoryIcon::EIconName iconName);
+ const LLAssetType::EType mAssetType;
+ const std::string mLabel;
+ const std::string mDefaultNewName; //keep mLabel for backward compatibility
+ LLInventoryIcon::EIconName mIconName;
+};
+
+WearableEntry::WearableEntry(const std::string &name,
+ const std::string& default_new_name,
+ LLAssetType::EType assetType,
+ LLInventoryIcon::EIconName iconName) :
+ LLDictionaryEntry(name),
+ mAssetType(assetType),
+ mDefaultNewName(default_new_name),
+ mLabel(LLTrans::getString(name)),
+ mIconName(iconName)
+{
+}
+
+class LLWearableDictionary : public LLSingleton<LLWearableDictionary>,
+ public LLDictionary<LLWearableType::EType, WearableEntry>
+{
+public:
+ LLWearableDictionary();
+};
+
+LLWearableDictionary::LLWearableDictionary()
+{
+ addEntry(LLWearableType::WT_SHAPE, new WearableEntry("shape", "New Shape", LLAssetType::AT_BODYPART, LLInventoryIcon::ICONNAME_BODYPART_SHAPE));
+ addEntry(LLWearableType::WT_SKIN, new WearableEntry("skin", "New Skin", LLAssetType::AT_BODYPART, LLInventoryIcon::ICONNAME_BODYPART_SKIN));
+ addEntry(LLWearableType::WT_HAIR, new WearableEntry("hair", "New Hair", LLAssetType::AT_BODYPART, LLInventoryIcon::ICONNAME_BODYPART_HAIR));
+ addEntry(LLWearableType::WT_EYES, new WearableEntry("eyes", "New Eyes", LLAssetType::AT_BODYPART, LLInventoryIcon::ICONNAME_BODYPART_EYES));
+ addEntry(LLWearableType::WT_SHIRT, new WearableEntry("shirt", "New Shirt", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SHIRT));
+ addEntry(LLWearableType::WT_PANTS, new WearableEntry("pants", "New Pants", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_PANTS));
+ addEntry(LLWearableType::WT_SHOES, new WearableEntry("shoes", "New Shoes", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SHOES));
+ addEntry(LLWearableType::WT_SOCKS, new WearableEntry("socks", "New Socks", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SOCKS));
+ addEntry(LLWearableType::WT_JACKET, new WearableEntry("jacket", "New Jacket", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_JACKET));
+ addEntry(LLWearableType::WT_GLOVES, new WearableEntry("gloves", "New Gloves", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_GLOVES));
+ addEntry(LLWearableType::WT_UNDERSHIRT, new WearableEntry("undershirt", "New Undershirt", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_UNDERSHIRT));
+ addEntry(LLWearableType::WT_UNDERPANTS, new WearableEntry("underpants", "New Underpants", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_UNDERPANTS));
+ addEntry(LLWearableType::WT_SKIRT, new WearableEntry("skirt", "New Skirt", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_SKIRT));
+ addEntry(LLWearableType::WT_ALPHA, new WearableEntry("alpha", "New Alpha", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_ALPHA));
+ addEntry(LLWearableType::WT_TATTOO, new WearableEntry("tattoo", "New Tattoo", LLAssetType::AT_CLOTHING, LLInventoryIcon::ICONNAME_CLOTHING_TATTOO));
+ addEntry(LLWearableType::WT_INVALID, new WearableEntry("invalid", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryIcon::ICONNAME_NONE));
+ addEntry(LLWearableType::WT_NONE, new WearableEntry("none", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryIcon::ICONNAME_NONE));
+ addEntry(LLWearableType::WT_COUNT, new WearableEntry("count", "Invalid Wearable", LLAssetType::AT_NONE, LLInventoryIcon::ICONNAME_NONE));
+}
+
+// static
+LLWearableType::EType LLWearableType::typeNameToType(const std::string& type_name)
+{
+ const LLWearableDictionary *dict = LLWearableDictionary::getInstance();
+ const LLWearableType::EType wearable = dict->lookup(type_name);
+ return wearable;
+}
+
+// static
+const std::string& LLWearableType::getTypeName(LLWearableType::EType type)
+{
+ const LLWearableDictionary *dict = LLWearableDictionary::getInstance();
+ const WearableEntry *entry = dict->lookup(type);
+ return entry->mName;
+}
+
+//static
+const std::string& LLWearableType::getTypeDefaultNewName(LLWearableType::EType type)
+{
+ const LLWearableDictionary *dict = LLWearableDictionary::getInstance();
+ const WearableEntry *entry = dict->lookup(type);
+ return entry->mDefaultNewName;
+}
+
+// static
+const std::string& LLWearableType::getTypeLabel(LLWearableType::EType type)
+{
+ const LLWearableDictionary *dict = LLWearableDictionary::getInstance();
+ const WearableEntry *entry = dict->lookup(type);
+ return entry->mLabel;
+}
+
+// static
+LLAssetType::EType LLWearableType::getAssetType(LLWearableType::EType type)
+{
+ const LLWearableDictionary *dict = LLWearableDictionary::getInstance();
+ const WearableEntry *entry = dict->lookup(type);
+ return entry->mAssetType;
+}
+
+// static
+LLInventoryIcon::EIconName LLWearableType::getIconName(LLWearableType::EType type)
+{
+ const LLWearableDictionary *dict = LLWearableDictionary::getInstance();
+ const WearableEntry *entry = dict->lookup(type);
+ return entry->mIconName;
+}
+
diff --git a/indra/newview/llwearabletype.h b/indra/newview/llwearabletype.h
new file mode 100644
index 0000000000..8090fd8df7
--- /dev/null
+++ b/indra/newview/llwearabletype.h
@@ -0,0 +1,78 @@
+/**
+ * @file llwearabletype.h
+ * @brief LLWearableType class header file
+ *
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ * * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#ifndef LL_LLWEARABLETYPE_H
+#define LL_LLWEARABLETYPE_H
+
+#include "llassettype.h"
+#include "lldictionary.h"
+#include "llinventoryicon.h"
+#include "llsingleton.h"
+
+class LLWearableType
+{
+public:
+ enum EType
+ {
+ WT_SHAPE = 0,
+ WT_SKIN = 1,
+ WT_HAIR = 2,
+ WT_EYES = 3,
+ WT_SHIRT = 4,
+ WT_PANTS = 5,
+ WT_SHOES = 6,
+ WT_SOCKS = 7,
+ WT_JACKET = 8,
+ WT_GLOVES = 9,
+ WT_UNDERSHIRT = 10,
+ WT_UNDERPANTS = 11,
+ WT_SKIRT = 12,
+ WT_ALPHA = 13,
+ WT_TATTOO = 14,
+ WT_COUNT = 15,
+
+ WT_INVALID = 255,
+ WT_NONE = -1,
+ };
+
+ static const std::string& getTypeName(EType type);
+ static const std::string& getTypeDefaultNewName(EType type);
+ static const std::string& getTypeLabel(EType type);
+ static LLAssetType::EType getAssetType(EType type);
+ static EType typeNameToType(const std::string& type_name);
+ static LLInventoryIcon::EIconName getIconName(EType type);
+
+protected:
+ LLWearableType() {}
+ ~LLWearableType() {}
+};
+
+#endif // LL_LLWEARABLETYPE_H
diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp
index 100ec0bb69..5c9633c036 100644
--- a/indra/newview/llweb.cpp
+++ b/indra/newview/llweb.cpp
@@ -54,6 +54,10 @@
#include "llviewerparcelmgr.h"
#include "llviewerregion.h"
#include "llviewerwindow.h"
+#include "llnotificationsutil.h"
+
+bool on_load_url_external_response(const LLSD& notification, const LLSD& response, bool async );
+
class URLLoader : public LLToastAlertPanel::URLLoader
{
@@ -103,8 +107,33 @@ void LLWeb::loadURLInternal(const std::string &url)
// static
void LLWeb::loadURLExternal(const std::string& url)
{
- std::string escaped_url = escapeURL(url);
- gViewerWindow->getWindow()->spawnWebBrowser(escaped_url);
+ loadURLExternal(url, true);
+}
+
+
+// static
+void LLWeb::loadURLExternal(const std::string& url, bool async)
+{
+ LLSD payload;
+ payload["url"] = url;
+ LLNotificationsUtil::add( "WebLaunchExternalTarget", LLSD(), payload, boost::bind(on_load_url_external_response, _1, _2, async));
+}
+
+// static
+bool on_load_url_external_response(const LLSD& notification, const LLSD& response, bool async )
+{
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ if ( 0 == option )
+ {
+ LLSD payload = notification["payload"];
+ std::string url = payload["url"].asString();
+ std::string escaped_url = LLWeb::escapeURL(url);
+ if (gViewerWindow)
+ {
+ gViewerWindow->getWindow()->spawnWebBrowser(escaped_url, async);
+ }
+ }
+ return false;
}
@@ -145,9 +174,10 @@ std::string LLWeb::expandURLSubstitutions(const std::string &url,
substitution["VERSION_PATCH"] = LLVersionInfo::getPatch();
substitution["VERSION_BUILD"] = LLVersionInfo::getBuild();
substitution["CHANNEL"] = LLVersionInfo::getChannel();
- substitution["GRID"] = LLViewerLogin::getInstance()->getGridLabel();
+ substitution["GRID"] = LLGridManager::getInstance()->getGridLabel();
substitution["OS"] = LLAppViewer::instance()->getOSInfo().getOSStringSimple();
substitution["SESSION_ID"] = gAgent.getSessionID();
+ substitution["FIRST_LOGIN"] = gAgent.isFirstLogin();
// work out the current language
std::string lang = LLUI::getLanguage();
diff --git a/indra/newview/llweb.h b/indra/newview/llweb.h
index f4666c9280..1119b80bb4 100644
--- a/indra/newview/llweb.h
+++ b/indra/newview/llweb.h
@@ -54,8 +54,10 @@ public:
static void loadURL(const char* url) { loadURL( ll_safe_string(url) ); }
/// Load the given url in the Second Life internal web browser
static void loadURLInternal(const std::string &url);
- /// Load the given url in the operating system's web browser
+ /// Load the given url in the operating system's web browser, async if we want to return immediately
+ /// before browser has spawned
static void loadURLExternal(const std::string& url);
+ static void loadURLExternal(const std::string& url, bool async);
/// Returns escaped url (eg, " " to "%20") - used by all loadURL methods
static std::string escapeURL(const std::string& url);
diff --git a/indra/newview/llwindebug.cpp b/indra/newview/llwindebug.cpp
deleted file mode 100644
index 59bc9dc62b..0000000000
--- a/indra/newview/llwindebug.cpp
+++ /dev/null
@@ -1,912 +0,0 @@
-/**
- * @file llwindebug.cpp
- * @brief Windows debugging functions
- *
- * $LicenseInfo:firstyear=2004&license=viewergpl$
- *
- * Copyright (c) 2004-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#include "llviewerprecompiledheaders.h"
-
-#include <tchar.h>
-#include <tlhelp32.h>
-#include "llwindebug.h"
-#include "llviewercontrol.h"
-#include "lldir.h"
-#include "llsd.h"
-#include "llsdserialize.h"
-
-#pragma warning(disable: 4200) //nonstandard extension used : zero-sized array in struct/union
-#pragma warning(disable: 4100) //unreferenced formal parameter
-
-
-/*
-LLSD Block for Windows Dump Information
-<llsd>
- <map>
- <key>Platform</key>
- <string></string>
- <key>Process</key>
- <string></string>
- <key>Module</key>
- <string></string>
- <key>DateModified</key>
- <string></string>
- <key>ExceptionCode</key>
- <string></string>
- <key>ExceptionRead/WriteAddress</key>
- <string></string>
- <key>Instruction</key>
- <string></string>
- <key>Registers</key>
- <map>
- <!-- Continued for all registers -->
- <key>EIP</key>
- <string>...</string>
- <!-- ... -->
- </map>
- <key>Call Stack</key>
- <array>
- <!-- One map per stack frame -->
- <map>
- <key>ModuleName</key>
- <string></string>
- <key>ModuleBaseAddress</key>
- <string></string>
- <key>ModuleOffsetAddress</key>
- <string></string>
- <key>Parameters</key>
- <array>
- <string></string>
- </array>
- </map>
- <!-- ... -->
- </array>
- </map>
-</llsd>
-
-*/
-
-
-extern void (*gCrashCallback)(void);
-
-// based on dbghelp.h
-typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType,
- CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,
- CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,
- CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam
- );
-
-MINIDUMPWRITEDUMP f_mdwp = NULL;
-
-#undef UNICODE
-
-static LPTOP_LEVEL_EXCEPTION_FILTER gFilterFunc = NULL;
-
-HMODULE hDbgHelp;
-
-// Tool Help functions.
-typedef HANDLE (WINAPI * CREATE_TOOL_HELP32_SNAPSHOT)(DWORD dwFlags, DWORD th32ProcessID);
-typedef BOOL (WINAPI * MODULE32_FIRST)(HANDLE hSnapshot, LPMODULEENTRY32 lpme);
-typedef BOOL (WINAPI * MODULE32_NEST)(HANDLE hSnapshot, LPMODULEENTRY32 lpme);
-
-CREATE_TOOL_HELP32_SNAPSHOT CreateToolhelp32Snapshot_;
-MODULE32_FIRST Module32First_;
-MODULE32_NEST Module32Next_;
-
-#define DUMP_SIZE_MAX 8000 //max size of our dump
-#define CALL_TRACE_MAX ((DUMP_SIZE_MAX - 2000) / (MAX_PATH + 40)) //max number of traced calls
-#define NL L"\r\n" //new line
-
-
-typedef struct STACK
-{
- STACK * Ebp;
- PBYTE Ret_Addr;
- DWORD Param[0];
-} STACK, * PSTACK;
-
-BOOL WINAPI Get_Module_By_Ret_Addr(PBYTE Ret_Addr, LPWSTR Module_Name, PBYTE & Module_Addr);
-void WINAPI Get_Call_Stack(const EXCEPTION_RECORD* exception_record,
- const CONTEXT* context_record,
- LLSD& info);
-
-void printError( CHAR* msg )
-{
- DWORD eNum;
- TCHAR sysMsg[256];
- TCHAR* p;
-
- eNum = GetLastError( );
- FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL, eNum,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
- sysMsg, 256, NULL );
-
- // Trim the end of the line and terminate it with a null
- p = sysMsg;
- while( ( *p > 31 ) || ( *p == 9 ) )
- ++p;
- do { *p-- = 0; } while( ( p >= sysMsg ) &&
- ( ( *p == '.' ) || ( *p < 33 ) ) );
-
- // Display the message
- printf( "\n WARNING: %s failed with error %d (%s)", msg, eNum, sysMsg );
-}
-
-BOOL GetProcessThreadIDs(DWORD process_id, std::vector<DWORD>& thread_ids)
-{
- HANDLE hThreadSnap = INVALID_HANDLE_VALUE;
- THREADENTRY32 te32;
-
- // Take a snapshot of all running threads
- hThreadSnap = CreateToolhelp32Snapshot( TH32CS_SNAPTHREAD, 0 );
- if( hThreadSnap == INVALID_HANDLE_VALUE )
- return( FALSE );
-
- // Fill in the size of the structure before using it.
- te32.dwSize = sizeof(THREADENTRY32 );
-
- // Retrieve information about the first thread,
- // and exit if unsuccessful
- if( !Thread32First( hThreadSnap, &te32 ) )
- {
- printError( "Thread32First" ); // Show cause of failure
- CloseHandle( hThreadSnap ); // Must clean up the snapshot object!
- return( FALSE );
- }
-
- // Now walk the thread list of the system,
- // and display information about each thread
- // associated with the specified process
- do
- {
- if( te32.th32OwnerProcessID == process_id )
- {
- thread_ids.push_back(te32.th32ThreadID);
- }
- } while( Thread32Next(hThreadSnap, &te32 ) );
-
-// Don't forget to clean up the snapshot object.
- CloseHandle( hThreadSnap );
- return( TRUE );
-}
-
-BOOL GetThreadCallStack(DWORD thread_id, LLSD& info)
-{
- if(GetCurrentThreadId() == thread_id)
- {
- // Early exit for the current thread.
- // Suspending the current thread would be a bad idea.
- // Plus you can't retrieve a valid current thread context.
- return false;
- }
-
- HANDLE thread_handle = INVALID_HANDLE_VALUE;
- thread_handle = OpenThread(THREAD_ALL_ACCESS, FALSE, thread_id);
- if(INVALID_HANDLE_VALUE == thread_handle)
- {
- return FALSE;
- }
-
- BOOL result = false;
- if(-1 != SuspendThread(thread_handle))
- {
- CONTEXT context_struct;
- context_struct.ContextFlags = CONTEXT_FULL;
- if(GetThreadContext(thread_handle, &context_struct))
- {
- Get_Call_Stack(NULL, &context_struct, info);
- result = true;
- }
- ResumeThread(thread_handle);
- }
- else
- {
- // Couldn't suspend thread.
- }
-
- CloseHandle(thread_handle);
- return result;
-}
-
-
-//Windows Call Stack Construction idea from
-//http://www.codeproject.com/tools/minidump.asp
-
-//****************************************************************************************
-BOOL WINAPI Get_Module_By_Ret_Addr(PBYTE Ret_Addr, LPWSTR Module_Name, PBYTE & Module_Addr)
-//****************************************************************************************
-// Find module by Ret_Addr (address in the module).
-// Return Module_Name (full path) and Module_Addr (start address).
-// Return TRUE if found.
-{
- MODULEENTRY32 M = {sizeof(M)};
- HANDLE hSnapshot;
-
- bool found = false;
-
- if (CreateToolhelp32Snapshot_)
- {
- hSnapshot = CreateToolhelp32Snapshot_(TH32CS_SNAPMODULE, 0);
-
- if ((hSnapshot != INVALID_HANDLE_VALUE) &&
- Module32First_(hSnapshot, &M))
- {
- do
- {
- if (DWORD(Ret_Addr - M.modBaseAddr) < M.modBaseSize)
- {
- lstrcpyn(Module_Name, M.szExePath, MAX_PATH);
- Module_Addr = M.modBaseAddr;
- found = true;
- break;
- }
- } while (Module32Next_(hSnapshot, &M));
- }
-
- CloseHandle(hSnapshot);
- }
-
- return found;
-} //Get_Module_By_Ret_Addr
-
-bool has_valid_call_before(PDWORD cur_stack_loc)
-{
- PBYTE p_first_byte = (PBYTE)(*cur_stack_loc - 1);
- PBYTE p_second_byte = (PBYTE)(*cur_stack_loc -2);
- PBYTE p_fifth_byte = (PBYTE)(*cur_stack_loc - 5);
- PBYTE p_sixth_byte = (PBYTE)(*cur_stack_loc - 6);
-
- // make sure we can read it
- if(IsBadReadPtr(p_sixth_byte, 6 * sizeof(BYTE)))
- {
- return false;
- }
-
- // check for 9a + 4 bytes
- if(*p_fifth_byte == 0x9A)
- {
- return true;
- }
-
- // Check for E8 + 4 bytes and last byte is 00 or FF
- if(*p_fifth_byte == 0xE8 && (*p_first_byte == 0x00 || *p_first_byte == 0xFF))
- {
- return true;
- }
-
- // the other is six bytes
- if(*p_sixth_byte == 0xFF || *p_second_byte == 0xFF)
- {
- return true;
- }
-
- return false;
-}
-
-PBYTE get_valid_frame(PBYTE esp)
-{
- PDWORD cur_stack_loc = NULL;
- const int max_search = 400;
- WCHAR module_name[MAX_PATH];
- PBYTE module_addr = 0;
-
- // round to highest multiple of four
- esp = (esp + (4 - ((int)esp % 4)) % 4);
-
- // scroll through stack a few hundred places.
- for (cur_stack_loc = (PDWORD) esp; cur_stack_loc < (PDWORD)esp + max_search; cur_stack_loc += 1)
- {
- // if you can read the pointer,
- if (IsBadReadPtr(cur_stack_loc, sizeof(PDWORD)))
- {
- continue;
- }
-
- // check if it's in a module
- if (!Get_Module_By_Ret_Addr((PBYTE)*cur_stack_loc, module_name, module_addr))
- {
- continue;
- }
-
- // check if the code before the instruction ptr is a call
- if(!has_valid_call_before(cur_stack_loc))
- {
- continue;
- }
-
- // if these all pass, return that ebp, otherwise continue till we're dead
- return (PBYTE)(cur_stack_loc - 1);
- }
-
- return NULL;
-}
-
-bool shouldUseStackWalker(PSTACK Ebp, int max_depth)
-{
- WCHAR Module_Name[MAX_PATH];
- PBYTE Module_Addr = 0;
- int depth = 0;
-
- while (depth < max_depth)
- {
- if (IsBadReadPtr(Ebp, sizeof(PSTACK)) ||
- IsBadReadPtr(Ebp->Ebp, sizeof(PSTACK)) ||
- Ebp->Ebp < Ebp ||
- Ebp->Ebp - Ebp > 0xFFFFFF ||
- IsBadCodePtr(FARPROC(Ebp->Ebp->Ret_Addr)) ||
- !Get_Module_By_Ret_Addr(Ebp->Ebp->Ret_Addr, Module_Name, Module_Addr))
- {
- return true;
- }
- depth++;
- Ebp = Ebp->Ebp;
- }
-
- return false;
-}
-
-//******************************************************************
-void WINAPI Get_Call_Stack(const EXCEPTION_RECORD* exception_record,
- const CONTEXT* context_record,
- LLSD& info)
-//******************************************************************
-// Fill Str with call stack info.
-// pException can be either GetExceptionInformation() or NULL.
-// If pException = NULL - get current call stack.
-{
- LPWSTR Module_Name = new WCHAR[MAX_PATH];
- PBYTE Module_Addr = 0;
- LLSD params;
- PBYTE Esp = NULL;
- LLSD tmp_info;
-
- bool fake_frame = false;
- bool ebp_used = false;
- const int HEURISTIC_MAX_WALK = 20;
- int heuristic_walk_i = 0;
- int Ret_Addr_I = 0;
-
- STACK Stack = {0, 0};
- PSTACK Ebp;
-
- if (exception_record && context_record) //fake frame for exception address
- {
- Stack.Ebp = (PSTACK)(context_record->Ebp);
- Stack.Ret_Addr = (PBYTE)exception_record->ExceptionAddress;
- Ebp = &Stack;
- Esp = (PBYTE) context_record->Esp;
- fake_frame = true;
- }
- else if(context_record)
- {
- Ebp = (PSTACK)(context_record->Ebp);
- Esp = (PBYTE)(context_record->Esp);
- }
- else
- {
- Ebp = (PSTACK)&exception_record - 1; //frame addr of Get_Call_Stack()
- Esp = (PBYTE)&exception_record;
-
- // Skip frame of Get_Call_Stack().
- if (!IsBadReadPtr(Ebp, sizeof(PSTACK)))
- Ebp = Ebp->Ebp; //caller ebp
- }
-
- // Trace CALL_TRACE_MAX calls maximum - not to exceed DUMP_SIZE_MAX.
- // Break trace on wrong stack frame.
- for (Ret_Addr_I = 0;
- heuristic_walk_i < HEURISTIC_MAX_WALK &&
- Ret_Addr_I < CALL_TRACE_MAX && !IsBadReadPtr(Ebp, sizeof(PSTACK)) && !IsBadCodePtr(FARPROC(Ebp->Ret_Addr));
- Ret_Addr_I++)
- {
- // If module with Ebp->Ret_Addr found.
- if (Get_Module_By_Ret_Addr(Ebp->Ret_Addr, Module_Name, Module_Addr))
- {
- // Save module's address and full path.
- tmp_info["CallStack"][Ret_Addr_I]["ModuleName"] = ll_convert_wide_to_string(Module_Name);
- tmp_info["CallStack"][Ret_Addr_I]["ModuleAddress"] = (int)Module_Addr;
- tmp_info["CallStack"][Ret_Addr_I]["CallOffset"] = (int)(Ebp->Ret_Addr - Module_Addr);
-
- // Save 5 params of the call. We don't know the real number of params.
- if (fake_frame && !Ret_Addr_I) //fake frame for exception address
- params[0] = "Exception Offset";
- else if (!IsBadReadPtr(Ebp, sizeof(PSTACK) + 5 * sizeof(DWORD)))
- {
- for(int j = 0; j < 5; ++j)
- {
- params[j] = (int)Ebp->Param[j];
- }
- }
- tmp_info["CallStack"][Ret_Addr_I]["Parameters"] = params;
- }
-
- tmp_info["CallStack"][Ret_Addr_I]["ReturnAddress"] = (int)Ebp->Ret_Addr;
-
- // get ready for next frame
- // Set ESP to just after return address. Not the real esp, but just enough after the return address
- if(!fake_frame) {
- Esp = (PBYTE)Ebp + 8;
- }
- else
- {
- fake_frame = false;
- }
-
- // is next ebp valid?
- // only run if we've never found a good ebp
- // and make sure the one after is valid as well
- if( !ebp_used &&
- shouldUseStackWalker(Ebp, 2))
- {
- heuristic_walk_i++;
- PBYTE new_ebp = get_valid_frame(Esp);
- if (new_ebp != NULL)
- {
- Ebp = (PSTACK)new_ebp;
- }
- }
- else
- {
- ebp_used = true;
- Ebp = Ebp->Ebp;
- }
- }
-/* TODO remove or turn this code back on to edit the stack after i see a few raw ones. -Palmer
- // Now go back through and edit out heuristic stacks that could very well be bogus.
- // Leave the top and the last 3 stack chosen by the heuristic, however.
- if(heuristic_walk_i > 2)
- {
- info["CallStack"][0] = tmp_info["CallStack"][0];
- std::string ttest = info["CallStack"][0]["ModuleName"];
- for(int cur_frame = 1;
- (cur_frame + heuristic_walk_i - 2 < Ret_Addr_I);
- ++cur_frame)
- {
- // edit out the middle heuristic found frames
- info["CallStack"][cur_frame] = tmp_info["CallStack"][cur_frame + heuristic_walk_i - 2];
- }
- }
- else
- {
- info = tmp_info;
- }
-*/
- info = tmp_info;
- info["HeuristicWalkI"] = heuristic_walk_i;
- info["EbpUsed"] = ebp_used;
-
-} //Get_Call_Stack
-
-//***********************************
-void WINAPI Get_Version_Str(LLSD& info)
-//***********************************
-// Fill Str with Windows version.
-{
- OSVERSIONINFOEX V = {sizeof(OSVERSIONINFOEX)}; //EX for NT 5.0 and later
-
- if (!GetVersionEx((POSVERSIONINFO)&V))
- {
- ZeroMemory(&V, sizeof(V));
- V.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
- GetVersionEx((POSVERSIONINFO)&V);
- }
-
- if (V.dwPlatformId != VER_PLATFORM_WIN32_NT)
- V.dwBuildNumber = LOWORD(V.dwBuildNumber); //for 9x HIWORD(dwBuildNumber) = 0x04xx
-
- info["Platform"] = llformat("Windows: %d.%d.%d, SP %d.%d, Product Type %d", //SP - service pack, Product Type - VER_NT_WORKSTATION,...
- V.dwMajorVersion, V.dwMinorVersion, V.dwBuildNumber, V.wServicePackMajor, V.wServicePackMinor, V.wProductType);
-} //Get_Version_Str
-
-//*************************************************************
-LLSD WINAPI Get_Exception_Info(PEXCEPTION_POINTERS pException)
-//*************************************************************
-// Allocate Str[DUMP_SIZE_MAX] and return Str with dump, if !pException - just return call stack in Str.
-{
- LLSD info;
- LPWSTR Str;
- int Str_Len;
-// int i;
- LPWSTR Module_Name = new WCHAR[MAX_PATH];
- PBYTE Module_Addr;
- HANDLE hFile;
- FILETIME Last_Write_Time;
- FILETIME Local_File_Time;
- SYSTEMTIME T;
-
- Str = new WCHAR[DUMP_SIZE_MAX];
- Str_Len = 0;
- if (!Str)
- return NULL;
-
- Get_Version_Str(info);
-
- GetModuleFileName(NULL, Str, MAX_PATH);
- info["Process"] = ll_convert_wide_to_string(Str);
- info["ThreadID"] = (S32)GetCurrentThreadId();
-
- // If exception occurred.
- if (pException)
- {
- EXCEPTION_RECORD & E = *pException->ExceptionRecord;
- CONTEXT & C = *pException->ContextRecord;
-
- // If module with E.ExceptionAddress found - save its path and date.
- if (Get_Module_By_Ret_Addr((PBYTE)E.ExceptionAddress, Module_Name, Module_Addr))
- {
- info["Module"] = ll_convert_wide_to_string(Module_Name);
-
- if ((hFile = CreateFile(Module_Name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE)
- {
- if (GetFileTime(hFile, NULL, NULL, &Last_Write_Time))
- {
- FileTimeToLocalFileTime(&Last_Write_Time, &Local_File_Time);
- FileTimeToSystemTime(&Local_File_Time, &T);
-
- info["DateModified"] = llformat("%02d/%02d/%d", T.wMonth, T.wDay, T.wYear);
- }
- CloseHandle(hFile);
- }
- }
- else
- {
- info["ExceptionAddr"] = (int)E.ExceptionAddress;
- }
-
- info["ExceptionCode"] = (int)E.ExceptionCode;
-
- /*
- //TODO: Fix this
- if (E.ExceptionCode == EXCEPTION_ACCESS_VIOLATION)
- {
- // Access violation type - Write/Read.
- LLSD exception_info;
- exception_info["Type"] = E.ExceptionInformation[0] ? "Write" : "Read";
- exception_info["Address"] = llformat("%08x", E.ExceptionInformation[1]);
- info["Exception Information"] = exception_info;
- }
- */
-
-
- // Save instruction that caused exception.
- /*
- std::string str;
- for (i = 0; i < 16; i++)
- str += llformat(" %02X", PBYTE(E.ExceptionAddress)[i]);
- info["Instruction"] = str;
- */
- LLSD registers;
- registers["EAX"] = (int)C.Eax;
- registers["EBX"] = (int)C.Ebx;
- registers["ECX"] = (int)C.Ecx;
- registers["EDX"] = (int)C.Edx;
- registers["ESI"] = (int)C.Esi;
- registers["EDI"] = (int)C.Edi;
- registers["ESP"] = (int)C.Esp;
- registers["EBP"] = (int)C.Ebp;
- registers["EIP"] = (int)C.Eip;
- registers["EFlags"] = (int)C.EFlags;
- info["Registers"] = registers;
- } //if (pException)
-
- // Save call stack info.
- Get_Call_Stack(pException->ExceptionRecord, pException->ContextRecord, info);
-
- return info;
-} //Get_Exception_Info
-
-#define UNICODE
-
-
-class LLMemoryReserve {
-public:
- LLMemoryReserve();
- ~LLMemoryReserve();
- void reserve();
- void release();
-protected:
- unsigned char *mReserve;
- static const size_t MEMORY_RESERVATION_SIZE;
-};
-
-LLMemoryReserve::LLMemoryReserve() :
- mReserve(NULL)
-{
-};
-
-LLMemoryReserve::~LLMemoryReserve()
-{
- release();
-}
-
-// I dunno - this just seemed like a pretty good value.
-const size_t LLMemoryReserve::MEMORY_RESERVATION_SIZE = 5 * 1024 * 1024;
-
-void LLMemoryReserve::reserve()
-{
- if(NULL == mReserve)
- mReserve = new unsigned char[MEMORY_RESERVATION_SIZE];
-};
-
-void LLMemoryReserve::release()
-{
- delete [] mReserve;
- mReserve = NULL;
-};
-
-static LLMemoryReserve gEmergencyMemoryReserve;
-
-#ifndef _M_IX86
- #error "The following code only works for x86!"
-#endif
-LPTOP_LEVEL_EXCEPTION_FILTER WINAPI MyDummySetUnhandledExceptionFilter(
- LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter)
-{
- if(lpTopLevelExceptionFilter == gFilterFunc)
- return gFilterFunc;
-
- llinfos << "Someone tried to set the exception filter. Listing call stack modules" << llendl;
- LLSD cs_info;
- Get_Call_Stack(NULL, NULL, cs_info);
-
- if(cs_info.has("CallStack") && cs_info["CallStack"].isArray())
- {
- LLSD cs = cs_info["CallStack"];
- for(LLSD::array_iterator i = cs.beginArray();
- i != cs.endArray();
- ++i)
- {
- llinfos << "Module: " << (*i)["ModuleName"] << llendl;
- }
- }
-
- return gFilterFunc;
-}
-
-BOOL PreventSetUnhandledExceptionFilter()
-{
- HMODULE hKernel32 = LoadLibrary(_T("kernel32.dll"));
- if (hKernel32 == NULL)
- return FALSE;
-
- void *pOrgEntry = GetProcAddress(hKernel32, "SetUnhandledExceptionFilter");
- if(pOrgEntry == NULL)
- return FALSE;
-
- unsigned char newJump[ 100 ];
- DWORD dwOrgEntryAddr = (DWORD)pOrgEntry;
- dwOrgEntryAddr += 5; // add 5 for 5 op-codes for jmp far
- void *pNewFunc = &MyDummySetUnhandledExceptionFilter;
- DWORD dwNewEntryAddr = (DWORD) pNewFunc;
- DWORD dwRelativeAddr = dwNewEntryAddr - dwOrgEntryAddr;
-
- newJump[ 0 ] = 0xE9; // JMP absolute
- memcpy(&newJump[ 1 ], &dwRelativeAddr, sizeof(pNewFunc));
- SIZE_T bytesWritten;
- BOOL bRet = WriteProcessMemory(GetCurrentProcess(),
- pOrgEntry, newJump, sizeof(pNewFunc) + 1, &bytesWritten);
- return bRet;
-}
-
-// static
-void LLWinDebug::initExceptionHandler(LPTOP_LEVEL_EXCEPTION_FILTER filter_func)
-{
-
- static bool s_first_run = true;
- // Load the dbghelp dll now, instead of waiting for the crash.
- // Less potential for stack mangling
-
- if (s_first_run)
- {
- // First, try loading from the directory that the app resides in.
- std::string local_dll_name = gDirUtilp->findFile("dbghelp.dll", gDirUtilp->getWorkingDir(), gDirUtilp->getExecutableDir());
-
- HMODULE hDll = NULL;
- hDll = LoadLibraryA(local_dll_name.c_str());
- if (!hDll)
- {
- hDll = LoadLibrary(L"dbghelp.dll");
- }
-
- if (!hDll)
- {
- LL_WARNS("AppInit") << "Couldn't find dbghelp.dll!" << LL_ENDL;
- }
- else
- {
- f_mdwp = (MINIDUMPWRITEDUMP) GetProcAddress(hDll, "MiniDumpWriteDump");
-
- if (!f_mdwp)
- {
- FreeLibrary(hDll);
- hDll = NULL;
- }
- }
-
- gEmergencyMemoryReserve.reserve();
-
- s_first_run = false;
- }
-
- // Try to get Tool Help library functions.
- HMODULE hKernel32;
- hKernel32 = GetModuleHandle(_T("KERNEL32"));
- CreateToolhelp32Snapshot_ = (CREATE_TOOL_HELP32_SNAPSHOT)GetProcAddress(hKernel32, "CreateToolhelp32Snapshot");
- Module32First_ = (MODULE32_FIRST)GetProcAddress(hKernel32, "Module32FirstW");
- Module32Next_ = (MODULE32_NEST)GetProcAddress(hKernel32, "Module32NextW");
-
- LPTOP_LEVEL_EXCEPTION_FILTER prev_filter;
- prev_filter = SetUnhandledExceptionFilter(filter_func);
-
- // *REMOVE:Mani
- //PreventSetUnhandledExceptionFilter();
-
- if(prev_filter != gFilterFunc)
- {
- LL_WARNS("AppInit")
- << "Replacing unknown exception (" << (void *)prev_filter << ") with (" << (void *)filter_func << ") !" << LL_ENDL;
- }
-
- gFilterFunc = filter_func;
-}
-
-bool LLWinDebug::checkExceptionHandler()
-{
- bool ok = true;
- LPTOP_LEVEL_EXCEPTION_FILTER prev_filter;
- prev_filter = SetUnhandledExceptionFilter(gFilterFunc);
-
- if (prev_filter != gFilterFunc)
- {
- LL_WARNS("AppInit") << "Our exception handler (" << (void *)gFilterFunc << ") replaced with " << prev_filter << "!" << LL_ENDL;
- ok = false;
- }
-
- if (prev_filter == NULL)
- {
- ok = FALSE;
- if (gFilterFunc == NULL)
- {
- LL_WARNS("AppInit") << "Exception handler uninitialized." << LL_ENDL;
- }
- else
- {
- LL_WARNS("AppInit") << "Our exception handler (" << (void *)gFilterFunc << ") replaced with NULL!" << LL_ENDL;
- }
- }
-
- return ok;
-}
-
-void LLWinDebug::writeDumpToFile(MINIDUMP_TYPE type, MINIDUMP_EXCEPTION_INFORMATION *ExInfop, const std::string& filename)
-{
- if(f_mdwp == NULL || gDirUtilp == NULL)
- {
- return;
- //write_debug("No way to generate a minidump, no MiniDumpWriteDump function!\n");
- }
- else
- {
- std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, filename);
-
- HANDLE hFile = CreateFileA(dump_path.c_str(),
- GENERIC_WRITE,
- FILE_SHARE_WRITE,
- NULL,
- CREATE_ALWAYS,
- FILE_ATTRIBUTE_NORMAL,
- NULL);
-
- if (hFile != INVALID_HANDLE_VALUE)
- {
- // Write the dump, ignoring the return value
- f_mdwp(GetCurrentProcess(),
- GetCurrentProcessId(),
- hFile,
- type,
- ExInfop,
- NULL,
- NULL);
-
- CloseHandle(hFile);
- }
-
- }
-}
-
-// static
-void LLWinDebug::generateCrashStacks(struct _EXCEPTION_POINTERS *exception_infop)
-{
- // *NOTE:Mani - This method is no longer the exception handler.
- // Its called from viewer_windows_exception_handler() and other places.
-
- //
- // Let go of a bunch of reserved memory to give library calls etc
- // a chance to execute normally in the case that we ran out of
- // memory.
- //
- LLSD info;
- std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,
- "SecondLifeException");
- std::string log_path = dump_path + ".log";
-
- if (exception_infop)
- {
- // Since there is exception info... Release the hounds.
- gEmergencyMemoryReserve.release();
-
- if(gSavedSettings.getControl("SaveMinidump").notNull() && gSavedSettings.getBOOL("SaveMinidump"))
- {
- _MINIDUMP_EXCEPTION_INFORMATION ExInfo;
-
- ExInfo.ThreadId = ::GetCurrentThreadId();
- ExInfo.ExceptionPointers = exception_infop;
- ExInfo.ClientPointers = NULL;
-
- writeDumpToFile(MiniDumpNormal, &ExInfo, "SecondLife.dmp");
- writeDumpToFile((MINIDUMP_TYPE)(MiniDumpWithDataSegs | MiniDumpWithIndirectlyReferencedMemory), &ExInfo, "SecondLifePlus.dmp");
- }
-
- info = Get_Exception_Info(exception_infop);
- }
-
- LLSD threads;
- std::vector<DWORD> thread_ids;
- GetProcessThreadIDs(GetCurrentProcessId(), thread_ids);
-
- for(std::vector<DWORD>::iterator th_itr = thread_ids.begin();
- th_itr != thread_ids.end();
- ++th_itr)
- {
- LLSD thread_info;
- if(*th_itr != GetCurrentThreadId())
- {
- GetThreadCallStack(*th_itr, thread_info);
- }
-
- if(thread_info)
- {
- threads[llformat("ID %d", *th_itr)] = thread_info;
- }
- }
-
- info["Threads"] = threads;
-
- llofstream out_file(log_path);
- LLSDSerialize::toPrettyXML(info, out_file);
- out_file.close();
-}
-
-void LLWinDebug::clearCrashStacks()
-{
- LLSD info;
- std::string dump_path = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, "SecondLifeException.log");
- LLFile::remove(dump_path);
-}
diff --git a/indra/newview/llwindebug.h b/indra/newview/llwindebug.h
deleted file mode 100644
index f4a6a2d54d..0000000000
--- a/indra/newview/llwindebug.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/**
- * @file llwindebug.h
- * @brief LLWinDebug class header file
- *
- * $LicenseInfo:firstyear=2004&license=viewergpl$
- *
- * Copyright (c) 2004-2009, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
-
-#ifndef LL_LLWINDEBUG_H
-#define LL_LLWINDEBUG_H
-
-#include "stdtypes.h"
-#include <dbghelp.h>
-
-class LLWinDebug
-{
-public:
-
- /**
- * @brief initialize the llwindebug exception filter callback
- *
- * Hand a windows unhandled exception filter to LLWinDebug
- * This method should only be called to change the
- * exception filter used by llwindebug.
- *
- * Setting filter_func to NULL will clear any custom filters.
- **/
- static void initExceptionHandler(LPTOP_LEVEL_EXCEPTION_FILTER filter_func);
-
- /**
- * @brief check the status of the exception filter.
- *
- * Resets unhandled exception filter to the filter specified
- * w/ initExceptionFilter).
- * Returns false if the exception filter was modified.
- *
- * *NOTE:Mani In the past mozlib has been accused of
- * overriding the exception filter. If the mozlib filter
- * is required, perhaps we can chain calls from our
- * filter to mozlib's.
- **/
- static bool checkExceptionHandler();
-
- static void generateCrashStacks(struct _EXCEPTION_POINTERS *pExceptionInfo = NULL);
- static void clearCrashStacks(); // Delete the crash stack file(s).
-
- static void writeDumpToFile(MINIDUMP_TYPE type, MINIDUMP_EXCEPTION_INFORMATION *ExInfop, const std::string& filename);
-private:
-};
-
-#endif // LL_LLWINDEBUG_H
diff --git a/indra/newview/llworld.cpp b/indra/newview/llworld.cpp
index 118d7f8d08..f30567f481 100644
--- a/indra/newview/llworld.cpp
+++ b/indra/newview/llworld.cpp
@@ -45,6 +45,7 @@
#include "llhttpnode.h"
#include "llregionhandle.h"
#include "llsurface.h"
+#include "lltrans.h"
#include "llviewercamera.h"
#include "llviewertexture.h"
#include "llviewertexturelist.h"
@@ -90,7 +91,8 @@ LLWorld::LLWorld() :
mLastPacketsIn(0),
mLastPacketsOut(0),
mLastPacketsLost(0),
- mSpaceTimeUSec(0)
+ mSpaceTimeUSec(0),
+ mClassicCloudsEnabled(TRUE)
{
for (S32 i = 0; i < 8; i++)
{
@@ -132,10 +134,11 @@ void LLWorld::destroyClass()
LLViewerRegion* LLWorld::addRegion(const U64 &region_handle, const LLHost &host)
{
LLMemType mt(LLMemType::MTYPE_REGIONS);
-
+ llinfos << "Add region with handle: " << region_handle << " on host " << host << llendl;
LLViewerRegion *regionp = getRegionFromHandle(region_handle);
if (regionp)
{
+ llinfos << "Region exists, removing it " << llendl;
LLHost old_host = regionp->getHost();
// region already exists!
if (host == old_host && regionp->isAlive())
@@ -258,7 +261,7 @@ void LLWorld::removeRegion(const LLHost &host)
llwarns << "gFrameTimeSeconds " << gFrameTimeSeconds << llendl;
llwarns << "Disabling region " << regionp->getName() << " that agent is in!" << llendl;
- LLAppViewer::instance()->forceDisconnect("You have been disconnected from the region you were in.");
+ LLAppViewer::instance()->forceDisconnect(LLTrans::getString("YouHaveBeenDisconnected"));
return;
}
@@ -657,16 +660,44 @@ void LLWorld::updateParticles()
void LLWorld::updateClouds(const F32 dt)
{
- if (gSavedSettings.getBOOL("FreezeTime") ||
- !gSavedSettings.getBOOL("SkyUseClassicClouds"))
+ static LLFastTimer::DeclareTimer ftm("World Clouds");
+ LLFastTimer t(ftm);
+
+ if ( gSavedSettings.getBOOL("FreezeTime") )
{
// don't move clouds in snapshot mode
return;
}
+
+ if (
+ mClassicCloudsEnabled !=
+ gSavedSettings.getBOOL("SkyUseClassicClouds") )
+ {
+ // The classic cloud toggle has been flipped
+ // gotta update all of the cloud layers
+ mClassicCloudsEnabled =
+ gSavedSettings.getBOOL("SkyUseClassicClouds");
+
+ if ( !mClassicCloudsEnabled && mActiveRegionList.size() )
+ {
+ // We've transitioned to having classic clouds disabled
+ // reset all cloud layers.
+ for (
+ region_list_t::iterator iter = mActiveRegionList.begin();
+ iter != mActiveRegionList.end();
+ ++iter)
+ {
+ LLViewerRegion* regionp = *iter;
+ regionp->mCloudLayer.reset();
+ }
+
+ return;
+ }
+ }
+ else if ( !mClassicCloudsEnabled ) return;
+
if (mActiveRegionList.size())
{
- // Update all the cloud puff positions, and timer based stuff
- // such as death decay
for (region_list_t::iterator iter = mActiveRegionList.begin();
iter != mActiveRegionList.end(); ++iter)
{
@@ -1205,7 +1236,7 @@ static LLVector3d unpackLocalToGlobalPosition(U32 compact_local, const LLVector3
return pos_global;
}
-void LLWorld::getAvatars(std::vector<LLUUID>* avatar_ids, std::vector<LLVector3d>* positions, const LLVector3d& relative_to, F32 radius) const
+void LLWorld::getAvatars(uuid_vec_t* avatar_ids, std::vector<LLVector3d>* positions, const LLVector3d& relative_to, F32 radius) const
{
if(avatar_ids != NULL)
{
diff --git a/indra/newview/llworld.h b/indra/newview/llworld.h
index 48025c700b..5310009d7c 100644
--- a/indra/newview/llworld.h
+++ b/indra/newview/llworld.h
@@ -158,7 +158,7 @@ public:
// All arguments are optional. Given containers will be emptied and then filled.
// Not supplying origin or radius input returns data on all avatars in the known regions.
void getAvatars(
- std::vector<LLUUID>* avatar_ids = NULL,
+ uuid_vec_t* avatar_ids = NULL,
std::vector<LLVector3d>* positions = NULL,
const LLVector3d& relative_to = LLVector3d(), F32 radius = FLT_MAX) const;
@@ -184,6 +184,8 @@ private:
U64 mSpaceTimeUSec;
+ BOOL mClassicCloudsEnabled;
+
////////////////////////////
//
// Data for "Fake" objects
diff --git a/indra/newview/llworldmap.h b/indra/newview/llworldmap.h
index 7e37727b86..e4e677eb64 100644
--- a/indra/newview/llworldmap.h
+++ b/indra/newview/llworldmap.h
@@ -123,6 +123,7 @@ public:
bool isName(const std::string& name) const;
bool isDown() { return (mAccess == SIM_ACCESS_DOWN); }
bool isPG() { return (mAccess <= SIM_ACCESS_PG); }
+ bool isAdult() { return (mAccess == SIM_ACCESS_ADULT); }
// Debug only
void dump() const; // Print the region info to the standard output
diff --git a/indra/newview/llworldmapmessage.cpp b/indra/newview/llworldmapmessage.cpp
index 06040a574c..09c5b9b196 100644
--- a/indra/newview/llworldmapmessage.cpp
+++ b/indra/newview/llworldmapmessage.cpp
@@ -193,6 +193,9 @@ void LLWorldMapMessage::processMapBlockReply(LLMessageSystem* msg, void**)
U32 x_world = (U32)(x_regions) * REGION_WIDTH_UNITS;
U32 y_world = (U32)(y_regions) * REGION_WIDTH_UNITS;
+ // name shouldn't be empty, see EXT-4568
+ llassert(!name.empty());
+
// Insert that region in the world map, if failure, flag it as a "null_sim"
if (!(LLWorldMap::getInstance()->insertRegion(x_world, y_world, name, image_id, (U32)accesscode, region_flags)))
{
diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp
index 1940d65ae4..081a3721b1 100644
--- a/indra/newview/llworldmapview.cpp
+++ b/indra/newview/llworldmapview.cpp
@@ -44,7 +44,9 @@
#include "lltooltip.h"
#include "llagent.h"
+#include "llagentcamera.h"
#include "llcallingcard.h"
+#include "llcommandhandler.h"
#include "llviewercontrol.h"
#include "llfloatermap.h"
#include "llfloaterworldmap.h"
@@ -128,10 +130,10 @@ void LLWorldMapView::initClass()
sHomeImage = LLUI::getUIImage("map_home.tga");
sTelehubImage = LLUI::getUIImage("map_telehub.tga");
sInfohubImage = LLUI::getUIImage("map_infohub.tga");
- sEventImage = LLUI::getUIImage("map_event.tga");
- sEventMatureImage = LLUI::getUIImage("map_event_mature.tga");
+ sEventImage = LLUI::getUIImage("Parcel_PG_Dark");
+ sEventMatureImage = LLUI::getUIImage("Parcel_M_Dark");
// To Do: update the image resource for adult events.
- sEventAdultImage = LLUI::getUIImage("map_event_adult.tga");
+ sEventAdultImage = LLUI::getUIImage("Parcel_R_Dark");
sTrackCircleImage = LLUI::getUIImage("map_track_16.tga");
sTrackArrowImage = LLUI::getUIImage("direction_arrow.tga");
@@ -310,7 +312,7 @@ void LLWorldMapView::draw()
const S32 height = getRect().getHeight();
const F32 half_width = F32(width) / 2.0f;
const F32 half_height = F32(height) / 2.0f;
- LLVector3d camera_global = gAgent.getCameraPositionGlobal();
+ LLVector3d camera_global = gAgentCamera.getCameraPositionGlobal();
S32 level = LLWorldMipmap::scaleToLevel(sMapScale);
@@ -884,35 +886,61 @@ void LLWorldMapView::drawFrustum()
F32 half_width_meters = far_clip_meters * tan( horiz_fov / 2 );
F32 half_width_pixels = half_width_meters * meters_to_pixels;
- F32 ctr_x = getRect().getWidth() * 0.5f + sPanX;
- F32 ctr_y = getRect().getHeight() * 0.5f + sPanY;
+ F32 ctr_x = getLocalRect().getWidth() * 0.5f + sPanX;
+ F32 ctr_y = getLocalRect().getHeight() * 0.5f + sPanY;
gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE);
// Since we don't rotate the map, we have to rotate the frustum.
gGL.pushMatrix();
+ {
gGL.translatef( ctr_x, ctr_y, 0 );
- glRotatef( atan2( LLViewerCamera::getInstance()->getAtAxis().mV[VX], LLViewerCamera::getInstance()->getAtAxis().mV[VY] ) * RAD_TO_DEG, 0.f, 0.f, -1.f);
// Draw triangle with more alpha in far pixels to make it
// fade out in distance.
gGL.begin( LLRender::TRIANGLES );
+ {
+ // get camera look at and left axes
+ LLVector3 at_axis = LLViewerCamera::instance().getAtAxis();
+ LLVector3 left_axis = LLViewerCamera::instance().getLeftAxis();
+
+ // grab components along XY plane
+ LLVector2 cam_lookat(at_axis.mV[VX], at_axis.mV[VY]);
+ LLVector2 cam_left(left_axis.mV[VX], left_axis.mV[VY]);
+
+ // but, when looking near straight up or down...
+ if (is_approx_zero(cam_lookat.magVecSquared()))
+ {
+ //...just fall back to looking down the x axis
+ cam_lookat = LLVector2(1.f, 0.f); // x axis
+ cam_left = LLVector2(0.f, 1.f); // y axis
+ }
+
+ // normalize to unit length
+ cam_lookat.normVec();
+ cam_left.normVec();
+
gGL.color4f(1.f, 1.f, 1.f, 0.25f);
gGL.vertex2f( 0, 0 );
gGL.color4f(1.f, 1.f, 1.f, 0.02f);
- gGL.vertex2f( -half_width_pixels, far_clip_pixels );
+
+ // use 2d camera vectors to render frustum triangle
+ LLVector2 vert = cam_lookat * far_clip_pixels + cam_left * half_width_pixels;
+ gGL.vertex2f(vert.mV[VX], vert.mV[VY]);
- gGL.color4f(1.f, 1.f, 1.f, 0.02f);
- gGL.vertex2f( half_width_pixels, far_clip_pixels );
+ vert = cam_lookat * far_clip_pixels - cam_left * half_width_pixels;
+ gGL.vertex2f(vert.mV[VX], vert.mV[VY]);
+ }
gGL.end();
+ }
gGL.popMatrix();
}
LLVector3 LLWorldMapView::globalPosToView( const LLVector3d& global_pos )
{
- LLVector3d relative_pos_global = global_pos - gAgent.getCameraPositionGlobal();
+ LLVector3d relative_pos_global = global_pos - gAgentCamera.getCameraPositionGlobal();
LLVector3 pos_local;
pos_local.setVec(relative_pos_global); // convert to floats from doubles
@@ -1005,7 +1033,7 @@ LLVector3d LLWorldMapView::viewPosToGlobal( S32 x, S32 y )
LLVector3d pos_global;
pos_global.setVec( pos_local );
- pos_global += gAgent.getCameraPositionGlobal();
+ pos_global += gAgentCamera.getCameraPositionGlobal();
if(gAgent.isGodlike())
{
pos_global.mdV[VZ] = GODLY_TELEPORT_HEIGHT; // Godly height should always be 200.
@@ -1044,18 +1072,10 @@ BOOL LLWorldMapView::handleToolTip( S32 x, S32 y, MASK mask )
// zoomed out, so don't display anything about the count. JC
if (agent_count > 0)
{
- // Merov: i18n horror!!! Even using gettext(), concatenating strings is not localizable.
- // The singular/plural switch form here under might make no sense in some languages. Don't do that.
- message += llformat("\n%d ", agent_count);
-
- if (agent_count == 1)
- {
- message += "person";
- }
- else
- {
- message += "people";
- }
+ LLStringUtil::format_map_t string_args;
+ string_args["[NUMBER]"] = llformat("%d", agent_count);
+ message += '\n';
+ message += getString((agent_count == 1 ? "world_map_person" : "world_map_people") , string_args);
}
}
tooltip_msg.assign( message );
@@ -1637,7 +1657,7 @@ void LLWorldMapView::updateVisibleBlocks()
// Load the blocks visible in the current World Map view
// Get the World Map view coordinates and boundaries
- LLVector3d camera_global = gAgent.getCameraPositionGlobal();
+ LLVector3d camera_global = gAgentCamera.getCameraPositionGlobal();
const S32 width = getRect().getWidth();
const S32 height = getRect().getHeight();
const F32 half_width = F32(width) / 2.0f;
@@ -1726,7 +1746,10 @@ BOOL LLWorldMapView::handleDoubleClick( S32 x, S32 y, MASK mask )
id.toString(uuid_str);
uuid_str = uuid_str.substr(28);
sscanf(uuid_str.c_str(), "%X", &event_id);
- LLFloaterReg::showInstance("search", LLSD().with("category", "events").with("id", event_id));
+ // Invoke the event details floater if someone is clicking on an event.
+ LLSD params(LLSD::emptyArray());
+ params.append(event_id);
+ LLCommandDispatcher::dispatch("event", params, LLSD(), NULL, true);
break;
}
case MAP_ITEM_LAND_FOR_SALE:
diff --git a/indra/newview/llworldmipmap.cpp b/indra/newview/llworldmipmap.cpp
index 1cdccd2baa..debd6b611f 100644
--- a/indra/newview/llworldmipmap.cpp
+++ b/indra/newview/llworldmipmap.cpp
@@ -33,6 +33,7 @@
#include "llviewerprecompiledheaders.h"
#include "llworldmipmap.h"
+#include "llviewercontrol.h" // LLControlGroup
#include "llviewertexturelist.h"
#include "math.h" // log()
@@ -186,8 +187,8 @@ LLPointer<LLViewerFetchedTexture> LLWorldMipmap::getObjectsTile(U32 grid_x, U32
LLPointer<LLViewerFetchedTexture> LLWorldMipmap::loadObjectsTile(U32 grid_x, U32 grid_y, S32 level)
{
// Get the grid coordinates
- std::string imageurl = llformat("http://map.secondlife.com.s3.amazonaws.com/map-%d-%d-%d-objects.jpg",
- level, grid_x, grid_y);
+ std::string imageurl = gSavedSettings.getString("MapServerURL") + llformat("map-%d-%d-%d-objects.jpg", level, grid_x, grid_y);
+
// DO NOT COMMIT!! DEBUG ONLY!!!
// Use a local jpeg for every tile to test map speed without S3 access
diff --git a/indra/newview/llworldview.cpp b/indra/newview/llworldview.cpp
new file mode 100644
index 0000000000..b44a365677
--- /dev/null
+++ b/indra/newview/llworldview.cpp
@@ -0,0 +1,67 @@
+/**
+ * @file llworldview.cpp
+ * @brief LLWorldView class implementation
+ *
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+
+#include "llviewerprecompiledheaders.h"
+
+#include "llworldview.h"
+
+#include "llviewercontrol.h"
+#include "llsidetray.h"
+/////////////////////////////////////////////////////
+// LLFloaterView
+
+static LLDefaultChildRegistry::Register<LLWorldView> r("world_view");
+
+LLWorldView::LLWorldView(const Params& p)
+: LLUICtrl (p)
+{
+ gSavedSettings.getControl("SidebarCameraMovement")->getSignal()->connect(boost::bind(&LLWorldView::toggleSidebarCameraMovement, this, _2));
+}
+
+void LLWorldView::reshape(S32 width, S32 height, BOOL called_from_parent)
+{
+ //if (FALSE == gSavedSettings.getBOOL("SidebarCameraMovement") )
+ //{
+ // LLView* main_view = LLUI::getRootView()->findChild<LLView>("main_view");
+ // if(main_view)
+ // {
+ // width = main_view->getRect().getWidth();
+ // }
+ //}
+
+ LLUICtrl::reshape(width, height, called_from_parent);
+}
+void LLWorldView::toggleSidebarCameraMovement(const LLSD::Boolean& new_visibility)
+{
+ reshape(getParent()->getRect().getWidth(),getRect().getHeight());
+}
+
diff --git a/indra/newview/llxmlrpclistener.cpp b/indra/newview/llxmlrpclistener.cpp
index 15417614af..8237132ac5 100644
--- a/indra/newview/llxmlrpclistener.cpp
+++ b/indra/newview/llxmlrpclistener.cpp
@@ -28,6 +28,7 @@
#include "llerror.h"
#include "stringize.h"
#include "llxmlrpctransaction.h"
+#include "llsecapi.h"
#if LL_WINDOWS
#pragma warning (disable : 4355) // 'this' used in initializer list: yes, intentionally
@@ -356,7 +357,22 @@ public:
<< data["errorcode"].asString()
<< " (" << data["error"].asString() << ")"
<< LL_ENDL;
- // In addition to CURLE_OK, LLUserAuth distinguishes different error
+
+ switch (curlcode)
+ {
+ case CURLE_SSL_PEER_CERTIFICATE:
+ case CURLE_SSL_CACERT:
+ {
+ LLPointer<LLCertificate> error_cert(mTransaction->getErrorCert());
+ if(error_cert)
+ {
+ data["certificate"] = error_cert->getPem();
+ }
+ break;
+ }
+ default:
+ break;
+ }
// values of 'curlcode':
// CURLE_COULDNT_RESOLVE_HOST,
// CURLE_SSL_PEER_CERTIFICATE,
diff --git a/indra/newview/llxmlrpctransaction.cpp b/indra/newview/llxmlrpctransaction.cpp
index c19be37e75..1d10ec7b28 100644
--- a/indra/newview/llxmlrpctransaction.cpp
+++ b/indra/newview/llxmlrpctransaction.cpp
@@ -31,6 +31,9 @@
*/
#include "llviewerprecompiledheaders.h"
+#include <openssl/x509_vfy.h>
+#include <openssl/ssl.h>
+#include "llsecapi.h"
#include "llxmlrpctransaction.h"
#include "llxmlrpclistener.h"
@@ -42,6 +45,7 @@
#include <xmlrpc-epi/xmlrpc.h>
#include "llappviewer.h"
+#include "lltrans.h"
// Static instance of LLXMLRPCListener declared here so that every time we
// bring in this code, we instantiate a listener. If we put the static
@@ -176,6 +180,8 @@ public:
std::string mResponseText;
XMLRPC_REQUEST mResponse;
+ std::string mCertStore;
+ LLPointer<LLCertificate> mErrorCert;
Impl(const std::string& uri, XMLRPC_REQUEST request, bool useGzip);
Impl(const std::string& uri,
@@ -190,7 +196,8 @@ public:
private:
void init(XMLRPC_REQUEST request, bool useGzip);
-
+ static int _sslCertVerifyCallback(X509_STORE_CTX *ctx, void *param);
+ static CURLcode _sslCtxFunction(CURL * curl, void *sslctx, void *param);
static size_t curlDownloadCallback(
char* data, size_t size, size_t nmemb, void* user_data);
};
@@ -228,8 +235,75 @@ LLXMLRPCTransaction::Impl::Impl(const std::string& uri,
XMLRPC_RequestFree(request, 1);
}
+// _sslCertVerifyCallback
+// callback called when a cert verification is requested.
+// calls SECAPI to validate the context
+int LLXMLRPCTransaction::Impl::_sslCertVerifyCallback(X509_STORE_CTX *ctx, void *param)
+{
+ LLXMLRPCTransaction::Impl *transaction = (LLXMLRPCTransaction::Impl *)param;
+ LLPointer<LLCertificateStore> store = gSecAPIHandler->getCertificateStore(transaction->mCertStore);
+ LLPointer<LLCertificateChain> chain = gSecAPIHandler->getCertificateChain(ctx);
+ LLSD validation_params = LLSD::emptyMap();
+ LLURI uri(transaction->mURI);
+ validation_params[CERT_HOSTNAME] = uri.hostName();
+ try
+ {
+ // don't validate hostname. Let libcurl do it instead. That way, it'll handle redirects
+ store->validate(VALIDATION_POLICY_SSL & (~VALIDATION_POLICY_HOSTNAME), chain, validation_params);
+ }
+ catch (LLCertValidationTrustException& cert_exception)
+ {
+ // this exception is is handled differently than the general cert
+ // exceptions, as we allow the user to actually add the certificate
+ // for trust.
+ // therefore we pass back a different error code
+ // NOTE: We're currently 'wired' to pass around CURL error codes. This is
+ // somewhat clumsy, as we may run into errors that do not map directly to curl
+ // error codes. Should be refactored with login refactoring, perhaps.
+ transaction->mCurlCode = CURLE_SSL_CACERT;
+ // set the status directly. set curl status generates error messages and we want
+ // to use the fixed ones from the exceptions
+ transaction->setStatus(StatusCURLError, cert_exception.getMessage(), std::string());
+ // We should probably have a more generic way of passing information
+ // back to the error handlers.
+ transaction->mErrorCert = cert_exception.getCert();
+ return 0;
+ }
+ catch (LLCertException& cert_exception)
+ {
+ transaction->mCurlCode = CURLE_SSL_PEER_CERTIFICATE;
+ // set the status directly. set curl status generates error messages and we want
+ // to use the fixed ones from the exceptions
+ transaction->setStatus(StatusCURLError, cert_exception.getMessage(), std::string());
+ transaction->mErrorCert = cert_exception.getCert();
+ return 0;
+ }
+ catch (...)
+ {
+ // any other odd error, we just handle as a connect error.
+ transaction->mCurlCode = CURLE_SSL_CONNECT_ERROR;
+ transaction->setCurlStatus(CURLE_SSL_CONNECT_ERROR);
+ return 0;
+ }
+ return 1;
+}
+// _sslCtxFunction
+// Callback function called when an SSL Context is created via CURL
+// used to configure the context for custom cert validate(<, <#const & xs#>, <#T * #>, <#long #>)tion
+// based on SECAPI
+CURLcode LLXMLRPCTransaction::Impl::_sslCtxFunction(CURL * curl, void *sslctx, void *param)
+{
+ SSL_CTX * ctx = (SSL_CTX *) sslctx;
+ // disable any default verification for server certs
+ SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, NULL);
+ // set the verification callback.
+ SSL_CTX_set_cert_verify_callback(ctx, _sslCertVerifyCallback, param);
+ // the calls are void
+ return CURLE_OK;
+
+}
void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip)
{
@@ -237,6 +311,7 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip)
{
mCurlRequest = new LLCurlEasyRequest();
}
+ mErrorCert = NULL;
if (gSavedSettings.getBOOL("BrowserProxyEnabled"))
{
@@ -252,10 +327,13 @@ void LLXMLRPCTransaction::Impl::init(XMLRPC_REQUEST request, bool useGzip)
// mCurlRequest->setopt(CURLOPT_VERBOSE, 1); // usefull for debugging
mCurlRequest->setopt(CURLOPT_NOSIGNAL, 1);
mCurlRequest->setWriteCallback(&curlDownloadCallback, (void*)this);
- mCurlRequest->setopt(CURLOPT_SSL_VERIFYPEER, LLCurl::getSSLVerify());
- mCurlRequest->setopt(CURLOPT_SSL_VERIFYHOST, LLCurl::getSSLVerify() ? 2 : 0);
+ BOOL vefifySSLCert = !gSavedSettings.getBOOL("NoVerifySSLCert");
+ mCertStore = gSavedSettings.getString("CertStore");
+ mCurlRequest->setopt(CURLOPT_SSL_VERIFYPEER, vefifySSLCert);
+ mCurlRequest->setopt(CURLOPT_SSL_VERIFYHOST, vefifySSLCert ? 2 : 0);
// Be a little impatient about establishing connections.
mCurlRequest->setopt(CURLOPT_CONNECTTIMEOUT, 40L);
+ mCurlRequest->setSSLCtxCallback(_sslCtxFunction, (void *)this);
/* Setting the DNS cache timeout to -1 disables it completely.
This might help with bug #503 */
@@ -341,11 +419,19 @@ bool LLXMLRPCTransaction::Impl::process()
{
if (result != CURLE_OK)
{
- setCurlStatus(result);
- llwarns << "LLXMLRPCTransaction CURL error "
- << mCurlCode << ": " << mCurlRequest->getErrorString() << llendl;
- llwarns << "LLXMLRPCTransaction request URI: "
- << mURI << llendl;
+ if ((result != CURLE_SSL_PEER_CERTIFICATE) &&
+ (result != CURLE_SSL_CACERT))
+ {
+ // if we have a curl error that's not already been handled
+ // (a non cert error), then generate the error message as
+ // appropriate
+ setCurlStatus(result);
+
+ llwarns << "LLXMLRPCTransaction CURL error "
+ << mCurlCode << ": " << mCurlRequest->getErrorString() << llendl;
+ llwarns << "LLXMLRPCTransaction request URI: "
+ << mURI << llendl;
+ }
return true;
}
@@ -423,17 +509,11 @@ void LLXMLRPCTransaction::Impl::setStatus(EStatus status,
case StatusComplete:
mStatusMessage = "(done)";
break;
-
default:
// Usually this means that there's a problem with the login server,
// not with the client. Direct user to status page.
- mStatusMessage =
- "Despite our best efforts, something unexpected has gone wrong. \n"
- " \n"
- "Please check secondlife.com/status \n"
- "to see if there is a known problem with the service.";
-
- mStatusURI = "http://secondlife.com/status/";
+ mStatusMessage = LLTrans::getString("server_is_down");
+ mStatusURI = "http://status.secondlifegrid.net/";
}
}
}
@@ -467,7 +547,7 @@ void LLXMLRPCTransaction::Impl::setCurlStatus(CURLcode code)
"Often this means that your computer\'s clock is set incorrectly.\n"
"Please go to Control Panels and make sure the time and date\n"
"are set correctly.\n"
- "\n"
+ "Also check that your network and firewall are set up correctly.\n"
"If you continue to receive this error, please go\n"
"to the Support section of the SecondLife.com web site\n"
"and report the problem.";
@@ -539,6 +619,11 @@ std::string LLXMLRPCTransaction::statusMessage()
return impl.mStatusMessage;
}
+LLPointer<LLCertificate> LLXMLRPCTransaction::getErrorCert()
+{
+ return impl.mErrorCert;
+}
+
std::string LLXMLRPCTransaction::statusURI()
{
return impl.mStatusURI;
diff --git a/indra/newview/llxmlrpctransaction.h b/indra/newview/llxmlrpctransaction.h
index c835423d67..8beb2e2623 100644
--- a/indra/newview/llxmlrpctransaction.h
+++ b/indra/newview/llxmlrpctransaction.h
@@ -38,6 +38,7 @@
typedef struct _xmlrpc_request* XMLRPC_REQUEST;
typedef struct _xmlrpc_value* XMLRPC_VALUE;
// foward decl of types from xmlrpc.h (this usage is type safe)
+class LLCertificate;
class LLXMLRPCValue
// a c++ wrapper around XMLRPC_VALUE
@@ -115,6 +116,8 @@ public:
EStatus status(int* curlCode);
// return status, and extended CURL code, if code isn't null
+
+ LLPointer<LLCertificate> getErrorCert();
std::string statusMessage();
// return a message string, suitable for showing the user
std::string statusURI();
diff --git a/indra/newview/macview_Prefix.h b/indra/newview/macview_Prefix.h
index a71362a139..07f8093426 100644
--- a/indra/newview/macview_Prefix.h
+++ b/indra/newview/macview_Prefix.h
@@ -65,7 +65,6 @@
#include "llfloater.h"
#include "llfloaterbuildoptions.h"
#include "llfloaterchat.h"
-#include "llfloatercustomize.h"
#include "llfloatergroups.h"
#include "llfloaterworldmap.h"
#include "llfloatermute.h"
diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp
index 4f4fc83819..ee3a2fc34f 100644
--- a/indra/newview/pipeline.cpp
+++ b/indra/newview/pipeline.cpp
@@ -56,6 +56,7 @@
// newview includes
#include "llagent.h"
+#include "llagentcamera.h"
#include "lldrawable.h"
#include "lldrawpoolalpha.h"
#include "lldrawpoolavatar.h"
@@ -116,7 +117,6 @@ const F32 BACKLIGHT_DAY_MAGNITUDE_AVATAR = 0.2f;
const F32 BACKLIGHT_NIGHT_MAGNITUDE_AVATAR = 0.1f;
const F32 BACKLIGHT_DAY_MAGNITUDE_OBJECT = 0.1f;
const F32 BACKLIGHT_NIGHT_MAGNITUDE_OBJECT = 0.08f;
-const S32 MAX_ACTIVE_OBJECT_QUIET_FRAMES = 40;
const S32 MAX_OFFSCREEN_GEOMETRY_CHANGES_PER_FRAME = 10;
const U32 REFLECTION_MAP_RES = 128;
@@ -271,6 +271,7 @@ BOOL LLPipeline::sDelayVBUpdate = TRUE;
BOOL LLPipeline::sFastAlpha = TRUE;
BOOL LLPipeline::sDisableShaders = FALSE;
BOOL LLPipeline::sRenderBump = TRUE;
+BOOL LLPipeline::sUseTriStrips = TRUE;
BOOL LLPipeline::sUseFarClip = TRUE;
BOOL LLPipeline::sShadowRender = FALSE;
BOOL LLPipeline::sWaterReflections = FALSE;
@@ -283,6 +284,7 @@ BOOL LLPipeline::sRenderFrameTest = FALSE;
BOOL LLPipeline::sRenderAttachedLights = TRUE;
BOOL LLPipeline::sRenderAttachedParticles = TRUE;
BOOL LLPipeline::sRenderDeferred = FALSE;
+BOOL LLPipeline::sAllowRebuildPriorityGroup = FALSE ;
S32 LLPipeline::sVisibleLightCount = 0;
F32 LLPipeline::sMinRenderSize = 0.f;
@@ -359,6 +361,7 @@ void LLPipeline::init()
sDynamicLOD = gSavedSettings.getBOOL("RenderDynamicLOD");
sRenderBump = gSavedSettings.getBOOL("RenderObjectBump");
+ sUseTriStrips = gSavedSettings.getBOOL("RenderUseTriStrips");
sRenderAttachedLights = gSavedSettings.getBOOL("RenderAttachedLights");
sRenderAttachedParticles = gSavedSettings.getBOOL("RenderAttachedParticles");
@@ -477,8 +480,6 @@ void LLPipeline::cleanup()
releaseGLBuffers();
- mBloomImagep = NULL;
- mBloomImage2p = NULL;
mFaceSelectImagep = NULL;
mMovedBridge.clear();
@@ -1355,6 +1356,7 @@ void LLPipeline::updateMoveNormalAsync(LLDrawable* drawablep)
if (!drawablep)
{
llerrs << "updateMove called with NULL drawablep" << llendl;
+ return;
}
if (drawablep->isState(LLDrawable::EARLY_MOVE))
{
@@ -1411,38 +1413,26 @@ void LLPipeline::updateMove()
assertInitialized();
- for (LLDrawable::drawable_set_t::iterator iter = mRetexturedList.begin();
- iter != mRetexturedList.end(); ++iter)
{
- LLDrawable* drawablep = *iter;
- if (drawablep && !drawablep->isDead())
- {
- drawablep->updateTexture();
- }
- }
- mRetexturedList.clear();
-
- updateMovedList(mMovedList);
+ static LLFastTimer::DeclareTimer ftm("Retexture");
+ LLFastTimer t(ftm);
- for (LLDrawable::drawable_set_t::iterator iter = mActiveQ.begin();
- iter != mActiveQ.end(); )
- {
- LLDrawable::drawable_set_t::iterator curiter = iter++;
- LLDrawable* drawablep = *curiter;
- if (drawablep && !drawablep->isDead())
+ for (LLDrawable::drawable_set_t::iterator iter = mRetexturedList.begin();
+ iter != mRetexturedList.end(); ++iter)
{
- if (drawablep->isRoot() &&
- drawablep->mQuietCount++ > MAX_ACTIVE_OBJECT_QUIET_FRAMES &&
- (!drawablep->getParent() || !drawablep->getParent()->isActive()))
+ LLDrawable* drawablep = *iter;
+ if (drawablep && !drawablep->isDead())
{
- drawablep->makeStatic(); // removes drawable and its children from mActiveQ
- iter = mActiveQ.upper_bound(drawablep); // next valid entry
+ drawablep->updateTexture();
}
}
- else
- {
- mActiveQ.erase(curiter);
- }
+ mRetexturedList.clear();
+ }
+
+ {
+ static LLFastTimer::DeclareTimer ftm("Moved List");
+ LLFastTimer t(ftm);
+ updateMovedList(mMovedList);
}
//balance octrees
@@ -1791,6 +1781,12 @@ void LLPipeline::updateGL()
void LLPipeline::rebuildPriorityGroups()
{
+ if(!sAllowRebuildPriorityGroup)
+ {
+ return ;
+ }
+ sAllowRebuildPriorityGroup = FALSE ;
+
LLTimer update_timer;
LLMemType mt(LLMemType::MTYPE_PIPELINE);
@@ -1810,7 +1806,6 @@ void LLPipeline::rebuildPriorityGroups()
void LLPipeline::rebuildGroups()
{
- llpushcallstacks ;
// Iterate through some drawables on the non-priority build queue
S32 size = (S32) mGroupQ2.size();
S32 min_count = llclamp((S32) ((F32) (size * size)/4096*0.25f), 1, size);
@@ -1970,7 +1965,7 @@ void LLPipeline::markVisible(LLDrawable *drawablep, LLCamera& camera)
if (root && root->getParent() && root->getVObj() && root->getVObj()->isAttachment())
{
LLVOAvatar* av = root->getParent()->getVObj()->asAvatar();
- if (av->isImpostor())
+ if (av && av->isImpostor())
{
return;
}
@@ -2212,7 +2207,6 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
//LLVertexBuffer::unbind();
grabReferences(result);
-
for (LLCullResult::sg_list_t::iterator iter = sCull->beginDrawableGroups(); iter != sCull->endDrawableGroups(); ++iter)
{
LLSpatialGroup* group = *iter;
@@ -2230,7 +2224,6 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
}
}
}
-
for (LLCullResult::sg_list_t::iterator iter = sCull->beginVisibleGroups(); iter != sCull->endVisibleGroups(); ++iter)
{
LLSpatialGroup* group = *iter;
@@ -2246,7 +2239,6 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
}
}
-
if (LLViewerCamera::sCurCameraID == LLViewerCamera::CAMERA_WORLD)
{
for (LLCullResult::bridge_list_t::iterator i = sCull->beginVisibleBridge(); i != sCull->endVisibleBridge(); ++i)
@@ -2260,7 +2252,7 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
}
}
}
-
+ llpushcallstacks ;
{
LLFastTimer ftm(FTM_STATESORT_DRAWABLE);
for (LLCullResult::drawable_list_t::iterator iter = sCull->beginVisibleList();
@@ -2273,13 +2265,15 @@ void LLPipeline::stateSort(LLCamera& camera, LLCullResult &result)
}
}
}
-
+ llpushcallstacks ;
{
LLFastTimer ftm(FTM_CLIENT_COPY);
LLVertexBuffer::clientCopy();
}
-
+ llpushcallstacks ;
+
postSort(camera);
+ llpushcallstacks ;
}
void LLPipeline::stateSort(LLSpatialGroup* group, LLCamera& camera)
@@ -2789,10 +2783,8 @@ void render_hud_elements()
LLViewerParcelMgr::getInstance()->render();
LLViewerParcelMgr::getInstance()->renderParcelCollision();
- // Render debugging beacons.
- //gObjectList.renderObjectBeacons();
- //LLHUDObject::renderAll();
- //gObjectList.resetObjectBeacons();
+ // Render name tags.
+ LLHUDObject::renderAll();
}
else if (gForceRenderLandFence)
{
@@ -2971,6 +2963,9 @@ void LLPipeline::renderHighlights()
}
}
+//debug use
+U32 LLPipeline::sCurRenderPoolType = 0 ;
+
void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
{
LLMemType mt(LLMemType::MTYPE_PIPELINE_RENDER_GEOM);
@@ -3058,12 +3053,6 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
}
}
- if (gPipeline.hasRenderDebugMask(LLPipeline::RENDER_DEBUG_PICKING))
- {
- LLAppViewer::instance()->pingMainloopTimeout("Pipeline:RenderForSelect");
- gObjectList.renderObjectsForSelect(camera, gViewerWindow->getWindowRectScaled());
- }
- else
{
LLFastTimer t(FTM_POOLS);
@@ -3086,6 +3075,9 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
cur_type = poolp->getType();
+ //debug use
+ sCurRenderPoolType = cur_type ;
+
if (occlude && cur_type >= LLDrawPool::POOL_GRASS)
{
occlude = FALSE;
@@ -3203,7 +3195,6 @@ void LLPipeline::renderGeom(LLCamera& camera, BOOL forceVBOUpdate)
{
// Render debugging beacons.
gObjectList.renderObjectBeacons();
- LLHUDObject::renderAll();
gObjectList.resetObjectBeacons();
}
@@ -3435,7 +3426,6 @@ void LLPipeline::renderGeomPostDeferred(LLCamera& camera)
{
// Render debugging beacons.
gObjectList.renderObjectBeacons();
- LLHUDObject::renderAll();
gObjectList.resetObjectBeacons();
}
@@ -3514,9 +3504,19 @@ void LLPipeline::renderGeomShadow(LLCamera& camera)
}
-void LLPipeline::addTrianglesDrawn(S32 count)
+void LLPipeline::addTrianglesDrawn(S32 index_count, U32 render_type)
{
assertInitialized();
+ S32 count = 0;
+ if (render_type == LLRender::TRIANGLE_STRIP)
+ {
+ count = index_count-2;
+ }
+ else
+ {
+ count = index_count/3;
+ }
+
mTrianglesDrawn += count;
mBatchCount++;
mMaxBatchSize = llmax(mMaxBatchSize, count);
@@ -3867,15 +3867,14 @@ void LLPipeline::renderForSelect(std::set<LLViewerObject*>& objects, BOOL render
}
// pick HUD objects
- LLVOAvatar* avatarp = gAgent.getAvatarObject();
- if (avatarp && sShowHUDAttachments)
+ if (isAgentAvatarValid() && sShowHUDAttachments)
{
glh::matrix4f save_proj(glh_get_current_projection());
glh::matrix4f save_model(glh_get_current_modelview());
setup_hud_matrices(screen_rect);
- for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin();
- iter != avatarp->mAttachmentPoints.end(); )
+ for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin();
+ iter != gAgentAvatarp->mAttachmentPoints.end(); )
{
LLVOAvatar::attachment_map_t::iterator curiter = iter++;
LLViewerJointAttachment* attachment = curiter->second;
@@ -3975,9 +3974,9 @@ void LLPipeline::rebuildPools()
max_count--;
}
- if (gAgent.getAvatarObject())
+ if (isAgentAvatarValid())
{
- gAgent.getAvatarObject()->rebuildHUD();
+ gAgentAvatarp->rebuildHUD();
}
}
@@ -4373,7 +4372,7 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
// mNearbyLight (and all light_set_t's) are sorted such that
// begin() == the closest light and rbegin() == the farthest light
const S32 MAX_LOCAL_LIGHTS = 6;
-// LLVector3 cam_pos = gAgent.getCameraPositionAgent();
+// LLVector3 cam_pos = gAgentCamera.getCameraPositionAgent();
LLVector3 cam_pos = LLViewerJoystick::getInstance()->getOverrideCamera() ?
camera.getOrigin() :
gAgent.getPositionAgent();
@@ -4609,8 +4608,8 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
glLightfv(gllight, GL_SPECULAR, LLColor4::black.mV);
}
- if (gAgent.getAvatarObject() &&
- gAgent.getAvatarObject()->mSpecialRenderMode == 3)
+ if (isAgentAvatarValid() &&
+ gAgentAvatarp->mSpecialRenderMode == 3)
{
LLColor4 light_color = LLColor4::white;
light_color.mV[3] = 0.0f;
@@ -4719,15 +4718,13 @@ void LLPipeline::enableLightsDynamic()
glColor4f(0.f, 0.f, 0.f, 1.f); // no local lighting by default
}
- LLVOAvatar* avatarp = gAgent.getAvatarObject();
-
- if (avatarp && getLightingDetail() <= 0)
+ if (isAgentAvatarValid() && getLightingDetail() <= 0)
{
- if (avatarp->mSpecialRenderMode == 0) // normal
+ if (gAgentAvatarp->mSpecialRenderMode == 0) // normal
{
gPipeline.enableLightsAvatar();
}
- else if (avatarp->mSpecialRenderMode >= 1) // anim preview
+ else if (gAgentAvatarp->mSpecialRenderMode >= 1) // anim preview
{
gPipeline.enableLightsAvatarEdit(LLColor4(0.7f, 0.6f, 0.3f, 1.f));
}
@@ -4797,10 +4794,6 @@ void LLPipeline::findReferences(LLDrawable *drawablep)
llinfos << "In mRetexturedList" << llendl;
}
- if (mActiveQ.find(drawablep) != mActiveQ.end())
- {
- llinfos << "In mActiveQ" << llendl;
- }
if (std::find(mBuildQ1.begin(), mBuildQ1.end(), drawablep) != mBuildQ1.end())
{
llinfos << "In mBuildQ1" << llendl;
@@ -4957,19 +4950,6 @@ void LLPipeline::setLight(LLDrawable *drawablep, BOOL is_light)
}
}
-void LLPipeline::setActive(LLDrawable *drawablep, BOOL active)
-{
- assertInitialized();
- if (active)
- {
- mActiveQ.insert(drawablep);
- }
- else
- {
- mActiveQ.erase(drawablep);
- }
-}
-
//static
void LLPipeline::toggleRenderType(U32 type)
{
@@ -5385,6 +5365,7 @@ void LLPipeline::resetVertexBuffers(LLDrawable* drawable)
void LLPipeline::resetVertexBuffers()
{
sRenderBump = gSavedSettings.getBOOL("RenderObjectBump");
+ sUseTriStrips = gSavedSettings.getBOOL("RenderUseTriStrips");
for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin();
iter != LLWorld::getInstance()->getRegionList().end(); ++iter)
@@ -7125,18 +7106,18 @@ inline float sgn(float a)
}
void LLPipeline::generateWaterReflection(LLCamera& camera_in)
-{
+{
if (LLPipeline::sWaterReflections && assertInitialized() && LLDrawPoolWater::sNeedsReflectionUpdate)
{
- LLVOAvatarSelf* avatar = gAgent.getAvatarObject();
- if (gAgent.getCameraAnimating() || gAgent.getCameraMode() != CAMERA_MODE_MOUSELOOK)
+ BOOL skip_avatar_update = FALSE;
+ if (gAgentCamera.getCameraAnimating() || gAgentCamera.getCameraMode() != CAMERA_MODE_MOUSELOOK)
{
- avatar = NULL;
+ skip_avatar_update = TRUE;
}
- if (avatar)
+ if (!skip_avatar_update)
{
- avatar->updateAttachmentVisibility(CAMERA_MODE_THIRD_PERSON);
+ gAgentAvatarp->updateAttachmentVisibility(CAMERA_MODE_THIRD_PERSON);
}
LLVertexBuffer::unbind();
@@ -7221,7 +7202,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
glCullFace(GL_FRONT);
-
static LLCullResult ref_result;
U32 ref_mask = 0;
if (LLDrawPoolWater::sNeedsDistortionUpdate)
@@ -7273,7 +7253,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
ref_mask = mRenderTypeMask;
mRenderTypeMask = mask;
}
-
if (LLDrawPoolWater::sNeedsDistortionUpdate)
{
mRenderTypeMask = ref_mask;
@@ -7291,7 +7270,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
}
camera.setOrigin(camera_in.getOrigin());
-
//render distortion map
static BOOL last_update = TRUE;
if (last_update)
@@ -7348,7 +7326,6 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
glClear(GL_DEPTH_BUFFER_BIT);
}
glClearColor(0.f, 0.f, 0.f, 0.f);
-
gViewerWindow->setup3DViewport();
mRenderTypeMask = type_mask;
LLDrawPoolWater::sNeedsReflectionUpdate = FALSE;
@@ -7360,9 +7337,9 @@ void LLPipeline::generateWaterReflection(LLCamera& camera_in)
LLGLState::checkTextureChannels();
LLGLState::checkClientArrays();
- if (avatar)
+ if (!skip_avatar_update)
{
- avatar->updateAttachmentVisibility(gAgent.getCameraMode());
+ gAgentAvatarp->updateAttachmentVisibility(gAgentCamera.getCameraMode());
}
}
}
@@ -7861,7 +7838,6 @@ void LLPipeline::renderHighlight(const LLViewerObject* obj, F32 fade)
void LLPipeline::generateHighlight(LLCamera& camera)
{
//render highlighted object as white into offscreen render target
-
if (mHighlightObject.notNull())
{
mHighlightSet.insert(HighlightItem(mHighlightObject));
diff --git a/indra/newview/pipeline.h b/indra/newview/pipeline.h
index 67004a5f2d..89649a0682 100644
--- a/indra/newview/pipeline.h
+++ b/indra/newview/pipeline.h
@@ -270,15 +270,14 @@ public:
void shiftObjects(const LLVector3 &offset);
void setLight(LLDrawable *drawablep, BOOL is_light);
- void setActive(LLDrawable *drawablep, BOOL active);
-
+
BOOL hasRenderBatches(const U32 type) const;
LLCullResult::drawinfo_list_t::iterator beginRenderMap(U32 type);
LLCullResult::drawinfo_list_t::iterator endRenderMap(U32 type);
LLCullResult::sg_list_t::iterator beginAlphaGroups();
LLCullResult::sg_list_t::iterator endAlphaGroups();
- void addTrianglesDrawn(S32 count);
+ void addTrianglesDrawn(S32 index_count, U32 render_type = LLRender::TRIANGLES);
BOOL hasRenderType(const U32 type) const { return (type && (mRenderTypeMask & (1<<type))) ? TRUE : FALSE; }
BOOL hasRenderDebugFeatureMask(const U32 mask) const { return (mRenderDebugFeatureMask & mask) ? TRUE : FALSE; }
BOOL hasRenderDebugMask(const U32 mask) const { return (mRenderDebugMask & mask) ? TRUE : FALSE; }
@@ -448,7 +447,7 @@ public:
static BOOL sFastAlpha;
static BOOL sDisableShaders; // if TRUE, rendering will be done without shaders
static BOOL sRenderBump;
- static BOOL sUseFBO;
+ static BOOL sUseTriStrips;
static BOOL sUseFarClip;
static BOOL sShadowRender;
static BOOL sWaterReflections;
@@ -463,6 +462,7 @@ public:
static BOOL sRenderAttachedLights;
static BOOL sRenderAttachedParticles;
static BOOL sRenderDeferred;
+ static BOOL sAllowRebuildPriorityGroup;
static S32 sVisibleLightCount;
static F32 sMinRenderSize;
@@ -589,8 +589,6 @@ protected:
LLViewerObject::vobj_list_t mCreateQ;
- LLDrawable::drawable_set_t mActiveQ;
-
LLDrawable::drawable_set_t mRetexturedList;
class HighlightItem
@@ -676,8 +674,6 @@ protected:
std::vector<LLFace*> mSelectedFaces;
LLPointer<LLViewerFetchedTexture> mFaceSelectImagep;
- LLPointer<LLViewerTexture> mBloomImagep;
- LLPointer<LLViewerTexture> mBloomImage2p;
U32 mLightMask;
U32 mLightMovingMask;
@@ -691,9 +687,13 @@ protected:
public:
static BOOL sRenderBeacons;
static BOOL sRenderHighlight;
+
+ //debug use
+ static U32 sCurRenderPoolType ;
};
void render_bbox(const LLVector3 &min, const LLVector3 &max);
+void render_hud_elements();
extern LLPipeline gPipeline;
extern BOOL gRenderForSelect;
diff --git a/indra/newview/res-sdl/ll_icon.BMP b/indra/newview/res-sdl/ll_icon.BMP
index 4a44aafbfa..6f9366df41 100644
--- a/indra/newview/res-sdl/ll_icon.BMP
+++ b/indra/newview/res-sdl/ll_icon.BMP
Binary files differ
diff --git a/indra/newview/res-sdl/toolbuy.BMP b/indra/newview/res-sdl/toolbuy.BMP
new file mode 100644
index 0000000000..07e9273721
--- /dev/null
+++ b/indra/newview/res-sdl/toolbuy.BMP
Binary files differ
diff --git a/indra/newview/res-sdl/toolopen.BMP b/indra/newview/res-sdl/toolopen.BMP
new file mode 100644
index 0000000000..5b87979304
--- /dev/null
+++ b/indra/newview/res-sdl/toolopen.BMP
Binary files differ
diff --git a/indra/newview/res-sdl/toolsit.BMP b/indra/newview/res-sdl/toolsit.BMP
new file mode 100644
index 0000000000..8ce59ae97a
--- /dev/null
+++ b/indra/newview/res-sdl/toolsit.BMP
Binary files differ
diff --git a/indra/newview/res/ll_icon.ico b/indra/newview/res/ll_icon.ico
index c35a3fa3a3..87985b9285 100644
--- a/indra/newview/res/ll_icon.ico
+++ b/indra/newview/res/ll_icon.ico
Binary files differ
diff --git a/indra/newview/res/ll_icon.png b/indra/newview/res/ll_icon.png
index 414b703111..ae573b3874 100644
--- a/indra/newview/res/ll_icon.png
+++ b/indra/newview/res/ll_icon.png
Binary files differ
diff --git a/indra/newview/res/resource.h b/indra/newview/res/resource.h
index da27e47dfb..6cabd5e10b 100644
--- a/indra/newview/res/resource.h
+++ b/indra/newview/res/resource.h
@@ -170,14 +170,12 @@
#define IDC_COMBO1 1138
#define IDC_COMBO_FARM 1138
#define ID_TESTMENU_TEST 40001
-#define IDC_STATIC -1
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE 159
-#define _APS_NEXT_RESOURCE_VALUE 167
+#define _APS_NEXT_RESOURCE_VALUE 173
#define _APS_NEXT_COMMAND_VALUE 40002
#define _APS_NEXT_CONTROL_VALUE 1139
#define _APS_NEXT_SYMED_VALUE 101
diff --git a/indra/newview/res/toolbuy.cur b/indra/newview/res/toolbuy.cur
new file mode 100644
index 0000000000..a1bc278116
--- /dev/null
+++ b/indra/newview/res/toolbuy.cur
Binary files differ
diff --git a/indra/newview/res/toolopen.cur b/indra/newview/res/toolopen.cur
new file mode 100644
index 0000000000..a72cdfe4c0
--- /dev/null
+++ b/indra/newview/res/toolopen.cur
Binary files differ
diff --git a/indra/newview/res/toolsit.cur b/indra/newview/res/toolsit.cur
new file mode 100644
index 0000000000..6327bdb281
--- /dev/null
+++ b/indra/newview/res/toolsit.cur
Binary files differ
diff --git a/indra/newview/res/viewerRes.rc b/indra/newview/res/viewerRes.rc
index 38291e45c9..df2fb2a6ea 100644
--- a/indra/newview/res/viewerRes.rc
+++ b/indra/newview/res/viewerRes.rc
@@ -2,19 +2,12 @@
//
#include "resource.h"
-#ifdef IDC_STATIC
-#undef IDC_STATIC
-#endif
-#define IDC_STATIC (-1)
-#include "winresrc.h"
-
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
-// Commented out because it only compiles if you have MFC installed.
-//#include "winres.h"
+#include "winres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
@@ -34,18 +27,18 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
// TEXTINCLUDE
//
-1 TEXTINCLUDE
+1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
-2 TEXTINCLUDE
+2 TEXTINCLUDE
BEGIN
"#include ""winres.h""\r\n"
"\0"
END
-3 TEXTINCLUDE
+3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
@@ -84,9 +77,8 @@ END
//
#ifdef APSTUDIO_INVOKED
-GUIDELINES DESIGNINFO
+GUIDELINES DESIGNINFO
BEGIN
-
"SPLASHSCREEN", DIALOG
BEGIN
LEFTMARGIN, 7
@@ -127,6 +119,9 @@ TOOLPIPETTE CURSOR "toolpipette.cur"
TOOLPLAY CURSOR "toolplay.cur"
TOOLPAUSE CURSOR "toolpause.cur"
TOOLMEDIAOPEN CURSOR "toolmediaopen.cur"
+TOOLBUY CURSOR "toolbuy.cur"
+TOOLOPEN CURSOR "toolopen.cur"
+TOOLSIT CURSOR "toolsit.cur"
/////////////////////////////////////////////////////////////////////////////
//
@@ -134,8 +129,8 @@ TOOLMEDIAOPEN CURSOR "toolmediaopen.cur"
//
VS_VERSION_INFO VERSIONINFO
- FILEVERSION 2,0,0,200030
- PRODUCTVERSION 2,0,0,200030
+ FILEVERSION 2,1,0,0
+ PRODUCTVERSION 2,1,0,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -152,12 +147,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "Linden Lab"
VALUE "FileDescription", "Second Life"
- VALUE "FileVersion", "2.0.0.200030"
+ VALUE "FileVersion", "2.1.0.0"
VALUE "InternalName", "Second Life"
VALUE "LegalCopyright", "Copyright © 2001-2008, Linden Research, Inc."
VALUE "OriginalFilename", "SecondLife.exe"
VALUE "ProductName", "Second Life"
- VALUE "ProductVersion", "2.0.0.200030"
+ VALUE "ProductVersion", "2.1.0.0"
END
END
BLOCK "VarFileInfo"
@@ -166,12 +161,6 @@ BEGIN
END
END
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Bitmap
-//
-
#endif // English (U.S.) resources
/////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/secondlife.icns b/indra/newview/secondlife.icns
index ceb6036e0e..4560d4bb24 100644
--- a/indra/newview/secondlife.icns
+++ b/indra/newview/secondlife.icns
Binary files differ
diff --git a/indra/newview/skins/default/colors.xml b/indra/newview/skins/default/colors.xml
index ca579616d8..e8a893e31b 100644
--- a/indra/newview/skins/default/colors.xml
+++ b/indra/newview/skins/default/colors.xml
@@ -61,7 +61,7 @@
value="0.26 0.345 0.263 1" />
<color
name="Red"
- value="0.729 0 0.121 1" />
+ value="1 0 0 1" />
<color
name="Blue"
value="0 0 1 1" />
@@ -197,7 +197,7 @@
value="0.5 0.5 0.5 1" />
<color
name="ColorPaletteEntry03"
- value="0.3344 0.5456 0.5159 1" />
+ value="0.5 0 0 1" />
<color
name="ColorPaletteEntry04"
value="0.5 0.5 0 1" />
@@ -239,7 +239,7 @@
reference="LtYellow" />
<color
name="ColorPaletteEntry17"
- reference="LtGreen" />
+ reference="White" />
<color
name="ColorPaletteEntry18"
reference="LtGray" />
@@ -248,7 +248,7 @@
reference="Red" />
<color
name="ColorPaletteEntry20"
- reference=".5 .5 1 0" />
+ reference="Yellow" />
<color
name="ColorPaletteEntry21"
reference="Green" />
@@ -286,6 +286,9 @@
name="ColorPaletteEntry32"
reference="White" />
<color
+ name="ComboListBgColor"
+ reference="DkGray" />
+ <color
name="ConsoleBackground"
reference="Black" />
<color
@@ -341,7 +344,7 @@
value="0.92 0.92 1 0.78" />
<color
name="GridlineColor"
- reference="Red" />
+ reference="White" />
<color
name="GridlineShadowColor"
value="0 0 0 0.31" />
@@ -356,7 +359,7 @@
reference="White"/>
<color
name="GroupNotifyDimmedTextColor"
- reference="DkGray" />
+ reference="LtGray" />
<color
name="GroupOverTierColor"
value="0.43 0.06 0.06 1" />
@@ -389,7 +392,7 @@
reference="Yellow" />
<color
name="HighlightInspectColor"
- value="1 0.5 0 1" />
+ value="1 0 1 1" />
<color
name="HighlightParentColor"
value="0.67 0.83 0.96 1" />
@@ -418,6 +421,12 @@
name="InventoryItemSuffixColor"
reference="White_25" />
<color
+ name="InventoryItemLibraryColor"
+ reference="EmphasisColor" />
+ <color
+ name="InventoryItemLinkColor"
+ reference="LtGray_50" />
+ <color
name="InventorySearchStatusColor"
reference="EmphasisColor" />
<color
@@ -521,7 +530,7 @@
reference="Unused?" />
<color
name="NetMapBackgroundColor"
- value="0 0 0 0.3" />
+ value="0 0 0 1" />
<color
name="NetMapGroupOwnAboveWater"
reference="Purple" />
@@ -554,7 +563,7 @@
reference="White" />
<color
name="ObjectChatColor"
- reference="EmphasisColor_35" />
+ reference="EmphasisColor" />
<color
name="OverdrivenColor"
reference="Red" />
@@ -728,7 +737,10 @@
<color
name="ChatToastAgentNameColor"
reference="EmphasisColor" />
- <color
+ <color
name="ColorSwatchBorderColor"
value="0.45098 0.517647 0.607843 1"/>
+ <color
+ name="ChatTimestampColor"
+ reference="White" />
</colors>
diff --git a/indra/newview/skins/default/html/da/loading/loading.html b/indra/newview/skins/default/html/da/loading/loading.html
index cdad5702b9..5f3426eb60 100644
--- a/indra/newview/skins/default/html/da/loading/loading.html
+++ b/indra/newview/skins/default/html/da/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Indlæser...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Indlæser...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/de/loading/loading.html b/indra/newview/skins/default/html/de/loading/loading.html
index 3eddbc24f5..44a621b216 100644
--- a/indra/newview/skins/default/html/de/loading/loading.html
+++ b/indra/newview/skins/default/html/de/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Wird geladen...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Wird geladen...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/en-us/loading/loading.html b/indra/newview/skins/default/html/en-us/loading/loading.html
index 34e5c84c4d..1c62d2f73e 100644
--- a/indra/newview/skins/default/html/en-us/loading/loading.html
+++ b/indra/newview/skins/default/html/en-us/loading/loading.html
@@ -1,9 +1,9 @@
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;loading...
- </td>
- </tr>
-</table>
-</body>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;loading...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/es/loading/loading.html b/indra/newview/skins/default/html/es/loading/loading.html
index f03284ba8c..c4260b34c0 100644
--- a/indra/newview/skins/default/html/es/loading/loading.html
+++ b/indra/newview/skins/default/html/es/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Cargando...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Cargando...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/fr/loading/loading.html b/indra/newview/skins/default/html/fr/loading/loading.html
index 23c0ef03bc..b3953448e9 100644
--- a/indra/newview/skins/default/html/fr/loading/loading.html
+++ b/indra/newview/skins/default/html/fr/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Chargement...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Chargement...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/hu/loading/loading.html b/indra/newview/skins/default/html/hu/loading/loading.html
index ade91f76c2..ab15a073ba 100644
--- a/indra/newview/skins/default/html/hu/loading/loading.html
+++ b/indra/newview/skins/default/html/hu/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Betöltés folyamatban...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Betöltés folyamatban...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/it/loading/loading.html b/indra/newview/skins/default/html/it/loading/loading.html
index 0f9af31f6e..ab37e41f04 100644
--- a/indra/newview/skins/default/html/it/loading/loading.html
+++ b/indra/newview/skins/default/html/it/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Attendi...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Attendi...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/ja/loading/loading.html b/indra/newview/skins/default/html/ja/loading/loading.html
index 069dc5d12f..35cf74a35f 100644
--- a/indra/newview/skins/default/html/ja/loading/loading.html
+++ b/indra/newview/skins/default/html/ja/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;ロード中...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;ロード中...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/nl/loading/loading.html b/indra/newview/skins/default/html/nl/loading/loading.html
index 39a8691f3f..0215bd7e47 100644
--- a/indra/newview/skins/default/html/nl/loading/loading.html
+++ b/indra/newview/skins/default/html/nl/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Laden...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Laden...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/pl/loading/loading.html b/indra/newview/skins/default/html/pl/loading/loading.html
index 515890c2d5..50f3dfb0c5 100644
--- a/indra/newview/skins/default/html/pl/loading/loading.html
+++ b/indra/newview/skins/default/html/pl/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Åadowanie...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Åadowanie...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/pt/loading/loading.html b/indra/newview/skins/default/html/pt/loading/loading.html
index 635ea62406..a83e1123d0 100644
--- a/indra/newview/skins/default/html/pt/loading/loading.html
+++ b/indra/newview/skins/default/html/pt/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Carregando...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Carregando...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/ru/loading/loading.html b/indra/newview/skins/default/html/ru/loading/loading.html
index dcc0d73c1a..892c0b9f7f 100644
--- a/indra/newview/skins/default/html/ru/loading/loading.html
+++ b/indra/newview/skins/default/html/ru/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Загрузка...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Загрузка...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/tr/loading/loading.html b/indra/newview/skins/default/html/tr/loading/loading.html
index e7812e7c8e..1ac07bff34 100644
--- a/indra/newview/skins/default/html/tr/loading/loading.html
+++ b/indra/newview/skins/default/html/tr/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Yükleniyor...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Yükleniyor...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/uk/loading/loading.html b/indra/newview/skins/default/html/uk/loading/loading.html
index 0f67994635..3b5b8679b4 100644
--- a/indra/newview/skins/default/html/uk/loading/loading.html
+++ b/indra/newview/skins/default/html/uk/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Завантаж...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;Завантаж...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/html/zh/loading/loading.html b/indra/newview/skins/default/html/zh/loading/loading.html
index 462ea291d9..d1d5d25c92 100644
--- a/indra/newview/skins/default/html/zh/loading/loading.html
+++ b/indra/newview/skins/default/html/zh/loading/loading.html
@@ -1,10 +1,10 @@
-<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
-<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
-<table width="100%" height="100%" border="0">
- <tr>
- <td align="center" valign="middle" style="font-size:0.8em;">
- <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;请等待...
- </td>
- </tr>
-</table>
-</body>
+<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head>
+<body style="background-color:#000000;font-family:verdana,helvetica,sans-serif;font-size:62.5%;color:#e9f1f8;">
+<table width="100%" height="100%" border="0">
+ <tr>
+ <td align="center" valign="middle" style="font-size:0.8em;">
+ <img src="../../en-us/loading/sl_logo_rotate_black.gif" align="absmiddle"><br/>&nbsp;&nbsp;&nbsp;请等待...
+ </td>
+ </tr>
+</table>
+</body>
diff --git a/indra/newview/skins/default/textures/avatar_thumb_bkgrnd.png b/indra/newview/skins/default/textures/avatar_thumb_bkgrnd.png
new file mode 100644
index 0000000000..84cc2159c1
--- /dev/null
+++ b/indra/newview/skins/default/textures/avatar_thumb_bkgrnd.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_Off.png b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_Off.png
index 3cfe2e850e..00158a7bc2 100644
--- a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_Off.png
+++ b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_On.png b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_On.png
index bb5d85e410..3748f5e190 100644
--- a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_On.png
+++ b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Back_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_Off.png b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_Off.png
index 9876aa456c..c49b8f9a27 100644
--- a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_Off.png
+++ b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_On.png b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_On.png
index f481fed88c..bc8c4db04d 100644
--- a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_On.png
+++ b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Front_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_Off.png b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_Off.png
index d58b4ff990..b919a0a152 100644
--- a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_Off.png
+++ b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_On.png b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_On.png
index 6e73898992..de9da359a0 100644
--- a/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_On.png
+++ b/indra/newview/skins/default/textures/bottomtray/Cam_Preset_Side_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Mouselook_View_Off.png b/indra/newview/skins/default/textures/bottomtray/Mouselook_View_Off.png
new file mode 100644
index 0000000000..8d32cad95f
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/Mouselook_View_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Mouselook_View_On.png b/indra/newview/skins/default/textures/bottomtray/Mouselook_View_On.png
new file mode 100644
index 0000000000..4c98e35868
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/Mouselook_View_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_Down_Off.png b/indra/newview/skins/default/textures/bottomtray/Movement_Down_Off.png
index 1b0192e685..2893c9a9f1 100644
--- a/indra/newview/skins/default/textures/bottomtray/Movement_Down_Off.png
+++ b/indra/newview/skins/default/textures/bottomtray/Movement_Down_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_Down_On.png b/indra/newview/skins/default/textures/bottomtray/Movement_Down_On.png
index 9f42b7d5b2..f7ed4c25fb 100644
--- a/indra/newview/skins/default/textures/bottomtray/Movement_Down_On.png
+++ b/indra/newview/skins/default/textures/bottomtray/Movement_Down_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_Left_Off.png b/indra/newview/skins/default/textures/bottomtray/Movement_Left_Off.png
new file mode 100644
index 0000000000..3602efa9d9
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/Movement_Left_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_Left_On.png b/indra/newview/skins/default/textures/bottomtray/Movement_Left_On.png
new file mode 100644
index 0000000000..2f81fb1588
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/Movement_Left_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_Right_Off.png b/indra/newview/skins/default/textures/bottomtray/Movement_Right_Off.png
new file mode 100644
index 0000000000..9c3fc37dfe
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/Movement_Right_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_Right_On.png b/indra/newview/skins/default/textures/bottomtray/Movement_Right_On.png
new file mode 100644
index 0000000000..4f86e81a15
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/Movement_Right_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_Up_Off.png b/indra/newview/skins/default/textures/bottomtray/Movement_Up_Off.png
index 9b9837cec1..a49c43c2cf 100644
--- a/indra/newview/skins/default/textures/bottomtray/Movement_Up_Off.png
+++ b/indra/newview/skins/default/textures/bottomtray/Movement_Up_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Movement_Up_On.png b/indra/newview/skins/default/textures/bottomtray/Movement_Up_On.png
index c71d4a7854..ed4902f3ee 100644
--- a/indra/newview/skins/default/textures/bottomtray/Movement_Up_On.png
+++ b/indra/newview/skins/default/textures/bottomtray/Movement_Up_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Object_View_Off.png b/indra/newview/skins/default/textures/bottomtray/Object_View_Off.png
new file mode 100644
index 0000000000..e9dea7e17e
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/Object_View_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/Object_View_On.png b/indra/newview/skins/default/textures/bottomtray/Object_View_On.png
new file mode 100644
index 0000000000..7a348ba22e
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/Object_View_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Disabled.png b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Disabled.png
new file mode 100644
index 0000000000..20fa40e127
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Off.png b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Off.png
new file mode 100644
index 0000000000..53efa3a9a9
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Over.png b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Over.png
new file mode 100644
index 0000000000..f1420e0002
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/bottomtray/PanOrbit_Press.png b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Press.png
new file mode 100644
index 0000000000..89a6269edc
--- /dev/null
+++ b/indra/newview/skins/default/textures/bottomtray/PanOrbit_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/containers/Toolbar_Left_Flash.png b/indra/newview/skins/default/textures/containers/Toolbar_Left_Flash.png
new file mode 100644
index 0000000000..9f1e2a469d
--- /dev/null
+++ b/indra/newview/skins/default/textures/containers/Toolbar_Left_Flash.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/containers/Toolbar_Middle_Flash.png b/indra/newview/skins/default/textures/containers/Toolbar_Middle_Flash.png
new file mode 100644
index 0000000000..dd73d655e9
--- /dev/null
+++ b/indra/newview/skins/default/textures/containers/Toolbar_Middle_Flash.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/containers/Toolbar_Right_Flash.png b/indra/newview/skins/default/textures/containers/Toolbar_Right_Flash.png
new file mode 100644
index 0000000000..f6b775c2a0
--- /dev/null
+++ b/indra/newview/skins/default/textures/containers/Toolbar_Right_Flash.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/DownArrow_Off.png b/indra/newview/skins/default/textures/icons/DownArrow_Off.png
new file mode 100644
index 0000000000..60f62eed4a
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/DownArrow_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Edit_Wrench.png b/indra/newview/skins/default/textures/icons/Edit_Wrench.png
new file mode 100644
index 0000000000..1c43960d02
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Edit_Wrench.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Female.png b/indra/newview/skins/default/textures/icons/Female.png
new file mode 100644
index 0000000000..67b5653a94
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Female.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Generic_Group.png b/indra/newview/skins/default/textures/icons/Generic_Group.png
index fdd65b49e1..9d76f75d0f 100644
--- a/indra/newview/skins/default/textures/icons/Generic_Group.png
+++ b/indra/newview/skins/default/textures/icons/Generic_Group.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Generic_Group_Large.png b/indra/newview/skins/default/textures/icons/Generic_Group_Large.png
index 4d4f1e1bee..de8a39fc8a 100644
--- a/indra/newview/skins/default/textures/icons/Generic_Group_Large.png
+++ b/indra/newview/skins/default/textures/icons/Generic_Group_Large.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Hierarchy_View_Disabled.png b/indra/newview/skins/default/textures/icons/Hierarchy_View_Disabled.png
new file mode 100644
index 0000000000..fb370f98d5
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Hierarchy_View_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Hierarchy_View_On.png b/indra/newview/skins/default/textures/icons/Hierarchy_View_On.png
new file mode 100644
index 0000000000..c590a5a5d3
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Hierarchy_View_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_Link.png b/indra/newview/skins/default/textures/icons/Inv_Link.png
new file mode 100644
index 0000000000..c1543dacb5
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Inv_Link.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_LostClosed.png b/indra/newview/skins/default/textures/icons/Inv_LostClosed.png
new file mode 100644
index 0000000000..a800217e0d
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Inv_LostClosed.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_LostOpen.png b/indra/newview/skins/default/textures/icons/Inv_LostOpen.png
new file mode 100644
index 0000000000..8c4a1a9ac0
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Inv_LostOpen.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_Object_Multi.png b/indra/newview/skins/default/textures/icons/Inv_Object_Multi.png
new file mode 100644
index 0000000000..11f4871ad8
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Inv_Object_Multi.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_Shoe.png b/indra/newview/skins/default/textures/icons/Inv_Shoe.png
index 51e1c7bbb7..1f52b0a6b6 100644
--- a/indra/newview/skins/default/textures/icons/Inv_Shoe.png
+++ b/indra/newview/skins/default/textures/icons/Inv_Shoe.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_SysClosed.png b/indra/newview/skins/default/textures/icons/Inv_SysClosed.png
new file mode 100644
index 0000000000..dcf998449f
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Inv_SysClosed.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_SysOpen.png b/indra/newview/skins/default/textures/icons/Inv_SysOpen.png
new file mode 100644
index 0000000000..0efd403c95
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Inv_SysOpen.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_TrashClosed.png b/indra/newview/skins/default/textures/icons/Inv_TrashClosed.png
new file mode 100644
index 0000000000..c5201e6f9a
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Inv_TrashClosed.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Inv_TrashOpen.png b/indra/newview/skins/default/textures/icons/Inv_TrashOpen.png
new file mode 100644
index 0000000000..4a886a3f37
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Inv_TrashOpen.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/List_View_Disabled.png b/indra/newview/skins/default/textures/icons/List_View_Disabled.png
new file mode 100644
index 0000000000..155dee5047
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/List_View_Disabled.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/List_View_On.png b/indra/newview/skins/default/textures/icons/List_View_On.png
new file mode 100644
index 0000000000..9127c92c3b
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/List_View_On.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Locked_Icon.png b/indra/newview/skins/default/textures/icons/Locked_Icon.png
new file mode 100644
index 0000000000..8ead280794
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Locked_Icon.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Male.png b/indra/newview/skins/default/textures/icons/Male.png
new file mode 100644
index 0000000000..f3fad77fd0
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Male.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Progress_1.png b/indra/newview/skins/default/textures/icons/Progress_1.png
index 58b56003c4..5d6efbfa2a 100644
--- a/indra/newview/skins/default/textures/icons/Progress_1.png
+++ b/indra/newview/skins/default/textures/icons/Progress_1.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Progress_10.png b/indra/newview/skins/default/textures/icons/Progress_10.png
index 07fe0be8a3..28203324f1 100644
--- a/indra/newview/skins/default/textures/icons/Progress_10.png
+++ b/indra/newview/skins/default/textures/icons/Progress_10.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Progress_11.png b/indra/newview/skins/default/textures/icons/Progress_11.png
index 215d68cc46..6b87be0c3f 100644
--- a/indra/newview/skins/default/textures/icons/Progress_11.png
+++ b/indra/newview/skins/default/textures/icons/Progress_11.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Progress_12.png b/indra/newview/skins/default/textures/icons/Progress_12.png
index d755588621..089d58b090 100644
--- a/indra/newview/skins/default/textures/icons/Progress_12.png
+++ b/indra/newview/skins/default/textures/icons/Progress_12.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Progress_2.png b/indra/newview/skins/default/textures/icons/Progress_2.png
index 6640ee227b..94cb73b1f7 100644
--- a/indra/newview/skins/default/textures/icons/Progress_2.png
+++ b/indra/newview/skins/default/textures/icons/Progress_2.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Progress_3.png b/indra/newview/skins/default/textures/icons/Progress_3.png
index 5decbe977e..a04a5b5263 100644
--- a/indra/newview/skins/default/textures/icons/Progress_3.png
+++ b/indra/newview/skins/default/textures/icons/Progress_3.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Progress_4.png b/indra/newview/skins/default/textures/icons/Progress_4.png
index 56e81c17aa..a467098d82 100644
--- a/indra/newview/skins/default/textures/icons/Progress_4.png
+++ b/indra/newview/skins/default/textures/icons/Progress_4.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Progress_5.png b/indra/newview/skins/default/textures/icons/Progress_5.png
index a89bf2ac62..ea64f1d907 100644
--- a/indra/newview/skins/default/textures/icons/Progress_5.png
+++ b/indra/newview/skins/default/textures/icons/Progress_5.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Progress_6.png b/indra/newview/skins/default/textures/icons/Progress_6.png
index 233c479540..fe4447935f 100644
--- a/indra/newview/skins/default/textures/icons/Progress_6.png
+++ b/indra/newview/skins/default/textures/icons/Progress_6.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Progress_7.png b/indra/newview/skins/default/textures/icons/Progress_7.png
index 631d7a6819..64fa294771 100644
--- a/indra/newview/skins/default/textures/icons/Progress_7.png
+++ b/indra/newview/skins/default/textures/icons/Progress_7.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Progress_8.png b/indra/newview/skins/default/textures/icons/Progress_8.png
index ac0e3f13f7..a1c9a7f2eb 100644
--- a/indra/newview/skins/default/textures/icons/Progress_8.png
+++ b/indra/newview/skins/default/textures/icons/Progress_8.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Progress_9.png b/indra/newview/skins/default/textures/icons/Progress_9.png
index 17fb4a0335..f3e9723184 100644
--- a/indra/newview/skins/default/textures/icons/Progress_9.png
+++ b/indra/newview/skins/default/textures/icons/Progress_9.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/SL_Logo.png b/indra/newview/skins/default/textures/icons/SL_Logo.png
index c9fbde987a..8342d7cfee 100644
--- a/indra/newview/skins/default/textures/icons/SL_Logo.png
+++ b/indra/newview/skins/default/textures/icons/SL_Logo.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Search_Icon.png b/indra/newview/skins/default/textures/icons/Search_Icon.png
new file mode 100644
index 0000000000..541aa8f52a
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Search_Icon.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Shirt_Large.png b/indra/newview/skins/default/textures/icons/Shirt_Large.png
new file mode 100644
index 0000000000..0f3846bccc
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Shirt_Large.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Shop.png b/indra/newview/skins/default/textures/icons/Shop.png
new file mode 100644
index 0000000000..d7e0001dc6
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Shop.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/UpArrow_Off.png b/indra/newview/skins/default/textures/icons/UpArrow_Off.png
new file mode 100644
index 0000000000..00015bce20
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/UpArrow_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/back_arrow_off.png b/indra/newview/skins/default/textures/icons/back_arrow_off.png
new file mode 100644
index 0000000000..422f67cf83
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/back_arrow_off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/back_arrow_over.png b/indra/newview/skins/default/textures/icons/back_arrow_over.png
new file mode 100644
index 0000000000..b4cc170f37
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/back_arrow_over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/back_arrow_press.png b/indra/newview/skins/default/textures/icons/back_arrow_press.png
new file mode 100644
index 0000000000..a9e2f326a7
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/back_arrow_press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/object_icon.png b/indra/newview/skins/default/textures/icons/object_icon.png
new file mode 100644
index 0000000000..223874e631
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/object_icon.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/unknown_icon.png b/indra/newview/skins/default/textures/icons/unknown_icon.png
new file mode 100644
index 0000000000..8441d86596
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/unknown_icon.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/map_infohub.tga b/indra/newview/skins/default/textures/map_infohub.tga
index 545b8e532c..d0134fa5fe 100644
--- a/indra/newview/skins/default/textures/map_infohub.tga
+++ b/indra/newview/skins/default/textures/map_infohub.tga
Binary files differ
diff --git a/indra/newview/skins/default/textures/navbar/BuyArrow_Over.png b/indra/newview/skins/default/textures/navbar/BuyArrow_Over.png
index 41cb88628a..0b3f252ccf 100644
--- a/indra/newview/skins/default/textures/navbar/BuyArrow_Over.png
+++ b/indra/newview/skins/default/textures/navbar/BuyArrow_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/navbar/BuyArrow_Press.png b/indra/newview/skins/default/textures/navbar/BuyArrow_Press.png
index a02675502a..5c4c150bed 100644
--- a/indra/newview/skins/default/textures/navbar/BuyArrow_Press.png
+++ b/indra/newview/skins/default/textures/navbar/BuyArrow_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Off.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Off.png
index 1e7d7beafa..421f5e1705 100644
--- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Off.png
+++ b/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Selected.png b/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Selected.png
index a70d3abbbf..293aeef5e6 100644
--- a/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Selected.png
+++ b/indra/newview/skins/default/textures/taskpanel/TabIcon_Home_Selected.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index ccf49f6a9f..cf632c085f 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -1,4 +1,4 @@
-<!--
+<!--
This file contains metadata about how to load, display, and scale textures for rendering in the UI.
Images do *NOT* have to appear in this file in order to use them as textures in the UI...simply refer
to them by filename (relative to textures directory).
@@ -46,13 +46,9 @@ with the same filename but different name
<texture name="AddItem_Press" file_name="icons/AddItem_Press.png" preload="false" />
<texture name="Arrow_Left_Off" file_name="navbar/Arrow_Left_Off.png" preload="true" />
- <texture name="Arrow_Left_Press" file_name="navbar/Arrow_Left_Press.png" preload="true" />
<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" />
@@ -64,49 +60,32 @@ with the same filename but different name
<texture name="AudioMute_Off" file_name="icons/AudioMute_Off.png" preload="false" />
<texture name="AudioMute_Over" file_name="icons/AudioMute_Over.png" preload="false" />
- <texture name="AudioMute_Press" file_name="icons/AudioMute_Press.png" preload="false" />
<texture name="Audio_Off" file_name="icons/Audio_Off.png" preload="false" />
- <texture name="Audio_Over" file_name="icons/Audio_Over.png" preload="false" />
<texture name="Audio_Press" file_name="icons/Audio_Press.png" preload="false" />
<texture name="Avaline_Icon" file_name="icons/avaline_default_icon.jpg" preload="true" />
- <texture name="BackArrow_Disabled" file_name="icons/BackArrow_Disabled.png" preload="false" />
<texture name="BackArrow_Off" file_name="icons/BackArrow_Off.png" preload="false" />
- <texture name="BackArrow_Press" file_name="icons/BackArrow_Press.png" preload="false" />
+
+ <texture name="BackButton_Off" file_name="icons/back_arrow_off.png" preload="false" />
+ <texture name="BackButton_Over" file_name="icons/back_arrow_over.png" preload="false" />
+ <texture name="BackButton_Press" file_name="icons/back_arrow_press.png" preload="false" />
<texture name="Blank" file_name="Blank.png" preload="false" />
- <texture name="BottomTray_BG" file_name="bottomtray/BottomTray_BG.png" preload="false" />
- <texture name="BottomTray_Scroll_Right" file_name="navbar/Arrow_Right_Off.png" preload="false" />
- <texture name="BottomTray_Scroll_Left" file_name="navbar/Arrow_Left_Off.png" preload="false" />
- <texture name="BuyArrow_Off" file_name="navbar/BuyArrow_Off.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" />
- <texture name="BuyArrow_Over" file_name="navbar/BuyArrow_Over.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" />
+ <texture name="BuyArrow_Over" file_name="navbar/BuyArrow_Over.png" preload="true" scale.left="0" scale.top="1" scale.right="0" scale.bottom="0" />
<texture name="BuyArrow_Press" file_name="navbar/BuyArrow_Press.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" />
- <texture name="Cam_Avatar_Disabled" file_name="bottomtray/Cam_Avatar_Disabled.png" preload="false" />
- <texture name="Cam_Avatar_Over" file_name="bottomtray/Cam_Avatar_Over.png" preload="false" />
<texture name="Cam_Avatar_Off" file_name="bottomtray/Cam_Avatar_Off.png" preload="false" />
- <texture name="Cam_Avatar_Press" file_name="bottomtray/Cam_Avatar_Press.png" preload="false" />
- <texture name="Cam_FreeCam_Disabled" file_name="bottomtray/Cam_FreeCam_Disabled.png" preload="false" />
<texture name="Cam_FreeCam_Off" file_name="bottomtray/Cam_FreeCam_Off.png" preload="false" />
- <texture name="Cam_FreeCam_Over" file_name="bottomtray/Cam_FreeCam_Over.png" preload="false" />
- <texture name="Cam_FreeCam_Press" file_name="bottomtray/Cam_FreeCam_Press.png" preload="false" />
- <texture name="Cam_Orbit_Disabled" file_name="bottomtray/Cam_Orbit_Disabled.png" preload="false" />
<texture name="Cam_Orbit_Off" file_name="bottomtray/Cam_Orbit_Off.png" preload="false" />
- <texture name="Cam_Orbit_Over" file_name="bottomtray/Cam_Orbit_Over.png" preload="false" />
- <texture name="Cam_Orbit_Press" file_name="bottomtray/Cam_Orbit_Press.png" preload="false" />
- <texture name="Cam_Pan_Disabled" file_name="bottomtray/Cam_Pan_Disabled.png" preload="false" />
<texture name="Cam_Pan_Off" file_name="bottomtray/Cam_Pan_Off.png" preload="false" />
- <texture name="Cam_Pan_Over" file_name="bottomtray/CCam_Pan_Over.png" preload="false" />
- <texture name="Cam_Pan_Press" file_name="bottomtray/Cam_Pan_Press.png" preload="false" />
<texture name="Cam_Preset_Back_Off" file_name="bottomtray/Cam_Preset_Back_Off.png" preload="false" />
<texture name="Cam_Preset_Back_On" file_name="bottomtray/Cam_Preset_Back_On.png" preload="false" />
<texture name="Cam_Preset_Eye_Off" file_name="bottomtray/Cam_Preset_Eye_Off.png" preload="false" />
- <texture name="Cam_Preset_Eye_On" file_name="bottomtray/Cam_Preset_Eye_On.png" preload="false" />
<texture name="Cam_Preset_Front_Off" file_name="bottomtray/Cam_Preset_Front_Off.png" preload="false" />
<texture name="Cam_Preset_Front_On" file_name="bottomtray/Cam_Preset_Front_On.png" preload="false" />
<texture name="Cam_Preset_Side_Off" file_name="bottomtray/Cam_Preset_Side_Off.png" preload="false" />
@@ -116,8 +95,6 @@ with the same filename but different name
<texture name="Cam_Rotate_Out" file_name="bottomtray/Cam_Rotate_Out.png" preload="false" />
<texture name="Cam_Tracking_In" file_name="bottomtray/Cam_Tracking_In.png" preload="false" />
<texture name="Cam_Tracking_Out" file_name="bottomtray/Cam_Tracking_Out.png" preload="false" />
- <texture name="CameraView_Off" file_name="bottomtray/CameraView_Off.png" preload="false" />
- <texture name="CameraView_Over" file_name="bottomtray/CameraView_Over.png" preload="false" />
<texture name="Checkbox_Off_Disabled" file_name="widgets/Checkbox_Disabled.png" preload="true" />
<texture name="Checkbox_On_Disabled" file_name="widgets/Checkbox_On_Disabled.png" preload="true" />
@@ -127,8 +104,6 @@ with the same filename but different name
<texture name="Checkbox_Press" file_name="widgets/Checkbox_Press.png" preload="true" />
<texture name="ComboButton_Disabled" file_name="widgets/ComboButton_Disabled.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
- <texture name="ComboButton_Over" file_name="widgets/ComboButton_Over.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
- <texture name="ComboButton_Press" file_name="widgets/ComboButton_Press.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
<texture name="ComboButton_Selected" file_name="widgets/ComboButton_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
<texture name="ComboButton_UpSelected" file_name="widgets/ComboButton_UpSelected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
<texture name="ComboButton_Up_On_Selected" file_name="widgets/ComboButton_Up_On_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
@@ -136,25 +111,21 @@ with the same filename but different name
<texture name="ComboButton_UpOff" file_name="widgets/ComboButton_UpOff.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
<texture name="Container" file_name="containers/Container.png" preload="false" />
- <texture name="DisclosureArrow_Closed_Off" file_name="widgets/DisclosureArrow_Closed_Off.png" preload="true" />
- <texture name="DisclosureArrow_Closed_Press" file_name="widgets/DisclosureArrow_Closed_Press.png" preload="true" />
<texture name="DisclosureArrow_Opened_Off" file_name="widgets/DisclosureArrow_Opened_Off.png" preload="true" />
- <texture name="DisclosureArrow_Opened_Press" file_name="widgets/DisclosureArrow_Opened_Press.png" preload="true" />
<texture name="DownArrow" file_name="bottomtray/DownArrow.png" preload="false" />
+ <texture name="DownArrow_Off" file_name="icons/DownArrow_Off.png" preload="false" />
+ <texture name="Dragbar" file_name="windows/Dragbar.png" preload="false" scale.left="35" scale.top="5" scale.right="29" scale.bottom="5" />
- <texture name="DropDown_Disabled" file_name="widgets/DropDown_Disabled.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
- <texture name="DropDown_Over" file_name="widgets/DropDown_Over.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
- <texture name="DropDown_Press" file_name="widgets/DropDown_Press.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
- <texture name="DropDown_Selected" file_name="widgets/DropDown_Selected.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
- <texture name="DropDown_On" file_name="widgets/DropDown_On.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
- <texture name="DropDown_Off" file_name="widgets/DropDown_Off.png" preload="true" scale.left="2" scale.top="19" scale.right="18" scale.bottom="2" />
+ <texture name="DropDown_Disabled" file_name="widgets/DropDown_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
+ <texture name="DropDown_Press" file_name="widgets/DropDown_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
+ <texture name="DropDown_On" file_name="widgets/DropDown_On.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
+ <texture name="DropDown_Off" file_name="widgets/DropDown_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="99" scale.bottom="4" />
<texture name="DropTarget" file_name="widgets/DropTarget.png" preload="false" />
<texture name="ExternalBrowser_Off" file_name="icons/ExternalBrowser_Off.png" preload="false" />
- <texture name="ExternalBrowser_Over" file_name="icons/ExternalBrowser_Over.png" preload="false" />
- <texture name="ExternalBrowser_Press" file_name="icons/ExternalBrowser_Press.png" preload="false" />
+ <texture name="Edit_Wrench" file_name="icons/Edit_Wrench.png" preload="false" />
<texture name="Favorite_Star_Active" file_name="navbar/Favorite_Star_Active.png" preload="false" />
<texture name="Favorite_Star_Off" file_name="navbar/Favorite_Star_Off.png" preload="false" />
@@ -162,8 +133,6 @@ with the same filename but different name
<texture name="Favorite_Star_Over" file_name="navbar/Favorite_Star_Over.png" preload="false" />
<texture name="Favorite_Link_Over" file_name="navbar/Favorite_Link_Over.png" preload="false" />
- <texture name="FileMenu_BarSelect" file_name="navbar/FileMenu_BarSelect.png" preload="false" scale.left="2" scale.top="0" scale.right="2" scale.bottom="0" />
- <texture name="FileMenu_BG" file_name="navbar/FileMenu_BG.png" preload="false" />
<texture name="Flag" file_name="navbar/Flag.png" preload="false" />
@@ -173,23 +142,19 @@ with the same filename but different name
<texture name="ForwardArrow_Press" file_name="icons/ForwardArrow_Press.png" preload="false" />
<texture name="Generic_Group" file_name="icons/Generic_Group.png" preload="false" />
- <texture name="icon_group.tga" file_name="icons/Generic_Group.png" preload="false" />
<texture name="Generic_Group_Large" file_name="icons/Generic_Group_Large.png" preload="false" />
- <texture name="Generic_Object_Medium" file_name="icons/Generic_Object_Medium.png" preload="false" />
+ <texture name="icon_group.tga" file_name="icons/Generic_Group.png" preload="false" />
<texture name="Generic_Object_Small" file_name="icons/Generic_Object_Small.png" preload="false" />
- <texture name="Generic_Object_Large" file_name="icons/Generic_Object_Large.png" preload="false" />
<texture name="Generic_Person" file_name="icons/Generic_Person.png" preload="false" />
<texture name="Generic_Person_Large" file_name="icons/Generic_Person_Large.png" preload="false" />
- <texture name="Health" file_name="icons/Health.png" preload="false" />
-
- <texture name="Help_Off" file_name="navbar/Help_Off.png" preload="false" />
<texture name="Help_Press" file_name="navbar/Help_Press.png" preload="false" />
- <texture name="History_Arrow" file_name="navbar/History_Arrow.png" preload="true" />
+ <texture name="Hierarchy_View_Disabled" file_name="icons/Hierarchy_View_Disabled.png" preload="false" />
+ <texture name="Hierarchy_View_On" file_name="icons/Hierarchy_View_On.png" preload="false" />
+
<texture name="Home_Off" file_name="navbar/Home_Off.png" preload="false" />
- <texture name="Home_Press" file_name="navbar/Home_Press.png" preload="false" />
<texture name="Icon_Close_Foreground" file_name="windows/Icon_Close_Foreground.png" preload="true" />
<texture name="Icon_Close_Press" file_name="windows/Icon_Close_Press.png" preload="true" />
@@ -206,7 +171,6 @@ with the same filename but different name
<texture name="Icon_Help_Foreground" file_name="windows/Icon_Help_Foreground.png" preload="true" />
<texture name="Icon_Help_Press" file_name="windows/Icon_Help_Press.png" preload="true" />
- <texture name="Icon_Info" file_name="windows/Icon_Info.png" preload="false" />
<texture name="Icon_Minimize_Foreground" file_name="windows/Icon_Minimize_Foreground.png" preload="true" />
<texture name="Icon_Minimize_Press" file_name="windows/Icon_Minimize_Press.png" preload="true" />
@@ -225,13 +189,11 @@ with the same filename but different name
<texture name="Inspector_Hover" file_name="windows/Inspector_Hover.png" preload="false" />
<texture name="Inspector_I" file_name="windows/Inspector_I.png" preload="false" />
- <texture name="Inv_Acessories" file_name="icons/Inv_Accessories.png" preload="false" />
<texture name="Inv_Alpha" file_name="icons/Inv_Alpha.png" preload="false" />
<texture name="Inv_Animation" file_name="icons/Inv_Animation.png" preload="false" />
<texture name="Inv_BodyShape" file_name="icons/Inv_BodyShape.png" preload="false" />
<texture name="Inv_CallingCard" file_name="icons/Inv_CallingCard.png" preload="false" />
<texture name="Inv_Clothing" file_name="icons/Inv_Clothing.png" preload="false" />
- <texture name="Inv_DangerousScript" file_name="icons/Inv_DangerousScript.png" preload="false" />
<texture name="Inv_Eye" file_name="icons/Inv_Eye.png" preload="false" />
<texture name="Inv_FolderClosed" file_name="icons/Inv_FolderClosed.png" preload="false" />
<texture name="Inv_FolderOpen" file_name="icons/Inv_FolderOpen.png" preload="false" />
@@ -239,14 +201,16 @@ with the same filename but different name
<texture name="Inv_Gloves" file_name="icons/Inv_Gloves.png" preload="false" />
<texture name="Inv_Hair" file_name="icons/Inv_Hair.png" preload="false" />
<texture name="Inv_LinkItem" file_name="icons/Inv_LinkItem.png" preload="false" />
- <texture name="Inv_LinkItem_Broken" file_name="icons/Inv_LinkItem_Broken.png" preload="false" />
<texture name="Inv_LinkFolder" file_name="icons/Inv_LinkFolder.png" preload="false" />
<texture name="Inv_Jacket" file_name="icons/Inv_Jacket.png" preload="false" />
<texture name="Inv_LookFolderOpen" file_name="icons/Inv_LookFolderOpen.png" preload="false" />
<texture name="Inv_LookFolderClosed" file_name="icons/Inv_LookFolderClosed.png" preload="false" />
+ <texture name="Inv_LostClosed" file_name="icons/Inv_LostClosed.png" preload="false" />
+ <texture name="Inv_LostOpen" file_name="icons/Inv_LostOpen.png" preload="false" />
<texture name="Inv_Landmark" file_name="icons/Inv_Landmark.png" preload="false" />
<texture name="Inv_Notecard" file_name="icons/Inv_Notecard.png" preload="false" />
<texture name="Inv_Object" file_name="icons/Inv_Object.png" preload="false" />
+ <texture name="Inv_Object_Multi" file_name="icons/Inv_Object_Multi.png" preload="false" />
<texture name="Inv_Pants" file_name="icons/Inv_Pants.png" preload="false" />
<texture name="Inv_Script" file_name="icons/Inv_Script.png" preload="false" />
<texture name="Inv_Shirt" file_name="icons/Inv_Shirt.png" preload="false" />
@@ -256,24 +220,31 @@ with the same filename but different name
<texture name="Inv_Snapshot" file_name="icons/Inv_Snapshot.png" preload="false" />
<texture name="Inv_Socks" file_name="icons/Inv_Socks.png" preload="false" />
<texture name="Inv_Sound" file_name="icons/Inv_Sound.png" preload="false" />
+ <texture name="Inv_SysClosed" file_name="icons/Inv_SysClosed.png" preload="false" />
+ <texture name="Inv_SysOpen" file_name="icons/Inv_SysOpen.png" preload="false" />
<texture name="Inv_Tattoo" file_name="icons/Inv_Tattoo.png" preload="false" />
<texture name="Inv_Texture" file_name="icons/Inv_Texture.png" preload="false" />
- <texture name="Inv_Trash" file_name="icons/Inv_Trash.png" preload="false" />
+ <texture name="Inv_TrashClosed" file_name="icons/Inv_TrashClosed.png" preload="false" />
+ <texture name="Inv_TrashOpen" file_name="icons/Inv_TrashOpen.png" preload="false" />
<texture name="Inv_Underpants" file_name="icons/Inv_Underpants.png" preload="false" />
<texture name="Inv_Undershirt" file_name="icons/Inv_Undershirt.png" preload="false" />
+ <texture name="Inv_Link" file_name="icons/Inv_Link.png" preload="false" />
<texture name="Linden_Dollar_Alert" file_name="widgets/Linden_Dollar_Alert.png"/>
<texture name="Linden_Dollar_Background" file_name="widgets/Linden_Dollar_Background.png"/>
- <texture name="ListItem_Select" file_name="widgets/ListItem_Select.png" preload="true" />
- <texture name="ListItem_Over" file_name="widgets/ListItem_Over.png" preload="true" />
+ <texture name="ListItem_Select" file_name="widgets/ListItem_Select.png" preload="true" scale.left="2" scale.bottom="2" scale.top="22" scale.right="278" />
+ <texture name="ListItem_Over" file_name="widgets/ListItem_Over.png" preload="true" scale.left="2" scale.bottom="2" scale.top="22" scale.right="278" />
+
+ <texture name="List_View_Disabled" file_name="icons/List_View_Disabled.png" preload="false" />
+ <texture name="List_View_On" file_name="icons/List_View_On.png" preload="false" />
<texture name="Lock" file_name="icons/Lock.png" preload="false" />
<texture name="Lock2" file_name="navbar/Lock.png" preload="false" />
- <texture name="Login_Pod" file_name="windows/Login_Pod.png" preload="true" />
+ <texture name="Locked_Icon" file_name="icons/Locked_Icon.png" preload="false" />
+
- <texture name="Microphone_Mute" file_name="icons/Microphone_Mute.png" preload="false" />
<texture name="Microphone_On" file_name="icons/Microphone_On.png" preload="false" />
<texture name="MinusItem_Disabled" file_name="icons/MinusItem_Disabled.png" preload="false" />
@@ -282,24 +253,22 @@ with the same filename but different name
<texture name="menu_separator" file_name="navbar/FileMenu_Divider.png" scale.left="4" scale.top="166" scale.right="0" scale.bottom="0" />
- <texture name="Move_Fly_Disabled" file_name="bottomtray/Move_Fly_Disabled.png" preload="false" />
+ <texture name="MouseLook_View_Off" file_name="bottomtray/MouseLook_view_off.png" preload="false" />
+ <texture name="MouseLook_View_On" file_name="bottomtray/MouseLook_view_on.png" preload="false" />
+
<texture name="Move_Fly_Off" file_name="bottomtray/Move_Fly_Off.png" preload="false" />
- <texture name="Move_Fly_Over" file_name="bottomtray/Move_Fly_Over.png" preload="false" />
- <texture name="Move_Fly_Press" file_name="bottomtray/Move_Fly_Press.png" preload="false" />
- <texture name="Move_Run_Disabled" file_name="bottomtray/Move_Run_Disabled.png" preload="false" />
<texture name="Move_Run_Off" file_name="bottomtray/Move_Run_Off.png" preload="false" />
- <texture name="Move_Run_Over" file_name="bottomtray/Move_Run_Over.png" preload="false" />
- <texture name="Move_Run_Press" file_name="bottomtray/Move_Run_Press.png" preload="false" />
- <texture name="Move_Walk_Disabled" file_name="bottomtray/Move_Walk_Disabled.png" preload="false" />
<texture name="Move_Walk_Off" file_name="bottomtray/Move_Walk_Off.png" preload="false" />
- <texture name="Move_Walk_Over" file_name="bottomtray/Move_Walk_Over.png" preload="false" />
- <texture name="Move_Walk_Press" file_name="bottomtray/Move_Walk_Press.png" preload="false" />
<texture name="Movement_Backward_Off" file_name="bottomtray/Movement_Backward_Off.png" preload="false" />
<texture name="Movement_Backward_On" file_name="bottomtray/Movement_Backward_On.png" preload="false" />
<texture name="Movement_Down_Off" file_name="bottomtray/Movement_Down_Off.png" preload="false" />
<texture name="Movement_Down_On" file_name="bottomtray/Movement_Down_On.png" preload="false" />
<texture name="Movement_Forward_Off" file_name="bottomtray/Movement_Forward_Off.png" preload="false" />
<texture name="Movement_Forward_On" file_name="bottomtray/Movement_Forward_On.png" preload="false" />
+ <texture name="Movement_Left_Off" file_name="bottomtray/Movement_Left_Off.png" preload="false" />
+ <texture name="Movement_Left_On" file_name="bottomtray/Movement_Left_On.png" preload="false" />
+ <texture name="Movement_Right_Off" file_name="bottomtray/Movement_Right_Off.png" preload="false" />
+ <texture name="Movement_Right_On" file_name="bottomtray/Movement_Right_On.png" preload="false" />
<texture name="Movement_TurnLeft_Off" file_name="bottomtray/Movement_TurnLeft_Off.png" preload="false" />
<texture name="Movement_TurnLeft_On" file_name="bottomtray/Movement_TurnLeft_On.png" preload="false" />
<texture name="Movement_TurnRight_Off" file_name="bottomtray/Movement_TurnRight_Off.png" preload="false" />
@@ -310,10 +279,6 @@ with the same filename but different name
<texture name="NavBar_BG_NoFav" file_name="navbar/NavBar_BG_NoFav.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" />
<texture name="NavBar_BG" file_name="navbar/NavBar_BG.png" preload="true" scale.left="1" scale.top="1" scale.right="0" scale.bottom="0" />
- <texture name="NearbyVoice_Lvl1" file_name="bottomtray/NearbyVoice_Lvl1.png" preload="false" />
- <texture name="NearbyVoice_Lvl2" file_name="bottomtray/NearbyVoice_Lvl2.png" preload="false" />
- <texture name="NearbyVoice_Lvl3" file_name="bottomtray/NearbyVoice_Lvl3.png" preload="false" />
- <texture name="NearbyVoice_On" file_name="bottomtray/NearbyVoice_On.png" preload="false" />
<texture name="Notices_Unread" file_name="bottomtray/Notices_Unread.png" preload="true" />
@@ -351,31 +316,23 @@ with the same filename but different name
<texture name="Object_Tube" file_name="build/Object_Tube.png" preload="false" />
<texture name="Object_Tube_Selected" file_name="build/Object_Tube_Selected.png" preload="false" />
+ <texture name="Object_View_Off" file_name="bottomtray/Object_View_Off.png" preload="false" />
+ <texture name="Object_View_On" file_name="bottomtray/Object_View_On.png" preload="false" />
+
<texture name="OptionsMenu_Disabled" file_name="icons/OptionsMenu_Disabled.png" preload="false" />
<texture name="OptionsMenu_Off" file_name="icons/OptionsMenu_Off.png" preload="false" />
<texture name="OptionsMenu_Press" file_name="icons/OptionsMenu_Press.png" preload="false" />
- <texture name="Overhead_Arrow_L" file_name="world/Overhead_Arrow_L.png" preload="false" />
- <texture name="Overhead_Arrow_M" file_name="world/Overhead_Arrow_M.png" preload="false" />
- <texture name="Overhead_Arrow_S" file_name="world/Overhead_Arrow_S.png" preload="false" />
- <texture name="Overhead_L" file_name="world/Overhead_L.png" preload="false" />
- <texture name="Overhead_M" file_name="world/Overhead_M.png" preload="false" />
- <texture name="Overhead_S" file_name="world/Overhead_S.png" preload="false" />
+ <texture name="PanOrbit_Off" file_name="bottomtray/PanOrbit_Off.png" preload="false" />
- <texture name="Parcel_Evry_Color" file_name="icons/Parcel_Evry_Color.png" preload="false" />
<texture name="Parcel_Exp_Color" file_name="icons/Parcel_Exp_Color.png" preload="false" />
- <texture name="Parcel_M_Color" file_name="icons/Parcel_M_Color.png" preload="false" />
<texture name="Parcel_Build_Dark" file_name="icons/Parcel_Build_Dark.png" preload="false" />
<texture name="Parcel_BuildNo_Dark" file_name="icons/Parcel_BuildNo_Dark.png" preload="false" />
<texture name="Parcel_Damage_Dark" file_name="icons/Parcel_Damage_Dark.png" preload="false" />
<texture name="Parcel_DamageNo_Dark" file_name="icons/Parcel_DamageNo_Dark.png" preload="false" />
- <texture name="Parcel_Evry_Dark" file_name="icons/Parcel_Evry_Dark.png" preload="false" />
- <texture name="Parcel_Exp_Dark" file_name="icons/Parcel_Exp_Dark.png" preload="false" />
<texture name="Parcel_Fly_Dark" file_name="icons/Parcel_Fly_Dark.png" preload="false" />
<texture name="Parcel_FlyNo_Dark" file_name="icons/Parcel_FlyNo_Dark.png" preload="false" />
- <texture name="Parcel_ForSale_Dark" file_name="icons/Parcel_ForSale_Dark.png" preload="false" />
- <texture name="Parcel_ForSaleNo_Dark" file_name="icons/Parcel_ForSaleNo_Dark.png" preload="false" />
<texture name="Parcel_Health_Dark" file_name="icons/Parcel_Health_Dark.png" preload="false" />
<texture name="Parcel_M_Dark" file_name="icons/Parcel_M_Dark.png" preload="false" />
<texture name="Parcel_PG_Dark" file_name="icons/Parcel_PG_Dark.png" preload="false" />
@@ -387,22 +344,13 @@ with the same filename but different name
<texture name="Parcel_Voice_Dark" file_name="icons/Parcel_Voice_Dark.png" preload="false" />
<texture name="Parcel_VoiceNo_Dark" file_name="icons/Parcel_VoiceNo_Dark.png" preload="false" />
- <texture name="Parcel_Build_Light" file_name="icons/Parcel_Build_Light.png" preload="false" />
<texture name="Parcel_BuildNo_Light" file_name="icons/Parcel_BuildNo_Light.png" preload="false" />
- <texture name="Parcel_Damage_Light" file_name="icons/Parcel_Damage_Light.png" preload="false" />
- <texture name="Parcel_DamageNo_Light" file_name="icons/Parcel_DamageNo_Light.png" preload="false" />
- <texture name="Parcel_Evry_Light" file_name="icons/Parcel_Evry_Light.png" preload="false" />
- <texture name="Parcel_Exp_Light" file_name="icons/Parcel_Exp_Light.png" preload="false" />
- <texture name="Parcel_Fly_Light" file_name="icons/Parcel_Fly_Light.png" preload="false" />
<texture name="Parcel_FlyNo_Light" file_name="icons/Parcel_FlyNo_Light.png" preload="false" />
<texture name="Parcel_ForSale_Light" file_name="icons/Parcel_ForSale_Light.png" preload="false" />
- <texture name="Parcel_ForSaleNo_Light" file_name="icons/Parcel_ForSaleNo_Light.png" preload="false" />
<texture name="Parcel_M_Light" file_name="icons/Parcel_M_Light.png" preload="false" />
<texture name="Parcel_PG_Light" file_name="icons/Parcel_PG_Light.png" preload="false" />
- <texture name="Parcel_Push_Light" file_name="icons/Parcel_Push_Light.png" preload="false" />
<texture name="Parcel_PushNo_Light" file_name="icons/Parcel_PushNo_Light.png" preload="false" />
<texture name="Parcel_R_Light" file_name="icons/Parcel_R_Light.png" preload="false" />
- <texture name="Parcel_Scripts_Light" file_name="icons/Parcel_Scripts_Light.png" preload="false" />
<texture name="Parcel_ScriptsNo_Light" file_name="icons/Parcel_ScriptsNo_Dark.png" preload="false" />
<texture name="Parcel_Voice_Light" file_name="icons/Parcel_Voice_Light.png" preload="false" />
<texture name="Parcel_VoiceNo_Light" file_name="icons/Parcel_VoiceNo_Light.png" preload="false" />
@@ -414,18 +362,6 @@ with the same filename but different name
<texture name="Play_Over" file_name="icons/Play_Over.png" preload="false" />
<texture name="Play_Press" file_name="icons/Play_Press.png" preload="false" />
- <texture name="Progress_1" file_name="icons/Progress_1.png" preload="false" />
- <texture name="Progress_2" file_name="icons/Progress_2.png" preload="false" />
- <texture name="Progress_3" file_name="icons/Progress_3.png" preload="false" />
- <texture name="Progress_4" file_name="icons/Progress_4.png" preload="false" />
- <texture name="Progress_5" file_name="icons/Progress_5.png" preload="false" />
- <texture name="Progress_6" file_name="icons/Progress_6.png" preload="false" />
- <texture name="Progress_7" file_name="icons/Progress_7.png" preload="false" />
- <texture name="Progress_8" file_name="icons/Progress_8.png" preload="false" />
- <texture name="Progress_9" file_name="icons/Progress_9.png" preload="false" />
- <texture name="Progress_10" file_name="icons/Progress_10.png" preload="false" />
- <texture name="Progress_11" file_name="icons/Progress_11.png" preload="false" />
- <texture name="Progress_12" file_name="icons/Progress_12.png" preload="false" />
<texture name="ProgressBar" file_name="widgets/ProgressBar.png" preload="true" scale.left="4" scale.top="10" scale.right="48" scale.bottom="2" />
<texture name="ProgressTrack" file_name="widgets/ProgressTrack.png" preload="true" scale.left="4" scale.top="13" scale.right="148" scale.bottom="2" />
@@ -434,7 +370,6 @@ with the same filename but different name
<texture name="PushButton_Off" file_name="widgets/PushButton_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="PushButton_On" file_name="widgets/PushButton_On.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="PushButton_On_Selected" file_name="widgets/PushButton_On_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
- <texture name="PushButton_On_Disabled" file_name="widgets/PushButton_On_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="PushButton_Press" file_name="widgets/PushButton_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="PushButton_Selected" file_name="widgets/PushButton_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
<texture name="PushButton_Selected_Press" file_name="widgets/PushButton_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
@@ -447,12 +382,8 @@ with the same filename but different name
<texture name="RadioButton_Disabled" file_name="widgets/RadioButton_Disabled.png" preload="true" />
<texture name="RadioButton_On_Disabled" file_name="widgets/RadioButton_On_Disabled.png" preload="true" />
- <texture name="Rec_Off" file_name="icons/Rec_Off.png" preload="false" />
- <texture name="Rec_On" file_name="icons/Rec_On.png" preload="false" />
- <texture name="Refresh_Disabled" file_name="icons/Refresh_Disabled.png" preload="false" />
<texture name="Refresh_Off" file_name="icons/Refresh_Off.png" preload="false" />
- <texture name="Refresh_Press" file_name="icons/Refresh_Press.png" preload="false" />
<texture name="Resize_Corner" file_name="windows/Resize_Corner.png" preload="true" />
@@ -469,14 +400,11 @@ with the same filename but different name
<texture name="ScrollTrack_Vert" file_name="widgets/ScrollTrack_Vert.png" preload="true" scale.left="2" scale.top="40" scale.bottom="13" scale.right="0" />
<texture name="ScrollTrack_Horiz" file_name="widgets/ScrollTrack_Horiz.png" preload="true" scale.left="4" scale.top="0" scale.bottom="0" scale.right="2" />
- <texture name="ScrubberThumb_Disabled" file_name="widgets/ScrubberThumb_Disabled.png" preload="false" />
- <texture name="ScrubberThumb_Focus" file_name="widgets/ScrubberThumb_Focus.png" preload="false" />
- <texture name="ScrubberThumb_Off" file_name="widgets/ScrubberThumb_Off.png" preload="false" />
- <texture name="ScrubberThumb_Over" file_name="widgets/ScrubberThumb_Over.png" preload="false" />
- <texture name="ScrubberThumb_Press" file_name="widgets/ScrubberThumb_Press.png" preload="false" />
<texture name="Search" file_name="navbar/Search.png" preload="false" />
+ <texture name="Search_Icon" file_name="icons/Search_Icon.png" preload="false" />
+
<texture name="SegmentedBtn_Left_Off" file_name="widgets/SegmentedBtn_Left_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="SegmentedBtn_Left_Over" file_name="widgets/SegmentedBtn_Left_Over.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<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" />
@@ -486,8 +414,6 @@ with the same filename but different name
<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" />
- <texture name="SegmentedBtn_Middle_Off" file_name="widgets/SegmentedBtn_Middle_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
- <texture name="SegmentedBtn_Middle_Press" file_name="widgets/SegmentedBtn_Middle_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="SegmentedBtn_Middle_Disabled" file_name="widgets/SegmentedBtn_Middle_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="SegmentedBtn_Middle_Selected" file_name="widgets/SegmentedBtn_Middle_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="SegmentedBtn_Middle_Selected_Press" file_name="widgets/SegmentedBtn_Middle_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
@@ -501,12 +427,11 @@ with the same filename but different name
<texture name="SegmentedBtn_Right_Selected_Press" file_name="widgets/SegmentedBtn_Right_Selected_Press.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
<texture name="SegmentedBtn_Right_Selected_Disabled" file_name="widgets/SegmentedBtn_Right_Selected_Disabled.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
+ <texture name="Shirt_Large" file_name="icons/Shirt_Large.png" preload="false" />
+ <texture name="Shop" file_name="icons/Shop.png" preload="false" />
+
<texture name="SkipBackward_Off" file_name="icons/SkipBackward_Off.png" preload="false" />
- <texture name="SkipBackward_Over" file_name="icons/SkipBackward_Over.png" preload="false" />
- <texture name="SkipBackward_Press" file_name="icons/SkipBackward_Press.png" preload="false" />
<texture name="SkipForward_Off" file_name="icons/SkipForward_Off.png" preload="false" />
- <texture name="SkipForward_Over" file_name="icons/SkipForward_Over.png" preload="false" />
- <texture name="SkipForward_Press" file_name="icons/SkipForward_Press.png" preload="false" />
<texture name="SliderTrack_Horiz" file_name="widgets/SliderTrack_Horiz.png" scale.left="4" scale.top="4" scale.right="100" scale.bottom="2" />
<texture name="SliderTrack_Vert" file_name="widgets/SliderTrack_Vert.png" scale.left="2" scale.top="100" scale.right="4" scale.bottom="4" />
@@ -515,65 +440,39 @@ with the same filename but different name
<texture name="SliderThumb_Press" file_name="widgets/SliderThumb_Press.png" />
<texture name="SL_Logo" file_name="icons/SL_Logo.png" preload="true" />
+ <texture name="OBJECT_Icon" file_name="icons/object_icon.png" preload="true" />
+ <texture name="Unknown_Icon" file_name="icons/unknown_icon.png" preload="true" />
<texture name="Snapshot_Off" file_name="bottomtray/Snapshot_Off.png" preload="true" scale.left="4" scale.top="19" scale.right="22" scale.bottom="4" />
- <texture name="Snapshot_Over" file_name="bottomtray/Snapshot_Over.png" preload="false" />
- <texture name="Snapshot_Press" file_name="bottomtray/Snapshot_Press.png" preload="false" />
<texture name="startup_logo" file_name="windows/startup_logo.png" preload="true" />
- <texture name="Stepper_Down_Disabled" file_name="widgets/Stepper_Down_Disabled.png" preload="false" />
<texture name="Stepper_Down_Off" file_name="widgets/Stepper_Down_Off.png" preload="false" />
<texture name="Stepper_Down_Press" file_name="widgets/Stepper_Down_Press.png" preload="false" />
- <texture name="Stepper_Up_Disabled" file_name="widgets/Stepper_Up_Disabled.png" preload="false" />
<texture name="Stepper_Up_Off" file_name="widgets/Stepper_Up_Off.png" preload="false" />
<texture name="Stepper_Up_Press" file_name="widgets/Stepper_Up_Press.png" preload="false" />
<texture name="Stop_Off" file_name="icons/Stop_Off.png" preload="false" />
- <texture name="Stop_Over" file_name="icons/Stop_Over.png" preload="false" />
- <texture name="Stop_Press" file_name="icons/Stop_Press.png" preload="false" />
<texture name="StopReload_Off" file_name="icons/StopReload_Off.png" preload="false" />
<texture name="StopReload_Over" file_name="icons/StopReload_Over.png" preload="false" />
- <texture name="StopReload_Press" file_name="icons/StopReload_Press.png" preload="false" />
- <texture name="TabIcon_Appearance_Large" file_name="taskpanel/TabIcon_Appearance_Large.png" preload="false" />
<texture name="TabIcon_Appearance_Off" file_name="taskpanel/TabIcon_Appearance_Off.png" preload="false" />
- <texture name="TabIcon_Appearance_Over" file_name="taskpanel/TabIcon_Appearance_Over.png" preload="false" />
<texture name="TabIcon_Appearance_Selected" file_name="taskpanel/TabIcon_Appearance_Selected.png" preload="false" />
<texture name="TabIcon_Close_Off" file_name="taskpanel/TabIcon_Close_Off.png" preload="false" />
- <texture name="TabIcon_Close_Over" file_name="taskpanel/TabIcon_Close_Over.png" preload="false" />
- <texture name="TabIcon_Inventory_Large" file_name="taskpanel/TabIcon_Inventory_Large.png" preload="false" />
- <texture name="TabIcon_Inventory_Off" file_name="taskpanel/TabIcon_Inventory_Off.png" preload="false" />
- <texture name="TabIcon_Inventory_Over" file_name="taskpanel/TabIcon_Inventory_Over.png" preload="false" />
- <texture name="TabIcon_Inventory_Selected" file_name="taskpanel/TabIcon_Inventory_Selected.png" preload="false" />
- <texture name="TabIcon_Home_Large" file_name="taskpanel/TabIcon_Home_Large.png" preload="false" />
<texture name="TabIcon_Home_Off" file_name="taskpanel/TabIcon_Home_Off.png" preload="false" />
- <texture name="TabIcon_Home_Over" file_name="taskpanel/TabIcon_Home_Over.png" preload="false" />
<texture name="TabIcon_Home_Selected" file_name="taskpanel/TabIcon_Home_Selected.png" preload="false" />
- <texture name="TabIcon_Me_Large" file_name="taskpanel/TabIcon_Me_Large.png" preload="false" />
<texture name="TabIcon_Me_Off" file_name="taskpanel/TabIcon_Me_Off.png" preload="false" />
- <texture name="TabIcon_Me_Over" file_name="taskpanel/TabIcon_Me_Over.png" preload="false" />
<texture name="TabIcon_Me_Selected" file_name="taskpanel/TabIcon_Me_Selected.png" preload="false" />
<texture name="TabIcon_Open_Off" file_name="taskpanel/TabIcon_Open_Off.png" preload="false" />
- <texture name="TabIcon_Open_Over" file_name="taskpanel/TabIcon_Open_Over.png" preload="false" />
- <texture name="TabIcon_People_Large" file_name="taskpanel/TabIcon_People_Large.png" preload="false" />
<texture name="TabIcon_People_Off" file_name="taskpanel/TabIcon_People_Off.png" preload="false" />
- <texture name="TabIcon_People_Over" file_name="taskpanel/TabIcon_People_Over.png" preload="false" />
<texture name="TabIcon_People_Selected" file_name="taskpanel/TabIcon_People_Selected.png" preload="false" />
<texture name="TabIcon_Places_Large" file_name="taskpanel/TabIcon_Places_Large.png" preload="false" />
<texture name="TabIcon_Places_Off" file_name="taskpanel/TabIcon_Places_Off.png" preload="false" />
- <texture name="TabIcon_Places_Over" file_name="taskpanel/TabIcon_Places_Over.png" preload="false" />
<texture name="TabIcon_Places_Selected" file_name="taskpanel/TabIcon_Places_Selected.png" preload="false" />
- <texture name="TabIcon_Things_Large" file_name="taskpanel/TabIcon_Things_Large.png" preload="false" />
<texture name="TabIcon_Things_Off" file_name="taskpanel/TabIcon_Things_Off.png" preload="false" />
- <texture name="TabIcon_Things_Over" file_name="taskpanel/TabIcon_Things_Over.png" preload="false" />
<texture name="TabIcon_Things_Selected" file_name="taskpanel/TabIcon_Things_Selected.png" preload="false" />
- <texture name="TabTop_Divider" file_name="containers/TabTop_Divider.png" preload="false" />
- <texture name="TabTop_Left_Press" file_name="containers/TabTop_Left_Press.png" preload="false" />
- <texture name="TabTop_Middle_Press" file_name="containers/TabTop_Middle_Press.png" preload="false" />
<texture name="TabTop_Right_Off" file_name="containers/TabTop_Right_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />
- <texture name="TabTop_Right_Press" file_name="containers/TabTop_Right_Press.png" preload="false" />
<texture name="TabTop_Right_Selected" file_name="containers/TabTop_Right_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="62" scale.bottom="9" />
<texture name="TabTop_Middle_Off" file_name="containers/TabTop_Middle_Off.png" preload="false" scale.left="8" scale.top="8" scale.right="120" scale.bottom="9" />
<texture name="TabTop_Middle_Selected" file_name="containers/TabTop_Middle_Selected.png" preload="false" scale.left="8" scale.top="8" scale.right="96" scale.bottom="9" />
@@ -582,8 +481,6 @@ with the same filename but different name
<texture name="TaskPanel_Tab_Off" file_name="taskpanel/TaskPanel_Tab_Off.png" preload="false" scale.left="4" scale.top="29" scale.right="36" scale.bottom="4" />
<texture name="TaskPanel_Tab_Selected" file_name="taskpanel/TaskPanel_Tab_Selected.png" preload="false" scale.left="5" scale.top="30" scale.right="36" scale.bottom="5" />
- <texture name="TaskPanel_BG" file_name="taskpanel/TaskPanel_BG.png" preload="false" scale.left="4" scale.top="146" scale.right="146" scale.bottom="4" />
- <texture name="TaskPanel_Tab_Unselected" file_name="taskpanel/TaskPanel_Tab_Over.png" preload="false" scale.left="5" scale.top="30" scale.right="36" scale.bottom="5" />
<texture name="TextField_Search_Disabled" file_name="widgets/TextField_Search_Disabled.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
<texture name="TextField_Off" file_name="widgets/TextField_Off.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
@@ -592,7 +489,6 @@ with the same filename but different name
<texture name="TextField_Disabled" file_name="widgets/TextField_Disabled.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
<texture name="TextField_Active" file_name="widgets/TextField_Active.png" preload="true" scale.left="9" scale.top="12" scale.right="248" scale.bottom="12" />
- <texture name="TimeBasedMediaBackground" file_name="windows/TimeBasedMediaBackground.png" preload="false" />
<texture name="Toast_CloseBtn" file_name="windows/Toast_CloseBtn.png" preload="true" />
<texture name="Toast_Background" file_name="windows/Toast_Background.png" preload="true"
@@ -601,26 +497,23 @@ with the same filename but different name
scale.left="4" scale.top="28" scale.right="60" scale.bottom="4" />
<texture name="Tool_Create" file_name="build/Tool_Create.png" preload="false" />
- <texture name="Tool_Create_Selected" file_name="build/Tool_Create_Selected.png" preload="false" />
<texture name="Tool_Dozer" file_name="build/Tool_Dozer.png" preload="false" />
- <texture name="Tool_Dozer_Selected" file_name="build/Tool_Dozer_Selected.png" preload="false" />
<texture name="Tool_Face" file_name="build/Tool_Face.png" preload="false" />
- <texture name="Tool_Face_Selected" file_name="build/Tool_Face_Selected.png" preload="false" />
<texture name="Tool_Grab" file_name="build/Tool_Grab.png" preload="false" />
- <texture name="Tool_Grab_Selected" file_name="build/Tool_Grab_Selected.png" preload="false" />
<texture name="Tool_Zoom" file_name="build/Tool_Zoom.png" preload="false" />
- <texture name="Tool_Zoom_Selected" file_name="build/Tool_Zoom_Selected.png" preload="false" />
- <texture name="Toolbar_Divider" file_name="containers/Toolbar_Divider.png" preload="false" />
+ <texture name="Toolbar_Left_Flash" file_name="containers/Toolbar_Left_Flash.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" />
<texture name="Toolbar_Left_Off" file_name="containers/Toolbar_Left_Off.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" />
- <texture name="Toolbar_Left_Press" file_name="containers/Toolbar_Left_Press.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" />
+ <texture name="Toolbar_Left_Over" file_name="containers/Toolbar_Left_Over.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" />
<texture name="Toolbar_Left_Selected" file_name="containers/Toolbar_Left_Selected.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" />
<texture name="Toolbar_Middle_Off" file_name="containers/Toolbar_Middle_Off.png" preload="false" scale.left="1" scale.bottom="2" scale.top="24" scale.right="30" />
- <texture name="Toolbar_Middle_Press" file_name="containers/Toolbar_Middle_Press.png" preload="false" scale.left="1" scale.bottom="2" scale.top="24" scale.right="30" />
+ <texture name="Toolbar_Middle_Over" file_name="containers/Toolbar_Middle_Over.png" preload="false" scale.left="1" scale.bottom="2" scale.top="24" scale.right="30" />
<texture name="Toolbar_Middle_Selected" file_name="containers/Toolbar_Middle_Selected.png" preload="false" scale.left="1" scale.bottom="2" scale.top="24" scale.right="30" />
+ <texture name="Toolbar_Middle_Flash" file_name="containers/Toolbar_Middle_Flash.png" preload="false" scale.left="5" scale.bottom="4" scale.top="24" scale.right="30" />
<texture name="Toolbar_Right_Off" file_name="containers/Toolbar_Right_Off.png" preload="false" scale.left="1" scale.bottom="4" scale.top="24" scale.right="26" />
- <texture name="Toolbar_Right_Press" file_name="containers/Toolbar_Right_Press.png" preload="false" scale.left="1" scale.bottom="4" scale.top="24" scale.right="26" />
+ <texture name="Toolbar_Right_Over" file_name="containers/Toolbar_Right_Over.png" preload="false" scale.left="1" scale.bottom="4" scale.top="24" scale.right="26" />
<texture name="Toolbar_Right_Selected" file_name="containers/Toolbar_Right_Selected.png" preload="false" scale.left="1" scale.bottom="4" scale.top="24" scale.right="26" />
+ <texture name="Toolbar_Right_Flash" file_name="containers/Toolbar_Right_Flash.png" preload="false" scale.left="1" scale.bottom="4" scale.top="24" scale.right="26" />
<texture name="Tooltip" file_name="widgets/Tooltip.png" preload="true" scale.left="2" scale.top="16" scale.right="100" scale.bottom="3" />
@@ -629,11 +522,12 @@ with the same filename but different name
<texture name="TrashItem_Press" file_name="icons/TrashItem_Press.png" preload="false" />
<texture name="Unread_Chiclet" file_name="bottomtray/Unread_Chiclet.png" preload="false" />
- <texture name="Unread_Msg" file_name="bottomtray/Unread_Msg.png" preload="false" />
<texture name="Unread_IM" file_name="bottomtray/Unread_IM.png" preload="false" />
- <texture name="WellButton_Lit" file_name="bottomtray/WellButton_Lit.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
- <texture name="WellButton_Lit_Selected" file_name="bottomtray/WellButton_Lit_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="UpArrow_Off" file_name="icons/UpArrow_Off.png" preload="false" />
+
+ <texture name="Volume_Background" file_name="windows/Volume_Background.png" preload="false"
+ scale.left="6" scale.top="33" scale.right="63" scale.bottom="10" />
<texture name="VoicePTT_Lvl1" file_name="bottomtray/VoicePTT_Lvl1.png" preload="false" />
<texture name="VoicePTT_Lvl2" file_name="bottomtray/VoicePTT_Lvl2.png" preload="false" />
@@ -641,10 +535,12 @@ with the same filename but different name
<texture name="VoicePTT_Off" file_name="bottomtray/VoicePTT_Off.png" preload="false" />
<texture name="VoicePTT_On" file_name="bottomtray/VoicePTT_On.png" preload="false" />
- <texture name="WebBasedMediaBackground" file_name="windows/WebBasedMediaBackground.png" preload="false" />
+ <texture name="Wearables_Divider" file_name="windows/Wearables_Divider.png" preload="false" />
+
+ <texture name="WellButton_Lit" file_name="bottomtray/WellButton_Lit.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+ <texture name="WellButton_Lit_Selected" file_name="bottomtray/WellButton_Lit_Selected.png" preload="true" scale.left="4" scale.top="19" scale.right="28" scale.bottom="4" />
+
- <texture name="Widget_DownArrow" file_name="icons/Widget_DownArrow.png" preload="true" />
- <texture name="Widget_UpArrow" file_name="icons/Widget_UpArrow.png" preload="true" />
<texture name="Window_Background" file_name="windows/Window_Background.png" preload="true"
scale.left="4" scale.top="24" scale.right="26" scale.bottom="4" />
@@ -658,30 +554,18 @@ with the same filename but different name
<texture name="YouAreHere_Badge" file_name="icons/YouAreHere_Badge.png" preload="false" />
<texture name="Zoom_Off" file_name="icons/Zoom_Off.png" preload="false" />
- <texture name="Zoom_Over" file_name="icons/Zoom_Over.png" preload="false" />
- <texture name="Zoom_Press" file_name="icons/Zoom_Press.png" preload="false" />
<texture name="UnZoom_Off" file_name="icons/UnZoom_Off.png" preload="false" />
- <texture name="UnZoom_Over" file_name="icons/UnZoom_Over.png" preload="false" />
- <texture name="UnZoom_Press" file_name="icons/UnZoom_Press.png" preload="false" />
- <texture name="PowerOn_Off" file_name="icons/PowerOn_Off.png" preload="false" />
- <texture name="PowerOn_Over" file_name="icons/PowerOn_Over.png" preload="false" />
- <texture name="PowerOn_Press" file_name="icons/PowerOn_Press.png" preload="false" />
- <texture name="PowerOff_Off" file_name="icons/PowerOff_Off.png" preload="false" />
- <texture name="PowerOff_Over" file_name="icons/PowerOff_Over.png" preload="false" />
- <texture name="PowerOff_Press" file_name="icons/PowerOff_Press.png" preload="false" />
<texture name="pixiesmall.j2c" use_mips="true" />
<texture name="script_error.j2c" use_mips="true" />
<texture name="silhouette.j2c" use_mips="true" />
<texture name="foot_shadow.j2c" use_mips="true" />
<texture name="cloud-particle.j2c" use_mips="true" />
+ <texture name="transparent.j2c" use_mips="true" />
<!--WARNING OLD ART BELOW *do not use*-->
- <texture name="icn_chatbar.tga" />
<texture name="icn_media_web.tga" preload="true" />
<texture name="icn_media_movie.tga" preload="true" />
- <texture name="icn_speaker-muted_dark.tga" />
- <texture name="icn_speaker_dark.tga" />
<texture name="icn_voice-localchat.tga" />
<texture name="icn_voice-groupfocus.tga" />
<texture name="icn_voice-pvtfocus.tga" />
@@ -703,12 +587,6 @@ with the same filename but different name
<texture name="tearoffbox.tga" />
<texture name="tearoff_pressed.tga" />
- <texture name="icn_label_music.tga" />
- <texture name="icn_label_media.tga" />
- <texture name="icn_rounded-text-field.tga" scale.left="14" scale.bottom="16" scale.top="16" scale.right="114" />
-
- <texture name="toggle_button_off" file_name="toggle_button_off.png" preload="true" />
- <texture name="toggle_button_selected" file_name="toggle_button_selected.png" preload="true" />
<texture name="color_swatch_alpha.tga" preload="true" />
<texture name="button_anim_pause.tga" />
@@ -718,15 +596,11 @@ with the same filename but different name
<texture name="crosshairs.tga" />
<texture name="direction_arrow.tga" file_name="world/BeaconArrow.png" />
- <texture name="icon_auction.tga" />
<texture name="icon_avatar_offline.tga" />
<texture name="icon_avatar_online.tga" />
<texture name="icon_day_cycle.tga" />
<texture name="icon_diurnal.tga" />
- <texture name="icon_event.tga" />
- <texture name="icon_event_mature.tga" />
- <texture name="icon_for_sale.tga" />
- <texture name="icon_place_for_sale.tga" />
+ <texture name="icon_for_sale.tga" file_name="icons/Icon_For_Sale.png" />
<texture name="icon_top_pick.tga" />
<texture name="lag_status_critical.tga" />
@@ -737,7 +611,6 @@ with the same filename but different name
<texture name="map_avatar_16.tga" />
<texture name="map_avatar_8.tga" />
- <texture name="map_avatar_you_8.tga" />
<texture name="map_event.tga" />
<texture name="map_event_mature.tga" />
<texture name="map_home.tga" />
@@ -746,29 +619,27 @@ with the same filename but different name
<texture name="map_track_16.tga" />
<texture name="notify_caution_icon.tga" />
- <texture name="notify_next.png" preload="true" />
- <texture name="notify_box_icon.tga" />
-
- <texture name="icn_active-speakers-dot-lvl0.tga" />
- <texture name="icn_active-speakers-dot-lvl1.tga" />
- <texture name="icn_active-speakers-dot-lvl2.tga" />
- <texture name="icn_active-speakers-typing1.tga" />
- <texture name="icn_active-speakers-typing2.tga" />
- <texture name="icn_active-speakers-typing3.tga" />
-
- <texture name="icn_voice_ptt-off.tga" />
- <texture name="icn_voice_ptt-on.tga" />
- <texture name="icn_voice_ptt-on-lvl1.tga" />
- <texture name="icn_voice_ptt-on-lvl2.tga" />
- <texture name="icn_voice_ptt-on-lvl3.tga" />
- <texture name="icn_voice-call-end.tga" />
- <texture name="icn_voice-call-start.tga" />
-
- <texture name="mute_icon.tga" />
<texture name="default_land_picture.j2c" />
<texture name="default_profile_picture.j2c" />
<texture name="locked_image.j2c" />
- <texture name="media_floater_border_16.png" scale_top="12" scale_left="4" scale_bottom="4" scale_right="12" />
+ <texture name="Progress_1" file_name="icons/Progress_1.png" preload="true" />
+ <texture name="Progress_2" file_name="icons/Progress_2.png" preload="true" />
+ <texture name="Progress_3" file_name="icons/Progress_3.png" preload="true" />
+ <texture name="Progress_4" file_name="icons/Progress_4.png" preload="true" />
+ <texture name="Progress_5" file_name="icons/Progress_5.png" preload="true" />
+ <texture name="Progress_6" file_name="icons/Progress_6.png" preload="true" />
+ <texture name="Progress_7" file_name="icons/Progress_7.png" preload="true" />
+ <texture name="Progress_8" file_name="icons/Progress_8.png" preload="true" />
+ <texture name="Progress_9" file_name="icons/Progress_9.png" preload="true" />
+ <texture name="Progress_10" file_name="icons/Progress_10.png" preload="true" />
+ <texture name="Progress_11" file_name="icons/Progress_11.png" preload="true" />
+ <texture name="Progress_12" file_name="icons/Progress_12.png" preload="true" />
+
+ <texture name="bevel_background" file_name="widgets/bevel_background.png" preload="true" scale.left="12" scale.top="15" scale.right="108" scale.bottom="2"/>
+ <texture name="buy_off" file_name="widgets/buy_off.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/>
+ <texture name="buy_over" file_name="widgets/buy_over.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/>
+ <texture name="buy_press" file_name="widgets/buy_press.png" preload="true" scale.left="2" scale.top="15" scale.right="67" scale.bottom="4"/>
+
</textures>
diff --git a/indra/newview/skins/default/textures/widgets/bevel_background.png b/indra/newview/skins/default/textures/widgets/bevel_background.png
new file mode 100644
index 0000000000..fb5067503d
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/bevel_background.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/buy_off.png b/indra/newview/skins/default/textures/widgets/buy_off.png
new file mode 100644
index 0000000000..ee5979046f
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/buy_off.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/buy_over.png b/indra/newview/skins/default/textures/widgets/buy_over.png
new file mode 100644
index 0000000000..93adb68c86
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/buy_over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/widgets/buy_press.png b/indra/newview/skins/default/textures/widgets/buy_press.png
new file mode 100644
index 0000000000..3f442d6eaa
--- /dev/null
+++ b/indra/newview/skins/default/textures/widgets/buy_press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/windows/Dragbar.png b/indra/newview/skins/default/textures/windows/Dragbar.png
new file mode 100644
index 0000000000..d94dda1aae
--- /dev/null
+++ b/indra/newview/skins/default/textures/windows/Dragbar.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/windows/Flyout_Pointer_Up.png b/indra/newview/skins/default/textures/windows/Flyout_Pointer_Up.png
new file mode 100644
index 0000000000..361fab59e0
--- /dev/null
+++ b/indra/newview/skins/default/textures/windows/Flyout_Pointer_Up.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/windows/Icon_Gear_Background.png b/indra/newview/skins/default/textures/windows/Icon_Gear_Background.png
index db74b93afd..93d62a8d4f 100644
--- a/indra/newview/skins/default/textures/windows/Icon_Gear_Background.png
+++ b/indra/newview/skins/default/textures/windows/Icon_Gear_Background.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/windows/Icon_Gear_Foreground.png b/indra/newview/skins/default/textures/windows/Icon_Gear_Foreground.png
index 1032e45f7e..b2b2a77a88 100644
--- a/indra/newview/skins/default/textures/windows/Icon_Gear_Foreground.png
+++ b/indra/newview/skins/default/textures/windows/Icon_Gear_Foreground.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/windows/Icon_Gear_Over.png b/indra/newview/skins/default/textures/windows/Icon_Gear_Over.png
index 01dbde102b..67bd399358 100644
--- a/indra/newview/skins/default/textures/windows/Icon_Gear_Over.png
+++ b/indra/newview/skins/default/textures/windows/Icon_Gear_Over.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/windows/Icon_Gear_Press.png b/indra/newview/skins/default/textures/windows/Icon_Gear_Press.png
index 6614bdd165..6fc3744d6b 100644
--- a/indra/newview/skins/default/textures/windows/Icon_Gear_Press.png
+++ b/indra/newview/skins/default/textures/windows/Icon_Gear_Press.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/windows/Volume_Background.png b/indra/newview/skins/default/textures/windows/Volume_Background.png
new file mode 100644
index 0000000000..43aaa441f5
--- /dev/null
+++ b/indra/newview/skins/default/textures/windows/Volume_Background.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/windows/Wearables_Divider.png b/indra/newview/skins/default/textures/windows/Wearables_Divider.png
new file mode 100644
index 0000000000..9dce7bf45c
--- /dev/null
+++ b/indra/newview/skins/default/textures/windows/Wearables_Divider.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/world/BeaconArrow.png b/indra/newview/skins/default/textures/world/BeaconArrow.png
index 12dc246d51..54934f738a 100644
--- a/indra/newview/skins/default/textures/world/BeaconArrow.png
+++ b/indra/newview/skins/default/textures/world/BeaconArrow.png
Binary files differ
diff --git a/indra/newview/skins/default/xui/da/floater_about.xml b/indra/newview/skins/default/xui/da/floater_about.xml
index eb63b5c975..2e9d003848 100644
--- a/indra/newview/skins/default/xui/da/floater_about.xml
+++ b/indra/newview/skins/default/xui/da/floater_about.xml
@@ -8,7 +8,7 @@
Bygget med [COMPILER] version [COMPILER_VERSION]
</floater.string>
<floater.string name="AboutPosition">
- Du er ved [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] i [REGION] lokaliseret på [HOSTNAME] ([HOSTIP])
+ Du er ved [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] i regionen [REGION] lokaliseret ved &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
[SERVER_VERSION]
[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
</floater.string>
@@ -29,7 +29,7 @@ libcurl Version: [LIBCURL_VERSION]
J2C Decoder Version: [J2C_VERSION]
Audio Driver Version: [AUDIO_DRIVER_VERSION]
Qt Webkit Version: [QT_WEBKIT_VERSION]
-Vivox Version: [VIVOX_VERSION]
+Voice Server Version: [VOICE_VERSION]
</floater.string>
<floater.string name="none">
(ingen)
@@ -43,13 +43,14 @@ Vivox Version: [VIVOX_VERSION]
</panel>
<panel label="Tak til" name="credits_panel">
<text_editor name="credits_editor">
- Second Life er gjort muligt for dig af Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl and many others.
+ Second Life er lavet til dig af Philip, Tessa, Andrew, Cory, Ian, James, Phoenix, Ryan, Haney, Dan, Char, Ben, John, Tanya, Eddie, Richard, Mitch, Doug, Eric, Frank, Bruce, Aaron, Peter, Alice, Charlie, Debra, Eileen, Helen, Janet, Steffan, Steve, Tom, Mark, Hunter, Xenon, Burgess, Bill, Jim, Lee, Hamlet, Daniel, Jeff, Todd, Sarah, Tim, Stephanie, Colin, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Jack, Vektor, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Jesse, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Yuko, Makiko, Thomas, Harry, Seth, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Brad, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, Beez, Milo, Hermia, Red, Thrax, Gulliver, Joe, Sally, Paul, Jose, Rejean, Dore, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, Dustin, George, Del, Matthew, Cat, Jacqui, Adrian, Viola, Alfred, Noel, Irfan, Yool, Rika, Jane, Frontier, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Jeremy, JP, Jake, Anthony, Maurice, Madhavi, Leopard, Kyle, Joon, Bert, Belinda, Jon, Kristi, Bridie, Pramod, Socrates, Maria, Aric, Adreanne, Jay, Kari, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Colossus, Zen, BigPapi, Pastrami, Kurz, Mani, Neuro, Mel, Sardonyx, MJ, Rowan, Sgt, Elvis, Samuel, Leo, Bryan, Niko, Austin, Soft, Poppy, Rachel, Aki, Banzai, Alexa, Sue, Bender, CG, Angelo, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Rothman, Niall, Marin, Allison, Katie, Dawn, Dusty, Katt, Judy, Andrea, Ambroff, Infinity, Rico, Gail, Kalpana, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Maestro, Simone, Yang, T, Shannon, Nelson, Khanh, Scott, Courtney, Charlene, Quixote, Susan, Zed, Amanda, Katelin, Enkidu, Roxie, Esbee, JoRoan, Scarlet, Tay, Kevin, Wolfgang, Johnny, Ray, Andren, Merov, Bob, Rand, Howard, Callen, Heff, Galen, Newell, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl, Ashley, JessieAnn, Huseby, Karina, Paris, Kurt, Rick, Lis, Kotler, Theeba, Lynx, Murphy, Doten, Taka, Norm, Jillian, Marcus, Mae, Novack, Esther, Perry, Dana, Ducot, Javier, Porter, Madison, Gecko, Dough, JR, Gisele, Crimp, Norie, Arch, Kimi, Fisher, Barbara, Jason, Peggy, Bernard, Jules, Leroy, Eva, Khederian, Campbell, Vogt, Masido, Karel, Torres, Lo, Breezer, Delby, Rountree, Anna, Servus, Rue, Itiaes, Chuck, Luna, Novella, Zaza, Wen, Gino, Lex, Cassandra, Limey, Nancy, Anukul, Silver, Brodesky, Jinsai, Squid, Gez, Rakesh, Ladan, Edelman, Marcet, Squire, Tatem, Tony, Jerm, Tia, Falcon, BK, Tiggs, Driscoll, Bacon, Timothee, Cru, Carmilla, Coyot, Webb, Kazu, Rudas, LJ, Sea, Ali Wallace, Bewest, Pup, Drub, Dragon, Inoshiro, Byron, Rhett, Xandix, Aimee, Fredrik, Thor, Teddy, Baron, Nelly, Ghengis, Epic, Eli, Stone, Grapes, Irie, Prep, Scobu, Valerie, Alain, and many others.
-Tak til følgende beboerne for at bidrage til at sikre, at dette er den bedste version til dato: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
+Tak til følgende beboere: Drew Dwi, Zai Lynch, Latif Khalifa, Ellla McMahon, Harleen Gretzky, Squirrel Wood, Malarthi Behemoth, Dante Tucker, Buckaroo Mu, Eddi Decosta, Dirk, Talamasca, Torben Trautman, Irene Muni, Lilly Zenovka, Vick Forcella, Sasy Scarborough, Gentle Welinder, Elric Anatine, Techwolf Lupindo, Dusan Writer, WolfPup Lowenhar, Marianne McCann, Fiachra Lach, Sitearm Madonna, Sudane Erato, Sahkolihaa Contepomi, Sachi Vixen, Questar Utu, Dimitrio Lewis, Matto Destiny, Scrim Pinion, Radio Signals, Psi Merlin, Pixel Gausman, Mel Vanbeeck, Laurent Bechir, Lamorna Proctor, Lares Carter, Gwyneth Llewelyn, Hydra Shaftoe, Holger Gilruth, Gentle Heron, Carla Broek, Boroondas Gupte, Fury Rosewood, Flower Ducatillon, Colpo Wexler, gwampa Lomu, Borg Capalini, Beansy Twine, Ardy Lay, , 45ms Zhong, Adeon Writer, Aeonix Aeon, Ai Austin, Aiko Ying, Alexandrea Fride, Alliez Mysterio, Annie Milestone, Annika Genezzia, Ansariel Hiller, ArminasX Saiman, Arya Braveheart, Asaeda Meltingdots, Asturkon Jua, Avallyn Oakleaf, Avatar Quinzet, BabyA Littlething, Bacchus Ireto, Bazaar, Riva, Benjamin Bigdipper, Beth Walcher, Bezilon Kasei, Biancaluce Robbiani, Bill Walach, blakopal Galicia, Blitzckreed Levenque, Bryn Oh, Callipygian Christensen, Cap Carver, Carr Arbenlow, Chantal Harvey, Charles Courtois, Charlie Sazaland, Cherry Cheevers, ChickyBabes Zuzu, Christopher Organiser, Ciaran Laval, Clara Young, Celierra Darling, Corinne Helendale, Corro Moseley, Coughdrop Littlething, Darien Caldwell, Dartagan Shepherd, Debs Regent, Decro Schmooz, Denim Kamachi, DiJodi Dubratt, Dil Spitz, Edgware Marker, Egehan Dryke, Emma Portilo, Emmie Fairymeadow, Evangelista Emerald, Faelon Swordthain, Frenchimmo Sabra, Gaberoonie Zanzibar, Ganymedes Costagravas, Gene Frostbite, GeneJ Composer, Giggles Littlebird, Grady Echegaray, Guni Greenstein, Gypsy Tripsa, Hackshaven Harford, Ham Rambler, Han Shuffle, Hanglow Short, Hatzfeld Runo, herina Bode, Horatio Freund, Hypatia Callisto, Hypatia Pickens, Identity Euler, Imnotgoing Sideways, Innula Zenovka, Iyoba Tarantal, Jack Abraham, Jagga Meredith, Jennifer Boyle, Jeremy Marquez, Jessica Qin, Jinx Nordberg, Jo Bernandes, Jocial Sonnenkern, Joel Savard, Jondan Lundquist, Josef Munster, Josette Windlow, Juilan Tripsa, Juro Kothari, Justin RiversRunRed, Kagehi Kohn, Kaimen Takahe, Keklily Longfall, Ken Lavender, Kestral Karas, Khisme Nitely, Kimar Coba, Kithrak Kirkorian, Kitty Barnett, Kolor Fall, Komiko Okamoto, Korvel Noh, Larry Pixel, Leal Choche, len Starship, Lenae Munz, Lexi Frua, Lillie Cordeaux, Lizzy Macarthur, LSL Scientist, Luban Yiyuan, Luc Starsider, Maccus McCullough, Madison Blanc, Maggie Darwin, Mallory Destiny, Manx Wharton, Marc Claridge, Marc2 Sands, Matthew Anthony, Maxim RiversRunRed, Medhue Simoni, Melinda Latynina, Mencius Watts, Michi Lumin, Midian Farspire, Miles Glaz, Mindy Mathy, Mitch Wagner, Mo Hax, Mourna Biziou, Nao Noe, naofan Teardrop, Naomah Beaumont, Nathiel Siamendes, Nber Medici, Neko Link, Netpat Igaly, Neutron Chesnokov, Newfie Pendragon, Nicholai Laviscu, Nick Rhodes, Nicoladie Gymnast, Ollie Kubrick, Orenj Marat, Orion Delphis, Oryx Tempel, Parvati Silverweb, PeterPunk Mooney, Pixel Scientist, Pounce Teazle, Professor Noarlunga, Quantum Destiny, Quicksilver Hermes, Ralf Setsuko, RAT Quan, RedMokum Bravin, Revolution Perenti, Rezit Sideways, Rich Grainger, Rosco Teardrop, Rose Evans, Rudee Voom, RufusTT Horsefly, Saii Hallard, SaintLEOlions Zimer, Samm Larkham, Satanello Miami, SexySteven Morrisey, Sheet Spotter, Shnurui Troughton, sicarius Thorne, Sicarius Toxx, Sini Nubalo, SLB Wirefly, snowy Sidran, Soupa Segura, ST Mensing, Starshine Halasy, Stickman Ingmann, Synystyr Texan, Takeda Terrawyng, Tali Rosca, Templar Merlin, Tezcatlipoca Bisiani, Tiel Stonecutter, Tony Kembia, TouchaHoney Perhaps, Trey Reanimator, TriloByte Zanzibar, Trinity Dechou, Trinity Dejavu, Unlikely Quintessa, UsikuFarasi Kanarik, Veritas Raymaker, Vex Streeter, Viaticus Speculaas, Villain Baroque, Vixie Durant, Void Singer, Watty Berkson, Westley Schridde, Westley Streeter, Whimsy Winx, Winter Ventura, Wundur Primbee, xstorm Radek, YongYong Francois, Zak Westminster, Zana Kohime, Zaren Alexander, Zeja Pyle, ZenMondo Wormser, Zoex Flanagan, and many others.
-I get by with a little help from my friends. --Richard Starkey
+
+&quot;The work goes on, the cause endures, the hope still lives, and the dreams shall never die&quot; - Edward Kennedy
</text_editor>
</panel>
<panel label="Licenser" name="licenses_panel">
diff --git a/indra/newview/skins/default/xui/da/floater_about_land.xml b/indra/newview/skins/default/xui/da/floater_about_land.xml
index b4af427538..053fe4d9d9 100644
--- a/indra/newview/skins/default/xui/da/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/da/floater_about_land.xml
@@ -1,5 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floaterland" title="OM LAND">
+ <floater.string name="maturity_icon_general">
+ &quot;Parcel_PG_Dark&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_moderate">
+ &quot;Parcel_M_Dark&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_adult">
+ &quot;Parcel_R_Dark&quot;
+ </floater.string>
<floater.string name="Minutes">
[MINUTES] minutter
</floater.string>
@@ -15,7 +24,7 @@
<tab_container name="landtab">
<panel label="GENERELT" name="land_general_panel">
<panel.string name="new users only">
- Kun nye brugere
+ Kun nye beboere
</panel.string>
<panel.string name="anyone">
Alle
@@ -54,6 +63,9 @@
Pacel ikke valgt.
Gå til &apos;Verden&apos; &gt; &apos;Om land&apos; eller vælg en anden parcel for at se detaljer.
</panel.string>
+ <panel.string name="time_stamp_template">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </panel.string>
<text name="Name:">
Navn:
</text>
@@ -81,9 +93,12 @@ Gå til &apos;Verden&apos; &gt; &apos;Om land&apos; eller vælg en anden parcel
<text name="Group:">
Gruppe:
</text>
- <button label="Vælg..." label_selected="Vælg..." name="Set..."/>
+ <text name="GroupText">
+ Leyla Linden
+ </text>
+ <button label="Vælg" name="Set..."/>
<check_box label="Tillad dedikering til gruppe" name="check deed" tool_tip="En gruppe administrator kan dedikere denne jord til gruppen, så det vil blive støttet af gruppen&apos;s jord tildeling."/>
- <button label="Dedikér..." label_selected="Dedikér..." name="Deed..." tool_tip="Du kan kun dedikere jord, hvis du er en administrator i den valgte gruppe."/>
+ <button label="Dedikér" name="Deed..." tool_tip="Du kan kun dedikere jord, hvis du er en administrator i den valgte gruppe."/>
<check_box label="Ejer bidrager ved dedikering" name="check contrib" tool_tip="Når land dedikeres til gruppe, kan den tidligere bidrage med nok land til at dække krav."/>
<text name="For Sale:">
Til salg:
@@ -94,7 +109,7 @@ Gå til &apos;Verden&apos; &gt; &apos;Om land&apos; eller vælg en anden parcel
<text name="For Sale: Price L$[PRICE].">
Pris: L$[PRICE] (L$[PRICE_PER_SQM]/m²).
</text>
- <button label="Sælg land..." label_selected="Sælg land..." name="Sell Land..."/>
+ <button label="Sælg land" name="Sell Land..."/>
<text name="For sale to">
Til salg til: [BUYER]
</text>
@@ -123,12 +138,13 @@ Gå til &apos;Verden&apos; &gt; &apos;Om land&apos; eller vælg en anden parcel
<text name="DwellText">
0
</text>
- <button label="Køb land..." label_selected="Køb land..." name="Buy Land..."/>
- <button label="Køb til gruppe..." label_selected="Køb til gruppe..." name="Buy For Group..."/>
- <button label="Køb adgang..." label_selected="Køb adgang..." name="Buy Pass..." tool_tip="Giver adgang til midlertidig adgang til dette område."/>
- <button label="Efterlad land..." label_selected="Efterlad land..." name="Abandon Land..."/>
- <button label="Kræv tilbage..." label_selected="Kræv tilbage..." name="Reclaim Land..."/>
- <button label="Linden salg..." label_selected="Linden salg..." name="Linden Sale..." tool_tip="Land skal være ejet, indholdsrating sat og ikke allerede på auktion."/>
+ <button label="Køb land" name="Buy Land..."/>
+ <button label="Script Info" name="Scripts..."/>
+ <button label="Køb til gruppe" name="Buy For Group..."/>
+ <button label="Køb adgang" name="Buy Pass..." tool_tip="Giver adgang til midlertidig adgang til dette område."/>
+ <button label="Efterlad land" name="Abandon Land..."/>
+ <button label="Kræv tilbage" name="Reclaim Land..."/>
+ <button label="Linden salg" name="Linden Sale..." tool_tip="Land skal være ejet, indholdsrating sat og ikke allerede på auktion."/>
</panel>
<panel label="REGLER" name="land_covenant_panel">
<panel.string name="can_resell">
@@ -227,7 +243,7 @@ Gå til &apos;Verden&apos; &gt; &apos;Om land&apos; eller vælg en anden parcel
[COUNT]
</text>
<button label="Vis" label_selected="Vis" name="ShowOwner"/>
- <button label="Returnér..." label_selected="Returnér..." name="ReturnOwner..." tool_tip="Returnér objekter til deres ejere."/>
+ <button label="Returnér" name="ReturnOwner..." tool_tip="Returnér objekter til deres ejere."/>
<text name="Set to group:">
Sat til gruppe:
</text>
@@ -235,7 +251,7 @@ Gå til &apos;Verden&apos; &gt; &apos;Om land&apos; eller vælg en anden parcel
[COUNT]
</text>
<button label="Vis" label_selected="Vis" name="ShowGroup"/>
- <button label="Returnér..." label_selected="Returnér..." name="ReturnGroup..." tool_tip="Returnér objekter til deres ejere."/>
+ <button label="Returnér" name="ReturnGroup..." tool_tip="Returnér objekter til deres ejere."/>
<text name="Owned by others:">
Ejet af andre:
</text>
@@ -243,7 +259,7 @@ Gå til &apos;Verden&apos; &gt; &apos;Om land&apos; eller vælg en anden parcel
[COUNT]
</text>
<button label="Vis" label_selected="Vis" name="ShowOther"/>
- <button label="Returnér..." label_selected="Returnér..." name="ReturnOther..." tool_tip="Returnér objekter til deres ejere."/>
+ <button label="Returnér" name="ReturnOther..." tool_tip="Returnér objekter til deres ejere."/>
<text name="Selected / sat upon:">
Valgt/siddet på:
</text>
@@ -257,7 +273,7 @@ Gå til &apos;Verden&apos; &gt; &apos;Om land&apos; eller vælg en anden parcel
Objekt ejere:
</text>
<button label="Gentegn liste" label_selected="Gentegn liste" name="Refresh List" tool_tip="Refresh Object List"/>
- <button label="Returnér objekter..." label_selected="Returnér objekter..." name="Return objects..."/>
+ <button label="Returnér objekter" name="Return objects..."/>
<name_list name="owner list">
<name_list.columns label="Type" name="type"/>
<name_list.columns label="Navn" name="name"/>
@@ -377,12 +393,9 @@ Kun større parceller kan vises i søgning.
</text>
<combo_box name="media type" tool_tip="Specificer om URL-adressen er til en film, hjemmeside eller et andet medie."/>
<text left="4" name="at URL:">
- Medie URL:
- </text>
- <button label="Vælg..." label_selected="Vælg..." name="set_media_url"/>
- <text name="CurrentURL:">
- Nuværende side:
+ Hjemmeside:
</text>
+ <button label="Vælg" name="set_media_url"/>
<check_box label="Skjul medie URL" name="hide_media_url" tool_tip="Klik her for at skjule medie adressen så det kun er dig og evt. parcel gruppens ejer/administratorer der kan se den."/>
<text left="4" name="Description:">
Beskrivelse:
@@ -393,8 +406,8 @@ Kun større parceller kan vises i søgning.
</text>
<texture_picker label="" name="media texture" tool_tip="Klik for at vælge billede"/>
<text name="replace_texture_help">
- (Objekter der har denne tekstur vil vise filmen eller
-web-siden, efter du klikker på play knappen.)
+ Objekter der har denne tekstur vil vise filmen eller web-siden, efter du klikker på play knappen. Vælg
+ Objects using this texture will show the movie or web page after you click the play arrow. Select the thumbnail for at vælge anden tekstur.
</text>
<check_box label="Auto skalér" name="media_auto_scale" tool_tip="Vælg denne mulighed for at skalere indholdet for dette parcel automatisk. Det kan være lidt langsommere og have lavere kvalitet, men ingen anden tekstur skalering eller tilpasning vil være nødvendigt."/>
<text name="media_size" tool_tip="Størrelse for rendering af Web medie, benyt 0 for standard." width="105">
@@ -411,13 +424,18 @@ web-siden, efter du klikker på play knappen.)
<check_box label="Gentag afspil" name="media_loop" tool_tip="Gentager automatisk medie, når det er færdigt med at spille starter det automatisk forfra."/>
</panel>
<panel label="LYD" name="land_audio_panel">
+ <check_box label="Skjul URL" name="hide_music_url" tool_tip="Ved at vælge her, vil musik URL skjules for alle ikke autoriserede brugere der læser denne parcels information."/>
<check_box label="Tillad stemmer" name="parcel_enable_voice_channel"/>
<check_box label="Tillad stemmer (håndteret af estate)" name="parcel_enable_voice_channel_is_estate_disabled"/>
+ <check_box label="Begræns stemme chat til denne parcel" name="parcel_enable_voice_channel_local"/>
</panel>
<panel label="ADGANG" name="land_access_panel">
<panel.string name="access_estate_defined">
(Defineret via estate)
</panel.string>
+ <panel.string name="allow_public_access">
+ Tillad adgang for alle ([MATURITY])
+ </panel.string>
<panel.string name="estate_override">
En eller flere af disse valg er indstillet på estate niveau
</panel.string>
@@ -428,8 +446,8 @@ web-siden, efter du klikker på play knappen.)
<text name="Only Allow">
Blokér adgang for::
</text>
- <check_box label="Beboere der ikke har givet betalings oplysninger til Linden Lab [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Blokér beboere der ikke har afgivet identifikationsoplysninger."/>
- <check_box label="Alders verifikation [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Blokér beboere der ikke har verificeret deres alder. Se support.secondlife.com for mere information."/>
+ <check_box label="Beboere der ikke har givet betalings oplysninger til Linden Lab [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Blokér for uidentificerede beboere."/>
+ <check_box label="Alders verifikation [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Blokér for beboere som ikke er alders-verificerede. Se [SUPPORT_SITE] for mere information."/>
<check_box label="Tillad adgang til gruppen: [GROUP]" name="GroupCheck" tool_tip="Vælg gruppe under fanen &apos;generelt&apos;."/>
<check_box label="Sælg adgang til:" name="PassCheck" tool_tip="Tillader midlertidig adgang til denne parcel"/>
<combo_box name="pass_combo">
diff --git a/indra/newview/skins/default/xui/da/floater_animation_preview.xml b/indra/newview/skins/default/xui/da/floater_animation_preview.xml
index 47e02f0704..adf96841c0 100644
--- a/indra/newview/skins/default/xui/da/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/da/floater_animation_preview.xml
@@ -106,6 +106,9 @@ Maksimal animations længde er [MAX_LENGTH] sekunder.
<floater.string name="E_ST_NO_XLT_EMOTE">
kan ikke læse &quot;emote&quot; navn.
</floater.string>
+ <floater.string name="E_ST_BAD_ROOT">
+ Incorrect root joint name, use &quot;hip&quot;.
+ </floater.string>
<text name="name_label">
Navn:
</text>
@@ -138,35 +141,35 @@ Maksimal animations længde er [MAX_LENGTH] sekunder.
Ansigtsudtryk
</text>
<combo_box label="" name="emote_combo" tool_tip="Angiver hvad ansigtet gør under animationen" width="140">
- <combo_box.item label="(Intet)" name="[None]"/>
- <combo_box.item label="Aaaaah" name="Aaaaah"/>
- <combo_box.item label="Bange" name="Afraid"/>
- <combo_box.item label="Vred" name="Angry"/>
- <combo_box.item label="Stort smil" name="BigSmile"/>
- <combo_box.item label="Keder sig" name="Bored"/>
- <combo_box.item label="Græder" name="Cry"/>
- <combo_box.item label="Forarget" name="Disdain"/>
- <combo_box.item label="Flov" name="Embarrassed"/>
- <combo_box.item label="Skuler" name="Frown"/>
- <combo_box.item label="Kysser" name="Kiss"/>
- <combo_box.item label="Griner" name="Laugh"/>
- <combo_box.item label="Plllppt" name="Plllppt"/>
- <combo_box.item label="Frastødt" name="Repulsed"/>
- <combo_box.item label="Ked af det" name="Sad"/>
- <combo_box.item label="Skuldertræk" name="Shrug"/>
- <combo_box.item label="Smil" name="Smile"/>
- <combo_box.item label="Overrasket" name="Surprise"/>
- <combo_box.item label="Blinker" name="Wink"/>
- <combo_box.item label="Bekymret" name="Worry"/>
+ <item label="(Intet)" name="[None]" value=""/>
+ <item label="Aaaaah" name="Aaaaah" value="Aaaaah"/>
+ <item label="Bange" name="Afraid" value="Bange"/>
+ <item label="Vred" name="Angry" value="Vred"/>
+ <item label="Stort smil" name="BigSmile" value="Stort smil"/>
+ <item label="Keder sig" name="Bored" value="Keder sig"/>
+ <item label="Græder" name="Cry" value="Grædende"/>
+ <item label="Forarget" name="Disdain" value="Foragt"/>
+ <item label="Flov" name="Embarrassed" value="Embarrassed"/>
+ <item label="Skuler" name="Frown" value="Alvorlig"/>
+ <item label="Kysser" name="Kiss" value="Kys"/>
+ <item label="Griner" name="Laugh" value="Leende"/>
+ <item label="Plllppt" name="Plllppt" value="Plllppt"/>
+ <item label="Frastødt" name="Repulsed" value="Frastødt"/>
+ <item label="Ked af det" name="Sad" value="Ked af det"/>
+ <item label="Skuldertræk" name="Shrug" value="Skuldertræk"/>
+ <item label="Smil" name="Smile" value="Smilende"/>
+ <item label="Overrasket" name="Surprise" value="Overrasket"/>
+ <item label="Blinker" name="Wink" value="Blink"/>
+ <item label="Bekymret" name="Worry" value="Bekymret"/>
</combo_box>
<text name="preview_label">
Vis mens
</text>
<combo_box label="" name="preview_base_anim" tool_tip="Se hvordan animation ser ud i forskellige typiske avatar-situationer." width="140">
- <combo_box.item label="Stående" name="Standing"/>
- <combo_box.item label="GÃ¥ende" name="Walking"/>
- <combo_box.item label="Sidder" name="Sitting"/>
- <combo_box.item label="Flyver" name="Flying"/>
+ <item label="Stående" name="Standing" value="Stående"/>
+ <item label="GÃ¥ende" name="Walking" value="GÃ¥ende"/>
+ <item label="Sidder" name="Sitting" value="Siddende"/>
+ <item label="Flyver" name="Flying" value="Flyvende"/>
</combo_box>
<spinner label="start (sec)" name="ease_in_time" tool_tip="Tid (i sekunder) animationen bruger på at komme i gang."/>
<spinner label="Afslut (sec)" name="ease_out_time" tool_tip="Tid (i sekunder) animationen bruger på at afslutte"/>
diff --git a/indra/newview/skins/default/xui/da/floater_avatar_textures.xml b/indra/newview/skins/default/xui/da/floater_avatar_textures.xml
index 1111c5e18b..d0d766eaab 100644
--- a/indra/newview/skins/default/xui/da/floater_avatar_textures.xml
+++ b/indra/newview/skins/default/xui/da/floater_avatar_textures.xml
@@ -3,30 +3,48 @@
<floater.string name="InvalidAvatar">
UGYLDING AVATAR
</floater.string>
- <text name="composite_label">
- Blandede teksturer
- </text>
- <button label="Drop" label_selected="Dump" name="Dump"/>
- <texture_picker label="HÃ¥r" name="hair_grain"/>
- <texture_picker label="Alpha - hår" name="hair_alpha"/>
- <texture_picker label="Makeup" name="head_bodypaint"/>
- <texture_picker label="Alpha - hoved" name="head_alpha"/>
- <texture_picker label="Tatovering hovede" name="head_tattoo"/>
- <texture_picker label="Øje" name="eyes_iris"/>
- <texture_picker label="Alpha - øjne" name="eyes_alpha"/>
- <texture_picker label="Bodypaint - overkrop" name="upper_bodypaint"/>
- <texture_picker label="Undertrøje" name="upper_undershirt"/>
- <texture_picker label="Handsker" name="upper_gloves"/>
- <texture_picker label="Trøje" name="upper_shirt"/>
- <texture_picker label="Øvre jakke" name="upper_jacket"/>
- <texture_picker label="Alpha - øvre" name="upper_alpha"/>
- <texture_picker label="Øvre tatovering" name="upper_tattoo"/>
- <texture_picker label="Bodypaint - underkrop" name="lower_bodypaint"/>
- <texture_picker label="Undertøj" name="lower_underpants"/>
- <texture_picker label="Strømper" name="lower_socks"/>
- <texture_picker label="Sko" name="lower_shoes"/>
- <texture_picker label="Bukser" name="lower_pants"/>
- <texture_picker label="Jakke" name="lower_jacket"/>
- <texture_picker label="Alpha - nedre" name="lower_alpha"/>
- <texture_picker label="Nedre tatovering" name="lower_tattoo"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="label">
+ Gemte
+teksturer
+ </text>
+ <text name="composite_label">
+ Sammensatte
+teksturer
+ </text>
+ <button label="Vis IDs på skærm" label_selected="Dump" name="Dump"/>
+ <panel name="scroll_content_panel">
+ <texture_picker label="HÃ¥r" name="hair-baked"/>
+ <texture_picker label="HÃ¥r" name="hair_grain"/>
+ <texture_picker label="Alpha - hår" name="hair_alpha"/>
+ <texture_picker label="Hoved" name="head-baked"/>
+ <texture_picker label="Makeup" name="head_bodypaint"/>
+ <texture_picker label="Alpha - hoved" name="head_alpha"/>
+ <texture_picker label="Tatovering - hovede" name="head_tattoo"/>
+ <texture_picker label="Øjne" name="eyes-baked"/>
+ <texture_picker label="Øje" name="eyes_iris"/>
+ <texture_picker label="Alpha øjne" name="eyes_alpha"/>
+ <texture_picker label="Overkrop" name="upper-baked"/>
+ <texture_picker label="Øverste bodyPaint" name="upper_bodypaint"/>
+ <texture_picker label="Undertrøje" name="upper_undershirt"/>
+ <texture_picker label="Handsker" name="upper_gloves"/>
+ <texture_picker label="Trøje" name="upper_shirt"/>
+ <texture_picker label="Jakke øverst" name="upper_jacket"/>
+ <texture_picker label="Alpha - øverst" name="upper_alpha"/>
+ <texture_picker label="Tatovering - øverst" name="upper_tattoo"/>
+ <texture_picker label="Underkrop" name="lower-baked"/>
+ <texture_picker label="BodyPaint - nederst" name="lower_bodypaint"/>
+ <texture_picker label="Underbukser" name="lower_underpants"/>
+ <texture_picker label="Strømper" name="lower_socks"/>
+ <texture_picker label="Sko" name="lower_shoes"/>
+ <texture_picker label="Bukser" name="lower_pants"/>
+ <texture_picker label="Jakke" name="lower_jacket"/>
+ <texture_picker label="Alpha - nederst" name="lower_alpha"/>
+ <texture_picker label="Tatovering - nederst" name="lower_tattoo"/>
+ <texture_picker label="Nederdel" name="skirt-baked"/>
+ <texture_picker label="Nederdel" name="skirt"/>
+ </panel>
+ </panel>
+ </scroll_container>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_beacons.xml b/indra/newview/skins/default/xui/da/floater_beacons.xml
index d67d859e7b..8049b072ce 100644
--- a/indra/newview/skins/default/xui/da/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/da/floater_beacons.xml
@@ -2,7 +2,7 @@
<floater name="beacons" title="PEJLELYS">
<panel name="beacons_panel">
<text name="label_show">
- Vis:
+ Vis :
</text>
<check_box label="Pejlelys" name="beacons"/>
<check_box label="Fremhævninger" name="highlights"/>
diff --git a/indra/newview/skins/default/xui/da/floater_build_options.xml b/indra/newview/skins/default/xui/da/floater_build_options.xml
index 9196f19b78..d3c3ac1899 100644
--- a/indra/newview/skins/default/xui/da/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/da/floater_build_options.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="build options floater" title="GITTER VALG">
- <spinner label="Gitter enheder (meter)" label_width="136" name="GridResolution" width="200"/>
- <spinner label="Gitter rækkevidde (meter)" label_width="136" name="GridDrawSize" width="200"/>
+ <spinner label="Enheder (meter)" label_width="136" name="GridResolution" width="200"/>
+ <spinner label="Rækkevidde (meter)" label_width="136" name="GridDrawSize" width="200"/>
<check_box label="Aktivér låsning til underenheder" name="GridSubUnit"/>
<check_box label="Vis &apos;cross-sections&apos;" name="GridCrossSection"/>
<text name="grid_opacity_label" tool_tip="Gitter synlighed">
diff --git a/indra/newview/skins/default/xui/da/floater_bulk_perms.xml b/indra/newview/skins/default/xui/da/floater_bulk_perms.xml
index 0dd1a4f6ba..58a1c1b73e 100644
--- a/indra/newview/skins/default/xui/da/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/da/floater_bulk_perms.xml
@@ -49,6 +49,6 @@
<check_box label="Redigere" name="next_owner_modify"/>
<check_box label="Kopiére" name="next_owner_copy"/>
<check_box initial_value="true" label="Overfør" name="next_owner_transfer" tool_tip="Næste ejer kan sælge eller forære dette objekt væk"/>
- <button label="Ok" name="apply"/>
+ <button label="OK" name="apply"/>
<button label="Annullér" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_buy_currency.xml b/indra/newview/skins/default/xui/da/floater_buy_currency.xml
index 18ee0e0597..ec6ac5b2a8 100644
--- a/indra/newview/skins/default/xui/da/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/da/floater_buy_currency.xml
@@ -37,7 +37,7 @@
Estimerer...
</text>
<text name="buy_action">
- [NAME] L$ [PRICE]
+ [ACTION]
</text>
<text name="total_label">
Min nye beholdning vil være
@@ -46,7 +46,7 @@
L$ [AMT]
</text>
<text name="currency_links">
- [http://www.secondlife.com/ payment method] | [http://www.secondlife.com/ currency] | [http://www.secondlife.com/my/account/exchange_rates.php exchange rate]
+ [http://www.secondlife.com/my/account/payment_method_management.php payment method] | [http://www.secondlife.com/my/account/currency.php currency] | [http://www.secondlife.com/my/account/exchange_rates.php exchange rate]
</text>
<text name="exchange_rate_note">
Indtast beløbet for at se nyeste valutakurs.
diff --git a/indra/newview/skins/default/xui/da/floater_buy_currency_html.xml b/indra/newview/skins/default/xui/da/floater_buy_currency_html.xml
new file mode 100644
index 0000000000..e32b25ca17
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_buy_currency_html.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_buy_currency_html" title="KØB VALUTA"/>
diff --git a/indra/newview/skins/default/xui/da/floater_buy_land.xml b/indra/newview/skins/default/xui/da/floater_buy_land.xml
index 987ad6585f..f6ee78fa6d 100644
--- a/indra/newview/skins/default/xui/da/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/da/floater_buy_land.xml
@@ -1,5 +1,131 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="buy land" title="KØB LAND">
+ <floater.string name="can_resell">
+ Kan videresælges.
+ </floater.string>
+ <floater.string name="can_not_resell">
+ Kan ikke videresælges.
+ </floater.string>
+ <floater.string name="can_change">
+ Kan samles eller opdeles.
+ </floater.string>
+ <floater.string name="can_not_change">
+ Kan ikke samles eller opdeles.
+ </floater.string>
+ <floater.string name="cant_buy_for_group">
+ Du har ikke tilladelse til at købe land for din aktive gruppe.
+ </floater.string>
+ <floater.string name="no_land_selected">
+ Intet land er valgt.
+ </floater.string>
+ <floater.string name="multiple_parcels_selected">
+ Flere forskellige parceller er valgt.
+Prøv at vælge et mindre område.
+ </floater.string>
+ <floater.string name="no_permission">
+ Du har ikke tilladelse til at købe jord for din aktive gruppe.
+ </floater.string>
+ <floater.string name="parcel_not_for_sale">
+ Det udvalgte parcel er ikke til salg.
+ </floater.string>
+ <floater.string name="group_already_owns">
+ Gruppen ejer allerede parcellet.
+ </floater.string>
+ <floater.string name="you_already_own">
+ Du ejer allerede parcellet.
+ </floater.string>
+ <floater.string name="set_to_sell_to_other">
+ Det udvalgte parcel er sat til salg til en anden.
+ </floater.string>
+ <floater.string name="no_public_land">
+ Det valgte område har ingen offentlige arealer.
+ </floater.string>
+ <floater.string name="not_owned_by_you">
+ Land ejet af en anden beboer valgt.
+Prøv at vælge et mindre område.
+ </floater.string>
+ <floater.string name="processing">
+ Forarbejder dit køb...
+
+(Dette kan tage et minut eller to.)
+ </floater.string>
+ <floater.string name="fetching_error">
+ Der er sket en fejl under hentning af jord købs oplysninger.
+ </floater.string>
+ <floater.string name="buying_will">
+ Køb af dette areal vil:
+ </floater.string>
+ <floater.string name="buying_for_group">
+ Køb af dette areal vil:
+ </floater.string>
+ <floater.string name="cannot_buy_now">
+ Kan ikke købe nu:
+ </floater.string>
+ <floater.string name="not_for_sale">
+ Ikke til salg:
+ </floater.string>
+ <floater.string name="none_needed">
+ ikke nødvendigt
+ </floater.string>
+ <floater.string name="must_upgrade">
+ Din konto skal være opgraderet for at eje jord.
+ </floater.string>
+ <floater.string name="cant_own_land">
+ Din konto kan eje jord.
+ </floater.string>
+ <floater.string name="land_holdings">
+ Du ejer [BUYER] m² land.
+ </floater.string>
+ <floater.string name="pay_to_for_land">
+ Betal L$ [AMOUNT] til [SELLER] for dette stykke jord
+ </floater.string>
+ <floater.string name="buy_for_US">
+ Køb L$ [AMOUNT] for ca. [LOCAL_AMOUNT],
+ </floater.string>
+ <floater.string name="parcel_meters">
+ Denne parcel er på [AMOUNT] m²
+ </floater.string>
+ <floater.string name="premium_land">
+ Dette stykke jord er premium, og vil tælle som [AMOUNT] m².
+ </floater.string>
+ <floater.string name="discounted_land">
+ Dette stykke jord er på tilbud, og vil tælle som [AMOUNT] m².
+ </floater.string>
+ <floater.string name="meters_supports_object">
+ [AMOUNT] m²
+kan indeholde [AMOUNT2] objekter
+ </floater.string>
+ <floater.string name="sold_with_objects">
+ solgt med objekter
+ </floater.string>
+ <floater.string name="sold_without_objects">
+ objekter ikke inkluderet
+ </floater.string>
+ <floater.string name="info_price_string">
+ L$ [PRICE]
+(L$ [PRICE_PER_SQM]/m²)
+[SOLD_WITH_OBJECTS]
+ </floater.string>
+ <floater.string name="insufficient_land_credits">
+ Gruppen [GROUP] skal bruge nok tildelt jord brugs
+kredit for at dække dette parcel før købet vil blive
+gennemført.
+ </floater.string>
+ <floater.string name="have_enough_lindens">
+ Du har L$ [AMOUNT], hvilket er nok til at købe denne jord.
+ </floater.string>
+ <floater.string name="not_enough_lindens">
+ Du har kun L$ [AMOUNT], og har brug for yderligere L$ [AMOUNT2].
+ </floater.string>
+ <floater.string name="balance_left">
+ Efter købet, vil du have L$ [AMOUNT] tilbage.
+ </floater.string>
+ <floater.string name="balance_needed">
+ Du skal købe mindst L$ [AMOUNT] for at have råd til denne jord.
+ </floater.string>
+ <floater.string name="no_parcel_selected">
+ (intet parcel er valgt)
+ </floater.string>
<text name="region_name_label">
Region:
</text>
@@ -107,133 +233,4 @@ Denne parcel er på 512 m².
<check_box label="Fjern [AMOUNT] m² af bidrag fra gruppe." name="remove_contribution"/>
<button label="Køb" name="buy_btn"/>
<button label="Annullér" name="cancel_btn"/>
- <string name="can_resell">
- Kan videresælges.
- </string>
- <string name="can_not_resell">
- Kan ikke videresælges.
- </string>
- <string name="can_change">
- Kan samles eller opdeles.
- </string>
- <string name="can_not_change">
- Kan ikke samles eller opdeles.
- </string>
- <string name="cant_buy_for_group">
- Du har ikke tilladelse til at købe land for din aktive gruppe.
- </string>
- <string name="no_land_selected">
- Intet land er valgt.
- </string>
- <string name="multiple_parcels_selected">
- Flere forskellige parceller er valgt.
-Prøv at vælge et mindre område.
- </string>
- <string name="no_permission">
- Du har ikke tilladelse til at købe jord for din aktive gruppe.
- </string>
- <string name="parcel_not_for_sale">
- Det udvalgte parcel er ikke til salg.
- </string>
- <string name="group_already_owns">
- Gruppen ejer allerede parcellet.
- </string>
- <string name="you_already_own">
- Du ejer allerede parcellet.
- </string>
- <string name="set_to_sell_to_other">
- Det udvalgte parcel er sat til salg til en anden.
- </string>
- <string name="no_public_land">
- Det valgte område har ingen offentlige arealer.
- </string>
- <string name="not_owned_by_you">
- Jord, der ejes af en anden bruger er valgt.
-Prøv at vælge et mindre område.
- </string>
- <string name="processing">
- Forarbejder dit køb...
-
-(Dette kan tage et minut eller to.)
- </string>
- <string name="fetching_error">
- Der er sket en fejl under hentning af jord købs oplysninger.
- </string>
- <string name="buying_will">
- Køb af dette areal vil:
- </string>
- <string name="buying_for_group">
- Køb af dette areal vil:
- </string>
- <string name="cannot_buy_now">
- Kan ikke købe nu:
- </string>
- <string name="not_for_sale">
- Ikke til salg:
- </string>
- <string name="none_needed">
- ikke nødvendigt
- </string>
- <string name="must_upgrade">
- Din konto skal være opgraderet for at eje jord.
- </string>
- <string name="cant_own_land">
- Din konto kan eje jord.
- </string>
- <string name="land_holdings">
- Du ejer [BUYER] m² land.
- </string>
- <string name="pay_to_for_land">
- Betal L$ [AMOUNT] til [SELLER] for dette stykke jord
- </string>
- <string name="buy_for_US">
- Køb L$ [AMOUNT] for ca. [LOCAL_AMOUNT],
- </string>
- <string name="parcel_meters">
- Denne parcel er på [AMOUNT] m²
- </string>
- <string name="premium_land">
- Dette stykke jord er premium, og vil tælle som [AMOUNT] m².
- </string>
- <string name="discounted_land">
- Dette stykke jord er på tilbud, og vil tælle som [AMOUNT] m².
- </string>
- <string name="meters_supports_object">
- [AMOUNT] m²
-kan indeholde [AMOUNT2] objekter
- </string>
- <string name="sold_with_objects">
- solgt med objekter
- </string>
- <string name="sold_without_objects">
- objekter ikke inkluderet
- </string>
- <string name="info_price_string">
- L$ [PRICE]
-(L$ [PRICE_PER_SQM]/m²)
-[SOLD_WITH_OBJECTS]
- </string>
- <string name="insufficient_land_credits">
- Gruppen [GROUP] skal bruge nok tildelt jord brugs
-kredit for at dække dette parcel før købet vil blive
-gennemført.
- </string>
- <string name="have_enough_lindens">
- Du har L$ [AMOUNT], hvilket er nok til at købe denne jord.
- </string>
- <string name="not_enough_lindens">
- Du har kun L$ [AMOUNT], og har brug for yderligere L$ [AMOUNT2].
- </string>
- <string name="balance_left">
- Efter købet, vil du have L$ [AMOUNT] tilbage.
- </string>
- <string name="balance_needed">
- Du skal købe mindst L$ [AMOUNT] for at have råd til denne jord.
- </string>
- <string name="no_parcel_selected">
- (intet parcel er valgt)
- </string>
- <string name="buy_currency">
- Køb L$ [LINDENS] for omkring US$ [USD]
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_camera.xml b/indra/newview/skins/default/xui/da/floater_camera.xml
index 2596559609..37e3307960 100644
--- a/indra/newview/skins/default/xui/da/floater_camera.xml
+++ b/indra/newview/skins/default/xui/da/floater_camera.xml
@@ -9,6 +9,18 @@
<floater.string name="move_tooltip">
Flyt kamera op og ned, til venstre og højre
</floater.string>
+ <floater.string name="orbit_mode_title">
+ Kredsløb
+ </floater.string>
+ <floater.string name="pan_mode_title">
+ Panorér
+ </floater.string>
+ <floater.string name="avatar_view_mode_title">
+ Forvalg
+ </floater.string>
+ <floater.string name="free_mode_title">
+ Se objekt
+ </floater.string>
<panel name="controls">
<joystick_track name="cam_track_stick" tool_tip="Flyt kamera op og ned, til venstre og højre"/>
<panel name="zoom" tool_tip="Zoom kamera mod fokus">
@@ -25,7 +37,7 @@
<panel name="buttons">
<button label="" name="orbit_btn" tool_tip="Rotér kamera"/>
<button label="" name="pan_btn" tool_tip="Panorér kamera"/>
- <button label="" name="avatarview_btn" tool_tip="Se som avatar"/>
+ <button label="" name="avatarview_btn" tool_tip="Forvalg"/>
<button label="" name="freecamera_btn" tool_tip="Se objekt"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_color_picker.xml b/indra/newview/skins/default/xui/da/floater_color_picker.xml
index 514b2c4331..f744b06277 100644
--- a/indra/newview/skins/default/xui/da/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/da/floater_color_picker.xml
@@ -21,7 +21,7 @@
<check_box label="Benyt nu" name="apply_immediate"/>
<button label="" label_selected="" name="color_pipette"/>
<button label="Annullér" label_selected="Annullér" name="cancel_btn"/>
- <button label="Ok" label_selected="Ok" name="select_btn"/>
+ <button label="OK" label_selected="OK" name="select_btn"/>
<text name="Current color:">
Nuværende Farve:
</text>
diff --git a/indra/newview/skins/default/xui/da/floater_customize.xml b/indra/newview/skins/default/xui/da/floater_customize.xml
index 379302ef6a..a47e0d33df 100644
--- a/indra/newview/skins/default/xui/da/floater_customize.xml
+++ b/indra/newview/skins/default/xui/da/floater_customize.xml
@@ -1,7 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater customize" title="UDSEENDE" width="509">
- <tab_container name="customize tab container" width="507">
- <placeholder label="Krops Dele" name="body_parts_placeholder"/>
+<floater name="floater customize" title="UDSEENDE">
+ <tab_container name="customize tab container">
+ <text label="Krops Dele" name="body_parts_placeholder">
+ Kropsdele
+ </text>
<panel label="Kropsbygning" name="Shape">
<button label="Annullér" label_selected="Annullér" name="Revert"/>
<button label="Krop" label_selected="Krop" name="Body"/>
@@ -14,8 +16,8 @@
<button label="Overkrop" label_selected="Overkrop" name="Torso"/>
<button label="Ben" label_selected="Ben" name="Legs"/>
<radio_group name="sex radio">
- <radio_item label="Kvinde" name="radio"/>
- <radio_item label="Mand" name="radio2"/>
+ <radio_item label="Kvinde" name="radio" value="0"/>
+ <radio_item label="Mand" name="radio2" value="1"/>
</radio_group>
<text name="title">
[DESC]
@@ -33,9 +35,7 @@
Fundet i [PATH]
</text>
<text name="not worn instructions">
- Vælg en ny krop ved at trække en sådan fra din beholdning
-over på din avatar. Du kan også oprette en fra bunden
-og bagefter &apos;tage den på&apos;.
+ Vælg en ny kropsbygning ved at trække en sådan fra din beholdning over på din avatar. Du kan også oprette en fra bunden og bagefter &apos;tage den på&apos;.
</text>
<text name="no modify instructions">
Du har ikke rettigheder til at redigere denne del.
@@ -68,9 +68,7 @@ og bagefter &apos;tage den på&apos;.
Fundet i [PATH]
</text>
<text name="not worn instructions">
- Tag en ny hud på ved at trække en sådan fra din beholdning
-over på din avatar. Du kan også oprette en hud fra bunden
-og bagefter &apos;tage den på&apos;.
+ Vælg en ny hud ved at trække en sådan fra din beholdning over på din avatar. Du kan også oprette en fra bunden og bagefter &apos;tage den på&apos;.
</text>
<text name="no modify instructions">
Du har ikke rettigheder til at redigere denne del.
@@ -107,9 +105,7 @@ og bagefter &apos;tage den på&apos;.
Fundet i [PATH]
</text>
<text name="not worn instructions">
- Tag et ny hår på ved at trække et fra din beholdning
-over på din avatar. Du kan også oprette et nyt hår fra bunden
-og bagefter &apos;tage det på&apos;.
+ Vælg et nyt hår ved at trække et sådant fra din beholdning over på din avatar. Du kan også oprette et fra bunden og bagefter &apos;tage det på&apos;.
</text>
<text name="no modify instructions">
Du har ikke rettigheder til at redigere denne del.
@@ -140,9 +136,7 @@ og bagefter &apos;tage det på&apos;.
Fundet i [PATH]
</text>
<text name="not worn instructions">
- Tag et ny sæt øjne på ved at trække et sæt fra din beholdning
-over på din avatar. Du kan også oprette et nyt sæt øjne fra bunden
-og bagefter &apos;tage dem på&apos;.
+ Vælg et nyt sæt øjne ved at trække et sådant par fra din beholdning over på din avatar. Du kan også oprette et par fra bunden og bagefter &apos;tage dem på&apos;.
</text>
<text name="no modify instructions">
Du har ikke rettigheder til at redigere denne del.
@@ -156,12 +150,14 @@ og bagefter &apos;tage dem på&apos;.
<button label="Gem som..." label_selected="Gem som..." name="Save As"/>
<button label="Annullér" label_selected="Annullér" name="Revert"/>
</panel>
- <placeholder label="Tøje" name="clothes_placeholder"/>
+ <text label="Tøje" name="clothes_placeholder">
+ Tøj
+ </text>
<panel label="Trøje" name="Shirt">
<texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/>
<color_swatch label="Farve" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
- <button label="Lav ny trøje" label_selected="Lav ny trøje" name="Create New"/>
<button label="Tag af" label_selected="Tag af" name="Take Off"/>
+ <button label="Lav ny trøje" label_selected="Lav ny trøje" name="Create New"/>
<button label="Gem" label_selected="Gem" name="Save"/>
<button label="Gem som..." label_selected="Gem som..." name="Save As"/>
<button label="Annullér" label_selected="Annullér" name="Revert"/>
@@ -181,8 +177,7 @@ og bagefter &apos;tage dem på&apos;.
Fundet i [PATH]
</text>
<text name="not worn instructions">
- Tag en ny Tøje på ved at trække en fra din beholdning over på din avatar.
-Du kan også oprette en ny Tøje fra bunden og bagefter &apos;tage den på&apos;.
+ Vælg en ny trøje ved at trække en fra din beholdning over på din avatar. Du kan også oprette en fra bunden og bagefter &apos;tage den på&apos;.
</text>
<text name="no modify instructions">
Du har ikke rettigheder til at redigere denne del.
@@ -194,8 +189,8 @@ Du kan også oprette en ny Tøje fra bunden og bagefter &apos;tage den på&apos;
<panel label="Bukser" name="Pants">
<texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/>
<color_swatch label="Farve" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
- <button label="Lav nye bukser" label_selected="Lav nye bukser" name="Create New"/>
<button label="Tag af" label_selected="Tag af" name="Take Off"/>
+ <button label="Lav nye bukser" label_selected="Lav nye bukser" name="Create New"/>
<button label="Gem" label_selected="Gem" name="Save"/>
<button label="Gem som..." label_selected="Gem som..." name="Save As"/>
<button label="Annullér" label_selected="Annullér" name="Revert"/>
@@ -215,9 +210,7 @@ Du kan også oprette en ny Tøje fra bunden og bagefter &apos;tage den på&apos;
Fundet i [PATH]
</text>
<text name="not worn instructions">
- Tag nyr bukser på ved at trække dem fra din beholdning over på
-din avatar. Du kan også oprette ny bukser fra bunden og bagefter
-&apos;tage dem på&apos;.
+ Vælg et nyt par bukser ved at trække et par fra din beholdning over på din avatar. Du kan også oprette et par fra bunden og bagefter &apos;tage dem på&apos;.
</text>
<text name="no modify instructions">
Du har ikke rettigheder til at redigere denne del.
@@ -243,10 +236,9 @@ din avatar. Du kan også oprette ny bukser fra bunden og bagefter
Fundet i [PATH]
</text>
<text name="not worn instructions">
- Tag et ny par sko på ved at trække dem fra din beholdning
-over på din avatar. Du kan også oprette et nyt par sko fra bunden
-og bagefter &apos;tage dem på&apos;.
+ Vælg et nyt par sko ved at trække et par fra din beholdning over på din avatar. Du kan også oprette et par fra bunden og bagefter &apos;tage dem på&apos;.
</text>
+ <button label="Lav nye sko" label_selected="Lav nye sko" name="Create New"/>
<text name="no modify instructions">
Du har ikke rettigheder til at redigere denne del.
</text>
@@ -255,7 +247,6 @@ og bagefter &apos;tage dem på&apos;.
</text>
<texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/>
<color_swatch label="Farve" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
- <button label="Lav nye sko" label_selected="Lav nye sko" name="Create New"/>
<button label="Tag af" label_selected="Tag af" name="Take Off"/>
<button label="Gem" label_selected="Gem" name="Save"/>
<button label="Gem som..." label_selected="Gem som..." name="Save As"/>
@@ -278,10 +269,9 @@ og bagefter &apos;tage dem på&apos;.
Fundet i [PATH]
</text>
<text name="not worn instructions">
- Tag et ny par Strømper på ved at trække dem fra din beholdning
-over på din avatar. Du kan også oprette et nyt par Strømper fra bunden
-og bagefter &apos;tage dem på&apos;.
+ Vælg et nyt par sokker ved at trække et par fra din beholdning over på din avatar. Du kan også oprette et par fra bunden og bagefter &apos;tage dem på&apos;.
</text>
+ <button label="Lav nye strømper" label_selected="Lav nye strømper" name="Create New"/>
<text name="no modify instructions">
Du har ikke rettigheder til at redigere denne del.
</text>
@@ -290,7 +280,6 @@ og bagefter &apos;tage dem på&apos;.
</text>
<texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/>
<color_swatch label="Farve" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
- <button label="Lav nye strømper" label_selected="Lav nye strømper" name="Create New"/>
<button label="Tag af" label_selected="Tag af" name="Take Off"/>
<button label="Gem" label_selected="Gem" name="Save"/>
<button label="Gem som..." label_selected="Gem som..." name="Save As"/>
@@ -313,9 +302,9 @@ og bagefter &apos;tage dem på&apos;.
Fundet i [PATH]
</text>
<text name="not worn instructions">
- Tag en ny jakke på ved at trække en fra din beholdning over på din avatar.
-Du kan også oprette en ny jakke fra bunden og bagefter &apos;tage den på&apos;.
+ Vælg en ny jakke ved at trække en fra din beholdning over på din avatar. Du kan også oprette en fra bunden og bagefter &apos;tage den på&apos;.
</text>
+ <button label="Lav ny jakke" label_selected="Lav ny jakke" name="Create New"/>
<text name="no modify instructions">
Du har ikke rettigheder til at redigere denne del.
</text>
@@ -325,7 +314,6 @@ Du kan også oprette en ny jakke fra bunden og bagefter &apos;tage den på&apos;
<texture_picker label="Stof øverst" name="Upper Fabric" tool_tip="Klik for at vælge et billede"/>
<texture_picker label="Stof nederst" name="Lower Fabric" tool_tip="Klik for at vælge et billede"/>
<color_swatch label="Farve" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
- <button label="Lav ny jakke" label_selected="Lav ny jakke" name="Create New"/>
<button label="Tag af" label_selected="Tag af" name="Take Off"/>
<button label="Gem" label_selected="Gem" name="Save"/>
<button label="Gem som..." label_selected="Gem som..." name="Save As"/>
@@ -348,10 +336,9 @@ Du kan også oprette en ny jakke fra bunden og bagefter &apos;tage den på&apos;
Fundet i [PATH]
</text>
<text name="not worn instructions">
- Tag nye handsker på ved at trække et par fra din beholdning over på
-din avatar. Du kan også oprette nye handsker fra bunden
-og bagefter &apos;tage dem på&apos;.
+ Vælg et sæt nye handsker ved at trække et par fra din beholdning over på din avatar. Du kan også oprette et par fra bunden og bagefter &apos;tage dem på&apos;.
</text>
+ <button label="Lav nye handsker" label_selected="Lav nye handsker" name="Create New"/>
<text name="no modify instructions">
Du har ikke rettigheder til at redigere denne del.
</text>
@@ -360,7 +347,6 @@ og bagefter &apos;tage dem på&apos;.
</text>
<texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/>
<color_swatch label="Farve" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
- <button label="Lav nye handsker" label_selected="Lav nye handsker" name="Create New"/>
<button label="Tag af" label_selected="Tag af" name="Take Off"/>
<button label="Gem" label_selected="Gem" name="Save"/>
<button label="Gem som..." label_selected="Gem som..." name="Save As"/>
@@ -383,10 +369,9 @@ og bagefter &apos;tage dem på&apos;.
Fundet i [PATH]
</text>
<text name="not worn instructions">
- Tag en ny undertrøje på ved at trække en fra din beholdning over på
-din avatar. Du kan også oprette en ny undertrøje fra bunden
-og bagefter &apos;tage den på&apos;.
+ Vælg en ny undertrøje ved at trække en fra din beholdning over på din avatar. Du kan også oprette en fra bunden og bagefter &apos;tage den på&apos;.
</text>
+ <button label="Lav ny undertrøje" label_selected="Lav ny undertrøje" name="Create New"/>
<text name="no modify instructions">
Du har ikke rettigheder til at redigere denne del.
</text>
@@ -395,7 +380,6 @@ og bagefter &apos;tage den på&apos;.
</text>
<texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/>
<color_swatch label="Farve" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
- <button label="Lav ny undertrøje" label_selected="Lav ny undertrøje" name="Create New"/>
<button label="Tag af" label_selected="Tag af" name="Take Off"/>
<button label="Gem" label_selected="Gem" name="Save"/>
<button label="Gem som..." label_selected="Gem som..." name="Save As"/>
@@ -418,10 +402,9 @@ og bagefter &apos;tage den på&apos;.
Fundet i [PATH]
</text>
<text name="not worn instructions">
- Tag nye underbukser på ved at trække dem fra din beholdning over på
-din avatar. Du kan også oprette en par nye underbukser fra bunden
-og bagefter &apos;tage dem på&apos;.
+ Vælg et nyt par underbukser ved at trække et par fra din beholdning over på din avatar. Du kan også oprette et par fra bunden og bagefter &apos;tage dem på&apos;.
</text>
+ <button label="Lav nye underbukser" label_selected="Lav nye underbukser" name="Create New"/>
<text name="no modify instructions">
Du har ikke rettigheder til at redigere denne del.
</text>
@@ -430,7 +413,6 @@ og bagefter &apos;tage dem på&apos;.
</text>
<texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/>
<color_swatch label="Farve" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
- <button label="Lav nye underbukser" label_selected="Lav nye underbukser" name="Create New"/>
<button label="Tag af" label_selected="Tag af" name="Take Off"/>
<button label="Gem" label_selected="Gem" name="Save"/>
<button label="Gem som..." label_selected="Gem som..." name="Save As"/>
@@ -453,10 +435,9 @@ og bagefter &apos;tage dem på&apos;.
Fundet i [PATH]
</text>
<text name="not worn instructions">
- Tag en ny nederdel på ved at trække en fra din beholdning over på
-din avatar. Du kan også oprette en ny nederdel fra bunden
-og bagefter &apos;tage den på&apos;.
+ Vælg en ny nederdel ved at trække en fra din beholdning over på din avatar. Du kan også oprette en fra bunden og bagefter &apos;tage den på&apos;.
</text>
+ <button label="Lav ny nederdel" label_selected="Lav ny nederdel" name="Create New"/>
<text name="no modify instructions">
Du har ikke rettigheder til at redigere denne del.
</text>
@@ -465,13 +446,12 @@ og bagefter &apos;tage den på&apos;.
</text>
<texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/>
<color_swatch label="Farve" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
- <button label="Lav ny nederdel" label_selected="Lav ny nederdel" name="Create New"/>
<button label="Tag af" label_selected="Tag af" name="Take Off"/>
<button label="Gem" label_selected="Gem" name="Save"/>
<button label="Gem som..." label_selected="Gem som..." name="Save As"/>
<button label="Annullér" label_selected="Annullér" name="Revert"/>
</panel>
- <panel label="Alpha" name="Alpha">
+ <panel label="Tatovering" name="Tattoo">
<text name="title">
[DESC]
</text>
@@ -488,27 +468,24 @@ og bagefter &apos;tage den på&apos;.
Placeret i [PATH]
</text>
<text name="not worn instructions">
- Brug en ny &quot;alpha mask&quot; ved at trække en fra din beholding til din avatar.
-Alternativt kan du lave en fra bunden og bære denne.
+ Vælg en ny tatovering ved at trække en fra din beholdning over på din avatar. Du kan også oprette en fra bunden og bagefter &apos;tage den på&apos;.
</text>
+ <button label="lav ny tatovering" label_selected="Lav ny tatovering" name="Create New"/>
<text name="no modify instructions">
Du har ikke rettigheder til at ændre denne.
</text>
<text name="Item Action Label">
- Alpha:
+ Tatovering:
</text>
- <texture_picker label="Alpha - nedre" name="Lower Alpha" tool_tip="Klik for at vælge et billede"/>
- <texture_picker label="Øvre alpha" name="Upper Alpha" tool_tip="Klik for at vælge et billede"/>
- <texture_picker label="Alpha - hoved" name="Head Alpha" tool_tip="Klik for at vælge et billede"/>
- <texture_picker label="Alpha - øjne" name="Eye Alpha" tool_tip="Klik for at vælge et billede"/>
- <texture_picker label="Alpha - hår" name="Hair Alpha" tool_tip="Klik for at vælge et billede"/>
- <button label="Lav ny &quot;Alpha&quot;" label_selected="Lav ny &quot;Alpha&quot;" name="Create New"/>
+ <texture_picker label="Tatovering - hovede" name="Head Tattoo" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Øvre tatovering" name="Upper Tattoo" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Nedre tatovering" name="Lower Tattoo" tool_tip="Klik for at vælge et billede"/>
<button label="Tag af" label_selected="Tag af" name="Take Off"/>
<button label="Gem" label_selected="Gem" name="Save"/>
<button label="Gem som..." label_selected="Gem som..." name="Save As"/>
<button label="Vend tilbage" label_selected="Vend tilbage" name="Revert"/>
</panel>
- <panel label="Tatovering" name="Tattoo">
+ <panel label="Alpha" name="Alpha">
<text name="title">
[DESC]
</text>
@@ -525,26 +502,28 @@ Alternativt kan du lave en fra bunden og bære denne.
Placeret i [PATH]
</text>
<text name="not worn instructions">
- Brug en ny tatovering ved at trække en fra din beholding til din avatar.
-Alternativt kan du lave en fra bunden og bære denne.
+ Vælg en ny &apos;alpha maske&apos; ved at trække en fra din beholdning over på din avatar. Du kan også oprette en fra bunden og bagefter &apos;tage den på&apos;.
</text>
+ <button label="Lav ny &quot;Alpha&quot;" label_selected="Lav ny &quot;Alpha&quot;" name="Create New"/>
<text name="no modify instructions">
Du har ikke rettigheder til at ændre denne.
</text>
<text name="Item Action Label">
- Tatovering:
+ Alpha:
</text>
- <texture_picker label="Tatovering - hovede" name="Head Tattoo" tool_tip="Klik for at vælge et billede"/>
- <texture_picker label="Øvre tatovering" name="Upper Tattoo" tool_tip="Klik for at vælge et billede"/>
- <texture_picker label="Nedre tatovering" name="Lower Tattoo" tool_tip="Klik for at vælge et billede"/>
- <button label="lav ny tatovering" label_selected="Lav ny tatovering" name="Create New"/>
+ <texture_picker label="Alpha - nedre" name="Lower Alpha" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Øvre alpha" name="Upper Alpha" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Alpha - hoved" name="Head Alpha" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Alpha - øjne" name="Eye Alpha" tool_tip="Klik for at vælge et billede"/>
+ <texture_picker label="Alpha - hår" name="Hair Alpha" tool_tip="Klik for at vælge et billede"/>
<button label="Tag af" label_selected="Tag af" name="Take Off"/>
<button label="Gem" label_selected="Gem" name="Save"/>
<button label="Gem som..." label_selected="Gem som..." name="Save As"/>
<button label="Vend tilbage" label_selected="Vend tilbage" name="Revert"/>
</panel>
</tab_container>
- <scroll_container left="212" name="panel_container"/>
+ <scroll_container name="panel_container"/>
+ <button label="Script info" label_selected="Script info" name="script_info" tool_tip="Vis scripts vedhæftet på din avatar"/>
<button label="Lav sæt" label_selected="Lav sæt" name="make_outfit_btn"/>
<button label="Annullér" label_selected="Annullér" name="Cancel"/>
<button label="OK" label_selected="OK" name="Ok"/>
diff --git a/indra/newview/skins/default/xui/da/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/da/floater_day_cycle_options.xml
index 94cf4546e3..ffae3d788f 100644
--- a/indra/newview/skins/default/xui/da/floater_day_cycle_options.xml
+++ b/indra/newview/skins/default/xui/da/floater_day_cycle_options.xml
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Day Cycle Floater" title="DAG CYKLUS OPSÆTNING">
<tab_container name="Day Cycle Tabs">
<panel label="Dag cyklus" name="Day Cycle">
- <button label="?" name="WLDayCycleHelp" />
- <multi_slider label="" name="WLTimeSlider" />
- <multi_slider label="" name="WLDayCycleKeys" />
+ <button label="?" name="WLDayCycleHelp"/>
+ <multi_slider label="" name="WLTimeSlider"/>
+ <multi_slider label="" name="WLDayCycleKeys"/>
<text name="WL12am">
00:00
</text>
@@ -59,39 +59,38 @@
<text name="WL12amHash2">
|
</text>
- <button label="Tilføj key" label_selected="Tilføj key" name="WLAddKey" />
- <button label="Slet key" label_selected="Slet key" name="WLDeleteKey" />
+ <button label="Tilføj key" label_selected="Tilføj key" name="WLAddKey"/>
+ <button label="Slet key" label_selected="Slet key" name="WLDeleteKey"/>
<text name="WLCurKeyFrameText">
Key-frame indstillinger:
</text>
<text name="WLCurKeyTimeText">
Key tid:
</text>
- <spinner label="Timer" name="WLCurKeyHour" />
- <spinner label="Min." name="WLCurKeyMin" />
+ <spinner label="Timer" name="WLCurKeyHour"/>
+ <spinner label="Min." name="WLCurKeyMin"/>
<text name="WLCurKeyTimeText2">
Key fast indstilling:
</text>
- <combo_box label="Faste" name="WLKeyPresets" />
+ <combo_box label="Faste" name="WLKeyPresets"/>
<text name="DayCycleText">
Snap:
</text>
- <combo_box label="5 min" name="WLSnapOptions" />
+ <combo_box label="5 min" name="WLSnapOptions"/>
<text name="DayCycleText2">
Cycluslængde:
</text>
- <spinner label="Timer" name="WLLengthOfDayHour" />
- <spinner label="Min." name="WLLengthOfDayMin" />
- <spinner label="Sek." name="WLLengthOfDaySec" />
+ <spinner label="Timer" name="WLLengthOfDayHour"/>
+ <spinner label="Min." name="WLLengthOfDayMin"/>
+ <spinner label="Sek." name="WLLengthOfDaySec"/>
<text name="DayCycleText3">
- Vis:
- </text>
- <button label="Afspil" label_selected="Afspil" name="WLAnimSky" />
- <button label="Stop!" label_selected="Stop" name="WLStopAnimSky" />
- <button label="Benyt estate tid" label_selected="GÃ¥ til estate tid"
- name="WLUseLindenTime" />
- <button label="Gem test-dag" label_selected="Gem test-dag" name="WLSaveDayCycle" />
- <button label="Hent test-dag" label_selected="Hent test-dag" name="WLLoadDayCycle" />
+ Vis :
+ </text>
+ <button label="Afspil" label_selected="Afspil" name="WLAnimSky"/>
+ <button label="Stop!" label_selected="Stop" name="WLStopAnimSky"/>
+ <button label="Benyt estate tid" label_selected="GÃ¥ til estate tid" name="WLUseLindenTime"/>
+ <button label="Gem test-dag" label_selected="Gem test-dag" name="WLSaveDayCycle"/>
+ <button label="Hent test-dag" label_selected="Hent test-dag" name="WLLoadDayCycle"/>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_event.xml b/indra/newview/skins/default/xui/da/floater_event.xml
new file mode 100644
index 0000000000..1816144b45
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_event.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="Event" name="Event" title="EVENT DETALJER">
+ <floater.string name="none">
+ ingen
+ </floater.string>
+ <floater.string name="notify">
+ Meddel
+ </floater.string>
+ <floater.string name="dont_notify">
+ Meddel ikke
+ </floater.string>
+ <floater.string name="moderate">
+ Moderat
+ </floater.string>
+ <floater.string name="adult">
+ Voksent
+ </floater.string>
+ <floater.string name="general">
+ Generelt
+ </floater.string>
+ <floater.string name="unknown">
+ Ukendt
+ </floater.string>
+ <layout_stack name="layout">
+ <layout_panel name="profile_stack">
+ <text name="event_name">
+ Event uden navn.
+ </text>
+ <text name="event_category">
+ (ingen kategori)
+ </text>
+ <text name="event_runby_label">
+ Afholdt af:
+ </text>
+ <text initial_value="(henter)" name="event_runby"/>
+ <text name="event_date_label">
+ Dato:
+ </text>
+ <text name="event_date">
+ 10/10/2010
+ </text>
+ <text name="event_duration_label">
+ Varighed:
+ </text>
+ <text name="event_duration">
+ 1 time
+ </text>
+ <text name="event_covercharge_label">
+ Pris:
+ </text>
+ <text name="event_cover">
+ Gratis
+ </text>
+ <text name="event_location_label">
+ Lokation:
+ </text>
+ <text name="event_location" value="SampleParcel, Name Long (145, 228, 26)"/>
+ <text name="rating_label" value="Rating:"/>
+ <text name="rating_value" value="ukendt"/>
+ <expandable_text name="event_desc">
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ </expandable_text>
+ </layout_panel>
+ <layout_panel name="button_panel">
+ <button name="create_event_btn" tool_tip="Opret event"/>
+ <button name="god_delete_event_btn" tool_tip="Slet event"/>
+ <button label="Giv besked" name="notify_btn"/>
+ <button label="Teleport" name="teleport_btn"/>
+ <button label="Kort" name="map_btn"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_god_tools.xml b/indra/newview/skins/default/xui/da/floater_god_tools.xml
new file mode 100644
index 0000000000..5d3453e327
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_god_tools.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="godtools floater" title="GOD TOOLS">
+ <tab_container name="GodTools Tabs">
+ <panel label="Grid" name="grid"/>
+ <panel label="Region" name="region">
+ <text name="Region Name:">
+ Region Name:
+ </text>
+ <check_box label="Reset Home On Teleport" name="check reset home" tool_tip="Når beboere teleporterer væk, så sæt deres hjemmeadresse til deres destinations position."/>
+ </panel>
+ <panel label="Objects" name="objects">
+ <text name="Region Name:">
+ Region navn:
+ </text>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_help_browser.xml b/indra/newview/skins/default/xui/da/floater_help_browser.xml
index fc52796344..4eba4aee1f 100644
--- a/indra/newview/skins/default/xui/da/floater_help_browser.xml
+++ b/indra/newview/skins/default/xui/da/floater_help_browser.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_help_browser" title="HJÆLP">
+ <floater.string name="loading_text">
+ Henter...
+ </floater.string>
<layout_stack name="stack1">
- <layout_panel name="external_controls">
- <button label="Ã…ben i min web browser" name="open_browser"/>
- </layout_panel>
+ <layout_panel name="external_controls"/>
</layout_stack>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_im.xml b/indra/newview/skins/default/xui/da/floater_im.xml
index 519a70d1d9..776bc9ab13 100644
--- a/indra/newview/skins/default/xui/da/floater_im.xml
+++ b/indra/newview/skins/default/xui/da/floater_im.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<multi_floater name="im_floater" title="Personlig samtale (IM)">
<string name="only_user_message">
- Du er den eneste deltager i denne samtale
+ Du er den eneste beboer i denne session.
</string>
<string name="offline_message">
[FIRST] [LAST] er ikke logget på.
@@ -10,7 +10,7 @@
Tryk på [BUTTON NAME] knappen for at acceptére/tilslutte til denne stemme chat.
</string>
<string name="muted_message">
- Du har blokeret denne beboer. Hvis du sender besked vil denne blokering fjernes.
+ Du har blokeret denne beboer. Hvis du sender en besked til beboeren vil dette automatisk medføre fjernelse af blokeringen
</string>
<string name="generic_request_error">
Kunne ikke etablere forbindelse, prøv igen senere
@@ -31,7 +31,7 @@
Du er blevet &quot;blokeret&quot;.
</string>
<string name="add_session_event">
- Ikke muligt at tilføge brugere til samtale med [RECIPIENT].
+ Kunne ikke tilføje beboere til chat session med [RECIPIENT].
</string>
<string name="message_session_event">
Ikke muligt at sende din besked til samtalen med [RECIPIENT].
diff --git a/indra/newview/skins/default/xui/da/floater_im_container.xml b/indra/newview/skins/default/xui/da/floater_im_container.xml
index da6f877f56..28b2f7f7eb 100644
--- a/indra/newview/skins/default/xui/da/floater_im_container.xml
+++ b/indra/newview/skins/default/xui/da/floater_im_container.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<multi_floater name="floater_im_box" title="Personlige beskeder"/>
+<multi_floater name="floater_im_box" title="SAMTALER"/>
diff --git a/indra/newview/skins/default/xui/da/floater_image_preview.xml b/indra/newview/skins/default/xui/da/floater_image_preview.xml
index 52fd9f80c0..5355127ef5 100644
--- a/indra/newview/skins/default/xui/da/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/da/floater_image_preview.xml
@@ -10,16 +10,16 @@
Se billede som:
</text>
<combo_box label="Tøj type" name="clothing_type_combo">
- <combo_box.item label="Billede" name="Image"/>
- <combo_box.item label="HÃ¥r" name="Hair"/>
- <combo_box.item label="Kvinde - hoved" name="FemaleHead"/>
- <combo_box.item label="Kvinde - overkrop" name="FemaleUpperBody"/>
- <combo_box.item label="Kvinde - underkrop" name="FemaleLowerBody"/>
- <combo_box.item label="Mand - hoved" name="MaleHead"/>
- <combo_box.item label="Mand - overkrop" name="MaleUpperBody"/>
- <combo_box.item label="Mand - underkrop" name="MaleLowerBody"/>
- <combo_box.item label="Nederdel" name="Skirt"/>
- <combo_box.item label="Sculpted Prim" name="SculptedPrim"/>
+ <item label="Billede" name="Image" value="Billede"/>
+ <item label="HÃ¥r" name="Hair" value="HÃ¥r"/>
+ <item label="Kvinde - hoved" name="FemaleHead" value="Hoved - kvinde"/>
+ <item label="Kvinde - overkrop" name="FemaleUpperBody" value="Overkrop - kvinde"/>
+ <item label="Kvinde - underkrop" name="FemaleLowerBody" value="Underkrop - kvinde"/>
+ <item label="Mand - hoved" name="MaleHead" value="Hoved - mand"/>
+ <item label="Mand - overkrop" name="MaleUpperBody" value="Overkrop - mand"/>
+ <item label="Mand - underkrop" name="MaleLowerBody" value="Underkrop - mand"/>
+ <item label="Nederdel" name="Skirt" value="Nederdel"/>
+ <item label="Sculpted Prim" name="SculptedPrim" value="Sculpted prim"/>
</combo_box>
<text name="bad_image_text">
Kunne ikke læse billede.
diff --git a/indra/newview/skins/default/xui/da/floater_incoming_call.xml b/indra/newview/skins/default/xui/da/floater_incoming_call.xml
index 3a1ef2e47d..2349174db2 100644
--- a/indra/newview/skins/default/xui/da/floater_incoming_call.xml
+++ b/indra/newview/skins/default/xui/da/floater_incoming_call.xml
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="incoming call" title="UKENDT PERSON KALDER OP">
+ <floater.string name="lifetime">
+ 5
+ </floater.string>
<floater.string name="localchat">
Stemme chat nærved
</floater.string>
@@ -12,6 +15,9 @@
<floater.string name="VoiceInviteAdHoc">
har sluttet sig til stemme chat opkald med en konference chat.
</floater.string>
+ <floater.string name="VoiceInviteGroup">
+ deltager nu i Stemme chat opkald med denne gruppe [GROUP].
+ </floater.string>
<text name="question">
Ønsker du at forlade [CURRENT_CHAT] og slutte dig til denne stemme chat?
</text>
diff --git a/indra/newview/skins/default/xui/da/floater_inventory.xml b/indra/newview/skins/default/xui/da/floater_inventory.xml
index d80051fb84..3a4b0fbd6b 100644
--- a/indra/newview/skins/default/xui/da/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/da/floater_inventory.xml
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Inventory" title="BEHOLDNING">
+<floater name="Inventory" title="MIN BEHOLDNING">
<floater.string name="Title">
- Beholdning
+ MIN BEHOLDNING
</floater.string>
<floater.string name="TitleFetching">
- Beholdning (henter [ITEM_COUNT] genstande...) [FILTER]
+ MIN BEHOLDNING (Henter [ITEM_COUNT] genstande...) [FILTER]
</floater.string>
<floater.string name="TitleCompleted">
- Beholdning ([ITEM_COUNT] genstande) [FILTER]
+ MIN BEHOLDNING ([ITEM_COUNT] genstande) [FILTER]
</floater.string>
<floater.string name="Fetched">
Hentet
diff --git a/indra/newview/skins/default/xui/da/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/da/floater_live_lsleditor.xml
index 4079ff9f38..0cc13fd736 100644
--- a/indra/newview/skins/default/xui/da/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/da/floater_live_lsleditor.xml
@@ -7,7 +7,7 @@
Kører
</floater.string>
<floater.string name="Title">
- Script: [NAME]
+ SCRIPT: [NAME]
</floater.string>
<button label="Nulstil" label_selected="Reset" name="Reset"/>
<check_box initial_value="true" label="Kører" name="running"/>
diff --git a/indra/newview/skins/default/xui/da/floater_lsl_guide.xml b/indra/newview/skins/default/xui/da/floater_lsl_guide.xml
index 2b008f133c..2594d6bb9d 100644
--- a/indra/newview/skins/default/xui/da/floater_lsl_guide.xml
+++ b/indra/newview/skins/default/xui/da/floater_lsl_guide.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script ed float" title="LSL WIKI">
+<floater name="script ed float" title="LSL REFERENCE">
<check_box label="Følg markøreren" name="lock_check"/>
<combo_box label="LÃ¥s" left_delta="114" name="history_combo" width="70"/>
<button label="Tilbage" name="back_btn"/>
diff --git a/indra/newview/skins/default/xui/da/floater_map.xml b/indra/newview/skins/default/xui/da/floater_map.xml
index f618548908..cd6c03058b 100644
--- a/indra/newview/skins/default/xui/da/floater_map.xml
+++ b/indra/newview/skins/default/xui/da/floater_map.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Map">
+<floater name="Map" title="">
<floater.string name="mini_map_north">
N
</floater.string>
diff --git a/indra/newview/skins/default/xui/da/floater_media_browser.xml b/indra/newview/skins/default/xui/da/floater_media_browser.xml
index 47667973ba..d3028c32f9 100644
--- a/indra/newview/skins/default/xui/da/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/da/floater_media_browser.xml
@@ -1,19 +1,19 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_about" title="MEDIE VÆLGER">
<layout_stack name="stack1">
<layout_panel name="nav_controls">
- <button label="Tilbage" name="back" />
- <button label="Frem" name="forward" />
- <button label="Opdater" name="reload" />
- <button label="GÃ¥ til" name="go" />
+ <button label="Tilbage" name="back"/>
+ <button label="Frem" name="forward"/>
+ <button label="Opdater" name="reload"/>
+ <button label="GÃ¥ til" name="go"/>
</layout_panel>
<layout_panel name="parcel_owner_controls">
- <button label="Send nuværende URL til parcel" name="assign" />
+ <button label="Send denne side til parcel" name="assign"/>
</layout_panel>
<layout_panel name="external_controls">
- <button label="Ã…ben i min browser" name="open_browser" />
- <check_box label="Ã…ben altid i min browser" name="open_always" />
- <button label="Luk" name="close" />
+ <button label="Ã…ben i min browser" name="open_browser"/>
+ <check_box label="Ã…ben altid i min browser" name="open_always"/>
+ <button label="Luk" name="close"/>
</layout_panel>
</layout_stack>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_moveview.xml b/indra/newview/skins/default/xui/da/floater_moveview.xml
index b00dc6bf4d..14d3604b43 100644
--- a/indra/newview/skins/default/xui/da/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/da/floater_moveview.xml
@@ -6,24 +6,64 @@
<string name="walk_back_tooltip">
Gå baglæns (Tryk på Ned piletast eller S)
</string>
+ <string name="walk_left_tooltip">
+ GÃ¥ til venstre (tryk Shift + venstre pil eller A)
+ </string>
+ <string name="walk_right_tooltip">
+ Gå til højre (tryk Shift + højre pil eller D)
+ </string>
<string name="run_forward_tooltip">
Løb forlæns (Tryk på Op piletast eller W)
</string>
<string name="run_back_tooltip">
Løb baglæns (Tryk på Ned piletast eller S)
</string>
+ <string name="run_left_tooltip">
+ Løb til venstre (tryk Shift + venstre pil eller A)
+ </string>
+ <string name="run_right_tooltip">
+ Løb til højre (tryk Shift + højre pil eller D)
+ </string>
<string name="fly_forward_tooltip">
Flyv frem (Tryk på Op piletast eller W)
</string>
<string name="fly_back_tooltip">
Flyv baglæns (Tryk på Ned piletast eller S)
</string>
+ <string name="fly_left_tooltip">
+ Flyv til venstre (tryk Shift + venstre pil eller A)
+ </string>
+ <string name="fly_right_tooltip">
+ Flyv til højre (tryk Shift + højre pil eller D)
+ </string>
+ <string name="fly_up_tooltip">
+ Flyv op (tryk E)
+ </string>
+ <string name="fly_down_tooltip">
+ Flyv ned (tryk C)
+ </string>
+ <string name="jump_tooltip">
+ Hop (tryk E)
+ </string>
+ <string name="crouch_tooltip">
+ Kryb (tryk C)
+ </string>
+ <string name="walk_title">
+ GÃ¥
+ </string>
+ <string name="run_title">
+ Løb
+ </string>
+ <string name="fly_title">
+ Flyv
+ </string>
<panel name="panel_actions">
- <button label="" label_selected="" name="turn left btn" tool_tip="xxx
- Drej til venstre (Tryk på venstre piletast eller A)"/>
+ <button label="" label_selected="" name="move up btn" tool_tip="Flyv op (tryk E)"/>
+ <button label="" label_selected="" name="turn left btn" tool_tip="xxx Drej til venstre (Tryk på venstre piletast eller A)"/>
+ <joystick_slide name="move left btn" tool_tip="GÃ¥ til venstre (tryk Shift + venstre pil eller A)"/>
+ <button label="" label_selected="" name="move down btn" tool_tip="Flyv ned (tryk C)"/>
<button label="" label_selected="" name="turn right btn" tool_tip="Drej til højre (Tryk på højre piletast eller D)"/>
- <button label="" label_selected="" name="move up btn" tool_tip="Flyv op, Tryk på &quot;E&quot;"/>
- <button label="" label_selected="" name="move down btn" tool_tip="Flyv ned, Tryk på &quot;C&quot;"/>
+ <joystick_slide name="move right btn" tool_tip="Gå til højre (tryk Shift + højre pil eller D)"/>
<joystick_turn name="forward btn" tool_tip="Gå frem (Tryk på Op piletast eller W)"/>
<joystick_turn name="backward btn" tool_tip="Gå tilbage (Tryk på Ned piletast eller S)"/>
</panel>
@@ -31,6 +71,5 @@
<button label="" name="mode_walk_btn" tool_tip="GÃ¥ tilstand"/>
<button label="" name="mode_run_btn" tool_tip="Løbe tilstand"/>
<button label="" name="mode_fly_btn" tool_tip="Flyve tilstand"/>
- <button label="Stop flyvning" name="stop_fly_btn" tool_tip="Stop flyvning"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/da/floater_outfit_save_as.xml
new file mode 100644
index 0000000000..0bcb96b151
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_outfit_save_as.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container" title="Gem sæt">
+ <button label="Gem" label_selected="Gem" name="Save"/>
+ <button label="Annullér" label_selected="Annullér" name="Cancel"/>
+ <text name="Save item as:">
+ Gem hvad jeg har på som et nyt sæt:
+ </text>
+ <line_editor name="name ed">
+ [DESC] (ny)
+ </line_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_outgoing_call.xml b/indra/newview/skins/default/xui/da/floater_outgoing_call.xml
index 5c98d9855f..a5545668a2 100644
--- a/indra/newview/skins/default/xui/da/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/da/floater_outgoing_call.xml
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="outgoing call" title="KALDER">
+ <floater.string name="lifetime">
+ 5
+ </floater.string>
<floater.string name="localchat">
Stemme chat nærved
</floater.string>
@@ -21,6 +24,15 @@
<text name="noanswer">
Intet svar. Prøv igen senere.
</text>
+ <text name="nearby">
+ Du er blevet koblet af fra [VOICE_CHANNEL_NAME]. [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_other">
+ Dit kald er afsluttet. [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_agent">
+ Du har afsluttet opkaldet. [RECONNECT_NEARBY]
+ </text>
<text name="leaving">
Forlader [CURRENT_CHAT].
</text>
diff --git a/indra/newview/skins/default/xui/da/floater_pay_object.xml b/indra/newview/skins/default/xui/da/floater_pay_object.xml
index f74e097da2..368d678681 100644
--- a/indra/newview/skins/default/xui/da/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/da/floater_pay_object.xml
@@ -15,7 +15,7 @@
</text>
<icon name="icon_object" tool_tip="Objekter"/>
<text name="object_name_text">
- ...
+ Mit fantastiske objekt med et virkeligt langt navn
</text>
<button label="L$1" label_selected="L$1" name="fastpay 1"/>
<button label="L$5" label_selected="L$5" name="fastpay 5"/>
diff --git a/indra/newview/skins/default/xui/da/floater_preferences.xml b/indra/newview/skins/default/xui/da/floater_preferences.xml
index f0fe3472d0..a53586eaaf 100644
--- a/indra/newview/skins/default/xui/da/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/da/floater_preferences.xml
@@ -6,7 +6,7 @@
<panel label="Generelt" name="general"/>
<panel label="Grafik" name="display"/>
<panel label="Privatliv" name="im"/>
- <panel label="Sound" name="audio"/>
+ <panel label="Lyd &amp; medier" name="audio"/>
<panel label="Chat" name="chat"/>
<panel label="Beskeder" name="msgs"/>
<panel label="Opsætning" name="input"/>
diff --git a/indra/newview/skins/default/xui/da/floater_preview_gesture.xml b/indra/newview/skins/default/xui/da/floater_preview_gesture.xml
index bfa3c150a9..f49fd8c99a 100644
--- a/indra/newview/skins/default/xui/da/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/da/floater_preview_gesture.xml
@@ -24,6 +24,9 @@
<floater.string name="Title">
Bevægelse: [NAME]
</floater.string>
+ <text name="name_text">
+ Navn:
+ </text>
<text name="desc_label">
Beskrivelse:
</text>
diff --git a/indra/newview/skins/default/xui/da/floater_preview_notecard.xml b/indra/newview/skins/default/xui/da/floater_preview_notecard.xml
index 2ebec4462f..5a0f5a32c0 100644
--- a/indra/newview/skins/default/xui/da/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/da/floater_preview_notecard.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview notecard" title="NOTE:">
<floater.string name="no_object">
- Kunne ikke finde objekt der indeholder denne note.
+ Kunne ikke finde objekt som indeholder denne note.
</floater.string>
<floater.string name="not_allowed">
Du har ikke rettigheder til at se denne note.
@@ -9,9 +9,6 @@
<floater.string name="Title">
Note: [NAME]
</floater.string>
- <floater.string label="Gem" label_selected="Gem" name="Save">
- Gem
- </floater.string>
<text name="desc txt">
Beskrivelse:
</text>
@@ -19,4 +16,5 @@
Indlæser...
</text_editor>
<button label="Gem" label_selected="Gem" name="Save"/>
+ <button label="Slet" label_selected="Slet" name="Delete"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_preview_texture.xml b/indra/newview/skins/default/xui/da/floater_preview_texture.xml
index ab7ddbcc72..48cf53f563 100644
--- a/indra/newview/skins/default/xui/da/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/da/floater_preview_texture.xml
@@ -12,6 +12,9 @@
<text name="dimensions">
[WIDTH]px x [HEIGHT]px
</text>
+ <text name="aspect_ratio">
+ Vis aspekt forhold
+ </text>
<combo_box name="combo_aspect_ratio" tool_tip="Forhåndsvisning med et bestemt billedformat">
<combo_item name="Unconstrained">
Ikke låst
@@ -38,7 +41,7 @@
2:1
</combo_item>
</combo_box>
- <button label="OK" name="keep"/>
- <button label="Annullér" name="discard"/>
+ <button label="OK" name="Keep"/>
+ <button label="Kassér" name="Discard"/>
<button label="Gem som" name="save_tex_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_publish_classified.xml b/indra/newview/skins/default/xui/da/floater_publish_classified.xml
new file mode 100644
index 0000000000..220042f015
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_publish_classified.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="publish_classified" title="Publicerer annoncer">
+ <text name="explanation_text">
+ Din annonce vil blive vist i en uge fra den dato den publiceres.
+
+Husk, annonceomkostninger kan ikke refunderes.
+ </text>
+ <spinner label="Pris for annonce:" name="price_for_listing" tool_tip="Pris for optagelse af annonce." value="50"/>
+ <text name="l$_text" value="L$"/>
+ <text name="more_info_text">
+ Mere info (link til hjælp om annoncer)
+ </text>
+ <button label="Publicér" name="publish_btn"/>
+ <button label="Annullér" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_report_abuse.xml b/indra/newview/skins/default/xui/da/floater_report_abuse.xml
index 9ef17a3cbb..07978792b9 100644
--- a/indra/newview/skins/default/xui/da/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/da/floater_report_abuse.xml
@@ -42,7 +42,7 @@
<combo_box.item label="Vælg kategori" name="Select_category"/>
<combo_box.item label="Alder &gt; Falsk alder" name="Age__Age_play"/>
<combo_box.item label="Alder &gt; Voksen beboer på Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/>
- <combo_box.item label="Alder &gt; Mindreårig beboer udenfor Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
+ <combo_box.item label="Alder &gt; Mindreårig beboer uden for Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
<combo_box.item label="Overfald &gt; Kamp sandkasse / Usikkert område" name="Assault__Combat_sandbox___unsafe_area"/>
<combo_box.item label="Overfald &gt; Sikkert område" name="Assault__Safe_area"/>
<combo_box.item label="Overfald &gt; Sandkasse til våbentest" name="Assault__Weapons_testing_sandbox"/>
diff --git a/indra/newview/skins/default/xui/da/floater_script_limits.xml b/indra/newview/skins/default/xui/da/floater_script_limits.xml
new file mode 100644
index 0000000000..a7f86a782a
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_script_limits.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="scriptlimits" title="SCRIPT INFORMATION"/>
diff --git a/indra/newview/skins/default/xui/da/floater_script_preview.xml b/indra/newview/skins/default/xui/da/floater_script_preview.xml
index 1e8d869716..1aacab6915 100644
--- a/indra/newview/skins/default/xui/da/floater_script_preview.xml
+++ b/indra/newview/skins/default/xui/da/floater_script_preview.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview lsl text" title="SCRIPT: ROTATIONS SCRIPT">
<floater.string name="Title">
- Script: [NAME]
+ SCRIPT: [NAME]
</floater.string>
<text name="desc txt">
Beskrivelse:
diff --git a/indra/newview/skins/default/xui/da/floater_select_key.xml b/indra/newview/skins/default/xui/da/floater_select_key.xml
index fe0d31c6c3..9f7aad5e03 100644
--- a/indra/newview/skins/default/xui/da/floater_select_key.xml
+++ b/indra/newview/skins/default/xui/da/floater_select_key.xml
@@ -2,6 +2,6 @@
<floater name="modal container" title="">
<button label="Annullér" label_selected="Annullér" name="Cancel"/>
<text name="Save item as:">
- Tryk på en taste for at sætte din &quot;Tale&quot; knap udløser.
+ Tryk en taste for at angive trigger til at tale.
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_settings_debug.xml b/indra/newview/skins/default/xui/da/floater_settings_debug.xml
index 41cf100d94..016e5af378 100644
--- a/indra/newview/skins/default/xui/da/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/da/floater_settings_debug.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="settings_debug" title="DEBUG INDSTILLINGER">
- <combo_box name="boolean_combo">
- <combo_box.item label="SANDT" name="TRUE"/>
- <combo_box.item label="FALSK" name="FALSE"/>
- </combo_box>
+ <radio_group name="boolean_combo">
+ <radio_item label="SANDT" name="TRUE" value="sand"/>
+ <radio_item label="FALSK" name="FALSE" value=""/>
+ </radio_group>
<color_swatch label="Farve" name="val_color_swatch"/>
<spinner label="x" name="val_spinner_1"/>
<spinner label="x" name="val_spinner_2"/>
diff --git a/indra/newview/skins/default/xui/da/floater_snapshot.xml b/indra/newview/skins/default/xui/da/floater_snapshot.xml
index 5e8c64e21f..7f7fb8ddf0 100644
--- a/indra/newview/skins/default/xui/da/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/da/floater_snapshot.xml
@@ -1,79 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Snapshot" title="FOTO FORHÃ…NDSVINSNING">
- <text name="type_label">
- Hvor skal foto hen?
- </text>
- <radio_group label="Snapshot type" name="snapshot_type_radio">
- <radio_item label="Send via e-mail" name="postcard"/>
- <radio_item label="Gem i din beholdning (L$[AMOUNT])" name="texture"/>
- <radio_item label="Gem på din computer" name="local"/>
- </radio_group>
- <text name="file_size_label">
- Fil størrelse: [SIZE] KB
- </text>
- <button label="Tag nyt foto" name="new_snapshot_btn"/>
- <button label="Send" name="send_btn"/>
- <button label="Gem (L$[AMOUNT])" name="upload_btn"/>
- <flyout_button label="Gem" name="save_btn" tool_tip="Gem billede i på din computer">
- <flyout_button_item label="Gem" name="save_item"/>
- <flyout_button_item label="Gem som..." name="saveas_item"/>
- </flyout_button>
- <button label="Annullér" name="discard_btn"/>
- <button label="Mere &gt;&gt;" name="more_btn" tool_tip="Avancerede muligheder"/>
- <button label="&lt;&lt; Mindre" name="less_btn" tool_tip="Avancerede muligheder"/>
- <text name="type_label2">
- Størrelse
- </text>
- <text name="format_label">
- Format
- </text>
- <combo_box label="Opløsning" name="postcard_size_combo">
- <combo_box.item label="Aktuelle vindue" name="CurrentWindow"/>
- <combo_box.item label="640x480" name="640x480"/>
- <combo_box.item label="800x600" name="800x600"/>
- <combo_box.item label="1024x768" name="1024x768"/>
- <combo_box.item label="Manuel" name="Custom"/>
- </combo_box>
- <combo_box label="Opløsning" name="texture_size_combo">
- <combo_box.item label="Aktuelle vindue" name="CurrentWindow"/>
- <combo_box.item label="Lille (128x128)" name="Small(128x128)"/>
- <combo_box.item label="Medium (256x256)" name="Medium(256x256)"/>
- <combo_box.item label="Stor (512x512)" name="Large(512x512)"/>
- <combo_box.item label="Manuel" name="Custom"/>
- </combo_box>
- <combo_box label="Opløsning" name="local_size_combo">
- <combo_box.item label="Aktuelle vindue" name="CurrentWindow"/>
- <combo_box.item label="320x240" name="320x240"/>
- <combo_box.item label="640x480" name="640x480"/>
- <combo_box.item label="800x600" name="800x600"/>
- <combo_box.item label="1024x768" name="1024x768"/>
- <combo_box.item label="1280x1024" name="1280x1024"/>
- <combo_box.item label="1600x1200" name="1600x1200"/>
- <combo_box.item label="Manuelt" name="Custom"/>
- </combo_box>
- <combo_box label="Fil-format" name="local_format_combo" width="76">
- <combo_box.item label="PNG" name="PNG"/>
- <combo_box.item label="JPEG" name="JPEG"/>
- <combo_box.item label="BMP" name="BMP"/>
- </combo_box>
- <spinner label="Bredde" label_width="41" name="snapshot_width" width="101"/>
- <spinner label="Højde" label_width="32" left="117" name="snapshot_height" width="92"/>
- <check_box label="Fasthold proportioner" name="keep_aspect_check"/>
- <slider label="Billed-kvalitet" name="image_quality_slider"/>
- <text name="layer_type_label">
- Benyt:
- </text>
- <combo_box label="Billedlag" name="layer_types">
- <combo_box.item label="Farver" name="Colors"/>
- <combo_box.item label="Dybde" name="Depth"/>
- <combo_box.item label="Materinger" name="ObjectMattes"/>
- </combo_box>
- <check_box label="Vis brugerflade på foto" name="ui_check"/>
- <check_box label="Vis HUD objekter på foto" name="hud_check"/>
- <check_box label="Luk ikke vindue ved gemning" name="keep_open_check"/>
- <check_box label="Frys billede og vis" name="freeze_frame_check"/>
- <check_box label="Auto-opdater" name="auto_snapshot_check"/>
- <string name="unknown">
+<floater name="Snapshot" title="Foto">
+ <floater.string name="unknown">
ukendt
- </string>
+ </floater.string>
+ <button label="Tag nyt foto" name="new_snapshot_btn"/>
+ <line_editor label="Beskrivelse" name="description"/>
+ <button label="Del foto" name="share"/>
+ <button label="Del på internettet" name="share_to_web"/>
+ <button label="Gem til beholdning" name="save_to_inventory"/>
+ <button label="Gem foto" name="save"/>
+ <button label="Email foto" name="share_to_email"/>
+ <button label="Gem på computer" name="save_to_computer"/>
+ <button label="Sæt som profil billede" name="set_profile_pic"/>
+ <button label="Tilbage" name="cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_sys_well.xml b/indra/newview/skins/default/xui/da/floater_sys_well.xml
index b5cecf93e9..f203c2504f 100644
--- a/indra/newview/skins/default/xui/da/floater_sys_well.xml
+++ b/indra/newview/skins/default/xui/da/floater_sys_well.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="sys_well_window" title="BESKEDER">
<string name="title_im_well_window">
- IM SESSIONER
+ SAMTALER
</string>
<string name="title_notification_well_window">
BESKEDER
diff --git a/indra/newview/skins/default/xui/da/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/da/floater_texture_ctrl.xml
index 00b49a9df9..fbc7fe2319 100644
--- a/indra/newview/skins/default/xui/da/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/da/floater_texture_ctrl.xml
@@ -17,7 +17,7 @@
<check_box label="Benyt ny" name="apply_immediate_check"/>
<button label="" label_selected="" name="Pipette"/>
<button label="Annullér" label_selected="Annullér" name="Cancel"/>
- <button label="Ok" label_selected="Ok" name="Select"/>
+ <button label="OK" label_selected="OK" name="Select"/>
<string name="pick title">
Vælg:
</string>
diff --git a/indra/newview/skins/default/xui/da/floater_tools.xml b/indra/newview/skins/default/xui/da/floater_tools.xml
index 77459aca67..a84af9adc0 100644
--- a/indra/newview/skins/default/xui/da/floater_tools.xml
+++ b/indra/newview/skins/default/xui/da/floater_tools.xml
@@ -63,11 +63,14 @@
<radio_item label="Stræk (Ctrl+Shift)" name="radio stretch"/>
<radio_item label="Vælg overflade" name="radio select face"/>
</radio_group>
- <check_box label="Redigér sammenlænkede dele" name="checkbox edit linked parts"/>
+ <check_box label="Redigér lænkede" name="checkbox edit linked parts"/>
<text name="RenderingCost" tool_tip="Hvis beregnede rendering omkostninger for dette objekt">
þ: [COUNT]
</text>
- <check_box label="Stræk begge sider" name="checkbox uniform"/>
+ <check_box label="" name="checkbox uniform"/>
+ <text label="Stræk begge sider" name="checkbox uniform label">
+ Stræk begge sider
+ </text>
<check_box initial_value="true" label="Stræk teksturer" name="checkbox stretch textures"/>
<check_box initial_value="true" label="Benyt gitter" name="checkbox snap to grid"/>
<combo_box name="combobox grid mode" tool_tip="Vælg hvilken type lineal der skal bruges til positionering af objekt">
@@ -184,12 +187,12 @@
Klik for at:
</text>
<combo_box name="clickaction">
- <combo_box.item label="Rør (Standard)" name="Touch/grab(default)"/>
- <combo_box.item label="Sid på objekt" name="Sitonobject"/>
- <combo_box.item label="Køb objekt" name="Buyobject"/>
- <combo_box.item label="Betal objekt" name="Payobject"/>
- <combo_box.item label="Ã…ben" name="Open"/>
- <combo_box.item label="Zoom" name="Zoom"/>
+ <combo_box.item label="Røre (Standard)" name="Touch/grab(default)"/>
+ <combo_box.item label="Sidde på objekt" name="Sitonobject"/>
+ <combo_box.item label="Købe objekt" name="Buyobject"/>
+ <combo_box.item label="Betale objekt" name="Payobject"/>
+ <combo_box.item label="Ã…bne" name="Open"/>
+ <combo_box.item label="Zoome" name="Zoom"/>
</combo_box>
<check_box label="Til salg:" name="checkbox for sale"/>
<combo_box name="sale type">
@@ -206,14 +209,14 @@
<text name="Anyone can:">
Enhver:
</text>
- <check_box label="Flyt" name="checkbox allow everyone move"/>
- <check_box label="Kopi" name="checkbox allow everyone copy"/>
+ <check_box label="Flytte" name="checkbox allow everyone move"/>
+ <check_box label="Kopiere" name="checkbox allow everyone copy"/>
<text name="Next owner can:">
Næste ejer:
</text>
<check_box label="Redigére" name="checkbox next owner can modify"/>
- <check_box label="Kopiére" left_delta="80" name="checkbox next owner can copy"/>
- <check_box label="Sælge/give væk" left_delta="67" name="checkbox next owner can transfer" tool_tip="Næste ejer kan give væk eller sælge dette objekt"/>
+ <check_box label="Kopiére" name="checkbox next owner can copy"/>
+ <check_box label="Sælge/give væk" name="checkbox next owner can transfer" tool_tip="Næste ejer kan give væk eller sælge dette objekt"/>
<text name="B:">
B:
</text>
@@ -417,21 +420,21 @@
<combo_box.item label="Ingen" name="None"/>
<combo_box.item label="Lysintensitet" name="Brightness"/>
<combo_box.item label="Mørke" name="Darkness"/>
- <combo_box.item label="træårer" name="woodgrain"/>
- <combo_box.item label="bark" name="bark"/>
- <combo_box.item label="mursten" name="bricks"/>
- <combo_box.item label="tern" name="checker"/>
- <combo_box.item label="beton" name="concrete"/>
- <combo_box.item label="rustik flise" name="crustytile"/>
+ <combo_box.item label="Træårer" name="woodgrain"/>
+ <combo_box.item label="Bark" name="bark"/>
+ <combo_box.item label="Mursten" name="bricks"/>
+ <combo_box.item label="Tern" name="checker"/>
+ <combo_box.item label="Beton" name="concrete"/>
+ <combo_box.item label="Rustik flise" name="crustytile"/>
<combo_box.item label="Skåret sten" name="cutstone"/>
- <combo_box.item label="plader" name="discs"/>
- <combo_box.item label="grus" name="gravel"/>
- <combo_box.item label="petriskål" name="petridish"/>
- <combo_box.item label="udvendig beklædning" name="siding"/>
- <combo_box.item label="stenflise" name="stonetile"/>
- <combo_box.item label="puds" name="stucco"/>
- <combo_box.item label="rør" name="suction"/>
- <combo_box.item label="væv" name="weave"/>
+ <combo_box.item label="Plader" name="discs"/>
+ <combo_box.item label="Grus" name="gravel"/>
+ <combo_box.item label="Petriskål" name="petridish"/>
+ <combo_box.item label="Udvendig beklædning" name="siding"/>
+ <combo_box.item label="Stenflise" name="stonetile"/>
+ <combo_box.item label="Puds" name="stucco"/>
+ <combo_box.item label="Rør" name="suction"/>
+ <combo_box.item label="Væv" name="weave"/>
</combo_box>
<text name="tex scale">
Gentagelser på overflade
@@ -440,8 +443,6 @@
<check_box label="Vend" name="checkbox flip s"/>
<spinner label="Lodret (V)" name="TexScaleV"/>
<check_box label="Vend" name="checkbox flip t"/>
- <spinner label="RotationËš" left="125" name="TexRot" width="55"/>
- <spinner label="Gentagelser pr. meter" left="125" name="rptctrl" width="55"/>
<button label="Gem" label_selected="Gem" left_delta="62" name="button apply"/>
<text name="tex offset">
Tekstur offset
@@ -474,21 +475,14 @@
Areal: [AREA] m²
</text>
<button label="Om land" label_selected="Om land" name="button about land"/>
- <check_box label="Vis ejere" name="checkbox show owners" tool_tip="Farver grunde afhængigt af ejerskab:
-
-Grøn = Dit land
-Turkis = Din gruppes land
-Rød = Ejet af andre
-Gul = Til salg
-Lilla = PÃ¥ auktion
-Grå = Offentligt ejet"/>
+ <check_box label="Vis ejere" name="checkbox show owners" tool_tip="Farver grunde afhængigt af ejerskab: Grøn = Dit land Turkis = Din gruppes land Rød = Ejet af andre Gul = Til salg Lilla = På auktion Grå = Offentligt ejet"/>
<text name="label_parcel_modify">
Redigere grund
</text>
<button label="Opdel" label_selected="Opdel" name="button subdivide land"/>
<button label="Saml" label_selected="Saml" name="button join land"/>
<text name="label_parcel_trans">
- Transaktioner for land
+ Transaktioner - land
</text>
<button label="Køb land" label_selected="Køb land" name="button buy land"/>
<button label="Efterlad land" label_selected="Efterlad land" name="button abandon land"/>
diff --git a/indra/newview/skins/default/xui/da/floater_top_objects.xml b/indra/newview/skins/default/xui/da/floater_top_objects.xml
index 3f19350e30..86c24d2c19 100644
--- a/indra/newview/skins/default/xui/da/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/da/floater_top_objects.xml
@@ -1,15 +1,40 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="top_objects" title="Top objekter">
+ <floater.string name="top_scripts_title">
+ Mest krævende scripts
+ </floater.string>
+ <floater.string name="top_scripts_text">
+ [COUNT] scripts bruger ialt [TIME] ms
+ </floater.string>
+ <floater.string name="scripts_score_label">
+ Tid
+ </floater.string>
+ <floater.string name="scripts_mono_time_label">
+ Mono tid
+ </floater.string>
+ <floater.string name="top_colliders_title">
+ Mest kolliderende
+ </floater.string>
+ <floater.string name="top_colliders_text">
+ Top [COUNT] genstande der potentielt har mange kollisioner
+ </floater.string>
+ <floater.string name="colliders_score_label">
+ Point
+ </floater.string>
+ <floater.string name="none_descriptor">
+ Ingen fundet
+ </floater.string>
<text name="title_text">
Henter...
</text>
<scroll_list name="objects_list">
- <column label="Point" name="score"/>
- <column label="Navn" name="name"/>
- <column label="Ejer" name="owner"/>
- <column label="Lokation" name="location"/>
- <column label="Tid" name="time"/>
- <column label="Mono tid" name="mono_time"/>
+ <scroll_list.columns label="Point" name="score"/>
+ <scroll_list.columns label="Navn" name="name"/>
+ <scroll_list.columns label="Ejer" name="owner"/>
+ <scroll_list.columns label="Lokation" name="location"/>
+ <scroll_list.columns label="Tid" name="time"/>
+ <scroll_list.columns label="Mono tid" name="mono_time"/>
+ <scroll_list.columns label="URL&apos;er" name="URLs"/>
</scroll_list>
<text name="id_text">
Objekt ID:
@@ -23,33 +48,9 @@
Ejer:
</text>
<button label="Filter" name="filter_owner_btn"/>
+ <button label="Genopfrisk" name="refresh_btn"/>
<button label="Returnér valgte" name="return_selected_btn"/>
<button label="Returnér alle" name="return_all_btn"/>
<button label="Afbryd valgte" name="disable_selected_btn"/>
<button label="Afbryd alle" name="disable_all_btn"/>
- <button label="Genopfrisk" name="refresh_btn"/>
- <string name="top_scripts_title">
- Mest krævende scripts
- </string>
- <string name="top_scripts_text">
- [COUNT] scripts bruger ialt [TIME] ms
- </string>
- <string name="scripts_score_label">
- Tid
- </string>
- <string name="scripts_mono_time_label">
- Mono tid
- </string>
- <string name="top_colliders_title">
- Mest kolliderende
- </string>
- <string name="top_colliders_text">
- Top [COUNT] genstande der potentielt har mange kollisioner
- </string>
- <string name="colliders_score_label">
- Point
- </string>
- <string name="none_descriptor">
- Ingen fundet
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_tos.xml b/indra/newview/skins/default/xui/da/floater_tos.xml
index 77906f0f46..760f60c996 100644
--- a/indra/newview/skins/default/xui/da/floater_tos.xml
+++ b/indra/newview/skins/default/xui/da/floater_tos.xml
@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="modal container" title="">
+ <floater.string name="real_url">
+ http://secondlife.com/app/tos/
+ </floater.string>
+ <floater.string name="loading_url">
+ data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+ </floater.string>
<button label="Fortsæt" label_selected="Fortsæt" name="Continue"/>
<button label="Annullér" label_selected="Annullér" name="Cancel"/>
- <check_box label="Jeg accepterer vilkårene for brug af tjenesten" name="agree_chk"/>
+ <check_box label="Jeg er enig med &quot;Terms of Service and Privacy Policy&quot;" name="agree_chk"/>
<text name="tos_heading">
- Læs venligst de almindelige bestemmelser og vilkår igennem, for at fortsætte til [SECOND LIFE] skal du acceptere vilkårene.
+ Læs venligst følgende &quot;Terms of Service and Privacy Policy&quot; grundigt. For at fortsætte med at logge på [SECOND_LIFE], skal du acceptere aftale.
</text>
- <text_editor name="tos_text">
- TOS_TEXT
- </text_editor>
- <string name="real_url">
- http://secondlife.com/app/tos/
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_voice_controls.xml b/indra/newview/skins/default/xui/da/floater_voice_controls.xml
index 8651851233..05e9eb6cdd 100644
--- a/indra/newview/skins/default/xui/da/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/da/floater_voice_controls.xml
@@ -13,13 +13,14 @@
Opkald med [NAME]
</string>
<string name="no_one_near">
- Ingen nær
+ Ingen i nærheden har aktiveret stemmer
</string>
- <panel name="control_panel">
- <layout_stack>
- <layout_panel name="leave_btn_panel">
- <button label="Forlad opkald" name="leave_call_btn"/>
- </layout_panel>
- </layout_stack>
- </panel>
+ <layout_stack name="my_call_stack">
+ <layout_panel name="my_panel">
+ <text name="user_text" value="Min avatar:"/>
+ </layout_panel>
+ <layout_panel name="leave_call_btn_panel">
+ <button label="Forlad opkald" name="leave_call_btn"/>
+ </layout_panel>
+ </layout_stack>
</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_water.xml b/indra/newview/skins/default/xui/da/floater_water.xml
index 103feaa879..aedd1b442c 100644
--- a/indra/newview/skins/default/xui/da/floater_water.xml
+++ b/indra/newview/skins/default/xui/da/floater_water.xml
@@ -7,7 +7,7 @@
<button label="Gem" label_selected="Gem" name="WaterSavePreset"/>
<button label="Slet" label_selected="Slet" name="WaterDeletePreset"/>
<tab_container name="Water Tabs">
- <panel label="Opsætning" name="Settings">
+ <panel label="INDSTILLINGER" name="Settings">
<text name="BHText">
Vandtåge farve
</text>
@@ -65,7 +65,7 @@
<button label="?" name="WaterBlurMultiplierHelp"/>
<slider label="" name="WaterBlurMult"/>
</panel>
- <panel label="Billede" name="Waves">
+ <panel label="BILLEDE" name="Waves">
<text name="BHText">
Retning for store bølger
</text>
diff --git a/indra/newview/skins/default/xui/da/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/da/floater_wearable_save_as.xml
index a70db6a6f1..17d5b9c205 100644
--- a/indra/newview/skins/default/xui/da/floater_wearable_save_as.xml
+++ b/indra/newview/skins/default/xui/da/floater_wearable_save_as.xml
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="modal container" title="">
- <button label="Gem" label_selected="Gem" name="Save" />
- <button label="Annullér" label_selected="Annullér" name="Cancel" />
+ <button label="Gem" label_selected="Gem" name="Save"/>
+ <button label="Annullér" label_selected="Annullér" name="Cancel"/>
<text name="Save item as:">
- Gem ting som::
+ Gem genstand i min beholdning som:
</text>
<line_editor name="name ed">
Ny [DESC]
diff --git a/indra/newview/skins/default/xui/da/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/da/floater_whitelist_entry.xml
index d2f618579d..443e84b64a 100644
--- a/indra/newview/skins/default/xui/da/floater_whitelist_entry.xml
+++ b/indra/newview/skins/default/xui/da/floater_whitelist_entry.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="whitelist_entry">
+<floater name="whitelist_entry" title="GODKENDTE SIDER">
<text name="media_label">
Indtast en URL eller et URL mønster for at tilføje til listen med godkendte domæner
</text>
diff --git a/indra/newview/skins/default/xui/da/floater_windlight_options.xml b/indra/newview/skins/default/xui/da/floater_windlight_options.xml
index 4786609b53..65f3f67a70 100644
--- a/indra/newview/skins/default/xui/da/floater_windlight_options.xml
+++ b/indra/newview/skins/default/xui/da/floater_windlight_options.xml
@@ -1,18 +1,18 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="WindLight floater" title="AVANCERET OPSÆTNING FOR HIMMEL">
<text name="KeyFramePresetsText">
Faste indstillinger:
</text>
- <button label="Ny" label_selected="Ny" name="WLNewPreset" />
- <button label="Gem" label_selected="Gem" name="WLSavePreset" />
- <button label="Slet" label_selected="Slet" name="WLDeletePreset" />
- <button label="Dags cyklus" label_selected="Dags cyklus" name="WLDayCycleMenuButton" />
+ <button label="Ny" label_selected="Ny" name="WLNewPreset"/>
+ <button label="Gem" label_selected="Gem" name="WLSavePreset"/>
+ <button label="Slet" label_selected="Slet" name="WLDeletePreset"/>
+ <button label="Dags cyklus" label_selected="Dags cyklus" name="WLDayCycleMenuButton"/>
<tab_container name="WindLight Tabs">
- <panel label="Atmosfære" name="Atmosphere">
+ <panel label="ATMOSFÆRE" name="Atmosphere">
<text name="BHText">
Blå - horisont
</text>
- <button label="?" name="WLBlueHorizonHelp" />
+ <button label="?" name="WLBlueHorizonHelp"/>
<text name="BHText2">
R
</text>
@@ -25,19 +25,19 @@
<text name="BHText5">
I
</text>
- <slider label="" name="WLBlueHorizonR" />
- <slider label="" name="WLBlueHorizonG" />
- <slider label="" name="WLBlueHorizonB" />
- <slider label="" name="WLBlueHorizonI" />
+ <slider label="" name="WLBlueHorizonR"/>
+ <slider label="" name="WLBlueHorizonG"/>
+ <slider label="" name="WLBlueHorizonB"/>
+ <slider label="" name="WLBlueHorizonI"/>
<text name="BDensText">
Dis - horisont
</text>
- <button label="?" name="WLHazeHorizonHelp" />
- <slider label="" name="WLHazeHorizon" />
+ <button label="?" name="WLHazeHorizonHelp"/>
+ <slider label="" name="WLHazeHorizon"/>
<text name="BDensText2">
Blå - tæthed
</text>
- <button label="?" name="WLBlueDensityHelp" />
+ <button label="?" name="WLBlueDensityHelp"/>
<text name="BHText6">
R
</text>
@@ -50,36 +50,36 @@
<text name="BHText9">
I
</text>
- <slider label="" name="WLBlueDensityR" />
- <slider label="" name="WLBlueDensityG" />
- <slider label="" name="WLBlueDensityB" />
- <slider label="" name="WLBlueDensityI" />
+ <slider label="" name="WLBlueDensityR"/>
+ <slider label="" name="WLBlueDensityG"/>
+ <slider label="" name="WLBlueDensityB"/>
+ <slider label="" name="WLBlueDensityI"/>
<text name="HDText">
Dis - intensitet
</text>
- <button label="?" name="WLHazeDensityHelp" />
- <slider label="" name="WLHazeDensity" />
+ <button label="?" name="WLHazeDensityHelp"/>
+ <slider label="" name="WLHazeDensity"/>
<text name="DensMultText">
Densitet faktor
</text>
- <button label="?" name="WLDensityMultHelp" />
- <slider label="" name="WLDensityMult" />
+ <button label="?" name="WLDensityMultHelp"/>
+ <slider label="" name="WLDensityMult"/>
<text name="WLDistanceMultText">
Distance faktor
</text>
- <button label="?" name="WLDistanceMultHelp" />
- <slider label="" name="WLDistanceMult" />
+ <button label="?" name="WLDistanceMultHelp"/>
+ <slider label="" name="WLDistanceMult"/>
<text name="MaxAltText">
Maximum højde
</text>
- <button label="?" name="WLMaxAltitudeHelp" />
- <slider label="" name="WLMaxAltitude" />
+ <button label="?" name="WLMaxAltitudeHelp"/>
+ <slider label="" name="WLMaxAltitude"/>
</panel>
- <panel label="Lys" name="Lighting">
+ <panel label="LYS" name="Lighting">
<text name="SLCText">
Sol/MÃ¥ne farve
</text>
- <button label="?" name="WLSunlightColorHelp" />
+ <button label="?" name="WLSunlightColorHelp"/>
<text name="BHText">
R
</text>
@@ -92,19 +92,19 @@
<text name="BHText4">
I
</text>
- <slider label="" name="WLSunlightR" />
- <slider label="" name="WLSunlightG" />
- <slider label="" name="WLSunlightB" />
- <slider label="" name="WLSunlightI" />
+ <slider label="" name="WLSunlightR"/>
+ <slider label="" name="WLSunlightG"/>
+ <slider label="" name="WLSunlightB"/>
+ <slider label="" name="WLSunlightI"/>
<text name="TODText">
Sol/MÃ¥ne position
</text>
- <button label="?" name="WLTimeOfDayHelp" />
- <slider label="" name="WLSunAngle" />
+ <button label="?" name="WLTimeOfDayHelp"/>
+ <slider label="" name="WLSunAngle"/>
<text name="WLAmbientText">
Omgivende
</text>
- <button label="?" name="WLAmbientHelp" />
+ <button label="?" name="WLAmbientHelp"/>
<text name="BHText5">
R
</text>
@@ -117,37 +117,37 @@
<text name="BHText8">
I
</text>
- <slider label="" name="WLAmbientR" />
- <slider label="" name="WLAmbientG" />
- <slider label="" name="WLAmbientB" />
- <slider label="" name="WLAmbientI" />
+ <slider label="" name="WLAmbientR"/>
+ <slider label="" name="WLAmbientG"/>
+ <slider label="" name="WLAmbientB"/>
+ <slider label="" name="WLAmbientI"/>
<text name="WLEastAngleText">
Øst vinkel
</text>
- <button label="?" name="WLEastAngleHelp" />
- <slider label="" name="WLEastAngle" />
+ <button label="?" name="WLEastAngleHelp"/>
+ <slider label="" name="WLEastAngle"/>
<text name="SunGlowText">
Sol glød
</text>
- <button label="?" name="WLSunGlowHelp" />
- <slider label="Fokus " name="WLGlowB" />
- <slider label="Størr. " name="WLGlowR" />
+ <button label="?" name="WLSunGlowHelp"/>
+ <slider label="Fokus " name="WLGlowB"/>
+ <slider label="Størr. " name="WLGlowR"/>
<text name="SceneGammaText">
Lysintensitet (gamma)
</text>
- <button label="?" name="WLSceneGammaHelp" />
- <slider label="" name="WLGamma" />
+ <button label="?" name="WLSceneGammaHelp"/>
+ <slider label="" name="WLGamma"/>
<text name="WLStarText">
Stjerne intensitet
</text>
- <button label="?" name="WLStarBrightnessHelp" />
- <slider label="" name="WLStarAlpha" />
+ <button label="?" name="WLStarBrightnessHelp"/>
+ <slider label="" name="WLStarAlpha"/>
</panel>
- <panel label="Skyer" name="Clouds">
+ <panel label="SKYER" name="Clouds">
<text name="WLCloudColorText">
Farve på skyer
</text>
- <button label="?" name="WLCloudColorHelp" />
+ <button label="?" name="WLCloudColorHelp"/>
<text name="BHText">
R
</text>
@@ -160,14 +160,14 @@
<text name="BHText4">
I
</text>
- <slider label="" name="WLCloudColorR" />
- <slider label="" name="WLCloudColorG" />
- <slider label="" name="WLCloudColorB" />
- <slider label="" name="WLCloudColorI" />
+ <slider label="" name="WLCloudColorR"/>
+ <slider label="" name="WLCloudColorG"/>
+ <slider label="" name="WLCloudColorB"/>
+ <slider label="" name="WLCloudColorI"/>
<text name="WLCloudColorText2">
Skyer XY/Tæthed
</text>
- <button label="?" name="WLCloudDensityHelp" />
+ <button label="?" name="WLCloudDensityHelp"/>
<text name="BHText5">
X
</text>
@@ -177,23 +177,23 @@
<text name="BHText7">
T
</text>
- <slider label="" name="WLCloudX" />
- <slider label="" name="WLCloudY" />
- <slider label="" name="WLCloudDensity" />
+ <slider label="" name="WLCloudX"/>
+ <slider label="" name="WLCloudY"/>
+ <slider label="" name="WLCloudDensity"/>
<text name="WLCloudCoverageText">
Skydække
</text>
- <button label="?" name="WLCloudCoverageHelp" />
- <slider label="" name="WLCloudCoverage" />
+ <button label="?" name="WLCloudCoverageHelp"/>
+ <slider label="" name="WLCloudCoverage"/>
<text name="WLCloudScaleText">
Skystørrelse
</text>
- <button label="?" name="WLCloudScaleHelp" />
- <slider label="" name="WLCloudScale" />
+ <button label="?" name="WLCloudScaleHelp"/>
+ <slider label="" name="WLCloudScale"/>
<text name="WLCloudDetailText">
Sky detaljer(XY/tæthed)
</text>
- <button label="?" name="WLCloudDetailHelp" />
+ <button label="?" name="WLCloudDetailHelp"/>
<text name="BHText8">
X
</text>
@@ -203,23 +203,23 @@
<text name="BHText10">
T
</text>
- <slider label="" name="WLCloudDetailX" />
- <slider label="" name="WLCloudDetailY" />
- <slider label="" name="WLCloudDetailDensity" />
+ <slider label="" name="WLCloudDetailX"/>
+ <slider label="" name="WLCloudDetailY"/>
+ <slider label="" name="WLCloudDetailDensity"/>
<text name="WLCloudScrollXText">
Sky drift X
</text>
- <button label="?" name="WLCloudScrollXHelp" />
- <check_box label="LÃ¥s" name="WLCloudLockX" />
- <slider label="" name="WLCloudScrollX" />
+ <button label="?" name="WLCloudScrollXHelp"/>
+ <check_box label="LÃ¥s" name="WLCloudLockX"/>
+ <slider label="" name="WLCloudScrollX"/>
<text name="WLCloudScrollYText">
Sky drift Y
</text>
- <button label="?" name="WLCloudScrollYHelp" />
- <check_box label="LÃ¥s" name="WLCloudLockY" />
- <slider label="" name="WLCloudScrollY" />
- <check_box label="Benyt simple skyer" name="DrawClassicClouds" />
- <button label="?" name="WLClassicCloudsHelp" />
+ <button label="?" name="WLCloudScrollYHelp"/>
+ <check_box label="LÃ¥s" name="WLCloudLockY"/>
+ <slider label="" name="WLCloudScrollY"/>
+ <check_box label="Benyt simple skyer" name="DrawClassicClouds"/>
+ <button label="?" name="WLClassicCloudsHelp"/>
</panel>
</tab_container>
<string name="WLDefaultSkyNames">
diff --git a/indra/newview/skins/default/xui/da/floater_window_size.xml b/indra/newview/skins/default/xui/da/floater_window_size.xml
new file mode 100644
index 0000000000..db8ead21bd
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/floater_window_size.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="window_size" title="VINDUE STØRRELSE">
+ <string name="resolution_format">
+ [RES_X] x [RES_Y]
+ </string>
+ <text name="windowsize_text">
+ Sæt størrelse på vindue:
+ </text>
+ <combo_box name="window_size_combo" tool_tip="bredde x højde">
+ <combo_box.item label="1000 x 700 (standard)" name="item0"/>
+ <combo_box.item label="1024 x 768" name="item1"/>
+ <combo_box.item label="1280 x 720 (720p)" name="item2"/>
+ <combo_box.item label="1920 x 1080 (1080p)" name="item3"/>
+ </combo_box>
+ <button label="Sæt" name="set_btn"/>
+ <button label="Annullér" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/da/floater_world_map.xml b/indra/newview/skins/default/xui/da/floater_world_map.xml
index 137e8509a4..4dec9a9ba7 100644
--- a/indra/newview/skins/default/xui/da/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/da/floater_world_map.xml
@@ -5,65 +5,66 @@
Forklaring
</text>
</panel>
- <panel>
- <button label="Vis min position" label_selected="Vis min position" name="Show My Location" tool_tip="Centrér kort om min avatars position"/>
- <text name="person_label">
+ <panel name="layout_panel_2">
+ <button name="Show My Location" tool_tip="Centrer kortet på din avatars lokation"/>
+ <text name="me_label">
Mig
</text>
- <check_box label="Beboer" name="people_chk"/>
- <check_box label="Infohub" name="infohub_chk"/>
+ <text name="person_label">
+ Person
+ </text>
<text name="infohub_label">
Infohub
</text>
- <check_box label="Land til salg" name="land_for_sale_chk"/>
<text name="land_sale_label">
Land til salg
</text>
+ <text name="by_owner_label">
+ efter ejer
+ </text>
<text name="auction_label">
- af ejer
+ land auktion
</text>
- <button label="Tag hjem" label_selected="Tag hjem" name="Go Home" tool_tip="Teleportér til min hjemmelokation"/>
+ <button name="Go Home" tool_tip="Teleportér til min hjemmelokation"/>
<text name="Home_label">
Hjem
</text>
<text name="events_label">
Events:
</text>
- <check_box label="PG" name="event_chk"/>
- <check_box initial_value="true" label="Mature" name="event_mature_chk"/>
+ <text name="pg_label">
+ Generelt
+ </text>
+ <check_box name="event_mature_chk"/>
<text name="mature_label">
- Mature
+ Moderat
+ </text>
+ <text name="adult_label">
+ Voksent
</text>
- <check_box label="Adult" name="event_adult_chk"/>
</panel>
- <panel>
+ <panel name="layout_panel_3">
<text name="find_on_map_label">
Find på kort
</text>
</panel>
- <panel>
- <combo_box label="Venner online" name="friend combo" tool_tip="Vis venner på kort">
- <combo_box.item label="Mine venner online" name="item1"/>
+ <panel name="layout_panel_4">
+ <combo_box label="Venner online" name="friend combo" tool_tip="Vis venner på kortet">
+ <combo_box.item label="Mine venner som er online" name="item1"/>
</combo_box>
<combo_box label="Mine landemærker" name="landmark combo" tool_tip="Landemærke der skal vises på kort">
<combo_box.item label="Mine landemærker" name="item1"/>
</combo_box>
- <search_editor label="Regioner efter navn" name="location" tool_tip="Skriv navnet på en region"/>
- <button label="Find" name="DoSearch" tool_tip="Søg efter en region"/>
- <scroll_list name="search_results">
- <scroll_list.columns label="" name="icon"/>
- <scroll_list.columns label="" name="sim_name"/>
- </scroll_list>
- <button label="Teleport" label_selected="Teleport" name="Teleport" tool_tip="Teleportér til den valgte lokation"/>
- <button label="Kopiér SLurl" name="copy_slurl" tool_tip="Kopierer denne lokation som SLurl der kan bruges på web."/>
- <button label="Vis selektion" label_selected="Vis destination" name="Show Destination" tool_tip="Centrér kortet på valgte lokation"/>
+ <search_editor label="Regioner efter navn" name="location" tool_tip="Indtast navn på en region"/>
+ <button label="Find" name="DoSearch" tool_tip="Led efter region"/>
+ <button name="Clear" tool_tip="Fjern søgelinier og nulstil kort"/>
+ <button label="Teleport" name="Teleport" tool_tip="Teleportér til valgte sted"/>
+ <button label="Kopiér SLurl" name="copy_slurl" tool_tip="Kopierer nuværende lokation som SLurl der kan sendes på web."/>
+ <button label="Vis valgte" name="Show Destination" tool_tip="Centrér kortet på valgte lokation"/>
</panel>
- <panel>
+ <panel name="layout_panel_5">
<text name="zoom_label">
Zoom
</text>
</panel>
- <panel>
- <slider label="Zoom" name="zoom slider"/>
- </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/da/inspect_avatar.xml b/indra/newview/skins/default/xui/da/inspect_avatar.xml
index 1b85544303..d4bc0813e5 100644
--- a/indra/newview/skins/default/xui/da/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/da/inspect_avatar.xml
@@ -13,7 +13,7 @@
<slider name="volume_slider" tool_tip="Stemme lydstyrke" value="0.5"/>
<button label="Tilføj ven" name="add_friend_btn"/>
<button label="IM" name="im_btn"/>
- <button label="Mere" name="view_profile_btn"/>
+ <button label="Profil" name="view_profile_btn"/>
<panel name="moderator_panel">
<button label="Slå stemme-chat fra" name="disable_voice"/>
<button label="Slå stemme-chat til" name="enable_voice"/>
diff --git a/indra/newview/skins/default/xui/da/language_settings.xml b/indra/newview/skins/default/xui/da/language_settings.xml
index 71418d446a..fa8a788605 100644
--- a/indra/newview/skins/default/xui/da/language_settings.xml
+++ b/indra/newview/skins/default/xui/da/language_settings.xml
@@ -3,9 +3,9 @@
<strings>
<!-- Locale Information -->
- <string name="MicrosoftLocale">english</string>
- <string name="DarwinLocale">C</string>
- <string name="LinuxLocale">C</string>
+ <string name="MicrosoftLocale">danish</string>
+ <string name="DarwinLocale">da_DK.UTF-8</string>
+ <string name="LinuxLocale">da_DK.UTF-8</string>
<!--
datetimeToCodes["wkday"] = "%a"; // Thu
diff --git a/indra/newview/skins/default/xui/da/menu_attachment_other.xml b/indra/newview/skins/default/xui/da/menu_attachment_other.xml
index 2cc23e27c7..ca7b184942 100644
--- a/indra/newview/skins/default/xui/da/menu_attachment_other.xml
+++ b/indra/newview/skins/default/xui/da/menu_attachment_other.xml
@@ -10,7 +10,7 @@
<menu_item_call label="Rapportér" name="abuse"/>
<menu_item_call label="Frys" name="Freeze..."/>
<menu_item_call label="Smid ud" name="Eject..."/>
- <menu_item_call label="Debug" name="Debug..."/>
+ <menu_item_call label="Debug teksturer" name="Debug..."/>
<menu_item_call label="Zoom ind" name="Zoom In"/>
<menu_item_call label="Betal" name="Pay..."/>
<menu_item_call label="Objekt profil" name="Object Inspect"/>
diff --git a/indra/newview/skins/default/xui/da/menu_attachment_self.xml b/indra/newview/skins/default/xui/da/menu_attachment_self.xml
index 306ae96d49..bf52e5d57f 100644
--- a/indra/newview/skins/default/xui/da/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/da/menu_attachment_self.xml
@@ -5,8 +5,9 @@
<menu_item_call label="Tag af" name="Detach"/>
<menu_item_call label="Smid" name="Drop"/>
<menu_item_call label="Stå op" name="Stand Up"/>
- <menu_item_call label="Udseende" name="Appearance..."/>
+ <menu_item_call label="Skift sæt" name="Change Outfit"/>
<menu_item_call label="Venner" name="Friends..."/>
<menu_item_call label="Grupper" name="Groups..."/>
<menu_item_call label="Profil" name="Profile..."/>
+ <menu_item_call label="Debug teksturer" name="Debug..."/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_avatar_other.xml b/indra/newview/skins/default/xui/da/menu_avatar_other.xml
index 66d357e7e2..a778dedf0b 100644
--- a/indra/newview/skins/default/xui/da/menu_avatar_other.xml
+++ b/indra/newview/skins/default/xui/da/menu_avatar_other.xml
@@ -10,7 +10,7 @@
<menu_item_call label="Rapportér" name="abuse"/>
<menu_item_call label="Frys" name="Freeze..."/>
<menu_item_call label="Smid ud" name="Eject..."/>
- <menu_item_call label="Debug" name="Debug..."/>
+ <menu_item_call label="Debug Teksturer" name="Debug..."/>
<menu_item_call label="Zoom ind" name="Zoom In"/>
<menu_item_call label="Betal" name="Pay..."/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_avatar_self.xml b/indra/newview/skins/default/xui/da/menu_avatar_self.xml
index 29620fca27..ec85bd05a5 100644
--- a/indra/newview/skins/default/xui/da/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/da/menu_avatar_self.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Self Pie">
<menu_item_call label="Stå op" name="Stand Up"/>
- <context_menu label="Tag af &gt;" name="Take Off &gt;">
- <context_menu label="Tøj &gt;" name="Clothes &gt;">
+ <context_menu label="Tag af â–¶" name="Take Off &gt;">
+ <context_menu label="Tøj ▶" name="Clothes &gt;">
<menu_item_call label="Trøje" name="Shirt"/>
<menu_item_call label="Bukser" name="Pants"/>
<menu_item_call label="Nederdel" name="Skirt"/>
@@ -16,12 +16,15 @@
<menu_item_call label="Alpha" name="Self Alpha"/>
<menu_item_call label="Alt tøj" name="All Clothes"/>
</context_menu>
- <context_menu label="HUD &gt;" name="Object Detach HUD"/>
- <context_menu label="Tag af &gt;" name="Object Detach"/>
+ <context_menu label="HUD â–¶" name="Object Detach HUD"/>
+ <context_menu label="Tag af â–¶" name="Object Detach"/>
<menu_item_call label="Tag alt af" name="Detach All"/>
</context_menu>
- <menu_item_call label="Udseende" name="Appearance..."/>
+ <menu_item_call label="Skift sæt" name="Chenge Outfit"/>
+ <menu_item_call label="Redigér mit sæt" name="Edit Outfit"/>
+ <menu_item_call label="Redigér min form" name="Edit My Shape"/>
<menu_item_call label="Venner" name="Friends..."/>
<menu_item_call label="Grupper" name="Groups..."/>
<menu_item_call label="Profil" name="Profile..."/>
+ <menu_item_call label="Debug teksturer" name="Debug..."/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_bottomtray.xml b/indra/newview/skins/default/xui/da/menu_bottomtray.xml
index dbdeefeaff..e979e35a91 100644
--- a/indra/newview/skins/default/xui/da/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/da/menu_bottomtray.xml
@@ -4,6 +4,11 @@
<menu_item_check label="Bevægelse knap" name="ShowMoveButton"/>
<menu_item_check label="Vis knap" name="ShowCameraButton"/>
<menu_item_check label="Foto knap" name="ShowSnapshotButton"/>
+ <menu_item_check label="Sidepanel knap" name="ShowSidebarButton"/>
+ <menu_item_check label="Bygge knap" name="ShowBuildButton"/>
+ <menu_item_check label="Søge knap" name="ShowSearchButton"/>
+ <menu_item_check label="Kort knap" name="ShowWorldMapButton"/>
+ <menu_item_check label="Mini-Map button" name="ShowMiniMapButton"/>
<menu_item_call label="Klip" name="NearbyChatBar_Cut"/>
<menu_item_call label="Kopiér" name="NearbyChatBar_Copy"/>
<menu_item_call label="Sæt ind" name="NearbyChatBar_Paste"/>
diff --git a/indra/newview/skins/default/xui/da/menu_edit.xml b/indra/newview/skins/default/xui/da/menu_edit.xml
new file mode 100644
index 0000000000..3752f42b1c
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_edit.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu label="Redigér" name="Edit">
+ <menu_item_call label="Fortryd" name="Undo"/>
+ <menu_item_call label="Gendan" name="Redo"/>
+ <menu_item_call label="Klip" name="Cut"/>
+ <menu_item_call label="Kopiér" name="Copy"/>
+ <menu_item_call label="Sæt ind" name="Paste"/>
+ <menu_item_call label="Slet" name="Delete"/>
+ <menu_item_call label="Duplikér" name="Duplicate"/>
+ <menu_item_call label="Marker alt" name="Select All"/>
+ <menu_item_call label="Fjern markering" name="Deselect"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_im_well_button.xml b/indra/newview/skins/default/xui/da/menu_im_well_button.xml
new file mode 100644
index 0000000000..4889230919
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_im_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="IM Well Button Context Menu">
+ <menu_item_call label="Luk alle" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml
index 5b8089bfe0..89111d49f1 100644
--- a/indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/da/menu_inspect_avatar_gear.xml
@@ -7,11 +7,13 @@
<menu_item_call label="Teleportér" name="teleport"/>
<menu_item_call label="Invitér til gruppe" name="invite_to_group"/>
<menu_item_call label="Blokér" name="block"/>
+ <menu_item_call label="Fjern blokering" name="unblock"/>
<menu_item_call label="Rapportér" name="report"/>
<menu_item_call label="Frys" name="freeze"/>
<menu_item_call label="Smid ud" name="eject"/>
- <menu_item_call label="Debug" name="debug"/>
+ <menu_item_call label="Debug teksturer" name="debug"/>
<menu_item_call label="Find på kort" name="find_on_map"/>
<menu_item_call label="Zoom ind" name="zoom_in"/>
<menu_item_call label="Betal" name="pay"/>
+ <menu_item_call label="Del" name="share"/>
</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml
index cfe455e21d..c226d06404 100644
--- a/indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/da/menu_inspect_self_gear.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<menu name="Gear Menu">
<menu_item_call label="Stå op" name="stand_up"/>
- <menu_item_call label="Udseende" name="my_appearance"/>
+ <menu_item_call label="Skift sæt" name="change_outfit"/>
<menu_item_call label="Profil" name="my_profile"/>
<menu_item_call label="Venner" name="my_friends"/>
<menu_item_call label="Grupper" name="my_groups"/>
+ <menu_item_call label="Debug teksturer" name="Debug..."/>
</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_inv_offer_chiclet.xml b/indra/newview/skins/default/xui/da/menu_inv_offer_chiclet.xml
new file mode 100644
index 0000000000..c3b03232bf
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_inv_offer_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="InvOfferChiclet Menu">
+ <menu_item_call label="Luk" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_inventory.xml b/indra/newview/skins/default/xui/da/menu_inventory.xml
index 376af507d0..ff70ec7886 100644
--- a/indra/newview/skins/default/xui/da/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/da/menu_inventory.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
+ <menu_item_call label="Del" name="Share"/>
<menu_item_call label="Køb" name="Task Buy"/>
<menu_item_call label="Ã¥ben" name="Task Open"/>
<menu_item_call label="Afspil" name="Task Play"/>
@@ -46,10 +47,12 @@
<menu_item_call label="Teleport" name="Landmark Open"/>
<menu_item_call label="Ã¥ben" name="Animation Open"/>
<menu_item_call label="Ã¥ben" name="Sound Open"/>
+ <menu_item_call label="Erstat påklædning" name="Replace Outfit"/>
+ <menu_item_call label="Tilføj til påklædning" name="Add To Outfit"/>
<menu_item_call label="Slet ting" name="Purge Item"/>
<menu_item_call label="Genskab ting" name="Restore Item"/>
- <menu_item_call label="GÃ¥ til link" name="Goto Link"/>
<menu_item_call label="Ã¥ben" name="Open"/>
+ <menu_item_call label="Ã…ben original" name="Open Original"/>
<menu_item_call label="Egenskaber" name="Properties"/>
<menu_item_call label="Omdøb" name="Rename"/>
<menu_item_call label="Kopiér asset UUID" name="Copy Asset UUID"/>
@@ -57,13 +60,11 @@
<menu_item_call label="Indsæt" name="Paste"/>
<menu_item_call label="Sæt ind som link" name="Paste As Link"/>
<menu_item_call label="Slet" name="Delete"/>
- <menu_item_call label="Tag ting af" name="Take Off Items"/>
- <menu_item_call label="Tilføj til påklædning" name="Add To Outfit"/>
- <menu_item_call label="Erstat påklædning" name="Replace Outfit"/>
+ <menu_item_call label="Slet systemfolder" name="Delete System Folder"/>
<menu_item_call label="start konference chat" name="Conference Chat Folder"/>
<menu_item_call label="Afspil" name="Sound Play"/>
<menu_item_call label="Om landemærke" name="About Landmark"/>
- <menu_item_call label="Afspil offentligt" name="Animation Play"/>
+ <menu_item_call label="Afspil i verden" name="Animation Play"/>
<menu_item_call label="Afspil lokalt" name="Animation Audition"/>
<menu_item_call label="Send privat besked (IM)" name="Send Instant Message"/>
<menu_item_call label="Tilbyd teleport..." name="Offer Teleport..."/>
diff --git a/indra/newview/skins/default/xui/da/menu_login.xml b/indra/newview/skins/default/xui/da/menu_login.xml
index 0942f1b807..1231c4c08d 100644
--- a/indra/newview/skins/default/xui/da/menu_login.xml
+++ b/indra/newview/skins/default/xui/da/menu_login.xml
@@ -2,29 +2,22 @@
<menu_bar name="Login Menu">
<menu label="Mig" name="File">
<menu_item_call label="Indstillinger" name="Preferences..."/>
- <menu_item_call label="Afslut" name="Quit"/>
+ <menu_item_call label="Afslut [APP_NAME]" name="Quit"/>
</menu>
<menu label="Hjælp" name="Help">
<menu_item_call label="[SECOND_LIFE] hjælp" name="Second Life Help"/>
+ <menu_item_call label="Om [APP_NAME]" name="About Second Life"/>
</menu>
+ <menu_item_check label="Vis debug menu" name="Show Debug Menu"/>
<menu label="Debug" name="Debug">
- <menu label="Redigér" name="Edit">
- <menu_item_call label="Fortryd" name="Undo"/>
- <menu_item_call label="Gendan" name="Redo"/>
- <menu_item_call label="Klip" name="Cut"/>
- <menu_item_call label="Kopiér" name="Copy"/>
- <menu_item_call label="Sæt ind" name="Paste"/>
- <menu_item_call label="Slet" name="Delete"/>
- <menu_item_call label="Duplikér" name="Duplicate"/>
- <menu_item_call label="Vælg alle" name="Select All"/>
- <menu_item_call label="Vælg intet" name="Deselect"/>
- </menu>
<menu_item_call label="Vis debug opsætning" name="Debug Settings"/>
<menu_item_call label="UI/farve opsætning" name="UI/Color Settings"/>
- <menu_item_call label="Vis sidebakke" name="Show Side Tray"/>
<menu label="UI tests" name="UI Tests"/>
+ <menu_item_call label="Sæt vinduesstørrelse" name="Set Window Size..."/>
<menu_item_call label="Vis betingelser" name="TOS"/>
<menu_item_call label="Vis vigtig besked" name="Critical"/>
<menu_item_call label="Test i web browser" name="Web Browser Test"/>
+ <menu_item_check label="Vis gitter vælger" name="Show Grid Picker"/>
+ <menu_item_call label="Vis notifikationskonsol" name="Show Notifications Console"/>
</menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/da/menu_mini_map.xml b/indra/newview/skins/default/xui/da/menu_mini_map.xml
index 667638c529..38486cdecb 100644
--- a/indra/newview/skins/default/xui/da/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/da/menu_mini_map.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="popup">
+<menu name="Popup">
<menu_item_call label="Zoom tæt" name="Zoom Close"/>
<menu_item_call label="Zoom mellem" name="Zoom Medium"/>
<menu_item_call label="Zoom langt" name="Zoom Far"/>
<menu_item_check label="Rotér kort" name="Rotate Map"/>
- <menu_item_call label="Stop Tracking" name="Stop Tracking"/>
+ <menu_item_call label="Fjern ref." name="Stop Tracking"/>
<menu_item_call label="Verdenskort" name="World Map"/>
</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_notification_well_button.xml b/indra/newview/skins/default/xui/da/menu_notification_well_button.xml
new file mode 100644
index 0000000000..40b35b5fdd
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_notification_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Notification Well Button Context Menu">
+ <menu_item_call label="Luk alle" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_object.xml b/indra/newview/skins/default/xui/da/menu_object.xml
index 0714b67ec3..c98a07e140 100644
--- a/indra/newview/skins/default/xui/da/menu_object.xml
+++ b/indra/newview/skins/default/xui/da/menu_object.xml
@@ -5,19 +5,22 @@
<menu_item_call label="Byg" name="Build"/>
<menu_item_call label="Ã…ben" name="Open"/>
<menu_item_call label="Sid her" name="Object Sit"/>
+ <menu_item_call label="Stå op" name="Object Stand Up"/>
<menu_item_call label="Objekt profil" name="Object Inspect"/>
- <context_menu label="Sæt på &gt;" name="Put On">
+ <menu_item_call label="Zoom In" name="Zoom In"/>
+ <context_menu label="Tag på ▶" name="Put On">
<menu_item_call label="Tag på" name="Wear"/>
- <context_menu label="Vedhæft &gt;" name="Object Attach"/>
- <context_menu label="Vedhæft HUD &gt;" name="Object Attach HUD"/>
+ <context_menu label="Vedhæft ▶" name="Object Attach"/>
+ <context_menu label="Vedhæft HUD ▶" name="Object Attach HUD"/>
</context_menu>
- <context_menu label="Fjern &gt;" name="Remove">
- <menu_item_call label="Tag" name="Pie Object Take"/>
+ <context_menu label="Fjern â–¶" name="Remove">
<menu_item_call label="Rapportér misbrug" name="Report Abuse..."/>
<menu_item_call label="Blokér" name="Object Mute"/>
<menu_item_call label="Returnér" name="Return..."/>
<menu_item_call label="Slet" name="Delete"/>
</context_menu>
+ <menu_item_call label="Køb" name="Pie Object Bye"/>
+ <menu_item_call label="Tag" name="Pie Object Take"/>
<menu_item_call label="Tag kopi" name="Take Copy"/>
<menu_item_call label="Betal" name="Pay..."/>
<menu_item_call label="Køb" name="Buy..."/>
diff --git a/indra/newview/skins/default/xui/da/menu_participant_list.xml b/indra/newview/skins/default/xui/da/menu_participant_list.xml
index 44a016026c..2bd28e10de 100644
--- a/indra/newview/skins/default/xui/da/menu_participant_list.xml
+++ b/indra/newview/skins/default/xui/da/menu_participant_list.xml
@@ -1,16 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Participant List Context Menu">
+ <menu_item_check label="Sortér efter navn" name="SortByName"/>
+ <menu_item_check label="Sortér efter nylige talere" name="SortByRecentSpeakers"/>
<menu_item_call label="Profil" name="View Profile"/>
<menu_item_call label="Tilføj ven" name="Add Friend"/>
<menu_item_call label="Send besked" name="IM"/>
<menu_item_call label="Opkald" name="Call"/>
<menu_item_call label="Del" name="Share"/>
<menu_item_call label="Betal" name="Pay"/>
- <menu_item_check label="Blokér/Fjern blokering" name="Block/Unblock"/>
- <menu_item_check label="Sluk for tekst" name="MuteText"/>
- <menu_item_check label="Tillad tekst chat" name="AllowTextChat"/>
- <menu_item_call label="Sluk for denne deltager" name="ModerateVoiceMuteSelected"/>
- <menu_item_call label="Sluk for alle andre" name="ModerateVoiceMuteOthers"/>
- <menu_item_call label="Ã…ben for denne deltager" name="ModerateVoiceUnMuteSelected"/>
- <menu_item_call label="Ã…ben for alle andre" name="ModerateVoiceUnMuteOthers"/>
+ <menu_item_check label="Se person ikoner" name="View Icons"/>
+ <menu_item_check label="Blokér stemme" name="Block/Unblock"/>
+ <menu_item_check label="Blokér tekst" name="MuteText"/>
+ <context_menu label="Moderator muligheder &gt;" name="Moderator Options">
+ <menu_item_check label="Tillad tekst chat" name="AllowTextChat"/>
+ <menu_item_call label="Sluk for denne deltager" name="ModerateVoiceMuteSelected"/>
+ <menu_item_call label="Fjern slukning for denne deltager" name="ModerateVoiceUnMuteSelected"/>
+ <menu_item_call label="Sluk lyd for alle" name="ModerateVoiceMute"/>
+ <menu_item_call label="Tænd lyd for alle" name="ModerateVoiceUnmute"/>
+ </context_menu>
</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_people_groups.xml b/indra/newview/skins/default/xui/da/menu_people_groups.xml
new file mode 100644
index 0000000000..841f58b619
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_people_groups.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Se info" name="View Info"/>
+ <menu_item_call label="Chat" name="Chat"/>
+ <menu_item_call label="Opkald" name="Call"/>
+ <menu_item_call label="Aktivér" name="Activate"/>
+ <menu_item_call label="Forlad" name="Leave"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_people_nearby.xml b/indra/newview/skins/default/xui/da/menu_people_nearby.xml
index 224190149b..5470c32761 100644
--- a/indra/newview/skins/default/xui/da/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/da/menu_people_nearby.xml
@@ -2,9 +2,12 @@
<context_menu name="Avatar Context Menu">
<menu_item_call label="Profil" name="View Profile"/>
<menu_item_call label="Tilføj ven" name="Add Friend"/>
+ <menu_item_call label="Fjern ven" name="Remove Friend"/>
<menu_item_call label="Besked" name="IM"/>
<menu_item_call label="Opkald" name="Call"/>
+ <menu_item_call label="Kort" name="Map"/>
<menu_item_call label="Del" name="Share"/>
<menu_item_call label="Betal" name="Pay"/>
<menu_item_check label="Blokér/Fjern blokering" name="Block/Unblock"/>
+ <menu_item_call label="Tilbyd teleport" name="teleport"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/da/menu_people_nearby_multiselect.xml
index 92c6d2c960..08b7136b97 100644
--- a/indra/newview/skins/default/xui/da/menu_people_nearby_multiselect.xml
+++ b/indra/newview/skins/default/xui/da/menu_people_nearby_multiselect.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Multi-Selected People Context Menu">
<menu_item_call label="Tilføj venner" name="Add Friends"/>
+ <menu_item_call label="Fjern venner" name="Remove Friend"/>
<menu_item_call label="Besked" name="IM"/>
<menu_item_call label="Opkald" name="Call"/>
<menu_item_call label="Del" name="Share"/>
diff --git a/indra/newview/skins/default/xui/da/menu_profile_overflow.xml b/indra/newview/skins/default/xui/da/menu_profile_overflow.xml
index 58fbc62643..6745007c99 100644
--- a/indra/newview/skins/default/xui/da/menu_profile_overflow.xml
+++ b/indra/newview/skins/default/xui/da/menu_profile_overflow.xml
@@ -1,5 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="profile_overflow_menu">
+ <menu_item_call label="Kort" name="show_on_map"/>
<menu_item_call label="Betal" name="pay"/>
<menu_item_call label="Del" name="share"/>
+ <menu_item_call label="Blokér" name="block"/>
+ <menu_item_call label="Fjern blokering" name="unblock"/>
+ <menu_item_call label="Spark" name="kick"/>
+ <menu_item_call label="Frys" name="freeze"/>
+ <menu_item_call label="Fjern frys" name="unfreeze"/>
+ <menu_item_call label="Kundeservicemedarbejder (CSR)" name="csr"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_save_outfit.xml b/indra/newview/skins/default/xui/da/menu_save_outfit.xml
new file mode 100644
index 0000000000..3d89715ea8
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_save_outfit.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="save_outfit_menu">
+ <menu_item_call label="Gem" name="save_outfit"/>
+ <menu_item_call label="Gem som ny" name="save_as_new_outfit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/da/menu_script_chiclet.xml b/indra/newview/skins/default/xui/da/menu_script_chiclet.xml
new file mode 100644
index 0000000000..cdd3212373
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/menu_script_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="ScriptChiclet Menu">
+ <menu_item_call label="Luk" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/da/menu_viewer.xml b/indra/newview/skins/default/xui/da/menu_viewer.xml
index ec0631d54f..a061292eb0 100644
--- a/indra/newview/skins/default/xui/da/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/da/menu_viewer.xml
@@ -5,10 +5,10 @@
<menu_item_call label="Mit instrumentpanel" name="Manage My Account"/>
<menu_item_call label="Køb L$" name="Buy and Sell L$"/>
<menu_item_call label="Profil" name="Profile"/>
- <menu_item_call label="Udseende" name="Appearance"/>
+ <menu_item_call label="Skift sæt" name="ChangeOutfit"/>
<menu_item_check label="Beholdning" name="Inventory"/>
- <menu_item_call label="Vis beholdning i sidebakke" name="ShowSidetrayInventory"/>
- <menu_item_call label="Mine bevægelser" name="Gestures"/>
+ <menu_item_check label="Min beholdning" name="ShowSidetrayInventory"/>
+ <menu_item_check label="Mine bevægelser" name="Gestures"/>
<menu label="Min status" name="Status">
<menu_item_call label="Væk" name="Set Away"/>
<menu_item_call label="Optaget" name="Set Busy"/>
@@ -22,35 +22,37 @@
<menu_item_call label="Grupper" name="My Groups"/>
<menu_item_check label="Chat i nærheden" name="Nearby Chat"/>
<menu_item_call label="Personer tæt på" name="Active Speakers"/>
- <menu_item_check label="Media i nærheden" name="Nearby Media"/>
</menu>
<menu label="Verden" name="World">
- <menu_item_check label="Flyt" name="Movement Controls"/>
- <menu_item_check label="Vis" name="Camera Controls"/>
- <menu_item_call label="Om land" name="About Land"/>
- <menu_item_call label="Region/Estate" name="Region/Estate"/>
- <menu_item_call label="Køb land" name="Buy Land"/>
+ <menu_item_check label="Mini-kort" name="Mini-Map"/>
+ <menu_item_check label="Verdenskort" name="World Map"/>
+ <menu_item_call label="Foto" name="Take Snapshot"/>
+ <menu_item_call label="Opret landemærke for dette sted" name="Create Landmark Here"/>
+ <menu label="Profil for sted" name="Land">
+ <menu_item_call label="Profil for sted" name="Place Profile"/>
+ <menu_item_call label="Om land" name="About Land"/>
+ <menu_item_call label="Region/Estate" name="Region/Estate"/>
+ </menu>
+ <menu_item_call label="Køb dette land" name="Buy Land"/>
<menu_item_call label="Mit land" name="My Land"/>
- <menu label="Vis" name="Land">
- <menu_item_check label="Ban Lines" name="Ban Lines"/>
+ <menu label="Vis" name="LandShow">
+ <menu_item_check label="Bevægelses kontrol" name="Movement Controls"/>
+ <menu_item_check label="Kontroller" name="Camera Controls"/>
+ <menu_item_check label="&apos;Ingen adgang&apos; markering" name="Ban Lines"/>
<menu_item_check label="Pejlelys" name="beacons"/>
<menu_item_check label="Parcel skel" name="Property Lines"/>
- <menu_item_check label="Land-ejere" name="Land Owners"/>
+ <menu_item_check label="Grundejere" name="Land Owners"/>
+ <menu_item_check label="Koordinater" name="Coordinates"/>
+ <menu_item_check label="Parcel egenskaber" name="Parcel Properties"/>
</menu>
- <menu label="Landemærker" name="Landmarks">
- <menu_item_call label="Opret landemærke her" name="Create Landmark Here"/>
- <menu_item_call label="Sæt hjem til her" name="Set Home to Here"/>
- </menu>
- <menu_item_call label="Hjem" name="Teleport Home"/>
- <menu_item_check label="Mini-kort" name="Mini-Map"/>
- <menu_item_check label="Verdenskort" name="World Map"/>
- <menu_item_call label="Foto" name="Take Snapshot"/>
+ <menu_item_call label="Teleport hjem" name="Teleport Home"/>
+ <menu_item_call label="Sæt dette sted som &apos;Hjem&apos;" name="Set Home to Here"/>
<menu label="Sol" name="Environment Settings">
<menu_item_call label="Solopgang" name="Sunrise"/>
<menu_item_call label="Middag" name="Noon"/>
<menu_item_call label="Solnedgang" name="Sunset"/>
<menu_item_call label="Midnat" name="Midnight"/>
- <menu_item_call label="Benyt tid fra estate" name="Revert to Region Default"/>
+ <menu_item_call label="Estate tid" name="Revert to Region Default"/>
<menu_item_call label="Redigering af omgivelser" name="Environment Editor"/>
</menu>
</menu>
@@ -63,77 +65,62 @@
<menu_item_call label="Byg værktøj" name="Create"/>
<menu_item_call label="Land værktøj" name="Land"/>
</menu>
- <menu label="Redigér" name="Edit">
- <menu_item_call label="Fortryd" name="Undo"/>
- <menu_item_call label="Gendan" name="Redo"/>
- <menu_item_call label="Klip" name="Cut"/>
- <menu_item_call label="Kopiér" name="Copy"/>
- <menu_item_call label="Sæt ind" name="Paste"/>
- <menu_item_call label="Slet" name="Delete"/>
- <menu_item_call label="Duplikér" name="Duplicate"/>
- <menu_item_call label="Vælg alt" name="Select All"/>
- <menu_item_call label="Fravælg" name="Deselect"/>
- </menu>
- <menu_item_call label="Sammenkæde" name="Link"/>
+ <menu_item_call label="Sammenkæd" name="Link"/>
<menu_item_call label="Adskil" name="Unlink"/>
+ <menu_item_check label="Redigér sammekædede objekter" name="Edit Linked Parts"/>
<menu_item_call label="Fokusér på valgte" name="Focus on Selection"/>
<menu_item_call label="Zoom til valgte" name="Zoom to Selection"/>
<menu label="Objekt" name="Object">
- <menu_item_call label="Køb" name="Menu Object Take"/>
+ <menu_item_call label="Køb" name="Menu Object Buy"/>
+ <menu_item_call label="Tag" name="Menu Object Take"/>
<menu_item_call label="Tag kopi" name="Take Copy"/>
<menu_item_call label="Opdatér ændringer til beholdning" name="Save Object Back to My Inventory"/>
<menu_item_call label="Opdater ændringer i indhold til objekt" name="Save Object Back to Object Contents"/>
</menu>
<menu label="Scripts" name="Scripts">
- <menu_item_call label="Rekompilér scripts (Mono)" name="Mono"/>
+ <menu_item_call label="Genoversæt scripts (Mono)" name="Mono"/>
<menu_item_call label="Genoversæt scripts (LSL)" name="LSL"/>
<menu_item_call label="Genstart scripts" name="Reset Scripts"/>
- <menu_item_call label="sæt scripts til &quot;Running&quot;" name="Set Scripts to Running"/>
+ <menu_item_call label="Sæt scripts til &quot;Running&quot;" name="Set Scripts to Running"/>
<menu_item_call label="Sæt scripts til &quot;Not Running&quot;" name="Set Scripts to Not Running"/>
</menu>
<menu label="Valg" name="Options">
- <menu_item_check label="Redigér sammenlænkede dele" name="Edit Linked Parts"/>
<menu_item_call label="Sæt standard rettigheder" name="perm prefs"/>
<menu_item_check label="Vis avancerede rettigheder" name="DebugPermissions"/>
- <menu label="Selektion" name="Selection">
- <menu_item_check label="Vælg kun egne objekter" name="Select Only My Objects"/>
- <menu_item_check label="Vælg kun flytbare objekter" name="Select Only Movable Objects"/>
- <menu_item_check label="Vælg ved at omkrandse" name="Select By Surrounding"/>
- </menu>
- <menu label="Vis" name="Show">
- <menu_item_check label="Vis skjult selektion" name="Show Hidden Selection"/>
- <menu_item_check label="Vis lys-radius for valgte" name="Show Light Radius for Selection"/>
- <menu_item_check label="Vis udvælgelses stråle" name="Show Selection Beam"/>
- </menu>
- <menu label="Gitter" name="Grid">
- <menu_item_check label="Ret ind til gitter" name="Snap to Grid"/>
- <menu_item_call label="Ret XY for objekt ind til gitter" name="Snap Object XY to Grid"/>
- <menu_item_call label="Benyt valgte som grundlag for gitter" name="Use Selection for Grid"/>
- <menu_item_call label="Gitter valg" name="Grid Options"/>
- </menu>
+ <menu_item_check label="Vælg kun egne objekter" name="Select Only My Objects"/>
+ <menu_item_check label="Vis kun flytbare objekter" name="Select Only Movable Objects"/>
+ <menu_item_check label="Vælg ved at omkrandse" name="Select By Surrounding"/>
+ <menu_item_check label="Vis skjulte objekter" name="Show Hidden Selection"/>
+ <menu_item_check label="Vis lys-radius for valgte" name="Show Light Radius for Selection"/>
+ <menu_item_check label="Vis pejlelys for valgte" name="Show Selection Beam"/>
+ <menu_item_check label="Ret ind til gitter" name="Snap to Grid"/>
+ <menu_item_call label="Ret XY for objekt ind til gitter" name="Snap Object XY to Grid"/>
+ <menu_item_call label="Benyt valgte som grundlag for gitter" name="Use Selection for Grid"/>
+ <menu_item_call label="Gitter indstillinger" name="Grid Options"/>
</menu>
<menu label="Vis lænkede dele" name="Select Linked Parts">
<menu_item_call label="Vælg næste del" name="Select Next Part"/>
<menu_item_call label="Vælg forrige del" name="Select Previous Part"/>
- <menu_item_call label="Inkludér næste valg" name="Include Next Part"/>
+ <menu_item_call label="Inkludér næste del" name="Include Next Part"/>
<menu_item_call label="Inkludér forrige del" name="Include Previous Part"/>
</menu>
</menu>
<menu label="Hjælp" name="Help">
<menu_item_call label="[SECOND_LIFE] Help" name="Second Life Help"/>
- <menu_item_call label="Tutorial" name="Tutorial"/>
<menu_item_call label="Rapporter misbrug" name="Report Abuse"/>
<menu_item_call label="Rapportér fejl" name="Report Bug"/>
+ <menu_item_call label="Om [APP_NAME]" name="About Second Life"/>
</menu>
<menu label="Avanceret" name="Advanced">
- <menu_item_check label="Sæt til &quot;væk&quot; efter 30 minutter" name="Go Away/AFK When Idle"/>
+ <menu_item_check label="Vis avanceret menu" name="Show Advanced Menu"/>
<menu_item_call label="Stop animering af min avatar" name="Stop Animating My Avatar"/>
<menu_item_call label="Gendan teksturer" name="Rebake Texture"/>
<menu_item_call label="Sæt UI størrelse til standard" name="Set UI Size to Default"/>
+ <menu_item_call label="Vælg vinduesstørrelse..." name="Set Window Size..."/>
<menu_item_check label="Begræns valg afstand" name="Limit Select Distance"/>
<menu_item_check label="Fjern kamerabegrænsninger" name="Disable Camera Distance"/>
<menu_item_check label="Højopløsningsfoto" name="HighResSnapshot"/>
- <menu_item_check label="Lydløse foto&apos;s til disk" name="QuietSnapshotsToDisk"/>
+ <menu_item_check label="Lydløse fotos til disk" name="QuietSnapshotsToDisk"/>
<menu_item_check label="Komprimér fotos til disk" name="CompressSnapshotsToDisk"/>
<menu label="Værktøjer til ydelse" name="Performance Tools">
<menu_item_call label="Lag meter" name="Lag Meter"/>
@@ -147,14 +134,13 @@
<menu_item_check label="Fremhæv gennemsigtigt" name="Highlight Transparent"/>
<menu_item_check label="Vis HUD vedhæftninger" name="Show HUD Attachments"/>
<menu_item_check label="Vis muse-sigte" name="ShowCrosshairs"/>
- <menu_item_check label="Vis tips om land" name="Land Tips"/>
</menu>
<menu label="Gengivelsestyper" name="Rendering Types">
<menu_item_check label="Simpel" name="Simple"/>
<menu_item_check label="Alpha" name="Alpha"/>
<menu_item_check label="Træer" name="Tree"/>
<menu_item_check label="Avatarer" name="Character"/>
- <menu_item_check label="SurfacePath" name="SurfacePath"/>
+ <menu_item_check label="Overflade" name="SurfacePath"/>
<menu_item_check label="Himmel" name="Sky"/>
<menu_item_check label="Vand" name="Water"/>
<menu_item_check label="Jord" name="Ground"/>
@@ -173,11 +159,12 @@
<menu_item_check label="TÃ¥ge" name="Fog"/>
<menu_item_check label="Fleksible objekter" name="Flexible Objects"/>
</menu>
- <menu_item_check label="Kør flere tråde" name="Run Multiple Threads"/>
+ <menu_item_check label="Kør flere &apos;threats&apos;" name="Run Multiple Threads"/>
+ <menu_item_check label="Benyt &quot;Plugin Read Thread&quot;" name="Use Plugin Read Thread"/>
<menu_item_call label="Tøm gruppe cache" name="ClearGroupCache"/>
<menu_item_check label="Muse udjævning" name="Mouse Smoothing"/>
- <menu_item_check label="Vis IM&apos;s i lokal chat" name="IMInChat"/>
<menu label="Shortcuts" name="Shortcuts">
+ <menu_item_call label="Billede (L$[COST])..." name="Upload Image"/>
<menu_item_check label="Søg" name="Search"/>
<menu_item_call label="Frigør taster" name="Release Keys"/>
<menu_item_call label="Sæt UI størrelse til standard" name="Set UI Size to Default"/>
@@ -200,7 +187,6 @@
<menu_item_call label="Zoom ind" name="Zoom In"/>
<menu_item_call label="Zoom standard" name="Zoom Default"/>
<menu_item_call label="Zoom ud" name="Zoom Out"/>
- <menu_item_call label="Skift fuld-skærm" name="Toggle Fullscreen"/>
</menu>
<menu_item_call label="Vis debug valg" name="Debug Settings"/>
<menu_item_check label="Vis udviklingsmenu" name="Debug Mode"/>
@@ -217,6 +203,7 @@
<menu_item_call label="Vis Regionsinfo i debug-konsol" name="Region Info to Debug Console"/>
<menu_item_check label="Kamera" name="Camera"/>
<menu_item_check label="Vind" name="Wind"/>
+ <menu_item_check label="Badge" name="Badge"/>
</menu>
<menu label="Vis info" name="Display Info">
<menu_item_check label="Vis tid" name="Show Time"/>
diff --git a/indra/newview/skins/default/xui/da/notifications.xml b/indra/newview/skins/default/xui/da/notifications.xml
index 42eac1be7a..72a1ab6a29 100644
--- a/indra/newview/skins/default/xui/da/notifications.xml
+++ b/indra/newview/skins/default/xui/da/notifications.xml
@@ -11,18 +11,29 @@
</global>
<template name="okbutton">
<form>
- <button name="OK" text="$yestext"/>
+ <button name="OK_okbutton" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okignore">
+ <form>
+ <button name="OK_okignore" text="$yestext"/>
</form>
</template>
- <template name="okignore"/>
<template name="okcancelbuttons">
<form>
- <button name="Cancel" text="$notext"/>
+ <button name="OK_okcancelbuttons" text="$yestext"/>
+ <button name="Cancel_okcancelbuttons" text="$notext"/>
+ </form>
+ </template>
+ <template name="okcancelignore">
+ <form>
+ <button name="OK_okcancelignore" text="$yestext"/>
+ <button name="Cancel_okcancelignore" text="$notext"/>
</form>
</template>
- <template name="okcancelignore"/>
<template name="okhelpbuttons">
<form>
+ <button name="OK_okhelpbuttons" text="$yestext"/>
<button name="Help" text="$helptext"/>
</form>
</template>
@@ -30,6 +41,7 @@
<form>
<button name="Yes" text="$yestext"/>
<button name="No" text="$notext"/>
+ <button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
</form>
</template>
<notification functor="GenericAcknowledge" label="Ukendt notificeringsbesked" name="MissingAlert">
@@ -93,13 +105,17 @@ Vælg kun en genstand, og prøv igen.
Gem alle ændringer til tøj/krops dele?
<usetemplate canceltext="Annullér" name="yesnocancelbuttons" notext="Gem Ikke" yestext="Gem Alt"/>
</notification>
+ <notification name="FriendsAndGroupsOnly">
+ &apos;Ikke-venner&apos; vil ikke vide, at du har valgt at ignorere deres opkald og personlige beskeder (IM)
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="GrantModifyRights">
- At give redigerings rettigheder til en anden beboer, giver dem mulighed for at ændre, slette eller tage alle genstande, du måtte have i verden. Vær meget forsigtig når uddeler denne tilladelse.
+ At give redigerings rettigheder til en anden beboer, giver dem mulighed for at ændre, slette eller tage ALLE genstande, du måtte have i verden. Vær MEGET forsigtig når uddeler denne tilladelse.
Ønsker du at ændre rettigheder for [FIRST_NAME] [LAST_NAME]?
<usetemplate name="okcancelbuttons" notext="Nej" yestext="Ja"/>
</notification>
<notification name="GrantModifyRightsMultiple">
- At give redigerings rettigheder til en anden beboer, giver dem mulighed for at ændre, slette eller tage alle genstande, du måtte have i verden. Vær meget forsigtig når uddeler denne tilladelse.
+ At give redigerings rettigheder til en anden beboer, giver dem mulighed for at ændre, slette eller tage ALLE genstande, du måtte have i verden. Vær MEGET forsigtig når uddeler denne tilladelse.
Ønsker du at ændre rettigheder for de valgte beboere?
<usetemplate name="okcancelbuttons" notext="Nej" yestext="Ja"/>
</notification>
@@ -142,8 +158,15 @@ Ethvert medlem i en rolle med denne evne kan tildele sig selv -- og et andet med
Add this Ability to &apos;[ROLE_NAME]&apos;?
<usetemplate name="okcancelbuttons" notext="Nej" yestext="Ja"/>
</notification>
- <notification name="ClickUnimplemented">
- Beklager, ikke implementeret endnu.
+ <notification name="AttachmentDrop">
+ Du er ved at smide et vedhæng.
+ Er du sikker på at du vil fortsætte?
+ <usetemplate ignoretext="Bekræft før vedhæng smides" name="okcancelignore" notext="Nej" yestext="Ja"/>
+ </notification>
+ <notification name="JoinGroupNoCost">
+ Du melder dig ind i gruppen [NAME].
+Ønsker du at fortsætte?
+ <usetemplate name="okcancelbuttons" notext="Annullér" yestext="Bliv medlem"/>
</notification>
<notification name="JoinGroupCannotAfford">
Tilmelding til denne gruppe koster L$[COST].
@@ -185,6 +208,9 @@ Du skal skrive både fornavn og efternavn på din figur.
Du har brug for en konto for at logge ind i [SECOND_LIFE]. Vil du oprette en nu?
<usetemplate name="okcancelbuttons" notext="Prøv igen" yestext="Lav ny konto"/>
</notification>
+ <notification name="InvalidCredentialFormat">
+ Du skal indtaste både fornavn og efternavn i din avatars brugernavn felt og derefter logge på igen.
+ </notification>
<notification name="AddClassified">
Annoncer vil vises i &apos;Annoncer&apos; sektionen i søge biblioteket og på [http://secondlife.com/community/classifieds secondlife.com] i en uge.
Udfyld din annonce og klik på &apos;Udgiv...&apos; for at tilf&apos;je den til biblioteket.
@@ -197,19 +223,18 @@ Jo mere du betaler, jo højere oppe på listen vises annoncen, og den vil også
Er du sikker på at du vil fortsætte?
<usetemplate ignoretext="Bekræft før jeg slette media i et objekt" name="okcancelignore" notext="Nej" yestext="Ja"/>
</notification>
- <notification name="ResetShowNextTimeDialogs">
- Vil du gerne genaktivere alle disse popups, som du tidligere har bedt om ikke at få vist?
- <usetemplate name="okcancelbuttons" notext="Annullér" yestext="OK"/>
+ <notification name="ClassifiedInsufficientFunds">
+ Ikke nok penge til at oprette annonce.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="SkipShowNextTimeDialogs">
- Vil du deaktivere alle popups som kan undværes?
- <usetemplate name="okcancelbuttons" notext="Annullér" yestext="OK"/>
+ <notification name="DeleteAvatarPick">
+ Slet favorit &lt;nolink&gt;[PICK]&lt;/nolink&gt;?
</notification>
<notification name="CacheWillClear">
Cache vil blive tømt ved næste genstart af [APP_NAME].
</notification>
<notification name="CacheWillBeMoved">
- Cache vil blive flyttet ved næste genstart af [APP_NAME].
+ Cache vil blive fjernet ved næste genstart af [APP_NAME].
Note: This will clear the cache.
</notification>
<notification name="ChangeConnectionPort">
@@ -224,11 +249,14 @@ Indtast venligst navn på region i Start lokation feltet eller vælg &quot;Min s
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="UnsupportedHardware">
+ Din computer opfylder ikke minimumskravene til [APP_NAME]. Du kan risikere nedsat hastighed. Desværre kan [SUPPORT_SITE] ikke tilbyde teknisk support til konfigurationer der ikke er understøttet.
+
+Besøg [_URL] for yderligere information?
<usetemplate ignoretext="Din computer hardware understøttes ikke" name="okcancelignore" notext="No" yestext="Yes"/>
</notification>
<notification name="UnknownGPU">
- Dit system har et grafikkort som er ukendt for [APP_NAME] lige nu.
-Dette er tilfældet med nyt hardware som endnu ikke er blevet testet med [APP_NAME]. [APP_NAME] vil sandsynligvis kunne køre normalt, men det kan være nødvendigt at justere opsætningen af grafik.
+ Dit system indeholder et grafikkort som [APP_NAME] ikke kan genkende.
+Dette skyldes ofte nyt hardware som endnu ikke er blevet testet med [APP_NAME]. Kortet vil sandsynligvis virke fint, med det kan være nødvendigt at justere grafik opsætningen.
(Mig &gt; Indstillinger &gt; Grafik).
<form name="form">
<ignore name="ignore" text="Dit grafikkort kunne ikke identificeres"/>
@@ -254,15 +282,28 @@ Gå til [_URL] for information om køb af L$?
<notification name="CannotEncodeFile">
Kunne ikke &apos;forstå&apos; filen: [FILE]
</notification>
+ <notification name="CorruptedProtectedDataStore">
+ Vi kan ikke læse dine beskyttede data så de nulstilles.
+ Dette kan ske hvis du ændrer din netværksopsætning.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="DoNotSupportBulkAnimationUpload">
[APP_NAME] understøtter p.t. ikke at send flere animationsfiler ad gangen.
</notification>
<notification name="LandmarkCreated">
Du har tilføjet &quot;[LANDMARK_NAME]&quot; til din [FOLDER_NAME] mappe.
</notification>
+ <notification name="LandmarkAlreadyExists">
+ Du har allerede et landemærke for denne lokation.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CannotOpenScriptObjectNoMod">
Ikke muligt at åbne script i objekt uden &apos;Redigére&apos; rettigheder.
</notification>
+ <notification name="CouldNotTeleportReason">
+ Teleport fejlede.
+[REASON]
+ </notification>
<notification name="invalid_tport">
Der opstod et problem ved din teleport. Det kan være nødvendigt at logge ind igen, før du kan teleporte.
Hvis du bliver ved med at få denne fejl, check venligst [SUPPORT_SITE].
@@ -305,6 +346,10 @@ Prøv evt. igen om lidt.
<notification name="no_inventory_host">
Beholdningssystemet er ikke tilgængelig lige nu.
</notification>
+ <notification name="ForceOwnerAuctionWarning">
+ Denne parcel er sat på auktion. Gennemtving ejerskab vil annullere denne auktion og måske irritere nogen beboere hvis bud allerede er afgivet.
+Gennemtving ejerskab?
+ </notification>
<notification name="CannotBuyLandNoRegion">
Ikke i stand til at købe land:
Kan ikke finde region som dette land er i.
@@ -316,13 +361,6 @@ Kan ikke finde region som dette land er i.
Land kunne ikke dedikeres:
Kunne ikke finde den region land ligger i.
</notification>
- <notification name="ParcelCanPlayMedia">
- Dette sted kan afspille &apos;streaming media&apos;.
-&apos;Streaming media&apos; kræver en hurtig internet opkobling.
-
-Afspil altid &apos;streaming media&apos; når det er tilgængeligt?
-(Du kan ændre dette valg senere under Indstillinger &gt; Privatliv.)
- </notification>
<notification name="CannotReleaseLandRegionNotFound">
Kunne ikke efterlade land:
Kan ikke finde den region landet ligger i.
@@ -340,9 +378,8 @@ Kan ikke finde den region landet ligger i.
Dette er typisk en midlertidig fejl. Venligst rediger og gem igen om et par minutter.
</notification>
<notification name="YouHaveBeenLoggedOut">
- Du er blevet logget af [SECOND_LIFE]:
+ Du er blevet logget af [SECOND_LIFE]
[MESSAGE]
-Du kan stadig se igangværende samtaler (IM) og chat ved at klikke på &apos;Se IM &amp; chat. Ellers klik på &apos;Afslut&apos; for at lukke [APP_NAME] med det samme.
<usetemplate name="okcancelbuttons" notext="Afslut" yestext="Se PB &amp; Chat"/>
</notification>
<notification label="Tilføj ven" name="AddFriend">
@@ -365,6 +402,25 @@ Tilbyd venskab til [NAME]?
<button name="Cancel" text="Annullér"/>
</form>
</notification>
+ <notification label="Gem sæt" name="SaveOutfitAs">
+ Gem det som jeg har på som nyt sæt:
+ <form name="form">
+ <input name="message">
+ [DESC] (ny)
+ </input>
+ <button name="Offer" text="OK"/>
+ <button name="Cancel" text="Annullér"/>
+ </form>
+ </notification>
+ <notification name="ConfirmItemDeleteHasLinks">
+ Mindst en af genstandene har lænkede genstande der peger på den. Hvis du sletter denne genstand, vil lænkninger ikke virke mere. Det anbefales kraftigt at fjerne lænkninger først.
+
+Er du sikker på at du vil slette disse genstande?
+ <usetemplate name="okcancelbuttons" notext="Annullér" yestext="OK"/>
+ </notification>
+ <notification name="ErrorMessage">
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="AvatarMovedDesired">
Den ønskede lokation er ikke tilgængelig lige nu.
Du er blevet flyttet til en region in nærheden.
@@ -396,6 +452,42 @@ Vend tilbage til [http://join.secondlife.com secondlife.com] for at oprette en n
Du kan enten checke din Internet forbindelse og prøve igen om lidt, klikke på Hjælp for at se [SUPPORT_SITE] siden, eller klikke på Teleport for at forsøge at teleportere hjem.
</notification>
+ <notification name="CantTeleportToGrid">
+ Kunne ikke teleportere til [SLURL] da den er på et andet net ([GRID]) end det nuværende net ([CURRENT_GRID]). Luk venligst din klient og prøv igen.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="GeneralCertificateError">
+ Kunne ikke opnå forbindelse til server.
+[REASON]
+
+Vedrørende: [SUBJECT_NAME_STRING]
+Fra: [ISSUER_NAME_STRING]
+Valid fra: [VALID_FROM]
+Valid til: [VALID_TO]
+MD5 Fingerprint: [SHA1_DIGEST]
+SHA1 Fingerprint: [MD5_DIGEST]
+Key Usage: [KEYUSAGE]
+Extended Key Usage: [EXTENDEDKEYUSAGE]
+Subject Key Identifier: [SUBJECTKEYIDENTIFIER]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TrustCertificateError">
+ Certifikationsmyndighed for denne server er ikke kendt.
+
+Certifikat information:
+Vedrørende: [SUBJECT_NAME_STRING]
+Fra: [ISSUER_NAME_STRING]
+Valid fra: [VALID_FROM]
+Valid til: [VALID_TO]
+MD5 Fingerprint: [SHA1_DIGEST]
+SHA1 Fingerprint: [MD5_DIGEST]
+Key Usage: [KEYUSAGE]
+Extended Key Usage: [EXTENDEDKEYUSAGE]
+Subject Key Identifier: [SUBJECTKEYIDENTIFIER]
+
+Ønsker du at stole på denne myndighed?
+ <usetemplate name="okcancelbuttons" notext="Annullér" yestext="Stol på"/>
+ </notification>
<notification name="NotEnoughCurrency">
[NAME] L$ [PRICE] Du har ikke nok L$ til dette.
</notification>
@@ -496,6 +588,10 @@ Download til dit Program bibliotek?
<notification name="ReturnToOwner">
<usetemplate ignoretext="Bekræft før objekter returneres til deres ejere" name="okcancelignore" notext="Cancel" yestext="OK"/>
</notification>
+ <notification name="ConfirmKick">
+ Er du SIKKER på at du vil sparke alle beboere ud?
+ <usetemplate name="okcancelbuttons" notext="Cancel" yestext="Spark alle beboere ud"/>
+ </notification>
<notification name="MuteLinden">
Beklager, men du kan ikke blokere en Linden.
</notification>
@@ -511,9 +607,21 @@ Chat og personlige beskeder vil blive skjult. Personlige beskeder vil få din &a
<usetemplate ignoretext="Jeg skrifter min status til &apos;optaget" name="okignore" yestext="OK"/>
</notification>
<notification name="JoinedTooManyGroupsMember">
- Du har nået det maksimale antal grupper. Du skal forlade en anden gruppe for at kunne være med i denne - eller afvis tilbudet.
-[NAME] har inviteret dig til at være medlem af en gruppe.
-[INVITE]
+ Du er oppe på det maksimale antal grupper. Forlad venligst en anden gruppe inden du melder dig ind i denne, eller afvis tilbuddet.
+[NAME] har inviteret dig til en gruppe.
+ </notification>
+ <notification name="JoinedTooManyGroups">
+ Du er oppe på det maksimale antal grupper. Forlad venligst en gruppe inden du melder dig ind i enndnu en gruppe eller opretter en ny.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="KickUser">
+ Spark beboere ud med hvilken besked?
+ </notification>
+ <notification name="FreezeUser">
+ Frys beboeren med hvilken besked?
+ </notification>
+ <notification name="UnFreezeUser">
+ Fjern frysning af beboeren med hvilken besked?
</notification>
<notification name="OfferTeleport">
<form name="form">
@@ -524,7 +632,11 @@ Chat og personlige beskeder vil blive skjult. Personlige beskeder vil få din &a
<button name="Cancel" text="Annullér"/>
</form>
</notification>
+ <notification name="OfferTeleportFromGod">
+ Tilkald beboer til din lokation?
+ </notification>
<notification name="TeleportFromLandmark">
+ Er du sikker på at du vil teleportere til &lt;nolink&gt;[LOCATION]&lt;/nolink&gt;?
<usetemplate ignoretext="Bekræft at jeg vil teleportere til et landemærke" name="okcancelignore" notext="Cancel" yestext="Teleport"/>
</notification>
<notification name="TeleportToPick">
@@ -535,6 +647,17 @@ Chat og personlige beskeder vil blive skjult. Personlige beskeder vil få din &a
Teleport til [CLASSIFIED]?
<usetemplate ignoretext="Bekræft at du ønsker at teleportere til lokation in annoncer" name="okcancelignore" notext="Annullér" yestext="Teleport"/>
</notification>
+ <notification name="TeleportToHistoryEntry">
+ Teleport til [HISTORY_ENTRY]?
+ <usetemplate ignoretext="Bekræft at du ønsker at teleportere til en lokation i din historik" name="okcancelignore" notext="Annullér" yestext="Teleport"/>
+ </notification>
+ <notification label="Change Linden Estate" name="ChangeLindenEstate">
+ Du er i færd med at ændre et Linden ejet estate (mainland, teeen grid, orientation etc.).
+
+Dette er EKSTREMT FARLIGT da det kan ændre beboernes oplevelse fundamentalt. På mainland vil dette betyde ændring af tusinder af regioner og få spaceserveren til at kløjs i det.
+
+Fortsæt?
+ </notification>
<notification name="RegionEntryAccessBlocked">
Du har ikke adgang til denne region på grund af din valgte indholdsrating. Dette kan skyldes manglende validering af din alder.
@@ -554,15 +677,18 @@ GÃ¥ til &apos;Knowledge Base&apos; for mere information om indholdsratings.
Du har ikke adgang til denne region på grund af din valgte indholdsrating.
</notification>
<notification name="RegionEntryAccessBlocked_Change">
- Du har ikke adgang til denne region på grund af din indholdsrating præferencer.
+ Du har ikke adgang til den region, da din indholdsrating ikke tillader dette.
-Du kan klikke på &apos;Ændre præference&apos; for at ændre din indholdsrating nu og dermed opnå adgang. Du vil så få mulighed for at søge og tilgå [REGIONMATURITY] fra da af. Hvis du senere ønsker at ændre denne opsætning tilbage, gå til Mig &gt; Indstillinger &gt; Generelt.
+Klik på &quot;Ændre præference&quot; for at forhøje din indholdsrating for direkte adgang nu. Ved at gøre dette vil du få lov til at søge og få adgang til [REGIONMATURITY] indhold. Hvis du ønsker at ændre denne opsætning senere, kan du gøre dette fra Mig &gt; Indstillinger &gt; Generelt.
<form name="form">
<button name="OK" text="Ændre indstillinger"/>
<button name="Cancel" text="Luk"/>
<ignore name="ignore" text="Din valgte indholdsrating forhindrer dig i at kommer til en region"/>
</form>
</notification>
+ <notification name="PreferredMaturityChanged">
+ Din indholdsrating er nu [RATING].
+ </notification>
<notification name="LandClaimAccessBlocked">
Du kan ikke kræve dette land på grund af din nuværende indholdsrating indstillinge . Dette kan skyldes manglende validering af din alder.
@@ -626,6 +752,12 @@ Du kan klikke på &apos;Ændre præference&apos; for at ændre din indholdsratin
Indeholder denne gruppe &apos;Mature&apos; indhold?
<usetemplate canceltext="Annullér" name="yesnocancelbuttons" notext="Nej" yestext="Ja"/>
</notification>
+ <notification label="Changed Region Maturity" name="RegionMaturityChange">
+ Ratingen for denne region er ændret.
+Det kan tage noget tid inden ændringen slår igennem på kortet.
+
+For at få adgang til voksen regioner, skal beboere være alders-checket, enten via aldersverifikation eller betalingsverifikation.
+ </notification>
<notification label="Voice Version Mismatch" name="VoiceVersionMismatch">
Denne version af [APP_NAME] er ikke kompatibel med stemme chat funktionen i denne region. For at kunne få stemme chat til at fungere skal du opdatere [APP_NAME].
</notification>
@@ -649,9 +781,9 @@ Du kan klikke på &apos;Ændre præference&apos; for at ændre din indholdsratin
<usetemplate ignoretext="Bekræft før jeg afslutter" name="okcancelignore" notext="Afslut ikke" yestext="Quit"/>
</notification>
<notification name="HelpReportAbuseEmailLL">
- Benyt dette værktøj til at rapportere Use this tool to report krænkelser af [http://secondlife.com/corporate/tos.php Terms of Service] og [http://secondlife.com/corporate/cs.php Community Standards].
+ Benyt dette værktøj til at rapportere krænkninger af [http://secondlife.com/corporate/tos.php Terms of Service] og [http://secondlife.com/corporate/cs.php Community Standards].
-Alle indrapporterede krænkelser er undersøgt og and afgjort. Du kan se løsning ved at læse [http://secondlife.com/support/incidentreport.php Incident Report].
+Alle rapporter om krænkninger vil blive undersøgt og behandlet.
</notification>
<notification name="HelpReportAbuseContainsCopyright">
Kære beboer,
@@ -751,6 +883,9 @@ Henvis til dette fra en hjemmeside for at give andre nem adgang til denne lokati
<notification name="SystemMessageTip">
[MESSAGE]
</notification>
+ <notification name="IMSystemMessageTip">
+ [MESSAGE]
+ </notification>
<notification name="Cancelled">
Annulléret
</notification>
@@ -776,6 +911,11 @@ Henvis til dette fra en hjemmeside for at give andre nem adgang til denne lokati
Uploader billeder fra verdenen og www...
(Tager omkring 5 minutter.)
</notification>
+ <notification name="UploadConfirmation">
+ Omkostninger ved at sende: L$[AMOUNT].
+Ønsker du at fortsætte?
+ <usetemplate name="okcancelbuttons" notext="Annullér" yestext="Send"/>
+ </notification>
<notification name="UploadPayment">
Du betalte L$[AMOUNT] for at uploade.
</notification>
@@ -792,8 +932,7 @@ Henvis til dette fra en hjemmeside for at give andre nem adgang til denne lokati
Bevægelsen [NAME] mangler i databasen.
</notification>
<notification name="UnableToLoadGesture">
- Ikke muligt at indlæse gestus [NAME].
-Prøv venligst igen.
+ Kunne ikke indlæse læse bevægelse [NAME].
</notification>
<notification name="LandmarkMissing">
Landmærke mangler i databasen.
@@ -885,10 +1024,9 @@ Click on any landmark to select it, then click &apos;Teleport&apos; at the botto
(You can also double-click on the landmark, or right-click it and choose &apos;Teleport&apos;.)
</notification>
<notification name="TeleportToPerson">
- Du kan kontakte beboere som f.eks. &apos;[NAME]&apos; ved at åbne &apos;Personer&apos; panelet til højre på skærmen.
-Vælg beboeren fra listen og klik så på &apos;IM&apos; i bunden af panelet.
-(Du kan også dobbelt-klikke på navnet i listen eller højreklikke og vælge &apos;IM&apos;)
-(You can also double-click on their name in the list, or right-click and choose &apos;IM&apos;).
+ Du kan kontakte beboere som &apos;[NAME]&apos; ved at åbne Personer panelet til højre på skærmen.
+Vælg beboeren fra listen og klik så &apos;IM&apos; i bundet af panelet.
+(Du kan også dobbelt-klikke på navnet i listen, eller højre-klikke og vælge &apos;IM&apos;).
</notification>
<notification name="CantSelectLandFromMultipleRegions">
Kan ikke vælge land på tværs af grænser.
@@ -959,7 +1097,7 @@ Prøv venligst at geninstallere plugin eller kontakt leverandøren hvis probleme
Genstandene på det valgte stykke land der er ejet af [FIRST] [LAST] er blevet returneret til hans eller hendes beholdning.
</notification>
<notification name="OtherObjectsReturned2">
- Genstandene på det valgte stykke land der er ejet af beboeren &apos;[NAME]&apos; er blevet returneret til deres ejere.
+ Objekterne i den valgte parcel, ejet af beboeren &apos;[NAME]&apos;, er blevet returneret til deres ejer.
</notification>
<notification name="GroupObjectsReturned">
Genstandene på det valgte stykke land, delt med gruppen [GROUPNAME], er blevet returneret til deres ejeres beholdninger.
@@ -971,7 +1109,7 @@ Genstande, der ikke kan overføres og som er dedikeret til gruppen, er blevet sl
</notification>
<notification name="ServerObjectMessage">
Besked fra [NAME]:
-[MSG]
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
</notification>
<notification name="NotSafe">
Dette land er åbnet for &apos;skade&apos;.
@@ -1080,16 +1218,7 @@ Prøv igen om lidt.
No valid parcel could be found.
</notification>
<notification name="ObjectGiveItem">
- Et objekt med navnet [OBJECTFROMNAME], ejet af [NAME_SLURL], har givet dig [OBJECTTYPE]:
-[ITEM_SLURL]
- <form name="form">
- <button name="Keep" text="Behold"/>
- <button name="Discard" text="Smid væk"/>
- <button name="Mute" text="Blokér"/>
- </form>
- </notification>
- <notification name="ObjectGiveItemUnknownUser">
- Et objekt med navnet [OBJECTFROMNAME], ejet af en ukendt beboer, har givet dig [OBJECTTYPE]:
+ Et objekt med navnet [OBJECTFROMNAME] ejet af [NAME_SLURL] har givet dig denne/dette [OBJECTTYPE]:
[ITEM_SLURL]
<form name="form">
<button name="Keep" text="Behold"/>
@@ -1098,12 +1227,12 @@ Prøv igen om lidt.
</form>
</notification>
<notification name="UserGiveItem">
- [NAME_SLURL] har givet dig [OBJECTTYPE]:
+ [NAME_SLURL] har givet dig denne/dette [OBJECTTYPE]:
[ITEM_SLURL]
<form name="form">
- <button name="Keep" text="Behold"/>
<button name="Show" text="Vis"/>
<button name="Discard" text="Smid væk"/>
+ <button name="Mute" text="Blokér"/>
</form>
</notification>
<notification name="GodMessage">
@@ -1120,14 +1249,17 @@ Prøv igen om lidt.
</form>
</notification>
<notification name="TeleportOffered">
- [NAME] har tilbudt dig en teleport til lokationen:
+ [NAME_SLURL] har tilbudt en teleport til deres lokation:
-[MESSAGE]
+[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
<form name="form">
<button name="Teleport" text="Teleportér"/>
<button name="Cancel" text="Annullér"/>
</form>
</notification>
+ <notification name="TeleportOfferSent">
+ Tilbud om teleport sendt til [TO_NAME]
+ </notification>
<notification name="GotoURL">
[MESSAGE]
[URL]
@@ -1137,9 +1269,11 @@ Prøv igen om lidt.
</form>
</notification>
<notification name="OfferFriendship">
- [NAME] tilbyder venskab.
+ [NAME_SLURL] tilbyder venskab.
-Som standard vil du kunne se andres onlinestatus.
+[MESSAGE]
+
+(Som udgangspunkt vil I være i stand til at se hinandens online status.)
<form name="form">
<button name="Accept" text="Acceptér"/>
<button name="Decline" text="Afvis"/>
@@ -1154,9 +1288,15 @@ Som standard vil du kunne se andres onlinestatus.
<notification name="FriendshipDeclined">
[NAME] afviste dit tilbud om venskab.
</notification>
+ <notification name="FriendshipAcceptedByMe">
+ Tilbud om venskab accepteret.
+ </notification>
+ <notification name="FriendshipDeclinedByMe">
+ Tilbud om venskab afvist.
+ </notification>
<notification name="OfferCallingCard">
- [FIRST] [LAST] tilbyder vedkommendes visitkort.
-Dette vil tilføje et bogmærke i din beholdning, så du hurtigt kan sende en personlig besked (IM) til denne beboer.
+ [FIRST] [LAST] tilbyder dig et visitkort.
+Dette vil lave et bogmørke i din beholding, så du hurtigt kan sende en IM til denne beboer.
<form name="form">
<button name="Accept" text="Acceptér"/>
<button name="Decline" text="Afvis"/>
@@ -1187,6 +1327,9 @@ Fra genstand: [OBJECTNAME], ejer: [NAME]?
<notification name="FailedToFindWearable">
Det lykkedes ikke at finde [TYPE] med navnet [DESC] i databasen.
</notification>
+ <notification name="ShareToWebFailed">
+ Fejl ved afsendelse af billede til web.
+ </notification>
<notification name="InvalidWearable">
Den genstand du prøver at tage på benytter en funktion din klient ikke kan forstå. Upgradér venligst din version af [APP_NAME] for at kunne tage denne genstand på.
</notification>
@@ -1227,22 +1370,6 @@ Tillad denne anmodning?
<button name="Ignore" text="Ignorér"/>
</form>
</notification>
- <notification name="ScriptToast">
- [FIRST] [LAST]&apos;s &apos;[TITLE]&apos; ønsker bruger-input.
- <form name="form">
- <button name="Open" text="Ã…ben dialog"/>
- <button name="Ignore" text="Ignorér"/>
- <button name="Block" text="Blokér"/>
- </form>
- </notification>
- <notification name="FirstBalanceIncrease">
- Du har netop modtaget [AMOUNT] L$.
-Din balance vises øverst til højre.
- </notification>
- <notification name="FirstBalanceDecrease">
- Du har netop betalt [AMOUNT] L$.
-Din balance vises øverst til højre.
- </notification>
<notification name="BuyLindenDollarSuccess">
Tak for din betaling!
@@ -1250,58 +1377,17 @@ Din L$ balance vil blive opdateret når transaktionen er gennemført. Ved transa
Status for din betaling kan ses i din &apos;Transaction History&apos; side på din [http://secondlife.com/account/ Dashboard]
</notification>
- <notification name="FirstSit">
- Du sidder ned.
-Benyt piletasterne (eller AWSD) til at se rundt.
-Klik på &apos;Stå op&apos; tasten for at rejse dig.
- </notification>
- <notification name="FirstMap">
- Klik og træk på kortet for at se rundt.
-Dobbelt-klik for at teleportere.
-Benyt kontrollerne til højre for at finde ting og se forskellige baggrunde.
- </notification>
- <notification name="FirstBuild">
- Du har åbnet bygge værktøjer. Alle objekter du ser omkring dig er lavet via disse værktøjer.
- </notification>
- <notification name="FirstTeleport">
- Du kan kun teleportere til bestemte områder i denne region. Pilen peger på din specifikke destination. Klik på pilen for at fjerne den.
- </notification>
<notification name="FirstOverrideKeys">
Dine bevælgelsestaster bliver nu håndteret af et objekt.
Brug piletasterne eller AWSD for at se, hvad de gør.
Nogle genstande (som skydevåben) kræver at du går ind i musevisning for at bruge dem.
Tryk på &apos;M&apos; for at gåre det.
</notification>
- <notification name="FirstAppearance">
- Du redigerer dit udseende.
-Benyt piletasterne til at se rundt.
-Når du er færdig, tryk på &apos;Gem alt&apos;.
- </notification>
- <notification name="FirstInventory">
- Dette er din beholdning, som indeholder de genstande du ejer.
-
-* For at tage noget på, træk det over på dig selv.
-* For at &apos;rezze&apos; noget, træk det over på jorden.
-* For at læse en note, dobbelt-klik på den.
- </notification>
<notification name="FirstSandbox">
Dette er et sandkasse område. Her kan beboere lære ast bygge.
De ting du bygger vil blive slettet senere, så glem ikke at højre-klikke og vælge &quot;Tag&quot; for at tage en kopi af din kreation til din beholdning.
</notification>
- <notification name="FirstFlexible">
- Dette objekt er fleksibelt/blødt. Sådanne objekter skal være &apos;uden masse&apos; og ikke fysiske.
- </notification>
- <notification name="FirstDebugMenus">
- Du har åbnet menuen &apos;Avanceret&apos;.
-
-For at slå denne menu fra og til,
- Windows: Ctrl+Alt+D
- Mac: &#8997;&#8984;D
- </notification>
- <notification name="FirstSculptedPrim">
- Du redigerer en &apos;Sculpted prim&apos;. Sådanne objekter kræver en speciel tekstur for at definere faconen.
- </notification>
<notification name="MaxListSelectMessage">
Du må kun vælge op til [MAX_SELECT] genstande på denne liste.
</notification>
@@ -1408,6 +1494,10 @@ De vil blive blokeret nogle få sekunder af sikkerhedsmæssige årsager.
<button name="respondbutton" text="Svar"/>
</form>
</notification>
+ <notification name="ConfirmCloseAll">
+ Er du sikker på at du vil lukke alle personlige samtaler (IM)?
+ <usetemplate ignoretext="Bekræft før du lukker alle IMer" name="okcancelignore" notext="Annullér" yestext="OK"/>
+ </notification>
<notification name="AttachmentSaved">
Vedhæng er blevet gemt.
</notification>
@@ -1435,6 +1525,57 @@ De vil blive blokeret nogle få sekunder af sikkerhedsmæssige årsager.
Den valgte knap kan ikke vises lige nu.
Knappen vil blive vist når der er nok plads til den.
</notification>
+ <notification name="ShareNotification">
+ Træk genstande fra beholdning til en person i beboer vælgeren
+ </notification>
+ <notification name="DeedToGroupFail">
+ Dedikering til gruppe fejlede.
+ </notification>
+ <notification name="AvatarRezNotification">
+ ( [EXISTENCE] sekunder i live )
+Avatar &apos;[NAME]&apos; declouded in [TIME] seconds.
+ </notification>
+ <notification name="AvatarRezSelfNotification">
+ ( [EXISTENCE] sekunder i live )
+Du afsluttede klargøring af dit sæt på [TIME] sekunder.
+ </notification>
+ <notification name="AvatarRezCloudNotification">
+ ( [EXISTENCE] sekunder i live )
+Avatar &apos;[NAME]&apos; blev til &quot;sky&quot;.
+ </notification>
+ <notification name="AvatarRezArrivedNotification">
+ ( [EXISTENCE] sekunder i live )
+Avatar &apos;[NAME]&apos; appeared.
+ </notification>
+ <notification name="AvatarRezLeftCloudNotification">
+ ( [EXISTENCE] sekunder i live )
+Avatar &apos;[NAME]&apos; forsvandt efter [TIME] sekunder som &quot;sky&quot;.
+ </notification>
+ <notification name="AvatarRezEnteredAppearanceNotification">
+ ( [EXISTENCE] sekunder i live )
+Avatar &apos;[NAME]&apos; skiftede til udseende modus.
+ </notification>
+ <notification name="AvatarRezLeftAppearanceNotification">
+ ( [EXISTENCE] sekunder i live )
+Avatar &apos;[NAME]&apos; har forladt udseende modus.
+ </notification>
+ <notification name="AvatarRezLeftNotification">
+ ( [EXISTENCE] sekunder i live )
+Avatar &apos;[NAME]&apos; forsvandt helt &quot;uploaded&quot;.
+ </notification>
+ <notification name="ConfirmLeaveCall">
+ Er du sikker på at du vil forlade dette opkald?
+ <usetemplate ignoretext="Bekræft før jeg forlader opkald" name="okcancelignore" notext="Nej" yestext="Ja"/>
+ </notification>
+ <notification name="ConfirmMuteAll">
+ Du har valgt at slukke for lyden for alle deltagere i gruppeopkaldet.
+Dette vil også betyde, at alle beboere der slutter sig til opkaldet
+vil have lyden slukket - selv efter de har forladt kaldet.
+
+
+Sluk for alles lyd?
+ <usetemplate ignoretext="Bekræft før jeg slukker for alle deltageres lyd i gruppe-kald" name="okcancelignore" notext="OK" yestext="Annullér"/>
+ </notification>
<global name="UnsupportedGLRequirements">
Det ser ikke ud til at din hardware opfylder minimumskravene til [APP_NAME]. [APP_NAME] kræver et OpenGL grafikkort som understøter &apos;multitexture&apos;. Check eventuelt om du har de nyeste drivere for grafikkortet, og de nyeste service-packs og patches til dit operativsystem.
diff --git a/indra/newview/skins/default/xui/da/outfit_accordion_tab.xml b/indra/newview/skins/default/xui/da/outfit_accordion_tab.xml
new file mode 100644
index 0000000000..e2d1f26d42
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/outfit_accordion_tab.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: mantipov: this xml is intended to be used inside panel_outfits_list.xml for each outfit folder-->
+<!-- All accordion tabs in the My Appearance/My Outfits panel will be created from this one at runtume-->
+<accordion_tab name="Mockup Tab" title="Model fane"/>
diff --git a/indra/newview/skins/default/xui/da/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/da/panel_adhoc_control_panel.xml
index ab2e7a6e31..1953fad31f 100644
--- a/indra/newview/skins/default/xui/da/panel_adhoc_control_panel.xml
+++ b/indra/newview/skins/default/xui/da/panel_adhoc_control_panel.xml
@@ -1,8 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_im_control_panel">
- <panel name="panel_call_buttons">
- <button label="Opkald" name="call_btn"/>
- <button label="Forlad samtale" name="end_call_btn"/>
- <button label="Stemmekontroller" name="voice_ctrls_btn"/>
- </panel>
+ <layout_stack name="vertical_stack">
+ <layout_panel name="call_btn_panel">
+ <button label="Opkald" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Forlad opkald" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Stemmekontroller" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/da/panel_avatar_list_item.xml
index a9d5ba73ac..56332c00e6 100644
--- a/indra/newview/skins/default/xui/da/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/da/panel_avatar_list_item.xml
@@ -22,4 +22,5 @@
[COUNT]Ã¥
</string>
<text name="avatar_name" value="Ukendt"/>
+ <button name="profile_btn" tool_tip="Vis profil"/>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/da/panel_block_list_sidetray.xml
index 986a4131de..4f5041ad54 100644
--- a/indra/newview/skins/default/xui/da/panel_block_list_sidetray.xml
+++ b/indra/newview/skins/default/xui/da/panel_block_list_sidetray.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="block_list_panel">
<text name="title_text">
- Blokérede avatarer
+ Blokerede
</text>
- <scroll_list name="blocked" tool_tip="Vis liste over blokerede avatarer"/>
+ <scroll_list name="blocked" tool_tip="Liste med beboerer der p.t. er blokeret"/>
<button label="Blokér beboer..." label_selected="Blokér beboer..." name="Block resident..." tool_tip="Vælg en beboer der skal blokeres"/>
<button label="Blokér objekt via navn..." label_selected="Blokér objekt via navn..." name="Block object by name..."/>
- <button label="Fjern blokering" label_selected="Fjern blokering" name="Unblock" tool_tip="Fjern beboer fra liste med blokeringer"/>
+ <button label="Fjern blokering" label_selected="Fjern blokering" name="Unblock" tool_tip="Fjerm en beboer fra blokeringslisten"/>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/da/panel_body_parts_list_item.xml
new file mode 100644
index 0000000000..de764d8025
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_body_parts_list_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="wearable_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_bodyparts_list_button_bar.xml b/indra/newview/skins/default/xui/da/panel_bodyparts_list_button_bar.xml
new file mode 100644
index 0000000000..4cbcdebbe4
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_bodyparts_list_button_bar.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="clothing_list_button_bar_panel">
+ <button label="Skift" name="switch_btn"/>
+ <button label="Køb &gt;" name="bodyparts_shop_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_bottomtray.xml b/indra/newview/skins/default/xui/da/panel_bottomtray.xml
index 2085840bb5..2d288a9494 100644
--- a/indra/newview/skins/default/xui/da/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/da/panel_bottomtray.xml
@@ -1,14 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="bottom_tray">
- <string name="SpeakBtnToolTip">
- Slukker/tænder mikrofon
- </string>
- <string name="VoiceControlBtnToolTip">
- Skjuler/viser stemme kontrol panel
- </string>
+ <string name="SpeakBtnToolTip" value="Slå mikrofon til/fra"/>
+ <string name="VoiceControlBtnToolTip" value="Vis/skjul stemme kontrolpanel"/>
<layout_stack name="toolbar_stack">
+ <layout_panel name="speak_panel">
+ <talk_button name="talk">
+ <speak_button label="Tal" label_selected="Tal" name="speak_btn"/>
+ </talk_button>
+ </layout_panel>
<layout_panel name="gesture_panel">
- <gesture_combo_box label="Bevægelse" name="Gesture" tool_tip="Skjuler/viser bevægelser"/>
+ <gesture_combo_list label="Bevægelse" name="Gesture" tool_tip="Skjuler/viser bevægelser"/>
</layout_panel>
<layout_panel name="movement_panel">
<button label="Flyt" name="movement_btn" tool_tip="Vis/skjul bevægelseskontroller"/>
@@ -19,5 +20,30 @@
<layout_panel name="snapshot_panel">
<button label="" name="snapshots" tool_tip="Tag foto"/>
</layout_panel>
+ <layout_panel name="sidebar_btn_panel">
+ <button label="Sidepanel" name="sidebar_btn" tool_tip="Vis/skjul sidepanel"/>
+ </layout_panel>
+ <layout_panel name="build_btn_panel">
+ <button label="Byg" name="build_btn" tool_tip="Vis/skjul byggeværktøjer"/>
+ </layout_panel>
+ <layout_panel name="search_btn_panel">
+ <button label="Søg" name="search_btn" tool_tip="Vis/skjul søgning"/>
+ </layout_panel>
+ <layout_panel name="world_map_btn_panel">
+ <button label="Kort" name="world_map_btn" tool_tip="Vis/skjul verdenskort"/>
+ </layout_panel>
+ <layout_panel name="mini_map_btn_panel">
+ <button label="Mini-kort" name="mini_map_btn" tool_tip="Vis/skjul Mini-kort"/>
+ </layout_panel>
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Konversationer"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="Notifikationer"/>
+ </chiclet_notification>
+ </layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/da/panel_bottomtray_lite.xml
new file mode 100644
index 0000000000..bd31253ca4
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_bottomtray_lite.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray_lite">
+ <layout_stack name="toolbar_stack_lite">
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="Bevægelse" name="Gesture" tool_tip="Vis/skjul bevægelser"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_classified_info.xml b/indra/newview/skins/default/xui/da/panel_classified_info.xml
index a9cce7bf45..28f8936457 100644
--- a/indra/newview/skins/default/xui/da/panel_classified_info.xml
+++ b/indra/newview/skins/default/xui/da/panel_classified_info.xml
@@ -1,17 +1,48 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_classified_info">
+ <panel.string name="l$_price">
+ L$[PRICE]
+ </panel.string>
+ <panel.string name="click_through_text_fmt">
+ [TELEPORT] teleport, [MAP] kort, [PROFILE] profil
+ </panel.string>
+ <panel.string name="date_fmt">
+ [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
+ </panel.string>
+ <panel.string name="auto_renew_on">
+ Aktiv
+ </panel.string>
+ <panel.string name="auto_renew_off">
+ Ikke aktiv
+ </panel.string>
<text name="title" value="Annonce info"/>
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
- <text name="classified_name" value="[name]"/>
- <text name="classified_location" value="[loading...]"/>
- <text name="content_type" value="[content type]"/>
- <text name="category" value="[category]"/>
- <check_box label="Forny automatisk hver uge" name="auto_renew"/>
- <text name="price_for_listing" tool_tip="Pris for optagelse.">
- L$[PRICE]
- </text>
- <text name="classified_desc" value="[description]"/>
+ <text_editor name="classified_name" value="[name]"/>
+ <text name="classified_location_label" value="Sted:"/>
+ <text_editor name="classified_location" value="[loading...]"/>
+ <text name="content_type_label" value="Indholdsype:"/>
+ <text_editor name="content_type" value="[content type]"/>
+ <text name="category_label" value="Kategori:"/>
+ <text_editor name="category" value="[category]"/>
+ <text name="creation_date_label" value="Oprettet d.:"/>
+ <text_editor name="creation_date" tool_tip="Oprettet d." value="[date]"/>
+ <text name="price_for_listing_label" value="Pris for optagelse i lister:"/>
+ <text_editor name="price_for_listing" tool_tip="Pris for optagelse." value="[price]"/>
+ <layout_stack name="descr_stack">
+ <layout_panel name="clickthrough_layout_panel">
+ <text name="click_through_label" value="Klik:"/>
+ <text_editor name="click_through_text" tool_tip="Klik gennem data" value="[clicks]"/>
+ </layout_panel>
+ <layout_panel name="price_layout_panel">
+ <text name="auto_renew_label" value="Forny automatisk:"/>
+ <text name="auto_renew" value="Aktiv"/>
+ </layout_panel>
+ <layout_panel name="descr_layout_panel">
+ <text name="classified_desc_label" value="Beskrivelse:"/>
+ <text_editor name="classified_desc" value="[description]"/>
+ </layout_panel>
+ </layout_stack>
</panel>
</scroll_container>
<panel name="buttons">
diff --git a/indra/newview/skins/default/xui/da/panel_clothing_list_button_bar.xml b/indra/newview/skins/default/xui/da/panel_clothing_list_button_bar.xml
new file mode 100644
index 0000000000..c08d095c66
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_clothing_list_button_bar.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="clothing_list_button_bar_panel">
+ <button label="Tilføj +" name="add_btn"/>
+ <button label="Køb &gt;" name="clothing_shop_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_clothing_list_item.xml b/indra/newview/skins/default/xui/da/panel_clothing_list_item.xml
new file mode 100644
index 0000000000..de764d8025
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_clothing_list_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="wearable_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_cof_wearables.xml b/indra/newview/skins/default/xui/da/panel_cof_wearables.xml
new file mode 100644
index 0000000000..92d78b01a2
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_cof_wearables.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="cof_wearables">
+ <accordion name="cof_wearables_accordion">
+ <accordion_tab name="tab_attachments" title="Attachments"/>
+ <accordion_tab name="tab_clothing" title="Tøj"/>
+ <accordion_tab name="tab_body_parts" title="Kropsdele"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/da/panel_deletable_wearable_list_item.xml
new file mode 100644
index 0000000000..91d90a5660
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_deletable_wearable_list_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="deletable_wearable_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/da/panel_dummy_clothing_list_item.xml
new file mode 100644
index 0000000000..6af84de0c7
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_dummy_clothing_list_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="dummy_clothing_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_classified.xml b/indra/newview/skins/default/xui/da/panel_edit_classified.xml
index 18689105ae..7fb2f930fa 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_classified.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_classified.xml
@@ -3,12 +3,20 @@
<panel.string name="location_notice">
(vil blive opdateret efter gemning)
</panel.string>
+ <string name="publish_label">
+ Publicér
+ </string>
+ <string name="save_label">
+ Gem
+ </string>
<text name="title">
Rediger annonce
</text>
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
- <icon label="" name="edit_icon" tool_tip="Klik for at forstørre billede"/>
+ <panel name="snapshot_panel">
+ <icon label="" name="edit_icon" tool_tip="Klik for at vælge et billede"/>
+ </panel>
<text name="Name:">
Titel:
</text>
@@ -22,12 +30,19 @@
henter...
</text>
<button label="Sæt til nuværende lokation" name="set_to_curr_location_btn"/>
+ <text name="category_label" value="Kategori:"/>
+ <text name="content_type_label" value="Indholdstype:"/>
+ <icons_combo_box label="Generelt" name="content_type">
+ <icons_combo_box.item label="Moderat" name="mature_ci" value="Voksent"/>
+ <icons_combo_box.item label="Generelt" name="pg_ci" value="PG"/>
+ </icons_combo_box>
+ <text name="price_for_listing_label" value="Pris for optagelse:"/>
<spinner label="L$" name="price_for_listing" tool_tip="Pris for optagelse." value="50"/>
<check_box label="Forny automatisk hver uge" name="auto_renew"/>
</panel>
</scroll_container>
<panel label="bottom_panel" name="bottom_panel">
- <button label="Gem" name="save_changes_btn"/>
+ <button label="[LABEL]" name="save_changes_btn"/>
<button label="Annullér" name="cancel_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_eyes.xml b/indra/newview/skins/default/xui/da/panel_edit_eyes.xml
index 9c0d77c370..d801118cea 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_eyes.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_eyes.xml
@@ -3,7 +3,9 @@
<panel name="avatar_eye_color_panel">
<texture_picker label="Iris" name="Iris" tool_tip="Klik for at vælge billede"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="eyes_main_tab" title="Øjne"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="eyes_main_tab" title="Øjne"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_gloves.xml b/indra/newview/skins/default/xui/da/panel_edit_gloves.xml
index 1d3ba061bc..837abdac80 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_gloves.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_gloves.xml
@@ -4,7 +4,9 @@
<texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge bilede"/>
<color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="gloves_main_tab" title="Handsker"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="gloves_main_tab" title="Handsker"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_hair.xml b/indra/newview/skins/default/xui/da/panel_edit_hair.xml
index 14511d51d5..e91e6324e8 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_hair.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_hair.xml
@@ -3,10 +3,12 @@
<panel name="avatar_hair_color_panel">
<texture_picker label="Tekstur" name="Texture" tool_tip="Klik for at vælge et billede"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="hair_color_tab" title="Farve"/>
- <accordion_tab name="hair_style_tab" title="Stil"/>
- <accordion_tab name="hair_eyebrows_tab" title="Øjenbryn"/>
- <accordion_tab name="hair_facial_tab" title="Skæg"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="hair_color_tab" title="Farve"/>
+ <accordion_tab name="hair_style_tab" title="Stil"/>
+ <accordion_tab name="hair_eyebrows_tab" title="Øjenbryn"/>
+ <accordion_tab name="hair_facial_tab" title="Ansigt"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_jacket.xml b/indra/newview/skins/default/xui/da/panel_edit_jacket.xml
index 4c9973c0bd..62934e96c8 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_jacket.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_jacket.xml
@@ -5,7 +5,9 @@
<texture_picker label="Stof forneden" name="Lower Fabric" tool_tip="Klik for at vælge et billede"/>
<color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="jacket_main_tab" title="Jakke"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="jacket_main_tab" title="Jakke"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_pants.xml b/indra/newview/skins/default/xui/da/panel_edit_pants.xml
index bcb1450258..36a9bc60a9 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_pants.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_pants.xml
@@ -4,7 +4,9 @@
<texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et bilede"/>
<color_swatch label="Farve/Nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="pants_main_tab" title="Bukser"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="pants_main_tab" title="Bukser"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_pick.xml b/indra/newview/skins/default/xui/da/panel_edit_pick.xml
index 41db2be5e8..dcc4e7a4b6 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_pick.xml
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Redigér Pick" name="panel_edit_pick">
+ <panel.string name="location_notice">
+ (vil blive opdateret ved gemning)
+ </panel.string>
<text name="title">
Redigér favorit
</text>
@@ -22,7 +25,7 @@
</panel>
</scroll_container>
<panel label="bottom_panel" name="bottom_panel">
- <button label="Gem [WHAT]" name="save_changes_btn"/>
+ <button label="Gem favorit Pick" name="save_changes_btn"/>
<button label="Annullér" name="cancel_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_profile.xml b/indra/newview/skins/default/xui/da/panel_edit_profile.xml
index d3cfdbba52..85461e23a7 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_profile.xml
@@ -35,9 +35,12 @@
</text>
<check_box label="Vis mig i søgeresultater" name="show_in_search_checkbox"/>
<text name="title_acc_status_text" value="Min konto:"/>
+ <text_editor name="acc_status_text" value="Beboer. Ingen betalingsinfo."/>
<text name="my_account_link" value="[[URL] Go to My Dashboard]"/>
- <text name="acc_status_text" value="Beboer. Ingen betalingsinfo."/>
<text name="title_partner_text" value="Min partner:"/>
+ <panel name="partner_data_panel">
+ <name_box initial_value="(henter)" name="partner_text"/>
+ </panel>
<text name="partner_edit_link" value="[[URL] Edit]"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_shape.xml b/indra/newview/skins/default/xui/da/panel_edit_shape.xml
index 19c27748ca..4360fe35f5 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_shape.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_shape.xml
@@ -1,23 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_shape_panel">
- <panel name="avatar_sex_panel">
- <text name="gender_text">
- Køn:
- </text>
- <radio_group name="sex_radio">
- <radio_item label="Kvinde" name="radio"/>
- <radio_item label="Mand" name="radio2"/>
- </radio_group>
+ <text name="avatar_height">
+ [HEIGHT] meter høj
+ </text>
+ <panel label="Trøje" name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shape_body_tab" title="Krop"/>
+ <accordion_tab name="shape_head_tab" title="Hoved"/>
+ <accordion_tab name="shape_eyes_tab" title="Øjne"/>
+ <accordion_tab name="shape_ears_tab" title="Ører"/>
+ <accordion_tab name="shape_nose_tab" title="Næse"/>
+ <accordion_tab name="shape_mouth_tab" title="Mund"/>
+ <accordion_tab name="shape_chin_tab" title="Hage"/>
+ <accordion_tab name="shape_torso_tab" title="Overkrop"/>
+ <accordion_tab name="shape_legs_tab" title="Ben"/>
+ </accordion>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="shape_body_tab" title="Krop"/>
- <accordion_tab name="shape_head_tab" title="Hoved"/>
- <accordion_tab name="shape_eyes_tab" title="Øjne"/>
- <accordion_tab name="shape_ears_tab" title="Ører"/>
- <accordion_tab name="shape_nose_tab" title="Næse"/>
- <accordion_tab name="shape_mouth_tab" title="Mund"/>
- <accordion_tab name="shape_chin_tab" title="Hage"/>
- <accordion_tab name="shape_torso_tab" title="Overkrop"/>
- <accordion_tab name="shape_legs_tab" title="Ben"/>
- </accordion>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_shirt.xml b/indra/newview/skins/default/xui/da/panel_edit_shirt.xml
index cd2e8d8cb3..e49667dc8f 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_shirt.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_shirt.xml
@@ -4,7 +4,9 @@
<texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/>
<color_swatch label="Farve/Nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="shirt_main_tab" title="Trøje"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shirt_main_tab" title="Trøje"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_shoes.xml b/indra/newview/skins/default/xui/da/panel_edit_shoes.xml
index 54a0cc01a4..00d31da95a 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_shoes.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_shoes.xml
@@ -4,7 +4,9 @@
<texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/>
<color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="shoes_main_tab" title="Sko"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shoes_main_tab" title="Shoes"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_skin.xml b/indra/newview/skins/default/xui/da/panel_edit_skin.xml
index 46dce354a9..608e1d6e0b 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_skin.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_skin.xml
@@ -5,10 +5,12 @@
<texture_picker label="Øvre tatoveringer" name="Upper Tattoos" tool_tip="Klik for at vælge et bilede"/>
<texture_picker label="Nedre tatoveringer" name="Lower Tattoos" tool_tip="Klik for at vælge et bilede"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="skin_color_tab" title="Hudfarve"/>
- <accordion_tab name="skin_face_tab" title="Ansigtsdetaljer"/>
- <accordion_tab name="skin_makeup_tab" title="Makeup"/>
- <accordion_tab name="skin_body_tab" title="Kropsdetaljer"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skin_color_tab" title="Hudfarve"/>
+ <accordion_tab name="skin_face_tab" title="Ansigtsdetaljer"/>
+ <accordion_tab name="skin_makeup_tab" title="Makeup"/>
+ <accordion_tab name="skin_body_tab" title="Kropsdetaljer"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_skirt.xml b/indra/newview/skins/default/xui/da/panel_edit_skirt.xml
index 4407c87d36..44a5beca45 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_skirt.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_skirt.xml
@@ -4,7 +4,9 @@
<texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/>
<color_swatch label="Farve/Nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="skirt_main_tab" title="Nederdel"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skirt_main_tab" title="Nederdel"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_socks.xml b/indra/newview/skins/default/xui/da/panel_edit_socks.xml
index 6ef6dad86c..b7abd9d1a0 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_socks.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_socks.xml
@@ -4,7 +4,9 @@
<texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge et billede"/>
<color_swatch label="Farve/Nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="socks_main_tab" title="Strømper"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="socks_main_tab" title="Strømper"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/da/panel_edit_tattoo.xml
index 4a133d8693..d4a12209db 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_tattoo.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_tattoo.xml
@@ -4,5 +4,6 @@
<texture_picker label="Hoved tatovering" name="Head Tattoo" tool_tip="Klik for at vælge et billede"/>
<texture_picker label="Øvre tatovering" name="Upper Tattoo" tool_tip="Klik for at vælge et billede"/>
<texture_picker label="Nedre tatovering" name="Lower Tattoo" tool_tip="Klik for at vælge et billede"/>
+ <color_swatch label="Farve/Nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_underpants.xml b/indra/newview/skins/default/xui/da/panel_edit_underpants.xml
index de52146e29..32596be57b 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_underpants.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_underpants.xml
@@ -4,7 +4,9 @@
<texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge bilede"/>
<color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="underpants_main_tab" title="Underbukser"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="underpants_main_tab" title="Underbukser"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/da/panel_edit_undershirt.xml
index 6c2e1f5833..14cf79b97f 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_undershirt.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_undershirt.xml
@@ -4,7 +4,9 @@
<texture_picker label="Stof" name="Fabric" tool_tip="Klik for at vælge bilede"/>
<color_swatch label="Farve/nuance" name="Color/Tint" tool_tip="Klik for at åbne farvevælger"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="undershirt_main_tab" title="Undertrøje"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="undershirt_main_tab" title="Undertrøje"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_edit_wearable.xml b/indra/newview/skins/default/xui/da/panel_edit_wearable.xml
index 12bc120c45..8e6990fe31 100644
--- a/indra/newview/skins/default/xui/da/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/da/panel_edit_wearable.xml
@@ -93,6 +93,17 @@
<text name="edit_wearable_title" value="Redigerer kropsbygning"/>
<panel label="Trøje" name="wearable_type_panel">
<text name="description_text" value="Kropsbygning:"/>
+ <radio_group name="sex_radio">
+ <radio_item label="" name="sex_male" tool_tip="Mand" value="1"/>
+ <radio_item label="" name="sex_female" tool_tip="Kvinde" value="0"/>
+ </radio_group>
+ <icon name="male_icon" tool_tip="Mandlig"/>
+ <icon name="female_icon" tool_tip="Kvindelig"/>
+ </panel>
+ <panel label="gear_buttom_panel" name="gear_buttom_panel">
+ <button name="friends_viewsort_btn" tool_tip="Valg"/>
+ <button name="add_btn" tool_tip="TODO"/>
+ <button name="del_btn" tool_tip="TODO"/>
</panel>
<panel name="button_panel">
<button label="Gem som" name="save_as_button"/>
diff --git a/indra/newview/skins/default/xui/da/panel_friends.xml b/indra/newview/skins/default/xui/da/panel_friends.xml
index a41eaf20c1..a1a25bdc77 100644
--- a/indra/newview/skins/default/xui/da/panel_friends.xml
+++ b/indra/newview/skins/default/xui/da/panel_friends.xml
@@ -16,5 +16,5 @@
<button label="Teleport" name="offer_teleport_btn" tool_tip="Tilbyd denne ven at blive teleporteret til din nuværende position"/>
<button label="Betal" name="pay_btn" tool_tip="Giv Linden dollars (L$) til denne ven"/>
<button label="Fjern" name="remove_btn" tool_tip="Fjern denne beboer fra din venneliste"/>
- <button label="Tilføj" name="add_btn" tool_tip="Tilbyd venskab til denne beboer"/>
+ <button label="Tilføj" name="add_btn" tool_tip="Tilbyd venskab til en beboer"/>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_group_control_panel.xml b/indra/newview/skins/default/xui/da/panel_group_control_panel.xml
index 1db2db45af..26fe4f6ebe 100644
--- a/indra/newview/skins/default/xui/da/panel_group_control_panel.xml
+++ b/indra/newview/skins/default/xui/da/panel_group_control_panel.xml
@@ -1,9 +1,17 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_im_control_panel">
- <button label="Group Profile" name="group_info_btn"/>
- <panel name="panel_call_buttons">
- <button label="Opkaldsgruppe" name="call_btn"/>
- <button label="Forlad samtale" name="end_call_btn"/>
- <button label="Kontroller for åben stemmechat" name="voice_ctrls_btn"/>
- </panel>
+ <layout_stack name="vertical_stack">
+ <layout_panel name="group_info_btn_panel">
+ <button label="Gruppe profil" name="group_info_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Opkald gruppe" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Forlad opkald" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Ã…ben stemmekontroller" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_group_general.xml b/indra/newview/skins/default/xui/da/panel_group_general.xml
index ec957e6094..3079a23d20 100644
--- a/indra/newview/skins/default/xui/da/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/da/panel_group_general.xml
@@ -9,26 +9,47 @@
<panel.string name="incomplete_member_data_str">
Henter medlemsinformationer
</panel.string>
+ <panel name="group_info_top">
+ <texture_picker label="" name="insignia" tool_tip="Klik for at vælge et billede"/>
+ <text name="prepend_founded_by">
+ Grundlagt af:
+ </text>
+ <name_box initial_value="(henter)" name="founder_name"/>
+ <text name="join_cost_text">
+ Gratis
+ </text>
+ <button label="TILMELD NU!" name="btn_join"/>
+ </panel>
<text_editor name="charter">
Gruppens formål
</text_editor>
<name_list name="visible_members">
<name_list.columns label="Medlem" name="name"/>
<name_list.columns label="Titel" name="title"/>
+ <name_list.columns label="Status" name="status"/>
</name_list>
+ <text name="my_group_settngs_label">
+ MeMig
+ </text>
<text name="active_title_label">
- Min titel
+ Min titel:
</text>
<combo_box name="active_title" tool_tip="Angiver den titel der vises i din avatars navnefelt, når denne gruppe er aktiv"/>
<check_box label="Modtag gruppeinformationer" name="receive_notices" tool_tip="Angiver om du vil modtage informationer fra denne gruppe. Fjern markeringen i boksen hvis gruppen spammer dig."/>
<check_box label="Vis gruppen i min profil" name="list_groups_in_profile" tool_tip="Angiver om du vil vise denne gruppe i dine profilinformationer"/>
<panel name="preferences_container">
+ <text name="group_settngs_label">
+ Gruppe
+ </text>
<check_box label="Ã…ben tilmelding" name="open_enrollement" tool_tip="Angiver om denne gruppe tillader nye medlemmer at tilmelde sig, uden de er inviteret."/>
<check_box label="Tilmeldingsgebyr" name="check_enrollment_fee" tool_tip="Angiver om der kræves et gebyr, for at tilmelde sig gruppen"/>
<spinner label="L$" left_delta="130" name="spin_enrollment_fee" tool_tip="Nye medlemmer skal betale dette gebyr for at tilmelde sig gruppen, når &quot;Tilmeldingsgebyr&quot; er valgt." width="60"/>
<combo_box name="group_mature_check" tool_tip="Angiver om din gruppes information anses som &apos;mature&apos;." width="150">
- <combo_box.item label="PG indhold" name="pg"/>
+ <combo_item name="select_mature">
+ - Vælg Mature -
+ </combo_item>
<combo_box.item label="Mature indhold" name="mature"/>
+ <combo_box.item label="PG indhold" name="pg"/>
</combo_box>
<check_box initial_value="true" label="Vis i søgning" name="show_in_group_list" tool_tip="Lad folk se denne gruppe i søgeresultater."/>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/da/panel_group_info_sidetray.xml
index 9940ebbd4d..a7aa842439 100644
--- a/indra/newview/skins/default/xui/da/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/da/panel_group_info_sidetray.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Gruppe info" name="GroupInfo">
+<panel label="Gruppe profil" name="GroupInfo">
<panel.string name="default_needs_apply_text">
- Der er ændringer på denne fane der ikke er gemt
+ Der er ændringer der ikke er gemt
</panel.string>
<panel.string name="want_apply_text">
Ønsker du at gemme disse ændringer?
@@ -12,25 +12,24 @@
<panel.string name="group_join_free">
Gratis
</panel.string>
- <text name="group_name" value="(Henter...)"/>
- <line_editor label="Indtast dit nye gruppenavn her" name="group_name_editor"/>
- <texture_picker label="" name="insignia" tool_tip="Klik for at vælge bilede"/>
- <text name="prepend_founded_by">
- Grundlægger:
- </text>
- <name_box initial_value="(finder)" name="founder_name"/>
- <text name="join_cost_text">
- Gratis
- </text>
- <button label="MELD IND NU!" name="btn_join"/>
- <accordion name="groups_accordion">
- <accordion_tab name="group_general_tab" title="Generelt"/>
- <accordion_tab name="group_roles_tab" title="Roller"/>
- <accordion_tab name="group_notices_tab" title="Beskeder"/>
- <accordion_tab name="group_land_tab" title="Land/Aktiver"/>
- </accordion>
- <panel name="button_row">
- <button label="Lav" label_selected="Ny gruppe" name="btn_create"/>
- <button label="Gem" label_selected="Gem" name="btn_apply"/>
+ <panel name="group_info_top">
+ <text name="group_name" value="(Henter...)"/>
+ <line_editor label="Indtast nyt gruppenavn her" name="group_name_editor"/>
</panel>
+ <layout_stack name="layout">
+ <layout_panel name="group_accordions">
+ <accordion name="groups_accordion">
+ <accordion_tab name="group_general_tab" title="Generelt"/>
+ <accordion_tab name="group_roles_tab" title="Roller"/>
+ <accordion_tab name="group_notices_tab" title="Noter"/>
+ <accordion_tab name="group_land_tab" title="Land/Aktiver"/>
+ </accordion>
+ </layout_panel>
+ <layout_panel name="button_row">
+ <button label="Chat" name="btn_chat"/>
+ <button label="Gruppeopkald" name="btn_call" tool_tip="Opkald til denne gruppe"/>
+ <button label="Gem" label_selected="Save" name="btn_apply"/>
+ <button label="Opret gruppe" name="btn_create" tool_tip="Opret en ny gruppe"/>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_group_invite.xml b/indra/newview/skins/default/xui/da/panel_group_invite.xml
index 1e00642c29..49daf6c9f2 100644
--- a/indra/newview/skins/default/xui/da/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/da/panel_group_invite.xml
@@ -7,17 +7,14 @@
(indlæser...)
</panel.string>
<panel.string name="already_in_group">
- Nogen af avatarerne var allerede i gruppen og blev ikke inviteret
+ Nogle af de beboere du vælger er allerede i gruppen, så de får ikke tilsendt en invitation.
</panel.string>
<text name="help_text">
- Du kan invitere flere beboere ad
-gangen til at blive medlem af din
-gruppe. Klik &apos;Åben personvælger&apos; for
-at begynde.
+ Du kan invitere flere beboere ad gangen til at blive medlem af din gruppe. Klik &apos;Åben personvælger&apos; for at begynde.
</text>
<button bottom_delta="-30" label="Åben personvælger" name="add_button"/>
- <name_list name="invitee_list" tool_tip="Hold Ctrl knappen nede og klik på beboer navne for at vælge flere"/>
- <button label="Fjern valgte fra listen" name="remove_button" tool_tip="Fjern beboere valgt ovenfor fra invitationslisten"/>
+ <name_list name="invitee_list" tool_tip="Hold Ctrl-tasten nede og klik på beboere for at vælge flere."/>
+ <button label="Fjern valgte fra listen" name="remove_button" tool_tip="Fjerner beboere, der er valgt på ovenstående invitationsliste."/>
<text name="role_text">
Vælg hvilken rolle, du vil tildele dem:
</text>
diff --git a/indra/newview/skins/default/xui/da/panel_group_land_money.xml b/indra/newview/skins/default/xui/da/panel_group_land_money.xml
index c73d7c807d..efad4d0c34 100644
--- a/indra/newview/skins/default/xui/da/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/da/panel_group_land_money.xml
@@ -1,65 +1,65 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Land &amp; L$" name="land_money_tab">
- <string name="help_text">
+ <panel.string name="help_text">
En advarsel vises indtil Total land i brug er mindre end eller lig med det totale bidrag.
- </string>
- <button label="?" name="help_button"/>
- <string name="cant_view_group_land_text">
+ </panel.string>
+ <panel.string name="cant_view_group_land_text">
Du har ikke tilladelse til at se gruppeejet land.
- </string>
- <string name="cant_view_group_accounting_text">
+ </panel.string>
+ <panel.string name="epmty_view_group_land_text">
+ Intet indhold
+ </panel.string>
+ <panel.string name="cant_view_group_accounting_text">
Du har ikke tilladelse til at se gruppens økonomiinformationer.
- </string>
- <string name="loading_txt">
+ </panel.string>
+ <panel.string name="loading_txt">
Indlæser...
- </string>
- <text name="group_land_heading">
- Gruppeejet land
- </text>
- <scroll_list name="group_parcel_list">
- <column label="Parcel" name="name"/>
- <column label="Region" name="location"/>
- <column label="Type" name="type"/>
- <column label="Område" name="area"/>
- <column label="" name="hidden"/>
- </scroll_list>
- <button label="Kort" label_selected="Kort" name="map_button"/>
- <text name="total_contributed_land_label">
- Totalt bidrag:
- </text>
- <text name="total_contributed_land_value">
- [AREA] m²
- </text>
- <text name="total_land_in_use_label">
- Totalt land i brug:
- </text>
- <text name="total_land_in_use_value">
- [AREA] m²
- </text>
- <text name="land_available_label">
- Ledigt land:
- </text>
- <text name="land_available_value">
- [AREA] m²
- </text>
- <text name="your_contribution_label">
- Dit bidrag:
- </text>
- <string name="land_contrib_error">
+ </panel.string>
+ <panel.string name="land_contrib_error">
Ikke muligt at lave dit bidrag til landet
- </string>
- <text name="your_contribution_units">
- m²
- </text>
- <text name="your_contribution_max_value">
- ([AMOUNT] maks.)
- </text>
- <text name="group_over_limit_text">
- Gruppemedlemmer må bidrag med mere, for at understøtte med det land der bliver brugt
- </text>
- <text name="group_money_heading">
- Gruppe L$
- </text>
+ </panel.string>
+ <panel name="layout_panel_landmoney">
+ <scroll_list name="group_parcel_list">
+ <scroll_list.columns label="Parcel" name="name"/>
+ <scroll_list.columns label="Region" name="location"/>
+ <scroll_list.columns label="Type" name="type"/>
+ <scroll_list.columns label="Areal" name="area"/>
+ </scroll_list>
+ <text name="total_contributed_land_label">
+ Totalt bidrag:
+ </text>
+ <text name="total_contributed_land_value">
+ [AREA] m²
+ </text>
+ <button label="Kort" label_selected="Kort" name="map_button"/>
+ <text name="total_land_in_use_label">
+ Totalt land i brug:
+ </text>
+ <text name="total_land_in_use_value">
+ [AREA] m²
+ </text>
+ <text name="land_available_label">
+ Land tilgængelgt:
+ </text>
+ <text name="land_available_value">
+ [AREA] m²
+ </text>
+ <text name="your_contribution_label">
+ Dit bidrag:
+ </text>
+ <text name="your_contribution_units">
+ m²
+ </text>
+ <text name="your_contribution_max_value">
+ ([BELØB] maks.)
+ </text>
+ <text name="group_over_limit_text">
+ Der kræves flere penge for at supportere det land der er i brug
+ </text>
+ <text name="group_money_heading">
+ Gruppe L$
+ </text>
+ </panel>
<tab_container name="group_money_tab_container">
<panel label="PLANLÆGNING" name="group_money_planning_tab">
<text_editor name="group_money_planning_text">
diff --git a/indra/newview/skins/default/xui/da/panel_group_list_item.xml b/indra/newview/skins/default/xui/da/panel_group_list_item.xml
index bfffdccc5e..e77e548340 100644
--- a/indra/newview/skins/default/xui/da/panel_group_list_item.xml
+++ b/indra/newview/skins/default/xui/da/panel_group_list_item.xml
@@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="group_list_item">
<text name="group_name" value="Ukendt"/>
+ <button name="profile_btn" tool_tip="Se profil"/>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_group_notices.xml b/indra/newview/skins/default/xui/da/panel_group_notices.xml
index ec503c37dc..d8e8cb3c2a 100644
--- a/indra/newview/skins/default/xui/da/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/da/panel_group_notices.xml
@@ -42,7 +42,8 @@ Maksimum er 200 pr. gruppe pr. dag
<text name="string">
Træk og slip en gensand for at vedhæfte den:
</text>
- <button label="Fjern" label_selected="Fjern bilag" name="remove_attachment"/>
+ <button label="Beholdning" name="open_inventory" tool_tip="Ã…ben beholdning"/>
+ <button label="Fjern" label_selected="Fjern bilag" name="remove_attachment" tool_tip="Fjern vedhæng fra din note"/>
<button label="Send" label_selected="Send" name="send_notice"/>
<group_drop_target name="drop_target" tool_tip="Træk en genstand fra din beholdning til dette felt for at sende den med denne besked. Du skal have rettigheder til at kopiere og overdrage denne genstand for at kunne vedhæfte den."/>
</panel>
@@ -59,6 +60,6 @@ Maksimum er 200 pr. gruppe pr. dag
<text name="lbl4">
Besked:
</text>
- <button label="Ã…ben bilag" label_selected="Ã¥ben bilag" name="open_attachment"/>
+ <button label="Åben vedhæng" label_selected="åben bilag" name="open_attachment"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_group_notify.xml b/indra/newview/skins/default/xui/da/panel_group_notify.xml
index 43a84298e2..8a684ca031 100644
--- a/indra/newview/skins/default/xui/da/panel_group_notify.xml
+++ b/indra/newview/skins/default/xui/da/panel_group_notify.xml
@@ -4,5 +4,5 @@
<text name="title" value="Afsender navn / Gruppe navn"/>
</panel>
<text name="attachment" value="Bilag"/>
- <button label="Ok" name="btn_ok"/>
+ <button label="OK" name="btn_ok"/>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_group_roles.xml b/indra/newview/skins/default/xui/da/panel_group_roles.xml
index 74bea831fb..3ab3dd8bf8 100644
--- a/indra/newview/skins/default/xui/da/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/da/panel_group_roles.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Medlemmer &amp; roller" name="roles_tab">
<panel.string name="default_needs_apply_text">
- Der er ændringer her, der ikke er gemt.
+ Der er ændringer som ikke er gemt
</panel.string>
<panel.string name="want_apply_text">
Vil du gemme disse ændringer?
@@ -58,7 +58,7 @@ ting i denne gruppe. Der er en bred vifte af rettigheder.
</tab_container>
<panel name="members_footer">
<text name="static">
- Medlemmer
+ Tildelte roller
</text>
<scroll_list name="member_assigned_roles">
<scroll_list.columns label="" name="checkbox"/>
diff --git a/indra/newview/skins/default/xui/da/panel_im_control_panel.xml b/indra/newview/skins/default/xui/da/panel_im_control_panel.xml
index 0384652e5d..5cecb93d40 100644
--- a/indra/newview/skins/default/xui/da/panel_im_control_panel.xml
+++ b/indra/newview/skins/default/xui/da/panel_im_control_panel.xml
@@ -1,13 +1,29 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_im_control_panel">
- <text name="avatar_name" value="Ukendt"/>
- <button label="Profil" name="view_profile_btn"/>
- <button label="Tilføj ven" name="add_friend_btn"/>
- <button label="Teleportér" name="teleport_btn"/>
- <button label="Del" name="share_btn"/>
- <panel name="panel_call_buttons">
- <button label="Opkald" name="call_btn"/>
- <button label="Læg på" name="end_call_btn"/>
- <button label="Stemme opsætning" name="voice_ctrls_btn"/>
- </panel>
+ <layout_stack name="button_stack">
+ <layout_panel name="view_profile_btn_panel">
+ <button label="Profil" name="view_profile_btn"/>
+ </layout_panel>
+ <layout_panel name="add_friend_btn_panel">
+ <button label="Tilføj ven" name="add_friend_btn"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_panel">
+ <button label="Teleport" name="teleport_btn" tool_tip="Tilbyd teleport til denne person"/>
+ </layout_panel>
+ <layout_panel name="share_btn_panel">
+ <button label="Del" name="share_btn"/>
+ </layout_panel>
+ <layout_panel name="pay_btn_panel">
+ <button label="Betal" name="pay_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Opkald" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Afslut kald" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Stemme kontroller" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_inventory_item.xml b/indra/newview/skins/default/xui/da/panel_inventory_item.xml
new file mode 100644
index 0000000000..d18047fbcf
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_inventory_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="inventory_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_landmark_info.xml b/indra/newview/skins/default/xui/da/panel_landmark_info.xml
index 202a4d4664..8503a41763 100644
--- a/indra/newview/skins/default/xui/da/panel_landmark_info.xml
+++ b/indra/newview/skins/default/xui/da/panel_landmark_info.xml
@@ -18,6 +18,7 @@
<string name="acquired_date">
[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
</string>
+ <button name="back_btn" tool_tip="Tilbage"/>
<text name="title" value="Sted profil"/>
<scroll_container name="place_scroll">
<panel name="scrolling_panel">
diff --git a/indra/newview/skins/default/xui/da/panel_landmarks.xml b/indra/newview/skins/default/xui/da/panel_landmarks.xml
index 47487832cb..9a0a2fb207 100644
--- a/indra/newview/skins/default/xui/da/panel_landmarks.xml
+++ b/indra/newview/skins/default/xui/da/panel_landmarks.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="Landmarks">
<accordion name="landmarks_accordion">
- <accordion_tab name="tab_favorites" title="Favorites bjælke"/>
- <accordion_tab name="tab_landmarks" title="Landemærker"/>
+ <accordion_tab name="tab_favorites" title="Favoritter"/>
+ <accordion_tab name="tab_landmarks" title="Mine landmærker"/>
<accordion_tab name="tab_inventory" title="Min beholdning"/>
<accordion_tab name="tab_library" title="Bibliotek"/>
</accordion>
diff --git a/indra/newview/skins/default/xui/da/panel_login.xml b/indra/newview/skins/default/xui/da/panel_login.xml
index c8c275d84d..d4bf9a7d78 100644
--- a/indra/newview/skins/default/xui/da/panel_login.xml
+++ b/indra/newview/skins/default/xui/da/panel_login.xml
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_login">
+ <panel.string name="create_account_url">
+ http://join.secondlife.com/
+ </panel.string>
<panel.string name="real_url">
http://secondlife.com/app/login/
</panel.string>
@@ -8,24 +11,31 @@
</panel.string>
<layout_stack name="login_widgets">
<layout_panel name="login">
- <text name="first_name_text">
- Fornavn:
+ <text name="username_text">
+ Brugernavn:
+ </text>
+ <line_editor label="Brugernavn" name="username_edit" tool_tip="[SECOND_LIFE] Brugernavn"/>
+ <text name="password_text">
+ Password:
</text>
- <line_editor label="Fornavn" name="first_name_edit" tool_tip="[SECOND_LIFE] First Name"/>
- <line_editor label="Efternavn" name="last_name_edit" tool_tip="[SECOND_LIFE] Last Name"/>
- <check_box label="Husk" name="remember_check"/>
+ <check_box label="Husk password" name="remember_check"/>
+ <button label="Log på" name="connect_btn"/>
<text name="start_location_text">
Start ved:
</text>
<combo_box name="start_location_combo">
+ <combo_box.item label="Min sidste lokation" name="MyLastLocation"/>
<combo_box.item label="Hjem" name="MyHome"/>
+ <combo_box.item label="&lt;Indtast regionnavn&gt;" name="Typeregionname"/>
</combo_box>
- <button label="Log på" name="connect_btn"/>
</layout_panel>
<layout_panel name="links">
<text name="create_new_account_text">
Opret bruger
</text>
+ <text name="forgot_password_text">
+ Glemt navn eller password?
+ </text>
<text name="login_help">
Hjælp til login
</text>
diff --git a/indra/newview/skins/default/xui/da/panel_main_inventory.xml b/indra/newview/skins/default/xui/da/panel_main_inventory.xml
index ac3a2844db..d6406939c1 100644
--- a/indra/newview/skins/default/xui/da/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/da/panel_main_inventory.xml
@@ -1,64 +1,28 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Ting" name="main inventory panel">
- <panel.string name="Title">
- Ting
+ <panel.string name="ItemcountFetching">
+ Henter [ITEM_COUNT] Genstande... [FILTER]
</panel.string>
+ <panel.string name="ItemcountCompleted">
+ [ITEM_COUNT] Genstande [FILTER]
+ </panel.string>
+ <text name="ItemcountText">
+ Genstande:
+ </text>
<filter_editor label="Filter" name="inventory search editor"/>
<tab_container name="inventory filter tabs">
<inventory_panel label="Alle ting" name="All Items"/>
- <inventory_panel label="Nye ting" name="Recent Items"/>
+ <recent_inventory_panel label="Nye ting" name="Recent Items"/>
</tab_container>
- <panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="Vis flere valgmuligheder"/>
- <button name="add_btn" tool_tip="Opret ny genstand"/>
- <dnd_button name="trash_btn" tool_tip="Fjern valgt genstand"/>
- </panel>
- <menu_bar name="Inventory Menu">
- <menu label="Filer" name="File">
- <menu_item_call label="Ã…ben" name="Open"/>
- <menu label="Send fil" name="upload">
- <menu_item_call label="Billede (L$[COST])..." name="Upload Image"/>
- <menu_item_call label="Lyd (L$[COST])..." name="Upload Sound"/>
- <menu_item_call label="Animation (L$[COST])..." name="Upload Animation"/>
- <menu_item_call label="Flere filer (L$[COST] pr. fil)..." name="Bulk Upload"/>
- </menu>
- <menu_item_call label="Nyt vindue" name="New Window"/>
- <menu_item_call label="Vis filtre" name="Show Filters"/>
- <menu_item_call label="Nulstil filtre" name="Reset Current"/>
- <menu_item_call label="Luk alle mapper" name="Close All Folders"/>
- <menu_item_call label="Tøm papirkurv" name="Empty Trash"/>
- <menu_item_call label="Tøm fundne genstande" name="Empty Lost And Found"/>
- </menu>
- <menu label="Opret" name="Create">
- <menu_item_call label="Ny mappe" name="New Folder"/>
- <menu_item_call label="Nyt script" name="New Script"/>
- <menu_item_call label="Ny note" name="New Note"/>
- <menu_item_call label="Ny bevægelse" name="New Gesture"/>
- <menu label="Nyt tøj" name="New Clothes">
- <menu_item_call label="Ny trøje" name="New Shirt"/>
- <menu_item_call label="Nye bukser" name="New Pants"/>
- <menu_item_call label="Nye sko" name="New Shoes"/>
- <menu_item_call label="Nye strømper" name="New Socks"/>
- <menu_item_call label="Ny jakke" name="New Jacket"/>
- <menu_item_call label="Ny nederdel" name="New Skirt"/>
- <menu_item_call label="Nye handsker" name="New Gloves"/>
- <menu_item_call label="Ny undertrøje" name="New Undershirt"/>
- <menu_item_call label="Nye underbukser" name="New Underpants"/>
- <menu_item_call label="Nyt alpha lag" name="New Alpha"/>
- <menu_item_call label="Ny tatovering" name="New Tattoo"/>
- </menu>
- <menu label="Nye kropsdele" name="New Body Parts">
- <menu_item_call label="Ny kropsbygning" name="New Shape"/>
- <menu_item_call label="Ny hud" name="New Skin"/>
- <menu_item_call label="Nyt hår" name="New Hair"/>
- <menu_item_call label="Nye øjne" name="New Eyes"/>
- </menu>
- </menu>
- <menu label="Sortér" name="Sort">
- <menu_item_check label="Efter navn" name="By Name"/>
- <menu_item_check label="Efter dato" name="By Date"/>
- <menu_item_check label="Altid mapper efter navn" name="Folders Always By Name"/>
- <menu_item_check label="System-mapper i toppen" name="System Folders To Top"/>
- </menu>
- </menu_bar>
+ <layout_stack name="bottom_panel">
+ <layout_panel name="options_gear_btn_panel">
+ <button name="options_gear_btn" tool_tip="Vis yderligere valg"/>
+ </layout_panel>
+ <layout_panel name="add_btn_panel">
+ <button name="add_btn" tool_tip="Tilføj ny genstand"/>
+ </layout_panel>
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="trash_btn" tool_tip="Fjern valgte genstand"/>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_me.xml b/indra/newview/skins/default/xui/da/panel_me.xml
index 2cfd358d13..f98ced5f91 100644
--- a/indra/newview/skins/default/xui/da/panel_me.xml
+++ b/indra/newview/skins/default/xui/da/panel_me.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Min profil" name="panel_me">
<tab_container name="tabs">
- <panel label="PROFIL" name="panel_profile"/>
- <panel label="FAVORITTER" name="panel_picks"/>
+ <panel label="MIN PROFIL" name="panel_profile"/>
+ <panel label="MINE FAVORITTER" name="panel_picks"/>
</tab_container>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_media_settings_general.xml b/indra/newview/skins/default/xui/da/panel_media_settings_general.xml
index 7f1581888d..48f08b9dfd 100644
--- a/indra/newview/skins/default/xui/da/panel_media_settings_general.xml
+++ b/indra/newview/skins/default/xui/da/panel_media_settings_general.xml
@@ -4,16 +4,16 @@
Hjemmeside:
</text>
<text name="home_fails_whitelist_label">
- (Denne side optræder ikke i godkendte sider)
+ (Siden er ikke på listen med godkendte sider)
</text>
- <line_editor name="home_url" tool_tip="Hjemmesiden for kilden til dette media"/>
+ <line_editor name="home_url" tool_tip="Hjemmesiden for kilden til dette medie"/>
<text name="preview_label">
Vis
</text>
<text name="current_url_label">
Nuværende side:
</text>
- <text name="current_url" tool_tip="Den nuværende hjemmeside for kilden til dette media" value=""/>
+ <text name="current_url" tool_tip="Nuværende side for kilden til dett medie" value=""/>
<button label="Nulstil" name="current_url_reset_btn"/>
<check_box initial_value="false" label="Gentag afspil" name="auto_loop"/>
<check_box initial_value="false" label="Første klik medfører interaktion" name="first_click_interact"/>
diff --git a/indra/newview/skins/default/xui/da/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/da/panel_media_settings_permissions.xml
index 70570920cd..84468eb2a7 100644
--- a/indra/newview/skins/default/xui/da/panel_media_settings_permissions.xml
+++ b/indra/newview/skins/default/xui/da/panel_media_settings_permissions.xml
@@ -11,10 +11,19 @@
Mini
</combo_item>
</combo_box>
+ <text name="owner_label">
+ Ejer
+ </text>
<check_box initial_value="false" label="Tillad navigation og interaktion" name="perms_owner_interact"/>
<check_box initial_value="false" label="Vis kontrol bjælke" name="perms_owner_control"/>
+ <text name="group_label">
+ Gruppe:
+ </text>
<check_box initial_value="false" label="Tillad navigation og interaktion" name="perms_group_interact"/>
<check_box initial_value="false" label="Vis kontrol bjælke" name="perms_group_control"/>
+ <text name="anyone_label">
+ Enhver
+ </text>
<check_box initial_value="false" label="Tillad navigation og interaktion" name="perms_anyone_interact"/>
<check_box initial_value="false" label="Vis kontrol bjælke" name="perms_anyone_control"/>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_media_settings_security.xml b/indra/newview/skins/default/xui/da/panel_media_settings_security.xml
index ee341f9142..278fe0eeea 100644
--- a/indra/newview/skins/default/xui/da/panel_media_settings_security.xml
+++ b/indra/newview/skins/default/xui/da/panel_media_settings_security.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Sikkerhed" name="Media Settings Security">
- <check_box initial_value="false" label="Tillad kun adgang til specifikke URL&apos;er (via &quot;prefix&quot;)" name="whitelist_enable"/>
+ <check_box initial_value="false" label="Tillad kun adgang til angivne URL mønstre" name="whitelist_enable"/>
<text name="home_url_fails_some_items_in_whitelist">
- Opslag som hjemmesiden fejler ved er markeret:
+ Angivelser som hjemmesiden fejler imod er markeret:
</text>
<button label="Tilføj" name="whitelist_add"/>
<button label="Slet" name="whitelist_del"/>
<text name="home_url_fails_whitelist">
- Advarsel: Hjemmesiden angive i &quot;Generelt&quot; fanen er ikke indeholdt i godkendte sider. Den er slået fra, indtil en gyldig værdi er tilføjet.
+ Advarsel: hjemmesiden specificeret i Generelt fanen opfylder ikke krav på listen med godkendte URL. Den er de-aktiveret indtil en gyldig hjemmeside er tilføjet.
</text>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_my_profile.xml b/indra/newview/skins/default/xui/da/panel_my_profile.xml
index 1dffc73239..7eb3c9f4e5 100644
--- a/indra/newview/skins/default/xui/da/panel_my_profile.xml
+++ b/indra/newview/skins/default/xui/da/panel_my_profile.xml
@@ -1,37 +1,35 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Profil" name="panel_profile">
<string name="no_partner_text" value="Ingen"/>
+ <string name="no_group_text" value="Ingen"/>
<string name="RegisterDateFormat">
[REG_DATE] ([AGE])
</string>
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <panel name="second_life_image_panel">
- <icon label="" name="2nd_life_edit_icon" tool_tip="Klik på Rediger Profil knappen nedenfor for at ændre billede"/>
- </panel>
- <panel name="first_life_image_panel">
- <icon label="" name="real_world_edit_icon" tool_tip="Klik på Rediger Profil knappen nedenfor for at ændre billede"/>
- <text name="title_rw_descr_text" value="RL:"/>
- </panel>
- <text name="me_homepage_text">
- Web:
- </text>
- <text name="title_member_text" value="Medlem siden:"/>
- <text name="title_acc_status_text" value="Konto:"/>
- <text name="acc_status_text" value="Beboer. Ingen betalingsinfo"/>
- <text name="title_partner_text" value="Partner:"/>
- <text name="title_groups_text" value="Grupper:"/>
- </panel>
- </scroll_container>
- <panel name="profile_buttons_panel">
- <button label="Tilføj ven" name="add_friend"/>
- <button label="IM" name="im"/>
- <button label="Opkald" name="call"/>
- <button label="Kort" name="show_on_map_btn"/>
- <button label="Teleportér" name="teleport"/>
- </panel>
- <panel name="profile_me_buttons_panel">
- <button label="Rediger profil" name="edit_profile_btn" tool_tip="Redigér personlig information"/>
- <button label="Ændre udseende" name="edit_appearance_btn" tool_tip="Ændre dit udseende: fysiske data, tøj m.v."/>
- </panel>
+ <layout_stack name="layout">
+ <layout_panel name="profile_stack">
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="second_life_image_panel">
+ <icon label="" name="2nd_life_edit_icon" tool_tip="Klik på Redigér profil knappen forneden for at ændre billede"/>
+ <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <icon label="" name="real_world_edit_icon" tool_tip="Klik på Redigér profil knappen forneden for at ændre billede"/>
+ <text name="title_rw_descr_text" value="Real World:"/>
+ </panel>
+ <text name="title_member_text" value="Beboer siden:"/>
+ <text name="title_acc_status_text" value="Konto status:"/>
+ <text name="title_partner_text" value="Partner:"/>
+ <panel name="partner_data_panel">
+ <name_box initial_value="(henter)" name="partner_text"/>
+ </panel>
+ <text name="title_groups_text" value="Grupper:"/>
+ </panel>
+ </scroll_container>
+ </layout_panel>
+ <layout_panel name="profile_me_buttons_panel">
+ <button label="Redigér profil" name="edit_profile_btn" tool_tip="Redigér din personlige information"/>
+ <button label="Rediger udseende" name="edit_appearance_btn" tool_tip="Opret/tilret dit udseende: fysiske data, tøj m.v."/>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_navigation_bar.xml b/indra/newview/skins/default/xui/da/panel_navigation_bar.xml
index 465bc75a1b..2ee87433a4 100644
--- a/indra/newview/skins/default/xui/da/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/da/panel_navigation_bar.xml
@@ -1,15 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="navigation_bar">
<panel name="navigation_panel">
- <button name="back_btn" tool_tip="GÃ¥ tilbage til min forrige lokation"/>
- <button name="forward_btn" tool_tip="GÃ¥ en lokation fremad"/>
+ <pull_button name="back_btn" tool_tip="GÃ¥ tilbage til min forrige lokation"/>
+ <pull_button name="forward_btn" tool_tip="GÃ¥ en lokation fremad"/>
<button name="home_btn" tool_tip="Teleport til min hjemme lokation"/>
<location_input label="Lokation" name="location_combo"/>
<search_combo_box label="Søg" name="search_combo_box" tool_tip="Søg">
<combo_editor label="Søg [SECOND_LIFE]" name="search_combo_editor"/>
</search_combo_box>
</panel>
- <favorites_bar name="favorite">
+ <favorites_bar name="favorite" tool_tip="Træk landemærker hertil for at få hurtig adgang til dine favoritsteder i Second Life!">
+ <label name="favorites_bar_label" tool_tip="Træk landemærker hertil for at få hurtig adgang til dine favoritsteder i Second Life!">
+ Favoritter
+ </label>
<chevron_button name="&gt;&gt;" tool_tip="Søg mere af mine favoritter"/>
</favorites_bar>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/da/panel_nearby_chat_bar.xml
index 2aa7ed7c6c..949cbcbd7b 100644
--- a/indra/newview/skins/default/xui/da/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/da/panel_nearby_chat_bar.xml
@@ -1,11 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="chat_bar">
- <string name="min_width">
- 192
- </string>
- <string name="max_width">
- 320
- </string>
<line_editor label="Klik her for at chatte." name="chat_box" tool_tip="Tryk på enter for at tale, Ctrl-Enter for at råbe."/>
<button name="show_nearby_chat" tool_tip="Viser/skjuler log for chat nærved"/>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_nearby_media.xml b/indra/newview/skins/default/xui/da/panel_nearby_media.xml
new file mode 100644
index 0000000000..95bfc89f20
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_nearby_media.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_media">
+ <string name="media_item_count_format">
+ (%ld media items)
+ </string>
+ <string name="empty_item_text">
+ &lt;tom&gt;
+ </string>
+ <string name="parcel_media_name">
+ Streaming Media dette sted
+ </string>
+ <string name="parcel_audio_name">
+ Streaming Audio dette sted
+ </string>
+ <string name="playing_suffix">
+ (afspilles)
+ </string>
+ <panel name="minimized_controls">
+ <button label="Stop alt" name="all_nearby_media_disable_btn" tool_tip="Stop al media tæt på"/>
+ <button label="Start alt" name="all_nearby_media_enable_btn" tool_tip="Tænd al media tæt på"/>
+ <button name="open_prefs_btn" tool_tip="Vis media preferencer"/>
+ <button label="Mere &gt;&gt;" label_selected="Mindre &lt;&lt;" name="more_btn" tool_tip="Advancerede kontroller"/>
+ <button label="Mere &gt;&gt;" label_selected="Mindre &lt;&lt;" name="less_btn" tool_tip="Advancerede kontroller"/>
+ </panel>
+ <panel name="nearby_media_panel">
+ <combo_box name="show_combo">
+ <combo_box.item label="Overalt" name="All"/>
+ <combo_box.item label="PÃ¥ dette sted" name="WithinParcel"/>
+ <combo_box.item label="Udenfor dette sted" name="OutsideParcel"/>
+ <combo_box.item label="PÃ¥ andre avatarer" name="OnOthers"/>
+ </combo_box>
+ <scroll_list name="media_list">
+ <scroll_list.columns label="I nærheden" name="media_proximity"/>
+ <scroll_list.columns label="Synligt" name="media_visibility"/>
+ <scroll_list.columns label="Klasse" name="media_class"/>
+ <scroll_list.columns label="Navn" name="media_name"/>
+ <scroll_list.columns label="Debug" name="media_debug"/>
+ </scroll_list>
+ <panel>
+ <layout_stack name="media_controls">
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="Stop valgte medie"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="Afspil valgte medie"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="Pause valgt medie"/>
+ </layout_panel>
+ <layout_panel name="volume_slider_ctrl">
+ <slider_bar initial_value="0.5" name="volume_slider" tool_tip="Lydstyrke for valgte medie"/>
+ </layout_panel>
+ <layout_panel name="mute">
+ <button name="mute_btn" tool_tip="Sluk lyd fra valgte medie"/>
+ </layout_panel>
+ <layout_panel name="zoom">
+ <button name="zoom_btn" tool_tip="Zoom til valgte medie"/>
+ </layout_panel>
+ <layout_panel name="unzoom">
+ <button name="unzoom_btn" tool_tip="Zoom tilbage fra valgte medie"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_notes.xml b/indra/newview/skins/default/xui/da/panel_notes.xml
index f8d911b9e5..5b3a2d0906 100644
--- a/indra/newview/skins/default/xui/da/panel_notes.xml
+++ b/indra/newview/skins/default/xui/da/panel_notes.xml
@@ -13,10 +13,10 @@
</scroll_container>
</panel>
<panel name="notes_buttons_panel">
- <button label="Tilføj" name="add_friend" tool_tip="Tilbyd venskab til beboeren"/>
+ <button label="Tilføj ven" name="add_friend" tool_tip="Tilbyd venskab til beboer"/>
<button label="IM" name="im" tool_tip="Ã…ben session med personlig besked (IM)"/>
<button label="Kald" name="call" tool_tip="Opkald til denne beboer"/>
- <button label="Kort" name="show_on_map_btn" tool_tip="Vis beboeren på kortet"/>
+ <button label="Kort" name="show_on_map_btn" tool_tip="Vis beboer på kort"/>
<button label="Teleport" name="teleport" tool_tip="Tilbyd teleport"/>
</panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/da/panel_online_status.xml b/indra/newview/skins/default/xui/da/panel_online_status.xml
new file mode 100644
index 0000000000..fdc489f375
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_online_status.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="friend_online_status" name="friend_online_status"/>
diff --git a/indra/newview/skins/default/xui/da/panel_online_status_toast.xml b/indra/newview/skins/default/xui/da/panel_online_status_toast.xml
new file mode 100644
index 0000000000..fdc489f375
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_online_status_toast.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="friend_online_status" name="friend_online_status"/>
diff --git a/indra/newview/skins/default/xui/da/panel_outfit_edit.xml b/indra/newview/skins/default/xui/da/panel_outfit_edit.xml
new file mode 100644
index 0000000000..9aa9fd14cc
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_outfit_edit.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray Outfit Edit panel -->
+<panel label="Redigér sæt" name="outfit_edit">
+ <string name="No Outfit" value="Intet sæt"/>
+ <string name="unsaved_changes" value="Ikke gemte ændringer"/>
+ <string name="now_editing" value="Redigerer nu"/>
+ <panel.string name="not_available">
+ (Ikke relevant)
+ </panel.string>
+ <panel.string name="unknown">
+ (ukendt)
+ </panel.string>
+ <string name="Filter.All" value="Alle"/>
+ <string name="Filter.Clothes/Body" value="Tøj/Krop"/>
+ <string name="Filter.Objects" value="Objekter"/>
+ <button label="redigér" name="edit_wearable_btn"/>
+ <text name="title" value="Redigér sæt"/>
+ <panel label="bottom_panel" name="header_panel">
+ <panel label="bottom_panel" name="outfit_name_and_status">
+ <text name="status" value="Redigerer nu..."/>
+ <text name="curr_outfit_name" value="[Current Outfit]"/>
+ </panel>
+ </panel>
+ <layout_stack name="im_panels">
+ <layout_panel label="IM kontrolpanel" name="outfit_wearables_panel">
+ <panel label="bottom_panel" name="edit_panel"/>
+ </layout_panel>
+ <layout_panel name="add_wearables_panel">
+ <text name="add_to_outfit_label" value="Tilføj til sæt:"/>
+ <layout_stack name="filter_panels">
+ <layout_panel label="IM kontrolpanel" name="filter_panel">
+ <filter_editor label="Filter" name="look_item_filter"/>
+ </layout_panel>
+ </layout_stack>
+ <panel label="add_wearables_button_bar" name="add_wearables_button_bar">
+ <button label="F" name="folder_view_btn"/>
+ <button label="L" name="list_view_btn"/>
+ </panel>
+ </layout_panel>
+ </layout_stack>
+ <panel name="save_revert_button_bar">
+ <button label="Gem" name="save_btn"/>
+ <button label="Gendan" name="revert_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/da/panel_outfits_inventory.xml
index 7d6401283e..681701aba2 100644
--- a/indra/newview/skins/default/xui/da/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/da/panel_outfits_inventory.xml
@@ -1,7 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="Outfits">
- <accordion name="outfits_accordion">
- <accordion_tab name="tab_cof" title="Nuværende sæt"/>
- <accordion_tab name="tab_outfits" title="Mine sæt"/>
- </accordion>
+<panel label="Ting" name="Outfits">
+ <tab_container name="appearance_tabs">
+ <panel label="MINE SÆT" name="outfitslist_tab"/>
+ <inventory_panel label="HAR PÃ…" name="cof_tab"/>
+ </tab_container>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Vis flere muligheder"/>
+ <dnd_button name="trash_btn" tool_tip="Fjern valgte genstand"/>
+ <button label="Gem sæt" name="make_outfit_btn" tool_tip="Gem udseende som nyt sæt"/>
+ <button label="Tag på" name="wear_btn" tool_tip="Tag valgte sæt på"/>
+ <button label="Redigér sæt" name="edit_current_outfit_btn"/>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/da/panel_outfits_inventory_gear_default.xml
index a6a796f612..7b6469023b 100644
--- a/indra/newview/skins/default/xui/da/panel_outfits_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/da/panel_outfits_inventory_gear_default.xml
@@ -4,6 +4,6 @@
<menu_item_call label="Tilføj til nuværende sæt" name="add"/>
<menu_item_call label="Fjern fra nuværende sæt" name="remove"/>
<menu_item_call label="Omdøb" name="rename"/>
- <menu_item_call label="Fjern" name="remove_link"/>
- <menu_item_call label="Slet" name="delete"/>
+ <menu_item_call label="Fjern link" name="remove_link"/>
+ <menu_item_call label="Slet sæt" name="delete"/>
</menu>
diff --git a/indra/newview/skins/default/xui/da/panel_people.xml b/indra/newview/skins/default/xui/da/panel_people.xml
index 07b7f60810..5d8474259c 100644
--- a/indra/newview/skins/default/xui/da/panel_people.xml
+++ b/indra/newview/skins/default/xui/da/panel_people.xml
@@ -1,33 +1,43 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Side tray panel -->
<panel label="Personer" name="people_panel">
- <string name="no_people" value="Ingen personer"/>
- <string name="no_one_near" value="Ingen tæt på"/>
+ <string name="no_recent_people" value="Ingen tidligere personer. Leder du efter nogen at være sammen med? Prøv [secondlife:///app/search/people Search] eller [secondlife:///app/worldmap World Map]."/>
+ <string name="no_filtered_recent_people" value="Fandt du ikke det du søgte? Prøv [secondlife:///app/search/people/[SEARCH_TERM] Search]."/>
+ <string name="no_one_near" value="Ingen i nærheden. Leder du efter nogen at være sammen med? Prøv [secondlife:///app/search/people Search] eller [secondlife:///app/worldmap World Map]."/>
+ <string name="no_one_filtered_near" value="Fandt du ikke det du søgte? Prøv [secondlife:///app/search/people/[SEARCH_TERM] Search]."/>
<string name="no_friends_online" value="Ingen venner online"/>
<string name="no_friends" value="Ingen venner"/>
- <string name="no_groups" value="Ingen grupper"/>
+ <string name="no_friends_msg">
+ Find venner via [secondlife:///app/search/people Search] eller højre-klik på en beboer og tilføj dem som venner.
+Leder du efter nogen at være sammen med? Prøv [secondlife:///app/worldmap World Map].
+ </string>
+ <string name="no_filtered_friends_msg">
+ Fandt du ikke det du søgte? Prøv [secondlife:///app/search/people/[SEARCH_TERM] Search].
+ </string>
<string name="people_filter_label" value="Filtrér personer"/>
<string name="groups_filter_label" value="Filtrér grupper"/>
+ <string name="no_filtered_groups_msg" value="Fandt du ikke det du søgte? Prøv [secondlife:///app/search/groups/[SEARCH_TERM] Search]."/>
+ <string name="no_groups_msg" value="Leder du efter grupper at være med i? Prøv [secondlife:///app/search/groups Search]."/>
<filter_editor label="Filtrér" name="filter_input"/>
<tab_container name="tabs">
<panel label="TÆT PÅ" name="nearby_panel">
<panel label="bottom_panel" name="bottom_panel">
<button name="nearby_view_sort_btn" tool_tip="Valg"/>
- <button name="add_friend_btn" tool_tip="Tilføjer valgte beboere til din venneliste"/>
+ <button name="add_friend_btn" tool_tip="Tilføj valgte beboer til din venneliste"/>
</panel>
</panel>
- <panel label="VENNER" name="friends_panel">
+ <panel label="MINE VENNER" name="friends_panel">
<accordion name="friends_accordion">
<accordion_tab name="tab_online" title="Online"/>
<accordion_tab name="tab_all" title="Alle"/>
</accordion>
<panel label="bottom_panel" name="bottom_panel">
<button name="friends_viewsort_btn" tool_tip="Valg"/>
- <button name="add_btn" tool_tip="Tilbyd venskab til beboer"/>
+ <button name="add_btn" tool_tip="Tilbyd venskab til en beboer"/>
<button name="del_btn" tool_tip="Fjern valgte person fra din venneliste"/>
</panel>
</panel>
- <panel label="GRUPPER" name="groups_panel">
+ <panel label="MINE GRUPPER" name="groups_panel">
<panel label="bottom_panel" name="bottom_panel">
<button name="groups_viewsort_btn" tool_tip="Valg"/>
<button name="plus_btn" tool_tip="Bliv medlem af gruppe/Opret ny gruppe"/>
@@ -37,17 +47,18 @@
<panel label="NYLIGE" name="recent_panel">
<panel label="bottom_panel" name="bottom_panel">
<button name="recent_viewsort_btn" tool_tip="Valg"/>
- <button name="add_friend_btn" tool_tip="Tilføj valgte person til din venneliste"/>
+ <button name="add_friend_btn" tool_tip="Tilføj valgte beboer til din venneliste"/>
</panel>
</panel>
</tab_container>
<panel name="button_bar">
- <button label="Profil" name="view_profile_btn" tool_tip="Vis billede, grupper og anden information om beboer"/>
+ <button label="Profil" name="view_profile_btn" tool_tip="Vis billede, gruppe og anden information om beboer"/>
<button label="IM" name="im_btn" tool_tip="Chat privat med denne person"/>
<button label="Opkald" name="call_btn" tool_tip="Opkald til denne beboer"/>
- <button label="Del" name="share_btn"/>
+ <button label="Del" name="share_btn" tool_tip="Del en genstand i beholdning"/>
<button label="Teleport" name="teleport_btn" tool_tip="Tilbyd teleport"/>
<button label="Group profil" name="group_info_btn" tool_tip="Vis gruppe information"/>
<button label="Gruppe chat" name="chat_btn" tool_tip="Ã…ben chat session"/>
+ <button label="Gruppe opkald" name="group_call_btn" tool_tip="Opkald til denne gruppe"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_place_profile.xml b/indra/newview/skins/default/xui/da/panel_place_profile.xml
index 24316fea14..05ef22328f 100644
--- a/indra/newview/skins/default/xui/da/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/da/panel_place_profile.xml
@@ -6,7 +6,7 @@
<string name="available" value="ledig"/>
<string name="allocated" value="fordelt"/>
<string name="title_place" value="Sted profil"/>
- <string name="title_teleport_history" value="Teleport historik sted"/>
+ <string name="title_teleport_history" value="Teleport historik"/>
<string name="not_available" value="(N\A)"/>
<string name="unknown" value="(ukendt)"/>
<string name="public" value="(offentlig)"/>
@@ -41,6 +41,7 @@
<string name="acquired_date">
[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
</string>
+ <button name="back_btn" tool_tip="Tilbage"/>
<text name="title" value="Sted profil"/>
<scroll_container name="place_scroll">
<panel name="scrolling_panel">
@@ -48,16 +49,16 @@
<text name="maturity_value" value="ukendt"/>
<accordion name="advanced_info_accordion">
<accordion_tab name="parcel_characteristics_tab" title="Parcel">
- <panel>
+ <panel name="parcel_characteristics_panel">
<text name="rating_label" value="Rating:"/>
<text name="rating_value" value="ukendt"/>
- <text name="voice_label" value="Stem:"/>
+ <text name="voice_label" value="Stemme:"/>
<text name="voice_value" value="Til"/>
- <text name="fly_label" value="Flyve:"/>
+ <text name="fly_label" value="Flyv:"/>
<text name="fly_value" value="Til"/>
<text name="push_label" value="Skub:"/>
<text name="push_value" value="Fra"/>
- <text name="build_label" value="Byg:"/>
+ <text name="build_label" value="Bygge:"/>
<text name="build_value" value="Til"/>
<text name="scripts_label" value="Scripts:"/>
<text name="scripts_value" value="Til"/>
@@ -67,17 +68,24 @@
</panel>
</accordion_tab>
<accordion_tab name="region_information_tab" title="Region">
- <panel>
+ <panel name="region_information_panel">
<text name="region_name_label" value="Region:"/>
+ <text name="region_name" value="Mooseland"/>
<text name="region_type_label" value="Type:"/>
+ <text name="region_type" value="Moose"/>
<text name="region_rating_label" value="Rating:"/>
+ <text name="region_rating" value="Voksent"/>
<text name="region_owner_label" value="Ejer:"/>
+ <text name="region_owner" value="moose Van Moose"/>
<text name="region_group_label" value="Gruppe:"/>
+ <text name="region_group">
+ The Mighty Moose of mooseville soundvillemoose
+ </text>
<button label="Region/Estate" name="region_info_btn"/>
</panel>
</accordion_tab>
<accordion_tab name="estate_information_tab" title="Estate">
- <panel>
+ <panel name="estate_information_panel">
<text name="estate_name_label" value="Estate:"/>
<text name="estate_rating_label" value="Rating:"/>
<text name="estate_owner_label" value="Ejer:"/>
@@ -85,14 +93,14 @@
</panel>
</accordion_tab>
<accordion_tab name="sales_tab" title="Til salg">
- <panel>
+ <panel name="sales_panel">
<text name="sales_price_label" value="Pris:"/>
<text name="area_label" value="Areal:"/>
<text name="traffic_label" value="Trafik:"/>
<text name="primitives_label" value="Prims:"/>
<text name="parcel_scripts_label" value="Scripts:"/>
- <text name="terraform_limits_label" value="Terraform begrænsninger:"/>
- <text name="subdivide_label" value="Mulighed for at Opdele/samle:"/>
+ <text name="terraform_limits_label" value="Begræns terrænredigering:"/>
+ <text name="subdivide_label" value="Opdel/saml mulighed:"/>
<text name="resale_label" value="Mulighed for videresalg:"/>
<text name="sale_to_label" value="Til salg til:"/>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_places.xml b/indra/newview/skins/default/xui/da/panel_places.xml
index 052bf749cb..c06176f994 100644
--- a/indra/newview/skins/default/xui/da/panel_places.xml
+++ b/indra/newview/skins/default/xui/da/panel_places.xml
@@ -2,13 +2,15 @@
<panel label="Steder" name="places panel">
<string name="landmarks_tab_title" value="MINE LANDEMÆRKER"/>
<string name="teleport_history_tab_title" value="TELEPORT HISTORIK"/>
- <filter_editor label="Filtrér steder" name="Filter"/>
+ <filter_editor label="Filtrér mine steder" name="Filter"/>
<panel name="button_panel">
- <button label="Teleportér" name="teleport_btn"/>
+ <button label="Teleportér" name="teleport_btn" tool_tip="Teleportér til det valgte område"/>
<button label="Kort" name="map_btn"/>
- <button label="Redigér" name="edit_btn"/>
- <button label="Luk" name="close_btn"/>
- <button label="Annullér" name="cancel_btn"/>
+ <button label="Redigér" name="edit_btn" tool_tip="Redigér landemærke information"/>
+ <button label="â–¼" name="overflow_btn" tool_tip="Vise flere valgmuligheder"/>
<button label="Gem" name="save_btn"/>
+ <button label="Annullér" name="cancel_btn"/>
+ <button label="Luk" name="close_btn"/>
+ <button label="Profil" name="profile_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml
index 87b749b4eb..807d7939b8 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_advanced.xml
@@ -1,27 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
-<panel name="advanced">
- <panel.string name="resolution_format">
- [RES_X] x [RES_Y]
- </panel.string>
+<panel label="Avanceret" name="advanced">
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
- <check_box label="Talebobler" name="bubble_text_chat"/>
- <color_swatch name="background" tool_tip="Vælg farve for talebobler"/>
- <slider label="Gennemsigtighed" name="bubble_chat_opacity"/>
- <text name="AspectRatioLabel1" tool_tip="bredde / højde">
- Format
- </text>
- <combo_box name="aspect_ratio" tool_tip="bredde/ højde">
- <combo_box.item label="4:3 (Standard CRT)" name="item1"/>
- <combo_box.item label="5:4 (1280x1024 LCD)" name="item2"/>
- <combo_box.item label="8:5 (Widescreen)" name="item3"/>
- <combo_box.item label="16:9 (Widescreen)" name="item4"/>
- </combo_box>
- <check_box label="Registrér automatisk" name="aspect_auto_detect"/>
- <text name="heading1">
- Kamera:
- </text>
+ <panel.string name="middle_mouse">
+ Midterste mus
+ </panel.string>
<slider label="Synsvinkel" name="camera_fov"/>
<slider label="Distance" name="camera_offset_scale"/>
<text name="heading2">
@@ -29,20 +13,25 @@
</text>
<check_box label="Byg/Redigér" name="edit_camera_movement" tool_tip="Benyt automatisk kamera positionering ved start og slut af editerings modus"/>
<check_box label="Udseende" name="appearance_camera_movement" tool_tip="Benyt automatisk kamera positionering ved redigering"/>
- <text name="heading3">
- Avatarer:
- </text>
+ <check_box initial_value="1" label="Sidepanel" name="appearance_sidebar_positioning" tool_tip="Benyt automatisk positionering af kamera"/>
<check_box label="Vis avatar i førsteperson" name="first_person_avatar_visible"/>
<check_box label="Piletaster bruges altid til bevægelse" name="arrow_keys_move_avatar_check"/>
<check_box label="Tast-tast-hold for at løbe" name="tap_tap_hold_to_run"/>
<check_box label="Bevæg avatarlæber når der tales" name="enable_lip_sync"/>
- <check_box label="Vis scriptfejl" name="show_script_errors"/>
+ <check_box label="Talebobler" name="bubble_text_chat"/>
+ <slider label="Synlighed" name="bubble_chat_opacity"/>
+ <color_swatch name="background" tool_tip="Vælg farve for talebobler"/>
+ <text name="UI Size:">
+ Brugerflade størrelse
+ </text>
+ <check_box label="Vis script fejl i:" name="show_script_errors"/>
<radio_group name="show_location">
- <radio_item label="I chat" name="0"/>
- <radio_item label="I et vindue" name="1"/>
+ <radio_item label="Chat" name="0"/>
+ <radio_item label="Separat vindue" name="1"/>
</radio_group>
- <check_box label="Knap til aktivering af mikrofon:" name="push_to_talk_toggle_check" tool_tip="I walkie-talkie-modus sendes stemme kun når knappen er trykket ned, ellers vil tryk på knap tænde og slukke mikrofon."/>
+ <check_box label="Knap til aktiverering af mikrofon:" name="push_to_talk_toggle_check" tool_tip="I walkie-talkie-modus sendes stemme kun når knappen er trykket ned, ellers vil tryk på knap tænde og slukke mikrofon."/>
<line_editor label="Brug walkie-talkie modus" name="modifier_combo"/>
<button label="Angiv taste" name="set_voice_hotkey_button"/>
- <button label="Midterste museknap" name="set_voice_middlemouse_button"/>
+ <button label="Midterste museknap" name="set_voice_middlemouse_button" tool_tip="Nulstil til midterste musetaste"/>
+ <button label="Andre enheder" name="joystick_setup_button"/>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/da/panel_preferences_alerts.xml
index 4791033757..7caa17d514 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_alerts.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_alerts.xml
@@ -4,11 +4,11 @@
Vis mig når:
</text>
<check_box label="Når jeg bruger eller får L$" name="notify_money_change_checkbox"/>
- <check_box label="Når mine venner logger af eller på" name="friends_online_notify_checkbox"/>
+ <check_box label="Når mine venner logger på eller af" name="friends_online_notify_checkbox"/>
<text name="show_label">
- Vis altid disse beskeder:
+ Vis altid:
</text>
<text name="dont_show_label">
- Vis aldrig disse beskeder:
+ Vis aldrig:
</text>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml
index 609512bc1b..20a376f152 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml
@@ -1,10 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Tekst chat" name="chat">
+ <text name="font_size">
+ Skriftstørrelse:
+ </text>
<radio_group name="chat_font_size">
- <radio_item label="Lille" name="radio"/>
- <radio_item label="Mellem" name="radio2"/>
- <radio_item label="Stor" name="radio3"/>
+ <radio_item label="Lille" name="radio" value="0"/>
+ <radio_item label="Mellem" name="radio2" value="1"/>
+ <radio_item label="Stor" name="radio3" value="2"/>
</radio_group>
+ <text name="font_colors">
+ Skriftfarve:
+ </text>
<color_swatch label="Dig" name="user"/>
<text name="text_box1">
Dig
@@ -39,8 +45,15 @@
</text>
<check_box initial_value="true" label="Afspil skrive animation ved chat" name="play_typing_animation"/>
<check_box label="Send e-mail til mig når jeg modtager IM og er offline" name="send_im_to_email"/>
- <radio_group name="chat_window" tool_tip="Vis dine personlige beskeder i separate vinduer eller i ét vindue med mange faner (ændring kræver genstart)">
- <radio_item label="Flere vinduer" name="radio"/>
- <radio_item label="Et vindue" name="radio2"/>
+ <check_box label="Ã…ben for almindelig tekst i IM og chat historik" name="plain_text_chat_history"/>
+ <text name="show_ims_in_label">
+ Vis IM&apos;er i:
+ </text>
+ <text name="requires_restart_label">
+ (kræver genstart)
+ </text>
+ <radio_group name="chat_window" tool_tip="Vise dine personlige beskeder i separate vinduer, eller i ét vindue med flere faner (Kræver genstart)">
+ <radio_item label="Separate vinduer" name="radio" value="0"/>
+ <radio_item label="Faner" name="radio2" value="1"/>
</radio_group>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_general.xml b/indra/newview/skins/default/xui/da/panel_preferences_general.xml
index e17ccca4a1..e70cb48262 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_general.xml
@@ -23,7 +23,7 @@
<text name="maturity_desired_textbox"/>
<combo_box name="maturity_desired_combobox">
<combo_box.item label="PG, Mature og Adult" name="Desired_Adult"/>
- <combo_box.item label="PG and Mature" name="Desired_Mature"/>
+ <combo_box.item label="PG og Mature" name="Desired_Mature"/>
<combo_box.item label="PG" name="Desired_PG"/>
</combo_box>
<text name="start_location_textbox">
@@ -38,9 +38,9 @@
Navneskilte:
</text>
<radio_group name="Name_Tag_Preference">
- <radio_item label="Skjul" name="radio"/>
- <radio_item label="Vis" name="radio2"/>
- <radio_item label="Vis et øjeblik" name="radio3"/>
+ <radio_item label="Skjul" name="radio" value="0"/>
+ <radio_item label="Vis" name="radio2" value="1"/>
+ <radio_item label="Vis et øjeblik" name="radio3" value="2"/>
</radio_group>
<check_box label="Vis mit navn" name="show_my_name_checkbox1"/>
<check_box initial_value="true" label="Små avatar navne" name="small_avatar_names_checkbox"/>
@@ -48,14 +48,17 @@
<text name="effects_color_textbox">
Farve til mine effekter:
</text>
- <color_swatch label="" name="effect_color_swatch" tool_tip="Klik for at åbne farvevælger"/>
<text name="title_afk_text">
Tid inden &quot;væk&quot;:
</text>
- <spinner label="Tid før inaktiv:" name="afk_timeout_spinner"/>
- <text name="seconds_textbox">
- sekunder
- </text>
+ <color_swatch label="" name="effect_color_swatch" tool_tip="Klik for at åbne farvevælger"/>
+ <combo_box label="Timeout før &apos;væk&apos;:" name="afk">
+ <combo_box.item label="2 minutter" name="item0"/>
+ <combo_box.item label="5 minutter" name="item1"/>
+ <combo_box.item label="10 minutter" name="item2"/>
+ <combo_box.item label="30 minutter" name="item3"/>
+ <combo_box.item label="aldrig" name="item4"/>
+ </combo_box>
<text name="text_box3">
Optaget autosvar:
</text>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml
index bb1cacc773..586896041d 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_graphics1.xml
@@ -1,8 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Grafik" name="Display panel">
- <text name="UI Size:">
- UI størrelse:
- </text>
<text name="QualitySpeed">
Kvalitet og hastighed:
</text>
@@ -53,6 +50,10 @@
m
</text>
<slider label="Maks. antal partikler:" name="MaxParticleCount"/>
+ <slider label="Maks. avatar optegningsafstand:" name="MaxAvatarDrawDistance"/>
+ <text name="DrawDistanceMeterText3">
+ m
+ </text>
<slider label="Efterbehandlingskvalitet:" name="RenderPostProcess"/>
<text name="MeshDetailText">
Netmaske detaljer:
@@ -88,8 +89,8 @@
Lys detaljer:
</text>
<radio_group name="LightingDetailRadio">
- <radio_item label="Kun sol og måne" name="SunMoon"/>
- <radio_item label="Lys i nærheden" name="LocalLights"/>
+ <radio_item label="Kun sol og måne" name="SunMoon" value="0"/>
+ <radio_item label="Lys i nærheden" name="LocalLights" value="1"/>
</radio_group>
<text name="TerrainDetailText">
Terræn detaljer:
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/da/panel_preferences_privacy.xml
index c382b222ea..cdb407dbad 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_privacy.xml
@@ -3,7 +3,7 @@
<panel.string name="log_in_to_change">
log på for at ændre
</panel.string>
- <button label="Nulstil historik" name="clear_cache"/>
+ <button label="Nulstil historik" name="clear_cache" tool_tip="Fjern login billede, sidste lokation, teleport historik, samt web og tekstur cache"/>
<text name="cache_size_label_l">
(Lokationer, billeder, web, søge historik)
</text>
@@ -11,7 +11,6 @@
<check_box label="Kun venner og grupper kan sende besked til mig" name="voice_call_friends_only_check"/>
<check_box label="Slå mikrofon fra når opkald slutter" name="auto_disengage_mic_check"/>
<check_box label="Acceptér cookies" name="cookies_enabled"/>
- <check_box label="Tillad media autoplay" name="autoplay_enabled"/>
<text name="Logs:">
Logs:
</text>
@@ -19,7 +18,7 @@
<check_box label="Gem en log med private beskeder (IM) på min computer" name="log_instant_messages"/>
<check_box label="Tilføj tidsstempel" name="show_timestamps_check_im"/>
<text name="log_path_desc">
- Placering af logfiler
+ Placering af logfiler:
</text>
<button label="Ændre sti" label_selected="Ændre sti" left="150" name="log_path_button"/>
<button label="Liste med blokeringer" name="block_list"/>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_setup.xml b/indra/newview/skins/default/xui/da/panel_preferences_setup.xml
index 2dd0b71d8f..38bc9c0a2a 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_setup.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Input og kamera" name="Input panel">
+<panel label="Opsætning" name="Input panel">
<button label="Andre enheder" name="joystick_setup_button"/>
<text name="Mouselook:">
Første person:
@@ -18,29 +18,32 @@
kbps
</text>
<check_box label="Speciel port" name="connection_port_enabled"/>
- <spinner label="Port nummer:" name="web_proxy_port"/>
+ <spinner label="Port nummer:" name="connection_port"/>
<text name="cache_size_label_l">
Cache størrelse
</text>
<text name="text_box5">
MB
</text>
- <button label="Vælg" label_selected="Vælg" name="set_cache"/>
- <button label="Nulstil" label_selected="Gem" name="reset_cache"/>
<text name="Cache location">
- Cache lokation
+ Cache placering:
</text>
+ <button label="Vælg" label_selected="Vælg" name="set_cache"/>
+ <button label="Nulstil" label_selected="Nulstil" name="reset_cache"/>
<text name="Web:">
Web:
</text>
<radio_group name="use_external_browser">
- <radio_item label="Benyt den indbyggede browser" name="internal" tool_tip="Brug den indbyggede web browser til hjælp, web links m.v. Denne browser åbner et nyt vindue i [APP_NAME]."/>
- <radio_item label="Brug min normale browser (IE, Firefox)" name="external" tool_tip="Brug systemets standard web browser til hjælp, web links, m.v. Ikke anbefalet hvis du kører i fuld-skærm."/>
+ <radio_item label="Benyt min browser(IE, Firefox, Safari)" name="external" tool_tip="Brug systemets standard web browser til hjælp, web links, m.v. Ikke anbefalet hvis du kører i fuld-skærm." value="1"/>
+ <radio_item label="Benyt den indbyggede browser" name="internal" tool_tip="Brug den indbyggede web browser til hjælp, web links m.v. Denne browser åbner et nyt vindue i [APP_NAME]." value=""/>
</radio_group>
- <check_box initial_value="false" label="Web proxy" name="web_proxy_enabled"/>
- <line_editor name="web_proxy_editor" tool_tip="Angiv navn eller IP addresse på den proxy du ønsker at anvende"/>
- <button label="Vælg" label_selected="Vælg" name="set_proxy"/>
+ <check_box label="Aktivér plugins" name="browser_plugins_enabled"/>
+ <check_box label="Acceptér cookies" name="cookies_enabled"/>
+ <check_box label="Aktivér Javascript" name="browser_javascript_enabled"/>
+ <check_box label="Aktivér web proxy" name="web_proxy_enabled"/>
<text name="Proxy location">
- Proxy placering
+ Proxy placering:
</text>
+ <line_editor name="web_proxy_editor" tool_tip="Angiv navn eller IP addresse på den proxy du ønsker at anvende"/>
+ <spinner label="Port nummer:" name="web_proxy_port"/>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_sound.xml b/indra/newview/skins/default/xui/da/panel_preferences_sound.xml
index ce77018f72..a1b47c3c1f 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_sound.xml
@@ -1,14 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Lyde" name="Preference Media panel">
<slider label="Generel" name="System Volume"/>
- <check_box initial_value="true" label="Sluk lyd når vinduet er minimeret" name="mute_when_minimized"/>
- <slider label="Omgivelser" name="Wind Volume"/>
+ <check_box initial_value="true" label="Sluk lyd når minimeret" name="mute_when_minimized"/>
<slider label="Knapper" name="UI Volume"/>
- <slider label="Media" name="Media Volume"/>
- <slider label="Effekter" name="SFX Volume"/>
+ <slider label="Omgivelser" name="Wind Volume"/>
+ <slider label="Lyd effekter" name="SFX Volume"/>
<slider label="Musik" name="Music Volume"/>
- <check_box label="Tale" name="enable_voice_check"/>
- <slider label="Tale" name="Voice Volume"/>
+ <check_box label="Aktiveret" name="music_enabled"/>
+ <slider label="Media" name="Media Volume"/>
+ <check_box label="Aktiveret" name="enable_media"/>
+ <slider label="Stemme chat" name="Voice Volume"/>
+ <check_box label="Aktiveret" name="enable_voice_check"/>
+ <check_box label="Tillad media at afspilles automatisk" name="media_auto_play_btn" tool_tip="Vælg dette for at media afspille automatisk hvis det ønsker det" />
+ <check_box label="Afspil media vedhæftet andre avatarer" name="media_show_on_others_btn" tool_tip="Deaktiver dette for at skjule vedhæftet media for avatarer i nærheden" />
+ <text name="voice_chat_settings">
+ Stemme chat opsætning
+ </text>
<text name="Listen from">
Hør stemmer fra:
</text>
diff --git a/indra/newview/skins/default/xui/da/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/da/panel_prim_media_controls.xml
index 987ba2a3f8..d3b3c7e21e 100644
--- a/indra/newview/skins/default/xui/da/panel_prim_media_controls.xml
+++ b/indra/newview/skins/default/xui/da/panel_prim_media_controls.xml
@@ -1,6 +1,47 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="MediaControls">
+ <string name="min_width">
+ 300
+ </string>
+ <string name="min_height">
+ 75
+ </string>
+ <string name="zoom_medium_padding">
+ 1.1
+ </string>
+ <string name="top_world_view_avoid_zone">
+ 50
+ </string>
+ <layout_stack name="progress_indicator_area">
+ <panel name="media_progress_indicator">
+ <progress_bar name="media_progress_bar" tool_tip="Medie hentes"/>
+ </panel>
+ </layout_stack>
<layout_stack name="media_controls">
+ <layout_panel name="back">
+ <button name="back_btn" tool_tip="Navigér tilbage"/>
+ </layout_panel>
+ <layout_panel name="fwd">
+ <button name="fwd_btn" tool_tip="Navigér frem"/>
+ </layout_panel>
+ <layout_panel name="home">
+ <button name="home_btn" tool_tip="Hjemmeside"/>
+ </layout_panel>
+ <layout_panel name="media_stop">
+ <button name="media_stop_btn" tool_tip="Stop medie"/>
+ </layout_panel>
+ <layout_panel name="reload">
+ <button name="reload_btn" tool_tip="Indlæs igen"/>
+ </layout_panel>
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="Stop indlæsning"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="Afspil medie"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="Pause medie"/>
+ </layout_panel>
<layout_panel name="media_address">
<line_editor name="media_address_url" tool_tip="Media URL"/>
<layout_stack name="media_address_url_icons">
@@ -15,14 +56,24 @@
<layout_panel name="media_play_position">
<slider_bar initial_value="0.5" name="media_play_slider" tool_tip="Filmafspilning fremskridt"/>
</layout_panel>
+ <layout_panel name="skip_back">
+ <button name="skip_back_btn" tool_tip="GÃ¥ tilbage"/>
+ </layout_panel>
+ <layout_panel name="skip_forward">
+ <button name="skip_forward_btn" tool_tip="GÃ¥ frem"/>
+ </layout_panel>
<layout_panel name="media_volume">
<button name="media_mute_button" tool_tip="Sluk for dette media"/>
<slider name="volume_slider" tool_tip="Media lydstyrke"/>
</layout_panel>
- </layout_stack>
- <layout_stack>
- <panel name="media_progress_indicator">
- <progress_bar name="media_progress_bar" tool_tip="Media hentes"/>
- </panel>
+ <layout_panel name="zoom_frame">
+ <button name="zoom_frame_btn" tool_tip="Zoom til medie"/>
+ </layout_panel>
+ <layout_panel name="close">
+ <button name="close_btn" tool_tip="Zoom tilbage"/>
+ </layout_panel>
+ <layout_panel name="new_window">
+ <button name="new_window_btn" tool_tip="Ã…ben URL i browser"/>
+ </layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_profile.xml b/indra/newview/skins/default/xui/da/panel_profile.xml
index ef7110ffcf..c5bfc3ae80 100644
--- a/indra/newview/skins/default/xui/da/panel_profile.xml
+++ b/indra/newview/skins/default/xui/da/panel_profile.xml
@@ -1,37 +1,41 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Profil" name="panel_profile">
<string name="no_partner_text" value="Ingen"/>
+ <string name="no_group_text" value="Ingen"/>
<string name="RegisterDateFormat">
[REG_DATE] ([AGE])
</string>
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <panel name="second_life_image_panel">
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <text name="title_rw_descr_text" value="Real world:"/>
- </panel>
- <text name="me_homepage_text">
- Hjemmeside:
- </text>
- <text name="title_member_text" value="Medlem siden:"/>
- <text name="title_acc_status_text" value="Konto status:"/>
- <text name="acc_status_text" value="Beboer. Ingen betalingsinfo"/>
- <text name="title_partner_text" value="Partner:"/>
- <text name="title_groups_text" value="Grupper:"/>
- </panel>
- </scroll_container>
- <panel name="profile_buttons_panel">
- <button label="Tilføj ven" name="add_friend" tool_tip="Tilbyd venskab til denne beboer"/>
- <button label="IM" name="im" tool_tip="Skriv en personlig besked (IM)"/>
- <button label="Opkald" name="call" tool_tip="Opkald til denne beboer"/>
- <button label="Map" name="show_on_map_btn" tool_tip="Show the resident on the map"/>
- <button label="Tilbyd teleport" name="teleport" tool_tip="Tilbyd en teleport til denne beboer"/>
- <button label="â–¼" name="overflow_btn" tool_tip="Betal penge til eller del beholdning med denne beboer"/>
- </panel>
- <panel name="profile_me_buttons_panel">
- <button label="Redigér profil" name="edit_profile_btn"/>
- <button label="Redigér udseende" name="edit_appearance_btn"/>
- </panel>
+ <layout_stack name="layout">
+ <layout_panel name="profile_stack">
+ <scroll_container name="profile_scroll">
+ <panel name="profile_scroll_panel">
+ <panel name="second_life_image_panel">
+ <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <text name="title_rw_descr_text" value="Real World:"/>
+ </panel>
+ <text name="title_member_text" value="Beboer siden:"/>
+ <text name="title_acc_status_text" value="Konto status:"/>
+ <text name="title_partner_text" value="Partner:"/>
+ <panel name="partner_data_panel">
+ <name_box initial_value="(henter)" name="partner_text"/>
+ </panel>
+ <text name="title_groups_text" value="Grupper:"/>
+ </panel>
+ </scroll_container>
+ </layout_panel>
+ <layout_panel name="profile_buttons_panel">
+ <button label="Tilføj ven" name="add_friend" tool_tip="Tilbyd venskab til beboeren"/>
+ <button label="IM" name="im" tool_tip="Ã…ben session med personlige beskeder (IM)"/>
+ <button label="Opkald" name="call" tool_tip="Opkald til denne beboer"/>
+ <button label="Kort" name="show_on_map_btn" tool_tip="Vis beboeren på kortet"/>
+ <button label="Teleport" name="teleport" tool_tip="Tilbyd teleport"/>
+ <button label="â–¼" name="overflow_btn" tool_tip="Betal penge til eller del beholdning med beboeren"/>
+ </layout_panel>
+ <layout_panel name="profile_me_buttons_panel">
+ <button label="Redigér profil" name="edit_profile_btn" tool_tip="Redigér din personlige information"/>
+ <button label="Redigér udseende" name="edit_appearance_btn" tool_tip="Opret/redigér dit udseende: fysiske data, tøj m.v."/>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_region_covenant.xml b/indra/newview/skins/default/xui/da/panel_region_covenant.xml
index 0e8ab7556f..4b9c7539ea 100644
--- a/indra/newview/skins/default/xui/da/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/da/panel_region_covenant.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Covenant" name="Covenant">
+<panel label="Regler" name="Covenant">
<text name="estate_section_lbl">
Estate
</text>
@@ -27,7 +27,7 @@
Ændringer i regler vil blive vist i alle parceller til denne estate.
</text>
<text name="covenant_instructions">
- Træk og slip en note for at ændre regler for denne estate.
+ Træk og slip et notecard her for at ændre regler for denne estate.
</text>
<text name="region_section_lbl">
Region
diff --git a/indra/newview/skins/default/xui/da/panel_region_estate.xml b/indra/newview/skins/default/xui/da/panel_region_estate.xml
index d726fedfe9..65948ce481 100644
--- a/indra/newview/skins/default/xui/da/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/da/panel_region_estate.xml
@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Estate" name="Estate">
<text name="estate_help_text">
- Ændringer i dette afsnit vil påvirke alle
-regioner i dette estate.
+ Ændringer her vil påvirke alle regioner i dette estate.
</text>
<text name="estate_text">
Estate:
@@ -24,10 +23,10 @@ regioner i dette estate.
<check_box label="Tillad offentlig adgang" name="externally_visible_check"/>
<button label="?" name="externally_visible_help"/>
<text name="Only Allow">
- Begræns adgang til:
+ Begræns adgang til konti bekræftet med:
</text>
- <check_box label="Beboere med betalingsoplysninger" name="limit_payment" tool_tip="Blokér for brugere uden identifikation"/>
- <check_box label="Beboere der er godkendt som voksne" name="limit_age_verified" tool_tip="Blokér for brugere der ikke har verificéret deres alder. Se [SUPPORT_SITE] for mere information."/>
+ <check_box label="Beboere med betalingsoplysninger" name="limit_payment" tool_tip="Blokér for uidentificerede beboere"/>
+ <check_box label="Beboere der er godkendt som voksne" name="limit_age_verified" tool_tip="Blokér for beboere som ikke er blevet aldersverificeret. Se [SUPPORT_SITE] for mere information."/>
<check_box label="Tillad stemme chat" name="voice_chat_check"/>
<button label="?" name="voice_chat_help"/>
<check_box label="Tillad direkte teleport" name="allow_direct_teleport"/>
@@ -40,7 +39,7 @@ regioner i dette estate.
</string>
<button label="?" name="abuse_email_address_help"/>
<button label="Gem" name="apply_btn"/>
- <button label="Smid bruger ud fra estate..." name="kick_user_from_estate_btn"/>
+ <button label="Fjern en beboer fra estate..." name="kick_user_from_estate_btn"/>
<button label="Send besked til estate..." name="message_estate_btn"/>
<text name="estate_manager_label">
Administratorer:
diff --git a/indra/newview/skins/default/xui/da/panel_region_general.xml b/indra/newview/skins/default/xui/da/panel_region_general.xml
index 6ffe1f34f3..5b5dd411ac 100644
--- a/indra/newview/skins/default/xui/da/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/da/panel_region_general.xml
@@ -19,35 +19,25 @@
ukendt
</text>
<check_box label="Blokér for redigering af terræn" name="block_terraform_check"/>
- <button label="?" name="terraform_help"/>
<check_box label="Blokér for flyvning" name="block_fly_check"/>
- <button label="?" name="fly_help"/>
<check_box label="Tillad skader" name="allow_damage_check"/>
- <button label="?" name="damage_help"/>
<check_box label="Begræns skubning" name="restrict_pushobject"/>
- <button label="?" name="restrict_pushobject_help"/>
<check_box label="Tillad at sælge land" name="allow_land_resell_check"/>
- <button label="?" name="land_resell_help"/>
<check_box label="Tillad at samle/dele land" name="allow_parcel_changes_check"/>
- <button label="?" name="parcel_changes_help"/>
<check_box label="Blokér visning af land i Søgning" name="block_parcel_search_check" tool_tip="Lad beboere se denne region og dens parceller i søgeresultater"/>
- <button label="?" name="parcel_search_help"/>
<spinner label="Max besøgende" name="agent_limit_spin"/>
- <button label="?" name="agent_limit_help"/>
<spinner label="Objekt bonus" name="object_bonus_spin"/>
- <button label="?" name="object_bonus_help"/>
<text label="Indhold" name="access_text">
Rating:
</text>
- <combo_box label="Mature" name="access_combo">
- <combo_box.item label="Adult" name="Adult"/>
- <combo_box.item label="Mature" name="Mature"/>
- <combo_box.item label="PG" name="PG"/>
- </combo_box>
- <button label="?" name="access_help"/>
+ <icons_combo_box label="Mature" name="access_combo">
+ <icons_combo_box.item label="Adult" name="Adult" value="42"/>
+ <icons_combo_box.item label="Mature" name="Mature" value="21"/>
+ <icons_combo_box.item label="PG" name="PG" value="13"/>
+ </icons_combo_box>
<button label="Gem" name="apply_btn"/>
- <button label="Send en beboer hjem ..." name="kick_btn"/>
- <button label="Send alle beboere hjem..." name="kick_all_btn"/>
+ <button label="Teleportér en beboer hjem..." name="kick_btn"/>
+ <button label="Teleportér alle beboere hjem..." name="kick_all_btn"/>
<button label="Send besked til region..." name="im_btn"/>
<button label="Vedligehold telehub..." name="manage_telehub_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_region_general_layout.xml b/indra/newview/skins/default/xui/da/panel_region_general_layout.xml
new file mode 100644
index 0000000000..f3c32d6169
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_region_general_layout.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Region" name="General">
+ <text name="region_text_lbl">
+ Region:
+ </text>
+ <text name="region_text">
+ ukendt
+ </text>
+ <text name="version_channel_text_lbl">
+ Version:
+ </text>
+ <text name="version_channel_text">
+ ukendt
+ </text>
+ <text name="region_type_lbl">
+ Type:
+ </text>
+ <text name="region_type">
+ ukendt
+ </text>
+ <check_box label="Blokér for redigering af terræn" name="block_terraform_check"/>
+ <check_box label="Blokér for flyvning" name="block_fly_check"/>
+ <check_box label="Tillad skader" name="allow_damage_check"/>
+ <check_box label="Begræns skubning" name="restrict_pushobject"/>
+ <check_box label="Tillad at sælge land" name="allow_land_resell_check"/>
+ <check_box label="Tillad at samle/dele land" name="allow_parcel_changes_check"/>
+ <check_box label="Blokér visning af land i Søgning" name="block_parcel_search_check" tool_tip="Lad beboere se denne region og dens parceller i søgeresultater"/>
+ <spinner label="Max besøgende" name="agent_limit_spin"/>
+ <spinner label="Objekt bonus" name="object_bonus_spin"/>
+ <text label="Rating" name="access_text">
+ Rating:
+ </text>
+ <combo_box label="Moderat" name="access_combo">
+ <combo_box.item label="Voksent" name="Adult"/>
+ <combo_box.item label="Moderat" name="Mature"/>
+ <combo_box.item label="Generel" name="PG"/>
+ </combo_box>
+ <button label="Gem" name="apply_btn"/>
+ <button label="Teleportér en beboer hjem..." name="kick_btn"/>
+ <button label="Teleportér alle beboere hjem..." name="kick_all_btn"/>
+ <button label="Send besked til region..." name="im_btn"/>
+ <button label="Vedligehold telehub..." name="manage_telehub_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_region_texture.xml b/indra/newview/skins/default/xui/da/panel_region_texture.xml
index fc597eee15..45946fd222 100644
--- a/indra/newview/skins/default/xui/da/panel_region_texture.xml
+++ b/indra/newview/skins/default/xui/da/panel_region_texture.xml
@@ -25,16 +25,16 @@
Texture højde intervaller
</text>
<text name="height_text_lbl6">
- Sydvest
+ Nordvest
</text>
<text name="height_text_lbl7">
- Nordvest
+ Nordøst
</text>
<text name="height_text_lbl8">
- Sydøst
+ Sydvest
</text>
<text name="height_text_lbl9">
- Nordøst
+ Sydøst
</text>
<spinner label="Lav" name="height_start_spin_0"/>
<spinner label="Lav" name="height_start_spin_1"/>
@@ -45,10 +45,10 @@
<spinner label="Høj" name="height_range_spin_2"/>
<spinner label="Høj" name="height_range_spin_3"/>
<text name="height_text_lbl10">
- Disse værdier repræsenterer blandingsområder for teksturer ovenfor.
+ Disse værdier repræsenterer blandingsforhold for teksturer ovenfor.
</text>
<text name="height_text_lbl11">
- Målt i meter, angiver LAV værdien MAKSIMUM højden for tekstur 1, og HØJ værdien er minimumshøjden for tekstur 4.
+ Målt i meter, angiver LAV værdien MAKSIMUM højden for tekstur 1 og HØJ værdien er MINIMUMSshøjden for tekstur 4.
</text>
<text name="height_text_lbl12">
og HØJ værdien er MIMIMUM højde for texture nummer 4.
diff --git a/indra/newview/skins/default/xui/da/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/da/panel_script_limits_my_avatar.xml
new file mode 100644
index 0000000000..821c82ccda
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_script_limits_my_avatar.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="MIN AVATAR" name="script_limits_my_avatar_panel">
+ <text name="script_memory">
+ Avatar Script forbrug
+ </text>
+ <text name="loading_text">
+ Henter...
+ </text>
+ <scroll_list name="scripts_list">
+ <scroll_list.columns label="Størrelse (kb)" name="size"/>
+ <scroll_list.columns label="URL&apos;er" name="urls"/>
+ <scroll_list.columns label="Objekt navn" name="name"/>
+ <scroll_list.columns label="Lokation" name="location"/>
+ </scroll_list>
+ <button label="Gentegn liste" name="refresh_list_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/da/panel_script_limits_region_memory.xml
new file mode 100644
index 0000000000..91fc76dbb4
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_script_limits_region_memory.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="REGION MEMORY" name="script_limits_region_memory_panel">
+ <text name="script_memory">
+ Parcel script memory
+ </text>
+ <text name="loading_text">
+ Henter...
+ </text>
+ <scroll_list name="scripts_list">
+ <scroll_list.columns label="Størrelse (kb)" name="size"/>
+ <scroll_list.columns label="URL&apos;er" name="urls"/>
+ <scroll_list.columns label="Objekt navn" name="name"/>
+ <scroll_list.columns label="Objekt ejer" name="owner"/>
+ <scroll_list.columns label="Parcel" name="parcel"/>
+ <scroll_list.columns label="Lokation" name="location"/>
+ </scroll_list>
+ <button label="Gentegn liste" name="refresh_list_btn"/>
+ <button label="Fremhæv" name="highlight_btn"/>
+ <button label="Retur" name="return_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_side_tray.xml b/indra/newview/skins/default/xui/da/panel_side_tray.xml
index ab4a2a134e..66c3e69904 100644
--- a/indra/newview/skins/default/xui/da/panel_side_tray.xml
+++ b/indra/newview/skins/default/xui/da/panel_side_tray.xml
@@ -2,25 +2,28 @@
<!-- Side tray cannot show background because it is always
partially on screen to hold tab buttons. -->
<side_tray name="sidebar">
- <sidetray_tab description="Hjem." name="sidebar_home">
+ <sidetray_tab description="Ã…bn/luk sidebar" name="sidebar_openclose" tab_title="Ã…bn/luk sidebar"/>
+ <sidetray_tab description="Hjem." name="sidebar_home" tab_title="Hjem">
<panel label="hjem" name="panel_home"/>
</sidetray_tab>
- <sidetray_tab description="Find venner, kontakter og personer tæt på." name="sidebar_people">
+ <sidetray_tab description="Redigér din profile og favoritter." name="sidebar_me" tab_title="Min profil">
<panel_container name="panel_container">
- <panel label="Gruppe info" name="panel_group_info_sidetray"/>
+ <panel label="Mig" name="panel_me"/>
+ </panel_container>
+ </sidetray_tab>
+ <sidetray_tab description="Find venner, kontakter og personer tæt på." name="sidebar_people" tab_title="Personer">
+ <panel_container name="panel_container">
+ <panel label="Gruppe profil" name="panel_group_info_sidetray"/>
<panel label="Blokerede beboere og objekter" name="panel_block_list_sidetray"/>
</panel_container>
</sidetray_tab>
- <sidetray_tab description="Find steder du vil hen og steder du har været før." label="Steder" name="sidebar_places">
+ <sidetray_tab description="Find steder du vil hen og steder du har været før." label="Steder" name="sidebar_places" tab_title="Steder">
<panel label="Steder" name="panel_places"/>
</sidetray_tab>
- <sidetray_tab description="Redigér din profile og favoritter." name="sidebar_me">
- <panel label="Mig" name="panel_me"/>
- </sidetray_tab>
- <sidetray_tab description="Ændre dit nuværende udseende" name="sidebar_appearance">
- <panel label="Redigér fremtoning" name="sidepanel_appearance"/>
- </sidetray_tab>
- <sidetray_tab description="Browse din beholdning." name="sidebar_inventory">
+ <sidetray_tab description="Browse din beholdning." name="sidebar_inventory" tab_title="Min beholdning">
<panel label="Redigér beholdning" name="sidepanel_inventory"/>
</sidetray_tab>
+ <sidetray_tab description="Ændre dit nuværende udseende" name="sidebar_appearance" tab_title="Mit udseende">
+ <panel label="Redigér udseende" name="sidepanel_appearance"/>
+ </sidetray_tab>
</side_tray>
diff --git a/indra/newview/skins/default/xui/da/panel_status_bar.xml b/indra/newview/skins/default/xui/da/panel_status_bar.xml
index 4e45b7e328..08ffafd5a6 100644
--- a/indra/newview/skins/default/xui/da/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/da/panel_status_bar.xml
@@ -21,9 +21,11 @@
<panel.string name="buycurrencylabel">
L$ [AMT]
</panel.string>
- <button label="" label_selected="" name="buycurrency" tool_tip="My Balance: Click to buy more L$"/>
+ <button label="" label_selected="" name="buycurrency" tool_tip="Min balance"/>
+ <button label="Køb L$" name="buyL" tool_tip="Klik for at købe flere L$"/>
<text name="TimeText" tool_tip="Nuværende tid (Pacific)">
- 12:00
+ 24:00 PST
</text>
+ <button name="media_toggle_btn" tool_tip="Start/Stop Alle medier (musik, video, hjemmesider)"/>
<button name="volume_btn" tool_tip="Kontrol for generel lydstyrke"/>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_teleport_history.xml b/indra/newview/skins/default/xui/da/panel_teleport_history.xml
index 64b5ecf5cf..8a01659ffa 100644
--- a/indra/newview/skins/default/xui/da/panel_teleport_history.xml
+++ b/indra/newview/skins/default/xui/da/panel_teleport_history.xml
@@ -4,6 +4,7 @@
<accordion_tab name="today" title="I dag"/>
<accordion_tab name="yesterday" title="I går"/>
<accordion_tab name="2_days_ago" title="2 dage siden"/>
+ 5
<accordion_tab name="3_days_ago" title="3 dage siden"/>
<accordion_tab name="4_days_ago" title="4 dage siden"/>
<accordion_tab name="5_days_ago" title="5 dage siden"/>
@@ -11,4 +12,7 @@
<accordion_tab name="1_month_and_older" title="1 måned eller ældre"/>
<accordion_tab name="6_months_and_older" title="6 måneder eller ældre"/>
</accordion>
+ <panel name="bottom_panel">
+ <button name="gear_btn" tool_tip="Vis flere valgmuligheder"/>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/da/panel_teleport_history_item.xml
new file mode 100644
index 0000000000..8148588c86
--- /dev/null
+++ b/indra/newview/skins/default/xui/da/panel_teleport_history_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="teleport_history_item">
+ <button name="profile_btn" tool_tip="Vis info om genstand"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_world_map.xml b/indra/newview/skins/default/xui/da/panel_world_map.xml
index bea5ea6b36..138b922df1 100644
--- a/indra/newview/skins/default/xui/da/panel_world_map.xml
+++ b/indra/newview/skins/default/xui/da/panel_world_map.xml
@@ -30,6 +30,12 @@
<panel.string name="world_map_northwest">
NV
</panel.string>
+ <panel.string name="world_map_person">
+ 1 person
+ </panel.string>
+ <panel.string name="world_map_people">
+ [NUMBER] people
+ </panel.string>
<text label="N" name="floater_map_north" text="N">
N
</text>
diff --git a/indra/newview/skins/default/xui/da/sidepanel_appearance.xml b/indra/newview/skins/default/xui/da/sidepanel_appearance.xml
index 27708f5c7a..be049bea38 100644
--- a/indra/newview/skins/default/xui/da/sidepanel_appearance.xml
+++ b/indra/newview/skins/default/xui/da/sidepanel_appearance.xml
@@ -1,11 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Sæt" name="appearance panel">
<string name="No Outfit" value="Intet sæt"/>
- <filter_editor label="Filtrér sæt" name="Filter"/>
- <panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="Vis flere muligheder"/>
- <button name="newlook_btn" tool_tip="Tilføj nyt sæt"/>
- <dnd_button name="trash_btn" tool_tip="Fjern valgte del"/>
- <button label="Bær" name="wear_btn"/>
+ <string name="Unsaved Changes" value="Ikke gemte ændringer"/>
+ <string name="Now Wearing" value="Bærer nu..."/>
+ <panel name="panel_currentlook">
+ <button label="E" name="editappearance_btn"/>
+ <button label="O" name="openoutfit_btn"/>
+ <text name="currentlook_status">
+ (Status)
+ </text>
</panel>
+ <filter_editor label="Filtrér sæt" name="Filter"/>
</panel>
diff --git a/indra/newview/skins/default/xui/da/sidepanel_inventory.xml b/indra/newview/skins/default/xui/da/sidepanel_inventory.xml
index ae029f5939..767d74ca3f 100644
--- a/indra/newview/skins/default/xui/da/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/da/sidepanel_inventory.xml
@@ -3,6 +3,8 @@
<panel label="" name="sidepanel__inventory_panel">
<panel name="button_panel">
<button label="Profil" name="info_btn"/>
+ <button label="Del" name="share_btn"/>
+ <button label="Køb ind" name="shop_btn"/>
<button label="Bær" name="wear_btn"/>
<button label="Afspil" name="play_btn"/>
<button label="Teleportér" name="teleport_btn"/>
diff --git a/indra/newview/skins/default/xui/da/sidepanel_item_info.xml b/indra/newview/skins/default/xui/da/sidepanel_item_info.xml
index 685601b922..701a59bade 100644
--- a/indra/newview/skins/default/xui/da/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/da/sidepanel_item_info.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="item properties" title="Egenskaber for beholdningsgenstand">
+<panel name="item properties" title="Objekt profil">
<panel.string name="unknown">
(ukendt)
</panel.string>
@@ -15,7 +15,8 @@
<panel.string name="acquiredDate">
[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
</panel.string>
- <text name="title" value="Egenskaber for genstand"/>
+ <text name="title" value="Objekt profil"/>
+ <text name="where" value="(Beholdning)"/>
<panel label="">
<text name="LabelItemNameTitle">
Navn:
@@ -37,34 +38,36 @@
<text name="LabelAcquiredDate">
Ons Maj 24 12:50:46 2006
</text>
- <text name="OwnerLabel">
- Dig:
- </text>
- <check_box label="Editér" name="CheckOwnerModify"/>
- <check_box label="Kopiér" name="CheckOwnerCopy"/>
- <check_box label="Sælg" name="CheckOwnerTransfer"/>
- <text name="AnyoneLabel">
- Enhver:
- </text>
- <check_box label="Kopiér" name="CheckEveryoneCopy"/>
- <text name="GroupLabel">
- Gruppe:
- </text>
- <check_box label="Del" name="CheckShareWithGroup"/>
- <text name="NextOwnerLabel">
- Næste ejer:
- </text>
- <check_box label="Editér" name="CheckNextOwnerModify"/>
- <check_box label="Kopiér" name="CheckNextOwnerCopy"/>
- <check_box label="Sælg" name="CheckNextOwnerTransfer"/>
+ <panel name="perms_inv">
+ <text name="perm_modify">
+ Du kan:
+ </text>
+ <check_box label="Redigere" name="CheckOwnerModify"/>
+ <check_box label="Kopiere" name="CheckOwnerCopy"/>
+ <check_box label="Give væk" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ Enhver:
+ </text>
+ <check_box label="Kopiere" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ Gruppe:
+ </text>
+ <check_box label="Dele" name="CheckShareWithGroup" tool_tip="Tillad alle medlemmer i den aktive gruppe at dele dine &apos;redigere&apos; rettigheder for dette objekt. Du skal dedikere for at åbne for rolle begrænsninger."/>
+ <text name="NextOwnerLabel">
+ Næste ejer:
+ </text>
+ <check_box label="Redigere" name="CheckNextOwnerModify"/>
+ <check_box label="Kopiere" name="CheckNextOwnerCopy"/>
+ <check_box label="Give væk" name="CheckNextOwnerTransfer" tool_tip="Næste ejer kan give væk eller sælge dette objekt"/>
+ </panel>
<check_box label="Til salg" name="CheckPurchase"/>
<combo_box name="combobox sale copy">
- <combo_box.item label="Kopiér" name="Copy"/>
+ <combo_box.item label="Kopi" name="Copy"/>
<combo_box.item label="Original" name="Original"/>
</combo_box>
- <spinner label="Pris:" name="Edit Cost"/>
- <text name="CurrencySymbol">
- L$
- </text>
+ <spinner label="Pris: L$" name="Edit Cost"/>
+ </panel>
+ <panel name="button_panel">
+ <button label="Annullér" name="cancel_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/da/sidepanel_task_info.xml b/indra/newview/skins/default/xui/da/sidepanel_task_info.xml
index 6ade03ce56..bec97734e4 100644
--- a/indra/newview/skins/default/xui/da/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/da/sidepanel_task_info.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="object properties" title="Egenskaber for objekt">
+<panel name="object properties" title="Objekt profil">
<panel.string name="text deed continued">
Dedikér
</panel.string>
@@ -36,84 +36,94 @@
<panel.string name="Sale Mixed">
Blandet salg
</panel.string>
- <panel label="">
+ <text name="title" value="Objekt profil"/>
+ <text name="where" value="(verden)"/>
+ <panel label="" name="properties_panel">
<text name="Name:">
Navn:
</text>
<text name="Description:">
Beskrivelse:
</text>
- <text name="Creator:">
+ <text name="CreatorNameLabel">
Skaber:
</text>
+ <text name="Creator Name">
+ Erica Linden
+ </text>
<text name="Owner:">
Ejer:
</text>
- <text name="Group:">
+ <text name="Owner Name">
+ Erica Linden
+ </text>
+ <text name="Group_label">
Gruppe:
</text>
- <button name="button set group" tool_tip="Vælg en gruppe der skal dele dette objekts rettigheder"/>
+ <button name="button set group" tool_tip="Vælg en gruppe for at dele dette objekts rettigheder"/>
<name_box initial_value="Henter..." name="Group Name Proxy"/>
- <button label="Dedikér" label_selected="Dedikér" name="button deed" tool_tip="Dedikering giver denne genstand væk med næste ejers rettigheder. Gruppedelte genstande kan dedikeres af en gruppeadministrator."/>
- <check_box label="Del" name="checkbox share with group" tool_tip="Tillad alle medlemmer i den angivne gruppe at videregive dine &quot;redigere&quot; rettigheder for dette objekt. Du må dedikere for at tillade rolle begrænsninger."/>
+ <button label="Dedikér" label_selected="Dedikér" name="button deed" tool_tip="Dedikering giver denne genstand væk med den næste ejers rettigheder. Gruppe delte objekter kan dedikeres af en gruppe administrator."/>
<text name="label click action">
Klik for at:
</text>
<combo_box name="clickaction">
- <combo_box.item label="Røre (standard)" name="Touch/grab(default)"/>
+ <combo_box.item label="Berøre (standard)" name="Touch/grab(default)"/>
<combo_box.item label="Sidde på objekt" name="Sitonobject"/>
<combo_box.item label="Købe objekt" name="Buyobject"/>
- <combo_box.item label="Betale til objekt" name="Payobject"/>
+ <combo_box.item label="Betale objekt" name="Payobject"/>
<combo_box.item label="Ã…bne" name="Open"/>
</combo_box>
- <check_box label="Til salg:" name="checkbox for sale"/>
- <combo_box name="sale type">
- <combo_box.item label="Kopi" name="Copy"/>
- <combo_box.item label="Indhold" name="Contents"/>
- <combo_box.item label="Original" name="Original"/>
- </combo_box>
- <spinner label="Pris: L$" name="Edit Cost"/>
- <check_box label="Vis i søgning" name="search_check" tool_tip="Lad personer se dette objekt i søgeresultater"/>
- <panel name="perms_build">
+ <panel name="perms_inv">
<text name="perm_modify">
Du kan redigere dette objekt
</text>
<text name="Anyone can:">
Enhver:
</text>
- <check_box label="Flytte" name="checkbox allow everyone move"/>
<check_box label="Kopiere" name="checkbox allow everyone copy"/>
- <text name="Next owner can:">
+ <check_box label="Flytte" name="checkbox allow everyone move"/>
+ <text name="GroupLabel">
+ Gruppe:
+ </text>
+ <check_box label="Dele" name="checkbox share with group" tool_tip="Tillad alle gruppemedlemmer i den valgte gruppe at dele dine redigeringsrettigheder for dette objekt. Du skal dedikere for at aktivere rollebegrænsninger"/>
+ <text name="NextOwnerLabel">
Næste ejer:
</text>
<check_box label="Redigere" name="checkbox next owner can modify"/>
<check_box label="Kopiere" name="checkbox next owner can copy"/>
- <check_box label="Overfør" name="checkbox next owner can transfer" tool_tip="Næste ejer kan sælge eller give dette objekt væk"/>
- <text name="B:">
- B:
- </text>
- <text name="O:">
- Ã…:
- </text>
- <text name="G:">
- O:
- </text>
- <text name="E:">
- R:
- </text>
- <text name="N:">
- N:
- </text>
- <text name="F:">
- F:
- </text>
+ <check_box label="Overføre" name="checkbox next owner can transfer" tool_tip="Næste ejer kan give væk eller sælge dette objekt"/>
</panel>
+ <check_box label="Til salg" name="checkbox for sale"/>
+ <combo_box name="sale type">
+ <combo_box.item label="Kopi" name="Copy"/>
+ <combo_box.item label="Indhold" name="Contents"/>
+ <combo_box.item label="Original" name="Original"/>
+ </combo_box>
+ <spinner label="Pris: L$" name="Edit Cost"/>
+ <check_box label="Vis i søgning" name="search_check" tool_tip="Lad personer se dette objekt i søgeresultater"/>
+ <text name="B:">
+ S:
+ </text>
+ <text name="O:">
+ E:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ A:
+ </text>
+ <text name="N:">
+ N:
+ </text>
+ <text name="F:">
+ F:
+ </text>
</panel>
<panel name="button_panel">
<button label="Ã…ben" name="open_btn"/>
<button label="Betal" name="pay_btn"/>
<button label="Køb" name="buy_btn"/>
- <button label="Annullér" name="cancel_btn"/>
- <button label="Gem" name="save_btn"/>
+ <button label="Detaljer" name="details_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml
index 493bb4cb20..5ceb0612a8 100644
--- a/indra/newview/skins/default/xui/da/strings.xml
+++ b/indra/newview/skins/default/xui/da/strings.xml
@@ -1,9 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- This file contains strings that used to be hardcoded in the source.
It is only for those strings which do not belong in a floater.
- For example, the strings used in avatar chat bubbles, and strings
+ For example, the strings used in avatar chat bubbles, and strings
that are returned from one component and may appear in many places-->
<strings>
+ <string name="CAPITALIZED_APP_NAME">
+ SECOND LIFE
+ </string>
<string name="SUPPORT_SITE">
Second Life Support Portal
</string>
@@ -11,7 +14,22 @@
Detekterer hardware...
</string>
<string name="StartupLoading">
- Indlæser
+ Henter [APP_NAME]...
+ </string>
+ <string name="StartupClearingCache">
+ Tømmer cache...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ Initialiserer tekstur cache...
+ </string>
+ <string name="StartupInitializingVFS">
+ Initialiserer VFS...
+ </string>
+ <string name="ProgressRestoring">
+ Gendanner...
+ </string>
+ <string name="ProgressChangingResolution">
+ Ændrer opløsning...
</string>
<string name="LoginInProgress">
Logger p. [APP_NAME] kan virke laast. Vent venligst.
@@ -38,7 +56,7 @@
Klargør multimedia...
</string>
<string name="LoginInitializingFonts">
- Indlæser fonts...
+ Indlæser skriftstyper...
</string>
<string name="LoginVerifyingCache">
Checker cache filer (kan tage 60-90 sekunder)...
@@ -70,15 +88,54 @@
<string name="LoginDownloadingClothing">
Henter tøj...
</string>
+ <string name="InvalidCertificate">
+ Serveren returnerede et ugyldigt eller ødelagt certifikat. Kontakt venligst administrator af dette net.
+ </string>
+ <string name="CertInvalidHostname">
+ Et ugyldig hostnavn blev brugt for at få adgang til serveren. Check venligst din SLURL eller navnet på hosten.
+ </string>
+ <string name="CertExpired">
+ Certifikat returneret fra nettet ser ud til at være udløbet. Check venligst din systemtid eller kontakt administratoren af dette net.
+ </string>
+ <string name="CertKeyUsage">
+ Det certifikat der blev returneret af serveren kan ikke benyttes til SSL. Kontakt venligst administrator af dette net.
+ </string>
+ <string name="CertBasicConstraints">
+ For mange certifikater i serverens certifikat streng. Kontakt venligst administrator af dette net.
+ </string>
+ <string name="CertInvalidSignature">
+ Certifikat signaturen returneret på dette net kan ikke bekræftes. Kontakt venligst administrator af dette net.
+ </string>
<string name="LoginFailedNoNetwork">
Netværksfejl: Kunne ikke etablere forbindelse, check venligst din netværksforbindelse.
</string>
+ <string name="LoginFailed">
+ Login fejlede.
+ </string>
<string name="Quit">
Afslut
</string>
<string name="AgentLostConnection">
Denne region kan have problemer. Tjek venligst din forbindelse til internettet.
</string>
+ <string name="SavingSettings">
+ Gemmer indstillinger...
+ </string>
+ <string name="LoggingOut">
+ Logger ud...
+ </string>
+ <string name="ShuttingDown">
+ Lukker ned...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ Du er blevet frakoblet den region du var i.
+ </string>
+ <string name="SentToInvalidRegion">
+ Du blev sendt til en ugyldig region.
+ </string>
+ <string name="TestingDisconnect">
+ Tester frakobling af klient
+ </string>
<string name="TooltipPerson">
Person
</string>
@@ -131,7 +188,25 @@
Klik for at se information om denne lokation
</string>
<string name="TooltipAgentUrl">
- Klik for at denne beboers profil
+ Klik for at se beboers profil
+ </string>
+ <string name="TooltipAgentMute">
+ Klik for at slukke for denne beboer
+ </string>
+ <string name="TooltipAgentUnmute">
+ Klik for at fjern slukning for denne beboer
+ </string>
+ <string name="TooltipAgentIM">
+ Klik for at sende IM til denne beboer
+ </string>
+ <string name="TooltipAgentPay">
+ Klik for at betale denne beboer
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Klik for at tilbyde teleport til denne beboer
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Klik for at sende venneforespørgsel
</string>
<string name="TooltipGroupUrl">
Klik for at se denne gruppes beskrivelse
@@ -158,18 +233,40 @@
Klik for at starte secondlife:// kommando
</string>
<string name="CurrentURL" value=" Nuværende URL: [CurrentURL]"/>
+ <string name="TooltipPrice" value="L$[PRICE]-"/>
<string name="SLurlLabelTeleport">
Teleportér til
</string>
<string name="SLurlLabelShowOnMap">
Vis kort for
</string>
+ <string name="SLappAgentMute">
+ Sluk
+ </string>
+ <string name="SLappAgentUnmute">
+ Fjern sluk
+ </string>
+ <string name="SLappAgentIM">
+ IM
+ </string>
+ <string name="SLappAgentPay">
+ Betal
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Tilbyd teleport til
+ </string>
+ <string name="SLappAgentRequestFriend">
+ Venneforespørgsel
+ </string>
<string name="BUTTON_CLOSE_DARWIN">
- Luk (&#8984;W)
+ Luk (⌘W)
</string>
<string name="BUTTON_CLOSE_WIN">
Luk (Ctrl+W)
</string>
+ <string name="BUTTON_CLOSE_CHROME">
+ Luk
+ </string>
<string name="BUTTON_RESTORE">
Gendan
</string>
@@ -182,9 +279,6 @@
<string name="BUTTON_DOCK">
Fastgør
</string>
- <string name="BUTTON_UNDOCK">
- Frigør
- </string>
<string name="BUTTON_HELP">
Vis hjælp
</string>
@@ -209,12 +303,12 @@
<string name="AvatarNameWaiting">
(venter)
</string>
- <string name="AvatarNameHippos">
- (hippos)
- </string>
<string name="GroupNameNone">
(ingen)
</string>
+ <string name="AvalineCaller">
+ Avaline opkalder [ORDER]
+ </string>
<string name="AssetErrorNone">
Ingen fejl
</string>
@@ -320,6 +414,9 @@
<string name="symbolic link">
link
</string>
+ <string name="symbolic folder link">
+ link til mappe
+ </string>
<string name="AvatarAway">
Væk
</string>
@@ -572,6 +669,9 @@
<string name="hang_up">
Stemme chat er afbrudt
</string>
+ <string name="reconnect_nearby">
+ Du vil nu blive dirigeret til lokal stemme chat
+ </string>
<string name="ScriptQuestionCautionChatGranted">
&apos;[OBJECTNAME]&apos;, en genstand, ejet af &apos;[OWNERNAME]&apos;, lokaliseret i [REGIONNAME] på [REGIONPOS], har fået tilladelse til: [PERMISSIONS].
</string>
@@ -734,6 +834,45 @@
<string name="invalid">
ugyldig
</string>
+ <string name="shirt_not_worn">
+ Trøje - ikke på
+ </string>
+ <string name="pants_not_worn">
+ Bukser - ikke på
+ </string>
+ <string name="shoes_not_worn">
+ Sko - ikke på
+ </string>
+ <string name="socks_not_worn">
+ Strømper - ikke på
+ </string>
+ <string name="jacket_not_worn">
+ Jakke - ikke på
+ </string>
+ <string name="gloves_not_worn">
+ Handsker - ikke på
+ </string>
+ <string name="undershirt_not_worn">
+ Undertrøje - ikke på
+ </string>
+ <string name="underpants_not_worn">
+ Underbukser - ikke på
+ </string>
+ <string name="skirt_not_worn">
+ Nederdel - ikke på
+ </string>
+ <string name="alpha_not_worn">
+ Alpha ikke benyttet
+ </string>
+ <string name="tattoo_not_worn">
+ Tatovering ikke benyttet
+ </string>
+ <string name="invalid_not_worn">
+ ugyldig
+ </string>
+ <string name="NewWearable">
+ Ny [WEARABLE_ITEM]
+ </string>
<string name="next">
Næste
</string>
@@ -764,11 +903,8 @@
<string name="TeleportOffer">
Teleport tilbud
</string>
- <string name="StartUpNotification">
- %d nye besked modtaget mens du var væk...
- </string>
<string name="StartUpNotifications">
- %d nye beskeder modtaget mens du var væk......
+ Nye beskeder modtaget mens du var væk......
</string>
<string name="OverflowInfoChannelString">
Du har %d mere besked(er)
@@ -804,18 +940,23 @@
Tryk ESC for at skift til normalt udsyn
</string>
<string name="InventoryNoMatchingItems">
- No matching items found in inventory.
+ Fandt du ikke hvad du søgte? Prøv [secondlife:///app/search/all/[SEARCH_TERM] Search].
+ </string>
+ <string name="PlacesNoMatchingItems">
+ Fandt du ikke hvad du søgte? Prøv [secondlife:///app/search/places/[SEARCH_TERM] Search].
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ Træk et landemærke hertil for at tilføje den som favorit.
</string>
<string name="InventoryNoTexture">
- Du har ikke en kopi af denne
-tekstur i din beholdning.
+ Du har ikke en kopi af denne tekstur i din beholdning
</string>
<string name="no_transfer" value=" (ikke overdragbar)"/>
<string name="no_modify" value=" (ikke redigere)"/>
<string name="no_copy" value=" (ikke kopiere)"/>
<string name="worn" value=" (båret)"/>
- <string name="link" value=" (sammenkæde)"/>
- <string name="broken_link" value=" (brudt_kæde)"/>
+ <string name="link" value=" (link)"/>
+ <string name="broken_link" value=" (brudt link)"/>
<string name="LoadingContents">
Henter indhold...
</string>
@@ -823,6 +964,7 @@ tekstur i din beholdning.
Intet indhold
</string>
<string name="WornOnAttachmentPoint" value=" (båret på [ATTACHMENT_POINT])"/>
+ <string name="ActiveGesture" value="[GESLABEL] (aktiv)"/>
<string name="Chat" value=" Chat : "/>
<string name="Sound" value=" Lyd : "/>
<string name="Wait" value=" --- Vent : "/>
@@ -831,6 +973,7 @@ tekstur i din beholdning.
<string name="Wave" value=" Vink "/>
<string name="HelloAvatar" value=" Hej, avatar! "/>
<string name="ViewAllGestures" value=" Se alle &gt;&gt;"/>
+ <string name="GetMoreGestures" value="FÃ¥ mere &gt;&gt;"/>
<string name="Animations" value=" Animationer,"/>
<string name="Calling Cards" value=" Visitkort,"/>
<string name="Clothing" value=" Tøj,"/>
@@ -916,6 +1059,9 @@ tekstur i din beholdning.
<string name="InvFolder My Outfits">
Mine sæt
</string>
+ <string name="InvFolder Accessories">
+ Tilbehør
+ </string>
<string name="InvFolder Friends">
Venner
</string>
@@ -1266,11 +1412,164 @@ tekstur i din beholdning.
alle estates du administrerer for [OWNER]
</string>
<string name="RegionInfoAllowedResidents">
- Godkendte beboere: ([ALLOWEDAGENTS], max. [MAXACCESS])
+ Godkendte beboere: ([ALLOWEDAGENTS], maks. [MAXACCESS])
</string>
<string name="RegionInfoAllowedGroups">
Godkendte grupper: ([ALLOWEDGROUPS], max. [MAXACCESS])
</string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ Parcel script memory
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ Parceller listet: [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ Memory brugt: [COUNT] kb ud af [MAX] kb; [AVAILABLE] kb tilgængeligt
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ Memory brugt: [COUNT] kb
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ Parcel Script URL&apos;er
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ URL&apos;er brugt: [COUNT] ud af [MAX]; [AVAILABLE] tilgængelige
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ URL&apos;er brugt: [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Fejl ved anmodning om information
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ Ingen parcel valgt
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ Fejl: script information er kun tilgængelig i den nuværende region
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ Henter information...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ Du har ikke rettigheder til at undersøge denne parcel
+ </string>
+ <string name="SITTING_ON">
+ Sidder på
+ </string>
+ <string name="ATTACH_CHEST">
+ Bryst
+ </string>
+ <string name="ATTACH_HEAD">
+ Hoved
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ Venstre skulder
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ Højre skulder
+ </string>
+ <string name="ATTACH_LHAND">
+ Venstre hånd
+ </string>
+ <string name="ATTACH_RHAND">
+ Højre hånd
+ </string>
+ <string name="ATTACH_LFOOT">
+ Venstre fod
+ </string>
+ <string name="ATTACH_RFOOT">
+ Højre fod
+ </string>
+ <string name="ATTACH_BACK">
+ Ryg
+ </string>
+ <string name="ATTACH_PELVIS">
+ Bækken
+ </string>
+ <string name="ATTACH_MOUTH">
+ Mund
+ </string>
+ <string name="ATTACH_CHIN">
+ Hage
+ </string>
+ <string name="ATTACH_LEAR">
+ Venstre øre
+ </string>
+ <string name="ATTACH_REAR">
+ Højre øre
+ </string>
+ <string name="ATTACH_LEYE">
+ Venstre øje
+ </string>
+ <string name="ATTACH_REYE">
+ Højre øje
+ </string>
+ <string name="ATTACH_NOSE">
+ Næse
+ </string>
+ <string name="ATTACH_RUARM">
+ Højre overarm
+ </string>
+ <string name="ATTACH_RLARM">
+ Højre underarm
+ </string>
+ <string name="ATTACH_LUARM">
+ Venstre overarm
+ </string>
+ <string name="ATTACH_LLARM">
+ Venstre underarm
+ </string>
+ <string name="ATTACH_RHIP">
+ Højre hofte
+ </string>
+ <string name="ATTACH_RULEG">
+ Højre lår
+ </string>
+ <string name="ATTACH_RLLEG">
+ Højre underben
+ </string>
+ <string name="ATTACH_LHIP">
+ Venstre hofte
+ </string>
+ <string name="ATTACH_LULEG">
+ Venste lår
+ </string>
+ <string name="ATTACH_LLLEG">
+ Venstre underben
+ </string>
+ <string name="ATTACH_BELLY">
+ Mave
+ </string>
+ <string name="ATTACH_RPEC">
+ Højre bryst
+ </string>
+ <string name="ATTACH_LPEC">
+ Venstre bryst
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ HUD Center 2
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ HUD Øverst til højre
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ HUD Foroven midtpå
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ HUD Øverst til venstre
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ HUD Center 1
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ HUD Nederst til venstre
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ HUD For neden
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ HUD Nederst til højre
+ </string>
<string name="CursorPos">
Linie [LINE], Kolonne [COLUMN]
</string>
@@ -1280,17 +1579,26 @@ tekstur i din beholdning.
<string name="PanelContentsNewScript">
Nyt script
</string>
+ <string name="PanelContentsTooltip">
+ Indhold i objekt
+ </string>
+ <string name="BusyModeResponseDefault">
+ Beboeren du sendte en besked er &apos;optaget&apos;, hvilket betyder at han/hun ikke vil forstyrres. Din besked vil blive vis i hans/hendes IM panel til senere visning.
+ </string>
<string name="MuteByName">
- (efter navn)
+ (Efter navn)
</string>
<string name="MuteAgent">
(beboer)
</string>
<string name="MuteObject">
- (objekt)
+ (Objekt)
</string>
<string name="MuteGroup">
- (gruppe)
+ (Gruppe)
+ </string>
+ <string name="MuteExternal">
+ (Ekstern)
</string>
<string name="RegionNoCovenant">
Der er ingen regler for dette estate.
@@ -1298,9 +1606,7 @@ tekstur i din beholdning.
<string name="RegionNoCovenantOtherOwner">
Der er ingen regler for dette estate. Land på dette estate sælges af estate ejeren, ikke af Linden Lab. Kontakt venligst estate ejeren for detaljer om salg.
</string>
- <string name="covenant_last_modified">
- Sidst ændret:
- </string>
+ <string name="covenant_last_modified" value="Sidst rettet:"/>
<string name="none_text" value=" (ingen) "/>
<string name="never_text" value=" (aldrig) "/>
<string name="GroupOwned">
@@ -1315,6 +1621,15 @@ tekstur i din beholdning.
<string name="ClassifiedUpdateAfterPublish">
(vil blive opdateret efter offentliggørelse)
</string>
+ <string name="NoPicksClassifiedsText">
+ Du har ikke oprettet nogen favoritter eller annoncer. Klik på plus knappen nedenfor for at oprette en favorit eller en annonce.
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ Bruger har ingen favoritter eller annoncer
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ Henter...
+ </string>
<string name="MultiPreviewTitle">
Vis først
</string>
@@ -1385,22 +1700,36 @@ tekstur i din beholdning.
Annullér
</string>
<string name="UploadingCosts">
- Uploader [%s] omkostninger
+ Uploader [NAME] pris L$ [AMOUNT]
+ </string>
+ <string name="BuyingCosts">
+ At købe dette koster L$ [AMOUNT]
</string>
<string name="UnknownFileExtension">
Ukendt fil efternavn [.%s]
Forventet .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
</string>
+ <string name="MuteObject2">
+ Blokér
+ </string>
<string name="AddLandmarkNavBarMenu">
Tilføj landemærke...
</string>
<string name="EditLandmarkNavBarMenu">
Redigér landemærke...
</string>
- <string name="accel-mac-control">&#8963;</string>
- <string name="accel-mac-command">&#8984;</string>
- <string name="accel-mac-option">&#8997;</string>
- <string name="accel-mac-shift">&#8679;</string>
+ <string name="accel-mac-control">
+ ⌃
+ </string>
+ <string name="accel-mac-command">
+ ⌘
+ </string>
+ <string name="accel-mac-option">
+ ⌥
+ </string>
+ <string name="accel-mac-shift">
+ ⇧
+ </string>
<string name="accel-win-control">
Ctrl+
</string>
@@ -1531,7 +1860,7 @@ Forventet .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
Enhver
</string>
<string name="You">
- Dig
+ Du
</string>
<string name="Multiple Media">
Flere medietyper
@@ -1655,39 +1984,15 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="Attached Earlobes">
Vedhæftede øreflipper
</string>
- <string name="Back Bangs">
- Nakkehår
- </string>
- <string name="Back Bangs Down">
- Nakkehår langt
- </string>
- <string name="Back Bangs Up">
- Nakkehår kort
- </string>
<string name="Back Fringe">
Nakkehår
</string>
- <string name="Back Hair">
- Volumen
- </string>
- <string name="Back Hair Down">
- Volumen nedad
- </string>
- <string name="Back Hair Up">
- Volumen op
- </string>
<string name="Baggy">
Posede
</string>
<string name="Bangs">
Pandehår
</string>
- <string name="Bangs Down">
- Pandehår ned
- </string>
- <string name="Bangs Up">
- Pandehår op
- </string>
<string name="Beady Eyes">
Stikkende øjne
</string>
@@ -1700,9 +2005,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="Big Butt">
Stor bagdel
</string>
- <string name="Big Eyeball">
- Store øjenæbler
- </string>
<string name="Big Hair Back">
Stort hår: Bag
</string>
@@ -1877,9 +2179,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="Corner Down">
Nedadvendt
</string>
- <string name="Corner Normal">
- Normalt
- </string>
<string name="Corner Up">
Opadvendt
</string>
@@ -1889,9 +2188,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="Crooked Nose">
Skæv næse
</string>
- <string name="Cropped Hair">
- Kort hår
- </string>
<string name="Cuff Flare">
Svaj
</string>
@@ -1910,15 +2206,9 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="Default Heels">
Standard hæle
</string>
- <string name="Default Toe">
- Standard snude
- </string>
<string name="Dense">
Tæt
</string>
- <string name="Dense hair">
- Tæt hår
- </string>
<string name="Double Chin">
Dobbelthage
</string>
@@ -1964,9 +2254,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="Eye Spacing">
Øjenafstand
</string>
- <string name="Eyeball Size">
- Størrelse øjenæble
- </string>
<string name="Eyebrow Arc">
Bue på øjenbryn
</string>
@@ -1991,36 +2278,9 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="Eyeliner Color">
Eyeliner farve
</string>
- <string name="Eyes Back">
- Dybtliggende øjne
- </string>
<string name="Eyes Bugged">
Udstående øjne
</string>
- <string name="Eyes Forward">
- Øjne fremme
- </string>
- <string name="Eyes Long Head">
- Eyes Long Head
- </string>
- <string name="Eyes Shear Left Up">
- Eyes Shear Left Up
- </string>
- <string name="Eyes Shear Right Up">
- Eyes Shear Right Up
- </string>
- <string name="Eyes Short Head">
- Eyes Short Head
- </string>
- <string name="Eyes Spread">
- Stor afstand
- </string>
- <string name="Eyes Sunken">
- Indsunkne øjne
- </string>
- <string name="Eyes Together">
- Tætsiddende
- </string>
<string name="Face Shear">
Ansigts symmetri
</string>
@@ -2030,30 +2290,9 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="Far Set Eyes">
Stor afstand mellem øjne
</string>
- <string name="Fat">
- Tyk
- </string>
- <string name="Fat Head">
- Tykt hovede
- </string>
<string name="Fat Lips">
Tykke læber
</string>
- <string name="Fat Lower">
- Tyk nedre
- </string>
- <string name="Fat Lower Lip">
- Tyk underlæbe
- </string>
- <string name="Fat Torso">
- Tyk overkrop
- </string>
- <string name="Fat Upper">
- Tyk øvre
- </string>
- <string name="Fat Upper Lip">
- Tyk overlæbe
- </string>
<string name="Female">
Kvinde
</string>
@@ -2090,24 +2329,9 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="Freckles">
Fregner
</string>
- <string name="Front Bangs Down">
- Pandehår - ned
- </string>
- <string name="Front Bangs Up">
- Pandehår - op
- </string>
<string name="Front Fringe">
Frynser foran
</string>
- <string name="Front Hair">
- HÃ¥r foran
- </string>
- <string name="Front Hair Down">
- HÃ¥r foran - ned
- </string>
- <string name="Front Hair Up">
- HÃ¥r foran - op
- </string>
<string name="Full Back">
Langt ud bagtil
</string>
@@ -2381,9 +2605,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="Long arms">
Lange arme
</string>
- <string name="Longcuffs">
- Longcuffs
- </string>
<string name="Loose Pants">
Løse bukser
</string>
@@ -2448,7 +2669,7 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
Mere
</string>
<string name="More Gravity">
- More
+ Mere
</string>
<string name="More Lipstick">
Mere læbestift
@@ -2546,9 +2767,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="No Eyeshadow">
Ingen øjenskygge
</string>
- <string name="No Heels">
- Ingen hæle
- </string>
<string name="No Lipgloss">
Ingen lipgloss
</string>
@@ -2606,9 +2824,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="Nostril Width">
Næsebor bredde
</string>
- <string name="Old">
- Gammel
- </string>
<string name="Opaque">
Uigennemsigtig
</string>
@@ -2708,9 +2923,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="Pointy Heels">
Spidse hæle
</string>
- <string name="Pointy Toe">
- Spids snude
- </string>
<string name="Ponytail">
Hestehale
</string>
@@ -2735,15 +2947,9 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="Red Hair">
Rødt hår
</string>
- <string name="Red Skin">
- Rød hud
- </string>
<string name="Regular">
Almindelig
</string>
- <string name="Regular Muscles">
- Almindelige muskler
- </string>
<string name="Right Part">
Højre skildning
</string>
@@ -2753,9 +2959,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="Round">
Rund
</string>
- <string name="Round Forehead">
- Rund pande
- </string>
<string name="Ruddiness">
Rødmossethed
</string>
@@ -2768,24 +2971,12 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="Saddle Bags">
Ridebukselår
</string>
- <string name="Saddlebags">
- Ridebukselår
- </string>
- <string name="Scrawny">
- Radmager
- </string>
<string name="Scrawny Leg">
Magert ben
</string>
<string name="Separate">
Separat
</string>
- <string name="Shading">
- Skygger
- </string>
- <string name="Shadow hair">
- Skygge hår
- </string>
<string name="Shallow">
Lille
</string>
@@ -2798,15 +2989,9 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="Shear Front">
&quot;MÃ¥ne&quot;
</string>
- <string name="Shear Left">
- Venstre
- </string>
<string name="Shear Left Up">
Venstre op
</string>
- <string name="Shear Right">
- Højre
- </string>
<string name="Shear Right Up">
Højre op
</string>
@@ -2867,15 +3052,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="Shoulders">
Skuldre
</string>
- <string name="Side Bangs">
- Sidehår
- </string>
- <string name="Side Bangs Down">
- Ned
- </string>
- <string name="Side Bangs Up">
- Op
- </string>
<string name="Side Fringe">
Side frynser
</string>
@@ -2891,9 +3067,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="Sides Hair Up">
Op
</string>
- <string name="Skinny">
- Tynd
- </string>
<string name="Skinny Neck">
Tynd hals
</string>
@@ -2942,9 +3115,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="Socks Length">
Strømper - længde
</string>
- <string name="Some">
- Nogen
- </string>
<string name="Soulpatch">
Soulpatch
</string>
@@ -2963,9 +3133,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="Squash Head">
Bredt hovede
</string>
- <string name="Squash/Stretch Head">
- Sammentryk/stræk hovede
- </string>
<string name="Stretch Head">
Stræk hovede
</string>
@@ -2984,18 +3151,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="Sweep Forward">
Stryge fremad
</string>
- <string name="Swept Back">
- Tilbagestrøget
- </string>
- <string name="Swept Back Hair">
- Tilbagestrøget hår
- </string>
- <string name="Swept Forward">
- Fremadstrøget
- </string>
- <string name="Swept Forward Hair">
- Fremadstrøget hår
- </string>
<string name="Tall">
Høj
</string>
@@ -3014,9 +3169,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="Thick Toe">
Bred snude
</string>
- <string name="Thickness">
- Tykkelse
- </string>
<string name="Thin">
Tynd
</string>
@@ -3047,12 +3199,6 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="Tight Sleeves">
Stramme ærmer
</string>
- <string name="Tilt Left">
- Hæld til venstre
- </string>
- <string name="Tilt Right">
- Hæld til højre
- </string>
<string name="Toe Shape">
Sko form
</string>
@@ -3137,6 +3283,15 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="LocationCtrlComboBtnTooltip">
Min lokationshistorik
</string>
+ <string name="LocationCtrlAdultIconTooltip">
+ Adult region
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ Moderate region
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ Generel region
+ </string>
<string name="UpdaterWindowTitle">
[APP_NAME] Opdatér
</string>
@@ -3167,6 +3322,12 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="UpdaterFailStartTitle">
Opstart af klient fejlede
</string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME]: Genstande modtages for hurtigt fra [FROM_NAME], automatisk visning er slået fra i [TIME] sekunder
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME]: Genstande modtages for hurtigt, automatisk visning er slået fra i [TIME] sekunder
+ </string>
<string name="IM_logging_string">
-- Logning af IM aktiveret --
</string>
@@ -3194,6 +3355,27 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="IM_moderator_label">
(Moderator)
</string>
+ <string name="answered_call">
+ Dit opkald er blevet besvaret
+ </string>
+ <string name="you_started_call">
+ Du startede dette stemme kald
+ </string>
+ <string name="you_joined_call">
+ Du er nu med i stemme opkald
+ </string>
+ <string name="name_started_call">
+ [NAME] startede et stemmekald
+ </string>
+ <string name="ringing-im">
+ Tilslutter stemme opkald...
+ </string>
+ <string name="connected-im">
+ Forbundet, klik på Forlad for at lægge på
+ </string>
+ <string name="hang_up-im">
+ Forladt stemme opkald
+ </string>
<string name="only_user_message">
Du er den eneste deltager i denne samtale
</string>
@@ -3204,7 +3386,10 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
Tryk på [BUTTON NAME] knappen for at acceptére/tilslutte til denne stemme chat.
</string>
<string name="muted_message">
- Du har blokeret denne beboer. Hvis du starter en samtale vil denne blokering automatisk blive fjernet.
+ Du har blokeret denne beboer. Sendes en besked, vil beboeren fjernes fra blokeringslisten.
+ </string>
+ <string name="generic">
+ Fejl ved anmodning, prøv venligst igen senere
</string>
<string name="generic_request_error">
Kunne ikke etablere forbindelse, prøv igen senere
@@ -3224,19 +3409,252 @@ Hvis du bliver ved med at modtage denne besked, kontakt venligst [SUPPORT_SITE].
<string name="not_a_mod_error">
Du er ikke moderator for denne samtale.
</string>
+ <string name="muted">
+ En gruppe moderator har deaktiveret din tekst chat.
+ </string>
<string name="muted_error">
Du er blevet &quot;blokeret&quot;.
</string>
<string name="add_session_event">
Ikke muligt at tilføge brugere til samtale med [RECIPIENT].
</string>
+ <string name="message">
+ Kunne ikke sende din besked til session med [RECIPIENT].
+ </string>
<string name="message_session_event">
Ikke muligt at sende din besked til samtalen med [RECIPIENT].
</string>
+ <string name="mute">
+ Fejl under moderation.
+ </string>
+ <string name="removed">
+ Du er blevet fjernet fra denne gruppe.
+ </string>
<string name="removed_from_group">
Du er blevet fjernet fra gruppen.
</string>
<string name="close_on_no_ability">
Du har ikke længere mulighed for at deltage i samtalen
</string>
+ <string name="unread_chat_single">
+ [SOURCES] har sagt noget nyt
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] har sagt noget nyt
+ </string>
+ <string name="session_initialization_timed_out_error">
+ Initialisering af session er &quot;timed out&quot;
+ </string>
+ <string name="paid_you_ldollars">
+ [NAME] betalte dig L$[AMOUNT]
+ </string>
+ <string name="you_paid_ldollars">
+ Du betalte [NAME] L$[AMOUNT] [REASON].
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ Du betalte L$[AMOUNT].
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ Du betalte [NAME] L$[AMOUNT].
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ Du betalte L$[AMOUNT] [REASON].
+ </string>
+ <string name="for a parcel of land">
+ for en parcel land
+ </string>
+ <string name="for a land access pass">
+ for en billet til land
+ </string>
+ <string name="for deeding land">
+ for dedikering af land
+ </string>
+ <string name="to create a group">
+ for at oprette gruppe
+ </string>
+ <string name="to join a group">
+ for at blive medlem i gruppe
+ </string>
+ <string name="to upload">
+ for at uploade
+ </string>
+ <string name="giving">
+ Giver L$ [AMOUNT]
+ </string>
+ <string name="uploading_costs">
+ Pris for upload er L$ [AMOUNT]
+ </string>
+ <string name="this_costs">
+ Prisen er L$ [AMOUNT]
+ </string>
+ <string name="buying_selected_land">
+ Køber valgte land L$ [AMOUNT]
+ </string>
+ <string name="this_object_costs">
+ Dette objekt koster L$ [AMOUNT]
+ </string>
+ <string name="group_role_everyone">
+ Enhver
+ </string>
+ <string name="group_role_officers">
+ Administratorer
+ </string>
+ <string name="group_role_owners">
+ Ejere
+ </string>
+ <string name="uploading_abuse_report">
+ Uploader...
+
+Krænkelsesanmeldelse
+ </string>
+ <string name="New Shape">
+ Ny kropsbygning
+ </string>
+ <string name="New Skin">
+ Ny hud
+ </string>
+ <string name="New Hair">
+ Nyt hår
+ </string>
+ <string name="New Eyes">
+ Nye øjne
+ </string>
+ <string name="New Shirt">
+ Ny trøje
+ </string>
+ <string name="New Pants">
+ Nye bukser
+ </string>
+ <string name="New Shoes">
+ Nye sko
+ </string>
+ <string name="New Socks">
+ Nye strømper
+ </string>
+ <string name="New Jacket">
+ Ny jakke
+ </string>
+ <string name="New Gloves">
+ Nye handsker
+ </string>
+ <string name="New Undershirt">
+ Ny undertrøje
+ </string>
+ <string name="New Underpants">
+ Nye underbukser
+ </string>
+ <string name="New Skirt">
+ Ny nederdel
+ </string>
+ <string name="New Alpha">
+ Ny alpha
+ </string>
+ <string name="New Tattoo">
+ Ny tatovering
+ </string>
+ <string name="Invalid Wearable">
+ Kan ikke tages på
+ </string>
+ <string name="New Script">
+ Nyt script
+ </string>
+ <string name="New Folder">
+ Ny folder
+ </string>
+ <string name="Contents">
+ Indhold
+ </string>
+ <string name="Gesture">
+ Bevægelse
+ </string>
+ <string name="Male Gestures">
+ Mandlige bevægelser
+ </string>
+ <string name="Female Gestures">
+ Kvindelige bevægelser
+ </string>
+ <string name="Other Gestures">
+ Andre bevægelser
+ </string>
+ <string name="Speech Gestures">
+ Tale bevægelser
+ </string>
+ <string name="Common Gestures">
+ Almindelige bevægelser
+ </string>
+ <string name="Male - Excuse me">
+ Mand - Undskyld mig
+ </string>
+ <string name="Male - Get lost">
+ Mand - Skrid!
+ </string>
+ <string name="Male - Blow kiss">
+ Mand - Pust et kys
+ </string>
+ <string name="Male - Boo">
+ Mand - Boo
+ </string>
+ <string name="Male - Bored">
+ Mand - Keder sig
+ </string>
+ <string name="Male - Hey">
+ Mand - Hey
+ </string>
+ <string name="Male - Laugh">
+ Mand - Latter
+ </string>
+ <string name="Male - Repulsed">
+ Mand - Frastødt
+ </string>
+ <string name="Male - Shrug">
+ Mand - Skuldertræk
+ </string>
+ <string name="Male - Stick tougue out">
+ Mand - Stik tunge ud
+ </string>
+ <string name="Male - Wow">
+ Mand - Wow
+ </string>
+ <string name="FeMale - Excuse me">
+ Kvinde - Undskyld mig
+ </string>
+ <string name="FeMale - Get lost">
+ Kvinde - Skrid!
+ </string>
+ <string name="FeMale - Blow kiss">
+ Kvinde - Pust et kys
+ </string>
+ <string name="FeMale - Boo">
+ Kvinde - Boo
+ </string>
+ <string name="Female - Bored">
+ Kvinde - Keder sig
+ </string>
+ <string name="Female - Hey">
+ Kvinde - Hey
+ </string>
+ <string name="Female - Laugh">
+ Kvinde - Latter
+ </string>
+ <string name="Female - Repulsed">
+ Kvinde - Frastødt
+ </string>
+ <string name="Female - Shrug">
+ Kvinde - Skuldertræk
+ </string>
+ <string name="Female - Stick tougue out">
+ Kvinde - Stik tungen ud
+ </string>
+ <string name="Female - Wow">
+ Kvinde - Wow
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ ingen/ingen
+ </string>
+ <string name="texture_load_dimensions_error">
+ Kan ikke hente billeder større end [WIDTH]*[HEIGHT]
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/da/teleport_strings.xml b/indra/newview/skins/default/xui/da/teleport_strings.xml
index 43f8e5144d..071aab46f4 100644
--- a/indra/newview/skins/default/xui/da/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/da/teleport_strings.xml
@@ -63,6 +63,9 @@ Prøv evt. igen om lidt.
<message name="completing">
Fuldfører teleport.
</message>
+ <message name="completed_from">
+ Teleport fuldført fra [T_SLURL]
+ </message>
<message name="resolving">
Finder destination.
</message>
diff --git a/indra/newview/skins/default/xui/de/floater_about.xml b/indra/newview/skins/default/xui/de/floater_about.xml
index 0beb54032f..89f9f87043 100644
--- a/indra/newview/skins/default/xui/de/floater_about.xml
+++ b/indra/newview/skins/default/xui/de/floater_about.xml
@@ -8,7 +8,7 @@
Kompiliert mit [COMPILER] version [COMPILER_VERSION]
</floater.string>
<floater.string name="AboutPosition">
- Sie befinden sich in [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] auf [HOSTNAME] ([HOSTIP])
+ Sie befinden sich in [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] auf &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
[SERVER_VERSION]
[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
</floater.string>
@@ -43,13 +43,14 @@ Vivox-Version: [VIVOX_VERSION]
</panel>
<panel label="Danksagung" name="credits_panel">
<text_editor name="credits_editor">
- Second Life wird Ihnen präsentiert von Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl und vielen anderen.
+ Second Life wird Ihnen präsentiert von Philip, Tessa, Andrew, Cory, Ian, James, Phoenix, Ryan, Haney, Dan, Char, Ben, John, Tanya, Eddie, Richard, Mitch, Doug, Eric, Frank, Bruce, Aaron, Peter, Alice, Charlie, Debra, Eileen, Helen, Janet, Steffan, Steve, Tom, Mark, Hunter, Xenon, Burgess, Bill, Jim, Lee, Hamlet, Daniel, Jeff, Todd, Sarah, Tim, Stephanie, Colin, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Jack, Vektor, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Jesse, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Yuko, Makiko, Thomas, Harry, Seth, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Brad, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, Beez, Milo, Hermia, Red, Thrax, Gulliver, Joe, Sally, Paul, Jose, Rejean, Dore, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, Dustin, George, Del, Matthew, Cat, Jacqui, Adrian, Viola, Alfred, Noel, Irfan, Yool, Rika, Jane, Frontier, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Jeremy, JP, Jake, Anthony, Maurice, Madhavi, Leopard, Kyle, Joon, Bert, Belinda, Jon, Kristi, Bridie, Pramod, Socrates, Maria, Aric, Adreanne, Jay, Kari, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Colossus, Zen, BigPapi, Pastrami, Kurz, Mani, Neuro, Mel, Sardonyx, MJ, Rowan, Sgt, Elvis, Samuel, Leo, Bryan, Niko, Austin, Soft, Poppy, Rachel, Aki, Banzai, Alexa, Sue, Bender, CG, Angelo, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Rothman, Niall, Marin, Allison, Katie, Dawn, Dusty, Katt, Judy, Andrea, Ambroff, Infinity, Rico, Gail, Kalpana, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Maestro, Simone, Yang, T, Shannon, Nelson, Khanh, Scott, Courtney, Charlene, Quixote, Susan, Zed, Amanda, Katelin, Enkidu, Roxie, Esbee, JoRoan, Scarlet, Tay, Kevin, Wolfgang, Johnny, Ray, Andren, Merov, Bob, Rand, Howard, Callen, Heff, Galen, Newell, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl, Ashley, JessieAnn, Huseby, Karina, Paris, Kurt, Rick, Lis, Kotler, Theeba, Lynx, Murphy, Doten, Taka, Norm, Jillian, Marcus, Mae, Novack, Esther, Perry, Dana, Ducot, Javier, Porter, Madison, Gecko, Dough, JR, Gisele, Crimp, Norie, Arch, Kimi, Fisher, Barbara, Jason, Peggy, Bernard, Jules, Leroy, Eva, Khederian, Campbell, Vogt, Masido, Karel, Torres, Lo, Breezer, Delby, Rountree, Anna, Servus, Rue, Itiaes, Chuck, Luna, Novella, Zaza, Wen, Gino, Lex, Cassandra, Limey, Nancy, Anukul, Silver, Brodesky, Jinsai, Squid, Gez, Rakesh, Ladan, Edelman, Marcet, Squire, Tatem, Tony, Jerm, Tia, Falcon, BK, Tiggs, Driscoll, Bacon, Timothee, Cru, Carmilla, Coyot, Webb, Kazu, Rudas, LJ, Sea, Ali Wallace, Bewest, Pup, Drub, Dragon, Inoshiro, Byron, Rhett, Xandix, Aimee, Fredrik, Thor, Teddy, Baron, Nelly, Ghengis, Epic, Eli, Stone, Grapes, Irie, Prep, Scobu, Valerie, Alain und vielen anderen.
-Vielen Dank den folgenden Einwohnern, die uns geholfen haben, dies zur bisher besten Version zu machen: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
+Wir bedanken uns bei folgenden Einwohnern, die uns geholfen haben, dies zur bisher besten Version zu machen: Drew Dwi, Zai Lynch, Latif Khalifa, Ellla McMahon, Harleen Gretzky, Squirrel Wood, Malarthi Behemoth, Dante Tucker, Buckaroo Mu, Eddi Decosta, Dirk, Talamasca, Torben Trautman, Irene Muni, Lilly Zenovka, Vick Forcella, Sasy Scarborough, Gentle Welinder, Elric Anatine, Techwolf Lupindo, Dusan Writer, WolfPup Lowenhar, Marianne McCann, Fiachra Lach, Sitearm Madonna, Sudane Erato, Sahkolihaa Contepomi, Sachi Vixen, Questar Utu, Dimitrio Lewis, Matto Destiny, Scrim Pinion, Radio Signals, Psi Merlin, Pixel Gausman, Mel Vanbeeck, Laurent Bechir, Lamorna Proctor, Lares Carter, Gwyneth Llewelyn, Hydra Shaftoe, Holger Gilruth, Gentle Heron, Carla Broek, Boroondas Gupte, Fury Rosewood, Flower Ducatillon, Colpo Wexler, gwampa Lomu, Borg Capalini, Beansy Twine, Ardy Lay, , 45ms Zhong, Adeon Writer, Aeonix Aeon, Ai Austin, Aiko Ying, Alexandrea Fride, Alliez Mysterio, Annie Milestone, Annika Genezzia, Ansariel Hiller, ArminasX Saiman, Arya Braveheart, Asaeda Meltingdots, Asturkon Jua, Avallyn Oakleaf, Avatar Quinzet, BabyA Littlething, Bacchus Ireto, Bazaar, Riva, Benjamin Bigdipper, Beth Walcher, Bezilon Kasei, Biancaluce Robbiani, Bill Walach, blakopal Galicia, Blitzckreed Levenque, Bryn Oh, Callipygian Christensen, Cap Carver, Carr Arbenlow, Chantal Harvey, Charles Courtois, Charlie Sazaland, Cherry Cheevers, ChickyBabes Zuzu, Christopher Organiser, Ciaran Laval, Clara Young, Celierra Darling, Corinne Helendale, Corro Moseley, Coughdrop Littlething, Darien Caldwell, Dartagan Shepherd, Debs Regent, Decro Schmooz, Denim Kamachi, DiJodi Dubratt, Dil Spitz, Edgware Marker, Egehan Dryke, Emma Portilo, Emmie Fairymeadow, Evangelista Emerald, Faelon Swordthain, Frenchimmo Sabra, Gaberoonie Zanzibar, Ganymedes Costagravas, Gene Frostbite, GeneJ Composer, Giggles Littlebird, Grady Echegaray, Guni Greenstein, Gypsy Tripsa, Hackshaven Harford, Ham Rambler, Han Shuffle, Hanglow Short, Hatzfeld Runo, herina Bode, Horatio Freund, Hypatia Callisto, Hypatia Pickens, Identity Euler, Imnotgoing Sideways, Innula Zenovka, Iyoba Tarantal, Jack Abraham, Jagga Meredith, Jennifer Boyle, Jeremy Marquez, Jessica Qin, Jinx Nordberg, Jo Bernandes, Jocial Sonnenkern, Joel Savard, Jondan Lundquist, Josef Munster, Josette Windlow, Juilan Tripsa, Juro Kothari, Justin RiversRunRed, Kagehi Kohn, Kaimen Takahe, Keklily Longfall, Ken Lavender, Kestral Karas, Khisme Nitely, Kimar Coba, Kithrak Kirkorian, Kitty Barnett, Kolor Fall, Komiko Okamoto, Korvel Noh, Larry Pixel, Leal Choche, len Starship, Lenae Munz, Lexi Frua, Lillie Cordeaux, Lizzy Macarthur, LSL Scientist, Luban Yiyuan, Luc Starsider, Maccus McCullough, Madison Blanc, Maggie Darwin, Mallory Destiny, Manx Wharton, Marc Claridge, Marc2 Sands, Matthew Anthony, Maxim RiversRunRed, Medhue Simoni, Melinda Latynina, Mencius Watts, Michi Lumin, Midian Farspire, Miles Glaz, Mindy Mathy, Mitch Wagner, Mo Hax, Mourna Biziou, Nao Noe, naofan Teardrop, Naomah Beaumont, Nathiel Siamendes, Nber Medici, Neko Link, Netpat Igaly, Neutron Chesnokov, Newfie Pendragon, Nicholai Laviscu, Nick Rhodes, Nicoladie Gymnast, Ollie Kubrick, Orenj Marat, Orion Delphis, Oryx Tempel, Parvati Silverweb, PeterPunk Mooney, Pixel Scientist, Pounce Teazle, Professor Noarlunga, Quantum Destiny, Quicksilver Hermes, Ralf Setsuko, RAT Quan, RedMokum Bravin, Revolution Perenti, Rezit Sideways, Rich Grainger, Rosco Teardrop, Rose Evans, Rudee Voom, RufusTT Horsefly, Saii Hallard, SaintLEOlions Zimer, Samm Larkham, Satanello Miami, SexySteven Morrisey, Sheet Spotter, Shnurui Troughton, sicarius Thorne, Sicarius Toxx, Sini Nubalo, SLB Wirefly, snowy Sidran, Soupa Segura, ST Mensing, Starshine Halasy, Stickman Ingmann, Synystyr Texan, Takeda Terrawyng, Tali Rosca, Templar Merlin, Tezcatlipoca Bisiani, Tiel Stonecutter, Tony Kembia, TouchaHoney Perhaps, Trey Reanimator, TriloByte Zanzibar, Trinity Dechou, Trinity Dejavu, Unlikely Quintessa, UsikuFarasi Kanarik, Veritas Raymaker, Vex Streeter, Viaticus Speculaas, Villain Baroque, Vixie Durant, Void Singer, Watty Berkson, Westley Schridde, Westley Streeter, Whimsy Winx, Winter Ventura, Wundur Primbee, xstorm Radek, YongYong Francois, Zak Westminster, Zana Kohime, Zaren Alexander, Zeja Pyle, ZenMondo Wormser, Zoex Flanagan und vielen anderen.
-Um im Geschäftsleben erfolreich zu sein, sei kühn, sei schnell, sei anders. --Henry Marchant
+
+„Die Arbeit beginnt aufs Neue, die Hoffnung lebt weiter, und der Traum wird niemals sterben.“ - Edward Kennedy
</text_editor>
</panel>
<panel label="Lizenzen" name="licenses_panel">
@@ -73,7 +74,8 @@ google-perftools Copyright (c) 2005, Google Inc.
Alle Rechte vorbehalten. Details siehe licenses.txt.
-Voice-Chat-Audiocoding: Polycom(R) Siren14(TM) (ITU-T Empf.G.722.1 Anhang C)
+Voice-Chat-Audiocoding: Polycom(R) Siren14(TM)
+(ITU-T Empf.G.722.1 Anhang C)
</text_editor>
</panel>
</tab_container>
diff --git a/indra/newview/skins/default/xui/de/floater_about_land.xml b/indra/newview/skins/default/xui/de/floater_about_land.xml
index cd5abf86e0..3026ff64b2 100644
--- a/indra/newview/skins/default/xui/de/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_about_land.xml
@@ -1,5 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floaterland" title="LAND-INFO">
+ <floater.string name="maturity_icon_general">
+ &quot;Parcel_PG_Dark&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_moderate">
+ &quot;Parcel_M_Dark&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_adult">
+ &quot;Parcel_R_Dark&quot;
+ </floater.string>
<floater.string name="Minutes">
[MINUTES] Minuten
</floater.string>
@@ -12,7 +21,7 @@
<floater.string name="Remaining">
Restzeit
</floater.string>
- <tab_container name="landtab">
+ <tab_container name="landtab" tab_min_width="40" width="489">
<panel label="ALLGEMEIN" name="land_general_panel">
<panel.string name="new users only">
Nur neue Benutzer
@@ -83,7 +92,7 @@
<text name="GroupText">
Leyla Linden
</text>
- <button label="Festlegen" label_selected="Einstellen..." name="Set..."/>
+ <button label="Festlegen" label_selected="Einstellen..." name="Set..." width="90"/>
<check_box label="Übertragung an Gruppe zulassen" name="check deed" tool_tip="Ein Gruppen-Officer kann dieses Land der Gruppe übertragen. Das Land wird dann über die Landzuteilung der Gruppe verwaltet."/>
<button label="Übertragung" label_selected="Übertragen..." name="Deed..." tool_tip="Sie können Land nur übertragen, wenn Sie in der ausgewählten Gruppe Officer sind."/>
<check_box label="Eigentümer leistet Beitrag durch Übertragung" name="check contrib" tool_tip="Wenn das Land an die Gruppe übertragen wird, trägt der frühere Eigentümer ausreichend Landnutzungsrechte bei, um es zu halten."/>
@@ -101,10 +110,10 @@
<text name="For sale to">
Zum Verkauf an: [BUYER]
</text>
- <text name="Sell with landowners objects in parcel." width="210">
+ <text left_delta="-50" name="Sell with landowners objects in parcel." width="240">
Objekte sind im Verkauf eingeschlossen
</text>
- <text name="Selling with no objects in parcel." width="237">
+ <text name="Selling with no objects in parcel." width="260">
Objekte sind im Verkauf nicht eingeschlossen
</text>
<button bottom="-222" label="Landverkauf abbrechen" label_selected="Landverkauf abbrechen" name="Cancel Land Sale"/>
@@ -142,15 +151,13 @@
Gekauftes Land in dieser Region kann nicht wiederverkauft werden.
</panel.string>
<panel.string name="can_change">
- Gekauftes Land in dieser Region kann zusammengelegt und
-geteilt werden.
+ Gekauftes Land in dieser Region kann zusammengelegt und geteilt werden.
</panel.string>
<panel.string name="can_not_change">
- Gekauftes Land in dieser Region kann nicht zusammengelegt
-und geteilt werden.
+ Gekauftes Land in dieser Region kann nicht zusammengelegt und geteilt werden.
</panel.string>
<text name="estate_section_lbl">
- Grundstück:
+ Grundbesitz:
</text>
<text name="estate_name_text">
Mainland
@@ -162,7 +169,7 @@ und geteilt werden.
(keiner)
</text>
<text_editor name="covenant_editor">
- Für dieses Grundstück fehlt der Vertrag.
+ Für diesen Grundbesitz fehlt der Vertrag.
</text_editor>
<text name="covenant_timestamp_text">
Letzte Änderung am Mittwoch, den 31. Dez. 1969, 16:00:00
@@ -230,7 +237,7 @@ werden.
<text left="14" name="Owned by parcel owner:" width="200">
Im Eigentum des Parzellenbesitzers:
</text>
- <text left="204" name="owner_objects_text" width="48">
+ <text left="204" left_delta="200" name="owner_objects_text" width="48">
[COUNT]
</text>
<button label="Anzeigen" label_selected="Anzeigen" name="ShowOwner" right="-135" width="60"/>
@@ -257,7 +264,7 @@ werden.
<text left="204" name="selected_objects_text" width="48">
[COUNT]
</text>
- <text left="4" name="Autoreturn" width="380">
+ <text name="Autoreturn">
Objekte anderer Einwohner automatisch zurückgeben (Minuten, 0 für aus):
</text>
<line_editor name="clean other time" right="-10" width="56"/>
@@ -269,8 +276,8 @@ werden.
<name_list name="owner list">
<name_list.columns label="Typ" name="type"/>
<name_list.columns label="Name" name="name"/>
- <name_list.columns label="Zählen" name="count"/>
- <name_list.columns label="Aktuellster" name="mostrecent"/>
+ <name_list.columns label="Anzahl" name="count" width="80"/>
+ <name_list.columns label="Aktuellstes" name="mostrecent"/>
</name_list>
</panel>
<panel label="OPTIONEN" name="land_options_panel">
@@ -328,8 +335,8 @@ Nur große Parzellen können in der Suche aufgeführt werden.
<text name="land_options_label">
Landoptionen:
</text>
- <check_box label="Sicher (kein Schaden)" name="check safe" tool_tip="Falls aktiviert, wird Land auf Option „Sicher“ eingestellt, Kampfschäden sind deaktiviert. Falls nicht aktiviert, sind Kampfschäden aktiviert."/>
- <check_box label="Kein Stoßen" name="PushRestrictCheck" tool_tip="Verhindert Skripte am Stoßen. Durch Aktivieren dieser Option verhindern Sie störendes Verhalten auf Ihrem Land."/>
+ <check_box label="Sicher (kein Schaden)" name="check safe" tool_tip="Falls aktiviert, wird Land auf Option „Sicher“ eingestellt, Kampfschäden sind deaktiviert. Ansonsten sind Kampfschäden aktiviert."/>
+ <check_box label="Kein Stoßen" name="PushRestrictCheck" tool_tip="Verhindert Stoßen durch Skripte. Durch Aktivieren dieser Option verhindern Sie störendes Verhalten auf Ihrem Land."/>
<check_box label="Ort in Suche anzeigen (30 L$/Woche)" name="ShowDirectoryCheck" tool_tip="Diese Parzelle in Suchergebnissen anzeigen."/>
<combo_box name="land category with adult">
<combo_box.item label="Alle Kategorien" name="item0"/>
@@ -346,7 +353,7 @@ Nur große Parzellen können in der Suche aufgeführt werden.
<combo_box.item label="Shopping" name="item11"/>
<combo_box.item label="Sonstige" name="item12"/>
</combo_box>
- <combo_box left="266" name="land category" width="130">
+ <combo_box name="land category">
<combo_box.item label="Alle Kategorien" name="item0"/>
<combo_box.item label="Lindenort" name="item1"/>
<combo_box.item label="Kunst und Kultur" name="item3"/>
@@ -368,7 +375,7 @@ Nur große Parzellen können in der Suche aufgeführt werden.
<text name="landing_point">
Landepunkt: [LANDING]
</text>
- <button label="Festlegen" label_selected="Festlegen" left="234" name="Set" tool_tip="Legt den Landepunkt fest, an dem Besucher ankommen. Legt die Position Ihres Avatars innerhalb dieser Parzelle fest." width="70"/>
+ <button label="Festlegen" label_selected="Festlegen" left="234" name="Set" right="-88" tool_tip="Legt Ihren Standort als Landepunkt fest, an dem Besucher ankommen. Legt die Position Ihres Avatars innerhalb dieser Parzelle fest." width="70"/>
<button label="Löschen" label_selected="Löschen" left="312" name="Clear" tool_tip="Landepunkt löschen" width="70"/>
<text name="Teleport Routing: ">
Teleport-Route:
@@ -387,11 +394,7 @@ Nur große Parzellen können in der Suche aufgeführt werden.
<text name="at URL:">
Homepage:
</text>
- <button label="Festlegen" label_selected="Einstellen..." name="set_media_url"/>
- <text name="CurrentURL:">
- Aktuelle Seite:
- </text>
- <button label="Zurücksetzen..." label_selected="Zurücksetzen..." name="reset_media_url" tool_tip="URL aktualisieren"/>
+ <button label="Festlegen" name="set_media_url"/>
<check_box label="URL ausblenden" name="hide_media_url" tool_tip="Aktivieren Sie diese Option, wenn Sie nicht möchten, dass unautorisierte Personen die Medien-URL sehen können. Diese Option ist für HTML-Medien nicht verfügbar."/>
<text name="Description:">
Inhalt:
@@ -422,6 +425,7 @@ Nur große Parzellen können in der Suche aufgeführt werden.
<text name="MusicURL:">
Musik-URL:
</text>
+ <check_box label="URL ausblenden" name="hide_music_url" tool_tip="Aktivieren Sie diese Option, wenn Sie nicht möchten, dass unautorisierte Personen die Musik-URL sehen können"/>
<text name="Sound:">
Sound:
</text>
@@ -430,25 +434,28 @@ Nur große Parzellen können in der Suche aufgeführt werden.
Voice:
</text>
<check_box label="Voice aktivieren" name="parcel_enable_voice_channel"/>
- <check_box label="Voice aktivieren (vom Grundstück eingerichtet)" name="parcel_enable_voice_channel_is_estate_disabled"/>
- <check_box label="Voice auf diese Parzelle beschränken" name="parcel_enable_voice_channel_parcel"/>
+ <check_box label="Voice aktivieren (vom Grundbesitz eingerichtet)" name="parcel_enable_voice_channel_is_estate_disabled"/>
+ <check_box label="Voice auf diese Parzelle beschränken" name="parcel_enable_voice_channel_local"/>
</panel>
<panel label="ZUGANG" name="land_access_panel">
<panel.string name="access_estate_defined">
- (Durch Grundstück festgelegt)
+ (Durch Grundbesitz festgelegt)
+ </panel.string>
+ <panel.string name="allow_public_access">
+ Öffentlichen Zugang erlauben ([MATURITY])
</panel.string>
<panel.string name="estate_override">
- Eine oder mehrere dieser Optionen gelten auf Grundstücksebene
+ Eine oder mehrere dieser Optionen gelten auf Grundbesitzebene
</panel.string>
<text name="Limit access to this parcel to:">
Zugang zu dieser Parzelle
</text>
<check_box label="Öffentlichen Zugang erlauben [MATURITY]" name="public_access"/>
- <text name="Only Allow">
+ <text name="Only Allow" width="400">
Zugang auf Einwohner beschränken, die überprüft wurden von:
</text>
- <check_box label="Zahlungsinformation gespeichert [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Nicht identifizierte Einwohner verbannen."/>
- <check_box label="Altersüberprüfung [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Einwohner ohne Altersüberprüfung verbannen. Weitere Informationen finden Sie auf [SUPPORT_SITE]."/>
+ <check_box label="Zahlungsinformation gespeichert [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Einwohner ohne Zahlungsinformation nicht zulassen."/>
+ <check_box label="Altersüberprüfung [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Einwohner ohne Altersüberprüfung nicht zulassen. Weitere Informationen finden Sie im [SUPPORT_SITE]."/>
<check_box label="Gruppenzugang erlauben: [GROUP]" name="GroupCheck" tool_tip="Gruppe im Register „Allgemein“ festlegen."/>
<check_box label="Pässe verkaufen an:" name="PassCheck" tool_tip="Ermöglicht befristeten Zugang zu dieser Parzelle"/>
<combo_box name="pass_combo">
diff --git a/indra/newview/skins/default/xui/de/floater_animation_preview.xml b/indra/newview/skins/default/xui/de/floater_animation_preview.xml
index ce971d158d..82a4a51d07 100644
--- a/indra/newview/skins/default/xui/de/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/de/floater_animation_preview.xml
@@ -106,6 +106,9 @@ Maximal erlaubt sind [MAX_LENGTH] Sekunden.
<floater.string name="E_ST_NO_XLT_EMOTE">
Emote-Name kann nicht gelesen werden.
</floater.string>
+ <floater.string name="E_ST_BAD_ROOT">
+ Falscher Root-Joint-Name, &quot;hip&quot; verwenden.
+ </floater.string>
<text name="name_label">
Name:
</text>
@@ -139,35 +142,35 @@ Maximal erlaubt sind [MAX_LENGTH] Sekunden.
Ausdruck
</text>
<combo_box label="" name="emote_combo" tool_tip="Steuert Gesichtsregungen während der Animation">
- <combo_box.item label="(Keiner)" name="[None]"/>
- <combo_box.item label="Aaaaah" name="Aaaaah"/>
- <combo_box.item label="Ängstlich" name="Afraid"/>
- <combo_box.item label="Verärgert" name="Angry"/>
- <combo_box.item label="Grinst" name="BigSmile"/>
- <combo_box.item label="Gelangweilt" name="Bored"/>
- <combo_box.item label="Weinen" name="Cry"/>
- <combo_box.item label="Verachten" name="Disdain"/>
- <combo_box.item label="Verlegen" name="Embarrassed"/>
- <combo_box.item label="Stirnrunzeln" name="Frown"/>
- <combo_box.item label="Küssen" name="Kiss"/>
- <combo_box.item label="Lachen" name="Laugh"/>
- <combo_box.item label="Bäääh" name="Plllppt"/>
- <combo_box.item label="Angewidert" name="Repulsed"/>
- <combo_box.item label="Traurig" name="Sad"/>
- <combo_box.item label="Schulterzucken" name="Shrug"/>
- <combo_box.item label="Lächeln" name="Smile"/>
- <combo_box.item label="Überraschung" name="Surprise"/>
- <combo_box.item label="Zwinkern" name="Wink"/>
- <combo_box.item label="Sorgenvoll" name="Worry"/>
+ <item label="(Keiner)" name="[None]" value=""/>
+ <item label="Aaaaah" name="Aaaaah" value="Aaaaah"/>
+ <item label="Ängstlich" name="Afraid" value="Ängstlich"/>
+ <item label="Verärgert" name="Angry" value="Verärgert"/>
+ <item label="Grinst" name="BigSmile" value="Grinsend"/>
+ <item label="Gelangweilt" name="Bored" value="Gelangweilt"/>
+ <item label="Weinen" name="Cry" value="Weinen"/>
+ <item label="Verachten" name="Disdain" value="Verachten"/>
+ <item label="Verlegen" name="Embarrassed" value="Verlegen"/>
+ <item label="Stirnrunzeln" name="Frown" value="Stirnrunzeln"/>
+ <item label="Küssen" name="Kiss" value="Küssen"/>
+ <item label="Lachen" name="Laugh" value="Lachen"/>
+ <item label="Bäääh" name="Plllppt" value="Bäääh"/>
+ <item label="Angewidert" name="Repulsed" value="Angewidert"/>
+ <item label="Traurig" name="Sad" value="Traurig"/>
+ <item label="Schulterzucken" name="Shrug" value="Schulterzucken"/>
+ <item label="Lächeln" name="Smile" value="Lächeln"/>
+ <item label="Überraschung" name="Surprise" value="Überraschung"/>
+ <item label="Zwinkern" name="Wink" value="Zwinkern"/>
+ <item label="Sorgenvoll" name="Worry" value="Sorgenvoll"/>
</combo_box>
<text name="preview_label" width="97">
Vorschau während:
</text>
<combo_box label="" left_delta="107" name="preview_base_anim" tool_tip="Hiermit können Sie das Verhalten Ihres Avatars testen, während Ihr Avatar normale Bewegungen ausführt.">
- <combo_box.item label="Stehend" name="Standing"/>
- <combo_box.item label="Geht" name="Walking"/>
- <combo_box.item label="Sitzt" name="Sitting"/>
- <combo_box.item label="Fliegen" name="Flying"/>
+ <item label="Stehend" name="Standing" value="Stehend"/>
+ <item label="Geht" name="Walking" value="Gehend"/>
+ <item label="Sitzt" name="Sitting" value="Sitzend"/>
+ <item label="Fliegen" name="Flying" value="Fliegen"/>
</combo_box>
<spinner label="Eingang glätten (s)" label_width="105" name="ease_in_time" tool_tip="Einblendungsgeschwindigkeit von Animationen (in Sekunden)" width="175"/>
<spinner bottom_delta="-20" label="Ausgang glätten (s)" label_width="105" left="10" name="ease_out_time" tool_tip="Ausblendegeschwindigkeit von Animationen (in Sekunden)" width="175"/>
@@ -180,6 +183,6 @@ Maximal erlaubt sind [MAX_LENGTH] Sekunden.
Wir empfehlen exportierte BVH-Dateien aus Poser 4.
</text>
- <button label="Hochladen ([AMOUNT] L$)" name="ok_btn"/>
- <button label="Abbrechen" name="cancel_btn"/>
+ <button label="Hochladen ([AMOUNT] L$)" name="ok_btn" width="160"/>
+ <button label="Abbrechen" left="180" name="cancel_btn" width="88"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_avatar_picker.xml b/indra/newview/skins/default/xui/de/floater_avatar_picker.xml
index bc78ccd7f8..6eb99f8b42 100644
--- a/indra/newview/skins/default/xui/de/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/de/floater_avatar_picker.xml
@@ -21,11 +21,12 @@
<tab_container name="ResidentChooserTabs">
<panel label="Suchen" name="SearchPanel">
<text name="InstructSearchResidentName">
- Geben Sie einen Teil des Namens einer Person ein:
+ Geben Sie einen Teil des Namens einer
+Person ein:
</text>
- <line_editor bottom_delta="-36" name="Edit"/>
- <button label="Los" label_selected="Los" name="Find"/>
- <scroll_list bottom_delta="-79" height="74" name="SearchResults"/>
+ <line_editor bottom_delta="-76" name="Edit" top_pad="16"/>
+ <button label="Los" label_selected="Los" name="Find" top="70"/>
+ <scroll_list top="80" height="54" name="SearchResults"/>
</panel>
<panel label="Freunde" name="FriendsPanel">
<text name="InstructSelectFriend">
@@ -40,8 +41,24 @@
<text name="meters">
Meter
</text>
- <button font="SansSerifSmall" label="Liste aktualisieren" label_selected="Liste aktualisieren" left_delta="10" name="Refresh" width="105"/>
- <scroll_list bottom_delta="-169" height="159" name="NearMe"/>
+ <button
+ follows="top|left"
+ layout="topleft"
+ left_pad="0"
+ height="28"
+ width="28"
+ name="Refresh"
+ image_overlay="Refresh_Off" />
+ <scroll_list
+ follows="all"
+ height="100"
+ border="false"
+ layout="topleft"
+ left="0"
+ name="NearMe"
+ sort_column="0"
+ top="50"
+ width="132" />
</panel>
</tab_container>
<button label="OK" label_selected="OK" name="ok_btn"/>
diff --git a/indra/newview/skins/default/xui/de/floater_avatar_textures.xml b/indra/newview/skins/default/xui/de/floater_avatar_textures.xml
index 3be5194a8f..92c0c4a27a 100644
--- a/indra/newview/skins/default/xui/de/floater_avatar_textures.xml
+++ b/indra/newview/skins/default/xui/de/floater_avatar_textures.xml
@@ -3,10 +3,10 @@
<floater.string name="InvalidAvatar">
UNGÜLTIGER AVATAR
</floater.string>
- <text name="label">
+ <text name="label" width="120">
Gebackene Texturen
</text>
- <text name="composite_label" width="150">
+ <text name="composite_label" width="170">
Zusammengesetzte Texturen
</text>
<button label="Läd IDs in Konsole ab" label_selected="Abladen" name="Dump"/>
@@ -16,14 +16,15 @@
<texture_picker label="Haare" name="hair_grain"/>
<texture_picker label="Alpha: Haare" name="hair_alpha"/>
<texture_picker label="Kopf" name="head-baked"/>
- <texture_picker label="Make-Uup" name="head_bodypaint"/>
+ <texture_picker label="Make-Up" name="head_bodypaint"/>
<texture_picker label="Kopf: Alpha" name="head_alpha"/>
<texture_picker label="Kopftattoo" name="head_tattoo"/>
<texture_picker label="Augen" name="eyes-baked"/>
<texture_picker label="Auge" name="eyes_iris"/>
<texture_picker label="Alpha: Augen" name="eyes_alpha"/>
<texture_picker label="Oberkörper" name="upper-baked"/>
- <texture_picker label="Oberkörper: Körperfarbe" name="upper_bodypaint"/>
+ <texture_picker label="Oberkörper: Körperfarbe" name="upper_bodypaint" width=
+ "140"/>
<texture_picker label="Unterhemd" name="upper_undershirt"/>
<texture_picker label="Handschuhe" name="upper_gloves"/>
<texture_picker label="Hemd" name="upper_shirt"/>
@@ -31,7 +32,8 @@
<texture_picker label="Alpha: Oben" name="upper_alpha"/>
<texture_picker label="Obere Tattoos" name="upper_tattoo"/>
<texture_picker label="Unterkörper" name="lower-baked"/>
- <texture_picker label="Unterkörper: Körperfarbe" name="lower_bodypaint"/>
+ <texture_picker label="Unterkörper: Körperfarbe" name="lower_bodypaint" width=
+ "140"/>
<texture_picker label="Unterhose" name="lower_underpants"/>
<texture_picker label="Socken" name="lower_socks"/>
<texture_picker label="Schuhe" name="lower_shoes"/>
diff --git a/indra/newview/skins/default/xui/de/floater_beacons.xml b/indra/newview/skins/default/xui/de/floater_beacons.xml
index 50a4555ae0..6e83e0419b 100644
--- a/indra/newview/skins/default/xui/de/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/de/floater_beacons.xml
@@ -5,7 +5,7 @@
Anzeigen:
</text>
<check_box label="Strahlen" name="beacons"/>
- <check_box label="Glanzlichter" name="highlights"/>
+ <check_box label="Hervorhebung" name="highlights"/>
<text name="beacon_width_label" tool_tip="Strahlbreite">
Breite:
</text>
diff --git a/indra/newview/skins/default/xui/de/floater_build_options.xml b/indra/newview/skins/default/xui/de/floater_build_options.xml
index b70c859490..e90eb2c00b 100644
--- a/indra/newview/skins/default/xui/de/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/de/floater_build_options.xml
@@ -2,7 +2,7 @@
<floater name="build options floater" title="RASTER-OPTIONEN">
<spinner label="Raster-Einheiten (Meter)" name="GridResolution"/>
<spinner label="Rastergröße (Meter)" name="GridDrawSize"/>
- <check_box label="Einrasten von Untereinheiten aktivieren" name="GridSubUnit"/>
+ <check_box label="An Untereinheiten ausrichten" name="GridSubUnit"/>
<check_box label="Überschneidungen anzeigen" name="GridCrossSection"/>
<text name="grid_opacity_label" tool_tip="Raster-Deckkraft">
Deckkraft:
diff --git a/indra/newview/skins/default/xui/de/floater_bulk_perms.xml b/indra/newview/skins/default/xui/de/floater_bulk_perms.xml
index 218c66d298..d3f0d6d78f 100644
--- a/indra/newview/skins/default/xui/de/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/de/floater_bulk_perms.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterbulkperms" title="INHALTS-BERECHTIGUNGEN BEARBEITEN">
+<floater name="floaterbulkperms" title="BERECHTIGUNGEN BEARBEITEN">
<floater.string name="nothing_to_modify_text">
Auswahl enthält keinen Inhalt, der bearbeitet werden kann.
</floater.string>
@@ -43,7 +43,7 @@
Jeder:
</text>
<check_box label="Kopieren" name="everyone_copy"/>
- <text name="NextOwnerLabel">
+ <text name="NextOwnerLabel" top="160" left="10" width="200">
Nächster Eigentümer:
</text>
<check_box label="Bearbeiten" name="next_owner_modify"/>
diff --git a/indra/newview/skins/default/xui/de/floater_buy_currency.xml b/indra/newview/skins/default/xui/de/floater_buy_currency.xml
index aa6201ec26..f978b24d0d 100644
--- a/indra/newview/skins/default/xui/de/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/de/floater_buy_currency.xml
@@ -18,13 +18,13 @@
<text name="balance_amount">
[AMT] L$
</text>
- <text name="currency_action" width="90">
+ <text name="currency_action">
Ich möchte kaufen
</text>
<text name="currency_label">
L$
</text>
- <line_editor label="L$" left_delta="55" name="currency_amt">
+ <line_editor label="L$" name="currency_amt">
1234
</line_editor>
<text name="buying_label">
@@ -37,7 +37,7 @@
Schätzung erfolgt...
</text>
<text name="buy_action">
- [NAME] L$ [PRICE]
+ [ACTION]
</text>
<text name="total_label">
Mein neuer Kontostand wird sein
@@ -52,7 +52,7 @@
Geben Sie den Betrag erneut ein, um die aktuellste Umtauschrate anzuzeigen.
</text>
<text name="purchase_warning_repurchase">
- Nach Bestätigung dieses Kaufs werden nur L$ gekauft, nicht das Objekt.
+ Achtung: Sie kaufen L$, nicht das Objekt.
</text>
<text name="purchase_warning_notenough">
Sie kaufen nicht genügend L$. Bitte erhöhen Sie den Betrag.
@@ -62,5 +62,5 @@
<text name="info_cannot_buy">
Kauf nicht möglich
</text>
- <button label="Weiter zum Internet" name="error_web"/>
+ <button label="Weiter zur Kontoseite" name="error_web"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_buy_land.xml b/indra/newview/skins/default/xui/de/floater_buy_land.xml
index 4c59f1e8e6..5369155cf9 100644
--- a/indra/newview/skins/default/xui/de/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_buy_land.xml
@@ -1,43 +1,167 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="buy land" title="LAND KAUFEN">
+ <floater.string name="can_resell">
+ Verkauf möglich.
+ </floater.string>
+ <floater.string name="can_not_resell">
+ Verkauf nicht möglich.
+ </floater.string>
+ <floater.string name="can_change">
+ Zusammenlegen/unterteilen möglich.
+ </floater.string>
+ <floater.string name="can_not_change">
+ Zusammenlegen/unterteilen nicht möglich.
+ </floater.string>
+ <floater.string name="cant_buy_for_group">
+ Sie sind nicht berechtigt, Land für die aktive Gruppe zu kaufen.
+ </floater.string>
+ <floater.string name="no_land_selected">
+ Kein Land ausgewählt.
+ </floater.string>
+ <floater.string name="multiple_parcels_selected">
+ Mehrere unterschiedliche Parzellen ausgewählt.
+Verkleinern Sie Ihre Auswahl.
+ </floater.string>
+ <floater.string name="no_permission">
+ Sie sind nicht berechtigt, Land für die aktive Gruppe zu kaufen.
+ </floater.string>
+ <floater.string name="parcel_not_for_sale">
+ Die ausgewählte Parzelle steht nicht zum Verkauf.
+ </floater.string>
+ <floater.string name="group_already_owns">
+ Die Parzelle befindet sich bereits in Gruppenbesitz.
+ </floater.string>
+ <floater.string name="you_already_own">
+ Die Parzelle gehört Ihnen bereits.
+ </floater.string>
+ <floater.string name="set_to_sell_to_other">
+ Die ausgewählte Parzelle steht zum Verkauf an Dritte.
+ </floater.string>
+ <floater.string name="no_public_land">
+ Das ausgewählte Land beinhaltet kein öffentliches Land.
+ </floater.string>
+ <floater.string name="not_owned_by_you">
+ Sie haben Land ausgewählt, das einer anderen Person gehört.
+Verkleinern Sie Ihre Auswahl.
+ </floater.string>
+ <floater.string name="processing">
+ Kauf wird abgewickelt...
+
+(Dies kann 1 bis 2 Minuten dauern.)
+ </floater.string>
+ <floater.string name="fetching_error">
+ Fehler bei Abfrage der Landkauf-Informationen.
+ </floater.string>
+ <floater.string name="buying_will">
+ Bei Landkauf:
+ </floater.string>
+ <floater.string name="buying_for_group">
+ Landkauf für Gruppe:
+ </floater.string>
+ <floater.string name="cannot_buy_now">
+ Kaufen jetzt nicht möglich:
+ </floater.string>
+ <floater.string name="not_for_sale">
+ Nicht zu verkaufen:
+ </floater.string>
+ <floater.string name="none_needed">
+ nicht benötigt
+ </floater.string>
+ <floater.string name="must_upgrade">
+ Sie müssen Ihr Konto upgraden, um Land kaufen zu können.
+ </floater.string>
+ <floater.string name="cant_own_land">
+ Mit Ihrem Konto können Sie Land kaufen.
+ </floater.string>
+ <floater.string name="land_holdings">
+ Sie besitzen [BUYER] m² Land.
+ </floater.string>
+ <floater.string name="pay_to_for_land">
+ [SELLER] [AMOUNT] L$ für das Land bezahlen
+ </floater.string>
+ <floater.string name="buy_for_US">
+ Kaufen Sie [AMOUNT] L$ für ca. [LOCAL_AMOUNT],
+ </floater.string>
+ <floater.string name="parcel_meters">
+ Diese Parzelle ist [AMOUNT] m².
+ </floater.string>
+ <floater.string name="premium_land">
+ Dieses Land ist eine Premium-Immobilie. Es wird mit [AMOUNT] m² angesetzt.
+ </floater.string>
+ <floater.string name="discounted_land">
+ Dieses Land ist im Angebot. Es wird mit [AMOUNT] m² angesetzt.
+ </floater.string>
+ <floater.string name="meters_supports_object">
+ [AMOUNT] m²
+unterstützt [AMOUNT2] Objekte
+ </floater.string>
+ <floater.string name="sold_with_objects">
+ mit Objekten verkauft
+ </floater.string>
+ <floater.string name="sold_without_objects">
+ Objekte nicht im Verkauf mit eingeschlossen
+ </floater.string>
+ <floater.string name="info_price_string">
+ [PRICE] L$
+([PRICE_PER_SQM] L$/m²)
+[SOLD_WITH_OBJECTS]
+ </floater.string>
+ <floater.string name="insufficient_land_credits">
+ Die Gruppe [GROUP] benötigt ausreichende gespendete Landnutzungsrechte, um die Parzelle abzudecken, bevor der Kauf abgeschlossen werden kann.
+ </floater.string>
+ <floater.string name="have_enough_lindens">
+ Sie haben [AMOUNT] L$, genug zum Kauf dieses Landes.
+ </floater.string>
+ <floater.string name="not_enough_lindens">
+ Sie haben nur [AMOUNT] L$, brauchen aber mindestens [AMOUNT2] L$.
+ </floater.string>
+ <floater.string name="balance_left">
+ Nach dem Einkauf verbleiben Ihnen noch [AMOUNT] L$.
+ </floater.string>
+ <floater.string name="balance_needed">
+ Für dieses Land müssen Sie mindestens [AMOUNT] L$ kaufen.
+ </floater.string>
+ <floater.string name="no_parcel_selected">
+ (keine Parzelle ausgewählt)
+ </floater.string>
<text name="region_name_label">
Region:
</text>
- <text left="580" name="region_name_text">
+ <text left="680" left_delta="140" name="region_name_text">
(unbekannt)
</text>
<text name="region_type_label">
Typ:
</text>
- <text left="580" name="region_type_text">
+ <text left="680" left_delta="140" name="region_type_text">
(unbekannt)
</text>
<text name="estate_name_label">
- Grundstück:
+ Grundbesitz:
</text>
- <text left="580" name="estate_name_text">
+ <text left="680" left_delta="140" name="estate_name_text">
(unbekannt)
</text>
<text name="estate_owner_label" right="600" width="200">
- Grundstückseigentümer:
+ Grundbesitzer:
</text>
- <text left="580" name="estate_owner_text">
+ <text left="680" left_delta="140" name="estate_owner_text">
(unbekannt)
</text>
- <text name="resellable_changeable_label">
+ <text left="410" name="resellable_changeable_label">
Gekauftes Land in dieser Region:
</text>
- <text name="resellable_clause">
+ <text left="410" name="resellable_clause">
Wiederverkauf möglich oder nicht möglich.
</text>
- <text name="changeable_clause">
+ <text left="410" name="changeable_clause">
Darft oder darf nicht zusammengelegt/unterteilt werden.
</text>
- <text name="covenant_text">
- Sie müssen dem Grundstücksvertrag zustimmen:
+ <text left="410" name="covenant_text">
+ Sie müssen dem Grundbesitzvertrag zustimmen:
</text>
<text left="470" name="covenant_timestamp_text"/>
- <text_editor name="covenant_editor">
+ <text_editor left="470" name="covenant_editor">
Wird geladen...
</text_editor>
<check_box label="Ich stimme dem obigen Vertrag zu." name="agree_covenant"/>
@@ -67,7 +191,7 @@ Objekte im Verkauf eingeschlossen
<text name="error_message">
Irgendetwas stimmt nicht.
</text>
- <button label="Gehe zu Website" name="error_web"/>
+ <button label="Gehe zu Website" name="error_web" top_delta="136"/>
<text name="account_action">
Macht Sie zum Premium-Mitglied.
</text>
@@ -79,8 +203,9 @@ Objekte im Verkauf eingeschlossen
<combo_box.item label="7,50 US$/Monat, vierteljährliche Abrechnung" name="US$7.50/month,billedquarterly"/>
<combo_box.item label="6,00 US$/Monat, jährliche Abrechnung" name="US$6.00/month,billedannually"/>
</combo_box>
- <text name="land_use_action">
- Erhöhen Sie Ihre monatlichen Landnutzungsgebühren auf 40 US$/month.
+ <text height="36" name="land_use_action" top="270">
+ Erhöhen Sie Ihre monatlichen Landnutzungsgebühren
+auf 40 US$/month.
</text>
<text name="land_use_reason">
Sie besitzen 1309 m² Land.
@@ -107,131 +232,4 @@ Diese Parzelle ist 512 m² gross.
<check_box label="[AMOUNT] m² Beitrag von der Gruppe entfernen." name="remove_contribution"/>
<button label="Kaufen" name="buy_btn"/>
<button label="Abbrechen" name="cancel_btn"/>
- <string name="can_resell">
- Verkauf möglich.
- </string>
- <string name="can_not_resell">
- Verkauf nicht möglich.
- </string>
- <string name="can_change">
- Zusammenlegen/unterteilen möglich.
- </string>
- <string name="can_not_change">
- Zusammenlegen/unterteilen nicht möglich.
- </string>
- <string name="cant_buy_for_group">
- Sie sind nicht berechtigt, Land für die aktive Gruppe zu kaufen.
- </string>
- <string name="no_land_selected">
- Kein Land ausgewählt.
- </string>
- <string name="multiple_parcels_selected">
- Mehrere unterschiedliche Parzellen ausgewählt.
-Verkleinern Sie Ihre Auswahl.
- </string>
- <string name="no_permission">
- Sie sind nicht berechtigt, Land für die aktive Gruppe zu kaufen.
- </string>
- <string name="parcel_not_for_sale">
- Die ausgewählte Parzelle steht nicht zum Verkauf.
- </string>
- <string name="group_already_owns">
- Die Parzelle befindet sich bereits in Gruppenbesitz.
- </string>
- <string name="you_already_own">
- Die Parzelle gehört Ihnen bereits.
- </string>
- <string name="set_to_sell_to_other">
- Die ausgewählte Parzelle steht zum Verkauf an Dritte.
- </string>
- <string name="no_public_land">
- Das ausgewählte Land beinhaltet kein öffentliches Land.
- </string>
- <string name="not_owned_by_you">
- Sie haben Land ausgewählt, das einer anderen Person gehört.
-Verkleinern Sie Ihre Auswahl.
- </string>
- <string name="processing">
- Kauf wird abgewickelt...
-
-(Dies kann 1 bis 2 Minuten dauern.)
- </string>
- <string name="fetching_error">
- Fehler bei Abfrage der Landkauf-Informationen.
- </string>
- <string name="buying_will">
- Bei Landkauf:
- </string>
- <string name="buying_for_group">
- Landkauf für Gruppe:
- </string>
- <string name="cannot_buy_now">
- Kaufen jetzt nicht möglich:
- </string>
- <string name="not_for_sale">
- Nicht zu verkaufen:
- </string>
- <string name="none_needed">
- nicht benötigt
- </string>
- <string name="must_upgrade">
- Sie müssen Ihr Konto upgraden, um Land kaufen zu können.
- </string>
- <string name="cant_own_land">
- Mit Ihrem Konto können Sie Land kaufen.
- </string>
- <string name="land_holdings">
- Sie besitzen [BUYER] m² Land.
- </string>
- <string name="pay_to_for_land">
- [SELLER] [AMOUNT] L$ für das Land bezahlen
- </string>
- <string name="buy_for_US">
- Kaufen Sie [AMOUNT] L$ für ca. [LOCAL_AMOUNT],
- </string>
- <string name="parcel_meters">
- Diese Parzelle ist [AMOUNT] m².
- </string>
- <string name="premium_land">
- Dieses Land ist eine Premium-Immobilie. Es wird mit [AMOUNT] m² angesetzt.
- </string>
- <string name="discounted_land">
- Dieses Land ist im Angebot. Es wird mit [AMOUNT] m² angesetzt.
- </string>
- <string name="meters_supports_object">
- [AMOUNT] m²
-unterstützt [AMOUNT2] Objekte
- </string>
- <string name="sold_with_objects">
- mit Objekten verkauft
- </string>
- <string name="sold_without_objects">
- Objekte nicht im Verkauf mit eingeschlossen
- </string>
- <string name="info_price_string">
- [PRICE] L$
-([PRICE_PER_SQM] L$/m²)
-[SOLD_WITH_OBJECTS]
- </string>
- <string name="insufficient_land_credits">
- Die Gruppe [GROUP] benötigt ausreichende gespendete Landnutzungsrechte, um die Parzelle abzudecken, bevor der Kauf abgeschlossen werden kann.
- </string>
- <string name="have_enough_lindens">
- Sie haben [AMOUNT] L$, genug zum Kauf dieses Landes.
- </string>
- <string name="not_enough_lindens">
- Sie haben nur [AMOUNT] L$, brauchen aber mindestens [AMOUNT2] L$.
- </string>
- <string name="balance_left">
- Nach dem Einkauf verbleiben Ihnen noch [AMOUNT] L$.
- </string>
- <string name="balance_needed">
- Für dieses Land müssen Sie mindestens [AMOUNT] L$ kaufen.
- </string>
- <string name="no_parcel_selected">
- (keine Parzelle ausgewählt)
- </string>
- <string name="buy_currency">
- [LINDENS] L$ für ca. [USD] US$ kaufen
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_buy_object.xml b/indra/newview/skins/default/xui/de/floater_buy_object.xml
index b23163b4a3..c697014b04 100644
--- a/indra/newview/skins/default/xui/de/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/de/floater_buy_object.xml
@@ -6,7 +6,7 @@
<text name="buy_text">
[AMOUNT] L$ von [NAME] kaufen?
</text>
- <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn" width="73"/>
+ <button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn"/>
<button label="Kaufen" label_selected="Kaufen" name="buy_btn"/>
<text name="title_buy_text">
Kaufen
diff --git a/indra/newview/skins/default/xui/de/floater_camera.xml b/indra/newview/skins/default/xui/de/floater_camera.xml
index b8616ea128..418e717bf6 100644
--- a/indra/newview/skins/default/xui/de/floater_camera.xml
+++ b/indra/newview/skins/default/xui/de/floater_camera.xml
@@ -9,23 +9,28 @@
<floater.string name="move_tooltip">
Kamera nach oben, unten, links und rechts bewegen
</floater.string>
+ <floater.string name="camera_modes_title">
+ Kameramodi
+ </floater.string>
+ <floater.string name="pan_mode_title">
+ Kreisen - Zoomen - Schwenken
+ </floater.string>
+ <floater.string name="presets_mode_title">
+ Ansichten
+ </floater.string>
+ <floater.string name="free_mode_title">
+ Objekt ansehen
+ </floater.string>
<panel name="controls">
- <joystick_track name="cam_track_stick" tool_tip="Kamera nach oben, unten, links und rechts bewegen"/>
<panel name="zoom" tool_tip="Kamera auf Fokus zoomen">
+ <joystick_rotate name="cam_rotate_stick" tool_tip="Kamera um Fokus kreisen"/>
<slider_bar name="zoom_slider" tool_tip="Kamera auf Fokus zoomen"/>
- </panel>
- <joystick_rotate name="cam_rotate_stick" tool_tip="Kamera um Fokus kreisen"/>
- <panel name="camera_presets">
- <button name="rear_view" tool_tip="Hinteransicht"/>
- <button name="group_view" tool_tip="Gruppen-Ansicht"/>
- <button name="front_view" tool_tip="Vorderansicht"/>
- <button name="mouselook_view" tool_tip="Mouselook"/>
+ <joystick_track name="cam_track_stick" tool_tip="Kamera nach oben, unten, links und rechts bewegen"/>
</panel>
</panel>
<panel name="buttons">
- <button label="" name="orbit_btn" tool_tip="Kamera kreisen"/>
- <button label="" name="pan_btn" tool_tip="Kamera schwenken"/>
- <button label="" name="avatarview_btn" tool_tip="Avatarsicht"/>
- <button label="" name="freecamera_btn" tool_tip="Objekt ansehen"/>
+ <button label="" name="presets_btn" tool_tip="Ansichten"/>
+ <button label="" name="pan_btn" tool_tip="Kreisen - Zoomen - Schwenken"/>
+ <button label="" name="avatarview_btn" tool_tip="Kameramodi"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_color_picker.xml b/indra/newview/skins/default/xui/de/floater_color_picker.xml
index aed4bacb30..0fe154b531 100644
--- a/indra/newview/skins/default/xui/de/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/de/floater_color_picker.xml
@@ -18,7 +18,7 @@
<text name="l_val_text">
Hell.:
</text>
- <check_box label="Jetzt übernehmen" name="apply_immediate"/>
+ <check_box label="Sofort übernehmen" name="apply_immediate"/>
<button label="" label_selected="" name="color_pipette"/>
<button label="Abbrechen" label_selected="Abbrechen" name="cancel_btn"/>
<button label="OK" label_selected="OK" name="select_btn"/>
diff --git a/indra/newview/skins/default/xui/de/floater_customize.xml b/indra/newview/skins/default/xui/de/floater_customize.xml
index a2bf45852a..3651577797 100644
--- a/indra/newview/skins/default/xui/de/floater_customize.xml
+++ b/indra/newview/skins/default/xui/de/floater_customize.xml
@@ -40,17 +40,17 @@
<text name="no modify instructions">
Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
</text>
- <text name="Item Action Label" right="100">
+ <text name="Item Action Label">
Form:
</text>
<button label="Neue Form/Gestalt" label_selected="Neue Form/Gestalt" name="Create New"/>
- <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/>
+ <button font="SansSerifSmall" label="Speichern" label_selected="Speichern" name="Save"/>
+ <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
</panel>
<panel label="Haut" name="Skin">
<button label="Hautfarbe" label_selected="Hautfarbe" left="2" name="Skin Color" width="92"/>
<button label="Gesichtsdetails" label_selected="Gesichtsdetails" left="2" name="Face Detail" width="92"/>
- <button label="Make-Uup" label_selected="Make-Uup" left="2" name="Makeup" width="92"/>
+ <button label="Make-Up" label_selected="Make-Up" left="2" name="Makeup" width="92"/>
<button label="Körperdetails" label_selected="Körperdetails" left="2" name="Body Detail" width="92"/>
<text name="title">
[DESC]
@@ -81,7 +81,7 @@
<texture_picker label="Untere Tattoos" name="Lower Tattoos" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
<button label="Neue Haut" label_selected="Neue Haut" name="Create New"/>
<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/>
+ <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
<button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
</panel>
<panel label="Haar" name="Hair">
@@ -105,7 +105,7 @@
In [PATH]
</text>
<text name="not worn instructions">
- Ziehen Sie Haar aus dem Inventar auf Ihren Avatar, um dieses anzulegen. Sie können aber auch eine neue erstellen und diese anlegen.
+ Ziehen Sie Haar aus dem Inventar auf Ihren Avatar, um dieses anzulegen. Sie können aber auch neues Haar erstellen und anlegen.
</text>
<text name="no modify instructions">
Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
@@ -116,7 +116,7 @@
<texture_picker label="Textur" name="Texture" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
<button label="Neue Haare" label_selected="Neue Haare" name="Create New"/>
<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/>
+ <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
<button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
</panel>
<panel label="Augen" name="Eyes">
@@ -136,7 +136,7 @@
In [PATH]
</text>
<text name="not worn instructions">
- Ziehen Sie neue Augen aus dem Inventar auf Ihren Avatar, um diese anzulegen. Sie können aber auch eine neue erstellen und diese anlegen.
+ Ziehen Sie neue Augen aus dem Inventar auf Ihren Avatar, um diese anzulegen. Sie können aber auch neue Augen erstellen und diese anlegen.
</text>
<text name="no modify instructions">
Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
@@ -147,7 +147,7 @@
<texture_picker label="Iris" name="Iris" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
<button label="Neue Augen" label_selected="Neue Augen" name="Create New"/>
<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/>
+ <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
<button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
</panel>
<text label="Kleidung" name="clothes_placeholder">
@@ -156,10 +156,10 @@
<panel label="Hemd" name="Shirt">
<texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button label="Neues Hemd" label_selected="Neues Hemd" name="Create New"/>
<button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
+ <button label="Neues Hemd" label_selected="Neues Hemd" name="Create New"/>
<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/>
+ <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
<button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
<text name="title">
[DESC]
@@ -177,7 +177,7 @@
In [PATH]
</text>
<text name="not worn instructions">
- Ziehen Sie ein neues Hemd aus dem Inventar auf Ihren Avatar, um dieses anzuziehen. Sie können aber auch eine neue erstellen und diese anlegen.
+ Ziehen Sie ein neues Hemd aus dem Inventar auf Ihren Avatar, um dieses anzuziehen. Sie können aber auch ein neues Hemd erstellen und dieses anlegen.
</text>
<text name="no modify instructions">
Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
@@ -189,10 +189,10 @@
<panel label="Hose" name="Pants">
<texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button label="Neue Hose" label_selected="Neue Hose" name="Create New"/>
<button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
+ <button label="Neue Hose" label_selected="Neue Hose" name="Create New"/>
<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/>
+ <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
<button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
<text name="title">
[DESC]
@@ -210,7 +210,7 @@
In [PATH]
</text>
<text name="not worn instructions">
- Ziehen Sie eine neue Hose aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anlegen.
+ Ziehen Sie eine neue Hose aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anziehen.
</text>
<text name="no modify instructions">
Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
@@ -236,8 +236,9 @@
In [PATH]
</text>
<text name="not worn instructions">
- Ziehen Sie neue Schuhe aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anlegen.
+ Ziehen Sie neue Schuhe aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch neue Schuhe erstellen und diese anlegen.
</text>
+ <button label="Neue Schuhe" label_selected="Neue Schuhe" name="Create New"/>
<text name="no modify instructions">
Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
</text>
@@ -246,10 +247,9 @@
</text>
<texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button label="Neue Schuhe" label_selected="Neue Schuhe" name="Create New"/>
<button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/>
+ <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
<button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
</panel>
<panel label="Socken" name="Socks">
@@ -269,8 +269,9 @@
In [PATH]
</text>
<text name="not worn instructions">
- Ziehen Sie neue Strümpfe aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anlegen.
+ Ziehen Sie neue Socken aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch neue erstellen und diese anziehen.
</text>
+ <button label="Neue Socken" label_selected="Neue Socken" name="Create New"/>
<text name="no modify instructions">
Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
</text>
@@ -279,10 +280,9 @@
</text>
<texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button label="Neue Socken" label_selected="Neue Socken" name="Create New"/>
<button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/>
+ <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
<button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
</panel>
<panel label="Jacke" name="Jacket">
@@ -302,21 +302,21 @@
In [PATH]
</text>
<text name="not worn instructions">
- Ziehen Sie eine neue Jacke aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anlegen.
+ Ziehen Sie eine neue Jacke aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anziehen.
</text>
+ <button label="Neue Jacke" label_selected="Neue Jacke" name="Create New"/>
<text name="no modify instructions">
Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
</text>
<text name="Item Action Label" right="100">
Jacke:
</text>
- <texture_picker label="Oberstoff" name="Upper Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
- <texture_picker label="Unterstoff" name="Lower Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
+ <texture_picker label="Stoff: oben" name="Upper Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
+ <texture_picker label="Stoff: unten" name="Lower Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button label="Neue Jacke" label_selected="Neue Jacke" name="Create New"/>
<button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/>
+ <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
<button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
</panel>
<panel label="Handschuhe" name="Gloves">
@@ -336,8 +336,9 @@
In [PATH]
</text>
<text name="not worn instructions">
- Ziehen Sie neue Handschuhe aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anlegen.
+ Ziehen Sie neue Handschuhe aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch neue erstellen und diese anziehen.
</text>
+ <button label="Neue Handschuhe" label_selected="Neue Handschuhe" name="Create New"/>
<text name="no modify instructions">
Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
</text>
@@ -346,10 +347,9 @@
</text>
<texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button label="Neue Handschuhe" label_selected="Neue Handschuhe" name="Create New"/>
<button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/>
+ <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
<button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
</panel>
<panel label="Unterhemd" name="Undershirt">
@@ -369,8 +369,9 @@
In [PATH]
</text>
<text name="not worn instructions">
- Ziehen Sie ein neues Unterhemd aus dem Inventar auf Ihren Avatar, um dieses anzuziehen. Sie können aber auch eine neue erstellen und diese anlegen.
+ Ziehen Sie ein neues Unterhemd aus dem Inventar auf Ihren Avatar, um dieses anzuziehen. Sie können aber auch ein neues Unterhemd erstellen und dieses anziehen.
</text>
+ <button label="Neues Unterhemd" label_selected="Neues Unterhemd" name="Create New"/>
<text name="no modify instructions">
Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
</text>
@@ -379,10 +380,9 @@
</text>
<texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button label="Neues Unterhemd" label_selected="Neues Unterhemd" name="Create New"/>
<button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/>
+ <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
<button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
</panel>
<panel label="Unterhose" name="Underpants">
@@ -402,8 +402,9 @@
In [PATH]
</text>
<text name="not worn instructions">
- Ziehen Sie eine neue Unterhose aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anlegen.
+ Ziehen Sie eine neue Unterhose aus dem Inventar auf Ihren Avatar, um diese anzuziehen. Sie können aber auch eine neue erstellen und diese anziehen.
</text>
+ <button label="Neue Unterhose" label_selected="Neue Unterhose" name="Create New"/>
<text name="no modify instructions">
Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
</text>
@@ -412,10 +413,9 @@
</text>
<texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button label="Neue Unterhose" label_selected="Neue Unterhose" name="Create New"/>
<button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/>
+ <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
<button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
</panel>
<panel label="Rock" name="Skirt">
@@ -435,8 +435,9 @@
In [PATH]
</text>
<text name="not worn instructions">
- Ziehen Sie einen neuen Rock aus dem Inventar auf Ihren Avatar, um diesen anzuziehen. Sie können aber auch eine neue erstellen und diese anlegen.
+ Ziehen Sie einen neuen Rock aus dem Inventar auf Ihren Avatar, um diesen anzuziehen. Sie können aber auch einen neuen Rock erstellen und diesen anziehen.
</text>
+ <button label="Neuer Rock" label_selected="Neuer Rock" name="Create New"/>
<text name="no modify instructions">
Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
</text>
@@ -445,15 +446,14 @@
</text>
<texture_picker label="Stoff" name="Fabric" tool_tip="Klicken Sie hier, um ein Bild auszuwählen"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
- <button label="Neuer Rock" label_selected="Neuer Rock" name="Create New"/>
<button font="SansSerifSmall" label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
<button font="SansSerifSmall" label="Speichern" label_selected="Speichern" left="107" name="Save"/>
- <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." left="194" name="Save As" width="105"/>
+ <button font="SansSerifSmall" label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
<button font="SansSerifSmall" label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
</panel>
- <panel label="Alpha" name="Alpha">
+ <panel label="Tätowierung" name="Tattoo">
<text name="title">
- [BESCHR]
+ Tätowierung
</text>
<text name="title_no_modify">
[BESCHR]: bearbeiten nicht möglich
@@ -468,28 +468,26 @@
Befindet sich in [PATH]
</text>
<text name="not worn instructions">
- Sie können eine neue Alpha-Maske anlegen, indem Sie eine von Ihrem Inventar auf Ihren Avatar ziehen. Sie können aber auch eine neue erstellen und diese anlegen.
+ Ziehen Sie eine neue Tätowierung aus dem Inventar auf Ihren Avatar, um diese anzulegen. Sie können aber auch eine neue erstellen und diese anlegen.
</text>
+ <button label="Neue Tätowierung erstellen" label_selected="Neue Tätowierung erstellen" name="Create New"/>
<text name="no modify instructions">
Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
</text>
<text name="Item Action Label">
- Alpha:
+ Tätowierung:
</text>
- <texture_picker label="Alpha: Unten" name="Lower Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Alpha: Oben" name="Upper Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Kopf: Alpha" name="Head Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Alpha: Augen" name="Eye Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Alpha: Haare" name="Hair Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <button label="Neue Alpha erstellen" label_selected="Neue Alpha erstellen" name="Create New"/>
+ <texture_picker label="Kopftattoo" name="Head Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Obere Tattoos" name="Upper Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Untere Tattoos" name="Lower Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
<button label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
<button label="Speichern" label_selected="Speichern" name="Save"/>
<button label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
<button label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
</panel>
- <panel label="Tätowierung" name="Tattoo">
+ <panel label="Alpha" name="Alpha">
<text name="title">
- [BESCHR]
+ Alpha
</text>
<text name="title_no_modify">
[BESCHR]: bearbeiten nicht möglich
@@ -504,25 +502,27 @@
Befindet sich in [PATH]
</text>
<text name="not worn instructions">
- Ziehen Sie eine neue Tätowierung aus dem Inventar auf Ihren Avatar, um diese anzulegen. Sie können aber auch eine neue erstellen und diese anlegen.
+ Sie können eine neue Alpha-Maske anlegen, indem Sie eine von Ihrem Inventar auf Ihren Avatar ziehen. Sie können aber auch eine neue erstellen und diese anlegen.
</text>
+ <button label="Neue Alpha erstellen" label_selected="Neue Alpha erstellen" name="Create New"/>
<text name="no modify instructions">
Sie sind nicht berechtigt, diese Kleidung zu bearbeiten.
</text>
<text name="Item Action Label">
- Tätowierung:
+ Alpha:
</text>
- <texture_picker label="Kopftattoo" name="Head Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Obere Tattoos" name="Upper Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Untere Tattoos" name="Lower Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <button label="Neue Tätowierung erstellen" label_selected="Neue Tätowierung erstellen" name="Create New"/>
+ <texture_picker label="Alpha: Unten" name="Lower Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Alpha: Oben" name="Upper Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Kopf: Alpha" name="Head Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Alpha: Augen" name="Eye Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Alpha: Haare" name="Hair Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
<button label="Ausziehen" label_selected="Ausziehen" name="Take Off"/>
<button label="Speichern" label_selected="Speichern" name="Save"/>
<button label="Speichern unter..." label_selected="Speichern unter..." name="Save As"/>
<button label="Zurücksetzen" label_selected="Zurücksetzen" name="Revert"/>
</panel>
</tab_container>
- <button label="Skriptinfo" label_selected="Skriptinfo" name="script_info"/>
+ <button label="Skriptinfo" label_selected="Skriptinfo" name="script_info" tool_tip="Skripts, die an Ihren Avatar angehängt sind, anzeigen"/>
<button label="Outfit erstellen" label_selected="Outfit erstellen" name="make_outfit_btn"/>
<button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
<button label="OK" label_selected="OK" name="Ok"/>
diff --git a/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml
index 7f4dc4a79e..8599737106 100644
--- a/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml
+++ b/indra/newview/skins/default/xui/de/floater_day_cycle_options.xml
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Day Cycle Floater" title="TAGESZYKLUS-EDITOR">
<tab_container name="Day Cycle Tabs">
<panel label="Tageszyklus" name="Day Cycle">
- <button label=" ?" name="WLDayCycleHelp" />
+ <button label=" ?" name="WLDayCycleHelp"/>
<text name="WL12am">
24:00
</text>
@@ -57,40 +57,38 @@
<text name="WL12amHash2">
|
</text>
- <button label="Key hinzu" label_selected="Key hinzu" name="WLAddKey" />
- <button label="Key löschen" label_selected="Key löschen" name="WLDeleteKey" />
+ <button label="Key hinzu" label_selected="Key hinzu" name="WLAddKey"/>
+ <button label="Key löschen" label_selected="Key löschen" name="WLDeleteKey"/>
<text name="WLCurKeyFrameText">
Keyframe-Einstellungen:
</text>
<text name="WLCurKeyTimeText">
Key-Zeit:
</text>
- <spinner label="Std." name="WLCurKeyHour" />
- <spinner label="Min." name="WLCurKeyMin" />
+ <spinner label="Std." name="WLCurKeyHour"/>
+ <spinner label="Min." name="WLCurKeyMin"/>
<text name="WLCurKeyTimeText2">
Key-Voreinstellung:
</text>
- <combo_box label="Voreinstellung" name="WLKeyPresets" />
+ <combo_box label="Voreinstellung" name="WLKeyPresets"/>
<text name="DayCycleText">
Einrasten:
</text>
- <combo_box label="5 min" name="WLSnapOptions" />
+ <combo_box label="5 min" name="WLSnapOptions"/>
<text name="DayCycleText2">
Zykluslänge:
</text>
- <spinner label="Std." name="WLLengthOfDayHour" />
- <spinner label="Min." name="WLLengthOfDayMin" />
- <spinner label="Sek." name="WLLengthOfDaySec" />
+ <spinner label="Std." name="WLLengthOfDayHour"/>
+ <spinner label="Min." name="WLLengthOfDayMin"/>
+ <spinner label="Sek." name="WLLengthOfDaySec"/>
<text name="DayCycleText3">
Vorschau:
</text>
- <button label="Start" label_selected="Start" name="WLAnimSky" />
- <button label="Stopp" label_selected="Stopp" name="WLStopAnimSky" />
- <button label="Grundstückszeit verw" label_selected="Zur Grundstückszeit"
- name="WLUseLindenTime" />
- <button label="Testtag speichern" label_selected="Testtag speichern"
- name="WLSaveDayCycle" />
- <button label="Testtag laden" label_selected="Testtag laden" name="WLLoadDayCycle" />
+ <button label="Start" label_selected="Start" name="WLAnimSky"/>
+ <button label="Stopp" label_selected="Stopp" name="WLStopAnimSky"/>
+ <button label="Grundbesitzzeit verw" label_selected="Zur Grundbesitzzeit" name="WLUseLindenTime"/>
+ <button label="Testtag speichern" label_selected="Testtag speichern" name="WLSaveDayCycle"/>
+ <button label="Testtag laden" label_selected="Testtag laden" name="WLLoadDayCycle"/>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_env_settings.xml b/indra/newview/skins/default/xui/de/floater_env_settings.xml
index 0f2370771f..0c78909108 100644
--- a/indra/newview/skins/default/xui/de/floater_env_settings.xml
+++ b/indra/newview/skins/default/xui/de/floater_env_settings.xml
@@ -20,7 +20,7 @@
Wasser-
trübung
</text>
- <button label="Grundstückszeit verw." name="EnvUseEstateTimeButton"/>
+ <button label="Grundbesitzzeit verw." name="EnvUseEstateTimeButton"/>
<button label="Himmel (erweitert)" name="EnvAdvancedSkyButton"/>
<button label="Wasser (erweitert)" name="EnvAdvancedWaterButton"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_event.xml b/indra/newview/skins/default/xui/de/floater_event.xml
new file mode 100644
index 0000000000..cf663e2e1b
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_event.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="Event" name="Event" title="EVENT-DETAILS">
+ <floater.string name="none">
+ keines
+ </floater.string>
+ <floater.string name="notify">
+ Benachrichtigen
+ </floater.string>
+ <floater.string name="dont_notify">
+ Nicht benachrichtigen
+ </floater.string>
+ <floater.string name="moderate">
+ Moderat
+ </floater.string>
+ <floater.string name="adult">
+ Adult
+ </floater.string>
+ <floater.string name="general">
+ Allgemein
+ </floater.string>
+ <floater.string name="unknown">
+ Unbekannt
+ </floater.string>
+ <layout_stack name="layout">
+ <layout_panel name="profile_stack">
+ <text name="event_name">
+ Namenloses Event....namenlos! Tadaaa! Tadatadaaaah!
+ </text>
+ <text name="event_category">
+ (keine Kategorie)
+ </text>
+ <text name="event_runby_label">
+ Ausgeführt von:
+ </text>
+ <text initial_value="(wird in Datenbank gesucht)" name="event_runby"/>
+ <text name="event_date_label">
+ Datum:
+ </text>
+ <text name="event_date">
+ 10/10/2010
+ </text>
+ <text name="event_duration_label">
+ Dauer:
+ </text>
+ <text name="event_duration">
+ 1 Stunde
+ </text>
+ <text name="event_covercharge_label">
+ Eintritt:
+ </text>
+ <text name="event_cover">
+ Kostenlos
+ </text>
+ <text name="event_location_label">
+ Standort:
+ </text>
+ <text name="event_location" value="SampleParcel, Name Long (145, 228, 26)"/>
+ <text name="rating_label" value="Einstufung:"/>
+ <text name="rating_value" value="unbekannt"/>
+ </layout_panel>
+ <layout_panel name="button_panel">
+ <button name="create_event_btn" tool_tip="Event erstellen"/>
+ <button name="god_delete_event_btn" tool_tip="Event löschen"/>
+ <button label="Mich benachrichtigen" name="notify_btn"/>
+ <button label="Teleportieren" name="teleport_btn"/>
+ <button label="Karte" name="map_btn"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_gesture.xml b/indra/newview/skins/default/xui/de/floater_gesture.xml
index 0b27b362c3..7b35da8d5c 100644
--- a/indra/newview/skins/default/xui/de/floater_gesture.xml
+++ b/indra/newview/skins/default/xui/de/floater_gesture.xml
@@ -9,7 +9,7 @@
<floater.string name="copy_name">
Kopie von [COPY_NAME]
</floater.string>
- <scroll_list bottom_delta="-385" height="360" name="gesture_list">
+ <scroll_list name="gesture_list">
<scroll_list.columns label="Name" name="name"/>
<scroll_list.columns label="Chat" name="trigger"/>
<scroll_list.columns label="" name="key"/>
diff --git a/indra/newview/skins/default/xui/de/floater_god_tools.xml b/indra/newview/skins/default/xui/de/floater_god_tools.xml
index 716165bb6b..8cb1af9f7d 100644
--- a/indra/newview/skins/default/xui/de/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/de/floater_god_tools.xml
@@ -2,58 +2,57 @@
<floater name="godtools floater" title="GOTT-WERKZEUGE">
<tab_container name="GodTools Tabs">
<panel label="Raster" name="grid">
- <button label="Alle Benutzer hinauswerfen" label_selected="Alle Benutzer hinauswerfen" name="Kick all users" width="175"/>
<button label="Sichtbarkeits-Cache dieser Regionskarte leeren" label_selected="Sichtbarkeits-Cache dieser Regionskarte leeren" name="Flush This Region&apos;s Map Visibility Caches" width="285"/>
</panel>
<panel label="Region" name="region">
- <text name="Sim Name:" width="55">
- Sim-Name:
+ <text name="Region Name:">
+ Name der Region:
</text>
<check_box label="Startbereich Einleitung" name="check prelude" tool_tip="Diese Region zu einem Startbereich machen."/>
- <check_box label="Sonne fest" name="check fixed sun" tool_tip="Fixiert den Sonnenstand (wie in „Region/Grundstück“ &gt; „Terrain“."/>
- <check_box height="32" label="Zuhause auf Teleport zurücksetzen" name="check reset home" tool_tip="Wenn Einwohner weg teleportieren, ihr Zuhause auf Zielposition setzen."/>
- <check_box bottom_delta="-32" label="Sichtbar" name="check visible" tool_tip="Diese Region für Nicht-Götter sichtbar machen."/>
+ <check_box label="Sonne fest" name="check fixed sun" tool_tip="Fixiert den Sonnenstand (wie in „Region/Grundbesitz“ &gt; „Terrain“."/>
+ <check_box label="Zuhause auf Teleport zurücksetzen" name="check reset home" tool_tip="Wenn Einwohner weg teleportieren, ihr Zuhause auf Zielposition setzen."/>
+ <check_box label="Sichtbar" name="check visible" tool_tip="Diese Region für Nicht-Götter sichtbar machen."/>
<check_box label="Schaden" name="check damage" tool_tip="Schaden in dieser Region aktivieren."/>
<check_box label="Trafficüberwachung blockieren" name="block dwell" tool_tip="In dieser Region die Traffic-Berechnung abschalten."/>
<check_box label="Terraformen blockieren" name="block terraform" tool_tip="Das Terraformen von Land verbieten (Benutzen Sie dies um Leuten das Terraformen ihres Landes zu verbieten)"/>
<check_box label="Sandkasten" name="is sandbox" tool_tip="Sandkastenregion ein-/ausschalten."/>
- <button label="Terrain formen" label_selected="Terrain formen" name="Bake Terrain" tool_tip="Das aktuelle Terrain als Standard speichern." width="118"/>
- <button label="Terrain zurücksetzen" label_selected="Terrain zurücksetzen" name="Revert Terrain" tool_tip="Das aktuelle Terrain mit dem Standard ersetzen." width="118"/>
- <button label="Terrain tauschen" label_selected="Terrain tauschen" name="Swap Terrain" tool_tip="Aktuelles Terrain gegen Standard austauschen." width="118"/>
+ <button label="Terrain formen" label_selected="Terrain formen" name="Bake Terrain" tool_tip="Das aktuelle Terrain als Standard speichern." width="120"/>
+ <button label="Terrain zurücksetzen" label_selected="Terrain zurücksetzen" name="Revert Terrain" tool_tip="Das aktuelle Terrain mit dem Standard ersetzen." width="120"/>
+ <button label="Terrain tauschen" label_selected="Terrain tauschen" name="Swap Terrain" tool_tip="Aktuelles Terrain gegen Standard austauschen." width="120"/>
<text name="estate id">
- Grundstücks-ID:
+ Grundbesitz-ID:
</text>
<text name="parent id">
Parent ID:
</text>
- <line_editor name="parentestate" tool_tip="Das übergeordnete Grundstück dieser Region"/>
+ <line_editor name="parentestate" tool_tip="Der übergeordnete Grundbesitz dieser Region"/>
<text name="Grid Pos: ">
Raster-Pos.:
</text>
<line_editor left_delta="110" name="gridposx" tool_tip="Die X-Rasterposition dieser Region" width="35"/>
<line_editor left_delta="45" name="gridposy" tool_tip="Die Y-Rasterposition dieser Region" width="35"/>
- <text name="Redirect to Grid: ">
+ <text name="Redirect to Grid: " width="110">
Auf Raster umleiten:
</text>
- <line_editor left_delta="110" name="redirectx" width="35"/>
+ <line_editor left_delta="110" left_pad="0" name="redirectx" width="35"/>
<line_editor left_delta="45" name="redirecty" width="35"/>
<text font="SansSerifSmall" name="billable factor text">
Abrechnungsfaktor:
</text>
<text name="land cost text">
- L$ pro qm:
+ L$ pro m²:
</text>
<button label="Aktualisieren" label_selected="Aktualisieren" name="Refresh" tool_tip="Klicken Sie hier, um die obigen Informationen zu aktualisieren."/>
<button label="Übernehmen" label_selected="Übernehmen" name="Apply" tool_tip="Klicken Sie hier, um die obigen Änderungen zu übernehmen."/>
- <button label="Region auswählen" label_selected="Region auswählen" left="136" name="Select Region" tool_tip="Die gesamte Region mit dem Landwerkzeug auswählen." width="130"/>
- <button label="Automatisch speichern" label_selected="Automatisch speichern" left="136" name="Autosave now" tool_tip="gzipped-Status im Autosave-Verzeichnis speichern." width="130"/>
+ <button label="Region auswählen" label_selected="Region auswählen" left="136" name="Select Region" tool_tip="Die gesamte Region mit dem Landwerkzeug auswählen." width="132"/>
+ <button label="Automatisch speichern" label_selected="Automatisch speichern" left="136" name="Autosave now" tool_tip="gzipped-Status im Autosave-Verzeichnis speichern." width="132"/>
</panel>
<panel label="Objekte" name="objects">
<panel.string name="no_target">
(kein Ziel)
</panel.string>
- <text name="Sim Name:" width="55">
- Sim-Name:
+ <text name="Region Name:">
+ Name der Region:
</text>
<text name="region name">
Welsh
diff --git a/indra/newview/skins/default/xui/de/floater_hardware_settings.xml b/indra/newview/skins/default/xui/de/floater_hardware_settings.xml
index d01ea145f1..d931596efe 100644
--- a/indra/newview/skins/default/xui/de/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/de/floater_hardware_settings.xml
@@ -22,7 +22,7 @@
VBO aktivieren:
</text>
<check_box initial_value="true" label="OpenGL Vertex-Buffer-Objekte aktivieren" name="vbo" tool_tip="Wenn Sie über moderne Grafikhardware verfügen, können Sie durch Aktivieren dieser Option die Geschwindigkeit verbessern. Bei alter Hardware sind die VBO oft schlecht implementiert, was zu Abstürzen führen kann, wenn diese Option aktiviert ist."/>
- <slider label="Texturspeicher (MB):" name="GraphicsCardTextureMemory" tool_tip="Speicherplatz, der für Texturen zur Verfügung steht. In der Regel handelt es sich um Grafikkartenspeicher. Ein kleinerer Wert kann die Geschwindigkeit erhöhen, aber auch zu Texturunschärfen führen."/>
+ <slider label="Texturen-Cache (MB):" name="GraphicsCardTextureMemory" tool_tip="Speicherplatz, der für Texturen zur Verfügung steht. In der Regel handelt es sich um Grafikkartenspeicher. Ein kleinerer Wert kann die Geschwindigkeit erhöhen, aber auch zu Texturunschärfen führen."/>
<spinner label="Nebeldistanzverhältnis:" name="fog"/>
<button label="OK" label_selected="OK" name="OK"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_help_browser.xml b/indra/newview/skins/default/xui/de/floater_help_browser.xml
index bfefa57731..d55a3b0a26 100644
--- a/indra/newview/skins/default/xui/de/floater_help_browser.xml
+++ b/indra/newview/skins/default/xui/de/floater_help_browser.xml
@@ -1,14 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_help_browser" title="HILFE-BROWSER">
- <floater.string name="home_page_url">
- http://de.secondlife.com
- </floater.string>
- <floater.string name="support_page_url">
- http://de.secondlife.com/support
+ <floater.string name="loading_text">
+ Wird geladen...
</floater.string>
<layout_stack name="stack1">
- <layout_panel name="external_controls">
- <button label="In meinem Browser öffnen" name="open_browser"/>
- </layout_panel>
+ <layout_panel name="external_controls"/>
</layout_stack>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_im.xml b/indra/newview/skins/default/xui/de/floater_im.xml
index 6aa35f2900..8ae8f120cf 100644
--- a/indra/newview/skins/default/xui/de/floater_im.xml
+++ b/indra/newview/skins/default/xui/de/floater_im.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<multi_floater name="im_floater" title="Instant Message">
<string name="only_user_message">
- Sie sind der einzige Benutzer in dieser Sitzung.
+ Sie sind der einzige Einwohner in dieser Sitzung.
</string>
<string name="offline_message">
[FIRST] [LAST] ist offline.
@@ -32,7 +32,7 @@
</string>
<!-- ALL of the event strings should have [RECIPIENT] in them -->
<string name="add_session_event">
- Es konnten keine Benutzer zur Chat-Sitzung mit [RECIPIENT] hinzugefügt werden.
+ Es konnten keine Einwohner zur Chat-Sitzung mit [RECIPIENT] hinzugefügt werden.
</string>
<string name="message_session_event">
Ihre Nachricht konnte nicht an die Chat-Sitzung mit [RECIPIENT] gesendet werden.
diff --git a/indra/newview/skins/default/xui/de/floater_im_session.xml b/indra/newview/skins/default/xui/de/floater_im_session.xml
index 7bde3a3453..c69bb600ea 100644
--- a/indra/newview/skins/default/xui/de/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/de/floater_im_session.xml
@@ -3,7 +3,7 @@
<layout_stack name="im_panels">
<layout_panel label="IM Steuerkonsole" name="panel_im_control_panel"/>
<layout_panel>
- <line_editor label="Bis" name="chat_editor"/>
+ <line_editor label="An" name="chat_editor"/>
</layout_panel>
</layout_stack>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_image_preview.xml b/indra/newview/skins/default/xui/de/floater_image_preview.xml
index 7f66234dab..d581c6051b 100644
--- a/indra/newview/skins/default/xui/de/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/de/floater_image_preview.xml
@@ -10,16 +10,16 @@
Bildvorschau als:
</text>
<combo_box label="Kleidungstyp" name="clothing_type_combo">
- <combo_box.item label="Bild" name="Image"/>
- <combo_box.item label="Haare" name="Hair"/>
- <combo_box.item label="Kopf (Frau)" name="FemaleHead"/>
- <combo_box.item label="Oberkörper (Frau)" name="FemaleUpperBody"/>
- <combo_box.item label="Unterkörper (Frau)" name="FemaleLowerBody"/>
- <combo_box.item label="Kopf (Mann)" name="MaleHead"/>
- <combo_box.item label="Oberkörper (Mann)" name="MaleUpperBody"/>
- <combo_box.item label="Unterkörper (Mann)" name="MaleLowerBody"/>
- <combo_box.item label="Rock" name="Skirt"/>
- <combo_box.item label="Geformtes Primitiv" name="SculptedPrim"/>
+ <item label="Bild" name="Image" value="Bild"/>
+ <item label="Haare" name="Hair" value="Haare"/>
+ <item label="Kopf (Frau)" name="FemaleHead" value="Kopf (Frau)"/>
+ <item label="Oberkörper (Frau)" name="FemaleUpperBody" value="Oberkörper (Frau)"/>
+ <item label="Unterkörper (Frau)" name="FemaleLowerBody" value="Unterkörper (Frau)"/>
+ <item label="Kopf (Mann)" name="MaleHead" value="Kopf (Mann)"/>
+ <item label="Oberkörper (Mann)" name="MaleUpperBody" value="Oberkörper (Mann)"/>
+ <item label="Unterkörper (Mann)" name="MaleLowerBody" value="Unterkörper (Mann)"/>
+ <item label="Rock" name="Skirt" value="Rock"/>
+ <item label="Geformtes Primitiv" name="SculptedPrim" value="Geformtes Primitiv"/>
</combo_box>
<text name="bad_image_text">
Bild kann nicht gelesen werden.
@@ -28,5 +28,5 @@ Speichern Sie das Bild als 24 Bit Targa (.tga).
</text>
<check_box label="Verlustfreie Komprimierung verwenden" name="lossless_check"/>
<button label="Abbrechen" name="cancel_btn"/>
- <button label="Hochladen ([AMOUNT] L$)" name="ok_btn"/>
+ <button label="Hochladen ([AMOUNT] L$)" name="ok_btn" width="146"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_incoming_call.xml b/indra/newview/skins/default/xui/de/floater_incoming_call.xml
index 740085599f..0312f7dfe9 100644
--- a/indra/newview/skins/default/xui/de/floater_incoming_call.xml
+++ b/indra/newview/skins/default/xui/de/floater_incoming_call.xml
@@ -16,7 +16,13 @@
ist einem Voice-Konferenz-Chat beigetreten.
</floater.string>
<floater.string name="VoiceInviteGroup">
- ist einem Voice-Chat mit der Gruppe [GROUP] beigetreten.
+ ist dem &apos;[GROUP]&apos; Voice-Kanal beigetreten.
+ </floater.string>
+ <floater.string name="VoiceInviteQuestionGroup">
+ Möchten Sie [CURRENT_CHAT] verlassen und dem Gespräch mit &apos;[GROUP]&apos; beitreten?
+ </floater.string>
+ <floater.string name="VoiceInviteQuestionDefault">
+ Möchten Sie [CURRENT_CHAT] verlassen und diesem Voice-Chat beitreten?
</floater.string>
<text name="question">
Möchten Sie [CURRENT_CHAT] verlassen und diesem Voice-Chat beitreten?
diff --git a/indra/newview/skins/default/xui/de/floater_inspect.xml b/indra/newview/skins/default/xui/de/floater_inspect.xml
index 939aa964c0..da97ceb2d8 100644
--- a/indra/newview/skins/default/xui/de/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/de/floater_inspect.xml
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater min_width="450" name="inspect" title="OBJEKTE UNTERSUCHEN">
+<floater min_width="460" name="inspect" title="OBJEKTE UNTERSUCHEN" width="460">
<floater.string name="timeStamp">
[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
</floater.string>
<scroll_list name="object_list" tool_tip="Wählen Sie ein Objekt aus dieser Liste, um es in der Second Life-Welt zu markieren">
<scroll_list.columns label="Objektname" name="object_name"/>
- <scroll_list.columns label="Besitzer" name="owner_name"/>
+ <scroll_list.columns label="Besitzer" name="owner_name" />
<scroll_list.columns label="Ersteller" name="creator_name"/>
- <scroll_list.columns label="Erstellungsdatum" name="creation_date"/>
+ <scroll_list.columns label="Erstellungsdatum" name="creation_date" width="116"/>
</scroll_list>
<button label="Besitzerprofil einsehen..." name="button owner" tool_tip="Profil des Besitzers des markierten Objekts einsehen" width="155"/>
<button label="Erstellerprofil einsehen..." left="175" name="button creator" tool_tip="Profil des ursprünglichen Erstellers des markierten Objekts einsehen" width="155"/>
diff --git a/indra/newview/skins/default/xui/de/floater_inventory.xml b/indra/newview/skins/default/xui/de/floater_inventory.xml
index d9014fc0ef..d9b7c30fd2 100644
--- a/indra/newview/skins/default/xui/de/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/de/floater_inventory.xml
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Inventory" title="INVENTAR">
+<floater name="Inventory" title="MEIN INVENTAR">
<floater.string name="Title">
- Inventar
+ MEIN INVENTAR
</floater.string>
<floater.string name="TitleFetching">
- Inventar ([ITEM_COUNT] Artikel werden abgerufen...) [FILTER]
+ MEIN INVENTAR ([ITEM_COUNT] Objekte werden abgerufen...) [FILTER]
</floater.string>
<floater.string name="TitleCompleted">
- Inventar ([ITEM_COUNT] Artikel) [FILTER]
+ MEIN INVENTAR ([ITEM_COUNT] Objekte) [FILTER]
</floater.string>
<floater.string name="Fetched">
Abgerufen
diff --git a/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml
index e894f666c9..f98e23bbc4 100644
--- a/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/de/floater_inventory_item_properties.xml
@@ -59,10 +59,10 @@
Nächster Eigentümer:
</text>
<check_box label="Bearbeiten" name="CheckNextOwnerModify"/>
- <check_box label="Kopieren" left_delta="85" name="CheckNextOwnerCopy"/>
+ <check_box label="Kopieren" left_delta="55" name="CheckNextOwnerCopy"/>
<check_box label="Wiederverkaufen" name="CheckNextOwnerTransfer"/>
<check_box label="Zum Verkauf" name="CheckPurchase"/>
- <combo_box name="combobox sale copy">
+ <combo_box name="combobox sale copy" left_pad="25">
<combo_box.item label="Kopieren" name="Copy"/>
<combo_box.item label="Original" name="Original"/>
</combo_box>
diff --git a/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml
index 248460af82..3b42a8b741 100644
--- a/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/de/floater_live_lsleditor.xml
@@ -7,7 +7,7 @@
Läuft
</floater.string>
<floater.string name="Title">
- Skript: [NAME]
+ SKRIPT: [NAME]
</floater.string>
<button label="Zurücksetzen" label_selected="Zurücksetzen" name="Reset"/>
<check_box initial_value="true" label="Läuft" name="running"/>
diff --git a/indra/newview/skins/default/xui/de/floater_lsl_guide.xml b/indra/newview/skins/default/xui/de/floater_lsl_guide.xml
index 1d6f690d3c..73c21edc67 100644
--- a/indra/newview/skins/default/xui/de/floater_lsl_guide.xml
+++ b/indra/newview/skins/default/xui/de/floater_lsl_guide.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="script ed float" title="LSL-REFERENZ">
<check_box label="Cursor folgen" name="lock_check"/>
- <combo_box label="Sperren" name="history_combo"/>
+ <combo_box label="Sperren" name="history_combo" left_pad="50" width="80"/>
<button label="Zurück" name="back_btn"/>
<button label="Weiter" name="fwd_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_map.xml b/indra/newview/skins/default/xui/de/floater_map.xml
index b985d1d187..a9a3149177 100644
--- a/indra/newview/skins/default/xui/de/floater_map.xml
+++ b/indra/newview/skins/default/xui/de/floater_map.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Map">
+<floater name="Map" title="Minikarte">
<floater.string name="mini_map_north">
N
</floater.string>
diff --git a/indra/newview/skins/default/xui/de/floater_media_browser.xml b/indra/newview/skins/default/xui/de/floater_media_browser.xml
index 18adb5ee7f..2d438dfe21 100644
--- a/indra/newview/skins/default/xui/de/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/de/floater_media_browser.xml
@@ -14,8 +14,8 @@
<button label="Los" name="go"/>
</layout_panel>
<layout_panel name="time_controls">
- <button label="zurückspulen" name="rewind"/>
- <button label="anhalten" name="stop"/>
+ <button label="zurückspulen" name="rewind" width="100"/>
+ <button label="anhalten" name="stop" left_pad="20"/>
<button label="vorwärts" name="seek"/>
</layout_panel>
<layout_panel name="parcel_owner_controls">
diff --git a/indra/newview/skins/default/xui/de/floater_mem_leaking.xml b/indra/newview/skins/default/xui/de/floater_mem_leaking.xml
index b730146aa6..fdc9b950b6 100644
--- a/indra/newview/skins/default/xui/de/floater_mem_leaking.xml
+++ b/indra/newview/skins/default/xui/de/floater_mem_leaking.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="MemLeak" title="SPEICHERVERLUST SIMULIEREN">
- <spinner label="Verlustgeschwindigkeit (Bytes pro Frame):" name="leak_speed"/>
- <spinner label="Max. Speicherverlust (MB):" name="max_leak"/>
+ <spinner label="Verlustgeschwindigkeit (Bytes pro Frame):" name="leak_speed" label_width="224"/>
+ <spinner label="Max. Speicherverlust (MB):" name="max_leak" label_width="224"/>
<text name="total_leaked_label">
Aktueller Speicherverlust:[SIZE] KB
</text>
diff --git a/indra/newview/skins/default/xui/de/floater_moveview.xml b/indra/newview/skins/default/xui/de/floater_moveview.xml
index 03930c8ed6..b978322cef 100644
--- a/indra/newview/skins/default/xui/de/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/de/floater_moveview.xml
@@ -18,6 +18,15 @@
<string name="fly_back_tooltip">
Rückwärts fliegen (Nach-Unten-Pfeil oder S drücken)
</string>
+ <string name="walk_title">
+ Gehen
+ </string>
+ <string name="run_title">
+ Rennen
+ </string>
+ <string name="fly_title">
+ Fliegen
+ </string>
<panel name="panel_actions">
<button label="" label_selected="" name="turn left btn" tool_tip="Nach links (Links-Pfeil oder A drücken)"/>
<button label="" label_selected="" name="turn right btn" tool_tip="Nach rechts (Rechts-Pfeil oder D drücken)"/>
@@ -30,6 +39,5 @@
<button label="" name="mode_walk_btn" tool_tip="Gehen"/>
<button label="" name="mode_run_btn" tool_tip="Rennen"/>
<button label="" name="mode_fly_btn" tool_tip="Fliegen"/>
- <button label="Landen" name="stop_fly_btn" tool_tip="Landen"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_openobject.xml b/indra/newview/skins/default/xui/de/floater_openobject.xml
index f0b6aa498b..c3e7052283 100644
--- a/indra/newview/skins/default/xui/de/floater_openobject.xml
+++ b/indra/newview/skins/default/xui/de/floater_openobject.xml
@@ -3,6 +3,6 @@
<text name="object_name">
[DESC]:
</text>
- <button label="In Inventar kopieren" label_selected="In Inventar kopieren" name="copy_to_inventory_button" width="132"/>
- <button label="Kopieren und anziehen" label_selected="Kopieren und anziehen" left="150" name="copy_and_wear_button" width="132"/>
+ <button label="In Inventar kopieren" label_selected="In Inventar kopieren" name="copy_to_inventory_button" width="120"/>
+ <button label="Kopieren und anziehen" label_selected="Kopieren und anziehen" left_pad="6" name="copy_and_wear_button" width="136"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/de/floater_outfit_save_as.xml
index 42cb91ccbb..8c110e5516 100644
--- a/indra/newview/skins/default/xui/de/floater_outfit_save_as.xml
+++ b/indra/newview/skins/default/xui/de/floater_outfit_save_as.xml
@@ -1,11 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="modal container">
+<floater name="modal container" title="Outfit speichern">
<button label="Speichern" label_selected="Speichern" name="Save"/>
<button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
<text name="Save item as:">
- Outfit speichern als:
+ Meine aktuelle Kleidung
+als neues Outfit speichern:
</text>
<line_editor name="name ed">
- [BESCHR]
+ [DESC] (neu)
</line_editor>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_outgoing_call.xml b/indra/newview/skins/default/xui/de/floater_outgoing_call.xml
index 99ef0e900e..81079a3c52 100644
--- a/indra/newview/skins/default/xui/de/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/de/floater_outgoing_call.xml
@@ -25,10 +25,13 @@
Der Anruf wurde nicht entgegengenommen. Bitte versuchen Sie es später erneut.
</text>
<text name="nearby">
- Die Verbindung zu [VOICE_CHANNEL_NAME] wurde abgebrochen. Sie werden nun wieder mit dem Chat in Ihrer Nähe verbunden.
+ Die Verbindung zu [VOICE_CHANNEL_NAME] wurde abgebrochen. [RECONNECT_NEARBY]
</text>
- <text name="nearby_P2P">
- [VOICE_CHANNEL_NAME] hat den Anruf beendet. Sie werden nun wieder mit dem Chat in Ihrer Nähe verbunden.
+ <text name="nearby_P2P_by_other">
+ Ihr Anfruf wurde beendet. [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_agent">
+ Sie haben das Gespräch beendet. [RECONNECT_NEARBY]
</text>
<text name="leaving">
[CURRENT_CHAT] wird verlassen.
diff --git a/indra/newview/skins/default/xui/de/floater_pay.xml b/indra/newview/skins/default/xui/de/floater_pay.xml
index 6eb1d9472d..ec3c45dccf 100644
--- a/indra/newview/skins/default/xui/de/floater_pay.xml
+++ b/indra/newview/skins/default/xui/de/floater_pay.xml
@@ -7,7 +7,7 @@
Einwohner bezahlen
</string>
<text name="payee_label" width="130">
- Zahlen:
+ Bezahlen:
</text>
<icon name="icon_person" tool_tip="Person"/>
<text left="130" name="payee_name">
@@ -18,8 +18,8 @@
<button label="10 L$" label_selected="10 L$" name="fastpay 10"/>
<button label="20 L$" label_selected="20 L$" name="fastpay 20"/>
<text name="amount text">
- Oder Betrag auswählen:
+ oder Betrag auswählen:
</text>
- <button label="Zahlen" label_selected="Zahlen" name="pay btn"/>
+ <button label="Bezahlen" label_selected="Bezahlen" name="pay btn"/>
<button label="Abbrechen" label_selected="Abbrechen" name="cancel btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_pay_object.xml b/indra/newview/skins/default/xui/de/floater_pay_object.xml
index 92f5ea415e..59494cc100 100644
--- a/indra/newview/skins/default/xui/de/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/de/floater_pay_object.xml
@@ -17,13 +17,13 @@
<text left="105" name="object_name_text">
...
</text>
- <button label="1 L$" label_selected="1 L$" left="105" name="fastpay 1"/>
- <button label="5 L$" label_selected="5 L$" left="190" name="fastpay 5"/>
- <button label="10 L$" label_selected="10 L$" left="105" name="fastpay 10"/>
- <button label="20 L$" label_selected="20 L$" left="190" name="fastpay 20"/>
+ <button label="1 L$" label_selected="1 L$" name="fastpay 1"/>
+ <button label="5 L$" label_selected="5 L$" name="fastpay 5"/>
+ <button label="10 L$" label_selected="10 L$" name="fastpay 10"/>
+ <button label="20 L$" label_selected="20 L$" name="fastpay 20"/>
<text name="amount text">
- Oder Betrag auswählen:
+ oder Betrag auswählen:
</text>
- <button label="Zahlen" label_selected="Zahlen" name="pay btn"/>
+ <button label="Bezahlen" label_selected="Bezahlen" name="pay btn"/>
<button label="Abbrechen" label_selected="Abbrechen" name="cancel btn" width="76"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_postcard.xml b/indra/newview/skins/default/xui/de/floater_postcard.xml
index 37a0a0ad1d..91e0bb8133 100644
--- a/indra/newview/skins/default/xui/de/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/de/floater_postcard.xml
@@ -3,19 +3,19 @@
<text name="to_label">
E-Mail des Empfängers:
</text>
- <line_editor left="145" name="to_form" width="125"/>
+ <line_editor left_delta="145" name="to_form" width="125"/>
<text name="from_label">
Ihre E-Mail:
</text>
- <line_editor left="145" name="from_form" width="125"/>
+ <line_editor left_delta="145" name="from_form" width="125"/>
<text name="name_label">
Ihr Name:
</text>
- <line_editor left="145" name="name_form" width="125"/>
+ <line_editor left_delta="145" name="name_form" width="125"/>
<text name="subject_label">
Betreff:
</text>
- <line_editor label="Betreff hier eingeben." left="145" name="subject_form" width="125"/>
+ <line_editor label="Betreff hier eingeben." left_delta="145" name="subject_form" width="125"/>
<text name="msg_label">
Nachricht:
</text>
@@ -25,7 +25,7 @@
<check_box label="Im Web veröffentlichen" name="allow_publish_check" tool_tip="Veröffentlicht diese Postkarte im Web."/>
<check_box label="Ab-18-Inhalt" name="mature_check" tool_tip="Diese Postkarte enthält nicht jugendfreie Inhalte."/>
<button label="?" name="publish_help_btn"/>
- <text name="fine_print">
+ <text name="fine_print" bottom_delta="21" height="140">
Wenn sich der Empfänger bei SL anmeldet, erhalten Sie einen Empfehlungsbonus.
</text>
<button label="Abbrechen" name="cancel_btn"/>
diff --git a/indra/newview/skins/default/xui/de/floater_preferences.xml b/indra/newview/skins/default/xui/de/floater_preferences.xml
index 106fd6dfd3..a2712c437b 100644
--- a/indra/newview/skins/default/xui/de/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/de/floater_preferences.xml
@@ -6,10 +6,10 @@
<panel label="Allgemein" name="general"/>
<panel label="Grafik" name="display"/>
<panel label="Privatsphäre" name="im"/>
- <panel label="Sound" name="audio"/>
+ <panel label="Sound &amp; Medien" name="audio"/>
<panel label="Chat" name="chat"/>
- <panel label="Benachrichtigungen" name="msgs"/>
- <panel label="Setup" name="input"/>
+ <panel label="Meldungen" name="msgs"/>
+ <panel label="Konfiguration" name="input"/>
<panel label="Erweitert" name="advanced1"/>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_preview_animation.xml b/indra/newview/skins/default/xui/de/floater_preview_animation.xml
index e98faeb1f4..3dcdb52555 100644
--- a/indra/newview/skins/default/xui/de/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/de/floater_preview_animation.xml
@@ -3,10 +3,10 @@
<floater.string name="Title">
Animation: [NAME]
</floater.string>
- <text name="desc txt">
+ <text name="desc txt" width="140">
Beschreibung:
</text>
- <line_editor left="98" name="desc" width="189"/>
- <button label="In Welt abspielen" label_selected="Stopp" name="Anim play btn" tool_tip="Diese Animation so wiedergeben, dass andere sie sehen können." width="116"/>
- <button label="Lokal wiedergeben" label_selected="Stopp" left="171" name="Anim audition btn" tool_tip="Diese Animation so wiedergeben, dass nur Sie sie sehen." width="116"/>
+ <line_editor left="108" name="desc" width="160"/>
+ <button label="Inworld abspielen" label_selected="Stopp" name="Anim play btn" tool_tip="Diese Animation so wiedergeben, dass andere sie sehen können." width="116"/>
+ <button label="Lokal abspielen" label_selected="Stopp" left="171" name="Anim audition btn" tool_tip="Diese Animation so wiedergeben, dass nur Sie sie sehen." width="116"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_preview_gesture.xml b/indra/newview/skins/default/xui/de/floater_preview_gesture.xml
index 51c41a3209..48b1f1170c 100644
--- a/indra/newview/skins/default/xui/de/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/de/floater_preview_gesture.xml
@@ -7,7 +7,7 @@
Sound abspielen:
</floater.string>
<floater.string name="step_chat">
- Chat sprechen:
+ Im Chat anzeigen:
</floater.string>
<floater.string name="step_wait">
Warten:
@@ -36,7 +36,7 @@
<text name="replace_text" tool_tip="Ersetzt den Auslösertext mit diesem Text. Wenn Sie zum Beispiel den Auslöser „hallo“ durch „wie geht&apos;s“ ersetzen, erscheint im Chat anstelle von „Ich wollte nur hallo sagen“ der Text „Ich wollte nur wie geht&apos;s sagen“ und die zugehörige Geste wird abgespielt.">
Ersetzen mit:
</text>
- <line_editor name="replace_editor" tool_tip="Ersetzt den Auslösertext mit diesem Text. Wenn Sie zum Beispiel den Auslöser „hallo“ durch „wie geht&apos;s“ ersetzen, erscheint im Chat anstelle von „Ich wollte nur hallo sagen“ der Text „Ich wollte nur wie geht&apos;s sagen“ und die zugehörige Geste wird abgespielt."/>
+ <line_editor name="replace_editor" tool_tip="Ersetzt den Auslösertext mit diesem Text. Wenn Sie zum Beispiel den Auslöser „hallo“ durch „wie geht&apos;s“ ersetzen, erscheint im Chat anstelle von „Ich wollte nur hallo sagen“ der Text „Ich wollte nur wie geht&apos;s sagen“ und die zugehörige Geste wird abgespielt." left_delta="94" width="160"/>
<text name="key_label">
Tastenkürzel:
</text>
@@ -45,8 +45,8 @@
<text name="library_label">
Bibliothek:
</text>
- <scroll_list name="library_list"/>
- <button label="Hinzufügen &gt;&gt;" name="add_btn"/>
+ <scroll_list name="library_list" width="166"/>
+ <button label="Hinzufügen &gt;&gt;" name="add_btn" left_pad="6" width="94"/>
<text name="steps_label">
Schritte:
</text>
diff --git a/indra/newview/skins/default/xui/de/floater_preview_sound.xml b/indra/newview/skins/default/xui/de/floater_preview_sound.xml
index 17419548bc..4629ec4a04 100644
--- a/indra/newview/skins/default/xui/de/floater_preview_sound.xml
+++ b/indra/newview/skins/default/xui/de/floater_preview_sound.xml
@@ -6,6 +6,6 @@
<text name="desc txt">
Beschreibung:
</text>
- <button label="In Welt abspielen" label_selected="In Welt abspielen" name="Sound play btn" tool_tip="Gibt diesen Sound so wieder, dass andere ihn hören können."/>
- <button label="Lokal wiedergeben" label_selected="Lokal wiedergeben" name="Sound audition btn" tool_tip="Gibt diesen Sound so wieder, dass nur Sie ihn hören."/>
+ <button label="Inworld abspielen" label_selected="Inworld abspielen" name="Sound play btn" tool_tip="Gibt diesen Sound so wieder, dass andere ihn hören können."/>
+ <button label="Lokal abspielen" label_selected="Lokal abspielen" name="Sound audition btn" tool_tip="Gibt diesen Sound so wieder, dass nur Sie ihn hören."/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_preview_texture.xml b/indra/newview/skins/default/xui/de/floater_preview_texture.xml
index ac6a61cde6..526c0813bd 100644
--- a/indra/newview/skins/default/xui/de/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/de/floater_preview_texture.xml
@@ -42,6 +42,6 @@
</combo_item>
</combo_box>
<button label="OK" name="Keep"/>
- <button label="Abbrechen" name="Discard"/>
+ <button label="Verwerfen" name="Discard"/>
<button label="Speichern unter" name="save_tex_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_publish_classified.xml b/indra/newview/skins/default/xui/de/floater_publish_classified.xml
new file mode 100644
index 0000000000..993382727b
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_publish_classified.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="publish_classified" title="Anzeige wird veröffentlicht">
+ <text name="explanation_text">
+ Ihr Anzeige wird für eine Woche veröffentlicht.
+
+Anzeigengebühren werden nicht zurückerstattet.
+ </text>
+ <spinner label="Anzeigenpreis:" name="price_for_listing" tool_tip="Preis für Anzeige." value="50"/>
+ <text name="l$_text" value="L$"/>
+ <text name="more_info_text">
+ Weitere Infos (Link zur Hilfe)
+ </text>
+ <button label="Veröffentlichen" name="publish_btn"/>
+ <button label="Abbrechen" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_region_info.xml b/indra/newview/skins/default/xui/de/floater_region_info.xml
index 354cdaa272..c0dc47a67d 100644
--- a/indra/newview/skins/default/xui/de/floater_region_info.xml
+++ b/indra/newview/skins/default/xui/de/floater_region_info.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="regioninfo" title="REGION/GRUNDSTÜCK"/>
+<floater name="regioninfo" title="REGION/GRUNDBESITZ"/>
diff --git a/indra/newview/skins/default/xui/de/floater_report_abuse.xml b/indra/newview/skins/default/xui/de/floater_report_abuse.xml
index 3edf5959a2..e37e298478 100644
--- a/indra/newview/skins/default/xui/de/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/de/floater_report_abuse.xml
@@ -23,7 +23,8 @@
{128.1, 128.1, 15.4}
</text>
<text bottom_delta="-38" height="32" name="select_object_label">
- Klicken Sie auf die Schaltfläche, dann auf das entsprechende Objekt:
+ Klicken Sie die Schaltfläche, dann das entsprechende
+Objekt:
</text>
<button label="" label_selected="" name="pick_btn" tool_tip="Objektauswahl – Wählen Sie ein Objekt als Thema dieses Berichts aus"/>
<text name="object_name_label">
@@ -40,11 +41,11 @@
</text>
<combo_box name="category_combo" tool_tip="Kategorie -- wählen Sie die Kategorie aus, die am besten auf diesen Bericht zutrifft">
<combo_box.item label="Kategorie auswählen" name="Select_category"/>
- <combo_box.item label="Alter&gt; Age-Play" name="Age__Age_play"/>
+ <combo_box.item label="Alter &gt; Age-Play" name="Age__Age_play"/>
<combo_box.item label="Alter &gt; Erwachsener Einwohner in Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/>
<combo_box.item label="Alter &gt; Minderjähriger Einwohner außerhalb Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
- <combo_box.item label="Angriff&gt; Kampf-Sandbox / unsichere Region" name="Assault__Combat_sandbox___unsafe_area"/>
- <combo_box.item label="Angriff&gt; Sichere Region" name="Assault__Safe_area"/>
+ <combo_box.item label="Angriff &gt; Kampf-Sandbox / unsichere Region" name="Assault__Combat_sandbox___unsafe_area"/>
+ <combo_box.item label="Angriff &gt; Sichere Region" name="Assault__Safe_area"/>
<combo_box.item label="Angriff &gt; Sandbox für Waffentest" name="Assault__Weapons_testing_sandbox"/>
<combo_box.item label="Handel &gt; Produkt nicht geliefert oder Dienstleistung nicht erbracht" name="Commerce__Failure_to_deliver_product_or_service"/>
<combo_box.item label="Offenlegung &gt; Informationen aus realer Welt" name="Disclosure__Real_world_information"/>
@@ -56,7 +57,7 @@
<combo_box.item label="Ruhestörung &gt; Ständige Spam-Wiederholung" name="Disturbing_the_peace__Repetitive_spam"/>
<combo_box.item label="Ruhestörung &gt; Unerwünschte Spam-Werbung" name="Disturbing_the_peace__Unwanted_advert_spam"/>
<combo_box.item label="Betrug &gt; L$" name="Fraud__L$"/>
- <combo_box.item label="Betrug&gt; Land" name="Fraud__Land"/>
+ <combo_box.item label="Betrug &gt; Land" name="Fraud__Land"/>
<combo_box.item label="Betrug &gt; Schneeballsystem oder Kettenbrief" name="Fraud__Pyramid_scheme_or_chain_letter"/>
<combo_box.item label="Betrug &gt; US$" name="Fraud__US$"/>
<combo_box.item label="Belästigung &gt; Werbefarmen / visueller Spam" name="Harassment__Advert_farms___visual_spam"/>
@@ -93,9 +94,9 @@
Details:
</text>
<text name="bug_aviso">
- Bitte beschreiben Sie alles so genau wie möglich.
+ Detaillierte Beschreibung:
</text>
- <text_editor bottom_delta="-136" height="130" name="details_edit"/>
+ <text_editor bottom_delta="-136" height="70" name="details_edit"/>
<text bottom_delta="-20" name="incomplete_title">
* Unvollständige Berichte werden nicht bearbeitet
</text>
diff --git a/indra/newview/skins/default/xui/de/floater_script_preview.xml b/indra/newview/skins/default/xui/de/floater_script_preview.xml
index 27c40aff07..e0bcd42523 100644
--- a/indra/newview/skins/default/xui/de/floater_script_preview.xml
+++ b/indra/newview/skins/default/xui/de/floater_script_preview.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview lsl text" title="SKRIPT: ROTATIONS-SKRIPT">
<floater.string name="Title">
- Skript: [NAME]
+ SKRIPT: [NAME]
</floater.string>
- <text name="desc txt">
+ <text name="desc txt" width="120">
Beschreibung:
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_sell_land.xml b/indra/newview/skins/default/xui/de/floater_sell_land.xml
index 2bc7356e65..8f67fae464 100644
--- a/indra/newview/skins/default/xui/de/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_sell_land.xml
@@ -5,13 +5,13 @@
<text name="info_parcel_label">
Parzelle:
</text>
- <text bottom_delta="-5" height="16" name="info_parcel">
+ <text bottom_delta="-5" height="16" name="info_parcel" left="70">
PARZELLENNAME
</text>
<text name="info_size_label">
Größe:
</text>
- <text bottom_delta="-21" height="32" name="info_size">
+ <text bottom_delta="-21" height="32" name="info_size" left="70">
[AREA] m².
</text>
<text bottom_delta="-57" height="28" name="info_action">
@@ -20,8 +20,8 @@
<text name="price_label">
1. Preis festlegen:
</text>
- <text name="price_text">
- Einen angemessenen Preis auswählen.
+ <text name="price_text" >
+ Preis eingeben
</text>
<text name="price_ld">
L$
@@ -36,12 +36,12 @@
2. Land verkaufen an:
</text>
<text bottom_delta="-16" height="16" left="72" name="sell_to_text" right="-10">
- Wählen Sie, ob der Verkauf offen oder auf eine bestimmte Person beschränkt ist.
+ Offener Verkauf oder Verkauf an bestimmte Person?
</text>
<combo_box bottom_delta="-32" height="16" left="72" name="sell_to" width="140">
<combo_box.item label="-- Auswählen --" name="--selectone--"/>
- <combo_box.item label="Jeder" name="Anyone"/>
- <combo_box.item label="Bestimmte Person:" name="Specificuser:"/>
+ <combo_box.item label="An jeden" name="Anyone"/>
+ <combo_box.item label="An bestimmte Person:" name="Specificuser:"/>
</combo_box>
<button label="Auswählen" name="sell_to_select_agent"/>
<text name="sell_objects_label">
@@ -58,7 +58,7 @@
<text name="nag_message_label">
ACHTUNG: Verkäufe sind endgültig.
</text>
- <button label="Land zum Verkauf freigeben" name="sell_btn" width="180"/>
+ <button label="Zum Verkauf freigeben" name="sell_btn" width="180"/>
<button label="Abbrechen" name="cancel_btn"/>
</panel>
</scroll_container>
diff --git a/indra/newview/skins/default/xui/de/floater_snapshot.xml b/indra/newview/skins/default/xui/de/floater_snapshot.xml
index 80573d69ad..a656ffb894 100644
--- a/indra/newview/skins/default/xui/de/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/de/floater_snapshot.xml
@@ -1,79 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Snapshot" title="FOTO-ANZEIGE">
- <text name="type_label">
- Zweck des Fotos
- </text>
- <radio_group label="Fototyp" name="snapshot_type_radio">
- <radio_item label="Email-Adresse" name="postcard"/>
- <radio_item label="Mein Inventar ([AMOUNT] L$)" name="texture"/>
- <radio_item label="Auf meinem Computer speichern" name="local"/>
- </radio_group>
- <text name="file_size_label">
- [SIZE] KB
- </text>
- <button label="Foto aktualisieren" name="new_snapshot_btn"/>
- <button label="Senden" name="send_btn"/>
- <button label="Speichern ([AMOUNT] L$)" name="upload_btn"/>
- <flyout_button label="Speichern" name="save_btn" tool_tip="Bild als Datei speichern">
- <flyout_button_item label="Speichern" name="save_item"/>
- <flyout_button_item label="Speichern unter..." name="saveas_item"/>
- </flyout_button>
- <button label="Abbrechen" name="discard_btn"/>
- <button label="Mehr" name="more_btn" tool_tip="Erweiterte Optionen"/>
- <button label="Weniger" name="less_btn" tool_tip="Erweiterte Optionen"/>
- <text name="type_label2">
- Größe
- </text>
- <text name="format_label">
- Format
- </text>
- <combo_box label="Auflösung" name="postcard_size_combo">
- <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
- <combo_box.item label="640x480" name="640x480"/>
- <combo_box.item label="800x600" name="800x600"/>
- <combo_box.item label="1024x768" name="1024x768"/>
- <combo_box.item label="Benutzerdefiniert" name="Custom"/>
- </combo_box>
- <combo_box label="Auflösung" name="texture_size_combo">
- <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
- <combo_box.item label="Klein (128x128)" name="Small(128x128)"/>
- <combo_box.item label="Mittel (256x256)" name="Medium(256x256)"/>
- <combo_box.item label="Groß (512x512)" name="Large(512x512)"/>
- <combo_box.item label="Benutzerdefiniert" name="Custom"/>
- </combo_box>
- <combo_box label="Auflösung" name="local_size_combo">
- <combo_box.item label="Aktuelles Fenster" name="CurrentWindow"/>
- <combo_box.item label="320x240" name="320x240"/>
- <combo_box.item label="640x480" name="640x480"/>
- <combo_box.item label="800x600" name="800x600"/>
- <combo_box.item label="1024x768" name="1024x768"/>
- <combo_box.item label="1280x1024" name="1280x1024"/>
- <combo_box.item label="1600x1200" name="1600x1200"/>
- <combo_box.item label="Benutzerdefiniert" name="Custom"/>
- </combo_box>
- <combo_box label="Format" name="local_format_combo">
- <combo_box.item label="PNG" name="PNG"/>
- <combo_box.item label="JPEG" name="JPEG"/>
- <combo_box.item label="BMP" name="BMP"/>
- </combo_box>
- <spinner label="Breite" name="snapshot_width"/>
- <spinner label="Höhe" name="snapshot_height"/>
- <check_box label="Seitenverhältnis beibehalten" name="keep_aspect_check"/>
- <slider label="Bildqualität" name="image_quality_slider"/>
- <text name="layer_type_label" width="63">
- Aufnehmen:
- </text>
- <combo_box label="Bildlayer" left="73" name="layer_types" width="132">
- <combo_box.item label="Farben" name="Colors"/>
- <combo_box.item label="Tiefe" name="Depth"/>
- <combo_box.item label="Objektmasken" name="ObjectMattes"/>
- </combo_box>
- <check_box label="Schnittstelle" name="ui_check"/>
- <check_box label="HUDs" name="hud_check"/>
- <check_box label="Nach dem Speichern offen lassen" name="keep_open_check"/>
- <check_box label="Frame einfrieren (Vollbild)" name="freeze_frame_check"/>
- <check_box label="Automatisch aktualisieren" name="auto_snapshot_check"/>
- <string name="unknown">
+<floater name="Snapshot" title="Foto">
+ <floater.string name="unknown">
unbekannt
- </string>
+ </floater.string>
+ <button label="Foto aktualisieren" name="new_snapshot_btn"/>
+ <line_editor label="Beschreibung" name="description"/>
+ <panel name="panel_snapshot_main">
+ <button label="Foto freigeben" name="share"/>
+ <button label="Foto speichern" name="save"/>
+ <button label="Als Profilbild festlegen" name="set_profile_pic"/>
+ </panel>
+ <panel name="panel_snapshot_share">
+ <button label="Ins Internet stellen" name="share_to_web"/>
+ <button label="Foto per E-Mail senden" name="share_to_email"/>
+ <button label="Zurück" name="cancel_share"/>
+ </panel>
+ <panel name="panel_snapshot_save">
+ <button label="Objekt in meinem Inventar speichern" name="save_to_inventory"/>
+ <button label="Auf meinem Computer speichern" name="save_to_computer"/>
+ <button label="Zurück" name="cancel_save"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_stats.xml b/indra/newview/skins/default/xui/de/floater_stats.xml
index dcea484e13..1eb2dd4288 100644
--- a/indra/newview/skins/default/xui/de/floater_stats.xml
+++ b/indra/newview/skins/default/xui/de/floater_stats.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Statistics" title="STATISTIKEN">
- <scroll_container name="statistics_scroll">
- <container_view name="statistics_view">
+<floater name="Statistics" title="STATISTIKEN" width="280">
+ <scroll_container name="statistics_scroll" width="280">
+ <container_view name="statistics_view" width="280">
<stat_view label="Basic" name="basic">
<stat_bar label="FPS" name="fps"/>
<stat_bar label="Bandbreite" name="bandwidth"/>
diff --git a/indra/newview/skins/default/xui/de/floater_sys_well.xml b/indra/newview/skins/default/xui/de/floater_sys_well.xml
index 982786b66e..ec79b862b4 100644
--- a/indra/newview/skins/default/xui/de/floater_sys_well.xml
+++ b/indra/newview/skins/default/xui/de/floater_sys_well.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="notification_chiclet" title="MELDUNGEN">
+<floater name="sys_well_window" title="MELDUNGEN">
<string name="title_im_well_window">
- IM-SITZUNGEN
+ GESPRÄCHE
</string>
<string name="title_notification_well_window">
BENACHRICHTIGUNGEN
diff --git a/indra/newview/skins/default/xui/de/floater_telehub.xml b/indra/newview/skins/default/xui/de/floater_telehub.xml
index 923b4c0079..83d37b2ce4 100644
--- a/indra/newview/skins/default/xui/de/floater_telehub.xml
+++ b/indra/newview/skins/default/xui/de/floater_telehub.xml
@@ -6,22 +6,22 @@
<text name="status_text_not_connected">
Kein Telehub verbunden.
</text>
- <text name="help_text_connected">
+ <text name="help_text_connected" width="300">
Klicken Sie zum Entfernen auf „Trennen“.
</text>
<text bottom_delta="-18" height="38" name="help_text_not_connected">
Wählen Sie ein Objekt und klicken Sie auf
„Mit Telehub verbinden“.
</text>
- <button label="Mit Telehub verbinden" name="connect_btn" width="122"/>
- <button label="Trennen" left="142" name="disconnect_btn" width="98"/>
+ <button label="Mit Telehub verbinden" name="connect_btn" width="134"/>
+ <button label="Trennen" left="152" name="disconnect_btn" width="88"/>
<text name="spawn_points_text" width="230">
Spawn-Punkte (Positionen, nicht Objekte):
</text>
<button label="Spawn hinzufügen" name="add_spawn_point_btn"/>
<button label="Spawn entfernen" name="remove_spawn_point_btn"/>
<text name="spawn_point_help">
- Wählen Sie ein Objekt und klicken zur Positionsangabe auf Spawn hinzufügen.
+ Wählen Sie ein Objekt und klicken Sie zur Positionsangabe auf Spawn hinzufügen.
Anschließend können Sie das Objekt verschieben oder löschen.
Positionsangaben sind relativ zum Telehub-Mittelpunkt.
Wählen Sie ein Objekt aus der Liste aus, um dieses inworld zu markieren.
diff --git a/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml
index 4e2d8a9274..8944c79c7d 100644
--- a/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/de/floater_texture_ctrl.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="texture picker" title="AUSWÄHLEN: TEXTUR">
+<floater name="texture picker" title="TEXTUR AUSWÄHLEN">
<string name="choose_picture">
Zum Auswählen eines Bildes hier klicken
</string>
<text name="Multiple">
- Mehrer Texturen
+ Mehrere Texturen
</text>
<text name="unknown">
Größe: [DIMENSIONS]
diff --git a/indra/newview/skins/default/xui/de/floater_tools.xml b/indra/newview/skins/default/xui/de/floater_tools.xml
index b2f8cbed45..c5c11faf93 100644
--- a/indra/newview/skins/default/xui/de/floater_tools.xml
+++ b/indra/newview/skins/default/xui/de/floater_tools.xml
@@ -7,7 +7,7 @@
Klicken und ziehen, um die ausgewählte Seite zu dehnen
</floater.string>
<floater.string name="status_move">
- Maus verschiebt, Umschalt-Taste und Maus kopiert
+ Maus verschiebt, Umschalt + Maus kopiert
</floater.string>
<floater.string name="status_modifyland">
Klicken und halten, um das Land zu bearbeiten
@@ -64,13 +64,16 @@
<radio_item label="Fläche auswählen" name="radio select face"/>
</radio_group>
<check_box label="Verknüpfte Teile bearbeiten" name="checkbox edit linked parts"/>
- <text name="RenderingCost" tool_tip="Zeigt die errechneten Wiedergabekosten für diesen Objekt">
+ <text name="RenderingCost" tool_tip="Zeigt die errechneten Wiedergabekosten für dieses Objekt">
þ: [COUNT]
</text>
- <check_box label="Beide Seiten dehnen" name="checkbox uniform"/>
+ <check_box name="checkbox uniform"/>
+ <text name="checkbox uniform label">
+ Beide Seiten dehnen
+ </text>
<check_box initial_value="true" label="Texturen dehnen" name="checkbox stretch textures"/>
- <check_box initial_value="true" label="An Raster ausrichten" name="checkbox snap to grid"/>
- <combo_box name="combobox grid mode" tool_tip="Wählen Sie das Rasterlineal aus, um das Objekt zu positionieren.">
+ <check_box initial_value="true" label="An Raster ausrichten" name="checkbox snap to grid" top_pad="10"/>
+ <combo_box name="combobox grid mode" tool_tip="Wählen Sie ein Rasterlineal zum Positionieren des Objekts aus.">
<combo_box.item label="Globales Raster" name="World"/>
<combo_box.item label="Lokales Raster" name="Local"/>
<combo_box.item label="Referenzraster" name="Reference"/>
@@ -196,7 +199,7 @@
</combo_box>
<check_box label="Zum Verkauf:" name="checkbox for sale"/>
<combo_box name="sale type">
- <combo_box.item label="Kopieren" name="Copy"/>
+ <combo_box.item label="Kopie" name="Copy"/>
<combo_box.item label="Inhalt" name="Contents"/>
<combo_box.item label="Original" name="Original"/>
</combo_box>
@@ -238,10 +241,10 @@
</panel>
</panel>
<panel label="Objekt" name="Object">
- <check_box label="Gesperrt" name="checkbox locked" tool_tip="Verhindert, dass Objekt verschoben oder gelöscht wird. Oft beim Bauen nützlich, um unbeabsichtigte Bearbeitungen zu vermeiden."/>
- <check_box label="Physisch" name="Physical Checkbox Ctrl" tool_tip="Gestattet, das Objekt geschoben und von Schwerkraft beeinflusst wird"/>
+ <check_box label="Gesperrt" name="checkbox locked" tool_tip="Verhindert, dass das Objekt verschoben oder gelöscht wird. Oft beim Bauen nützlich, um unbeabsichtigte Bearbeitungen zu vermeiden."/>
+ <check_box label="Physisch" name="Physical Checkbox Ctrl" tool_tip="Gestattet, dass das Objekt geschoben und von Schwerkraft beeinflusst wird"/>
<check_box label="Temporär" name="Temporary Checkbox Ctrl" tool_tip="Bewirkt, dass das Objekt 1 Minute nach seiner Erstellung gelöscht wird."/>
- <check_box label="Phantom" name="Phantom Checkbox Ctrl" tool_tip="Verursacht, dass Objekt nicht mit anderen Objekten oder Avataren kollidiert"/>
+ <check_box label="Phantom" name="Phantom Checkbox Ctrl" tool_tip="Verhindert, dass das Objekt mit anderen Objekten oder Avataren kollidiert"/>
<text name="label position">
Position (Meter)
</text>
@@ -363,15 +366,15 @@
<text name="edit_object">
Objekteigenschaften bearbeiten:
</text>
- <check_box label="Flexibler Weg" name="Flexible1D Checkbox Ctrl" tool_tip="Bewirkt, dass sich das Objekt um die Z-Achse biegen kann. (Nur Client-Seite)"/>
+ <check_box label="Flexibler Pfad" name="Flexible1D Checkbox Ctrl" tool_tip="Bewirkt, dass sich das Objekt um die Z-Achse biegen kann. (Nur Client-Seite)"/>
<spinner label="Weichheit" name="FlexNumSections"/>
<spinner label="Schwerkraft" name="FlexGravity"/>
<spinner label="Ziehen" name="FlexFriction"/>
<spinner label="Wind" name="FlexWind"/>
<spinner label="Spannung" name="FlexTension"/>
- <spinner label="Erzwingen X" name="FlexForceX"/>
- <spinner label="Erzwingen Y" name="FlexForceY"/>
- <spinner label="Erzwingen Z" name="FlexForceZ"/>
+ <spinner label="Kraft X" name="FlexForceX"/>
+ <spinner label="Kraft Y" name="FlexForceY"/>
+ <spinner label="Kraft Z" name="FlexForceZ"/>
<check_box label="Licht" name="Light Checkbox Ctrl" tool_tip="Verursacht, dass Objekt Licht emittiert"/>
<color_swatch label="" name="colorswatch" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
<texture_picker label="" name="light texture control" tool_tip="Klicken, um eine Bild auszuwählen (dieser Effekt funktioniert nur, wenn zeitversetzte Wiedergabe aktiviert ist)"/>
@@ -477,7 +480,7 @@
<text name="label_area">
Gebiet: [AREA] m².
</text>
- <button label="Über Land" label_selected="Über Land" name="button about land"/>
+ <button label="Land-Info" label_selected="Land-Info" name="button about land"/>
<check_box label="Eigentümer anzeigen" name="checkbox show owners" tool_tip="Die Parzellen farblich nach Eigentümtertyp anzeigen Grün = Ihr Land Blau = Das Land Ihrer Gruppe Rot = Im Eigentum anderer Geld = Zum Verkauf Lila = Zur Auktion Grau = Öffentlich"/>
<text name="label_parcel_modify">
Parzelle ändern
diff --git a/indra/newview/skins/default/xui/de/floater_tos.xml b/indra/newview/skins/default/xui/de/floater_tos.xml
index e11b453b41..1f3ef2f0b4 100644
--- a/indra/newview/skins/default/xui/de/floater_tos.xml
+++ b/indra/newview/skins/default/xui/de/floater_tos.xml
@@ -1,22 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="modal container" title=" ">
+ <floater.string name="real_url">
+ http://secondlife.com/app/tos/
+ </floater.string>
+ <floater.string name="loading_url">
+ data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+ </floater.string>
<button label="Weiter" label_selected="Weiter" name="Continue"/>
<button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
- <radio_group name="tos_agreement">
- <radio_item label="Ich stimme den Nutzungsbedingungen nicht zu" name="radio_disagree"/>
- <radio_item label="Ich stimme den Nutzungsbedingungen zu" name="radio_agree"/>
- </radio_group>
- <text name="tos_title">
- Nutzungsvereinbarung
- </text>
- <check_box label="Ich stimme den Nutzungsbedingungen zu" name="agree_chk"/>
+ <check_box label="Ich stimme den Servicebedingungen und Datenschutzbestimmungen zu." name="agree_chk"/>
<text name="tos_heading">
- Lesen Sie die folgenden Servicebedingungen sorgfältig durch. Sie müssen den Servicebedinungen zustimmen, um [SECOND_LIFE] weiterhin verwenden zu können.
- </text>
- <text_editor name="tos_text">
- TOS_TEXT
- </text_editor>
- <text name="real_url">
- http://secondlife.com/app/tos/
+ Lesen Sie die folgenden Servicebedingungen und Datenbestimmungen sorgfältig durch. Sie müssen den Servicebedingungen zustimmen, um sich bei [SECOND_LIFE] anmelden zu können.
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_url_entry.xml b/indra/newview/skins/default/xui/de/floater_url_entry.xml
index 392d53a33d..f5fa449c85 100644
--- a/indra/newview/skins/default/xui/de/floater_url_entry.xml
+++ b/indra/newview/skins/default/xui/de/floater_url_entry.xml
@@ -3,10 +3,10 @@
<text name="media_label">
Medien-URL:
</text>
- <button label="OK" name="ok_btn" />
- <button label="Abbrechen" name="cancel_btn" width="75" />
- <button label="Löschen" name="clear_btn" />
- <text name="loading_label">
+ <button label="OK" name="ok_btn" width="30"/>
+ <button label="Abbrechen" name="cancel_btn" width="66" />
+ <button label="Löschen" name="clear_btn" left_pad="100"/>
+ <text name="loading_label" left="120">
Wird geladen...
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_voice_controls.xml b/indra/newview/skins/default/xui/de/floater_voice_controls.xml
index f978042cc2..07b7689cd0 100644
--- a/indra/newview/skins/default/xui/de/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/de/floater_voice_controls.xml
@@ -16,8 +16,13 @@
Es ist niemand in der Nähe, der Voice aktiviert hat.
</string>
<layout_stack name="my_call_stack">
- <layout_panel name="leave_call_btn_panel">
- <button label="Anruf beenden" name="leave_call_btn"/>
+ <layout_panel name="my_panel">
+ <text name="user_text" value="Mein Avatar:"/>
</layout_panel>
+ <layout_stack name="voice_effect_and_leave_call_stack">
+ <layout_panel name="leave_call_btn_panel">
+ <button label="Anruf beenden" name="leave_call_btn"/>
+ </layout_panel>
+ </layout_stack>
</layout_stack>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_voice_effect.xml b/indra/newview/skins/default/xui/de/floater_voice_effect.xml
new file mode 100644
index 0000000000..8de0133ead
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/floater_voice_effect.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="Orte" name="voice_effects" title="VOICE-MORPHING AUSPROBIEREN">
+ <string name="no_voice_effect">
+ (Kein Voice-Morphing)
+ </string>
+ <string name="active_voice_effect">
+ (Aktiv)
+ </string>
+ <string name="unsubscribed_voice_effect">
+ (nicht abonniert)
+ </string>
+ <string name="new_voice_effect">
+ (Neu!)
+ </string>
+ <text name="status_text">
+ Um die Voice-Morph-Effekte auszuprobieren, einfach auf die Schaltfläche „Aufnahme“ klicken und kurz ins Mikrofon sprechen. Klicken Sie dann auf einen beliebigen Effekt in der Liste, um zu hören, wie der Effekt Ihre Stimme verändert.
+
+Schließen Sie dieses Fenster, um wieder mit dem Voice-Chat in der Nähe verbunden zu werden.
+ </text>
+ <button label="Aufnahme" name="record_btn" tool_tip="Nehmen Sie Ihre Stimme auf."/>
+ <button label="Stopp" name="record_stop_btn"/>
+ <text name="voice_morphing_link">
+ [[URL]Voice-Morphing abonnieren]
+ </text>
+ <scroll_list name="voice_effect_list" tool_tip="Nehmen Sie Ihre Stimme auf und klicken Sie dann auf einen Effekt, um diesen auszuprobieren.">
+ <scroll_list.columns label="Voice-Morphing" name="name"/>
+ <scroll_list.columns label="Gültig bis" name="expires"/>
+ </scroll_list>
+</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_water.xml b/indra/newview/skins/default/xui/de/floater_water.xml
index ed18dfdfff..097a60a444 100644
--- a/indra/newview/skins/default/xui/de/floater_water.xml
+++ b/indra/newview/skins/default/xui/de/floater_water.xml
@@ -3,14 +3,14 @@
<floater.string name="WLDefaultWaterNames">
Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
</floater.string>
- <text name="KeyFramePresetsText">
+ <text name="KeyFramePresetsText" width="116">
Voreinstellungen:
</text>
<button label="Neu" label_selected="Neu" name="WaterNewPreset"/>
<button label="Speichern" label_selected="Speichern" name="WaterSavePreset"/>
<button label="Löschen" label_selected="Löschen" name="WaterDeletePreset"/>
<tab_container name="Water Tabs">
- <panel label="Einstellungen" name="Settings">
+ <panel label="EINSTELLUNGEN" name="Settings">
<text name="BHText">
Wassertrübungsfarbe
</text>
@@ -44,7 +44,7 @@
Mischungsmultiplikator
</text>
</panel>
- <panel label="Bild" name="Waves">
+ <panel label="BILD" name="Waves">
<text name="BHText">
Richtung große Welle
</text>
diff --git a/indra/newview/skins/default/xui/de/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/de/floater_wearable_save_as.xml
index dad1b62975..f9b3552e8b 100644
--- a/indra/newview/skins/default/xui/de/floater_wearable_save_as.xml
+++ b/indra/newview/skins/default/xui/de/floater_wearable_save_as.xml
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="modal container" title=" ">
- <button label="Speichern" label_selected="Speichern" name="Save" />
- <button label="Abbrechen" label_selected="Abbrechen" name="Cancel" />
+ <button label="Speichern" label_selected="Speichern" name="Save"/>
+ <button label="Abbrechen" label_selected="Abbrechen" name="Cancel"/>
<text name="Save item as:">
- Objekt speichern als:
+ Objekt in meinem Inventar speichern als:
</text>
<line_editor name="name ed">
Neu [DESC]
diff --git a/indra/newview/skins/default/xui/de/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/de/floater_whitelist_entry.xml
index 35a5ec35f7..1332509529 100644
--- a/indra/newview/skins/default/xui/de/floater_whitelist_entry.xml
+++ b/indra/newview/skins/default/xui/de/floater_whitelist_entry.xml
@@ -5,5 +5,5 @@
</text>
<line_editor name="whitelist_entry" tool_tip="Eine URL oder URL-Patten in die Whitelist eingeben"/>
<button label="OK" name="ok_btn"/>
- <button label="Abbrechen" name="cancel_btn"/>
+ <button label="Abbrechen" name="cancel_btn" width="80"/>
</floater>
diff --git a/indra/newview/skins/default/xui/de/floater_windlight_options.xml b/indra/newview/skins/default/xui/de/floater_windlight_options.xml
index 3e06d8f06b..5b59336f9d 100644
--- a/indra/newview/skins/default/xui/de/floater_windlight_options.xml
+++ b/indra/newview/skins/default/xui/de/floater_windlight_options.xml
@@ -8,7 +8,7 @@
<button label="Löschen" label_selected="Löschen" name="WLDeletePreset"/>
<button label="Tageszyklus-Editor" label_selected="Tageszyklus-Editor" name="WLDayCycleMenuButton"/>
<tab_container name="WindLight Tabs">
- <panel label="Atmosphäre" name="Atmosphere">
+ <panel label="ATMOSPHÄRE" name="Atmosphere">
<text name="BHText">
Horizontfarbe
</text>
@@ -62,7 +62,7 @@
</text>
<button label=" ?" name="WLMaxAltitudeHelp"/>
</panel>
- <panel label="Licht" name="Lighting">
+ <panel label="LICHT" name="Lighting">
<text name="SLCText">
Sonne/Mond-Farbe
</text>
@@ -118,7 +118,7 @@
</text>
<button label=" ?" name="WLStarBrightnessHelp"/>
</panel>
- <panel label="Wolken" name="Clouds">
+ <panel label="WOLKEN" name="Clouds">
<text name="WLCloudColorText">
Wolkenfarbe
</text>
diff --git a/indra/newview/skins/default/xui/de/floater_world_map.xml b/indra/newview/skins/default/xui/de/floater_world_map.xml
index accc023b8f..fb3a4ba9b5 100644
--- a/indra/newview/skins/default/xui/de/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/de/floater_world_map.xml
@@ -5,7 +5,7 @@
Legende
</text>
</panel>
- <panel>
+ <panel name="layout_panel_2">
<button label="Meine Position" label_selected="Wo bin ich?" name="Show My Location" tool_tip="Karte auf Position meines Avatars zentrieren"/>
<text name="me_label">
Ich
@@ -30,16 +30,16 @@
</text>
<button label="Nach Hause" label_selected="Nach Hause" name="Go Home" tool_tip="Nach Hause teleportieren"/>
<text name="Home_label">
- Startseite
+ Zuhause
</text>
<text name="events_label">
Events:
</text>
<check_box label="PG" name="event_chk"/>
<text name="pg_label">
- Allgemein
+ Generell
</text>
- <check_box initial_value="true" label="Mature" name="event_mature_chk"/>
+ <check_box label="Mature" name="event_mature_chk"/>
<text name="mature_label">
Moderat
</text>
@@ -48,12 +48,12 @@
Adult
</text>
</panel>
- <panel>
+ <panel name="layout_panel_3">
<text name="find_on_map_label">
Auf Karte anzeigen
</text>
</panel>
- <panel>
+ <panel name="layout_panel_4">
<combo_box label="Online-Freunde" name="friend combo" tool_tip="Freunde auf Karte anzeigen">
<combo_box.item label="Meine Freunde: Online" name="item1"/>
</combo_box>
@@ -62,6 +62,7 @@
</combo_box>
<search_editor label="Regionen nach Name" name="location" tool_tip="Geben Sie den Namen einer Region ein"/>
<button label="Suchen" name="DoSearch" tool_tip="Nach einer Region suchen"/>
+ <button name="Clear" tool_tip="Karte zurücksetzen"/>
<scroll_list name="search_results">
<scroll_list.columns label="" name="icon"/>
<scroll_list.columns label="" name="sim_name"/>
@@ -70,12 +71,12 @@
<button font="SansSerifSmall" label="SLurl kopieren" name="copy_slurl" tool_tip="Kopiert die aktuelle Position als SLurl zur Verwendung im Web."/>
<button label="Auswahl anzeigen" label_selected="Ziel anzeigen" name="Show Destination" tool_tip="Karte auf ausgewählte Position zentrieren"/>
</panel>
- <panel>
+ <panel name="layout_panel_5">
<text name="zoom_label">
Zoom
</text>
</panel>
- <panel>
+ <panel name="layout_panel_6">
<slider label="Zoom" name="zoom slider"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/de/inspect_avatar.xml b/indra/newview/skins/default/xui/de/inspect_avatar.xml
index 489e257867..a0bd24a69f 100644
--- a/indra/newview/skins/default/xui/de/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/de/inspect_avatar.xml
@@ -16,9 +16,9 @@
Dies ist meine Beschreibung und ich finde sie wirklich gut!
</text>
<slider name="volume_slider" tool_tip="Lautstärke" value="0.5"/>
- <button label="Freund hinzufügen" name="add_friend_btn"/>
+ <button label="Freund hinzufügen" name="add_friend_btn" width="110"/>
<button label="IM" name="im_btn"/>
- <button label="Mehr" name="view_profile_btn"/>
+ <button label="Profil" left_delta="120" name="view_profile_btn" width="44"/>
<panel name="moderator_panel">
<button label="Voice deaktivieren" name="disable_voice"/>
<button label="Voice aktivieren" name="enable_voice"/>
diff --git a/indra/newview/skins/default/xui/de/inspect_group.xml b/indra/newview/skins/default/xui/de/inspect_group.xml
index 81d946be9d..badb47bf08 100644
--- a/indra/newview/skins/default/xui/de/inspect_group.xml
+++ b/indra/newview/skins/default/xui/de/inspect_group.xml
@@ -24,7 +24,7 @@
</text>
<text name="group_details">
Eine Gruppe für Leute, die sich gerne mit Elchen unterhält.
-Hoch solln sie leben! Elche forever! Und auch Mungos!
+Hoch solln sie leben! Elche forever! Und auch Mungos!
</text>
<text name="group_cost">
Mitgliedschaft: 123 L$
diff --git a/indra/newview/skins/default/xui/de/inspect_object.xml b/indra/newview/skins/default/xui/de/inspect_object.xml
index 61f2cc8dc9..72b8235828 100644
--- a/indra/newview/skins/default/xui/de/inspect_object.xml
+++ b/indra/newview/skins/default/xui/de/inspect_object.xml
@@ -8,7 +8,7 @@
Von [CREATOR]
</string>
<string name="CreatorAndOwner">
- von [CREATOR]
+ Von [CREATOR]
Besitzer [OWNER]
</string>
<string name="Price">
@@ -23,23 +23,23 @@ Besitzer [OWNER]
<string name="Sit">
Sitzen
</string>
- <text name="object_name" value="Wirklich langen Objektnamen als Test eingeben"/>
+ <text name="object_name" value="Test für ein Objektname der sehr lange ist und über zwei Zeilen geht."/>
<text name="object_creator">
von secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
Besitzer secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
</text>
<text name="price_text">
- 300.000 L$
+ 30.000 L$
</text>
<text name="object_description">
- Dies ist eine wirklich lange Beschreibung für ein Objekt, mindestens 80 Zeichen lang oder jetzt schon 120 Zeichen. Niemand weiß es genau.
+ Dies ist eine wirklich lange Beschreibung für ein Objekt, mindestens 80 Zeichen lang oder jetzt schon mindestens 120 Zeichen lang und länger als der englische Originaltext. Niemand weiß es genau.
</text>
<text name="object_media_url">
http://www.superdupertest.com
</text>
<button label="Kaufen" name="buy_btn"/>
- <button label="Zahlen" name="pay_btn"/>
- <button label="Kopie nehmen" name="take_free_copy_btn"/>
+ <button label="Bezahlen" name="pay_btn"/>
+ <button label="Kopie nehmen" name="take_free_copy_btn" width="100"/>
<button label="Berühren" name="touch_btn"/>
<button label="Sitzen" name="sit_btn"/>
<button label="Öffnen" name="open_btn"/>
diff --git a/indra/newview/skins/default/xui/de/language_settings.xml b/indra/newview/skins/default/xui/de/language_settings.xml
index 71418d446a..3e357007ff 100644
--- a/indra/newview/skins/default/xui/de/language_settings.xml
+++ b/indra/newview/skins/default/xui/de/language_settings.xml
@@ -3,9 +3,9 @@
<strings>
<!-- Locale Information -->
- <string name="MicrosoftLocale">english</string>
- <string name="DarwinLocale">C</string>
- <string name="LinuxLocale">C</string>
+ <string name="MicrosoftLocale">german</string>
+ <string name="DarwinLocale">de_DE.UTF-8</string>
+ <string name="LinuxLocale">de_DE.UTF-8</string>
<!--
datetimeToCodes["wkday"] = "%a"; // Thu
diff --git a/indra/newview/skins/default/xui/de/menu_attachment_other.xml b/indra/newview/skins/default/xui/de/menu_attachment_other.xml
index 33cff066a2..237c92f7d2 100644
--- a/indra/newview/skins/default/xui/de/menu_attachment_other.xml
+++ b/indra/newview/skins/default/xui/de/menu_attachment_other.xml
@@ -10,8 +10,8 @@
<menu_item_call label="Melden" name="abuse"/>
<menu_item_call label="Einfrieren" name="Freeze..."/>
<menu_item_call label="Hinauswerfen" name="Eject..."/>
- <menu_item_call label="Debug" name="Debug..."/>
+ <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/>
<menu_item_call label="Hineinzoomen" name="Zoom In"/>
- <menu_item_call label="Zahlen" name="Pay..."/>
+ <menu_item_call label="Bezahlen" name="Pay..."/>
<menu_item_call label="Objektprofil" name="Object Inspect"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_attachment_self.xml b/indra/newview/skins/default/xui/de/menu_attachment_self.xml
index bc33b9b93d..3af69d2f31 100644
--- a/indra/newview/skins/default/xui/de/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/de/menu_attachment_self.xml
@@ -9,4 +9,5 @@
<menu_item_call label="Meine Freunde" name="Friends..."/>
<menu_item_call label="Meine Gruppen" name="Groups..."/>
<menu_item_call label="Mein Profil" name="Profile..."/>
+ <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_avatar_other.xml b/indra/newview/skins/default/xui/de/menu_avatar_other.xml
index 85db648119..8aee0be3d2 100644
--- a/indra/newview/skins/default/xui/de/menu_avatar_other.xml
+++ b/indra/newview/skins/default/xui/de/menu_avatar_other.xml
@@ -10,7 +10,7 @@
<menu_item_call label="Melden" name="abuse"/>
<menu_item_call label="Einfrieren" name="Freeze..."/>
<menu_item_call label="Hinauswerfen" name="Eject..."/>
- <menu_item_call label="Debug" name="Debug..."/>
+ <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/>
<menu_item_call label="Hineinzoomen" name="Zoom In"/>
- <menu_item_call label="Zahlen" name="Pay..."/>
+ <menu_item_call label="Bezahlen" name="Pay..."/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_avatar_self.xml b/indra/newview/skins/default/xui/de/menu_avatar_self.xml
index 5f9856a9cb..d310d10ea5 100644
--- a/indra/newview/skins/default/xui/de/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/de/menu_avatar_self.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Self Pie">
<menu_item_call label="Aufstehen" name="Stand Up"/>
- <context_menu label="Ausziehen &gt;" name="Take Off &gt;">
- <context_menu label="Kleidung &gt;" name="Clothes &gt;">
+ <context_menu label="Ausziehen â–¶" name="Take Off &gt;">
+ <context_menu label="Kleidung â–¶" name="Clothes &gt;">
<menu_item_call label="Hemd" name="Shirt"/>
<menu_item_call label="Hose" name="Pants"/>
<menu_item_call label="Rock" name="Skirt"/>
@@ -16,12 +16,13 @@
<menu_item_call label="Alpha" name="Self Alpha"/>
<menu_item_call label="Alle Kleider" name="All Clothes"/>
</context_menu>
- <context_menu label="HUD &gt;" name="Object Detach HUD"/>
- <context_menu label="Abnehmen &gt;" name="Object Detach"/>
+ <context_menu label="HUD â–¶" name="Object Detach HUD"/>
+ <context_menu label="Abnehmen â–¶" name="Object Detach"/>
<menu_item_call label="Alles abnehmen" name="Detach All"/>
</context_menu>
<menu_item_call label="Mein Aussehen" name="Appearance..."/>
<menu_item_call label="Meine Freunde" name="Friends..."/>
<menu_item_call label="Meine Gruppen" name="Groups..."/>
<menu_item_call label="Mein Profil" name="Profile..."/>
+ <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_cof_attachment.xml b/indra/newview/skins/default/xui/de/menu_cof_attachment.xml
new file mode 100644
index 0000000000..05d3dfca9d
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_cof_attachment.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Attachment">
+ <menu_item_call label="Abnehmen" name="detach"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_cof_body_part.xml b/indra/newview/skins/default/xui/de/menu_cof_body_part.xml
new file mode 100644
index 0000000000..07960a525c
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_cof_body_part.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Body">
+ <menu_item_call label="Ersetzen" name="replace"/>
+ <menu_item_call label="Bearbeiten" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_cof_clothing.xml b/indra/newview/skins/default/xui/de/menu_cof_clothing.xml
new file mode 100644
index 0000000000..5cf31791ba
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_cof_clothing.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Clothing">
+ <menu_item_call label="Ausziehen" name="take_off"/>
+ <menu_item_call label="Eine Kategorie nach oben" name="move_up"/>
+ <menu_item_call label="Eine Kategorie nach unten" name="move_down"/>
+ <menu_item_call label="Bearbeiten" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_cof_gear.xml b/indra/newview/skins/default/xui/de/menu_cof_gear.xml
new file mode 100644
index 0000000000..54b218d22f
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_cof_gear.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Gear COF">
+ <menu label="Neue Kleider" name="COF.Gear.New_Clothes"/>
+ <menu label="Neue Körperteile" name="COF.Geear.New_Body_Parts"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_edit.xml b/indra/newview/skins/default/xui/de/menu_edit.xml
new file mode 100644
index 0000000000..37f68d68d5
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_edit.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu label="Bearbeiten" name="Edit">
+ <menu_item_call label="Rückgängig" name="Undo"/>
+ <menu_item_call label="Wiederherstellen" name="Redo"/>
+ <menu_item_call label="Ausschneiden" name="Cut"/>
+ <menu_item_call label="Kopieren" name="Copy"/>
+ <menu_item_call label="Einfügen" name="Paste"/>
+ <menu_item_call label="Löschen" name="Delete"/>
+ <menu_item_call label="Duplizieren" name="Duplicate"/>
+ <menu_item_call label="Alle auswählen" name="Select All"/>
+ <menu_item_call label="Auswahl aufheben" name="Deselect"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_hide_navbar.xml b/indra/newview/skins/default/xui/de/menu_hide_navbar.xml
index 32a6823b35..9acf96dc6d 100644
--- a/indra/newview/skins/default/xui/de/menu_hide_navbar.xml
+++ b/indra/newview/skins/default/xui/de/menu_hide_navbar.xml
@@ -2,4 +2,5 @@
<menu name="hide_navbar_menu">
<menu_item_check label="Navigationsleiste anzeigen" name="ShowNavbarNavigationPanel"/>
<menu_item_check label="Favoritenleiste anzeigen" name="ShowNavbarFavoritesPanel"/>
+ <menu_item_check label="Mini-Standortleiste anzeigen" name="ShowMiniLocationPanel"/>
</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml
index 9b6a6b2c4a..edad34a1d5 100644
--- a/indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/de/menu_inspect_avatar_gear.xml
@@ -11,8 +11,9 @@
<menu_item_call label="Melden" name="report"/>
<menu_item_call label="Einfrieren" name="freeze"/>
<menu_item_call label="Hinauswerfen" name="eject"/>
- <menu_item_call label="Debug" name="debug"/>
+ <menu_item_call label="Fehler in Texturen beseitigen" name="debug"/>
<menu_item_call label="Auf Karte anzeigen" name="find_on_map"/>
<menu_item_call label="Hineinzoomen" name="zoom_in"/>
- <menu_item_call label="Zahlen" name="pay"/>
+ <menu_item_call label="Bezahlen" name="pay"/>
+ <menu_item_call label="Teilen" name="share"/>
</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/de/menu_inspect_object_gear.xml
index 5efee8617b..634ef0b198 100644
--- a/indra/newview/skins/default/xui/de/menu_inspect_object_gear.xml
+++ b/indra/newview/skins/default/xui/de/menu_inspect_object_gear.xml
@@ -2,7 +2,7 @@
<menu name="Gear Menu">
<menu_item_call label="Berühren" name="touch"/>
<menu_item_call label="Sitzen" name="sit"/>
- <menu_item_call label="Zahlen" name="pay"/>
+ <menu_item_call label="Bezahlen" name="pay"/>
<menu_item_call label="Kaufen" name="buy"/>
<menu_item_call label="Nehmen" name="take"/>
<menu_item_call label="Kopie nehmen" name="take_copy"/>
diff --git a/indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml
index 383ee7831e..a74c41bb0c 100644
--- a/indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/de/menu_inspect_self_gear.xml
@@ -5,4 +5,5 @@
<menu_item_call label="Mein Profil" name="my_profile"/>
<menu_item_call label="Meine Freunde" name="my_friends"/>
<menu_item_call label="Meine Gruppen" name="my_groups"/>
+ <menu_item_call label="Fehler in Texturen beseitigen" name="Debug..."/>
</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_inv_offer_chiclet.xml b/indra/newview/skins/default/xui/de/menu_inv_offer_chiclet.xml
new file mode 100644
index 0000000000..71cff7136b
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_inv_offer_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="InvOfferChiclet Menu">
+ <menu_item_call label="Schließen" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_inventory.xml b/indra/newview/skins/default/xui/de/menu_inventory.xml
index 77c012d045..f6139a0ea0 100644
--- a/indra/newview/skins/default/xui/de/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/de/menu_inventory.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
+ <menu_item_call label="Teilen" name="Share"/>
<menu_item_call label="Kaufen" name="Task Buy"/>
<menu_item_call label="Öffnen" name="Task Open"/>
- <menu_item_call label="Wiedergeben/Abspielen" name="Task Play"/>
+ <menu_item_call label="Abspielen" name="Task Play"/>
<menu_item_call label="Eigenschaften" name="Task Properties"/>
<menu_item_call label="Umbenennen" name="Task Rename"/>
<menu_item_call label="Löschen" name="Task Remove"/>
@@ -49,9 +50,9 @@
<menu_item_call label="Aktuelles Outfit ersetzen" name="Replace Outfit"/>
<menu_item_call label="Zum aktuellen Outfit hinzufügen" name="Add To Outfit"/>
<menu_item_call label="Vom aktuellen Outfit entfernen" name="Remove From Outfit"/>
+ <menu_item_call label="Original suchen" name="Find Original"/>
<menu_item_call label="Objekt löschen" name="Purge Item"/>
<menu_item_call label="Objekt wiederherstellen" name="Restore Item"/>
- <menu_item_call label="Original suchen" name="Find Original"/>
<menu_item_call label="Öffnen" name="Open"/>
<menu_item_call label="Eigenschaften" name="Properties"/>
<menu_item_call label="Umbenennen" name="Rename"/>
@@ -65,8 +66,8 @@
<menu_item_call label="Konferenz-Chat starten" name="Conference Chat Folder"/>
<menu_item_call label="Wiedergeben/Abspielen" name="Sound Play"/>
<menu_item_call label="Landmarken-Info" name="About Landmark"/>
- <menu_item_call label="In Welt abspielen" name="Animation Play"/>
- <menu_item_call label="Lokal wiedergeben" name="Animation Audition"/>
+ <menu_item_call label="Inworld abspielen" name="Animation Play"/>
+ <menu_item_call label="Lokal abspielen" name="Animation Audition"/>
<menu_item_call label="Instant Message senden" name="Send Instant Message"/>
<menu_item_call label="Teleport anbieten..." name="Offer Teleport..."/>
<menu_item_call label="Konferenz-Chat starten" name="Conference Chat"/>
@@ -79,6 +80,7 @@
<menu label="An HUD hängen" name="Attach To HUD"/>
<menu_item_call label="Bearbeiten" name="Wearable Edit"/>
<menu_item_call label="Anziehen" name="Wearable Wear"/>
+ <menu_item_call label="Hinzufügen" name="Wearable Add"/>
<menu_item_call label="Ausziehen" name="Take Off"/>
<menu_item_call label="--keine Optionen--" name="--no options--"/>
</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_inventory_add.xml b/indra/newview/skins/default/xui/de/menu_inventory_add.xml
index 448b1d80bf..531edc02f1 100644
--- a/indra/newview/skins/default/xui/de/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/de/menu_inventory_add.xml
@@ -20,7 +20,7 @@
<menu_item_call label="Neue Handschuhe" name="New Gloves"/>
<menu_item_call label="Neues Unterhemd" name="New Undershirt"/>
<menu_item_call label="Neue Unterhose" name="New Underpants"/>
- <menu_item_call label="Alpha: Neu" name="New Alpha"/>
+ <menu_item_call label="Neues Alpha" name="New Alpha"/>
<menu_item_call label="Neue Tätowierung" name="New Tattoo"/>
</menu>
<menu label="Neue Körperteile" name="New Body Parts">
diff --git a/indra/newview/skins/default/xui/de/menu_land.xml b/indra/newview/skins/default/xui/de/menu_land.xml
index 9b1e6727b7..de679da3d8 100644
--- a/indra/newview/skins/default/xui/de/menu_land.xml
+++ b/indra/newview/skins/default/xui/de/menu_land.xml
@@ -5,5 +5,5 @@
<menu_item_call label="Dieses Land kaufen" name="Land Buy"/>
<menu_item_call label="Pass kaufen" name="Land Buy Pass"/>
<menu_item_call label="Bauen" name="Create"/>
- <menu_item_call label="Terrain bearbeiten" name="Edit Terrain"/>
+ <menu_item_call label="Land bearbeiten" name="Edit Terrain"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_login.xml b/indra/newview/skins/default/xui/de/menu_login.xml
index fffa056cac..70d31f93de 100644
--- a/indra/newview/skins/default/xui/de/menu_login.xml
+++ b/indra/newview/skins/default/xui/de/menu_login.xml
@@ -8,18 +8,8 @@
<menu_item_call label="[SECOND_LIFE]-Hilfe" name="Second Life Help"/>
<menu_item_call label="INFO ÜBER [APP_NAME]" name="About Second Life"/>
</menu>
+ <menu_item_check label="Debug-Menü anzeigen" name="Show Debug Menu"/>
<menu label="Debug" name="Debug">
- <menu label="Bearbeiten" name="Edit">
- <menu_item_call label="Rückgängig" name="Undo"/>
- <menu_item_call label="Wiederherstellen" name="Redo"/>
- <menu_item_call label="Ausschneiden" name="Cut"/>
- <menu_item_call label="Kopieren" name="Copy"/>
- <menu_item_call label="Einfügen" name="Paste"/>
- <menu_item_call label="Löschen" name="Delete"/>
- <menu_item_call label="Duplizieren" name="Duplicate"/>
- <menu_item_call label="Alle auswählen" name="Select All"/>
- <menu_item_call label="Auswahl aufheben" name="Deselect"/>
- </menu>
<menu_item_call label="Debug-Einstellungen anzeigen" name="Debug Settings"/>
<menu_item_call label="UI/Farb-Einstellungen" name="UI/Color Settings"/>
<menu_item_call label="XUI-Editor" name="UI Preview Tool"/>
@@ -28,5 +18,7 @@
<menu_item_call label="Servicebedingungen anzeigen" name="TOS"/>
<menu_item_call label="Wichtige Meldung anzeigen" name="Critical"/>
<menu_item_call label="Web-Browser-Test" name="Web Browser Test"/>
+ <menu_item_check label="Grid-Auswahl anzeigen" name="Show Grid Picker"/>
+ <menu_item_call label="Benachrichtigungs-Konsole anzeigen" name="Show Notifications Console"/>
</menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/de/menu_mini_map.xml b/indra/newview/skins/default/xui/de/menu_mini_map.xml
index a3ebfb3b10..7139b98965 100644
--- a/indra/newview/skins/default/xui/de/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/de/menu_mini_map.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="popup">
+<menu name="Popup">
<menu_item_call label="Zoom Nah" name="Zoom Close"/>
<menu_item_call label="Zoom Mittel" name="Zoom Medium"/>
<menu_item_call label="Zoom Weit" name="Zoom Far"/>
diff --git a/indra/newview/skins/default/xui/de/menu_object.xml b/indra/newview/skins/default/xui/de/menu_object.xml
index 6f8d85ecb8..8bb7b66482 100644
--- a/indra/newview/skins/default/xui/de/menu_object.xml
+++ b/indra/newview/skins/default/xui/de/menu_object.xml
@@ -5,21 +5,23 @@
<menu_item_call label="Bauen" name="Build"/>
<menu_item_call label="Öffnen" name="Open"/>
<menu_item_call label="Hier sitzen" name="Object Sit"/>
+ <menu_item_call label="Aufstehen" name="Object Stand Up"/>
<menu_item_call label="Objektprofil" name="Object Inspect"/>
<menu_item_call label="Hineinzoomen" name="Zoom In"/>
- <context_menu label="Anziehen &gt;" name="Put On">
+ <context_menu label="Anziehen â–¶" name="Put On">
<menu_item_call label="Anziehen" name="Wear"/>
- <context_menu label="Anhängen &gt;" name="Object Attach"/>
- <context_menu label="HUD anhängen &gt;" name="Object Attach HUD"/>
+ <context_menu label="Anhängen ▶" name="Object Attach"/>
+ <context_menu label="HUD anhängen ▶" name="Object Attach HUD"/>
</context_menu>
- <context_menu label="Entfernen &gt;" name="Remove">
- <menu_item_call label="Nehmen" name="Pie Object Take"/>
+ <context_menu label="Entfernen â–¶" name="Remove">
<menu_item_call label="Missbrauch melden" name="Report Abuse..."/>
<menu_item_call label="Ignorieren" name="Object Mute"/>
<menu_item_call label="Zurückgeben" name="Return..."/>
<menu_item_call label="Löschen" name="Delete"/>
</context_menu>
+ <menu_item_call label="Kaufen" name="Pie Object Bye"/>
+ <menu_item_call label="Nehmen" name="Pie Object Take"/>
<menu_item_call label="Kopie nehmen" name="Take Copy"/>
- <menu_item_call label="Zahlen" name="Pay..."/>
+ <menu_item_call label="Bezahlen" name="Pay..."/>
<menu_item_call label="Kaufen" name="Buy..."/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_outfit_gear.xml b/indra/newview/skins/default/xui/de/menu_outfit_gear.xml
new file mode 100644
index 0000000000..411dfc42c0
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_outfit_gear.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Gear Outfit">
+ <menu_item_call label="Anziehen - Aktuelles Outfit ersetzen" name="wear"/>
+ <menu_item_call label="Ausziehen - Aus aktuellem Outfit entfernen" name="take_off"/>
+ <menu label="Neue Kleider" name="New Clothes">
+ <menu_item_call label="Neues Hemd" name="New Shirt"/>
+ <menu_item_call label="Neue Hose" name="New Pants"/>
+ <menu_item_call label="Neue Schuhe" name="New Shoes"/>
+ <menu_item_call label="Neue Socken" name="New Socks"/>
+ <menu_item_call label="Neue Jacke" name="New Jacket"/>
+ <menu_item_call label="Neuer Rock" name="New Skirt"/>
+ <menu_item_call label="Neue Handschuhe" name="New Gloves"/>
+ <menu_item_call label="Neues Unterhemd" name="New Undershirt"/>
+ <menu_item_call label="Neue Unterhose" name="New Underpants"/>
+ <menu_item_call label="Neues Alpha" name="New Alpha"/>
+ <menu_item_call label="Neue Tätowierung" name="New Tattoo"/>
+ </menu>
+ <menu label="Neue Körperteile" name="New Body Parts">
+ <menu_item_call label="Neue Form" name="New Shape"/>
+ <menu_item_call label="Neue Haut" name="New Skin"/>
+ <menu_item_call label="Neues Haar" name="New Hair"/>
+ <menu_item_call label="Neue Augen" name="New Eyes"/>
+ </menu>
+ <menu_item_call label="Outfit neu benennen" name="rename"/>
+ <menu_item_call label="Outfit löschen" name="delete_outfit"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_outfit_tab.xml b/indra/newview/skins/default/xui/de/menu_outfit_tab.xml
new file mode 100644
index 0000000000..605dee9b33
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_outfit_tab.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit">
+ <menu_item_call label="Anziehen - Aktuelles Outfit ersetzen" name="wear_replace"/>
+ <menu_item_call label="Anziehen - Aktuelles Outfit hinzufügen" name="wear_add"/>
+ <menu_item_call label="Ausziehen - Aus aktuellem Outfit entfernen" name="take_off"/>
+ <menu_item_call label="Outfit bearbeiten" name="edit"/>
+ <menu_item_call label="Umbenennen" name="rename"/>
+ <menu_item_call label="Outfit löschen" name="delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_participant_list.xml b/indra/newview/skins/default/xui/de/menu_participant_list.xml
index 15c957cee3..ca0d9f8c2d 100644
--- a/indra/newview/skins/default/xui/de/menu_participant_list.xml
+++ b/indra/newview/skins/default/xui/de/menu_participant_list.xml
@@ -7,7 +7,8 @@
<menu_item_call label="IM" name="IM"/>
<menu_item_call label="Anrufen" name="Call"/>
<menu_item_call label="Teilen" name="Share"/>
- <menu_item_call label="Zahlen" name="Pay"/>
+ <menu_item_call label="Bezahlen" name="Pay"/>
+ <menu_item_check label="Symbole für Personen anzeigen" name="View Icons"/>
<menu_item_check label="Voice ignorieren" name="Block/Unblock"/>
<menu_item_check label="Text ignorieren" name="MuteText"/>
<context_menu label="Moderator-Optionen &gt;" name="Moderator Options">
diff --git a/indra/newview/skins/default/xui/de/menu_people_groups.xml b/indra/newview/skins/default/xui/de/menu_people_groups.xml
index 87f43d27e6..76225ba241 100644
--- a/indra/newview/skins/default/xui/de/menu_people_groups.xml
+++ b/indra/newview/skins/default/xui/de/menu_people_groups.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_group_plus">
- <menu_item_call label="Ansichts-Info" name="View Info"/>
+ <menu_item_call label="Info anzeigen" name="View Info"/>
<menu_item_call label="Chat" name="Chat"/>
<menu_item_call label="Anrufen" name="Call"/>
<menu_item_call label="Aktivieren" name="Activate"/>
diff --git a/indra/newview/skins/default/xui/de/menu_people_nearby.xml b/indra/newview/skins/default/xui/de/menu_people_nearby.xml
index 9fa5db5fa3..1db964357f 100644
--- a/indra/newview/skins/default/xui/de/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/de/menu_people_nearby.xml
@@ -2,10 +2,12 @@
<context_menu name="Avatar Context Menu">
<menu_item_call label="Profil anzeigen" name="View Profile"/>
<menu_item_call label="Freund hinzufügen" name="Add Friend"/>
+ <menu_item_call label="Freund entfernen" name="Remove Friend"/>
<menu_item_call label="IM" name="IM"/>
<menu_item_call label="Anrufen" name="Call"/>
+ <menu_item_call label="Karte" name="Map"/>
<menu_item_call label="Teilen" name="Share"/>
- <menu_item_call label="Zahlen" name="Pay"/>
+ <menu_item_call label="Bezahlen" name="Pay"/>
<menu_item_check label="Ignorieren/Freischalten" name="Block/Unblock"/>
<menu_item_call label="Teleport anbieten" name="teleport"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/de/menu_people_nearby_multiselect.xml
index d572a8ca1c..d978d9e40c 100644
--- a/indra/newview/skins/default/xui/de/menu_people_nearby_multiselect.xml
+++ b/indra/newview/skins/default/xui/de/menu_people_nearby_multiselect.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Multi-Selected People Context Menu">
<menu_item_call label="Freunde hinzufügen" name="Add Friends"/>
+ <menu_item_call label="Freunde entfernen" name="Remove Friend"/>
<menu_item_call label="IM" name="IM"/>
<menu_item_call label="Anrufen" name="Call"/>
<menu_item_call label="Teilen" name="Share"/>
- <menu_item_call label="Zahlen" name="Pay"/>
+ <menu_item_call label="Bezahlen" name="Pay"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/de/menu_people_nearby_view_sort.xml
index d0881ddd05..0f252ab46d 100644
--- a/indra/newview/skins/default/xui/de/menu_people_nearby_view_sort.xml
+++ b/indra/newview/skins/default/xui/de/menu_people_nearby_view_sort.xml
@@ -3,6 +3,6 @@
<menu_item_check label="Nach letzten Sprechern sortieren" name="sort_by_recent_speakers"/>
<menu_item_check label="Nach Name sortieren" name="sort_name"/>
<menu_item_check label="Nach Entfernung sortieren" name="sort_distance"/>
- <menu_item_check label="Profilbilder anzeigen" name="view_icons"/>
- <menu_item_call label="Zeige geblockte Einwohner &amp; Objekte" name="show_blocked_list"/>
+ <menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/>
+ <menu_item_call label="Ignorierte Einwohner &amp; Objekte anzeigen" name="show_blocked_list"/>
</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/de/menu_people_recent_view_sort.xml
index 837983b716..1ef020f5e1 100644
--- a/indra/newview/skins/default/xui/de/menu_people_recent_view_sort.xml
+++ b/indra/newview/skins/default/xui/de/menu_people_recent_view_sort.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_group_plus">
- <menu_item_check label="Nach aktuellesten Objekten sortieren" name="sort_most"/>
+ <menu_item_check label="Nach aktuellesten Sprechern sortieren" name="sort_most"/>
<menu_item_check label="Nach Name sortieren" name="sort_name"/>
<menu_item_check label="Symbole für Personen anzeigen" name="view_icons"/>
<menu_item_call label="Ignorierte Einwohner &amp; Objekte anzeigen" name="show_blocked_list"/>
diff --git a/indra/newview/skins/default/xui/de/menu_profile_overflow.xml b/indra/newview/skins/default/xui/de/menu_profile_overflow.xml
index f5cedf5464..9f3fcbca1d 100644
--- a/indra/newview/skins/default/xui/de/menu_profile_overflow.xml
+++ b/indra/newview/skins/default/xui/de/menu_profile_overflow.xml
@@ -1,7 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="profile_overflow_menu">
- <menu_item_call label="Zahlen" name="pay"/>
+ <menu_item_call label="Karte" name="show_on_map"/>
+ <menu_item_call label="Bezahlen" name="pay"/>
<menu_item_call label="Teilen" name="share"/>
+ <menu_item_call label="Ignorieren" name="block"/>
+ <menu_item_call label="Freischalten" name="unblock"/>
<menu_item_call label="Hinauswerfen" name="kick"/>
<menu_item_call label="Einfrieren" name="freeze"/>
<menu_item_call label="Auftauen" name="unfreeze"/>
diff --git a/indra/newview/skins/default/xui/de/menu_save_outfit.xml b/indra/newview/skins/default/xui/de/menu_save_outfit.xml
new file mode 100644
index 0000000000..986c78b318
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_save_outfit.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="save_outfit_menu">
+ <menu_item_call label="Speichern" name="save_outfit"/>
+ <menu_item_call label="Speichern unter" name="save_as_new_outfit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/de/menu_script_chiclet.xml b/indra/newview/skins/default/xui/de/menu_script_chiclet.xml
new file mode 100644
index 0000000000..3256aa1a87
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_script_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="ScriptChiclet Menu">
+ <menu_item_call label="Schließen" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/de/menu_viewer.xml b/indra/newview/skins/default/xui/de/menu_viewer.xml
index c6bbea285f..38ef1b0421 100644
--- a/indra/newview/skins/default/xui/de/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/de/menu_viewer.xml
@@ -7,10 +7,10 @@
</menu_item_call>
<menu_item_call label="L$ kaufen" name="Buy and Sell L$"/>
<menu_item_call label="Mein Profil" name="Profile"/>
- <menu_item_call label="Mein Aussehen" name="Appearance"/>
<menu_item_check label="Mein Inventar" name="Inventory"/>
- <menu_item_call label="Inventar auf Seitenleiste anzeigen" name="ShowSidetrayInventory"/>
- <menu_item_call label="Meine Gesten" name="Gestures"/>
+ <menu_item_check label="Mein Inventar" name="ShowSidetrayInventory"/>
+ <menu_item_check label="Meine Gesten" name="Gestures"/>
+ <menu_item_check label="Meine Stimme" name="ShowVoice"/>
<menu label="Mein Status" name="Status">
<menu_item_call label="Abwesend" name="Set Away"/>
<menu_item_call label="Beschäftigt" name="Set Busy"/>
@@ -22,24 +22,30 @@
<menu label="Unterhalten" name="Communicate">
<menu_item_call label="Meine Freunde" name="My Friends"/>
<menu_item_call label="Meine Gruppen" name="My Groups"/>
- <menu_item_check label="Lokaler Chat" name="Nearby Chat"/>
+ <menu_item_check label="Chat in der Nähe" name="Nearby Chat"/>
<menu_item_call label="Leute in der Nähe" name="Active Speakers"/>
- <menu_item_check label="Medien in der Nähe" name="Nearby Media"/>
</menu>
<menu label="Welt" name="World">
<menu_item_check label="Minikarte" name="Mini-Map"/>
- <menu_item_check label="Weltkarte" name="World Map"/>
+ <menu_item_check label="Karte" name="World Map"/>
<menu_item_call label="Foto" name="Take Snapshot"/>
<menu_item_call label="Landmarke für diesen Ort setzen" name="Create Landmark Here"/>
<menu label="Ortsprofil" name="Land">
+ <menu_item_call label="Ortsprofil" name="Place Profile"/>
<menu_item_call label="Land-Info" name="About Land"/>
- <menu_item_call label="Region/Grundstück" name="Region/Estate"/>
+ <menu_item_call label="Region/Grundbesitz" name="Region/Estate"/>
</menu>
<menu_item_call label="Dieses Land kaufen" name="Buy Land"/>
<menu_item_call label="Mein Land" name="My Land"/>
<menu label="Anzeigen" name="LandShow">
<menu_item_check label="Bewegungssteuerung" name="Movement Controls"/>
<menu_item_check label="Ansichtsteuerung" name="Camera Controls"/>
+ <menu_item_check label="Bannlinien" name="Ban Lines"/>
+ <menu_item_check label="Strahlen" name="beacons"/>
+ <menu_item_check label="Grundstücksgrenzen" name="Property Lines"/>
+ <menu_item_check label="Landeigentümer" name="Land Owners"/>
+ <menu_item_check label="Koordinaten" name="Coordinates"/>
+ <menu_item_check label="Parzelleneigenschaften" name="Parcel Properties"/>
</menu>
<menu_item_call label="Teleport nach Hause" name="Teleport Home"/>
<menu_item_call label="Hier als Zuhause wählen" name="Set Home to Here"/>
@@ -48,36 +54,33 @@
<menu_item_call label="Mittag" name="Noon"/>
<menu_item_call label="Sonnenuntergang" name="Sunset"/>
<menu_item_call label="Mitternacht" name="Midnight"/>
- <menu_item_call label="Grundstückszeit" name="Revert to Region Default"/>
+ <menu_item_call label="Grundbesitzzeit" name="Revert to Region Default"/>
<menu_item_call label="Umwelt-Editor" name="Environment Editor"/>
</menu>
</menu>
<menu label="Bauen" name="BuildTools">
<menu_item_check label="Bauen" name="Show Build Tools"/>
<menu label="Bauwerkzeug auswählen" name="Select Tool">
- <menu_item_call label="Fokus-Werkzeug" name="Focus"/>
- <menu_item_call label="Werkzeug „Bewegen“" name="Move"/>
+ <menu_item_call label="Fokus" name="Focus"/>
+ <menu_item_call label="Verschieben" name="Move"/>
<menu_item_call label="Bearbeiten" name="Edit"/>
- <menu_item_call label="Werkzeug „Erstellen&quot;" name="Create"/>
- <menu_item_call label="Land-Werkzeug" name="Land"/>
- </menu>
- <menu label="Bearbeiten" name="Edit">
- <menu_item_call label="Rückgängig" name="Undo"/>
- <menu_item_call label="Wiederherstellen" name="Redo"/>
- <menu_item_call label="Ausschneiden" name="Cut"/>
- <menu_item_call label="Kopieren" name="Copy"/>
- <menu_item_call label="Einfügen" name="Paste"/>
- <menu_item_call label="Löschen" name="Delete"/>
- <menu_item_call label="Duplizieren" name="Duplicate"/>
- <menu_item_call label="Alle auswählen" name="Select All"/>
- <menu_item_call label="Auswahl aufheben" name="Deselect"/>
+ <menu_item_call label="Erstellen" name="Create"/>
+ <menu_item_call label="Land" name="Land"/>
</menu>
<menu_item_call label="Verknüpfung" name="Link"/>
<menu_item_call label="Verknüpfung auflösen" name="Unlink"/>
+ <menu_item_check label="Verknüpfte Teile bearbeiten" name="Edit Linked Parts"/>
+ <menu label="Verknüpfte Teile auswählen" name="Select Linked Parts">
+ <menu_item_call label="Nächstes Teil auswählen" name="Select Next Part"/>
+ <menu_item_call label="Vorheriges Teil auswählen" name="Select Previous Part"/>
+ <menu_item_call label="Nächsten Teil mit einsschließen" name="Include Next Part"/>
+ <menu_item_call label="Vorherige Teile mit einschließen" name="Include Previous Part"/>
+ </menu>
<menu_item_call label="Fokus auf Auswahl" name="Focus on Selection"/>
<menu_item_call label="Auf Auswahl zoomen" name="Zoom to Selection"/>
<menu label="Objekt" name="Object">
- <menu_item_call label="Kaufen" name="Menu Object Take"/>
+ <menu_item_call label="Kaufen" name="Menu Object Buy"/>
+ <menu_item_call label="Nehmen" name="Menu Object Take"/>
<menu_item_call label="Kopie nehmen" name="Take Copy"/>
<menu_item_call label="Objekt wieder in meinem Inventar speichern" name="Save Object Back to My Inventory"/>
<menu_item_call label="Wieder in Objektinhalt speichern" name="Save Object Back to Object Contents"/>
@@ -90,31 +93,24 @@
<menu_item_call label="Skripts auf nicht ausführen einstellen" name="Set Scripts to Not Running"/>
</menu>
<menu label="Optionen" name="Options">
- <menu_item_check label="Verknüpfte Teile bearbeiten" name="Edit Linked Parts"/>
<menu_item_call label="Hochlade-Berechtigungen (Standard) festlegen" name="perm prefs"/>
<menu_item_check label="Erweiterte Berechtigungen anzeigen" name="DebugPermissions"/>
- <menu label="Auswahl" name="Selection">
- <menu_item_check label="Nur meine Objekte auswählen" name="Select Only My Objects"/>
- <menu_item_check label="Nur bewegliche Objekte auswählen" name="Select Only Movable Objects"/>
- <menu_item_check label="Nach Umgebung auswählen" name="Select By Surrounding"/>
- </menu>
- <menu label="Anzeigen" name="Show">
- <menu_item_check label="Ausgeblendete Auswahl anzeigen" name="Show Hidden Selection"/>
- <menu_item_check label="Lichtradius für Auswahl anzeigen" name="Show Light Radius for Selection"/>
- <menu_item_check label="Auswahlstrahl anzeigen" name="Show Selection Beam"/>
- </menu>
- <menu label="Raster" name="Grid">
- <menu_item_check label="An Raster ausrichten" name="Snap to Grid"/>
- <menu_item_call label="Objekt-XY an Raster ausrichten" name="Snap Object XY to Grid"/>
- <menu_item_call label="Auswahl für Raster verwenden" name="Use Selection for Grid"/>
- <menu_item_call label="Rasteroptionen" name="Grid Options"/>
- </menu>
- </menu>
- <menu label="Verknüpfte Teile auswählen" name="Select Linked Parts">
- <menu_item_call label="Nächstes Teil auswählen" name="Select Next Part"/>
- <menu_item_call label="Vorheriges Teil auswählen" name="Select Previous Part"/>
- <menu_item_call label="Nächsten Teil mit einsschließen" name="Include Next Part"/>
- <menu_item_call label="Vorherige Teile mit einschließen" name="Include Previous Part"/>
+ <menu_item_check label="Nur meine Objekte auswählen" name="Select Only My Objects"/>
+ <menu_item_check label="Nur bewegliche Objekte auswählen" name="Select Only Movable Objects"/>
+ <menu_item_check label="Nach Umgebung auswählen" name="Select By Surrounding"/>
+ <menu_item_check label="Ausgeblendete Auswahl anzeigen" name="Show Hidden Selection"/>
+ <menu_item_check label="Lichtradius für Auswahl anzeigen" name="Show Light Radius for Selection"/>
+ <menu_item_check label="Auswahlstrahl anzeigen" name="Show Selection Beam"/>
+ <menu_item_check label="An Raster ausrichten" name="Snap to Grid"/>
+ <menu_item_call label="Objekt-XY an Raster ausrichten" name="Snap Object XY to Grid"/>
+ <menu_item_call label="Auswahl für Raster verwenden" name="Use Selection for Grid"/>
+ <menu_item_call label="Rasteroptionen" name="Grid Options"/>
+ </menu>
+ <menu label="Hochladen" name="Upload">
+ <menu_item_call label="Bild ([COST] L$)..." name="Upload Image"/>
+ <menu_item_call label="Sound ([COST] L$)..." name="Upload Sound"/>
+ <menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/>
+ <menu_item_call label="Mehrfach-Upload ([COST] L$ pro Datei)..." name="Bulk Upload"/>
</menu>
</menu>
<menu label="Hilfe" name="Help">
@@ -124,6 +120,7 @@
<menu_item_call label="INFO ÜBER [APP_NAME]" name="About Second Life"/>
</menu>
<menu label="Erweitert" name="Advanced">
+ <menu_item_check label="Menü „Erweitert“ anzeigen" name="Show Advanced Menu"/>
<menu_item_call label="Animation meines Avatars stoppen" name="Stop Animating My Avatar"/>
<menu_item_call label="Textur neu laden" name="Rebake Texture"/>
<menu_item_call label="UI-Größe auf Standard setzen" name="Set UI Size to Default"/>
@@ -145,7 +142,6 @@
<menu_item_check label="Durchsichtig hervorheben" name="Highlight Transparent"/>
<menu_item_check label="HUD-Anhänge anzeigen" name="Show HUD Attachments"/>
<menu_item_check label="Fadenkreuz für Mouselook anzeigen" name="ShowCrosshairs"/>
- <menu_item_check label="Land-Kurzinfos anzeigen" name="Land Tips"/>
</menu>
<menu label="Darstellungstypen" name="Rendering Types">
<menu_item_check label="Einfach" name="Simple"/>
@@ -162,7 +158,7 @@
<menu_item_check label="Partikel" name="Particles"/>
<menu_item_check label="Unebenheiten" name="Bump"/>
</menu>
- <menu label="Rederning-Eigenschaften" name="Rendering Features">
+ <menu label="Rendering-Eigenschaften" name="Rendering Features">
<menu_item_check label="UI" name="UI"/>
<menu_item_check label="Ausgewählt" name="Selected"/>
<menu_item_check label="Farblich hervorgehoben" name="Highlighted"/>
@@ -172,11 +168,11 @@
<menu_item_check label="FRInfo testen" name="Test FRInfo"/>
<menu_item_check label="Flexible Objekte" name="Flexible Objects"/>
</menu>
- <menu_item_check label="Mehrer Threads ausführen" name="Run Multiple Threads"/>
+ <menu_item_check label="Mehrere Threads ausführen" name="Run Multiple Threads"/>
<menu_item_call label="Gruppen-Cache löschen" name="ClearGroupCache"/>
<menu_item_check label="Weiche Mausbewegung" name="Mouse Smoothing"/>
- <menu_item_check label="IMs in lokalem Chat anzeigen" name="IMInChat"/>
<menu label="Tastaturkürzel" name="Shortcuts">
+ <menu_item_call label="Bild ([COST] L$)..." name="Upload Image"/>
<menu_item_check label="Suchen" name="Search"/>
<menu_item_call label="Tasten freigeben" name="Release Keys"/>
<menu_item_call label="UI-Größe auf Standard setzen" name="Set UI Size to Default"/>
@@ -199,7 +195,6 @@
<menu_item_call label="Hineinzoomen" name="Zoom In"/>
<menu_item_call label="Zoom-Standard" name="Zoom Default"/>
<menu_item_call label="Wegzoomen" name="Zoom Out"/>
- <menu_item_call label="Vollbild" name="Toggle Fullscreen"/>
</menu>
<menu_item_call label="Debug-Einstellungen anzeigen" name="Debug Settings"/>
<menu_item_check label="Menü „Entwickler“ anzeigen" name="Debug Mode"/>
@@ -219,6 +214,7 @@
<menu_item_check label="Kamera" name="Camera"/>
<menu_item_check label="Wind" name="Wind"/>
<menu_item_check label="FOV" name="FOV"/>
+ <menu_item_check label="Gütesiegel" name="Badge"/>
</menu>
<menu label="Info anzeigen" name="Display Info">
<menu_item_check label="Zeit anzeigen" name="Show Time"/>
@@ -384,7 +380,7 @@
<menu_item_call label="Temp-Asset-Daten ausgeben" name="Dump Temp Asset Data"/>
<menu_item_call label="Regions-Status speichern" name="Save Region State"/>
</menu>
- <menu_item_call label="Gott-Tools" name="God Tools"/>
+ <menu_item_call label="Gott-Werkzeuge" name="God Tools"/>
</menu>
<menu label="Admin" name="Deprecated">
<menu label="Objekt anhängen" name="Attach Object"/>
@@ -407,7 +403,7 @@
<menu_item_call label="Offizielles Linden-Blog" name="Official Linden Blog"/>
<menu_item_call label="Scripting-Portal" name="Scripting Portal"/>
<menu label="Fehlermeldungen" name="Bug Reporting">
- <menu_item_call label="Allgemeine Probleme-Tracker" name="Public Issue Tracker"/>
+ <menu_item_call label="Allgemeiner Probleme-Tracker" name="Public Issue Tracker"/>
<menu_item_call label="Hilfe zum Allgemeinen Probleme-Tracker" name="Publc Issue Tracker Help"/>
<menu_item_call label="Fehlermeldungs-1x1" name="Bug Reporing 101"/>
<menu_item_call label="Sicherheitsfragen" name="Security Issues"/>
diff --git a/indra/newview/skins/default/xui/de/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/de/menu_wearable_list_item.xml
new file mode 100644
index 0000000000..a4bf75a497
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/menu_wearable_list_item.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit Wearable Context Menu">
+ <menu_item_call label="Anziehen" name="wear"/>
+ <menu_item_call label="Hinzufügen" name="wear_add"/>
+ <menu_item_call label="Ausziehen / Abnehmen" name="take_off_or_detach"/>
+ <menu_item_call label="Abnehmen" name="detach"/>
+ <context_menu label="Anhängen an ▶" name="wearable_attach_to"/>
+ <context_menu label="An HUD hängen ▶" name="wearable_attach_to_hud"/>
+ <menu_item_call label="Ausziehen" name="take_off"/>
+ <menu_item_call label="Bearbeiten" name="edit"/>
+ <menu_item_call label="Objektprofil" name="object_profile"/>
+ <menu_item_call label="Original anzeigen" name="show_original"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/de/mime_types.xml b/indra/newview/skins/default/xui/de/mime_types.xml
index e01649e911..de93107e94 100644
--- a/indra/newview/skins/default/xui/de/mime_types.xml
+++ b/indra/newview/skins/default/xui/de/mime_types.xml
@@ -22,14 +22,6 @@
Video wiedergeben
</playtip>
</widgetset>
- <widgetset name="none">
- <label name="none_label">
- Keine Inhalte
- </label>
- <tooltip name="none_tooltip">
- Keine Medien gefunden
- </tooltip>
- </widgetset>
<widgetset name="image">
<label name="image_label">
Bild
diff --git a/indra/newview/skins/default/xui/de/notifications.xml b/indra/newview/skins/default/xui/de/notifications.xml
index d94bbd8564..408ece9690 100644
--- a/indra/newview/skins/default/xui/de/notifications.xml
+++ b/indra/newview/skins/default/xui/de/notifications.xml
@@ -11,18 +11,29 @@
</global>
<template name="okbutton">
<form>
- <button name="OK" text="$yestext"/>
+ <button name="OK_okbutton" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okignore">
+ <form>
+ <button name="OK_okignore" text="$yestext"/>
</form>
</template>
- <template name="okignore"/>
<template name="okcancelbuttons">
<form>
- <button name="Cancel" text="$notext"/>
+ <button name="OK_okcancelbuttons" text="$yestext"/>
+ <button name="Cancel_okcancelbuttons" text="$notext"/>
+ </form>
+ </template>
+ <template name="okcancelignore">
+ <form>
+ <button name="OK_okcancelignore" text="$yestext"/>
+ <button name="Cancel_okcancelignore" text="$notext"/>
</form>
</template>
- <template name="okcancelignore"/>
<template name="okhelpbuttons">
<form>
+ <button name="OK_okhelpbuttons" text="$yestext"/>
<button name="Help" text="$helptext"/>
</form>
</template>
@@ -30,6 +41,7 @@
<form>
<button name="Yes" text="$yestext"/>
<button name="No" text="$notext"/>
+ <button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
</form>
</template>
<notification functor="GenericAcknowledge" label="Unbekannte Meldung" name="MissingAlert">
@@ -93,8 +105,12 @@ Wählen Sie ein einzelnes Objekt aus und versuchen Sie es erneut.
Änderung an Kleidung/Körperteilen speichern?
<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Alles speichern"/>
</notification>
+ <notification name="FriendsAndGroupsOnly">
+ Leute, die nicht auf Ihrer Freundesliste stehen, werden nicht wissen, dass Sie deren Anrufe oder Sofortnachrichten ignoriert haben.
+ <usetemplate name="okbutton" yestext="Ja"/>
+ </notification>
<notification name="GrantModifyRights">
- Wenn Sie einem anderen Einwohner, das die Erlaubnis zum Bearbeiten erteilen, dann kann dieser JEDES Objekt, das Sie inworld besitzen, verändern, löschen oder nehmen. Seien Sie SEHR vorsichtig, wenn Sie diese Erlaubnis gewähren!
+ Wenn Sie einem anderen Einwohner die Erlaubnis zum Bearbeiten erteilen, dann kann dieser JEDES Objekt, das Sie inworld besitzen, verändern, löschen oder nehmen. Seien Sie SEHR vorsichtig, wenn Sie diese Erlaubnis gewähren!
Möchten Sie [FIRST_NAME] [LAST_NAME] die Erlaubnis zum Bearbeiten gewähren?
<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
</notification>
@@ -161,14 +177,16 @@ Der Rolle „[ROLE_NAME]“ diese Fähigkeit zuweisen?
Möchten Sie fortfahren?
<usetemplate ignoretext="Bestätigen, bevor Anhänge fallen gelassen werden" name="okcancelignore" notext="Nein" yestext="Ja"/>
</notification>
- <notification name="ClickUnimplemented">
- Leider ist diese Funktion noch nicht implementiert.
- </notification>
<notification name="JoinGroupCanAfford">
Der Beitritt zu dieser Gruppe kostet [COST] L$.
Fortfahren?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Beitreten"/>
</notification>
+ <notification name="JoinGroupNoCost">
+ Sie treten der Gruppe [NAME] bei.
+Fortfahren?
+ <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Beitreten"/>
+ </notification>
<notification name="JoinGroupCannotAfford">
Der Beitritt zu dieser Gruppe kostet [COST] L$.
Sie haben nicht genug L$, um dieser Gruppe beizutreten.
@@ -189,15 +207,15 @@ Bitte laden Sie innerhalb von 48 Stunden Mitglieder in Ihre Gruppe ein.
Wählen Sie eine bestimmte Person aus, wenn Sie für 0 L$ verkaufen.
</notification>
<notification name="ConfirmLandSaleChange">
- Die ausgewählten [LAND_SIZE] qm Land werden zum Verkauf freigegeben.
-Der Verkaufspreis beträgt [SALE_PRICE] L$ und wird automatisch für den Verkauf an [NAME] autorisiert.
+ Die ausgewählten [LAND_SIZE] m² Land werden zum Verkauf freigegeben.
+Der Verkaufspreis beträgt [SALE_PRICE] L$. Der Verkauf an [NAME] wird zu diesem Preis freigegeben.
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="ConfirmLandSaleToAnyoneChange">
ACHTUNG: Wenn Sie auf An jeden verkaufen klicken, kann jeder in [SECOND_LIFE] Ihr Land kaufen, auch Einwohner in anderen Regionen.
Die ausgewählten [LAND_SIZE] m² Land werden zum Verkauf freigegeben.
-Der Verkaufspreis beträgt [SALE_PRICE] L$ und wird automatisch für den Verkauf an [NAME] autorisiert.
+Der Verkaufspreis beträgt [SALE_PRICE] L$. Der Verkauf an [NAME] wird zu diesem Preis freigegeben.
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="ReturnObjectsDeededToGroup">
@@ -318,7 +336,7 @@ Sie benötigen ein Benutzerkonto, um [SECOND_LIFE] betreten zu können. Möchten
<notification name="AddClassified">
Anzeigen werden im Suchverzeichnis im Abschnitt „Anzeigen&quot; und auf [http://secondlife.com/community/classifieds secondlife.com] für eine Woche angezeigt.
Füllen Sie Ihre Anzeige aus und klicken Sie auf &apos;Veröffentlichen...&apos;, um sie zum Verzeichnis hinzuzufügen.
-Sie werden gebeten, einen Preis zu bezahlen, wenn Sie auf &apos;Veröffentlichen&apos; klicken.
+Sie werden gebeten für die Anzeige zu bezahlen, wenn Sie auf &apos;Veröffentlichen&apos; klicken.
Wenn Sie mehr bezahlen, erscheint Ihre Anzeige weiter oben in der Liste, ebenso wenn ein Benutzer nach Ihren Suchbegriffen sucht.
<usetemplate ignoretext="So wird eine neue Anzeige erstellt" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
</notification>
@@ -336,8 +354,12 @@ Sind Sie sicher, dass Sie fortfahren wollen?
Änderung an Anzeige [NAME] speichern?
<usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Nicht speichern" yestext="Speichern"/>
</notification>
+ <notification name="ClassifiedInsufficientFunds">
+ Sie haben nicht genügend Geld, um eine Anzeige zu erstellen.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="DeleteAvatarPick">
- Auswahl [PICK] löschen?
+ Auswahl &lt;nolink&gt;[PICK]&lt;/nolink&gt; löschen?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="PromptGoToEventsPage">
@@ -431,18 +453,17 @@ Das Objekt ist möglicherweise außer Reichweite oder wurde gelöscht.
Datei [[FILE]] kann nicht geschrieben werden
</notification>
<notification name="UnsupportedHardware">
- Achtung: Ihr System erfüllt nicht die Mindestanforderungen von [APP_NAME]. Dies kann eine schlechte Darstellungsleistung in [APP_NAME] zur Folge haben. Bei nicht unterstützten Systemkonfigurationen kann Ihnen unsere [SUPPORT_SITE] leider nicht helfen.
+ Ihr Computer entspricht leider nicht den Mindestanforderungen von [APP_NAME]. Dies kann zur Folge haben, dass das Programm nicht sehr gut ausgeführt wird. Bei nicht unterstützten Systemkonfigurationen kann Ihnen unser [SUPPORT_SITE] leider nicht helfen.
-MINDESTANF.
-Die Seite [_URL] für weitere Informationen öffnen?
+Weitere Informationen finden Sie auf [_URL].
<url name="url" option="0">
http://secondlife.com/support/sysreqs.php?lang=de
</url>
<usetemplate ignoretext="Meine Hardware wird nicht unterstützt" name="okcancelignore" notext="Nein" yestext="Ja"/>
</notification>
<notification name="UnknownGPU">
- Ihr System verwendet eine uns zurzeit unbekannte Grafikkarte.
-Dies passiert dann, wenn die neue Hardware noch nicht mit [APP_NAME] getestet wurde. [APP_NAME] wird wahrscheinlich korrekt ausgeführt werden, jedoch sollten Sie Ihre Grafikeinstellungen anpassen, um eine bessere Darstellung zu erzielen.
+ Ihr System verwendet eine Grafikkarte, die [APP_NAME] nicht erkennt.
+Dies passiert dann, wenn die neue Hardware noch nicht mit [APP_NAME] getestet wurde. Wahrscheinlich wird das Programm richtig ausgeführt, aber Sie müssen eventuell ein paar Grafikeinstellungen vornehmen.
(Ich &gt; Einstellungen &gt; Grafik).
<form name="form">
<ignore name="ignore" text="Meine Grafikkarte konnte nicht identifiziert werden."/>
@@ -458,7 +479,9 @@ Sie können die Grafikqualität unter Einstellungen &gt; Grafik wieder erhöhen.
Die Region [REGION] erlaubt kein Terraforming.
</notification>
<notification name="CannotCopyWarning">
- Sie sind nicht berechtigt, dieses Objekt zu kopieren und verlieren es aus Ihrem Inventar, wenn Sie es weggeben. Möchten Sie dieses Objekt anbieten?
+ Sie sind nicht berechtigt, die folgenden Objekte zu kopieren:
+[ITEMS]
+Wenn Sie diese weitergeben, werden sie aus Ihrem Inventar entfernt. Möchten Sie diese Objekte wirklich weggeben?
<usetemplate name="okcancelbuttons" notext="Nein" yestext="Ja"/>
</notification>
<notification name="CannotGiveItem">
@@ -667,7 +690,7 @@ Ihre Suchanfrage: [FINALQUERY]
Es wurde keine Suche durchgeführt.
</notification>
<notification name="CouldNotTeleportReason">
- Teleport fehlgeschlagen.
+ Teleport ist fehlgeschlagen.
[REASON]
</notification>
<notification name="invalid_tport">
@@ -768,14 +791,6 @@ Mehrere Parzellen ausgewählt.
Wählen Sie eine einzelne Parzelle.
</notification>
- <notification name="ParcelCanPlayMedia">
- Dieser Ort kann Streaming-Medien abspielen.
-Streaming-Medien erfordern eine schnelle Internet-Verbindung.
-
-Streaming-Medien abspielen, wenn verfügbar?
-(Sie können diese Option später unter Einstellungen &gt; Datenschutz ändern.)
- <usetemplate name="okcancelbuttons" notext="Deaktivieren" yestext="Medien wiedergeben"/>
- </notification>
<notification name="CannotDeedLandWaitingForServer">
Land kann nicht übertragen werden:
Warte auf Server für Eigentümerinformationen.
@@ -898,9 +913,8 @@ Land zusammenlegen?
Dies ist ein temporärer Fehler. Bitte passen Sie das Kleidungsstück in einigen Minuten noch einmal an und speichern Sie es erneut.
</notification>
<notification name="YouHaveBeenLoggedOut">
- Sie wurden von [SECOND_LIFE] abgemeldet:
+ Es tut uns leid! Sie wurden von [SECOND_LIFE] abgemeldet.
[MESSAGE]
-Klicken Sie auf „IM &amp; Chat anzeigen“, um vorhandene Nachrichten und Chat weiterhin anzuzeigen. Um [APP_NAME] zu schließen, auf „Beenden“ klicken.
<usetemplate name="okcancelbuttons" notext="Beenden" yestext="IM &amp; Chat anzeigen"/>
</notification>
<notification name="OnlyOfficerCanBuyLand">
@@ -908,13 +922,13 @@ Klicken Sie auf „IM &amp; Chat anzeigen“, um vorhandene Nachrichten und Chat
Sie sind nicht berechtigt, Land für die aktive Gruppe zu kaufen.
</notification>
<notification label="Freund hinzufügen" name="AddFriend">
- Freunde können sich gegenseitig die Berechtigung erteilen, sich auf der Karte zu verfolgen und Online-Status Benachrichtigungen zu empfangen.
+ Freunde können sich gegenseitig die Berechtigung erteilen, sich auf der Karte zu sehen und den Online-Status anzuzeigen.
[NAME] Freundschaft anbieten?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
<notification label="Freund hinzufügen" name="AddFriendWithMessage">
- Freunde können sich gegenseitig die Berechtigung erteilen, sich auf der Karte zu verfolgen und Online-Status Benachrichtigungen zu empfangen.
+ Freunde können sich gegenseitig die Berechtigung erteilen, sich auf der Karte zu sehen und den Online-Status anzuzeigen.
[NAME] Freundschaft anbieten?
<form name="form">
@@ -925,6 +939,36 @@ Sie sind nicht berechtigt, Land für die aktive Gruppe zu kaufen.
<button name="Cancel" text="Abbrechen"/>
</form>
</notification>
+ <notification label="Outfit speichern" name="SaveOutfitAs">
+ Mein aktuelles Outfit als neues Outfit speichern:
+ <form name="form">
+ <input name="message">
+ [DESC] (neu)
+ </input>
+ <button name="Offer" text="OK"/>
+ <button name="Cancel" text="Abbrechen"/>
+ </form>
+ </notification>
+ <notification label="Kleidungstyp speichern" name="SaveWearableAs">
+ Objekt in meinem Inventar speichern als:
+ <form name="form">
+ <input name="message">
+ [DESC] (neu)
+ </input>
+ <button name="Offer" text="OK"/>
+ <button name="Cancel" text="Abbrechen"/>
+ </form>
+ </notification>
+ <notification label="Outfit neu benennen" name="RenameOutfit">
+ Neuer Outfit-Name:
+ <form name="form">
+ <input name="new_name">
+ [NAME]
+ </input>
+ <button name="Offer" text="OK"/>
+ <button name="Cancel" text="Abbrechen"/>
+ </form>
+ </notification>
<notification name="RemoveFromFriends">
Möchten Sie [FIRST_NAME] [LAST_NAME] aus Ihrer Freundesliste entfernen?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
@@ -1058,6 +1102,7 @@ Der Gruppe „[GROUP_NAME]“
</notification>
<notification name="ErrorMessage">
[ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AvatarMovedDesired">
Ihr gewünschter Zielort ist zurzeit nicht verfügbar.
@@ -1068,9 +1113,9 @@ Sie wurden zur nächstgelegenen Region teleportiert.
Sie wurden zur nächstgelegenen Region teleportiert.
</notification>
<notification name="AvatarMovedHome">
- Ihr Heimatort ist zurzeit nicht verfügbar.
+ Ihr Zuhause ist zurzeit nicht verfügbar.
Sie wurden zur nächstgelegenen Region teleportiert.
-Sie müssen eventuell einen neuen Heimatort festlegen.
+Sie müssen eventuell ein neues Zuhause festlegen.
</notification>
<notification name="ClothingLoading">
Ihre Kleidung wird noch heruntergeladen.
@@ -1176,7 +1221,7 @@ Ersetzen Sie die Textur [TEXTURE_NUM] mit einer Bilddatei von maximal 512x512 un
Es sind maximal [MAX_MANAGER] verbannte Einwohner erlaub.
</notification>
<notification name="OwnerCanNotBeDenied">
- Der Eigentümer des Grundstücks kann nicht zur Liste der „Verbannten Einwohner“ hinzugefügt werden.
+ Der Eigentümer des Grundbesitzes kann nicht zur Liste der „Verbannten Einwohner“ hinzugefügt werden.
</notification>
<notification name="CanNotChangeAppearanceUntilLoaded">
Das Aussehen lässt sich erst ändern, wenn Kleider und Form/Gestalt geladen sind.
@@ -1335,7 +1380,6 @@ Chat und Instant Messages werden ausgeblendet. Instant Messages (Sofortnachricht
<notification name="JoinedTooManyGroupsMember">
Sie haben die maximale Anzahl an Gruppen erreicht. Bitte verlassen Sie eine andere Gruppe, um dieser beitreten zu können oder lehnen Sie das Angebot ab.
[NAME] hat Sie eingeladen, einer Gruppe beizutreten.
-[INVITE]
<usetemplate name="okcancelbuttons" notext="Ablehnen" yestext="Beitreten"/>
</notification>
<notification name="JoinedTooManyGroups">
@@ -1393,7 +1437,7 @@ Chat und Instant Messages werden ausgeblendet. Instant Messages (Sofortnachricht
</form>
</notification>
<notification name="OfferTeleportFromGod">
- Benutzer an Ihrem Standort herbeirufen?
+ Einwohner zu Ihrem Standort einladen?
<form name="form">
<input name="message">
Triff mich in [REGION]
@@ -1403,7 +1447,7 @@ Chat und Instant Messages werden ausgeblendet. Instant Messages (Sofortnachricht
</form>
</notification>
<notification name="TeleportFromLandmark">
- Möchten Sie sich wirklich teleportieren?
+ Sind Sie sicher, dass Sie zu &lt;nolink&gt;[LOCATION]&lt;/nolink&gt; teleportieren möchten?
<usetemplate ignoretext="Bestätigen, dass ich zu einer Landmarke teleportieren möchte" name="okcancelignore" notext="Abbrechen" yestext="Teleportieren"/>
</notification>
<notification name="TeleportToPick">
@@ -1414,67 +1458,71 @@ Chat und Instant Messages werden ausgeblendet. Instant Messages (Sofortnachricht
Zu [CLASSIFIED] teleportieren?
<usetemplate ignoretext="Bestätigen, dass ich zu einer Position in Anzeigen teleportieren möchte." name="okcancelignore" notext="Abbrechen" yestext="Teleportieren"/>
</notification>
- <notification label="Nachricht an alle auf diesem Grundstück" name="MessageEstate">
- Geben Sie eine kurze Nachricht ein, die an jede Person auf Ihrem Grundstück gesendet wird.
+ <notification name="TeleportToHistoryEntry">
+ Nach [HISTORY_ENTRY] teleportieren?
+ <usetemplate ignoretext="Bestätigen, dass ich zu einem Standort aus der Teleportliste teleportieren möchte" name="okcancelignore" notext="Abbrechen" yestext="Teleportieren"/>
+ </notification>
+ <notification label="Nachricht an alle auf diesem Grundbesitz" name="MessageEstate">
+ Geben Sie eine kurze Nachricht ein, die an jede Person auf Ihrem Grundbesitz gesendet wird.
<form name="form">
<input name="message"/>
<button name="OK" text="OK"/>
<button name="Cancel" text="Abbrechen"/>
</form>
</notification>
- <notification label="Linden-Grundstück ändern" name="ChangeLindenEstate">
- Sie sind im Begriff, ein Grundstück in Linden-Besitz (Mainland, Teen-Raster, Orientierung usw.) zu verändern.
+ <notification label="Linden-Grundbesitz ändern" name="ChangeLindenEstate">
+ Sie sind im Begriff, einen Grundbesitz in Linden-Besitz (Mainland, Teen-Raster, Orientierung usw.) zu verändern.
Dies ist ÄUSSERST GEFÄHRLICH, da es grundlegende Auswirkungen auf das Benutzererlebnis hat. Auf dem Mainland werden tausende Regionen geändert, was den Spaceserver stark belastet.
Fortfahren?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
- <notification label="Zugang zu Linden-Grundstück ändern" name="ChangeLindenAccess">
- Sie sind im Begriff, die Zugangsliste für ein Grundstück in Linden-Besitz (Mainland, Teen-Raster, Orientierung usw.) zu verändern.
+ <notification label="Zugang zu Linden-Grundbesitz ändern" name="ChangeLindenAccess">
+ Sie sind im Begriff, die Zugangsliste für einen Grundbesitz in Linden-Besitz (Mainland, Teen-Raster, Orientierung usw.) zu verändern.
Dies ist GEFÄHRLICH und sollte nur erfolgen, um Objekte/L$ per Hack in und aus dem Raster zu entfernen.
Tausende Regionen werden verändert und der Spaceserver wird dadurch stark belastet.
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
- <notification label="Grundstück wählen" name="EstateAllowedAgentAdd">
- Nur für dieses Grundstück oder für alle [ALL_ESTATES] zur Erlaubnisliste hinzufügen?
- <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/>
+ <notification label="Grundbesitz wählen" name="EstateAllowedAgentAdd">
+ Nur für diesen Grundbesitz oder für alle [ALL_ESTATES] zur Erlaubnisliste hinzufügen?
+ <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundbesitze" yestext="Dieser Grundbesitz"/>
</notification>
- <notification label="Grundstück wählen" name="EstateAllowedAgentRemove">
- Nur für dieses Grundstück oder für alle [ALL_ESTATES] von Erlaubnisliste entfernen?
- <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/>
+ <notification label="Grundbesitz wählen" name="EstateAllowedAgentRemove">
+ Nur für diesen Grundbesitz oder für alle [ALL_ESTATES] von Erlaubnisliste entfernen?
+ <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundbesitze" yestext="Diesen Grundbesitz"/>
</notification>
- <notification label="Grundstück wählen" name="EstateAllowedGroupAdd">
- Nur für dieses Grundstück oder für alle [ALL_ESTATES] zur Gruppen-Erlaubnisliste hinzufügen?
- <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/>
+ <notification label="Grundbesitz wählen" name="EstateAllowedGroupAdd">
+ Nur für diesen Grundbesitz oder für alle [ALL_ESTATES] zur Gruppen-Erlaubnisliste hinzufügen?
+ <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundbesitze" yestext="Diesen Grundbesitz"/>
</notification>
- <notification label="Grundstück wählen" name="EstateAllowedGroupRemove">
- Nur für dieses Grundstück oder für alle [ALL_ESTATES] von Gruppen-Erlaubnisliste entfernen?
- <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/>
+ <notification label="Grundbesitz wählen" name="EstateAllowedGroupRemove">
+ Nur für diesen Grundbesitz oder für alle [ALL_ESTATES] von Gruppen-Erlaubnisliste entfernen?
+ <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundbesitze" yestext="Diesen Grundbesitz"/>
</notification>
- <notification label="Grundstück wählen" name="EstateBannedAgentAdd">
- Zugang nur für dieses Grundstück oder für [ALL_ESTATES] verweigern?
- <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/>
+ <notification label="Grundbesitz wählen" name="EstateBannedAgentAdd">
+ Zugang nur für diesen Grundbesitz oder für [ALL_ESTATES] verweigern?
+ <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundbesitze" yestext="Diesen Grundbesitz"/>
</notification>
- <notification label="Grundstück wählen" name="EstateBannedAgentRemove">
- Einwohner nur für dieses Grundstück oder für alle [ALL_ESTATES] von der Bannliste entfernen?
- <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/>
+ <notification label="Grundbesitz wählen" name="EstateBannedAgentRemove">
+ Einwohner nur für diesen Grundbesitz oder für alle [ALL_ESTATES] von der Bannliste entfernen?
+ <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundbesitze" yestext="Diesen Grundbesitz"/>
</notification>
- <notification label="Grundstück wählen" name="EstateManagerAdd">
- Verwalter nur für dieses Grundstück oder für [ALL_ESTATES] festlegen?
- <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/>
+ <notification label="Grundbesitz wählen" name="EstateManagerAdd">
+ Verwalter nur für diesen Grundbesitz oder für [ALL_ESTATES] festlegen?
+ <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundbesitze" yestext="Diesen Grundbesitz"/>
</notification>
- <notification label="Grundstück wählen" name="EstateManagerRemove">
- Verwalter nur für dieses Grundstück oder für [ALL_ESTATES] entfernen?
- <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundstücke" yestext="Dieses Grundstück"/>
+ <notification label="Grundbesitz wählen" name="EstateManagerRemove">
+ Verwalter nur für diesen Grundbesitz oder für [ALL_ESTATES] entfernen?
+ <usetemplate canceltext="Abbrechen" name="yesnocancelbuttons" notext="Alle Grundbesitze" yestext="Diesen Grundbesitz"/>
</notification>
<notification label="Rauswurf bestätigen" name="EstateKickUser">
- Benutzer [EVIL_USER] von diesem Grundstück werfen?
+ Benutzer [EVIL_USER] von diesem Grundbesitz werfen?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="EstateChangeCovenant">
- Möchten Sie den Grundstücksvertrag wirklich ändern?
+ Möchten Sie den Grundbesitzvertrag wirklich ändern?
<usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="RegionEntryAccessBlocked">
@@ -1496,15 +1544,18 @@ Möchten Sie unsere Knowledgebase besuchen, um mehr Informationen über Alterein
Aufgrund Ihrer Alterseinstufung dürfen Sie diese Region nicht betreten.
</notification>
<notification name="RegionEntryAccessBlocked_Change">
- Sie dürfen diese Region aufgrund der Einstellung Ihrer Alterseinstufung nicht betreten.
+ Sie dürfen diese Region aufgrund der Einstellung Ihrer Inhaltseinstufung nicht betreten.
-Klicken Sie auf „Einstellung ändern“, um Ihre Einstellung für Altereinstufung sofort zu ändern und Zugang zu erhalten. Sie können ab sofort [REGIONMATURITY]-Inhalt suchen und auf diesen zugreifen. Falls Sie diese Einstellung später rückgängig machen möchten, gehen Sie zu Bearbeiten &gt; Einstellungen &gt; Allgemein.
+Bitte ändern Sie Ihre Einstellungen bezüglich der Inhaltseinstufung, um die gewünschte Region zu betreten. Danach können Sie nach [REGIONMATURITY]-Inhalt suchen und auf diesen zugreifen. Um die Veränderungen rückgängig zu machen, gehen Sie zu Ich &gt; Einstellungen &gt; Allgemein.
<form name="form">
<button name="OK" text="Einstellung ändern"/>
<button name="Cancel" text="Schließen"/>
<ignore name="ignore" text="Meine Alterseinstufung lässt nicht zu, dass ich eine Region betrete."/>
</form>
</notification>
+ <notification name="PreferredMaturityChanged">
+ Ihre Inhaltseinstufung ist jetzt [RATING].
+ </notification>
<notification name="LandClaimAccessBlocked">
Sie haben aufgrund Ihrer Alterseinstufung keinen Anspruch auf dieses Land. Der Grund hierfür ist möglicherweise, dass Sie nicht altersüberprüft sind.
@@ -1558,14 +1609,14 @@ Klicken Sie auf „Einstellung ändern“, um Ihre Einstellung für Altereinstuf
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="ProblemImportingEstateCovenant">
- Problem beim Import des Grundstückvertrags.
+ Problem beim Import des Grundbesitzvertrags.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="ProblemAddingEstateManager">
- Es gibt Probleme beim Hinzufügen eines neuen Grundstücksverwalters. Bei mindestens einem Grundstück ist die Verwalterliste voll.
+ Es gibt Probleme beim Hinzufügen eines neuen Grundbesitzverwalters. Bei mindestens einem Grundbesitz ist die Verwalterliste voll.
</notification>
<notification name="ProblemAddingEstateGeneric">
- Problem beim Hinzufügen zu dieser Grundstücksliste. Bei mindestens einem Grundstück ist die Liste voll.
+ Problem beim Hinzufügen zu dieser Grundbesitzliste. Bei mindestens einem Grundbesitz ist die Liste voll.
</notification>
<notification name="UnableToLoadNotecardAsset">
Notizkarten-Asset konnte nicht geladen werden.
@@ -1713,7 +1764,7 @@ Inventarobjekt(e) verschieben?
<notification name="ClickActionNotPayable">
Achtung: Die Klickaktion „Objekt bezahlen&quot; wurde eingestellt. Diese funktioniert jedoch nicht, wenn ein Skript mit einer Geldtransaktion () hinzugefügt wird.
<form name="form">
- <ignore name="ignore" text="I habe die Aktion „Objekt bezahlen&quot; eingestellt, während ich ein Objekt gebaut habe, dass kein Geld()-Skript enthält."/>
+ <ignore name="ignore" text="Ich habe die Aktion „Objekt bezahlen&quot; eingestellt, während ich ein Objekt gebaut habe, dass kein Geld()-Skript enthält."/>
</form>
</notification>
<notification name="OpenObjectCannotCopy">
@@ -1728,9 +1779,9 @@ Inventarobjekt(e) verschieben?
<usetemplate ignoretext="Bestätigen, bevor Sitzung beendet wird" name="okcancelignore" notext="Nicht beenden" yestext="Beenden"/>
</notification>
<notification name="HelpReportAbuseEmailLL">
- Mit dieser Funktion können Sie Verstöße gegen die [http://secondlife.com/corporate/tos.php Servicebedingungen (EN)] and [http://secondlife.com/corporate/cs.php Community-Standards] melden.
+ Mit dieser Funktion können Sie Verstöße gegen die [http://secondlife.com/corporate/tos.php Servicebedingungen (EN)] und [http://secondlife.com/corporate/cs.php Community-Standards] melden.
-Alle gemeldeten Verstöße werden bearbeitet. Sie können auf der Seite [http://secondlife.com/support/incidentreport.php Verstoßmeldungen] nachverfolgen, welche Verstoßmeldungen bearbeitet wurden.
+Alle gemeldeten Verstöße werden bearbeitet.
</notification>
<notification name="HelpReportAbuseSelectCategory">
Wählen Sie eine Missbrauchskategorie aus.
@@ -1920,6 +1971,9 @@ Von einer Webseite zu diesem Formular linken, um anderen leichten Zugang zu dies
<notification name="SystemMessageTip">
[MESSAGE]
</notification>
+ <notification name="IMSystemMessageTip">
+ [MESSAGE]
+ </notification>
<notification name="Cancelled">
Abgebrochen
</notification>
@@ -1948,6 +2002,11 @@ Von einer Webseite zu diesem Formular linken, um anderen leichten Zugang zu dies
In-Welt- und Website-Fotos werden hochgeladen...
(Dauert ca. 5 Minuten.)
</notification>
+ <notification name="UploadConfirmation">
+ Kosten für Hochladen: [AMOUNT] L$.
+Möchten Sie fortfahren?
+ <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="Hochladen"/>
+ </notification>
<notification name="UploadPayment">
Sie haben für das Hochladen [AMOUNT] L$ bezahlt.
</notification>
@@ -2049,9 +2108,9 @@ Wählen Sie ein einzelnes Objekt aus.
Ihre Visitenkarte wurde abgelehnt.
</notification>
<notification name="TeleportToLandmark">
- Sie können an Positionen wie „[NAME]“ teleportieren, wenn Sie rechts in Ihrem Bildschirm die Tafel „Orte“ öffnen und dann die Registerkarte „Landmarken“ auswählen.
-Klicken Sie auf eine Landmarke, um diese auszuwählen. Klicken Sie anschließend auf „Teleport“ unten in der Konsole.
-(Sie können auch auf die Landmarke doppelt klicken oder mit rechts auf die Landmarke klicken und dann „Teleport“ auswählen).
+ Sie können an Positionen wie „[NAME]“ teleportieren, wenn Sie rechts in Ihrem Bildschirm die Tafel „Orte“ öffnen und dann die Registerkarte „Meine Landmarken“ auswählen.
+Klicken Sie auf eine Landmarke, um diese auszuwählen. Klicken Sie anschließend auf unten in der Registerkarte auf „Teleportieren“.
+(Sie können auch auf die Landmarke doppelt klicken oder mit rechts auf die Landmarke klicken und dann „Teleportieren“ auswählen).
</notification>
<notification name="TeleportToPerson">
Sie können Einwohner wie „[NAME]“ kontaktieren, wenn Sie die Tafel „Leute“ auf der rechten Seite Ihres Bildschirms öffnen.
@@ -2066,7 +2125,7 @@ Wählen Sie eine kleinere Landfläche.
Einige Begriffe in Ihrer Suchanfrage wurden ausgeschlossen, aufgrund von in den Community Standards definierten Inhaltsbeschränkungen.
</notification>
<notification name="NoContentToSearch">
- Bitte wählen Sie mindestens eine Inhaltsart für die Suche aus (Allgemein, Moderat oder Adult).
+ Bitte wählen Sie mindestens eine Inhaltsart für die Suche aus (Generell, Moderat oder Adult).
</notification>
<notification name="GroupVote">
[NAME] hat eine Abstimmung vorgeschlagen über:
@@ -2140,7 +2199,7 @@ Nicht transferierbare an die Gruppe übertragene Objekte wurden gelöscht.
</notification>
<notification name="ServerObjectMessage">
Nachricht von [NAME]:
-[MSG]
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
</notification>
<notification name="NotSafe">
Auf diesem Land ist Schaden aktiviert.
@@ -2188,10 +2247,10 @@ Bitte besuchen Sie unsere Knowledgebase, um mehr Details über Zugang zu Regione
Die für den Zutritt zu dieser Region erforderlichen Zahlungsinformationen liegen nicht vor.
</notification>
<notification name="MustGetAgeRgion">
- Sie müssen alterüberprüft sein, um diese Region betreten zu können.
+ Sie müssen altersüberprüft sein, um diese Region betreten zu können.
</notification>
<notification name="MustGetAgeParcel">
- Sie müssen alterüberprüft sein, um diese Parzelle betreten zu können.
+ Sie müssen altersüberprüft sein, um diese Parzelle betreten zu können.
</notification>
<notification name="NoDestRegion">
Keine Zielregion gefunden.
@@ -2260,22 +2319,13 @@ Versuchen Sie es in einigen Minuten erneut.
<button name="Mute" text="Ignorieren"/>
</form>
</notification>
- <notification name="ObjectGiveItemUnknownUser">
- Ein Objekt namens [OBJECTFROMNAME] von (einem unbekannten Einwohner) hat Ihnen folgendes übergeben [OBJECTTYPE]:
-[ITEM_SLURL]
- <form name="form">
- <button name="Keep" text="Behalten"/>
- <button name="Discard" text="Verwerfen"/>
- <button name="Mute" text="Ignorieren"/>
- </form>
- </notification>
<notification name="UserGiveItem">
[NAME_SLURL] hat Ihnen folgendes [OBJECTTYPE] übergeben:
[ITEM_SLURL]
<form name="form">
<button name="Show" text="Anzeigen"/>
<button name="Discard" text="Verwerfen"/>
- <button name="Mute" text="Ignorieren"/>
+ <button name="Mute" text="Blockieren"/>
</form>
</notification>
<notification name="GodMessage">
@@ -2292,9 +2342,9 @@ Versuchen Sie es in einigen Minuten erneut.
</form>
</notification>
<notification name="TeleportOffered">
- [NAME] hat Ihnen einen Teleport an seine/ihre Position angeboten:
+ [NAME_SLURL] hat Ihnen einen Teleport an seine/ihre Position angeboten:
-[MESSAGE]
+[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
<form name="form">
<button name="Teleport" text="Teleportieren"/>
<button name="Cancel" text="Abbrechen"/>
@@ -2312,15 +2362,14 @@ Versuchen Sie es in einigen Minuten erneut.
</form>
</notification>
<notification name="OfferFriendship">
- [NAME] bietet Ihnen die Freundschaft an.
+ [NAME_SLURL] bietet Ihnen die Freundschaft an.
[MESSAGE]
-(Standardmäßig werden Sie gegenseitig ihren Online-Status sehen können.)
+(Standardmäßig können Sie gegenseitig ihren Online-Status sehen.)
<form name="form">
<button name="Accept" text="Akzeptieren"/>
<button name="Decline" text="Ablehnen"/>
- <button name="Send IM" text="IM senden"/>
</form>
</notification>
<notification name="FriendshipOffered">
@@ -2341,6 +2390,12 @@ Versuchen Sie es in einigen Minuten erneut.
<notification name="FriendshipDeclined">
[NAME] hat Ihr Freundschaftsangebot abgelehnt.
</notification>
+ <notification name="FriendshipAcceptedByMe">
+ Ihr Freundschaftsangebot wurde angeommen.
+ </notification>
+ <notification name="FriendshipDeclinedByMe">
+ Ihr Freundschaftsangebot wurde abgelehnt.
+ </notification>
<notification name="OfferCallingCard">
[FIRST] [LAST] bietet Ihnen ihre/seine Visitenkarte an.
Ihrem Inventar wird ein Lesezeichen erstellt, damit Sie diesem Einwohner einfach eine IM schicken können.
@@ -2350,7 +2405,7 @@ Ihrem Inventar wird ein Lesezeichen erstellt, damit Sie diesem Einwohner einfach
</form>
</notification>
<notification name="RegionRestartMinutes">
- Diese Region wird in [Minuten] neu gestartet.
+ Diese Region wird in [MINUTES] neu gestartet.
Wenn Sie in dieser Region bleiben, werden Sie abgemeldet.
</notification>
<notification name="RegionRestartSeconds">
@@ -2374,6 +2429,9 @@ Von Objekt: [OBJECTNAME], Eigentümer: [NAME]?
<notification name="FailedToFindWearable">
[TYPE] namens [DESC] nicht in Datenbank.
</notification>
+ <notification name="ShareToWebFailed">
+ Bild aus Internet konnte nicht hochgeladen werden.
+ </notification>
<notification name="InvalidWearable">
Dieser Artikel verwendet eine Funktion, die Ihr Viewer nicht unterstützt. Bitte aktualisieren Sie Ihre Version von [APP_NAME], um dieses Objekt anziehen zu können.
</notification>
@@ -2415,14 +2473,6 @@ Anfrage gestatten?
<button name="Ignore" text="Ignorieren"/>
</form>
</notification>
- <notification name="ScriptToast">
- [FIRST] [LAST]s &apos;[TITLE]&apos; fordert Eingaben vom Benutzer an.
- <form name="form">
- <button name="Open" text="Dialog öffnen"/>
- <button name="Ignore" text="Ignorieren"/>
- <button name="Block" text="Ignorieren"/>
- </form>
- </notification>
<notification name="BuyLindenDollarSuccess">
Vielen Dank für Ihre Zahlung.
@@ -2514,6 +2564,21 @@ Klicken Sie auf &apos;Akzeptieren &apos;, um dem Chat beizutreten, oder auf &a
<notification name="VoiceLoginRetry">
Wir erstellen einen Voice-Kanal für Sie. Bitte warten Sie einen Moment.
</notification>
+ <notification name="VoiceEffectsExpired">
+ Ein oder mehrere Ihrer Voice-Morph-Abos ist/sind abgelaufen.
+[[URL] Hier klicken], um Ihr Abo zu erneuern.
+ </notification>
+ <notification name="VoiceEffectsExpiredInUse">
+ Das aktive Voice-Morph-Abo ist abgelaufen. Ihre normalen Voice-Einstellungen werden angewendet.
+[[URL] Hier klicken], um Ihr Abo zu erneuern.
+ </notification>
+ <notification name="VoiceEffectsWillExpire">
+ Ein oder mehrere Ihrer Voice-Morph-Abos werden in weniger als [INTERVAL] Tagen ablaufen.
+[[URL] Hier klicken], um Ihr Abo zu erneuern.
+ </notification>
+ <notification name="VoiceEffectsNew">
+ Neue Voice-Morph-Effekte sind erhältlich!
+ </notification>
<notification name="Cannot enter parcel: not a group member">
Nur Mitglieder einer bestimmten Gruppe dürfen diesen Bereich betreten.
</notification>
@@ -2550,7 +2615,7 @@ Diese werden für ein paar Sekunden sicherheitshalber gesperrt.
</notification>
<notification name="ConfirmCloseAll">
Möchten Sie wirklich alle IMs schließen?
- <usetemplate name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+ <usetemplate ignoretext="Bestätigen, bevor ich alle IMs schließe." name="okcancelignore" notext="Abbrechen" yestext="OK"/>
</notification>
<notification name="AttachmentSaved">
Der Anhang wurde gespeichert.
@@ -2579,6 +2644,60 @@ Diese werden für ein paar Sekunden sicherheitshalber gesperrt.
Die ausgewählte Schaltfläche kann zur Zeit nicht angezeigt werden.
Die Schaltfläche wird angezeigt, wenn genügend Platz vorhanden ist.
</notification>
+ <notification name="ShareNotification">
+ Wählen Sie Einwohner aus, für die Sie das Objekt freigeben möchten.
+ </notification>
+ <notification name="ShareItemsConfirmation">
+ Möchten Sie diese Objekte wirklich für andere freigeben:
+
+[ITEMS]
+
+Für folgende Einwohner:
+
+[RESIDENTS]
+ <usetemplate name="okcancelbuttons" notext="Abbrechen" yestext="OK"/>
+ </notification>
+ <notification name="ItemsShared">
+ Objekte wurden erfolgreich freigegeben.
+ </notification>
+ <notification name="AvatarRezNotification">
+ (Seit [EXISTENCE] Sekunden inworld )
+Avatar &apos;[NAME]&apos; wurde in [TIME] Sekunden gerezzt.
+ </notification>
+ <notification name="AvatarRezSelfBakedDoneNotification">
+ (Seit [EXISTENCE] Sekunden inworld )
+Ihr Outfit wurde in [TIME] Sekunden gebacken.
+ </notification>
+ <notification name="AvatarRezSelfBakedUpdateNotification">
+ (Seit [EXISTENCE] Sekunden inworld )
+Nach [TIME] Sekunden wurde eine Aktualisierung Ihres Aussehens gesendet.
+[STATUS]
+ </notification>
+ <notification name="NoConnect">
+ Es gibt Probleme mit der Verbindung mit [PROTOCOL] [HOSTID].
+Bitte überprüfen Sie Ihre Netzwerk- und Firewalleinstellungen.
+ <form name="form">
+ <button name="OK" text="OK"/>
+ </form>
+ </notification>
+ <notification name="NoVoiceConnect">
+ Verbindung mit Voice-Server ist leider nicht möglich:
+
+[HOSTID]
+
+Voice-Kommunikation ist leider nicht verfügbar.
+Bitte überprüfen Sie Ihr Netzwerk- und Firewall-Setup.
+ <form name="form">
+ <button name="OK" text="OK"/>
+ </form>
+ </notification>
+ <notification name="AvatarRezSelfBakeNotification">
+ (Seit [EXISTENCE] Sekunden inworld )
+Die [RESOLUTION]-gebakene Textur für &apos;[BODYREGION]&apos; wurde in [TIME] Sekunden hochgeladen.
+ </notification>
+ <notification name="ConfirmMuteAll">
+ <usetemplate ignoretext="Confirm before I mute all participants in a group call" name="okcancelignore" notext="Abbrechen" yestext="OK"/>
+ </notification>
<global name="UnsupportedCPU">
- Ihre CPU-Geschwindigkeit entspricht nicht den Mindestanforderungen.
</global>
@@ -2600,7 +2719,7 @@ Sollte das Problem fortbestehen, finden Sie weitere Hilfestellung unter [SUPPORT
- Ihr Arbeitsspeicher entspricht nicht den Mindestanforderungen.
</global>
<global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
- Wenn Sie ein Stück Land besitzen, können Sie dies als Ihren Heimatort festlegen.
+ Wenn Sie ein Stück Land besitzen, können Sie dies als Ihr Zuhause festlegen.
Ansonsten können Sie auf der Karte nachsehen und dort Ort suchen, die als „Infohub“ gekennzeichnet sind.
</global>
</notifications>
diff --git a/indra/newview/skins/default/xui/de/outfit_accordion_tab.xml b/indra/newview/skins/default/xui/de/outfit_accordion_tab.xml
new file mode 100644
index 0000000000..bac885e5d8
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/outfit_accordion_tab.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: mantipov: this xml is intended to be used inside panel_outfits_list.xml for each outfit folder-->
+<!-- All accordion tabs in the My Appearance/My Outfits panel will be created from this one at runtume-->
+<accordion_tab name="Mockup Tab" title="Mockup Tab"/>
diff --git a/indra/newview/skins/default/xui/de/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/de/panel_block_list_sidetray.xml
index eb4832770e..2d140515d4 100644
--- a/indra/newview/skins/default/xui/de/panel_block_list_sidetray.xml
+++ b/indra/newview/skins/default/xui/de/panel_block_list_sidetray.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="block_list_panel">
- <text name="title_text">
+<panel name="block_list_panel" width="300">
+ <text left_pad="5" name="title_text" width="260">
Liste der ignorierten Einwohner
</text>
- <scroll_list name="blocked" tool_tip="Liste der zur Zeit ignorierten Einwohner"/>
+ <scroll_list name="blocked" tool_tip="Liste der zur Zeit ignorierten Einwohner" width="290"/>
<button label="Einwohner ignorieren" label_selected="Einwohner ignorieren..." name="Block resident..." tool_tip="Wählen Sie einen Einwohner, um ihn zu ignorieren"/>
<button label="Objekt nach Name ignorieren" label_selected="Objekt nach Name ignorieren..." name="Block object by name..." tool_tip="Ein Objekt auswählen, um nach Namen zu ignorieren."/>
<button label="Freischalten" label_selected="Freischalten" name="Unblock" tool_tip="Einwohner oder Objekt von der Liste der ignorierten Einwohner oder Objekte entfernen"/>
diff --git a/indra/newview/skins/default/xui/de/panel_bottomtray.xml b/indra/newview/skins/default/xui/de/panel_bottomtray.xml
index 7a627e32c8..83f67344ca 100644
--- a/indra/newview/skins/default/xui/de/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/de/panel_bottomtray.xml
@@ -7,6 +7,11 @@
Voice-Chat-Steuerung anzeigen/ausblenden
</string>
<layout_stack name="toolbar_stack">
+ <layout_panel name="speak_panel">
+ <talk_button name="talk">
+ <speak_button label="Sprechen" label_selected="Sprechen" name="speak_btn" />
+ </talk_button>
+ </layout_panel>
<layout_panel name="gesture_panel">
<gesture_combo_list label="Gesten" name="Gesture" tool_tip="Gesten anzeigen/ausblenden"/>
</layout_panel>
diff --git a/indra/newview/skins/default/xui/de/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/de/panel_bottomtray_lite.xml
new file mode 100644
index 0000000000..9c84105254
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_bottomtray_lite.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray_lite">
+ <layout_stack name="toolbar_stack_lite">
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="Gesten" name="Gesture" tool_tip="Gesten anzeigen/ausblenden"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_classified_info.xml b/indra/newview/skins/default/xui/de/panel_classified_info.xml
index d45e28f0c8..ac1cd7ba88 100644
--- a/indra/newview/skins/default/xui/de/panel_classified_info.xml
+++ b/indra/newview/skins/default/xui/de/panel_classified_info.xml
@@ -4,20 +4,51 @@
Moderat
</panel.string>
<panel.string name="type_pg">
- Allgemeiner Inhalt
+ Genereller Inhalt
</panel.string>
- <text name="title" value="Informationen über Anzeige"/>
+ <panel.string name="l$_price">
+ [PRICE] L$
+ </panel.string>
+ <panel.string name="click_through_text_fmt">
+ [TELEPORT] teleportieren, [MAP] Karte, [PROFILE] Profil
+ </panel.string>
+ <panel.string name="date_fmt">
+ [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
+ </panel.string>
+ <panel.string name="auto_renew_on">
+ Aktiviert
+ </panel.string>
+ <panel.string name="auto_renew_off">
+ Deaktiviert
+ </panel.string>
+ <text name="title" value="Anzeigen-Info"/>
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
- <text name="classified_name" value="[name]"/>
- <text name="classified_location" value="[wird geladen...]"/>
- <text name="content_type" value="[Inhalts-Art]"/>
- <text name="category" value="[Kategorie]"/>
- <check_box label="Jede Woche automatisch erneuern" name="auto_renew"/>
- <text name="price_for_listing" tool_tip="Preis für Anzeige.">
- [PRICE] L$
- </text>
- <text name="classified_desc" value="[description]"/>
+ <text_editor name="classified_name" value="[name]"/>
+ <text name="classified_location_label" value="Standort:"/>
+ <text_editor name="classified_location" value="[loading...]"/>
+ <text name="content_type_label" value="Inhaltsart:"/>
+ <text_editor name="content_type" value="[Inhalts-Art]"/>
+ <text name="category_label" value="Kategorie:"/>
+ <text_editor name="category" value="[Kategorie]"/>
+ <text name="creation_date_label" value="Erstellungsdatum:"/>
+ <text_editor name="creation_date" tool_tip="Erstellungsdatum" value="[date]"/>
+ <text name="price_for_listing_label" value="Preis für Anzeige:"/>
+ <text_editor name="price_for_listing" tool_tip="Preis für Anzeige." value="[price]"/>
+ <layout_stack name="descr_stack">
+ <layout_panel name="clickthrough_layout_panel">
+ <text name="click_through_label" value="Klicks:"/>
+ <text_editor name="click_through_text" tool_tip="Click-Through-Daten" value="[clicks]"/>
+ </layout_panel>
+ <layout_panel name="price_layout_panel">
+ <text name="auto_renew_label" value="Autom. erneuern:"/>
+ <text name="auto_renew" value="Aktiviert"/>
+ </layout_panel>
+ <layout_panel name="descr_layout_panel">
+ <text name="classified_desc_label" value="Beschreibung:"/>
+ <text_editor name="classified_desc" value="[description]"/>
+ </layout_panel>
+ </layout_stack>
</panel>
</scroll_container>
<panel name="buttons">
diff --git a/indra/newview/skins/default/xui/de/panel_edit_alpha.xml b/indra/newview/skins/default/xui/de/panel_edit_alpha.xml
index 4b48950341..b6c53be778 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_alpha.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_alpha.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="edit_alpha_panel">
- <panel name="avatar_alpha_color_panel">
- <texture_picker label="Alpha: Unten" name="Lower Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Alpha: Oben" name="Upper Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+<panel name="edit_alpha_panel" width="320">
+ <panel name="avatar_alpha_color_panel" width="300">
+ <texture_picker label="Alpha: Unten" name="Lower Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken" width="70"/>
+ <texture_picker label="Alpha: Oben" name="Upper Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken" width="66"/>
<texture_picker label="Kopf: Alpha" name="Head Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Alpha: Augen" name="Eye Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Alpha: Haare" name="Hair Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Alpha: Augen" name="Eye Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken" width="72"/>
+ <texture_picker label="Alpha: Haare" name="Hair Alpha" tool_tip="Zum Auswählen eines Bildes hier klicken" width="70"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_classified.xml b/indra/newview/skins/default/xui/de/panel_edit_classified.xml
index a9b5da163f..0d9487e895 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_classified.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_classified.xml
@@ -3,12 +3,20 @@
<panel.string name="location_notice">
(wird nach Speichern aktualisiert)
</panel.string>
+ <string name="publish_label">
+ Veröffentlichen
+ </string>
+ <string name="save_label">
+ Speichern
+ </string>
<text name="title">
Anzeige bearbeiten
</text>
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
- <icon label="" name="edit_icon" tool_tip="Klicken, um ein Bild auszuwählen"/>
+ <panel name="snapshot_panel">
+ <icon label="" name="edit_icon" tool_tip="Klicken, um ein Bild auszuwählen"/>
+ </panel>
<text name="Name:">
Titel:
</text>
@@ -21,21 +29,20 @@
<text name="classified_location">
wird geladen...
</text>
- <button label="Auf aktuelle Position einstellen" name="set_to_curr_location_btn"/>
- <combo_box name="content_type">
- <combo_item name="mature_ci">
- Moderater Inhalt
- </combo_item>
- <combo_item name="pg_ci">
- Allgemeiner Inhalt
- </combo_item>
- </combo_box>
+ <button label="Aktuellen Standort verwenden" name="set_to_curr_location_btn"/>
+ <text name="category_label" value="Kategorie:"/>
+ <text name="content_type_label" value="Inhaltsart:"/>
+ <icons_combo_box label="Genereller Inhalt" name="content_type">
+ <icons_combo_box.item label="Moderater Inhalt" name="mature_ci" value="Moderat"/>
+ <icons_combo_box.item label="Genereller Inhalt" name="pg_ci" value="G"/>
+ </icons_combo_box>
+ <text name="price_for_listing_label" value="Preis für Anzeige:"/>
<spinner label="L$" name="price_for_listing" tool_tip="Preis für Anzeige." value="50"/>
<check_box label="Jede Woche automatisch erneuern" name="auto_renew"/>
</panel>
</scroll_container>
<panel label="bottom_panel" name="bottom_panel">
- <button label="Speichern" name="save_changes_btn"/>
+ <button label="[LABEL]" name="save_changes_btn"/>
<button label="Abbrechen" name="cancel_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_eyes.xml b/indra/newview/skins/default/xui/de/panel_edit_eyes.xml
index 31251ed48f..69bcf2fb71 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_eyes.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_eyes.xml
@@ -3,7 +3,9 @@
<panel name="avatar_eye_color_panel">
<texture_picker label="Iris" name="Iris" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="eyes_main_tab" title="Augen"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="eyes_main_tab" title="Augen"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_gloves.xml b/indra/newview/skins/default/xui/de/panel_edit_gloves.xml
index 2d11befbfd..ad87e432d6 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_gloves.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_gloves.xml
@@ -4,7 +4,9 @@
<texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="gloves_main_tab" title="Handschuhe"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="gloves_main_tab" title="Handschuhe"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_hair.xml b/indra/newview/skins/default/xui/de/panel_edit_hair.xml
index d255b1c16c..d6efde8306 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_hair.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_hair.xml
@@ -3,10 +3,12 @@
<panel name="avatar_hair_color_panel">
<texture_picker label="Textur" name="Texture" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="hair_color_tab" title="Farbe"/>
- <accordion_tab name="hair_style_tab" title="Stil"/>
- <accordion_tab name="hair_eyebrows_tab" title="Augenbrauen"/>
- <accordion_tab name="hair_facial_tab" title="Gesicht"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="hair_color_tab" title="Farbe"/>
+ <accordion_tab name="hair_style_tab" title="Stil"/>
+ <accordion_tab name="hair_eyebrows_tab" title="Augenbrauen"/>
+ <accordion_tab name="hair_facial_tab" title="Gesicht"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_jacket.xml b/indra/newview/skins/default/xui/de/panel_edit_jacket.xml
index 3752faf48a..8fe76f6225 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_jacket.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_jacket.xml
@@ -1,11 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_jacket_panel">
<panel name="avatar_jacket_color_panel">
- <texture_picker label="Oberstoff" name="Upper Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Unterstoff" name="Lower Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Stoff: oben" name="Upper Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Stoff: unten" name="Lower Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="jacket_main_tab" title="Jacke"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="jacket_main_tab" title="Jacke"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_pants.xml b/indra/newview/skins/default/xui/de/panel_edit_pants.xml
index 1ff439dc26..d40a27c5fd 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_pants.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_pants.xml
@@ -4,7 +4,9 @@
<texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="pants_main_tab" title="Hose"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="pants_main_tab" title="Hose"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_pick.xml b/indra/newview/skins/default/xui/de/panel_edit_pick.xml
index bd05a4151e..1ec4f09161 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_pick.xml
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Auswahl bearbeiten" name="panel_edit_pick">
+ <panel.string name="location_notice">
+ (wird nach Speichern aktualisiert)
+ </panel.string>
<text name="title">
Auswahl bearbeiten
</text>
@@ -18,11 +21,11 @@
<text name="pick_location">
wird geladen...
</text>
- <button label="Auf aktuelle Position einstellen" name="set_to_curr_location_btn"/>
+ <button label="Aktuellen Standort verwenden" name="set_to_curr_location_btn"/>
</panel>
</scroll_container>
<panel label="bottom_panel" name="bottom_panel">
- <button label="[WHAT] speichern" name="save_changes_btn"/>
+ <button label="Auswahl speichern" name="save_changes_btn"/>
<button label="Abbrechen" name="cancel_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_profile.xml b/indra/newview/skins/default/xui/de/panel_edit_profile.xml
index f643115dbe..bf74abaeba 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_profile.xml
@@ -42,13 +42,13 @@
<line_editor name="homepage_edit" value="http://"/>
<check_box label="In Suchergebnissen anzeigen" name="show_in_search_checkbox"/>
<text name="title_acc_status_text" value="Mein Konto:"/>
+ <text_editor name="acc_status_text" value="Einwohner. Keine Zahlungsinfo archiviert."/>
<text name="my_account_link" value="[[URL] Meine Startseite aufrufen]"/>
- <text name="acc_status_text" value="Einwohner. Keine Zahlungsinfo archiviert."/>
<text name="title_partner_text" value="Mein Partner:"/>
- <text name="partner_edit_link" value="[[URL] bearbeiten]"/>
<panel name="partner_data_panel">
- <name_box name="partner_text" value="[FIRST] [LAST]"/>
+ <name_box initial_value="(wird in Datenbank gesucht)" name="partner_text" value="[FIRST] [LAST]"/>
</panel>
+ <text name="partner_edit_link" value="[[URL] bearbeiten]"/>
</panel>
</panel>
</scroll_container>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_shape.xml b/indra/newview/skins/default/xui/de/panel_edit_shape.xml
index 37be3c1d90..d04dba7a3b 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_shape.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_shape.xml
@@ -1,23 +1,25 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_shape_panel">
- <panel name="avatar_sex_panel">
- <text name="gender_text">
- Geschlecht:
- </text>
- <radio_group name="sex_radio">
- <radio_item label="weiblich" name="radio"/>
- <radio_item label="Männlich" name="radio2"/>
- </radio_group>
+ <string name="meters">
+ Meter
+ </string>
+ <string name="feet">
+ Fuß
+ </string>
+ <string name="height">
+ Höhe:
+ </string>
+ <panel label="Hemd" name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shape_body_tab" title="Körper"/>
+ <accordion_tab name="shape_head_tab" title="Kopf"/>
+ <accordion_tab name="shape_eyes_tab" title="Augen"/>
+ <accordion_tab name="shape_ears_tab" title="Ohren"/>
+ <accordion_tab name="shape_nose_tab" title="Nase"/>
+ <accordion_tab name="shape_mouth_tab" title="Mund"/>
+ <accordion_tab name="shape_chin_tab" title="Kinn"/>
+ <accordion_tab name="shape_torso_tab" title="Oberkörper"/>
+ <accordion_tab name="shape_legs_tab" title="Beine"/>
+ </accordion>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="shape_body_tab" title="Körper"/>
- <accordion_tab name="shape_head_tab" title="Kopf"/>
- <accordion_tab name="shape_eyes_tab" title="Augen"/>
- <accordion_tab name="shape_ears_tab" title="Ohren"/>
- <accordion_tab name="shape_nose_tab" title="Nase"/>
- <accordion_tab name="shape_mouth_tab" title="Mund"/>
- <accordion_tab name="shape_chin_tab" title="Kinn"/>
- <accordion_tab name="shape_torso_tab" title="Oberkörper"/>
- <accordion_tab name="shape_legs_tab" title="Beine"/>
- </accordion>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_shirt.xml b/indra/newview/skins/default/xui/de/panel_edit_shirt.xml
index 6025606777..344b0b412a 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_shirt.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_shirt.xml
@@ -4,7 +4,9 @@
<texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="shirt_main_tab" title="Hemd"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shirt_main_tab" title="Hemd"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_shoes.xml b/indra/newview/skins/default/xui/de/panel_edit_shoes.xml
index 15e8a21dd7..56aee5d0fe 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_shoes.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_shoes.xml
@@ -4,7 +4,9 @@
<texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="shoes_main_tab" title="Schuhe"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shoes_main_tab" title="Schuhe"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_skin.xml b/indra/newview/skins/default/xui/de/panel_edit_skin.xml
index 46bd1d9f4d..f167f45e98 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_skin.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_skin.xml
@@ -5,10 +5,12 @@
<texture_picker label="Obere Tattoos" name="Upper Tattoos" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
<texture_picker label="Untere Tattoos" name="Lower Tattoos" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="skin_color_tab" title="Hautfarbe"/>
- <accordion_tab name="skin_face_tab" title="Gesichtsdetails"/>
- <accordion_tab name="skin_makeup_tab" title="Make-Uup"/>
- <accordion_tab name="skin_body_tab" title="Körperdetails"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skin_color_tab" title="Hautfarbe"/>
+ <accordion_tab name="skin_face_tab" title="Gesichtsdetails"/>
+ <accordion_tab name="skin_makeup_tab" title="Make-Up"/>
+ <accordion_tab name="skin_body_tab" title="Körperdetails"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_skirt.xml b/indra/newview/skins/default/xui/de/panel_edit_skirt.xml
index 4fa9126c37..c8931bc947 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_skirt.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_skirt.xml
@@ -4,7 +4,9 @@
<texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="skirt_main_tab" title="Rock"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skirt_main_tab" title="Rock"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_socks.xml b/indra/newview/skins/default/xui/de/panel_edit_socks.xml
index c2ecad8642..abbeefa44e 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_socks.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_socks.xml
@@ -4,7 +4,9 @@
<texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="socks_main_tab" title="Socken"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="socks_main_tab" title="Strümpfe"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/de/panel_edit_tattoo.xml
index c05a3a6645..12649e9251 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_tattoo.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_tattoo.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_tattoo_panel">
<panel name="avatar_tattoo_color_panel">
- <texture_picker label="Kopftattoo" name="Head Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Obere Tattoos" name="Upper Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
- <texture_picker label="Untere Tattoos" name="Lower Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
+ <texture_picker label="Kopftattoo" name="Head Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken" width="80"/>
+ <texture_picker label="Obere Tattoos" name="Upper Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken" width="80"/>
+ <texture_picker label="Untere Tattoos" name="Lower Tattoo" tool_tip="Zum Auswählen eines Bildes hier klicken" width="80"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_underpants.xml b/indra/newview/skins/default/xui/de/panel_edit_underpants.xml
index 4484068c1d..03c61a495d 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_underpants.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_underpants.xml
@@ -4,7 +4,9 @@
<texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="underpants_main_tab" title="Unterhose"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="underpants_main_tab" title="Unterhose"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/de/panel_edit_undershirt.xml
index 847f806fce..39919393e1 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_undershirt.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_undershirt.xml
@@ -4,7 +4,9 @@
<texture_picker label="Stoff" name="Fabric" tool_tip="Zum Auswählen eines Bildes hier klicken"/>
<color_swatch label="Farbe/Ton" name="Color/Tint" tool_tip="Klicken Sie hier, um die Farbauswahl zu öffnen"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="undershirt_main_tab" title="Unterhemd"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="undershirt_main_tab" title="Unterhemd"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_edit_wearable.xml b/indra/newview/skins/default/xui/de/panel_edit_wearable.xml
index c3ffb2f353..7294a0b34f 100644
--- a/indra/newview/skins/default/xui/de/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/de/panel_edit_wearable.xml
@@ -72,7 +72,7 @@
<string name="jacket_desc_text">
Jacke:
</string>
- <string name="skirt_skirt_desc_text">
+ <string name="skirt_desc_text">
Rock:
</string>
<string name="gloves_desc_text">
diff --git a/indra/newview/skins/default/xui/de/panel_friends.xml b/indra/newview/skins/default/xui/de/panel_friends.xml
index 10c5954775..50013a2b24 100644
--- a/indra/newview/skins/default/xui/de/panel_friends.xml
+++ b/indra/newview/skins/default/xui/de/panel_friends.xml
@@ -25,7 +25,7 @@
<button label="IM/Anruf" name="im_btn" tool_tip="Beginnt eine Instant Message-Sitzung"/>
<button label="Profil" name="profile_btn" tool_tip="Bilder, Gruppen und andere Informationen anzeigen"/>
<button label="Teleportieren" name="offer_teleport_btn" tool_tip="Bieten Sie diesem Freund einen Teleport an Ihre Position an"/>
- <button label="Zahlen" name="pay_btn" tool_tip="Diesem Freund Linden-Dollar (L$) geben"/>
+ <button label="Bezahlen" name="pay_btn" tool_tip="Diesem Freund Linden-Dollar (L$) geben"/>
<button label="Entfernen" name="remove_btn" tool_tip="Diese Person von Ihrer Freundesliste entfernen"/>
<button label="Hinzufügen" name="add_btn" tool_tip="Bieten Sie einem Einwohner die Freundschaft an"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_group_general.xml b/indra/newview/skins/default/xui/de/panel_group_general.xml
index 8904193f18..9d4301de73 100644
--- a/indra/newview/skins/default/xui/de/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_general.xml
@@ -11,27 +11,48 @@ Bewegen Sie die Maus über die Optionen, um weitere Informationen anzuzeigen.
<panel.string name="incomplete_member_data_str">
Mitgliedsdaten werden abgerufen
</panel.string>
+ <panel name="group_info_top">
+ <texture_picker label="" name="insignia" tool_tip="Klicken, um ein Bild auszuwählen"/>
+ <text name="prepend_founded_by">
+ Gründer:
+ </text>
+ <name_box initial_value="(wird in Datenbank gesucht)" name="founder_name"/>
+ <text name="join_cost_text">
+ Kostenlos
+ </text>
+ <button label="JETZT BEITRETEN!" name="btn_join"/>
+ </panel>
<text_editor name="charter">
Gruppencharta
</text_editor>
<name_list name="visible_members">
<name_list.columns label="Mitglied" name="name" relwidth="0.40"/>
<name_list.columns label="Titel" name="title" relwidth="0.25"/>
+ <name_list.columns label="Status" name="status"/>
</name_list>
+ <text name="my_group_settngs_label">
+ Ich
+ </text>
<text name="active_title_label">
- Mein Titel
+ Mein Titel:
</text>
<combo_box name="active_title" tool_tip="Legt fest, was im Namensschild Ihres Avatars angezeigt wird, wenn diese Gruppe aktiviert ist."/>
<check_box label="Gruppenmitteilungen erhalten" name="receive_notices" tool_tip="Festlegen, ob Sie von dieser Gruppe Mitteilungen erhalten können. Deaktivieren Sie diese Option, wenn Sie von der Gruppe Spam erhalten."/>
<check_box label="In meinem Profil anzeigen" name="list_groups_in_profile" tool_tip="Steuert, ob diese Gruppe in Ihrem Profil angezeigt wird"/>
<panel name="preferences_container">
- <check_box label="Registrierung offen" name="open_enrollement" tool_tip="Festlegen, ob der Gruppenbeitritt ohne Einladung zulässig ist."/>
- <check_box label="Beitrittsgebühr" name="check_enrollment_fee" tool_tip="Festlegen, ob Neumitglieder eine Beitrittsgebühr zahlen müssen"/>
+ <text name="group_settngs_label">
+ Gruppe
+ </text>
+ <check_box label="Jeder kann beitreten" name="open_enrollement" tool_tip="Festlegen, ob der Gruppenbeitritt ohne Einladung zulässig ist."/>
+ <check_box label="Kosten für Beitritt" name="check_enrollment_fee" tool_tip="Festlegen, ob Neumitglieder eine Beitrittsgebühr zahlen müssen"/>
<spinner label="L$" name="spin_enrollment_fee" tool_tip="Wenn Beitrittsgebühr aktiviert ist, müssen neue Mitglieder diesen Betrag zahlen."/>
- <check_box initial_value="true" label="In Suche anzeigen" name="show_in_group_list" tool_tip="Diese Gruppe in Suchergebnissen anzeigen"/>
<combo_box name="group_mature_check" tool_tip="Legt fest, ob Ihre Gruppeninformation moderate Inhalte enthält">
- <combo_box.item label="Allgemeiner Inhalt" name="pg"/>
+ <combo_item name="select_mature">
+ - Inhaltseinstufung auswählen -
+ </combo_item>
<combo_box.item label="Moderater Inhalt" name="mature"/>
+ <combo_box.item label="Genereller Inhalt" name="pg"/>
</combo_box>
+ <check_box initial_value="true" label="In Suche anzeigen" name="show_in_group_list" tool_tip="Diese Gruppe in Suchergebnissen anzeigen"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/de/panel_group_info_sidetray.xml
index f70291c922..b89e4f90de 100644
--- a/indra/newview/skins/default/xui/de/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_info_sidetray.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Gruppeninfo" name="GroupInfo">
+<panel label="Gruppenprofil" name="GroupInfo">
<panel.string name="default_needs_apply_text">
- In der aktuellen Registerkarte befinden sich ungesicherte Änderungen
+ Diese Änderungen wurden nicht gespeichert.
</panel.string>
<panel.string name="want_apply_text">
Möchten Sie diese Änderungen speichern?
@@ -12,27 +12,24 @@
<panel.string name="group_join_free">
Kostenlos
</panel.string>
- <text name="group_name" value="(Lädt...)"/>
- <line_editor label="Geben Sie Ihren neuen Gruppennamen hier ein" name="group_name_editor"/>
- <texture_picker label="" name="insignia" tool_tip="Klicken Sie, um ein Bild auszuwählen"/>
- <text name="prepend_founded_by">
- Gründer:
- </text>
- <name_box initial_value="(empfange)" name="founder_name"/>
- <text name="join_cost_text">
- Kostenlos
- </text>
- <button label="JETZT BEITRETEN!" name="btn_join"/>
- <accordion name="groups_accordion">
- <accordion_tab name="group_general_tab" title="Allgemein"/>
- <accordion_tab name="group_roles_tab" title="Rollen"/>
- <accordion_tab name="group_notices_tab" title="Mitteilungen"/>
- <accordion_tab name="group_land_tab" title="Land/Kapital"/>
- </accordion>
- <panel name="button_row">
- <button label="Erstellen" label_selected="Neue Gruppe" name="btn_create"/>
- <button label="Gruppen-Chat" name="btn_chat"/>
- <button label="Gruppe anrufen" name="btn_call"/>
- <button label="Speichern" label_selected="Speichern" name="btn_apply"/>
+ <panel name="group_info_top">
+ <text name="group_name" value="(wird geladen...)"/>
+ <line_editor label="Neuen Gruppennamen hier eingeben" name="group_name_editor"/>
</panel>
+ <layout_stack name="layout">
+ <layout_panel name="group_accordions">
+ <accordion name="groups_accordion">
+ <accordion_tab name="group_general_tab" title="Allgemein"/>
+ <accordion_tab name="group_roles_tab" title="Rollen"/>
+ <accordion_tab name="group_notices_tab" title="Mitteilungen"/>
+ <accordion_tab name="group_land_tab" title="Land/Kapital"/>
+ </accordion>
+ </layout_panel>
+ <layout_panel name="button_row">
+ <button label="Chat" name="btn_chat"/>
+ <button label="Gruppe anrufen" name="btn_call" tool_tip="Diese Gruppe anrufen"/>
+ <button label="Speichern" label_selected="Speichern" name="btn_apply"/>
+ <button label="Gruppe erstellen" name="btn_create" tool_tip="Neue Gruppe erstellen"/>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_group_invite.xml b/indra/newview/skins/default/xui/de/panel_group_invite.xml
index 8e1fb5e4b2..4e3a304609 100644
--- a/indra/newview/skins/default/xui/de/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_invite.xml
@@ -10,7 +10,7 @@
Einige der ausgewählten Einwohner sind bereits Gruppenmitglieder und haben aus diesem Grund keine Einladung erhalten.
</panel.string>
<text name="help_text">
- Sie können mehrere Einwohner auswählen, um diese in Ihre Gruppe einzuladen. Klicken Sie hierzu auf „Einwohnerliste öffnen“.
+ Sie können mehrere Einwohner Ihre Gruppe einladen. Klicken Sie hierzu auf „Einwohnerliste öffnen“.
</text>
<button label="Einwohnerliste öffnen" name="add_button" tool_tip=""/>
<name_list name="invitee_list" tool_tip="Halten Sie zur Mehrfachauswahl die Strg-Taste gedrückt und klicken Sie auf die Namen."/>
diff --git a/indra/newview/skins/default/xui/de/panel_group_land_money.xml b/indra/newview/skins/default/xui/de/panel_group_land_money.xml
index e9743c5d5d..0c89946987 100644
--- a/indra/newview/skins/default/xui/de/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_land_money.xml
@@ -1,65 +1,62 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Land und L$" name="land_money_tab">
- <string name="help_text">
+ <panel.string name="help_text">
Ein Warnhinweis wird angezeigt, solange der Wert für das insgesamt verwendete Land gleich oder weniger ist als der Gesamtbeitrag.
- </string>
- <button label="?" name="help_button"/>
- <string name="cant_view_group_land_text">
+ </panel.string>
+ <panel.string name="cant_view_group_land_text">
Sie sind nicht berechtigt, Landeigentum der Gruppe anzuzeigen.
- </string>
- <string name="cant_view_group_accounting_text">
+ </panel.string>
+ <panel.string name="cant_view_group_accounting_text">
Sie sind nicht berechtigt, die Finanzinformationen der Gruppe anzuzeigen.
- </string>
- <string name="loading_txt">
+ </panel.string>
+ <panel.string name="loading_txt">
Wird geladen...
- </string>
- <text name="group_land_heading">
- Land in Gruppenbesitz
- </text>
- <scroll_list name="group_parcel_list">
- <column label="Parzelle" name="name"/>
- <column label="Region" name="location"/>
- <column label="Typ" name="type"/>
- <column label="Gebiet" name="area"/>
- <column label="" name="hidden"/>
- </scroll_list>
- <button label="Karte" label_selected="Karte" name="map_button"/>
- <text name="total_contributed_land_label">
- Gesamtbeitrag:
- </text>
- <text name="total_contributed_land_value">
- [AREA] m².
- </text>
- <text name="total_land_in_use_label">
- Insgesamt verwendetes Land:
- </text>
- <text name="total_land_in_use_value">
- [AREA] m².
- </text>
- <text name="land_available_label">
- Land verfügbar:
- </text>
- <text name="land_available_value">
- [AREA] m².
- </text>
- <text name="your_contribution_label">
- Ihr Beitrag:
- </text>
- <string name="land_contrib_error">
+ </panel.string>
+ <panel.string name="land_contrib_error">
Ihr Landbeitrag kann nicht festgelegt werden.
- </string>
- <text name="your_contribution_units">
- m²
- </text>
- <text name="your_contribution_max_value">
- ([AMOUNT] max.)
- </text>
- <text name="group_over_limit_text">
- Um das benutzte Land zu unterstützen, sind weitere Landnutzungsrechte erforderlich.
- </text>
- <text name="group_money_heading">
- Gruppen-L$
- </text>
+ </panel.string>
+ <panel name="layout_panel_landmoney">
+ <scroll_list name="group_parcel_list">
+ <scroll_list.columns label="Parzelle" name="name"/>
+ <scroll_list.columns label="Region" name="location"/>
+ <scroll_list.columns label="Typ" name="type"/>
+ <scroll_list.columns label="Gebiet" name="area"/>
+ </scroll_list>
+ <text name="total_contributed_land_label">
+ Gesamtbeitrag:
+ </text>
+ <text name="total_contributed_land_value">
+ [AREA] m².
+ </text>
+ <button label="Karte" label_selected="Karte" name="map_button"/>
+ <text name="total_land_in_use_label">
+ Insgesamt genutztes Land:
+ </text>
+ <text name="total_land_in_use_value">
+ [AREA] m².
+ </text>
+ <text name="land_available_label">
+ Land verfügbar:
+ </text>
+ <text name="land_available_value">
+ [AREA] m².
+ </text>
+ <text name="your_contribution_label">
+ Ihr Beitrag:
+ </text>
+ <text name="your_contribution_units">
+ m²
+ </text>
+ <text name="your_contribution_max_value">
+ ([AMOUNT] max.)
+ </text>
+ <text name="group_over_limit_text">
+ Um das benutzte Land zu unterstützen, sind weitere Landnutzungsrechte erforderlich.
+ </text>
+ <text name="group_money_heading">
+ Gruppen-L$
+ </text>
+ </panel>
<tab_container name="group_money_tab_container">
<panel label="PLANUNG" name="group_money_planning_tab">
<text_editor name="group_money_planning_text">
@@ -82,89 +79,3 @@
</panel>
</tab_container>
</panel>
-<!--
-
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Land und L$" name="land_money_tab">
- <string name="help_text">
- Parzellen in Gruppenbesitz werden zusammen mit Beitragsdetails angezeigt. Ein Warnhinweis wird angezeigt, solange der Wert für das insgesamt verwendete Land gleich oder weniger ist als der Gesamtbeitrag. Die Registerkarten „Planung“, „Details“ und „Verkäufe“ enthalten Informationen über die Gruppenfinanzen.
- </string>
- <button label="?" name="help_button"/>
- <string name="cant_view_group_land_text">
- Sie sind nicht berechtigt, Landeigentum der Gruppe anzuzeigen.
- </string>
- <string name="cant_view_group_accounting_text">
- Sie sind nicht berechtigt, die Finanzinformationen der Gruppe anzuzeigen.
- </string>
- <string name="loading_txt">
- Wird geladen...
- </string>
- <text name="group_land_heading">
- Land in Gruppenbesitz
- </text>
- <scroll_list name="group_parcel_list">
- <column label="Parzellenname" name="name"/>
- <column label="Region" name="location"/>
- <column label="Typ" name="type"/>
- <column label="Gebiet" name="area"/>
- <column label="" name="hidden"/>
- </scroll_list>
- <button label="Auf Karte" label_selected="Auf Karte" name="map_button"/>
- <text name="total_contributed_land_label">
- Gesamtbeitrag:
- </text>
- <text name="total_contributed_land_value">
- [AREA] qm
- </text>
- <text name="total_land_in_use_label">
- Insgesamt verwendetes Land:
- </text>
- <text name="total_land_in_use_value">
- [AREA] qm
- </text>
- <text name="land_available_label">
- Land verfügbar:
- </text>
- <text name="land_available_value">
- [AREA] qm
- </text>
- <text name="your_contribution_label">
- Ihr Beitrag:
- </text>
- <string name="land_contrib_error">
- Ihr Landbeitrag kann nicht festgelegt werden.
- </string>
- <text name="your_contribution_max_value">
- qm (max. [AMOUNT])
- </text>
- <text name="group_over_limit_text">
- Die Gruppenmitglieder müssen mehr Landnutzungsrechte spenden, damit
-das verwendete Land gehalten werden kann.
- </text>
- <text name="group_money_heading">
- Gruppen-L$
- </text>
- <tab_container name="group_money_tab_container">
- <panel label="Planung" name="group_money_planning_tab">
- <text_editor name="group_money_planning_text">
- Wird berechnet...
- </text_editor>
- </panel>
- <panel label="Details" name="group_money_details_tab">
- <text_editor name="group_money_details_text">
- Wird berechnet...
- </text_editor>
- <button label="&lt; Früher" label_selected="&lt; Früher" name="earlier_details_button" tool_tip="Zurück in der Zeit"/>
- <button label="Später &gt;" label_selected="Später &gt;" name="later_details_button" tool_tip="Weiter in der Zeit"/>
- </panel>
- <panel label="Verkäufe" name="group_money_sales_tab">
- <text_editor name="group_money_sales_text">
- Wird berechnet...
- </text_editor>
- <button label="&lt; Früher" label_selected="&lt; Früher" name="earlier_sales_button" tool_tip="Zurück in der Zeit"/>
- <button label="Später &gt;" label_selected="Später &gt;" name="later_sales_button" tool_tip="Weiter in der Zeit"/>
- </panel>
- </tab_container>
-</panel>
-
--->
diff --git a/indra/newview/skins/default/xui/de/panel_group_notices.xml b/indra/newview/skins/default/xui/de/panel_group_notices.xml
index d2ba40ae2c..cc5664bd97 100644
--- a/indra/newview/skins/default/xui/de/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_notices.xml
@@ -37,9 +37,9 @@ Maximal 200 pro Gruppe täglich
Anhängen:
</text>
<text name="string">
- Das Objekt hierin ziehen und ablegen, um es anzuhängen:
+ Das Objekt hierhin ziehen und ablegen, um es anzuhängen:
</text>
- <button label="Entfernen" label_selected="Anhang entfernen" name="remove_attachment"/>
+ <button label="Entfernen" label_selected="Anhang entfernen" name="remove_attachment" tool_tip="Anhang von Ihrer Benachrichtigung entfernen"/>
<button label="Senden" label_selected="Senden" name="send_notice"/>
<group_drop_target name="drop_target" tool_tip="Ziehen Sie ein Objekt aus Ihrem Inventar auf dieses Feld, um es mit dieser Mitteilung zu versenden. Um das Objekt anhängen zu können, müssen Sie die Erlaubnis zum Kopieren und Übertragen besitzen."/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_group_notify.xml b/indra/newview/skins/default/xui/de/panel_group_notify.xml
index cb4c6cdb39..9c05e99786 100644
--- a/indra/newview/skins/default/xui/de/panel_group_notify.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_notify.xml
@@ -4,7 +4,7 @@
<string name="subject_font" value="SANSSERIF_BIG"/>
<string name="date_font" value="SANSSERIF"/>
<panel label="Überschrift" name="header">
- <text name="title" value="Name des Absenders / Gruppenname"/>
+ <text name="title" value="Absender/Gruppenname"/>
</panel>
<text_editor name="message" value="Nachricht"/>
<text name="attachment" value="Anhang"/>
diff --git a/indra/newview/skins/default/xui/de/panel_group_roles.xml b/indra/newview/skins/default/xui/de/panel_group_roles.xml
index 3103fd65b1..db5186e081 100644
--- a/indra/newview/skins/default/xui/de/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/de/panel_group_roles.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Mitglieder und Rollen" name="roles_tab">
<panel.string name="default_needs_apply_text">
- Die Registerkarte enthält nicht gespeicherte Änderungen.
+ Diese Änderungen wurden nicht gespeichert.
</panel.string>
<panel.string name="want_apply_text">
Möchten Sie Ihre Änderungen speichern?
@@ -15,8 +15,8 @@ um mehrere Mitglieder auszuwählen.
</panel.string>
<filter_editor label="Mitglieder filtern" name="filter_input"/>
<name_list name="member_list">
- <name_list.columns label="Mitglied" name="name"/>
- <name_list.columns label="Übereignung" name="donated"/>
+ <name_list.columns label="Mitglied" name="name" relative_width="0.30"/>
+ <name_list.columns label="Übereignung" name="donated" relative_width="0.33"/>
<name_list.columns label="Status" name="online"/>
</name_list>
<button label="Einladen" name="member_invite"/>
diff --git a/indra/newview/skins/default/xui/de/panel_groups.xml b/indra/newview/skins/default/xui/de/panel_groups.xml
index 95a2ef14f9..f857a6c7ac 100644
--- a/indra/newview/skins/default/xui/de/panel_groups.xml
+++ b/indra/newview/skins/default/xui/de/panel_groups.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel name="groups">
- <text name="groupdesc">
+ <text name="groupdesc" width="300">
Die derzeit aktive Gruppe ist fett hervorgehoben.
</text>
- <text name="groupcount">
+ <text name="groupcount" width="360">
Sie sind Mitglied bei [COUNT] Gruppen (von max. [MAX]).
</text>
<button label="IM/Anruf" name="IM" tool_tip="Beginnt eine Instant Message-Sitzung" />
diff --git a/indra/newview/skins/default/xui/de/panel_im_control_panel.xml b/indra/newview/skins/default/xui/de/panel_im_control_panel.xml
index 8132f769cb..abf8011d9d 100644
--- a/indra/newview/skins/default/xui/de/panel_im_control_panel.xml
+++ b/indra/newview/skins/default/xui/de/panel_im_control_panel.xml
@@ -9,11 +9,14 @@
<button label="Freund hinzufügen" name="add_friend_btn"/>
</layout_panel>
<layout_panel name="teleport_btn_panel">
- <button label="Teleportieren" name="teleport_btn"/>
+ <button label="Teleportieren" name="teleport_btn" tool_tip="Dieser Person einen Teleport anbieten."/>
</layout_panel>
<layout_panel name="share_btn_panel">
<button label="Teilen" name="share_btn"/>
</layout_panel>
+ <layout_panel name="pay_btn_panel">
+ <button label="Bezahlen" name="pay_btn"/>
+ </layout_panel>
<layout_panel name="call_btn_panel">
<button label="Anrufen" name="call_btn"/>
</layout_panel>
diff --git a/indra/newview/skins/default/xui/de/panel_inventory_item.xml b/indra/newview/skins/default/xui/de/panel_inventory_item.xml
new file mode 100644
index 0000000000..d18047fbcf
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_inventory_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="inventory_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_landmark_info.xml b/indra/newview/skins/default/xui/de/panel_landmark_info.xml
index 9cef7b6d35..10cf34c170 100644
--- a/indra/newview/skins/default/xui/de/panel_landmark_info.xml
+++ b/indra/newview/skins/default/xui/de/panel_landmark_info.xml
@@ -18,9 +18,6 @@
<string name="acquired_date">
[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
</string>
- <string name="icon_PG" value="parcel_drk_PG"/>
- <string name="icon_M" value="parcel_drk_M"/>
- <string name="icon_R" value="parcel_drk_R"/>
<button name="back_btn" tool_tip="Hinten"/>
<text name="title" value="Ortsprofil"/>
<scroll_container name="place_scroll">
diff --git a/indra/newview/skins/default/xui/de/panel_landmarks.xml b/indra/newview/skins/default/xui/de/panel_landmarks.xml
index 3336232782..db12462a31 100644
--- a/indra/newview/skins/default/xui/de/panel_landmarks.xml
+++ b/indra/newview/skins/default/xui/de/panel_landmarks.xml
@@ -2,7 +2,7 @@
<panel name="Landmarks">
<accordion name="landmarks_accordion">
<accordion_tab name="tab_favorites" title="Favoritenleiste"/>
- <accordion_tab name="tab_landmarks" title="Landmarken"/>
+ <accordion_tab name="tab_landmarks" title="Meine Landmarken"/>
<accordion_tab name="tab_inventory" title="Mein Inventar"/>
<accordion_tab name="tab_library" title="Bibliothek"/>
</accordion>
diff --git a/indra/newview/skins/default/xui/de/panel_login.xml b/indra/newview/skins/default/xui/de/panel_login.xml
index bd82fc6872..2a6ea42c73 100644
--- a/indra/newview/skins/default/xui/de/panel_login.xml
+++ b/indra/newview/skins/default/xui/de/panel_login.xml
@@ -23,7 +23,7 @@
<text name="start_location_text">
Hier anfangen:
</text>
- <combo_box name="start_location_combo">
+ <combo_box name="start_location_combo" width="150">
<combo_box.item label="Mein letzter Standort" name="MyLastLocation"/>
<combo_box.item label="Mein Zuhause" name="MyHome"/>
<combo_box.item label="&lt;Region eingeben&gt;" name="Typeregionname"/>
diff --git a/indra/newview/skins/default/xui/de/panel_main_inventory.xml b/indra/newview/skins/default/xui/de/panel_main_inventory.xml
index aa0b43b550..d3eb9ae04c 100644
--- a/indra/newview/skins/default/xui/de/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/de/panel_main_inventory.xml
@@ -1,18 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Sonstiges" name="main inventory panel">
- <panel.string name="Title">
- Sonstiges
+ <panel.string name="ItemcountFetching">
+ Inventar ([ITEM_COUNT] Artikel werden abgerufen... [FILTER]
</panel.string>
- <filter_editor label="Inventar filtern" name="inventory search editor"/>
- <tab_container name="inventory filter tabs">
- <inventory_panel label="MEIN INVENTAR" name="All Items"/>
- <inventory_panel label="AKTUELL" name="Recent Items"/>
- </tab_container>
- <panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="Zusätzliche Optionen anzeigen"/>
- <button name="add_btn" tool_tip="Neues Objekt hinzufügen"/>
- <dnd_button name="trash_btn" tool_tip="Auswahl löschen"/>
- </panel>
+ <panel.string name="ItemcountCompleted">
+ [ITEM_COUNT] Objekte [FILTER]
+ </panel.string>
+ <text name="ItemcountText">
+ Objekte:
+ </text>
<menu_bar name="Inventory Menu">
<menu label="Datei" name="File">
<menu_item_call label="Öffnen" name="Open"/>
@@ -44,7 +40,7 @@
<menu_item_call label="Neue Handschuhe" name="New Gloves"/>
<menu_item_call label="Neues Unterhemd" name="New Undershirt"/>
<menu_item_call label="Neue Unterhose" name="New Underpants"/>
- <menu_item_call label="Alpha: Neu" name="New Alpha"/>
+ <menu_item_call label="Neues Alpha" name="New Alpha"/>
<menu_item_call label="Neue Tätowierung" name="New Tattoo"/>
</menu>
<menu label="Neue Körperteile" name="New Body Parts">
@@ -57,8 +53,18 @@
<menu label="Sortieren" name="Sort">
<menu_item_check label="Nach Name" name="By Name"/>
<menu_item_check label="Nach Datum" name="By Date"/>
- <menu_item_check label="Ordner immer nach Name" name="Folders Always By Name"/>
+ <menu_item_check label="Ordner immer nach Namen" name="Folders Always By Name"/>
<menu_item_check label="Systemordner nach oben" name="System Folders To Top"/>
</menu>
</menu_bar>
+ <filter_editor label="Inventar filtern" name="inventory search editor"/>
+ <tab_container name="inventory filter tabs">
+ <inventory_panel label="MEIN INVENTAR" name="All Items"/>
+ <inventory_panel label="AKTUELL" name="Recent Items"/>
+ </tab_container>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Zusätzliche Optionen anzeigen"/>
+ <button name="add_btn" tool_tip="Neues Objekt hinzufügen"/>
+ <dnd_button name="trash_btn" tool_tip="Auswahl löschen"/>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_me.xml b/indra/newview/skins/default/xui/de/panel_me.xml
index c61fc26f4c..26b9812212 100644
--- a/indra/newview/skins/default/xui/de/panel_me.xml
+++ b/indra/newview/skins/default/xui/de/panel_me.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Mein Profil" name="panel_me">
<tab_container name="tabs">
- <panel label="PROFIL" name="panel_profile"/>
- <panel label="AUSWAHL" name="panel_picks"/>
+ <panel label="MEIN PROFIL" name="panel_profile"/>
+ <panel label="MEINE AUSWAHL" name="panel_picks"/>
</tab_container>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/de/panel_media_settings_permissions.xml
index 7ee0074a3b..dd408b8275 100644
--- a/indra/newview/skins/default/xui/de/panel_media_settings_permissions.xml
+++ b/indra/newview/skins/default/xui/de/panel_media_settings_permissions.xml
@@ -11,10 +11,19 @@
Mini
</combo_item>
</combo_box>
+ <text name="owner_label">
+ Eigentümer
+ </text>
<check_box initial_value="false" label="Naviation &amp; Interaktion zulassen" name="perms_owner_interact"/>
<check_box initial_value="false" label="Steuerungsleiste anzeigen" name="perms_owner_control"/>
+ <text name="group_label">
+ Gruppe:
+ </text>
<check_box initial_value="false" label="Naviation &amp; Interaktion zulassen" name="perms_group_interact"/>
<check_box initial_value="false" label="Steuerungsleiste anzeigen" name="perms_group_control"/>
+ <text name="anyone_label">
+ Jeder
+ </text>
<check_box initial_value="false" label="Naviation &amp; Interaktion zulassen" name="perms_anyone_interact"/>
<check_box initial_value="false" label="Steuerungsleiste anzeigen" name="perms_anyone_control"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_media_settings_security.xml b/indra/newview/skins/default/xui/de/panel_media_settings_security.xml
index 8ff013f66b..adc0d22ce6 100644
--- a/indra/newview/skins/default/xui/de/panel_media_settings_security.xml
+++ b/indra/newview/skins/default/xui/de/panel_media_settings_security.xml
@@ -2,7 +2,8 @@
<panel label="Sicherheit" name="Media Settings Security">
<check_box initial_value="false" label="Nur Zugriff auf festgelegte URL-Muster zulassen" name="whitelist_enable"/>
<text name="home_url_fails_some_items_in_whitelist">
- Einträge, die für die Startseite nicht akzeptiert werden, sind markiert:
+ Einträge, die für die Startseite nicht akzeptiert
+werden, sind markiert:
</text>
<button label="Hinzufügen" name="whitelist_add"/>
<button label="Löschen" name="whitelist_del"/>
diff --git a/indra/newview/skins/default/xui/de/panel_my_profile.xml b/indra/newview/skins/default/xui/de/panel_my_profile.xml
index 618ed88846..55eed89848 100644
--- a/indra/newview/skins/default/xui/de/panel_my_profile.xml
+++ b/indra/newview/skins/default/xui/de/panel_my_profile.xml
@@ -30,11 +30,14 @@
</panel>
<text name="title_member_text" value="Einwohner seit:"/>
<text name="title_acc_status_text" value="Kontostatus:"/>
- <text name="acc_status_text">
+ <text_editor name="acc_status_text">
Einwohner. Keine Zahlungsinfo archiviert.
Linden.
- </text>
+ </text_editor>
<text name="title_partner_text" value="Partner:"/>
+ <panel name="partner_data_panel">
+ <name_box initial_value="(wird in Datenbank gesucht)" name="partner_text"/>
+ </panel>
<text name="title_groups_text" value="Gruppen:"/>
</panel>
</scroll_container>
diff --git a/indra/newview/skins/default/xui/de/panel_navigation_bar.xml b/indra/newview/skins/default/xui/de/panel_navigation_bar.xml
index ab59c207bf..99293edd0f 100644
--- a/indra/newview/skins/default/xui/de/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/de/panel_navigation_bar.xml
@@ -1,15 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="navigation_bar">
<panel name="navigation_panel">
- <button name="back_btn" tool_tip="Zurück zum vorherigen Standort gehen"/>
- <button name="forward_btn" tool_tip="Um einen Standort weiter gehen"/>
- <button name="home_btn" tool_tip="Zu meinem Heimatort teleportieren"/>
+ <pull_button name="back_btn" tool_tip="Zurück zum vorherigen Standort gehen"/>
+ <pull_button name="forward_btn" tool_tip="Um einen Standort weiter gehen"/>
+ <button name="home_btn" tool_tip="Zu meinem Zuhause teleportieren"/>
<location_input label="Standort" name="location_combo"/>
<search_combo_box label="Suche" name="search_combo_box" tool_tip="Suche">
<combo_editor label="[SECOND_LIFE] durchsuchen" name="search_combo_editor"/>
</search_combo_box>
</panel>
- <favorites_bar name="favorite">
+ <favorites_bar name="favorite" tool_tip="Ziehen Sie Landmarken hier hin, damit Sie schnell zu Ihren Lieblingsplätzen in Second Life gelangen können!">
+ <label name="favorites_bar_label" tool_tip="Ziehen Sie Landmarken hier hin, damit Sie schnell zu Ihren Lieblingsplätzen in Second Life gelangen können!">
+ Favoritenleiste
+ </label>
<chevron_button name="&gt;&gt;" tool_tip="Mehr meiner Favoriten anzeigen"/>
</favorites_bar>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_nearby_chat.xml b/indra/newview/skins/default/xui/de/panel_nearby_chat.xml
index 699bddc6eb..3f4f5a71b5 100644
--- a/indra/newview/skins/default/xui/de/panel_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/de/panel_nearby_chat.xml
@@ -2,7 +2,7 @@
<!-- All our XML is utf-8 encoded. -->
<panel name="nearby_chat">
<panel name="chat_caption">
- <text name="sender_name">
+ <text name="sender_name" width="200">
CHAT IN DER NÄHE
</text>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/de/panel_nearby_chat_bar.xml
index 5e6e460c65..08cc0b0ec8 100644
--- a/indra/newview/skins/default/xui/de/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/de/panel_nearby_chat_bar.xml
@@ -1,11 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="chat_bar">
- <string name="min_width">
- 192
- </string>
- <string name="max_width">
- 320
- </string>
<line_editor label="Zum Chatten hier klicken." name="chat_box" tool_tip="Eingabe drücken, um zu sprechen, Strg-Eingabe drücken, um zu Rufen."/>
<button name="show_nearby_chat" tool_tip="Protokoll des Chats in der Nähe anzeigen/ausblenden"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_nearby_media.xml b/indra/newview/skins/default/xui/de/panel_nearby_media.xml
new file mode 100644
index 0000000000..e633ae1dde
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_nearby_media.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_media">
+ <string name="media_item_count_format">
+ (%ls Medien-Objekte)
+ </string>
+ <string name="empty_item_text">
+ &lt;leer&gt;
+ </string>
+ <string name="parcel_media_name">
+ Streaming-Medien auf Parzelle
+ </string>
+ <string name="parcel_audio_name">
+ Streaming-Audio auf Parzelle
+ </string>
+ <string name="playing_suffix">
+ (wird abgespielt)
+ </string>
+ <panel name="minimized_controls">
+ <button label="Stoppen" name="all_nearby_media_disable_btn" tool_tip="Alle Medien in der Nähe ausschalten"/>
+ <button label="Starten" name="all_nearby_media_enable_btn" tool_tip="Alle Medien in der Nähe einschalten"/>
+ <button name="open_prefs_btn" tool_tip="Medien-Einstellungen öffnen"/>
+ <button label="Mehr &gt;&gt;" label_selected="Weniger &lt;&lt;" name="more_btn" tool_tip="Erweiterte Steuerung"/>
+ <button label="Mehr &gt;&gt;" label_selected="Weniger &lt;&lt;" name="less_btn" tool_tip="Erweiterte Steuerung"/>
+ </panel>
+ <panel name="nearby_media_panel">
+ <combo_box name="show_combo">
+ <combo_box.item label="Alle" name="All"/>
+ <combo_box.item label="Auf dieser Parzelle" name="WithinParcel"/>
+ <combo_box.item label="Außerhalb dieser Parzelle" name="OutsideParcel"/>
+ <combo_box.item label="An anderen Avataren" name="OnOthers"/>
+ </combo_box>
+ <scroll_list name="media_list">
+ <scroll_list.columns label="Umgebung" name="media_proximity"/>
+ <scroll_list.columns label="Sichtbar" name="media_visibility"/>
+ <scroll_list.columns label="Klasse" name="media_class"/>
+ <scroll_list.columns label="Name" name="media_name"/>
+ <scroll_list.columns label="Fehler beseitigen" name="media_debug"/>
+ </scroll_list>
+ <panel>
+ <layout_stack name="media_controls">
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="Ausgewählte Medien stoppen"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="Ausgewählte Medien wiedergeben"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="Ausgewählte Medien pausieren"/>
+ </layout_panel>
+ <layout_panel name="volume_slider_ctrl">
+ <slider_bar initial_value="0.5" name="volume_slider" tool_tip="Lautstärke für ausgewählte Medien"/>
+ </layout_panel>
+ <layout_panel name="mute">
+ <button name="mute_btn" tool_tip="Audio für ausgewählte Medien stummschalten"/>
+ </layout_panel>
+ <layout_panel name="zoom">
+ <button name="zoom_btn" tool_tip="Auf ausgewählte Medien zoomen"/>
+ </layout_panel>
+ <layout_panel name="unzoom">
+ <button name="unzoom_btn" tool_tip="Von ausgewählten Medien wegzoomen"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_notes.xml b/indra/newview/skins/default/xui/de/panel_notes.xml
index e6a63fc0c8..374c117cdd 100644
--- a/indra/newview/skins/default/xui/de/panel_notes.xml
+++ b/indra/newview/skins/default/xui/de/panel_notes.xml
@@ -13,10 +13,10 @@
</scroll_container>
</layout_panel>
<layout_panel name="notes_buttons_panel">
- <button label="Freund hinzufügen" name="add_friend" tool_tip="Bieten Sie dem Einwohner die Freundschaft an"/>
- <button label="IM" name="im" tool_tip="Instant Messenger öffnen"/>
+ <button label="Freund hinzufügen" name="add_friend" tool_tip="Bieten Sie dem Einwohner die Freundschaft an" width="109"/>
+ <button label="IM" name="im" tool_tip="Instant Messenger öffnen" width="24"/>
<button label="Anrufen" name="call" tool_tip="Diesen Einwohner anrufen"/>
- <button label="Karte" name="show_on_map_btn" tool_tip="Einwohner auf Karte anzeigen"/>
+ <button label="Karte" name="show_on_map_btn" tool_tip="Einwohner auf Karte anzeigen" width="40"/>
<button label="Teleportieren" name="teleport" tool_tip="Teleport anbieten"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/de/panel_online_status.xml b/indra/newview/skins/default/xui/de/panel_online_status.xml
new file mode 100644
index 0000000000..7c7448c061
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_online_status.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Freunde_online_Status" name="friend_online_status"/>
diff --git a/indra/newview/skins/default/xui/de/panel_online_status_toast.xml b/indra/newview/skins/default/xui/de/panel_online_status_toast.xml
new file mode 100644
index 0000000000..7c7448c061
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_online_status_toast.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Freunde_online_Status" name="friend_online_status"/>
diff --git a/indra/newview/skins/default/xui/de/panel_outfit_edit.xml b/indra/newview/skins/default/xui/de/panel_outfit_edit.xml
new file mode 100644
index 0000000000..91ba94b3d6
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_outfit_edit.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray Outfit Edit panel -->
+<panel label="Outfit bearbeiten" name="outfit_edit">
+ <string name="No Outfit" value="Kein Outfit"/>
+ <panel.string name="not_available">
+ k.A.
+ </panel.string>
+ <panel.string name="unknown">
+ (unbekannt)
+ </panel.string>
+ <string name="Filter.All" value="Alle"/>
+ <string name="Filter.Clothes/Body" value="Kleider/Körper"/>
+ <string name="Filter.Objects" value="Objekte"/>
+ <string name="Filter.Custom" value="Benutzerspezifischer Filter"/>
+ <text name="title" value="Outfit bearbeiten"/>
+ <panel label="bottom_panel" name="header_panel">
+ <panel label="bottom_panel" name="outfit_name_and_status">
+ <text name="status" value="Wird bearbeitet..."/>
+ <text name="curr_outfit_name" value="[Aktuelles Outfit]"/>
+ </panel>
+ </panel>
+ <layout_stack name="im_panels">
+ <layout_panel label="IM Steuerkonsole" name="outfit_wearables_panel">
+ <layout_stack name="filter_panels">
+ <layout_panel name="add_button_and_combobox">
+ <button label="Mehr hinzufügen" name="show_add_wearables_btn"/>
+ </layout_panel>
+ <layout_panel name="filter_panel">
+ <filter_editor label="Tragbare Inventarobjekte filtern" name="look_item_filter"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="add_wearables_panel"/>
+ </layout_stack>
+ <panel name="save_revert_button_bar">
+ <button label="Speichern" name="save_btn"/>
+ <button label="Zurücksetzen" name="revert_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/de/panel_outfits_inventory.xml
index 8d2dd84512..8b04cecd68 100644
--- a/indra/newview/skins/default/xui/de/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/de/panel_outfits_inventory.xml
@@ -1,14 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Sonstiges" name="Outfits">
<tab_container name="appearance_tabs">
- <inventory_panel label="MEINE OUTFITS" name="outfitslist_tab"/>
- <inventory_panel label="AKTUELLES OUTFIT" name="cof_accordionpanel"/>
+ <panel label="MEINE OUTFITS" name="outfitslist_tab"/>
+ <inventory_panel label="AKTUELLES OUTFIT" name="cof_tab"/>
</tab_container>
<panel name="bottom_panel">
<button name="options_gear_btn" tool_tip="Zusätzliche Optionen anzeigen"/>
<dnd_button name="trash_btn" tool_tip="Auswahl löschen"/>
- <button label="Outfit speichern" name="make_outfit_btn" tool_tip="Aussehen als Outfit speichern"/>
+ <button label="Speichern unter" name="save_btn"/>
<button label="Anziehen" name="wear_btn" tool_tip="Ausgewähltes Outfit tragen"/>
- <button label="M" name="look_edit_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_people.xml b/indra/newview/skins/default/xui/de/panel_people.xml
index 91a17e127a..59cc3a8b70 100644
--- a/indra/newview/skins/default/xui/de/panel_people.xml
+++ b/indra/newview/skins/default/xui/de/panel_people.xml
@@ -1,13 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Side tray panel -->
<panel label="Leute" name="people_panel">
- <string name="no_people" value="Keine Leute"/>
- <string name="no_one_near" value="Keiner in der Nähe"/>
+ <string name="no_recent_people" value="Hier sind keine Leute. Sie suchen nach Leuten? Verwenden Sie die [secondlife:///app/search/people Suche] oder die [secondlife:///app/worldmap Karte]."/>
+ <string name="no_filtered_recent_people" value="Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/people Suche]."/>
+ <string name="no_one_near" value="Es ist niemand in der Nähe. Sie suchen nach Leuten? Verwenden Sie die [secondlife:///app/search/people Suche] oder die [secondlife:///app/worldmap Karte]."/>
+ <string name="no_one_filtered_near" value="Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/people Suche]."/>
<string name="no_friends_online" value="Keine Freunde online"/>
<string name="no_friends" value="Keine Freunde"/>
- <string name="no_groups" value="Keine Gruppen"/>
+ <string name="no_friends_msg">
+ Verwenden Sie die [secondlife:///app/search/people Suche], um Freunde zu finden. Oder klicken Sie mit rechts auf einen Einwohner und fügen Sie diesen als Freund hinzu.
+Sie suchen nach Leuten? Verwenden Sie die [secondlife:///app/worldmap Karte].
+ </string>
+ <string name="no_filtered_friends_msg">
+ Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/people Suche].
+ </string>
<string name="people_filter_label" value="Nach Leuten filtern"/>
<string name="groups_filter_label" value="Nach Gruppen filtern"/>
+ <string name="no_filtered_groups_msg" value="Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/groups Suche]."/>
+ <string name="no_groups_msg" value="Suchen Sie nach Gruppen? Versuchen Sie es mit der [secondlife:///app/search/groups Suche]."/>
<filter_editor label="Filter" name="filter_input"/>
<tab_container name="tabs">
<panel label="IN DER NÄHE" name="nearby_panel">
@@ -16,7 +26,7 @@
<button name="add_friend_btn" tool_tip="Ausgewählten Einwohner zur Freundeliste hinzufügen"/>
</panel>
</panel>
- <panel label="FREUNDE" name="friends_panel">
+ <panel label="MEINE FREUNDE" name="friends_panel">
<accordion name="friends_accordion">
<accordion_tab name="tab_online" title="Online"/>
<accordion_tab name="tab_all" title="Alle"/>
@@ -27,7 +37,7 @@
<button name="del_btn" tool_tip="Ausgewählte Person von Ihrer Freundesliste entfernen"/>
</panel>
</panel>
- <panel label="GRUPPEN" name="groups_panel">
+ <panel label="MEINE GRUPPEN" name="groups_panel">
<panel label="bottom_panel" name="bottom_panel">
<button name="groups_viewsort_btn" tool_tip="Optionen"/>
<button name="plus_btn" tool_tip="Gruppe beitreten/Neue Gruppe erstellen"/>
diff --git a/indra/newview/skins/default/xui/de/panel_picks.xml b/indra/newview/skins/default/xui/de/panel_picks.xml
index a07bc170f6..df68381082 100644
--- a/indra/newview/skins/default/xui/de/panel_picks.xml
+++ b/indra/newview/skins/default/xui/de/panel_picks.xml
@@ -11,7 +11,7 @@
</panel>
<panel name="buttons_cucks">
<button label="Info" name="info_btn" tool_tip="Auswahl-Information anzeigen"/>
- <button label="Teleportieren" name="teleport_btn" tool_tip="Zu entsprechendem Standort teleportieren"/>
+ <button label="Teleportieren" name="teleport_btn" tool_tip="Zu entsprechendem Standort teleportieren" width="100"/>
<button label="Karte" name="show_on_map_btn" tool_tip="Den entsprechenden Standort auf der Karte anzeigen"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_place_profile.xml b/indra/newview/skins/default/xui/de/panel_place_profile.xml
index 94a43833bf..9d1a582b7c 100644
--- a/indra/newview/skins/default/xui/de/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/de/panel_place_profile.xml
@@ -6,7 +6,7 @@
<string name="available" value="verfügbar"/>
<string name="allocated" value="vergeben"/>
<string name="title_place" value="Ortsprofil"/>
- <string name="title_teleport_history" value="Speicherort der Teleport-Liste"/>
+ <string name="title_teleport_history" value="Teleport-Liste"/>
<string name="not_available" value="k.A."/>
<string name="unknown" value="(unbekannt)"/>
<string name="public" value="(öffentlich)"/>
@@ -41,21 +41,6 @@
<string name="acquired_date">
[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
</string>
- <string name="icon_PG" value="parcel_drk_PG"/>
- <string name="icon_M" value="parcel_drk_M"/>
- <string name="icon_R" value="parcel_drk_R"/>
- <string name="icon_Voice" value="parcel_drk_Voice"/>
- <string name="icon_VoiceNo" value="parcel_drk_VoiceNo"/>
- <string name="icon_Fly" value="parcel_drk_Fly"/>
- <string name="icon_FlyNo" value="parcel_drk_FlyNo"/>
- <string name="icon_Push" value="parcel_drk_Push"/>
- <string name="icon_PushNo" value="parcel_drk_PushNo"/>
- <string name="icon_Build" value="parcel_drk_Build"/>
- <string name="icon_BuildNo" value="parcel_drk_BuildNo"/>
- <string name="icon_Scripts" value="parcel_drk_Scripts"/>
- <string name="icon_ScriptsNo" value="parcel_drk_ScriptsNo"/>
- <string name="icon_Damage" value="parcel_drk_Damage"/>
- <string name="icon_DamageNo" value="parcel_drk_DamageNo"/>
<button name="back_btn" tool_tip="Hinten"/>
<text name="title" value="Ortsprofil"/>
<scroll_container name="place_scroll">
@@ -68,7 +53,7 @@
<text name="maturity_value" value="unbekannt"/>
<accordion name="advanced_info_accordion">
<accordion_tab name="parcel_characteristics_tab" title="Parzelle">
- <panel>
+ <panel name="parcel_characteristics_panel">
<text name="rating_label" value="Einstufung:"/>
<text name="rating_value" value="unbekannt"/>
<text name="voice_label" value="Voice:"/>
@@ -87,7 +72,7 @@
</panel>
</accordion_tab>
<accordion_tab name="region_information_tab" title="Region">
- <panel>
+ <panel name="region_information_panel">
<text name="region_name_label" value="Region:"/>
<text name="region_name" value="Mooseland"/>
<text name="region_type_label" value="Typ:"/>
@@ -100,19 +85,19 @@
<text name="region_group">
The Mighty Moose of mooseville soundvillemoose
</text>
- <button label="Region/Grundstück" name="region_info_btn"/>
+ <button label="Region/Grundbesitz" name="region_info_btn"/>
</panel>
</accordion_tab>
- <accordion_tab name="estate_information_tab" title="Grundstück">
- <panel>
- <text name="estate_name_label" value="Grundstück:"/>
+ <accordion_tab name="estate_information_tab" title="Grundbesitz">
+ <panel name="estate_information_panel">
+ <text name="estate_name_label" value="Grundbesitz:"/>
<text name="estate_rating_label" value="Einstufung:"/>
<text name="estate_owner_label" value="Eigentümer:"/>
<text name="covenant_label" value="Vertrag:"/>
</panel>
</accordion_tab>
<accordion_tab name="sales_tab" title="Zum Verkauf">
- <panel>
+ <panel name="sales_panel">
<text name="sales_price_label" value="Preis:"/>
<text name="area_label" value="Gebiet:"/>
<text name="traffic_label" value="Traffic:"/>
diff --git a/indra/newview/skins/default/xui/de/panel_places.xml b/indra/newview/skins/default/xui/de/panel_places.xml
index 8ee26f4e5f..bd5c1c8ffe 100644
--- a/indra/newview/skins/default/xui/de/panel_places.xml
+++ b/indra/newview/skins/default/xui/de/panel_places.xml
@@ -2,14 +2,15 @@
<panel label="Orte" name="places panel">
<string name="landmarks_tab_title" value="MEINE LANDMARKEN"/>
<string name="teleport_history_tab_title" value="TELEPORT-LISTE"/>
- <filter_editor label="Orte filtern" name="Filter"/>
+ <filter_editor label="Meine Orte filtern" name="Filter"/>
<panel name="button_panel">
<button label="Teleportieren" name="teleport_btn" tool_tip="Zu ausgewähltem Standort teleportieren"/>
- <button label="Karte" name="map_btn"/>
+ <button label="Karte" name="map_btn" tool_tip="Den entsprechenden Standort auf der Karte anzeigen" width="60"/>
<button label="Bearbeiten" name="edit_btn" tool_tip="Landmarken-Info bearbeiten"/>
- <button name="overflow_btn" tool_tip="Zusätzliche Optionen anzeigen"/>
+ <button label="▼" name="overflow_btn" tool_tip="Zusätzliche Optionen anzeigen"/>
+ <button label="Speichern" name="save_btn" width="66"/>
+ <button label="Abbrechen" name="cancel_btn" width="66"/>
<button label="Schließen" name="close_btn"/>
- <button label="Abbrechen" name="cancel_btn"/>
- <button label="Speichern" name="save_btn"/>
+ <button label="Profil" name="profile_btn" tool_tip="Ortsprofil anzeigen"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml
index 14d4e01586..52e616a402 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_advanced.xml
@@ -1,48 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
-<panel name="advanced">
- <panel.string name="resolution_format">
- [RES_X] x [RES_Y]
- </panel.string>
+<panel label="Erweitert" name="advanced">
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
- <check_box label="Blasen-Chat" name="bubble_text_chat"/>
- <color_swatch name="background" tool_tip="Farbe für Blasen-Chat auswählen"/>
- <slider label="Deckkraft" name="bubble_chat_opacity"/>
- <text name="AspectRatioLabel1" tool_tip="Breite/Höhe">
- Seitenverhältnis
- </text>
- <combo_box name="aspect_ratio" tool_tip="Breite/Höhe">
- <combo_box.item label="4:3 (Standard-CRT)" name="item1"/>
- <combo_box.item label="5:4 (1280x1024 LCD)" name="item2"/>
- <combo_box.item label="8:5 (Widescreen)" name="item3"/>
- <combo_box.item label="16:9 (Widescreen)" name="item4"/>
- </combo_box>
- <check_box label="Automatisch erkennen" name="aspect_auto_detect"/>
- <text name="heading1">
- Kamera:
- </text>
+ <panel.string name="middle_mouse">
+ Mittlere Maustaste
+ </panel.string>
<slider label="Sichtwinkel" name="camera_fov"/>
<slider label="Abstand" name="camera_offset_scale"/>
<text name="heading2">
- Automatische Positionierung:
+ Automatische Position für:
</text>
<check_box label="Bauen/Bearbeiten" name="edit_camera_movement" tool_tip="Automatische Kamerapositionierung bei Wechsel in und aus dem Bearbeitungsmodus verwenden"/>
<check_box label="Aussehen" name="appearance_camera_movement" tool_tip="Automatische Kamerapositionierung im Bearbeitenmodus verwenden"/>
- <text name="heading3">
- Avatare:
- </text>
+ <check_box initial_value="true" label="Sidebar" name="appearance_sidebar_positioning" tool_tip="Use automatic camera positioning for sidebar"/>
<check_box label="Mich im Mouselook anzeigen" name="first_person_avatar_visible"/>
<check_box label="Mit Pfeiltasten bewegen" name="arrow_keys_move_avatar_check"/>
<check_box label="2-mal-drücken-halten, um zu rennen" name="tap_tap_hold_to_run"/>
<check_box label="Avatarlippen beim Sprechen bewegen" name="enable_lip_sync"/>
- <check_box label="Skript-Fehler anzeigen" name="show_script_errors"/>
+ <check_box label="Blasen-Chat" name="bubble_text_chat"/>
+ <slider label="Deckkraft" label_width="66" name="bubble_chat_opacity"/>
+ <color_swatch left_pad="35" name="background" tool_tip="Farbe für Blasen-Chat auswählen"/>
+ <text name="UI Size:">
+ UI-Größe
+ </text>
+ <check_box label="Skript-Fehler anzeigen:" name="show_script_errors"/>
<radio_group name="show_location">
- <radio_item label="In Chat" name="0"/>
- <radio_item label="In einem Fenster" name="1"/>
+ <radio_item label="Chat in der Nähe" name="0"/>
+ <radio_item label="Getrenntes Fenster" name="1"/>
</radio_group>
- <check_box label="Umschaltmodus für Mikrofon, wenn die Auslöste-Taste zum Sprechen gedrückt wird:" name="push_to_talk_toggle_check" tool_tip="Wenn der Umschaltmodus aktiviert ist, drücken Sie die Auslöse-Taste EINMAL, um Ihr Mikrofon an oder aus zu stellen. Wenn der Umschaltmodus nicht motiviert ist, ist das Mikro nur dann eingeschaltet, wenn Sie die Auslösetaste gedrückt halten."/>
+ <check_box label="Sprachfunktion ein-/ausschalten, wenn gedrückt wird:" name="push_to_talk_toggle_check" tool_tip="Wenn der Umschaltmodus aktiviert ist, drücken Sie die Auslöse-Taste EINMAL, um Ihr Mikrofon an oder aus zu stellen. Wenn der Umschaltmodus nicht motiviert ist, ist das Mikro nur dann eingeschaltet, wenn Sie die Auslösetaste gedrückt halten."/>
<line_editor label="Auslöser für Zum-Sprechen-drücken:" name="modifier_combo"/>
<button label="Taste festlegen" name="set_voice_hotkey_button"/>
- <button label="Mittlere Maustaste" name="set_voice_middlemouse_button"/>
+ <button label="Mittlere Maustaste" name="set_voice_middlemouse_button" tool_tip="Auf mittlere Maustaste zurücksetzen"/>
+ <button label="Andere Geräte" name="joystick_setup_button"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/de/panel_preferences_alerts.xml
index def5fb3b1b..fcb45e26be 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_alerts.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_alerts.xml
@@ -3,12 +3,12 @@
<text name="tell_me_label">
Anzeigen:
</text>
- <check_box label="Wenn ich Geld ausgebe oder L$ erhalte" name="notify_money_change_checkbox"/>
- <check_box label="Wenn meinen Freund sich an- oder abmelden" name="friends_online_notify_checkbox"/>
+ <check_box label="Wenn ich L$ ausgebe oder erhalte" name="notify_money_change_checkbox"/>
+ <check_box label="Wenn meine Freunde sich an- oder abmelden" name="friends_online_notify_checkbox"/>
<text name="show_label">
- Diese Warnhinweise immer anzeigen:
+ Immer anzeigen:
</text>
<text name="dont_show_label">
- Diese Benachrichtungen nie anzeigen:
+ Niemals anzeigen:
</text>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
index cc0a09c06c..bf150daf87 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
@@ -1,10 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Text-Chat" name="chat">
+ <text name="font_size">
+ Schriftgröße:
+ </text>
<radio_group name="chat_font_size">
<radio_item label="Klein" name="radio" value="0"/>
<radio_item label="Mittel" name="radio2" value="1"/>
<radio_item label="Groß" name="radio3" value="2"/>
</radio_group>
+ <text name="font_colors">
+ Schriftfarben:
+ </text>
<color_swatch label="Sie" name="user"/>
<text name="text_box1">
Ich
@@ -39,9 +45,15 @@
</text>
<check_box initial_value="true" label="Beim Chatten Tippanimation abspielen" name="play_typing_animation"/>
<check_box label="IMs per Email zuschicken, wenn ich offline bin" name="send_im_to_email"/>
- <check_box label="Text-Chatverlauf aktivieren" name="plain_text_chat_history"/>
- <radio_group name="chat_window" tool_tip="Zeigen sie Ihre Sofortnachrichten (Instant Messages) in einem anderen Fenster oder in einem einzigen Fenster mit viele Registerkarten an (Neustart erforderlich).">
- <radio_item label="Mehrere Fenster" name="radio" value="0"/>
- <radio_item label="Ein Fenster" name="radio2" value="1"/>
+ <check_box label="Kompakten Text-Chatverlauf aktivieren" name="plain_text_chat_history"/>
+ <text name="show_ims_in_label">
+ IMs anzeigen in:
+ </text>
+ <text name="requires_restart_label">
+ (Neustart erforderlich)
+ </text>
+ <radio_group name="chat_window" tool_tip="Zeigen Sie Ihre Sofortnachrichten (Instant Messages) in einem anderen Fenster oder in einem einzigen Fenster mit vielen Registerkarten an (Neustart erforderlich).">
+ <radio_item label="Getrennte Fenster" name="radio" value="0"/>
+ <radio_item label="Registerkarten" name="radio2" value="1"/>
</radio_group>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_general.xml b/indra/newview/skins/default/xui/de/panel_preferences_general.xml
index 490b0b296b..b59a779853 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_general.xml
@@ -19,21 +19,21 @@
<text name="language_textbox2">
(Erfordert Neustart)
</text>
- <text name="maturity_desired_prompt">
- Ich möchte auf Inhalt mit folgender Alterseinstufung zugreifen:
+ <text name="maturity_desired_prompt" width="350">
+ Ich möchte auf Inhalt mit folgender Einstufung zugreifen:
</text>
<text name="maturity_desired_textbox"/>
<combo_box name="maturity_desired_combobox">
- <combo_box.item label="Allgemein, Moderat, Adult" name="Desired_Adult"/>
- <combo_box.item label="Allgemein und Moderat" name="Desired_Mature"/>
- <combo_box.item label="Allgemein" name="Desired_PG"/>
+ <combo_box.item label="Generell, Moderat, Adult" name="Desired_Adult"/>
+ <combo_box.item label="Generell und Moderat" name="Desired_Mature"/>
+ <combo_box.item label="Generell" name="Desired_PG"/>
</combo_box>
<text name="start_location_textbox">
Startstandort:
</text>
<combo_box name="start_location_combo">
<combo_box.item label="Mein letzter Standort" name="MyLastLocation" tool_tip="Als Standardeinstellung in letztem Standort anmelden."/>
- <combo_box.item label="Mein Heimatort" name="MyHome" tool_tip="Als Standardeinstellung in Zuhauseposition anmelden."/>
+ <combo_box.item label="Mein Zuhause" name="MyHome" tool_tip="Als Standardeinstellung in Zuhauseposition anmelden."/>
</combo_box>
<check_box initial_value="true" label="Beim Anmelden anzeigen" name="show_location_checkbox"/>
<text name="name_tags_textbox">
@@ -42,7 +42,7 @@
<radio_group name="Name_Tag_Preference">
<radio_item label="Aus" name="radio" value="0"/>
<radio_item label="An" name="radio2" value="1"/>
- <radio_item label="Vorübergehend anzeigen" name="radio3" value="2"/>
+ <radio_item label="Kurz anzeigen" name="radio3" value="2"/>
</radio_group>
<check_box label="Meinen Namen anzeigen" name="show_my_name_checkbox1"/>
<check_box initial_value="true" label="Kleine Avatarnamen" name="small_avatar_names_checkbox"/>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml
index e7bb768925..16b4598486 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_graphics1.xml
@@ -55,7 +55,7 @@
<text name="AvatarRenderingText">
Avatar-Darstellung:
</text>
- <check_box initial_value="true" label="Scheinavatare" name="AvatarImpostors"/>
+ <check_box initial_value="true" label="Vereinfachte Avatardarstellung" name="AvatarImpostors"/>
<check_box initial_value="true" label="Hardware-Hautberechnung" name="AvatarVertexProgram"/>
<check_box initial_value="true" label="Avatar-Kleidung" name="AvatarCloth"/>
<slider label="Sichtweite:" name="DrawDistance"/>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
index 0c0924026e..42a625fbf6 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_privacy.xml
@@ -3,7 +3,7 @@
<panel.string name="log_in_to_change">
Anmelden, um Änderungen vorzunehmen
</panel.string>
- <button label="Verlauf leeren" name="clear_cache"/>
+ <button label="Cache leeren" name="clear_cache" tool_tip="Bild bei Anmeldung, letzter Standort, Teleport-Liste, Internet- und Texturen-Cache löschen"/>
<text name="cache_size_label_l">
(Standorte, Bilder, Web, Suchverlauf)
</text>
@@ -11,8 +11,6 @@
<check_box label="Nur Freunde und Gruppen können mich anrufen oder mir eine IM schicken" name="voice_call_friends_only_check"/>
<check_box label="Mikrofon ausschalten, wenn Anrufe beendet werden" name="auto_disengage_mic_check"/>
<check_box label="Cookies annehmen" name="cookies_enabled"/>
- <check_box label="Medien aktiviert" name="media_enabled"/>
- <check_box label="Automatische Wiedergabe zulassen" name="autoplay_enabled"/>
<text name="Logs:">
Protokolle:
</text>
@@ -20,8 +18,8 @@
<check_box label="IM Protokolle auf meinem Computer speichern" name="log_instant_messages"/>
<check_box label="Zeitstempel hinzufügen" name="show_timestamps_check_im"/>
<text name="log_path_desc">
- Speicherort für Protokolle:
+ Protokolle speichern in:
</text>
<button label="Durchsuchen" label_selected="Durchsuchen" name="log_path_button"/>
- <button label="Ignorierte Einwohner/Objekte" name="block_list"/>
+ <button label="Ignorierte Einwohner/Objekte" name="block_list" width="180"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml
index 00be3920ca..02c6fb0606 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_setup.xml
@@ -18,29 +18,32 @@
kbit/s
</text>
<check_box label="Eigener Port" name="connection_port_enabled"/>
- <spinner label="Portnummer:" name="web_proxy_port"/>
+ <spinner label="Port-Nummer:" name="connection_port"/>
<text name="cache_size_label_l">
Cachegröße
</text>
<text name="text_box5">
MB
</text>
- <button label="Durchsuchen" label_selected="Durchsuchen" name="set_cache"/>
- <button label="Zurücksetzen" label_selected="Zurücksetzen" name="reset_cache"/>
<text name="Cache location">
Cache-Ordner:
</text>
+ <button label="Durchsuchen" label_selected="Durchsuchen" name="set_cache"/>
+ <button label="Zurücksetzen" label_selected="Zurücksetzen" name="reset_cache"/>
<text name="Web:">
Web:
</text>
<radio_group name="use_external_browser">
- <radio_item label="Integrierten Browser verwenden" name="internal" tool_tip="Integrierten Webbrowser verwenden, um die Hilfe, Weblinks usw. anzuzeigen. Dieser Browser öffnet als neues Fenster innerhalb von [APP_NAME]."/>
- <radio_item label="Meinen Browser verwenden (IE, Firefox)" name="external" tool_tip="Standard Webbrowser des Systems verwenden, um die Hilfe, Weblinks usw. anzuzeigen. Bei Vollbildmodus nicht empfohlen."/>
+ <radio_item label="Meinen Browser verwenden (IE, Firefox, Safari)" name="external" tool_tip="Standard Webbrowser des Systems verwenden, um die Hilfe, Weblinks usw. anzuzeigen. Bei Vollbildmodus nicht empfohlen." value="1"/>
+ <radio_item label="Integrierten Browser verwenden" name="internal" tool_tip="Integrierten Webbrowser verwenden, um die Hilfe, Weblinks usw. anzuzeigen. Dieser Browser öffnet als neues Fenster innerhalb von [APP_NAME]." value=""/>
</radio_group>
- <check_box initial_value="false" label="Web Proxy" name="web_proxy_enabled"/>
- <line_editor name="web_proxy_editor" tool_tip="Name oder IP Adresse des Proxyservers, den Sie benutzen möchten"/>
- <button label="Durchsuchen" label_selected="Durchsuchen" name="set_proxy"/>
+ <check_box initial_value="true" label="Plugins aktivieren" name="browser_plugins_enabled"/>
+ <check_box initial_value="true" label="Cookies annehmen" name="cookies_enabled"/>
+ <check_box initial_value="true" label="Javascript aktivieren" name="browser_javascript_enabled"/>
+ <check_box initial_value="false" label="Web-Proxy aktivieren" name="web_proxy_enabled"/>
<text name="Proxy location">
Proxy-Standort:
</text>
+ <line_editor name="web_proxy_editor" tool_tip="Name oder IP Adresse des Proxyservers, den Sie benutzen möchten"/>
+ <spinner label="Portnummer:" name="web_proxy_port"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_sound.xml b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml
index 2398da71d0..44b2bd1f60 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_sound.xml
@@ -1,14 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Sounds" name="Preference Media panel">
<slider label="Master-Lautstärke" name="System Volume"/>
- <check_box initial_value="true" label="Stummschalten, wenn verkleinert" name="mute_when_minimized"/>
- <slider label="Umgebung" name="Wind Volume"/>
+ <check_box initial_value="true" label="Stummschalten, wenn minimiert" name="mute_when_minimized"/>
<slider label="Schaltflächen" name="UI Volume"/>
- <slider label="Medien" name="Media Volume"/>
+ <slider label="Umgebung" name="Wind Volume"/>
<slider label="Soundeffekte" name="SFX Volume"/>
<slider label="Musik wird gestreamt" name="Music Volume"/>
- <check_box label="Voice aktivieren" name="enable_voice_check"/>
- <slider label="Sprache" name="Voice Volume"/>
+ <check_box label="Aktiviert" name="music_enabled"/>
+ <slider label="Medien" name="Media Volume"/>
+ <check_box label="Aktiviert" name="enable_media"/>
+ <slider label="Voice-Chat" name="Voice Volume"/>
+ <check_box label="Aktiviert" name="enable_voice_check"/>
+ <check_box label="Automatische Wiedergabe zulassen" name="media_auto_play_btn" tool_tip="Hier aktivieren, um Medien automatisch wiederzugeben."/>
+ <check_box label="Medien, die an andere Avatare angehängt sind, wiedergeben." name="media_show_on_others_btn" tool_tip="Diese Option deaktivieren, um Medien für andere Avataren, die sich in der Nähe befinden, auszublenden."/>
+ <text name="voice_chat_settings">
+ Voice-Chat-Einstellungen
+ </text>
<text name="Listen from">
Zuhören von:
</text>
diff --git a/indra/newview/skins/default/xui/de/panel_profile.xml b/indra/newview/skins/default/xui/de/panel_profile.xml
index 82467eb570..cda2788e40 100644
--- a/indra/newview/skins/default/xui/de/panel_profile.xml
+++ b/indra/newview/skins/default/xui/de/panel_profile.xml
@@ -28,11 +28,14 @@
</panel>
<text name="title_member_text" value="Einwohner seit:"/>
<text name="title_acc_status_text" value="Kontostatus:"/>
- <text name="acc_status_text">
+ <text_editor name="acc_status_text">
Einwohner. Keine Zahlungsinfo archiviert.
Linden.
- </text>
+ </text_editor>
<text name="title_partner_text" value="Partner:"/>
+ <panel name="partner_data_panel">
+ <name_box initial_value="(wird in Datenbank gesucht)" name="partner_text"/>
+ </panel>
<text name="title_groups_text" value="Gruppen:"/>
</panel>
</scroll_container>
@@ -43,6 +46,7 @@
<button label="Anrufen" name="call" tool_tip="Diesen Einwohner anrufen"/>
<button label="Karte" name="show_on_map_btn" tool_tip="Einwohner auf Karte anzeigen"/>
<button label="Teleportieren" name="teleport" tool_tip="Teleport anbieten"/>
+ <button label="â–¼" name="overflow_btn" tool_tip="Dem Einwohner Geld geben oder Inventar an den Einwohner schicken"/>
</layout_panel>
<layout_panel name="profile_me_buttons_panel">
<button label="Profil bearbeiten" name="edit_profile_btn" tool_tip="Ihre persönlichen Informationen bearbeiten"/>
diff --git a/indra/newview/skins/default/xui/de/panel_profile_view.xml b/indra/newview/skins/default/xui/de/panel_profile_view.xml
index 4d59c16e98..f02457dd80 100644
--- a/indra/newview/skins/default/xui/de/panel_profile_view.xml
+++ b/indra/newview/skins/default/xui/de/panel_profile_view.xml
@@ -8,7 +8,7 @@
</string>
<text_editor name="user_name" value="(wird geladen...)"/>
<text name="status" value="Online"/>
- <tab_container name="tabs">
+ <tab_container name="tabs" tab_min_width="60">
<panel label="PROFIL" name="panel_profile"/>
<panel label="AUSWAHL" name="panel_picks"/>
<panel label="NOTIZEN &amp; PRIVATSPHÄRE" name="panel_notes"/>
diff --git a/indra/newview/skins/default/xui/de/panel_region_covenant.xml b/indra/newview/skins/default/xui/de/panel_region_covenant.xml
index 14be8def7e..225c98b84f 100644
--- a/indra/newview/skins/default/xui/de/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/de/panel_region_covenant.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Vertrag" name="Covenant">
<text name="estate_section_lbl">
- Grundstück
+ Grundbesitz
</text>
<text name="estate_name_lbl">
Name:
@@ -18,20 +18,20 @@
<text name="estate_cov_lbl">
Vertrag:
</text>
- <text name="covenant_timestamp_text">
+ <text name="covenant_timestamp_text" width="320">
Letzte Änderung am Mittwoch, den 31. Dez. 1969, 16:00:00
</text>
<button label="?" name="covenant_help"/>
<text_editor bottom="-247" height="162" name="covenant_editor">
- Für dieses Grundstück fehlt der Vertrag.
+ Für diesen Grundbesitz fehlt der Vertrag.
</text_editor>
<button label="Zurücksetzen" name="reset_covenant"/>
<text name="covenant_help_text">
Änderungen am Vertrag werden für alle Parzellen auf dem
- Grundstück übernommen.
+Grundbesitz übernommen.
</text>
<text bottom_delta="-36" name="covenant_instructions">
- Ziehen Sie eine Notizkarte an diese Stelle, um den Vertrag für dieses Grundstück zu ändern.
+ Ziehen Sie eine Notizkarte an diese Stelle, um den Vertrag für diesen Grundbesitz zu ändern.
</text>
<text bottom_delta="-36" name="region_section_lbl">
Region
@@ -63,7 +63,7 @@
<text name="changeable_lbl">
Unterteilen:
</text>
- <text name="changeable_clause">
+ <text name="changeable_clause" width="366">
Land in dieser Region kann nicht zusammengelegt/geteilt werden.
</text>
<string name="can_resell">
diff --git a/indra/newview/skins/default/xui/de/panel_region_debug.xml b/indra/newview/skins/default/xui/de/panel_region_debug.xml
index 40befab4dd..d1b8f0d78a 100644
--- a/indra/newview/skins/default/xui/de/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/de/panel_region_debug.xml
@@ -13,7 +13,7 @@
<check_box label="Physik deaktivieren" name="disable_physics_check" tool_tip="Physik in dieser Region deaktivieren"/>
<button label="?" name="disable_physics_help"/>
<button label="Übernehmen" name="apply_btn"/>
- <text name="objret_text_lbl" width="105">
+ <text name="objret_text_lbl" width="110">
Objekt zurückgeben
</text>
<text name="resident_text_lbl">
@@ -28,7 +28,7 @@
</text>
<check_box label="Mit Skripten" name="return_scripts" tool_tip="Es werden nur die Objekte zurückgegeben, die über Skripte verfügen."/>
<check_box label="Auf dem Land von jemand anderem" name="return_other_land" tool_tip="Es werden nur die Objekte zurückgegeben, die sich auf dem Land eines anderen Einwohners befinden"/>
- <check_box label="In jeder Region auf diesem Grundstück" name="return_estate_wide" tool_tip="Es werden die Objekte in allen Regionen dieses Grundstücks zurückgegeben"/>
+ <check_box label="In jeder Region auf diesem Grundbesitz" name="return_estate_wide" tool_tip="Es werden die Objekte in allen Regionen dieses Grundbesitzes zurückgegeben"/>
<button label="Zurückgeben" name="return_btn" width="90"/>
<button label="Top-Kollisionsobjekte..." name="top_colliders_btn" tool_tip="Liste der Objekte mit den meisten potenziellen Kollisionen"/>
<button label="?" name="top_colliders_help"/>
diff --git a/indra/newview/skins/default/xui/de/panel_region_estate.xml b/indra/newview/skins/default/xui/de/panel_region_estate.xml
index b0c6dce8cf..b93bd3e442 100644
--- a/indra/newview/skins/default/xui/de/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/de/panel_region_estate.xml
@@ -1,24 +1,24 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Grundstück" name="Estate">
+<panel label="Grundbesitz" name="Estate">
<text name="estate_help_text">
- Änderungen auf dieser Registerkarte wirken sich auf alle Regionen auf dem Grundstück aus.
+ Änderungen wirken sich auf alle Regionen des Grundbesitzes aus.
</text>
<text name="estate_text">
- Grundstück:
+ Grundbesitz:
</text>
<text name="estate_name">
(unbekannt)
</text>
<text name="owner_text">
- Grundstückseigentümer:
+ Grundbesitzer:
</text>
<text name="estate_owner">
(unbekannt)
</text>
<text name="Only Allow">
- Zugang auf Einwohner beschränken, die überprüft wurden von:
+ Zugang nur dann, wenn überprüft mit:
</text>
- <check_box label="Zahlungsinformation gespeichert" name="limit_payment" tool_tip="Nicht identifizierte Einwohner verbannen"/>
+ <check_box label="Zahlungsinformation gespeichert" name="limit_payment" tool_tip="Einwohner ohne Zahlungsinformation nicht zulassen."/>
<check_box label="Altersüberprüfung" name="limit_age_verified" tool_tip="Einwohner ohne Altersüberprüfung verbannen. Weitere Informationen finden Sie auf [SUPPORT_SITE]."/>
<check_box label="Voice-Chat erlauben" name="voice_chat_check"/>
<button label="?" name="voice_chat_help"/>
@@ -49,7 +49,7 @@
<check_box label="Verweigern - Zahlungsinfo verwendet" name="deny_transacted"/>
<button label="Übernehmen" name="apply_btn"/>
<text name="estate_manager_label">
- Grundstücksverwalter:
+ Grundbesitzsverwalter:
</text>
<text name="allow_resident_label">
Zulässige Einwohner:
@@ -69,6 +69,6 @@
<button label="?" name="ban_resident_help"/>
<button label="Hinzufügen..." name="add_banned_avatar_btn"/>
<button label="Entfernen..." name="remove_banned_avatar_btn"/>
- <button label="Nachricht an Grundstück senden..." name="message_estate_btn"/>
- <button label="Benutzer von Grundstück werfen..." name="kick_user_from_estate_btn"/>
+ <button label="Nachricht an Grundbesitz" name="message_estate_btn"/>
+ <button label="Einwohner hinauswerfen" name="kick_user_from_estate_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_region_general.xml b/indra/newview/skins/default/xui/de/panel_region_general.xml
index 978b701054..be8507ebbd 100644
--- a/indra/newview/skins/default/xui/de/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/de/panel_region_general.xml
@@ -19,35 +19,25 @@
unbekannt
</text>
<check_box label="Terraformen blockieren" name="block_terraform_check"/>
- <button label="?" name="terraform_help"/>
<check_box label="Fliegen blockieren" name="block_fly_check"/>
- <button label="?" name="fly_help"/>
<check_box label="Schaden zulassen" name="allow_damage_check"/>
- <button label="?" name="damage_help"/>
<check_box label="Stoßen beschränken" name="restrict_pushobject"/>
- <button label="?" name="restrict_pushobject_help"/>
<check_box label="Landwiederverkauf zulassen" name="allow_land_resell_check"/>
- <button label="?" name="land_resell_help"/>
<check_box label="Landumverteilung zulassen" name="allow_parcel_changes_check"/>
- <button label="?" name="parcel_changes_help"/>
<check_box label="Landanzeige in Suche blockieren" name="block_parcel_search_check" tool_tip="Diese Region und ihre Parzellen in Suchergebnissen anzeigen"/>
- <button label="?" name="parcel_search_help"/>
<spinner label="Avatar-Limit" name="agent_limit_spin"/>
- <button label="?" name="agent_limit_help"/>
<spinner label="Objektbonus" name="object_bonus_spin"/>
- <button label="?" name="object_bonus_help"/>
- <text label="Alterseinstufung" name="access_text">
+ <text label="Inhaltseinstufung" name="access_text">
Einstufung:
</text>
- <combo_box label="Moderat" name="access_combo">
- <combo_box.item label="Adult" name="Adult"/>
- <combo_box.item label="Moderat" name="Mature"/>
- <combo_box.item label="Allgemein" name="PG"/>
- </combo_box>
- <button label="?" name="access_help"/>
+ <icons_combo_box label="Moderat" name="access_combo">
+ <icons_combo_box.item label="Adult" name="Adult" value="42"/>
+ <icons_combo_box.item label="Moderat" name="Mature" value="21"/>
+ <icons_combo_box.item label="Generell" name="PG" value="13"/>
+ </icons_combo_box>
<button label="Übernehmen" name="apply_btn"/>
- <button label="Einen Benutzer nach Hause teleportieren..." name="kick_btn"/>
- <button label="Alle Benutzer nach Hause teleportieren..." name="kick_all_btn"/>
+ <button label="Einen Einwohner nach Hause teleportieren..." name="kick_btn"/>
+ <button label="Alle Einwohner nach Hause teleportieren..." name="kick_all_btn"/>
<button label="Nachricht an Region senden..." name="im_btn"/>
<button label="Telehub verwalten..." name="manage_telehub_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_region_general_layout.xml b/indra/newview/skins/default/xui/de/panel_region_general_layout.xml
index 732249df35..09142ada6f 100644
--- a/indra/newview/skins/default/xui/de/panel_region_general_layout.xml
+++ b/indra/newview/skins/default/xui/de/panel_region_general_layout.xml
@@ -36,8 +36,8 @@
<combo_box.item label="Allgemein" name="PG"/>
</combo_box>
<button label="Übernehmen" name="apply_btn"/>
- <button label="Einen Benutzer nach Hause teleportieren..." name="kick_btn"/>
- <button label="Alle Benutzer nach Hause teleportieren..." name="kick_all_btn"/>
+ <button label="Einen Einwohner nach Hause teleportieren..." name="kick_btn"/>
+ <button label="Alle Einwohner nach Hause teleportieren..." name="kick_all_btn"/>
<button label="Nachricht an Region senden..." name="im_btn"/>
<button label="Telehub verwalten..." name="manage_telehub_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_region_terrain.xml b/indra/newview/skins/default/xui/de/panel_region_terrain.xml
index e79c8584ba..01721791a7 100644
--- a/indra/newview/skins/default/xui/de/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/de/panel_region_terrain.xml
@@ -12,17 +12,17 @@
<button label="?" name="terrain_raise_help" />
<spinner label="Untere Terraingrenze" name="terrain_lower_spin" />
<button label="?" name="terrain_lower_help" />
- <check_box label="Grundstücksonne verwenden" name="use_estate_sun_check" />
+ <check_box label="Grundbesitzsonne verwenden" name="use_estate_sun_check" />
<button label="?" name="use_estate_sun_help" />
<check_box label="Sonne fest" name="fixed_sun_check" />
<button label="?" name="fixed_sun_help" />
<slider label="Phase" name="sun_hour_slider" />
<button label="Übernehmen" name="apply_btn" />
<button label="RAW-Terrain herunterladen..." name="download_raw_btn"
- tool_tip="Nur für Grundstückseigentümer verfügbar, nicht für Verwalter" />
+ tool_tip="Nur für Grundbesitzeigentümer verfügbar, nicht für Verwalter" />
<button label="?" name="download_raw_help" />
<button label="RAW-Terrain hochladen..." name="upload_raw_btn"
- tool_tip="Nur für Grundstückseigentümer verfügbar, nicht für Verwalter" />
+ tool_tip="Nur für Grundbesitzeigentümer verfügbar, nicht für Verwalter" />
<button label="?" name="upload_raw_help" />
<button label="Terrain formen" name="bake_terrain_btn"
tool_tip="Das aktuelle Terrain zum Mittelpunkt für die oberen/unteren Terraingrenzen machen" />
diff --git a/indra/newview/skins/default/xui/de/panel_region_texture.xml b/indra/newview/skins/default/xui/de/panel_region_texture.xml
index d489b5bac8..2f4904730b 100644
--- a/indra/newview/skins/default/xui/de/panel_region_texture.xml
+++ b/indra/newview/skins/default/xui/de/panel_region_texture.xml
@@ -25,25 +25,25 @@
Texturhöhenbereich
</text>
<text name="height_text_lbl6">
- Südwest
+ Nordwest
</text>
<text name="height_text_lbl7">
- Nordwest
+ Nordost
</text>
<text name="height_text_lbl8">
- Südost
+ Südwest
</text>
<text name="height_text_lbl9">
- Nordost
+ Südost
</text>
- <spinner label="Niedrig" name="height_start_spin_0"/>
- <spinner label="Niedrig" name="height_start_spin_1"/>
- <spinner label="Niedrig" name="height_start_spin_2"/>
- <spinner label="Niedrig" name="height_start_spin_3"/>
- <spinner label="Hoch" name="height_range_spin_0"/>
- <spinner label="Hoch" name="height_range_spin_1"/>
- <spinner label="Hoch" name="height_range_spin_2"/>
- <spinner label="Hoch" name="height_range_spin_3"/>
+ <spinner label="Niedrig" label_width="40" name="height_start_spin_0"/>
+ <spinner label="Niedrig" label_width="40" name="height_start_spin_1"/>
+ <spinner label="Niedrig" label_width="40" name="height_start_spin_2"/>
+ <spinner label="Niedrig" label_width="40" name="height_start_spin_3"/>
+ <spinner label="Hoch" label_width="40" name="height_range_spin_0"/>
+ <spinner label="Hoch" label_width="40" name="height_range_spin_1"/>
+ <spinner label="Hoch" label_width="40" name="height_range_spin_2"/>
+ <spinner label="Hoch" label_width="40" name="height_range_spin_3"/>
<text name="height_text_lbl10">
Diese Werte geben den Mischungsgrad für die obigen Texturen an.
</text>
diff --git a/indra/newview/skins/default/xui/de/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/de/panel_script_limits_my_avatar.xml
index f6a1d7e9b5..c91eb98e9c 100644
--- a/indra/newview/skins/default/xui/de/panel_script_limits_my_avatar.xml
+++ b/indra/newview/skins/default/xui/de/panel_script_limits_my_avatar.xml
@@ -1,10 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="MEIN AVATAR" name="script_limits_my_avatar_panel">
+ <text name="script_memory">
+ Avatar-Skript-Gebrauch
+ </text>
<text name="loading_text">
Wird geladen...
</text>
<scroll_list name="scripts_list">
- <scroll_list.columns label="Größe (KB)" name="size"/>
+ <scroll_list.columns label="Größe (KB)" name="size" width="80"/>
<scroll_list.columns label="URLs" name="urls"/>
<scroll_list.columns label="Objektname" name="name"/>
<scroll_list.columns label="Ort" name="location"/>
diff --git a/indra/newview/skins/default/xui/de/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/de/panel_script_limits_region_memory.xml
index c466c04e86..8d7cc1bf9a 100644
--- a/indra/newview/skins/default/xui/de/panel_script_limits_region_memory.xml
+++ b/indra/newview/skins/default/xui/de/panel_script_limits_region_memory.xml
@@ -3,22 +3,20 @@
<text name="script_memory">
Parzellenskript-Speicher
</text>
- <text name="parcels_listed">
- Parzelleneigentümer:
- </text>
- <text name="memory_used">
- Verwendeter Speicher:
- </text>
+ <text name="parcels_listed"/>
+ <text name="memory_used"/>
<text name="loading_text">
Wird geladen...
</text>
<scroll_list name="scripts_list">
- <scroll_list.columns label="Größe (KB)" name="size"/>
+ <scroll_list.columns label="Größe (KB)" name="size" width="80"/>
+ <scroll_list.columns label="URLs" name="urls"/>
<scroll_list.columns label="Objektname" name="name"/>
- <scroll_list.columns label="Objekteigentümer" name="owner"/>
- <scroll_list.columns label="Parzelle / Standort" name="location"/>
+ <scroll_list.columns label="Objekteigentümer" name="owner" width="130"/>
+ <scroll_list.columns label="Parzelle" name="parcel"/>
+ <scroll_list.columns label="Standort" name="location"/>
</scroll_list>
- <button label="Liste aktualisieren" name="refresh_list_btn"/>
+ <button label="Liste aktualisieren" name="refresh_list_btn" width="110"/>
<button label="Markieren" name="highlight_btn"/>
<button label="Zurückgeben" name="return_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_side_tray.xml b/indra/newview/skins/default/xui/de/panel_side_tray.xml
index 2cd11cdcef..3c81636fa0 100644
--- a/indra/newview/skins/default/xui/de/panel_side_tray.xml
+++ b/indra/newview/skins/default/xui/de/panel_side_tray.xml
@@ -2,26 +2,28 @@
<!-- Side tray cannot show background because it is always
partially on screen to hold tab buttons. -->
<side_tray name="sidebar">
- <sidetray_tab description="Seitenleiste auf-/zuklappen." name="sidebar_openclose"/>
- <sidetray_tab description="Startseite." name="sidebar_home">
+ <sidetray_tab description="Seitenleiste auf-/zuklappen." name="sidebar_openclose" tab_title="Seitenleiste auf-/zuklappen"/>
+ <sidetray_tab description="Startseite." name="sidebar_home" tab_title="Startseite">
<panel label="Startseite" name="panel_home"/>
</sidetray_tab>
- <sidetray_tab description="Ihr öffentliches Profil und Auswahl bearbeiten." name="sidebar_me">
- <panel label="Ich" name="panel_me"/>
+ <sidetray_tab description="Ihr öffentliches Profil und Auswahl bearbeiten." name="sidebar_me" tab_title="Mein Profil">
+ <panel_container name="panel_container">
+ <panel label="Ich" name="panel_me"/>
+ </panel_container>
</sidetray_tab>
- <sidetray_tab description="Freunde, Kontakte und Leute in Ihrer Nähe finden." name="sidebar_people">
+ <sidetray_tab description="Freunde, Kontakte und Leute in Ihrer Nähe finden." name="sidebar_people" tab_title="Leute">
<panel_container name="panel_container">
- <panel label="Gruppeninfo" name="panel_group_info_sidetray"/>
+ <panel label="Gruppenprofil" name="panel_group_info_sidetray"/>
<panel label="Ignorierte Einwohner &amp; Objekte" name="panel_block_list_sidetray"/>
</panel_container>
</sidetray_tab>
- <sidetray_tab description="Hier finden Sie neue Orte und Orte, die Sie bereits besucht haben." label="Orte" name="sidebar_places">
+ <sidetray_tab description="Hier finden Sie neue Orte und Orte, die Sie bereits besucht haben." label="Orte" name="sidebar_places" tab_title="Orte">
<panel label="Orte" name="panel_places"/>
</sidetray_tab>
- <sidetray_tab description="Inventar durchsuchen." name="sidebar_inventory">
+ <sidetray_tab description="Inventar durchsuchen." name="sidebar_inventory" tab_title="Mein Inventar">
<panel label="Inventar bearbeiten" name="sidepanel_inventory"/>
</sidetray_tab>
- <sidetray_tab description="Ändern Sie Ihr Aussehen und Ihren aktuellen Look." name="sidebar_appearance">
+ <sidetray_tab description="Ändern Sie Ihr Aussehen und Ihren aktuellen Look." name="sidebar_appearance" tab_title="Mein Aussehen">
<panel label="Aussehen bearbeiten" name="sidepanel_appearance"/>
</sidetray_tab>
</side_tray>
diff --git a/indra/newview/skins/default/xui/de/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/de/panel_stand_stop_flying.xml
index 5b8137af4a..be21429007 100644
--- a/indra/newview/skins/default/xui/de/panel_stand_stop_flying.xml
+++ b/indra/newview/skins/default/xui/de/panel_stand_stop_flying.xml
@@ -2,5 +2,5 @@
<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml-->
<panel name="panel_stand_stop_flying">
<button label="Stehen" name="stand_btn" tool_tip="Klicken Sie hier, um aufzustehen."/>
- <button label="Landen" name="stop_fly_btn" tool_tip="Landen"/>
+ <button label="Flug stoppen" name="stop_fly_btn" tool_tip="Flug stoppen"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_status_bar.xml b/indra/newview/skins/default/xui/de/panel_status_bar.xml
index 33fd0f6348..005290c1ff 100644
--- a/indra/newview/skins/default/xui/de/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/de/panel_status_bar.xml
@@ -21,10 +21,13 @@
<panel.string name="buycurrencylabel">
[AMT] L$
</panel.string>
- <button label="" label_selected="" name="buycurrency" tool_tip="Mein Kontostand"/>
- <button label="L$ kaufen" name="buyL" tool_tip="Hier klicken, um mehr L$ zu kaufen"/>
+ <panel name="balance_bg">
+ <text name="balance" tool_tip="Mein Kontostand" value="20 L$"/>
+ <button label="L$ kaufen" name="buyL" tool_tip="Hier klicken, um mehr L$ zu kaufen"/>
+ </panel>
<text name="TimeText" tool_tip="Aktuelle Zeit (Pazifik)">
- 12:00
+ 24:00 H PST
</text>
+ <button name="media_toggle_btn" tool_tip="Alle Medien starten/stoppen (Musik, Video, Webseiten)"/>
<button name="volume_btn" tool_tip="Steuerung der Gesamtlautstärke"/>
</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_voice_effect.xml b/indra/newview/skins/default/xui/de/panel_voice_effect.xml
new file mode 100644
index 0000000000..363ee013e3
--- /dev/null
+++ b/indra/newview/skins/default/xui/de/panel_voice_effect.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_voice_effect">
+ <string name="no_voice_effect">
+ Kein Voice-Morphing
+ </string>
+ <string name="preview_voice_effects">
+ Voice-Morphing ausprobieren â–¶
+ </string>
+ <string name="get_voice_effects">
+ Voice-Morphing abonnieren â–¶
+ </string>
+ <combo_box name="voice_effect" tool_tip="Wählen Sie einen Voice-Morph-Effekt aus, um Ihre Stimme zu verändern.">
+ <combo_box.item label="Kein Voice-Morphing" name="no_voice_effect"/>
+ </combo_box>
+</panel>
diff --git a/indra/newview/skins/default/xui/de/panel_world_map.xml b/indra/newview/skins/default/xui/de/panel_world_map.xml
index f7454dd634..35fe3d3ffc 100644
--- a/indra/newview/skins/default/xui/de/panel_world_map.xml
+++ b/indra/newview/skins/default/xui/de/panel_world_map.xml
@@ -30,6 +30,12 @@
<panel.string name="world_map_northwest">
NW
</panel.string>
+ <panel.string name="world_map_person">
+ 1 Person
+ </panel.string>
+ <panel.string name="world_map_people">
+ [NUMBER] Leute
+ </panel.string>
<text label="N" name="floater_map_north" text="N">
N
</text>
diff --git a/indra/newview/skins/default/xui/de/role_actions.xml b/indra/newview/skins/default/xui/de/role_actions.xml
index 554a5c27a4..b20fcabc82 100644
--- a/indra/newview/skins/default/xui/de/role_actions.xml
+++ b/indra/newview/skins/default/xui/de/role_actions.xml
@@ -30,7 +30,7 @@
</action_set>
<action_set description="Diese Fähigkeiten ermöglichen es, Parzellenoptionen wie „Objekte erstellen“, „Terrain bearbeiten“ sowie Musik- und Medieneinstellungen zu ändern." name="Parcel Settings">
<action description="Musik- und Medieneinstellungen ändern" longdescription="Die Einstellungen für Streaming-Musik und Filme finden Sie unter „Land-Info“ &gt; „Medien“." name="land change media"/>
- <action description="„Terrain bearbeiten“ ein/aus" longdescription="„Terrain bearbeiten“ ein/aus. *WARNUNG* „Land-Info“ &gt; „Optionen“ &gt; „Terrain bearbeiten“ ermöglicht jedem das Terraformen Ihres Grundstücks und das Setzen und Verschieben von Linden-Pflanzen. Überlegen Sie sich, wem Sie diese Fähigkeit verleihen. Diese Einstellung finden Sie unter „Land-Info“ &gt; „Optionen“." name="land edit"/>
+ <action description="„Terrain bearbeiten“ ein/aus" longdescription="„Terrain bearbeiten“ ein/aus. *WARNUNG* „Land-Info“ &gt; „Optionen“ &gt; „Terrain bearbeiten“ ermöglicht jedem das Terraformen Ihres Grundbesitzes und das Setzen und Verschieben von Linden-Pflanzen. Überlegen Sie sich, wem Sie diese Fähigkeit verleihen. Diese Einstellung finden Sie unter „Land-Info“ &gt; „Optionen“." name="land edit"/>
<action description="„Land-Info“-Optionen einstellen" longdescription="„Sicher (kein Schaden)“ und „Fliegen“ ein- und ausschalten und Einwohnern folgende Aktionen erlauben: „Terrain bearbeiten“, „Bauen“, „Landmarken erstellen“ und „Skripts ausführen“ auf gruppeneigenem Land in „Land-Info“ &gt; Registerkarte „Optionen“." name="land options"/>
</action_set>
<action_set description="Diese Fähigkeiten ermöglichen es, Mitgliedern das Umgehen von Restriktionen auf gruppeneigenen Parzellen zu erlauben." name="Parcel Powers">
@@ -46,7 +46,7 @@
<action description="Parzelleneinstellungen für „Pässe verkaufen“ ändern" longdescription="Die Parzellen-Einstellungen für „Pässe verkaufen“ ändern Sie unter „Land-Info“ &gt; Registerkarte „Zugang“." name="land manage passes"/>
<action description="Einwohner aus Parzellen werfen und einfrieren" longdescription="Mitglieder in einer Rolle mit dieser Fähigkeit können gegen unerwünschte Einwohner auf einer gruppeneigenen Parzelle Maßnahmen ergreifen. Klicken Sie den Einwohner mit rechts an und wählen Sie „Hinauswerfen“ oder „Einfrieren“." name="land admin"/>
</action_set>
- <action_set description="Diese Fähigkeiten ermöglichen es, Mitgliedern das Zurückgeben von Objekten sowie das Platzieren und Verschieben von Linden-Pflanzen zu erlauben. Mitglieder können das Grundstück aufräumen und an der Landschaftsgestaltung mitwirken. Aber Vorsicht: Zurückgegebene Objekte können nicht mehr zurückgeholt werden." name="Parcel Content">
+ <action_set description="Diese Fähigkeiten ermöglichen es, Mitgliedern das Zurückgeben von Objekten sowie das Platzieren und Verschieben von Linden-Pflanzen zu erlauben. Mitglieder können den Grundbesitz aufräumen und an der Landschaftsgestaltung mitwirken. Aber Vorsicht: Zurückgegebene Objekte können nicht mehr zurückgeholt werden." name="Parcel Content">
<action description="Gruppeneigene Objekte zurückgeben" longdescription="Gruppeneigene Objekte auf gruppeneigenen Parzellen können Sie unter „Land-Info“ &gt; „Objekte“ zurückgeben." name="land return group owned"/>
<action description="Gruppenobjekte zurückgeben" longdescription="Gruppenobjekte auf gruppeneigenen Parzellen können Sie unter „Land-Info“ &gt; „Objekte“ zurückgeben." name="land return group set"/>
<action description="Gruppenfremde Objekte zurückgeben" longdescription="Objekte von gruppenfremden Personen auf gruppeneigenen Parzellen können Sie unter „Land-Info“ &gt; „Objekte“ zurückgeben." name="land return non group"/>
diff --git a/indra/newview/skins/default/xui/de/sidepanel_inventory.xml b/indra/newview/skins/default/xui/de/sidepanel_inventory.xml
index f6cf911bb3..96dd181854 100644
--- a/indra/newview/skins/default/xui/de/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/de/sidepanel_inventory.xml
@@ -2,10 +2,12 @@
<panel label="Sonstiges" name="objects panel">
<panel label="" name="sidepanel__inventory_panel">
<panel name="button_panel">
- <button label="Profil" name="info_btn"/>
- <button label="Anziehen" name="wear_btn"/>
+ <button label="Profil" name="info_btn" tool_tip="Objektprofil anzeigen"/>
+ <button label="Teilen" name="share_btn" tool_tip="Inventarobjekt teilen"/>
+ <button label="Shop" name="shop_btn" tool_tip="Marktplatz-Webseite öffnen"/>
+ <button label="Anziehen" name="wear_btn" tool_tip="Ausgewähltes Outfit tragen"/>
<button label="Wiedergeben" name="play_btn"/>
- <button label="Teleportieren" name="teleport_btn"/>
+ <button label="Teleportieren" name="teleport_btn" tool_tip="Zu ausgewähltem Standort teleportieren"/>
</panel>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/sidepanel_task_info.xml b/indra/newview/skins/default/xui/de/sidepanel_task_info.xml
index 9f8fdc085a..990543b725 100644
--- a/indra/newview/skins/default/xui/de/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/de/sidepanel_task_info.xml
@@ -37,8 +37,8 @@
Mischverkauf
</panel.string>
<text name="title" value="Objektprofil"/>
- <text name="where" value="(Inworld)"/>
- <panel label="">
+ <text name="where" value="(inworld)"/>
+ <panel label="" name="properties_panel">
<text name="Name:">
Name:
</text>
@@ -85,7 +85,7 @@
<text name="GroupLabel">
Gruppe:
</text>
- <check_box label="Teilen" name="checkbox share with group" tool_tip="Mit allen Mitgliedern der zugeordneten Gruppe, Ihre Berechtigungen dieses Objekt zu ändern teilen. Sie müssen Übereignen, um Rollenbeschränkungen zu aktivieren."/>
+ <check_box label="Teilen" name="checkbox share with group" tool_tip="Mit allen Mitgliedern der zugeordneten Gruppe, Ihre Berechtigungen dieses Objekt zu ändern, teilen. Sie müssen Übereignen, um Rollenbeschränkungen zu aktivieren."/>
<text name="NextOwnerLabel">
Nächster Eigentümer:
</text>
@@ -96,7 +96,7 @@
<check_box label="Zum Verkauf" name="checkbox for sale"/>
<combo_box name="sale type">
<combo_box.item label="Kopieren" name="Copy"/>
- <combo_box.item label="Inhalte" name="Contents"/>
+ <combo_box.item label="Inhalt" name="Contents"/>
<combo_box.item label="Original" name="Original"/>
</combo_box>
<spinner label="Preis: L$" name="Edit Cost"/>
@@ -122,7 +122,8 @@
</panel>
<panel name="button_panel">
<button label="Öffnen" name="open_btn"/>
- <button label="Zahlen" name="pay_btn"/>
+ <button label="Bezahlen" name="pay_btn"/>
<button label="Kaufen" name="buy_btn"/>
+ <button label="Details" name="details_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index 858bbf27b1..bc4f20df26 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -23,7 +23,22 @@
Hardware wird erfasst...
</string>
<string name="StartupLoading">
- Wird geladen
+ [APP_NAME] wird geladen...
+ </string>
+ <string name="StartupClearingCache">
+ Cache wird gelöscht...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ Textur-Cache wird initialisiert...
+ </string>
+ <string name="StartupInitializingVFS">
+ VFS wird initialisiert...
+ </string>
+ <string name="ProgressRestoring">
+ Wird wiederhergestellt...
+ </string>
+ <string name="ProgressChangingResolution">
+ Auflösung wird geändert...
</string>
<string name="Fullbright">
Fullbright (Legacy)
@@ -85,9 +100,18 @@
<string name="LoginDownloadingClothing">
Kleidung wird geladen...
</string>
+ <string name="CertExpired">
+ Das vom Grid ausgegebene Zertifikate ist abgelaufen. Bitte überprüfen Sie Ihre Systemuhr oder kontaktieren Sie Ihren Grid-Administrator.
+ </string>
+ <string name="CertInvalidSignature">
+ Die Zertifikatsunterschrift des Gridservers konnte nicht bestätigt werden. Bitte kontaktieren Sie Ihren Grid-Administrator.
+ </string>
<string name="LoginFailedNoNetwork">
Netzwerk Fehler: Eine Verbindung konnte nicht hergestellt werden. Bitte überprüfen Sie Ihre Netzwerkverbindung.
</string>
+ <string name="LoginFailed">
+ Anmeldung fehlgeschlagen
+ </string>
<string name="Quit">
Beenden
</string>
@@ -97,6 +121,24 @@
<string name="AgentLostConnection">
In dieser Region kann es zu Problemen kommen. Bitte überprüfen Sie Ihre Internetverbindung.
</string>
+ <string name="SavingSettings">
+ Ihr Einstellungen werden gespeichert...
+ </string>
+ <string name="LoggingOut">
+ Abmeldung erfolgt...
+ </string>
+ <string name="ShuttingDown">
+ Programm wird beendet...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ Die Verbindung zu der Region ist abgebrochen.
+ </string>
+ <string name="SentToInvalidRegion">
+ Sie wurden in eine ungültige Region geschickt.
+ </string>
+ <string name="TestingDisconnect">
+ Verbindungsabbruch wird getestet
+ </string>
<string name="TooltipPerson">
Person
</string>
@@ -151,6 +193,24 @@
<string name="TooltipAgentUrl">
Anklicken, um das Profil dieses Einwohners anzuzeigen
</string>
+ <string name="TooltipAgentMute">
+ Klicken, um diesen Einwohner stummzuschalten
+ </string>
+ <string name="TooltipAgentUnmute">
+ Klicken, um diesen Einwohner freizuschalten
+ </string>
+ <string name="TooltipAgentIM">
+ Klicken, um diesem Einwohner eine IM zu schicken.
+ </string>
+ <string name="TooltipAgentPay">
+ Klicken, um diesen Einwohner zu bezahlen
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Klicken, um diesem Einwohner einen Teleport anzubieten.
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Klicken, um diesem Einwohner ein Freundschaftsangebot zu schicken.
+ </string>
<string name="TooltipGroupUrl">
Anklicken, um Beschreibung der Gruppe anzuzeigen
</string>
@@ -176,18 +236,40 @@
Anklicken, um Befehl secondlife:// auszuführen
</string>
<string name="CurrentURL" value=" CurrentURL: [CurrentURL]"/>
+ <string name="TooltipPrice" value="[PRICE] L$"/>
<string name="SLurlLabelTeleport">
Teleportieren nach
</string>
<string name="SLurlLabelShowOnMap">
Karte anzeigen für
</string>
+ <string name="SLappAgentMute">
+ Stummschalten
+ </string>
+ <string name="SLappAgentUnmute">
+ Stummschaltung aufheben
+ </string>
+ <string name="SLappAgentIM">
+ IM
+ </string>
+ <string name="SLappAgentPay">
+ Bezahlen
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Teleportangebot an
+ </string>
+ <string name="SLappAgentRequestFriend">
+ Freundschaftsangebot
+ </string>
<string name="BUTTON_CLOSE_DARWIN">
Schließen (⌘W)
</string>
<string name="BUTTON_CLOSE_WIN">
Schließen (Strg+W)
</string>
+ <string name="BUTTON_CLOSE_CHROME">
+ Schließen
+ </string>
<string name="BUTTON_RESTORE">
Wiederherstellen
</string>
@@ -227,12 +309,12 @@
<string name="AvatarNameMultiple">
(mehrere)
</string>
- <string name="AvatarNameHippos">
- (hippos)
- </string>
<string name="GroupNameNone">
(keiner)
</string>
+ <string name="AvalineCaller">
+ Avaline-Anfrufer [ORDER]
+ </string>
<string name="AssetErrorNone">
Kein Fehler
</string>
@@ -338,6 +420,9 @@
<string name="symbolic link">
Link
</string>
+ <string name="symbolic folder link">
+ Link zu Ordner
+ </string>
<string name="AvatarEditingAppearance">
(Aussehen wird bearbeitet)
</string>
@@ -593,6 +678,9 @@
<string name="hang_up">
Verbindung mit In-Welt-Voice-Chat getrennt
</string>
+ <string name="reconnect_nearby">
+ Sie werden nun wieder mit dem Chat in Ihrer Nähe verbunden
+ </string>
<string name="ScriptQuestionCautionChatGranted">
Dem Objekt „[OBJECTNAME]“, ein Objekt von „[OWNERNAME]“, in [REGIONNAME] [REGIONPOS], wurde folgende Berechtigung erteilt: [PERMISSIONS].
</string>
@@ -636,7 +724,7 @@
Nicht verbunden
</string>
<string name="SIM_ACCESS_PG">
- Allgemein
+ Generell
</string>
<string name="SIM_ACCESS_MATURE">
Moderat
@@ -653,6 +741,12 @@
<string name="land_type_unknown">
(unbekannt)
</string>
+ <string name="Estate / Full Region">
+ Grundstück / Vollständige Region
+ </string>
+ <string name="Mainland / Full Region">
+ Mainland / Vollständige Region
+ </string>
<string name="all_files">
Alle Dateien
</string>
@@ -758,6 +852,12 @@
<string name="invalid">
ungültig
</string>
+ <string name="NewWearable">
+ Neue/r/s [WEARABLE_ITEM]
+ </string>
+ <string name="CreateNewWearable">
+ [WEARABLE_TYPE] erstellen
+ </string>
<string name="next">
Weiter
</string>
@@ -825,10 +925,10 @@
ESC drücken, um zur Normalansicht zurückzukehren
</string>
<string name="InventoryNoMatchingItems">
- Im Inventar wurden keine passenden Objekte gefunden.
+ Sie haben nicht das Richtige gefunden? Versuchen Sie es mit der [secondlife:///app/search/all Suche].
</string>
<string name="FavoritesNoMatchingItems">
- Hier eine Landmarke hin ziehen, um diese zu Ihrem Favoriten hinzuzufügen.
+ Landmarke hier hin ziehen, um diese hinzuzufügen.
</string>
<string name="InventoryNoTexture">
Sie haben keine Kopie dieser Textur in Ihrem Inventar.
@@ -846,6 +946,7 @@
Keine Inhalte
</string>
<string name="WornOnAttachmentPoint" value=" (getragen am [ATTACHMENT_POINT])"/>
+ <string name="ActiveGesture" value="[GESLABEL] (aktiviert)"/>
<string name="PermYes">
Ja
</string>
@@ -945,6 +1046,9 @@
<string name="InvFolder My Outfits">
Meine Outfits
</string>
+ <string name="InvFolder Accessories">
+ Zubehör
+ </string>
<string name="InvFolder Friends">
Freunde
</string>
@@ -979,7 +1083,7 @@
Gummi
</string>
<string name="Light">
- Licht
+ Hell
</string>
<string name="KBShift">
Umschalt-Taste
@@ -1180,7 +1284,7 @@
Oben links
</string>
<string name="Center">
- Zentrieren
+ Mitte
</string>
<string name="Bottom Left">
Unten links
@@ -1256,7 +1360,7 @@
(unbekannt)
</string>
<string name="SummaryForTheWeek" value="Zusammenfassung für diese Woche, beginnend am "/>
- <string name="NextStipendDay" value="Der nächste Stipendium-Tag ist "/>
+ <string name="NextStipendDay" value=". Der nächste Stipendium-Tag ist "/>
<string name="GroupIndividualShare" value=" Gruppenanteil Einzelanteil"/>
<string name="Balance">
Kontostand
@@ -1286,13 +1390,13 @@
Fehler
</string>
<string name="RegionInfoAllEstatesOwnedBy">
- alle Grundstücke gehören [OWNER]
+ alle Grundbesitze gehören [OWNER]
</string>
<string name="RegionInfoAllEstatesYouOwn">
- alle Grundstücke, die Sie besitzen
+ alle Grundbesitze, die Sie besitzen
</string>
<string name="RegionInfoAllEstatesYouManage">
- alle Grundstücke, die Sie für [OWNER] verwalten
+ alle Grundbesitze, die Sie für [OWNER] verwalten
</string>
<string name="RegionInfoAllowedResidents">
Zulässige Einwohner: ([ALLOWEDAGENTS], max [MAXACCESS])
@@ -1324,6 +1428,9 @@
<string name="ScriptLimitsRequestError">
Fehler bei Informationsabruf
</string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ Keine Parzellen wurden ausgewählt
+ </string>
<string name="ScriptLimitsRequestWrongRegion">
Fehler: Skriptinformationen sind nur für Ihre aktuelle Region verfügbar
</string>
@@ -1465,6 +1572,12 @@
<string name="PanelContentsNewScript">
Neues Skript
</string>
+ <string name="PanelContentsTooltip">
+ Objektinhalt
+ </string>
+ <string name="BusyModeResponseDefault">
+ Der Einwohner/Die Einwohnerin ist „beschäftigtâ€, d.h. er/sie möchte im Moment nicht gestört werden. Ihre Nachricht wird dem Einwohner/der Einwohnerin als IM angezeigt, und kann später beantwortet werden.
+ </string>
<string name="MuteByName">
(nach Namen)
</string>
@@ -1478,14 +1591,12 @@
(Gruppe)
</string>
<string name="RegionNoCovenant">
- Für dieses Grundstück liegt kein Vertrag vor.
+ Für diesen Grundbesitz liegt kein Vertrag vor.
</string>
<string name="RegionNoCovenantOtherOwner">
- Für dieses Grundstück liegt kein Vertrag vor. Das Land auf diesem Grundstück wird vom Grundstückseigentümer und nicht von Linden Lab verkauft. Für Informationen zum Verkauf setzen Sie sich bitte mit dem Grundstückseigentümer in Verbindung.
- </string>
- <string name="covenant_last_modified">
- Zuletzt geändert:
+ Für diesen Grundbesitz liegt kein Vertrag vor. Das Land auf diesem Grundbesitz wird vom Grundbesitzer und nicht von Linden Lab verkauft. Für Informationen zum Verkauf setzen Sie sich bitte mit dem Grundbesitzer in Verbindung.
</string>
+ <string name="covenant_last_modified" value="Zuletzt geändert:"/>
<string name="none_text" value=" (keiner) "/>
<string name="never_text" value=" (nie) "/>
<string name="GroupOwned">
@@ -1501,7 +1612,10 @@
(wird nach Veröffentlichung aktualisiert)
</string>
<string name="NoPicksClassifiedsText">
- Es wurde keine Auswahl getroffen/keine Anzeigen ausgewählt
+ Sie haben keine Auswahl oder Anzeigen erstelllt. Klicken Sie auf die „Plus&quot;-Schaltfläche, um eine Auswahl oder Anzeige zu erstellen.
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ Der Einwohner hat eine Auswahl oder Anzeigen im Profil.
</string>
<string name="PicksClassifiedsLoadingText">
Wird geladen...
@@ -1576,7 +1690,10 @@
Abbrechen
</string>
<string name="UploadingCosts">
- Hochladen von %s kostet
+ Das Hochladen von [NAME] kostet [AMOUNT] L$
+ </string>
+ <string name="BuyingCosts">
+ Die Kosten betragen: [AMOUNT] L$
</string>
<string name="UnknownFileExtension">
Unbekanntes Dateiformat .%s
@@ -2053,7 +2170,7 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
Kinn-Hals
</string>
<string name="Clear">
- Löschen
+ Transparent
</string>
<string name="Cleft">
Spalte
@@ -2356,16 +2473,16 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
Farbe Innenseite
</string>
<string name="In Shdw Opacity">
- Deckkraft: innerer Lidschatten
+ Deckkraft: innen
</string>
<string name="Inner Eye Corner">
Ecke: Nasenseite
</string>
<string name="Inner Eye Shadow">
- Innerer Lidschatten
+ Innenlid
</string>
<string name="Inner Shadow">
- Innerer Lidschatten
+ Innenlid
</string>
<string name="Jacket Length">
Jackenlänge
@@ -2758,10 +2875,10 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
Aus
</string>
<string name="Out Shdw Color">
- Farbe: Oberer Lidschatten
+ Farbe: Oben
</string>
<string name="Out Shdw Opacity">
- Deckkraft: Oberer Lidschatten
+ Deckkraft: Oben
</string>
<string name="Outer Eye Corner">
Äußerer Augenwinkel
@@ -2932,7 +3049,7 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
Schuhart
</string>
<string name="Short">
- Sandale
+ Klein
</string>
<string name="Short Arms">
Kurze Arme
@@ -3061,7 +3178,7 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
Nach vorne
</string>
<string name="Tall">
- Stiefel
+ Groß
</string>
<string name="Taper Back">
Ansatzbreite hinten
@@ -3213,6 +3330,15 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
<string name="LocationCtrlDamageTooltip">
Gesundheit
</string>
+ <string name="LocationCtrlAdultIconTooltip">
+ Adult-Region
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ Moderate Region
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ Generelle Region
+ </string>
<string name="UpdaterWindowTitle">
[APP_NAME] Aktualisierung
</string>
@@ -3243,6 +3369,12 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
<string name="UpdaterFailStartTitle">
Viewer konnte nicht gestartet werden
</string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME]: Zuviele Objekte auf einmal von [FROM_NAME]. Automaitsche Vorschau ist für [TIME] Sekunden nicht verfügbar.
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME]: Zuviele Objekte auf einmal. Automaitsche Vorschau ist für [TIME] Sekunden nicht verfügbar.
+ </string>
<string name="IM_logging_string">
-- Instant-Message-Protokoll aktiviert --
</string>
@@ -3265,16 +3397,13 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
Für Instant Message hier klicken.
</string>
<string name="IM_to_label">
- Bis
+ An
</string>
<string name="IM_moderator_label">
(Moderator)
</string>
- <string name="started_call">
- haben/hat einen Anruf initiiert
- </string>
- <string name="joined_call">
- ist dem Gespräch beigetreten
+ <string name="answered_call">
+ Ihr Anruf wurde entgegengenommen
</string>
<string name="ringing-im">
Verbindung wird hergestellt...
@@ -3363,4 +3492,178 @@ Falls diese Meldung weiterhin angezeigt wird, wenden Sie sich bitte an [SUPPORT_
<string name="unread_chat_multiple">
[SOURCES] haben etwas Neues gesagt
</string>
+ <string name="session_initialization_timed_out_error">
+ Die Initialisierung der Sitzung ist fehlgeschlagen
+ </string>
+ <string name="voice_morphing_url">
+ http://secondlife.com/landing/voicemorphing
+ </string>
+ <string name="paid_you_ldollars">
+ [NAME] hat Ihnen [AMOUNT] L$ bezahlt.
+ </string>
+ <string name="you_paid_ldollars">
+ Sie haben [REASON] [AMOUNT] L$ an [NAME] bezahlt.
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ Sie haben [AMOUNT] L$ bezahlt.
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ Sie haben [AMOUNT] L$ an [NAME] bezahlt.
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ Sie haben [REASON] [AMOUNT] L$ bezahlt.
+ </string>
+ <string name="for a parcel of land">
+ für eine Landparzelle
+ </string>
+ <string name="for a land access pass">
+ für einen Pass
+ </string>
+ <string name="for deeding land">
+ für die Landübertragung
+ </string>
+ <string name="to create a group">
+ für die Gründung einer Gruppe
+ </string>
+ <string name="to join a group">
+ für den Beitritt zur Gruppe
+ </string>
+ <string name="to upload">
+ fürs Hochladen
+ </string>
+ <string name="giving">
+ [AMOUNT] L$ werden bezahlt
+ </string>
+ <string name="uploading_costs">
+ Kosten für Hochladen [AMOUNT] L$
+ </string>
+ <string name="this_costs">
+ Kosten: [AMOUNT] L$
+ </string>
+ <string name="buying_selected_land">
+ Ausgewähltes Land wird für [AMOUNT] L$ gekauft.
+ </string>
+ <string name="this_object_costs">
+ Dieses Objekt kostet [AMOUNT] L$
+ </string>
+ <string name="group_role_everyone">
+ Jeder
+ </string>
+ <string name="group_role_officers">
+ Offiziere
+ </string>
+ <string name="group_role_owners">
+ Eigentümer
+ </string>
+ <string name="uploading_abuse_report">
+ Bericht wird hochgeladen...
+
+Missbrauchsbericht
+ </string>
+ <string name="New Shape">
+ Neue Form/Gestalt
+ </string>
+ <string name="New Skin">
+ Neue Haut
+ </string>
+ <string name="New Hair">
+ Neues Haar
+ </string>
+ <string name="New Eyes">
+ Neue Augen
+ </string>
+ <string name="New Shirt">
+ Neues Hemd
+ </string>
+ <string name="New Pants">
+ Neue Hose
+ </string>
+ <string name="New Shoes">
+ Neue Schuhe
+ </string>
+ <string name="New Socks">
+ Neue Socken
+ </string>
+ <string name="New Jacket">
+ Neue Jacke
+ </string>
+ <string name="New Gloves">
+ Neue Handschuhe
+ </string>
+ <string name="New Undershirt">
+ Neues Unterhemd
+ </string>
+ <string name="New Underpants">
+ Neue Unterhose
+ </string>
+ <string name="New Skirt">
+ Neuer Rock
+ </string>
+ <string name="New Alpha">
+ Neues Alpha
+ </string>
+ <string name="New Tattoo">
+ Neue Tätowierung
+ </string>
+ <string name="Invalid Wearable">
+ Ungültiges Objekt
+ </string>
+ <string name="New Script">
+ Neues Skript
+ </string>
+ <string name="New Folder">
+ Neuer Ordner
+ </string>
+ <string name="Contents">
+ Inhalt
+ </string>
+ <string name="Female - Excuse me">
+ Weiblich - Räuspern
+ </string>
+ <string name="Female - Get lost">
+ Weiblich - Get lost
+ </string>
+ <string name="Female - Blow kiss">
+ Weiblich - Kusshand
+ </string>
+ <string name="Female - Boo">
+ Weiblich - Buh
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ Keine/Keiner
+ </string>
+ <string name="texture_load_dimensions_error">
+ Bilder, die größer sind als [WIDTH]*[HEIGHT] können nicht geladen werden
+ </string>
+ <string name="words_separator" value=","/>
+ <string name="server_is_down">
+ Trotz all unserer Bemühungen ist ein unerwarteter Fehler aufgetreten.
+
+ Bitte überprüfen Sie status.secondlifegrid.net, um festzustellen, ob ein Problem besteht.
+ Falls Sie weiterhin Problem haben, überprüfen Sie bitte Ihre Netzwerk- und Firewalleinstellungen.
+ </string>
+ <string name="dateTimeWeekdaysNames">
+ Sonntag:Montag:Dienstag:Mittwoch:Donnerstag:Freitag:Samstag
+ </string>
+ <string name="dateTimeWeekdaysShortNames">
+ So:Mo:Di:Mi:Do:Fr:Sa
+ </string>
+ <string name="dateTimeMonthNames">
+ Januar:Februar:März:April:Mai:Juni:Juli:August:September:Oktober:November:Dezember
+ </string>
+ <string name="dateTimeMonthShortNames">
+ Jan:Feb:Mär:Apr:Mai:Jun:Jul:Aug:Sep:Okt:Nov:Dez
+ </string>
+ <string name="dateTimeDayFormat">
+ [MDAY]
+ </string>
+ <string name="dateTimeAM">
+ Uhr
+ </string>
+ <string name="dateTimePM">
+ Uhr
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/de/teleport_strings.xml b/indra/newview/skins/default/xui/de/teleport_strings.xml
index 2c56eff0a3..69c952c532 100644
--- a/indra/newview/skins/default/xui/de/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/de/teleport_strings.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<teleport_messages name="">
+<teleport_messages>
<message_set name="errors">
<message name="invalid_tport">
Bei der Bearbeitung Ihrer Teleport-Anfrage ist ein Problem aufgetreten. Sie müssen sich zum Teleportieren eventuell neu anmelden.
@@ -62,6 +62,9 @@ Ihre Teleport-Anfrage kann nicht sofort bearbeitet werden. Versuchen Sie es in e
<message name="completing">
Teleport wird abgeschlossen.
</message>
+ <message name="completed_from">
+ Teleport aus [T_SLURL] wurde erfolgreich abgeschlossen.
+ </message>
<message name="resolving">
Ziel wird ermittelt.
</message>
diff --git a/indra/newview/skins/default/xui/en/alert_line_editor.xml b/indra/newview/skins/default/xui/en/alert_line_editor.xml
index 97991153d8..82bf5fc8da 100644
--- a/indra/newview/skins/default/xui/en/alert_line_editor.xml
+++ b/indra/newview/skins/default/xui/en/alert_line_editor.xml
@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<line_editor
select_on_focus="false"
- handle_edit_keys_directly="false"
revert_on_esc="true"
commit_on_focus_lost="true"
ignore_tab="true"
diff --git a/indra/newview/skins/default/xui/en/floater_about.xml b/indra/newview/skins/default/xui/en/floater_about.xml
index bc67621dfd..b5be03346e 100644
--- a/indra/newview/skins/default/xui/en/floater_about.xml
+++ b/indra/newview/skins/default/xui/en/floater_about.xml
@@ -49,7 +49,7 @@ libcurl Version: [LIBCURL_VERSION]
J2C Decoder Version: [J2C_VERSION]
Audio Driver Version: [AUDIO_DRIVER_VERSION]
Qt Webkit Version: [QT_WEBKIT_VERSION]
-Vivox Version: [VIVOX_VERSION]
+Voice Server Version: [VOICE_VERSION]
</floater.string>
<floater.string
name="none">
@@ -76,7 +76,7 @@ Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number
allow_html="true"
follows="top|left"
font="SansSerif"
- height="350"
+ height="343"
bg_readonly_color="Transparent"
left="5"
max_length="65536"
@@ -110,19 +110,14 @@ Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number
top="5"
width="435"
word_wrap="true">
-Second Life is brought to you by Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les and many others.
+Second Life is brought to you by Philip, Tessa, Andrew, Cory, Ian, James, Phoenix, Ryan, Haney, Dan, Char, Ben, John, Tanya, Eddie, Richard, Mitch, Doug, Eric, Frank, Bruce, Aaron, Peter, Alice, Charlie, Debra, Eileen, Helen, Janet, Steffan, Steve, Tom, Mark, Hunter, Xenon, Burgess, Bill, Jim, Lee, Hamlet, Daniel, Jeff, Todd, Sarah, Tim, Stephanie, Colin, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Jack, Vektor, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Jesse, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Yuko, Makiko, Thomas, Harry, Seth, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Brad, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, Beez, Milo, Hermia, Red, Thrax, Gulliver, Joe, Sally, Paul, Jose, Rejean, Dore, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, Dustin, George, Del, Matthew, Cat, Jacqui, Adrian, Viola, Alfred, Noel, Irfan, Yool, Rika, Jane, Frontier, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Jeremy, JP, Jake, Anthony, Maurice, Madhavi, Leopard, Kyle, Joon, Bert, Belinda, Jon, Kristi, Bridie, Pramod, Socrates, Maria, Aric, Adreanne, Jay, Kari, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Colossus, Zen, BigPapi, Pastrami, Kurz, Mani, Neuro, Mel, Sardonyx, MJ, Rowan, Sgt, Elvis, Samuel, Leo, Bryan, Niko, Austin, Soft, Poppy, Rachel, Aki, Banzai, Alexa, Sue, Bender, CG, Angelo, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Rothman, Niall, Marin, Allison, Katie, Dawn, Dusty, Katt, Judy, Andrea, Ambroff, Infinity, Rico, Gail, Kalpana, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Maestro, Simone, Yang, T, Shannon, Nelson, Khanh, Scott, Courtney, Charlene, Quixote, Susan, Zed, Amanda, Katelin, Enkidu, Roxie, Esbee, JoRoan, Scarlet, Tay, Kevin, Wolfgang, Johnny, Ray, Andren, Merov, Bob, Rand, Howard, Callen, Heff, Galen, Newell, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl, Ashley, JessieAnn, Huseby, Karina, Paris, Kurt, Rick, Lis, Kotler, Theeba, Lynx, Murphy, Doten, Taka, Norm, Jillian, Marcus, Mae, Novack, Esther, Perry, Dana, Ducot, Javier, Porter, Madison, Gecko, Dough, JR, Gisele, Crimp, Norie, Arch, Kimi, Fisher, Barbara, Jason, Peggy, Bernard, Jules, Leroy, Eva, Khederian, Campbell, Vogt, Masido, Karel, Torres, Lo, Breezer, Delby, Rountree, Anna, Servus, Rue, Itiaes, Chuck, Luna, Novella, Zaza, Wen, Gino, Lex, Cassandra, Limey, Nancy, Anukul, Silver, Brodesky, Jinsai, Squid, Gez, Rakesh, Ladan, Edelman, Marcet, Squire, Tatem, Tony, Jerm, Tia, Falcon, BK, Tiggs, Driscoll, Bacon, Timothee, Cru, Carmilla, Coyot, Webb, Kazu, Rudas, LJ, Sea, Ali Wallace, Bewest, Pup, Drub, Dragon, Inoshiro, Byron, Rhett, Xandix, Aimee, Fredrik, Thor, Teddy, Baron, Nelly, Ghengis, Epic, Eli, Stone, Grapes, Irie, Prep, Scobu, Valerie, Alain, and many others.
-Thank you to the following Residents for helping to ensure that this is the best version yet: (in progress)
+Thank you to the following Residents for helping to ensure that this is the best version yet: Drew Dwi, Zai Lynch, Latif Khalifa, Ellla McMahon, Harleen Gretzky, Squirrel Wood, Malarthi Behemoth, Dante Tucker, Buckaroo Mu, Eddi Decosta, Dirk, Talamasca, Torben Trautman, Irene Muni, Lilly Zenovka, Vick Forcella, Sasy Scarborough, Gentle Welinder, Elric Anatine, Techwolf Lupindo, Dusan Writer, WolfPup Lowenhar, Marianne McCann, Fiachra Lach, Sitearm Madonna, Sudane Erato, Sahkolihaa Contepomi, Sachi Vixen, Questar Utu, Dimitrio Lewis, Matto Destiny, Scrim Pinion, Radio Signals, Psi Merlin, Pixel Gausman, Mel Vanbeeck, Laurent Bechir, Lamorna Proctor, Lares Carter, Gwyneth Llewelyn, Hydra Shaftoe, Holger Gilruth, Gentle Heron, Carla Broek, Boroondas Gupte, Fury Rosewood, Flower Ducatillon, Colpo Wexler, gwampa Lomu, Borg Capalini, Beansy Twine, Ardy Lay, , 45ms Zhong, Adeon Writer, Aeonix Aeon, Ai Austin, Aiko Ying, Alexandrea Fride, Alliez Mysterio, Annie Milestone, Annika Genezzia, Ansariel Hiller, ArminasX Saiman, Arya Braveheart, Asaeda Meltingdots, Asturkon Jua, Avallyn Oakleaf, Avatar Quinzet, BabyA Littlething, Bacchus Ireto, Bazaar, Riva, Benjamin Bigdipper, Beth Walcher, Bezilon Kasei, Biancaluce Robbiani, Bill Walach, blakopal Galicia, Blitzckreed Levenque, Bryn Oh, Callipygian Christensen, Cap Carver, Carr Arbenlow, Chantal Harvey, Charles Courtois, Charlie Sazaland, Cherry Cheevers, ChickyBabes Zuzu, Christopher Organiser, Ciaran Laval, Clara Young, Celierra Darling, Corinne Helendale, Corro Moseley, Coughdrop Littlething, Darien Caldwell, Dartagan Shepherd, Debs Regent, Decro Schmooz, Denim Kamachi, DiJodi Dubratt, Dil Spitz, Edgware Marker, Egehan Dryke, Emma Portilo, Emmie Fairymeadow, Evangelista Emerald, Faelon Swordthain, Frenchimmo Sabra, Gaberoonie Zanzibar, Ganymedes Costagravas, Gene Frostbite, GeneJ Composer, Giggles Littlebird, Grady Echegaray, Guni Greenstein, Gypsy Tripsa, Hackshaven Harford, Ham Rambler, Han Shuffle, Hanglow Short, Hatzfeld Runo, herina Bode, Horatio Freund, Hypatia Callisto, Hypatia Pickens, Identity Euler, Imnotgoing Sideways, Innula Zenovka, Iyoba Tarantal, Jack Abraham, Jagga Meredith, Jennifer Boyle, Jeremy Marquez, Jessica Qin, Jinx Nordberg, Jo Bernandes, Jocial Sonnenkern, Joel Savard, Jondan Lundquist, Josef Munster, Josette Windlow, Juilan Tripsa, Juro Kothari, Justin RiversRunRed, Kagehi Kohn, Kaimen Takahe, Keklily Longfall, Ken Lavender, Kestral Karas, Khisme Nitely, Kimar Coba, Kithrak Kirkorian, Kitty Barnett, Kolor Fall, Komiko Okamoto, Korvel Noh, Larry Pixel, Leal Choche, len Starship, Lenae Munz, Lexi Frua, Lillie Cordeaux, Lizzy Macarthur, LSL Scientist, Luban Yiyuan, Luc Starsider, Maccus McCullough, Madison Blanc, Maggie Darwin, Mallory Destiny, Manx Wharton, Marc Claridge, Marc2 Sands, Matthew Anthony, Maxim RiversRunRed, Medhue Simoni, Melinda Latynina, Mencius Watts, Michi Lumin, Midian Farspire, Miles Glaz, Mindy Mathy, Mitch Wagner, Mo Hax, Mourna Biziou, Nao Noe, naofan Teardrop, Naomah Beaumont, Nathiel Siamendes, Nber Medici, Neko Link, Netpat Igaly, Neutron Chesnokov, Newfie Pendragon, Nicholai Laviscu, Nick Rhodes, Nicoladie Gymnast, Ollie Kubrick, Orenj Marat, Orion Delphis, Oryx Tempel, Parvati Silverweb, PeterPunk Mooney, Pixel Scientist, Pounce Teazle, Professor Noarlunga, Quantum Destiny, Quicksilver Hermes, Ralf Setsuko, RAT Quan, RedMokum Bravin, Revolution Perenti, Rezit Sideways, Rich Grainger, Rosco Teardrop, Rose Evans, Rudee Voom, RufusTT Horsefly, Saii Hallard, SaintLEOlions Zimer, Samm Larkham, Satanello Miami, SexySteven Morrisey, Sheet Spotter, Shnurui Troughton, sicarius Thorne, Sicarius Toxx, Sini Nubalo, SLB Wirefly, snowy Sidran, Soupa Segura, ST Mensing, Starshine Halasy, Stickman Ingmann, Synystyr Texan, Takeda Terrawyng, Tali Rosca, Templar Merlin, Tezcatlipoca Bisiani, Tiel Stonecutter, Tony Kembia, TouchaHoney Perhaps, Trey Reanimator, TriloByte Zanzibar, Trinity Dechou, Trinity Dejavu, Unlikely Quintessa, UsikuFarasi Kanarik, Veritas Raymaker, Vex Streeter, Viaticus Speculaas, Villain Baroque, Vixie Durant, Void Singer, Watty Berkson, Westley Schridde, Westley Streeter, Whimsy Winx, Winter Ventura, Wundur Primbee, xstorm Radek, YongYong Francois, Zak Westminster, Zana Kohime, Zaren Alexander, Zeja Pyle, ZenMondo Wormser, Zoex Flanagan, and many others.
-
-
-
-
-It is a rare mind indeed that can render the hitherto non-existent blindingly obvious. The cry 'I could have thought of that' is a very popular and misleading one, for the fact is that they didn't, and a very significant and revealing fact it is too.
- -- Douglas Adams
+"The work goes on, the cause endures, the hope still lives, and the dreams shall never die" - Edward Kennedy
</text_editor>
</panel>
<panel
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 61ca783d14..b9489895ae 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -9,6 +9,18 @@
title="ABOUT LAND"
width="490">
<floater.string
+ name="maturity_icon_general">
+ "Parcel_PG_Dark"
+ </floater.string>
+ <floater.string
+ name="maturity_icon_moderate">
+ "Parcel_M_Dark"
+ </floater.string>
+ <floater.string
+ name="maturity_icon_adult">
+ "Parcel_R_Dark"
+ </floater.string>
+ <floater.string
name="Minutes">
[MINUTES] minutes
</floater.string>
@@ -46,7 +58,7 @@
top="0">
<panel.string
name="new users only">
- New users only
+ New Residents only
</panel.string>
<panel.string
name="anyone">
@@ -96,6 +108,9 @@
name="no_selection_text">
No parcel selected.
</panel.string>
+ <panel.string name="time_stamp_template">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </panel.string>
<text
type="string"
length="1"
@@ -263,7 +278,7 @@ Leyla Linden </text>
left_pad="4"
right="-10"
name="Set..."
- width="50"
+ width="90"
top_delta="-2"/>
<check_box
enabled="false"
@@ -369,7 +384,7 @@ Leyla Linden </text>
layout="topleft"
left_delta="0"
name="Sell with landowners objects in parcel."
- top_pad="-3"
+ top_pad="-2"
width="186">
Objects included in sale
</text>
@@ -395,7 +410,7 @@ Leyla Linden </text>
name="Cancel Land Sale"
left_pad="5"
top_pad="-25"
- width="145" />
+ width="180" />
<text
type="string"
length="1"
@@ -474,10 +489,10 @@ Leyla Linden </text>
height="23"
label="Buy Land"
layout="topleft"
- left_delta="82"
+ left_delta="52"
name="Buy Land..."
top_pad="7"
- width="100" />
+ width="130" />
<button
enabled="true"
follows="left|top"
@@ -487,7 +502,7 @@ Leyla Linden </text>
left="10"
name="Scripts..."
top_pad="1"
- width="100" />
+ width="150" />
<button
enabled="false"
follows="left|top"
@@ -504,11 +519,11 @@ Leyla Linden </text>
height="23"
label="Buy Pass"
layout="topleft"
- left_delta="-105"
+ left_delta="-135"
name="Buy Pass..."
tool_tip="A pass gives you temporary access to this land."
top_delta="0"
- width="100" />
+ width="130" />
<button
follows="left|top"
height="23"
@@ -547,21 +562,26 @@ Leyla Linden </text>
left="0"
top="0"
help_topic="land_covenant_tab"
- name="land_covenant_panel">
+ name="land_covenant_panel"
+ word_wrap="true">
<panel.string
- name="can_resell">
+ name="can_resell"
+ word_wrap="true">
Purchased land in this region may be resold.
</panel.string>
<panel.string
- name="can_not_resell">
+ name="can_not_resell"
+ word_wrap="true">
Purchased land in this region may not be resold.
</panel.string>
<panel.string
- name="can_change">
+ name="can_change"
+ word_wrap="true">
Purchased land in this region may be joined or subdivided.
</panel.string>
<panel.string
- name="can_not_change">
+ name="can_not_change"
+ word_wrap="true">
Purchased land in this region may not be joined or subdivided.
</panel.string>
<text
@@ -619,7 +639,6 @@ Leyla Linden </text>
length="1"
enabled="false"
follows="all"
- handle_edit_keys_directly="true"
height="200"
layout="topleft"
left="10"
@@ -736,7 +755,8 @@ Leyla Linden </text>
left_pad="10"
mouse_opaque="false"
name="resellable_clause"
- width="330">
+ word_wrap="true"
+ width="360">
Land in this region may not be resold.
</text>
<text
@@ -805,7 +825,7 @@ Leyla Linden </text>
name="Simulator primitive usage:"
top_pad="4"
width="364">
- Primative usage:
+ Primitive usage:
</text>
<text
type="string"
@@ -1044,7 +1064,8 @@ Leyla Linden </text>
left="10"
name="Autoreturn"
top_pad="0"
- width="294">
+ width="412"
+ wrap="true">
Auto return other Residents&apos; objects (minutes, 0 for off):
</text>
<line_editor
@@ -1056,9 +1077,9 @@ Leyla Linden </text>
layout="topleft"
max_length="6"
name="clean other time"
- right="-72"
- width="56"
- top_delta="-6"/>
+ left_pad="0"
+ width="46"
+ top_delta="-2"/>
<text
type="string"
length="1"
@@ -1107,7 +1128,7 @@ Leyla Linden </text>
label="Type"
name="type"
sort_column="online_status"
- width="24" />
+ width="50" />
<name_list.columns
name="online_status"
width="-1" />
@@ -1222,7 +1243,7 @@ Only large parcels can be listed in search.
layout="topleft"
left_pad="2"
name="edit objects check"
- width="120" />
+ width="130" />
<check_box
height="16"
label="Group"
@@ -1248,7 +1269,7 @@ Only large parcels can be listed in search.
left_pad="2"
name="all object entry check"
top_delta="0"
- width="120" />
+ width="130" />
<check_box
height="16"
label="Group"
@@ -1275,7 +1296,7 @@ Only large parcels can be listed in search.
left_pad="2"
name="check other scripts"
top_delta="0"
- width="120" />
+ width="130" />
<check_box
height="16"
label="Group"
@@ -1329,7 +1350,7 @@ Only large parcels can be listed in search.
left="30"
name="land category with adult"
visible="false"
- width="130">
+ width="140">
<combo_box.item
label="Any Category"
name="item0"
@@ -1390,7 +1411,7 @@ Only large parcels can be listed in search.
left="30"
name="land category"
visible="false"
- width="130">
+ width="140">
<combo_box.item
label="Any Category"
name="item0"
@@ -1504,7 +1525,7 @@ Only large parcels can be listed in search.
name="Clear"
tool_tip="Clear the landing point"
right="-10"
- width="50" />
+ width="55" />
<text
type="string"
length="1"
@@ -1607,43 +1628,14 @@ Only large parcels can be listed in search.
layout="topleft"
left_pad="5"
name="set_media_url"
- width="50"
+ width="70"
top_delta="0"/>
- <text
- type="string"
- length="1"
- follows="left|top"
- height="20"
- layout="topleft"
- left="10"
- name="CurrentURL:"
- width="100"
- top_pad="10">
- Current Page:
- </text>
- <button
- follows="top|right"
- height="23"
- image_overlay="Refresh_Off"
- layout="topleft"
- name="reset_media_url"
- left_pad="0"
- tool_tip="Refresh URL"
- width="23"
- top_delta="0"/>
- <text
- follows="left|top"
- height="16"
- layout="topleft"
- left_pad="10"
- name="current_url"
- width="300" />
<check_box
follows="top|left"
height="16"
label="Hide URL"
layout="topleft"
- left_delta="-36"
+ left="110"
name="hide_media_url"
tool_tip="Checking this option will hide the media url to any non-authorized viewers of this parcel information. Note this is not available for HTML types."
width="50"
@@ -1825,6 +1817,15 @@ Only large parcels can be listed in search.
top_delta="0"
right="-15"
select_on_focus="true" />
+ <check_box
+ height="16"
+ label="Hide URL"
+ layout="topleft"
+ name="hide_music_url"
+ tool_tip="Checking this option will hide the music url to any non-authorized viewers of this parcel information."
+ left_delta="10"
+ top_pad="5"
+ width="292" />
<text
type="string"
length="1"
@@ -1894,6 +1895,10 @@ Only large parcels can be listed in search.
name="access_estate_defined">
(Defined by the Estate)
</panel.string>
+ <panel.string
+ name="allow_public_access">
+ Allow Public Access ([MATURITY])
+ </panel.string>
<panel.string
name="estate_override">
One or more of these options is set at the estate level
@@ -1914,7 +1919,6 @@ Only large parcels can be listed in search.
<check_box
follows="top|left"
height="16"
- label="Allow Public Access [MATURITY]"
layout="topleft"
left_delta="0"
name="public_access"
@@ -1929,7 +1933,7 @@ Only large parcels can be listed in search.
left_delta="20"
name="Only Allow"
top="49"
- width="278">
+ width="325">
Restrict Access to Residents verified by:
</text>
<check_box
diff --git a/indra/newview/skins/default/xui/en/floater_animation_preview.xml b/indra/newview/skins/default/xui/en/floater_animation_preview.xml
index 1ffedde29b..cb6b2f6ebc 100644
--- a/indra/newview/skins/default/xui/en/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_animation_preview.xml
@@ -218,14 +218,14 @@ Maximum animation length is [MAX_LENGTH] seconds.
increment="1"
initial_value="0"
label="In(%)"
- label_width="49"
+ label_width="70"
layout="topleft"
top_pad="5"
- left="30"
+ left="15"
max_val="100"
name="loop_in_point"
tool_tip="Sets point in animation that looping returns to"
- width="115" />
+ width="130" />
<spinner
bottom_delta="0"
follows="left|top"
@@ -238,8 +238,8 @@ Maximum animation length is [MAX_LENGTH] seconds.
max_val="100"
name="loop_out_point"
tool_tip="Sets point in animation that ends a loop"
- label_width="49"
- width="115" />
+ label_width="60"
+ width="120" />
<text
type="string"
length="1"
@@ -256,10 +256,10 @@ Maximum animation length is [MAX_LENGTH] seconds.
<combo_box
height="23"
layout="topleft"
- left_pad="0"
+ left_pad="20"
name="hand_pose_combo"
tool_tip="Controls what hands do during animation"
- width="150">
+ width="130">
<combo_box.item
label="Spread"
name="Spread"
@@ -328,71 +328,91 @@ Maximum animation length is [MAX_LENGTH] seconds.
</text>
<combo_box
height="23"
- width="150"
+ width="130"
layout="topleft"
- left_pad="0"
+ left_pad="20"
name="emote_combo"
tool_tip="Controls what face does during animation">
- <combo_box.item
- label="(None)"
- name="[None]" />
- <combo_box.item
- label="Aaaaah"
- name="Aaaaah" />
- <combo_box.item
- label="Afraid"
- name="Afraid" />
- <combo_box.item
- label="Angry"
- name="Angry" />
- <combo_box.item
- label="Big Smile"
- name="BigSmile" />
- <combo_box.item
- label="Bored"
- name="Bored" />
- <combo_box.item
- label="Cry"
- name="Cry" />
- <combo_box.item
- label="Disdain"
- name="Disdain" />
- <combo_box.item
- label="Embarrassed"
- name="Embarrassed" />
- <combo_box.item
- label="Frown"
- name="Frown" />
- <combo_box.item
- label="Kiss"
- name="Kiss" />
- <combo_box.item
- label="Laugh"
- name="Laugh" />
- <combo_box.item
- label="Plllppt"
- name="Plllppt" />
- <combo_box.item
- label="Repulsed"
- name="Repulsed" />
- <combo_box.item
- label="Sad"
- name="Sad" />
- <combo_box.item
- label="Shrug"
- name="Shrug" />
- <combo_box.item
- label="Smile"
- name="Smile" />
- <combo_box.item
- label="Surprise"
- name="Surprise" />
- <combo_box.item
- label="Wink"
- name="Wink" />
- <combo_box.item
- label="Worry"
- name="Worry" />
+ <item
+ label="(None)"
+ value=""
+ name="[None]" />
+ <item
+ label="Aaaaah"
+ value="Aaaaah"
+ name="Aaaaah" />
+ <item
+ label="Afraid"
+ value="Afraid"
+ name="Afraid" />
+ <item
+ label="Angry"
+ value="Angry"
+ name="Angry" />
+ <item
+ label="Big Smile"
+ value="Big Smile"
+ name="BigSmile" />
+ <item
+ label="Bored"
+ value="Bored"
+ name="Bored" />
+ <item
+ label="Cry"
+ value="Cry"
+ name="Cry" />
+ <item
+ label="Disdain"
+ value="Disdain"
+ name="Disdain" />
+ <item
+ label="Embarrassed"
+ value="Embarrassed"
+ name="Embarrassed" />
+ <item
+ label="Frown"
+ value="Frown"
+ name="Frown" />
+ <item
+ label="Kiss"
+ value="Kiss"
+ name="Kiss" />
+ <item
+ label="Laugh"
+ value="Laugh"
+ name="Laugh" />
+ <item
+ label="Plllppt"
+ value="Plllppt"
+ name="Plllppt" />
+ <item
+ label="Repulsed"
+ value="Repulsed"
+ name="Repulsed" />
+ <item
+ label="Sad"
+ value="Sad"
+ name="Sad" />
+ <item
+ label="Shrug"
+ value="Shrug"
+ name="Shrug" />
+ <item
+ label="Smile"
+ value="Smile"
+ name="Smile" />
+ <item
+ label="Surprise"
+ value="Surprise"
+ name="Surprise" />
+ <item
+ label="Wink"
+ value="Wink"
+ name="Wink" />
+ <item
+ label="Worry"
+ value="Worry"
+ name="Worry" />
</combo_box>
<text
type="string"
@@ -409,22 +429,26 @@ Maximum animation length is [MAX_LENGTH] seconds.
</text>
<combo_box
height="23"
- width="150"
+ width="130"
layout="topleft"
- left_pad="0"
+ left_pad="20"
name="preview_base_anim"
tool_tip="Use this to test your animation behavior while your avatar performs common actions.">
- <combo_box.item
+ <item
label="Standing"
+ value="Standing"
name="Standing" />
- <combo_box.item
+ <item
label="Walking"
+ value="Walking"
name="Walking" />
- <combo_box.item
+ <item
label="Sitting"
+ value="Sitting"
name="Sitting" />
- <combo_box.item
+ <item
label="Flying"
+ value="Flying"
name="Flying" />
</combo_box>
<spinner
@@ -433,27 +457,27 @@ Maximum animation length is [MAX_LENGTH] seconds.
increment="0.01"
initial_value="0"
label="Ease In (sec)"
- label_width="110"
+ label_width="140"
layout="topleft"
left="10"
max_val="10"
name="ease_in_time"
tool_tip="Amount of time (in seconds) over which animations blends in"
top_pad="10"
- width="200" />
+ width="210" />
<spinner
follows="left|top"
height="23"
increment="0.01"
initial_value="0"
label="Ease Out (sec)"
- label_width="110"
+ label_width="140"
layout="topleft"
top_pad="0"
max_val="10"
name="ease_out_time"
tool_tip="Amount of time (in seconds) over which animations blends out"
- width="200" />
+ width="210" />
<button
follows="top|right"
height="23"
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 54b6edb0ec..bac3ea86f1 100644
--- a/indra/newview/skins/default/xui/en/floater_avatar_textures.xml
+++ b/indra/newview/skins/default/xui/en/floater_avatar_textures.xml
@@ -1,306 +1,321 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- height="650"
+ height="700"
layout="topleft"
name="avatar_texture_debug"
help_topic="avatar_texture_debug"
title="AVATAR TEXTURES"
- width="1250">
+ width="940"
+ can_resize="true">
<floater.string
name="InvalidAvatar">
INVALID AVATAR
</floater.string>
+
+ <scroll_container
+ color="DkGray2"
+ opaque="true"
+ follows="all"
+ height="680"
+ layout="topleft"
+ left="5"
+ top_pad="15"
+ name="profile_scroll"
+ reserve_scroll_corner="false"
+ width="930">
+ <panel
+ name="scroll_content_panel"
+ follows="left|top"
+ min_height="300"
+ layout="topleft"
+ top="0"
+ background_visible="false"
+ left="0"
+ height="680">
<text
type="string"
length="1"
height="16"
layout="topleft"
- left="30"
+ left="15"
name="label"
- top="40"
- width="80">
- Baked Textures
+ top="20"
+ width="90">
+ Baked
+Textures
</text>
<text
type="string"
length="1"
height="16"
layout="topleft"
- left_pad="50"
+ left_pad="22"
name="composite_label"
top_delta="0"
width="120">
- Composite Textures
+ Composite
+Textures
</text>
<button
- height="20"
+ height="40"
label="Dump IDs to Console"
label_selected="Dump"
layout="topleft"
- left_pad="530"
name="Dump"
top_delta="0"
+ right="-10"
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"
+ top="43"
background_visible="false"
- height="950"
+ height="930"
left="0"
- width="1250">
+ width="1230">
+
<texture_picker
- height="143"
+ height="103"
label="Hair"
layout="topleft"
left="10"
name="hair-baked"
top="17"
- width="128" />
+ width="92" />
<texture_picker
- height="143"
+ height="103"
label="Hair"
layout="topleft"
- left_pad="7"
+ left_pad="21"
name="hair_grain"
top_delta="0"
- width="128" />
+ width="92" />
<texture_picker
- height="143"
+ height="103"
label="Hair Alpha"
layout="topleft"
left_pad="7"
name="hair_alpha"
top_delta="0"
- width="128" />
+ width="92" />
<texture_picker
- height="143"
+ height="103"
label="Head"
layout="topleft"
left="10"
name="head-baked"
- top="167"
- width="128" />
+ top_delta="100"
+ width="92" />
<texture_picker
- height="143"
+ height="103"
label="Makeup"
layout="topleft"
- left_pad="7"
+ left_pad="21"
name="head_bodypaint"
top_delta="0"
- width="128" />
+ width="92" />
<texture_picker
- height="143"
+ height="103"
label="Head Alpha"
layout="topleft"
left_pad="7"
name="head_alpha"
top_delta="0"
- width="128" />
+ width="92" />
<texture_picker
- height="143"
+ height="103"
label="Head Tattoo"
layout="topleft"
left_pad="7"
name="head_tattoo"
top_delta="0"
- width="128" />
+ width="92" />
<texture_picker
- height="143"
+ height="103"
label="Eyes"
layout="topleft"
left="10"
name="eyes-baked"
- top="317"
- width="128" />
+ top_delta="100"
+ width="92" />
<texture_picker
- height="143"
+ height="103"
label="Eye"
layout="topleft"
- left_pad="7"
+ left_pad="21"
name="eyes_iris"
top_delta="0"
- width="128" />
+ width="92" />
<texture_picker
- height="143"
+ height="103"
label="Eyes Alpha"
layout="topleft"
left_pad="7"
name="eyes_alpha"
top_delta="0"
- width="128" />
+ width="92" />
<texture_picker
- height="143"
+ height="103"
label="Upper Body"
layout="topleft"
left="10"
name="upper-baked"
- top="467"
- width="128" />
+ top_delta="100"
+ width="92" />
<texture_picker
- height="143"
- label="Upper Body Bodypaint"
+ height="103"
+ label="Upper BodyPaint"
layout="topleft"
- left_pad="7"
+ left_pad="21"
name="upper_bodypaint"
top_delta="0"
- width="128" />
+ width="92" />
<texture_picker
- height="143"
+ height="103"
label="Undershirt"
layout="topleft"
left_pad="7"
name="upper_undershirt"
top_delta="0"
- width="128" />
+ width="92" />
<texture_picker
- height="143"
+ height="103"
label="Gloves"
layout="topleft"
left_pad="7"
name="upper_gloves"
top_delta="0"
- width="128" />
+ width="92" />
<texture_picker
- height="143"
+ height="103"
label="Shirt"
layout="topleft"
left_pad="7"
name="upper_shirt"
top_delta="0"
- width="128" />
+ width="92" />
<texture_picker
- height="143"
+ height="103"
label="Upper Jacket"
layout="topleft"
left_pad="7"
name="upper_jacket"
top_delta="0"
- width="128" />
+ width="92" />
<texture_picker
- height="143"
+ height="103"
label="Upper Alpha"
layout="topleft"
left_pad="7"
name="upper_alpha"
top_delta="0"
- width="128" />
+ width="92" />
<texture_picker
- height="143"
+ height="103"
label="Upper Tattoo"
layout="topleft"
left_pad="7"
name="upper_tattoo"
top_delta="0"
- width="128" />
+ width="92" />
<texture_picker
- height="143"
+ height="103"
label="Lower Body"
layout="topleft"
left="10"
name="lower-baked"
- top="617"
- width="128" />
+ top_delta="100"
+ width="92" />
<texture_picker
- height="143"
- label="Lower Body Bodypaint"
+ height="103"
+ label="Lower BodyPaint"
layout="topleft"
- left_pad="7"
+ left_pad="21"
name="lower_bodypaint"
top_delta="0"
- width="128" />
+ width="92" />
<texture_picker
- height="143"
+ height="103"
label="Underpants"
layout="topleft"
left_pad="7"
name="lower_underpants"
top_delta="0"
- width="128" />
+ width="92" />
<texture_picker
- height="143"
+ height="103"
label="Socks"
layout="topleft"
left_pad="7"
name="lower_socks"
top_delta="0"
- width="128" />
+ width="92" />
<texture_picker
- height="143"
+ height="103"
label="Shoes"
layout="topleft"
left_pad="7"
name="lower_shoes"
top_delta="0"
- width="128" />
+ width="92" />
<texture_picker
- height="143"
+ height="103"
label="Pants"
layout="topleft"
left_pad="7"
name="lower_pants"
top_delta="0"
- width="128" />
+ width="92" />
<texture_picker
- height="143"
+ height="103"
label="Jacket"
layout="topleft"
left_pad="7"
name="lower_jacket"
top_delta="0"
- width="128" />
+ width="92" />
<texture_picker
- height="143"
+ height="103"
label="Lower Alpha"
layout="topleft"
left_pad="7"
name="lower_alpha"
top_delta="0"
- width="128" />
+ width="92" />
<texture_picker
- height="143"
+ height="103"
label="Lower Tattoo"
layout="topleft"
left_pad="7"
name="lower_tattoo"
top_delta="0"
- width="128" />
+ width="92" />
<texture_picker
- height="143"
+ height="103"
label="Skirt"
layout="topleft"
left="10"
name="skirt-baked"
- top="767"
- width="128" />
+ top_delta="100"
+ width="92" />
<texture_picker
- height="143"
+ height="103"
label="Skirt"
layout="topleft"
- left_pad="7"
+ left_pad="21"
name="skirt"
top_delta="0"
- width="128" />
+ width="92" />
+</panel>
</panel>
</scroll_container>
-</floater>
+</floater> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/floater_buy_currency.xml b/indra/newview/skins/default/xui/en/floater_buy_currency.xml
index 961bd6b5e4..637f9f55d4 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_currency.xml
@@ -24,13 +24,13 @@
<text
type="string"
length="1"
- follows="top|left"
+ follows="top|left|right"
font="SansSerifHuge"
layout="topleft"
left="20"
height="30"
top="25"
- width="300"
+ width="340"
name="info_need_more">
You need more L$
</text>
@@ -55,7 +55,7 @@
left="20"
height="30"
top="25"
- width="200"
+ width="300"
name="info_buying">
Buy L$
</text>
@@ -178,11 +178,11 @@
follows="top|left"
height="16"
halign="right"
- left="140"
- width="180"
+ left="20"
+ width="300"
layout="topleft"
name="buy_action">
- [NAME] L$ [PRICE]
+ [ACTION]
</text>
<text
type="string"
diff --git a/indra/newview/skins/default/xui/en/floater_buy_currency_html.xml b/indra/newview/skins/default/xui/en/floater_buy_currency_html.xml
new file mode 100644
index 0000000000..4b990fa566
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_buy_currency_html.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ can_resize="false"
+ can_close="true"
+ width="422"
+ height="202"
+ layout="topleft"
+ name="floater_buy_currency_html"
+ help_topic="floater_buy_currency_html"
+ save_rect="true"
+ single_instance="true"
+ title="BUY CURRENCY"
+>
+ <floater.string
+ name="buy_currency_url" translate="false">
+ https://quick-buy.secondlife.com/[LANGUAGE]/display/?sa=[SPECIFIC_AMOUNT]&amp;sum=[SUM]&amp;msg=[MSG]&amp;bal=[BAL]
+ </floater.string>
+ <web_browser
+ follows="all"
+ layout="topleft"
+ left="1"
+ right="-1"
+ top="1"
+ bottom="-1"
+ ignore_ui_scale="false"
+ name="browser"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_buy_land.xml b/indra/newview/skins/default/xui/en/floater_buy_land.xml
index 6e0c3dfe54..acaa508792 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_land.xml
@@ -64,7 +64,7 @@ Try selecting a smaller area.
</floater.string>
<floater.string
name="not_owned_by_you">
- Land owned by another user is selected.
+ Land owned by another Resident is selected.
Try selecting a smaller area.
</floater.string>
<floater.string
@@ -172,6 +172,18 @@ supports [AMOUNT2] objects
name="no_parcel_selected">
(no parcel selected)
</floater.string>
+ <floater.string
+ name="icon_PG"
+ translate="false"
+ value="Parcel_PG_Dark"/>
+ <floater.string
+ name="icon_M"
+ translate="false"
+ value="Parcel_M_Dark"/>
+ <floater.string
+ name="icon_R"
+ translate="false"
+ value="Parcel_R_Dark"/>
<text
type="string"
length="1"
@@ -195,9 +207,17 @@ supports [AMOUNT2] objects
left_delta="110"
name="region_name_text"
top_delta="0"
- width="175">
+ use_ellipses="true"
+ width="155">
(unknown)
</text>
+ <icon
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ name="rating_icon"
+ top_delta="-2"
+ width="18"/>
<text
type="string"
length="1"
@@ -339,7 +359,6 @@ supports [AMOUNT2] objects
length="1"
enabled="false"
follows="top|right"
- handle_edit_keys_directly="false"
height="237"
layout="topleft"
left="444"
diff --git a/indra/newview/skins/default/xui/en/floater_buy_object.xml b/indra/newview/skins/default/xui/en/floater_buy_object.xml
index f0e5e30010..3d8f5d678b 100644
--- a/indra/newview/skins/default/xui/en/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/en/floater_buy_object.xml
@@ -5,7 +5,7 @@
height="290"
layout="topleft"
min_height="150"
- min_width="200"
+ min_width="225"
name="contents"
help_topic="contents"
save_rect="true"
@@ -52,7 +52,7 @@
<text
type="string"
length="1"
- follows="all"
+ follows="left|top|right"
font="SansSerif"
height="16"
layout="topleft"
@@ -90,7 +90,8 @@
name="buy_text"
text_color="white"
top_pad="5"
- width="276">
+ use_ellipses="true"
+ width="260">
Buy for L$[AMOUNT] from [NAME]?
</text>
<button
diff --git a/indra/newview/skins/default/xui/en/floater_camera.xml b/indra/newview/skins/default/xui/en/floater_camera.xml
index a797d54749..8c3aa2c9a4 100644
--- a/indra/newview/skins/default/xui/en/floater_camera.xml
+++ b/indra/newview/skins/default/xui/en/floater_camera.xml
@@ -4,16 +4,16 @@
can_dock="true"
can_minimize="true"
can_close="false"
- center_horiz="true"
follows="bottom"
- height="152"
+ height="164"
layout="topleft"
name="camera_floater"
help_topic="camera_floater"
save_rect="true"
save_visibility="true"
+ save_dock_state="true"
single_instance="true"
- width="150">
+ width="228">
<floater.string
name="rotate_tooltip">
Rotate Camera Around Focus
@@ -26,41 +26,152 @@
name="move_tooltip">
Move Camera Up and Down, Left and Right
</floater.string>
+ <floater.string
+ name="camera_modes_title">
+ Camera modes
+ </floater.string>
+ <floater.string
+ name="pan_mode_title">
+ Orbit Zoom Pan
+ </floater.string>
+ <floater.string
+ name="presets_mode_title">
+ Preset Views
+ </floater.string>
+ <floater.string
+ name="free_mode_title">
+ View Object
+ </floater.string>
<panel
border="false"
- height="110"
+ height="123"
layout="topleft"
left="2"
top="0"
mouse_opaque="false"
name="controls"
- width="148">
- <joystick_track
- follows="top|left"
- height="78"
- image_selected="Cam_Tracking_In"
- image_unselected="Cam_Tracking_Out"
+ width="226">
+ <panel
+ color="Transparent"
+ follows="all"
+ height="102"
layout="topleft"
- left="45"
- name="cam_track_stick"
- quadrant="left"
- scale_image="false"
- sound_flags="3"
- tool_tip="Move camera up and down, left and right"
- top="22"
- visible="false"
- width="78" />
+ left="8"
+ name="preset_views_list"
+ opaque="true"
+ top="24"
+ width="212"
+ visible="false">
+ <panel_camera_item
+ name="front_view">
+ <panel_camera_item.mousedown_callback
+ function="CameraPresets.ChangeView"
+ parameter="front_view" />
+ <panel_camera_item.picture
+ image_name="Cam_Preset_Front_Off" />
+ <panel_camera_item.selected_picture
+ image_name="Cam_Preset_Front_On" />
+ <panel_camera_item.text>
+ Front View
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item
+ name="group_view"
+ top_pad="4">
+ <panel_camera_item.mousedown_callback
+ function="CameraPresets.ChangeView"
+ parameter="group_view" />
+ <panel_camera_item.picture
+ image_name="Cam_Preset_Side_Off" />
+ <panel_camera_item.selected_picture
+ image_name="Cam_Preset_Side_On" />
+ <panel_camera_item.text>
+ Side View
+ </panel_camera_item.text>
+ </panel_camera_item>
+ <panel_camera_item
+ name="rear_view"
+ layout="topleft"
+ top_pad="4">
+ <panel_camera_item.mousedown_callback
+ function="CameraPresets.ChangeView"
+ parameter="rear_view" />
+ <panel_camera_item.picture
+ image_name="Cam_Preset_Back_Off" />
+ <panel_camera_item.selected_picture
+ image_name="Cam_Preset_Back_On" />
+ <panel_camera_item.text>
+ Rear View
+ </panel_camera_item.text>
+ </panel_camera_item>
+ </panel>
+ <panel
+ color="Transparent"
+ follows="all"
+ height="68"
+ item_pad="4"
+ layout="topleft"
+ left="8"
+ name="camera_modes_list"
+ opaque="true"
+ top="24"
+ width="212"
+ visible="false">
+ <panel_camera_item
+ name="object_view">
+ <panel_camera_item.mousedown_callback
+ function="CameraPresets.ChangeView"
+ parameter="object_view" />
+ <panel_camera_item.text>
+ Object View
+ </panel_camera_item.text>
+ <panel_camera_item.picture
+ image_name="Object_View_Off" />
+ <panel_camera_item.selected_picture
+ image_name="Object_View_On" />
+ </panel_camera_item>
+ <panel_camera_item
+ name="mouselook_view"
+ layout="topleft">
+ <panel_camera_item.mousedown_callback
+ function="CameraPresets.ChangeView"
+ parameter="mouselook_view" />
+ <panel_camera_item.text>
+ Mouselook View
+ </panel_camera_item.text>
+ <panel_camera_item.picture
+ image_name="MouseLook_View_Off" />
+ <panel_camera_item.selected_picture
+ image_name="MouseLook_View_On" />
+ </panel_camera_item>
+ </panel>
<!--TODO: replace + - images -->
<panel
border="false"
class="camera_zoom_panel"
- height="94"
+ height="114"
layout="topleft"
- left="7"
+ left="0"
mouse_opaque="false"
name="zoom"
- top="22"
- width="18">
+ top="20"
+ width="226">
+ <joystick_rotate
+ follows="top|left"
+ height="78"
+ image_selected="Cam_Rotate_In"
+ image_unselected="Cam_Rotate_Out"
+ layout="topleft"
+ left="7"
+ mouse_opaque="false"
+ name="cam_rotate_stick"
+ quadrant="left"
+ scale_image="false"
+ sound_flags="3"
+ visible="true"
+ tool_tip="Orbit camera around focus"
+ top="20"
+ width="78" />
<button
follows="top|left"
height="18"
@@ -68,20 +179,24 @@
image_selected="AddItem_Press"
image_unselected="AddItem_Off"
layout="topleft"
+ left_pad="14"
name="zoom_plus_btn"
- width="18">
+ width="18"
+ top="18">
<commit_callback
function="Zoom.plus" />
<mouse_held_callback
function="Zoom.plus" />
</button>
<slider_bar
- height="48"
+ height="50"
layout="topleft"
name="zoom_slider"
orientation="vertical"
tool_tip="Zoom camera toward focus"
top_pad="0"
+ min_val="0"
+ max_val="1"
width="18">
<commit_callback function="Slider.value_changed"/>
</slider_bar>
@@ -100,86 +215,20 @@
<mouse_held_callback
function="Zoom.minus" />
</button>
- </panel>
- <joystick_rotate
+ <joystick_track
follows="top|left"
height="78"
- image_selected="Cam_Rotate_In"
- image_unselected="Cam_Rotate_Out"
+ image_selected="Cam_Tracking_In"
+ image_unselected="Cam_Tracking_Out"
layout="topleft"
- left="45"
- mouse_opaque="false"
- name="cam_rotate_stick"
+ left="133"
+ name="cam_track_stick"
quadrant="left"
scale_image="false"
sound_flags="3"
- visible="true"
- tool_tip="Orbit camera around focus"
- top="22"
- width="78" />
- <panel
- height="78"
- layout="topleft"
- left="36"
- name="camera_presets"
+ tool_tip="Move camera up and down, left and right"
top="20"
- visible="false"
- width="78">
- <button
- height="40"
- image_selected="Cam_Preset_Back_On"
- image_unselected="Cam_Preset_Back_Off"
- layout="topleft"
- left="0"
- name="rear_view"
- tool_tip="Rear View"
- top="2"
- width="40">
- <click_callback
- function="CameraPresets.ChangeView"
- parameter="rear_view" />
- </button>
- <button
- height="40"
- image_selected="Cam_Preset_Side_On"
- image_unselected="Cam_Preset_Side_Off"
- layout="topleft"
- left_pad="5"
- name="group_view"
- tool_tip="Group View"
- top="2"
- width="40">
- <click_callback
- function="CameraPresets.ChangeView"
- parameter="group_view" />
- </button>
- <button
- height="40"
- image_selected="Cam_Preset_Front_On"
- image_unselected="Cam_Preset_Front_Off"
- layout="topleft"
- left="0"
- name="front_view"
- tool_tip="Front View"
- top_pad="5"
- width="40">
- <click_callback
- function="CameraPresets.ChangeView"
- parameter="front_view" />
- </button>
- <button
- height="40"
- image_selected="Cam_Preset_Eye_Off"
- image_unselected="Cam_Preset_Eye_Off"
- layout="topleft"
- left_pad="5"
- name="mouselook_view"
- tool_tip="Mouselook View"
- width="40">
- <click_callback
- function="CameraPresets.ChangeView"
- parameter="mouselook_view" />
- </button>
+ width="78"/>
</panel>
</panel>
<panel
@@ -189,56 +238,44 @@
left="2"
top_pad="0"
name="buttons"
- width="148">
+ width="226">
<button
height="23"
label=""
layout="topleft"
- left="23"
+ left="70"
is_toggle="true"
- image_overlay="Cam_Orbit_Off"
+ image_overlay="Cam_Avatar_Off"
image_selected="PushButton_Selected_Press"
- name="orbit_btn"
+ name="presets_btn"
tab_stop="false"
- tool_tip="Orbit camera"
+ tool_tip="Preset Views"
+ top="13"
width="25">
</button>
<button
height="23"
label=""
layout="topleft"
- left_pad="0"
+ left_pad="1"
is_toggle="true"
- image_overlay="Cam_Pan_Off"
+ image_overlay="PanOrbit_Off"
image_selected="PushButton_Selected_Press"
name="pan_btn"
tab_stop="false"
- tool_tip="Pan camera"
- width="25">
- </button>
- <button
- height="23"
- label=""
- layout="topleft"
- left_pad="0"
- image_overlay="Cam_Avatar_Off"
- image_selected="PushButton_Selected_Press"
- name="avatarview_btn"
- tab_stop="false"
- tool_tip="See as avatar"
+ tool_tip="Orbit Zoom Pan"
width="25">
</button>
<button
height="23"
label=""
layout="topleft"
- left_pad="0"
- is_toggle="true"
+ left_pad="1"
image_overlay="Cam_FreeCam_Off"
image_selected="PushButton_Selected_Press"
- name="freecamera_btn"
+ name="avatarview_btn"
tab_stop="false"
- tool_tip="View object"
+ tool_tip="Camera modes"
width="25">
</button>
</panel>
diff --git a/indra/newview/skins/default/xui/en/floater_color_picker.xml b/indra/newview/skins/default/xui/en/floater_color_picker.xml
index 2fa112af8c..421f3a72c6 100644
--- a/indra/newview/skins/default/xui/en/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/en/floater_color_picker.xml
@@ -213,7 +213,8 @@
left="10"
name="(Drag below to save.)"
top_pad="66"
- width="130">
+ width="130"
+ wrap="true">
(Drag below to save)
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_critical.xml b/indra/newview/skins/default/xui/en/floater_critical.xml
index 7b5451553f..05c958e051 100644
--- a/indra/newview/skins/default/xui/en/floater_critical.xml
+++ b/indra/newview/skins/default/xui/en/floater_critical.xml
@@ -6,6 +6,7 @@
height="500"
layout="topleft"
name="modal container"
+ open_centered="true"
width="600">
<button
height="20"
@@ -16,15 +17,6 @@
name="Continue"
top="465"
width="100" />
- <button
- height="20"
- label="Cancel"
- label_selected="Cancel"
- layout="topleft"
- left_delta="-468"
- name="Cancel"
- top_delta="0"
- width="100" />
<text
type="string"
length="1"
@@ -32,9 +24,9 @@
font="SansSerif"
height="20"
layout="topleft"
- left_delta="4"
+ left="20"
name="tos_heading"
- top_delta="-450"
+ top="20"
width="552">
Please read the following message carefully.
</text>
diff --git a/indra/newview/skins/default/xui/en/floater_customize.xml b/indra/newview/skins/default/xui/en/floater_customize.xml
index b048eeceb6..01bced81d0 100644
--- a/indra/newview/skins/default/xui/en/floater_customize.xml
+++ b/indra/newview/skins/default/xui/en/floater_customize.xml
@@ -11,7 +11,7 @@
save_rect="true"
title="APPEARANCE"
top_delta="-185"
- width="524">
+ width="600">
<tab_container
height="517"
layout="topleft"
@@ -21,7 +21,7 @@
tab_position="left"
tab_height="50"
top="26"
- width="506">
+ width="580">
<text
type="string"
length="1"
@@ -65,15 +65,15 @@
mouse_opaque="true"
width="16" />
<button
- follows="right|bottom"
+ follows="left|top"
height="23"
- label="Revert"
- label_selected="Revert"
+ label="Create New Shape"
+ label_selected="Create New Shape"
layout="topleft"
- right="390"
- name="Revert"
- top="477"
- width="82" />
+ left="10"
+ name="Create New"
+ top="104"
+ width="160" />
<button
follows="left|top"
height="23"
@@ -280,46 +280,46 @@
type="string"
length="1"
top="488"
- follows="left|top|right"
+ follows="left|top"
font="SansSerif"
halign="right"
height="23"
layout="topleft"
+ left="10"
name="Item Action Label"
- right="132"
- width="100">
+ width="130">
Shape:
</text>
<button
- follows="left|top"
- height="23"
- label="Create New Shape"
- label_selected="Create New Shape"
- layout="topleft"
- left="10"
- name="Create New"
- top="104"
- width="160" />
- <button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
name="Save"
- right="218"
+ left_pad="2"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
name="Save As"
top="477"
- right="304"
- width="82" />
+ left_pad="3"
+ width="115" />
+ <button
+ follows="left|bottom"
+ height="23"
+ label="Revert"
+ label_selected="Revert"
+ layout="topleft"
+ left_pad="3"
+ name="Revert"
+ top="477"
+ width="120" />
</panel>
<panel
border="false"
@@ -352,6 +352,16 @@
<button
follows="left|top"
height="23"
+ label="Create New Skin"
+ label_selected="Create New Skin"
+ layout="topleft"
+ left_delta="0"
+ name="Create New"
+ top_delta="-249"
+ width="160" />
+ <button
+ follows="left|top"
+ height="23"
label="Skin Color"
label_selected="Skin Color"
layout="topleft"
@@ -479,20 +489,6 @@
width="373">
You do not have permission to modify this wearable.
</text>
- <text
- type="string"
- length="1"
- top="488"
- follows="left|top|right"
- font="SansSerif"
- halign="right"
- height="23"
- layout="topleft"
- name="Item Action Label"
- right="132"
- width="100">
- Skin:
- </text>
<texture_picker
allow_no_texture="true"
can_apply_immediately="true"
@@ -532,46 +528,50 @@
tool_tip="Click to choose a picture"
top_delta="102"
width="82" />
- <button
+ <text
+ type="string"
+ length="1"
+ top="488"
follows="left|top"
+ font="SansSerif"
+ halign="right"
height="23"
- label="Create New Skin"
- label_selected="Create New Skin"
layout="topleft"
- left_delta="0"
- name="Create New"
- top_delta="-249"
- width="160" />
+ left="10"
+ name="Item Action Label"
+ width="130">
+ Skin:
+ </text>
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
- right="218"
+ left_pad="2"
name="Save"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- right="304"
+ left_pad="3"
name="Save As"
top="477"
- width="82" />
+ width="115" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- right="390"
+ left_pad="3"
name="Revert"
top="477"
- width="82" />
+ width="120" />
</panel>
<panel
border="false"
@@ -729,20 +729,6 @@
width="373">
You do not have permission to modify this wearable.
</text>
- <text
- type="string"
- length="1"
- top="488"
- follows="left|top|right"
- font="SansSerif"
- halign="right"
- height="23"
- layout="topleft"
- name="Item Action Label"
- right="132"
- width="100">
- Hair:
- </text>
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -765,36 +751,50 @@
name="Create New"
top_delta="-89"
width="160" />
+ <text
+ type="string"
+ length="1"
+ top="488"
+ follows="left|top"
+ font="SansSerif"
+ halign="right"
+ height="23"
+ layout="topleft"
+ name="Item Action Label"
+ left="10"
+ width="130">
+ Hair:
+ </text>
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
- right="218"
+ left_pad="2"
name="Save"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- right="304"
+ left_pad="3"
name="Save As"
top="477"
- width="82" />
+ width="115" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- right="390"
+ left_pad="3"
name="Revert"
top="477"
- width="82" />
+ width="120" />
</panel>
<panel
border="false"
@@ -914,20 +914,6 @@
width="373">
You do not have permission to modify this wearable.
</text>
- <text
- type="string"
- length="1"
- bottom="4"
- follows="left|bottom|right"
- font="SansSerif"
- halign="right"
- height="23"
- layout="bottomleft"
- name="Item Action Label"
- right="132"
- width="100">
- Eyes:
- </text>
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -949,36 +935,50 @@
name="Create New"
top="66"
width="160" />
+ <text
+ type="string"
+ length="1"
+ bottom="4"
+ follows="left|bottom"
+ font="SansSerif"
+ halign="right"
+ height="23"
+ layout="bottomleft"
+ name="Item Action Label"
+ left="10"
+ width="130">
+ Eyes:
+ </text>
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
- right="218"
+ left_pad="2"
name="Save"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- right="304"
+ left_pad="3"
name="Save As"
top="477"
- width="82" />
+ width="115" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- right="390"
+ left_pad="3"
name="Revert"
top="477"
- width="82" />
+ width="120" />
</panel>
<text
type="string"
@@ -1063,36 +1063,50 @@
name="Create New"
top="66"
width="160" />
+ <text
+ type="string"
+ length="1"
+ bottom="4"
+ follows="left|bottom"
+ font="SansSerif"
+ halign="right"
+ height="23"
+ layout="bottomleft"
+ name="Item Action Label"
+ left="10"
+ width="130">
+ Shirt:
+ </text>
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
- right="218"
+ left_pad="2"
name="Save"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- right="304"
+ left_pad="3"
name="Save As"
top="477"
- width="82" />
+ width="115" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- right="390"
+ left_pad="3"
name="Revert"
top="477"
- width="82" />
+ width="120" />
<text
type="string"
length="1"
@@ -1183,20 +1197,6 @@
width="373">
You do not have permission to modify this wearable.
</text>
- <text
- type="string"
- length="1"
- bottom="4"
- follows="left|bottom|right"
- font="SansSerif"
- halign="right"
- height="23"
- layout="bottomleft"
- name="Item Action Label"
- right="132"
- width="100">
- Shirt:
- </text>
</panel>
<panel
border="false"
@@ -1266,36 +1266,50 @@
name="Create New"
top="66"
width="160" />
+ <text
+ type="string"
+ length="1"
+ bottom="4"
+ follows="left|bottom"
+ font="SansSerif"
+ halign="right"
+ height="23"
+ layout="bottomleft"
+ name="Item Action Label"
+ left="10"
+ width="130">
+ Pants:
+ </text>
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
- right="218"
+ left_pad="2"
name="Save"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- right="304"
+ left_pad="3"
name="Save As"
top="477"
- width="82" />
+ width="115" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- right="390"
+ left_pad="3"
name="Revert"
top="477"
- width="82" />
+ width="120" />
<text
type="string"
length="1"
@@ -1386,20 +1400,6 @@
width="373">
You do not have permission to modify this wearable.
</text>
- <text
- type="string"
- length="1"
- bottom="4"
- follows="left|bottom|right"
- font="SansSerif"
- halign="right"
- height="23"
- layout="bottomleft"
- name="Item Action Label"
- right="132"
- width="100">
- Pants:
- </text>
</panel>
<panel
border="false"
@@ -1528,20 +1528,6 @@
width="373">
You do not have permission to modify this wearable.
</text>
- <text
- type="string"
- length="1"
- bottom="4"
- follows="left|bottom|right"
- font="SansSerif"
- halign="right"
- height="23"
- layout="bottomleft"
- name="Item Action Label"
- right="132"
- width="100">
- Shoes:
- </text>
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -1573,36 +1559,50 @@
name="Take Off"
top_pad="4"
width="82" />
+ <text
+ type="string"
+ length="1"
+ bottom="4"
+ follows="left|bottom"
+ font="SansSerif"
+ halign="right"
+ height="23"
+ layout="bottomleft"
+ left="10"
+ name="Item Action Label"
+ width="130">
+ Shoes:
+ </text>
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
- right="218"
+ left_pad="2"
name="Save"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- right="304"
+ left_pad="3"
name="Save As"
top="477"
- width="82" />
+ width="115" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- right="390"
+ left_pad="3"
name="Revert"
top="477"
- width="82" />
+ width="120" />
</panel>
<panel
border="false"
@@ -1731,20 +1731,6 @@
width="373">
You do not have permission to modify this wearable.
</text>
- <text
- type="string"
- length="1"
- bottom="4"
- follows="left|bottom|right"
- font="SansSerif"
- halign="right"
- height="23"
- layout="bottomleft"
- name="Item Action Label"
- right="132"
- width="100">
- Socks:
- </text>
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -1776,36 +1762,50 @@
name="Take Off"
top_pad="4"
width="82" />
+ <text
+ type="string"
+ length="1"
+ bottom="4"
+ follows="left|bottom"
+ font="SansSerif"
+ halign="right"
+ height="23"
+ layout="bottomleft"
+ left="10"
+ name="Item Action Label"
+ width="130">
+ Socks:
+ </text>
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
- right="218"
+ left_pad="2"
name="Save"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- right="304"
+ left_pad="3"
name="Save As"
top="477"
- width="82" />
+ width="115" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- right="390"
+ left_pad="3"
name="Revert"
top="477"
- width="82" />
+ width="120" />
</panel>
<panel
border="false"
@@ -1934,20 +1934,6 @@
width="373">
You do not have permission to modify this wearable.
</text>
- <text
- type="string"
- length="1"
- bottom="4"
- follows="left|bottom|right"
- font="SansSerif"
- halign="right"
- height="23"
- layout="bottomleft"
- name="Item Action Label"
- right="132"
- width="100">
- Jacket:
- </text>
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -1990,36 +1976,50 @@
name="Take Off"
top_pad="4"
width="82" />
+ <text
+ type="string"
+ length="1"
+ bottom="4"
+ follows="left|bottom"
+ font="SansSerif"
+ halign="right"
+ height="23"
+ layout="bottomleft"
+ left="10"
+ name="Item Action Label"
+ width="130">
+ Jacket:
+ </text>
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
- right="218"
+ left_pad="2"
name="Save"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- right="304"
+ left_pad="3"
name="Save As"
top="477"
- width="82" />
+ width="115" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- right="390"
+ left_pad="3"
name="Revert"
top="477"
- width="82" />
+ width="120" />
</panel>
<panel
border="false"
@@ -2148,20 +2148,6 @@
width="373">
You do not have permission to modify this wearable.
</text>
- <text
- type="string"
- length="1"
- bottom="4"
- follows="left|bottom|right"
- font="SansSerif"
- halign="right"
- height="23"
- layout="bottomleft"
- name="Item Action Label"
- right="132"
- width="100">
- Gloves:
- </text>
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -2193,36 +2179,50 @@
name="Take Off"
top_pad="4"
width="82" />
+ <text
+ type="string"
+ length="1"
+ bottom="4"
+ follows="left|bottom"
+ font="SansSerif"
+ halign="right"
+ height="23"
+ layout="bottomleft"
+ left="10"
+ name="Item Action Label"
+ width="130">
+ Gloves:
+ </text>
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
- right="218"
+ left_pad="2"
name="Save"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- right="304"
+ left_pad="3"
name="Save As"
top="477"
- width="82" />
+ width="115" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- right="390"
+ left_pad="3"
name="Revert"
top="477"
- width="82" />
+ width="120" />
</panel>
<panel
border="false"
@@ -2351,20 +2351,6 @@
width="373">
You do not have permission to modify this wearable.
</text>
- <text
- type="string"
- length="1"
- bottom="4"
- follows="left|bottom|right"
- font="SansSerif"
- halign="right"
- height="23"
- layout="bottomleft"
- name="Item Action Label"
- right="132"
- width="100">
- Undershirt:
- </text>
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -2396,36 +2382,50 @@
name="Take Off"
top_pad="4"
width="82" />
+ <text
+ type="string"
+ length="1"
+ bottom="4"
+ follows="left|bottom"
+ font="SansSerif"
+ halign="right"
+ height="23"
+ layout="bottomleft"
+ left="10"
+ name="Item Action Label"
+ width="130">
+ Undershirt:
+ </text>
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
- right="218"
+ left_pad="2"
name="Save"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- right="304"
+ left_pad="3"
name="Save As"
top="477"
- width="82" />
+ width="115" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- right="390"
+ left_pad="3"
name="Revert"
top="477"
- width="82" />
+ width="120" />
</panel>
<panel
border="false"
@@ -2554,20 +2554,6 @@
width="373">
You do not have permission to modify this wearable.
</text>
- <text
- type="string"
- length="1"
- bottom="4"
- follows="left|bottom|right"
- font="SansSerif"
- halign="right"
- height="23"
- layout="bottomleft"
- name="Item Action Label"
- right="132"
- width="100">
- Underpants:
- </text>
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -2599,36 +2585,50 @@
name="Take Off"
top_pad="4"
width="82" />
+ <text
+ type="string"
+ length="1"
+ bottom="4"
+ follows="left|bottom"
+ font="SansSerif"
+ halign="right"
+ height="23"
+ layout="bottomleft"
+ left="10"
+ name="Item Action Label"
+ width="130">
+ Underpants:
+ </text>
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
- right="218"
+ left_pad="2"
name="Save"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- right="304"
+ left_pad="3"
name="Save As"
top="477"
- width="82" />
+ width="115" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- right="390"
+ left_pad="3"
name="Revert"
top="477"
- width="82" />
+ width="120" />
</panel>
<panel
border="false"
@@ -2757,20 +2757,6 @@
width="373">
You do not have permission to modify this wearable.
</text>
- <text
- type="string"
- length="1"
- bottom="4"
- follows="left|bottom|right"
- font="SansSerif"
- halign="right"
- height="23"
- layout="bottomleft"
- name="Item Action Label"
- right="132"
- width="100">
- Skirt:
- </text>
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -2802,36 +2788,50 @@
name="Take Off"
top_pad="4"
width="82" />
+ <text
+ type="string"
+ length="1"
+ bottom="4"
+ follows="left|bottom"
+ font="SansSerif"
+ halign="right"
+ height="23"
+ layout="bottomleft"
+ left="10"
+ name="Item Action Label"
+ width="130">
+ Skirt:
+ </text>
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
- right="218"
+ left_pad="2"
name="Save"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- right="304"
+ left_pad="3"
name="Save As"
top="477"
- width="82" />
+ width="115" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- right="390"
+ left_pad="3"
name="Revert"
top="477"
- width="82" />
+ width="120" />
</panel>
<panel
border="false"
@@ -2960,20 +2960,6 @@
width="373">
You do not have permission to modify this wearable.
</text>
- <text
- type="string"
- length="1"
- bottom="4"
- follows="left|bottom|right"
- font="SansSerif"
- halign="right"
- height="23"
- layout="bottomleft"
- name="Item Action Label"
- right="132"
- width="100">
- Tattoo:
- </text>
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -3018,36 +3004,50 @@
top_pad="4"
left="10"
width="82" />
+ <text
+ type="string"
+ length="1"
+ bottom="4"
+ follows="left|bottom"
+ font="SansSerif"
+ halign="right"
+ height="23"
+ layout="bottomleft"
+ left="10"
+ name="Item Action Label"
+ width="130">
+ Tattoo:
+ </text>
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
- right="218"
+ left_pad="2"
name="Save"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- right="304"
+ left_pad="3"
name="Save As"
top="477"
- width="82" />
+ width="115" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- right="390"
+ left_pad="3"
name="Revert"
top="477"
- width="82" />
+ width="120" />
</panel>
<panel
border="false"
@@ -3176,20 +3176,6 @@
width="373">
You do not have permission to modify this wearable.
</text>
- <text
- type="string"
- length="1"
- bottom="4"
- follows="left|bottom|right"
- font="SansSerif"
- halign="right"
- height="23"
- layout="bottomleft"
- name="Item Action Label"
- right="132"
- width="100">
- Alpha:
- </text>
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -3299,47 +3285,61 @@
left="10"
top_pad="20"
width="82" />
+ <text
+ type="string"
+ length="1"
+ bottom="4"
+ follows="left|bottom"
+ font="SansSerif"
+ halign="right"
+ height="23"
+ layout="bottomleft"
+ left="10"
+ name="Item Action Label"
+ width="130">
+ Alpha:
+ </text>
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
- right="218"
+ left_pad="2"
name="Save"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- right="304"
+ left_pad="3"
name="Save As"
top="477"
- width="82" />
+ width="115" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- right="390"
+ left_pad="3"
name="Revert"
top="477"
- width="82" />
+ width="120" />
</panel>
</tab_container>
<scroll_container
follows="left|top|right|bottom"
height="409"
layout="topleft"
- left="211"
+ left="247"
mouse_opaque="false"
name="panel_container"
top="92"
- width="292">
+ width="330">
<scrolling_panel_list
follows="left|bottom"
layout="topleft"
@@ -3355,7 +3355,7 @@
name="script_info"
tool_tip="Show scripts attached to your avatar"
left="13"
- width="90" />
+ width="90" ></button>
<button
bottom="574"
follows="right|bottom"
@@ -3365,7 +3365,7 @@
layout="topleft"
name="make_outfit_btn"
right="-218"
- width="100" />
+ width="120" />
<button
bottom="574"
follows="right|bottom"
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 8c5af2283d..42a9ff551e 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
@@ -7,7 +7,7 @@
help_topic="day_cycle_floater"
save_rect="true"
title="DAY CYCLE EDITOR"
- width="646">
+ width="658">
<tab_container
follows="left|top"
height="255"
@@ -16,7 +16,7 @@
name="Day Cycle Tabs"
tab_position="top"
top="20"
- width="644">
+ width="656">
<panel
border="true"
follows="left|top|right|bottom"
@@ -27,7 +27,7 @@
mouse_opaque="false"
name="Day Cycle"
top="0"
- width="642">
+ width="654">
<multi_slider
can_edit_text="true"
control_name="WLTimeSlider"
@@ -313,7 +313,7 @@
left="555"
name="WLAddKey"
top="30"
- width="80" />
+ width="96" />
<button
height="20"
label="Delete Key"
@@ -322,7 +322,7 @@
left_delta="0"
name="WLDeleteKey"
top_pad="5"
- width="80" />
+ width="96" />
<text
type="string"
length="1"
@@ -334,7 +334,7 @@
left="20"
name="WLCurKeyFrameText"
top="104"
- width="150">
+ width="235">
Key Frame Settings:
</text>
<text
@@ -348,7 +348,7 @@
left="30"
name="WLCurKeyTimeText"
top="124"
- width="100">
+ width="105">
Key Time:
</text>
<spinner
@@ -361,11 +361,11 @@
label="Hour"
label_width="30"
layout="topleft"
- left_delta="0"
+ left_delta="25"
max_val="100"
name="WLCurKeyHour"
top_pad="4"
- width="70" />
+ width="74" />
<spinner
control_name="WLCurKeyMin"
decimal_digits="0"
@@ -392,7 +392,7 @@
left="30"
name="WLCurKeyTimeText2"
top="169"
- width="120">
+ width="185">
Key Preset:
</text>
<combo_box
@@ -402,7 +402,7 @@
left_delta="0"
name="WLKeyPresets"
top_pad="7"
- width="155" />
+ width="205" />
<view_border
bevel_style="none"
follows="top|left"
@@ -410,7 +410,7 @@
layout="topleft"
left="12"
top="101"
- width="190" />
+ width="240" />
<text
type="string"
length="1"
@@ -419,7 +419,7 @@
font="SansSerif"
height="16"
layout="topleft"
- left="220"
+ left_pad="15"
name="DayCycleText"
top="114"
width="120">
@@ -444,7 +444,7 @@
layout="topleft"
left_delta="0"
name="DayCycleText2"
- top_pad="9"
+ top_pad="17"
width="120">
Length of Cycle:
</text>
@@ -462,7 +462,7 @@
max_val="100"
name="WLLengthOfDayHour"
top_pad="4"
- width="70" />
+ width="74" />
<spinner
control_name="WLLengthOfDayMin"
decimal_digits="0"
@@ -492,57 +492,58 @@
max_val="59"
name="WLLengthOfDaySec"
top_delta="0"
- width="60" />
+ width="60"/>
<text
type="string"
+ halign="right"
length="1"
border_visible="true"
follows="left|top|right"
font="SansSerif"
height="16"
layout="topleft"
- left="310"
+ left_delta="-23"
name="DayCycleText3"
top="114"
- width="120">
- Preview:
+ width="85">
+ Preview :
</text>
<button
height="20"
label="Play"
label_selected="Play"
layout="topleft"
- left_delta="60"
+ left="480"
name="WLAnimSky"
top_pad="5"
- width="50" />
+ width="83" />
<button
height="20"
label="Stop!"
label_selected="Stop"
layout="topleft"
- left_pad="5"
+ left_pad="4"
name="WLStopAnimSky"
top_delta="0"
- width="50" />
+ width="83" />
<button
height="20"
label="Use Estate Time"
label_selected="Go to Estate Time"
layout="topleft"
- left_pad="5"
+ left="480"
name="WLUseLindenTime"
- top_delta="0"
- width="150" />
+ top_pad="9"
+ width="170" />
<button
height="20"
label="Save Test Day"
label_selected="Save Test Day"
layout="topleft"
- left="480"
+ left_delta="0"
name="WLSaveDayCycle"
- top="175"
- width="150" />
+ top_pad="9"
+ width="170" />
<button
height="20"
label="Load Test Day"
@@ -550,8 +551,8 @@
layout="topleft"
left_delta="0"
name="WLLoadDayCycle"
- top_pad="5"
- width="150" />
+ top_pad="3"
+ width="170" />
</panel>
</tab_container>
</floater>
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 8c87bd42dd..14f9e2db95 100644
--- a/indra/newview/skins/default/xui/en/floater_env_settings.xml
+++ b/indra/newview/skins/default/xui/en/floater_env_settings.xml
@@ -135,28 +135,28 @@
width="210" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Use Estate Time"
layout="topleft"
- left="8"
+ left="10"
name="EnvUseEstateTimeButton"
top="120"
width="137" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Advanced Sky"
layout="topleft"
- left_pad="9"
+ left_pad="3"
name="EnvAdvancedSkyButton"
top_delta="0"
width="137" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Advanced Water"
layout="topleft"
- left_pad="9"
+ left_pad="3"
name="EnvAdvancedWaterButton"
top_delta="0"
width="137" />
diff --git a/indra/newview/skins/default/xui/en/floater_event.xml b/indra/newview/skins/default/xui/en/floater_event.xml
new file mode 100644
index 0000000000..d9c9d63c72
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_event.xml
@@ -0,0 +1,314 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ follows="all"
+ height="350"
+ help_topic="event_details"
+ label="Event"
+ layout="topleft"
+ name="Event"
+ title="EVENT DETAILS"
+ width="330">
+ <floater.string
+ name="none">
+ none
+ </floater.string>
+ <floater.string
+ name="notify">
+ Notify
+ </floater.string>
+ <floater.string
+ name="dont_notify">
+ Don&apos;t Notify
+ </floater.string>
+ <floater.string
+ name="moderate">
+ Moderate
+ </floater.string>
+ <floater.string
+ name="adult">
+ Adult
+ </floater.string>
+ <floater.string
+ name="general">
+ General
+ </floater.string>
+ <floater.string
+ name="unknown">
+ Unknown
+ </floater.string>
+ <layout_stack
+ name="layout"
+ orientation="vertical"
+ follows="all"
+ layout="topleft"
+ left="0"
+ top="0"
+ height="350"
+ width="330"
+ border_size="0">
+ <layout_panel
+ name="profile_stack"
+ follows="top|left"
+ layout="topleft"
+ top="0"
+ left="0"
+ height="305"
+ width="330">
+ <text
+ follows="top|left|right"
+ font="SansSerifLarge"
+ text_color="white"
+ height="17"
+ layout="topleft"
+ left="10"
+ name="event_name"
+ top="5"
+ use_ellipses="true"
+ width="310">
+ Nameless Event...of Doom! De doom! Doom doom.
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="top|left"
+ height="13"
+ text_color="LtGray_50"
+ layout="topleft"
+ left="25"
+ name="event_category"
+ width="300">
+ (no category)
+ </text>
+
+ <text
+ type="string"
+ length="1"
+ follows="top|left"
+ layout="topleft"
+ left="10"
+ top_pad="7"
+ name="event_runby_label"
+ width="90">
+ Run by:
+ </text>
+ <text
+ follows="left|top"
+ height="20"
+ initial_value="(retrieving)"
+ layout="topleft"
+ left_pad="0"
+ link="true"
+ name="event_runby"
+ top_delta="0"
+ use_ellipses="true"
+ width="240" />
+ <text
+ type="string"
+ length="1"
+ follows="top|left"
+ layout="topleft"
+ left="10"
+ top_pad="5"
+ name="event_date_label"
+ width="90">
+ Date:
+ </text>
+ <text
+ type="string"
+ length="1"
+ left_pad="0"
+ height="17"
+ top_delta="0"
+ follows="top|left"
+ layout="topleft"
+ name="event_date"
+ width="240">
+ 10/10/2010
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="top|left"
+ layout="topleft"
+ left="10"
+ top_pad="5"
+ name="event_duration_label"
+ width="90">
+ Duration:
+ </text>
+ <text
+ type="string"
+ height="14"
+ length="1"
+ left_pad="0"
+ follows="top|left"
+ layout="topleft"
+ name="event_duration"
+ top_delta="0"
+ width="240">
+ 1 hour
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="top|left"
+ layout="topleft"
+ left="10"
+ top_pad="5"
+ name="event_covercharge_label"
+ width="90">
+ Cover charge:
+ </text>
+ <text
+ type="string"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_pad="0"
+ name="event_cover"
+ visible="true"
+ width="240"
+ top_delta="0">
+ Free
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="top|left"
+ layout="topleft"
+ left="10"
+ top_pad="5"
+ name="event_location_label"
+ width="90">
+ Location:
+ </text>
+ <text
+ type="string"
+ length="1"
+ height="20"
+ left_pad="0"
+ follows="top|left"
+ layout="topleft"
+ name="event_location"
+ use_ellipses="true"
+ top_delta="0"
+ value="SampleParcel, Name Long (145, 228, 26)"
+ width="240" />
+ <icon
+ follows="top|left"
+ height="16"
+ image_name="Parcel_PG_Dark"
+ layout="topleft"
+ left="10"
+ name="rating_icon_pg"
+ width="18" />
+ <icon
+ follows="top|left"
+ height="16"
+ image_name="Parcel_M_Dark"
+ layout="topleft"
+ left="10"
+ name="rating_icon_m"
+ top_delta="0"
+ width="18" />
+ <icon
+ follows="top|left"
+ height="16"
+ image_name="Parcel_R_Dark"
+ layout="topleft"
+ left="10"
+ name="rating_icon_r"
+ top_delta="0"
+ width="18" />
+ <text
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_pad="12"
+ name="rating_label"
+ top_delta="3"
+ value="Rating:"
+ width="90" />
+ <text
+ follows="left|right|top"
+ height="16"
+ layout="topleft"
+ left_pad="2"
+ name="rating_value"
+ top_delta="0"
+ value="unknown"
+ width="240" />
+ <expandable_text
+ follows="left|top|right"
+ height="65"
+ layout="topleft"
+ left="6"
+ name="event_desc"
+ textbox.label="More"
+ width="322">
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</expandable_text>
+ </layout_panel>
+ <layout_panel
+ follows="left|right"
+ height="24"
+ layout="topleft"
+ mouse_opaque="false"
+ name="button_panel"
+ top="0"
+ left="0"
+ user_resize="false">
+ <button
+ follows="left|top"
+ height="18"
+ image_selected="AddItem_Press"
+ image_unselected="AddItem_Off"
+ image_disabled="AddItem_Disabled"
+ layout="topleft"
+ left="6"
+ name="create_event_btn"
+ picture_style="true"
+ tool_tip="Create Event"
+ width="18" />
+ <button
+ follows="left|top"
+ height="18"
+ image_selected="MinusItem_Press"
+ image_unselected="MinusItem_Off"
+ image_disabled="MinusItem_Disabled"
+ layout="topleft"
+ visible="false"
+ left="6"
+ top_pad="-7"
+ name="god_delete_event_btn"
+ picture_style="true"
+ tool_tip="Delete Event"
+ width="18" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Notify Me"
+ layout="topleft"
+ left_pad="3"
+ top_delta="-12"
+ name="notify_btn"
+ width="100" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Teleport"
+ layout="topleft"
+ left_pad="5"
+ name="teleport_btn"
+ width="100" />
+ <button
+ follows="left|top"
+ height="23"
+ label="Map"
+ layout="topleft"
+ left_pad="5"
+ name="map_btn"
+ width="85" />
+ </layout_panel>
+ </layout_stack>
+ </floater>
+
diff --git a/indra/newview/skins/default/xui/en/floater_god_tools.xml b/indra/newview/skins/default/xui/en/floater_god_tools.xml
index 0fac6cd5f1..dfe3cf4485 100644
--- a/indra/newview/skins/default/xui/en/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_god_tools.xml
@@ -31,19 +31,6 @@
<button
follows="left|top"
height="20"
- label="Kick all users"
- label_selected="Kick all users"
- layout="topleft"
- left="10"
- name="Kick all users"
- top="30"
- width="120">
- <button.commit_callback
- function="GridTools.KickAll" />
- </button>
- <button
- follows="left|top"
- height="20"
label="Flush This Region&apos;s Map Visibility Caches"
label_selected="Flush This Region&apos;s Map Visibility Caches"
layout="topleft"
@@ -74,10 +61,10 @@
height="10"
layout="topleft"
left="10"
- name="Sim Name:"
+ name="Region Name:"
top="12"
width="80">
- Sim Name:
+ Region Name:
</text>
<line_editor
border_style="line"
@@ -494,10 +481,10 @@
height="10"
layout="topleft"
left="10"
- name="Sim Name:"
+ name="Region Name:"
top="10"
width="80">
- Sim Name:
+ Region Name:
</text>
<text
type="string"
diff --git a/indra/newview/skins/default/xui/en/floater_hardware_settings.xml b/indra/newview/skins/default/xui/en/floater_hardware_settings.xml
index 1e2440580e..27f8b4bb39 100644
--- a/indra/newview/skins/default/xui/en/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/en/floater_hardware_settings.xml
@@ -6,7 +6,7 @@
name="Hardware Settings Floater"
help_topic="hardware_settings_floater"
title="HARDWARE SETTINGS"
- width="500">
+ width="615">
<text
type="string"
length="1"
@@ -16,7 +16,7 @@
left="10"
name="Filtering:"
top="20"
- width="128">
+ width="188">
Filtering:
</text>
<check_box
@@ -37,7 +37,7 @@
left="10"
name="Antialiasing:"
top_pad="7"
- width="128">
+ width="188">
Antialiasing:
</text>
<combo_box
@@ -79,13 +79,13 @@
increment="0.01"
initial_value="1"
label="Gamma:"
- label_width="138"
+ label_width="198"
layout="topleft"
left="10"
max_val="2"
name="gamma"
top_pad="7"
- width="202" />
+ width="262" />
<text
type="string"
length="1"
@@ -95,7 +95,7 @@
left_pad="10"
name="(brightness, lower is brighter)"
top_delta="2"
- width="315">
+ width="385">
(0 = default brightness, lower = brighter)
</text>
<text
@@ -107,7 +107,7 @@
left="10"
name="Enable VBO:"
top_pad="10"
- width="128">
+ width="188">
Enable VBO:
</text>
<check_box
@@ -128,14 +128,14 @@
increment="16"
initial_value="32"
label="Texture Memory (MB):"
- label_width="135"
+ label_width="195"
layout="topleft"
left="10"
max_val="4096"
name="GraphicsCardTextureMemory"
tool_tip="Amount of memory to allocate for textures. Defaults to video card memory. Reducing this may improve performance but may also make textures blurry."
top_pad="10"
- width="300" />
+ width="360" />
<spinner
control_name="RenderFogRatio"
decimal_digits="1"
@@ -143,14 +143,14 @@
height="22"
initial_value="4"
label="Fog Distance Ratio:"
- label_width="138"
+ label_width="198"
layout="topleft"
left_delta="0"
max_val="10"
min_val="0.5"
name="fog"
top_pad="7"
- width="202" />
+ width="262" />
<button
follows="right|bottom"
height="22"
diff --git a/indra/newview/skins/default/xui/en/floater_help_browser.xml b/indra/newview/skins/default/xui/en/floater_help_browser.xml
index be32e917e5..214fb6ce54 100644
--- a/indra/newview/skins/default/xui/en/floater_help_browser.xml
+++ b/indra/newview/skins/default/xui/en/floater_help_browser.xml
@@ -2,7 +2,7 @@
<floater
legacy_header_height="18"
can_resize="true"
- height="480"
+ height="600"
layout="topleft"
min_height="150"
min_width="500"
@@ -11,7 +11,7 @@
save_rect="true"
single_instance="true"
title="HELP BROWSER"
- width="620">
+ width="650">
<floater.string
name="loading_text">
Loading...
@@ -20,20 +20,20 @@
name="done_text">
</floater.string>
<layout_stack
- bottom="480"
+ bottom="600"
follows="left|right|top|bottom"
layout="topleft"
left="5"
name="stack1"
top="20"
- width="610">
+ width="640">
<layout_panel
layout="topleft"
left_delta="0"
top_delta="0"
name="external_controls"
user_resize="false"
- width="590">
+ width="620">
<web_browser
bottom="-11"
follows="left|right|top|bottom"
@@ -41,8 +41,8 @@
left="0"
name="browser"
top="0"
- height="500"
- width="590" />
+ height="610"
+ width="620" />
<text
follows="bottom|left"
height="16"
diff --git a/indra/newview/skins/default/xui/en/floater_im.xml b/indra/newview/skins/default/xui/en/floater_im.xml
index a21242ffe1..55efe83820 100644
--- a/indra/newview/skins/default/xui/en/floater_im.xml
+++ b/indra/newview/skins/default/xui/en/floater_im.xml
@@ -14,7 +14,7 @@
width="419">
<multi_floater.string
name="only_user_message">
- You are the only user in this session.
+ You are the only Resident in this session.
</multi_floater.string>
<multi_floater.string
name="offline_message">
@@ -54,7 +54,7 @@
</multi_floater.string>
<multi_floater.string
name="add_session_event">
- Unable to add users to chat session with [RECIPIENT].
+ Unable to add Residents to chat session with [RECIPIENT].
</multi_floater.string>
<multi_floater.string
name="message_session_event">
diff --git a/indra/newview/skins/default/xui/en/floater_im_container.xml b/indra/newview/skins/default/xui/en/floater_im_container.xml
index bd25288a9e..e123de46c2 100644
--- a/indra/newview/skins/default/xui/en/floater_im_container.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_container.xml
@@ -11,7 +11,7 @@
save_visibility="true"
single_instance="true"
title="CONVERSATIONS"
- width="392">
+ width="396">
<tab_container
follows="left|right|top|bottom"
height="390"
@@ -19,10 +19,22 @@
left="1"
name="im_box_tab_container"
tab_position="bottom"
- tab_width="80"
+ tab_width="64"
+ tab_max_width = "134"
tab_height="16"
+ use_custom_icon_ctrl="true"
+ tab_icon_ctrl_pad="2"
+ halign="left"
+ use_ellipses="true"
top="0"
- width="390" />
+ width="394">
+ <first_tab
+ tab_bottom_image_flash="Toolbar_Left_Flash"/>
+ <middle_tab
+ tab_bottom_image_flash="Toolbar_Middle_Flash"/>
+ <last_tab
+ tab_bottom_image_flash="Toolbar_Right_Flash"/>
+ </tab_container>
<icon
color="DefaultShadowLight"
enabled="false"
@@ -33,5 +45,5 @@
left="1"
name="im_box_tab_container_icon"
bottom="10"
- width="390" />
+ width="394" />
</multi_floater>
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 d2e5473157..c9b013099b 100644
--- a/indra/newview/skins/default/xui/en/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_session.xml
@@ -2,6 +2,7 @@
<floater
legacy_header_height="18"
background_visible="true"
+ default_tab_group="1"
follows="all"
height="350"
layout="topleft"
@@ -12,33 +13,36 @@
can_minimize="true"
can_close="true"
visible="false"
- width="360"
+ width="394"
can_resize="true"
min_width="250"
min_height="190">
<layout_stack
animate="false"
+ default_tab_group="2"
follows="all"
height="320"
- width="360"
+ width="394"
layout="topleft"
orientation="horizontal"
name="im_panels"
+ tab_group="1"
top="20"
left="0">
<layout_panel
name="panel_im_control_panel"
layout="topleft"
follows="left"
- label="IM Control Panel"
min_width="115"
auto_resize="false"
user_resize="true" />
<layout_panel
+ default_tab_group="3"
left="0"
+ tab_group="2"
top="0"
height="200"
- width="245"
+ width="254"
user_resize="true">
<button
height="20"
@@ -65,7 +69,7 @@
parse_highlights="true"
allow_html="true"
left="1"
- width="240">
+ width="249">
</chat_history>
<line_editor
bottom="0"
@@ -75,7 +79,8 @@
label="To"
layout="bottomleft"
name="chat_editor"
- width="240">
+ tab_group="3"
+ width="249">
</line_editor>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/en/floater_image_preview.xml b/indra/newview/skins/default/xui/en/floater_image_preview.xml
index 6f8f272128..86232de1a4 100644
--- a/indra/newview/skins/default/xui/en/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_image_preview.xml
@@ -64,35 +64,45 @@
name="clothing_type_combo"
top_delta="3"
width="160">
- <combo_box.item
+ <item
label="Image"
+ value="Image"
name="Image" />
- <combo_box.item
+ <item
label="Hair"
+ value="Hair"
name="Hair" />
- <combo_box.item
+ <item
label="Female Head"
+ value="Female Head"
name="FemaleHead" />
- <combo_box.item
+ <item
label="Female Upper Body"
+ value="Female Upper Body"
name="FemaleUpperBody" />
- <combo_box.item
+ <item
label="Female Lower Body"
+ value="Female Lower Body"
name="FemaleLowerBody" />
- <combo_box.item
+ <item
label="Male Head"
+ value="Male Head"
name="MaleHead" />
- <combo_box.item
+ <item
label="Male Upper Body"
+ value="Male Upper Body"
name="MaleUpperBody" />
- <combo_box.item
+ <item
label="Male Lower Body"
+ value="Male Lower Body"
name="MaleLowerBody" />
- <combo_box.item
+ <item
label="Skirt"
+ value="Skirt"
name="Skirt" />
- <combo_box.item
+ <item
label="Sculpted Prim"
+ value="Sculpted Prim"
name="SculptedPrim" />
</combo_box>
<text
diff --git a/indra/newview/skins/default/xui/en/floater_incoming_call.xml b/indra/newview/skins/default/xui/en/floater_incoming_call.xml
index 1d67123726..24fff6d4ae 100644
--- a/indra/newview/skins/default/xui/en/floater_incoming_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_incoming_call.xml
@@ -32,7 +32,15 @@
</floater.string>
<floater.string
name="VoiceInviteGroup">
- has joined a Voice Chat call with the group [GROUP].
+ just joined '[GROUP]' voice channel.
+ </floater.string>
+ <floater.string
+ name="VoiceInviteQuestionGroup">
+ Would you like to leave [CURRENT_CHAT] and join the call with '[GROUP]'?
+ </floater.string>
+ <floater.string
+ name="VoiceInviteQuestionDefault">
+ Do you want to leave [CURRENT_CHAT] and join this voice chat?
</floater.string>
<avatar_icon
enabled="false"
diff --git a/indra/newview/skins/default/xui/en/floater_inspect.xml b/indra/newview/skins/default/xui/en/floater_inspect.xml
index 3f7642fafe..bea35e5fc1 100644
--- a/indra/newview/skins/default/xui/en/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/en/floater_inspect.xml
@@ -16,7 +16,7 @@
[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
</floater.string>
<scroll_list
- bottom="270"
+ bottom="268"
column_padding="0"
draw_heading="true"
follows="top|right|left|bottom"
@@ -47,23 +47,23 @@
</scroll_list>
<button
follows="left|bottom"
- height="20"
+ height="23"
label="See Owner Profile..."
layout="topleft"
- left_delta="0"
+ left_delta="-1"
name="button owner"
tool_tip="See profile of the highlighted object&apos;s owner"
- top_pad="5"
+ top_pad="4"
width="150">
<button.commit_callback
function="Inspect.OwnerProfile" />
</button>
<button
follows="left|bottom"
- height="20"
+ height="23"
label="See Creator Profile..."
layout="topleft"
- left_pad="10"
+ left_pad="5"
name="button creator"
tool_tip="See profile of the highlighted object&apos;s original creator"
top_delta="0"
diff --git a/indra/newview/skins/default/xui/en/floater_inventory.xml b/indra/newview/skins/default/xui/en/floater_inventory.xml
index e187eabd3a..ba2e0d3277 100644
--- a/indra/newview/skins/default/xui/en/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/en/floater_inventory.xml
@@ -14,22 +14,6 @@
single_instance="false"
title="MY INVENTORY"
width="467">
- <floater.string
- name="Title">
- MY INVENTORY
- </floater.string>
- <floater.string
- name="TitleFetching">
- Inventory (Fetching [ITEM_COUNT] Items...) [FILTER]
- </floater.string>
- <floater.string
- name="TitleCompleted">
- Inventory ([ITEM_COUNT] Items) [FILTER]
- </floater.string>
- <floater.string
- name="Fetched">
- Fetched
- </floater.string>
<panel
bottom="560"
class="panel_main_inventory"
diff --git a/indra/newview/skins/default/xui/en/floater_joystick.xml b/indra/newview/skins/default/xui/en/floater_joystick.xml
index 4d67e4c343..6e1bb8fcd0 100644
--- a/indra/newview/skins/default/xui/en/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/en/floater_joystick.xml
@@ -6,7 +6,7 @@
name="Joystick"
help_topic="joystick"
title="JOYSTICK CONFIGURATION"
- width="550">
+ width="569">
<floater.string
name="NoDevice">
no device detected
@@ -148,7 +148,7 @@
halign="right"
height="10"
layout="topleft"
- left="12"
+ left="37"
mouse_opaque="false"
name="Control Modes:"
top="110"
@@ -161,7 +161,7 @@
halign="center"
label="Avatar"
layout="topleft"
- left="125"
+ left="150"
name="JoystickAvatarEnabled"
width="60" />
<check_box
@@ -170,7 +170,7 @@
halign="center"
label="Build"
layout="topleft"
- left="194"
+ left="219"
name="JoystickBuildEnabled"
width="60" />
<check_box
@@ -179,14 +179,14 @@
halign="center"
label="Flycam"
layout="topleft"
- left="262"
+ left="289"
name="JoystickFlycamEnabled"
width="60" />
<stat_view
height="250"
label="Joystick Monitor"
layout="topleft"
- left="340"
+ left="359"
name="axis_view"
show_label="true"
top="142"
@@ -250,9 +250,9 @@
bottom="144"
halign="right"
layout="topleft"
- left="20"
+ left="3"
name="XScale"
- width="94">
+ width="140">
X Scale
</text>
<spinner
@@ -261,7 +261,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
- left="125"
+ left="150"
max_val="50"
min_val="-50"
name="AvatarAxisScale1"
@@ -272,7 +272,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
- left="195"
+ left="220"
max_val="1024"
min_val="-1024"
name="BuildAxisScale1"
@@ -283,7 +283,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
- left="265"
+ left="290"
max_val="1024"
min_val="-1024"
name="FlycamAxisScale1"
@@ -294,9 +294,9 @@
bottom="164"
halign="right"
layout="topleft"
- left="20"
+ left="3"
name="YScale"
- width="94">
+ width="140">
Y Scale
</text>
<spinner
@@ -305,7 +305,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
- left="125"
+ left="150"
max_val="50"
min_val="-50"
name="AvatarAxisScale2"
@@ -316,7 +316,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
- left="195"
+ left="220"
max_val="1024"
min_val="-1024"
name="BuildAxisScale2"
@@ -327,7 +327,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
- left="265"
+ left="290"
max_val="1024"
min_val="-1024"
name="FlycamAxisScale2"
@@ -338,9 +338,9 @@
bottom="184"
halign="right"
layout="topleft"
- left="20"
+ left="3"
name="ZScale"
- width="94">
+ width="140">
Z Scale
</text>
<spinner
@@ -349,7 +349,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
- left="125"
+ left="150"
max_val="50"
min_val="-50"
name="AvatarAxisScale0"
@@ -360,7 +360,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
- left="195"
+ left="220"
max_val="1024"
min_val="-1024"
name="BuildAxisScale0"
@@ -371,7 +371,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
- left="265"
+ left="290"
max_val="1024"
min_val="-1024"
name="FlycamAxisScale0"
@@ -382,9 +382,9 @@
bottom="204"
halign="right"
layout="topleft"
- left="20"
+ left="3"
name="PitchScale"
- width="94">
+ width="140">
Pitch Scale
</text>
<spinner
@@ -393,7 +393,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
- left="125"
+ left="150"
max_val="1024"
min_val="-1024"
name="AvatarAxisScale4"
@@ -404,7 +404,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
- left="195"
+ left="220"
max_val="1024"
min_val="-1024"
name="BuildAxisScale4"
@@ -415,7 +415,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
- left="265"
+ left="290"
max_val="1024"
min_val="-1024"
name="FlycamAxisScale4"
@@ -426,9 +426,9 @@
bottom="224"
halign="right"
layout="topleft"
- left="20"
+ left="3"
name="YawScale"
- width="94">
+ width="140">
Yaw Scale
</text>
<spinner
@@ -437,7 +437,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
- left="125"
+ left="150"
max_val="1024"
min_val="-1024"
name="AvatarAxisScale5"
@@ -448,7 +448,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
- left="195"
+ left="220"
max_val="1024"
min_val="-1024"
name="BuildAxisScale5"
@@ -459,7 +459,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
- left="265"
+ left="290"
max_val="1024"
min_val="-1024"
name="FlycamAxisScale5"
@@ -470,9 +470,9 @@
bottom="244"
halign="right"
layout="topleft"
- left="20"
+ left="3"
name="RollScale"
- width="94">
+ width="140">
Roll Scale
</text>
<spinner
@@ -481,7 +481,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
- left="195"
+ left="220"
max_val="1024"
min_val="-1024"
name="BuildAxisScale3"
@@ -492,7 +492,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
- left="265"
+ left="290"
max_val="1024"
min_val="-1024"
name="FlycamAxisScale3"
@@ -503,9 +503,9 @@
bottom="274"
halign="right"
layout="topleft"
- left="20"
+ left="3"
name="XDeadZone"
- width="94">
+ width="140">
X Dead Zone
</text>
<spinner
@@ -515,7 +515,7 @@
increment="0.01"
label_width="0"
layout="topleft"
- left="125"
+ left="150"
name="AvatarAxisDeadZone1"
width="56" />
<spinner
@@ -525,7 +525,7 @@
increment="0.01"
label_width="0"
layout="topleft"
- left="195"
+ left="220"
name="BuildAxisDeadZone1"
width="56" />
<spinner
@@ -535,7 +535,7 @@
increment="0.01"
label_width="0"
layout="topleft"
- left="265"
+ left="290"
name="FlycamAxisDeadZone1"
width="56" />
<text
@@ -544,9 +544,9 @@
bottom="294"
halign="right"
layout="topleft"
- left="20"
+ left="3"
name="YDeadZone"
- width="94">
+ width="140">
Y Dead Zone
</text>
<spinner
@@ -556,7 +556,7 @@
increment="0.01"
label_width="0"
layout="topleft"
- left="125"
+ left="150"
name="AvatarAxisDeadZone2"
width="56" />
<spinner
@@ -566,7 +566,7 @@
increment="0.01"
label_width="0"
layout="topleft"
- left="195"
+ left="220"
name="BuildAxisDeadZone2"
width="56" />
<spinner
@@ -576,7 +576,7 @@
increment="0.01"
label_width="0"
layout="topleft"
- left="265"
+ left="290"
name="FlycamAxisDeadZone2"
width="56" />
<text
@@ -585,9 +585,9 @@
bottom="314"
halign="right"
layout="topleft"
- left="20"
+ left="3"
name="ZDeadZone"
- width="94">
+ width="140">
Z Dead Zone
</text>
<spinner
@@ -597,7 +597,7 @@
increment="0.01"
label_width="0"
layout="topleft"
- left="125"
+ left="150"
name="AvatarAxisDeadZone0"
width="56" />
<spinner
@@ -607,7 +607,7 @@
increment="0.01"
label_width="0"
layout="topleft"
- left="195"
+ left="220"
name="BuildAxisDeadZone0"
width="56" />
<spinner
@@ -617,7 +617,7 @@
increment="0.01"
label_width="0"
layout="topleft"
- left="265"
+ left="290"
name="FlycamAxisDeadZone0"
width="56" />
<text
@@ -626,9 +626,9 @@
bottom="334"
halign="right"
layout="topleft"
- left="20"
+ left="2"
name="PitchDeadZone"
- width="94">
+ width="140">
Pitch Dead Zone
</text>
<spinner
@@ -638,7 +638,7 @@
increment="0.01"
label_width="0"
layout="topleft"
- left="125"
+ left="150"
name="AvatarAxisDeadZone4"
width="56" />
<spinner
@@ -648,7 +648,7 @@
increment="0.01"
label_width="0"
layout="topleft"
- left="195"
+ left="220"
name="BuildAxisDeadZone4"
width="56" />
<spinner
@@ -658,7 +658,7 @@
increment="0.01"
label_width="0"
layout="topleft"
- left="265"
+ left="290"
name="FlycamAxisDeadZone4"
width="56" />
<text
@@ -667,9 +667,9 @@
bottom="354"
halign="right"
layout="topleft"
- left="20"
+ left="3"
name="YawDeadZone"
- width="94">
+ width="140">
Yaw Dead Zone
</text>
<spinner
@@ -679,7 +679,7 @@
increment="0.01"
label_width="0"
layout="topleft"
- left="125"
+ left="150"
name="AvatarAxisDeadZone5"
width="56" />
<spinner
@@ -689,7 +689,7 @@
increment="0.01"
label_width="0"
layout="topleft"
- left="195"
+ left="220"
name="BuildAxisDeadZone5"
width="56" />
<spinner
@@ -699,7 +699,7 @@
increment="0.01"
label_width="0"
layout="topleft"
- left="265"
+ left="290"
name="FlycamAxisDeadZone5"
width="56" />
<text
@@ -708,9 +708,9 @@
bottom="374"
halign="right"
layout="topleft"
- left="20"
+ left="3"
name="RollDeadZone"
- width="94">
+ width="140">
Roll Dead Zone
</text>
<spinner
@@ -720,7 +720,7 @@
increment="0.01"
label_width="0"
layout="topleft"
- left="195"
+ left="220"
name="BuildAxisDeadZone3"
width="56" />
<spinner
@@ -730,7 +730,7 @@
increment="0.01"
label_width="0"
layout="topleft"
- left="265"
+ left="290"
name="FlycamAxisDeadZone3"
width="56" />
<text
@@ -739,9 +739,9 @@
bottom="402"
halign="right"
layout="topleft"
- left="20"
+ left="3"
name="Feathering"
- width="94">
+ width="140">
Feathering
</text>
<slider
@@ -752,7 +752,7 @@
increment="1"
initial_value="0.7"
layout="topleft"
- left="116"
+ left="141"
max_val="32"
min_val="1"
name="AvatarFeathering"
@@ -795,9 +795,9 @@
bottom="430"
halign="right"
layout="topleft"
- left="20"
+ left="3"
name="ZoomScale2"
- width="94">
+ width="140">
Zoom Scale
</text>
<spinner
@@ -806,7 +806,7 @@
decimal_digits="2"
label_width="0"
layout="topleft"
- left="265"
+ left="290"
max_val="1024"
min_val="-1024"
name="FlycamAxisScale6"
@@ -817,9 +817,9 @@
bottom="450"
halign="right"
layout="topleft"
- left="20"
+ left="3"
name="ZoomDeadZone"
- width="94">
+ width="140">
Zoom Dead Zone
</text>
<spinner
@@ -829,7 +829,7 @@
increment="0.01"
label_width="0"
layout="topleft"
- left="265"
+ left="290"
name="FlycamAxisDeadZone6"
width="56" />
<button
@@ -837,10 +837,10 @@
height="22"
label="SpaceNavigator Defaults"
layout="topleft"
- left="340"
+ left="359"
name="SpaceNavigatorDefaults"
top="429"
- width="184" />
+ width="200" />
<button
follows="right|bottom"
height="20"
@@ -850,7 +850,7 @@
left_delta="0"
name="ok_btn"
top_pad="9"
- width="90" />
+ width="98" />
<button
follows="right|bottom"
height="20"
@@ -860,5 +860,5 @@
left_pad="4"
name="cancel_btn"
top_delta="0"
- width="90" />
+ width="98" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_land_holdings.xml b/indra/newview/skins/default/xui/en/floater_land_holdings.xml
index 06c766f744..0b9ae3c9f3 100644
--- a/indra/newview/skins/default/xui/en/floater_land_holdings.xml
+++ b/indra/newview/skins/default/xui/en/floater_land_holdings.xml
@@ -99,7 +99,7 @@
name="allowed_label"
top="366"
left="10"
- width="290">
+ width="365">
Allowed land holdings at current payment plan:
</text>
<text
@@ -110,7 +110,7 @@
layout="topleft"
name="allowed_text"
top="366"
- left="305"
+ left="380"
width="290">
[AREA] m²
</text>
@@ -123,7 +123,7 @@
top="386"
left="10"
name="current_label"
- width="290">
+ width="365">
Current land holdings:
</text>
<text
@@ -133,7 +133,7 @@
height="16"
layout="topleft"
top="386"
- left="305"
+ left="380"
name="current_text"
width="290">
[AREA] m²
@@ -148,7 +148,7 @@
top="406"
left="10"
name="available_label"
- width="290">
+ width="365">
Available for land purchases:
</text>
<text
@@ -160,7 +160,7 @@
layout="topleft"
name="available_text"
top="406"
- left="305"
+ left="380"
width="290">
[AREA] m²
</text>
diff --git a/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml
index 990be55847..1f192f9b28 100644
--- a/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/en/floater_live_lsleditor.xml
@@ -45,9 +45,9 @@
layout="topleft"
name="Reset"
left="10"
- width="61" />
+ width="85" />
<check_box
- left_delta="71"
+ left_delta="90"
top_delta="3"
enabled="false"
follows="left|bottom"
@@ -57,9 +57,9 @@
label="Running"
layout="topleft"
name="running"
- width="100" />
+ width="205" />
<check_box
- left_delta="75"
+ left_delta="140"
enabled="true"
follows="left|bottom"
font="SansSerif"
diff --git a/indra/newview/skins/default/xui/en/floater_map.xml b/indra/newview/skins/default/xui/en/floater_map.xml
index 1903e7c714..a0e28f7a42 100644
--- a/indra/newview/skins/default/xui/en/floater_map.xml
+++ b/indra/newview/skins/default/xui/en/floater_map.xml
@@ -1,21 +1,22 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
- legacy_header_height="18"
+ bg_alpha_image_overlay="DkGray_66"
+ legacy_header_height="0"
can_minimize="true"
can_resize="true"
- center_horiz="true"
- center_vert="true"
follows="top|right"
- height="218"
+ height="174"
layout="topleft"
- min_height="60"
+ min_height="174"
min_width="174"
name="Map"
- title="Mini Map"
+ title=""
help_topic="map"
save_rect="true"
save_visibility="true"
single_instance="true"
+ left="0"
+ top="0"
width="200">
<floater.string
name="mini_map_north">
@@ -61,8 +62,8 @@
mouse_opaque="false"
name="Net Map"
width="200"
- height="200"
- top="18"/>
+ height="218"
+ top="0"/>
<text
type="string"
length="1"
diff --git a/indra/newview/skins/default/xui/en/floater_media_browser.xml b/indra/newview/skins/default/xui/en/floater_media_browser.xml
index 70dac7e41c..c02d607586 100644
--- a/indra/newview/skins/default/xui/en/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/en/floater_media_browser.xml
@@ -182,7 +182,7 @@
</button>
</layout_panel>
<layout_panel
- height="20"
+ height="40"
layout="topleft"
left_delta="0"
name="external_controls"
@@ -190,7 +190,7 @@
user_resize="false"
width="540">
<web_browser
- bottom="-10"
+ bottom="-30"
follows="left|right|top|bottom"
layout="topleft"
left="0"
@@ -206,9 +206,9 @@
name="open_browser"
top_pad="5"
width="185">
- <button.commit_callback
- function="MediaBrowser.OpenWebBrowser" />
- </button>
+ <button.commit_callback
+ function="MediaBrowser.OpenWebBrowser" />
+ </button>
<check_box
control_name="UseExternalBrowser"
follows="bottom|left"
diff --git a/indra/newview/skins/default/xui/en/floater_moveview.xml b/indra/newview/skins/default/xui/en/floater_moveview.xml
index 0bdcbf30df..6f29255a6b 100644
--- a/indra/newview/skins/default/xui/en/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/en/floater_moveview.xml
@@ -4,7 +4,6 @@
can_dock="true"
can_minimize="true"
can_close="false"
- center_horiz="true"
follows="bottom"
height="110"
layout="topleft"
@@ -12,7 +11,8 @@
help_topic="move_floater"
save_rect="true"
save_visibility="true"
- width="115">
+ save_dock_state="true"
+ width="133">
<string
name="walk_forward_tooltip">
Walk Forward (press Up Arrow or W)
@@ -22,6 +22,14 @@
Walk Backwards (press Down Arrow or S)
</string>
<string
+ name="walk_left_tooltip">
+ Walk left (press Shift + Left Arrow or A)
+ </string>
+ <string
+ name="walk_right_tooltip">
+ Walk right (press Shift + Right Arrow or D)
+ </string>
+ <string
name="run_forward_tooltip">
Run Forward (press Up Arrow or W)
</string>
@@ -30,6 +38,14 @@
Run Backwards (press Down Arrow or S)
</string>
<string
+ name="run_left_tooltip">
+ Run left (press Shift + Left Arrow or A)
+ </string>
+ <string
+ name="run_right_tooltip">
+ Run right (press Shift + Right Arrow or D)
+ </string>
+ <string
name="fly_forward_tooltip">
Fly Forward (press Up Arrow or W)
</string>
@@ -37,6 +53,42 @@
name="fly_back_tooltip">
Fly Backwards (press Down Arrow or S)
</string>
+ <string
+ name="fly_left_tooltip">
+ Fly left (press Shift + Left Arrow or A)
+ </string>
+ <string
+ name="fly_right_tooltip">
+ Fly right (press Shift + Right Arrow or D)
+ </string>
+ <string
+ name="fly_up_tooltip">
+ Fly up (press E)
+ </string>
+ <string
+ name="fly_down_tooltip">
+ Fly down (press C)
+ </string>
+ <string
+ name="jump_tooltip">
+ Jump (press E)
+ </string>
+ <string
+ name="crouch_tooltip">
+ Crouch (press C)
+ </string>
+ <string
+ name="walk_title">
+ Walk
+ </string>
+ <string
+ name="run_title">
+ Run
+ </string>
+ <string
+ name="fly_title">
+ Fly
+ </string>
<panel
border="false"
height="83"
@@ -46,76 +98,82 @@
mouse_opaque="false"
name="panel_actions"
top="0"
- width="115">
+ width="133">
+ <!-- Buttons in panel are organized in 3 columns to enable their easy vertical adjustment via top_pad-->
+ <!-- Left column -->
<button
follows="left|bottom"
- height="25"
+ height="24"
image_selected="Movement_TurnLeft_On"
image_pressed_selected="Movement_TurnLeft_On"
image_unselected="Movement_TurnLeft_Off"
layout="topleft"
- left="17"
+ left="30"
name="turn left btn"
scale_image="false"
tool_tip="Turn left (press Left Arrow or A)"
- top="45"
- width="25" />
+ top="34"
+ width="24" />
+ <joystick_slide
+ follows="left|bottom"
+ height="10"
+ image_selected="Movement_Left_On"
+ image_pressed_selected="Movement_Left_On"
+ image_unselected="Movement_Left_Off"
+ layout="topleft"
+ left_delta="4"
+ name="move left btn"
+ quadrant="left"
+ scale_image="false"
+ tool_tip="Walk left (press Shift + Left Arrow or A)"
+ top_pad="10"
+ width="19" />
+ <!-- Right column -->
<button
follows="left|bottom"
- height="25"
+ height="24"
image_selected="Movement_TurnRight_On"
image_pressed_selected="Movement_TurnRight_On"
image_unselected="Movement_TurnRight_Off"
layout="topleft"
- left_pad="34"
+ right="-30"
name="turn right btn"
scale_image="false"
tool_tip="Turn right (press Right Arrow or D)"
- top_delta="0"
- width="25" />
- <button
- follows="left|bottom"
- height="25"
- image_selected="Movement_Up_On"
- image_pressed_selected="Movement_Up_On"
- image_unselected="Movement_Up_Off"
- layout="topleft"
- left="10"
- name="move up btn"
- scale_image="false"
- tool_tip="Fly up, press &quot;E&quot;"
- top="14"
- width="25" />
- <button
+ top="34"
+ width="24" />
+ <joystick_slide
follows="left|bottom"
- height="25"
- image_selected="Movement_Down_On"
- image_pressed_selected="Movement_Down_On"
- image_unselected="Movement_Down_Off"
+ height="10"
+ image_selected="Movement_Right_On"
+ image_pressed_selected="Movement_Right_On"
+ image_unselected="Movement_Right_Off"
layout="topleft"
- left_pad="45"
- name="move down btn"
+ name="move right btn"
+ quadrant="right"
+ right_delta="4"
scale_image="false"
- tool_tip="Fly down, press &quot;C&quot;"
- top_delta="0"
- width="20" />
+ tool_tip="Walk right (press Shift + Right Arrow or D)"
+ top_pad="10"
+ width="19" />
+ <!-- Middle column -->
<joystick_turn
follows="left|bottom"
- height="25"
+ height="24"
image_selected="Movement_Forward_On"
image_pressed_selected="Movement_Forward_On"
image_unselected="Movement_Forward_Off"
layout="topleft"
- left="46"
+ left="54"
name="forward btn"
quadrant="up"
scale_image="false"
tool_tip="Walk forward (press up arrow or W)"
- top_delta="10"
- width="21" />
+ top="20"
+ width="24" />
<joystick_turn
follows="left|bottom"
- height="25"
+ height="24"
image_selected="Movement_Backward_On"
image_pressed_selected="Movement_Backward_On"
image_unselected="Movement_Backward_Off"
@@ -125,8 +183,35 @@
quadrant="down"
scale_image="false"
tool_tip="Walk backward (press down arrow or S)"
- top_delta="30"
- width="21" />
+ top_pad="5"
+ width="24" />
+ <!-- Fly up/down (jump/crouch) buttons -->
+ <button
+ follows="left|bottom"
+ height="19"
+ image_selected="Movement_Up_On"
+ image_pressed_selected="Movement_Up_On"
+ image_unselected="Movement_Up_Off"
+ layout="topleft"
+ right="-11"
+ name="move up btn"
+ scale_image="false"
+ tool_tip="Fly up (press E)"
+ top="22"
+ width="10" />
+ <button
+ follows="left|bottom"
+ height="19"
+ image_selected="Movement_Down_On"
+ image_pressed_selected="Movement_Down_On"
+ image_unselected="Movement_Down_Off"
+ layout="topleft"
+ right_delta="0"
+ name="move down btn"
+ scale_image="false"
+ tool_tip="Fly down (press C)"
+ top_pad="10"
+ width="10" />
</panel>
<!-- Width and height of this panel should be synchronized with panel_stand_stop_flying.xml -->
<panel
@@ -136,7 +221,7 @@
left="0"
name="panel_modes"
top_pad="0"
- width="115">
+ width="133">
<button
follows="left|bottom"
height="23"
@@ -145,7 +230,7 @@
label=""
layout="topleft"
name="mode_walk_btn"
- left="10"
+ left="20"
pad_right="0"
tool_tip="Walking mode"
top="2"
@@ -178,16 +263,5 @@
tool_tip="Flying mode"
top="2"
width="31" />
- <button
- visible="false"
- follows="left|bottom"
- height="20"
- label="Stop Flying"
- layout="topleft"
- left="0"
- name="stop_fly_btn"
- tool_tip="Stop flying"
- top="2"
- width="115" />
</panel>
</floater>
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 ae686d9ab7..28616d503b 100644
--- a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
@@ -6,7 +6,7 @@
border="false"
bg_opaque_image="Window_Foreground"
bg_alpha_image="Window_Background"
- bg_alpha_color="0 0 0 0"
+ bg_alpha_image_overlay="DkGray_66"
legacy_header_height="18"
can_minimize="true"
can_tear_off="false"
diff --git a/indra/newview/skins/default/xui/en/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/en/floater_outfit_save_as.xml
index 16079b30cb..1d73d516d0 100644
--- a/indra/newview/skins/default/xui/en/floater_outfit_save_as.xml
+++ b/indra/newview/skins/default/xui/en/floater_outfit_save_as.xml
@@ -4,6 +4,7 @@
can_minimize="false"
height="100"
layout="topleft"
+ title="Save Outfit"
name="modal container"
width="240">
<button
@@ -44,7 +45,6 @@ as a new Outfit:
border_style="line"
border_thickness="1"
follows="left|top"
- handle_edit_keys_directly="true"
height="23"
layout="topleft"
left_delta="0"
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 eb772cc0bd..9db6568ee3 100644
--- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
@@ -89,18 +89,29 @@ No Answer. Please try again later.
top="27"
width="315"
word_wrap="true">
- You have been disconnected from [VOICE_CHANNEL_NAME]. You will now be reconnected to Nearby Voice Chat.
+ You have been disconnected from [VOICE_CHANNEL_NAME]. [RECONNECT_NEARBY]
</text>
<text
font="SansSerifLarge"
height="40"
layout="topleft"
left="77"
- name="nearby_P2P"
+ name="nearby_P2P_by_other"
top="27"
width="315"
word_wrap="true">
- [VOICE_CHANNEL_NAME] has ended the call. You will now be reconnected to Nearby Voice Chat.
+ Your call has ended. [RECONNECT_NEARBY]
+ </text>
+ <text
+ font="SansSerifLarge"
+ height="40"
+ layout="topleft"
+ left="77"
+ name="nearby_P2P_by_agent"
+ top="27"
+ width="315"
+ word_wrap="true">
+ You have ended the call. [RECONNECT_NEARBY]
</text>
<text
font="SansSerif"
@@ -108,7 +119,7 @@ No Answer. Please try again later.
layout="topleft"
left="77"
name="leaving"
- top="52"
+ top="62"
width="315"
word_wrap="true">
Leaving [CURRENT_CHAT].
diff --git a/indra/newview/skins/default/xui/en/floater_perm_prefs.xml b/indra/newview/skins/default/xui/en/floater_perm_prefs.xml
index 4909b8988f..ff454e3ebf 100644
--- a/indra/newview/skins/default/xui/en/floater_perm_prefs.xml
+++ b/indra/newview/skins/default/xui/en/floater_perm_prefs.xml
@@ -44,7 +44,7 @@
left_delta="0"
name="NextOwnerLabel"
top_pad="5"
- width="150">
+ width="200">
Next owner can:
</text>
<check_box
diff --git a/indra/newview/skins/default/xui/en/floater_postcard.xml b/indra/newview/skins/default/xui/en/floater_postcard.xml
index 3a7b6cc832..6f78363b25 100644
--- a/indra/newview/skins/default/xui/en/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/en/floater_postcard.xml
@@ -128,19 +128,9 @@
width="420">
Type your message here.
</text_editor>
- <text
- type="string"
- length="1"
- bottom_delta="37"
- follows="left|bottom"
- layout="topleft"
- left="12"
- name="fine_print">
- If your recipient joins SL, you&apos;ll get a referral bonus.
- </text>
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Cancel"
layout="topleft"
name="cancel_btn"
@@ -149,7 +139,7 @@
width="100" />
<button
follows="right|bottom"
- height="20"
+ height="23"
label="Send"
layout="topleft"
left_delta="-106"
diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml
index 05deca705a..50d0011338 100644
--- a/indra/newview/skins/default/xui/en/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/en/floater_preferences.xml
@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- center_horiz="true"
- center_vert="true"
+ open_centered="true"
default_tab_group="1"
height="460"
layout="topleft"
@@ -10,7 +9,7 @@
help_topic="preferences"
single_instance="true"
title="PREFERENCES"
- width="620">
+ width="658">
<button
follows="right|bottom"
height="23"
@@ -39,6 +38,7 @@
</button>
<tab_container
follows="all"
+ halign="left"
height="410"
layout="topleft"
left="0"
@@ -46,8 +46,9 @@
tab_group="1"
tab_position="left"
tab_width="115"
+ tab_padding_right="0"
top="21"
- width="620">
+ width="658">
<panel
class="panel_preference"
filename="panel_preferences_general.xml"
@@ -72,7 +73,7 @@
<panel
class="panel_preference"
filename="panel_preferences_sound.xml"
- label="Sound"
+ label="Sound &amp; Media"
layout="topleft"
help_topic="preferences_audio_tab"
name="audio" />
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 3dc546aee3..6281bc5272 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_gesture.xml
@@ -39,28 +39,6 @@
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"
@@ -70,7 +48,7 @@
layout="topleft"
left="10"
name="desc_label"
- top_pad="10"
+ top_pad="25"
font.style="BOLD"
width="100">
Description:
@@ -79,10 +57,10 @@
follows="left|top"
height="20"
layout="topleft"
- left_delta="84"
+ left_delta="89"
name="desc"
top_delta="-4"
- width="180" />
+ width="175" />
<text
type="string"
length="1"
@@ -101,11 +79,11 @@
follows="left|top"
height="20"
layout="topleft"
- left_delta="84"
+ left_delta="89"
max_length="31"
name="trigger_editor"
top_delta="-4"
- width="180" />
+ width="175" />
<text
type="string"
length="1"
@@ -125,12 +103,12 @@
follows="left|top"
height="20"
layout="topleft"
- left_delta="84"
+ left_delta="89"
max_length="31"
name="replace_editor"
tool_tip="Replace the trigger word(s) with these words. For example, trigger &apos;hello&apos; replace with &apos;howdy&apos; will turn the chat &apos;I wanted to say hello&apos; into &apos;I wanted to say howdy&apos; as well as playing the gesture"
top_delta="-4"
- width="180" />
+ width="175" />
<text
type="string"
length="1"
@@ -149,7 +127,7 @@
height="20"
label="None"
layout="topleft"
- left_delta="84"
+ left_delta="89"
name="modifier_combo"
top_delta="-4"
width="75" />
@@ -171,7 +149,7 @@
left="10"
font.style="BOLD"
name="library_label"
- top="135"
+ top_delta="25"
width="100">
Library:
</text>
@@ -181,7 +159,7 @@
layout="topleft"
left="10"
name="library_list"
- top="150"
+ top_delta="15"
width="180">
<scroll_list.rows
value="Animation" />
@@ -199,7 +177,7 @@
layout="topleft"
left_pad="10"
name="add_btn"
- top_delta="0"
+ top_delta="-1"
width="70" />
<text
type="string"
@@ -230,7 +208,7 @@
layout="topleft"
left_pad="10"
name="up_btn"
- top_delta="0"
+ top_delta="-1"
width="70" />
<button
follows="top|left"
@@ -256,23 +234,25 @@
layout="topleft"
left="15"
name="options_text"
- top="330"
- width="205" />
+ top="315"
+ width="205">
+ (options)
+ </text>
<combo_box
follows="top|left"
height="20"
layout="topleft"
left_delta="15"
name="animation_list"
- top="345"
- width="100" />
+ top="330"
+ width="100"/>
<combo_box
follows="top|left"
height="20"
layout="topleft"
left_delta="0"
name="sound_list"
- top_delta="0"
+ top="330"
width="100" />
<line_editor
follows="top|left"
@@ -281,7 +261,7 @@
left_delta="0"
max_length="127"
name="chat_editor"
- top_delta="0"
+ top="330"
width="100" />
<radio_group
draw_border="false"
@@ -290,7 +270,7 @@
layout="topleft"
left_pad="8"
name="animation_trigger_type"
- top_delta="0"
+ top="330"
width="80">
<radio_item
height="16"
@@ -298,7 +278,7 @@
layout="topleft"
left="3"
name="start"
- top="-11"
+ top_delta="45"
width="80" />
<radio_item
height="16"
@@ -306,7 +286,7 @@
layout="topleft"
left_delta="0"
name="stop"
- top_pad="10"
+ top_pad="3"
width="80" />
</radio_group>
<check_box
@@ -314,14 +294,14 @@
height="20"
label="until animations are done"
layout="topleft"
- left="16"
+ left="28"
name="wait_anim_check"
- top="340"
+ top="330"
width="100" />
<check_box
follows="top|left"
height="20"
- label="time in seconds"
+ label="time in seconds:"
layout="topleft"
left_delta="0"
name="wait_time_check"
@@ -331,10 +311,10 @@
follows="top|left"
height="20"
layout="topleft"
- left_pad="5"
+ left_pad="10"
max_length="15"
name="wait_time_editor"
- top_delta="0"
+ top_delta="1"
width="50" />
<text
type="string"
diff --git a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml
index ead5b8c8f2..0e8eef2a21 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_notecard.xml
@@ -25,10 +25,6 @@
name="Title">
Notecard: [NAME]
</floater.string>
- <floater.string
- name="Save">
- Save
- </floater.string>
<icon
follows="top|right"
height="18"
@@ -76,7 +72,6 @@
max_length="65536"
name="Notecard Editor"
allow_html="false"
- handle_edit_keys_directly="true"
tab_group="1"
top="46"
width="392"
@@ -89,8 +84,18 @@
label="Save"
label_selected="Save"
layout="topleft"
- left="288"
+ left="178"
name="Save"
top="332"
width="100" />
+ <button
+ follows="right|bottom"
+ height="22"
+ label="Delete"
+ label_selected="Delete"
+ layout="topleft"
+ left="288"
+ name="Delete"
+ top="332"
+ width="100" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_preview_texture.xml b/indra/newview/skins/default/xui/en/floater_preview_texture.xml
index fc6f06ffd4..7fd7eab867 100644
--- a/indra/newview/skins/default/xui/en/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/en/floater_preview_texture.xml
@@ -118,7 +118,7 @@
<button
follows="right|bottom"
height="22"
- label="Cancel"
+ label="Discard"
layout="topleft"
left_pad="5"
name="Discard"
diff --git a/indra/newview/skins/default/xui/en/floater_publish_classified.xml b/indra/newview/skins/default/xui/en/floater_publish_classified.xml
new file mode 100644
index 0000000000..3225843d09
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_publish_classified.xml
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="18"
+ can_minimize="false"
+ height="200"
+ layout="topleft"
+ name="publish_classified"
+ help_topic="price_for_listing"
+ title="Publishing Classified"
+ width="320">
+ <text
+ top="20"
+ follows="top|left"
+ font="SansSerif"
+ height="60"
+ layout="topleft"
+ left="15"
+ word_wrap="true"
+ name="explanation_text">
+
+Your classified ad will run for one week from the date it is published.
+
+Remember, Classified fees are non-refundable.
+
+ </text>
+ <spinner
+ decimal_digits="0"
+ follows="left|top"
+ halign="left"
+ height="23"
+ increment="1"
+ label_width="70"
+ label="Price for Ad: "
+ v_pad="10"
+ layout="topleft"
+ left="15"
+ value="50"
+ min_val="50"
+ max_val="99999"
+ name="price_for_listing"
+ top_pad="10"
+ tool_tip="Price for listing."
+ width="150" />
+ <text
+ follows="top|left"
+ font="SansSerif"
+ height="60"
+ layout="topleft"
+ left_pad="5"
+ top_delta="0"
+ word_wrap="true"
+ value="L$"
+ name="l$_text" />
+ <text
+ follows="top|right"
+ font="SansSerif"
+ height="20"
+ layout="topleft"
+ left="15"
+ name="more_info_text"
+ top_pad="-20"
+ width="300">
+More info (link to classified help)
+ </text>
+ <button
+ follows="top|left"
+ height="22"
+ label="Publish"
+ layout="topleft"
+ left="105"
+ name="publish_btn"
+ top="160"
+ width="100" />
+ <button
+ follows="top|left"
+ height="22"
+ label="Cancel"
+ layout="topleft"
+ left_pad="5"
+ name="cancel_btn"
+ width="100" />
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_region_info.xml b/indra/newview/skins/default/xui/en/floater_region_info.xml
index 262bcd07a0..32fb6f97e7 100644
--- a/indra/newview/skins/default/xui/en/floater_region_info.xml
+++ b/indra/newview/skins/default/xui/en/floater_region_info.xml
@@ -7,7 +7,7 @@
name="regioninfo"
save_rect="true"
title="REGION/ESTATE"
- width="480">
+ width="530">
<tab_container
bottom="555"
follows="left|right|top|bottom"
diff --git a/indra/newview/skins/default/xui/en/floater_report_abuse.xml b/indra/newview/skins/default/xui/en/floater_report_abuse.xml
index ac0fca9cce..21c0bfef48 100644
--- a/indra/newview/skins/default/xui/en/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/en/floater_report_abuse.xml
@@ -456,7 +456,7 @@
layout="topleft"
left_delta="0"
name="dscr_title"
- top_pad="5"
+ top_pad="6"
width="50">
Details:
</text>
@@ -464,11 +464,12 @@
type="string"
length="1"
follows="left|top"
- height="16"
+ height="22"
layout="topleft"
name="bug_aviso"
left_pad="10"
- width="200">
+ word_wrap="true"
+ width="270">
Please be as specific as possible
</text>
<text_editor
diff --git a/indra/newview/skins/default/xui/en/floater_script.xml b/indra/newview/skins/default/xui/en/floater_script.xml
index c3e974d978..12ade86b5f 100644
--- a/indra/newview/skins/default/xui/en/floater_script.xml
+++ b/indra/newview/skins/default/xui/en/floater_script.xml
@@ -3,16 +3,16 @@
legacy_header_height="18"
background_visible="true"
follows="left|top|right|bottom"
- height="369"
+ height="250"
layout="topleft"
left="0"
name="script_floater"
top="0"
can_dock="true"
can_minimize="true"
- visible="true"
- width="520"
- can_resize="true"
+ visible="false"
+ width="350"
+ can_resize="false"
min_width="350"
- min_height="369">
+ min_height="200">
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml
index bd9925be1d..d1db5c17ba 100644
--- a/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml
+++ b/indra/newview/skins/default/xui/en/floater_script_debug_panel.xml
@@ -15,9 +15,10 @@
follows="left|top|right|bottom"
height="176"
layout="topleft"
- max_length="10000"
+ max_length="2147483647"
name="Chat History Editor"
parse_highlights="true"
+ read_only="true"
width="420"
word_wrap="true" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_search.xml b/indra/newview/skins/default/xui/en/floater_search.xml
index 775e7d66f7..49b3b58113 100644
--- a/indra/newview/skins/default/xui/en/floater_search.xml
+++ b/indra/newview/skins/default/xui/en/floater_search.xml
@@ -2,16 +2,17 @@
<floater
legacy_header_height="13"
can_resize="true"
- height="546"
+ height="600"
layout="topleft"
- min_height="546"
- min_width="670"
+ min_height="400"
+ min_width="450"
name="floater_search"
help_topic="floater_search"
save_rect="true"
+ save_visibility="true"
single_instance="true"
title="FIND"
- width="670">
+ width="650">
<floater.string
name="loading_text">
Loading...
@@ -21,20 +22,20 @@
Done
</floater.string>
<layout_stack
- bottom="541"
+ bottom="595"
follows="left|right|top|bottom"
layout="topleft"
left="10"
name="stack1"
top="20"
- width="650">
+ width="630">
<layout_panel
layout="topleft"
left_delta="0"
top_delta="0"
name="browser_layout"
user_resize="false"
- width="650">
+ width="630">
<web_browser
bottom="-10"
follows="left|right|top|bottom"
@@ -42,8 +43,8 @@
left="0"
name="browser"
top="0"
- height="500"
- width="650" />
+ height="555"
+ width="630" />
<text
follows="bottom|left"
height="16"
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 afc44c41b8..4cae42bcfe 100644
--- a/indra/newview/skins/default/xui/en/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_sell_land.xml
@@ -203,13 +203,13 @@
name="none"
visible="false" />
<radio_item
- bottom="20"
+ top_pad="10"
height="16"
label="No, keep ownership of objects"
left="10"
name="no" />
<radio_item
- bottom="40"
+ top_pad="10"
height="16"
label="Yes, sell objects with land"
left="10"
diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml
index 2c9402f6cb..452b2ac664 100644
--- a/indra/newview/skins/default/xui/en/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml
@@ -11,7 +11,11 @@
save_rect="true"
save_visibility="true"
title="SNAPSHOT PREVIEW"
- width="215">
+ width="215">
+ <floater.string
+ name="share_to_web_url" translate="false">
+http://pdp36.lindenlab.com:12777/
+ </floater.string>
<floater.string
name="unknown">
unknown
@@ -45,7 +49,7 @@
</radio_group>
<ui_ctrl
height="90"
- width="90"
+ width="125"
layout="topleft"
name="thumbnail_placeholder"
top_pad="6"
@@ -105,9 +109,11 @@
width="100">
<flyout_button.item
label="Save"
+ name="save_item"
value="save" />
<flyout_button.item
label="Save As..."
+ name="saveas_item"
value="save as" />
</flyout_button>
<button
@@ -147,7 +153,7 @@
left="10"
name="type_label2"
top_pad="5"
- width="120">
+ width="127">
Size
</text>
<text
@@ -197,7 +203,7 @@
left_delta="0"
name="texture_size_combo"
top_delta="0"
- width="120">
+ width="127">
<combo_box.item
label="Current Window"
name="CurrentWindow"
@@ -226,7 +232,7 @@
left_delta="0"
name="local_size_combo"
top_delta="0"
- width="120">
+ width="127">
<combo_box.item
label="Current Window"
name="CurrentWindow"
@@ -354,10 +360,6 @@
label="Depth"
name="Depth"
value="depth" />
- <combo_box.item
- label="Object Mattes"
- name="ObjectMattes"
- value="objects" />
</combo_box>
<check_box
label="Interface"
diff --git a/indra/newview/skins/default/xui/en/floater_test_inspectors.xml b/indra/newview/skins/default/xui/en/floater_test_inspectors.xml
index 0f5c5f2be0..209285da2e 100644
--- a/indra/newview/skins/default/xui/en/floater_test_inspectors.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_inspectors.xml
@@ -116,10 +116,10 @@
follows="left|top"
font="SansSerif"
height="20"
- left="0"
+ left="10"
max_length="65536"
name="slurl"
- top_pad="4"
+ top_pad="20"
width="150">
secondlife:///app/agent/00000000-0000-0000-0000-000000000000/inspect
</text>
@@ -127,12 +127,11 @@
follows="left|top"
font="SansSerif"
height="20"
- left="0"
+ left="10"
max_length="65536"
name="slurl_group"
- top_pad="4"
+ top_pad="20"
width="150">
secondlife:///app/group/00000000-0000-0000-0000-000000000000/inspect
</text>
-
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_test_text_editor.xml b/indra/newview/skins/default/xui/en/floater_test_text_editor.xml
index dc8f00d5f3..548e24efba 100644
--- a/indra/newview/skins/default/xui/en/floater_test_text_editor.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_text_editor.xml
@@ -14,6 +14,7 @@
name="test_text_editor"
tool_tip="text editor"
top="25"
+ word_wrap="true"
width="200">
Text Editor
</text_editor>
@@ -28,4 +29,17 @@
width="200">
This contains long text and should scroll horizontally to the right
</text_editor>
+ <text_editor
+ height="50"
+ follows="top|left|bottom"
+ font="SansSerif"
+ left="10"
+ name="numeric_text_editor"
+ tool_tip="text editor for numeric text entry only"
+ top_pad="10"
+ text_type="int"
+ width="200">
+ This is text that is NOT a number, so shouldn't appear
+ </text_editor>
+
</floater>
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 447bd7f599..fb583114c0 100644
--- a/indra/newview/skins/default/xui/en/floater_test_widgets.xml
+++ b/indra/newview/skins/default/xui/en/floater_test_widgets.xml
@@ -49,13 +49,10 @@
name="test_menu_bar"
top="16">
<menu
- height="16"
label="Menu"
layout="topleft"
tear_off="true"
- left="0"
name="Menu"
- top="-32"
width="128">
<!-- menu_item_call will trigger a function call in the C++ code -->
<menu_item_call
@@ -88,7 +85,6 @@
<!-- First column -->
<button
- height="20"
follows="top|left"
label="Button"
layout="topleft"
@@ -100,7 +96,6 @@
<!-- "flyout_button" is a button that can spawn a menu -->
<flyout_button
follows="top|left"
- height="20"
label="Flyout"
layout="topleft"
left_delta="0"
@@ -136,7 +131,6 @@
<combo_box
bottom_delta="35"
follows="top|left"
- height="16"
width="150"
label="Combobox"
layout="topleft"
@@ -343,12 +337,10 @@ line to actually fit
<tab_container
follows="all"
height="400"
- halign="center"
layout="topleft"
left="525"
name="group_tab_container"
tab_position="top"
- tab_height="20"
tool_tip="tab container"
top="80"
width="300">
diff --git a/indra/newview/skins/default/xui/en/floater_tools.xml b/indra/newview/skins/default/xui/en/floater_tools.xml
index 5630dfbe8f..efc1a66d95 100644
--- a/indra/newview/skins/default/xui/en/floater_tools.xml
+++ b/indra/newview/skins/default/xui/en/floater_tools.xml
@@ -2,7 +2,7 @@
<floater
legacy_header_height="18"
follows="left|top|right"
- height="570"
+ height="580"
layout="topleft"
bg_opaque_image="Window_NoTitle_Foreground"
bg_alpha_image="Window_NoTitle_Background"
@@ -11,8 +11,9 @@
save_rect="true"
short_title="BUILD TOOLS"
single_instance="true"
+ save_visibility="true"
sound_flags="0"
- width="280">
+ width="295">
<floater.string
name="status_rotate">
Drag colored bands to rotate object
@@ -67,80 +68,75 @@
</floater.string>
<button
follows="left|top"
- height="20"
- image_disabled="Tool_Zoom"
- image_disabled_selected="Tool_Zoom"
- image_selected="Tool_Zoom_Selected"
- image_unselected="Tool_Zoom"
+ height="25"
+ image_bottom_pad="1"
+ image_overlay="Tool_Zoom"
+ image_selected="PushButton_Selected_Press"
layout="topleft"
left="10"
name="button focus"
tool_tip="Focus"
- width="20">
+ width="35">
<button.commit_callback
function="BuildTool.setTool"
parameter="Focus" />
</button>
<button
follows="left|top"
- height="20"
- image_disabled="Tool_Grab"
- image_disabled_selected="Tool_Grab"
- image_selected="Tool_Grab_Selected"
- image_unselected="Tool_Grab"
+ height="25"
+ image_bottom_pad="1"
+ image_overlay="Tool_Grab"
+ image_selected="PushButton_Selected_Press"
layout="topleft"
- left_pad="20"
+ left_pad="10"
name="button move"
tool_tip="Move"
- width="20">
+ width="35">
<button.commit_callback
function="BuildTool.setTool"
parameter="Move" />
</button>
<button
follows="left|top"
- height="20"
- image_disabled="Tool_Face"
- image_disabled_selected="Tool_Face"
- image_selected="Tool_Face_Selected"
- image_unselected="Tool_Face"
+ height="25"
+ image_bottom_pad="1"
+ image_overlay="Tool_Face"
+ image_selected="PushButton_Selected_Press"
layout="topleft"
- left_pad="20"
+ left_pad="10"
name="button edit"
tool_tip="Edit"
- width="20">
+ width="35">
<button.commit_callback
function="BuildTool.setTool"
parameter="Edit" />
</button>
<button
follows="left|top"
- height="20"
- image_disabled="Tool_Create"
- image_disabled_selected="Tool_Create"
- image_selected="Tool_Create_Selected"
- image_unselected="Tool_Create"
+ height="25"
+ image_bottom_pad="1"
+ image_overlay="Tool_Create"
+ image_selected="PushButton_Selected_Press"
layout="topleft"
- left_pad="20"
+ left_pad="10"
name="button create"
tool_tip="Create"
- width="20">
+ width="35">
<button.commit_callback
function="BuildTool.setTool"
parameter="Create" />
</button>
<button
follows="left|top"
- height="20"
- image_disabled="Tool_Dozer"
- image_disabled_selected="Tool_Dozer"
- image_selected="Tool_Dozer_Selected"
- image_unselected="Tool_Dozer"
+ height="25"
+ image_bottom_pad="1"
+ image_overlay="Tool_Dozer"
+ image_selected="PushButton_Selected_Press"
layout="topleft"
- left_pad="20"
+ left_pad="10"
name="button land"
tool_tip="Land"
- width="20">
+ width="35">
<button.commit_callback
function="BuildTool.setTool"
parameter="Land" />
@@ -157,7 +153,7 @@
left="8"
name="text status"
top_pad="3"
- width="275">
+ width="285">
Drag to move, shift-drag to copy
</text>
<radio_group
@@ -224,8 +220,8 @@
</radio_group>
<radio_group
follows="left|top"
- left="10"
- top="54"
+ left="5"
+ top="59"
height="70"
layout="topleft"
name="edit_radio_group">
@@ -254,11 +250,12 @@
<check_box
left="10"
follows="left|top"
- height="16"
+ height="28"
control_name="EditLinkedParts"
label="Edit linked"
- layout="topleft"
- name="checkbox edit linked parts" >
+ layout="topleft"
+ name="checkbox edit linked parts"
+ top_pad="0">
<check_box.commit_callback
function="BuildTool.selectComponent"/>
</check_box>
@@ -270,7 +267,7 @@
left="13"
name="RenderingCost"
tool_tip="Shows the rendering cost calculated for this object"
- top_pad="9"
+ top_pad="2"
type="string"
width="100">
þ: [COUNT]
@@ -278,24 +275,35 @@
<check_box
control_name="ScaleUniform"
height="19"
- label="Stretch Both Sides"
+ label=""
layout="topleft"
left="143"
name="checkbox uniform"
top="50"
- width="134" />
+ width="20" />
+ <text
+ height="19"
+ label="Stretch Both Sides"
+ left="163"
+ name="checkbox uniform label"
+ top="55"
+ width="120"
+ wrap="true">
+ Stretch Both Sides
+ </text>
<check_box
control_name="ScaleStretchTextures"
height="19"
initial_value="true"
label="Stretch Textures"
layout="topleft"
+ left="143"
name="checkbox stretch textures"
- top_pad="0"
+ top_pad="7"
width="134" />
<check_box
control_name="SnapEnabled"
- height="20"
+ height="18"
initial_value="true"
label="Snap to grid"
layout="topleft"
@@ -308,6 +316,7 @@
follows="left|top"
name="combobox grid mode"
tool_tip="Choose the type of grid ruler for positioning the object"
+ top_pad="0"
width="108">
<combo_box.item
label="World grid"
@@ -335,7 +344,7 @@
top_delta="0"
right="-10"
width="18"
- height="19" >
+ height="23" >
<button.commit_callback
function="BuildTool.gridOptions"/>
</button>
@@ -347,7 +356,7 @@
image_selected="Object_Cube_Selected"
image_unselected="Object_Cube"
layout="topleft"
- left="4"
+ left="10"
name="ToolCube"
tool_tip="Cube"
top="51"
@@ -360,7 +369,7 @@
image_selected="Object_Prism_Selected"
image_unselected="Object_Prism"
layout="topleft"
- left_delta="26"
+ left_delta="29"
name="ToolPrism"
tool_tip="Prism"
top_delta="0"
@@ -373,7 +382,7 @@
image_selected="Object_Pyramid_Selected"
image_unselected="Object_Pyramid"
layout="topleft"
- left_delta="26"
+ left_delta="29"
name="ToolPyramid"
tool_tip="Pyramid"
top_delta="0"
@@ -386,7 +395,7 @@
image_selected="Object_Tetrahedron_Selected"
image_unselected="Object_Tetrahedron"
layout="topleft"
- left_delta="26"
+ left_delta="29"
name="ToolTetrahedron"
tool_tip="Tetrahedron"
top_delta="0"
@@ -399,7 +408,7 @@
image_selected="Object_Cylinder_Selected"
image_unselected="Object_Cylinder"
layout="topleft"
- left_delta="26"
+ left_delta="29"
name="ToolCylinder"
tool_tip="Cylinder"
top_delta="0"
@@ -412,7 +421,7 @@
image_selected="Object_Hemi_Cylinder_Selected"
image_unselected="Object_Hemi_Cylinder"
layout="topleft"
- left_delta="26"
+ left_delta="29"
name="ToolHemiCylinder"
tool_tip="Hemicylinder"
top_delta="0"
@@ -425,7 +434,7 @@
image_selected="Object_Cone_Selected"
image_unselected="Object_Cone"
layout="topleft"
- left_delta="26"
+ left_delta="29"
name="ToolCone"
tool_tip="Cone"
top_delta="0"
@@ -438,7 +447,7 @@
image_selected="Object_Hemi_Cone_Selected"
image_unselected="Object_Hemi_Cone"
layout="topleft"
- left_delta="26"
+ left_delta="29"
name="ToolHemiCone"
tool_tip="Hemicone"
top_delta="0"
@@ -451,7 +460,7 @@
image_selected="Object_Sphere_Selected"
image_unselected="Object_Sphere"
layout="topleft"
- left_delta="26"
+ left_delta="29"
name="ToolSphere"
tool_tip="Sphere"
top_delta="0"
@@ -464,7 +473,7 @@
image_selected="Object_Hemi_Sphere_Selected"
image_unselected="Object_Hemi_Sphere"
layout="topleft"
- left_delta="26"
+ left_delta="29"
name="ToolHemiSphere"
tool_tip="Hemisphere"
top_delta="0"
@@ -477,7 +486,7 @@
image_selected="Object_Torus_Selected"
image_unselected="Object_Torus"
layout="topleft"
- left="4"
+ left="10"
name="ToolTorus"
tool_tip="Torus"
top="77"
@@ -490,7 +499,7 @@
image_selected="Object_Tube_Selected"
image_unselected="Object_Tube"
layout="topleft"
- left_delta="26"
+ left_delta="29"
name="ToolTube"
tool_tip="Tube"
top_delta="0"
@@ -503,7 +512,7 @@
image_selected="Object_Ring_Selected"
image_unselected="Object_Ring"
layout="topleft"
- left_delta="26"
+ left_delta="29"
name="ToolRing"
tool_tip="Ring"
top_delta="0"
@@ -516,7 +525,7 @@
image_selected="Object_Tree_Selected"
image_unselected="Object_Tree"
layout="topleft"
- left_delta="26"
+ left_delta="29"
name="ToolTree"
tool_tip="Tree"
top_delta="0"
@@ -530,7 +539,7 @@
image_unselected="Object_Grass"
image_overlay_color="Red"
layout="topleft"
- left_delta="26"
+ left_delta="29"
name="ToolGrass"
tool_tip="Grass"
top_delta="0"
@@ -585,8 +594,8 @@
layout="topleft"
left="0"
name="radio select land"
- top="-1"
- width="114" />
+ top="-106"
+ width="134" />
<radio_item
height="19"
label="Flatten"
@@ -644,7 +653,7 @@
follows="left|top"
height="12"
layout="topleft"
- left="125"
+ left="135"
name="Bulldozer:"
top="57"
width="100">
@@ -702,7 +711,7 @@
</slider_bar>
<button
follows="left|top"
- height="19"
+ height="23"
label="Apply"
label_selected="Apply"
top_pad="5"
@@ -710,7 +719,7 @@
left="135"
name="button apply to selection"
tool_tip="Modify selected land"
- width="78">
+ width="82">
<button.commit_callback
function="BuildTool.applyToSelection"/>
</button>
@@ -718,13 +727,13 @@
text_color="LtGray_50"
type="string"
length="1"
- height="12"
+ height="10"
follows="left|top"
halign="right"
layout="topleft"
right="-10"
name="obj_count"
- top_pad="6"
+ top_pad="5"
width="143">
Objects: [COUNT]
</text>
@@ -742,16 +751,16 @@
</text>
<tab_container
follows="left|top"
- height="400"
+ height="410"
halign="center"
left="0"
name="Object Info Tabs"
- tab_max_width="54"
+ tab_max_width="100"
tab_min_width="40"
tab_position="top"
tab_height="25"
top="170"
- width="280">
+ width="295">
<panel
border="false"
follows="all"
@@ -761,8 +770,8 @@
help_topic="toolbox_general_tab"
name="General"
top="16"
- width="280">
- <panel.string
+ width="295">
+<panel.string
name="text deed continued">
Deed
</panel.string>
@@ -927,13 +936,13 @@
width="150" />
<button
follows="top|left"
- height="20"
+ height="23"
label="Deed"
label_selected="Deed"
layout="topleft"
name="button deed"
top_pad="0"
- left="100"
+ left="108"
tool_tip="Deeding gives this item away with next owner permissions. Group shared objects can be deeded by a group officer."
width="80" />
<check_box
@@ -954,12 +963,12 @@
top_pad="15"
left="10"
name="label click action"
- width="90">
+ width="98">
Click to:
</text>
<combo_box
follows="left|top"
- height="20"
+ height="23"
layout="topleft"
name="clickaction"
width="168"
@@ -990,25 +999,24 @@
value="Zoom" />
</combo_box>
<check_box
- height="16"
- top_pad="15"
+ height="23"
label="For Sale:"
layout="topleft"
name="checkbox for sale"
- left="10"
- width="90" />
+ left="7"
+ width="100" />
<!-- NEW SALE TYPE COMBO BOX -->
<combo_box
left_pad="0"
layout="topleft"
follows="left|top"
allow_text_entry="false"
- height="20"
+ height="23"
intial_value="2"
max_chars="20"
mouse_opaque="true"
name="sale type"
- width="158">
+ width="168">
<combo_box.item
name="Copy"
label="Copy"
@@ -1031,19 +1039,19 @@ even though the user gets a free copy.
decimal_digits="0"
increment="1"
top_pad="8"
- left="100"
+ left="108"
control_name="Edit Cost"
name="Edit Cost"
label="Price: L$"
label_width="65"
- width="150"
+ width="165"
min_val="0"
height="20"
max_val="999999999" />
<check_box
height="15"
width="110"
- top_pad="3"
+ top_pad="5"
label="Show in search"
layout="topleft"
left="100"
@@ -1059,8 +1067,8 @@ even though the user gets a free copy.
name="perms_build"
left="0"
top="241"
- height="120"
- width="278">
+ height="130"
+ width="290">
<text
type="string"
length="1"
@@ -1087,7 +1095,7 @@ even though the user gets a free copy.
label="Move"
layout="topleft"
name="checkbox allow everyone move"
- left="15"
+ left="10"
width="85" />
<check_box
height="19"
@@ -1109,7 +1117,7 @@ even though the user gets a free copy.
follows="left|top|right"
label="Modify"
layout="topleft"
- left="15"
+ left="10"
name="checkbox next owner can modify"
width="85" />
<check_box
@@ -1119,7 +1127,7 @@ even though the user gets a free copy.
layout="topleft"
left_pad="0"
name="checkbox next owner can copy"
- width="90" />
+ width="80" />
<check_box
follows="left|top|right"
height="19"
@@ -1129,7 +1137,7 @@ even though the user gets a free copy.
left_pad="0"
top_delta="0"
tool_tip="Next owner can give away or resell this object"
- width="90" />
+ width="100" />
<text
type="string"
text_color="EmphasisColor"
@@ -1140,7 +1148,7 @@ even though the user gets a free copy.
left="10"
name="B:"
height="10"
- width="45">
+ width="80">
B:
</text>
<text
@@ -1152,7 +1160,7 @@ even though the user gets a free copy.
left_pad="0"
name="O:"
height="10"
- width="44">
+ width="80">
O:
</text>
<text
@@ -1164,7 +1172,7 @@ even though the user gets a free copy.
left_pad="0"
name="G:"
height="10"
- width="43">
+ width="80">
G:
</text>
<text
@@ -1172,11 +1180,12 @@ even though the user gets a free copy.
text_color="White"
length="1"
follows="left|top"
- left_pad="0"
+ left="10"
+ top_pad="2"
layout="topleft"
name="E:"
height="10"
- width="43">
+ width="80">
E:
</text>
<text
@@ -1188,7 +1197,7 @@ even though the user gets a free copy.
left_pad="0"
name="N:"
height="10"
- width="48">
+ width="80">
N:
</text>
<text
@@ -1200,7 +1209,7 @@ even though the user gets a free copy.
left_pad="0"
name="F:"
height="10"
- width="50">
+ width="80">
F:
</text>
</panel>
@@ -1216,7 +1225,7 @@ even though the user gets a free copy.
help_topic="toolbox_object_tab"
name="Object"
top="16"
- width="280">
+ width="295">
<check_box
height="19"
label="Locked"
@@ -1557,7 +1566,7 @@ even though the user gets a free copy.
layout="topleft"
left="125"
name="text hollow"
- top_pad="5"
+ top_pad="6"
width="68">
Hollow
</text>
@@ -1605,16 +1614,16 @@ even though the user gets a free copy.
layout="topleft"
left="125"
name="Hollow Shape"
- top_pad="0"
+ top_pad="4"
width="150">
Hollow Shape
</text>
<combo_box
- height="19"
+ height="23"
layout="topleft"
left_delta="0"
name="hole"
- top_pad="3"
+ top_pad="-2"
width="150">
<combo_box.item
label="Default"
@@ -1886,7 +1895,7 @@ even though the user gets a free copy.
layout="topleft"
left="125"
name="text radius delta"
- top_pad="0"
+ top_pad="2"
width="78">
Radius
</text>
@@ -2003,7 +2012,6 @@ even though the user gets a free copy.
value="Cylinder" />
</combo_box>
</panel>
-
<panel
border="false"
follows="all"
@@ -2015,7 +2023,7 @@ even though the user gets a free copy.
help_topic="toolbox_features_tab"
name="Features"
top_delta="0"
- width="280">
+ width="295">
<text
type="string"
length="1"
@@ -2055,7 +2063,7 @@ even though the user gets a free copy.
increment="1"
initial_value="2"
label="Softness"
- label_width="65"
+ label_width="70"
layout="topleft"
left_delta="0"
max_val="3"
@@ -2068,7 +2076,7 @@ even though the user gets a free copy.
increment="0.5"
initial_value="0.3"
label="Gravity"
- label_width="65"
+ label_width="70"
layout="topleft"
left_delta="0"
max_val="10"
@@ -2082,7 +2090,7 @@ even though the user gets a free copy.
increment="0.5"
initial_value="2"
label="Drag"
- label_width="65"
+ label_width="70"
layout="topleft"
left_delta="0"
max_val="10"
@@ -2095,7 +2103,7 @@ even though the user gets a free copy.
increment="0.5"
initial_value="0"
label="Wind"
- label_width="65"
+ label_width="70"
layout="topleft"
left_delta="0"
max_val="10"
@@ -2108,7 +2116,7 @@ even though the user gets a free copy.
increment="0.5"
initial_value="1"
label="Tension"
- label_width="65"
+ label_width="70"
layout="topleft"
left_delta="0"
max_val="10"
@@ -2121,7 +2129,7 @@ even though the user gets a free copy.
increment="0.01"
initial_value="0"
label="Force X"
- label_width="65"
+ label_width="70"
layout="topleft"
left_delta="0"
max_val="10"
@@ -2135,7 +2143,7 @@ even though the user gets a free copy.
increment="0.01"
initial_value="0"
label="Force Y"
- label_width="65"
+ label_width="70"
layout="topleft"
left_delta="0"
max_val="10"
@@ -2149,7 +2157,7 @@ even though the user gets a free copy.
increment="0.01"
initial_value="0"
label="Force Z"
- label_width="65"
+ label_width="70"
layout="topleft"
left_delta="0"
max_val="10"
@@ -2253,7 +2261,7 @@ even though the user gets a free copy.
help_topic="toolbox_texture_tab"
name="Texture"
top_delta="0"
- width="280">
+ width="295">
<panel.string
name="string repeats per meter">
Repeats Per Meter
@@ -2317,7 +2325,7 @@ even though the user gets a free copy.
layout="topleft"
left_delta="0"
name="glow label"
- top_pad="2"
+ top_pad="8"
width="80">
Glow
</text>
@@ -2335,7 +2343,7 @@ even though the user gets a free copy.
height="19"
label="Full Bright"
layout="topleft"
- left_delta="0"
+ left_delta="-5"
name="checkbox fullbright"
top_pad="4"
width="81" />
@@ -2348,7 +2356,7 @@ even though the user gets a free copy.
left="10"
name="tex gen"
top_pad="5"
- width="85">
+ width="90">
Mapping
</text>
<combo_box
@@ -2357,7 +2365,7 @@ even though the user gets a free copy.
left_delta="0"
name="combobox texgen"
top_pad="4"
- width="85">
+ width="90">
<combo_box.item
label="Default"
name="Default"
@@ -2376,7 +2384,7 @@ even though the user gets a free copy.
name="label shininess"
left_pad="4"
top_pad="-36"
- width="85">
+ width="90">
Shininess
</text>
<combo_box
@@ -2385,7 +2393,7 @@ even though the user gets a free copy.
left_delta="0"
name="combobox shininess"
top_pad="4"
- width="85">
+ width="90">
<combo_box.item
label="None"
name="None"
@@ -2412,7 +2420,7 @@ even though the user gets a free copy.
left_pad="4"
name="label bumpiness"
top_pad="-36"
- width="85">
+ width="90">
Bumpiness
</text>
<combo_box
@@ -2421,7 +2429,7 @@ even though the user gets a free copy.
left_delta="0"
name="combobox bumpiness"
top_pad="4"
- width="85">
+ width="90">
<combo_box.item
label="None"
name="None"
@@ -2537,7 +2545,7 @@ even though the user gets a free copy.
layout="topleft"
left="10"
name="tex scale"
- top_pad="5"
+ top_pad="4"
width="200">
Repeats / Face
</text>
@@ -2546,18 +2554,18 @@ even though the user gets a free copy.
height="19"
initial_value="0"
label="Horizontal (U)"
- label_width="90"
+ label_width="125"
layout="topleft"
left="20"
max_val="100"
name="TexScaleU"
top_pad="6"
- width="160" />
+ width="185" />
<check_box
height="19"
label="Flip"
layout="topleft"
- left_pad="10"
+ left_pad="5"
name="checkbox flip s"
top_delta="0"
width="70" />
@@ -2566,22 +2574,20 @@ even though the user gets a free copy.
height="19"
initial_value="0"
label="Vertical (V)"
- label_width="90"
+ label_width="125"
layout="topleft"
left="20"
max_val="100"
name="TexScaleV"
- top_pad="0"
- width="160" />
+ width="185" />
<check_box
height="19"
label="Flip"
layout="topleft"
- left_pad="10"
+ left_pad="5"
name="checkbox flip t"
top_delta="0"
width="70" />
-
<spinner
decimal_digits="2"
follows="left|top"
@@ -2590,35 +2596,33 @@ even though the user gets a free copy.
initial_value="0"
label="RotationËš"
layout="topleft"
- label_width="100"
+ label_width="135"
left="10"
max_val="9999"
min_val="-9999"
name="TexRot"
- top_delta="25"
- width="170" />
+ width="195" />
<spinner
decimal_digits="1"
follows="left|top"
- height="19"
+ height="23"
initial_value="1"
label="Repeats / Meter"
layout="topleft"
- label_width="100"
+ label_width="135"
left="10"
max_val="10"
min_val="0.1"
name="rptctrl"
- top_delta="20"
- width="170" />
+ width="195" />
<button
follows="left|top"
height="23"
label="Apply"
label_selected="Apply"
layout="topleft"
- left_pad="10"
+ left_pad="5"
name="button apply"
width="75" />
<text
@@ -2629,7 +2633,6 @@ even though the user gets a free copy.
layout="topleft"
left="10"
name="tex offset"
- top_delta="20"
width="200">
Texture Offset
</text>
@@ -2638,25 +2641,24 @@ even though the user gets a free copy.
height="19"
initial_value="0"
label="Horizontal (U)"
- label_width="90"
+ label_width="125"
layout="topleft"
left="20"
min_val="-1"
name="TexOffsetU"
- top_pad="6"
- width="160" />
+ width="185" />
<spinner
follows="left|top"
height="19"
initial_value="0"
label="Vertical (V)"
- label_width="90"
+ label_width="125"
layout="topleft"
left_delta="0"
min_val="-1"
name="TexOffsetV"
top_pad="1"
- width="160" />
+ width="185" />
<panel
border="false"
follows="left|top"
@@ -2666,30 +2668,20 @@ even though the user gets a free copy.
bg_alpha_color="DkGray"
name="Add_Media"
left="0"
- top_pad="0"
- height="75"
- width="278">
+ height="63"
+ width="290">
<text
type="string"
length="1"
follows="left|top"
- height="12"
+ height="18"
layout="topleft"
left="10"
- top_pad="5"
+ top_pad="3"
name="media_tex"
- width="260">
+ width="190">
Media
</text>
- <text
- follows="left|top|right"
- height="18"
- layout="topleft"
- left="10"
- use_ellipses="true"
- read_only="true"
- name="media_info"
- width="180" />
<button
follows="top|left"
height="18"
@@ -2723,18 +2715,27 @@ even though the user gets a free copy.
<button
follows="top|left"
tool_tip="Edit this Media"
- height="18"
- image_disabled="OptionsMenu_Disabled"
- image_selected="OptionsMenu_Press"
- image_unselected="OptionsMenu_Off"
+ height="12"
+ image_disabled="Icon_Gear_Foreground"
+ image_selected="Icon_Gear_Background"
+ image_unselected="Icon_Gear_Press"
layout="topleft"
left_pad="10"
name="edit_media"
- top_delta="0"
- width="18">
+ top_delta="3"
+ width="12">
<button.commit_callback
function="BuildTool.EditMedia"/>
</button>
+ <text
+ follows="left|top|right"
+ height="9"
+ layout="topleft"
+ left="10"
+ use_ellipses="true"
+ read_only="true"
+ name="media_info"
+ width="280" />
<web_browser
visible="false"
enabled="false"
@@ -2748,16 +2749,15 @@ even though the user gets a free copy.
start_url="about:blank"
decouple_texture_size="true" />
<button
- follows="left|top"
- height="23"
+ follows="right|top"
+ height="22"
label="Align"
label_selected="Align Media"
layout="topleft"
- left="10"
+ right="-10"
name="button align"
- top_pad="5"
tool_tip="Align media texture (must load first)"
- width="100" />
+ width="80" />
</panel>
</panel>
<panel
@@ -2770,33 +2770,36 @@ even though the user gets a free copy.
help_topic="toolbox_contents_tab"
name="Contents"
top_delta="0"
- width="280">
+ width="295">
<button
follows="left|top"
- height="19"
+ height="23"
label="New Script"
label_selected="New Script"
layout="topleft"
left="10"
name="button new script"
top="10"
- width="120" />
+ width="134" />
<button
follows="left|top"
- height="19"
+ height="23"
label="Permissions"
layout="topleft"
left_pad="8"
name="button permissions"
- width="130" />
+ width="134" />
<panel_inventory_object
- follows="left|top"
+ border="true"
+ border_visible="true"
+ bevel_style="in"
+ follows="left|top|right"
height="325"
layout="topleft"
left="10"
name="contents_inventory"
top="50"
- width="260" />
+ width="275" />
</panel>
</tab_container>
<panel
@@ -2806,7 +2809,7 @@ even though the user gets a free copy.
left_delta="0"
name="land info panel"
top_delta="0"
- width="280">
+ width="295">
<text
type="string"
length="1"
@@ -2817,7 +2820,7 @@ even though the user gets a free copy.
left="20"
name="label_parcel_info"
top="24"
- width="150">
+ width="240">
Parcel Information
</text>
<text
@@ -2846,14 +2849,14 @@ even though the user gets a free copy.
</text>
<button
follows="left|top"
- height="20"
+ height="23"
label="About Land"
label_selected="About Land"
layout="topleft"
left_delta="0"
name="button about land"
top_pad="4"
- width="112" />
+ width="125" />
<check_box
control_name="ShowParcelOwners"
height="19"
@@ -2874,29 +2877,29 @@ even though the user gets a free copy.
left="20"
name="label_parcel_modify"
top="152"
- width="150">
+ width="240">
Modify Parcel
</text>
<button
follows="left|top"
- height="20"
+ height="23"
label="Subdivide"
label_selected="Subdivide"
layout="topleft"
left="30"
name="button subdivide land"
top="172"
- width="112" />
+ width="125" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Join"
label_selected="Join"
layout="topleft"
left_delta="0"
name="button join land"
top_pad="4"
- width="112" />
+ width="125" />
<text
type="string"
length="1"
@@ -2907,28 +2910,28 @@ even though the user gets a free copy.
left="20"
name="label_parcel_trans"
top="256"
- width="150">
+ width="240">
Land Transactions
</text>
<button
follows="left|top"
- height="20"
+ height="23"
label="Buy Land"
label_selected="Buy Land"
layout="topleft"
left="30"
name="button buy land"
top="276"
- width="112" />
+ width="125" />
<button
follows="left|top"
- height="20"
+ height="23"
label="Abandon Land"
label_selected="Abandon Land"
layout="topleft"
left_delta="0"
name="button abandon land"
top_pad="4"
- width="112" />
+ width="125" />
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_tos.xml b/indra/newview/skins/default/xui/en/floater_tos.xml
index 5e168fe4aa..cbfaac958b 100644
--- a/indra/newview/skins/default/xui/en/floater_tos.xml
+++ b/indra/newview/skins/default/xui/en/floater_tos.xml
@@ -11,6 +11,10 @@
name="real_url">
http://secondlife.com/app/tos/
</floater.string>
+ <floater.string
+ name="loading_url">
+ data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+ </floater.string>
<button
enabled="false"
height="20"
@@ -33,7 +37,7 @@
<check_box
follows="top|right"
height="16"
- label="I Agree to the Terms of Service"
+ label="I Agree to the Terms of Service and Privacy Policy"
layout="topleft"
left_delta="0"
name="agree_chk"
@@ -51,7 +55,7 @@
top_delta="-399"
word_wrap="true"
width="552">
- Please read the following Terms of Service carefully. To continue logging in to [SECOND_LIFE], you must accept the agreement.
+ Please read the following Terms of Service and Privacy Policy carefully. To continue logging in to [SECOND_LIFE], you must accept the agreement.
</text>
<web_browser
follows="left|top"
@@ -59,7 +63,6 @@
layout="topleft"
left_delta="0"
name="tos_html"
- start_url="data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E"
top_delta="40"
width="568" />
</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_ui_preview.xml b/indra/newview/skins/default/xui/en/floater_ui_preview.xml
index e86cb23c1e..3b10a57c50 100644
--- a/indra/newview/skins/default/xui/en/floater_ui_preview.xml
+++ b/indra/newview/skins/default/xui/en/floater_ui_preview.xml
@@ -112,7 +112,7 @@
layout="topleft"
left_pad="15"
name="toggle_overlap_panel"
- tool_tip="Toggle highlighting and display panel for overlapping elements; right click an element to select it for this feature. The selected element is marked by a red rectangle."
+ tool_tip="Toggle highlighting and display panel for overlapping elements; right-click an element to select it for this feature. The selected element is marked by a red rectangle."
top_delta="0"
width="30" />
<text
@@ -238,7 +238,6 @@
border_thickness="1"
follows="left|bottom"
font="SansSerif"
- handle_edit_keys_directly="true"
height="20"
layout="topleft"
left_delta="100"
@@ -278,7 +277,6 @@
border_thickness="1"
follows="left|bottom"
font="SansSerif"
- handle_edit_keys_directly="true"
height="20"
layout="topleft"
left_delta="100"
@@ -320,7 +318,6 @@
border_thickness="1"
follows="left|bottom"
font="SansSerif"
- handle_edit_keys_directly="true"
height="20"
layout="topleft"
left_delta="65"
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 c4411db8c5..bf5bd87ad6 100644
--- a/indra/newview/skins/default/xui/en/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/en/floater_voice_controls.xml
@@ -3,14 +3,16 @@
can_resize="true"
can_minimize="true"
can_close="false"
- height="202"
+ height="205"
layout="topleft"
min_height="124"
min_width="190"
name="floater_voice_controls"
help_topic="floater_voice_controls"
title="Voice Controls"
+ save_dock_state="true"
save_visibility="true"
+ save_rect="true"
single_instance="true"
width="282">
<string
@@ -45,10 +47,10 @@
width="263">
<layout_panel
follows="top|left|right"
- user_resize="false"
- auto_resize="false"
+ user_resize="false"
+ auto_resize="false"
layout="topleft"
- height="26"
+ height="20"
name="my_panel">
<avatar_icon
enabled="false"
@@ -70,7 +72,7 @@
text_color="white"
top="4"
use_ellipses="true"
- value="Mya Avatar:"
+ value="My Avatar:"
width="210" />
<output_monitor
auto_update="true"
@@ -84,29 +86,44 @@
visible="true"
width="20" />
</layout_panel>
- <layout_panel
- auto_resize="false"
- user_resize="false"
- follows="top|left"
- height="26"
- visible="true"
- layout="topleft"
- name="leave_call_btn_panel"
- width="100">
- <button
- follows="right|top"
- height="23"
- top_pad="0"
- label="Leave Call"
- name="leave_call_btn"
- width="100" />
- </layout_panel>
+ <layout_stack
+ clip="true"
+ auto_resize="false"
+ follows="left|top|right"
+ height="26"
+ layout="topleft"
+ mouse_opaque="false"
+ name="voice_effect_and_leave_call_stack"
+ orientation="horizontal"
+ width="262">
+ <panel
+ class="panel_voice_effect"
+ name="panel_voice_effect"
+ visiblity_control="VoiceMorphingEnabled"
+ filename="panel_voice_effect.xml" />
+ <layout_panel
+ auto_resize="false"
+ user_resize="false"
+ follows="top|right"
+ height="23"
+ visible="true"
+ layout="topleft"
+ name="leave_call_btn_panel"
+ width="100">
+ <button
+ follows="right|top"
+ height="23"
+ label="Leave Call"
+ name="leave_call_btn"
+ width="100" />
+ </layout_panel>
+ </layout_stack>
<layout_panel
follows="all"
layout="topleft"
left="2"
top_pad="0"
- height="132"
+ height="132"
name="callers_panel"
user_resize="false"
width="280">
diff --git a/indra/newview/skins/default/xui/en/floater_voice_effect.xml b/indra/newview/skins/default/xui/en/floater_voice_effect.xml
new file mode 100644
index 0000000000..9bf9cc6c77
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/floater_voice_effect.xml
@@ -0,0 +1,115 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<floater
+ legacy_header_height="27"
+ can_resize="true"
+ height="500"
+ name="voice_effects"
+ help_topic="voice_effects"
+ title="VOICE MORPHING"
+ background_visible="true"
+ follows="all"
+ label="Places"
+ layout="topleft"
+ min_height="360"
+ min_width="200"
+ width="300">
+ <string name="no_voice_effect">
+ (No Voice Morph)
+ </string>
+ <string name="active_voice_effect">
+ (Active)
+ </string>
+ <string name="unsubscribed_voice_effect">
+ (Unsubscribed)
+ </string>
+ <string name="new_voice_effect">
+ (New!)
+ </string>
+ <text
+ height="16"
+ word_wrap="true"
+ use_ellipses="true"
+ type="string"
+ follows="left|top|right"
+ layout="topleft"
+ font="SansSerifBold"
+ color="White"
+ left="10"
+ name="preview_text"
+ right="-10"
+ top="27">To Preview
+ </text>
+ <text
+ height="23"
+ word_wrap="true"
+ use_ellipses="true"
+ type="string"
+ follows="left|top|right"
+ layout="topleft"
+ left="10"
+ name="status_text"
+ right="-5"
+ top_pad="0">
+Record a sample, then click on a voice to hear how it will sound.
+ </text>
+ <button
+ follows="left|top"
+ height="23"
+ label="Record"
+ layout="topleft"
+ left="10"
+ name="record_btn"
+ tool_tip="Record a sample of your voice."
+ top_pad="5"
+ width="100">
+ <button.commit_callback
+ function="VoiceEffect.Record" />
+ </button>
+ <button
+ follows="left|top"
+ height="23"
+ label="Stop"
+ layout="topleft"
+ left_delta="0"
+ name="record_stop_btn"
+ top_delta="0"
+ width="100">
+ <button.commit_callback
+ function="VoiceEffect.Stop" />
+ </button>
+ <text
+ height="23"
+ halign="right"
+ use_ellipses="true"
+ type="string"
+ follows="left|top|right"
+ layout="topleft"
+ left_pad="10"
+ top_delta="10"
+ name="voice_morphing_link"
+ right="-10">
+ [[URL] Subscribe Now]
+ </text>
+ <scroll_list
+ bottom="-10"
+ draw_heading="true"
+ follows="all"
+ layout="topleft"
+ left="10"
+ multi_select="false"
+ name="voice_effect_list"
+ right="-10"
+ tool_tip="Record a sample of your voice, then click an effect to preview."
+ top="95">
+ <scroll_list.columns
+ label="Voice Name"
+ name="name"
+ relative_width="0.60" />
+ <scroll_list.columns
+ dynamic_width="true"
+ label="Expires"
+ name="expires"
+ relative_width="0.30" />
+ </scroll_list>
+
+</floater>
diff --git a/indra/newview/skins/default/xui/en/floater_water.xml b/indra/newview/skins/default/xui/en/floater_water.xml
index 32739ac953..3a44ba3763 100644
--- a/indra/newview/skins/default/xui/en/floater_water.xml
+++ b/indra/newview/skins/default/xui/en/floater_water.xml
@@ -16,49 +16,49 @@
type="string"
length="1"
follows="left|top|right"
- font.style="BOLD"
height="16"
layout="topleft"
left="10"
name="KeyFramePresetsText"
top="34"
- width="110">
+ font="SansSerif"
+ width="85">
Water Presets:
</text>
<combo_box
- height="18"
+ height="23"
layout="topleft"
- left_pad="10"
+ left_delta="95"
name="WaterPresetsCombo"
- top_delta="-2"
+ top_delta="-4"
width="150" />
<button
- height="20"
+ height="23"
label="New"
label_selected="New"
layout="topleft"
- left_pad="20"
+ left_pad="3"
name="WaterNewPreset"
- top_delta="1"
- width="90" />
+ top_delta="0"
+ width="70" />
<button
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
- left_pad="10"
+ left_pad="3"
name="WaterSavePreset"
top_delta="0"
- width="90" />
+ width="70" />
<button
- height="20"
+ height="23"
label="Delete"
label_selected="Delete"
layout="topleft"
- left_pad="10"
+ left_pad="3"
name="WaterDeletePreset"
top_delta="0"
- width="90" />
+ width="70" />
<tab_container
border="false"
follows="left|top"
@@ -74,7 +74,7 @@
border="true"
follows="all"
height="180"
- label="Settings"
+ label="SETTINGS"
layout="topleft"
left="0"
mouse_opaque="false"
@@ -331,7 +331,7 @@
border="true"
follows="all"
height="180"
- label="Image"
+ label="IMAGE"
layout="topleft"
left="0"
mouse_opaque="false"
@@ -348,7 +348,7 @@
layout="topleft"
left="10"
name="BHText"
- top="10"
+ top="4"
width="200">
Big Wave Direction
</text>
@@ -361,23 +361,10 @@
layout="topleft"
left="10"
name="WaterWave1DirXText"
- top_pad="4"
+ top_pad="5"
width="10">
X
</text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="0"
- name="WaterWave1DirYText"
- top_delta="18"
- width="10">
- Y
- </text>
<slider
control_name="WaterWave1DirX"
decimal_digits="2"
@@ -390,8 +377,22 @@
max_val="4"
min_val="-4"
name="WaterWave1DirX"
- top="55"
+ left_pad="3"
+ top_pad="6"
width="200" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ halign="center"
+ height="16"
+ layout="topleft"
+ left_delta="-13"
+ name="WaterWave1DirYText"
+ top_pad="-15"
+ width="10">
+ Y
+ </text>
<slider
control_name="WaterWave1DirY"
decimal_digits="2"
@@ -404,7 +405,8 @@
max_val="4"
min_val="-4"
name="WaterWave1DirY"
- top_pad="5"
+ left_pad="3"
+ top_pad="6"
width="200" />
<text
type="string"
@@ -413,9 +415,9 @@
font="SansSerif"
height="16"
layout="topleft"
- left_delta="-14"
+ left_delta="-13"
name="BHText2"
- top_delta="3"
+ top_pad="-10"
width="355">
Little Wave Direction
</text>
@@ -427,24 +429,12 @@
height="16"
layout="topleft"
left="10"
+ left_delta="0"
name="WaterWave2DirXText"
- top="90"
+ top_pad="5"
width="10">
X
</text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="0"
- name="WaterWave2DirYText"
- top_delta="20"
- width="10">
- Y
- </text>
<slider
control_name="WaterWave2DirX"
decimal_digits="2"
@@ -457,8 +447,22 @@
max_val="4"
min_val="-4"
name="WaterWave2DirX"
- top="115"
+ left_pad="3"
+ top_pad="6"
width="200" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ halign="center"
+ height="16"
+ layout="topleft"
+ left_delta="-13"
+ name="WaterWave2DirYText"
+ top_pad="-15"
+ width="10">
+ Y
+ </text>
<slider
control_name="WaterWave2DirY"
decimal_digits="2"
@@ -471,7 +475,8 @@
max_val="4"
min_val="-4"
name="WaterWave2DirY"
- top_pad="10"
+ left_pad="3"
+ top_pad="6"
width="200" />
<text
type="string"
diff --git a/indra/newview/skins/default/xui/en/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/en/floater_wearable_save_as.xml
index b4b57f2dbc..71812bd1a6 100644
--- a/indra/newview/skins/default/xui/en/floater_wearable_save_as.xml
+++ b/indra/newview/skins/default/xui/en/floater_wearable_save_as.xml
@@ -44,7 +44,6 @@
border_style="line"
border_thickness="1"
follows="left|top"
- handle_edit_keys_directly="true"
height="23"
layout="topleft"
left_delta="0"
diff --git a/indra/newview/skins/default/xui/en/floater_windlight_options.xml b/indra/newview/skins/default/xui/en/floater_windlight_options.xml
index 0cb7814c6a..85a5be369c 100644
--- a/indra/newview/skins/default/xui/en/floater_windlight_options.xml
+++ b/indra/newview/skins/default/xui/en/floater_windlight_options.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- height="220"
+ height="256"
layout="topleft"
name="WindLight floater"
help_topic="windlight_floater"
@@ -22,68 +22,64 @@
left="10"
name="KeyFramePresetsText"
top="34"
- width="110">
+ width="85">
Sky Presets:
</text>
<combo_box
- height="18"
+ height="23"
layout="topleft"
- left_delta="110"
+ left_delta="85"
name="WLPresetsCombo"
- top_delta="-2"
+ top_delta="-4"
width="150" />
<button
- height="20"
+ height="23"
label="New"
label_selected="New"
layout="topleft"
- left_pad="20"
+ left_pad="3"
name="WLNewPreset"
- top_delta="1"
width="70" />
<button
- height="20"
+ height="23"
label="Save"
label_selected="Save"
layout="topleft"
- left_pad="10"
+ left_pad="3"
name="WLSavePreset"
- top_delta="0"
width="70" />
<button
- height="20"
+ height="23"
label="Delete"
label_selected="Delete"
layout="topleft"
- left_pad="10"
+ left_pad="3"
name="WLDeletePreset"
- top_delta="0"
width="70" />
<button
- height="20"
+ height="23"
label="Day Cycle Editor"
label_selected="Day Cycle Editor"
layout="topleft"
- left_pad="50"
+ right="-10"
name="WLDayCycleMenuButton"
- top_delta="0"
+ top_pad="-23"
width="120" />
<tab_container
follows="left|top"
- height="160"
+ height="196"
halign="center"
layout="topleft"
left="0"
name="WindLight Tabs"
tab_position="top"
- tab_height="20"
top="60"
width="700">
<panel
border="true"
follows="left|top|right|bottom"
- height="160"
- label="Atmosphere"
+ height="196"
+ label="ATMOSPHERE"
layout="topleft"
left="1"
mouse_opaque="false"
@@ -113,10 +109,22 @@
layout="topleft"
left="10"
name="BHText2"
- top="21"
+ top_pad="5"
width="10">
R
</text>
+ <slider
+ control_name="WLBlueHorizonR"
+ decimal_digits="2"
+ follows="left"
+ height="10"
+ increment="0.01"
+ initial_value="0.7"
+ layout="topleft"
+ left_pad="3"
+ top_pad="6"
+ name="WLBlueHorizonR"
+ width="200" />
<text
type="string"
length="1"
@@ -124,12 +132,25 @@
halign="center"
height="16"
layout="topleft"
- left_delta="0"
+ left="10"
+ top_pad="-15"
name="BHText3"
- top_delta="11"
width="10">
G
</text>
+ <slider
+ control_name="WLBlueHorizonG"
+ decimal_digits="2"
+ follows="left"
+ height="10"
+ increment="0.01"
+ initial_value="0.7"
+ layout="topleft"
+ left_delta="0"
+ name="WLBlueHorizonG"
+ left_pad="3"
+ top_pad="6"
+ width="200" />
<text
type="string"
length="1"
@@ -137,12 +158,24 @@
halign="center"
height="16"
layout="topleft"
- left_delta="0"
name="BHText4"
- top_delta="11"
+ left="10"
+ top_pad="-15"
width="10">
B
</text>
+ <slider
+ control_name="WLBlueHorizonB"
+ decimal_digits="2"
+ follows="left"
+ height="10"
+ increment="0.01"
+ initial_value="0.7"
+ layout="topleft"
+ name="WLBlueHorizonB"
+ left_pad="3"
+ top_pad="6"
+ width="200" />
<text
type="string"
length="1"
@@ -150,49 +183,13 @@
halign="center"
height="16"
layout="topleft"
- left_delta="0"
name="BHText5"
- top_delta="11"
+ left="10"
+ top_pad="-15"
width="10">
I
</text>
<slider
- control_name="WLBlueHorizonR"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left="24"
- name="WLBlueHorizonR"
- top="40"
- width="200" />
- <slider
- control_name="WLBlueHorizonG"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_delta="0"
- name="WLBlueHorizonG"
- top_pad="1"
- width="200" />
- <slider
- control_name="WLBlueHorizonB"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left_delta="0"
- name="WLBlueHorizonB"
- top_pad="1"
- width="200" />
- <slider
control_name="WLBlueHorizonI"
decimal_digits="2"
follows="left"
@@ -200,9 +197,9 @@
increment="0.01"
initial_value="1.0"
layout="topleft"
- left_delta="0"
name="WLBlueHorizonI"
- top_pad="1"
+ left_pad="3"
+ top_pad="6"
width="200" />
<text
type="string"
@@ -211,9 +208,9 @@
font="SansSerif"
height="16"
layout="topleft"
- left_delta="-14"
+ left="10"
+ top_pad="-10"
name="BDensText"
- top_delta="-2"
width="355">
Haze Horizon
</text>
@@ -225,9 +222,10 @@
increment="0.01"
initial_value="0.25"
layout="topleft"
- left="24"
+ left="23"
+ top_delta="0"
+ top_pad="27"
name="WLHazeHorizon"
- top="107"
width="200" />
<text
type="string"
@@ -251,10 +249,22 @@
layout="topleft"
left="245"
name="BHText6"
- top="21"
+ top_pad="5"
width="10">
R
</text>
+ <slider
+ control_name="WLBlueDensityR"
+ decimal_digits="2"
+ follows="left"
+ height="10"
+ increment="0.01"
+ initial_value="0.7"
+ layout="topleft"
+ left_pad="3"
+ top_pad="6"
+ name="WLBlueDensityR"
+ width="200" />
<text
type="string"
length="1"
@@ -262,50 +272,12 @@
halign="center"
height="16"
layout="topleft"
- left_delta="0"
+ left="245"
name="BHText7"
- top_delta="11"
+ top_pad="-15"
width="10">
G
</text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="0"
- name="BHText8"
- top_delta="11"
- width="10">
- B
- </text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="0"
- name="BHText9"
- top_delta="11"
- width="10">
- I
- </text>
- <slider
- control_name="WLBlueDensityR"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left="259"
- name="WLBlueDensityR"
- top="40"
- width="200" />
<slider
control_name="WLBlueDensityG"
decimal_digits="2"
@@ -316,8 +288,22 @@
layout="topleft"
left_delta="0"
name="WLBlueDensityG"
- top_pad="1"
+ left_pad="3"
+ top_pad="6"
width="200" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ halign="center"
+ height="16"
+ layout="topleft"
+ left="245"
+ name="BHText8"
+ top_pad="-15"
+ width="10">
+ B
+ </text>
<slider
control_name="WLBlueDensityB"
decimal_digits="2"
@@ -328,8 +314,22 @@
layout="topleft"
left_delta="0"
name="WLBlueDensityB"
- top_pad="1"
+ left_pad="3"
+ top_pad="6"
width="200" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ halign="center"
+ height="16"
+ layout="topleft"
+ left="245"
+ name="BHText9"
+ top_pad="-15"
+ width="10">
+ I
+ </text>
<slider
control_name="WLBlueDensityI"
decimal_digits="2"
@@ -340,7 +340,8 @@
layout="topleft"
left_delta="0"
name="WLBlueDensityI"
- top_pad="1"
+ left_pad="3"
+ top_pad="6"
width="200" />
<text
type="string"
@@ -349,9 +350,9 @@
font="SansSerif"
height="16"
layout="topleft"
- left_delta="-14"
+ left="245"
name="HDText"
- top_delta="-2"
+ top_pad="-10"
width="355">
Haze Density
</text>
@@ -363,10 +364,10 @@
increment="0.01"
initial_value="0.7"
layout="topleft"
- left="259"
+ left="258"
max_val="4"
name="WLHazeDensity"
- top="107"
+ top_pad="27"
width="200" />
<text
type="string"
@@ -389,10 +390,10 @@
increment="0.01"
initial_value="0.1"
layout="topleft"
- left="494"
+ left_delta="13"
max_val="0.9"
name="WLDensityMult"
- top="40"
+ top_pad="27"
width="200" />
<text
type="string"
@@ -401,9 +402,9 @@
font="SansSerif"
height="16"
layout="topleft"
- left_delta="-14"
+ left_delta="-13"
name="WLDistanceMultText"
- top_delta="-3"
+ top_pad="-10"
width="355">
Distance Multiplier
</text>
@@ -414,11 +415,11 @@
height="10"
initial_value="1.0"
layout="topleft"
- left="494"
+ left_delta="13"
max_val="100"
name="WLDistanceMult"
- top="73"
- width="207" />
+ top_pad="27"
+ width="200" />
<text
type="string"
length="1"
@@ -426,9 +427,9 @@
font="SansSerif"
height="16"
layout="topleft"
- left_delta="-14"
+ left_delta="-13"
name="MaxAltText"
- top_delta="-2"
+ top_pad="-15"
width="355">
Max Altitude
</text>
@@ -440,17 +441,17 @@
increment="1"
initial_value="500"
layout="topleft"
- left="494"
+ left_delta="13"
max_val="4000"
name="WLMaxAltitude"
- top="107"
- width="205" />
+ top_pad="27"
+ width="200" />
</panel>
<panel
border="true"
follows="left|top|right|bottom"
- height="160"
- label="Lighting"
+ height="196"
+ label="LIGHTING"
layout="topleft"
left_delta="0"
help_topic="windlight_lighting_tab"
@@ -477,12 +478,24 @@
halign="center"
height="16"
layout="topleft"
- left="10"
+ left_delta="0"
name="BHText"
- top="21"
+ top_pad="5"
width="10">
R
</text>
+ <slider
+ control_name="WLSunlightR"
+ decimal_digits="2"
+ follows="left"
+ height="10"
+ increment="0.01"
+ initial_value="0.7"
+ layout="topleft"
+ left_pad="3"
+ top_pad="6"
+ name="WLSunlightR"
+ width="200" />
<text
type="string"
length="1"
@@ -490,50 +503,12 @@
halign="center"
height="16"
layout="topleft"
- left_delta="0"
+ left_delta="-13"
name="BHText2"
- top_delta="11"
+ top_pad="-15"
width="10">
G
</text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="0"
- name="BHText3"
- top_delta="11"
- width="10">
- B
- </text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="0"
- name="BHText4"
- top_delta="11"
- width="10">
- I
- </text>
- <slider
- control_name="WLSunlightR"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left="24"
- name="WLSunlightR"
- top="40"
- width="200" />
<slider
control_name="WLSunlightG"
decimal_digits="2"
@@ -544,8 +519,22 @@
layout="topleft"
left_delta="0"
name="WLSunlightG"
- top_pad="1"
+ left_pad="3"
+ top_pad="6"
width="200" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ halign="center"
+ height="16"
+ layout="topleft"
+ left_delta="-13"
+ name="BHText3"
+ top_pad="-15"
+ width="10">
+ B
+ </text>
<slider
control_name="WLSunlightB"
decimal_digits="2"
@@ -556,8 +545,22 @@
layout="topleft"
left_delta="0"
name="WLSunlightB"
- top_pad="1"
+ left_pad="3"
+ top_pad="6"
width="200" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ halign="center"
+ height="16"
+ layout="topleft"
+ left_delta="-13"
+ name="BHText4"
+ top_pad="-15"
+ width="10">
+ I
+ </text>
<slider
control_name="WLSunlightI"
decimal_digits="2"
@@ -568,7 +571,8 @@
layout="topleft"
left_delta="0"
name="WLSunlightI"
- top_pad="1"
+ left_pad="3"
+ top_pad="6"
width="200" />
<text
type="string"
@@ -577,9 +581,9 @@
font="SansSerif"
height="16"
layout="topleft"
- left_delta="-14"
+ left_delta="-13"
name="TODText"
- top_delta="-2"
+ top_pad="-10"
width="355">
Sun/Moon Position
</text>
@@ -587,9 +591,9 @@
height="20"
image_name="icon_diurnal.tga"
layout="topleft"
- left="30"
+ left_delta="14"
+ top_pad="10"
name="SkyDayCycle"
- top="97"
width="148" />
<slider
control_name="WLSunAngle"
@@ -598,10 +602,10 @@
increment="0.001"
initial_value="0.7"
layout="topleft"
- left="24"
+ left_delta="-8"
name="WLSunAngle"
- top="137"
- width="204" />
+ top_pad="20"
+ width="207" />
<text
type="string"
length="1"
@@ -622,12 +626,24 @@
halign="center"
height="16"
layout="topleft"
- left="245"
+ left_delta="0"
name="BHText5"
- top="21"
+ top_pad="5"
width="10">
R
</text>
+ <slider
+ control_name="WLAmbientR"
+ decimal_digits="2"
+ follows="left"
+ height="10"
+ increment="0.01"
+ initial_value="0.7"
+ layout="topleft"
+ left_pad="3"
+ top_pad="6"
+ name="WLAmbientR"
+ width="200" />
<text
type="string"
length="1"
@@ -635,50 +651,12 @@
halign="center"
height="16"
layout="topleft"
- left_delta="0"
+ left_delta="-13"
name="BHText6"
- top_delta="11"
+ top_pad="-15"
width="10">
G
</text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="0"
- name="BHText7"
- top_delta="11"
- width="10">
- B
- </text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="0"
- name="BHText8"
- top_delta="11"
- width="10">
- I
- </text>
- <slider
- control_name="WLAmbientR"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left="259"
- name="WLAmbientR"
- top="40"
- width="200" />
<slider
control_name="WLAmbientG"
decimal_digits="2"
@@ -689,8 +667,22 @@
layout="topleft"
left_delta="0"
name="WLAmbientG"
- top_pad="1"
+ left_pad="3"
+ top_pad="6"
width="200" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ halign="center"
+ height="16"
+ layout="topleft"
+ left_delta="-13"
+ name="BHText7"
+ top_pad="-15"
+ width="10">
+ B
+ </text>
<slider
control_name="WLAmbientB"
decimal_digits="2"
@@ -701,8 +693,22 @@
layout="topleft"
left_delta="0"
name="WLAmbientB"
- top_pad="1"
+ left_pad="3"
+ top_pad="6"
width="200" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ halign="center"
+ height="16"
+ layout="topleft"
+ left_delta="-13"
+ name="BHText8"
+ top_pad="-15"
+ width="10">
+ I
+ </text>
<slider
control_name="WLAmbientI"
decimal_digits="2"
@@ -713,7 +719,8 @@
layout="topleft"
left_delta="0"
name="WLAmbientI"
- top_pad="1"
+ left_pad="3"
+ top_pad="6"
width="200" />
<text
type="string"
@@ -722,9 +729,9 @@
font="SansSerif"
height="16"
layout="topleft"
- left_delta="-14"
+ left_delta="-13"
name="WLEastAngleText"
- top_delta="-2"
+ top_pad="-10"
width="355">
East Angle
</text>
@@ -736,9 +743,9 @@
increment="0.01"
initial_value="0.0"
layout="topleft"
- left="259"
+ left_delta="13"
name="WLEastAngle"
- top="107"
+ top_pad="27"
width="200" />
<text
type="string"
@@ -762,10 +769,10 @@
initial_value="0.1"
label="Focus "
layout="topleft"
- left="494"
+ left_delta="0"
max_val="0.5"
name="WLGlowB"
- top="40"
+ top_pad="27"
width="200" />
<slider
control_name="WLGlowR"
@@ -780,7 +787,7 @@
max_val="1.99"
min_val="1"
name="WLGlowR"
- top_pad="1"
+ top_pad="6"
width="200" />
<text
type="string"
@@ -789,9 +796,9 @@
font="SansSerif"
height="16"
layout="topleft"
- left_delta="-14"
+ left_delta="0"
name="SceneGammaText"
- top_delta="0"
+ top_pad="-10"
width="200">
Scene Gamma
</text>
@@ -803,11 +810,11 @@
increment="0.01"
initial_value="2.0"
layout="topleft"
- left="494"
+ left_delta="0"
max_val="10"
name="WLGamma"
- top="87"
- width="207" />
+ top_pad="27"
+ width="200" />
<text
type="string"
length="1"
@@ -815,9 +822,9 @@
font="SansSerif"
height="16"
layout="topleft"
- left_delta="-14"
+ left_delta="0"
name="WLStarText"
- top_delta="-1"
+ top_pad="-10"
width="355">
Star Brightness
</text>
@@ -829,17 +836,17 @@
increment="0.01"
initial_value="0"
layout="topleft"
- left="494"
+ left_delta="0"
max_val="2"
name="WLStarAlpha"
- top="122"
+ top_pad="27"
width="200" />
</panel>
<panel
border="true"
follows="left|top|right|bottom"
- height="160"
- label="Clouds"
+ height="196"
+ label="CLOUDS"
layout="topleft"
left_delta="0"
mouse_opaque="false"
@@ -867,12 +874,24 @@
halign="center"
height="16"
layout="topleft"
- left="10"
+ left_delta="0"
name="BHText"
- top="21"
+ top_pad="5"
width="10">
R
</text>
+ <slider
+ control_name="WLCloudColorR"
+ decimal_digits="2"
+ follows="left"
+ height="10"
+ increment="0.01"
+ initial_value="0.7"
+ layout="topleft"
+ left_pad="3"
+ top_pad="6"
+ name="WLCloudColorR"
+ width="200" />
<text
type="string"
length="1"
@@ -880,50 +899,12 @@
halign="center"
height="16"
layout="topleft"
- left_delta="0"
+ left_delta="-13"
name="BHText2"
- top_delta="11"
+ top_pad="-15"
width="10">
G
</text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="0"
- name="BHText3"
- top_delta="11"
- width="10">
- B
- </text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="0"
- name="BHText4"
- top_delta="11"
- width="10">
- I
- </text>
- <slider
- control_name="WLCloudColorR"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.7"
- layout="topleft"
- left="24"
- name="WLCloudColorR"
- top="40"
- width="200" />
<slider
control_name="WLCloudColorG"
decimal_digits="2"
@@ -934,8 +915,22 @@
layout="topleft"
left_delta="0"
name="WLCloudColorG"
- top_pad="1"
+ left_pad="3"
+ top_pad="6"
width="200" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ halign="center"
+ height="16"
+ layout="topleft"
+ left_delta="-13"
+ name="BHText3"
+ top_pad="-15"
+ width="10">
+ B
+ </text>
<slider
control_name="WLCloudColorB"
decimal_digits="2"
@@ -946,8 +941,22 @@
layout="topleft"
left_delta="0"
name="WLCloudColorB"
- top_pad="1"
+ left_pad="3"
+ top_pad="6"
width="200" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ halign="center"
+ height="16"
+ layout="topleft"
+ left_delta="-13"
+ name="BHText4"
+ top_pad="-15"
+ width="10">
+ I
+ </text>
<slider
control_name="WLCloudColorI"
decimal_digits="2"
@@ -958,7 +967,8 @@
layout="topleft"
left_delta="0"
name="WLCloudColorI"
- top_pad="1"
+ left_pad="3"
+ top_pad="6"
width="200" />
<text
type="string"
@@ -967,9 +977,9 @@
font="SansSerif"
height="16"
layout="topleft"
- left_delta="-14"
+ left_delta="-13"
name="WLCloudColorText2"
- top_delta="-2"
+ top_pad="-10"
width="355">
Cloud XY/Density
</text>
@@ -980,12 +990,24 @@
halign="center"
height="16"
layout="topleft"
- left="10"
+ left_delta="0"
name="BHText5"
- top="87"
+ top_pad="5"
width="10">
X
</text>
+ <slider
+ control_name="WLCloudX"
+ decimal_digits="2"
+ follows="left"
+ height="10"
+ increment="0.01"
+ initial_value="0.5"
+ layout="topleft"
+ left_pad="3"
+ top_pad="6"
+ name="WLCloudX"
+ width="200" />
<text
type="string"
length="1"
@@ -993,12 +1015,24 @@
halign="center"
height="16"
layout="topleft"
- left_delta="0"
+ left_delta="-13"
name="BHText6"
- top_delta="11"
+ top_pad="-15"
width="10">
Y
</text>
+ <slider
+ control_name="WLCloudY"
+ decimal_digits="2"
+ follows="left"
+ height="10"
+ increment="0.01"
+ initial_value="0.5"
+ layout="topleft"
+ left_pad="3"
+ top_pad="6"
+ name="WLCloudY"
+ width="200" />
<text
type="string"
length="1"
@@ -1006,37 +1040,13 @@
halign="center"
height="16"
layout="topleft"
- left_delta="0"
+ left_delta="-13"
name="BHText7"
- top_delta="11"
+ top_pad="-15"
width="10">
D
</text>
<slider
- control_name="WLCloudX"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.5"
- layout="topleft"
- left_pad="4"
- name="WLCloudX"
- top_delta="-2"
- width="200" />
- <slider
- control_name="WLCloudY"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.5"
- layout="topleft"
- left_delta="0"
- name="WLCloudY"
- top_pad="1"
- width="200" />
- <slider
control_name="WLCloudDensity"
decimal_digits="2"
follows="left"
@@ -1046,7 +1056,8 @@
layout="topleft"
left_delta="0"
name="WLCloudDensity"
- top_pad="1"
+ left_pad="3"
+ top_pad="6"
width="200" />
<text
type="string"
@@ -1069,9 +1080,9 @@
increment="0.01"
initial_value="0.5"
layout="topleft"
- left="259"
+ left_delta="13"
name="WLCloudCoverage"
- top="40"
+ top_pad="27"
width="200" />
<text
type="string"
@@ -1080,9 +1091,9 @@
font="SansSerif"
height="16"
layout="topleft"
- left_delta="-14"
+ left_delta="-13"
name="WLCloudScaleText"
- top_delta="-1"
+ top_pad="-10"
width="355">
Cloud Scale
</text>
@@ -1094,10 +1105,10 @@
increment="0.01"
initial_value="1.0"
layout="topleft"
- left="259"
+ left_delta="13"
min_val="0.01"
name="WLCloudScale"
- top="75"
+ top_pad="27"
width="200" />
<text
type="string"
@@ -1106,9 +1117,9 @@
font="SansSerif"
height="16"
layout="topleft"
- left_delta="-14"
+ left_delta="-13"
name="WLCloudDetailText"
- top_delta="-4"
+ top_pad="-10"
width="355">
Cloud Detail (XY/Density)
</text>
@@ -1119,12 +1130,24 @@
halign="center"
height="16"
layout="topleft"
- left="245"
+ left_delta="0"
name="BHText8"
- top="87"
+ top_pad="8"
width="10">
X
</text>
+ <slider
+ control_name="WLCloudDetailX"
+ decimal_digits="2"
+ follows="left"
+ height="10"
+ increment="0.01"
+ initial_value="0.5"
+ layout="topleft"
+ left_pad="3"
+ top_pad="8"
+ name="WLCloudDetailX"
+ width="200" />
<text
type="string"
length="1"
@@ -1132,37 +1155,12 @@
halign="center"
height="16"
layout="topleft"
- left_delta="0"
+ left_delta="-13"
name="BHText9"
- top_delta="11"
+ top_pad="-15"
width="10">
Y
</text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- halign="center"
- height="16"
- layout="topleft"
- left_delta="0"
- name="BHText10"
- top_delta="11"
- width="10">
- D
- </text>
- <slider
- control_name="WLCloudDetailX"
- decimal_digits="2"
- follows="left"
- height="10"
- increment="0.01"
- initial_value="0.5"
- layout="topleft"
- left_pad="4"
- name="WLCloudDetailX"
- top_delta="-2"
- width="200" />
<slider
control_name="WLCloudDetailY"
decimal_digits="2"
@@ -1173,8 +1171,22 @@
layout="topleft"
left_delta="0"
name="WLCloudDetailY"
- top_pad="1"
+ left_pad="3"
+ top_pad="6"
width="200" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ halign="center"
+ height="16"
+ layout="topleft"
+ left_delta="-13"
+ name="BHText10"
+ top_pad="-15"
+ width="10">
+ D
+ </text>
<slider
control_name="WLCloudDetailDensity"
decimal_digits="2"
@@ -1185,7 +1197,8 @@
layout="topleft"
left_delta="0"
name="WLCloudDetailDensity"
- top_pad="1"
+ left_pad="3"
+ top_pad="6"
width="200" />
<text
type="string"
diff --git a/indra/newview/skins/default/xui/en/floater_world_map.xml b/indra/newview/skins/default/xui/en/floater_world_map.xml
index e1df50bf58..ece406f9b1 100644
--- a/indra/newview/skins/default/xui/en/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/en/floater_world_map.xml
@@ -2,9 +2,8 @@
<floater
legacy_header_height="18"
can_resize="true"
- center_horiz="true"
- center_vert="true"
- height="535"
+ open_centered="true"
+ height="600"
layout="topleft"
min_height="520"
min_width="520"
@@ -14,16 +13,16 @@
save_visibility="true"
single_instance="true"
title="WORLD MAP"
- width="800">
+ width="650">
<panel
filename="panel_world_map.xml"
follows="all"
- height="500"
+ height="555"
layout="topleft"
left="10"
name="objects_mapview"
top="25"
- width="542" />
+ width="375" />
<panel
name="layout_panel_1"
height="22"
@@ -53,7 +52,8 @@
follows="right|top"
height="126"
top_pad="0"
- width="238">
+ width="238"
+ name="layout_panel_2">
<button
follows="right|top"
height="22"
@@ -178,16 +178,16 @@
width="90">
Land Sale
</text>
- <icon
- color="1 1 0.25 1"
+ <icon
+ color="0.5 0.25 1 1"
follows="top|right"
height="16"
image_name="legend.tga"
layout="topleft"
mouse_opaque="true"
name="square2"
- left="41"
- top_pad="-2"
+ left="20"
+ top_pad="2"
width="16" />
<text
type="string"
@@ -196,21 +196,21 @@
height="16"
layout="topleft"
left_pad="0"
- name="by_owner_label"
+ name="auction_label"
top_delta="3"
- width="100">
- by owner
+ width="170">
+ land auction
</text>
- <icon
- color="0.5 0.25 1 1"
+ <icon
+ color="1 1 0.25 1"
follows="top|right"
height="16"
image_name="legend.tga"
layout="topleft"
mouse_opaque="true"
name="square2"
- left="41"
- top_pad="-3"
+ left="20"
+ top_pad="-5"
width="16" />
<text
type="string"
@@ -219,10 +219,10 @@
height="16"
layout="topleft"
left_pad="0"
- name="auction_label"
+ name="by_owner_label"
top_delta="3"
- width="170">
- land auction
+ width="100">
+ by owner
</text>
<button
@@ -279,12 +279,12 @@
<icon
follows="top|right"
height="16"
- image_name="map_event.tga"
+ image_name="Parcel_PG_Dark"
layout="topleft"
mouse_opaque="true"
name="event"
left_pad="0"
- width="16" />
+ width="18" />
<text
type="string"
length="1"
@@ -312,13 +312,13 @@
<icon
follows="top|right"
height="16"
- image_name="map_event_mature.tga"
+ image_name="Parcel_M_Dark"
layout="topleft"
mouse_opaque="true"
name="events_mature_icon"
top_delta="0"
left_pad="0"
- width="16" />
+ width="18" />
<text
type="string"
length="1"
@@ -345,13 +345,13 @@
<icon
follows="top|right"
height="16"
- image_name="map_event_adult.tga"
+ image_name="Parcel_R_Dark"
layout="topleft"
left_pad="0"
mouse_opaque="true"
name="events_adult_icon"
top_delta="0"
- width="16" />
+ width="18" />
<text
type="string"
length="1"
@@ -374,7 +374,8 @@
top_pad="0"
width="238"
background_visible="true"
- bg_alpha_color="DkGray2">
+ bg_alpha_color="DkGray2"
+ name="layout_panel_3">
<text
text_color="White"
font="SansSerifLarge"
@@ -394,9 +395,10 @@
<panel
follows="right|top|bottom"
- height="270"
+ height="310"
top_pad="0"
- width="238">
+ width="238"
+ name="layout_panel_4">
<icon
color="0.5 0 0 1"
follows="top|right"
@@ -493,7 +495,7 @@
top_delta="-1"
name="DoSearch"
tool_tip="Search for region"
- width="58">
+ width="62">
<button.commit_callback
function="WMap.Location" />
</button>
@@ -514,7 +516,7 @@
draw_stripes="false"
bg_writeable_color="MouseGray"
follows="all"
- height="115"
+ height="145"
layout="topleft"
left="28"
name="search_results"
@@ -535,6 +537,7 @@
<button
follows="right|bottom"
height="23"
+ image_unselected="PushButton_On"
label="Teleport"
layout="topleft"
left="25"
@@ -638,7 +641,8 @@
top_pad="0"
width="238"
background_visible="true"
- bg_alpha_color="DkGray2">
+ bg_alpha_color="DkGray2"
+ name="layout_panel_5">
<text
text_color="White"
font="SansSerifLarge"
@@ -660,7 +664,8 @@
height="30"
min_height="30"
top_pad="0"
- width="238">
+ width="238"
+ name="layout_panel_6">
<icon
follows="left|bottom"
height="16"
@@ -670,7 +675,7 @@
mouse_opaque="true"
name="zoom_icon"
top_pad="7"
- width="16" />
+ width="16" ></icon>
<slider
follows="left|bottom"
height="16"
diff --git a/indra/newview/skins/default/xui/en/inspect_avatar.xml b/indra/newview/skins/default/xui/en/inspect_avatar.xml
index 9796f7b5b6..194ae151d2 100644
--- a/indra/newview/skins/default/xui/en/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/en/inspect_avatar.xml
@@ -123,7 +123,7 @@
<button
follows="top|left"
height="20"
- label="More"
+ label="Profile"
layout="topleft"
name="view_profile_btn"
left_delta="96"
diff --git a/indra/newview/skins/default/xui/en/inspect_group.xml b/indra/newview/skins/default/xui/en/inspect_group.xml
index 37ae5a64d7..bcdb63228d 100644
--- a/indra/newview/skins/default/xui/en/inspect_group.xml
+++ b/indra/newview/skins/default/xui/en/inspect_group.xml
@@ -79,7 +79,7 @@ L$123 to join
height="23"
label="Join"
left="8"
- top="286"
+ top="125"
name="join_btn"
width="103"
commit_callback.function="InspectGroup.Join"/>
@@ -88,7 +88,7 @@ L$123 to join
height="23"
label="Leave"
left="8"
- top="286"
+ top="125"
name="leave_btn"
width="103"
commit_callback.function="InspectGroup.Leave"/>
@@ -97,7 +97,7 @@ L$123 to join
height="23"
label="View Profile"
name="view_profile_btn"
- top="286"
+ top="125"
left="117"
width="103"
commit_callback.function="InspectGroup.ViewProfile" />
diff --git a/indra/newview/skins/default/xui/en/inspect_object.xml b/indra/newview/skins/default/xui/en/inspect_object.xml
index 00e00b9694..8aeec46ba3 100644
--- a/indra/newview/skins/default/xui/en/inspect_object.xml
+++ b/indra/newview/skins/default/xui/en/inspect_object.xml
@@ -18,71 +18,61 @@
width="228">
<string name="Creator">By [CREATOR]</string>
<string name="CreatorAndOwner">
-by [CREATOR]
-owner [OWNER]
+By [CREATOR]
+Owner [OWNER]
</string>
<string name="Price">L$[AMOUNT]</string>
<string name="PriceFree">Free!</string>
<string name="Touch">Touch</string>
<string name="Sit">Sit</string>
<text
+ allow_html="false"
follows="all"
font="SansSerifLarge"
- height="16"
+ height="30"
left="8"
name="object_name"
text_color="White"
- top="10"
+ top="6"
use_ellipses="true"
- value="Test Object Name That Is Really Long"
+ word_wrap="true"
width="220" />
<text
follows="all"
- height="33"
+ height="50"
left="8"
name="object_creator"
- top_pad="0"
+ top_pad="6"
use_ellipses="true"
width="220">
by secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
owner secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
</text>
- <!-- *TODO: Replace this icon -->
- <icon
- name="price_icon"
- image_name="Icon_For_Sale"
- right="-5"
- width="16"
- height="16"
- top="56"
- follows="left|top"
- />
<text
follows="all"
font="SansSerifSmall"
font.style="BOLD"
- height="16"
+ height="14"
halign="right"
- left="5"
+ right="-5"
name="price_text"
text_color="white"
- top="58"
+ top="60"
font_shadow="none"
- width="196">
-L$300,000
+ width="60">
+L$30,000
</text>
<text
- clip_partial="true"
+ clip_partial="true"
follows="all"
font="SansSerifSmall"
- height="37"
+ height="25"
left="8"
name="object_description"
- top_pad="0"
- use_ellipses="true"
+ top="76"
+ use_ellipses="true"
width="220"
word_wrap="true">
-This is a really long description for an object being as how it is at least 80 characters in length and maybe more like 120 at this point. Who knows, really?
</text>
<!-- Overlapping buttons for all default actions. Show "Buy" if
for sale, "Sit" if can sit, etc. -->
@@ -90,10 +80,9 @@ This is a really long description for an object being as how it is at least 80 c
follows="all"
font="SansSerifSmall"
height="13"
- left_delta="0"
name="object_media_url"
- bottom_pad="2"
- width="200"
+ width="220"
+ top_pad="0"
max_length = "50"
use_ellipses="true">
http://www.superdupertest.com
diff --git a/indra/newview/skins/default/xui/en/inspector_info_ctrl.xml b/indra/newview/skins/default/xui/en/inspector_info_ctrl.xml
new file mode 100644
index 0000000000..a7ecc39ed8
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/inspector_info_ctrl.xml
@@ -0,0 +1,9 @@
+<button
+ chrome="true"
+ image_selected="Info_Over"
+ image_unselected="Info_Over"
+ image_pressed="Info_Over"
+ height="12"
+ name="inspector_info_ctrl"
+ width="12" />
+ \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/main_view.xml b/indra/newview/skins/default/xui/en/main_view.xml
index 1d4377e339..72ab6195bc 100644
--- a/indra/newview/skins/default/xui/en/main_view.xml
+++ b/indra/newview/skins/default/xui/en/main_view.xml
@@ -64,8 +64,7 @@
left="0"
mouse_opaque="false"
name="world_stack"
- orientation="vertical"
- tab_stop="false">
+ orientation="vertical">
<panel auto_resize="true"
follows="all"
height="500"
@@ -74,6 +73,17 @@
mouse_opaque="false"
name="hud container"
width="500">
+ <panel auto_resize="false"
+ follows="left|top"
+ height="19"
+ left="0"
+ mouse_opaque="false"
+ name="topinfo_bar_container"
+ tab_stop="false"
+ top="0"
+ user_resize="false"
+ visible="false"
+ width="1024"/>
<panel follows="right|top|bottom"
height="500"
mouse_opaque="false"
@@ -143,35 +153,59 @@
<panel mouse_opaque="false"
follows="left|right|top"
name="status_bar_container"
- tab_stop="false"
+ tab_stop="false"
height="19"
left="0"
top="0"
width="1024"
visible="false"/>
- <notify_box_view top="0"
- follows="all"
- height="768"
- mouse_opaque="false"
- name="notify_container"
- tab_group="-2"
- width="1024"/>
+ <view mouse_opaque="false"
+ follows="all"
+ name="menu_bar_holder"
+ left="0"
+ top="0"
+ width="1024"
+ height="768"/>
+ <panel top="0"
+ follows="all"
+ mouse_opaque="false"
+ left="0"
+ name="snapshot_floater_view_holder"
+ width="1024"
+ height="798">
+ <snapshot_floater_view enabled="false"
+ follows="all"
+ height="768"
+ left="0"
+ mouse_opaque="false"
+ name="Snapshot Floater View"
+ tab_stop="false"
+ top="0"
+ visible="false"
+ width="1024"/>
+ </panel>
+ <panel top="0"
+ follows="all"
+ height="768"
+ mouse_opaque="true"
+ name="progress_view"
+ filename="panel_progress.xml"
+ class="progress_view"
+ width="1024"
+ visible="false"/>
+ <panel top="0"
+ follows="all"
+ height="768"
+ mouse_opaque="false"
+ name="popup_holder"
+ class="popup_holder"
+ width="1024"/>
<menu_holder top="0"
follows="all"
height="768"
mouse_opaque="false"
name="Menu Holder"
width="1024"/>
- <snapshot_floater_view enabled="false"
- follows="all"
- height="768"
- left="0"
- mouse_opaque="false"
- name="Snapshot Floater View"
- tab_stop="false"
- top="0"
- visible="false"
- width="1024"/>
<tooltip_view top="0"
follows="all"
height="768"
diff --git a/indra/newview/skins/default/xui/en/menu_attachment_other.xml b/indra/newview/skins/default/xui/en/menu_attachment_other.xml
index c5b31c7f63..b46b62ec4d 100644
--- a/indra/newview/skins/default/xui/en/menu_attachment_other.xml
+++ b/indra/newview/skins/default/xui/en/menu_attachment_other.xml
@@ -72,7 +72,7 @@
function="Avatar.EnableFreezeEject"/>
</menu_item_call>
<menu_item_call
- label="Debug"
+ label="Debug Textures"
name="Debug...">
<menu_item_call.on_click
function="Avatar.Debug" />
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 281ec5a7c3..7239b13466 100644
--- a/indra/newview/skins/default/xui/en/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_attachment_self.xml
@@ -44,60 +44,85 @@
<menu_item_call.on_enable
function="Attachment.EnableDetach" />
</menu_item_call>
- <menu_item_call
- enabled="false"
- label="Drop"
- layout="topleft"
- name="Drop">
- <menu_item_call.on_click
- function="Attachment.Drop" />
- <menu_item_call.on_enable
- function="Attachment.EnableDrop" />
- </menu_item_call>
- <menu_item_separator
- layout="topleft" />
-
- <menu_item_call
- label="Stand Up"
- layout="topleft"
- name="Stand Up">
- <menu_item_call.on_click
- function="Self.StandUp"
- parameter="" />
- <menu_item_call.on_enable
- function="Self.EnableStandUp" />
- </menu_item_call>
- <menu_item_call
- label="My Appearance"
- name="Appearance...">
- <menu_item_call.on_click
- function="CustomizeAvatar" />
- <menu_item_call.on_enable
- function="Edit.EnableCustomizeAvatar" />
- </menu_item_call>
- <menu_item_call
- label="My Friends"
- layout="topleft"
- name="Friends...">
- <menu_item_call.on_click
- function="SideTray.PanelPeopleTab"
- parameter="friends_panel" />
- </menu_item_call>
- <menu_item_call
- label="My Groups"
- layout="topleft"
- name="Groups...">
- <menu_item_call.on_click
- function="SideTray.PanelPeopleTab"
- parameter="groups_panel" />
- </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_separator
+ layout="topleft" />
+
+ <menu_item_call
+label="Stand Up"
+layout="topleft"
+name="Stand Up">
+ <menu_item_call.on_click
+ function="Self.StandUp"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="Self.EnableStandUp" />
+ </menu_item_call>
+ <menu_item_call
+ label="Change Outfit"
+ name="Change Outfit">
+ <menu_item_call.on_click
+ function="CustomizeAvatar" />
+ <menu_item_call.on_enable
+ function="Edit.EnableCustomizeAvatar" />
+ </menu_item_call>
+ <menu_item_call label="Edit My Outfit"
+layout="topleft"
+name="Edit Outfit">
+ <menu_item_call.on_click
+ function="EditOutfit" />
+ <menu_item_call.on_enable
+ function="Edit.EnableCustomizeAvatar" />
+ </menu_item_call>
+ <menu_item_call label="Edit My Shape"
+ layout="topleft"
+ name="Edit My Shape">
+ <menu_item_call.on_click
+ function="EditShape" />
+ <menu_item_call.on_enable
+ function="Edit.EnableEditShape" />
+ </menu_item_call>
+ <menu_item_call
+ label="My Friends"
+ layout="topleft"
+ name="Friends...">
+ <menu_item_call.on_click
+ function="SideTray.PanelPeopleTab"
+ parameter="friends_panel" />
+ </menu_item_call>
+ <menu_item_call
+ label="My Groups"
+ layout="topleft"
+ name="Groups...">
+ <menu_item_call.on_click
+ function="SideTray.PanelPeopleTab"
+ parameter="groups_panel" />
+ </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="Debug Textures"
+ name="Debug...">
+ <menu_item_call.on_click
+ function="Avatar.Debug" />
+ <menu_item_call.on_visible
+ function="IsGodCustomerService"/>
+ </menu_item_call>
+ <menu_item_separator
+ layout="topleft" />
+ <menu_item_call
+ enabled="false"
+ label="Drop"
+ layout="topleft"
+ name="Drop">
+ <menu_item_call.on_click
+ function="Attachment.Drop" />
+ <menu_item_call.on_enable
+ function="Attachment.EnableDrop" />
+ </menu_item_call>
</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_avatar_other.xml b/indra/newview/skins/default/xui/en/menu_avatar_other.xml
index ac9101cfd9..276b5f106f 100644
--- a/indra/newview/skins/default/xui/en/menu_avatar_other.xml
+++ b/indra/newview/skins/default/xui/en/menu_avatar_other.xml
@@ -72,7 +72,7 @@
function="Avatar.EnableFreezeEject"/>
</menu_item_call>
<menu_item_call
- label="Debug"
+ label="Debug Textures"
name="Debug...">
<menu_item_call.on_click
function="Avatar.Debug" />
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 1e32cfd9df..d5b993152a 100644
--- a/indra/newview/skins/default/xui/en/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/en/menu_avatar_self.xml
@@ -183,14 +183,30 @@
</menu_item_call>
</context_menu>
<menu_item_call
- label="My Appearance"
+ label="Change Outfit"
layout="topleft"
- name="Appearance...">
+ name="Chenge Outfit">
<menu_item_call.on_click
function="CustomizeAvatar" />
<menu_item_call.on_enable
function="Edit.EnableCustomizeAvatar" />
</menu_item_call>
+ <menu_item_call label="Edit My Outfit"
+ layout="topleft"
+ name="Edit Outfit">
+ <menu_item_call.on_click
+ function="EditOutfit" />
+ <menu_item_call.on_enable
+ function="Edit.EnableCustomizeAvatar" />
+ </menu_item_call>
+ <menu_item_call label="Edit My Shape"
+ layout="topleft"
+ name="Edit My Shape">
+ <menu_item_call.on_click
+ function="EditShape" />
+ <menu_item_call.on_enable
+ function="Edit.EnableEditShape" />
+ </menu_item_call>
<menu_item_call
label="My Friends"
layout="topleft"
@@ -215,4 +231,12 @@
function="ShowAgentProfile"
parameter="agent" />
</menu_item_call>
+ <menu_item_call
+ label="Debug Textures"
+ name="Debug...">
+ <menu_item_call.on_click
+ function="Avatar.Debug" />
+ <menu_item_call.on_visible
+ function="IsGodCustomerService"/>
+ </menu_item_call>
</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_bottomtray.xml b/indra/newview/skins/default/xui/en/menu_bottomtray.xml
index 7ef91a1d85..5beafef4e4 100644
--- a/indra/newview/skins/default/xui/en/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/menu_bottomtray.xml
@@ -52,6 +52,50 @@
function="CheckControl"
parameter="ShowSnapshotButton" />
</menu_item_check>
+ <menu_item_check
+ label="Build button"
+ layout="topleft"
+ name="ShowBuildButton">
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="ShowBuildButton" />
+ <menu_item_check.on_check
+ function="CheckControl"
+ parameter="ShowBuildButton" />
+ </menu_item_check>
+ <menu_item_check
+ label="Search button"
+ layout="topleft"
+ name="ShowSearchButton">
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="ShowSearchButton" />
+ <menu_item_check.on_check
+ function="CheckControl"
+ parameter="ShowSearchButton" />
+ </menu_item_check>
+ <menu_item_check
+ label="Map button"
+ layout="topleft"
+ name="ShowWorldMapButton">
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="ShowWorldMapButton" />
+ <menu_item_check.on_check
+ function="CheckControl"
+ parameter="ShowWorldMapButton" />
+ </menu_item_check>
+ <menu_item_check
+ label="Mini-Map button"
+ layout="topleft"
+ name="ShowMiniMapButton">
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="ShowMiniMapButton" />
+ <menu_item_check.on_check
+ function="CheckControl"
+ parameter="ShowMiniMapButton" />
+ </menu_item_check>
<menu_item_separator
name="Separator" />
<menu_item_call
diff --git a/indra/newview/skins/default/xui/en/menu_cof_attachment.xml b/indra/newview/skins/default/xui/en/menu_cof_attachment.xml
new file mode 100644
index 0000000000..c402100fb1
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_cof_attachment.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="COF Attachment">
+ <menu_item_call
+ label="Detach"
+ layout="topleft"
+ name="detach">
+ <on_click
+ function="Attachment.Detach"
+ parameter="detach"/>
+ </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_cof_body_part.xml b/indra/newview/skins/default/xui/en/menu_cof_body_part.xml
new file mode 100644
index 0000000000..f0e8461360
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_cof_body_part.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="COF Body">
+ <menu_item_call
+ label="Replace"
+ layout="topleft"
+ name="replace">
+ <on_click
+ function="BodyPart.Replace"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Edit"
+ layout="topleft"
+ name="edit">
+ <on_click
+ function="BodyPart.Edit"/>
+ <on_enable
+ function="BodyPart.OnEnable"
+ parameter="edit" />
+ </menu_item_call>
+ <menu_item_call
+ label="Create New"
+ layout="topleft"
+ name="create_new"
+ translate="false">
+ <on_click
+ function="BodyPart.Create"/>
+ <on_enable
+ function="BodyPart.OnEnable"
+ parameter="create" />
+ </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_cof_clothing.xml b/indra/newview/skins/default/xui/en/menu_cof_clothing.xml
new file mode 100644
index 0000000000..12ee9b045b
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_cof_clothing.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="COF Clothing">
+ <menu_item_call
+ label="Take Off"
+ layout="topleft"
+ name="take_off">
+ <on_click
+ function="Clothing.TakeOff" />
+ <on_enable
+ function="Clothing.OnEnable"
+ parameter="take_off" />
+ </menu_item_call>
+ <menu_item_call
+ label="Move Up a Layer"
+ layout="topleft"
+ name="move_up">
+ <on_click
+ function="Clothing.MoveUp" />
+ <on_enable
+ function="Clothing.OnEnable"
+ parameter="move_up" />
+ </menu_item_call>
+ <menu_item_call
+ label="Move Down a Layer"
+ layout="topleft"
+ name="move_down">
+ <on_click
+ function="Clothing.MoveDown" />
+ <on_enable
+ function="Clothing.OnEnable"
+ parameter="move_down" />
+ </menu_item_call>
+ <menu_item_call
+ label="Edit"
+ layout="topleft"
+ name="edit">
+ <on_click
+ function="Clothing.Edit" />
+ <on_enable
+ function="Clothing.OnEnable"
+ parameter="edit" />
+ </menu_item_call>
+ <menu_item_call
+ label="Create New"
+ layout="topleft"
+ name="create_new"
+ translate="false">
+ <on_click
+ function="Clothing.Create"/>
+ <on_enable
+ function="Clothing.OnEnable"
+ parameter="create" />
+ </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_cof_gear.xml b/indra/newview/skins/default/xui/en/menu_cof_gear.xml
new file mode 100644
index 0000000000..c2a11a64ec
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_cof_gear.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu
+ layout="topleft"
+ name="Gear COF">
+ <menu
+ label="New Clothes"
+ layout="topleft"
+ name="COF.Gear.New_Clothes" />
+ <menu
+ label="New Body Parts"
+ layout="topleft"
+ name="COF.Geear.New_Body_Parts" />
+</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_edit.xml b/indra/newview/skins/default/xui/en/menu_edit.xml
new file mode 100644
index 0000000000..68f3cb532c
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_edit.xml
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu create_jump_keys="true"
+ label="Edit"
+ name="Edit"
+ visible="false">
+ <menu_item_call
+ label="Undo"
+ name="Undo"
+ shortcut="control|Z">
+ <menu_item_call.on_click
+ function="Edit.Undo" />
+ <menu_item_call.on_enable
+ function="Edit.EnableUndo" />
+ </menu_item_call>
+ <menu_item_call
+ label="Redo"
+ name="Redo"
+ shortcut="control|Y">
+ <menu_item_call.on_click
+ function="Edit.Redo" />
+ <menu_item_call.on_enable
+ function="Edit.EnableRedo" />
+ </menu_item_call>
+ <menu_item_separator/>
+ <menu_item_call
+ label="Cut"
+ name="Cut"
+ shortcut="control|X">
+ <menu_item_call.on_click
+ function="Edit.Cut" />
+ <menu_item_call.on_enable
+ function="Edit.EnableCut" />
+ </menu_item_call>
+ <menu_item_call
+ label="Copy"
+ name="Copy"
+ shortcut="control|C">
+ <menu_item_call.on_click
+ function="Edit.Copy" />
+ <menu_item_call.on_enable
+ function="Edit.EnableCopy" />
+ </menu_item_call>
+ <menu_item_call
+ label="Paste"
+ name="Paste"
+ shortcut="control|V">
+ <menu_item_call.on_click
+ function="Edit.Paste" />
+ <menu_item_call.on_enable
+ function="Edit.EnablePaste" />
+ </menu_item_call>
+ <menu_item_call
+ label="Delete"
+ name="Delete"
+ shortcut="Del">
+ <menu_item_call.on_click
+ function="Edit.Delete" />
+ <menu_item_call.on_enable
+ function="Edit.EnableDelete" />
+ </menu_item_call>
+ <menu_item_call
+ label="Duplicate"
+ name="Duplicate"
+ shortcut="control|D">
+ <menu_item_call.on_click
+ function="Edit.Duplicate" />
+ <menu_item_call.on_enable
+ function="Edit.EnableDuplicate" />
+ </menu_item_call>
+ <menu_item_separator/>
+ <menu_item_call
+ label="Select All"
+ name="Select All"
+ shortcut="control|A">
+ <menu_item_call.on_click
+ function="Edit.SelectAll" />
+ <menu_item_call.on_enable
+ function="Edit.EnableSelectAll" />
+ </menu_item_call>
+ <menu_item_call
+ label="Deselect"
+ name="Deselect"
+ shortcut="control|E">
+ <menu_item_call.on_click
+ function="Edit.Deselect" />
+ <menu_item_call.on_enable
+ function="Edit.EnableDeselect" />
+ </menu_item_call>
+</menu> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/menu_group_plus.xml b/indra/newview/skins/default/xui/en/menu_group_plus.xml
index e83d07baec..fce7414d80 100644
--- a/indra/newview/skins/default/xui/en/menu_group_plus.xml
+++ b/indra/newview/skins/default/xui/en/menu_group_plus.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<menu name="menu_group_plus"
left="0" bottom="0" visible="false"
- mouse_opaque="false" opaque="true" color="MenuDefaultBgColor" drop_shadow="false">
+ mouse_opaque="false">
<menu_item_call name="item_join" label="Join Group...">
<menu_item_call.on_click function="People.Group.Plus.Action" userdata="join_group" />
</menu_item_call>
diff --git a/indra/newview/skins/default/xui/en/menu_hide_navbar.xml b/indra/newview/skins/default/xui/en/menu_hide_navbar.xml
index a175b3103f..3f38d734b9 100644
--- a/indra/newview/skins/default/xui/en/menu_hide_navbar.xml
+++ b/indra/newview/skins/default/xui/en/menu_hide_navbar.xml
@@ -12,10 +12,10 @@
label="Show Navigation Bar"
layout="topleft"
name="ShowNavbarNavigationPanel">
- <menu_item_check.on_click
+ <on_click
function="ToggleControl"
parameter="ShowNavbarNavigationPanel" />
- <menu_item_check.on_check
+ <on_check
function="CheckControl"
parameter="ShowNavbarNavigationPanel" />
</menu_item_check>
@@ -23,11 +23,22 @@
label="Show Favorites Bar"
layout="topleft"
name="ShowNavbarFavoritesPanel">
- <menu_item_check.on_click
+ <on_click
function="ToggleControl"
parameter="ShowNavbarFavoritesPanel" />
- <menu_item_check.on_check
+ <on_check
function="CheckControl"
parameter="ShowNavbarFavoritesPanel" />
</menu_item_check>
+ <menu_item_check
+ label="Show Mini-Location Bar"
+ layout="topleft"
+ name="ShowMiniLocationPanel">
+ <on_click
+ function="ToggleControl"
+ parameter="ShowMiniLocationPanel" />
+ <on_check
+ function="CheckControl"
+ parameter="ShowMiniLocationPanel" />
+ </menu_item_check>
</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 85ec174829..334decdf58 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
@@ -40,6 +40,8 @@
name="teleport">
<menu_item_call.on_click
function="InspectAvatar.Teleport"/>
+ <menu_item_call.on_enable
+ function="InspectAvatar.Gear.EnableTeleportOffer"/>
</menu_item_call>
<menu_item_call
label="Invite to Group"
@@ -87,7 +89,7 @@
function="InspectAvatar.VisibleFreezeEject"/>
</menu_item_call>
<menu_item_call
- label="Debug"
+ label="Debug Textures"
name="debug">
<menu_item_call.on_click
function="Avatar.Debug"/>
@@ -116,4 +118,10 @@
<menu_item_call.on_click
function="InspectAvatar.Pay"/>
</menu_item_call>
+ <menu_item_call
+ label="Share"
+ name="share">
+ <menu_item_call.on_click
+ function="InspectAvatar.Share"/>
+ </menu_item_call>
</menu>
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 9dc2611663..ea18e02ca1 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
@@ -16,8 +16,8 @@
function="Self.EnableStandUp" />
</menu_item_call>
<menu_item_call
- label="My Appearance"
- name="my_appearance">
+ label="Change Outfit"
+ name="change_outfit">
<menu_item_call.on_click
function="CustomizeAvatar" />
<menu_item_call.on_enable
@@ -45,4 +45,12 @@
function="SideTray.PanelPeopleTab"
parameter="groups_panel" />
</menu_item_call>
+ <menu_item_call
+ label="Debug Textures"
+ name="Debug...">
+ <menu_item_call.on_click
+ function="Avatar.Debug" />
+ <menu_item_call.on_visible
+ function="IsGodCustomerService"/>
+ </menu_item_call>
</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_inv_offer_chiclet.xml b/indra/newview/skins/default/xui/en/menu_inv_offer_chiclet.xml
new file mode 100644
index 0000000000..45a0a6635b
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_inv_offer_chiclet.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu
+ height="101"
+ layout="topleft"
+ left="100"
+ mouse_opaque="false"
+ name="InvOfferChiclet Menu"
+ top="724"
+ visible="false"
+ width="128">
+ <menu_item_call
+ label="Close"
+ layout="topleft"
+ name="Close">
+ <menu_item_call.on_click
+ function="InvOfferChiclet.Action"
+ parameter="end" />
+ </menu_item_call>
+</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_inventory.xml b/indra/newview/skins/default/xui/en/menu_inventory.xml
index 2874151df5..221457ac1f 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory.xml
@@ -5,6 +5,14 @@
name="Popup"
visible="false">
<menu_item_call
+ label="Share"
+ layout="topleft"
+ name="Share"
+ visible="true">
+ <menu_item_call.on_click
+ function="Inventory.Share" />
+ </menu_item_call>
+ <menu_item_call
label="Buy"
layout="topleft"
name="Task Buy">
@@ -402,6 +410,14 @@
parameter="open" />
</menu_item_call>
<menu_item_call
+ label="Open Original"
+ layout="topleft"
+ name="Open Original">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="open_original" />
+ </menu_item_call>
+ <menu_item_call
label="Properties"
layout="topleft"
name="Properties">
@@ -646,6 +662,14 @@
parameter="wear" />
</menu_item_call>
<menu_item_call
+ label="Add"
+ layout="topleft"
+ name="Wearable Add">
+ <menu_item_call.on_click
+ function="Inventory.DoToSelected"
+ parameter="wear_add" />
+ </menu_item_call>
+ <menu_item_call
label="Take Off"
layout="topleft"
name="Take Off">
diff --git a/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml
index 4e6a07d020..62365f7cc2 100644
--- a/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/en/menu_inventory_gear_default.xml
@@ -61,14 +61,6 @@
<menu_item_separator
layout="topleft" />
<menu_item_call
- label="Empty Trash"
- layout="topleft"
- name="empty_trash">
- <on_click
- function="Inventory.GearDefault.Custom.Action"
- parameter="empty_trash" />
- </menu_item_call>
- <menu_item_call
label="Empty Lost and Found"
layout="topleft"
name="empty_lostnfound">
@@ -111,4 +103,15 @@
function="Inventory.GearDefault.Enable"
parameter="find_links" />
</menu_item_call>
+ <menu_item_separator
+ layout="topleft" />
+
+ <menu_item_call
+ label="Empty Trash"
+ layout="topleft"
+ name="empty_trash">
+ <on_click
+ function="Inventory.GearDefault.Custom.Action"
+ parameter="empty_trash" />
+ </menu_item_call>
</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_login.xml b/indra/newview/skins/default/xui/en/menu_login.xml
index ba74104594..9fac296e26 100644
--- a/indra/newview/skins/default/xui/en/menu_login.xml
+++ b/indra/newview/skins/default/xui/en/menu_login.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<menu_bar
- follows="left|top|right"
+ follows="left|top"
height="18"
layout="topleft"
left_delta="0"
@@ -22,21 +22,13 @@
</menu_item_call>
<menu_item_separator />
<menu_item_call
- label="Quit [APP_NAME]"
+ label="Exit [APP_NAME]"
name="Quit"
shortcut="control|Q">
<menu_item_call.on_click
function="File.Quit" />
</menu_item_call>
</menu>
-<!-- Edit menu merged into the Me menu above
- <menu
- create_jump_keys="true"
- label="Edit"
- name="Edit"
- width="153">
- </menu>
--->
<menu
create_jump_keys="true"
label="Help"
@@ -59,105 +51,24 @@
parameter="sl_about" />
</menu_item_call>
</menu>
+ <menu_item_check
+ label="Show Debug Menu"
+ name="Show Debug Menu"
+ visible="false"
+ shortcut="control|alt|D">
+ <on_check
+ function="CheckControl"
+ parameter="UseDebugMenus" />
+ <on_click
+ function="ToggleControl"
+ parameter="UseDebugMenus" />
+ </menu_item_check>
<menu
visible="false"
create_jump_keys="true"
label="Debug"
name="Debug"
tear_off="true">
- <!-- Need a copy of the edit menu here so keyboard shortcuts like
- control-C work to copy text at login screen and About dialog (for QA)
- -->
- <menu
- create_jump_keys="true"
- label="Edit"
- name="Edit"
- tear_off="true">
- <menu_item_call
- label="Undo"
- name="Undo"
- shortcut="control|Z">
- <menu_item_call.on_click
- function="Edit.Undo" />
- <menu_item_call.on_enable
- function="Edit.EnableUndo" />
- </menu_item_call>
- <menu_item_call
- label="Redo"
- name="Redo"
- shortcut="control|Y">
- <menu_item_call.on_click
- function="Edit.Redo" />
- <menu_item_call.on_enable
- function="Edit.EnableRedo" />
- </menu_item_call>
- <menu_item_separator />
- <menu_item_call
- label="Cut"
- name="Cut"
- shortcut="control|X">
- <menu_item_call.on_click
- function="Edit.Cut" />
- <menu_item_call.on_enable
- function="Edit.EnableCut" />
- </menu_item_call>
- <menu_item_call
- label="Copy"
- name="Copy"
- shortcut="control|C">
- <menu_item_call.on_click
- function="Edit.Copy" />
- <menu_item_call.on_enable
- function="Edit.EnableCopy" />
- </menu_item_call>
- <menu_item_call
- label="Paste"
- name="Paste"
- shortcut="control|V">
- <menu_item_call.on_click
- function="Edit.Paste" />
- <menu_item_call.on_enable
- function="Edit.EnablePaste" />
- </menu_item_call>
- <menu_item_call
- label="Delete"
- name="Delete"
- shortcut="Del">
- <menu_item_call.on_click
- function="Edit.Delete" />
- <menu_item_call.on_enable
- function="Edit.EnableDelete" />
- </menu_item_call>
- <menu_item_call
- label="Duplicate"
- name="Duplicate"
- shortcut="control|D">
- <menu_item_call.on_click
- function="Edit.Duplicate" />
- <menu_item_call.on_enable
- function="Edit.EnableDuplicate" />
- </menu_item_call>
- <menu_item_separator />
- <menu_item_call
- label="Select All"
- name="Select All"
- shortcut="control|A">
- <menu_item_call.on_click
- function="Edit.SelectAll" />
- <menu_item_call.on_enable
- function="Edit.EnableSelectAll" />
- </menu_item_call>
- <menu_item_call
- label="Deselect"
- name="Deselect"
- shortcut="control|E">
- <menu_item_call.on_click
- function="Edit.Deselect" />
- <menu_item_call.on_enable
- function="Edit.EnableDeselect" />
- </menu_item_call>
- </menu>
- <menu_item_separator />
<menu_item_call
label="Show Debug Settings"
name="Debug Settings">
@@ -270,5 +181,27 @@
function="Advanced.WebBrowserTest"
parameter="http://join.secondlife.com/"/>
</menu_item_call>
+ <menu_item_separator/>
+ <menu_item_check
+ label="Show Grid Picker"
+ name="Show Grid Picker"
+ visible="false"
+ shortcut="control|shift|G">
+ <on_check
+ function="CheckControl"
+ parameter="ForceShowGrid" />
+ <on_click
+ function="ToggleControl"
+ parameter="ForceShowGrid" />
+ </menu_item_check>
+ <menu_item_call
+ label="Show Notifications Console"
+ name="Show Notifications Console"
+ visible="false"
+ shortcut="control|shift|5">
+ <on_click
+ function="Floater.Toggle"
+ parameter="notifications_console" />
+ </menu_item_call>
</menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/en/menu_object.xml b/indra/newview/skins/default/xui/en/menu_object.xml
index 5a9509e284..6ca8766e3f 100644
--- a/indra/newview/skins/default/xui/en/menu_object.xml
+++ b/indra/newview/skins/default/xui/en/menu_object.xml
@@ -18,16 +18,16 @@
name="Edit...">
<menu_item_call.on_click
function="Object.Edit" />
- <menu_item_call.on_visible
+ <menu_item_call.on_visible
function="EnableEdit"/>
</menu_item_call>
<menu_item_call
label="Build"
name="Build">
<menu_item_call.on_click
- function="Object.Edit" />
- <menu_item_call.on_visible
- function="VisibleBuild"/>
+ function="Object.Build" />
+ <menu_item_call.on_visible
+ function="EnableEdit"/>
</menu_item_call>
<menu_item_call
enabled="false"
@@ -44,11 +44,24 @@
name="Object Sit">
<menu_item_call.on_click
function="Object.SitOrStand" />
+ <menu_item_call.on_visible
+ function="Object.SitVisible" />
<menu_item_call.on_enable
function="Object.EnableSitOrStand"
- name="EnableSitOrStand"
- parameter="Sit Here,Stand Up" />
- </menu_item_call>
+ name="EnableSitOrStand" />
+ </menu_item_call>
+ <menu_item_call
+ enabled="false"
+ label="Stand Up"
+ name="Object Stand Up">
+ <menu_item_call.on_click
+ function="Object.SitOrStand" />
+ <menu_item_call.on_visible
+ function="Object.StandUpVisible" />
+ <menu_item_call.on_enable
+ function="Object.EnableSitOrStand"
+ name="EnableSitOrStand" />
+ </menu_item_call>
<menu_item_call
label="Object Profile"
name="Object Inspect">
@@ -87,16 +100,6 @@
label="Remove â–¶"
name="Remove">
<menu_item_call
- enabled="false"
- label="Take"
- name="Pie Object Take">
- <menu_item_call.on_click
- function="Tools.BuyOrTake" />
- <menu_item_call.on_enable
- function="Tools.EnableBuyOrTake"
- parameter="Buy,Take" />
- </menu_item_call>
- <menu_item_call
enabled="false"
label="Report Abuse"
name="Report Abuse...">
@@ -135,6 +138,15 @@
</context_menu>
<menu_item_separator layout="topleft" />
<menu_item_call
+ label="Take"
+ layout="topleft"
+ name="Pie Object Take">
+ <menu_item_call.on_click
+ function="Object.Take"/>
+ <menu_item_call.on_enable
+ function="Object.VisibleTake"/>
+ </menu_item_call>
+ <menu_item_call
enabled="false"
label="Take Copy"
name="Take Copy">
diff --git a/indra/newview/skins/default/xui/en/menu_outfit_gear.xml b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
new file mode 100644
index 0000000000..16b33eff89
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_outfit_gear.xml
@@ -0,0 +1,191 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu
+ layout="topleft"
+ name="Gear Outfit">
+ <menu_item_call
+ label="Wear - Replace Current Outfit"
+ layout="topleft"
+ name="wear">
+ <on_click
+ function="Gear.Wear" />
+ <on_enable
+ function="Gear.OnEnable"
+ parameter="wear" />
+ <on_visible
+ function="Gear.OnVisible"
+ parameter="wear" />
+ </menu_item_call>
+ <menu_item_call
+ label="Take Off - Remove from Current Outfit"
+ layout="topleft"
+ name="take_off">
+ <on_click
+ function="Gear.TakeOff" />
+ <on_enable
+ function="Gear.OnEnable"
+ parameter="take_off" />
+ <on_visible
+ function="Gear.OnVisible"
+ parameter="take_off" />
+ </menu_item_call>
+
+ <menu_item_separator name="sepatator1" />
+ <!-- copied (with minor modifications) from menu_inventory_add.xml -->
+ <!-- *TODO: generate dynamically? -->
+ <menu
+ height="175"
+ label="New Clothes"
+ layout="topleft"
+ left_delta="0"
+ mouse_opaque="false"
+ name="New Clothes"
+ top_pad="514"
+ width="125">
+ <menu_item_call
+ label="New Shirt"
+ layout="topleft"
+ name="New Shirt">
+ <menu_item_call.on_click
+ function="Gear.Create"
+ parameter="shirt" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Pants"
+ layout="topleft"
+ name="New Pants">
+ <menu_item_call.on_click
+ function="Gear.Create"
+ parameter="pants" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Shoes"
+ layout="topleft"
+ name="New Shoes">
+ <menu_item_call.on_click
+ function="Gear.Create"
+ parameter="shoes" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Socks"
+ layout="topleft"
+ name="New Socks">
+ <menu_item_call.on_click
+ function="Gear.Create"
+ parameter="socks" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Jacket"
+ layout="topleft"
+ name="New Jacket">
+ <menu_item_call.on_click
+ function="Gear.Create"
+ parameter="jacket" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Skirt"
+ layout="topleft"
+ name="New Skirt">
+ <menu_item_call.on_click
+ function="Gear.Create"
+ parameter="skirt" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Gloves"
+ layout="topleft"
+ name="New Gloves">
+ <menu_item_call.on_click
+ function="Gear.Create"
+ parameter="gloves" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Undershirt"
+ layout="topleft"
+ name="New Undershirt">
+ <menu_item_call.on_click
+ function="Gear.Create"
+ parameter="undershirt" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Underpants"
+ layout="topleft"
+ name="New Underpants">
+ <menu_item_call.on_click
+ function="Gear.Create"
+ parameter="underpants" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Alpha"
+ layout="topleft"
+ name="New Alpha">
+ <menu_item_call.on_click
+ function="Gear.Create"
+ parameter="alpha" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Tattoo"
+ layout="topleft"
+ name="New Tattoo">
+ <menu_item_call.on_click
+ function="Gear.Create"
+ parameter="tattoo" />
+ </menu_item_call>
+ </menu>
+ <menu
+ height="85"
+ label="New Body Parts"
+ layout="topleft"
+ left_delta="0"
+ mouse_opaque="false"
+ name="New Body Parts"
+ top_pad="514"
+ width="118">
+ <menu_item_call
+ label="New Shape"
+ layout="topleft"
+ name="New Shape">
+ <menu_item_call.on_click
+ function="Gear.Create"
+ parameter="shape" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Skin"
+ layout="topleft"
+ name="New Skin">
+ <menu_item_call.on_click
+ function="Gear.Create"
+ parameter="skin" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Hair"
+ layout="topleft"
+ name="New Hair">
+ <menu_item_call.on_click
+ function="Gear.Create"
+ parameter="hair" />
+ </menu_item_call>
+ <menu_item_call
+ label="New Eyes"
+ layout="topleft"
+ name="New Eyes">
+ <menu_item_call.on_click
+ function="Gear.Create"
+ parameter="eyes" />
+ </menu_item_call>
+ </menu>
+ <!-- copied from menu_inventory_add.xml -->
+
+ <menu_item_separator name="sepatator2" />
+ <menu_item_call
+ label="Delete Outfit"
+ layout="topleft"
+ name="delete_outfit">
+ <on_click
+ function="Gear.Delete" />
+ <on_enable
+ function="Gear.OnEnable"
+ parameter="delete" />
+ <on_visible
+ function="Gear.OnVisible"
+ parameter="delete" />
+ </menu_item_call>
+</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_outfit_tab.xml b/indra/newview/skins/default/xui/en/menu_outfit_tab.xml
new file mode 100644
index 0000000000..9c3151fe07
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_outfit_tab.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ layout="topleft"
+ name="Outfit">
+ <menu_item_call
+ label="Wear - Replace Current Outfit"
+ layout="topleft"
+ name="wear_replace">
+ <on_click
+ function="Outfit.WearReplace" />
+ <on_visible
+ function="Outfit.OnVisible"
+ parameter="wear_replace" />
+ </menu_item_call>
+ <menu_item_call
+ label="Wear - Add to Current Outfit"
+ layout="topleft"
+ name="wear_add">
+ <on_click
+ function="Outfit.WearAdd" />
+ <on_enable
+ function="Outfit.OnEnable"
+ parameter="wear_add" />
+ <on_visible
+ function="Outfit.OnVisible"
+ parameter="wear_add" />
+ </menu_item_call>
+ <menu_item_call
+ label="Take Off - Remove from Current Outfit"
+ layout="topleft"
+ name="take_off">
+ <on_click
+ function="Outfit.TakeOff" />
+ <on_enable
+ function="Outfit.OnEnable"
+ parameter="take_off" />
+ <on_visible
+ function="Outfit.OnVisible"
+ parameter="take_off" />
+ </menu_item_call>
+ <menu_item_call
+ label="Edit Outfit"
+ layout="topleft"
+ name="edit">
+ <on_click
+ function="Outfit.Edit" />
+ <on_visible
+ function="Outfit.OnVisible"
+ parameter="edit" />
+ </menu_item_call>
+ <menu_item_separator />
+ <menu_item_call
+ label="Rename Outfit"
+ layout="topleft"
+ name="rename">
+ <on_click
+ function="Outfit.Rename" />
+ <on_enable
+ function="Outfit.OnEnable"
+ parameter="rename" />
+ </menu_item_call>
+ <menu_item_call
+ label="Delete Outfit"
+ layout="topleft"
+ name="delete">
+ <on_click
+ function="Outfit.Delete" />
+ <on_visible
+ function="Outfit.OnVisible"
+ parameter="delete" />
+ </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 d03a7e3d41..4ed5807808 100644
--- a/indra/newview/skins/default/xui/en/menu_participant_list.xml
+++ b/indra/newview/skins/default/xui/en/menu_participant_list.xml
@@ -6,38 +6,41 @@
label="Sort by Name"
layout="topleft"
name="SortByName">
- <menu_item_check.on_click
- function="ParticipantList.Sort"
- parameter="sort_by_name" />
- <menu_item_check.on_check
+ <on_check
function="ParticipantList.CheckItem"
parameter="is_sorted_by_name" />
+ <on_click
+ function="ParticipantList.Sort"
+ parameter="sort_by_name" />
</menu_item_check>
<menu_item_check
label="Sort by Recent Speakers"
layout="topleft"
name="SortByRecentSpeakers">
- <menu_item_check.on_click
- function="ParticipantList.Sort"
- parameter="sort_by_recent_speakers" />
- <menu_item_check.on_check
+ <on_check
function="ParticipantList.CheckItem"
parameter="is_sorted_by_recent_speakers" />
+ <on_click
+ function="ParticipantList.Sort"
+ parameter="sort_by_recent_speakers" />
</menu_item_check>
<menu_item_call
label="View Profile"
layout="topleft"
name="View Profile">
- <menu_item_call.on_click
+ <on_click
function="Avatar.Profile" />
+ <on_enable
+ function="ParticipantList.EnableItem"
+ parameter="can_view_profile" />
</menu_item_call>
<menu_item_call
label="Add Friend"
layout="topleft"
name="Add Friend">
- <menu_item_call.on_click
+ <on_click
function="Avatar.AddFriend" />
- <menu_item_call.on_enable
+ <on_enable
function="ParticipantList.EnableItem"
parameter="can_add" />
</menu_item_call>
@@ -45,9 +48,9 @@
label="IM"
layout="topleft"
name="IM">
- <menu_item_call.on_click
+ <on_click
function="Avatar.IM" />
- <menu_item_call.on_enable
+ <on_enable
function="ParticipantList.EnableItem"
parameter="can_im" />
</menu_item_call>
@@ -55,20 +58,19 @@
label="Call"
layout="topleft"
name="Call">
- <menu_item_call.on_click
+ <on_click
function="Avatar.Call" />
- <menu_item_call.on_enable
+ <on_enable
function="ParticipantList.EnableItem"
parameter="can_call" />
</menu_item_call>
<menu_item_call
- enabled="true"
label="Share"
layout="topleft"
name="Share">
- <menu_item_call.on_click
+ <on_click
function="Avatar.Share" />
- <menu_item_call.on_enable
+ <on_enable
function="ParticipantList.EnableItem"
parameter="can_share" />
</menu_item_call>
@@ -76,24 +78,38 @@
label="Pay"
layout="topleft"
name="Pay">
- <menu_item_call.on_click
+ <on_click
function="Avatar.Pay" />
- <menu_item_call.on_enable
+ <on_enable
function="ParticipantList.EnableItem"
parameter="can_pay" />
</menu_item_call>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator
+ layout="topleft"
+ name="View Icons Separator" />
+ <menu_item_check
+ label="View People Icons"
+ layout="topleft"
+ name="View Icons">
+ <on_check
+ function="CheckControl"
+ parameter="ParticipantListShowIcons" />
+ <on_click
+ function="ToggleControl"
+ parameter="ParticipantListShowIcons" />
+ </menu_item_check>
+ <menu_item_separator
+ layout="topleft" />
<menu_item_check
label="Block Voice"
layout="topleft"
name="Block/Unblock">
- <menu_item_check.on_click
- function="Avatar.BlockUnblock" />
- <menu_item_check.on_check
+ <on_check
function="ParticipantList.CheckItem"
parameter="is_blocked" />
- <menu_item_check.on_enable
+ <on_click
+ function="Avatar.BlockUnblock" />
+ <on_enable
function="ParticipantList.EnableItem"
parameter="can_block" />
</menu_item_check>
@@ -110,71 +126,72 @@
function="ParticipantList.EnableItem"
parameter="can_mute_text" />
</menu_item_check>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator
+ layout="topleft"
+ name="Moderator Options Separator"/>
<context_menu
label="Moderator Options &gt;"
layout="topleft"
- name="Moderator Options" >
- <menu_item_check
- label="Allow text chat"
- layout="topleft"
- name="AllowTextChat">
- <on_check
- function="ParticipantList.CheckItem"
- parameter="is_allowed_text_chat" />
- <on_click
- function="ParticipantList.ToggleAllowTextChat" />
- <on_enable
- function="ParticipantList.EnableItem"
- parameter="can_allow_text_chat" />
- </menu_item_check>
- <menu_item_separator
- layout="topleft"
- name="moderate_voice_separator" />
- <menu_item_call
- label="Mute this participant"
- layout="topleft"
- name="ModerateVoiceMuteSelected">
- <on_click
- function="ParticipantList.ModerateVoice"
- parameter="selected" />
- <on_enable
- function="ParticipantList.EnableItem"
- parameter="can_moderate_voice" />
- </menu_item_call>
- <menu_item_call
- label="Mute everyone else"
- layout="topleft"
- name="ModerateVoiceMuteOthers">
- <on_click
- function="ParticipantList.ModerateVoice"
- parameter="others" />
- <on_enable
- function="ParticipantList.EnableItem"
- parameter="can_moderate_voice" />
- </menu_item_call>
- <menu_item_call
- label="Unmute this participant"
- layout="topleft"
- name="ModerateVoiceUnMuteSelected">
- <on_click
- function="ParticipantList.ModerateVoice"
- parameter="selected" />
- <on_enable
- function="ParticipantList.EnableItem"
- parameter="can_moderate_voice" />
- </menu_item_call>
- <menu_item_call
- label="Unmute everyone else"
- layout="topleft"
- name="ModerateVoiceUnMuteOthers">
- <on_click
- function="ParticipantList.ModerateVoice"
- parameter="others" />
- <on_enable
- function="ParticipantList.EnableItem"
- parameter="can_moderate_voice" />
- </menu_item_call>
+ name="Moderator Options">
+ <menu_item_check
+ label="Allow text chat"
+ layout="topleft"
+ name="AllowTextChat">
+ <on_check
+ function="ParticipantList.CheckItem"
+ parameter="is_allowed_text_chat" />
+ <on_click
+ function="ParticipantList.ToggleAllowTextChat" />
+ <on_enable
+ function="ParticipantList.EnableItem"
+ parameter="can_allow_text_chat" />
+ </menu_item_check>
+ <menu_item_separator
+ layout="topleft"
+ name="moderate_voice_separator" />
+ <menu_item_call
+ label="Mute this participant"
+ layout="topleft"
+ name="ModerateVoiceMuteSelected">
+ <on_click
+ function="ParticipantList.ModerateVoice"
+ parameter="selected" />
+ <on_enable
+ function="ParticipantList.EnableItem.Moderate"
+ parameter="can_moderate_voice" />
+ </menu_item_call>
+ <menu_item_call
+ label="Unmute this participant"
+ layout="topleft"
+ name="ModerateVoiceUnMuteSelected">
+ <on_click
+ function="ParticipantList.ModerateVoice"
+ parameter="selected" />
+ <on_enable
+ function="ParticipantList.EnableItem.Moderate"
+ parameter="can_moderate_voice" />
+ </menu_item_call>
+ <menu_item_call
+ label="Mute everyone"
+ layout="topleft"
+ name="ModerateVoiceMute">
+ <on_click
+ function="ParticipantList.ModerateVoice"
+ parameter="mute_all" />
+ <on_enable
+ function="ParticipantList.EnableItem.Moderate"
+ parameter="can_moderate_voice" />
+ </menu_item_call>
+ <menu_item_call
+ label="Unmute everyone"
+ layout="topleft"
+ name="ModerateVoiceUnmute">
+ <on_click
+ function="ParticipantList.ModerateVoice"
+ parameter="unmute_all" />
+ <on_enable
+ function="ParticipantList.EnableItem.Moderate"
+ parameter="can_moderate_voice" />
+ </menu_item_call>
</context_menu>
</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml
index f1117d1419..92752a0fee 100644
--- a/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<menu name="menu_group_plus"
left="0" bottom="0" visible="false"
- mouse_opaque="false" opaque="true" color="MenuDefaultBgColor" drop_shadow="false">
+ mouse_opaque="false">
<menu_item_check
label="Sort by Name"
name="sort_name">
diff --git a/indra/newview/skins/default/xui/en/menu_people_groups.xml b/indra/newview/skins/default/xui/en/menu_people_groups.xml
index afa680139d..8f89d37dbb 100644
--- a/indra/newview/skins/default/xui/en/menu_people_groups.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_groups.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<menu name="menu_group_plus"
left="0" bottom="0" visible="false"
- mouse_opaque="false" opaque="true" color="MenuDefaultBgColor" drop_shadow="false">
+ mouse_opaque="false" opaque="true" color="MenuDefaultBgColor">
<menu_item_call
label="View Info"
name="View Info">
diff --git a/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml
index df3cb26b04..2efb204ffb 100644
--- a/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_groups_view_sort.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<menu name="menu_group_plus"
left="0" bottom="0" visible="false"
- mouse_opaque="false" opaque="true" color="MenuDefaultBgColor" drop_shadow="false">
+ mouse_opaque="false">
<menu_item_check
label="Display Group Icons"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby.xml b/indra/newview/skins/default/xui/en/menu_people_nearby.xml
index c4da1df017..d2e35e4cc0 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby.xml
@@ -20,6 +20,16 @@
parameter="can_add" />
</menu_item_call>
<menu_item_call
+ label="Remove Friend"
+ layout="topleft"
+ name="Remove Friend">
+ <menu_item_call.on_click
+ function="Avatar.RemoveFriend" />
+ <menu_item_call.on_enable
+ function="Avatar.EnableItem"
+ parameter="can_delete" />
+ </menu_item_call>
+ <menu_item_call
label="IM"
layout="topleft"
name="IM">
@@ -37,6 +47,16 @@
parameter="can_call" />
</menu_item_call>
<menu_item_call
+ label="Map"
+ layout="topleft"
+ name="Map">
+ <menu_item_call.on_click
+ function="Avatar.ShowOnMap" />
+ <menu_item_call.on_enable
+ function="Avatar.EnableItem"
+ parameter="can_show_on_map" />
+ </menu_item_call>
+ <menu_item_call
label="Share"
layout="topleft"
name="Share">
@@ -68,5 +88,8 @@
name="teleport">
<menu_item_call.on_click
function="Avatar.OfferTeleport"/>
+ <menu_item_call.on_enable
+ function="Avatar.EnableItem"
+ parameter="can_offer_teleport"/>
</menu_item_call>
</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml
index 0d3dd3366d..588342595e 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby_multiselect.xml
@@ -14,6 +14,16 @@
parameter="can_add" />
</menu_item_call>
<menu_item_call
+ label="Remove Friends"
+ layout="topleft"
+ name="Remove Friend">
+ <menu_item_call.on_click
+ function="Avatar.RemoveFriend" />
+ <menu_item_call.on_enable
+ function="Avatar.EnableItem"
+ parameter="can_delete" />
+ </menu_item_call>
+ <menu_item_call
label="IM"
layout="topleft"
name="IM">
diff --git a/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml
index 39f9e48609..69b3831738 100644
--- a/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_nearby_view_sort.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<menu name="menu_group_plus"
left="0" bottom="0" visible="false"
- mouse_opaque="false" opaque="true" color="MenuDefaultBgColor" drop_shadow="false">
+ mouse_opaque="false">
<menu_item_check
label="Sort by Recent Speakers"
name="sort_by_recent_speakers">
diff --git a/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml
index cfd6dc78b6..5c9555db92 100644
--- a/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_recent_view_sort.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<menu name="menu_group_plus"
left="0" bottom="0" visible="false"
- mouse_opaque="false" opaque="true" color="MenuDefaultBgColor" drop_shadow="false">
+ mouse_opaque="false">
<menu_item_check
label="Sort by Most Recent"
name="sort_most">
diff --git a/indra/newview/skins/default/xui/en/menu_picks.xml b/indra/newview/skins/default/xui/en/menu_picks.xml
index 7e07a97016..ebb49c9004 100644
--- a/indra/newview/skins/default/xui/en/menu_picks.xml
+++ b/indra/newview/skins/default/xui/en/menu_picks.xml
@@ -8,6 +8,9 @@
name="pick_info">
<menu_item_call.on_click
function="Pick.Info" />
+ <menu_item_call.on_enable
+ function="Pick.Enable"
+ parameter="info" />
</menu_item_call>
<menu_item_call
label="Edit"
@@ -16,6 +19,9 @@
visible="false">
<menu_item_call.on_click
function="Pick.Edit" />
+ <menu_item_call.on_enable
+ function="Pick.Enable"
+ parameter="edit" />
</menu_item_call>
<menu_item_call
label="Teleport"
@@ -23,6 +29,9 @@
name="pick_teleport">
<menu_item_call.on_click
function="Pick.Teleport" />
+ <menu_item_call.on_enable
+ function="Pick.Enable"
+ parameter="teleport" />
</menu_item_call>
<menu_item_call
label="Map"
@@ -30,6 +39,9 @@
name="pick_map">
<menu_item_call.on_click
function="Pick.Map" />
+ <menu_item_call.on_enable
+ function="Pick.Enable"
+ parameter="map" />
</menu_item_call>
<menu_item_separator
layout="topleft"
@@ -42,5 +54,8 @@
visible="false">
<menu_item_call.on_click
function="Pick.Delete" />
+ <menu_item_call.on_enable
+ function="Pick.Enable"
+ parameter="delete" />
</menu_item_call>
</context_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml
index 9b3948b29b..3e38503e43 100644
--- a/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml
+++ b/indra/newview/skins/default/xui/en/menu_places_gear_folder.xml
@@ -45,6 +45,9 @@
<on_click
function="Places.LandmarksGear.CopyPaste.Action"
parameter="copy" />
+ <on_enable
+ function="Places.LandmarksGear.Enable"
+ parameter="copy" />
</menu_item_call>
<menu_item_call
label="Paste"
@@ -88,6 +91,9 @@
<on_click
function="Places.LandmarksGear.Folding.Action"
parameter="expand" />
+ <on_enable
+ function="Places.LandmarksGear.Enable"
+ parameter="expand" />
</menu_item_call>
<menu_item_call
label="Collapse"
@@ -96,6 +102,9 @@
<on_click
function="Places.LandmarksGear.Folding.Action"
parameter="collapse" />
+ <on_enable
+ function="Places.LandmarksGear.Enable"
+ parameter="collapse" />
</menu_item_call>
<menu_item_call
label="Expand all folders"
diff --git a/indra/newview/skins/default/xui/en/menu_profile_overflow.xml b/indra/newview/skins/default/xui/en/menu_profile_overflow.xml
index 407ce14e81..b0b7b554b0 100644
--- a/indra/newview/skins/default/xui/en/menu_profile_overflow.xml
+++ b/indra/newview/skins/default/xui/en/menu_profile_overflow.xml
@@ -6,6 +6,15 @@
name="profile_overflow_menu"
width="120">
<menu_item_call
+ label="Map"
+ layout="topleft"
+ name="show_on_map">
+ <menu_item_call.on_click
+ function="Profile.ShowOnMap" />
+ <menu_item_call.on_enable
+ function="Profile.EnableShowOnMap" />
+ </menu_item_call>
+ <menu_item_call
label="Pay"
layout="topleft"
name="pay">
@@ -19,19 +28,22 @@
<menu_item_call.on_click
function="Profile.Share" />
</menu_item_call>
- <menu_item_check
- label="Block/Unblock"
- layout="topleft"
- name="block_unblock">
- <menu_item_check.on_click
- function="Profile.BlockUnblock" />
- <menu_item_check.on_check
- function="Profile.CheckItem"
- parameter="is_blocked" />
- <menu_item_check.on_enable
- function="Profile.EnableItem"
- parameter="can_block" />
- </menu_item_check>
+ <menu_item_call
+ label="Block"
+ name="block">
+ <menu_item_call.on_click
+ function="Profile.BlockUnblock"/>
+ <menu_item_call.on_visible
+ function="Profile.EnableBlock" />
+ </menu_item_call>
+ <menu_item_call
+ label="Unblock"
+ name="unblock">
+ <menu_item_call.on_click
+ function="Profile.BlockUnblock"/>
+ <menu_item_call.on_visible
+ function="Profile.EnableUnblock" />
+ </menu_item_call>
<menu_item_call
label="Kick"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_save_outfit.xml b/indra/newview/skins/default/xui/en/menu_save_outfit.xml
new file mode 100644
index 0000000000..6285bf7417
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_save_outfit.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<toggleable_menu
+ height="201"
+ layout="topleft"
+ mouse_opaque="false"
+ name="save_outfit_menu"
+ width="120">
+ <menu_item_call
+ name="save_outfit"
+ label="Save">
+ <menu_item_call.on_click
+ function="Outfit.Save.Action"
+ userdata=""/>
+ </menu_item_call>
+ <menu_item_call
+ name="save_as_new_outfit"
+ label="Save As">
+ <menu_item_call.on_click
+ function="Outfit.SaveAs.Action"
+ userdata="" />
+ </menu_item_call>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/en/menu_script_chiclet.xml b/indra/newview/skins/default/xui/en/menu_script_chiclet.xml
new file mode 100644
index 0000000000..db29d9cebc
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_script_chiclet.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu
+ height="101"
+ layout="topleft"
+ left="100"
+ mouse_opaque="false"
+ name="ScriptChiclet Menu"
+ top="724"
+ visible="false"
+ width="128">
+ <menu_item_call
+ label="Close"
+ layout="topleft"
+ name="Close">
+ <menu_item_call.on_click
+ function="ScriptChiclet.Action"
+ parameter="end" />
+ </menu_item_call>
+</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_topinfobar.xml b/indra/newview/skins/default/xui/en/menu_topinfobar.xml
new file mode 100644
index 0000000000..cbe249ed4d
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_topinfobar.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<menu
+ height="201"
+ layout="topleft"
+ left="100"
+ mouse_opaque="false"
+ name="menu_topinfobar"
+ top="624"
+ visible="false"
+ width="128">
+ <menu_item_check
+ label="Show Coordinates"
+ name="Show Coordinates">
+ <on_click
+ function="ToggleControl"
+ parameter="NavBarShowCoordinates" />
+ <on_check
+ function="CheckControl"
+ parameter="NavBarShowCoordinates" />
+ </menu_item_check>
+ <menu_item_check
+ label="Show Parcel Properties"
+ name="Show Parcel Properties">
+ <on_click
+ function="ToggleControl"
+ parameter="NavBarShowParcelProperties" />
+ <on_check
+ function="CheckControl"
+ parameter="NavBarShowParcelProperties" />
+ </menu_item_check>
+ <menu_item_separator
+ name="Separator" />
+ <!-- Label of 'Landmark' item is changing in runtime,
+ see AddLandmarkNavBarMenu/EditLandmarkNavBarMenu in strings.xml -->
+ <menu_item_call
+ label="Landmark"
+ name="Landmark">
+ <on_click
+ function="TopInfoBar.Action"
+ parameter="landmark" />
+ </menu_item_call>
+ <menu_item_separator
+ name="Separator" />
+ <menu_item_call
+ label="Copy"
+ name="Copy">
+ <on_click
+ function="TopInfoBar.Action"
+ parameter="copy" />
+ </menu_item_call>
+</menu>
diff --git a/indra/newview/skins/default/xui/en/menu_url_agent.xml b/indra/newview/skins/default/xui/en/menu_url_agent.xml
index fa05dac148..73f0fa7979 100644
--- a/indra/newview/skins/default/xui/en/menu_url_agent.xml
+++ b/indra/newview/skins/default/xui/en/menu_url_agent.xml
@@ -7,7 +7,7 @@
layout="topleft"
name="show_agent">
<menu_item_call.on_click
- function="Url.Execute" />
+ function="Url.ShowProfile" />
</menu_item_call>
<menu_item_separator
layout="topleft" />
diff --git a/indra/newview/skins/default/xui/en/menu_url_group.xml b/indra/newview/skins/default/xui/en/menu_url_group.xml
index c5eaf94d22..2cb125ce09 100644
--- a/indra/newview/skins/default/xui/en/menu_url_group.xml
+++ b/indra/newview/skins/default/xui/en/menu_url_group.xml
@@ -7,7 +7,7 @@
layout="topleft"
name="show_group">
<menu_item_call.on_click
- function="Url.Execute" />
+ function="Url.ShowProfile" />
</menu_item_call>
<menu_item_separator
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 22f4d277a4..3557318705 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -2,16 +2,13 @@
<menu_bar
bg_visible="false"
follows="left|top|right"
- layout="topleft"
name="Main Menu">
<menu
label="Me"
- layout="topleft"
name="Me"
tear_off="true">
<menu_item_call
label="Preferences"
- layout="topleft"
name="Preferences"
shortcut="control|P">
<menu_item_call.on_click
@@ -20,7 +17,6 @@
</menu_item_call>
<menu_item_call
label="My Dashboard"
- layout="topleft"
name="Manage My Account">
<menu_item_call.on_click
function="PromptShowURL"
@@ -29,25 +25,21 @@
</menu_item_call>
<menu_item_call
label="Buy L$"
- layout="topleft"
name="Buy and Sell L$">
<menu_item_call.on_click
function="BuyCurrency" />
</menu_item_call>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<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">
+ label="Change Outfit"
+ name="ChangeOutfit">
<menu_item_call.on_click
function="CustomizeAvatar" />
<menu_item_call.on_enable
@@ -55,9 +47,9 @@
</menu_item_call>
<menu_item_check
label="My Inventory"
- layout="topleft"
name="Inventory"
- shortcut="control|shift|I">
+ shortcut="control|shift|I"
+ visible="false">
<menu_item_check.on_check
function="Floater.Visible"
parameter="inventory" />
@@ -65,41 +57,52 @@
function="Floater.Toggle"
parameter="inventory" />
</menu_item_check>
- <menu_item_call
- label="Show Inventory in Side Tray"
+ <menu_item_check
+ label="My Inventory"
name="ShowSidetrayInventory"
shortcut="control|I"
- visible="false">
- <menu_item_call.on_click
+ visible="true">
+ <menu_item_check.on_check
+ function="SidetrayPanelVisible"
+ parameter="sidepanel_inventory" />
+ <menu_item_check.on_click
function="ShowSidetrayPanel"
parameter="sidepanel_inventory" />
- </menu_item_call>
- <menu_item_call
+ </menu_item_check>
+ <menu_item_check
label="My Gestures"
- layout="topleft"
name="Gestures"
shortcut="control|G">
- <menu_item_call.on_click
+ <menu_item_check.on_check
+ function="Floater.Visible"
+ parameter="gestures" />
+ <menu_item_check.on_click
function="Floater.Toggle"
parameter="gestures" />
- </menu_item_call>
+ </menu_item_check>
+ <menu_item_check
+ label="My Voice"
+ name="ShowVoice"
+ visibility_control="VoiceMorphingEnabled">
+ <menu_item_check.on_check
+ function="Floater.Visible"
+ parameter="voice_effect" />
+ <menu_item_check.on_click
+ function="Floater.Toggle"
+ parameter="voice_effect" />
+ </menu_item_check>
<menu
label="My Status"
- layout="topleft"
name="Status"
tear_off="true">
<menu_item_call
label="Away"
- layout="topleft"
name="Set Away">
<menu_item_call.on_click
function="World.SetAway" />
</menu_item_call>
- <menu_item_separator
- layout="topleft"/>
<menu_item_call
label="Busy"
- layout="topleft"
name="Set Busy">
<menu_item_call.on_click
function="World.SetBusy"/>
@@ -107,7 +110,6 @@
</menu>
<menu_item_call
label="Request Admin Status"
- layout="topleft"
name="Request Admin Options"
shortcut="control|alt|G"
visible="false">
@@ -116,18 +118,15 @@
</menu_item_call>
<menu_item_call
label="Leave Admin Status"
- layout="topleft"
name="Leave Admin Options"
shortcut="control|alt|shift|G"
visible="false">
<menu_item_call.on_click
function="Advanced.LeaveAdminStatus" />
</menu_item_call>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu_item_call
- label="Quit [APP_NAME]"
- layout="topleft"
+ label="Exit [APP_NAME]"
name="Quit"
shortcut="control|Q">
<menu_item_call.on_click
@@ -136,12 +135,10 @@
</menu>
<menu
label="Communicate"
- layout="topleft"
name="Communicate"
tear_off="true">
<menu_item_call
label="My Friends"
- layout="topleft"
name="My Friends"
shortcut="control|shift|F">
<menu_item_call.on_click
@@ -150,26 +147,24 @@
</menu_item_call>
<menu_item_call
label="My Groups"
- layout="topleft"
- name="My Groups">
+ name="My Groups"
+ shortcut="control|shift|G">
<menu_item_call.on_click
function="SideTray.PanelPeopleTab"
parameter="groups_panel" />
</menu_item_call>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<!--menu_item_call
label="Chat"
- layout="topleft"
name="Chat">
<menu_item_call.on_click
function="World.Chat" />
</menu_item_call-->
<menu_item_check
label="Nearby Chat"
- layout="topleft"
name="Nearby Chat"
- shortcut="control|H">
+ shortcut="control|H"
+ use_mac_ctrl="true">
<menu_item_check.on_check
function="Floater.Visible"
parameter="nearby_chat" />
@@ -179,34 +174,19 @@
</menu_item_check>
<menu_item_call
label="Nearby People"
- layout="topleft"
name="Active Speakers"
shortcut="control|shift|A">
<menu_item_call.on_click
function="SideTray.PanelPeopleTab"
parameter="nearby_panel" />
</menu_item_call>
- <menu_item_check
- label="Nearby Media"
- layout="topleft"
- name="Nearby Media"
- shortcut="control|alt|N">
- <menu_item_check.on_check
- function="Floater.Visible"
- parameter="nearby_media" />
- <menu_item_check.on_click
- function="Floater.Toggle"
- parameter="nearby_media" />
- </menu_item_check>
</menu>
<menu
label="World"
- layout="topleft"
name="World"
tear_off="true">
<menu_item_check
label="Mini-Map"
- layout="topleft"
name="Mini-Map"
shortcut="control|shift|M">
<menu_item_check.on_check
@@ -218,7 +198,6 @@
</menu_item_check>
<menu_item_check
label="World Map"
- layout="topleft"
name="World Map"
shortcut="control|M"
use_mac_ctrl="true">
@@ -231,7 +210,6 @@
</menu_item_check>
<menu_item_call
label="Snapshot"
- layout="topleft"
name="Take Snapshot"
shortcut="control|shift|S">
<menu_item_call.on_click
@@ -240,7 +218,6 @@
</menu_item_call>
<menu_item_call
label="Landmark This Place"
- layout="topleft"
name="Create Landmark Here">
<menu_item_call.on_click
function="World.CreateLandmark" />
@@ -250,12 +227,17 @@
<menu
create_jump_keys="true"
label="Place Profile"
- layout="topleft"
name="Land"
tear_off="true">
<menu_item_call
- label="About Land"
+ label="Place Profile"
layout="topleft"
+ name="Place Profile">
+ <menu_item_call.on_click
+ function="World.PlaceProfile" />
+ </menu_item_call>
+ <menu_item_call
+ label="About Land"
name="About Land">
<menu_item_call.on_click
function="Floater.Show"
@@ -263,18 +245,15 @@
</menu_item_call>
<menu_item_call
label="Region/Estate"
- layout="topleft"
name="Region/Estate">
<menu_item_call.on_click
function="Floater.Show"
parameter="region_info" />
</menu_item_call>
</menu>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu_item_call
label="Buy This Land"
- layout="topleft"
name="Buy Land">
<menu_item_call.on_click
function="Land.Buy" />
@@ -283,7 +262,6 @@
</menu_item_call>
<menu_item_call
label="My Land"
- layout="topleft"
name="My Land">
<menu_item_call.on_click
function="Floater.Show"
@@ -292,34 +270,28 @@
<menu
create_jump_keys="true"
label="Show"
- layout="topleft"
name="LandShow"
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" />
+ function="World.Toggle.MovementControls" />
</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" />
+ function="World.Toggle.CameraControls" />
</menu_item_check>
<menu_item_check
label="Ban Lines"
- layout="topleft"
name="Ban Lines">
<menu_item_check.on_check
control="ShowBanLines" />
@@ -329,7 +301,6 @@
</menu_item_check>
<menu_item_check
label="Beacons"
- layout="topleft"
name="beacons"
shortcut="control|alt|shift|N">
<menu_item_check.on_check
@@ -341,7 +312,6 @@
</menu_item_check>
<menu_item_check
label="Property Lines"
- layout="topleft"
name="Property Lines"
shortcut="control|alt|shift|P">
<menu_item_check.on_check
@@ -352,7 +322,6 @@
</menu_item_check>
<menu_item_check
label="Land Owners"
- layout="topleft"
name="Land Owners">
<menu_item_check.on_check
control="ShowParcelOwners" />
@@ -360,12 +329,28 @@
function="ToggleControl"
parameter="ShowParcelOwners" />
</menu_item_check>
+ <menu_item_check
+ label="Coordinates"
+ name="Coordinates">
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="NavBarShowCoordinates" />
+ <menu_item_check.on_check
+ control="NavBarShowCoordinates" />
+ </menu_item_check>
+ <menu_item_check
+ label="Parcel Properties"
+ name="Parcel Properties">
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="NavBarShowParcelProperties" />
+ <menu_item_check.on_check
+ control="NavBarShowParcelProperties" />
+ </menu_item_check>
</menu>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu_item_call
label="Teleport Home"
- layout="topleft"
name="Teleport Home"
shortcut="control|shift|H">
<menu_item_call.on_click
@@ -375,7 +360,6 @@
</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" />
@@ -384,7 +368,6 @@
</menu_item_call>
<!-- <menu_item_check
label="Show Navigation Bar"
- layout="topleft"
name="ShowNavbarNavigationPanel">
<menu_item_check.on_click
function="ToggleControl"
@@ -395,7 +378,6 @@
</menu_item_check>
<menu_item_check
label="Show Favorites Bar"
- layout="topleft"
name="ShowNavbarFavoritesPanel">
<menu_item_check.on_click
function="ToggleControl"
@@ -404,19 +386,15 @@
function="CheckControl"
parameter="ShowNavbarFavoritesPanel" />
</menu_item_check>
- <menu_item_separator
- layout="topleft" />-->
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>-->
+ <menu_item_separator/>
<menu
create_jump_keys="true"
label="Sun"
- layout="topleft"
name="Environment Settings"
tear_off="true">
<menu_item_call
label="Sunrise"
- layout="topleft"
name="Sunrise">
<menu_item_call.on_click
function="World.EnvSettings"
@@ -424,7 +402,6 @@
</menu_item_call>
<menu_item_call
label="Midday"
- layout="topleft"
name="Noon"
shortcut="control|shift|Y">
<menu_item_call.on_click
@@ -433,7 +410,6 @@
</menu_item_call>
<menu_item_call
label="Sunset"
- layout="topleft"
name="Sunset"
shortcut="control|shift|N">
<menu_item_call.on_click
@@ -442,7 +418,6 @@
</menu_item_call>
<menu_item_call
label="Midnight"
- layout="topleft"
name="Midnight">
<menu_item_call.on_click
function="World.EnvSettings"
@@ -450,17 +425,14 @@
</menu_item_call>
<menu_item_call
label="Estate Time"
- layout="topleft"
name="Revert to Region Default">
<menu_item_call.on_click
function="World.EnvSettings"
parameter="default" />
</menu_item_call>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu_item_call
label="Environment Editor"
- layout="topleft"
name="Environment Editor">
<menu_item_call.on_click
function="World.EnvSettings"
@@ -471,13 +443,11 @@
<menu
create_jump_keys="true"
label="Build"
- layout="topleft"
name="BuildTools"
tear_off="true"
visible="true">
<menu_item_check
label="Build"
- layout="topleft"
name="Show Build Tools"
shortcut="control|B">
<menu_item_check.on_check
@@ -490,12 +460,10 @@
<menu
create_jump_keys="true"
label="Select Build Tool"
- layout="topleft"
name="Select Tool"
tear_off="true">
<menu_item_call
label="Focus Tool"
- layout="topleft"
name="Focus"
shortcut="control|1">
<menu_item_call.on_click
@@ -504,7 +472,6 @@
</menu_item_call>
<menu_item_call
label="Move Tool"
- layout="topleft"
name="Move"
shortcut="control|2">
<menu_item_call.on_click
@@ -513,7 +480,6 @@
</menu_item_call>
<menu_item_call
label="Edit Tool"
- layout="topleft"
name="Edit"
shortcut="control|3">
<menu_item_call.on_click
@@ -522,7 +488,6 @@
</menu_item_call>
<menu_item_call
label="Create Tool"
- layout="topleft"
name="Create"
shortcut="control|4">
<menu_item_call.on_click
@@ -531,7 +496,6 @@
</menu_item_call>
<menu_item_call
label="Land Tool"
- layout="topleft"
name="Land"
shortcut="control|5">
<menu_item_call.on_click
@@ -539,112 +503,8 @@
parameter="land" />
</menu_item_call>
</menu>
- <menu
- create_jump_keys="true"
- label="Edit"
- layout="topleft"
- name="Edit"
- tear_off="true">
- <menu_item_call
- label="Undo"
- layout="topleft"
- name="Undo"
- shortcut="control|Z">
- <menu_item_call.on_click
- function="Edit.Undo" />
- <menu_item_call.on_enable
- function="Edit.EnableUndo" />
- </menu_item_call>
- <menu_item_call
- label="Redo"
- layout="topleft"
- name="Redo"
- shortcut="control|Y">
- <menu_item_call.on_click
- function="Edit.Redo" />
- <menu_item_call.on_enable
- function="Edit.EnableRedo" />
- </menu_item_call>
- <menu_item_separator
- layout="topleft" />
- <menu_item_call
- label="Cut"
- layout="topleft"
- name="Cut"
- shortcut="control|X">
- <menu_item_call.on_click
- function="Edit.Cut" />
- <menu_item_call.on_enable
- function="Edit.EnableCut" />
- </menu_item_call>
- <menu_item_call
- label="Copy"
- layout="topleft"
- name="Copy"
- shortcut="control|C">
- <menu_item_call.on_click
- function="Edit.Copy" />
- <menu_item_call.on_enable
- function="Edit.EnableCopy" />
- </menu_item_call>
- <menu_item_call
- label="Paste"
- layout="topleft"
- name="Paste"
- shortcut="control|V">
- <menu_item_call.on_click
- function="Edit.Paste" />
- <menu_item_call.on_enable
- function="Edit.EnablePaste" />
- </menu_item_call>
- <menu_item_call
- label="Delete"
- layout="topleft"
- name="Delete"
- shortcut="Del">
- <menu_item_call.on_click
- function="Edit.Delete" />
- <menu_item_call.on_enable
- function="Edit.EnableDelete" />
- </menu_item_call>
- <menu_item_call
- label="Duplicate"
- layout="topleft"
- name="Duplicate"
- shortcut="control|D">
- <menu_item_call.on_click
- function="Edit.Duplicate" />
- <menu_item_call.on_enable
- function="Edit.EnableDuplicate" />
- </menu_item_call>
- <menu_item_separator
- layout="topleft" />
- <menu_item_call
- label="Select All"
- layout="topleft"
- name="Select All"
- shortcut="control|A">
- <menu_item_call.on_click
- function="Edit.SelectAll" />
- <menu_item_call.on_enable
- function="Edit.EnableSelectAll" />
- </menu_item_call>
- <menu_item_call
- label="Deselect"
- layout="topleft"
- name="Deselect"
- shortcut="control|E">
- <menu_item_call.on_click
- function="Edit.Deselect" />
- <menu_item_call.on_enable
- function="Edit.EnableDeselect" />
- </menu_item_call>
- </menu>
- <menu_item_separator
- layout="topleft" />
<menu_item_call
label="Link"
- layout="topleft"
name="Link"
shortcut="control|L">
<menu_item_call.on_click
@@ -654,7 +514,6 @@
</menu_item_call>
<menu_item_call
label="Unlink"
- layout="topleft"
name="Unlink"
shortcut="control|shift|L">
<menu_item_call.on_click
@@ -664,7 +523,6 @@
</menu_item_call>
<menu_item_check
label="Edit Linked Parts"
- layout="topleft"
name="Edit Linked Parts">
<menu_item_check.on_check
control="EditLinkedParts" />
@@ -674,11 +532,55 @@
<menu_item_check.on_enable
function="Tools.EnableToolNotPie" />
</menu_item_check>
- <menu_item_separator
- layout="topleft" />
+ <menu
+ create_jump_keys="true"
+ label="Select Linked Parts"
+ name="Select Linked Parts"
+ tear_off="true">
+ <menu_item_call
+ label="Select Next Part"
+ name="Select Next Part"
+ shortcut="control|.">
+ <menu_item_call.on_click
+ function="Tools.SelectNextPart"
+ parameter="next" />
+ <menu_item_call.on_enable
+ function="Tools.EnableSelectNextPart" />
+ </menu_item_call>
+ <menu_item_call
+ label="Select Previous Part"
+ name="Select Previous Part"
+ shortcut="control|,">
+ <menu_item_call.on_click
+ function="Tools.SelectNextPart"
+ parameter="previous" />
+ <menu_item_call.on_enable
+ function="Tools.EnableSelectNextPart" />
+ </menu_item_call>
+ <menu_item_call
+ label="Include Next Part"
+ name="Include Next Part"
+ shortcut="control|shift|.">
+ <menu_item_call.on_click
+ function="Tools.SelectNextPart"
+ parameter="includenext" />
+ <menu_item_call.on_enable
+ function="Tools.EnableSelectNextPart" />
+ </menu_item_call>
+ <menu_item_call
+ label="Include Previous Part"
+ name="Include Previous Part"
+ shortcut="control|shift|,">
+ <menu_item_call.on_click
+ function="Tools.SelectNextPart"
+ parameter="includeprevious" />
+ <menu_item_call.on_enable
+ function="Tools.EnableSelectNextPart" />
+ </menu_item_call>
+ </menu>
+ <menu_item_separator/>
<menu_item_call
label="Focus on Selection"
- layout="topleft"
name="Focus on Selection"
shortcut="H">
<menu_item_call.on_click
@@ -689,7 +591,6 @@
</menu_item_call>
<menu_item_call
label="Zoom to Selection"
- layout="topleft"
name="Zoom to Selection"
shortcut="shift|H">
<menu_item_call.on_click
@@ -698,29 +599,34 @@
<menu_item_call.on_enable
function="Tools.SomethingSelectedNoHUD" />
</menu_item_call>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu
create_jump_keys="true"
label="Object"
- layout="topleft"
name="Object"
tear_off="true">
<menu_item_call
- label="Buy"
- layout="topleft"
- name="Menu Object Take"
- visible="true">
- <menu_item_call.on_click
- function="Tools.BuyOrTake" />
- <menu_item_call.on_enable
- function="Tools.EnableBuyOrTake"
- name="EnableBuyOrTake"
- parameter="Buy,Take" />
+ label="Buy"
+ name="Menu Object Buy">
+ <menu_item_call.on_click
+ function="Tools.BuyOrTake"/>
+ <menu_item_call.on_visible
+ function="Tools.VisibleBuyObject"/>
+ <menu_item_call.on_enable
+ function="Tools.EnableBuyOrTake"/>
+ </menu_item_call>
+ <menu_item_call
+ label="Take"
+ name="Menu Object Take">
+ <menu_item_call.on_click
+ function="Tools.BuyOrTake"/>
+ <menu_item_call.on_visible
+ function="Tools.VisibleTakeObject"/>
+ <menu_item_call.on_enable
+ function="Tools.EnableBuyOrTake"/>
</menu_item_call>
<menu_item_call
label="Take Copy"
- layout="topleft"
name="Take Copy">
<menu_item_call.on_click
function="Tools.TakeCopy" />
@@ -729,7 +635,6 @@
</menu_item_call>
<menu_item_call
label="Save Back to My Inventory"
- layout="topleft"
name="Save Object Back to My Inventory">
<menu_item_call.on_click
function="Tools.SaveToInventory" />
@@ -738,7 +643,6 @@
</menu_item_call>
<menu_item_call
label="Save Back to Object Contents"
- layout="topleft"
name="Save Object Back to Object Contents">
<menu_item_call.on_click
function="Tools.SaveToObjectInventory" />
@@ -749,12 +653,10 @@
<menu
create_jump_keys="true"
label="Scripts"
- layout="topleft"
name="Scripts"
tear_off="true">
<menu_item_call
label="Recompile Scripts (Mono)"
- layout="topleft"
name="Mono">
<menu_item_call.on_click
function="Tools.SelectedScriptAction"
@@ -764,7 +666,6 @@
</menu_item_call>
<menu_item_call
label="Recompile Scripts (LSL)"
- layout="topleft"
name="LSL">
<menu_item_call.on_click
function="Tools.SelectedScriptAction"
@@ -774,7 +675,6 @@
</menu_item_call>
<menu_item_call
label="Reset Scripts"
- layout="topleft"
name="Reset Scripts">
<menu_item_call.on_click
function="Tools.SelectedScriptAction"
@@ -784,7 +684,6 @@
</menu_item_call>
<menu_item_call
label="Set Scripts to Running"
- layout="topleft"
name="Set Scripts to Running">
<menu_item_call.on_click
function="Tools.SelectedScriptAction"
@@ -794,7 +693,6 @@
</menu_item_call>
<menu_item_call
label="Set Scripts to Not Running"
- layout="topleft"
name="Set Scripts to Not Running">
<menu_item_call.on_click
function="Tools.SelectedScriptAction"
@@ -803,17 +701,14 @@
function="EditableSelected" />
</menu_item_call>
</menu>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu
create_jump_keys="true"
label="Options"
- layout="topleft"
name="Options"
tear_off="true">
<menu_item_call
label="Set Default Upload Permissions"
- layout="topleft"
name="perm prefs">
<menu_item_call.on_click
function="Floater.Toggle"
@@ -821,7 +716,6 @@
</menu_item_call>
<menu_item_check
label="Show Advanced Permissions"
- layout="topleft"
name="DebugPermissions">
<menu_item_check.on_check
function="CheckControl"
@@ -830,11 +724,9 @@
function="ToggleControl"
parameter="DebugPermissions" />
</menu_item_check>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu_item_check
label="Select Only My Objects"
- layout="topleft"
name="Select Only My Objects">
<menu_item_check.on_check
control="SelectOwnedOnly" />
@@ -844,7 +736,6 @@
</menu_item_check>
<menu_item_check
label="Select Only Movable Objects"
- layout="topleft"
name="Select Only Movable Objects">
<menu_item_check.on_check
control="SelectMovableOnly" />
@@ -854,18 +745,15 @@
</menu_item_check>
<menu_item_check
label="Select By Surrounding"
- layout="topleft"
name="Select By Surrounding">
<menu_item_check.on_check
control="RectangleSelectInclusive" />
<menu_item_check.on_click
function="Tools.SelectBySurrounding" />
</menu_item_check>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu_item_check
label="Show Hidden Selection"
- layout="topleft"
name="Show Hidden Selection">
<menu_item_check.on_check
control="RenderHiddenSelections" />
@@ -874,7 +762,6 @@
</menu_item_check>
<menu_item_check
label="Show Light Radius for Selection"
- layout="topleft"
name="Show Light Radius for Selection">
<menu_item_check.on_check
control="RenderLightRadius" />
@@ -883,7 +770,6 @@
</menu_item_check>
<menu_item_check
label="Show Selection Beam"
- layout="topleft"
name="Show Selection Beam">
<menu_item_check.on_check
control="ShowSelectionBeam" />
@@ -891,11 +777,9 @@
function="ToggleControl"
parameter="ShowSelectionBeam" />
</menu_item_check>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu_item_check
label="Snap to Grid"
- layout="topleft"
name="Snap to Grid"
shortcut="G">
<menu_item_check.on_check
@@ -908,7 +792,6 @@
</menu_item_check>
<menu_item_call
label="Snap Object XY to Grid"
- layout="topleft"
name="Snap Object XY to Grid"
shortcut="shift|X">
<menu_item_call.on_click
@@ -918,7 +801,6 @@
</menu_item_call>
<menu_item_call
label="Use Selection for Grid"
- layout="topleft"
name="Use Selection for Grid"
shortcut="shift|G">
<menu_item_call.on_click
@@ -928,7 +810,6 @@
</menu_item_call>
<menu_item_call
label="Grid Options"
- layout="topleft"
name="Grid Options"
shortcut="control|shift|B">
<menu_item_call.on_click
@@ -940,100 +821,98 @@
</menu>
<menu
create_jump_keys="true"
- label="Select Linked Parts"
+ label="Upload"
layout="topleft"
- name="Select Linked Parts"
+ name="Upload"
tear_off="true">
<menu_item_call
- label="Select Next Part"
+ label="Image (L$[COST])..."
layout="topleft"
- name="Select Next Part"
- shortcut="control|.">
+ name="Upload Image"
+ shortcut="control|U">
<menu_item_call.on_click
- function="Tools.SelectNextPart"
- parameter="next" />
+ function="File.UploadImage"
+ parameter="" />
<menu_item_call.on_enable
- function="Tools.EnableSelectNextPart" />
+ function="File.EnableUpload" />
+ <menu_item_call.on_visible
+ function="Upload.CalculateCosts"
+ parameter="Upload Image" />
</menu_item_call>
<menu_item_call
- label="Select Previous Part"
+ label="Sound (L$[COST])..."
layout="topleft"
- name="Select Previous Part"
- shortcut="control|,">
+ name="Upload Sound">
<menu_item_call.on_click
- function="Tools.SelectNextPart"
- parameter="previous" />
+ function="File.UploadSound"
+ parameter="" />
<menu_item_call.on_enable
- function="Tools.EnableSelectNextPart" />
+ function="File.EnableUpload" />
+ <menu_item_call.on_visible
+ function="Upload.CalculateCosts"
+ parameter="Upload Sound" />
</menu_item_call>
<menu_item_call
- label="Include Next Part"
+ label="Animation (L$[COST])..."
layout="topleft"
- name="Include Next Part"
- shortcut="control|shift|.">
+ name="Upload Animation">
<menu_item_call.on_click
- function="Tools.SelectNextPart"
- parameter="includenext" />
+ function="File.UploadAnim"
+ parameter="" />
<menu_item_call.on_enable
- function="Tools.EnableSelectNextPart" />
+ function="File.EnableUpload" />
+ <menu_item_call.on_visible
+ function="Upload.CalculateCosts"
+ parameter="Upload Animation" />
</menu_item_call>
<menu_item_call
- label="Include Previous Part"
+ label="Bulk (L$[COST] per file)..."
layout="topleft"
- name="Include Previous Part"
- shortcut="control|shift|,">
+ name="Bulk Upload">
<menu_item_call.on_click
- function="Tools.SelectNextPart"
- parameter="includeprevious" />
- <menu_item_call.on_enable
- function="Tools.EnableSelectNextPart" />
+ function="File.UploadBulk"
+ parameter="" />
</menu_item_call>
+ <menu_item_separator
+ layout="topleft" />
</menu>
</menu>
<menu
label="Help"
- layout="topleft"
name="Help"
tear_off="true">
<menu_item_call
label="[SECOND_LIFE] Help"
- layout="topleft"
name="Second Life Help"
shortcut="F1">
<menu_item_call.on_click
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_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu_item_call
label="Report Abuse"
- layout="topleft"
name="Report Abuse">
<menu_item_call.on_click
function="ReportAbuse" />
</menu_item_call>
<menu_item_call
label="Report Bug"
- layout="topleft"
name="Report Bug">
<menu_item_call.on_click
function="ShowHelp"
parameter="report_bug" />
</menu_item_call>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu_item_call
label="About [APP_NAME]"
- layout="topleft"
name="About Second Life">
<menu_item_call.on_click
function="Floater.Show"
@@ -1042,20 +921,28 @@
</menu>
<menu
label="Advanced"
- layout="topleft"
name="Advanced"
tear_off="true"
visible="false">
+ <menu_item_check
+ label="Show Advanced Menu"
+ name="Show Advanced Menu"
+ shortcut="control|alt|shift|D">
+ <on_check
+ function="CheckControl"
+ parameter="UseDebugMenus" />
+ <on_click
+ function="ToggleControl"
+ parameter="UseDebugMenus" />
+ </menu_item_check>
<menu_item_call
label="Stop Animating Me"
- layout="topleft"
name="Stop Animating My Avatar">
<menu_item_call.on_click
function="Tools.StopAllAnimations" />
</menu_item_call>
<menu_item_call
label="Rebake Textures"
- layout="topleft"
name="Rebake Texture"
shortcut="control|alt|R">
<menu_item_call.on_click
@@ -1063,7 +950,6 @@
</menu_item_call>
<menu_item_call
label="Set UI Size to Default"
- layout="topleft"
name="Set UI Size to Default">
<menu_item_call.on_click
function="View.DefaultUISize" />
@@ -1078,7 +964,6 @@
<menu_item_separator/>
<menu_item_check
label="Limit Select Distance"
- layout="topleft"
name="Limit Select Distance">
<menu_item_check.on_check
function="CheckControl"
@@ -1089,7 +974,6 @@
</menu_item_check>
<menu_item_check
label="Disable Camera Constraints"
- layout="topleft"
name="Disable Camera Distance">
<menu_item_check.on_check
function="CheckControl"
@@ -1098,11 +982,9 @@
function="ToggleControl"
parameter="DisableCameraConstraints" />
</menu_item_check>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu_item_check
label="High-res Snapshot"
- layout="topleft"
name="HighResSnapshot">
<menu_item_check.on_check
function="CheckControl"
@@ -1113,7 +995,6 @@
</menu_item_check>
<menu_item_check
label="Quiet Snapshots to Disk"
- layout="topleft"
name="QuietSnapshotsToDisk">
<menu_item_check.on_check
function="CheckControl"
@@ -1124,7 +1005,6 @@
</menu_item_check>
<menu_item_check
label="Compress Snapshots to Disk"
- layout="topleft"
name="CompressSnapshotsToDisk">
<menu_item_check.on_check
function="CheckControl"
@@ -1133,17 +1013,14 @@
function="ToggleControl"
parameter="CompressSnapshotsToDisk" />
</menu_item_check>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu
create_jump_keys="true"
label="Performance Tools"
- layout="topleft"
name="Performance Tools"
tear_off="true">
<menu_item_call
label="Lag Meter"
- layout="topleft"
name="Lag Meter">
<menu_item_call.on_click
function="Floater.Show"
@@ -1151,7 +1028,6 @@
</menu_item_call>
<menu_item_check
label="Statistics Bar"
- layout="topleft"
name="Statistics Bar"
shortcut="control|shift|1">
<menu_item_check.on_check
@@ -1163,7 +1039,6 @@
</menu_item_check>
<menu_item_check
label="Show Avatar Rendering Cost"
- layout="topleft"
name="Avatar Rendering Cost">
<menu_item_check.on_check
function="Advanced.CheckInfoDisplay"
@@ -1176,12 +1051,10 @@
<menu
create_jump_keys="true"
label="Highlighting and Visibility"
- layout="topleft"
name="Highlighting and Visibility"
tear_off="true">
<menu_item_check
label="Cheesy Beacon"
- layout="topleft"
name="Cheesy Beacon">
<menu_item_check.on_check
function="CheckControl"
@@ -1192,7 +1065,6 @@
</menu_item_check>
<menu_item_check
label="Hide Particles"
- layout="topleft"
name="Hide Particles"
shortcut="control|alt|shift|=">
<menu_item_check.on_check
@@ -1204,7 +1076,6 @@
</menu_item_check>
<menu_item_check
label="Hide Selected"
- layout="topleft"
name="Hide Selected">
<menu_item_check.on_check
function="CheckControl"
@@ -1215,7 +1086,6 @@
</menu_item_check>
<menu_item_check
label="Highlight Transparent"
- layout="topleft"
name="Highlight Transparent"
shortcut="control|alt|T">
<menu_item_check.on_check
@@ -1225,7 +1095,6 @@
</menu_item_check>
<menu_item_check
label="Show HUD Attachments"
- layout="topleft"
name="Show HUD Attachments"
shortcut="alt|shift|H">
<menu_item_check.on_check
@@ -1235,7 +1104,6 @@
</menu_item_check>
<menu_item_check
label="Show Mouselook Crosshairs"
- layout="topleft"
name="ShowCrosshairs">
<menu_item_check.on_check
function="CheckControl"
@@ -1247,12 +1115,10 @@
<!-- <menu
create_jump_keys="true"
label="Hover Tips"
- layout="topleft"
name="Hover Tips"
tear_off="true">
<menu_item_check
label="Show Tips"
- layout="topleft"
name="Show Tips"
shortcut="control|shift|T">
<menu_item_check.on_check
@@ -1260,11 +1126,9 @@
<menu_item_check.on_click
function="View.ShowHoverTips" />
</menu_item_check>
- <menu_item_separator
- layout="topleft" />-->
+ <menu_item_separator/>
<menu_item_check
label="Show Land Tooltips"
- layout="topleft"
name="Land Tips">
<menu_item_check.on_check
control="ShowLandHoverTip" />
@@ -1274,9 +1138,8 @@
<menu_item_check.on_enable
function="View.CheckShowHoverTips" />
</menu_item_check>
- <!-- <menu_item_check
+ <menu_item_check
label="Show Tips On All Objects"
- layout="topleft"
name="Tips On All Objects">
<menu_item_check.on_check
control="ShowAllObjectHoverTip" />
@@ -1293,12 +1156,10 @@
<menu
create_jump_keys="true"
label="Rendering Types"
- layout="topleft"
name="Rendering Types"
tear_off="true">
<menu_item_check
label="Simple"
- layout="topleft"
name="Simple"
shortcut="control|alt|shift|1">
<menu_item_check.on_check
@@ -1310,7 +1171,6 @@
</menu_item_check>
<menu_item_check
label="Alpha"
- layout="topleft"
name="Alpha"
shortcut="control|alt|shift|2">
<menu_item_check.on_check
@@ -1322,7 +1182,6 @@
</menu_item_check>
<menu_item_check
label="Tree"
- layout="topleft"
name="Tree"
shortcut="control|alt|shift|3">
<menu_item_check.on_check
@@ -1334,7 +1193,6 @@
</menu_item_check>
<menu_item_check
label="Avatars"
- layout="topleft"
name="Character"
shortcut="control|alt|shift|4">
<menu_item_check.on_check
@@ -1346,7 +1204,6 @@
</menu_item_check>
<menu_item_check
label="SurfacePath"
- layout="topleft"
name="SurfacePath"
shortcut="control|alt|shift|5">
<menu_item_check.on_check
@@ -1358,7 +1215,6 @@
</menu_item_check>
<menu_item_check
label="Sky"
- layout="topleft"
name="Sky"
shortcut="control|alt|shift|6">
<menu_item_check.on_check
@@ -1370,7 +1226,6 @@
</menu_item_check>
<menu_item_check
label="Water"
- layout="topleft"
name="Water"
shortcut="control|alt|shift|7">
<menu_item_check.on_check
@@ -1382,7 +1237,6 @@
</menu_item_check>
<menu_item_check
label="Ground"
- layout="topleft"
name="Ground"
shortcut="control|alt|shift|8">
<menu_item_check.on_check
@@ -1394,7 +1248,6 @@
</menu_item_check>
<menu_item_check
label="Volume"
- layout="topleft"
name="Volume"
shortcut="control|alt|shift|9">
<menu_item_check.on_check
@@ -1406,7 +1259,6 @@
</menu_item_check>
<menu_item_check
label="Grass"
- layout="topleft"
name="Grass"
shortcut="control|alt|shift|0">
<menu_item_check.on_check
@@ -1418,7 +1270,6 @@
</menu_item_check>
<menu_item_check
label="Clouds"
- layout="topleft"
name="Clouds"
shortcut="control|alt|shift|-">
<menu_item_check.on_check
@@ -1430,7 +1281,6 @@
</menu_item_check>
<menu_item_check
label="Particles"
- layout="topleft"
name="Particles"
shortcut="control|alt|shift|=">
<menu_item_check.on_check
@@ -1442,7 +1292,6 @@
</menu_item_check>
<menu_item_check
label="Bump"
- layout="topleft"
name="Bump"
shortcut="control|alt|shift|\">
<menu_item_check.on_check
@@ -1456,12 +1305,10 @@
<menu
create_jump_keys="true"
label="Rendering Features"
- layout="topleft"
name="Rendering Features"
tear_off="true">
<menu_item_check
label="UI"
- layout="topleft"
name="UI"
shortcut="control|alt|F1">
<menu_item_check.on_check
@@ -1473,7 +1320,6 @@
</menu_item_check>
<menu_item_check
label="Selected"
- layout="topleft"
name="Selected"
shortcut="control|alt|F2">
<menu_item_check.on_check
@@ -1485,7 +1331,6 @@
</menu_item_check>
<menu_item_check
label="Highlighted"
- layout="topleft"
name="Highlighted"
shortcut="control|alt|F3">
<menu_item_check.on_check
@@ -1497,7 +1342,6 @@
</menu_item_check>
<menu_item_check
label="Dynamic Textures"
- layout="topleft"
name="Dynamic Textures"
shortcut="control|alt|F4">
<menu_item_check.on_check
@@ -1509,7 +1353,6 @@
</menu_item_check>
<menu_item_check
label="Foot Shadows"
- layout="topleft"
name="Foot Shadows"
shortcut="control|alt|F5">
<menu_item_check.on_check
@@ -1521,7 +1364,6 @@
</menu_item_check>
<menu_item_check
label="Fog"
- layout="topleft"
name="Fog"
shortcut="control|alt|F6">
<menu_item_check.on_check
@@ -1533,7 +1375,6 @@
</menu_item_check>
<menu_item_check
label="Test FRInfo"
- layout="topleft"
name="Test FRInfo"
shortcut="control|alt|F8">
<menu_item_check.on_check
@@ -1545,7 +1386,6 @@
</menu_item_check>
<menu_item_check
label="Flexible Objects"
- layout="topleft"
name="Flexible Objects"
shortcut="control|alt|F9">
<menu_item_check.on_check
@@ -1558,7 +1398,6 @@
</menu>
<menu_item_check
label="Run Multiple Threads"
- layout="topleft"
name="Run Multiple Threads">
<menu_item_check.on_check
function="CheckControl"
@@ -1567,9 +1406,18 @@
function="ToggleControl"
parameter="RunMultipleThreads" />
</menu_item_check>
+ <menu_item_check
+ label="Use Plugin Read Thread"
+ name="Use Plugin Read Thread">
+ <menu_item_check.on_check
+ function="CheckControl"
+ parameter="PluginUseReadThread" />
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="PluginUseReadThread" />
+ </menu_item_check>
<menu_item_call
label="Clear Group Cache"
- layout="topleft"
name="ClearGroupCache">
<menu_item_call.on_click
function="Advanced.ClearGroupCache"
@@ -1577,7 +1425,6 @@
</menu_item_call>
<menu_item_check
label="Mouse Smoothing"
- layout="topleft"
name="Mouse Smoothing">
<menu_item_check.on_check
function="CheckControl"
@@ -1586,17 +1433,24 @@
function="ToggleControl"
parameter="MouseSmooth" />
</menu_item_check>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu
label="Shortcuts"
- layout="topleft"
name="Shortcuts"
tear_off="true"
visible="false">
+ <menu_item_call
+ label="Image (L$[COST])..."
+ name="Upload Image"
+ shortcut="control|U">
+ <menu_item_call.on_click
+ function="File.UploadImage"
+ parameter="" />
+ <menu_item_call.on_enable
+ function="File.EnableUpload" />
+ </menu_item_call>
<menu_item_check
label="Search"
- layout="topleft"
name="Search"
shortcut="control|F">
<menu_item_check.on_check
@@ -1609,7 +1463,6 @@
<menu_item_call
enabled="false"
label="Release Keys"
- layout="topleft"
name="Release Keys">
<menu_item_call.on_click
function="Tools.ReleaseKeys"
@@ -1620,16 +1473,25 @@
</menu_item_call>
<menu_item_call
label="Set UI Size to Default"
- layout="topleft"
name="Set UI Size to Default">
<menu_item_call.on_click
function="View.DefaultUISize" />
</menu_item_call>
- <menu_item_separator
- layout="topleft" />
+ <!-- This second, alternative shortcut for Show Advanced Menu is for backward compatibility. The main shortcut has been changed so it's Linux-friendly, where the old shortcut is typically eaten by the window manager. -->
+ <menu_item_check
+ label="Show Advanced Menu - legacy shortcut"
+ name="Show Advanced Menu - legacy shortcut"
+ shortcut="control|alt|D">
+ <on_check
+ function="CheckControl"
+ parameter="UseDebugMenus" />
+ <on_click
+ function="ToggleControl"
+ parameter="UseDebugMenus" />
+ </menu_item_check>
+ <menu_item_separator/>
<menu_item_check
label="Always Run"
- layout="topleft"
name="Always Run"
shortcut="control|R">
<menu_item_check.on_check
@@ -1639,7 +1501,6 @@
</menu_item_check>
<menu_item_check
label="Fly"
- layout="topleft"
name="Fly"
shortcut="Home">
<menu_item_check.on_check
@@ -1649,11 +1510,9 @@
<menu_item_check.on_enable
function="Agent.enableFlying" />
</menu_item_check>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu_item_call
label="Close Window"
- layout="topleft"
name="Close Window"
shortcut="control|W">
<menu_item_call.on_click
@@ -1663,7 +1522,6 @@
</menu_item_call>
<menu_item_call
label="Close All Windows"
- layout="topleft"
name="Close All Windows"
shortcut="control|shift|W">
<menu_item_call.on_click
@@ -1671,22 +1529,18 @@
<menu_item_call.on_enable
function="File.EnableCloseAllWindows" />
</menu_item_call>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu_item_call
label="Snapshot to Disk"
- layout="topleft"
name="Snapshot to Disk"
shortcut="control|`"
use_mac_ctrl="true">
<menu_item_call.on_click
function="File.TakeSnapshotToDisk" />
</menu_item_call>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu_item_call
label="Mouselook"
- layout="topleft"
name="Mouselook"
shortcut="M">
<menu_item_call.on_click
@@ -1696,7 +1550,6 @@
</menu_item_call>
<menu_item_check
label="Joystick Flycam"
- layout="topleft"
name="Joystick Flycam"
shortcut="alt|shift|F">
<menu_item_check.on_check
@@ -1708,7 +1561,6 @@
</menu_item_check>
<menu_item_call
label="Reset View"
- layout="topleft"
name="Reset View"
shortcut="Esc">
<menu_item_call.on_click
@@ -1716,7 +1568,6 @@
</menu_item_call>
<menu_item_call
label="Look at Last Chatter"
- layout="topleft"
name="Look at Last Chatter"
shortcut="control|\">
<menu_item_call.on_click
@@ -1724,17 +1575,14 @@
<menu_item_call.on_enable
function="View.EnableLastChatter" />
</menu_item_call>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu
create_jump_keys="true"
label="Select Build Tool"
- layout="topleft"
name="Select Tool"
tear_off="true">
<menu_item_call
label="Focus Tool"
- layout="topleft"
name="Focus"
shortcut="control|1">
<menu_item_call.on_click
@@ -1743,7 +1591,6 @@
</menu_item_call>
<menu_item_call
label="Move Tool"
- layout="topleft"
name="Move"
shortcut="control|2">
<menu_item_call.on_click
@@ -1752,7 +1599,6 @@
</menu_item_call>
<menu_item_call
label="Edit Tool"
- layout="topleft"
name="Edit"
shortcut="control|3">
<menu_item_call.on_click
@@ -1761,7 +1607,6 @@
</menu_item_call>
<menu_item_call
label="Create Tool"
- layout="topleft"
name="Create"
shortcut="control|4">
<menu_item_call.on_click
@@ -1770,7 +1615,6 @@
</menu_item_call>
<menu_item_call
label="Land Tool"
- layout="topleft"
name="Land"
shortcut="control|5">
<menu_item_call.on_click
@@ -1778,11 +1622,9 @@
parameter="land" />
</menu_item_call>
</menu>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu_item_call
label="Zoom In"
- layout="topleft"
name="Zoom In"
shortcut="control|0">
<menu_item_call.on_click
@@ -1790,7 +1632,6 @@
</menu_item_call>
<menu_item_call
label="Zoom Default"
- layout="topleft"
name="Zoom Default"
shortcut="control|9">
<menu_item_call.on_click
@@ -1798,29 +1639,15 @@
</menu_item_call>
<menu_item_call
label="Zoom Out"
- layout="topleft"
name="Zoom Out"
shortcut="control|8">
<menu_item_call.on_click
function="View.ZoomOut" />
</menu_item_call>
- <menu_item_separator
- layout="topleft" />
- <menu_item_call
- label="Toggle Fullscreen"
- layout="topleft"
- name="Toggle Fullscreen"
- >
- <!-- Note: shortcut="alt|Enter" was deleted from the preceding node-->
- <menu_item_call.on_click
- function="View.Fullscreen" />
- </menu_item_call>
</menu>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu_item_call
label="Show Debug Settings"
- layout="topleft"
name="Debug Settings">
<menu_item_call.on_click
function="Advanced.ShowDebugSettings"
@@ -1828,7 +1655,6 @@
</menu_item_call>
<menu_item_check
label="Show Develop Menu"
- layout="topleft"
name="Debug Mode"
shortcut="control|alt|Q">
<menu_item_check.on_check
@@ -1842,19 +1668,16 @@
<menu
create_jump_keys="true"
label="Develop"
- layout="topleft"
name="Develop"
tear_off="true"
visible="false">
<menu
create_jump_keys="true"
label="Consoles"
- layout="topleft"
name="Consoles"
tear_off="true">
<menu_item_check
label="Texture Console"
- layout="topleft"
name="Texture Console"
shortcut="control|shift|3"
use_mac_ctrl="true">
@@ -1867,7 +1690,6 @@
</menu_item_check>
<menu_item_check
label="Debug Console"
- layout="topleft"
name="Debug Console"
shortcut="control|shift|4"
use_mac_ctrl="true">
@@ -1880,7 +1702,6 @@
</menu_item_check>
<menu_item_call
label="Notifications Console"
- layout="topleft"
name="Notifications"
shortcut="control|shift|5">
<menu_item_call.on_click
@@ -1889,7 +1710,6 @@
</menu_item_call>
<menu_item_check
label="Texture Size Console"
- layout="topleft"
name="Texture Size"
shortcut="control|shift|6">
<menu_item_check.on_check
@@ -1901,7 +1721,6 @@
</menu_item_check>
<menu_item_check
label="Texture Category Console"
- layout="topleft"
name="Texture Category"
shortcut="control|shift|7">
<menu_item_check.on_check
@@ -1913,7 +1732,6 @@
</menu_item_check>
<menu_item_check
label="Fast Timers"
- layout="topleft"
name="Fast Timers"
shortcut="control|shift|9"
use_mac_ctrl="true">
@@ -1926,7 +1744,6 @@
</menu_item_check>
<menu_item_check
label="Memory"
- layout="topleft"
name="Memory"
shortcut="control|shift|0"
use_mac_ctrl="true">
@@ -1937,11 +1754,9 @@
function="Advanced.ToggleConsole"
parameter="memory view" />
</menu_item_check>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu_item_call
label="Region Info to Debug Console"
- layout="topleft"
name="Region Info to Debug Console">
<menu_item_call.on_click
function="Advanced.DumpInfoToConsole"
@@ -1949,7 +1764,6 @@
</menu_item_call>
<menu_item_call
label="Group Info to Debug Console"
- layout="topleft"
name="Group Info to Debug Console">
<menu_item_call.on_click
function="Advanced.DumpInfoToConsole"
@@ -1957,17 +1771,14 @@
</menu_item_call>
<menu_item_call
label="Capabilities Info to Debug Console"
- layout="topleft"
name="Capabilities Info to Debug Console">
<menu_item_call.on_click
function="Advanced.DumpInfoToConsole"
parameter="capabilities" />
</menu_item_call>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu_item_check
label="Camera"
- layout="topleft"
name="Camera">
<menu_item_check.on_check
function="Advanced.CheckHUDInfo"
@@ -1978,7 +1789,6 @@
</menu_item_check>
<menu_item_check
label="Wind"
- layout="topleft"
name="Wind">
<menu_item_check.on_check
function="Advanced.CheckHUDInfo"
@@ -1989,7 +1799,6 @@
</menu_item_check>
<menu_item_check
label="FOV"
- layout="topleft"
name="FOV">
<menu_item_check.on_check
function="Advanced.CheckHUDInfo"
@@ -2000,7 +1809,6 @@
</menu_item_check>
<menu_item_check
label="Badge"
- layout="topleft"
name="Badge"
shortcut="alt|control|shift|h">
<menu_item_check.on_check
@@ -2014,12 +1822,10 @@
<menu
create_jump_keys="true"
label="Show Info"
- layout="topleft"
name="Display Info"
tear_off="true">
<menu_item_check
label="Show Time"
- layout="topleft"
name="Show Time">
<menu_item_check.on_check
function="CheckControl"
@@ -2030,7 +1836,6 @@
</menu_item_check>
<menu_item_check
label="Show Render Info"
- layout="topleft"
name="Show Render Info">
<menu_item_check.on_check
function="CheckControl"
@@ -2041,7 +1846,6 @@
</menu_item_check>
<menu_item_check
label="Show Matrices"
- layout="topleft"
name="Show Matrices">
<menu_item_check.on_check
function="CheckControl"
@@ -2052,7 +1856,6 @@
</menu_item_check>
<menu_item_check
label="Show Color Under Cursor"
- layout="topleft"
name="Show Color Under Cursor">
<menu_item_check.on_check
function="CheckControl"
@@ -2061,11 +1864,9 @@
function="ToggleControl"
parameter="DebugShowColor" />
</menu_item_check>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu_item_check
label="Show Updates to Objects"
- layout="topleft"
name="Show Updates"
shortcut="control|alt|shift|U">
<menu_item_check.on_check
@@ -2075,17 +1876,14 @@
function="Advanced.ToggleShowObjectUpdates" />
</menu_item_check>
</menu>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu
create_jump_keys="true"
label="Force an Error"
- layout="topleft"
name="Force Errors"
tear_off="true">
<menu_item_call
label="Force Breakpoint"
- layout="topleft"
name="Force Breakpoint"
shortcut="control|alt|shift|B">
<menu_item_call.on_click
@@ -2093,49 +1891,42 @@
</menu_item_call>
<menu_item_call
label="Force LLError And Crash"
- layout="topleft"
name="Force LLError And Crash">
<menu_item_call.on_click
function="Advanced.ForceErrorLlerror" />
</menu_item_call>
<menu_item_call
label="Force Bad Memory Access"
- layout="topleft"
name="Force Bad Memory Access">
<menu_item_call.on_click
function="Advanced.ForceErrorBadMemoryAccess" />
</menu_item_call>
<menu_item_call
label="Force Infinite Loop"
- layout="topleft"
name="Force Infinite Loop">
<menu_item_call.on_click
function="Advanced.ForceErrorInfiniteLoop" />
</menu_item_call>
<menu_item_call
label="Force Driver Crash"
- layout="topleft"
name="Force Driver Carsh">
<menu_item_call.on_click
function="Advanced.ForceErrorDriverCrash" />
</menu_item_call>
<menu_item_call
label="Force Software Exception"
- layout="topleft"
name="Force Software Exception">
<menu_item_call.on_click
function="Advanced.ForceErrorSoftwareException" />
</menu_item_call>
<menu_item_call
label="Force Disconnect Viewer"
- layout="topleft"
name="Force Disconnect Viewer">
<menu_item_call.on_click
function="Advanced.ForceErrorDisconnectViewer" />
</menu_item_call>
<menu_item_call
label="Simulate a Memory Leak"
- layout="topleft"
name="Memory Leaking Simulation">
<menu_item_call.on_click
function="Floater.Show"
@@ -2145,12 +1936,10 @@
<menu
create_jump_keys="true"
label="Render Tests"
- layout="topleft"
name="Render Tests"
tear_off="true">
<menu_item_check
label="Camera Offset"
- layout="topleft"
name="Camera Offset">
<menu_item_check.on_check
function="CheckControl"
@@ -2161,7 +1950,6 @@
</menu_item_check>
<menu_item_check
label="Randomize Framerate"
- layout="topleft"
name="Randomize Framerate">
<menu_item_check.on_check
function="Advanced.CheckRandomizeFramerate"
@@ -2171,7 +1959,6 @@
</menu_item_check>
<menu_item_check
label="Periodic Slow Frame"
- layout="topleft"
name="Periodic Slow Frame">
<menu_item_check.on_check
function="Advanced.CheckPeriodicSlowFrame"
@@ -2182,7 +1969,6 @@
</menu_item_check>
<menu_item_check
label="Frame Test"
- layout="topleft"
name="Frame Test">
<menu_item_check.on_check
function="Advanced.CheckFrameTest"
@@ -2194,12 +1980,10 @@
<menu
create_jump_keys="true"
label="Render Metadata"
- layout="topleft"
name="Render Metadata"
tear_off="true">
<menu_item_check
label="Bounding Boxes"
- layout="topleft"
name="Bounding Boxes">
<menu_item_check.on_check
function="Advanced.CheckInfoDisplay"
@@ -2210,7 +1994,6 @@
</menu_item_check>
<menu_item_check
label="Octree"
- layout="topleft"
name="Octree">
<menu_item_check.on_check
function="Advanced.CheckInfoDisplay"
@@ -2221,7 +2004,6 @@
</menu_item_check>
<menu_item_check
label="Shadow Frusta"
- layout="topleft"
name="Shadow Frusta">
<menu_item_check.on_check
function="Advanced.CheckInfoDisplay"
@@ -2232,7 +2014,6 @@
</menu_item_check>
<menu_item_check
label="Occlusion"
- layout="topleft"
name="Occlusion">
<menu_item_check.on_check
function="Advanced.CheckInfoDisplay"
@@ -2243,7 +2024,6 @@
</menu_item_check>
<menu_item_check
label="Render Batches"
- layout="topleft"
name="Render Batches">
<menu_item_check.on_check
function="Advanced.CheckInfoDisplay"
@@ -2254,7 +2034,6 @@
</menu_item_check>
<menu_item_check
label="Texture Anim"
- layout="topleft"
name="Texture Anim">
<menu_item_check.on_check
function="Advanced.CheckInfoDisplay"
@@ -2265,7 +2044,6 @@
</menu_item_check>
<menu_item_check
label="Texture Priority"
- layout="topleft"
name="Texture Priority">
<menu_item_check.on_check
function="Advanced.CheckInfoDisplay"
@@ -2276,7 +2054,6 @@
</menu_item_check>
<menu_item_check
label="Texture Area"
- layout="topleft"
name="Texture Area">
<menu_item_check.on_check
function="Advanced.CheckInfoDisplay"
@@ -2287,7 +2064,6 @@
</menu_item_check>
<menu_item_check
label="Face Area"
- layout="topleft"
name="Face Area">
<menu_item_check.on_check
function="Advanced.CheckInfoDisplay"
@@ -2298,7 +2074,6 @@
</menu_item_check>
<menu_item_check
label="Lights"
- layout="topleft"
name="Lights">
<menu_item_check.on_check
function="Advanced.CheckInfoDisplay"
@@ -2309,7 +2084,6 @@
</menu_item_check>
<menu_item_check
label="Collision Skeleton"
- layout="topleft"
name="Collision Skeleton">
<menu_item_check.on_check
function="Advanced.CheckInfoDisplay"
@@ -2320,7 +2094,6 @@
</menu_item_check>
<menu_item_check
label="Raycast"
- layout="topleft"
name="Raycast">
<menu_item_check.on_check
function="Advanced.CheckInfoDisplay"
@@ -2333,7 +2106,6 @@
<menu
create_jump_keys="true"
label="Rendering"
- layout="topleft"
name="Rendering"
tear_off="true">
<menu_item_check
@@ -2475,7 +2247,6 @@
</menu_item_check>
<menu_item_check
label="Full Res Textures"
- layout="topleft"
name="Rull Res Textures">
<menu_item_check.on_check
function="CheckControl"
@@ -2486,7 +2257,6 @@
</menu_item_check>
<menu_item_check
label="Audit Textures"
- layout="topleft"
name="Audit Textures">
<menu_item_check.on_check
function="CheckControl"
@@ -2540,12 +2310,10 @@
<menu
create_jump_keys="true"
label="Network"
- layout="topleft"
name="Network"
tear_off="true">
<menu_item_check
label="Pause Agent"
- layout="topleft"
name="AgentPause">
<menu_item_check.on_check
function="CheckControl"
@@ -2554,27 +2322,22 @@
function="ToggleControl"
parameter="AgentPause" />
</menu_item_check>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu_item_call
label="Enable Message Log"
- layout="topleft"
name="Enable Message Log">
<menu_item_call.on_click
function="Advanced.EnableMessageLog" />
</menu_item_call>
<menu_item_call
label="Disable Message Log"
- layout="topleft"
name="Disable Message Log">
<menu_item_call.on_click
function="Advanced.DisableMessageLog" />
</menu_item_call>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu_item_check
label="Velocity Interpolate Objects"
- layout="topleft"
name="Velocity Interpolate Objects">
<menu_item_check.on_check
function="CheckControl"
@@ -2585,7 +2348,6 @@
</menu_item_check>
<menu_item_check
label="Ping Interpolate Object Positions"
- layout="topleft"
name="Ping Interpolate Object Positions">
<menu_item_check.on_check
function="CheckControl"
@@ -2594,11 +2356,9 @@
function="ToggleControl"
parameter="PingInterpolate" />
</menu_item_check>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu_item_call
label="Drop a Packet"
- layout="topleft"
name="Drop a Packet"
shortcut="control|alt|L">
<menu_item_call.on_click
@@ -2607,14 +2367,12 @@
</menu>
<menu_item_call
label="Dump Scripted Camera"
- layout="topleft"
name="Dump Scripted Camera">
<menu_item_call.on_click
function="Advanced.DumpScriptedCamera" />
</menu_item_call>
<menu_item_call
label="Bumps, Pushes &amp; Hits"
- layout="topleft"
name="Bumps, Pushes &amp;amp; Hits">
<menu_item_call.on_click
function="Floater.Show"
@@ -2624,12 +2382,10 @@
<menu
create_jump_keys="true"
label="Recorder"
- layout="topleft"
name="Recorder"
tear_off="true">
<menu_item_call
label="Start Playback"
- layout="topleft"
name="Start Playback">
<menu_item_call.on_click
function="Advanced.AgentPilot"
@@ -2637,7 +2393,6 @@
</menu_item_call>
<menu_item_call
label="Stop Playback"
- layout="topleft"
name="Stop Playback">
<menu_item_call.on_click
function="Advanced.AgentPilot"
@@ -2645,7 +2400,6 @@
</menu_item_call>
<menu_item_check
label="Loop Playback"
- layout="topleft"
name="Loop Playback">
<menu_item_check.on_check
function="Advanced.CheckAgentPilotLoop"
@@ -2655,7 +2409,6 @@
</menu_item_check>
<menu_item_call
label="Start Record"
- layout="topleft"
name="Start Record">
<menu_item_call.on_click
function="Advanced.AgentPilot"
@@ -2663,7 +2416,6 @@
</menu_item_call>
<menu_item_call
label="Stop Record"
- layout="topleft"
name="Stop Record">
<menu_item_call.on_click
function="Advanced.AgentPilot"
@@ -2674,12 +2426,10 @@
<menu
create_jump_keys="true"
label="World"
- layout="topleft"
name="World"
tear_off="true">
<menu_item_check
label="Sim Sun Override"
- layout="topleft"
name="Sim Sun Override">
<menu_item_check.on_check
function="CheckControl"
@@ -2690,7 +2440,6 @@
</menu_item_check>
<menu_item_check
label="Cheesy Beacon"
- layout="topleft"
name="Cheesy Beacon">
<menu_item_check.on_check
function="CheckControl"
@@ -2701,7 +2450,6 @@
</menu_item_check>
<menu_item_check
label="Fixed Weather"
- layout="topleft"
name="Fixed Weather">
<menu_item_check.on_check
function="CheckControl"
@@ -2712,7 +2460,6 @@
</menu_item_check>
<menu_item_call
label="Dump Region Object Cache"
- layout="topleft"
name="Dump Region Object Cache">
<menu_item_call.on_click
function="Advanced.DumpRegionObjectCache" />
@@ -2721,12 +2468,10 @@
<menu
create_jump_keys="true"
label="UI"
- layout="topleft"
name="UI"
tear_off="true">
<!-- <menu_item_check
label="New Bottom Bar"
- layout="topleft"
name="New Bottom Bar">
<menu_item_check.on_check
function="CheckControl"
@@ -2737,7 +2482,6 @@
</menu_item_check>-->
<menu_item_call
label="Web Browser Test"
- layout="topleft"
name="Web Browser Test">
<menu_item_call.on_click
function="Advanced.WebBrowserTest"
@@ -2745,14 +2489,12 @@
</menu_item_call>
<menu_item_call
label="Dump SelectMgr"
- layout="topleft"
name="Dump SelectMgr">
<menu_item_call.on_click
function="Advanced.DumpSelectMgr" />
</menu_item_call>
<menu_item_call
label="Dump Inventory"
- layout="topleft"
name="Dump Inventory">
<menu_item_call.on_click
function="Advanced.DumpInventory" />
@@ -2765,14 +2507,12 @@
</menu_item_call>
<menu_item_call
label="Dump Focus Holder"
- layout="topleft"
name="Dump Focus Holder">
<menu_item_call.on_click
function="Advanced.DumpFocusHolder" />
</menu_item_call>
<menu_item_call
label="Print Selected Object Info"
- layout="topleft"
name="Print Selected Object Info"
shortcut="control|shift|P">
<menu_item_call.on_click
@@ -2780,7 +2520,6 @@
</menu_item_call>
<menu_item_call
label="Print Agent Info"
- layout="topleft"
name="Print Agent Info"
shortcut="shift|P">
<menu_item_call.on_click
@@ -2788,7 +2527,6 @@
</menu_item_call>
<menu_item_call
label="Memory Stats"
- layout="topleft"
name="Memory Stats"
shortcut="control|alt|shift|M">
<menu_item_call.on_click
@@ -2796,7 +2534,6 @@
</menu_item_call>
<menu_item_check
label="Double-ClickAuto-Pilot"
- layout="topleft"
name="Double-ClickAuto-Pilot">
<menu_item_check.on_check
function="CheckControl"
@@ -2809,7 +2546,6 @@
<menu_item_separator />
<menu_item_check
label="Debug SelectMgr"
- layout="topleft"
name="Debug SelectMgr">
<menu_item_check.on_check
function="CheckControl"
@@ -2820,7 +2556,6 @@
</menu_item_check>
<menu_item_check
label="Debug Clicks"
- layout="topleft"
name="Debug Clicks">
<menu_item_check.on_check
function="Advanced.CheckDebugClicks"
@@ -2831,7 +2566,6 @@
</menu_item_check>
<menu_item_check
label="Debug Views"
- layout="topleft"
name="Debug Views">
<menu_item_check.on_check
function="Advanced.CheckDebugViews" />
@@ -2840,7 +2574,6 @@
</menu_item_check>
<menu_item_check
label="Debug Name Tooltips"
- layout="topleft"
name="Debug Name Tooltips">
<menu_item_check.on_check
function="Advanced.CheckXUINameTooltips"
@@ -2850,7 +2583,6 @@
</menu_item_check>
<menu_item_check
label="Debug Mouse Events"
- layout="topleft"
name="Debug Mouse Events">
<menu_item_check.on_check
function="Advanced.CheckDebugMouseEvents"
@@ -2860,7 +2592,6 @@
</menu_item_check>
<menu_item_check
label="Debug Keys"
- layout="topleft"
name="Debug Keys">
<menu_item_check.on_check
function="Advanced.CheckDebugKeys"
@@ -2870,7 +2601,6 @@
</menu_item_check>
<menu_item_check
label="Debug WindowProc"
- layout="topleft"
name="Debug WindowProc">
<menu_item_check.on_check
function="Advanced.CheckDebugWindowProc"
@@ -2887,14 +2617,12 @@
tear_off="true">
<menu_item_call
label="Reload Color Settings"
- layout="topleft"
name="Reload Color Settings">
<menu_item_call.on_click
function="Advanced.ReloadColorSettings" />
</menu_item_call>
<menu_item_call
label="Show Font Test"
- layout="topleft"
name="Show Font Test">
<menu_item_call.on_click
function="Floater.Show"
@@ -2902,21 +2630,18 @@
</menu_item_call>
<menu_item_call
label="Load from XML"
- layout="topleft"
name="Load from XML">
<menu_item_call.on_click
function="Advanced.LoadUIFromXML" />
</menu_item_call>
<menu_item_call
label="Save to XML"
- layout="topleft"
name="Save to XML">
<menu_item_call.on_click
function="Advanced.SaveUIToXML" />
</menu_item_call>
<menu_item_check
label="Show XUI Names"
- layout="topleft"
name="Show XUI Names">
<menu_item_check.on_check
function="Advanced.CheckXUINames"
@@ -2926,7 +2651,6 @@
</menu_item_check>
<menu_item_call
label="Send Test IMs"
- layout="topleft"
name="Send Test IMs">
<menu_item_call.on_click
function="Advanced.SendTestIMs" />
@@ -2935,18 +2659,15 @@
<menu
create_jump_keys="true"
label="Avatar"
- layout="topleft"
name="Character"
tear_off="true">
<menu
create_jump_keys="true"
label="Grab Baked Texture"
- layout="topleft"
name="Grab Baked Texture"
tear_off="true">
<menu_item_call
label="Iris"
- layout="topleft"
name="Iris">
<menu_item_call.on_click
function="Advanced.GrabBakedTexture"
@@ -2957,7 +2678,6 @@
</menu_item_call>
<menu_item_call
label="Head"
- layout="topleft"
name="Head">
<menu_item_call.on_click
function="Advanced.GrabBakedTexture"
@@ -2968,7 +2688,6 @@
</menu_item_call>
<menu_item_call
label="Upper Body"
- layout="topleft"
name="Upper Body">
<menu_item_call.on_click
function="Advanced.GrabBakedTexture"
@@ -2979,7 +2698,6 @@
</menu_item_call>
<menu_item_call
label="Lower Body"
- layout="topleft"
name="Lower Body">
<menu_item_call.on_click
function="Advanced.GrabBakedTexture"
@@ -2990,7 +2708,6 @@
</menu_item_call>
<menu_item_call
label="Skirt"
- layout="topleft"
name="Skirt">
<menu_item_call.on_click
function="Advanced.GrabBakedTexture"
@@ -3003,19 +2720,16 @@
<menu
create_jump_keys="true"
label="Character Tests"
- layout="topleft"
name="Character Tests"
tear_off="true">
<menu_item_call
label="Appearance To XML"
- layout="topleft"
name="Appearance To XML">
<menu_item_call.on_click
function="Advanced.AppearanceToXML" />
</menu_item_call>
<menu_item_call
label="Toggle Character Geometry"
- layout="topleft"
name="Toggle Character Geometry">
<menu_item_call.on_click
function="Advanced.ToggleCharacterGeometry" />
@@ -3024,28 +2738,24 @@
</menu_item_call>
<menu_item_call
label="Test Male"
- layout="topleft"
name="Test Male">
<menu_item_call.on_click
function="Advanced.TestMale" />
</menu_item_call>
<menu_item_call
label="Test Female"
- layout="topleft"
name="Test Female">
<menu_item_call.on_click
function="Advanced.TestFemale" />
</menu_item_call>
<menu_item_call
label="Toggle PG"
- layout="topleft"
name="Toggle PG">
<menu_item_call.on_click
function="Advanced.TogglePG" />
</menu_item_call>
<menu_item_check
label="Allow Select Avatar"
- layout="topleft"
name="Allow Select Avatar">
<menu_item_check.on_check
function="CheckControl"
@@ -3057,14 +2767,12 @@
</menu>
<menu_item_call
label="Force Params to Default"
- layout="topleft"
name="Force Params to Default">
<menu_item_call.on_click
function="Advanced.ForceParamsToDefault" />
</menu_item_call>
<menu_item_check
label="Animation Info"
- layout="topleft"
name="Animation Info">
<menu_item_check.on_check
function="Advanced.CheckAnimationInfo"
@@ -3075,7 +2783,6 @@
</menu_item_check>
<menu_item_check
label="Slow Motion Animations"
- layout="topleft"
name="Slow Motion Animations">
<menu_item_check.on_check
function="CheckControl"
@@ -3086,7 +2793,6 @@
</menu_item_check>
<menu_item_check
label="Show Look At"
- layout="topleft"
name="Show Look At">
<menu_item_check.on_check
function="Advanced.CheckShowLookAt"
@@ -3096,7 +2802,6 @@
</menu_item_check>
<menu_item_check
label="Show Point At"
- layout="topleft"
name="Show Point At">
<menu_item_check.on_check
function="Advanced.CheckShowPointAt"
@@ -3106,7 +2811,6 @@
</menu_item_check>
<menu_item_check
label="Debug Joint Updates"
- layout="topleft"
name="Debug Joint Updates">
<menu_item_check.on_check
function="Advanced.CheckDebugJointUpdates"
@@ -3116,7 +2820,6 @@
</menu_item_check>
<menu_item_check
label="Disable LOD"
- layout="topleft"
name="Disable LOD">
<menu_item_check.on_check
function="Advanced.CheckDisableLOD"
@@ -3126,7 +2829,6 @@
</menu_item_check>
<menu_item_check
label="Debug Character Vis"
- layout="topleft"
name="Debug Character Vis">
<menu_item_check.on_check
function="Advanced.CheckDebugCharacterVis"
@@ -3136,7 +2838,6 @@
</menu_item_check>
<menu_item_check
label="Show Collision Skeleton"
- layout="topleft"
name="Show Collision Skeleton">
<menu_item_check.on_check
function="Advanced.CheckInfoDisplay"
@@ -3147,7 +2848,6 @@
</menu_item_check>
<menu_item_check
label="Display Agent Target"
- layout="topleft"
name="Display Agent Target">
<menu_item_check.on_check
function="Advanced.CheckInfoDisplay"
@@ -3159,7 +2859,6 @@
<!-- Appears not to exist anymore
<menu_item_check
label="Debug Rotation"
- layout="topleft"
name="Debug Rotation">
<menu_item_check.on_check
function="CheckControl"
@@ -3171,14 +2870,12 @@
-->
<menu_item_call
label="Dump Attachments"
- layout="topleft"
name="Dump Attachments">
<menu_item_call.on_click
function="Advanced.DumpAttachments" />
</menu_item_call>
<menu_item_call
label="Debug Avatar Textures"
- layout="topleft"
name="Debug Avatar Textures"
shortcut="control|alt|shift|A">
<menu_item_call.on_click
@@ -3186,18 +2883,15 @@
</menu_item_call>
<menu_item_call
label="Dump Local Textures"
- layout="topleft"
name="Dump Local Textures"
shortcut="alt|shift|M">
<menu_item_call.on_click
function="Advanced.DumpAvatarLocalTextures" />
</menu_item_call>
</menu>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu_item_check
label="HTTP Textures"
- layout="topleft"
name="HTTP Textures">
<menu_item_check.on_check
function="CheckControl"
@@ -3208,14 +2902,12 @@
</menu_item_check>
<menu_item_call
label="Compress Images"
- layout="topleft"
name="Compress Images">
<menu_item_call.on_click
function="Advanced.CompressImage" />
</menu_item_call>
<menu_item_check
label="Output Debug Minidump"
- layout="topleft"
name="Output Debug Minidump">
<menu_item_check.on_check
function="CheckControl"
@@ -3226,7 +2918,6 @@
</menu_item_check>
<menu_item_check
label="Console Window on next Run"
- layout="topleft"
name="Console Window">
<menu_item_check.on_check
function="CheckControl"
@@ -3235,11 +2926,9 @@
function="ToggleControl"
parameter="ShowConsoleWindow" />
</menu_item_check>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu_item_check
label="Show Admin Menu"
- layout="topleft"
name="View Admin Options">
<menu_item_check.on_check
function="Advanced.CheckViewAdminOptions"
@@ -3249,7 +2938,6 @@
</menu_item_check>
<menu_item_call
label="Request Admin Status"
- layout="topleft"
name="Request Admin Options"
shortcut="control|alt|G">
<menu_item_call.on_click
@@ -3257,7 +2945,6 @@
</menu_item_call>
<menu_item_call
label="Leave Admin Status"
- layout="topleft"
name="Leave Admin Options"
shortcut="control|alt|shift|G">
<menu_item_call.on_click
@@ -3267,18 +2954,15 @@
<menu
create_jump_keys="true"
label="Admin"
- layout="topleft"
name="Admin"
tear_off="true"
visible="false">
<menu
create_jump_keys="true"
label="Object"
- layout="topleft"
tear_off="true">
<menu_item_call
label="Take Copy"
- layout="topleft"
name="Take Copy"
shortcut="control|alt|shift|O">
<menu_item_call.on_click
@@ -3288,7 +2972,6 @@
</menu_item_call>
<menu_item_call
label="Force Owner To Me"
- layout="topleft"
name="Force Owner To Me">
<menu_item_call.on_click
function="Admin.HandleObjectOwnerSelf" />
@@ -3297,7 +2980,6 @@
</menu_item_call>
<menu_item_call
label="Force Owner Permissive"
- layout="topleft"
name="Force Owner Permissive">
<menu_item_call.on_click
function="Admin.HandleObjectOwnerPermissive" />
@@ -3306,7 +2988,6 @@
</menu_item_call>
<menu_item_call
label="Delete"
- layout="topleft"
name="Delete"
shortcut="control|alt|shift|Del">
<menu_item_call.on_click
@@ -3316,7 +2997,6 @@
</menu_item_call>
<menu_item_call
label="Lock"
- layout="topleft"
name="Lock"
shortcut="control|alt|shift|L">
<menu_item_call.on_click
@@ -3326,7 +3006,6 @@
</menu_item_call>
<menu_item_call
label="Get Assets IDs"
- layout="topleft"
name="Get Assets IDs"
shortcut="control|alt|shift|I">
<menu_item_call.on_click
@@ -3338,12 +3017,10 @@
<menu
create_jump_keys="true"
label="Parcel"
- layout="topleft"
name="Parcel"
tear_off="true">
<menu_item_call
label="Force Owner To Me"
- layout="topleft"
name="Owner To Me">
<menu_item_call.on_click
function="Admin.HandleForceParcelOwnerToMe" />
@@ -3352,7 +3029,6 @@
</menu_item_call>
<menu_item_call
label="Set to Linden Content"
- layout="topleft"
name="Set to Linden Content"
shortcut="control|alt|shift|C">
<menu_item_call.on_click
@@ -3362,7 +3038,6 @@
</menu_item_call>
<menu_item_call
label="Claim Public Land"
- layout="topleft"
name="Claim Public Land">
<menu_item_call.on_click
function="Admin.HandleClaimPublicLand" />
@@ -3373,12 +3048,10 @@
<menu
create_jump_keys="true"
label="Region"
- layout="topleft"
name="Region"
tear_off="true">
<menu_item_call
label="Dump Temp Asset Data"
- layout="topleft"
name="Dump Temp Asset Data">
<menu_item_call.on_click
function="Admin.HandleRegionDumpTempAssetData" />
@@ -3387,7 +3060,6 @@
</menu_item_call>
<menu_item_call
label="Save Region State"
- layout="topleft"
name="Save Region State">
<menu_item_call.on_click
function="Admin.OnSaveState" />
@@ -3397,7 +3069,6 @@
</menu>
<menu_item_call
label="God Tools"
- layout="topleft"
name="God Tools">
<menu_item_call.on_click
function="Floater.Show"
@@ -3409,34 +3080,29 @@
<menu
create_jump_keys="true"
label="Admin"
- layout="topleft"
name="Deprecated"
tear_off="true"
visible="false">
<menu
create_jump_keys="true"
label="Attach Object"
- layout="topleft"
mouse_opaque="false"
name="Attach Object"
tear_off="true" />
<menu
create_jump_keys="true"
label="Detach Object"
- layout="topleft"
mouse_opaque="false"
name="Detach Object"
tear_off="true" />
<menu
create_jump_keys="true"
label="Take Off Clothing"
- layout="topleft"
mouse_opaque="false"
name="Take Off Clothing"
tear_off="true">
<menu_item_call
label="Shirt"
- layout="topleft"
name="Shirt">
<menu_item_call.on_click
function="Edit.TakeOff"
@@ -3447,7 +3113,6 @@
</menu_item_call>
<menu_item_call
label="Pants"
- layout="topleft"
name="Pants">
<menu_item_call.on_click
function="Edit.TakeOff"
@@ -3458,7 +3123,6 @@
</menu_item_call>
<menu_item_call
label="Shoes"
- layout="topleft"
name="Shoes">
<menu_item_call.on_click
function="Edit.TakeOff"
@@ -3469,7 +3133,6 @@
</menu_item_call>
<menu_item_call
label="Socks"
- layout="topleft"
name="Socks">
<menu_item_call.on_click
function="Edit.TakeOff"
@@ -3480,7 +3143,6 @@
</menu_item_call>
<menu_item_call
label="Jacket"
- layout="topleft"
name="Jacket">
<menu_item_call.on_click
function="Edit.TakeOff"
@@ -3491,7 +3153,6 @@
</menu_item_call>
<menu_item_call
label="Gloves"
- layout="topleft"
name="Gloves">
<menu_item_call.on_click
function="Edit.TakeOff"
@@ -3502,7 +3163,6 @@
</menu_item_call>
<menu_item_call
label="Undershirt"
- layout="topleft"
name="Menu Undershirt">
<menu_item_call.on_click
function="Edit.TakeOff"
@@ -3513,7 +3173,6 @@
</menu_item_call>
<menu_item_call
label="Underpants"
- layout="topleft"
name="Menu Underpants">
<menu_item_call.on_click
function="Edit.TakeOff"
@@ -3524,7 +3183,6 @@
</menu_item_call>
<menu_item_call
label="Skirt"
- layout="topleft"
name="Skirt">
<menu_item_call.on_click
function="Edit.TakeOff"
@@ -3535,7 +3193,6 @@
</menu_item_call>
<menu_item_call
label="Alpha"
- layout="topleft"
name="Alpha">
<menu_item_call.on_click
function="Edit.TakeOff"
@@ -3546,7 +3203,6 @@
</menu_item_call>
<menu_item_call
label="Tattoo"
- layout="topleft"
name="Tattoo">
<menu_item_call.on_click
function="Edit.TakeOff"
@@ -3557,7 +3213,6 @@
</menu_item_call>
<menu_item_call
label="All Clothes"
- layout="topleft"
name="All Clothes">
<menu_item_call.on_click
function="Edit.TakeOff"
@@ -3567,12 +3222,10 @@
<menu
create_jump_keys="true"
label="Help"
- layout="topleft"
name="Help"
tear_off="true">
<menu_item_call
label="Official Linden Blog"
- layout="topleft"
name="Official Linden Blog">
<menu_item_call.on_click
function="PromptShowURL"
@@ -3581,7 +3234,6 @@
</menu_item_call>
<menu_item_call
label="Scripting Portal"
- layout="topleft"
name="Scripting Portal">
<menu_item_call.on_click
function="PromptShowURL"
@@ -3591,12 +3243,10 @@
<menu
create_jump_keys="true"
label="Bug Reporting"
- layout="topleft"
name="Bug Reporting"
tear_off="true">
<menu_item_call
label="Public Issue Tracker"
- layout="topleft"
name="Public Issue Tracker">
<menu_item_call.on_click
function="PromptShowURL"
@@ -3605,18 +3255,15 @@
</menu_item_call>
<menu_item_call
label="Public Issue Tracker Help"
- layout="topleft"
name="Publc Issue Tracker Help">
<menu_item_call.on_click
function="PromptShowURL"
name="PublicIssueTrackerHelp_url"
parameter="WebLaunchPublicIssueHelp,http://wiki.secondlife.com/wiki/Issue_tracker" />
</menu_item_call>
- <menu_item_separator
- layout="topleft" />
+ <menu_item_separator/>
<menu_item_call
label="Bug Reporting 101"
- layout="topleft"
name="Bug Reporing 101">
<menu_item_call.on_click
function="PromptShowURL"
@@ -3625,7 +3272,6 @@
</menu_item_call>
<menu_item_call
label="Security Issues"
- layout="topleft"
name="Security Issues">
<menu_item_call.on_click
function="PromptShowURL"
@@ -3634,7 +3280,6 @@
</menu_item_call>
<menu_item_call
label="QA Wiki"
- layout="topleft"
name="QA Wiki">
<menu_item_call.on_click
function="PromptShowURL"
diff --git a/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml
new file mode 100644
index 0000000000..efea2ae3e8
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/menu_wearable_list_item.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<context_menu
+ name="Outfit Wearable Context Menu">
+ <menu_item_call
+ label="Replace"
+ layout="topleft"
+ name="wear">
+ <on_click
+ function="Wearable.Wear" />
+ </menu_item_call>
+ <menu_item_call
+ label="Add"
+ layout="topleft"
+ name="wear_add">
+ <on_click
+ function="Wearable.Add" />
+ </menu_item_call>
+ <menu_item_call
+ label="Take Off / Detach"
+ layout="topleft"
+ name="take_off_or_detach">
+ <on_click
+ function="Wearable.TakeOffDetach" />
+ </menu_item_call>
+ <menu_item_call
+ label="Detach"
+ layout="topleft"
+ name="detach">
+ <on_click
+ function="Attachment.Detach" />
+ </menu_item_call>
+ <context_menu
+ label="Attach to â–¶"
+ layout="topleft"
+ name="wearable_attach_to" />
+ <context_menu
+ label="Attach to HUD â–¶"
+ layout="topleft"
+ name="wearable_attach_to_hud" />
+ <menu_item_call
+ label="Take Off"
+ layout="topleft"
+ name="take_off">
+ <on_click
+ function="Clothing.TakeOff" />
+ </menu_item_call>
+ <menu_item_call
+ label="Edit"
+ layout="topleft"
+ name="edit">
+ <on_click
+ function="Wearable.Edit" />
+ </menu_item_call>
+ <menu_item_call
+ label="Object Profile"
+ layout="topleft"
+ name="object_profile">
+ <on_click
+ function="Attachment.Profile" />
+ </menu_item_call>
+ <menu_item_call
+ label="Show Original"
+ layout="topleft"
+ name="show_original">
+ <on_click
+ function="Wearable.ShowOriginal" />
+ </menu_item_call>
+ <menu_item_call
+ label="Create New"
+ layout="topleft"
+ name="create_new"
+ translate="false">
+ <on_click
+ function="Wearable.CreateNew" />
+ </menu_item_call>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/en/mime_types.xml b/indra/newview/skins/default/xui/en/mime_types.xml
index 76c0d027f3..a585069faa 100644
--- a/indra/newview/skins/default/xui/en/mime_types.xml
+++ b/indra/newview/skins/default/xui/en/mime_types.xml
@@ -120,7 +120,7 @@
none
</widgettype>
<impl>
- media_plugin_quicktime
+ media_plugin_webkit
</impl>
</mimetype>
<mimetype name="none/none">
@@ -130,6 +130,9 @@
<widgettype>
none
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="audio/*">
<label name="audio2_label">
@@ -138,6 +141,9 @@
<widgettype>
audio
</widgettype>
+ <impl>
+ media_plugin_quicktime
+ </impl>
</mimetype>
<mimetype name="video/*">
<label name="video2_label">
@@ -146,6 +152,9 @@
<widgettype>
movie
</widgettype>
+ <impl>
+ media_plugin_quicktime
+ </impl>
</mimetype>
<mimetype name="image/*">
<label name="image2_label">
@@ -154,6 +163,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype menu="1" name="video/vnd.secondlife.qt.legacy">
<label name="vnd.secondlife.qt.legacy_label">
@@ -173,6 +185,9 @@
<widgettype>
web
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/ogg">
<label name="application/ogg_label">
@@ -181,6 +196,9 @@
<widgettype>
audio
</widgettype>
+ <impl>
+ media_plugin_quicktime
+ </impl>
</mimetype>
<mimetype name="application/pdf">
<label name="application/pdf_label">
@@ -189,6 +207,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/postscript">
<label name="application/postscript_label">
@@ -197,6 +218,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/rtf">
<label name="application/rtf_label">
@@ -205,6 +229,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/smil">
<label name="application/smil_label">
@@ -213,6 +240,9 @@
<widgettype>
movie
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/xhtml+xml">
<label name="application/xhtml+xml_label">
@@ -221,6 +251,9 @@
<widgettype>
web
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/x-director">
<label name="application/x-director_label">
@@ -229,6 +262,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="audio/mid">
<label name="audio/mid_label">
diff --git a/indra/newview/skins/default/xui/en/mime_types_linux.xml b/indra/newview/skins/default/xui/en/mime_types_linux.xml
index 05cd850725..e95b371d00 100644
--- a/indra/newview/skins/default/xui/en/mime_types_linux.xml
+++ b/indra/newview/skins/default/xui/en/mime_types_linux.xml
@@ -120,7 +120,7 @@
none
</widgettype>
<impl>
- media_plugin_gstreamer
+ media_plugin_webkit
</impl>
</mimetype>
<mimetype name="none/none">
@@ -130,6 +130,9 @@
<widgettype>
none
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="audio/*">
<label name="audio2_label">
@@ -138,6 +141,9 @@
<widgettype>
audio
</widgettype>
+ <impl>
+ media_plugin_gstreamer
+ </impl>
</mimetype>
<mimetype name="video/*">
<label name="video2_label">
@@ -146,6 +152,9 @@
<widgettype>
movie
</widgettype>
+ <impl>
+ media_plugin_gstreamer
+ </impl>
</mimetype>
<mimetype name="image/*">
<label name="image2_label">
@@ -154,6 +163,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype menu="1" name="video/vnd.secondlife.qt.legacy">
<label name="vnd.secondlife.qt.legacy_label">
@@ -173,6 +185,9 @@
<widgettype>
web
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/ogg">
<label name="application/ogg_label">
@@ -181,6 +196,9 @@
<widgettype>
audio
</widgettype>
+ <impl>
+ media_plugin_gstreamer
+ </impl>
</mimetype>
<mimetype name="application/pdf">
<label name="application/pdf_label">
@@ -189,6 +207,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/postscript">
<label name="application/postscript_label">
@@ -197,6 +218,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/rtf">
<label name="application/rtf_label">
@@ -205,6 +229,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/smil">
<label name="application/smil_label">
@@ -213,6 +240,9 @@
<widgettype>
movie
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/xhtml+xml">
<label name="application/xhtml+xml_label">
@@ -221,6 +251,9 @@
<widgettype>
web
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/x-director">
<label name="application/x-director_label">
@@ -229,6 +262,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="audio/mid">
<label name="audio/mid_label">
diff --git a/indra/newview/skins/default/xui/en/mime_types_mac.xml b/indra/newview/skins/default/xui/en/mime_types_mac.xml
index 76c0d027f3..7931e55c0a 100644
--- a/indra/newview/skins/default/xui/en/mime_types_mac.xml
+++ b/indra/newview/skins/default/xui/en/mime_types_mac.xml
@@ -130,6 +130,9 @@
<widgettype>
none
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="audio/*">
<label name="audio2_label">
@@ -138,6 +141,9 @@
<widgettype>
audio
</widgettype>
+ <impl>
+ media_plugin_quicktime
+ </impl>
</mimetype>
<mimetype name="video/*">
<label name="video2_label">
@@ -146,6 +152,9 @@
<widgettype>
movie
</widgettype>
+ <impl>
+ media_plugin_quicktime
+ </impl>
</mimetype>
<mimetype name="image/*">
<label name="image2_label">
@@ -154,6 +163,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype menu="1" name="video/vnd.secondlife.qt.legacy">
<label name="vnd.secondlife.qt.legacy_label">
@@ -173,6 +185,9 @@
<widgettype>
web
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/ogg">
<label name="application/ogg_label">
@@ -181,6 +196,9 @@
<widgettype>
audio
</widgettype>
+ <impl>
+ media_plugin_quicktime
+ </impl>
</mimetype>
<mimetype name="application/pdf">
<label name="application/pdf_label">
@@ -189,6 +207,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/postscript">
<label name="application/postscript_label">
@@ -197,6 +218,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/rtf">
<label name="application/rtf_label">
@@ -205,6 +229,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/smil">
<label name="application/smil_label">
@@ -213,6 +240,9 @@
<widgettype>
movie
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/xhtml+xml">
<label name="application/xhtml+xml_label">
@@ -221,6 +251,9 @@
<widgettype>
web
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/x-director">
<label name="application/x-director_label">
@@ -229,6 +262,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="audio/mid">
<label name="audio/mid_label">
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index cc71f53bd7..88732fee7d 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -19,7 +19,7 @@
<button
default="true"
index="0"
- name="OK"
+ name="OK_okbutton"
text="$yestext"/>
</form>
</template>
@@ -29,7 +29,7 @@
<button
default="true"
index="0"
- name="OK"
+ name="OK_okignore"
text="$yestext"/>
<ignore text="$ignoretext"/>
</form>
@@ -40,11 +40,11 @@
<button
default="true"
index="0"
- name="OK"
+ name="OK_okcancelbuttons"
text="$yestext"/>
<button
index="1"
- name="Cancel"
+ name="Cancel_okcancelbuttons"
text="$notext"/>
</form>
</template>
@@ -54,11 +54,11 @@
<button
default="true"
index="0"
- name="OK"
+ name="OK_okcancelignore"
text="$yestext"/>
<button
index="1"
- name="Cancel"
+ name="Cancel_okcancelignore"
text="$notext"/>
<ignore text="$ignoretext"/>
</form>
@@ -69,7 +69,7 @@
<button
default="true"
index="0"
- name="OK"
+ name="OK_okhelpbuttons"
text="$yestext"/>
<button
index="1"
@@ -91,7 +91,7 @@
text="$notext"/>
<button
index="2"
- name="Cancel"
+ name="Cancel_yesnocancelbuttons"
text="$canceltext"/>
</form>
</template>
@@ -249,7 +249,7 @@ Save all changes to clothing/body parts?
Non-friends won't know that you've choosen to ignore their calls and instant messages.
<usetemplate
name="okbutton"
- yestext="Yes"/>
+ yestext="OK"/>
</notification>
<notification
@@ -407,7 +407,7 @@ Do you wish to proceed?
icon="alertmodal.tga"
name="JoinGroupNoCost"
type="alertmodal">
-You are Joining group [NAME].
+You are joining group [NAME].
Do you wish to proceed?
<usetemplate
name="okcancelbuttons"
@@ -735,6 +735,14 @@ You need an account to enter [SECOND_LIFE]. Would you like to create one now?
<notification
icon="alertmodal.tga"
+ name="InvalidCredentialFormat"
+ type="alertmodal">
+You need to enter both the First and Last name of your avatar into the Username field, then login again.
+ </notification>
+
+
+ <notification
+ icon="alertmodal.tga"
name="AddClassified"
type="alertmodal">
Classified ads appear in the &apos;Classified&apos; section of the Search directory and on [http://secondlife.com/community/classifieds secondlife.com] for one week.
@@ -800,7 +808,7 @@ Insufficient funds to create classified.
icon="alertmodal.tga"
name="DeleteAvatarPick"
type="alertmodal">
-Delete pick [PICK]?
+Delete pick &lt;nolink&gt;[PICK]&lt;/nolink&gt;?
<usetemplate
name="okcancelbuttons"
notext="Cancel"
@@ -1036,7 +1044,6 @@ Unable to write file [[FILE]]
type="alertmodal">
Just so you know, your computer does not meet [APP_NAME]&apos;s minimum system requirements. You may experience poor performance. Unfortunately, the [SUPPORT_SITE] can't provide technical support for unsupported system configurations.
-MINSPECS
Visit [_URL] for more information?
<url option="0" name="url">
@@ -1083,7 +1090,9 @@ The region [REGION] does not allow terraforming.
icon="alertmodal.tga"
name="CannotCopyWarning"
type="alertmodal">
-You do not have permission to copy this item and will lose it from your inventory if you give it away. Do you really want to offer this item?
+You do not have permission to copy the following items:
+[ITEMS]
+and will lose it from your inventory if you give it away. Do you really want to offer these items?
<usetemplate
name="okcancelbuttons"
notext="No"
@@ -1200,6 +1209,7 @@ Eject [AVATAR_NAME] from your land?
<notification
icon="alertmodal.tga"
name="EjectAvatarFromGroup"
+ persist="true"
type="notify">
You ejected [AVATAR_NAME] from group [GROUP_NAME]
</notification>
@@ -1385,6 +1395,17 @@ Unable to encode file: [FILE]
<notification
icon="alertmodal.tga"
+ name="CorruptedProtectedDataStore"
+ type="alertmodal">
+ We can't fill in your username and password. This may happen when you change network setup
+
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="CorruptResourceFile"
type="alertmodal">
Corrupt resource file: [FILE]
@@ -1733,21 +1754,6 @@ Try selecting a single parcel.
<notification
icon="alertmodal.tga"
- name="ParcelCanPlayMedia"
- type="alertmodal">
-This location can play streaming media.
-Streaming media requires a fast Internet connection.
-
-Play streaming media when available?
-(You can change this option later under Preferences &gt; Privacy.)
- <usetemplate
- name="okcancelbuttons"
- notext="Disable"
- yestext="Play Media"/>
- </notification>
-
- <notification
- icon="alertmodal.tga"
name="CannotDeedLandWaitingForServer"
type="alertmodal">
Unable to deed land:
@@ -2040,6 +2046,74 @@ Would you be my friend?
</notification>
<notification
+ icon="alertmodal.tga"
+ label="Save Outfit"
+ name="SaveOutfitAs"
+ type="alertmodal">
+ Save what I'm wearing as a new Outfit:
+ <form name="form">
+ <input name="message" type="text">
+ [DESC] (new)
+ </input>
+ <button
+ default="true"
+ index="0"
+ name="Offer"
+ text="OK"/>
+ <button
+ index="1"
+ name="Cancel"
+ text="Cancel"/>
+ </form>
+ <unique/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ label="Save Wearable"
+ name="SaveWearableAs"
+ type="alertmodal">
+ Save item to my inventory as:
+ <form name="form">
+ <input name="message" type="text">
+ [DESC] (new)
+ </input>
+ <button
+ default="true"
+ index="0"
+ name="Offer"
+ text="OK"/>
+ <button
+ index="1"
+ name="Cancel"
+ text="Cancel"/>
+ </form>
+ </notification>
+
+
+ <notification
+ icon="alertmodal.tga"
+ label="Rename Outfit"
+ name="RenameOutfit"
+ type="alertmodal">
+ New outfit name:
+ <form name="form">
+ <input name="new_name" type="text" width="300">
+ [NAME]
+ </input>
+ <button
+ default="true"
+ index="0"
+ name="Offer"
+ text="OK"/>
+ <button
+ index="1"
+ name="Cancel"
+ text="Cancel"/>
+ </form>
+ </notification>
+
+ <notification
icon="alertmodal.tga"
name="RemoveFromFriends"
type="alertmodal">
@@ -2118,6 +2192,19 @@ Please enter a higher price.
<notification
icon="alertmodal.tga"
+ name="ConfirmItemDeleteHasLinks"
+ type="alertmodal">
+At least one of the items you has link items that point to it. If you delete this item, its links will permanently stop working. It is strongly advised to delete the links first.
+
+Are you sure you want to delete these items?
+ <usetemplate
+ name="okcancelbuttons"
+ notext="Cancel"
+ yestext="OK"/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
name="ConfirmObjectDeleteLock"
type="alertmodal">
At least one of the items you have selected is locked.
@@ -2312,6 +2399,9 @@ Display settings have been set to recommended levels based on your system config
name="ErrorMessage"
type="alertmodal">
[ERROR_MESSAGE]
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
</notification>
<notification
@@ -2408,6 +2498,57 @@ Please choose the male or female avatar. You can change your mind later.
notext="Female"
yestext="Male"/>
</notification>
+ <notification icon="alertmodal.tga"
+ name="CantTeleportToGrid"
+ type="alertmodal">
+Could not teleport to [SLURL] as it's on a different grid ([GRID]) than the current grid ([CURRENT_GRID]). Please close your viewer and try again.
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification icon="alertmodal.tga"
+ name="GeneralCertificateError"
+ type="alertmodal">
+Could not connect to the server.
+[REASON]
+
+SubjectName: [SUBJECT_NAME_STRING]
+IssuerName: [ISSUER_NAME_STRING]
+Valid From: [VALID_FROM]
+Valid To: [VALID_TO]
+MD5 Fingerprint: [SHA1_DIGEST]
+SHA1 Fingerprint: [MD5_DIGEST]
+Key Usage: [KEYUSAGE]
+Extended Key Usage: [EXTENDEDKEYUSAGE]
+Subject Key Identifier: [SUBJECTKEYIDENTIFIER]
+ <usetemplate
+ name="okbutton"
+ yestext="OK"/>
+ </notification>
+
+ <notification icon="alertmodal.tga"
+ name="TrustCertificateError"
+ type="alertmodal">
+The certification authority for this server is not known.
+
+Certificate Information:
+SubjectName: [SUBJECT_NAME_STRING]
+IssuerName: [ISSUER_NAME_STRING]
+Valid From: [VALID_FROM]
+Valid To: [VALID_TO]
+MD5 Fingerprint: [SHA1_DIGEST]
+SHA1 Fingerprint: [MD5_DIGEST]
+Key Usage: [KEYUSAGE]
+Extended Key Usage: [EXTENDEDKEYUSAGE]
+Subject Key Identifier: [SUBJECTKEYIDENTIFIER]
+
+Would you like to trust this authority?
+ <usetemplate
+ name="okcancelbuttons"
+ notext="Cancel"
+ yestext="Trust"/>
+ </notification>
<notification
icon="alertmodal.tga"
@@ -2419,6 +2560,7 @@ Please choose the male or female avatar. You can change your mind later.
<notification
icon="alertmodal.tga"
name="GrantedModifyRights"
+ persist="true"
type="notify">
[NAME] has given you permission to edit their objects.
</notification>
@@ -2426,6 +2568,7 @@ Please choose the male or female avatar. You can change your mind later.
<notification
icon="alertmodal.tga"
name="RevokedModifyRights"
+ persist="true"
type="notify">
Your privilege to modify [NAME]&apos;s objects has been revoked
</notification>
@@ -2861,11 +3004,11 @@ Leave Group?
icon="alert.tga"
name="ConfirmKick"
type="alert">
-Do you REALLY want to kick all users off the grid?
+Do you REALLY want to kick all Residents off the grid?
<usetemplate
name="okcancelbuttons"
notext="Cancel"
- yestext="Kick All Users"/>
+ yestext="Kick All Residents"/>
</notification>
<notification
@@ -2965,7 +3108,7 @@ You have reached your maximum number of groups. Please leave some group before j
icon="alert.tga"
name="KickUser"
type="alert">
-Kick this user with what message?
+Kick this Resident with what message?
<form name="form">
<input name="message" type="text">
An administrator has logged you off.
@@ -3007,7 +3150,7 @@ An administrator has logged you off.
icon="alert.tga"
name="FreezeUser"
type="alert">
-Freeze this user with what message?
+Freeze this Resident with what message?
<form name="form">
<input name="message" type="text">
You have been frozen. You cannot move or chat. An administrator will contact you via instant message (IM).
@@ -3028,7 +3171,7 @@ You have been frozen. You cannot move or chat. An administrator will contact you
icon="alert.tga"
name="UnFreezeUser"
type="alert">
-Unfreeze this user with what message?
+Unfreeze this Resident with what message?
<form name="form">
<input name="message" type="text">
You are no longer frozen.
@@ -3070,7 +3213,7 @@ Join me in [REGION]
icon="alertmodal.tga"
name="OfferTeleportFromGod"
type="alertmodal">
-God summon user to your location?
+God summon Resident to your location?
<form name="form">
<input name="message" type="text">
Join me in [REGION]
@@ -3124,6 +3267,18 @@ Teleport to [PICK]?
</notification>
<notification
+ icon="alertmodal.tga"
+ name="TeleportToHistoryEntry"
+ type="alertmodal">
+Teleport to [HISTORY_ENTRY]?
+ <usetemplate
+ ignoretext="Confirm that I want to teleport to a history location"
+ name="okcancelignore"
+ notext="Cancel"
+ yestext="Teleport"/>
+ </notification>
+
+ <notification
icon="alert.tga"
label="Message everyone in your Estate"
name="MessageEstate"
@@ -3150,7 +3305,7 @@ Type a short announcement which will be sent to everyone currently in your estat
type="alert">
You are about to change a Linden owned estate (mainland, teen grid, orientation, etc.).
-This is EXTREMELY DANGEROUS because it can fundamentally affect the user experience. On the mainland, it will change thousands of regions and make the spaceserver hiccup.
+This is EXTREMELY DANGEROUS because it can fundamentally affect the Resident experience. On the mainland, it will change thousands of regions and make the spaceserver hiccup.
Proceed?
<usetemplate
@@ -3343,7 +3498,7 @@ You are not allowed in that region due to your maturity Rating.
type="alertmodal">
You are not allowed in that Region due to your maturity Rating preference.
-You can click &apos;Change Preference&apos; to raise your maturity Rating preference now and allow you to enter. You will be able to search and access [REGIONMATURITY] content from now on. If you later want to change this setting back, go to Me &gt; Preferences &gt; General.
+To enter the desired region, please change your maturity Rating preference. This will allow you to search for and access [REGIONMATURITY] content. To undo any changes, go to Me &gt; Preferences &gt; General.
<form name="form">
<button
index="0"
@@ -3359,6 +3514,13 @@ You can click &apos;Change Preference&apos; to raise your maturity Rating prefer
</notification>
<notification
+ icon="notifytip.tga"
+ name="PreferredMaturityChanged"
+ type="notifytip">
+Your maturity Rating preference is now [RATING].
+ </notification>
+
+ <notification
icon="alertmodal.tga"
name="LandClaimAccessBlocked"
type="alertmodal">
@@ -3851,7 +4013,7 @@ Are you sure you want to quit?
<notification
icon="alertmodal.tga"
name="HelpReportAbuseEmailLL"
- type="alertmodal">
+ type="alert">
Use this tool to report violations of the [http://secondlife.com/corporate/tos.php Terms of Service] and [http://secondlife.com/corporate/cs.php Community Standards].
All reported abuses are investigated and resolved.
@@ -4282,6 +4444,13 @@ The string [STRING_NAME] is missing from strings.xml
type="notifytip">
[MESSAGE]
</notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="IMSystemMessageTip"
+ type="notifytip">
+[MESSAGE]
+ </notification>
<notification
icon="notifytip.tga"
@@ -4314,6 +4483,7 @@ Replaced missing clothing/body part with default.
<notification
icon="groupnotify"
name="GroupNotice"
+ persist="true"
type="groupnotify">
Topic: [SUBJECT], Message: [MESSAGE]
</notification>
@@ -4350,6 +4520,7 @@ Uploading in-world and web site snapshots...
<notification
icon="notify.tga"
name="UploadPayment"
+ persist="true"
type="notify">
You paid L$[AMOUNT] to upload.
</notification>
@@ -4637,6 +4808,7 @@ Please select at least one type of content to search (General, Moderate, or Adul
<notification
icon="notify.tga"
name="SystemMessage"
+ persist="true"
type="notify">
[MESSAGE]
</notification>
@@ -4644,10 +4816,13 @@ Please select at least one type of content to search (General, Moderate, or Adul
<notification
icon="notify.tga"
name="PaymentRecived"
+ persist="true"
type="notify">
[MESSAGE]
</notification>
+ <!-- EventNotification couldn't be persist since server decide is it necessary to notify
+ user about subscribed event via LLEventNotifier-->
<notification
icon="notify.tga"
name="EventNotification"
@@ -4675,6 +4850,7 @@ Event Notification:
<notification
icon="notify.tga"
name="TransferObjectsHighlighted"
+ persist="true"
type="notify">
All objects on this parcel that will transfer to the purchaser of this parcel are now highlighted.
@@ -4690,6 +4866,7 @@ All objects on this parcel that will transfer to the purchaser of this parcel ar
<notification
icon="notify.tga"
name="DeactivatedGesturesTrigger"
+ persist="true"
type="notify">
Deactivated gestures with same trigger:
[NAMES]
@@ -4698,6 +4875,7 @@ Deactivated gestures with same trigger:
<notification
icon="notify.tga"
name="NoQuickTime"
+ persist="true"
type="notify">
Apple&apos;s QuickTime software does not appear to be installed on your system.
If you want to view streaming media on parcels that support it you should go to the [http://www.apple.com/quicktime QuickTime site] and install the QuickTime Player.
@@ -4705,6 +4883,7 @@ If you want to view streaming media on parcels that support it you should go to
<notification
icon="notify.tga"
name="NoPlugin"
+ persist="true"
type="notify">
No Media Plugin was found to handle the "[MIME_TYPE]" mime type. Media of this type will be unavailable.
</notification>
@@ -4724,6 +4903,7 @@ Please re-install the plugin or contact the vendor if you continue to experience
<notification
icon="notify.tga"
name="OwnedObjectsReturned"
+ persist="true"
type="notify">
The objects you own on the selected parcel of land have been returned back to your inventory.
</notification>
@@ -4731,6 +4911,7 @@ The objects you own on the selected parcel of land have been returned back to yo
<notification
icon="notify.tga"
name="OtherObjectsReturned"
+ persist="true"
type="notify">
The objects on the selected parcel of land that is owned by [FIRST] [LAST] have been returned to his or her inventory.
</notification>
@@ -4738,6 +4919,7 @@ The objects on the selected parcel of land that is owned by [FIRST] [LAST] have
<notification
icon="notify.tga"
name="OtherObjectsReturned2"
+ persist="true"
type="notify">
The objects on the selected parcel of land owned by the Resident &apos;[NAME]&apos; have been returned to their owner.
</notification>
@@ -4745,6 +4927,7 @@ The objects on the selected parcel of land owned by the Resident &apos;[NAME]&ap
<notification
icon="notify.tga"
name="GroupObjectsReturned"
+ persist="true"
type="notify">
The objects on the selected parcel of land shared with the group [GROUPNAME] have been returned back to their owner&apos;s inventory.
Transferable deeded objects have been returned to their previous owners.
@@ -4754,6 +4937,7 @@ Non-transferable objects that are deeded to the group have been deleted.
<notification
icon="notify.tga"
name="UnOwnedObjectsReturned"
+ persist="true"
type="notify">
The objects on the selected parcel that are NOT owned by you have been returned to their owners.
</notification>
@@ -4761,14 +4945,16 @@ The objects on the selected parcel that are NOT owned by you have been returned
<notification
icon="notify.tga"
name="ServerObjectMessage"
+ persist="true"
type="notify">
Message from [NAME]:
-[MSG]
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
</notification>
<notification
icon="notify.tga"
name="NotSafe"
+ persist="true"
type="notify">
This land has damage enabled.
You can be hurt here. If you die, you will be teleported to your home location.
@@ -4778,6 +4964,7 @@ You can be hurt here. If you die, you will be teleported to your home location.
<notification
icon="notify.tga"
name="NoFly"
+ persist="true"
type="notify">
This area has flying disabled.
You can&apos;t fly here.
@@ -4787,6 +4974,7 @@ You can&apos;t fly here.
<notification
icon="notify.tga"
name="PushRestricted"
+ persist="true"
type="notify">
This area does not allow pushing. You can&apos;t push others here unless you own the land.
<unique/>
@@ -4795,6 +4983,7 @@ This area does not allow pushing. You can&apos;t push others here unless you own
<notification
icon="notify.tga"
name="NoVoice"
+ persist="true"
type="notify">
This area has voice chat disabled. You won&apos;t be able to hear anyone talking.
<unique/>
@@ -4803,6 +4992,7 @@ This area has voice chat disabled. You won&apos;t be able to hear anyone talking
<notification
icon="notify.tga"
name="NoBuild"
+ persist="true"
type="notify">
This area has building disabled. You can&apos;t build or rez objects here.
<unique/>
@@ -4811,6 +5001,7 @@ This area has building disabled. You can&apos;t build or rez objects here.
<notification
icon="notify.tga"
name="ScriptsStopped"
+ persist="true"
type="notify">
An administrator has temporarily stopped scripts in this region.
</notification>
@@ -4818,6 +5009,7 @@ An administrator has temporarily stopped scripts in this region.
<notification
icon="notify.tga"
name="ScriptsNotRunning"
+ persist="true"
type="notify">
This region is not running any scripts.
</notification>
@@ -4825,6 +5017,7 @@ This region is not running any scripts.
<notification
icon="notify.tga"
name="NoOutsideScripts"
+ persist="true"
type="notify">
This land has outside scripts disabled.
@@ -4834,6 +5027,7 @@ No scripts will work here except those belonging to the land owner.
<notification
icon="notify.tga"
name="ClaimPublicLand"
+ persist="true"
type="notify">
You can only claim public land in the Region you&apos;re in.
</notification>
@@ -4841,6 +5035,7 @@ You can only claim public land in the Region you&apos;re in.
<notification
icon="notify.tga"
name="RegionTPAccessBlocked"
+ persist="true"
type="notify">
You aren&apos;t allowed in that Region due to your maturity Rating. You may need to validate your age and/or install the latest Viewer.
@@ -4850,6 +5045,7 @@ Please go to the Knowledge Base for details on accessing areas with this maturit
<notification
icon="notify.tga"
name="URBannedFromRegion"
+ persist="true"
type="notify">
You are banned from the region.
</notification>
@@ -4857,6 +5053,7 @@ You are banned from the region.
<notification
icon="notify.tga"
name="NoTeenGridAccess"
+ persist="true"
type="notify">
Your account cannot connect to this teen grid region.
</notification>
@@ -4864,6 +5061,7 @@ Your account cannot connect to this teen grid region.
<notification
icon="notify.tga"
name="ImproperPaymentStatus"
+ persist="true"
type="notify">
You do not have proper payment status to enter this region.
</notification>
@@ -4871,6 +5069,7 @@ You do not have proper payment status to enter this region.
<notification
icon="notify.tga"
name="MustGetAgeRgion"
+ persist="true"
type="notify">
You must be age-verified to enter this region.
</notification>
@@ -4878,6 +5077,7 @@ You must be age-verified to enter this region.
<notification
icon="notify.tga"
name="MustGetAgeParcel"
+ persist="true"
type="notify">
You must be age-verified to enter this parcel.
</notification>
@@ -4885,6 +5085,7 @@ You must be age-verified to enter this parcel.
<notification
icon="notify.tga"
name="NoDestRegion"
+ persist="true"
type="notify">
No destination region found.
</notification>
@@ -4892,6 +5093,7 @@ No destination region found.
<notification
icon="notify.tga"
name="NotAllowedInDest"
+ persist="true"
type="notify">
You are not allowed into the destination.
</notification>
@@ -4899,6 +5101,7 @@ You are not allowed into the destination.
<notification
icon="notify.tga"
name="RegionParcelBan"
+ persist="true"
type="notify">
Cannot region cross into banned parcel. Try another way.
</notification>
@@ -4906,6 +5109,7 @@ Cannot region cross into banned parcel. Try another way.
<notification
icon="notify.tga"
name="TelehubRedirect"
+ persist="true"
type="notify">
You have been redirected to a telehub.
</notification>
@@ -4913,6 +5117,7 @@ You have been redirected to a telehub.
<notification
icon="notify.tga"
name="CouldntTPCloser"
+ persist="true"
type="notify">
Could not teleport closer to destination.
</notification>
@@ -4920,6 +5125,7 @@ Could not teleport closer to destination.
<notification
icon="notify.tga"
name="TPCancelled"
+ persist="true"
type="notify">
Teleport cancelled.
</notification>
@@ -4927,6 +5133,7 @@ Teleport cancelled.
<notification
icon="notify.tga"
name="FullRegionTryAgain"
+ persist="true"
type="notify">
The region you are attempting to enter is currently full.
Please try again in a few moments.
@@ -4935,6 +5142,7 @@ Please try again in a few moments.
<notification
icon="notify.tga"
name="GeneralFailure"
+ persist="true"
type="notify">
General failure.
</notification>
@@ -4942,6 +5150,7 @@ General failure.
<notification
icon="notify.tga"
name="RoutedWrongRegion"
+ persist="true"
type="notify">
Routed to wrong region. Please try again.
</notification>
@@ -4949,6 +5158,7 @@ Routed to wrong region. Please try again.
<notification
icon="notify.tga"
name="NoValidAgentID"
+ persist="true"
type="notify">
No valid agent id.
</notification>
@@ -4956,6 +5166,7 @@ No valid agent id.
<notification
icon="notify.tga"
name="NoValidSession"
+ persist="true"
type="notify">
No valid session id.
</notification>
@@ -4963,6 +5174,7 @@ No valid session id.
<notification
icon="notify.tga"
name="NoValidCircuit"
+ persist="true"
type="notify">
No valid circuit code.
</notification>
@@ -4970,6 +5182,7 @@ No valid circuit code.
<notification
icon="notify.tga"
name="NoValidTimestamp"
+ persist="true"
type="notify">
No valid timestamp.
</notification>
@@ -4977,6 +5190,7 @@ No valid timestamp.
<notification
icon="notify.tga"
name="NoPendingConnection"
+ persist="true"
type="notify">
Unable to create pending connection.
</notification>
@@ -4984,6 +5198,7 @@ Unable to create pending connection.
<notification
icon="notify.tga"
name="InternalUsherError"
+ persist="true"
type="notify">
Internal error attempting to connect agent usher.
</notification>
@@ -4991,6 +5206,7 @@ Internal error attempting to connect agent usher.
<notification
icon="notify.tga"
name="NoGoodTPDestination"
+ persist="true"
type="notify">
Unable to find a good teleport destination in this region.
</notification>
@@ -4998,6 +5214,7 @@ Unable to find a good teleport destination in this region.
<notification
icon="notify.tga"
name="InternalErrorRegionResolver"
+ persist="true"
type="notify">
Internal error attempting to activate region resolver.
</notification>
@@ -5005,6 +5222,7 @@ Internal error attempting to activate region resolver.
<notification
icon="notify.tga"
name="NoValidLanding"
+ persist="true"
type="notify">
A valid landing point could not be found.
</notification>
@@ -5012,6 +5230,7 @@ A valid landing point could not be found.
<notification
icon="notify.tga"
name="NoValidParcel"
+ persist="true"
type="notify">
No valid parcel could be found.
</notification>
@@ -5040,28 +5259,6 @@ An object named [OBJECTFROMNAME] owned by [NAME_SLURL] has given you this [OBJEC
<notification
icon="notify.tga"
- name="ObjectGiveItemUnknownUser"
- type="offer">
-An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you this [OBJECTTYPE]:
-[ITEM_SLURL]
- <form name="form">
- <button
- index="0"
- name="Keep"
- text="Keep"/>
- <button
- index="1"
- name="Discard"
- text="Discard"/>
- <button
- index="2"
- name="Mute"
- text="Block"/>
- </form>
- </notification>
-
- <notification
- icon="notify.tga"
name="UserGiveItem"
type="offer">
[NAME_SLURL] has given you this [OBJECTTYPE]:
@@ -5085,6 +5282,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th
<notification
icon="notify.tga"
name="GodMessage"
+ persist="true"
type="notify">
[NAME]
@@ -5094,6 +5292,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th
<notification
icon="notify.tga"
name="JoinGroup"
+ persist="true"
type="notify">
[MESSAGE]
<form name="form">
@@ -5116,9 +5315,9 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th
icon="notify.tga"
name="TeleportOffered"
type="offer">
-[NAME] has offered to teleport you to their location:
+[NAME_SLURL] has offered to teleport you to their location:
-[MESSAGE]
+[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
<form name="form">
<button
index="0"
@@ -5142,6 +5341,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th
<notification
icon="notify.tga"
name="GotoURL"
+ persist="true"
type="notify">
[MESSAGE]
[URL]
@@ -5161,7 +5361,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th
icon="notify.tga"
name="OfferFriendship"
type="offer">
-[NAME] is offering friendship.
+[NAME_SLURL] is offering friendship.
[MESSAGE]
@@ -5188,6 +5388,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th
<notification
icon="notify.tga"
name="OfferFriendshipNoMessage"
+ persist="true"
type="notify">
[NAME] is offering friendship.
@@ -5214,13 +5415,29 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th
<notification
icon="notify.tga"
name="FriendshipDeclined"
+ persist="true"
type="notify">
[NAME] declined your friendship offer.
</notification>
+
+ <notification
+ icon="notify.tga"
+ name="FriendshipAcceptedByMe"
+ type="offer">
+Friendship offer accepted.
+ </notification>
<notification
icon="notify.tga"
+ name="FriendshipDeclinedByMe"
+ type="offer">
+Friendship offer declined.
+ </notification>
+
+ <notification
+ icon="notify.tga"
name="OfferCallingCard"
+ persist="true"
type="notify">
[FIRST] [LAST] is offering their calling card.
This will add a bookmark in your inventory so you can quickly IM this Resident.
@@ -5241,6 +5458,7 @@ This will add a bookmark in your inventory so you can quickly IM this Resident.
name="RegionRestartMinutes"
priority="high"
sound="UISndAlert"
+ persist="true"
type="notify">
This region will restart in [MINUTES] minutes.
If you stay in this region you will be logged out.
@@ -5251,6 +5469,7 @@ If you stay in this region you will be logged out.
name="RegionRestartSeconds"
priority="high"
sound="UISndAlert"
+ persist="true"
type="notify">
This region will restart in [SECONDS] seconds.
If you stay in this region you will be logged out.
@@ -5259,6 +5478,7 @@ If you stay in this region you will be logged out.
<notification
icon="notify.tga"
name="LoadWebPage"
+ persist="true"
type="notify">
Load web page [URL]?
@@ -5280,6 +5500,7 @@ From object: [OBJECTNAME], owner: [NAME]?
<notification
icon="notify.tga"
name="FailedToFindWearableUnnamed"
+ persist="true"
type="notify">
Failed to find [TYPE] in database.
</notification>
@@ -5287,6 +5508,7 @@ Failed to find [TYPE] in database.
<notification
icon="notify.tga"
name="FailedToFindWearable"
+ persist="true"
type="notify">
Failed to find [TYPE] named [DESC] in database.
</notification>
@@ -5294,6 +5516,7 @@ Failed to find [TYPE] named [DESC] in database.
<notification
icon="notify.tga"
name="InvalidWearable"
+ persist="true"
type="notify">
The item you are trying to wear uses a feature that your Viewer can&apos;t read. Please upgrade your version of [APP_NAME] to wear this item.
</notification>
@@ -5301,6 +5524,7 @@ The item you are trying to wear uses a feature that your Viewer can&apos;t read.
<notification
icon="notify.tga"
name="ScriptQuestion"
+ persist="true"
type="notify">
&apos;[OBJECTNAME]&apos;, an object owned by &apos;[NAME]&apos;, would like to:
@@ -5326,6 +5550,7 @@ Is this OK?
icon="notify.tga"
name="ScriptQuestionCaution"
priority="high"
+ persist="true"
type="notify">
An object named &apos;[OBJECTNAME]&apos;, owned by &apos;[NAME]&apos; would like to:
@@ -5353,6 +5578,7 @@ Grant this request?
<notification
icon="notify.tga"
name="ScriptDialog"
+ persist="true"
type="notify">
[FIRST] [LAST]&apos;s &apos;[TITLE]&apos;
[MESSAGE]
@@ -5367,6 +5593,7 @@ Grant this request?
<notification
icon="notify.tga"
name="ScriptDialogGroup"
+ persist="true"
type="notify">
[GROUPNAME]&apos;s &apos;[TITLE]&apos;
[MESSAGE]
@@ -5378,31 +5605,11 @@ Grant this request?
</form>
</notification>
- <notification
- icon="notify.tga"
- name="ScriptToast"
- type="notify">
- [FIRST] [LAST]&apos;s &apos;[TITLE]&apos; is requesting user input.
- <form name="form">
- <button
- index="0"
- name="Open"
- text="Open Dialog"/>
- <button
- index="1"
- name="Ignore"
- text="Ignore"/>
- <button
- index="2"
- name="Block"
- text="Block"/>
- </form>
- </notification>
-
<!--
<notification
icon="notify.tga"
name="FirstBalanceIncrease"
+ persist="true"
type="notify">
You just received L$[AMOUNT].
Your L$ balance is shown in the upper-right.
@@ -5411,6 +5618,7 @@ Your L$ balance is shown in the upper-right.
<notification
icon="notify.tga"
name="FirstBalanceDecrease"
+ persist="true"
type="notify">
You just paid L$[AMOUNT].
Your L$ balance is shown in the upper-right.
@@ -5420,6 +5628,7 @@ Your L$ balance is shown in the upper-right.
<notification
icon="notify.tga"
name="BuyLindenDollarSuccess"
+ persist="true"
type="notify">
Thank you for your payment!
@@ -5432,6 +5641,7 @@ The status of your payment can be checked on your Transaction History page on yo
<notification
icon="notify.tga"
name="FirstSit"
+ persist="true"
type="notify">
You are sitting.
Use your arrow keys (or AWSD) to look around.
@@ -5441,6 +5651,7 @@ Click the &apos;Stand Up&apos; button to stand.
<notification
icon="notify.tga"
name="FirstMap"
+ persist="true"
type="notify">
Click and drag the map to look around.
Double-click to teleport.
@@ -5450,6 +5661,7 @@ Use the controls on the right to find things and display different backgrounds.
<notification
icon="notify.tga"
name="FirstBuild"
+ persist="true"
type="notify">
You have opened the Build Tools. Every object you see around you was created using these tools.
</notification>
@@ -5459,6 +5671,7 @@ You have opened the Build Tools. Every object you see around you was created usi
<notification
icon="notify.tga"
name="FirstLeftClickNoHit"
+ persist="true"
type="notify">
Left-clicking interacts with special objects.
If the mouse pointer changes to a hand, you can interact with the object.
@@ -5468,6 +5681,7 @@ You have opened the Build Tools. Every object you see around you was created usi
<notification
icon="notify.tga"
name="FirstTeleport"
+ persist="true"
type="notify">
You can only teleport to certain areas in this region. The arrow points to your specific destination. Click the arrow to dismiss it.
</notification>
@@ -5477,6 +5691,7 @@ You can only teleport to certain areas in this region. The arrow points to your
<notification
icon="notify.tga"
name="FirstOverrideKeys"
+ persist="true"
type="notify">
Your movement keys are now being handled by an object.
Try the arrow keys or AWSD to see what they do.
@@ -5488,6 +5703,7 @@ Press &apos;M&apos; to do this.
<notification
icon="notify.tga"
name="FirstAppearance"
+ persist="true"
type="notify">
You are editing your Appearance.
Use the arrow keys to look around.
@@ -5497,6 +5713,7 @@ When you are done, press &apos;Save All&apos;.
<notification
icon="notify.tga"
name="FirstInventory"
+ persist="true"
type="notify">
This is your Inventory, which contains items you own.
@@ -5509,6 +5726,7 @@ This is your Inventory, which contains items you own.
<notification
icon="notify.tga"
name="FirstSandbox"
+ persist="true"
type="notify">
This is a sandbox area, and is meant to help Residents learn how to build.
@@ -5519,6 +5737,7 @@ Things you build here will be deleted after you leave, so don&apos;t forget to r
<notification
icon="notify.tga"
name="FirstFlexible"
+ persist="true"
type="notify">
This object is flexible. Flexis must be phantom and not physical.
</notification>
@@ -5526,6 +5745,7 @@ This object is flexible. Flexis must be phantom and not physical.
<notification
icon="notify.tga"
name="FirstDebugMenus"
+ persist="true"
type="notify">
You opened the Advanced menu.
@@ -5538,6 +5758,7 @@ To toggle this menu,
<notification
icon="notify.tga"
name="FirstSculptedPrim"
+ persist="true"
type="notify">
You are editing a Sculpted prim. Sculpties require a special texture to define their shape.
</notification>
@@ -5547,6 +5768,7 @@ You are editing a Sculpted prim. Sculpties require a special texture to define t
<notification
icon="notify.tga"
name="FirstMedia"
+ persist="true"
type="notify">
You have begun playing media. Media can set to play automatically in the preferences window under Audio / Video. Note that this can be a security risk for media sites you do not trust.
</notification>
@@ -5587,6 +5809,7 @@ Click Accept to join the call or Decline to decline the invitation. Click Block
<notification
icon="notify.tga"
name="AutoUnmuteByIM"
+ persist="true"
type="notify">
[FIRST] [LAST] was sent an instant message and has been automatically unblocked.
</notification>
@@ -5594,6 +5817,7 @@ Click Accept to join the call or Decline to decline the invitation. Click Block
<notification
icon="notify.tga"
name="AutoUnmuteByMoney"
+ persist="true"
type="notify">
[FIRST] [LAST] was given money and has been automatically unblocked.
</notification>
@@ -5601,6 +5825,7 @@ Click Accept to join the call or Decline to decline the invitation. Click Block
<notification
icon="notify.tga"
name="AutoUnmuteByInventory"
+ persist="true"
type="notify">
[FIRST] [LAST] was offered inventory and has been automatically unblocked.
</notification>
@@ -5759,6 +5984,50 @@ We are creating a voice channel for you. This may take up to one minute.
</notification>
<notification
+ icon="notify.tga"
+ name="VoiceEffectsExpired"
+ sound="UISndAlert"
+ persist="true"
+ type="notify">
+One or more of your subscribed Voice Morphs has expired.
+[[URL] Click here] to renew your subscription.
+ <unique/>
+ </notification>
+
+ <notification
+ icon="notify.tga"
+ name="VoiceEffectsExpiredInUse"
+ sound="UISndAlert"
+ persist="true"
+ type="notify">
+The active Voice Morph has expired, your normal voice settings have been applied.
+[[URL] Click here] to renew your subscription.
+ <unique/>
+ </notification>
+
+ <notification
+ icon="notify.tga"
+ name="VoiceEffectsWillExpire"
+ sound="UISndAlert"
+ persist="true"
+ type="notify">
+One or more of your Voice Morphs will expire in less than [INTERVAL] days.
+[[URL] Click here] to renew your subscription.
+ <unique/>
+ </notification>
+ LLNotificationsUtil::add("VoiceEffectsNew");
+
+ <notification
+ icon="notify.tga"
+ name="VoiceEffectsNew"
+ sound="UISndAlert"
+ persist="true"
+ type="notify">
+New Voice Morphs are available!
+ <unique/>
+ </notification>
+
+ <notification
icon="notifytip.tga"
name="Cannot enter parcel: not a group member"
type="notifytip">
@@ -5848,7 +6117,8 @@ Are you sure you want to close all IMs?
<usetemplate
name="okcancelignore"
notext="Cancel"
- yestext="OK"/>
+ yestext="OK"
+ ignoretext="Confirm before I close all IMs"/>
</notification>
<notification icon="notifytip.tga"
@@ -5913,6 +6183,186 @@ Selected button can not be shown right now.
The button will be shown when there is enough space for it.
</notification>
+ <notification
+ icon="notifytip.tga"
+ name="ShareNotification"
+ type="notifytip">
+Select residents to share with.
+ </notification>
+ <notification
+ icon="notifytip.tga"
+ name="ShareItemsConfirmation"
+ type="alertmodal">
+Are you sure you want to share the following items:
+
+[ITEMS]
+
+With the following Residents:
+
+[RESIDENTS]
+ <usetemplate
+ name="okcancelbuttons"
+ notext="Cancel"
+ yestext="Ok"/>
+ </notification>
+ <notification
+ icon="notifytip.tga"
+ name="ItemsShared"
+ type="notifytip">
+Items successfully shared.
+ </notification>
+ <notification
+ icon="notifytip.tga"
+ name="DeedToGroupFail"
+ type="notifytip">
+Deed to group failed.
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="AvatarRezNotification"
+ type="notifytip">
+( [EXISTENCE] seconds alive )
+Avatar '[NAME]' declouded after [TIME] seconds.
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="AvatarRezSelfBakedDoneNotification"
+ type="notifytip">
+( [EXISTENCE] seconds alive )
+You finished baking your outfit after [TIME] seconds.
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="AvatarRezSelfBakedUpdateNotification"
+ type="notifytip">
+( [EXISTENCE] seconds alive )
+You sent out an update of your appearance after [TIME] seconds.
+[STATUS]
+ </notification>
+
+
+ <notification
+ icon="notifytip.tga"
+ name="AvatarRezCloudNotification"
+ type="notifytip">
+( [EXISTENCE] seconds alive )
+Avatar '[NAME]' became cloud.
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="AvatarRezArrivedNotification"
+ type="notifytip">
+( [EXISTENCE] seconds alive )
+Avatar '[NAME]' appeared.
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="AvatarRezLeftCloudNotification"
+ type="notifytip">
+( [EXISTENCE] seconds alive )
+Avatar '[NAME]' left after [TIME] seconds as cloud.
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="AvatarRezEnteredAppearanceNotification"
+ type="notifytip">
+( [EXISTENCE] seconds alive )
+Avatar '[NAME]' entered appearance mode.
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="AvatarRezLeftAppearanceNotification"
+ type="notifytip">
+( [EXISTENCE] seconds alive )
+Avatar '[NAME]' left appearance mode.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoConnect"
+ type="alertmodal">
+We're having trouble connecting using [PROTOCOL] [HOSTID].
+Please check your network and firewall setup.
+ <form name="form">
+ <button
+ default="true"
+ index="0"
+ name="OK"
+ text="OK"/>
+ </form>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="NoVoiceConnect"
+ type="alertmodal">
+We're having trouble connecting to your voice server:
+
+[HOSTID]
+
+Voice communications will not be available.
+Please check your network and firewall setup.
+ <form name="form">
+ <button
+ default="true"
+ index="0"
+ name="OK"
+ text="OK"/>
+ </form>
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="AvatarRezLeftNotification"
+ type="notifytip">
+( [EXISTENCE] seconds alive )
+Avatar '[NAME]' left as fully loaded.
+ </notification>
+
+ <notification
+ icon="notifytip.tga"
+ name="AvatarRezSelfBakeNotification"
+ type="notifytip">
+( [EXISTENCE] seconds alive )
+You uploaded a [RESOLUTION] baked texture for '[BODYREGION]' after [TIME] seconds.
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="ConfirmLeaveCall"
+ type="alert">
+Are you sure you want to leave this call?
+ <usetemplate
+ ignoretext="Confirm before I leave call"
+ name="okcancelignore"
+ notext="No"
+ yestext="Yes"/>
+ <unique/>
+ </notification>
+
+ <notification
+ icon="alertmodal.tga"
+ name="ConfirmMuteAll"
+ type="alert">
+You have selected to mute all participants in a group call.
+This will also cause all residents that later join the call to be
+muted, even after you have left the call.
+
+Mute everyone?
+ <usetemplate
+ ignoretext="Confirm before I mute all participants in a group call"
+ name="okcancelignore"
+ yestext="Ok"
+ notext="Cancel"/>
+ <unique/>
+ </notification>
<global name="UnsupportedCPU">
- Your CPU speed does not meet the minimum requirements.
diff --git a/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml b/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml
new file mode 100644
index 0000000000..bdfa928b1d
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- *NOTE: mantipov: this xml is intended to be used inside panel_outfits_list.xml for each outfit folder-->
+<!-- All accordion tabs in the My Appearance/My Outfits panel will be created from this one at runtime-->
+<!-- Non of string values of controls below are visible to user. They are not need to be translated. -->
+<accordion_tab
+ display_children="false"
+ follows="all"
+ height="45"
+ layout="topleft"
+ name="Mockup Tab"
+ selection_enabled="true"
+ title="Mockup Tab"
+ translate="false"
+ width="0">
+ <wearable_items_list
+ allow_select="true"
+ follows="all"
+ keep_one_selected="true"
+ multi_select="true"
+ name="wearable_items_list"
+ translate="false"
+ standalone="false"
+ />
+</accordion_tab>
diff --git a/indra/newview/skins/default/xui/en/panel_active_object_row.xml b/indra/newview/skins/default/xui/en/panel_active_object_row.xml
index 7657fb8055..bef5f8dafd 100644
--- a/indra/newview/skins/default/xui/en/panel_active_object_row.xml
+++ b/indra/newview/skins/default/xui/en/panel_active_object_row.xml
@@ -10,10 +10,6 @@
background_opaque="false"
background_visible="true"
bg_alpha_color="0.0 0.0 0.0 0.0" >
- <string
- name="unknown_obj">
- Unknown Object
- </string>
<chiclet_script
name="object_chiclet"
layout="topleft"
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 28a6995186..e70abc0975 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
@@ -37,7 +37,7 @@
layout="topleft"
name="speakers_list"
opaque="false"
- show_info_btn="false"
+ show_info_btn="true"
show_profile_btn="false"
show_speaking_indicator="false"
width="147" />
diff --git a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
index c605975c8e..876ff9961b 100644
--- a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
@@ -69,12 +69,13 @@
name="last_interaction"
text_color="LtGray_50"
value="0s"
- width="24" />
+ width="35" />
<button
follows="right"
height="16"
image_pressed="Info_Press"
image_unselected="Info_Over"
+ layout="topleft"
left_pad="3"
right="-53"
name="info_btn"
diff --git a/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml
index 072ea882e6..1e6a31d388 100644
--- a/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml
+++ b/indra/newview/skins/default/xui/en/panel_block_list_sidetray.xml
@@ -11,14 +11,16 @@
width="280">
<button
follows="top|left"
- height="25"
- image_overlay="BackArrow_Off"
+ height="24"
+ image_hover_unselected="BackButton_Over"
+ image_pressed="BackButton_Press"
+ image_unselected="BackButton_Off"
layout="topleft"
name="back"
- left="10"
+ left="4"
tab_stop="false"
- top="0"
- width="25"/>
+ top="1"
+ width="30"/>
<text
follows="top|left|right"
font="SansSerifLargeBold"
@@ -39,7 +41,13 @@
name="blocked"
tool_tip="List of currently blocked Residents"
top="30"
- width="270" />
+ width="270">
+ <scroll_list.columns
+ name="item_name" />
+ <scroll_list.columns
+ name="item_type"
+ width="96" />
+ </scroll_list>
<button
follows="left|bottom"
height="23"
diff --git a/indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml
new file mode 100644
index 0000000000..4f989a6f6f
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_body_parts_list_item.xml
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ follows="top|right|left"
+ height="23"
+ layout="topleft"
+ left="0"
+ name="wearable_item"
+ top="0"
+ width="380">
+ <icon
+ follows="top|right|left"
+ height="22"
+ image_name="ListItem_Over"
+ layout="topleft"
+ left="0"
+ name="hovered_icon"
+ top="1"
+ visible="false"
+ width="380" />
+ <icon
+ height="22"
+ follows="top|right|left"
+ image_name="ListItem_Select"
+ layout="topleft"
+ left="0"
+ name="selected_icon"
+ top="1"
+ visible="false"
+ width="380" />
+ <icon
+ height="16"
+ follows="top|left"
+ image_name="Inv_Object"
+ layout="topleft"
+ left="0"
+ name="item_icon"
+ top="2"
+ width="16" />
+ <text
+ follows="left|right"
+ height="16"
+ layout="topleft"
+ left_pad="5"
+ allow_html="false"
+ use_ellipses="true"
+ name="item_name"
+ text_color="white"
+ top="5"
+ value="..."
+ width="359" />
+ <panel
+ background_visible="false"
+ name="btn_lock"
+ layout="topleft"
+ follows="top|right"
+ top="0"
+ left="0"
+ height="23"
+ width="23"
+ tab_stop="false"
+ tool_tip="You don't have permission to edit">
+ <icon
+ name="btn_lock1"
+ layout="topleft"
+ follows="top|right"
+ image_name="Locked_Icon"
+ top="2"
+ left="5"
+ height="13"
+ width="9"
+ tab_stop="false" />
+ </panel>
+ <panel
+ background_visible="false"
+ name="btn_edit_panel"
+ layout="topleft"
+ follows="top|right"
+ top="1"
+ left_pad="3"
+ height="23"
+ width="26"
+ tab_stop="false">
+ <button
+ name="btn_edit"
+ layout="topleft"
+ follows="top|right"
+ image_overlay="Edit_Wrench"
+ top="0"
+ left="0"
+ height="23"
+ width="23"
+ tab_stop="false"
+ tool_tip="Edit this shape"/>
+ </panel>
+ <icon
+ follows="left|right|top"
+ height="3"
+ image_name="Wearables_Divider"
+ layout="bottomleft"
+ left="0"
+ name="wearable_type_separator_icon"
+ top="0"
+ visible="true"
+ width="380"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_bodyparts_list_button_bar.xml b/indra/newview/skins/default/xui/en/panel_bodyparts_list_button_bar.xml
new file mode 100644
index 0000000000..dc123f13f4
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_bodyparts_list_button_bar.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+
+<panel
+ follows="left|right|top"
+ height="35"
+ layout="topleft"
+ left="0"
+ name="clothing_list_button_bar_panel"
+ top="0"
+ visible="true"
+ width="300">
+ <button
+ follows="top|left"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ label="Switch"
+ layout="topleft"
+ left="5"
+ name="switch_btn"
+ top="5"
+ width="45" />
+ <button
+ follows="top|right"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Shop"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ right="-5"
+ name="bodyparts_shop_btn"
+ top="5"
+ width="45" />
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_bottomtray.xml b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
index aad55685d2..4eff5bc48a 100644
--- a/indra/newview/skins/default/xui/en/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/en/panel_bottomtray.xml
@@ -1,309 +1,401 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
- mouse_opaque="true"
background_visible="true"
bg_alpha_color="DkGray"
bg_opaque_color="DkGray"
+ chrome="true"
follows="left|bottom|right"
height="33"
layout="topleft"
left="0"
name="bottom_tray"
top="28"
- chrome="true"
- border_visible="false"
- width="1000">
- <string name="SpeakBtnToolTip">Turns microphone on/off</string>
- <string name="VoiceControlBtnToolTip">Shows/hides voice control panel</string>
+ width="1310">
+ <string
+ name="SpeakBtnToolTip"
+ value="Turns microphone on/off" />
+ <string
+ name="VoiceControlBtnToolTip"
+ value="Shows/hides voice control panel" />
<layout_stack
- mouse_opaque="false"
border_size="0"
clip="false"
follows="all"
height="28"
layout="topleft"
left="0"
+ mouse_opaque="false"
name="toolbar_stack"
orientation="horizontal"
top="0"
- width="1000">
+ width="1310">
<icon
auto_resize="false"
follows="left|right"
height="10"
image_name="spacer24.tga"
layout="topleft"
- min_width="2"
left="0"
+ min_width="2"
top="0"
width="2" />
<layout_panel
- mouse_opaque="false"
auto_resize="false"
+ filename="panel_nearby_chat_bar.xml"
follows="left|right"
height="28"
layout="topleft"
left="0"
+ max_width="320"
min_height="23"
- width="310"
- top="4"
- min_width="188"
+ min_width="214"
+ mouse_opaque="false"
name="chat_bar"
- user_resize="false"
- filename="panel_nearby_chat_bar.xml" />
+ top="4"
+ user_resize="true"
+ width="308" />
+ <!--
+ There is resize bar between chatbar and Speak button. It has 2px width (is is set as 2*UIResizeBarOverlap)
+ -->
<layout_panel
- mouse_opaque="false"
auto_resize="false"
follows="right"
height="28"
layout="topleft"
min_height="28"
- width="100"
- top_delta="0"
- min_width="54"
+ min_width="59"
+ mouse_opaque="false"
name="speak_panel"
- user_resize="false">
- <talk_button
- follows="left|right"
- height="23"
- speak_button.tab_stop="true"
- show_button.tab_stop="true"
- layout="topleft"
- left="0"
- name="talk"
- top="5"
- width="100">
- <show_button>
- <show_button.init_callback
- function="Button.SetDockableFloaterToggle"
- parameter="voice_controls" />
- </show_button>
- </talk_button>
+ top_delta="0"
+ user_resize="true"
+ width="110">
+ <talk_button
+ follows="left|right"
+ height="23"
+ layout="topleft"
+ left="2"
+ name="talk"
+ top="5"
+ width="105">
+ <show_button
+ tab_stop="true">
+ <init_callback
+ function="Button.SetDockableFloaterToggle"
+ parameter="voice_controls" />
+ </show_button>
+ <!-- do not remove halign attribute with default value. otherwise it can't be overridden in other locales.
+ & pad_right is default value for long label which can be right aligned. See EXT-6318 -->
+ <speak_button
+ halign="center"
+ label="Speak"
+ label_selected="Speak"
+ name="speak_btn"
+ pad_right="20"
+ tab_stop="true"
+ use_ellipses="true" />
+ </talk_button>
</layout_panel>
- <icon
- auto_resize="false"
- follows="left|right"
- height="10"
- image_name="spacer24.tga"
- layout="topleft"
- left="0"
- name="after_speak_panel"
- min_width="3"
- top="0"
- width="3"/>
<layout_panel
- mouse_opaque="false"
auto_resize="false"
follows="right"
height="28"
layout="topleft"
min_height="28"
- width="82"
- top_delta="0"
- min_width="52"
+ min_width="65"
+ mouse_opaque="false"
name="gesture_panel"
- user_resize="false">
- <gesture_combo_list
- follows="left|right"
- height="23"
- label="Gesture"
- layout="topleft"
- name="Gesture"
- left="0"
- top="5"
- width="82"
- tool_tip="Shows/hides gestures">
- <gesture_combo_list.combo_button
- pad_right="10"
- use_ellipses="true" />
- </gesture_combo_list>
+ top_delta="0"
+ user_resize="false"
+ width="85">
+ <gesture_combo_list
+ follows="left|right"
+ height="23"
+ label="Gesture"
+ layout="topleft"
+ left="0"
+ name="Gesture"
+ tool_tip="Shows/hides gestures"
+ top="5"
+ width="82">
+ <combo_button
+ pad_right="10"
+ use_ellipses="true" />
+ <combo_list
+ page_lines="17" />
+ </gesture_combo_list>
</layout_panel>
- <icon
- auto_resize="false"
- color="0 0 0 0"
- follows="left|right"
- height="10"
- image_name="spacer24.tga"
- layout="topleft"
- left="0"
- min_width="3"
- name="after_gesture_panel"
- top="0"
- width="3"/>
<layout_panel
- mouse_opaque="false"
auto_resize="false"
follows="right"
height="28"
layout="topleft"
min_height="28"
+ min_width="52"
+ mouse_opaque="false"
name="movement_panel"
user_resize="false"
- width="80"
- min_width="49">
+ width="83">
<button
- image_selected="PushButton_Selected_Press"
- image_pressed="PushButton_Press"
- image_pressed_selected="PushButton_Selected_Press"
follows="left|right"
height="23"
- use_ellipses="true"
+ image_pressed="PushButton_Press"
+ image_pressed_selected="PushButton_Selected_Press"
+ image_selected="PushButton_Selected_Press"
is_toggle="true"
label="Move"
layout="topleft"
name="movement_btn"
tool_tip="Shows/hides movement controls"
top="5"
+ use_ellipses="true"
width="80">
- <button.init_callback
+ <init_callback
function="Button.SetDockableFloaterToggle"
parameter="moveview" />
</button>
</layout_panel>
- <icon
- auto_resize="false"
- color="0 0 0 0"
- follows="left|right"
- height="10"
- image_name="spacer24.tga"
- layout="topleft"
- left="0"
- min_width="3"
- name="after_movement_panel"
- top="0"
- width="3"/>
<layout_panel
- mouse_opaque="false"
auto_resize="false"
follows="left|right"
height="28"
layout="topleft"
min_height="28"
- min_width="49"
+ min_width="52"
+ mouse_opaque="false"
name="cam_panel"
user_resize="false"
- width="80">
+ width="83">
<button
- image_selected="PushButton_Selected_Press"
- image_pressed="PushButton_Press"
- image_pressed_selected="PushButton_Selected_Press"
follows="left|right"
height="23"
- use_ellipses="true"
+ image_pressed="PushButton_Press"
+ image_pressed_selected="PushButton_Selected_Press"
+ image_selected="PushButton_Selected_Press"
is_toggle="true"
label="View"
layout="topleft"
left="0"
+ name="camera_btn"
tool_tip="Shows/hides camera controls"
top="5"
- name="camera_btn"
+ use_ellipses="true"
width="80">
- <button.init_callback
+ <init_callback
function="Button.SetDockableFloaterToggle"
parameter="camera" />
</button>
</layout_panel>
- <icon
- auto_resize="false"
- color="0 0 0 0"
- follows="left|right"
- height="10"
- image_name="spacer24.tga"
- layout="topleft"
- left="0"
- min_width="3"
- name="after_cam_panel"
- top="0"
- width="3"/>
<layout_panel
- mouse_opaque="false"
auto_resize="false"
follows="left|right"
height="28"
layout="topleft"
min_width="40"
+ mouse_opaque="false"
name="snapshot_panel"
- width="40">
+ user_resize="false"
+ width="39">
<button
- follows="left|right"
+ follows="left|right"
height="23"
+ image_overlay="Snapshot_Off"
+ image_pressed="PushButton_Press"
+ image_pressed_selected="PushButton_Selected_Press"
image_selected="PushButton_Selected_Press"
+ is_toggle="true"
+ layout="topleft"
+ left="0"
+ name="snapshots"
+ tool_tip="Take snapshot"
+ top="5"
+ width="36">
+ <init_callback
+ function="Button.SetFloaterToggle"
+ parameter="snapshot" />
+ </button>
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="left|right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ min_width="52"
+ mouse_opaque="false"
+ name="build_btn_panel"
+ user_resize="false"
+ width="83">
+<!--*FIX: Build Floater is not opened with default registration. Will be fixed soon.
+Disabled for now.
+-->
+ <button
+ follows="left|right"
+ height="23"
image_pressed="PushButton_Press"
image_pressed_selected="PushButton_Selected_Press"
+ image_selected="PushButton_Selected_Press"
+ is_toggle="true"
+ label="Build"
+ layout="topleft"
left="0"
- label=""
+ name="build_btn"
+ tool_tip="Shows/hides Build Tools"
+ top="5"
+ use_ellipses="true"
+ width="80">
+ <commit_callback
+ function="Build.Toggle"
+ parameter="build" />
+ </button>
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="left|right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ min_width="52"
+ mouse_opaque="false"
+ name="search_btn_panel"
+ user_resize="false"
+ width="83">
+ <button
+ follows="left|right"
+ height="23"
+ image_pressed="PushButton_Press"
+ image_pressed_selected="PushButton_Selected_Press"
+ image_selected="PushButton_Selected_Press"
+ is_toggle="true"
+ label="Search"
layout="topleft"
- name="snapshots"
- width="36"
+ left="0"
+ name="search_btn"
+ tool_tip="Shows/hides Search"
top="5"
+ use_ellipses="true"
+ width="80">
+ <init_callback
+ function="Button.SetFloaterToggle"
+ parameter="search" />
+ </button>
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ follows="left|right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ min_width="52"
+ mouse_opaque="false"
+ name="world_map_btn_panel"
+ user_resize="false"
+ width="83">
+ <button
+ follows="left|right"
+ height="23"
+ image_pressed="PushButton_Press"
+ image_pressed_selected="PushButton_Selected_Press"
+ image_selected="PushButton_Selected_Press"
is_toggle="true"
- image_overlay="Snapshot_Off"
- tool_tip="Take snapshot">
- <button.init_callback
- function="Button.SetFloaterToggle"
- parameter="snapshot" />
- </button>
- </layout_panel>
+ label="Map"
+ layout="topleft"
+ left="0"
+ name="world_map_btn"
+ tool_tip="Shows/hides World Map"
+ top="5"
+ use_ellipses="true"
+ width="80">
+ <init_callback
+ function="Button.SetFloaterToggle"
+ parameter="world_map" />
+ </button>
+ </layout_panel>
<layout_panel
+ auto_resize="false"
+ follows="left|right"
+ height="28"
+ layout="topleft"
+ min_height="28"
+ min_width="52"
mouse_opaque="false"
+ name="mini_map_btn_panel"
+ user_resize="false"
+ width="83">
+ <button
+ follows="left|right"
+ height="23"
+ image_pressed="PushButton_Press"
+ image_pressed_selected="PushButton_Selected_Press"
+ image_selected="PushButton_Selected_Press"
+ is_toggle="true"
+ label="Mini-Map"
+ layout="topleft"
+ left="0"
+ name="mini_map_btn"
+ tool_tip="Shows/hides Mini-Map"
+ top="5"
+ use_ellipses="true"
+ width="80">
+ <init_callback
+ function="Button.SetFloaterToggle"
+ parameter="mini_map" />
+ </button>
+ </layout_panel>
+ <layout_panel
follows="left|right"
- height="29"
+ height="30"
layout="topleft"
- top="0"
+ min_width="95"
+ mouse_opaque="false"
name="chiclet_list_panel"
- width="189"
- min_width="110"
+ top="0"
user_resize="false"
- auto_resize="true">
+ width="189">
<!--*NOTE: min_width of the chiclet_panel (chiclet_list) must be the same
as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly. EXT-991-->
<chiclet_panel
- mouse_opaque="false"
+ chiclet_padding="4"
follows="left|right"
- height="23"
+ height="24"
layout="topleft"
left="1"
- min_width="110"
+ min_width="95"
+ mouse_opaque="false"
name="chiclet_list"
- top="8"
- chiclet_padding="4"
- scrolling_offset="40"
+ top="7"
width="189">
<button
auto_resize="true"
follows="right"
height="29"
+ image_hover_selected="SegmentedBtn_Left_Over"
+ image_hover_unselected="SegmentedBtn_Left_Over"
+ image_overlay="Arrow_Small_Left"
+ image_pressed="SegmentedBtn_Left_Press"
+ image_pressed_selected="SegmentedBtn_Left_Press"
image_selected="SegmentedBtn_Left_Off"
image_unselected="SegmentedBtn_Left_Off"
- image_hover_selected="SegmentedBtn_Left_Over"
- image_hover_unselected="SegmentedBtn_Left_Over"
- image_pressed="SegmentedBtn_Left_Press"
- image_pressed_selected="SegmentedBtn_Left_Press"
- image_overlay="Arrow_Small_Left"
layout="topleft"
name="chicklet_left_scroll_button"
- scale_image="true"
tab_stop="false"
- top="-4"
- right_pad="2"
+ top="-28"
visible="false"
width="7" />
<button
auto_resize="true"
follows="right"
height="29"
+ image_hover_selected="SegmentedBtn_Right_Over"
+ image_hover_unselected="SegmentedBtn_Right_Over"
+ image_overlay="Arrow_Small_Right"
+ image_pressed="SegmentedBtn_Right_Press"
+ image_pressed_selected="SegmentedBtn_Right_Press"
image_selected="SegmentedBtn_Right_Off"
image_unselected="SegmentedBtn_Right_Off"
- image_hover_selected="SegmentedBtn_Right_Over"
- image_hover_unselected="SegmentedBtn_Right_Over"
- image_pressed="SegmentedBtn_Right_Press"
- image_pressed_selected="SegmentedBtn_Right_Press"
- image_overlay="Arrow_Small_Right"
layout="topleft"
name="chicklet_right_scroll_button"
- scale_image="true"
tab_stop="false"
- top="-4"
+ top="-28"
visible="false"
width="7" />
</chiclet_panel>
@@ -319,25 +411,24 @@ as for parent layout_panel (chiclet_list_panel) to resize bottom tray properly.
min_width="4"
name="DUMMY"
top="0"
- width="5"/>
+ width="4" />
<layout_panel
auto_resize="false"
follows="right"
height="28"
layout="topleft"
min_height="28"
- top="0"
+ min_width="37"
name="im_well_panel"
- width="35"
- min_width="35"
- user_resize="false">
+ top="0"
+ user_resize="false"
+ width="37">
<chiclet_im_well
- max_displayed_count="99"
- flash_period="0.3"
follows="right"
height="28"
layout="topleft"
left="0"
+ max_displayed_count="99"
name="im_well"
top="0"
width="35">
@@ -363,8 +454,8 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well
left="0"
name="Unread IM messages"
tool_tip="Conversations"
- width="34" >
- <button.init_callback
+ width="34">
+ <init_callback
function="Button.SetDockableFloaterToggle"
parameter="im_well_window" />
</button>
@@ -376,25 +467,12 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well
height="28"
layout="topleft"
min_height="28"
- top="0"
- left_pad="3"
+ min_width="37"
name="notification_well_panel"
- width="40"
- min_width="40"
- user_resize="false">
- <icon
- auto_resize="false"
- color="0 0 0 0"
- follows="left|right"
- height="10"
- image_name="spacer24.tga"
- layout="topleft"
- left="0"
- min_width="4"
top="0"
- width="5" />
+ user_resize="false"
+ width="37">
<chiclet_notification
- flash_period="0.25"
follows="right"
height="23"
layout="topleft"
@@ -403,38 +481,27 @@ image_pressed_selected "Lit" + "Selected" - there are new messages and the Well
name="notification_well"
top="5"
width="35">
- <button
+ <button
+ auto_resize="true"
bottom_pad="3"
+ follows="right"
+ halign="center"
+ height="23"
+ image_overlay="Notices_Unread"
+ image_overlay_alignment="center"
image_pressed="WellButton_Lit"
image_pressed_selected="WellButton_Lit_Selected"
image_selected="PushButton_Press"
- auto_resize="true"
- halign="center"
- height="23"
- follows="right"
- label_color="Black"
- left="0"
- name="Unread"
- image_overlay="Notices_Unread"
- image_overlay_alignment="center"
- tool_tip="Notifications"
- width="34" >
- <button.init_callback
- function="Button.SetDockableFloaterToggle"
- parameter="notification_well_window" />
- </button>
- <icon
- auto_resize="false"
- color="0 0 0 0"
- follows="left|right"
- height="10"
- image_name="spacer24.tga"
- layout="topleft"
- left="0"
- min_width="4"
- top="0"
- width="5" />
- </chiclet_notification>
+ label_color="Black"
+ left="0"
+ name="Unread"
+ tool_tip="Notifications"
+ width="34">
+ <init_callback
+ function="Button.SetDockableFloaterToggle"
+ parameter="notification_well_window" />
+ </button>
+ </chiclet_notification>
</layout_panel>
</layout_stack>
</panel>
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 89d632c4c6..9124ad528d 100644
--- a/indra/newview/skins/default/xui/en/panel_chat_header.xml
+++ b/indra/newview/skins/default/xui/en/panel_chat_header.xml
@@ -2,7 +2,8 @@
<panel
background_visible="true"
bevel_style="in"
- bg_alpha_color="black"
+ bg_opaque_color="Black"
+ bg_alpha_color="DkGray_66"
follows="top|left|right"
height="24"
label="im_header"
@@ -19,7 +20,8 @@
name="avatar_icon"
top="3"
width="18" />
- <text_editor
+ <text
+ allow_html="false"
allow_scroll="false"
v_pad = "7"
read_only = "true"
diff --git a/indra/newview/skins/default/xui/en/panel_classified_info.xml b/indra/newview/skins/default/xui/en/panel_classified_info.xml
index 31719aad20..976f6d6cd0 100644
--- a/indra/newview/skins/default/xui/en/panel_classified_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_classified_info.xml
@@ -22,25 +22,43 @@
name="l$_price">
L$[PRICE]
</panel.string>
+ <panel.string
+ name="click_through_text_fmt">
+ [TELEPORT] teleport, [MAP] map, [PROFILE] profile
+ </panel.string>
+ <panel.string
+ name="date_fmt">
+ [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
+ </panel.string>
+ <panel.string
+ name="auto_renew_on">
+ Enabled
+ </panel.string>
+ <panel.string
+ name="auto_renew_off">
+ Disabled
+ </panel.string>
<button
follows="top|right"
- height="23"
- image_overlay="BackArrow_Off"
+ height="24"
+ image_hover_unselected="BackButton_Over"
+ image_pressed="BackButton_Press"
+ image_unselected="BackButton_Off"
layout="topleft"
name="back_btn"
picture_style="true"
left="10"
tab_stop="false"
top="2"
- width="23" />
+ width="30" />
<text
follows="top|left|right"
font="SansSerifHugeBold"
height="26"
layout="topleft"
- left_pad="10"
+ left_pad="4"
name="title"
- text_color="white"
+ text_color="LtGray"
top="0"
value="Classified Info"
use_ellipses="true"
@@ -49,13 +67,13 @@
color="DkGray2"
opaque="true"
follows="all"
- height="500"
+ height="502"
layout="topleft"
left="10"
top_pad="10"
name="profile_scroll"
reserve_scroll_corner="false"
- width="313">
+ width="312">
<panel
name="scroll_content_panel"
follows="left|top"
@@ -63,18 +81,28 @@
layout="topleft"
top="0"
background_visible="false"
- height="500"
+ height="610"
left="0"
- width="295">
+ width="285">
+ <panel
+ name="snapshot_panel"
+ layout="topleft"
+ follows="left|top|right"
+ height="197"
+ left="10"
+ top="10"
+ width="275"
+ >
<texture_picker
enabled="false"
- follows="left|top"
+ follows="left|top|right"
height="197"
layout="topleft"
- left="10"
+ left="0"
name="classified_snapshot"
- top="20"
- width="290" />
+ top="0"
+ width="275" />
+ </panel>
<text_editor
allow_scroll="false"
bg_visible="false"
@@ -93,20 +121,61 @@
v_pad="0"
value="[name]"
use_ellipses="true" />
+ <text
+ follows="left|top"
+ font.style="BOLD"
+ height="10"
+ layout="topleft"
+ left="10"
+ name="classified_location_label"
+ text_color="white"
+ top_pad="5"
+ value="Location:"
+ width="250" />
<text_editor
allow_scroll="false"
bg_visible="false"
follows="left|top"
h_pad="0"
- height="25"
+ height="30"
layout="topleft"
left="10"
name="classified_location"
read_only="true"
+ top_pad="5"
width="290"
word_wrap="true"
v_pad="0"
value="[loading...]" />
+ <text
+ follows="left|top"
+ font.style="BOLD"
+ height="10"
+ layout="topleft"
+ left="10"
+ name="content_type_label"
+ text_color="white"
+ top_pad="10"
+ value="Content Type:"
+ width="140" />
+ <icon
+ follows="top|left"
+ height="16"
+ image_name="Parcel_M_Light"
+ layout="topleft"
+ left_pad="0"
+ name="content_type_moderate"
+ top_pad="-11"
+ width="18" />
+ <icon
+ follows="top|left"
+ height="16"
+ image_name="Parcel_PG_Light"
+ layout="topleft"
+ left_delta="0"
+ name="content_type_general"
+ top_delta="0"
+ width="18" />
<text_editor
allow_scroll="false"
bg_visible="false"
@@ -114,13 +183,24 @@
h_pad="0"
height="18"
layout="topleft"
- left="10"
+ left_pad="2"
name="content_type"
read_only="true"
- width="290"
- top_pad="5"
+ width="130"
+ top_delta="1"
v_pad="0"
value="[content type]" />
+ <text
+ follows="left|top"
+ font.style="BOLD"
+ height="10"
+ layout="topleft"
+ left="10"
+ name="category_label"
+ text_color="white"
+ top_pad="0"
+ value="Category:"
+ width="140" />
<text_editor
allow_html="true"
allow_scroll="false"
@@ -129,23 +209,51 @@
h_pad="0"
height="18"
layout="topleft"
- left="10"
+ left_pad="0"
name="category"
read_only="true"
- width="290"
- top_pad="5"
+ width="150"
+ top_pad="-10"
v_pad="0"
value="[category]" />
- <check_box
- enabled="false"
+ <text
+ follows="left|top"
+ font.style="BOLD"
+ height="10"
+ layout="topleft"
+ left="10"
+ name="creation_date_label"
+ text_color="white"
+ top_pad="0"
+ value="Creation date:"
+ width="140" />
+ <text_editor
+ allow_scroll="false"
+ bg_visible="false"
+ follows="left|top"
+ h_pad="0"
+ halign="left"
height="16"
- label="Auto renew each week"
+ layout="topleft"
+ left_pad="0"
+ name="creation_date"
+ read_only="true"
+ top_pad="-10"
+ tool_tip="Creation date"
+ v_pad="0"
+ value="[date]"
+ width="150" />
+ <text
+ follows="left|top"
+ font.style="BOLD"
+ height="10"
layout="topleft"
left="10"
- name="auto_renew"
+ name="price_for_listing_label"
+ text_color="white"
top_pad="5"
- v_pad="0"
- width="290" />
+ value="Price for listing:"
+ width="140" />
<text_editor
allow_scroll="false"
bg_visible="false"
@@ -154,64 +262,166 @@
halign="left"
height="16"
layout="topleft"
- left="10"
+ left_pad="0"
name="price_for_listing"
read_only="true"
- top_pad="5"
+ top_pad="-10"
tool_tip="Price for listing."
v_pad="0"
+ value="[price]"
width="105" />
+ <layout_stack
+ animate="false"
+ name="descr_stack"
+ layout="topleft"
+ follows="all"
+ orientation="vertical"
+ left="10"
+ top_pad="5"
+ width="290"
+ height="215">
+ <layout_panel
+ auto_resize="false"
+ name="clickthrough_layout_panel"
+ layout="topleft"
+ follows="all"
+ left="0"
+ top="0"
+ width="290"
+ height="16"
+ user_resize="false">
+ <text
+ follows="left|top"
+ font.style="BOLD"
+ height="10"
+ layout="topleft"
+ left="0"
+ name="click_through_label"
+ text_color="white"
+ top_pad="0"
+ value="Clicks:"
+ width="140" />
<text_editor
- allow_html="true"
allow_scroll="false"
bg_visible="false"
- follows="left|top|right"
+ follows="left|top"
+ h_pad="0"
+ halign="left"
+ height="16"
+ layout="topleft"
+ left_pad="0"
+ name="click_through_text"
+ read_only="true"
+ top_pad="-10"
+ tool_tip="Click through data"
+ v_pad="0"
+ value="[clicks]"
+ width="150" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ name="price_layout_panel"
+ layout="topleft"
+ follows="all"
+ left="0"
+ top="0"
+ width="290"
+ height="16"
+ user_resize="false">
+ <text
+ follows="left|top"
+ font.style="BOLD"
+ height="10"
+ layout="topleft"
+ left="0"
+ name="auto_renew_label"
+ text_color="white"
+ top="0"
+ value="Auto renew:"
+ width="140" />
+ <text
+ height="16"
+ layout="topleft"
+ follows="top|left"
+ left_pad="0"
+ name="auto_renew"
+ top_pad="-10"
+ value="Enabled"
+ width="150" />
+ </layout_panel>
+ <layout_panel
+ name="descr_layout_panel"
+ layout="topleft"
+ follows="all"
+ left="0"
+ top="0"
+ width="290"
+ height="215"
+ user_resize="false">
+ <text
+ auto_resize="false"
+ follows="left|top"
+ font.style="BOLD"
+ height="10"
+ layout="topleft"
+ left="0"
+ name="classified_desc_label"
+ text_color="white"
+ top="0"
+ value="Description:"
+ width="250" />
+ <text_editor
+ allow_html="true"
+ allow_scroll="true"
+ bg_visible="false"
+ follows="all"
h_pad="0"
height="200"
layout="topleft"
- left="10"
+ left="0"
max_length="1023"
name="classified_desc"
read_only="true"
- width="290"
+ top_pad="7"
+ width="280"
v_pad="0"
value="[description]"
word_wrap="true" />
+ </layout_panel>
+ </layout_stack>
</panel>
</scroll_container>
<panel
follows="left|right|bottom"
- height="20"
+ height="35"
layout="topleft"
- top_pad="8"
- left="10"
+ top_pad="5"
+ left="9"
name="buttons">
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Teleport"
layout="topleft"
left="0"
name="teleport_btn"
top="0"
- width="90" />
+ width="101" />
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Map"
layout="topleft"
- left_pad="10"
+ left_pad="3"
name="show_on_map_btn"
- top="0"
- width="90" />
+ width="100" />
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Edit"
layout="topleft"
- right="-1"
name="edit_btn"
- top="0"
- width="90" />
+ left_pad="3"
+ width="101" />
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml b/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml
index 0c1418fc2d..af3315ebfe 100644
--- a/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_classifieds_list_item.xml
@@ -64,7 +64,9 @@
layout="topleft"
left="103"
name="description"
- textbox.mouse_opaque="false"
+ textbox.max_length="1024"
+ textbox.label="More"
+ textbox.show_context_menu="false"
top_pad="0"
width="178"
word_wrap="true" />
@@ -76,6 +78,6 @@
left_pad="5"
right="-8"
name="info_chevron"
- top_delta="15"
+ top_delta="24"
width="20" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_clothing_list_button_bar.xml b/indra/newview/skins/default/xui/en/panel_clothing_list_button_bar.xml
new file mode 100644
index 0000000000..5b3f0b17a9
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_clothing_list_button_bar.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+
+<panel
+ follows="left|right|top"
+ height="35"
+ layout="topleft"
+ left="0"
+ name="clothing_list_button_bar_panel"
+ top="0"
+ visible="true"
+ width="500">
+ <button
+ follows="top|left"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ is_toggle="true"
+ label="Add +"
+ layout="topleft"
+ left="5"
+ name="add_btn"
+ top="5"
+ width="45" />
+ <button
+ follows="top|right"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Shop"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ right="-5"
+ name="clothing_shop_btn"
+ top="5"
+ width="45" />
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_clothing_list_item.xml b/indra/newview/skins/default/xui/en/panel_clothing_list_item.xml
new file mode 100644
index 0000000000..93d7720c57
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_clothing_list_item.xml
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ follows="top|right|left"
+ height="23"
+ layout="topleft"
+ left="0"
+ name="wearable_item"
+ top="0"
+ width="380">
+ <icon
+ follows="top|right|left"
+ height="22"
+ image_name="ListItem_Over"
+ layout="topleft"
+ left="0"
+ name="hovered_icon"
+ top="1"
+ visible="false"
+ width="380" />
+ <icon
+ height="22"
+ follows="top|right|left"
+ image_name="ListItem_Select"
+ layout="topleft"
+ left="0"
+ name="selected_icon"
+ top="1"
+ visible="false"
+ width="380" />
+ <button
+ name="btn_delete"
+ layout="topleft"
+ follows="top|left"
+ image_unselected="Toast_CloseBtn"
+ image_selected="Toast_CloseBtn"
+ top="3"
+ left="0"
+ height="18"
+ width="18"
+ tab_stop="false"
+ tool_tip="Remove from outfit" />
+ <icon
+ height="16"
+ follows="top|left"
+ image_name="Inv_Object"
+ layout="topleft"
+ left_pad="3"
+ name="item_icon"
+ top="2"
+ width="16" />
+ <text
+ follows="left|right"
+ height="16"
+ layout="topleft"
+ left_pad="5"
+ allow_html="false"
+ use_ellipses="true"
+ name="item_name"
+ text_color="white"
+ top="5"
+ value="..."
+ width="359" />
+ <button
+ name="btn_move_up"
+ layout="topleft"
+ follows="top|right"
+ image_overlay="UpArrow_Off"
+ top="1"
+ left="0"
+ height="23"
+ width="23"
+ tab_stop="false" />
+ <button
+ name="btn_move_down"
+ layout="topleft"
+ follows="top|right"
+ image_overlay="DownArrow_Off"
+ top="1"
+ left_pad="3"
+ height="23"
+ width="23"
+ tab_stop="false" />
+ <panel
+ background_visible="false"
+ name="btn_lock"
+ layout="topleft"
+ follows="top|right"
+ top="0"
+ left="0"
+ height="23"
+ width="23"
+ tab_stop="false"
+ tool_tip="You don't have permission to edit">
+ <icon
+ name="btn_lock1"
+ layout="topleft"
+ follows="top|right"
+ image_name="Locked_Icon"
+ top="2"
+ left="5"
+ height="13"
+ width="9"
+ tab_stop="false" />
+ </panel>
+ <panel
+ background_visible="false"
+ name="btn_edit_panel"
+ layout="topleft"
+ follows="top|right"
+ top="0"
+ left_pad="3"
+ height="23"
+ width="26"
+ tab_stop="false">
+ <button
+ name="btn_edit"
+ layout="topleft"
+ follows="top|right"
+ image_overlay="Edit_Wrench"
+ top="1"
+ left="0"
+ height="23"
+ width="23"
+ tab_stop="false"
+ tool_tip="Edit this wearable"/>
+ </panel>
+ <icon
+ follows="left|right|top"
+ height="3"
+ image_name="Wearables_Divider"
+ layout="bottomleft"
+ left="0"
+ name="wearable_type_separator_icon"
+ top="0"
+ visible="false"
+ width="380"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml
new file mode 100644
index 0000000000..f016c27b0a
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ bg_alpha_color="DkGray"
+ border="false"
+ follows="all"
+ height="200"
+ left="0"
+ name="cof_wearables"
+ width="311">
+ <accordion
+ fit_parent="true"
+ follows="all"
+ height="198"
+ layout="topleft"
+ left="0"
+ single_expansion="true"
+ top="0"
+ name="cof_wearables_accordion"
+ background_visible="true"
+ bg_alpha_color="DkGray2"
+ width="311">
+ <accordion_tab
+ layout="topleft"
+ name="tab_attachments"
+ title="Attachments">
+ <flat_list_view
+ allow_select="true"
+ follows="all"
+ height="10"
+ item_pad="3"
+ layout="topleft"
+ left="0"
+ multi_select="true"
+ name="list_attachments"
+ top="0"
+ width="311" />
+ </accordion_tab>
+ <accordion_tab
+ layout="topleft"
+ name="tab_clothing"
+ title="Clothing">
+ <flat_list_view
+ allow_select="true"
+ follows="all"
+ height="10"
+ item_pad="3"
+ layout="topleft"
+ left="0"
+ multi_select="true"
+ name="list_clothing"
+ top="0"
+ width="311" />
+ </accordion_tab>
+ <accordion_tab
+ layout="topleft"
+ name="tab_body_parts"
+ title="Body Parts">
+ <flat_list_view
+ allow_select="true"
+ follows="all"
+ height="10"
+ item_pad="3"
+ layout="topleft"
+ left="0"
+ multi_select="true"
+ name="list_body_parts"
+ top="0"
+ width="311" />
+ </accordion_tab>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml
new file mode 100644
index 0000000000..75b5fd1532
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_deletable_wearable_list_item.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ follows="top|right|left"
+ height="23"
+ layout="topleft"
+ left="0"
+ name="deletable_wearable_item"
+ top="0"
+ width="380">
+ <icon
+ follows="top|right|left"
+ height="22"
+ image_name="ListItem_Over"
+ layout="topleft"
+ left="0"
+ name="hovered_icon"
+ top="1"
+ visible="false"
+ width="380" />
+ <icon
+ height="22"
+ follows="top|right|left"
+ image_name="ListItem_Select"
+ layout="topleft"
+ left="0"
+ name="selected_icon"
+ top="1"
+ visible="false"
+ width="380" />
+ <button
+ name="btn_delete"
+ layout="topleft"
+ follows="top|left"
+ image_unselected="Toast_CloseBtn"
+ image_selected="Toast_CloseBtn"
+ top="3"
+ left="0"
+ height="18"
+ width="18"
+ tab_stop="false"
+ tool_tip="Remove from outfit"/>
+ <icon
+ height="16"
+ follows="top|left"
+ image_name="Inv_Object"
+ layout="topleft"
+ left_pad="3"
+ name="item_icon"
+ top="2"
+ width="16" />
+ <text
+ follows="left|right"
+ height="16"
+ layout="topleft"
+ left_pad="5"
+ allow_html="false"
+ use_ellipses="true"
+ name="item_name"
+ text_color="white"
+ top="5"
+ value="..."
+ width="359" />
+ <icon
+ follows="left|right|top"
+ height="3"
+ image_name="Wearables_Divider"
+ layout="bottomleft"
+ left="0"
+ name="wearable_type_separator_icon"
+ top="0"
+ visible="true"
+ width="380"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml
new file mode 100644
index 0000000000..a5dd34bd22
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_dummy_clothing_list_item.xml
@@ -0,0 +1,83 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ follows="top|right|left"
+ height="23"
+ layout="topleft"
+ left="0"
+ name="dummy_clothing_item"
+ top="0"
+ width="380">
+ <icon
+ follows="top|right|left"
+ height="22"
+ image_name="ListItem_Over"
+ layout="topleft"
+ left="0"
+ name="hovered_icon"
+ top="1"
+ visible="false"
+ width="380" />
+ <icon
+ height="22"
+ follows="top|right|left"
+ image_name="ListItem_Select"
+ layout="topleft"
+ left="0"
+ name="selected_icon"
+ top="1"
+ visible="false"
+ width="380" />
+ <icon
+ height="16"
+ color="0.75 0.75 0.75 1"
+ follows="top|left"
+ image_name="Inv_Object"
+ layout="topleft"
+ left="20"
+ name="item_icon"
+ top="2"
+ width="16" />
+ <text
+ follows="left|right"
+ height="16"
+ layout="topleft"
+ left_pad="5"
+ allow_html="false"
+ use_ellipses="true"
+ name="item_name"
+ text_color="LtGray_50"
+ top="4"
+ value="..."
+ width="359" />
+ <panel
+ name="btn_add_panel"
+ layout="topleft"
+ follows="top|right"
+ top="0"
+ left="0"
+ height="23"
+ width="26"
+ tab_stop="false">
+ <button
+ name="btn_add"
+ layout="topleft"
+ follows="top|right"
+ image_overlay="AddItem_Off"
+ top="0"
+ left="0"
+ height="23"
+ width="23"
+ tab_stop="false"
+ tool_tip="Add more items of this type" />
+ </panel>
+ <icon
+ follows="left|right|top"
+ height="3"
+ image_name="Wearables_Divider"
+ layout="bottomleft"
+ left="0"
+ name="wearable_type_separator_icon"
+ top="0"
+ visible="true"
+ width="380"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_edit_alpha.xml b/indra/newview/skins/default/xui/en/panel_edit_alpha.xml
index 40647e1b81..7bcd4962d2 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_alpha.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_alpha.xml
@@ -1,126 +1,151 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
+ background_visible="true"
follows="all"
height="400"
layout="topleft"
- left="10"
+ left="0"
name="edit_alpha_panel"
top_pad="10"
- width="313" >
+ width="333" >
<panel
- border="true"
- follows="left|top|right"
- height="180"
+ border="false"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="top|left|right"
+ height="400"
left="10"
layout="topleft"
name="avatar_alpha_color_panel"
top="0"
- width="293" >
+ width="313" >
+ <check_box
+ control_name="LowerAlphaTextureInvisible"
+ follows="left"
+ height="16"
+ layout="topleft"
+ left="5"
+ name="lower alpha texture invisible"
+ top="10"
+ width="16" />
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="115"
label="Lower Alpha"
layout="topleft"
- left="10"
+ left_pad="5"
name="Lower Alpha"
tool_tip="Click to choose a picture"
top="10"
- width="64" />
+ width="115" >
+ <texture_picker.commit_callback
+ function="TexturePicker.Commit" />
+ </texture_picker>
+
<check_box
- control_name="LowerAlphaTextureInvisible"
+ control_name="UpperAlphaTextureInvisible"
follows="left"
height="16"
layout="topleft"
- left_pad="6"
- name="lower alpha texture invisible"
- top_delta="4"
+ left_pad="20"
+ name="upper alpha texture invisible"
+ top="10"
width="16" />
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="115"
label="Upper Alpha"
layout="topleft"
- left_pad="10"
+ left_pad="5"
name="Upper Alpha"
tool_tip="Click to choose a picture"
top="10"
- width="64" />
+ width="115">
+ <texture_picker.commit_callback
+ function="TexturePicker.Commit" />
+ </texture_picker>
+
<check_box
- control_name="UpperAlphaTextureInvisible"
+ control_name="HeadAlphaTextureInvisible"
follows="left"
height="16"
layout="topleft"
- left_pad="6"
- name="upper alpha texture invisible"
- top_delta="4"
+ left="5"
+ name="head alpha texture invisible"
+ top_pad="15"
width="16" />
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="115"
label="Head Alpha"
layout="topleft"
- left_pad="10"
+ left_pad="5"
name="Head Alpha"
tool_tip="Click to choose a picture"
- top="10"
- width="64" />
+ top_delta="0"
+ width="115" >
+ <texture_picker.commit_callback
+ function="TexturePicker.Commit" />
+ </texture_picker>
+
<check_box
- control_name="HeadAlphaTextureInvisible"
+ control_name="Eye AlphaTextureInvisible"
follows="left"
height="16"
layout="topleft"
- left_pad="6"
- name="head alpha texture invisible"
- top_delta="4"
+ left_pad="20"
+ name="eye alpha texture invisible"
+ top_delta="0"
width="16" />
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="115"
label="Eye Alpha"
layout="topleft"
- left="10"
+ left_pad="5"
name="Eye Alpha"
tool_tip="Click to choose a picture"
- top="100"
- width="64" />
+ top_delta="0"
+ width="115" >
+ <texture_picker.commit_callback
+ function="TexturePicker.Commit" />
+ </texture_picker>
+
<check_box
- control_name="Eye AlphaTextureInvisible"
+ control_name="HairAlphaTextureInvisible"
follows="left"
height="16"
layout="topleft"
- left_pad="6"
- name="eye alpha texture invisible"
- top_delta="4"
+ left="5"
+ name="hair alpha texture invisible"
+ top_pad="15"
width="16" />
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="115"
label="Hair Alpha"
layout="topleft"
- left_pad="10"
+ left="30"
name="Hair Alpha"
tool_tip="Click to choose a picture"
- top_delta="-4"
- width="64" />
- <check_box
- control_name="HairAlphaTextureInvisible"
- follows="left"
- height="16"
- layout="topleft"
- left_pad="6"
- name="hair alpha texture invisible"
- top_delta="4"
- width="16" />
+ top_delta="0"
+ width="115" >
+ <texture_picker.commit_callback
+ function="TexturePicker.Commit" />
+ </texture_picker>
+
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_edit_classified.xml b/indra/newview/skins/default/xui/en/panel_edit_classified.xml
index 188ded3dab..6744a7b9c2 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_classified.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_classified.xml
@@ -3,7 +3,7 @@
background_visible="true"
bevel_style="in"
follows="left|top|right|bottom"
- height="570"
+ height="569"
label="Edit Classified"
layout="topleft"
left="0"
@@ -16,42 +16,50 @@
name="location_notice">
(will update after save)
</panel.string>
+ <string name="publish_label">
+ Publish
+ </string>
+ <string name="save_label">
+ Save
+ </string>
<button
follows="top|right"
- height="23"
- image_overlay="BackArrow_Off"
+ height="24"
+ image_hover_unselected="BackButton_Over"
+ image_pressed="BackButton_Press"
+ image_unselected="BackButton_Off"
layout="topleft"
name="back_btn"
picture_style="true"
left="10"
tab_stop="false"
top="2"
- width="23" />
+ width="30" />
<text
type="string"
length="1"
follows="top"
- font="SansSerifHuge"
- height="15"
+ font="SansSerifHugeBold"
+ height="26"
layout="topleft"
- left_pad="10"
+ left_pad="4"
name="title"
- text_color="white"
- top="5"
+ text_color="LtGray"
+ top="0"
width="250">
Edit Classified
</text>
<scroll_container
- color="DkGray2"
- follows="all"
- height="510"
- layout="topleft"
- left="10"
- top_pad="10"
- name="profile_scroll"
- reserve_scroll_corner="false"
- opaque="true"
- width="313">
+ color="DkGray2"
+ follows="all"
+ height="502"
+ layout="topleft"
+ left="8"
+ top_pad="10"
+ name="profile_scroll"
+ reserve_scroll_corner="false"
+ opaque="true"
+ width="312">
<panel
name="scroll_content_panel"
follows="left|top"
@@ -59,27 +67,36 @@
layout="topleft"
top="0"
background_visible="false"
- height="600"
+ height="690"
left="0"
- width="295">
- <texture_picker
- follows="left|top|right"
- height="197"
- width="290"
- layout="topleft"
- top="20"
- left="10"
- name="classified_snapshot" />
- <icon
- height="18"
- image_name="AddItem_Off"
+ width="285">
+ <panel
+ name="snapshot_panel"
+ layout="topleft"
+ follows="left|top|right"
+ height="197"
+ left="10"
+ top="10"
+ width="272">
+ <texture_picker
+ follows="left|top|right"
+ height="197"
+ width="272"
+ layout="topleft"
+ top="0"
+ left="0"
+ name="classified_snapshot" />
+ <icon
+ height="197"
+ image_name="spacer24.tga"
layout="topleft"
- right="-5"
name="edit_icon"
label=""
tool_tip="Click to select an image"
- top="27"
- width="18" />
+ top="0"
+ left="0"
+ width="272" />
+ </panel>
<text
type="string"
length="1"
@@ -92,7 +109,7 @@
top="215"
name="Name:"
text_color="white"
- width="290">
+ width="280">
Title:
</text>
<line_editor
@@ -106,7 +123,7 @@
name="classified_name"
prevalidate_callback="ascii"
text_color="black"
- width="290" />
+ width="273" />
<text
type="string"
length="1"
@@ -119,13 +136,13 @@
top_pad="20"
name="description_label"
text_color="white"
- width="290">
+ width="280">
Description:
</text>
<text_editor
follows="left|top|right"
height="100"
- width="290"
+ width="273"
hide_scrollbar="false"
layout="topleft"
left="10"
@@ -146,67 +163,117 @@
name="location_label"
text_color="white"
top_pad="20"
- width="290">
+ width="280">
Location:
</text>
<text
type="string"
length="1"
follows="left|top"
- height="50"
+ height="30"
layout="topleft"
left="10"
name="classified_location"
right="-10"
top_pad="2"
- width="290"
+ width="280"
word_wrap="true">
loading...
</text>
<button
follows="left|top"
- height="20"
+ height="23"
label="Set to Current Location"
layout="topleft"
- left="8"
+ left="10"
top_pad="5"
name="set_to_curr_location_btn"
width="200" />
+ <text
+ follows="left|top"
+ font.style="BOLD"
+ height="10"
+ layout="topleft"
+ left="10"
+ name="category_label"
+ text_color="white"
+ top_pad="15"
+ value="Category:"
+ width="250" />
<combo_box
follows="left|top"
- height="18"
+ height="23"
label=""
left="10"
name="category"
top_pad="5"
- width="200" />
- <combo_box
- allow_text_entry="false"
- follows="left|top"
- height="18"
+ width="156" />
+ <text
+ follows="left|top"
+ font.style="BOLD"
+ height="10"
+ layout="topleft"
+ left="10"
+ name="content_type_label"
+ text_color="white"
+ top_pad="15"
+ value="Content type:"
+ width="250" />
+ <icons_combo_box
+ follows="left|top"
+ height="23"
+ label="General Content"
+ layout="topleft"
left="10"
- name="content_type"
+ name="content_type"
top_pad="5"
- width="200">
- <combo_item
- name="mature_ci"
- value="Mature">
- Moderate Content
- </combo_item>
- <combo_item
- name="pg_ci"
- value="PG">
- General Content
- </combo_item>
- </combo_box>
+ width="156">
+ <icons_combo_box.drop_down_button
+ image_overlay="Parcel_PG_Light"
+ image_overlay_alignment="left"
+ imgoverlay_label_space="3"
+ pad_left="3"/>
+ <icons_combo_box.item
+ label="Moderate Content"
+ name="mature_ci"
+ value="Mature">
+ <item.columns
+ halign="center"
+ type="icon"
+ value="Parcel_M_Light"
+ width="20"/>
+ </icons_combo_box.item>
+ <icons_combo_box.item
+ label="General Content"
+ name="pg_ci"
+ value="PG">
+ <item.columns
+ halign="center"
+ type="icon"
+ value="Parcel_PG_Light"
+ width="20"/>
+ </icons_combo_box.item>
+ </icons_combo_box>
+ <text
+ follows="left|top"
+ font.style="BOLD"
+ height="10"
+ layout="topleft"
+ left="10"
+ name="price_for_listing_label"
+ text_color="white"
+ top_pad="15"
+ value="Price for listing:"
+ width="250" />
<spinner
decimal_digits="0"
follows="left|top"
halign="left"
- height="16"
+ height="23"
increment="1"
label_width="20"
label="L$"
+ v_pad="10"
layout="topleft"
left="10"
value="50"
@@ -222,36 +289,35 @@
layout="topleft"
left="10"
name="auto_renew"
- top_pad="5"
+ top_pad="15"
width="250" />
- </panel>
+ </panel>
</scroll_container>
<panel
follows="left|right|bottom"
- height="20"
+ height="23"
label="bottom_panel"
layout="topleft"
- left="10"
+ left="8"
name="bottom_panel"
top_pad="5"
width="303">
<button
follows="bottom|left"
- height="19"
- label="Save"
+ height="23"
+ label="[LABEL]"
layout="topleft"
name="save_changes_btn"
left="0"
top="0"
- width="130" />
+ width="152" />
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Cancel"
layout="topleft"
name="cancel_btn"
- left_pad="5"
- right="-1"
- width="130" />
+ left_pad="3"
+ width="153" />
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_edit_eyes.xml b/indra/newview/skins/default/xui/en/panel_edit_eyes.xml
index c514054c41..f173a2f3cb 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_eyes.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_eyes.xml
@@ -1,21 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
+ background_visible="true"
follows="all"
height="400"
layout="topleft"
- left="10"
+ left="0"
name="edit_eyes_panel"
top_pad="10"
- width="313" >
+ width="333" >
<panel
- border="true"
- follows="left|top|right"
- height="100"
+ border="false"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="top|left|right"
+ height="90"
left="10"
layout="topleft"
name="avatar_eye_color_panel"
top="0"
- width="293" >
+ width="313" >
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -23,31 +28,53 @@
height="80"
label="Iris"
layout="topleft"
- left="8"
+ left="10"
name="Iris"
tool_tip="Click to choose a picture"
- top_pad="10"
- width="64" />
- </panel>
- <accordion
- follows="left|top|right|bottom"
- height ="340"
- left="10"
- name="wearable_accordion"
- top_pad="10"
- width="303">
- <accordion_tab
+ top="10"
+ width="64" >
+ <texture_picker.commit_callback
+ function="TexturePicker.Commit" />
+ </texture_picker>
+ </panel>
+ <panel
+ border="false"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="all"
+ height="300"
+ layout="topleft"
+ left="10"
+ name="accordion_panel"
+ top_pad="10"
+ width="313">
+ <accordion
+ fit_parent="true"
+ follows="all"
+ height ="300"
+ layout="topleft"
+ left="0"
+ name="wearable_accordion"
+ single_expansion="true"
+ top="0"
+ width="313">
+ <accordion_tab
layout="topleft"
+ fit_panel="false"
min_height="150"
name="eyes_main_tab"
title="Eyes">
<scrolling_panel_list
follows="all"
+ layout="topleft"
left="0"
name="eyes_main_param_list"
top="0"
width="303" />
</accordion_tab>
</accordion>
+ </panel>
</panel>
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 7aca40e8d9..a490f27b9f 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_gloves.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_gloves.xml
@@ -1,21 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
+ background_visible="true"
follows="all"
height="400"
layout="topleft"
- left="10"
+ left="0"
name="edit_gloves_panel"
top_pad="10"
- width="313" >
+ width="333" >
<panel
- border="true"
- follows="left|top|right"
- height="100"
+ border="false"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="top|left|right"
+ height="90"
left="10"
layout="topleft"
name="avatar_gloves_color_panel"
top="0"
- width="293" >
+ width="313" >
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -27,38 +32,63 @@
name="Fabric"
tool_tip="Click to choose a picture"
top="10"
- width="64" />
+ width="64" >
+ <texture_picker.commit_callback
+ function="TexturePicker.Commit" />
+ </texture_picker>
<color_swatch
can_apply_immediately="true"
follows="left|top"
height="80"
label="Color/Tint"
layout="topleft"
- left_pad="10"
+ left_pad="20"
name="Color/Tint"
tool_tip="Click to open color picker"
top="10"
- width="64" />
- </panel>
- <accordion
- follows="left|top|right|bottom"
- height ="340"
- left="10"
- name="wearable_accordion"
- top_pad="10"
- width="303">
+ width="64" >
+ <color_swatch.commit_callback
+ function="ColorSwatch.Commit" />
+ </color_swatch>
+ </panel>
+ <panel
+ border="false"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="all"
+ height="300"
+ layout="topleft"
+ left="10"
+ name="accordion_panel"
+ top_pad="10"
+ width="313">
+ <accordion
+ fit_parent="true"
+ follows="all"
+ height ="300"
+ layout="topleft"
+ left="0"
+ name="wearable_accordion"
+ single_expansion="true"
+ top="0"
+ width="313">
<accordion_tab
layout="topleft"
+ fit_panel="false"
min_height="150"
name="gloves_main_tab"
title="Gloves">
<scrolling_panel_list
follows="all"
+ layout="topleft"
left="0"
name="gloves_main_param_list"
top="0"
width="303" />
</accordion_tab>
</accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_edit_hair.xml b/indra/newview/skins/default/xui/en/panel_edit_hair.xml
index e7d1c05301..6bb5d2fa9b 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_hair.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_hair.xml
@@ -1,21 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
+ background_visible="true"
follows="all"
height="400"
layout="topleft"
- left="10"
+ left="0"
name="edit_hair_panel"
top_pad="10"
- width="313" >
+ width="333" >
<panel
- border="true"
- follows="left|top|right"
- height="100"
+ border="false"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="top|left|right"
+ height="90"
left="10"
layout="topleft"
name="avatar_hair_color_panel"
top="0"
- width="293" >
+ width="313" >
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -23,26 +28,47 @@
height="80"
label="Texture"
layout="topleft"
- left="8"
+ left="10"
name="Texture"
tool_tip="Click to choose a picture"
top="10"
- width="64" />
- </panel>
+ width="64" >
+ <texture_picker.commit_callback
+ function="TexturePicker.Commit" />
+ </texture_picker>
+ </panel>
+ <panel
+ border="false"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="all"
+ height="300"
+ layout="topleft"
+ left="10"
+ name="accordion_panel"
+ top_pad="10"
+ width="313">
<accordion
- follows="left|top|right|bottom"
- height ="340"
- left="10"
- name="wearable_accordion"
- top_pad="10"
- width="303">
+ fit_parent="true"
+ follows="all"
+ height ="300"
+ layout="topleft"
+ left="0"
+ name="wearable_accordion"
+ single_expansion="true"
+ top="0"
+ width="313">
<accordion_tab
layout="topleft"
+ fit_panel="false"
min_height="150"
name="hair_color_tab"
title="Color">
<scrolling_panel_list
follows="all"
+ layout="topleft"
left="0"
name="hair_color_param_list"
top="0"
@@ -50,11 +76,13 @@
</accordion_tab>
<accordion_tab
layout="topleft"
+ fit_panel="false"
min_height="150"
name="hair_style_tab"
title="Style">
<scrolling_panel_list
follows="all"
+ layout="topleft"
left="0"
name="hair_style_param_list"
top="0"
@@ -62,11 +90,13 @@
</accordion_tab>
<accordion_tab
layout="topleft"
+ fit_panel="false"
min_height="150"
name="hair_eyebrows_tab"
title="Eyebrows">
<scrolling_panel_list
follows="all"
+ layout="topleft"
left="0"
name="hair_eyebrows_param_list"
top="0"
@@ -74,16 +104,19 @@
</accordion_tab>
<accordion_tab
layout="topleft"
+ fit_panel="false"
min_height="150"
name="hair_facial_tab"
title="Facial">
<scrolling_panel_list
follows="all"
+ layout="topleft"
left="0"
name="hair_facial_param_list"
top="0"
width="303" />
</accordion_tab>
</accordion>
+ </panel>
</panel>
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 ed92b1e0f8..929cdffb3d 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_jacket.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_jacket.xml
@@ -1,21 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
+ background_visible="true"
follows="all"
height="400"
layout="topleft"
- left="10"
+ left="0"
name="edit_jacket_panel"
top_pad="10"
- width="313" >
+ width="333" >
<panel
- border="true"
- follows="left|top|right"
- height="100"
+ border="false"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="top|left|right"
+ height="90"
left="10"
layout="topleft"
name="avatar_jacket_color_panel"
top="0"
- width="293" >
+ width="313" >
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -23,11 +28,14 @@
height="80"
label="Upper Fabric"
layout="topleft"
- left="10"
+ left="25"
name="Upper Fabric"
tool_tip="Click to choose a picture"
top="10"
- width="64" />
+ width="74" >
+ <texture_picker.commit_callback
+ function="TexturePicker.Commit" />
+ </texture_picker>
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -35,42 +43,67 @@
height="80"
label="Lower Fabric"
layout="topleft"
- left_pad="10"
+ left_pad="20"
name="Lower Fabric"
tool_tip="Click to choose a picture"
top="10"
- width="64" />
+ width="74" >
+ <texture_picker.commit_callback
+ function="TexturePicker.Commit" />
+ </texture_picker>
<color_swatch
can_apply_immediately="true"
follows="left|top"
height="80"
label="Color/Tint"
layout="topleft"
- left_pad="10"
+ left_pad="20"
name="Color/Tint"
tool_tip="Click to open color picker"
top="10"
- width="64" />
+ width="74" >
+ <color_swatch.commit_callback
+ function="ColorSwatch.Commit" />
+ </color_swatch>
</panel>
- <accordion
- follows="left|top|right|bottom"
- height ="340"
- left="10"
- name="wearable_accordion"
- top_pad="10"
- width="303">
+ <panel
+ border="false"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="all"
+ height="300"
+ layout="topleft"
+ left="10"
+ name="accordion_panel"
+ top_pad="10"
+ width="313">
+ <accordion
+ fit_parent="true"
+ follows="all"
+ height ="300"
+ layout="topleft"
+ left="0"
+ name="wearable_accordion"
+ single_expansion="true"
+ top="0"
+ width="313">
<accordion_tab
layout="topleft"
+ fit_panel="false"
min_height="150"
name="jacket_main_tab"
title="Jacket">
<scrolling_panel_list
follows="all"
+ layout="topleft"
left="0"
name="jacket_main_param_list"
top="0"
width="303" />
</accordion_tab>
</accordion>
+ </panel>
</panel>
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 b764188e04..f22cf983aa 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_pants.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_pants.xml
@@ -1,21 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
+ background_visible="true"
follows="all"
height="400"
layout="topleft"
- left="10"
+ left="0"
name="edit_pants_panel"
top_pad="10"
- width="313" >
+ width="333" >
<panel
- border="true"
- follows="left|top|right"
- height="100"
+ border="false"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="top|left|right"
+ height="90"
left="10"
layout="topleft"
name="avatar_pants_color_panel"
top="0"
- width="293" >
+ width="313" >
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -27,38 +32,63 @@
name="Fabric"
tool_tip="Click to choose a picture"
top="10"
- width="64" />
+ width="64" >
+ <texture_picker.commit_callback
+ function="TexturePicker.Commit" />
+ </texture_picker>
<color_swatch
can_apply_immediately="true"
follows="left|top"
height="80"
label="Color/Tint"
layout="topleft"
- left_pad="10"
+ left_pad="20"
name="Color/Tint"
tool_tip="Click to open color picker"
top="10"
- width="64" />
+ width="64" >
+ <color_swatch.commit_callback
+ function="ColorSwatch.Commit" />
+ </color_swatch>
</panel>
- <accordion
- follows="left|top|right|bottom"
- height ="340"
- left="10"
- name="wearable_accordion"
- top_pad="10"
- width="303">
+ <panel
+ border="false"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="all"
+ height="300"
+ layout="topleft"
+ left="10"
+ name="accordion_panel"
+ top_pad="10"
+ width="313">
+ <accordion
+ fit_parent="true"
+ follows="all"
+ height ="300"
+ layout="topleft"
+ left="0"
+ name="wearable_accordion"
+ single_expansion="true"
+ top="0"
+ width="313">
<accordion_tab
layout="topleft"
+ fit_panel="false"
min_height="150"
name="pants_main_tab"
title="Pants">
<scrolling_panel_list
follows="all"
+ layout="topleft"
left="0"
name="pants_main_param_list"
top="0"
width="303" />
</accordion_tab>
</accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_edit_pick.xml b/indra/newview/skins/default/xui/en/panel_edit_pick.xml
index 8e39697a16..dc83b334b5 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_pick.xml
@@ -3,7 +3,7 @@
background_visible="true"
bevel_style="in"
follows="left|top|right|bottom"
- height="570"
+ height="569"
label="Edit Pick"
layout="topleft"
left="0"
@@ -12,40 +12,46 @@
help_topic="profile_edit_pick"
top="0"
width="333">
+ <panel.string
+ name="location_notice">
+ (will update after save)
+ </panel.string>
<button
follows="top|right"
- height="23"
- image_overlay="BackArrow_Off"
+ height="24"
+ image_hover_unselected="BackButton_Over"
+ image_pressed="BackButton_Press"
+ image_unselected="BackButton_Off"
layout="topleft"
name="back_btn"
left="10"
tab_stop="false"
top="2"
- width="23" />
+ width="30" />
<text
type="string"
length="1"
follows="top"
- font="SansSerifHuge"
- height="15"
+ font="SansSerifHugeBold"
+ height="26"
layout="topleft"
- left_pad="10"
+ left_pad="4"
name="title"
- text_color="white"
- top="5"
+ text_color="LtGray"
+ top="2"
width="250">
Edit Pick
</text>
<scroll_container
color="DkGray2"
follows="all"
- height="500"
+ height="502"
layout="topleft"
- left="10"
+ left="8"
top_pad="10"
name="profile_scroll"
opaque="true"
- width="313">
+ width="312">
<panel
name="scroll_content_panel"
follows="left|top|right"
@@ -59,22 +65,22 @@
<texture_picker
follows="left|top|right"
height="197"
- width="280"
+ width="272"
layout="topleft"
no_commit_on_selection="true"
- top="20"
- left="10"
+ top="10"
+ left="11"
name="pick_snapshot" />
<icon
- height="18"
- image_name="AddItem_Off"
+ height="197"
+ image_name="spacer24.tga"
layout="topleft"
- right="-5"
name="edit_icon"
label=""
tool_tip="Click to select an image"
- top="27"
- width="18" />
+ top="10"
+ left="11"
+ width="286" />
<text
type="string"
length="1"
@@ -100,7 +106,7 @@
max_length="63"
name="pick_name"
text_color="black"
- width="280" />
+ width="273" />
<text
type="string"
length="1"
@@ -119,7 +125,7 @@
<text_editor
follows="left|top|right"
height="100"
- width="280"
+ width="273"
hide_scrollbar="false"
layout="topleft"
left="10"
@@ -158,7 +164,7 @@
</text>
<button
follows="left|top"
- height="20"
+ height="23"
label="Set to Current Location"
layout="topleft"
left="8"
@@ -169,30 +175,29 @@
</scroll_container>
<panel
follows="left|right|bottom"
- height="20"
+ height="23"
label="bottom_panel"
layout="topleft"
- left="10"
+ left="8"
name="bottom_panel"
top_pad="5"
width="303">
<button
follows="bottom|left"
- height="19"
- label="Save [WHAT]"
+ height="23"
+ label="Save Pick"
layout="topleft"
name="save_changes_btn"
left="0"
top="0"
- width="130" />
+ width="152" />
<button
follows="bottom|left"
- height="19"
+ height="23"
label="Cancel"
layout="topleft"
name="cancel_btn"
- left_pad="5"
- right="-1"
- width="130" />
+ left_pad="3"
+ width="153" />
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_edit_profile.xml b/indra/newview/skins/default/xui/en/panel_edit_profile.xml
index 2a2199fc87..dff2b9a214 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_profile.xml
@@ -60,11 +60,11 @@
<scroll_container
color="DkGray2"
follows="all"
- height="493"
+ height="494"
min_height="300"
layout="topleft"
- left="9"
- width="290"
+ left="8"
+ width="292"
name="profile_scroll"
reserve_scroll_corner="true"
opaque="true"
@@ -74,19 +74,19 @@
follows="left|top|right"
layout="topleft"
top="0"
- height="493"
+ height="494"
min_height="300"
left="0"
- width="290">
+ width="292">
<panel
name="data_panel"
follows="left|top|right"
layout="topleft"
top="0"
- height="493"
+ height="494"
min_height="300"
left="0"
- width="290">
+ width="292">
<panel
name="lifes_images_panel"
follows="left|top|right"
@@ -94,7 +94,7 @@
layout="topleft"
top="0"
left="0"
- width="290">
+ width="292">
<panel
follows="left|top"
height="117"
@@ -102,7 +102,7 @@
left="10"
name="second_life_image_panel"
top="0"
- width="280">
+ width="282">
<text
follows="left|top|right"
font.style="BOLD"
@@ -127,15 +127,15 @@
width="102" />
</panel>
<icon
- height="18"
- image_name="AddItem_Off"
+ height="102"
+ image_name="spacer24.tga"
layout="topleft"
name="2nd_life_edit_icon"
label=""
- left="87"
+ left="11"
+ top_pad="-92"
tool_tip="Click to select an image"
- top="25"
- width="18" />
+ width="102" />
</panel>
<text_editor
type="string"
@@ -146,7 +146,7 @@
layout="topleft"
left="123"
top="25"
- max_length="512"
+ max_length="511"
name="sl_description_edit"
width="157"
word_wrap="true">
@@ -183,15 +183,15 @@
width="102" />
</panel>
<icon
- height="18"
- image_name="AddItem_Off"
+ height="102"
+ image_name="spacer24.tga"
layout="topleft"
name="real_world_edit_icon"
label=""
- left="87"
+ left="11"
+ top_pad="-92"
tool_tip="Click to select an image"
- top="148"
- width="18" />
+ width="102" />
<text_editor
type="string"
length="1"
@@ -200,7 +200,7 @@
height="102"
layout="topleft"
left="123"
- max_length="512"
+ max_length="254"
top="157"
name="fl_description_edit"
width="157"
@@ -230,7 +230,7 @@
top_pad="0"
value="http://"
name="homepage_edit"
- width="270">
+ width="272">
</line_editor>
<check_box
follows="left|top"
@@ -334,7 +334,7 @@
height="23"
label="Save Changes"
layout="topleft"
- left="9"
+ left="8"
name="save_btn"
top="5"
width="152" />
@@ -343,8 +343,8 @@
height="23"
label="Cancel"
layout="topleft"
- left_pad="4"
+ left_pad="3"
name="cancel_btn"
- width="152" />
+ width="153" />
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_edit_shape.xml b/indra/newview/skins/default/xui/en/panel_edit_shape.xml
index 45c4b92338..d295f5fe4a 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_shape.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_shape.xml
@@ -1,71 +1,64 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
+ background_visible="true"
follows="all"
height="400"
layout="topleft"
- left="10"
+ left="0"
name="edit_shape_panel"
top_pad="10"
- width="313" >
- <panel
- border="true"
- follows="top|left"
- height="50"
+ width="333" >
+ <string name="meters">Meters</string>
+ <string name="feet">Feet</string>
+ <string name="height">Height:</string>
+ <string name="heigth_label_color" translate="false">White_50</string>
+ <string name="heigth_value_label_color" translate="false">White</string>
+ <text
+ follows="top|left|right"
+ font="SansSerifSmallBold"
+ halign="right"
+ height="12"
+ layout="topleft"
+ left="0"
+ name="avatar_height"
+ top="0"
+ width="310">
+ </text>
+ <panel
+ border="false"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="all"
+ height="388"
+ label="Shirt"
+ layout="topleft"
left="10"
- layout="topleft"
- name="avatar_sex_panel"
- top="10"
- width="293" >
- <text
- follows="top|left"
- height="16"
- layout="topleft"
- left="10"
- name="gender_text"
- width="303">
- Gender:
- </text>
- <radio_group
- follows="all"
- left="10"
- height="34"
- layout="topleft"
- name="sex_radio"
- top_pad="3"
- width="200" >
- <radio_item
- follows="all"
- height="16"
- label="Female"
- layout="topleft"
- left="10"
- name="radio"
- width="82" />
- <radio_item
- follows="all"
- height="16"
- label="Male"
- layout="topleft"
- left_pad="10"
- name="radio2"
- width="82" />
- </radio_group>
- </panel>
+ name="accordion_panel"
+ top_pad="0"
+ width="313">
<accordion
- follows="left|top|right|bottom"
- height ="330"
- left="10"
+ layout="topleft"
+ follows="all"
+ height ="388"
+ left="0"
name="wearable_accordion"
- top_pad="10"
- width="303">
+ top="0"
+ single_expansion="true"
+ fit_parent="true"
+ width="313">
<accordion_tab
layout="topleft"
min_height="150"
name="shape_body_tab"
+ fit_panel="false"
title="Body">
<scrolling_panel_list
+ layout="topleft"
follows="all"
left="0"
+ height="300"
name="shape_body_param_list"
top="0"
width="303" />
@@ -73,11 +66,13 @@
<accordion_tab
layout="topleft"
min_height="150"
+ fit_panel="false"
name="shape_head_tab"
title="Head">
- <scrolling_panel_list
+ <scrolling_panel_list
+ layout="topleft"
follows="all"
- left="0"
+ left="10"
name="shape_head_param_list"
top="0"
width="303" />
@@ -85,9 +80,11 @@
<accordion_tab
layout="topleft"
min_height="150"
+ fit_panel="false"
name="shape_eyes_tab"
title="Eyes">
- <scrolling_panel_list
+ <scrolling_panel_list
+ layout="topleft"
follows="all"
left="0"
name="shape_eyes_param_list"
@@ -97,9 +94,11 @@
<accordion_tab
layout="topleft"
min_height="150"
+ fit_panel="false"
name="shape_ears_tab"
title="Ears">
- <scrolling_panel_list
+ <scrolling_panel_list
+ layout="topleft"
follows="all"
left="0"
name="shape_ears_param_list"
@@ -110,8 +109,10 @@
layout="topleft"
min_height="150"
name="shape_nose_tab"
+ fit_panel="false"
title="Nose">
- <scrolling_panel_list
+ <scrolling_panel_list
+ layout="topleft"
follows="all"
left="0"
name="shape_nose_param_list"
@@ -122,8 +123,10 @@
layout="topleft"
min_height="150"
name="shape_mouth_tab"
+ fit_panel="false"
title="Mouth">
- <scrolling_panel_list
+ <scrolling_panel_list
+ layout="topleft"
follows="all"
left="0"
name="shape_mouth_param_list"
@@ -134,8 +137,10 @@
layout="topleft"
min_height="150"
name="shape_chin_tab"
+ fit_panel="false"
title="Chin">
- <scrolling_panel_list
+ <scrolling_panel_list
+ layout="topleft"
follows="all"
left="0"
name="shape_chin_param_list"
@@ -146,8 +151,10 @@
layout="topleft"
min_height="150"
name="shape_torso_tab"
+ fit_panel="false"
title="Torso">
- <scrolling_panel_list
+ <scrolling_panel_list
+ layout="topleft"
follows="all"
left="0"
name="shape_torso_param_list"
@@ -158,8 +165,10 @@
layout="topleft"
min_height="150"
name="shape_legs_tab"
+ fit_panel="false"
title="Legs">
- <scrolling_panel_list
+ <scrolling_panel_list
+ layout="topleft"
follows="all"
left="0"
name="shape_legs_param_list"
@@ -167,5 +176,6 @@
width="303" />
</accordion_tab>
</accordion>
+ </panel>
</panel>
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 4b7235545f..85823073b5 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_shirt.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_shirt.xml
@@ -1,21 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
+ background_visible="true"
follows="all"
height="400"
layout="topleft"
- left="10"
+ left="0"
name="edit_shirt_panel"
top_pad="10"
- width="313" >
+ width="333" >
<panel
- border="true"
- follows="left|top|right"
- height="100"
+ border="false"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="top|left|right"
+ height="90"
left="10"
layout="topleft"
name="avatar_shirt_color_panel"
top="0"
- width="293" >
+ width="313" >
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -27,38 +32,63 @@
name="Fabric"
tool_tip="Click to choose a picture"
top="10"
- width="64" />
+ width="64" >
+ <texture_picker.commit_callback
+ function="TexturePicker.Commit" />
+ </texture_picker>
<color_swatch
can_apply_immediately="true"
follows="left|top"
height="80"
label="Color/Tint"
layout="topleft"
- left_pad="10"
+ left_pad="20"
name="Color/Tint"
tool_tip="Click to open color picker"
top="10"
- width="64" />
+ width="64" >
+ <color_swatch.commit_callback
+ function="ColorSwatch.Commit" />
+ </color_swatch>
</panel>
+ <panel
+ border="false"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="all"
+ height="300"
+ layout="topleft"
+ left="10"
+ name="accordion_panel"
+ top_pad="10"
+ width="313">
<accordion
- follows="left|top|right|bottom"
- height ="340"
- left="10"
+ fit_parent="true"
+ follows="all"
+ height ="300"
+ layout="topleft"
+ left="0"
name="wearable_accordion"
- top_pad="10"
- width="303">
+ single_expansion="true"
+ top="0"
+ width="313">
<accordion_tab
layout="topleft"
+ fit_panel="false"
min_height="150"
name="shirt_main_tab"
title="Shirt">
<scrolling_panel_list
follows="all"
+ layout="topleft"
left="0"
name="shirt_main_param_list"
top="0"
width="303" />
</accordion_tab>
</accordion>
+ </panel>
</panel>
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 e886afa010..b26fde68f1 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_shoes.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_shoes.xml
@@ -1,21 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
+ background_visible="true"
follows="all"
height="400"
layout="topleft"
- left="10"
+ left="0"
name="edit_shoes_panel"
top_pad="10"
- width="313" >
+ width="333" >
<panel
- border="true"
- follows="left|top|right"
- height="100"
+ border="false"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="top|left|right"
+ height="90"
left="10"
layout="topleft"
name="avatar_shoes_color_panel"
top="0"
- width="293" >
+ width="313" >
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -27,38 +32,63 @@
name="Fabric"
tool_tip="Click to choose a picture"
top="10"
- width="64" />
+ width="64" >
+ <texture_picker.commit_callback
+ function="TexturePicker.Commit" />
+ </texture_picker>
<color_swatch
can_apply_immediately="true"
follows="left|top"
height="80"
label="Color/Tint"
layout="topleft"
- left_pad="10"
+ left_pad="20"
name="Color/Tint"
tool_tip="Click to open color picker"
top="10"
- width="64" />
+ width="64" >
+ <color_swatch.commit_callback
+ function="ColorSwatch.Commit" />
+ </color_swatch>
</panel>
- <accordion
- follows="left|top|right|bottom"
- height ="340"
- left="10"
- name="wearable_accordion"
- top_pad="10"
- width="303">
+ <panel
+ border="false"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="all"
+ height="300"
+ layout="topleft"
+ left="10"
+ name="accordion_panel"
+ top_pad="10"
+ width="313">
+ <accordion
+ fit_parent="true"
+ follows="all"
+ height ="300"
+ layout="topleft"
+ left="0"
+ name="wearable_accordion"
+ single_expansion="true"
+ top="0"
+ width="313">
<accordion_tab
layout="topleft"
+ fit_panel="false"
min_height="150"
name="shoes_main_tab"
title="Shoes">
<scrolling_panel_list
follows="all"
+ layout="topleft"
left="0"
name="shoes_main_param_list"
top="0"
width="303" />
</accordion_tab>
</accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_edit_skin.xml b/indra/newview/skins/default/xui/en/panel_edit_skin.xml
index 918606b54c..45591ba2ad 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_skin.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_skin.xml
@@ -1,21 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
+ background_visible="true"
follows="all"
height="400"
layout="topleft"
- left="10"
+ left="0"
name="edit_skin_panel"
top_pad="10"
- width="313" >
+ width="333" >
<panel
- border="true"
- follows="left|top|right"
- height="100"
+ border="false"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="top|left|right"
+ height="90"
left="10"
layout="topleft"
name="avatar_skin_color_panel"
top="0"
- width="293" >
+ width="313" >
<texture_picker
allow_no_texture="true"
can_apply_immediately="true"
@@ -24,11 +29,14 @@
height="80"
label="Head Tattoos"
layout="topleft"
- left="10"
+ left="25"
name="Head Tattoos"
tool_tip="Click to choose a picture"
top="10"
- width="74" />
+ width="74" >
+ <texture_picker.commit_callback
+ function="TexturePicker.Commit" />
+ </texture_picker>
<texture_picker
allow_no_texture="true"
can_apply_immediately="true"
@@ -37,11 +45,14 @@
height="80"
label="Upper Tattoos"
layout="topleft"
- left_pad="10"
+ left_pad="20"
name="Upper Tattoos"
tool_tip="Click to choose a picture"
top="10"
- width="74" />
+ width="74" >
+ <texture_picker.commit_callback
+ function="TexturePicker.Commit" />
+ </texture_picker>
<texture_picker
allow_no_texture="true"
can_apply_immediately="true"
@@ -50,26 +61,47 @@
height="80"
label="Lower Tattoos"
layout="topleft"
- left_pad="10"
+ left_pad="20"
name="Lower Tattoos"
tool_tip="Click to choose a picture"
top="10"
- width="74" />
- </panel>
+ width="74" >
+ <texture_picker.commit_callback
+ function="TexturePicker.Commit" />
+ </texture_picker>
+ </panel>
+ <panel
+ border="false"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="all"
+ height="300"
+ layout="topleft"
+ left="10"
+ name="accordion_panel"
+ top_pad="10"
+ width="313">
<accordion
- follows="left|top|right|bottom"
- height ="340"
- left="10"
+ layout="topleft"
+ fit_parent="true"
+ follows="all"
+ height ="300"
+ left="0"
name="wearable_accordion"
- top_pad="10"
- width="303">
+ top="0"
+ single_expansion="true"
+ width="313">
<accordion_tab
layout="topleft"
+ fit_panel="false"
min_height="150"
name="skin_color_tab"
title="Skin Color">
<scrolling_panel_list
follows="all"
+ layout="topleft"
left="0"
name="skin_color_param_list"
top="0"
@@ -77,11 +109,13 @@
</accordion_tab>
<accordion_tab
layout="topleft"
+ fit_panel="false"
min_height="150"
name="skin_face_tab"
title="Face Detail">
<scrolling_panel_list
follows="all"
+ layout="topleft"
left="0"
name="skin_face_param_list"
top="0"
@@ -89,11 +123,13 @@
</accordion_tab>
<accordion_tab
layout="topleft"
+ fit_panel="false"
min_height="150"
name="skin_makeup_tab"
title="Makeup">
<scrolling_panel_list
follows="all"
+ layout="topleft"
left="0"
name="skin_makeup_param_list"
top="0"
@@ -101,16 +137,19 @@
</accordion_tab>
<accordion_tab
layout="topleft"
+ fit_panel="false"
min_height="150"
name="skin_body_tab"
title="Body Detail">
<scrolling_panel_list
follows="all"
+ layout="topleft"
left="0"
name="skin_body_param_list"
top="0"
width="303" />
</accordion_tab>
</accordion>
+ </panel>
</panel>
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 6cccab1843..bb8e0dca07 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_skirt.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_skirt.xml
@@ -1,21 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
+ background_visible="true"
follows="all"
height="400"
layout="topleft"
- left="10"
+ left="0"
name="edit_skirt_panel"
top_pad="10"
- width="313" >
+ width="333" >
<panel
- border="true"
- follows="left|top|right"
- height="100"
+ border="false"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="top|left|right"
+ height="90"
left="10"
layout="topleft"
name="avatar_skirt_color_panel"
top="0"
- width="293" >
+ width="313" >
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -27,38 +32,63 @@
name="Fabric"
tool_tip="Click to choose a picture"
top="10"
- width="64" />
+ width="64" >
+ <texture_picker.commit_callback
+ function="TexturePicker.Commit" />
+ </texture_picker>
<color_swatch
can_apply_immediately="true"
follows="left|top"
height="80"
label="Color/Tint"
layout="topleft"
- left_pad="10"
+ left_pad="20"
name="Color/Tint"
tool_tip="Click to open color picker"
top="10"
- width="64" />
+ width="64" >
+ <color_swatch.commit_callback
+ function="ColorSwatch.Commit" />
+ </color_swatch>
</panel>
- <accordion
- follows="left|top|right|bottom"
- height ="340"
- left="10"
- name="wearable_accordion"
- top_pad="10"
- width="303">
+ <panel
+ border="false"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="all"
+ height="300"
+ layout="topleft"
+ left="10"
+ name="accordion_panel"
+ top_pad="10"
+ width="313">
+ <accordion
+ fit_parent="true"
+ follows="all"
+ height ="300"
+ layout="topleft"
+ left="0"
+ name="wearable_accordion"
+ single_expansion="true"
+ top="0"
+ width="313">
<accordion_tab
layout="topleft"
+ fit_panel="false"
min_height="150"
name="skirt_main_tab"
title="Skirt">
<scrolling_panel_list
follows="all"
+ layout="topleft"
left="0"
name="skirt_main_param_list"
top="0"
width="303" />
</accordion_tab>
</accordion>
+ </panel>
</panel>
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 fc7de00714..d813d94d93 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_socks.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_socks.xml
@@ -1,21 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
+ background_visible="true"
follows="all"
height="400"
layout="topleft"
- left="10"
+ left="0"
name="edit_socks_panel"
top_pad="10"
- width="313" >
+ width="333" >
<panel
- border="true"
- follows="left|top|right"
- height="100"
+ border="false"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="top|left|right"
+ height="90"
left="10"
layout="topleft"
name="avatar_socks_color_panel"
top="0"
- width="293" >
+ width="313" >
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -27,38 +32,63 @@
name="Fabric"
tool_tip="Click to choose a picture"
top="10"
- width="64" />
+ width="64" >
+ <texture_picker.commit_callback
+ function="TexturePicker.Commit" />
+ </texture_picker>
<color_swatch
can_apply_immediately="true"
follows="left|top"
height="80"
label="Color/Tint"
layout="topleft"
- left_pad="10"
+ left_pad="20"
name="Color/Tint"
tool_tip="Click to open color picker"
top="10"
- width="64" />
+ width="64" >
+ <color_swatch.commit_callback
+ function="ColorSwatch.Commit" />
+ </color_swatch>
</panel>
- <accordion
- follows="left|top|right|bottom"
- height ="340"
- left="10"
- name="wearable_accordion"
- top_pad="10"
- width="303">
+ <panel
+ border="false"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="all"
+ height="300"
+ layout="topleft"
+ left="10"
+ name="accordion_panel"
+ top_pad="10"
+ width="313">
+ <accordion
+ fit_parent="true"
+ follows="all"
+ height ="300"
+ layout="topleft"
+ left="0"
+ name="wearable_accordion"
+ single_expansion="true"
+ top="0"
+ width="313">
<accordion_tab
layout="topleft"
+ fit_panel="false"
min_height="150"
name="socks_main_tab"
title="Socks">
<scrolling_panel_list
follows="all"
+ layout="topleft"
left="0"
name="socks_main_param_list"
top="0"
width="303" />
</accordion_tab>
</accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/en/panel_edit_tattoo.xml
index b214cd3de0..23a08344ea 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_tattoo.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_tattoo.xml
@@ -1,57 +1,85 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
+ background_visible="true"
follows="all"
height="400"
layout="topleft"
- left="10"
+ left="0"
name="edit_tattoo_panel"
top_pad="10"
- width="313" >
+ width="333" >
<panel
- border="true"
- follows="left|top|right"
- height="100"
+ border="false"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="top|left|right"
+ height="400"
left="10"
layout="topleft"
name="avatar_tattoo_color_panel"
top="0"
- width="293" >
+ width="313" >
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="115"
label="Head Tattoo"
layout="topleft"
- left="10"
+ left="20"
name="Head Tattoo"
tool_tip="Click to choose a picture"
top="10"
- width="64" />
+ width="115" >
+ <texture_picker.commit_callback
+ function="TexturePicker.Commit" />
+ </texture_picker>
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="115"
label="Upper Tattoo"
layout="topleft"
- left_pad="10"
+ left_pad="30"
name="Upper Tattoo"
tool_tip="Click to choose a picture"
top="10"
- width="64" />
+ width="115" >
+ <texture_picker.commit_callback
+ function="TexturePicker.Commit" />
+ </texture_picker>
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
follows="left|top"
- height="80"
+ height="115"
label="Lower Tattoo"
layout="topleft"
- left_pad="10"
+ left="20"
name="Lower Tattoo"
tool_tip="Click to choose a picture"
- top="10"
- width="64" />
+ top_pad="10"
+ width="115" >
+ <texture_picker.commit_callback
+ function="TexturePicker.Commit" />
+ </texture_picker>
+ <color_swatch
+ can_apply_immediately="true"
+ follows="left|top"
+ height="115"
+ label="Color/Tint"
+ layout="topleft"
+ left_pad="30"
+ name="Color/Tint"
+ tool_tip="Click to open color picker"
+ top_delta="0"
+ width="115" >
+ <color_swatch.commit_callback
+ function="ColorSwatch.Commit" />
+ </color_swatch>
</panel>
</panel>
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 03e0bb70ef..19225e9757 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_underpants.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_underpants.xml
@@ -1,21 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
+ background_visible="true"
follows="all"
height="400"
layout="topleft"
- left="10"
+ left="0"
name="edit_underpants_panel"
top_pad="10"
- width="313" >
+ width="333" >
<panel
- border="true"
- follows="left|top|right"
- height="100"
+ border="false"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="top|left|right"
+ height="90"
left="10"
layout="topleft"
name="avatar_underpants_color_panel"
top="0"
- width="293" >
+ width="313" >
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -27,38 +32,63 @@
name="Fabric"
tool_tip="Click to choose a picture"
top="10"
- width="64" />
+ width="64" >
+ <texture_picker.commit_callback
+ function="TexturePicker.Commit" />
+ </texture_picker>
<color_swatch
can_apply_immediately="true"
follows="left|top"
height="80"
label="Color/Tint"
layout="topleft"
- left_pad="10"
+ left_pad="20"
name="Color/Tint"
tool_tip="Click to open color picker"
top="10"
- width="64" />
+ width="64" >
+ <color_swatch.commit_callback
+ function="ColorSwatch.Commit" />
+ </color_swatch>
</panel>
- <accordion
- follows="left|top|right|bottom"
- height ="340"
- left="10"
- name="wearable_accordion"
- top_pad="10"
- width="303">
+ <panel
+ border="false"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="all"
+ height="300"
+ layout="topleft"
+ left="10"
+ name="accordion_panel"
+ top_pad="10"
+ width="313">
+ <accordion
+ fit_parent="true"
+ follows="all"
+ height ="300"
+ layout="topleft"
+ left="0"
+ name="wearable_accordion"
+ single_expansion="true"
+ top="0"
+ width="313">
<accordion_tab
layout="topleft"
+ fit_panel="false"
min_height="150"
name="underpants_main_tab"
title="Underpants">
<scrolling_panel_list
follows="all"
+ layout="topleft"
left="0"
name="underpants_main_param_list"
top="0"
width="303" />
</accordion_tab>
</accordion>
+ </panel>
</panel>
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 20c56142fb..720a55dcc2 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_undershirt.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_undershirt.xml
@@ -1,21 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
+ background_visible="true"
follows="all"
height="400"
layout="topleft"
- left="10"
+ left="0"
name="edit_undershirt_panel"
top_pad="10"
- width="313" >
+ width="333" >
<panel
- border="true"
- follows="left|top|right"
- height="100"
+ border="false"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="top|left|right"
+ height="90"
left="10"
layout="topleft"
name="avatar_undershirt_color_panel"
top="0"
- width="293" >
+ width="313" >
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -27,38 +32,63 @@
name="Fabric"
tool_tip="Click to choose a picture"
top="10"
- width="64" />
+ width="64" >
+ <texture_picker.commit_callback
+ function="TexturePicker.Commit" />
+ </texture_picker>
<color_swatch
can_apply_immediately="true"
follows="left|top"
height="80"
label="Color/Tint"
layout="topleft"
- left_pad="10"
+ left_pad="20"
name="Color/Tint"
tool_tip="Click to open Color Picker"
top="10"
- width="64" />
+ width="64" >
+ <color_swatch.commit_callback
+ function="ColorSwatch.Commit" />
+ </color_swatch>
</panel>
- <accordion
- follows="left|top|right|bottom"
- height ="340"
- left="10"
- name="wearable_accordion"
- top_pad="10"
- width="303">
+ <panel
+ border="false"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="all"
+ height="300"
+ layout="topleft"
+ left="10"
+ name="accordion_panel"
+ top_pad="10"
+ width="313">
+ <accordion
+ fit_parent="true"
+ follows="all"
+ height ="300"
+ layout="topleft"
+ left="0"
+ name="wearable_accordion"
+ single_expansion="true"
+ top="0"
+ width="313">
<accordion_tab
layout="topleft"
+ fit_panel="false"
min_height="150"
name="undershirt_main_tab"
title="Undershirt">
<scrolling_panel_list
follows="all"
+ layout="topleft"
left="0"
name="undershirt_main_param_list"
top="0"
width="303" />
</accordion_tab>
</accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
index f76a56bda4..3106ed34ff 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_wearable.xml
@@ -7,6 +7,7 @@
label="Wearable"
layout="topleft"
left="0"
+ help_topic="edit_wearable"
name="panel_edit_wearable"
top="0"
width="333">
@@ -107,7 +108,7 @@ left="0"
Jacket:
</string>
<string
- name="skirt_skirt_desc_text">
+ name="skirt_desc_text">
Skirt:
</string>
<string
@@ -132,26 +133,33 @@ left="0"
</string>
<button
follows="top|left"
- height="25"
- width="25"
- image_overlay="BackArrow_Off"
+ height="24"
+ width="30"
+ image_hover_unselected="BackButton_Over"
+ image_pressed="BackButton_Press"
+ image_unselected="BackButton_Off"
layout="topleft"
name="back_btn"
- left="10"
- top="7" />
+ left="11"
+ top="3" />
<text
follows="top|left"
font="SansSerifHugeBold"
height="22"
layout="topleft"
- left_pad="15"
+ left_pad="8"
name="edit_wearable_title"
text_color="white"
+ top="3"
value="Editing Shape"
width="270" />
<panel
- border="true"
- follows="top|left"
+ border="false"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ follows="top|left|right"
height="60"
label="Shirt"
layout="topleft"
@@ -160,34 +168,89 @@ left="0"
top_pad="10"
width="313">
<text
- follows="top|left"
+ follows="top|left|right"
+ font="SansSerifSmallBold"
height="16"
layout="topleft"
left="10"
name="description_text"
+ text_color="white"
+ top="10"
value="Shape:"
- width="303" />
- <text_editor
- follows="all"
- height="23"
- left="10"
+ width="150" />
+ <radio_group
+ control_name="AvatarSex"
+ follows="left|top|right"
+ left="210"
+ height="20"
layout="topleft"
- max_length="300"
- name="description"
- width="290" />
+ name="sex_radio"
+ top="5"
+ width="110">
+ <radio_item
+ follows="all"
+ height="16"
+ label=""
+ layout="topleft"
+ left="0"
+ name="sex_male"
+ tool_tip="Male"
+ value="1"
+ width="40" />
+ <radio_item
+ follows="all"
+ height="16"
+ label=""
+ layout="topleft"
+ left_pad="10"
+ name="sex_female"
+ tool_tip="Female"
+ value="0"
+ width="40" />
+ </radio_group>
+ <!-- graphical labels for the radio buttons above -->
+ <icon
+ height="16"
+ image_name="icons/Male.png"
+ left="230"
+ name="male_icon"
+ tool_tip="Male"
+ top="7"
+ width="16" />
+ <icon
+ height="16"
+ image_name="icons/Female.png"
+ name="female_icon"
+ left="280"
+ tool_tip="Female"
+ top="7"
+ width="16" />
+ <line_editor
+ follows="all"
+ height="23"
+ layout="topleft"
+ left="10"
+ max_length="300"
+ name="description"
+ prevalidate_callback="ascii"
+ text_color="black"
+ top_pad="3"
+ width="290" />
</panel>
<panel
follows="all"
- height="400"
+ height="433"
layout="topleft"
left="0"
name="edit_subpanel_container"
- top_pad="10"
+ top_pad="2"
width="333">
+ <!-- the shape editing panel is taller than the others
+ because it also displays avatar height -->
<panel
filename="panel_edit_shape.xml"
follows="all"
- height="400"
+ height="433"
layout="topleft"
left="0"
name="edit_shape_panel"
@@ -197,168 +260,169 @@ left="0"
<panel
filename="panel_edit_skin.xml"
follows="all"
- height="400"
+ height="425"
layout="topleft"
left="0"
name="edit_skin_panel"
- top="0"
+ top="8"
visible="false"
width="333" />
<panel
filename="panel_edit_hair.xml"
follows="all"
- height="400"
+ height="425"
layout="topleft"
left="0"
name="edit_hair_panel"
- top="0"
+ top="8"
visible="false"
width="333" />
<panel
filename="panel_edit_eyes.xml"
follows="all"
- height="400"
+ height="425"
layout="topleft"
left="0"
name="edit_eyes_panel"
- top="0"
+ top="8"
visible="false"
width="333" />
<panel
filename="panel_edit_shirt.xml"
follows="all"
- height="400"
+ height="425"
layout="topleft"
left="0"
name="edit_shirt_panel"
- top="0"
+ top="8"
visible="false"
width="333" />
<panel
filename="panel_edit_pants.xml"
follows="all"
- height="400"
+ height="425"
layout="topleft"
left="0"
name="edit_pants_panel"
- top="0"
+ top="8"
visible="false"
width="333" />
<panel
filename="panel_edit_shoes.xml"
follows="all"
- height="400"
+ height="425"
layout="topleft"
left="0"
name="edit_shoes_panel"
- top="0"
+ top="8"
visible="false"
width="333" />
<panel
filename="panel_edit_socks.xml"
follows="all"
- height="400"
+ height="425"
layout="topleft"
left="0"
name="edit_socks_panel"
- top="0"
+ top="8"
visible="false"
width="333" />
<panel
filename="panel_edit_jacket.xml"
follows="all"
- height="400"
+ height="425"
layout="topleft"
left="0"
name="edit_jacket_panel"
- top="0"
+ top="8"
visible="false"
width="333" />
<panel
filename="panel_edit_skirt.xml"
follows="all"
- height="400"
+ height="425"
layout="topleft"
left="0"
name="edit_skirt_panel"
- top="0"
+ top="8"
visible="false"
width="333" />
<panel
filename="panel_edit_gloves.xml"
follows="all"
- height="400"
+ height="425"
layout="topleft"
left="0"
name="edit_gloves_panel"
- top="0"
+ top="8"
visible="false"
width="333" />
<panel
filename="panel_edit_undershirt.xml"
follows="all"
- height="400"
+ height="425"
layout="topleft"
left="0"
name="edit_undershirt_panel"
- top="0"
+ top="8"
visible="false"
width="333" />
<panel
filename="panel_edit_underpants.xml"
follows="all"
- height="400"
+ height="425"
layout="topleft"
left="0"
name="edit_underpants_panel"
- top="0"
+ top="8"
visible="false"
width="333" />
<panel
filename="panel_edit_alpha.xml"
follows="all"
- height="400"
+ height="425"
layout="topleft"
left="0"
name="edit_alpha_panel"
- top="0"
+ top="8"
visible="false"
width="333" />
<panel
filename="panel_edit_tattoo.xml"
follows="all"
- height="400"
+ height="425"
layout="topleft"
left="0"
name="edit_tattoo_panel"
- top="0"
+ top="8"
visible="false"
width="333" />
</panel>
+
<panel
- follows="all"
- height="25"
- layout="bottom|left|right"
- left="0"
+ follows="bottom|left|right"
+ height="23"
+ layout="topleft"
+ left="2"
name="button_panel"
- top_pad="10"
+ top_pad="6"
width="333" >
<button
follows="bottomleft"
layout="topleft"
height="23"
label="Save As"
- left="10"
+ left="8"
name="save_as_button"
top="0"
- width="100" />
+ width="153" />
<button
follows="bottomleft"
layout="topleft"
height="23"
label="Revert"
- left_pad="10"
+ left_pad="7"
name="revert_button"
- width="100" />
+ width="152" />
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_generic_tip.xml b/indra/newview/skins/default/xui/en/panel_generic_tip.xml
new file mode 100644
index 0000000000..eea92895f5
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_generic_tip.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ height="40"
+ layout="topleft"
+ left="0"
+ name="panel_generic_tip"
+ top="0"
+ width="305">
+ <text
+ follows="all"
+ font="SansSerif"
+ height="20"
+ layout="topleft"
+ left="10"
+ max_length="350"
+ name="message"
+ text_color="white"
+ top="10"
+ use_ellipses="true"
+ value=""
+ width="285"
+ wrap="true" />
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_control_panel.xml b/indra/newview/skins/default/xui/en/panel_group_control_panel.xml
index aa7d621e4c..c1dc2aaaf7 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
@@ -36,7 +36,7 @@
layout="topleft"
name="speakers_list"
opaque="false"
- show_info_btn="false"
+ show_info_btn="true"
show_profile_btn="false"
show_speaking_indicator="false"
width="145" />
diff --git a/indra/newview/skins/default/xui/en/panel_group_general.xml b/indra/newview/skins/default/xui/en/panel_group_general.xml
index 618167181f..2af1a84400 100644
--- a/indra/newview/skins/default/xui/en/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_general.xml
@@ -1,9 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
label="General"
- follows="all"
height="604"
- width="313"
+ width="304"
class="panel_group_general"
name="general_tab">
<panel.string
@@ -20,15 +19,85 @@ Hover your mouse over the options for more help.
name="incomplete_member_data_str">
Retrieving member data
</panel.string>
+ <panel
+ name="group_info_top"
+ follows="top|left"
+ top="0"
+ left="0"
+ height="129"
+ width="304"
+ layout="topleft">
+ <texture_picker
+ default_image_name="Generic_Group_Large"
+ follows="left|top"
+ height="110"
+ label=""
+ layout="topleft"
+ left="10"
+ name="insignia"
+ no_commit_on_selection="true"
+ tool_tip="Click to choose a picture"
+ top="5"
+ width="100" />
+ <text
+ font="SansSerifSmall"
+ text_color="White_50"
+ width="190"
+ follows="top|left"
+ layout="topleft"
+ mouse_opaque="false"
+ type="string"
+ height="16"
+ length="1"
+ left_pad="10"
+ name="prepend_founded_by"
+ top_delta="0">
+ Founder:
+ </text>
+ <name_box
+ follows="left|top"
+ height="16"
+ initial_value="(retrieving)"
+ layout="topleft"
+ left_delta="0"
+ link="true"
+ name="founder_name"
+ top_pad="2"
+ use_ellipses="true"
+ width="190" />
+ <text
+ font="SansSerifMedium"
+ text_color="EmphasisColor"
+ type="string"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left_delta="0"
+ name="join_cost_text"
+ top_pad="10"
+ visible="true"
+ width="190">
+ Free
+ </text>
+ <button
+ follows="left|top"
+ left_delta="0"
+ top_pad="6"
+ height="23"
+ label="JOIN NOW!"
+ name="btn_join"
+ visible="true"
+ width="120" />
+ </panel>
<text_editor
type="string"
follows="left|top|right"
left="5"
- height="150"
+ height="80"
layout="topleft"
max_length="511"
name="charter"
- top="5"
+ top="105"
right="-1"
bg_readonly_color="DkGray2"
text_readonly_color="White"
@@ -40,7 +109,7 @@ Hover your mouse over the options for more help.
draw_heading="true"
follows="left|top|right"
heading_height="23"
- height="200"
+ height="160"
layout="topleft"
left="0"
name="visible_members"
@@ -110,9 +179,9 @@ Hover your mouse over the options for more help.
top_pad="5"
width="295" />
<panel
- background_visible="true"
- bevel_style="in"
- border="true"
+ background_visible="false"
+ bevel_style="none"
+ border="false"
bg_alpha_color="FloaterUnfocusBorderColor"
follows="left|top|right"
height="140"
@@ -173,14 +242,17 @@ Hover your mouse over the options for more help.
tool_tip="Sets whether your group contains information rated as Moderate"
top_pad="4"
width="190">
+ <combo_item name="select_mature" value="Select">
+ - Select maturity rating -
+ </combo_item>
<combo_box.item
- label="General Content"
- name="pg"
- value="Not Mature" />
- <combo_box.item
label="Moderate Content"
name="mature"
value="Mature" />
+ <combo_box.item
+ label="General Content"
+ name="pg"
+ value="Not Mature" />
</combo_box>
<check_box
follows="left|top"
diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
index 9727c54c6b..e894fc8fb8 100644
--- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
@@ -31,32 +31,39 @@ background_visible="true"
follows="top|left"
top="0"
left="0"
- height="129"
+ height="29"
width="313"
layout="topleft">
<button
follows="top|right"
- height="23"
- image_overlay="BackArrow_Off"
+ height="24"
+ image_hover_unselected="BackButton_Over"
+ image_pressed="BackButton_Press"
+ image_unselected="BackButton_Off"
layout="topleft"
name="back"
- left="10"
+ left="7"
tab_stop="false"
top="2"
- width="23" />
- <text
+ width="30" />
+ <text_editor
+ allow_scroll="false"
+ bg_visible="false"
+ read_only = "true"
layout="topleft"
name="group_name"
+ v_pad="0"
value="(Loading...)"
- font="SansSerifHuge"
- height="20"
- left_pad="5"
- text_color="white"
- top="3"
+ font="SansSerifHugeBold"
+ h_pad="0"
+ height="26"
+ left_pad="8"
+ text_color="LtGray"
+ top="1"
use_ellipses="true"
- width="270"
- follows="top|left"
- word_wrap="true"
+ width="275"
+ follows="top|left|right"
+ word_wrap="false"
mouse_opaque="false"/>
<line_editor
follows="left|top"
@@ -70,155 +77,109 @@ background_visible="true"
width="270"
height="20"
visible="false" />
- <texture_picker
- follows="left|top"
- height="113"
- label=""
- layout="topleft"
- left="10"
- name="insignia"
- no_commit_on_selection="true"
- tool_tip="Click to choose a picture"
- top_pad="5"
- width="100" />
- <text
- font="SansSerifSmall"
- text_color="White_50"
- width="190"
- follows="top|left"
- layout="topleft"
- mouse_opaque="false"
- type="string"
- height="16"
- length="1"
- left_pad="10"
- name="prepend_founded_by"
- top_delta="0">
- Founder:
- </text>
- <name_box
- follows="left|top"
- height="16"
- initial_value="(retrieving)"
- layout="topleft"
- left_delta="0"
- link="true"
- name="founder_name"
- top_pad="2"
- use_ellipses="true"
- width="190" />
- <text
- font="SansSerifMedium"
- text_color="EmphasisColor"
- type="string"
- follows="left|top"
- height="16"
- layout="topleft"
- left_delta="0"
- name="join_cost_text"
- top_pad="10"
- visible="true"
- width="190">
- Free
- </text>
- <button
- follows="left|top"
- left_delta="0"
- top_pad="6"
- height="23"
- label="JOIN NOW!"
- name="btn_join"
- visible="true"
- width="120" />
</panel>
<layout_stack
name="layout"
orientation="vertical"
follows="all"
- left="0"
+ left="8"
top_pad="0"
- height="437"
- width="313"
+ height="536"
+ width="292"
border_size="0">
<layout_panel
- name="group_accordions"
- follows="all"
- layout="topleft"
- auto_resize="true"
- >
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ name="group_accordions"
+ follows="all"
+ layout="topleft"
+ auto_resize="true"
+ width="313">
<accordion
left="0"
top="0"
- single_expansion="true"
- follows="all"
- layout="topleft"
- name="groups_accordion">
- <accordion_tab
+ single_expansion="true"
+ fit_parent="true"
+ follows="all"
+ layout="topleft"
+ name="groups_accordion"
+ width="313">
+ <accordion_tab
expanded="true"
layout="topleft"
name="group_general_tab"
- title="General">
- <panel
- border="false"
- class="panel_group_general"
- filename="panel_group_general.xml"
- layout="topleft"
- left="0"
- follows="all"
- help_topic="group_general_tab"
- name="group_general_tab_panel"
- top="0" />
+ title="General"
+ fit_panel="false">
+ <panel
+ border="false"
+ class="panel_group_general"
+ filename="panel_group_general.xml"
+ layout="topleft"
+ left="0"
+ follows="left|top|right"
+ help_topic="group_general_tab"
+ name="group_general_tab_panel"
+ top="0" />
</accordion_tab>
<accordion_tab
expanded="false"
layout="topleft"
name="group_roles_tab"
- title="Roles">
- <panel
- border="false"
- class="panel_group_roles"
- filename="panel_group_roles.xml"
- layout="topleft"
- left="0"
- name="group_roles_tab_panel"
- top="0" />
+ title="Roles"
+ fit_panel="false">
+ <panel
+ border="false"
+ class="panel_group_roles"
+ filename="panel_group_roles.xml"
+ follows="left|top|right"
+ layout="topleft"
+ left="0"
+ name="group_roles_tab_panel"
+ top="0" />
</accordion_tab>
<accordion_tab
- expanded="false"
- layout="topleft"
- name="group_notices_tab"
- title="Notices">
- <panel
- border="false"
- class="panel_group_notices"
- filename="panel_group_notices.xml"
- layout="topleft"
- left="0"
- help_topic="group_notices_tab"
- name="group_notices_tab_panel"
- top="0" />
+ expanded="false"
+ layout="topleft"
+ name="group_notices_tab"
+ title="Notices"
+ fit_panel="false">
+ <panel
+ border="false"
+ class="panel_group_notices"
+ filename="panel_group_notices.xml"
+ follows="left|top|right"
+ layout="topleft"
+ left="0"
+ help_topic="group_notices_tab"
+ name="group_notices_tab_panel"
+ top="0" />
</accordion_tab>
- <accordion_tab
- expanded="false"
- layout="topleft"
- name="group_land_tab"
- title="Land/Assets">
- <panel
- border="false"
- class="panel_group_land_money"
- filename="panel_group_land_money.xml"
- layout="topleft"
- left="0"
- name="group_land_tab_panel"
- top="0" />
+ <accordion_tab
+ expanded="false"
+ layout="topleft"
+ name="group_land_tab"
+ title="Land/Assets"
+ fit_panel="false">
+ <panel
+ border="false"
+ class="panel_group_land_money"
+ filename="panel_group_land_money.xml"
+ follows="left|top|right"
+ layout="topleft"
+ left="0"
+ name="group_land_tab_panel"
+ top="0" />
</accordion_tab>
</accordion>
</layout_panel>
<layout_panel
- height="25"
+ height="30"
layout="topleft"
auto_resize="false"
left="0"
+ top_pad="0"
name="button_row"
follows="bottom|left"
width="313">
@@ -227,56 +188,52 @@ background_visible="true"
height="23"
image_overlay="Refresh_Off"
layout="topleft"
- left="5"
- top="0"
+ left="0"
+ top="5"
name="btn_refresh"
width="23" />
- <button
- follows="bottom|left"
- height="18"
- image_selected="AddItem_Press"
- image_unselected="AddItem_Off"
- image_disabled="AddItem_Disabled"
- layout="topleft"
- left_pad="2"
- top_delta="3"
- name="btn_create"
- visible="true"
- tool_tip="Create a new Group"
- width="18" />
- <!-- <button
- left_pad="10"
- height="20"
- label="Cancel"
- label_selected="Cancel"
- name="btn_cancel"
- visible="false"
- width="65" />-->
<button
follows="bottom|left"
label="Chat"
name="btn_chat"
- left_pad="2"
+ left_pad="3"
height="23"
- top_delta="-3"
- width="60" />
+ width="82" />
<button
follows="bottom|left"
- left_pad="2"
+ left_pad="3"
height="23"
name="btn_call"
label="Group Call"
layout="topleft"
tool_tip="Call this group"
- width="95" />
+ width="112" />
<button
follows="bottom|left"
height="23"
label="Save"
label_selected="Save"
name="btn_apply"
- left_pad="2"
- width="85" />
+ left_pad="3"
+ width="82" />
+ <button
+ follows="bottom|left"
+ height="23"
+ layout="topleft"
+ left="0"
+ label="Create Group"
+ name="btn_create"
+ visible="true"
+ tool_tip="Create a new Group"
+ width="103" />
+ <!--<button
+ left_pad="3"
+ height="23"
+ label="Cancel"
+ label_selected="Cancel"
+ name="btn_cancel"
+ visible="false"
+ width="65" />-->
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_invite.xml b/indra/newview/skins/default/xui/en/panel_group_invite.xml
index 48083b7677..15a3191bdf 100644
--- a/indra/newview/skins/default/xui/en/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_invite.xml
@@ -86,7 +86,7 @@
left="4"
name="ok_button"
top="356"
- width="130" />
+ width="135" />
<button
height="20"
label="Cancel"
diff --git a/indra/newview/skins/default/xui/en/panel_group_land_money.xml b/indra/newview/skins/default/xui/en/panel_group_land_money.xml
index 38b0f234d5..76f7484c68 100644
--- a/indra/newview/skins/default/xui/en/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_land_money.xml
@@ -1,14 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
border="false"
- follows="all"
height="500"
label="Land &amp; L$"
layout="topleft"
left="0"
name="land_money_tab"
top="0"
- width="313">
+ width="304">
<panel.string
name="help_text">
A warning appears until the Total Land in Use is less than or = to the Total Contribution.
@@ -18,6 +17,10 @@
You don&apos;t have permission to view group owned land
</panel.string>
<panel.string
+ name="epmty_view_group_land_text">
+ No entries
+ </panel.string>
+ <panel.string
name="cant_view_group_accounting_text">
You don&apos;t have permission to view the group&apos;s accounting information.
</panel.string>
@@ -263,6 +266,7 @@
top="0"
width="313">
<text_editor
+ enabled="false"
type="string"
follows="all"
height="200"
@@ -287,6 +291,7 @@
top="0"
width="313">
<text_editor
+ enabled="false"
type="string"
follows="all"
height="185"
@@ -330,6 +335,7 @@
top="0"
width="313">
<text_editor
+ enabled="false"
type="string"
follows="all"
height="185"
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 5f46ad7860..6523b0d491 100644
--- a/indra/newview/skins/default/xui/en/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_notices.xml
@@ -1,13 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
- follows="all"
height="530"
label="Notices"
layout="topleft"
left="0"
name="notices_tab"
top="0"
- width="313">
+ width="304">
<panel.string
name="help_text">
Notices let you send a message and an optionally attached item.
@@ -44,7 +43,7 @@ Maximum 200 per group daily
right="-1"
name="notice_list"
top_pad="0"
- width="313">
+ width="304">
<scroll_list.columns
label=""
name="icon"
@@ -75,16 +74,14 @@ Maximum 200 per group daily
</text>
<button
follows="top|left"
- height="18"
- image_selected="AddItem_Press"
- image_unselected="AddItem_Off"
- image_disabled="AddItem_Disabled"
+ height="23"
+ image_overlay="AddItem_Off"
layout="topleft"
left="5"
name="create_new_notice"
tool_tip="Create a new notice"
- top_delta="-3"
- width="18" />
+ top_delta="-3"
+ width="23" />
<button
follows="top|left"
height="23"
@@ -132,6 +129,7 @@ Maximum 200 per group daily
Subject:
</text>
<line_editor
+ follows="left|top|right"
border_style="line"
border_thickness="1"
height="16"
@@ -154,6 +152,7 @@ Maximum 200 per group daily
Message:
</text>
<text_editor
+ follows="left|top|right"
height="90"
layout="topleft"
left_pad="3"
@@ -174,6 +173,7 @@ Maximum 200 per group daily
Attach:
</text>
<line_editor
+ follows="left|top|right"
enabled="false"
height="19"
layout="topleft"
@@ -208,9 +208,23 @@ Maximum 200 per group daily
<button
follows="left|top"
layout="topleft"
+ left="20"
+ top_delta="50"
+ height="23"
+ width="100"
+ name="open_inventory"
+ label="Inventory"
+ tool_tip="Open Inventory">
+ <button.init_callback
+ function="Button.SetFloaterToggle"
+ parameter="inventory"/>
+ </button>
+ <button
+ follows="left|top"
+ layout="topleft"
left="140"
name="remove_attachment"
- top_delta="50"
+ top_delta="0"
height="18"
image_selected="TrashItem_Press"
image_unselected="TrashItem_Off"
@@ -223,12 +237,12 @@ Maximum 200 per group daily
label="Send"
label_selected="Send"
layout="topleft"
- right="-10"
+ right="-25"
top_pad="10"
name="send_notice"
width="100" />
<group_drop_target
- height="95"
+ height="75"
top="160"
left="10"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_group_roles.xml b/indra/newview/skins/default/xui/en/panel_group_roles.xml
index 25a0213bde..0eb5c47f85 100644
--- a/indra/newview/skins/default/xui/en/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_roles.xml
@@ -1,13 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
- follows="all"
height="680"
label="Members &amp; Roles"
layout="topleft"
left="0"
top="0"
name="roles_tab"
- width="313">
+ width="304">
<panel.string
name="default_needs_apply_text">
There are unsaved changes
@@ -31,7 +30,7 @@
tab_height="22"
tab_min_width="90"
top="0"
- width="313">
+ width="304">
<panel
border="false"
follows="all"
@@ -276,7 +275,7 @@ things in this group. There&apos;s a broad variety of Abilities.
</tab_container>
<panel
height="350"
- background_visible="true"
+ background_visible="false"
bg_alpha_color="FloaterUnfocusBorderColor"
layout="topleft"
follows="top|left|right"
@@ -356,7 +355,7 @@ things in this group. There&apos;s a broad variety of Abilities.
</panel>
<panel
height="550"
- background_visible="true"
+ background_visible="false"
bg_alpha_color="FloaterUnfocusBorderColor"
layout="topleft"
follows="top|left|right"
@@ -386,7 +385,7 @@ things in this group. There&apos;s a broad variety of Abilities.
left="0"
follows="left|top|right"
right="-1"
- max_length="295"
+ max_length="20"
name="role_name"
top_pad="0"
width="300">
@@ -409,7 +408,7 @@ things in this group. There&apos;s a broad variety of Abilities.
left="0"
follows="left|top|right"
right="-1"
- max_length="295"
+ max_length="20"
name="role_title"
top_pad="0"
width="300">
@@ -509,7 +508,7 @@ things in this group. There&apos;s a broad variety of Abilities.
</panel>
<panel
height="424"
- background_visible="true"
+ background_visible="false"
bg_alpha_color="FloaterUnfocusBorderColor"
layout="topleft"
follows="top|left|right"
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 c7e5b25e06..33a5e01e4c 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
@@ -3,35 +3,26 @@
border="false"
height="300"
name="panel_im_control_panel"
- width="110">
+ width="119">
<avatar_icon
follows="left|top"
height="105"
left_delta="5"
name="avatar_icon"
top="-5"
- width="105"/>
- <text
- follows="top|left|right"
- font="SansSerifLarge"
- height="19"
- layout="topleft"
- name="avatar_name"
- use_ellipses="true"
- value="Unknown"
- width="110" />
+ width="114"/>
<layout_stack
mouse_opaque="false"
border_size="0"
clip="false"
follows="all"
- height="168"
+ height="183"
layout="topleft"
left="5"
name="button_stack"
orientation="vertical"
- top_pad="-5"
- width="105">
+ top_pad="5"
+ width="114">
<layout_panel
mouse_opaque="false"
auto_resize="true"
@@ -40,7 +31,7 @@
layout="topleft"
left="2"
min_height="0"
- width="100"
+ width="109"
top="0"
name="spacer"
user_resize="false" />
@@ -50,7 +41,7 @@
height="20"
layout="topleft"
min_height="20"
- width="100"
+ width="109"
name="view_profile_btn_panel"
user_resize="false">
<button
@@ -59,7 +50,7 @@
label="Profile"
name="view_profile_btn"
top="0"
- width="100" />
+ width="109" />
</layout_panel>
<layout_panel
auto_resize="false"
@@ -67,7 +58,7 @@
height="25"
layout="topleft"
min_height="25"
- width="100"
+ width="109"
name="add_friend_btn_panel"
user_resize="false">
<button
@@ -76,7 +67,7 @@
label="Add Friend"
name="add_friend_btn"
top="5"
- width="100" />
+ width="109" />
</layout_panel>
<layout_panel
auto_resize="false"
@@ -84,7 +75,7 @@
height="25"
layout="topleft"
min_height="25"
- width="100"
+ width="109"
name="teleport_btn_panel"
user_resize="false">
<button
@@ -94,7 +85,7 @@
label="Teleport"
name="teleport_btn"
tool_tip = "Offer to teleport this person"
- width="100" />
+ width="109" />
</layout_panel>
<layout_panel
auto_resize="false"
@@ -102,7 +93,7 @@
height="25"
layout="topleft"
min_height="25"
- width="100"
+ width="109"
name="share_btn_panel"
user_resize="false">
<button
@@ -111,7 +102,7 @@
height="23"
label="Share"
name="share_btn"
- width="100" />
+ width="109" />
</layout_panel>
<layout_panel
auto_resize="false"
@@ -119,8 +110,8 @@
height="25"
layout="topleft"
min_height="25"
- width="100"
- name="share_btn_panel"
+ width="109"
+ name="pay_btn_panel"
user_resize="false">
<button
auto_resize="true"
@@ -128,7 +119,7 @@
height="23"
label="Pay"
name="pay_btn"
- width="100" />
+ width="109" />
</layout_panel>
<layout_panel
auto_resize="false"
@@ -136,7 +127,7 @@
height="25"
layout="topleft"
min_height="25"
- width="100"
+ width="109"
name="call_btn_panel"
user_resize="false">
<button
@@ -144,7 +135,7 @@
height="23"
label="Call"
name="call_btn"
- width="100" />
+ width="109" />
</layout_panel>
<layout_panel
auto_resize="false"
@@ -152,16 +143,16 @@
height="25"
layout="topleft"
min_height="25"
- width="100"
+ width="109"
name="end_call_btn_panel"
user_resize="false"
visible="false">
<button
follows="left|top|right"
height="23"
- label="Leave Call"
+ label="End Call"
name="end_call_btn"
- width="100" />
+ width="109" />
</layout_panel>
<layout_panel
auto_resize="false"
@@ -169,7 +160,7 @@
height="25"
layout="topleft"
min_height="25"
- width="100"
+ width="109"
name="voice_ctrls_btn_panel"
user_resize="false"
visible="false">
@@ -178,7 +169,7 @@
height="23"
label="Voice Controls"
name="voice_ctrls_btn"
- width="100" />
+ width="109" />
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_instant_message.xml b/indra/newview/skins/default/xui/en/panel_instant_message.xml
index a0ad38cf76..34fd3352a3 100644
--- a/indra/newview/skins/default/xui/en/panel_instant_message.xml
+++ b/indra/newview/skins/default/xui/en/panel_instant_message.xml
@@ -56,16 +56,6 @@
name="adhoc_icon"
top="3"
width="18" />
- <!--<icon
- follows="right"
- height="20"
- image_name=""
- layout="topleft"
- left="3"
- mouse_opaque="true"
- name="sys_msg_icon"
- top="0"
- width="20" />-->
<text
follows="left|right"
font.style="BOLD"
diff --git a/indra/newview/skins/default/xui/en/panel_inventory_item.xml b/indra/newview/skins/default/xui/en/panel_inventory_item.xml
new file mode 100644
index 0000000000..f1b7b92ece
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_inventory_item.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ follows="top|right|left"
+ height="20"
+ layout="topleft"
+ left="0"
+ name="inventory_item"
+ top="0"
+ width="380">
+ <icon
+ follows="top|right|left"
+ height="20"
+ image_name="ListItem_Over"
+ layout="topleft"
+ left="0"
+ name="hovered_icon"
+ top="0"
+ visible="false"
+ width="380" />
+ <icon
+ height="20"
+ follows="top|right|left"
+ image_name="ListItem_Select"
+ layout="topleft"
+ left="0"
+ name="selected_icon"
+ top="0"
+ visible="false"
+ width="380" />
+ <icon
+ height="16"
+ follows="top|left"
+ image_name="Inv_Object"
+ layout="topleft"
+ left="0"
+ name="item_icon"
+ top="0"
+ width="16" />
+ <text
+ follows="left|right"
+ height="20"
+ layout="topleft"
+ left_pad="5"
+ allow_html="false"
+ use_ellipses="true"
+ name="item_name"
+ text_color="white"
+ top="4"
+ value="..."
+ width="359" />
+</panel>
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 d1b22a34bb..55fef5aaf7 100644
--- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
@@ -8,7 +8,7 @@
min_height="350"
name="landmark_info"
top="20"
- width="330">
+ width="333">
<string
name="title_create_landmark"
value="Create Landmark" />
@@ -46,62 +46,67 @@
<!-- Texture names for rating icons -->
<string
name="icon_PG"
+ translate="false"
value="Parcel_PG_Dark" />
<string
name="icon_M"
+ translate="false"
value="Parcel_M_Dark" />
<string
name="icon_R"
+ translate="false"
value="Parcel_R_Dark" />
<button
follows="top|right"
- height="23"
- image_overlay="BackArrow_Off"
+ height="24"
+ image_hover_unselected="BackButton_Over"
+ image_pressed="BackButton_Press"
+ image_unselected="BackButton_Off"
layout="topleft"
- left="10"
+ left="9"
name="back_btn"
tool_tip="Back"
tab_stop="false"
- top="0"
- width="23" />
+ top="4"
+ width="30" />
<text
follows="top|left|right"
font="SansSerifHugeBold"
height="26"
layout="topleft"
- left_pad="10"
+ left_pad="7"
name="title"
text_color="LtGray"
- top="0"
+ top="3"
use_ellipses="true"
value="Place Profile"
- width="275" />
+ width="280" />
<scroll_container
color="DkGray2"
follows="all"
- height="533"
+ height="532"
layout="topleft"
- left="10"
+ left="9"
name="place_scroll"
opaque="true"
- top_pad="5"
- width="313">
+ top_pad="10"
+ width="310">
<panel
bg_alpha_color="DkGray2"
follows="left|top|right"
- height="610"
+ height="630"
layout="topleft"
left="0"
min_height="300"
name="scrolling_panel"
top="0"
- width="313">
+ width="310">
<texture_picker
enabled="false"
- follows="top|left"
- height="190"
+ follows="left|top|right"
+ height="197"
layout="topleft"
- left="10"
+ left="11"
name="logo"
top="10"
width="290" />
@@ -113,29 +118,30 @@
left="10"
name="region_title"
text_color="white"
- top_pad="5"
+ top_pad="10"
use_ellipses="true"
value="SampleRegion"
- width="290" />
+ width="280" />
<text
follows="left|top|right"
height="14"
layout="topleft"
left="10"
name="parcel_title"
- top_pad="4"
+ top_pad="10"
use_ellipses="true"
value="SampleParcel, Name Long (145, 228, 26)"
- width="285" />
+ width="280" />
<expandable_text
follows="left|top|right"
height="50"
layout="topleft"
- left="5"
+ left="10"
name="description"
+ textbox.label="More"
top_pad="10"
value="Du waltz die spritz"
- width="300" />
+ width="280" />
<icon
follows="top|left"
height="16"
@@ -149,9 +155,9 @@
follows="left|top|right"
height="16"
layout="topleft"
- left_pad="8"
+ left_pad="5"
name="maturity_value"
- top_delta="0"
+ top_pad="-13"
value="unknown"
width="268" />
<panel
@@ -269,6 +275,7 @@
name="notes_editor"
read_only="true"
text_readonly_color="white"
+ text_type="ascii"
top_pad="5"
width="290"
wrap="true" />
@@ -283,7 +290,7 @@
width="290" />
<combo_box
follows="bottom|left|right"
- height="20"
+ height="23"
layout="topleft"
left="0"
name="folder_combo"
diff --git a/indra/newview/skins/default/xui/en/panel_landmarks.xml b/indra/newview/skins/default/xui/en/panel_landmarks.xml
index 91d4cd6e83..a7e87f2a1e 100644
--- a/indra/newview/skins/default/xui/en/panel_landmarks.xml
+++ b/indra/newview/skins/default/xui/en/panel_landmarks.xml
@@ -3,22 +3,25 @@
name="Landmarks"
top="0"
height="400"
- layout="topleft"
+ layout="topleft"
left="0"
- width="380"
+ width="313"
help_topic="panel_landmarks"
- border="true"
+ border="false"
background_visible="true"
- bg_alpha_color="DkGray2"
- follows="left|top|right|bottom">
+ bg_alpha_color="DkGray"
+ follows="all">
<accordion
- follows="left|top|right|bottom"
- height="368"
+ background_visible="true"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ follows="all"
+ height="373"
layout="topleft"
- left="0"
+ left="3"
name="landmarks_accordion"
- top="2"
- width="380">
+ top="0"
+ width="307">
<accordion_tab
layout="topleft"
name="tab_favorites"
@@ -27,13 +30,13 @@
allow_multi_select="true"
border="false"
bottom="0"
- follows="left|top|right|bottom"
+ follows="all"
height="126"
left="0"
mouse_opaque="true"
name="favorites_list"
start_folder="Favorites"
- width="380"/>
+ width="307"/>
</accordion_tab>
<accordion_tab
layout="topleft"
@@ -43,13 +46,13 @@
allow_multi_select="true"
border="false"
bottom="0"
- follows="left|top|right|bottom"
+ follows="all"
height="126"
left="0"
mouse_opaque="true"
name="landmarks_list"
start_folder="Landmarks"
- width="380"/>
+ width="307"/>
</accordion_tab>
<accordion_tab
layout="topleft"
@@ -59,13 +62,13 @@
allow_multi_select="true"
border="false"
bottom="0"
- follows="left|top|right|bottom"
+ follows="all"
height="126"
left="0"
mouse_opaque="true"
name="my_inventory_list"
start_folder="My Inventory"
- width="380"/>
+ width="307"/>
</accordion_tab>
<accordion_tab
layout="topleft"
@@ -75,13 +78,13 @@
allow_multi_select="true"
border="false"
bottom="0"
- follows="left|top|right|bottom"
- height="120"
+ follows="all"
+ height="126"
left="0"
mouse_opaque="true"
name="library_list"
start_folder="LIBRARY"
- width="380"/>
+ width="313"/>
</accordion_tab>
</accordion>
<panel
@@ -89,44 +92,56 @@
bevel_style="none"
bottom="0"
follows="left|right|bottom"
- height="30"
+ height="27"
layout="bottomleft"
- left="0"
+ left="3"
name="bottom_panel"
- width="380">
+ 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"
+ height="25"
+ image_hover_unselected="Toolbar_Left_Over"
+ image_overlay="OptionsMenu_Off"
+ image_selected="Toolbar_Left_Selected"
+ image_unselected="Toolbar_Left_Off"
layout="topleft"
- left="10"
+ left="0"
name="options_gear_btn"
- top="6"
- width="18" />
+ top="1"
+ width="31" />
<button
follows="bottom|left"
- height="18"
- image_selected="AddItem_Press"
- image_unselected="AddItem_Off"
- image_disabled="AddItem_Disabled"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="AddItem_Off"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
layout="topleft"
- left_pad="5"
+ left_pad="1"
name="add_btn"
tool_tip="Add new landmark"
- width="18" />
+ width="31" />
+ <icon
+ follows="bottom|left"
+ height="25"
+ image_name="Toolbar_Middle_Off"
+ layout="topleft"
+ left_pad="1"
+ name="dummy_icon"
+ width="209"
+ />
<dnd_button
- follows="bottom|right"
- height="18"
- image_selected="TrashItem_Press"
- image_unselected="TrashItem_Off"
+ follows="bottom|left"
+ height="25"
+ image_hover_unselected="Toolbar_Right_Over"
+ image_overlay="TrashItem_Off"
+ image_selected="Toolbar_Right_Selected"
+ image_unselected="Toolbar_Right_Off"
layout="topleft"
- right="-5"
+ left_pad="1"
name="trash_btn"
tool_tip="Remove selected landmark"
- top="6"
- width="18" />
+ width="31" />
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_login.xml b/indra/newview/skins/default/xui/en/panel_login.xml
index 627e616af5..185e458a85 100644
--- a/indra/newview/skins/default/xui/en/panel_login.xml
+++ b/indra/newview/skins/default/xui/en/panel_login.xml
@@ -56,44 +56,23 @@ height="80">
follows="left|bottom"
font="SansSerifSmall"
height="16"
-name="first_name_text"
+name="username_text"
top="20"
left="20"
width="150">
-First name:
+Username:
</text>
<line_editor
follows="left|bottom"
-handle_edit_keys_directly="true"
height="22"
-label="First"
+label="Username"
left_delta="0"
max_length="31"
-name="first_name_edit"
+name="username_edit"
select_on_focus="true"
-tool_tip="[SECOND_LIFE] First Name"
+tool_tip="[SECOND_LIFE] Username"
top_pad="0"
- width="135" />
- <text
- follows="left|bottom"
- font="SansSerifSmall"
- height="16"
- left_pad="8"
- name="last_name_text"
- top="20"
- width="150">
- Last name: </text>
-<line_editor
-follows="left|bottom"
-handle_edit_keys_directly="true"
-height="22"
-label="Last"
-max_length="31"
-name="last_name_edit"
-select_on_focus="true"
-tool_tip="[SECOND_LIFE] Last Name"
- top_pad="0"
- width="135" />
+width="150" />
<text
follows="left|bottom"
font="SansSerifSmall"
@@ -106,7 +85,6 @@ top="20"
</text>
<line_editor
follows="left|bottom"
-handle_edit_keys_directly="true"
height="22"
max_length="16"
name="password_edit"
@@ -170,6 +148,7 @@ allow_text_entry="true"
font="SansSerifSmall"
follows="left|right|bottom"
height="23"
+ max_chars="256"
layout="topleft"
top_pad="2"
name="server_combo"
diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
index 4030c7184a..2a53b3e2fa 100644
--- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml
@@ -1,473 +1,195 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
background_visible="true"
+ default_tab_group="1"
follows="all"
- height="400"
+ height="423"
label="Things"
layout="topleft"
min_height="350"
min_width="240"
name="main inventory panel"
width="330">
- <panel.string
- name="Title">
- Things
- </panel.string>
- <filter_editor
- text_pad_left="14"
- follows="left|top|right"
- height="23"
- label="Filter Inventory"
- layout="topleft"
- left="15"
-max_length="300"
- name="inventory search editor"
- top="26"
- width="303" />
- <tab_container
-follows="all"
-halign="center"
- height="300"
+ <panel.string
+ name="Itemcount">
+ </panel.string>
+ <panel.string
+ name="ItemcountFetching">
+ Fetching [ITEM_COUNT] Items... [FILTER]
+ </panel.string>
+ <panel.string
+ name="ItemcountCompleted">
+ [ITEM_COUNT] Items [FILTER]
+ </panel.string>
+ <panel.string
+ name="ItemcountUnknown">
+
+ </panel.string>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="13"
+ layout="topleft"
+ left="12"
+ name="ItemcountText"
+ font="SansSerifMedium"
+ text_color="EmphasisColor"
+ top_pad="0"
+ width="300">
+ Items:
+ </text>
+ <filter_editor
+ text_pad_left="10"
+ follows="left|top|right"
+ height="23"
+ label="Filter Inventory"
+ layout="topleft"
+ left="10"
+ max_length="300"
+ name="inventory search editor"
+ top="18"
+ width="303" />
+ <tab_container
+ bg_alpha_color="DkGray"
+ bg_opaque_color="DkGray"
+ background_visible="true"
+ background_opaque="true"
+ follows="all"
+ halign="center"
+ height="339"
layout="topleft"
- left_delta="-4"
+ left="7"
name="inventory filter tabs"
tab_height="30"
+ tab_group="1"
tab_position="top"
tab_min_width="100"
- top_pad="4"
- width="305">
- <inventory_panel
- border="false"
- follows="all"
- height="295"
- label="MY INVENTORY"
- help_topic="my_inventory_tab"
- layout="topleft"
- left="0"
- name="All Items"
- top="16"
- width="290" />
- <inventory_panel
- border="false"
- follows="all"
- height="295"
- label="RECENT"
- help_topic="recent_inventory_tab"
- layout="topleft"
- left_delta="0"
- name="Recent Items"
- width="290" />
- </tab_container>
-
- <panel
+ top_pad="10"
+ width="312">
+ <inventory_panel
+ bg_opaque_color="DkGray2"
+ bg_alpha_color="DkGray2"
background_visible="true"
+ background_opaque="true"
+ border="false"
bevel_style="none"
- bottom="0"
- follows="left|right|bottom"
- height="30"
- layout="bottomleft"
+ follows="all"
+ height="338"
+ label="MY INVENTORY"
+ help_topic="my_inventory_tab"
+ layout="topleft"
left="0"
- visible="true"
- name="bottom_panel"
- width="330">
- <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"
- picture_style="true"
- 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="add_btn"
- picture_style="true"
- tool_tip="Add new item"
- width="18" />
- <dnd_button
- follows="bottom|right"
- height="18"
- image_selected="TrashItem_Press"
- image_unselected="TrashItem_Off"
- layout="topleft"
- right="-5"
- name="trash_btn"
- picture_style="true"
- tool_tip="Remove selected item"
- top="6"
- width="18" />
- </panel>
-
- <menu_bar
- bg_visible="false"
- follows="left|top|right"
- height="20"
+ name="All Items"
+ sort_order_setting="InventorySortOrder"
+ show_item_link_overlays="true"
+ top="16"
+ width="288" />
+ <recent_inventory_panel
+ bg_opaque_color="DkGray2"
+ bg_alpha_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
+ border="false"
+ bevel_style="none"
+ follows="all"
+ height="338"
+ label="RECENT"
+ help_topic="recent_inventory_tab"
layout="topleft"
- left="10"
- mouse_opaque="false"
- name="Inventory Menu"
- top="0"
- visible="true"
- width="290">
- <menu
- height="101"
- label="File"
- layout="topleft"
- left="0"
- mouse_opaque="false"
- name="File"
- tear_off="true"
- top="-117"
- width="128">
- <menu_item_call
- label="Open"
- layout="topleft"
- name="Open">
- <menu_item_call.on_click
- function="Inventory.DoToSelected"
- parameter="open" />
- </menu_item_call>
- <menu
- create_jump_keys="true"
- label="Upload"
- layout="topleft"
- name="upload"
- tear_off="true">
- <menu_item_call
- label="Image (L$[COST])..."
- layout="topleft"
- name="Upload Image"
- shortcut="control|U">
- <menu_item_call.on_click
- function="File.UploadImage"
- parameter="" />
- <menu_item_call.on_enable
- function="File.EnableUpload" />
- </menu_item_call>
- <menu_item_call
- label="Sound (L$[COST])..."
- layout="topleft"
- name="Upload Sound">
- <menu_item_call.on_click
- function="File.UploadSound"
- parameter="" />
- <menu_item_call.on_enable
- function="File.EnableUpload" />
- </menu_item_call>
- <menu_item_call
- label="Animation (L$[COST])..."
- layout="topleft"
- name="Upload Animation">
- <menu_item_call.on_click
- function="File.UploadAnim"
- parameter="" />
- <menu_item_call.on_enable
- function="File.EnableUpload" />
- </menu_item_call>
- <menu_item_call
- label="Bulk (L$[COST] per file)..."
- layout="topleft"
- name="Bulk Upload">
- <menu_item_call.on_click
- function="File.UploadBulk"
- parameter="" />
- </menu_item_call>
- <menu_item_separator
- layout="topleft" />
- </menu>
- <menu_item_separator
- layout="topleft" />
- <menu_item_call
- label="New Window"
- layout="topleft"
- name="New Window">
- <menu_item_call.on_click
- function="Inventory.NewWindow" />
- </menu_item_call>
- <menu_item_separator
- layout="topleft"
- name="separator2" />
- <menu_item_call
- label="Show Filters"
- layout="topleft"
- name="Show Filters">
- <menu_item_call.on_click
- function="Inventory.ShowFilters" />
- </menu_item_call>
- <menu_item_call
- label="Reset Filters"
- layout="topleft"
- name="Reset Current">
- <menu_item_call.on_click
- function="Inventory.ResetFilters" />
- </menu_item_call>
- <menu_item_call
- label="Close All Folders"
- layout="topleft"
- name="Close All Folders">
- <menu_item_call.on_click
- function="Inventory.CloseAllFolders" />
- </menu_item_call>
- <menu_item_separator
- layout="topleft"
- name="separator3" />
- <menu_item_call
- label="Empty Trash"
- layout="topleft"
- name="Empty Trash">
- <menu_item_call.on_click
- function="Inventory.EmptyTrash" />
- </menu_item_call>
- <menu_item_call
- label="Empty Lost And Found"
- layout="topleft"
- name="Empty Lost And Found">
- <menu_item_call.on_click
- function="Inventory.EmptyLostAndFound" />
- </menu_item_call>
- </menu>
- <menu
- height="121"
- label="Create"
- layout="topleft"
- left="0"
- mouse_opaque="false"
- name="Create"
- tear_off="true"
- top="-201"
- width="121">
- <menu_item_call
- label="New Folder"
- layout="topleft"
- name="New Folder">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="category" />
- </menu_item_call>
- <menu_item_call
- label="New Script"
- layout="topleft"
- name="New Script">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="lsl" />
- </menu_item_call>
- <menu_item_call
- label="New Notecard"
- layout="topleft"
- name="New Note">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="notecard" />
- </menu_item_call>
- <menu_item_call
- label="New Gesture"
- layout="topleft"
- name="New Gesture">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="gesture" />
- </menu_item_call>
- <menu
- height="175"
- label="New Clothes"
- layout="topleft"
- left_delta="0"
- mouse_opaque="false"
- name="New Clothes"
- top_pad="514"
- width="125">
- <menu_item_call
- label="New Shirt"
- layout="topleft"
- name="New Shirt">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="shirt" />
- </menu_item_call>
- <menu_item_call
- label="New Pants"
- layout="topleft"
- name="New Pants">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="pants" />
- </menu_item_call>
- <menu_item_call
- label="New Shoes"
- layout="topleft"
- name="New Shoes">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="shoes" />
- </menu_item_call>
- <menu_item_call
- label="New Socks"
- layout="topleft"
- name="New Socks">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="socks" />
- </menu_item_call>
- <menu_item_call
- label="New Jacket"
- layout="topleft"
- name="New Jacket">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="jacket" />
- </menu_item_call>
- <menu_item_call
- label="New Skirt"
- layout="topleft"
- name="New Skirt">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="skirt" />
- </menu_item_call>
- <menu_item_call
- label="New Gloves"
- layout="topleft"
- name="New Gloves">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="gloves" />
- </menu_item_call>
- <menu_item_call
- label="New Undershirt"
- layout="topleft"
- name="New Undershirt">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="undershirt" />
- </menu_item_call>
- <menu_item_call
- label="New Underpants"
- layout="topleft"
- name="New Underpants">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="underpants" />
- </menu_item_call>
- <menu_item_call
- label="New Alpha"
- layout="topleft"
- name="New Alpha">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="alpha" />
- </menu_item_call>
- <menu_item_call
- label="New Tattoo"
- layout="topleft"
- name="New Tattoo">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="tattoo" />
- </menu_item_call>
- </menu>
- <menu
- height="85"
- label="New Body Parts"
- layout="topleft"
- left_delta="0"
- mouse_opaque="false"
- name="New Body Parts"
- top_pad="514"
- width="118">
- <menu_item_call
- label="New Shape"
- layout="topleft"
- name="New Shape">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="shape" />
- </menu_item_call>
- <menu_item_call
- label="New Skin"
- layout="topleft"
- name="New Skin">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="skin" />
- </menu_item_call>
- <menu_item_call
- label="New Hair"
- layout="topleft"
- name="New Hair">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="hair" />
- </menu_item_call>
- <menu_item_call
- label="New Eyes"
- layout="topleft"
- name="New Eyes">
- <menu_item_call.on_click
- function="Inventory.DoCreate"
- parameter="eyes" />
- </menu_item_call>
- </menu>
- </menu>
- <menu
- height="49"
- label="Sort"
- layout="topleft"
- left="0"
- mouse_opaque="false"
- name="Sort"
- tear_off="true"
- top="-113"
- width="118">
- <menu_item_check
- control_name="Inventory.SortByName"
- label="By Name"
- layout="topleft"
- name="By Name">
- <menu_item_check.on_click
- function="Inventory.SetSortBy"
- parameter="name" />
- </menu_item_check>
- <menu_item_check
- control_name="Inventory.SortByDate"
- label="By Date"
- layout="topleft"
- name="By Date">
- <menu_item_check.on_click
- function="Inventory.SetSortBy"
- parameter="date" />
- </menu_item_check>
- <menu_item_separator
- layout="topleft" />
- <menu_item_check
- control_name="Inventory.FoldersAlwaysByName"
- label="Folders Always By Name"
- layout="topleft"
- name="Folders Always By Name">
- <menu_item_check.on_click
- function="Inventory.SetSortBy"
- parameter="foldersalwaysbyname" />
- </menu_item_check>
- <menu_item_check
- control_name="Inventory.SystemFoldersToTop"
- label="System Folders To Top"
- layout="topleft"
- name="System Folders To Top">
- <menu_item_check.on_click
- function="Inventory.SetSortBy"
- parameter="systemfolderstotop" />
- </menu_item_check>
- </menu>
- </menu_bar>
+ left_delta="0"
+ name="Recent Items"
+ show_item_link_overlays="true"
+ width="290" />
+ </tab_container>
+ <layout_stack
+ animate="false"
+ background_visible="true"
+ bevel_style="none"
+ border_size="0"
+ follows="left|right|bottom"
+ height="25"
+ layout="topleft"
+ orientation="horizontal"
+ top_pad="0"
+ left="10"
+ name="bottom_panel"
+ width="307">
+ <layout_panel
+ auto_resize="false"
+ height="25"
+ layout="topleft"
+ name="options_gear_btn_panel"
+ width="32">
+ <button
+ follows="bottom|left"
+ tool_tip="Show additional options"
+ height="25"
+ image_hover_unselected="Toolbar_Left_Over"
+ image_overlay="OptionsMenu_Off"
+ image_selected="Toolbar_Left_Selected"
+ image_unselected="Toolbar_Left_Off"
+ layout="topleft"
+ left="0"
+ name="options_gear_btn"
+ top="0"
+ width="31" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ height="25"
+ layout="topleft"
+ name="add_btn_panel"
+ width="32">
+ <button
+ follows="bottom|left"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="AddItem_Off"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ left="0"
+ name="add_btn"
+ tool_tip="Add new item"
+ top="0"
+ width="31" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="true"
+ height="25"
+ layout="topleft"
+ name="dummy_panel"
+ width="212">
+ <icon
+ follows="bottom|left|right"
+ height="25"
+ image_name="Toolbar_Middle_Off"
+ layout="topleft"
+ left="0"
+ top="0"
+ name="dummy_icon"
+ width="211" />
+ </layout_panel>
+ <layout_panel
+ auto_resize="false"
+ height="25"
+ layout="topleft"
+ name="trash_btn_panel"
+ width="31">
+ <dnd_button
+ follows="bottom|left"
+ height="25"
+ image_hover_unselected="Toolbar_Right_Over"
+ image_overlay="TrashItem_Off"
+ image_selected="Toolbar_Right_Selected"
+ image_unselected="Toolbar_Right_Off"
+ left="0"
+ layout="topleft"
+ name="trash_btn"
+ tool_tip="Remove selected item"
+ top="0"
+ width="31"/>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_me.xml b/indra/newview/skins/default/xui/en/panel_me.xml
index a30d80f101..63c522ac69 100644
--- a/indra/newview/skins/default/xui/en/panel_me.xml
+++ b/indra/newview/skins/default/xui/en/panel_me.xml
@@ -4,7 +4,7 @@
border="false"
follows="all"
height="570"
- label="My Profile!!!!!"
+ label="My Profile"
layout="topleft"
left="0"
name="panel_me"
@@ -26,16 +26,16 @@
</text> -->
<tab_container
follows="all"
- height="570"
+ height="575"
halign="center"
layout="topleft"
- left="6"
+ left="5"
name="tabs"
tab_min_width="95"
tab_height="30"
tab_position="top"
top_pad="10"
- width="315">
+ width="317">
<panel
class="panel_my_profile"
filename="panel_my_profile.xml"
diff --git a/indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml
index b5c2371510..c5f44cd049 100644
--- a/indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml
+++ b/indra/newview/skins/default/xui/en/panel_media_settings_permissions.xml
@@ -42,10 +42,11 @@
<text
bottom_delta="-50"
+ enabled="false"
follows="top|left"
height="15"
left="10"
- enabled="false">
+ name="owner_label">
Owner
</text>
@@ -79,10 +80,11 @@
<text
bottom_delta="-36"
+ enabled="false"
follows="top|left"
height="15"
left="10"
- enabled="false">
+ name="group_label">
Group:
</text>
@@ -126,10 +128,11 @@
<text
bottom_delta="-36"
+ enabled="false"
follows="top|left"
height="15"
left="10"
- enabled="false">
+ name="anyone_label">
Anyone
</text>
diff --git a/indra/newview/skins/default/xui/en/panel_my_profile.xml b/indra/newview/skins/default/xui/en/panel_my_profile.xml
index d519569543..841a4f5713 100644
--- a/indra/newview/skins/default/xui/en/panel_my_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_my_profile.xml
@@ -60,13 +60,13 @@
left="0"
name="profile_scroll"
opaque="true"
- height="492"
+ height="488"
width="315"
top="0">
<panel
layout="topleft"
follows="left|top|right"
- height="492"
+ height="488"
name="scroll_content_panel"
top="0"
left="0"
@@ -117,6 +117,8 @@
layout="topleft"
left="107"
textbox.max_length="512"
+ textbox.label="More"
+ textbox.show_context_menu="true"
name="sl_description_edit"
top_pad="-3"
translate="false"
@@ -171,6 +173,8 @@
layout="topleft"
left="107"
textbox.max_length="512"
+ textbox.label="More"
+ textbox.show_context_menu="true"
name="fl_description_edit"
top_pad="-3"
translate="false"
@@ -311,6 +315,8 @@
name="sl_groups"
top_pad="0"
translate="false"
+ textbox.label="More"
+ textbox.show_context_menu="true"
width="298"
expanded_bg_visible="true"
expanded_bg_color="DkGray">
@@ -385,24 +391,16 @@
user_resize="false"
auto_resize="false"
height="28"
- width="313">
+ width="315">
<button
follows="bottom|right"
height="23"
- left="4"
- top="5"
+ left="6"
+ top="1"
label="Edit Profile"
name="edit_profile_btn"
tool_tip="Edit your personal information"
width="152" />
- <button
- follows="bottom|right"
- height="23"
- label="Edit Appearance"
- left_pad="4"
- name="edit_appearance_btn"
- tool_tip="Create/edit your appearance: physical data, clothes and etc."
- width="152" />
</layout_panel>
</layout_stack>
</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 b2ed51abf3..96c76576c0 100644
--- a/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_navigation_bar.xml
@@ -44,6 +44,7 @@
direction="down"
height="23"
image_overlay="Arrow_Left_Off"
+ image_bottom_pad="1"
layout="topleft"
left="10"
name="back_btn"
@@ -55,6 +56,7 @@
direction="down"
height="23"
image_overlay="Arrow_Right_Off"
+ image_bottom_pad="1"
layout="topleft"
left_pad="0"
name="forward_btn"
@@ -64,6 +66,7 @@
<button
follows="left|top"
height="23"
+ image_bottom_pad="1"
image_overlay="Home_Off"
layout="topleft"
left_pad="7"
@@ -116,7 +119,7 @@
commit_on_focus_lost="false"
follows="right|top"
halign="right"
- height="22"
+ height="23"
label="Search"
layout="topleft"
right="-10"
@@ -149,7 +152,6 @@
width="590">
<label
follows="left|top"
- font.style="BOLD"
height="15"
layout="topleft"
left="10"
diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
index 2b361c0628..55df70eb71 100644
--- a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
@@ -7,13 +7,7 @@
left="0"
name="chat_bar"
top="21"
- width="310">
- <string name="min_width">
- 188
- </string>
- <string name="max_width">
- 320
- </string>
+ width="308">
<line_editor
border_style="line"
border_thickness="1"
@@ -22,10 +16,11 @@
label="Click here to chat."
layout="topleft"
left_delta="3"
- text_pad_right="25"
left="0"
- max_length="512"
+ max_length="1024"
name="chat_box"
+ text_pad_left="5"
+ text_pad_right="25"
tool_tip="Press Enter to say, Ctrl+Enter to shout"
top="2"
width="283" />
diff --git a/indra/newview/skins/default/xui/en/panel_nearby_media.xml b/indra/newview/skins/default/xui/en/panel_nearby_media.xml
new file mode 100644
index 0000000000..f5a78fc929
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_nearby_media.xml
@@ -0,0 +1,408 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ can_resize="true"
+ can_close="false"
+ bg_opaque_image="Volume_Background"
+ bg_alpha_image="Volume_Background"
+ background_opaque="true"
+ background_visible="true"
+ layout="topleft"
+ width="328"
+ height="230"
+ name="nearby_media"
+ help_topic="nearby_media">
+ <string name="media_item_count_format">(%ld media items)</string>
+ <string name="empty_item_text">&lt;empty&gt;</string>
+ <string name="parcel_media_name">Parcel Streaming Media</string>
+ <string name="parcel_audio_name">Parcel Streaming Audio</string>
+ <string name="playing_suffix">(playing)</string>
+ <panel
+ bevel_style="in"
+ background_visible="false"
+ follows="left|right|top"
+ top="0"
+ height="35"
+ name="minimized_controls"
+ left="0">
+ <button
+ name="all_nearby_media_disable_btn"
+ follows="left"
+ tool_tip="Turn all nearby media off"
+ left="8"
+ width="95"
+ height="22"
+ label="Stop All">
+ <button.commit_callback
+ function="MediaListCtrl.DisableAll" />
+ </button>
+ <button
+ name="all_nearby_media_enable_btn"
+ follows="left"
+ tool_tip="Turn all nearby media on"
+ left_pad="4"
+ width="95"
+ height="22"
+ label="Start All">
+ <button.commit_callback
+ function="MediaListCtrl.EnableAll" />
+ </button>
+ <button
+ name="open_prefs_btn"
+ image_overlay="Icon_Gear_Foreground"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
+ tool_tip = "Bring up media prefs"
+ top_delta="0"
+ left_pad="4"
+ height="22"
+ min_width="28"
+ width="28">
+ <button.commit_callback
+ function="MediaListCtrl.GoMediaPrefs" />
+ </button>
+ <button
+ name="more_btn"
+ follows="right"
+ tool_tip="Advanced Controls"
+ top_delta="0"
+ right="-8"
+ width="66"
+ height="22"
+ label="More &gt;&gt;"
+ label_selected="Less &lt;&lt;">
+ <button.commit_callback
+ function="MediaListCtrl.MoreLess" />
+ </button>
+ <button
+ name="less_btn"
+ follows="right"
+ tool_tip="Advanced Controls"
+ top_delta="0"
+ right="-8"
+ width="66"
+ height="22"
+ label="More &gt;&gt;"
+ label_selected="Less &lt;&lt;">
+ <button.commit_callback
+ function="MediaListCtrl.MoreLess" />
+ </button>
+ </panel>
+ <panel
+ name="nearby_media_panel"
+ bevel_style="in"
+ border_style="line"
+ bg_alpha_color="0 0 0 0"
+ bg_opaque_color="0 0 0 0.3"
+ follows="left|right|top|bottom"
+ top_delta="30"
+ right="-1"
+ left="0"
+ height="200">
+ <text
+ type="string"
+ length="1"
+ follows="top|left"
+ font="SansSerif"
+ left="10"
+ width="100">
+ Nearby Media
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="top|left"
+ font="SansSerif"
+ top_pad="15"
+ left="10"
+ width="40">
+ Show:
+ </text>
+ <combo_box
+ height="23"
+ left="50"
+ width="140"
+ top_delta="-5"
+ follows="left|top"
+ name="show_combo">
+ <combo_box.item
+ label="All"
+ value="0"
+ name="All" />
+ <combo_box.item
+ label="In this Parcel"
+ value="2"
+ name="WithinParcel" />
+ <combo_box.item
+ label="Outside this Parcel"
+ value="3"
+ name="OutsideParcel" />
+ <combo_box.item
+ label="On other Avatars"
+ value="4"
+ name="OnOthers" />
+ </combo_box>
+ <scroll_list
+ follows="left|top|bottom|right"
+ column_padding="0"
+ height="105"
+ draw_heading="false"
+ draw_stripes="true"
+ bg_stripe_color="0.25 0.25 0.25 0.25"
+ top_pad="8"
+ left="10"
+ right="-10"
+ name="media_list">
+ <scroll_list.columns
+ type="checkbox"
+ width="-1"
+ label=""
+ name="media_checkbox_ctrl" />
+ <scroll_list.columns
+ sort_column="media_proximity"
+ width="-1"
+ label="Proximity"
+ name="media_proximity" />
+ <scroll_list.columns
+ sort_column="media_visibility"
+ width="-1"
+ label="Visible"
+ name="media_visibility" />
+ <scroll_list.columns
+ sort_column="media_class"
+ width="-1"
+ label="Class"
+ name="media_class" />
+ <scroll_list.columns
+ label="Name"
+ name="media_name" />
+ <scroll_list.columns
+ sort_column="media_debug"
+ width="-1"
+ label="Debug"
+ name="media_debug" />
+ </scroll_list>
+ <panel
+ bevel_style="in"
+ background_visible="false"
+ follows="left|right|bottom"
+ top_pad="5"
+ height="30"
+ left="10"
+ right="-10">
+ <layout_stack
+ name="media_controls"
+ follows="left|right|top"
+ animate="false"
+ height="26"
+ layout="topleft"
+ top="4"
+ left="8"
+ right="-10"
+ border_size="0"
+ mouse_opaque="false"
+ orientation="horizontal">
+ <layout_panel
+ name="stop"
+ mouse_opaque="false"
+ auto_resize="false"
+ user_resize="false"
+ layout="topleft"
+ top="0"
+ height="22"
+ min_width="22"
+ width="22">
+ <button
+ name="stop_btn"
+ follows="top"
+ image_overlay="Stop_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
+ layout="topleft"
+ tool_tip="Stop selected media"
+ top="0"
+ height="22"
+ width="22">
+ <button.commit_callback
+ function="SelectedMediaCtrl.Stop" />
+ </button>
+ </layout_panel>
+ <layout_panel
+ name="play"
+ mouse_opaque="false"
+ auto_resize="false"
+ user_resize="false"
+ layout="topleft"
+ top="0"
+ height="22"
+ min_width="22"
+ width="22">
+ <button
+ name="play_btn"
+ follows="top"
+ image_overlay="Play_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
+ layout="topleft"
+ tool_tip = "Play selected media"
+ top="0"
+ height="22"
+ width="22">
+ <button.commit_callback
+ function="SelectedMediaCtrl.Play" />
+ </button>
+ </layout_panel>
+ <layout_panel
+ name="pause"
+ mouse_opaque="false"
+ auto_resize="false"
+ user_resize="false"
+ layout="topleft"
+ top="0"
+ min_width="22"
+ width="22">
+ <button
+ name="pause_btn"
+ follows="top"
+ image_overlay="Pause_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
+ layout="topleft"
+ top="0"
+ height="22"
+ width="22"
+ tool_tip = "Pause selected media">
+ <button.commit_callback
+ function="SelectedMediaCtrl.Pause" />
+ </button>
+ </layout_panel>
+ <layout_panel
+ name="volume_slider_ctrl"
+ mouse_opaque="false"
+ auto_resize="true"
+ user_resize="false"
+ follows="left|right"
+ layout="topleft"
+ top="0"
+ height="22"
+ min_width="100"
+ width="200">
+ <slider_bar
+ name="volume_slider"
+ follows="left|right|top"
+ top="0"
+ height="22"
+ increment="0.01"
+ initial_value="0.5"
+ layout="topleft"
+ tool_tip="Audio volume for selected media"
+ width="200">
+ <slider_bar.commit_callback
+ function="SelectedMediaCtrl.Volume" />
+ </slider_bar>
+ </layout_panel>
+ <layout_panel
+ name="mute"
+ mouse_opaque="false"
+ auto_resize="false"
+ user_resize="false"
+ layout="topleft"
+ top="0"
+ height="72"
+ min_width="22"
+ width="22">
+ <button
+ name="mute_btn"
+ follows="top"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="AudioMute_Off"
+ image_unselected="Audio_Off"
+ hover_glow_amount="0.15"
+ is_toggle="true"
+ layout="topleft"
+ scale_image="false"
+ tool_tip="Mute audio on selected media"
+ top="0"
+ height="20"
+ width="22" >
+ <button.commit_callback
+ function="SelectedMediaCtrl.Mute" />
+ </button>
+ </layout_panel>
+ <layout_panel
+ name="zoom"
+ mouse_opaque="false"
+ auto_resize="false"
+ user_resize="false"
+ layout="topleft"
+ top="0"
+ height="28"
+ min_width="22"
+ width="22">
+ <button
+ name="zoom_btn"
+ follows="top"
+ image_overlay="Zoom_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
+ top="0"
+ height="22"
+ layout="topleft"
+ tool_tip="Zoom into selected media"
+ width="22">
+ <button.commit_callback
+ function="SelectedMediaCtrl.Zoom" />
+ </button>
+ </layout_panel>
+ <layout_panel
+ name="unzoom"
+ mouse_opaque="false"
+ auto_resize="false"
+ user_resize="false"
+ layout="topleft"
+ top="0"
+ min_width="21"
+ width="21" >
+ <button
+ name="unzoom_btn"
+ follows="top"
+ image_overlay="UnZoom_Off"
+ image_disabled="PushButton_Disabled"
+ image_disabled_selected="PushButton_Disabled"
+ image_selected="PushButton_Selected"
+ image_unselected="PushButton_Off"
+ hover_glow_amount="0.15"
+ top="0"
+ height="22"
+ layout="topleft"
+ tool_tip ="Zoom back from selected media"
+ top_delta="-4"
+ width="21" >
+ <button.commit_callback
+ function="SelectedMediaCtrl.Unzoom" />
+ </button>
+ </layout_panel>
+ <layout_panel
+ name="right_bookend"
+ width="0"
+ mouse_opaque="false"
+ user_resize="false" />
+ </layout_stack>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_notes.xml b/indra/newview/skins/default/xui/en/panel_notes.xml
index ac100a2c06..cff7b51ce8 100644
--- a/indra/newview/skins/default/xui/en/panel_notes.xml
+++ b/indra/newview/skins/default/xui/en/panel_notes.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
follows="all"
- height="540"
+ height="533"
label="Notes &amp; Privacy"
layout="topleft"
left="0"
@@ -25,7 +25,7 @@
layout="topleft"
top="0"
left="0"
- height="475"
+ height="450"
width="313">
<scroll_container
color="DkGray2"
@@ -34,7 +34,7 @@
left="0"
name="profile_scroll"
opaque="true"
- height="475"
+ height="450"
width="313"
top="0">
<panel
@@ -46,35 +46,35 @@
width="303">
<text
follows="left|top"
- font="SansSerifBold"
+ font.style="BOLD"
height="16"
layout="topleft"
- left="10"
+ left="11"
name="status_message"
text_color="white"
- top="20"
+ top="10"
value="My private notes:"
width="293" />
<text_editor
follows="left|top"
height="120"
layout="topleft"
- left="10"
+ left="12"
max_length="1000"
name="notes_edit"
text_color="DkGray"
- top_pad="10"
- width="280"
+ top_pad="3"
+ width="288"
word_wrap="true" />
<text
follows="left|top"
- font="SansSerifBold"
+ font.style="BOLD"
height="16"
layout="topleft"
- left="10"
+ left="11"
name="status_message2"
text_color="white"
- top_pad="30"
+ top_pad="20"
value="Allow this person to:"
width="293" />
<check_box
@@ -82,7 +82,7 @@
height="16"
label="See my online status"
layout="topleft"
- left="20"
+ left="10"
name="status_check"
width="293" />
<check_box
@@ -90,7 +90,7 @@
height="16"
label="See me on the map"
layout="topleft"
- left="20"
+ left="10"
name="map_check"
width="293" />
<check_box
@@ -98,7 +98,7 @@
height="16"
label="Edit, delete or take my objects"
layout="topleft"
- left="20"
+ left="10"
name="objects_check"
width="293" />
</panel>
@@ -117,7 +117,7 @@
height="23"
label="Add Friend"
layout="topleft"
- left="0"
+ left="2"
mouse_opaque="false"
name="add_friend"
tool_tip="Offer friendship to the Resident"
@@ -142,7 +142,7 @@
tool_tip="Call this Resident"
left_pad="3"
top="5"
- width="45" />
+ width="46" />
<button
enabled="false"
follows="bottom|left"
diff --git a/indra/newview/skins/default/xui/en/panel_notification.xml b/indra/newview/skins/default/xui/en/panel_notification.xml
index 145a24b642..34738745eb 100644
--- a/indra/newview/skins/default/xui/en/panel_notification.xml
+++ b/indra/newview/skins/default/xui/en/panel_notification.xml
@@ -3,8 +3,8 @@
background_opaque="false"
border_visible="false"
background_visible="true"
- bg_alpha_color="0.3 0.3 0.3 0"
- bg_opaque_color="0.3 0.3 0.3 0"
+ bg_alpha_color="1 0.3 0.3 0"
+ bg_opaque_color="1 0.3 0.3 0"
label="notification_panel"
layout="topleft"
left="0"
@@ -83,12 +83,16 @@
<panel
background_visible="false"
follows="left|right|bottom"
- height="40"
+ height="30"
+ width="290"
label="control_panel"
layout="topleft"
- left="0"
- left_delta="-38"
+ left="10"
name="control_panel"
- top_pad="0">
+ top_pad="5">
+ <!--
+ Notes:
+ This panel holds buttons of notification. Change of its size can affect the layout of buttons.
+ -->
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_notifications_channel.xml b/indra/newview/skins/default/xui/en/panel_notifications_channel.xml
index 16593751f7..3143b0a40c 100644
--- a/indra/newview/skins/default/xui/en/panel_notifications_channel.xml
+++ b/indra/newview/skins/default/xui/en/panel_notifications_channel.xml
@@ -23,7 +23,7 @@
name="notifications_list"
sort_ascending="false"
sort_column="2"
- top="-78"
+ top="0"
user_resize="true"
width="100">
<scroll_list.columns
@@ -48,7 +48,7 @@
name="notification_rejects_list"
sort_ascending="false"
sort_column="2"
- top="-78"
+ top="0"
user_resize="true"
width="100">
<scroll_list.columns
diff --git a/indra/newview/skins/default/xui/en/panel_online_status.xml b/indra/newview/skins/default/xui/en/panel_online_status.xml
new file mode 100644
index 0000000000..14cb5fffee
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_online_status.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="false"
+ height="152"
+ label="friend_online_status"
+ layout="topleft"
+ left="0"
+ name="friend_online_status"
+ top="0"
+ width="305">
+ <avatar_icon
+ follows="top|left"
+ height="18"
+ image_name="Generic_Person"
+ layout="topleft"
+ left="3"
+ mouse_opaque="false"
+ name="avatar_icon"
+ top="10"
+ width="18" />
+ <text
+ font="SansSerifSmall"
+ follows="all"
+ height="137"
+ layout="topleft"
+ left_pad="5"
+ name="message"
+ text_color="white"
+ top="15"
+ use_ellipses="true"
+ value=""
+ width="285"
+ word_wrap="true"
+ max_length="350" />
+</panel> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/panel_online_status_toast.xml b/indra/newview/skins/default/xui/en/panel_online_status_toast.xml
new file mode 100644
index 0000000000..b1a7697e83
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_online_status_toast.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="false"
+ height="40"
+ label="friend_online_status"
+ layout="topleft"
+ left="0"
+ name="friend_online_status"
+ top="0"
+ width="220">
+ <avatar_icon
+ follows="top|left"
+ height="18"
+ image_name="Generic_Person"
+ layout="topleft"
+ left="3"
+ mouse_opaque="false"
+ name="avatar_icon"
+ top="10"
+ width="18" />
+ <text
+ font="SansSerifSmall"
+ follows="all"
+ height="13"
+ layout="topleft"
+ left_pad="5"
+ name="message"
+ text_color="white"
+ top="15"
+ use_ellipses="true"
+ value=""
+ width="189"
+ word_wrap="true"
+ max_length="350" />
+</panel> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
new file mode 100644
index 0000000000..1ed73e6c15
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
@@ -0,0 +1,520 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!-- Side tray Outfit Edit panel -->
+<panel
+ background_visible="true"
+ border="false"
+ height="600"
+ follows="all"
+ layout="topleft"
+ help_topic="edit_outfit"
+ left="0"
+ min_height="350"
+ name="outfit_edit"
+ top="0"
+ width="320">
+ <string
+ name="No Outfit"
+ value="No Outfit"/>
+ <string
+ name="unsaved_changes"
+ value="Unsaved Changes"/>
+ <string
+ name="now_editing"
+ value="Now Editing"/>
+ <string
+ name="folder_view_off"
+ value="Hierarchy_View_Disabled"
+ translate="false"/>
+ <string
+ name="folder_view_on"
+ value="Hierarchy_View_On"
+ translate="false"/>
+ <string
+ name="list_view_off"
+ value="List_View_Disabled"
+ translate="false"/>
+ <string
+ name="list_view_on"
+ value="List_View_On"
+ translate="false"/>
+
+ <panel.string
+ name="not_available">
+ (N\A)
+ </panel.string>
+ <panel.string
+ name="unknown">
+ (unknown)
+ </panel.string>
+
+ <!-- Wearables filtering strings -->
+ <string name="Filter.All" value="All"/>
+ <string name="Filter.Clothes/Body" value="Clothes/Body"/>
+ <string name="Filter.Objects" value="Objects"/>
+ <string name="Filter.Clothing" value="Clothing"/>
+ <string name="Filter.Bodyparts" value="Body parts"/>
+
+
+ <button
+ follows="top|left"
+ height="24"
+ image_hover_unselected="BackButton_Over"
+ image_pressed="BackButton_Press"
+ image_unselected="BackButton_Off"
+ layout="topleft"
+ name="back_btn"
+ left="5"
+ tab_stop="false"
+ top="1"
+ width="30" />
+ <text
+ follows="top|right"
+ font="SansSerifHugeBold"
+ height="26"
+ layout="topleft"
+ left_pad="10"
+ name="title"
+ text_color="LtGray"
+ top="0"
+ value="Edit Outfit"
+ use_ellipses="true"
+ width="275" />
+
+<!-- "HEADER WITH ICON, STATUS TEXT AND OUTFIT NAME" -->
+ <panel
+ background_visible="true"
+ bg_alpha_color="DkGray2"
+ bevel_style="none"
+ follows="top|left|right"
+ height="40"
+ layout="topleft"
+ left="6"
+ name="header_panel"
+ top_pad="5"
+ width="311">
+ <icon
+ follows="left|top"
+ height="31"
+ image_name="Shirt_Large"
+ left="2"
+ mouse_opaque="false"
+ name="outfit_icon"
+ top="2"
+ scale_image="true"
+ visible="true"
+ width="31" />
+ <panel
+ bevel_style="none"
+ follows="top|right"
+ height="37"
+ layout="topleft"
+ left_pad="5"
+ name="outfit_name_and_status"
+ top="2"
+ width="270">
+ <text
+ follows="top|left|right"
+ font="SansSerifSmallBold"
+ height="13"
+ layout="topleft"
+ name="status"
+ text_color="EmphasisColor"
+ top="2"
+ value="Now editing..."
+ use_ellipses="true"
+ width="245" />
+ <text
+ follows="bottom|left|right"
+ font="SansSerifLargeBold"
+ height="18"
+ layout="topleft"
+ name="curr_outfit_name"
+ text_color="LtGray"
+ top_pad="2"
+ value="[Current Outfit]"
+ use_ellipses="true"
+ width="245" />
+ <loading_indicator
+ follows="right|top"
+ height="24"
+ layout="topleft"
+ right="-2"
+ name="edit_outfit_loading_indicator"
+ top="6"
+ width="24" />
+ </panel>
+ </panel>
+
+
+<!-- LIST OF WEARABLES (CURRENT OUTFIT/ WEARABLES TO ADD) -->
+<!-- *NOTE: border_size is used to calculate space between layout panels and also to calculate resize bar's height.
+Required height for dragbar (icon in spec) is 10, so resizebar height should be 10 px.
+It is calculated as border_size + 2*UIResizeBarOverlap
+-->
+ <layout_stack
+ animate="true"
+ border_size="8"
+ clip="false"
+ default_tab_group="2"
+ follows="all"
+ height="465"
+ width="313"
+ layout="topleft"
+ orientation="vertical"
+ name="im_panels"
+ tab_group="1"
+ top_pad="5"
+ left="5">
+ <layout_panel
+ layout="topleft"
+ height="187"
+ min_height="100"
+ name="outfit_wearables_panel"
+ width="313"
+ auto_resize="true"
+ user_resize="true">
+
+ <layout_stack
+ animate="true"
+ border_size="0"
+ follows="all"
+ height="185"
+ width="313"
+ layout="topleft"
+ name="filter_panels"
+ top="0"
+ left="0">
+ <layout_panel
+ auto_resize="true"
+ background_visible="true"
+ bg_alpha_color="DkGray2"
+ layout="topleft"
+ height="154"
+ name="add_button_and_combobox"
+ width="311"
+ user_resize="false"
+ visible="true">
+
+ <!-- List containing items from the COF and Base outfit -->
+ <panel
+ background_visible="false"
+ class="cof_wearables"
+ filename="panel_cof_wearables.xml"
+ follows="all"
+ height="129"
+ layout="topleft"
+ left="1"
+ name="cof_wearables_list"
+ top="0"
+ width="311" />
+
+ <button
+ follows="left|bottom"
+ height="22"
+ image_pressed="PushButton_Press"
+ image_pressed_selected="PushButton_Selected_Press"
+ image_selected="PushButton_Selected_Press"
+ is_toggle="true"
+ label="Add More..."
+ layout="topleft"
+ left="2"
+ name="show_add_wearables_btn"
+ top_pad="2"
+ tool_tip="Open/Close"
+ width="125" />
+
+ <combo_box
+ follows="left|right|bottom"
+ height="22"
+ layout="topleft"
+ left_pad="5"
+ name="list_view_filter_combobox"
+ top_delta="0"
+ visible="false"
+ width="152"/>
+ <combo_box
+ follows="left|right|bottom"
+ height="22"
+ layout="topleft"
+ left_delta="0"
+ name="folder_view_filter_combobox"
+ top_delta="0"
+ visible="false"
+ width="152"/>
+
+ <button
+ follows="bottom|right"
+ height="22"
+ image_overlay="Search_Icon"
+ image_pressed="PushButton_Press"
+ image_pressed_selected="PushButton_Selected_Press"
+ image_selected="PushButton_Selected_Press"
+ is_toggle="true"
+ layout="topleft"
+ name="filter_button"
+ right="-5"
+ top_delta="0"
+ visible="false"
+ width="20" />
+ </layout_panel>
+
+ <layout_panel
+ auto_resize="false"
+ background_visible="true"
+ bg_alpha_color="DkGray2"
+ height="30"
+ name="filter_panel"
+ width="311"
+ visible="false"
+ user_resize="false">
+
+ <filter_editor
+ background_image="TextField_Search_Off"
+ enabled="true"
+ follows="left|right|top"
+ label="Filter Inventory Wearables"
+ layout="topleft"
+ left="5"
+ width="290"
+ height="25"
+ name="look_item_filter"
+ search_button_visible="true"
+ text_color="black"
+ visible="true"/>
+
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+
+
+ <layout_panel
+ background_visible="true"
+ bg_alpha_color="DkGray2"
+ auto_resize="true"
+ default_tab_group="3"
+ height="450"
+ min_height="210"
+ name="add_wearables_panel"
+ width="313"
+ tab_group="2"
+ user_resize="true"
+ visible="false">
+
+ <!-- this icon represent dragbar between layout panels.
+ This is a workaround implemented in EXT-7255 becouse of an issue with layout stack (EXT-7471) -->
+ <icon
+ follows="left|top|right"
+ height="10"
+ image_name="Dragbar"
+ left="0"
+ top_pad="-9"
+ width="313" />
+
+ <inventory_panel
+ allow_multi_select="true"
+ background_visible="false"
+ border="false"
+ follows="left|top|right|bottom"
+ height="442"
+ layout="topleft"
+ left="0"
+ mouse_opaque="false"
+ name="folder_view"
+ top_pad="5"
+ width="310"
+ visible="false"/>
+ <panel
+ name="filtered_wearables_panel"
+ background_opaque="true"
+ background_visible="false"
+ layout="topleft"
+ follows="left|top|right|bottom"
+ border="false"
+ height="449"
+ left="0"
+ mouse_opaque="false"
+ width="310"
+ top_delta="0"
+ visible="true">
+ <wearable_items_list
+ color="0.107 0.107 0.107 1"
+ name="list_view"
+ allow_select="true"
+ layout="topleft"
+ follows="all"
+ multi_select="true"
+ width="310"
+ height="449"
+ left="0"
+ top="0"/>
+ </panel>
+
+ </layout_panel>
+ </layout_stack>
+
+
+ <!-- BUTTON BAR -->
+ <panel
+ background_visible="true"
+ bevel_style="none"
+ follows="bottom|left|right"
+ height="27"
+ layout="topleft"
+ left="5"
+ name="no_add_wearables_button_bar"
+ top_pad="0"
+ width="313">
+ <button
+ follows="bottom|left"
+ height="25"
+ image_hover_unselected="Toolbar_Left_Over"
+ image_overlay="OptionsMenu_Off"
+ image_selected="Toolbar_Left_Selected"
+ image_unselected="Toolbar_Left_Off"
+ layout="topleft"
+ left="0"
+ name="gear_menu_btn"
+ top="1"
+ width="31" />
+ <icon
+ follows="bottom|left|right"
+ height="25"
+ image_name="Toolbar_Right_Off"
+ layout="topleft"
+ left_pad="1"
+ name="dummy_right_icon"
+ width="246" />
+ <button
+ follows="bottom|right"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="AddItem_Off"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ left_pad="0"
+ name="shop_btn"
+ top="1"
+ width="31" />
+ </panel>
+
+
+ <!-- BUTTON BAR - WEARABLES ADDING MODE -->
+ <panel
+ background_visible="true"
+ bevel_style="none"
+ follows="left|right|bottom"
+ height="27"
+ layout="topleft"
+ left="5"
+ name="add_wearables_button_bar"
+ top_delta="0"
+ visible="false"
+ width="313">
+ <button
+ follows="bottom|left"
+ height="25"
+ image_hover_unselected="Toolbar_Left_Over"
+ image_overlay="OptionsMenu_Off"
+ image_selected="Toolbar_Left_Selected"
+ image_unselected="Toolbar_Left_Off"
+ layout="topleft"
+ left="0"
+ name="wearables_gear_menu_btn"
+ top="1"
+ width="31" />
+ <button
+ follows="bottom|left"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Hierarchy_View_Disabled"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ is_toggle="true"
+ layout="topleft"
+ left_pad="1"
+ name="folder_view_btn"
+ top="1"
+ width="31" />
+ <button
+ follows="bottom|left"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="List_View_On"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ is_toggle="true"
+ layout="topleft"
+ left_pad="1"
+ name="list_view_btn"
+ top="1"
+ width="31" />
+ <button
+ follows="bottom|left"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="AddItem_Off"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ label=""
+ layout="topleft"
+ left_pad="1"
+ name="add_to_outfit_btn"
+ top="1"
+ width="31" />
+ <icon
+ follows="bottom|left|right"
+ height="25"
+ image_name="Toolbar_Right_Off"
+ layout="topleft"
+ left_pad="1"
+ name="dummy_right_icon"
+ width="184" >
+ </icon>
+ </panel>
+
+ <!-- SAVE AND REVERT BUTTONS -->
+ <panel
+ follows="left|right|bottom"
+ height="30"
+ layout="topleft"
+ left="4"
+ top_pad="2"
+ name="save_revert_button_bar"
+ width="300">
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Save"
+ left="0"
+ layout="topleft"
+ name="save_btn"
+ top="0"
+ width="155" />
+ <button
+ follows="bottom|left"
+ height="23"
+ name="save_flyout_btn"
+ label=""
+ layout="topleft"
+ left_pad="-20"
+ tab_stop="false"
+ top="0"
+ image_selected="SegmentedBtn_Right_Selected_Press"
+ image_unselected="SegmentedBtn_Right_Off"
+ image_pressed="SegmentedBtn_Right_Press"
+ image_pressed_selected="SegmentedBtn_Right_Selected_Press"
+ image_overlay="Arrow_Small_Up"
+ width="20"/>
+ <button
+ follows="bottom|left|right"
+ height="23"
+ left_pad="12"
+ label="Undo Changes"
+ layout="topleft"
+ name="revert_btn"
+ top="0"
+ tool_tip="Revert to last saved version"
+ width="147" />
+ </panel>
+</panel>
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 710ca733e0..a59070496e 100644
--- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
@@ -1,8 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel name="Outfits"
+ bg_alpha_color="DkGray"
+ bg_opaque_color="DkGray"
+ background_opaque="true"
background_visible="true"
follows="all"
- height="570"
+ height="575"
label="Things"
layout="topleft"
min_height="350"
@@ -11,29 +14,27 @@
border="false">
<tab_container
follows="all"
- height="500"
+ height="509"
layout="topleft"
- left="10"
+ left="7"
name="appearance_tabs"
tab_min_width="140"
tab_height="30"
tab_position="top"
halign="center"
- width="313">
- <inventory_panel
+ top="8"
+ width="312">
+ <panel
+ class="outfits_list"
+ filename="panel_outfits_list.xml"
+ height="490"
+ name="outfitslist_tab"
background_visible="true"
- background_opaque="true"
- label="MY OUTFITS"
help_topic="my_outfits_tab"
- allow_multi_select="true"
follows="all"
- border="false"
- left="0"
- top="0"
- width="314"
- mouse_opaque="true"
- name="outfitslist_tab"
- start_folder="My Outfits" />
+ label="MY OUTFITS"
+ layout="topleft"
+ width="315" />
<inventory_panel
follows="all"
background_visible="true"
@@ -47,71 +48,86 @@
mouse_opaque="true"
name="cof_tab"
start_folder="Current Outfit"
- width="313" />
+ use_label_suffix="true"
+ width="315" />
</tab_container>
- <panel
- background_visible="true"
- follows="bottom|left"
- height="50"
+ <panel
+ background_visible="true"
+ follows="bottom|left|right"
+ height="57"
layout="topleft"
- left="0"
+ left="9"
+ top_pad="-1"
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="Save Outfit"
+ width="310">
+ <button
+ follows="bottom|left"
+ tool_tip="Show additional options"
+ height="25"
+ image_hover_unselected="Toolbar_Left_Over"
+ image_overlay="OptionsMenu_Off"
+ image_selected="Toolbar_Left_Selected"
+ image_unselected="Toolbar_Left_Off"
+ layout="topleft"
+ left="1"
+ name="options_gear_btn"
+ top="1"
+ width="31" />
+ <icon
+ follows="bottom|left|right"
+ height="25"
+ image_name="Toolbar_Middle_Off"
layout="topleft"
- name="make_outfit_btn"
- tool_tip="Save appearance as an outfit"
- top="26"
- left='10'
- width="120" />
+ left_pad="1"
+ name="dummy_icon"
+ width="241"
+ />
+
+ <dnd_button
+ follows="bottom|right"
+ height="25"
+ image_hover_unselected="Toolbar_Right_Over"
+ image_overlay="TrashItem_Off"
+ image_selected="Toolbar_Right_Selected"
+ image_unselected="Toolbar_Right_Off"
+ layout="topleft"
+ left_pad="1"
+ name="trash_btn"
+ tool_tip="Delete selected outfit"
+ width="31"/>
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Save As"
+ left="0"
+ layout="topleft"
+ name="save_btn"
+ top_pad="6"
+ width="155" />
+ <button
+ follows="bottom|left"
+ height="23"
+ name="save_flyout_btn"
+ label=""
+ layout="topleft"
+ left_pad="-20"
+ tab_stop="false"
+ image_selected="SegmentedBtn_Right_Selected_Press"
+ image_unselected="SegmentedBtn_Right_Off"
+ image_pressed="SegmentedBtn_Right_Press"
+ image_pressed_selected="SegmentedBtn_Right_Selected_Press"
+ image_overlay="Arrow_Small_Up"
+ width="20"/>
<button
- follows="bottom|right"
+ follows="bottom|left|right"
height="23"
label="Wear"
layout="topleft"
name="wear_btn"
- right="-10"
- left_pad="10"
- top="26"
+ left_pad="3"
tool_tip="Wear selected outfit"
- width="120" />
- <button
- follows="bottom|left"
- height="23"
- label="M"
- layout="topleft"
- right="-140"
- name="look_edit_btn"
- top="26"
- visible="false"
- width="20" />
+ width="152" />
</panel>
+
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_outfits_list.xml b/indra/newview/skins/default/xui/en/panel_outfits_list.xml
new file mode 100644
index 0000000000..d0c44c4328
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_outfits_list.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ bg_alpha_color="DkGray"
+ border="false"
+ follows="all"
+ height="400"
+ name="Outfits"
+ layout="topleft"
+ left="0"
+ top="0"
+ width="313">
+ <accordion
+ background_visible="true"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
+ no_matched_tabs_text.value="Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search]."
+ no_visible_tabs_text.value="There are no any outfits. Try [secondlife:///app/search/all/ Search]."
+ follows="all"
+ height="400"
+ layout="topleft"
+ left="3"
+ name="outfits_accordion"
+ top="0"
+ width="307">
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index 447ac1b123..b79ef1e287 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -1,22 +1,28 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!-- Side tray panel -->
<panel
-background_visible="true"
+ default_tab_group="1"
follows="all"
- height="575"
+ height="449"
label="People"
layout="topleft"
+ left="0"
min_height="350"
name="people_panel"
top="0"
- left="0"
width="333">
<string
- name="no_people"
- value="No people" />
+ name="no_recent_people"
+ value="No recent people. Looking for people to hang out with? Try [secondlife:///app/search/people Search] or the [secondlife:///app/worldmap World Map]." />
+ <string
+ name="no_filtered_recent_people"
+ value="Didn't find what you're looking for? Try [secondlife:///app/search/people/[SEARCH_TERM] Search]." />
<string
name="no_one_near"
- value="No one near" />
+ value="No one nearby. Looking for people to hang out with? Try [secondlife:///app/search/people Search] or the [secondlife:///app/worldmap World Map]." />
+ <string
+ name="no_one_filtered_near"
+ value="Didn't find what you're looking for? Try [secondlife:///app/search/people/[SEARCH_TERM] Search]." />
<string
name="no_friends_online"
value="No friends online" />
@@ -24,37 +30,62 @@ background_visible="true"
name="no_friends"
value="No friends" />
<string
+ name="no_friends_msg">
+ Find friends using [secondlife:///app/search/people Search] or right-click on a Resident to add them as a friend.
+Looking for people to hang out with? Try the [secondlife:///app/worldmap World Map].
+ </string>
+ <string
+ name="no_filtered_friends_msg">
+ Didn't find what you're looking for? Try [secondlife:///app/search/people/[SEARCH_TERM] Search].
+ </string>
+ <string
name="people_filter_label"
value="Filter People" />
<string
name="groups_filter_label"
value="Filter Groups" />
+ <!--
+ *WORKAROUND: for group_list.no_items_msg & group_list.no_filtered_items_msg attributes.
+ They are not defined as translatable in VLT. See EXT-5931
+ -->
+ <string
+ name="no_filtered_groups_msg"
+ value="Didn't find what you're looking for? Try [secondlife:///app/search/groups/[SEARCH_TERM] Search]." />
+ <string
+ name="no_groups_msg"
+ value="Looking for Groups to join? Try [secondlife:///app/search/groups Search]." />
<filter_editor
follows="left|top|right"
height="23"
layout="topleft"
- left="15"
+ left="10"
label="Filter"
max_length="300"
name="filter_input"
text_color="Black"
+ text_pad_left="10"
top="3"
width="303" />
<tab_container
follows="all"
- height="500"
+ height="383"
layout="topleft"
- left="6"
+ left="5"
name="tabs"
+ tab_group="1"
tab_min_width="70"
tab_height="30"
tab_position="top"
top_pad="10"
halign="center"
- width="313">
- <panel
+ width="317">
+ <panel
+ background_opaque="true"
+ background_visible="true"
+ bg_alpha_color="DkGray"
+ bg_opaque_color="DkGray"
follows="all"
- height="500"
+ height="383"
label="NEARBY"
layout="topleft"
left="0"
@@ -64,55 +95,73 @@ background_visible="true"
width="313">
<avatar_list
allow_select="true"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
follows="all"
- height="470"
+ height="356"
ignore_online_status="true"
layout="topleft"
- left="0"
+ left="3"
multi_select="true"
name="avatar_list"
top="0"
- width="313" />
+ width="307" />
<panel
+ background_visible="true"
follows="left|right|bottom"
- height="30"
+ height="27"
label="bottom_panel"
layout="topleft"
- left="0"
+ left="3"
name="bottom_panel"
+ top_pad="0"
width="313">
<button
follows="bottom|left"
- tool_tip="Options"
- height="18"
- image_disabled="OptionsMenu_Disabled"
- image_selected="OptionsMenu_Press"
- image_unselected="OptionsMenu_Off"
+ height="25"
+ image_hover_unselected="Toolbar_Left_Over"
+ image_overlay="OptionsMenu_Off"
+ image_selected="Toolbar_Left_Selected"
+ image_unselected="Toolbar_Left_Off"
layout="topleft"
- left="10"
+ left="0"
name="nearby_view_sort_btn"
- top="5"
- width="18" />
+ tool_tip="Options"
+ top="1"
+ width="31" />
<button
follows="bottom|left"
- height="18"
- image_selected="AddItem_Press"
- image_unselected="AddItem_Off"
- image_disabled="AddItem_Disabled"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="AddItem_Off"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
layout="topleft"
- left_pad="5"
+ left_pad="1"
name="add_friend_btn"
- top_delta="0"
tool_tip="Add selected Resident to your friends List"
- width="18">
+ width="31">
<commit_callback
function="People.addFriend" />
</button>
+ <icon
+ follows="bottom|left"
+ height="25"
+ image_name="Toolbar_Right_Off"
+ layout="topleft"
+ left_pad="1"
+ name="dummy_icon"
+ width="241"
+ />
</panel>
</panel>
<panel
+ background_opaque="true"
+ background_visible="true"
+ bg_alpha_color="DkGray"
+ bg_opaque_color="DkGray"
follows="all"
- height="500"
+ height="383"
label="MY FRIENDS"
layout="topleft"
left="0"
@@ -121,108 +170,123 @@ background_visible="true"
top="0"
width="313">
<accordion
+ background_visible="true"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
follows="all"
- height="470"
+ height="356"
layout="topleft"
- left="0"
+ left="3"
name="friends_accordion"
top="0"
- width="313">
+ width="307">
<accordion_tab
layout="topleft"
- height="235"
+ height="172"
min_height="150"
name="tab_online"
title="Online">
<avatar_list
allow_select="true"
follows="all"
- height="235"
+ height="172"
layout="topleft"
left="0"
multi_select="true"
name="avatars_online"
top="0"
- width="313" />
+ width="307" />
</accordion_tab>
<accordion_tab
layout="topleft"
- height="235"
+ height="173"
name="tab_all"
title="All">
<avatar_list
allow_select="true"
follows="all"
- height="235"
+ height="173"
layout="topleft"
left="0"
multi_select="true"
name="avatars_all"
top="0"
- width="313" />
+ width="307" />
</accordion_tab>
</accordion>
- <text
- follows="all"
- height="450"
- left="10"
- name="no_friends_msg"
- top="10"
- width="293"
- wrap="true">
- To add friends try [secondlife:///app/search/people global search] or click on a user to add them as a friend.
-If you're looking for people to hang out with, [secondlife:///app/worldmap try the Map].
- </text>
<panel
+ background_visible="true"
follows="left|right|bottom"
- height="30"
+ height="27"
label="bottom_panel"
layout="topleft"
- left="0"
+ left="3"
name="bottom_panel"
+ top_pad="0"
width="313">
<button
follows="bottom|left"
tool_tip="Options"
- height="18"
- image_disabled="OptionsMenu_Disabled"
- image_selected="OptionsMenu_Press"
- image_unselected="OptionsMenu_Off"
+ height="25"
+ image_hover_unselected="Toolbar_Left_Over"
+ image_overlay="OptionsMenu_Off"
+ image_selected="Toolbar_Left_Selected"
+ image_unselected="Toolbar_Left_Off"
layout="topleft"
- left="10"
+ left="0"
name="friends_viewsort_btn"
- top="5"
- width="18" />
+ top="1"
+ width="31" />
<button
follows="bottom|left"
- height="18"
- image_selected="AddItem_Press"
- image_unselected="AddItem_Off"
- image_disabled="AddItem_Disabled"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="AddItem_Off"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
layout="topleft"
- left_pad="5"
+ left_pad="1"
name="add_btn"
tool_tip="Offer friendship to a Resident"
- top_delta="0"
- width="18" />
+ width="31" />
+ <icon
+ follows="bottom|left"
+ height="25"
+ image_name="Toolbar_Middle_Off"
+ layout="topleft"
+ left_pad="1"
+ name="dummy_icon"
+ width="209"
+ />
<button
follows="bottom|left"
- height="18"
- image_selected="TrashItem_Press"
- image_unselected="TrashItem_Off"
- image_disabled="TrashItem_Disabled"
+ height="25"
+ image_hover_unselected="Toolbar_Right_Over"
+ image_overlay="TrashItem_Off"
+ image_selected="Toolbar_Right_Selected"
+ image_unselected="Toolbar_Right_Off"
layout="topleft"
- left_pad="10"
- right="-10"
+ left_pad="1"
name="del_btn"
tool_tip="Remove selected person from your Friends list"
- top_delta="0"
- width="18" />
+ width="31" />
</panel>
+ <text
+ follows="all"
+ height="450"
+ left="13"
+ name="no_friends_help_text"
+ top="10"
+ width="293"
+ wrap="true" />
</panel>
<panel
+ background_opaque="true"
+ background_visible="true"
+ bg_alpha_color="DkGray"
+ bg_opaque_color="DkGray"
follows="all"
- height="500"
+ height="383"
label="MY GROUPS"
layout="topleft"
left="0"
@@ -230,66 +294,89 @@ If you're looking for people to hang out with, [secondlife:///app/worldmap try t
name="groups_panel"
top="0"
width="313">
+ <!--
+ *NOTE: no_groups_msg & group_list attributes are not defined as translatable in VLT. See EXT-5931
+ Values are set from appropriate strings at the top of file via LLPeoplePanel::postBuild()
+ -->
<group_list
+ allow_select="true"
+ background_visible="true"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
follows="all"
- height="470"
+ height="356"
layout="topleft"
- left="0"
+ left="3"
name="group_list"
- no_filtered_groups_msg="No groups"
- no_groups_msg="[secondlife:///app/search/groups Trying searching for some groups to join.]"
+ no_filtered_groups_msg="[secondlife:///app/search/groups Try finding the group in search?]"
+ no_groups_msg="[secondlife:///app/search/groups Try searching for some groups to join.]"
top="0"
- width="313" />
+ width="307" />
<panel
- top_pad="0"
+ background_visible="true"
follows="left|right|bottom"
- height="30"
+ height="27"
label="bottom_panel"
layout="topleft"
left="0"
name="bottom_panel"
+ top_pad="0"
width="313">
<button
follows="bottom|left"
tool_tip="Options"
- height="18"
- image_disabled="OptionsMenu_Disabled"
- image_selected="OptionsMenu_Press"
- image_unselected="OptionsMenu_Off"
+ height="25"
+ image_hover_unselected="Toolbar_Left_Over"
+ image_overlay="OptionsMenu_Off"
+ image_selected="Toolbar_Left_Selected"
+ image_unselected="Toolbar_Left_Off"
layout="topleft"
- left="10"
+ left="3"
name="groups_viewsort_btn"
- top="7"
- width="18" />
+ top="1"
+ width="31" />
<button
follows="bottom|left"
- height="18"
- image_selected="AddItem_Press"
- image_unselected="AddItem_Off"
- image_disabled="AddItem_Disabled"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="AddItem_Off"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
layout="topleft"
- left_pad="5"
+ left_pad="1"
name="plus_btn"
tool_tip="Join group/Create new group"
- top_delta="0"
- width="18" />
+ width="31" />
<button
follows="bottom|left"
- height="10"
- image_hover_selected="Activate_Checkmark"
- image_selected="Activate_Checkmark"
- image_unselected="Activate_Checkmark"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Activate_Checkmark"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
layout="topleft"
- left_pad="24"
+ left_pad="1"
name="activate_btn"
tool_tip="Activate selected group"
- top_delta="5"
- width="10" />
+ width="31" />
+ <icon
+ follows="bottom|left"
+ height="25"
+ image_name="Toolbar_Right_Off"
+ layout="topleft"
+ left_pad="1"
+ name="dummy_icon"
+ width="209"
+ />
</panel>
</panel>
<panel
+ background_opaque="true"
+ background_visible="true"
+ bg_alpha_color="DkGray"
+ bg_opaque_color="DkGray"
follows="all"
- height="500"
+ height="383"
label="RECENT"
layout="topleft"
left="0"
@@ -299,139 +386,148 @@ If you're looking for people to hang out with, [secondlife:///app/worldmap try t
width="313">
<avatar_list
allow_select="true"
+ background_visible="true"
+ bg_alpha_color="DkGray2"
+ bg_opaque_color="DkGray2"
follows="all"
- height="470"
+ height="356"
layout="topleft"
- left="0"
+ left="3"
multi_select="true"
name="avatar_list"
show_last_interaction_time="true"
top="0"
- width="313" />
+ width="307" />
<panel
- top_pad="0"
+ background_visible="true"
follows="left|right|bottom"
- height="30"
+ height="27"
label="bottom_panel"
layout="topleft"
left="0"
name="bottom_panel"
+ top_pad="0"
width="313">
<button
follows="bottom|left"
tool_tip="Options"
- height="18"
- image_disabled="OptionsMenu_Disabled"
- image_selected="OptionsMenu_Press"
- image_unselected="OptionsMenu_Off"
+ height="25"
+ image_hover_unselected="Toolbar_Left_Over"
+ image_overlay="OptionsMenu_Off"
+ image_selected="Toolbar_Left_Selected"
+ image_unselected="Toolbar_Left_Off"
layout="topleft"
- left="10"
+ left="3"
name="recent_viewsort_btn"
- top="7"
- width="18" />
+ top="1"
+ width="31" />
<button
follows="bottom|left"
- height="18"
- image_selected="AddItem_Press"
- image_unselected="AddItem_Off"
- image_disabled="AddItem_Disabled"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="AddItem_Off"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
layout="topleft"
- left_pad="5"
+ left_pad="1"
name="add_friend_btn"
- top_delta="0"
tool_tip="Add selected Resident to your friends List"
- width="18">
+ width="31">
<commit_callback
function="People.addFriend" />
</button>
+ <icon
+ follows="bottom|left"
+ height="25"
+ image_name="Toolbar_Right_Off"
+ layout="topleft"
+ left_pad="1"
+ name="dummy_icon"
+ width="241"
+ />
</panel>
</panel>
</tab_container>
<panel
follows="bottom|left"
- height="35"
+ height="23"
layout="topleft"
- left="10"
+ left="8"
+ top_pad="4"
name="button_bar"
width="313">
<button
follows="bottom|left"
- top="4"
- left="0"
height="23"
label="Profile"
layout="topleft"
name="view_profile_btn"
tool_tip="Show picture, groups, and other Residents information"
- width="70" />
+ top="0"
+ width="67" />
<button
follows="bottom|left"
- top="4"
- left_pad="2"
+ left_pad="3"
height="23"
label="IM"
layout="topleft"
name="im_btn"
tool_tip="Open instant message session"
- width="45" />
+ width="40" />
<button
follows="bottom|left"
- top="4"
- left_pad="2"
+ left_pad="3"
height="23"
label="Call"
layout="topleft"
name="call_btn"
tool_tip="Call this Resident"
- width="50" />
+ width="51" />
<button
- follows="left|top"
- top="4"
- left_pad="2"
+ follows="bottom|left"
+ left_pad="3"
height="23"
label="Share"
layout="topleft"
name="share_btn"
- width="60" />
+ tool_tip="Share an inventory item"
+ width="65" />
<button
follows="bottom|left"
- top="4"
- left_pad="2"
+ left_pad="3"
height="23"
label="Teleport"
layout="topleft"
name="teleport_btn"
tool_tip="Offer teleport"
- width="75" />
+ width="76" />
<button
follows="bottom|left"
- top="4"
left="0"
+ top_delta="0"
height="23"
label="Group Profile"
layout="topleft"
name="group_info_btn"
tool_tip="Show group information"
- width="102" />
+ width="107" />
<button
follows="bottom|left"
- top="4"
- left_pad="2"
+ left_pad="3"
height="23"
label="Group Chat"
layout="topleft"
name="chat_btn"
tool_tip="Open chat session"
- width="102" />
+ width="100" />
<button
follows="bottom|left"
- top="4"
- left_pad="2"
+ left_pad="3"
height="23"
label="Group Call"
layout="topleft"
name="group_call_btn"
tool_tip="Call this group"
- width="102" />
+ width="95" />
</panel>
</panel>
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 375f369ba7..1d01bcb8a5 100644
--- a/indra/newview/skins/default/xui/en/panel_pick_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_pick_info.xml
@@ -12,23 +12,25 @@
width="333">
<button
follows="top|right"
- height="23"
- image_overlay="BackArrow_Off"
+ height="24"
+ image_hover_unselected="BackButton_Over"
+ image_pressed="BackButton_Press"
+ image_unselected="BackButton_Off"
layout="topleft"
name="back_btn"
left="10"
tab_stop="false"
top="2"
- width="23" />
+ width="30" />
<text
follows="top|left|right"
font="SansSerifHugeBold"
height="26"
layout="topleft"
- left_pad="10"
+ left_pad="4"
name="title"
- text_color="white"
- top="0"
+ text_color="LtGray"
+ top="2"
value="Pick Info"
use_ellipses="true"
width="275" />
@@ -36,12 +38,12 @@
color="DkGray2"
opaque="true"
follows="all"
- height="500"
+ height="503"
layout="topleft"
- left="10"
- top_pad="5"
+ left="8"
+ top_pad="10"
name="profile_scroll"
- width="313">
+ width="312">
<panel
name="scroll_content_panel"
follows="left|top|right"
@@ -57,10 +59,10 @@
follows="left|top|right"
height="197"
layout="topleft"
- left="10"
+ left="11"
name="pick_snapshot"
- top="20"
- width="280" />
+ top="10"
+ width="272" />
<text_editor
allow_scroll="false"
bg_visible="false"
@@ -115,8 +117,8 @@
follows="left|right|bottom"
height="35"
layout="topleft"
- top_pad="8"
- left="10"
+ top_pad="5"
+ left="8"
name="buttons">
<button
follows="bottom|left"
@@ -126,24 +128,22 @@
left="0"
name="teleport_btn"
top="0"
- width="90" />
+ width="101" />
<button
follows="bottom|left"
height="23"
label="Map"
layout="topleft"
- left_pad="10"
+ left_pad="3"
name="show_on_map_btn"
- top="0"
- width="90" />
+ width="100" />
<button
follows="bottom|left"
height="23"
label="Edit"
layout="topleft"
- right="-1"
name="edit_btn"
- top="0"
- width="90" />
+ left_pad="3"
+ width="101" />
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml
index e62c1278f9..41651edaa0 100644
--- a/indra/newview/skins/default/xui/en/panel_pick_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_pick_list_item.xml
@@ -64,7 +64,9 @@
layout="topleft"
left="103"
name="picture_descr"
- textbox.mouse_opaque="false"
+ textbox.max_length="1024"
+ textbox.label="More"
+ textbox.show_context_menu="false"
top_pad="0"
width="178"
word_wrap="true" />
@@ -76,6 +78,6 @@
left_pad="5"
right="-8"
name="info_chevron"
- top_delta="15"
+ top_delta="24"
width="20" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml
index d31f4d039f..0093a08e15 100644
--- a/indra/newview/skins/default/xui/en/panel_picks.xml
+++ b/indra/newview/skins/default/xui/en/panel_picks.xml
@@ -1,7 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
+bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
follows="all"
- height="540"
+ height="548"
label="Picks"
layout="topleft"
left="0"
@@ -21,12 +24,13 @@
layout="topleft"
left="6"
name="picks_panel_text"
+ wrap="true"
top="10"
width="313"/>
<accordion
fit_parent="true"
follows="all"
- height="465"
+ height="470"
layout="topleft"
left="0"
name="accordion"
@@ -70,17 +74,19 @@
</accordion_tab>
</accordion>
<panel
- background_visible="true"
+bg_opaque_color="DkGray2"
+ background_visible="true"
+ background_opaque="true"
bevel_style="none"
enabled="false"
auto_resize="false"
follows="bottom"
- left="0"
- height="18"
+ left="1"
+ height="27"
label="bottom_panel"
layout="topleft"
name="edit_panel"
- top_pad="0"
+ top_pad="-2"
width="313">
<button
enabled="false"
@@ -90,9 +96,9 @@
image_unselected="OptionsMenu_Off"
image_disabled="OptionsMenu_Disabled"
layout="topleft"
- left="0"
+ left="10"
name="gear_menu_btn"
- top="5"
+ top="9"
width="18" />
<button
follows="bottom|left"
@@ -104,7 +110,7 @@
left_pad="15"
name="new_btn"
tool_tip="Create a new pick or classified at the current location"
- top="5"
+ top="9"
width="18" />
<button
follows="bottom|right"
@@ -115,14 +121,17 @@
layout="topleft"
name="trash_btn"
right="-10"
- top="5"
+ top="9"
width="18" />
</panel>
<panel
+ bg_opaque_color="DkGray"
+ background_visible="true"
+ background_opaque="true"
layout="topleft"
left="0"
- height="30"
- top_pad="10"
+ height="40"
+ top="502"
name="buttons_cucks"
width="313">
<button
@@ -131,35 +140,33 @@
height="23"
label="Info"
layout="topleft"
- left="5"
+ left="2"
name="info_btn"
tab_stop="false"
tool_tip="Show pick information"
- top="0"
- width="55" />
+ top="5"
+ width="95" />
<button
enabled="false"
follows="bottom|left"
height="23"
label="Teleport"
layout="topleft"
- left_pad="5"
+ left_pad="3"
name="teleport_btn"
tab_stop="false"
tool_tip="Teleport to the corresponding area"
- top="0"
- width="77" />
+ width="117" />
<button
enabled="false"
follows="bottom|left"
height="23"
label="Map"
layout="topleft"
- left_pad="5"
+ left_pad="3"
name="show_on_map_btn"
tab_stop="false"
tool_tip="Show the corresponding area on the World Map"
- top="0"
- width="50" />
+ width="90" />
</panel>
</panel>
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 94c9b2de01..55e0184282 100644
--- a/indra/newview/skins/default/xui/en/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml
@@ -2,13 +2,13 @@
<panel
background_visible="true"
follows="all"
- height="570"
+ height="610"
layout="topleft"
left="0"
min_height="350"
name="place_profile"
top="20"
- width="330">
+ width="333">
<string
name="on"
value="On" />
@@ -95,60 +95,77 @@
<!-- Texture names for parcel permissions icons -->
<string
name="icon_PG"
+ translate="false"
value="Parcel_PG_Dark" />
<string
name="icon_M"
+ translate="false"
value="Parcel_M_Dark" />
<string
name="icon_R"
+ translate="false"
value="Parcel_R_Dark" />
<string
name="icon_Voice"
+ translate="false"
value="Parcel_Voice_Dark" />
<string
name="icon_VoiceNo"
+ translate="false"
value="Parcel_VoiceNo_Dark" />
<string
name="icon_Fly"
+ translate="false"
value="Parcel_Fly_Dark" />
<string
name="icon_FlyNo"
+ translate="false"
value="Parcel_FlyNo_Dark" />
<string
name="icon_Push"
+ translate="false"
value="Parcel_Push_Dark" />
<string
name="icon_PushNo"
+ translate="false"
value="Parcel_PushNo_Dark" />
<string
name="icon_Build"
+ translate="false"
value="Parcel_Build_Dark" />
<string
name="icon_BuildNo"
+ translate="false"
value="Parcel_BuildNo_Dark" />
<string
name="icon_Scripts"
+ translate="false"
value="Parcel_Scripts_Dark" />
<string
name="icon_ScriptsNo"
+ translate="false"
value="Parcel_ScriptsNo_Dark" />
<string
name="icon_Damage"
+ translate="false"
value="Parcel_Damage_Dark" />
<string
name="icon_DamageNo"
+ translate="false"
value="Parcel_DamageNo_Dark" />
<button
follows="top|right"
- height="23"
- image_overlay="BackArrow_Off"
+ height="24"
+ image_hover_unselected="BackButton_Over"
+ image_pressed="BackButton_Press"
+ image_unselected="BackButton_Off"
layout="topleft"
- left="10"
+ left="8"
name="back_btn"
tool_tip="Back"
tab_stop="false"
- top="0"
- width="23" />
+ top="4"
+ width="30" />
<text
follows="top|left|right"
font="SansSerifHugeBold"
@@ -157,36 +174,36 @@
left_pad="10"
name="title"
text_color="LtGray"
- top="0"
+ top="4"
use_ellipses="true"
value="Place Profile"
- width="275" />
+ width="280" />
<scroll_container
color="DkGray2"
follows="all"
- height="533"
+ height="572"
layout="topleft"
- left="10"
+ left="9"
name="place_scroll"
opaque="true"
- top_pad="5"
- width="313">
+ top_pad="10"
+ width="310">
<panel
bg_alpha_color="DkGray2"
follows="left|top|right"
- height="533"
+ height="580"
layout="topleft"
left="0"
min_height="300"
name="scrolling_panel"
top="0"
- width="313">
+ width="310">
<texture_picker
enabled="false"
- follows="top|left"
- height="190"
+ follows="left|top|right"
+ height="197"
layout="topleft"
- left="10"
+ left="11"
name="logo"
top="10"
width="290" />
@@ -275,6 +292,7 @@
layout="topleft"
left="5"
name="description"
+ textbox.label="More"
top_pad="10"
value="Du waltz die spritz"
width="300" />
@@ -317,22 +335,27 @@
value="unknown"
width="268" />
<accordion
+ fit_parent="true"
follows="all"
- height="230"
+ height="268"
layout="topleft"
+ single_expansion="true"
left="0"
name="advanced_info_accordion"
- top_pad="10"
+ top_pad="5"
width="313">
<accordion_tab
+ fit_panel="false"
+ height="175"
layout="topleft"
name="parcel_characteristics_tab"
title="Parcel">
<panel
follows="all"
- height="160"
+ height="175"
layout="topleft"
left="0"
+ name="parcel_characteristics_panel"
top="0"
width="275">
<icon
@@ -351,7 +374,7 @@
left_pad="12"
name="rating_label"
value="Rating:"
- width="60" />
+ width="90" />
<text
follows="left|right|top"
height="16"
@@ -378,7 +401,7 @@
name="voice_label"
top_delta="0"
value="Voice:"
- width="60" />
+ width="90" />
<text
follows="left|right|top"
height="18"
@@ -404,7 +427,7 @@
left_pad="8"
name="fly_label"
value="Fly:"
- width="60" />
+ width="90" />
<text
follows="left|right|top"
height="16"
@@ -430,7 +453,7 @@
left_pad="8"
name="push_label"
value="Push:"
- width="60" />
+ width="90" />
<text
follows="left|right|top"
height="14"
@@ -456,7 +479,7 @@
left_pad="8"
name="build_label"
value="Build:"
- width="60" />
+ width="90" />
<text
follows="left|right|top"
height="15"
@@ -482,7 +505,7 @@
left_pad="8"
name="scripts_label"
value="Scripts:"
- width="60" />
+ width="90" />
<text
follows="left|right|top"
height="14"
@@ -508,7 +531,7 @@
left_pad="8"
name="damage_label"
value="Damage:"
- width="60" />
+ width="90" />
<text
follows="left|right|top"
height="14"
@@ -526,8 +549,8 @@
name="about_land_btn"
right="-5"
tab_stop="false"
- top="138"
- width="90">
+ top_pad="2"
+ width="140">
<click_callback
function="Floater.Show"
parameter="about_land" />
@@ -536,6 +559,8 @@
</accordion_tab>
<accordion_tab
expanded="false"
+ fit_panel="false"
+ height="125"
layout="topleft"
name="region_information_tab"
title="Region">
@@ -544,6 +569,7 @@
height="125"
layout="topleft"
left="0"
+ name="region_information_panel"
top="0"
width="290">
<text
@@ -653,7 +679,8 @@
name="region_info_btn"
right="-5"
tab_stop="false"
- width="105">
+ top_pad="2"
+ width="180">
<click_callback
function="Floater.Show"
parameter="region_info" />
@@ -662,14 +689,17 @@
</accordion_tab>
<accordion_tab
expanded="false"
+ fit_panel="false"
+ height="180"
layout="topleft"
name="estate_information_tab"
title="Estate">
<panel
follows="all"
- height="189"
+ height="180"
layout="topleft"
left="0"
+ name="estate_information_panel"
top="0"
width="290">
<text
@@ -736,7 +766,6 @@
bg_focus_color="DkGray2"
bg_readonly_color="DkGray2"
follows="left|top|right"
- handle_edit_keys_directly="true"
height="90"
layout="topleft"
left="10"
@@ -750,14 +779,17 @@
</accordion_tab>
<accordion_tab
expanded="false"
+ fit_panel="false"
+ height="290"
layout="topleft"
name="sales_tab"
title="For Sale">
<panel
follows="all"
- height="300"
+ height="290"
layout="topleft"
left="0"
+ name="sales_panel"
top="0"
width="290">
<text
diff --git a/indra/newview/skins/default/xui/en/panel_places.xml b/indra/newview/skins/default/xui/en/panel_places.xml
index c4e4b9aa9b..638e190e8f 100644
--- a/indra/newview/skins/default/xui/en/panel_places.xml
+++ b/indra/newview/skins/default/xui/en/panel_places.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
background_visible="true"
+ default_tab_group="1"
follows="all"
height="570"
label="Places"
@@ -17,12 +18,12 @@ background_visible="true"
name="teleport_history_tab_title"
value="TELEPORT HISTORY" />
<filter_editor
- text_pad_left="14"
+ text_pad_left="10"
follows="left|top|right"
font="SansSerifSmall"
height="23"
layout="topleft"
- left="15"
+ left="10"
label="Filter My Places"
max_length="300"
name="Filter"
@@ -31,15 +32,17 @@ background_visible="true"
<tab_container
follows="all"
halign="center"
- height="500"
+ height="503"
layout="topleft"
- left="10"
+ left="6"
name="Places Tabs"
tab_min_width="80"
+ tab_max_width="157"
tab_height="30"
+ tab_group="1"
tab_position="top"
top_pad="10"
- width="313" />
+ width="315" />
<panel
class="panel_place_profile"
filename="panel_place_profile.xml"
@@ -51,7 +54,7 @@ background_visible="true"
name="panel_place_profile"
top="5"
visible="false"
- width="313" />
+ width="315" />
<panel
class="panel_landmark_info"
filename="panel_landmark_info.xml"
@@ -63,13 +66,13 @@ background_visible="true"
name="panel_landmark_info"
top="5"
visible="false"
- width="313" />
+ width="315" />
<panel
- height="19"
+ height="23"
layout="topleft"
- left="0"
+ left="4"
name="button_panel"
- width="313">
+ width="315">
<button
follows="bottom|left"
height="23"
@@ -78,65 +81,70 @@ background_visible="true"
left="5"
name="teleport_btn"
tool_tip="Teleport to the selected area"
- top="0"
- width="100" />
+ top="1"
+ width="108" />
<button
follows="bottom|left"
height="23"
label="Map"
layout="topleft"
- left_pad="5"
+ left_pad="3"
name="map_btn"
- top="0"
- width="70" />
+ tool_tip="Show the corresponding area on the World Map"
+ width="85" />
<button
follows="bottom|left"
height="23"
label="Edit"
layout="topleft"
- left_pad="5"
+ left_pad="3"
name="edit_btn"
tool_tip="Edit landmark information"
- top="0"
- width="70" />
+ width="83" />
<button
follows="bottom|right"
height="23"
- image_disabled="ForwardArrow_Off"
- image_selected="ForwardArrow_Press"
- image_unselected="ForwardArrow_Off"
+ label="â–¼"
layout="topleft"
name="overflow_btn"
tool_tip="Show additional options"
- right="-10"
- top="0"
- width="18" />
+ left_pad="3"
+ width="23" />
<button
- follows="bottom|right"
+ follows="bottom|left"
height="23"
- label="Close"
+ label="Save"
layout="topleft"
- name="close_btn"
- right="-10"
- top="0"
- width="60" />
+ name="save_btn"
+ left="5"
+ top_pad="-23"
+ width="152" />
<button
follows="bottom|right"
height="23"
label="Cancel"
layout="topleft"
name="cancel_btn"
- right="-10"
- top="0"
- width="60" />
+ left_pad="3"
+ width="153" />
<button
follows="bottom|right"
height="23"
- label="Save"
+ label="Close"
layout="topleft"
- name="save_btn"
- right="-75"
- top="0"
+ name="close_btn"
+ right="-10"
+ top="1"
width="60" />
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Profile"
+ layout="topleft"
+ name="profile_btn"
+ right="-1"
+ tool_tip="Show place profile"
+ top="1"
+ width="111" />
</panel>
</panel>
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 05a3771edf..31d8ea27d9 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_advanced.xml
@@ -13,6 +13,10 @@
name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
+ <panel.string
+ name="middle_mouse">
+ Middle Mouse
+ </panel.string>
<icon
follows="left|top"
height="18"
@@ -90,6 +94,16 @@ Automatic position for:
name="appearance_camera_movement"
tool_tip="Use automatic camera positioning while in edit mode"
width="242" />
+ <check_box
+ control_name="SidebarCameraMovement"
+ follows="left|top"
+ height="16"
+ initial_value="true"
+ label="Sidebar"
+ layout="topleft"
+ name="appearance_sidebar_positioning"
+ tool_tip="Use automatic camera positioning for sidebar"
+ width="242" />
<icon
follows="left|top"
height="18"
@@ -160,9 +174,10 @@ Automatic position for:
label="Opacity"
layout="topleft"
left="80"
- label_width="50"
+ label_width="156"
name="bubble_chat_opacity"
- width="200" />
+ top_pad = "10"
+ width="347" />
<color_swatch
can_apply_immediately="true"
color="0 0 0 1"
@@ -170,7 +185,8 @@ Automatic position for:
follows="left|top"
height="50"
layout="topleft"
- left_pad="10"
+ left_pad="30"
+ top="190"
name="background"
tool_tip="Choose color for bubble chat"
width="38">
@@ -181,6 +197,32 @@ Automatic position for:
function="Pref.applyUIColor"
parameter="BackgroundChatColor" />
</color_swatch>
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="12"
+ layout="topleft"
+ left="80"
+ name="UI Size:"
+ top_pad="25"
+ width="160">
+ UI size
+ </text>
+ <slider
+ control_name="UIScaleFactor"
+ decimal_digits="2"
+ follows="left|top"
+ height="17"
+ increment="0.025"
+ initial_value="1"
+ layout="topleft"
+ left_pad="0"
+ max_val="1.4"
+ min_val="0.75"
+ name="ui_scale_slider"
+ top_pad="-14"
+ width="180" />
<check_box
control_name="ShowScriptErrors"
follows="left|top"
@@ -188,6 +230,7 @@ Automatic position for:
label="Show script errors in:"
layout="topleft"
left="30"
+ top_pad="10"
name="show_script_errors"
width="256" />
<radio_group
@@ -242,6 +285,7 @@ Automatic position for:
top_pad="5"
width="200" />
<button
+ layout="topleft"
follows="top|left"
enabled_control="EnableVoiceChat"
height="23"
@@ -252,8 +296,8 @@ Automatic position for:
<button.commit_callback
function="Pref.VoiceSetKey" />
</button>
- <button
- enabled_control="EnableVoiceChat"
+ <button
+ enabled_control="EnableVoiceChat"
follows="top|left"
halign="center"
height="23"
@@ -266,4 +310,15 @@ Automatic position for:
<button.commit_callback
function="Pref.VoiceSetMiddleMouse" />
</button>
+ <button
+ height="23"
+ label="Other Devices"
+ left="30"
+ name="joystick_setup_button"
+ top="27"
+ width="155">
+ <button.commit_callback
+ function="Floater.Show"
+ parameter="pref_joystick" />
+ </button>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml
index 188fd3b7bc..516457dd93 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_alerts.xml
@@ -51,13 +51,13 @@
Always show:
</text>
<scroll_list
- follows="top|left"
+ follows="top|left|right"
height="140"
layout="topleft"
left="10"
multi_select="true"
name="enabled_popups"
- width="475" />
+ width="495" />
<button
enabled_control="FirstSelectedDisabledPopups"
follows="top|left"
@@ -99,11 +99,11 @@
Never show:
</text>
<scroll_list
- follows="top|left"
+ follows="top|left|right"
height="140"
layout="topleft"
left="10"
multi_select="true"
name="disabled_popups"
- width="475" />
+ width="495" />
</panel>
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 433dfc17fe..ba967d3e2c 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -9,13 +9,23 @@
name="chat"
top="1"
width="517">
- <radio_group
+ <text
+ follows="left|top"
+ layout="topleft"
+ left="30"
+ height="12"
+ name="font_size"
+ width="120"
+ top="10">
+ Font size:
+ </text>
+ <radio_group
height="30"
layout="topleft"
- left="30"
- control_name="ChatFontSize"
+ left="40"
+ control_name="ChatFontSize"
name="chat_font_size"
- top="10"
+ top_pad="0"
width="440">
<radio_item
height="16"
@@ -45,12 +55,25 @@
top_delta="0"
width="125" />
</radio_group>
+
+ <text
+ follows="left|top"
+ layout="topleft"
+ left="30"
+ height="12"
+ name="font_colors"
+ top_pad="10"
+ width="120"
+ >
+ Font colors:
+ </text>
+
<color_swatch
can_apply_immediately="true"
follows="left|top"
height="47"
layout="topleft"
- left="30"
+ left="40"
name="user"
top_pad="10"
width="44" >
@@ -79,7 +102,7 @@
follows="left|top"
height="47"
layout="topleft"
- left="180"
+ left="190"
name="agent"
top_pad="-17"
width="44" >
@@ -110,7 +133,7 @@
height="47"
label_width="60"
layout="topleft"
- left="350"
+ left="360"
name="im"
top_pad="-17"
width="44">
@@ -141,7 +164,7 @@
height="47"
label_width="44"
layout="topleft"
- left="30"
+ left="40"
name="system"
top_pad="40"
width="44" >
@@ -171,7 +194,7 @@
follows="left|top"
height="47"
layout="topleft"
- left="180"
+ left="190"
name="script_error"
top_pad="-17"
width="44">
@@ -201,7 +224,7 @@
follows="left|top"
height="47"
layout="topleft"
- left="350"
+ left="360"
name="objects"
top_pad="-17"
width="44" >
@@ -231,7 +254,7 @@
follows="left|top"
height="47"
layout="topleft"
- left="30"
+ left="40"
name="owner"
top_pad="40"
width="44" >
@@ -261,7 +284,7 @@
follows="left|top"
height="47"
layout="topleft"
- left="180"
+ left="190"
name="links"
top_pad="-17"
width="44" >
@@ -307,31 +330,38 @@
<check_box
enabled="false"
height="16"
- label="Enable plain text chat history"
+ label="Enable plain text IM and chat history"
layout="topleft"
left_delta="0"
name="plain_text_chat_history"
top_pad="5"
width="400" />
<text
+ name="show_ims_in_label"
+ follows="left|top"
+ layout="topleft"
left="30"
height="20"
- width="120"
+ width="170"
top_pad="20">
Show IMs in:
</text>
<text
- left_pad="6"
- height="20"
- width="100"
- text_color="White_25"
- >
+ name="requires_restart_label"
+ follows="left|top"
+ layout="topleft"
+ top_delta="0"
+ left="170"
+ height="20"
+ width="130"
+ text_color="White_25"
+ >
(requires restart)
</text>
<radio_group
height="30"
layout="topleft"
- left="30"
+ left="40"
control_name="ChatWindow"
name="chat_window"
top_pad="0"
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 099c789e4b..a69e8d29b0 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
@@ -141,7 +141,34 @@
label="General"
name="Desired_PG"
value="13" />
+ <combo_box.commit_callback
+ function="Pref.MaturitySettings"/>
</combo_box>
+ <icon
+ follows="left|top"
+ height="16"
+ image_name="Parcel_PG_Dark"
+ layout="topleft"
+ left_pad="5"
+ name="rating_icon_general"
+ top_delta="3"
+ width="18"/>
+ <icon
+ follows="left|top"
+ height="16"
+ image_name="Parcel_M_Dark"
+ layout="topleft"
+ left_pad="2"
+ name="rating_icon_moderate"
+ width="18"/>
+ <icon
+ follows="left|top"
+ height="16"
+ image_name="Parcel_R_Dark"
+ layout="topleft"
+ left_pad="2"
+ name="rating_icon_adult"
+ width="18"/>
<text
type="string"
length="1"
@@ -150,7 +177,7 @@
layout="topleft"
left="30"
name="start_location_textbox"
- top_pad="10"
+ top_pad="15"
width="394">
Start location:
</text>
@@ -229,26 +256,15 @@
left="50"
name="show_my_name_checkbox1"
width="300" />
- <check_box
- enabled_control="AvatarNameTagMode"
- control_name="SmallAvatarNames"
- height="16"
- initial_value="true"
- label="Small name tags"
- layout="topleft"
- left_delta="175"
- name="small_avatar_names_checkbox"
- width="200" />
<check_box
enabled_control="AvatarNameTagMode"
control_name="RenderShowGroupTitleAll"
height="16"
label="Show group titles"
layout="topleft"
- left_delta="-175"
+ left_delta="175"
name="show_all_title_checkbox1"
- top_pad="5"
- width="300" />
+ width="200" />
<text
type="string"
length="1"
@@ -327,23 +343,22 @@
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"
+ control_name="BusyModeResponse"
text_readonly_color="LabelDisabledColor"
bg_writeable_color="LtGray"
use_ellipses="false"
- hover="false"
commit_on_focus_lost = "true"
- follows="left|top"
+ follows="left|top|right"
height="60"
layout="topleft"
left="50"
name="busy_response"
- width="440"
+ width="450"
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 82821a1dfe..f4694180a1 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_graphics1.xml
@@ -16,35 +16,8 @@
height="12"
layout="topleft"
left="30"
- name="UI Size:"
- top="10"
- width="300">
- UI size:
- </text>
- <slider
- can_edit_text="true"
- control_name="UIScaleFactor"
- decimal_digits="2"
- follows="left|top"
- height="15"
- increment="0.025"
- initial_value="1"
- layout="topleft"
- left_delta="52"
- max_val="1.4"
- min_val="0.75"
- name="ui_scale_slider"
- top_pad="2"
- width="180" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="12"
- layout="topleft"
- left="30"
name="QualitySpeed"
- top_pad="4"
+ top="10"
width="400">
Quality and speed:
</text>
@@ -187,7 +160,7 @@
layout="topleft"
left="5"
name="CustomGraphics Panel"
- top="124"
+ top="76"
width="485">
<text
type="string"
@@ -314,7 +287,7 @@
left_delta="2"
name="AvatarRenderingText"
top_pad="5"
- width="128">
+ width="158">
Avatar rendering:
</text>
<check_box
@@ -359,29 +332,26 @@
increment="8"
initial_value="160"
label="Draw distance:"
- label_width="140"
+ label_width="185"
layout="topleft"
- left="216"
+ left="200"
max_val="512"
min_val="64"
name="DrawDistance"
top="3"
- width="255">
- <slider.commit_callback
- function="Pref.UpdateMeterText" />
- </slider>
+ width="296" />
<text
type="string"
length="1"
follows="left|top"
height="12"
layout="topleft"
- left_delta="250"
+ left_delta="291"
name="DrawDistanceMeterText2"
top_delta="0"
width="128">
m
- </text>
+ </text>
<slider
control_name="RenderMaxPartCount"
decimal_digits="0"
@@ -390,13 +360,29 @@
increment="256"
initial_value="4096"
label="Max. particle count:"
- label_width="140"
+ label_width="185"
layout="topleft"
- left="216"
+ left="200"
max_val="8192"
name="MaxParticleCount"
top_pad="7"
- width="262" />
+ width="303" />
+ <slider
+ control_name="RenderAvatarMaxVisible"
+ decimal_digits="0"
+ follows="left|top"
+ height="16"
+ increment="1"
+ initial_value="12"
+ label="Max. # of non-impostor avatars:"
+ label_width="185"
+ layout="topleft"
+ left_delta="0"
+ max_val="65"
+ min_val="1"
+ name="MaxNumberAvatarDrawn"
+ top_pad="4"
+ width="290" />
<slider
control_name="RenderGlowResolutionPow"
decimal_digits="0"
@@ -405,15 +391,15 @@
increment="1"
initial_value="8"
label="Post process quality:"
- label_width="140"
+ label_width="185"
layout="topleft"
- left_delta="0"
+ left="200"
max_val="9"
min_val="8"
name="RenderPostProcess"
show_text="false"
top_pad="4"
- width="223">
+ width="264">
<slider.commit_callback
function="Pref.UpdateSliderText"
parameter="PostProcessText" />
@@ -437,14 +423,14 @@
increment="0.125"
initial_value="160"
label=" Objects:"
- label_width="140"
+ label_width="185"
layout="topleft"
left_delta="0"
max_val="2"
name="ObjectMeshDetail"
show_text="false"
top_pad="6"
- width="223">
+ width="264">
<slider.commit_callback
function="Pref.UpdateSliderText"
parameter="ObjectMeshDetailText" />
@@ -455,13 +441,13 @@
height="16"
initial_value="160"
label=" Flexiprims:"
- label_width="140"
+ label_width="185"
layout="topleft"
left_delta="0"
name="FlexibleMeshDetail"
show_text="false"
top_pad="4"
- width="223">
+ width="264">
<slider.commit_callback
function="Pref.UpdateSliderText"
parameter="FlexibleMeshDetailText" />
@@ -473,13 +459,13 @@
increment="0.125"
initial_value="160"
label=" Trees:"
- label_width="140"
+ label_width="185"
layout="topleft"
left_delta="0"
name="TreeMeshDetail"
show_text="false"
top_pad="4"
- width="223">
+ width="264">
<slider.commit_callback
function="Pref.UpdateSliderText"
parameter="TreeMeshDetailText" />
@@ -491,13 +477,13 @@
increment="0.125"
initial_value="160"
label=" Avatars:"
- label_width="140"
+ label_width="185"
layout="topleft"
left_delta="0"
name="AvatarMeshDetail"
show_text="false"
top_pad="4"
- width="223">
+ width="264">
<slider.commit_callback
function="Pref.UpdateSliderText"
parameter="AvatarMeshDetailText" />
@@ -509,7 +495,7 @@
increment="0.125"
initial_value="160"
label=" Terrain:"
- label_width="140"
+ label_width="185"
layout="topleft"
left_delta="0"
max_val="2"
@@ -517,7 +503,7 @@
name="TerrainMeshDetail"
show_text="false"
top_pad="4"
- width="223">
+ width="264">
<slider.commit_callback
function="Pref.UpdateSliderText"
parameter="TerrainMeshDetailText" />
@@ -531,7 +517,7 @@
increment="8"
initial_value="160"
label=" Sky:"
- label_width="140"
+ label_width="185"
layout="topleft"
left_delta="0"
max_val="128"
@@ -539,7 +525,7 @@
name="SkyMeshDetail"
show_text="false"
top_pad="4"
- width="223">
+ width="264">
<slider.commit_callback
function="Pref.UpdateSliderText"
parameter="SkyMeshDetailText" />
@@ -550,9 +536,9 @@
follows="left|top"
height="12"
layout="topleft"
- left="444"
+ left="469"
name="PostProcessText"
- top="305"
+ top="60"
width="128">
Low
</text>
@@ -635,10 +621,10 @@
follows="left|top"
height="12"
layout="topleft"
- left_delta="-230"
+ left="200"
name="LightingDetailText"
- top_pad="8"
- width="128">
+ top_pad="18"
+ width="140">
Lighting detail:
</text>
<radio_group
@@ -646,15 +632,13 @@
draw_border="false"
height="38"
layout="topleft"
- left_delta="0"
name="LightingDetailRadio"
top_pad="5"
- width="321">
+ width="200">
<radio_item
height="16"
label="Sun and moon only"
layout="topleft"
- left="3"
name="SunMoon"
value="0"
top="3"
@@ -663,7 +647,6 @@
height="16"
label="Nearby local lights"
layout="topleft"
- left_delta="0"
name="LocalLights"
value="1"
top_delta="16"
@@ -675,10 +658,10 @@
follows="left|top"
height="12"
layout="topleft"
- left="360"
+ left_pad="-30"
name="TerrainDetailText"
- top="465"
- width="128">
+ top="226"
+ width="155">
Terrain detail:
</text>
<radio_group
@@ -689,23 +672,21 @@
left_delta="0"
name="TerrainDetailRadio"
top_pad="5"
- width="321">
+ width="70">
<radio_item
height="16"
label="Low"
layout="topleft"
- left="3"
name="0"
top="3"
- width="315" />
+ width="50" />
<radio_item
height="16"
label="High"
layout="topleft"
- left_delta="0"
name="2"
top_delta="16"
- width="315" />
+ width="50" />
</radio_group>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
index f7e3ede93c..fca9b4bca1 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_privacy.xml
@@ -17,6 +17,7 @@
follows="left|bottom"
height="23"
label="Clear History"
+ tool_tip="Clear login image, last location, teleport history, web, and texture cache"
layout="topleft"
left="30"
name="clear_cache"
@@ -68,52 +69,6 @@
name="auto_disengage_mic_check"
top_pad="10"
width="350" />
- <check_box
- control_name="CookiesEnabled"
- height="16"
- label="Accept cookies"
- layout="topleft"
- left="30"
- name="cookies_enabled"
- top_pad="10"
- width="350" />
- <check_box
- name="media_enabled"
- control_name="AudioStreamingMedia"
- height="16"
- label="Media Enabled"
- layout="topleft"
- left="30"
- top_pad="10"
- width="350">
- <check_box.commit_callback
- function="Pref.MediaEnabled" />
- </check_box>
- <check_box
- enabled_control="AudioStreamingMedia"
- control_name="ParcelMediaAutoPlayEnable"
- height="16"
- label="Allow Media to auto-play"
- layout="topleft"
- left="30"
- name="autoplay_enabled"
- top_pad="10"
- width="350">
- <check_box.commit_callback
- function="Pref.ParcelMediaAutoPlayEnable" />
- </check_box>
- <check_box
- control_name="AudioStreamingMusic"
- height="16"
- label="Music Enabled"
- layout="topleft"
- left="30"
- name="music_enabled"
- top_pad="10"
- width="350">
- <check_box.commit_callback
- function="Pref.MusicEnabled" />
- </check_box>
<text
type="string"
length="1"
@@ -129,7 +84,7 @@
</text>
<check_box
enabled="false"
- control_name="LogChat"
+ control_name="LogNearbyChat"
height="16"
label="Save nearby chat logs on my computer"
layout="topleft"
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 8723e0a832..2c6ceeef2e 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
@@ -9,18 +9,6 @@
name="Input panel"
top="1"
width="517">
- <button
- height="23"
- label="Other Devices"
- layout="topleft"
- left="30"
- name="joystick_setup_button"
- top="10"
- width="155">
- <button.commit_callback
- function="Floater.Show"
- parameter="pref_joystick" />
- </button>
<text
type="string"
length="1"
@@ -29,7 +17,7 @@
layout="topleft"
left="30"
name="Mouselook:"
- top_pad="10"
+ top="10"
width="300">
Mouselook:
</text>
@@ -142,14 +130,14 @@
increment="1"
initial_value="13000"
label="Port number:"
- label_width="75"
+ label_width="105"
layout="topleft"
left_delta="160"
max_val="13050"
min_val="13000"
name="connection_port"
- top_delta="-2"
- width="140" />
+ top_delta="3"
+ width="170" />
<text
type="string"
length="1"
@@ -210,7 +198,6 @@
enabled="false"
follows="left|top"
font="SansSerif"
- handle_edit_keys_directly="true"
height="23"
layout="topleft"
left="80"
@@ -265,35 +252,80 @@
layout="topleft"
left_delta="50"
name="use_external_browser"
- top_pad="4"
+ top_pad="-2"
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, Safari)"
layout="topleft"
left_delta="0"
name="external"
value="1"
+ top="0"
tool_tip="Use the default system web browser for help, web links, etc. Not recommended if running full screen."
+ width="480" />
+ <radio_item
+ height="20"
+ label="Use built-in browser"
+ layout="topleft"
+ left="0"
+ name="internal"
+ value=""
+ tool_tip="Use the built-in web browser for help, web links, etc. This browser opens as a new window inside [APP_NAME]."
top_delta="20"
width="480" />
</radio_group>
<check_box
+ top_delta="2"
+ enabled="true"
+ follows="left|top"
+ height="18"
+ initial_value="true"
+ control_name="BrowserPluginsEnabled"
+ label="Enable plugins"
+ left_delta="20"
+ mouse_opaque="true"
+ name="browser_plugins_enabled"
+ radio_style="false"
+ width="400"
+ top_pad="5"/>
+
+ <check_box
+ top_delta="4"
+ enabled="true"
+ follows="left|top"
+ height="14"
+ initial_value="true"
+ control_name="CookiesEnabled"
+ label="Accept cookies"
+ left_delta="0"
+ mouse_opaque="true"
+ name="cookies_enabled"
+ radio_style="false"
+ width="400"
+ top_pad="5"/>
+
+ <check_box
+ top_delta="4"
+ enabled="true"
+ follows="left|top"
+ height="14"
+ initial_value="true"
+ control_name="BrowserJavascriptEnabled"
+ label="Enable Javascript"
+ left_delta="0"
+ mouse_opaque="true"
+ name="browser_javascript_enabled"
+ radio_style="false"
+ width="400"
+ top_pad="5"/>
+
+ <check_box
top_delta="4"
enabled="true"
follows="left|top"
- height="16"
+ height="14"
initial_value="false"
control_name="BrowserProxyEnabled"
label="Enable Web Proxy"
@@ -308,9 +340,9 @@
follows="left|top"
height="10"
layout="topleft"
- left_delta="1"
+ left_delta="20"
name="Proxy location"
- top_delta="20"
+ top_delta="16"
width="300">
Proxy location:
</text>
@@ -335,12 +367,12 @@
increment="1"
initial_value="80"
label="Port number:"
- label_width="75"
+ label_width="95"
layout="topleft"
- left_delta="230"
+ left_delta="210"
max_val="12000"
min_val="10"
name="web_proxy_port"
top_delta="0"
- width="140" />
+ width="145" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
index 8bff865eb1..65c78ad333 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_sound.xml
@@ -14,10 +14,10 @@
follows="left|top"
font.style="BOLD"
height="15"
- increment="0.05"
+ increment="0.025"
initial_value="0.5"
label="Master volume"
- label_width="160"
+ label_width="120"
layout="topleft"
left="0"
name="System Volume"
@@ -25,20 +25,20 @@
slider_label.halign="right"
top="10"
volume="true"
- width="350">
+ width="300">
<slider.commit_callback
function="Pref.setControlFalse"
parameter="MuteAudio" />
</slider>
<button
control_name="MuteAudio"
- follows="top|right"
+ follows="top|left"
height="16"
image_selected="AudioMute_Off"
image_unselected="Audio_Off"
is_toggle="true"
layout="topleft"
- left_pad="10"
+ left_pad="5"
name="mute_audio"
tab_stop="false"
width="16" />
@@ -46,21 +46,55 @@
control_name="MuteWhenMinimized"
height="15"
initial_value="true"
- label="Mute if minimized"
+ label="Mute when minimized"
layout="topleft"
- left="167"
name="mute_when_minimized"
- top_pad="5"
- width="215" />
+ top_delta="3"
+ left_pad="5"
+ width="235" />
+ <slider
+ control_name="AudioLevelUI"
+ disabled_control="MuteAudio"
+ follows="left|top"
+ height="15"
+ increment="0.025"
+ initial_value="0.5"
+ label="Buttons"
+ label_width="120"
+ layout="topleft"
+ left="0"
+ name="UI Volume"
+ show_text="false"
+ slider_label.halign="right"
+ top_pad="7"
+ volume="true"
+ width="300">
+ <slider.commit_callback
+ function="Pref.setControlFalse"
+ parameter="MuteUI" />
+ </slider>
+ <button
+ control_name="MuteUI"
+ disabled_control="MuteAudio"
+ follows="top|left"
+ height="16"
+ image_selected="AudioMute_Off"
+ image_unselected="Audio_Off"
+ is_toggle="true"
+ layout="topleft"
+ left_pad="5"
+ name="mute_audio"
+ tab_stop="false"
+ width="16" />
<slider
control_name="AudioLevelAmbient"
disabled_control="MuteAudio"
follows="left|top"
height="15"
- increment="0.05"
+ increment="0.025"
initial_value="0.5"
label="Ambient"
- label_width="160"
+ label_width="120"
layout="topleft"
left="0"
name="Wind Volume"
@@ -68,7 +102,7 @@
slider_label.halign="right"
top_pad="7"
volume="true"
- width="350">
+ width="300">
<slider.commit_callback
function="Pref.setControlFalse"
parameter="MuteAmbient" />
@@ -76,81 +110,13 @@
<button
control_name="MuteAmbient"
disabled_control="MuteAudio"
- follows="top|right"
- height="16"
- image_selected="AudioMute_Off"
- image_unselected="Audio_Off"
- is_toggle="true"
- layout="topleft"
- left_pad="10"
- name="mute_audio"
- tab_stop="false"
- width="16" />
- <slider
- control_name="AudioLevelUI"
- disabled_control="MuteAudio"
- follows="left|top"
- height="15"
- increment="0.05"
- initial_value="0.5"
- label="Buttons"
- label_width="160"
- layout="topleft"
- left="0"
- name="UI Volume"
- show_text="false"
- slider_label.halign="right"
- top_pad="7"
- volume="true"
- width="350">
- <slider.commit_callback
- function="Pref.setControlFalse"
- parameter="MuteUI" />
- </slider>
- <button
- control_name="MuteUI"
- disabled_control="MuteAudio"
- follows="top|right"
- height="16"
- image_selected="AudioMute_Off"
- image_unselected="Audio_Off"
- is_toggle="true"
- layout="topleft"
- left_pad="10"
- name="mute_audio"
- tab_stop="false"
- width="16" />
- <slider
- control_name="AudioLevelMedia"
- disabled_control="MuteAudio"
- follows="left|top"
- height="15"
- increment="0.05"
- initial_value="0.5"
- label="Media"
- label_width="160"
- layout="topleft"
- left="0"
- name="Media Volume"
- show_text="false"
- slider_label.halign="right"
- top_pad="7"
- volume="true"
- width="350">
- <slider.commit_callback
- function="Pref.setControlFalse"
- parameter="MuteMedia" />
- </slider>
- <button
- control_name="MuteMedia"
- disabled_control="MuteAudio"
- follows="top|right"
+ follows="top|left"
height="16"
image_selected="AudioMute_Off"
image_unselected="Audio_Off"
is_toggle="true"
layout="topleft"
- left_pad="10"
+ left_pad="5"
name="mute_audio"
tab_stop="false"
width="16" />
@@ -159,10 +125,10 @@
disabled_control="MuteAudio"
follows="left|top"
height="15"
- increment="0.05"
+ increment="0.025"
initial_value="0.5"
- label="Sound effects"
- label_width="160"
+ label="Sound Effects"
+ label_width="120"
slider_label.halign="right"
layout="topleft"
left="0"
@@ -170,7 +136,7 @@
show_text="false"
top_pad="7"
volume="true"
- width="350">
+ width="300">
<slider.commit_callback
function="Pref.setControlFalse"
parameter="MuteSounds" />
@@ -178,13 +144,13 @@
<button
control_name="MuteSounds"
disabled_control="MuteAudio"
- follows="top|right"
+ follows="top|left"
height="16"
image_selected="AudioMute_Off"
image_unselected="Audio_Off"
is_toggle="true"
layout="topleft"
- left_pad="10"
+ left_pad="5"
name="mute_audio"
tab_stop="false"
width="16" />
@@ -193,10 +159,10 @@
disabled_control="MuteAudio"
follows="left|top"
height="15"
- increment="0.05"
+ increment="0.025"
initial_value="0.5"
label="Streaming music"
- label_width="160"
+ label_width="120"
layout="topleft"
left="0"
name="Music Volume"
@@ -204,119 +170,199 @@
show_text="false"
top_pad="7"
volume="true"
- width="350">
+ width="300">
<slider.commit_callback
function="Pref.setControlFalse"
parameter="MuteMusic" />
- </slider>
- <button
+ </slider>
+ <button
control_name="MuteMusic"
- disabled_control="MuteAudio"
- follows="top|right"
+ disabled_control="MuteAudio"
+ follows="top|left"
height="16"
image_selected="AudioMute_Off"
image_unselected="Audio_Off"
is_toggle="true"
layout="topleft"
- left_pad="10"
+ left_pad="5"
name="mute_audio"
tab_stop="false"
- width="16" />
- <check_box
- label_text.halign="left"
- follows="left|top"
- height="16"
- control_name ="EnableVoiceChat"
- disabled_control="CmdLineDisableVoice"
- label="Enable voice"
- layout="topleft"
- left="28"
- name="enable_voice_check"
- top_pad="5"
- width="110"
- >
- </check_box>
- <slider
- control_name="AudioLevelVoice"
- enabled_control="EnableVoiceChat"
- disabled_control="MuteAudio"
+ width="16" />
+ <check_box
+ control_name="AudioStreamingMusic"
+ height="16"
+ label="Enabled"
+ layout="topleft"
+ left_pad="5"
+ name="music_enabled"
+ top_delta="2"
+ width="350"/>
+ <slider
+ control_name="AudioLevelMedia"
+ disabled_control="MuteAudio"
+ follows="left|top"
+ height="16"
+ increment="0.025"
+ initial_value="0.5"
+ label="Media"
+ label_width="120"
+ layout="topleft"
+ left="0"
+ name="Media Volume"
+ show_text="false"
+ slider_label.halign="right"
+ top_pad="7"
+ volume="true"
+ width="300">
+ <slider.commit_callback
+ function="Pref.setControlFalse"
+ parameter="MuteMedia" />
+ </slider>
+ <button
+ control_name="MuteMedia"
+ disabled_control="MuteAudio"
+ follows="top|left"
+ height="16"
+ image_selected="AudioMute_Off"
+ image_unselected="Audio_Off"
+ is_toggle="true"
+ layout="topleft"
+ left_pad="5"
+ name="mute_audio"
+ tab_stop="false"
+ width="16" />
+ <check_box
+ label_text.halign="left"
+ follows="left|top"
+ height="16"
+ control_name ="AudioStreamingMedia"
+ label="Enabled"
+ layout="topleft"
+ top_delta="2"
+ left_pad="5"
+ name="enable_media"
+ width="110"/>
+ <slider
+ control_name="AudioLevelVoice"
+ disabled_control="MuteAudio"
+ follows="left|top"
+ height="16"
+ increment="0.025"
+ initial_value="0.5"
+ label="Voice Chat"
+ label_width="120"
+ layout="topleft"
+ left="0"
+ top_delta="20"
+ name="Voice Volume"
+ show_text="false"
+ slider_label.halign="right"
+ volume="true"
+ width="300">
+ <slider.commit_callback
+ function="Pref.setControlFalse"
+ parameter="MuteVoice" />
+ </slider>
+ <button
+ control_name="MuteVoice"
+ disabled_control="MuteAudio"
+ follows="top|left"
+ height="16"
+ image_selected="AudioMute_Off"
+ image_unselected="Audio_Off"
+ is_toggle="true"
+ layout="topleft"
+ left_pad="5"
+ name="mute_audio"
+ tab_stop="false"
+ width="16" />
+ <check_box
+ label_text.halign="left"
+ follows="left|top"
+ height="16"
+ control_name ="EnableVoiceChat"
+ disabled_control="CmdLineDisableVoice"
+ label="Enabled"
+ layout="topleft"
+ top_delta="2"
+ left_pad="5"
+ name="enable_voice_check"
+ width="110"/>
+ <!-- -->
+ <check_box
+ name="media_auto_play_btn"
+ control_name="ParcelMediaAutoPlayEnable"
+ value="true"
+ follows="left|bottom|right"
+ height="15"
+ tool_tip="Check this to let media auto-play if it wants"
+ label="Allow Media to auto-play"
+ top_pad="5"
+ left="25"/>
+ <check_box
+ name="media_show_on_others_btn"
+ control_name="MediaShowOnOthers"
+ value="true"
+ follows="left|bottom|right"
+ height="15"
+ tool_tip="Uncheck this to hide media attached to other avatars nearby"
+ label="Play media attached to other avatars"
+ left="25"/>
+
+ <text
+ type="string"
+ length="1"
follows="left|top"
- height="15"
- increment="0.05"
- initial_value="0.5"
- label="Voice"
- label_width="160"
- layout="topleft"
- left="0"
- top_delta="20"
- name="Voice Volume"
- show_text="false"
- slider_label.halign="right"
- volume="true"
- width="350">
- <slider.commit_callback
- function="Pref.setControlFalse"
- parameter="MuteVoice" />
- </slider>
- <button
- control_name="MuteVoice"
- disabled_control="MuteAudio"
- follows="top|right"
- height="16"
- image_selected="AudioMute_Off"
- image_unselected="Audio_Off"
- is_toggle="true"
+ height="20"
layout="topleft"
- left_pad="10"
- name="mute_audio"
- tab_stop="false"
- width="16" />
+ left="25"
+ name="voice_chat_settings"
+ width="200"
+ top="210">
+ Voice Chat Settings
+ </text>
<text
type="string"
length="1"
follows="left|top"
- height="13"
layout="topleft"
- left="30"
+ left="80"
+ top_delta="16"
name="Listen from"
- width="200"
- top="205">
+ width="142">
Listen from:
</text>
- <icon
- follows="left|top"
- height="18"
- image_name="Cam_FreeCam_Off"
- layout="topleft"
- name="camera_icon"
- mouse_opaque="false"
- visible="true"
- width="18"
- left="80"
- top="219"/>
<icon
- follows="left|top"
- height="18"
- image_name="Move_Walk_Off"
- layout="topleft"
- name="avatar_icon"
- mouse_opaque="false"
- visible="true"
- width="18"
- top="239"
- left="80"
- />
+ follows="left|top"
+ height="18"
+ image_name="Cam_FreeCam_Off"
+ layout="topleft"
+ name="camera_icon"
+ mouse_opaque="false"
+ visible="true"
+ width="18"
+ left_pad="0"
+ top_delta="-5"/>
+ <icon
+ follows="left|top"
+ height="18"
+ image_name="Move_Walk_Off"
+ layout="topleft"
+ name="avatar_icon"
+ mouse_opaque="false"
+ visible="true"
+ width="18"
+ top_delta="20" />
<radio_group
enabled_control="EnableVoiceChat"
control_name="VoiceEarLocation"
draw_border="false"
follows="left|top"
layout="topleft"
- left="100"
+ left_pad="2"
width="221"
height="38"
- name="ear_location"
- top="218">
+ name="ear_location">
<radio_item
height="16"
label="Camera position"
@@ -339,8 +385,8 @@
is_toggle="true"
label="Input/Output devices"
layout="topleft"
- left="30"
- top="262"
+ left="80"
+ top_pad="5"
name="device_settings_btn"
width="190">
</button>
@@ -408,7 +454,7 @@
control_name="AudioLevelMic"
follows="left|top"
height="17"
- increment="0.05"
+ increment="0.025"
initial_value="1.0"
layout="topleft"
left="160"
@@ -440,28 +486,28 @@
<locate
height="20"
layout="topleft"
- left_pad="2"
+ left_pad="5"
name="bar1"
top_delta="0"
width="20" />
<locate
height="20"
layout="topleft"
- left_pad="2"
+ left_pad="5"
name="bar2"
top_delta="0"
width="20" />
<locate
height="20"
layout="topleft"
- left_pad="2"
+ left_pad="5"
name="bar3"
top_delta="0"
width="20" />
<locate
height="20"
layout="topleft"
- left_pad="2"
+ left_pad="5"
name="bar4"
top_delta="0"
width="20" />
@@ -475,7 +521,7 @@
visible="true"
width="22" />
<text
- font.style="BOLD"
+ font.style="BOLD"
type="string"
length="1"
follows="left|top"
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 e1d8ee241d..6bf00373ea 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
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
follows="left|right|top|bottom"
- name="MediaControlsPanel"
+ name="MediaControls"
background_visible="false"
height="200"
layout="topleft"
@@ -71,7 +71,7 @@
layout="topleft"
top="0"
left="0"
- border_size="1"
+ border_size="0"
mouse_opaque="false"
orientation="horizontal">
<!-- outer layout_panels center the inner one -->
@@ -260,7 +260,7 @@
top="0"
height="22"
min_width="22"
- width="24">
+ width="22">
<button
name="play_btn"
follows="top"
@@ -272,7 +272,6 @@
hover_glow_amount="0.15"
layout="topleft"
tool_tip = "Play media"
- left_delta="2"
top="0"
height="22"
width="22">
@@ -288,7 +287,7 @@
layout="topleft"
top="0"
min_width="22"
- width="24">
+ width="22">
<button
name="pause_btn"
follows="top"
@@ -302,7 +301,6 @@
top="0"
height="22"
width="22"
- left_delta="-1"
tool_tip = "Pause media">
<button.commit_callback
function="MediaCtrl.Pause" />
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
index 351df22042..d7a601d7a3 100644
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile.xml
@@ -59,7 +59,7 @@
left="0"
name="profile_scroll"
opaque="true"
- height="524"
+ height="527"
width="317"
top="0">
<panel
@@ -107,6 +107,8 @@
layout="topleft"
left="107"
textbox.max_length="512"
+ textbox.label="More"
+ textbox.show_context_menu="true"
name="sl_description_edit"
top_pad="-3"
translate="false"
@@ -151,6 +153,8 @@
layout="topleft"
left="107"
textbox.max_length="512"
+ textbox.label="More"
+ textbox.show_context_menu="true"
name="fl_description_edit"
top_pad="-3"
translate="false"
@@ -284,10 +288,13 @@
width="300" />
<expandable_text
follows="all"
- height="113"
+ height="103"
layout="topleft"
left="7"
name="sl_groups"
+ textbox.max_length="512"
+ textbox.label="More"
+ textbox.show_context_menu="true"
top_pad="0"
translate="false"
width="290"
@@ -313,9 +320,12 @@
left="2"
mouse_opaque="false"
name="add_friend"
+ pad_left="1"
+ pad_right="1"
tool_tip="Offer friendship to the Resident"
top="5"
- width="80" />
+ use_ellipses="true"
+ width="117" />
<button
follows="bottom|left"
height="23"
@@ -324,8 +334,8 @@
name="im"
tool_tip="Open instant message session"
top="5"
- left_pad="3"
- width="39" />
+ left_pad="1"
+ width="21" />
<button
follows="bottom|left"
height="23"
@@ -333,20 +343,12 @@
layout="topleft"
name="call"
tool_tip="Call this Resident"
- left_pad="3"
- top="5"
- width="43" />
- <button
- enabled="false"
- follows="bottom|left"
- height="23"
- label="Map"
- layout="topleft"
- name="show_on_map_btn"
- tool_tip="Show the Resident on the map"
+ left_pad="1"
+ pad_left="1"
+ pad_right="1"
top="5"
- left_pad="3"
- width="41" />
+ use_ellipses="true"
+ width="51" />
<button
follows="bottom|left"
height="23"
@@ -354,9 +356,12 @@
layout="topleft"
name="teleport"
tool_tip="Offer teleport"
- left_pad="3"
+ left_pad="1"
+ pad_left="1"
+ pad_right="1"
top="5"
- width="69" />
+ use_ellipses="true"
+ width="92" />
<button
follows="bottom|right"
height="23"
@@ -366,7 +371,6 @@
tool_tip="Pay money to or share inventory with the Resident"
right="-1"
top="5"
- left_pad="3"
width="23" />
</layout_panel>
<layout_panel
@@ -385,14 +389,6 @@
name="edit_profile_btn"
tool_tip="Edit your personal information"
width="130" />
- <button
- follows="bottom|right"
- height="23"
- label="Edit Appearance"
- left_pad="10"
- name="edit_appearance_btn"
- tool_tip="Create/edit your appearance: physical data, clothes and etc."
- width="130" />
</layout_panel>
</layout_stack>
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 607de65c5c..d9030fc0d6 100644
--- a/indra/newview/skins/default/xui/en/panel_profile_view.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile_view.xml
@@ -6,6 +6,7 @@
layout="topleft"
min_height="350"
name="panel_target_profile"
+ left="0"
width="333">
<string
name="status_online">
@@ -17,26 +18,30 @@
</string>
<button
follows="top|right"
- height="23"
- image_overlay="BackArrow_Off"
+ height="24"
+ image_hover_unselected="BackButton_Over"
+ image_pressed="BackButton_Press"
+ image_unselected="BackButton_Off"
layout="topleft"
name="back"
left="10"
tab_stop="false"
top="2"
- width="23" />
+ width="30" />
<text_editor
+ h_pad="0"
+ v_pad="0"
allow_scroll="false"
bg_visible="false"
read_only = "true"
follows="top|left|right"
font="SansSerifHugeBold"
- height="29"
+ height="26"
layout="topleft"
- left_pad="10"
+ left_pad="5"
name="user_name"
text_color="LtGray"
- top="0"
+ top="2"
value="(Loading...)"
use_ellipses="true"
width="275" />
@@ -51,7 +56,7 @@
width="150" />
<tab_container
follows="all"
- height="535"
+ height="538"
halign="center"
layout="topleft"
left="5"
diff --git a/indra/newview/skins/default/xui/en/panel_region_covenant.xml b/indra/newview/skins/default/xui/en/panel_region_covenant.xml
index dc8f71c868..2b2ea78fac 100644
--- a/indra/newview/skins/default/xui/en/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_covenant.xml
@@ -113,7 +113,6 @@
max_length="65535"
name="covenant_editor"
top_delta="30"
- handle_edit_keys_directly="true"
width="340"
word_wrap="true">
There is no Covenant provided for this Estate.
diff --git a/indra/newview/skins/default/xui/en/panel_region_estate.xml b/indra/newview/skins/default/xui/en/panel_region_estate.xml
index 3980eb86d3..08e36d5e57 100644
--- a/indra/newview/skins/default/xui/en/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_estate.xml
@@ -2,14 +2,14 @@
<panel
border="false"
follows="top|left"
- height="320"
+ height="510"
help_topic="panel_region_estate_tab"
label="Estate"
layout="topleft"
left="0"
name="Estate"
top="320"
- width="480">
+ width="530">
<text
type="string"
length="1"
@@ -20,7 +20,7 @@
name="estate_help_text"
top="14"
word_wrap="true"
- width="275">
+ width="300">
Changes to settings on this tab will affect all regions in the estate.
</text>
<text
@@ -33,7 +33,7 @@
left_delta="0"
name="estate_text"
top_pad="2"
- width="80">
+ width="140">
Estate:
</text>
<text
@@ -59,7 +59,7 @@
left_delta="0"
name="owner_text"
top_pad="2"
- width="80">
+ width="150">
Estate owner:
</text>
<text
@@ -82,7 +82,7 @@
layout="topleft"
left_delta="-4"
top_pad="5"
- width="250" />
+ width="300" />
<check_box
height="20"
label="Use Global Time"
@@ -184,26 +184,26 @@
layout="topleft"
name="apply_btn"
top_pad="10"
- left="78"
+ left="110"
width="97" />
<button
follows="left|top"
height="23"
label="Send Message To Estate..."
layout="topleft"
- left="50"
+ left="45"
name="message_estate_btn"
top_pad="20"
- width="160" />
+ width="220" />
<button
follows="left|top"
height="23"
- label="Kick User from Estate..."
+ label="Kick Resident from Estate..."
layout="topleft"
- left="50"
+ left="45"
name="kick_user_from_estate_btn"
top_pad="5"
- width="160" />
+ width="220" />
<text
type="string"
@@ -213,7 +213,7 @@
height="20"
layout="topleft"
name="estate_manager_label"
- right="470"
+ right="520"
width="200">
Estate Managers:
</text>
@@ -222,7 +222,7 @@
follows="top|left"
height="71"
layout="topleft"
- right="470"
+ right="520"
top_pad="-5"
width="200" />
<name_list
@@ -240,7 +240,7 @@
label="Remove..."
layout="topleft"
name="remove_estate_manager_btn"
- right="470"
+ right="520"
top_pad="5"
width="97" />
<button
@@ -269,7 +269,7 @@
follows="top|left"
height="71"
layout="topleft"
- right="470"
+ right="520"
top_pad="-5"
width="200" />
<name_list
@@ -287,7 +287,7 @@
label="Remove..."
layout="topleft"
name="remove_allowed_avatar_btn"
- right="470"
+ right="520"
top_pad="5"
width="97" />
<button
@@ -316,7 +316,7 @@
follows="top|left"
height="71"
layout="topleft"
- right="470"
+ right="520"
top_pad="-5"
width="200" />
<name_list
@@ -334,7 +334,7 @@
label="Remove..."
layout="topleft"
name="remove_allowed_group_btn"
- right="470"
+ right="520"
top_pad="5"
width="97" />
<button
@@ -363,7 +363,7 @@
follows="top|left"
height="71"
layout="topleft"
- right="470"
+ right="520"
top_pad="-5"
width="200" />
<name_list
@@ -381,7 +381,7 @@
label="Remove..."
layout="topleft"
name="remove_banned_avatar_btn"
- right="470"
+ right="520"
top_pad="5"
width="97" />
<button
diff --git a/indra/newview/skins/default/xui/en/panel_region_general.xml b/indra/newview/skins/default/xui/en/panel_region_general.xml
index 26568c2a28..ca9579284b 100644
--- a/indra/newview/skins/default/xui/en/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_general.xml
@@ -134,6 +134,7 @@
top="200"
width="80" />
<spinner
+ decimal_digits="0"
follows="left|top"
height="20"
increment="1"
@@ -170,27 +171,51 @@
width="100">
Rating:
</text>
- <combo_box
+ <icons_combo_box
+ follows="left|top"
height="20"
label="Moderate"
layout="topleft"
left_delta="100"
name="access_combo"
top_delta="0"
- width="85">
- <combo_box.item
+ width="105">
+ <icons_combo_box.drop_down_button
+ image_overlay="Parcel_M_Light"
+ image_overlay_alignment="left"
+ imgoverlay_label_space="3"
+ pad_left="3"/>
+ <icons_combo_box.item
label="Adult"
name="Adult"
- value="42" />
- <combo_box.item
+ value="42">
+ <item.columns
+ halign="center"
+ type="icon"
+ value="Parcel_R_Light"
+ width="20"/>
+ </icons_combo_box.item>
+ <icons_combo_box.item
label="Moderate"
name="Mature"
- value="21" />
- <combo_box.item
+ value="21">
+ <item.columns
+ halign="center"
+ type="icon"
+ value="Parcel_M_Light"
+ width="20"/>
+ </icons_combo_box.item>
+ <icons_combo_box.item
label="General"
name="PG"
- value="13" />
- </combo_box>
+ value="13">
+ <item.columns
+ halign="center"
+ type="icon"
+ value="Parcel_PG_Light"
+ width="20"/>
+ </icons_combo_box.item>
+ </icons_combo_box>
<button
enabled="false"
follows="left|top"
@@ -204,7 +229,7 @@
<button
follows="left|top"
height="20"
- label="Teleport Home One User..."
+ label="Teleport Home One Resident..."
layout="topleft"
left="10"
name="kick_btn"
@@ -213,7 +238,7 @@
<button
follows="left|top"
height="20"
- label="Teleport Home All Users..."
+ label="Teleport Home All Residents..."
layout="topleft"
left_delta="0"
name="kick_all_btn"
diff --git a/indra/newview/skins/default/xui/en/panel_region_general_layout.xml b/indra/newview/skins/default/xui/en/panel_region_general_layout.xml
index 525c5aa8e7..ffa1a257d5 100644
--- a/indra/newview/skins/default/xui/en/panel_region_general_layout.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_general_layout.xml
@@ -203,7 +203,7 @@
<button
follows="left|top"
height="20"
- label="Teleport Home One User..."
+ label="Teleport Home One Resident..."
layout="topleft"
left="10"
name="kick_btn"
@@ -212,7 +212,7 @@
<button
follows="left|top"
height="20"
- label="Teleport Home All Users..."
+ label="Teleport Home All Residents..."
layout="topleft"
left_delta="0"
name="kick_all_btn"
diff --git a/indra/newview/skins/default/xui/en/panel_region_texture.xml b/indra/newview/skins/default/xui/en/panel_region_texture.xml
index 04dbf73be9..5d910ea659 100644
--- a/indra/newview/skins/default/xui/en/panel_region_texture.xml
+++ b/indra/newview/skins/default/xui/en/panel_region_texture.xml
@@ -148,103 +148,33 @@
name="height_text_lbl6"
top="185"
width="100">
- Southwest
- </text>
- <text
- follows="left|top"
- height="20"
- layout="topleft"
- left_pad="10"
- name="height_text_lbl7"
- top_delta="0"
- width="100">
Northwest
</text>
- <spinner
- follows="left|top"
- height="20"
- increment="0.5"
- label="Low"
- label_width="37"
- layout="topleft"
- left="10"
- max_val="500"
- min_val="-500"
- name="height_start_spin_0"
- top_delta="15"
- width="100" />
- <spinner
- follows="left|top"
- height="20"
- increment="0.5"
- label="Low"
- label_width="37"
- layout="topleft"
- left_pad="10"
- max_val="500"
- min_val="-500"
- name="height_start_spin_1"
- top_delta="0"
- width="100" />
- <spinner
- follows="left|top"
- height="20"
- increment="0.5"
- label="High"
- label_width="37"
- layout="topleft"
- left="10"
- max_val="500"
- min_val="-500"
- name="height_range_spin_0"
- top_delta="20"
- width="100" />
- <spinner
- follows="left|top"
- height="20"
- increment="0.5"
- label="High"
- label_width="37"
- layout="topleft"
- left_pad="10"
- max_val="500"
- min_val="-500"
- name="height_range_spin_1"
- top_delta="0"
- width="100" />
- <text
- follows="left|top"
- height="20"
- layout="topleft"
- left="51"
- name="height_text_lbl8"
- top_pad="10"
- width="100">
- Southeast
- </text>
<text
follows="left|top"
height="20"
layout="topleft"
left_pad="10"
- name="height_text_lbl9"
+ name="height_text_lbl7"
top_delta="0"
width="100">
Northeast
</text>
- <spinner
- follows="left|top"
- height="20"
- increment="0.5"
- label="Low"
- label_width="37"
- layout="topleft"
- left="10"
- max_val="500"
- min_val="-500"
- name="height_start_spin_2"
- top_delta="15"
- width="100" />
+<!-- northwest low-->
+ <spinner
+ follows="left|top"
+ height="20"
+ increment="0.5"
+ label="Low"
+ label_width="37"
+ layout="topleft"
+ left="10"
+ max_val="500"
+ min_val="-500"
+ name="height_start_spin_1"
+ top_delta="15"
+ width="100" />
+<!-- northeast low-->
<spinner
follows="left|top"
height="20"
@@ -258,20 +188,22 @@
name="height_start_spin_3"
top_delta="0"
width="100" />
- <spinner
- follows="left|top"
- height="20"
- increment="0.5"
- label="High"
- label_width="37"
- layout="topleft"
- left="10"
- max_val="500"
- min_val="-500"
- name="height_range_spin_2"
- top_delta="20"
- width="100" />
- <spinner
+<!-- northwest high-->
+ <spinner
+ follows="left|top"
+ height="20"
+ increment="0.5"
+ label="High"
+ label_width="37"
+ layout="topleft"
+ left="10"
+ max_val="500"
+ min_val="-500"
+ name="height_range_spin_1"
+ top_delta="20"
+ width="100" />
+<!-- northeast high-->
+ <spinner
follows="left|top"
height="20"
increment="0.5"
@@ -284,18 +216,94 @@
name="height_range_spin_3"
top_delta="0"
width="100" />
- <text
- follows="left|top"
- height="20"
- layout="topleft"
- left="10"
- name="height_text_lbl10"
- top_delta="30"
- width="400"
- word_wrap="true">
- These values represent the blend range for the textures above.
- </text>
- <text
+ <text
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left="51"
+ name="height_text_lbl8"
+ top_pad="10"
+ width="100">
+ Southwest
+ </text>
+ <text
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left_pad="10"
+ name="height_text_lbl9"
+ top_delta="0"
+ width="100">
+ Southeast
+ </text>
+<!-- southwest low-->
+ <spinner
+ follows="left|top"
+ height="20"
+ increment="0.5"
+ label="Low"
+ label_width="37"
+ layout="topleft"
+ left="10"
+ max_val="500"
+ min_val="-500"
+ name="height_start_spin_0"
+ top_delta="15"
+ width="100" />
+<!-- southeast low-->
+ <spinner
+ follows="left|top"
+ height="20"
+ increment="0.5"
+ label="Low"
+ label_width="37"
+ layout="topleft"
+ left_pad="10"
+ max_val="500"
+ min_val="-500"
+ name="height_start_spin_2"
+ top_delta="0"
+ width="100" />
+<!--southwest high-->
+ <spinner
+ follows="left|top"
+ height="20"
+ increment="0.5"
+ label="High"
+ label_width="37"
+ layout="topleft"
+ left="10"
+ max_val="500"
+ min_val="-500"
+ name="height_range_spin_0"
+ top_delta="20"
+ width="100" />
+<!-- southeast high-->
+ <spinner
+ follows="left|top"
+ height="20"
+ increment="0.5"
+ label="High"
+ label_width="37"
+ layout="topleft"
+ left_pad="10"
+ max_val="500"
+ min_val="-500"
+ name="height_range_spin_2"
+ top_delta="0"
+ width="100" />
+ <text
+ follows="left|top"
+ height="20"
+ layout="topleft"
+ left="10"
+ name="height_text_lbl10"
+ top_delta="30"
+ width="400"
+ word_wrap="true">
+ These values represent the blend range for the textures above.
+ </text>
+ <text
follows="left|top"
height="20"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/panel_script_ed.xml b/indra/newview/skins/default/xui/en/panel_script_ed.xml
index d14355b9f4..c5c66c04d5 100644
--- a/indra/newview/skins/default/xui/en/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/en/panel_script_ed.xml
@@ -143,7 +143,6 @@
name="Script Editor"
width="487"
show_line_numbers="true"
- handle_edit_keys_directly="true"
word_wrap="true">
Loading...
</text_editor>
@@ -178,5 +177,5 @@
top_pad="-35"
right="487"
name="Save_btn"
- width="61" />
+ width="81" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_scrolling_param.xml b/indra/newview/skins/default/xui/en/panel_scrolling_param.xml
index 44afadf65a..78d64620a5 100644
--- a/indra/newview/skins/default/xui/en/panel_scrolling_param.xml
+++ b/indra/newview/skins/default/xui/en/panel_scrolling_param.xml
@@ -1,34 +1,38 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
- height="152"
+ height="157"
layout="topleft"
left="0"
name="LLScrollingPanelParam"
top="152"
- width="270">
+ width="290">
<text
follows="left|top"
height="16"
layout="topleft"
- left="4"
+ left="12"
name="min param text"
- top="116"
- width="128" />
+ text_color="EmphasisColor"
+ font_shadow="hard"
+ top="120"
+ width="120" />
<text
follows="left|top"
height="16"
layout="topleft"
- left_pad="6"
+ left="155"
name="max param text"
+ text_color="EmphasisColor"
+ font_shadow="hard"
top_delta="0"
- width="128" />
+ width="120" />
<text
type="string"
length="1"
follows="left|top"
height="16"
layout="topleft"
- left="8"
+ left="12"
name="Loading..."
top="11"
width="128">
@@ -40,12 +44,42 @@
follows="left|top"
height="16"
layout="topleft"
- left_pad="6"
+ left="155"
name="Loading...2"
top_delta="0"
width="128">
Loading...
</text>
+ <view_border
+ layout="topleft"
+ follows="left|top"
+ left="7"
+ top="5"
+ width="132"
+ height="132"
+ thickness="2"
+ shadow_light_color="0.3 0.3 0.3 1"
+ highlight_light_color="0.3 0.3 0.3 1"
+ highlight_dark_color="0.3 0.3 0.3 1"
+ shadow_dark_color="0.3 0.3 0.3 1"
+ bevel_style="in"
+ name="left_border"
+ />
+ <view_border
+ layout="topleft"
+ follows="left|top"
+ left_pad="10"
+ top_delta="0"
+ width="132"
+ height="132"
+ thickness="2"
+ shadow_light_color="0.3 0.3 0.3 1"
+ highlight_light_color="0.3 0.3 0.3 1"
+ highlight_dark_color="0.3 0.3 0.3 1"
+ shadow_dark_color="0.3 0.3 0.3 1"
+ bevel_style="in"
+ name="right_border"
+ />
<button
enabled="false"
height="132"
@@ -54,10 +88,10 @@
image_selected="PushButton_Selected"
image_unselected="PushButton_Off"
layout="topleft"
- left="2"
+ left="7"
name="less"
tab_stop="false"
- top="0"
+ top="5"
width="132" />
<button
enabled="false"
@@ -67,7 +101,7 @@
image_selected="PushButton_Selected"
image_unselected="PushButton_Off"
layout="topleft"
- left_pad="2"
+ left_pad="10"
name="more"
tab_stop="false"
top_delta="0"
@@ -80,11 +114,11 @@
increment="1"
initial_value="0"
label="[DESC]"
- label_width="100"
- layout="topleft"
+ layout="bottom|left"
left="6"
max_val="100"
name="param slider"
- top="134"
- width="258" />
+ bottom="1"
+ width="274"
+ slider_label.font.style="BOLD" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_side_tray.xml b/indra/newview/skins/default/xui/en/panel_side_tray.xml
index eb95de3a7c..6ef93406ec 100644
--- a/indra/newview/skins/default/xui/en/panel_side_tray.xml
+++ b/indra/newview/skins/default/xui/en/panel_side_tray.xml
@@ -54,12 +54,19 @@
mouse_opaque="false"
background_visible="true"
>
+ <panel_container
+ name="panel_container"
+ default_panel_name="panel_me"
+ width="333"
+ >
<panel
class="panel_me"
name="panel_me"
filename="panel_me.xml"
label="Me"
/>
+
+ </panel_container>
</sidetray_tab>
<sidetray_tab
diff --git a/indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml
index b48943c699..07642946f8 100644
--- a/indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml
+++ b/indra/newview/skins/default/xui/en/panel_stand_stop_flying.xml
@@ -6,25 +6,27 @@
name="panel_stand_stop_flying"
mouse_opaque="false"
visible="true"
- width="115">
+ width="133">
<button
follows="left|bottom"
height="19"
label="Stand"
layout="topleft"
+ left="10"
name="stand_btn"
tool_tip="Click here to stand up."
top="2"
visible="false"
- width="115" />
+ width="113" />
<button
follows="left|bottom"
height="19"
label="Stop Flying"
layout="topleft"
+ left="10"
name="stop_fly_btn"
tool_tip="Stop flying"
top="2"
visible="false"
- width="115" />
+ width="113" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_status_bar.xml b/indra/newview/skins/default/xui/en/panel_status_bar.xml
index 5754f67045..43513e1ab6 100644
--- a/indra/newview/skins/default/xui/en/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_status_bar.xml
@@ -3,6 +3,7 @@
background_opaque="true"
background_visible="true"
bg_opaque_color="MouseGray"
+ chrome="true"
follows="top|right"
height="19"
layout="topleft"
@@ -10,6 +11,7 @@
mouse_opaque="false"
name="status"
top="19"
+ tab_stop="false"
width="1000">
<panel.string
name="StatBarDaysOfWeek">
@@ -39,41 +41,50 @@
name="buycurrencylabel">
L$ [AMT]
</panel.string>
- <button
+ <panel
+ height="18"
+ left="-315"
+ width="95"
+ top="1"
+ follows="right|top"
+ name="balance_bg"
+ bg_visible="true"
+ background_opaque="true"
+ bg_opaque_image="bevel_background">
+ <text
auto_resize="true"
- halign="right"
+ halign="center"
font="SansSerifSmall"
- follows="right|top"
- image_overlay=""
- image_selected="spacer35.tga"
- image_unselected="spacer35.tga"
- image_pressed="spacer35.tga"
- height="16"
- right="-204"
- label_shadow="false"
- name="buycurrency"
+ follows="all"
+ height="18"
+ left="0"
+ name="balance"
tool_tip="My Balance"
- top="3"
- width="100" />
+ v_pad="4"
+ top="0"
+ wrap="false"
+ value="L$20"
+ width="40" />
<button
auto_resize="true"
- halign="right"
+ halign="center"
font="SansSerifSmall"
- follows="right|top"
- image_selected="BuyArrow_Over"
- image_unselected="BuyArrow_Over"
- image_pressed="BuyArrow_Press"
- height="16"
- label="Buy L$"
- label_color="EmphasisColor"
+ follows="right|top|bottom"
+ image_hover_unselected="buy_over"
+ image_unselected="buy_off"
+ image_pressed="buy_press"
+ height="18"
+ label="BUY L$"
+ label_color="White"
left_pad="0"
- label_shadow="false"
+ label_shadow="true"
name="buyL"
- pad_right="20"
+ pad_right="0"
pad_bottom="2"
tool_tip="Click to buy more L$"
- top="2"
- width="71" />
+ top="0"
+ width="55" />
+ </panel>
<text
type="string"
font="SansSerifSmall"
@@ -86,17 +97,31 @@
left_pad="0"
name="TimeText"
tool_tip="Current time (Pacific)"
- width="89">
+ width="145">
24:00 AM PST
</text>
<button
follows="right|top"
- height="15"
+ height="16"
+ image_selected="Play_Off"
+ image_unselected="Pause_Off"
+ image_pressed="Pause_Press"
+ image_pressed_selected="Play_Press"
+ is_toggle="true"
+ left_pad="15"
+ top="1"
+ name="media_toggle_btn"
+ tool_tip="Start/Stop All Media (Music, Video, Web pages)"
+ width="16" >
+ </button>
+ <button
+ follows="right|top"
+ height="16"
image_selected="AudioMute_Off"
image_pressed="Audio_Press"
image_unselected="Audio_Off"
is_toggle="true"
- left_pad="18"
+ left_pad="5"
top="2"
name="volume_btn"
tool_tip="Global Volume Control"
diff --git a/indra/newview/skins/default/xui/en/panel_teleport_history.xml b/indra/newview/skins/default/xui/en/panel_teleport_history.xml
index 06da64533b..daa4356c83 100644
--- a/indra/newview/skins/default/xui/en/panel_teleport_history.xml
+++ b/indra/newview/skins/default/xui/en/panel_teleport_history.xml
@@ -1,15 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="Teleport History" bottom="0" height="326" left="0" width="380"
+<panel name="Teleport History" bottom="0" height="400" left="0" width="313"
help_topic="panel_teleport_history"
- border="true" follows="left|top|right|bottom">
+ border="false" follows="left|top|right|bottom"
+ background_visible="true"
+ bg_alpha_color="DkGray">
<accordion
+ no_matched_tabs_text.value="Didn't find what you're looking for? Try [secondlife:///app/search/places/[SEARCH_TERM] Search]."
+ no_visible_tabs_text.value="Teleport history is empty. Try [secondlife:///app/search/places/ Search]."
follows="left|top|right|bottom"
- height="300"
+ height="373"
layout="topleft"
- left="0"
+ left="3"
top="0"
name="history_accordion"
- width="380">
+ background_visible="true"
+ bg_alpha_color="DkGray2"
+ width="307">
<accordion_tab
layout="topleft"
name="today"
@@ -21,7 +27,7 @@
left="0"
name="today_items"
top="0"
- width="380">
+ width="307">
</flat_list_view>
</accordion_tab>
<accordion_tab
@@ -35,7 +41,7 @@
left="0"
name="yesterday_items"
top="0"
- width="380">
+ width="307">
</flat_list_view>
</accordion_tab>
<accordion_tab
@@ -49,7 +55,7 @@
left="0"
name="2_days_ago"
top="0"
- width="380">
+ width="307">
</flat_list_view>
</accordion_tab>
<accordion_tab
@@ -63,7 +69,7 @@
left="0"
name="3_days_ago"
top="0"
- width="380">
+ width="307">
</flat_list_view>
</accordion_tab>
<accordion_tab
@@ -77,7 +83,7 @@
left="0"
name="4_days_ago"
top="0"
- width="380">
+ width="307">
</flat_list_view>
</accordion_tab>
<accordion_tab
@@ -91,7 +97,7 @@
left="0"
name="5_days_ago_items"
top="0"
- width="380">
+ width="307">
</flat_list_view>
</accordion_tab>
<accordion_tab
@@ -105,7 +111,7 @@
left="0"
name="6_days_and_older_items"
top="0"
- width="380">
+ width="307">
</flat_list_view>
</accordion_tab>
<accordion_tab
@@ -119,7 +125,7 @@
left="0"
name="1_month_and_older_items"
top="0"
- width="380">
+ width="307">
</flat_list_view>
</accordion_tab>
<accordion_tab
@@ -133,33 +139,41 @@
left="0"
name="6_months_and_older_items"
top="0"
- width="380">
+ width="307">
</flat_list_view>
</accordion_tab>
</accordion>
<panel
background_visible="true"
bevel_style="none"
- top_pad="0"
+ bottom="0"
follows="left|right|bottom"
- height="30"
- label="bottom_panel"
- layout="topleft"
- left="0"
+ height="27"
+ layout="bottomleft"
+ left="3"
name="bottom_panel"
- width="380">
+ width="313">
<button
follows="bottom|left"
- font="SansSerifBigBold"
- tool_tip="Show additional optioins"
- height="18"
- image_disabled="OptionsMenu_Disabled"
- image_selected="OptionsMenu_Press"
- image_unselected="OptionsMenu_Off"
+ tool_tip="Show additional options"
+ height="25"
+ image_hover_unselected="Toolbar_Left_Over"
+ image_overlay="OptionsMenu_Off"
+ image_selected="Toolbar_Left_Selected"
+ image_unselected="Toolbar_Left_Off"
layout="topleft"
- left="10"
+ left="0"
name="gear_btn"
- top="5"
- width="18" />
+ top="1"
+ width="31" />
+ <icon
+ follows="bottom|left"
+ height="25"
+ image_name="Toolbar_Right_Off"
+ layout="topleft"
+ left_pad="1"
+ name="dummy_icon"
+ width="273"
+ />
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_toast.xml b/indra/newview/skins/default/xui/en/panel_toast.xml
index bfe3cce7d0..92b4c17247 100644
--- a/indra/newview/skins/default/xui/en/panel_toast.xml
+++ b/indra/newview/skins/default/xui/en/panel_toast.xml
@@ -3,17 +3,25 @@
<!-- Don't remove floater's height! It is needed for Overflow and Start-Up toasts!-->
+<!--
+ This floater is invisible. To make toast look like a floater we render wrapper_panel
+ like a floater(draw shadows and so on). This is done with one purpose - make close button
+ look like it is positioned out of floater and able to accept mouse clicks (see EXT-4246)
+-->
+
<floater
- legacy_header_height="18"
+ legacy_header_height="0"
+ header_height="0"
name="toast"
title=""
visible="false"
layout="topleft"
- height="40"
- width="305"
+ height="47"
+ width="310"
left="0"
top="0"
follows="right|bottom"
+ background_visible="false"
bg_opaque_image="Toast_Over"
bg_alpha_image="Toast_Background"
can_minimize="false"
@@ -27,12 +35,27 @@
drop_shadow_visible = "false"
border = "false"
>
+ <panel
+ background_opaque="false"
+ border_visible="false"
+ background_visible="true"
+ bg_opaque_image="Toast_Over"
+ bg_alpha_image="Toast_Background"
+ label="wrapper_panel"
+ layout="topleft"
+ left="0"
+ name="wrapper_panel"
+ top="7"
+ height="40"
+ follows="all"
+ translate="false"
+ width="305">
<!-- Don't remove this wiget! It is needed for Overflow and Start-Up toasts!-->
<text
clip_partial="true"
visible="false"
follows="left|top|right|bottom"
- font="SansSerifBold"
+ font="SansSerif"
height="20"
layout="topleft"
left="20"
@@ -41,15 +64,15 @@
text_color="white"
top="5"
translate="false"
- v_pad="5"
use_ellipses="true"
width="260">
Toast text;
</text>
+ </panel>
<button
layout="topleft"
- top="-14"
- left="293"
+ top="0"
+ right="310"
width="17"
height="17"
follows="top|right"
diff --git a/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml b/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml
new file mode 100644
index 0000000000..d3fb77f135
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_topinfo_bar.xml
@@ -0,0 +1,102 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<panel
+ background_visible="true"
+ background_opaque="false"
+ bg_opaque_color="Black_50"
+ bg_alpha_color="Black_50"
+ follows="left|top|right"
+ height="19"
+ layout="topleft"
+ name="topinfo_bar"
+ width="1024">
+ <button
+ border="true"
+ follows="left|top"
+ height="16"
+ hover_glow_amount="0.15"
+ image_disabled="Info_Off"
+ image_disabled_selected="Info_Off"
+ image_selected="Info_Off"
+ image_unselected="Info_Off"
+ left="11"
+ name="place_info_btn"
+ top="1"
+ width="16"/>
+ <text
+ follows="left|top|right"
+ font="DejaVu"
+ height="16"
+ layout="topleft"
+ left_pad="11"
+ length="1"
+ name="parcel_info_text"
+ top="1"
+ type="string"
+ width="1"/>
+ <icon
+ enabled="true"
+ follows="right|top"
+ height="18"
+ image_name="Parcel_VoiceNo_Light"
+ name="voice_icon"
+ top="1"
+ visible="false"
+ width="22"
+ />
+ <icon
+ follows="right|top"
+ height="18"
+ image_name="Parcel_FlyNo_Light"
+ name="fly_icon"
+ top="1"
+ visible="false"
+ width="22"
+ />
+ <icon
+ follows="right|top"
+ height="18"
+ image_name="Parcel_PushNo_Light"
+ name="push_icon"
+ top="1"
+ visible="false"
+ width="22"
+ />
+ <icon
+ follows="right|top"
+ height="18"
+ image_name="Parcel_BuildNo_Light"
+ name="build_icon"
+ top="1"
+ visible="false"
+ width="22"
+ />
+ <icon
+ follows="right|top"
+ height="18"
+ image_name="Parcel_ScriptsNo_Light"
+ name="scripts_icon"
+ top="1"
+ visible="false"
+ width="22"
+ />
+ <icon
+ follows="right|top"
+ height="13"
+ image_name="Parcel_Health_Dark"
+ left="2"
+ name="damage_icon"
+ top="3"
+ visible="false"
+ width="14"
+ />
+ <text
+ follows="right|top"
+ font="SansSerifSmall"
+ halign="right"
+ height="18"
+ name="damage_text"
+ top="5"
+ visible="false"
+ width="35"
+ />
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_voice_effect.xml b/indra/newview/skins/default/xui/en/panel_voice_effect.xml
new file mode 100644
index 0000000000..93e79b7328
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_voice_effect.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ follows="all"
+ height="26"
+ layout="topleft"
+ name="panel_voice_effect"
+ width="200">
+ <string name="no_voice_effect">
+ Voice Morphing Off
+ </string>
+ <string name="preview_voice_effects">
+ Preview Voice Morphing â–¶
+ </string>
+ <string name="get_voice_effects">
+ Get Voice Morphing â–¶
+ </string>
+ <combo_box
+ enabled="false"
+ follows="left|top|right"
+ height="23"
+ name="voice_effect"
+ tool_tip="Select a Voice Morph to change your voice"
+ top_pad="0"
+ width="200">
+ <combo_box.item
+ label="Voice Morphing Off"
+ name="no_voice_effect"
+ top_pad="0"
+ value="0" />
+ <combo_box.commit_callback
+ function="Voice.CommitVoiceEffect" />
+ </combo_box>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml b/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml
index 60d4a7e00b..7b22b2cce1 100644
--- a/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml
+++ b/indra/newview/skins/default/xui/en/panel_volume_pulldown.xml
@@ -1,24 +1,17 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
background_opaque="true"
- background_visible="false"
+ background_visible="true"
+ bg_opaque_image="Volume_Background"
+ bg_alpha_image="Volume_Background"
border_visible="false"
border="false"
- chrome="true"
+ chrome="true"
follows="bottom"
height="150"
layout="topleft"
name="volumepulldown_floater"
width="32">
- <!-- floater background image -->
- <icon
- height="150"
- image_name="Inspector_Background"
- layout="topleft"
- left="0"
- name="normal_background"
- top="0"
- width="32" />
<slider
control_name="AudioLevelMaster"
follows="left|top"
@@ -39,9 +32,9 @@
parameter="MuteAudio" />
</slider>
<button
- left="7"
+ left="10"
top_pad="9"
- width="18"
+ width="12"
height="12"
follows="top|left"
name="prefs_btn"
diff --git a/indra/newview/skins/default/xui/en/panel_world_map.xml b/indra/newview/skins/default/xui/en/panel_world_map.xml
index 9f08d3a817..16860a6117 100644
--- a/indra/newview/skins/default/xui/en/panel_world_map.xml
+++ b/indra/newview/skins/default/xui/en/panel_world_map.xml
@@ -45,6 +45,14 @@
name="world_map_northwest">
NW
</panel.string>
+ <panel.string
+ name="world_map_person">
+ 1 person
+ </panel.string>
+ <panel.string
+ name="world_map_people">
+ [NUMBER] people
+ </panel.string>
<text
type="string"
length="1"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
index bde45a9487..e189d11d35 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_appearance.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
background_visible="true"
+default_tab_group="1"
follows="all"
height="570"
label="Outfits"
@@ -14,83 +15,117 @@ width="333">
<string
name="No Outfit"
value="No Outfit" />
+ <string
+ name="Unsaved Changes"
+ value="Unsaved changes" />
+ <string
+ name="Now Wearing"
+ value="Now wearing..." />
<panel
- left="0"
- top="0"
- follows="all"
+ background_opaque="true"
+ background_visible="true"
+ bg_opaque_color="DkGray2"
+ left="10"
+ top="5"
+ follows="left|top|right"
layout="topleft"
- width="330"
+ width="303"
height="33"
name="panel_currentlook"
>
<button
follows="left|top"
- top="0" width="1" height="1"
+ left="205" top="7" width="20" height="20"
+ label="E"
layout="topleft"
- left="0"
- name="editappearance_btn" />
+ name="editappearance_btn"
+ visible="false" />
<button
follows="left|top"
- top="0" width="1" height="1"
+ left="235" top="7" width="20" height="20"
+ label="O"
layout="topleft"
- left="0"
- name="openoutfit_btn" />
+ name="openoutfit_btn"
+ visible="false" />
<icon
follows="top|left"
- height="30"
+ height="32"
image_name="TabIcon_Appearance_Off"
name="outfit_icon"
mouse_opaque="false"
visible="true"
- left="5"
+ left="0"
top="0"
- width="30" />
+ width="32" />
<text
- font="SansSerifHugeBold"
- height="20"
- left_pad="5"
- text_color="LtGray"
+ font="SansSerifSmallBold"
+ text_color="EmphasisColor"
+ width="300"
+ height="10"
+ follows="top|left"
+ layout="topleft"
+ left="35"
top="3"
+ mouse_opaque="false"
+ name="currentlook_status" >
+ (Status)
+ </text>
+ <text
+ font="SansSerifLargeBold"
+ height="20"
+ left="35"
+ text_color="White"
+ top="15"
use_ellipses="true"
- width="305"
+ width="230"
follows="top|left"
- word_wrap="true"
+ word_wrap="false"
mouse_opaque="false"
name="currentlook_name">
MyOutfit With a really Long Name like MOOSE
</text>
- <text
- font="SansSerifSmall"
- text_color="White_50"
- width="300"
- height="1"
- follows="top|left"
+ <button
+ follows="left|top"
+ height="23"
+ image_overlay="Edit_Wrench"
+ label=""
layout="topleft"
- top_pad="5"
- mouse_opaque="false"
- name="currentlook_title" >
- (unsaved)
- </text>
+ left="265"
+ name="edit_outfit_btn"
+ tool_tip="Edit this outfit"
+ top="7"
+ width="30" />
+ <loading_indicator
+ follows="left|top"
+ height="24"
+ layout="topleft"
+ left="268"
+ name="wearables_loading_indicator"
+ top="6"
+ width="24" />
</panel>
<filter_editor
height="23"
follows="left|top|right"
layout="topleft"
- left="15"
+ left="10"
label="Filter Outfits"
max_length="300"
name="Filter"
+ search_button_visible="true"
top_pad="10"
width="303" />
<panel
class="panel_outfits_inventory"
filename="panel_outfits_inventory.xml"
name="panel_outfits_inventory"
- height="505"
+ height="493"
min_height="410"
width="320"
+ visible="false"
left="0"
- top_pad="0"
+ tab_group="1"
+ top_pad="6"
follows="all" />
<!-- <button
follows="bottom|left"
@@ -102,14 +137,17 @@ width="333">
name="newlook_btn"
width="100" />-->
<panel
- class="panel_look_info"
- filename="panel_look_info.xml"
+ class="panel_outfit_edit"
+ filename="panel_outfit_edit.xml"
+ height="565"
follows="all"
layout="topleft"
- left="0"
- name="panel_look_info"
- top="35"
- visible="false" />
+ left="5"
+ min_height="410"
+ name="panel_outfit_edit"
+ top="2"
+ visible="false"
+ width="320"/>
<panel
class="panel_edit_wearable"
filename="panel_edit_wearable.xml"
@@ -117,6 +155,6 @@ width="333">
layout="topleft"
left="0"
name="panel_edit_wearable"
- top="35"
+ top="0"
visible="false" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
index fb5f9d2ec8..6c9acae35e 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_inventory.xml
@@ -32,10 +32,10 @@
width="330" />
<panel
height="25"
- layout="bottomright"
+ layout="topleft"
name="button_panel"
- left="5"
- bottom="5"
+ left="9"
+ top_pad="-2"
width="313">
<button
enabled="true"
@@ -45,18 +45,42 @@
layout="topleft"
left="0"
name="info_btn"
+ tool_tip="Show object profile"
+ top="0"
+ width="102" />
+ <button
+ enabled="true"
+ follows="bottom|left"
+ height="23"
+ label="Share"
+ layout="topleft"
+ left="105"
+ name="share_btn"
+ tool_tip="Share an inventory item"
+ top="0"
+ width="102" />
+ <button
+ enabled="true"
+ follows="bottom|left"
+ height="23"
+ label="Shop"
+ layout="topleft"
+ left="210"
+ name="shop_btn"
+ tool_tip="Open Marketplace webpage"
top="0"
- width="100" />
+ width="102" />
<button
enabled="false"
follows="bottom|left"
height="23"
label="Wear"
layout="topleft"
- left="130"
+ left="210"
name="wear_btn"
+ tool_tip="Wear seleceted outfit"
top="0"
- width="100" />
+ width="102" />
<button
enabled="false"
follows="bottom|left"
@@ -64,19 +88,20 @@
label="Play"
layout="topleft"
name="play_btn"
- left="130"
+ left="210"
top="0"
- width="80" />
+ width="102" />
<button
enabled="false"
follows="bottom|left"
height="23"
label="Teleport"
layout="topleft"
- left="130"
+ left="210"
name="teleport_btn"
+ tool_tip="Teleport to the selected area"
top="0"
- width="100" />
+ width="102" />
</panel>
</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 18b59741bf..b3bc618eec 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
@@ -40,23 +40,25 @@
width="18" />
<button
follows="top|right"
- height="23"
- image_overlay="BackArrow_Off"
+ height="24"
+ image_hover_unselected="BackButton_Over"
+ image_pressed="BackButton_Press"
+ image_unselected="BackButton_Off"
layout="topleft"
- left="10"
+ left="12"
name="back_btn"
tab_stop="false"
- top="0"
- width="23" />
+ top="2"
+ width="30" />
<text
follows="top|left|right"
font="SansSerifHugeBold"
height="26"
layout="topleft"
- left_pad="10"
+ left_pad="3"
name="title"
text_color="LtGray"
- top="0"
+ top="2"
use_ellipses="true"
value="Object Profile"
width="275" />
@@ -71,10 +73,10 @@
width="150" />
<panel
follows="all"
- height="490"
+ height="493"
label=""
layout="topleft"
- left="10"
+ left="9"
help_topic=""
top="45"
width="313"
@@ -157,59 +159,59 @@
name="LabelCreatorName"
top_delta="6"
width="140">
- Nicole Linden
- </text>
- <button
- follows="top|right"
- height="23"
- label="Profile"
- layout="topleft"
- right="-1"
- name="BtnCreator"
- top_delta="-6"
- width="78" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="23"
- layout="topleft"
- left="5"
- name="LabelOwnerTitle"
- top_pad="10"
- 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"
- follows="left|right|top"
- font="SansSerifSmall"
- height="15"
- layout="topleft"
- left_pad="5"
- name="LabelOwnerName"
- top_delta="6"
- width="140">
- Thrax Linden
- </text>
+ </text>
+ <button
+ follows="top|right"
+ height="16"
+ image_selected="Inspector_I"
+ image_unselected="Inspector_I"
+ layout="topleft"
+ right="-5"
+ name="BtnCreator"
+ top_delta="-6"
+ width="16" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left="5"
+ name="LabelOwnerTitle"
+ top_pad="10"
+ 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"
+ follows="left|right|top"
+ font="SansSerifSmall"
+ height="15"
+ layout="topleft"
+ left_pad="5"
+ name="LabelOwnerName"
+ top_delta="6"
+ width="140">
+ </text>
<button
follows="top|right"
- height="23"
- label="Profile"
+ height="16"
+ image_selected="Inspector_I"
+ image_unselected="Inspector_I"
layout="topleft"
- right="-1"
+ right="-5"
name="BtnOwner"
top_delta="-3"
- width="78" />
+ width="16" />
<text
type="string"
length="1"
@@ -232,15 +234,12 @@ top_pad="10"
name="LabelAcquiredDate"
top_delta="0"
width="222">
- Wed May 24 12:50:46 2006
</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"
@@ -393,17 +392,17 @@ top_pad="10"
label_width="75"
left="120"
width="170"
- min_val="1"
+ min_val="0"
height="23"
max_val="999999999"
top_pad="10"/>
</panel>
<panel
height="30"
- layout="bottomright"
+ layout="topleft"
name="button_panel"
left="5"
- bottom="2"
+ top_pad="0"
width="313">
<button
height="23"
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 d2c9e56bc3..faa1ae4e8b 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_task_info.xml
@@ -58,14 +58,16 @@
</panel.string>
<button
follows="top|right"
- height="23"
- image_overlay="BackArrow_Off"
+ height="24"
+ image_hover_unselected="BackButton_Over"
+ image_pressed="BackButton_Press"
+ image_unselected="BackButton_Off"
layout="topleft"
- left="10"
+ left="8"
name="back_btn"
tab_stop="false"
top="0"
- width="23" />
+ width="30" />
<text
follows="top|left|right"
font="SansSerifHuge"
@@ -77,7 +79,7 @@
top="0"
use_ellipses="true"
value="Object Profile"
- width="275" />
+ width="290" />
<text
follows="top|left"
height="13"
@@ -94,6 +96,7 @@
layout="topleft"
left="10"
help_topic=""
+ name="properties_panel"
top="45"
width="313"
background_visible="true"
@@ -302,7 +305,7 @@
follows="left|top|right"
layout="topleft"
name="perm_modify"
- width="200">
+ width="310">
You can modify this object
</text>
<text
@@ -549,5 +552,16 @@
name="buy_btn"
top="0"
width="100" />
+ <button
+ follows="bottom|left"
+ height="23"
+ label="Details"
+ layout="topleft"
+ left="5"
+ name="details_btn"
+ top="0"
+ width="100"
+ visible="false" />
+
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index d6db451286..68eea8dc9a 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -14,7 +14,14 @@
<!-- starting up -->
<string name="StartupDetectingHardware">Detecting hardware...</string>
- <string name="StartupLoading">Loading</string>
+ <string name="StartupLoading">Loading [APP_NAME]...</string>
+ <string name="StartupClearingCache">Clearing cache...</string>
+ <string name="StartupInitializingTextureCache">Initializing Texture Cache...</string>
+ <string name="StartupInitializingVFS">Initializing VFS...</string>
+
+ <!-- progress -->
+ <string name="ProgressRestoring">Restoring...</string>
+ <string name="ProgressChangingResolution">Changing Resolution...</string>
<!-- Legacy strings, almost never used -->
<string name="Fullbright">Fullbright (Legacy)</string> <!-- used in the Build > materials dropdown-->
@@ -39,13 +46,26 @@
<string name="LoginWaitingForRegionHandshake">Waiting for region handshake...</string>
<string name="LoginConnectingToRegion">Connecting to region...</string>
<string name="LoginDownloadingClothing">Downloading clothing...</string>
+ <string name="InvalidCertificate">The server returned an invalid or corrupt certificate. Please contact the Grid administrator.</string>
+ <string name="CertInvalidHostname">An invalid hostname was used to access the server, please check your SLURL or Grid hostname.</string>
+ <string name="CertExpired">The certificate returned by the Grid appears to be expired. Please check your system clock, or contact your Grid administrator.</string>
+ <string name="CertKeyUsage">The certificate returned by the server could not be used for SSL. Please contact your Grid administrator.</string>
+ <string name="CertBasicConstraints">Too many certificates were in the servers Certificate chain. Please contact your Grid administrator.</string>
+ <string name="CertInvalidSignature">The certificate signature returned by the Grid server could not be verified. Please contact your Grid administrator.</string>
+
<string name="LoginFailedNoNetwork">Network Error: Could not establish connection, please check your network connection.</string>
+ <string name="LoginFailed">Login failed.</string>
<string name="Quit">Quit</string>
<string name="create_account_url">http://join.secondlife.com/</string>
<!-- Disconnection -->
<string name="AgentLostConnection">This region may be experiencing trouble. Please check your connection to the Internet.</string>
-
+ <string name="SavingSettings">Saving your settings...</string>
+ <string name="LoggingOut">Logging out...</string>
+ <string name="ShuttingDown">Shutting down...</string>
+ <string name="YouHaveBeenDisconnected">You have been disconnected from the region you were in.</string>
+ <string name="SentToInvalidRegion">You were sent to an invalid region.</string>
+ <string name="TestingDisconnect">Testing viewer disconnect</string>
<!-- Tooltip, lltooltipview.cpp -->
<string name="TooltipPerson">Person</string><!-- Object under mouse pointer is an avatar -->
@@ -68,6 +88,12 @@
<string name="TooltipHttpUrl">Click to view this web page</string>
<string name="TooltipSLURL">Click to view this location's information</string>
<string name="TooltipAgentUrl">Click to view this Resident's profile</string>
+ <string name="TooltipAgentMute">Click to mute this Resident</string>
+ <string name="TooltipAgentUnmute">Click to unmute this Resident</string>
+ <string name="TooltipAgentIM">Click to IM this Resident</string>
+ <string name="TooltipAgentPay">Click to Pay this Resident</string>
+ <string name="TooltipAgentOfferTeleport">Click to offer a teleport request to this Resident</string>
+ <string name="TooltipAgentRequestFriend">Click to send a friend request to this Resident</string>
<string name="TooltipGroupUrl">Click to view this group's description</string>
<string name="TooltipEventUrl">Click to view this event's description</string>
<string name="TooltipClassifiedUrl">Click to view this classified</string>
@@ -76,15 +102,26 @@
<string name="TooltipObjectIMUrl">Click to view this object's description</string>
<string name="TooltipMapUrl">Click to view this location on a map</string>
<string name="TooltipSLAPP">Click to run the secondlife:// command</string>
- <string name="CurrentURL" value=" CurrentURL: [CurrentURL]" />
+ <string name="CurrentURL" value=" CurrentURL: [CurrentURL]" />
+ <string name="TooltipPrice" value=" L$[PRICE]-" />
+
<!-- text for SLURL labels -->
<string name="SLurlLabelTeleport">Teleport to</string>
<string name="SLurlLabelShowOnMap">Show Map for</string>
+ <!-- label strings for secondlife:///app/agent SLapps -->
+ <string name="SLappAgentMute">Mute</string>
+ <string name="SLappAgentUnmute">Unmute</string>
+ <string name="SLappAgentIM">IM</string>
+ <string name="SLappAgentPay">Pay</string>
+ <string name="SLappAgentOfferTeleport">Offer Teleport to </string>
+ <string name="SLappAgentRequestFriend">Friend Request </string>
+
<!-- ButtonToolTips, llfloater.cpp -->
<string name="BUTTON_CLOSE_DARWIN">Close (&#8984;W)</string>
<string name="BUTTON_CLOSE_WIN">Close (Ctrl+W)</string>
+ <string name="BUTTON_CLOSE_CHROME">Close</string>
<string name="BUTTON_RESTORE">Restore</string>
<string name="BUTTON_MINIMIZE">Minimize</string>
<string name="BUTTON_TEAR_OFF">Tear Off</string>
@@ -99,7 +136,7 @@
<string name="RetrievingData">Retrieving...</string>
<string name="ReleaseNotes">Release Notes</string>
- <string name="RELEASE_NOTES_BASE_URL">http://secondlife.com/app/releasenotes/</string>
+ <string name="RELEASE_NOTES_BASE_URL">http://wiki.secondlife.com/wiki/Release_Notes/</string>
<!-- Indicates something is being loaded. Maybe should be merged with RetrievingData -->
<string name="LoadingData">Loading...</string>
@@ -118,6 +155,8 @@
<!-- Group name: text shown for LLUUID::null -->
<string name="GroupNameNone">(none)</string>
+ <string name="AvalineCaller">Avaline Caller [ORDER]</string>
+
<!-- Asset errors. Used in llassetstorage.cpp, translation from error code to error message. -->
<string name="AssetErrorNone">No error</string>
<string name="AssetErrorRequestFailed">Asset request: failed</string>
@@ -132,6 +171,7 @@
<string name="AssetErrorUnknownStatus">Unknown status</string>
<!-- Asset Type human readable names: these will replace variable [TYPE] in notification FailedToFindWearable* -->
+ <!-- Will also replace [OBJECTTYPE] in notifications: UserGiveItem, ObjectGiveItem -->
<string name="texture">texture</string>
<string name="sound">sound</string>
<string name="calling card">calling card</string>
@@ -156,6 +196,7 @@
<string name="simstate">simstate</string>
<string name="favorite">favorite</string>
<string name="symbolic link">link</string>
+ <string name="symbolic folder link">folder link</string>
<!-- llvoavatar. Displayed in the avatar chat bubble -->
<string name="AvatarEditingAppearance">(Editing Appearance)</string>
@@ -251,6 +292,7 @@
<string name="connected">Connected</string>
<string name="unavailable">Voice not available at your current location</string>
<string name="hang_up">Disconnected from in-world Voice Chat</string>
+ <string name="reconnect_nearby">You will now be reconnected to Nearby Voice Chat</string>
<string name="ScriptQuestionCautionChatGranted">'[OBJECTNAME]', an object owned by '[OWNERNAME]', located in [REGIONNAME] at [REGIONPOS], has been granted permission to: [PERMISSIONS].</string>
<string name="ScriptQuestionCautionChatDenied">'[OBJECTNAME]', an object owned by '[OWNERNAME]', located in [REGIONNAME] at [REGIONPOS], has been denied permission to: [PERMISSIONS].</string>
<string name="ScriptTakeMoney">Take Linden dollars (L$) from you</string>
@@ -276,6 +318,10 @@
<!-- For use when we do not have land type back from the server -->
<string name="land_type_unknown">(unknown)</string>
+ <!-- For land type back from the simulator -->
+ <string name="Estate / Full Region">Estate / Full Region</string>
+ <string name="Mainland / Full Region">Mainland / Full Region</string>
+
<!-- File load/save dialogs -->
<string name="all_files">All Files</string>
<string name="sound_files">Sounds</string>
@@ -1767,7 +1813,25 @@ Clears (deletes) the media and all params from the given face.
<string name="alpha">Alpha</string>
<string name="tattoo">Tattoo</string>
<string name="invalid">invalid</string>
-
+
+ <!-- Not Worn Wearable Types -->
+ <string name="shirt_not_worn">Shirt not worn</string>
+ <string name="pants_not_worn">Pants not worn</string>
+ <string name="shoes_not_worn">Shoes not worn</string>
+ <string name="socks_not_worn">Socks not worn</string>
+ <string name="jacket_not_worn">Jacket not worn</string>
+ <string name="gloves_not_worn">Gloves not worn</string>
+ <string name="undershirt_not_worn">Undershirt not worn</string>
+ <string name="underpants_not_worn">Underpants not worn</string>
+ <string name="skirt_not_worn">Skirt not worn</string>
+ <string name="alpha_not_worn">Alpha not worn</string>
+ <string name="tattoo_not_worn">Tattoo not worn</string>
+ <string name="invalid_not_worn">invalid</string>
+
+ <!-- Wearable List-->
+ <string name="NewWearable">New [WEARABLE_ITEM]</string>
+ <string name="CreateNewWearable">Create [WEARABLE_TYPE]</string>
+
<!-- LLGroupNotify -->
<!-- used in the construction of a Group Notice blue dialog box, buttons, tooltip etc. Seems to be no longer utilized by code in Viewer 2.0 -->
<string name="next">Next</string>
@@ -1804,12 +1868,10 @@ Clears (deletes) the media and all params from the given face.
<string name="LeaveMouselook">Press ESC to return to World View</string>
<!-- inventory -->
- <string name="InventoryNoMatchingItems">No matching items found in inventory.</string>
- <string name="FavoritesNoMatchingItems">Drag a landmark here to add it to your favorites.</string>
- <string name="InventoryNoTexture">
- You do not have a copy of
-this texture in your inventory
- </string>
+ <string name="InventoryNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search].</string>
+ <string name="PlacesNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/places/[SEARCH_TERM] Search].</string>
+ <string name="FavoritesNoMatchingItems">Drag a landmark here to add it to your favorites.</string>
+ <string name="InventoryNoTexture">You do not have a copy of this texture in your inventory</string>
<!-- use value="" because they have preceding spaces -->
<string name="no_transfer" value=" (no transfer)" />
<string name="no_modify" value=" (no modify)" />
@@ -1820,6 +1882,7 @@ this texture in your inventory
<string name="LoadingContents">Loading contents...</string>
<string name="NoContents">No contents</string>
<string name="WornOnAttachmentPoint" value=" (worn on [ATTACHMENT_POINT])" />
+ <string name="ActiveGesture" value="[GESLABEL] (active)"/>
<!-- Inventory permissions -->
<string name="PermYes">Yes</string>
<string name="PermNo">No</string>
@@ -1834,6 +1897,7 @@ this texture in your inventory
<string name="Wave" value=" Wave " />
<string name="HelloAvatar" value=" Hello, avatar! " />
<string name="ViewAllGestures" value=" View All &gt;&gt;" />
+ <string name="GetMoreGestures" value=" Get More &gt;&gt;" />
<!-- inventory filter -->
<!-- use value="" because they have preceding spaces -->
@@ -1876,6 +1940,7 @@ this texture in your inventory
<string name="InvFolder favorite">Favorites</string>
<string name="InvFolder Current Outfit">Current Outfit</string>
<string name="InvFolder My Outfits">My Outfits</string>
+ <string name="InvFolder Accessories">Accessories</string>
<!-- are used for Friends and Friends/All folders in Inventory "Calling cards" folder. See EXT-694-->
<string name="InvFolder Friends">Friends</string>
@@ -2105,17 +2170,22 @@ this texture in your inventory
<!-- panel contents -->
<string name="PanelContentsNewScript">New Script</string>
+ <string name="PanelContentsTooltip">Content of object</string>
+
+ <!-- panel preferences general -->
+ <string name="BusyModeResponseDefault">The Resident you messaged is in &apos;busy mode&apos; which means they have requested not to be disturbed. Your message will still be shown in their IM panel for later viewing.</string>
<!-- Mute -->
- <string name="MuteByName">(by name)</string>
+ <string name="MuteByName">(By name)</string>
<string name="MuteAgent">(Resident)</string>
- <string name="MuteObject">(object)</string>
- <string name="MuteGroup">(group)</string>
+ <string name="MuteObject">(Object)</string>
+ <string name="MuteGroup">(Group)</string>
+ <string name="MuteExternal">(External)</string>
<!-- Region/Estate Covenant -->
<string name="RegionNoCovenant">There is no Covenant provided for this Estate.</string>
<string name="RegionNoCovenantOtherOwner">There is no Covenant provided for this Estate. The land on this estate is being sold by the Estate owner, not Linden Lab. Please contact the Estate Owner for sales details.</string>
- <string name="covenant_last_modified">Last Modified:</string>
+ <string name="covenant_last_modified" value="Last Modified: " /> <!-- use value="" to keep the trailing space -->
<string name="none_text" value=" (none) " />
<string name="never_text" value=" (never) " />
@@ -2128,7 +2198,8 @@ this texture in your inventory
<string name="ClassifiedUpdateAfterPublish">(will update after publish)</string>
<!-- panel picks -->
- <string name="NoPicksClassifiedsText">There are no picks/classifieds here</string>
+ <string name="NoPicksClassifiedsText">You haven't created any Picks or Classifieds. Click the Plus button below to create a Pick or Classified.</string>
+ <string name="NoAvatarPicksClassifiedsText">User has no picks or classfields</string>
<string name="PicksClassifiedsLoadingText">Loading...</string>
<!-- Multi Preview Floater -->
@@ -2163,7 +2234,8 @@ this texture in your inventory
<!-- Viewer menu -->
<string name="AcquiredItems">Acquired Items</string>
<string name="Cancel">Cancel</string>
- <string name="UploadingCosts">Uploading %s costs</string>
+ <string name="UploadingCosts">Uploading [NAME] costs L$ [AMOUNT]</string>
+ <string name="BuyingCosts">Buying this costs L$ [AMOUNT]</string>
<string name="UnknownFileExtension">
Unknown file extension .%s
Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
@@ -2854,6 +2926,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="LocationCtrlBuildTooltip">Building/dropping objects not allowed</string>
<string name="LocationCtrlScriptsTooltip">Scripts not allowed</string>
<string name="LocationCtrlDamageTooltip">Health</string>
+ <string name="LocationCtrlAdultIconTooltip">Adult Region</string>
+ <string name="LocationCtrlModerateIconTooltip">Moderate Region</string>
+ <string name="LocationCtrlGeneralIconTooltip">General Region</string>
<!-- Strings used by the (currently Linux) auto-updater app -->
<string name="UpdaterWindowTitle">
@@ -2887,6 +2962,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Failed to start viewer
</string>
+ <!-- System Messages -->
+ <string name="ItemsComingInTooFastFrom">[APP_NAME]: Items coming in too fast from [FROM_NAME], automatic preview disabled for [TIME] seconds</string>
+ <string name="ItemsComingInTooFast">[APP_NAME]: Items coming in too fast, automatic preview disabled for [TIME] seconds</string>
+
<!-- IM system messages -->
<string name="IM_logging_string">-- Instant message logging enabled --</string>
<string name="IM_typing_start_string">[NAME] is typing...</string>
@@ -2899,8 +2978,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<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="answered_call">Your call has been answered</string>
+ <string name="you_started_call">You started a voice call</string>
+ <string name="you_joined_call">You joined the voice call</string>
+ <string name="name_started_call">[NAME] started a voice call</string>
<string name="ringing-im">
Joining voice call...
@@ -3004,8 +3085,119 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
</string>
<string name="unread_chat_single">
[SOURCES] has said something new
- </string>"
+ </string>
<string name="unread_chat_multiple">
[SOURCES] have said something new
- </string>"
-</strings>
+ </string>
+ <string name="session_initialization_timed_out_error">
+ The session initialization is timed out
+ </string>
+
+ <string name="voice_morphing_url">http://secondlife.com/landing/voicemorphing</string>
+
+ <!-- Financial operations strings -->
+ <string name="paid_you_ldollars">[NAME] paid you L$[AMOUNT]</string>
+ <string name="you_paid_ldollars">You paid [NAME] L$[AMOUNT] [REASON].</string>
+ <string name="you_paid_ldollars_no_info">You paid L$[AMOUNT].</string>
+ <string name="you_paid_ldollars_no_reason">You paid [NAME] L$[AMOUNT].</string>
+ <string name="you_paid_ldollars_no_name">You paid L$[AMOUNT] [REASON].</string>
+ <string name="for a parcel of land">for a parcel of land</string>
+ <string name="for a land access pass">for a land access pass</string>
+ <string name="for deeding land">for deeding land</string>
+ <string name="to create a group">to create a group</string>
+ <string name="to join a group">to join a group</string>
+ <string name="to upload">to upload</string>
+
+ <string name="giving">Giving L$ [AMOUNT]</string>
+ <string name="uploading_costs">Uploading costs L$ [AMOUNT]</string>
+ <string name="this_costs">This costs L$ [AMOUNT]</string>
+ <string name="buying_selected_land">Buying selected land for L$ [AMOUNT]</string>
+ <string name="this_object_costs">This object costs L$ [AMOUNT]</string>
+
+ <string name="group_role_everyone">Everyone</string>
+ <string name="group_role_officers">Officers</string>
+ <string name="group_role_owners">Owners</string>
+
+ <string name="uploading_abuse_report">Uploading...
+
+Abuse Report</string>
+
+ <!-- names for new inventory items-->
+ <string name="New Shape">New Shape</string>
+ <string name="New Skin">New Skin</string>
+ <string name="New Hair">New Hair</string>
+ <string name="New Eyes">New Eyes</string>
+ <string name="New Shirt">New Shirt</string>
+ <string name="New Pants">New Pants</string>
+ <string name="New Shoes">New Shoes</string>
+ <string name="New Socks">New Socks</string>
+ <string name="New Jacket">New Jacket</string>
+ <string name="New Gloves">New Gloves</string>
+ <string name="New Undershirt">New Undershirt</string>
+ <string name="New Underpants">New Underpants</string>
+ <string name="New Skirt">New Skirt</string>
+ <string name="New Alpha">New Alpha</string>
+ <string name="New Tattoo">New Tattoo</string>
+ <string name="Invalid Wearable">Invalid Wearable</string>
+ <string name="New Script">New Script</string>
+ <string name="New Folder">New Folder</string>
+ <string name="Contents">Contents</string>
+ <string name="Gesture">Gesture</string>
+ <string name="Male Gestures">Male Gestures</string>
+ <string name="Female Gestures">Female Gestures</string>
+ <string name="Other Gestures">Other Gestures</string>
+ <string name="Speech Gestures">Speech Gestures</string>
+ <string name="Common Gestures">Common Gestures</string>
+ <!-- gestures -->
+ <string name="Male - Excuse me">Male - Excuse me</string>
+ <string name="Male - Get lost">Male - Get lost</string>
+ <string name="Male - Blow kiss">Male - Blow kiss</string>
+ <string name="Male - Boo">Male - Boo</string>
+ <string name="Male - Bored">Male - Bored</string>
+ <string name="Male - Hey">Male - Hey</string>
+ <string name="Male - Laugh">Male - Laugh</string>
+ <string name="Male - Repulsed">Male - Repulsed</string>
+ <string name="Male - Shrug">Male - Shrug</string>
+ <string name="Male - Stick tougue out">Male - Stick tougue out</string>
+ <string name="Male - Wow">Male - Wow</string>
+
+ <string name="Female - Excuse me">Female - Excuse me</string>
+ <string name="Female - Get lost">Female - Get lost</string>
+ <string name="Female - Blow kiss">Female - Blow kiss</string>
+ <string name="Female - Boo">Female - Boo</string>
+ <string name="Female - Bored">Female - Bored</string>
+ <string name="Female - Hey">Female - Hey</string>
+ <string name="Female - Laugh">Female - Laugh</string>
+ <string name="Female - Repulsed">Female - Repulsed</string>
+ <string name="Female - Shrug">Female - Shrug</string>
+ <string name="Female - Stick tougue out">Female - Stick tougue out</string>
+ <string name="Female - Wow">Female - Wow</string>
+
+ <!-- birth date format shared by avatar inspector and profile panels -->
+ <string name="AvatarBirthDateFormat">[mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]</string>
+
+ <string name="DefaultMimeType">none/none</string>
+ <string name="texture_load_dimensions_error">Can't load images larger than [WIDTH]*[HEIGHT]</string>
+
+ <!-- language specific white-space characters, delimiters, spacers, item separation symbols -->
+ <string name="sentences_separator" value=" "></string>
+ <string name="words_separator" value=", "/>
+
+ <string name="server_is_down">
+ Despite our best efforts, something unexpected has gone wrong.
+
+ Please check status.secondlifegrid.net to see if there is a known problem with the service.
+ If you continue to experience problems, please check your network and firewall setup.
+ </string>
+
+ <!-- overriding datetime formating.
+ didn't translate if this is not needed for current localization
+ -->
+ <string name="dateTimeWeekdaysNames">Sunday:Monday:Tuesday:Wednesday:Thursday:Friday:Saturday</string>
+ <string name="dateTimeWeekdaysShortNames">Sun:Mon:Tue:Wed:Thu:Fri:Sat</string>
+ <string name="dateTimeMonthNames">January:February:March:April:May:June:July:August:September:October:November:December</string>
+ <string name="dateTimeMonthShortNames">Jan:Feb:Mar:Apr:May:Jun:Jul:Aug:Sep:Oct:Nov:Dec</string>
+ <string name="dateTimeDayFormat">[MDAY]</string>
+ <string name="dateTimeAM">AM</string>
+ <string name="dateTimePM">PM</string>
+ </strings>
diff --git a/indra/newview/skins/default/xui/en/teleport_strings.xml b/indra/newview/skins/default/xui/en/teleport_strings.xml
index e8f6b1319a..bae821d3b5 100644
--- a/indra/newview/skins/default/xui/en/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/en/teleport_strings.xml
@@ -61,6 +61,9 @@ Try again in a moment.
<message name="completing">
Completing teleport.
</message>
+ <message name="completed_from">
+ Teleport completed from [T_SLURL]
+ </message>
<message name="resolving">
Resolving destination.
</message>
diff --git a/indra/newview/skins/default/xui/en/widgets/accordion.xml b/indra/newview/skins/default/xui/en/widgets/accordion.xml
new file mode 100644
index 0000000000..19f8234389
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/accordion.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<accordion
+ height="100"
+ name="accordion"
+ width="200">
+ <no_matched_tabs_text
+ follows="all"
+ height="100"
+ h_pad="10"
+ name="no_matched_tabs_msg"
+ v_pad="15"
+ width="200"
+ wrap="true "/>
+ <!-- This widget will not be created in viewer. Only its value will be used for empty accordion without filter. -->
+ <no_visible_tabs_text
+ name="no_visible_tabs_msg"
+ visible="false"/>
+</accordion>
diff --git a/indra/newview/skins/default/xui/en/widgets/button.xml b/indra/newview/skins/default/xui/en/widgets/button.xml
index 74d8478551..2d0a1728d5 100644
--- a/indra/newview/skins/default/xui/en/widgets/button.xml
+++ b/indra/newview/skins/default/xui/en/widgets/button.xml
@@ -2,15 +2,15 @@
<!-- Additional attributes:
image_pressed
image_pressed_selected
+ image_flash
-->
<button image_unselected="PushButton_Off"
image_selected="PushButton_Selected"
image_disabled_selected="PushButton_Selected_Disabled"
image_disabled="PushButton_Disabled"
- image_left_pad="0"
- image_right_pad="0"
image_top_pad="0"
image_bottom_pad="0"
+ imgoverlay_label_space="1"
label_color="ButtonLabelColor"
label_color_selected="ButtonLabelSelectedColor"
label_color_disabled="ButtonLabelDisabledColor"
@@ -23,5 +23,6 @@
hover_glow_amount="0.15"
halign="center"
pad_bottom="3"
+ height="23"
scale_image="true">
</button>
diff --git a/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml b/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml
index 63f08a4250..413ca1d1ef 100644
--- a/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml
+++ b/indra/newview/skins/default/xui/en/widgets/chiclet_im_adhoc.xml
@@ -24,7 +24,7 @@
follows="left|top|bottom"
height="20"
left="2"
- mouse_opaque="true"
+ mouse_opaque="false"
name="adhoc_icon"
width="21" />
<chiclet_im_adhoc.unread_notifications
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 dfd301a770..48b987d7e8 100644
--- a/indra/newview/skins/default/xui/en/widgets/color_swatch.xml
+++ b/indra/newview/skins/default/xui/en/widgets/color_swatch.xml
@@ -4,5 +4,6 @@
name="color_swatch">
<color_swatch.caption_text name="caption"
halign="center"
- follows="left|right|bottom"/>
+ follows="left|right|bottom"
+ v_pad="2"/>
</color_swatch>
diff --git a/indra/newview/skins/default/xui/en/widgets/combo_box.xml b/indra/newview/skins/default/xui/en/widgets/combo_box.xml
index 132bd24bca..d1f68a9ef9 100644
--- a/indra/newview/skins/default/xui/en/widgets/combo_box.xml
+++ b/indra/newview/skins/default/xui/en/widgets/combo_box.xml
@@ -2,6 +2,7 @@
<combo_box font="SansSerifSmall"
list_position="below"
max_chars="20"
+ height="23"
follows="right|top">
<combo_box.combo_button name="Combobox Button"
hover_glow_amount="0.15"
@@ -20,7 +21,7 @@
image_pressed="DropDown_Press"
image_pressed_selected="DropDown_Press"
image_disabled="DropDown_Disabled" />
- <combo_box.combo_list bg_writeable_color="MenuDefaultBgColor"
+ <combo_box.combo_list bg_writeable_color="ComboListBgColor"
background_visible="true"
/>
<!-- Text is "tentative" if you have typed in a string that does not match
diff --git a/indra/newview/skins/default/xui/en/widgets/expandable_text.xml b/indra/newview/skins/default/xui/en/widgets/expandable_text.xml
index d9b6387f0d..216c4dea95 100644
--- a/indra/newview/skins/default/xui/en/widgets/expandable_text.xml
+++ b/indra/newview/skins/default/xui/en/widgets/expandable_text.xml
@@ -5,12 +5,13 @@
allow_html="true"
allow_scroll="true"
bg_visible="false"
- more_label="More"
+ label="More"
follows="left|top|right"
name="text"
read_only="true"
use_ellipses="true"
word_wrap="true"
+ show_context_menu="true"
tab_stop="true"
v_pad="3"
h_pad="4" >
diff --git a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml
index 1228f6be3d..0720621f0b 100644
--- a/indra/newview/skins/default/xui/en/widgets/filter_editor.xml
+++ b/indra/newview/skins/default/xui/en/widgets/filter_editor.xml
@@ -16,6 +16,6 @@
image_unselected="Search"
image_selected="Search" />
<clear_button label=""
- image_unselected="Icon_Close_Foreground"
- image_selected="Icon_Close_Press" />
+ image_unselected="Icon_Close_Toast"
+ image_selected="Icon_Close_Toast" />
</filter_editor>
diff --git a/indra/newview/skins/default/xui/en/widgets/flat_list_view.xml b/indra/newview/skins/default/xui/en/widgets/flat_list_view.xml
index a71b293f31..e05ddf9815 100644
--- a/indra/newview/skins/default/xui/en/widgets/flat_list_view.xml
+++ b/indra/newview/skins/default/xui/en/widgets/flat_list_view.xml
@@ -11,6 +11,6 @@
name="no_items_msg"
v_pad="10"
h_pad="10"
- value="There are no any items in the list"
+ value="No matches found"
wrap="true" />
</flat_list_view> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/widgets/flyout_button.xml b/indra/newview/skins/default/xui/en/widgets/flyout_button.xml
index a5043c5c14..83df10e417 100644
--- a/indra/newview/skins/default/xui/en/widgets/flyout_button.xml
+++ b/indra/newview/skins/default/xui/en/widgets/flyout_button.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<flyout_button list_position="below">
+<flyout_button list_position="below" height="23">
<action_button scale_image="true"
image_selected="SegmentedBtn_Left_Selected"
image_unselected="SegmentedBtn_Left_Off"
diff --git a/indra/newview/skins/default/xui/en/widgets/inspector.xml b/indra/newview/skins/default/xui/en/widgets/inspector.xml
index 8ec206023e..428b2ce03b 100644
--- a/indra/newview/skins/default/xui/en/widgets/inspector.xml
+++ b/indra/newview/skins/default/xui/en/widgets/inspector.xml
@@ -1,10 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<!-- See also settings.xml UIFloater* settings for configuration -->
<inspector name="inspector"
- bg_opaque_color="DkGray_66"
- background_visible="true"
- bg_opaque_image="none"
- background_opaque="true"
- bg_alpha_image="none"
- text_color="InspectorTipTextColor"
- />
+ bg_opaque_color="DkGray_66"
+ background_visible="true"
+ bg_opaque_image="Inspector_Hover"
+ background_opaque="true"
+ bg_alpha_image="none"
+ mouse_opaque="true"
+ text_color="InspectorTipTextColor"/>
diff --git a/indra/newview/skins/default/xui/en/widgets/line_editor.xml b/indra/newview/skins/default/xui/en/widgets/line_editor.xml
index a21e3f2645..a054960bf8 100644
--- a/indra/newview/skins/default/xui/en/widgets/line_editor.xml
+++ b/indra/newview/skins/default/xui/en/widgets/line_editor.xml
@@ -3,7 +3,6 @@
background_image_disabled="TextField_Disabled"
background_image_focused="TextField_Active"
select_on_focus="false"
- handle_edit_keys_directly="false"
commit_on_focus_lost="true"
ignore_tab="true"
cursor_color="TextCursorColor"
diff --git a/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml b/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml
new file mode 100644
index 0000000000..6040d24128
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/loading_indicator.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<loading_indicator
+ follows="left|top"
+ mouse_opaque="false"
+ name="loading_indicator"
+ rotations_per_sec="1.0"
+ tab_stop="false"
+/>
diff --git a/indra/newview/skins/default/xui/en/widgets/location_input.xml b/indra/newview/skins/default/xui/en/widgets/location_input.xml
index 626135642b..02ea661da3 100644
--- a/indra/newview/skins/default/xui/en/widgets/location_input.xml
+++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml
@@ -4,6 +4,10 @@
Currently that doesn't work because LLUIImage::getWidth/getHeight() return 1 for the images.
-->
<location_input font="SansSerifSmall"
+ icon_maturity_general="Parcel_PG_Light"
+ icon_maturity_adult="Parcel_R_Light"
+ icon_maturity_moderate="Parcel_M_Light"
+ maturity_help_topic="TODO"
add_landmark_image_enabled="Favorite_Star_Active"
add_landmark_image_disabled="Favorite_Star_Off"
add_landmark_image_hover="Favorite_Star_Over"
@@ -41,6 +45,13 @@
scale_image="false"
top="19"
left="-3" />
+ <maturity_button
+ name="maturity_icon"
+ width="18"
+ height="16"
+ top="20"
+ follows="left|top"
+ />
<for_sale_button
name="for_sale_btn"
image_unselected="Parcel_ForSale_Light"
diff --git a/indra/newview/skins/default/xui/en/widgets/panel.xml b/indra/newview/skins/default/xui/en/widgets/panel.xml
index 7262c0dc5c..9bf99fa363 100644
--- a/indra/newview/skins/default/xui/en/widgets/panel.xml
+++ b/indra/newview/skins/default/xui/en/widgets/panel.xml
@@ -6,6 +6,8 @@
-->
<panel bg_opaque_color="PanelFocusBackgroundColor"
bg_alpha_color="PanelDefaultBackgroundColor"
+ bg_opaque_image_overlay="White"
+ bg_alpha_image_overlay="White"
background_visible="false"
background_opaque="false"
chrome="false"/> \ No newline at end of file
diff --git a/indra/newview/skins/default/xui/en/widgets/panel_camera_item.xml b/indra/newview/skins/default/xui/en/widgets/panel_camera_item.xml
new file mode 100644
index 0000000000..98707b8495
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/widgets/panel_camera_item.xml
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel_camera_item
+ background_visible="false"
+ height="30"
+ layout="topleft"
+ width="212">
+ <panel_camera_item.icon_over
+ follows="top|left"
+ height="30"
+ image_name="ListItem_Over"
+ left="0"
+ mouse_opaque="false"
+ layout="topleft"
+ name="hovered_icon"
+ top="30"
+ scale_image="true"
+ visible="false"
+ width="212" />
+ <panel_camera_item.icon_selected
+ follows="top|left"
+ height="30"
+ image_name="ListItem_Select"
+ layout="topleft"
+ left="0"
+ mouse_opaque="false"
+ name="selected_icon"
+ top="30"
+ scale_image="true"
+ visible="false"
+ width="212" />
+ <panel_camera_item.picture
+ follows="top|left"
+ height="30"
+ image_name="Icon_For_Sale"
+ layout="topleft"
+ left="0"
+ mouse_opaque="false"
+ name="picture"
+ tab_stop="false"
+ top="30"
+ top_pad="10"
+ width="30" />
+ <panel_camera_item.selected_picture
+ follows="top|left"
+ height="30"
+ image_name="Cam_Rotate_In"
+ layout="topleft"
+ left="0"
+ mouse_opaque="false"
+ name="selected_picture"
+ tab_stop="false"
+ top="30"
+ top_pad="8"
+ visible="false"
+ width="30" />
+ <panel_camera_item.text
+ follows="top|left|right"
+ font="SansSerifMedium"
+ height="15"
+ layout="topleft"
+ left ="38"
+ name="picture_name"
+ text_color="white"
+ top="21"
+ use_ellipses="true"
+ width="170"
+ word_wrap="false" >
+ Text
+ </panel_camera_item.text>
+</panel_camera_item>
diff --git a/indra/newview/skins/default/xui/en/widgets/search_editor.xml b/indra/newview/skins/default/xui/en/widgets/search_editor.xml
index 1616e4c3f7..32e443a058 100644
--- a/indra/newview/skins/default/xui/en/widgets/search_editor.xml
+++ b/indra/newview/skins/default/xui/en/widgets/search_editor.xml
@@ -3,6 +3,7 @@
clear_button_visible="false"
search_button_visible="true"
text_pad_left="6"
+ text_pad_right="6"
select_on_focus="true"
text_tentative_color="TextFgTentativeColor"
background_image="TextField_Search_Off"
@@ -15,7 +16,12 @@
height="13"
image_unselected="Search"
image_selected="Search" />
- <clear_button
+ <clear_button
+ bottom="4"
+ height="16"
image_unselected="Icon_Close_Foreground"
- image_selected="Icon_Close_Press" />
+ image_selected="Icon_Close_Press"
+ pad_right="4"
+ pad_left="4"
+ width="16" />
</search_editor>
diff --git a/indra/newview/skins/default/xui/en/widgets/slider_bar.xml b/indra/newview/skins/default/xui/en/widgets/slider_bar.xml
index 89d5950e98..ea63cac790 100644
--- a/indra/newview/skins/default/xui/en/widgets/slider_bar.xml
+++ b/indra/newview/skins/default/xui/en/widgets/slider_bar.xml
@@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<!--All horizontal sliders are configured to have no highlighted track. See EXT-5939. -->
<slider_bar track_color="SliderTrackColor"
thumb_outline_color="SliderThumbOutlineColor"
thumb_center_color="SliderThumbCenterColor"
@@ -7,6 +8,6 @@
thumb_image_disabled="SliderThumb_Disabled"
track_image_horizontal="SliderTrack_Horiz"
track_image_vertical="SliderTrack_Vert"
- track_highlight_horizontal_image="SliderTrack_Horiz"
+ track_highlight_horizontal_image="transparent.j2c"
track_highlight_vertical_image="SliderTrack_Vert"
font="SansSerif" />
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 597c4e83b6..c37ead0be2 100644
--- a/indra/newview/skins/default/xui/en/widgets/tab_container.xml
+++ b/indra/newview/skins/default/xui/en/widgets/tab_container.xml
@@ -5,27 +5,34 @@ label_pad_left - padding to the left of tab button labels
-->
<tab_container tab_min_width="60"
tab_max_width="150"
+ use_custom_icon_ctrl="false"
halign="center"
font="SansSerifSmall"
tab_height="21"
label_pad_bottom="2"
label_pad_left="4">
+ <!--
+ Possible additional attributes for tabs:
+ tab_bottom_image_flash
+ tab_left_image_flash
+ tab_top_image_flash
+ -->
<first_tab tab_top_image_unselected="TabTop_Left_Off"
tab_top_image_selected="TabTop_Left_Selected"
tab_bottom_image_unselected="Toolbar_Left_Off"
tab_bottom_image_selected="Toolbar_Left_Selected"
tab_left_image_unselected="SegmentedBtn_Left_Disabled"
- tab_left_image_selected="SegmentedBtn_Left_Off"/>
+ tab_left_image_selected="SegmentedBtn_Left_Selected_Over"/>
<middle_tab tab_top_image_unselected="TabTop_Middle_Off"
tab_top_image_selected="TabTop_Middle_Selected"
tab_bottom_image_unselected="Toolbar_Middle_Off"
tab_bottom_image_selected="Toolbar_Middle_Selected"
tab_left_image_unselected="SegmentedBtn_Left_Disabled"
- tab_left_image_selected="SegmentedBtn_Left_Off"/>
+ tab_left_image_selected="SegmentedBtn_Left_Selected_Over"/>
<last_tab tab_top_image_unselected="TabTop_Right_Off"
tab_top_image_selected="TabTop_Right_Selected"
tab_bottom_image_unselected="Toolbar_Right_Off"
tab_bottom_image_selected="Toolbar_Right_Selected"
tab_left_image_unselected="SegmentedBtn_Left_Disabled"
- tab_left_image_selected="SegmentedBtn_Left_Off"/>
+ tab_left_image_selected="SegmentedBtn_Left_Selected_Over"/>
</tab_container>
diff --git a/indra/newview/skins/default/xui/en/widgets/talk_button.xml b/indra/newview/skins/default/xui/en/widgets/talk_button.xml
index 68cf082c35..a7e271a1ff 100644
--- a/indra/newview/skins/default/xui/en/widgets/talk_button.xml
+++ b/indra/newview/skins/default/xui/en/widgets/talk_button.xml
@@ -11,9 +11,6 @@
image_unselected="SegmentedBtn_Left_Off"
image_pressed="SegmentedBtn_Left_Selected_Press"
image_pressed_selected="SegmentedBtn_Left_Selected_Press"
- name="speak_btn"
- label="Speak"
- label_selected="Speak"
tab_stop="false"
/>
<show_button
diff --git a/indra/newview/skins/default/xui/en/widgets/text.xml b/indra/newview/skins/default/xui/en/widgets/text.xml
index 855584a0db..3006df22b8 100644
--- a/indra/newview/skins/default/xui/en/widgets/text.xml
+++ b/indra/newview/skins/default/xui/en/widgets/text.xml
@@ -6,7 +6,6 @@
font_shadow="none"
tab_stop="false"
halign="left"
- hover_color="LabelSelectedColor"
h_pad="0"
allow_scroll="false"
text_readonly_color="LabelDisabledColor"
@@ -14,7 +13,7 @@
use_ellipses="false"
bg_visible="false"
border_visible="false"
- hover="false"
+ sound_flags="0"
text_color="LabelTextColor"
v_pad="0"
max_length="4096"/>
diff --git a/indra/newview/skins/default/xui/en/widgets/text_editor.xml b/indra/newview/skins/default/xui/en/widgets/text_editor.xml
index 23ca8ea338..2ced8b1b4b 100644
--- a/indra/newview/skins/default/xui/en/widgets/text_editor.xml
+++ b/indra/newview/skins/default/xui/en/widgets/text_editor.xml
@@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!-- Core parameters are in simple_text_editor.xml -->
<text_editor
- allow_html="false"/>
+ allow_html="false"
+ show_context_menu="true"/>
diff --git a/indra/newview/skins/default/xui/en/widgets/texture_picker.xml b/indra/newview/skins/default/xui/en/widgets/texture_picker.xml
index 33c3475eb2..757f0f49d1 100644
--- a/indra/newview/skins/default/xui/en/widgets/texture_picker.xml
+++ b/indra/newview/skins/default/xui/en/widgets/texture_picker.xml
@@ -3,7 +3,8 @@
<multiselect_text font="SansSerifSmall"/>
<caption_text text="Multiple"
halign="center"
- font="SansSerifSmall"/>
+ font="SansSerifSmall"
+ v_pad="2"/>
<border bevel_style="in"/>
</texture_picker>
diff --git a/indra/newview/skins/default/xui/en/widgets/tool_tip.xml b/indra/newview/skins/default/xui/en/widgets/tool_tip.xml
index a19201f7c3..9ca15ae50d 100644
--- a/indra/newview/skins/default/xui/en/widgets/tool_tip.xml
+++ b/indra/newview/skins/default/xui/en/widgets/tool_tip.xml
@@ -1,12 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<!-- See also settings.xml UIFloater* settings for configuration -->
<tool_tip name="tooltip"
max_width="200"
padding="4"
wrap="true"
font="SansSerif"
+ mouse_opaque="false"
bg_opaque_image="Tooltip"
background_opaque="true"
background_visible="true"
- text_color="ToolTipTextColor"
- />
+ text_color="ToolTipTextColor"/>
diff --git a/indra/newview/skins/default/xui/es/floater_about.xml b/indra/newview/skins/default/xui/es/floater_about.xml
index e8e38316f9..1af089cfaf 100644
--- a/indra/newview/skins/default/xui/es/floater_about.xml
+++ b/indra/newview/skins/default/xui/es/floater_about.xml
@@ -1,20 +1,61 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_about" title="ACERCA DE [CAPITALIZED_APP_NAME]">
-<tab_container name="about_tab">
- <panel name="credits_panel">
- <text_editor name="credits_editor">
- Le ofrecen Second Life Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl, y otros muchos.
+ <floater.string name="AboutHeader">
+ [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])
+[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </floater.string>
+ <floater.string name="AboutCompiler">
+ Compilado con [COMPILER], versión [COMPILER_VERSION]
+ </floater.string>
+ <floater.string name="AboutPosition">
+ Estás en la posición [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1], de [REGION], alojada en &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
+[SERVER_VERSION]
+[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </floater.string>
+ <floater.string name="AboutSystem">
+ CPU: [CPU]
+Memoria: [MEMORY_MB] MB
+Versión del Sistema Operativo: [OS_VERSION]
+Fabricante de la tarjeta gráfica: [GRAPHICS_CARD_VENDOR]
+Tarjeta gráfica: [GRAPHICS_CARD]
+ </floater.string>
+ <floater.string name="AboutDriver">
+ Versión de Windows Graphics Driver: [GRAPHICS_DRIVER_VERSION]
+ </floater.string>
+ <floater.string name="AboutLibs">
+ Versión de OpenGL: [OPENGL_VERSION]
- Gracias a todos estos residentes por contribuir a garantizar que esta es la mejor versión: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
+Versión de libcurl: [LIBCURL_VERSION]
+Versión de J2C Decoder: [J2C_VERSION]
+Versión de Audio Driver: [AUDIO_DRIVER_VERSION]
+Versión de Qt Webkit: [QT_WEBKIT_VERSION]
+Versión del servidor de voz: [VOICE_VERSION]
+ </floater.string>
+ <floater.string name="none">
+ (no hay)
+ </floater.string>
+ <floater.string name="AboutTraffic">
+ Paquetes perdidos: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
+ </floater.string>
+ <tab_container name="about_tab">
+ <panel label="Información" name="support_panel">
+ <button label="Copiar al portapapeles" name="copy_btn" width="165"/>
+ </panel>
+ <panel label="Créditos" name="credits_panel">
+ <text_editor name="credits_editor">
+ Te ofrecen Second Life Philip, Tessa, Andrew, Cory, Ian, James, Phoenix, Ryan, Haney, Dan, Char, Ben, John, Tanya, Eddie, Richard, Mitch, Doug, Eric, Frank, Bruce, Aaron, Peter, Alice, Charlie, Debra, Eileen, Helen, Janet, Steffan, Steve, Tom, Mark, Hunter, Xenon, Burgess, Bill, Jim, Lee, Hamlet, Daniel, Jeff, Todd, Sarah, Tim, Stephanie, Colin, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Jack, Vektor, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Jesse, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Yuko, Makiko, Thomas, Harry, Seth, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Brad, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, Beez, Milo, Hermia, Red, Thrax, Gulliver, Joe, Sally, Paul, Jose, Rejean, Dore, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, Dustin, George, Del, Matthew, Cat, Jacqui, Adrian, Viola, Alfred, Noel, Irfan, Yool, Rika, Jane, Frontier, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Jeremy, JP, Jake, Anthony, Maurice, Madhavi, Leopard, Kyle, Joon, Bert, Belinda, Jon, Kristi, Bridie, Pramod, Socrates, Maria, Aric, Adreanne, Jay, Kari, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Colossus, Zen, BigPapi, Pastrami, Kurz, Mani, Neuro, Mel, Sardonyx, MJ, Rowan, Sgt, Elvis, Samuel, Leo, Bryan, Niko, Austin, Soft, Poppy, Rachel, Aki, Banzai, Alexa, Sue, Bender, CG, Angelo, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Rothman, Niall, Marin, Allison, Katie, Dawn, Dusty, Katt, Judy, Andrea, Ambroff, Infinity, Rico, Gail, Kalpana, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Maestro, Simone, Yang, T, Shannon, Nelson, Khanh, Scott, Courtney, Charlene, Quixote, Susan, Zed, Amanda, Katelin, Enkidu, Roxie, Esbee, JoRoan, Scarlet, Tay, Kevin, Wolfgang, Johnny, Ray, Andren, Merov, Bob, Rand, Howard, Callen, Heff, Galen, Newell, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl, Ashley, JessieAnn, Huseby, Karina, Paris, Kurt, Rick, Lis, Kotler, Theeba, Lynx, Murphy, Doten, Taka, Norm, Jillian, Marcus, Mae, Novack, Esther, Perry, Dana, Ducot, Javier, Porter, Madison, Gecko, Dough, JR, Gisele, Crimp, Norie, Arch, Kimi, Fisher, Barbara, Jason, Peggy, Bernard, Jules, Leroy, Eva, Khederian, Campbell, Vogt, Masido, Karel, Torres, Lo, Breezer, Delby, Rountree, Anna, Servus, Rue, Itiaes, Chuck, Luna, Novella, Zaza, Wen, Gino, Lex, Cassandra, Limey, Nancy, Anukul, Silver, Brodesky, Jinsai, Squid, Gez, Rakesh, Ladan, Edelman, Marcet, Squire, Tatem, Tony, Jerm, Tia, Falcon, BK, Tiggs, Driscoll, Bacon, Timothee, Cru, Carmilla, Coyot, Webb, Kazu, Rudas, LJ, Sea, Ali Wallace, Bewest, Pup, Drub, Dragon, Inoshiro, Byron, Rhett, Xandix, Aimee, Fredrik, Thor, Teddy, Baron, Nelly, Ghengis, Epic, Eli, Stone, Grapes, Irie, Prep, Scobu, Valerie, Alain, y muchos otros.
+Gracias a estos Residentes por ayudarnos a estar seguros de que, con todo, esta es la mejor versión: Drew Dwi, Zai Lynch, Latif Khalifa, Ellla McMahon, Harleen Gretzky, Squirrel Wood, Malarthi Behemoth, Dante Tucker, Buckaroo Mu, Eddi Decosta, Dirk Talamasca, Torben Trautman, Irene Muni, Lilly Zenovka, Vick Forcella, Sasy Scarborough, Gentle Welinder, Elric Anatine, Techwolf Lupindo, Dusan Writer, WolfPup Lowenhar, Marianne McCann, Fiachra Lach, Sitearm Madonna, Sudane Erato, Sahkolihaa Contepomi, Sachi Vixen, Questar Utu, Dimitrio Lewis, Matto Destiny, Scrim Pinion, Radio Signals, Psi Merlin, Pixel Gausman, Mel Vanbeeck, Laurent Bechir, Lamorna Proctor, Lares Carter, Gwyneth Llewelyn, Hydra Shaftoe, Holger Gilruth, Gentle Heron, Carla Broek, Boroondas Gupte, Fury Rosewood, Flower Ducatillon, Colpo Wexler, gwampa Lomu, Borg Capalini, Beansy Twine, Ardy Lay, 45ms Zhong, Adeon Writer, Aeonix Aeon, Ai Austin, Aiko Ying, Alexandrea Fride, Alliez Mysterio, Annie Milestone, Annika Genezzia, Ansariel Hiller, ArminasX Saiman, Arya Braveheart, Asaeda Meltingdots, Asturkon Jua, Avallyn Oakleaf, Avatar Quinzet, BabyA Littlething, Bacchus Ireto, Bazaar, Riva, Benjamin Bigdipper, Beth Walcher, Bezilon Kasei, Biancaluce Robbiani, Bill Walach, blakopal Galicia, Blitzckreed Levenque, Bryn Oh, Callipygian Christensen, Cap Carver, Carr Arbenlow, Chantal Harvey, Charles Courtois, Charlie Sazaland, Cherry Cheevers, ChickyBabes Zuzu, Christopher Organiser, Ciaran Laval, Clara Young, Celierra Darling, Corinne Helendale, Corro Moseley, Coughdrop Littlething, Darien Caldwell, Dartagan Shepherd, Debs Regent, Decro Schmooz, Denim Kamachi, DiJodi Dubratt, Dil Spitz, Edgware Marker, Egehan Dryke, Emma Portilo, Emmie Fairymeadow, Evangelista Emerald, Faelon Swordthain, Frenchimmo Sabra, Gaberoonie Zanzibar, Ganymedes Costagravas, Gene Frostbite, GeneJ Composer, Giggles Littlebird, Grady Echegaray, Guni Greenstein, Gypsy Tripsa, Hackshaven Harford, Ham Rambler, Han Shuffle, Hanglow Short, Hatzfeld Runo, herina Bode, Horatio Freund, Hypatia Callisto, Hypatia Pickens, Identity Euler, Imnotgoing Sideways, Innula Zenovka, Iyoba Tarantal, Jack Abraham, Jagga Meredith, Jennifer Boyle, Jeremy Marquez, Jessica Qin, Jinx Nordberg, Jo Bernandes, Jocial Sonnenkern, Joel Savard, Jondan Lundquist, Josef Munster, Josette Windlow, Juilan Tripsa, Juro Kothari, Justin RiversRunRed, Kagehi Kohn, Kaimen Takahe, Keklily Longfall, Ken Lavender, Kestral Karas, Khisme Nitely, Kimar Coba, Kithrak Kirkorian, Kitty Barnett, Kolor Fall, Komiko Okamoto, Korvel Noh, Larry Pixel, Leal Choche, len Starship, Lenae Munz, Lexi Frua, Lillie Cordeaux, Lizzy Macarthur, LSL Scientist, Luban Yiyuan, Luc Starsider, Maccus McCullough, Madison Blanc, Maggie Darwin, Mallory Destiny, Manx Wharton, Marc Claridge, Marc2 Sands, Matthew Anthony, Maxim RiversRunRed, Medhue Simoni, Melinda Latynina, Mencius Watts, Michi Lumin, Midian Farspire, Miles Glaz, Mindy Mathy, Mitch Wagner, Mo Hax, Mourna Biziou, Nao Noe, naofan Teardrop, Naomah Beaumont, Nathiel Siamendes, Nber Medici, Neko Link, Netpat Igaly, Neutron Chesnokov, Newfie Pendragon, Nicholai Laviscu, Nick Rhodes, Nicoladie Gymnast, Ollie Kubrick, Orenj Marat, Orion Delphis, Oryx Tempel, Parvati Silverweb, PeterPunk Mooney, Pixel Scientist, Pounce Teazle, Professor Noarlunga, Quantum Destiny, Quicksilver Hermes, Ralf Setsuko, RAT Quan, RedMokum Bravin, Revolution Perenti, Rezit Sideways, Rich Grainger, Rosco Teardrop, Rose Evans, Rudee Voom, RufusTT Horsefly, Saii Hallard, SaintLEOlions Zimer, Samm Larkham, Satanello Miami, SexySteven Morrisey, Sheet Spotter, Shnurui Troughton, sicarius Thorne, Sicarius Toxx, Sini Nubalo, SLB Wirefly, snowy Sidran, Soupa Segura, ST Mensing, Starshine Halasy, Stickman Ingmann, Synystyr Texan, Takeda Terrawyng, Tali Rosca, Templar Merlin, Tezcatlipoca Bisiani, Tiel Stonecutter, Tony Kembia, TouchaHoney Perhaps, Trey Reanimator, TriloByte Zanzibar, Trinity Dechou, Trinity Dejavu, Unlikely Quintessa, UsikuFarasi Kanarik, Veritas Raymaker, Vex Streeter, Viaticus Speculaas, Villain Baroque, Vixie Durant, Void Singer, Watty Berkson, Westley Schridde, Westley Streeter, Whimsy Winx, Winter Ventura, Wundur Primbee, xstorm Radek, YongYong Francois, Zak Westminster, Zana Kohime, Zaren Alexander, Zeja Pyle, ZenMondo Wormser, Zoex Flanagan, y muchos otros.
- Para tener éxito en los negocios, se atrevido, se el primero, se diferente. (Henry Marchant)
- </text_editor>
- </panel>
- <panel name="licenses_panel">
- <text_editor name="credits_editor">
- 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
+
+
+&quot;El trabajo sigue avanzando, la causa perdura, la esperanza aún vive, y los sueños no morirán jamás&quot; - Edward Kennedy
+ </text_editor>
+ </panel>
+ <panel label="Licencias" name="licenses_panel">
+ <text_editor name="credits_editor">
+ 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
APR Copyright (C) 2000-2004 The Apache Software Foundation
cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
@@ -35,10 +76,7 @@
All rights reserved. See licenses.txt for details.
Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
- </text_editor>
- </panel>
-</tab_container>
- <string name="you_are_at">
- Está en [POSITION]
- </string>
+ </text_editor>
+ </panel>
+ </tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_about_land.xml b/indra/newview/skins/default/xui/es/floater_about_land.xml
index 7575df4b98..c672f68c5c 100644
--- a/indra/newview/skins/default/xui/es/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/es/floater_about_land.xml
@@ -1,7 +1,71 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floaterland" title="ACERCA DEL TERRENO">
+ <floater.string name="maturity_icon_general">
+ &quot;Parcel_PG_Dark&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_moderate">
+ &quot;Parcel_M_Dark&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_adult">
+ &quot;Parcel_R_Dark&quot;
+ </floater.string>
+ <floater.string name="Minutes">
+ [MINUTES] minutos
+ </floater.string>
+ <floater.string name="Minute">
+ minuto
+ </floater.string>
+ <floater.string name="Seconds">
+ [SECONDS] segundos
+ </floater.string>
+ <floater.string name="Remaining">
+ restantes
+ </floater.string>
<tab_container name="landtab">
- <panel label="General" name="land_general_panel">
+ <panel label="GENERAL" name="land_general_panel">
+ <panel.string name="new users only">
+ Sólo nuevos Residentes
+ </panel.string>
+ <panel.string name="anyone">
+ Cualquiera
+ </panel.string>
+ <panel.string name="area_text">
+ Superficie
+ </panel.string>
+ <panel.string name="area_size_text">
+ [AREA] m²
+ </panel.string>
+ <panel.string name="auction_id_text">
+ ID de la subasta: [ID]
+ </panel.string>
+ <panel.string name="need_tier_to_modify">
+ Debe aprobar su compra para modificar este terreno.
+ </panel.string>
+ <panel.string name="group_owned_text">
+ (Propiedad del grupo)
+ </panel.string>
+ <panel.string name="profile_text">
+ Perfil...
+ </panel.string>
+ <panel.string name="info_text">
+ Información...
+ </panel.string>
+ <panel.string name="public_text">
+ (público)
+ </panel.string>
+ <panel.string name="none_text">
+ (ninguno)
+ </panel.string>
+ <panel.string name="sale_pending_text">
+ (Venta pendiente)
+ </panel.string>
+ <panel.string name="no_selection_text">
+ No se ha seleccionado una parcela.
+Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver sus características.
+ </panel.string>
+ <panel.string name="time_stamp_template">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </panel.string>
<text name="Name:">
Nombre:
</text>
@@ -26,13 +90,15 @@
<text name="OwnerText">
Leyla Linden
</text>
- <button label="Perfil..." label_selected="Perfil..." name="Profile..."/>
<text name="Group:">
Grupo:
</text>
- <button label="Configurar..." label_selected="Configurar..." name="Set..."/>
+ <text name="GroupText">
+ Leyla Linden
+ </text>
+ <button label="Configurar" name="Set..."/>
<check_box label="Permitir transferir al grupo" name="check deed" tool_tip="Un oficial del grupo puede transferir este terreno al grupo. El terreno será apoyado por el grupo en sus asignaciones de terreno."/>
- <button label="Transferir..." label_selected="Transferir..." name="Deed..." tool_tip="Sólo si es usted un oficial del grupo seleccionado puede transferir terreno."/>
+ <button label="Transferir" name="Deed..." tool_tip="Sólo si es usted un oficial del grupo seleccionado puede transferir terreno."/>
<check_box label="El propietario hace una contribución transfiriendo" name="check contrib" tool_tip="Cuando el terreno se transfiere al grupo, el antiguo propietario contribuye con una asignación suficiente de terreno."/>
<text name="For Sale:">
En venta:
@@ -43,17 +109,17 @@
<text name="For Sale: Price L$[PRICE].">
Precio: [PRICE] L$ ([PRICE_PER_SQM] L$/m²).
</text>
- <button label="Vender el terreno..." label_selected="Vender el terreno..." name="Sell Land..."/>
+ <button label="Vender el terreno" name="Sell Land..."/>
<text name="For sale to">
En venta a: [BUYER]
</text>
- <text width="216" name="Sell with landowners objects in parcel.">
+ <text name="Sell with landowners objects in parcel." width="216">
Los objetos se incluyen en la venta.
</text>
- <text width="216" name="Selling with no objects in parcel.">
+ <text name="Selling with no objects in parcel." width="216">
Los objetos no se incluyen en la venta.
</text>
- <button font="SansSerifSmall" bottom="-245" left="275" width="165" label="Cancelar la venta del terreno" label_selected="Cancelar la venta del terreno" name="Cancel Land Sale"/>
+ <button bottom="-245" font="SansSerifSmall" label="Cancelar la venta del terreno" label_selected="Cancelar la venta del terreno" left="275" name="Cancel Land Sale"/>
<text name="Claimed:">
Reclamada:
</text>
@@ -72,60 +138,30 @@
<text name="DwellText">
0
</text>
- <button label="Comprar terreno..." label_selected="Comprar terreno..." left="130" name="Buy Land..." width="125"/>
- <button label="Comprar para el grupo..." label_selected="Comprar para el grupo..." name="Buy For Group..."/>
- <button label="Comprar un pase..." label_selected="Comprar un pase..." left="130" width="125" name="Buy Pass..." tool_tip="Un pase le da acceso temporal a este terreno."/>
- <button label="Abandonar el terreno..." label_selected="Abandonar el terreno..." name="Abandon Land..."/>
- <button label="Reclamar el terreno..." label_selected="Reclamar el terreno..." name="Reclaim Land..."/>
- <button label="Venta Linden..." label_selected="Venta Linden..." name="Linden Sale..." tool_tip="El terreno debe estar en propiedad, con contenido, y no estar en subasta."/>
- <panel.string name="new users only">
- Sólo usuarios nuevos
- </panel.string>
- <panel.string name="anyone">
- Cualquiera
- </panel.string>
- <panel.string name="area_text">
- Superficie
- </panel.string>
- <panel.string name="area_size_text">
- [AREA] m²
- </panel.string>
- <panel.string name="auction_id_text">
- ID de la subasta: [ID]
- </panel.string>
- <panel.string name="need_tier_to_modify">
- Debe aprobar su compra para modificar este terreno.
- </panel.string>
- <panel.string name="group_owned_text">
- (Propiedad del grupo)
- </panel.string>
- <panel.string name="profile_text">
- Perfil...
- </panel.string>
- <panel.string name="info_text">
- Información...
- </panel.string>
- <panel.string name="public_text">
- (público)
+ <button label="Comprar terreno" left="130" name="Buy Land..." width="125"/>
+ <button label="Información del script" name="Scripts..."/>
+ <button label="Comprar para el grupo" name="Buy For Group..."/>
+ <button label="Comprar un pase" left="130" name="Buy Pass..." tool_tip="Un pase le da acceso temporal a este terreno." width="125"/>
+ <button label="Abandonar el terreno" name="Abandon Land..."/>
+ <button label="Reclamar el terreno" name="Reclaim Land..."/>
+ <button label="Venta Linden" name="Linden Sale..." tool_tip="El terreno debe estar en propiedad, con contenido, y no estar en subasta."/>
+ </panel>
+ <panel label="CONTRATO" name="land_covenant_panel">
+ <panel.string name="can_resell">
+ El terreno comprado en esta región se podrá revender.
</panel.string>
- <panel.string name="none_text">
- (ninguno)
+ <panel.string name="can_not_resell">
+ El terreno comprado en esta región no se podrá revender.
</panel.string>
- <panel.string name="sale_pending_text">
- (Venta pendiente)
+ <panel.string name="can_change">
+ El terreno comprado en esta región se podrá unir o dividir.
</panel.string>
- <panel.string name="no_selection_text">
- No se ha seleccionado una parcela.
-Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver sus características.
+ <panel.string name="can_not_change">
+ El terreno comprado en esta región no se podrá unir o dividir.
</panel.string>
- </panel>
- <panel label="Contrato" name="land_covenant_panel">
<text name="estate_section_lbl">
Estado:
</text>
- <text name="estate_name_lbl">
- Nombre:
- </text>
<text name="estate_name_text">
mainland
</text>
@@ -144,9 +180,6 @@ Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver s
<text name="region_section_lbl">
Región:
</text>
- <text name="region_name_lbl">
- Nombre:
- </text>
<text name="region_name_text">
leyla
</text>
@@ -174,121 +207,82 @@ Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver s
<text name="changeable_clause">
El terreno de esta región no se podrá unir/dividir.
</text>
- <panel.string name="can_resell">
- El terreno comprado en esta región se podrá revender.
- </panel.string>
- <panel.string name="can_not_resell">
- El terreno comprado en esta región no se podrá revender.
- </panel.string>
- <panel.string name="can_change">
- El terreno comprado en esta región se podrá unir o dividir.
+ </panel>
+ <panel label="OBJETOS" name="land_objects_panel">
+ <panel.string name="objects_available_text">
+ [COUNT] de un máx. de [MAX] ([AVAILABLE] disponibles)
</panel.string>
- <panel.string name="can_not_change">
- El terreno comprado en esta región no se podrá unir o dividir.
+ <panel.string name="objects_deleted_text">
+ [COUNT] de un máx. de [MAX] ([DELETED] se borrarán)
</panel.string>
- </panel>
- <panel label="Objetos" name="land_objects_panel">
<text name="parcel_object_bonus">
Plus de objetos en la región: [BONUS]
</text>
<text name="Simulator primitive usage:">
- Simulador de uso de prims:
+ Uso de primitivas:
</text>
- <text name="objects_available" left="204" width="250" >
- [COUNT] de un máximo de [MAX] ([AVAILABLE] disponibles)
+ <text left="204" name="objects_available" width="250">
+ [COUNT] de un máx. de [MAX] ([AVAILABLE] disponibles)
</text>
- <panel.string name="objects_available_text">
- [COUNT] de un máximo de [MAX] ([AVAILABLE] disponibles)
- </panel.string>
- <panel.string name="objects_deleted_text">
- [COUNT] de un máximo de [MAX] ([DELETED] se borrarán)
- </panel.string>
<text name="Primitives parcel supports:" width="200">
Prims que admite la parcela:
</text>
- <text name="object_contrib_text" left="204" width="152">
+ <text left="204" name="object_contrib_text" width="152">
[COUNT]
</text>
<text name="Primitives on parcel:">
Prims en la parcela:
</text>
- <text name="total_objects_text" left="204" width="48">
+ <text left="204" name="total_objects_text" width="48">
[COUNT]
</text>
- <text name="Owned by parcel owner:" left="14" width="180" >
+ <text left="14" name="Owned by parcel owner:" width="180">
Del propietario de la parcela:
</text>
- <text name="owner_objects_text" left="204" width="48">
+ <text left="204" name="owner_objects_text" width="48">
[COUNT]
</text>
<button label="Mostrar" label_selected="Mostrar" name="ShowOwner" right="-135" width="60"/>
- <button label="Devolver..." label_selected="Devolver..." name="ReturnOwner..." tool_tip="Devolver los objetos a sus propietarios." right="-10" width="119"/>
- <text name="Set to group:" left="14" width="180">
+ <button label="Devolver" name="ReturnOwner..." right="-10" tool_tip="Devolver los objetos a sus propietarios." width="119"/>
+ <text left="14" name="Set to group:" width="180">
Del grupo:
</text>
- <text name="group_objects_text" left="204" width="48">
+ <text left="204" name="group_objects_text" width="48">
[COUNT]
</text>
<button label="Mostrar" label_selected="Mostrar" name="ShowGroup" right="-135" width="60"/>
- <button label="Devolver..." label_selected="Devolver..." name="ReturnGroup..." tool_tip="Devolver los objetos a sus propietarios." right="-10" width="119"/>
- <text name="Owned by others:" left="14" width="128">
+ <button label="Devolver" name="ReturnGroup..." right="-10" tool_tip="Devolver los objetos a sus propietarios." width="119"/>
+ <text left="14" name="Owned by others:" width="128">
Propiedad de otros:
</text>
- <text name="other_objects_text" left="204" width="48">
+ <text left="204" name="other_objects_text" width="48">
[COUNT]
</text>
<button label="Mostrar" label_selected="Mostrar" name="ShowOther" right="-135" width="60"/>
- <button label="Devolver..." label_selected="Devolver..." name="ReturnOther..." tool_tip="Devolver los objetos a sus propietarios." right="-10" width="119"/>
- <text name="Selected / sat upon:" left="14" width="193" >
+ <button label="Devolver" name="ReturnOther..." right="-10" tool_tip="Devolver los objetos a sus propietarios." width="119"/>
+ <text left="14" name="Selected / sat upon:" width="193">
Seleccionados / con gente sentada:
</text>
- <text name="selected_objects_text" left="204" width="48">
+ <text left="204" name="selected_objects_text" width="48">
[COUNT]
</text>
- <text name="Autoreturn" left="4" width="412" >
- Autodevolución de objetos a otros residentes (minutos; 0 la desactiva):
+ <text name="Autoreturn">
+ Devolución automát. de objetos de otros (en min., 0 la desactiva):
</text>
- <line_editor name="clean other time" right="-20" />
+ <line_editor name="clean other time" right="-20"/>
<text name="Object Owners:" width="150">
Propietarios de los objetos:
</text>
- <button label="Actualizar la lista" label_selected="Actualizar la lista" name="Refresh List" left="158"/>
- <button label="Devolver los objetos..." label_selected="Devolver los objetos..." name="Return objects..." left="270" width="164"/>
+ <button label="Actualizar la lista" label_selected="Actualizar la lista" left="158" name="Refresh List" tool_tip="Refresh Object List"/>
+ <button label="Devolver los objetos" left="270" name="Return objects..." width="164"/>
<name_list name="owner list">
- <column label="Tipo" name="type"/>
- <column label="Nombre" name="name"/>
- <column label="Número" name="count"/>
- <column label="Más recientes" name="mostrecent"/>
+ <name_list.columns label="Tipo" name="type"/>
+ <name_list.columns label="Nombre" name="name"/>
+ <name_list.columns label="Núm." name="count"/>
+ <name_list.columns label="Más recientes" name="mostrecent"/>
</name_list>
</panel>
- <panel label="Opciones" name="land_options_panel">
- <text name="allow_label">
- Permitir a otros residentes:
- </text>
- <check_box label="Editar el terreno" name="edit land check" tool_tip="Si se marca, cualquiera podrá modificar su terreno. Mejor dejarlo desmarcado, pues usted siempre puede modificar su terreno."/>
- <check_box label="Crear hitos" name="check landmark"/>
- <check_box label="Volar" name="check fly" tool_tip="Si se marca, los residentes podrán volar en su terreno. Si no, sólo podrán volar al cruzarlo o hasta que aterricen en él."/>
- <text name="allow_label2" left="162" >
- Crear objetos:
- </text>
- <check_box label="Todos los residentes" name="edit objects check" left="255" />
- <check_box label="El grupo" name="edit group objects check" left="385" />
- <text name="allow_label3" left="162">
- Dejar objetos:
- </text>
- <check_box label="Todos los residentes" name="all object entry check" left="255"/>
- <check_box label="El grupo" name="group object entry check" left="385"/>
- <text name="allow_label4" left="162">
- Ejecutar scripts:
- </text>
- <check_box label="Todos los residentes" name="check other scripts" left="255"/>
- <check_box label="El grupo" name="check group scripts" left="385"/>
- <text name="land_options_label">
- Opciones del terreno:
- </text>
- <check_box label="Seguro (sin daño)" name="check safe" tool_tip="Si se marca, convierte el terreno en &apos;seguro&apos;, desactivando el daño en combate. Si no, se activa el daño en combate."/>
- <check_box label="Sin &apos;empujones&apos;" name="PushRestrictCheck" tool_tip="Previene scripts que empujen. Marcando esta opción prevendrá que en su terreno haya comportamientos destructivos."/>
- <check_box label="Mostrar la parcela en Buscar (30 L$/semana) en" name="ShowDirectoryCheck" tool_tip="Let people see this parcel in search results"/>
+ <panel label="OPCIONES" name="land_options_panel">
<panel.string name="search_enabled_tooltip">
Permitir que aparezca esta parcela en los resultados de la búsqueda
</panel.string>
@@ -299,62 +293,6 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
<panel.string name="search_disabled_permissions_tooltip">
Esta opción no esta activada porque usted no puede modificar las opciones de la parcela.
</panel.string>
- <combo_box name="land category with adult" left="282" width="140">
- <combo_box.item name="item0" label="Cualquier categoría"
- />
- <combo_box.item name="item1" label="Localización Linden"
- />
- <combo_box.item name="item2" label="&apos;Adult&apos;"
- />
- <combo_box.item name="item3" label="Arte y Cultura"
- />
- <combo_box.item name="item4" label="Negocios"
- />
- <combo_box.item name="item5" label="Educativo"
- />
- <combo_box.item name="item6" label="Juegos de azar"
- />
- <combo_box.item name="item7" label="Entretenimiento"
- />
- <combo_box.item name="item8" label="Para recién llegados"
- />
- <combo_box.item name="item9" label="Parques y Naturaleza"
- />
- <combo_box.item name="item10" label="Residencial"
- />
- <combo_box.item name="item11" label="Compras"
- />
- <combo_box.item name="item12" label="Otra"
- />
- </combo_box>
- <combo_box name="land category" left="282" width="140">
- <combo_box.item name="item0" label="Cualquier categoría"
- />
- <combo_box.item name="item1" label="Localización Linden"
- />
- <combo_box.item name="item3" label="Arte y Cultura"
- />
- <combo_box.item name="item4" label="Negocios"
- />
- <combo_box.item name="item5" label="Educativo"
- />
- <combo_box.item name="item6" label="Juegos de azar"
- />
- <combo_box.item name="item7" label="Entretenimiento"
- />
- <combo_box.item name="item8" label="Para recién llegados"
- />
- <combo_box.item name="item9" label="Parques y Naturaleza"
- />
- <combo_box.item name="item10" label="Residencial"
- />
- <combo_box.item name="item11" label="Compras"
- />
- <combo_box.item name="item12" label="Otra"
- />
- </combo_box>
- <button label="?" label_selected="?" name="?" left="427"/>
- <check_box label="Contenido &apos;Mature&apos;" name="MatureCheck" tool_tip=""/>
<panel.string name="mature_check_mature">
Contenido &apos;Mature&apos;
</panel.string>
@@ -367,6 +305,71 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
<panel.string name="mature_check_adult_tooltip">
La información o el contenido de su parcela se considera &apos;Adult&apos;.
</panel.string>
+ <panel.string name="landing_point_none">
+ (ninguno)
+ </panel.string>
+ <panel.string name="push_restrict_text">
+ Sin &apos;empujones&apos;
+ </panel.string>
+ <panel.string name="push_restrict_region_text">
+ Sin &apos;empujones&apos; (prevalece lo marcado en la región)
+ </panel.string>
+ <text name="allow_label">
+ Permitir a otros Residentes:
+ </text>
+ <check_box label="Editar el terreno" name="edit land check" tool_tip="Si se marca, cualquiera podrá modificar su terreno. Mejor dejarlo desmarcado, pues usted siempre puede modificar su terreno."/>
+ <check_box label="Volar" name="check fly" tool_tip="Si se marca, los residentes podrán volar en su terreno. Si no, sólo podrán volar al cruzarlo o hasta que aterricen en él."/>
+ <text name="allow_label2">
+ Crear objetos:
+ </text>
+ <check_box label="Todos los residentes" name="edit objects check"/>
+ <check_box label="El grupo" name="edit group objects check"/>
+ <text name="allow_label3">
+ Dejar objetos:
+ </text>
+ <check_box label="Todos los residentes" name="all object entry check"/>
+ <check_box label="El grupo" name="group object entry check"/>
+ <text name="allow_label4">
+ Ejecutar scripts:
+ </text>
+ <check_box label="Todos los residentes" name="check other scripts"/>
+ <check_box label="El grupo" name="check group scripts"/>
+ <text name="land_options_label">
+ Opciones del terreno:
+ </text>
+ <check_box label="Seguro (sin daño)" name="check safe" tool_tip="Si se marca, convierte el terreno en &apos;seguro&apos;, desactivando el daño en combate. Si no, se activa el daño en combate."/>
+ <check_box label="Sin &apos;empujones&apos;" name="PushRestrictCheck" tool_tip="Previene scripts que empujen. Marcando esta opción prevendrá que en su terreno haya comportamientos destructivos."/>
+ <check_box label="Mostrar el sitio en la búsqueda (30 L$/semana)" name="ShowDirectoryCheck" tool_tip="Let people see this parcel in search results"/>
+ <combo_box name="land category with adult">
+ <combo_box.item label="Cualquier categoría" name="item0"/>
+ <combo_box.item label="Localización Linden" name="item1"/>
+ <combo_box.item label="&apos;Adult&apos;" name="item2"/>
+ <combo_box.item label="Arte y Cultura" name="item3"/>
+ <combo_box.item label="Negocios" name="item4"/>
+ <combo_box.item label="Educativo" name="item5"/>
+ <combo_box.item label="Juegos de azar" name="item6"/>
+ <combo_box.item label="Entretenimiento" name="item7"/>
+ <combo_box.item label="Para recién llegados" name="item8"/>
+ <combo_box.item label="Parques y Naturaleza" name="item9"/>
+ <combo_box.item label="Residencial" name="item10"/>
+ <combo_box.item label="Compras" name="item11"/>
+ <combo_box.item label="Otra" name="item12"/>
+ </combo_box>
+ <combo_box name="land category">
+ <combo_box.item label="Cualquier categoría" name="item0"/>
+ <combo_box.item label="Localización Linden" name="item1"/>
+ <combo_box.item label="Arte y Cultura" name="item3"/>
+ <combo_box.item label="Negocios" name="item4"/>
+ <combo_box.item label="Educativo" name="item5"/>
+ <combo_box.item label="Juegos de azar" name="item6"/>
+ <combo_box.item label="Entretenimiento" name="item7"/>
+ <combo_box.item label="Para recién llegados" name="item8"/>
+ <combo_box.item label="Parques y Naturaleza" name="item9"/>
+ <combo_box.item label="Residencial" name="item10"/>
+ <combo_box.item label="Compras" name="item11"/>
+ <combo_box.item label="Otra" name="item12"/>
+ </combo_box>
+ <check_box label="Contenido &apos;Mature&apos;" name="MatureCheck" tool_tip=""/>
<text name="Snapshot:">
Foto:
</text>
@@ -374,61 +377,42 @@ Sólo las parcelas más grandes pueden listarse en la búsqueda.
<text name="landing_point">
Punto de llegada: [LANDING]
</text>
- <panel.string name="landing_point_none">
- (ninguno)
- </panel.string>
<button label="Definir" label_selected="Definir" name="Set" tool_tip="Configura el punto de llegada donde aparecerán los visitantes. Configúrelo a la posición de su avatar dentro de esta parcela."/>
<button label="Borrar" label_selected="Borrar" name="Clear" tool_tip="Borrar el punto de llegada."/>
<text name="Teleport Routing: ">
Punto de teleporte:
</text>
<combo_box name="landing type" tool_tip="Punto de teleporte: defina cómo manejar en su terreno los teleportes.">
- <combo_box.item name="Blocked" label="Bloqueado"
- />
- <combo_box.item name="LandingPoint" label="Punto de llegada"
- />
- <combo_box.item name="Anywhere" label="Cualquiera"
- />
+ <combo_box.item label="Bloqueado" name="Blocked"/>
+ <combo_box.item label="Punto de llegada" name="LandingPoint"/>
+ <combo_box.item label="Cualquiera" name="Anywhere"/>
</combo_box>
- <panel.string name="push_restrict_text">
- Sin &apos;empujones&apos;
- </panel.string>
- <panel.string name="push_restrict_region_text">
- Sin &apos;empujones&apos; (prevalece lo marcado en la región)
- </panel.string>
</panel>
- <panel label="Media" name="land_media_panel">
+ <panel label="MEDIA" name="land_media_panel">
<text name="with media:" width="85">
Tipo de media:
</text>
- <combo_box name="media type" tool_tip="Especifique si la URL es una película, una web, u otro media" left="97" />
+ <combo_box left="97" name="media type" tool_tip="Especifique si la URL es una película, una web, u otro media"/>
<text name="at URL:" width="85">
- URL del media:
+ Página inicial:
</text>
<line_editor left="97" name="media_url"/>
- <button label="Definir..." label_selected="Definir..." name="set_media_url"/>
+ <button label="Definir" name="set_media_url"/>
+ <check_box label="Ocultar la URL del media" left="97" name="hide_media_url" tool_tip="Marcando esta opción esconderá en la información de esta parcela -a quien no esté autorizado a verla- la URL del media. Note que esto no está disponible para HTML."/>
<text name="Description:">
Descripción:
</text>
- <line_editor name="url_description" tool_tip="Texto a mostrar cerca del botón play/cargar" left="97" />
+ <line_editor left="97" name="url_description" tool_tip="Texto a mostrar cerca del botón play/cargar"/>
<text name="Media texture:">
Cambiar
la textura:
</text>
- <texture_picker label="" name="media texture" tool_tip="Pulse para elegir una imagen" left="97" />
+ <texture_picker label="" left="97" name="media texture" tool_tip="Pulse para elegir una imagen"/>
<text name="replace_texture_help" width="285">
- (Los objetos que usen esta textura mostrarán la
-película o la web cuando pulse la flecha de play.)
- </text>
- <text name="Options:">
- Opciones de
-los media:
+ Cuando pulses la flecha &apos;play&apos;, los objetos que usen esta textura mostrarán la película o la página web. Selecciona la miniatura para elegir una textura distinta.
</text>
- <check_box left="97" label="Escala automática" name="media_auto_scale" tool_tip="Marcando esta opción, se ajustará el tamaño del contenido automáticamente. Puede ser ligeramente más lento y con menor calidad visual, pero no tendrá que ajustar ni alinear ninguna textura."/>
- <check_box label="Media en bucle" name="media_loop" tool_tip="Ejecuta el media en bucle: cuando acaba su ejecución, vuelve a empezar."/>
- <check_box left="97" label="Ocultar la URL del media" name="hide_media_url" tool_tip="Marcando esta opción esconderá en la información de esta parcela -a quien no esté autorizado a verla- la URL del media. Note que esto no está disponible para HTML."/>
- <check_box label="Ocultar la URL de la música" name="hide_music_url" tool_tip="Marcando esta opción esconderá en la información de esta parcela -a quien no esté autorizado a verla- la URL de la música"/>
- <text name="media_size" tool_tip="Tamaño en el que mostrar las web (marque 0 para por defecto)." left="102" width="120">
+ <check_box label="Escala automática" left="97" name="media_auto_scale" tool_tip="Marcando esta opción, se ajustará el tamaño del contenido automáticamente. Puede ser ligeramente más lento y con menor calidad visual, pero no tendrá que ajustar ni alinear ninguna textura."/>
+ <text left="102" name="media_size" tool_tip="Tamaño en el que mostrar las web (marque 0 para por defecto)." width="120">
Tamaño del media:
</text>
<spinner left_delta="104" name="media_size_width" tool_tip="Tamaño en el que mostrar las web (marque 0 para por defecto)."/>
@@ -436,58 +420,48 @@ los media:
<text name="pixels">
píxeles
</text>
- <text name="MusicURL:" bottom_delta="-28" >
- URL de la
-música:
- </text>
- <line_editor bottom_delta="-12" left="97" name="music_url"/>
- <text name="Sound:">
- Sonido:
- </text>
- <check_box left="97" label="Limitar los gestos y los sonidos de objetos a esta parcela" name="check sound local"/>
- <button label="?" label_selected="?" name="?" left="424"/>
- <text name="Voice settings:">
- Voz:
+ <text name="Options:">
+ Opciones de
+los media:
</text>
- <check_box left="97" label="Activar la voz" name="parcel_enable_voice_channel"/>
- <check_box left="97" label="Activar la voz (establecido por el Estado)" name="parcel_enable_voice_channel_is_estate_disabled"/>
- <check_box left="117" label="Limitar la voz a esta parcela" name="parcel_enable_voice_channel_parcel"/>
+ <check_box label="Media en bucle" name="media_loop" tool_tip="Ejecuta el media en bucle: cuando acaba su ejecución, vuelve a empezar."/>
+ </panel>
+ <panel label="SONIDO" name="land_audio_panel">
+ <check_box label="Ocultar la URL" name="hide_music_url" tool_tip="Al marcar esta opción se ocultará la URL de la música a quien no esté autorizado a ver la información de esta parcela."/>
+ <check_box label="Activar la voz" name="parcel_enable_voice_channel"/>
+ <check_box label="Autorizar la voz (establecido por el Estado)" name="parcel_enable_voice_channel_is_estate_disabled"/>
+ <check_box label="Limitar la voz a esta parcela" name="parcel_enable_voice_channel_local"/>
</panel>
- <panel label="Acceso" name="land_access_panel">
+ <panel label="ACCESO" name="land_access_panel">
+ <panel.string name="access_estate_defined">
+ (Definido por el Estado)
+ </panel.string>
+ <panel.string name="allow_public_access">
+ Permitir el acceso público ([MATURITY])
+ </panel.string>
+ <panel.string name="estate_override">
+ Una o más de esta opciones está configurada a nivel del estado
+ </panel.string>
<text name="Limit access to this parcel to:">
Acceso a esta parcela
</text>
- <check_box label="Permitir el acceso público" name="public_access"/>
+ <check_box label="Permitir el acceso público [MATURITY]" name="public_access"/>
<text name="Only Allow">
- Impedir el acceso a:
+ Restringir el acceso a residentes verificados con:
</text>
- <check_box label="Residentes que no hayan dado a Linden Lab información de su forma de pago" name="limit_payment" tool_tip="Impedir el acceso a los residentes no identificados."/>
- <check_box label="Residentes de los que no se ha verificado si son adultos" name="limit_age_verified" tool_tip="Residentes que no hayan verificado su edad. Para más información, vea support.secondlife.com"/>
- <panel.string name="estate_override">
- Una o más de esta opciones está configurada a nivel del estado
- </panel.string>
+ <check_box label="Información de pago aportada [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Expulsa a los Residentes no identificados."/>
+ <check_box label="Verificación de edad [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Expulsa a los Residentes que no hayan verificado su edad. Más información en [SUPPORT_SITE]."/>
<check_box label="Acceso permitido al grupo: [GROUP]" name="GroupCheck" tool_tip="Elija el grupo en la pestaña General."/>
<check_box label="Vender pases a:" name="PassCheck" tool_tip="Permitir acceso temporal a esta parcela"/>
<combo_box name="pass_combo">
- <combo_box.item name="Anyone" label="Cualquiera"
- />
- <combo_box.item name="Group" label="Grupo"
- />
+ <combo_box.item label="Cualquiera" name="Anyone"/>
+ <combo_box.item label="Grupo" name="Group"/>
</combo_box>
<spinner label="Precio en L$:" name="PriceSpin"/>
<spinner label="Horas de acceso:" name="HoursSpin"/>
- <text label="Permitir siempre" name="AllowedText">
- Residentes autorizados
- </text>
- <name_list name="AccessList" tool_tip="([LISTED] listados, el máx. es de [MAX])"/>
- <button label="Añadir..." label_selected="Añadir..." name="add_allowed"/>
- <button label="Quitar" label_selected="Quitar" name="remove_allowed"/>
- <text label="Prohibir el acceso" name="BanCheck">
- Residentes con el acceso prohibido
- </text>
- <name_list name="BannedList" tool_tip="([LISTED] listados, el máx. es de [MAX])"/>
- <button label="Añadir..." label_selected="Añadir..." name="add_banned"/>
- <button label="Quitar" label_selected="Quitar" name="remove_banned"/>
+ <panel name="Allowed_layout_panel">
+ <name_list name="AccessList" tool_tip="([LISTED] listados de un máx. de [MAX])"/>
+ </panel>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_activeim.xml b/indra/newview/skins/default/xui/es/floater_activeim.xml
new file mode 100644
index 0000000000..988786c1ae
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_activeim.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_activeim" title="MI activo"/>
diff --git a/indra/newview/skins/default/xui/es/floater_animation_preview.xml b/indra/newview/skins/default/xui/es/floater_animation_preview.xml
index 5a03aa6370..d57405f7e5 100644
--- a/indra/newview/skins/default/xui/es/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/es/floater_animation_preview.xml
@@ -1,91 +1,187 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Animation Preview" title="">
+ <floater.string name="failed_to_initialize">
+ Fallo al iniciar el movimiento
+ </floater.string>
+ <floater.string name="anim_too_long">
+ El archivo de la animación dura [LENGTH] segundos.
+
+La duración máxima de una animación es de [MAX_LENGTH] segundos.
+ </floater.string>
+ <floater.string name="failed_file_read">
+ No se ha podido leer el archivo de la animación.
+
+[STATUS]
+ </floater.string>
+ <floater.string name="E_ST_OK">
+ OK
+ </floater.string>
+ <floater.string name="E_ST_EOF">
+ Fin prematuro del archivo.
+ </floater.string>
+ <floater.string name="E_ST_NO_CONSTRAINT">
+ No se puede leer la definición de la restricción.
+ </floater.string>
+ <floater.string name="E_ST_NO_FILE">
+ No se puede abrir el archivo BVH.
+ </floater.string>
+ <floater.string name="E_ST_NO_HIER">
+ &apos;HIERARCHY header&apos; inválido.
+ </floater.string>
+ <floater.string name="E_ST_NO_JOINT">
+ No se pueden encontrar &apos;ROOT&apos; o &apos;JOINT&apos;.
+ </floater.string>
+ <floater.string name="E_ST_NO_NAME">
+ No se puede obtener el nombre &apos;JOINT&apos;.
+ </floater.string>
+ <floater.string name="E_ST_NO_OFFSET">
+ No se puede encontrar &apos;OFFSET&apos;.
+ </floater.string>
+ <floater.string name="E_ST_NO_CHANNELS">
+ No se puede encontrar &apos;CHANNELS&apos;.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROTATION">
+ No se puede conseguir el orden de la rotación.
+ </floater.string>
+ <floater.string name="E_ST_NO_AXIS">
+ No se puede encontrar el eje de rotación.
+ </floater.string>
+ <floater.string name="E_ST_NO_MOTION">
+ No se puede encontrar &apos;MOTION&apos;.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAMES">
+ No se puede conseguir el número de frames.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAME_TIME">
+ No se puede conseguir el tiempo del frame.
+ </floater.string>
+ <floater.string name="E_ST_NO_POS">
+ No se pueden conseguir los valores de la posición.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROT">
+ No se pueden conseguir los valores de la rotación.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_FILE">
+ No se puede abrir el archivo de traducción.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HEADER">
+ No se puede leer el encabezamiento de la traducción.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_NAME">
+ No se puede leer la traducción de los nombres.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_IGNORE">
+ No se puede leer la traducción de los valores ignorados.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_RELATIVE">
+ No se puede leer el valor relativo de la traducción.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_OUTNAME">
+ No se puede leer la traducción del valor &apos;outname&apos;
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MATRIX">
+ No se puede leer la matriz de traducciones.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGECHILD">
+ No se puede conseguir el nombre &apos;mergechild&apos;.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGEPARENT">
+ No se puede conseguir el nombre &apos;mergeparent&apos;.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_PRIORITY">
+ No se puede obtener el valor prioritario.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_LOOP">
+ No se puede conseguir el valor del bucle.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEIN">
+ No se pueden conseguir los valores &apos;easeIn&apos;.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEOUT">
+ No se pueden conseguir los valores &apos;easeOut&apos;.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HAND">
+ No se puede conseguir el valor de &apos;hand morph&apos;.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EMOTE">
+ No se puede leer el nombre del gesto.
+ </floater.string>
+ <floater.string name="E_ST_BAD_ROOT">
+ Nombre incorrecto de &apos;root joint&apos;, usa &quot;hip&quot;.
+ </floater.string>
<text name="name_label">
Nombre:
</text>
<text name="description_label">
Descripción:
</text>
- <spinner label_width="72" width="110" label="Prioridad:" name="priority" tool_tip="Controle qué otras animaciones pueden ser anuladas por ésta."/>
- <check_box left="8" label="Bucle:" name="loop_check" tool_tip="Haga esta animación en bucle."/>
- <spinner label_width="65" left="65" width="116" label="Empieza(%)" name="loop_in_point" tool_tip="Indique el punto en el que la animación empieza el bucle."/>
- <spinner label_width="50" left="185" label="Acaba(%)" name="loop_out_point" tool_tip="Indique el punto en el que la animación acaba el bucle."/>
+ <spinner label="Prioridad:" name="priority" tool_tip="Controla qué otras animaciones pueden ser anuladas por ésta"/>
+ <check_box label="Bucle:" name="loop_check" tool_tip="Hace esta animación en bucle"/>
+ <spinner label="Empieza(%)" name="loop_in_point" tool_tip="Indica el punto en el que la animación vuelve a empezar"/>
+ <spinner label="Acaba(%)" name="loop_out_point" tool_tip="Indica el punto en el que la animación acaba el bucle"/>
<text name="hand_label">
Posición de las manos
</text>
- <combo_box left_delta="120" width="164" name="hand_pose_combo" tool_tip="Control de lo que hacen las manos durante la animación.">
- <combo_box.item name="Spread" label="Extendidas"/>
- <combo_box.item name="Relaxed" label="Relajadas"/>
- <combo_box.item name="PointBoth" label="Ambas señalan"/>
- <combo_box.item name="Fist" label="Puño"/>
- <combo_box.item name="RelaxedLeft" label="La izquierda relajada"/>
- <combo_box.item name="PointLeft" label="La izquierda señala"/>
- <combo_box.item name="FistLeft" label="Puño en la izquierda"/>
- <combo_box.item name="RelaxedRight" label="La derecha relajada"/>
- <combo_box.item name="PointRight" label="La derecha señala"/>
- <combo_box.item name="FistRight" label="Puño en la derecha"/>
- <combo_box.item name="SaluteRight" label="La derecha saluda"/>
- <combo_box.item name="Typing" label="Escribiendo"/>
- <combo_box.item name="PeaceRight" label="Paz en la derecha"/>
+ <combo_box name="hand_pose_combo" tool_tip="Controla qué hacen las manos durante la animación">
+ <combo_box.item label="Extendidas" name="Spread"/>
+ <combo_box.item label="Relajadas" name="Relaxed"/>
+ <combo_box.item label="Ambas señalan" name="PointBoth"/>
+ <combo_box.item label="Puño" name="Fist"/>
+ <combo_box.item label="La izq. relajada" name="RelaxedLeft"/>
+ <combo_box.item label="La izq. señala" name="PointLeft"/>
+ <combo_box.item label="Puño izq." name="FistLeft"/>
+ <combo_box.item label="La der. relajada" name="RelaxedRight"/>
+ <combo_box.item label="La der. señala" name="PointRight"/>
+ <combo_box.item label="Puño der." name="FistRight"/>
+ <combo_box.item label="La derecha saluda" name="SaluteRight"/>
+ <combo_box.item label="Escribiendo" name="Typing"/>
+ <combo_box.item label="&apos;Paz&apos; en la der." name="PeaceRight"/>
</combo_box>
<text name="emote_label">
Expresión
</text>
- <combo_box left_delta="120" width="164" name="emote_combo" tool_tip="Controle qué hace la cara durante la animación.">
- <combo_box.item name="[None]" label="Nada]"/>
- <combo_box.item name="Aaaaah" label="Aaaaah"/>
- <combo_box.item name="Afraid" label="Con miedo"/>
- <combo_box.item name="Angry" label="Enfadada"/>
- <combo_box.item name="BigSmile" label="Gran sonrisa"/>
- <combo_box.item name="Bored" label="Aburrida"/>
- <combo_box.item name="Cry" label="Llorar"/>
- <combo_box.item name="Disdain" label="Desdén"/>
- <combo_box.item name="Embarrassed" label="Avergonzada"/>
- <combo_box.item name="Frown" label="Fruncir el ceño"/>
- <combo_box.item name="Kiss" label="Besar"/>
- <combo_box.item name="Laugh" label="Reír"/>
- <combo_box.item name="Plllppt" label="Sacar la lengua"/>
- <combo_box.item name="Repulsed" label="Rechazo"/>
- <combo_box.item name="Sad" label="Triste"/>
- <combo_box.item name="Shrug" label="Encogerse de hombros"/>
- <combo_box.item name="Smile" label="Sonrisa"/>
- <combo_box.item name="Surprise" label="Sorpresa"/>
- <combo_box.item name="Wink" label="Guiño"/>
- <combo_box.item name="Worry" label="Preocupación"/>
+ <combo_box name="emote_combo" tool_tip="Controla qué hace la cara durante la animación">
+ <item label="(ninguno)" name="[None]" value=""/>
+ <item label="Aaaaah" name="Aaaaah" value="Aaaaah"/>
+ <item label="Con miedo" name="Afraid" value="Miedo"/>
+ <item label="Enfado" name="Angry" value="Enfado"/>
+ <item label="Gran sonrisa" name="BigSmile" value="Gran sonrisa"/>
+ <item label="Aburrimiento" name="Bored" value="Aburrimiento"/>
+ <item label="Llorar" name="Cry" value="Lloro"/>
+ <item label="Desdén" name="Disdain" value="Desdén"/>
+ <item label="Avergonzarse" name="Embarrassed" value="Vergüenza"/>
+ <item label="Fruncir el ceño" name="Frown" value="Fruncir el ceño"/>
+ <item label="Beso" name="Kiss" value="Beso"/>
+ <item label="Reír" name="Laugh" value="Risa"/>
+ <item label="Sacar la lengua" name="Plllppt" value="Sacar la lengua"/>
+ <item label="Rechazo" name="Repulsed" value="Rechazo"/>
+ <item label="Triste" name="Sad" value="Tristeza"/>
+ <item label="Encogerse de hombros" name="Shrug" value="Encogerse de hombros"/>
+ <item label="Sonrisa" name="Smile" value="Sonrisa"/>
+ <item label="Sorpresa" name="Surprise" value="Sorpresa"/>
+ <item label="Guiño" name="Wink" value="Guiño"/>
+ <item label="Preocupación" name="Worry" value="Preocupación"/>
</combo_box>
- <text name="preview_label" width="250">
+ <text name="preview_label">
Vista previa mientras
</text>
- <combo_box left_delta="120" width="130" name="preview_base_anim" tool_tip="Compruebe cómo se comporta su animación a la vez que el avatar realiza acciones comunes.">
- <combo_box.item name="Standing" label="Estar de pie"/>
- <combo_box.item name="Walking" label="Caminar"/>
- <combo_box.item name="Sitting" label="Estar sentado"/>
- <combo_box.item name="Flying" label="Volar"/>
+ <combo_box name="preview_base_anim" tool_tip="Compruebe cómo se comporta su animación a la vez que el avatar realiza acciones comunes.">
+ <item label="De pie" name="Standing" value="De pie"/>
+ <item label="Caminando" name="Walking" value="Caminando"/>
+ <item label="Sentado/a" name="Sitting" value="Sentado"/>
+ <item label="Volando" name="Flying" value="Volando"/>
</combo_box>
- <spinner label_width="125" width="192" label="Combinar (sec)" name="ease_in_time" tool_tip="Tiempo (en segundos) en el que se combinan las animaciones."/>
- <spinner bottom_delta="-20" label_width="125" left="10" width="192" label="Dejar de combinar (sec)" name="ease_out_time" tool_tip="Tiempo (en segundos) en el que dejan de combinarse las animaciones."/>
- <button bottom_delta="-32" name="play_btn" tool_tip="Mover/Pausar su animación."/>
+ <spinner label="Combinar (sec)" name="ease_in_time" tool_tip="Tiempo (en segundos) en el que se combinan las animaciones"/>
+ <spinner label="Dejar de combinar (sec)" name="ease_out_time" tool_tip="Tiempo (en segundos) en el que dejan de combinarse las animaciones"/>
+ <button bottom_delta="-32" name="play_btn" tool_tip="Ejecutar tu animación"/>
+ <button name="pause_btn" tool_tip="Pausar tu animación"/>
<button label="" name="stop_btn" tool_tip="Parar la repetición de la animación"/>
<slider label="" name="playback_slider"/>
<text name="bad_animation_text">
No se ha podido leer el archivo de la animación.
-Recomendamos usar archivos BVH exportados de
-Poser 4.
+Recomendamos usar archivos BVH exportados de Poser 4.
</text>
- <button label="Cancelar" name="cancel_btn"/>
<button label="Subir ([AMOUNT] L$)" name="ok_btn"/>
- <string name="failed_to_initialize">
- Fallo al iniciar el movimiento
- </string>
- <string name="anim_too_long">
- El archivo de la animación dura [LENGTH] segundos.
-
-La duración máxima de una animación es de [MAX_LENGTH] segundos.
- </string>
- <string name="failed_file_read">
- No se ha podido leer el archivo de la animación.
-
-[STATUS]
- </string>
+ <button label="Cancelar" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_auction.xml b/indra/newview/skins/default/xui/es/floater_auction.xml
index 5196ac0b78..6faf19dbb5 100644
--- a/indra/newview/skins/default/xui/es/floater_auction.xml
+++ b/indra/newview/skins/default/xui/es/floater_auction.xml
@@ -1,9 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_auction" title="EMPEZAR VENTA DE TERRENO LINDEN">
- <check_box label="Incluir la valla amarilla de selección" name="fence_check"/>
- <button label="Foto" label_selected="Foto" name="snapshot_btn"/>
- <button label="OK" label_selected="OK" name="ok_btn"/>
- <text name="already for sale">
+<floater name="floater_auction" title="COMENZAR LA VENTA DE TERRENO LINDEN">
+ <floater.string name="already for sale">
No puede subastar parcelas que ya están en venta.
- </text>
+ </floater.string>
+ <check_box initial_value="true" label="Incluir la valla amarilla de selección" name="fence_check"/>
+ <button label="Foto" label_selected="Foto" name="snapshot_btn"/>
+ <button label="Vender a cualquiera" label_selected="Vender a cualquiera" name="sell_to_anyone_btn"/>
+ <button label="Limpiar las configuraciones" label_selected="Limpiar las configuraciones" name="reset_parcel_btn"/>
+ <button label="Comenzar subasta" label_selected="Comenzar subasta" name="start_auction_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_avatar_picker.xml b/indra/newview/skins/default/xui/es/floater_avatar_picker.xml
index df0147b191..c83dd3ef3e 100644
--- a/indra/newview/skins/default/xui/es/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/es/floater_avatar_picker.xml
@@ -1,42 +1,47 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="avatarpicker" title="ELEGIR A UN RESIDENTE">
+ <floater.string name="not_found">
+ No se ha encontrado &apos;[TEXT]&apos;
+ </floater.string>
+ <floater.string name="no_one_near">
+ No hay nadie cerca
+ </floater.string>
+ <floater.string name="no_results">
+ Sin resultados
+ </floater.string>
+ <floater.string name="searching">
+ Buscando...
+ </floater.string>
+ <string label="Elegir" label_selected="Elegir" name="Select">
+ Seleccionar
+ </string>
+ <string name="Close">
+ Cerrar
+ </string>
<tab_container name="ResidentChooserTabs">
<panel label="Buscar" name="SearchPanel">
<text name="InstructSearchResidentName">
- Escriba parte del nombre del residente:
+ Escribe parte del nombre de la persona:
</text>
- <button label="Buscar" label_selected="Buscar" name="Find"/>
+ <button label="Ir" label_selected="Ir" name="Find"/>
</panel>
- <panel label="Tarjetas de visita" name="CallingCardsPanel">
- <text name="InstructSelectCallingCard">
- Elija una tarjeta de visita:
+ <panel label="Amigos" name="FriendsPanel">
+ <text name="InstructSelectFriend">
+ Elige a una persona:
</text>
</panel>
<panel label="Cercanos" name="NearMePanel">
<text name="InstructSelectResident">
- Seleccionar un
-residente cercano:
+ Elegir a alguien que esté cerca:
</text>
- <button font="SansSerifSmall" left_delta="1" width="115" label="Actualizar la lista" label_selected="Actualizar la lista" name="Refresh"/>
- <slider label="Alcance" name="near_me_range" bottom_delta="-36"/>
+ <slider bottom_delta="-36" label="Alcance" name="near_me_range"/>
<text name="meters">
Metros
</text>
- <scroll_list bottom_delta="-169" height="159" name="NearMe" />
+ <button font="SansSerifSmall" label="Actualizar la lista" label_selected="Actualizar la lista" left_delta="1" name="Refresh" width="115"/>
+ <scroll_list bottom_delta="-169" height="159" name="NearMe"/>
</panel>
</tab_container>
- <button label="Elegir" label_selected="Elegir" name="Select"/>
- <button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
- <string name="not_found">
- No se ha encontrado &apos;[TEXT]&apos;
- </string>
- <string name="no_one_near">
- No hay nadie cerca
- </string>
- <string name="no_results">
- Sin resultados
- </string>
- <string name="searching">
- Buscando...
- </string>
+ <button label="OK" label_selected="OK" name="ok_btn"/>
+ <button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_avatar_textures.xml b/indra/newview/skins/default/xui/es/floater_avatar_textures.xml
index 8febe4b0a9..54ef34264c 100644
--- a/indra/newview/skins/default/xui/es/floater_avatar_textures.xml
+++ b/indra/newview/skins/default/xui/es/floater_avatar_textures.xml
@@ -1,30 +1,48 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="avatar_texture_debug" title="TEXTURAS DEL AVATAR">
- <text name="baked_label">
- Texturas predeterminadas
- </text>
- <text name="composite_label">
- Texturas compuestas
- </text>
- <texture_picker label="Cabeza" name="baked_head"/>
- <texture_picker label="Maquillaje" name="head_bodypaint"/>
- <texture_picker label="Pelo" name="hair"/>
- <button label="Soltar" label_selected="Soltar" name="Dump"/>
- <texture_picker label="Ojos" name="baked_eyes"/>
- <texture_picker label="Ojo" name="eye_texture"/>
- <texture_picker label="Parte superior del cuerpo" name="baked_upper_body"/>
- <texture_picker label="Tatuaje de la parte superior del cuerpo" name="upper_bodypaint"/>
- <texture_picker label="Camiseta" name="undershirt"/>
- <texture_picker label="Guantes" name="gloves"/>
- <texture_picker label="Camisa" name="shirt"/>
- <texture_picker label="Parte superior de la chaqueta" name="upper_jacket"/>
- <texture_picker label="Parte inferior del cuerpo" name="baked_lower_body"/>
- <texture_picker label="Tatuaje de la parte inferior del cuerpo" name="lower_bodypaint"/>
- <texture_picker label="Ropa interior" name="underpants"/>
- <texture_picker label="Calcetines" name="socks"/>
- <texture_picker label="Zapatos" name="shoes"/>
- <texture_picker label="Pantalones" name="pants"/>
- <texture_picker label="Chaqueta" name="jacket"/>
- <texture_picker label="Falda" name="baked_skirt"/>
- <texture_picker label="Falda" name="skirt_texture"/>
+ <floater.string name="InvalidAvatar">
+ AVATAR NO VÃLIDO
+ </floater.string>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="label">
+ Texturas obtenidas mediante bake
+ </text>
+ <text name="composite_label">
+ Texturas compuestas
+ </text>
+ <button label="Volcar IDs a la consola" label_selected="Volcado" name="Dump"/>
+ <panel name="scroll_content_panel">
+ <texture_picker label="Pelo" name="hair-baked"/>
+ <texture_picker label="Pelo" name="hair_grain"/>
+ <texture_picker label="Alfa del pelo" name="hair_alpha"/>
+ <texture_picker label="Cabeza" name="head-baked"/>
+ <texture_picker label="Maquillaje" name="head_bodypaint"/>
+ <texture_picker label="Alfa de la cabeza" name="head_alpha"/>
+ <texture_picker label="Tatuaje de la cabeza" name="head_tattoo"/>
+ <texture_picker label="Ojos" name="eyes-baked"/>
+ <texture_picker label="Ojo" name="eyes_iris"/>
+ <texture_picker label="Alfa de los ojos" name="eyes_alpha"/>
+ <texture_picker label="Parte superior del cuerpo" name="upper-baked"/>
+ <texture_picker label="Pintura corporal superior" name="upper_bodypaint"/>
+ <texture_picker label="Camiseta" name="upper_undershirt"/>
+ <texture_picker label="Guantes" name="upper_gloves"/>
+ <texture_picker label="Camisa" name="upper_shirt"/>
+ <texture_picker label="Parte superior de la chaqueta" name="upper_jacket"/>
+ <texture_picker label="Alfa superior" name="upper_alpha"/>
+ <texture_picker label="Tatuaje superior" name="upper_tattoo"/>
+ <texture_picker label="Parte inferior del cuerpo" name="lower-baked"/>
+ <texture_picker label="Pintura corporal inferior" name="lower_bodypaint"/>
+ <texture_picker label="Ropa interior" name="lower_underpants"/>
+ <texture_picker label="Calcetines" name="lower_socks"/>
+ <texture_picker label="Zapatos" name="lower_shoes"/>
+ <texture_picker label="Pantalones" name="lower_pants"/>
+ <texture_picker label="Chaqueta" name="lower_jacket"/>
+ <texture_picker label="Alfa inferior" name="lower_alpha"/>
+ <texture_picker label="Tatuaje inferior" name="lower_tattoo"/>
+ <texture_picker label="Falda" name="skirt-baked"/>
+ <texture_picker label="Falda" name="skirt"/>
+ </panel>
+ </panel>
+ </scroll_container>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_beacons.xml b/indra/newview/skins/default/xui/es/floater_beacons.xml
index 2df90bc911..b86967755c 100644
--- a/indra/newview/skins/default/xui/es/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/es/floater_beacons.xml
@@ -1,15 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="beacons" title="BALIZAS">
<panel name="beacons_panel">
- <check_box label="Objetos con script sólo al tocarlos" name="touch_only"/>
- <check_box label="Objetos con script" name="scripted"/>
- <check_box label="Objetos materiales" name="physical"/>
- <check_box label="Fuentes de sonido" name="sounds"/>
- <check_box label="Fuentes de partículas" name="particles"/>
- <check_box label="Activar los realzados" name="highlights"/>
- <check_box label="Activar las balizas" name="beacons"/>
- <text name="beacon_width_label">
- Ancho de la baliza:
+ <text name="label_show">
+ Mostrar:
</text>
+ <check_box label="Balizas" name="beacons"/>
+ <check_box label="Realzados" name="highlights"/>
+ <text name="beacon_width_label" tool_tip="Ancho de la baliza">
+ Ancho:
+ </text>
+ <text name="label_objects">
+ Para estos objetos:
+ </text>
+ <check_box label="Materiales" name="physical"/>
+ <check_box label="Con scripts" name="scripted"/>
+ <check_box label="Sólo tocar" name="touch_only"/>
+ <check_box label="Origen de sonidos" name="sounds"/>
+ <check_box label="Origen de partículas" name="particles"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_build_options.xml b/indra/newview/skins/default/xui/es/floater_build_options.xml
index 3d839bf645..9d63abd73c 100644
--- a/indra/newview/skins/default/xui/es/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/es/floater_build_options.xml
@@ -1,8 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="build options floater" title="OPCIONES DE LA CUADRÃCULA">
- <spinner label="Unidad de la cuadrícula (metros)" name="GridResolution" width="250" label_width="192"/>
- <spinner label="Graduación de la cuadrícula (metros)" name="GridDrawSize" width="250" label_width="192"/>
+ <spinner label="Unidad de la cuadrícula (metros)" label_width="192" name="GridResolution" width="250"/>
+ <spinner label="Alcance de la cuadrícula (metros)" label_width="192" name="GridDrawSize" width="250"/>
<check_box label="Activar subunidades" name="GridSubUnit"/>
<check_box label="Ver la sección transversal" name="GridCrossSection"/>
+ <text name="grid_opacity_label" tool_tip="Opacidad de la cuadrícula">
+ Opacidad:
+ </text>
<slider label="Opacidad de la cuadrícula" name="GridOpacity" width="250"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_bulk_perms.xml b/indra/newview/skins/default/xui/es/floater_bulk_perms.xml
index 0553f4c672..f1948220b4 100644
--- a/indra/newview/skins/default/xui/es/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/es/floater_bulk_perms.xml
@@ -1,44 +1,54 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterbulkperms" title="CAMBIO MASIVO DE LOS PERMISOS DEL CONTENIDO">
- <text name="applyto">
- Tipos de contenido
- </text>
+<floater name="floaterbulkperms" title="EDITAR LOS PERMISOS DEL CONTENIDO">
+ <floater.string name="nothing_to_modify_text">
+ Lo seleccionado tiene contenidos no editables.
+ </floater.string>
+ <floater.string name="status_text">
+ Configurando los permisos de [NAME]
+ </floater.string>
+ <floater.string name="start_text">
+ Iniciando el cambio de permisos solicitado...
+ </floater.string>
+ <floater.string name="done_text">
+ Finalizado el cambio de permisos solicitado.
+ </floater.string>
<check_box label="Animación" name="check_animation"/>
+ <icon name="icon_animation" tool_tip="Animaciones"/>
<check_box label="Partes del cuerpo" name="check_bodypart"/>
+ <icon name="icon_bodypart" tool_tip="Partes del cuerpo"/>
<check_box label="Ropa" name="check_clothing"/>
+ <icon name="icon_clothing" tool_tip="Ropa"/>
<check_box label="Gestos" name="check_gesture"/>
- <check_box label="Hitos" name="check_landmark"/>
+ <icon name="icon_gesture" tool_tip="Gestos"/>
<check_box label="Notas" name="check_notecard"/>
+ <icon name="icon_notecard" tool_tip="Notas"/>
<check_box label="Objetos" name="check_object"/>
+ <icon name="icon_object" tool_tip="Objetos"/>
<check_box label="Scripts" name="check_script"/>
+ <icon name="icon_script" tool_tip="Scripts"/>
<check_box label="Sonidos" name="check_sound"/>
+ <icon name="icon_sound" tool_tip="Sonidos"/>
<check_box label="Texturas" name="check_texture"/>
- <button label="Marcar todo" label_selected="Todo" name="check_all"/>
- <button label="Desmarcar todo" label_selected="Ninguno" name="check_none"/>
+ <icon name="icon_texture" tool_tip="Texturas"/>
+ <button label="√ Todos" label_selected="Todo" name="check_all"/>
+ <button label="Limpiar" label_selected="Ninguno" name="check_none"/>
<text name="newperms">
- Permisos nuevos
+ Permisos nuevos del contenido
+ </text>
+ <text name="GroupLabel">
+ Grupo:
</text>
- <check_box label="Compartir con el grupo" name="share_with_group"/>
- <check_box label="Permitir a cualquiera que lo copie" name="everyone_copy"/>
+ <check_box label="Compartir" name="share_with_group"/>
+ <text name="AnyoneLabel">
+ Cualquiera:
+ </text>
+ <check_box label="Copiarlo" name="everyone_copy"/>
<text name="NextOwnerLabel">
- El próximo propietario puede:
+ Próximo propietario:
</text>
<check_box label="Modificarlo" name="next_owner_modify"/>
<check_box label="Copiarlo" name="next_owner_copy"/>
- <check_box label="Revenderlo/Darlo" name="next_owner_transfer"/>
- <button label="Ayuda" name="help"/>
- <button label="Aplicar" name="apply"/>
- <button label="Cerrar" name="close"/>
- <string name="nothing_to_modify_text">
- Lo seleccionado tiene contenidos no editables.
- </string>
- <string name="status_text">
- Configurando los permisos de [NAME]
- </string>
- <string name="start_text">
- Iniciando el cambio de permisos solicitado...
- </string>
- <string name="done_text">
- Finalizado el cambio de permisos solicitado.
- </string>
+ <check_box initial_value="true" label="Transferirlo" name="next_owner_transfer" tool_tip="El próximo propietario puede dar o revender este objeto"/>
+ <button label="OK" name="apply"/>
+ <button label="Cancelar" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_bumps.xml b/indra/newview/skins/default/xui/es/floater_bumps.xml
index 0522f788bb..6a9c6b1f22 100644
--- a/indra/newview/skins/default/xui/es/floater_bumps.xml
+++ b/indra/newview/skins/default/xui/es/floater_bumps.xml
@@ -1,21 +1,24 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_bumps" title="CHOQUES, EMPUJONES, E IMPACTOS">
- <text name="none_detected">
+ <floater.string name="none_detected">
No se han detectado
- </text>
- <text name="bump">
+ </floater.string>
+ <floater.string name="bump">
[TIME] [FIRST] [LAST] ha chocado con usted
- </text>
- <text name="llpushobject">
+ </floater.string>
+ <floater.string name="llpushobject">
[TIME] [FIRST] [LAST] le ha empujado con un script
- </text>
- <text name="selected_object_collide">
+ </floater.string>
+ <floater.string name="selected_object_collide">
[TIME] [FIRST] [LAST] ha hecho que un objeto impacte con usted
- </text>
- <text name="scripted_object_collide">
+ </floater.string>
+ <floater.string name="scripted_object_collide">
[TIME] [FIRST] [LAST] ha hecho que un objeto con script impacte con usted
- </text>
- <text name="physical_object_collide">
+ </floater.string>
+ <floater.string name="physical_object_collide">
[TIME] [FIRST] [LAST] ha hecho que un objeto material impacte con usted
- </text>
+ </floater.string>
+ <floater.string name="timeStr">
+ [[hour,datetime,slt]:[min,datetime,slt]]
+ </floater.string>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_buy_contents.xml b/indra/newview/skins/default/xui/es/floater_buy_contents.xml
index c4d269ff39..98604ad5f4 100644
--- a/indra/newview/skins/default/xui/es/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/es/floater_buy_contents.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_buy_contents" title="COMPRAR EL CONTENIDO">
+<floater name="floater_buy_contents" title="COMPRAR LOS CONTENIDOS">
<text name="contains_text">
[NAME] contiene:
</text>
diff --git a/indra/newview/skins/default/xui/es/floater_buy_currency.xml b/indra/newview/skins/default/xui/es/floater_buy_currency.xml
index 1ecb813dd1..a8fa030846 100644
--- a/indra/newview/skins/default/xui/es/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/es/floater_buy_currency.xml
@@ -1,71 +1,66 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="buy currency" title="COMPRAR DINERO">
- <text name="info_buying">
- Comprando dinero:
- </text>
- <text name="info_cannot_buy" left="5" right="-5">
- No puede comprar en este momento:
- </text>
- <text name="info_need_more" left="5" right="-5">
- Necesita más dinero:
+<floater name="buy currency" title="COMPRAR L$">
+ <floater.string name="buy_currency">
+ Comprar [LINDENS] L$ por, aprox., [LOCALAMOUNT]
+ </floater.string>
+ <text left="5" name="info_need_more" right="-5">
+ Necesitas más L$
</text>
- <text name="error_message">
- Algo no va bien.
- </text>
- <button label="Ir al sitio web" name="error_web"/>
<text name="contacting">
Contactando con el LindeX...
</text>
- <text name="buy_action_unknown" right="-5">
- Comprar L$ en el sistema LindeX de cambio
+ <text name="info_buying">
+ Comprar L$
</text>
- <text name="buy_action">
- [NAME] [PRICE] L$
+ <text name="balance_label">
+ Tengo
+ </text>
+ <text name="balance_amount">
+ [AMT] L$
</text>
<text name="currency_action" width="50">
- Comprar
+ Quiero comprar
+ </text>
+ <text name="currency_label">
+ L$
</text>
- <line_editor name="currency_amt" width="65" left_delta="50">
+ <line_editor label="L$" left_delta="50" name="currency_amt" width="65">
1234
</line_editor>
- <text name="currency_est" width="138" left_delta="68">
- por, aprox., [LOCALAMOUNT]
- </text>
- <text name="getting_data">
- Obteniendo los datos...
- </text>
- <text name="balance_label">
- Actualmente, tiene
+ <text name="buying_label">
+ Al precio de
</text>
- <text name="balance_amount">
- [AMT] L$
+ <text left_delta="68" name="currency_est" width="138">
+ aprox. [LOCALAMOUNT]
</text>
- <text name="buying_label">
- Está comprando
+ <text name="getting_data">
+ Calculando...
</text>
- <text name="buying_amount">
- [AMT] L$
+ <text name="buy_action">
+ [ACTION]
</text>
<text name="total_label">
- Su saldo será de
+ Mi nuevo saldo será
</text>
<text name="total_amount">
[AMT] L$
</text>
<text name="currency_links">
- [http://www.secondlife.com/my/account/payment_method_management.php?lang=es-ES payment method] | [http://www.secondlife.com/my/account/currency.php?lang=es-ES currency] | [http://www.secondlife.com/my/account/exchange_rates.php?lang=es-ES exchange rate]
+ [http://www.secondlife.com/my/account/payment_method_management.php método de pago] | [http://www.secondlife.com/my/account/currency.php moneda] | [http://www.secondlife.com/my/account/exchange_rates.php tipo de cambio]
+ </text>
+ <text name="exchange_rate_note">
+ Vuelve a escribir la cantidad para ver el tipo de cambio más reciente.
</text>
<text name="purchase_warning_repurchase" right="-10">
- Confirmando esta compra sólo compra la moneda.
-Tendrá que intentar de nuevo la operación.
+ Confirmando que con esta compra sólo se compran L$, no el objeto.
</text>
<text name="purchase_warning_notenough">
- No está comprando dinero suficiente.
-Aumente la cantidad a comprar.
+ No estás comprando suficientes L$. Por favor, aumenta la cantidad.
</text>
+ <button label="Comprar ahora" name="buy_btn"/>
<button label="Cancelar" name="cancel_btn"/>
- <button label="Comprar" name="buy_btn"/>
- <string name="buy_currency">
- Compre [LINDENS] L$ por, aprox., [LOCALAMOUNT]
- </string>
+ <text left="5" name="info_cannot_buy" right="-5">
+ No se pudo hacer la compra
+ </text>
+ <button label="Ir a la web" name="error_web"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_buy_currency_html.xml b/indra/newview/skins/default/xui/es/floater_buy_currency_html.xml
new file mode 100644
index 0000000000..08ea67d4cb
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_buy_currency_html.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_buy_currency_html" title="COMPRAR DINERO"/>
diff --git a/indra/newview/skins/default/xui/es/floater_buy_land.xml b/indra/newview/skins/default/xui/es/floater_buy_land.xml
index 7ff45fcf79..74243a4d06 100644
--- a/indra/newview/skins/default/xui/es/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/es/floater_buy_land.xml
@@ -1,27 +1,153 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="buy land" title="COMPRAR TERRENO">
+ <floater.string name="can_resell">
+ Puede revenderse.
+ </floater.string>
+ <floater.string name="can_not_resell">
+ No se puede revender.
+ </floater.string>
+ <floater.string name="can_change">
+ Puede unirse o dividirse.
+ </floater.string>
+ <floater.string name="can_not_change">
+ No puede unirse ni dividirse.
+ </floater.string>
+ <floater.string name="cant_buy_for_group">
+ No tienes permiso de comprar terreno para el grupo que tienes activado.
+ </floater.string>
+ <floater.string name="no_land_selected">
+ No se ha seleccionado terreno.
+ </floater.string>
+ <floater.string name="multiple_parcels_selected">
+ Se han seleccionado varias parcelas diferentes.
+Inténtalo seleccionando un área más pequeña.
+ </floater.string>
+ <floater.string name="no_permission">
+ No tienes permiso de comprar terreno para el grupo que tienes activado.
+ </floater.string>
+ <floater.string name="parcel_not_for_sale">
+ La parcela seleccionada no está en venta.
+ </floater.string>
+ <floater.string name="group_already_owns">
+ El grupo ya es propietario de la parcela.
+ </floater.string>
+ <floater.string name="you_already_own">
+ Ya eres propietario de la parcela.
+ </floater.string>
+ <floater.string name="set_to_sell_to_other">
+ La parcela seleccionada está marcada para ser vendida a otro.
+ </floater.string>
+ <floater.string name="no_public_land">
+ El área seleccionada no tiene terreno público.
+ </floater.string>
+ <floater.string name="not_owned_by_you">
+ Estás seleccionado un terreno propiedad de otro Residente.
+Prueba a seleccionar un área más pequeña.
+ </floater.string>
+ <floater.string name="processing">
+ Procesando tu compra...
+
+(Llevará uno o dos minutos).
+ </floater.string>
+ <floater.string name="fetching_error">
+ Se ha producido un error al ir a buscar la información de compra de terreno.
+ </floater.string>
+ <floater.string name="buying_will">
+ Al comprar este terreno:
+ </floater.string>
+ <floater.string name="buying_for_group">
+ Comprando terreno para el grupo:
+ </floater.string>
+ <floater.string name="cannot_buy_now">
+ No se puede comprar ahora:
+ </floater.string>
+ <floater.string name="not_for_sale">
+ No está en venta:
+ </floater.string>
+ <floater.string name="none_needed">
+ no necesita
+ </floater.string>
+ <floater.string name="must_upgrade">
+ Para poseer terreno, tu cuenta debe ascender de categoría.
+ </floater.string>
+ <floater.string name="cant_own_land">
+ Tu cuenta puede poseer terreno.
+ </floater.string>
+ <floater.string name="land_holdings">
+ Tienes [BUYER] m² de terreno.
+ </floater.string>
+ <floater.string name="pay_to_for_land">
+ Pagar por este terreno [AMOUNT] L$ a [SELLER]
+ </floater.string>
+ <floater.string name="buy_for_US">
+ Comprar [AMOUNT] L$ por, aprox., [LOCAL_AMOUNT],
+ </floater.string>
+ <floater.string name="parcel_meters">
+ Este terreno tiene [AMOUNT] m²
+ </floater.string>
+ <floater.string name="premium_land">
+ Este terreno es &apos;premium&apos;, y se considerará como de [AMOUNT] m².
+ </floater.string>
+ <floater.string name="discounted_land">
+ Este terreno es &apos;discounted&apos;, y se considerará como de [AMOUNT] m².
+ </floater.string>
+ <floater.string name="meters_supports_object">
+ [AMOUNT] m²
+admite [AMOUNT2] objetos
+ </floater.string>
+ <floater.string name="sold_with_objects">
+ vendido con los objetos
+ </floater.string>
+ <floater.string name="sold_without_objects">
+ objetos no incluidos
+ </floater.string>
+ <floater.string name="info_price_string">
+ [PRICE] L$
+([PRICE_PER_SQM] L$/m²)
+[SOLD_WITH_OBJECTS]
+ </floater.string>
+ <floater.string name="insufficient_land_credits">
+ Antes de que se complete la compra, el grupo [GROUP] necesitará
+los suficientes créditos de uso en contribución de terreno
+para cubrir esta parcela.
+ </floater.string>
+ <floater.string name="have_enough_lindens">
+ Tienes [AMOUNT] L$, cantidad suficiente para comprar este terreno.
+ </floater.string>
+ <floater.string name="not_enough_lindens">
+ Sólo tienes [AMOUNT] L$. Necesitarías [AMOUNT2] L$ más.
+ </floater.string>
+ <floater.string name="balance_left">
+ Tras la compra, aún tendrás [AMOUNT] L$.
+ </floater.string>
+ <floater.string name="balance_needed">
+ Para costearte este terreno, deberás comprar, al menos, [AMOUNT] L$.
+ </floater.string>
+ <floater.string name="no_parcel_selected">
+ (No se ha seleccionado una parcela)
+ </floater.string>
<text name="region_name_label">
Región:
</text>
- <text name="region_name_text" left="565">
+ <text left="565" name="region_name_text">
(desconocida)
</text>
<text name="region_type_label">
Tipo:
</text>
- <text name="region_type_text" left="565">
+ <text left="565" name="region_type_text">
(desconocido)
</text>
<text name="estate_name_label">
Estado:
</text>
- <text name="estate_name_text" left="565">
+ <text left="565" name="estate_name_text">
(desconocido)
</text>
- <text name="estate_owner_label" width="115" right="565">
+ <text name="estate_owner_label" right="565" width="115">
Propietario del estado:
</text>
- <text name="estate_owner_text" left="565" >
+ <text left="565" name="estate_owner_text">
(desconocido)
</text>
<text name="resellable_changeable_label">
@@ -34,7 +160,7 @@
Podrá o no unirse o dividirse.
</text>
<text name="covenant_text">
- Deve aceptar el Contrato del Estado:
+ Debes aceptar el Contrato del Estado:
</text>
<text left="470" name="covenant_timestamp_text"/>
<text_editor name="covenant_editor">
@@ -58,8 +184,8 @@
</text>
<text name="info_price">
1500 L$
-(1.1 L$/m²)
-incluyendo los objetos
+(1.1/m² L$)
+se vende con los objetos
</text>
<text name="info_action">
Al comprar este terreno:
@@ -69,28 +195,28 @@ incluyendo los objetos
</text>
<button label="Ir al sitio web" name="error_web"/>
<text name="account_action">
- Ascienda a la categoría de miembro premium.
+ Asciende a la categoría de miembro premium.
</text>
<text name="account_reason">
Sólo pueden ser propietarios de terreno los miembros premium.
</text>
<combo_box name="account_level">
- <combo_box.item name="US$9.95/month,billedmonthly" label="9.95 US$/mes, facturados mensualmente" />
- <combo_box.item name="US$7.50/month,billedquarterly" label="7.50 US$/mes, facturados cuatrimestralmente" />
- <combo_box.item name="US$6.00/month,billedannually" label="6.00 US$/mes, facturados anualmente" />
+ <combo_box.item label="9.95 US$/mes, facturados mensualmente" name="US$9.95/month,billedmonthly"/>
+ <combo_box.item label="7.50 US$/mes, facturados trimestralmente" name="US$7.50/month,billedquarterly"/>
+ <combo_box.item label="6.00 US$/mes, facturados anualmente" name="US$6.00/month,billedannually"/>
</combo_box>
<text name="land_use_action">
- Aumenta su cuota mensual por uso de terreno a 40 US$/mes.
+ Aumenta tu cuota mensual por uso de terreno a 40 US$/mes.
</text>
<text name="land_use_reason">
- Usted posee 1309 m² de terreno.
-Esta parcela mide 512 m².
+ Tienes 1309 m² de terreno.
+Esta parcela es de 512 m².
</text>
<text name="purchase_action">
Pagar al residente Joe 4.000 L$ por el terreno
</text>
<text name="currency_reason">
- Tiene 2.100 L$.
+ Tienes 2.100 L$.
</text>
<text name="currency_action">
Comprar más L$
@@ -99,141 +225,12 @@ Esta parcela mide 512 m².
1.000
</line_editor>
<text name="currency_est">
- por, aprox., [AMOUNT2] US$
+ por, aprox., [LOCAL_AMOUNT]
</text>
<text name="currency_balance">
- Tiene 2.100 L$.
+ Tienes 2.100 L$.
</text>
- <check_box label="Quitar [AMOUNT] m² de la contribución del grupo." name="remove_contribution"/>
+ <check_box label="Quitar [AMOUNT] m² de las contribuciones de grupo." name="remove_contribution"/>
<button label="Comprar" name="buy_btn"/>
<button label="Cancelar" name="cancel_btn"/>
- <string name="can_resell">
- Puede revenderse.
- </string>
- <string name="can_not_resell">
- No se puede revender.
- </string>
- <string name="can_change">
- Puede unirse o dividirse.
- </string>
- <string name="can_not_change">
- No puede unirse ni dividirse.
- </string>
- <string name="cant_buy_for_group">
- No tiene permiso de comprar terreno para el grupo que tiene activado.
- </string>
- <string name="no_land_selected">
- No se ha seleccionado terreno.
- </string>
- <string name="multiple_parcels_selected">
- Se han seleccionado varias parcelas diferentes.
-Inténtelo seleccionando un área más pequeña.
- </string>
- <string name="no_permission">
- No tiene permiso de comprar terreno para el grupo que tiene activado.
- </string>
- <string name="parcel_not_for_sale">
- La parcela seleccionada no está en venta.
- </string>
- <string name="group_already_owns">
- El grupo ya es propietario de la parcela.
- </string>
- <string name="you_already_own">
- Usted ya es propietario de la parcela.
- </string>
- <string name="set_to_sell_to_other">
- La parcela seleccionada está marcada para ser vendida a otro
- </string>
- <string name="no_public_land">
- El área seleccionada no tiene terreno público.
- </string>
- <string name="not_owned_by_you">
- Se ha seleccionado terreno propiedad de otro.
-Inténtelo seleccionando un área más pequeña.
- </string>
- <string name="processing">
- Procesando su compra...
-
-(Llevará uno o dos minutos).
- </string>
- <string name="fetching_error">
- Se ha producido un error al ir a buscar la información de compra de terreno.
- </string>
- <string name="buying_will">
- Al comprar este terreno:
- </string>
- <string name="buying_for_group">
- Comprando terreno para el grupo:
- </string>
- <string name="cannot_buy_now">
- No se puede comprar ahora:
- </string>
- <string name="not_for_sale">
- No está en venta:
- </string>
- <string name="none_needed">
- no necesita
- </string>
- <string name="must_upgrade">
- Para poseer terreno, su cuenta debe ascender de categoría.
- </string>
- <string name="cant_own_land">
- Su cuenta puede poseer terreno.
- </string>
- <string name="land_holdings">
- Usted tiene [BUYER] m² de terreno.
- </string>
- <string name="pay_to_for_land">
- Pagar por este terreno [AMOUNT] L$ a [SELLER]
- </string>
- <string name="buy_for_US">
- Comprar [AMOUNT] L$ por, aprox., [AMOUNT2] US$,
- </string>
- <string name="parcel_meters">
- Esta parcela tiene [AMOUNT] m².
- </string>
- <string name="premium_land">
- Este terreno es premium, y se contará como de [AMOUNT] m².
- </string>
- <string name="discounted_land">
- Este terreno tiene descuento, y se contará como de [AMOUNT] m².
- </string>
- <string name="meters_supports_object">
- [AMOUNT] m²
-admite [AMOUNT2] objetos
- </string>
- <string name="sold_with_objects">
- vendido con los objetos
- </string>
- <string name="sold_without_objects">
- objetos no incluidos
- </string>
- <string name="info_price_string">
- [PRICE] L$
-([PRICE_PER_SQM] L$/m²)
-[SOLD_WITH_OBJECTS]
- </string>
- <string name="insufficient_land_credits">
- Antes de que se complete la compra, el grupo [GROUP] necesitará
-los suficientes créditos de uso en contribución de terreno
-para cubrir esta parcela.
- </string>
- <string name="have_enough_lindens">
- Tiene [AMOUNT] L$, cantidad suficiente para comprar este terreno.
- </string>
- <string name="not_enough_lindens">
- Sólo tiene [AMOUNT] L$. Necesitaría [AMOUNT2] L$ más.
- </string>
- <string name="balance_left">
- Tras la compra, aún tendrá [AMOUNT] L$.
- </string>
- <string name="balance_needed">
- Para costearse este terreno, deberá comprar, al menos, [AMOUNT] L$.
- </string>
- <string name="no_parcel_selected">
- (No se ha seleccionado una parcela)
- </string>
- <string name="buy_currency">
- Comprar [LINDENS] L$ por, aprox., [USD] US$
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_buy_object.xml b/indra/newview/skins/default/xui/es/floater_buy_object.xml
index 26696bc868..117d29777f 100644
--- a/indra/newview/skins/default/xui/es/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/es/floater_buy_object.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="contents" title="COMPRAR UNA COPIA DEL OBJETO">
<text name="contents_text">
- y sus contenidos:
+ Contenidos:
</text>
<text name="buy_text">
¿Comprarlo por [AMOUNT] L$ a [NAME]?
diff --git a/indra/newview/skins/default/xui/es/floater_camera.xml b/indra/newview/skins/default/xui/es/floater_camera.xml
index 3aeb4e5771..c625407ba2 100644
--- a/indra/newview/skins/default/xui/es/floater_camera.xml
+++ b/indra/newview/skins/default/xui/es/floater_camera.xml
@@ -9,8 +9,28 @@
<floater.string name="move_tooltip">
Mover la cámara arriba y abajo, izquierda y derecha
</floater.string>
+ <floater.string name="camera_modes_title">
+ Modos de cámara
+ </floater.string>
+ <floater.string name="pan_mode_title">
+ Orbital - Zoom - Panóramica
+ </floater.string>
+ <floater.string name="presets_mode_title">
+ Vistas predefinidas
+ </floater.string>
+ <floater.string name="free_mode_title">
+ Centrar el objeto
+ </floater.string>
<panel name="controls">
- <joystick_track name="cam_track_stick" tool_tip="Mover la cámara arriba y abajo, izquierda y derecha"/>
- <joystick_zoom name="zoom" tool_tip="Hacer zoom con la cámara en lo enfocado"/>
+ <panel name="zoom" tool_tip="Hacer zoom con la cámara en lo enfocado">
+ <joystick_rotate name="cam_rotate_stick" tool_tip="La cámara gira alrededor del punto de vista"/>
+ <slider_bar name="zoom_slider" tool_tip="Hacer zoom en lo enfocado"/>
+ <joystick_track name="cam_track_stick" tool_tip="Mueve la cámara arriba y abajo, a izquierda y derecha"/>
+ </panel>
+ </panel>
+ <panel name="buttons">
+ <button label="" name="presets_btn" tool_tip="Vistas predefinidas"/>
+ <button label="" name="pan_btn" tool_tip="Orbital - Zoom - Panóramica"/>
+ <button label="" name="avatarview_btn" tool_tip="Modos de cámara"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_color_picker.xml b/indra/newview/skins/default/xui/es/floater_color_picker.xml
index 4395ee6890..ed168c09d5 100644
--- a/indra/newview/skins/default/xui/es/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/es/floater_color_picker.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="ColorPicker" title="PALETA DE COLORES">
+<floater name="ColorPicker" title="SELECTOR DE COLOR">
<text name="r_val_text">
Rojo:
</text>
@@ -18,14 +18,13 @@
<text name="l_val_text">
Lumin.:
</text>
- <check_box label="Aplicar ahora mismo" name="apply_immediate"/>
+ <check_box label="Aplicarlo ahora" name="apply_immediate"/>
<button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/>
- <button label="Elegir" label_selected="Elegir" name="select_btn"/>
+ <button label="OK" label_selected="OK" name="select_btn"/>
<text name="Current color:">
Color actual:
</text>
<text name="(Drag below to save.)">
- (Arrástrelo abajo
- para guardarlo)
+ (arrástralo abajo para guardarlo)
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_customize.xml b/indra/newview/skins/default/xui/es/floater_customize.xml
index 94452dae6b..77b670d5f0 100644
--- a/indra/newview/skins/default/xui/es/floater_customize.xml
+++ b/indra/newview/skins/default/xui/es/floater_customize.xml
@@ -1,21 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater customize" title="APARIENCIA" width="527">
- <tab_container name="customize tab container" width="525">
- <placeholder label="Partes del cuerpo" name="body_parts_placeholder"/>
- <panel label="Forma" name="Shape" width="389">
+<floater name="floater customize" title="APARIENCIA">
+ <tab_container name="customize tab container">
+ <text label="Partes del cuerpo" name="body_parts_placeholder">
+ Partes del cuerpo
+ </text>
+ <panel label="Forma" name="Shape">
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
<button label="Cuerpo" label_selected="Cuerpo" name="Body"/>
<button label="Cabeza" label_selected="Cabeza" name="Head"/>
<button label="Ojos" label_selected="Ojos" name="Eyes"/>
- <button label="Ojos" label_selected="Orejas" name="Ears"/>
+ <button label="Orejas" label_selected="Orejas" name="Ears"/>
<button label="Nariz" label_selected="Nariz" name="Nose"/>
<button label="Boca" label_selected="Boca" name="Mouth"/>
<button label="Barbilla" label_selected="Barbilla" name="Chin"/>
<button label="Torso" label_selected="Torso" name="Torso"/>
<button label="Piernas" label_selected="Piernas" name="Legs"/>
<radio_group name="sex radio">
- <radio_item name="radio" label="Mujer" />
- <radio_item name="radio2" label="Varón" />
+ <radio_item label="Mujer" name="radio" value="0"/>
+ <radio_item label="Varón" name="radio2" value="1"/>
</radio_group>
<text name="title">
[DESC]
@@ -33,18 +35,17 @@
Situada en [PATH]
</text>
<text name="not worn instructions">
- Póngase una forma nueva arrastrando una desde su inventario hasta su
-avatar. O parta de cero creando una nueva y vistiéndola.
+ Ponte una anatomía nueva arrastrándola desde tu inventario hasta tu avatar. O bien puedes crear una nueva partiendo de cero.
</text>
<text name="no modify instructions">
No tiene permiso para modificar este ítem.
</text>
- <text name="Item Action Label" right="107">
+ <text name="Item Action Label">
Forma:
</text>
<button label="Crear una forma nueva" label_selected="Crear una forma nueva" name="Create New"/>
- <button left="113" label="Guardar" label_selected="Guardar" name="Save"/>
- <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Guardar" label_selected="Guardar" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
</panel>
<panel label="Piel" name="Skin">
<button label="Color de piel" label_selected="Color de piel" name="Skin Color" width="115"/>
@@ -67,8 +68,7 @@ avatar. O parta de cero creando una nueva y vistiéndola.
Situada en [PATH]
</text>
<text name="not worn instructions">
- Póngase otra piel arrastrando una desde su inventario hasta su
-avatar. O parta de cero creando una nueva y vistiéndola.
+ Ponte una piel nueva arrastrándola desde tu inventario hasta tu avatar. O bien puedes crear una nueva partiendo de cero.
</text>
<text name="no modify instructions">
No tiene permiso para modificar este ítem.
@@ -76,12 +76,12 @@ avatar. O parta de cero creando una nueva y vistiéndola.
<text name="Item Action Label" right="107">
Piel:
</text>
- <texture_picker width="90" label="Tatuaje: cabeza" name="Head Tattoos" tool_tip="Pulse para elegir una imagen"/>
- <texture_picker width="90" label="Tatuaje: superior" name="Upper Tattoos" tool_tip="Pulse para elegir una imagen"/>
- <texture_picker width="90" label="Tatuaje: inferior" name="Lower Tattoos" tool_tip="Pulse para elegir una imagen"/>
+ <texture_picker label="Tatuaje: cabeza" name="Head Tattoos" tool_tip="Pulse para elegir una imagen" width="90"/>
+ <texture_picker label="Tatuaje: superior" name="Upper Tattoos" tool_tip="Pulse para elegir una imagen" width="90"/>
+ <texture_picker label="Tatuaje: inferior" name="Lower Tattoos" tool_tip="Pulse para elegir una imagen" width="90"/>
<button label="Crear una piel nueva" label_selected="Crear una piel nueva" name="Create New"/>
- <button left="113" label="Guardar" label_selected="Guardar" name="Save"/>
- <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
<panel label="Pelo" name="Hair">
@@ -105,8 +105,7 @@ avatar. O parta de cero creando una nueva y vistiéndola.
Situado en [PATH]
</text>
<text name="not worn instructions">
- Póngase otro pelo arrastrando uno desde su inventario hasta su
-avatar. O parta de cero creando uno nueva y vistiéndolo.
+ Ponte un pelo nuevo arrastrándolo desde tu inventario hasta tu avatar. O bien puedes crear uno nuevo partiendo de cero.
</text>
<text name="no modify instructions">
No tiene permiso para modificar este ítem.
@@ -116,8 +115,8 @@ avatar. O parta de cero creando uno nueva y vistiéndolo.
</text>
<texture_picker label="Textura" name="Texture" tool_tip="Pulse para elegir una imagen"/>
<button label="Crear un pelo nuevo" label_selected="Crear un pelo nuevo" name="Create New"/>
- <button left="113" label="Guardar" label_selected="Guardar" name="Save"/>
- <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
<panel label="Ojos" name="Eyes">
@@ -137,8 +136,7 @@ avatar. O parta de cero creando uno nueva y vistiéndolo.
Situados en [PATH]
</text>
<text name="not worn instructions">
- Póngase otros ojos arrastrando unos desde su inventario hasta su
-avatar. O parta de cero creando unos nuevos y vistiéndoselos.
+ Ponte unos ojos nuevos arrastrándolos desde tu inventario hasta tu avatar. O bien puedes crear unos nuevos partiendo de cero.
</text>
<text name="no modify instructions">
No tiene permiso para modificar este ítem.
@@ -148,18 +146,20 @@ avatar. O parta de cero creando unos nuevos y vistiéndoselos.
</text>
<texture_picker label="Iris" name="Iris" tool_tip="Pulse para elegir una imagen"/>
<button label="Crear unos ojos nuevos" label_selected="Crear unos ojos nuevos" name="Create New"/>
- <button left="113" label="Guardar" label_selected="Guardar" name="Save"/>
- <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
- <panel label="Ropa" name="clothes_placeholder"/>
+ <text label="Ropa" name="clothes_placeholder">
+ Ropas
+ </text>
<panel label="Camisa" name="Shirt">
<texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulse para abrir el selector de color"/>
- <button label="Crear una falda nueva" label_selected="Crear una falda nueva" name="Create New"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
<button label="Quitarla" label_selected="Quitarla" name="Take Off"/>
- <button left="113" label="Guardar" label_selected="Guardar" name="Save"/>
- <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Crear una falda nueva" label_selected="Crear una falda nueva" name="Create New"/>
+ <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
<text name="title">
[DESC]
@@ -177,8 +177,7 @@ avatar. O parta de cero creando unos nuevos y vistiéndoselos.
Situada en [PATH]
</text>
<text name="not worn instructions">
- Póngase otra camisa arrastrando una desde su inventario hasta su
-avatar. O parta de cero creando una nueva y vistiéndola.
+ Ponte una camisa nueva arrastrándola desde tu inventario hasta tu avatar. O bien puedes crear una nueva partiendo de cero.
</text>
<text name="no modify instructions">
No tiene permiso para modificar este ítem.
@@ -189,11 +188,11 @@ avatar. O parta de cero creando una nueva y vistiéndola.
</panel>
<panel label="Pantalones" name="Pants">
<texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulse para abrir el selector de color"/>
- <button label="Crear unos pantalones nuevos" label_selected="Crear unos pantalones nuevos" name="Create New" width="185"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
<button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/>
- <button left="113" label="Guardar" label_selected="Guardar" name="Save"/>
- <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Crear unos pantalones nuevos" label_selected="Crear unos pantalones nuevos" name="Create New" width="185"/>
+ <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
<text name="title">
[DESC]
@@ -211,8 +210,7 @@ avatar. O parta de cero creando una nueva y vistiéndola.
Situados en [PATH]
</text>
<text name="not worn instructions">
- Póngase otros pantalones arrastrando unos desde su inventario hasta su
-avatar. O parta de cero creando unos nuevos y vistiéndoselos.
+ Ponte unos pantalones nuevos arrastrándolos desde tu inventario hasta tu avatar. O bien puedes crear unos nuevos partiendo de cero.
</text>
<text name="no modify instructions">
No tiene permiso para modificar este ítem.
@@ -238,9 +236,9 @@ avatar. O parta de cero creando unos nuevos y vistiéndoselos.
Situados en [PATH]
</text>
<text name="not worn instructions">
- Póngase otros zapatos arrastrando unos desde su inventario hasta su
-avatar. O parta de cero creando unos nuevos y vistiéndoselos.
+ Ponte unos zapatos nuevos arrastrándolos desde tu inventario hasta tu avatar. O bien puedes crear unos nuevos partiendo de cero.
</text>
+ <button label="Crear unos zapatos nuevos" label_selected="Crear unos zapatos nuevos" name="Create New"/>
<text name="no modify instructions">
No tiene permiso para modificar este ítem.
</text>
@@ -248,11 +246,10 @@ avatar. O parta de cero creando unos nuevos y vistiéndoselos.
Zapatos:
</text>
<texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulse para abrir el selector de color"/>
- <button label="Crear unos zapatos nuevos" label_selected="Crear unos zapatos nuevos" name="Create New"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
<button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/>
- <button left="113" label="Guardar" label_selected="Guardar" name="Save"/>
- <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
<panel label="Calcetines" name="Socks">
@@ -272,9 +269,9 @@ avatar. O parta de cero creando unos nuevos y vistiéndoselos.
Situados en [PATH]
</text>
<text name="not worn instructions">
- Póngase otros calcetines arrastrando unos desde su inventario hasta su
-avatar. O parta de cero creando unos nuevos y vistiéndoselos.
+ Ponte unos calcetines nuevos arrastrándolos desde tu inventario hasta tu avatar. O bien puedes crear unos nuevos partiendo de cero.
</text>
+ <button label="Crear unos calcetines nuevos" label_selected="Crear unos calcetines nuevos" name="Create New" width="185"/>
<text name="no modify instructions">
No tiene permiso para modificar este ítem.
</text>
@@ -282,11 +279,10 @@ avatar. O parta de cero creando unos nuevos y vistiéndoselos.
Calcetines:
</text>
<texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulse para abrir el selector de color"/>
- <button label="Crear unos calcetines nuevos" label_selected="Crear unos calcetines nuevos" name="Create New" width="185"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
<button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/>
- <button left="113" label="Guardar" label_selected="Guardar" name="Save"/>
- <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
<panel label="Chaqueta" name="Jacket">
@@ -306,9 +302,9 @@ avatar. O parta de cero creando unos nuevos y vistiéndoselos.
Situada en [PATH]
</text>
<text name="not worn instructions">
- Póngase otra chaqueta arrastrando una desde su inventario hasta su
-avatar. O parta de cero creando una nueva y vistiéndola.
+ Ponte una chaqueta nueva arrastrándola desde tu inventario hasta tu avatar. O bien puedes crear una nueva partiendo de cero.
</text>
+ <button label="Crear una chaqueta nueva" label_selected="Crear una chaqueta nueva" name="Create New"/>
<text name="no modify instructions">
No tiene permiso para modificar este ítem.
</text>
@@ -317,11 +313,10 @@ avatar. O parta de cero creando una nueva y vistiéndola.
</text>
<texture_picker label="Tela superior" name="Upper Fabric" tool_tip="Pulse para elegir una imagen"/>
<texture_picker label="Tela inferior" name="Lower Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulse para abrir el selector de color"/>
- <button label="Crear una chaqueta nueva" label_selected="Crear una chaqueta nueva" name="Create New"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
<button label="Quitarla" label_selected="Quitarla" name="Take Off"/>
- <button left="113" label="Guardar" label_selected="Guardar" name="Save"/>
- <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
<panel label="Guantes" name="Gloves">
@@ -341,9 +336,9 @@ avatar. O parta de cero creando una nueva y vistiéndola.
Situados en [PATH]
</text>
<text name="not worn instructions">
- Póngase otros guantes arrastrando unos desde su inventario hasta su
-avatar. O parta de cero creando unos nuevos y vistiéndoselos.
+ Ponte unos guantes nuevos arrastrándolos desde tu inventario hasta tu avatar. O bien puedes crear unos nuevos partiendo de cero.
</text>
+ <button label="Crear unos guantes nuevos" label_selected="Crear unos guantes nuevos" name="Create New"/>
<text name="no modify instructions">
No tiene permiso para modificar este ítem.
</text>
@@ -351,11 +346,10 @@ avatar. O parta de cero creando unos nuevos y vistiéndoselos.
Guantes:
</text>
<texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulse para abrir el selector de color"/>
- <button label="Crear unos guantes nuevos" label_selected="Crear unos guantes nuevos" name="Create New"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
<button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/>
- <button left="113" label="Guardar" label_selected="Guardar" name="Save"/>
- <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
<panel label="Camiseta" name="Undershirt">
@@ -375,9 +369,9 @@ avatar. O parta de cero creando unos nuevos y vistiéndoselos.
Situada en [PATH]
</text>
<text name="not worn instructions">
- Póngase otra camiseta arrastrando una desde su inventario hasta su
-avatar. O parta de cero creando una nueva y vistiéndola.
+ Ponte una camiseta nueva arrastrándola desde tu inventario hasta tu avatar. O bien puedes crear una nueva partiendo de cero.
</text>
+ <button label="Crear una camiseta nueva" label_selected="Crear una camiseta nueva" name="Create New"/>
<text name="no modify instructions">
No tiene permiso para modificar este ítem.
</text>
@@ -385,11 +379,10 @@ avatar. O parta de cero creando una nueva y vistiéndola.
Camiseta:
</text>
<texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulse para abrir el selector de color"/>
- <button label="Crear una camiseta nueva" label_selected="Crear una camiseta nueva" name="Create New"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
<button label="Quitarla" label_selected="Quitarla" name="Take Off"/>
- <button left="113" label="Guardar" label_selected="Guardar" name="Save"/>
- <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
<panel label="Ropa interior" name="Underpants">
@@ -409,9 +402,9 @@ avatar. O parta de cero creando una nueva y vistiéndola.
Situada en [PATH]
</text>
<text name="not worn instructions">
- Póngase otra ropa interior arrastrando una desde su inventario hasta su
-avatar. O parta de cero creando una nueva y vistiéndola.
+ Ponte una ropa interior nueva arrastrándola desde tu inventario hasta tu avatar. O bien puedes crear una nueva partiendo de cero.
</text>
+ <button label="Crear una ropa interior nueva" label_selected="Crear una ropa interior nueva" name="Create New" width="185"/>
<text name="no modify instructions">
No tiene permiso para modificar este ítem.
</text>
@@ -419,11 +412,10 @@ avatar. O parta de cero creando una nueva y vistiéndola.
Ropa interior:
</text>
<texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulse para abrir el selector de color"/>
- <button label="Crear una ropa interior nueva" label_selected="Crear una ropa interior nueva" name="Create New" width="185"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
<button label="Quitarla" label_selected="Quitarla" name="Take Off"/>
- <button left="113" label="Guardar" label_selected="Guardar" name="Save"/>
- <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
<panel label="Falda" name="Skirt">
@@ -443,9 +435,9 @@ avatar. O parta de cero creando una nueva y vistiéndola.
Situada en [PATH]
</text>
<text name="not worn instructions">
- Póngase otra falda arrastrando una desde su inventario hasta su
-avatar. O parta de cero creando una nueva y vistiéndola.
+ Ponte una falda nueva arrastrándola desde tu inventario hasta tu avatar. O bien puedes crear una nueva partiendo de cero.
</text>
+ <button label="Crear una falda nueva" label_selected="Crear una falda nueva" name="Create New"/>
<text name="no modify instructions">
No tiene permiso para modificar este ítem.
</text>
@@ -453,16 +445,86 @@ avatar. O parta de cero creando una nueva y vistiéndola.
Falda:
</text>
<texture_picker label="Tela" name="Fabric" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulse para abrir el selector de color"/>
- <button label="Crear una falda nueva" label_selected="Crear una falda nueva" name="Create New"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
<button label="Quitarla" label_selected="Quitarla" name="Take Off"/>
- <button left="113" label="Guardar" label_selected="Guardar" name="Save"/>
- <button left="199" width="102" label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
+ <panel label="Tatuaje" name="Tattoo">
+ <text name="title">
+ [DESC]
+ </text>
+ <text name="title_no_modify">
+ [DESC]: no modificable
+ </text>
+ <text name="title_loading">
+ [DESC]: cargando...
+ </text>
+ <text name="title_not_worn">
+ [DESC]: no puesto
+ </text>
+ <text name="path">
+ Situado en [PATH]
+ </text>
+ <text name="not worn instructions">
+ Pon un tatuaje nuevo arrastrándolo desde tu inventario a tu avatar. O bien puedes crear uno nuevo partiendo de cero.
+ </text>
+ <button label="Crear un tatuaje nuevo" label_selected="Crear un tatuaje nuevo" name="Create New"/>
+ <text name="no modify instructions">
+ No tienes permiso para modificar este artículo.
+ </text>
+ <text name="Item Action Label">
+ Tatuaje:
+ </text>
+ <texture_picker label="Tatuaje de la cabeza" name="Head Tattoo" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Tatuaje superior" name="Upper Tattoo" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Tatuaje inferior" name="Lower Tattoo" tool_tip="Pulsa para elegir una imagen"/>
+ <button label="Quitarme" label_selected="Quitarme" name="Take Off"/>
+ <button label="Guardar" label_selected="Guardar" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Revertir" label_selected="Revertir" name="Revert"/>
+ </panel>
+ <panel label="Alfa" name="Alpha">
+ <text name="title">
+ [DESC]
+ </text>
+ <text name="title_no_modify">
+ [DESC]: no modificable
+ </text>
+ <text name="title_loading">
+ [DESC]: cargando...
+ </text>
+ <text name="title_not_worn">
+ [DESC]: no puesto
+ </text>
+ <text name="path">
+ Situado en [PATH]
+ </text>
+ <text name="not worn instructions">
+ Pon una capa Alfa nueva arrastrándola desde tu inventario a tu avatar. O bien puedes crear una nueva partiendo de cero.
+ </text>
+ <button label="Crear una capa Alfa nueva" label_selected="Crear una capa Alfa nueva" name="Create New"/>
+ <text name="no modify instructions">
+ No tienes permiso para modificar este artículo.
+ </text>
+ <text name="Item Action Label">
+ Alfa:
+ </text>
+ <texture_picker label="Alfa inferior" name="Lower Alpha" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Alfa superior" name="Upper Alpha" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Alfa de la cabeza" name="Head Alpha" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Alfa de los ojos" name="Eye Alpha" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Alfa del pelo" name="Hair Alpha" tool_tip="Pulsa para elegir una imagen"/>
+ <button label="Quitarme" label_selected="Quitarme" name="Take Off"/>
+ <button label="Guardar" label_selected="Guardar" name="Save"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
+ <button label="Revertir" label_selected="Revertir" name="Revert"/>
+ </panel>
</tab_container>
- <scroll_container left="230" name="panel_container"/>
+ <scroll_container name="panel_container"/>
+ <button label="Información del script" label_selected="Información del script" name="script_info" tool_tip="Mostrar los scripts anexados a tu avatar"/>
+ <button label="Hacer un vestuario" label_selected="Hacer un vestuario" name="make_outfit_btn"/>
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
<button label="OK" label_selected="OK" name="Ok"/>
- <button label="Hacer un vestuario..." label_selected="Hacer un vestuario..." name="Make Outfit" width="130"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/es/floater_day_cycle_options.xml
index fc2b12d1e4..9c3ac1be0e 100644
--- a/indra/newview/skins/default/xui/es/floater_day_cycle_options.xml
+++ b/indra/newview/skins/default/xui/es/floater_day_cycle_options.xml
@@ -57,9 +57,9 @@
<text name="WL12amHash2">
|
</text>
- <button font="SansSerifSmall" width="96" left="546" label="Añadir un punto" label_selected="Añadir un punto" name="WLAddKey"/>
- <button font="SansSerifSmall" width="96" left="546" label="Quitar un punto" label_selected="Quitar un punto" name="WLDeleteKey"/>
- <text font="SansSerifSmall" name="WLCurKeyFrameText" width="190">
+ <button label="Añadir un punto" label_selected="Añadir un punto" name="WLAddKey"/>
+ <button label="Quitar un punto" label_selected="Quitar un punto" name="WLDeleteKey"/>
+ <text name="WLCurKeyFrameText">
Configuración del fotograma clave:
</text>
<text name="WLCurKeyTimeText">
@@ -86,9 +86,9 @@
</text>
<button label="Probar" label_selected="Probar" name="WLAnimSky"/>
<button label="Parar" label_selected="Parar" name="WLStopAnimSky"/>
- <button width="150" font="SansSerifSmall" label="Usar el horario del estado" label_selected="Ir al horario del estado" name="WLUseLindenTime"/>
- <button left="440" width="180" font="SansSerifSmall" label="Guardar este tipo de día" label_selected="Guardar este tipo de día" name="WLSaveDayCycle"/>
- <button left="440" width="180" font="SansSerifSmall" label="Cargar y probar un tipo de día" label_selected="Cargar y probar un tipo de día" name="WLLoadDayCycle"/>
+ <button label="Usar el horario del estado" label_selected="Ir al horario del estado" name="WLUseLindenTime"/>
+ <button label="Guardar este tipo de día" label_selected="Guardar este tipo de día" name="WLSaveDayCycle"/>
+ <button label="Cargar y probar un tipo de día" label_selected="Cargar y probar un tipo de día" name="WLLoadDayCycle"/>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_env_settings.xml b/indra/newview/skins/default/xui/es/floater_env_settings.xml
index 5d6ba47daf..195690f546 100644
--- a/indra/newview/skins/default/xui/es/floater_env_settings.xml
+++ b/indra/newview/skins/default/xui/es/floater_env_settings.xml
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Environment Editor Floater" title="EDITOR DEL ENTORNO">
+ <floater.string name="timeStr">
+ [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
+ </floater.string>
<text name="EnvTimeText">
Duración de
un día
@@ -14,13 +17,12 @@ un día
Color del
agua
</text>
- <color_swatch label="" name="EnvWaterColor" tool_tip="Pulse para abrir el selector de color"/>
+ <color_swatch label="" name="EnvWaterColor" tool_tip="Pulsa para abrir el selector de color"/>
<text name="EnvWaterFogText">
Claridad del
agua
</text>
<button bottom="-144" label="Usar el horario del estado" name="EnvUseEstateTimeButton" width="155"/>
- <button label="Cielo avanzado" name="EnvAdvancedSkyButton" width="155" left="167" />
- <button label="Agua avanzada" name="EnvAdvancedWaterButton" width="155" left="326"/>
- <button label="?" name="EnvSettingsHelpButton"/>
+ <button label="Cielo avanzado" left="167" name="EnvAdvancedSkyButton" width="155"/>
+ <button label="Agua avanzada" left="326" name="EnvAdvancedWaterButton" width="155"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_event.xml b/indra/newview/skins/default/xui/es/floater_event.xml
new file mode 100644
index 0000000000..4bc5221796
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_event.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="Evento" name="Event" title="DETALLES DEL EVENTO">
+ <floater.string name="none">
+ ninguno
+ </floater.string>
+ <floater.string name="notify">
+ Notificar
+ </floater.string>
+ <floater.string name="dont_notify">
+ No notificar
+ </floater.string>
+ <floater.string name="moderate">
+ Moderado
+ </floater.string>
+ <floater.string name="adult">
+ Adulto
+ </floater.string>
+ <floater.string name="general">
+ General
+ </floater.string>
+ <floater.string name="unknown">
+ desconocida
+ </floater.string>
+ <layout_stack name="layout">
+ <layout_panel name="profile_stack">
+ <text name="event_name">
+ Evento sin nombre...
+ </text>
+ <text name="event_category">
+ (sin categoría)
+ </text>
+ <text name="event_runby_label">
+ Organizado por:
+ </text>
+ <text initial_value="(obteniendo)" name="event_runby"/>
+ <text name="event_date_label">
+ Fecha:
+ </text>
+ <text name="event_date">
+ 10/10/2010
+ </text>
+ <text name="event_duration_label">
+ Duración:
+ </text>
+ <text name="event_duration">
+ 1 hora
+ </text>
+ <text name="event_covercharge_label">
+ Entrada:
+ </text>
+ <text name="event_cover">
+ Gratis
+ </text>
+ <text name="event_location_label">
+ Localización:
+ </text>
+ <text name="event_location" value="SampleParcel, Name Long (145, 228, 26)"/>
+ <text name="rating_label" value="Calificación:"/>
+ <text name="rating_value" value="desconocida"/>
+ <expandable_text name="event_desc">
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ </expandable_text>
+ </layout_panel>
+ <layout_panel name="button_panel">
+ <button name="create_event_btn" tool_tip="Crear el evento"/>
+ <button name="god_delete_event_btn" tool_tip="Borrar el evento"/>
+ <button label="Notificarme" name="notify_btn"/>
+ <button label="Teleportar" name="teleport_btn"/>
+ <button label="Mapa" name="map_btn"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_gesture.xml b/indra/newview/skins/default/xui/es/floater_gesture.xml
index 496881f2d2..d90de8c9f4 100644
--- a/indra/newview/skins/default/xui/es/floater_gesture.xml
+++ b/indra/newview/skins/default/xui/es/floater_gesture.xml
@@ -1,15 +1,25 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="gestures" title="GESTOS DISPONIBLES">
- <text name="help_label">
- Pulse dos veces en un gesto para reproducir las animaciones
-y sonidos.
- </text>
- <scroll_list bottom_delta="-385" height="360" name="gesture_list">
- <column label="Botón" name="trigger"/>
- <column label="Tecla" name="shortcut"/>
- <column label="Nombre" name="name"/>
+<floater label="Lugares" name="gestures" title="GESTOS">
+ <floater.string name="loading">
+ Cargando...
+ </floater.string>
+ <floater.string name="playing">
+ (Ejecutándose)
+ </floater.string>
+ <floater.string name="copy_name">
+ Copia de [COPY_NAME]
+ </floater.string>
+ <scroll_list name="gesture_list">
+ <scroll_list.columns label="Nombre" name="name"/>
+ <scroll_list.columns label="Chat" name="trigger"/>
+ <scroll_list.columns label="Tecla" name="shortcut"/>
</scroll_list>
- <button label="Nuevo" name="new_gesture_btn"/>
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="gear_btn" tool_tip="Más opciones"/>
+ <button name="new_gesture_btn" tool_tip="Hacer un gesto nuevo"/>
+ <button name="activate_btn" tool_tip="Activar/Desactivar el gesto elegido"/>
+ <button name="del_btn" tool_tip="Borrar este gesto"/>
+ </panel>
<button label="Editar" name="edit_btn"/>
<button label="Reproducir" name="play_btn"/>
<button label="Parar" name="stop_btn"/>
diff --git a/indra/newview/skins/default/xui/es/floater_god_tools.xml b/indra/newview/skins/default/xui/es/floater_god_tools.xml
index 78ec76e32b..218a5effe8 100644
--- a/indra/newview/skins/default/xui/es/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/es/floater_god_tools.xml
@@ -1,52 +1,36 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="godtools floater" title="HERRAMIENTAS DE DIOS">
<tab_container name="GodTools Tabs">
<panel label="Red" name="grid">
- <button label="Expulsar a todos los usuarios"
- label_selected="Expulsar a todos los usuarios" name="Kick all users" />
- <button label="Vaciar los caches de visibilidad del mapa de la región"
- label_selected="Vaciar los caches de visibilidad del mapa de la región"
- name="Flush This Region&apos;s Map Visibility Caches" />
+ <button label="Vaciar los caches de visibilidad del mapa de la región" label_selected="Vaciar los caches de visibilidad del mapa de la región" name="Flush This Region&apos;s Map Visibility Caches"/>
</panel>
<panel label="Región" name="region">
- <text name="Sim Name:">
- Nombre del Sim:
+ <text name="Region Name:">
+ Nombre de la región:
</text>
- <check_box label="Preludio" name="check prelude"
- tool_tip="Defina esté para hacer un preludio de la región." />
- <check_box label="Sol fijo" name="check fixed sun"
- tool_tip="Fijar la posición del sol (así como en Región/Propiedad &gt; Terreno." />
- <check_box label="Restaurar casa en el teletransporte" name="check reset home"
- tool_tip="Cuando el residente sea teletransportado hacia fuera, restaurar su casa para la posición de destino." />
- <check_box label="Visible" name="check visible"
- tool_tip="Defina esté para tornar la región visible a no dioses." />
- <check_box label="Daño" name="check damage"
- tool_tip="Defina esté para activar el daño en esta región." />
- <check_box label="Bloquear rastreo de tráfico" name="block dwell"
- tool_tip="Defina esté para hacer que una región no compute el tráfico." />
- <check_box label="Bloquear formar terreno" name="block terraform"
- tool_tip="Defina esté para no permitir que personas muden la formación del terreno de ellas" />
- <check_box label="Caja de arena" name="is sandbox"
- tool_tip="Activar/desactivar si ésta es una región caja de arena." />
- <button label="Formar terreno" label_selected="Formar terreno" name="Bake Terrain"
- tool_tip="Guardar el terreno actual como patrón." />
- <button label="Revertir terreno" label_selected="Revertir terreno"
- name="Revert Terrain"
- tool_tip="Sustituir el terreno actual por el patrón." />
- <button label="Cambiar terreno" label_selected="Cambiar terreno" name="Swap Terrain"
- tool_tip="Cambiar terreno actual por el patrón." />
+ <check_box label="Preludio" name="check prelude" tool_tip="Defina esté para hacer un preludio de la región."/>
+ <check_box label="Sol fijo" name="check fixed sun" tool_tip="Fijar la posición del sol (así como en Región/Propiedad &gt; Terreno."/>
+ <check_box label="Restaurar casa en el teletransporte" name="check reset home" tool_tip="When Resident teleports out, reset their home to the destination position."/>
+ <check_box label="Visible" name="check visible" tool_tip="Defina esté para tornar la región visible a no dioses."/>
+ <check_box label="Daño" name="check damage" tool_tip="Defina esté para activar el daño en esta región."/>
+ <check_box label="Bloquear rastreo de tráfico" name="block dwell" tool_tip="Defina esté para hacer que una región no compute el tráfico."/>
+ <check_box label="Bloquear formar terreno" name="block terraform" tool_tip="Defina esté para no permitir que personas muden la formación del terreno de ellas"/>
+ <check_box label="Caja de arena" name="is sandbox" tool_tip="Activar/desactivar si ésta es una región caja de arena."/>
+ <button label="Formar terreno" label_selected="Formar terreno" name="Bake Terrain" tool_tip="Guardar el terreno actual como patrón."/>
+ <button label="Revertir terreno" label_selected="Revertir terreno" name="Revert Terrain" tool_tip="Sustituir el terreno actual por el patrón."/>
+ <button label="Cambiar terreno" label_selected="Cambiar terreno" name="Swap Terrain" tool_tip="Cambiar terreno actual por el patrón."/>
<text name="estate id">
ID de la propiedad:
</text>
<text name="parent id">
ID del padre:
</text>
- <line_editor name="parentestate" tool_tip="Ésta es una propiedad padre para esta región" />
+ <line_editor name="parentestate" tool_tip="Ésta es una propiedad padre para esta región"/>
<text name="Grid Pos: ">
Red Pos:
</text>
- <line_editor name="gridposx" tool_tip="Ésta es la posición x de la reja para esta región" />
- <line_editor name="gridposy" tool_tip="Ésta es la posición y de la reja para esta región" />
+ <line_editor name="gridposx" tool_tip="Ésta es la posición x de la reja para esta región"/>
+ <line_editor name="gridposy" tool_tip="Ésta es la posición y de la reja para esta región"/>
<text name="Redirect to Grid: ">
Redireccionar para red:
</text>
@@ -56,80 +40,54 @@
<text name="land cost text">
L$ por m²:
</text>
- <button label="Actualizar" label_selected="Actualizar" name="Refresh"
- tool_tip="Haga clic aquí para actualizar la información arriba." />
- <button label="Aplicar" label_selected="Aplicar" name="Apply"
- tool_tip="Haga clic aquí para aplicar cualesquiera de las mudanzas arriba." />
- <button label="Seleccionar región" label_selected="Seleccionar región"
- name="Select Region"
- tool_tip="Seleccione toda la región con esta herramienta de terreno." />
- <button label="Guardado automático ahora" label_selected="Guardado automático ahora"
- name="Autosave now"
- tool_tip="Guardar estado con gzip en el directorio de guardado automático." />
+ <button label="Actualizar" label_selected="Actualizar" name="Refresh" tool_tip="Haga clic aquí para actualizar la información arriba."/>
+ <button label="Aplicar" label_selected="Aplicar" name="Apply" tool_tip="Haga clic aquí para aplicar cualesquiera de las mudanzas arriba."/>
+ <button label="Seleccionar región" label_selected="Seleccionar región" name="Select Region" tool_tip="Seleccione toda la región con esta herramienta de terreno."/>
+ <button label="Guardado automático ahora" label_selected="Guardado automático ahora" name="Autosave now" tool_tip="Guardar estado con gzip en el directorio de guardado automático."/>
</panel>
<panel label="Objetos" name="objects">
- <text name="Sim Name:">
- Nombre del Sim:
+ <text name="Region Name:">
+ Nombre de la región:
</text>
<text name="region name">
Galés
</text>
- <check_box label="Desactivar scripts" name="disable scripts"
- tool_tip="Defina esté para desactivar todos los scripts en esta región" />
- <check_box label="Desactivar colisiones" name="disable collisions"
- tool_tip="Defina esté para desactivar las colisiones entre no agentes en esta región" />
- <check_box label="Desactivar física" name="disable physics"
- tool_tip="Defina esté para desactivar toda la física en esta región" />
- <button label="Aplicar" label_selected="Aplicar" name="Apply"
- tool_tip="Haga clic aquí para aplicar cualesquiera de las mudanzas arriba." />
- <button label="Definir blanco" label_selected="Definir blanco" name="Set Target"
- tool_tip="Ajuste el avatar del blanco para la exclusión del objeto." />
+ <check_box label="Desactivar scripts" name="disable scripts" tool_tip="Defina esté para desactivar todos los scripts en esta región"/>
+ <check_box label="Desactivar colisiones" name="disable collisions" tool_tip="Defina esté para desactivar las colisiones entre no agentes en esta región"/>
+ <check_box label="Desactivar física" name="disable physics" tool_tip="Defina esté para desactivar toda la física en esta región"/>
+ <button label="Aplicar" label_selected="Aplicar" name="Apply" tool_tip="Haga clic aquí para aplicar cualesquiera de las mudanzas arriba."/>
+ <button label="Definir blanco" label_selected="Definir blanco" name="Set Target" tool_tip="Ajuste el avatar del blanco para la exclusión del objeto."/>
<text name="target_avatar_name">
(sin blanco)
</text>
- <button label="Borrar objetos con script del blanco en otros terrenos"
- label_selected="Borrar objetos con script del blanco en otros terrenos"
- name="Delete Target&apos;s Scripted Objects On Others Land"
- tool_tip="Borrar todos los objetos con script pertenecientes al blanco en el terreno que no pertenece a él. Objetos (sin copia) retornarán." />
- <button label="Borrar objetos con script del blanco en *TODOS* los terrenos"
- label_selected="Borrar objetos con script del blanco en *TODOS* los terrenos"
- name="Delete Target&apos;s Scripted Objects On *Any* Land"
- tool_tip="Borrar todos los objetos con script pertenecientes al blanco en esta región. Objetos (sin copia) retornarán." />
- <button label="Borrar *TODOS* los objetos del blanco"
- label_selected="Borrar *TODOS* los objetos del blanco"
- name="Delete *ALL* Of Target&apos;s Objects"
- tool_tip="Borrar todos los objetos pertenecientes al blanco en esta región. Objetos (sin copia) retornarán." />
- <button label="Obtener top de colisionadores"
- label_selected="Obtener top de colisionadores" name="Get Top Colliders"
- tool_tip="Coger lista de objetos que están recibiendo narrowphase callbacks." />
- <button label="Obtener top de scripts" label_selected="Obtener top de scripts"
- name="Get Top Scripts"
- tool_tip="Coger lista de objetos que están consumiendo más tiempo de ejecución de scripts." />
- <button label="Compilador de scripts" label_selected="Compilador de scripts"
- name="Scripts digest"
- tool_tip="Coger una lista de todos los scripts y sus respectivos números de ocurrencia." />
+ <button label="Borrar objetos con script del blanco en otros terrenos" label_selected="Borrar objetos con script del blanco en otros terrenos" name="Delete Target&apos;s Scripted Objects On Others Land" tool_tip="Borrar todos los objetos con script pertenecientes al blanco en el terreno que no pertenece a él. Objetos (sin copia) retornarán."/>
+ <button label="Borrar objetos con script del blanco en *TODOS* los terrenos" label_selected="Borrar objetos con script del blanco en *TODOS* los terrenos" name="Delete Target&apos;s Scripted Objects On *Any* Land" tool_tip="Borrar todos los objetos con script pertenecientes al blanco en esta región. Objetos (sin copia) retornarán."/>
+ <button label="Borrar *TODOS* los objetos del blanco" label_selected="Borrar *TODOS* los objetos del blanco" name="Delete *ALL* Of Target&apos;s Objects" tool_tip="Borrar todos los objetos pertenecientes al blanco en esta región. Objetos (sin copia) retornarán."/>
+ <button label="Obtener top de colisionadores" label_selected="Obtener top de colisionadores" name="Get Top Colliders" tool_tip="Coger lista de objetos que están recibiendo narrowphase callbacks."/>
+ <button label="Obtener top de scripts" label_selected="Obtener top de scripts" name="Get Top Scripts" tool_tip="Coger lista de objetos que están consumiendo más tiempo de ejecución de scripts."/>
+ <button label="Compilador de scripts" label_selected="Compilador de scripts" name="Scripts digest" tool_tip="Coger una lista de todos los scripts y sus respectivos números de ocurrencia."/>
</panel>
<panel label="Requerir" name="request">
<text name="Destination:">
Destino:
</text>
<combo_box name="destination">
- <combo_box.item name="item1" label="Selección" />
- <combo_box.item name="item2" label="Agente de región" />
+ <combo_box.item label="Selección" name="item1"/>
+ <combo_box.item label="Agente de región" name="item2"/>
</combo_box>
<text name="Request:">
Exigencia:
</text>
<combo_box name="request">
- <combo_box.item name="item1" label="colisionadores &lt;pasos&gt;" />
- <combo_box.item name="item2" label="scripts &lt;contar&gt;,&lt;patrón opcional&gt;" />
- <combo_box.item name="item3" label="objetos &lt;patrón&gt;" />
- <combo_box.item name="item4" label="rez &lt;asset_id&gt;" />
+ <combo_box.item label="colisionadores &lt;pasos&gt;" name="item1"/>
+ <combo_box.item label="scripts &lt;contar&gt;,&lt;patrón opcional&gt;" name="item2"/>
+ <combo_box.item label="objetos &lt;patrón&gt;" name="item3"/>
+ <combo_box.item label="rez &lt;asset_id&gt;" name="item4"/>
</combo_box>
<text name="Parameter:">
Parámetro:
</text>
- <button label="Hacer exigencia" label_selected="Hacer exigencia" name="Make Request" />
+ <button label="Hacer exigencia" label_selected="Hacer exigencia" name="Make Request"/>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_hardware_settings.xml b/indra/newview/skins/default/xui/es/floater_hardware_settings.xml
index 9418252036..f967d697c5 100644
--- a/indra/newview/skins/default/xui/es/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/es/floater_hardware_settings.xml
@@ -8,21 +8,21 @@
Antialiasing:
</text>
<combo_box label="Antialiasing" name="fsaa" width="94">
- <combo_box.item name="FSAADisabled" label="Desactivado"/>
- <combo_box.item name="2x" label="2x"/>
- <combo_box.item name="4x" label="4x"/>
- <combo_box.item name="8x" label="8x"/>
- <combo_box.item name="16x" label="16x"/>
+ <combo_box.item label="Desactivado" name="FSAADisabled"/>
+ <combo_box.item label="2x" name="2x"/>
+ <combo_box.item label="4x" name="4x"/>
+ <combo_box.item label="8x" name="8x"/>
+ <combo_box.item label="16x" name="16x"/>
</combo_box>
<spinner label="Gamma:" name="gamma"/>
<text name="(brightness, lower is brighter)">
- (brillo; menor es más brillante, 0=predeterminado)
+ (0 = brillo por defecto, más bajo = más brillo)
</text>
<text name="Enable VBO:">
Activar VBO:
</text>
- <check_box label="Activar OpenGL Vertex Buffer Objects" name="vbo" tool_tip="En hardware moderno, habilitar esta opción mejora el rendimiento. Pero en hardware antiguo, el habilitarlo hace que, frecuentemente, se obtenga una implementación pobre de VBO, lo que puede provocarle caídas."/>
- <slider label_width="150" left="10" width="300" label="Memoria para texturas (MB):" name="GrapicsCardTextureMemory" tool_tip="Cantidad de memoria asignada a las texturas. Por defecto es la memoria de la tarjeta de vídeo. Reducir esta cantidad puede mejorar el rendimiento, pero también puede hacer que las texturas se vean borrosas."/>
+ <check_box initial_value="true" label="Activar OpenGL Vertex Buffer Objects" name="vbo" tool_tip="En hardware moderno, habilitar esta opción mejora el rendimiento. Pero en hardware antiguo, el habilitarlo hace que, frecuentemente, se obtenga una implementación pobre de VBO, lo que puede provocarle caídas."/>
+ <slider label="Memoria para texturas (MB):" name="GraphicsCardTextureMemory" tool_tip="Cantidad de memoria asignada a las texturas. Por defecto es la memoria de la tarjeta de vídeo. Reducir esta cantidad puede mejorar el rendimiento, pero también hacer que las texturas se vean borrosas."/>
<spinner label="Intensidad de la niebla:" name="fog"/>
<button label="OK" label_selected="OK" name="OK"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_help_browser.xml b/indra/newview/skins/default/xui/es/floater_help_browser.xml
new file mode 100644
index 0000000000..ec3c38e8c7
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_help_browser.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_help_browser" title="BUSCADOR DE AYUDA">
+ <floater.string name="loading_text">
+ Cargando...
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="external_controls"/>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_im.xml b/indra/newview/skins/default/xui/es/floater_im.xml
index 3e92003bac..3850b94fd6 100644
--- a/indra/newview/skins/default/xui/es/floater_im.xml
+++ b/indra/newview/skins/default/xui/es/floater_im.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<multi_floater name="im_floater" title="Mensaje Instantáneo">
<string name="only_user_message">
- Usted es el único usuario en esta sesión.
+ Eres el único Residente en esta sesión.
</string>
<string name="offline_message">
[FIRST] [LAST] no está conectado.
@@ -10,7 +10,7 @@
Pulse el botón [BUTTON NAME] para aceptar/conectar este chat de voz.
</string>
<string name="muted_message">
- Ha ignorado a este residente. Al enviarle un mensaje, automáticamente dejará de ignorarle.
+ Has ignorado a este Residente. Enviándole un mensaje, automáticamente dejarás de ignorarle.
</string>
<string name="generic_request_error">
Error al hacer lo solicitado; por favor, inténtelo más tarde.
@@ -31,7 +31,7 @@
Un moderador del grupo le ha desactivado el chat de texto.
</string>
<string name="add_session_event">
- No se ha podido añadir usuarios a la sesión de chat con [RECIPIENT].
+ No es posible añadir Residentes a la sesión de chat con [RECIPIENT].
</string>
<string name="message_session_event">
No se ha podido enviar su mensaje a la sesión de chat con [RECIPIENT].
diff --git a/indra/newview/skins/default/xui/es/floater_im_container.xml b/indra/newview/skins/default/xui/es/floater_im_container.xml
new file mode 100644
index 0000000000..1cd752e6ec
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_im_container.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<multi_floater name="floater_im_box" title="CONVERSACIONES"/>
diff --git a/indra/newview/skins/default/xui/es/floater_im_session.xml b/indra/newview/skins/default/xui/es/floater_im_session.xml
new file mode 100644
index 0000000000..c7312e609b
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_im_session.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="panel_im">
+ <layout_stack name="im_panels">
+ <layout_panel label="Panel de control de MI" name="panel_im_control_panel"/>
+ <layout_panel>
+ <line_editor label="A" name="chat_editor"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_image_preview.xml b/indra/newview/skins/default/xui/es/floater_image_preview.xml
index 6d51a800b7..84c5bfc824 100644
--- a/indra/newview/skins/default/xui/es/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/es/floater_image_preview.xml
@@ -10,17 +10,17 @@
Previsualizar la
imagen como:
</text>
- <combo_box label="Tipo de ropa" name="clothing_type_combo" left="100" width="186">
- <combo_box.item name="Image" label="Imagen" />
- <combo_box.item name="Hair" label="Pelo" />
- <combo_box.item name="FemaleHead" label="Cabeza de mujer" />
- <combo_box.item name="FemaleUpperBody" label="Mujer: parte superior del cuerpo" />
- <combo_box.item name="FemaleLowerBody" label="Mujer: parte inferior del cuerpo" />
- <combo_box.item name="MaleHead" label="Cabeza de varón" />
- <combo_box.item name="MaleUpperBody" label="Varón: parte superior del cuerpo" />
- <combo_box.item name="MaleLowerBody" label="Varón: parte inferior del cuerpo" />
- <combo_box.item name="Skirt" label="Falda" />
- <combo_box.item name="SculptedPrim" label="Prim sculpted"/>
+ <combo_box label="Tipo de ropa" left="100" name="clothing_type_combo" width="186">
+ <item label="Imagen" name="Image" value="Imagen"/>
+ <item label="Pelo" name="Hair" value="Pelo"/>
+ <item label="Mujer: cabeza" name="FemaleHead" value="Mujer: cabeza"/>
+ <item label="Mujer: parte superior del cuerpo" name="FemaleUpperBody" value="Mujer: parte superior del cuerpo"/>
+ <item label="Mujer: parte inferior del cuerpo" name="FemaleLowerBody" value="Mujer: parte inferior del cuerpo"/>
+ <item label="Varón: cabeza" name="MaleHead" value="Varón: cabeza"/>
+ <item label="Varón: parte superior del cuerpo" name="MaleUpperBody" value="Varón: parte superior del cuerpo"/>
+ <item label="Varón: parte inferior del cuerpo" name="MaleLowerBody" value="Varón: parte inferior del cuerpo"/>
+ <item label="Falda" name="Skirt" value="Falda"/>
+ <item label="Prim sculpted" name="SculptedPrim" value="Prim sculpted"/>
</combo_box>
<text name="bad_image_text">
Imposible leer la imagen.
diff --git a/indra/newview/skins/default/xui/es/floater_incoming_call.xml b/indra/newview/skins/default/xui/es/floater_incoming_call.xml
new file mode 100644
index 0000000000..88cfc9575a
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_incoming_call.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="incoming call" title="ESTÃ LLAMANDO ALGUIEN DESCONOCIDO">
+ <floater.string name="lifetime">
+ 5
+ </floater.string>
+ <floater.string name="localchat">
+ Chat de voz
+ </floater.string>
+ <floater.string name="anonymous">
+ anónimo
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ está llamando.
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ ha entrado en un chat de voz en multiconferencia.
+ </floater.string>
+ <floater.string name="VoiceInviteGroup">
+ acaba de entrar en el canal de voz &apos;[GROUP]&apos;.
+ </floater.string>
+ <floater.string name="VoiceInviteQuestionGroup">
+ ¿Quieres dejar [CURRENT_CHAT] e incorporarte a la llamada con &apos;[GROUP]&apos;?
+ </floater.string>
+ <floater.string name="VoiceInviteQuestionDefault">
+ ¿Quieres dejar [CURRENT_CHAT] y entrar en este chat de voz?
+ </floater.string>
+ <text name="question">
+ ¿Quieres dejar [CURRENT_CHAT] y entrar a este chat de voz?
+ </text>
+ <button label="Aceptar" label_selected="Aceptar" name="Accept"/>
+ <button label="Rechazar" label_selected="Rechazar" name="Reject"/>
+ <button label="Comenzar un MI" name="Start IM"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_inspect.xml b/indra/newview/skins/default/xui/es/floater_inspect.xml
index 3c8b38648f..d95653ddd0 100644
--- a/indra/newview/skins/default/xui/es/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/es/floater_inspect.xml
@@ -1,11 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="inspect" title="EXAMINAR OBJETOS" min_width="450">
+<floater min_width="450" name="inspect" title="EXAMINAR LOS OBJETOS">
+ <floater.string name="timeStamp">
+ [wkday,datetime,local][day,datetime,local] [mth,datetime,local] [year,datetime,local][hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ </floater.string>
<scroll_list name="object_list" tool_tip="Seleccione un objeto de esta lista para realzarlo en el mundo">
- <column label="Nombre del objeto" name="object_name"/>
- <column label="Propietario" name="owner_name"/>
- <column label="Creador" name="creator_name"/>
- <column label="Fecha de creación" name="creation_date"/>
+ <scroll_list.columns label="Nombre del objeto" name="object_name"/>
+ <scroll_list.columns label="Propietario" name="owner_name"/>
+ <scroll_list.columns label="Creador" name="creator_name"/>
+ <scroll_list.columns label="Fecha de creación" name="creation_date"/>
</scroll_list>
- <button width="185" label="Ver el perfil del propietario..." label_selected="" name="button owner" tool_tip="Ver el perfil del propietario del objeto realzado"/>
- <button width="165" left="205" label="Ver el perfil del creador..." label_selected="" name="button creator" tool_tip="Ver el perfil del creador original del objeto realzado"/>
+ <button label="Ver el perfil del propietario..." label_selected="" name="button owner" tool_tip="Ver el perfil del propietario del objeto realzado" width="185"/>
+ <button label="Ver el perfil del creador..." label_selected="" left="205" name="button creator" tool_tip="Ver el perfil del creador original del objeto realzado" width="165"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_inventory.xml b/indra/newview/skins/default/xui/es/floater_inventory.xml
index 8d16d6089e..0f0ba2fce6 100644
--- a/indra/newview/skins/default/xui/es/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/es/floater_inventory.xml
@@ -1,47 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Inventory" title="INVENTARIO">
- <search_editor label="Escriba aquí para buscar" name="inventory search editor"/>
- <tab_container name="inventory filter tabs">
- <inventory_panel label="Todos los ítems" name="All Items"/>
- <inventory_panel label="Ãtems recientes" name="Recent Items"/>
- </tab_container>
- <menu_bar name="Inventory Menu">
- <menu label="Archivo" name="File">
- <menu_item_call label="Abrir" name="Open"/>
- <menu_item_call label="Nueva ventana" name="New Window"/>
- <menu_item_call label="Ver los filtros" name="Show Filters"/>
- <menu_item_call label="Restablecer los filtros" name="Reset Current"/>
- <menu_item_call label="Cerrar todas las carpetas" name="Close All Folders"/>
- <menu_item_call label="Vaciar la papelera" name="Empty Trash"/>
- </menu>
- <menu label="Crear" name="Create">
- <menu_item_call label="Carpeta nueva" name="New Folder"/>
- <menu_item_call label="Script nuevo" name="New Script"/>
- <menu_item_call label="Nota nueva" name="New Note"/>
- <menu_item_call label="Gesto nuevo" name="New Gesture"/>
- <menu name="New Clothes">
- <menu_item_call label="Falda nueva" name="New Shirt"/>
- <menu_item_call label="Pantalones nuevos" name="New Pants"/>
- <menu_item_call label="Zapatos nuevos" name="New Shoes"/>
- <menu_item_call label="Calcetines nuevos" name="New Socks"/>
- <menu_item_call label="Chaqueta nueva" name="New Jacket"/>
- <menu_item_call label="Falda nueva" name="New Skirt"/>
- <menu_item_call label="Guantes nuevos" name="New Gloves"/>
- <menu_item_call label="Camiseta nueva" name="New Undershirt"/>
- <menu_item_call label="Ropa interior nueva" name="New Underpants"/>
- </menu>
- <menu name="New Body Parts">
- <menu_item_call label="Forma nueva" name="New Shape"/>
- <menu_item_call label="Piel nueva" name="New Skin"/>
- <menu_item_call label="Pelo nuevo" name="New Hair"/>
- <menu_item_call label="Ojos nuevos" name="New Eyes"/>
- </menu>
- </menu>
- <menu label="Ordenar" name="Sort">
- <menu_item_check label="Por el nombre" name="By Name"/>
- <menu_item_check label="Por la fecha" name="By Date"/>
- <menu_item_check label="Las carpetas, siempre por la fecha" name="Folders Always By Name"/>
- <menu_item_check label="Las carpetas del sistema, arriba" name="System Folders To Top"/>
- </menu>
- </menu_bar>
+<floater name="Inventory" title="MI INVENTARIO">
+ <floater.string name="Title">
+ MI INVENTARIO
+ </floater.string>
+ <floater.string name="TitleFetching">
+ MI INVENTARIO (obteniendo [ITEM_COUNT] ítems...) [FILTER]
+ </floater.string>
+ <floater.string name="TitleCompleted">
+ MI INVENTARIO ([ITEM_COUNT] ítems) [FILTER]
+ </floater.string>
+ <floater.string name="Fetched">
+ Obtenido
+ </floater.string>
+ <panel label="Panel del inventario" name="Inventory Panel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml
index 7abdfceb94..5746688962 100644
--- a/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/es/floater_inventory_item_properties.xml
@@ -1,5 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="item properties" title="PROPIEDADES DEL ÃTEM DEL INVENTARIO">
+ <floater.string name="unknown">
+ (desconocido)
+ </floater.string>
+ <floater.string name="public">
+ (público)
+ </floater.string>
+ <floater.string name="you_can">
+ Usted puede:
+ </floater.string>
+ <floater.string name="owner_can">
+ El propietario puede:
+ </floater.string>
+ <floater.string name="acquiredDate">
+ [wkday,datetime,local][day,datetime,local] [mth,datetime,local] [year,datetime,local][hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ </floater.string>
<text name="LabelItemNameTitle">
Nombre:
</text>
@@ -27,55 +42,32 @@
May Mié 24 12:50:46 2006
</text>
<text name="OwnerLabel">
- Usted puede:
- </text>
- <check_box label="Modificarlo" name="CheckOwnerModify"/>
- <check_box left_delta="88" label="Copiarlo" name="CheckOwnerCopy"/>
- <check_box label="Venderlo/darlo" name="CheckOwnerTransfer"/>
- <text name="BaseMaskDebug">
- B:
- </text>
- <text name="OwnerMaskDebug">
- O:
+ Tú:
</text>
- <text name="GroupMaskDebug">
- G:
+ <check_box label="Editar" name="CheckOwnerModify"/>
+ <check_box label="Copiarlo" left_delta="88" name="CheckOwnerCopy"/>
+ <check_box label="Revender" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ Cualquiera:
</text>
- <text name="EveryoneMaskDebug">
- E:
+ <check_box label="Copiar" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ Grupo:
</text>
- <text name="NextMaskDebug">
- N:
- </text>
- <check_box label="Compartir con el grupo" name="CheckShareWithGroup"/>
- <check_box label="Permitir a cualquiera que lo copie" name="CheckEveryoneCopy"/>
+ <check_box label="Compartir" name="CheckShareWithGroup"/>
<text name="NextOwnerLabel" width="230">
- El próximo propietario puede:
- </text>
- <check_box label="Modificarlo" name="CheckNextOwnerModify"/>
- <check_box left_delta="88" label="Copiarlo" name="CheckNextOwnerCopy"/>
- <check_box label="Revenderlo/darlo" name="CheckNextOwnerTransfer"/>
- <text name="SaleLabel">
- Marcar ítem como:
+ Próximo propietario:
</text>
+ <check_box label="Editar" name="CheckNextOwnerModify"/>
+ <check_box label="Copiarlo" left_delta="88" name="CheckNextOwnerCopy"/>
+ <check_box label="Revender" name="CheckNextOwnerTransfer"/>
<check_box label="En venta" name="CheckPurchase"/>
- <radio_group name="RadioSaleType" left_delta="88" >
- <radio_item name="radio" label="Original" />
- <radio_item name="radio2" label="Copia" />
- </radio_group>
- <text name="TextPrice">
- Precio: L$
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="Copia" name="Copy"/>
+ <combo_box.item label="Original" name="Original"/>
+ </combo_box>
+ <spinner label="Precio:" name="Edit Cost"/>
+ <text name="CurrencySymbol">
+ L$
</text>
- <string name="unknown">
- (desconocido)
- </string>
- <string name="public">
- (público)
- </string>
- <string name="you_can">
- Usted puede:
- </string>
- <string name="owner_can">
- El propietario puede:
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml
index 0cbee11bfb..c9d639d8cf 100644
--- a/indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/es/floater_inventory_view_finder.xml
@@ -11,12 +11,12 @@
<check_box label="Sonidos" name="check_sound"/>
<check_box label="Texturas" name="check_texture"/>
<check_box label="Fotos" name="check_snapshot"/>
- <button label="Todo" label_selected="Todo" name="All" width="70"/>
- <button label="Nada" label_selected="Nada" name="None" width="70" bottom_delta="0" left="83"/>
- <check_box label="Mostrar siempre las&#10;carpetas" name="check_show_empty"/>
+ <button label="Todos" label_selected="Todo" name="All"/>
+ <button label="Ninguno" label_selected="Nada" name="None"/>
+ <check_box label="Mostrar siempre las carpetas" name="check_show_empty"/>
<check_box label="Desde el fin de sesión" name="check_since_logoff" bottom_delta="-36"/>
<text name="- OR -">
- - O -
+ - o -
</text>
<spinner label="horas atrás" name="spin_hours_ago"/>
<spinner label="días atrás" name="spin_days_ago"/>
diff --git a/indra/newview/skins/default/xui/es/floater_joystick.xml b/indra/newview/skins/default/xui/es/floater_joystick.xml
index 75c53dd646..2c1804bd90 100644
--- a/indra/newview/skins/default/xui/es/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/es/floater_joystick.xml
@@ -1,23 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Joystick" title="CONFIGURACIÓN DEL JOYSTICK">
- <check_box name="enable_joystick" label="Activar el joystick:"/>
+ <check_box label="Activar el joystick:" name="enable_joystick"/>
<text left="140" name="joystick_type" width="360"/>
- <spinner label="Mapping: eje X" name="JoystickAxis1" label_width="118" width="161"/>
- <spinner label="Mapping: eje Y" name="JoystickAxis2" label_width="105" width="148"/>
- <spinner label="Mapping: eje Z" name="JoystickAxis0" label_width="95" width="138"/>
- <spinner label="Mapping: arriba/abajo" name="JoystickAxis4" label_width="118" width="161"/>
- <spinner label="Mapping: izq./der." name="JoystickAxis5" label_width="105" width="148"/>
- <spinner label="Mapping: giro" name="JoystickAxis3" label_width="95" width="138"/>
- <spinner label="Mapping: zoom" name="JoystickAxis6" label_width="118" width="161"/>
+ <spinner label="Mapping: eje X" label_width="118" name="JoystickAxis1" width="161"/>
+ <spinner label="Mapping: eje Y" label_width="105" name="JoystickAxis2" width="148"/>
+ <spinner label="Mapping: eje Z" label_width="95" name="JoystickAxis0" width="138"/>
+ <spinner label="Mapping: arriba/abajo" label_width="118" name="JoystickAxis4" width="161"/>
+ <spinner label="Mapping: izq./der." label_width="105" name="JoystickAxis5" width="148"/>
+ <spinner label="Mapping: giro" label_width="95" name="JoystickAxis3" width="138"/>
+ <spinner label="Mapping: zoom" label_width="118" name="JoystickAxis6" width="161"/>
<check_box label="Zoom directo" name="ZoomDirect"/>
<check_box label="Cursor 3D" name="Cursor3D"/>
<check_box label="Nivel automático" name="AutoLeveling"/>
<text name="Control Modes:">
Modos de control:
</text>
- <check_box name="JoystickAvatarEnabled" label="Avatar"/>
- <check_box name="JoystickBuildEnabled" left="192" label="Construir"/>
- <check_box name="JoystickFlycamEnabled" label="Flycam"/>
+ <check_box label="Avatar" name="JoystickAvatarEnabled"/>
+ <check_box label="Construir" name="JoystickBuildEnabled"/>
+ <check_box label="Flycam" name="JoystickFlycamEnabled"/>
<text name="XScale">
Escala: X
</text>
@@ -27,7 +27,7 @@
<text name="ZScale">
Escala: Z
</text>
- <text name="PitchScale" left="3" width="115">
+ <text name="PitchScale">
Escala: arriba/abajo
</text>
<text name="YawScale">
@@ -45,10 +45,10 @@
<text name="ZDeadZone">
Zona muerta Z
</text>
- <text name="PitchDeadZone" left="3" width="115">
+ <text name="PitchDeadZone">
Zona muerta arri./aba.
</text>
- <text name="YawDeadZone" left="3" width="115">
+ <text name="YawDeadZone">
Zona muerta izq./der.
</text>
<text name="RollDeadZone">
@@ -63,9 +63,9 @@
<text name="ZoomDeadZone">
Zona muerta zoom
</text>
- <button label="Predeterminados del SpaceNavigator" name="SpaceNavigatorDefaults" font="SansSerifSmall" left="330" width="210"/>
- <button label="OK" label_selected="OK" name="ok_btn" left="330"/>
- <button label="Cancelar" label_selected="Cancelar" name="cancel_btn" left_delta="120"/>
+ <button font="SansSerifSmall" label="Por defecto del SpaceNavigator" name="SpaceNavigatorDefaults"/>
+ <button label="OK" label_selected="OK" left="330" name="ok_btn"/>
+ <button label="Cancelar" label_selected="Cancelar" left_delta="120" name="cancel_btn"/>
<stat_view label="Monitor del joystick" name="axis_view">
<stat_bar label="Eje 0" name="axis0"/>
<stat_bar label="Eje 1" name="axis1"/>
diff --git a/indra/newview/skins/default/xui/es/floater_lagmeter.xml b/indra/newview/skins/default/xui/es/floater_lagmeter.xml
index 54c4ce8c6a..227689a194 100644
--- a/indra/newview/skins/default/xui/es/floater_lagmeter.xml
+++ b/indra/newview/skins/default/xui/es/floater_lagmeter.xml
@@ -1,155 +1,154 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_lagmeter" title="MEDIDOR DEL LAG">
- <button label="" label_selected="" name="client_lagmeter" tool_tip="Estado del lag del cliente"/>
- <text name="client">
- Cliente:
- </text>
- <text name="client_text" font="SansSerifSmall">
- Normal
- </text>
- <text left="30" name="client_lag_cause" right="-10" />
- <button label="" label_selected="" name="network_lagmeter" tool_tip="Estado del lag de la red"/>
- <text name="network">
- Red:
- </text>
- <text name="network_text" font="SansSerifSmall">
- Normal
- </text>
- <text left="30" name="network_lag_cause" right="-10" />
- <button label="" label_selected="" name="server_lagmeter" tool_tip="Estado del lag del servidor"/>
- <text name="server">
- Servidor:
- </text>
- <text name="server_text" font="SansSerifSmall">
- Normal
- </text>
- <text left="30" name="server_lag_cause" right="-32" />
- <button label="?" name="server_help"/>
- <button label="&gt;&gt;" name="minimize"/>
- <string name="max_title_msg">
+ <floater.string name="max_title_msg">
Medidor del lag
- </string>
- <string name="max_width_px">
+ </floater.string>
+ <floater.string name="max_width_px">
360
- </string>
- <string name="min_title_msg">
+ </floater.string>
+ <floater.string name="min_title_msg">
Lag
- </string>
- <string name="min_width_px">
+ </floater.string>
+ <floater.string name="min_width_px">
90
- </string>
- <string name="client_text_msg">
+ </floater.string>
+ <floater.string name="client_text_msg">
Cliente
- </string>
- <string name="client_frame_rate_critical_fps">
+ </floater.string>
+ <floater.string name="client_frame_rate_critical_fps">
10
- </string>
- <string name="client_frame_rate_warning_fps">
+ </floater.string>
+ <floater.string name="client_frame_rate_warning_fps">
15
- </string>
- <string name="client_frame_time_window_bg_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_window_bg_msg">
Normal, ventana en segundo plano
- </string>
- <string name="client_frame_time_critical_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_critical_msg">
Frames del cliente valorados por debajo de [CLIENT_FRAME_RATE_CRITICAL]
- </string>
- <string name="client_frame_time_warning_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_warning_msg">
Frames del cliente valorados entre [CLIENT_FRAME_RATE_CRITICAL] y [CLIENT_FRAME_RATE_WARNING]
- </string>
- <string name="client_frame_time_normal_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_normal_msg">
Normal
- </string>
- <string name="client_draw_distance_cause_msg">
+ </floater.string>
+ <floater.string name="client_draw_distance_cause_msg">
Posible causa: distancia de dibujo fijada muy alta
- </string>
- <string name="client_texture_loading_cause_msg">
+ </floater.string>
+ <floater.string name="client_texture_loading_cause_msg">
Posible causa: imágenes cargándose
- </string>
- <string name="client_texture_memory_cause_msg">
+ </floater.string>
+ <floater.string name="client_texture_memory_cause_msg">
Posible causa: demasiadas imágenes en la memoria
- </string>
- <string name="client_complex_objects_cause_msg">
+ </floater.string>
+ <floater.string name="client_complex_objects_cause_msg">
Posible causa: demasiados objetos complejos en la escena
- </string>
- <string name="network_text_msg">
+ </floater.string>
+ <floater.string name="network_text_msg">
Red
- </string>
- <string name="network_packet_loss_critical_pct">
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_pct">
10
- </string>
- <string name="network_packet_loss_warning_pct">
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_pct">
5
- </string>
- <string name="network_packet_loss_critical_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_msg">
La conexión deja caer más del [NETWORK_PACKET_LOSS_CRITICAL]% de los paquetes
- </string>
- <string name="network_packet_loss_warning_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_msg">
La conexión deja caer [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% de los paquetes
- </string>
- <string name="network_performance_normal_msg">
+ </floater.string>
+ <floater.string name="network_performance_normal_msg">
Normal
- </string>
- <string name="network_ping_critical_ms">
+ </floater.string>
+ <floater.string name="network_ping_critical_ms">
600
- </string>
- <string name="network_ping_warning_ms">
+ </floater.string>
+ <floater.string name="network_ping_warning_ms">
300
- </string>
- <string name="network_ping_critical_msg">
+ </floater.string>
+ <floater.string name="network_ping_critical_msg">
El tiempo de conexión -ping- supera los [NETWORK_PING_CRITICAL] ms
- </string>
- <string name="network_ping_warning_msg">
+ </floater.string>
+ <floater.string name="network_ping_warning_msg">
El tiempo de conexión -ping- es de [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
- </string>
- <string name="network_packet_loss_cause_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_cause_msg">
Quizá una mala conexión o un ancho de banda fijado demasiado alto.
- </string>
- <string name="network_ping_cause_msg">
+ </floater.string>
+ <floater.string name="network_ping_cause_msg">
Quizá una mala conexión o una aplicación de archivos compartidos.
- </string>
- <string name="server_text_msg">
+ </floater.string>
+ <floater.string name="server_text_msg">
Servidor
- </string>
- <string name="server_frame_rate_critical_fps">
+ </floater.string>
+ <floater.string name="server_frame_rate_critical_fps">
20
- </string>
- <string name="server_frame_rate_warning_fps">
+ </floater.string>
+ <floater.string name="server_frame_rate_warning_fps">
30
- </string>
- <string name="server_single_process_max_time_ms">
+ </floater.string>
+ <floater.string name="server_single_process_max_time_ms">
20
- </string>
- <string name="server_frame_time_critical_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_critical_msg">
Frecuencia (framerate) por debajo de [SERVER_FRAME_RATE_CRITICAL]
- </string>
- <string name="server_frame_time_warning_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_warning_msg">
Frecuencia (framerate) entre [SERVER_FRAME_RATE_CRITICAL] y [SERVER_FRAME_RATE_WARNING]
- </string>
- <string name="server_frame_time_normal_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_normal_msg">
Normal
- </string>
- <string name="server_physics_cause_msg">
+ </floater.string>
+ <floater.string name="server_physics_cause_msg">
Posible causa: demasiados objetos físicos
- </string>
- <string name="server_scripts_cause_msg">
+ </floater.string>
+ <floater.string name="server_scripts_cause_msg">
Posible causa: demasiados objetos con script
- </string>
- <string name="server_net_cause_msg">
+ </floater.string>
+ <floater.string name="server_net_cause_msg">
Posible causa: demasiado tráfico en la red
- </string>
- <string name="server_agent_cause_msg">
+ </floater.string>
+ <floater.string name="server_agent_cause_msg">
Posible causa: demasiada gente moviéndose en la región
- </string>
- <string name="server_images_cause_msg">
+ </floater.string>
+ <floater.string name="server_images_cause_msg">
Posible causa: demasiados cálculos de imáganes
- </string>
- <string name="server_generic_cause_msg">
+ </floater.string>
+ <floater.string name="server_generic_cause_msg">
Posible causa: carga del simulador muy pesada
- </string>
- <string name="smaller_label">
+ </floater.string>
+ <floater.string name="smaller_label">
&gt;&gt;
- </string>
- <string name="bigger_label">
+ </floater.string>
+ <floater.string name="bigger_label">
&lt;&lt;
- </string>
+ </floater.string>
+ <button label="" label_selected="" name="client_lagmeter" tool_tip="Estado del lag del cliente"/>
+ <text name="client">
+ Cliente
+ </text>
+ <text font="SansSerifSmall" name="client_text">
+ Normal
+ </text>
+ <text left="30" name="client_lag_cause" right="-10"/>
+ <button label="" label_selected="" name="network_lagmeter" tool_tip="Estado del lag de la red"/>
+ <text name="network">
+ Red
+ </text>
+ <text font="SansSerifSmall" name="network_text">
+ Normal
+ </text>
+ <text left="30" name="network_lag_cause" right="-10"/>
+ <button label="" label_selected="" name="server_lagmeter" tool_tip="Estado del lag del servidor"/>
+ <text name="server">
+ Servidor
+ </text>
+ <text font="SansSerifSmall" name="server_text">
+ Normal
+ </text>
+ <text left="30" name="server_lag_cause" right="-32"/>
+ <button label="&gt;&gt;" name="minimize" tool_tip="Cambia el tamaño de la ventana"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_land_holdings.xml b/indra/newview/skins/default/xui/es/floater_land_holdings.xml
index bcdebf4588..ed7055b3a1 100644
--- a/indra/newview/skins/default/xui/es/floater_land_holdings.xml
+++ b/indra/newview/skins/default/xui/es/floater_land_holdings.xml
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="land holdings floater" title="MI TERRENO">
<scroll_list name="parcel list">
- <column label="Nombre de la parcela" name="name"/>
+ <column label="Parcela" name="name"/>
<column label="Región" name="location"/>
<column label="Tipo" name="type"/>
<column label="Superficie" name="area"/>
<column label="" name="hidden"/>
</scroll_list>
<button label="Teleportar" label_selected="Teleportar" name="Teleport" tool_tip="Teleportar al centro de este terreno."/>
- <button width="130" label="Mostrar en el mapa" label_selected="Mostrar en el mapa" name="Show on Map" tool_tip="Mostrar este terreno en el mapa del mundo."/>
+ <button label="Mapa" label_selected="Mapa" name="Show on Map" tool_tip="Mostrar este terreno en el mapa del mundo" width="130"/>
<text name="contrib_label">
Contribuciones a sus grupos:
</text>
@@ -17,7 +17,7 @@
<column label="Superficie" name="area"/>
</scroll_list>
<text name="allowed_label">
- Propiedades de terreno permitidas en el plan de pago actual:
+ Propiedad de terreno permitida en el plan de pago:
</text>
<text name="allowed_text">
[AREA] m²
diff --git a/indra/newview/skins/default/xui/es/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/es/floater_live_lsleditor.xml
index 02be809319..4ff54bccb5 100644
--- a/indra/newview/skins/default/xui/es/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/es/floater_live_lsleditor.xml
@@ -1,12 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="script ed float" title="SCRIPT: SCRIPT NUEVO">
- <button label="Reiniciar" label_selected="Reiniciar" name="Reset"/>
- <check_box label="Ejecutándose" name="running" left="4"/>
- <check_box label="Mono" name="mono" left="106"/>
- <string name="not_allowed">
- No está autorizado para ver este script.
- </string>
- <string name="script_running">
+ <floater.string name="not_allowed">
+ No puedes ver ni editar este script. Ha sido configurado como &quot;no copiable&quot;. Necesitas todos los permisos para ver o editar un script que está dentro de un objeto.
+ </floater.string>
+ <floater.string name="script_running">
Ejecutándose
- </string>
+ </floater.string>
+ <floater.string name="Title">
+ SCRIPT: [NAME]
+ </floater.string>
+ <button label="Reiniciar" label_selected="Reiniciar" name="Reset"/>
+ <check_box initial_value="true" label="Ejecutándose" left="4" name="running"/>
+ <check_box initial_value="true" label="Mono" left="106" name="mono"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_lsl_guide.xml b/indra/newview/skins/default/xui/es/floater_lsl_guide.xml
index 0cde2fe5bc..43a7ede030 100644
--- a/indra/newview/skins/default/xui/es/floater_lsl_guide.xml
+++ b/indra/newview/skins/default/xui/es/floater_lsl_guide.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script ed float" title="WIKI DE LSL">
+<floater name="script ed float" title="GUÃA DE LSL">
<check_box label="Seguir al cursor" name="lock_check"/>
- <combo_box label="Bloquear" name="history_combo" left_delta="120" width="70"/>
- <button label="Atrás" name="back_btn" left_delta="75"/>
+ <combo_box label="Bloquear" left_delta="120" name="history_combo" width="70"/>
+ <button label="Atrás" left_delta="75" name="back_btn"/>
<button label="Adelante" name="fwd_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_map.xml b/indra/newview/skins/default/xui/es/floater_map.xml
index eee9caf830..7588380148 100644
--- a/indra/newview/skins/default/xui/es/floater_map.xml
+++ b/indra/newview/skins/default/xui/es/floater_map.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Map">
+<floater name="Map" title="">
<floater.string name="mini_map_north">
N
</floater.string>
diff --git a/indra/newview/skins/default/xui/es/floater_media_browser.xml b/indra/newview/skins/default/xui/es/floater_media_browser.xml
index cdc7ae49ff..9c4ef1eb2f 100644
--- a/indra/newview/skins/default/xui/es/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/es/floater_media_browser.xml
@@ -9,13 +9,13 @@
<layout_stack name="stack1">
<layout_panel name="nav_controls">
<button label="Atrás" name="back" width="75"/>
- <button label="Adelante" name="forward" left_delta="75" width="70"/>
- <button label="Actualizar" name="reload" left_delta="75"/>
+ <button label="Adelante" left_delta="75" name="forward" width="70"/>
+ <button label="Actualizar" left_delta="75" name="reload"/>
<combo_box left_delta="75" name="address" width="510"/>
- <button label="Ir" name="go" left_delta="515"/>
+ <button label="Ir" left_delta="515" name="go"/>
</layout_panel>
<layout_panel name="parcel_owner_controls">
- <button label="Enviar a la parcela la URL actual" name="assign"/>
+ <button label="Enviar a la parcela la página actual" name="assign"/>
</layout_panel>
<layout_panel name="external_controls">
<button label="Abrir en mi navegador" name="open_browser"/>
diff --git a/indra/newview/skins/default/xui/es/floater_media_settings.xml b/indra/newview/skins/default/xui/es/floater_media_settings.xml
new file mode 100644
index 0000000000..3f7cef5785
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_media_settings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="media_settings" title="CONFIGURACIÓN DE LOS MEDIA">
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
+ <button label="Aplicar" label_selected="Aplicar" name="Apply"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_mem_leaking.xml b/indra/newview/skins/default/xui/es/floater_mem_leaking.xml
index 6d5e987409..da8ba780bc 100644
--- a/indra/newview/skins/default/xui/es/floater_mem_leaking.xml
+++ b/indra/newview/skins/default/xui/es/floater_mem_leaking.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="MemLeak" title="PRUEBA DE LA FUGA DE MEMORIA">
+<floater name="MemLeak" title="SIMULAR UNA PÉRDIDA DE MEMORIA">
<spinner label="Velocidad de la fuga (bites por fotograma):" name="leak_speed"/>
<spinner label="Fuga de memoria máx. (MB):" name="max_leak"/>
<text name="total_leaked_label">
diff --git a/indra/newview/skins/default/xui/es/floater_moveview.xml b/indra/newview/skins/default/xui/es/floater_moveview.xml
index a61cebbf80..258f84c361 100644
--- a/indra/newview/skins/default/xui/es/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/es/floater_moveview.xml
@@ -1,13 +1,75 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="move_floater">
-<panel name="panel_actions">
- <button label="" label_selected="" name="turn left btn" tool_tip="Girar a la izquierda"/>
- <button label="" label_selected="" name="turn right btn" tool_tip="Girar a la derecha"/>
- <button label="" label_selected="" name="move up btn" tool_tip="Saltar o ascender"/>
- <button label="" label_selected="" name="move down btn" tool_tip="Agacharse o descender"/>
- <joystick_slide name="slide left btn" tool_tip="Ir hacia la izquierda"/>
- <joystick_slide name="slide right btn" tool_tip="Ir hacia la derecha"/>
- <joystick_turn name="forward btn" tool_tip="Ir hacia adelante"/>
- <joystick_turn name="backward btn" tool_tip="Ir hacia atrás"/>
-</panel>
+ <string name="walk_forward_tooltip">
+ Caminar hacia adelante (cursor arriba o W)
+ </string>
+ <string name="walk_back_tooltip">
+ Caminar de espaldas (cursor abajo o S)
+ </string>
+ <string name="walk_left_tooltip">
+ Caminar a la izq. (pulsa Mayúsculas + cursor izq. o A)
+ </string>
+ <string name="walk_right_tooltip">
+ Caminar a la der. (pulsa Mayúsculas + cursor der. o D)
+ </string>
+ <string name="run_forward_tooltip">
+ Correr hacia adelante (cursor arriba o W)
+ </string>
+ <string name="run_back_tooltip">
+ Correr de espaldas (cursor abajo o S)
+ </string>
+ <string name="run_left_tooltip">
+ Correr a la izq. (pulsa Mayúsculas + cursor izq. o A)
+ </string>
+ <string name="run_right_tooltip">
+ Correr a la der. (pulsa Mayúsculas + cursor der. o D)
+ </string>
+ <string name="fly_forward_tooltip">
+ Volar hacia adelante (cursor arriba o W)
+ </string>
+ <string name="fly_back_tooltip">
+ Volar hacia atrás (cursor abajo o S)
+ </string>
+ <string name="fly_left_tooltip">
+ Volar a la izq. (pulsa Mayúsculas + cursor izq. o A)
+ </string>
+ <string name="fly_right_tooltip">
+ Volar a la der. (pulsa Mayúsculas + cursor der. o D)
+ </string>
+ <string name="fly_up_tooltip">
+ Volar (pulsa E para subir)
+ </string>
+ <string name="fly_down_tooltip">
+ Volar (pulsa C para descender)
+ </string>
+ <string name="jump_tooltip">
+ Saltar (pulsa E)
+ </string>
+ <string name="crouch_tooltip">
+ Agacharse (pulsa C)
+ </string>
+ <string name="walk_title">
+ Caminar
+ </string>
+ <string name="run_title">
+ Correr
+ </string>
+ <string name="fly_title">
+ Volar
+ </string>
+ <panel name="panel_actions">
+ <button label="" label_selected="" name="move up btn" tool_tip="Volar (pulsa E para subir)"/>
+ <button label="" label_selected="" name="turn left btn" tool_tip="Girar a la izq. (cursor izq. o A)"/>
+ <joystick_slide name="move left btn" tool_tip="Caminar a la izq. (pulsa Mayúsculas + cursor izq. o A)"/>
+ <button label="" label_selected="" name="move down btn" tool_tip="Volar (pulsa C para descender)"/>
+ <button label="" label_selected="" name="turn right btn" tool_tip="Girar a la der. (cursor der. o D)"/>
+ <joystick_slide name="move right btn" tool_tip="Caminar a la der. (pulsa Mayúsculas + cursor der. o D)"/>
+ <joystick_turn name="forward btn" tool_tip="Caminar hacia adelante (cursor arriba o W)"/>
+ <joystick_turn name="backward btn" tool_tip="Caminar de espaldas (cursor abajo o S)"/>
+ </panel>
+ <panel name="panel_modes">
+ <button label="" name="mode_walk_btn" tool_tip="Modo de caminar"/>
+ <button label="" name="mode_run_btn" tool_tip="Modo de correr"/>
+ <button label="" name="mode_fly_btn" tool_tip="Modo de volar"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_mute_object.xml b/indra/newview/skins/default/xui/es/floater_mute_object.xml
index 390333cd1d..4cd16a59ed 100644
--- a/indra/newview/skins/default/xui/es/floater_mute_object.xml
+++ b/indra/newview/skins/default/xui/es/floater_mute_object.xml
@@ -1,13 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="mute by name" title="IGNORAR UN OBJETO SEGÚN SU NOMBRE">
- <text name="message" bottom_delta="-40">
- Ignorar según el nombre sólo afecta al chat y los MI del
-objeto, no a sus sonidos.
-Debe escribir exactamente el nombre del objeto.
+<floater name="mute by name" title="IGNORAR OBJETOS SEGÚN SU NOMBRE">
+ <text bottom_delta="-40" name="message">
+ Ignorar un objeto:
</text>
- <line_editor name="object_name" bottom_delta="-58">
+ <line_editor bottom_delta="-58" name="object_name">
Nombre del objeto
</line_editor>
+ <text name="note">
+ * Sólo se ignoran los textos del objeto, no sus sonidos
+ </text>
<button label="OK" name="OK"/>
<button label="Cancelar" name="Cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_nearby_chat.xml b/indra/newview/skins/default/xui/es/floater_nearby_chat.xml
new file mode 100644
index 0000000000..d30a39f725
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_nearby_chat.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="nearby_chat" title="CHAT"/>
diff --git a/indra/newview/skins/default/xui/es/floater_openobject.xml b/indra/newview/skins/default/xui/es/floater_openobject.xml
index 89c79e8833..b8b688df60 100644
--- a/indra/newview/skins/default/xui/es/floater_openobject.xml
+++ b/indra/newview/skins/default/xui/es/floater_openobject.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="objectcontents" title="CONTENIDO DEL OBJETO">
+<floater name="objectcontents" title="CONTENIDOS DEL OBJETO">
<text name="object_name">
[DESC]:
</text>
diff --git a/indra/newview/skins/default/xui/es/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/es/floater_outfit_save_as.xml
new file mode 100644
index 0000000000..9f9902a3a0
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_outfit_save_as.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container" title="Guardar el vestuario">
+ <button label="Guardar" label_selected="Guardar" name="Save"/>
+ <button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
+ <text name="Save item as:">
+ Guardar lo que llevo puesto
+como un vestuario nuevo:
+ </text>
+ <line_editor name="name ed">
+ [DESC] (nuevo)
+ </line_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_outgoing_call.xml b/indra/newview/skins/default/xui/es/floater_outgoing_call.xml
new file mode 100644
index 0000000000..5fd9dba9ac
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_outgoing_call.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="outgoing call" title="LLAMANDO">
+ <floater.string name="lifetime">
+ 5
+ </floater.string>
+ <floater.string name="localchat">
+ Chat de voz
+ </floater.string>
+ <floater.string name="anonymous">
+ anónimo
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ está llamando.
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ ha entrado en un chat de voz en multiconferencia.
+ </floater.string>
+ <text name="connecting">
+ Conectando con [CALLEE_NAME]
+ </text>
+ <text name="calling">
+ Llamando a [CALLEE_NAME]
+ </text>
+ <text name="noanswer">
+ Sin respuesta. Vuelve a intentarlo más tarde.
+ </text>
+ <text name="nearby">
+ Has sido desconectado de [VOICE_CHANNEL_NAME]. [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_other">
+ Tu llamada ha acabado. [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_agent">
+ Has finalizado la llamada. [RECONNECT_NEARBY]
+ </text>
+ <text name="leaving">
+ Saliendo de [CURRENT_CHAT].
+ </text>
+ <button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_pay.xml b/indra/newview/skins/default/xui/es/floater_pay.xml
index 64156d94e3..d4a4e81310 100644
--- a/indra/newview/skins/default/xui/es/floater_pay.xml
+++ b/indra/newview/skins/default/xui/es/floater_pay.xml
@@ -1,22 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
+ <string name="payee_group">
+ Pagar al grupo
+ </string>
+ <string name="payee_resident">
+ Pagar al residente
+ </string>
+ <text left="5" name="payee_label" width="105">
+ Pagar:
+ </text>
+ <icon name="icon_person" tool_tip="Persona"/>
+ <text left="115" name="payee_name">
+ [FIRST] [LAST]
+ </text>
<button label="1 L$" label_selected="1 L$" name="fastpay 1"/>
<button label="5 L$" label_selected="5 L$" name="fastpay 5"/>
<button label="10 L$" label_selected="10 L$" name="fastpay 10"/>
<button label="20 L$" label_selected="20 L$" name="fastpay 20"/>
- <button label="Pagar" label_selected="Pagar" name="pay btn"/>
- <button label="Cancelar" label_selected="Cancelar" name="cancel btn"/>
- <text name="payee_label" left="5" width="105">
- Pagar al residente:
- </text>
- <text name="payee_name" left="115">
- [FIRST] [LAST]
- </text>
- <text name="fastpay text" width="100" halign="left">
- Pago rápido:
- </text>
- <text name="amount text" left="4" >
- Cantidad:
+ <text left="4" name="amount text">
+ O elige cuánto:
</text>
<line_editor left="60" name="amount" width="55"/>
+ <button label="Pagar" label_selected="Pagar" name="pay btn"/>
+ <button label="Cancelar" label_selected="Cancelar" name="cancel btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_pay_object.xml b/indra/newview/skins/default/xui/es/floater_pay_object.xml
index b5eca53bfa..f29745ea9b 100644
--- a/indra/newview/skins/default/xui/es/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/es/floater_pay_object.xml
@@ -1,30 +1,29 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <text name="payee_group" left="5" width="110">
- Pagar al grupo:
- </text>
- <text name="payee_resident" left="5" width="110">
- Pagar al residente:
- </text>
- <text name="payee_name" left="120" width="180">
+ <string left="5" name="payee_group" width="110">
+ Pagar al grupo
+ </string>
+ <string left="5" name="payee_resident" width="110">
+ Pagar al residente
+ </string>
+ <icon name="icon_person" tool_tip="Persona"/>
+ <text left="120" name="payee_name" width="180">
[FIRST] [LAST]
</text>
- <text name="object_name_label" left="5" width="110">
+ <text left="5" name="object_name_label" width="110">
A través del objeto:
</text>
- <text name="object_name_text" left="120" width="180">
- ...
- </text>
- <text name="fastpay text">
- Pago rápido:
- </text>
- <text name="amount text">
- Cantidad:
+ <icon name="icon_object" tool_tip="Objetos"/>
+ <text left="120" name="object_name_text" width="180">
+ El muy largo nombre de mi objeto
</text>
<button label="1 L$" label_selected="1 L$" name="fastpay 1"/>
<button label="5 L$" label_selected="5 L$" name="fastpay 5"/>
<button label="10 L$" label_selected="10 L$" name="fastpay 10"/>
<button label="20 L$" label_selected="20 L$" name="fastpay 20"/>
+ <text name="amount text">
+ O elige cuánto:
+ </text>
<button label="Pagar" label_selected="Pagar" name="pay btn"/>
<button label="Cancelar" label_selected="Cancelar" name="cancel btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_perm_prefs.xml b/indra/newview/skins/default/xui/es/floater_perm_prefs.xml
index 7d3c8e62f3..93e2088aba 100644
--- a/indra/newview/skins/default/xui/es/floater_perm_prefs.xml
+++ b/indra/newview/skins/default/xui/es/floater_perm_prefs.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="perm prefs" title="PERMISOS DE SUBIDA POR DEFECTO">
+<floater name="perm prefs" title="PERMISOS POR DEFECTO DE SUBIDA">
<panel label="Permisos" name="permissions">
<button label="?" label_selected="?" name="help"/>
<check_box label="Compartir con el grupo" name="share_with_group"/>
diff --git a/indra/newview/skins/default/xui/es/floater_postcard.xml b/indra/newview/skins/default/xui/es/floater_postcard.xml
index ace3204cc7..df94486c0e 100644
--- a/indra/newview/skins/default/xui/es/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/es/floater_postcard.xml
@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Postcard" title="FOTO POR CORREO ELECTRÓNICO">
+<floater name="Postcard" title="FOTO POR CORREO">
<text name="to_label">
Correo electrónico
del destinatario:
</text>
- <line_editor bottom_delta="-20" name="to_form" />
- <text name="from_label" bottom_delta="-12">
+ <line_editor bottom_delta="-20" name="to_form"/>
+ <text bottom_delta="-12" name="from_label">
Su correo
electrónico:
</text>
- <line_editor bottom_delta="-20" name="from_form" />
+ <line_editor bottom_delta="-20" name="from_form"/>
<text name="name_label">
Su nombre:
</text>
@@ -17,20 +17,20 @@
Asunto:
</text>
<line_editor label="Escriba aquí el asunto." name="subject_form"/>
- <text name="msg_label" bottom_delta="-18">
+ <text bottom_delta="-18" name="msg_label">
Mensaje:
</text>
<text_editor name="msg_form">
Escriba aquí el mensaje.
</text_editor>
- <text name="fine_print" bottom_delta="-21">
+ <text bottom_delta="-21" name="fine_print">
Si su destinatario se registra en [SECOND_LIFE],
usted conseguirá un bono de referido.
</text>
<button label="Cancelar" name="cancel_btn"/>
<button label="Enviar" name="send_btn"/>
<string name="default_subject">
- Postal desde [SECOND_LIFE]
+ Postal desde [SECOND_LIFE].
</string>
<string name="default_message">
¡Mira esto!
diff --git a/indra/newview/skins/default/xui/es/floater_preferences.xml b/indra/newview/skins/default/xui/es/floater_preferences.xml
index 5fe4ae3b64..61f12fc0d7 100644
--- a/indra/newview/skins/default/xui/es/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/es/floater_preferences.xml
@@ -1,9 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Preferences" title="PREFERENCIAS" min_width="350" width="646">
+<floater name="Preferences" title="PREFERENCIAS">
<button label="OK" label_selected="OK" name="OK"/>
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
- <button label="Aplicar" label_selected="Aplicar" name="Apply"/>
- <button label="Acerca de..." label_selected="Acerca de..." name="About..." />
- <button label="Ayuda" label_selected="Ayuda" name="Help"/>
- <tab_container name="pref core" tab_width="146" width="646" />
+ <tab_container name="pref core">
+ <panel label="General" name="general"/>
+ <panel label="Gráficos" name="display"/>
+ <panel label="Privacidad" name="im"/>
+ <panel label="Sonido y Media" name="audio"/>
+ <panel label="Chat" name="chat"/>
+ <panel label="Notificaciones" name="msgs"/>
+ <panel label="Configurar" name="input"/>
+ <panel label="Avanzado" name="advanced1"/>
+ </tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_animation.xml b/indra/newview/skins/default/xui/es/floater_preview_animation.xml
index 0d9cf8ec9f..6b8c8b6ff5 100644
--- a/indra/newview/skins/default/xui/es/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/es/floater_preview_animation.xml
@@ -1,8 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_anim">
+ <floater.string name="Title">
+ Animación: [NAME]
+ </floater.string>
<text name="desc txt">
Descripción:
</text>
- <button left="12" width="142" label="Ejecutarla en el mundo" label_selected="Parar" name="Anim play btn" tool_tip="Ejecutar esta animación de modo que puedan verla los demás."/>
- <button left="156" width="136" label="Ejecutarla para usted" label_selected="Parar" name="Anim audition btn" tool_tip="Ejecutar esta animación de modo que sólo la vea usted."/>
+ <button label="Ver en el mundo" label_selected="Parar" left="12" name="Anim play btn" tool_tip="Ejecutar esta animación de modo que puedan verla los demás" width="142"/>
+ <button label="Ejecutarla para usted" label_selected="Parar" left="156" name="Anim audition btn" tool_tip="Ejecutar esta animación de modo que sólo la vea yo" width="136"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_classified.xml b/indra/newview/skins/default/xui/es/floater_preview_classified.xml
index 8114c7f3c2..d9c9c51ba8 100644
--- a/indra/newview/skins/default/xui/es/floater_preview_classified.xml
+++ b/indra/newview/skins/default/xui/es/floater_preview_classified.xml
@@ -1,2 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="classified_preview" title="INFORMACIÓN CLASIFICADA"/>
+<floater name="classified_preview" title="INFORMACIÓN DEL CLASIFICADO">
+ <floater.string name="Title">
+ Clasificado: [NAME]
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_event.xml b/indra/newview/skins/default/xui/es/floater_preview_event.xml
index 04cb0de4d4..7edd4f9e3f 100644
--- a/indra/newview/skins/default/xui/es/floater_preview_event.xml
+++ b/indra/newview/skins/default/xui/es/floater_preview_event.xml
@@ -1,2 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="event_preview" title="INFORMACIÓN DE EVENTOS"/>
+<floater name="event_preview" title="INFORMACIÓN DEL EVENTO">
+ <floater.string name="Title">
+ Evento: [NAME]
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_gesture.xml b/indra/newview/skins/default/xui/es/floater_preview_gesture.xml
index 0e43ce536c..44179d6b28 100644
--- a/indra/newview/skins/default/xui/es/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/es/floater_preview_gesture.xml
@@ -1,14 +1,32 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="gesture_preview">
- <string name="stop_txt">
+ <floater.string name="step_anim">
+ Animación a ejecutar:
+ </floater.string>
+ <floater.string name="step_sound">
+ Sonido a ejecutar:
+ </floater.string>
+ <floater.string name="step_chat">
+ Decir en el chat:
+ </floater.string>
+ <floater.string name="step_wait">
+ Espera:
+ </floater.string>
+ <floater.string name="stop_txt">
Parar
- </string>
- <string name="preview_txt">
+ </floater.string>
+ <floater.string name="preview_txt">
Vista previa
- </string>
- <string name="none_text">
+ </floater.string>
+ <floater.string name="none_text">
-- Ninguno --
- </string>
+ </floater.string>
+ <floater.string name="Title">
+ Gesto: [NAME]
+ </floater.string>
+ <text name="name_text">
+ Nombre:
+ </text>
<text name="desc_label">
Descripción:
</text>
@@ -22,37 +40,31 @@
<text name="key_label">
Atajo de teclado:
</text>
- <combo_box label="Ninguno" name="modifier_combo" left="116" width="76"/>
- <combo_box label="Ninguno" name="key_combo" width="76" left_delta="80"/>
+ <combo_box label="Ninguno" left="116" name="modifier_combo" width="76"/>
+ <combo_box label="Ninguno" left_delta="80" name="key_combo" width="76"/>
<text name="library_label">
Biblioteca:
</text>
+ <scroll_list name="library_list"/>
+ <button label="Añadir &gt;&gt;" name="add_btn"/>
<text name="steps_label">
Pasos:
</text>
- <scroll_list name="library_list">
- Animación
-Sonido
-Chat
-Esperar
- </scroll_list>
- <button label="Añadir &gt;&gt;" name="add_btn"/>
- <button label="Hacia arriba" name="up_btn"/>
- <button label="Hacia abajo" name="down_btn"/>
+ <button label="Arriba" name="up_btn"/>
+ <button label="Abajo" name="down_btn"/>
<button label="Quitar" name="delete_btn"/>
- <text name="help_label">
- Todos los pasos suceden a la vez,
-a menos que añada pasos de espera.
- </text>
- <text left="230" name="options_text" width="200" />
+ <text left="230" name="options_text" width="200"/>
<radio_group name="animation_trigger_type">
- <radio_item name="start" label="Empezar" />
- <radio_item name="stop" label="Parar" />
+ <radio_item label="Empezar" name="start"/>
+ <radio_item label="Parar" name="stop"/>
</radio_group>
- <check_box bottom_delta="34" label="hasta que las animaciones &#10;estén hechas" name="wait_anim_check"/>
+ <check_box bottom_delta="34" label="hasta que las animaciones estén hechas" name="wait_anim_check"/>
<check_box bottom_delta="-30" label="tiempo en segundos" name="wait_time_check"/>
- <line_editor left_delta="130" name="wait_time_editor" />
- <check_box left="130" label="Disponible" name="active_check" tool_tip="Los gestos disponibles pueden realizarse escribiendo en el chat su frase clave o pulsando su tecla de acceso rápido. Generalmente, los gestos pasan a no disponibles cuando hay un conflicto de teclas."/>
+ <line_editor left_delta="130" name="wait_time_editor"/>
+ <text name="help_label">
+ Todos los pasos suceden a la vez, a menos que añadas pasos de espera.
+ </text>
+ <check_box label="Disponible" left="130" name="active_check" tool_tip="Los gestos disponibles pueden realizarse escribiendo en el chat su frase clave o pulsando su tecla de acceso rápido. Generalmente, los gestos pasan a no disponibles cuando hay un conflicto de teclas."/>
<button label="Vista previa" name="preview_btn" width="85"/>
<button label="Guardar" name="save_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/es/floater_preview_gesture_info.xml
new file mode 100644
index 0000000000..f5b771c6e7
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_preview_gesture_info.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="ATAJO DE TECLADO PARA GESTOS"/>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/es/floater_preview_gesture_shortcut.xml
new file mode 100644
index 0000000000..ea955f9727
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_preview_gesture_shortcut.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="ATAJO DE TECLADO PARA GESTOS">
+ <text name="trigger_label">
+ Chat :
+ </text>
+ <text name="key_label">
+ Teclado:
+ </text>
+ <combo_box label="Ninguno/a" name="modifier_combo"/>
+ <combo_box label="Ninguno/a" name="key_combo"/>
+ <text name="replace_text" tool_tip="Reemplaza la/s palabra/s clave con estas palabras. Por ejemplo, si cambias la palabra clave &apos;hola&apos; por &apos;qué tal&apos;, se cambiará en el chat &apos;Quería decir hola&apos; por &apos;Quería decir qué tal&apos; en cuanto realices el gesto.">
+ Reemplazar por:
+ </text>
+ <line_editor name="replace_editor" tool_tip="Reemplaza la/s palabra/s clave con estas palabras. Por ejemplo, si cambias la palabra clave &apos;hola&apos; por &apos;qué tal&apos;, se cambiará en el chat &apos;Quería decir hola&apos; por &apos;Quería decir qué tal&apos; en cuanto realices el gesto."/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/es/floater_preview_gesture_steps.xml
new file mode 100644
index 0000000000..f5b771c6e7
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_preview_gesture_steps.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="ATAJO DE TECLADO PARA GESTOS"/>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_notecard.xml b/indra/newview/skins/default/xui/es/floater_preview_notecard.xml
index 35f795a7ec..d05a023279 100644
--- a/indra/newview/skins/default/xui/es/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/es/floater_preview_notecard.xml
@@ -1,16 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview notecard" title="NOTA:">
- <button label="Guardar" label_selected="Guardar" name="Save"/>
+ <floater.string name="no_object">
+ No se ha podido encontrar el objeto que contiene esta nota.
+ </floater.string>
+ <floater.string name="not_allowed">
+ No tienes permiso para ver esta nota.
+ </floater.string>
+ <floater.string name="Title">
+ Nota: [NAME]
+ </floater.string>
<text name="desc txt">
Descripción:
</text>
<text_editor name="Notecard Editor">
Cargando...
</text_editor>
- <string name="no_object">
- No se ha podido encontrar el objeto que contiene esta nota.
- </string>
- <string name="not_allowed">
- No está autorizado a ver esta nota.
- </string>
+ <button label="Guardar" label_selected="Guardar" name="Save"/>
+ <button label="Borrar" label_selected="Borrar" name="Delete"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_sound.xml b/indra/newview/skins/default/xui/es/floater_preview_sound.xml
index 060a033b08..62525c9536 100644
--- a/indra/newview/skins/default/xui/es/floater_preview_sound.xml
+++ b/indra/newview/skins/default/xui/es/floater_preview_sound.xml
@@ -1,8 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_sound">
+ <floater.string name="Title">
+ Sonido : [NAME]
+ </floater.string>
<text name="desc txt">
Descripción:
</text>
- <button label="Tocar en el mundo" label_selected="Tocar en el mundo" name="Sound play btn" tool_tip="Tocar este sonido para que puedan oírlo los demás."/>
- <button label="Oír sólo uno mismo" label_selected="Oír sólo uno mismo" name="Sound audition btn" tool_tip="Tocar este sonido para que sólo pueda oírlo usted."/>
+ <button label="Escuchar en el mundo" label_selected="Escuchar en el mundo" name="Sound play btn" tool_tip="Ejecutar este sonido de modo que lo oigan todos"/>
+ <button label="Oír sólo uno mismo" label_selected="Oír sólo uno mismo" name="Sound audition btn" tool_tip="Ejecutar este sonido de modo que sólo tú lo oigas"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_preview_texture.xml b/indra/newview/skins/default/xui/es/floater_preview_texture.xml
index 280438fefd..4012191c78 100644
--- a/indra/newview/skins/default/xui/es/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/es/floater_preview_texture.xml
@@ -1,9 +1,47 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_texture">
+ <floater.string name="Title">
+ Textura: [NAME]
+ </floater.string>
+ <floater.string name="Copy">
+ Copiar al inventario
+ </floater.string>
<text name="desc txt">
Descripción:
</text>
<text name="dimensions">
- Tamaño: [WIDTH] x [HEIGHT]
+ [WIDTH] px x [HEIGHT] px
</text>
+ <text name="aspect_ratio">
+ Previsualizar la ratio de las proporciones
+ </text>
+ <combo_box name="combo_aspect_ratio" tool_tip="Vista previa en una proporción concreta">
+ <combo_item name="Unconstrained">
+ Sin restricciones
+ </combo_item>
+ <combo_item name="1:1" tool_tip="Emblema del grupo o perfil del Mundo real">
+ 1:1
+ </combo_item>
+ <combo_item name="4:3" tool_tip="Perfil de [SECOND_LIFE]">
+ 4:3
+ </combo_item>
+ <combo_item name="10:7" tool_tip="Clasificados (también en las listas de búsqueda), hitos">
+ 10:7
+ </combo_item>
+ <combo_item name="3:2" tool_tip="Acerca del terreno">
+ 3:2
+ </combo_item>
+ <combo_item name="16:10">
+ 16:10
+ </combo_item>
+ <combo_item name="16:9" tool_tip="Destacados del perfil">
+ 16:9
+ </combo_item>
+ <combo_item name="2:1">
+ 2:1
+ </combo_item>
+ </combo_box>
+ <button label="OK" name="Keep"/>
+ <button label="Descartar" name="Discard"/>
+ <button label="Guardar como" name="save_tex_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_publish_classified.xml b/indra/newview/skins/default/xui/es/floater_publish_classified.xml
new file mode 100644
index 0000000000..5eed89d522
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_publish_classified.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="publish_classified" title="Publicación de clasificados">
+ <text name="explanation_text">
+ Tu anuncio clasificado se mostrará durante una semana a partir del día en que se publicó.
+
+Recuerda, no se reembolsarán las cantidades abonadas por clasificados.
+ </text>
+ <spinner label="Precio por el anuncio:" name="price_for_listing" tool_tip="Precio por publicarlo." value="50"/>
+ <text name="l$_text" value="L$"/>
+ <text name="more_info_text">
+ Más información (enlace a ayuda de clasificados)
+ </text>
+ <button label="Publicar" name="publish_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_report_abuse.xml b/indra/newview/skins/default/xui/es/floater_report_abuse.xml
index a075c51247..760429e73d 100644
--- a/indra/newview/skins/default/xui/es/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/es/floater_report_abuse.xml
@@ -1,12 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_report_abuse" title="DENUNCIA DE INFRACCIÓN">
- <texture_picker label="" name="screenshot"/>
- <check_box label="Incluir una captura de pantalla" name="screen_check"/>
+ <floater.string name="Screenshot">
+ Captura de pantalla
+ </floater.string>
+ <check_box label="Usar esta captura de pantalla" name="screen_check"/>
<text name="reporter_title">
Denunciante:
</text>
<text name="reporter_field">
- Loremipsum Dolorsitamut
+ Loremipsum Dolorsitamut Longnamez
</text>
<text name="sim_title">
Región:
@@ -21,11 +23,11 @@
{128.1, 128.1, 15.4}
</text>
<text name="select_object_label">
- Pulse el botón y luego el objeto:
+ Pulsa el botón y luego el objeto a denunciar:
</text>
<button label="" label_selected="" name="pick_btn" tool_tip="Señalar objeto - Identificar un objeto como sujeto de esta denuncia"/>
<text name="object_name_label">
- Nombre:
+ Objeto:
</text>
<text name="object_name">
Consetetur Sadipscing
@@ -34,54 +36,53 @@
Propietario:
</text>
<text name="owner_name">
- Hendrerit Vulputate
+ Hendrerit Vulputate Kamawashi Longname
</text>
<combo_box name="category_combo" tool_tip="Categoría -- Elija la categoría que describa mejor esta denuncia">
- <combo_box.item name="Select_category" label="Elegir la categoría"/>
- <combo_box.item name="Age__Age_play" label="Edad &gt; Jugar a ser niño"/>
- <combo_box.item name="Age__Adult_resident_on_Teen_Second_Life" label="Edad &gt; Residente adulto en Teen Second Life"/>
- <combo_box.item name="Age__Underage_resident_outside_of_Teen_Second_Life" label="Edad &gt; Residente menor de edad fuera de Teen Second Life"/>
- <combo_box.item name="Assault__Combat_sandbox___unsafe_area" label="Ataque &gt; Sandbox de combate / Zona no segura"/>
- <combo_box.item name="Assault__Safe_area" label="Ataque &gt; Zona segura"/>
- <combo_box.item name="Assault__Weapons_testing_sandbox" label="Ataque &gt; Sandbox de prueba de armas"/>
- <combo_box.item name="Commerce__Failure_to_deliver_product_or_service" label="Comercio &gt; Error en la entrega de productos o servicios"/>
- <combo_box.item name="Disclosure__Real_world_information" label="Indiscreción &gt; Información del mundo real"/>
- <combo_box.item name="Disclosure__Remotely_monitoring chat" label="Indiscreción &gt; Monitorizar a distancia el chat"/>
- <combo_box.item name="Disclosure__Second_Life_information_chat_IMs" label="Indiscreción &gt; Información Se Second Life, el chat o los MI"/>
- <combo_box.item name="Disturbing_the_peace__Unfair_use_of_region_resources" label="Perturbando la paz &gt; Abuso de los recursos de la región"/>
- <combo_box.item name="Disturbing_the_peace__Excessive_scripted_objects" label="Perturbando la paz &gt; Excesivos objetos con script"/>
- <combo_box.item name="Disturbing_the_peace__Object_littering" label="Perturbando la paz &gt; Objeto basura"/>
- <combo_box.item name="Disturbing_the_peace__Repetitive_spam" label="Perturbando la paz &gt; Spam (mensajes no pedidos) repetitivo"/>
- <combo_box.item name="Disturbing_the_peace__Unwanted_advert_spam" label="Perturbando la paz &gt; Publicidad no deseada"/>
- <combo_box.item name="Fraud__L$" label="Fraude &gt; L$"/>
- <combo_box.item name="Fraud__Land" label="Fraude &gt; Terreno"/>
- <combo_box.item name="Fraud__Pyramid_scheme_or_chain_letter" label="Fraude &gt; Esquemas piramidales o cadenas de cartas"/>
- <combo_box.item name="Fraud__US$" label="Fraude &gt; US$"/>
- <combo_box.item name="Harassment__Advert_farms___visual_spam" label="Acoso &gt; Anuncios múltiples / Spam visual"/>
- <combo_box.item name="Harassment__Defaming_individuals_or_groups" label="Acoso &gt; Difamación de individuos o grupos"/>
- <combo_box.item name="Harassment__Impeding_movement" label="Acoso &gt; Impedir el movimiento"/>
- <combo_box.item name="Harassment__Sexual_harassment" label="Acoso &gt; Acoso sexual"/>
- <combo_box.item name="Harassment__Solicting_inciting_others_to_violate_ToS" label="Acoso &gt; Incitar a, o pedir, que otros violen las Condiciones del Servicio"/>
- <combo_box.item name="Harassment__Verbal_abuse" label="Acoso &gt; Abuso verbal"/>
- <combo_box.item name="Indecency__Broadly_offensive_content_or_conduct" label="Indecencia &gt; En general, contenido o conducta ofensivos"/>
- <combo_box.item name="Indecency__Inappropriate_avatar_name" label="Indecencia &gt; Nombre inapropiado del avatar"/>
- <combo_box.item name="Indecency__Mature_content_in_PG_region" label="Indecencia &gt; Contenido o conducta inapropiada en una región &apos;PG&apos;"/>
- <combo_box.item name="Indecency__Inappropriate_content_in_Mature_region" label="Indecencia &gt; Contenido o conducta inapropiada en una región &apos;Mature&apos;"/>
- <combo_box.item name="Intellectual_property_infringement_Content_Removal" label="Infracción de la propiedad intelectual &gt; Eliminación de contenidos"/>
- <combo_box.item name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit" label="Infracción de la propiedad intelectual &gt; CopyBot o Exploit (programa malicioso) de permisos"/>
- <combo_box.item name="Intolerance" label="Intolerancia"/>
- <combo_box.item name="Land__Abuse_of_sandbox_resources" label="Terreno &gt; Abuso de los recursos de un sandbox"/>
- <combo_box.item name="Land__Encroachment__Objects_textures" label="Terreno &gt; Invasión &gt; Objetos/Texturas"/>
- <combo_box.item name="Land__Encroachment__Particles" label="Terreno &gt; Invasión &gt; Partículas"/>
- <combo_box.item name="Land__Encroachment__Trees_plants" label="Terreno &gt; Invasión &gt; Ãrboles/Plantas"/>
- <combo_box.item name="Wagering_gambling" label="Apuestas/Juego"/>
- <combo_box.item name="Other" label="Otra"/>
+ <combo_box.item label="Elegir la categoría" name="Select_category"/>
+ <combo_box.item label="Edad &gt; Jugar a ser niño" name="Age__Age_play"/>
+ <combo_box.item label="Edad &gt; Residente adulto en Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/>
+ <combo_box.item label="Edad &gt; Residente menor de edad fuera de Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
+ <combo_box.item label="Ataque &gt; Sandbox de combate / Zona no segura" name="Assault__Combat_sandbox___unsafe_area"/>
+ <combo_box.item label="Ataque &gt; Zona segura" name="Assault__Safe_area"/>
+ <combo_box.item label="Ataque &gt; Sandbox de prueba de armas" name="Assault__Weapons_testing_sandbox"/>
+ <combo_box.item label="Comercio &gt; Error en la entrega de productos o servicios" name="Commerce__Failure_to_deliver_product_or_service"/>
+ <combo_box.item label="Indiscreción &gt; Información del mundo real" name="Disclosure__Real_world_information"/>
+ <combo_box.item label="Indiscreción &gt; Monitorizar a distancia el chat" name="Disclosure__Remotely_monitoring chat"/>
+ <combo_box.item label="Indiscreción &gt; Información Se Second Life, el chat o los MI" name="Disclosure__Second_Life_information_chat_IMs"/>
+ <combo_box.item label="Perturbando la paz &gt; Abuso de los recursos de la región" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
+ <combo_box.item label="Perturbando la paz &gt; Excesivos objetos con script" name="Disturbing_the_peace__Excessive_scripted_objects"/>
+ <combo_box.item label="Perturbando la paz &gt; Objeto basura" name="Disturbing_the_peace__Object_littering"/>
+ <combo_box.item label="Perturbando la paz &gt; Spam (mensajes no pedidos) repetitivo" name="Disturbing_the_peace__Repetitive_spam"/>
+ <combo_box.item label="Perturbando la paz &gt; Publicidad no deseada" name="Disturbing_the_peace__Unwanted_advert_spam"/>
+ <combo_box.item label="Fraude &gt; L$" name="Fraud__L$"/>
+ <combo_box.item label="Fraude &gt; Terreno" name="Fraud__Land"/>
+ <combo_box.item label="Fraude &gt; Esquemas piramidales o cadenas de cartas" name="Fraud__Pyramid_scheme_or_chain_letter"/>
+ <combo_box.item label="Fraude &gt; US$" name="Fraud__US$"/>
+ <combo_box.item label="Acoso &gt; Anuncios múltiples / Spam visual" name="Harassment__Advert_farms___visual_spam"/>
+ <combo_box.item label="Acoso &gt; Difamación de individuos o grupos" name="Harassment__Defaming_individuals_or_groups"/>
+ <combo_box.item label="Acoso &gt; Impedir el movimiento" name="Harassment__Impeding_movement"/>
+ <combo_box.item label="Acoso &gt; Acoso sexual" name="Harassment__Sexual_harassment"/>
+ <combo_box.item label="Acoso &gt; Incitar a, o pedir, que otros violen las Condiciones del Servicio" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
+ <combo_box.item label="Acoso &gt; Abuso verbal" name="Harassment__Verbal_abuse"/>
+ <combo_box.item label="Indecencia &gt; En general, contenido o conducta ofensivos" name="Indecency__Broadly_offensive_content_or_conduct"/>
+ <combo_box.item label="Indecencia &gt; Nombre inapropiado del avatar" name="Indecency__Inappropriate_avatar_name"/>
+ <combo_box.item label="Indecencia &gt; Contenido o conducta inapropiada en una región &apos;PG&apos;" name="Indecency__Mature_content_in_PG_region"/>
+ <combo_box.item label="Indecencia &gt; Contenido o conducta inapropiada en una región &apos;Mature&apos;" name="Indecency__Inappropriate_content_in_Mature_region"/>
+ <combo_box.item label="Infracción de la propiedad intelectual &gt; Eliminación de contenidos" name="Intellectual_property_infringement_Content_Removal"/>
+ <combo_box.item label="Infracción de la propiedad intelectual &gt; CopyBot o Exploit (programa malicioso) de permisos" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
+ <combo_box.item label="Intolerancia" name="Intolerance"/>
+ <combo_box.item label="Terreno &gt; Abuso de los recursos de un sandbox" name="Land__Abuse_of_sandbox_resources"/>
+ <combo_box.item label="Terreno &gt; Invasión &gt; Objetos/Texturas" name="Land__Encroachment__Objects_textures"/>
+ <combo_box.item label="Terreno &gt; Invasión &gt; Partículas" name="Land__Encroachment__Particles"/>
+ <combo_box.item label="Terreno &gt; Invasión &gt; Ãrboles/Plantas" name="Land__Encroachment__Trees_plants"/>
+ <combo_box.item label="Apuestas/Juego" name="Wagering_gambling"/>
+ <combo_box.item label="Otra" name="Other"/>
</combo_box>
<text name="abuser_name_title">
Nombre del infractor:
</text>
- <button label="Elegir al residente" label_selected="" name="select_abuser" tool_tip="Elegir de una lista el nombre del infractor"/>
- <check_box label="No sé el nombre del infractor" name="omit_abuser_name" tool_tip="Marque esto si no puede aportar el nombre del infractor"/>
+ <button label="Elegir" label_selected="" name="select_abuser" tool_tip="Elegir de una lista el nombre del infractor"/>
<text name="abuser_name_title2">
Localización de la infracción:
</text>
@@ -92,13 +93,11 @@
Detalles:
</text>
<text name="bug_aviso">
- Por favor, sea muy concreto sobre la fecha, la localización,
-la naturaleza de la infracción, el aportar textos relevantes
-del chat o los MI, y, si es posible, seleccione el objeto.
+ Por favor, sé todo lo concreto que puedas
</text>
<text name="incomplete_title">
- Nota: las denuncias incompletas no se investigarán.
+ * Las denuncias incompletas no se investigarán
</text>
- <button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/>
<button label="Denunciar la infracción" label_selected="Denunciar la infracción" name="send_btn"/>
+ <button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/es/floater_script_debug_panel.xml
new file mode 100644
index 0000000000..db9fd5f36e
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_script_debug_panel.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script" short_title="[TODOS LOS SCRIPTS]" title="[TODOS LOS SCRIPTS]"/>
diff --git a/indra/newview/skins/default/xui/es/floater_script_limits.xml b/indra/newview/skins/default/xui/es/floater_script_limits.xml
new file mode 100644
index 0000000000..410f7b5e36
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_script_limits.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="scriptlimits" title="INFORMACIÓN DEL SCRIPT"/>
diff --git a/indra/newview/skins/default/xui/es/floater_script_preview.xml b/indra/newview/skins/default/xui/es/floater_script_preview.xml
index 79984e7bc1..5c190a4682 100644
--- a/indra/newview/skins/default/xui/es/floater_script_preview.xml
+++ b/indra/newview/skins/default/xui/es/floater_script_preview.xml
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview lsl text" title="SCRIPT: SCRIPT DE ROTACIÓN">
+<floater name="preview lsl text" title="SCRIPT: ROTACIÓN DEL SCRIPT">
+ <floater.string name="Title">
+ SCRIPT: [NAME]
+ </floater.string>
<text name="desc txt">
Descripción:
</text>
diff --git a/indra/newview/skins/default/xui/es/floater_script_queue.xml b/indra/newview/skins/default/xui/es/floater_script_queue.xml
index ace596cd9a..39c84103c4 100644
--- a/indra/newview/skins/default/xui/es/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/es/floater_script_queue.xml
@@ -1,4 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="queue" title="REINICIO">
+<floater name="queue" title="PROGRESO DEL REINICIO">
+ <floater.string name="Starting">
+ Empezando [START] de [COUNT] ítems.
+ </floater.string>
+ <floater.string name="Done">
+ Hecho.
+ </floater.string>
+ <floater.string name="Resetting">
+ Reiniciando
+ </floater.string>
+ <floater.string name="Running">
+ Ejecutándose
+ </floater.string>
+ <floater.string name="NotRunning">
+ Sin ejecutarse
+ </floater.string>
<button label="Cerrar" label_selected="Cerrar" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_script_search.xml b/indra/newview/skins/default/xui/es/floater_script_search.xml
index a59f258a18..1ab6682023 100644
--- a/indra/newview/skins/default/xui/es/floater_script_search.xml
+++ b/indra/newview/skins/default/xui/es/floater_script_search.xml
@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script search" title="BUSCAR EN EL SCRIPT" width="320">
- <check_box label="Indiferente mays./mins." name="case_text" left="75"/>
+<floater name="script search" title="BÚSQUEDA DE SCRIPTS" width="320">
+ <check_box label="Indiferente mays./mins." left="75" name="case_text"/>
<button label="Buscar" label_selected="Buscar" name="search_btn" width="85"/>
- <button label="Reemplazar" label_selected="Reemplazar" name="replace_btn" left="100" width="85"/>
- <button label="Reemplazar todos" label_selected="Reemplazar todos" name="replace_all_btn" left="190" width="122"/>
+ <button label="Reemplazar" label_selected="Reemplazar" left="100" name="replace_btn" width="85"/>
+ <button label="Reemplazar todos" label_selected="Reemplazar todos" left="190" name="replace_all_btn" width="122"/>
<text name="txt" width="65">
Buscar
</text>
<text name="txt2" width="65">
Reemplazar
</text>
- <line_editor left="75" name="search_text" width="240" />
- <line_editor left="75" name="replace_text" width="240" />
+ <line_editor left="75" name="search_text" width="240"/>
+ <line_editor left="75" name="replace_text" width="240"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_search.xml b/indra/newview/skins/default/xui/es/floater_search.xml
new file mode 100644
index 0000000000..377b848530
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_search.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_search" title="ENCONTRAR">
+ <floater.string name="loading_text">
+ Cargando...
+ </floater.string>
+ <floater.string name="done_text">
+ Hecho
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="browser_layout">
+ <text name="refresh_search">
+ Redo search to reflect current God level
+ </text>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_select_key.xml b/indra/newview/skins/default/xui/es/floater_select_key.xml
index 9c889df63a..6503a3d5cb 100644
--- a/indra/newview/skins/default/xui/es/floater_select_key.xml
+++ b/indra/newview/skins/default/xui/es/floater_select_key.xml
@@ -2,6 +2,6 @@
<floater name="modal container" title="">
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
<text name="Save item as:">
- Pulse una tecla para seleccionarla
+ Pulsa una tecla para configurarla como tu botón para hablar.
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_sell_land.xml b/indra/newview/skins/default/xui/es/floater_sell_land.xml
index c6e8746250..efedb5d689 100644
--- a/indra/newview/skins/default/xui/es/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/es/floater_sell_land.xml
@@ -1,64 +1,65 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="sell land" title="VENDER EL TERRENO">
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <text name="info_parcel_label">
- Parcela:
- </text>
- <text name="info_parcel">
- NOMBRE DE LA PARCELA
- </text>
- <text name="info_size_label">
- Tamaño:
- </text>
- <text name="info_size">
- [AREA] m²
- </text>
- <text name="info_action">
- Vender esta parcela:
- </text>
- <icon bottom_delta="-56" name="step_price" />
- <text name="price_label">
- Marque un precio:
- </text>
- <text name="price_text">
- Elija un precio adecuado para esta parcela.
- </text>
- <text name="price_ld">
- L$
- </text>
- <text name="price_per_m">
- ([PER_METER] L$ por metro cuadrado)
- </text>
- <text name="sell_to_label">
- Vender este terreno a:
- </text>
- <text name="sell_to_text">
- Elija si venderlo a cualquiera o a un comprador concreto.
- </text>
- <combo_box name="sell_to">
- <combo_box.item name="--selectone--" label="seleccione --" />
- <combo_box.item name="Anyone" label="Cualquiera" />
- <combo_box.item name="Specificuser:" label="Un usuario concreto:" />
- </combo_box>
- <button label="Seleccionar..." name="sell_to_select_agent"/>
- <text name="sell_objects_label">
- ¿Vender los objetos con el terreno?
- </text>
- <text name="sell_objects_text">
- Los objetos transferibles del propietario del terreno cambiarán
-de propietario.
- </text>
- <radio_group name="sell_objects" bottom_delta="-58" >
- <radio_item name="no" label="No, mantener la propiedad de los objetos" />
- <radio_item name="yes" label="Sí, vender los objetos con el terreno" />
- </radio_group>
- <button label="Mostrar los objetos" name="show_objects" width="120"/>
- <text name="nag_message_label">
- RECUERDE: todas las ventas son definitivas.
- </text>
- <button label="Poner el terreno en venta" name="sell_btn"/>
- <button label="Cancelar" name="cancel_btn"/>
- </panel>
- </scroll_container>
+<floater name="sell land" title="VENTA DE TERRENO">
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="info_parcel_label">
+ Parcela:
+ </text>
+ <text name="info_parcel">
+ NOMBRE DE LA PARCELA
+ </text>
+ <text name="info_size_label">
+ Tamaño:
+ </text>
+ <text name="info_size">
+ [AREA] m²
+ </text>
+ <text name="info_action">
+ Vender esta parcela:
+ </text>
+ <text name="price_label">
+ 1. Marcar un precio:
+ </text>
+ <text name="price_text">
+ Elegir un precio adecuado.
+ </text>
+ <text name="price_ld">
+ L$
+ </text>
+ <line_editor name="price">
+ 0
+ </line_editor>
+ <text name="price_per_m">
+ ([PER_METER] L$ por m²)
+ </text>
+ <text name="sell_to_label">
+ 2. Vender el terreno a:
+ </text>
+ <text name="sell_to_text">
+ Elige si venderlo a cualquiera o a un comprador concreto.
+ </text>
+ <combo_box name="sell_to">
+ <combo_box.item label="- Elegir a alguien -" name="--selectone--"/>
+ <combo_box.item label="Cualquiera" name="Anyone"/>
+ <combo_box.item label="Alguien concreto:" name="Specificuser:"/>
+ </combo_box>
+ <button label="Elegir" name="sell_to_select_agent"/>
+ <text name="sell_objects_label">
+ 3. ¿Vender los objetos junto con el terreno?
+ </text>
+ <text name="sell_objects_text">
+ Los objetos transferibles del propietario del terreno que estén en la parcela cambiarán de propietario.
+ </text>
+ <radio_group bottom_delta="-58" name="sell_objects">
+ <radio_item label="No, mantener la propiedad de los objetos" name="no"/>
+ <radio_item label="Sí, vender los objetos con el terreno" name="yes"/>
+ </radio_group>
+ <button label="Mostrar los objetos" name="show_objects" width="120"/>
+ <text name="nag_message_label">
+ RECUERDA: todas las ventas son definitivas.
+ </text>
+ <button label="Poner en venta el terreno" name="sell_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ </panel>
+ </scroll_container>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_settings_debug.xml b/indra/newview/skins/default/xui/es/floater_settings_debug.xml
index 0e8e6bdfd2..bca1839f09 100644
--- a/indra/newview/skins/default/xui/es/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/es/floater_settings_debug.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="settings_debug" title="CONFIGURACIÓN DEL DEPURADOR">
- <combo_box name="boolean_combo">
- <combo_box.item name="TRUE" label="TRUE" />
- <combo_box.item name="FALSE" label="FALSE" />
- </combo_box>
- <color_swatch label="Color" name="color_swatch"/>
+<floater name="settings_debug" title="CONFIGURACIONES DEL DEPURADOR">
+ <radio_group name="boolean_combo">
+ <radio_item label="VERDADERO" name="TRUE" value="verdadero"/>
+ <radio_item label="FALSO" name="FALSE" value=""/>
+ </radio_group>
+ <color_swatch label="Color" name="val_color_swatch"/>
<spinner label="x" name="val_spinner_1"/>
<spinner label="x" name="val_spinner_2"/>
<spinner label="x" name="val_spinner_3"/>
diff --git a/indra/newview/skins/default/xui/es/floater_snapshot.xml b/indra/newview/skins/default/xui/es/floater_snapshot.xml
index afea6c09fe..5106749f1c 100644
--- a/indra/newview/skins/default/xui/es/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/es/floater_snapshot.xml
@@ -1,79 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Snapshot" title="VISTA PREVIA DE LA FOTO">
- <text name="type_label">
- Destino de la foto
- </text>
- <radio_group label="Tipo de la foto" name="snapshot_type_radio">
- <radio_item name="postcard" label="Enviar por correo electrónico" />
- <radio_item name="texture" label="Guardarla en su inventario ([AMOUNT] L$)" />
- <radio_item name="local" label="Guardarla en su disco duro" />
- </radio_group>
- <text name="file_size_label">
- Tamaño del archivo: [SIZE] KB
- </text>
- <button label="Actualizar la foto" name="new_snapshot_btn"/>
- <button label="Enviar" name="send_btn"/>
- <button label="Guardar ([AMOUNT] L$)" name="upload_btn"/>
- <flyout_button label="Guardar" name="save_btn" tool_tip="Guardar la imagen en un archivo">
- <flyout_button_item name="save_item" label="Guardar"/>
- <flyout_button_item name="saveas_item" label="Guardar como..."/>
- </flyout_button>
- <button label="Cancelar" name="discard_btn"/>
- <button label="Más &gt;&gt;" name="more_btn" tool_tip="Opciones avanzadas"/>
- <button label="&lt;&lt; Menos" name="less_btn" tool_tip="Opciones avanzadas"/>
- <text name="type_label2">
- Tamaño
- </text>
- <text name="format_label">
- Formato
- </text>
- <combo_box label="Resolución" name="postcard_size_combo">
- <combo_box.item name="CurrentWindow" label="Ventana actual"/>
- <combo_box.item name="640x480" label="640x480"/>
- <combo_box.item name="800x600" label="800x600"/>
- <combo_box.item name="1024x768" label="1024x768"/>
- <combo_box.item name="Custom" label="Personalizar"/>
- </combo_box>
- <combo_box label="Resolución" name="texture_size_combo">
- <combo_box.item name="CurrentWindow" label="Ventana actual"/>
- <combo_box.item name="Small(128x128)" label="Pequeño (128x128)"/>
- <combo_box.item name="Medium(256x256)" label="Medio (256x256)"/>
- <combo_box.item name="Large(512x512)" label="Grande (512x512)"/>
- <combo_box.item name="Custom" label="Personalizar"/>
- </combo_box>
- <combo_box label="Resolución" name="local_size_combo">
- <combo_box.item name="CurrentWindow" label="Ventana actual"/>
- <combo_box.item name="320x240" label="320x240"/>
- <combo_box.item name="640x480" label="640x480"/>
- <combo_box.item name="800x600" label="800x600"/>
- <combo_box.item name="1024x768" label="1024x768"/>
- <combo_box.item name="1280x1024" label="1280x1024"/>
- <combo_box.item name="1600x1200" label="1600x1200"/>
- <combo_box.item name="Custom" label="Personalizar"/>
- </combo_box>
- <combo_box label="Formato" name="local_format_combo">
- <combo_box.item name="PNG" label="PNG"/>
- <combo_box.item name="JPEG" label="JPEG"/>
- <combo_box.item name="BMP" label="BMP"/>
- </combo_box>
- <spinner label="Ancho" name="snapshot_width" label_width="41" width="101"/>
- <spinner label="Alto" name="snapshot_height" label_width="30" width="90" left="121"/>
- <check_box label="Mantener las proporciones" name="keep_aspect_check"/>
- <slider label="Calidad de la imagen" name="image_quality_slider"/>
- <text name="layer_type_label">
- Captura:
- </text>
- <combo_box label="Capas de la imagen" name="layer_types">
- <combo_box.item name="Colors" label="Colores"/>
- <combo_box.item name="Depth" label="Profundidad"/>
- <combo_box.item name="ObjectMattes" label="Bandas negras"/>
- </combo_box>
- <check_box label="Incluir la interfaz en la foto" name="ui_check"/>
- <check_box bottom_delta="-17" label="Incluir los HUD en la foto" name="hud_check"/>
- <check_box bottom_delta="-17" label="Mantenerla abierta tras guardarla" name="keep_open_check"/>
- <check_box bottom_delta="-17" label="Congelar la toma &#10;(vista previa en pantalla completa)" name="freeze_frame_check"/>
- <check_box bottom_delta="-29" label="Actualizar automáticamente" name="auto_snapshot_check"/>
- <string name="unknown">
+<floater name="Snapshot" title="Foto">
+ <floater.string name="unknown">
desconocido
- </string>
+ </floater.string>
+ <button label="Actualizar la foto" name="new_snapshot_btn"/>
+ <line_editor label="Descripción" name="description"/>
+ <panel name="panel_snapshot_main">
+ <button label="Compartir foto" name="share"/>
+ <button label="Guardar foto" name="save"/>
+ <button label="Configurar como imagen del perfil" name="set_profile_pic"/>
+ </panel>
+ <panel name="panel_snapshot_share">
+ <button label="Compartir en Internet" name="share_to_web"/>
+ <button label="Foto por correo" name="share_to_email"/>
+ <button label="Atrás" name="cancel_share"/>
+ </panel>
+ <panel name="panel_snapshot_save">
+ <button label="Guardar en mi inventario" name="save_to_inventory"/>
+ <button label="Guardar en mi ordenador" name="save_to_computer"/>
+ <button label="Atrás" name="cancel_save"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_stats.xml b/indra/newview/skins/default/xui/es/floater_stats.xml
new file mode 100644
index 0000000000..5f4fabf375
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_stats.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Statistics" title="ESTADÃSTICAS">
+ <scroll_container name="statistics_scroll">
+ <container_view name="statistics_view">
+ <stat_view label="Básico" name="basic">
+ <stat_bar label="FPS" name="fps"/>
+ <stat_bar label="Ancho de banda" name="bandwidth"/>
+ <stat_bar label="Pérdida de paquetes" name="packet_loss"/>
+ <stat_bar label="Ping del Sim" name="ping"/>
+ </stat_view>
+ <stat_view label="Avanzado" name="advanced">
+ <stat_view label="Renderización" name="render">
+ <stat_bar label="KTris generados" name="ktrisframe"/>
+ <stat_bar label="KTris generados" name="ktrissec"/>
+ <stat_bar label="Objetos en total" name="objs"/>
+ <stat_bar label="Objetos nuevos" name="newobjs"/>
+ </stat_view>
+ <stat_view label="Textura" name="texture">
+ <stat_bar label="Número" name="numimagesstat"/>
+ <stat_bar label="Raw: número" name="numrawimagesstat"/>
+ <stat_bar label="GL Mem" name="gltexmemstat"/>
+ <stat_bar label="Formatted Mem" name="formattedmemstat"/>
+ <stat_bar label="Raw Mem" name="rawmemstat"/>
+ <stat_bar label="Bound Mem" name="glboundmemstat"/>
+ </stat_view>
+ <stat_view label="Red" name="network">
+ <stat_bar label="Paquetes salientes" name="packetsinstat"/>
+ <stat_bar label="Paquetes entrantes" name="packetsoutstat"/>
+ <stat_bar label="Objetos" name="objectkbitstat"/>
+ <stat_bar label="Textura" name="texturekbitstat"/>
+ <stat_bar label="Asset" name="assetkbitstat"/>
+ <stat_bar label="Capas" name="layerskbitstat"/>
+ <stat_bar label="Entrando ahora" name="actualinkbitstat"/>
+ <stat_bar label="Saliendo ahora" name="actualoutkbitstat"/>
+ <stat_bar label="Operaciones VFS pendientes" name="vfspendingoperations"/>
+ </stat_view>
+ </stat_view>
+ <stat_view label="Simulador" name="sim">
+ <stat_bar label="Tiempo de dilación" name="simtimedilation"/>
+ <stat_bar label="FPS en el Sim" name="simfps"/>
+ <stat_bar label="Physics FPS" name="simphysicsfps"/>
+ <stat_view label="Physics Details" name="physicsdetail">
+ <stat_bar label="Pin de objetos" name="physicspinnedtasks"/>
+ <stat_bar label="Objetos con bajo nivel de detalle" name="physicslodtasks"/>
+ <stat_bar label="Memoria asignada" name="physicsmemoryallocated"/>
+ <stat_bar label="Agentes: actual./seg." name="simagentups"/>
+ <stat_bar label="Agentes del grid principal" name="simmainagents"/>
+ <stat_bar label="Agentes secundarios" name="simchildagents"/>
+ <stat_bar label="Objetos" name="simobjects"/>
+ <stat_bar label="Objetos activos" name="simactiveobjects"/>
+ <stat_bar label="Scripts activos" name="simactivescripts"/>
+ <stat_bar label="Eventos de scripts" name="simscripteps"/>
+ <stat_bar label="Paquetes salientes" name="siminpps"/>
+ <stat_bar label="Paquetes entrantes" name="simoutpps"/>
+ <stat_bar label="Descargas pendientes" name="simpendingdownloads"/>
+ <stat_bar label="Subidas pendientes" name="simpendinguploads"/>
+ <stat_bar label="Total de bytes no reconocidos" name="simtotalunackedbytes"/>
+ </stat_view>
+ <stat_view label="Tiempo (ms)" name="simperf">
+ <stat_bar label="Tiempo total de los frames" name="simframemsec"/>
+ <stat_bar label="Tiempo de red" name="simnetmsec"/>
+ <stat_bar label="Physics Time" name="simsimphysicsmsec"/>
+ <stat_bar label="Tiempo de la simulación" name="simsimothermsec"/>
+ <stat_bar label="Tiempo de los agentes" name="simagentmsec"/>
+ <stat_bar label="Tiempo de las imágenes" name="simimagesmsec"/>
+ <stat_bar label="Tiempo de los scripts" name="simscriptmsec"/>
+ </stat_view>
+ </stat_view>
+ </container_view>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_sys_well.xml b/indra/newview/skins/default/xui/es/floater_sys_well.xml
new file mode 100644
index 0000000000..8c8190be55
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_sys_well.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="sys_well_window" title="NOTIFICACIONES">
+ <string name="title_im_well_window">
+ CONVERSACIONES
+ </string>
+ <string name="title_notification_well_window">
+ NOTIFICACIONES
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_telehub.xml b/indra/newview/skins/default/xui/es/floater_telehub.xml
index b2dddfb7f7..87cc9c1659 100644
--- a/indra/newview/skins/default/xui/es/floater_telehub.xml
+++ b/indra/newview/skins/default/xui/es/floater_telehub.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="telehub" title="PUNTO DE TELEPORTE" min_height="310" height="310">
+<floater height="310" min_height="310" name="telehub" title="PUNTO DE TELEPORTE">
<text name="status_text_connected">
Punto de Teleporte conectado al objeto [OBJECT]
</text>
@@ -9,7 +9,7 @@
<text name="help_text_connected">
Para quitar, pulse Desconectar.
</text>
- <text name="help_text_not_connected" height="38" bottom_delta="-18">
+ <text bottom_delta="-18" height="38" name="help_text_not_connected">
Seleccione el objeto y pulse Conectar el Punto
de Teleporte.
</text>
@@ -21,12 +21,9 @@ de Teleporte.
<button label="Añadir sucursales" name="add_spawn_point_btn"/>
<button label="Quitar sucursales" name="remove_spawn_point_btn"/>
<text name="spawn_point_help">
- Seleccione el objeto y pulse Añadir para
-especificar la posición.
-Hecho eso, puede mover o borrar el objeto.
-Las posiciones son relativas al centro del
-Punto de Teleporte.
-Seleccione un ítem de la lista para mostrar su
-posición en el mundo.
+ Selecciona el objeto y pulsa &quot;Añadir sucursal&quot; para especificar una posición.
+Luego, puedes mover o borrar el objeto.
+Las posiciones son relativas al centro del Punto de Teleporte.
+Elige un ítem de la lista para realzarlo en el mundo.
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml
index 09d6e7e4aa..ed2787ea60 100644
--- a/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/es/floater_texture_ctrl.xml
@@ -1,23 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="texture picker" title="ELEGIR: TEXTURA">
+<floater name="texture picker" title="DESTACADO: TEXTURA">
<string name="choose_picture">
Pulse para elegir una imagen
</string>
<text name="Multiple">
- Múltiple
+ Texturas múltiples
</text>
<text name="unknown">
- Dimensiones: [DIMENSIONS]
+ Tamaño: [DIMENSIONS]
</text>
<button label="Por defecto" label_selected="Por defecto" name="Default" width="84"/>
- <button label="Ninguna" label_selected="Ninguna" name="None" left="90"/>
+ <button label="Ninguna" label_selected="Ninguna" left="90" name="None"/>
<button label="Blanca" label_selected="Blanca" name="Blank"/>
<check_box label="Ver las carpetas" name="show_folders_check"/>
- <search_editor label="Escriba aquí para buscar una" name="inventory search editor"/>
- <check_box label="Aplicar ahora mismo" name="apply_immediate_check"/>
+ <search_editor label="Filtrar las texturas" name="inventory search editor"/>
+ <check_box label="Aplicarlo ahora" name="apply_immediate_check"/>
<button label="" label_selected="" name="Pipette"/>
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
- <button label="Elegir" label_selected="Elegir" name="Select"/>
+ <button label="OK" label_selected="OK" name="Select"/>
<string name="pick title">
Elegir:
</string>
diff --git a/indra/newview/skins/default/xui/es/floater_tools.xml b/indra/newview/skins/default/xui/es/floater_tools.xml
index 24db352ac4..9637544f4e 100644
--- a/indra/newview/skins/default/xui/es/floater_tools.xml
+++ b/indra/newview/skins/default/xui/es/floater_tools.xml
@@ -1,45 +1,84 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="toolbox floater" title="" short_title="CONSTRUIR" width="288">
+<floater name="toolbox floater" short_title="HERRAMIENTAS DE CONSTRUCCIÓN" title="" width="288">
+ <floater.string name="status_rotate">
+ Arrastra las bandas de color para girar el objeto.
+ </floater.string>
+ <floater.string name="status_scale">
+ Pulsa y arrastra para estirar el lado seleccionado.
+ </floater.string>
+ <floater.string name="status_move">
+ Arrastrar para mover, Mayús.+arrastrar para copiar.
+ </floater.string>
+ <floater.string name="status_modifyland">
+ Mantén pulsado para modificar el terreno.
+ </floater.string>
+ <floater.string name="status_camera">
+ Pulsa y arrastra para mover la cámara.
+ </floater.string>
+ <floater.string name="status_grab">
+ Arrastrar para mover: Ctrl, verticalmente; Ctrl-Mayús., girando.
+ </floater.string>
+ <floater.string name="status_place">
+ Pulsa en el mundo para construir.
+ </floater.string>
+ <floater.string name="status_selectland">
+ Pulsa y arrastra para seleccionar el terreno.
+ </floater.string>
+ <floater.string name="grid_screen_text">
+ Pantalla
+ </floater.string>
+ <floater.string name="grid_local_text">
+ Local
+ </floater.string>
+ <floater.string name="grid_world_text">
+ Mundo
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ Referencia
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ Añadido
+ </floater.string>
<button label="" label_selected="" name="button focus" tool_tip="Visión"/>
<button label="" label_selected="" name="button move" tool_tip="Mover"/>
<button label="" label_selected="" name="button edit" tool_tip="Editar"/>
<button label="" label_selected="" name="button create" tool_tip="Crear"/>
<button label="" label_selected="" name="button land" tool_tip="Terreno"/>
+ <text name="text status" width="280">
+ Arrastrar para mover, Mayús.+arrastrar para copiar.
+ </text>
<radio_group name="focus_radio_group">
<radio_item label="Zoom" name="radio zoom"/>
<radio_item label="Órbita (Ctrl)" name="radio orbit"/>
- <radio_item label="Panorámica (Ctrl-Shift)" name="radio pan"/>
+ <radio_item label="Panorámica (Ctrl+Shift)" name="radio pan"/>
</radio_group>
<radio_group name="move_radio_group">
<radio_item label="Mover" name="radio move"/>
<radio_item label="Vertical (Ctrl)" name="radio lift"/>
- <radio_item label="Horizontal (Ctrl-Shift)" name="radio spin"/>
+ <radio_item label="Horizontal (Ctrl+Shift)" name="radio spin"/>
</radio_group>
<radio_group name="edit_radio_group">
- <radio_item label="Posición" name="radio position"/>
+ <radio_item label="Moverse" name="radio position"/>
<radio_item label="Girar (Ctrl)" name="radio rotate"/>
- <radio_item label="Estirar (Ctrl-Shift)" name="radio stretch"/>
+ <radio_item label="Estirar (Ctrl+Shift)" name="radio stretch"/>
<radio_item label="Elegir la cara" name="radio select face"/>
</radio_group>
<check_box label="Editar las partes enlazadas" name="checkbox edit linked parts"/>
- <text name="text ruler mode">
- Ajuste:
+ <text name="RenderingCost" tool_tip="Muestra cuánto se calcula que cuesta renderizar este objeto">
+ þ: [COUNT]
</text>
- <combo_box name="combobox grid mode" width="82">
- <combo_box.item name="World" label="Mundo"
- />
- <combo_box.item name="Local" label="Local"
- />
- <combo_box.item name="Reference" label="Referencia"
- />
- </combo_box>
- <check_box label="Estirar ambos lados" name="checkbox uniform"/>
- <check_box label="Estirar las texturas" name="checkbox stretch textures"/>
- <check_box label="Usar la cuadrícula" name="checkbox snap to grid"/>
- <button label="Opciones..." label_selected="Opciones..." name="Options..."/>
- <text name="text status" width="280">
- Arrastrar para mover, Mayús.+arrastrar para copiar
+ <check_box label="" name="checkbox uniform"/>
+ <text label="Estirar ambos lados" name="checkbox uniform label">
+ Estirar ambos lados
</text>
+ <check_box initial_value="true" label="Estirar las texturas" name="checkbox stretch textures"/>
+ <check_box initial_value="true" label="Usar la cuadrícula" name="checkbox snap to grid"/>
+ <combo_box name="combobox grid mode" tool_tip="Elige qué cuadricula usar para posicionar el objeto" width="82">
+ <combo_box.item label="Mundo" name="World"/>
+ <combo_box.item label="Local" name="Local"/>
+ <combo_box.item label="Referencia" name="Reference"/>
+ </combo_box>
+ <button label="Opciones..." label_selected="Opciones..." name="Options..." tool_tip="Ver más opciones de la cuadrícula"/>
<button label="" label_selected="" name="ToolCube" tool_tip="Cubo"/>
<button label="" label_selected="" name="ToolPrism" tool_tip="Prisma"/>
<button label="" label_selected="" name="ToolPyramid" tool_tip="Pirámide"/>
@@ -55,12 +94,12 @@
<button label="" label_selected="" name="ToolRing" tool_tip="Cono truncado"/>
<button label="" label_selected="" name="ToolTree" tool_tip="Ãrbol"/>
<button label="" label_selected="" name="ToolGrass" tool_tip="Hierba"/>
- <check_box label="Mantener seleccionado" name="checkbox sticky"/>
- <check_box label="Copia seleccionada" name="checkbox copy selection"/>
- <check_box label="Centrada" name="checkbox copy centers"/>
- <check_box label="Girada" name="checkbox copy rotates"/>
+ <check_box label="Mantener la herramienta elegida" name="checkbox sticky"/>
+ <check_box label="Copiar la selección" name="checkbox copy selection"/>
+ <check_box initial_value="true" label="Copia centrada" name="checkbox copy centers"/>
+ <check_box label="Copia girada" name="checkbox copy rotates"/>
<radio_group name="land_radio_group">
- <radio_item label="Seleccionar el terreno" name="radio select land"/>
+ <radio_item label="Seleccionar terreno" name="radio select land"/>
<radio_item label="Nivelar" name="radio flatten"/>
<radio_item label="Elevar" name="radio raise"/>
<radio_item label="Bajar" name="radio lower"/>
@@ -68,7 +107,6 @@
<radio_item label="Escarpar" name="radio noise"/>
<radio_item label="Restablecer" name="radio revert"/>
</radio_group>
- <button label="Aplicar" label_selected="Aplicar" name="button apply to selection" tool_tip="Modificar el terreno seleccionado" left="146"/>
<text name="Bulldozer:">
Bulldozer:
</text>
@@ -78,14 +116,51 @@
<text name="Strength:">
Fuerza
</text>
- <text name="obj_count" left="134">
- Objetos seleccionados: [COUNT]
+ <button label="Aplicar" label_selected="Aplicar" left="146" name="button apply to selection" tool_tip="Modificar el terreno seleccionado"/>
+ <text left="134" name="obj_count">
+ Objetos: [COUNT]
</text>
- <text name="prim_count" left="134">
- primitivas: [COUNT]
+ <text left="134" name="prim_count">
+ Primitivas: [COUNT]
</text>
<tab_container name="Object Info Tabs" tab_max_width="62" tab_min_width="30" width="288">
<panel label="General" name="General">
+ <panel.string name="text deed continued">
+ Transferir
+ </panel.string>
+ <panel.string name="text deed">
+ Transferir
+ </panel.string>
+ <panel.string name="text modify info 1">
+ Puedes modificar este objeto
+ </panel.string>
+ <panel.string name="text modify info 2">
+ Puedes modificar estos objetos
+ </panel.string>
+ <panel.string name="text modify info 3">
+ No puedes modificar este objeto
+ </panel.string>
+ <panel.string name="text modify info 4">
+ No puedes modificar estos objetos
+ </panel.string>
+ <panel.string name="text modify warning">
+ Para configurar los permisos, debes seleccionar el objeto completo
+ </panel.string>
+ <panel.string name="Cost Default">
+ Precio: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ Precio total: L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Price Per: L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Precio variable
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Venta variable
+ </panel.string>
<text name="Name:">
Nombre:
</text>
@@ -98,135 +173,77 @@
<text name="Creator Name">
Thrax Linden
</text>
- <button label="Perfil..." label_selected="Perfil..." name="button creator profile"/>
<text name="Owner:">
Propietario:
</text>
<text name="Owner Name">
Thrax Linden
</text>
- <button label="Perfil..." label_selected="Perfil..." name="button owner profile"/>
<text name="Group:">
Grupo:
</text>
- <text name="Group Name Proxy">
- Los Linden
- </text>
- <button label="Configurar..." label_selected="Configurar..." name="button set group"/>
- <text name="Permissions:">
- Permisos:
- </text>
-
- <check_box label="Compartir con el grupo" name="checkbox share with group" tool_tip="Permitir que todos los miembros del grupo compartan y utilicen sus permisos sobre este objeto. Debe transferirlo para activar las restricciones según los roles."/>
- <string name="text deed continued">
- Transferir...
- </string>
- <string name="text deed">
- Transferir
- </string>
- <button label="Transferir..." label_selected="Transferir..." name="button deed" tool_tip="Los objetos compartidos por el grupo pueden ser transferidos por un oficial del grupo."/>
- <check_box label="Permitir a cualquiera que lo mueva" name="checkbox allow everyone move"/>
- <check_box label="Permitir a cualquiera que lo copie" name="checkbox allow everyone copy"/>
- <check_box label="Mostrar en la búsqueda" name="search_check" tool_tip="Dejar que la gente vea este objeto en los resultados de la búsqueda"/>
- <check_box label="En venta" name="checkbox for sale"/>
- <text name="Cost">
- Precio: L$
+ <button label="Configurar..." label_selected="Configurar..." name="button set group" tool_tip="Elige un grupo con el que compartir los permisos de este objeto"/>
+ <name_box initial_value="Cargando..." name="Group Name Proxy"/>
+ <button label="Transferir" label_selected="Transferir" name="button deed" tool_tip="La transferencia entrega este objeto con los permisos del próximo propietario. Los objetos compartidos por el grupo pueden ser transferidos por un oficial del grupo."/>
+ <check_box label="Compartir" name="checkbox share with group" tool_tip="Permite que todos los miembros del grupo compartan tus permisos de modificación en este objeto. Debes transferirlo para activar las restricciones según los roles."/>
+ <text name="label click action" width="180">
+ Al tocarlo:
</text>
+ <combo_box name="clickaction" width="192">
+ <combo_box.item label="Tocarlo (por defecto)" name="Touch/grab(default)"/>
+ <combo_box.item label="Sentarse en el objeto" name="Sitonobject"/>
+ <combo_box.item label="Comprar el objeto" name="Buyobject"/>
+ <combo_box.item label="Pagar al objeto" name="Payobject"/>
+ <combo_box.item label="Abrirlo" name="Open"/>
+ <combo_box.item label="Zoom" name="Zoom"/>
+ </combo_box>
+ <check_box label="En venta:" name="checkbox for sale"/>
<combo_box name="sale type">
<combo_box.item label="Copia" name="Copy"/>
<combo_box.item label="Contenidos" name="Contents"/>
<combo_box.item label="Original" name="Original"/>
</combo_box>
-
- <text name="label click action" width="180">
- Al pulsarlo con el botón izquierdo:
- </text>
- <combo_box name="clickaction" width="192">
- <combo_box.item name="Touch/grab(default)" label="Tocar/Agarrar (por defecto)"
- />
- <combo_box.item name="Sitonobject" label="Sentarse en el objeto"
- />
- <combo_box.item name="Buyobject" label="Comprar el objeto"
- />
- <combo_box.item name="Payobject" label="Pagar al objeto"
- />
- <combo_box.item name="Open" label="Abrirlo"
- />
- <combo_box.item name="Play" label="Ejecutar los media de la parcela"
- />
- <combo_box.item name="Opemmedia" label="Abrir los media de la parcela"
- />
- </combo_box>
- <panel name="perms_build">
- <text name="perm_modify">
- Puede modificar este objeto
- </text>
- <text name="B:">
- B:
- </text>
- <text name="O:">
- O:
- </text>
- <text name="G:">
- G:
- </text>
- <text name="E:">
- E:
- </text>
- <text name="N:">
- N:
- </text>
- <text name="F:">
- F:
- </text>
- <text name="Next owner can:">
- El próximo propietario puede:
- </text>
- <check_box label="Modificarlo" name="checkbox next owner can modify"/>
- <check_box label="Copiarlo" name="checkbox next owner can copy" left_delta="80"/>
- <check_box name="checkbox next owner can transfer" left_delta="67"/>
- </panel>
- <string name="text modify info 1">
- Puede modificar este objeto
- </string>
- <string name="text modify info 2">
- Puede modificar estos objetos
- </string>
- <string name="text modify info 3">
- No puede modificar este objeto
- </string>
- <string name="text modify info 4">
- No puede modificar estos objetos
- </string>
- <string name="text modify warning">
- Debe seleccionar todo el objeto para definir los permisos
- </string>
- <string name="Cost Default">
- Precio: L$
- </string>
- <string name="Cost Total">
- Precio total: L$
- </string>
- <string name="Cost Per Unit">
- Precio por: L$
- </string>
- <string name="Cost Mixed">
- Precio variable
- </string>
- <string name="Sale Mixed">
- Venta variable
- </string>
+ <spinner label="Precio: L$" name="Edit Cost"/>
+ <check_box label="Mostrar en la búsqueda" name="search_check" tool_tip="Dejar que la gente vea este objeto en los resultados de la búsqueda"/>
+ <panel name="perms_build">
+ <text name="perm_modify">
+ Puedes modificar este objeto
+ </text>
+ <text name="Anyone can:">
+ Cualquiera:
+ </text>
+ <check_box label="Moverlo" name="checkbox allow everyone move"/>
+ <check_box label="Copiarlo" name="checkbox allow everyone copy"/>
+ <text name="Next owner can:">
+ Próximo propietario:
+ </text>
+ <check_box label="Modificarlo" name="checkbox next owner can modify"/>
+ <check_box label="Copiarlo" left_delta="80" name="checkbox next owner can copy"/>
+ <check_box label="Transferirlo" left_delta="67" name="checkbox next owner can transfer" tool_tip="El próximo propietario puede dar o revender este objeto"/>
+ <text name="B:">
+ B:
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ E:
+ </text>
+ <text name="N:">
+ N:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
</panel>
<panel label="Objeto" name="Object">
- <text name="select_single">
- Seleccione un sólo prim para editarlo.
- </text>
- <text name="edit_object">
- Modificar los parámetros del objeto:
- </text>
<check_box label="Bloqueado" name="checkbox locked" tool_tip="Previene que el objeto sea movido o borrado. Suele ser útil mientras se construye, para prevenir que se modifique sin querer."/>
<check_box label="Material" name="Physical Checkbox Ctrl" tool_tip="Permite que el objeto pueda ser empujado y le afecte la gravedad."/>
- <check_box label="Temporal" name="Temporary Checkbox Ctrl" tool_tip="Hace que el objeto se borre 1 minuto después de su creación."/>
+ <check_box label="Temporal" name="Temporary Checkbox Ctrl" tool_tip="Provoca que el objeto desaparezca 1 minuto después de ser creado"/>
<check_box label="Inmaterial" name="Phantom Checkbox Ctrl" tool_tip="Hace que el objeto no colisiones con otros objetos o avatares."/>
<text name="label position">
Posición (metros)
@@ -246,48 +263,27 @@
<spinner label="X" name="Rot X"/>
<spinner label="Y" name="Rot Y"/>
<spinner label="Z" name="Rot Z"/>
- <text name="label material">
- Material
- </text>
- <combo_box name="material">
- <combo_box.item name="Stone" label="Piedra"
- />
- <combo_box.item name="Metal" label="Metal"
- />
- <combo_box.item name="Glass" label="Vidrio"
- />
- <combo_box.item name="Wood" label="Madera"
- />
- <combo_box.item name="Flesh" label="Carne"
- />
- <combo_box.item name="Plastic" label="Plástico"
- />
- <combo_box.item name="Rubber" label="Goma"
- />
- </combo_box>
- <text name="label basetype">
- Tipo de objeto a construir
- </text>
<combo_box name="comboBaseType">
- <combo_box.item name="Box" label="Caja"
- />
- <combo_box.item name="Cylinder" label="Cilindro"
- />
- <combo_box.item name="Prism" label="Prisma"
- />
- <combo_box.item name="Sphere" label="Esfera"
- />
- <combo_box.item name="Torus" label="Toroide"
- />
- <combo_box.item name="Tube" label="Tubo"
- />
- <combo_box.item name="Ring" label="Cono truncado"
- />
- <combo_box.item name="Sculpted" label="Sculpted"
- />
+ <combo_box.item label="Caja" name="Box"/>
+ <combo_box.item label="Cilindro" name="Cylinder"/>
+ <combo_box.item label="Prisma" name="Prism"/>
+ <combo_box.item label="Esfera" name="Sphere"/>
+ <combo_box.item label="Toroide" name="Torus"/>
+ <combo_box.item label="Tubo" name="Tube"/>
+ <combo_box.item label="Cono truncado" name="Ring"/>
+ <combo_box.item label="Sculpted" name="Sculpted"/>
+ </combo_box>
+ <combo_box name="material">
+ <combo_box.item label="Piedra" name="Stone"/>
+ <combo_box.item label="Metal" name="Metal"/>
+ <combo_box.item label="Vidrio" name="Glass"/>
+ <combo_box.item label="Madera" name="Wood"/>
+ <combo_box.item label="Carne" name="Flesh"/>
+ <combo_box.item label="Plástico" name="Plastic"/>
+ <combo_box.item label="Goma" name="Rubber"/>
</combo_box>
<text name="text cut">
- Corte: Inicio y Fin
+ Corte (inicio/fin)
</text>
<spinner label="I" name="cut begin"/>
<spinner label="F" name="cut end"/>
@@ -301,17 +297,13 @@
Forma del hueco
</text>
<combo_box name="hole">
- <combo_box.item name="Default" label="Por defecto"
- />
- <combo_box.item name="Circle" label="Círculo"
- />
- <combo_box.item name="Square" label="Cuadrado"
- />
- <combo_box.item name="Triangle" label="Triángulo"
- />
+ <combo_box.item label="Por defecto" name="Default"/>
+ <combo_box.item label="Círculo" name="Circle"/>
+ <combo_box.item label="Cuadrado" name="Square"/>
+ <combo_box.item label="Triángulo" name="Triangle"/>
</combo_box>
<text name="text twist">
- Torsión: Inicio y Fin
+ Torsión (inicio/fin)
</text>
<spinner label="I" name="Twist Begin"/>
<spinner label="F" name="Twist End"/>
@@ -329,13 +321,13 @@
<spinner label="X" name="Shear X"/>
<spinner label="Y" name="Shear Y"/>
<text name="advanced_cut">
- Corte del perfil: Inicio y Fin
+ Corte del perfil (inicio/fin)
</text>
<text name="advanced_dimple">
- Horadar: Inicio y Fin
+ Horadar (inicio/fin)
</text>
<text name="advanced_slice">
- Cortar: Inicio y Fin
+ Cortar (inicio/fin)
</text>
<spinner label="I" name="Path Limit Begin"/>
<spinner label="F" name="Path Limit End"/>
@@ -351,32 +343,27 @@
Giros
</text>
<texture_picker label="Textura para sculpted" name="sculpt texture control" tool_tip="Pulse para elegir una imagen"/>
- <check_box label="Espejo" name="sculpt mirror control" tool_tip="Girar el prim sculpted siguiendo el eje X."/>
- <check_box label="Dentro-Fuera" name="sculpt invert control" tool_tip="Invertir los valores de los prims sculpted, haciendo aparecer fuera lo de dentro."/>
+ <check_box label="Espejo" name="sculpt mirror control" tool_tip="Girar el prim sculpted siguiendo el eje X"/>
+ <check_box label="Dentro-Fuera" name="sculpt invert control" tool_tip="Invertir los valores de los prims sculpted, haciendo aparecer fuera lo de dentro"/>
<text name="label sculpt type">
Tipo de unión
</text>
<combo_box name="sculpt type control">
- <combo_box.item name="None" label="(ninguna)"
- />
- <combo_box.item name="Sphere" label="Esfera"
- />
- <combo_box.item name="Torus" label="Toroide"
- />
- <combo_box.item name="Plane" label="Plano"
- />
- <combo_box.item name="Cylinder" label="Cilindro"
- />
+ <combo_box.item label="(ninguna)" name="None"/>
+ <combo_box.item label="Esfera" name="Sphere"/>
+ <combo_box.item label="Toroide" name="Torus"/>
+ <combo_box.item label="Plano" name="Plane"/>
+ <combo_box.item label="Cilindro" name="Cylinder"/>
</combo_box>
</panel>
<panel label="Caracter." name="Features">
<text name="select_single">
- Seleccione un sólo prim para editarlo.
+ Selecciona un sólo prim para editarlo.
</text>
<text name="edit_object">
Editar las características del objeto:
</text>
- <check_box label="Flexibilidad" name="Flexible1D Checkbox Ctrl" tool_tip="Permite que el objeto flexione en el eje Z. (Sólo del lado del cliente)"/>
+ <check_box label="Flexibilidad" name="Flexible1D Checkbox Ctrl" tool_tip="Permite que el objeto flexione en el eje Z (sólo del lado del cliente)"/>
<spinner label="Blandura" name="FlexNumSections"/>
<spinner label="Gravedad" name="FlexGravity"/>
<spinner label="Fricción" name="FlexFriction"/>
@@ -386,86 +373,69 @@
<spinner label="Fuerza en Y" name="FlexForceY"/>
<spinner label="Fuerza en Z" name="FlexForceZ"/>
<check_box label="Luz" name="Light Checkbox Ctrl" tool_tip="Hace que el objeto emita luz"/>
- <text name="label color">
- Color
- </text>
- <color_swatch label="" name="colorswatch" tool_tip="Pulse para abrir el selector de color"/>
+ <color_swatch label="" name="colorswatch" tool_tip="Pulsa para abrir el selector de color"/>
+ <texture_picker label="" name="light texture control" tool_tip="Pulsa para elegir una proyección de imagen (sólo tiene efecto con renderización deferida activada)"/>
<spinner label="Intensidad" name="Light Intensity"/>
+ <spinner label="FOV" name="Light FOV"/>
<spinner label="Radio" name="Light Radius"/>
+ <spinner label="Visión" name="Light Focus"/>
<spinner label="Atenuación" name="Light Falloff"/>
+ <spinner label="Ambiental" name="Light Ambiance"/>
</panel>
<panel label="Textura" name="Texture">
+ <panel.string name="string repeats per meter">
+ Repeticiones por m.
+ </panel.string>
+ <panel.string name="string repeats per face">
+ Repeticiones por cara
+ </panel.string>
<texture_picker label="Textura" name="texture control" tool_tip="Pulse para elegir una imagen"/>
- <color_swatch label="Color" name="colorswatch" tool_tip="Pulse para abrir el selector de color"/>
+ <color_swatch label="Color" name="colorswatch" tool_tip="Pulsa para abrir el selector de color"/>
<text name="color trans">
Transparencia %
</text>
<text name="glow label">
Resplandor
</text>
- <check_box label="Brillo al &#10;máximo" name="checkbox fullbright" bottom_delta="-21"/>
+ <check_box bottom_delta="-21" label="Brillo al máximo" name="checkbox fullbright"/>
<text name="tex gen">
Detallado
</text>
- <combo_box name="combobox texgen" width="86">
- <combo_box.item name="Default" label="Por defecto"
- />
- <combo_box.item name="Planar" label="Plano"
- />
+ <combo_box name="combobox texgen">
+ <combo_box.item label="Por defecto" name="Default"/>
+ <combo_box.item label="Plano" name="Planar"/>
</combo_box>
<text name="label shininess">
Brillantez
</text>
<combo_box name="combobox shininess">
- <combo_box.item name="None" label="Ninguna"
- />
- <combo_box.item name="Low" label="Baja"
- />
- <combo_box.item name="Medium" label="Media"
- />
- <combo_box.item name="High" label="Alta"
- />
+ <combo_box.item label="Ninguna" name="None"/>
+ <combo_box.item label="Baja" name="Low"/>
+ <combo_box.item label="Media" name="Medium"/>
+ <combo_box.item label="Alta" name="High"/>
</combo_box>
<text name="label bumpiness">
Relieve
</text>
<combo_box name="combobox bumpiness">
- <combo_box.item name="None" label="Ninguno"
- />
- <combo_box.item name="Brightness" label="Brillo"
- />
- <combo_box.item name="Darkness" label="Oscuro"
- />
- <combo_box.item name="woodgrain" label="grano de madera"
- />
- <combo_box.item name="bark" label="corteza"
- />
- <combo_box.item name="bricks" label="ladrillos"
- />
- <combo_box.item name="checker" label="cajero"
- />
- <combo_box.item name="concrete" label="cemento"
- />
- <combo_box.item name="crustytile" label="azulejería"
- />
- <combo_box.item name="cutstone" label="piedra cortada"
- />
- <combo_box.item name="discs" label="discos"
- />
- <combo_box.item name="gravel" label="grava"
- />
- <combo_box.item name="petridish" label="placa de Petri"
- />
- <combo_box.item name="siding" label="revestimiento"
- />
- <combo_box.item name="stonetile" label="baldosa de piedra"
- />
- <combo_box.item name="stucco" label="estuco"
- />
- <combo_box.item name="suction" label="succión"
- />
- <combo_box.item name="weave" label="tejido"
- />
+ <combo_box.item label="Ninguno" name="None"/>
+ <combo_box.item label="Brillo" name="Brightness"/>
+ <combo_box.item label="Oscuro" name="Darkness"/>
+ <combo_box.item label="grano de madera" name="woodgrain"/>
+ <combo_box.item label="corteza" name="bark"/>
+ <combo_box.item label="ladrillos" name="bricks"/>
+ <combo_box.item label="cajero" name="checker"/>
+ <combo_box.item label="cemento" name="concrete"/>
+ <combo_box.item label="azulejería" name="crustytile"/>
+ <combo_box.item label="piedra cortada" name="cutstone"/>
+ <combo_box.item label="discos" name="discs"/>
+ <combo_box.item label="grava" name="gravel"/>
+ <combo_box.item label="placa de Petri" name="petridish"/>
+ <combo_box.item label="revestimiento" name="siding"/>
+ <combo_box.item label="baldosa de piedra" name="stonetile"/>
+ <combo_box.item label="estuco" name="stucco"/>
+ <combo_box.item label="succión" name="suction"/>
+ <combo_box.item label="tejido" name="weave"/>
</combo_box>
<text name="tex scale">
Repeticiones por cara
@@ -474,31 +444,23 @@
<check_box label="Voltear" name="checkbox flip s"/>
<spinner label="Vertical (V)" name="TexScaleV"/>
<check_box label="Voltear" name="checkbox flip t"/>
- <text name="tex rotate">
- Rotación (grados)
- </text>
- <string name="string repeats per meter">
- Repeticiones por m.
- </string>
- <string name="string repeats per face">
- Repeticiones por cara
- </string>
- <text name="rpt">
- Repeticiones por m.
- </text>
- <spinner left="118" name="TexRot" width="62" />
- <spinner left="118" name="rptctrl" width="62" />
- <button label="Aplicar" label_selected="Aplicar" name="button apply" left_delta="72"/>
+ <spinner label="Rotación" name="TexRot"/>
+ <spinner label="Repeticiones / Metro" name="rptctrl"/>
+ <button label="Aplicar" label_selected="Aplicar" name="button apply"/>
<text name="tex offset">
Desplazar
</text>
<spinner label="Horizontal (U)" name="TexOffsetU"/>
<spinner label="Vertical (V)" name="TexOffsetV"/>
- <text name="textbox autofix" width="180">
- Centrar la textura para los media
-(primero debe subirla)
- </text>
- <button label="Alinear" label_selected="Alinear" name="button align" left="180"/>
+ <panel name="Add_Media">
+ <text name="media_tex">
+ Media
+ </text>
+ <button name="add_media" tool_tip="Añadir un media"/>
+ <button name="delete_media" tool_tip="Borrar esta textura para media"/>
+ <button name="edit_media" tool_tip="Editar este media"/>
+ <button label="Centrar" label_selected="Centrar los media" name="button align" tool_tip="Centrar esta textura para media (primero debe cargarse)"/>
+ </panel>
</panel>
<panel label="Contenido " name="Contents">
<button label="Script nuevo" label_selected="Script nuevo" name="button new script"/>
@@ -513,59 +475,19 @@
Precio: [PRICE] L$ por [AREA] m²
</text>
<text name="label_area">
- Superficie: [AREA] m²
+ Ãrea: [AREA] m²
</text>
- <button label="Acerca del terreno..." label_selected="Acerca del terreno..." name="button about land" width="140"/>
- <check_box label="Mostrar los propietarios" name="checkbox show owners" tool_tip="El color de las parcelas es según su propietario: &#10;&#10;Verde = Su terreno &#10;Agua = Terreno de sus grupos &#10;Rojo = Propiedad de otros &#10;Amarillo = En venta &#10;Morado = Para subasta &#10;Gris = Público"/>
- <button label="?" label_selected="?" name="button show owners help" left_delta="150"/>
+ <button label="Acerca del terreno" label_selected="Acerca del terreno" name="button about land"/>
+ <check_box label="Mostrar los propietarios" name="checkbox show owners" tool_tip="El color de las parcelas es según su propietario: Verde = Su terreno Agua = Terreno de sus grupos Rojo = Propiedad de otros Amarillo = En venta Morado = Para subasta Gris = Público"/>
<text name="label_parcel_modify">
Modificar la parcela
</text>
- <button label="Subdividir" label_selected="Subdividir" name="button subdivide land" width="140"/>
- <button label="Unir" label_selected="Unir" name="button join land" width="140"/>
+ <button label="Dividir" label_selected="Dividir" name="button subdivide land"/>
+ <button label="Inscribirse" label_selected="Inscribirse" name="button join land"/>
<text name="label_parcel_trans">
Transacciones de terreno
</text>
- <button label="Comprar terreno" label_selected="Comprar terreno" name="button buy land" width="140"/>
- <button label="Abandonar el terreno" label_selected="Abandonar el terreno" name="button abandon land" width="140"/>
+ <button label="Comprar terreno" label_selected="Comprar terreno" name="button buy land"/>
+ <button label="Abandonar el terreno" label_selected="Abandonar el terreno" name="button abandon land"/>
</panel>
- <floater.string name="status_rotate">
- Arrastre las bandas de color para girar el objeto
- </floater.string>
- <floater.string name="status_scale">
- Pulse y arrastre para estirar el lado seleccionado
- </floater.string>
- <floater.string name="status_move">
- Arrastrar para mover, Mayús.+arrastrar para copiar
- </floater.string>
- <floater.string name="status_modifyland">
- Mantenga pulsado para modificar el terreno
- </floater.string>
- <floater.string name="status_camera">
- Pulse y arrastre para cambiar el punto de vista
- </floater.string>
- <floater.string name="status_grab">
- Arrastre para mover objetos: Ctrl, verticalmente; Ctrl-Mayús., para girarlos.
- </floater.string>
- <floater.string name="status_place">
- Pulse en el mundo para construir
- </floater.string>
- <floater.string name="status_selectland">
- Pulse y arrastre para seleccionar el terreno
- </floater.string>
- <floater.string name="grid_screen_text">
- Pantalla
- </floater.string>
- <floater.string name="grid_local_text">
- Local
- </floater.string>
- <floater.string name="grid_world_text">
- Mundo
- </floater.string>
- <floater.string name="grid_reference_text">
- Referencia
- </floater.string>
- <floater.string name="grid_attachment_text">
- Añadido
- </floater.string>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_top_objects.xml b/indra/newview/skins/default/xui/es/floater_top_objects.xml
index 29ae9991af..7c2522e8a9 100644
--- a/indra/newview/skins/default/xui/es/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/es/floater_top_objects.xml
@@ -1,58 +1,59 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="top_objects" title="CARGANDO...">
+<floater name="top_objects" title="Objetos superiores">
+ <floater.string name="top_scripts_title">
+ Scripts según su uso
+ </floater.string>
+ <floater.string name="top_scripts_text">
+ [COUNT] scripts con un total de [TIME] ms
+ </floater.string>
+ <floater.string name="scripts_score_label">
+ Tiempo
+ </floater.string>
+ <floater.string name="scripts_mono_time_label">
+ Tiempo en Mono
+ </floater.string>
+ <floater.string name="top_colliders_title">
+ Objetos que colisionan
+ </floater.string>
+ <floater.string name="top_colliders_text">
+ [COUNT] objetos con muchas posibles colisiones
+ </floater.string>
+ <floater.string name="colliders_score_label">
+ Resultado
+ </floater.string>
+ <floater.string name="none_descriptor">
+ No se ha encontrado ninguno.
+ </floater.string>
<text name="title_text">
Cargando...
</text>
<scroll_list name="objects_list">
- <column label="Resultado" name="score"/>
- <column label="Nombre" name="name"/>
- <column label="Propietario" name="owner"/>
- <column label="Posición" name="location"/>
- <column label="Tiempo" name="time"/>
- <column label="Tiempo en Mono" name="mono_time"/>
+ <scroll_list.columns label="Resultado" name="score"/>
+ <scroll_list.columns label="Nombre" name="name"/>
+ <scroll_list.columns label="Propietario" name="owner"/>
+ <scroll_list.columns label="Posición" name="location"/>
+ <scroll_list.columns label="Tiempo" name="time"/>
+ <scroll_list.columns label="Tiempo en Mono" name="mono_time"/>
+ <scroll_list.columns label="URLs" name="URLs"/>
</scroll_list>
- <line_editor font="SansSerifSmall" left="140" name="id_editor" width="280"/>
- <line_editor font="SansSerifSmall" left="140" name="object_name_editor" width="280"/>
- <line_editor font="SansSerifSmall" left="140" name="owner_name_editor" width="280"/>
<text name="id_text">
ID del objeto:
</text>
+ <line_editor font="SansSerifSmall" left="140" name="id_editor" width="280"/>
<button label="Mostrar la baliza" name="show_beacon_btn" width="115"/>
<text name="obj_name_text">
Nombre del objeto:
</text>
+ <line_editor font="SansSerifSmall" left="140" name="object_name_editor" width="280"/>
<button label="Filtro" name="filter_object_btn" width="115"/>
<text name="owner_name_text" width="130">
- Nombre del propietario:
+ Propietario:
</text>
+ <line_editor font="SansSerifSmall" left="140" name="owner_name_editor" width="280"/>
<button label="Filtro" name="filter_owner_btn" width="115"/>
+ <button label="Actualizar" name="refresh_btn" width="115"/>
<button label="Devolver lo seleccionado" name="return_selected_btn" width="170"/>
- <button label="Devolver todo" name="return_all_btn" left="190"/>
+ <button label="Devolver todo" left="190" name="return_all_btn"/>
<button label="Desactivar lo seleccionado" name="disable_selected_btn" width="170"/>
- <button label="Desactivar todo" name="disable_all_btn" left="190"/>
- <button label="Actualizar" name="refresh_btn" width="115"/>
- <string name="top_scripts_title">
- Scripts según su uso
- </string>
- <string name="top_scripts_text">
- [COUNT] scripts con un total de [TIME] ms
- </string>
- <string name="scripts_score_label">
- Tiempo
- </string>
- <string name="scripts_mono_time_label">
- Tiempo en Mono
- </string>
- <string name="top_colliders_title">
- Objetos que colisionan
- </string>
- <string name="top_colliders_text">
- [COUNT] objetos con muchas posibles colisiones
- </string>
- <string name="colliders_score_label">
- Resultado
- </string>
- <string name="none_descriptor">
- No se ha encontrado ninguno.
- </string>
+ <button label="Desactivar todo" left="190" name="disable_all_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_tos.xml b/indra/newview/skins/default/xui/es/floater_tos.xml
index d46c84cb03..f4a0897d73 100644
--- a/indra/newview/skins/default/xui/es/floater_tos.xml
+++ b/indra/newview/skins/default/xui/es/floater_tos.xml
@@ -1,16 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="modal container" title=" ">
+ <floater.string name="real_url">
+ http://secondlife.com/app/tos/
+ </floater.string>
+ <floater.string name="loading_url">
+ data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+ </floater.string>
<button label="Continuar" label_selected="Continuar" name="Continue"/>
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
- <check_box label="Estoy de acuerdo con las Condiciones del Servicio" name="agree_chk"/>
+ <check_box label="Acepto las Condiciones del servicio y la Política de privacidad" name="agree_chk"/>
<text name="tos_heading">
- Por favor, lea cuidadosamente las siguientes Condiciones del Servicio. Si quiere seguir
-iniciando sesión en [SECOND_LIFE], debe aceptar el acuerdo.
+ Por favor, lee detenidamente las siguientes Condiciones del servicio y Política de privacidad. Debes aceptar el acuerdo para poder iniciar sesión en [SECOND_LIFE].
</text>
- <text_editor name="tos_text">
- TOS_TEXT
- </text_editor>
- <string name="real_url">
- http://secondlife.com/app/tos/
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_voice_controls.xml b/indra/newview/skins/default/xui/es/floater_voice_controls.xml
new file mode 100644
index 0000000000..51adeb4dff
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_voice_controls.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_voice_controls" title="Controles de Voz">
+ <string name="title_nearby">
+ CHAT DE VOZ
+ </string>
+ <string name="title_group">
+ Multiconferencia de voz con [GROUP]
+ </string>
+ <string name="title_adhoc">
+ Multiconferencia de voz
+ </string>
+ <string name="title_peer_2_peer">
+ Llamada: [NAME]
+ </string>
+ <string name="no_one_near">
+ Nadie cercano tiene activada la voz
+ </string>
+ <layout_stack name="my_call_stack">
+ <layout_panel name="my_panel">
+ <text name="user_text" value="Mi avatar:"/>
+ </layout_panel>
+ <layout_stack name="voice_effect_and_leave_call_stack">
+ <layout_panel name="leave_call_btn_panel">
+ <button label="Colgar" name="leave_call_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_voice_effect.xml b/indra/newview/skins/default/xui/es/floater_voice_effect.xml
new file mode 100644
index 0000000000..c1b7222aad
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_voice_effect.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="Lugares" name="voice_effects" title="PROBAR TRANSFORMACIÓN DE VOZ">
+ <string name="no_voice_effect">
+ (Sin transformación de voz)
+ </string>
+ <string name="active_voice_effect">
+ (Activo)
+ </string>
+ <string name="unsubscribed_voice_effect">
+ (Suscripción cancelada)
+ </string>
+ <string name="new_voice_effect">
+ (¡Nuevo!)
+ </string>
+ <text name="status_text">
+ Para probar un efecto de transformación de voz, pulsa el botón Grabar, graba un breve fragmento de voz y pulsa cualquiera de las transformaciones de voz de la lista para escuchar cómo suena.
+
+Para volver a conectarte al chat de voz, cierra esta ventana.
+ </text>
+ <button label="Grabar muestra" name="record_btn" tool_tip="Graba una muestra de tu voz."/>
+ <button label="Parar" name="record_stop_btn"/>
+ <text name="voice_morphing_link">
+ [[URL] Obtener transformación de voz]
+ </text>
+ <scroll_list name="voice_effect_list" tool_tip="Graba una muestra de tu voz y pulsa en un efecto para ver cómo suena.">
+ <scroll_list.columns label="Transformación de voz" name="name"/>
+ <scroll_list.columns label="Caduca" name="expires"/>
+ </scroll_list>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_water.xml b/indra/newview/skins/default/xui/es/floater_water.xml
index c86e49a355..2c1f6cfbfb 100644
--- a/indra/newview/skins/default/xui/es/floater_water.xml
+++ b/indra/newview/skins/default/xui/es/floater_water.xml
@@ -7,24 +7,24 @@
<button label="Guardar" label_selected="Guardar" name="WaterSavePreset"/>
<button label="Borrar" label_selected="Borrar" name="WaterDeletePreset"/>
<tab_container name="Water Tabs">
- <panel label="Configuraciones" name="Settings">
+ <panel label="CONFIGURACIÓN" name="Settings">
<text name="BHText">
Color del agua
</text>
- <button label="?" name="WaterFogColorHelp" left="175" />
- <color_swatch label="" name="WaterFogColor" tool_tip="Pulse para abrir el selector de color"/>
+ <button label="?" left="175" name="WaterFogColorHelp"/>
+ <color_swatch label="" name="WaterFogColor" tool_tip="Pulsa para abrir el selector de color"/>
<text name="WaterFogDensText">
Transparencia
</text>
- <button label="?" name="WaterFogDensityHelp" left="175" />
+ <button label="?" left="175" name="WaterFogDensityHelp"/>
<text name="WaterUnderWaterFogModText">
Modificar la claridad del agua
</text>
- <button label="?" name="WaterUnderWaterFogModHelp" left="175" />
+ <button label="?" left="175" name="WaterUnderWaterFogModHelp"/>
<text name="BDensText">
Tamaño de las ondulaciones
</text>
- <button label="?" name="WaterNormalScaleHelp" left="405"/>
+ <button label="?" left="405" name="WaterNormalScaleHelp"/>
<text name="BHText2">
1
</text>
@@ -37,29 +37,29 @@
<text name="HDText">
Escala de Fresnel
</text>
- <button label="?" name="WaterFresnelScaleHelp" left="405"/>
+ <button label="?" left="405" name="WaterFresnelScaleHelp"/>
<text name="FresnelOffsetText">
Coeficiente de reflexión
</text>
- <button label="?" name="WaterFresnelOffsetHelp" left="405"/>
+ <button label="?" left="405" name="WaterFresnelOffsetHelp"/>
<text name="DensMultText">
Refracción de la superficie
</text>
- <button label="?" name="WaterScaleAboveHelp" left="640"/>
+ <button label="?" left="640" name="WaterScaleAboveHelp"/>
<text name="WaterScaleBelowText">
Refracción bajo la superficie
</text>
- <button label="?" name="WaterScaleBelowHelp" left="640"/>
+ <button label="?" left="640" name="WaterScaleBelowHelp"/>
<text name="MaxAltText">
Desenfoque
</text>
- <button label="?" name="WaterBlurMultiplierHelp" left="640"/>
+ <button label="?" left="640" name="WaterBlurMultiplierHelp"/>
</panel>
- <panel label="Imagen" name="Waves">
+ <panel label="IMAGEN" name="Waves">
<text name="BHText">
Sentido de la onda grande
</text>
- <button label="?" name="WaterWave1Help" left="170"/>
+ <button label="?" left="170" name="WaterWave1Help"/>
<text name="WaterWave1DirXText">
X
</text>
@@ -69,7 +69,7 @@
<text name="BHText2">
Sentido de la onda pequeña
</text>
- <button label="?" name="WaterWave2Help" left="170"/>
+ <button label="?" left="170" name="WaterWave2Help"/>
<text name="WaterWave2DirXText">
X
</text>
diff --git a/indra/newview/skins/default/xui/es/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/es/floater_wearable_save_as.xml
index 1dfff90004..bf96ed53ce 100644
--- a/indra/newview/skins/default/xui/es/floater_wearable_save_as.xml
+++ b/indra/newview/skins/default/xui/es/floater_wearable_save_as.xml
@@ -3,7 +3,7 @@
<button label="Guardar" label_selected="Guardar" name="Save"/>
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
<text name="Save item as:">
- Guardar el ítem como:
+ Guardar el ítem en mi inventario como:
</text>
<line_editor name="name ed">
Nuevo [DESC]
diff --git a/indra/newview/skins/default/xui/es/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/es/floater_whitelist_entry.xml
new file mode 100644
index 0000000000..7dc47ca367
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_whitelist_entry.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="whitelist_entry" title="ENTRADA DE LA LISTA BLANCA">
+ <text name="media_label">
+ Escribe una URL o un rango de URL para añadirla a lista de dominios autorizados
+ </text>
+ <line_editor name="whitelist_entry" tool_tip="Añade una URL o un rango de URL a la Lista Blanca"/>
+ <button label="OK" name="ok_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_windlight_options.xml b/indra/newview/skins/default/xui/es/floater_windlight_options.xml
index 0697f05553..585a42e429 100644
--- a/indra/newview/skins/default/xui/es/floater_windlight_options.xml
+++ b/indra/newview/skins/default/xui/es/floater_windlight_options.xml
@@ -6,9 +6,9 @@
<button label="Nuevo" label_selected="Nuevo" name="WLNewPreset"/>
<button label="Guardar" label_selected="Guardar" name="WLSavePreset"/>
<button label="Borrar" label_selected="Borrar" name="WLDeletePreset"/>
- <button font="SansSerifSmall" width="150" left_delta="90" label="Editor del ciclo de un día" label_selected="Editor del ciclo de un día" name="WLDayCycleMenuButton"/>
+ <button font="SansSerifSmall" label="Editor del ciclo de un día" label_selected="Editor del ciclo de un día" left_delta="90" name="WLDayCycleMenuButton" width="150"/>
<tab_container name="WindLight Tabs">
- <panel label="Atmósfera" name="Atmosphere">
+ <panel label="ATMÓSFERA" name="Atmosphere">
<text name="BHText">
Coloración
</text>
@@ -62,7 +62,7 @@
</text>
<button label="?" name="WLMaxAltitudeHelp"/>
</panel>
- <panel label="Iluminación" name="Lighting">
+ <panel label="LUZ" name="Lighting">
<text name="SLCText">
Color del Sol y de la Luna
</text>
@@ -118,11 +118,11 @@
</text>
<button label="?" name="WLStarBrightnessHelp"/>
</panel>
- <panel label="Nubes" name="Clouds">
+ <panel label="NUBES" name="Clouds">
<text name="WLCloudColorText">
Color de las nubes
</text>
- <button label="?" name="WLCloudColorHelp" left="190" />
+ <button label="?" left="190" name="WLCloudColorHelp"/>
<text name="BHText">
R
</text>
@@ -138,7 +138,7 @@
<text name="WLCloudColorText2">
Posición/Densidad de las nubes
</text>
- <button label="?" name="WLCloudDensityHelp" left="190"/>
+ <button label="?" left="190" name="WLCloudDensityHelp"/>
<text name="BHText5">
X
</text>
@@ -156,12 +156,11 @@
Altitud de las nubes
</text>
<button label="?" name="WLCloudScaleHelp"/>
- <text name="WLCloudDetailText" font="SansSerifSmall">
- Detalle de las nubes
-(Posición/Densidad)
+ <text font="SansSerifSmall" name="WLCloudDetailText">
+ Detalle de las nubes (Posición/Densidad)
</text>
<button label="?" name="WLCloudDetailHelp"/>
- <text name="BHText8" bottom="-113">
+ <text bottom="-113" name="BHText8">
X
</text>
<text name="BHText9">
@@ -182,7 +181,7 @@
<button label="?" name="WLCloudScrollYHelp"/>
<check_box label="Bloquear" name="WLCloudLockY"/>
<check_box label="Incluir nubes clásicas" name="DrawClassicClouds"/>
- <button label="?" name="WLClassicCloudsHelp" left="618"/>
+ <button label="?" left="618" name="WLClassicCloudsHelp"/>
</panel>
</tab_container>
<string name="WLDefaultSkyNames">
diff --git a/indra/newview/skins/default/xui/es/floater_window_size.xml b/indra/newview/skins/default/xui/es/floater_window_size.xml
new file mode 100644
index 0000000000..f57ce08eac
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/floater_window_size.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="window_size" title="TAMAÑO DE LA VENTANA">
+ <string name="resolution_format">
+ [RES_X] x [RES_Y]
+ </string>
+ <text name="windowsize_text">
+ Definir el tamaño de la ventana:
+ </text>
+ <combo_box name="window_size_combo" tool_tip="ancho x alto">
+ <combo_box.item label="1000 x 700 (por defecto)" name="item0"/>
+ <combo_box.item label="1024 x 768" name="item1"/>
+ <combo_box.item label="1280 x 720 (720 p)" name="item2"/>
+ <combo_box.item label="1920 x 1080 (1080 p)" name="item3"/>
+ </combo_box>
+ <button label="Configurar" name="set_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/floater_world_map.xml b/indra/newview/skins/default/xui/es/floater_world_map.xml
index 4d7337bef7..deda5b86c8 100644
--- a/indra/newview/skins/default/xui/es/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/es/floater_world_map.xml
@@ -1,57 +1,70 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="worldmap" title="MAPA DEL MUNDO">
- <tab_container name="maptab">
- <panel label="Objetos" name="objects_mapview"/>
- <panel label="Terreno" name="terrain_mapview"/>
- </tab_container>
- <text name="you_label">
- Usted
- </text>
- <text name="home_label">
- Base
- </text>
- <text name="auction_label">
- Subasta
- </text>
- <text name="land_for_sale_label">
- Terreno en venta
- </text>
- <button label="Ir a la Base" label_selected="Ir a la Base" name="Go Home" tool_tip="Teleportar a su Base"/>
- <check_box label="Residente" name="people_chk"/>
- <check_box label="Punto de Info" name="infohub_chk"/>
- <check_box label="Punto de Teleporte" name="telehubchk"/>
- <check_box label="Terreno en venta" name="land_for_sale_chk"/>
- <text name="events_label">
- Eventos:
- </text>
- <check_box label="&apos;PG&apos;" name="event_chk"/>
- <check_box label="&apos;Mature&apos;" name="event_mature_chk"/>
- <check_box label="&apos;Adult&apos;" name="event_adult_chk"/>
- <combo_box label="Amigos conectados" name="friend combo" tool_tip="Amigo a mostrar en el mapa">
- <combo_box.item name="item1" label="Amigos conectados" />
- </combo_box>
- <combo_box label="Hitos" name="landmark combo" tool_tip="Hito a mostrar en el mapa">
- <combo_box.item name="item1" label="Hitos" />
- </combo_box>
- <line_editor label="Buscar por el nombre de la región" name="location" tool_tip="Escriba el nombre de una región"/>
- <button label="Buscar" name="DoSearch" tool_tip="Buscar una región"/>
- <text name="search_label">
- Resultados de la búsqueda:
- </text>
- <scroll_list name="search_results">
- <column label="" name="icon"/>
- <column label="" name="sim_name"/>
- </scroll_list>
- <text name="location_label">
- Localización:
- </text>
- <spinner name="spin x" tool_tip="Coordenada X de la posición a mostrar en el mapa"/>
- <spinner name="spin y" tool_tip="Coordenada Y de la posición a mostrar en el mapa"/>
- <spinner name="spin z" tool_tip="Coordenada Z de la posición a mostrar en el mapa"/>
- <button label="Teleportar" label_selected="Teleportar" name="Teleport" tool_tip="Teleportarse a la localización elegida"/>
- <button label="Mostrar el destino" label_selected="Mostrar el destino" name="Show Destination" tool_tip="Centrar el mapa en la localización elegida"/>
- <button label="Limpiar" label_selected="Limpiar" name="Clear" tool_tip="Parar la búsqueda"/>
- <button label="Mostrar mi posición" label_selected="Mostrar mi posición" name="Show My Location" tool_tip="Centrar el mapa en la posición de su avatar"/>
- <button label="Copiar la SLurl al portapapeles" name="copy_slurl" tool_tip="Copiar la posición actual como una SLurl, para usarla en la web."/>
- <slider label="Zoom" name="zoom slider"/>
+ <panel name="layout_panel_1">
+ <text name="events_label">
+ Leyenda
+ </text>
+ </panel>
+ <panel name="layout_panel_2">
+ <button name="Show My Location" tool_tip="Centrar el mapa en la posición de mi avatar"/>
+ <text name="me_label">
+ Yo
+ </text>
+ <text name="person_label">
+ Persona
+ </text>
+ <text name="infohub_label">
+ Punto de Info
+ </text>
+ <text name="land_sale_label">
+ Venta de terreno
+ </text>
+ <text name="by_owner_label">
+ por el dueño
+ </text>
+ <text name="auction_label">
+ subasta
+ </text>
+ <button name="Go Home" tool_tip="Teleportar a mi Base"/>
+ <text name="Home_label">
+ Base
+ </text>
+ <text name="events_label">
+ Eventos:
+ </text>
+ <text name="pg_label">
+ General
+ </text>
+ <check_box name="event_mature_chk"/>
+ <text name="mature_label">
+ Moderado
+ </text>
+ <text name="adult_label">
+ Adulto
+ </text>
+ </panel>
+ <panel name="layout_panel_3">
+ <text name="find_on_map_label">
+ Encontrar en el mapa
+ </text>
+ </panel>
+ <panel name="layout_panel_4">
+ <combo_box label="Amigos online" name="friend combo" tool_tip="Ver a los amigos en el mapa">
+ <combo_box.item label="Mis amigos conectados" name="item1"/>
+ </combo_box>
+ <combo_box label="Mis hitos" name="landmark combo" tool_tip="Hito a ver en el mapa">
+ <combo_box.item label="Mis hitos" name="item1"/>
+ </combo_box>
+ <search_editor label="Regiones alfabéticamente" name="location" tool_tip="Escribe el nombre de una región"/>
+ <button label="Encontrar" name="DoSearch" tool_tip="Buscar una región"/>
+ <button name="Clear" tool_tip="Limpia las marcas y actualiza el mapa"/>
+ <button label="Teleportar" name="Teleport" tool_tip="Teleportar a la localización seleccionada"/>
+ <button label="Copiar la SLurl" name="copy_slurl" tool_tip="Copiar la SLurl de esta posición para usarla en una web."/>
+ <button label="Ver lo elegido" name="Show Destination" tool_tip="Centrar el mapa en la localización seleccionada"/>
+ </panel>
+ <panel name="layout_panel_5">
+ <text name="zoom_label">
+ Zoom
+ </text>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/es/inspect_avatar.xml b/indra/newview/skins/default/xui/es/inspect_avatar.xml
new file mode 100644
index 0000000000..bff10d9292
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/inspect_avatar.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_avatar">
+ <string name="Subtitle">
+ [AGE]
+ </string>
+ <string name="Details">
+ [SL_PROFILE]
+ </string>
+ <slider name="volume_slider" tool_tip="Volumen de la voz" value="0.5"/>
+ <button label="Añadir como amigo" name="add_friend_btn"/>
+ <button label="MI" name="im_btn"/>
+ <button label="Perfil" name="view_profile_btn"/>
+ <panel name="moderator_panel">
+ <button label="Desactivar la voz" name="disable_voice"/>
+ <button label="Activar la voz" name="enable_voice"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/inspect_group.xml b/indra/newview/skins/default/xui/es/inspect_group.xml
new file mode 100644
index 0000000000..ba10b19f41
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/inspect_group.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_group">
+ <string name="PrivateGroup">
+ Grupo privado
+ </string>
+ <string name="FreeToJoin">
+ Inscripción gratuita
+ </string>
+ <string name="CostToJoin">
+ Inscribirse cuesta [AMOUNT] L$
+ </string>
+ <string name="YouAreMember">
+ Eres miembro
+ </string>
+ <button label="Inscribirse" name="join_btn"/>
+ <button label="Abandonar" name="leave_btn"/>
+ <button label="Ver el perfil" name="view_profile_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/inspect_object.xml b/indra/newview/skins/default/xui/es/inspect_object.xml
new file mode 100644
index 0000000000..d608b4a0f7
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/inspect_object.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_object">
+ <string name="Creator">
+ Por [CREATOR]
+ </string>
+ <string name="CreatorAndOwner">
+ Por [CREATOR]
+Propietario [OWNER]
+ </string>
+ <string name="Price">
+ [AMOUNT] L$
+ </string>
+ <string name="PriceFree">
+ ¡Gratis!
+ </string>
+ <string name="Touch">
+ Tocar
+ </string>
+ <string name="Sit">
+ Sentarme
+ </string>
+ <text name="object_name" value="Test Object Name That Is actually two lines and Really Long"/>
+ <text name="price_text">
+ 30.000 L$
+ </text>
+ <text name="object_description">
+ This is a really long description for an object being as how it is at least 80 characters in length and so but maybe more like 120 at this point. Who knows, really?
+ </text>
+ <button label="Comprar" name="buy_btn"/>
+ <button label="Pagar" name="pay_btn"/>
+ <button label="Coger una copia" name="take_free_copy_btn"/>
+ <button label="Tocar" name="touch_btn"/>
+ <button label="Sentarme" name="sit_btn"/>
+ <button label="Abrir" name="open_btn"/>
+ <icon name="secure_browsing" tool_tip="Navegación segura"/>
+ <button label="Más" name="more_info_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/inspect_remote_object.xml b/indra/newview/skins/default/xui/es/inspect_remote_object.xml
new file mode 100644
index 0000000000..f814e84a6f
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/inspect_remote_object.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_remote_object">
+ <text name="object_owner_label">
+ Propietario:
+ </text>
+ <button label="Mapa" name="map_btn"/>
+ <button label="Ignorar" name="block_btn"/>
+ <button label="Cerrar" name="close_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/es/language_settings.xml b/indra/newview/skins/default/xui/es/language_settings.xml
index 71418d446a..1ade4ba300 100644
--- a/indra/newview/skins/default/xui/es/language_settings.xml
+++ b/indra/newview/skins/default/xui/es/language_settings.xml
@@ -3,9 +3,9 @@
<strings>
<!-- Locale Information -->
- <string name="MicrosoftLocale">english</string>
- <string name="DarwinLocale">C</string>
- <string name="LinuxLocale">C</string>
+ <string name="MicrosoftLocale">spanish</string>
+ <string name="DarwinLocale">es_ES.UTF-8</string>
+ <string name="LinuxLocale">es_ES.UTF-8</string>
<!--
datetimeToCodes["wkday"] = "%a"; // Thu
diff --git a/indra/newview/skins/default/xui/es/menu_attachment_other.xml b/indra/newview/skins/default/xui/es/menu_attachment_other.xml
new file mode 100644
index 0000000000..00bdb74881
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_attachment_other.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_avatar_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Ver el perfil" name="Profile..."/>
+ <menu_item_call label="Añadir como amigo" name="Add Friend"/>
+ <menu_item_call label="MI" name="Send IM..."/>
+ <menu_item_call label="Llamada" name="Call"/>
+ <menu_item_call label="Invitar al grupo" name="Invite..."/>
+ <menu_item_call label="Ignorar" name="Avatar Mute"/>
+ <menu_item_call label="Denunciar" name="abuse"/>
+ <menu_item_call label="Congelar" name="Freeze..."/>
+ <menu_item_call label="Expulsar" name="Eject..."/>
+ <menu_item_call label="Depurar las texturas" name="Debug..."/>
+ <menu_item_call label="Acercar el zoom" name="Zoom In"/>
+ <menu_item_call label="Pagar" name="Pay..."/>
+ <menu_item_call label="Perfil del objeto" name="Object Inspect"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_attachment_self.xml b/indra/newview/skins/default/xui/es/menu_attachment_self.xml
new file mode 100644
index 0000000000..afac8d7fe9
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_attachment_self.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Attachment Pie">
+ <menu_item_call label="Tocar" name="Attachment Object Touch"/>
+ <menu_item_call label="Editar" name="Edit..."/>
+ <menu_item_call label="Quitar" name="Detach"/>
+ <menu_item_call label="Soltar" name="Drop"/>
+ <menu_item_call label="Levantarme" name="Stand Up"/>
+ <menu_item_call label="Cambiar vestuario" name="Change Outfit"/>
+ <menu_item_call label="Mis amigos" name="Friends..."/>
+ <menu_item_call label="Mis grupos" name="Groups..."/>
+ <menu_item_call label="Mi perfil" name="Profile..."/>
+ <menu_item_call label="Depurar las texturas" name="Debug..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_avatar_icon.xml b/indra/newview/skins/default/xui/es/menu_avatar_icon.xml
new file mode 100644
index 0000000000..fe7331a108
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_avatar_icon.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Avatar Icon Menu">
+ <menu_item_call label="Ver el perfil" name="Show Profile"/>
+ <menu_item_call label="Enviar un MI..." name="Send IM"/>
+ <menu_item_call label="Añadir como amigo..." name="Add Friend"/>
+ <menu_item_call label="Quitar de los amigos..." name="Remove Friend"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_avatar_other.xml b/indra/newview/skins/default/xui/es/menu_avatar_other.xml
new file mode 100644
index 0000000000..7df2d7c4e0
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_avatar_other.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_attachment_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Ver el perfil" name="Profile..."/>
+ <menu_item_call label="Añadir como amigo" name="Add Friend"/>
+ <menu_item_call label="MI" name="Send IM..."/>
+ <menu_item_call label="Llamada" name="Call"/>
+ <menu_item_call label="Invitar al grupo" name="Invite..."/>
+ <menu_item_call label="Ignorar" name="Avatar Mute"/>
+ <menu_item_call label="Denunciar" name="abuse"/>
+ <menu_item_call label="Congelar" name="Freeze..."/>
+ <menu_item_call label="Expulsar" name="Eject..."/>
+ <menu_item_call label="Depurar las texturas" name="Debug..."/>
+ <menu_item_call label="Acercar el zoom" name="Zoom In"/>
+ <menu_item_call label="Pagar" name="Pay..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_avatar_self.xml b/indra/newview/skins/default/xui/es/menu_avatar_self.xml
new file mode 100644
index 0000000000..d347a7d0c4
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_avatar_self.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Self Pie">
+ <menu_item_call label="Levantarme" name="Stand Up"/>
+ <context_menu label="Quitarme â–¶" name="Take Off &gt;">
+ <context_menu label="Ropas â–¶" name="Clothes &gt;">
+ <menu_item_call label="Camisa" name="Shirt"/>
+ <menu_item_call label="Pantalón" name="Pants"/>
+ <menu_item_call label="Falda" name="Skirt"/>
+ <menu_item_call label="Zapatos" name="Shoes"/>
+ <menu_item_call label="Calcetines" name="Socks"/>
+ <menu_item_call label="Chaqueta" name="Jacket"/>
+ <menu_item_call label="Guantes" name="Gloves"/>
+ <menu_item_call label="Camiseta" name="Self Undershirt"/>
+ <menu_item_call label="Ropa interior" name="Self Underpants"/>
+ <menu_item_call label="Tatuaje" name="Self Tattoo"/>
+ <menu_item_call label="Alfa" name="Self Alpha"/>
+ <menu_item_call label="Toda la ropa" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="HUD â–¶" name="Object Detach HUD"/>
+ <context_menu label="Desanexar â–¶" name="Object Detach"/>
+ <menu_item_call label="Quitarse todo" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Cambiar vestuario" name="Chenge Outfit"/>
+ <menu_item_call label="Editar mi vestuario" name="Edit Outfit"/>
+ <menu_item_call label="Editar mi anatomía" name="Edit My Shape"/>
+ <menu_item_call label="Mis amigos" name="Friends..."/>
+ <menu_item_call label="Mis grupos" name="Groups..."/>
+ <menu_item_call label="Mi perfil" name="Profile..."/>
+ <menu_item_call label="Depurar las texturas" name="Debug..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_bottomtray.xml b/indra/newview/skins/default/xui/es/menu_bottomtray.xml
new file mode 100644
index 0000000000..62683f3076
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_bottomtray.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="Botón Gestos" name="ShowGestureButton"/>
+ <menu_item_check label="Botón Moverse" name="ShowMoveButton"/>
+ <menu_item_check label="Botón Vista" name="ShowCameraButton"/>
+ <menu_item_check label="Botón Foto" name="ShowSnapshotButton"/>
+ <menu_item_check label="Botón Barra lateral" name="ShowSidebarButton"/>
+ <menu_item_check label="Botón Construir" name="ShowBuildButton"/>
+ <menu_item_check label="Botón Buscar" name="ShowSearchButton"/>
+ <menu_item_check label="Botón Mapa" name="ShowWorldMapButton"/>
+ <menu_item_check label="Botón Minimapa" name="ShowMiniMapButton"/>
+ <menu_item_call label="Cortar" name="NearbyChatBar_Cut"/>
+ <menu_item_call label="Copiar" name="NearbyChatBar_Copy"/>
+ <menu_item_call label="Pegar" name="NearbyChatBar_Paste"/>
+ <menu_item_call label="Borrar" name="NearbyChatBar_Delete"/>
+ <menu_item_call label="Seleccionar todo" name="NearbyChatBar_Select_All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_cof_attachment.xml b/indra/newview/skins/default/xui/es/menu_cof_attachment.xml
new file mode 100644
index 0000000000..7541530601
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_cof_attachment.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Attachment">
+ <menu_item_call label="Quitar" name="detach"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_cof_body_part.xml b/indra/newview/skins/default/xui/es/menu_cof_body_part.xml
new file mode 100644
index 0000000000..56b95bdc3b
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_cof_body_part.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Body">
+ <menu_item_call label="Reemplazar" name="replace"/>
+ <menu_item_call label="Editar" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_cof_clothing.xml b/indra/newview/skins/default/xui/es/menu_cof_clothing.xml
new file mode 100644
index 0000000000..4051f64e14
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_cof_clothing.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Clothing">
+ <menu_item_call label="Quitarme" name="take_off"/>
+ <menu_item_call label="Subir una capa" name="move_up"/>
+ <menu_item_call label="Bajar una capa" name="move_down"/>
+ <menu_item_call label="Editar" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_cof_gear.xml b/indra/newview/skins/default/xui/es/menu_cof_gear.xml
new file mode 100644
index 0000000000..ff8ad0977a
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_cof_gear.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Gear COF">
+ <menu label="Ropas nuevas" name="COF.Gear.New_Clothes"/>
+ <menu label="Nuevas partes del cuerpo" name="COF.Geear.New_Body_Parts"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_edit.xml b/indra/newview/skins/default/xui/es/menu_edit.xml
new file mode 100644
index 0000000000..96fc9d8881
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_edit.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu label="Editar" name="Edit">
+ <menu_item_call label="Deshacer" name="Undo"/>
+ <menu_item_call label="Rehacer" name="Redo"/>
+ <menu_item_call label="Cortar" name="Cut"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+ <menu_item_call label="Pegar" name="Paste"/>
+ <menu_item_call label="Borrar" name="Delete"/>
+ <menu_item_call label="Duplicar" name="Duplicate"/>
+ <menu_item_call label="Seleccionar todo" name="Select All"/>
+ <menu_item_call label="Deseleccionar" name="Deselect"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_favorites.xml b/indra/newview/skins/default/xui/es/menu_favorites.xml
new file mode 100644
index 0000000000..c8a7858ddb
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_favorites.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Teleportarse" name="Teleport To Landmark"/>
+ <menu_item_call label="Ver/Editar el hito" name="Landmark Open"/>
+ <menu_item_call label="Copiar la SLurl" name="Copy slurl"/>
+ <menu_item_call label="Mostrar en el mapa" name="Show On Map"/>
+ <menu_item_call label="Copiar" name="Landmark Copy"/>
+ <menu_item_call label="Pegar" name="Landmark Paste"/>
+ <menu_item_call label="Borrar" name="Delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_gesture_gear.xml b/indra/newview/skins/default/xui/es/menu_gesture_gear.xml
new file mode 100644
index 0000000000..24706eb2c8
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_gesture_gear.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gesture_gear">
+ <menu_item_call label="Añadir a / Quitar de los favoritos" name="activate"/>
+ <menu_item_call label="Copiar" name="copy_gesture"/>
+ <menu_item_call label="Pegar" name="paste"/>
+ <menu_item_call label="Copiar la UUID" name="copy_uuid"/>
+ <menu_item_call label="Añadir al vestuario actual" name="save_to_outfit"/>
+ <menu_item_call label="Editar" name="edit_gesture"/>
+ <menu_item_call label="Inspeccionar" name="inspect"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_group_plus.xml b/indra/newview/skins/default/xui/es/menu_group_plus.xml
new file mode 100644
index 0000000000..6b26ba42c4
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_group_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Entrar al grupo..." name="item_join"/>
+ <menu_item_call label="Grupo nuevo..." name="item_new"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_hide_navbar.xml b/indra/newview/skins/default/xui/es/menu_hide_navbar.xml
new file mode 100644
index 0000000000..22a1873234
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_hide_navbar.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_navbar_menu">
+ <menu_item_check label="Mostrar la barra de navegación" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Mostrar la barra de favoritos" name="ShowNavbarFavoritesPanel"/>
+ <menu_item_check label="Mostrar mini-barra de ubicación" name="ShowMiniLocationPanel"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_im_well_button.xml b/indra/newview/skins/default/xui/es/menu_im_well_button.xml
new file mode 100644
index 0000000000..c8f6c217cc
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_im_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="IM Well Button Context Menu">
+ <menu_item_call label="Cerrar todo" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_imchiclet_adhoc.xml b/indra/newview/skins/default/xui/es/menu_imchiclet_adhoc.xml
new file mode 100644
index 0000000000..e11e9bdc58
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_imchiclet_adhoc.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet AdHoc Menu">
+ <menu_item_call label="Acabar la sesión" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/es/menu_imchiclet_group.xml
new file mode 100644
index 0000000000..a5e60ea40b
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_imchiclet_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet Group Menu">
+ <menu_item_call label="Información del grupo" name="Show Profile"/>
+ <menu_item_call label="Mostrar la sesión" name="Chat"/>
+ <menu_item_call label="Acabar la sesión" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/es/menu_imchiclet_p2p.xml
new file mode 100644
index 0000000000..492801026c
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_imchiclet_p2p.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet P2P Menu">
+ <menu_item_call label="Ver el perfil" name="Show Profile"/>
+ <menu_item_call label="Añadir como amigo" name="Add Friend"/>
+ <menu_item_call label="Mostrar la sesión" name="Send IM"/>
+ <menu_item_call label="Acabar la sesión" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml
new file mode 100644
index 0000000000..236289f82a
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_inspect_avatar_gear.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Ver el perfil" name="view_profile"/>
+ <menu_item_call label="Añadir como amigo" name="add_friend"/>
+ <menu_item_call label="MI" name="im"/>
+ <menu_item_call label="Llamada" name="call"/>
+ <menu_item_call label="Teleportarse" name="teleport"/>
+ <menu_item_call label="Invitar al grupo" name="invite_to_group"/>
+ <menu_item_call label="Ignorar" name="block"/>
+ <menu_item_call label="Designorar" name="unblock"/>
+ <menu_item_call label="Denunciar" name="report"/>
+ <menu_item_call label="Congelar" name="freeze"/>
+ <menu_item_call label="Expulsar" name="eject"/>
+ <menu_item_call label="Depurar las texturas" name="debug"/>
+ <menu_item_call label="Encontrar en el mapa" name="find_on_map"/>
+ <menu_item_call label="Acercar el zoom" name="zoom_in"/>
+ <menu_item_call label="Pagar" name="pay"/>
+ <menu_item_call label="Compartir" name="share"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/es/menu_inspect_object_gear.xml
new file mode 100644
index 0000000000..af85b833e9
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_inspect_object_gear.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Tocar" name="touch"/>
+ <menu_item_call label="Sentarse" name="sit"/>
+ <menu_item_call label="Pagar" name="pay"/>
+ <menu_item_call label="Comprar" name="buy"/>
+ <menu_item_call label="Tomar" name="take"/>
+ <menu_item_call label="Coger una copia" name="take_copy"/>
+ <menu_item_call label="Abrir" name="open"/>
+ <menu_item_call label="Editar" name="edit"/>
+ <menu_item_call label="Ponerse" name="wear"/>
+ <menu_item_call label="Denunciar" name="report"/>
+ <menu_item_call label="Ignorar" name="block"/>
+ <menu_item_call label="Acercar el zoom" name="zoom_in"/>
+ <menu_item_call label="Quitar" name="remove"/>
+ <menu_item_call label="Más información" name="more_info"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml
new file mode 100644
index 0000000000..4b56984541
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_inspect_self_gear.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Levantarme" name="stand_up"/>
+ <menu_item_call label="Cambiar vestuario" name="change_outfit"/>
+ <menu_item_call label="Mi perfil" name="my_profile"/>
+ <menu_item_call label="Mis amigos" name="my_friends"/>
+ <menu_item_call label="Mis grupos" name="my_groups"/>
+ <menu_item_call label="Depurar las texturas" name="Debug..."/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_inv_offer_chiclet.xml b/indra/newview/skins/default/xui/es/menu_inv_offer_chiclet.xml
new file mode 100644
index 0000000000..20d99afde1
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_inv_offer_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="InvOfferChiclet Menu">
+ <menu_item_call label="Cerrar" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_inventory.xml b/indra/newview/skins/default/xui/es/menu_inventory.xml
index 28d47fce52..8f606aef82 100644
--- a/indra/newview/skins/default/xui/es/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/es/menu_inventory.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
+ <menu_item_call label="Compartir" name="Share"/>
<menu_item_call label="Comprar" name="Task Buy"/>
<menu_item_call label="Abrir" name="Task Open"/>
<menu_item_call label="Ejecutar" name="Task Play"/>
@@ -12,7 +13,7 @@
<menu_item_call label="Script nuevo" name="New Script"/>
<menu_item_call label="Nota nueva" name="New Note"/>
<menu_item_call label="Gesto nuevo" name="New Gesture"/>
- <menu name="New Clothes" label="Nueva ropa">
+ <menu label="Ropas nuevas" name="New Clothes">
<menu_item_call label="Camisa nueva" name="New Shirt"/>
<menu_item_call label="Pantalones nuevos" name="New Pants"/>
<menu_item_call label="Zapatos nuevos" name="New Shoes"/>
@@ -22,45 +23,65 @@
<menu_item_call label="Guantes nuevos" name="New Gloves"/>
<menu_item_call label="Camiseta nueva" name="New Undershirt"/>
<menu_item_call label="Ropa interior nueva" name="New Underpants"/>
+ <menu_item_call label="Nueva capa Alpha" name="New Alpha Mask"/>
+ <menu_item_call label="Tatuaje nuevo" name="New Tattoo"/>
</menu>
- <menu name="New Body Parts" label="Nuevas partes del cuerpo">
+ <menu label="Nuevas partes del cuerpo" name="New Body Parts">
<menu_item_call label="Forma nueva" name="New Shape"/>
<menu_item_call label="Piel nueva" name="New Skin"/>
<menu_item_call label="Pelo nuevo" name="New Hair"/>
<menu_item_call label="Ojos nuevos" name="New Eyes"/>
</menu>
+ <menu label="Change Type" name="Change Type">
+ <menu_item_call label="Por defecto" name="Default"/>
+ <menu_item_call label="Guantes" name="Gloves"/>
+ <menu_item_call label="Chaqueta" name="Jacket"/>
+ <menu_item_call label="Pantalón" name="Pants"/>
+ <menu_item_call label="Forma" name="Shape"/>
+ <menu_item_call label="Zapatos" name="Shoes"/>
+ <menu_item_call label="Camisa" name="Shirt"/>
+ <menu_item_call label="Falda" name="Skirt"/>
+ <menu_item_call label="Ropa interior" name="Underpants"/>
+ <menu_item_call label="Camiseta" name="Undershirt"/>
+ </menu>
<menu_item_call label="Teleportar" name="Landmark Open"/>
<menu_item_call label="Abrir" name="Animation Open"/>
<menu_item_call label="Abrir" name="Sound Open"/>
+ <menu_item_call label="Reemplazar el vestuario" name="Replace Outfit"/>
+ <menu_item_call label="Añadir al vestuario" name="Add To Outfit"/>
+ <menu_item_call label="Quitar del vestuario actual" name="Remove From Outfit"/>
+ <menu_item_call label="Encontrar el original" name="Find Original"/>
<menu_item_call label="Eliminar el ítem" name="Purge Item"/>
<menu_item_call label="Restaurar el ítem" name="Restore Item"/>
<menu_item_call label="Abrir" name="Open"/>
+ <menu_item_call label="Abrir original" name="Open Original"/>
<menu_item_call label="Propiedades" name="Properties"/>
<menu_item_call label="Renombrar" name="Rename"/>
<menu_item_call label="Copiar la UUID" name="Copy Asset UUID"/>
<menu_item_call label="Copiar" name="Copy"/>
<menu_item_call label="Pegar" name="Paste"/>
+ <menu_item_call label="Pegar como enlace" name="Paste As Link"/>
+ <menu_item_call label="Quitar el enlace" name="Remove Link"/>
<menu_item_call label="Borrar" name="Delete"/>
- <menu_item_call label="Quitarse los ítems" name="Take Off Items"/>
- <menu_item_call label="Añadir al vestuario" name="Add To Outfit"/>
- <menu_item_call label="Reemplazar el vestuario" name="Replace Outfit"/>
+ <menu_item_call label="Borrar carpeta del sistema" name="Delete System Folder"/>
<menu_item_call label="Empezar multiconferencia" name="Conference Chat Folder"/>
<menu_item_call label="Escuchar" name="Sound Play"/>
- <menu_item_call label="Acerca del hito" name="Teleport To Landmark"/>
- <menu_item_call label="Ver en el mundo" name="Animation Play"/>
+ <menu_item_call label="Acerca del hito" name="About Landmark"/>
+ <menu_item_call label="Escuchar en el mundo" name="Animation Play"/>
<menu_item_call label="Ejecutarla para usted" name="Animation Audition"/>
<menu_item_call label="Enviar un mensaje instantáneo" name="Send Instant Message"/>
<menu_item_call label="Ofrecer teleporte..." name="Offer Teleport..."/>
<menu_item_call label="Empezar multiconferencia" name="Conference Chat"/>
<menu_item_call label="Activar" name="Activate"/>
<menu_item_call label="Desactivar" name="Deactivate"/>
+ <menu_item_call label="Guardar como" name="Save As"/>
<menu_item_call label="Quitarse" name="Detach From Yourself"/>
- <menu_item_call label="Volver a la última posición" name="Restore to Last Position"/>
<menu_item_call label="Ponerse" name="Object Wear"/>
<menu label="Anexar a" name="Attach To"/>
<menu label="Anexar como HUD" name="Attach To HUD"/>
<menu_item_call label="Editar" name="Wearable Edit"/>
<menu_item_call label="Ponerse" name="Wearable Wear"/>
+ <menu_item_call label="Añadir" name="Wearable Add"/>
<menu_item_call label="Quitarse" name="Take Off"/>
<menu_item_call label="--sin opciones--" name="--no options--"/>
</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_inventory_add.xml b/indra/newview/skins/default/xui/es/menu_inventory_add.xml
new file mode 100644
index 0000000000..91cb4a08ff
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_inventory_add.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_inventory_add">
+ <menu label="Subir" name="upload">
+ <menu_item_call label="Imagen ([COST] L$)..." name="Upload Image"/>
+ <menu_item_call label="Sonido ([COST] L$)..." name="Upload Sound"/>
+ <menu_item_call label="Animación ([COST] L$)..." name="Upload Animation"/>
+ <menu_item_call label="Masivo ([COST] L$ por archivo)..." name="Bulk Upload"/>
+ </menu>
+ <menu_item_call label="Carpeta nueva" name="New Folder"/>
+ <menu_item_call label="Script nuevo" name="New Script"/>
+ <menu_item_call label="Nota nueva" name="New Note"/>
+ <menu_item_call label="Gesto nuevo" name="New Gesture"/>
+ <menu label="Ropas nuevas" name="New Clothes">
+ <menu_item_call label="Camisa nueva" name="New Shirt"/>
+ <menu_item_call label="Pantalón nuevo" name="New Pants"/>
+ <menu_item_call label="Zapatos nuevos" name="New Shoes"/>
+ <menu_item_call label="Calcetines nuevos" name="New Socks"/>
+ <menu_item_call label="Chaqueta nueva" name="New Jacket"/>
+ <menu_item_call label="Falda nueva" name="New Skirt"/>
+ <menu_item_call label="Guantes nuevos" name="New Gloves"/>
+ <menu_item_call label="Camiseta nueva" name="New Undershirt"/>
+ <menu_item_call label="Ropa interior nueva" name="New Underpants"/>
+ <menu_item_call label="Nueva Alfa" name="New Alpha"/>
+ <menu_item_call label="Tatuaje nuevo" name="New Tattoo"/>
+ </menu>
+ <menu label="Nuevas partes del cuerpo" name="New Body Parts">
+ <menu_item_call label="Forma nueva" name="New Shape"/>
+ <menu_item_call label="Piel nueva" name="New Skin"/>
+ <menu_item_call label="Pelo nuevo" name="New Hair"/>
+ <menu_item_call label="Ojos nuevos" name="New Eyes"/>
+ </menu>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml
new file mode 100644
index 0000000000..80cf78c0b5
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_inventory_gear_default.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gear_default">
+ <menu_item_call label="Nueva ventana del inventario" name="new_window"/>
+ <menu_item_call label="Ordenar alfabéticamente" name="sort_by_name"/>
+ <menu_item_call label="Ordenar por los más recientes" name="sort_by_recent"/>
+ <menu_item_call label="Ver los filtros" name="show_filters"/>
+ <menu_item_call label="Restablecer los filtros" name="reset_filters"/>
+ <menu_item_call label="Cerrar todas las carpetas" name="close_folders"/>
+ <menu_item_call label="Vaciar la Papelera" name="empty_trash"/>
+ <menu_item_call label="Vaciar Objetos Perdidos" name="empty_lostnfound"/>
+ <menu_item_call label="Guardar la textura como" name="Save Texture As"/>
+ <menu_item_call label="Encontrar el original" name="Find Original"/>
+ <menu_item_call label="Encontrar todos los enlazados" name="Find All Links"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_land.xml b/indra/newview/skins/default/xui/es/menu_land.xml
new file mode 100644
index 0000000000..b0f15be1b6
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_land.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Land Pie">
+ <menu_item_call label="Acerca del terreno" name="Place Information..."/>
+ <menu_item_call label="Sentarme aquí" name="Sit Here"/>
+ <menu_item_call label="Comprar este terreno" name="Land Buy"/>
+ <menu_item_call label="Comprar un pase" name="Land Buy Pass"/>
+ <menu_item_call label="Construir" name="Create"/>
+ <menu_item_call label="Modificar el terreno" name="Edit Terrain"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_landmark.xml b/indra/newview/skins/default/xui/es/menu_landmark.xml
new file mode 100644
index 0000000000..f69b1539b8
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_landmark.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="landmark_overflow_menu">
+ <menu_item_call label="Copiar la SLurl" name="copy"/>
+ <menu_item_call label="Borrar" name="delete"/>
+ <menu_item_call label="Crear un Destacado" name="pick"/>
+ <menu_item_call label="Añadir a la barra de favoritos" name="add_to_favbar"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_login.xml b/indra/newview/skins/default/xui/es/menu_login.xml
index 1cf6ad5ae6..5386f82ee5 100644
--- a/indra/newview/skins/default/xui/es/menu_login.xml
+++ b/indra/newview/skins/default/xui/es/menu_login.xml
@@ -1,13 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Login Menu">
- <menu label="Archivo" name="File">
- <menu_item_call label="Salir" name="Quit"/>
- </menu>
- <menu label="Editar" name="Edit">
- <menu_item_call label="Preferencias..." name="Preferences..."/>
+ <menu label="Yo" name="File">
+ <menu_item_call label="Preferencias" name="Preferences..."/>
+ <menu_item_call label="Salir de [APP_NAME]" name="Quit"/>
</menu>
<menu label="Ayuda" name="Help">
<menu_item_call label="Ayuda de [SECOND_LIFE]" name="Second Life Help"/>
- <menu_item_call label="Acerca de [APP_NAME]..." name="About Second Life..."/>
+ <menu_item_call label="Acerca de [APP_NAME]" name="About Second Life"/>
+ </menu>
+ <menu_item_check label="Mostrar el menú &apos;Debug&apos;" name="Show Debug Menu"/>
+ <menu label="Depurar" name="Debug">
+ <menu_item_call label="Mostrar las configuraciones del depurador" name="Debug Settings"/>
+ <menu_item_call label="Configuraciones del Visor/Color" name="UI/Color Settings"/>
+ <menu label="Pruebas de la interfaz" name="UI Tests"/>
+ <menu_item_call label="Definir el tamaño de la ventana..." name="Set Window Size..."/>
+ <menu_item_call label="Mostrar los &apos;TOS&apos;" name="TOS"/>
+ <menu_item_call label="Mostrar mensaje crítico" name="Critical"/>
+ <menu_item_call label="Web Browser Test" name="Web Browser Test"/>
+ <menu_item_check label="Mostrar el selector de Grid" name="Show Grid Picker"/>
+ <menu_item_call label="Mostrar la consola de notificaciones" name="Show Notifications Console"/>
</menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/es/menu_mini_map.xml b/indra/newview/skins/default/xui/es/menu_mini_map.xml
index 19061cea06..8e464177fe 100644
--- a/indra/newview/skins/default/xui/es/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/es/menu_mini_map.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="popup">
+<menu name="Popup">
<menu_item_call label="Zoom cerca" name="Zoom Close"/>
<menu_item_call label="Zoom medio" name="Zoom Medium"/>
<menu_item_call label="Zoom lejos" name="Zoom Far"/>
+ <menu_item_check label="Girar el mapa" name="Rotate Map"/>
<menu_item_call label="Parar la búsqueda" name="Stop Tracking"/>
- <menu_item_call label="Perfil..." name="Profile"/>
+ <menu_item_call label="Mapa del mundo" name="World Map"/>
</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_navbar.xml b/indra/newview/skins/default/xui/es/menu_navbar.xml
new file mode 100644
index 0000000000..63e5468020
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_navbar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Navbar Menu">
+ <menu_item_check label="Mostrar las coordenadas" name="Show Coordinates"/>
+ <menu_item_check label="Mostrar las propiedades de la parcela" name="Show Parcel Properties"/>
+ <menu_item_call label="Hito" name="Landmark"/>
+ <menu_item_call label="Cortar" name="Cut"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+ <menu_item_call label="Pegar" name="Paste"/>
+ <menu_item_call label="Borrar" name="Delete"/>
+ <menu_item_call label="Seleccionar todo" name="Select All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_nearby_chat.xml b/indra/newview/skins/default/xui/es/menu_nearby_chat.xml
new file mode 100644
index 0000000000..94b281b6c7
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="NearBy Chat Menu">
+ <menu_item_call label="Mostrar la gente que está cerca..." name="nearby_people"/>
+ <menu_item_check label="Ver el texto ignorado" name="muted_text"/>
+ <menu_item_check label="Mostrar los iconos del amigo" name="show_buddy_icons"/>
+ <menu_item_check label="Mostrar los nombres" name="show_names"/>
+ <menu_item_check label="Mostrar los iconos y los nombres" name="show_icons_and_names"/>
+ <menu_item_call label="Tamaño de la fuente" name="font_size"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_notification_well_button.xml b/indra/newview/skins/default/xui/es/menu_notification_well_button.xml
new file mode 100644
index 0000000000..0562d35be7
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_notification_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Notification Well Button Context Menu">
+ <menu_item_call label="Cerrar todo" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_object.xml b/indra/newview/skins/default/xui/es/menu_object.xml
new file mode 100644
index 0000000000..d2743cd4fc
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_object.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Object Pie">
+ <menu_item_call label="Tocar" name="Object Touch"/>
+ <menu_item_call label="Editar" name="Edit..."/>
+ <menu_item_call label="Construir" name="Build"/>
+ <menu_item_call label="Abrir" name="Open"/>
+ <menu_item_call label="Sentarme aquí" name="Object Sit"/>
+ <menu_item_call label="Levantarme" name="Object Stand Up"/>
+ <menu_item_call label="Perfil del objeto" name="Object Inspect"/>
+ <menu_item_call label="Acercar el zoom" name="Zoom In"/>
+ <context_menu label="Ponerme â–¶" name="Put On">
+ <menu_item_call label="Ponerme" name="Wear"/>
+ <context_menu label="Anexar â–¶" name="Object Attach"/>
+ <context_menu label="Anexar como HUD â–¶" name="Object Attach HUD"/>
+ </context_menu>
+ <context_menu label="Quitarme â–¶" name="Remove">
+ <menu_item_call label="Denunciar una infracción" name="Report Abuse..."/>
+ <menu_item_call label="Ignorar" name="Object Mute"/>
+ <menu_item_call label="Devolver" name="Return..."/>
+ <menu_item_call label="Eliminar" name="Delete"/>
+ </context_menu>
+ <menu_item_call label="Comprar" name="Pie Object Bye"/>
+ <menu_item_call label="Tomar" name="Pie Object Take"/>
+ <menu_item_call label="Coger una copia" name="Take Copy"/>
+ <menu_item_call label="Pagar" name="Pay..."/>
+ <menu_item_call label="Comprar" name="Buy..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_object_icon.xml b/indra/newview/skins/default/xui/es/menu_object_icon.xml
new file mode 100644
index 0000000000..7e4578b950
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_object_icon.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Object Icon Menu">
+ <menu_item_call label="Perfil del objeto..." name="Object Profile"/>
+ <menu_item_call label="Ignorar..." name="Block"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_outfit_gear.xml b/indra/newview/skins/default/xui/es/menu_outfit_gear.xml
new file mode 100644
index 0000000000..39afa5e60b
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_outfit_gear.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Gear Outfit">
+ <menu_item_call label="Ponerme - Reemplazar el vestuario actual" name="wear"/>
+ <menu_item_call label="Quitarme - Quitar del vestuario actual" name="take_off"/>
+ <menu label="Ropas nuevas" name="New Clothes">
+ <menu_item_call label="Camisa nueva" name="New Shirt"/>
+ <menu_item_call label="Pantalón nuevo" name="New Pants"/>
+ <menu_item_call label="Zapatos nuevos" name="New Shoes"/>
+ <menu_item_call label="Calcetines nuevos" name="New Socks"/>
+ <menu_item_call label="Chaqueta nueva" name="New Jacket"/>
+ <menu_item_call label="Falda nueva" name="New Skirt"/>
+ <menu_item_call label="Guantes nuevos" name="New Gloves"/>
+ <menu_item_call label="Camiseta nueva" name="New Undershirt"/>
+ <menu_item_call label="Ropa interior nueva" name="New Underpants"/>
+ <menu_item_call label="Nueva Alfa" name="New Alpha"/>
+ <menu_item_call label="Tatuaje nuevo" name="New Tattoo"/>
+ </menu>
+ <menu label="Nuevas partes del cuerpo" name="New Body Parts">
+ <menu_item_call label="Anatomía nueva" name="New Shape"/>
+ <menu_item_call label="Piel nueva" name="New Skin"/>
+ <menu_item_call label="Pelo nuevo" name="New Hair"/>
+ <menu_item_call label="Ojos nuevos" name="New Eyes"/>
+ </menu>
+ <menu_item_call label="Renombrar el vestuario" name="rename"/>
+ <menu_item_call label="Borrar el vestuario" name="delete_outfit"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_outfit_tab.xml b/indra/newview/skins/default/xui/es/menu_outfit_tab.xml
new file mode 100644
index 0000000000..e674d6fa11
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_outfit_tab.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit">
+ <menu_item_call label="Ponerme - Reemplazar el vestuario actual" name="wear_replace"/>
+ <menu_item_call label="Ponerme - Añadir al vestuario actual" name="wear_add"/>
+ <menu_item_call label="Quitarme - Quitar del vestuario actual" name="take_off"/>
+ <menu_item_call label="Editar el vestuario" name="edit"/>
+ <menu_item_call label="Renombrar" name="rename"/>
+ <menu_item_call label="Borrar el vestuario" name="delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_participant_list.xml b/indra/newview/skins/default/xui/es/menu_participant_list.xml
new file mode 100644
index 0000000000..fd8bd05230
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_participant_list.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Participant List Context Menu">
+ <menu_item_check label="Ordenar alfabéticamente" name="SortByName"/>
+ <menu_item_check label="Ordenar según las intervenciones recientes" name="SortByRecentSpeakers"/>
+ <menu_item_call label="Ver el perfil" name="View Profile"/>
+ <menu_item_call label="Añadir como amigo" name="Add Friend"/>
+ <menu_item_call label="MI" name="IM"/>
+ <menu_item_call label="Llamar" name="Call"/>
+ <menu_item_call label="Compartir" name="Share"/>
+ <menu_item_call label="Pagar" name="Pay"/>
+ <menu_item_check label="Ver los iconos de la gente" name="View Icons"/>
+ <menu_item_check label="Ignorar la voz" name="Block/Unblock"/>
+ <menu_item_check label="Ignorar el texto" name="MuteText"/>
+ <context_menu label="Opciones del moderador &gt;" name="Moderator Options">
+ <menu_item_check label="Permitir el chat de texto" name="AllowTextChat"/>
+ <menu_item_call label="Ignorar a este participante" name="ModerateVoiceMuteSelected"/>
+ <menu_item_call label="Quitar el silencio a este participante" name="ModerateVoiceUnMuteSelected"/>
+ <menu_item_call label="Silenciar a todos" name="ModerateVoiceMute"/>
+ <menu_item_call label="Quitar el silencio a todos" name="ModerateVoiceUnmute"/>
+ </context_menu>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/es/menu_people_friends_view_sort.xml
new file mode 100644
index 0000000000..0e883be00e
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_people_friends_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Ordenar alfabéticamente" name="sort_name"/>
+ <menu_item_check label="Ordenar por estatus" name="sort_status"/>
+ <menu_item_check label="Ver los iconos de la gente" name="view_icons"/>
+ <menu_item_call label="Ver la lista de Residentes y Objetos ignorados" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_people_groups.xml b/indra/newview/skins/default/xui/es/menu_people_groups.xml
new file mode 100644
index 0000000000..51bd2c7208
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_people_groups.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Ver la información" name="View Info"/>
+ <menu_item_call label="Chat" name="Chat"/>
+ <menu_item_call label="Llamar" name="Call"/>
+ <menu_item_call label="Activar" name="Activate"/>
+ <menu_item_call label="Dejar" name="Leave"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/es/menu_people_groups_view_sort.xml
new file mode 100644
index 0000000000..1bd3efb611
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_people_groups_view_sort.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Mostrar los iconos de grupo" name="Display Group Icons"/>
+ <menu_item_call label="Dejar el grupo seleccionado" name="Leave Selected Group"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_people_nearby.xml b/indra/newview/skins/default/xui/es/menu_people_nearby.xml
new file mode 100644
index 0000000000..dc1486d879
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_people_nearby.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Avatar Context Menu">
+ <menu_item_call label="Ver el perfil" name="View Profile"/>
+ <menu_item_call label="Añadir como amigo" name="Add Friend"/>
+ <menu_item_call label="Quitarle como amigo" name="Remove Friend"/>
+ <menu_item_call label="MI" name="IM"/>
+ <menu_item_call label="Llamar" name="Call"/>
+ <menu_item_call label="Mapa" name="Map"/>
+ <menu_item_call label="Compartir" name="Share"/>
+ <menu_item_call label="Pagar" name="Pay"/>
+ <menu_item_check label="Ignorar / No ignorar" name="Block/Unblock"/>
+ <menu_item_call label="Ofrecer teleporte" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/es/menu_people_nearby_multiselect.xml
new file mode 100644
index 0000000000..4ab6000994
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_people_nearby_multiselect.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Multi-Selected People Context Menu">
+ <menu_item_call label="Añadir como amigos" name="Add Friends"/>
+ <menu_item_call label="Quitar amigos" name="Remove Friend"/>
+ <menu_item_call label="MI" name="IM"/>
+ <menu_item_call label="Llamar" name="Call"/>
+ <menu_item_call label="Compartir" name="Share"/>
+ <menu_item_call label="Pagar" name="Pay"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/es/menu_people_nearby_view_sort.xml
new file mode 100644
index 0000000000..f0fe383c0c
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_people_nearby_view_sort.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Ordenar según las intervenciones recientes" name="sort_by_recent_speakers"/>
+ <menu_item_check label="Ordenar alfabéticamente" name="sort_name"/>
+ <menu_item_check label="Ordenar según distancia" name="sort_distance"/>
+ <menu_item_check label="Ver los iconos de la gente" name="view_icons"/>
+ <menu_item_call label="Ver la lista de Residentes y Objetos ignorados" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/es/menu_people_recent_view_sort.xml
new file mode 100644
index 0000000000..e4aaa89110
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_people_recent_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Ordenar por los más recientes" name="sort_most"/>
+ <menu_item_check label="Ordenar alfabéticamente" name="sort_name"/>
+ <menu_item_check label="Ver los iconos de la gente" name="view_icons"/>
+ <menu_item_call label="Ver la lista de Residentes y Objetos ignorados" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_picks.xml b/indra/newview/skins/default/xui/es/menu_picks.xml
new file mode 100644
index 0000000000..9da68d7c9b
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_picks.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Picks">
+ <menu_item_call label="Información" name="pick_info"/>
+ <menu_item_call label="Editar" name="pick_edit"/>
+ <menu_item_call label="Teleportar" name="pick_teleport"/>
+ <menu_item_call label="Mapa" name="pick_map"/>
+ <menu_item_call label="Eliminar" name="pick_delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_picks_plus.xml b/indra/newview/skins/default/xui/es/menu_picks_plus.xml
new file mode 100644
index 0000000000..cc59bf1d29
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_picks_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="picks_plus_menu">
+ <menu_item_call label="Destacado nuevo" name="create_pick"/>
+ <menu_item_call label="Clasificado nuevo" name="create_classified"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_place.xml b/indra/newview/skins/default/xui/es/menu_place.xml
new file mode 100644
index 0000000000..675f0699e9
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_place.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="place_overflow_menu">
+ <menu_item_call label="Crear un hito" name="landmark"/>
+ <menu_item_call label="Crear un destacado" name="pick"/>
+ <menu_item_call label="Comprar un pase" name="pass"/>
+ <menu_item_call label="Editar" name="edit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_place_add_button.xml b/indra/newview/skins/default/xui/es/menu_place_add_button.xml
new file mode 100644
index 0000000000..4b2f908a06
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_place_add_button.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Añadir una carpeta" name="add_folder"/>
+ <menu_item_call label="Añadir este hito" name="add_landmark"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/es/menu_places_gear_folder.xml
new file mode 100644
index 0000000000..bf46eb58e3
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_places_gear_folder.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Añadir este hito" name="add_landmark"/>
+ <menu_item_call label="Añadir una carpeta" name="add_folder"/>
+ <menu_item_call label="Cortar" name="cut"/>
+ <menu_item_call label="Copiar" name="copy_folder"/>
+ <menu_item_call label="Pegar" name="paste"/>
+ <menu_item_call label="Renombrar" name="rename"/>
+ <menu_item_call label="Borrar" name="delete"/>
+ <menu_item_call label="Abrir" name="expand"/>
+ <menu_item_call label="Cerrar" name="collapse"/>
+ <menu_item_call label="Abrir todas las carpetas" name="expand_all"/>
+ <menu_item_call label="Cerrar todas las carpetas" name="collapse_all"/>
+ <menu_item_check label="Ordenar por fecha" name="sort_by_date"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/es/menu_places_gear_landmark.xml
new file mode 100644
index 0000000000..eac85de846
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_places_gear_landmark.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_ladmark_gear">
+ <menu_item_call label="Teleportar" name="teleport"/>
+ <menu_item_call label="Más información" name="more_info"/>
+ <menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
+ <menu_item_call label="Añadir un hito" name="add_landmark"/>
+ <menu_item_call label="Añadir una carpeta" name="add_folder"/>
+ <menu_item_call label="Cortar" name="cut"/>
+ <menu_item_call label="Copiar el hito" name="copy_landmark"/>
+ <menu_item_call label="Copiar la SLurl" name="copy_slurl"/>
+ <menu_item_call label="Pegar" name="paste"/>
+ <menu_item_call label="Renombrar" name="rename"/>
+ <menu_item_call label="Eliminar" name="delete"/>
+ <menu_item_call label="Abrir todas las carpetas" name="expand_all"/>
+ <menu_item_call label="Cerrar todas las carpetas" name="collapse_all"/>
+ <menu_item_check label="Ordenar por fecha" name="sort_by_date"/>
+ <menu_item_call label="Crear un Destacado" name="create_pick"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_profile_overflow.xml b/indra/newview/skins/default/xui/es/menu_profile_overflow.xml
new file mode 100644
index 0000000000..5ee8c50949
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_profile_overflow.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="profile_overflow_menu">
+ <menu_item_call label="Mapa" name="show_on_map"/>
+ <menu_item_call label="Pagar" name="pay"/>
+ <menu_item_call label="Compartir" name="share"/>
+ <menu_item_call label="Ignorar" name="block"/>
+ <menu_item_call label="Designorar" name="unblock"/>
+ <menu_item_call label="Expulsar" name="kick"/>
+ <menu_item_call label="Congelar" name="freeze"/>
+ <menu_item_call label="Descongelar" name="unfreeze"/>
+ <menu_item_call label="CSR" name="csr"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_save_outfit.xml b/indra/newview/skins/default/xui/es/menu_save_outfit.xml
new file mode 100644
index 0000000000..a04ec75b60
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_save_outfit.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="save_outfit_menu">
+ <menu_item_call label="Guardar" name="save_outfit"/>
+ <menu_item_call label="Guardar como" name="save_as_new_outfit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_script_chiclet.xml b/indra/newview/skins/default/xui/es/menu_script_chiclet.xml
new file mode 100644
index 0000000000..f517baf566
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_script_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="ScriptChiclet Menu">
+ <menu_item_call label="Cerrar" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_slurl.xml b/indra/newview/skins/default/xui/es/menu_slurl.xml
index 5c5900ae56..ca19acec6e 100644
--- a/indra/newview/skins/default/xui/es/menu_slurl.xml
+++ b/indra/newview/skins/default/xui/es/menu_slurl.xml
@@ -2,5 +2,5 @@
<menu name="Popup">
<menu_item_call label="Acerca de la URL" name="about_url"/>
<menu_item_call label="Teleportar a la URL" name="teleport_to_url"/>
- <menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
+ <menu_item_call label="Mapa" name="show_on_map"/>
</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_teleport_history_gear.xml b/indra/newview/skins/default/xui/es/menu_teleport_history_gear.xml
new file mode 100644
index 0000000000..b708f3bc20
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_teleport_history_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Teleport History Gear Context Menu">
+ <menu_item_call label="Abrir todas las carpetas" name="Expand all folders"/>
+ <menu_item_call label="Cerrar todas las carpetas" name="Collapse all folders"/>
+ <menu_item_call label="Limpiar el historial de teleportes" name="Clear Teleport History"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml
new file mode 100644
index 0000000000..ed33c55aca
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_teleport_history_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Teleportarse" name="Teleport"/>
+ <menu_item_call label="Más información" name="More Information"/>
+ <menu_item_call label="Copiar al portapapeles" name="CopyToClipboard"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_teleport_history_tab.xml b/indra/newview/skins/default/xui/es/menu_teleport_history_tab.xml
new file mode 100644
index 0000000000..17e90422a5
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_teleport_history_tab.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Abrir" name="TabOpen"/>
+ <menu_item_call label="Cerrar" name="TabClose"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_text_editor.xml b/indra/newview/skins/default/xui/es/menu_text_editor.xml
new file mode 100644
index 0000000000..095e461734
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_text_editor.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Text editor context menu">
+ <menu_item_call label="Cortar" name="Cut"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+ <menu_item_call label="Pegar" name="Paste"/>
+ <menu_item_call label="Borrar" name="Delete"/>
+ <menu_item_call label="Seleccionar todo" name="Select All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_url_agent.xml b/indra/newview/skins/default/xui/es/menu_url_agent.xml
new file mode 100644
index 0000000000..a089c8f68e
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_url_agent.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar el perfil del Residente" name="show_agent"/>
+ <menu_item_call label="Copiar el nombre al portapapeles" name="url_copy_label"/>
+ <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_url_group.xml b/indra/newview/skins/default/xui/es/menu_url_group.xml
new file mode 100644
index 0000000000..79374b9739
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_url_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar la información del grupo" name="show_group"/>
+ <menu_item_call label="Copiar el grupo al portapapeles" name="url_copy_label"/>
+ <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_url_http.xml b/indra/newview/skins/default/xui/es/menu_url_http.xml
new file mode 100644
index 0000000000..585c059ff3
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_url_http.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Abrir la página web" name="url_open"/>
+ <menu_item_call label="Abrir en el navegador incorporado" name="url_open_internal"/>
+ <menu_item_call label="Abrir en mi navegador" name="url_open_external"/>
+ <menu_item_call label="Copiar la URL al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_url_inventory.xml b/indra/newview/skins/default/xui/es/menu_url_inventory.xml
new file mode 100644
index 0000000000..13a8711c76
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_url_inventory.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar ítem del inventario" name="show_item"/>
+ <menu_item_call label="Copiar el nombre al portapapeles" name="url_copy_label"/>
+ <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_url_map.xml b/indra/newview/skins/default/xui/es/menu_url_map.xml
new file mode 100644
index 0000000000..f96a0c7170
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_url_map.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
+ <menu_item_call label="Teleportarse a la localización" name="teleport_to_location"/>
+ <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_url_objectim.xml b/indra/newview/skins/default/xui/es/menu_url_objectim.xml
new file mode 100644
index 0000000000..8791a290af
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_url_objectim.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar la información del objeto" name="show_object"/>
+ <menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
+ <menu_item_call label="Teleportarse a la posición del objeto" name="teleport_to_object"/>
+ <menu_item_call label="Copiar el nombre del objeto al portapapeles" name="url_copy_label"/>
+ <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_url_parcel.xml b/indra/newview/skins/default/xui/es/menu_url_parcel.xml
new file mode 100644
index 0000000000..9e789ef8ee
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_url_parcel.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar la información de la parcela" name="show_parcel"/>
+ <menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
+ <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_url_slapp.xml b/indra/newview/skins/default/xui/es/menu_url_slapp.xml
new file mode 100644
index 0000000000..7147dcd3cf
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_url_slapp.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Ejecutar este comando" name="run_slapp"/>
+ <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_url_slurl.xml b/indra/newview/skins/default/xui/es/menu_url_slurl.xml
new file mode 100644
index 0000000000..4ab47c2f61
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_url_slurl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar la información del lugar" name="show_place"/>
+ <menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
+ <menu_item_call label="Teleportarse a este lugar" name="teleport_to_location"/>
+ <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_url_teleport.xml b/indra/newview/skins/default/xui/es/menu_url_teleport.xml
new file mode 100644
index 0000000000..8f86a91be3
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_url_teleport.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Teleportarse a este lugar" name="teleport"/>
+ <menu_item_call label="Mostrar en el mapa" name="show_on_map"/>
+ <menu_item_call label="Copiar la SLurl al portapapeles" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/menu_viewer.xml b/indra/newview/skins/default/xui/es/menu_viewer.xml
index fdb6a92084..f56ab00bf6 100644
--- a/indra/newview/skins/default/xui/es/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/es/menu_viewer.xml
@@ -1,217 +1,320 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
- <menu name="Me">
+ <menu label="Yo" name="Me">
<menu_item_call label="Preferencias" name="Preferences"/>
- <menu_item_call name="Manage My Account">
- <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=es" />
+ <menu_item_call label="Mi panel de control" name="Manage My Account">
+ <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=es"/>
</menu_item_call>
+ <menu_item_call label="Comprar L$" name="Buy and Sell L$"/>
+ <menu_item_call label="Mi perfil" name="Profile"/>
+ <menu_item_call label="Cambiar vestuario" name="ChangeOutfit"/>
+ <menu_item_check label="Mi Inventario" name="Inventory"/>
+ <menu_item_check label="Mi Inventario" name="ShowSidetrayInventory"/>
+ <menu_item_check label="Mis gestos" name="Gestures"/>
+ <menu_item_check label="Mi voz" name="ShowVoice"/>
+ <menu label="Mi estado" name="Status">
+ <menu_item_call label="Ausente" name="Set Away"/>
+ <menu_item_call label="Ocupado" name="Set Busy"/>
+ </menu>
+ <menu_item_call label="Solicitar estatus de Administrador" name="Request Admin Options"/>
+ <menu_item_call label="Dejar el estatus de Administrador" name="Leave Admin Options"/>
+ <menu_item_call label="Salir de [APP_NAME]" name="Quit"/>
</menu>
- <menu label="Archivo" name="File">
- <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
- <menu label="Subir" name="upload">
- <menu_item_call label="Imagen ([COST] L$)..." name="Upload Image"/>
- <menu_item_call label="Sonido ([COST] L$)..." name="Upload Sound"/>
- <menu_item_call label="Animación ([COST] L$)..." name="Upload Animation"/>
- <menu_item_call label="Masiva ([COST] L$ por archivo)..." name="Bulk Upload"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Definir los permisos por defecto..." name="perm prefs"/>
- </menu>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Cerrar la ventana" name="Close Window"/>
- <menu_item_call label="Cerrar todas las ventanas" name="Close All Windows"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Guardar la textura como..." name="Save Texture As..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Hacer una foto" name="Take Snapshot"/>
- <menu_item_call label="Guardar una foto" name="Snapshot to Disk"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Salir" name="Quit"/>
- </menu>
- <menu label="Editar" name="Edit">
- <menu_item_call label="Deshacer" name="Undo"/>
- <menu_item_call label="Rehacer" name="Redo"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Cortar" name="Cut"/>
- <menu_item_call label="Copiar" name="Copy"/>
- <menu_item_call label="Pegar" name="Paste"/>
- <menu_item_call label="Borrar" name="Delete"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Buscar..." name="Search..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Seleccionar todo" name="Select All"/>
- <menu_item_call label="Deseleccionar" name="Deselect"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Duplicar" name="Duplicate"/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu label="Anexar el objeto" name="Attach Object"/>
- <menu label="Quitarse el objeto" name="Detach Object"/>
- <menu label="Quitarse ropa" name="Take Off Clothing">
- <menu_item_call label="Camisa" name="Shirt"/>
- <menu_item_call label="Pantalones" name="Pants"/>
- <menu_item_call label="Zapatos" name="Shoes"/>
- <menu_item_call label="Calcetines" name="Socks"/>
- <menu_item_call label="Chaqueta" name="Jacket"/>
- <menu_item_call label="Guantes" name="Gloves"/>
- <menu_item_call label="Camiseta" name="Menu Undershirt"/>
- <menu_item_call label="Ropa interior" name="Menu Underpants"/>
- <menu_item_call label="Falda" name="Skirt"/>
- <menu_item_call label="Toda la ropa" name="All Clothes"/>
- </menu>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Gestos..." name="Gestures..."/>
- <menu_item_call label="Perfil..." name="Profile..."/>
- <menu_item_call label="Apariencia..." name="Appearance..."/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu_item_check label="Amigos..." name="Friends..."/>
- <menu_item_call label="Grupos..." name="Groups..."/>
- <menu_item_separator label="-----------" name="separator8"/>
- <menu_item_call label="Preferencias..." name="Preferences..."/>
- </menu>
- <menu label="Ver" name="View">
- <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
- <menu_item_call label="Vista subjetiva" name="Mouselook"/>
- <menu_item_check label="Construir" name="Build"/>
- <menu_item_check label="Flycam del joystick" name="Joystick Flycam"/>
- <menu_item_call label="Volver a la vista por defecto" name="Reset View"/>
- <menu_item_call label="Mirar al último que habló" name="Look at Last Chatter"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Barra de herramientas" name="Toolbar"/>
- <menu_item_check label="Chat" name="Chat History"/>
- <menu_item_check label="Comunicarse" name="Instant Message"/>
- <menu_item_check label="Inventario" name="Inventory"/>
- <menu_item_check label="Participantes activos" name="Active Speakers"/>
- <menu_item_check label="Lista de ignorados" name="Mute List"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_check label="Controles de la cámara" name="Camera Controls"/>
- <menu_item_check label="Controles del movimiento" name="Movement Controls"/>
- <menu_item_check label="Mapa del mundo" name="World Map"/>
- <menu_item_check label="Minimapa" name="Mini-Map"/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_check label="Estadísticas" name="Statistics Bar"/>
- <menu_item_check label="Límites de las parcelas" name="Property Lines"/>
- <menu_item_check label="Líneas de prohibición" name="Banlines"/>
- <menu_item_check label="Propietarios del terreno" name="Land Owners"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu label="Información adicional" name="Hover Tips">
- <menu_item_check label="Mostrar información adicional." name="Show Tips"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Información adicional del terreno" name="Land Tips"/>
- <menu_item_check label="Información adicional en todos los objetos" name="Tips On All Objects"/>
- </menu>
- <menu_item_check label="Realzar las transparencias" name="Highlight Transparent"/>
- <menu_item_check label="Balizas" name="beacons"/>
- <menu_item_check label="Ocultar las partículas" name="Hide Particles"/>
- <menu_item_check label="Mostrar los HUD en uso" name="Show HUD Attachments"/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu_item_call label="Acercar el zoom" name="Zoom In"/>
- <menu_item_call label="Zoom predeterminado" name="Zoom Default"/>
- <menu_item_call label="Alejar el zoom" name="Zoom Out"/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Pantalla completa" name="Toggle Fullscreen"/>
- <menu_item_call label="Interfaz en el tamaño predeterminado" name="Set UI Size to Default"/>
+ <menu label="Comunicarme" name="Communicate">
+ <menu_item_call label="Mis amigos" name="My Friends"/>
+ <menu_item_call label="Mis grupos" name="My Groups"/>
+ <menu_item_check label="Chat" name="Nearby Chat"/>
+ <menu_item_call label="Gente cerca" name="Active Speakers"/>
</menu>
<menu label="Mundo" name="World">
- <menu_item_call label="Chat" name="Chat"/>
- <menu_item_check label="Correr siempre" name="Always Run"/>
- <menu_item_check label="Volar" name="Fly"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Crear aquí un hito" name="Create Landmark Here"/>
+ <menu_item_check label="Minimapa" name="Mini-Map"/>
+ <menu_item_check label="Mapa del mundo" name="World Map"/>
+ <menu_item_call label="Foto" name="Take Snapshot"/>
+ <menu_item_call label="Crear un hito de este sitio" name="Create Landmark Here"/>
+ <menu label="Perfil del lugar" name="Land">
+ <menu_item_call label="Perfil del lugar" name="Place Profile"/>
+ <menu_item_call label="Acerca del terreno" name="About Land"/>
+ <menu_item_call label="Región/Estado" name="Region/Estate"/>
+ </menu>
+ <menu_item_call label="Comprar este terreno" name="Buy Land"/>
+ <menu_item_call label="Mi terreno" name="My Land"/>
+ <menu label="Mostrar" name="LandShow">
+ <menu_item_check label="Controles del movimiento" name="Movement Controls"/>
+ <menu_item_check label="Controles de la cámara" name="Camera Controls"/>
+ <menu_item_check label="Líneas de prohibición" name="Ban Lines"/>
+ <menu_item_check label="Balizas" name="beacons"/>
+ <menu_item_check label="Límites de las parcelas" name="Property Lines"/>
+ <menu_item_check label="Propietarios del terreno" name="Land Owners"/>
+ <menu_item_check label="Coordenadas" name="Coordinates"/>
+ <menu_item_check label="Propiedades de la parcela" name="Parcel Properties"/>
+ </menu>
+ <menu_item_call label="Teleportar a la Base" name="Teleport Home"/>
<menu_item_call label="Fijar mi Base aquí" name="Set Home to Here"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Teleportar a mi Base" name="Teleport Home"/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Pasar al estado ausente" name="Set Away"/>
- <menu_item_call label="Pasar al estado ocupado" name="Set Busy"/>
- <menu_item_call label="Parar la animación de mi avatar" name="Stop Animating My Avatar"/>
- <menu_item_call label="Recuperar las teclas" name="Release Keys"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Historial de mi cuenta..." name="Account History...">
- <on_click name="AccountHistory_url" userdata="WebLaunchAccountHistory,http://secondlife.com/account/transactions.php?lang=es"/>
- </menu_item_call>
- <menu_item_call label="Administrar mi cuenta..." name="Manage My Account...">
- <on_click name="ManageMyAccount_url" userdata="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=es"/>
- </menu_item_call>
- <menu_item_call label="Comprar L$..." name="Buy and Sell L$..."/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu_item_call label="Mi terreno..." name="My Land..."/>
- <menu_item_call label="Acerca del terreno..." name="About Land..."/>
- <menu_item_call label="Comprar terreno..." name="Buy Land..."/>
- <menu_item_call label="Region/Estado..." name="Region/Estate..."/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu label="Configuración del entorno" name="Environment Settings">
+ <menu label="Sol" name="Environment Settings">
<menu_item_call label="Amanecer" name="Sunrise"/>
<menu_item_call label="Mediodía" name="Noon"/>
<menu_item_call label="Atardecer" name="Sunset"/>
<menu_item_call label="Medianoche" name="Midnight"/>
- <menu_item_call label="Volver a los valores por defecto de la región" name="Revert to Region Default"/>
- <menu_item_separator label="-----------" name="separator"/>
+ <menu_item_call label="Hora del Estado" name="Revert to Region Default"/>
<menu_item_call label="Editor del entorno" name="Environment Editor"/>
</menu>
</menu>
- <menu label="Herramientas" name="Tools">
- <menu label="Elegir una herramienta" name="Select Tool">
- <menu_item_call label="Visión" name="Focus"/>
- <menu_item_call label="Moverse" name="Move"/>
- <menu_item_call label="Modificar" name="Edit"/>
- <menu_item_call label="Crear" name="Create"/>
- <menu_item_call label="Terreno" name="Land"/>
- </menu>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Seleccionar sólo mis objetos" name="Select Only My Objects"/>
- <menu_item_check label="Seleccionar sólo objetos movibles" name="Select Only Movable Objects"/>
- <menu_item_check label="Seleccionar marcando los alrededores" name="Select By Surrounding"/>
- <menu_item_check label="Al seleccionar, mostrar los ocultos" name="Show Hidden Selection"/>
- <menu_item_check label="Al seleccionar, mostrar el radio de la luz" name="Show Light Radius for Selection"/>
- <menu_item_check label="Mostrar rayo indicador" name="Show Selection Beam"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_check label="Ajustar a la cuadrícula" name="Snap to Grid"/>
- <menu_item_call label="Ajustar a la cuadrícula los ejes X e Y" name="Snap Object XY to Grid"/>
- <menu_item_call label="Usar lo seleccionado como cuadrícula" name="Use Selection for Grid"/>
- <menu_item_call label="Opciones de la cuadrícula..." name="Grid Options..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_check label="Editar las partes enlazadas" name="Edit Linked Parts"/>
+ <menu label="Construir" name="BuildTools">
+ <menu_item_check label="Construir" name="Show Build Tools"/>
+ <menu label="Seleccionar la herramienta de construcción" name="Select Tool">
+ <menu_item_call label="Herramienta Visión" name="Focus"/>
+ <menu_item_call label="Herramienta Mover" name="Move"/>
+ <menu_item_call label="Herramienta Editar" name="Edit"/>
+ <menu_item_call label="Herramienta Crear" name="Create"/>
+ <menu_item_call label="Herramienta Terreno" name="Land"/>
+ </menu>
<menu_item_call label="Enlazar" name="Link"/>
<menu_item_call label="Desenlazar" name="Unlink"/>
- <menu_item_separator label="-----------" name="separator4"/>
+ <menu_item_check label="Editar las partes enlazadas" name="Edit Linked Parts"/>
+ <menu label="Seleccionar las partes enlazadas" name="Select Linked Parts">
+ <menu_item_call label="Seleccionar la parte siguiente" name="Select Next Part"/>
+ <menu_item_call label="Seleccionar la parte previa" name="Select Previous Part"/>
+ <menu_item_call label="Incluir la parte siguiente" name="Include Next Part"/>
+ <menu_item_call label="Incluir la parte previa" name="Include Previous Part"/>
+ </menu>
<menu_item_call label="Visión en lo seleccionado" name="Focus on Selection"/>
<menu_item_call label="Zoom en lo seleccionado" name="Zoom to Selection"/>
- <menu_item_call label="Comprar el objeto" name="Menu Object Take">
- <on_enable userdata="Comprar el objeto,Coger el objeto" name="EnableBuyOrTake"/>
- </menu_item_call>
- <menu_item_call label="Coger una copia" name="Take Copy"/>
- <menu_item_call label="Devolver una copia del objeto a los contenidos de donde salió" name="Save Object Back to Object Contents"/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Ver en una ventana los errores o alertas de los scripts" name="Show Script Warning/Error Window"/>
- <menu label="Recompilar los scripts en lo seleccionado" name="Recompile Scripts in Selection">
- <menu_item_call label="Mono" name="Mono"/>
- <menu_item_call label="LSL" name="LSL"/>
- </menu>
- <menu_item_call label="Reiniciar los scripts en lo seleccionado" name="Reset Scripts in Selection"/>
- <menu_item_call label="Definir los scripts a ejecutar en lo seleccionado" name="Set Scripts to Running in Selection"/>
- <menu_item_call label="Definir los scripts a no ejecutar en lo seleccionado" name="Set Scripts to Not Running in Selection"/>
+ <menu label="Objeto" name="Object">
+ <menu_item_call label="Comprar" name="Menu Object Buy"/>
+ <menu_item_call label="Tomar" name="Menu Object Take"/>
+ <menu_item_call label="Coger una copia" name="Take Copy"/>
+ <menu_item_call label="Guardar una copia en mi inventario" name="Save Object Back to My Inventory"/>
+ <menu_item_call label="Guardar una copia del objeto en los contenidos de donde salió" name="Save Object Back to Object Contents"/>
+ </menu>
+ <menu label="Scripts" name="Scripts">
+ <menu_item_call label="Recompilar los scripts (Mono)" name="Mono"/>
+ <menu_item_call label="Recompilar los scripts (LSL)" name="LSL"/>
+ <menu_item_call label="Reiniciar los scripts" name="Reset Scripts"/>
+ <menu_item_call label="Definir los scripts a ejecutar" name="Set Scripts to Running"/>
+ <menu_item_call label="Configurar scripts como no ejecutándose" name="Set Scripts to Not Running"/>
+ </menu>
+ <menu label="Opciones" name="Options">
+ <menu_item_call label="Configurar los permisos por defecto de subida" name="perm prefs"/>
+ <menu_item_check label="Mostrar los permisos avanzados" name="DebugPermissions"/>
+ <menu_item_check label="Seleccionar sólo mis objetos" name="Select Only My Objects"/>
+ <menu_item_check label="Seleccionar sólo los objetos movibles" name="Select Only Movable Objects"/>
+ <menu_item_check label="Seleccionar marcando los alrededores" name="Select By Surrounding"/>
+ <menu_item_check label="Al seleccionar, mostrar lo oculto" name="Show Hidden Selection"/>
+ <menu_item_check label="Al seleccionar, mostrar el radio de la luz" name="Show Light Radius for Selection"/>
+ <menu_item_check label="Mostrar el rayo indicador" name="Show Selection Beam"/>
+ <menu_item_check label="Ajustar a la cuadrícula" name="Snap to Grid"/>
+ <menu_item_call label="Ajustar a la cuadrícula los ejes X e Y" name="Snap Object XY to Grid"/>
+ <menu_item_call label="Usar lo seleccionado como cuadrícula" name="Use Selection for Grid"/>
+ <menu_item_call label="Opciones de la cuadrícula" name="Grid Options"/>
+ </menu>
+ <menu label="Subir" name="Upload">
+ <menu_item_call label="Imagen ([COST] L$)..." name="Upload Image"/>
+ <menu_item_call label="Sonido ([COST] L$)..." name="Upload Sound"/>
+ <menu_item_call label="Animación ([COST] L$)..." name="Upload Animation"/>
+ <menu_item_call label="Masivo ([COST] L$ por archivo)..." name="Bulk Upload"/>
+ </menu>
</menu>
<menu label="Ayuda" name="Help">
<menu_item_call label="Ayuda de [SECOND_LIFE]" name="Second Life Help"/>
- <menu_item_call label="Tutorial" name="Tutorial"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Blog oficial..." name="Official Linden Blog..."/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Portal de programación..." name="Scripting Portal..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Denunciar una infracción..." name="Report Abuse..."/>
- <menu_item_call label="Choques, empujones, e impactos..." name="Bumps, Pushes &amp;amp; Hits..."/>
- <menu_item_call label="Medidor del lag" name="Lag Meter"/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu label="Informes de fallos" name="Bug Reporting">
- <menu_item_call label="Public Issue Tracker..." name="Public Issue Tracker..."/>
- <menu_item_call label="Ayuda del Public Issue Tracker..." name="Publc Issue Tracker Help..."/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu_item_call label="Informes de fallos - instrucciones..." name="Bug Reporing 101..."/>
- <menu_item_call label="Problemas de seguridad..." name="Security Issues..."/>
- <menu_item_call label="Wiki QA..." name="QA Wiki..."/>
- <menu_item_separator label="-----------" name="separator9"/>
- <menu_item_call label="Informar de un fallo..." name="Report Bug..."/>
- </menu>
- <menu_item_call label="Acerca de [APP_NAME]..." name="About Second Life..."/>
+ <menu_item_call label="Denunciar una infracción" name="Report Abuse"/>
+ <menu_item_call label="Informar de un fallo" name="Report Bug"/>
+ <menu_item_call label="Acerca de [APP_NAME]" name="About Second Life"/>
+ </menu>
+ <menu label="Avanzado" name="Advanced">
+ <menu_item_check label="Mostrar el menú Avanzado" name="Show Advanced Menu"/>
+ <menu_item_call label="Parar mis animaciones" name="Stop Animating My Avatar"/>
+ <menu_item_call label="Recargar las texturas" name="Rebake Texture"/>
+ <menu_item_call label="Interfaz en el tamaño predeterminado" name="Set UI Size to Default"/>
+ <menu_item_call label="Definir el tamaño de la ventana..." name="Set Window Size..."/>
+ <menu_item_check label="Limitar la distancia para Seleccionar" name="Limit Select Distance"/>
+ <menu_item_check label="Desactivar los límites de la cámara" name="Disable Camera Distance"/>
+ <menu_item_check label="Foto en Alta Resolución" name="HighResSnapshot"/>
+ <menu_item_check label="Silenciar el Guardar una foto" name="QuietSnapshotsToDisk"/>
+ <menu_item_check label="Comprimir las fotos para el disco duro" name="CompressSnapshotsToDisk"/>
+ <menu label="Herramientas de rendimiento" name="Performance Tools">
+ <menu_item_call label="Medidor de lag" name="Lag Meter"/>
+ <menu_item_check label="Estadísticas" name="Statistics Bar"/>
+ <menu_item_check label="Mostrar cuánto cuesta renderizar el avatar" name="Avatar Rendering Cost"/>
+ </menu>
+ <menu label="Realzando y Visibilidad" name="Highlighting and Visibility">
+ <menu_item_check label="Baliza con destellos" name="Cheesy Beacon"/>
+ <menu_item_check label="Ocultar las partículas" name="Hide Particles"/>
+ <menu_item_check label="Ocultar lo seleccionado" name="Hide Selected"/>
+ <menu_item_check label="Realzar las transparencias" name="Highlight Transparent"/>
+ <menu_item_check label="Mostrar los HUD anexados" name="Show HUD Attachments"/>
+ <menu_item_check label="Mostrar el Punto de Mira en la vista subjetiva" name="ShowCrosshairs"/>
+ </menu>
+ <menu label="Objetos representados" name="Rendering Types">
+ <menu_item_check label="Simple" name="Simple"/>
+ <menu_item_check label="Alfa" name="Alpha"/>
+ <menu_item_check label="Ãrbol" name="Tree"/>
+ <menu_item_check label="Avatares" name="Character"/>
+ <menu_item_check label="Superficie del terreno" name="SurfacePath"/>
+ <menu_item_check label="Cielo" name="Sky"/>
+ <menu_item_check label="Agua" name="Water"/>
+ <menu_item_check label="Terreno" name="Ground"/>
+ <menu_item_check label="volumen" name="Volume"/>
+ <menu_item_check label="Hierba" name="Grass"/>
+ <menu_item_check label="Nubes" name="Clouds"/>
+ <menu_item_check label="Partículas" name="Particles"/>
+ <menu_item_check label="Efectos de relieve" name="Bump"/>
+ </menu>
+ <menu label="Rasgos renderizados" name="Rendering Features">
+ <menu_item_check label="UI" name="UI"/>
+ <menu_item_check label="Seleccionado" name="Selected"/>
+ <menu_item_check label="Realzados" name="Highlighted"/>
+ <menu_item_check label="Texturas dinámicas" name="Dynamic Textures"/>
+ <menu_item_check label="Huellas" name="Foot Shadows"/>
+ <menu_item_check label="Niebla" name="Fog"/>
+ <menu_item_check label="Objetos flexibles" name="Flexible Objects"/>
+ </menu>
+ <menu_item_check label="Ejecutar múltiples temas" name="Run Multiple Threads"/>
+ <menu_item_check label="Usar Plugin Read Thread" name="Use Plugin Read Thread"/>
+ <menu_item_call label="Vaciar la caché de grupo" name="ClearGroupCache"/>
+ <menu_item_check label="Vista subjetiva suavizada" name="Mouse Smoothing"/>
+ <menu label="Atajos de teclado" name="Shortcuts">
+ <menu_item_call label="Imagen ([COST] L$)..." name="Upload Image"/>
+ <menu_item_check label="Buscar" name="Search"/>
+ <menu_item_call label="Recuperar las teclas" name="Release Keys"/>
+ <menu_item_call label="Interfaz en el tamaño predeterminado" name="Set UI Size to Default"/>
+ <menu_item_check label="Correr siempre" name="Always Run"/>
+ <menu_item_check label="Volar" name="Fly"/>
+ <menu_item_call label="Cerrar la ventana" name="Close Window"/>
+ <menu_item_call label="Cerrar todas las ventanas" name="Close All Windows"/>
+ <menu_item_call label="Guardar una foto" name="Snapshot to Disk"/>
+ <menu_item_call label="Vista subjetiva" name="Mouselook"/>
+ <menu_item_check label="Flycam del joystick" name="Joystick Flycam"/>
+ <menu_item_call label="Volver a la vista por defecto" name="Reset View"/>
+ <menu_item_call label="Mirar al último que habló" name="Look at Last Chatter"/>
+ <menu label="Seleccionar la herramienta de construcción" name="Select Tool">
+ <menu_item_call label="Herramienta Visión" name="Focus"/>
+ <menu_item_call label="Herramienta Mover" name="Move"/>
+ <menu_item_call label="Herramienta Editar" name="Edit"/>
+ <menu_item_call label="Herramienta Crear" name="Create"/>
+ <menu_item_call label="Herramienta Terreno" name="Land"/>
+ </menu>
+ <menu_item_call label="Acercar el zoom" name="Zoom In"/>
+ <menu_item_call label="Zoom por defecto" name="Zoom Default"/>
+ <menu_item_call label="Alejar el zoom" name="Zoom Out"/>
+ </menu>
+ <menu_item_call label="Mostrar las configuraciones del depurador" name="Debug Settings"/>
+ <menu_item_check label="Mostrar el menú &apos;Develop&apos;" name="Debug Mode"/>
+ </menu>
+ <menu label="Develop" name="Develop">
+ <menu label="Consoles" name="Consoles">
+ <menu_item_check label="Texture Console" name="Texture Console"/>
+ <menu_item_check label="Debug Console" name="Debug Console"/>
+ <menu_item_call label="Notifications Console" name="Notifications"/>
+ <menu_item_check label="Texture Size Console" name="Texture Size"/>
+ <menu_item_check label="Texture Category Console" name="Texture Category"/>
+ <menu_item_check label="Fast Timers" name="Fast Timers"/>
+ <menu_item_check label="Memory" name="Memory"/>
+ <menu_item_call label="Region Info to Debug Console" name="Region Info to Debug Console"/>
+ <menu_item_check label="Camera" name="Camera"/>
+ <menu_item_check label="Wind" name="Wind"/>
+ <menu_item_check label="Badge" name="Badge"/>
+ </menu>
+ <menu label="Show Info" name="Display Info">
+ <menu_item_check label="Show Time" name="Show Time"/>
+ <menu_item_check label="Show Render Info" name="Show Render Info"/>
+ <menu_item_check label="Show Color Under Cursor" name="Show Color Under Cursor"/>
+ <menu_item_check label="Show Updates to Objects" name="Show Updates"/>
+ </menu>
+ <menu label="Force an Error" name="Force Errors">
+ <menu_item_call label="Force Breakpoint" name="Force Breakpoint"/>
+ <menu_item_call label="FForce LLError And Crash" name="Force LLError And Crash"/>
+ <menu_item_call label="Force Bad Memory Access" name="Force Bad Memory Access"/>
+ <menu_item_call label="Force an Infinite Loop" name="Force Infinite Loop"/>
+ <menu_item_call label="Force Driver Crash" name="Force Driver Carsh"/>
+ <menu_item_call label="Force Software Exception" name="Force Software Exception"/>
+ <menu_item_call label="Force Disconnect Viewer" name="Force Disconnect Viewer"/>
+ <menu_item_call label="Simulate a Memory Leak" name="Memory Leaking Simulation"/>
+ </menu>
+ <menu label="Render Tests" name="Render Tests">
+ <menu_item_check label="Camera Offset" name="Camera Offset"/>
+ <menu_item_check label="Randomize Framerate" name="Randomize Framerate"/>
+ <menu_item_check label="Frame Test" name="Frame Test"/>
+ </menu>
+ <menu label="Rendering" name="Rendering">
+ <menu_item_check label="Axes" name="Axes"/>
+ <menu_item_check label="Wireframe" name="Wireframe"/>
+ <menu_item_check label="Global Illumination" name="Global Illumination"/>
+ <menu_item_check label="Animation Textures" name="Animation Textures"/>
+ <menu_item_check label="Disable Textures" name="Disable Textures"/>
+ <menu_item_check label="Render Attached Lights" name="Render Attached Lights"/>
+ <menu_item_check label="Render Attached Particles" name="Render Attached Particles"/>
+ <menu_item_check label="Hover Glow Objects" name="Hover Glow Objects"/>
+ </menu>
+ <menu label="Red" name="Network">
+ <menu_item_check label="Pause Avatar" name="AgentPause"/>
+ <menu_item_call label="Drop a Packet" name="Drop a Packet"/>
+ </menu>
+ <menu_item_call label="Bumps, Pushes &amp; Hits" name="Bumps, Pushes &amp;amp; Hits"/>
+ <menu label="World" name="World">
+ <menu_item_check label="Region Sun Override" name="Sim Sun Override"/>
+ <menu_item_check label="Beacon flashing effect" name="Cheesy Beacon"/>
+ <menu_item_check label="Fixed Weather" name="Fixed Weather"/>
+ <menu_item_call label="Dump Region Object Cache" name="Dump Region Object Cache"/>
+ </menu>
+ <menu label="UI" name="UI">
+ <menu_item_call label="Web Browser Test" name="Web Browser Test"/>
+ <menu_item_call label="Print Selected Object Info" name="Print Selected Object Info"/>
+ <menu_item_call label="Memory Stats" name="Memory Stats"/>
+ <menu_item_check label="Double-Click Auto-Pilot" name="Double-ClickAuto-Pilot"/>
+ <menu_item_check label="Debug Clicks" name="Debug Clicks"/>
+ <menu_item_check label="Debug Mouse Events" name="Debug Mouse Events"/>
+ </menu>
+ <menu label="XUI" name="XUI">
+ <menu_item_call label="Reload Color Settings" name="Reload Color Settings"/>
+ <menu_item_call label="Show Font Test" name="Show Font Test"/>
+ <menu_item_call label="Load from XML" name="Load from XML"/>
+ <menu_item_call label="Save to XML" name="Save to XML"/>
+ <menu_item_check label="Show XUI Names" name="Show XUI Names"/>
+ <menu_item_call label="Send Test IMs" name="Send Test IMs"/>
+ </menu>
+ <menu label="Avatar" name="Character">
+ <menu label="Grab Baked Texture" name="Grab Baked Texture">
+ <menu_item_call label="Iris" name="Iris"/>
+ <menu_item_call label="Head" name="Head"/>
+ <menu_item_call label="Upper Body" name="Upper Body"/>
+ <menu_item_call label="Lower Body" name="Lower Body"/>
+ <menu_item_call label="Skirt" name="Skirt"/>
+ </menu>
+ <menu label="Character Tests" name="Character Tests">
+ <menu_item_call label="Toggle Character Geometry" name="Toggle Character Geometry"/>
+ <menu_item_check label="Allow Select Avatar" name="Allow Select Avatar"/>
+ </menu>
+ <menu_item_call label="Force Params to Default" name="Force Params to Default"/>
+ <menu_item_check label="Animation Info" name="Animation Info"/>
+ <menu_item_check label="Slow Motion Animations" name="Slow Motion Animations"/>
+ <menu_item_check label="Disable Level Of Detail" name="Disable LOD"/>
+ <menu_item_check label="Show Collision Skeleton" name="Show Collision Skeleton"/>
+ <menu_item_check label="Display Agent Target" name="Display Agent Target"/>
+ <menu_item_call label="Debug Avatar Textures" name="Debug Avatar Textures"/>
+ </menu>
+ <menu_item_check label="HTTP Textures" name="HTTP Textures"/>
+ <menu_item_check label="Console Window on next Run" name="Console Window"/>
+ <menu_item_check label="Show Admin Menu" name="View Admin Options"/>
+ <menu_item_call label="Request Admin Status" name="Request Admin Options"/>
+ <menu_item_call label="Leave Admin Status" name="Leave Admin Options"/>
+ </menu>
+ <menu label="Admin" name="Admin">
+ <menu label="Object">
+ <menu_item_call label="Coger una copia" name="Take Copy"/>
+ <menu_item_call label="Force Owner To Me" name="Force Owner To Me"/>
+ <menu_item_call label="Force Owner Permissive" name="Force Owner Permissive"/>
+ <menu_item_call label="Eliminar" name="Delete"/>
+ <menu_item_call label="Lock" name="Lock"/>
+ </menu>
+ <menu label="Parcel" name="Parcel">
+ <menu_item_call label="Force Owner To Me" name="Owner To Me"/>
+ <menu_item_call label="Set to Linden Content" name="Set to Linden Content"/>
+ <menu_item_call label="Claim Public Land" name="Claim Public Land"/>
+ </menu>
+ <menu label="Región" name="Region">
+ <menu_item_call label="Dump Temporary Asset Data" name="Dump Temp Asset Data"/>
+ <menu_item_call label="Save Region State" name="Save Region State"/>
+ </menu>
+ <menu_item_call label="God Tools" name="God Tools"/>
</menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/es/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/es/menu_wearable_list_item.xml
new file mode 100644
index 0000000000..d5f106ff96
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/menu_wearable_list_item.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit Wearable Context Menu">
+ <menu_item_call label="Ponerme" name="wear"/>
+ <menu_item_call label="Añadir" name="wear_add"/>
+ <menu_item_call label="Quitarme / Quitar" name="take_off_or_detach"/>
+ <menu_item_call label="Quitar" name="detach"/>
+ <context_menu label="Anexar a â–¶" name="wearable_attach_to"/>
+ <context_menu label="Anexar al HUD â–¶" name="wearable_attach_to_hud"/>
+ <menu_item_call label="Quitarme" name="take_off"/>
+ <menu_item_call label="Editar" name="edit"/>
+ <menu_item_call label="Perfil del objeto" name="object_profile"/>
+ <menu_item_call label="Mostrar original" name="show_original"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/es/mime_types_linux.xml b/indra/newview/skins/default/xui/es/mime_types_linux.xml
new file mode 100644
index 0000000000..77d05934f4
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/mime_types_linux.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Contenido web
+ </label>
+ <tooltip name="web_tooltip">
+ Este sitio tiene contenido web
+ </tooltip>
+ <playtip name="web_playtip">
+ Mostrar el contenido web
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Película
+ </label>
+ <tooltip name="movie_tooltip">
+ Aquí puede verse una película
+ </tooltip>
+ <playtip name="movie_playtip">
+ Ver la película
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Imagen
+ </label>
+ <tooltip name="image_tooltip">
+ En este sitio hay una imagen
+ </tooltip>
+ <playtip name="image_playtip">
+ Ver la imagen de esta localización
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Audio
+ </label>
+ <tooltip name="audio_tooltip">
+ En este sitio hay audio
+ </tooltip>
+ <playtip name="audio_playtip">
+ Oír el audio de este sitio
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Streaming en &apos;Real Time&apos;
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Vacío -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Vacío -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Audio
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Vídeo
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Imagen
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Película (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Audio/Vídeo Ogg
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ Documento PDF
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Documento Postscript
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Texto enriquecido (RTF)
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Synchronized Multimedia Integration Language (SMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Página web (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Audio (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Audio (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Audio (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Audio (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Imagen (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Imagen (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Imagen (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Imagen (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Imagen (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Imagen (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Página web
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ Texto
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Película (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Película (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Película (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Película (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Película (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Película (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/es/mime_types_mac.xml b/indra/newview/skins/default/xui/es/mime_types_mac.xml
new file mode 100644
index 0000000000..77d05934f4
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/mime_types_mac.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Contenido web
+ </label>
+ <tooltip name="web_tooltip">
+ Este sitio tiene contenido web
+ </tooltip>
+ <playtip name="web_playtip">
+ Mostrar el contenido web
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Película
+ </label>
+ <tooltip name="movie_tooltip">
+ Aquí puede verse una película
+ </tooltip>
+ <playtip name="movie_playtip">
+ Ver la película
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Imagen
+ </label>
+ <tooltip name="image_tooltip">
+ En este sitio hay una imagen
+ </tooltip>
+ <playtip name="image_playtip">
+ Ver la imagen de esta localización
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Audio
+ </label>
+ <tooltip name="audio_tooltip">
+ En este sitio hay audio
+ </tooltip>
+ <playtip name="audio_playtip">
+ Oír el audio de este sitio
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Streaming en &apos;Real Time&apos;
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Vacío -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Vacío -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Audio
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Vídeo
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Imagen
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Película (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Audio/Vídeo Ogg
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ Documento PDF
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Documento Postscript
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Texto enriquecido (RTF)
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Synchronized Multimedia Integration Language (SMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Página web (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Audio (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Audio (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Audio (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Audio (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Imagen (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Imagen (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Imagen (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Imagen (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Imagen (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Imagen (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Página web
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ Texto
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Película (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Película (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Película (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Película (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Película (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Película (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/es/notifications.xml b/indra/newview/skins/default/xui/es/notifications.xml
index 6b58bbea47..1ec29d6029 100644
--- a/indra/newview/skins/default/xui/es/notifications.xml
+++ b/indra/newview/skins/default/xui/es/notifications.xml
@@ -9,74 +9,45 @@
<global name="implicitclosebutton">
Cerrar
</global>
- <template name="okbutton">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- </form>
- </template>
-
- <template name="okignore">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <ignore text="$ignoretext"/>
- </form>
- </template>
-
- <template name="okcancelbuttons">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Cancel"
- text="$notext"/>
- </form>
- </template>
-
- <template name="okcancelignore">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Cancel"
- text="$notext"/>
- <ignore text="$ignoretext"/>
- </form>
- </template>
-
- <template name="okhelpbuttons">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Help"
- text="$helptext"/>
- </form>
- </template>
-
- <template name="yesnocancelbuttons">
- <form>
- <button
- name="Yes"
- text="$yestext"/>
- <button
- name="No"
- text="$notext"/>
- <button
- name="Cancel"
- text="$canceltext"/>
- </form>
- </template>
- <notification functor="GenericAcknowledge" label="Mensaje de alerta desconocida" name="MissingAlert">
- Su versión de [APP_NAME] no sabe cómo mostrar el mensaje de alerta que acaba de recibir.
-
-Detalles del error: no se ha encontrado en notifications.xml la alerta llamada &apos;[_NAME]&apos;.
+ <template name="okbutton">
+ <form>
+ <button name="OK_okbutton" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okignore">
+ <form>
+ <button name="OK_okignore" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okcancelbuttons">
+ <form>
+ <button name="OK_okcancelbuttons" text="$yestext"/>
+ <button name="Cancel_okcancelbuttons" text="$notext"/>
+ </form>
+ </template>
+ <template name="okcancelignore">
+ <form>
+ <button name="OK_okcancelignore" text="$yestext"/>
+ <button name="Cancel_okcancelignore" text="$notext"/>
+ </form>
+ </template>
+ <template name="okhelpbuttons">
+ <form>
+ <button name="OK_okhelpbuttons" text="$yestext"/>
+ <button name="Help" text="$helptext"/>
+ </form>
+ </template>
+ <template name="yesnocancelbuttons">
+ <form>
+ <button name="Yes" text="$yestext"/>
+ <button name="No" text="$notext"/>
+ <button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
+ </form>
+ </template>
+ <notification functor="GenericAcknowledge" label="Mensaje de notificación desconocida" name="MissingAlert">
+ Tu versión de [APP_NAME] no sabe cómo mostrar la notificación que acaba de recibir. Por favor, comprueba que tienes instalado el último Visor.
+
+Detalles del error: la notificación de nombre &apos;[_NAME]&apos; no se ha encontrado en notifications.xml.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="FloaterNotFound">
@@ -97,62 +68,62 @@ Detalles del error: no se ha encontrado en notifications.xml la alerta llamada &
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sí"/>
</notification>
<notification name="BadInstallation">
- Ha habido un error al actualizar [APP_NAME]. Por favor, descargue la última versión desde secondlife.com.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ Ha habido un error actualizando [APP_NAME]. Por favor, [http://get.secondlife.com descarga la última versión] del Visor.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LoginFailedNoNetwork">
- Error de red: no se ha podido conectar.
+ No se puede conectar con [SECOND_LIFE_GRID].
&apos;[DIAGNOSTIC]&apos;
-Por favor, revise su conexión a internet.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+Asegúrate de que tu conexión a Internet está funcionando adecuadamente.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="MessageTemplateNotFound">
No se ha encontrado la plantilla de mensaje [PATH].
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="WearableSave">
¿Guardar los cambios en las ropas o partes del cuerpo actuales?
<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardarlos" yestext="Guardarlos"/>
</notification>
<notification name="CompileQueueSaveText">
- Hubo un problema al subir el texto de un script por la siguiente razón: [REASON]. Por favor, inténtelo más tarde.
+ Hubo un problema al subir el texto de un script por la siguiente razón: [REASON]. Por favor, inténtalo más tarde.
</notification>
<notification name="CompileQueueSaveBytecode">
- Hubo un problema al subir el script compilado por la siguiente razón: [REASON]. Por favor, inténtelo más tarde.
+ Hubo un problema al subir el script compilado por la siguiente razón: [REASON]. Por favor, inténtalo más tarde.
</notification>
<notification name="WriteAnimationFail">
- Hubo un problema al escribir los datos de la animación. Por favor, inténtelo más tarde.
+ Hubo un problema al escribir los datos de la animación. Por favor, inténtalo más tarde.
</notification>
<notification name="UploadAuctionSnapshotFail">
Hubo un problema al subir la foto de la subasta por la siguiente razón: [REASON]
</notification>
<notification name="UnableToViewContentsMoreThanOne">
- No se puede ver a la vez los contenidos de más de un ítem. Por favor, elija un solo objeto y vuelva a intentarlo.
+ No se puede ver a la vez los contenidos de más de un ítem. Por favor, elige un solo objeto y vuelve a intentarlo.
</notification>
<notification name="SaveClothingBodyChanges">
¿Guardar todos los cambios en la ropa y partes del cuerpo?
<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardarlos" yestext="Guardarlos todos"/>
</notification>
+ <notification name="FriendsAndGroupsOnly">
+ Quienes no sean tus amigos no sabrán que has elegido ignorar sus llamadas y mensajes instantáneos.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="GrantModifyRights">
- Al conceder derechos de modificación a otro residente le autoriza a cambiar, borrar, o coger CUALQUIER objeto que usted tenga en el mundo. Sea MUY cuidadoso dando este permiso. ¿Quiere conceder derechos de modificación a [FIRST_NAME] [LAST_NAME]?
+ Al conceder permisos de modificación a otro Residente, le estás permitiendo cambiar, borrar o tomar CUALQUIER objeto que tengas en el mundo. Sé MUY cuidadoso al conceder este permiso.
+¿Quieres conceder permisos de modificación a [FIRST_NAME] [LAST_NAME]?
<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
</notification>
<notification name="GrantModifyRightsMultiple">
- Al conceder derechos de modificación a otros residentes les autoriza a cambiar, borrar, o coger CUALQUIER objeto que usted tenga en el mundo. Sea MUY cuidadoso dando este permiso. ¿Quiere conceder derechos de modificación a los residentes seleccionados?
+ Al conceder permisos de modificación a otro Residente, le estás permitiendo cambiar CUALQUIER objeto que tengas en el mundo. Sé MUY cuidadoso al conceder este permiso.
+¿Quieres conceder permisos de modificación a los Residentes elegidos?
<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
</notification>
<notification name="RevokeModifyRights">
- ¿Quiere revocar los derechos de modificación a [FIRST_NAME] [LAST_NAME]?
+ ¿Quieres revocar los derechos de modificación a [FIRST_NAME] [LAST_NAME]?
<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
</notification>
<notification name="RevokeModifyRightsMultiple">
- ¿Quiere revocar los derechos de modificación a los residentes seleccionados?
+ ¿Quieres revocar los derechos de modificación a los residentes seleccionados?
<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
</notification>
<notification name="UnableToCreateGroup">
@@ -166,115 +137,78 @@ Por favor, revise su conexión a internet.
<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Ignorar los cambios" yestext="Aplicar los cambios"/>
</notification>
<notification name="MustSpecifyGroupNoticeSubject">
- Para enviar un aviso de grupo debe especificar un asunto.
+ Para enviar un aviso de grupo debes especificar un asunto.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AddGroupOwnerWarning">
- Va a añadir miembros al rol de [ROLE_NAME].
-No podrá removérseles de ese rol, sino que deberán renunciar a él por sí mismos.
-¿Está seguro de que quiere seguir?
- <usetemplate ignoretext="Cuando se añaden miembros del grupo al rol de propietario" name="okcancelignore" notext="No" yestext="Sí"/>
+ Vas a añadir miembros al rol de [ROLE_NAME].
+No podrás removérseles de ese rol, sino que deberán renunciar a él por sí mismos.
+¿Estás seguro de que quieres seguir?
+ <usetemplate ignoretext="Confirmar que vas a añadir un nuevo propietario al grupo" name="okcancelignore" notext="No" yestext="Sí"/>
</notification>
<notification name="AssignDangerousActionWarning">
- Va a añadir la capacidad &apos;[ACTION_NAME]&apos; al rol &apos;[ROLE_NAME]&apos;.
+ Vas a añadir la capacidad &apos;[ACTION_NAME]&apos; al rol &apos;[ROLE_NAME]&apos;.
*ATENCIÓN*
- Todos los miembros con esta capacidad podrán asignarse a sí mismos -y a otros miembros- roles con mayores poderes de los que actualmente tienen. Potencialmente, podrían elevarse hasta poderes cercanos a los del propietario. Asegúrese de lo que está haciendo antes de otorgar esta capacidad.
+ Todos los miembros con esta capacidad podrán asignarse a sí mismos -y a otros miembros- roles con mayores poderes de los que actualmente tienen. Potencialmente, podrían elevarse hasta poderes cercanos a los del propietario. Asegúrate de lo que estás haciendo antes de otorgar esta capacidad.
¿Añadir esta capacidad a &apos;[ROLE_NAME]&apos;?
<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
</notification>
<notification name="AssignDangerousAbilityWarning">
- Va a añadir la capacidad &apos;[ACTION_NAME]&apos; al rol &apos;[ROLE_NAME]&apos;.
+ Vas a añadir la capacidad &apos;[ACTION_NAME]&apos; al rol &apos;[ROLE_NAME]&apos;.
*ATENCIÓN*
Todos los miembros con esta capacidad podrán asignarse a sí mismos -y a otros miembros- todas las capacidades, elevándose hasta poderes cercanos a los del propietario.
¿Añadir esta capacidad a &apos;[ROLE_NAME]&apos;?
<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
</notification>
- <notification name="ClickPublishHelpLand">
- Seleccionar &apos;Publicar en la web&apos;
-Marcando este ítem, se mostrará:
-- esta parcela en los resultados de la búsqueda
-- los objetos públicos de esta parcela
-- esta parcela en la búsqueda de la web
- </notification>
- <notification name="ClickSoundHelpLand">
- Los media y la música sólo pueden disfrutarse dentro de la parcela. Según el nivel de calificación de los residentes, las opciones de sonido y de voz pueden ceñirse a la parcela u oírse fuera de ella. ¿Quiere ir a la Base de Conocimientos para aprender más sobre cómo configurar estas opciones?
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=5046
- </url>
- <usetemplate
- name="okcancelbuttons"
- yestext="Ir a la Base de Conocimientos"
- notext="Cerrar" />
- </notification>
- <notification name="ClickSearchHelpAll">
- Los resultados de la búsqueda se organizan según la pestaña en que esté, su nivel de calificación, la categoría elegida, y otros factores. Para más detalles, vea, por favor, la Base de Conocimientos.
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=4722
- </url>
- <usetemplate
- name="okcancelbuttons"
- yestext="Ir a la Base de Conocimientos"
- notext="Cerrar" />
- </notification>
- <notification name="ClickPublishHelpLandDisabled">
- No puede hacer que esta parcela aparezca en la búsqueda, porque está situada en una región que lo prohíbe.
- </notification>
- <notification name="ClickPublishHelpAvatar">
- Al seleccionar &apos;Mostrar en la búsqueda&apos; se mostrará:
-- mi perfil en los resultados de la búsqueda
-- un enlace a mi perfil en las páginas públicas de grupo
- </notification>
- <notification name="ClickPartnerHelpAvatar">
- Puede proponérselo a otro residente o disolver su relación con un/a compañero/a en el sitio web de [SECOND_LIFE].
-
-¿Ir al sitio web de [SECOND_LIFE] para tener más información sobre este asunto?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Ir a la página"/>
- </notification>
- <notification name="ClickUploadHelpPermissions">
- Sus permisos por defecto no funcionarán en regiones antiguas.
- </notification>
- <notification name="ClickWebProfileHelpAvatar">
- Si este residente ha indicado una URL para mostrar un perfil en la web, usted puede:
- * Pulsar &apos;Cargar&apos; para ver la página en esta pestaña web.
- * Pulsar Cargar &gt; &apos;En un navegador externo&apos; para ver la página en su navegador por defecto.
- * Pulsar Cargar &gt; &apos;URL Inicio&apos; para volver al perfil en la web de este residente si usted ha estado navegando por otros sitios.
-
-Cuando esté viendo su propio perfil, puede introducir cualquier URL como su perfil web, y pulsar OK para fijarla.
-Los demás residentes podrán visitar la URL que usted haya elegido cuando vean su perfil.
+ <notification name="AttachmentDrop">
+ Vas a soltar tu anexado.
+ ¿Estás seguro de que quieres continuar?
+ <usetemplate ignoretext="Confirmar antes de soltar anexados" name="okcancelignore" notext="No" yestext="Sí"/>
</notification>
<notification name="JoinGroupCanAfford">
Entrar a este grupo cuesta [COST] L$.
-¿Quiere hacerlo??
+¿Quieres hacerlo??
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Entrar"/>
+ </notification>
+ <notification name="JoinGroupNoCost">
+ Vas a entrar al grupo [NAME].
+¿Quieres seguir?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Entrar"/>
</notification>
<notification name="JoinGroupCannotAfford">
Entrar a este grupo cuesta [COST] L$.
-No tiene dinero suficiente para entrar.
+No tienes dinero suficiente para entrar.
+ </notification>
+ <notification name="CreateGroupCost">
+ Crear este grupo te costará 100 L$.
+Los grupos necesitan más de un miembro. Si no, son borrados permanentemente.
+Por favor, invita a miembros en las próximas 48 horas.
+ <usetemplate canceltext="Cancelar" name="okcancelbuttons" notext="Cancelar" yestext="Crear un grupo por 100 L$"/>
</notification>
<notification name="LandBuyPass">
- Por [COST] L$ puede entrar a este terreno (&apos;[PARCEL_NAME]&apos;) durante [TIME] horas. ¿Comprar un pase?
+ Por [COST] L$ puedes entrar a este terreno (&apos;[PARCEL_NAME]&apos;) durante [TIME] horas. ¿Comprar un pase?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="SalePriceRestriction">
El precio de venta tiene que ser mayor de 0 L$ si la venta es a cualquiera.
-Por favor, elija a alguien concreto como comprador si la venta es por 0 L$.
+Por favor, elige a alguien concreto como comprador si la venta es por 0 L$.
</notification>
<notification name="ConfirmLandSaleChange">
Los [LAND_SIZE] m² de terreno seleccionados se van a poner a la venta.
-Su precio de venta será de [SALE_PRICE] L$, y se autorizará la compra sólo a [NAME].
+El precio de venta será de [SALE_PRICE] L$, y se autorizará la compra sólo a [NAME].
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ConfirmLandSaleToAnyoneChange">
- ATENCIÓN: Al pulsar &apos;vender a cualquiera&apos;, su terreno estará disponible para toda la comunidad de [SECOND_LIFE], incluso para quienes no están en esta región.
+ ATENCIÓN: Marcando &apos;vender a cualquiera&apos; hace que tu terreno esté disponible para toda la comunidad de [SECOND_LIFE], incluso para quienes no están en esta región.
-Los [LAND_SIZE] m² de terreno seleccionados se van a poner a la venta.
-Su precio de venta será de [SALE_PRICE] L$, y se autorizará la compra a [NAME].
+Los [LAND_SIZE] m² seleccionados de terreno se van a poner a la venta.
+El precio de venta será de [SALE_PRICE] L$ y se autoriza la compra a [NAME].
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ReturnObjectsDeededToGroup">
- ¿Está seguro de que quiere devolver todos los objetos de esta parcela que estén compartidos con el grupo &apos;[NAME]&apos; al inventario de su propietario anterior?
+ ¿Estás seguro de que quieres devolver todos los objetos de esta parcela que estén compartidos con el grupo &apos;[NAME]&apos; al inventario de su propietario anterior?
*ATENCIÓN* ¡Esto borrará los objetos no transferibles que se hayan cedido al grupo!
@@ -282,19 +216,19 @@ Objetos: [N]
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ReturnObjectsOwnedByUser">
- ¿Está seguro de que quiere devolver al inventario de &apos;[NAME]&apos; todos los objetos que sean de su propiedad en esta parcela?
+ ¿Estás seguro de que quieres devolver al inventario de &apos;[NAME]&apos; todos los objetos que sean de su propiedad en esta parcela?
Objetos: [N]
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ReturnObjectsOwnedBySelf">
- ¿Está seguro de que quiere devolver a su inventario todos los objetos de los que usted es propietario en esta parcela?
+ ¿Estás seguro de que quieres devolver a su inventario todos los objetos de los que eres propietario en esta parcela?
Objetos: [N]
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ReturnObjectsNotOwnedBySelf">
- ¿Está seguro de que quiere devolver todos los objetos de los que usted NO es propietario en esta parcela al inventario de sus propietarios?
+ ¿Estás seguro de que quieres devolver todos los objetos de los que NO eres propietario en esta parcela al inventario de sus propietarios?
Los objetos transferibles que se hayan transferido al grupo se devolverán a sus propietarios previos.
*ATENCIÓN* ¡Esto borrará los objetos no transferibles que se hayan cedido al grupo!
@@ -303,7 +237,7 @@ Objetos: [N]
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ReturnObjectsNotOwnedByUser">
- ¿Está seguro de que quiere devolver todos los objetos de esta parcela que NO sean propiedad de [NAME] al inventario de su propietario?
+ ¿Estás seguro de que quieres devolver todos los objetos de esta parcela que NO sean propiedad de [NAME] al inventario de su propietario?
Los objetos transferibles que se hayan transferido al grupo se devolverán a sus propietarios previos.
*ATENCIÓN* ¡Esto borrará los objetos no transferibles que se hayan cedido al grupo!
@@ -312,11 +246,11 @@ Objetos: [N]
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ReturnAllTopObjects">
- ¿Está seguro de que quiere devolver al inventario de su propietario todos los objetos de la lista?
+ ¿Estás seguro de que quieres devolver al inventario de su propietario todos los objetos de la lista?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="DisableAllTopObjects">
- ¿Está seguro de que quiere desactivar todos los objetos de esta región?
+ ¿Estás seguro de que quieres desactivar todos los objetos de esta región?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ReturnObjectsNotOwnedByGroup">
@@ -330,15 +264,21 @@ Objetos: [N]
Toda esta región tiene activado el &apos;daño&apos;.
Para que funcionen las armas los scripts deben estar activados.
</notification>
+ <notification name="MultipleFacesSelected">
+ Están seleccionadas varias caras.
+Si sigues con esta acción, en las diferentes caras del objeto aparecerán distintas peticiones de los media.
+Para colocar los media en una sola cara, marca la opción Elegir la cara y pulsa en la cara adecuada del objeto, y luego pulsa Añadir.
+ <usetemplate ignoretext="Los media se configurarán en las varias caras seleccionadas" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
<notification name="MustBeInParcel">
Para configurar el Punto de llegada de la parcela,
-debe estar usted dentro de ella.
+debes estar dentro de ella.
</notification>
<notification name="PromptRecipientEmail">
- Por favor, escriba una dirección de correo electrónica válida para el/los receptor/es.
+ Por favor, escribe una dirección de correo electrónica válida para el/los receptor/es.
</notification>
<notification name="PromptSelfEmail">
- Por favor, escriba su dirección de correo electrónico.
+ Por favor, escribe tu dirección de correo electrónico.
</notification>
<notification name="PromptMissingSubjMsg">
¿Foto por correo electrónico con el asunto o el mensaje por defecto?
@@ -357,46 +297,62 @@ debe estar usted dentro de ella.
Hubo un problema al subir la captura de pantalla del informe por la siguiente razón: [REASON]
</notification>
<notification name="MustAgreeToLogIn">
- Debe estar de acuerdo con las Condiciones del Servicio para continuar el inicio de sesión en [SECOND_LIFE].
+ Debes estar de acuerdo con las Condiciones del Servicio para continuar el inicio de sesión en [SECOND_LIFE].
</notification>
<notification name="CouldNotPutOnOutfit">
- No se ha podido ponerle el vestuario.
+ No se ha podido poner el vestuario.
La carpeta del vestuario contiene partes del cuerpo, u objetos a anexar o que no son ropa.
</notification>
<notification name="CannotWearTrash">
- No puede vestirse ropas o partes del cuerpo que están en la Papelera
+ No puedes vestirte ropas o partes del cuerpo que estén en la Papelera
+ </notification>
+ <notification name="MaxAttachmentsOnOutfit">
+ No se puede anexar el objeto.
+Se ha superado el límite máximo de [MAX_ATTACHMENTS] objetos. Por favor, quítate alguno.
</notification>
<notification name="CannotWearInfoNotComplete">
- No puede vestirse este ítem porque aún no se ha cargado. Por favor, reinténtelo en un minuto.
+ No puedes vestirte este ítem porque aún no se ha cargado. Por favor, inténtalo de nuevo en un minuto.
</notification>
<notification name="MustHaveAccountToLogIn">
¡Vaya! Algo se quedó en blanco.
-Debe escribir tanto el nombre como el apellido de su avatar, los dos.
+Debes escribir tanto el nombre como el apellido de tu avatar, los dos.
-Necesita una cuenta para entrar en [SECOND_LIFE]. ¿Quiere crear una ahora?
+Necesitas una cuenta para entrar en [SECOND_LIFE]. ¿Quieres crear una ahora?
<url name="url">
https://join.secondlife.com/index.php?lang=es-ES
</url>
<usetemplate name="okcancelbuttons" notext="Volver a intentarlo" yestext="Crear una cuenta nueva"/>
</notification>
+ <notification name="InvalidCredentialFormat">
+ Escribe el nombre y apellido de tu avatar en el campo Nombre de usuario e inicia sesión otra vez.
+ </notification>
<notification name="AddClassified">
- Los anuncios clasificados aparecen durante una semana en la sección &apos;Clasificados&apos; del directorio Buscar y en [http://secondlife.com/community/classifieds/?lang=es-ES secondlife.com].
-Rellene su anuncio y pulse &apos;Publicar...&apos; para añadirlo al directorio.
-Cuando pulse Publicar, se le preguntará por un precio a pagar.
-El pagar más hará que su anuncio aparezca más arriba en la lista, y que también aparezca más arriba cuando la gente busque por palabras clave.
- <usetemplate ignoretext="Cuando se añade un nuevo Clasificado" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ Los anuncios clasificados aparecen durante una semana en la sección &apos;Clasificados&apos; de la búsqueda y en [http://secondlife.com/community/classifieds secondlife.com].
+Rellena tu anuncio y pulsa &apos;Publicar...&apos; para añadirlo al directorio.
+Cuando pulses Publicar, se te preguntará por un precio a pagar.
+El pagar más hará que tu anuncio aparezca más arriba en la lista, y que también aparezca más arriba en la lista cuando la gente busque por palabras clave.
+ <usetemplate ignoretext="Cómo crear un anuncio clasificado nuevo." name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="DeleteClassified">
¿Borrar el clasificado &apos;[NAME]&apos;?
No se reembolsan las cuotas pagadas.
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
+ <notification name="DeleteMedia">
+ Has elegido borrar los media asociados a esta cara.
+¿Estás seguro de que quieres continuar?
+ <usetemplate ignoretext="Confirmar antes de borrar los media de un objeto" name="okcancelignore" notext="No" yestext="Sí"/>
+ </notification>
<notification name="ClassifiedSave">
¿Guardar los cambios en el clasificado [NAME]?
<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No guardar" yestext="Guardar"/>
</notification>
+ <notification name="ClassifiedInsufficientFunds">
+ Dinero insuficiente para crear un clasificado.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="DeleteAvatarPick">
- ¿Borrar el destacado [PICK]?
+ ¿Borrar el destacado &lt;nolink&gt;[PICK]&lt;/nolink&gt;?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="PromptGoToEventsPage">
@@ -407,31 +363,23 @@ No se reembolsan las cuotas pagadas.
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="SelectProposalToView">
- Por favor, seleccione qué propuesta quiere ver.
+ Por favor, selecciona qué propuesta quieres ver.
</notification>
<notification name="SelectHistoryItemToView">
- Por favor, seleccione un ítem del historial para verlo.
- </notification>
- <notification name="ResetShowNextTimeDialogs">
- ¿Quiere reactivar todas estas ventanas emergentes, incluso las que marcó previamente como &apos;No mostrarme más esto&apos;?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="SkipShowNextTimeDialogs">
- ¿Quiere activar todas las ventanas emergentes que puedan habilitarse?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ Por favor, selecciona un ítem del historial para verlo.
</notification>
<notification name="CacheWillClear">
- La caché se limpiará cuando reinicie [APP_NAME].
+ La caché se limpiará cuando reinices [APP_NAME].
</notification>
<notification name="CacheWillBeMoved">
- La caché se moverá cuando reinicie [APP_NAME].
-Nota: esto limpiará la caché.
+ La caché se moverá cuando reinicies [APP_NAME].
+Nota: esto vaciará la caché.
</notification>
<notification name="ChangeConnectionPort">
- Las configuraciones del puerto tendrán efecto cuando reinicie [APP_NAME].
+ La configuración del puerto tendrá efecto cuando reinicies [APP_NAME].
</notification>
<notification name="ChangeSkin">
- La nueva apariencia se verá cuando reinicie [APP_NAME].
+ Verás la nueva apariencia cuando reinicies [APP_NAME].
</notification>
<notification name="GoToAuctionPage">
¿Ir a la página web de [SECOND_LIFE] para ver los detalles de la subasta
@@ -445,40 +393,45 @@ o hacer una puja?
<notification name="GestureSaveFailedTooManySteps">
Fallo al guardar el gesto.
Este gesto tiene demasiados pasos.
-Intente quitarle algunos, y vuelva a guardarlo.
+Intenta quitarle algunos, y vuelve a guardarlo.
</notification>
<notification name="GestureSaveFailedTryAgain">
- Fallo al guardar el gesto. Por favor, reinténtelo en un minuto.
+ Fallo al guardar el gesto. Por favor, vuelve a intentarlo en un minuto.
</notification>
<notification name="GestureSaveFailedObjectNotFound">
No se ha podido guardar el gesto porque no se pudo encontrar el objeto o el objeto asociado.
El objeto debe de haber sido borrado o estar fuera de rango (&apos;out of range&apos;).
</notification>
<notification name="GestureSaveFailedReason">
- Al guardar un gesto, hubo un problema por: [REASON]. Por favor, reintente guardarlo más tarde.
+ Al guardar un gesto, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarlo más tarde.
</notification>
<notification name="SaveNotecardFailObjectNotFound">
No se ha podido guardar la nota porque no se pudo encontrar el objeto o el objeto asociado del inventario.
El objeto debe de haber sido borrado o estar fuera de rango (&apos;out of range&apos;).
</notification>
<notification name="SaveNotecardFailReason">
- Al guardar una nota, hubo un problema por: [REASON]. Por favor, reintente guardarla más tarde.
+ Al guardar una nota, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarla más tarde.
</notification>
<notification name="ScriptCannotUndo">
- No se han podido deshacer todos los cambios en su versión del script.
-¿Quiere cargar la última versión guardada en el servidor?
-(**Cuidado** No podrá deshacer esta operación).
+ No se han podido deshacer todos los cambios en tu versión del script.
+¿Quieres cargar la última versión guardada en el servidor?
+(**Cuidado** No podrás deshacer esta operación).
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="SaveScriptFailReason">
- Al guardar un script, hubo un problema por: [REASON]. Por favor, reintente guardarlo más tarde.
+ Al guardar un script, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarlo más tarde.
</notification>
<notification name="SaveScriptFailObjectNotFound">
No se ha podido guardar el script porque no se pudo encontrar el objeto que incluye.
El objeto debe de haber sido borrado o estar fuera de rango (&apos;out of range&apos;)..
</notification>
<notification name="SaveBytecodeFailReason">
- Al guardar un script compilado, hubo un problema por: [REASON]. Por favor, reintente guardarlo más tarde..
+ Al guardar un script compilado, hubo un problema por: [REASON]. Por favor, vuelve a intentar guardarlo más tarde..
+ </notification>
+ <notification name="StartRegionEmpty">
+ Perdón, no está definida tu Posición inicial.
+Por favor, escribe el nombre de la región en el cajetín de Posición inicial, o elige para esa posición Mi Base o Mi última posición.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="CouldNotStartStopScript">
No se ha podido correr o parar el script porque no se pudo encontrar el objeto que incluye.
@@ -491,38 +444,34 @@ El objeto debe de haber sido borrado o estar fuera de rango (&apos;out of range&
No se ha podido escribir el archivo [[FILE]]
</notification>
<notification name="UnsupportedHardware">
- Atención: su sistema no tiene los requerimientos mínimos que necesita [APP_NAME]. Si sigue usando [APP_NAME], tendrá un funcionamiento pobre. Desafortunadamente, no podemos ofrecer soporte técnico para configuraciones inadecuadas del sistema.
+ Debes saber que tu ordenador no cumple los requisitos mínimos para la utilización de [APP_NAME]. Puede que experimentes un rendimiento muy bajo. Desafortunadamente, [SUPPORT_SITE] no puede dar asistencia técnica a sistemas con una configuración no admitida.
-MINSPECS
-Para más información, ¿quiere visitar [_URL]?
+¿Ir a [_URL] para más información?
<url name="url" option="0">
http://secondlife.com/support/sysreqs.php?lang=es
</url>
- <usetemplate ignoretext="Cuando se detecte hardware no adecuado" name="okcancelignore" notext="No" yestext="Sí"/>
+ <usetemplate ignoretext="El hardware de mi ordenador no está admitido" name="okcancelignore" notext="No" yestext="Sí"/>
</notification>
<notification name="UnknownGPU">
- En este momento, desconocemos la tarjeta gráfica de su sistema.
-Con frecuencia, esto se debe a hardware nuevo que no hemos podido revisar aún.
-Es muy probable que [APP_NAME] funcione correctamente, pero deberá ajustar sus configuraciones gráficas a lo que sea más apropiado.
-(Menú Editar &gt; Preferencias &gt; Gráficos).
+ Tu sistema usa una tarjeta gráfica que [APP_NAME] no reconoce.
+Suele suceder con hardware nuevo que todavía no ha sido probado con [APP_NAME]. Probablemente todo irá bien, pero deberás ajustar tus configuraciones gráficas.
+(Yo &gt; Preferencias &gt; Gráficos).
<form name="form">
- <ignore name="ignore" text="Cuando se detecte una tarjeta gráfica desconocida"/>
+ <ignore name="ignore" text="No se ha podido identificar mi tarjeta gráfica"/>
</form>
</notification>
<notification name="DisplaySettingsNoShaders">
- [APP_NAME] se cayó al inicializar los drivers gráficos.
-La calidad de los gráficos deberá establecerse en un nivel bajo para prevenir algunos errores frecuentes en los drivers.
-Esto desactivará algunas opciones gráficas.
-Le recomendamos que actualice los drivers de su tarjeta gráfica.
-La calidad gráfica puede configurarse en Preferencias &gt; Gráficos.
+ [APP_NAME] se cae al iniciar los &apos;driver&apos; gráficos.
+La calidad de los gráficos se configurará en Baja para prevenir algunos errores comunes de los gráficos. Esto desactivará algunas posibilidades gráficas.
+Te recomendamos actualizar los &apos;drivers&apos; de tu tarjeta gráfica.
+La calidad gráfica puede ajustarse en Preferencias &gt; Gráficos.
</notification>
<notification name="RegionNoTerraforming">
En la región [REGION] no se permite modificar el terreno.
</notification>
<notification name="CannotCopyWarning">
- No tiene permiso para copiar este ítem.
-Si lo da, lo perderá de su inventario.
-¿Realmente quiere darlo?
+ No tienes permiso para copiar los elementos siguientes:
+[ITEMS] y, si los das, los perderás del inventario. ¿Seguro que quieres ofrecerlos?
<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
</notification>
<notification name="CannotGiveItem">
@@ -532,19 +481,19 @@ Si lo da, lo perderá de su inventario.
Transacción cancelada.
</notification>
<notification name="TooManyItems">
- En una única transferencia del inventario, no puede dar más de 42 ítems.
+ No puedes dar más de 42 ítems en una única transferencia del inventario.
</notification>
<notification name="NoItems">
- No tiene permiso para transferir el ítem seleccionado.
+ No tienes permiso para transferir el ítem seleccionado.
</notification>
<notification name="CannotCopyCountItems">
- No tiene permiso para copiar [COUNT] de los
-ítems seleccionados. Si los da, los perderá de su inventario.
-¿Realmente quiere darlos?
+ No tienes permiso para copiar [COUNT] de los
+ítems seleccionados. Si los das, los perderás de tu inventario.
+¿Realmente quieres darlos?
<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
</notification>
<notification name="CannotGiveCategory">
- No tiene permiso para transferir
+ No tienes permiso para transferir
la carpeta seleccionada.
</notification>
<notification name="FreezeAvatar">
@@ -558,29 +507,32 @@ Temporalmente, será incapaz de moverse, usar el chat, o interactuar con el mund
<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Descongelarle" yestext="Congelarle"/>
</notification>
<notification name="EjectAvatarFullname">
- ¿Expulsar a [AVATAR_NAME] de su terreno?
+ ¿Expulsar a [AVATAR_NAME] de tu terreno?
<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Expulsar y Prohibir el acceso" yestext="Expulsar"/>
</notification>
<notification name="EjectAvatarNoBan">
- ¿Expulsar a este avatar de su terreno?
+ ¿Expulsar a este avatar de tu terreno?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar"/>
</notification>
<notification name="EjectAvatarFullnameNoBan">
- ¿Expulsar a [AVATAR_NAME] de su terreno?
+ ¿Expulsar a [AVATAR_NAME] de tu terreno?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar"/>
</notification>
+ <notification name="EjectAvatarFromGroup">
+ Has expulsado a [AVATAR_NAME] del grupo [GROUP_NAME]
+ </notification>
<notification name="AcquireErrorTooManyObjects">
ERROR &apos;ACQUIRE&apos;: Hay demasiados objetos seleccionados.
</notification>
<notification name="AcquireErrorObjectSpan">
ERROR &apos;ACQUIRE&apos;: Los objetos están en más de una región.
-Por favor, mueva todos los objetos a adquirir a la
+Por favor, mueve todos los objetos a adquirir a la
misma región.
</notification>
<notification name="PromptGoToCurrencyPage">
[EXTRA]
-¿Ir a [_URL] para informarse sobre la compra de L$?
+¿Ir a [_URL] para informarte sobre la compra de L$?
<url name="url">
http://secondlife.com/app/currency/?lang=es-ES
</url>
@@ -588,27 +540,27 @@ misma región.
</notification>
<notification name="UnableToLinkObjects">
No se pudo enlazar estos [COUNT] objetos.
-Puede enlazar [MAX] objetos como máximo.
+Puedes enlazar [MAX] objetos como máximo.
</notification>
<notification name="CannotLinkIncompleteSet">
- Sólo puede enlazar objetos completos (no sus partes), y debe
+ Sólo puedes enlazar objetos completos (no sus partes), y debes
seleccionar más de uno.
</notification>
<notification name="CannotLinkModify">
- Imposible enlazarlos, porque no tiene permiso para modificar
+ Imposible enlazarlos, porque no tienes permiso para modificar
todos los objetos.
-Por favor, asegúrese de que no hay ninguno bloqueado, y de que es el propietario de todos.
+Por favor, asegúrate de que no hay ninguno bloqueado, y de que eres el propietario de todos.
</notification>
<notification name="CannotLinkDifferentOwners">
Imposible enlazarlos, porque hay objetos de distintos propietarios.
-Por favor, asegúrese de que es propietario de todos los objetos seleccionados.
+Por favor, asegúrate de que eres el propietario de todos los objetos seleccionados.
</notification>
<notification name="NoFileExtension">
No hay extensión de archivo en: &apos;[FILE]&apos;
-Por favor, asegúrese de que la extensión del archivo es correcta.
+Por favor, asegúrate de que la extensión del archivo es correcta.
</notification>
<notification name="InvalidFileExtension">
Extensión inválida de archivo: [EXTENSION]
@@ -616,7 +568,7 @@ Podría ser [VALIDS]
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="CannotUploadSoundFile">
- Ni se pudo abrir el archivo de sonido que se ha subido para leer:
+ No se pudo abrir el archivo de sonido que has subido para leer:
[FILE]
</notification>
<notification name="SoundFileNotRIFF">
@@ -661,6 +613,11 @@ Podría ser [VALIDS]
<notification name="CannotEncodeFile">
No se puede codificar el archivo: [FILE]
</notification>
+ <notification name="CorruptedProtectedDataStore">
+ No se pueden leer los datos protegidos, por lo que se están restaurando.
+ Esto puede deberse a un cambio de configuración de la red.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CorruptResourceFile">
Archivo con los recursos corruptos: [FILE]
</notification>
@@ -671,112 +628,120 @@ Podría ser [VALIDS]
No se ha podido crear el archivo de salida: [FILE]
</notification>
<notification name="DoNotSupportBulkAnimationUpload">
- Actualmente, no ofrecemos la posibilidad de subida masiva de archivos de animación.
+ Actualmente, [APP_NAME] no admite la subida masiva de animaciones.
</notification>
<notification name="CannotUploadReason">
No se ha podido subir [FILE] por la siguiente razón: [REASON]
-Por favor, inténtelo más tarde.
+Por favor, inténtalo más tarde.
+ </notification>
+ <notification name="LandmarkCreated">
+ Se ha añadido &quot;[LANDMARK_NAME]&quot; a tu carpeta [FOLDER_NAME].
+ </notification>
+ <notification name="LandmarkAlreadyExists">
+ Ya tienes un hito de esta localización.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="CannotCreateLandmarkNotOwner">
- No puede crear un hito aquí porque el propietario del terreno no lo permite.
+ No puedes crear un hito aquí porque el propietario del terreno no lo permite.
</notification>
<notification name="CannotRecompileSelectObjectsNoScripts">
No se pudo &apos;recompilar&apos;.
-Seleccione un objeto con script.
+Selecciona un objeto con script.
</notification>
<notification name="CannotRecompileSelectObjectsNoPermission">
No se pudo &apos;recompilar&apos;.
-Seleccione objetos con scripts en los que usted tenga permiso para modificarlos.
+Selecciona objetos con scripts en los que tengas permiso para modificarlos.
</notification>
<notification name="CannotResetSelectObjectsNoScripts">
No se pudo &apos;reiniciar&apos;.
-Seleccione objetos con scripts.
+Selecciona objetos con scripts.
</notification>
<notification name="CannotResetSelectObjectsNoPermission">
No se pudo &apos;reiniciar&apos;.
-Seleccione objetos con scripts en los que usted tenga permiso para modificarlos.
+Selecciona objetos con scripts en los que tengas permiso para modificarlos.
+ </notification>
+ <notification name="CannotOpenScriptObjectNoMod">
+ Imposible abrir el script del objeto sin modificar los permisos.
</notification>
<notification name="CannotSetRunningSelectObjectsNoScripts">
No se puede configurar ningún script como &apos;ejecutándose&apos;.
-Seleccione objetos con scripts.
+Selecciona objetos con scripts.
</notification>
<notification name="CannotSetRunningNotSelectObjectsNoScripts">
No se puede configurar ningún script como &apos;no ejecutándose&apos;.
-Seleccione objetos con scripts.
+Selecciona objetos con scripts.
</notification>
<notification name="NoFrontmostFloater">
- No hay nada a guardar.
+ No hay nada que guardar.
</notification>
<notification name="SeachFilteredOnShortWords">
- Se ha modificado su búsqueda,
+ Se ha modificado tu búsqueda,
eliminando las palabras demasiado cortas.
Buscando: [FINALQUERY]
</notification>
<notification name="SeachFilteredOnShortWordsEmpty">
- Los términos de su búsqueda son muy cortos,
+ Los términos de tu búsqueda son muy cortos,
por lo que no se ha hecho la búsqueda.
</notification>
<notification name="CouldNotTeleportReason">
- No se ha podido teleportar.
+ Fallo en el teleporte.
[REASON]
</notification>
-
- <notification name="invalid_tport">
-Ha habido un problema al procesar su petición de teleporte. Debe volver a iniciar sesión para poder teleportarse. Si le sigue apareciendo este mensaje, revise, por favor, las preguntas frecuentes en el Soporte técnico:
-www.secondlife.com/support
- </notification>
- <notification name="invalid_region_handoff">
-Ha habido un problema al procesar su paso a otra región. Debe volver a iniciar sesión para poder pasar de región a región. Si le sigue apareciendo este mensaje, revise, por favor, las preguntas frecuentes en el Soporte técnico:
-www.secondlife.com/support
- </notification>
- <notification name="blocked_tport">
-Lo sentimos, en estos momentos los teleportes están bloqueados. Vuelva a intentarlo en un momento. Si sigue sin poder teleportarse, desconéctese y vuelva a iniciar sesión para solucionar el problema.
- </notification>
- <notification name="nolandmark_tport">
-Lo sentimos, pero el sistema no ha podido localizar el destino de este hito.
- </notification>
- <notification name="timeout_tport">
-Lo sentimos, pero el sistema no ha podido completar el teleporte.
-Vuelva a intentarlo en un momento.
- </notification>
- <notification name="noaccess_tport">
-Lo sentimos, pero usted no tiene acceso al destino de este teleporte.
- </notification>
- <notification name="missing_attach_tport">
-Aún no han llegado sus objetos anexados. Espere unos segundos más o desconéctese y vuelva a iniciar sesión antes de teleportarse.
- </notification>
- <notification name="too_many_uploads_tport">
-La cola de espera en esta región está actualmente obstruida, por lo que su petición de teleporte no se atenderá en un tiempo prudencial. Por favor, vuelva a intentarlo en unos minutos o vaya a una zona menos ocupada.
- </notification>
- <notification name="expired_tport">
-Lo sentimos, pero el sistema no ha podido atender a su petición de teleporte en un tiempo prudencial. Por favor, vuelva a intentarlo en unos pocos minutos.
- </notification>
- <notification name="expired_region_handoff">
-Lo sentimos, pero el sistema no ha podido completar su paso a otra región en un tiempo prudencial. Por favor, vuelva a intentarlo en unos pocos minutos.
- </notification>
- <notification name="no_host">
-Ha sido imposible encontrar el destino del teleporte: o está desactivado temporalmente o ya no existe. Por favor, vuelva a intentarlo en unos pocos minutos.
- </notification>
- <notification name="no_inventory_host">
-En estos momentos no está disponible el sistema del inventario.
- </notification>
-
-
+ <notification name="invalid_tport">
+ Ha habido un problema al procesar tu petición de teleporte. Debes volver a iniciar sesión antes de poder teleportarte de nuevo.
+Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE].
+ </notification>
+ <notification name="invalid_region_handoff">
+ Ha habido un problema al procesar tu paso a otra región. Debes volver a iniciar sesión para poder pasar de región a región.
+Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE].
+ </notification>
+ <notification name="blocked_tport">
+ Lo sentimos, en estos momentos los teleportes están bloqueados. Vuelve a intentarlo en un momento. Si sigues sin poder teleportarte, desconéctate y vuelve a iniciar sesión para solucionar el problema.
+ </notification>
+ <notification name="nolandmark_tport">
+ Lo sentimos, pero el sistema no ha podido localizar el destino de este hito.
+ </notification>
+ <notification name="timeout_tport">
+ Lo sentimos, pero el sistema no ha podido completar el teleporte.
+Vuelve a intentarlo en un momento.
+ </notification>
+ <notification name="noaccess_tport">
+ Lo sentimos, pero no tienes acceso al destino de este teleporte.
+ </notification>
+ <notification name="missing_attach_tport">
+ Aún no han llegado tus objetos anexados. Espera unos segundos más o desconéctate y vuelve a iniciar sesión antes de teleportarte.
+ </notification>
+ <notification name="too_many_uploads_tport">
+ La cola de espera en esta región está actualmente obstruida, por lo que tu petición de teleporte no se atenderá en un tiempo prudencial. Por favor, vuelve a intentarlo en unos minutos o ve a una zona menos ocupada.
+ </notification>
+ <notification name="expired_tport">
+ Lo sentimos, pero el sistema no ha podido atender a tu petición de teleporte en un tiempo prudencial. Por favor, vuelve a intentarlo en unos pocos minutos.
+ </notification>
+ <notification name="expired_region_handoff">
+ Lo sentimos, pero el sistema no ha podido completar tu paso a otra región en un tiempo prudencial. Por favor, vuelve a intentarlo en unos pocos minutos.
+ </notification>
+ <notification name="no_host">
+ Ha sido imposible encontrar el destino del teleporte: o está desactivado temporalmente o ya no existe. Por favor, vuelve a intentarlo en unos pocos minutos.
+ </notification>
+ <notification name="no_inventory_host">
+ En estos momentos no está disponible el sistema del inventario.
+ </notification>
<notification name="CannotSetLandOwnerNothingSelected">
No se ha podido configurar el propietario del terreno:
no se ha seleccionado una parcela.
</notification>
<notification name="CannotSetLandOwnerMultipleRegions">
- No se ha podido obtener la propiedad del terreno porque la selección se extiende por varias regiones. Por favor, seleccione un área más pequeña y reinténtelo.
+ No se ha podido obtener la propiedad del terreno porque la selección se extiende por varias regiones. Por favor, selecciona un área más pequeña y vuelve a intentarlo.
</notification>
<notification name="ForceOwnerAuctionWarning">
- Está parcela está siendo subastada. Forzar su propiedad cancelará la subasta y, probablemente, disguste a algunos residentes que ya hayan empezado a pujar. ¿Forzar la propiedad?
+ Esta parcela está subastándose. Forzar su propiedad cancelará la subasta y, potencialmente, puede disgustar a algunos residentes si la puja ya ha empezado.
+¿Forzar la propiedad?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="CannotContentifyNothingSelected">
@@ -804,7 +769,7 @@ no se ha seleccionado una parcela.
no se ha podido encontrar en qué región está.
</notification>
<notification name="CannotCloseFloaterBuyLand">
- No puede cerrar la ventana de Comprar terreno hasta que [APP_NAME] calcule el precio de esta transacción.
+ No puedes cerrar la ventana de Comprar terreno hasta que [APP_NAME] calcule el precio de esta transacción.
</notification>
<notification name="CannotDeedLandNothingSelected">
No se ha podido transferir el terreno:
@@ -812,7 +777,7 @@ no se ha seleccionado una parcela.
</notification>
<notification name="CannotDeedLandNoGroup">
No se ha podido transferir el terreno:
-no ha seleccionado un grupo.
+no has seleccionado un grupo.
</notification>
<notification name="CannotDeedLandNoRegion">
No se ha podido transferir el terreno:
@@ -820,23 +785,15 @@ Ha sido imposible encontrar en qué región está.
</notification>
<notification name="CannotDeedLandMultipleSelected">
No se ha podido transferir el terreno:
-ha seleccionado varias parcelas.
+has seleccionado varias parcelas.
-Inténtelo seleccionando sólo una.
- </notification>
- <notification name="ParcelCanPlayMedia">
- Esta localización puede mostrar media en streaming.
-Los media en streaming necesitan una conexión a internet rápida.
-
-Si hay media, ¿reproducirlos en streaming?
-(Puede cambiar más adelante esta opción en Preferencias &gt; Audio y Vídeo).
- <usetemplate name="okcancelbuttons" notext="Desactivar" yestext="Ejecutar los media"/>
+Inténtalo seleccionando sólo una.
</notification>
<notification name="CannotDeedLandWaitingForServer">
No se ha podido transferir el terreno:
esperando que el servidor informe acerca de la propiedad.
-Por favor, vuelva a intentarlo.
+Por favor, vuelve a intentarlo.
</notification>
<notification name="CannotDeedLandNoTransfer">
No se ha podido transferir el terreno:
@@ -846,18 +803,18 @@ En la región [REGION] no se permite transferir terrenos.
No se ha podido abandonar el terreno:
esperando que el servidor actualice la información de la parcela.
-Vuelva a intentarlo en unos segundos.
+Vuelve a intentarlo en unos segundos.
</notification>
<notification name="CannotReleaseLandSelected">
No se ha podido abandonar el terreno:
-no es propietario de todas las parcelas seleccionadas.
+no eres propietario de todas las parcelas seleccionadas.
-Por favor, seleccione una sola parcela.
+Por favor, selecciona una sola parcela.
</notification>
<notification name="CannotReleaseLandDontOwn">
No se ha podido abandonar el terreno:
-no tiene permisos sobre esta parcela.
-Las parcelas de su propiedad se muestran en verde.
+no tienes permisos sobre esta parcela.
+Las parcelas de tu propiedad se muestran en verde.
</notification>
<notification name="CannotReleaseLandRegionNotFound">
No se ha podido abandonar el terreno:
@@ -869,13 +826,13 @@ En la región [REGION] no se permite transferir terrenos.
</notification>
<notification name="CannotReleaseLandPartialSelection">
No se ha podido abandonar el terreno:
-debe seleccionar toda la parcela.
+debes seleccionar toda la parcela.
-Seleccione una parcela completa, o divídala primero.
+Selecciona una parcela completa, o divídela primero.
</notification>
<notification name="ReleaseLandWarning">
- Va a abandonar [AREA] m² de terreno.
-Al hacerlo, la quitará de entre sus posesiones de terreno, pero no recibirá ningún L$.
+ Vas a abandonar [AREA] m² de terreno.
+Al hacerlo, la quitarás de entre tus posesiones de terreno, pero no recibirás ningún L$.
¿Abandonar este terreno?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
@@ -883,13 +840,13 @@ Al hacerlo, la quitará de entre sus posesiones de terreno, pero no recibirá ni
<notification name="CannotDivideLandNothingSelected">
No se ha podido dividir el terreno:
-No ha seleccionado ninguna parcela.
+No has seleccionado ninguna parcela.
</notification>
<notification name="CannotDivideLandPartialSelection">
No se ha podido dividir el terreno:
-Ha seleccionado una parcela entera.
-Inténtelo seleccionando una parte.
+Has seleccionado una parcela entera.
+Inténtalo seleccionando una parte.
</notification>
<notification name="LandDivideWarning">
Dividir este terreno lo separará en dos parcelas, cada una de las cuales tendrá su propia configuración. Tras esta operación, algunas configuraciones volverán a las existentes por defecto.
@@ -911,40 +868,29 @@ No hay parcelas seleccionadas.
</notification>
<notification name="CannotJoinLandEntireParcelSelected">
No se ha podido unir el terreno:
-Sólo ha seleccionado una parcela.
+Sólo has seleccionado una parcela.
-Seleccione terreno que incluya algo de ambas parcelas.
+Selecciona terreno que incluya algo de ambas parcelas.
</notification>
<notification name="CannotJoinLandSelection">
No se ha podido unir el terreno:
-Debe seleccionar más de una parcela.
+Debes seleccionar más de una parcela.
-Seleccione terreno que incluya algo de ambas parcelas.
+Selecciona terreno que incluya algo de ambas parcelas.
</notification>
<notification name="JoinLandWarning">
- Al unir este terreno creará una parcela más grande formada por todas aquellas que tengan parte en el rectángulo seleccionado.
-Deberá reconfigurar el nombre y las opciones de la nueva parcela.
+ Al unir este terreno crearás una parcela más grande formada por todas aquellas que tengan parte en el rectángulo seleccionado.
+Deberás reconfigurar el nombre y las opciones de la nueva parcela.
¿Unir el terreno?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
- <notification name="ShowOwnersHelp">
- Mostrar los propietarios:
-El color de las parcelas indica el tipo de propietario.
-
-Verde = Su terreno
-Agua = Terreno de sus grupos
-Rojo = Propiedad de otros
-Amarillo = En venta
-Morado = Para subasta
-Gris = Público
- </notification>
<notification name="ConfirmNotecardSave">
- Esta nota debe guardarse antes de que se la pueda copiar o ver. ¿Guardar la nota?
+ Esta nota debe guardarse antes de que puedas copiarla o verla. ¿Guardar la nota?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ConfirmItemCopy">
- ¿Copiar este ítem a su inventario?
+ ¿Copiar este ítem a tu inventario?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Copiar"/>
</notification>
<notification name="ResolutionSwitchFail">
@@ -957,32 +903,31 @@ Gris = Público
Error, árboles no definidos: [SPECIES]
</notification>
<notification name="CannotSaveWearableOutOfSpace">
- No se ha podido guardar el archivo &apos;[NAME]&apos;. Tendrá que liberar algo de espacio en su ordenador y guardarlo de nuevo.
+ No se ha podido guardar el archivo &apos;[NAME]&apos;. Tendrás que liberar algo de espacio en tu ordenador y guardarlo de nuevo.
</notification>
<notification name="CannotSaveToAssetStore">
No se ha podido guardar [NAME] en la base central de almacenamiento.
-Esto es, generalmente, un fallo temporal. Por favor, reinténtelo en unos pocos minutos.
+Generalmente, esto es un fallo pasajero. Por favor, personaliza y guarda el ítem de aquí a unos minutos.
</notification>
<notification name="YouHaveBeenLoggedOut">
- Se ha cerrado su sesión en [SECOND_LIFE]:
+ Vaya, se ha cerrado tu sesión en [SECOND_LIFE].
[MESSAGE]
-Aún puede ver el chat y los MI existentes pulsando &apos;Ver MI y Chat&apos;. Si no, pulse &apos;Salir&apos; para dejar inmediatemente [APP_NAME].
<usetemplate name="okcancelbuttons" notext="Salir" yestext="Ver MI y Chat"/>
</notification>
<notification name="OnlyOfficerCanBuyLand">
No se ha podido comprar terreno para el grupo:
-usted no tiene el permiso de comprar terreno para el grupo que tiene activado actualmente.
+no tienes el permiso de comprar terreno para el grupo que tienes activado actualmente.
</notification>
<notification label="Añadir como amigo" name="AddFriend">
Los amigos pueden darse permiso para localizarse en el mapa y para saber si el otro está conectado.
-¿Ofrecer a [NAME] que sea su amigo?
+¿Ofrecer a [NAME] que sea tu amigo?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification label="Añadir como amigo" name="AddFriendWithMessage">
Los amigos pueden darse permiso para localizarse en el mapa y para saber si el otro está conectado.
-¿Ofrecer a [NAME] que sea su amigo?
+¿Ofrecer a [NAME] que sea tu amigo?
<form name="form">
<input name="message">
¿Quieres formar parte de mis amigos?
@@ -991,113 +936,149 @@ usted no tiene el permiso de comprar terreno para el grupo que tiene activado ac
<button name="Cancel" text="Cancelar"/>
</form>
</notification>
+ <notification label="Guardar el vestuario" name="SaveOutfitAs">
+ Guardar como un nuevo vestuario lo que estoy llevando:
+ <form name="form">
+ <input name="message">
+ [DESC] (nuevo)
+ </input>
+ <button name="Offer" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification label="Guardar artículo" name="SaveWearableAs">
+ Guardar el ítem en mi inventario como:
+ <form name="form">
+ <input name="message">
+ [DESC] (nuevo)
+ </input>
+ <button name="Offer" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification label="Renombrar el vestuario" name="RenameOutfit">
+ Nombre del nuevo vestuario:
+ <form name="form">
+ <input name="new_name">
+ [NAME]
+ </input>
+ <button name="Offer" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
<notification name="RemoveFromFriends">
- ¿Quiere quitar a [FIRST_NAME] [LAST_NAME] de su lista de amigos?
+ ¿Quieres quitar a [FIRST_NAME] [LAST_NAME] de tu lista de amigos?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="RemoveMultipleFromFriends">
- ¿Quiere quitar a varios amigos de su lista de amigos?
+ ¿Quieres quitar a varios amigos de tu lista de amigos?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="GodDeleteAllScriptedPublicObjectsByUser">
- ¿Está seguro de que quiere borrar todos los objetos con script que sean propiedad de
+ ¿Estás seguro de que quieres borrar todos los objetos con script que sean propiedad de
** [AVATAR_NAME] **
en todos los otros terrenos de este sim?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="GodDeleteAllScriptedObjectsByUser">
- ¿Está seguro de que quiere BORRAR TODOS los objetos con script que sean propiedad de
+ ¿Estás seguro de que quieres BORRAR TODOS los objetos con script que sean propiedad de
** [AVATAR_NAME] **
en TODO EL TERRENO de este sim?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="GodDeleteAllObjectsByUser">
- ¿Está seguro de que quiere BORRAR TODOS los objetos (con script o no) que sean propiedad de
+ ¿Estás seguro de que quieres BORRAR TODOS los objetos (con script o no) que sean propiedad de
** [AVATAR_NAME] **
en TODO EL TERRENO de este sim?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="BlankClassifiedName">
- Debe especificar un nombre para su clasificado.
+ Debes especificar un nombre para tu clasificado.
</notification>
<notification name="MinClassifiedPrice">
El pago para aparecer en la lista debe ser de, al menos, [MIN_PRICE] L$.
-Por favor, elija un pago mayor.
+Por favor, elige un pago mayor.
+ </notification>
+ <notification name="ConfirmItemDeleteHasLinks">
+ Por lo menos uno de los elementos seleccionados contiene vínculos que le señalan. Si eliminas este elemento, los vínculos dejarán de funcionar permanentemente. Lo más recomendable es eliminar primero los vínculos.
+
+¿Estás seguro de que quieres eliminar los elementos?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ConfirmObjectDeleteLock">
- Al menos uno de los ítems que ha seleccionado está bloqueado.
+ Al menos uno de los ítems que has seleccionado está bloqueado.
-¿Está seguro de que quiere borrar estos ítems?
+¿Estás seguro de que quieres borrar estos ítems?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ConfirmObjectDeleteNoCopy">
- Al menos uno de los ítems que ha seleccionado no es copiable.
+ Al menos uno de los ítems que has seleccionado no es copiable.
-¿Está seguro de que quiere borrar estos ítems?
+¿Estás seguro de que quieres borrar estos ítems?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ConfirmObjectDeleteNoOwn">
- No es el propietario de, al menos, uno de los ítems que ha seleccionado.
+ No eres el propietario de, al menos, uno de los ítems que has seleccionado.
-¿Está seguro de que quiere borrar estos ítems?
+¿Estás seguro de que quieres borrar estos ítems?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ConfirmObjectDeleteLockNoCopy">
Al menos un objeto está bloqueado.
Al menos un objeto no es copiable.
-¿Está seguro de que quiere borrar estos ítems?
+¿Estás seguro de que quieres borrar estos ítems?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ConfirmObjectDeleteLockNoOwn">
Al menos un objeto está bloqueado.
-No es propietario de, al menos, un objeto.
+No eres propietario de, al menos, un objeto.
-¿Está seguro de que quiere borrar estos ítems?
+¿Estás seguro de que quieres borrar estos ítems?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ConfirmObjectDeleteNoCopyNoOwn">
Al menos un objeto no es copiable.
-No es propietario de, al menos, un objeto.
+No eres propietario de, al menos, un objeto.
-¿Está seguro de que quiere borrar estos ítems?
+¿Estás seguro de que quieres borrar estos ítems?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
Al menos un objeto está bloqueado.
Al menos un objeto no es copiable.
-No es propietario de, al menos, un objeto.
+No eres propietario de, al menos, un objeto.
-¿Está seguro de que quiere borrar estos ítems?
+¿Estás seguro de que quieres borrar estos ítems?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ConfirmObjectTakeLock">
Al menos un objeto está bloqueado.
-¿Está seguro de que quiere tomar estos ítems?
+¿Estás seguro de que quieres tomar estos ítems?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ConfirmObjectTakeNoOwn">
- No es el propietario de todos los objetos que está tomando.
-Si sigue, se aplicarán los permisos marcados para el próximo propietario, y es posible que se restrinja su posibilidad de hacer modificaciones o copias.
+ No eres el propietario de todos los objetos que estás tomando.
+Si sigues, se aplicarán los permisos marcados para el próximo propietario, y es posible que se restrinja tu posibilidad de hacer modificaciones o copias.
-¿Está seguro de que quiere tomar estos ítems?
+¿Estás seguro de que quieres tomar estos ítems?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ConfirmObjectTakeLockNoOwn">
Al menos un objeto está bloqueado.
-No es el propietario de todos los objetos que está tomando.
-Si sigue, se aplicarán los permisos marcados para el próximo propietario, y es posible que se restrinja su posibilidad de hacer modificaciones o copias
-Con todo, puede tomar lo actualmente seleccionado.
+No eres el propietario de todos los objetos que estás tomando.
+Si sigues, se aplicarán los permisos marcados para el próximo propietario, y es posible que se restrinja tu posibilidad de hacer modificaciones o copias.
+Con todo, puedes tomar lo actualmente seleccionado.
-¿Está seguro de que quiere tomar estos ítems?
+¿Estás seguro de que quieres tomar estos ítems?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="CantBuyLandAcrossMultipleRegions">
No se ha podido hacer la compra porque el terreno seleccionado se extiende por varias regiones.
-Por favor, seleccione un área más pequeña y reinténtelo.
+Por favor, selecciona un área más pequeña y vuelve a intentarlo.
</notification>
<notification name="DeedLandToGroup">
Al transferir esta parcela, se requerirá al grupo que tenga y mantenga el crédito suficiente para uso de terreno.
@@ -1118,44 +1099,46 @@ Si se vende una parcela transferida, el precio de venta se dividirá a partes ig
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="DisplaySetToSafe">
- Las configuraciones que se muestran se han fijado en los niveles guardados, pues usted especificó la opción de guardarlos.
+ Las configuraciones que se muestran se han fijado en los niveles guardados, pues especificaste la opción de guardarlos.
</notification>
<notification name="DisplaySetToRecommended">
- Las configuraciones que se muestran se han fijado en los niveles recomendados para la configuración de su sistema.
+ Las configuraciones que se muestran se han fijado en los niveles recomendados para la configuración de tu sistema.
</notification>
<notification name="ErrorMessage">
[ERROR_MESSAGE]
- </notification>
- <notification name="AvatarMoved">
- Su localización [TYPE] no está disponible en estos momentos. [HELP]
-Ha sido llevado a una región cercana.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AvatarMovedDesired">
- La localización que ha elegido no está disponible en estos momentos.
-Ha sido llevado a una región cercana.
+ La localización que querías no está disponible en estos momentos.
+Se te ha llevado a una región cercana.
</notification>
<notification name="AvatarMovedLast">
- Su última posición no está disponible en estos momentos.
-Ha sido llevado a una región cercana.
+ En estos momentos no está disponible tu última posición.
+Se te ha llevado a una región cercana.
+ </notification>
+ <notification name="AvatarMovedHome">
+ En estos momentos no está disponible tu Base.
+Se te ha llevado a una región cercana.
+Quizá quieras configurar una nueva posición para tu Base.
</notification>
<notification name="ClothingLoading">
- Aún está descargándose su ropa.
-Puede usar normalmente [SECOND_LIFE], los demás residentes le verán correctamente.
+ Aún está descargándose tu ropa.
+Puedes usar [SECOND_LIFE] de forma normal; los demás residentes te verán correctamente.
<form name="form">
- <ignore name="ignore" text="Cuando está llevando mucho tiempo descargar la ropa"/>
+ <ignore name="ignore" text="La ropa está tardando mucho en descargarse"/>
</form>
</notification>
<notification name="FirstRun">
- Se ha completado la instalación de [APP_NAME].
+ Se ha completado la instalación de [SECOND_LIFE].
-Si esta es la primera vez que usa [SECOND_LIFE], deberá crear una cuenta antes de que pueda iniciar una sesión.
-¿Volver a [https://join.secondlife.com/index.php?lang=es-ES secondlife.com] para crear una cuenta nueva?
+Si es la primera vez que usas [SECOND_LIFE], debes crear una cuenta antes de poder iniciar una sesión.
+¿Volver a [http://join.secondlife.com secondlife.com] para crear una cuenta nueva?
<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Cuenta nueva..."/>
</notification>
<notification name="LoginPacketNeverReceived">
- Tenemos problemas de conexión. Puede deberse a un problema de su conexión a internet o de los servidores de [SECOND_LIFE].
+ Tenemos problemas de conexión. Puede deberse a un problema de tu conexión a Internet o de [SECOND_LIFE_GRID].
-Puede revisar su conexión a internet y volver a intentarlo en unos minutos. Pulse Ayuda para conectarse a nuestro sitio de Sporte, o pulse Teleportar para intentar teleportarse a su Base.
+Puedes revisar tu conexión a Internet y volver a intentarlo en unos minutos, pulsar Ayuda para conectarte a [SUPPORT_SITE], o pulsar Teleporte para intentar teleportarte a tu Base.
<url name="url">
http://es.secondlife.com/support/
</url>
@@ -1166,43 +1149,79 @@ Puede revisar su conexión a internet y volver a intentarlo en unos minutos. Pul
</form>
</notification>
<notification name="WelcomeChooseSex">
- Su personaje aparecerá en un momento.
+ Tu personaje aparecerá en un momento.
-Para caminar, use las teclas del cursor.
-En cualquier momento, puede pulsar la tecla F1 para conseguir ayuda o para aprender más acerca de [SECOND_LIFE].
-Por favor, elija el avatar masculino o femenino.
-Puede cambiar más adelante su elección.
+Para caminar, usa las teclas del cursor.
+En cualquier momento, puedes pulsar la tecla F1 para conseguir ayuda o para aprender más acerca de [SECOND_LIFE].
+Por favor, elige el avatar masculino o femenino.
+Puedes cambiar más adelante tu elección.
<usetemplate name="okcancelbuttons" notext="Mujer" yestext="Varón"/>
</notification>
+ <notification name="CantTeleportToGrid">
+ No se puede hacer el teleporte a [SLURL] porque se encuentra en una cuadrícula ([GRID]) diferente de la actual ([CURRENT_GRID]). Cierra el visor y vuelve a intentarlo.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="GeneralCertificateError">
+ No se puede establecer la conexión con el servidor.
+[REASON]
+
+Nombre del asunto: [SUBJECT_NAME_STRING]
+Nombre del emisor: [ISSUER_NAME_STRING]
+Válido desde: [VALID_FROM]
+Válido hasta: [VALID_TO]
+Huella digital MD5: [SHA1_DIGEST]
+Huella digital SHA1: [MD5_DIGEST]
+Uso de la clave: [KEYUSAGE]
+Uso de clave extendida: [EXTENDEDKEYUSAGE]
+Identificador de clave de asunto: [SUBJECTKEYIDENTIFIER]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TrustCertificateError">
+ La autoridad de certificación de este servidor se desconoce.
+
+Información del certificado:
+Nombre del asunto: [SUBJECT_NAME_STRING]
+Nombre del emisor: [ISSUER_NAME_STRING]
+Válido desde: [VALID_FROM]
+Válido hasta: [VALID_TO]
+Huella digital MD5: [SHA1_DIGEST]
+Huella digital SHA1: [MD5_DIGEST]
+Uso de la clave: [KEYUSAGE]
+Uso de clave extendida: [EXTENDEDKEYUSAGE]
+Identificador de clave de asunto: [SUBJECTKEYIDENTIFIER]
+
+¿Deseas confiar en esta autoridad?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Confiar"/>
+ </notification>
<notification name="NotEnoughCurrency">
- [NAME] cuesta [PRICE] L$. No tiene suficientes L$ para hacer eso.
+ [NAME] cuesta [PRICE] L$. No tienes suficientes L$ para hacer eso.
</notification>
<notification name="GrantedModifyRights">
- Se le ha concedido el privilegio de modificar los objetos de [FIRST_NAME] [LAST_NAME].
+ [NAME] te ha dado permiso para modificar sus objetos.
</notification>
<notification name="RevokedModifyRights">
- Ha sido revocado su privilegio de modificar los objetos de [FIRST_NAME] [LAST_NAME].
+ Ha sido revocado tu privilegio de modificar los objetos de [NAME]
</notification>
<notification name="FlushMapVisibilityCaches">
- Esto limpiará las caches del mapa en esta región.
+ Esto limpiará las cachés del mapa en esta región.
Esto sólo es realmente útil para cuestiones de depuración (&apos;debugging&apos;).
-(A efectos prácticos, espere 5 minutos, y el mapa de cualquiera se actualizará después de que reinicie sesión).
+(A efectos prácticos, espera 5 minutos, y el mapa de cualquiera se actualizará después de que reinicies sesión).
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="BuyOneObjectOnly">
- No se puede comprar más de un objeto a la vez. Por favor, seleccione sólo un objeto y vuelva a intentarlo.
+ No se puede comprar más de un objeto a la vez. Por favor, selecciona sólo un objeto y vuelve a intentarlo.
</notification>
<notification name="OnlyCopyContentsOfSingleItem">
No se puede copiar a la vez los contenidos de más de un objeto.
-Por favor, selección sólo uno y reinténtelo.
+Por favor, selecciona sólo uno y vuelve a intentarlo.
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="KickUsersFromRegion">
- ¿Teleportar a su base a todos los residentes en esta región?
+ ¿Teleportar a tu base a todos los residentes en esta región?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="EstateObjectReturn">
- ¿Está seguro de que quiere devolver los objetos propiedad de
+ ¿Estás seguro de que quieres devolver los objetos propiedad de
[USER_NAME] ?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
@@ -1210,193 +1229,210 @@ Por favor, selección sólo uno y reinténtelo.
No se han podido configurar las texturas de la región:
La textura del terreno [TEXTURE_NUM] tiene una profundidad de bites inválida: [TEXTURE_BIT_DEPTH].
-Cambie la textura [TEXTURE_NUM] por una imagen de 24-bit y 512x512 o menor, y pulse de nuevo &apos;Aplicar&apos; .
+Cambia la textura [TEXTURE_NUM] por una imagen de 24-bit y 512x512 o menor, y pulsa de nuevo &apos;Aplicar&apos; .
</notification>
<notification name="InvalidTerrainSize">
No se han podido configurar las texturas de la región:
La textura del terreno [TEXTURE_NUM] es demasiado grande: [TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y].
-Cambie la textura [TEXTURE_NUM] por una imagen de 24-bit y 512x512 o menor, y pulse de nuevo &apos;Aplicar&apos; .
+Cambia la textura [TEXTURE_NUM] por una imagen de 24-bit y 512x512 o menor, y pulsa de nuevo &apos;Aplicar&apos; .
</notification>
<notification name="RawUploadStarted">
- Ha empezado la subida. Dependiendo de la velocidad de su conexión, llevará unos dos minutos.
+ Ha empezado la subida. Dependiendo de la velocidad de tu conexión, llevará unos dos minutos.
</notification>
<notification name="ConfirmBakeTerrain">
- ¿Realmente quiere predeterminar el terreno actual, haciéndolo el centro de los limites para elevarlo y rebajarlo, y el terreno por defecto para la herramienta &apos;Revertir&apos;?
+ ¿Realmente quieres predeterminar el terreno actual, haciéndolo el centro de los limites para elevarlo y rebajarlo, y el terreno por defecto para la herramienta &apos;Revertir&apos;?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="MaxAllowedAgentOnRegion">
- Sólo puede tener [MAX_AGENTS] residentes autorizados.
+ Sólo puedes tener [MAX_AGENTS] residentes autorizados.
</notification>
<notification name="MaxBannedAgentsOnRegion">
- Sólo puede tener [MAX_BANNED] residentes no admitidos.
+ Sólo puedes tener [MAX_BANNED] residentes no admitidos.
</notification>
<notification name="MaxAgentOnRegionBatch">
Fallo al intentar añadir [NUM_ADDED] agentes:
Se superan en [NUM_EXCESS] los [MAX_AGENTS] permitidos en [LIST_TYPE].
</notification>
<notification name="MaxAllowedGroupsOnRegion">
- Sólo puede tener [MAX_GROUPS] grupos permitidos.
+ Sólo puedes tener [MAX_GROUPS] grupos permitidos.
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Predeterminar"/>
</notification>
<notification name="MaxManagersOnRegion">
- Sólo puede tener [MAX_MANAGER] administradores del estado.
+ Sólo puedes tener [MAX_MANAGER] administradores del estado.
</notification>
<notification name="OwnerCanNotBeDenied">
No se puede añadir a la lista de residentes no admitidos al propietario del estado.
</notification>
<notification name="CanNotChangeAppearanceUntilLoaded">
- No puede cambiar la apariencia hasta que no se carguen la ropa y la forma.
+ No puedes cambiar la apariencia hasta que no se carguen la ropa y la forma.
</notification>
<notification name="ClassifiedMustBeAlphanumeric">
- El nombre de su anuncio clasificado debe empezar o con un número o con una letra de la A a la Z. No se permiten signos de puntuación.
+ El nombre de tu anuncio clasificado debe empezar o con un número o con una letra de la A a la Z. No se permiten signos de puntuación.
</notification>
<notification name="CantSetBuyObject">
No puede configurar el Comprar el objeto, porque éste no está en venta.
-Por favor, ponga en venta el objeto y reinténtelo.
+Por favor, pon en venta el objeto y vuelve a intentarlo.
</notification>
<notification name="FinishedRawDownload">
Acabada la descarga del archivo raw de terreno en:
[DOWNLOAD_PATH].
</notification>
<notification name="DownloadWindowsMandatory">
- Está disponible una versión nueva de [APP_NAME].
+ Hay una versión nueva de [SECOND_LIFE] disponible.
[MESSAGE]
-Debe descargar esta actualización para usar [APP_NAME].
+Debes descargar esta actualización para usar [SECOND_LIFE].
<usetemplate name="okcancelbuttons" notext="Salir" yestext="Descargarla"/>
</notification>
<notification name="DownloadWindows">
- Está disponible una versión actualizada de [APP_NAME].
+ Hay una versión actualizada de [SECOND_LIFE] disponible.
[MESSAGE]
-Esta actualización no es obligatoria, pero le sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/>
</notification>
<notification name="DownloadWindowsReleaseForDownload">
- Está disponible una versión actualizada de [APP_NAME].
+ Hay una versión actualizada de [SECOND_LIFE] disponible.
[MESSAGE]
-Esta actualización no es obligatoria, pero le sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/>
</notification>
+ <notification name="DownloadLinuxMandatory">
+ Hay una versión nueva de [SECOND_LIFE] disponible.
+[MESSAGE]
+Debes descargar esta actualización para usar [SECOND_LIFE].
+ <usetemplate name="okcancelbuttons" notext="Salir" yestext="Descargar"/>
+ </notification>
+ <notification name="DownloadLinux">
+ Hay una versión actualizada de [SECOND_LIFE] disponible.
+[MESSAGE]
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+ <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargar"/>
+ </notification>
+ <notification name="DownloadLinuxReleaseForDownload">
+ Hay una versión actualizada de [SECOND_LIFE] disponible.
+[MESSAGE]
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+ <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargar"/>
+ </notification>
<notification name="DownloadMacMandatory">
- Está disponible una versión nueva de [APP_NAME].
+ Hay una versión nueva de [SECOND_LIFE] disponible.
[MESSAGE]
-Debe descargar esta actualización para usar [APP_NAME].
+Debes descargar esta actualización para usar [SECOND_LIFE].
-¿Descargarla a su carpeta de aplicaciones?
+¿Descargarla a tu carpeta de Programas?
<usetemplate name="okcancelbuttons" notext="Salir" yestext="Descargarla"/>
</notification>
<notification name="DownloadMac">
- Está disponible una versión actualizada de [APP_NAME].
+ Hay una versión actualizada de [SECOND_LIFE] disponible.
[MESSAGE]
-Esta actualización no es obligatoria, pero le sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
-¿Descargarla a su carpeta de aplicaciones?
+¿Descargarla a tu carpeta de Programas?
<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/>
</notification>
<notification name="DownloadMacReleaseForDownload">
- Está disponible una versión actualizada de [APP_NAME].
+ Hay una versión actualizada de [SECOND_LIFE] disponible.
[MESSAGE]
-Esta actualización no es obligatoria, pero le sugerimos instalarla para mejorar el rendimiento y la estabilidad.
+Esta actualización no es obligatoria, pero te sugerimos instalarla para mejorar el rendimiento y la estabilidad.
-¿Descargarla a su carpeta de aplicaciones?
+¿Descargarla a tu carpeta de Programas?
<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Descargarla"/>
</notification>
<notification name="DeedObjectToGroup">
Transferir este objeto al grupo hará que:
* Reciba los L$ pagados en el objeto
- <usetemplate ignoretext="Cuando se transfieren objetos a los grupos" name="okcancelignore" notext="Cancelar" yestext="Transferir"/>
+ <usetemplate ignoretext="Confirmar antes de transferir un objeto al grupo" name="okcancelignore" notext="Cancelar" yestext="Transferir"/>
</notification>
<notification name="WebLaunchExternalTarget">
- ¿Abrir el navegador de su sistema para ver este contenido?
- <usetemplate ignoretext="Cuando se abra el navegador de su sistema para ver una página web" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ ¿Quieres abrir tu navegador para ver este contenido?
+ <usetemplate ignoretext="Abrir mi navegador para ver una página web" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="WebLaunchJoinNow">
- ¿Ir a www.secondlife.com para administrar su cuenta?
- <usetemplate ignoretext="Cuando se abra el navegador para administrar su cuenta" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ ¿Ir al [http://secondlife.com/account/ Panel de Control] para administrar tu cuenta?
+ <usetemplate ignoretext="Abrir mi navegador para administrar mi cuenta" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="WebLaunchSecurityIssues">
- Visite el wiki de [SECOND_LIFE] para más detalles sobre cómo informar de una cuestión de seguridad.
- <usetemplate ignoretext="Cuando se abra el navegador para ver el wiki de cuestiones de seguridad" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ Visita el wiki de [SECOND_LIFE] para más detalles sobre cómo informar de una cuestión de seguridad.
+ <usetemplate ignoretext="Abrir mi navegador para informar de un fallo de seguridad" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="WebLaunchQAWiki">
- Visite el wiki QA de [SECOND_LIFE].
- <usetemplate ignoretext="Cuando se abra el navegador para ver el wiki QA" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ Visita el wiki QA de [SECOND_LIFE].
+ <usetemplate ignoretext="Abrir mi navegador para el ver el wiki de &apos;QA&apos; (Control de Calidad)" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="WebLaunchPublicIssue">
- Visite el Public Issue Tracker (sistema público de seguimiento de incidencias) de [SECOND_LIFE], donde podrá informar de errores y otros asuntos.
- <usetemplate ignoretext="Cuando se abra el navegador para ver el Public Issue Tracker" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/>
- </notification>
- <notification name="WebLaunchPublicIssueHelp">
- Visite el wiki de [SECOND_LIFE] para informarse de cómo usar el Public Issue Tracker (sistema público de seguimiento de incidencias).
- <usetemplate ignoretext="Cuando se abra el navegador para ver el wiki del Public Issue Tracker" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/>
+ Visita el Public Issue Tracker (sistema público de seguimiento de incidencias) de [SECOND_LIFE], donde podrás informar de errores y otros asuntos.
+ <usetemplate ignoretext="Abrir mi navegador para usar el &apos;Public Issue Tracker&apos;" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/>
</notification>
<notification name="WebLaunchSupportWiki">
Para ver las últimas noticias e informaciones, ¿ir la Blog oficial?
- <usetemplate ignoretext="Cuando se abra el navegador para ver el blog" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ <usetemplate ignoretext="Abrir mi navegador para ver el blog" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="WebLaunchLSLGuide">
- ¿Ir a la Guía de programación para encontrar ayuda?
- <usetemplate ignoretext="Cuando se abra el navegador para ver la Guía de programación" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ ¿Quieres abrir la Guía de Script para tener ayuda sobre el tema?
+ <usetemplate ignoretext="Abrir mi navegador para ver la Guía de Script" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="WebLaunchLSLWiki">
- ¿Ir al portal de LSL para encontrar ayuda sobre programación?
- <usetemplate ignoretext="Cuando se abra el navegador para ver el portal de programación" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/>
+ ¿Quieres visitar el portal de LSL para tener ayuda sobre manejo de scripts?
+ <usetemplate ignoretext="Abrir mi navegador para ver el portal de LSL" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/>
</notification>
<notification name="ReturnToOwner">
- ¿Está seguro de que quiere devolver los objetos seleccionados a sus propietarios? Los objetos transferibles que se hayan cedido volverán a sus propietarios anteriores.
+ ¿Estás seguro de que quieres devolver los objetos seleccionados a sus propietarios? Los objetos transferibles que se hayan cedido volverán a sus propietarios anteriores.
*ATENCIÓN* ¡Serán borrados los objetos no transferibles que estén cedidos!
- <usetemplate ignoretext="Cuando se devuelvan los objetos a sus propietarios" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ <usetemplate ignoretext="Confirmar antes de devolver objetos a sus propietarios." name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="GroupLeaveConfirmMember">
- Actualmente, usted es miembro del grupo [GROUP].
+ Actualmente, eres miembro del grupo [GROUP].
¿Dejar el grupo?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ConfirmKick">
- ¿DE VERDAD quiere expulsar a todos los usuarios de este grid?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar a todos los usuarios"/>
+ ¿Quieres realmente expulsar a todos los residentes de la cuadrícula?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar a todos los Residentes"/>
</notification>
<notification name="MuteLinden">
- Perdón, pero no puede ignorar a un Linden.
+ Lo sentimos, pero no puedes ignorar a un Linden.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="CannotStartAuctionAlreadyForSale">
- No puede empezar una subasta en una parcela que ya está en venta. Desactive la venta de terreno si está seguro de querer iniciar una subasta.
+ No puedes empezar una subasta en una parcela que ya está en venta. Desactiva la venta de terreno si estás seguro de querer iniciar una subasta.
</notification>
- <notification label="Fallo al ignorar un objeto según el nombre" name="MuteByNameFailed">
- Ya ha ignorado ese nombre.
+ <notification label="Falló ignorar el objeto según su nombre." name="MuteByNameFailed">
+ Ya has ignorado este nombre.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="RemoveItemWarn">
Aunque esté permitido, borrar contenidos puede dañar el objeto.
-¿Quiere borrar ese ítem?
+¿Quieres borrar ese ítem?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="CantOfferCallingCard">
- En este momento, no se puede ofrecer una tarjeta de visita. Por favor, reinténtelo en un momento.
+ En este momento, no se puede ofrecer una tarjeta de visita. Por favor, vuelve a intentarlo en un momento.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="CantOfferFriendship">
- En este momento, no se puede ofrecer el ser amigo. Por favor, reinténtelo en un momento.
+ En este momento, no se puede ofrecer el ser amigo. Por favor, vuelve a intentarlo en un momento.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="BusyModeSet">
Pasar al modo ocupado.
-Se ocultará el chat y los mensajes instantáneos. Los mensajes instantáneos recibirán su Respuesta en el modo ocupado. Todos los ofrecimientos de teleporte serán rehusados. Todas las ofertas de inventario irán a su Papelera.
- <usetemplate ignoretext="Cuando se pasa al modo ocupado" name="okignore" yestext="OK"/>
+Se ocultará el chat y los mensajes instantáneos (éstos recibirán tu Respuesta en el modo ocupado). Se rehusarán todos los ofrecimientos de teleporte. Todas las ofertas de inventario irán a tu Papelera.
+ <usetemplate ignoretext="Cambio mi estado al modo ocupado" name="okignore" yestext="OK"/>
</notification>
<notification name="JoinedTooManyGroupsMember">
- Pertenece a demasiados grupos para poder entrar en otro. Por favor, salga de al menos uno antes de entrar en éste, o rehúse la oferta. Para salir de un grupo, seleccione la opción &apos;Grupos...&apos; en el menú &apos;Editar&apos;.
-[NAME] le ha invitado a ser miembro de un grupo.
-[INVITE]
+ Has superado tu número máximo de grupos. Por favor, sal de al menos uno antes de entrar en éste, o rehúsa la oferta.
+[NAME] te ha invitado a ser miembro de un grupo.
<usetemplate name="okcancelbuttons" notext="Rehusar" yestext="Entrar"/>
</notification>
+ <notification name="JoinedTooManyGroups">
+ Has superado tu número máximo de grupos. Por favor, sal de al menos uno de ellos antes de crear uno nuevo o entrar en alguno.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="KickUser">
- ¿Con qué mensaje se expulsará a este usuario?
+ ¿Con qué mensaje quieres expulsar a este Residente?
<form name="form">
<input name="message">
- Un administrador le ha desconectado.
+ Un administrador te ha desconectado.
</input>
<button name="OK" text="OK"/>
<button name="Cancel" text="Cancelar"/>
@@ -1406,34 +1442,34 @@ Se ocultará el chat y los mensajes instantáneos. Los mensajes instantáneos re
¿Con qué mensaje se expulsará a cualquiera que esté actualmente en el grid?
<form name="form">
<input name="message">
- Un administrador le ha desconectado.
+ Un administrador te ha desconectado.
</input>
<button name="OK" text="OK"/>
<button name="Cancel" text="Cancelar"/>
</form>
</notification>
<notification name="FreezeUser">
- ¿Con qué mensaje se congelará a este usuario?
+ ¿Con qué mensaje quieres congelar a este residente?
<form name="form">
<input name="message">
- Ha sido usted congelado. No puede moverse o escribir en el chat. Un administrador contactará con usted a través de un mensaje instantáneo (MI).
+ Has sido congelado. No puedes moverte o escribir en el chat. Un administrador se pondrá en contacto contigo a través de un mensaje instantáneo (MI).
</input>
<button name="OK" text="OK"/>
<button name="Cancel" text="Cancelar"/>
</form>
</notification>
<notification name="UnFreezeUser">
- ¿Con qué mensaje se descongelará a este usuario?
+ ¿Con qué mensaje quieres congelar a este residente?
<form name="form">
<input name="message">
- Ya no está usted congelado.
+ Ya no estás congelado.
</input>
<button name="OK" text="OK"/>
<button name="Cancel" text="Cancelar"/>
</form>
</notification>
<notification name="OfferTeleport">
- ¿Ofrecer teleporte a su posición con este mensaje?
+ ¿Ofrecer teleporte a tu posición con este mensaje?
<form name="form">
<input name="message">
Ven conmigo a [REGION]
@@ -1443,7 +1479,7 @@ Se ocultará el chat y los mensajes instantáneos. Los mensajes instantáneos re
</form>
</notification>
<notification name="OfferTeleportFromGod">
- ¿Convocar a este usuario a su posición?
+ ¿Obligar a este Residente a ir a tu localización?
<form name="form">
<input name="message">
Ven conmigo a [REGION]
@@ -1453,11 +1489,23 @@ Se ocultará el chat y los mensajes instantáneos. Los mensajes instantáneos re
</form>
</notification>
<notification name="TeleportFromLandmark">
- ¿Está seguro de que quiere teleportarse?
- <usetemplate ignoretext="Cuando está teleportando desde un hito del inventario" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
+ ¿Seguro que quieres teleportarte a &lt;nolink&gt;[LOCATION]&lt;/nolink&gt;?
+ <usetemplate ignoretext="Confirmar que quiero teleportarme a un hito" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
+ </notification>
+ <notification name="TeleportToPick">
+ ¿Teleportarte a [PICK]?
+ <usetemplate ignoretext="Confirmar el teleporte a una localización de los Destacados" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
+ </notification>
+ <notification name="TeleportToClassified">
+ ¿Teleportarte a [CLASSIFIED]?
+ <usetemplate ignoretext="Confirmar el teleporte a una localización de los Clasificados" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
+ </notification>
+ <notification name="TeleportToHistoryEntry">
+ ¿Teleportarse a [HISTORY_ENTRY]?
+ <usetemplate ignoretext="Confirmar que quiero teleportarme a una localización del historial" name="okcancelignore" notext="Cancelar" yestext="Teleportar"/>
</notification>
<notification label="Mensaje a todo el estado" name="MessageEstate">
- Escriba un anuncio breve que se enviará a todo el que esté en su estado.
+ Escribe un anuncio breve que se enviará a todo el que esté en tu estado.
<form name="form">
<input name="message"/>
<button name="OK" text="OK"/>
@@ -1465,15 +1513,15 @@ Se ocultará el chat y los mensajes instantáneos. Los mensajes instantáneos re
</form>
</notification>
<notification label="Cambiar un estado Linden" name="ChangeLindenEstate">
- Va a hacer cambios en un estado propiedad de Linden (mainland, grid teen, orientación, etc.).
+ Estás a punto de cambiar un estado propiedad de Linden (continente, teen grid, orientación, etc.).
-Esto es EXTREMADAMENTE PELIGROSO, porque puede afectar radicalmente al funcionamiento de los usuarios. En mainland, se cambiarán miles de regiones, y se provocará un colapso en el espacio del servidor.
+Esto es EXTREMADAMENTE PELIGROSO porque puede afectar en gran manera la experiencia de los Residentes. En el Continente, cambiará miles de regiones y y se provocará un colapso en el espacio del servidor.
-¿Proceder?
+¿Continuar?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification label="Cambiar el acceso a un estado Linden" name="ChangeLindenAccess">
- Va a cambiar la lista de acceso de un estado propiedad de Linden (mainland, grid teen, orientación, etc.).
+ Vas a cambiar la lista de acceso de un estado propiedad de Linden (mainland, grid teen, orientación, etc.).
Esto es PELIGROSO, y sólo debe hacerse para deshacerse de ataques que permitan sacar o meter en el grid objetos o L$.
Se cambiarán miles de regiones, y se provocará un colapso en el espacio del servidor.
@@ -1516,118 +1564,90 @@ Se cambiarán miles de regiones, y se provocará un colapso en el espacio del se
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="EstateChangeCovenant">
- ¿Está seguro de que quiere cambiar el contrato del estado?
+ ¿Estás seguro de que quieres cambiar el contrato del estado?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="RegionEntryAccessBlocked">
- Usted no está autorizado en esa región por su nivel de calificación. Puede deberse a que no hay información validada de su edad.
+ No estás autorizado en esa región por su nivel de calificación. Puede deberse a que no hay información validada de tu edad.
-Por favor, compruebe que tiene instalado el último visor, y vaya a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+Por favor, comprueba que tienes instalado el último visor, y dirígete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="RegionEntryAccessBlocked_KB">
- Usted no está autorizado en esa región por su nivel de calificación.
+ No estás autorizado en esa región por su nivel de calificación.
-¿Quiere ir a la Base de Conocimientos para aprender más sobre el nivel de calificación?
+¿Quieres ir a la Base de Conocimientos para aprender más sobre el nivel de calificación?
<url name="url">
http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
</url>
- <usetemplate
- name="okcancelignore"
- yestext="Ir a la Base de Conocimientos"
- notext="Cerrar"
- ignoretext="Cuando la entrada a la región está bloqueada por el nivel de calificación"/>
+ <usetemplate ignoretext="No puedo entrar a esta región dado el nivel de calificación" name="okcancelignore" notext="Cerrar" yestext="Ir a la Base de Conocimientos"/>
</notification>
<notification name="RegionEntryAccessBlocked_Notify">
- Usted no está autorizado en esa región por su nivel de calificación.
+ No estás autorizado en esa región por su nivel de calificación.
</notification>
<notification name="RegionEntryAccessBlocked_Change">
- Usted no está autorizado en esa región por su nivel de calificación..
-
-Puede pulsar &apos;Cambiar preferencia&apos; para aumentar su nivel de calificación y poder entrar. Desde ese momento, podrá buscar y acceder a contenido [REGIONMATURITY]. Si más adelante quiere deshacer esta configuración, vaya a Editar &gt; Preferencias... &gt; General.
- <form name="form">
- <button
- name="OK"
- text="Cambiar preferencia"/>
- <button
- default="true"
- name="Cancel"
- text="Cerrar"/>
- <ignore name="ignore" text="Cuando la entrada a la región está bloqueada por la preferencia del nivel de calificación"/>
- </form>
+ No estás autorizado en esta región por tus preferencias sobre el nivel de calificación.
+
+Para entrar en la región que deseas, cambia tu preferencia de nivel de calificación. Esto te permitirá buscar contenidos [REGIONMATURITY] y tener acceso a ellos. Para deshacer los cambios, elige Yo &gt; Preferencias &gt; General.
+ <form name="form">
+ <button name="OK" text="Cambiar las preferencias"/>
+ <button default="true" name="Cancel" text="Cerrar"/>
+ <ignore name="ignore" text="Mis preferencias sobre nivel de calificación me impiden entrar a esta región"/>
+ </form>
+ </notification>
+ <notification name="PreferredMaturityChanged">
+ Tu preferencia de nivel de calificación actual es [RATING].
</notification>
<notification name="LandClaimAccessBlocked">
- Usted no puede reclamar este terreno por su nivel de calificación. Puede deberse a que no hay información validada de su edad.
+ No puedes reclamar este terreno por su nivel de calificación. Puede deberse a que no hay información validada de tu edad.
-Por favor, compruebe que tiene instalado el último visor, y vaya a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+Por favor, comprueba que tienes instalado el último visor, y dirígete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LandClaimAccessBlocked_KB">
- No puede reclamar este terreno por sus nivel de calificación.
+ No puedes reclamar este terreno por su nivel de calificación.
-¿Quiere ir a la Base de Conocimientos para más información sobre el nivel de calificación?
+¿Quieres ir a la Base de Conocimientos para más información sobre el nivel de calificación?
<url name="url">
http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
</url>
- <usetemplate
- name="okcancelignore"
- yestext="Ir a la Base de Conocimientos"
- notext="Cerrar"
- ignoretext="Cuando el reclamar terreno está bloqueado por el nivel de calificación"/>
+ <usetemplate ignoretext="No puedo reclamar este terreno dado el nivel de calificación" name="okcancelignore" notext="Cerrar" yestext="Ir a la Base de Conocimientos"/>
</notification>
<notification name="LandClaimAccessBlocked_Notify">
- Por su nivel de calificación, usted no puede reclamar este terreno.
+ No puedes reclamar este terreno debido a su nivel de calificación.
</notification>
<notification name="LandClaimAccessBlocked_Change">
- No puede reclamar este terreno por sus preferencias de nivel de calificación.
+ No puedes reclamar este terreno por tus preferencias sobre el nivel de calificación.
-Puede pulsar &apos;Cambiar preferencia&apos; para aumentar su nivel de calificación y poder entrar. Desde ese momento, podrá buscar y acceder a contenido [REGIONMATURITY]. Si más adelante quiere deshacer esta configuración, vaya a Editar &gt; Preferencias... &gt; General..
- <usetemplate
- name="okcancelignore"
- yestext="Cambiar preferencia"
- notext="Cerrar"
- ignoretext="Cuando el reclamar terreno está bloqueado por la preferencia del nivel de calificación"/>
+Puedes pulsar &apos;Cambiar las Preferencias&apos; para incrementar las preferencias del nivel de calificación y, así, poder entrar. En adelante, podrás buscar y acceder a contenido [REGIONMATURITY]. Si más adelante quieres deshacer este cambio, ve a Yo &gt; Preferencias &gt; General.
+ <usetemplate ignoretext="Mis preferencias sobre el nivel de calificación me impiden reclamar este terreno" name="okcancelignore" notext="Cerrar" yestext="Cambiar preferencia"/>
</notification>
<notification name="LandBuyAccessBlocked">
- Usted no puede comprar este terreno por su nivel de calificación. Puede deberse a que no hay información validada de su edad.
+ No puedes comprar este terreno por su nivel de calificación. Puede deberse a que no hay información validada de tu edad.
-Por favor, compruebe que tiene instalado el último visor, y vaya a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+Por favor, comprueba que tienes instalado el último visor, y dirígete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LandBuyAccessBlocked_KB">
- No puede comprar este terreno por sus preferencias de nivel de calificación.
+ No puedes comprar este terreno por tus preferencias de nivel de calificación.
-¿Quiere ir a la Base de Conocimientos para más información sobre el nivel de calificación?
+¿Quieres ir a la Base de Conocimientos para más información sobre el nivel de calificación?
<url name="url">
http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/es
</url>
- <usetemplate
- name="okcancelignore"
- yestext="Ir a la Base de Conocimientos"
- notext="Cerrar"
- ignoretext="Cuando la compra de terreno está bloqueada por el nivel de calificación"/>
+ <usetemplate ignoretext="No puedo comprar este terreno dado el nivel de calificación" name="okcancelignore" notext="Cerrar" yestext="Ir a la Base de Conocimientos"/>
</notification>
<notification name="LandBuyAccessBlocked_Notify">
- No puede comprar este terreno por su nivel de calificación.
+ No puedes comprar este terreno por su nivel de calificación.
</notification>
<notification name="LandBuyAccessBlocked_Change">
- No puede comprar este terreno por sus preferencias de nivel de calificación.
+ No puedes comprar este terreno por tus preferencias sobre el nivel de calificación.
-Puede pulsar &apos;Cambiar preferencia&apos; para aumentar su nivel de calificación y poder entrar. Desde ese momento, podrá buscar y acceder a contenido [REGIONMATURITY]. Si más adelante quiere deshacer esta configuración, vaya a Editar &gt; Preferencias... &gt; General.
- <usetemplate
- name="okcancelignore"
- yestext="Cambiar preferencia"
- notext="Cerrar"
- ignoretext="Cuando la compra de terreno está bloqueada por la preferencia del nivel de calificación"/>
+Puedes pulsar &apos;Cambiar las Preferencias&apos; para incrementar las preferencias del nivel de calificación y, así, poder entrar. En adelante, podrás buscar y acceder a contenido [REGIONMATURITY]. Si más adelante quieres deshacer este cambio, ve a Yo &gt; Preferencias &gt; General.
+ <usetemplate ignoretext="Mis preferencias sobre el nivel de calificación me impiden comprar el terreno" name="okcancelignore" notext="Cerrar" yestext="Cambiar preferencia"/>
</notification>
<notification name="TooManyPrimsSelected">
- &quot;Hay seleccionadas demasiadas primitivas. Por favor, seleccione [MAX_PRIM_COUNT] o menos, y reinténtelo.&quot;
+ Hay demasiados prims seleccionados. Por favor, selecciona [MAX_PRIM_COUNT] o menos y vuelve a intentarlo
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="ProblemImportingEstateCovenant">
@@ -1638,13 +1658,11 @@ Puede pulsar &apos;Cambiar preferencia&apos; para aumentar su nivel de calificac
Hay problemas al añadir un administrador nuevo del estado. Uno o más estados deben de tener llena la lista de administradores.
</notification>
<notification name="ProblemAddingEstateGeneric">
- Hay problemas en este añadir a la lista del estado. Uno o más estados deben de tener llena la lista.
+ Hay problemas al añadir a la lista del estado. Uno o más estados deben de tener llena la lista.
</notification>
<notification name="UnableToLoadNotecardAsset">
En este momento, no se pueden cargar los datos de la&apos;s nota&apos;s.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="NotAllowedToViewNotecard">
Permisos insuficientes para ver la nota asociada a la ID solicitada.
@@ -1655,276 +1673,56 @@ Puede pulsar &apos;Cambiar preferencia&apos; para aumentar su nivel de calificac
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="PublishClassified">
- Recuerde: las cuotas que se pagan por los clasificados no son reembolsables.
+ Recuerda: las cuotas que se pagan por los clasificados no son reembolsables.
¿Publicar ahora este anuncio por [AMOUNT] L$?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="SetClassifiedMature">
- ¿Este anuncio tiene contenido &apos;Mature&apos;?
- <usetemplate
- canceltext="Cancelar"
- name="yesnocancelbuttons"
- notext="No"
- yestext="Sí"/>
+ ¿Este anuncio tiene contenido &apos;Moderado&apos;?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No" yestext="Sí"/>
</notification>
<notification name="SetGroupMature">
- ¿Este grupo tiene contenido &apos;Mature&apos;?
- <usetemplate
- canceltext="Cancelar"
- name="yesnocancelbuttons"
- notext="No"
- yestext="Sí"/>
+ ¿Este grupo tiene contenido &apos;Moderado&apos;?
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="No" yestext="Sí"/>
</notification>
<notification label="Confirmar el reinicio" name="ConfirmRestart">
- ¿Verdaderamente quiere reiniciar la región de aquí a 2 minutos?
+ ¿Verdaderamente quieres reiniciar la región de aquí a 2 minutos?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification label="Mensaje a toda la región" name="MessageRegion">
- Escriba un anuncio breve que se enviará a todo el que esté en esta región.
+ Escribe un anuncio breve que se enviará a todo el que esté en esta región.
<form name="form">
<input name="message"/>
<button name="OK" text="OK"/>
<button name="Cancel" text="Cancelar"/>
</form>
</notification>
- <notification label="No permitir modificar el terreno" name="HelpRegionBlockTerraform">
- Si se marca está casilla, los propietarios de terreno no podrán modificarlo, independientemente de lo que esté configurado en cada parcela.
-
-Por defecto: off
- </notification>
- <notification label="Prohibir volar" name="HelpRegionBlockFly">
- Si se marca esta casilla, estará prohibido volar en la región, independientemente de lo que esté configurado en cada parcela.
-
-Por defecto: off
- </notification>
- <notification label="Cambio múltiple de permisos del contenido" name="HelpBulkPermission">
- La herramienta de cambio múltiple de permisos le ayuda a cambiar con rapidez los permisos de varios de los objetos contenidos en el objeto u objetos que seleccione. Pero fíjese que sólo configurará los permisos de los ítems que están en el contenido de los objetos seleccionados, no los de esos objetos que los contienen.
-
-Note también que los permisos no se aplicarán a los contenidos que puedan tener cada uno de los ítems. Lo que haga sólo afectará a los ítems que estén exactamente en el primer nivel de contenidos.
-
-Puede elegir qué clase de ítems modificar usando la lista &apos;Tipos de contenido&apos; here. Las imágenes se consideran incluidas si selecciona Texturas.
-
-* Esta herramienta sólo puede cambiar los permisos de aquellos ítems de los que usted esté autorizado a cambiarlos.
-* No puede otorgar al siguiente propietario permisos que usted no tenga ya.
-* Los permisos para el nuevo propietario son, en principio, una solicitud. Si alguno de los ítems no puede coger todos esos permisos solicitados, no cambiará ninguno de los permisos que tenga.
-
-Cuando esté listo para efectuar el cambio múltiple de permisos, pulse &apos;Aplicar&apos; y espere a que se muestren los resultados.
-
-SSi cierra la ventana de Cambio múltiple de permisos mientras se están cambiando, se cancelará la operación.
- </notification>
- <notification label="Permitir el daño" name="HelpRegionAllowDamage">
- Si se marca la casilla, el sistema de &apos;vida&apos; afecta a todas las parcelas independientemente de lo que tenga marcado cada una.
-Si la casilla no está marcada, el propietario de cada parcela podrá decidir si activa en ella el sistema de &apos;vida&apos;.
-
-Por defecto: off
- </notification>
- <notification label="Nº máximo de avatares" name="HelpRegionAgentLimit">
- Configura el número máximo de avatares que se permite en esta región.
-El funcionamiento puede variar según el número de avatares que estén presentes.
-
-Por defecto: 40
- </notification>
- <notification label="Plus de objetos" name="HelpRegionObjectBonus">
- El plus de objetos es un multiplicador de los prims permitidos en cualquier parcela.
-El rango permitido es de 1 a 10. Fijándolo en &apos;1&apos;, se permiten 117 objetos en cada parcela de 512 m². Fijándolo en &apos;2&apos;, se permiten 234 (el doble), y así sucesivamente. El número máximo de objetos permitidos en una región sigue siendo de 15.000, sea cual sea el plus.
-Una vez establecido, tenga en cuenta que reducir el plus de objetos puede causar que se devuelvan o borren objetos.
-
-Por defecto: 1.0
- </notification>
- <notification label="Calificación" name="HelpRegionMaturity">
- Configura el nivel de calificación de la región, tal como se verá en la barra superior del visor de cualquier residente, y en los datos que mostrará el mapa del mundo cuando se pase el cursor sobre esta región. Esta configuración también afecta al acceso a esta región y a los resultados de la búsqueda. Los demás residentes sólo entrarán en las regiones o verán aquellos resultados de la búsqueda que tengan el mismo nivel de calificación que ellos han elegido en sus preferencias.
-
-Puede llevar algún tiempo que este cambio se refleje en el mapa.
- </notification>
- <notification label="Impedir &apos;empujar&apos;" name="HelpRegionRestrictPushObject">
- Esta casilla controla en toda la región los permisos para que haya &apos;empujones&apos;.
-Cuando está activada, los residentes sólo pueden ser empujados por sí mismos o por el propietario de la parcela.
-(&apos;Empujar&apos; se refiere a la función llPushObject() del LSL).
-
-Por defecto: Off
- </notification>
- <notification label="Unir/Dividir parcelas" name="HelpParcelChanges">
- Esta casilla determina si las parcelas que no son del propietario del estado pueden unirse o subdividirse.
-Si no se marca esta opción:
- * Sólo los propietarios o los administradores del estado pueden unir o dividir parcelas.
- * Sólo podrán unir o dividir las parcelas pertenecientes al propietario o a un grupo en el que tengan los poderes adecuados.
-Si se marca esta opción:
- * Todo los propietarios de parcelas podrán unir o dividir las que posean.
- * En parcelas propiedad de un grupo, quienes tengan los poderes adecuados podrán unirlas o dividirlas.
-
-Por defecto: Marcado
- </notification>
- <notification label="No mostrar en la búsqueda" name="HelpRegionSearch">
- Marcando esta casilla bloqueará que los propietarios de parcelas puedan listarlas en la búsqueda.
-
-Por defecto: Off
- </notification>
<notification label="Cambiada la calificación de la región" name="RegionMaturityChange">
- Se ha actualizado la calificación de esta región.
-Llevará algún tiempo que el cambio se refleje en el mapa.
- </notification>
- <notification label="Reventa de terreno" name="HelpRegionLandResell">
- Los propietarios y los administradores del estado pueden poner en venta cualquier terreno que posea el propietario del estado.
-Si se desmarca esta opción, los compradores no podrán revender el terreno que compren en esta región.
-Si se marca esta opción, los compradores podrán revender el terreno que compren en esta región.
-
-Por defecto: Deshabilitado
- </notification>
- <notification label="Desactivar los scripts" name="HelpRegionDisableScripts">
- Cuando el rendimiento de un sim es pobre, el culpable puede ser un script. Abra Estadísticas (Ctrl+May+1). Mire Simulator Physics FPS. Si es menor de 45, abre el panel Time, en la parte inferior de las Estadísticas. Si ve que Script Time está en 25 ms o más alto, pulse el botón Listar los scripts según su uso, y verá el nombre y la posición de los scripts que pueden estar causando el bajo rendimiento.
-
-Marcando la casilla Desactivar los scripts y pulsando el botón Aplicar, se desactivarán temporalmente en esta región todos los scripts.
-Debe hacer esto para viajar a la posición que ha visto en la Lista de scripts según su uso. Cuando llegue, investigue el script para determinar si es él quien causa el problema. Deberá contactar con el propietario del script, o borrar o devolver el objeto.
-Desmarque la casilla Desactivar los scripts y pulse Aplicar para reactivar los scripts en la región.
-
-Por defecto: off
- </notification>
- <notification label="Desactivar las colisiones" name="HelpRegionDisableCollisions">
- Cuando el rendimiento de un sim es pobre, la culpa puede estar en los objetos físicos. Abra Estadísticas (Ctrl+May+1). Mire Simulator Physics FPS. Si es menor de 45, abre el panel Time, en la parte inferior de las Estadísticas. Si ve que Sim Time (Physics) está en 20 ms o más alto, pulse el botón Listar los objetos que colisionan, y verá el nombre y la posición de los objetos que pueden estar causando el bajo rendimiento.
-
-Marcando la casilla Desactivar las colisiones y pulsando el botón Aplicar, se desactivarán temporalmente las colisiones entre objetos.
-Debe hacer esto para viajar a la localización que se ha avisado en la Lista de objetos que colisionan. Cuando llegue, investigue el objeto:
-¿está colisionando constantemente con otros objetos? Deberá contactar con el propietario del objeto, o borrarlo o devolverlo.
-Desmarque la casilla Desactivar las colisiones y pulse Aplicar para reactivar las colisiones en la región.
-
-Por defecto: off
- </notification>
- <notification label="Desactivar la física" name="HelpRegionDisablePhysics">
- Desactivar la física es parecido a Desactivar las colisiones, pero se desactivan todas las simulaciones físicas: no sólo se detiene la colisión de objetos, sino que también se provoca que los avatares no puedan moverse.
-
-Esto debería usarse sólo cuando Desactivar las colisiones no ha aportado a la región suficiente rendimiento para investigar un problema con las propiedades físicas o los objetos que colisionan.
-
-Cuando acabe, no se olvide de reactivar la física, o los avatares seguirán sin poderse mover.
-
-Por defecto: off
- </notification>
- <notification label="Objetos que colisionan" name="HelpRegionTopColliders">
- Muestra una lista de aquellos objetos con más colisiones potenciales con otros objetos. Estos objetos pueden ralentizar el rendimiento.
-Seleccione Ver &gt; Estadísticas, y mire Simulator &gt; Time &gt; Sim Time (Physics) para ver si se están empleando en &apos;physics&apos; más de 20 ms.
- </notification>
- <notification label="Listar los scripts" name="HelpRegionTopScripts">
- Muestra una lista de los objetos que más tiempo emplean en ejecutar scripts de LSL. Estos objetos pueden ralentizar el rendimiento.
-Seleccione Ver &gt; Estadísticas, y mire Simulator &gt; Time &gt; Script Time para ver si se están empleando más de 25 ms.
- </notification>
- <notification label="Reiniciar la región" name="HelpRegionRestart">
- Reinicia los procesos del servidor en que corre esta región tras dos minutos de advertencia previa. Se desconectará a todos los residentes que estén en la región. La región guardará sus datos, y debería volver en unos 90 segundos.
-
-Reiniciar la región no solventa la mayoría de los problemas de rendimiento, y, normalmente, debe utilizarse sólo cuando se indique.
- </notification>
- <notification label="Nivel del agua" name="HelpRegionWaterHeight">
- Es el nivel, en metros, del agua. Si se marca en algo distinto de 20, y usted tiene al lado el agua del mundo o un &apos;vacío&apos;, habrá una diferencia visible.
-
-Por defecto: 20
- </notification>
- <notification label="Elevación del terreno" name="HelpRegionTerrainRaise">
- Es la distancia que, en metros, los propietarios de parcelas pueden elevar su terreno sobre la altura del terreno inicialmente creado.
-
-Por defecto: 4
- </notification>
- <notification label="Rebaje del terreno" name="HelpRegionTerrainLower">
- Es la distancia que, en metros, los propietarios de parcelas pueden bajar su terreno sobre la altura del terreno inicialmente creado.
-
-Por defecto: -4
- </notification>
- <notification label="Subir un RAW para el terreno" name="HelpRegionUploadRaw">
- Este botón carga un archivo .RAW en la región en que usted está.
-El archivo debe tener las dimensiones correctas (RGB, 256x256) y 13 canales. La forma mejor de crear un archivo de terreno es descargar el archivo RAW existente. Un buen inicio es modificar el canal rojo -red- (altura del terreno), y subirlo.
-
-La carga puede llevar unos 45 segundos. Fíjese que subir un archivo de terreno *no* moverá los objetos que haya en el terreno, sólo el terreno mismo y los permisos asociados a las parcelas.
-Por tanto, puede que algunos objetos acaben enterrados..
-
-Para más información sobre la edición de las alturas del terreno, consulte la ayuda F1.
- </notification>
- <notification label="Descargar el RAW del terreno" name="HelpRegionDownloadRaw">
- Este botón descarga un archivo de esta región con los datos de alturas, dimensiones de las parcelas, estado de las parcelas en venta, y algunos permisos de las parcelas. Al abrir el archivo en un programa como Photoshop debe especificar las dimensiones del documento: RGB, 256x256 con 13 canales.
-Este archivo de terreno no puede abrirse de otro modo.
-
-Para más información sobre la edición de las alturas del terreno, consulte la ayuda F1.
- </notification>
- <notification label="Usar el Sol del estado" name="HelpRegionUseEstateSun">
- Esta casilla hace que la posición del Sol en la región sea la misma que la del resto del estado.
-
-Por defecto: on
- </notification>
- <notification label="Fijar el Sol" name="HelpRegionFixedSun">
- Esta casilla fija la posición del Sol en la posición del deslizable Fase, y detiene su movimiento.
-
-Por defecto: off
- </notification>
- <notification label="Predeterminar este terreno" name="HelpRegionBakeTerrain">
- Este botón salva la forma actual del terreno como nueva forma por defecto para la región. Una vez predeterminado, el terreno puede volver a esa forma cada vez que usted u otros usan la opción &apos;Revertir&apos; en Editar el terreno. El terreno predeterminado también marca el punto medio para elevar y bajar los límites.
- </notification>
- <notification label="Administradores del estado" name="HelpEstateEstateManager">
- Un administrador del estado es un residente en el que usted delega controles de la región y configuraciones del estado. Un administrador del estado puede cambiar algunas configuraciones de estos paneles, excepto las de subir, descargar, y predeterminar el terreno. Y, concretamente, puede autorizar o expulsar a residentes de su estado.
-
-Sólo el propietario del estado puede añadir o remover administradores, nadie más.
-Por favor, elija sólo a residentes en quienes confíe, pues usted será el responsable último de sus acciones.
- </notification>
- <notification label="Usar el horario global" name="HelpEstateUseGlobalTime">
- Esta casilla hace que, en su estado, el Sol tenga la misma posición que en los estados propiedad de Linden, &apos;mainland&apos;.
+ Se ha actualizado el nivel de calificación de esta región.
+Puede que lleve algún tiempo hasta que el cambio se vea reflejado en el mapa.
-Por defecto: on
- </notification>
- <notification label="Fijar el Sol" name="HelpEstateFixedSun">
- Esta casilla fija la posición del Sol en la posición del deslizable Fase, y detiene su movimiento.
- </notification>
- <notification label="Acceso público" name="HelpEstateExternallyVisible">
- Esta casilla habilita que cualquier residente que esté en otro estado pueda entrar en éste sin tener que estar en una lista de acceso.
-
-Por defecto: on
- </notification>
- <notification label="Permitir el teleporte a cualquier punto" name="HelpEstateAllowDirectTeleport">
- Cuando esta marcado, los residentes puede teleportarse directamente a cualquier punto de su estado. Si se desmarca, los residentes se teleportarán al Punto de Teleporte más cercano.
-
-Por defecto: off
- </notification>
- <notification label="Autorizar el acceso" name="HelpEstateAllowResident">
- El acceso a este estado se limitará a los residentes aquí enumerados y a cualquier grupo de abajo. Esta configuración sólo funciona cuando está desmarcado Acceso público.
- </notification>
- <notification label="Autorizar el acceso de grupo" name="HelpEstateAllowGroup">
- El acceso a este estado se limitará a los grupos aquí enumerados y a cualquier residente de abajo. Esta configuración sólo funciona cuando está desmarcado Acceso público.
- </notification>
- <notification label="Dirección de correo para infracciones" name="HelpEstateAbuseEmailAddress">
- Aportando aquí una dirección de correo válida, se hará que las Denuncias de Infracción en este estado se envíen a esa dirección.
-Si se deja en blanco, las Denuncias de Infracción se enviarán sólo a Linden Lab.
- </notification>
- <notification label="Denegar el acceso" name="HelpEstateBanResident">
- A los residentes en esta lista se les niega el acceso a su estado, independientemente de cualquier otra configuración.
- </notification>
- <notification label="Autorizar el chat de voz" name="HelpEstateVoiceChat">
- Se autoriza a las parcelas del estado a tener sus propios canales de voz en los que los residentes puedan hablar y oír a otros residentes.
-
-Por defecto: off
+Para entrar a regiones Adultas, los Residentes deben haber verificado su cuenta, bien verificando la edad o bien verificando una forma de pago.
</notification>
<notification label="Desajuste en la versión de voz" name="VoiceVersionMismatch">
- En esta región, la versión de [APP_NAME] no es compatible con el chat de voz. Para que el chat de voz funcione correctamente, debe actualizar [APP_NAME].
- </notification>
- <notification label="Contrato del estado" name="HelpEstateCovenant">
- Definir un contrato del estado le permite vender parcelas del mismo. Si no existe un contrato, no puede vender terreno.
-La nota para su contrato puede estar vacía si es que no quiere aplicar reglas, avisos a los compradores, o cualquier otra cosa relacionada con el terreno antes de que sea comprado.
-
-Puede usar un contrato para comunicar al posible comprador reglas, pautas, información cultural, o, simplemente, sus propias expectativas.
-Así, puede hablarse de parcelación, normas de las construcciones, formas de pago, u otra información que considere que el nuevo propietario debe saber y con la que debe estar de acuerdo antes de hacer la compra.
-
-Para poder finalizar la compra, el comprador debe aceptar el contrato marcando la casilla adecuada. Los contratos de los estados son siempre visibles en la información Acerca del terreno en todas las parcelas.
+ Esta versión de [APP_NAME] no es compatible con la prestación de voz de esta región. Para que el chat de voz funcione correctamente debes actualizar [APP_NAME].
</notification>
<notification label="No se pudo comprar los objetos" name="BuyObjectOneOwner">
No se pueden comprar a la vez objetos de propietarios diferentes.
-Por favor, seleccione sólo un objeto y vuelva a intentarlo.
+Por favor, selecciona sólo un objeto y vuelve a intentarlo.
</notification>
<notification label="No se pudo comprar el contenido" name="BuyContentsOneOnly">
No se puede comprar a la vez los contenidos de más de un objeto.
-Por favor, seleccione sólo un objeto y vuelva a intentarlo.
+Por favor, selecciona sólo un objeto y vuelve a intentarlo.
</notification>
<notification label="No se pudo comprar el contenido" name="BuyContentsOneOwner">
No se pueden comprar a la vez objetos de propietarios diferentes.
-Por favor, seleccione sólo un objeto y vuelva a intentarlo.
+Por favor, selecciona sólo un objeto y vuelve a intentarlo.
</notification>
<notification name="BuyOriginal">
¿Comprar el objeto original de [OWNER] por [PRICE] L$?
-Usted pasará a ser el propietario de este objeto.
-Podrá:
+Pasarás a ser el propietario de este objeto.
+Podrás:
Modificarlo: [MODIFYPERM]
Copiarlo: [COPYPERM]
Revenderlo o darlo: [RESELLPERM]
@@ -1932,8 +1730,8 @@ Podrá:
</notification>
<notification name="BuyOriginalNoOwner">
¿Comprar el objeto original por [PRICE] L$?
-Usted pasará a ser el propietario de este objeto.
-Podrá:
+Pasarás a ser el propietario de este objeto.
+Podrás:
Modificarlo: [MODIFYPERM]
Copiarlo: [COPYPERM]
Revenderlo o darlo: [RESELLPERM]
@@ -1941,8 +1739,8 @@ Podrá:
</notification>
<notification name="BuyCopy">
¿Comprar una copia de [OWNER] por [PRICE] L$?
-El objeto se copiará a su inventario.
-Podrá:
+El objeto se copiará a tu inventario.
+Podrás:
Modificarlo: [MODIFYPERM]
Copiarlo: [COPYPERM]
Revenderlo o darlo: [RESELLPERM]
@@ -1950,8 +1748,8 @@ Podrá:
</notification>
<notification name="BuyCopyNoOwner">
¿Comprar una copia por [PRICE] L$?
-El objeto se copiará a su inventario.
-Podrá:
+El objeto se copiará a tu inventario.
+Podrás:
Modificarlo: [MODIFYPERM]
Copiarlo: [COPYPERM]
Revenderlo o darlo: [RESELLPERM]
@@ -1959,27 +1757,27 @@ Podrá:
</notification>
<notification name="BuyContents">
¿Comprar los contenidos de [OWNER] por [PRICE] L$?
-Serán copiados a su inventario.
+Serán copiados a tu inventario.
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="BuyContentsNoOwner">
¿Comprar los contenidos por [PRICE] L$?
-Serán copiados a su inventario.
+Serán copiados a tu inventario.
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ConfirmPurchase">
- Esta transacción hará que:
+ Esta transacción consiste en:
[ACTION]
-¿Está seguro de querer hacer esta compra?
+¿Estás seguro de querer hacer esta compra?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ConfirmPurchasePassword">
- Esta transacción hará que:
+ Esta transacción consiste en:
[ACTION]
-¿Está seguro de querer hacer esta compra?
-Por favor, vuelva a escribir su contraseña y pulse OK.
+¿Estás seguro de querer hacer esta compra?
+Por favor, vuelva a escribir tu contraseña y pulsa OK.
<form name="form">
<input name="message"/>
<button name="ConfirmPurchase" text="OK"/>
@@ -1988,91 +1786,75 @@ Por favor, vuelva a escribir su contraseña y pulse OK.
</notification>
<notification name="SetPickLocation">
Nota:
-Ha actualizado la posición de este Destacado, pero los otros detalles permanecen con sus valores originales.
+Has actualizado la posición de este Destacado, pero los otros detalles permanecen con sus valores originales.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="MoveInventoryFromObject">
- Ha elegido ítems &apos;no copiables&apos; de su inventario. Esos ítems se quitarán de su inventario, no se copiarán.
+ Has elegido ítems &apos;no copiables&apos; de tu inventario. Esos ítems se quitarán de tu inventario, no se copiarán.
¿Mover el/los ítem/s del inventario?
- <usetemplate ignoretext="Cuando mueva objetos &apos;no copiables&apos; del inventario" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ <usetemplate ignoretext="Avisarme antes de que mueva ítems &apos;no copiables&apos; desde un objeto" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="MoveInventoryFromScriptedObject">
- Ha elegido ítems &apos;no copiables&apos; de su inventario. Esos ítems se moverán a su inventario, no se copiarán.
-Dado que estos objetos tienen scripts, moverlos a su inventario puede provocar un mal funcionamiento del script.
+ Has elegido ítems &apos;no copiables&apos; de tu inventario. Esos ítems se moverán a tu inventario, no se copiarán.
+Dado que estos objetos tienen scripts, moverlos a tu inventario puede provocar un mal funcionamiento del script.
¿Mover el/los ítem/s del inventario?
- <usetemplate ignoretext="Cuando mueva objetos con script &apos;no copiables&apos; del inventario" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ <usetemplate ignoretext="Avisarme antes de que mueva ítems &apos;no copiables&apos; que puedan estropear un objeto con script" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ClickActionNotPayable">
- Atención: la acción &apos;Pagar al objeto&apos; al pulsar ha sido marcada, pero sólo funcionará si se añade un script con un evento money().
+ Advertencia: la acción &apos;Pagar al objeto&apos; ha sido marcada, pero sólo funcionará si se añade un script con un evento money().
<form name="form">
- <ignore name="ignore" text="Cuando configure &apos;Pagar al objeto&apos; sin el evento money()"/>
+ <ignore name="ignore" text="He establecido la acción &apos;Pagar al objeto&apos; cuando construyo uno sin un script money()"/>
</form>
</notification>
<notification name="OpenObjectCannotCopy">
- En este objeto, no hay ítems que esté autorizado a copiar.
+ En este objeto, no hay ítems que estés autorizado a copiar.
</notification>
<notification name="WebLaunchAccountHistory">
- ¿Ir al sitio web de [SECOND_LIFE] para ver el historial de su cuenta?
- <usetemplate ignoretext="Cuando se cargue la página web del historial de la cuenta" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/>
- </notification>
- <notification name="ClickOpenF1Help">
- ¿Visitar el sitio web de Soporte de [SECOND_LIFE]?
- <usetemplate ignoretext="Cuando visite el sitio web de Soporte de [SECOND_LIFE]." name="okcancelignore" notext="Cancelar" yestext="Ir"/>
+ ¿Ir a tu [http://secondlife.com/account/ Panel de Control] para ver el historial de tu cuenta?
+ <usetemplate ignoretext="Abrir mi navegador para ver el historial de mi cuenta" name="okcancelignore" notext="Cancelar" yestext="Ir a la página"/>
</notification>
<notification name="ConfirmQuit">
- ¿Está seguro de que quiere salir?
- <usetemplate ignoretext="Cuando esté saliendo de [APP_NAME]." name="okcancelignore" notext="Continuar" yestext="Salir"/>
+ ¿Estás seguro de que quieres salir?
+ <usetemplate ignoretext="Confirmar antes de salir" name="okcancelignore" notext="No salir" yestext="Salir"/>
</notification>
<notification name="HelpReportAbuseEmailLL">
- Use esta herramienta para denunciar violaciones de las [http://secondlife.com/corporate/tos.php?lang=es-ES Condiciones del Servicio] y las [http://secondlife.com/corporate/cs.php?lang=es-ES Normas de la Comunidad].
+ Usa esta herramienta para denunciar violaciones de las [http://secondlife.com/corporate/tos.php Condiciones del Servicio] o las [http://secondlife.com/corporate/cs.php Normas de la Comunidad].
-Se investigan y resuelven todas las infracciones denunciadas de las Normas de la Comunidad y las Condiciones del Servicio. Puede ver la resolución tomada en el Informe de Incidentes, en:
-
-http://secondlife.com/support/incidentreport.php
- </notification>
- <notification name="HelpReportAbuseEmailEO">
- IMPORTANTE: Esta denuncia no irá a Linden Lab, sino al propietario de la región en la que usted se encuentra actualmente.
-
-Como un servicio a los residentes y visitantes, el propietario de la región ha elegido recibir y resolver todas las enuncias que se originen en esta región. Linden Lab no investigará las denuncias que usted envíe desde aquí.
-
-El propietario de la región resolverá las denuncias basándose en las reglas locales de la región, tal como se detallan en el Contrato del estado.
-(Puede ver el Contrato yendo al menú Mundo y eligiendo Acerca del terreno).
-
-La resolución de esta denuncia se aplica exclusivamente a esta región; el acceso de los residentes a otras áreas de [SECOND_LIFE] no se verá afectado por el resultado de esta denuncia. Únicamente Linden Lab puede impedir el acceso a la totalidad de [SECOND_LIFE].
+Se investigan y resuelven todas las infracciones denunciadas.
</notification>
<notification name="HelpReportAbuseSelectCategory">
- Por favor, elija una categoría para esta denuncia de infracción.
+ Por favor, elige una categoría para esta denuncia de infracción.
Seleccionar una categoría nos ayuda a clasificar y procesar las denuncias de infracciones.
</notification>
<notification name="HelpReportAbuseAbuserNameEmpty">
- Por favor, escriba el nombre del infractor.
+ Por favor, escribe el nombre del infractor.
Aportar el dato preciso nos ayuda a clasificar y procesar las denuncias de infracciones.
</notification>
<notification name="HelpReportAbuseAbuserLocationEmpty">
- Por favor, escriba la localización donde tuvo lugar la infracción.
+ Por favor, escribe la localización donde tuvo lugar la infracción.
Aportar el dato preciso nos ayuda a clasificar y procesar las denuncias de infracciones.
</notification>
<notification name="HelpReportAbuseSummaryEmpty">
- Por favor, escriba un resumen de la infracción que ha habido.
+ Por favor, escribe un resumen de la infracción que ha habido.
Aportar un resumen preciso nos ayuda a clasificar y procesar las denuncias de infracciones.
</notification>
<notification name="HelpReportAbuseDetailsEmpty">
- Por favor, escriba una descripción minuciosa de la infracción que ha habido.
-Sea tan específico como pueda, incluyendo los nombres y los detalles implicados en el incidente que denuncia.
+ Por favor, escribe una descripción minuciosa de la infracción que ha habido.
+Sé tan específico como puedas, incluyendo los nombres y los detalles implicados en el incidente que denuncias.
Aportar una descripción precisa nos ayuda a clasificar y procesar las denuncias de infracciones.
</notification>
<notification name="HelpReportAbuseContainsCopyright">
Estimado Residente:
-Parece que está usted denunciando una violación de la propiedad intelectual. Por favor, asegúrese de que su denuncia es correcto.
+Parece que estás denunciando una violación de la propiedad intelectual. Por favor, asegúrate de que tu denuncia es correcta.
-(1) El proceso de la denuncia. Debe enviar una denuncia de infracción si cree que un Residente está reventando el sistema de permisos de [SECOND_LIFE], por ejemplo, usando un CopyBot u otras herramientas parecidas para copiar, infringiendo los derechos de propiedad intelectual. El Equipo de Infracciones (Abuse Team) investiga y lleva a cabo las acciones disciplinarias apropiadas ante toda acción que viole las las Normas de la Comunidad de [SECOND_LIFE] o las Condiciones del Servicio. Sin embargo, el Equipo de Infracciones ni gestiona ni responde a las solicitudes de eliminar contenidos del mundo de [SECOND_LIFE].
+(1) El proceso de la denuncia. Debes enviar una denuncia de infracción si crees que un Residente está reventando el sistema de permisos de [SECOND_LIFE], usando, por ejemplo, un CopyBot u otras herramientas parecidas para copiar, infringiendo los derechos de propiedad intelectual. El Equipo de Infracciones (&apos;Abuse Team&apos;) investiga y lleva a cabo las acciones disciplinarias apropiadas ante toda acción que viole las [http://secondlife.com/corporate/tos.php Condiciones de Servicio] o las [http://secondlife.com/corporate/cs.php Normas de la Comunidad] de [SECOND_LIFE]. Sin embargo, el Equipo de Infracciones ni gestiona ni responde a las solicitudes de eliminar contenidos del mundo de [SECOND_LIFE].
-(2) El DMCA o Proceso de Eliminación de Contenido. Para solicitar que se elimine algún contenido de [SECOND_LIFE], DEBE enviar una notificación válida de infracción tal y como se explica en nuestra DMCA Policy en http://secondlife.com/corporate/dmca.php.
+(2) El DMCA o Proceso de Eliminación de Contenido. Para solicitar que se elimine algún contenido de [SECOND_LIFE], DEBES enviar una notificación válida de infracción tal y como se explica en nuestra [http://secondlife.com/corporate/dmca.php &apos;DMCA Policy&apos;].
-Si todavía quiere seguir con el proceso de infracción, por favor, cierre esta ventana y acabe de enviar su denuncia. En concreto, debe seleccionar la categoría &apos;CopyBot o Programa para saltarse los permisos&apos;.
+Si todavía quieres seguir con el proceso de infracción, por favor, cierra esta ventana y acaba de enviar tu denuncia. En concreto, debes seleccionar la categoría &apos;CopyBot o Programa para saltarse los permisos&apos;.
Gracias,
@@ -2083,234 +1865,74 @@ Linden Lab
[COMPONENTS]
</notification>
<notification label="Reemplazar el anexado actual" name="ReplaceAttachment">
- En ese punto de su cuerpo ya hay un objeto anexado. ¿Quiere reemplazarlo por el objeto que ha elegido?
+ En ese punto de tu cuerpo ya hay un objeto anexado. ¿Quieres reemplazarlo por el objeto que has elegido?
<form name="form">
- <ignore name="ignore" save_option="true" text="Cuando se reemplacen anexados existentes"/>
+ <ignore name="ignore" save_option="true" text="Reemplazar un añadido actual con el ítem seleccionado"/>
<button ignore="Reemplazar automaticamente" name="Yes" text="OK"/>
<button ignore="Nunca reemplazar" name="No" text="Cancelar"/>
</form>
</notification>
<notification label="¡Aviso! Modo Ocupado" name="BusyModePay">
- Usted está en el modo Ocupado. Por tanto, no recibirá ningún ítem a cambio de esta pago.
+ Estás en el modo Ocupado. Por tanto, no recibirás ningún ítem a cambio de este pago.
-¿Quiere salir del modo Ocupado ante de completar esta transacción?
+¿Quieres salir del modo Ocupado antes de completar esta transacción?
<form name="form">
- <ignore name="ignore" save_option="true" text="Cuando se esté pagando a un objeto o persona en el modo Ocupado"/>
+ <ignore name="ignore" save_option="true" text="Voy a pagar a una persona u objeto mientras estoy en el modo ocupado"/>
<button ignore="Siempre salir del modo Ocupado" name="Yes" text="OK"/>
<button ignore="Nunca salir del modo Ocupado" name="No" text="Cancelar"/>
</form>
</notification>
+ <notification name="ConfirmDeleteProtectedCategory">
+ La carpeta &apos;[FOLDERNAME]&apos; pertenece al sistema, y borrar carpetas del sistema puede provocar inestabilidad. ¿Estás seguro de que quieres borrarla?
+ <usetemplate ignoretext="Confirmar antes de borrar una carpeta del sistema" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
<notification name="ConfirmEmptyTrash">
- ¿Está seguro de que quiere vaciar definitivamente el contenido de su Papelera?
- <usetemplate ignoretext="Cuando se vacíe la Papelera" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ ¿Estás seguro de que quieres borrar de forma permanente el contenido de la Papelera?
+ <usetemplate ignoretext="Confirmar antes de vaciar la Papelera del inventario" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ConfirmClearBrowserCache">
- ¿Está seguro de que quiere limpiar la caché de su navegador?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sí"/>
+ ¿Estás seguro de que quieres borrar tu historial web, de viajes y de búsquedas?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ConfirmClearCookies">
- ¿Está seguro de que quiere limpiar sus cookies?
+ ¿Estás seguro de que quieres limpiar tus cookies?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sí"/>
</notification>
<notification name="ConfirmClearMediaUrlList">
- ¿Está seguro de que quiere vaciar su lista de URL guardadas?
+ ¿Estás seguro de que quieres vaciar tu lista de URL guardadas?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sí"/>
</notification>
<notification name="ConfirmEmptyLostAndFound">
- ¿Está seguro de que quiere eliminar permanentemente el contenido de su carpeta Objetos Perdidos?
- <usetemplate ignoretext="Cuando se vacíe la carpeta del inventario Objetos Perdidos" name="okcancelignore" notext="No" yestext="Sí"/>
+ ¿Estás seguro de que quieres borrar de forma permanente el contenido de Objetos Perdidos?
+ <usetemplate ignoretext="Confirmar antes de vaciar la carpeta Objetos Perdidos" name="okcancelignore" notext="No" yestext="Sí"/>
</notification>
<notification name="CopySLURL">
- Se ha copiado a su portapapeles la siguiente SLurl:
+ Se ha copiado a tu portapapeles esta SLurl:
[SLURL]
-Publíquela en una página web para que otros puedan acceder fácilmente a esta posición, o pruébela usted mismo pegándola en la barra de direcciones de su navegador.
+Publícala en una página web para que otros puedan acceder fácilmente a esta posición, o pruébala tú mismo pegándola en la barra de direcciones de tu navegador.
<form name="form">
- <ignore name="ignore" text="Cuando se copie una SLurl al portapapeles"/>
+ <ignore name="ignore" text="La SLurl se ha copiado a mi portapapeles"/>
</form>
</notification>
- <notification name="GraphicsPreferencesHelp">
- Este panel controla el tamaño de la ventana, y la resolución y la calidad de los gráficos del cliente. La interfaz Preferencias &gt; Gráficos le permite escoger entre cuatro niveles gráficos: Bajo, Medio, Alto, y Ultra. También puede personalizar sus configuraciones gráficas marcando la casilla Personalizar y adaptando estas configuraciones:
-
-Efectos: activa o desactiva varios tipos de shaders.
-
-Objetos reflejados: determina qué objetos reflejará el agua.
-
-Renderización del avatar: muestra opciones que afectan a cómo renderiza el cliente los avatares.
-
-Distancia de dibujo: afecta a cuán lejos de su punto de vista se renderizarán los objetos en la escena.
-
-Núm. máx. de partículas: define el número máximo de partículas que podrá ver a la vez en su pantalla.
-
-Calidad del procesamiento: define la resolución con que se renderiza el brillo.
-
-Detalle de la malla: define la cantidad de detalles o número de triángulos usados para renderizar algunos objetos. Cuanto más alto sea el valor, más detalle, pero más tiempo para renderizar.
-
-Detalles de la iluminación: determina que tipo de luces quiere usted que se rendericen.
-
-Nivel de detalle del terreno: marca con cuánto detalle quiere ver la textura del terreno.
- </notification>
<notification name="WLSavePresetAlert">
- ¿Quiere sobrescribir la preselección guardada?
+ ¿Quieres sobrescribir la preselección guardada?
<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
</notification>
<notification name="WLDeletePresetAlert">
- ¿Quiere borrar [SKY]?
+ ¿Quieres borrar [SKY]?
<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
</notification>
<notification name="WLNoEditDefault">
- No puede editar ni borrar una preselección por defecto.
+ No puedes editar ni borrar una preselección por defecto.
</notification>
<notification name="WLMissingSky">
Este archivo del ciclo de un día se refiere a un archivo perdido de cielo: [SKY].
</notification>
<notification name="PPSaveEffectAlert">
- Ya existe un efecto de procesamiento. ¿Desea sobreescribirlo?
+ Ya existe un efecto de procesamiento. ¿Quieres sobreescribirlo?
<usetemplate name="okcancelbuttons" notext="No" yestext="Sí"/>
</notification>
- <notification name="HelpEditSky">
- Edite los deslizables del WindLight para crear y guardar configuraciones del cielo.
- </notification>
- <notification name="HelpEditDayCycle">
- Define cómo se verán los cielos a lo largo del día.
- </notification>
- <notification name="EnvSettingsHelpButton">
- Estas configuraciones ajustan la forma en que usted ve el medio ambiente localmente, en su ordenador. Su tarjeta gráfica debe admitir shaders de la atmósfera (&apos;atmospheric shaders&apos;) para poder acceder a esta configuración.
-
-Ajuste el deslizable &apos;Duración de un día&apos; para cambiar localmente, en su visor, las etapas del día.
-
-Ajuste el deslizable &apos;Nubosidad&apos; para controlar cuántas nubes cubren el cielo.
-
-Pulse un color en el selector de &apos;Color del agua&apos; para cambiar el color de la misma.
-
-Ajuste el deslizable &apos;Claridad del agua&apos; para controlar el nivel de claridad del agua bajo la superficie.
-
-Pulse &apos;Usar el horario del estado&apos; para devolver los valores del día al tiempo actual de la región y seguir a partir de él.
-
-Pulse &apos;Cielo avanzado&apos; para abrir un editor con configuraciones avanzadas para el cielo.
-
-Pulse &apos;Agua avanzada&apos; para abrir un editor con configuraciones avanzadas para el agua.
- </notification>
- <notification name="HelpDayCycle">
- El Editor del ciclo del día le permite controlar el cielo de [SECOND_LIFE] durante el ciclo día/noche. Este es el ciclo que usa el deslizable Duración de un día del Editor del entorno.
-
-El Editor del ciclo del día trabaja configurando fotogramas clave (&apos;keyframes&apos;): nodos (representados por los puntos grises en la línea del tiempo) cada uno de los cuales tiene asociado un Cielo definido. Según progresa la Duración de un día, el WindLight realiza la &apos;animación&apos; del cielo interpolándose entre esos fotogramas clave.
-
-La flecha amarilla sobre la línea del tiempo representa lo que usted ve actualmente, basándose en la Duración de un día. Púlsela y muévela para ver cómo cambia la animación del día. Puede añadir o borrar fotogramas clave pulsando los botones Añadir un punto o Quitar un punto, situados a la derecha de la línea del tiempo.
-
-Puede establecer la posición en el tiempo de cualquier fotograma clave moviéndolo a lo largo de la línea del tiempo, o configurando manualmente su valor en el recuadro Configuración del fotograma clave. También en ese recuadro podrá asociar el fotograma clave a un modelo predefinido de WindLight.
-
-La Duración del ciclo establece la duración total de un &apos;día&apos;. Marcar un valor bajo (por ejemplo, 2 min.) hará que las 24 horas de su línea del tiempo se animen ¡en sólo dos minutos reales! Una vez que esté satisfecho con su ciclo de la línea del tiempo y los fotogramas clave, utilice los botones Probar y Parar para obtener una vista previa de los resultados. Recuerde que también puede mover la flecha amarilla de encima de la línea del tiempo para ver el ciclo de la animación. El botón Usar el horario del estado sincronizará su ciclo de duración de un día con el ciclo del estado.
-
-Cuando todo esté a su gusto, puede guardar esos datos y cargarlos luego usando los botones Guardar este tipo de día y Cargar un tipo de día. Note que, por el momento, sólo podemos permitir un ciclo de un día.
- </notification>
- <notification name="HelpBlueHorizon">
- Use los deslizables Rojo/Verde/Azul (RVA) para ajustar el color del cielo. Puede usar el deslizable de Intensidad (I) para moverlos al unísono.
- </notification>
- <notification name="HelpHazeHorizon">
- La Cantidad de bruma es uno de los parámetros más útiles para ajustar el nivel de luz de la escena. Es eficaz para simular muchos ajustes de la exposición, como la claridad en un ambiente nublado o de nevisca, o las tonalidades del una flor Iris aún cerrada.
- </notification>
- <notification name="HelpBlueDensity">
- La Saturación afecta a la densidad global de la saturación de color del cielo y la niebla. Si mueve el deslizable Intensidad (I) a la derecha, los colores serán más vivos y brillantes. Si lo mueve a la izquierda, se irán decolorando hasta llegar incluso al blanco y negro. Si desea ajustar el balance de color del cielo, puede controlar la saturación de cada elemento usando el deslizable Rojo/Verde/Azul (RVA).
- </notification>
- <notification name="HelpHazeDensity">
- La Densidad de la bruma controla lo sombrío de la atmósfera, su neblina. Es eficaz para simular escenas con mucho humo o contaminantes, y también para simular niebla y llovizna.
- </notification>
- <notification name="HelpDensityMult">
- La Densidad puede usarse para definir globalmente la &apos;pesadez&apos; de la atmósfera. Los ajustes bajos dan sensación de un &apos;aire limpio&apos;, y los altos de pesadez, de esmog.
- </notification>
- <notification name="HelpDistanceMult">
- Ajusta a qué distancia se percibe el WindLight. El valor cero desactiva la influencia del WindLight en el terreno y los objetos. Los valores superiores a 1 simulan mayores distancias a las que afectan los efectos atmosféricos
- </notification>
- <notification name="HelpMaxAltitude">
- La Altitud máx. ajusta hasta que altura el WindLight realiza sus cálculos para computar la iluminación atmosférica. En las últimas horas del día, es útil para ajustar la &apos;profundidad&apos; a la que aparece el Sol.
- </notification>
- <notification name="HelpSunlightColor">
- Ajusta en la escena la intensidad y el color de las luces directas.
- </notification>
- <notification name="HelpSunAmbient">
- Ajusta en la escena la intensidad y el color de la luz ambiental.
- </notification>
- <notification name="HelpSunGlow">
- El deslizable Tamaño controla el tamaño del Sol.
-El deslizable Visión controla cómo se ve de borroso el Sol en el cielo.
- </notification>
- <notification name="HelpSceneGamma">
- Ajusta la distribución de luz y oscuridad en la pantalla.
- </notification>
- <notification name="HelpStarBrightness">
- Ajusta el brillo de las estrellas en el cielo.
- </notification>
- <notification name="HelpTimeOfDay">
- Controla la posición del Sol en el cielo. Es parecido a la elevación.
- </notification>
- <notification name="HelpEastAngle">
- Controla la posición del Sol en el cielo. Es parecido al acimut.
- </notification>
- <notification name="HelpCloudColor">
- Edita el color de las nubes. En general, es recomendable mantenerlas blanquecinas.
-Pero, vaya, diviértase si quiere.
- </notification>
- <notification name="HelpCloudDetail">
- Controla el detalle de las capas superiores de la imagen en la imagen principal de las nubes. X e Y controlan su posición. D (Densidad) controla la densidad o la fracturación con que aparecen las nubes.
- </notification>
- <notification name="HelpCloudDensity">
- Le permite controlar la posición de las nubes con los deslizables X e Y, y su desnidad con el deslizable D.
- </notification>
- <notification name="HelpCloudCoverage">
- Controla cuánto cubren el cielo las nubes.
- </notification>
- <notification name="HelpCloudScale">
- Controla el tamaño de la imagen de las nubes en la bóveda celeste.
- </notification>
- <notification name="HelpCloudScrollX">
- Controla la velocidad de las nubes al moverse en la dirección del eje X.
- </notification>
- <notification name="HelpCloudScrollY">
- Controla la velocidad de las nubes al moverse en la dirección del eje Y.
- </notification>
- <notification name="HelpClassicClouds">
- Marque esta casilla para activar la aparición de las nubes clásicas de [SECOND_LIFE] junto a las nubes del WindLight.
- </notification>
- <notification name="HelpWaterFogColor">
- Elije el color del agua bajo la superficie.
- </notification>
- <notification name="HelpWaterFogDensity">
- Controla la densidad de la claridad del agua, y a qué distancia puede verse bajo ella.
- </notification>
- <notification name="HelpUnderWaterFogMod">
- Modifica el efecto de Transparencia para controlar cuán lejos su avatar puede ver bajo el agua.
- </notification>
- <notification name="HelpWaterGlow">
- Controla la cantidad de brillo de la superficie del agua.
- </notification>
- <notification name="HelpWaterNormalScale">
- Controla el tamaño de las tres ondulaciones que componen el agua.
- </notification>
- <notification name="HelpWaterFresnelScale">
- Controla cuánta luz se refleja desde diferentes ángulos.
- </notification>
- <notification name="HelpWaterFresnelOffset">
- Controla cuánta intensidad de luz se refleja.
- </notification>
- <notification name="HelpWaterScaleAbove">
- Controla la cantidad de luz refractada mirando la superficie del agua desde arriba.
- </notification>
- <notification name="HelpWaterScaleBelow">
- Controla la cantidad de luz refractada mirando la superficie del agua desde debajo.
- </notification>
- <notification name="HelpWaterBlurMultiplier">
- Controla cómo se mezclan las ondas y los reflejos.
- </notification>
- <notification name="HelpWaterNormalMap">
- Controla cuál es la capa de &apos;vista normal&apos; del agua, para determinar las reflexiones/refracciones.
- </notification>
- <notification name="HelpWaterWave1">
- Controla hacia adónde y a qué velocidad se mueve en los ejes X e Y la versión en tamaño grande de la &apos;vista normal&apos;.
- </notification>
- <notification name="HelpWaterWave2">
- Controla hacia adónde y a qué velocidad se mueve en los ejes X e Y la versión en tamaño pequeño de la &apos;vista normal&apos;.
- </notification>
<notification name="NewSkyPreset">
Dame un nombre para el cielo nuevo.
<form name="form">
@@ -2338,7 +1960,7 @@ Pero, vaya, diviértase si quiere.
¡Esa preselección ya existe!
</notification>
<notification name="WaterNoEditDefault">
- No puede editar o borrar una preselección por defecto.
+ No puedes editar o borrar una preselección por defecto.
</notification>
<notification name="ChatterBoxSessionStartError">
No se puede empezar una nueva sesión de chat con [RECIPIENT].
@@ -2351,40 +1973,38 @@ Pero, vaya, diviértase si quiere.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="ForceCloseChatterBoxSession">
- Debe cerrarse su sesión de chat con [NAME].
+ Debe cerrarse tu sesión de chat con [NAME].
[REASON]
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="Cannot_Purchase_an_Attachment">
- No se pueden comprar los ítems que aún forman parte de un objeto anexado.
+ No puedes comprar un objeto mientras esté anexado.
</notification>
<notification label="Acerca de las solicitudes de autorización de débito" name="DebitPermissionDetails">
- Al admitir esta petición, le da permiso a un script para que coja dólares Linden (L$) de su cuenta. Para revocar este permiso, el propietario del objeto debe eliminarlo o reiniciar ese script del objeto.
+ Al admitir esta petición, le das permiso a un script para que coja dólares Linden (L$) de tu cuenta. Para revocar este permiso, el propietario del objeto debe eliminarlo o reiniciar ese script del objeto.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AutoWearNewClothing">
- ¿Quiere vestirse automáticamente el ítem de ropa nueva que ha creado?
- <usetemplate ignoretext="Al vestirme automáticamente la ropa nueva" name="okcancelignore" notext="No" yestext="Sí"/>
+ ¿Quieres ponerte automáticamente la ropa que vas a crear?
+ <usetemplate ignoretext="Ponerme la ropa que estoy creando mientras modifico mi apariencia" name="okcancelignore" notext="No" yestext="Sí"/>
</notification>
<notification name="NotAgeVerified">
- Para acceder a esta parcela, se debe haber verificado su edad.
-¿Quiere visitar la web de [SECOND_LIFE] para verificar su edad?
+ Debes haber verificado tu edad para visitar este sitio. ¿Quieres ir al sitio web de [SECOND_LIFE] y verificarla?
[_URL]
<url name="url" option="0">
https://secondlife.com/account/verification.php?lang=es
</url>
- <usetemplate ignoretext="Advertir de la falta de la verificación de edad" name="okcancelignore" notext="No" yestext="Sí"/>
+ <usetemplate ignoretext="No he verificado mi edad" name="okcancelignore" notext="No" yestext="Sí"/>
</notification>
<notification name="Cannot enter parcel: no payment info on file">
- Antes de que pueda acceder a esta parcela, se requiere que usted tenga archivada su información de pago.
-¿Quiere visitar la web de [SECOND_LIFE] para actualizar esto?
+ Para visitar este sitio debes haber aportado información de pago en tu cuenta. ¿Quieres ir al sitio web de [SECOND_LIFE] y configurar esto?
[_URL]
<url name="url" option="0">
https://secondlife.com/account/index.php?lang=es
</url>
- <usetemplate ignoretext="Advertir de la falta de información de pago" name="okcancelignore" notext="No" yestext="Sí"/>
+ <usetemplate ignoretext="No he registrado información de pago" name="okcancelignore" notext="No" yestext="Sí"/>
</notification>
<notification name="MissingString">
La cadena [STRING_NAME] Ha desaparecido de strings.xml
@@ -2392,14 +2012,17 @@ Pero, vaya, diviértase si quiere.
<notification name="SystemMessageTip">
[MESSAGE]
</notification>
+ <notification name="IMSystemMessageTip">
+ [MESSAGE]
+ </notification>
<notification name="Cancelled">
Cancelado
</notification>
<notification name="CancelledSit">
- Cancelado el sentarse
+ Cancelado el sentarte
</notification>
<notification name="CancelledAttach">
- Candelado el anexar
+ Cancelado el anexar
</notification>
<notification name="ReplacedMissingWearable">
Reemplazadas las ropas o partes del cuerpo perdidas con sus equivalentes por defecto.
@@ -2414,14 +2037,19 @@ Pero, vaya, diviértase si quiere.
[FIRST] [LAST] no está conectado
</notification>
<notification name="AddSelfFriend">
- No se puede añadir como amigo a usted mismo.
+ Aunque eres muy agradable, no puedes añadirte como amigo a ti mismo.
</notification>
<notification name="UploadingAuctionSnapshot">
Subiendo fotos del mundo y del sitio web...
(tardará unos 5 minutos).
</notification>
+ <notification name="UploadConfirmation">
+ La subida cuesta [AMOUNT] L$.
+¿Quieres continuar?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Subir"/>
+ </notification>
<notification name="UploadPayment">
- Ha pagado [AMOUNT] LS por la subida.
+ Has pagado [AMOUNT] LS por la subida.
</notification>
<notification name="UploadWebSnapshotDone">
Completada la subida de la foto del sitio web.
@@ -2433,30 +2061,29 @@ Pero, vaya, diviértase si quiere.
Se ha descargado Terrain.raw
</notification>
<notification name="GestureMissing">
- El gesto [NAME] ha desaparecido de la base de datos.
+ No se encuentra en la base de datos el gesto [NAME].
</notification>
<notification name="UnableToLoadGesture">
- No se ha podido cargar el gesto [NAME].
-Por favor, vuelva a intentarlo.
+ No se puede cargar el gesto [NAME].
</notification>
<notification name="LandmarkMissing">
El hito ha desaparecido de la base de datos.
</notification>
<notification name="UnableToLoadLandmark">
- No se ha podido cargar el hito. Por favor, vuelva a intentarlo.
+ No se ha podido cargar el hito. Por favor, vuelve a intentarlo.
</notification>
<notification name="CapsKeyOn">
- Tiene pulsada su tecla de bloqueo de mayúsculas, lo que influirá en cómo escriba la contraseña.
-Quizá quiera soltar esa tecla.
+ Tienes pulsada la tecla de mayúsculas.
+Esto puede influir en tu contraseña.
</notification>
<notification name="NotecardMissing">
La nota ha desaparecido de la base de datos.
</notification>
<notification name="NotecardNoPermissions">
- No tiene permisos suficientes para ver la nota.
+ No tienes permiso para ver esta nota.
</notification>
<notification name="RezItemNoPermissions">
- No tiene permisos suficientes para renderizar el objeto.
+ No tienes permisos suficientes para renderizar el objeto.
</notification>
<notification name="UnableToLoadNotecard">
En este momento no se puede cargar la nota.
@@ -2465,37 +2092,37 @@ Quizá quiera soltar esa tecla.
El script ha desaparecido de la base de datos.
</notification>
<notification name="ScriptNoPermissions">
- No tiene permisos suficientes para ver el script.
+ No tienes permisos suficientes para ver el script.
</notification>
<notification name="UnableToLoadScript">
- No se ha podido cargar el script. Por favor, vuelva a intentarlo.
+ No se ha podido cargar el script. Por favor, vuelve a intentarlo.
</notification>
<notification name="IncompleteInventory">
- Los contenidos que está usted ofreciendo aún no están disponibles. Por favor, vuelva a ofrecerlos en un minuto.
+ Los contenidos que estás ofreciendo aún no están disponibles. Por favor, vuelve a ofrecerlos en un minuto.
</notification>
<notification name="CannotModifyProtectedCategories">
- No puede modificar categorías que están protegidas.
+ No puedes modificar categorías que están protegidas.
</notification>
<notification name="CannotRemoveProtectedCategories">
- No puede quitar categorías que están protegidas.
+ No puedes quitar categorías que están protegidas.
</notification>
<notification name="OfferedCard">
- Ha ofrecido una tarjeta de visita a [FIRST] [LAST]
+ Has ofrecido una tarjeta de visita a [FIRST] [LAST]
</notification>
<notification name="UnableToBuyWhileDownloading">
- No se puede comprar un objeto mientras se descargan sus datos.
-Por favor, vuelva a intentarlo.
+ No se puede comprar un objeto mientras se descargan los datos.
+Por favor, vuelve a intentarlo.
</notification>
<notification name="UnableToLinkWhileDownloading">
- No se puede enlazar un objeto mientras se descargan sus datos.
-Por favor, vuelva a intentarlo.
+ No se puede enlazar un objeto mientras se descargan los datos.
+Por favor, vuelve a intentarlo.
</notification>
<notification name="CannotBuyObjectsFromDifferentOwners">
- No puede comprar a la vez objetos de diferentes propietarios.
-Por favor, elija sólo uno.
+ No puedes comprar más de un objeto a la vez.
+Por favor, selecciona un sólo objeto.
</notification>
<notification name="ObjectNotForSale">
- El objeto no aparece como puesto a la venta.
+ Este objeto no está en venta.
</notification>
<notification name="EnteringGodMode">
Entrando en el modo administrativo, nivel [LEVEL]
@@ -2504,40 +2131,42 @@ Por favor, elija sólo uno.
Saliendo del modo administrativo, nivel [LEVEL]
</notification>
<notification name="CopyFailed">
- No se ha hecho la copia porque usted no tiene permiso para hacerla
+ No tienes pemiso para copiar esto.
</notification>
<notification name="InventoryAccepted">
- [NAME] ha aceptado su oferta del inventario.
+ [NAME] ha recibido tu oferta de inventario.
</notification>
<notification name="InventoryDeclined">
- [NAME] ha rehusado su oferta del inventario.
+ [NAME] ha rehusado tu oferta del inventario.
</notification>
<notification name="ObjectMessage">
[NAME]: [MESSAGE]
</notification>
<notification name="CallingCardAccepted">
- Se ha aceptado su tarjeta de visita.
+ Se ha aceptado tu tarjeta de visita.
</notification>
<notification name="CallingCardDeclined">
- Se ha rehusado su tarjeta de visita.
+ Se ha rehusado tu tarjeta de visita.
</notification>
<notification name="TeleportToLandmark">
- Ahora que ha llegado a mainland (los continentes), puede teleportarse a localizaciones como &apos;[NAME]&apos; pulsando el botón Inventario de la esquina inferior derecha de su pantalla, y, después, seleccionando la carpeta Hitos.
-Pulse dos veces en el hito y, luego, pulse en Teleportar para viajar hasta allí.
+ Puedes teleportarte a lugares como &apos;[NAME]&apos; abriendo el panel Lugares -a la derecha de tu pantalla- y seleccionando la sección Hitos.
+Pulsa en un hito para seleccionarlo, y, luego, pulsa &apos;Teleportar&apos; en la parte inferior del panel.
+(También puedes pulsar dos veces en el hito o pulsarlo con el botón derecho del ratón y elegir &apos;Teleportar&apos;.)
</notification>
<notification name="TeleportToPerson">
- Ahora que ha llegado a mainland (los continentes), puede contactar con residentes como &apos;[NAME]&apos; pulsando el botón Inventario de la esquina inferior derecha de su pantalla, y, después, seleccionando la carpeta Tarjetas de visita.
-Pulse dos veces en la tarjeta, pulse en Mensaje Instantáneo, y escriba un mensaje.
+ Puedes contactar con un Residente como &apos;[NAME]&apos; abriendo el panel Gente en el lado derecho de tu pantalla.
+Elige al Residente de la lista y pulsa &apos;MI&apos; en la parte inferior del panel.
+(También puedes pulsar dos veces en su nombre o pulsarlo con el botón derecho y elegir &apos;MI&apos;).
</notification>
<notification name="CantSelectLandFromMultipleRegions">
- No puede seleccionar un terreno que cruce las fronteras entre servidores.
-Inténtelo seleccionando un trozo más pequeño de terreno.
+ No puedes seleccionar un terreno que cruce las fronteras entre servidores.
+Inténtalo seleccionando un trozo más pequeño de terreno.
</notification>
<notification name="SearchWordBanned">
- Se han excluido algunos términos de su búsqueda debido a restricciones en el contenido, según se especifica en las Normas de la Comunidad.
+ Se han excluido algunos términos de tu búsqueda debido a restricciones en el contenido, según se especifica en las Normas de la Comunidad.
</notification>
<notification name="NoContentToSearch">
- Por favor, elija al menos un tipo de contenido a buscar (&apos;PG&apos;, &apos;Mature&apos;, o &apos;Adult&apos;).
+ Por favor, elige al menos un tipo de contenido a buscar (&apos;PG&apos;, &apos;Mature&apos;, o &apos;Adult&apos;).
</notification>
<notification name="GroupVote">
[NAME] ha propuesto votar:
@@ -2550,6 +2179,9 @@ Inténtelo seleccionando un trozo más pequeño de terreno.
<notification name="SystemMessage">
[MESSAGE]
</notification>
+ <notification name="PaymentRecived">
+ [MESSAGE]
+ </notification>
<notification name="EventNotification">
Notificación de un evento:
@@ -2574,17 +2206,29 @@ Inténtelo seleccionando un trozo más pequeño de terreno.
[NAMES]
</notification>
<notification name="NoQuickTime">
- No se ve como instalado en su sistema el software QuickTime de Apple.
-Si quiere ver por streaming elementos multimedia en las parcelas que los tengan, debe ir al sitio web de QuickTime (http://www.apple.com/quicktime) e instalar el QuickTime Player.
+ No parece que tu sistema tenga instalado el software QuickTime de Apple.
+Si quieres ver media en streaming en las parcelas que los tienen, deberías ir al [http://www.apple.com/quicktime sitio de QuickTime] e intalar el QuickTime Player.
+ </notification>
+ <notification name="NoPlugin">
+ No se ha encontrado el &apos;Media Plugin&apos; para manejar el &apos;mime type&apos; &quot;[MIME_TYPE]&quot;. Los media de este tipo no estarán disponibles.
+ </notification>
+ <notification name="MediaPluginFailed">
+ Fallo de este &apos;Media Plugin&apos;:
+ [PLUGIN]
+
+Por favor, reinstala el plugin o contacta con el vendedor si sigues teniendo problemas.
+ <form name="form">
+ <ignore name="ignore" text="Fallo al ejecutar un &apos;Media Plugin&apos;"/>
+ </form>
</notification>
<notification name="OwnedObjectsReturned">
- Se han devuelto a su inventario los objetos de los que usted era propietario en la parcela seleccionada.
+ Se han devuelto a tu inventario los objetos de los que eras propietario en la parcela seleccionada.
</notification>
<notification name="OtherObjectsReturned">
- Se han devuelto a su inventario los objetos de los que usted era propietario en la parcela propiedad de [FIRST] [LAST].
+ Se han devuelto a tu inventario los objetos de los que eras propietario en la parcela propiedad de [FIRST] [LAST].
</notification>
<notification name="OtherObjectsReturned2">
- Se han devuelto a su propietario los objetos que, en la parcela seleccionada, eran propiedad del residente &apos;[NAME]&apos;.
+ Se han devuelto a su propietario los objetos seleccionados en la parcela de terreno propiedad de &apos;[NAME]&apos;.
</notification>
<notification name="GroupObjectsReturned">
Se han devuelto a los inventarios de sus propietarios los objetos que estaban compartidos con el grupo [GROUPNAME] en la parcela seleccionada.
@@ -2592,26 +2236,28 @@ Los objetos transferibles que se transfirieron al grupo se han devuelto a sus pr
Los objetos no transferibles que se transfirieron al grupo han sido borrados.
</notification>
<notification name="UnOwnedObjectsReturned">
- Se han devuelto a sus propietarios los objetos de los que usted NO era propietario en la parcela seleccionada.
+ Se han devuelto a sus propietarios los objetos de los que NO eras propietario en la parcela seleccionada.
+ </notification>
+ <notification name="ServerObjectMessage">
+ Mensaje de [NAME]:
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
</notification>
<notification name="NotSafe">
- Este es un terreno con el daño autorizado (&apos;no seguro&apos;).
-Aquí puede ser herido. Si muere, será teleportado a su Base.
+ Este terreno tiene el daño activado.
+Aquí puedes ser herido. Si mueres, se te teleportará a tu Base.
</notification>
<notification name="NoFly">
- En este terreno no se permite volar (&apos;no volar&apos;).
-Aquí no debe volar.
+ Este terreno tiene desactivado el poder volar.
+Aquí no puedes volar.
</notification>
<notification name="PushRestricted">
- Este terreno es &apos;Sin empujones&apos;.
-No puede empujar a otros a menos que sea el propietario del terreno.
+ Este terreno no autoriza el poder empujar. No puedes hacerlo a menos que seas el propetario del terreno.
</notification>
<notification name="NoVoice">
- Este terreno tiene desactivada la voz.
+ Este tereno tiene desactivado el chat de voz. No podrás oír hablar a nadie.
</notification>
<notification name="NoBuild">
- Este terreno tiene desactivado el construir (&apos;no construir&apos;).
-Aquí no puede crear objetos.
+ Este terreno tiene desactivado el poder construir. Aquí no puedes ni construir ni crear objetos.
</notification>
<notification name="ScriptsStopped">
Un administrador ha detenido temporalmente los scripts en esta región.
@@ -2620,48 +2266,41 @@ Aquí no puede crear objetos.
En esta región no se está ejecutando ningún script.
</notification>
<notification name="NoOutsideScripts">
- Esta región tiene desactivados los scripts de otros
-(&apos;no scripts de otros&apos;).
-No se ejecutará ningún script que no pertenezca al propietario del terreno.
+ Este terreno tiene desactivados los scripts externos.
+
+Los scripts no funcionan aquí, excepto los pertenecientes al propietario del terreno.
</notification>
<notification name="ClaimPublicLand">
- Sólo puede reclamar terreno público en la región en que está usted.
+ Sólo puedes reclamar terreno público de la región en que estás.
</notification>
<notification name="RegionTPAccessBlocked">
- No está autorizado en esa región por su nivel de calificación. Debe validar su edad y/o instalar el último visor.
+ No estás autorizado en esa región por su nivel de calificación. Debes validar tu edad y/o instalar el último visor.
-Por favor, vaya a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
+Por favor, dirígete a la Base de Conocimientos para más detalles sobre el acceso a zonas con este nivel de calificación.
</notification>
<notification name="URBannedFromRegion">
- Se le ha prohibido el acceso a la región.
+ Se te ha prohibido el acceso a la región.
</notification>
<notification name="NoTeenGridAccess">
- Su cuenta no puede conectarse a esta región del grid teen.
- </notification>
- <notification name="NoHelpIslandTP">
- No puede teleportarse de vuelta a la Help Island (&apos;Isla de Ayuda&apos;).
-Vaya a la &apos;Help Island Public&apos; (&apos;Isla Pública de Ayuda&apos;) para repetir el tutorial.
+ Tu cuenta no puede conectarse a esta región del grid teen.
</notification>
<notification name="ImproperPaymentStatus">
- No tiene el estado de pago adecuado para entrar a esta región.
- </notification>
- <notification name="MustGetAgeRegion">
- Debe haber verificado su edad para entrar a esta región.
+ No tienes el estado de pago adecuado para entrar a esta región.
</notification>
<notification name="MustGetAgeParcel">
- Debe haber verificado su edad para entrar a esta parcela.
+ Debes haber verificado tu edad para entrar a esta parcela.
</notification>
<notification name="NoDestRegion">
No se ha encontrada la región de destino.
</notification>
<notification name="NotAllowedInDest">
- No está autorizado en el destino.
+ No estás autorizado en el destino.
</notification>
<notification name="RegionParcelBan">
- No puede cruzar la región por una parcela con el acceso prohibido. Intente otro camino.
+ No puedes cruzar la región por una parcela con el acceso prohibido. Intenta otro camino.
</notification>
<notification name="TelehubRedirect">
- Ha sido redirigido a un punto de teleporte.
+ Has sido redirigido a un punto de teleporte.
</notification>
<notification name="CouldntTPCloser">
No se puede teleportar a un destino tan cercano.
@@ -2670,17 +2309,17 @@ Vaya a la &apos;Help Island Public&apos; (&apos;Isla Pública de Ayuda&apos;) pa
Teleporte cancelado.
</notification>
<notification name="FullRegionTryAgain">
- En estos momentos, está llena la región a la que intenta entrar.
-Por favor, reinténtelo en unos momentos.
+ En estos momentos, está llena la región a la que estás intentando entrar.
+Por favor, vuelve a intentarlo en unos momentos.
</notification>
<notification name="GeneralFailure">
Fallo general.
</notification>
<notification name="RoutedWrongRegion">
- Mal dirigido a la región. Por favor, reinténtelo.
+ Mal dirigido a la región. Por favor, vuelve a intentarlo.
</notification>
<notification name="NoValidAgentID">
- ID de agente inválida.
+ ID de agente inválido.
</notification>
<notification name="NoValidSession">
ID de sesión inválido.
@@ -2695,13 +2334,13 @@ Por favor, reinténtelo en unos momentos.
No se puede crear la conexión.
</notification>
<notification name="InternalUsherError">
- Se ha producido un error interno al intentar acceder al destino de su teleporte. Puede que, en este momento, el servicio de [SECOND_LIFE] tenga problemas.
+ Se ha producido un error interno al intentar acceder al destino de tu teleporte. Puede que, en este momento, el servicio de [SECOND_LIFE] tenga problemas.
</notification>
<notification name="NoGoodTPDestination">
No se puede encontrar en esta región un buen destino para el teleporte.
</notification>
<notification name="InternalErrorRegionResolver">
- Ha sucedido un error interno al manejar las coordenadas globales de su petición de teleporte. Puede que, en este momento, el servicio de [SECOND_LIFE] tenga problemas.
+ Se ha producido un error interno al manejar las coordenadas globales de tu petición de teleporte. Puede que, en este momento, el servicio de [SECOND_LIFE] tenga problemas.
</notification>
<notification name="NoValidLanding">
No se ha podido encontrar un punto de aterrizaje válido.
@@ -2710,15 +2349,8 @@ Por favor, reinténtelo en unos momentos.
No se ha podido encontrar una parcela válida.
</notification>
<notification name="ObjectGiveItem">
- Un objeto llamado [OBJECTFROMNAME], propiedad de [FIRST] [LAST], le ha dado un/a [OBJECTTYPE] de nombre [OBJECTNAME].
- <form name="form">
- <button name="Keep" text="Guardar"/>
- <button name="Discard" text="Descartar"/>
- <button name="Mute" text="Ignorar"/>
- </form>
- </notification>
- <notification name="ObjectGiveItemUnknownUser">
- Un objeto llamado [OBJECTFROMNAME], propiedad de (un usuario desconocido), le ha dado un/a [OBJECTTYPE] de nombre [OBJECTNAME].
+ Un objeto de nombre [OBJECTFROMNAME], propiedad de [NAME_SLURL], te ha dado este [OBJECTTYPE]:
+[ITEM_SLURL]
<form name="form">
<button name="Keep" text="Guardar"/>
<button name="Discard" text="Descartar"/>
@@ -2726,15 +2358,17 @@ Por favor, reinténtelo en unos momentos.
</form>
</notification>
<notification name="UserGiveItem">
- [NAME] le ha dado un/a [OBJECTTYPE] de nombre &apos;[OBJECTNAME]&apos;.
+ [NAME_SLURL] te ha dado este [OBJECTTYPE]:
+[ITEM_SLURL]
<form name="form">
- <button name="Keep" text="Guardar"/>
+ <button name="Show" text="Mostrar"/>
<button name="Discard" text="Descartar"/>
<button name="Mute" text="Ignorar"/>
</form>
</notification>
<notification name="GodMessage">
[NAME]
+
[MESSAGE]
</notification>
<notification name="JoinGroup">
@@ -2746,14 +2380,17 @@ Por favor, reinténtelo en unos momentos.
</form>
</notification>
<notification name="TeleportOffered">
- [NAME] se ha ofrecido a teleportarle hasta su posición:
+ [NAME_SLURL] te ha ofrecido teleportarte a su posición:
-[MESSAGE]
+[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
<form name="form">
<button name="Teleport" text="Teleportar"/>
<button name="Cancel" text="Cancelar"/>
</form>
</notification>
+ <notification name="TeleportOfferSent">
+ Teleporte ofrecido a [TO_NAME]
+ </notification>
<notification name="GotoURL">
[MESSAGE]
[URL]
@@ -2763,46 +2400,55 @@ Por favor, reinténtelo en unos momentos.
</form>
</notification>
<notification name="OfferFriendship">
- [NAME] le está ofreciendo amistad.
+ [NAME_SLURL] te está ofreciendo su amistad.
[MESSAGE]
-(Por defecto, usted podrá ver si están conectados los demás).
+(Por defecto, podrás ver si el otro está conectado)
<form name="form">
<button name="Accept" text="Aceptar"/>
<button name="Decline" text="Rehusar"/>
</form>
</notification>
+ <notification name="FriendshipOffered">
+ Has ofrecido amistad a [TO_NAME]
+ </notification>
<notification name="OfferFriendshipNoMessage">
- [NAME] le está ofreciendo amistad.
+ [NAME] te está ofreciendo amistad.
-(Por defecto, usted podrá ver si están conectados los demás).
+(Por defecto, podrás ver si están conectados los demás).
<form name="form">
<button name="Accept" text="Aceptar"/>
<button name="Decline" text="Rehusar"/>
</form>
</notification>
<notification name="FriendshipAccepted">
- [NAME] ha aceptado su oferta de amistad.
+ [NAME] ha aceptado tu oferta de amistad.
</notification>
<notification name="FriendshipDeclined">
- [NAME] ha rehusado su oferta de amistad.
+ [NAME] ha rehusado tu oferta de amistad.
+ </notification>
+ <notification name="FriendshipAcceptedByMe">
+ Aceptado el ofrecimiento de amistad.
+ </notification>
+ <notification name="FriendshipDeclinedByMe">
+ Rehusado el ofrecimiento de amistad.
</notification>
<notification name="OfferCallingCard">
- [FIRST] [LAST] le está ofreciendo su tarjeta de visita.
-Esto añadirá un ítem a su inventario para que pueda enviar rápidamente a este residente un MI.
+ [FIRST] [LAST] te está ofreciendo su tarjeta de visita.
+Esto añadirá un marcador en tu inventario para que puedas enviarle rápidamente un MI.
<form name="form">
<button name="Accept" text="Aceptar"/>
<button name="Decline" text="Rehusar"/>
</form>
</notification>
<notification name="RegionRestartMinutes">
- La región se reiniciará en [MINUTES] minutos.
-Si permanece en esta región, será desconectado.
+ Esta región se reiniciará en [MINUTES] minutos.
+Si permaneces en esta región serás desconectado.
</notification>
<notification name="RegionRestartSeconds">
- La región se reiniciará en [SECONDS] segundos.
-Si permanece en esta región, será desconectado.
+ Esta región se reiniciará en [SECONDS] segundos.
+Si permaneces en esta región serás desconectado.
</notification>
<notification name="LoadWebPage">
¿Cargar la página web [URL]?
@@ -2821,14 +2467,17 @@ Del objeto: [OBJECTNAME]; propiedad de: [NAME]?
<notification name="FailedToFindWearable">
Búsqueda fallida de [TYPE] de nombre [DESC] en la base de datos.
</notification>
+ <notification name="ShareToWebFailed">
+ Fallo al subir la imagen a la web.
+ </notification>
<notification name="InvalidWearable">
- El ítem que intenta llevar usa una característica que su visor no puede leer. Por favor, actualice su versión de [APP_NAME] para llevar este ítem.
+ El ítem que quieres vestirte tiene una característica que tu visor no puede leer. Por favor, actualiza tu versión de [APP_NAME] para ponerte este ítem.
</notification>
<notification name="ScriptQuestion">
&apos;[OBJECTNAME]&apos;, un objeto propiedad de &apos;[NAME]&apos;, querría:
[QUESTIONS]
-¿Está de acuerdo?
+¿Estás de acuerdo?
<form name="form">
<button name="Yes" text="Sí"/>
<button name="No" text="No"/>
@@ -2836,10 +2485,10 @@ Del objeto: [OBJECTNAME]; propiedad de: [NAME]?
</form>
</notification>
<notification name="ScriptQuestionCaution">
- &apos;[OBJECTNAME]&apos;, un objeto propiedad de &apos;[NAME]&apos;, querría:
+ Un objeto de nombre &apos;[OBJECTNAME]&apos;, propiedad de &apos;[NAME]&apos;, quiere:
[QUESTIONS]
-Si no confía en este objeto y su creador, debe denegar la solicitud. Para más información, pulse el botón Detalles.
+Si no confias en este objeto y en su creador, deberías rehusar esta petición.
¿Autorizar esta petición?
<form name="form">
@@ -2862,86 +2511,29 @@ Si no confía en este objeto y su creador, debe denegar la solicitud. Para más
<button name="Ignore" text="Ignorar"/>
</form>
</notification>
- <notification name="FirstBalanceIncrease">
- Ha recibido [AMOUNT] L$.
-Pueden darle L$ tanto objetos como otros usuarios.
-Su balance se muestra en la esquina superior derecha de la pantalla.
- </notification>
- <notification name="FirstBalanceDecrease">
- Ha pagado [AMOUNT] L$.
-Su balance se muestra en la esquina superior derecha de la pantalla.
- </notification>
- <notification name="FirstSit">
- Está sentado.
-Use las teclas del cursor (o AWSD) para cambiar el punto de vista.
-Pulde el botón &apos;Levantarse&apos; para ponerse de pie.
- </notification>
- <notification name="FirstMap">
- Pulse el mapa y arrástrelo para desplazarlo.
-Púlselo dos veces para teleportarse.
-Use los controles de la derecha para encontrar sitios y mostrar diferentes fondos.
- </notification>
- <notification name="FirstBuild">
- Usted puede construir objetos nuevos en algunas zonas de [SECOND_LIFE].
-Use las herramientas de arriba a la izquierda para construir, y pruebe a cambiar rápidamente entre ellas pulsando Ctrl o Alt.
-Pulse Esc para dejar de construir.
- </notification>
- <notification name="FirstLeftClickNoHit">
- En algunos objetos concretos, al pulsarlos con el botón izquierdo del ratón interacciona con ellos.
-Si el puntero del ratón pasa a ser una mano puede interactuar con el objeto.
-El botón derecho del ratón siempre muestra un menú con cosas que usted puede hacer.
- </notification>
- <notification name="FirstTeleport">
- Esta región no permite teleportarse de un punto a otro, por lo que ha sido llevado al Punto de Teleporte más cercano.
-Su destinado está señalado con una columna de luz roja.
-Siga la flecha roja hasta llegar a la columna, o pulse la flecha para hacerla desaparecer.
+ <notification name="BuyLindenDollarSuccess">
+ ¡Gracias por tu pago!
+
+Tu saldo de L$ se actualizará cuando se complete el proceso. Si el proceso tarda más de 20 minutos, se cancelará tu transacción, y la cantidad se cargará en tu saldo de US$.
+
+Puedes revisar el estado de tu pago en el Historial de transacciones de tu [http://secondlife.com/account/ Panel de Control]
</notification>
<notification name="FirstOverrideKeys">
- A partir de ahora, sus teclas de movimiento las gestiona un objeto.
-Pruebe las teclas del cursor o AWSD para ver qué hacen.
-Algunos objetos (las pistolas, por ejemplo) le pedirán que, para usarlos, entre usted en vista subjetiva. Pulse &apos;M&apos; para hacerlo.
- </notification>
- <notification name="FirstAppearance">
- Está modificando su apariencia.
-Use las teclas del cursor para girar el punto de vista y hacer zoom.
-Cuando acabe, pulse &apos;Guardar todo&apos; para salvar su apariencia y salir del modificarla.
-Puede modificar su apariencia tantas veces como quiera.
- </notification>
- <notification name="FirstInventory">
- Este es su inventario. Tiene objetos, notas, ropas, y otras cosas de su propiedad.
-* Para vestirse un objeto o un vestuario completo, arrástrelo hasta usted mismo.
-* Para colocar un objeto en el mundo, arrástrelo hasta el suelo.
-* Para leer una nota, pulse dos veces en ella.
+ A partir de ahora, tus teclas de movimiento las gestiona un objeto.
+Prueba las teclas del cursor o AWSD para ver qué hacen.
+Algunos objetos (las pistolas, por ejemplo) te pedirán que, para usarlos, entres en vista subjetiva. Pulsa &apos;M&apos; para hacerlo.
</notification>
<notification name="FirstSandbox">
- Esta es una región &apos;sandbox&apos; (zona de pruebas).
-Los objetos que construya aquí pueden ser eliminados cuando salga de esta zona, pues los sandbox se limpian regularmente. Por favor, tenga en cuenta la información que hay arriba de su pantalla junto al nombre de la región.
+ Esta es una región &apos;sandbox&apos; (zona de pruebas) donde los Residentes pueden aprender a construir.
-Las regiones sandbox no son frecuentes, y están señalizadas.
- </notification>
- <notification name="FirstFlexible">
- Este objeto es flexible.
-Los objetos flexibles no pueden ser materiales, y serán inmateriales hasta que se desmarque la casilla de flexibles.
- </notification>
- <notification name="FirstDebugMenus">
- Ha activado el menú Avanzado.
-Contiene herramientas útiles para los desarrolladores que trabajan mejorando [SECOND_LIFE].
-Para pasar este menú a una ventana, pulse Ctrl+Alt+D. En un Mac, pulse &#8997;&#8984;D.
- </notification>
- <notification name="FirstSculptedPrim">
- Está editando un prim &apos;sculpted&apos;.
-Los prim sculpted requieren una textura especial para tomar forma.
-Puede encontrar ejemplos de texturas sculpted en la biblioteca del inventario.
- </notification>
- <notification name="FirstMedia">
- Ha empezado a reproducir media. Puede hacer que los media se reproduzcan automáticamente en la pestaña Audio y Vídeo de la ventana de preferencias. Note que tal cosa puede suponer un riesgo de seguridad en los sitios multimedia en los que no confíe.
+Los objetos que construyas aquí serán eliminados cuando la abandones; por tanto, no olvides pulsarlos con el botón derecho y elegir &apos;Tomar&apos; para que tu creación vaya a tu inventario.
</notification>
<notification name="MaxListSelectMessage">
- Puede seleccionar un máximo de [MAX_SELECT] ítems de esta lista.
+ Puedes seleccionar un máximo de [MAX_SELECT] ítems de esta lista.
</notification>
<notification name="VoiceInviteP2P">
- [NAME] le está invitando a un chat de voz.
-Pulse Aceptar para coger la llamada o Rehusar para declinar la invitación. Pulse Ignorar para ignorar a quien llama.
+ [NAME] te está invitando a un chat de voz.
+Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama.
<form name="form">
<button name="Accept" text="Aceptar"/>
<button name="Decline" text="Rehusar"/>
@@ -2949,17 +2541,17 @@ Pulse Aceptar para coger la llamada o Rehusar para declinar la invitación. Puls
</form>
</notification>
<notification name="AutoUnmuteByIM">
- [FIRST] [LAST], a quien ha enviado un mensaje instantáneo, ha dejado automáticamente de estar ignorado.
+ [FIRST] [LAST] ha dejado automáticamente de estar ignorado al enviarle un mensaje instantáneo.
</notification>
<notification name="AutoUnmuteByMoney">
- [FIRST] [LAST], a quien ha dado dinero, ha dejado automáticamente de estar ignorado.
+ [FIRST] [LAST] ha dejado automáticamente de estar ignorado al darle dinero.
</notification>
<notification name="AutoUnmuteByInventory">
- [FIRST] [LAST], a quien ha ofrecido algo del inventario, ha dejado automáticamente de estar ignorado.
+ [FIRST] [LAST] ha dejado automáticamente de estar ignorado al ofrecerle algo del inventario.
</notification>
<notification name="VoiceInviteGroup">
[NAME] ha empezado un chat de voz con el grupo [GROUP].
-Pulse Aceptar para coger la llamada o Rehusar para declinar la invitación. Pulse Ignorar para ignorar a quien llama.
+Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama.
<form name="form">
<button name="Accept" text="Aceptar"/>
<button name="Decline" text="Rehusar"/>
@@ -2968,7 +2560,7 @@ Pulse Aceptar para coger la llamada o Rehusar para declinar la invitación. Puls
</notification>
<notification name="VoiceInviteAdHoc">
[NAME] ha empezado un chat de voz en multiconferencia.
-Pulse Aceptar para coger la llamada o Rehusar para declinar la invitación. Pulse Ignorar para ignorar a este usuario.
+Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama.
<form name="form">
<button name="Accept" text="Aceptar"/>
<button name="Decline" text="Rehusar"/>
@@ -2976,8 +2568,8 @@ Pulse Aceptar para coger la llamada o Rehusar para declinar la invitación. Puls
</form>
</notification>
<notification name="InviteAdHoc">
- [NAME] le está invitando a un chat en multiconferencia.
-Pulse Aceptar para entrar al chat o Rehusar para declinar la invitación. Pulse Ignorar para ignorar a este usuario.
+ NAME] te está invitando a un chat en multiconferencia.
+Pulsa Aceptar o Rehusar para coger o no la llamada. Pulsa Ignorar para ignorar al que llama.
<form name="form">
<button name="Accept" text="Aceptar"/>
<button name="Decline" text="Rehusar"/>
@@ -2985,57 +2577,205 @@ Pulse Aceptar para entrar al chat o Rehusar para declinar la invitación. Pulse
</form>
</notification>
<notification name="VoiceChannelFull">
- El chat de voz al que está intentando entrar, [VOICE_CHANNEL_NAME], ha llegado a su capacidad máxima. Por favor, inténtelo más tarde.
+ El chat de voz al que estás intentando entrar, [VOICE_CHANNEL_NAME], ha llegado a su capacidad máxima. Por favor, vuelve a intentarlo más tarde.
</notification>
<notification name="ProximalVoiceChannelFull">
- Lo sentimos. Este área ha llegado a su capacidad máxima de conversaciones por voz. Por favor, intente usar la voz en otra zona.
+ Lo sentimos. Este área ha llegado a su capacidad máxima de conversaciones por voz. Por favor, intenta usar la voz en otra zona.
</notification>
<notification name="VoiceChannelDisconnected">
- Ha sido desconectado del [VOICE_CHANNEL_NAME]. Va a ser reconectado al chat de voz del mundo.
+ Has sido desconectado de [VOICE_CHANNEL_NAME]. Vas a ser reconectado al chat de voz.
</notification>
<notification name="VoiceChannelDisconnectedP2P">
- [VOICE_CHANNEL_NAME] ha colgado la llamada. Usted va a ser reconectado al chat de voz del mundo.
+ [VOICE_CHANNEL_NAME] ha colgado la llamada. Vas a ser reconectado al chat de voz.
</notification>
<notification name="P2PCallDeclined">
- [VOICE_CHANNEL_NAME] ha rehusado su llamada. Usted va a ser reconectado al chat de voz del mundo.
+ [VOICE_CHANNEL_NAME] ha rehusado tu llamada. Vas a ser reconectado al chat de voz.
</notification>
<notification name="P2PCallNoAnswer">
- [VOICE_CHANNEL_NAME] no está disponible para coger su llamada. Usted va a ser reconectado al chat de voz del mundo.
+ [VOICE_CHANNEL_NAME] no está disponible para coger tu llamada. Vas a ser reconectado al chat de voz.
</notification>
<notification name="VoiceChannelJoinFailed">
- Fallo al conectar al [VOICE_CHANNEL_NAME]; por favor, inténtelo más tarde. Usted va a ser reconectado al chat de voz del mundo.
+ Fallo al conectar a [VOICE_CHANNEL_NAME]; por favor, inténtalo más tarde. Vas a ser reconectado al chat de voz.
</notification>
<notification name="VoiceLoginRetry">
- Estamos creando un canal de voz para usted. Se puede tardar hasta un minuto.
+ Estamos creando un canal de voz para ti. Se puede tardar hasta un minuto.
+ </notification>
+ <notification name="VoiceEffectsExpired">
+ Una o más de las transformaciones de voz a las que estás suscrito han caducado.
+[Pulsa aquí [URL]] para renovar la suscripción.
+ </notification>
+ <notification name="VoiceEffectsExpiredInUse">
+ La transformación de voz activa ha caducado y se ha aplicado tu configuración de voz normal.
+[Pulsa aquí [URL]] para renovar la suscripción.
+ </notification>
+ <notification name="VoiceEffectsWillExpire">
+ Una o más de tus transformaciones de voz caducarán en menos de [INTERVAL] días.
+[Pulsa aquí [URL]] para renovar la suscripción.
+ </notification>
+ <notification name="VoiceEffectsNew">
+ Están disponibles nuevas transformaciones de voz.
</notification>
<notification name="Cannot enter parcel: not a group member">
- No puede entrar en esta parcela, no es miembro del grupo adecuado.
+ Sólo los miembros de un grupo determinado pueden visitar esta zona.
</notification>
<notification name="Cannot enter parcel: banned">
- No puede entrar en esta parcela, se le ha prohibido el acceso.
+ No puedes entrar en esta parcela, se te ha prohibido el acceso.
</notification>
<notification name="Cannot enter parcel: not on access list">
- No puede entrar en esta parcela, no está en la lista de acceso.
+ No puedes entrar en esta parcela, no estás en la lista de acceso.
</notification>
<notification name="VoiceNotAllowed">
- No tiene permiso para conectarse al chat de voz de [VOICE_CHANNEL_NAME].
+ No tienes permiso para conectarte al chat de voz de [VOICE_CHANNEL_NAME].
</notification>
<notification name="VoiceCallGenericError">
- Ha ocurrido un error intentando conectarle al [VOICE_CHANNEL_NAME]. Por favor, inténtelo más tarde.
+ Se ha producido un error al intentar conectarte al [VOICE_CHANNEL_NAME]. Por favor, inténtalo más tarde.
</notification>
<notification name="ServerVersionChanged">
- La región en la que ha entrado se ejecuta en un simulador con una versión diferente. Pulse este mensaje para ver más detalles.
+ Acabas de entrar en una región que usa un servidor con una versión distinta, y esto puede influir en el funcionamiento. [[URL] Ver las notas de desarrollo].
+ </notification>
+ <notification name="UnsupportedCommandSLURL">
+ No se admite el formato de la SLurl que has pulsado.
</notification>
- <notification name="UnableToOpenCommandURL">
- No puede abrirse desde este navegador la URL que ha pulsado.
+ <notification name="BlockedSLURL">
+ Por tu seguridad, se ha bloqueado una SLurl recibida de un navegador no de confianza.
+ </notification>
+ <notification name="ThrottledSLURL">
+ En muy poco tiempo, se han recibido muchas SLurls desde un navegador que no es de confianza.
+Por tu seguridad, serán bloqueadas durante unos segundos.
+ </notification>
+ <notification name="IMToast">
+ [MESSAGE]
+ <form name="form">
+ <button name="respondbutton" text="Responder"/>
+ </form>
+ </notification>
+ <notification name="ConfirmCloseAll">
+ ¿Seguro que quieres cerrar todos los MI?
+ <usetemplate ignoretext="Confirmar antes de cerrar todos los MIs" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="AttachmentSaved">
+ Se ha guardado el adjunto.
+ </notification>
+ <notification name="UnableToFindHelpTopic">
+ No se ha podido encontrar un tema de ayuda para este elemento.
+ </notification>
+ <notification name="ObjectMediaFailure">
+ Error del servidor: fallo en la actualización u obtención de los media.
+&apos;[ERROR]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TextChatIsMutedByModerator">
+ Un moderador ha silenciado tu chat de texto.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="VoiceIsMutedByModerator">
+ Un moderador ha silenciado tu voz.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearTeleportHistory">
+ ¿Estás seguro de que quieres borrar tu historial de teleportes?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="BottomTrayButtonCanNotBeShown">
+ El botón elegido no se puede mostrar correctamente.
+Se mostrará cuando haya suficiente espacio.
+ </notification>
+ <notification name="ShareNotification">
+ Selecciona los residentes con quienes deseas compartir.
+ </notification>
+ <notification name="ShareItemsConfirmation">
+ ¿Estás seguro de que quieres compartir los elementos siguientes?
+
+[ITEMS]
+
+Con los siguientes residentes:
+
+[RESIDENTS]
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ItemsShared">
+ Los elementos se han compartido correctamente.
+ </notification>
+ <notification name="DeedToGroupFail">
+ Error de transferencia a grupo.
+ </notification>
+ <notification name="AvatarRezNotification">
+ ( [EXISTENCE] segundos vivo)
+El avatar &apos;[NAME]&apos; tardó [TIME] segundos en dejar de aparecer como nube.
+ </notification>
+ <notification name="AvatarRezSelfBakedDoneNotification">
+ ( [EXISTENCE] segundos vivo)
+Has terminado de texturizar tu vestuario en [TIME] segundos.
+ </notification>
+ <notification name="AvatarRezSelfBakedUpdateNotification">
+ ( [EXISTENCE] segundos vivo)
+Has enviado una actualización de tu apariencia después de [TIME] segundos.
+[STATUS]
+ </notification>
+ <notification name="AvatarRezCloudNotification">
+ ( [EXISTENCE] segundos vivo)
+El avatar &apos;[NAME]&apos; se convirtió en nube.
+ </notification>
+ <notification name="AvatarRezArrivedNotification">
+ ( [EXISTENCE] segundos vivo)
+Apareció el avatar &apos;[NAME]&apos;.
+ </notification>
+ <notification name="AvatarRezLeftCloudNotification">
+ ( [EXISTENCE] segundos vivo)
+El avatar &apos;[NAME]&apos; salió al cabo de [TIME] segundos como nube.
+ </notification>
+ <notification name="AvatarRezEnteredAppearanceNotification">
+ ( [EXISTENCE] segundos vivo)
+El avatar &apos;[NAME]&apos; ya está en modo de edición de apariencia.
+ </notification>
+ <notification name="AvatarRezLeftAppearanceNotification">
+ ( [EXISTENCE] segundos vivo)
+El avatar &apos;[NAME]&apos; desactivó el modo de apariencia.
+ </notification>
+ <notification name="NoConnect">
+ Tenemos problemas de conexión con [PROTOCOL] [HOSTID].
+Comprueba la configuración de la red y del servidor de seguridad.
+ <form name="form">
+ <button name="OK" text="OK"/>
+ </form>
+ </notification>
+ <notification name="NoVoiceConnect">
+ Tenemos problemas de conexión con tu servidor de voz:
+
+[HOSTID]
+
+No podrás establecer comunicaciones de voz.
+Comprueba la configuración de la red y del servidor de seguridad.
+ <form name="form">
+ <button name="OK" text="OK"/>
+ </form>
+ </notification>
+ <notification name="AvatarRezLeftNotification">
+ ( [EXISTENCE] segundos vivo)
+El avatar &apos;[NAME]&apos; ya estaba totalmente cargado al salir.
+ </notification>
+ <notification name="AvatarRezSelfBakeNotification">
+ ( [EXISTENCE] segundos vivo)
+Has cargado una textura obtenida mediante bake de [RESOLUTION] para &apos;[BODYREGION]&apos; después de [TIME] segundos.
+ </notification>
+ <notification name="ConfirmLeaveCall">
+ ¿Estás seguro de que deseas salir de esta multiconferencia?
+ <usetemplate ignoretext="Confirma antes de salir de la llamada" name="okcancelignore" notext="No" yestext="Sí"/>
+ </notification>
+ <notification name="ConfirmMuteAll">
+ Has seleccionado silenciar a todos los participantes en una multiconferencia.
+Si lo haces, todos los residentes que se unan posteriormente a la llamada también serán silenciados, incluso cuando abandones la conferencia.
+
+¿Deseas silenciar a todos?
+ <usetemplate ignoretext="Confirma que deseas silenciar a todos los participantes en una multiconferencia." name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<global name="UnsupportedCPU">
- - La velocidad de su CPU no cumple los requerimientos mínimos.
+ - La velocidad de tu CPU no cumple los requerimientos mínimos.
</global>
<global name="UnsupportedGLRequirements">
- Parece que no tiene los requerimientos de hardware apropiados para [APP_NAME]. [APP_NAME] requiere una tarjeta gráfica OpenGL que admita texturas múltiples (&apos;multitexture support&apos;). Si la tiene, compruebe que tiene los últimos drivers para su tarjeta gráfica, así como los últimos parches y &apos;service packs&apos; para su sistema operativo.
+ Parece que no tienes el hardware apropiado para [APP_NAME]. [APP_NAME] requiere una tarjeta gráfica OpenGL que admita texturas múltiples (&apos;multitexture support&apos;). Si la tienes, comprueba que tienes los últimos &apos;drivers&apos; para tu tarjeta gráfica, así como los últimos parches y &apos;service packs&apos; para tu sistema operativo.
-Si los problemas persisten, por favor, acuda a: http://www.secondlife.com/support
+Si los problemas persisten, por favor, acude a [SUPPORT_SITE].
</global>
<global name="UnsupportedCPUAmount">
796
@@ -3044,15 +2784,13 @@ Si los problemas persisten, por favor, acuda a: http://www.secondlife.com/suppor
510
</global>
<global name="UnsupportedGPU">
- - Su tarjeta gráfica no cumple los requerimientos mínimos.
+ - Tu tarjeta gráfica no cumple los requerimientos mínimos.
</global>
<global name="UnsupportedRAM">
- - La memoria de su sistema no cumple los requerimientos mínimos.
- </global>
- <global name="PermYes">
- Sí
+ - La memoria de tu sistema no cumple los requerimientos mínimos.
</global>
- <global name="PermNo">
- No
+ <global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
+ Si posees un terreno, puedes hacerlo tu Base.
+También puedes buscar en el Mapa lugares marcados como &quot;Puntos de Información&quot;.
</global>
</notifications>
diff --git a/indra/newview/skins/default/xui/es/outfit_accordion_tab.xml b/indra/newview/skins/default/xui/es/outfit_accordion_tab.xml
new file mode 100644
index 0000000000..bac885e5d8
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/outfit_accordion_tab.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: mantipov: this xml is intended to be used inside panel_outfits_list.xml for each outfit folder-->
+<!-- All accordion tabs in the My Appearance/My Outfits panel will be created from this one at runtume-->
+<accordion_tab name="Mockup Tab" title="Mockup Tab"/>
diff --git a/indra/newview/skins/default/xui/es/panel_active_object_row.xml b/indra/newview/skins/default/xui/es/panel_active_object_row.xml
new file mode 100644
index 0000000000..8d4fadb101
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_active_object_row.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_activeim_row">
+ <string name="unknown_obj">
+ Objeto desconocido
+ </string>
+ <text name="object_name">
+ Objeto sin nombre
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/es/panel_adhoc_control_panel.xml
new file mode 100644
index 0000000000..c64a93e0e5
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_adhoc_control_panel.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="vertical_stack">
+ <layout_panel name="call_btn_panel">
+ <button label="Llamar" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Colgar" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Controles de la voz" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/es/panel_avatar_list_item.xml
new file mode 100644
index 0000000000..e1ffc14823
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_avatar_list_item.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="avatar_list_item">
+ <string name="FormatSeconds">
+ [COUNT] seg.
+ </string>
+ <string name="FormatMinutes">
+ [COUNT] min.
+ </string>
+ <string name="FormatHours">
+ [COUNT] h.
+ </string>
+ <string name="FormatDays">
+ [COUNT] d.
+ </string>
+ <string name="FormatWeeks">
+ [COUNT] sem.
+ </string>
+ <string name="FormatMonths">
+ [COUNT] mes/es
+ </string>
+ <string name="FormatYears">
+ [COUNT] año/s
+ </string>
+ <text name="avatar_name" value="Desconocido"/>
+ <button name="profile_btn" tool_tip="Ver el perfil"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/es/panel_block_list_sidetray.xml
new file mode 100644
index 0000000000..cddbad1195
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_block_list_sidetray.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="block_list_panel">
+ <text name="title_text">
+ Lista de ignorados
+ </text>
+ <scroll_list name="blocked" tool_tip="Lista de los residentes ignorados actualmente"/>
+ <button label="Ignorar al residente..." label_selected="Ignorar al residente..." name="Block resident..." tool_tip="Elige a un Residente para ignorarle"/>
+ <button label="Ignorar objetos según el nombre..." label_selected="Ignorar objetos según el nombre..." name="Block object by name..."/>
+ <button label="No ignorar" label_selected="No ignorar" name="Unblock" tool_tip="Quita al Residente o al objeto de la lista de ignorados"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/es/panel_body_parts_list_item.xml
new file mode 100644
index 0000000000..de764d8025
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_body_parts_list_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="wearable_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_bodyparts_list_button_bar.xml b/indra/newview/skins/default/xui/es/panel_bodyparts_list_button_bar.xml
new file mode 100644
index 0000000000..66ae7d868b
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_bodyparts_list_button_bar.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="clothing_list_button_bar_panel">
+ <button label="Cambiar" name="switch_btn"/>
+ <button label="Comprar &gt;" name="bodyparts_shop_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_bottomtray.xml b/indra/newview/skins/default/xui/es/panel_bottomtray.xml
new file mode 100644
index 0000000000..5ea09ed795
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_bottomtray.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray">
+ <string name="SpeakBtnToolTip" value="Activa/Desactiva el micrófono"/>
+ <string name="VoiceControlBtnToolTip" value="Muestra/Oculta el panel del control de voz"/>
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="speak_panel">
+ <talk_button name="talk">
+ <speak_button label="Hablar" label_selected="Hablar" name="speak_btn"/>
+ </talk_button>
+ </layout_panel>
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="Gestos" name="Gesture" tool_tip="Muestra/Oculta los gestos"/>
+ </layout_panel>
+ <layout_panel name="movement_panel">
+ <button label="Moverme" name="movement_btn" tool_tip="Muestra/Oculta los controles del movimiento"/>
+ </layout_panel>
+ <layout_panel name="cam_panel">
+ <button label="Visión" name="camera_btn" tool_tip="Muestra/Oculta los controles de la cámara"/>
+ </layout_panel>
+ <layout_panel name="snapshot_panel">
+ <button label="" name="snapshots" tool_tip="Hacer una foto"/>
+ </layout_panel>
+ <layout_panel name="sidebar_btn_panel">
+ <button label="Barra lateral" name="sidebar_btn" tool_tip="Muestra/Oculta la barra lateral"/>
+ </layout_panel>
+ <layout_panel name="build_btn_panel">
+ <button label="Construir" name="build_btn" tool_tip="Muestra/Oculta las herramientas de construcción"/>
+ </layout_panel>
+ <layout_panel name="search_btn_panel">
+ <button label="Buscar" name="search_btn" tool_tip="Muestra/Oculta la búsqueda"/>
+ </layout_panel>
+ <layout_panel name="world_map_btn_panel">
+ <button label="Mapa" name="world_map_btn" tool_tip="Muestra/Oculta el mapa del mundo"/>
+ </layout_panel>
+ <layout_panel name="mini_map_btn_panel">
+ <button label="Minimapa" name="mini_map_btn" tool_tip="Muestra/Oculta el minimapa"/>
+ </layout_panel>
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Conversaciones"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="Notificaciones"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/es/panel_bottomtray_lite.xml
new file mode 100644
index 0000000000..8d1b84a5fd
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_bottomtray_lite.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray_lite">
+ <layout_stack name="toolbar_stack_lite">
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="Gestos" name="Gesture" tool_tip="Muestra/Oculta los gestos"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_classified_info.xml b/indra/newview/skins/default/xui/es/panel_classified_info.xml
new file mode 100644
index 0000000000..35fe174970
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_classified_info.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_classified_info">
+ <panel.string name="l$_price">
+ [PRICE] L$
+ </panel.string>
+ <panel.string name="click_through_text_fmt">
+ [TELEPORT] teleportes, [MAP] mapa, [PROFILE] perfil
+ </panel.string>
+ <panel.string name="date_fmt">
+ [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt]
+ </panel.string>
+ <panel.string name="auto_renew_on">
+ Activada
+ </panel.string>
+ <panel.string name="auto_renew_off">
+ Desactivada
+ </panel.string>
+ <text name="title" value="Información del clasificado"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text_editor name="classified_name" value="[name]"/>
+ <text name="classified_location_label" value="Localización:"/>
+ <text_editor name="classified_location" value="[loading...]"/>
+ <text name="content_type_label" value="Tipo de contenido:"/>
+ <text_editor name="content_type" value="[content type]"/>
+ <text name="category_label" value="Categoría:"/>
+ <text_editor name="category" value="[category]"/>
+ <text name="creation_date_label" value="Fecha de creación:"/>
+ <text_editor name="creation_date" tool_tip="Fecha de creación" value="[date]"/>
+ <text name="price_for_listing_label" value="Precio por publicarlo:"/>
+ <text_editor name="price_for_listing" tool_tip="Precio por publicarlo." value="[price]"/>
+ <layout_stack name="descr_stack">
+ <layout_panel name="clickthrough_layout_panel">
+ <text name="click_through_label" value="Clics:"/>
+ <text_editor name="click_through_text" tool_tip="Información sobre Click through" value="[clicks]"/>
+ </layout_panel>
+ <layout_panel name="price_layout_panel">
+ <text name="auto_renew_label" value="Renovación:"/>
+ <text name="auto_renew" value="Activada"/>
+ </layout_panel>
+ <layout_panel name="descr_layout_panel">
+ <text name="classified_desc_label" value="Descripción:"/>
+ <text_editor name="classified_desc" value="[description]"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <button label="Teleportar" name="teleport_btn"/>
+ <button label="Mapa" name="show_on_map_btn"/>
+ <button label="Editar" name="edit_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_clothing_list_button_bar.xml b/indra/newview/skins/default/xui/es/panel_clothing_list_button_bar.xml
new file mode 100644
index 0000000000..d3b3d31bd9
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_clothing_list_button_bar.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="clothing_list_button_bar_panel">
+ <button label="Añadir +" name="add_btn"/>
+ <button label="Comprar &gt;" name="clothing_shop_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_clothing_list_item.xml b/indra/newview/skins/default/xui/es/panel_clothing_list_item.xml
new file mode 100644
index 0000000000..de764d8025
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_clothing_list_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="wearable_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_cof_wearables.xml b/indra/newview/skins/default/xui/es/panel_cof_wearables.xml
new file mode 100644
index 0000000000..a2994894c1
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_cof_wearables.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="cof_wearables">
+ <accordion name="cof_wearables_accordion">
+ <accordion_tab name="tab_attachments" title="Adjuntos"/>
+ <accordion_tab name="tab_clothing" title="Ropa"/>
+ <accordion_tab name="tab_body_parts" title="Partes del cuerpo"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/es/panel_deletable_wearable_list_item.xml
new file mode 100644
index 0000000000..91d90a5660
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_deletable_wearable_list_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="deletable_wearable_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/es/panel_dummy_clothing_list_item.xml
new file mode 100644
index 0000000000..6af84de0c7
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_dummy_clothing_list_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="dummy_clothing_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_alpha.xml b/indra/newview/skins/default/xui/es/panel_edit_alpha.xml
new file mode 100644
index 0000000000..3f238da9d0
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_alpha.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_alpha_panel">
+ <panel name="avatar_alpha_color_panel">
+ <texture_picker label="Alfa inferior" name="Lower Alpha" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Alfa superior" name="Upper Alpha" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Alfa de la cabeza" name="Head Alpha" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Alfa de los ojos" name="Eye Alpha" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Alfa del pelo" name="Hair Alpha" tool_tip="Pulsa para elegir una imagen"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_classified.xml b/indra/newview/skins/default/xui/es/panel_edit_classified.xml
new file mode 100644
index 0000000000..6d53b401c0
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_classified.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Editar el clasificado" name="panel_edit_classified">
+ <panel.string name="location_notice">
+ (se actualizará tras guardarlo)
+ </panel.string>
+ <string name="publish_label">
+ Publicar
+ </string>
+ <string name="save_label">
+ Guardar
+ </string>
+ <text name="title">
+ Editar el clasificado
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="snapshot_panel">
+ <icon label="" name="edit_icon" tool_tip="Pulsa para elegir una imagen"/>
+ </panel>
+ <text name="Name:">
+ Título:
+ </text>
+ <text name="description_label">
+ Descripción:
+ </text>
+ <text name="location_label">
+ Localización:
+ </text>
+ <text name="classified_location">
+ cargando...
+ </text>
+ <button label="Configurar en esta posición" name="set_to_curr_location_btn"/>
+ <text name="category_label" value="Categoría:"/>
+ <text name="content_type_label" value="Tipo de contenido:"/>
+ <icons_combo_box label="Contenido general" name="content_type">
+ <icons_combo_box.item label="Contenido moderado" name="mature_ci" value="Moderado"/>
+ <icons_combo_box.item label="Contenido general" name="pg_ci" value="General"/>
+ </icons_combo_box>
+ <text name="price_for_listing_label" value="Precio por publicarlo:"/>
+ <spinner label="L$" name="price_for_listing" tool_tip="Precio por publicarlo." value="50"/>
+ <check_box label="Renovar automáticamente cada semana" name="auto_renew"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button label="[LABEL]" name="save_changes_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_eyes.xml b/indra/newview/skins/default/xui/es/panel_edit_eyes.xml
new file mode 100644
index 0000000000..29a416f698
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_eyes.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_eyes_panel">
+ <panel name="avatar_eye_color_panel">
+ <texture_picker label="Iris" name="Iris" tool_tip="Pulsa para elegir una imagen"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="eyes_main_tab" title="Ojos"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_gloves.xml b/indra/newview/skins/default/xui/es/panel_edit_gloves.xml
new file mode 100644
index 0000000000..684a35a830
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_gloves.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_gloves_panel">
+ <panel name="avatar_gloves_color_panel">
+ <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="gloves_main_tab" title="Guantes"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_hair.xml b/indra/newview/skins/default/xui/es/panel_edit_hair.xml
new file mode 100644
index 0000000000..25af1ea8cb
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_hair.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_hair_panel">
+ <panel name="avatar_hair_color_panel">
+ <texture_picker label="Textura" name="Texture" tool_tip="Pulsa para elegir una imagen"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="hair_color_tab" title="Color"/>
+ <accordion_tab name="hair_style_tab" title="Estilo"/>
+ <accordion_tab name="hair_eyebrows_tab" title="Cejas"/>
+ <accordion_tab name="hair_facial_tab" title="Facial"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_jacket.xml b/indra/newview/skins/default/xui/es/panel_edit_jacket.xml
new file mode 100644
index 0000000000..347107d746
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_jacket.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_jacket_panel">
+ <panel name="avatar_jacket_color_panel">
+ <texture_picker label="Tejido superior" name="Upper Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Tejido inferior" name="Lower Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="jacket_main_tab" title="Chaqueta"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_pants.xml b/indra/newview/skins/default/xui/es/panel_edit_pants.xml
new file mode 100644
index 0000000000..e765702343
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_pants.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_pants_panel">
+ <panel name="avatar_pants_color_panel">
+ <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="pants_main_tab" title="Pantalones"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_pick.xml b/indra/newview/skins/default/xui/es/panel_edit_pick.xml
new file mode 100644
index 0000000000..f8a03d2302
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_pick.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Editar el destacado" name="panel_edit_pick">
+ <panel.string name="location_notice">
+ (se actualizará tras guardarlo)
+ </panel.string>
+ <text name="title">
+ Editar el destacado
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <icon label="" name="edit_icon" tool_tip="Pulsa para elegir una imagen"/>
+ <text name="Name:">
+ Título:
+ </text>
+ <text name="description_label">
+ Descripción:
+ </text>
+ <text name="location_label">
+ Posición:
+ </text>
+ <text name="pick_location">
+ cargando...
+ </text>
+ <button label="Configurar en mi posición" name="set_to_curr_location_btn"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button label="Guardar" name="save_changes_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_profile.xml b/indra/newview/skins/default/xui/es/panel_edit_profile.xml
index c12dd8d58c..e7bd7aba17 100644
--- a/indra/newview/skins/default/xui/es/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/es/panel_edit_profile.xml
@@ -1,45 +1,51 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="edit_profile_panel">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="AcctTypeResident"
- value="Residente" />
- <string name="AcctTypeTrial"
- value="Prueba" />
- <string name="AcctTypeCharterMember"
- value="Miembro fundador" />
- <string name="AcctTypeEmployee"
- value="Empleado de Linden Lab" />
- <string name="PaymentInfoUsed"
- value="Ha usado una forma de pago" />
- <string name="PaymentInfoOnFile"
- value="Hay infor. de la forma de pago" />
- <string name="NoPaymentInfoOnFile"
- value="Sin infor. de la forma de pago" />
- <string name="AgeVerified"
- value="Edad verificada" />
- <string name="NotAgeVerified"
- value="Edad no verificada" />
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=es
- </string>
- <panel name="scroll_content_panel">
- <panel name="data_panel" >
- <panel name="lifes_images_panel">
- <panel name="second_life_image_panel">
- <text name="second_life_photo_title_text">
- [SECOND_LIFE]:
- </text>
- </panel>
- </panel>
- <text name="title_partner_text" value="Compañero/a:"/>
- <panel name="partner_data_panel">
- <text name="partner_text" value="[FIRST] [LAST]"/>
- </panel>
- <text name="text_box3">
- Mensaje en el estado ocupado:
- </text>
- </panel>
- </panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Editar el perfil" name="edit_profile_panel">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <string name="AcctTypeResident" value="Residente"/>
+ <string name="AcctTypeTrial" value="Prueba"/>
+ <string name="AcctTypeCharterMember" value="Miembro fundador"/>
+ <string name="AcctTypeEmployee" value="Empleado de Linden Lab"/>
+ <string name="PaymentInfoUsed" value="Ha usado una forma de pago"/>
+ <string name="PaymentInfoOnFile" value="Hay infor. de la forma de pago"/>
+ <string name="NoPaymentInfoOnFile" value="Sin infor. de la forma de pago"/>
+ <string name="AgeVerified" value="Edad verificada"/>
+ <string name="NotAgeVerified" value="Edad no verificada"/>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=es
+ </string>
+ <string name="no_partner_text" value="Ninguno"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="data_panel">
+ <panel name="lifes_images_panel">
+ <icon label="" name="2nd_life_edit_icon" tool_tip="Pulsa para elegir una imagen"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <text name="real_world_photo_title_text" value="Mundo real:"/>
+ </panel>
+ <icon label="" name="real_world_edit_icon" tool_tip="Pulsa para elegir una imagen"/>
+ <text name="title_homepage_text">
+ Web:
+ </text>
+ <check_box label="Mostrarme en los resultados de la búsqueda" name="show_in_search_checkbox"/>
+ <text name="title_acc_status_text" value="Mi cuenta:"/>
+ <text_editor name="acc_status_text" value="Residente. No ha aportado información de pago."/>
+ <text name="my_account_link" value="[[URL] Ir a mi Panel de Control]"/>
+ <text name="title_partner_text" value="Mi compañero/a:"/>
+ <panel name="partner_data_panel">
+ <name_box initial_value="(obteniendo)" name="partner_text"/>
+ </panel>
+ <text name="partner_edit_link" value="[[URL] Editar]"/>
+ </panel>
+ </panel>
+ </scroll_container>
+ <panel name="profile_me_buttons_panel">
+ <button label="Guardar cambios" name="save_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_shape.xml b/indra/newview/skins/default/xui/es/panel_edit_shape.xml
new file mode 100644
index 0000000000..368be35ed9
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_shape.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shape_panel">
+ <string name="meters">
+ Metros
+ </string>
+ <string name="feet">
+ Pies
+ </string>
+ <string name="height">
+ Altura:
+ </string>
+ <text name="avatar_height"/>
+ <panel label="Camisa" name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shape_body_tab" title="Cuerpo"/>
+ <accordion_tab name="shape_head_tab" title="Cabeza"/>
+ <accordion_tab name="shape_eyes_tab" title="Ojos"/>
+ <accordion_tab name="shape_ears_tab" title="Orejas"/>
+ <accordion_tab name="shape_nose_tab" title="Nariz"/>
+ <accordion_tab name="shape_mouth_tab" title="Boca"/>
+ <accordion_tab name="shape_chin_tab" title="Barbilla"/>
+ <accordion_tab name="shape_torso_tab" title="Torso"/>
+ <accordion_tab name="shape_legs_tab" title="Piernas"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_shirt.xml b/indra/newview/skins/default/xui/es/panel_edit_shirt.xml
new file mode 100644
index 0000000000..f763e1b18d
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_shirt.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shirt_panel">
+ <panel name="avatar_shirt_color_panel">
+ <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shirt_main_tab" title="Camisa"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_shoes.xml b/indra/newview/skins/default/xui/es/panel_edit_shoes.xml
new file mode 100644
index 0000000000..70f2027398
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_shoes.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shoes_panel">
+ <panel name="avatar_shoes_color_panel">
+ <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shoes_main_tab" title="Zapatos"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_skin.xml b/indra/newview/skins/default/xui/es/panel_edit_skin.xml
new file mode 100644
index 0000000000..501ecfb4de
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_skin.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skin_panel">
+ <panel name="avatar_skin_color_panel">
+ <texture_picker label="Tatuajes de la cabeza" name="Head Tattoos" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Tatuajes superiores" name="Upper Tattoos" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Tatuajes inferiores" name="Lower Tattoos" tool_tip="Pulsa para elegir una imagen"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skin_color_tab" title="Color de la piel"/>
+ <accordion_tab name="skin_face_tab" title="Detalles faciales"/>
+ <accordion_tab name="skin_makeup_tab" title="Maquillaje"/>
+ <accordion_tab name="skin_body_tab" title="Detalles del cuerpo"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_skirt.xml b/indra/newview/skins/default/xui/es/panel_edit_skirt.xml
new file mode 100644
index 0000000000..2c7196642c
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_skirt.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skirt_panel">
+ <panel name="avatar_skirt_color_panel">
+ <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skirt_main_tab" title="Falda"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_socks.xml b/indra/newview/skins/default/xui/es/panel_edit_socks.xml
new file mode 100644
index 0000000000..28423eaf61
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_socks.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_socks_panel">
+ <panel name="avatar_socks_color_panel">
+ <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="socks_main_tab" title="Calcetines"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/es/panel_edit_tattoo.xml
new file mode 100644
index 0000000000..8776dd6c10
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_tattoo.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_tattoo_panel">
+ <panel name="avatar_tattoo_color_panel">
+ <texture_picker label="Tatuaje de la cabeza" name="Head Tattoo" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Tatuaje superior" name="Upper Tattoo" tool_tip="Pulsa para elegir una imagen"/>
+ <texture_picker label="Tatuaje inferior" name="Lower Tattoo" tool_tip="Pulsa para elegir una imagen"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_underpants.xml b/indra/newview/skins/default/xui/es/panel_edit_underpants.xml
new file mode 100644
index 0000000000..6c82bcfedf
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_underpants.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_underpants_panel">
+ <panel name="avatar_underpants_color_panel">
+ <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="underpants_main_tab" title="Ropa interior"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/es/panel_edit_undershirt.xml
new file mode 100644
index 0000000000..412bdceddf
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_undershirt.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_undershirt_panel">
+ <panel name="avatar_undershirt_color_panel">
+ <texture_picker label="Tela" name="Fabric" tool_tip="Pulsa para elegir una imagen"/>
+ <color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="undershirt_main_tab" title="Camiseta"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_edit_wearable.xml b/indra/newview/skins/default/xui/es/panel_edit_wearable.xml
new file mode 100644
index 0000000000..176f122dc4
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_edit_wearable.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Se puede poner" name="panel_edit_wearable">
+ <string name="edit_shape_title">
+ Modificando la anatomía
+ </string>
+ <string name="edit_skin_title">
+ Modificando la piel
+ </string>
+ <string name="edit_hair_title">
+ Modificando el pelo
+ </string>
+ <string name="edit_eyes_title">
+ Modificando los ojos
+ </string>
+ <string name="edit_shirt_title">
+ Modificando la camisa
+ </string>
+ <string name="edit_pants_title">
+ Modificando los pantalones
+ </string>
+ <string name="edit_shoes_title">
+ Modificando los zapatos
+ </string>
+ <string name="edit_socks_title">
+ Modificando los calcetines
+ </string>
+ <string name="edit_jacket_title">
+ Modificando la chaqueta
+ </string>
+ <string name="edit_skirt_title">
+ Modificando la falda
+ </string>
+ <string name="edit_gloves_title">
+ Modificando los guantes
+ </string>
+ <string name="edit_undershirt_title">
+ Modificando la camiseta
+ </string>
+ <string name="edit_underpants_title">
+ Modificando la ropa interior
+ </string>
+ <string name="edit_alpha_title">
+ Modificando la capa Alfa
+ </string>
+ <string name="edit_tattoo_title">
+ Modificando los tatuajes
+ </string>
+ <string name="shape_desc_text">
+ Anatomía:
+ </string>
+ <string name="skin_desc_text">
+ Piel:
+ </string>
+ <string name="hair_desc_text">
+ Pelo:
+ </string>
+ <string name="eyes_desc_text">
+ Ojos:
+ </string>
+ <string name="shirt_desc_text">
+ Camisa:
+ </string>
+ <string name="pants_desc_text">
+ Pantalones:
+ </string>
+ <string name="shoes_desc_text">
+ Zapatos:
+ </string>
+ <string name="socks_desc_text">
+ Calcetines:
+ </string>
+ <string name="jacket_desc_text">
+ Chaqueta:
+ </string>
+ <string name="skirt_desc_text">
+ Falda:
+ </string>
+ <string name="gloves_desc_text">
+ Guantes:
+ </string>
+ <string name="undershirt_desc_text">
+ Camiseta:
+ </string>
+ <string name="underpants_desc_text">
+ Ropa interior:
+ </string>
+ <string name="alpha_desc_text">
+ Capa alfa:
+ </string>
+ <string name="tattoo_desc_text">
+ Tatuaje:
+ </string>
+ <text name="edit_wearable_title" value="Modificando la anatomía"/>
+ <panel label="Camisa" name="wearable_type_panel">
+ <text name="description_text" value="Anatomía:"/>
+ <radio_group name="sex_radio">
+ <radio_item label="" name="sex_male" tool_tip="Varón" value="1"/>
+ <radio_item label="" name="sex_female" tool_tip="Mujer" value="0"/>
+ </radio_group>
+ <icon name="male_icon" tool_tip="Varón"/>
+ <icon name="female_icon" tool_tip="Mujer"/>
+ </panel>
+ <panel name="button_panel">
+ <button label="Guardar como" name="save_as_button"/>
+ <button label="Revertir" name="revert_button"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_friends.xml b/indra/newview/skins/default/xui/es/panel_friends.xml
index ea5c7d1e4f..e1cac7c2c3 100644
--- a/indra/newview/skins/default/xui/es/panel_friends.xml
+++ b/indra/newview/skins/default/xui/es/panel_friends.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="friends">
<string name="Multiple">
- Varios amigos...
+ Varios amigos
</string>
<scroll_list name="friend_list" tool_tip="Para seleccionar a varios amigos, mantenga pulsado Ctrl o Mays. mientras les va pulsando.">
<column name="icon_online_status" tool_tip="Estado de conexión"/>
@@ -13,8 +13,8 @@
</scroll_list>
<button label="MI/Llamada" name="im_btn" tool_tip="Abrir sesión de mensajes instantáneos"/>
<button label="Perfil" name="profile_btn" tool_tip="Mostrar la imagen, los grupos, y otra información"/>
- <button label="Teleportar..." name="offer_teleport_btn" tool_tip="Ofrecer a este amigo teleportarle hasta su posición"/>
- <button label="Pagar..." name="pay_btn" tool_tip="Dar dólares Linden (L$) a este amigo"/>
- <button label="Quitar..." name="remove_btn" tool_tip="Quitar a esta persona de su lista de amigos"/>
- <button label="Añadir..." name="add_btn" tool_tip="Ofrecer ser mi amigo a un residente"/>
+ <button label="Teleporte" name="offer_teleport_btn" tool_tip="Ofrecer a este amigo teleportarle hasta su posición"/>
+ <button label="Pagar" name="pay_btn" tool_tip="Dar dólares Linden (L$) a este amigo"/>
+ <button label="Quitar" name="remove_btn" tool_tip="Quitar a esta persona de su lista de amigos"/>
+ <button label="Añadir" name="add_btn" tool_tip="Ofrecer amistad a un Residente"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_group_control_panel.xml b/indra/newview/skins/default/xui/es/panel_group_control_panel.xml
new file mode 100644
index 0000000000..b398293175
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_group_control_panel.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="vertical_stack">
+ <layout_panel name="group_info_btn_panel">
+ <button label="Perfil del grupo" name="group_info_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Llamar al grupo" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Colgar" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Abrir los controles de la voz" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_group_general.xml b/indra/newview/skins/default/xui/es/panel_group_general.xml
index 4fd5685b7d..c4f17ab6dc 100644
--- a/indra/newview/skins/default/xui/es/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/es/panel_group_general.xml
@@ -1,72 +1,58 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="General" name="general_tab">
- <string name="help_text">
- La pestaña General contiene información global de este grupo, la lista de propietarios y miembros visibles, las preferencias generales del grupo, y las opciones de los miembros.
+ <panel.string name="help_text">
+ La pestaña General tiene información general de este grupo, una lista de sus miembros, las preferencias generales del grupo y las opciones de sus miembros.
-Ponga su ratón sobre las opciones para más información.
- </string>
- <string name="group_info_unchanged">
- La información general del grupo ha cambiado.
- </string>
- <button label="?" label_selected="?" name="help_button"/>
- <line_editor label="Escriba aquí el nombre de su nuevo grupo" name="group_name_editor"/>
- <text name="group_name">
- Escriba aquí el nombre de su nuevo grupo
- </text>
- <text name="prepend_founded_by">
- Creado por
- </text>
- <text name="founder_name">
- (esperando)
- </text>
- <text name="group_charter_label">
- Carta del grupo
- </text>
- <texture_picker label="Emblema del grupo" name="insignia" tool_tip="Pulse para elegir una imagen"/>
+Deja el cursor sobre las opciones para ver más ayuda.
+ </panel.string>
+ <panel.string name="group_info_unchanged">
+ Ha cambiado la información general del grupo
+ </panel.string>
+ <panel.string name="incomplete_member_data_str">
+ Recuperando los datos de los miembros
+ </panel.string>
+ <panel name="group_info_top">
+ <texture_picker label="" name="insignia" tool_tip="Pulsa para elegir una imagen"/>
+ <text name="prepend_founded_by">
+ Fundador:
+ </text>
+ <name_box initial_value="(obteniendo)" name="founder_name"/>
+ <text name="join_cost_text">
+ Gratis
+ </text>
+ <button label="¡ENTRA AHORA!" name="btn_join"/>
+ </panel>
<text_editor name="charter">
Carta del grupo
</text_editor>
- <button label="Entrar (0 L$)" label_selected="Entrar (0 L$)" name="join_button"/>
- <button label="Ver en detalle" label_selected="Ver en detalle" name="info_button"/>
- <text name="text_owners_and_visible_members">
- Propietarios y Miembros visibles
- </text>
- <text name="text_owners_are_shown_in_bold">
- (los propietarios aparecen en negrilla)
- </text>
<name_list name="visible_members">
- <name_list.columns label="Nombre del miembro" name="name" relwidth="0.40"/>
+ <name_list.columns label="Miembro" name="name" relwidth="0.40"/>
<name_list.columns label="Etiqueta" name="title" relwidth="0.25"/>
- <name_list.columns label="Última conexión" name="online" relwidth="0.35"/>
+ <name_list.columns label="Estado" name="status"/>
</name_list>
- <text name="text_group_preferences">
- Preferencias del grupo
+ <text name="my_group_settngs_label">
+ Yo
</text>
+ <text name="active_title_label">
+ Mi etiqueta:
+ </text>
+ <combo_box name="active_title" tool_tip="Configura la etiqueta que se verá sobre el nombre de tu avatar cuando tengas activo este grupo."/>
+ <check_box label="Recibir los avisos del grupo" name="receive_notices" tool_tip="Configura si quieres recibir avisos del grupo. Desmárcalo si este grupo te envía &apos;spam&apos;."/>
+ <check_box label="Mostrarlo en mi perfil" name="list_groups_in_profile" tool_tip="Configura si quieres que este grupo se vea en tu perfil"/>
<panel name="preferences_container">
- <check_box label="Mostrar en la búsqueda" name="show_in_group_list" tool_tip="Dejar que la gente vea este grupo en los resultados de la búsqueda."/>
- <check_box label="Inscripción libre" name="open_enrollement" tool_tip="Definir si se admiten al grupo nuevos miembros sin que sea preciso invitárseles."/>
- <check_box label="Cuota de inscripción:" name="check_enrollment_fee" tool_tip="Define si se requiere una cuota para entrar al grupo."/>
- <spinner width="60" left_delta="130" name="spin_enrollment_fee" tool_tip="Cuando está marcado &apos;Cuota de inscripción&apos;, los miembros nuevos deben pagar esta cuota para entrar al grupo."/>
- <combo_box bottom_delta="-38" width="150" name="group_mature_check" tool_tip="Establece si la información de su grupo es &apos;mature&apos;.">
- <combo_box.item name="select_mature" label="- Elegir Calificación -"/>
- <combo_box.item name="mature" label="Contenido &apos;Mature&apos;"/>
- <combo_box.item name="pg" label="Contenido &apos;PG&apos;"/>
+ <text name="group_settngs_label">
+ Grupo
+ </text>
+ <check_box label="Cualquiera puede entrar" name="open_enrollement" tool_tip="Configura si se permite la entrada de nuevos miembros sin ser invitados."/>
+ <check_box label="Cuota de entrada" name="check_enrollment_fee" tool_tip="Configura si hay que pagar una cuota para entrar al grupo"/>
+ <spinner label="L$" left_delta="130" name="spin_enrollment_fee" tool_tip="Si la opción Cuota de entrada está marcada, los nuevos miembros han de pagar esta cuota para entrar al grupo." width="60"/>
+ <combo_box bottom_delta="-38" name="group_mature_check" tool_tip="Establece si la información de su grupo es &apos;mature&apos;." width="150">
+ <combo_item name="select_mature">
+ - Elige la Calificación -
+ </combo_item>
+ <combo_box.item label="Contenido &apos;Mature&apos;" name="mature"/>
+ <combo_box.item label="Contenido &apos;PG&apos;" name="pg"/>
</combo_box>
- <panel name="title_container">
- <text name="active_title_label">
- Mi etiqueta activa
- </text>
- <combo_box name="active_title" tool_tip="Define la etiqueta que aparecerá sobre el nombre de su avatar cuando tenga activo este grupo."/>
- </panel>
- <check_box label="Recibir los avisos del grupo" name="receive_notices" tool_tip="Define si quiere recibir avisos de este grupo. Desmarque esto si el grupo le envía spam."/>
- <check_box label="Mostrar el grupo en mi perfil" name="list_groups_in_profile" tool_tip="Define si quiere que este grupo aparezca en su perfil."/>
+ <check_box initial_value="true" label="Mostrar en la búsqueda" name="show_in_group_list" tool_tip="Permite que la gente vea este grupo en los resultados de la búsqueda"/>
</panel>
- <string name="incomplete_member_data_str">
- Recuperando los datos de los miembros
- </string>
- <string name="confirm_group_create_str">
- Crear este grupo cuesta 100 L$.
-¿Está plena, absoluta, y TOTALMENTE seguro de que quiere gastarse 100 L$ para crear este grupo?
-Queda avisado de que si, en un plazo de 48 horas, no entra nadie al grupo, éste será disuelto, y el nombre no se podrá usar en el futuro.
- </string>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/es/panel_group_info_sidetray.xml
new file mode 100644
index 0000000000..872dfb13d7
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_group_info_sidetray.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Perfil del grupo" name="GroupInfo">
+ <panel.string name="default_needs_apply_text">
+ Hay cambios sin guardar
+ </panel.string>
+ <panel.string name="want_apply_text">
+ ¿Quieres guardar estos cambios?
+ </panel.string>
+ <panel.string name="group_join_btn">
+ Entrar ([AMOUNT] L$)
+ </panel.string>
+ <panel.string name="group_join_free">
+ Gratis
+ </panel.string>
+ <panel name="group_info_top">
+ <text name="group_name" value="(Cargando...)"/>
+ <line_editor label="Escribe aquí el nombre de tu nuevo grupo" name="group_name_editor"/>
+ </panel>
+ <layout_stack name="layout">
+ <layout_panel name="group_accordions">
+ <accordion name="groups_accordion">
+ <accordion_tab name="group_general_tab" title="General"/>
+ <accordion_tab name="group_roles_tab" title="Roles"/>
+ <accordion_tab name="group_notices_tab" title="Avisos"/>
+ <accordion_tab name="group_land_tab" title="Terreno/Bienes"/>
+ </accordion>
+ </layout_panel>
+ <layout_panel name="button_row">
+ <button label="Chat" name="btn_chat"/>
+ <button label="Llamar al grupo" name="btn_call" tool_tip="Llama a este grupo"/>
+ <button label="Guardar" label_selected="Guardar" name="btn_apply"/>
+ <button label="Crear un grupo" name="btn_create" tool_tip="Crea un grupo nuevo"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_group_invite.xml b/indra/newview/skins/default/xui/es/panel_group_invite.xml
index f66f0c473a..0d877f78f2 100644
--- a/indra/newview/skins/default/xui/es/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/es/panel_group_invite.xml
@@ -1,24 +1,27 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Invitar a un miembro" name="invite_panel" width="224">
- <text name="help_text" height="72" bottom_delta="-96" width="214">
- Puede seleccionar a varios residentes
-para invitarles a su grupo. Para
-empezar, pulse &apos;Abrir el selector de
-residentes&apos;.
+ <panel.string name="confirm_invite_owner_str">
+ ¿Está seguro de que quiere invitar a un nuevo propietario/s? ¡Esta acción es permanente!
+ </panel.string>
+ <panel.string name="loading">
+ (cargando...)
+ </panel.string>
+ <panel.string name="already_in_group">
+ Alguno de los Residentes que has elegido ya están en el grupo: no se les enviará la invitación.
+ </panel.string>
+ <text bottom_delta="-96" height="72" name="help_text" width="214">
+ Puedes elegir a varios Residentes para invitarles a tu grupo. Para empezar, pulsa &apos;Abrir el selector de residentes&apos;.
</text>
<button bottom_delta="-10" label="Abrir el selector de residentes" name="add_button" tool_tip=""/>
- <name_list height="156" bottom_delta="-160" name="invitee_list" tool_tip="Para seleccionar a varios residentes, mantenga pulsada la tecla Ctrl y vaya pulsando sus nombres."/>
- <button left_delta="-7" width="214" label="Eliminar de la lista a los seleccionados" name="remove_button" tool_tip="Elimina los residentes seleccionados de la lista de invitaciones."/>
+ <name_list bottom_delta="-160" height="156" name="invitee_list" tool_tip="Para seleccionar a varios residentes, ve pulsando sus nombres mientras mantienes apretada la tecla Ctrl"/>
+ <button label="Eliminar de la lista a los seleccionados" left_delta="-7" name="remove_button" tool_tip="Quitar de la lista a los Residentes seleccionados arriba" width="214"/>
<text name="role_text">
Elegir qué rol asignarles:
</text>
- <combo_box name="role_name" tool_tip="Elige de la lista de roles cuál asignar a los miembros."/>
+ <combo_box name="role_name" tool_tip="Elige el rol de entre la lista de aquellos que estás autorizado a asignar"/>
<button label="Enviar las invitaciones" name="ok_button"/>
<button label="Cancelar" name="cancel_button"/>
- <string name="confirm_invite_owner_str">
- ¿Está seguro de que quiere invitar a un nuevo propietario/s? ¡Esta acción es permanente!
- </string>
- <string name="loading">
- (cargando...)
+ <string name="GroupInvitation">
+ Invitar al grupo
</string>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_group_land_money.xml b/indra/newview/skins/default/xui/es/panel_group_land_money.xml
index bccc114624..f307126b03 100644
--- a/indra/newview/skins/default/xui/es/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/es/panel_group_land_money.xml
@@ -1,85 +1,84 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Terreno y L$" name="land_money_tab">
- <string name="help_text">
- Se listan las parcelas propiedad del grupo, detallando las contribuciones. Aparece una advertencia si el Terreno total en uso es menor que o igual a la Contribución total. Las pestañas &apos;Planificación&apos;, &apos;Detalles&apos; y &apos;Ventas&apos; aportan información sobre las finanzas del grupo
- </string>
- <button label="?" name="help_button"/>
- <string name="cant_view_group_land_text">
- No tiene permiso para ver qué terreno posee el grupo.
- </string>
- <string name="cant_view_group_accounting_text">
- No tiene permiso para ver la información de la cuenta del grupo.
- </string>
- <string name="loading_txt">
+ <panel.string name="help_text">
+ Aparece una advertencia si el Terreno total en uso es menor que o igual a la Contribución total.
+ </panel.string>
+ <panel.string name="cant_view_group_land_text">
+ No tienes permiso para ver el terreno propiedad del grupo
+ </panel.string>
+ <panel.string name="epmty_view_group_land_text">
+ No hay entradas
+ </panel.string>
+ <panel.string name="cant_view_group_accounting_text">
+ No tienes permiso para ver la información de la cuenta del grupo.
+ </panel.string>
+ <panel.string name="loading_txt">
Cargando...
- </string>
- <text name="group_land_heading" width="250">
- Terreno propiedad del grupo
- </text>
- <scroll_list name="group_parcel_list">
- <column label="Parcela" name="name" width="100"/>
- <column label="Región" name="location" width="100"/>
- <column label="Tipo" name="type" width="100"/>
- <column label="Superficie" name="area" width="81"/>
- <column label="" name="hidden"/>
- </scroll_list>
- <button label="Mostrar en el mapa" label_selected="Mostrar en el mapa" name="map_button" left="282" width="130"/>
- <text name="total_contributed_land_label">
- Contribución total:
- </text>
- <text name="total_contributed_land_value">
- [AREA] m²
- </text>
- <text name="total_land_in_use_label">
- Terreno total en uso:
- </text>
- <text name="total_land_in_use_value">
- [AREA] m²
- </text>
- <text name="land_available_label">
- Terreno disponible:
- </text>
- <text name="land_available_value">
- [AREA] m²
- </text>
- <text name="your_contribution_label">
- Su contribución:
- </text>
- <string name="land_contrib_error">
- No se ha podido defininir su contribución de terreno.
- </string>
- <text name="your_contribution_units">
- ( m² )
- </text>
- <text name="your_contribution_max_value">
- ([AMOUNT] máx.)
- </text>
- <text name="group_over_limit_text">
- Los miembros del grupo deben contribuir con más créditos de terreno
-para mantener el terreno en uso.
- </text>
- <text name="group_money_heading">
- L$ del grupo
- </text>
+ </panel.string>
+ <panel.string name="land_contrib_error">
+ No se ha podido definir tu contribución de terreno
+ </panel.string>
+ <panel name="layout_panel_landmoney">
+ <scroll_list name="group_parcel_list">
+ <scroll_list.columns label="Parcela" name="name"/>
+ <scroll_list.columns label="Región" name="location"/>
+ <scroll_list.columns label="Tipo" name="type"/>
+ <scroll_list.columns label="Ãrea" name="area"/>
+ </scroll_list>
+ <text name="total_contributed_land_label">
+ Contribución total:
+ </text>
+ <text name="total_contributed_land_value">
+ [AREA] m²
+ </text>
+ <button label="Mapa" label_selected="Mapa" name="map_button"/>
+ <text name="total_land_in_use_label">
+ Terreno total en uso:
+ </text>
+ <text name="total_land_in_use_value">
+ [AREA] m²
+ </text>
+ <text name="land_available_label">
+ Terreno disponible:
+ </text>
+ <text name="land_available_value">
+ [AREA] m²
+ </text>
+ <text name="your_contribution_label">
+ Tu contribución:
+ </text>
+ <text name="your_contribution_units">
+ m²
+ </text>
+ <text name="your_contribution_max_value">
+ ([AMOUNT] máx.)
+ </text>
+ <text name="group_over_limit_text">
+ Se necesitan más créditos de terreno para mantener el terreno en uso
+ </text>
+ <text name="group_money_heading">
+ L$ del grupo
+ </text>
+ </panel>
<tab_container name="group_money_tab_container">
- <panel label="Planificación" name="group_money_planning_tab">
+ <panel label="RESUMEN" name="group_money_planning_tab">
<text_editor name="group_money_planning_text">
- Calculando...
+ Cargando...
</text_editor>
</panel>
- <panel label="Detalles" name="group_money_details_tab">
+ <panel label="DETALLES" name="group_money_details_tab">
<text_editor name="group_money_details_text">
- Calculando...
+ Cargando...
</text_editor>
- <button label="&lt; Antes" label_selected="&lt; Antes" name="earlier_details_button" tool_tip="Ir hacia atrás en el tiempo"/>
- <button label="Después &gt;" label_selected="Después &gt;" name="later_details_button" tool_tip="Ir hacia adelante en el tiempo"/>
+ <button label="&lt; Antes" label_selected="&lt; Antes" name="earlier_details_button" tool_tip="Anterior"/>
+ <button label="Después &gt;" label_selected="Después &gt;" name="later_details_button" tool_tip="Siguiente"/>
</panel>
- <panel label="Ventas" name="group_money_sales_tab">
+ <panel label="VENTAS" name="group_money_sales_tab">
<text_editor name="group_money_sales_text">
- Calculando...
+ Cargando...
</text_editor>
- <button label="&lt; Antes" label_selected="&lt; Antes" name="earlier_sales_button" tool_tip="Ir hacia atrás en el tiempo"/>
- <button label="Después &gt;" label_selected="Después &gt;" name="later_sales_button" tool_tip="Ir hacia adelante en el tiempo"/>
+ <button label="&lt; Antes" label_selected="&lt; Antes" name="earlier_sales_button" tool_tip="Anterior"/>
+ <button label="Después &gt;" label_selected="Después &gt;" name="later_sales_button" tool_tip="Siguiente"/>
</panel>
</tab_container>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_group_list_item.xml b/indra/newview/skins/default/xui/es/panel_group_list_item.xml
new file mode 100644
index 0000000000..5c9f1c3688
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_group_list_item.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="group_list_item">
+ <text name="group_name" value="Desconocido"/>
+ <button name="profile_btn" tool_tip="Ver el perfil"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_group_notices.xml b/indra/newview/skins/default/xui/es/panel_group_notices.xml
index c6788b3a65..7a3dbad59e 100644
--- a/indra/newview/skins/default/xui/es/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/es/panel_group_notices.xml
@@ -1,35 +1,29 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Avisos" name="notices_tab">
- <text name="help_text">
+ <panel.string name="help_text">
Los avisos son una forma rápida de comunicación dentro de un grupo, difundiendo un mensaje y, si se quiere, añadiéndole un ítem. Los avisos sólo los reciben los miembros del grupo cuyo rol tiene adjudicada tal habilidad. Puede desactivar los avisos en la pestaña General.
- </text>
- <text name="no_notices_text">
- No hay avisos pasados.
- </text>
- <button label="?" label_selected="?" name="help_button"/>
- <text name="lbl">
- Archivo de avisos del grupo
- </text>
+ </panel.string>
+ <panel.string name="no_notices_text">
+ No hay avisos pasados
+ </panel.string>
<text name="lbl2">
- Los avisos se mantienen durante 14 días. Las listas de avisos tienen un límite de 200 avisos por día.
+ Los avisos se mantienen durante 14 días.
+El máximo es de 200 por día y grupo.
</text>
<scroll_list name="notice_list">
- <column label="Asunto" name="subject"/>
- <column label="De" name="from"/>
- <column label="Fecha" name="date"/>
+ <scroll_list.columns label="Asunto" name="subject"/>
+ <scroll_list.columns label="De" name="from"/>
+ <scroll_list.columns label="Fecha" name="date"/>
</scroll_list>
<text name="notice_list_none_found">
- No se han encontrado.
+ No se han encontrado
</text>
- <button label="Crear un aviso nuevo" label_selected="Crear un aviso nuevo" name="create_new_notice"/>
- <button label="Actualizar" label_selected="Actualizar la lista" name="refresh_notices"/>
+ <button label="Crear un aviso nuevo" label_selected="Crear un aviso nuevo" name="create_new_notice" tool_tip="Crear un aviso nuevo"/>
+ <button label="Actualizar" label_selected="Actualizar la lista" name="refresh_notices" tool_tip="Actualizar la lista de avisos"/>
<panel label="Crear un aviso nuevo" name="panel_create_new_notice">
<text name="lbl">
Crear un aviso
</text>
- <text name="lbl2">
- Puede añadir un ítem al aviso arrastrándolo desde su inventario a este panel. Los ítems anexados deben ser copiables y transferibles, y no se puede enviar una carpeta.
- </text>
<text name="lbl3">
Asunto:
</text>
@@ -39,16 +33,20 @@
<text name="lbl5">
Anexar:
</text>
- <button label="Remover lo anexado" label_selected="Remover lo anexado" name="remove_attachment"/>
+ <text name="string">
+ Arrastra y suelta aquí un ítem para adjuntarlo:
+ </text>
+ <button label="Inventario" name="open_inventory" tool_tip="Abrir inventario"/>
+ <button label="Quitar" label_selected="Remover lo anexado" name="remove_attachment" tool_tip="Quita el adjunto de tu aviso"/>
<button label="Enviar" label_selected="Enviar" name="send_notice"/>
- <panel name="drop_target" tool_tip="Para enviar un ítem con el aviso, arrástrelo desde su inventario hasta el cuadro del mensaje. Para poder enviar ese objeto con el aviso, usted debe tener permiso para copiarlo y transferirlo."/>
+ <group_drop_target name="drop_target" tool_tip="Para enviar un ítem con el aviso, arrástralo desde tu inventario hasta este cajetín. Para poder adjuntarlo, debes tener permiso para copiarlo y transferirlo."/>
</panel>
<panel label="Ver avisos pasados" name="panel_view_past_notice">
<text name="lbl">
Avisos archivados
</text>
<text name="lbl2">
- Pulse el botón &apos;Crear un aviso nuevo&apos; para enviar uno nuevo.
+ Para enviar un aviso nuevo, pulsa el botón +
</text>
<text name="lbl3">
Asunto:
@@ -56,6 +54,6 @@
<text name="lbl4">
Mensaje:
</text>
- <button label="Abrir lo anexado" label_selected="Abrir lo anexado" name="open_attachment"/>
+ <button label="Abrir el adjunto" label_selected="Abrir lo anexado" name="open_attachment"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_group_notify.xml b/indra/newview/skins/default/xui/es/panel_group_notify.xml
new file mode 100644
index 0000000000..7bdacbd1e0
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_group_notify.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_group_notify">
+ <panel label="header" name="header">
+ <text name="title" value="Nombre del emisor / Nombre del grupo"/>
+ </panel>
+ <text name="attachment" value="Adjunto"/>
+ <button label="OK" name="btn_ok"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_group_roles.xml b/indra/newview/skins/default/xui/es/panel_group_roles.xml
index 2739a3da5e..5ef81162bc 100644
--- a/indra/newview/skins/default/xui/es/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/es/panel_group_roles.xml
@@ -1,158 +1,119 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Miembros y Roles" name="roles_tab">
- <string name="default_needs_apply_text">
- En esta pestaña hay cambios sin aplicar.
- </string>
- <string name="want_apply_text">
- ¿Quiere aplicar estos cambios?
- </string>
- <button label="?" name="help_button"/>
- <panel name="members_header">
- <text name="static">
- Miembros y Roles
- </text>
- <text name="static2">
- Los miembros del grupo tienen asignados roles con distintas capacidades.
-Estas configuraciones son fácilmente personalizables, para facilitar una
-mayor flexibilidad y organización.
- </text>
- </panel>
- <panel name="roles_header">
- <text name="static">
- Roles
- </text>
- <text name="role_properties_modifiable">
- Elija un rol de los de abajo. Puede modificar su nombre, su
-descripción, y la etiqueta de los miembros.
- </text>
- <text name="role_properties_not_modifiable">
- Elija un rol de los de abajo para ver sus propiedades, miembros, y qué
-capacidades tiene asignadas.
- </text>
- <text bottom_delta="-28" name="role_actions_modifiable">
- También puede asignar capacidades al rol.
- </text>
- <text name="role_actions_not_modifiable">
- Puede ver, pero no modificar, las capacidades asignadas.
- </text>
- </panel>
- <panel name="actions_header">
- <text name="static">
- Capacidades
- </text>
- <text name="static2">
- Puede ver una descripción de la capacidad, y qué miembros y roles pueden
-realizarla.
- </text>
- </panel>
- <tab_container height="164" name="roles_tab_container">
- <panel height="148" label="Miembros" name="members_sub_tab" tool_tip="Miembros">
- <line_editor bottom="127" name="search_text"/>
- <button label="Buscar" name="search_button" width="75"/>
- <button label="Verlos todos" name="show_all_button" left_delta="80"/>
- <name_list name="member_list" bottom_delta="-105" height="104" >
- <column label="Nombre del miembro" name="name"/>
- <column label="Cuotas donadas" name="donated"/>
- <column label="Última conexión" name="online"/>
- </name_list>
- <button label="Invitar a un nuevo miembro..." name="member_invite" width="175"/>
- <button label="Expulsar del grupo" name="member_eject"/>
- <string name="help_text">
+ <panel.string name="default_needs_apply_text">
+ Hay cambios sin guardar
+ </panel.string>
+ <panel.string name="want_apply_text">
+ ¿Quieres guardar estos cambios?
+ </panel.string>
+ <tab_container name="roles_tab_container">
+ <panel label="MIEMBROS" name="members_sub_tab" tool_tip="Miembros">
+ <panel.string name="help_text">
Puede añadir o quitar los roles asignados a los miembros.
Seleccione varios nombres manteniendo pulsada la tecla Ctrl y pulsando en cada uno de ellos.
- </string>
+ </panel.string>
+ <filter_editor label="Filtrar los miembros" name="filter_input"/>
+ <name_list name="member_list">
+ <name_list.columns label="Miembro" name="name"/>
+ <name_list.columns label="Donaciones" name="donated"/>
+ <name_list.columns label="Estatus" name="online"/>
+ </name_list>
+ <button label="Invitar" name="member_invite"/>
+ <button label="Expulsar" name="member_eject"/>
</panel>
- <panel height="148" label="Roles" name="roles_sub_tab">
- <line_editor bottom="127" name="search_text"/>
- <button label="Buscar" name="search_button" width="75"/>
- <button label="Verlos todos" name="show_all_button" left_delta="80"/>
- <scroll_list name="role_list" bottom_delta="-104" height="104">
- <column label="Nombre del rol" name="name"/>
- <column label="Etiqueta" name="title"/>
- <column label="Miembros" name="members"/>
+ <panel label="ROLES" name="roles_sub_tab">
+ <panel.string name="help_text">
+ Los roles tienen una etiqueta propia y unas capacidades que se
+permiten ejercer a sus miembros. Los miembros pueden
+tener más de un rol. Un grupo puede tener hasta 10 roles,
+incluyendo el de Todos y el de Propietarios.
+ </panel.string>
+ <panel.string name="cant_delete_role">
+ Los roles de &apos;Todos&apos; y &apos;Propietarios&apos; son especiales, y no pueden eliminarse.
+ </panel.string>
+ <panel.string name="power_folder_icon">
+ Inv_FolderClosed
+ </panel.string>
+ <filter_editor label="Filtrar los roles" name="filter_input"/>
+ <scroll_list name="role_list">
+ <scroll_list.columns label="Rol" name="name"/>
+ <scroll_list.columns label="Etiqueta" name="title"/>
+ <scroll_list.columns label="#" name="members"/>
</scroll_list>
- <button label="Crear un rol nuevo..." name="role_create"/>
+ <button label="Añadir un rol" name="role_create"/>
<button label="Eliminar el rol" name="role_delete"/>
- <string name="help_text">
- Los roles tienen una etiqueta y una serie de capacidades permitidas que los miembros pueden desarrollar. Los miembros pueden tener más de un rol. Un grupo puede tener hasta 10 roles, incluyendo el de Todos y el de Propietarios.
- </string>
- <string name="cant_delete_role">
- Los roles de &apos;Todos&apos; y &apos;Propietarios&apos; son especiales, y no pueden eliminarse.
- </string>
</panel>
- <panel height="148" label="Capacidades" name="actions_sub_tab">
- <line_editor bottom="127" name="search_text"/>
- <button label="Buscar" name="search_button" width="75"/>
- <button label="Verlos todos" name="show_all_button" left_delta="80"/>
- <scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Elija una capacidad para verla más en detalle.">
- <column label="" name="icon"/>
- <column label="" name="action"/>
- </scroll_list>
- <string name="help_text">
+ <panel height="148" label="CAPACIDADES" name="actions_sub_tab" tool_tip="Puedes ver una descripción de la capacidad y qué miembros y roles la tienen.">
+ <panel.string name="help_text">
Las capacidades permiten a los miembros que tienen ese rol el hacer tareas específicas dentro de este grupo. Hay una gran variedad de capacidades.
- </string>
+ </panel.string>
+ <filter_editor label="Filtrar las capacidades" name="filter_input"/>
+ <scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Elige una capacidad para verla más en detalle">
+ <scroll_list.columns label="" name="icon"/>
+ <scroll_list.columns label="" name="action"/>
+ </scroll_list>
</panel>
</tab_container>
<panel name="members_footer">
<text name="static">
Roles asignados
</text>
+ <scroll_list name="member_assigned_roles">
+ <scroll_list.columns label="" name="checkbox"/>
+ <scroll_list.columns label="" name="role"/>
+ </scroll_list>
<text name="static2">
Capacidades permitidas
</text>
- <scroll_list name="member_assigned_roles">
- <column label="" name="checkbox"/>
- <column label="" name="role"/>
- </scroll_list>
- <scroll_list name="member_allowed_actions" tool_tip="Para más detalles de cada capacidad permitida, vea la pestaña Capacidades.">
- <column label="" name="icon"/>
- <column label="" name="action"/>
+ <scroll_list name="member_allowed_actions" tool_tip="Para más detalles de cada capacidad, ver la pestaña Capacidades">
+ <scroll_list.columns label="" name="icon"/>
+ <scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
<panel name="roles_footer">
<text name="static">
- Nombre
- </text>
- <text name="static2">
- Descripción
+ Nombre del rol
</text>
<line_editor name="role_name">
Empleados
</line_editor>
<text name="static3">
- Etiqueta
+ Etiqueta del rol
</text>
<line_editor name="role_title">
(esperando)
</line_editor>
+ <text name="static2">
+ Descripción
+ </text>
<text_editor name="role_description">
(esperando)
</text_editor>
<text name="static4">
- Miembros asignados
+ Roles asignados
</text>
+ <check_box label="Mostrar los miembros" name="role_visible_in_list" tool_tip="Establece si los miembros de este rol pueden ser vistos en la pestaña General por personas ajenas al grupo."/>
<text name="static5" tool_tip="Una lista de las capacidades que puede desarrollar el rol seleccionado actualmente.">
Capacidades asignadas
</text>
- <check_box label="Los miembros son visibles." name="role_visible_in_list" tool_tip="Establece si los miembros de este rol pueden ser vistos en la pestaña General por personas ajenas al grupo."/>
- <scroll_list name="role_allowed_actions" tool_tip="Para más detalles de cada capacidad permitida, vea la pestaña Capacidades.">
- <column label="" name="icon"/>
- <column label="" name="checkbox"/>
- <column label="" name="action"/>
+ <scroll_list name="role_allowed_actions" tool_tip="Para más detalles de cada capacidad, ver la pestaña Capacidades">
+ <scroll_list.columns label="" name="icon"/>
+ <scroll_list.columns label="" name="checkbox"/>
+ <scroll_list.columns label="" name="action"/>
</scroll_list>
</panel>
<panel name="actions_footer">
<text name="static">
- Descripción
+ Descripción de la capacidad
</text>
<text_editor name="action_description">
Esta capacidad es la de &apos;Expulsar miembros de este grupo&apos;. Sólo un propietario puede expulsar a otro.
</text_editor>
<text name="static2">
- Roles con la capacidad
+ Roles con esta capacidad
</text>
<text name="static3">
- Miembros con la capacidad
+ Miembros con esta capacidad
</text>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_im_control_panel.xml b/indra/newview/skins/default/xui/es/panel_im_control_panel.xml
new file mode 100644
index 0000000000..7d4db6a630
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_im_control_panel.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="button_stack">
+ <layout_panel name="view_profile_btn_panel">
+ <button label="Perfil" name="view_profile_btn"/>
+ </layout_panel>
+ <layout_panel name="add_friend_btn_panel">
+ <button label="Añadir como amigo" name="add_friend_btn"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_panel">
+ <button label="Teleportarme" name="teleport_btn" tool_tip="Ofrecer teleporte a esta persona"/>
+ </layout_panel>
+ <layout_panel name="share_btn_panel">
+ <button label="Compartir" name="share_btn"/>
+ </layout_panel>
+ <layout_panel name="pay_btn_panel">
+ <button label="Pagar" name="pay_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Llamar" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Colgar" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Controles de la voz" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_inventory_item.xml b/indra/newview/skins/default/xui/es/panel_inventory_item.xml
new file mode 100644
index 0000000000..d18047fbcf
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_inventory_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="inventory_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_landmark_info.xml b/indra/newview/skins/default/xui/es/panel_landmark_info.xml
new file mode 100644
index 0000000000..49a9f84cfe
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_landmark_info.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="landmark_info">
+ <string name="title_create_landmark" value="Crear un hito"/>
+ <string name="title_edit_landmark" value="Editar el hito"/>
+ <string name="title_landmark" value="Hito"/>
+ <string name="not_available" value="(No disp.)"/>
+ <string name="unknown" value="(desconocidas)"/>
+ <string name="public" value="(público)"/>
+ <string name="server_update_text">
+ Los datos de este lugar no están disponibles sin una actualización del servidor.
+ </string>
+ <string name="server_error_text">
+ Los datos de este lugar no están disponibles por el momento. Por favor, prueba más tarde.
+ </string>
+ <string name="server_forbidden_text">
+ Por restricciones en el acceso, los datos de esta localización no están disponibles. Por favor, revisa tus permisos con el propietario de la parcela.
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local][day,datetime,local] [mth,datetime,local] [year,datetime,local][hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ </string>
+ <button name="back_btn" tool_tip="Atrás"/>
+ <text name="title" value="Añadir el perfil"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="maturity_value" value="desconocido"/>
+ <panel name="landmark_info_panel">
+ <text name="owner_label" value="Propietario:"/>
+ <text name="creator_label" value="Creador:"/>
+ <text name="created_label" value="Creado:"/>
+ </panel>
+ <panel name="landmark_edit_panel">
+ <text name="title_label" value="Título:"/>
+ <text name="notes_label" value="Mis notas:"/>
+ <text name="folder_label" value="Localización del hito:"/>
+ </panel>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_landmarks.xml b/indra/newview/skins/default/xui/es/panel_landmarks.xml
new file mode 100644
index 0000000000..8f476403c7
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_landmarks.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Landmarks">
+ <accordion name="landmarks_accordion">
+ <accordion_tab name="tab_favorites" title="Barra de favoritos"/>
+ <accordion_tab name="tab_landmarks" title="Mis hitos"/>
+ <accordion_tab name="tab_inventory" title="Mi Inventario"/>
+ <accordion_tab name="tab_library" title="Biblioteca"/>
+ </accordion>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Ver más opciones"/>
+ <button name="add_btn" tool_tip="Añadir un nuevo hito"/>
+ <dnd_button name="trash_btn" tool_tip="Quitar el hito seleccionado"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_login.xml b/indra/newview/skins/default/xui/es/panel_login.xml
index 52c3855d6a..4b45a6f7b8 100644
--- a/indra/newview/skins/default/xui/es/panel_login.xml
+++ b/indra/newview/skins/default/xui/es/panel_login.xml
@@ -6,34 +6,35 @@
<panel.string name="forgot_password_url">
http://secondlife.com/account/request.php?lang=es
</panel.string>
-<panel name="login_widgets">
- <text name="first_name_text">
- Nombre:
- </text>
- <text name="last_name_text">
- Apellido:
- </text>
- <text name="password_text">
- Contraseña:
- </text>
- <text name="start_location_text">
- Posición inicial:
- </text>
- <combo_box name="start_location_combo">
- <combo_box.item name="MyHome" label="Mi Base"/>
- <combo_box.item name="MyLastLocation" label="Mi última posición"/>
- <combo_box.item name="Typeregionname" label="&lt;Escriba el nombre de la Región&gt;"/>
- </combo_box>
- <check_box label="Recordar la contraseña" name="remember_check"/>
- <button label="Iniciar sesión" label_selected="Iniciar sesión" name="connect_btn"/>
- <text name="create_new_account_text">
- Regístrese para obtener una cuenta
- </text>
- <text name="forgot_password_text">
- ¿Olvidó su nombre o su contraseña?
- </text>
- <text name="channel_text">
- [VERSION]
- </text>
-</panel>
+ <layout_stack name="login_widgets">
+ <layout_panel name="login">
+ <text name="username_text">
+ Nombre de usuario:
+ </text>
+ <line_editor label="Nombre de usuario" name="username_edit" tool_tip="Nombre de usuario de [SECOND_LIFE]"/>
+ <text name="password_text">
+ Contraseña:
+ </text>
+ <check_box label="Recordar la contraseña" name="remember_check"/>
+ <button label="Iniciar sesión" name="connect_btn"/>
+ <text name="start_location_text">
+ Empezar en:
+ </text>
+ <combo_box name="start_location_combo">
+ <combo_box.item label="Mi última posición" name="MyLastLocation"/>
+ <combo_box.item label="Mi Base" name="MyHome"/>
+ </combo_box>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_new_account_text">
+ Registrarme
+ </text>
+ <text name="forgot_password_text">
+ ¿Olvidaste el nombre o la contraseña?
+ </text>
+ <text name="login_help">
+ ¿Necesitas ayuda para conectarte?
+ </text>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_main_inventory.xml b/indra/newview/skins/default/xui/es/panel_main_inventory.xml
new file mode 100644
index 0000000000..7e318a150b
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_main_inventory.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Cosas" name="main inventory panel">
+ <panel.string name="ItemcountFetching">
+ Obtenidos [ITEM_COUNT] ítems... [FILTER]
+ </panel.string>
+ <panel.string name="ItemcountCompleted">
+ [ITEM_COUNT] ítems [FILTER]
+ </panel.string>
+ <text name="ItemcountText">
+ Ãtems:
+ </text>
+ <filter_editor label="Filtrar" name="inventory search editor"/>
+ <tab_container name="inventory filter tabs">
+ <inventory_panel label="Todos los ítems" name="All Items"/>
+ <recent_inventory_panel label="Ãtems recientes" name="Recent Items"/>
+ </tab_container>
+ <layout_stack name="bottom_panel">
+ <layout_panel name="options_gear_btn_panel">
+ <button name="options_gear_btn" tool_tip="Ver más opciones"/>
+ </layout_panel>
+ <layout_panel name="add_btn_panel">
+ <button name="add_btn" tool_tip="Añadir un ítem nuevo"/>
+ </layout_panel>
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="trash_btn" tool_tip="Quitar el ítem seleccionado"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_me.xml b/indra/newview/skins/default/xui/es/panel_me.xml
new file mode 100644
index 0000000000..ed253904aa
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_me.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Mi perfil" name="panel_me">
+ <tab_container name="tabs">
+ <panel label="MI PERFIL" name="panel_profile"/>
+ <panel label="MIS DESTACADOS" name="panel_picks"/>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_media_settings_general.xml b/indra/newview/skins/default/xui/es/panel_media_settings_general.xml
new file mode 100644
index 0000000000..46326d1e8b
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_media_settings_general.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="General" name="Media Settings General">
+ <text name="home_label">
+ Página inicial:
+ </text>
+ <text name="home_fails_whitelist_label">
+ (La Lista Blanca especificada no aprueba esta página)
+ </text>
+ <line_editor name="home_url" tool_tip="Página inicial para el origen de este media"/>
+ <text name="preview_label">
+ Vista previa
+ </text>
+ <text name="current_url_label">
+ Página actual:
+ </text>
+ <text name="current_url" tool_tip="Página actual para el origen de este media" value=""/>
+ <button label="Definir" name="current_url_reset_btn"/>
+ <check_box initial_value="false" label="Media en bucle" name="auto_loop"/>
+ <check_box initial_value="false" label="A la primera pulsación" name="first_click_interact"/>
+ <check_box initial_value="false" label="Zoom automático" name="auto_zoom"/>
+ <check_box initial_value="false" label="Ejecutar automáticamente los media" name="auto_play"/>
+ <text name="media_setting_note">
+ Nota: los residentes pueden elegir una configuración distinta de ésta
+ </text>
+ <check_box initial_value="false" label="Ajustar automáticamente los media en la cara del objeto" name="auto_scale"/>
+ <text name="size_label">
+ Tamaño:
+ </text>
+ <text name="X_label">
+ X
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/es/panel_media_settings_permissions.xml
new file mode 100644
index 0000000000..ec9edbfa15
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_media_settings_permissions.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Personalizar" name="Media settings for controls">
+ <text name="controls_label">
+ Controles:
+ </text>
+ <combo_box name="controls">
+ <combo_item name="Standard">
+ Estándar
+ </combo_item>
+ <combo_item name="Mini">
+ Mini
+ </combo_item>
+ </combo_box>
+ <text name="owner_label">
+ Propietario
+ </text>
+ <check_box initial_value="false" label="Permitir la navegación e interactividad" name="perms_owner_interact"/>
+ <check_box initial_value="false" label="Mostrar la barra de control" name="perms_owner_control"/>
+ <text name="group_label">
+ Grupo:
+ </text>
+ <check_box initial_value="false" label="Permitir la navegación e interactividad" name="perms_group_interact"/>
+ <check_box initial_value="false" label="Mostrar la barra de control" name="perms_group_control"/>
+ <text name="anyone_label">
+ Cualquiera
+ </text>
+ <check_box initial_value="false" label="Permitir la navegación e interactividad" name="perms_anyone_interact"/>
+ <check_box initial_value="false" label="Mostrar la barra de control" name="perms_anyone_control"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_media_settings_security.xml b/indra/newview/skins/default/xui/es/panel_media_settings_security.xml
new file mode 100644
index 0000000000..c72f562a68
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_media_settings_security.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Seguridad" name="Media Settings Security">
+ <check_box initial_value="false" label="Permitir el acceso sólo a los patrones de URL especificados" name="whitelist_enable"/>
+ <text name="home_url_fails_some_items_in_whitelist">
+ Están marcadas las entradas que la página web no admite:
+ </text>
+ <button label="Añadir" name="whitelist_add"/>
+ <button label="Borrar" name="whitelist_del"/>
+ <text name="home_url_fails_whitelist">
+ Atención: la página web especificada en la pestaña General no se admite en esta lista blanca. Se ha desactivado hasta que se añada una entrada correcta.
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_my_profile.xml b/indra/newview/skins/default/xui/es/panel_my_profile.xml
new file mode 100644
index 0000000000..5a6fd8b144
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_my_profile.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Perfil" name="panel_profile">
+ <string name="no_partner_text" value="Ninguno/a"/>
+ <string name="no_group_text" value="Ninguno"/>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <layout_stack name="layout">
+ <layout_panel name="profile_stack">
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="second_life_image_panel">
+ <icon label="" name="2nd_life_edit_icon" tool_tip="Pulsa el botón Editar el perfil para cambiar la imagen"/>
+ <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <icon label="" name="real_world_edit_icon" tool_tip="Pulsa el botón Editar el perfil para cambiar la imagen"/>
+ <text name="title_rw_descr_text" value="Mundo real:"/>
+ </panel>
+ <text name="title_member_text" value="Residente desde:"/>
+ <text name="title_acc_status_text" value="Estado de la cuenta:"/>
+ <text name="title_partner_text" value="Compañero/a:"/>
+ <panel name="partner_data_panel">
+ <name_box initial_value="(obteniendo)" name="partner_text"/>
+ </panel>
+ <text name="title_groups_text" value="Grupos:"/>
+ </panel>
+ </scroll_container>
+ </layout_panel>
+ <layout_panel name="profile_me_buttons_panel">
+ <button label="Editar el perfil" name="edit_profile_btn" tool_tip="Modificar tu información personal"/>
+ <button label="Modificar la apariencia" name="edit_appearance_btn" tool_tip="Crear o modificar tu apariencia: tu físico, ropas, etc."/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_navigation_bar.xml b/indra/newview/skins/default/xui/es/panel_navigation_bar.xml
new file mode 100644
index 0000000000..e8e95c3bac
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_navigation_bar.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="navigation_bar">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="Volver a lo localización anterior"/>
+ <pull_button name="forward_btn" tool_tip="Ir una localización adelante"/>
+ <button name="home_btn" tool_tip="Teleportar a mi Base"/>
+ <location_input label="Localización" name="location_combo"/>
+ <search_combo_box label="Buscar" name="search_combo_box" tool_tip="Buscar">
+ <combo_editor label="Buscar en [SECOND_LIFE]" name="search_combo_editor"/>
+ </search_combo_box>
+ </panel>
+ <favorites_bar name="favorite" tool_tip="¡Accede rápidamente a tus lugares favoritos de Second Life arrastrando hitos hasta aquí!">
+ <label name="favorites_bar_label" tool_tip="¡Accede rápidamente a tus lugares favoritos de Second Life arrastrando hitos hasta aquí!">
+ Barra de Favoritos
+ </label>
+ <chevron_button name="&gt;&gt;" tool_tip="Ver más de Mis favoritos"/>
+ </favorites_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_nearby_chat.xml b/indra/newview/skins/default/xui/es/panel_nearby_chat.xml
new file mode 100644
index 0000000000..986c109c41
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- All our XML is utf-8 encoded. -->
+<panel name="nearby_chat">
+ <panel name="chat_caption">
+ <text name="sender_name">
+ CHAT
+ </text>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/es/panel_nearby_chat_bar.xml
new file mode 100644
index 0000000000..af2b6e920b
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_nearby_chat_bar.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chat_bar">
+ <line_editor label="Pulsa aquí para chatear." name="chat_box" tool_tip="Pulsa Enter para decirlo o Ctrl+Enter para gritarlo"/>
+ <button name="show_nearby_chat" tool_tip="Muestra o esconde el registro del chat"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_nearby_media.xml b/indra/newview/skins/default/xui/es/panel_nearby_media.xml
new file mode 100644
index 0000000000..d1a14c877f
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_nearby_media.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_media">
+ <string name="media_item_count_format">
+ (%ld ítems media)
+ </string>
+ <string name="empty_item_text">
+ &lt;vacío&gt;
+ </string>
+ <string name="parcel_media_name">
+ Media en streaming de la parcela
+ </string>
+ <string name="parcel_audio_name">
+ Audio en streaming de la parcela
+ </string>
+ <string name="playing_suffix">
+ (ejecutándose)
+ </string>
+ <panel name="minimized_controls">
+ <button label="Parar todo" name="all_nearby_media_disable_btn" tool_tip="Apagar todos los media cercanos"/>
+ <button label="Iniciar todo" name="all_nearby_media_enable_btn" tool_tip="Encender todos los media cercanos"/>
+ <button name="open_prefs_btn" tool_tip="Abrir las preferencias de los media"/>
+ <button label="Más &gt;&gt;" label_selected="Menos &lt;&lt;" name="more_btn" tool_tip="Controles avanzados"/>
+ <button label="Más &gt;&gt;" label_selected="Menos &lt;&lt;" name="less_btn" tool_tip="Controles avanzados"/>
+ </panel>
+ <panel name="nearby_media_panel">
+ <combo_box name="show_combo">
+ <combo_box.item label="Todo" name="All"/>
+ <combo_box.item label="En esta parcela" name="WithinParcel"/>
+ <combo_box.item label="Fuera de la parcela" name="OutsideParcel"/>
+ <combo_box.item label="En otros avatares" name="OnOthers"/>
+ </combo_box>
+ <scroll_list name="media_list">
+ <scroll_list.columns label="Cercanía" name="media_proximity"/>
+ <scroll_list.columns label="Visibilidad" name="media_visibility"/>
+ <scroll_list.columns label="Clase" name="media_class"/>
+ <scroll_list.columns label="Nombre" name="media_name"/>
+ <scroll_list.columns label="Depurar" name="media_debug"/>
+ </scroll_list>
+ <panel>
+ <layout_stack name="media_controls">
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="Parar los media seleccionados"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="Ejecutar los media"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="Pausa los media seleccionados"/>
+ </layout_panel>
+ <layout_panel name="volume_slider_ctrl">
+ <slider_bar initial_value="0.5" name="volume_slider" tool_tip="Volumen de los media seleccionados"/>
+ </layout_panel>
+ <layout_panel name="mute">
+ <button name="mute_btn" tool_tip="Silencia los media seleccionados"/>
+ </layout_panel>
+ <layout_panel name="zoom">
+ <button name="zoom_btn" tool_tip="Zoom en los media seleccionados"/>
+ </layout_panel>
+ <layout_panel name="unzoom">
+ <button name="unzoom_btn" tool_tip="Alejar el zoom de los media seleccionados"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_notes.xml b/indra/newview/skins/default/xui/es/panel_notes.xml
new file mode 100644
index 0000000000..8de2afa767
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_notes.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Notas y Privacidad" name="panel_notes">
+ <layout_stack name="layout">
+ <panel name="notes_stack">
+ <scroll_container name="profile_scroll">
+ <panel name="profile_scroll_panel">
+ <text name="status_message" value="Mis notas privadas:"/>
+ <text name="status_message2" value="Permitir que esta persona:"/>
+ <check_box label="Vea si estoy conectado" name="status_check"/>
+ <check_box label="Me vea en el mapa" name="map_check"/>
+ <check_box label="Edite, borre o coja mis objetos" name="objects_check"/>
+ </panel>
+ </scroll_container>
+ </panel>
+ <panel name="notes_buttons_panel">
+ <button label="Añadir como amigo" name="add_friend" tool_tip="Ofrecer amistad a este Residente"/>
+ <button label="MI" name="im" tool_tip="Abrir un mensaje instantáneo"/>
+ <button label="Llamar" name="call" tool_tip="Llamar a este Residente"/>
+ <button label="Mapa" name="show_on_map_btn" tool_tip="Mostrar al Residente en el mapa"/>
+ <button label="Teleportar" name="teleport" tool_tip="Ofrecer teleporte"/>
+ </panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_online_status.xml b/indra/newview/skins/default/xui/es/panel_online_status.xml
new file mode 100644
index 0000000000..fdc489f375
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_online_status.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="friend_online_status" name="friend_online_status"/>
diff --git a/indra/newview/skins/default/xui/es/panel_online_status_toast.xml b/indra/newview/skins/default/xui/es/panel_online_status_toast.xml
new file mode 100644
index 0000000000..fdc489f375
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_online_status_toast.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="friend_online_status" name="friend_online_status"/>
diff --git a/indra/newview/skins/default/xui/es/panel_outfit_edit.xml b/indra/newview/skins/default/xui/es/panel_outfit_edit.xml
new file mode 100644
index 0000000000..31648e8e80
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_outfit_edit.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray Outfit Edit panel -->
+<panel label="Editar el vestuario" name="outfit_edit">
+ <string name="No Outfit" value="No hay vestuario"/>
+ <string name="unsaved_changes" value="Cambios sin guardar"/>
+ <string name="now_editing" value="Editando"/>
+ <panel.string name="not_available">
+ (No disp.)
+ </panel.string>
+ <panel.string name="unknown">
+ (desconocido)
+ </panel.string>
+ <string name="Filter.All" value="Todos"/>
+ <string name="Filter.Clothes/Body" value="Ropas/Cuerpo"/>
+ <string name="Filter.Objects" value="Objetos"/>
+ <string name="Filter.Custom" value="Filtro personalizado"/>
+ <text name="title" value="Editar el vestuario"/>
+ <panel label="bottom_panel" name="header_panel">
+ <panel label="bottom_panel" name="outfit_name_and_status">
+ <text name="status" value="Editando..."/>
+ <text name="curr_outfit_name" value="[Vestuario actual]"/>
+ </panel>
+ </panel>
+ <layout_stack name="im_panels">
+ <layout_panel label="Panel de control de los MI" name="outfit_wearables_panel">
+ <layout_stack name="filter_panels">
+ <layout_panel name="add_button_and_combobox">
+ <button label="Añadir más..." name="show_add_wearables_btn"/>
+ </layout_panel>
+ <layout_panel name="filter_panel">
+ <filter_editor label="Filtrar artículos del inventario" name="look_item_filter"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="add_wearables_panel"/>
+ </layout_stack>
+ <panel name="save_revert_button_bar">
+ <button label="Guardar" name="save_btn"/>
+ <button label="Revertir" name="revert_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/es/panel_outfits_inventory.xml
new file mode 100644
index 0000000000..7691a680a1
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_outfits_inventory.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Cosas" name="Outfits">
+ <tab_container name="appearance_tabs">
+ <panel label="MIS VESTUARIOS" name="outfitslist_tab"/>
+ <inventory_panel label="PUESTO" name="cof_tab"/>
+ </tab_container>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Ver más opciones"/>
+ <dnd_button name="trash_btn" tool_tip="Quitar el ítem seleccionado"/>
+ <button label="Guardar como" name="save_btn"/>
+ <button label="Ponerme" name="wear_btn" tool_tip="Ponerme el vestuario seleccionado"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/es/panel_outfits_inventory_gear_default.xml
new file mode 100644
index 0000000000..8f805c3d18
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_outfits_inventory_gear_default.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gear_default">
+ <menu_item_call label="Reemplazar el vestuario actual" name="wear"/>
+ <menu_item_call label="Añadir al vestuario actual" name="add"/>
+ <menu_item_call label="Quitar del vestuario actual" name="remove"/>
+ <menu_item_call label="Renombrar" name="rename"/>
+ <menu_item_call label="Quitar el enlace" name="remove_link"/>
+ <menu_item_call label="Borrar el vestuario" name="delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/es/panel_people.xml b/indra/newview/skins/default/xui/es/panel_people.xml
new file mode 100644
index 0000000000..13f584ff28
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_people.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray panel -->
+<panel label="Gente" name="people_panel">
+ <string name="no_recent_people" value="No hay nadie reciente. ¿Buscas gente con la que pasar el rato? Prueba la [secondlife:///app/search/people Búsqueda] o el [secondlife:///app/worldmap Mapa del mundo]."/>
+ <string name="no_filtered_recent_people" value="¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/people/[SEARCH_TERM] Buscar]."/>
+ <string name="no_one_near" value="No hay nadie cerca. ¿Buscas gente con la que pasar el rato? Prueba la [secondlife:///app/search/people Búsqueda] o el [secondlife:///app/worldmap Mapa del mundo]."/>
+ <string name="no_one_filtered_near" value="¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/people/[SEARCH_TERM] Buscar]."/>
+ <string name="no_friends_online" value="No hay amigos conectados"/>
+ <string name="no_friends" value="No hay amigos"/>
+ <string name="no_friends_msg">
+ Busca amigos usando la [secondlife:///app/search/people Búsqueda] o pulsa con el botón derecho del ratón en un Residente para añadirle como amigo.
+¿Buscas gente con la que pasar el rato? Prueba el [secondlife:///app/worldmap Mapa del mundo].
+ </string>
+ <string name="no_filtered_friends_msg">
+ ¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/people/[SEARCH_TERM] Buscar].
+ </string>
+ <string name="people_filter_label" value="Filtrar a la gente"/>
+ <string name="groups_filter_label" value="Filtrar a los grupos"/>
+ <string name="no_filtered_groups_msg" value="¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/groups/[SEARCH_TERM] Buscar]."/>
+ <string name="no_groups_msg" value="¿Buscas grupos en que participar? Prueba la [secondlife:///app/search/groups Búsqueda]."/>
+ <filter_editor label="Filtrar" name="filter_input"/>
+ <tab_container name="tabs">
+ <panel label="CERCANA" name="nearby_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="nearby_view_sort_btn" tool_tip="Opciones"/>
+ <button name="add_friend_btn" tool_tip="Añadir al Residente seleccionado a la lista de tus amigos"/>
+ </panel>
+ </panel>
+ <panel label="MIS AMIGOS" name="friends_panel">
+ <accordion name="friends_accordion">
+ <accordion_tab name="tab_online" title="Conectado"/>
+ <accordion_tab name="tab_all" title="Todos"/>
+ </accordion>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="friends_viewsort_btn" tool_tip="Opciones"/>
+ <button name="add_btn" tool_tip="Ofrecer amistad a un Residente"/>
+ <button name="del_btn" tool_tip="Quitar a la persona seleccionada de tu lista de amigos"/>
+ </panel>
+ </panel>
+ <panel label="MIS GRUPOS" name="groups_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="groups_viewsort_btn" tool_tip="Opciones"/>
+ <button name="plus_btn" tool_tip="Entrar en un grupo o crear uno"/>
+ <button name="activate_btn" tool_tip="Activar el grupo seleccionado"/>
+ </panel>
+ </panel>
+ <panel label="RECIENTE" name="recent_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="recent_viewsort_btn" tool_tip="Opciones"/>
+ <button name="add_friend_btn" tool_tip="Añadir al Residente seleccionado a la lista de tus amigos"/>
+ </panel>
+ </panel>
+ </tab_container>
+ <panel name="button_bar">
+ <button label="Perfil" name="view_profile_btn" tool_tip="Mostrar imágenes, grupos y otra información del Residente"/>
+ <button label="MI" name="im_btn" tool_tip="Abrir un mensaje instantáneo"/>
+ <button label="Llamar" name="call_btn" tool_tip="Llamar a este Residente"/>
+ <button label="Compartir" name="share_btn" tool_tip="Compartir un objeto del inventario"/>
+ <button label="Teleportar" name="teleport_btn" tool_tip="Ofrecer teleporte"/>
+ <button label="Perfil del grupo" name="group_info_btn" tool_tip="Ver la información del grupo"/>
+ <button label="Chat de grupo" name="chat_btn" tool_tip="Abrir el chat"/>
+ <button label="Multiconferencia" name="group_call_btn" tool_tip="Llamar a este grupo"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_pick_info.xml b/indra/newview/skins/default/xui/es/panel_pick_info.xml
new file mode 100644
index 0000000000..c55addbc93
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_pick_info.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_pick_info">
+ <text name="title" value="Información del destacado"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="pick_name" value="[nombre]"/>
+ <text name="pick_location" value="[cargando...]"/>
+ <text name="pick_desc" value="[descripción]"/>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <button label="Teleporte" name="teleport_btn"/>
+ <button label="Mapa" name="show_on_map_btn"/>
+ <button label="Editar" name="edit_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_picks.xml b/indra/newview/skins/default/xui/es/panel_picks.xml
new file mode 100644
index 0000000000..abedc6c551
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_picks.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Destacados" name="panel_picks">
+ <string name="no_picks" value="No hay destacados"/>
+ <string name="no_classifieds" value="No hay clasificados"/>
+ <text name="empty_picks_panel_text">
+ No hay ni destacados ni clasificados
+ </text>
+ <accordion name="accordion">
+ <accordion_tab name="tab_picks" title="Destacados"/>
+ <accordion_tab name="tab_classifieds" title="Clasificados"/>
+ </accordion>
+ <panel label="bottom_panel" name="edit_panel">
+ <button name="new_btn" tool_tip="Crear un nuevo destacado o clasificado de la posición actual"/>
+ </panel>
+ <panel name="buttons_cucks">
+ <button label="Información" name="info_btn" tool_tip="Mostrar la información del destacado"/>
+ <button label="Teleportarse" name="teleport_btn" tool_tip="Teleportar a esta zona"/>
+ <button label="Mapa" name="show_on_map_btn" tool_tip="Mostrar esta zona en el mapa del mundo"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_place_profile.xml b/indra/newview/skins/default/xui/es/panel_place_profile.xml
new file mode 100644
index 0000000000..6fe7895d45
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_place_profile.xml
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="place_profile">
+ <string name="on" value="On"/>
+ <string name="off" value="Off"/>
+ <string name="anyone" value="Cualquiera"/>
+ <string name="available" value="disponible"/>
+ <string name="allocated" value="asignados"/>
+ <string name="title_place" value="Añadir el perfil"/>
+ <string name="title_teleport_history" value="Historial de teleportes"/>
+ <string name="not_available" value="(No disp.)"/>
+ <string name="unknown" value="(desconocido)"/>
+ <string name="public" value="(público)"/>
+ <string name="none_text" value="(ninguno)"/>
+ <string name="sale_pending_text" value="(venta pendiente)"/>
+ <string name="group_owned_text" value="(propiedad de un grupo)"/>
+ <string name="price_text" value="L$"/>
+ <string name="area_text" value="m²"/>
+ <string name="all_residents_text" value="Todos los residentes"/>
+ <string name="group_text" value="Grupo"/>
+ <string name="can_resell">
+ El terreno comprado en esta región puede revenderse.
+ </string>
+ <string name="can_not_resell">
+ El terreno comprado en esta región no puede revenderse.
+ </string>
+ <string name="can_change">
+ El terreno comprado en esta región puede unirse o dividirse.
+ </string>
+ <string name="can_not_change">
+ El terreno comprado en esta región no puede unirse o dividirse.
+ </string>
+ <string name="server_update_text">
+ La información de esta parcela no está disponible sin una actualización del servidor.
+ </string>
+ <string name="server_error_text">
+ En este momento no está disponible la información de esta parcela. Por favor, inténtalo más tarde.
+ </string>
+ <string name="server_forbidden_text">
+ Por tener restringido el acceso, no está disponible la información de esta parcela. Por favor, revisa tus permisos con el propietario de la parcela.
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local][day,datetime,local] [mth,datetime,local] [year,datetime,local][hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ </string>
+ <button name="back_btn" tool_tip="Atrás"/>
+ <text name="title" value="Añadir el perfil"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="owner_label" value="Propietario:"/>
+ <text name="maturity_value" value="desconocido"/>
+ <accordion name="advanced_info_accordion">
+ <accordion_tab name="parcel_characteristics_tab" title="Parcela">
+ <panel name="parcel_characteristics_panel">
+ <text name="rating_label" value="Calificación:"/>
+ <text name="rating_value" value="desconocida"/>
+ <text name="voice_label" value="Voz:"/>
+ <text name="voice_value" value="Sí"/>
+ <text name="fly_label" value="Volar:"/>
+ <text name="fly_value" value="Sí"/>
+ <text name="push_label" value="Empujones:"/>
+ <text name="push_value" value="No"/>
+ <text name="build_label" value="Construir:"/>
+ <text name="build_value" value="Sí"/>
+ <text name="scripts_label" value="Scripts:"/>
+ <text name="scripts_value" value="Sí"/>
+ <text name="damage_label" value="Daño:"/>
+ <text name="damage_value" value="No"/>
+ <button label="Acerca del terreno" name="about_land_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="region_information_tab" title="Región">
+ <panel name="region_information_panel">
+ <text name="region_name_label" value="Región:"/>
+ <text name="region_name" value="Mooseland"/>
+ <text name="region_type_label" value="Tipo:"/>
+ <text name="region_type" value="Moose"/>
+ <text name="region_rating_label" value="Calificación:"/>
+ <text name="region_rating" value="Adulto"/>
+ <text name="region_owner_label" value="Propietario:"/>
+ <text name="region_owner" value="moose Van Moose"/>
+ <text name="region_group_label" value="Grupo:"/>
+ <text name="region_group">
+ The Mighty Moose of mooseville soundvillemoose
+ </text>
+ <button label="Región/Estado" name="region_info_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="estate_information_tab" title="Estado">
+ <panel name="estate_information_panel">
+ <text name="estate_name_label" value="Estado:"/>
+ <text name="estate_rating_label" value="Calificación:"/>
+ <text name="estate_owner_label" value="Propietario:"/>
+ <text name="covenant_label" value="Contrato:"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="sales_tab" title="En venta">
+ <panel name="sales_panel">
+ <text name="sales_price_label" value="Precio:"/>
+ <text name="area_label" value="Ãrea:"/>
+ <text name="traffic_label" value="Tráfico:"/>
+ <text name="primitives_label" value="Primitivas:"/>
+ <text name="parcel_scripts_label" value="Scripts:"/>
+ <text name="terraform_limits_label" value="Límites de modificación del terreno:"/>
+ <text name="subdivide_label" value="Puede dividirse/unirse:"/>
+ <text name="resale_label" value="Puede revenderse:"/>
+ <text name="sale_to_label" value="En venta a:"/>
+ </panel>
+ </accordion_tab>
+ </accordion>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_places.xml b/indra/newview/skins/default/xui/es/panel_places.xml
new file mode 100644
index 0000000000..d186a04f4b
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_places.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Lugares" name="places panel">
+ <string name="landmarks_tab_title" value="MIS HITOS"/>
+ <string name="teleport_history_tab_title" value="HISTORIAL DE TELEPORTES"/>
+ <filter_editor label="Filtrar mis lugares" name="Filter"/>
+ <panel name="button_panel">
+ <button label="Teleporte" name="teleport_btn" tool_tip="Teleportar a la zona elegida"/>
+ <button label="Mapa" name="map_btn" tool_tip="Mostrar esta zona en el mapa del mundo"/>
+ <button label="Editar" name="edit_btn" tool_tip="Editar la información del hito"/>
+ <button label="▼" name="overflow_btn" tool_tip="Ver más opciones"/>
+ <button label="Guardar" name="save_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ <button label="Cerrar" name="close_btn"/>
+ <button label="Perfil" name="profile_btn" tool_tip="Mostrar el perfil del lugar"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml
index 02fb4da017..d65868c0a8 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_advanced.xml
@@ -1,12 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
-<panel name="advanced">
- <text name="AspectRatioLabel1" tool_tip="ancho / alto">
- Proporción:
+<panel label="Avanzado" name="advanced">
+ <panel.string name="aspect_ratio_text">
+ [NUM]:[DEN]
+ </panel.string>
+ <panel.string name="middle_mouse">
+ Botón medio del ratón
+ </panel.string>
+ <slider label="Ãngulo de visión" name="camera_fov"/>
+ <slider label="Distancia" name="camera_offset_scale"/>
+ <text name="heading2">
+ Posición automática para:
</text>
- <combo_box name="aspect_ratio" tool_tip="ancho / alto">
- <combo_box.item label="4:3 (Standard CRT)" name="item1"/>
- <combo_box.item label="5:4 (1280x1024 LCD)" name="item2"/>
- <combo_box.item label="8:5 (Widescreen)" name="item3"/>
- <combo_box.item label="16:9 (Widescreen)" name="item4"/>
- </combo_box>
+ <check_box label="Construir/Editar" name="edit_camera_movement" tool_tip="Usar el posicionamiento automático de la cámara al entrar en o salir del modo de edición"/>
+ <check_box label="Apariencia" name="appearance_camera_movement" tool_tip="Usar el posicionamiento automático de la cámara mientras se está editando"/>
+ <check_box initial_value="true" label="Barra lateral" name="appearance_sidebar_positioning" tool_tip="Usar el posicionamiento automático de la cámara para la barra lateral"/>
+ <check_box label="Verme en vista subjetiva" name="first_person_avatar_visible"/>
+ <check_box label="Las teclas del cursor siempre para moverme" name="arrow_keys_move_avatar_check"/>
+ <check_box label="Correr siempre: atajo de teclado" name="tap_tap_hold_to_run"/>
+ <check_box label="Al hablar, mover los labios del avatar" name="enable_lip_sync"/>
+ <check_box label="Chat en bocadillos" name="bubble_text_chat"/>
+ <slider label="Opacidad" name="bubble_chat_opacity"/>
+ <color_swatch name="background" tool_tip="Elegir el color de los bocadillos del chat"/>
+ <text name="UI Size:">
+ Tamaño de la UI
+ </text>
+ <check_box label="Mostrar los errores de los scripts en:" name="show_script_errors"/>
+ <radio_group name="show_location">
+ <radio_item label="Chat" name="0"/>
+ <radio_item label="Ventanas distintas" name="1"/>
+ </radio_group>
+ <check_box label="Cambiar entre hablar on/off cuando pulse:" name="push_to_talk_toggle_check" tool_tip="En el modo &apos;un toque&apos;, pulsa y suelta el botón UNA VEZ para activar o desactivar el micrófono. Si no estás en el modo &apos;un toque&apos;, el micrófono sólo recogerá tu voz mientras mantengas pulsado el botón."/>
+ <line_editor label="Botón de Apretar para Hablar" name="modifier_combo"/>
+ <button label="Elegir la tecla" name="set_voice_hotkey_button"/>
+ <button label="Botón de en medio del ratón" name="set_voice_middlemouse_button" tool_tip="Reconfigurarlo al botón medio del ratón"/>
+ <button label="Otros dispositivos" name="joystick_setup_button"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/es/panel_preferences_alerts.xml
index a71ac172a3..f34edf149e 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_alerts.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_alerts.xml
@@ -1,18 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Ventanas emergentes" name="popups" title="Ventanas emergentes">
- <text name="dont_show_label">
- No mostrar estas ventanas emergentes:
+ <text name="tell_me_label">
+ Avisarme:
</text>
- <button width="200" label="Activar esta ventana emergente" label_selected="Activar esta popup" name="enable_popup"/>
- <button width="255" left="225" label="Activar todas las ventanas emergentes..." label_selected="Restaurar cajas de diálogo &apos;Mostrar en la próxima vez&apos;..." name="reset_dialogs_btn" tool_tip="Activar todas las ventanas emergentes y los avisos de &apos;primera vez que se usa&apos;."/>
+ <check_box label="Cuando gaste o consiga L$" name="notify_money_change_checkbox"/>
+ <check_box label="Cuando mis amigos se conecten o desconecten" name="friends_online_notify_checkbox"/>
<text name="show_label" width="300">
- Mostrar estas ventanas emergentes:
+ Mostrar siempre:
</text>
- <button left="205" width="275" label="Desactivar todas estas ventanas emergentes..." name="skip_dialogs_btn" tool_tip="Desactivar todas las ventanas emergentes y los avisos de &apos;primera vez que se usa&apos;."/>
- <text name="text_box2">
- Oferta de notas, texturas e hitos:
+ <text name="dont_show_label">
+ No mostrar nunca:
</text>
- <check_box label="Aceptar automáticamente" name="accept_new_inventory"/>
- <check_box label="Ver automáticamente tras aceptar" name="show_new_inventory"/>
- <check_box label="Mostrar automáticamente los objetos aceptados recientemente en el inventario" name="show_in_inventory"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml
index 4e9dc6db6f..fc8c908788 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml
@@ -1,17 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Chat de texto" name="chat">
- <text name="text_box">
- Tamaño de la fuente
-del chat:
+ <text name="font_size">
+ Tamaño de la fuente:
</text>
<radio_group name="chat_font_size">
- <radio_item name="radio" label="Pequeño" />
- <radio_item name="radio2" label="Medio" />
- <radio_item name="radio3" label="Grande" />
+ <radio_item label="Disminuir" name="radio" value="0"/>
+ <radio_item label="Medio" name="radio2" value="1"/>
+ <radio_item label="Aumentar" name="radio3" value="2"/>
</radio_group>
+ <text name="font_colors">
+ Colores de la fuente:
+ </text>
<color_swatch label="Usted" name="user"/>
<text name="text_box1">
- Usted
+ Yo
</text>
<color_swatch label="Otros" name="agent"/>
<text name="text_box2">
@@ -37,22 +39,21 @@ del chat:
<text name="text_box7">
Propietario
</text>
- <color_swatch label="Bocadillo" name="background"/>
- <text name="text_box8">
- Bocadillo
- </text>
<color_swatch label="URL" name="links"/>
<text name="text_box9">
URL
</text>
- <check_box label="Ver en el chat los avisos y errores de los scripts" name="script_errors_as_chat"/>
- <spinner label="Quitar el chat tras" name="fade_chat_time" label_width="95" width="145" />
- <slider label="Opacidad" name="console_opacity"/>
- <check_box label="Usar el ancho de la pantalla (tras reiniciar)" name="chat_full_width_check"/>
- <check_box label="Cerrar el chat al pulsar Intro" name="close_chat_on_return_check"/>
- <check_box label="En el chat, las teclas del cursor mueven el avatar" name="arrow_keys_move_avatar_check"/>
- <check_box label="Incluir la hora en el chat" name="show_timestamps_check"/>
- <check_box label="Ejecutar la animación de escribir al hacerlo en el chat" name="play_typing_animation"/>
- <check_box label="Mostrar el chat en bocadillos" name="bubble_text_chat"/>
- <slider label="Opacidad" name="bubble_chat_opacity"/>
+ <check_box initial_value="true" label="Ejecutar la animación de escribir al hacerlo en el chat" name="play_typing_animation"/>
+ <check_box label="Cuando estoy desconectado, enviarme los MI al correo-e" name="send_im_to_email"/>
+ <check_box label="Permitir el historial de MI y chat en texto sin formato" name="plain_text_chat_history"/>
+ <text name="show_ims_in_label">
+ Mostrar los MI en:
+ </text>
+ <text name="requires_restart_label">
+ (requiere reiniciar)
+ </text>
+ <radio_group name="chat_window" tool_tip="Muestra tus mensajes instantáneos en varias ventanas flotantes o en una sola con varias pestañas (requiere que reinicies)">
+ <radio_item label="Varias ventanas" name="radio" value="0"/>
+ <radio_item label="Pestañas" name="radio2" value="1"/>
+ </radio_group>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_general.xml b/indra/newview/skins/default/xui/es/panel_preferences_general.xml
index 2b813a18bf..ca157314aa 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_general.xml
@@ -1,90 +1,67 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="General" name="general_panel">
- <combo_box name="start_location_combo">
- <combo_box.item name="MyHome" tool_tip="Por defecto, iniciar sesión en mi Base." label="Mi Base"/>
- <combo_box.item name="MyLastLocation" tool_tip="Por defecto, iniciar sesión en mi última posición." label="Mi última posición"/>
- </combo_box>
- <check_box label="Ver mi posición inicial en la pantalla de inicio de sesión" name="show_location_checkbox"/>
- <combo_box name="fade_out_combobox">
- <combo_box.item name="Never" label="Nunca"/>
- <combo_box.item name="Show Temporarily" label="Mostrarlos temporalmente"/>
- <combo_box.item name="Always" label="Siempre"/>
- </combo_box>
- <check_box label="Nombres de avatar en pequeño" name="small_avatar_names_checkbox"/>
- <check_box label="No ver mi nombre en mi pantalla" name="show_my_name_checkbox"/>
- <text name="group_titles_textbox">
- Etiquetas de grupo:
- </text>
- <check_box label="Ocultar las etiquetas de grupo" name="show_all_title_checkbox"/>
- <check_box label="Ocultar mi etiqueta de grupo" name="show_my_title_checkbox"/>
- <color_swatch label="" name="effect_color_swatch" tool_tip="Pulse para abrir el selector de color"/>
- <text name="UI Size:">
- Tamaño de la interfaz:
+ <text name="language_textbox">
+ Idioma:
</text>
- <check_box label="Resolución independiente del tamaño" name="ui_auto_scale"/>
- <spinner label="Ausente tras:" name="afk_timeout_spinner"/>
- <check_box label="Avisar cuando gasto o recibo dólares Linden (L$)" name="notify_money_change_checkbox"/>
- <text name="maturity_desired_label">
- Calificación:
+ <combo_box name="language_combobox">
+ <combo_box.item label="Predeterminado del sistema" name="System Default Language"/>
+ <combo_box.item label="English (Inglés)" name="English"/>
+ <combo_box.item label="Dansk (Danés) - Beta" name="Danish"/>
+ <combo_box.item label="Deutsch (Alemán) - Beta" name="Deutsch(German)"/>
+ <combo_box.item label="Español - Beta" name="Spanish"/>
+ <combo_box.item label="Français (Francés) - Beta" name="French"/>
+ <combo_box.item label="Italiano - Beta" name="Italian"/>
+ <combo_box.item label="Nederlands (Neerlandés) - Beta" name="Dutch"/>
+ <combo_box.item label="Polski (Polaco) - Beta" name="Polish"/>
+ <combo_box.item label="Portugués (Portugués) - Beta" name="Portugese"/>
+ <combo_box.item label="日本語 (Japonés) - Beta" name="(Japanese)"/>
+ </combo_box>
+ <text name="language_textbox2">
+ (requiere reiniciar)
</text>
<text name="maturity_desired_prompt">
- Quiero acceder a contenido calificado:
+ Quiero acceder a contenido:
</text>
+ <text name="maturity_desired_textbox"/>
<combo_box name="maturity_desired_combobox">
- <combo_box.item name="Desired_Adult" label="&apos;PG&apos;, &apos;Mature&apos; y &apos;Adult&apos;"/>
- <combo_box.item name="Desired_Mature" label="&apos;PG&apos; y &apos;Mature&apos;"/>
- <combo_box.item name="Desired_PG" label="&apos;PG&apos;"/>
+ <combo_box.item label="&apos;PG&apos;, &apos;Mature&apos; y &apos;Adult&apos;" name="Desired_Adult"/>
+ <combo_box.item label="&apos;PG&apos; y &apos;Mature&apos;" name="Desired_Mature"/>
+ <combo_box.item label="&apos;PG&apos;" name="Desired_PG"/>
</combo_box>
- <text name="maturity_desired_textbox">
- &apos;PG&apos;
- </text>
<text name="start_location_textbox">
- Posición inicial:
+ Localización inicial:
</text>
- <text name="show_names_textbox">
- Mostrar los nombres:
+ <combo_box name="start_location_combo">
+ <combo_box.item label="Mi última posición" name="MyLastLocation" tool_tip="Por defecto, iniciar sesión en mi última posición."/>
+ <combo_box.item label="Mi Base" name="MyHome" tool_tip="Por defecto, iniciar sesión en mi Base."/>
+ </combo_box>
+ <check_box initial_value="true" label="Mostrar en la pantalla de conexión" name="show_location_checkbox"/>
+ <text name="name_tags_textbox">
+ Etiquetas de los nombres:
</text>
+ <radio_group name="Name_Tag_Preference">
+ <radio_item label="Off" name="radio" value="0"/>
+ <radio_item label="On" name="radio2" value="1"/>
+ <radio_item label="Mostrar brevemente" name="radio3" value="2"/>
+ </radio_group>
+ <check_box label="Ver yo mi nombre" name="show_my_name_checkbox1"/>
+ <check_box initial_value="true" label="Etiquetas de los avatares en pequeño" name="small_avatar_names_checkbox"/>
+ <check_box label="Mostrar las etiquetas de grupo" name="show_all_title_checkbox1"/>
<text name="effects_color_textbox">
- Color de mis efectos:
- </text>
- <text name="seconds_textbox">
- segundos
- </text>
- <text name="crash_report_textbox">
- Informes de caídas:
+ Mis efectos:
</text>
- <text name="language_textbox">
- Idioma:
+ <text name="title_afk_text">
+ Ausente tras:
</text>
- <text name="language_textbox2">
- (Tendrá efecto tras reiniciar)
- </text>
- <string name="region_name_prompt">
- &lt;escriba el nombre de la región&gt;
- </string>
- <combo_box name="crash_behavior_combobox">
- <combo_box.item name="Askbeforesending" label="Preguntar antes de enviar"/>
- <combo_box.item name="Alwayssend" label="Enviar siempre"/>
- <combo_box.item name="Neversend" label="No enviar nunca"/>
- </combo_box>
- <combo_box name="language_combobox">
- <combo_box.item name="System Default Language" label="Predeterminado del sistema"/>
- <combo_box.item name="English" label="English (Inglés)"/>
- <combo_box.item name="Danish" label="Dansk (Danés) - Beta"/>
- <combo_box.item name="Deutsch(German)" label="Deutsch (Alemán) - Beta"/>
- <combo_box.item name="Spanish" label="Español - Beta"/>
- <combo_box.item name="French" label="Français (Francés) - Beta"/>
- <combo_box.item name="Italian" label="Italiano - Beta"/>
- <combo_box.item name="Hungarian" label="Magyar (Húngaro) - Beta"/>
- <combo_box.item name="Dutch" label="Nederlands (Neerlandés) - Beta"/>
- <combo_box.item name="Polish" label="Polski (Polaco) - Beta"/>
- <combo_box.item name="Portugese" label="Portugués (Portugués) - Beta"/>
- <combo_box.item name="Russian" label="РуÑÑкий (Ruso) - Beta"/>
- <combo_box.item name="Turkish" label="Türkçe (Turco) - Beta"/>
- <combo_box.item name="Ukrainian" label="УкраїнÑька (Ucraniano) - Beta"/>
- <combo_box.item name="Chinese" label="中文 (简体) (Chino) - Beta"/>
- <combo_box.item name="(Japanese)" label="日本語 (Japonés) - Beta"/>
- <combo_box.item name="(Korean)" label="한국어 (Coreano) - Beta"/>
+ <color_swatch label="" name="effect_color_swatch" tool_tip="Pulse para abrir el selector de color"/>
+ <combo_box label="Ausente tras:" name="afk">
+ <combo_box.item label="2 minutos" name="item0"/>
+ <combo_box.item label="5 minutos" name="item1"/>
+ <combo_box.item label="10 minutos" name="item2"/>
+ <combo_box.item label="30 minutos" name="item3"/>
+ <combo_box.item label="nunca" name="item4"/>
</combo_box>
- <check_box label="Compartir el idioma con los objetos" name="language_is_public" tool_tip="Hace que los objetos con script del mundo sepan su idioma preferido."/>
+ <text name="text_box3">
+ Respuesta cuando estoy en modo ocupado:
+ </text>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml
index 4038940256..183c007a0c 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_graphics1.xml
@@ -1,42 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Gráficos" name="Display panel">
- <button label="?" name="GraphicsPreferencesHelpButton"/>
- <check_box label="Abrir Second Life en una ventana" name="windowed mode"/>
- <text_editor name="FullScreenInfo" width="480">
- Si no está marcado, el visor se mostrará en pantalla completa cuando inicie sesión.
- </text_editor>
- <text name="WindowSizeLabel">
- Tamaño de la ventana:
+ <text name="QualitySpeed">
+ Calidad y velocidad:
</text>
- <combo_box left="124" name="windowsize combo">
- <combo_box.item name="640x480" label="640x480"/>
- <combo_box.item name="800x600" label="800x600"/>
- <combo_box.item name="720x480" label="720x480 (NTSC)"/>
- <combo_box.item name="768x576" label="768x576 (PAL)"/>
- <combo_box.item name="1024x768" label="1024x768"/>
- </combo_box>
- <text name="DisplayResLabel">
- Resolución:
+ <text name="FasterText">
+ Más rápido
</text>
- <combo_box left="124" name="fullscreen combo" />
- <text name="AspectRatioLabel1" tool_tip="ancho / alto">
- Proporción:
- </text>
- <combo_box left="124" name="aspect_ratio" tool_tip="ancho / alto">
- <combo_box.item name="4:3(StandardCRT)" label="4:3 (Standard CRT)"/>
- <combo_box.item name="5:4(1280x1024LCD)" label="5:4 (1280x1024 LCD)"/>
- <combo_box.item name="8:5(Widescreen)" label="8:5 (Widescreen)"/>
- <combo_box.item name="16:9(Widescreen)" label="16:9 (Widescreen)"/>
- </combo_box>
- <check_box label="Detectar automáticamente &#10;la proporción" name="aspect_auto_detect" left="295" />
- <text name="HigherText">
- Calidad y
- </text>
- <text name="QualityText">
- Rendimiento:
- </text>
- <text name="FasterText" left="95">
- El más rápido
+ <text name="BetterText">
+ Más calidad
</text>
<text name="ShadersPrefText">
Bajo
@@ -50,97 +21,86 @@
<text name="ShadersPrefText4">
Ultra
</text>
- <text name="HigherText2" left="325" >
- Más alto
- </text>
- <text name="QualityText2" left="325" >
- calidad
- </text>
- <check_box label="Personalizar" name="CustomSettings"/>
- <panel name="CustomGraphics Panel">
- <text name="ShadersText">
- Shaders:
- </text>
- <check_box label="Efecto de relieve y brillo" name="BumpShiny"/>
- <check_box label="Shaders básicos" name="BasicShaders" tool_tip="Desactivando esta opción puede prevenir fallos en algunos controladores de la tarjeta gráfica."/>
- <check_box label="Shaders de la atmósfera" name="WindLightUseAtmosShaders"/>
- <check_box label="Reflejos en el agua" name="Reflections"/>
- <text name="ReflectionDetailText">
- Objetos reflejados:
- </text>
- <radio_group name="ReflectionDetailRadio">
- <radio_item name="0" label="Terreno y árboles" />
- <radio_item name="1" label="Todos los objetos estáticos" />
- <radio_item name="2" label="Todos los avatares y objetos" />
- <radio_item name="3" label="Todo" />
- </radio_group>
- <text name="AvatarRenderingText">
- Renderización del avatar:
- </text>
- <check_box label="Avatares simulados" name="AvatarImpostors"/>
- <check_box label="Renderizado por hardware" name="AvatarVertexProgram"/>
- <check_box label="Ropas del avatar" name="AvatarCloth"/>
- <text name="DrawDistanceMeterText1">
- m
- </text>
- <text name="DrawDistanceMeterText2">
- m
- </text>
- <slider label="Distancia de dibujo:" name="DrawDistance"/>
- <slider label="Núm. máx. de partículas:" name="MaxParticleCount"/>
- <slider label="Calidad del procesamiento:" name="RenderPostProcess" label_width="142"/>
- <text name="MeshDetailText">
- Detalle de la malla:
- </text>
- <slider label=" Objetos:" name="ObjectMeshDetail"/>
- <slider label=" Prims flexibles:" name="FlexibleMeshDetail"/>
- <slider label=" Ãrboles:" name="TreeMeshDetail"/>
- <slider label=" Avatares:" name="AvatarMeshDetail"/>
- <slider label=" Terreno:" name="TerrainMeshDetail"/>
- <slider label=" Cielo:" name="SkyMeshDetail"/>
- <text name="PostProcessText">
- Baja
- </text>
- <text name="ObjectMeshDetailText">
- Bajo
- </text>
- <text name="FlexibleMeshDetailText">
- Bajo
- </text>
- <text name="TreeMeshDetailText">
- Bajo
- </text>
- <text name="AvatarMeshDetailText">
- Bajo
- </text>
- <text name="TerrainMeshDetailText">
- Bajo
- </text>
- <text name="SkyMeshDetailText">
- Bajo
- </text>
- <text name="LightingDetailText" width="135">
- Detalles de la iluminación:
- </text>
- <radio_group name="LightingDetailRadio">
- <radio_item name="SunMoon" label="Sólo el Sol y la Luna" />
- <radio_item name="LocalLights" label="Puntos de luz cercanos" />
- </radio_group>
- <text name="TerrainDetailText">
- Nivel de detalle del
- terreno:
- </text>
- <radio_group name="TerrainDetailRadio" left_delta="60">
- <radio_item name="0" label="Bajo" />
- <radio_item name="2" label="Alto" />
- </radio_group>
+ <panel label="CustomGraphics" name="CustomGraphics Panel">
+ <text name="ShadersText">
+ Shaders:
+ </text>
+ <check_box initial_value="true" label="Efecto de relieve y brillo" name="BumpShiny"/>
+ <check_box initial_value="true" label="Shaders básicos" name="BasicShaders" tool_tip="Desactivando esta opción puede prevenir fallos en algunos controladores de la tarjeta gráfica."/>
+ <check_box initial_value="true" label="Shaders de la atmósfera" name="WindLightUseAtmosShaders"/>
+ <check_box initial_value="true" label="Reflejos en el agua" name="Reflections"/>
+ <text name="ReflectionDetailText">
+ Objetos reflejados:
+ </text>
+ <radio_group name="ReflectionDetailRadio">
+ <radio_item label="Terreno y árboles" name="0"/>
+ <radio_item label="Todos los objetos estáticos" name="1"/>
+ <radio_item label="Todos los avatares y objetos" name="2"/>
+ <radio_item label="Todo" name="3"/>
+ </radio_group>
+ <text name="AvatarRenderingText">
+ Renderización del avatar:
+ </text>
+ <check_box initial_value="true" label="Avatares simulados" name="AvatarImpostors"/>
+ <check_box initial_value="true" label="Renderizado por hardware" name="AvatarVertexProgram"/>
+ <check_box initial_value="true" label="Ropas del avatar" name="AvatarCloth"/>
+ <slider label="Distancia de dibujo:" name="DrawDistance"/>
+ <text name="DrawDistanceMeterText2">
+ m
+ </text>
+ <slider label="Núm. máx. de partículas:" name="MaxParticleCount"/>
+ <slider label="Distancia de dibujo máxima del avatar:" name="MaxAvatarDrawDistance"/>
+ <text name="DrawDistanceMeterText3">
+ m
+ </text>
+ <slider label="Calidad de procesamiento:" name="RenderPostProcess"/>
+ <text name="MeshDetailText">
+ Detalle de la malla:
+ </text>
+ <slider label=" Objetos:" name="ObjectMeshDetail"/>
+ <slider label=" Prims flexibles:" name="FlexibleMeshDetail"/>
+ <slider label=" Ãrboles:" name="TreeMeshDetail"/>
+ <slider label=" Avatares:" name="AvatarMeshDetail"/>
+ <slider label=" Terreno:" name="TerrainMeshDetail"/>
+ <slider label=" Cielo:" name="SkyMeshDetail"/>
+ <text name="PostProcessText">
+ Baja
+ </text>
+ <text name="ObjectMeshDetailText">
+ Bajo
+ </text>
+ <text name="FlexibleMeshDetailText">
+ Bajo
+ </text>
+ <text name="TreeMeshDetailText">
+ Bajo
+ </text>
+ <text name="AvatarMeshDetailText">
+ Bajo
+ </text>
+ <text name="TerrainMeshDetailText">
+ Bajo
+ </text>
+ <text name="SkyMeshDetailText">
+ Bajo
+ </text>
+ <text name="LightingDetailText">
+ Detalles de iluminación:
+ </text>
+ <radio_group name="LightingDetailRadio">
+ <radio_item label="Sólo el Sol y la Luna" name="SunMoon" value="0"/>
+ <radio_item label="Puntos de luz cercanos" name="LocalLights" value="1"/>
+ </radio_group>
+ <text name="TerrainDetailText">
+ Detalle del terreno:
+ </text>
+ <radio_group name="TerrainDetailRadio">
+ <radio_item label="Bajo" name="0"/>
+ <radio_item label="Alto" name="2"/>
+ </radio_group>
</panel>
- <button label="Configuraciones recomendadas" name="Defaults" width="195" left="110"/>
- <button label="Opciones del hardware" label_selected="Opciones del hardware" name="GraphicsHardwareButton" left="315"/>
- <panel.string name="resolution_format">
- [RES_X] x [RES_Y]
- </panel.string>
- <panel.string name="aspect_ratio_text">
- [NUM]:[DEN]
- </panel.string>
+ <button label="Aplicar" label_selected="Aplicar" name="Apply"/>
+ <button label="Por defecto" name="Defaults"/>
+ <button label="Avanzado" name="Advanced"/>
+ <button label="Hardware" label_selected="Hardware" left="315" name="GraphicsHardwareButton"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml
index cbaa3d96ee..bf2c6b7aa6 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_privacy.xml
@@ -1,34 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Comunicación" name="im">
- <text name="text_box">
- Mi estado de conexión:
+ <panel.string name="log_in_to_change">
+ Conéctate para que cambie
+ </panel.string>
+ <button label="Limpiar el historial" name="clear_cache" tool_tip="Limpia la imagen de la pantalla de conexión, la última posición, el historial de teleportes, web y caché de las texturas."/>
+ <text name="cache_size_label_l">
+ (Localizaciones, imágenes, web, historial de búsqueda)
</text>
- <check_box label="Sólo pueden ver si estoy conectado mis amigos y grupos" name="online_visibility"/>
- <text name="text_box2">
- Opciones de los MI:
+ <check_box label="Sólo saben si estoy conectado mis amigos y grupos" name="online_visibility"/>
+ <check_box label="Sólo pueden llamarme o mandarme un MI mis amigos y grupos" name="voice_call_friends_only_check"/>
+ <check_box label="Desconectar el micrófono cuando finalicen las llamadas" name="auto_disengage_mic_check"/>
+ <check_box label="Aceptar las &apos;cookies&apos;" name="cookies_enabled"/>
+ <text name="Logs:">
+ Registros:
</text>
- <string name="log_in_to_change">
- inicie sesión para cambiar
- </string>
- <check_box label="Enviar MI al correo electrónico ([EMAIL])" name="send_im_to_email"/>
- <check_box label="Incluir los MI en la consola del chat" name="include_im_in_chat_console"/>
- <check_box label="Incluir la hora en los MI" name="show_timestamps_check"/>
- <check_box label="Avisar si se conecta un amigo" name="friends_online_notify_checkbox"/>
- <text name="text_box3">
- Mensaje en el estado
-ocupado:
+ <check_box label="Guardar en mi ordenador registros del chat" name="log_nearby_chat"/>
+ <check_box label="Guardar en mi ordenador registros de los MI" name="log_instant_messages"/>
+ <check_box label="Añadir fecha y hora" name="show_timestamps_check_im"/>
+ <text name="log_path_desc">
+ Ruta de los registros:
</text>
- <text name="text_box4">
- Opciones de los
-registros:
- </text>
- <check_box label="Guardar un registro de los MI en mi ordenador" name="log_instant_messages"/>
- <check_box label="Incluir la hora en el registro de los MI" name="log_instant_messages_timestamp"/>
- <check_box label="Mostrar el final de la última conversación por MI" name="log_show_history"/>
- <check_box label="Guardar un registro del chat en mi ordenador" name="log_chat"/>
- <check_box label="Incluir la hora en el registro del chat" name="log_chat_timestamp"/>
- <check_box label="Mostrar en el chat la llegada de los MI" name="log_chat_IM"/>
- <check_box label="Incluir la fecha junto a la hora" name="log_date_timestamp"/>
- <button label="Cambiar la ruta" label_selected="Cambiar la ruta" name="log_path_button" width="120"/>
<line_editor left="278" name="log_path_string" right="-20"/>
+ <button label="Elegir" label_selected="Elegir" name="log_path_button" width="120"/>
+ <button label="Lista de ignorados" name="block_list"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml
index 967626b8d5..88f5ba42b5 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_setup.xml
@@ -1,32 +1,49 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Dispositivos y Cámara" name="Input panel">
- <text name=" Mouselook Options:">
+<panel label="Configurar" name="Input panel">
+ <button bottom_delta="-40" label="Otros dispositivos" name="joystick_setup_button"/>
+ <text name="Mouselook:">
Vista subjetiva:
</text>
- <text name=" Mouse Sensitivity:">
- Sensibilidad del ratón:
+ <text name=" Mouse Sensitivity">
+ Sensibilidad del ratón
</text>
- <check_box label="Invertir el ratón" name="invert_mouse"/>
- <text name=" Auto Fly Options:">
- Vuelo:
+ <check_box label="Invertir" name="invert_mouse"/>
+ <text name="Network:">
+ Red:
</text>
- <check_box label="Despegar/Aterrizar pulsando RePág/AvPág" name="automatic_fly"/>
- <text name=" Camera Options:">
- Opciones de la cámara:
+ <text name="Maximum bandwidth">
+ Ancho de banda máximo
</text>
- <text name="camera_fov_label" width="218">
- Ãngulo de vista de la cámara:
+ <text name="text_box2">
+ kbps
</text>
- <slider bottom_delta="-6" width="128" left="326" name="camera_fov" />
- <text name="Camera Follow Distance:" width="218">
- Distancia a la que sigue la cámara:
+ <check_box label="Personalizar el puerto" name="connection_port_enabled"/>
+ <spinner label="Nº del puerto:" name="connection_port"/>
+ <text name="cache_size_label_l">
+ Tamaño de la caché
</text>
- <slider bottom_delta="-6" width="128" left="326" name="camera_offset_scale" />
- <check_box label="Reorientar la cámara al editar" name="edit_camera_movement" tool_tip="Usar la reorientación automática de la cámara al entrar y salir del modo de edición"/>
- <check_box label="Reorientar la cámara al modificar la apariencia" name="appearance_camera_movement" tool_tip="Usar la reorientación automática de la cámara mientras se modifica la apariencia"/>
- <text name="text2">
- Visualización del avatar:
+ <text name="text_box5">
+ MB
</text>
- <check_box label="Ver el avatar en vista subjetiva" name="first_person_avatar_visible"/>
- <button bottom_delta="-40" label="Configurar el joystick" name="joystick_setup_button"/>
+ <text name="Cache location">
+ Localización de la caché:
+ </text>
+ <button label="Elegir" label_selected="Elegir" name="set_cache"/>
+ <button label="Recuperar" label_selected="Reconfigurar" name="reset_cache"/>
+ <text name="Web:">
+ Web:
+ </text>
+ <radio_group name="use_external_browser">
+ <radio_item label="Usar mi navegador (IE, Firefox, Safari)" name="external" tool_tip="Usa tu navegador por defecto para ayuda, enlaces web, etc. No es aconsejable si estás a pantalla completa." value="1"/>
+ <radio_item label="Usar el navegador incorporado" name="internal" tool_tip="Usa el navegador incorporado para ayuda, enlaces web, etc. Este navegador se abre en una nueva ventana dentro de [APP_NAME]." value=""/>
+ </radio_group>
+ <check_box label="Activar plugins" name="browser_plugins_enabled"/>
+ <check_box label="Aceptar las &apos;cookies&apos;" name="cookies_enabled"/>
+ <check_box label="Activar Javascript" name="browser_javascript_enabled"/>
+ <check_box label="Activar web proxy" name="web_proxy_enabled"/>
+ <text name="Proxy location">
+ Localización del proxy:
+ </text>
+ <line_editor name="web_proxy_editor" tool_tip="Nombre o dirección IP del proxy que quieres usar"/>
+ <spinner label="Nº del puerto:" name="web_proxy_port"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml
index 241f3042fe..2d3c76d215 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_sound.xml
@@ -1,38 +1,45 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Audio y Vídeo" name="Preference Media panel">
- <slider label="General" name="System Volume"/>
+<panel label="Sonidos" name="Preference Media panel">
+ <slider label="Volumen general" name="System Volume"/>
+ <check_box label="Silenciar cuando minimice" name="mute_when_minimized"/>
+ <slider label="Botones" name="UI Volume"/>
<slider label="Ambiental" name="Wind Volume"/>
- <slider label="Sonidos" name="SFX Volume"/>
- <slider label="Media" name="Media Volume"/>
- <slider label="Interfaz" name="UI Volume"/>
- <slider label="Música" name="Music Volume"/>
- <slider label="Voz" name="Voice Volume"/>
- <text_editor name="voice_unavailable">
- El chat de voz no está disponible
- </text_editor>
- <check_box label="Activar el chat de voz" name="enable_voice_check"/>
- <radio_group name="ear_location">
- <radio_item name="0" label="Oír el chat desde la posición de la cámara." />
- <radio_item name="1" label="Oír el chat desde la posición del avatar." />
- </radio_group>
- <button label="Configuración de los dispositivos" name="device_settings_btn" width="210" />
- <text name="muting_text">
- Volumen:
- </text>
- <text name="streaming_prefs_text">
- Preferencias multimedia:
+ <slider label="Efectos de sonido" name="SFX Volume"/>
+ <slider label="Música en streaming" name="Music Volume"/>
+ <check_box label="Activada" name="music_enabled"/>
+ <slider label="Multimedia" name="Media Volume"/>
+ <check_box label="Activada" name="enable_media"/>
+ <slider label="Chat de voz" name="Voice Volume"/>
+ <check_box label="Activado" name="enable_voice_check"/>
+ <check_box label="Permitir la ejecución automática de los media" name="media_auto_play_btn" tool_tip="Marcar esto para permitir la ejecución automática de los media"/>
+ <check_box label="Ejecutar para otros avatares los media anexados" name="media_show_on_others_btn" tool_tip="Al desmarcar esto se esconderán los media anexados a otros avatares cercanos"/>
+ <text name="voice_chat_settings">
+ Configuración del chat de voz
</text>
- <text name="audio_prefs_text">
- Preferencias de sonido:
+ <text name="Listen from">
+ Oír desde:
</text>
- <panel label="Volumen" name="Volume Panel"/>
- <check_box label="Si hay música, reproducirla en streaming" name="streaming_music"/>
- <check_box label="Si hay media, reproducirlos en streaming" name="streaming_video"/>
- <check_box label="Reproducir automáticamente los media" name="auto_streaming_video"/>
- <check_box label="Silenciar el sonido al minimizar la ventana" name="mute_when_minimized"/>
- <slider label="Efecto Doppler" name="Doppler Effect" label_width="140" width="270" />
- <slider label="Distancia de escucha" name="Distance Factor" label_width="140" width="270" />
- <slider label="Nivel de atenuación" name="Rolloff Factor" label_width="140" width="270" />
- <spinner label="Avisar de transacción de L$ desde" name="L$ Change Threshold" label_width="195" width="259"/>
- <spinner label="Avisar del estado de la vida desde" name="Health Change Threshold" label_width="195" width="259"/>
+ <radio_group name="ear_location">
+ <radio_item label="La posición de la cámara" name="0"/>
+ <radio_item label="La posición del avatar" name="1"/>
+ </radio_group>
+ <button label="Dispositivos de entrada y salida" name="device_settings_btn" width="210"/>
+ <panel label="Configuración de dispositivos" name="device_settings_panel">
+ <panel.string name="default_text">
+ Por defecto
+ </panel.string>
+ <text name="Input">
+ Entrada
+ </text>
+ <text name="My volume label">
+ Mi volumen:
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Cambia el volumen usando este deslizable"/>
+ <text name="wait_text">
+ Por favor, espera
+ </text>
+ <text name="Output">
+ Salida
+ </text>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/es/panel_prim_media_controls.xml
new file mode 100644
index 0000000000..174922e28e
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_prim_media_controls.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="MediaControls">
+ <string name="min_width">
+ 300
+ </string>
+ <string name="min_height">
+ 75
+ </string>
+ <string name="zoom_medium_padding">
+ 1.1
+ </string>
+ <string name="top_world_view_avoid_zone">
+ 50
+ </string>
+ <layout_stack name="progress_indicator_area">
+ <panel name="media_progress_indicator">
+ <progress_bar name="media_progress_bar" tool_tip="Los media se están cargando"/>
+ </panel>
+ </layout_stack>
+ <layout_stack name="media_controls">
+ <layout_panel name="back">
+ <button name="back_btn" tool_tip="Navegar hacia atrás"/>
+ </layout_panel>
+ <layout_panel name="fwd">
+ <button name="fwd_btn" tool_tip="Navegar hacia adelante"/>
+ </layout_panel>
+ <layout_panel name="home">
+ <button name="home_btn" tool_tip="Página inicial"/>
+ </layout_panel>
+ <layout_panel name="media_stop">
+ <button name="media_stop_btn" tool_tip="Parar los media"/>
+ </layout_panel>
+ <layout_panel name="reload">
+ <button name="reload_btn" tool_tip="Recargar"/>
+ </layout_panel>
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="Parar la carga"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="Ejecutar los media"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="Pausar los media"/>
+ </layout_panel>
+ <layout_panel name="media_address">
+ <line_editor name="media_address_url" tool_tip="URL de los media"/>
+ <layout_stack name="media_address_url_icons">
+ <layout_panel>
+ <icon name="media_whitelist_flag" tool_tip="Lista Blanca activada"/>
+ </layout_panel>
+ <layout_panel>
+ <icon name="media_secure_lock_flag" tool_tip="Navegación segura"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="media_play_position">
+ <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="Progreso de la película"/>
+ </layout_panel>
+ <layout_panel name="skip_back">
+ <button name="skip_back_btn" tool_tip="Hacia atrás"/>
+ </layout_panel>
+ <layout_panel name="skip_forward">
+ <button name="skip_forward_btn" tool_tip="Hacia adelante"/>
+ </layout_panel>
+ <layout_panel name="media_volume">
+ <button name="media_mute_button" tool_tip="Silenciar este media"/>
+ <slider name="volume_slider" tool_tip="Volumen de los media"/>
+ </layout_panel>
+ <layout_panel name="zoom_frame">
+ <button name="zoom_frame_btn" tool_tip="Zoom hacia los media"/>
+ </layout_panel>
+ <layout_panel name="close">
+ <button name="close_btn" tool_tip="Alejar el zoom"/>
+ </layout_panel>
+ <layout_panel name="new_window">
+ <button name="new_window_btn" tool_tip="Abrir la URL en el navegador"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_profile.xml b/indra/newview/skins/default/xui/es/panel_profile.xml
index 218e03dcce..d725bfe618 100644
--- a/indra/newview/skins/default/xui/es/panel_profile.xml
+++ b/indra/newview/skins/default/xui/es/panel_profile.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_profile">
+<panel label="Perfil" name="panel_profile">
<string name="CaptionTextAcctInfo">
[ACCTTYPE]
[PAYMENTINFO] [AGEVERIFICATION]
@@ -11,4 +11,42 @@
http://www.secondlife.com/account/partners.php?lang=es
</string>
<string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=es-ES"/>
+ <string name="no_partner_text" value="Ninguno"/>
+ <string name="no_group_text" value="Ninguno"/>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <layout_stack name="layout">
+ <layout_panel name="profile_stack">
+ <scroll_container name="profile_scroll">
+ <panel name="profile_scroll_panel">
+ <panel name="second_life_image_panel">
+ <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <text name="title_rw_descr_text" value="Mundo real:"/>
+ </panel>
+ <text name="title_member_text" value="Residente desde:"/>
+ <text name="title_acc_status_text" value="Estado de la cuenta:"/>
+ <text name="title_partner_text" value="Compañero/a:"/>
+ <panel name="partner_data_panel">
+ <name_box initial_value="(obteniendo)" name="partner_text"/>
+ </panel>
+ <text name="title_groups_text" value="Grupos:"/>
+ </panel>
+ </scroll_container>
+ </layout_panel>
+ <layout_panel name="profile_buttons_panel">
+ <button label="Añadir como amigo" name="add_friend" tool_tip="Ofrecer amistad a este Residente"/>
+ <button label="MI" name="im" tool_tip="Abrir una sesión de mensajes instantáneos"/>
+ <button label="Llamar" name="call" tool_tip="Llamar a este Residente"/>
+ <button label="Mapa" name="show_on_map_btn" tool_tip="Mostrar al Residente en el mapa"/>
+ <button label="Teleportar" name="teleport" tool_tip="Ofrecer teleporte"/>
+ <button label="▼" name="overflow_btn" tool_tip="Pagar dinero al Residente o compartir algo del inventario con él"/>
+ </layout_panel>
+ <layout_panel name="profile_me_buttons_panel">
+ <button label="Editar el perfil" name="edit_profile_btn" tool_tip="Modificar tu información personal"/>
+ <button label="Modificar la apariencia" name="edit_appearance_btn" tool_tip="Crear o modificar tu apariencia: tu físico, ropas, etc."/>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_profile_view.xml b/indra/newview/skins/default/xui/es/panel_profile_view.xml
new file mode 100644
index 0000000000..b556346051
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_profile_view.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_target_profile">
+ <string name="status_online">
+ Conectado/a
+ </string>
+ <string name="status_offline">
+ Desconectado/a
+ </string>
+ <text_editor name="user_name" value="(Cargando...)"/>
+ <text name="status" value="Conectado/a"/>
+ <tab_container name="tabs">
+ <panel label="PERFIL" name="panel_profile"/>
+ <panel label="DESTACADOS" name="panel_picks"/>
+ <panel label="NOTAS Y PRIVACIDAD" name="panel_notes"/>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_region_covenant.xml b/indra/newview/skins/default/xui/es/panel_region_covenant.xml
index 220479098b..0a5d7c2786 100644
--- a/indra/newview/skins/default/xui/es/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/es/panel_region_covenant.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Contrato" name="Covenant">
<text name="estate_section_lbl">
- Estado:
+ Estado
</text>
<text name="estate_name_lbl">
Nombre:
@@ -22,7 +22,7 @@
Última modificación el miér. 31 de dic. de 1969, 16:00:00
</text>
<button label="?" name="covenant_help"/>
- <text_editor name="covenant_editor" bottom="-263" height="178" >
+ <text_editor bottom="-263" height="178" name="covenant_editor">
No se ha aportado un contrato para este estado.
</text_editor>
<button label="Cambiar" name="reset_covenant"/>
@@ -30,11 +30,11 @@
Los cambios en el contrato se mostrarán en todas las parcelas
del estado.
</text>
- <text name="covenant_instructions" bottom_delta="-31" >
- Para cambiar el contrato de este estado, arrastre y suelte una nota.
+ <text bottom_delta="-31" name="covenant_instructions">
+ Arrastra y suelta una nota para cambiar el contrato de este estado.
</text>
<text name="region_section_lbl">
- Región:
+ Región
</text>
<text name="region_name_lbl">
Nombre:
diff --git a/indra/newview/skins/default/xui/es/panel_region_debug.xml b/indra/newview/skins/default/xui/es/panel_region_debug.xml
index a7999cc54d..64162220a6 100644
--- a/indra/newview/skins/default/xui/es/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/es/panel_region_debug.xml
@@ -7,11 +7,11 @@
desconocida
</text>
<check_box label="Desactivar los scripts" name="disable_scripts_check" tool_tip="Descativar todos los scripts en esta región"/>
- <button label="?" name="disable_scripts_help" left="215"/>
+ <button label="?" left="215" name="disable_scripts_help"/>
<check_box label="Desactivar las colisiones" name="disable_collisions_check" tool_tip="Desactiva las colisiones (no las de avatares) en esta región"/>
- <button label="?" name="disable_collisions_help" left="215"/>
+ <button label="?" left="215" name="disable_collisions_help"/>
<check_box label="Desactivar las propiedades físicas" name="disable_physics_check" tool_tip="Desactiva toda la física en esta región"/>
- <button label="?" name="disable_physics_help" left="215"/>
+ <button label="?" left="215" name="disable_physics_help"/>
<button label="Aplicar" name="apply_btn"/>
<text name="objret_text_lbl" width="130">
Devolver el objeto
@@ -22,18 +22,18 @@
<line_editor name="target_avatar_name">
(nadie)
</line_editor>
- <button label="Elegir..." name="choose_avatar_btn"/>
+ <button label="Elegir" name="choose_avatar_btn"/>
<text name="options_text_lbl">
Opciones:
</text>
- <check_box label="Devolver sólo los objetos con scripts" name="return_scripts" tool_tip="Devolver sólo los objetos que tengan scripts."/>
- <check_box label="Devolver sólo los objetos que están en terreno de otro" name="return_other_land" tool_tip="Devolver sólo los objetos que están en terreno de otro"/>
- <check_box label="Devolver los objetos de cualquier región de este estado" name="return_estate_wide" tool_tip="Devolver los objetos de todas las regiones que forman este estado"/>
+ <check_box label="Con scripts" name="return_scripts" tool_tip="Devolver sólo los objetos con scripts"/>
+ <check_box label="En el terreno de otros" name="return_other_land" tool_tip="Devolver sólo los objetos que están en terreno de otro"/>
+ <check_box label="En cada región de este estado" name="return_estate_wide" tool_tip="Devolver los objetos de todas las regiones que forman este estado"/>
<button label="Devolver" name="return_btn"/>
- <button width="280" label="Listar los objetos que colisionan..." name="top_colliders_btn" tool_tip="Lista de los objetos con más posibles colisiones potenciales"/>
- <button label="?" name="top_colliders_help" left="297"/>
- <button width="280" label="Listar los scripts según su uso..." name="top_scripts_btn" tool_tip="Lista de los objetos que más tiempo emplean ejecutando scripts"/>
- <button label="?" name="top_scripts_help" left="297"/>
+ <button label="Listar los objetos que colisionan..." name="top_colliders_btn" tool_tip="Lista de los objetos con más posibles colisiones potenciales" width="280"/>
+ <button label="?" left="297" name="top_colliders_help"/>
+ <button label="Listar los scripts según su uso..." name="top_scripts_btn" tool_tip="Lista de los objetos que más tiempo emplean ejecutando scripts" width="280"/>
+ <button label="?" left="297" name="top_scripts_help"/>
<button label="Reiniciar la región" name="restart_btn" tool_tip="Cuenta atrás de 2 minutos y reiniciar la región"/>
<button label="?" name="restart_help"/>
<button label="Retrasar el reinicio" name="cancel_restart_btn" tool_tip="Retrasar una hora el reinicio de la región"/>
diff --git a/indra/newview/skins/default/xui/es/panel_region_estate.xml b/indra/newview/skins/default/xui/es/panel_region_estate.xml
index f16ec89cb0..c51c3815d1 100644
--- a/indra/newview/skins/default/xui/es/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/es/panel_region_estate.xml
@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Estado" name="Estate">
<text name="estate_help_text">
- Los cambios en las configuraciones de esta
-pestaña afectarán a todas las regiones del estado.
+ En esta pestaña, los cambios en la configuración afectarán a todas las regiones del estado.
</text>
<text name="estate_text">
Estado:
@@ -11,7 +10,7 @@ pestaña afectarán a todas las regiones del estado.
(desconocido)
</text>
<text name="owner_text">
- Propietario:
+ Propietario del Estado:
</text>
<text name="estate_owner">
(desconocido)
@@ -24,10 +23,10 @@ pestaña afectarán a todas las regiones del estado.
<check_box label="Permitir el acceso público" name="externally_visible_check"/>
<button label="?" name="externally_visible_help"/>
<text name="Only Allow">
- Impedir el acceso a Residentes...
+ Restringir el acceso a cuentas verificadas por:
</text>
- <check_box label="sin información de pago archivada" name="limit_payment" tool_tip="Impedir el acceso a los residentes no identificados."/>
- <check_box label="que no han verificado si son adultos" name="limit_age_verified" tool_tip="Impedir el acceso a residentes que no hayan verificado su edad. Para más información, vea support.secondlife.com"/>
+ <check_box label="Información de pago aportada" name="limit_payment" tool_tip="Expulsa a los Residentes no identificados."/>
+ <check_box label="Verificación de la edad" name="limit_age_verified" tool_tip="Expulsa a los Residentes que no hayan verificado su edad. Más información en [SUPPORT_SITE]."/>
<check_box label="Permitir el chat de voz" name="voice_chat_check"/>
<button label="?" name="voice_chat_help"/>
<check_box label="Permitir el teleporte a cualquier punto" name="allow_direct_teleport"/>
@@ -40,7 +39,7 @@ pestaña afectarán a todas las regiones del estado.
</string>
<button label="?" name="abuse_email_address_help"/>
<button label="Aplicar" name="apply_btn"/>
- <button label="Echar usuarios del estado..." name="kick_user_from_estate_btn"/>
+ <button label="Expulsar a un Residente del Estado..." name="kick_user_from_estate_btn"/>
<button label="Enviar un mensaje al estado..." name="message_estate_btn"/>
<text name="estate_manager_label">
Administradores del estado:
diff --git a/indra/newview/skins/default/xui/es/panel_region_general.xml b/indra/newview/skins/default/xui/es/panel_region_general.xml
index ca8da6ccaf..fe7f51c74e 100644
--- a/indra/newview/skins/default/xui/es/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/es/panel_region_general.xml
@@ -19,35 +19,25 @@
desconocido
</text>
<check_box label="No permitir modificar el terreno" name="block_terraform_check"/>
- <button label="?" name="terraform_help"/>
<check_box label="Prohibir volar" name="block_fly_check"/>
- <button label="?" name="fly_help"/>
<check_box label="Permitir el daño" name="allow_damage_check"/>
- <button label="?" name="damage_help"/>
<check_box label="Impedir los &apos;empujones&apos;" name="restrict_pushobject"/>
- <button label="?" name="restrict_pushobject_help"/>
<check_box label="Permitir la reventa del terreno" name="allow_land_resell_check"/>
- <button label="?" name="land_resell_help"/>
<check_box label="Permitir unir/dividir el terreno" name="allow_parcel_changes_check"/>
- <button label="?" name="parcel_changes_help"/>
- <check_box label="Bloquear el mostrar el terreno en &#10;la búsqueda." name="block_parcel_search_check" tool_tip="Permitir que la gente vea esta región y sus parcelas en los resultados de la búsqueda."/>
- <button label="?" name="parcel_search_help"/>
- <spinner label="Nº máximo de avatares" name="agent_limit_spin" label_width="120" width="180"/>
- <button label="?" name="agent_limit_help"/>
- <spinner label="Plus de objetos" name="object_bonus_spin" label_width="120" width="180"/>
- <button label="?" name="object_bonus_help"/>
+ <check_box label="Bloquear el mostrar el terreno en la búsqueda" name="block_parcel_search_check" tool_tip="Permitir que la gente vea esta región y sus parcelas en los resultados de la búsqueda."/>
+ <spinner label="Nº máximo de avatares" label_width="120" name="agent_limit_spin" width="180"/>
+ <spinner label="Plus de objetos" label_width="120" name="object_bonus_spin" width="180"/>
<text label="Calificación" name="access_text">
Calificación:
</text>
- <combo_box label="&apos;Mature&apos;" name="access_combo">
- <combo_box.item label="&apos;Adult&apos;" name="Adult"/>
- <combo_box.item label="&apos;Mature&apos;" name="Mature"/>
- <combo_box.item label="&apos;PG&apos;" name="PG"/>
- </combo_box>
- <button label="?" name="access_help"/>
+ <icons_combo_box label="Moderado" name="access_combo">
+ <icons_combo_box.item label="Adulto" name="Adult" value="42"/>
+ <icons_combo_box.item label="Moderado" name="Mature" value="21"/>
+ <icons_combo_box.item label="General" name="PG" value="13"/>
+ </icons_combo_box>
<button label="Aplicar" name="apply_btn"/>
- <button label="Teleportar a su Base a un usuario..." name="kick_btn"/>
- <button label="Teleportar a su Base a todos los usuarios..." name="kick_all_btn"/>
- <button label="Enviar un mensaje a toda la región..." name="im_btn" width="250" />
+ <button label="Teleportar a su Base a un Residente..." name="kick_btn"/>
+ <button label="Teleportar a sus Bases a todos los Residentes..." name="kick_all_btn"/>
+ <button label="Enviar un mensaje a toda la región..." name="im_btn" width="250"/>
<button label="Administrar el Punto de Teleporte..." name="manage_telehub_btn" width="210"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_region_general_layout.xml b/indra/newview/skins/default/xui/es/panel_region_general_layout.xml
new file mode 100644
index 0000000000..9ff88e2f79
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_region_general_layout.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Región" name="General">
+ <text name="region_text_lbl">
+ Región:
+ </text>
+ <text name="region_text">
+ desconocida
+ </text>
+ <text name="version_channel_text_lbl">
+ Versión:
+ </text>
+ <text name="version_channel_text">
+ desconocida
+ </text>
+ <text name="region_type_lbl">
+ Tipo:
+ </text>
+ <text name="region_type">
+ desconocido
+ </text>
+ <check_box label="No permitir modificar el terreno" name="block_terraform_check"/>
+ <check_box label="Prohibir volar" name="block_fly_check"/>
+ <check_box label="Permitir el daño" name="allow_damage_check"/>
+ <check_box label="Impedir los &apos;empujones&apos;" name="restrict_pushobject"/>
+ <check_box label="Permitir la reventa del terreno" name="allow_land_resell_check"/>
+ <check_box label="Permitir unir/dividir el terreno" name="allow_parcel_changes_check"/>
+ <check_box label="Bloquear el mostrar el terreno en la búsqueda" name="block_parcel_search_check" tool_tip="Permite que la gente vea esta región y sus parcelas en los resultados de la búsqueda"/>
+ <spinner label="Nº máximo de avatares" name="agent_limit_spin"/>
+ <spinner label="Plus de objetos" name="object_bonus_spin"/>
+ <text label="Calificación" name="access_text">
+ Calificación:
+ </text>
+ <combo_box label="Moderado" name="access_combo">
+ <combo_box.item label="Adulto" name="Adult"/>
+ <combo_box.item label="Moderado" name="Mature"/>
+ <combo_box.item label="General" name="PG"/>
+ </combo_box>
+ <button label="Aplicar" name="apply_btn"/>
+ <button label="Teleportar a su Base a un Residente..." name="kick_btn"/>
+ <button label="Teleportar a sus Bases a todos los Residentes..." name="kick_all_btn"/>
+ <button label="Enviar un mensaje a toda la región..." name="im_btn"/>
+ <button label="Administrar el Punto de Teleporte..." name="manage_telehub_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_region_texture.xml b/indra/newview/skins/default/xui/es/panel_region_texture.xml
index 5540358f97..047e8f2f30 100644
--- a/indra/newview/skins/default/xui/es/panel_region_texture.xml
+++ b/indra/newview/skins/default/xui/es/panel_region_texture.xml
@@ -25,16 +25,16 @@
Rangos de la elevación de la textura
</text>
<text name="height_text_lbl6">
- Suroeste
+ Noroeste
</text>
<text name="height_text_lbl7">
- Noroeste
+ Noreste
</text>
<text name="height_text_lbl8">
- Sureste
+ Suroeste
</text>
<text name="height_text_lbl9">
- Noreste
+ Sureste
</text>
<spinner label="Baja" name="height_start_spin_0"/>
<spinner label="Baja" name="height_start_spin_1"/>
@@ -48,7 +48,7 @@
Estos valores representan la gama de mezclas para las texturas superiores.
</text>
<text name="height_text_lbl11">
- Midiendo en metros, el valor BAJA es la altura MÃXIMA de la textura #1,
+ Midiendo en metros, el valor BAJA es la altura MÃXIMA de la textura #1, y el valor ALTA es la altura MÃNIMA de la textura #4.
</text>
<text name="height_text_lbl12">
y el valor ALTA es la altura MÃNIMA de la textura #4.
diff --git a/indra/newview/skins/default/xui/es/panel_script_ed.xml b/indra/newview/skins/default/xui/es/panel_script_ed.xml
new file mode 100644
index 0000000000..c73db729fe
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_script_ed.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="script panel">
+ <panel.string name="loading">
+ Cargando...
+ </panel.string>
+ <panel.string name="can_not_view">
+ No puedes ver ni editar este script. Ha sido configurado como &quot;no copiable&quot;. Necesitas todos los permisos para ver o editar un script que está dentro de un objeto.
+ </panel.string>
+ <panel.string name="public_objects_can_not_run">
+ Los objetos públicos no pueden ejecutar scripts
+ </panel.string>
+ <panel.string name="script_running">
+ Ejecutándose
+ </panel.string>
+ <panel.string name="Title">
+ Script: [NAME]
+ </panel.string>
+ <text_editor name="Script Editor">
+ Cargando...
+ </text_editor>
+ <button label="Guardar" label_selected="Guardar" name="Save_btn"/>
+ <combo_box label="Insertar..." name="Insert..."/>
+ <menu_bar name="script_menu">
+ <menu label="Archivo" name="File">
+ <menu_item_call label="Guardar" name="Save"/>
+ <menu_item_call label="Deshacer todos los cambios" name="Revert All Changes"/>
+ </menu>
+ <menu label="Editar" name="Edit">
+ <menu_item_call label="Deshacer" name="Undo"/>
+ <menu_item_call label="Rehacer" name="Redo"/>
+ <menu_item_call label="Cortar" name="Cut"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+ <menu_item_call label="Pegar" name="Paste"/>
+ <menu_item_call label="Seleccionar todo" name="Select All"/>
+ <menu_item_call label="Deseleccionar" name="Deselect"/>
+ <menu_item_call label="Buscar / Reemplazar..." name="Search / Replace..."/>
+ </menu>
+ <menu label="Ayuda" name="Help">
+ <menu_item_call label="Ayuda..." name="Help..."/>
+ <menu_item_call label="Ayuda de palabras clave..." name="Keyword Help..."/>
+ </menu>
+ </menu_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/es/panel_script_limits_my_avatar.xml
new file mode 100644
index 0000000000..9334d58af2
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_script_limits_my_avatar.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="MI AVATAR" name="script_limits_my_avatar_panel">
+ <text name="script_memory">
+ Uso de scripts en el avatar
+ </text>
+ <text name="loading_text">
+ Cargando...
+ </text>
+ <scroll_list name="scripts_list">
+ <scroll_list.columns label="Tamaño (kb)" name="size"/>
+ <scroll_list.columns label="URLs" name="urls"/>
+ <scroll_list.columns label="Nombre del objeto" name="name"/>
+ <scroll_list.columns label="Localización" name="location"/>
+ </scroll_list>
+ <button label="Actualizar la lista" name="refresh_list_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/es/panel_script_limits_region_memory.xml
new file mode 100644
index 0000000000..37dc0a576c
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_script_limits_region_memory.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="MEMORIA DE LA REGIÓN" name="script_limits_region_memory_panel">
+ <text name="script_memory">
+ Memoria de los scripts de la parcela
+ </text>
+ <text name="loading_text">
+ Cargando...
+ </text>
+ <scroll_list name="scripts_list">
+ <scroll_list.columns label="Tamaño (kb)" name="size"/>
+ <scroll_list.columns label="URLs" name="urls"/>
+ <scroll_list.columns label="Nombre del objeto" name="name"/>
+ <scroll_list.columns label="Propietario del objeto" name="owner"/>
+ <scroll_list.columns label="Parcela" name="parcel"/>
+ <scroll_list.columns label="Localización" name="location"/>
+ </scroll_list>
+ <button label="Actualizar la lista" name="refresh_list_btn"/>
+ <button label="Realzar" name="highlight_btn"/>
+ <button label="Devolver" name="return_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_side_tray.xml b/indra/newview/skins/default/xui/es/panel_side_tray.xml
new file mode 100644
index 0000000000..cf5afb3cd1
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_side_tray.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray cannot show background because it is always
+ partially on screen to hold tab buttons. -->
+<side_tray name="sidebar">
+ <sidetray_tab description="Manejar la barra lateral." name="sidebar_openclose" tab_title="Barra lateral"/>
+ <sidetray_tab description="Inicio." name="sidebar_home" tab_title="Inicio">
+ <panel label="Inicio" name="panel_home"/>
+ </sidetray_tab>
+ <sidetray_tab description="Edita tu perfil público y tus destacados." name="sidebar_me" tab_title="Mi perfil">
+ <panel_container name="panel_container">
+ <panel label="Yo" name="panel_me"/>
+ </panel_container>
+ </sidetray_tab>
+ <sidetray_tab description="Encuentra a tus amigos, contactos y gente que esté cerca." name="sidebar_people" tab_title="Gente">
+ <panel_container name="panel_container">
+ <panel label="Perfil del grupo" name="panel_group_info_sidetray"/>
+ <panel label="Residentes y objetos ignorados" name="panel_block_list_sidetray"/>
+ </panel_container>
+ </sidetray_tab>
+ <sidetray_tab description="Encontrar lugares donde ir o que ya visitaste." label="Lugares" name="sidebar_places" tab_title="Lugares">
+ <panel label="Lugares" name="panel_places"/>
+ </sidetray_tab>
+ <sidetray_tab description="Mira tu inventario." name="sidebar_inventory" tab_title="Mi inventario">
+ <panel label="Modificar el inventario" name="sidepanel_inventory"/>
+ </sidetray_tab>
+ <sidetray_tab description="Cambia tu apariencia y tu &apos;look&apos; actual." name="sidebar_appearance" tab_title="Mi apariencia">
+ <panel label="Modificar la apariencia" name="sidepanel_appearance"/>
+ </sidetray_tab>
+</side_tray>
diff --git a/indra/newview/skins/default/xui/es/panel_side_tray_tab_caption.xml b/indra/newview/skins/default/xui/es/panel_side_tray_tab_caption.xml
new file mode 100644
index 0000000000..3633b0ccaa
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_side_tray_tab_caption.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="sidetray_tab_panel">
+ <text name="sidetray_tab_title" value="Panel lateral"/>
+ <button name="show_help" tool_tip="Ver ayuda"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/es/panel_stand_stop_flying.xml
new file mode 100644
index 0000000000..350aec9c69
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_stand_stop_flying.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml-->
+<panel name="panel_stand_stop_flying">
+ <button label="Levantarme" name="stand_btn" tool_tip="Pulsa aquí para levantarte."/>
+ <button label="Dejar de volar" name="stop_fly_btn" tool_tip="Dejar de volar"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_status_bar.xml b/indra/newview/skins/default/xui/es/panel_status_bar.xml
index 31cde7d237..13ed1acf0b 100644
--- a/indra/newview/skins/default/xui/es/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/es/panel_status_bar.xml
@@ -1,38 +1,33 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="status">
- <text name="ParcelNameText" tool_tip="Nombre de la parcela en la que está. Pulse Acerca del terreno.">
- el nombre de la parcela va aquí
- </text>
- <text name="BalanceText" tool_tip="Saldo de su cuenta">
- Cargando...
- </text>
- <button label="" label_selected="" name="buycurrency" tool_tip="Comprar dinero"/>
- <text name="TimeText" tool_tip="Hora actual (costa oeste EE.UU.)">
- 12:00 AM
- </text>
- <string name="StatBarDaysOfWeek">
+ <panel.string name="StatBarDaysOfWeek">
Domingo:Lunes:Martes:Miércoles:Jueves:Viernes:Sábado
- </string>
- <string name="StatBarMonthsOfYear">
+ </panel.string>
+ <panel.string name="StatBarMonthsOfYear">
Enero:Febrero:Marzo:Abril:Mayo:Junio:Julio:Agosto:Septiembre:Octubre:Noviembre:Diciembre
- </string>
- <button label="" label_selected="" name="scriptout" tool_tip="Errores y alertas de los scripts"/>
- <button label="" label_selected="" name="health" tool_tip="Vida"/>
- <text name="HealthText" tool_tip="Vida">
- 100%
- </text>
- <button label="" label_selected="" name="no_fly" tool_tip="Prohibido volar"/>
- <button label="" label_selected="" name="no_build" tool_tip="No se permite Construir/Renderizar"/>
- <button label="" label_selected="" name="no_scripts" tool_tip="No se permiten los scripts"/>
- <button label="" label_selected="" name="restrictpush" tool_tip="Sin &apos;empujones&apos;"/>
- <button label="" label_selected="" name="status_no_voice" tool_tip="Aquí no está disponible la voz"/>
- <button label="" label_selected="" name="buyland" tool_tip="Comprar esta parcela"/>
- <line_editor label="Buscar" name="search_editor" tool_tip="Buscar en [SECOND_LIFE]"/>
- <button label="" label_selected="" name="search_btn" tool_tip="Buscar en [SECOND_LIFE]"/>
- <string name="packet_loss_tooltip">
+ </panel.string>
+ <panel.string name="packet_loss_tooltip">
Pérdida de paquetes
- </string>
- <string name="bandwidth_tooltip">
+ </panel.string>
+ <panel.string name="bandwidth_tooltip">
Ancho de banda
- </string>
+ </panel.string>
+ <panel.string name="time">
+ [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+ </panel.string>
+ <panel.string name="timeTooltip">
+ [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+ </panel.string>
+ <panel.string name="buycurrencylabel">
+ [AMT] L$
+ </panel.string>
+ <panel name="balance_bg">
+ <text name="balance" tool_tip="Mi saldo" value="20 L$"/>
+ <button label="COMPRAR L$" name="buyL" tool_tip="Pulsa para comprar más L$"/>
+ </panel>
+ <text name="TimeText" tool_tip="Hora actual (Pacífico)">
+ 24:00 AM PST
+ </text>
+ <button name="media_toggle_btn" tool_tip="Iniciar/Parar todos los media (música, vídeo, páginas web)"/>
+ <button name="volume_btn" tool_tip="Control general del volumen"/>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_teleport_history.xml b/indra/newview/skins/default/xui/es/panel_teleport_history.xml
new file mode 100644
index 0000000000..a0ee30e8f6
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_teleport_history.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Teleport History">
+ <accordion name="history_accordion">
+ <accordion_tab name="today" title="Hoy"/>
+ <accordion_tab name="yesterday" title="Ayer"/>
+ <accordion_tab name="2_days_ago" title="Hace 2 días"/>
+ 5
+ <accordion_tab name="3_days_ago" title="Hace 3 días"/>
+ <accordion_tab name="4_days_ago" title="Hace 4 días"/>
+ <accordion_tab name="5_days_ago" title="Hace 5 días"/>
+ <accordion_tab name="6_days_and_older" title="6 y más días"/>
+ <accordion_tab name="1_month_and_older" title="1 mes y más"/>
+ <accordion_tab name="6_months_and_older" title="6 y más meses"/>
+ </accordion>
+ <panel name="bottom_panel">
+ <button name="gear_btn" tool_tip="Ver más opciones"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/es/panel_teleport_history_item.xml
new file mode 100644
index 0000000000..10b37b6880
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_teleport_history_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="teleport_history_item">
+ <button name="profile_btn" tool_tip="Mostrar la información del ítem"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_voice_effect.xml b/indra/newview/skins/default/xui/es/panel_voice_effect.xml
new file mode 100644
index 0000000000..2cc36b7cae
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/panel_voice_effect.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_voice_effect">
+ <string name="no_voice_effect">
+ Sin transformación de voz
+ </string>
+ <string name="preview_voice_effects">
+ Probar transformación de voz ▶
+ </string>
+ <string name="get_voice_effects">
+ Obtener transformación de voz ▶
+ </string>
+ <combo_box name="voice_effect" tool_tip="Selecciona un efecto de transformación de voz para cambiar tu voz.">
+ <combo_box.item label="Sin transformación de voz" name="no_voice_effect"/>
+ </combo_box>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_world_map.xml b/indra/newview/skins/default/xui/es/panel_world_map.xml
index 7cb4009422..b1dea02210 100644
--- a/indra/newview/skins/default/xui/es/panel_world_map.xml
+++ b/indra/newview/skins/default/xui/es/panel_world_map.xml
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="world_map">
+ <panel.string name="Loading">
+ Cargando...
+ </panel.string>
+ <panel.string name="InvalidLocation">
+ Localización inválida
+ </panel.string>
<panel.string name="world_map_north">
N
</panel.string>
@@ -24,6 +30,12 @@
<panel.string name="world_map_northwest">
NO
</panel.string>
+ <panel.string name="world_map_person">
+ 1 persona
+ </panel.string>
+ <panel.string name="world_map_people">
+ [NUMBER] personas
+ </panel.string>
<text label="N" name="floater_map_north" text="N">
N
</text>
diff --git a/indra/newview/skins/default/xui/es/role_actions.xml b/indra/newview/skins/default/xui/es/role_actions.xml
index da9a820eb8..14df3d67ca 100644
--- a/indra/newview/skins/default/xui/es/role_actions.xml
+++ b/indra/newview/skins/default/xui/es/role_actions.xml
@@ -1,199 +1,76 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<role_actions>
- <action_set
- description="Estas capacidades incluyen poderes para añadir o quitar miembros del grupo, y para pemitir que se sumen nuevos miembros sin necesidad de invitación."
- name="Membership">
- <action description="Invitar personas al grupo"
- longdescription="Invitar a personas al grupo usando el botón &apos;Invitar a un nuevo miembro&apos; en Miembros y Roles &gt; subpestaña Miembros."
- name="member invite" value="1" />
- <action description="Expulsar a miembros del grupo"
- longdescription="Expulsar a miembros del grupo usando el botón &apos;Expulsar del grupo&apos; en Miembros y Roles &gt; subpestaña Miembros. Un propietario puede expulsar a cualquiera, excepto a otro propietario. Si usted no es un propietario, un miembro del grupo puede expulsarle sólo si tiene concedida tal capacidad específica. Para quitar capacidades a los miembros, usted debe tener la de &apos;Quitar capacidades a miembros&apos;."
- name="member eject" value="2" />
- <action
- description="Activar/desactivar &apos;Inscripción libre&apos; y cambiar &apos;Cuota de inscripción&apos;"
- longdescription="Activar/desactivar &apos;Inscripción libre&apos; para permitir o no que se unan sin invitación nuevos miembros, y cambiar la &apos;Cuota de inscripción&apos; en la sección Preferencias del grupo de la pestaña General."
- name="member options" value="3" />
+ <action_set description="Estas capacidades incluyen poderes para añadir o quitar miembros del grupo, y para pemitir que se sumen nuevos miembros sin necesidad de invitación." name="Membership">
+ <action description="Invitar personas al grupo" longdescription="Invitar a gente a este grupo usando el botón &apos;Invitar&apos; en la sección Roles &gt; pestaña Miembros." name="member invite" value="1"/>
+ <action description="Expulsar a miembros del grupo" longdescription="Expulsar a miembros de este grupo usando el botón &apos;Expulsar&apos; en la sección Roles &gt; pestaña Miembros. Un propietario puede expulsar a cualquiera, excepto a otro propietario. Si no eres un propietario, un miembro puede ser expulsado única y exclusivamente si está en el rol de Cualquiera y NO en otros roles. Para quitar roles a los miembros, tienes que tener la capacidad de &apos;Quitar roles a los miembros&apos;." name="member eject" value="2"/>
+ <action description="Cambiar &apos;Inscripción abierta&apos; y &apos;Cuota de inscripción&apos;" longdescription="En la sección General, cambiar la &apos;Inscripción abierta&apos; -que permite entrar al grupo sin invitación- y la &apos;Cuota de inscripción&apos;." name="member options" value="3"/>
</action_set>
- <action_set
- description="Estas habilidades incluyen el poder añadir, quitar y cambiar roles, asignarlos a miembros, y darles capacidades."
- name="Roles">
- <action description="Crear nuevos roles"
- longdescription="Crear nuevos roles en Miembros y Roles &gt; pestaña Roles &gt; botón Crear un rol nuevo."
- name="role create" value="4" />
- <action description="Borrar roles"
- longdescription="Borrar roles en Miembros y Roles &gt; pestaña Roles &gt; botón Eliminar el rol."
- name="role delete" value="5" />
- <action description="Cambiar nombres de roles, títulos y descripciones"
- longdescription="Cambiar el nombre del rol que elija, su etiqueta y descripción en la parte media de la pestaña Miembros y Roles."
- name="role properties" value="6" />
- <action description="Designar miembros para el rol del asignador"
- longdescription="Designar miembros para un rol en la sección Roles asignados de la pestaña Miembros y Roles &gt; subpestaña Miembros. Un miembro con este poder sólo puede asignar a otros el rol que él posee."
- name="role assign member limited" value="7" />
- <action description="Designar miembros para cualquier rol"
- longdescription="Designar miembros para cualquier rol en la sección Roles asignados de la pestaña Miembros y Roles &gt; subpestaña Miembros. *AVISO* Todos los miembros con esta capacidad podrán asignarse a sí mismos -y a otros miembros- roles con mayores poderes de los que actualmente tienen. Potencialmente, podrían elevarse hasta poderes cercanos a los del propietario. Asegúrese de lo que está haciendo antes de otorgar esta capacidad."
- name="role assign member" value="8" />
- <action description="Quitar capacidades a los miembros"
- longdescription="Quitar capacidades a los miembros en la sección Capacidades asignadas de Miembros y Roles &gt; subpestaña Roles. No se pueden quitar a los Propietarios."
- name="role remove member" value="9" />
- <action description="Añadir o quitar capacidades a los roles"
- longdescription="Añadir o quitar capacidades a los roles en la sección Capacidades asignadas de Miembros y Roles &gt; subpestaña Roles. *AVISO* Todos los miembros con esta capacidad podrán asignarse a sí mismos -y a otros miembros- roles con mayores poderes de los que actualmente tienen. Potencialmente, podrían elevarse hasta poderes cercanos a los del propietario. Asegúrese de lo que está haciendo antes de otorgar esta capacidad."
- name="role change actions" value="10" />
+ <action_set description="Estas habilidades incluyen el poder añadir, quitar y cambiar roles, asignarlos a miembros, y darles capacidades." name="Roles">
+ <action description="Crear nuevos roles" longdescription="Crear roles nuevos en la sección Roles &gt; pestaña Roles." name="role create" value="4"/>
+ <action description="Borrar roles" longdescription="Borrar roles en la sección Roles &gt; pestaña Roles." name="role delete" value="5"/>
+ <action description="Cambiar el nombre, la etiqueta y la descripción de los roles, así como qué miembros se muestran públicamente en ese rol" longdescription="Cambiar el nombre, la etiqueta y la descripción de los roles, así como qué miembros se muestran públicamente en ese rol. Se hace seleccionando el rol, dentro de la sección Roles &gt; pestaña Roles." name="role properties" value="6"/>
+ <action description="Designar miembros para el rol del asignador" longdescription="Añadir miembros a los roles en la lista de Roles asignados (sección Roles &gt; pestaña Miembros). Un miembro con esta capacidad sólo puede añadir miembros a los roles que tenga él mismo." name="role assign member limited" value="7"/>
+ <action description="Designar miembros para cualquier rol" longdescription="Designar miembros para cualquier rol en la lista de Roles asignados (sección Roles &gt; pestaña Miembros). *AVISO* Todos los miembros que tengan un rol con esta capacidad podrán asignarse a sí mismos -y a otros miembros que no sean los propietarios- roles con mayores poderes de los que actualmente tienen. Potencialmente, podrían elevarse hasta poderes cercanos a los del propietario. Asegúrate de lo que estás haciendo antes de otorgar esta capacidad." name="role assign member" value="8"/>
+ <action description="Quitar capacidades a los miembros" longdescription="Quitar miembros de los roles en la lista de roles asignados (sección Roles &gt; pestaña Miembros). No se puede quitar a los Propietarios." name="role remove member" value="9"/>
+ <action description="Añadir o quitar capacidades a los roles" longdescription="Asignar y quitar capacidades a cada rol en la lista de capacidades permitidas (sección Roles &gt; pestaña Roles). *AVISO* Todos los miembros que tengan un rol con esta capacidad podrán asignarse a sí mismos -y a otros miembros que no sean los propietarios- todas las capacidades. Potencialmente, podrían elevarse hasta poderes cercanos a los del propietario. Asegúrate de lo que estás haciendo antes de otorgar esta capacidad." name="role change actions" value="10"/>
</action_set>
- <action_set
- description="Estas capacidades incluyen poderes para modificar la identidad del grupo, como su visibilidad pública, su carta o su emblema."
- name="Group Identity">
- <action
- description="Cambiar la carta, emblema, &apos;Mostrar en la búsqueda&apos;, y qué miembros serán visibles en la información del grupo"
- longdescription="Cambiar la carta, emblema, &apos;Mostrar en la búsqueda&apos;, y qué miembros serán visibles en la información del grupo de la pestaña General."
- name="group change identity" value="11" />
+ <action_set description="Estas capacidades incluyen poderes para modificar la identidad del grupo, como su visibilidad pública, su carta o su emblema." name="Group Identity">
+ <action description="Cambiar la carta, emblema, &apos;Mostrar en la búsqueda&apos;, y qué miembros serán visibles en la información del grupo" longdescription="Cambia la carta, emblema y &apos;Mostrar en la búsqueda&apos;. Se hace en la sección General." name="group change identity" value="11"/>
</action_set>
- <action_set
- description="Estas capacidades incluyen poderes para transferir, modificar y vender terrenos del grupo. Vea el menú Mundo &gt; Acerca del terreno, o pulse con el botón derecho en el terreno y seleccione &apos;Acerca del terreno...&apos;, o pulse en la información de la parcela en la barra superior del menú."
- name="Parcel Management">
- <action description="Transferir y comprar terreno para el grupo"
- longdescription="Transferir y comprar terreno para el grupo. Se hace en Acerca del terreno &gt; pestaña General."
- name="land deed" value="12" />
- <action description="Abandonar al terreno a favor de Governor Linden"
- longdescription="Abandonar al terreno a favor de Governor Linden. *AVISO* Todos los miembros con esta capacidad pueden abandonar terreno perteneciente al grupo en Acerca del terreno &gt; pestaña General, devolviendo la posesión a Linden ¡gratuitamente! Asegúrese de lo que está haciendo antes de otorgar esta capacidad."
- name="land release" value="13" />
- <action description="Vender terreno"
- longdescription="Vender terreno. *AVISO* Todos los miembros con esta capacidad pueden vender terreno perteneciente al grupo -¡en la forma en que quieran!- en Acerca del terreno &gt; pestaña General. Asegúrese de lo que está haciendo antes de otorgar esta capacidad."
- name="land set sale info" value="14" />
- <action description="Dividir y unir parcelas"
- longdescription="Dividir y unir parcelas. Se hace pulsando con el botón derecho en el terreno, &apos;Modificar el terreno&apos;, y dibujando en el terreno con el ratón lo que se quiere seleccionar. Para dividir, elija la parte que quiere separar y pulse &apos;Subdividir...&apos;. Para unir, seleccione dos o más parcelas contiguas y pulse &apos;Unir...&apos;. "
- name="land divide join" value="15" />
+ <action_set description="Estas capacidades incluyen poder para transferir, modificar y vender terrenos del grupo. Para ver la ventana Acerca del terreno, pulsa con el botón derecho en el terreno y selecciona &apos;Acerca del terreno&apos;, o pulsa en el signo &apos;i&apos; de la barra de navegación." name="Parcel Management">
+ <action description="Transferir y comprar terreno para el grupo" longdescription="Transferir y comprar terreno para el grupo. Se hace en Acerca del terreno &gt; pestaña General." name="land deed" value="12"/>
+ <action description="Abandonar al terreno a favor de Governor Linden" longdescription="Abandonar al terreno a favor de Governor Linden. *AVISO* Todos los miembros con esta capacidad pueden abandonar terreno perteneciente al grupo en Acerca del terreno &gt; pestaña General, devolviendo la posesión a Linden ¡gratuitamente! Asegúrese de lo que está haciendo antes de otorgar esta capacidad." name="land release" value="13"/>
+ <action description="Vender terreno" longdescription="Vender terreno. *AVISO* Todos los miembros con esta capacidad pueden vender terreno perteneciente al grupo -¡en la forma en que quieran!- en Acerca del terreno &gt; pestaña General. Asegúrese de lo que está haciendo antes de otorgar esta capacidad." name="land set sale info" value="14"/>
+ <action description="Dividir y unir parcelas" longdescription="Dividir y unir parcelas. Se hace pulsando con el botón derecho en el terreno, &apos;Modificar el terreno&apos;, y dibujando en el terreno con el ratón lo que se quiere seleccionar. Para dividir, elige la parte que quieres separar y pulsa &apos;Dividir&apos;. Para unir, selecciona dos o más parcelas contiguas y pulsa &apos;Unir&apos;." name="land divide join" value="15"/>
</action_set>
- <action_set
- description="Estas capacidades incluyen poder cambiar el nombre de la parcela y su configuración, así como si se muestra en Buscar y las opciones del punto de llegada y el de teleporte."
- name="Parcel Identity">
- <action
- description="Activar/desactivar &apos;Mostrar en Buscar&apos; y el definir la categoría"
- longdescription="Activar/desactivar el &apos;Mostrar en Buscar&apos; y en que categoría se mostrará en Acerca del terreno &gt; pestaña Opciones."
- name="land find places" value="17" />
- <action
- description="Cambiar el nombre de la parcela, la descripción, y la configuración de &apos;Mostrar en Buscar&apos;"
- longdescription="Cambiar el nombre y descripción de la parcela, y la configuración de &apos;Mostrar en Buscar&apos;. Se hace en Acerca del terreno &gt; pestaña Opciones."
- name="land change identity" value="18" />
- <action description="Definir los puntos de llegada y teleporte"
- longdescription="En una parcela perteneciente al grupo, los miembros con un rol que tenga esta capacidad pueden precisar el punto de llegada o el de teleporte. Se hace en Acerca del terreno &gt; pestaña Opciones."
- name="land set landing point" value="19" />
+ <action_set description="Estas capacidades incluyen poder cambiar el nombre de la parcela y su configuración, así como si se muestra en Buscar y las opciones del punto de llegada y el de teleporte." name="Parcel Identity">
+ <action description="Cambiar &apos;Mostrar el sitio en Buscar&apos; y configurar la categoría" longdescription="Cambia &apos;Mostrar el sitio en Buscar&apos; y el configurar la categoría de una parcela en Acerca del terreno &gt; pestaña Opciones." name="land find places" value="17"/>
+ <action description="Cambiar el nombre de la parcela, su descripción, y la configuración de &apos;Mostrar el sitio en Buscar&apos;" longdescription="Cambia el nombre de la parcela, su descripción, y la configuración de &apos;Mostrar el sitio en Buscar&apos;. Se hace en Acerca del terreno &gt; pestaña Opciones." name="land change identity" value="18"/>
+ <action description="Definir los puntos de llegada y teleporte" longdescription="En una parcela perteneciente al grupo, los miembros con un rol que tenga esta capacidad pueden precisar el punto de llegada o el de teleporte. Se hace en Acerca del terreno &gt; pestaña Opciones." name="land set landing point" value="19"/>
</action_set>
- <action_set
- description="Estas capacidades incluyen poderes que afectan a las opciones de la parcela, como &apos;Crear objetos&apos;, &apos;Editar el terreno&apos; y las configuraciones de la música y los media."
- name="Parcel Settings">
- <action description="Cambiar música y configuraciones de los media"
- longdescription="Cambiar la música en streaming y las configuraciones de vídeo en Acerca del terreno &gt; pestaña Media."
- name="land change media" value="20" />
- <action description="Activar/desactivar &apos;Editar el terreno&apos;"
- longdescription="Activar/desactivar &apos;Editar el terreno&apos;. *AVISO* Acerca del terreno &gt; pestaña Opciones &gt; Editar el terreno, permite a cualquiera alterar la forma de su terreno y sustituir y mover plantas Linden. Asegúrese de lo que está haciendo antes de otorgar esta capacidad. La edición del terreno se activada/desactiva en Acerca del terreno &gt; pestaña Opciones."
- name="land edit" value="21" />
- <action
- description="Activar/desactivar varios ítems de Acerca del terreno &gt; Opciones"
- longdescription="Activar/desactivar en un terreno del grupo los ítems de Acerca del terreno &gt; pestaña Opciones: &apos;Seguro (sin daño)&apos;, &apos;Volar&apos;, y permitir a otros residentes: &apos;Crear objetos&apos;, &apos;Editar el terreno&apos;, &apos;Crear hitos&apos;, y &apos;Ejecutar scripts&apos;."
- name="land options" value="22" />
+ <action_set description="Estas capacidades incluyen poderes que afectan a las opciones de la parcela, como &apos;Crear objetos&apos;, &apos;Editar el terreno&apos; y las configuraciones de la música y los media." name="Parcel Settings">
+ <action description="Cambiar música y configuraciones de los media" longdescription="Cambiar la música en streaming y las configuraciones de vídeo en Acerca del terreno &gt; pestaña Media." name="land change media" value="20"/>
+ <action description="Activar/desactivar &apos;Editar el terreno&apos;" longdescription="Activar/desactivar &apos;Editar el terreno&apos;. *AVISO* Acerca del terreno &gt; pestaña Opciones &gt; Editar el terreno, permite a cualquiera alterar la forma de su terreno y sustituir y mover plantas Linden. Asegúrese de lo que está haciendo antes de otorgar esta capacidad. La edición del terreno se activada/desactiva en Acerca del terreno &gt; pestaña Opciones." name="land edit" value="21"/>
+ <action description="Activar/desactivar varios ítems de Acerca del terreno &gt; Opciones" longdescription="Cambia &apos;Seguro (sin daño)&apos;, &apos;Volar&apos;, y el permitir a otros residentes en terrenos propiedad del grupo &apos;Modificar el terreno&apos;, &apos;Construir&apos;, &apos;Crear hitos&apos; y &apos;Ejecutat scripts&apos;, como aparece en Acerca del terreno &gt; pestaña Opciones." name="land options" value="22"/>
</action_set>
- <action_set
- description="Estas capacidades incluyen poderes que permiten a los miembros rebasar las restricciones de parcelas pertenecientes al grupo."
- name="Parcel Powers">
- <action description="Permitir siempre &apos;Editar el terreno&apos;"
- longdescription="Quien tenga un rol con esta capacidad puede editar el terreno de una parcela perteneciente al grupo aunque eso esté desactivado en Acerca del terreno &gt; pestaña Opciones."
- name="land allow edit land" value="23" />
- <action description="Permitir siempre &apos;Volar&apos;"
- longdescription="Quien tenga un rol con esta capacidad puede volar sobre una parcela perteneciente al grupo aunque eso esté desactivado en Acerca del terreno &gt; pestaña Opciones."
- name="land allow fly" value="24" />
- <action description="Permitir siempre &apos;Crear objetos&apos;"
- longdescription="Quien tenga un rol con esta capacidad puede crear objetos en una parcela perteneciente al grupo aunque eso esté desactivado en Acerca del terreno &gt; pestaña Opciones."
- name="land allow create" value="25" />
- <action description="Permitir siempre &apos;Crear hitos&apos;"
- longdescription="Quien tenga un rol con esta capacidad puede crear un hito en una parcela perteneciente al grupo aunque eso esté desactivado en Acerca del terreno &gt; pestaña Opciones."
- name="land allow landmark" value="26" />
- <action description="Permitir &apos;Fijar mi Base aquí&apos; en el terreno del grupo"
- longdescription="Quien tenga un rol con esta capacidad puede usar el menú Mundo &gt; Fijar mi Base aquí en una parcela transferida al grupo."
- name="land allow set home" value="28" />
+ <action_set description="Estas capacidades incluyen poderes que permiten a los miembros rebasar las restricciones de parcelas pertenecientes al grupo." name="Parcel Powers">
+ <action description="Permitir siempre &apos;Editar el terreno&apos;" longdescription="Quien tenga un rol con esta capacidad puede editar el terreno de una parcela perteneciente al grupo aunque eso esté desactivado en Acerca del terreno &gt; pestaña Opciones." name="land allow edit land" value="23"/>
+ <action description="Permitir siempre &apos;Volar&apos;" longdescription="Quien tenga un rol con esta capacidad puede volar sobre una parcela perteneciente al grupo aunque eso esté desactivado en Acerca del terreno &gt; pestaña Opciones." name="land allow fly" value="24"/>
+ <action description="Permitir siempre &apos;Crear objetos&apos;" longdescription="Quien tenga un rol con esta capacidad puede crear objetos en una parcela perteneciente al grupo aunque eso esté desactivado en Acerca del terreno &gt; pestaña Opciones." name="land allow create" value="25"/>
+ <action description="Permitir siempre &apos;Crear hitos&apos;" longdescription="Quien tenga un rol con esta capacidad puede crear un hito en una parcela perteneciente al grupo aunque eso esté desactivado en Acerca del terreno &gt; pestaña Opciones." name="land allow landmark" value="26"/>
+ <action description="Permitir &apos;Fijar mi Base aquí&apos; en el terreno del grupo" longdescription="Los miembros que tengan un rol con esta capacidad pueden usar el menú Mundo &gt; Hitos &gt; Fijar aquí mi Base en una parcela transferida al grupo." name="land allow set home" value="28"/>
</action_set>
- <action_set
- description="Estas capacidades incluyen poderes para permitir o restringir el acceso a parcelas pertenecientes al grupo, incluyendo el congelar y expulsar a residentes."
- name="Parcel Access">
- <action description="Administrar las listas de acceso a la parcela"
- longdescription="Administre las listas de acceso a la parcela en Acerca del terreno &gt; pestaña Acceso."
- name="land manage allowed" value="29" />
- <action description="Administrar la lista de residentes con el acceso prohibido"
- longdescription="Administrar la lista de residentes con el acceso prohibido a la parcela en Acerca del terreno &gt; pestaña Acceso."
- name="land manage banned" value="30" />
- <action description="Cambiar en las configuraciones de parcela el &apos;Vender pases a...&apos;"
- longdescription="Cambiar la configuración de &apos;Vender pases a...&apos; en Acerca del terreno &gt; pestaña Acceso."
- name="land manage passes" value="31" />
- <action description="Expulsar y congelar residentes en las parcelas"
- longdescription="Quien tenga un rol con esta capacidad puede actuar frente a un residente indeseado en una parcela del grupo pulsando con el botón derecho sobre él, Más &gt; y seleccionando &apos;Expulsar...&apos; o &apos;Congelar...&apos;."
- name="land admin" value="32" />
+ <action_set description="Estas capacidades incluyen poderes para permitir o restringir el acceso a parcelas pertenecientes al grupo, incluyendo el congelar y expulsar a residentes." name="Parcel Access">
+ <action description="Administrar las listas de acceso a la parcela" longdescription="Administre las listas de acceso a la parcela en Acerca del terreno &gt; pestaña Acceso." name="land manage allowed" value="29"/>
+ <action description="Administrar la lista de residentes con el acceso prohibido" longdescription="Manejar la lista de expulsados en Acerca del terreno &gt; pestaña Acceso." name="land manage banned" value="30"/>
+ <action description="Cambiar en la parcela la configuración de &apos;Vender pases a&apos;" longdescription="Cambia en la parcela la configuración de &apos;Vender pases a&apos; (Acerca del terreno &gt; pestaña Acceso)." name="land manage passes" value="31"/>
+ <action description="Expulsar y congelar residentes en las parcelas" longdescription="En una parcela propiedad del grupo, los miembros cuyo rol tengan esta capacidad pueden manejar a residentes no deseados pulsándoles con el botón derecho del ratón para &apos;Expulsar&apos; o &apos;Congelar&apos;." name="land admin" value="32"/>
</action_set>
- <action_set
- description="Estas capacidades incluyen poderes que permitan a los miembros devolver objetos y poner y mover plantas Linden. Es útil para que miembros organicen el paisaje, pero debe ser usado con cuidado, ya que no se pueden deshacer esos cambios en los objetos."
- name="Parcel Content">
- <action description="Devolver objetos que pertenecen al grupo"
- longdescription="Devolver objetos pertenecientes al grupo en parcelas de su propiedad en Acerca del terreno &gt; pestaña Objetos."
- name="land return group owned" value="48" />
- <action description="Devolver objetos definidos para el grupo"
- longdescription="Devuelva objetos en parcelas pertenecientes al grupo en Acerca del terreno &gt; pestaña Objetos."
- name="land return group set" value="33" />
- <action description="Devolver objetos que no pertenecen al grupo"
- longdescription="Devuolver objetos que estén en una parcela del grupo y pertenezcan a alguien que no sea del grupo en Acerca del terreno &gt; pestaña Objetos."
- name="land return non group" value="34" />
- <action description="Modificar el paisaje usando plantas Linden"
- longdescription="La capacidad de modificar el paisaje permite poner y mover árboles Linden, plantas y arbustos. Estos ítems están en la &apos;s Biblioteca de su Inventario &gt; carpeta Objetos, o pueden crearse con el botón Construir."
- name="land gardening" value="35" />
+ <action_set description="Estas capacidades incluyen poderes que permitan a los miembros devolver objetos y poner y mover plantas Linden. Es útil para que miembros organicen el paisaje, pero debe ser usado con cuidado, ya que no se pueden deshacer esos cambios en los objetos." name="Parcel Content">
+ <action description="Devolver objetos que pertenecen al grupo" longdescription="Devolver objetos pertenecientes al grupo en parcelas de su propiedad en Acerca del terreno &gt; pestaña Objetos." name="land return group owned" value="48"/>
+ <action description="Devolver objetos definidos para el grupo" longdescription="Devuelva objetos en parcelas pertenecientes al grupo en Acerca del terreno &gt; pestaña Objetos." name="land return group set" value="33"/>
+ <action description="Devolver objetos que no pertenecen al grupo" longdescription="Devuolver objetos que estén en una parcela del grupo y pertenezcan a alguien que no sea del grupo en Acerca del terreno &gt; pestaña Objetos." name="land return non group" value="34"/>
+ <action description="Modificar el paisaje usando plantas Linden" longdescription="Capacidad de poner y mover árboles, plantas y arbustos Linden. Estos ítems están en la Biblioteca de tu inventario &gt; carpeta Objetos, o pueden construirse con el menú Construir." name="land gardening" value="35"/>
</action_set>
- <action_set
- description="Estas capacidades incluyen poderes para tranferir, modificar y vender objetos pertenecientes al grupo. Estos cambios se hacen en la pestaña General de la herramienta de edición. Para verlo, pulse en un objeto con el botón derecho y elija Editar. "
- name="Object Management">
- <action description="Transferir objetos al grupo"
- longdescription="Transferir objetos al grupo en Editar &gt; pestaña General."
- name="object deed" value="36" />
- <action description="Manipular (mover, copiar, y modificar) objetos del grupo"
- longdescription="Manipular (mover, copiar, y modificar) objetos pertenecientes al grupo en Editar &gt; pestaña General."
- name="object manipulate" value="38" />
- <action description="Vender objetos pertenecientes al grupo"
- longdescription="Poner a la venta objetos pertenecientes al grupo para venta en Editar &gt; pestaña General."
- name="object set sale" value="39" />
+ <action_set description="Estas capacidades incluyen poder transferir, modificar y vender objetos propiedad del grupo. Estos cambios se hacen en las Herramientas de construcción &gt; pestaña General. Pulsa un objeto con el botón derecho del ratón y edítalo para ver sus configuraciones." name="Object Management">
+ <action description="Transferir objetos al grupo" longdescription="Transferir objetos al grupo en las Herramientas de construcción &gt; pestaña General." name="object deed" value="36"/>
+ <action description="Manipular (mover, copiar, y modificar) objetos del grupo" longdescription="Mover, copiar y modificar objetos pertenecientes al grupo en las Herramientas de construcción &gt; pestaña General." name="object manipulate" value="38"/>
+ <action description="Vender objetos pertenecientes al grupo" longdescription="Poner a la venta objetos pertenecientes al grupo en las Herramientas de construcción &gt; pestaña General." name="object set sale" value="39"/>
</action_set>
- <action_set
- description="Estas habilidades incluyen poderes para que los miembros paguen deudas del grupo o reciban sus dividendos, y para limitar el acceso al historial de la cuenta del grupo."
- name="Accounting">
- <action description="Pagar deudas y recibir dividendos del grupo"
- longdescription="Quien tenga un rol con esta capacidad, automáticamente pagará deudas del grupo y recibirá sus dividendos. Esto significa que recibirá una parte de las ventas de terreno de grupo, y que contribuirá a cosas como, por ejemplo, las cuotas por posesión de terreno. "
- name="accounting accountable" value="40" />
+ <action_set description="Estas habilidades incluyen poderes para que los miembros paguen deudas del grupo o reciban sus dividendos, y para limitar el acceso al historial de la cuenta del grupo." name="Accounting">
+ <action description="Pagar deudas y recibir dividendos del grupo" longdescription="Quien tenga un rol con esta capacidad, automáticamente pagará deudas del grupo y recibirá sus dividendos. Esto significa que recibirá una parte de las ventas de terreno de grupo, y que contribuirá a cosas como, por ejemplo, las cuotas por posesión de terreno. " name="accounting accountable" value="40"/>
</action_set>
- <action_set
- description="Estas habilidades incluyen poderes para enviar, recibir y ver avisos de grupo."
- name="Notices">
- <action description="Enviar aviso"
- longdescription="Quien tenga un rol con esta capacidad puede enviar avisos en Información del grupo &gt; pestaña Avisos."
- name="notices send" value="42" />
- <action description="Recibir avisos nuevos y ver los anteriores"
- longdescription="Quien tenga un rol con esta capacidad puede recibir los avisos nuevos, y ver los anteriores en Información del grupo &gt; pestaña Avisos."
- name="notices receive" value="43" />
+ <action_set description="Estas habilidades incluyen poderes para enviar, recibir y ver avisos de grupo." name="Notices">
+ <action description="Enviar aviso" longdescription="Los miembros con un rol que tenga esta capacidad pueden enviar avisos a través de la sección Grupo &gt; Avisos." name="notices send" value="42"/>
+ <action description="Recibir avisos nuevos y ver los anteriores" longdescription="Los miembros con un rol que tenga esta capacidad pueden recibir Avisos y ver los ya enviados en la sección Grupo &gt; Avisos." name="notices receive" value="43"/>
</action_set>
- <action_set
- description="Estas habilidades incluyen poderes para permitir a los miembros crear propuestas, votarlas, y ver el historial de votaciones."
- name="Proposals">
- <action description="Hacer una propuesta"
- longdescription="Quien tenga un rol con esta capacidad puede crear propuestas para que sean votadas en Información del grupo &gt; pestaña Propuestas."
- name="proposal start" value="44" />
- <action description="Votar en propuestas"
- longdescription="Quien tenga un rol con esta capacidad puede votar las propuestas en Información del grupo &gt; pestaña Propuestas."
- name="proposal vote" value="45" />
+ <action_set description="Estas habilidades incluyen poderes para permitir a los miembros crear propuestas, votarlas, y ver el historial de votaciones." name="Proposals">
+ <action description="Hacer una propuesta" longdescription="Quien tenga un rol con esta capacidad puede crear propuestas para que sean votadas en Información del grupo &gt; pestaña Propuestas." name="proposal start" value="44"/>
+ <action description="Votar en propuestas" longdescription="Quien tenga un rol con esta capacidad puede votar las propuestas en Información del grupo &gt; pestaña Propuestas." name="proposal vote" value="45"/>
</action_set>
- <action_set
- description="Estas capacidades incluyen poderes para permitir o no el aceso a las sesiones de chat del grupo y al chat de voz del mismo."
- name="Chat">
- <action description="Abrir chat de grupo"
- longdescription="Quien tenga un rol con esta capacidad puede abrir sesiones de chat del grupo, tanto de texto como de voz."
- name="join group chat" value="16" />
- <action description="Abrir chat de voz del grupo"
- longdescription="Quien tenga un rol con esta capacidad puede abrir sesiones de chat de voz del grupo. NOTA: para acceder al chat de voz debe tenerse la capacidad &apos;Abrir chat de grupo&apos;."
- name="join voice chat" value="27" />
- <action description="Moderar el chat de grupo"
- longdescription="Quien tenga esta capacidad puede controlar el acceso y la participación en los chats de texto y de voz del grupo."
- name="moderate group chat" value="37" />
+ <action_set description="Estas capacidades incluyen poderes para permitir o no el aceso a las sesiones de chat del grupo y al chat de voz del mismo." name="Chat">
+ <action description="Abrir chat de grupo" longdescription="Quien tenga un rol con esta capacidad puede abrir sesiones de chat del grupo, tanto de texto como de voz." name="join group chat" value="16"/>
+ <action description="Abrir chat de voz del grupo" longdescription="Quien tenga un rol con esta capacidad puede abrir sesiones de chat de voz del grupo. NOTA: para acceder al chat de voz debe tenerse la capacidad &apos;Abrir chat de grupo&apos;." name="join voice chat" value="27"/>
+ <action description="Moderar el chat de grupo" longdescription="Quien tenga esta capacidad puede controlar el acceso y la participación en los chats de texto y de voz del grupo." name="moderate group chat" value="37"/>
</action_set>
</role_actions>
diff --git a/indra/newview/skins/default/xui/es/sidepanel_appearance.xml b/indra/newview/skins/default/xui/es/sidepanel_appearance.xml
new file mode 100644
index 0000000000..db5d47c11e
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/sidepanel_appearance.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Vestuarios" name="appearance panel">
+ <string name="No Outfit" value="No hay vestuario"/>
+ <string name="Unsaved Changes" value="Cambios sin guardar"/>
+ <string name="Now Wearing" value="Llevas puesto..."/>
+ <panel name="panel_currentlook">
+ <button label="F" name="editappearance_btn"/>
+ <button label="O" name="openoutfit_btn"/>
+ <text name="currentlook_status">
+ (Estado)
+ </text>
+ </panel>
+ <filter_editor label="Filtrar los vestuarios" name="Filter"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/sidepanel_inventory.xml b/indra/newview/skins/default/xui/es/sidepanel_inventory.xml
new file mode 100644
index 0000000000..2c22a7ba46
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/sidepanel_inventory.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Cosas" name="objects panel">
+ <panel label="" name="sidepanel__inventory_panel">
+ <panel name="button_panel">
+ <button label="Perfil" name="info_btn" tool_tip="Mostrar el perfil del objeto"/>
+ <button label="Compartir" name="share_btn" tool_tip="Compartir un objeto del inventario"/>
+ <button label="Comprar" name="shop_btn" tool_tip="Abrir la página web del mercado"/>
+ <button label="Ponerme" name="wear_btn" tool_tip="Ponerme el vestuario seleccionado"/>
+ <button label="Play" name="play_btn"/>
+ <button label="Teleporte" name="teleport_btn" tool_tip="Teleportar a la zona elegida"/>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/sidepanel_item_info.xml b/indra/newview/skins/default/xui/es/sidepanel_item_info.xml
new file mode 100644
index 0000000000..0d2eb0ac35
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/sidepanel_item_info.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="item properties" title="Perfil del objeto">
+ <panel.string name="unknown">
+ (desconocidas)
+ </panel.string>
+ <panel.string name="public">
+ (público)
+ </panel.string>
+ <panel.string name="you_can">
+ Puedes:
+ </panel.string>
+ <panel.string name="owner_can">
+ El propietario puede:
+ </panel.string>
+ <panel.string name="acquiredDate">
+ [wkday,datetime,local][day,datetime,local] [mth,datetime,local] [year,datetime,local][hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ </panel.string>
+ <text name="title" value="Perfil del objeto"/>
+ <text name="where" value="(Inventario)"/>
+ <panel label="">
+ <text name="LabelItemNameTitle">
+ Nombre:
+ </text>
+ <text name="LabelItemDescTitle">
+ Descripción:
+ </text>
+ <text name="LabelCreatorTitle">
+ Creador:
+ </text>
+ <button label="Perfil..." name="BtnCreator"/>
+ <text name="LabelOwnerTitle">
+ Propietario:
+ </text>
+ <button label="Perfil..." name="BtnOwner"/>
+ <text name="LabelAcquiredTitle">
+ Obtenido:
+ </text>
+ <text name="LabelAcquiredDate">
+ Miér., 24 Mayo 2006 12:50:46
+ </text>
+ <panel name="perms_inv">
+ <text name="perm_modify">
+ Tú puedes:
+ </text>
+ <check_box label="Modificar" name="CheckOwnerModify"/>
+ <check_box label="Copiarlo" name="CheckOwnerCopy"/>
+ <check_box label="Transferirlo" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ Cualquiera:
+ </text>
+ <check_box label="Copiarlo" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ Grupo:
+ </text>
+ <check_box label="Compartir" name="CheckShareWithGroup" tool_tip="Permite que todos los miembros del grupo compartan tus permisos de modificación en este objeto. Debes transferirlo para activar las restricciones según los roles."/>
+ <text name="NextOwnerLabel">
+ Próximo propietario:
+ </text>
+ <check_box label="Modificarlo" name="CheckNextOwnerModify"/>
+ <check_box label="Copiarlo" name="CheckNextOwnerCopy"/>
+ <check_box label="Transferirlo" name="CheckNextOwnerTransfer" tool_tip="El próximo propietario puede dar o revender este objeto"/>
+ </panel>
+ <check_box label="En venta" name="CheckPurchase"/>
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="Copiar" name="Copy"/>
+ <combo_box.item label="Original" name="Original"/>
+ </combo_box>
+ <spinner label="Precio: L$" name="Edit Cost"/>
+ </panel>
+ <panel name="button_panel">
+ <button label="Cancelar" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/sidepanel_task_info.xml b/indra/newview/skins/default/xui/es/sidepanel_task_info.xml
new file mode 100644
index 0000000000..f40813d3c9
--- /dev/null
+++ b/indra/newview/skins/default/xui/es/sidepanel_task_info.xml
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="object properties" title="Perfil del objeto">
+ <panel.string name="text deed continued">
+ Transferir
+ </panel.string>
+ <panel.string name="text deed">
+ Transferir
+ </panel.string>
+ <panel.string name="text modify info 1">
+ Puedes modificar este objeto
+ </panel.string>
+ <panel.string name="text modify info 2">
+ Puedes modificar estos objetos
+ </panel.string>
+ <panel.string name="text modify info 3">
+ No puedes modificar este objeto
+ </panel.string>
+ <panel.string name="text modify info 4">
+ No puedes modificar estos objetos
+ </panel.string>
+ <panel.string name="text modify warning">
+ Este objeto tiene partes enlazadas
+ </panel.string>
+ <panel.string name="Cost Default">
+ Precio: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ Precio total: L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Price Per: L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Mixed Price
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Mixed Sale
+ </panel.string>
+ <text name="title" value="Perfil del objeto"/>
+ <text name="where" value="(en el mundo)"/>
+ <panel label="" name="properties_panel">
+ <text name="Name:">
+ Nombre:
+ </text>
+ <text name="Description:">
+ Descripción:
+ </text>
+ <text name="CreatorNameLabel">
+ Creador:
+ </text>
+ <text name="Creator Name">
+ Erica Linden
+ </text>
+ <text name="Owner:">
+ Propietario:
+ </text>
+ <text name="Owner Name">
+ Erica Linden
+ </text>
+ <text name="Group_label">
+ Grupo:
+ </text>
+ <button name="button set group" tool_tip="Elige un grupo con el que compartir los permisos de este objeto"/>
+ <name_box initial_value="Cargando..." name="Group Name Proxy"/>
+ <button label="Transferir" label_selected="Transferir" name="button deed" tool_tip="La transferencia entrega este objeto con los permisos del próximo propietario. Los objetos compartidos por el grupo pueden ser transferidos por un oficial del grupo."/>
+ <text name="label click action">
+ Pulsa para:
+ </text>
+ <combo_box name="clickaction">
+ <combo_box.item label="Tocarlo (por defecto)" name="Touch/grab(default)"/>
+ <combo_box.item label="Sentarme en el objeto" name="Sitonobject"/>
+ <combo_box.item label="Comprar el objeto" name="Buyobject"/>
+ <combo_box.item label="Pagar el objeto" name="Payobject"/>
+ <combo_box.item label="Abrir" name="Open"/>
+ </combo_box>
+ <panel name="perms_inv">
+ <text name="perm_modify">
+ Puedes modificar este objeto
+ </text>
+ <text name="Anyone can:">
+ Cualquiera:
+ </text>
+ <check_box label="Copiar" name="checkbox allow everyone copy"/>
+ <check_box label="Mover" name="checkbox allow everyone move"/>
+ <text name="GroupLabel">
+ Grupo:
+ </text>
+ <check_box label="Compartir" name="checkbox share with group" tool_tip="Permite que todos los miembros del grupo compartan tus permisos de modificación de este objeto. Debes transferirlo para activar las restricciones según los roles."/>
+ <text name="NextOwnerLabel">
+ Próximo propietario:
+ </text>
+ <check_box label="Modificar" name="checkbox next owner can modify"/>
+ <check_box label="Copiar" name="checkbox next owner can copy"/>
+ <check_box label="Transferir" name="checkbox next owner can transfer" tool_tip="El próximo propietario puede dar o revender este objeto"/>
+ </panel>
+ <check_box label="En venta" name="checkbox for sale"/>
+ <combo_box name="sale type">
+ <combo_box.item label="Copiar" name="Copy"/>
+ <combo_box.item label="Contenidos" name="Contents"/>
+ <combo_box.item label="Original" name="Original"/>
+ </combo_box>
+ <spinner label="Precio: L$" name="Edit Cost"/>
+ <check_box label="Mostrar en la búsqueda" name="search_check" tool_tip="Permitir que la gente vea este objeto en los resultados de la búsqueda"/>
+ <text name="B:">
+ B:
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ E:
+ </text>
+ <text name="N:">
+ N:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
+ <panel name="button_panel">
+ <button label="Abrir" name="open_btn"/>
+ <button label="Pagar" name="pay_btn"/>
+ <button label="Comprar" name="buy_btn"/>
+ <button label="Detalles" name="details_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index dc508f7c37..6bd9ceb6ef 100644
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -1,13 +1,42 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- This file contains strings that used to be hardcoded in the source.
It is only for those strings which do not belong in a floater.
- For example, the strings used in avatar chat bubbles, and strings
+ For example, the strings used in avatar chat bubbles, and strings
that are returned from one component and may appear in many places-->
<strings>
- <string name="create_account_url">http://join.secondlife.com/index.php?lang=es-ES</string>
+ <string name="CAPITALIZED_APP_NAME">
+ SECOND LIFE
+ </string>
+ <string name="SUPPORT_SITE">
+ Portal de Soporte de Second Life
+ </string>
+ <string name="StartupDetectingHardware">
+ Identificando el hardware...
+ </string>
+ <string name="StartupLoading">
+ Instalando [APP_NAME]...
+ </string>
+ <string name="StartupClearingCache">
+ Limpiando la caché...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ Iniciando la caché de las texturas...
+ </string>
+ <string name="StartupInitializingVFS">
+ Iniciando VFS...
+ </string>
+ <string name="ProgressRestoring">
+ Restaurando...
+ </string>
+ <string name="ProgressChangingResolution">
+ Cambiando la resolución...
+ </string>
<string name="LoginInProgress">
Iniciando la sesión. [APP_NAME] debe de aparecer congelado. Por favor, espere.
</string>
+ <string name="LoginInProgressNoFrozen">
+ Iniciando la sesión...
+ </string>
<string name="LoginAuthenticating">
Autenticando
</string>
@@ -26,6 +55,9 @@
<string name="LoginInitializingMultimedia">
Iniciando multimedia...
</string>
+ <string name="LoginInitializingFonts">
+ Cargando las fuentes...
+ </string>
<string name="LoginVerifyingCache">
Comprobando los archivos de la caché (puede tardar entre 60 y 90 segundos)...
</string>
@@ -56,11 +88,56 @@
<string name="LoginDownloadingClothing">
Descargando la ropa...
</string>
+ <string name="InvalidCertificate">
+ El servidor devolvió un certificado no válido o dañado. Ponte en contacto con el administrador de la cuadrícula.
+ </string>
+ <string name="CertInvalidHostname">
+ El nombre de host utilizado para acceder al servidor no es válido. Comprueba tu SLURL o el nombre de host de la cuadrícula.
+ </string>
+ <string name="CertExpired">
+ Parece que el certificado que devolvió la cuadrícula está caducado. Comprueba el reloj del sistema o consulta al administrador de la cuadrícula.
+ </string>
+ <string name="CertKeyUsage">
+ El certificado que devolvió el servidor no puede utilizarse para SSL. Ponte en contacto con el administrador de la cuadrícula.
+ </string>
+ <string name="CertBasicConstraints">
+ La cadena de certificado del servidor contenía demasiados certificados. Ponte en contacto con el administrador de la cuadrícula.
+ </string>
+ <string name="CertInvalidSignature">
+ No se pudo verificar la firma del certificado devuelta por el servidor de la cuadrícula. Ponte en contacto con el administrador de la cuadrícula.
+ </string>
+ <string name="LoginFailedNoNetwork">
+ Error de red: no se ha podido conectar; por favor, revisa tu conexión a Internet.
+ </string>
+ <string name="LoginFailed">
+ Error en el inicio de sesión.
+ </string>
<string name="Quit">
Salir
</string>
+ <string name="create_account_url">
+ http://join.secondlife.com/index.php?lang=es-ES
+ </string>
<string name="AgentLostConnection">
- Esta región puede estar teniendo problemas. Por favor, compruebe su conexión a internet.
+ Esta región puede estar teniendo problemas. Por favor, comprueba tu conexión a Internet.
+ </string>
+ <string name="SavingSettings">
+ Guardando tus configuraciones...
+ </string>
+ <string name="LoggingOut">
+ Cerrando sesión...
+ </string>
+ <string name="ShuttingDown">
+ Cerrando...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ Has sido desconectado de la región en la que estabas.
+ </string>
+ <string name="SentToInvalidRegion">
+ Has sido enviado a una región no válida.
+ </string>
+ <string name="TestingDisconnect">
+ Probando la desconexión del visor
</string>
<string name="TooltipPerson">
Persona
@@ -77,39 +154,9 @@
<string name="TooltipIsGroup">
(Grupo)
</string>
- <string name="TooltipFlagScript">
- Script
- </string>
- <string name="TooltipFlagPhysics">
- Propiedades físicas
- </string>
- <string name="TooltipFlagTouch">
- Tocar
- </string>
- <string name="TooltipFlagL$">
- L$
- </string>
- <string name="TooltipFlagDropInventory">
- Desplegar el inventario
- </string>
- <string name="TooltipFlagPhantom">
- Inmaterial
- </string>
- <string name="TooltipFlagTemporary">
- Temporal
- </string>
- <string name="TooltipFlagRightClickMenu">
- (pulse el botón derecho del ratón para ver el menú)
- </string>
- <string name="TooltipFreeToCopy">
- Copia gratis
- </string>
<string name="TooltipForSaleL$">
En venta: [AMOUNT] L$
</string>
- <string name="TooltipForSaleMsg">
- En venta: [MESSAGE]
- </string>
<string name="TooltipFlagGroupBuild">
Construir el grupo
</string>
@@ -137,6 +184,113 @@
<string name="TooltipMustSingleDrop">
Aquí se puede arrastrar sólo un ítem
</string>
+ <string name="TooltipHttpUrl">
+ Pulsa para ver esta página web
+ </string>
+ <string name="TooltipSLURL">
+ Pulsa para ver la información de este lugar
+ </string>
+ <string name="TooltipAgentUrl">
+ Pulsa para ver el perfil del Residente
+ </string>
+ <string name="TooltipAgentMute">
+ Pulsa para silenciar a este Residente
+ </string>
+ <string name="TooltipAgentUnmute">
+ Pulsa para quitar el silencio a este Residente
+ </string>
+ <string name="TooltipAgentIM">
+ Pulsa para enviar un MI a este Residente
+ </string>
+ <string name="TooltipAgentPay">
+ Pulsa para pagar a este Residente
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Pulsa para enviar una petición de teleporte a este Residente
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Pulsa para enviar una petición de amistad a este Residente
+ </string>
+ <string name="TooltipGroupUrl">
+ Pulsa para ver la descripción de este grupo
+ </string>
+ <string name="TooltipEventUrl">
+ Pulsa para ver la descripción de este evento
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Pulsa para ver este clasificado
+ </string>
+ <string name="TooltipParcelUrl">
+ Pulsa para ver la descripción de esta parcela
+ </string>
+ <string name="TooltipTeleportUrl">
+ Pulsa para teleportarte a esta posición
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Pulsa para ver la descripción de este objeto
+ </string>
+ <string name="TooltipMapUrl">
+ Pulsa para ver en el mapa esta localización
+ </string>
+ <string name="TooltipSLAPP">
+ Pulsa para ejecutar el comando secondlife://
+ </string>
+ <string name="CurrentURL" value="URL actual: [CurrentURL]"/>
+ <string name="TooltipPrice" value="[PRICE] L$"/>
+ <string name="SLurlLabelTeleport">
+ Teleportarse a
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Mostrarla en el mapa
+ </string>
+ <string name="SLappAgentMute">
+ Silenciar
+ </string>
+ <string name="SLappAgentUnmute">
+ Quitar el silencio
+ </string>
+ <string name="SLappAgentIM">
+ MI
+ </string>
+ <string name="SLappAgentPay">
+ Pagar
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Ofrecer teleporte a
+ </string>
+ <string name="SLappAgentRequestFriend">
+ Petición de amistad
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Cerrar (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Cerrar (Ctrl+W)
+ </string>
+ <string name="BUTTON_CLOSE_CHROME">
+ Cerrar
+ </string>
+ <string name="BUTTON_RESTORE">
+ Maximizar
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Minimizar
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Separar la ventana
+ </string>
+ <string name="BUTTON_DOCK">
+ Fijar
+ </string>
+ <string name="BUTTON_HELP">
+ Ver la Ayuda
+ </string>
+ <string name="Searching">
+ Buscando...
+ </string>
+ <string name="NoneFound">
+ No se ha encontrado.
+ </string>
<string name="RetrievingData">
Reintentando...
</string>
@@ -152,12 +306,12 @@
<string name="AvatarNameWaiting">
(esperando)
</string>
- <string name="AvatarNameHippos">
- (hipopótamos)
- </string>
<string name="GroupNameNone">
(ninguno)
</string>
+ <string name="AvalineCaller">
+ Avaline: [ORDER]
+ </string>
<string name="AssetErrorNone">
No hay ningún error
</string>
@@ -191,8 +345,80 @@
<string name="AssetErrorUnknownStatus">
Estado desconocido
</string>
- <string name="AvatarEditingApparance">
- (Modificando la apariencia)
+ <string name="texture">
+ la textura
+ </string>
+ <string name="sound">
+ el sonido
+ </string>
+ <string name="calling card">
+ la tarjeta de visita
+ </string>
+ <string name="landmark">
+ el hito
+ </string>
+ <string name="legacy script">
+ el script antiguo
+ </string>
+ <string name="clothing">
+ esa ropa
+ </string>
+ <string name="object">
+ el objeto
+ </string>
+ <string name="note card">
+ la nota
+ </string>
+ <string name="folder">
+ la carpeta
+ </string>
+ <string name="root">
+ la ruta
+ </string>
+ <string name="lsl2 script">
+ ese script de LSL2
+ </string>
+ <string name="lsl bytecode">
+ el código intermedio de LSL
+ </string>
+ <string name="tga texture">
+ esa textura tga
+ </string>
+ <string name="body part">
+ esa parte del cuerpo
+ </string>
+ <string name="snapshot">
+ la foto
+ </string>
+ <string name="lost and found">
+ Objetos Perdidos
+ </string>
+ <string name="targa image">
+ esa imagen targa
+ </string>
+ <string name="trash">
+ la Papelera
+ </string>
+ <string name="jpeg image">
+ esa imagen jpeg
+ </string>
+ <string name="animation">
+ la animación
+ </string>
+ <string name="gesture">
+ el gesto
+ </string>
+ <string name="simstate">
+ simstate
+ </string>
+ <string name="favorite">
+ ese favorito
+ </string>
+ <string name="symbolic link">
+ el enlace
+ </string>
+ <string name="symbolic folder link">
+ enlace de la carpeta
</string>
<string name="AvatarAway">
Ausente
@@ -414,7 +640,19 @@
Cargando...
</string>
<string name="worldmap_offline">
- Desconectado/a
+ Sin conexión
+ </string>
+ <string name="worldmap_results_none_found">
+ No se ha encontrado.
+ </string>
+ <string name="Ok">
+ OK
+ </string>
+ <string name="Premature end of file">
+ Fin prematuro del archivo
+ </string>
+ <string name="ST_NO_JOINT">
+ No se puede encontrar ROOT o JOINT.
</string>
<string name="whisper">
susurra:
@@ -422,6 +660,60 @@
<string name="shout">
grita:
</string>
+ <string name="ringing">
+ Conectando al chat de voz...
+ </string>
+ <string name="connected">
+ Conectado
+ </string>
+ <string name="unavailable">
+ La voz no está disponible en su localización actual
+ </string>
+ <string name="hang_up">
+ Desconectado del chat de voz
+ </string>
+ <string name="reconnect_nearby">
+ Vas a ser reconectado al chat de voz con los cercanos
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ &apos;[OBJECTNAME]&apos;, un objeto propiedad de &apos;[OWNERNAME]&apos;, localizado en [REGIONNAME] con la posición [REGIONPOS], ha recibido permiso para: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ A &apos;[OBJECTNAME]&apos;, un objeto propiedad de &apos;[OWNERNAME]&apos;, localizado en [REGIONNAME] con la posición [REGIONPOS], se le ha denegado el permiso para: [PERMISSIONS].
+ </string>
+ <string name="ScriptTakeMoney">
+ Cogerle a usted dólares Linden (L$)
+ </string>
+ <string name="ActOnControlInputs">
+ Actuar en sus controles de entrada
+ </string>
+ <string name="RemapControlInputs">
+ Reconfigurar sus controles de entrada
+ </string>
+ <string name="AnimateYourAvatar">
+ Ejecutar animaciones en su avatar
+ </string>
+ <string name="AttachToYourAvatar">
+ Anexarse a su avatar
+ </string>
+ <string name="ReleaseOwnership">
+ Anular la propiedad y que pase a ser público
+ </string>
+ <string name="LinkAndDelink">
+ Enlazar y desenlazar de otros objetos
+ </string>
+ <string name="AddAndRemoveJoints">
+ Añadir y quitar uniones con otros objetos
+ </string>
+ <string name="ChangePermissions">
+ Cambiar sus permisos
+ </string>
+ <string name="TrackYourCamera">
+ Seguir su cámara
+ </string>
+ <string name="ControlYourCamera">
+ Controlar su cámara
+ </string>
<string name="SIM_ACCESS_PG">
&apos;PG&apos;
</string>
@@ -440,8 +732,12 @@
<string name="land_type_unknown">
(desconocido)
</string>
- <string name="covenant_never_modified">Última modificación: (nunca)</string>
- <string name="covenant_modified">Última modificación: </string>
+ <string name="Estate / Full Region">
+ Estado /Región completa
+ </string>
+ <string name="Mainland / Full Region">
+ Continente / Región completa
+ </string>
<string name="all_files">
Todos los archivos
</string>
@@ -487,28 +783,964 @@
<string name="choose_the_directory">
Elegir directorio
</string>
- <!-- OSMessageBox messages -->
- <string name="MBAlreadyRunning">
- [APP_NAME] ya se está ejecutando.
-Busque en la barra de su escritorio una copia minimizada del programa.
-Si aun así persiste este mensaje, reinicie su ordenador.
+ <string name="AvatarSetNotAway">
+ Salir del estado ausente
</string>
- <string name="MBVideoDrvErr">
- No se puede ejecutar [APP_NAME] porque los drivers de su tarjeta de vídeo no están instalados correctamente, o no están actualizados, o son de un hardware no admitido. Por favor, asegúrese de que tiene los últimos drivers para su tarjeta de vídeo, e incluso en ese caso intente reinstalarlos.
-
-Si sigue recibiendo este mensaje, contacte con el [SUPPORT_SITE].
+ <string name="AvatarSetAway">
+ Pasar al estado ausente
+ </string>
+ <string name="AvatarSetNotBusy">
+ Salir del estado ocupado
+ </string>
+ <string name="AvatarSetBusy">
+ Pasar al estado ocupado
+ </string>
+ <string name="shape">
+ Forma
+ </string>
+ <string name="skin">
+ Piel
+ </string>
+ <string name="hair">
+ Pelo
+ </string>
+ <string name="eyes">
+ Ojos
+ </string>
+ <string name="shirt">
+ Camisa
+ </string>
+ <string name="pants">
+ Pantalón
+ </string>
+ <string name="shoes">
+ Zapatos
+ </string>
+ <string name="socks">
+ Calcetines
+ </string>
+ <string name="jacket">
+ Chaqueta
+ </string>
+ <string name="gloves">
+ Guantes
+ </string>
+ <string name="undershirt">
+ Camiseta
+ </string>
+ <string name="underpants">
+ Ropa interior
+ </string>
+ <string name="skirt">
+ Falda
+ </string>
+ <string name="alpha">
+ Alfa
+ </string>
+ <string name="tattoo">
+ Tatuaje
+ </string>
+ <string name="invalid">
+ inválido/a
+ </string>
+ <string name="shirt_not_worn">
+ Camisa no puesta
+ </string>
+ <string name="pants_not_worn">
+ Pantalones no puestos
+ </string>
+ <string name="shoes_not_worn">
+ Zapatos no puestos
+ </string>
+ <string name="socks_not_worn">
+ Calcetines no puestos
+ </string>
+ <string name="jacket_not_worn">
+ Chaqueta no puesta
+ </string>
+ <string name="gloves_not_worn">
+ Guantes no puestos
+ </string>
+ <string name="undershirt_not_worn">
+ Camiseta no puesta
+ </string>
+ <string name="underpants_not_worn">
+ Ropa interior no puesta
+ </string>
+ <string name="skirt_not_worn">
+ Falda no puesta
+ </string>
+ <string name="alpha_not_worn">
+ Alfa no puesta
+ </string>
+ <string name="tattoo_not_worn">
+ Tatuaje no puesto
+ </string>
+ <string name="invalid_not_worn">
+ no válido/a
+ </string>
+ <string name="NewWearable">
+ Nuevo [WEARABLE_ITEM]
+ </string>
+ <string name="CreateNewWearable">
+ Crear [WEARABLE_TYPE]
+ </string>
+ <string name="next">
+ Siguiente
+ </string>
+ <string name="ok">
+ OK
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Aviso de grupo
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Avisos del grupo
+ </string>
+ <string name="GroupNotifySentBy">
+ Enviado por
+ </string>
+ <string name="GroupNotifyAttached">
+ Adjunto:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ Ver los avisos pasados u optar por dejar de recibir aquí estos mensajes.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Abrir el adjunto
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Guardar el adjunto
+ </string>
+ <string name="TeleportOffer">
+ Ofrecimiento de teleporte
+ </string>
+ <string name="StartUpNotifications">
+ Llegaron avisos nuevos mientras estabas ausente...
+ </string>
+ <string name="OverflowInfoChannelString">
+ Tienes [%d] aviso/s más
+ </string>
+ <string name="BodyPartsRightArm">
+ Brazo der.
+ </string>
+ <string name="BodyPartsHead">
+ Cabeza
+ </string>
+ <string name="BodyPartsLeftArm">
+ Brazo izq.
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Pierna izq.
+ </string>
+ <string name="BodyPartsTorso">
+ Torso
+ </string>
+ <string name="BodyPartsRightLeg">
+ Pierna der.
+ </string>
+ <string name="GraphicsQualityLow">
+ Bajo
+ </string>
+ <string name="GraphicsQualityMid">
+ Medio
+ </string>
+ <string name="GraphicsQualityHigh">
+ Alto
+ </string>
+ <string name="LeaveMouselook">
+ Pulsa ESC para salir de la vista subjetiva
+ </string>
+ <string name="InventoryNoMatchingItems">
+ ¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/all/[SEARCH_TERM] Buscar].
+ </string>
+ <string name="PlacesNoMatchingItems">
+ ¿No encuentras lo que buscas? Prueba con [secondlife:///app/search/places/[SEARCH_TERM] Buscar].
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ Arrastra aquí un hito para tenerlo en tus favoritos.
+ </string>
+ <string name="InventoryNoTexture">
+ No tienes en tu inventario una copia de esta textura
+ </string>
+ <string name="no_transfer" value="(no transferible)"/>
+ <string name="no_modify" value="(no modificable)"/>
+ <string name="no_copy" value="(no copiable)"/>
+ <string name="worn" value="(puesto)"/>
+ <string name="link" value="(enlace)"/>
+ <string name="broken_link" value="(enlace roto)&quot;"/>
+ <string name="LoadingContents">
+ Cargando el contenido...
+ </string>
+ <string name="NoContents">
+ No hay contenido
+ </string>
+ <string name="WornOnAttachmentPoint" value="(lo llevas en: [ATTACHMENT_POINT])"/>
+ <string name="ActiveGesture" value="[GESLABEL] (activo)"/>
+ <string name="Chat" value="Chat :"/>
+ <string name="Sound" value="Sonido :"/>
+ <string name="Wait" value="--- Espera :"/>
+ <string name="AnimFlagStop" value="Parar la animación:"/>
+ <string name="AnimFlagStart" value="Empezar la animación:"/>
+ <string name="Wave" value="Onda"/>
+ <string name="HelloAvatar" value="¡Hola, avatar!"/>
+ <string name="ViewAllGestures" value="Ver todos &gt;&gt;"/>
+ <string name="GetMoreGestures" value="Obtener más &gt;&gt;"/>
+ <string name="Animations" value="Animaciones,"/>
+ <string name="Calling Cards" value="Tarjetas de visita,"/>
+ <string name="Clothing" value="Ropa,"/>
+ <string name="Gestures" value="Gestos,"/>
+ <string name="Landmarks" value="Hitos,"/>
+ <string name="Notecards" value="Notas,"/>
+ <string name="Objects" value="Objetos,"/>
+ <string name="Scripts" value="Scripts,"/>
+ <string name="Sounds" value="Sonidos,"/>
+ <string name="Textures" value="Texturas,"/>
+ <string name="Snapshots" value="Fotos,"/>
+ <string name="No Filters" value="No"/>
+ <string name="Since Logoff" value="- Desde la desconexión"/>
+ <string name="InvFolder My Inventory">
+ Mi Inventario
+ </string>
+ <string name="InvFolder My Favorites">
+ Mis Favoritos
+ </string>
+ <string name="InvFolder Library">
+ Biblioteca
+ </string>
+ <string name="InvFolder Textures">
+ Texturas
+ </string>
+ <string name="InvFolder Sounds">
+ Sonidos
+ </string>
+ <string name="InvFolder Calling Cards">
+ Tarjetas de visita
+ </string>
+ <string name="InvFolder Landmarks">
+ Hitos
+ </string>
+ <string name="InvFolder Scripts">
+ Scripts
+ </string>
+ <string name="InvFolder Clothing">
+ Ropa
+ </string>
+ <string name="InvFolder Objects">
+ Objetos
+ </string>
+ <string name="InvFolder Notecards">
+ Notas
+ </string>
+ <string name="InvFolder New Folder">
+ Carpeta nueva
+ </string>
+ <string name="InvFolder Inventory">
+ Inventario
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Imágenes sin comprimir
+ </string>
+ <string name="InvFolder Body Parts">
+ Partes del cuerpo
+ </string>
+ <string name="InvFolder Trash">
+ Papelera
+ </string>
+ <string name="InvFolder Photo Album">
+ Ãlbum de fotos
+ </string>
+ <string name="InvFolder Lost And Found">
+ Objetos Perdidos
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Sonidos sin comprimir
+ </string>
+ <string name="InvFolder Animations">
+ Animaciones
+ </string>
+ <string name="InvFolder Gestures">
+ Gestos
+ </string>
+ <string name="InvFolder favorite">
+ Favoritos
+ </string>
+ <string name="InvFolder Current Outfit">
+ Vestuario actual
+ </string>
+ <string name="InvFolder My Outfits">
+ Mis vestuarios
+ </string>
+ <string name="InvFolder Accessories">
+ Accesorios
+ </string>
+ <string name="InvFolder Friends">
+ Amigos
+ </string>
+ <string name="InvFolder All">
+ Todas
+ </string>
+ <string name="Buy">
+ Comprar
+ </string>
+ <string name="BuyforL$">
+ Comprar por L$
+ </string>
+ <string name="Stone">
+ Piedra
+ </string>
+ <string name="Metal">
+ Metal
+ </string>
+ <string name="Glass">
+ Cristal
+ </string>
+ <string name="Wood">
+ Madera
+ </string>
+ <string name="Flesh">
+ Carne
+ </string>
+ <string name="Plastic">
+ Plástico
+ </string>
+ <string name="Rubber">
+ Goma
+ </string>
+ <string name="Light">
+ Claridad
+ </string>
+ <string name="KBShift">
+ Mayúsculas
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ Tórax
+ </string>
+ <string name="Skull">
+ Cráneo
+ </string>
+ <string name="Left Shoulder">
+ Hombro izquierdo
+ </string>
+ <string name="Right Shoulder">
+ Hombro derecho
+ </string>
+ <string name="Left Hand">
+ Mano izq.
+ </string>
+ <string name="Right Hand">
+ Mano der.
+ </string>
+ <string name="Left Foot">
+ Pie izq.
+ </string>
+ <string name="Right Foot">
+ Pie der.
+ </string>
+ <string name="Spine">
+ Columna
+ </string>
+ <string name="Pelvis">
+ Pelvis
+ </string>
+ <string name="Mouth">
+ Boca
+ </string>
+ <string name="Chin">
+ Barbilla
+ </string>
+ <string name="Left Ear">
+ Oreja izq.
+ </string>
+ <string name="Right Ear">
+ Oreja der.
+ </string>
+ <string name="Left Eyeball">
+ Ojo izq.
+ </string>
+ <string name="Right Eyeball">
+ Ojo der.
+ </string>
+ <string name="Nose">
+ Nariz
+ </string>
+ <string name="R Upper Arm">
+ Brazo der.
+ </string>
+ <string name="R Forearm">
+ Antebrazo der.
+ </string>
+ <string name="L Upper Arm">
+ Brazo izq.
+ </string>
+ <string name="L Forearm">
+ Antebrazo izq.
+ </string>
+ <string name="Right Hip">
+ Cadera der.
+ </string>
+ <string name="R Upper Leg">
+ Muslo der.
+ </string>
+ <string name="R Lower Leg">
+ Pantorrilla der.
+ </string>
+ <string name="Left Hip">
+ Cadera izq.
+ </string>
+ <string name="L Upper Leg">
+ Muslo izq.
+ </string>
+ <string name="L Lower Leg">
+ Pantorrilla izq.
+ </string>
+ <string name="Stomach">
+ Abdomen
+ </string>
+ <string name="Left Pec">
+ Pecho izquierdo
+ </string>
+ <string name="Right Pec">
+ Pecho derecho
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS] de edad
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS] de edad
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS] de edad
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS] de edad
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS] de edad
+ </string>
+ <string name="TodayOld">
+ Registrado hoy
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] año
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] años
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] años
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] mes
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] meses
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] meses
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] semana
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] semanas
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] semanas
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] día
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] días
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] días
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] miembro
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] miembros
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] miembros
+ </string>
+ <string name="AcctTypeResident">
+ Residente
+ </string>
+ <string name="AcctTypeTrial">
+ Prueba
+ </string>
+ <string name="AcctTypeCharterMember">
+ Miembro fundador
+ </string>
+ <string name="AcctTypeEmployee">
+ Empleado de Linden Lab
+ </string>
+ <string name="PaymentInfoUsed">
+ Ha usado información sobre la forma de pago
+ </string>
+ <string name="PaymentInfoOnFile">
+ Hay información archivada sobre la forma de pago
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ No hay información archivada sobre la forma de pago
+ </string>
+ <string name="AgeVerified">
+ Edad verificada
+ </string>
+ <string name="NotAgeVerified">
+ Edad no verificada
+ </string>
+ <string name="Center 2">
+ Centro 2
+ </string>
+ <string name="Top Right">
+ Arriba der.
+ </string>
+ <string name="Top">
+ Arriba
+ </string>
+ <string name="Top Left">
+ Arriba izq.
+ </string>
+ <string name="Center">
+ Centro
+ </string>
+ <string name="Bottom Left">
+ Abajo izq.
+ </string>
+ <string name="Bottom">
+ Abajo
+ </string>
+ <string name="Bottom Right">
+ Abajo der.
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Descargado, compilándolo
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ No se encuentra el script en el servidor.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Problema al descargar
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Permisos insuficientes para descargar un script.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Permisos insuficientes para
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Fallo desconocido en la descarga
+ </string>
+ <string name="CompileQueueTitle">
+ Recompilando
+ </string>
+ <string name="CompileQueueStart">
+ recompilar
+ </string>
+ <string name="ResetQueueTitle">
+ Progreso del reinicio
+ </string>
+ <string name="ResetQueueStart">
+ restaurar
+ </string>
+ <string name="RunQueueTitle">
+ Configurar según se ejecuta
+ </string>
+ <string name="RunQueueStart">
+ Configurando según se ejecuta
+ </string>
+ <string name="NotRunQueueTitle">
+ Configurar sin ejecutar
+ </string>
+ <string name="NotRunQueueStart">
+ Configurando sin ejecutarlo
+ </string>
+ <string name="CompileSuccessful">
+ ¡Compilación correcta!
+ </string>
+ <string name="CompileSuccessfulSaving">
+ Compilación correcta, guardando...
+ </string>
+ <string name="SaveComplete">
+ Guardado.
+ </string>
+ <string name="ObjectOutOfRange">
+ Script (objeto fuera de rango)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ El objeto [OBJECT] es propiedad de [OWNER]
+ </string>
+ <string name="GroupsNone">
+ ninguno
+ </string>
+ <string name="Group" value="(grupo)"/>
+ <string name="Unknown">
+ (Desconocido)
+ </string>
+ <string name="SummaryForTheWeek" value="Resumen de esta semana, empezando el"/>
+ <string name="NextStipendDay" value="El próximo día de pago es el"/>
+ <string name="GroupIndividualShare" value="Grupo Aportaciones individuales"/>
+ <string name="Balance">
+ Saldo
+ </string>
+ <string name="Credits">
+ Créditos
+ </string>
+ <string name="Debits">
+ Débitos
+ </string>
+ <string name="Total">
+ Total
+ </string>
+ <string name="NoGroupDataFound">
+ No se encontraron datos del grupo
+ </string>
+ <string name="IMParentEstate">
+ parent estate
+ </string>
+ <string name="IMMainland">
+ continente
+ </string>
+ <string name="IMTeen">
+ teen
+ </string>
+ <string name="RegionInfoError">
+ error
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ todos los estados propiedad de [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ todos los estados que posees
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ todos los estados que administras para [OWNER]
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Resientes autorizados: ([ALLOWEDAGENTS], de un máx. de [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Grupos autorizados: ([ALLOWEDGROUPS], de un máx. de [MAXACCESS])
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ Memoria de los scripts de la parcela
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ Parcelas listadas: [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ Memoria usada: [COUNT] kb de un máx de [MAX] kb; [AVAILABLE] kb disponibles
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ Memoria usada: [COUNT] kb
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ URLs de los scripts de la parcela
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ URLs usadas: [COUNT] de un máx. de [MAX]; [AVAILABLE] disponibles
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ URLs usadas: [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Error al obtener la información
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ No hay una parcela seleccionada
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ Error: la información del script sólo está disponible en tu región actual
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ Obteniendo la información...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ No tienes permiso para examinar esta parcela
+ </string>
+ <string name="SITTING_ON">
+ Sentado en
+ </string>
+ <string name="ATTACH_CHEST">
+ Tórax
+ </string>
+ <string name="ATTACH_HEAD">
+ Cabeza
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ Hombro izquierdo
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ Hombro derecho
+ </string>
+ <string name="ATTACH_LHAND">
+ Mano izq.
+ </string>
+ <string name="ATTACH_RHAND">
+ Mano der.
+ </string>
+ <string name="ATTACH_LFOOT">
+ Pie izq.
+ </string>
+ <string name="ATTACH_RFOOT">
+ Pie der.
+ </string>
+ <string name="ATTACH_BACK">
+ Anterior
+ </string>
+ <string name="ATTACH_PELVIS">
+ Pelvis
+ </string>
+ <string name="ATTACH_MOUTH">
+ Boca
+ </string>
+ <string name="ATTACH_CHIN">
+ Barbilla
+ </string>
+ <string name="ATTACH_LEAR">
+ Oreja izq.
+ </string>
+ <string name="ATTACH_REAR">
+ Oreja der.
+ </string>
+ <string name="ATTACH_LEYE">
+ Ojo izq.
+ </string>
+ <string name="ATTACH_REYE">
+ Ojo der.
+ </string>
+ <string name="ATTACH_NOSE">
+ Nariz
+ </string>
+ <string name="ATTACH_RUARM">
+ Brazo der.
+ </string>
+ <string name="ATTACH_RLARM">
+ Antebrazo der.
+ </string>
+ <string name="ATTACH_LUARM">
+ Brazo izq.
+ </string>
+ <string name="ATTACH_LLARM">
+ Antebrazo izq.
+ </string>
+ <string name="ATTACH_RHIP">
+ Cadera der.
+ </string>
+ <string name="ATTACH_RULEG">
+ Muslo der.
+ </string>
+ <string name="ATTACH_RLLEG">
+ Pantorrilla der.
+ </string>
+ <string name="ATTACH_LHIP">
+ Cadera izq.
+ </string>
+ <string name="ATTACH_LULEG">
+ Muslo izq.
+ </string>
+ <string name="ATTACH_LLLEG">
+ Pantorrilla izq.
+ </string>
+ <string name="ATTACH_BELLY">
+ Vientre
+ </string>
+ <string name="ATTACH_RPEC">
+ Pecho derecho
+ </string>
+ <string name="ATTACH_LPEC">
+ Pecho izquierdo
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ HUD: Centro 2
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ HUD: arriba der.
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ HUD: arriba centro
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ HUD: arriba izq.
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ HUD: Centro 1
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ HUD: abajo izq.
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ HUD: abajo
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ HUD: abajo der.
+ </string>
+ <string name="CursorPos">
+ Línea [LINE], Columna [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] resultados
+ </string>
+ <string name="PanelContentsNewScript">
+ Script nuevo
+ </string>
+ <string name="PanelContentsTooltip">
+ Contenido del objeto
+ </string>
+ <string name="BusyModeResponseDefault">
+ El Residente al que has enviado un mensaje ha solicitado que no se le moleste porque está en modo ocupado. Podrá ver tu mensaje más adelante, ya que éste aparecerá en su panel de MI.
+ </string>
+ <string name="MuteByName">
+ (Por el nombre)
+ </string>
+ <string name="MuteAgent">
+ (Residente)
+ </string>
+ <string name="MuteObject">
+ (Objeto)
+ </string>
+ <string name="MuteGroup">
+ (Grupo)
+ </string>
+ <string name="MuteExternal">
+ (Externo)
+ </string>
+ <string name="RegionNoCovenant">
+ No se ha aportado un contrato para este estado.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ No se ha aportado un contrato para este estado. El terreno de este estado lo vende el propietario del estado, no Linden Lab. Por favor, contacta con ese propietario para informarte sobre la venta.
+ </string>
+ <string name="covenant_last_modified" value="Última modificación:"/>
+ <string name="none_text" value="(no hay)"/>
+ <string name="never_text" value=" (nunca)"/>
+ <string name="GroupOwned">
+ Propiedad del grupo
+ </string>
+ <string name="Public">
+ Público
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Clics: [TELEPORT] teleportes, [MAP] mapa, [PROFILE] perfil
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (se actualizará tras la publicación)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ No has creado destacados ni clasificados. Pulsa el botón Más para crear uno.
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ El usuario no tiene clasificados ni destacados
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ Cargando...
+ </string>
+ <string name="MultiPreviewTitle">
+ Vista previa
+ </string>
+ <string name="MultiPropertiesTitle">
+ Propiedades
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ Un objeto de nombre
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ propiedad del grupo
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ propiedad de un grupo desconocido
+ </string>
+ <string name="InvOfferOwnedBy">
+ propiedad de
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ propiedad de un usuario desconocido
+ </string>
+ <string name="InvOfferGaveYou">
+ te ha dado
+ </string>
+ <string name="InvOfferYouDecline">
+ Has rehusado
+ </string>
+ <string name="InvOfferFrom">
+ de
+ </string>
+ <string name="GroupMoneyTotal">
+ Total
+ </string>
+ <string name="GroupMoneyBought">
+ comprado
+ </string>
+ <string name="GroupMoneyPaidYou">
+ pagado a ti
+ </string>
+ <string name="GroupMoneyPaidInto">
+ pagado en
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ pase comprado a
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ cuotas pagadas para el evento
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ precio pagado por el evento
+ </string>
+ <string name="GroupMoneyBalance">
+ Saldo
+ </string>
+ <string name="GroupMoneyCredits">
+ Créditos
+ </string>
+ <string name="GroupMoneyDebits">
+ Débitos
+ </string>
+ <string name="ViewerObjectContents">
+ Contenidos
+ </string>
+ <string name="AcquiredItems">
+ Artículos adquiridos
+ </string>
+ <string name="Cancel">
+ Cancelar
+ </string>
+ <string name="UploadingCosts">
+ Subir [NAME] cuesta [AMOUNT] L$
+ </string>
+ <string name="BuyingCosts">
+ Comprar esto cuesta [AMOUNT] L$
+ </string>
+ <string name="UnknownFileExtension">
+ Extensión de archivo desconocida [.%s]
+Se esperaba .wav, .tga, .bmp, .jpg, .jpeg, o .bvh
+ </string>
+ <string name="MuteObject2">
+ Ignorar
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Guardarme este hito...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Editar este hito...
</string>
<string name="accel-mac-control">
- &#8963;
+ ⌃
</string>
<string name="accel-mac-command">
- &#8984;
+ ⌘
</string>
<string name="accel-mac-option">
- &#8997;
+ ⌥
</string>
<string name="accel-mac-shift">
- &#8679;
+ ⇧
</string>
<string name="accel-win-control">
Ctrl+
@@ -519,82 +1751,1643 @@ Si sigue recibiendo este mensaje, contacte con el [SUPPORT_SITE].
<string name="accel-win-shift">
Mayús+
</string>
- <string name="GraphicsQualityLow">
- Bajo
+ <string name="FileSaved">
+ Archivo guardado
</string>
- <string name="GraphicsQualityMid">
- Medio
+ <string name="Receiving">
+ Recibiendo
</string>
- <string name="GraphicsQualityHigh">
- Alto
+ <string name="AM">
+ AM
</string>
-
- <!-- PARCEL_CATEGORY_UI_STRING -->
- <string name="Linden Location">Localización Linden</string>
- <string name="Adult">&apos;Adult&apos;</string>
- <string name="Arts&amp;Culture">Arte y Cultura</string>
- <string name="Business">Negocios</string>
- <string name="Educational">Educativo</string>
- <string name="Gaming">Juegos de azar</string>
- <string name="Hangout">Entretenimiento</string>
- <string name="Newcomer Friendly">Para recién llegados</string>
- <string name="Parks&amp;Nature">Parques y Naturaleza</string>
- <string name="Residential">Residencial</string>
- <string name="Shopping">Compras</string>
- <string name="Other">Otra</string>
-
- <string name="ringing">
- Conectando al chat de voz...
+ <string name="PM">
+ PM
</string>
- <string name="connected">
- Conectado
+ <string name="PST">
+ PST
</string>
- <string name="unavailable">
- La voz no está disponible en su localización actual
+ <string name="PDT">
+ PDT
</string>
- <string name="hang_up">
- Desconectado del chat de voz
+ <string name="Forward">
+ Adelante
+ </string>
+ <string name="Left">
+ Izquierda
+ </string>
+ <string name="Right">
+ Derecha
+ </string>
+ <string name="Back">
+ Atrás
+ </string>
+ <string name="North">
+ Norte
+ </string>
+ <string name="South">
+ Sur
+ </string>
+ <string name="West">
+ Oeste
+ </string>
+ <string name="East">
+ Este
+ </string>
+ <string name="Up">
+ Arriba
+ </string>
+ <string name="Down">
+ Abajo
+ </string>
+ <string name="Any Category">
+ Cualquier categoría
+ </string>
+ <string name="Shopping">
+ Compras
+ </string>
+ <string name="Land Rental">
+ Terreno en alquiler
+ </string>
+ <string name="Property Rental">
+ Propiedad en alquiler
+ </string>
+ <string name="Special Attraction">
+ Atracción especial
+ </string>
+ <string name="New Products">
+ Nuevos productos
+ </string>
+ <string name="Employment">
+ Empleo
+ </string>
+ <string name="Wanted">
+ Se busca
+ </string>
+ <string name="Service">
+ Servicios
+ </string>
+ <string name="Personal">
+ Personal
+ </string>
+ <string name="None">
+ Ninguno
+ </string>
+ <string name="Linden Location">
+ Localización Linden
+ </string>
+ <string name="Adult">
+ &apos;Adult&apos;
+ </string>
+ <string name="Arts&amp;Culture">
+ Arte y Cultura
+ </string>
+ <string name="Business">
+ Negocios
+ </string>
+ <string name="Educational">
+ Educativo
+ </string>
+ <string name="Gaming">
+ Juegos de azar
+ </string>
+ <string name="Hangout">
+ Entretenimiento
+ </string>
+ <string name="Newcomer Friendly">
+ Para recién llegados
+ </string>
+ <string name="Parks&amp;Nature">
+ Parques y Naturaleza
+ </string>
+ <string name="Residential">
+ Residencial
+ </string>
+ <string name="Stage">
+ Artes escénicas
+ </string>
+ <string name="Other">
+ Otra
+ </string>
+ <string name="Any">
+ Cualquiera
+ </string>
+ <string name="You">
+ Tú
+ </string>
+ <string name="Multiple Media">
+ Múltiples medias
+ </string>
+ <string name="Play Media">
+ Play/Pausa los media
+ </string>
+ <string name="MBCmdLineError">
+ Ha habido un error analizando la línea de comando.
+Por favor, consulta: http://wiki.secondlife.com/wiki/Client_parameters
+Error:
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] Uso de línea de comando:
+ </string>
+ <string name="MBUnableToAccessFile">
+ [APP_NAME] no puede acceder a un archivo que necesita.
+
+Puede ser porque estés ejecutando varias copias, o porque tu sistema crea -equivocadamente- que el archivo está abierto.
+Si este mensaje persiste, reinicia tu ordenador y vuelve a intentarlo.
+Si aun así sigue apareciendo el mensaje, debes desinstalar completamente [APP_NAME] y reinstalarlo.
+ </string>
+ <string name="MBFatalError">
+ Error fatal
+ </string>
+ <string name="MBRequiresAltiVec">
+ [APP_NAME] requiere un procesador con AltiVec (G4 o posterior).
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] ya se está ejecutando.
+Revisa tu barra de tareas para encontrar una copia minimizada del programa.
+Si este mensaje persiste, reinicia tu ordenador.
+ </string>
+ <string name="MBFrozenCrashed">
+ En su anterior ejecución, [APP_NAME] se congeló o se cayó.
+¿Quieres enviar un informe de caída?
+ </string>
+ <string name="MBAlert">
+ Alerta
+ </string>
+ <string name="MBNoDirectX">
+ [APP_NAME] no encuentra DirectX 9.0b o superior.
+[APP_NAME] usa DirectX para detectar el hardware o los drivers no actualizados que pueden provocar problemas de estabilidad, ejecución pobre y caídas. Aunque puedes ejecutar [APP_NAME] sin él, recomendamos encarecidamente hacerlo con DirectX 9.0b.
+
+¿Quieres continuar?
+ </string>
+ <string name="MBWarning">
+ ¡Atención!
+ </string>
+ <string name="MBNoAutoUpdate">
+ Las actualizaciones automáticas no están todavía implementadas para Linux.
+Por favor, descarga la última versión desde www.secondlife.com.
+ </string>
+ <string name="MBRegClassFailed">
+ Fallo en RegisterClass
+ </string>
+ <string name="MBError">
+ Error
+ </string>
+ <string name="MBFullScreenErr">
+ No puede ejecutarse a pantalla completa de [WIDTH] x [HEIGHT].
+Ejecutándose en una ventana.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Error Shutdown destruyendo la ventana (DestroyWindow() failed)
+ </string>
+ <string name="MBShutdownErr">
+ Error Shutdown
+ </string>
+ <string name="MBDevContextErr">
+ No se puede construir el &apos;GL device context&apos;
+ </string>
+ <string name="MBPixelFmtErr">
+ No se puede encontrar un formato adecuado de píxel
+ </string>
+ <string name="MBPixelFmtDescErr">
+ No se puede conseguir la descripción del formato de píxel
+ </string>
+ <string name="MBTrueColorWindow">
+ Para ejecutarse, [APP_NAME] necesita True Color (32-bit).
+Por favor, en las configuraciones de tu ordenador ajusta el modo de color a 32-bit.
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] no puede ejecutarse porque no puede obtener un canal alpha de 8 bit. Generalmente, se debe a alguna cuestión de los drivers de la tarjeta de vídeo.
+Por favor, comprueba que tienes instalados los últimos drivers para tu tarjeta de vídeo.
+Comprueba también que tu monitor esta configurado para True Color (32-bit) en Panel de Control &gt; Apariencia y temas &gt; Pantalla.
+Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ No se puede configurar el formato de píxel
+ </string>
+ <string name="MBGLContextErr">
+ No se puede crear el &apos;GL rendering context&apos;
+ </string>
+ <string name="MBGLContextActErr">
+ No se puede activar el &apos;GL rendering context&apos;
+ </string>
+ <string name="MBVideoDrvErr">
+ [APP_NAME] no puede ejecutarse porque los drivers de tu tarjeta de vídeo o no están bien instalados, o no están actualizados, o son para hardware no admitido. Por favor, comprueba que tienes los drivers más actuales para tu tarjeta de vídeo, y, aunque los tengas, intenta reinstalarlos.
+
+Si sigues recibiendo este mensaje, contacta con [SUPPORT_SITE].
+ </string>
+ <string name="5 O&apos;Clock Shadow">
+ Barba del día
+ </string>
+ <string name="All White">
+ Blanco del todo
+ </string>
+ <string name="Anime Eyes">
+ Ojos de cómic
+ </string>
+ <string name="Arced">
+ Arqueadas
+ </string>
+ <string name="Arm Length">
+ Brazos: longitud
+ </string>
+ <string name="Attached">
+ Cortos
+ </string>
+ <string name="Attached Earlobes">
+ Lóbulos
+ </string>
+ <string name="Back Fringe">
+ Nuca: largo
+ </string>
+ <string name="Baggy">
+ Marcadas
+ </string>
+ <string name="Bangs">
+ Bangs
+ </string>
+ <string name="Beady Eyes">
+ Ojos pequeños
+ </string>
+ <string name="Belly Size">
+ Barriga: tamaño
+ </string>
+ <string name="Big">
+ Grande
+ </string>
+ <string name="Big Butt">
+ Culo grande
+ </string>
+ <string name="Big Hair Back">
+ Pelo: moño
+ </string>
+ <string name="Big Hair Front">
+ Pelo: tupé
+ </string>
+ <string name="Big Hair Top">
+ Pelo: melena alta
+ </string>
+ <string name="Big Head">
+ Cabeza grande
+ </string>
+ <string name="Big Pectorals">
+ Grandes pectorales
+ </string>
+ <string name="Big Spikes">
+ Crestas grandes
+ </string>
+ <string name="Black">
+ Negro
+ </string>
+ <string name="Blonde">
+ Rubio
+ </string>
+ <string name="Blonde Hair">
+ Pelo rubio
+ </string>
+ <string name="Blush">
+ Colorete
+ </string>
+ <string name="Blush Color">
+ Color del colorete
+ </string>
+ <string name="Blush Opacity">
+ Opacidad del colorete
+ </string>
+ <string name="Body Definition">
+ Definición del cuerpo
+ </string>
+ <string name="Body Fat">
+ Cuerpo: gordura
+ </string>
+ <string name="Body Freckles">
+ Pecas del cuerpo
+ </string>
+ <string name="Body Thick">
+ Cuerpo grueso
+ </string>
+ <string name="Body Thickness">
+ Cuerpo: grosor
+ </string>
+ <string name="Body Thin">
+ Cuerpo delgado
+ </string>
+ <string name="Bow Legged">
+ Abiertas
+ </string>
+ <string name="Breast Buoyancy">
+ Busto: firmeza
+ </string>
+ <string name="Breast Cleavage">
+ Busto: canalillo
+ </string>
+ <string name="Breast Size">
+ Busto: tamaño
+ </string>
+ <string name="Bridge Width">
+ Puente: ancho
+ </string>
+ <string name="Broad">
+ Aumentar
+ </string>
+ <string name="Brow Size">
+ Arco ciliar
+ </string>
+ <string name="Bug Eyes">
+ Bug Eyes
+ </string>
+ <string name="Bugged Eyes">
+ Ojos saltones
+ </string>
+ <string name="Bulbous">
+ Bulbosa
+ </string>
+ <string name="Bulbous Nose">
+ Nariz de porra
+ </string>
+ <string name="Bushy Eyebrows">
+ Cejijuntas
+ </string>
+ <string name="Bushy Hair">
+ Pelo tupido
+ </string>
+ <string name="Butt Size">
+ Culo: tamaño
+ </string>
+ <string name="bustle skirt">
+ Polisón
+ </string>
+ <string name="no bustle">
+ Sin polisón
+ </string>
+ <string name="more bustle">
+ Con polisón
+ </string>
+ <string name="Chaplin">
+ Cortito
+ </string>
+ <string name="Cheek Bones">
+ Pómulos
+ </string>
+ <string name="Chest Size">
+ Tórax: tamaño
+ </string>
+ <string name="Chin Angle">
+ Barbilla: ángulo
+ </string>
+ <string name="Chin Cleft">
+ Barbilla: contorno
+ </string>
+ <string name="Chin Curtains">
+ Barba en collar
+ </string>
+ <string name="Chin Depth">
+ Barbilla: largo
+ </string>
+ <string name="Chin Heavy">
+ Hacia la barbilla
+ </string>
+ <string name="Chin In">
+ Barbilla retraída
+ </string>
+ <string name="Chin Out">
+ Barbilla prominente
+ </string>
+ <string name="Chin-Neck">
+ Papada
+ </string>
+ <string name="Clear">
+ Transparente
+ </string>
+ <string name="Cleft">
+ Remarcar
+ </string>
+ <string name="Close Set Eyes">
+ Ojos juntos
+ </string>
+ <string name="Closed">
+ Cerrar
+ </string>
+ <string name="Closed Back">
+ Trasera cerrada
+ </string>
+ <string name="Closed Front">
+ Frontal cerrado
+ </string>
+ <string name="Closed Left">
+ Cerrada
+ </string>
+ <string name="Closed Right">
+ Cerrada
+ </string>
+ <string name="Coin Purse">
+ Poco abultada
+ </string>
+ <string name="Collar Back">
+ Espalda
+ </string>
+ <string name="Collar Front">
+ Escote
+ </string>
+ <string name="Corner Down">
+ Hacia abajo
+ </string>
+ <string name="Corner Up">
+ Hacia arriba
+ </string>
+ <string name="Creased">
+ Caídos
+ </string>
+ <string name="Crooked Nose">
+ Nariz torcida
+ </string>
+ <string name="Cuff Flare">
+ Acampanado
+ </string>
+ <string name="Dark">
+ Oscuridad
+ </string>
+ <string name="Dark Green">
+ Verde oscuro
+ </string>
+ <string name="Darker">
+ Más oscuros
+ </string>
+ <string name="Deep">
+ Remarcar
+ </string>
+ <string name="Default Heels">
+ Tacones por defecto
+ </string>
+ <string name="Dense">
+ Densas
+ </string>
+ <string name="Double Chin">
+ Mucha papada
+ </string>
+ <string name="Downturned">
+ Poco
+ </string>
+ <string name="Duffle Bag">
+ Muy abultada
+ </string>
+ <string name="Ear Angle">
+ Orejas: ángulo
+ </string>
+ <string name="Ear Size">
+ Orejas: tamaño
+ </string>
+ <string name="Ear Tips">
+ Orejas: forma
+ </string>
+ <string name="Egg Head">
+ Cabeza: ahuevada
+ </string>
+ <string name="Eye Bags">
+ Ojos: bolsas
+ </string>
+ <string name="Eye Color">
+ Ojos: color
+ </string>
+ <string name="Eye Depth">
+ Ojos: profundidad
+ </string>
+ <string name="Eye Lightness">
+ Ojos: brillo
+ </string>
+ <string name="Eye Opening">
+ Ojos: apertura
+ </string>
+ <string name="Eye Pop">
+ Ojos: simetría
+ </string>
+ <string name="Eye Size">
+ Ojos: tamaño
+ </string>
+ <string name="Eye Spacing">
+ Ojos: separación
+ </string>
+ <string name="Eyebrow Arc">
+ Cejas: arco
+ </string>
+ <string name="Eyebrow Density">
+ Cejas: densidad
+ </string>
+ <string name="Eyebrow Height">
+ Cejas: altura
+ </string>
+ <string name="Eyebrow Points">
+ Cejas: en V
+ </string>
+ <string name="Eyebrow Size">
+ Cejas: tamaño
+ </string>
+ <string name="Eyelash Length">
+ Pestañas: longitud
+ </string>
+ <string name="Eyeliner">
+ Contorno de ojos
+ </string>
+ <string name="Eyeliner Color">
+ Contorno de ojos: color
+ </string>
+ <string name="Eyes Bugged">
+ Eyes Bugged
+ </string>
+ <string name="Face Shear">
+ Cara: simetría
+ </string>
+ <string name="Facial Definition">
+ Rasgos marcados
+ </string>
+ <string name="Far Set Eyes">
+ Ojos separados
+ </string>
+ <string name="Fat Lips">
+ Prominentes
+ </string>
+ <string name="Female">
+ Mujer
+ </string>
+ <string name="Fingerless">
+ Sin dedos
+ </string>
+ <string name="Fingers">
+ Con dedos
+ </string>
+ <string name="Flared Cuffs">
+ Campana
+ </string>
+ <string name="Flat">
+ Redondeadas
+ </string>
+ <string name="Flat Butt">
+ Culo plano
+ </string>
+ <string name="Flat Head">
+ Cabeza plana
+ </string>
+ <string name="Flat Toe">
+ Empeine bajo
+ </string>
+ <string name="Foot Size">
+ Pie: tamaño
+ </string>
+ <string name="Forehead Angle">
+ Frente: ángulo
+ </string>
+ <string name="Forehead Heavy">
+ Hacia la frente
+ </string>
+ <string name="Freckles">
+ Pecas
+ </string>
+ <string name="Front Fringe">
+ Flequillo
+ </string>
+ <string name="Full Back">
+ Sin cortar
+ </string>
+ <string name="Full Eyeliner">
+ Contorno completo
+ </string>
+ <string name="Full Front">
+ Sin cortar
+ </string>
+ <string name="Full Hair Sides">
+ Pelo: volumen a los lados
+ </string>
+ <string name="Full Sides">
+ Volumen total
+ </string>
+ <string name="Glossy">
+ Con brillo
+ </string>
+ <string name="Glove Fingers">
+ Guantes: dedos
+ </string>
+ <string name="Glove Length">
+ Guantes: largo
+ </string>
+ <string name="Hair">
+ Pelo
+ </string>
+ <string name="Hair Back">
+ Pelo: nuca
+ </string>
+ <string name="Hair Front">
+ Pelo: delante
+ </string>
+ <string name="Hair Sides">
+ Pelo: lados
+ </string>
+ <string name="Hair Sweep">
+ Peinado: dirección
+ </string>
+ <string name="Hair Thickess">
+ Pelo: espesor
+ </string>
+ <string name="Hair Thickness">
+ Pelo: espesor
+ </string>
+ <string name="Hair Tilt">
+ Pelo: inclinación
+ </string>
+ <string name="Hair Tilted Left">
+ A la izq.
+ </string>
+ <string name="Hair Tilted Right">
+ A la der.
+ </string>
+ <string name="Hair Volume">
+ Pelo: volumen
+ </string>
+ <string name="Hand Size">
+ Manos: tamaño
+ </string>
+ <string name="Handlebars">
+ Muy largo
+ </string>
+ <string name="Head Length">
+ Cabeza: longitud
+ </string>
+ <string name="Head Shape">
+ Cabeza: forma
+ </string>
+ <string name="Head Size">
+ Cabeza: tamaño
+ </string>
+ <string name="Head Stretch">
+ Cabeza: estiramiento
+ </string>
+ <string name="Heel Height">
+ Tacón: altura
+ </string>
+ <string name="Heel Shape">
+ Tacón: forma
+ </string>
+ <string name="Height">
+ Altura
+ </string>
+ <string name="High">
+ Subir
+ </string>
+ <string name="High Heels">
+ Tacones altos
+ </string>
+ <string name="High Jaw">
+ Mandíbula alta
+ </string>
+ <string name="High Platforms">
+ Suela gorda
+ </string>
+ <string name="High and Tight">
+ Pegada
+ </string>
+ <string name="Higher">
+ Arrriba
+ </string>
+ <string name="Hip Length">
+ Cadera: altura
+ </string>
+ <string name="Hip Width">
+ Cadera: ancho
+ </string>
+ <string name="In">
+ Pegadas
+ </string>
+ <string name="In Shdw Color">
+ Línea de ojos: color
+ </string>
+ <string name="In Shdw Opacity">
+ Línea de ojos: opacidad
+ </string>
+ <string name="Inner Eye Corner">
+ Ojos: lagrimal
+ </string>
+ <string name="Inner Eye Shadow">
+ Inner Eye Shadow
+ </string>
+ <string name="Inner Shadow">
+ Línea de ojos
+ </string>
+ <string name="Jacket Length">
+ Chaqueta: largo
+ </string>
+ <string name="Jacket Wrinkles">
+ Chaqueta: arrugas
+ </string>
+ <string name="Jaw Angle">
+ Mandíbula: ángulo
+ </string>
+ <string name="Jaw Jut">
+ Maxilar inferior
+ </string>
+ <string name="Jaw Shape">
+ Mandíbula: forma
+ </string>
+ <string name="Join">
+ Más junto
+ </string>
+ <string name="Jowls">
+ Mofletes
+ </string>
+ <string name="Knee Angle">
+ Rodillas: ángulo
+ </string>
+ <string name="Knock Kneed">
+ Zambas
+ </string>
+ <string name="Large">
+ Aumentar
+ </string>
+ <string name="Large Hands">
+ Manos grandes
+ </string>
+ <string name="Left Part">
+ Raya: izq.
+ </string>
+ <string name="Leg Length">
+ Piernas: longitud
+ </string>
+ <string name="Leg Muscles">
+ Piernas: musculatura
+ </string>
+ <string name="Less">
+ Menos
+ </string>
+ <string name="Less Body Fat">
+ Menos gordura
+ </string>
+ <string name="Less Curtains">
+ Menos tupida
+ </string>
+ <string name="Less Freckles">
+ Menos pecas
+ </string>
+ <string name="Less Full">
+ Menos grosor
+ </string>
+ <string name="Less Gravity">
+ Más levantado
+ </string>
+ <string name="Less Love">
+ Menos michelines
+ </string>
+ <string name="Less Muscles">
+ Pocos músculos
+ </string>
+ <string name="Less Muscular">
+ Poca musculatura
+ </string>
+ <string name="Less Rosy">
+ Menos sonrosada
+ </string>
+ <string name="Less Round">
+ Menos redondeada
+ </string>
+ <string name="Less Saddle">
+ Menos cartucheras
+ </string>
+ <string name="Less Square">
+ Menos cuadrada
+ </string>
+ <string name="Less Volume">
+ Menos volumen
+ </string>
+ <string name="Less soul">
+ Pequeña
+ </string>
+ <string name="Lighter">
+ Más luminosos
+ </string>
+ <string name="Lip Cleft">
+ Labio: hoyuelo
+ </string>
+ <string name="Lip Cleft Depth">
+ Hoyuelo marcado
+ </string>
+ <string name="Lip Fullness">
+ Labios: grosor
+ </string>
+ <string name="Lip Pinkness">
+ Labios sonrosados
+ </string>
+ <string name="Lip Ratio">
+ Labios: ratio
+ </string>
+ <string name="Lip Thickness">
+ Labios: prominencia
+ </string>
+ <string name="Lip Width">
+ Labios: ancho
+ </string>
+ <string name="Lipgloss">
+ Brillo de labios
+ </string>
+ <string name="Lipstick">
+ Barra de labios
+ </string>
+ <string name="Lipstick Color">
+ Barra de labios: color
+ </string>
+ <string name="Long">
+ Más
+ </string>
+ <string name="Long Head">
+ Cabeza alargada
+ </string>
+ <string name="Long Hips">
+ Cadera larga
+ </string>
+ <string name="Long Legs">
+ Piernas largas
+ </string>
+ <string name="Long Neck">
+ Cuello largo
+ </string>
+ <string name="Long Pigtails">
+ Coletas largas
+ </string>
+ <string name="Long Ponytail">
+ Cola de caballo larga
+ </string>
+ <string name="Long Torso">
+ Torso largo
+ </string>
+ <string name="Long arms">
+ Brazos largos
+ </string>
+ <string name="Loose Pants">
+ Pantalón suelto
+ </string>
+ <string name="Loose Shirt">
+ Camiseta suelta
+ </string>
+ <string name="Loose Sleeves">
+ Puños anchos
+ </string>
+ <string name="Love Handles">
+ Michelines
+ </string>
+ <string name="Low">
+ Bajar
+ </string>
+ <string name="Low Heels">
+ Tacones bajos
+ </string>
+ <string name="Low Jaw">
+ Mandíbula baja
+ </string>
+ <string name="Low Platforms">
+ Suela fina
+ </string>
+ <string name="Low and Loose">
+ Suelta
+ </string>
+ <string name="Lower">
+ Abajo
+ </string>
+ <string name="Lower Bridge">
+ Puente: abajo
+ </string>
+ <string name="Lower Cheeks">
+ Mejillas: abajo
+ </string>
+ <string name="Male">
+ Varón
+ </string>
+ <string name="Middle Part">
+ Raya: en medio
+ </string>
+ <string name="More">
+ Más
+ </string>
+ <string name="More Blush">
+ Más colorete
+ </string>
+ <string name="More Body Fat">
+ Más gordura
+ </string>
+ <string name="More Curtains">
+ Más tupida
+ </string>
+ <string name="More Eyeshadow">
+ Más
+ </string>
+ <string name="More Freckles">
+ Más pecas
+ </string>
+ <string name="More Full">
+ Más grosor
+ </string>
+ <string name="More Gravity">
+ Menos levantado
+ </string>
+ <string name="More Lipstick">
+ Más barra de labios
+ </string>
+ <string name="More Love">
+ Más michelines
+ </string>
+ <string name="More Lower Lip">
+ Más el inferior
+ </string>
+ <string name="More Muscles">
+ Más músculos
+ </string>
+ <string name="More Muscular">
+ Más musculatura
+ </string>
+ <string name="More Rosy">
+ Más sonrosada
+ </string>
+ <string name="More Round">
+ Más redondeada
+ </string>
+ <string name="More Saddle">
+ Más cartucheras
+ </string>
+ <string name="More Sloped">
+ Más inclinada
+ </string>
+ <string name="More Square">
+ Más cuadrada
+ </string>
+ <string name="More Upper Lip">
+ Más el superior
+ </string>
+ <string name="More Vertical">
+ Más recta
+ </string>
+ <string name="More Volume">
+ Más volumen
+ </string>
+ <string name="More soul">
+ Grande
+ </string>
+ <string name="Moustache">
+ Bigote
+ </string>
+ <string name="Mouth Corner">
+ Comisuras
+ </string>
+ <string name="Mouth Position">
+ Boca: posición
+ </string>
+ <string name="Mowhawk">
+ Rapado
+ </string>
+ <string name="Muscular">
+ Muscular
+ </string>
+ <string name="Mutton Chops">
+ Patillas largas
+ </string>
+ <string name="Nail Polish">
+ Uñas pintadas
+ </string>
+ <string name="Nail Polish Color">
+ Uñas pintadas: color
+ </string>
+ <string name="Narrow">
+ Disminuir
+ </string>
+ <string name="Narrow Back">
+ Rapada
+ </string>
+ <string name="Narrow Front">
+ Entradas
+ </string>
+ <string name="Narrow Lips">
+ Labios estrechos
+ </string>
+ <string name="Natural">
+ Natural
+ </string>
+ <string name="Neck Length">
+ Cuello: longitud
+ </string>
+ <string name="Neck Thickness">
+ Cuello: grosor
+ </string>
+ <string name="No Blush">
+ Sin colorete
+ </string>
+ <string name="No Eyeliner">
+ Sin contorno
+ </string>
+ <string name="No Eyeshadow">
+ Menos
+ </string>
+ <string name="No Lipgloss">
+ Sin brillo
+ </string>
+ <string name="No Lipstick">
+ Sin barra de labios
+ </string>
+ <string name="No Part">
+ Sin raya
+ </string>
+ <string name="No Polish">
+ Sin pintar
+ </string>
+ <string name="No Red">
+ Nada
+ </string>
+ <string name="No Spikes">
+ Sin crestas
+ </string>
+ <string name="No White">
+ Sin blanco
+ </string>
+ <string name="No Wrinkles">
+ Sin arrugas
+ </string>
+ <string name="Normal Lower">
+ Normal Lower
+ </string>
+ <string name="Normal Upper">
+ Normal Upper
+ </string>
+ <string name="Nose Left">
+ Nariz a la izq.
+ </string>
+ <string name="Nose Right">
+ Nariz a la der.
+ </string>
+ <string name="Nose Size">
+ Nariz: tamaño
+ </string>
+ <string name="Nose Thickness">
+ Nariz: grosor
+ </string>
+ <string name="Nose Tip Angle">
+ Nariz: respingona
+ </string>
+ <string name="Nose Tip Shape">
+ Nariz: punta
+ </string>
+ <string name="Nose Width">
+ Nariz: ancho
+ </string>
+ <string name="Nostril Division">
+ Ventana: altura
+ </string>
+ <string name="Nostril Width">
+ Ventana: ancho
+ </string>
+ <string name="Opaque">
+ Opaco
+ </string>
+ <string name="Open">
+ Abrir
+ </string>
+ <string name="Open Back">
+ Apertura trasera
+ </string>
+ <string name="Open Front">
+ Apertura frontal
+ </string>
+ <string name="Open Left">
+ Abierta
+ </string>
+ <string name="Open Right">
+ Abierta
+ </string>
+ <string name="Orange">
+ Anaranjado
+ </string>
+ <string name="Out">
+ De soplillo
+ </string>
+ <string name="Out Shdw Color">
+ Sombra de ojos: color
+ </string>
+ <string name="Out Shdw Opacity">
+ Sombra de ojos: opacidad
+ </string>
+ <string name="Outer Eye Corner">
+ Ojos: comisura
+ </string>
+ <string name="Outer Eye Shadow">
+ Outer Eye Shadow
+ </string>
+ <string name="Outer Shadow">
+ Sombra de ojos
+ </string>
+ <string name="Overbite">
+ Retraído
+ </string>
+ <string name="Package">
+ Pubis
+ </string>
+ <string name="Painted Nails">
+ Pintadas
+ </string>
+ <string name="Pale">
+ Pálida
+ </string>
+ <string name="Pants Crotch">
+ Pantalón: cruz
+ </string>
+ <string name="Pants Fit">
+ Ceñido
+ </string>
+ <string name="Pants Length">
+ Pernera: largo
+ </string>
+ <string name="Pants Waist">
+ Caja
+ </string>
+ <string name="Pants Wrinkles">
+ Pantalón: arrugas
+ </string>
+ <string name="Part">
+ Raya
+ </string>
+ <string name="Part Bangs">
+ Flequillo partido
+ </string>
+ <string name="Pectorals">
+ Pectorales
+ </string>
+ <string name="Pigment">
+ Tono
+ </string>
+ <string name="Pigtails">
+ Coletas
+ </string>
+ <string name="Pink">
+ Rosa
+ </string>
+ <string name="Pinker">
+ Más sonrosados
+ </string>
+ <string name="Platform Height">
+ Suela: altura
+ </string>
+ <string name="Platform Width">
+ Suela: ancho
+ </string>
+ <string name="Pointy">
+ En punta
+ </string>
+ <string name="Pointy Heels">
+ De aguja
+ </string>
+ <string name="Ponytail">
+ Cola de caballo
+ </string>
+ <string name="Poofy Skirt">
+ Con vuelo
+ </string>
+ <string name="Pop Left Eye">
+ Izquierdo más grande
+ </string>
+ <string name="Pop Right Eye">
+ Derecho más grande
+ </string>
+ <string name="Puffy">
+ Hinchadas
+ </string>
+ <string name="Puffy Eyelids">
+ Ojeras
+ </string>
+ <string name="Rainbow Color">
+ Irisación
+ </string>
+ <string name="Red Hair">
+ Pelirrojo
+ </string>
+ <string name="Regular">
+ Regular
+ </string>
+ <string name="Right Part">
+ Raya: der.
+ </string>
+ <string name="Rosy Complexion">
+ Tez sonrosada
+ </string>
+ <string name="Round">
+ Redondear
+ </string>
+ <string name="Ruddiness">
+ Rubicundez
+ </string>
+ <string name="Ruddy">
+ Rojiza
+ </string>
+ <string name="Rumpled Hair">
+ Pelo encrespado
+ </string>
+ <string name="Saddle Bags">
+ Cartucheras
+ </string>
+ <string name="Scrawny Leg">
+ Piernas flacas
+ </string>
+ <string name="Separate">
+ Más ancho
+ </string>
+ <string name="Shallow">
+ Sin marcar
+ </string>
+ <string name="Shear Back">
+ Nuca: corte
+ </string>
+ <string name="Shear Face">
+ Shear Face
+ </string>
+ <string name="Shear Front">
+ Shear Front
+ </string>
+ <string name="Shear Left Up">
+ Arriba - izq.
+ </string>
+ <string name="Shear Right Up">
+ Arriba - der.
+ </string>
+ <string name="Sheared Back">
+ Rapada
+ </string>
+ <string name="Sheared Front">
+ Rapada
+ </string>
+ <string name="Shift Left">
+ A la izq.
+ </string>
+ <string name="Shift Mouth">
+ Boca: ladeada
+ </string>
+ <string name="Shift Right">
+ A la der.
+ </string>
+ <string name="Shirt Bottom">
+ Alto de cintura
+ </string>
+ <string name="Shirt Fit">
+ Ceñido
+ </string>
+ <string name="Shirt Wrinkles">
+ Camisa: arrugas
+ </string>
+ <string name="Shoe Height">
+ Caña: altura
+ </string>
+ <string name="Short">
+ Menos
+ </string>
+ <string name="Short Arms">
+ Brazos cortos
+ </string>
+ <string name="Short Legs">
+ Piernas cortas
+ </string>
+ <string name="Short Neck">
+ Cuello corto
+ </string>
+ <string name="Short Pigtails">
+ Coletas cortas
+ </string>
+ <string name="Short Ponytail">
+ Cola de caballo corta
+ </string>
+ <string name="Short Sideburns">
+ Patillas cortas
+ </string>
+ <string name="Short Torso">
+ Torso corto
+ </string>
+ <string name="Short hips">
+ Cadera corta
+ </string>
+ <string name="Shoulders">
+ Hombros
+ </string>
+ <string name="Side Fringe">
+ Lados: franja
+ </string>
+ <string name="Sideburns">
+ Patillas
+ </string>
+ <string name="Sides Hair">
+ Pelo: lados
+ </string>
+ <string name="Sides Hair Down">
+ Bajar lados del pelo
+ </string>
+ <string name="Sides Hair Up">
+ Subir lados del pelo
+ </string>
+ <string name="Skinny Neck">
+ Cuello estrecho
+ </string>
+ <string name="Skirt Fit">
+ Falda: vuelo
+ </string>
+ <string name="Skirt Length">
+ Falda: largo
+ </string>
+ <string name="Slanted Forehead">
+ Slanted Forehead
+ </string>
+ <string name="Sleeve Length">
+ Largo de manga
+ </string>
+ <string name="Sleeve Looseness">
+ Ancho de puños
+ </string>
+ <string name="Slit Back">
+ Raja trasera
+ </string>
+ <string name="Slit Front">
+ Raja frontal
+ </string>
+ <string name="Slit Left">
+ Raja a la izq.
+ </string>
+ <string name="Slit Right">
+ Raja a la der.
+ </string>
+ <string name="Small">
+ Disminuir
+ </string>
+ <string name="Small Hands">
+ Manos pequeñas
+ </string>
+ <string name="Small Head">
+ Cabeza pequeña
+ </string>
+ <string name="Smooth">
+ Leves
+ </string>
+ <string name="Smooth Hair">
+ Pelo liso
+ </string>
+ <string name="Socks Length">
+ Calcetines: largo
+ </string>
+ <string name="Soulpatch">
+ Perilla
+ </string>
+ <string name="Sparse">
+ Depiladas
+ </string>
+ <string name="Spiked Hair">
+ Crestas
+ </string>
+ <string name="Square">
+ Cuadrada
+ </string>
+ <string name="Square Toe">
+ Punta cuadrada
+ </string>
+ <string name="Squash Head">
+ Cabeza aplastada
+ </string>
+ <string name="Stretch Head">
+ Cabeza estirada
+ </string>
+ <string name="Sunken">
+ Chupadas
+ </string>
+ <string name="Sunken Chest">
+ Estrecho de pecho
+ </string>
+ <string name="Sunken Eyes">
+ Ojos hundidos
+ </string>
+ <string name="Sweep Back">
+ Sweep Back
+ </string>
+ <string name="Sweep Forward">
+ Sweep Forward
+ </string>
+ <string name="Tall">
+ Más
+ </string>
+ <string name="Taper Back">
+ Cubierta trasera
+ </string>
+ <string name="Taper Front">
+ Cubierta frontal
+ </string>
+ <string name="Thick Heels">
+ Tacones grandes
+ </string>
+ <string name="Thick Neck">
+ Cuello ancho
+ </string>
+ <string name="Thick Toe">
+ Empeine alto
+ </string>
+ <string name="Thin">
+ Delgadas
+ </string>
+ <string name="Thin Eyebrows">
+ Cejas finas
+ </string>
+ <string name="Thin Lips">
+ Hacia dentro
+ </string>
+ <string name="Thin Nose">
+ Nariz fina
+ </string>
+ <string name="Tight Chin">
+ Poca papada
+ </string>
+ <string name="Tight Cuffs">
+ Sin campana
+ </string>
+ <string name="Tight Pants">
+ Pantalón ceñido
+ </string>
+ <string name="Tight Shirt">
+ Camisa ceñida
+ </string>
+ <string name="Tight Skirt">
+ Falda ceñida
+ </string>
+ <string name="Tight Sleeves">
+ Puños ceñidos
+ </string>
+ <string name="Toe Shape">
+ Punta: forma
+ </string>
+ <string name="Toe Thickness">
+ Empeine
+ </string>
+ <string name="Torso Length">
+ Torso: longitud
+ </string>
+ <string name="Torso Muscles">
+ Torso: musculatura
+ </string>
+ <string name="Torso Scrawny">
+ Torso flacucho
+ </string>
+ <string name="Unattached">
+ Largos
+ </string>
+ <string name="Uncreased">
+ Abiertos
+ </string>
+ <string name="Underbite">
+ Prognatismo
+ </string>
+ <string name="Unnatural">
+ No natural
+ </string>
+ <string name="Upper Bridge">
+ Puente: arriba
+ </string>
+ <string name="Upper Cheeks">
+ Mejillas: arriba
+ </string>
+ <string name="Upper Chin Cleft">
+ Barbilla: prominencia
+ </string>
+ <string name="Upper Eyelid Fold">
+ Párpados
+ </string>
+ <string name="Upturned">
+ Mucho
+ </string>
+ <string name="Very Red">
+ Del todo
+ </string>
+ <string name="Waist Height">
+ Cintura
+ </string>
+ <string name="Well-Fed">
+ Mofletes
+ </string>
+ <string name="White Hair">
+ Pelo blanco
+ </string>
+ <string name="Wide">
+ Aumentar
+ </string>
+ <string name="Wide Back">
+ Completa
+ </string>
+ <string name="Wide Front">
+ Completa
+ </string>
+ <string name="Wide Lips">
+ Labios anchos
+ </string>
+ <string name="Wild">
+ Total
+ </string>
+ <string name="Wrinkles">
+ Arrugas
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Añadir a mis hitos
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Editar mis hitos
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ Ver más información de esta localización
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ Historial de mis localizaciones
+ </string>
+ <string name="LocationCtrlAdultIconTooltip">
+ Región Adulta
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ Región Moderada
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ Región General
+ </string>
+ <string name="UpdaterWindowTitle">
+ Actualizar [APP_NAME]
+ </string>
+ <string name="UpdaterNowUpdating">
+ Actualizando [APP_NAME]...
+ </string>
+ <string name="UpdaterNowInstalling">
+ Instalando [APP_NAME]...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Tu visor [APP_NAME] se está actualizando a la última versión. Llevará algún tiempo, paciencia.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Descargando la actualización...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Descargando la actualización
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Fallo en la descarga de la actualización
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ Ha habido un error actualizando [APP_NAME]. Por favor, descarga la última versión desde www.secondlife.com.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Fallo al instalar la actualización
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Fallo al iniciar el visor
+ </string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME]: Los ítems se reciben muy rápido de [FROM_NAME]; desactivada la vista previa automática durante [TIME] sgs.
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME]: Los ítems se reciben muy rápido; desactivada la vista previa automática durante [TIME] sgs.
+ </string>
+ <string name="IM_logging_string">
+ -- Activado el registro de los mensajes instantáneos --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] está escribiendo...
+ </string>
+ <string name="Unnamed">
+ (sin nombre)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Moderado: por defecto, desactivada la voz)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Para esta llamada no está disponible el chat de texto.
+ </string>
+ <string name="IM_muted_text_label">
+ Un moderador del grupo ha desactivado tu chat de texto.
+ </string>
+ <string name="IM_default_text_label">
+ Pulsa aquí para enviar un mensaje instantáneo.
+ </string>
+ <string name="IM_to_label">
+ A
+ </string>
+ <string name="IM_moderator_label">
+ (Moderador)
+ </string>
+ <string name="answered_call">
+ Han respondido a tu llamada
+ </string>
+ <string name="you_started_call">
+ Has iniciado una llamada de voz
+ </string>
+ <string name="you_joined_call">
+ Has entrado en la llamada de voz
+ </string>
+ <string name="name_started_call">
+ [NAME] inició una llamada de voz
+ </string>
+ <string name="ringing-im">
+ Haciendo la llamada de voz...
+ </string>
+ <string name="connected-im">
+ Conectado, pulsa Colgar para salir
+ </string>
+ <string name="hang_up-im">
+ Se colgó la llamada de voz
</string>
- <string name="ScriptQuestionCautionChatGranted">
- &apos;[OBJECTNAME]&apos;, un objeto propiedad de &apos;[OWNERNAME]&apos;, localizado en [REGIONNAME] con la posición [REGIONPOS], ha recibido permiso para: [PERMISSIONS].
- </string>
- <string name="ScriptQuestionCautionChatDenied">
- A &apos;[OBJECTNAME]&apos;, un objeto propiedad de &apos;[OWNERNAME]&apos;, localizado en [REGIONNAME] con la posición [REGIONPOS], se le ha denegado el permiso para: [PERMISSIONS].
- </string>
- <string name="ScriptTakeMoney">
- Cogerle a usted dólares Linden (L$)
- </string>
- <string name="ActOnControlInputs">
- Actuar en sus controles de entrada
- </string>
- <string name="RemapControlInputs">
- Reconfigurar sus controles de entrada
- </string>
- <string name="AnimateYourAvatar">
- Ejecutar animaciones en su avatar
- </string>
- <string name="AttachToYourAvatar">
- Anexarse a su avatar
- </string>
- <string name="ReleaseOwnership">
- Anular la propiedad y que pase a ser público
- </string>
- <string name="LinkAndDelink">
- Enlazar y desenlazar de otros objetos
- </string>
- <string name="AddAndRemoveJoints">
- Añadir y quitar uniones con otros objetos
- </string>
- <string name="ChangePermissions">
- Cambiar sus permisos
- </string>
- <string name="TrackYourCamera">
- Seguir su cámara
- </string>
- <string name="ControlYourCamera">
- Controlar su cámara
- </string>
-
<string name="only_user_message">
Usted es el único usuario en esta sesión.
</string>
@@ -604,6 +3397,12 @@ Si sigue recibiendo este mensaje, contacte con el [SUPPORT_SITE].
<string name="invite_message">
Pulse el botón [BUTTON NAME] para aceptar/conectar este chat de voz.
</string>
+ <string name="muted_message">
+ Has ignorado a este residente. Enviándole un mensaje, automáticamente dejarás de ignorarle.
+ </string>
+ <string name="generic">
+ Error en lo solicitado, por favor, inténtalo más tarde.
+ </string>
<string name="generic_request_error">
Error al hacer lo solicitado; por favor, inténtelo más tarde.
</string>
@@ -622,46 +3421,283 @@ Si sigue recibiendo este mensaje, contacte con el [SUPPORT_SITE].
<string name="not_a_mod_error">
Usted no es un moderador de la sesión.
</string>
+ <string name="muted">
+ Un moderador del grupo ha desactivado tu chat de texto.
+ </string>
<string name="muted_error">
Un moderador del grupo le ha desactivado el chat de texto.
</string>
<string name="add_session_event">
No se ha podido añadir usuarios a la sesión de chat con [RECIPIENT].
</string>
+ <string name="message">
+ No se ha podido enviar tu mensaje a la sesión de chat con [RECIPIENT].
+ </string>
<string name="message_session_event">
No se ha podido enviar su mensaje a la sesión de chat con [RECIPIENT].
</string>
+ <string name="mute">
+ Error moderando.
+ </string>
+ <string name="removed">
+ Se te ha sacado del grupo.
+ </string>
<string name="removed_from_group">
Ha sido eliminado del grupo.
</string>
<string name="close_on_no_ability">
Usted ya no tendrá más la capacidad de estar en la sesión de chat.
</string>
- <string name="AcctTypeResident">
- Residente
- </string>
- <string name="AcctTypeTrial">
- Prueba
- </string>
- <string name="AcctTypeCharterMember">
- Miembro fundador
- </string>
- <string name="AcctTypeEmployee">
- Empleado de Linden Lab
- </string>
- <string name="PaymentInfoUsed">
- Ha usado una forma de pago
- </string>
- <string name="PaymentInfoOnFile">
- Hay infor. de la forma de pago
- </string>
- <string name="NoPaymentInfoOnFile">
- Sin infor. de la forma de pago
- </string>
- <string name="AgeVerified">
- Edad verificada
- </string>
- <string name="NotAgeVerified">
- Edad no verificada
- </string>
+ <string name="unread_chat_single">
+ [SOURCES] ha dicho algo nuevo
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] ha dicho algo nuevo
+ </string>
+ <string name="session_initialization_timed_out_error">
+ Se ha agotado el tiempo del inicio de sesión
+ </string>
+ <string name="voice_morphing_url">
+ http://secondlife.com/landing/voicemorphing
+ </string>
+ <string name="paid_you_ldollars">
+ [NAME] te ha pagado [AMOUNT] L$
+ </string>
+ <string name="you_paid_ldollars">
+ Has pagado [AMOUNT] L$ a [NAME] por [REASON].
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ Has pagado[AMOUNT] L$
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ Has pagado [AMOUNT] L$ a [NAME].
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ Has pagado [AMOUNT] L$ por [REASON].
+ </string>
+ <string name="for a parcel of land">
+ para una parcela de terreno
+ </string>
+ <string name="for a land access pass">
+ para un pase de acceso a terrenos
+ </string>
+ <string name="for deeding land">
+ for deeding land
+ </string>
+ <string name="to create a group">
+ para crear un grupo
+ </string>
+ <string name="to join a group">
+ para entrar a un grupo
+ </string>
+ <string name="to upload">
+ to upload
+ </string>
+ <string name="giving">
+ Dando [AMOUNT] L$
+ </string>
+ <string name="uploading_costs">
+ Subir esto cuesta [AMOUNT] L$
+ </string>
+ <string name="this_costs">
+ Esto cuesta [AMOUNT] L$
+ </string>
+ <string name="buying_selected_land">
+ Compra del terreno seleccionado por [AMOUNT] L$
+ </string>
+ <string name="this_object_costs">
+ Este objeto cuesta [AMOUNT] L$
+ </string>
+ <string name="group_role_everyone">
+ Todos
+ </string>
+ <string name="group_role_officers">
+ Oficiales
+ </string>
+ <string name="group_role_owners">
+ Propietarios
+ </string>
+ <string name="uploading_abuse_report">
+ Subiendo...
+
+Denuncia de infracción
+ </string>
+ <string name="New Shape">
+ Anatomía nueva
+ </string>
+ <string name="New Skin">
+ Piel nueva
+ </string>
+ <string name="New Hair">
+ Pelo nuevo
+ </string>
+ <string name="New Eyes">
+ Ojos nuevos
+ </string>
+ <string name="New Shirt">
+ Camisa nueva
+ </string>
+ <string name="New Pants">
+ Pantalón nuevo
+ </string>
+ <string name="New Shoes">
+ Zapatos nuevos
+ </string>
+ <string name="New Socks">
+ Calcetines nuevos
+ </string>
+ <string name="New Jacket">
+ Chaqueta nueva
+ </string>
+ <string name="New Gloves">
+ Guantes nuevos
+ </string>
+ <string name="New Undershirt">
+ Camiseta nueva
+ </string>
+ <string name="New Underpants">
+ Ropa interior nueva
+ </string>
+ <string name="New Skirt">
+ Falda nueva
+ </string>
+ <string name="New Alpha">
+ Nueva Alfa
+ </string>
+ <string name="New Tattoo">
+ Tatuaje nuevo
+ </string>
+ <string name="Invalid Wearable">
+ No se puede poner
+ </string>
+ <string name="New Script">
+ Script nuevo
+ </string>
+ <string name="New Folder">
+ Carpeta nueva
+ </string>
+ <string name="Contents">
+ Contenidos
+ </string>
+ <string name="Gesture">
+ Gestos
+ </string>
+ <string name="Male Gestures">
+ Gestos de hombre
+ </string>
+ <string name="Female Gestures">
+ Gestos de mujer
+ </string>
+ <string name="Other Gestures">
+ Otros gestos
+ </string>
+ <string name="Speech Gestures">
+ Gestos al hablar
+ </string>
+ <string name="Common Gestures">
+ Gestos corrientes
+ </string>
+ <string name="Male - Excuse me">
+ Varón - Disculpa
+ </string>
+ <string name="Male - Get lost">
+ Varón – Déjame en paz
+ </string>
+ <string name="Male - Blow kiss">
+ Varón - Lanzar un beso
+ </string>
+ <string name="Male - Boo">
+ Varón - Abucheo
+ </string>
+ <string name="Male - Bored">
+ Varón - Aburrido
+ </string>
+ <string name="Male - Hey">
+ Varón – ¡Eh!
+ </string>
+ <string name="Male - Laugh">
+ Varón - Risa
+ </string>
+ <string name="Male - Repulsed">
+ Varón - Rechazo
+ </string>
+ <string name="Male - Shrug">
+ Varón - Encogimiento de hombros
+ </string>
+ <string name="Male - Stick tougue out">
+ Varón - Sacando la lengua
+ </string>
+ <string name="Male - Wow">
+ Varón - Admiración
+ </string>
+ <string name="Female - Excuse me">
+ Mujer - Disculpa
+ </string>
+ <string name="Female - Get lost">
+ Mujer – Déjame en paz
+ </string>
+ <string name="Female - Blow kiss">
+ Mujer - Lanzar un beso
+ </string>
+ <string name="Female - Boo">
+ Mujer - Abucheo
+ </string>
+ <string name="Female - Bored">
+ Mujer - Aburrida
+ </string>
+ <string name="Female - Hey">
+ Mujer - ¡Eh!
+ </string>
+ <string name="Female - Laugh">
+ Mujer - Risa
+ </string>
+ <string name="Female - Repulsed">
+ Mujer - Rechazo
+ </string>
+ <string name="Female - Shrug">
+ Mujer - Encogimiento de hombros
+ </string>
+ <string name="Female - Stick tougue out">
+ Mujer - Sacando la lengua
+ </string>
+ <string name="Female - Wow">
+ Mujer - Admiración
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ ninguno/ninguno
+ </string>
+ <string name="texture_load_dimensions_error">
+ No se puede subir imágenes mayores de [WIDTH]*[HEIGHT]
+ </string>
+ <string name="words_separator" value=","/>
+ <string name="server_is_down">
+ Parece que hay algún problema que ha escapado a nuestros controles.
+
+ Visita status.secondlifegrid.net para ver si hay alguna incidencia conocida que esté afectando al servicio.
+ Si sigues teniendo problemas, comprueba la configuración de la red y del servidor de seguridad.
+ </string>
+ <string name="dateTimeWeekdaysNames">
+ Domingo:Lunes:Martes:Miércoles:Jueves:Viernes:Sábado
+ </string>
+ <string name="dateTimeWeekdaysShortNames">
+ Dom:Lun:Mar:Mié:Jue:Vie:Sáb
+ </string>
+ <string name="dateTimeMonthNames">
+ Enero:Febrero:Marzo:Abril:Mayo:Junio:Julio:Agosto:Septiembre:Octubre:Noviembre:Diciembre
+ </string>
+ <string name="dateTimeMonthShortNames">
+ Ene:Feb:Mar:Abr:May:Jun:Jul:Ago:Sep:Oct:Nov:Dic
+ </string>
+ <string name="dateTimeDayFormat">
+ [MDAY]
+ </string>
+ <string name="dateTimeAM">
+ AM
+ </string>
+ <string name="dateTimePM">
+ PM
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/es/teleport_strings.xml b/indra/newview/skins/default/xui/es/teleport_strings.xml
index 6cf5437e3c..e0e0061729 100644
--- a/indra/newview/skins/default/xui/es/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/es/teleport_strings.xml
@@ -2,15 +2,15 @@
<teleport_messages>
<message_set name="errors">
<message name="invalid_tport">
- Ha habido un problema al procesar su petición de teleporte. Debe volver a iniciar sesión para poder teleportarse. Si le sigue apareciendo este mensaje, revise, por favor, las preguntas frecuentes en el Soporte técnico:
-www.secondlife.com/support
+ Ha habido un problema al procesar tu petición de teleporte. Debes volver a iniciar sesión antes de poder teleportarte de nuevo.
+Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE].
</message>
<message name="invalid_region_handoff">
- Ha habido un problema al procesar su paso a otra región. Debe volver a iniciar sesión para poder pasar de región a región. Si le sigue apareciendo este mensaje, revise, por favor, las preguntas frecuentes en el Soporte técnico:
-www.secondlife.com/support
+ Ha habido un problema al procesar tu paso a otra región. Debes volver a iniciar sesión para poder pasar de región a región.
+Si sigues recibiendo este mensaje, por favor, acude al [SUPPORT_SITE].
</message>
<message name="blocked_tport">
- Lo sentimos, en estos momentos los teleportes están bloqueados. Vuelva a intentarlo en un momento. Si sigue sin poder teleportarse, desconéctese y vuelva a iniciar sesión para solucionar el problema.
+ Lo sentimos, en estos momentos los teleportes están bloqueados. Vuelve a intentarlo en un momento. Si sigues sin poder teleportarte, desconéctate y vuelve a iniciar sesión para solucionar el problema.
</message>
<message name="nolandmark_tport">
Lo sentimos, pero el sistema no ha podido localizar el destino de este hito.
@@ -20,22 +20,22 @@ www.secondlife.com/support
Vuelva a intentarlo en un momento.
</message>
<message name="noaccess_tport">
- Lo sentimos, pero usted no tiene acceso al destino de este teleporte.
+ Lo sentimos, pero no tienes acceso al destino de este teleporte.
</message>
<message name="missing_attach_tport">
- Aún no han llegado sus objetos anexados. Espere unos segundos más o desconéctese y vuelva a iniciar sesión antes de teleportarse.
+ Aún no han llegado tus objetos anexados. Espera unos segundos más o desconéctate y vuelve a iniciar sesión antes de teleportarte.
</message>
<message name="too_many_uploads_tport">
- La cola de espera en esta región está actualmente obstruida, por lo que su petición de teleporte no se atenderá en un tiempo prudencial. Por favor, vuelva a intentarlo en unos minutos o vaya a una zona menos ocupada.
+ La cola de espera en esta región está actualmente obstruida, por lo que tu petición de teleporte no se atenderá en un tiempo prudencial. Por favor, vuelve a intentarlo en unos minutos o ve a una zona menos ocupada.
</message>
<message name="expired_tport">
- Lo sentimos, pero el sistema no ha podido atender a su petición de teleporte en un tiempo prudencial. Por favor, vuelva a intentarlo en unos pocos minutos.
+ Lo sentimos, pero el sistema no ha podido atender a tu petición de teleporte en un tiempo prudencial. Por favor, vuelve a intentarlo en unos minutos.
</message>
<message name="expired_region_handoff">
- Lo sentimos, pero el sistema no ha podido completar su paso a otra región en un tiempo prudencial. Por favor, vuelva a intentarlo en unos pocos minutos.
+ Lo sentimos, pero el sistema no ha podido completar tu paso a otra región en un tiempo prudencial. Por favor, vuelve a intentarlo en unos minutos.
</message>
<message name="no_host">
- Ha sido imposible encontrar el destino del teleporte: o está desactivado temporalmente o ya no existe. Por favor, vuelva a intentarlo en unos pocos minutos.
+ Ha sido imposible encontrar el destino del teleporte: o está desactivado temporalmente o ya no existe. Por favor, vuelve a intentarlo en unos minutos.
</message>
<message name="no_inventory_host">
En estos momentos no está disponible el sistema del inventario.
@@ -60,6 +60,9 @@ Vuelva a intentarlo en un momento.
<message name="completing">
Completando el teleporte.
</message>
+ <message name="completed_from">
+ Teleporte realizado desde [T_SLURL]
+ </message>
<message name="resolving">
Especificando el destino.
</message>
diff --git a/indra/newview/skins/default/xui/fr/floater_about.xml b/indra/newview/skins/default/xui/fr/floater_about.xml
index 7d6d736c5e..a1cbeecfb9 100644
--- a/indra/newview/skins/default/xui/fr/floater_about.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about.xml
@@ -8,7 +8,7 @@
Compilé avec [COMPILER] version [COMPILER_VERSION]
</floater.string>
<floater.string name="AboutPosition">
- Vous êtes à [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] dans [REGION] se trouvant à [HOSTNAME] ([HOSTIP])
+ Vous êtes à [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] dans [REGION] se trouvant à &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
[SERVER_VERSION]
[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
</floater.string>
@@ -23,13 +23,13 @@ Cartes graphiques : [GRAPHICS_CARD]
Version Windows Graphics Driver : [GRAPHICS_DRIVER_VERSION]
</floater.string>
<floater.string name="AboutLibs">
- Version OpenGL : [OPENGL_VERSION]
+ Version OpenGL : [OPENGL_VERSION]
Version libcurl : [LIBCURL_VERSION]
-Version J2C Decoder : [J2C_VERSION]
-Version Audio Driver : [AUDIO_DRIVER_VERSION]
-Version Qt Webkit : [QT_WEBKIT_VERSION]
-Version Vivox : [VIVOX_VERSION]
+Version J2C Decoder : [J2C_VERSION]
+Version Audio Driver : [AUDIO_DRIVER_VERSION]
+Version Qt Webkit : [QT_WEBKIT_VERSION]
+Version serveur vocal : [VOICE_VERSION]
</floater.string>
<floater.string name="none">
(aucun)
@@ -43,13 +43,14 @@ Version Vivox : [VIVOX_VERSION]
</panel>
<panel label="Remerciements" name="credits_panel">
<text_editor name="credits_editor">
- Second Life existe grâce aux efforts de Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl et de nombreuses autres personnes.
+ Second Life existe grâce aux efforts de Philip, Tessa, Andrew, Cory, Ian, James, Phoenix, Ryan, Haney, Dan, Char, Ben, John, Tanya, Eddie, Richard, Mitch, Doug, Eric, Frank, Bruce, Aaron, Peter, Alice, Charlie, Debra, Eileen, Helen, Janet, Steffan, Steve, Tom, Mark, Hunter, Xenon, Burgess, Bill, Jim, Lee, Hamlet, Daniel, Jeff, Todd, Sarah, Tim, Stephanie, Colin, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Jack, Vektor, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Jesse, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Yuko, Makiko, Thomas, Harry, Seth, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Brad, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, Beez, Milo, Hermia, Red, Thrax, Gulliver, Joe, Sally, Paul, Jose, Rejean, Dore, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, Dustin, George, Del, Matthew, Cat, Jacqui, Adrian, Viola, Alfred, Noel, Irfan, Yool, Rika, Jane, Frontier, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Jeremy, JP, Jake, Anthony, Maurice, Madhavi, Leopard, Kyle, Joon, Bert, Belinda, Jon, Kristi, Bridie, Pramod, Socrates, Maria, Aric, Adreanne, Jay, Kari, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Colossus, Zen, BigPapi, Pastrami, Kurz, Mani, Neuro, Mel, Sardonyx, MJ, Rowan, Sgt, Elvis, Samuel, Leo, Bryan, Niko, Austin, Soft, Poppy, Rachel, Aki, Banzai, Alexa, Sue, Bender, CG, Angelo, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Rothman, Niall, Marin, Allison, Katie, Dawn, Dusty, Katt, Judy, Andrea, Ambroff, Infinity, Rico, Gail, Kalpana, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Maestro, Simone, Yang, T, Shannon, Nelson, Khanh, Scott, Courtney, Charlene, Quixote, Susan, Zed, Amanda, Katelin, Enkidu, Roxie, Esbee, JoRoan, Scarlet, Tay, Kevin, Wolfgang, Johnny, Ray, Andren, Merov, Bob, Rand, Howard, Callen, Heff, Galen, Newell, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl, Ashley, JessieAnn, Huseby, Karina, Paris, Kurt, Rick, Lis, Kotler, Theeba, Lynx, Murphy, Doten, Taka, Norm, Jillian, Marcus, Mae, Novack, Esther, Perry, Dana, Ducot, Javier, Porter, Madison, Gecko, Dough, JR, Gisele, Crimp, Norie, Arch, Kimi, Fisher, Barbara, Jason, Peggy, Bernard, Jules, Leroy, Eva, Khederian, Campbell, Vogt, Masido, Karel, Torres, Lo, Breezer, Delby, Rountree, Anna, Servus, Rue, Itiaes, Chuck, Luna, Novella, Zaza, Wen, Gino, Lex, Cassandra, Limey, Nancy, Anukul, Silver, Brodesky, Jinsai, Squid, Gez, Rakesh, Ladan, Edelman, Marcet, Squire, Tatem, Tony, Jerm, Tia, Falcon, BK, Tiggs, Driscoll, Bacon, Timothee, Cru, Carmilla, Coyot, Webb, Kazu, Rudas, LJ, Sea, Ali Wallace, Bewest, Pup, Drub, Dragon, Inoshiro, Byron, Rhett, Xandix, Aimee, Fredrik, Thor, Teddy, Baron, Nelly, Ghengis, Epic, Eli, Stone, Grapes, Irie, Prep, Scobu, Valerie, Alain et bien d&apos;autres.
- Tous nos remerciements aux résidents suivants pour avoir testé cette version (la meilleure qui soit jusqu&apos;à présent) : able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
+Tous nos remerciements aux résidents suivants pour avoir testé cette version (la meilleure qui soit jusqu&apos;à présent) : Drew Dwi, Zai Lynch, Latif Khalifa, Ellla McMahon, Harleen Gretzky, Squirrel Wood, Malarthi Behemoth, Dante Tucker, Buckaroo Mu, Eddi Decosta, Dirk, Talamasca, Torben Trautman, Irene Muni, Lilly Zenovka, Vick Forcella, Sasy Scarborough, Gentle Welinder, Elric Anatine, Techwolf Lupindo, Dusan Writer, WolfPup Lowenhar, Marianne McCann, Fiachra Lach, Sitearm Madonna, Sudane Erato, Sahkolihaa Contepomi, Sachi Vixen, Questar Utu, Dimitrio Lewis, Matto Destiny, Scrim Pinion, Radio Signals, Psi Merlin, Pixel Gausman, Mel Vanbeeck, Laurent Bechir, Lamorna Proctor, Lares Carter, Gwyneth Llewelyn, Hydra Shaftoe, Holger Gilruth, Gentle Heron, Carla Broek, Boroondas Gupte, Fury Rosewood, Flower Ducatillon, Colpo Wexler, gwampa Lomu, Borg Capalini, Beansy Twine, Ardy Lay, , 45ms Zhong, Adeon Writer, Aeonix Aeon, Ai Austin, Aiko Ying, Alexandrea Fride, Alliez Mysterio, Annie Milestone, Annika Genezzia, Ansariel Hiller, ArminasX Saiman, Arya Braveheart, Asaeda Meltingdots, Asturkon Jua, Avallyn Oakleaf, Avatar Quinzet, BabyA Littlething, Bacchus Ireto, Bazaar, Riva, Benjamin Bigdipper, Beth Walcher, Bezilon Kasei, Biancaluce Robbiani, Bill Walach, blakopal Galicia, Blitzckreed Levenque, Bryn Oh, Callipygian Christensen, Cap Carver, Carr Arbenlow, Chantal Harvey, Charles Courtois, Charlie Sazaland, Cherry Cheevers, ChickyBabes Zuzu, Christopher Organiser, Ciaran Laval, Clara Young, Celierra Darling, Corinne Helendale, Corro Moseley, Coughdrop Littlething, Darien Caldwell, Dartagan Shepherd, Debs Regent, Decro Schmooz, Denim Kamachi, DiJodi Dubratt, Dil Spitz, Edgware Marker, Egehan Dryke, Emma Portilo, Emmie Fairymeadow, Evangelista Emerald, Faelon Swordthain, Frenchimmo Sabra, Gaberoonie Zanzibar, Ganymedes Costagravas, Gene Frostbite, GeneJ Composer, Giggles Littlebird, Grady Echegaray, Guni Greenstein, Gypsy Tripsa, Hackshaven Harford, Ham Rambler, Han Shuffle, Hanglow Short, Hatzfeld Runo, herina Bode, Horatio Freund, Hypatia Callisto, Hypatia Pickens, Identity Euler, Imnotgoing Sideways, Innula Zenovka, Iyoba Tarantal, Jack Abraham, Jagga Meredith, Jennifer Boyle, Jeremy Marquez, Jessica Qin, Jinx Nordberg, Jo Bernandes, Jocial Sonnenkern, Joel Savard, Jondan Lundquist, Josef Munster, Josette Windlow, Juilan Tripsa, Juro Kothari, Justin RiversRunRed, Kagehi Kohn, Kaimen Takahe, Keklily Longfall, Ken Lavender, Kestral Karas, Khisme Nitely, Kimar Coba, Kithrak Kirkorian, Kitty Barnett, Kolor Fall, Komiko Okamoto, Korvel Noh, Larry Pixel, Leal Choche, len Starship, Lenae Munz, Lexi Frua, Lillie Cordeaux, Lizzy Macarthur, LSL Scientist, Luban Yiyuan, Luc Starsider, Maccus McCullough, Madison Blanc, Maggie Darwin, Mallory Destiny, Manx Wharton, Marc Claridge, Marc2 Sands, Matthew Anthony, Maxim RiversRunRed, Medhue Simoni, Melinda Latynina, Mencius Watts, Michi Lumin, Midian Farspire, Miles Glaz, Mindy Mathy, Mitch Wagner, Mo Hax, Mourna Biziou, Nao Noe, naofan Teardrop, Naomah Beaumont, Nathiel Siamendes, Nber Medici, Neko Link, Netpat Igaly, Neutron Chesnokov, Newfie Pendragon, Nicholai Laviscu, Nick Rhodes, Nicoladie Gymnast, Ollie Kubrick, Orenj Marat, Orion Delphis, Oryx Tempel, Parvati Silverweb, PeterPunk Mooney, Pixel Scientist, Pounce Teazle, Professor Noarlunga, Quantum Destiny, Quicksilver Hermes, Ralf Setsuko, RAT Quan, RedMokum Bravin, Revolution Perenti, Rezit Sideways, Rich Grainger, Rosco Teardrop, Rose Evans, Rudee Voom, RufusTT Horsefly, Saii Hallard, SaintLEOlions Zimer, Samm Larkham, Satanello Miami, SexySteven Morrisey, Sheet Spotter, Shnurui Troughton, sicarius Thorne, Sicarius Toxx, Sini Nubalo, SLB Wirefly, snowy Sidran, Soupa Segura, ST Mensing, Starshine Halasy, Stickman Ingmann, Synystyr Texan, Takeda Terrawyng, Tali Rosca, Templar Merlin, Tezcatlipoca Bisiani, Tiel Stonecutter, Tony Kembia, TouchaHoney Perhaps, Trey Reanimator, TriloByte Zanzibar, Trinity Dechou, Trinity Dejavu, Unlikely Quintessa, UsikuFarasi Kanarik, Veritas Raymaker, Vex Streeter, Viaticus Speculaas, Villain Baroque, Vixie Durant, Void Singer, Watty Berkson, Westley Schridde, Westley Streeter, Whimsy Winx, Winter Ventura, Wundur Primbee, xstorm Radek, YongYong Francois, Zak Westminster, Zana Kohime, Zaren Alexander, Zeja Pyle, ZenMondo Wormser, Zoex Flanagan et bien d&apos;autres.
- Pour réussir dans les affaires, soyez audacieux, créatif et différent. - Henry Marchant
+
+« Le travail continue, la cause demeure, l&apos;espoir vit encore et le rêve ne mourra jamais » - Edward Kennedy
</text_editor>
</panel>
<panel label="Licences" name="licenses_panel">
@@ -61,7 +62,8 @@ Version Vivox : [VIVOX_VERSION]
FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
GL Copyright (C) 1999-2004 Brian Paul.
Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
- jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
+ jpeg2000 Copyright (C) 2001, David Taubman, The University of New South
+ Wales (UNSW)
jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
ogg/vorbis Copyright (C) 2001, Xiphophorus
OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
@@ -73,7 +75,8 @@ Version Vivox : [VIVOX_VERSION]
Tous droits réservés. Voir licenses.txt pour plus de détails.
- Codage Audio du chat vocal : Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
+ Codage Audio du chat vocal : Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1
+ Annex C)
</text_editor>
</panel>
</tab_container>
diff --git a/indra/newview/skins/default/xui/fr/floater_about_land.xml b/indra/newview/skins/default/xui/fr/floater_about_land.xml
index 4c97551e55..ff49fd4536 100644
--- a/indra/newview/skins/default/xui/fr/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about_land.xml
@@ -1,5 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterland" title="À PROPOS DES TERRAINS">
+<floater name="floaterland" title="À PROPOS DU TERRAIN">
+ <floater.string name="maturity_icon_general">
+ &quot;Parcel_PG_Dark&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_moderate">
+ &quot;Parcel_M_Dark&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_adult">
+ &quot;Parcel_R_Dark&quot;
+ </floater.string>
<floater.string name="Minutes">
[MINUTES] minutes
</floater.string>
@@ -12,10 +21,10 @@
<floater.string name="Remaining">
restantes
</floater.string>
- <tab_container name="landtab">
+ <tab_container name="landtab" tab_min_width="60">
<panel label="GÉNÉRAL" name="land_general_panel">
<panel.string name="new users only">
- Nouveaux utilisateurs uniquement
+ Nouveaux résidents uniquement
</panel.string>
<panel.string name="anyone">
Tout le monde
@@ -53,6 +62,9 @@
<panel.string name="no_selection_text">
Aucune parcelle sélectionnée.
</panel.string>
+ <panel.string name="time_stamp_template">
+ [wkday,datetime,local] [day,datetime,local] [mth,datetime,local] [year,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ </panel.string>
<text name="Name:">
Nom :
</text>
@@ -71,7 +83,7 @@
Catégorie :
</text>
<text name="ContentRatingText">
- Adult
+ Adulte
</text>
<text name="Owner:">
Propriétaire :
@@ -99,7 +111,7 @@
Prix : [PRICE] L$ ([PRICE_PER_SQM] L$/m²)
</text>
<text name="SalePending"/>
- <button label="Vendez du terrain" label_selected="Vendre le terrain..." name="Sell Land..."/>
+ <button label="Vendre le terrain" label_selected="Vendre le terrain..." name="Sell Land..."/>
<text name="For sale to">
À vendre à : [BUYER]
</text>
@@ -109,7 +121,7 @@
<text name="Selling with no objects in parcel.">
Objets non inclus dans la vente
</text>
- <button label="Annuler la vente du terrain" label_selected="Annuler la vente du terrain" left="275" name="Cancel Land Sale" width="165"/>
+ <button label="Annuler la vente du terrain" label_selected="Annuler la vente du terrain" name="Cancel Land Sale"/>
<text name="Claimed:">
Acquis :
</text>
@@ -128,10 +140,10 @@
<text name="DwellText">
0
</text>
- <button label="Acheter du terrain" label_selected="Acheter le terrain..." left="130" name="Buy Land..." width="125"/>
- <button label="Infos sur les scripts" name="Scripts..."/>
+ <button label="Acheter du terrain" label_selected="Acheter le terrain..." left_delta="60" name="Buy Land..." width="125"/>
+ <button label="Infos sur les scripts" name="Scripts..." width="110"/>
<button label="Acheter pour le groupe" label_selected="Acheter pour le groupe..." name="Buy For Group..."/>
- <button label="Acheter un pass" label_selected="Acheter un pass..." left="130" name="Buy Pass..." tool_tip="Un pass vous donne un accès temporaire à ce terrain." width="125"/>
+ <button label="Acheter un pass" label_selected="Acheter un pass..." left_delta="-127" name="Buy Pass..." tool_tip="Un pass vous donne un accès temporaire à ce terrain." width="125"/>
<button label="Abandonner le terrain" label_selected="Abandonner le terrain..." name="Abandon Land..."/>
<button label="Récupérer le terrain" label_selected="Redemander le terrain…" name="Reclaim Land..."/>
<button label="Vente Linden" label_selected="Vente Linden..." name="Linden Sale..." tool_tip="Le terrain doit être la propriété d&apos;un résident, avoir un contenu défini et ne pas être aux enchères."/>
@@ -252,13 +264,13 @@ ou divisé.
</text>
<button label="Afficher" label_selected="Afficher" name="ShowOther" right="-135" width="60"/>
<button label="Retour" label_selected="Renvoyer..." name="ReturnOther..." right="-10" tool_tip="Renvoyer les objets à leurs propriétaires." width="119"/>
- <text left="14" name="Selected / sat upon:" width="193">
+ <text left="14" name="Selected / sat upon:" width="220">
Sélectionnées/où quelqu&apos;un est assis :
</text>
- <text left="214" name="selected_objects_text" width="48">
+ <text left_delta="214" name="selected_objects_text" width="48">
[COUNT]
</text>
- <text left="4" name="Autoreturn" width="412">
+ <text name="Autoreturn">
Renvoi automatique des objets d&apos;autres résidents (minutes, 0 pour désactiver) :
</text>
<line_editor name="clean other time" right="-6" width="36"/>
@@ -270,9 +282,9 @@ ou divisé.
<name_list label="Plus récents" name="owner list">
<name_list.columns label="Type" name="type"/>
<name_list.columns name="online_status"/>
- <name_list.columns label="Nom" name="name"/>
- <name_list.columns label="Nombre" name="count"/>
- <name_list.columns label="Plus récents" name="mostrecent"/>
+ <name_list.columns label="Nom" name="name" width="100"/>
+ <name_list.columns label="Nombre" name="count" width="100"/>
+ <name_list.columns label="Plus récents" name="mostrecent" width="120"/>
</name_list>
</panel>
<panel label="OPTIONS" name="land_options_panel">
@@ -312,21 +324,21 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
</text>
<check_box label="Modifier le terrain" name="edit land check" tool_tip="Si cette option est cochée, n&apos;importe qui peut terraformer votre terrain. Il vaut mieux ne pas cocher cette option pour toujours pouvoir modifer votre propre terrain."/>
<check_box label="Voler" name="check fly" tool_tip="Si cette option est cochée, les résidents peuvent voler sur votre terrain. Si elle n&apos;est pas cochée, ils ne pourront voler que lorsqu&apos;ils arrivent et passent au dessus de votre terrain."/>
- <text left="152" name="allow_label2">
+ <text name="allow_label2">
Construire :
</text>
- <check_box label="Tous" left="285" name="edit objects check"/>
- <check_box label="Groupe" left="395" name="edit group objects check"/>
- <text left="152" name="allow_label3" width="134">
+ <check_box label="Tous" name="edit objects check"/>
+ <check_box label="Groupe" name="edit group objects check"/>
+ <text name="allow_label3">
Laisser entrer des objets :
</text>
- <check_box label="Tous" left="285" name="all object entry check"/>
- <check_box label="Groupe" left="395" name="group object entry check"/>
- <text left="152" name="allow_label4">
+ <check_box label="Tous" name="all object entry check"/>
+ <check_box label="Groupe" name="group object entry check"/>
+ <text name="allow_label4">
Exécuter des scripts :
</text>
- <check_box label="Tous" left="285" name="check other scripts"/>
- <check_box label="Groupe" left="395" name="check group scripts"/>
+ <check_box label="Tous" name="check other scripts"/>
+ <check_box label="Groupe" name="check group scripts"/>
<text name="land_options_label">
Options du terrain :
</text>
@@ -367,11 +379,11 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
Photo :
</text>
<texture_picker bottom="-319" label="" name="snapshot_ctrl" tool_tip="Cliquez pour sélectionner une image"/>
- <text bottom="-323" name="landing_point">
+ <text name="landing_point">
Lieu d&apos;arrivée : [LANDING]
</text>
- <button bottom="-323" label="Définir" label_selected="Définir" name="Set" tool_tip="Définit le point d&apos;arrivée des visiteurs. Définit l&apos;emplacement de votre avatar sur ce terrain."/>
- <button bottom="-323" label="Annuler" label_selected="Annuler" name="Clear" tool_tip="Effacer le lieu d&apos;arrivée"/>
+ <button label="Définir" label_selected="Définir" name="Set" tool_tip="Définit le point d&apos;arrivée des visiteurs. Définit l&apos;emplacement de votre avatar sur ce terrain."/>
+ <button label="Annuler" label_selected="Annuler" name="Clear" tool_tip="Effacer le lieu d&apos;arrivée"/>
<text bottom="-343" name="Teleport Routing: ">
Règles de téléportation :
</text>
@@ -391,18 +403,15 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
Page d&apos;accueil :
</text>
<line_editor left="97" name="media_url"/>
- <button label="Choisir" label_selected="Définir..." name="set_media_url"/>
- <text name="CurrentURL:">
- Page actuelle :
- </text>
- <button label="Réinitialiser..." label_selected="Réinitialiser..." name="reset_media_url" tool_tip="Actualiser l&apos;URL"/>
+ <button label="Choisir" name="set_media_url"/>
<check_box label="Masquer l&apos;URL" left="97" name="hide_media_url" tool_tip="Si vous cochez cette option, les personnes non autorisées à accéder aux infos de cette parcelle ne verront pas l&apos;URL du média. Cette option n&apos;est pas disponible pour les fichiers HTML."/>
<text name="Description:">
Description :
</text>
<line_editor left="97" name="url_description" tool_tip="Texte affiché à côté du bouton Jouer/Charger"/>
<text name="Media texture:">
- Remplacer la texture :
+ Remplacer la
+texture :
</text>
<texture_picker label="" left="97" name="media texture" tool_tip="Cliquez pour sélectionner une image"/>
<text name="replace_texture_help">
@@ -423,9 +432,11 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
<check_box label="En boucle" name="media_loop" tool_tip="Jouer le média en boucle. Lorsque le média aura fini de jouer, il recommencera."/>
</panel>
<panel label="SON" name="land_audio_panel">
- <text name="MusicURL:">
- URL de la musique :
+ <text bottom_delta="-28" name="MusicURL:">
+ URL de la
+musique :
</text>
+ <check_box label="Masquer l&apos;URL" name="hide_music_url" tool_tip="Si vous cochez cette option, l&apos;URL de musique sera masquée et invisible pour tous les utilisateurs non autorisés des informations de cette parcelle."/>
<text name="Sound:">
Son :
</text>
@@ -435,12 +446,15 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
</text>
<check_box label="Activer le chat vocal" name="parcel_enable_voice_channel"/>
<check_box label="Activer la voix (contrôlé par le domaine)" name="parcel_enable_voice_channel_is_estate_disabled"/>
- <check_box label="Limiter le chat vocal à cette parcelle" name="parcel_enable_voice_channel_parcel"/>
+ <check_box label="Limiter le chat vocal à cette parcelle" name="parcel_enable_voice_channel_local"/>
</panel>
<panel label="ACCÈS" name="land_access_panel">
<panel.string name="access_estate_defined">
(défini par le domaine
</panel.string>
+ <panel.string name="allow_public_access">
+ Autoriser l&apos;accès public ([MATURITY])
+ </panel.string>
<panel.string name="estate_override">
Au moins une de ces options est définie au niveau du domaine.
</panel.string>
@@ -455,7 +469,7 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
<check_box label="Vérification de l&apos;âge [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Bannir les résidents qui n&apos;ont pas vérifié leur âge. Consultez la page [SUPPORT_SITE] pour plus d&apos;informations."/>
<check_box label="Autoriser l&apos;accès au groupe : [GROUP]" name="GroupCheck" tool_tip="Définir le groupe à l&apos;onglet Général."/>
<check_box label="Vendre des pass à :" name="PassCheck" tool_tip="Autoriser un accès temporaire à cette parcelle"/>
- <combo_box name="pass_combo">
+ <combo_box name="pass_combo" width="110">
<combo_box.item label="Tout le monde" name="Anyone"/>
<combo_box.item label="Groupe" name="Group"/>
</combo_box>
diff --git a/indra/newview/skins/default/xui/fr/floater_animation_preview.xml b/indra/newview/skins/default/xui/fr/floater_animation_preview.xml
index f7a796a508..aa42fe6150 100644
--- a/indra/newview/skins/default/xui/fr/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/fr/floater_animation_preview.xml
@@ -106,6 +106,9 @@ La longueur maximale est de [MAX_LENGTH] secondes.
<floater.string name="E_ST_NO_XLT_EMOTE">
Impossible de lire le nom emote.
</floater.string>
+ <floater.string name="E_ST_BAD_ROOT">
+ Nom de racine incorrect.
+ </floater.string>
<text name="name_label">
Nom :
</text>
@@ -139,36 +142,36 @@ main
Expression
</text>
<combo_box label="" name="emote_combo" tool_tip="Contrôle ce que fait le visage pendant l&apos;animation">
- <combo_box.item label="(aucun)" name="[None]"/>
- <combo_box.item label="Aaaaah" name="Aaaaah"/>
- <combo_box.item label="Effrayé" name="Afraid"/>
- <combo_box.item label="En colère" name="Angry"/>
- <combo_box.item label="Grand sourire" name="BigSmile"/>
- <combo_box.item label="Ennui" name="Bored"/>
- <combo_box.item label="Pleurer" name="Cry"/>
- <combo_box.item label="Mépris" name="Disdain"/>
- <combo_box.item label="Gêne" name="Embarrassed"/>
- <combo_box.item label="Froncer les sourcils" name="Frown"/>
- <combo_box.item label="Embrasser" name="Kiss"/>
- <combo_box.item label="Rire" name="Laugh"/>
- <combo_box.item label="Plllppt" name="Plllppt"/>
- <combo_box.item label="Dégoût" name="Repulsed"/>
- <combo_box.item label="Triste" name="Sad"/>
- <combo_box.item label="Hausser les épaules" name="Shrug"/>
- <combo_box.item label="Sourire" name="Smile"/>
- <combo_box.item label="Surprise" name="Surprise"/>
- <combo_box.item label="Clin d&apos;œil" name="Wink"/>
- <combo_box.item label="Soucis" name="Worry"/>
+ <item label="(aucun)" name="[None]" value=""/>
+ <item label="Aaaaah" name="Aaaaah" value="Aaaaah"/>
+ <item label="Effrayé" name="Afraid" value="Effrayé"/>
+ <item label="En colère" name="Angry" value="En colère"/>
+ <item label="Grand sourire" name="BigSmile" value="Grand sourire"/>
+ <item label="Ennui" name="Bored" value="Ennui"/>
+ <item label="Pleurer" name="Cry" value="Pleurer"/>
+ <item label="Mépris" name="Disdain" value="Mépris"/>
+ <item label="Gêne" name="Embarrassed" value="Gêne"/>
+ <item label="Froncer les sourcils" name="Frown" value="Froncer les sourcils"/>
+ <item label="Embrasser" name="Kiss" value="Embrasser"/>
+ <item label="Rire" name="Laugh" value="Rire"/>
+ <item label="Plllppt" name="Plllppt" value="Tirer la langue"/>
+ <item label="Dégoût" name="Repulsed" value="Dégoût"/>
+ <item label="Triste" name="Sad" value="Triste"/>
+ <item label="Hausser les épaules" name="Shrug" value="Hausser les épaules"/>
+ <item label="Sourire" name="Smile" value="Sourire"/>
+ <item label="Surprise" name="Surprise" value="Surprise"/>
+ <item label="Clin d&apos;œil" name="Wink" value="Clin d&apos;œil"/>
+ <item label="Soucis" name="Worry" value="Inquiétude"/>
</combo_box>
<text name="preview_label">
Prévisualiser
pendant
</text>
<combo_box label="" name="preview_base_anim" tool_tip="Utilisez cette option pour tester votre animation pendant que votre avatar fait des choses banales.">
- <combo_box.item label="Debout" name="Standing"/>
- <combo_box.item label="Marche" name="Walking"/>
- <combo_box.item label="Assis" name="Sitting"/>
- <combo_box.item label="Vol" name="Flying"/>
+ <item label="Debout" name="Standing" value="Debout"/>
+ <item label="Marche" name="Walking" value="Marche"/>
+ <item label="Assis" name="Sitting" value="Assis"/>
+ <item label="Vol" name="Flying" value="Vol"/>
</combo_box>
<spinner label="Transition début (s)" name="ease_in_time" tool_tip="Durée (en secondes) de l&apos;entrée en fondu de l&apos;animation"/>
<spinner label="Transition fin (s)" name="ease_out_time" tool_tip="Durée (en secondes) de la sortie en fondu de l&apos;animation"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml b/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml
index e784bda2e5..65bb683e4c 100644
--- a/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/fr/floater_avatar_picker.xml
@@ -20,7 +20,7 @@
</string>
<tab_container name="ResidentChooserTabs">
<panel label="Rechercher" name="SearchPanel">
- <text name="InstructSearchResidentName">
+ <text name="InstructSearchResidentName" width="240">
Saisissez une partie du nom du résident :
</text>
<button label="OK" label_selected="OK" name="Find"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_avatar_textures.xml b/indra/newview/skins/default/xui/fr/floater_avatar_textures.xml
index 313c9496a2..e1786eafc7 100644
--- a/indra/newview/skins/default/xui/fr/floater_avatar_textures.xml
+++ b/indra/newview/skins/default/xui/fr/floater_avatar_textures.xml
@@ -3,44 +3,46 @@
<floater.string name="InvalidAvatar">
AVATAR NON VALIDE
</floater.string>
- <text name="label">
- Textures fixées
- </text>
- <text name="composite_label">
- Textures composées
- </text>
- <button label="Vider ces ID dans la console" label_selected="Vider" left="-185" name="Dump" width="175"/>
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
- <texture_picker label="Cheveux" name="hair-baked"/>
- <texture_picker label="Cheveux" name="hair_grain"/>
- <texture_picker label="Alpha cheveux" name="hair_alpha"/>
- <texture_picker label="Tête" name="head-baked"/>
- <texture_picker label="Maquillage" name="head_bodypaint"/>
- <texture_picker label="Alpha tête" name="head_alpha"/>
- <texture_picker label="Tatouage tête" name="head_tattoo"/>
- <texture_picker label="Yeux" name="eyes-baked"/>
- <texture_picker label="Å’il" name="eyes_iris"/>
- <texture_picker label="Alpha yeux" name="eyes_alpha"/>
- <texture_picker label="Haut du corps" name="upper-baked"/>
- <texture_picker label="Peinture corporelle haut" name="upper_bodypaint"/>
- <texture_picker label="Sous-vêtements (homme)" name="upper_undershirt"/>
- <texture_picker label="Gants" name="upper_gloves"/>
- <texture_picker label="Chemise" name="upper_shirt"/>
- <texture_picker label="Veste (haut)" name="upper_jacket"/>
- <texture_picker label="Alpha haut" name="upper_alpha"/>
- <texture_picker label="Tatouage haut" name="upper_tattoo"/>
- <texture_picker label="Bas du corps" name="lower-baked"/>
- <texture_picker label="Peinture corporelle bas" name="lower_bodypaint"/>
- <texture_picker label="Sous-vêtements (femme)" name="lower_underpants"/>
- <texture_picker label="Chaussettes" name="lower_socks"/>
- <texture_picker label="Chaussures" name="lower_shoes"/>
- <texture_picker label="Pantalon" name="lower_pants"/>
- <texture_picker label="Veste" name="lower_jacket"/>
- <texture_picker label="Alpha bas" name="lower_alpha"/>
- <texture_picker label="Tatouage bas" name="lower_tattoo"/>
- <texture_picker label="Jupe" name="skirt-baked"/>
- <texture_picker label="Jupe" name="skirt"/>
+ <text name="label">
+ Textures figées
+ </text>
+ <text name="composite_label">
+ Textures composites
+ </text>
+ <button label="Vider les ID dans la console" label_selected="Vider" name="Dump"/>
+ <panel name="scroll_content_panel">
+ <texture_picker label="Cheveux" name="hair-baked"/>
+ <texture_picker label="Cheveux" name="hair_grain"/>
+ <texture_picker label="Alpha cheveux" name="hair_alpha"/>
+ <texture_picker label="Tête" name="head-baked"/>
+ <texture_picker label="Maquillage" name="head_bodypaint"/>
+ <texture_picker label="Alpha tête" name="head_alpha"/>
+ <texture_picker label="Tatouage tête" name="head_tattoo"/>
+ <texture_picker label="Yeux" name="eyes-baked"/>
+ <texture_picker label="Å’il" name="eyes_iris"/>
+ <texture_picker label="Alpha yeux" name="eyes_alpha"/>
+ <texture_picker label="Haut du corps" name="upper-baked"/>
+ <texture_picker label="Peinture sur corps (haut)" name="upper_bodypaint"/>
+ <texture_picker label="Débardeur" name="upper_undershirt"/>
+ <texture_picker label="Gants" name="upper_gloves"/>
+ <texture_picker label="Chemise" name="upper_shirt"/>
+ <texture_picker label="Veste (haut)" name="upper_jacket"/>
+ <texture_picker label="Alpha haut" name="upper_alpha"/>
+ <texture_picker label="Tatouage haut" name="upper_tattoo"/>
+ <texture_picker label="Bas du corps" name="lower-baked"/>
+ <texture_picker label="Peinture sur corps (bas)" name="lower_bodypaint"/>
+ <texture_picker label="Caleçon" name="lower_underpants"/>
+ <texture_picker label="Chaussettes" name="lower_socks"/>
+ <texture_picker label="Chaussures" name="lower_shoes"/>
+ <texture_picker label="Pantalon" name="lower_pants"/>
+ <texture_picker label="Veste" name="lower_jacket"/>
+ <texture_picker label="Alpha bas" name="lower_alpha"/>
+ <texture_picker label="Tatouage bas" name="lower_tattoo"/>
+ <texture_picker label="Jupe" name="skirt-baked"/>
+ <texture_picker label="Jupe" name="skirt"/>
+ </panel>
</panel>
</scroll_container>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_beacons.xml b/indra/newview/skins/default/xui/fr/floater_beacons.xml
index 778d92793b..d61115a2db 100644
--- a/indra/newview/skins/default/xui/fr/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/fr/floater_beacons.xml
@@ -2,7 +2,7 @@
<floater name="beacons" title="BALISES">
<panel name="beacons_panel">
<text name="label_show">
- Afficher :
+ Afficher :
</text>
<check_box label="Balises" name="beacons"/>
<check_box label="Surbrillances" name="highlights"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml b/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml
index ecd9dd0863..503fe5c154 100644
--- a/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/fr/floater_bulk_perms.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterbulkperms" title="MODIFIER LES DROITS RELATIFS AU CONTENU">
+<floater name="floaterbulkperms" title="MODIFIER LES DROITS">
<floater.string name="nothing_to_modify_text">
- La sélection contient des contenus non modifiables.
+ Certains contenus sont non modifiables.
</floater.string>
<floater.string name="status_text">
- Permissions paramétrées sur [NAME]
+ Droits paramétrés sur [NAME]
</floater.string>
<floater.string name="start_text">
Demande de changement des droits lancée...
@@ -33,7 +33,7 @@
<button label="√ Tout" label_selected="Tout" name="check_all"/>
<button label="Effacer" label_selected="Aucun" name="check_none"/>
<text name="newperms">
- Nouvelles permissions
+ Nouveaux droits
</text>
<text name="GroupLabel">
Groupe :
diff --git a/indra/newview/skins/default/xui/fr/floater_buy_currency.xml b/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
index 5ea36d8505..4eaff8535e 100644
--- a/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/fr/floater_buy_currency.xml
@@ -4,10 +4,11 @@
Achetez [LINDENS] L$ pour environ [LOCALAMOUNT]
</floater.string>
<text left="5" name="info_need_more" right="-5">
- Vous avez besoin de plus de L$
+ Plus de L$ sont requis
</text>
<text name="contacting">
- En train de contacter le Lindex...
+ En train de contacter
+le Lindex...
</text>
<text left="5" name="info_buying">
Acheter des L$
@@ -37,7 +38,7 @@
Estimation en cours...
</text>
<text name="buy_action">
- [NAME] L$ [PRICE]
+ [ACTION]
</text>
<text name="total_label">
Mon nouveau solde sera de
@@ -52,14 +53,14 @@
Saisissez à nouveau le montant pour voir le taux de change actuel.
</text>
<text name="purchase_warning_repurchase">
- La confirmation de cet achat n&apos;achète que des L$, pas l&apos;objet.
+ Confirmer cet achat n'achète que des L$, pas l'objet.
</text>
<text bottom_delta="16" name="purchase_warning_notenough">
Vous n&apos;achetez pas assez de L$. Veuillez augmenter le montant.
</text>
<button label="Acheter" name="buy_btn"/>
<button label="Annuler" name="cancel_btn"/>
- <text left="5" name="info_cannot_buy" right="-5">
+ <text left="5" name="info_cannot_buy" right="-5" width="200">
Achat impossible
</text>
<button label="Accéder au Web" name="error_web"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_buy_currency_html.xml b/indra/newview/skins/default/xui/fr/floater_buy_currency_html.xml
new file mode 100644
index 0000000000..953fca3544
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_buy_currency_html.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_buy_currency_html" title="ACHETER DEVISE"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_buy_land.xml b/indra/newview/skins/default/xui/fr/floater_buy_land.xml
index 1d7eeca3c4..b7f8f36f81 100644
--- a/indra/newview/skins/default/xui/fr/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_buy_land.xml
@@ -1,5 +1,129 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="buy land" title="ACHETER DU TERRAIN">
+ <floater.string name="can_resell">
+ Peut être revendu.
+ </floater.string>
+ <floater.string name="can_not_resell">
+ Ne peut pas être revendu.
+ </floater.string>
+ <floater.string name="can_change">
+ Peut être fusionné ou divisé.
+ </floater.string>
+ <floater.string name="can_not_change">
+ Ne peut pas être fusionné ou divisé.
+ </floater.string>
+ <floater.string name="cant_buy_for_group">
+ Vous n&apos;avez pas la permission d&apos;acheter de terrain pour votre groupe.
+ </floater.string>
+ <floater.string name="no_land_selected">
+ Aucun terrain sélectionné.
+ </floater.string>
+ <floater.string name="multiple_parcels_selected">
+ Vous avez sélectionné plusieurs parcelles.
+Sélectionnez une zone plus petite.
+ </floater.string>
+ <floater.string name="no_permission">
+ Vous n&apos;avez pas la permission d&apos;acheter de terrain pour votre groupe.
+ </floater.string>
+ <floater.string name="parcel_not_for_sale">
+ La parcelle sélectionnée n&apos;est pas à vendre.
+ </floater.string>
+ <floater.string name="group_already_owns">
+ La parcelle appartient déjà au groupe.
+ </floater.string>
+ <floater.string name="you_already_own">
+ La parcelle vous appartient déjà.
+ </floater.string>
+ <floater.string name="set_to_sell_to_other">
+ La parcelle sélectionnée doit déjà être vendue à quelqu&apos;un d&apos;autre.
+ </floater.string>
+ <floater.string name="no_public_land">
+ Il n&apos;y a pas de terrain public dans cette zone.
+ </floater.string>
+ <floater.string name="not_owned_by_you">
+ Le terrain sélectionné appartient à quelqu&apos;un d&apos;autre.
+Sélectionnez une zone plus petite.
+ </floater.string>
+ <floater.string name="processing">
+ Achat en cours de traitement...
+
+(Veuillez patienter quelques instants.)
+ </floater.string>
+ <floater.string name="fetching_error">
+ Une erreur s&apos;est produite pendant le traitement de l&apos;achat du terrain.
+ </floater.string>
+ <floater.string name="buying_will">
+ Si vous achetez ce terrain :
+ </floater.string>
+ <floater.string name="buying_for_group">
+ Si vous achetez le terrain pour le groupe :
+ </floater.string>
+ <floater.string name="cannot_buy_now">
+ Impossible d&apos;acheter maintenant :
+ </floater.string>
+ <floater.string name="not_for_sale">
+ Pas à vendre :
+ </floater.string>
+ <floater.string name="none_needed">
+ aucun besoin
+ </floater.string>
+ <floater.string name="must_upgrade">
+ Pour posséder du terrain, vous devez avoir un niveau de compte supérieur.
+ </floater.string>
+ <floater.string name="cant_own_land">
+ Avec votre compte, vous pouvez posséder du terrain.
+ </floater.string>
+ <floater.string name="land_holdings">
+ Vous détenez [BUYER] m² de terrain.
+ </floater.string>
+ <floater.string name="pay_to_for_land">
+ Payez [AMOUNT] L$ à [SELLER] pour ce terrain
+ </floater.string>
+ <floater.string name="buy_for_US">
+ Achetez [AMOUNT] L$ pour environ [LOCAL_AMOUNT],
+ </floater.string>
+ <floater.string name="parcel_meters">
+ Cette parcelle fait [AMOUNT] m²
+ </floater.string>
+ <floater.string name="premium_land">
+ C&apos;est un terrain premium, [AMOUNT] m².
+ </floater.string>
+ <floater.string name="discounted_land">
+ Ce terrain est en solde, [AMOUNT] m².
+ </floater.string>
+ <floater.string name="meters_supports_object">
+ [AMOUNT] m²
+prend en charge [AMOUNT2] objets
+ </floater.string>
+ <floater.string name="sold_with_objects">
+ vendu avec objets
+ </floater.string>
+ <floater.string name="sold_without_objects">
+ objets non inclus
+ </floater.string>
+ <floater.string name="info_price_string">
+ [PRICE] L$
+([PRICE_PER_SQM] L$/m²)
+[SOLD_WITH_OBJECTS]
+ </floater.string>
+ <floater.string name="insufficient_land_credits">
+ Ce groupe, [GROUP], aura besoin de suffisamment de crédit pour payer les frais d&apos;occupation de terrain avant que l&apos;achat de cette parcelle ne soit finalisé.
+ </floater.string>
+ <floater.string name="have_enough_lindens">
+ Vous avez [AMOUNT] L$, ce qui est suffisant pour acheter ce terrain.
+ </floater.string>
+ <floater.string name="not_enough_lindens">
+ Vous n&apos;avez que [AMOUNT] L$ et vous avez besoin de [AMOUNT2] L$ de plus.
+ </floater.string>
+ <floater.string name="balance_left">
+ Après cet achat, il vous restera [AMOUNT] L$.
+ </floater.string>
+ <floater.string name="balance_needed">
+ Pour avoir les moyens d&apos;acquérir ce terrain, vous devez acheter au moins [AMOUNT] L$.
+ </floater.string>
+ <floater.string name="no_parcel_selected">
+ (aucune parcelle sélectionnée)
+ </floater.string>
<text name="region_name_label">
Région :
</text>
@@ -37,10 +161,10 @@
Vous devez accepter le règlement du domaine :
</text>
<text left="470" name="covenant_timestamp_text"/>
- <text_editor name="covenant_editor">
+ <text_editor left="510" name="covenant_editor">
Chargement...
</text_editor>
- <check_box label="J&apos;accepte le règlement ci-dessus." name="agree_covenant"/>
+ <check_box label="J&apos;accepte le règlement ci-dessus." left="510" name="agree_covenant"/>
<text name="info_parcel_label">
Parcelle :
</text>
@@ -79,7 +203,7 @@ vendu avec objets
<combo_box.item label="7,50 US$/mois, facturation trimestrielle" name="US$7.50/month,billedquarterly"/>
<combo_box.item label="6,00 US$/mois, facturation annuelle" name="US$6.00/month,billedannually"/>
</combo_box>
- <text name="land_use_action">
+ <text follows="top|left" font="SansSerifBig" height="16" layout="topleft" left="72" length="1" name="land_use_action" right="500" top="284" type="string" width="400">
Augmentez vos frais d&apos;occupation de terrain à 40 US$/mois.
</text>
<text name="land_use_reason">
@@ -107,131 +231,4 @@ Cette parcelle fait 512 m².
<check_box label="Enlever [AMOUNT] m² de contribution du groupe." name="remove_contribution"/>
<button label="Acheter" name="buy_btn"/>
<button label="Annuler" name="cancel_btn"/>
- <string name="can_resell">
- Peut être revendu.
- </string>
- <string name="can_not_resell">
- Ne peut pas être revendu.
- </string>
- <string name="can_change">
- Peut être fusionné ou divisé.
- </string>
- <string name="can_not_change">
- Ne peut pas être fusionné ou divisé.
- </string>
- <string name="cant_buy_for_group">
- Vous n&apos;avez pas la permission d&apos;acheter de terrain pour votre groupe.
- </string>
- <string name="no_land_selected">
- Aucun terrain sélectionné.
- </string>
- <string name="multiple_parcels_selected">
- Vous avez sélectionné plusieurs parcelles.
-Sélectionnez une zone plus petite.
- </string>
- <string name="no_permission">
- Vous n&apos;avez pas la permission d&apos;acheter de terrain pour votre groupe.
- </string>
- <string name="parcel_not_for_sale">
- La parcelle sélectionnée n&apos;est pas à vendre.
- </string>
- <string name="group_already_owns">
- La parcelle appartient déjà au groupe.
- </string>
- <string name="you_already_own">
- La parcelle vous appartient déjà.
- </string>
- <string name="set_to_sell_to_other">
- La parcelle sélectionnée doit déjà être vendue à quelqu&apos;un d&apos;autre.
- </string>
- <string name="no_public_land">
- Il n&apos;y a pas de terrain public dans cette zone.
- </string>
- <string name="not_owned_by_you">
- Le terrain sélectionné appartient à quelqu&apos;un d&apos;autre.
-Sélectionnez une zone plus petite.
- </string>
- <string name="processing">
- Achat en cours de traitement...
-
-(Veuillez patienter quelques instants.)
- </string>
- <string name="fetching_error">
- Une erreur s&apos;est produite pendant le traitement de l&apos;achat du terrain.
- </string>
- <string name="buying_will">
- Si vous achetez ce terrain :
- </string>
- <string name="buying_for_group">
- Si vous achetez le terrain pour le groupe :
- </string>
- <string name="cannot_buy_now">
- Impossible d&apos;acheter maintenant :
- </string>
- <string name="not_for_sale">
- Pas à vendre :
- </string>
- <string name="none_needed">
- aucun besoin
- </string>
- <string name="must_upgrade">
- Pour posséder du terrain, vous devez avoir un niveau de compte supérieur.
- </string>
- <string name="cant_own_land">
- Avec votre compte, vous pouvez posséder du terrain.
- </string>
- <string name="land_holdings">
- Vous détenez [BUYER] m² de terrain.
- </string>
- <string name="pay_to_for_land">
- Payez [AMOUNT] L$ à [SELLER] pour ce terrain
- </string>
- <string name="buy_for_US">
- Achetez [AMOUNT] L$ pour environ [LOCAL_AMOUNT],
- </string>
- <string name="parcel_meters">
- Cette parcelle fait [AMOUNT] m²
- </string>
- <string name="premium_land">
- C&apos;est un terrain premium, [AMOUNT] m².
- </string>
- <string name="discounted_land">
- Ce terrain est en solde, [AMOUNT] m².
- </string>
- <string name="meters_supports_object">
- [AMOUNT] m²
-prend en charge [AMOUNT2] objets
- </string>
- <string name="sold_with_objects">
- vendu avec objets
- </string>
- <string name="sold_without_objects">
- objets non inclus
- </string>
- <string name="info_price_string">
- [PRICE] L$
-([PRICE_PER_SQM] L$/m²)
-[SOLD_WITH_OBJECTS]
- </string>
- <string name="insufficient_land_credits">
- Ce groupe, [GROUP], aura besoin de suffisamment de crédit pour payer les frais d&apos;occupation de terrain avant que l&apos;achat de cette parcelle ne soit finalisé.
- </string>
- <string name="have_enough_lindens">
- Vous avez [AMOUNT] L$, ce qui est suffisant pour acheter ce terrain.
- </string>
- <string name="not_enough_lindens">
- Vous n&apos;avez que [AMOUNT] L$ et vous avez besoin de [AMOUNT2] L$ de plus.
- </string>
- <string name="balance_left">
- Après cet achat, il vous restera [AMOUNT] L$.
- </string>
- <string name="balance_needed">
- Pour avoir les moyens d&apos;acquérir ce terrain, vous devez acheter au moins [AMOUNT] L$.
- </string>
- <string name="no_parcel_selected">
- (aucune parcelle sélectionnée)
- </string>
- <string name="buy_currency">
- Acheter [LINDENS] L$ pour environ [USD] US$
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_camera.xml b/indra/newview/skins/default/xui/fr/floater_camera.xml
index 309c93cf3b..558551b649 100644
--- a/indra/newview/skins/default/xui/fr/floater_camera.xml
+++ b/indra/newview/skins/default/xui/fr/floater_camera.xml
@@ -9,6 +9,18 @@
<floater.string name="move_tooltip">
Déplacer la caméra vers le haut et le bas, la gauche et la droite
</floater.string>
+ <floater.string name="orbit_mode_title">
+ Faire tourner
+ </floater.string>
+ <floater.string name="pan_mode_title">
+ Faire un panoramique
+ </floater.string>
+ <floater.string name="avatar_view_mode_title">
+ Préréglages
+ </floater.string>
+ <floater.string name="free_mode_title">
+ Voir l&apos;objet
+ </floater.string>
<panel name="controls">
<joystick_track name="cam_track_stick" tool_tip="Déplacer la caméra vers le haut et le bas, la gauche et la droite"/>
<panel name="zoom" tool_tip="Zoomer en direction du point central">
@@ -25,7 +37,7 @@
<panel name="buttons">
<button label="" name="orbit_btn" tool_tip="Faire tourner la caméra"/>
<button label="" name="pan_btn" tool_tip="Faire un panoramique"/>
- <button label="" name="avatarview_btn" tool_tip="Vue subjective"/>
+ <button label="" name="avatarview_btn" tool_tip="Préréglages"/>
<button label="" name="freecamera_btn" tool_tip="Voir l&apos;objet"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_color_picker.xml b/indra/newview/skins/default/xui/fr/floater_color_picker.xml
index c509a4783e..c54e3e9ce0 100644
--- a/indra/newview/skins/default/xui/fr/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/fr/floater_color_picker.xml
@@ -25,7 +25,7 @@
<text left="8" name="Current color:">
Couleur actuelle :
</text>
- <text left="8" name="(Drag below to save.)" width="114">
- (Faire glisser dessous pour enregistrer.)
+ <text name="(Drag below to save.)">
+ Enr. : faire glisser dessous
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_customize.xml b/indra/newview/skins/default/xui/fr/floater_customize.xml
index a1cd568571..ff407b25c1 100644
--- a/indra/newview/skins/default/xui/fr/floater_customize.xml
+++ b/indra/newview/skins/default/xui/fr/floater_customize.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater customize" title="APPARENCE" width="548">
- <tab_container name="customize tab container" tab_min_width="150" width="546">
+<floater name="floater customize" title="APPARENCE">
+ <tab_container name="customize tab container" tab_min_width="150">
<text label="Parties du corps" name="body_parts_placeholder">
Parties du corps
</text>
<panel label="Silhouette" left="154" name="Shape" width="389">
- <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
+ <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
<button label="Corps" label_selected="Corps" name="Body"/>
<button label="Tête" label_selected="Tête" name="Head"/>
<button label="Yeux" label_selected="Yeux" name="Eyes"/>
@@ -44,8 +44,8 @@
Silhouette :
</text>
<button label="Créer une silhouette" label_selected="Créer une silhouette" name="Create New"/>
- <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
</panel>
<panel label="Peau" name="Skin">
<button label="Couleur" label_selected="Couleur" name="Skin Color" width="84"/>
@@ -80,9 +80,9 @@
<texture_picker label="Tatouages haut" name="Upper Tattoos" tool_tip="Cliquez pour sélectionner une image" width="78"/>
<texture_picker label="Tatouages bas" name="Lower Tattoos" tool_tip="Cliquez pour sélectionner une image" width="78"/>
<button label="Créer une peau" label_selected="Créer une peau" name="Create New"/>
- <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
- <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
+ <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
</panel>
<panel label="Cheveux" name="Hair">
<button label="Couleur" label_selected="Couleur" name="Color"/>
@@ -115,9 +115,9 @@
</text>
<texture_picker label="Texture" name="Texture" tool_tip="Cliquez pour sélectionner une image"/>
<button label="Créer des cheveux" label_selected="Créer des cheveux" name="Create New"/>
- <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
- <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
+ <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
</panel>
<panel label="Yeux" name="Eyes">
<text name="title">
@@ -146,21 +146,21 @@
</text>
<texture_picker label="Iris" name="Iris" tool_tip="Cliquez pour sélectionner une image"/>
<button label="Créer des yeux" label_selected="Créer des yeux" name="Create New"/>
- <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
- <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
+ <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
</panel>
<text label="Habits" name="clothes_placeholder">
Habits
</text>
<panel label="Chemise" name="Shirt">
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Créer une chemise" label_selected="Créer une chemise" name="Create New"/>
+ <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
- <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
+ <button label="Créer une chemise" label_selected="Créer une chemise" name="Create New"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
+ <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
<text name="title">
[DESC]
</text>
@@ -188,12 +188,12 @@
</panel>
<panel label="Pantalon" name="Pants">
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Créer un pantalon" label_selected="Créer un pantalon" name="Create New"/>
+ <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
- <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
+ <button label="Créer un pantalon" label_selected="Créer un pantalon" name="Create New"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
+ <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
<text name="title">
[DESC]
</text>
@@ -238,6 +238,7 @@
<text name="not worn instructions">
Pour changer de chaussures, faites-en glisser une paire de votre inventaire à votre avatar. Vous pouvez aussi en créer des nouvelles et les porter.
</text>
+ <button label="Créer des chaussures" label_selected="Créer des chaussures" name="Create New"/>
<text name="no modify instructions">
Vous n&apos;avez pas la permission de modifier cet objet.
</text>
@@ -245,12 +246,11 @@
Chaussures :
</text>
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Créer des chaussures" label_selected="Créer des chaussures" name="Create New"/>
+ <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
- <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
+ <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
</panel>
<panel label="Chaussettes" name="Socks">
<text name="title">
@@ -271,6 +271,7 @@
<text name="not worn instructions">
Pour changer de chaussettes, faites-en glisser une paire à partir de votre inventaire. Vous pouvez aussi en créer des nouvelles et les porter.
</text>
+ <button label="Créer des chaussettes" label_selected="Créer des chaussettes" name="Create New"/>
<text name="no modify instructions">
Vous n&apos;avez pas la permission de modifier cet objet.
</text>
@@ -278,12 +279,11 @@
Chaussettes :
</text>
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Créer des chaussettes" label_selected="Créer des chaussettes" name="Create New"/>
+ <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
- <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
+ <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
</panel>
<panel label="Veste" name="Jacket">
<text name="title">
@@ -304,6 +304,7 @@
<text name="not worn instructions">
Pour changer de veste, faites-en glisser une à partir de votre inventaire. Vous pouvez aussi en créer une nouvelle et la porter.
</text>
+ <button label="Créer une veste" label_selected="Créer une veste" name="Create New"/>
<text name="no modify instructions">
Vous n&apos;avez pas la permission de modifier cet objet.
</text>
@@ -312,12 +313,11 @@
</text>
<texture_picker label="Tissu (dessus)" name="Upper Fabric" tool_tip="Cliquez pour sélectionner une image" width="81"/>
<texture_picker label="Tissu (dessous)" name="Lower Fabric" tool_tip="Cliquez pour sélectionner une image" width="81"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="81"/>
- <button label="Créer une veste" label_selected="Créer une veste" name="Create New"/>
+ <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="81"/>
<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
- <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
+ <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
</panel>
<panel label="Gants" name="Gloves">
<text name="title">
@@ -338,6 +338,7 @@
<text name="not worn instructions">
Pour changer de gants, faites-en glisser une paire à partir de votre inventaire. Vous pouvez aussi en créer de nouveaux et les porter.
</text>
+ <button label="Créer des gants" label_selected="Créer des gants" name="Create New"/>
<text name="no modify instructions">
Vous n&apos;avez pas la permission de modifier cet objet.
</text>
@@ -345,14 +346,13 @@
Gants :
</text>
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Créer des gants" label_selected="Créer des gants" name="Create New"/>
+ <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
- <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
+ <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
</panel>
- <panel label="Sous-vêtements (haut)" name="Undershirt">
+ <panel label="Débardeur" name="Undershirt">
<text name="title">
[DESC]
</text>
@@ -363,30 +363,29 @@
[DESC]: en cours de chargement...
</text>
<text name="title_not_worn">
- [DESC]: non portés
+ [DESC]: non porté
</text>
<text name="path">
Emplacement : [PATH]
</text>
<text name="not worn instructions">
- Pour changer de sous-vêtements (homme), faites-en glisser à partir de votre inventaire. Vous pouvez aussi en créer de nouveaux et les porter.
+ Pour changer de débardeur, faites-en glisser un à partir de votre inventaire. Vous pouvez aussi en créer un nouveau et le porter.
</text>
+ <button label="Créer un débardeur" label_selected="Créer un débardeur" name="Create New"/>
<text name="no modify instructions">
Vous n&apos;avez pas la permission de modifier cet objet.
</text>
- <text bottom="-470" name="Item Action Label" right="92">
- Sous-vêtements
-(haut) :
+ <text name="Item Action Label">
+ Débardeur :
</text>
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Créer des sous-vêtements" label_selected="Créer des sous-vêtements" name="Create New"/>
+ <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
- <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
+ <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
</panel>
- <panel label="Sous-vêtements (bas)" name="Underpants">
+ <panel label="Caleçon" name="Underpants">
<text name="title">
[DESC]
</text>
@@ -397,28 +396,27 @@
[DESC]: en cours de chargement...
</text>
<text name="title_not_worn">
- [DESC]: non portés
+ [DESC]: non porté
</text>
<text name="path">
Emplacement : [PATH]
</text>
<text name="not worn instructions">
- Pour changer de sous-vêtements (femme), faites-en glisser à partir de votre inventaire. Vous pouvez aussi en créer de nouveaux et les porter.
+ Pour changer de caleçon, faites-en glisser un à partir de votre inventaire. Vous pouvez aussi en créer un nouveau et le porter.
</text>
+ <button label="Créer un caleçon" label_selected="Créer un caleçon" name="Create New"/>
<text name="no modify instructions">
Vous n&apos;avez pas la permission de modifier cet objet.
</text>
- <text bottom="-470" name="Item Action Label" right="92">
- Sous-vêtements
-(bas) :
+ <text name="Item Action Label">
+ Caleçon :
</text>
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Créer des sous-vêtements" label_selected="Créer des sous-vêtements" name="Create New"/>
+ <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
- <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
+ <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
</panel>
<panel label="Jupe" name="Skirt">
<text name="title">
@@ -439,6 +437,7 @@
<text name="not worn instructions">
Pour changer de jupe, faites-en glisser une à partir de votre inventaire. Vous pouvez aussi en créer une nouvelle et la porter.
</text>
+ <button label="Créer une jupe" label_selected="Créer une jupe" name="Create New"/>
<text name="no modify instructions">
Vous n&apos;avez pas la permission de modifier cet objet.
</text>
@@ -446,14 +445,13 @@
Jupe :
</text>
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
- <button label="Créer une jupe" label_selected="Créer une jupe" name="Create New"/>
+ <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
- <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
+ <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
</panel>
- <panel label="Alpha" name="Alpha">
+ <panel label="Tatouage" name="Tattoo">
<text name="title">
[DESC]
</text>
@@ -470,26 +468,24 @@
Dans [PATH]
</text>
<text name="not worn instructions">
- Pour changer de masque alpha, faites-en glisser un de votre inventaire à votre avatar. Vous pouvez aussi en créer un nouveau et le porter.
+ Pour changer de tatouage, faites-en glisser un de votre inventaire à votre avatar. Vous pouvez aussi en créer un nouveau et le porter.
</text>
+ <button label="Créer un nouveau tatouage" label_selected="Créer un nouveau tatouage" name="Create New"/>
<text name="no modify instructions">
Vous n&apos;avez pas le droit de modifier cet objet.
</text>
<text name="Item Action Label">
- Alpha :
+ Tatouage :
</text>
- <texture_picker label="Alpha bas" name="Lower Alpha" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Alpha haut" name="Upper Alpha" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Alpha tête" name="Head Alpha" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Alpha yeux" name="Eye Alpha" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Alpha cheveux" name="Hair Alpha" tool_tip="Cliquez pour sélectionner une image"/>
- <button label="Créer un nouvel alpha" label_selected="Créer un nouvel alpha" name="Create New"/>
+ <texture_picker label="Tatouage tête" name="Head Tattoo" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Tatouage haut" name="Upper Tattoo" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Tatouage bas" name="Lower Tattoo" tool_tip="Cliquez pour sélectionner une image"/>
<button label="Enlever" label_selected="Enlever" name="Take Off"/>
<button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
<button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Annuler modification" label_selected="Annuler modification" name="Revert"/>
+ <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
</panel>
- <panel label="Tatouage" name="Tattoo">
+ <panel label="Alpha" name="Alpha">
<text name="title">
[DESC]
</text>
@@ -506,26 +502,28 @@
Dans [PATH]
</text>
<text name="not worn instructions">
- Pour changer de tatouage, faites-en glisser un de votre inventaire à votre avatar. Vous pouvez aussi en créer un nouveau et le porter.
+ Pour changer de masque alpha, faites-en glisser un de votre inventaire à votre avatar. Vous pouvez aussi en créer un nouveau et le porter.
</text>
+ <button label="Créer un nouvel alpha" label_selected="Créer un nouvel alpha" name="Create New"/>
<text name="no modify instructions">
Vous n&apos;avez pas le droit de modifier cet objet.
</text>
<text name="Item Action Label">
- Tatouage :
+ Alpha :
</text>
- <texture_picker label="Tatouage tête" name="Head Tattoo" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Tatouage haut" name="Upper Tattoo" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Tatouage bas" name="Lower Tattoo" tool_tip="Cliquez pour sélectionner une image"/>
- <button label="Créer un nouveau tatouage" label_selected="Créer un nouveau tatouage" name="Create New"/>
+ <texture_picker label="Alpha bas" name="Lower Alpha" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Alpha haut" name="Upper Alpha" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Alpha tête" name="Head Alpha" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Alpha yeux" name="Eye Alpha" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Alpha cheveux" name="Hair Alpha" tool_tip="Cliquez pour sélectionner une image"/>
<button label="Enlever" label_selected="Enlever" name="Take Off"/>
<button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
<button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
- <button label="Annuler modification" label_selected="Annuler modification" name="Revert"/>
+ <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
</panel>
</tab_container>
<scroll_container left="251" name="panel_container"/>
- <button label="Infos sur les scripts" label_selected="Infos sur les scripts" name="script_info"/>
+ <button label="Infos scripts" label_selected="Infos scripts" name="script_info" tool_tip="Afficher les scripts attachés à votre avatar"/>
<button label="Créer tenue" label_selected="Créer une tenue..." name="make_outfit_btn"/>
<button label="Annuler" label_selected="Annuler" name="Cancel"/>
<button label="OK" label_selected="OK" name="Ok"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml
index 0b36b7b8ca..87c8847cbd 100644
--- a/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml
+++ b/indra/newview/skins/default/xui/fr/floater_day_cycle_options.xml
@@ -1,10 +1,10 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Day Cycle Floater" title="EDITEUR DU CYCLE DU JOUR">
<tab_container name="Day Cycle Tabs">
<panel label="Cycle du jour" name="Day Cycle">
- <button label="?" name="WLDayCycleHelp" />
+ <button label="?" name="WLDayCycleHelp"/>
<text name="WL12am">
- Minuit
+ Min.
</text>
<text name="WL3am">
3h
@@ -28,7 +28,7 @@
21h
</text>
<text name="WL12am2">
- Minuit
+ Min.
</text>
<text name="WL12amHash">
|
@@ -57,41 +57,38 @@
<text name="WL12amHash2">
|
</text>
- <button label="Ajouter clé" label_selected="Ajouter clé" name="WLAddKey" width="89" bottom="-45" />
- <button label="Supprimer clé" label_selected="Supprimer clé" name="WLDeleteKey" width="89" bottom="-70" />
+ <button label="Ajouter clé" label_selected="Ajouter clé" name="WLAddKey"/>
+ <button label="Supprimer clé" label_selected="Supprimer clé" name="WLDeleteKey"/>
<text name="WLCurKeyFrameText">
Réglages des images-clés :
</text>
<text name="WLCurKeyTimeText">
Heure de la clé :
</text>
- <spinner label="Heure" name="WLCurKeyHour" />
- <spinner label="Min" name="WLCurKeyMin" />
+ <spinner label="Heure" name="WLCurKeyHour"/>
+ <spinner label="Min" name="WLCurKeyMin"/>
<text name="WLCurKeyTimeText2">
Préréglages clés :
</text>
- <combo_box label="Préréglage" name="WLKeyPresets" />
+ <combo_box label="Préréglage" name="WLKeyPresets"/>
<text name="DayCycleText">
Snap :
</text>
- <combo_box label="5 min" name="WLSnapOptions" />
+ <combo_box label="5 min" name="WLSnapOptions"/>
<text name="DayCycleText2">
Durée du cycle :
</text>
- <spinner label="Heure" name="WLLengthOfDayHour" />
- <spinner label="Min" name="WLLengthOfDayMin" />
- <spinner label="S" name="WLLengthOfDaySec" label_width="10" width="50" left_delta="75"/>
+ <spinner label="Heure" name="WLLengthOfDayHour"/>
+ <spinner label="Min" name="WLLengthOfDayMin"/>
+ <spinner label="S" name="WLLengthOfDaySec"/>
<text name="DayCycleText3">
- Prévisualiser :
- </text>
- <button label="Jouer" label_selected="Jouer" name="WLAnimSky" />
- <button label="Stop !" label_selected="Stop" name="WLStopAnimSky" />
- <button label="Utiliser heure domaine" label_selected="Aller heure domaine"
- name="WLUseLindenTime" />
- <button label="Enregistrer jour test" label_selected="Enregistrer jour test"
- name="WLSaveDayCycle" />
- <button label="Charger jour test" label_selected="Charger jour test"
- name="WLLoadDayCycle" />
+ Aperçu :
+ </text>
+ <button label="Lire" label_selected="Lire" name="WLAnimSky"/>
+ <button label="Stop !" label_selected="Stop" name="WLStopAnimSky"/>
+ <button label="Utiliser heure domaine" label_selected="Aller heure domaine" name="WLUseLindenTime"/>
+ <button label="Enregistrer jour test" label_selected="Enregistrer jour test" name="WLSaveDayCycle"/>
+ <button label="Charger jour test" label_selected="Charger jour test" name="WLLoadDayCycle"/>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_env_settings.xml b/indra/newview/skins/default/xui/fr/floater_env_settings.xml
index 505c9236c7..dd714e85b6 100644
--- a/indra/newview/skins/default/xui/fr/floater_env_settings.xml
+++ b/indra/newview/skins/default/xui/fr/floater_env_settings.xml
@@ -3,7 +3,7 @@
<floater.string name="timeStr">
[hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
</floater.string>
- <text bottom="-45" name="EnvTimeText">
+ <text bottom="-45" name="EnvTimeText" top="29">
Heure de la
journée
</text>
@@ -14,7 +14,7 @@ journée
Couverture
nuageuse
</text>
- <text bottom="-45" name="EnvWaterColorText">
+ <text bottom="-45" name="EnvWaterColorText" top="29">
Couleur de
l&apos;eau
</text>
@@ -23,7 +23,7 @@ l&apos;eau
Brouillard
dans l&apos;eau
</text>
- <button bottom="-144" label="Utiliser heure du domaine" name="EnvUseEstateTimeButton" width="145"/>
+ <button bottom="-144" label="Utiliser heure du domaine" name="EnvUseEstateTimeButton" width="152"/>
<button label="Ciel avancé" left="162" name="EnvAdvancedSkyButton" width="145"/>
<button label="Eau avancée" left="316" name="EnvAdvancedWaterButton" width="145"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_event.xml b/indra/newview/skins/default/xui/fr/floater_event.xml
new file mode 100644
index 0000000000..b005ce3b36
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_event.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="Événement" name="Event" title="DÉTAILS SUR L&apos;ÉVÉNEMENT">
+ <floater.string name="none">
+ aucun
+ </floater.string>
+ <floater.string name="notify">
+ Prévenir
+ </floater.string>
+ <floater.string name="dont_notify">
+ Ne pas prévenir
+ </floater.string>
+ <floater.string name="moderate">
+ Modéré
+ </floater.string>
+ <floater.string name="adult">
+ Adulte
+ </floater.string>
+ <floater.string name="general">
+ Général
+ </floater.string>
+ <floater.string name="unknown">
+ Inconnu
+ </floater.string>
+ <layout_stack name="layout">
+ <layout_panel name="profile_stack">
+ <text name="event_name">
+ Nameless Event...of Doom! De doom! Doom doom.
+ </text>
+ <text name="event_category">
+ (pas de catégorie)
+ </text>
+ <text name="event_runby_label">
+ Organisé par :
+ </text>
+ <text initial_value="(récupération en cours)" name="event_runby"/>
+ <text name="event_date_label">
+ Date :
+ </text>
+ <text name="event_date">
+ 10/10/2010
+ </text>
+ <text name="event_duration_label">
+ Durée :
+ </text>
+ <text name="event_duration">
+ 1 heure
+ </text>
+ <text name="event_covercharge_label">
+ Prix :
+ </text>
+ <text name="event_cover">
+ Gratuit
+ </text>
+ <text name="event_location_label">
+ Lieu :
+ </text>
+ <text name="event_location" value="SampleParcel, Name Long (145, 228, 26)"/>
+ <text name="rating_label" value="Catégorie :"/>
+ <text name="rating_value" value="inconnu"/>
+ </layout_panel>
+ <layout_panel name="button_panel">
+ <button name="create_event_btn" tool_tip="Créer un événement"/>
+ <button name="god_delete_event_btn" tool_tip="Supprimer l&apos;événement"/>
+ <button label="Me prévenir" name="notify_btn"/>
+ <button label="Téléporter" name="teleport_btn"/>
+ <button label="Carte" name="map_btn"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_gesture.xml b/indra/newview/skins/default/xui/fr/floater_gesture.xml
index 113df0acc4..5ead1cae3a 100644
--- a/indra/newview/skins/default/xui/fr/floater_gesture.xml
+++ b/indra/newview/skins/default/xui/fr/floater_gesture.xml
@@ -9,9 +9,9 @@
<floater.string name="copy_name">
Copie de [COPY_NAME]
</floater.string>
- <scroll_list bottom_delta="-385" height="360" name="gesture_list">
- <scroll_list.columns label="Nom" name="name" width="145"/>
- <scroll_list.columns label="Chat" name="trigger" width="85"/>
+ <scroll_list name="gesture_list">
+ <scroll_list.columns label="Nom" name="name"/>
+ <scroll_list.columns label="Chat" name="trigger"/>
<scroll_list.columns label="" name="key"/>
<scroll_list.columns label="Touche" name="shortcut"/>
</scroll_list>
@@ -22,6 +22,6 @@
<button name="del_btn" tool_tip="Supprimer ce geste"/>
</panel>
<button label="Modifier" name="edit_btn"/>
- <button label="Jouer" name="play_btn"/>
+ <button label="Lire" name="play_btn"/>
<button label="Stop" name="stop_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_god_tools.xml b/indra/newview/skins/default/xui/fr/floater_god_tools.xml
index 0dedf499bb..e4c53d866c 100644
--- a/indra/newview/skins/default/xui/fr/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/fr/floater_god_tools.xml
@@ -2,17 +2,16 @@
<floater name="godtools floater" title="OUTILS DIVINS">
<tab_container name="GodTools Tabs">
<panel label="Grille" name="grid">
- <button label="Éjecter tous" label_selected="Éjecter tous" name="Kick all users" width="175"/>
<button label="Vider le cache cartographique de la région" label_selected="Vider le cache cartographique de la région" name="Flush This Region&apos;s Map Visibility Caches" width="285"/>
</panel>
<panel label="Région" name="region">
- <text name="Sim Name:" width="70">
- Nom du sim :
+ <text name="Region Name:">
+ Nom de la région :
</text>
<line_editor left="85" name="region name" width="198"/>
<check_box label="Initiation" name="check prelude" tool_tip="Définir cette région comme zone d&apos;initiation."/>
<check_box label="Soleil fixe" name="check fixed sun" tool_tip="Définir la position du soleil (comme dans Région et Domaine &gt; Terrain.)"/>
- <check_box height="32" label="Réinitialiser le domicile à la téléportation" name="check reset home" tool_tip="Quand les résidents s&apos;en vont par téléportation, réinitialisez leur domicile sur l&apos;emplacement de destination."/>
+ <check_box height="32" label="Réinitialiser le domicile à la téléportation" name="check reset home" tool_tip="Quand les résidents s&apos;en vont par téléportation, réinitialisez leur domicile sur l&apos;emplacement de destination."/>
<check_box bottom_delta="-32" label="Visible" name="check visible" tool_tip="Cochez pour rendre la région visible aux non-admins."/>
<check_box label="Dégâts" name="check damage" tool_tip="Cochez pour activer les dégâts dans cette région."/>
<check_box label="Bloquer le suivi de trafic" name="block dwell" tool_tip="Cochez pour que la région ne comptabilise pas le trafic."/>
@@ -48,15 +47,15 @@
<spinner left="320" name="land cost" width="70"/>
<button label="Rafraîchir" label_selected="Rafraîchir" name="Refresh" tool_tip="Cliquez ici pour rafraîchir les informations ci-dessus."/>
<button label="Appliquer" label_selected="Appliquer" name="Apply" tool_tip="Cliquez ici pour appliquer les modifications effectuées ci-dessus."/>
- <button label="Sélectionner une région" label_selected="Sélectionner une région" left="136" name="Select Region" tool_tip="Sélectionnez une région entière à l&apos;aide de l&apos;outil Terrain." width="140"/>
- <button label="Sauvegarde automatique" label_selected="Sauvegarde automatique" left="136" name="Autosave now" tool_tip="Sauvegarde automatique au format gzip." width="140"/>
+ <button label="Sélectionner une région" label_selected="Sélectionner une région" left="136" name="Select Region" tool_tip="Sélectionnez une région entière à l&apos;aide de l&apos;outil Terrain." width="160"/>
+ <button label="Sauvegarde automatique" label_selected="Sauvegarde automatique" left="136" name="Autosave now" tool_tip="Sauvegarde automatique au format gzip." width="160"/>
</panel>
<panel label="Objets" name="objects">
<panel.string name="no_target">
(aucune cible)
</panel.string>
- <text name="Sim Name:" width="70">
- Nom du sim :
+ <text name="Region Name:">
+ Nom de la région :
</text>
<text left_delta="75" name="region name">
Welsh
diff --git a/indra/newview/skins/default/xui/fr/floater_help_browser.xml b/indra/newview/skins/default/xui/fr/floater_help_browser.xml
index 1170d1d87b..11caca640c 100644
--- a/indra/newview/skins/default/xui/fr/floater_help_browser.xml
+++ b/indra/newview/skins/default/xui/fr/floater_help_browser.xml
@@ -1,14 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_help_browser" title="NAVIGATEUR D&apos;AIDE">
- <floater.string name="home_page_url">
- http://fr.secondlife.com
- </floater.string>
- <floater.string name="support_page_url">
- http://fr.secondlife.com/support
+ <floater.string name="loading_text">
+ Chargement…
</floater.string>
<layout_stack name="stack1">
- <layout_panel name="external_controls">
- <button label="Ouvrir dans mon navigateur Web" name="open_browser"/>
- </layout_panel>
+ <layout_panel name="external_controls"/>
</layout_stack>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_im.xml b/indra/newview/skins/default/xui/fr/floater_im.xml
index 0e4039d3af..15b01dbf12 100644
--- a/indra/newview/skins/default/xui/fr/floater_im.xml
+++ b/indra/newview/skins/default/xui/fr/floater_im.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<multi_floater name="im_floater" title="Message instantané">
<text name="only_user_message">
- Vous êtes le seul participant à cette session.
+ Vous êtes le seul résident participant à cette session.
</text>
<text name="offline_message">
[FIRST] [LAST] est déconnecté(e).
@@ -31,7 +31,7 @@
Un modérateur de groupe a désactivé votre chat écrit.
</string>
<string name="add_session_event">
- Impossible d&apos;ajouter des participants à la session de chat avec [RECIPIENT].
+ Impossible d&apos;ajouter des résidents à la session de chat avec [RECIPIENT].
</string>
<string name="message_session_event">
Impossible d&apos;envoyer votre message à la session de chat avec [RECIPIENT].
diff --git a/indra/newview/skins/default/xui/fr/floater_image_preview.xml b/indra/newview/skins/default/xui/fr/floater_image_preview.xml
index a28e0bd7d5..3d405f358d 100644
--- a/indra/newview/skins/default/xui/fr/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/fr/floater_image_preview.xml
@@ -10,16 +10,16 @@
Prévisualiser comme :
</text>
<combo_box label="Habits" left="126" name="clothing_type_combo">
- <combo_box.item label="Image" name="Image"/>
- <combo_box.item label="Cheveux" name="Hair"/>
- <combo_box.item label="Tête de femme" name="FemaleHead"/>
- <combo_box.item label="Corps de femme (haut)" name="FemaleUpperBody"/>
- <combo_box.item label="Corps de femme (bas)" name="FemaleLowerBody"/>
- <combo_box.item label="Tête d&apos;homme" name="MaleHead"/>
- <combo_box.item label="Corps d&apos;homme (haut)" name="MaleUpperBody"/>
- <combo_box.item label="Corps d&apos;homme (bas)" name="MaleLowerBody"/>
- <combo_box.item label="Jupe" name="Skirt"/>
- <combo_box.item label="Sculptie" name="SculptedPrim"/>
+ <item label="Image" name="Image" value="Image"/>
+ <item label="Cheveux" name="Hair" value="Cheveux"/>
+ <item label="Tête de femme" name="FemaleHead" value="Tête de femme"/>
+ <item label="Corps de femme (haut)" name="FemaleUpperBody" value="Corps de femme (haut)"/>
+ <item label="Corps de femme (bas)" name="FemaleLowerBody" value="Corps de femme (bas)"/>
+ <item label="Tête d&apos;homme" name="MaleHead" value="Tête d&apos;homme"/>
+ <item label="Corps d&apos;homme (haut)" name="MaleUpperBody" value="Corps d&apos;homme (haut)"/>
+ <item label="Corps d&apos;homme (bas)" name="MaleLowerBody" value="Corps d&apos;homme (bas)"/>
+ <item label="Jupe" name="Skirt" value="Jupe"/>
+ <item label="Sculptie" name="SculptedPrim" value="Sculptie"/>
</combo_box>
<text name="bad_image_text">
Impossible de lire l&apos;image.
diff --git a/indra/newview/skins/default/xui/fr/floater_inspect.xml b/indra/newview/skins/default/xui/fr/floater_inspect.xml
index de74f47bcf..9b1bdf106d 100644
--- a/indra/newview/skins/default/xui/fr/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/fr/floater_inspect.xml
@@ -7,7 +7,7 @@
<scroll_list.columns label="Nom" name="object_name"/>
<scroll_list.columns label="Propriétaire" name="owner_name"/>
<scroll_list.columns label="Créateur" name="creator_name"/>
- <scroll_list.columns label="Date de création" name="creation_date"/>
+ <scroll_list.columns label="Date de création" name="creation_date" width="114"/>
</scroll_list>
<button label="Voir le profil du propriétaire..." name="button owner" tool_tip="Voir le profil du propriétaire de l&apos;objet en surbrillance" width="172"/>
<button label="Voir le profil du créateur..." left="192" name="button creator" tool_tip="Voir le profil du créateur de l&apos;objet en surbrillance" width="172"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_inventory.xml b/indra/newview/skins/default/xui/fr/floater_inventory.xml
index 1f8b7f37ad..200c07e522 100644
--- a/indra/newview/skins/default/xui/fr/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/fr/floater_inventory.xml
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Inventory" title="INVENTAIRE">
+<floater name="Inventory" title="MON INVENTAIRE">
<floater.string name="Title">
- Inventaire
+ MON INVENTAIRE
</floater.string>
<floater.string name="TitleFetching">
- Inventaire (Récupération de [ITEM_COUNT] articles en cours) [FILTER]
+ MON INVENTAIRE (récupération de [ITEM_COUNT] articles en cours) [FILTER]
</floater.string>
<floater.string name="TitleCompleted">
- Inventaire ([ITEM_COUNT] articles) [FILTER]
+ MON INVENTAIRE ([ITEM_COUNT] articles) [FILTER]
</floater.string>
<floater.string name="Fetched">
Récupéré
diff --git a/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml
index b0d5df161c..fca1a329a2 100644
--- a/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/fr/floater_inventory_item_properties.xml
@@ -47,11 +47,11 @@
<check_box label="Éditer" name="CheckOwnerModify"/>
<check_box label="Copier" name="CheckOwnerCopy"/>
<check_box label="Revendre" name="CheckOwnerTransfer"/>
- <text name="AnyoneLabel">
+ <text name="AnyoneLabel" width="80">
N&apos;importe qui :
</text>
<check_box label="Copier" name="CheckEveryoneCopy"/>
- <text name="GroupLabel">
+ <text name="GroupLabel" width="80">
Groupe :
</text>
<check_box label="Partager" name="CheckShareWithGroup"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml
index 52f8597dc2..1ee85a77ce 100644
--- a/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/fr/floater_inventory_view_finder.xml
@@ -11,14 +11,14 @@
<check_box label="Sons" name="check_sound"/>
<check_box label="Textures" name="check_texture"/>
<check_box label="Photos" name="check_snapshot"/>
- <button label="Tout" label_selected="Tout" name="All" width="70"/>
- <button bottom_delta="0" label="Aucun" label_selected="Aucun" left="83" name="None" width="70"/>
- <check_box bottom_delta="-20" label="Toujours montrer les dossiers" name="check_show_empty"/>
- <check_box bottom_delta="-36" label="Depuis la déconnexion" name="check_since_logoff"/>
+ <button label="Tout" label_selected="Tout" name="All"/>
+ <button bottom_delta="0" label="Aucun" label_selected="Aucun" name="None"/>
+ <check_box label="Toujours montrer les dossiers" name="check_show_empty"/>
+ <check_box label="Depuis la déconnexion" name="check_since_logoff"/>
<text name="- OR -">
Ou il y a...
</text>
<spinner label="Heures" name="spin_hours_ago"/>
<spinner label="Jours" name="spin_days_ago"/>
- <button bottom_delta="-30" label="Fermer" label_selected="Fermer" name="Close"/>
+ <button label="Fermer" label_selected="Fermer" name="Close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_joystick.xml b/indra/newview/skins/default/xui/fr/floater_joystick.xml
index d3a1b6c61b..02ac21bf82 100644
--- a/indra/newview/skins/default/xui/fr/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/fr/floater_joystick.xml
@@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Joystick" title="CONFIGURATION DU JOYSTICK">
<check_box label="Activer :" name="enable_joystick"/>
- <spinner label="Mapping axe des X " name="JoystickAxis1"/>
- <spinner label="Mapping axe des Y" name="JoystickAxis2"/>
- <spinner label="Mapping axe des Z" name="JoystickAxis0"/>
- <spinner label="Mapping du tangage" label_width="111" left="8" name="JoystickAxis4" width="152"/>
- <spinner label="Mapping du lacet" name="JoystickAxis5"/>
- <spinner label="Mapping du roulis" name="JoystickAxis3"/>
- <spinner label="Mapping du zoom" name="JoystickAxis6"/>
+ <spinner label="Mapping axe des X " name="JoystickAxis1" left="20" width="154" label_width="130"/>
+ <spinner label="Mapping axe des Y" name="JoystickAxis2" width="154" label_width="130"/>
+ <spinner label="Mapping axe des Z" name="JoystickAxis0" width="154" label_width="130"/>
+ <spinner label="Mapping du tangage" label_width="136" left="20" name="JoystickAxis4" width="154"/>
+ <spinner label="Mapping du lacet" name="JoystickAxis5" width="154" label_width="130"/>
+ <spinner label="Mapping du roulis" name="JoystickAxis3" width="154" label_width="130"/>
+ <spinner label="Mapping du zoom" name="JoystickAxis6" left="20" width="154" label_width="130"/>
<check_box label="Zoom direct" name="ZoomDirect"/>
- <check_box label="Curseur 3D" name="Cursor3D"/>
- <check_box label="Niveau automatique" name="AutoLeveling"/>
+ <check_box label="Curseur 3D" name="Cursor3D" left="300"/>
+ <check_box label="Niveau automatique" name="AutoLeveling" left="400"/>
<text name="Control Modes:">
Modes de contrôle :
</text>
@@ -26,7 +26,7 @@
<text name="ZScale">
Échelle des Z
</text>
- <text left="9" name="PitchScale" width="104">
+ <text name="PitchScale">
Échelle du tangage
</text>
<text name="YawScale">
@@ -44,8 +44,8 @@
<text name="ZDeadZone">
Zone neutre Z
</text>
- <text left="4" name="PitchDeadZone" width="110">
- Zone neutre Tangage
+ <text name="PitchDeadZone">
+ Zone neutre tangage
</text>
<text name="YawDeadZone">
Zone neutre lacet
@@ -59,7 +59,7 @@
<text name="ZoomScale2">
Échelle du zoom
</text>
- <text left="6" name="ZoomDeadZone" width="110">
+ <text name="ZoomDeadZone">
Zone neutre du zoom
</text>
<button label="Options par défaut du joystick" name="SpaceNavigatorDefaults"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_lagmeter.xml b/indra/newview/skins/default/xui/fr/floater_lagmeter.xml
index 20dffbbbc8..39a861d8bd 100644
--- a/indra/newview/skins/default/xui/fr/floater_lagmeter.xml
+++ b/indra/newview/skins/default/xui/fr/floater_lagmeter.xml
@@ -25,16 +25,16 @@
Normal, fenêtre en arrière-plan
</floater.string>
<floater.string name="client_frame_time_critical_msg">
- Taux de défilement client ci-dessous [CLIENT_FRAME_RATE_CRITICAL]
+ Taux de défilement [CLIENT_FRAME_RATE_CRITICAL]
</floater.string>
<floater.string name="client_frame_time_warning_msg">
- Taux de défilement client entre [CLIENT_FRAME_RATE_CRITICAL] et [CLIENT_FRAME_RATE_WARNING]
+ Taux de défilement entre [CLIENT_FRAME_RATE_CRITICAL] et [CLIENT_FRAME_RATE_WARNING]
</floater.string>
<floater.string name="client_frame_time_normal_msg">
Normal
</floater.string>
<floater.string name="client_draw_distance_cause_msg">
- Cause possible : la limite d&apos;affichage est trop élevée
+ Cause possible : limite d&apos;affichage trop élevée
</floater.string>
<floater.string name="client_texture_loading_cause_msg">
Cause possible : images en cours de chargement
@@ -43,7 +43,7 @@
Cause possible : trop d&apos;images en mémoire
</floater.string>
<floater.string name="client_complex_objects_cause_msg">
- Cause possible : trop d&apos;objets complexes dans la scène
+ Cause possible : trop d&apos;objets complexes
</floater.string>
<floater.string name="network_text_msg">
Réseau
@@ -70,10 +70,10 @@
300
</floater.string>
<floater.string name="network_ping_critical_msg">
- Temps de connexion ping supérieur à [NETWORK_PING_CRITICAL] ms
+ Connexion ping > [NETWORK_PING_CRITICAL] ms
</floater.string>
<floater.string name="network_ping_warning_msg">
- Temps de connexion ping entre [NETWORK_PING_WARNING] et [NETWORK_PING_CRITICAL] ms
+ Connexion ping entre [NETWORK_PING_WARNING] et [NETWORK_PING_CRITICAL] ms
</floater.string>
<floater.string name="network_packet_loss_cause_msg">
Mauvaise connexion possible ou réglage de la bande passante trop élevé.
@@ -94,10 +94,10 @@
20
</floater.string>
<floater.string name="server_frame_time_critical_msg">
- Taux de défilement du simulateur au dessous de [SERVER_FRAME_RATE_CRITICAL]
+ Défilement du simulateur &lt; [SERVER_FRAME_RATE_CRITICAL]
</floater.string>
<floater.string name="server_frame_time_warning_msg">
- Taux de défilement du simulateur entre [SERVER_FRAME_RATE_CRITICAL] et [SERVER_FRAME_RATE_WARNING]
+ Défilement simulateur entre [SERVER_FRAME_RATE_CRITICAL] et [SERVER_FRAME_RATE_WARNING]
</floater.string>
<floater.string name="server_frame_time_normal_msg">
Normal
@@ -112,7 +112,7 @@
Cause possible : trop de trafic réseau
</floater.string>
<floater.string name="server_agent_cause_msg">
- Cause possible : trop de personnes en mouvement dans la région
+ Cause possible : trop de personnes en mouvement
</floater.string>
<floater.string name="server_images_cause_msg">
Cause possible : trop de calculs d&apos;images
diff --git a/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml
index b0a2f92f7c..7647452e91 100644
--- a/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/fr/floater_live_lsleditor.xml
@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="script ed float" title="SCRIPT : NOUVEAU SCRIPT">
<floater.string name="not_allowed">
- Ce script ne peut pas être copié, visualisé ou modifié. Pour visualiser ou modifier un script à l&apos;intérieur d&apos;un objet, vous devez avoir les permissions requises.
+ Ce script ne peut pas être copié, visualisé ou modifié. Pour visualiser ou modifier un script à l&apos;intérieur d&apos;un objet, vous devez avoir les droits requis.
</floater.string>
<floater.string name="script_running">
Exécution en cours
</floater.string>
<floater.string name="Title">
- Script : [NAME]
+ SCRIPT : [NAME]
</floater.string>
- <button label="Réinitialiser" label_selected="Réinitialiser" left="390" name="Reset" width="100"/>
- <check_box initial_value="true" label="Exécution en cours" left="4" name="running"/>
- <check_box initial_value="true" label="Mono" left="130" name="mono"/>
+ <button label="Réinitialiser" label_selected="Réinitialiser" name="Reset"/>
+ <check_box initial_value="true" label="Exécution en cours" name="running"/>
+ <check_box initial_value="true" label="Mono" name="mono"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_lsl_guide.xml b/indra/newview/skins/default/xui/fr/floater_lsl_guide.xml
index b92c0944de..71d2c42578 100644
--- a/indra/newview/skins/default/xui/fr/floater_lsl_guide.xml
+++ b/indra/newview/skins/default/xui/fr/floater_lsl_guide.xml
@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="script ed float" title="RÉFÉRENCE LSL">
- <check_box label="Suivre le curseur" name="lock_check"/>
- <combo_box label="Verrouiller" left_delta="120" name="history_combo" width="70"/>
- <button label="Précédente" left_delta="75" name="back_btn"/>
- <button label="Suivante" name="fwd_btn"/>
+
+ <check_box label="Suivre le curseur" name="lock_check" width="90" />
+ <combo_box label="Verrouiller" left_delta="120" name="history_combo" width="82"/>
+ <button label="Précédente" name="back_btn" left_delta="75"/>
+ <button label="Suivante" name="fwd_btn" width="60"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_map.xml b/indra/newview/skins/default/xui/fr/floater_map.xml
index aeef4b0e91..ae319949e3 100644
--- a/indra/newview/skins/default/xui/fr/floater_map.xml
+++ b/indra/newview/skins/default/xui/fr/floater_map.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Map">
+<floater name="Map" title="">
<floater.string name="mini_map_north">
N
</floater.string>
diff --git a/indra/newview/skins/default/xui/fr/floater_media_browser.xml b/indra/newview/skins/default/xui/fr/floater_media_browser.xml
index 0677c5d41f..58535eddf5 100644
--- a/indra/newview/skins/default/xui/fr/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/fr/floater_media_browser.xml
@@ -15,12 +15,12 @@
<button label="OK" left_delta="515" name="go"/>
</layout_panel>
<layout_panel name="time_controls">
- <button label="en arrière" name="rewind"/>
+ <button label="en arrière" name="rewind" width="60"/>
<button label="stop" name="stop"/>
- <button label="en avant" name="seek"/>
+ <button label="en avant" name="seek" width="60"/>
</layout_panel>
<layout_panel name="parcel_owner_controls">
- <button label="Envoyer la page actuelle à la parcelle" name="assign"/>
+ <button label="Envoyer la page actuelle à la parcelle" name="assign" width="220"/>
</layout_panel>
<layout_panel name="external_controls">
<button label="Ouvrir dans mon navigateur web" name="open_browser" width="196"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml b/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml
index 5993f90cef..d03c4d7544 100644
--- a/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml
+++ b/indra/newview/skins/default/xui/fr/floater_mem_leaking.xml
@@ -12,7 +12,7 @@
[NOTE2]
</text>
<button label="Commencer" name="start_btn" width="85"/>
- <button label="Stop" left="100" name="stop_btn"/>
- <button label="Libérer" left="177" name="release_btn"/>
- <button label="Fermer" name="close_btn"/>
+ <button label="Stop" name="stop_btn"/>
+ <button label="Libérer" name="release_btn"/>
+ <button label="Fermer" name="close_btn" left_pad="20"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_moveview.xml b/indra/newview/skins/default/xui/fr/floater_moveview.xml
index 0e8887bb96..c0f3864b81 100644
--- a/indra/newview/skins/default/xui/fr/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/fr/floater_moveview.xml
@@ -6,23 +6,64 @@
<string name="walk_back_tooltip">
Marcher en arrière (appuyer sur la flèche vers le bas ou S)
</string>
+ <string name="walk_left_tooltip">
+ Marcher vers la gauche (Maj+Flèche gauche ou touche A)
+ </string>
+ <string name="walk_right_tooltip">
+ Marcher vers la droite (Maj+Flèche droite ou touche D)
+ </string>
<string name="run_forward_tooltip">
Courir vers l&apos;avant (appuyer sur la flèche vers le haut ou W)
</string>
<string name="run_back_tooltip">
Courir en arrière (appuyer sur la flèche vers le bas ou S)
</string>
+ <string name="run_left_tooltip">
+ Courir vers la gauche (Maj+Flèche gauche ou touche A)
+ </string>
+ <string name="run_right_tooltip">
+ Courir vers la droite (Maj+Flèche droite ou touche D)
+ </string>
<string name="fly_forward_tooltip">
Voler vers l&apos;avant (appuyer sur la flèche vers le haut ou W)
</string>
<string name="fly_back_tooltip">
Voler vers l&apos;arrière (appuyer sur la flèche vers le bas ou S)
</string>
+ <string name="fly_left_tooltip">
+ Voler vers la gauche (Maj+Flèche gauche ou touche A)
+ </string>
+ <string name="fly_right_tooltip">
+ Voler vers la droite (Maj+Flèche droite ou touche D)
+ </string>
+ <string name="fly_up_tooltip">
+ Voler vers le haut (touche E)
+ </string>
+ <string name="fly_down_tooltip">
+ Voler vers le bas (touche C)
+ </string>
+ <string name="jump_tooltip">
+ Sauter (touche E)
+ </string>
+ <string name="crouch_tooltip">
+ S&apos;accroupir (touche C)
+ </string>
+ <string name="walk_title">
+ Marcher
+ </string>
+ <string name="run_title">
+ Courir
+ </string>
+ <string name="fly_title">
+ Voler
+ </string>
<panel name="panel_actions">
+ <button label="" label_selected="" name="move up btn" tool_tip="Voler vers le haut (touche E)"/>
<button label="" label_selected="" name="turn left btn" tool_tip="Tourner à gauche (appuyer sur la flèche de gauche ou sur A)"/>
+ <joystick_slide name="move left btn" tool_tip="Marcher vers la gauche (Maj+Flèche gauche ou touche A)"/>
+ <button label="" label_selected="" name="move down btn" tool_tip="Voler vers le bas (touche C)"/>
<button label="" label_selected="" name="turn right btn" tool_tip="Tourner à droite (appuyer sur la flèche de droite ou sur D)"/>
- <button label="" label_selected="" name="move up btn" tool_tip="Voler vers le haut, appuyer sur E"/>
- <button label="" label_selected="" name="move down btn" tool_tip="Voler vers le bas, appuyer sur C"/>
+ <joystick_slide name="move right btn" tool_tip="Marcher vers la droite (Maj+Flèche droite ou touche D)"/>
<joystick_turn name="forward btn" tool_tip="Marcher en avant (appuyer sur la flèche vers le haut ou W)"/>
<joystick_turn name="backward btn" tool_tip="Marcher en arrière (appuyer sur la flèche vers le bas ou S)"/>
</panel>
@@ -30,6 +71,5 @@
<button label="" name="mode_walk_btn" tool_tip="Mode marche"/>
<button label="" name="mode_run_btn" tool_tip="Mode course"/>
<button label="" name="mode_fly_btn" tool_tip="Mode vol"/>
- <button label="Atterrir" name="stop_fly_btn" tool_tip="Atterrir"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml b/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml
index 72775169cb..a59253a746 100644
--- a/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/fr/floater_nearby_chat.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="nearby_chat" title="CHAT PRÈS DE VOUS"/>
+<floater name="nearby_chat" title="CHAT PRÈS DE MOI"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_notification.xml b/indra/newview/skins/default/xui/fr/floater_notification.xml
index 62727da007..fe4b5f9bd6 100644
--- a/indra/newview/skins/default/xui/fr/floater_notification.xml
+++ b/indra/newview/skins/default/xui/fr/floater_notification.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="notification" title="CONSOLE DE NOTIFICATIONS">
<text_editor name="payload">
- Chargement..
+ Chargement...
</text_editor>
<combo_box label="Réponse" name="response"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/fr/floater_outfit_save_as.xml
index f5dfc8d6df..d77dfbdf82 100644
--- a/indra/newview/skins/default/xui/fr/floater_outfit_save_as.xml
+++ b/indra/newview/skins/default/xui/fr/floater_outfit_save_as.xml
@@ -1,11 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="modal container">
+<floater name="modal container" title="Enregistrer la tenue">
<button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
<button label="Annuler" label_selected="Annuler" name="Cancel"/>
<text name="Save item as:">
- Enregistrer la tenue sous :
+ Enregistrer ce que je porte
+comme une nouvelle tenue :
</text>
<line_editor name="name ed">
- [DESC]
+ [DESC] (nouv.)
</line_editor>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_outgoing_call.xml b/indra/newview/skins/default/xui/fr/floater_outgoing_call.xml
index a6f0970502..089d710f17 100644
--- a/indra/newview/skins/default/xui/fr/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/fr/floater_outgoing_call.xml
@@ -25,10 +25,13 @@
Pas de réponse. Veuillez réessayer ultérieurement.
</text>
<text name="nearby">
- Vous avez été déconnecté(e) de [VOICE_CHANNEL_NAME]. Vous allez maintenant être reconnecté(e) au chat vocal près de vous.
+ Vous avez été déconnecté(e) de [VOICE_CHANNEL_NAME]. [RECONNECT_NEARBY]
</text>
- <text name="nearby_P2P">
- [VOICE_CHANNEL_NAME] a mis fin à l&apos;appel. Vous allez maintenant être reconnecté(e) au chat vocal près de vous.
+ <text name="nearby_P2P_by_other">
+ Votre appel a pris fin. [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_agent">
+ Vous avez mis fin à l&apos;appel. [RECONNECT_NEARBY]
</text>
<text name="leaving">
En train de quitter [CURRENT_CHAT].
diff --git a/indra/newview/skins/default/xui/fr/floater_pay_object.xml b/indra/newview/skins/default/xui/fr/floater_pay_object.xml
index c96db77721..9cac739ab0 100644
--- a/indra/newview/skins/default/xui/fr/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/fr/floater_pay_object.xml
@@ -17,10 +17,10 @@
<text left="105" name="object_name_text">
...
</text>
- <button label="1 L$" label_selected="1 L$" left="105" name="fastpay 1"/>
- <button label="5 L$" label_selected="5 L$" left="190" name="fastpay 5"/>
- <button label="10 L$" label_selected="10 L$" left="105" name="fastpay 10"/>
- <button label="20 L$" label_selected="20 L$" left="190" name="fastpay 20"/>
+ <button label="1 L$" label_selected="1 L$" name="fastpay 1"/>
+ <button label="5 L$" label_selected="5 L$" name="fastpay 5"/>
+ <button label="10 L$" label_selected="10 L$" name="fastpay 10"/>
+ <button label="20 L$" label_selected="20 L$" name="fastpay 20"/>
<text halign="left" left="5" name="amount text">
Ou choisissez un montant :
</text>
diff --git a/indra/newview/skins/default/xui/fr/floater_perm_prefs.xml b/indra/newview/skins/default/xui/fr/floater_perm_prefs.xml
index 2be2ae7c88..36bec80561 100644
--- a/indra/newview/skins/default/xui/fr/floater_perm_prefs.xml
+++ b/indra/newview/skins/default/xui/fr/floater_perm_prefs.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="perm prefs" title="PERMISSIONS DE CHARGEMENT PAR DÉFAUT">
+<floater name="perm prefs" title="DROITS DE CHARGEMENT PAR DÉFAUT">
<panel label="Droits" name="permissions">
<button label="?" label_selected="?" name="help"/>
<check_box label="Partager avec le groupe" name="share_with_group"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_postcard.xml b/indra/newview/skins/default/xui/fr/floater_postcard.xml
index 6a9a674fac..0f3a4541e2 100644
--- a/indra/newview/skins/default/xui/fr/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/fr/floater_postcard.xml
@@ -3,20 +3,20 @@
<text name="to_label" width="135">
E-mail du destinataire :
</text>
- <line_editor left="143" name="to_form" width="127"/>
+ <line_editor left="143" name="to_form" width="130" left_delta="146"/>
<text name="from_label">
Votre e-mail :
</text>
- <line_editor left="143" name="from_form" width="127"/>
+ <line_editor left="143" name="from_form" width="130" left_delta="146"/>
<text name="name_label">
Votre nom :
</text>
- <line_editor left="143" name="name_form" width="127"/>
+ <line_editor left="143" name="name_form" width="130" left_delta="146"/>
<text name="subject_label">
- Sujet :
+ Objet :
</text>
- <line_editor left="143" name="subject_form" width="127"/>
- <line_editor label="Saisissez votre sujet ici." name="subject_form"/>
+ <line_editor left="143" name="subject_form" width="130" left_delta="146"/>
+ <line_editor label="Saisissez votre objet ici." name="subject_form"/>
<text name="msg_label">
Message :
</text>
diff --git a/indra/newview/skins/default/xui/fr/floater_preferences.xml b/indra/newview/skins/default/xui/fr/floater_preferences.xml
index 4db7ca304c..052e43388b 100644
--- a/indra/newview/skins/default/xui/fr/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preferences.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater min_width="330" name="Preferences" title="PRÉFÉRENCES" width="626">
+<floater name="Preferences" title="PRÉFÉRENCES">
<button label="OK" label_selected="OK" name="OK"/>
<button label="Annuler" label_selected="Annuler" name="Cancel"/>
- <tab_container name="pref core" tab_width="126" width="626">
+ <tab_container name="pref core">
<panel label="Général" name="general"/>
<panel label="Graphiques" name="display"/>
<panel label="Confidentialité" name="im"/>
- <panel label="Son" name="audio"/>
+ <panel label="Son et Média" name="audio"/>
<panel label="Chat" name="chat"/>
<panel label="Notifications" name="msgs"/>
<panel label="Configuration" name="input"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_animation.xml b/indra/newview/skins/default/xui/fr/floater_preview_animation.xml
index 923d56801e..b14aecafbb 100644
--- a/indra/newview/skins/default/xui/fr/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preview_animation.xml
@@ -6,6 +6,6 @@
<text name="desc txt">
Description :
</text>
- <button label="Jouer dans le Monde" label_selected="Stop" left="20" name="Anim play btn" tool_tip="Lire cette animation de façon à ce que les autres puissent la voir" width="131"/>
+ <button label="Jouer dans Second Life" label_selected="Stop" left="20" name="Anim play btn" tool_tip="Lire cette animation de façon à ce que les autres puissent la voir" width="131"/>
<button label="Jouer localement" label_selected="Stop" left="162" name="Anim audition btn" tool_tip="Lire cette animation de façon à ce que vous soyez la seule personne à pouvoir la voir" width="125"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml b/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml
index 7133f8754c..1d164ac661 100644
--- a/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preview_gesture.xml
@@ -31,10 +31,10 @@
Description :
</text>
<text name="trigger_label">
- Déclencheur :
+ Déclench. :
</text>
<text name="replace_text" tool_tip="Remplacer les raccourcis avec ces mots. Par exemple, remplacer le mot-clé « salut » par « bonjour » fera dire « je venais dire bonjour » au lieu de « je venais dire salut » dans le chat, et déclenchera le geste.">
- Remplacer par :
+ Rempl. par :
</text>
<line_editor left="310" name="replace_editor" tool_tip="Remplacer les raccourcis avec ces mots. Par exemple, remplacer le mot-clé « salut » par « bonjour » fera dire « je venais dire bonjour » au lieu de « je venais dire salut » dans le chat, et déclenchera le geste" width="120"/>
<text name="key_label">
@@ -50,20 +50,20 @@
<text name="steps_label">
Étapes :
</text>
- <button label="Vers le haut" name="up_btn"/>
- <button label="Vers le bas" name="down_btn"/>
+ <button label="Haut" name="up_btn"/>
+ <button label="Bas" name="down_btn"/>
<button label="Supprimer" name="delete_btn"/>
<radio_group name="animation_trigger_type">
<radio_item label="Lancer" name="start"/>
<radio_item label="Arrêter" name="stop"/>
</radio_group>
<check_box label="jusqu&apos;à la fin des animations" name="wait_anim_check"/>
- <check_box label="temps en secondes" name="wait_time_check"/>
+ <check_box label="temps (sec)" name="wait_time_check"/>
<line_editor left_delta="130" name="wait_time_editor"/>
<text name="help_label">
Toutes les étapes ont lieu en même temps si vous n&apos;ajoutez pas d&apos;étapes d&apos;attente.
</text>
- <check_box label="Actifs" name="active_check" tool_tip="Les gestes actifs peuvent être déclenchés en saisissant leur raccourci dans le chat ou en appuyant sur les raccourcis. Les gestes deviennent généralement inactifs lorsqu&apos;il y a un conflit entre les raccourcis."/>
+ <check_box label="Actif" name="active_check" tool_tip="Les gestes actifs peuvent être déclenchés en saisissant leur raccourci dans le chat ou en appuyant sur les raccourcis. Les gestes deviennent généralement inactifs lorsqu&apos;il y a un conflit entre les raccourcis."/>
<button label="Prévisualiser" name="preview_btn" width="86"/>
<button label="Enregistrer" left_delta="96" name="save_btn" width="86"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/fr/floater_preview_gesture_shortcut.xml
index 06caf0635d..d866c32882 100644
--- a/indra/newview/skins/default/xui/fr/floater_preview_gesture_shortcut.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preview_gesture_shortcut.xml
@@ -6,8 +6,8 @@
<text name="key_label">
Clavier :
</text>
- <combo_box label="Aucun" name="modifier_combo"/>
- <combo_box label="Aucun" name="key_combo"/>
+ <combo_box label="Aucun" name="modifier_combo" width="62"/>
+ <combo_box label="Aucun" name="key_combo" width="62"/>
<text name="replace_text" tool_tip="Remplacez le ou les mots-clés par ces mots. Par exemple, si vous remplacez le mot-clé &quot; bonjour &quot; par &quot; salut &quot;, le chat &quot; Je voulais te dire bonjour &quot; devient &quot; Je voulais te dire salut &quot; et le geste correspondant s&apos;affiche.">
Remplacer :
</text>
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_notecard.xml b/indra/newview/skins/default/xui/fr/floater_preview_notecard.xml
index d6ec915fd1..5646ad45eb 100644
--- a/indra/newview/skins/default/xui/fr/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preview_notecard.xml
@@ -9,9 +9,6 @@
<floater.string name="Title">
Note : [NAME]
</floater.string>
- <floater.string label="Enregistrer" label_selected="Enregistrer" name="Save">
- Enregistrer
- </floater.string>
<text name="desc txt">
Description :
</text>
@@ -19,4 +16,5 @@
Chargement...
</text_editor>
<button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Supprimer" label_selected="Supprimer" name="Delete"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_sound.xml b/indra/newview/skins/default/xui/fr/floater_preview_sound.xml
index 67d93e9e92..a215f92df1 100644
--- a/indra/newview/skins/default/xui/fr/floater_preview_sound.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preview_sound.xml
@@ -6,6 +6,6 @@
<text name="desc txt">
Description :
</text>
- <button label="Jouer dans le Monde" label_selected="Jouer dans le Monde" left_delta="-142" name="Sound play btn" tool_tip="Lire ce son de façon à ce que les autres puissent l&apos;entendre" width="131"/>
+ <button label="Jouer dans Second Life" label_selected="Jouer dans Second Life" left_delta="-142" name="Sound play btn" tool_tip="Lire ce son de façon à ce que les autres puissent l&apos;entendre" width="131"/>
<button label="Jouer localement" label_selected="Jouer localement" left="162" name="Sound audition btn" tool_tip="Lire ce son de façon à ce que vous soyez la seule personne à pouvoir l&apos;entendre" width="125"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_preview_texture.xml b/indra/newview/skins/default/xui/fr/floater_preview_texture.xml
index 2ff14b4a68..9fc9d14026 100644
--- a/indra/newview/skins/default/xui/fr/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/fr/floater_preview_texture.xml
@@ -19,7 +19,7 @@
<combo_item name="Unconstrained">
Sans contraintes
</combo_item>
- <combo_item name="1:1" tool_tip="Logo du groupe ou profil dans le monde physique">
+ <combo_item name="1:1" tool_tip="Logo du groupe ou profil dans la vie réelle">
1:1
</combo_item>
<combo_item name="4:3" tool_tip="Profil [SECOND_LIFE]">
@@ -28,7 +28,7 @@
<combo_item name="10:7" tool_tip="Petites annonces, repères">
10:7
</combo_item>
- <combo_item name="3:2" tool_tip="À propos des terrains">
+ <combo_item name="3:2" tool_tip="À propos du terrain">
3:2
</combo_item>
<combo_item name="16:10">
@@ -42,6 +42,6 @@
</combo_item>
</combo_box>
<button label="OK" name="Keep"/>
- <button label="Annuler" name="Discard"/>
+ <button label="Jeter" name="Discard"/>
<button label="Enregistrer sous" name="save_tex_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_publish_classified.xml b/indra/newview/skins/default/xui/fr/floater_publish_classified.xml
new file mode 100644
index 0000000000..39a2b086f1
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/floater_publish_classified.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="publish_classified" title="Publication de l&apos;annonce">
+ <text name="explanation_text">
+ Votre petite annonce sera visible pendant une semaine à partir de sa date de publication.
+
+Rappel : les frais liés aux annonces passées ne sont pas remboursables.
+ </text>
+ <spinner label="Coût de l&apos;annonce :" name="price_for_listing" tool_tip="Coût de l’annonce." value="50"/>
+ <text name="l$_text" value="L$"/>
+ <text name="more_info_text">
+ En savoir plus (lien vers l&apos;aide sur les annonces)
+ </text>
+ <button label="Publier" name="publish_btn"/>
+ <button label="Annuler" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_report_abuse.xml b/indra/newview/skins/default/xui/fr/floater_report_abuse.xml
index b96e15e4bb..78c35dc303 100644
--- a/indra/newview/skins/default/xui/fr/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/fr/floater_report_abuse.xml
@@ -5,7 +5,7 @@
</floater.string>
<check_box label="Utiliser cette capture d&apos;écran" name="screen_check"/>
<text name="reporter_title" width="60">
- Déposant :
+ Témoin :
</text>
<text name="reporter_field">
Loremipsum Dolorsitamut Longnamez
@@ -29,13 +29,13 @@
<text name="object_name_label">
Objet :
</text>
- <text left_delta="70" name="object_name" width="105">
+ <text left_pad="26" name="object_name" width="105">
Consetetur Sadipscing
</text>
- <text name="owner_name_label" width="66">
+ <text name="owner_name_label" width="100">
Propriétaire :
</text>
- <text left_delta="70" name="owner_name" width="105">
+ <text left_delta="120" name="owner_name" width="105">
Hendrerit Vulputate Kamawashi Longname
</text>
<combo_box name="category_combo" tool_tip="Choisissez la catégorie qui décrit le mieux ce rapport">
diff --git a/indra/newview/skins/default/xui/fr/floater_script_preview.xml b/indra/newview/skins/default/xui/fr/floater_script_preview.xml
index 7b8c5399b9..7b6bc73677 100644
--- a/indra/newview/skins/default/xui/fr/floater_script_preview.xml
+++ b/indra/newview/skins/default/xui/fr/floater_script_preview.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview lsl text" title="SCRIPT : SCRIPT DE ROTATION">
<floater.string name="Title">
- Script : [NAME]
+ SCRIPT : [NAME]
</floater.string>
<text name="desc txt">
Description :
diff --git a/indra/newview/skins/default/xui/fr/floater_sell_land.xml b/indra/newview/skins/default/xui/fr/floater_sell_land.xml
index e950a64c4c..d79726e8e2 100644
--- a/indra/newview/skins/default/xui/fr/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_sell_land.xml
@@ -5,13 +5,13 @@
<text name="info_parcel_label">
Parcelle :
</text>
- <text name="info_parcel">
+ <text name="info_parcel" left="70">
NOM DE LA PARCELLE
</text>
<text name="info_size_label">
Taille :
</text>
- <text name="info_size">
+ <text name="info_size" left="70">
[AREA] m²
</text>
<text bottom_delta="-60" name="info_action">
diff --git a/indra/newview/skins/default/xui/fr/floater_settings_debug.xml b/indra/newview/skins/default/xui/fr/floater_settings_debug.xml
index aae4729347..995837e9ee 100644
--- a/indra/newview/skins/default/xui/fr/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/fr/floater_settings_debug.xml
@@ -4,7 +4,7 @@
<combo_box.item label="VRAI" name="TRUE"/>
<combo_box.item label="FAUX" name="FALSE"/>
</combo_box>
- <color_swatch label="Couleur" name="val_color_swatch"/>
+ <color_swatch label="Couleur" name="val_color_swatch" width="50"/>
<spinner label="x" name="val_spinner_1"/>
<spinner label="x" name="val_spinner_2"/>
<spinner label="x" name="val_spinner_3"/>
diff --git a/indra/newview/skins/default/xui/fr/floater_snapshot.xml b/indra/newview/skins/default/xui/fr/floater_snapshot.xml
index 486eafef01..381a513bda 100644
--- a/indra/newview/skins/default/xui/fr/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/fr/floater_snapshot.xml
@@ -1,79 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Snapshot" title="APERÇU DE LA PHOTO" width="247">
- <text name="type_label">
- Destination de la photo
- </text>
- <radio_group label="Type de photo" name="snapshot_type_radio" width="228">
- <radio_item label="E-mail" name="postcard"/>
- <radio_item label="Mon inventaire ([AMOUNT] L$)" name="texture"/>
- <radio_item label="Enregistrer sur mon ordinateur" name="local"/>
- </radio_group>
- <button label="Plus" name="more_btn" tool_tip="Options avancées"/>
- <button label="Moins" name="less_btn" tool_tip="Options avancées"/>
- <text name="type_label2">
- Taille
- </text>
- <text name="format_label">
- Format
- </text>
- <combo_box label="Résolution" name="postcard_size_combo">
- <combo_box.item label="640 x 480" name="640x480"/>
- <combo_box.item label="800 x 600" name="800x600"/>
- <combo_box.item label="1024 x 768" name="1024x768"/>
- <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
- <combo_box.item label="Personnaliser" name="Custom"/>
- </combo_box>
- <combo_box label="Résolution" name="texture_size_combo">
- <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
- <combo_box.item label="Petite (128 x 128)" name="Small(128x128)"/>
- <combo_box.item label="Moyenne (256 x 256)" name="Medium(256x256)"/>
- <combo_box.item label="Grande (512 x 512)" name="Large(512x512)"/>
- <combo_box.item label="Personnaliser" name="Custom"/>
- </combo_box>
- <combo_box label="Résolution" name="local_size_combo">
- <combo_box.item label="Fenêtre actuelle" name="CurrentWindow"/>
- <combo_box.item label="320 x 240" name="320x240"/>
- <combo_box.item label="640 x 480" name="640x480"/>
- <combo_box.item label="800 x 600" name="800x600"/>
- <combo_box.item label="1024 x 768" name="1024x768"/>
- <combo_box.item label="1280 x 1024" name="1280x1024"/>
- <combo_box.item label="1600 x 1200" name="1600x1200"/>
- <combo_box.item label="Personnaliser" name="Custom"/>
- </combo_box>
- <combo_box label="Format" name="local_format_combo">
- <combo_box.item label="PNG" name="PNG"/>
- <combo_box.item label="JPEG" name="JPEG"/>
- <combo_box.item label="BMP" name="BMP"/>
- </combo_box>
- <spinner label="Largeur" label_width="41" name="snapshot_width" width="101"/>
- <spinner label="Hauteur" label_width="41" left="121" name="snapshot_height" width="101"/>
- <slider label="Qualité de l&apos;image" name="image_quality_slider"/>
- <text name="layer_type_label">
- Capturer :
- </text>
- <combo_box label="Couches de l&apos;image" name="layer_types">
- <combo_box.item label="Couleurs" name="Colors"/>
- <combo_box.item label="Profondeur" name="Depth"/>
- <combo_box.item label="Matte des objets" name="ObjectMattes"/>
- </combo_box>
- <text name="file_size_label">
- [SIZE] Ko
- </text>
- <check_box label="Interface" name="ui_check"/>
- <check_box label="HUD" name="hud_check"/>
- <check_box label="Garder ouvert après enregistrement" name="keep_open_check"/>
- <check_box label="Contraindre les proportions" name="keep_aspect_check"/>
- <check_box label="Arrêt sur image (plein écran)" name="freeze_frame_check"/>
- <button label="Rafraîchir" name="new_snapshot_btn"/>
- <check_box label="Rafraîchissement automatique" name="auto_snapshot_check"/>
- <button label="Enregistrer ([AMOUNT] L$)" name="upload_btn" width="118"/>
- <button label="Envoyer" name="send_btn" width="118"/>
- <flyout_button label="Enregistrer" name="save_btn" tool_tip="Enregistrer l&apos;image dans un fichier" width="118">
- <flyout_button.item label="Enregistrer" name="save_item"/>
- <flyout_button.item label="Enregistrer sous..." name="saveas_item"/>
- </flyout_button>
- <button label="Annuler" left="133" name="discard_btn" width="72"/>
- <string name="unknown">
+<floater name="Snapshot" title="Photo" width="247">
+ <floater.string name="unknown">
inconnu
- </string>
+ </floater.string>
+ <button label="Rafraîchir" name="new_snapshot_btn"/>
+ <line_editor label="Description" name="description"/>
+ <button label="Partager" name="share"/>
+ <button label="Partage Web" name="share_to_web"/>
+ <button label="Dans mon inventaire" name="save_to_inventory"/>
+ <button label="Enregistrer" name="save"/>
+ <button label="Envoi par e-mail" name="share_to_email"/>
+ <button label="Sur mon ordinateur" name="save_to_computer"/>
+ <button label="Image de profil" name="set_profile_pic"/>
+ <button label="Précédent" name="cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_sys_well.xml b/indra/newview/skins/default/xui/fr/floater_sys_well.xml
index 9b0253065c..dbdd32974c 100644
--- a/indra/newview/skins/default/xui/fr/floater_sys_well.xml
+++ b/indra/newview/skins/default/xui/fr/floater_sys_well.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="notification_chiclet" title="NOTIFICATIONS">
+<floater name="sys_well_window" title="NOTIFICATIONS">
<string name="title_im_well_window">
- SESSIONS IM
+ CONVERSATIONS
</string>
<string name="title_notification_well_window">
NOTIFICATIONS
diff --git a/indra/newview/skins/default/xui/fr/floater_telehub.xml b/indra/newview/skins/default/xui/fr/floater_telehub.xml
index a50cfc25c1..c529ca2736 100644
--- a/indra/newview/skins/default/xui/fr/floater_telehub.xml
+++ b/indra/newview/skins/default/xui/fr/floater_telehub.xml
@@ -10,8 +10,7 @@
Pour supprimer, cliquez sur Déconnecter.
</text>
<text bottom_delta="-18" height="38" name="help_text_not_connected">
- Sélectionner l&apos;objet et cliquez sur Connecter
-le téléhub.
+ Sélectionner l&apos;objet et cliquez sur Connecter le téléhub.
</text>
<button label="Connecter le téléhub" name="connect_btn" width="122"/>
<button label="Déconnecter" left="142" name="disconnect_btn" width="98"/>
@@ -20,7 +19,7 @@ le téléhub.
</text>
<button label="Ajouter point" name="add_spawn_point_btn"/>
<button label="Supprimer point" name="remove_spawn_point_btn"/>
- <text name="spawn_point_help">
+ <text name="spawn_point_help" height="100">
Sélectionnez l&apos;objet et cliquez sur Ajouter pour indiquer la position.
Vous pourrez ensuite déplacer ou supprimer l&apos;objet.
Les positions sont relatives au centre du téléhub.
diff --git a/indra/newview/skins/default/xui/fr/floater_tools.xml b/indra/newview/skins/default/xui/fr/floater_tools.xml
index 3488ae15d1..26d097d549 100644
--- a/indra/newview/skins/default/xui/fr/floater_tools.xml
+++ b/indra/newview/skins/default/xui/fr/floater_tools.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="toolbox floater" short_title="OUTILS DE CONSTRUCTION" title="">
+<floater name="toolbox floater" short_title="OUTILS POUR LA CONSTRUCTION" title="">
<floater.string name="status_rotate">
Pour faire tourner l&apos;objet, faîtes glisser les bandes de couleur.
</floater.string>
@@ -37,7 +37,7 @@
Référence
</floater.string>
<floater.string name="grid_attachment_text">
- Pièce-jointe
+ Pièce jointe
</floater.string>
<button label="" label_selected="" name="button focus" tool_tip="Mise au point"/>
<button label="" label_selected="" name="button move" tool_tip="Déplacer"/>
@@ -61,13 +61,16 @@
<radio_item label="Bouger" name="radio position"/>
<radio_item label="Pivoter (Ctrl)" name="radio rotate"/>
<radio_item label="Étirer (Ctrl+Maj)" name="radio stretch"/>
- <radio_item label="Sélectionner une face" name="radio select face"/>
+ <radio_item label="Choisir une face" name="radio select face"/>
</radio_group>
<check_box label="Modification liée" name="checkbox edit linked parts"/>
<text name="RenderingCost" tool_tip="Affiche le coût du rendu calculé pour cet objet">
þ : [COUNT]
</text>
- <check_box label="Étirer les deux côtés" name="checkbox uniform"/>
+ <check_box label="" name="checkbox uniform"/>
+ <text label="Étirer les deux côtés" name="checkbox uniform label">
+ Étirer les deux côtés
+ </text>
<check_box initial_value="true" label="Étirer les textures" name="checkbox stretch textures"/>
<check_box initial_value="true" label="Fixer sur la grille" name="checkbox snap to grid"/>
<combo_box name="combobox grid mode" tool_tip="Choisissez le type d&apos;axe de grille pour le positionnement de l&apos;objet">
@@ -96,7 +99,7 @@
<check_box initial_value="true" label="Centrer" name="checkbox copy centers"/>
<check_box label="Pivoter" name="checkbox copy rotates"/>
<radio_group name="land_radio_group">
- <radio_item label="Sélectionner le terrain" name="radio select land"/>
+ <radio_item label="Choisir le terrain" name="radio select land"/>
<radio_item label="Aplatir" name="radio flatten"/>
<radio_item label="Élever" name="radio raise"/>
<radio_item label="Abaisser" name="radio lower"/>
@@ -179,9 +182,9 @@
<text name="Group:">
Groupe :
</text>
- <button label="Définir..." label_selected="Définir..." name="button set group" tool_tip="Choisissez un groupe pour partager les permissions de cet objet"/>
+ <button label="Définir..." label_selected="Définir..." name="button set group" tool_tip="Choisissez un groupe pour partager les droits de cet objet"/>
<name_box initial_value="Chargement..." name="Group Name Proxy"/>
- <button label="Céder" label_selected="Céder" name="button deed" tool_tip="En cédant un objet, vous donnez aussi les permissions au prochain propriétaire. Seul un officier peut céder les objets d&apos;un groupe."/>
+ <button label="Céder" label_selected="Céder" name="button deed" tool_tip="En cédant un objet, vous donnez aussi les droits au prochain propriétaire. Seul un officier peut céder les objets d&apos;un groupe."/>
<check_box label="Partager" name="checkbox share with group" tool_tip="Autorisez tous les membres du groupe choisi à utiliser et à partager vos droits pour cet objet. Pour activer les restrictions de rôles, vous devez d&apos;abord cliquer sur Transférer."/>
<text name="label click action">
Cliquer pour :
@@ -280,7 +283,7 @@
<combo_box.item label="Caoutchouc" name="Rubber"/>
</combo_box>
<text name="text cut">
- Découpe du tracé (début/fin)
+ Découpe du tracé (déb./fin)
</text>
<spinner label="D" name="cut begin"/>
<spinner label="F" name="cut end"/>
@@ -339,8 +342,8 @@
<text name="text revolutions">
Révolutions
</text>
- <texture_picker label="Texture du sculptie" name="sculpt texture control" tool_tip="Cliquez pour sélectionner une image"/>
- <check_box label="Mirroir" name="sculpt mirror control" tool_tip="Inverse le sculptie le long de l&apos;axe X"/>
+ <texture_picker label="Texture de la sculptie" name="sculpt texture control" tool_tip="Cliquez pour sélectionner une image"/>
+ <check_box label="Mirroir" name="sculpt mirror control" tool_tip="Inverse la sculptie le long de l&apos;axe X"/>
<check_box label="A l&apos;envers" name="sculpt invert control" tool_tip="Inverse les normales des sculpties, qui apparaissent alors à l&apos;envers"/>
<text name="label sculpt type">
Type de raccord
@@ -355,7 +358,7 @@
</panel>
<panel label="Attributs" name="Features">
<text name="select_single">
- Sélectionnez un prim pour modifier les attributs.
+ Choisir une prim pour changer les attributs.
</text>
<text name="edit_object">
Modifier les attributs de l&apos;objet :
@@ -441,9 +444,9 @@
<check_box label="Inverser" name="checkbox flip s"/>
<spinner label="Vertical (V)" name="TexScaleV"/>
<check_box label="Inverser" name="checkbox flip t"/>
- <spinner label="RotationËš" left="122" name="TexRot" width="58"/>
- <spinner label="Répétitions / Mètre" left="122" name="rptctrl" width="58"/>
- <button label="Appliquer" label_selected="Appliquer" left_delta="68" name="button apply" width="75"/>
+ <spinner label="RotationËš" name="TexRot"/>
+ <spinner label="Répétitions / Mètre" name="rptctrl"/>
+ <button label="Appliquer" label_selected="Appliquer" name="button apply"/>
<text name="tex offset">
Décalage de la texture
</text>
@@ -474,7 +477,7 @@
<text name="label_area">
Surface : [AREA] m²
</text>
- <button label="À propos des terrains" label_selected="À propos des terrains" name="button about land" width="142"/>
+ <button label="À propos du terrain" label_selected="À propos du terrain" name="button about land" width="142"/>
<check_box label="Afficher les propriétaires" name="checkbox show owners" tool_tip="Colorier les parcelles en fonction du type de leur propriétaire : Vert = votre terrain Turquoise = le terrain de votre groupe Rouge = appartenant à d&apos;autres Jaune = en vente Mauve = aux enchères Gris = public"/>
<text name="label_parcel_modify">
Modifier la parcelle
diff --git a/indra/newview/skins/default/xui/fr/floater_tos.xml b/indra/newview/skins/default/xui/fr/floater_tos.xml
index 2c8e8bc5bc..8a2a1e1d25 100644
--- a/indra/newview/skins/default/xui/fr/floater_tos.xml
+++ b/indra/newview/skins/default/xui/fr/floater_tos.xml
@@ -1,22 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="modal container" title=" ">
+ <floater.string name="real_url">
+ http://secondlife.com/app/tos/
+ </floater.string>
+ <floater.string name="loading_url">
+ data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+ </floater.string>
<button label="Continuer" label_selected="Continuer" name="Continue"/>
<button label="Annuler" label_selected="Annuler" name="Cancel"/>
- <radio_group name="tos_agreement">
- <radio_item label="Je n&apos;accepte pas les Conditions Générales d&apos;Utilisation" name="radio_disagree"/>
- <radio_item label="J&apos;accepte les Conditions Générales d&apos;Utilisation" name="radio_agree"/>
- </radio_group>
- <text name="tos_title">
- Acceptation des Conditions Générales d&apos;Utilisation
- </text>
- <check_box label="J&apos;accepte les Conditions d&apos;utilisation" name="agree_chk"/>
+ <check_box label="J&apos;accepte les Conditions d&apos;utilisation et le Règlement sur le respect de la vie privée" name="agree_chk"/>
<text name="tos_heading">
- Veuillez lire attentivement les Conditions d&apos;utilisation suivantes. Pour vous connecter à [SECOND_LIFE], vous devez accepter l&apos;accord.
- </text>
- <text_editor name="tos_text">
- TOS_TEXT
- </text_editor>
- <text name="real_url">
- http://secondlife.com/app/tos/
+ Veuillez lire attentivement les Conditions d&apos;utilisation et le Règlement sur le respect de la vie privée suivants. Vous devez les accepter pour pouvoir vous connecter à [SECOND_LIFE].
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_url_entry.xml b/indra/newview/skins/default/xui/fr/floater_url_entry.xml
index 6a90731691..4b2be14569 100644
--- a/indra/newview/skins/default/xui/fr/floater_url_entry.xml
+++ b/indra/newview/skins/default/xui/fr/floater_url_entry.xml
@@ -3,11 +3,11 @@
<text name="media_label">
URL du média :
</text>
- <combo_box left="100" name="media_entry" width="360" />
- <button label="OK" name="ok_btn" />
+ <combo_box name="media_entry"/>
+ <button label="OK" name="ok_btn" width="30" />
<button label="Annuler" name="cancel_btn" />
- <button label="Effacer" name="clear_btn" />
- <text name="loading_label">
+ <button label="Effacer" name="clear_btn" left_pad="94"/>
+ <text name="loading_label" left="120">
Chargement...
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_voice_controls.xml b/indra/newview/skins/default/xui/fr/floater_voice_controls.xml
index 54ba2ad3e5..1a7bc228fa 100644
--- a/indra/newview/skins/default/xui/fr/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/fr/floater_voice_controls.xml
@@ -16,6 +16,9 @@
Il n&apos;y a personne près de vous avec le chat vocal activé
</string>
<layout_stack name="my_call_stack">
+ <layout_panel name="my_panel">
+ <text name="user_text" value="Mon avatar :"/>
+ </layout_panel>
<layout_panel name="leave_call_btn_panel">
<button label="Quitter l&apos;appel" name="leave_call_btn"/>
</layout_panel>
diff --git a/indra/newview/skins/default/xui/fr/floater_water.xml b/indra/newview/skins/default/xui/fr/floater_water.xml
index 287f51d9f7..96723b0fe6 100644
--- a/indra/newview/skins/default/xui/fr/floater_water.xml
+++ b/indra/newview/skins/default/xui/fr/floater_water.xml
@@ -1,19 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Water Floater" title="ÉDITEUR D&apos;EAU AVANCÉE">
+<floater name="Water Floater" title="ÉDITEUR D&apos;EAU AVANCÉ">
<floater.string name="WLDefaultWaterNames">
Default:Glassy:Pond:Murky:Second Plague:SNAKE!!!:Valdez
</floater.string>
- <text name="KeyFramePresetsText">
- Préréglages eau :
+ <text name="KeyFramePresetsText" width="120">
+ Préréglages :
</text>
<button label="Nouveau" label_selected="Nouveau" name="WaterNewPreset"/>
<button label="Enregistrer" label_selected="Enregistrer" left_delta="75" name="WaterSavePreset" width="75"/>
<button label="Supprimer" label_selected="Supprimer" left_delta="80" name="WaterDeletePreset"/>
<tab_container name="Water Tabs">
- <panel label="Paramètres" name="Settings">
+ <panel label="PARAMÈTRES" name="Settings">
<text name="BHText">
- Couleur du brouillard
-dans l&apos;eau
+ Couleur du brouillard dans l&apos;eau
</text>
<color_swatch left="75" name="WaterFogColor" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
<text name="WaterFogDensText">
@@ -35,7 +34,7 @@ dans l&apos;eau
Décalage Fresnel
</text>
<text name="DensMultText">
- Réfraction au dessus
+ Réfraction au-dessus
</text>
<text name="WaterScaleBelowText">
Réfraction en dessous
@@ -44,7 +43,7 @@ dans l&apos;eau
Multiplicateur de flou
</text>
</panel>
- <panel label="Image" name="Waves">
+ <panel label="IMAGE" name="Waves">
<text name="BHText">
Direction grande vague
</text>
diff --git a/indra/newview/skins/default/xui/fr/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/fr/floater_wearable_save_as.xml
index af6274d4e2..5dda347fcf 100644
--- a/indra/newview/skins/default/xui/fr/floater_wearable_save_as.xml
+++ b/indra/newview/skins/default/xui/fr/floater_wearable_save_as.xml
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="modal container">
- <button label="Enregistrer" label_selected="Enregistrer" name="Save" />
- <button label="Annuler" label_selected="Annuler" name="Cancel" />
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Annuler" label_selected="Annuler" name="Cancel"/>
<text name="Save item as:">
- Enregistrer l&apos;objet sous :
+ Enregistrer l&apos;objet dans mon inventaire comme :
</text>
<line_editor name="name ed">
Nouveau [DESC]
diff --git a/indra/newview/skins/default/xui/fr/floater_windlight_options.xml b/indra/newview/skins/default/xui/fr/floater_windlight_options.xml
index e28de71625..74f1697449 100644
--- a/indra/newview/skins/default/xui/fr/floater_windlight_options.xml
+++ b/indra/newview/skins/default/xui/fr/floater_windlight_options.xml
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="WindLight floater" title="ÉDITEUR DE CIEL AVANCÉ" width="706">
<text name="KeyFramePresetsText">
- Préréglages ciel :
+ Préréglages :
</text>
<button label="Nouveau" label_selected="Nouveau" name="WLNewPreset"/>
<button label="Enregistrer" label_selected="Enregistrer" left_delta="75" name="WLSavePreset" width="75"/>
<button label="Supprimer" label_selected="Supprimer" left_delta="80" name="WLDeletePreset"/>
- <button label="Éditeur du cycle du jour" label_selected="Éditeur du cycle du jour" left_delta="95" name="WLDayCycleMenuButton" width="150"/>
+ <button label="Éditeur du cycle du jour" label_selected="Éditeur du cycle du jour" left_delta="95" left_pad="20" name="WLDayCycleMenuButton" width="150"/>
<tab_container name="WindLight Tabs" width="706">
- <panel label="Atmosphère" name="Atmosphere">
+ <panel label="ATMOSPHÈRE" name="Atmosphere">
<text name="BHText">
Bleu de l&apos;horizon
</text>
@@ -62,7 +62,7 @@
</text>
<button label="?" name="WLMaxAltitudeHelp"/>
</panel>
- <panel label="Éclairage" name="Lighting">
+ <panel label="LUMIÈRE" name="Lighting">
<text name="SLCText">
Couleur soleil/lune
</text>
@@ -118,7 +118,7 @@
</text>
<button label="?" name="WLStarBrightnessHelp"/>
</panel>
- <panel label="Nuages" name="Clouds">
+ <panel label="NUAGES" name="Clouds">
<text name="WLCloudColorText">
Couleur des nuages
</text>
diff --git a/indra/newview/skins/default/xui/fr/floater_world_map.xml b/indra/newview/skins/default/xui/fr/floater_world_map.xml
index 3ac3580d4b..4d500857ea 100644
--- a/indra/newview/skins/default/xui/fr/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/fr/floater_world_map.xml
@@ -1,90 +1,70 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="worldmap" title="CARTE DU MONDE">
- <panel name="objects_mapview" width="542"/>
<panel name="layout_panel_1">
<text name="events_label">
Légende
</text>
</panel>
- <panel>
- <button label="Afficher mon emplacement" label_selected="Afficher mon emplacement" name="Show My Location" tool_tip="Centrer la carte sur l&apos;emplacement de mon avatar" width="165"/>
+ <panel name="layout_panel_2">
+ <button name="Show My Location" tool_tip="Centrer la carte sur l’emplacement de mon avatar"/>
<text name="me_label">
Moi
</text>
- <check_box label="Résident" name="people_chk"/>
- <icon left="-262" name="person"/>
<text name="person_label">
Résident
</text>
- <check_box label="Infohub" name="infohub_chk"/>
- <icon left="-266" name="infohub"/>
<text name="infohub_label">
Infohub
</text>
- <check_box label="Terrain à vendre" name="land_for_sale_chk"/>
- <icon left="-266" name="landforsale"/>
<text name="land_sale_label">
Vente de terrains
</text>
- <icon left="-270" name="square2"/>
<text name="by_owner_label">
- par le propriétaire
+ propriétaire
</text>
<text name="auction_label">
enchères
</text>
- <button label="Aller chez moi" label_selected="Aller chez moi" left="-120" name="Go Home" tool_tip="Me téléporter jusqu&apos;à mon domicile" width="108"/>
+ <button name="Go Home" tool_tip="Me téléporter jusqu’à mon domicile"/>
<text name="Home_label">
Domicile
</text>
- <text left="-144" name="events_label">
+ <text name="events_label">
Événements :
</text>
- <check_box label="PG" name="event_chk"/>
- <icon left="-132" name="event"/>
<text name="pg_label">
Général
</text>
- <check_box initial_value="true" label="Mature" name="event_mature_chk"/>
- <icon left="-132" name="events_mature_icon"/>
+ <check_box initial_value="true" name="event_mature_chk"/>
<text name="mature_label">
Modéré
</text>
- <check_box label="Adult" name="event_adult_chk"/>
- <icon left="-132" name="events_adult_icon"/>
<text name="adult_label">
Adulte
</text>
</panel>
- <panel>
+ <panel name="layout_panel_3">
<text name="find_on_map_label">
Situer sur la carte
</text>
</panel>
- <panel>
- <combo_box label="Amis connectés" name="friend combo" tool_tip="Afficher les amis sur la carte" width="232">
+ <panel name="layout_panel_4">
+ <combo_box label="Amis connectés" name="friend combo" tool_tip="Afficher les amis sur la carte">
<combo_box.item label="Mes amis connectés" name="item1"/>
</combo_box>
- <icon left="-270" name="landmark_icon"/>
- <combo_box label="Mes repères" name="landmark combo" tool_tip="Repère à afficher sur la carte" width="232">
+ <combo_box label="Mes repères" name="landmark combo" tool_tip="Repère à afficher sur la carte">
<combo_box.item label="Mes repères" name="item1"/>
</combo_box>
- <search_editor label="Régions par nom" name="location" tool_tip="Saisissez le nom d&apos;une région" width="155"/>
- <button label="Trouver" label_selected="&gt;" left_delta="160" name="DoSearch" tool_tip="Recherchez sur la carte" width="75"/>
- <scroll_list left="-270" name="search_results" width="252">
- <scroll_list.columns label="" name="icon"/>
- <scroll_list.columns label="" name="sim_name"/>
- </scroll_list>
- <button label="Téléporter" label_selected="Téléporter" left="-270" name="Teleport" tool_tip="Téléporter à l&apos;endroit sélectionné"/>
- <button label="Copier la SLurl" left="-270" name="copy_slurl" tool_tip="Copie l&apos;emplacement actuel sous la forme d&apos;une SLurl à utiliser sur le Web."/>
- <button label="Afficher la sélection" label_selected="Afficher la destination" name="Show Destination" tool_tip="Centrer la carte sur l&apos;endroit sélectionné" width="165"/>
+ <search_editor label="Régions par nom" name="location" tool_tip="Tapez le nom d&apos;une région"/>
+ <button label="Trouver" name="DoSearch" tool_tip="Rechercher une région"/>
+ <button name="Clear" tool_tip="Effacer les lignes de suivi et réinitialiser la carte"/>
+ <button label="Téléporter" name="Teleport" tool_tip="Me téléporter à l&apos;emplacement sélectionné"/>
+ <button label="Copier la SLurl" name="copy_slurl" tool_tip="Copie l’emplacement actuel sous la forme d’une SLurl à utiliser sur le Web."/>
+ <button label="Afficher la sélection" name="Show Destination" tool_tip="Centrer la carte sur l&apos;emplacement sélectionné"/>
</panel>
- <panel>
+ <panel name="layout_panel_5">
<text name="zoom_label">
Zoomer
</text>
</panel>
- <panel>
- <slider label="Zoom" left="-270" name="zoom slider"/>
- </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/inspect_avatar.xml b/indra/newview/skins/default/xui/fr/inspect_avatar.xml
index be23369dc7..381a52ed43 100644
--- a/indra/newview/skins/default/xui/fr/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/fr/inspect_avatar.xml
@@ -18,7 +18,7 @@
<slider name="volume_slider" tool_tip="Volume de la voix" value="0.5"/>
<button label="Devenir amis" name="add_friend_btn"/>
<button label="IM" name="im_btn"/>
- <button label="Plus" name="view_profile_btn"/>
+ <button label="Profil" name="view_profile_btn"/>
<panel name="moderator_panel">
<button label="Désactiver le chat vocal" name="disable_voice"/>
<button label="Activer le chat vocal" name="enable_voice"/>
diff --git a/indra/newview/skins/default/xui/fr/inspect_remote_object.xml b/indra/newview/skins/default/xui/fr/inspect_remote_object.xml
index 6d8c44578a..6d7cfadc04 100644
--- a/indra/newview/skins/default/xui/fr/inspect_remote_object.xml
+++ b/indra/newview/skins/default/xui/fr/inspect_remote_object.xml
@@ -7,7 +7,7 @@
<text name="object_name">
Nom d&apos;objet de test vraiment très long
</text>
- <text name="object_owner_label">
+ <text name="object_owner_label" width="70">
Propriétaire :
</text>
<text name="object_owner">
diff --git a/indra/newview/skins/default/xui/fr/language_settings.xml b/indra/newview/skins/default/xui/fr/language_settings.xml
index 71418d446a..117ae16ee8 100644
--- a/indra/newview/skins/default/xui/fr/language_settings.xml
+++ b/indra/newview/skins/default/xui/fr/language_settings.xml
@@ -3,9 +3,9 @@
<strings>
<!-- Locale Information -->
- <string name="MicrosoftLocale">english</string>
- <string name="DarwinLocale">C</string>
- <string name="LinuxLocale">C</string>
+ <string name="MicrosoftLocale">french</string>
+ <string name="DarwinLocale">fr_FR.UTF-8</string>
+ <string name="LinuxLocale">fr_FR.UTF-8</string>
<!--
datetimeToCodes["wkday"] = "%a"; // Thu
diff --git a/indra/newview/skins/default/xui/fr/menu_attachment_other.xml b/indra/newview/skins/default/xui/fr/menu_attachment_other.xml
index ccb93f129e..f48513eb2b 100644
--- a/indra/newview/skins/default/xui/fr/menu_attachment_other.xml
+++ b/indra/newview/skins/default/xui/fr/menu_attachment_other.xml
@@ -8,9 +8,9 @@
<menu_item_call label="Inviter dans le groupe" name="Invite..."/>
<menu_item_call label="Ignorer" name="Avatar Mute"/>
<menu_item_call label="Signaler" name="abuse"/>
- <menu_item_call label="Geler" name="Freeze..."/>
+ <menu_item_call label="Figer" name="Freeze..."/>
<menu_item_call label="Expulser" name="Eject..."/>
- <menu_item_call label="Débogage" name="Debug..."/>
+ <menu_item_call label="Déboguer les textures" name="Debug..."/>
<menu_item_call label="Zoomer en avant" name="Zoom In"/>
<menu_item_call label="Payer" name="Pay..."/>
<menu_item_call label="Profil de l&apos;objet" name="Object Inspect"/>
diff --git a/indra/newview/skins/default/xui/fr/menu_attachment_self.xml b/indra/newview/skins/default/xui/fr/menu_attachment_self.xml
index 999a1c156c..ff87d90d4d 100644
--- a/indra/newview/skins/default/xui/fr/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/fr/menu_attachment_self.xml
@@ -5,8 +5,9 @@
<menu_item_call label="Détacher" name="Detach"/>
<menu_item_call label="Lâcher" name="Drop"/>
<menu_item_call label="Me lever" name="Stand Up"/>
- <menu_item_call label="Mon apparence" name="Appearance..."/>
+ <menu_item_call label="Changer de tenue" name="Change Outfit"/>
<menu_item_call label="Mes amis" name="Friends..."/>
<menu_item_call label="Mes groupes" name="Groups..."/>
<menu_item_call label="Mon profil" name="Profile..."/>
+ <menu_item_call label="Déboguer les textures" name="Debug..."/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_avatar_other.xml b/indra/newview/skins/default/xui/fr/menu_avatar_other.xml
index 289912cd05..08d1a20361 100644
--- a/indra/newview/skins/default/xui/fr/menu_avatar_other.xml
+++ b/indra/newview/skins/default/xui/fr/menu_avatar_other.xml
@@ -8,9 +8,9 @@
<menu_item_call label="Inviter dans le groupe" name="Invite..."/>
<menu_item_call label="Ignorer" name="Avatar Mute"/>
<menu_item_call label="Signaler" name="abuse"/>
- <menu_item_call label="Geler" name="Freeze..."/>
+ <menu_item_call label="Figer" name="Freeze..."/>
<menu_item_call label="Expulser" name="Eject..."/>
- <menu_item_call label="Débogage" name="Debug..."/>
+ <menu_item_call label="Déboguer les textures" name="Debug..."/>
<menu_item_call label="Zoomer en avant" name="Zoom In"/>
<menu_item_call label="Payer" name="Pay..."/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_avatar_self.xml b/indra/newview/skins/default/xui/fr/menu_avatar_self.xml
index 82945cf96e..3620dc72b0 100644
--- a/indra/newview/skins/default/xui/fr/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/fr/menu_avatar_self.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Self Pie">
<menu_item_call label="Me lever" name="Stand Up"/>
- <context_menu label="Enlever &gt;" name="Take Off &gt;">
- <context_menu label="Habits &gt;" name="Clothes &gt;">
+ <context_menu label="Enlever â–¶" name="Take Off &gt;">
+ <context_menu label="Habits â–¶" name="Clothes &gt;">
<menu_item_call label="Chemise" name="Shirt"/>
<menu_item_call label="Pantalon" name="Pants"/>
<menu_item_call label="Jupe" name="Skirt"/>
@@ -10,18 +10,21 @@
<menu_item_call label="Chaussettes" name="Socks"/>
<menu_item_call label="Veste" name="Jacket"/>
<menu_item_call label="Gants" name="Gloves"/>
- <menu_item_call label="Sous-vêtements (homme)" name="Self Undershirt"/>
- <menu_item_call label="Sous-vêtements (femme)" name="Self Underpants"/>
+ <menu_item_call label="Débardeur" name="Self Undershirt"/>
+ <menu_item_call label="Caleçon" name="Self Underpants"/>
<menu_item_call label="Tatouage" name="Self Tattoo"/>
<menu_item_call label="Alpha" name="Self Alpha"/>
<menu_item_call label="Tous les habits" name="All Clothes"/>
</context_menu>
- <context_menu label="HUD &gt;" name="Object Detach HUD"/>
- <context_menu label="Détacher &gt;" name="Object Detach"/>
+ <context_menu label="HUD â–¶" name="Object Detach HUD"/>
+ <context_menu label="Détacher ▶" name="Object Detach"/>
<menu_item_call label="Tout détacher" name="Detach All"/>
</context_menu>
- <menu_item_call label="Mon apparence" name="Appearance..."/>
+ <menu_item_call label="Changer de tenue" name="Chenge Outfit"/>
+ <menu_item_call label="Modifier ma tenue" name="Edit Outfit"/>
+ <menu_item_call label="Modifier ma silhouette" name="Edit My Shape"/>
<menu_item_call label="Mes amis" name="Friends..."/>
<menu_item_call label="Mes groupes" name="Groups..."/>
<menu_item_call label="Mon profil" name="Profile..."/>
+ <menu_item_call label="Déboguer les textures" name="Debug..."/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_bottomtray.xml b/indra/newview/skins/default/xui/fr/menu_bottomtray.xml
index 3229940980..e058c66a17 100644
--- a/indra/newview/skins/default/xui/fr/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/fr/menu_bottomtray.xml
@@ -4,6 +4,11 @@
<menu_item_check label="Bouton Bouger" name="ShowMoveButton"/>
<menu_item_check label="Bouton Afficher" name="ShowCameraButton"/>
<menu_item_check label="Bouton Photo" name="ShowSnapshotButton"/>
+ <menu_item_check label="Bouton Panneau latéral" name="ShowSidebarButton"/>
+ <menu_item_check label="Bouton Construire" name="ShowBuildButton"/>
+ <menu_item_check label="Bouton Rechercher" name="ShowSearchButton"/>
+ <menu_item_check label="Bouton Carte" name="ShowWorldMapButton"/>
+ <menu_item_check label="Bouton Mini-carte" name="ShowMiniMapButton"/>
<menu_item_call label="Couper" name="NearbyChatBar_Cut"/>
<menu_item_call label="Copier" name="NearbyChatBar_Copy"/>
<menu_item_call label="Coller" name="NearbyChatBar_Paste"/>
diff --git a/indra/newview/skins/default/xui/fr/menu_edit.xml b/indra/newview/skins/default/xui/fr/menu_edit.xml
new file mode 100644
index 0000000000..56669f31e1
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_edit.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu label="Modifier" name="Edit">
+ <menu_item_call label="Annuler" name="Undo"/>
+ <menu_item_call label="Refaire" name="Redo"/>
+ <menu_item_call label="Couper" name="Cut"/>
+ <menu_item_call label="Copier" name="Copy"/>
+ <menu_item_call label="Coller" name="Paste"/>
+ <menu_item_call label="Supprimer" name="Delete"/>
+ <menu_item_call label="Dupliquer" name="Duplicate"/>
+ <menu_item_call label="Tout sélectionner" name="Select All"/>
+ <menu_item_call label="Désélectionner" name="Deselect"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_group_plus.xml b/indra/newview/skins/default/xui/fr/menu_group_plus.xml
index f5882261b0..0db5afedc7 100644
--- a/indra/newview/skins/default/xui/fr/menu_group_plus.xml
+++ b/indra/newview/skins/default/xui/fr/menu_group_plus.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_group_plus">
- <menu_item_call label="Rejoignez des groupes..." name="item_join"/>
+ <menu_item_call label="Rejoindre des groupes..." name="item_join"/>
<menu_item_call label="Nouveau groupe..." name="item_new"/>
</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml
index 39ba4b1074..8bda133a0b 100644
--- a/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/fr/menu_inspect_avatar_gear.xml
@@ -9,10 +9,11 @@
<menu_item_call label="Ignorer" name="block"/>
<menu_item_call label="Ne plus ignorer" name="unblock"/>
<menu_item_call label="Signaler" name="report"/>
- <menu_item_call label="Geler" name="freeze"/>
+ <menu_item_call label="Figer" name="freeze"/>
<menu_item_call label="Expulser" name="eject"/>
- <menu_item_call label="Débogage" name="debug"/>
+ <menu_item_call label="Déboguer les textures" name="debug"/>
<menu_item_call label="Situer sur la carte" name="find_on_map"/>
<menu_item_call label="Zoomer en avant" name="zoom_in"/>
<menu_item_call label="Payer" name="pay"/>
+ <menu_item_call label="Partager" name="share"/>
</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml
index d28d36bca7..5f570b5608 100644
--- a/indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/fr/menu_inspect_self_gear.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<menu name="Gear Menu">
<menu_item_call label="Me lever" name="stand_up"/>
- <menu_item_call label="Mon apparence" name="my_appearance"/>
+ <menu_item_call label="Changer de tenue" name="change_outfit"/>
<menu_item_call label="Mon profil" name="my_profile"/>
<menu_item_call label="Mes amis" name="my_friends"/>
<menu_item_call label="Mes groupes" name="my_groups"/>
+ <menu_item_call label="Déboguer les textures" name="Debug..."/>
</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_inv_offer_chiclet.xml b/indra/newview/skins/default/xui/fr/menu_inv_offer_chiclet.xml
new file mode 100644
index 0000000000..a9b2883cca
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_inv_offer_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="InvOfferChiclet Menu">
+ <menu_item_call label="Fermer" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_inventory.xml b/indra/newview/skins/default/xui/fr/menu_inventory.xml
index 5276aa5b7e..4b9a05edd6 100644
--- a/indra/newview/skins/default/xui/fr/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/fr/menu_inventory.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
+ <menu_item_call label="Partager" name="Share"/>
<menu_item_call label="Acheter" name="Task Buy"/>
<menu_item_call label="Ouvrir" name="Task Open"/>
<menu_item_call label="Jouer" name="Task Play"/>
@@ -20,8 +21,8 @@
<menu_item_call label="Nouvelle veste" name="New Jacket"/>
<menu_item_call label="Nouvelle jupe" name="New Skirt"/>
<menu_item_call label="Nouveaux gants" name="New Gloves"/>
- <menu_item_call label="Nouveau tricot" name="New Undershirt"/>
- <menu_item_call label="Nouveaux sous-vêtements" name="New Underpants"/>
+ <menu_item_call label="Nouveau débardeur" name="New Undershirt"/>
+ <menu_item_call label="Nouveau caleçon" name="New Underpants"/>
<menu_item_call label="Nouveau masque alpha" name="New Alpha Mask"/>
<menu_item_call label="Nouveau tatouage" name="New Tattoo"/>
</menu>
@@ -40,8 +41,8 @@
<menu_item_call label="Chaussures" name="Shoes"/>
<menu_item_call label="Chemise" name="Shirt"/>
<menu_item_call label="Jupe" name="Skirt"/>
- <menu_item_call label="Sous-vêtements (femme)" name="Underpants"/>
- <menu_item_call label="Sous-vêtements (homme)" name="Undershirt"/>
+ <menu_item_call label="Caleçon" name="Underpants"/>
+ <menu_item_call label="Débardeur" name="Undershirt"/>
</menu>
<menu_item_call label="Téléporter" name="Landmark Open"/>
<menu_item_call label="Ouvrir" name="Animation Open"/>
@@ -49,10 +50,11 @@
<menu_item_call label="Remplacer la tenue actuelle" name="Replace Outfit"/>
<menu_item_call label="Ajouter à la tenue actuelle" name="Add To Outfit"/>
<menu_item_call label="Enlever de la tenue actuelle" name="Remove From Outfit"/>
+ <menu_item_call label="Trouver l&apos;original" name="Find Original"/>
<menu_item_call label="Purger l&apos;objet" name="Purge Item"/>
<menu_item_call label="Restaurer l&apos;objet" name="Restore Item"/>
- <menu_item_call label="Trouver l&apos;original" name="Find Original"/>
<menu_item_call label="Ouvrir" name="Open"/>
+ <menu_item_call label="Ouvrir l&apos;original" name="Open Original"/>
<menu_item_call label="Propriétés" name="Properties"/>
<menu_item_call label="Renommer" name="Rename"/>
<menu_item_call label="Copier l&apos;UUID (identifiant universel unique)" name="Copy Asset UUID"/>
@@ -65,7 +67,7 @@
<menu_item_call label="Démarrer le chat conférence" name="Conference Chat Folder"/>
<menu_item_call label="Jouer" name="Sound Play"/>
<menu_item_call label="À propos du repère" name="About Landmark"/>
- <menu_item_call label="Jouer dans le Monde" name="Animation Play"/>
+ <menu_item_call label="Jouer dans Second Life" name="Animation Play"/>
<menu_item_call label="Jouer localement" name="Animation Audition"/>
<menu_item_call label="Envoyer un message instantané" name="Send Instant Message"/>
<menu_item_call label="Offrir de téléporter..." name="Offer Teleport..."/>
diff --git a/indra/newview/skins/default/xui/fr/menu_inventory_add.xml b/indra/newview/skins/default/xui/fr/menu_inventory_add.xml
index 0e5abdad0a..57b0a768c2 100644
--- a/indra/newview/skins/default/xui/fr/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/fr/menu_inventory_add.xml
@@ -18,8 +18,8 @@
<menu_item_call label="Nouvelle veste" name="New Jacket"/>
<menu_item_call label="Nouvelle jupe" name="New Skirt"/>
<menu_item_call label="Nouveaux gants" name="New Gloves"/>
- <menu_item_call label="Nouveaux sous-vêtements (homme)" name="New Undershirt"/>
- <menu_item_call label="Nouveaux sous-vêtements (femme)" name="New Underpants"/>
+ <menu_item_call label="Nouveau débardeur" name="New Undershirt"/>
+ <menu_item_call label="Nouveau caleçon" name="New Underpants"/>
<menu_item_call label="Nouvel alpha" name="New Alpha"/>
<menu_item_call label="Nouveau tatouage" name="New Tattoo"/>
</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml
index 91bccfd699..4cfdfd2614 100644
--- a/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml
@@ -7,7 +7,7 @@
<menu_item_call label="Réinitialiser les filtres" name="reset_filters"/>
<menu_item_call label="Fermer tous les dossiers" name="close_folders"/>
<menu_item_call label="Vider la corbeille" name="empty_trash"/>
- <menu_item_call label="Vider les Objets trouvés" name="empty_lostnfound"/>
+ <menu_item_call label="Vider les objets trouvés" name="empty_lostnfound"/>
<menu_item_call label="Enregistrer la texture sous" name="Save Texture As"/>
<menu_item_call label="Trouver l&apos;original" name="Find Original"/>
<menu_item_call label="Trouver tous les liens" name="Find All Links"/>
diff --git a/indra/newview/skins/default/xui/fr/menu_land.xml b/indra/newview/skins/default/xui/fr/menu_land.xml
index 80cc49aa42..b84daee3ae 100644
--- a/indra/newview/skins/default/xui/fr/menu_land.xml
+++ b/indra/newview/skins/default/xui/fr/menu_land.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Land Pie">
- <menu_item_call label="À propos des terrains" name="Place Information..."/>
+ <menu_item_call label="À propos du terrain" name="Place Information..."/>
<menu_item_call label="M&apos;asseoir ici" name="Sit Here"/>
<menu_item_call label="Acheter ce terrain" name="Land Buy"/>
<menu_item_call label="Acheter un pass" name="Land Buy Pass"/>
diff --git a/indra/newview/skins/default/xui/fr/menu_login.xml b/indra/newview/skins/default/xui/fr/menu_login.xml
index fc42b02908..b712c008cd 100644
--- a/indra/newview/skins/default/xui/fr/menu_login.xml
+++ b/indra/newview/skins/default/xui/fr/menu_login.xml
@@ -8,18 +8,8 @@
<menu_item_call label="Aide de [SECOND_LIFE]" name="Second Life Help"/>
<menu_item_call label="À propos de [APP_NAME]" name="About Second Life"/>
</menu>
+ <menu_item_check label="Afficher le menu de débogage" name="Show Debug Menu"/>
<menu label="Débogage" name="Debug">
- <menu label="Éditer" name="Edit">
- <menu_item_call label="Annuler" name="Undo"/>
- <menu_item_call label="Refaire" name="Redo"/>
- <menu_item_call label="Couper" name="Cut"/>
- <menu_item_call label="Copier" name="Copy"/>
- <menu_item_call label="Coller" name="Paste"/>
- <menu_item_call label="Supprimer" name="Delete"/>
- <menu_item_call label="Dupliquer" name="Duplicate"/>
- <menu_item_call label="Tout sélectionner" name="Select All"/>
- <menu_item_call label="Désélectionner" name="Deselect"/>
- </menu>
<menu_item_call label="Afficher les paramètres de débogage" name="Debug Settings"/>
<menu_item_call label="Paramètres de couleurs/interface" name="UI/Color Settings"/>
<menu_item_call label="Outil d&apos;aperçu XUI" name="UI Preview Tool"/>
@@ -28,5 +18,7 @@
<menu_item_call label="Afficher les conditions d&apos;utilisation" name="TOS"/>
<menu_item_call label="Afficher le message critique" name="Critical"/>
<menu_item_call label="Test du navigateur Web" name="Web Browser Test"/>
+ <menu_item_check label="Afficher le sélecteur de grille" name="Show Grid Picker"/>
+ <menu_item_call label="Afficher la console des notifications" name="Show Notifications Console"/>
</menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/fr/menu_mini_map.xml b/indra/newview/skins/default/xui/fr/menu_mini_map.xml
index a9facb2c30..9dc40af502 100644
--- a/indra/newview/skins/default/xui/fr/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/fr/menu_mini_map.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="popup">
+<menu name="Popup">
<menu_item_call label="Zoom rapproché" name="Zoom Close"/>
<menu_item_call label="Zoom moyen" name="Zoom Medium"/>
<menu_item_call label="Zoom éloigné" name="Zoom Far"/>
diff --git a/indra/newview/skins/default/xui/fr/menu_object.xml b/indra/newview/skins/default/xui/fr/menu_object.xml
index b6775661ad..6492a83e06 100644
--- a/indra/newview/skins/default/xui/fr/menu_object.xml
+++ b/indra/newview/skins/default/xui/fr/menu_object.xml
@@ -5,20 +5,22 @@
<menu_item_call label="Construire" name="Build"/>
<menu_item_call label="Ouvrir" name="Open"/>
<menu_item_call label="M&apos;asseoir ici" name="Object Sit"/>
+ <menu_item_call label="Me lever" name="Object Stand Up"/>
<menu_item_call label="Profil de l&apos;objet" name="Object Inspect"/>
<menu_item_call label="Zoomer en avant" name="Zoom In"/>
- <context_menu label="Porter &gt;" name="Put On">
+ <context_menu label="Porter â–¶" name="Put On">
<menu_item_call label="Porter" name="Wear"/>
- <context_menu label="Joindre &gt;" name="Object Attach"/>
- <context_menu label="Joindre les éléments HUD &gt;" name="Object Attach HUD"/>
+ <context_menu label="Attacher â–¶" name="Object Attach"/>
+ <context_menu label="Attacher les éléments HUD ▶" name="Object Attach HUD"/>
</context_menu>
- <context_menu label="Supprimer &gt;" name="Remove">
- <menu_item_call label="Prendre" name="Pie Object Take"/>
+ <context_menu label="Supprimer â–¶" name="Remove">
<menu_item_call label="Signaler une infraction" name="Report Abuse..."/>
<menu_item_call label="Ignorer" name="Object Mute"/>
<menu_item_call label="Retour" name="Return..."/>
<menu_item_call label="Supprimer" name="Delete"/>
</context_menu>
+ <menu_item_call label="Acheter" name="Pie Object Bye"/>
+ <menu_item_call label="Prendre" name="Pie Object Take"/>
<menu_item_call label="Prendre une copie" name="Take Copy"/>
<menu_item_call label="Payer" name="Pay..."/>
<menu_item_call label="Acheter" name="Buy..."/>
diff --git a/indra/newview/skins/default/xui/fr/menu_participant_list.xml b/indra/newview/skins/default/xui/fr/menu_participant_list.xml
index c8f5b5f1ad..63d3d39f9c 100644
--- a/indra/newview/skins/default/xui/fr/menu_participant_list.xml
+++ b/indra/newview/skins/default/xui/fr/menu_participant_list.xml
@@ -8,13 +8,14 @@
<menu_item_call label="Appeler" name="Call"/>
<menu_item_call label="Partager" name="Share"/>
<menu_item_call label="Payer" name="Pay"/>
+ <menu_item_check label="Afficher les icônes des résidents" name="View Icons"/>
<menu_item_check label="Bloquer le chat vocal" name="Block/Unblock"/>
<menu_item_check label="Ignorer le texte" name="MuteText"/>
<context_menu label="Options du modérateur &gt;" name="Moderator Options">
<menu_item_check label="Autoriser les chats écrits" name="AllowTextChat"/>
<menu_item_call label="Ignorer ce participant" name="ModerateVoiceMuteSelected"/>
- <menu_item_call label="Ignorer tous les autres" name="ModerateVoiceMuteOthers"/>
<menu_item_call label="Ne plus ignorer ce participant" name="ModerateVoiceUnMuteSelected"/>
- <menu_item_call label="Ne plus ignorer tous les autres" name="ModerateVoiceUnMuteOthers"/>
+ <menu_item_call label="Ignorer les autres" name="ModerateVoiceMute"/>
+ <menu_item_call label="Ne plus ignorer les autres" name="ModerateVoiceUnmute"/>
</context_menu>
</context_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_people_nearby.xml b/indra/newview/skins/default/xui/fr/menu_people_nearby.xml
index d48be969f4..26bd3978a9 100644
--- a/indra/newview/skins/default/xui/fr/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/fr/menu_people_nearby.xml
@@ -2,8 +2,10 @@
<context_menu name="Avatar Context Menu">
<menu_item_call label="Voir le profil" name="View Profile"/>
<menu_item_call label="Devenir amis" name="Add Friend"/>
+ <menu_item_call label="Supprimer cet ami" name="Remove Friend"/>
<menu_item_call label="IM" name="IM"/>
<menu_item_call label="Appeler" name="Call"/>
+ <menu_item_call label="Carte" name="Map"/>
<menu_item_call label="Partager" name="Share"/>
<menu_item_call label="Payer" name="Pay"/>
<menu_item_check label="Ignorer/Ne plus ignorer" name="Block/Unblock"/>
diff --git a/indra/newview/skins/default/xui/fr/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/fr/menu_people_nearby_multiselect.xml
index 2185ac95e9..18ae84a67b 100644
--- a/indra/newview/skins/default/xui/fr/menu_people_nearby_multiselect.xml
+++ b/indra/newview/skins/default/xui/fr/menu_people_nearby_multiselect.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Multi-Selected People Context Menu">
<menu_item_call label="Devenir amis" name="Add Friends"/>
+ <menu_item_call label="Supprimer des amis" name="Remove Friend"/>
<menu_item_call label="IM" name="IM"/>
<menu_item_call label="Appeler" name="Call"/>
<menu_item_call label="Partager" name="Share"/>
diff --git a/indra/newview/skins/default/xui/fr/menu_profile_overflow.xml b/indra/newview/skins/default/xui/fr/menu_profile_overflow.xml
index 4bb9fa19a8..ddf898b791 100644
--- a/indra/newview/skins/default/xui/fr/menu_profile_overflow.xml
+++ b/indra/newview/skins/default/xui/fr/menu_profile_overflow.xml
@@ -1,9 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="profile_overflow_menu">
+ <menu_item_call label="Carte" name="show_on_map"/>
<menu_item_call label="Payer" name="pay"/>
<menu_item_call label="Partager" name="share"/>
+ <menu_item_call label="Ignorer" name="block"/>
+ <menu_item_call label="Ne plus ignorer" name="unblock"/>
<menu_item_call label="Éjecter" name="kick"/>
- <menu_item_call label="Geler" name="freeze"/>
- <menu_item_call label="Dégeler" name="unfreeze"/>
+ <menu_item_call label="Figer" name="freeze"/>
+ <menu_item_call label="Libérer" name="unfreeze"/>
<menu_item_call label="Représentant du service consommateur" name="csr"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_save_outfit.xml b/indra/newview/skins/default/xui/fr/menu_save_outfit.xml
new file mode 100644
index 0000000000..fbec933382
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_save_outfit.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="save_outfit_menu">
+ <menu_item_call label="Enregistrer" name="save_outfit"/>
+ <menu_item_call label="Enregistrer comme nouvelle" name="save_as_new_outfit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_script_chiclet.xml b/indra/newview/skins/default/xui/fr/menu_script_chiclet.xml
new file mode 100644
index 0000000000..46efa30bd6
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/menu_script_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="ScriptChiclet Menu">
+ <menu_item_call label="Fermer" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/fr/menu_viewer.xml b/indra/newview/skins/default/xui/fr/menu_viewer.xml
index 272fcfdae6..4c7cdefbe8 100644
--- a/indra/newview/skins/default/xui/fr/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/fr/menu_viewer.xml
@@ -7,10 +7,10 @@
</menu_item_call>
<menu_item_call label="Acheter des L$" name="Buy and Sell L$"/>
<menu_item_call label="Mon profil" name="Profile"/>
- <menu_item_call label="Mon apparence" name="Appearance"/>
+ <menu_item_call label="Changer de tenue" name="ChangeOutfit"/>
<menu_item_check label="Mon inventaire" name="Inventory"/>
- <menu_item_call label="Afficher l&apos;inventaire dans le panneau latéral" name="ShowSidetrayInventory"/>
- <menu_item_call label="Mes gestes" name="Gestures"/>
+ <menu_item_check label="Mon inventaire" name="ShowSidetrayInventory"/>
+ <menu_item_check label="Mes gestes" name="Gestures"/>
<menu label="Mon statut" name="Status">
<menu_item_call label="Absent" name="Set Away"/>
<menu_item_call label="Occupé" name="Set Busy"/>
@@ -22,9 +22,8 @@
<menu label="Communiquer" name="Communicate">
<menu_item_call label="Mes amis" name="My Friends"/>
<menu_item_call label="Mes groupes" name="My Groups"/>
- <menu_item_check label="Chat près de vous" name="Nearby Chat"/>
- <menu_item_call label="Personnes près de vous" name="Active Speakers"/>
- <menu_item_check label="Média près de vous" name="Nearby Media"/>
+ <menu_item_check label="Chat près de moi" name="Nearby Chat"/>
+ <menu_item_call label="Personnes près de moi" name="Active Speakers"/>
</menu>
<menu label="Monde" name="World">
<menu_item_check label="Mini-carte" name="Mini-Map"/>
@@ -32,14 +31,21 @@
<menu_item_call label="Photo" name="Take Snapshot"/>
<menu_item_call label="Créer un repère pour ce lieu" name="Create Landmark Here"/>
<menu label="Profil du lieu" name="Land">
- <menu_item_call label="À propos des terrains" name="About Land"/>
+ <menu_item_call label="Profil du lieu" name="Place Profile"/>
+ <menu_item_call label="À propos du terrain" name="About Land"/>
<menu_item_call label="Région/Domaine" name="Region/Estate"/>
</menu>
<menu_item_call label="Acheter ce terrain" name="Buy Land"/>
<menu_item_call label="Mes terrains" name="My Land"/>
<menu label="Afficher" name="LandShow">
<menu_item_check label="Contrôles de mouvement" name="Movement Controls"/>
- <menu_item_check label="Contrôles d&apos;affichage" name="Camera Controls"/>
+ <menu_item_check label="Contrôles d’affichage" name="Camera Controls"/>
+ <menu_item_check label="Lignes d&apos;interdiction" name="Ban Lines"/>
+ <menu_item_check label="Balises" name="beacons"/>
+ <menu_item_check label="Limites du terrain" name="Property Lines"/>
+ <menu_item_check label="Propriétaires de terrains" name="Land Owners"/>
+ <menu_item_check label="Coordonnées" name="Coordinates"/>
+ <menu_item_check label="Propriétés de la parcelle" name="Parcel Properties"/>
</menu>
<menu_item_call label="Me téléporter chez moi" name="Teleport Home"/>
<menu_item_call label="Définir le domicile ici" name="Set Home to Here"/>
@@ -61,23 +67,14 @@
<menu_item_call label="Outil de création" name="Create"/>
<menu_item_call label="Outil Terrain" name="Land"/>
</menu>
- <menu label="Édition" name="Edit">
- <menu_item_call label="Annuler" name="Undo"/>
- <menu_item_call label="Refaire" name="Redo"/>
- <menu_item_call label="Couper" name="Cut"/>
- <menu_item_call label="Copier" name="Copy"/>
- <menu_item_call label="Coller" name="Paste"/>
- <menu_item_call label="Supprimer" name="Delete"/>
- <menu_item_call label="Dupliquer" name="Duplicate"/>
- <menu_item_call label="Tout sélectionner" name="Select All"/>
- <menu_item_call label="Désélectionner" name="Deselect"/>
- </menu>
<menu_item_call label="Lien" name="Link"/>
<menu_item_call label="Annuler le lien" name="Unlink"/>
+ <menu_item_check label="Modifier les parties liées" name="Edit Linked Parts"/>
<menu_item_call label="Point central sur la sélection" name="Focus on Selection"/>
<menu_item_call label="Zoomer sur la sélection" name="Zoom to Selection"/>
<menu label="Objet" name="Object">
- <menu_item_call label="Acheter" name="Menu Object Take"/>
+ <menu_item_call label="Acheter" name="Menu Object Buy"/>
+ <menu_item_call label="Prendre" name="Menu Object Take"/>
<menu_item_call label="Prendre une copie" name="Take Copy"/>
<menu_item_call label="Enregistrer dans mon inventaire" name="Save Object Back to My Inventory"/>
<menu_item_call label="Enregistrer dans le contenu des objets" name="Save Object Back to Object Contents"/>
@@ -90,27 +87,20 @@
<menu_item_call label="Définir les scripts sur Pas d&apos;exécution" name="Set Scripts to Not Running"/>
</menu>
<menu label="Options" name="Options">
- <menu_item_check label="Modifier les parties reliées" name="Edit Linked Parts"/>
<menu_item_call label="Définir les droits de chargement par défaut" name="perm prefs"/>
<menu_item_check label="Afficher les droits avancés" name="DebugPermissions"/>
- <menu label="Sélection" name="Selection">
- <menu_item_check label="Sélectionner mes objets uniquement" name="Select Only My Objects"/>
- <menu_item_check label="Sélectionner les objets déplaçables uniquement" name="Select Only Movable Objects"/>
- <menu_item_check label="Sélectionner en entourant" name="Select By Surrounding"/>
- </menu>
- <menu label="Afficher" name="Show">
- <menu_item_check label="Afficher la sélection masquée" name="Show Hidden Selection"/>
- <menu_item_check label="Afficher le rayon lumineux pour la sélection" name="Show Light Radius for Selection"/>
- <menu_item_check label="Afficher le faisceau de sélection lumineux" name="Show Selection Beam"/>
- </menu>
- <menu label="Grille" name="Grid">
- <menu_item_check label="Fixer sur la grille" name="Snap to Grid"/>
- <menu_item_call label="Fixer les coordonnées XY de l&apos;objet sur la grille" name="Snap Object XY to Grid"/>
- <menu_item_call label="Utiliser la sélection pour la grille" name="Use Selection for Grid"/>
- <menu_item_call label="Options de la grille" name="Grid Options"/>
- </menu>
- </menu>
- <menu label="Sélectionner les parties reliées" name="Select Linked Parts">
+ <menu_item_check label="Sélectionner mes objets uniquement" name="Select Only My Objects"/>
+ <menu_item_check label="Sélectionner les objets déplaçables uniquement" name="Select Only Movable Objects"/>
+ <menu_item_check label="Sélectionner en entourant" name="Select By Surrounding"/>
+ <menu_item_check label="Afficher la sélection masquée" name="Show Hidden Selection"/>
+ <menu_item_check label="Afficher le rayon lumineux pour la sélection" name="Show Light Radius for Selection"/>
+ <menu_item_check label="Afficher le faisceau de sélection lumineux" name="Show Selection Beam"/>
+ <menu_item_check label="Fixer sur la grille" name="Snap to Grid"/>
+ <menu_item_call label="Fixer les coordonnées XY de l&apos;objet sur la grille" name="Snap Object XY to Grid"/>
+ <menu_item_call label="Utiliser la sélection pour la grille" name="Use Selection for Grid"/>
+ <menu_item_call label="Options de la grille" name="Grid Options"/>
+ </menu>
+ <menu label="Sélectionner les parties liées" name="Select Linked Parts">
<menu_item_call label="Sélectionner la partie suivante" name="Select Next Part"/>
<menu_item_call label="Sélectionner la partie précédente" name="Select Previous Part"/>
<menu_item_call label="Inclure la partie suivante" name="Include Next Part"/>
@@ -124,10 +114,11 @@
<menu_item_call label="À propos de [APP_NAME]" name="About Second Life"/>
</menu>
<menu label="Avancé" name="Advanced">
+ <menu_item_check label="Afficher le menu Avancé" name="Show Advanced Menu"/>
<menu_item_call label="Arrêter mon animation" name="Stop Animating My Avatar"/>
<menu_item_call label="Refixer les textures" name="Rebake Texture"/>
<menu_item_call label="Taille de l&apos;interface par défaut" name="Set UI Size to Default"/>
- <menu_item_call label="Définir la taille de la fenêtre..." name="Set Window Size..."/>
+ <menu_item_call label="Définir la taille de la fenêtre…" name="Set Window Size..."/>
<menu_item_check label="Limiter la distance de sélection" name="Limit Select Distance"/>
<menu_item_check label="Désactiver les contraintes de la caméra" name="Disable Camera Distance"/>
<menu_item_check label="Photo haute résolution" name="HighResSnapshot"/>
@@ -145,14 +136,12 @@
<menu_item_check label="Mettre la transparence en surbrillance" name="Highlight Transparent"/>
<menu_item_check label="Afficher les éléments HUD" name="Show HUD Attachments"/>
<menu_item_check label="Afficher le réticule de la vue subjective" name="ShowCrosshairs"/>
- <menu_item_check label="Afficher les info-bulles de terrain" name="Land Tips"/>
</menu>
<menu label="Types de rendu" name="Rendering Types">
<menu_item_check label="Simple" name="Simple"/>
<menu_item_check label="Alpha" name="Alpha"/>
<menu_item_check label="Arbre" name="Tree"/>
<menu_item_check label="Avatars" name="Character"/>
- <menu_item_check label="SurfacePath" name="SurfacePath"/>
<menu_item_check label="Ciel" name="Sky"/>
<menu_item_check label="Eau" name="Water"/>
<menu_item_check label="Sol" name="Ground"/>
@@ -173,10 +162,11 @@
<menu_item_check label="Objets flexibles" name="Flexible Objects"/>
</menu>
<menu_item_check label="Exécuter plusieurs threads" name="Run Multiple Threads"/>
+ <menu_item_check label="Utiliser le thread de lecture de plug-in" name="Use Plugin Read Thread"/>
<menu_item_call label="Effacer le cache du groupe" name="ClearGroupCache"/>
<menu_item_check label="Effet de lissage de la souris" name="Mouse Smoothing"/>
- <menu_item_check label="Afficher les IM dans le chat près de vous" name="IMInChat"/>
<menu label="Raccourcis" name="Shortcuts">
+ <menu_item_call label="Image ([COST] L$)..." name="Upload Image"/>
<menu_item_check label="Rechercher" name="Search"/>
<menu_item_call label="Relâcher les touches" name="Release Keys"/>
<menu_item_call label="Taille de l&apos;interface par défaut" name="Set UI Size to Default"/>
@@ -199,7 +189,6 @@
<menu_item_call label="Zoomer en avant" name="Zoom In"/>
<menu_item_call label="Zoom par défaut" name="Zoom Default"/>
<menu_item_call label="Zoomer en arrière" name="Zoom Out"/>
- <menu_item_call label="Activer/Quitter le plein écran" name="Toggle Fullscreen"/>
</menu>
<menu_item_call label="Afficher les paramètres de débogage" name="Debug Settings"/>
<menu_item_check label="Afficher le menu Développeurs" name="Debug Mode"/>
@@ -219,6 +208,7 @@
<menu_item_check label="Caméra" name="Camera"/>
<menu_item_check label="Vent" name="Wind"/>
<menu_item_check label="Angle de champ" name="FOV"/>
+ <menu_item_check label="Badge" name="Badge"/>
</menu>
<menu label="Afficher les infos" name="Display Info">
<menu_item_check label="Afficher l&apos;heure" name="Show Time"/>
@@ -276,7 +266,7 @@
<menu_item_check label="Atlas des textures" name="Texture Atlas"/>
<menu_item_check label="Rendu des lumières jointes" name="Render Attached Lights"/>
<menu_item_check label="Rendu des particules jointes" name="Render Attached Particles"/>
- <menu_item_check label="Hover Glow Objects" name="Hover Glow Objects"/>
+ <menu_item_check label="Objets en surbrillance avec le pointeur" name="Hover Glow Objects"/>
</menu>
<menu label="Réseau" name="Network">
<menu_item_check label="Pauser l&apos;avatar" name="AgentPause"/>
@@ -296,7 +286,7 @@
<menu_item_call label="Arrêter l&apos;enregistrement" name="Stop Record"/>
</menu>
<menu label="Monde" name="World">
- <menu_item_check label="Sim Sun Override" name="Sim Sun Override"/>
+ <menu_item_check label="Ignorer les paramètres du soleil de la sim" name="Sim Sun Override"/>
<menu_item_check label="Balise animée" name="Cheesy Beacon"/>
<menu_item_check label="Météo fixe" name="Fixed Weather"/>
<menu_item_call label="Dump Region Object Cache" name="Dump Region Object Cache"/>
@@ -369,14 +359,14 @@
<menu label="Admin" name="Admin">
<menu label="Object">
<menu_item_call label="Prendre une copie" name="Take Copy"/>
- <menu_item_call label="Forcer le propriétaire sur moi" name="Force Owner To Me"/>
+ <menu_item_call label="Téléporter le propriétaire" name="Force Owner To Me"/>
<menu_item_call label="Forcer la permission du propriétaire" name="Force Owner Permissive"/>
<menu_item_call label="Supprimer" name="Delete"/>
<menu_item_call label="Verrouiller" name="Lock"/>
<menu_item_call label="Obtenir les ID d&apos;actifs" name="Get Assets IDs"/>
</menu>
<menu label="Parcelle" name="Parcel">
- <menu_item_call label="Forcer le propriétaire sur moi" name="Owner To Me"/>
+ <menu_item_call label="Téléporter le propriétaire" name="Owner To Me"/>
<menu_item_call label="Définir sur le contenu Linden" name="Set to Linden Content"/>
<menu_item_call label="Réclamer un terrain public" name="Claim Public Land"/>
</menu>
@@ -396,8 +386,8 @@
<menu_item_call label="Chaussettes" name="Socks"/>
<menu_item_call label="Veste" name="Jacket"/>
<menu_item_call label="Gants" name="Gloves"/>
- <menu_item_call label="Sous-vêtements (homme)" name="Menu Undershirt"/>
- <menu_item_call label="Sous-vêtements (femme)" name="Menu Underpants"/>
+ <menu_item_call label="Débardeur" name="Menu Undershirt"/>
+ <menu_item_call label="Caleçon" name="Menu Underpants"/>
<menu_item_call label="Jupe" name="Skirt"/>
<menu_item_call label="Alpha" name="Alpha"/>
<menu_item_call label="Tatouage" name="Tattoo"/>
diff --git a/indra/newview/skins/default/xui/fr/mime_types_linux.xml b/indra/newview/skins/default/xui/fr/mime_types_linux.xml
index fc5e7ad659..3a7ff979ee 100644
--- a/indra/newview/skins/default/xui/fr/mime_types_linux.xml
+++ b/indra/newview/skins/default/xui/fr/mime_types_linux.xml
@@ -41,7 +41,7 @@
Cette parcelle propose du contenu audio
</tooltip>
<playtip name="audio_playtip">
- Jouer le contenu audio qui se trouve ici
+ Lire le contenu audio qui se trouve ici
</playtip>
</widgetset>
<scheme name="rtsp">
diff --git a/indra/newview/skins/default/xui/fr/mime_types_mac.xml b/indra/newview/skins/default/xui/fr/mime_types_mac.xml
index fc5e7ad659..3a7ff979ee 100644
--- a/indra/newview/skins/default/xui/fr/mime_types_mac.xml
+++ b/indra/newview/skins/default/xui/fr/mime_types_mac.xml
@@ -41,7 +41,7 @@
Cette parcelle propose du contenu audio
</tooltip>
<playtip name="audio_playtip">
- Jouer le contenu audio qui se trouve ici
+ Lire le contenu audio qui se trouve ici
</playtip>
</widgetset>
<scheme name="rtsp">
diff --git a/indra/newview/skins/default/xui/fr/notifications.xml b/indra/newview/skins/default/xui/fr/notifications.xml
index 6d7aef6389..bb1c4242ee 100644
--- a/indra/newview/skins/default/xui/fr/notifications.xml
+++ b/indra/newview/skins/default/xui/fr/notifications.xml
@@ -11,18 +11,29 @@
</global>
<template name="okbutton">
<form>
- <button name="OK" text="$yestext"/>
+ <button name="OK_okbutton" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okignore">
+ <form>
+ <button name="OK_okignore" text="$yestext"/>
</form>
</template>
- <template name="okignore"/>
<template name="okcancelbuttons">
<form>
- <button name="Cancel" text="$notext"/>
+ <button name="OK_okcancelbuttons" text="$yestext"/>
+ <button name="Cancel_okcancelbuttons" text="$notext"/>
+ </form>
+ </template>
+ <template name="okcancelignore">
+ <form>
+ <button name="OK_okcancelignore" text="$yestext"/>
+ <button name="Cancel_okcancelignore" text="$notext"/>
</form>
</template>
- <template name="okcancelignore"/>
<template name="okhelpbuttons">
<form>
+ <button name="OK_okhelpbuttons" text="$yestext"/>
<button name="Help" text="$helptext"/>
</form>
</template>
@@ -30,6 +41,7 @@
<form>
<button name="Yes" text="$yestext"/>
<button name="No" text="$notext"/>
+ <button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
</form>
</template>
<notification functor="GenericAcknowledge" label="Message de notification inconnu" name="MissingAlert">
@@ -93,6 +105,10 @@ Veuillez ne sélectionner qu&apos;un seul objet.
Enregistrer tous les changements dans les habits/parties du corps ?
<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Tout enregistrer"/>
</notification>
+ <notification name="FriendsAndGroupsOnly">
+ Les résidents qui ne sont pas vos amis ne sauront pas que vous avez choisi d&apos;ignorer leurs appels et leurs messages instantanés.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="GrantModifyRights">
Lorsque vous accordez des droits d&apos;édition à un autre résident, vous lui permettez de changer, supprimer ou prendre n&apos;importe lequel de vos objets dans le Monde. Réfléchissez bien avant d&apos;accorder ces droits.
Souhaitez-vous accorder des droits d&apos;édition à [FIRST_NAME] [LAST_NAME] ?
@@ -154,14 +170,16 @@ Ajouter ce pouvoir à « [ROLE_NAME] » ?
Voulez-vous vraiment continuer ?
<usetemplate ignoretext="Confirmez avant d&apos;abandonner les éléments joints." name="okcancelignore" notext="Non" yestext="Oui"/>
</notification>
- <notification name="ClickUnimplemented">
- Désolés, pas encore mis en œuvre.
- </notification>
<notification name="JoinGroupCanAfford">
Rejoindre ce groupe coûte [COST] L$.
Voulez-vous continuer ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="Rejoindre"/>
</notification>
+ <notification name="JoinGroupNoCost">
+ Vous vous apprêtez à rejoindre le groupe [NAME].
+Voulez-vous continuer ?
+ <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Rejoindre"/>
+ </notification>
<notification name="JoinGroupCannotAfford">
Rejoindre ce groupe coûte [COST] L$.
Vous n&apos;avez pas suffisamment de L$ pour rejoindre ce groupe.
@@ -265,7 +283,7 @@ Pour ne placer le média que sur une seule face, choisissez Sélectionner une fa
Veuillez saisir votre adresse e-mail.
</notification>
<notification name="PromptMissingSubjMsg">
- Envoyer la photo avec le sujet ou le message par défaut ?
+ Envoyer la photo avec l&apos;objet ou le message par défaut ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
<notification name="ErrorProcessingSnapshot">
@@ -298,7 +316,7 @@ La limite de [MAX_ATTACHMENTS] objets joints a été dépassée. Veuillez commen
Vous ne pouvez pas porter cet article car il n&apos;a pas encore été chargé. Veuillez réessayer dans une minute.
</notification>
<notification name="MustHaveAccountToLogIn">
- Oups! Vous avez oublié de fournir certaines informations.
+ Zut ! Vous avez oublié de fournir certaines informations.
Vous devez saisir le nom et le prénom de votre avatar.
Pour entrer dans [SECOND_LIFE], vous devez avoir un compte. Voulez-vous en créer un maintenant ?
@@ -307,6 +325,9 @@ Pour entrer dans [SECOND_LIFE], vous devez avoir un compte. Voulez-vous en crée
</url>
<usetemplate name="okcancelbuttons" notext="Réessayer" yestext="Créer un compte"/>
</notification>
+ <notification name="InvalidCredentialFormat">
+ Saisissez à la fois le prénom et le nom de votre avatar dans le champ Nom d&apos;utilisateur, puis connectez-vous.
+ </notification>
<notification name="AddClassified">
Les petites annonces sont publiées à l&apos;onglet Petites annonces de la section Recherche et sur [http://secondlife.com/community/classifieds secondlife.com] pendant une semaine.
Rédigez votre annonce, puis cliquez sur Publier pour l&apos;ajouter à la liste des annonces.
@@ -328,8 +349,12 @@ Voulez-vous vraiment continuer ?
Enregistrer les changements dans l&apos;annonce [NAME] ?
<usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Ne pas enregistrer" yestext="Enregistrer"/>
</notification>
+ <notification name="ClassifiedInsufficientFunds">
+ Fonds insuffisants pour créer la petite annonce.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="DeleteAvatarPick">
- Supprimer le favori [PICK] ?
+ Supprimer la sélection &lt;nolink&gt;[PICK]&lt;/nolink&gt; ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
<notification name="PromptGoToEventsPage">
@@ -423,18 +448,17 @@ L&apos;objet est peut-être inaccessible ou a peut-être été supprimé.
Impossible d&apos;écrire le fichier [[FILE]]
</notification>
<notification name="UnsupportedHardware">
- Avertissement : vous n&apos;avez pas la configuration système requise pour utiliser [APP_NAME]. Si vous continuez à utiliser [APP_NAME], votre performance risque d&apos;être moindre. Malheureusement, la page [SUPPORT_SITE] n&apos;offre aucune assistance pour les problèmes de configuration système.
+ Votre ordinateur ne satisfait pas la configuration système requise pour [APP_NAME]. Les performances risquent d&apos;être médiocres. Malheureusement, la section [SUPPORT_SITE] n&apos;offre aucune aide pour les problèmes de configuration système.
-MINSPECS
-Voulez-vous visiter [_URL] pour plus d&apos;informations ?
+Consulter [_URL] pour en savoir plus ?
<url name="url" option="0">
http://secondlife.com/support/sysreqs.php?lang=fr
</url>
<usetemplate ignoretext="Mon matériel n&apos;est pas pris en charge" name="okcancelignore" notext="Non" yestext="Oui"/>
</notification>
<notification name="UnknownGPU">
- Votre système contient une carte graphique que [APP_NAME] ne reconnaît pas actuellement.
-Cela est souvent le cas avec le nouveau matériel qui n&apos;a pas encore été testé avec [APP_NAME]. Vous pourrez probablement utiliser [APP_NAME] sans problème, mais vous devrez peut-être ajuster les paramètres de vos graphiques.
+ Votre système contient une carte graphique que [APP_NAME] ne reconnaît pas.
+Cela est souvent le cas avec le nouveau matériel qui n&apos;a pas encore été testé avec [APP_NAME]. Cela ne posera probablement pas de problème, mais vous devrez peut-être ajuster vos paramètres graphiques.
(Moi &gt; Préférences &gt; Graphiques).
<form name="form">
<ignore name="ignore" text="Ma carte graphique ne peut être identifiée"/>
@@ -474,14 +498,14 @@ Souhaitez-vous vraiment donner ces objets ?
Vous n&apos;êtes pas autorisé à transférer le dossier sélectionné.
</notification>
<notification name="FreezeAvatar">
- Geler cet avatar ?
+ Figer cet avatar ?
Il ou elle ne pourra temporairement plus bouger, chatter, ou interagir dans le Monde.
- <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Dégeler" yestext="Geler"/>
+ <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Libérer" yestext="Figer"/>
</notification>
<notification name="FreezeAvatarFullname">
- Geler [AVATAR_NAME] ?
+ Figer [AVATAR_NAME] ?
Il ou elle ne pourra temporairement plus bouger, chatter, ou interagir dans le Monde.
- <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Dégeler" yestext="Geler"/>
+ <usetemplate canceltext="Annuler" name="yesnocancelbuttons" notext="Libérer" yestext="Figerf"/>
</notification>
<notification name="EjectAvatarFullname">
Expulser [AVATAR_NAME] de votre terrain ?
@@ -587,6 +611,11 @@ Assurez-vous que le fichier a l&apos;extension correcte.
<notification name="CannotEncodeFile">
Impossible d&apos;encoder le fichier : [FILE]
</notification>
+ <notification name="CorruptedProtectedDataStore">
+ Impossible de lire vos données protégées ; elles sont en cours de réinitialisation.
+ Cette situation peut se produire lorsque vous changez la configuration du réseau.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CorruptResourceFile">
Fichier ressource corrompu : [FILE]
</notification>
@@ -657,7 +686,7 @@ Recherche effectuée : [FINALQUERY]
Vos termes de recherche étaient trop courts et aucune recherche n&apos;a été effectuée.
</notification>
<notification name="CouldNotTeleportReason">
- Impossible de téléporter.
+ Échec de la téléportation.
[REASON]
</notification>
<notification name="invalid_tport">
@@ -757,14 +786,6 @@ plusieurs parcelles sélectionnées.
Essayez de ne sélectionner qu&apos;une seule parcelle.
</notification>
- <notification name="ParcelCanPlayMedia">
- Cet emplacement propose des flux de média.
-Pour jouer des flux de média, il faut avoir une connexion Internet rapide.
-
-Jouer les flux de média lorsqu&apos;ils sont disponibles ?
-(Vous pourrez modifier cette option ultérieurement sous Préférences &gt; Confidentialité.)
- <usetemplate name="okcancelbuttons" notext="Désactiver" yestext="Jouer le média"/>
- </notification>
<notification name="CannotDeedLandWaitingForServer">
Cession du terrain impossible :
rapport de propriété sur le point d&apos;être envoyé par le serveur.
@@ -886,9 +907,8 @@ Fusionner le terrain ?
Cette erreur est généralement temporaire. Veuillez éditer et sauvegarder l&apos;élément endossable à nouveau d&apos;ici quelques minutes.
</notification>
<notification name="YouHaveBeenLoggedOut">
- Vous avez été déconnecté(e) de [SECOND_LIFE] :
+ Zut. Vous avez été déconnecté(e) de [SECOND_LIFE]
[MESSAGE]
-Vous pouvez afficher vos messages instantanés et votre chat en cliquant sur Afficher IM et chat. Sinon, cliquez sur Quitter pour quitter immédiatement [APP_NAME].
<usetemplate name="okcancelbuttons" notext="Quitter" yestext="Afficher IM et chat"/>
</notification>
<notification name="OnlyOfficerCanBuyLand">
@@ -913,6 +933,16 @@ Proposer à [NAME] de devenir votre ami(e) ?
<button name="Cancel" text="Annuler"/>
</form>
</notification>
+ <notification label="Enregistrer la tenue" name="SaveOutfitAs">
+ Enregistrer ce que je porte comme nouvelle tenue :
+ <form name="form">
+ <input name="message">
+ [DESC] (nouv.)
+ </input>
+ <button name="Offer" text="OK"/>
+ <button name="Cancel" text="Annuler"/>
+ </form>
+ </notification>
<notification name="RemoveFromFriends">
Voulez-vous supprimer [FIRST_NAME] [LAST_NAME] de votre liste d&apos;amis ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
@@ -941,6 +971,12 @@ Proposer à [NAME] de devenir votre ami(e) ?
Veuillez saisir un montant plus élevé.
</notification>
+ <notification name="ConfirmItemDeleteHasLinks">
+ Des articles liés pointent vers au moins un article sélectionné. Les liens arrêteront définitivement de fonctionner si vous supprimez cet article. Il est vivement conseillé de supprimer d&apos;abord ces liens.
+
+Voulez-vous vraiment supprimer ces articles ?
+ <usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
+ </notification>
<notification name="ConfirmObjectDeleteLock">
Au moins un des objets que vous avez sélectionnés est verrouillé.
@@ -1038,6 +1074,7 @@ Céder ces [AREA] m² de terrain au groupe [GROUP_NAME] ?
</notification>
<notification name="ErrorMessage">
[ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AvatarMovedDesired">
La destination que vous avez choisie n&apos;est pas disponible actuellement.
@@ -1088,6 +1125,42 @@ Choisissez un avatar homme ou femme.
Vous pourrez revenir sur votre décision plus tard.
<usetemplate name="okcancelbuttons" notext="Femme" yestext="Homme"/>
</notification>
+ <notification name="CantTeleportToGrid">
+ Téléportation vers [SLURL] impossible car cet endroit existe sur une grille ([GRID]) différente de la grille actuelle ([CURRENT_GRID]). Veuillez fermer votre client et réessayer.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="GeneralCertificateError">
+ Connexion au serveur impossible.
+[REASON]
+
+Nom du sujet : [SUBJECT_NAME_STRING]
+Émetteur : [ISSUER_NAME_STRING]
+Début de validité : [VALID_FROM]
+Fin de validité : [VALID_TO]
+Empreinte MD5 : [SHA1_DIGEST]
+Empreinte SHA1 : [MD5_DIGEST]
+Utilisation de la clé : [KEYUSAGE]
+Utilisation étendue de la clé : [EXTENDEDKEYUSAGE]
+Identifiant de la clé du sujet : [SUBJECTKEYIDENTIFIER]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TrustCertificateError">
+ Autorité de certification de ce serveur inconnue.
+
+Informations sur le certificat :
+Nom du sujet : [SUBJECT_NAME_STRING]
+Émetteur : [ISSUER_NAME_STRING]
+Début de validité : [VALID_FROM]
+Fin de validité : [VALID_TO]
+Empreinte MD5 : [SHA1_DIGEST]
+Empreinte SHA1 : [MD5_DIGEST]
+Utilisation de la clé : [KEYUSAGE]
+Utilisation étendue de la clé : [EXTENDEDKEYUSAGE]
+Identifiant de la clé du sujet : [SUBJECTKEYIDENTIFIER]
+
+Approuver cette autorité ?
+ <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Approuver"/>
+ </notification>
<notification name="NotEnoughCurrency">
[NAME] [PRICE] L$ Vous n&apos;avez pas suffisamment de L$ pour faire cela.
</notification>
@@ -1282,8 +1355,8 @@ Quitter le groupe ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
</notification>
<notification name="ConfirmKick">
- Souhaitez-vous vraiment éjecter tous les utilisateurs de la grille ?
- <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Éjecter tous"/>
+ Souhaitez-vous vraiment éjecter tous les résidents de la grille ?
+ <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Éjecter tous les résidents"/>
</notification>
<notification name="MuteLinden">
Désolé, vous ne pouvez pas ignorer un Linden.
@@ -1316,7 +1389,6 @@ Les chats et les messages instantanés ne s&apos;afficheront pas. Les messages i
<notification name="JoinedTooManyGroupsMember">
Vous avez atteint le nombre de groupes maximum. Avant de pouvoir rejoindre ce groupe, vous devez en quitter un ou refuser cette offre.
[NAME] vous invite à rejoindre un groupe.
-[INVITE]
<usetemplate name="okcancelbuttons" notext="Refuser" yestext="Rejoindre"/>
</notification>
<notification name="JoinedTooManyGroups">
@@ -1324,7 +1396,7 @@ Les chats et les messages instantanés ne s&apos;afficheront pas. Les messages i
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="KickUser">
- Éjecter cet utilisateur avec quel message ?
+ Éjecter ce résident avec quel message ?
<form name="form">
<input name="message">
Un administrateur vous a déconnecté.
@@ -1344,20 +1416,20 @@ Les chats et les messages instantanés ne s&apos;afficheront pas. Les messages i
</form>
</notification>
<notification name="FreezeUser">
- Geler cet utilisateur avec quel message ?
+ Figer ce résident avec quel message ?
<form name="form">
<input name="message">
- Vous avez été gelé. Vous ne pouvez ni bouger ni chatter. Un administrateur va vous envoyer un message instantané (IM).
+ Vous avez été figé. Vous ne pouvez ni bouger ni chatter. Un administrateur va vous envoyer un message instantané (IM).
</input>
<button name="OK" text="OK"/>
<button name="Cancel" text="Annuler"/>
</form>
</notification>
<notification name="UnFreezeUser">
- Dégeler cet utilisateur avec quel message ?
+ Libérer ce résident avec quel message ?
<form name="form">
<input name="message">
- Vous n&apos;êtes plus gelé.
+ Vous n&apos;êtes plus figé.
</input>
<button name="OK" text="OK"/>
<button name="Cancel" text="Annuler"/>
@@ -1374,7 +1446,7 @@ Les chats et les messages instantanés ne s&apos;afficheront pas. Les messages i
</form>
</notification>
<notification name="OfferTeleportFromGod">
- Demander au résident de venir vous rejoindre ?
+ Exiger du résident qu&apos;il vienne vous rejoindre ?
<form name="form">
<input name="message">
On se rejoint à [REGION] ?
@@ -1384,7 +1456,7 @@ Les chats et les messages instantanés ne s&apos;afficheront pas. Les messages i
</form>
</notification>
<notification name="TeleportFromLandmark">
- Êtes-vous certain de vouloir être téléporté ?
+ Souhaitez-vous vraiment vous téléporter vers &lt;nolink&gt;[LOCATION]&lt;/nolink&gt; ?
<usetemplate ignoretext="Confirmer que je veux me téléporter à un repère" name="okcancelignore" notext="Annuler" yestext="Téléporter"/>
</notification>
<notification name="TeleportToPick">
@@ -1395,6 +1467,10 @@ Les chats et les messages instantanés ne s&apos;afficheront pas. Les messages i
Vous téléporter vers [CLASSIFIED] ?
<usetemplate ignoretext="Confirmer que je veux me téléporter à un endroit dans les Petites annonces" name="okcancelignore" notext="Annuler" yestext="Téléporter"/>
</notification>
+ <notification name="TeleportToHistoryEntry">
+ Vous téléporter vers [HISTORY_ENTRY] ?
+ <usetemplate ignoretext="Confirmer que je veux me téléporter à un endroit de l&apos;historique" name="okcancelignore" notext="Annuler" yestext="Téléporter"/>
+ </notification>
<notification label="Envoyer un message à tout le monde dans votre domaine" name="MessageEstate">
Saisissez un message court qui sera envoyé à tous les résidents se trouvant actuellement sur votre domaine.
<form name="form">
@@ -1406,7 +1482,7 @@ Les chats et les messages instantanés ne s&apos;afficheront pas. Les messages i
<notification label="Modifier un domaine Linden" name="ChangeLindenEstate">
Vous vous apprêtez à modifier un domaine appartenant aux Lindens (continent, zone réservée aux ados, orientation etc.).
-Cela est extrêmement délicat car l&apos;expérience des résidents est en jeu. Sur le continent, cela modifiera des milliers de régions et sera difficile à digérer pour le serveur.
+Cela est extrêmement délicat car l&apos;expérience des résidents est en jeu. Sur le continent, cette action modifiera des milliers de régions et sera difficile à digérer pour le serveur.
Continuer ?
<usetemplate name="okcancelbuttons" notext="Annuler" yestext="OK"/>
@@ -1477,15 +1553,18 @@ Souhaitez-vous en savoir plus sur les différentes catégories d&apos;accès ?
Votre catégorie d&apos;accès ne vous permet pas de pénétrer dans cette région.
</notification>
<notification name="RegionEntryAccessBlocked_Change">
- Votre catégorie d&apos;accès ne vous permet pas de pénétrer dans cette région.
+ La catégorie de contenu définie dans vos préférences ne vous permet pas de pénétrer dans cette région.
-En cliquant sur Modifier les préférences, vous pourrez changer votre catégorie d&apos;accès et pénétrer dans la région. À partir de maintenant, vous pouvez rechercher et accéder au contenu [REGIONMATURITY]. Vous pouvez modifier ce paramètre à partir du menu Moi &gt; Préférences &gt; Général.
+Pour cela, cliquez sur Modifier les préférences afin de spécifier une catégorie plus élevée. Vous pourrez alors rechercher du contenu [REGIONMATURITY] et y accéder. Pour modifier ce paramètre ultérieurement, accédez à Moi &gt; Préférences &gt; Général, le moment voulu.
<form name="form">
<button name="OK" text="Modifier les préférences"/>
<button default="true" name="Cancel" text="Fermer"/>
<ignore name="ignore" text="La catégorie de contenu que j&apos;ai choisie m&apos;empêche de pénétrer dans une région"/>
</form>
</notification>
+ <notification name="PreferredMaturityChanged">
+ Votre préférence de catégorie de contenu est désormais [RATING].
+ </notification>
<notification name="LandClaimAccessBlocked">
Votre catégorie d&apos;accès ne vous permet pas de réclamer cette région. Cela vient peut-être du fait qu&apos;il manquait des informations pour valider votre âge.
@@ -1553,7 +1632,7 @@ En cliquant sur Modifier les préférences, vous pourrez changer votre catégori
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="NotAllowedToViewNotecard">
- Permissions pour afficher la note insuffisantes.
+ Droits pour afficher la note insuffisants.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="MissingNotecardAssetID">
@@ -1708,9 +1787,9 @@ Déplacer les objets de l&apos;inventaire ?
<usetemplate ignoretext="Confirmer avant de quitter" name="okcancelignore" notext="Ne pas quitter" yestext="Quitter"/>
</notification>
<notification name="HelpReportAbuseEmailLL">
- Utilisez cet outil pour signaler des infractions aux [http://secondlife.com/corporate/tos.php Conditions d&apos;utilisation] et aux [http://secondlife.com/corporate/cs.php Règles communautaires].
+ Utilisez cet outil pour signaler des infractions aux [http://secondlife.com/corporate/tos.php Conditions d’utilisation] et aux [http://secondlife.com/corporate/cs.php Règles communautaires].
-Lorsqu&apos;elles sont signalées, toutes les infractions font l&apos;objet d&apos;une enquête et sont résolues. Vous pouvez consulter les détails de la résolution d&apos;un incident dans le [http://secondlife.com/support/incidentreport.php Rapport d&apos;incident].
+Lorsqu&apos;elles sont signalées, toutes les infractions font l&apos;objet d&apos;une enquête et sont résolues.
</notification>
<notification name="HelpReportAbuseSelectCategory">
Veuillez choisir une catégorie pour ce rapport d&apos;infraction.
@@ -1752,7 +1831,7 @@ Linden Lab
Les composantes requises suivantes ne se trouvent pas dans [FLOATER]:
[COMPONENTS]
</notification>
- <notification label="Remplacer la pièce-jointe existante" name="ReplaceAttachment">
+ <notification label="Remplacer la pièce jointe existante" name="ReplaceAttachment">
Vous avez déjà un objet sur cette partie du corps.
Voulez-vous le remplacer par l&apos;objet sélectionné ?
<form name="form">
@@ -1901,6 +1980,9 @@ Liez-la à partir d&apos;une page web pour permettre aux autres résidents d&apo
<notification name="SystemMessageTip">
[MESSAGE]
</notification>
+ <notification name="IMSystemMessageTip">
+ [MESSAGE]
+ </notification>
<notification name="Cancelled">
Annulé
</notification>
@@ -1929,6 +2011,11 @@ Liez-la à partir d&apos;une page web pour permettre aux autres résidents d&apo
Importation de photos SL et Web en cours...
(prend environ 5 minutes.)
</notification>
+ <notification name="UploadConfirmation">
+ Le chargement coûte [AMOUNT] L$.
+Continuer ?
+ <usetemplate name="okcancelbuttons" notext="Annuler" yestext="Charger"/>
+ </notification>
<notification name="UploadPayment">
Le chargement a coûté [AMOUNT] L$.
</notification>
@@ -1964,7 +2051,7 @@ Cela risque d&apos;impacter votre mot de passe.
Vous n&apos;avez pas le droit de consulter cette note.
</notification>
<notification name="RezItemNoPermissions">
- Permissions insuffisantes pour rezzer l&apos;objet.
+ Droits insuffisants pour rezzer l&apos;objet.
</notification>
<notification name="UnableToLoadNotecard">
Impossible de lire les données de la note actuellement.
@@ -1973,7 +2060,7 @@ Cela risque d&apos;impacter votre mot de passe.
Script absent de la base de données.
</notification>
<notification name="ScriptNoPermissions">
- Permissions insuffisantes pour voir le script.
+ Droits insuffisants pour voir le script.
</notification>
<notification name="UnableToLoadScript">
Impossible de charger le script. Merci de réessayer.
@@ -2121,8 +2208,8 @@ Les objets non transférables donnés au groupe ont étés supprimés.
Les objets sélectionnés sur la parcelle et qui ne sont pas à vous ont été rendus à leurs propriétaires.
</notification>
<notification name="ServerObjectMessage">
- Message de [NAME] :
-[MSG]
+ Message de [NAME] :
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
</notification>
<notification name="NotSafe">
Les dégâts sont autorisés sur ce terrain.
@@ -2242,15 +2329,6 @@ Veuillez réessayer dans quelques minutes.
<button name="Mute" text="Ignorer"/>
</form>
</notification>
- <notification name="ObjectGiveItemUnknownUser">
- Un objet appelé [OBJECTFROMNAME] appartenant à (un résident inconnu) vous a donné un [OBJECTTYPE] :
-[ITEM_SLURL]
- <form name="form">
- <button name="Keep" text="Garder"/>
- <button name="Discard" text="Jeter"/>
- <button name="Mute" text="Ignorer"/>
- </form>
- </notification>
<notification name="UserGiveItem">
[NAME_SLURL] vous a donné un [OBJECTTYPE] :
[ITEM_SLURL]
@@ -2274,9 +2352,9 @@ Veuillez réessayer dans quelques minutes.
</form>
</notification>
<notification name="TeleportOffered">
- [NAME] vous propose d&apos;être téléporté jusqu&apos;à son emplacement :
+ [NAME_SLURL] propose de vous téléporter à son emplacement :
-[MESSAGE]
+[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
<form name="form">
<button name="Teleport" text="Téléporter"/>
<button name="Cancel" text="Annuler"/>
@@ -2294,15 +2372,14 @@ Veuillez réessayer dans quelques minutes.
</form>
</notification>
<notification name="OfferFriendship">
- [NAME] vous demande de devenir son ami(e).
+ [NAME_SLURL] vous demande de devenir son ami(e).
[MESSAGE]
-(Par défaut, vous pourrez voir lorsque vous êtes tous deux connectés.)
+(Par défaut, chacun pourra voir si l&apos;autre est connecté.)
<form name="form">
<button name="Accept" text="Accepter"/>
<button name="Decline" text="Refuser"/>
- <button name="Send IM" text="Envoyer IM"/>
</form>
</notification>
<notification name="FriendshipOffered">
@@ -2323,6 +2400,12 @@ Veuillez réessayer dans quelques minutes.
<notification name="FriendshipDeclined">
[NAME] a refusé votre amitié.
</notification>
+ <notification name="FriendshipAcceptedByMe">
+ Amitié acceptée.
+ </notification>
+ <notification name="FriendshipDeclinedByMe">
+ Amitié refusée.
+ </notification>
<notification name="OfferCallingCard">
[FIRST] [LAST] vous offre sa carte de visite.
Cela ajoute un marque-page dans votre inventaire, ce qui vous permet d&apos;envoyer rapidement un IM à ce résident.
@@ -2356,6 +2439,9 @@ Venant de l&apos;objet : [OBJECTNAME], appartenant à : [NAME]?
<notification name="FailedToFindWearable">
La recherche du [TYPE] nommé(e) [DESC] dans la base de données a échoué.
</notification>
+ <notification name="ShareToWebFailed">
+ Échec de chargement de l&apos;image sur le Web.
+ </notification>
<notification name="InvalidWearable">
L&apos;objet que vous essayez de porter utilise une fonctionnalité que le client ne peut lire. Pour porter cet objet, veuillez télécharger une mise à jour de [APP_NAME].
</notification>
@@ -2397,14 +2483,6 @@ Accepter cette requête ?
<button name="Ignore" text="Ignorer"/>
</form>
</notification>
- <notification name="ScriptToast">
- [FIRST] [LAST]&apos;s &apos;[TITLE]&apos; demande la participation de l&apos;utilisateur.
- <form name="form">
- <button name="Open" text="Ouvrir la boîte de dialogue"/>
- <button name="Ignore" text="Ignorer"/>
- <button name="Block" text="Ignorer"/>
- </form>
- </notification>
<notification name="BuyLindenDollarSuccess">
Nous vous remercions de votre paiement.
@@ -2531,7 +2609,7 @@ Elles vont être bloquées pendant quelques secondes pour votre sécurité.
</notification>
<notification name="ConfirmCloseAll">
Êtes-vous certain de vouloir fermer tous les IM ?
- <usetemplate name="okcancelignore" notext="Annuler" yestext="OK"/>
+ <usetemplate ignoretext="Confirmer avant de fermer tous les IM." name="okcancelignore" notext="Annuler" yestext="OK"/>
</notification>
<notification name="AttachmentSaved">
L&apos;élément joint a été sauvegardé.
@@ -2560,6 +2638,56 @@ Elles vont être bloquées pendant quelques secondes pour votre sécurité.
Le bouton sélectionné ne peut pas être affiché actuellement.
Le bouton sera affiché quand il y aura suffisamment de place.
</notification>
+ <notification name="ShareNotification">
+ Faire glisser des articles de l&apos;inventaire sur une personne dans le sélecteur de résident
+ </notification>
+ <notification name="DeedToGroupFail">
+ Échec de cession au groupe.
+ </notification>
+ <notification name="AvatarRezNotification">
+ ([EXISTENCE] secondes d&apos;existence)
+Nuage de l&apos;avatar [NAME] disparu en [TIME] secondes.
+ </notification>
+ <notification name="AvatarRezSelfNotification">
+ ([EXISTENCE] secondes d&apos;existence)
+Vous avez terminé de figer votre tenue en [TIME] secondes.
+ </notification>
+ <notification name="AvatarRezCloudNotification">
+ ([EXISTENCE] secondes d&apos;existence)
+Transformation de l&apos;avatar [NAME] en nuage.
+ </notification>
+ <notification name="AvatarRezArrivedNotification">
+ ([EXISTENCE] secondes d&apos;existence)
+L&apos;avatar [NAME] est apparu.
+ </notification>
+ <notification name="AvatarRezLeftCloudNotification">
+ ([EXISTENCE] secondes d&apos;existence)
+Départ de l&apos;avatar [NAME] après [TIME] secondes sous forme de nuage.
+ </notification>
+ <notification name="AvatarRezEnteredAppearanceNotification">
+ ([EXISTENCE] secondes d&apos;existence)
+L&apos;avatar [NAME] est entré en mode Apparence.
+ </notification>
+ <notification name="AvatarRezLeftAppearanceNotification">
+ ([EXISTENCE] secondes d&apos;existence)
+L&apos;avatar [NAME] a quitté le mode Apparence.
+ </notification>
+ <notification name="AvatarRezLeftNotification">
+ ([EXISTENCE] secondes d&apos;existence)
+Départ de l&apos;avatar [NAME] entièrement chargé.
+ </notification>
+ <notification name="ConfirmLeaveCall">
+ Voulez-vous vraiment quitter cet appel ?
+ <usetemplate ignoretext="Confirmer avant de quitter l&apos;appel" name="okcancelignore" notext="Non" yestext="Oui"/>
+ </notification>
+ <notification name="ConfirmMuteAll">
+ Vous avez choisi d&apos;ignorer l&apos;ensemble des participants de l&apos;appel du groupe.
+Les résidents rejoignant l&apos;appel ultérieurement seront également
+ignorés, même si vous quittez l&apos;appel.
+
+Ignorer les autres ?
+ <usetemplate ignoretext="Confirmer avant d&apos;ignorer les autres lors d&apos;un appel de groupe" name="okcancelignore" notext="Ok" yestext="Annuler"/>
+ </notification>
<global name="UnsupportedCPU">
- Votre processeur ne remplit pas les conditions minimum requises.
</global>
diff --git a/indra/newview/skins/default/xui/fr/outfit_accordion_tab.xml b/indra/newview/skins/default/xui/fr/outfit_accordion_tab.xml
new file mode 100644
index 0000000000..bac885e5d8
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/outfit_accordion_tab.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: mantipov: this xml is intended to be used inside panel_outfits_list.xml for each outfit folder-->
+<!-- All accordion tabs in the My Appearance/My Outfits panel will be created from this one at runtume-->
+<accordion_tab name="Mockup Tab" title="Mockup Tab"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_audio_device.xml b/indra/newview/skins/default/xui/fr/panel_audio_device.xml
index a9540d8346..2caa013f54 100644
--- a/indra/newview/skins/default/xui/fr/panel_audio_device.xml
+++ b/indra/newview/skins/default/xui/fr/panel_audio_device.xml
@@ -6,7 +6,7 @@
<text name="Input device (microphone):">
Périphérique d&apos;entrée (micro) :
</text>
- <text name="Output device (speakers):">
+ <text name="Output device (speakers):" width="300">
Périphérique de sortie (haut-parleurs) :
</text>
<text name="Input level:">
diff --git a/indra/newview/skins/default/xui/fr/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/fr/panel_body_parts_list_item.xml
new file mode 100644
index 0000000000..de764d8025
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_body_parts_list_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="wearable_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_bodyparts_list_button_bar.xml b/indra/newview/skins/default/xui/fr/panel_bodyparts_list_button_bar.xml
new file mode 100644
index 0000000000..5e7442b877
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_bodyparts_list_button_bar.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="clothing_list_button_bar_panel">
+ <button label="Changer" name="switch_btn"/>
+ <button label="Acheter &gt;" name="bodyparts_shop_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_bottomtray.xml b/indra/newview/skins/default/xui/fr/panel_bottomtray.xml
index b3fac96250..328b97ee72 100644
--- a/indra/newview/skins/default/xui/fr/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/fr/panel_bottomtray.xml
@@ -1,12 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="bottom_tray">
- <string name="SpeakBtnToolTip">
- Active/Désactive le micro
- </string>
- <string name="VoiceControlBtnToolTip">
- Affiche/Masque le panneau de contrôle vocal
- </string>
+ <string name="SpeakBtnToolTip" value="Active/Désactive le micro"/>
+ <string name="VoiceControlBtnToolTip" value="Affiche/Masque le panneau de contrôle de la voix"/>
<layout_stack name="toolbar_stack">
+ <layout_panel name="speak_panel">
+ <talk_button name="talk">
+ <speak_button label="Parler" label_selected="Parler" name="speak_btn"/>
+ </talk_button>
+ </layout_panel>
<layout_panel name="gesture_panel">
<gesture_combo_list label="Geste" name="Gesture" tool_tip="Affiche/Masque les gestes"/>
</layout_panel>
@@ -19,6 +20,21 @@
<layout_panel name="snapshot_panel">
<button label="" name="snapshots" tool_tip="Prendre une photo"/>
</layout_panel>
+ <layout_panel name="sidebar_btn_panel">
+ <button label="Panneau latéral" name="sidebar_btn" tool_tip="Affiche/Masque le panneau latéral"/>
+ </layout_panel>
+ <layout_panel name="build_btn_panel">
+ <button label="Construire" name="build_btn" tool_tip="Affiche/Masque les outils pour la construction"/>
+ </layout_panel>
+ <layout_panel name="search_btn_panel">
+ <button label="Rechercher" name="search_btn" tool_tip="Affiche/Masque la recherche"/>
+ </layout_panel>
+ <layout_panel name="world_map_btn_panel">
+ <button label="Carte" name="world_map_btn" tool_tip="Affiche/Masque la carte du monde"/>
+ </layout_panel>
+ <layout_panel name="mini_map_btn_panel">
+ <button label="Mini-carte" name="mini_map_btn" tool_tip="Affiche/Masque la mini-carte"/>
+ </layout_panel>
<layout_panel name="im_well_panel">
<chiclet_im_well name="im_well">
<button name="Unread IM messages" tool_tip="Conversations"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/fr/panel_bottomtray_lite.xml
new file mode 100644
index 0000000000..5b6d37ce00
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_bottomtray_lite.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray_lite">
+ <layout_stack name="toolbar_stack_lite">
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="Geste" name="Gesture" tool_tip="Affiche/Masque les gestes"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_classified_info.xml b/indra/newview/skins/default/xui/fr/panel_classified_info.xml
index d317e35d2f..e4aecfdfc0 100644
--- a/indra/newview/skins/default/xui/fr/panel_classified_info.xml
+++ b/indra/newview/skins/default/xui/fr/panel_classified_info.xml
@@ -6,18 +6,49 @@
<panel.string name="type_pg">
Contenu Général
</panel.string>
+ <panel.string name="l$_price">
+ [PRICE] L$
+ </panel.string>
+ <panel.string name="click_through_text_fmt">
+ [TELEPORT] téléporter, [MAP] carte, [PROFILE] profil
+ </panel.string>
+ <panel.string name="date_fmt">
+ [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt]
+ </panel.string>
+ <panel.string name="auto_renew_on">
+ Activé
+ </panel.string>
+ <panel.string name="auto_renew_off">
+ Désactivé
+ </panel.string>
<text name="title" value="Infos sur la petite annonce"/>
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
- <text name="classified_name" value="[name]"/>
- <text name="classified_location" value="[loading...]"/>
- <text name="content_type" value="[content type]"/>
- <text name="category" value="[category]"/>
- <check_box label="Renouvellement automatique toutes les semaines" name="auto_renew"/>
- <text name="price_for_listing" tool_tip="Coût de l&apos;annonce.">
- [PRICE] L$
- </text>
- <text name="classified_desc" value="[description]"/>
+ <text_editor name="classified_name" value="[name]"/>
+ <text name="classified_location_label" value="Emplacement :"/>
+ <text_editor name="classified_location" value="[loading...]"/>
+ <text name="content_type_label" value="Type de contenu :"/>
+ <text_editor name="content_type" value="[content type]"/>
+ <text name="category_label" value="Catégorie :"/>
+ <text_editor name="category" value="[category]"/>
+ <text name="creation_date_label" value="Date de création :"/>
+ <text_editor name="creation_date" tool_tip="Date de création" value="[date]"/>
+ <text name="price_for_listing_label" value="Coût de l&apos;annonce :"/>
+ <text_editor name="price_for_listing" tool_tip="Coût de l&apos;annonce." value="[price]"/>
+ <layout_stack name="descr_stack">
+ <layout_panel name="clickthrough_layout_panel">
+ <text name="click_through_label" value="Clics :"/>
+ <text_editor name="click_through_text" tool_tip="Parcourir les données en cliquant" value="[clicks]"/>
+ </layout_panel>
+ <layout_panel name="price_layout_panel">
+ <text name="auto_renew_label" value="Renouv. auto :"/>
+ <text name="auto_renew" value="Activé"/>
+ </layout_panel>
+ <layout_panel name="descr_layout_panel">
+ <text name="classified_desc_label" value="Description :"/>
+ <text_editor name="classified_desc" value="[description]"/>
+ </layout_panel>
+ </layout_stack>
</panel>
</scroll_container>
<panel name="buttons">
diff --git a/indra/newview/skins/default/xui/fr/panel_clothing_list_button_bar.xml b/indra/newview/skins/default/xui/fr/panel_clothing_list_button_bar.xml
new file mode 100644
index 0000000000..0b58a4e40b
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_clothing_list_button_bar.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="clothing_list_button_bar_panel">
+ <button label="Ajout +" name="add_btn"/>
+ <button label="Acheter &gt;" name="clothing_shop_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_clothing_list_item.xml b/indra/newview/skins/default/xui/fr/panel_clothing_list_item.xml
new file mode 100644
index 0000000000..de764d8025
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_clothing_list_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="wearable_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_cof_wearables.xml b/indra/newview/skins/default/xui/fr/panel_cof_wearables.xml
new file mode 100644
index 0000000000..c1085aa461
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_cof_wearables.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="cof_wearables">
+ <accordion name="cof_wearables_accordion">
+ <accordion_tab name="tab_attachments" title="Éléments attachés"/>
+ <accordion_tab name="tab_clothing" title="Habits"/>
+ <accordion_tab name="tab_body_parts" title="Parties du corps"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/fr/panel_deletable_wearable_list_item.xml
new file mode 100644
index 0000000000..91d90a5660
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_deletable_wearable_list_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="deletable_wearable_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/fr/panel_dummy_clothing_list_item.xml
new file mode 100644
index 0000000000..6af84de0c7
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_dummy_clothing_list_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="dummy_clothing_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_alpha.xml b/indra/newview/skins/default/xui/fr/panel_edit_alpha.xml
index 836dd99097..3b81ef2a5f 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_alpha.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_alpha.xml
@@ -5,6 +5,6 @@
<texture_picker label="Alpha haut" name="Upper Alpha" tool_tip="Cliquez pour sélectionner une image"/>
<texture_picker label="Alpha tête" name="Head Alpha" tool_tip="Cliquez pour sélectionner une image"/>
<texture_picker label="Alpha yeux" name="Eye Alpha" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Alpha cheveux" name="Hair Alpha" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Alpha cheveux" width="80" name="Hair Alpha" tool_tip="Cliquez pour sélectionner une image"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_classified.xml b/indra/newview/skins/default/xui/fr/panel_edit_classified.xml
index 1f44f2fe09..2e2b848c93 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_classified.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_classified.xml
@@ -3,12 +3,20 @@
<panel.string name="location_notice">
(mise à jour après l&apos;enregistrement)
</panel.string>
+ <string name="publish_label">
+ Publier
+ </string>
+ <string name="save_label">
+ Enregistrer
+ </string>
<text name="title">
Modifier la petite annonce
</text>
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
- <icon label="" name="edit_icon" tool_tip="Cliquez pour sélectionner une image"/>
+ <panel name="snapshot_panel">
+ <icon label="" name="edit_icon" tool_tip="Cliquer pour sélectionner une image"/>
+ </panel>
<text name="Name:">
Titre :
</text>
@@ -22,20 +30,19 @@
en cours de chargement...
</text>
<button label="Définir sur l&apos;emplacement actuel" name="set_to_curr_location_btn"/>
- <combo_box name="content_type">
- <combo_item name="mature_ci">
- Contenu Modéré
- </combo_item>
- <combo_item name="pg_ci">
- Contenu Général
- </combo_item>
- </combo_box>
+ <text name="category_label" value="Catégorie :"/>
+ <text name="content_type_label" value="Type de contenu :"/>
+ <icons_combo_box label="Contenu Général" name="content_type">
+ <icons_combo_box.item label="Contenu Modéré" name="mature_ci" value="Mature"/>
+ <icons_combo_box.item label="Contenu Général" name="pg_ci" value="PG"/>
+ </icons_combo_box>
+ <text name="price_for_listing_label" value="Coût de l&apos;annonce :"/>
<spinner label="L$" name="price_for_listing" tool_tip="Coût de l&apos;annonce." value="50"/>
- <check_box label="Renouvellement automatique toutes les semaines" name="auto_renew"/>
+ <check_box label="Renouvellement auto toutes les semaines" name="auto_renew"/>
</panel>
</scroll_container>
<panel label="bottom_panel" name="bottom_panel">
- <button label="Enregistrer" name="save_changes_btn"/>
+ <button label="[LABEL]" name="save_changes_btn"/>
<button label="Annuler" name="cancel_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_eyes.xml b/indra/newview/skins/default/xui/fr/panel_edit_eyes.xml
index 7de6ca8b3f..549864e237 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_eyes.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_eyes.xml
@@ -3,7 +3,9 @@
<panel name="avatar_eye_color_panel">
<texture_picker label="Iris" name="Iris" tool_tip="Cliquez pour sélectionner une image"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="eyes_main_tab" title="Yeux"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="eyes_main_tab" title="Yeux"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_gloves.xml b/indra/newview/skins/default/xui/fr/panel_edit_gloves.xml
index e37e0b2481..7f02222bef 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_gloves.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_gloves.xml
@@ -2,9 +2,11 @@
<panel name="edit_gloves_panel">
<panel name="avatar_gloves_color_panel">
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+ <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="gloves_main_tab" title="Gants"/>
+ </accordion>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="gloves_main_tab" title="Gants"/>
- </accordion>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_hair.xml b/indra/newview/skins/default/xui/fr/panel_edit_hair.xml
index 9293c23e19..575cbabc88 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_hair.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_hair.xml
@@ -3,10 +3,12 @@
<panel name="avatar_hair_color_panel">
<texture_picker label="Texture" name="Texture" tool_tip="Cliquez pour sélectionner une image"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="hair_color_tab" title="Couleur"/>
- <accordion_tab name="hair_style_tab" title="Coupe"/>
- <accordion_tab name="hair_eyebrows_tab" title="Sourcils"/>
- <accordion_tab name="hair_facial_tab" title="Pilosité du visage"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="hair_color_tab" title="Couleur"/>
+ <accordion_tab name="hair_style_tab" title="Style"/>
+ <accordion_tab name="hair_eyebrows_tab" title="Sourcils"/>
+ <accordion_tab name="hair_facial_tab" title="Pilosité"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_jacket.xml b/indra/newview/skins/default/xui/fr/panel_edit_jacket.xml
index 759db657a6..0a87471db8 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_jacket.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_jacket.xml
@@ -3,9 +3,11 @@
<panel name="avatar_jacket_color_panel">
<texture_picker label="Tissu (haut)" name="Upper Fabric" tool_tip="Cliquez pour sélectionner une image"/>
<texture_picker label="Tissu (bas)" name="Lower Fabric" tool_tip="Cliquez pour sélectionner une image"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+ <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="jacket_main_tab" title="Veste"/>
+ </accordion>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="jacket_main_tab" title="Veste"/>
- </accordion>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_pants.xml b/indra/newview/skins/default/xui/fr/panel_edit_pants.xml
index 5328e885d3..b9f81278e2 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_pants.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_pants.xml
@@ -2,9 +2,11 @@
<panel name="edit_pants_panel">
<panel name="avatar_pants_color_panel">
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+ <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="pants_main_tab" title="Pantalon"/>
+ </accordion>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="pants_main_tab" title="Pantalon"/>
- </accordion>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_pick.xml b/indra/newview/skins/default/xui/fr/panel_edit_pick.xml
index f234529764..5872b01fb0 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_pick.xml
@@ -1,7 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Modifier la préférence" name="panel_edit_pick">
+<panel label="Modifier le favori" name="panel_edit_pick">
+ <panel.string name="location_notice">
+ (mise à jour après enregistrement)
+ </panel.string>
<text name="title">
- Modifier la préférence
+ Modifier le favori
</text>
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
@@ -22,7 +25,7 @@
</panel>
</scroll_container>
<panel label="bottom_panel" name="bottom_panel">
- <button label="Enregistrer [WHAT]" name="save_changes_btn"/>
+ <button label="Enregistrer" name="save_changes_btn"/>
<button label="Annuler" name="cancel_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_profile.xml b/indra/newview/skins/default/xui/fr/panel_edit_profile.xml
index 4a42858861..4be12054df 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_profile.xml
@@ -33,27 +33,27 @@
<icon label="" name="2nd_life_edit_icon" tool_tip="Cliquez pour sélectionner une image"/>
</panel>
<panel name="first_life_image_panel">
- <text name="real_world_photo_title_text" value="Monde physique :"/>
+ <text name="real_world_photo_title_text" value="Vie réelle :"/>
</panel>
<icon label="" name="real_world_edit_icon" tool_tip="Cliquez pour sélectionner une image"/>
<text name="title_homepage_text">
Page d&apos;accueil :
</text>
<line_editor name="homepage_edit" value="http://"/>
- <check_box label="Afficher dans les résultats de recherche" name="show_in_search_checkbox"/>
+ <check_box label="Afficher avec la recherche" name="show_in_search_checkbox"/>
<text name="title_acc_status_text" value="Mon compte :"/>
+ <text_editor name="acc_status_text" value="Résident. Aucune info de paiement enregistrée."/>
<text name="my_account_link" value="[[URL] Accéder à ma Page d&apos;accueil]"/>
- <text name="acc_status_text" value="Résident. Aucune info de paiement enregistrée."/>
<text name="title_partner_text" value="Mon partenaire :"/>
- <text name="partner_edit_link" value="[[URL] Modifier]"/>
<panel name="partner_data_panel">
- <name_box name="partner_text" value="[FIRST] [LAST]"/>
+ <name_box initial_value="(récupération en cours)" name="partner_text" value="[FIRST] [LAST]"/>
</panel>
+ <text name="partner_edit_link" value="[[URL] Modifier]"/>
</panel>
</panel>
</scroll_container>
<panel name="profile_me_buttons_panel">
- <button label="Enregistrer les changements" name="save_btn"/>
+ <button label="Enregistrer les changements" name="save_btn" width="166"/>
<button label="Annuler" name="cancel_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_shape.xml b/indra/newview/skins/default/xui/fr/panel_edit_shape.xml
index 450b23608a..88f0635d97 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_shape.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_shape.xml
@@ -1,23 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_shape_panel">
- <panel name="avatar_sex_panel">
- <text name="gender_text">
- Sexe :
- </text>
- <radio_group name="sex_radio">
- <radio_item label="Femme" name="radio"/>
- <radio_item label="Homme" name="radio2"/>
- </radio_group>
+ <text name="avatar_height">
+ Taille : [HEIGHT] mètres
+ </text>
+ <panel label="Chemise" name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shape_body_tab" title="Corps"/>
+ <accordion_tab name="shape_head_tab" title="Tête"/>
+ <accordion_tab name="shape_eyes_tab" title="Yeux"/>
+ <accordion_tab name="shape_ears_tab" title="Oreilles"/>
+ <accordion_tab name="shape_nose_tab" title="Nez"/>
+ <accordion_tab name="shape_mouth_tab" title="Bouche"/>
+ <accordion_tab name="shape_chin_tab" title="Menton"/>
+ <accordion_tab name="shape_torso_tab" title="Torse"/>
+ <accordion_tab name="shape_legs_tab" title="Jambes"/>
+ </accordion>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="shape_body_tab" title="Corps"/>
- <accordion_tab name="shape_head_tab" title="Tête"/>
- <accordion_tab name="shape_eyes_tab" title="Yeux"/>
- <accordion_tab name="shape_ears_tab" title="Oreilles"/>
- <accordion_tab name="shape_nose_tab" title="Nez"/>
- <accordion_tab name="shape_mouth_tab" title="Bouche"/>
- <accordion_tab name="shape_chin_tab" title="Menton"/>
- <accordion_tab name="shape_torso_tab" title="Torse"/>
- <accordion_tab name="shape_legs_tab" title="Jambes"/>
- </accordion>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_shirt.xml b/indra/newview/skins/default/xui/fr/panel_edit_shirt.xml
index 0fe7d5bbb0..e4e66db2ed 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_shirt.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_shirt.xml
@@ -2,9 +2,11 @@
<panel name="edit_shirt_panel">
<panel name="avatar_shirt_color_panel">
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+ <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shirt_main_tab" title="Chemise"/>
+ </accordion>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="shirt_main_tab" title="Chemise"/>
- </accordion>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_shoes.xml b/indra/newview/skins/default/xui/fr/panel_edit_shoes.xml
index 588a2ca7b2..6fca0fe121 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_shoes.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_shoes.xml
@@ -2,9 +2,11 @@
<panel name="edit_shoes_panel">
<panel name="avatar_shoes_color_panel">
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+ <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shoes_main_tab" title="Chaussures"/>
+ </accordion>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="shoes_main_tab" title="Chaussures"/>
- </accordion>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_skin.xml b/indra/newview/skins/default/xui/fr/panel_edit_skin.xml
index 649b91d66d..9640adcdf8 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_skin.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_skin.xml
@@ -1,14 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_skin_panel">
<panel name="avatar_skin_color_panel">
- <texture_picker label="Tatouage tête" name="Head Tattoos" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Tatouage haut" name="Upper Tattoos" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Tatouage tête" name="Head Tattoos" tool_tip="Cliquez pour sélectionner une image" width="76"/>
+ <texture_picker label="Tatouage haut" name="Upper Tattoos" tool_tip="Cliquez pour sélectionner une image" width="80"/>
<texture_picker label="Tatouage bas" name="Lower Tattoos" tool_tip="Cliquez pour sélectionner une image"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="skin_color_tab" title="Couleur de peau"/>
- <accordion_tab name="skin_face_tab" title="Détails du visage"/>
- <accordion_tab name="skin_makeup_tab" title="Maquillage"/>
- <accordion_tab name="skin_body_tab" title="Détails du corps"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skin_color_tab" title="Couleur"/>
+ <accordion_tab name="skin_face_tab" title="Détails visage"/>
+ <accordion_tab name="skin_makeup_tab" title="Maquillage"/>
+ <accordion_tab name="skin_body_tab" title="Détails corps"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_skirt.xml b/indra/newview/skins/default/xui/fr/panel_edit_skirt.xml
index 9d0f13c4e8..65fed2fbf4 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_skirt.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_skirt.xml
@@ -2,9 +2,11 @@
<panel name="edit_skirt_panel">
<panel name="avatar_skirt_color_panel">
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+ <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skirt_main_tab" title="Jupe"/>
+ </accordion>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="skirt_main_tab" title="Jupe"/>
- </accordion>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_socks.xml b/indra/newview/skins/default/xui/fr/panel_edit_socks.xml
index 8b062e0145..b9e9a07b8c 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_socks.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_socks.xml
@@ -2,9 +2,11 @@
<panel name="edit_socks_panel">
<panel name="avatar_socks_color_panel">
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+ <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="socks_main_tab" title="Chaussettes"/>
+ </accordion>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="socks_main_tab" title="Chaussettes"/>
- </accordion>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/fr/panel_edit_tattoo.xml
index 1faee191e0..9a6939e6b7 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_tattoo.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_tattoo.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_tattoo_panel">
<panel name="avatar_tattoo_color_panel">
- <texture_picker label="Tatouage tête" name="Head Tattoo" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Tatouage haut" name="Upper Tattoo" tool_tip="Cliquez pour sélectionner une image"/>
- <texture_picker label="Tatouage bas" name="Lower Tattoo" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="Tatouage tête" name="Head Tattoo" tool_tip="Cliquez pour sélectionner une image" width="76"/>
+ <texture_picker label="Tatouage haut" name="Upper Tattoo" tool_tip="Cliquez pour sélectionner une image" width="80"/>
+ <texture_picker label="Tatouage bas" name="Lower Tattoo" tool_tip="Cliquez pour sélectionner une image" width="76"/>
+ <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_underpants.xml b/indra/newview/skins/default/xui/fr/panel_edit_underpants.xml
index b9164ad862..7eddbd93f6 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_underpants.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_underpants.xml
@@ -2,9 +2,11 @@
<panel name="edit_underpants_panel">
<panel name="avatar_underpants_color_panel">
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+ <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="underpants_main_tab" title="Caleçon"/>
+ </accordion>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="underpants_main_tab" title="Sous-vêtements (femme)"/>
- </accordion>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/fr/panel_edit_undershirt.xml
index 462eff9451..e6bac22c23 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_undershirt.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_undershirt.xml
@@ -2,9 +2,11 @@
<panel name="edit_undershirt_panel">
<panel name="avatar_undershirt_color_panel">
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image"/>
- <color_swatch label="Couleur/Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs"/>
+ <color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="80"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="undershirt_main_tab" title="Débardeur"/>
+ </accordion>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="undershirt_main_tab" title="Sous-vêtements (homme)"/>
- </accordion>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml b/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml
index 24ea030b33..e0762bd791 100644
--- a/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/fr/panel_edit_wearable.xml
@@ -34,10 +34,10 @@
Modification des gants
</string>
<string name="edit_undershirt_title">
- Modification des sous-vêtements (homme)
+ Modification du débardeur
</string>
<string name="edit_underpants_title">
- Modification des sous-vêtements (femme)
+ Modification du caleçon
</string>
<string name="edit_alpha_title">
Modification du masque alpha
@@ -79,10 +79,10 @@
Gants :
</string>
<string name="undershirt_desc_text">
- Sous-vêtements (homme) :
+ Débardeur :
</string>
<string name="underpants_desc_text">
- Sous-vêtements (femme) :
+ Caleçon :
</string>
<string name="alpha_desc_text">
Masque alpha :
@@ -93,9 +93,20 @@
<text name="edit_wearable_title" value="Modification de la silhouette"/>
<panel label="Chemise" name="wearable_type_panel">
<text name="description_text" value="Silhouette :"/>
+ <radio_group name="sex_radio">
+ <radio_item label="" name="sex_male" tool_tip="Homme" value="1"/>
+ <radio_item label="" name="sex_female" tool_tip="Femme" value="0"/>
+ </radio_group>
+ <icon name="male_icon" tool_tip="Homme"/>
+ <icon name="female_icon" tool_tip="Femme"/>
+ </panel>
+ <panel label="gear_buttom_panel" name="gear_buttom_panel">
+ <button name="friends_viewsort_btn" tool_tip="Options"/>
+ <button name="add_btn" tool_tip="TODO"/>
+ <button name="del_btn" tool_tip="TODO"/>
</panel>
<panel name="button_panel">
<button label="Enregistrer sous" name="save_as_button"/>
- <button label="Annuler modification" name="revert_button"/>
+ <button label="Rétablir" name="revert_button" width="130"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_friends.xml b/indra/newview/skins/default/xui/fr/panel_friends.xml
index 10ec952aa3..ad9e3daf3d 100644
--- a/indra/newview/skins/default/xui/fr/panel_friends.xml
+++ b/indra/newview/skins/default/xui/fr/panel_friends.xml
@@ -16,5 +16,5 @@
<button label="Téléporter" name="offer_teleport_btn" tool_tip="Proposez à cet ami d&apos;être téléporté là où vous êtes"/>
<button label="Payer" name="pay_btn" tool_tip="Donnez des L$ à cet ami"/>
<button label="Supprimer" name="remove_btn" tool_tip="Supprimez ce résident de votre liste d&apos;amis"/>
- <button label="Ajouter" name="add_btn" tool_tip="Proposer à ce résident de devenir votre ami"/>
+ <button label="Ajouter" name="add_btn" tool_tip="Proposer à un résident de devenir votre ami"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_group_control_panel.xml b/indra/newview/skins/default/xui/fr/panel_group_control_panel.xml
index 69403939aa..3e66b3c72a 100644
--- a/indra/newview/skins/default/xui/fr/panel_group_control_panel.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_control_panel.xml
@@ -11,7 +11,7 @@
<button label="Quitter l&apos;appel" name="end_call_btn"/>
</layout_panel>
<layout_panel name="voice_ctrls_btn_panel">
- <button label="Ouvrir les contrôles vocaux" name="voice_ctrls_btn"/>
+ <button label="Ouvrir contrôles vocaux" name="voice_ctrls_btn"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_group_general.xml b/indra/newview/skins/default/xui/fr/panel_group_general.xml
index f0b242c6a1..20cb5bd974 100644
--- a/indra/newview/skins/default/xui/fr/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_general.xml
@@ -11,27 +11,48 @@ Faites glisser le pointeur de la souris sur les options pour en savoir plus.
<panel.string name="incomplete_member_data_str">
Extraction des données du résident en cours
</panel.string>
+ <panel name="group_info_top">
+ <texture_picker label="" name="insignia" tool_tip="Cliquez pour sélectionner une image"/>
+ <text name="prepend_founded_by">
+ Fondateur :
+ </text>
+ <name_box initial_value="(récupération en cours)" name="founder_name"/>
+ <text name="join_cost_text">
+ Gratuit
+ </text>
+ <button label="REJOINDRE" name="btn_join"/>
+ </panel>
<text_editor name="charter">
Indiquez ici la charte de votre groupe
</text_editor>
<name_list name="visible_members">
<name_list.columns label="Membre" name="name" relwidth="0.40"/>
<name_list.columns label="Titre" name="title" relwidth="0.25"/>
+ <name_list.columns label="Statut" name="status"/>
</name_list>
+ <text name="my_group_settngs_label">
+ Moi
+ </text>
<text name="active_title_label">
- Mon titre
+ Mon titre :
</text>
<combo_box name="active_title" tool_tip="Indique le titre qui apparaît en face du nom de votre avatar lorsque votre groupe est actif."/>
<check_box label="Recevoir les notices du groupe" name="receive_notices" tool_tip="Indique si vous souhaitez recevoir les notices envoyées au groupe. Décochez si ce groupe vous envoie des spams."/>
<check_box label="Afficher dans mon profil" name="list_groups_in_profile" tool_tip="Indique si vous voulez afficher ce groupe dans votre profil"/>
<panel name="preferences_container">
- <check_box label="Inscription libre" name="open_enrollement" tool_tip="Indique si ce groupe autorise les nouveaux membres à le rejoindre sans y être invités."/>
- <check_box label="Frais d&apos;inscription" name="check_enrollment_fee" tool_tip="Indique s&apos;il faut payer des frais d&apos;inscription pour rejoindre ce groupe"/>
+ <text name="group_settngs_label">
+ Groupe
+ </text>
+ <check_box label="Inscription ouverte à tous" name="open_enrollement" tool_tip="Indique si ce groupe autorise les nouveaux membres à le rejoindre sans y être invités."/>
+ <check_box label="Inscription payante" name="check_enrollment_fee" tool_tip="Indique s&apos;il faut payer des frais d&apos;inscription pour rejoindre ce groupe"/>
<spinner label="L$" name="spin_enrollment_fee" tool_tip="Les nouveaux membres doivent payer ces frais pour rejoindre le groupe quand l&apos;option Frais d&apos;inscription est cochée."/>
- <check_box initial_value="true" label="Afficher dans la recherche" name="show_in_group_list" tool_tip="Permettre aux autres résidents de voir ce groupe dans les résultats de recherche"/>
<combo_box name="group_mature_check" tool_tip="Définit si votre groupe contient des informations de type Modéré" width="195">
- <combo_box.item label="Contenu Général" name="pg"/>
+ <combo_item name="select_mature">
+ - Catégorie d&apos;accès -
+ </combo_item>
<combo_box.item label="Contenu Modéré" name="mature"/>
+ <combo_box.item label="Contenu Général" name="pg"/>
</combo_box>
+ <check_box initial_value="true" label="Afficher dans la recherche" name="show_in_group_list" tool_tip="Permettre aux autres résidents de voir ce groupe dans les résultats de recherche"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/fr/panel_group_info_sidetray.xml
index b2f61fde71..5b08b4aefb 100644
--- a/indra/newview/skins/default/xui/fr/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_info_sidetray.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Profil du groupe" name="GroupInfo">
<panel.string name="default_needs_apply_text">
- Certaines modifications sur cet onglet n&apos;ont pas été enregistrées.
+ Certaines modifications n&apos;ont pas été enregistrées.
</panel.string>
<panel.string name="want_apply_text">
Voulez-vous enregistrer ces modifications ?
@@ -12,27 +12,24 @@
<panel.string name="group_join_free">
Gratuit
</panel.string>
- <text name="group_name" value="(en cours de chargement...)"/>
- <line_editor label="Saisissez le nom du groupe ici" name="group_name_editor"/>
- <texture_picker label="" name="insignia" tool_tip="Cliquez pour sélectionner une image"/>
- <text name="prepend_founded_by">
- Fondateur :
- </text>
- <name_box initial_value="(récupération en cours)" name="founder_name"/>
- <text name="join_cost_text">
- Gratuit
- </text>
- <button label="REJOINDRE" name="btn_join"/>
- <accordion name="groups_accordion">
- <accordion_tab name="group_general_tab" title="Général"/>
- <accordion_tab name="group_roles_tab" title="Rôles"/>
- <accordion_tab name="group_notices_tab" title="Notices"/>
- <accordion_tab name="group_land_tab" title="Terrain/Actifs"/>
- </accordion>
- <panel name="button_row">
- <button label="Créer" label_selected="Nouveau groupe" name="btn_create"/>
- <button label="Chat de groupe" name="btn_chat"/>
- <button label="Appel de groupe" name="btn_call"/>
- <button label="Enregistrer" label_selected="Enregistrer" name="btn_apply"/>
+ <panel name="group_info_top">
+ <text name="group_name" value="(en cours de chargement...)"/>
+ <line_editor label="Saisissez le nom du groupe ici" name="group_name_editor"/>
</panel>
+ <layout_stack name="layout">
+ <layout_panel name="group_accordions">
+ <accordion name="groups_accordion">
+ <accordion_tab name="group_general_tab" title="Général"/>
+ <accordion_tab name="group_roles_tab" title="Rôles"/>
+ <accordion_tab name="group_notices_tab" title="Notices"/>
+ <accordion_tab name="group_land_tab" title="Terrain/Actifs"/>
+ </accordion>
+ </layout_panel>
+ <layout_panel name="button_row">
+ <button label="Chat" name="btn_chat"/>
+ <button label="Appel de groupe" name="btn_call" tool_tip="Appeler ce groupe"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="btn_apply"/>
+ <button label="Créer un groupe" name="btn_create" tool_tip="Créer un groupe"/>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_group_land_money.xml b/indra/newview/skins/default/xui/fr/panel_group_land_money.xml
index 3ca22b6e21..192dd799ba 100644
--- a/indra/newview/skins/default/xui/fr/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_land_money.xml
@@ -1,65 +1,65 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Terrain et L$" name="land_money_tab">
- <string name="help_text">
+ <panel.string name="help_text">
Un avertissement apparaît si la surface utilisée par le groupe est supérieure ou égale au total des contributions.
- </string>
- <button label="?" name="help_button"/>
- <string name="cant_view_group_land_text">
+ </panel.string>
+ <panel.string name="cant_view_group_land_text">
Vous n&apos;avez pas la permission de voir quel terrain possède ce groupe
- </string>
- <string name="cant_view_group_accounting_text">
+ </panel.string>
+ <panel.string name="epmty_view_group_land_text">
+ Aucune entrée
+ </panel.string>
+ <panel.string name="cant_view_group_accounting_text">
Vous n&apos;avez pas la permission d&apos;accéder aux informations financières de ce groupe.
- </string>
- <string name="loading_txt">
+ </panel.string>
+ <panel.string name="loading_txt">
Chargement...
- </string>
- <text name="group_land_heading">
- Terrain du groupe
- </text>
- <scroll_list name="group_parcel_list">
- <column label="Parcelle" name="name"/>
- <column label="Région" name="location"/>
- <column label="Type" name="type"/>
- <column label="Surface" name="area"/>
- <column label="" name="hidden"/>
- </scroll_list>
- <button label="Carte" label_selected="Carte" name="map_button"/>
- <text name="total_contributed_land_label">
- Total des contributions :
- </text>
- <text name="total_contributed_land_value">
- [AREA] m²
- </text>
- <text name="total_land_in_use_label">
- Superficie déjà utilisée :
- </text>
- <text name="total_land_in_use_value">
- [AREA] m²
- </text>
- <text name="land_available_label">
- Superficie disponible :
- </text>
- <text name="land_available_value">
- [AREA] m²
- </text>
- <text name="your_contribution_label">
- Votre contribution :
- </text>
- <string name="land_contrib_error">
+ </panel.string>
+ <panel.string name="land_contrib_error">
Impossible de définir votre don de terrain
- </string>
- <text name="your_contribution_units">
- m²
- </text>
- <text name="your_contribution_max_value">
- ([AMOUNT] max.)
- </text>
- <text name="group_over_limit_text">
- Une contribution supplémentaire est requise pour prendre en charge le terrain utilisé
- </text>
- <text name="group_money_heading">
- Finances
- </text>
+ </panel.string>
+ <panel name="layout_panel_landmoney">
+ <scroll_list name="group_parcel_list">
+ <scroll_list.columns label="Parcelle" name="name"/>
+ <scroll_list.columns label="Région" name="location"/>
+ <scroll_list.columns label="Type" name="type"/>
+ <scroll_list.columns label="Surface" name="area"/>
+ </scroll_list>
+ <text name="total_contributed_land_label">
+ Total des contributions :
+ </text>
+ <text name="total_contributed_land_value">
+ [AREA] m²
+ </text>
+ <button label="Carte" label_selected="Carte" name="map_button"/>
+ <text name="total_land_in_use_label">
+ Superficie déjà utilisée :
+ </text>
+ <text name="total_land_in_use_value">
+ [AREA] m²
+ </text>
+ <text name="land_available_label">
+ Superficie disponible :
+ </text>
+ <text name="land_available_value">
+ [AREA] m²
+ </text>
+ <text name="your_contribution_label">
+ Votre contribution :
+ </text>
+ <text name="your_contribution_units">
+ m²
+ </text>
+ <text name="your_contribution_max_value">
+ ([AMOUNT] max.)
+ </text>
+ <text name="group_over_limit_text">
+ Une contribution supplémentaire est requise pour prendre en charge le terrain utilisé
+ </text>
+ <text name="group_money_heading">
+ Finances
+ </text>
+ </panel>
<tab_container name="group_money_tab_container">
<panel label="PLANIFICATION" name="group_money_planning_tab">
<text_editor name="group_money_planning_text">
diff --git a/indra/newview/skins/default/xui/fr/panel_group_notices.xml b/indra/newview/skins/default/xui/fr/panel_group_notices.xml
index 1ec63cf027..5ea7ba192b 100644
--- a/indra/newview/skins/default/xui/fr/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_notices.xml
@@ -10,7 +10,7 @@ Vous pouvez désactiver la réception des notices dans l&apos;onglet Général.
</panel.string>
<text name="lbl2">
Les notices sont conservées pendant 14 jours.
-200 maximum par groupe et par jour
+200 max. par groupe et par jour.
</text>
<scroll_list name="notice_list">
<scroll_list.columns label="" name="icon"/>
@@ -27,23 +27,24 @@ Vous pouvez désactiver la réception des notices dans l&apos;onglet Général.
<text name="lbl">
Créer une notice
</text>
- <text bottom_delta="-79" left="20" name="lbl3">
+ <text name="lbl3">
Sujet :
</text>
- <line_editor left_delta="61" name="create_subject" width="331"/>
- <text left="20" name="lbl4">
+ <line_editor name="create_subject"/>
+ <text name="lbl4">
Message :
</text>
- <text_editor bottom_delta="-90" height="104" left_delta="61" name="create_message" width="330"/>
- <text name="lbl5" width="68">
- Pièce-jointe :
+ <text_editor name="create_message"/>
+ <text name="lbl5">
+ Pièce jointe :
</text>
- <line_editor left_delta="74" name="create_inventory_name" width="190"/>
+ <line_editor name="create_inventory_name"/>
<text name="string">
Faire glisser l&apos;objet et le déposer ici pour le joindre :
</text>
- <button label="Supprimer" label_selected="Supprimer pièce-jointe" left="274" name="remove_attachment" width="140"/>
- <button label="Envoyer" label_selected="Envoyer" left="274" name="send_notice" width="140"/>
+ <button label="Inventaire" name="open_inventory" tool_tip="Ouvrir l&apos;inventaire"/>
+ <button label="Supprimer" label_selected="Supprimer pièce jointe" name="remove_attachment" tool_tip="Supprimer la pièce jointe de votre notification"/>
+ <button label="Envoyer" label_selected="Envoyer" left="200" name="send_notice" width="100"/>
<group_drop_target name="drop_target" tool_tip="Faites glisser un objet de l&apos;inventaire jusqu&apos;à cette case pour l&apos;envoyer avec la notice. Vous devez avoir l&apos;autorisation de copier et transférer l&apos;objet pour pouvoir le joindre."/>
</panel>
<panel label="Voir ancienne notice" name="panel_view_past_notice">
@@ -60,6 +61,6 @@ Vous pouvez désactiver la réception des notices dans l&apos;onglet Général.
Message :
</text>
<line_editor left="128" name="view_inventory_name" width="256"/>
- <button label="Ouvrir la pièce jointe" label_selected="Ouvrir pièce-jointe" name="open_attachment" width="118"/>
+ <button label="Ouvrir pièce jointe" label_selected="Ouvrir pièce jointe" name="open_attachment" width="118"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_group_roles.xml b/indra/newview/skins/default/xui/fr/panel_group_roles.xml
index d0c9f2f302..e1eeaa8601 100644
--- a/indra/newview/skins/default/xui/fr/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/fr/panel_group_roles.xml
@@ -1,27 +1,27 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Membres et rôles" name="roles_tab">
<panel.string name="default_needs_apply_text">
- Certaines modifications sur cet onglet n&apos;ont pas été enregistrées.
+ Certaines modifications n&apos;ont pas été enregistrées.
</panel.string>
<panel.string name="want_apply_text">
Voulez-vous enregistrer vos modifications ?
</panel.string>
- <tab_container height="164" name="roles_tab_container">
- <panel height="148" label="MEMBRES" name="members_sub_tab" tool_tip="Membres">
+ <tab_container name="roles_tab_container">
+ <panel label="MEMBRES" name="members_sub_tab" tool_tip="Membres">
<panel.string name="help_text">
Vous pouvez ajouter ou supprimer les rôles assignés aux membres.
Pour sélectionner plusieurs membres, cliquez sur leurs noms en maintenant la touche Ctrl enfoncée.
</panel.string>
<filter_editor label="Filtrer les membres" name="filter_input"/>
- <name_list bottom_delta="-105" height="104" name="member_list">
+ <name_list name="member_list">
<name_list.columns label="Membre" name="name"/>
- <name_list.columns label="Donation" name="donated" width="116"/>
- <name_list.columns label="Statut" name="online" width="136"/>
+ <name_list.columns label="Donation" name="donated"/>
+ <name_list.columns label="Statut" name="online"/>
</name_list>
- <button label="Inviter" name="member_invite" width="165"/>
+ <button label="Inviter" name="member_invite"/>
<button label="Expulser" name="member_eject"/>
</panel>
- <panel height="148" label="RÔLES" name="roles_sub_tab">
+ <panel label="RÔLES" name="roles_sub_tab">
<panel.string name="help_text">
Chaque rôle possède un titre et des
pouvoirs. Les membres peuvent avoir
@@ -41,7 +41,7 @@ notamment les rôles Tous et Propriétaire.
Checkbox_Off
</panel.string>
<filter_editor label="Filtrer les rôles" name="filter_input"/>
- <scroll_list bottom_delta="-104" height="104" name="role_list">
+ <scroll_list name="role_list">
<scroll_list.columns label="Rôle" name="name"/>
<scroll_list.columns label="Titre" name="title"/>
<scroll_list.columns label="#" name="members"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_groups.xml b/indra/newview/skins/default/xui/fr/panel_groups.xml
index 98320656fb..4cda98b9f7 100644
--- a/indra/newview/skins/default/xui/fr/panel_groups.xml
+++ b/indra/newview/skins/default/xui/fr/panel_groups.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="groups">
<scroll_list bottom="50" name="group list"/>
- <text bottom="16" height="32" name="groupdesc" width="268">
+ <text name="groupdesc">
Le groupe actif est en gras.
</text>
- <text bottom="3" name="groupcount">
+ <text name="groupcount" width="280">
Vous appartenez à [COUNT] groupes ([MAX] max).
</text>
<button label="IM/Appel" name="IM" tool_tip="Ouvrir une session de messagerie instantanée"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_im_control_panel.xml b/indra/newview/skins/default/xui/fr/panel_im_control_panel.xml
index 0590ed0f1b..1f2169e22c 100644
--- a/indra/newview/skins/default/xui/fr/panel_im_control_panel.xml
+++ b/indra/newview/skins/default/xui/fr/panel_im_control_panel.xml
@@ -9,11 +9,14 @@
<button label="Devenir amis" name="add_friend_btn"/>
</layout_panel>
<layout_panel name="teleport_btn_panel">
- <button label="Téléporter" name="teleport_btn"/>
+ <button label="Téléporter" name="teleport_btn" tool_tip="Proposer de téléporter cette personne"/>
</layout_panel>
<layout_panel name="share_btn_panel">
<button label="Partager" name="share_btn"/>
</layout_panel>
+ <layout_panel name="pay_btn_panel">
+ <button label="Payer" name="pay_btn"/>
+ </layout_panel>
<layout_panel name="call_btn_panel">
<button label="Appeler" name="call_btn"/>
</layout_panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_inventory_item.xml b/indra/newview/skins/default/xui/fr/panel_inventory_item.xml
new file mode 100644
index 0000000000..d18047fbcf
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_inventory_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="inventory_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_landmark_info.xml b/indra/newview/skins/default/xui/fr/panel_landmark_info.xml
index a2f82c72df..bd29bd676c 100644
--- a/indra/newview/skins/default/xui/fr/panel_landmark_info.xml
+++ b/indra/newview/skins/default/xui/fr/panel_landmark_info.xml
@@ -13,14 +13,11 @@
Aucune information sur ce lieu n&apos;est disponible actuellement, veuillez réessayer ultérieurement.
</string>
<string name="server_forbidden_text">
- Les informations sur ce lieu ne sont pas disponibles car l&apos;accès y est restreint. Veuillez vérifier vos permissions avec le propriétaire de la parcelle.
+ Les informations sur ce lieu ne sont pas disponibles car l&apos;accès y est restreint. Veuillez vérifier vos droits avec le propriétaire de la parcelle.
</string>
<string name="acquired_date">
[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
</string>
- <string name="icon_PG" value="parcel_drk_PG"/>
- <string name="icon_M" value="parcel_drk_M"/>
- <string name="icon_R" value="parcel_drk_R"/>
<button name="back_btn" tool_tip="Précédent"/>
<text name="title" value="Profil du lieu"/>
<scroll_container name="place_scroll">
diff --git a/indra/newview/skins/default/xui/fr/panel_landmarks.xml b/indra/newview/skins/default/xui/fr/panel_landmarks.xml
index c4e90bed61..9c15b0bbd3 100644
--- a/indra/newview/skins/default/xui/fr/panel_landmarks.xml
+++ b/indra/newview/skins/default/xui/fr/panel_landmarks.xml
@@ -2,7 +2,7 @@
<panel name="Landmarks">
<accordion name="landmarks_accordion">
<accordion_tab name="tab_favorites" title="Barre des Favoris"/>
- <accordion_tab name="tab_landmarks" title="Repères"/>
+ <accordion_tab name="tab_landmarks" title="Mes repères"/>
<accordion_tab name="tab_inventory" title="Mon inventaire"/>
<accordion_tab name="tab_library" title="Bibliothèque"/>
</accordion>
diff --git a/indra/newview/skins/default/xui/fr/panel_login.xml b/indra/newview/skins/default/xui/fr/panel_login.xml
index 8f0561d243..f5847e0ee0 100644
--- a/indra/newview/skins/default/xui/fr/panel_login.xml
+++ b/indra/newview/skins/default/xui/fr/panel_login.xml
@@ -8,27 +8,23 @@
</panel.string>
<layout_stack name="login_widgets">
<layout_panel name="login">
- <text name="first_name_text">
- Prénom :
+ <text name="username_text">
+ Nom d&apos;utilisateur :
</text>
- <line_editor label="Prénom" name="first_name_edit" tool_tip="Prénom [SECOND_LIFE]"/>
- <text name="last_name_text">
- Nom :
- </text>
- <line_editor label="Nom :" name="last_name_edit" tool_tip="Nom [SECOND_LIFE]"/>
+ <line_editor label="Nom d&apos;utilisateur" name="username_edit" tool_tip="Nom d&apos;utilisateur [SECOND_LIFE]"/>
<text name="password_text">
Mot de passe :
</text>
- <check_box label="Rappel" name="remember_check"/>
+ <check_box label="Enregistrer" name="remember_check"/>
+ <button label="Connexion" name="connect_btn"/>
<text name="start_location_text">
- Commencer à :
+ Lieu de départ :
</text>
- <combo_box name="start_location_combo">
+ <combo_box name="start_location_combo" width="152">
<combo_box.item label="Dernier emplacement" name="MyLastLocation"/>
<combo_box.item label="Domicile" name="MyHome"/>
<combo_box.item label="&lt;Saisissez le nom de la région&gt;" name="Typeregionname"/>
</combo_box>
- <button label="Connexion" name="connect_btn"/>
</layout_panel>
<layout_panel name="links">
<text name="create_new_account_text">
diff --git a/indra/newview/skins/default/xui/fr/panel_main_inventory.xml b/indra/newview/skins/default/xui/fr/panel_main_inventory.xml
index 5dc9042205..f631cf8b85 100644
--- a/indra/newview/skins/default/xui/fr/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/fr/panel_main_inventory.xml
@@ -1,64 +1,28 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Choses" name="main inventory panel">
- <panel.string name="Title">
- Choses
+ <panel.string name="ItemcountFetching">
+ Récupération de [ITEM_COUNT] objets... [FILTER]
</panel.string>
+ <panel.string name="ItemcountCompleted">
+ [ITEM_COUNT] objets [FILTER]
+ </panel.string>
+ <text name="ItemcountText">
+ Objets :
+ </text>
<filter_editor label="Filtrer l&apos;inventaire" name="inventory search editor"/>
<tab_container name="inventory filter tabs">
<inventory_panel label="MON INVENTAIRE" name="All Items"/>
- <inventory_panel label="RÉCENT" name="Recent Items"/>
+ <recent_inventory_panel label="RÉCENT" name="Recent Items"/>
</tab_container>
- <panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="Afficher d&apos;autres options"/>
- <button name="add_btn" tool_tip="Ajouter un nouvel article"/>
- <dnd_button name="trash_btn" tool_tip="Supprimer l&apos;article sélectionné"/>
- </panel>
- <menu_bar name="Inventory Menu">
- <menu label="Fichier" name="File">
- <menu_item_call label="Ouvrir" name="Open"/>
- <menu label="Charger" name="upload">
- <menu_item_call label="Image ([COST] L$)..." name="Upload Image"/>
- <menu_item_call label="Son ([COST] L$)..." name="Upload Sound"/>
- <menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/>
- <menu_item_call label="Lot ([COST] L$ par fichier)..." name="Bulk Upload"/>
- </menu>
- <menu_item_call label="Nouvelle fenêtre" name="New Window"/>
- <menu_item_call label="Afficher les filtres" name="Show Filters"/>
- <menu_item_call label="Réinitialiser les filtres" name="Reset Current"/>
- <menu_item_call label="Fermer tous les dossiers" name="Close All Folders"/>
- <menu_item_call label="Vider la corbeille" name="Empty Trash"/>
- <menu_item_call label="Vider les Objets trouvés" name="Empty Lost And Found"/>
- </menu>
- <menu label="Créer" name="Create">
- <menu_item_call label="Nouveau dossier" name="New Folder"/>
- <menu_item_call label="Nouveau script" name="New Script"/>
- <menu_item_call label="Nouvelle note" name="New Note"/>
- <menu_item_call label="Nouveau geste" name="New Gesture"/>
- <menu label="Nouveaux habits" name="New Clothes">
- <menu_item_call label="Nouvelle chemise" name="New Shirt"/>
- <menu_item_call label="Nouveau pantalon" name="New Pants"/>
- <menu_item_call label="Nouvelles chaussures" name="New Shoes"/>
- <menu_item_call label="Nouvelles chaussettes" name="New Socks"/>
- <menu_item_call label="Nouvelle veste" name="New Jacket"/>
- <menu_item_call label="Nouvelle jupe" name="New Skirt"/>
- <menu_item_call label="Nouveaux gants" name="New Gloves"/>
- <menu_item_call label="Nouveaux sous-vêtements (homme)" name="New Undershirt"/>
- <menu_item_call label="Nouveaux sous-vêtements (femme)" name="New Underpants"/>
- <menu_item_call label="Nouvel alpha" name="New Alpha"/>
- <menu_item_call label="Nouveau tatouage" name="New Tattoo"/>
- </menu>
- <menu label="Nouvelles parties du corps" name="New Body Parts">
- <menu_item_call label="Nouvelle silhouette" name="New Shape"/>
- <menu_item_call label="Nouvelle peau" name="New Skin"/>
- <menu_item_call label="Nouveaux cheveux" name="New Hair"/>
- <menu_item_call label="Nouveaux yeux" name="New Eyes"/>
- </menu>
- </menu>
- <menu label="Trier" name="Sort">
- <menu_item_check label="Par nom" name="By Name"/>
- <menu_item_check label="Par date" name="By Date"/>
- <menu_item_check label="Dossiers toujours par nom" name="Folders Always By Name"/>
- <menu_item_check label="Dossiers système en premier" name="System Folders To Top"/>
- </menu>
- </menu_bar>
+ <layout_stack name="bottom_panel">
+ <layout_panel name="options_gear_btn_panel">
+ <button name="options_gear_btn" tool_tip="Afficher d&apos;autres options"/>
+ </layout_panel>
+ <layout_panel name="add_btn_panel">
+ <button name="add_btn" tool_tip="Ajouter un nouvel article"/>
+ </layout_panel>
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="trash_btn" tool_tip="Supprimer l&apos;article sélectionné"/>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_me.xml b/indra/newview/skins/default/xui/fr/panel_me.xml
index c9d77c208f..2521967bc6 100644
--- a/indra/newview/skins/default/xui/fr/panel_me.xml
+++ b/indra/newview/skins/default/xui/fr/panel_me.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Mon profil" name="panel_me">
<tab_container name="tabs">
- <panel label="PROFIL" name="panel_profile"/>
- <panel label="FAVORIS" name="panel_picks"/>
+ <panel label="MON PROFIL" name="panel_profile"/>
+ <panel label="MES PRÉFÉRENCES" name="panel_picks"/>
</tab_container>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_media_settings_general.xml b/indra/newview/skins/default/xui/fr/panel_media_settings_general.xml
index afd2d9cd8f..e048e66810 100644
--- a/indra/newview/skins/default/xui/fr/panel_media_settings_general.xml
+++ b/indra/newview/skins/default/xui/fr/panel_media_settings_general.xml
@@ -8,7 +8,7 @@
</text>
<line_editor name="home_url" tool_tip="La page d&apos;accueil pour cette source média"/>
<text name="preview_label">
- Prévisualiser
+ Aperçu
</text>
<text name="current_url_label">
Page actuelle :
@@ -20,7 +20,7 @@
<check_box initial_value="false" label="Zoom auto" name="auto_zoom"/>
<check_box initial_value="false" label="Lecture auto du média" name="auto_play"/>
<text name="media_setting_note">
- Remarque : kes résidents peuvent ignorer ce paramètre
+ Remarque : les résidents peuvent ignorer ce paramètre
</text>
<check_box initial_value="false" label="Mise à l&apos;échelle auto du média sur la face de l&apos;objet" name="auto_scale"/>
<text name="size_label">
diff --git a/indra/newview/skins/default/xui/fr/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/fr/panel_media_settings_permissions.xml
index 6f6ae035a1..8f1b436ba1 100644
--- a/indra/newview/skins/default/xui/fr/panel_media_settings_permissions.xml
+++ b/indra/newview/skins/default/xui/fr/panel_media_settings_permissions.xml
@@ -11,10 +11,19 @@
Mini
</combo_item>
</combo_box>
- <check_box initial_value="false" label="Désactiver la navigation et l&apos;interactivité" name="perms_owner_interact"/>
+ <text name="owner_label">
+ Propriétaire
+ </text>
+ <check_box initial_value="false" label="Activer la navigation et l&apos;interactivité" name="perms_owner_interact"/>
<check_box initial_value="false" label="Afficher la barre de contrôles" name="perms_owner_control"/>
- <check_box initial_value="false" label="Désactiver la navigation et l&apos;interactivité" name="perms_group_interact"/>
+ <text name="group_label">
+ Groupe :
+ </text>
+ <check_box initial_value="false" label="Activer la navigation et l&apos;interactivité" name="perms_group_interact"/>
<check_box initial_value="false" label="Afficher la barre de contrôles" name="perms_group_control"/>
- <check_box initial_value="false" label="Désactiver la navigation et l&apos;interactivité" name="perms_anyone_interact"/>
+ <text name="anyone_label">
+ Tout le monde
+ </text>
+ <check_box initial_value="false" label="Activer la navigation et l&apos;interactivité" name="perms_anyone_interact"/>
<check_box initial_value="false" label="Afficher la barre de contrôles" name="perms_anyone_control"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_media_settings_security.xml b/indra/newview/skins/default/xui/fr/panel_media_settings_security.xml
index 36d5f4e860..9d070b7aff 100644
--- a/indra/newview/skins/default/xui/fr/panel_media_settings_security.xml
+++ b/indra/newview/skins/default/xui/fr/panel_media_settings_security.xml
@@ -2,7 +2,8 @@
<panel label="Sécurité" name="Media Settings Security">
<check_box initial_value="false" label="Autoriser l&apos;accès aux styles d&apos;URL spécifiés uniquement" name="whitelist_enable"/>
<text name="home_url_fails_some_items_in_whitelist">
- Les entrées par lesquelles la page d&apos;accueil est rejetée sont indiquées :
+ Les entrées par lesquelles la page
+d&apos;accueil est rejetée sont indiquées :
</text>
<button label="Ajouter" name="whitelist_add"/>
<button label="Supprimer" name="whitelist_del"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_my_profile.xml b/indra/newview/skins/default/xui/fr/panel_my_profile.xml
index bbf760466a..ce2e5f4c60 100644
--- a/indra/newview/skins/default/xui/fr/panel_my_profile.xml
+++ b/indra/newview/skins/default/xui/fr/panel_my_profile.xml
@@ -26,15 +26,18 @@
</panel>
<panel name="first_life_image_panel">
<icon label="" name="real_world_edit_icon" tool_tip="Cliquez sur le bouton Modifier le profil ci-dessous pour changer d&apos;image"/>
- <text name="title_rw_descr_text" value="Monde physique :"/>
+ <text name="title_rw_descr_text" value="Vie réelle :"/>
</panel>
<text name="title_member_text" value="Résident depuis :"/>
<text name="title_acc_status_text" value="Statut du compte :"/>
- <text name="acc_status_text">
+ <text_editor name="acc_status_text">
Résident. Aucune info de paiement enregistrée.
Linden.
- </text>
+ </text_editor>
<text name="title_partner_text" value="Partenaire :"/>
+ <panel name="partner_data_panel">
+ <name_box initial_value="(récupération en cours)" name="partner_text"/>
+ </panel>
<text name="title_groups_text" value="Groupes :"/>
</panel>
</scroll_container>
diff --git a/indra/newview/skins/default/xui/fr/panel_navigation_bar.xml b/indra/newview/skins/default/xui/fr/panel_navigation_bar.xml
index 7b89a2b686..45caf2323d 100644
--- a/indra/newview/skins/default/xui/fr/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/fr/panel_navigation_bar.xml
@@ -1,15 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="navigation_bar">
<panel name="navigation_panel">
- <button name="back_btn" tool_tip="Revenir à l&apos;emplacement précédent"/>
- <button name="forward_btn" tool_tip="Avancer d&apos;un emplacement"/>
+ <pull_button name="back_btn" tool_tip="Revenir à l&apos;emplacement précédent"/>
+ <pull_button name="forward_btn" tool_tip="Avancer d&apos;un emplacement"/>
<button name="home_btn" tool_tip="Me téléporter jusqu&apos;à mon domicile"/>
<location_input label="Emplacement" name="location_combo"/>
<search_combo_box label="Rechercher" name="search_combo_box" tool_tip="Rechercher">
<combo_editor label="Rechercher dans [SECOND_LIFE]" name="search_combo_editor"/>
</search_combo_box>
</panel>
- <favorites_bar name="favorite">
+ <favorites_bar name="favorite" tool_tip="Faites glisser des repères ici pour un accès rapide à vos lieux favoris dans Second Life.">
+ <label name="favorites_bar_label" tool_tip="Faites glisser des repères ici pour un accès rapide à vos lieux favoris dans Second Life.">
+ Favoris
+ </label>
<chevron_button name="&gt;&gt;" tool_tip="Afficher d&apos;avantage de Favoris"/>
</favorites_bar>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml b/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml
index fa1ddd2430..b506a202bd 100644
--- a/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/fr/panel_nearby_chat.xml
@@ -2,8 +2,8 @@
<!-- All our XML is utf-8 encoded. -->
<panel name="nearby_chat">
<panel name="chat_caption">
- <text name="sender_name">
- CHAT PRÈS DE VOUS
- </text>
+ <text
+ name="sender_name"
+width="170">CHAT PRÈS DE MOI</text>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/fr/panel_nearby_chat_bar.xml
index 8ed441cbae..82cdf292ab 100644
--- a/indra/newview/skins/default/xui/fr/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/fr/panel_nearby_chat_bar.xml
@@ -1,11 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="chat_bar">
- <string name="min_width">
- 192
- </string>
- <string name="max_width">
- 320
- </string>
<line_editor label="Cliquer ici pour chatter." name="chat_box" tool_tip="Appuyer sur Entrée pour dire, Ctrl-Entrée pour crier"/>
<button name="show_nearby_chat" tool_tip="Affiche/Masque le journal de chats près de vous"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_nearby_media.xml b/indra/newview/skins/default/xui/fr/panel_nearby_media.xml
new file mode 100644
index 0000000000..36388b0bc1
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_nearby_media.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_media">
+ <string name="media_item_count_format">
+ (%ld articles de média)
+ </string>
+ <string name="empty_item_text">
+ &lt;vide&gt;
+ </string>
+ <string name="parcel_media_name">
+ Flux de média de la parcelle
+ </string>
+ <string name="parcel_audio_name">
+ Flux audio de la parcelle
+ </string>
+ <string name="playing_suffix">
+ (lecture en cours)
+ </string>
+ <panel name="minimized_controls">
+ <button label="Arrêter" name="all_nearby_media_disable_btn" tool_tip="Désactiver tous les médias près de vous"/>
+ <button label="Lire" name="all_nearby_media_enable_btn" tool_tip="Activer tous les médias près de vous"/>
+ <button name="open_prefs_btn" tool_tip="Ouvrir les préférences de média"/>
+ <button label="Plus &gt;&gt;" label_selected="Moins &lt;&lt;" name="more_btn" tool_tip="Options avancées"/>
+ <button label="Plus &gt;&gt;" label_selected="Moins &lt;&lt;" name="less_btn" tool_tip="Options avancées"/>
+ </panel>
+ <panel name="nearby_media_panel">
+ <combo_box name="show_combo">
+ <combo_box.item label="Tout" name="All"/>
+ <combo_box.item label="Sur cette parcelle" name="WithinParcel"/>
+ <combo_box.item label="En dehors de la parcelle" name="OutsideParcel"/>
+ <combo_box.item label="Sur les autres avatars" name="OnOthers"/>
+ </combo_box>
+ <scroll_list name="media_list">
+ <scroll_list.columns label="Proximité" name="media_proximity"/>
+ <scroll_list.columns label="Visible" name="media_visibility"/>
+ <scroll_list.columns label="Classe" name="media_class"/>
+ <scroll_list.columns label="Nom" name="media_name"/>
+ <scroll_list.columns label="Débogage" name="media_debug"/>
+ </scroll_list>
+ <panel>
+ <layout_stack name="media_controls">
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="Arrêter le média sélectionné"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="Lire le média sélectionné"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="Pause du média sélectionné"/>
+ </layout_panel>
+ <layout_panel name="volume_slider_ctrl">
+ <slider_bar initial_value="0.5" name="volume_slider" tool_tip="Volume audio du média sélectionné"/>
+ </layout_panel>
+ <layout_panel name="mute">
+ <button name="mute_btn" tool_tip="Couper l&apos;audio sur le média sélectionné"/>
+ </layout_panel>
+ <layout_panel name="zoom">
+ <button name="zoom_btn" tool_tip="Zoomer en avant sur le média sélectionné"/>
+ </layout_panel>
+ <layout_panel name="unzoom">
+ <button name="unzoom_btn" tool_tip="Zoomer en arrière sur le média sélectionné"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_notes.xml b/indra/newview/skins/default/xui/fr/panel_notes.xml
index b1be274616..1609b6c9d3 100644
--- a/indra/newview/skins/default/xui/fr/panel_notes.xml
+++ b/indra/newview/skins/default/xui/fr/panel_notes.xml
@@ -13,11 +13,11 @@
</scroll_container>
</layout_panel>
<layout_panel name="notes_buttons_panel">
- <button label="Devenir amis" name="add_friend" tool_tip="Proposer à ce résident de devenir votre ami"/>
- <button label="IM" name="im" tool_tip="Ouvrir une session IM"/>
- <button label="Appeler" name="call" tool_tip="Appeler ce résident"/>
+ <button label="Devenir amis" name="add_friend" tool_tip="Proposer à un résident de devenir votre ami"/>
+ <button label="IM" name="im" width="30" tool_tip="Ouvrir une session IM"/>
+ <button label="Appeler" name="call" width="60" tool_tip="Appeler ce résident"/>
<button label="Carte" name="show_on_map_btn" tool_tip="Afficher le résident sur la carte"/>
- <button label="Téléporter" name="teleport" tool_tip="Proposez une téléportation"/>
+ <button label="Téléporter" name="teleport" tool_tip="Proposer une téléportation"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_online_status.xml b/indra/newview/skins/default/xui/fr/panel_online_status.xml
new file mode 100644
index 0000000000..fdc489f375
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_online_status.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="friend_online_status" name="friend_online_status"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_online_status_toast.xml b/indra/newview/skins/default/xui/fr/panel_online_status_toast.xml
new file mode 100644
index 0000000000..fdc489f375
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_online_status_toast.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="friend_online_status" name="friend_online_status"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_outfit_edit.xml b/indra/newview/skins/default/xui/fr/panel_outfit_edit.xml
new file mode 100644
index 0000000000..4c869d05c8
--- /dev/null
+++ b/indra/newview/skins/default/xui/fr/panel_outfit_edit.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray Outfit Edit panel -->
+<panel label="Modification de la tenue" name="outfit_edit">
+ <string name="No Outfit" value="Pas de tenue"/>
+ <string name="unsaved_changes" value="Modifications non enregistrées"/>
+ <string name="now_editing" value="Modification"/>
+ <panel.string name="not_available">
+ (s/o)
+ </panel.string>
+ <panel.string name="unknown">
+ (inconnu)
+ </panel.string>
+ <string name="Filter.All" value="Tout"/>
+ <string name="Filter.Clothes/Body" value="Habits/Corps"/>
+ <string name="Filter.Objects" value="Objets"/>
+ <button label="modifier" name="edit_wearable_btn"/>
+ <text name="title" value="Modifier la tenue"/>
+ <panel label="bottom_panel" name="header_panel">
+ <panel label="bottom_panel" name="outfit_name_and_status">
+ <text name="status" value="Modification..."/>
+ <text name="curr_outfit_name" value="[Current Outfit]"/>
+ </panel>
+ </panel>
+ <layout_stack name="im_panels">
+ <layout_panel label="Panneau de contrôle IM" name="outfit_wearables_panel">
+ <panel label="bottom_panel" name="edit_panel"/>
+ </layout_panel>
+ <layout_panel name="add_wearables_panel">
+ <text name="add_to_outfit_label" value="Ajouter à la tenue :"/>
+ <layout_stack name="filter_panels">
+ <layout_panel label="Panneau de contrôle IM" name="filter_panel">
+ <filter_editor label="Filtre" name="look_item_filter"/>
+ </layout_panel>
+ </layout_stack>
+ <panel label="add_wearables_button_bar" name="add_wearables_button_bar">
+ <button label="D" name="folder_view_btn"/>
+ <button label="L" name="list_view_btn"/>
+ </panel>
+ </layout_panel>
+ </layout_stack>
+ <panel name="save_revert_button_bar">
+ <button label="Enregistrer" name="save_btn"/>
+ <button label="Rétablir" name="revert_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/fr/panel_outfits_inventory.xml
index 3447d54cf8..f4fa3a2838 100644
--- a/indra/newview/skins/default/xui/fr/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/fr/panel_outfits_inventory.xml
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Choses" name="Outfits">
<tab_container name="appearance_tabs">
- <inventory_panel label="MES TENUES" name="outfitslist_tab"/>
- <inventory_panel label="TENUE" name="cof_accordionpanel"/>
+ <panel label="MES TENUES" name="outfitslist_tab"/>
+ <inventory_panel label="PORTÉ" name="cof_tab"/>
</tab_container>
<panel name="bottom_panel">
<button name="options_gear_btn" tool_tip="Afficher d&apos;autres options"/>
<dnd_button name="trash_btn" tool_tip="Supprimer l&apos;objet sélectionné"/>
<button label="Enregistrer la tenue" name="make_outfit_btn" tool_tip="Enregistrer l&apos;apparence comme tenue"/>
<button label="Porter" name="wear_btn" tool_tip="Porter la tenue sélectionnée"/>
- <button label="M" name="look_edit_btn"/>
+ <button label="Modifier tenue" name="edit_current_outfit_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_people.xml b/indra/newview/skins/default/xui/fr/panel_people.xml
index 408a7e67d7..f7eb803d4a 100644
--- a/indra/newview/skins/default/xui/fr/panel_people.xml
+++ b/indra/newview/skins/default/xui/fr/panel_people.xml
@@ -1,13 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Side tray panel -->
<panel label="Résidents" name="people_panel">
- <string name="no_people" value="Personne"/>
- <string name="no_one_near" value="Personne près de vous"/>
+ <string name="no_recent_people" value="Personne de récent. Pour rechercher des résidents avec qui passer du temps, voir [secondlife:///app/search/people Rechercher] ou [secondlife:///app/worldmap Carte du monde]."/>
+ <string name="no_filtered_recent_people" value="Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/people/Rechercher [SEARCH_TERM]]."/>
+ <string name="no_one_near" value="Personne près de vous. Pour rechercher des résidents avec qui passer du temps, voir [secondlife:///app/search/people Rechercher] ou [secondlife:///app/worldmap Carte du monde]."/>
+ <string name="no_one_filtered_near" value="Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/people/Rechercher [SEARCH_TERM]]."/>
<string name="no_friends_online" value="Pas d&apos;amis connectés"/>
<string name="no_friends" value="Pas d&apos;amis"/>
- <string name="no_groups" value="Pas de groupes"/>
+ <string name="no_friends_msg">
+ Pour rechercher des amis, utilisez [secondlife:///app/search/people Rechercher] ou cliquez-droit sur le résident à ajouter comme ami.
+Pour rechercher des résidents avec qui passer du temps, utilisez [secondlife:///app/worldmap Carte du monde].
+ </string>
+ <string name="no_filtered_friends_msg">
+ Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/people/Rechercher [SEARCH_TERM]].
+ </string>
<string name="people_filter_label" value="Filtrer les personnes"/>
<string name="groups_filter_label" value="Filtrer les groupes"/>
+ <string name="no_filtered_groups_msg" value="Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/groups/Rechercher [SEARCH_TERM]]."/>
+ <string name="no_groups_msg" value="Vous souhaitez trouver des groupes à rejoindre ? Utilisez [secondlife:///app/search/groups Rechercher]."/>
<filter_editor label="Filtre" name="filter_input"/>
<tab_container name="tabs">
<panel label="PRÈS DE VOUS" name="nearby_panel">
@@ -16,18 +26,18 @@
<button name="add_friend_btn" tool_tip="Ajouter le résident sélectionné à votre liste d&apos;amis"/>
</panel>
</panel>
- <panel label="AMIS" name="friends_panel">
+ <panel label="MES AMIS" name="friends_panel">
<accordion name="friends_accordion">
<accordion_tab name="tab_online" title="En ligne"/>
<accordion_tab name="tab_all" title="Tout"/>
</accordion>
<panel label="bottom_panel" name="bottom_panel">
<button name="friends_viewsort_btn" tool_tip="Options"/>
- <button name="add_btn" tool_tip="Proposer à ce résident de devenir votre ami"/>
+ <button name="add_btn" tool_tip="Proposer à un résident de devenir votre ami"/>
<button name="del_btn" tool_tip="Supprimer le résident sélectionné de votre liste d&apos;amis"/>
</panel>
</panel>
- <panel label="GROUPES" name="groups_panel">
+ <panel label="MES GROUPES" name="groups_panel">
<panel label="bottom_panel" name="bottom_panel">
<button name="groups_viewsort_btn" tool_tip="Options"/>
<button name="plus_btn" tool_tip="Rejoindre/créer un nouveau groupe"/>
@@ -45,10 +55,10 @@
<button label="Profil" name="view_profile_btn" tool_tip="Afficher la photo, les groupes et autres infos des résidents"/>
<button label="IM" name="im_btn" tool_tip="Ouvrir une session IM"/>
<button label="Appeler" name="call_btn" tool_tip="Appeler ce résident"/>
- <button label="Partager" name="share_btn"/>
- <button label="Téléporter" name="teleport_btn" tool_tip="Proposez une téléportation"/>
- <button label="Profil du groupe" name="group_info_btn" tool_tip="Voir le profil du groupe"/>
- <button label="Chat de groupe" name="chat_btn" tool_tip="Ouvrir une session de chat"/>
- <button label="Appel de groupe" name="group_call_btn" tool_tip="Appeler ce groupe"/>
+ <button label="Partager" name="share_btn" tool_tip="Partager un article d&apos;inventaire"/>
+ <button label="Téléporter" name="teleport_btn" tool_tip="Proposer une téléportation"/>
+ <button label="Profil" name="group_info_btn" tool_tip="Voir le profil du groupe"/>
+ <button label="Chat" name="chat_btn" tool_tip="Ouvrir une session de chat"/>
+ <button label="Appel" name="group_call_btn" tool_tip="Appeler ce groupe"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_place_profile.xml b/indra/newview/skins/default/xui/fr/panel_place_profile.xml
index 7ff796a61f..731e045019 100644
--- a/indra/newview/skins/default/xui/fr/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/fr/panel_place_profile.xml
@@ -6,7 +6,7 @@
<string name="available" value="disponible"/>
<string name="allocated" value="affecté"/>
<string name="title_place" value="Profil du lieu"/>
- <string name="title_teleport_history" value="Emplacement de l&apos;historique des téléportations"/>
+ <string name="title_teleport_history" value="Historique des téléportations"/>
<string name="not_available" value="(s/o)"/>
<string name="unknown" value="(inconnu)"/>
<string name="public" value="(public)"/>
@@ -18,16 +18,16 @@
<string name="all_residents_text" value="Tous les résidents"/>
<string name="group_text" value="Groupe"/>
<string name="can_resell">
- Le terrain acheté dans cette région peut être revendu.
+ Le terrain acheté dans la région peut être revendu.
</string>
<string name="can_not_resell">
- Le terrain acheté dans cette région ne peut pas être revendu.
+ Le terrain acheté dans la région ne peut pas être revendu.
</string>
<string name="can_change">
- Le terrain acheté dans cette région peut être fusionné ou divisé.
+ Le terrain acheté dans la région peut être fusionné ou divisé.
</string>
<string name="can_not_change">
- Le terrain acheté dans cette région ne peut pas être fusionné ou divisé.
+ Le terrain acheté dans la région ne peut être fusionné ou divisé.
</string>
<string name="server_update_text">
Les informations sur le lieu ne sont pas disponibles sans mise à jour du serveur.
@@ -36,26 +36,11 @@
Aucune information sur ce lieu n&apos;est disponible actuellement, veuillez réessayer ultérieurement.
</string>
<string name="server_forbidden_text">
- Les informations sur ce lieu ne sont pas disponibles car l&apos;accès y est restreint. Veuillez vérifier vos permissions auprès du propriétaire de la parcelle.
+ Les informations sur ce lieu ne sont pas disponibles car l&apos;accès y est restreint. Veuillez vérifier vos droits auprès du propriétaire de la parcelle.
</string>
<string name="acquired_date">
[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
</string>
- <string name="icon_PG" value="parcel_drk_PG"/>
- <string name="icon_M" value="parcel_drk_M"/>
- <string name="icon_R" value="parcel_drk_R"/>
- <string name="icon_Voice" value="parcel_drk_Voice"/>
- <string name="icon_VoiceNo" value="parcel_drk_VoiceNo"/>
- <string name="icon_Fly" value="parcel_drk_Fly"/>
- <string name="icon_FlyNo" value="parcel_drk_FlyNo"/>
- <string name="icon_Push" value="parcel_drk_Push"/>
- <string name="icon_PushNo" value="parcel_drk_PushNo"/>
- <string name="icon_Build" value="parcel_drk_Build"/>
- <string name="icon_BuildNo" value="parcel_drk_BuildNo"/>
- <string name="icon_Scripts" value="parcel_drk_Scripts"/>
- <string name="icon_ScriptsNo" value="parcel_drk_ScriptsNo"/>
- <string name="icon_Damage" value="parcel_drk_Damage"/>
- <string name="icon_DamageNo" value="parcel_drk_DamageNo"/>
<button name="back_btn" tool_tip="Précédent"/>
<text name="title" value="Profil du lieu"/>
<scroll_container name="place_scroll">
@@ -68,59 +53,59 @@
<text name="maturity_value" value="(inconnu)"/>
<accordion name="advanced_info_accordion">
<accordion_tab name="parcel_characteristics_tab" title="Parcelle">
- <panel>
- <text name="rating_label" value="Catégorie :"/>
- <text name="rating_value" value="(inconnu)"/>
- <text name="voice_label" value="Voix :"/>
- <text name="voice_value" value="Activée"/>
- <text name="fly_label" value="Voler :"/>
+ <panel name="parcel_characteristics_panel">
+ <text name="rating_label" value="Catégorie :"/>
+ <text name="rating_value" value="inconnu"/>
+ <text name="voice_label" value="Voix :"/>
+ <text name="voice_value" value="Activé"/>
+ <text name="fly_label" value="Voler :"/>
<text name="fly_value" value="Activé"/>
- <text name="push_label" value="Appuyer :"/>
+ <text name="push_label" value="Pousser :"/>
<text name="push_value" value="Désactivé"/>
- <text name="build_label" value="Construire :"/>
+ <text name="build_label" value="Construire :"/>
<text name="build_value" value="Activé"/>
- <text name="scripts_label" value="Scripts :"/>
- <text name="scripts_value" value="Activés"/>
- <text name="damage_label" value="Dégâts :"/>
- <text name="damage_value" value="Désactivés"/>
- <button label="À propos des terrains" name="about_land_btn"/>
+ <text name="scripts_label" value="Scripts :"/>
+ <text name="scripts_value" value="Activé"/>
+ <text name="damage_label" value="Dégâts :"/>
+ <text name="damage_value" value="Désactivé"/>
+ <button label="À propos du terrain" name="about_land_btn"/>
</panel>
</accordion_tab>
<accordion_tab name="region_information_tab" title="Région">
- <panel>
+ <panel name="region_information_panel">
<text name="region_name_label" value="Région :"/>
<text name="region_name" value="Pays des orignaux"/>
- <text name="region_type_label" value="Type :"/>
+ <text name="region_type_label" value="Type :"/>
<text name="region_type" value="Orignal"/>
- <text name="region_rating_label" value="Catégorie :"/>
+ <text name="region_rating_label" value="Catégorie :"/>
<text name="region_rating" value="Adulte"/>
- <text name="region_owner_label" value="Propriétaire :"/>
+ <text name="region_owner_label" value="Propriétaire :"/>
<text name="region_owner" value="orignal Van Orignal"/>
- <text name="region_group_label" value="Groupe :"/>
+ <text name="region_group_label" value="Groupe :"/>
<text name="region_group">
- Le puissant orignal d&apos;Orignalville
+ Le puissant orignal d’Orignalville
</text>
<button label="Région/Domaine" name="region_info_btn"/>
</panel>
</accordion_tab>
<accordion_tab name="estate_information_tab" title="Domaine">
- <panel>
- <text name="estate_name_label" value="Domaine :"/>
- <text name="estate_rating_label" value="Catégorie :"/>
- <text name="estate_owner_label" value="Propriétaire :"/>
- <text name="covenant_label" value="Règlement :"/>
+ <panel name="estate_information_panel">
+ <text name="estate_name_label" value="Domaine :"/>
+ <text name="estate_rating_label" value="Catégorie :"/>
+ <text name="estate_owner_label" value="Propriétaire :"/>
+ <text name="covenant_label" value="Règlement :"/>
</panel>
</accordion_tab>
<accordion_tab name="sales_tab" title="À vendre">
- <panel>
- <text name="sales_price_label" value="Prix :"/>
+ <panel name="sales_panel">
+ <text name="sales_price_label" value="Prix :"/>
<text name="area_label" value="Surface :"/>
<text name="traffic_label" value="Trafic :"/>
<text name="primitives_label" value="Prims :"/>
- <text name="parcel_scripts_label" value="Scripts :"/>
- <text name="terraform_limits_label" value="Limites de terraformage :"/>
- <text name="subdivide_label" value="Possibilité de division/fusion :"/>
- <text name="resale_label" value="Possibilité de revente :"/>
+ <text name="parcel_scripts_label" value="Scripts :"/>
+ <text name="terraform_limits_label" value="Limites de terraformage :"/>
+ <text name="subdivide_label" value="Possibilité de sous-division/fusion :"/>
+ <text name="resale_label" value="Possibilité de revente :"/>
<text name="sale_to_label" value="À vendre à :"/>
</panel>
</accordion_tab>
diff --git a/indra/newview/skins/default/xui/fr/panel_places.xml b/indra/newview/skins/default/xui/fr/panel_places.xml
index 3cea86a3e4..9990c4612d 100644
--- a/indra/newview/skins/default/xui/fr/panel_places.xml
+++ b/indra/newview/skins/default/xui/fr/panel_places.xml
@@ -1,15 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Lieux" name="places panel">
<string name="landmarks_tab_title" value="MES REPÈRES"/>
- <string name="teleport_history_tab_title" value="HISTORIQUE DES TÉLÉPORTATIONS"/>
- <filter_editor label="Filtrer les lieux" name="Filter"/>
+ <string name="teleport_history_tab_title" value="HISTORIQUE DES TÉLÉP."/>
+ <filter_editor label="Filtrer les endroits" name="Filter"/>
<panel name="button_panel">
<button label="Téléporter" name="teleport_btn" tool_tip="Me téléporter jusqu&apos;à la zone sélectionnée"/>
<button label="Carte" name="map_btn"/>
<button label="Éditer" name="edit_btn" tool_tip="Modifier les informations du repère"/>
- <button name="overflow_btn" tool_tip="Afficher d&apos;autres options"/>
- <button label="Fermer" name="close_btn"/>
- <button label="Annuler" name="cancel_btn"/>
+ <button label="â–¼" name="overflow_btn" tool_tip="Afficher d&apos;autres options"/>
<button label="Enregistrer" name="save_btn"/>
+ <button label="Annuler" name="cancel_btn"/>
+ <button label="Fermer" name="close_btn"/>
+ <button label="Profil" name="profile_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml
index 04abcc8aad..6b8e68bd98 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_advanced.xml
@@ -1,48 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
-<panel name="advanced">
- <panel.string name="resolution_format">
- [RES_X] x [RES_Y]
- </panel.string>
+<panel label="Avancées" name="advanced">
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
- <check_box label="Bulles de chat" name="bubble_text_chat"/>
- <color_swatch name="background" tool_tip="Choisir la couleur des bulles de chat"/>
- <slider label="Opacité" name="bubble_chat_opacity"/>
- <text name="AspectRatioLabel1" tool_tip="largeur/hauteur">
- Rapport hauteur/largeur
- </text>
- <combo_box name="aspect_ratio" tool_tip="largeur/hauteur">
- <combo_box.item label="4:3 (Standard CRT)" name="item1"/>
- <combo_box.item label="5:4 (1280 x 1024 LCD)" name="item2"/>
- <combo_box.item label="8:5 (écran large)" name="item3"/>
- <combo_box.item label="16:9 (plein écran)" name="item4"/>
- </combo_box>
- <check_box label="Détection automatique" name="aspect_auto_detect"/>
- <text name="heading1">
- Caméra :
- </text>
+ <panel.string name="middle_mouse">
+ Bouton central de la souris
+ </panel.string>
<slider label="Angle de vue" name="camera_fov"/>
<slider label="Distance" name="camera_offset_scale"/>
<text name="heading2">
- Positionnement automatique pour :
+ Positionnement automatique pour :
</text>
- <check_box label="Construire/Éditer" name="edit_camera_movement" tool_tip="Utilisez le positionnement automatique de la caméra quand vous accédez au mode de modification et quand vous le quittez"/>
+ <check_box label="Construire/Modifier" name="edit_camera_movement" tool_tip="Utilisez le positionnement automatique de la caméra quand vous accédez au mode de modification et quand vous le quittez"/>
<check_box label="Apparence" name="appearance_camera_movement" tool_tip="Utiliser le positionnement automatique de la caméra quand je suis en mode Édition"/>
- <text name="heading3">
- Avatars :
- </text>
+ <check_box label="Panneau latéral" name="appearance_sidebar_positioning" tool_tip="Positionnement auto de la caméra pour le panneau latéral"/>
<check_box label="Afficher en vue subjective" name="first_person_avatar_visible"/>
<check_box label="Les touches de direction me font toujours me déplacer" name="arrow_keys_move_avatar_check"/>
<check_box label="Appuyer deux fois et maintenir enfoncé pour courir" name="tap_tap_hold_to_run"/>
<check_box label="Faire bouger les lèvres de l&apos;avatar quand il parle" name="enable_lip_sync"/>
- <check_box label="Afficher les erreurs de script" name="show_script_errors"/>
+ <check_box label="Bulles de chat" name="bubble_text_chat"/>
+ <slider label="Opacité" name="bubble_chat_opacity"/>
+ <color_swatch name="background" tool_tip="Choisir la couleur des bulles de chat"/>
+ <text name="UI Size:">
+ Taille de l&apos;interface
+ </text>
+ <check_box label="Afficher les erreurs de script dans :" name="show_script_errors"/>
<radio_group name="show_location">
- <radio_item label="En chat" name="0"/>
- <radio_item label="Dans une fenêtre" name="1"/>
+ <radio_item label="Chat près de moi" name="0"/>
+ <radio_item label="Autre fenêtre" name="1"/>
</radio_group>
- <check_box label="Basculer le mode micro quand j&apos;appuie sur la touche de contrôle de la fonction Parler :" name="push_to_talk_toggle_check" tool_tip="En mode bascule, appuyez une fois sur la touche de contrôle de la fonction, puis relâchez-la pour activer/désactiver votre micro. Si vous n&apos;êtes pas en mode bascule, le micro ne diffuse votre voix que quand vous maintenez la touche de contrôle de la fonction enfoncée."/>
+ <check_box label="Activer/désactiver la fonction Parler quand j&apos;appuie sur :" name="push_to_talk_toggle_check" tool_tip="En mode bascule, appuyez une fois sur la touche de contrôle de la fonction, puis relâchez-la pour activer/désactiver votre micro. Si vous n&apos;êtes pas en mode bascule, le micro ne diffuse votre voix que quand vous maintenez la touche de contrôle de la fonction enfoncée."/>
<line_editor label="Touche de contrôle de la fonction Appuyer pour parler" name="modifier_combo"/>
<button label="Définir la touche" name="set_voice_hotkey_button"/>
- <button label="Bouton central de la souris" name="set_voice_middlemouse_button"/>
+ <button label="Bouton central de la souris" name="set_voice_middlemouse_button" tool_tip="Réinitialiser sur le bouton central de la souris"/>
+ <button label="Autres accessoires" name="joystick_setup_button"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/fr/panel_preferences_alerts.xml
index 73f4e1e2bd..901a92ed1b 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_alerts.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_alerts.xml
@@ -6,9 +6,9 @@
<check_box label="Quand je dépense ou que je reçois des L$" name="notify_money_change_checkbox"/>
<check_box label="Quand mes amis se connectent ou se déconnectent" name="friends_online_notify_checkbox"/>
<text name="show_label">
- Toujours afficher ces notifications :
+ Toujours afficher :
</text>
<text name="dont_show_label">
- Ne jamais afficher ces notifications :
+ Ne jamais afficher :
</text>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
index 25a8e3b6d4..76f3319525 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
@@ -1,10 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Chat écrit" name="chat">
+ <text name="font_size">
+ Taille de la police :
+ </text>
<radio_group name="chat_font_size">
- <radio_item label="Moins" name="radio" value="0"/>
+ <radio_item label="Petite" name="radio" value="0"/>
<radio_item label="Moyenne" name="radio2" value="1"/>
- <radio_item label="Plus" name="radio3" value="2"/>
+ <radio_item label="Grande" name="radio3" value="2"/>
</radio_group>
+ <text name="font_colors">
+ Couleurs de police :
+ </text>
<color_swatch label="Vous" name="user"/>
<text name="text_box1">
Moi
@@ -39,9 +45,15 @@
</text>
<check_box initial_value="true" label="Jouer l&apos;animation clavier quand vous écrivez" name="play_typing_animation"/>
<check_box label="M&apos;envoyer les IM par e-mail une fois déconnecté" name="send_im_to_email"/>
- <check_box label="Activer l&apos;historique des chats en texte brut" name="plain_text_chat_history"/>
+ <check_box label="Activer l&apos;historique des chats et des IM en texte brut" name="plain_text_chat_history"/>
+ <text name="show_ims_in_label">
+ Afficher les IM dans :
+ </text>
+ <text name="requires_restart_label">
+ (redémarrage requis)
+ </text>
<radio_group name="chat_window" tool_tip="Afficher vos messages instantanés dans plusieurs fenêtres ou dans une seule fenêtre avec plusieurs onglets (redémarrage requis)">
<radio_item label="Plusieurs fenêtres" name="radio" value="0"/>
- <radio_item label="Une fenêtre" name="radio2" value="1"/>
+ <radio_item label="Onglets" name="radio2" value="1"/>
</radio_group>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml
index b359cf56d8..8e8ee26af4 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml
@@ -44,17 +44,17 @@
<radio_item label="Activé" name="radio2" value="1"/>
<radio_item label="Afficher brièvement" name="radio3" value="2"/>
</radio_group>
- <check_box label="Afficher mon nom" name="show_my_name_checkbox1"/>
+ <check_box label="Montrer mon nom" name="show_my_name_checkbox1"/>
<check_box initial_value="true" label="Affichage en petit" name="small_avatar_names_checkbox"/>
<check_box label="Afficher les titres de groupe" name="show_all_title_checkbox1"/>
<text name="effects_color_textbox">
Mes effets :
</text>
<text name="title_afk_text">
- Délai d&apos;absence :
+ Me montrer absent après :
</text>
<color_swatch label="" name="effect_color_swatch" tool_tip="Cliquer pour ouvrir le sélecteur de couleurs"/>
- <combo_box label="Délai d&apos;absence :" name="afk">
+ <combo_box label="Me montrer absent après :" name="afk">
<combo_box.item label="2 minutes" name="item0"/>
<combo_box.item label="5 minutes" name="item1"/>
<combo_box.item label="10 minutes" name="item2"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
index 4459244395..c7caf5c2ff 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_graphics1.xml
@@ -1,27 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Graphiques" name="Display panel">
- <text name="WindowSizeLabel">
- Taille de la fenêtre :
- </text>
- <check_box label="Utiliser le plein écran" name="windowed mode"/>
- <combo_box name="windowsize combo">
- <combo_box.item label="640 x 480" name="640x480"/>
- <combo_box.item label="800 x 600" name="800x600"/>
- <combo_box.item label="720 x 480 (NTSC)" name="720x480"/>
- <combo_box.item label="768 x 576 (PAL)" name="768x576"/>
- <combo_box.item label="1024 x 768" name="1024x768"/>
- </combo_box>
- <text name="UI Size:">
- Taille de l&apos;interface :
- </text>
<text name="QualitySpeed">
Qualité et vitesse :
</text>
- <text left="105" name="FasterText">
+ <text name="FasterText">
Plus rapide
</text>
<text name="BetterText">
- Meilleur
+ Meilleure
</text>
<text name="ShadersPrefText">
Faible
@@ -62,7 +48,11 @@
<text name="DrawDistanceMeterText2">
m
</text>
- <slider label="Nombre de particules max. :" label_width="143" name="MaxParticleCount"/>
+ <slider label="Nombre de particules max. :" label_width="147" name="MaxParticleCount"/>
+ <slider label="Limite d&apos;affichage max des avatars :" name="MaxAvatarDrawDistance"/>
+ <text name="DrawDistanceMeterText3">
+ m
+ </text>
<slider label="Qualité post-traitement :" name="RenderPostProcess"/>
<text name="MeshDetailText">
Détails des rendus :
@@ -98,8 +88,8 @@
Sources lumineuses :
</text>
<radio_group name="LightingDetailRadio">
- <radio_item label="Soleil et lune uniquement" name="SunMoon"/>
- <radio_item label="Lumières à proximité" name="LocalLights"/>
+ <radio_item label="Soleil et lune uniquement" name="SunMoon" value="0"/>
+ <radio_item label="Lumières à proximité" name="LocalLights" value="1"/>
</radio_group>
<text left="380" name="TerrainDetailText">
Rendu du terrain :
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml
index 88b68d1a06..f14ccc3a8e 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_privacy.xml
@@ -3,7 +3,7 @@
<panel.string name="log_in_to_change">
se connecter pour changer
</panel.string>
- <button label="Vider le cache" name="clear_cache"/>
+ <button label="Vider le cache" name="clear_cache" tool_tip="Effacer l&apos;image de connexion, le dernier lieu, l&apos;historique des téléportations et la texture du cache."/>
<text name="cache_size_label_l">
(Endroits, images, web, historique des recherches)
</text>
@@ -11,14 +11,12 @@
<check_box label="Seuls mes amis et groupes peuvent m&apos;appeler ou m&apos;envoyer un IM" name="voice_call_friends_only_check"/>
<check_box label="Fermer le micro à la fin d&apos;un appel" name="auto_disengage_mic_check"/>
<check_box label="Accepter les cookies" name="cookies_enabled"/>
- <check_box label="Média activé" name="media_enabled"/>
- <check_box label="Autoriser la lecture automatique du média" name="autoplay_enabled"/>
<text name="Logs:">
Journaux :
</text>
<check_box label="Sauvegarder les chats près de moi sur mon ordinateur" name="log_nearby_chat"/>
<check_box label="Sauvegarder les IM sur mon ordinateur" name="log_instant_messages"/>
- <check_box label="Inclure les heures" name="show_timestamps_check_im"/>
+ <check_box label="Inclure les dates et heures" name="show_timestamps_check_im"/>
<text name="log_path_desc">
Emplacement :
</text>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
index 68a735df90..eae49e7810 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_setup.xml
@@ -17,30 +17,33 @@
<text name="text_box2">
kbps
</text>
- <check_box label="Port de connexion personnalisé" name="connection_port_enabled"/>
- <spinner label="Numéro de port :" name="web_proxy_port"/>
+ <check_box label="Port de connexion" name="connection_port_enabled"/>
+ <spinner label="Numéro :" name="connection_port"/>
<text name="cache_size_label_l">
Taille de la mémoire
</text>
<text name="text_box5">
Mo
</text>
- <button label="Parcourir" label_selected="Parcourir" name="set_cache"/>
- <button label="Réinitialiser" label_selected="Réinitialiser" name="reset_cache"/>
<text name="Cache location">
Emplacement du cache :
</text>
+ <button label="Parcourir" label_selected="Parcourir" name="set_cache"/>
+ <button label="Réinitialiser" label_selected="Réinitialiser" name="reset_cache"/>
<text name="Web:">
Web :
</text>
<radio_group name="use_external_browser">
- <radio_item label="Utiliser le navigateur intégré" name="internal" tool_tip="Utilisez le navigateur intégré pour obtenir de l&apos;aide, ouvrir des liens, etc. Ce navigateur s&apos;ouvre dans [APP_NAME]."/>
- <radio_item label="Utiliser mon navigateur (IE, Firefox etc.)" name="external" tool_tip="Utiliser le navigateur web système par défaut pour l&apos;aide, les liens etc. Non recommandé en mode plein écran."/>
+ <radio_item label="Utiliser mon navigateur (IE, Firefox, Safari)" name="external" tool_tip="Utiliser le navigateur web système par défaut pour l&apos;aide, les liens etc. Non recommandé en mode plein écran." value="1"/>
+ <radio_item label="Utiliser le navigateur intégré" name="internal" tool_tip="Utilisez le navigateur intégré pour obtenir de l&apos;aide, ouvrir des liens, etc. Ce navigateur s&apos;ouvre dans [APP_NAME]." value=""/>
</radio_group>
- <check_box initial_value="false" label="Proxy web" name="web_proxy_enabled"/>
- <line_editor name="web_proxy_editor" tool_tip="Le nom ou adresse IP du proxy que vous souhaitez utiliser"/>
- <button label="Parcourir" label_selected="Parcourir" name="set_proxy"/>
+ <check_box initial_value="true" label="Activer les plugins" name="browser_plugins_enabled"/>
+ <check_box initial_value="true" label="Accepter les cookies" name="cookies_enabled"/>
+ <check_box initial_value="true" label="Activer Javascript" name="browser_javascript_enabled"/>
+ <check_box initial_value="false" label="Activer le proxy Web" name="web_proxy_enabled"/>
<text name="Proxy location">
Emplacement du proxy :
</text>
+ <line_editor name="web_proxy_editor" tool_tip="Le nom ou adresse IP du proxy que vous souhaitez utiliser"/>
+ <spinner label="Numéro de port :" label_width="95" name="web_proxy_port" width="170"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml
index 4f5ef423f5..c9676c898b 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_sound.xml
@@ -1,16 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Sons" name="Preference Media panel">
<slider label="Volume principal" name="System Volume"/>
- <check_box initial_value="true" label="Couper le son si minimisé" name="mute_when_minimized"/>
- <slider label="Ambiant" name="Wind Volume"/>
+ <check_box initial_value="true" label="Couper quand minimisé" name="mute_when_minimized"/>
<slider label="Boutons" name="UI Volume"/>
- <slider label="Média" name="Media Volume"/>
+ <slider label="Ambiant" name="Wind Volume"/>
<slider label="Effets sonores" name="SFX Volume"/>
<slider label="Flux musical" name="Music Volume"/>
- <check_box label="Activer le chat vocal" name="enable_voice_check"/>
+ <check_box label="Activé" name="music_enabled"/>
+ <slider label="Média" name="Media Volume"/>
+ <check_box label="Activé" name="enable_media"/>
<slider label="Chat vocal" name="Voice Volume"/>
+ <check_box label="Activé" name="enable_voice_check"/>
+ <check_box label="Autoriser la lecture automatique du média" name="media_auto_play_btn" tool_tip="Cochez pour autoriser la lecture automatique du média"/>
+ <check_box label="Jouer le média aux autres avatars" name="media_show_on_others_btn" tool_tip="Décochez pour masquer le média aux autres avatars près de vous"/>
+ <text name="voice_chat_settings">
+ Paramètres du chat vocal
+ </text>
<text name="Listen from">
- Écouter à partir de :
+ Écouter à partir de :
</text>
<radio_group name="ear_location">
<radio_item label="Position de la caméra" name="0"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/fr/panel_prim_media_controls.xml
index c7ab31c4b3..f6b9bdcb81 100644
--- a/indra/newview/skins/default/xui/fr/panel_prim_media_controls.xml
+++ b/indra/newview/skins/default/xui/fr/panel_prim_media_controls.xml
@@ -31,7 +31,7 @@
<button name="stop_btn" tool_tip="Arrêter le chargement"/>
</layout_panel>
<layout_panel name="play">
- <button name="play_btn" tool_tip="Jouer le média"/>
+ <button name="play_btn" tool_tip="Lire le média"/>
</layout_panel>
<layout_panel name="pause">
<button name="pause_btn" tool_tip="Pauser le média"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_profile.xml b/indra/newview/skins/default/xui/fr/panel_profile.xml
index 0c33a0f1e0..f1c12c9fee 100644
--- a/indra/newview/skins/default/xui/fr/panel_profile.xml
+++ b/indra/newview/skins/default/xui/fr/panel_profile.xml
@@ -24,25 +24,29 @@
<text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
</panel>
<panel name="first_life_image_panel">
- <text name="title_rw_descr_text" value="Monde physique :"/>
+ <text name="title_rw_descr_text" value="Vie réelle :"/>
</panel>
<text name="title_member_text" value="Résident depuis :"/>
<text name="title_acc_status_text" value="Statut du compte :"/>
- <text name="acc_status_text">
+ <text_editor name="acc_status_text">
Résident. Aucune info de paiement enregistrée.
Linden.
- </text>
+ </text_editor>
<text name="title_partner_text" value="Partenaire :"/>
+ <panel name="partner_data_panel">
+ <name_box initial_value="(récupération en cours)" name="partner_text"/>
+ </panel>
<text name="title_groups_text" value="Groupes :"/>
</panel>
</scroll_container>
</layout_panel>
<layout_panel name="profile_buttons_panel">
- <button label="Devenir amis" name="add_friend" tool_tip="Proposer à ce résident de devenir votre ami"/>
+ <button label="Devenir amis" name="add_friend" tool_tip="Proposer à un résident de devenir votre ami"/>
<button label="IM" name="im" tool_tip="Ouvrir une session IM"/>
<button label="Appeler" name="call" tool_tip="Appeler ce résident"/>
<button label="Carte" name="show_on_map_btn" tool_tip="Afficher le résident sur la carte"/>
- <button label="Téléporter" name="teleport" tool_tip="Proposez une téléportation"/>
+ <button label="Téléporter" name="teleport" tool_tip="Proposer une téléportation"/>
+ <button label="▼" name="overflow_btn" tool_tip="Payer ou partager l&apos;inventaire avec le résident"/>
</layout_panel>
<layout_panel name="profile_me_buttons_panel">
<button label="Modifier le profil" name="edit_profile_btn" tool_tip="Modifier vos informations personnelles"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_region_covenant.xml b/indra/newview/skins/default/xui/fr/panel_region_covenant.xml
index cf9f4e0fd0..a30306d116 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_covenant.xml
@@ -18,7 +18,7 @@
<text name="estate_cov_lbl">
Règlement :
</text>
- <text name="covenant_timestamp_text">
+ <text name="covenant_timestamp_text" width="350">
Dernière modification le mercredi 31 décembre 1969 16:00:00
</text>
<button label="?" name="covenant_help"/>
@@ -27,8 +27,8 @@
</text_editor>
<button label="Réinitialiser" name="reset_covenant"/>
<text name="covenant_help_text">
- Les changements apportés au règlement apparaîtront sur toutes
- les parcelles du domaine.
+ Les changements apportés au règlement apparaîtront sur
+toutes les parcelles du domaine.
</text>
<text bottom_delta="-31" name="covenant_instructions">
Faire glisser une note pour changer le règlement de ce domaine.
@@ -70,13 +70,12 @@
Le terrain acheté dans cette région peut être revendu.
</string>
<string name="can_not_resell">
- Le terrain acheté dans cette région ne peut pas être revendu.
+ Le terrain acheté dans la région ne peut pas être revendu.
</string>
<string name="can_change">
- Le terrain acheté dans cette région peut être fusionné ou divisé.
+ Le terrain acheté dans la région peut être fusionné ou divisé.
</string>
<string name="can_not_change">
- Le terrain acheté dans cette région ne peut pas être fusionné ou
-divisé.
+ Le terrain acheté dans la région ne peut être fusionné ou divisé.
</string>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_region_debug.xml b/indra/newview/skins/default/xui/fr/panel_region_debug.xml
index 0fabf92889..cb4a74e142 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_debug.xml
@@ -13,7 +13,7 @@
<check_box label="Désactiver la physique" name="disable_physics_check" tool_tip="Désactiver tous les effets liés à la physique dans cette région"/>
<button label="?" name="disable_physics_help"/>
<button bottom_delta="-38" label="Appliquer" name="apply_btn"/>
- <text bottom_delta="-42" name="objret_text_lbl">
+ <text bottom_delta="-42" name="objret_text_lbl" width="260">
Renvoi de l&apos;objet
</text>
<text name="resident_text_lbl">
diff --git a/indra/newview/skins/default/xui/fr/panel_region_estate.xml b/indra/newview/skins/default/xui/fr/panel_region_estate.xml
index a0282dd940..fb650ff646 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_estate.xml
@@ -1,9 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Domaine" name="Estate">
<text bottom="-34" name="estate_help_text">
- Les modifications des paramètres de cet onglet affecteront toutes les régions du domaine.
+ Les modifications des paramètres de cet
+onglet affecteront toutes les régions du
+domaine.
</text>
- <text bottom_delta="-34" name="estate_text">
+ <text bottom_delta="-34" name="estate_text" top_pad="8">
Domaine :
</text>
<text name="estate_name">
@@ -18,8 +20,8 @@
<text name="Only Allow">
Limiter l&apos;accès aux comptes vérifiés par :
</text>
- <check_box label="Informations de paiement enregistrées" name="limit_payment" tool_tip="Bannir les résidents non identifiés"/>
- <check_box label="Vérification de mon âge" name="limit_age_verified" tool_tip="Bannir les résidents qui n&apos;ont pas vérifié leur âge. Consultez la page [SUPPORT_SITE] pour plus d&apos;informations."/>
+ <check_box label="Infos de paiement enregistrées" name="limit_payment" tool_tip="Bannir les résidents non identifiés"/>
+ <check_box label="Vérification de l&apos;âge" name="limit_age_verified" tool_tip="Bannir les résidents qui n&apos;ont pas vérifié leur âge. Consultez la page [SUPPORT_SITE] pour plus d&apos;informations."/>
<check_box label="Autoriser les chats vocaux" name="voice_chat_check"/>
<button label="?" name="voice_chat_help"/>
<text name="abuse_email_text">
@@ -71,6 +73,6 @@
<button label="?" name="ban_resident_help"/>
<button label="Ajouter..." name="add_banned_avatar_btn"/>
<button label="Supprimer..." name="remove_banned_avatar_btn"/>
- <button label="Envoyer un message au domaine..." name="message_estate_btn"/>
- <button label="Éjecter le résident du domaine..." name="kick_user_from_estate_btn"/>
+ <button label="Message au domaine..." name="message_estate_btn"/>
+ <button label="Éjecter du domaine..." name="kick_user_from_estate_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_region_general.xml b/indra/newview/skins/default/xui/fr/panel_region_general.xml
index 8a59adbd93..925f4375da 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_general.xml
@@ -19,35 +19,25 @@
(inconnu)
</text>
<check_box label="Interdire le terraformage" name="block_terraform_check"/>
- <button label="?" name="terraform_help"/>
<check_box label="Interdire le vol" name="block_fly_check"/>
- <button label="?" name="fly_help"/>
<check_box label="Autoriser les dégâts" name="allow_damage_check"/>
- <button label="?" name="damage_help"/>
<check_box label="Interdire les bousculades" name="restrict_pushobject"/>
- <button label="?" name="restrict_pushobject_help"/>
<check_box label="Autoriser la revente" name="allow_land_resell_check"/>
- <button label="?" name="land_resell_help"/>
<check_box label="Autoriser la fusion/division" name="allow_parcel_changes_check"/>
- <button label="?" name="parcel_changes_help"/>
<check_box label="Ne pas afficher dans la recherche" name="block_parcel_search_check" tool_tip="Afficher cette région et ses parcelles dans les résultats de recherche"/>
- <button label="?" name="parcel_search_help"/>
- <spinner label="Nombre maximum d&apos;avatars" label_width="127" name="agent_limit_spin" width="190"/>
- <button label="?" name="agent_limit_help"/>
- <spinner label="Bonus objet" label_width="127" name="object_bonus_spin" width="190"/>
- <button label="?" name="object_bonus_help"/>
+ <spinner label="Nombre maximum d&apos;avatars" label_width="160" name="agent_limit_spin" width="240"/>
+ <spinner label="Bonus objet" label_width="160" name="object_bonus_spin" width="240"/>
<text label="Maturité" name="access_text">
Catégorie :
</text>
- <combo_box label="Modéré" name="access_combo">
- <combo_box.item label="Adult" name="Adult"/>
- <combo_box.item label="Modéré" name="Mature"/>
- <combo_box.item label="Général" name="PG"/>
- </combo_box>
- <button label="?" name="access_help"/>
+ <icons_combo_box label="Modéré" name="access_combo">
+ <icons_combo_box.item label="Adult" name="Adult" value="42"/>
+ <icons_combo_box.item label="Modéré" name="Mature" value="21"/>
+ <icons_combo_box.item label="Général" name="PG" value="13"/>
+ </icons_combo_box>
<button label="Appliquer" name="apply_btn"/>
- <button label="Téléporter un résident chez lui..." name="kick_btn"/>
- <button label="Téléporter tous les résidents chez eux..." name="kick_all_btn"/>
+ <button label="Téléporter un résident chez lui…" name="kick_btn"/>
+ <button label="Téléporter tous les résidents chez eux…" name="kick_all_btn"/>
<button label="Envoyer un message à la région..." name="im_btn"/>
<button label="Gérer le Téléhub..." name="manage_telehub_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_region_general_layout.xml b/indra/newview/skins/default/xui/fr/panel_region_general_layout.xml
index 0e72bbc9f5..663ae55134 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_general_layout.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_general_layout.xml
@@ -3,19 +3,19 @@
<text name="region_text_lbl">
Région :
</text>
- <text name="region_text">
+ <text left_delta="56" name="region_text">
inconnu
</text>
<text name="version_channel_text_lbl">
Version :
</text>
- <text name="version_channel_text">
+ <text left_delta="56" name="version_channel_text">
inconnu
</text>
<text name="region_type_lbl">
Type :
</text>
- <text name="region_type">
+ <text left_delta="56" name="region_type">
inconnu
</text>
<check_box label="Interdire le terraformage" name="block_terraform_check"/>
@@ -25,8 +25,8 @@
<check_box label="Autoriser la revente de terrains" name="allow_land_resell_check"/>
<check_box label="Autoriser la fusion/division de terrains" name="allow_parcel_changes_check"/>
<check_box label="Interdire l&apos;affichage du terrain dans les recherches" name="block_parcel_search_check" tool_tip="Permettre aux autres résidents de voir cette région et ses parcelles dans les résultats de recherche"/>
- <spinner label="Nombre maximum d&apos;avatars" name="agent_limit_spin"/>
- <spinner label="Bonus objet" name="object_bonus_spin"/>
+ <spinner label="Nombre maximum d&apos;avatars" label_width="160" name="agent_limit_spin" width="240"/>
+ <spinner label="Bonus objet" label_width="160" name="object_bonus_spin" width="240"/>
<text label="Accès" name="access_text">
Catégorie :
</text>
@@ -36,8 +36,8 @@
<combo_box.item label="Général" name="PG"/>
</combo_box>
<button label="Appliquer" name="apply_btn"/>
- <button label="Téléporter un résident chez lui..." name="kick_btn"/>
- <button label="Téléporter tous les résidents chez eux..." name="kick_all_btn"/>
+ <button label="Téléporter un résident chez lui…" name="kick_btn"/>
+ <button label="Téléporter tous les résidents chez eux…" name="kick_all_btn"/>
<button label="Envoyer un message à la région..." name="im_btn"/>
<button label="Gérer le téléhub..." name="manage_telehub_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_region_texture.xml b/indra/newview/skins/default/xui/fr/panel_region_texture.xml
index a7abb49b1a..c0b667137a 100644
--- a/indra/newview/skins/default/xui/fr/panel_region_texture.xml
+++ b/indra/newview/skins/default/xui/fr/panel_region_texture.xml
@@ -28,25 +28,25 @@
Limites d&apos;élévation de texture
</text>
<text name="height_text_lbl6">
- Sud-ouest
+ Nord-ouest
</text>
<text name="height_text_lbl7">
- Nord-ouest
+ Nord-est
</text>
<text name="height_text_lbl8">
- Sud-est
+ Sud-ouest
</text>
<text name="height_text_lbl9">
- Nord-est
+ Sud-est
</text>
- <text name="height_text_lbl10">
+ <text name="height_text_lbl10" width="460">
Ces valeurs représentent les limites de mélange pour les textures ci-dessus.
</text>
<text name="height_text_lbl11">
- En mètres, la valeur Bas correspond à la hauteur maximum de la texture n°1 et la valeur Haut correspond à la hauteur minimum de la texture n°4.
+ En mètres, la valeur Bas correspond à la hauteur max. de la texture n°1
</text>
<text name="height_text_lbl12">
- et la valeur Haut correspond à la hauteur minimum de la texture n°4.
+ et la valeur Haut correspond à la hauteur min. de la texture n°4.
</text>
<text name="height_text_lbl13">
Nord-est
@@ -63,10 +63,10 @@
Ces valeurs représentent les limites de mélange pour les textures ci-dessus.
</text>
<text name="height_text_lbl15">
- En mètres, la valeur BASSE correspond à la hauteur MAXIMUM de la Texture #1,
+ La valeur Bas correspond à la hauteur max. de la Texture 1,
</text>
<text name="height_text_lbl16">
- et la valeur HAUTE correspond à la hauteur MINIMUM de la Texture #4.
+ et la valeur Haut correspond à la hauteur min. de la Texture 4.
</text>
<button label="Appliquer" name="apply_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/fr/panel_script_limits_my_avatar.xml
index 24656bf379..e541fae31f 100644
--- a/indra/newview/skins/default/xui/fr/panel_script_limits_my_avatar.xml
+++ b/indra/newview/skins/default/xui/fr/panel_script_limits_my_avatar.xml
@@ -1,10 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="MON AVATAR" name="script_limits_my_avatar_panel">
+ <text name="script_memory">
+ Utilisation des scripts d&apos;avatars
+ </text>
<text name="loading_text">
Chargement...
</text>
<scroll_list name="scripts_list">
- <scroll_list.columns label="Taille (Ko)" name="size"/>
+ <scroll_list.columns label="Taille (Ko)" name="size" width="80"/>
<scroll_list.columns label="URL" name="urls"/>
<scroll_list.columns label="Nom de l&apos;objet" name="name"/>
<scroll_list.columns label="Endroit" name="location"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/fr/panel_script_limits_region_memory.xml
index 1e5e680c09..751abd6f1d 100644
--- a/indra/newview/skins/default/xui/fr/panel_script_limits_region_memory.xml
+++ b/indra/newview/skins/default/xui/fr/panel_script_limits_region_memory.xml
@@ -3,20 +3,18 @@
<text name="script_memory">
Mémoire des scripts de parcelles
</text>
- <text name="parcels_listed">
- Parcelles possédées :
- </text>
- <text name="memory_used">
- Mémoire utilisée :
- </text>
+ <text name="parcels_listed"/>
+ <text name="memory_used"/>
<text name="loading_text">
Chargement...
</text>
<scroll_list name="scripts_list">
- <scroll_list.columns label="Taille (Ko)" name="size"/>
+ <scroll_list.columns label="Taille (Ko)" name="size" width="80"/>
+ <scroll_list.columns label="URL" name="urls"/>
<scroll_list.columns label="Nom de l&apos;objet" name="name"/>
- <scroll_list.columns label="Propriétaire d&apos;objet" name="owner"/>
- <scroll_list.columns label="Parcelle/emplacement" name="location"/>
+ <scroll_list.columns label="Propriétaire d&apos;objet" name="owner" width="140"/>
+ <scroll_list.columns label="Parcelle" name="parcel"/>
+ <scroll_list.columns label="Endroit" name="location"/>
</scroll_list>
<button label="Rafraîchir la liste" name="refresh_list_btn"/>
<button label="Surbrillance" name="highlight_btn"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_side_tray.xml b/indra/newview/skins/default/xui/fr/panel_side_tray.xml
index 3ad1671921..178ae4324b 100644
--- a/indra/newview/skins/default/xui/fr/panel_side_tray.xml
+++ b/indra/newview/skins/default/xui/fr/panel_side_tray.xml
@@ -2,26 +2,28 @@
<!-- Side tray cannot show background because it is always
partially on screen to hold tab buttons. -->
<side_tray name="sidebar">
- <sidetray_tab description="Activer/désactiver le panneau latéral." name="sidebar_openclose"/>
- <sidetray_tab description="Domicile." name="sidebar_home">
+ <sidetray_tab description="Activer/désactiver le panneau latéral." name="sidebar_openclose" tab_title="Activer/désactiver le panneau latéral"/>
+ <sidetray_tab description="Domicile." name="sidebar_home" tab_title="Accueil">
<panel label="domicile" name="panel_home"/>
</sidetray_tab>
- <sidetray_tab description="Modifiez votre profil public et vos Favoris." name="sidebar_me">
- <panel label="Moi" name="panel_me"/>
+ <sidetray_tab description="Modifiez votre profil public et vos Favoris." name="sidebar_me" tab_title="Mon profil">
+ <panel_container name="panel_container">
+ <panel label="Moi" name="panel_me"/>
+ </panel_container>
</sidetray_tab>
- <sidetray_tab description="Trouvez vos amis, vos contacts et les personnes se trouvant près de vous." name="sidebar_people">
+ <sidetray_tab description="Trouvez vos amis, vos contacts et les personnes se trouvant près de vous." name="sidebar_people" tab_title="Personnes">
<panel_container name="panel_container">
<panel label="Profil du groupe" name="panel_group_info_sidetray"/>
<panel label="Résidents et objets ignorés" name="panel_block_list_sidetray"/>
</panel_container>
</sidetray_tab>
- <sidetray_tab description="Trouvez de nouveaux lieux à découvrir et les lieux que vous connaissez déjà." label="Lieux" name="sidebar_places">
+ <sidetray_tab description="Trouvez de nouveaux lieux à découvrir et les lieux que vous connaissez déjà." label="Lieux" name="sidebar_places" tab_title="Endroits">
<panel label="Lieux" name="panel_places"/>
</sidetray_tab>
- <sidetray_tab description="Parcourez votre inventaire." name="sidebar_inventory">
+ <sidetray_tab description="Parcourez votre inventaire." name="sidebar_inventory" tab_title="Mon inventaire">
<panel label="Modifier l&apos;inventaire" name="sidepanel_inventory"/>
</sidetray_tab>
- <sidetray_tab description="Modifiez votre apparence actuelle." name="sidebar_appearance">
+ <sidetray_tab description="Modifiez votre apparence actuelle." name="sidebar_appearance" tab_title="Mon apparence">
<panel label="Changer d&apos;apparence" name="sidepanel_appearance"/>
</sidetray_tab>
</side_tray>
diff --git a/indra/newview/skins/default/xui/fr/panel_status_bar.xml b/indra/newview/skins/default/xui/fr/panel_status_bar.xml
index ae575a9fac..dffb1d4238 100644
--- a/indra/newview/skins/default/xui/fr/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/fr/panel_status_bar.xml
@@ -22,9 +22,10 @@
[AMT] L$
</panel.string>
<button label="" label_selected="" name="buycurrency" tool_tip="Mon solde"/>
- <button label="Acheter des L$" name="buyL" tool_tip="Cliquez pour acheter plus de L$"/>
+ <button label="Acheter L$" name="buyL" tool_tip="Cliquez pour acheter plus de L$"/>
<text name="TimeText" tool_tip="Heure actuelle (Pacifique)">
- midi
+ 00h00 PST
</text>
+ <button name="media_toggle_btn" tool_tip="Arrêter tous les médias (musique, vidéo, pages web)"/>
<button name="volume_btn" tool_tip="Contrôle du volume global"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_world_map.xml b/indra/newview/skins/default/xui/fr/panel_world_map.xml
index e6e95c2605..972aae1fab 100644
--- a/indra/newview/skins/default/xui/fr/panel_world_map.xml
+++ b/indra/newview/skins/default/xui/fr/panel_world_map.xml
@@ -30,6 +30,12 @@
<panel.string name="world_map_northwest">
NO
</panel.string>
+ <panel.string name="world_map_person">
+ 1 personne
+ </panel.string>
+ <panel.string name="world_map_people">
+ [NUMBER] personnes
+ </panel.string>
<text label="N" name="floater_map_north" text="N">
N
</text>
diff --git a/indra/newview/skins/default/xui/fr/role_actions.xml b/indra/newview/skins/default/xui/fr/role_actions.xml
index 3367353b28..c049de48b1 100644
--- a/indra/newview/skins/default/xui/fr/role_actions.xml
+++ b/indra/newview/skins/default/xui/fr/role_actions.xml
@@ -17,21 +17,21 @@
<action_set description="Ces pouvoirs permettent de modifier le profil public du groupe, sa charte et son logo." name="Group Identity">
<action description="Modifier le profil public du groupe" longdescription="Modifiez la charte, le logo et l&apos;affichage dans les résultats de recherche. Vous pouvez faire cela dans la section Général." name="group change identity" value="11"/>
</action_set>
- <action_set description="Ces pouvoirs incluent les pouvoirs de céder, modifier et vendre les terrains de ce groupe. Pour accéder à la fenêtre À propos des terrains, cliquez sur le sol avec le bouton droit de la souris et sélectionnez À propos des terrains, ou cliquez sur l&apos;icône i dans la barre de navigation." name="Parcel Management">
+ <action_set description="Ces pouvoirs incluent les pouvoirs de céder, modifier et vendre les terrains de ce groupe. Pour accéder à la fenêtre À propos du terrain, cliquez sur le sol avec le bouton droit de la souris et sélectionnez À propos du terrain, ou cliquez sur l&apos;icône i dans la barre de navigation." name="Parcel Management">
<action description="Transférer et acheter des parcelles pour le groupe" longdescription="Transférez et achetez des parcelles pour le groupe à partir du menu À propos du terrain &gt; Général." name="land deed" value="12"/>
<action description="Abandonner le terrain" longdescription="Abandonnez des parcelles du groupe à Linden Lab. Attention : ce pouvoir autorise l&apos;abandon d&apos;un terrain appartenant au groupe. Ce terrain sera alors définitivement perdu. Assurez-vous de bien comprendre ce pouvoir avant de l&apos;attribuer." name="land release" value="13"/>
<action description="Vendre du terrain" longdescription="Vendez des parcelles du groupe. Attention : ce pouvoir autorise la vente d&apos;un terrain appartenant au groupe. Ce terrain sera alors définitivement perdu. Assurez-vous de bien comprendre ce pouvoir avant de l&apos;attribuer." name="land set sale info" value="14"/>
<action description="Diviser et fusionner des parcelles" longdescription="Divisez et fusionnez des parcelles. Pour ce faire, cliquez sur le sol avec le bouton droit de la souris, sélectionnez Modifier le terrain et faites glisser la souris sur le terrain pour faire une sélection. Pour diviser une parcelle, sélectionnez ce que vous souhaitez diviser et cliquez sur Sous-diviser. Pour fusionner des parcelles, sélectionnez-en deux ou plus qui sont contiguës et cliquez sur Fusionner." name="land divide join" value="15"/>
</action_set>
<action_set description="Ces pouvoirs permettent de modifier le nom de la parcelle, son référencement dans la recherche et le lieu de téléportation." name="Parcel Identity">
- <action description="Activez Afficher le lieu dans la recherche et définissez la catégorie" longdescription="Activez Afficher le lieu dans la recherche et définissez la catégorie d&apos;une parcelle dans l&apos;onglet À propos des terrains &gt; Options." name="land find places" value="17"/>
- <action description="Modifiez le nom et la description de la parcelle, ainsi que les paramètres d&apos;affichage du lieu dans la recherche" longdescription="Modifiez le nom et la description de la parcelle, ainsi que les paramètres d&apos;affichage du lieu dans la recherche. Pour ce faire, utilisez l&apos;onglet À propos des terrains &gt; Options." name="land change identity" value="18"/>
+ <action description="Activez Afficher le lieu dans la recherche et définissez la catégorie" longdescription="Activez Afficher le lieu dans la recherche et définissez la catégorie d&apos;une parcelle dans l&apos;onglet À propos du terrain &gt; Options." name="land find places" value="17"/>
+ <action description="Modifiez le nom et la description de la parcelle, ainsi que les paramètres d&apos;affichage du lieu dans la recherche" longdescription="Modifiez le nom et la description de la parcelle, ainsi que les paramètres d&apos;affichage du lieu dans la recherche. Pour ce faire, utilisez l&apos;onglet À propos du terrain &gt; Options." name="land change identity" value="18"/>
<action description="Définir le lieu d&apos;arrivée et le routage des téléportations" longdescription="Définissez le lieu d&apos;arrivée des téléportations et le routage à partir du menu À propos du terrain &gt; Options." name="land set landing point" value="19"/>
</action_set>
<action_set description="Ces pouvoirs permettent de définir les options de la parcelle concernant la musique, les médias, la création d&apos;objets et le relief." name="Parcel Settings">
<action description="Modifier la musique et les médias" longdescription="Changez la musique et les médias à partir du menu À propos du terrain &gt; Médias." name="land change media" value="20"/>
<action description="Changer l&apos;option Modifier le terrain" longdescription="Changez l&apos;option Modifier le terrain à partir du menu À propos du terrain &gt; Options. Attention : ce pouvoir permet de terraformer votre terrain et de placer ou déplacer des plantes Linden. Assurez-vous de bien comprendre ce pouvoir avant de l&apos;attribuer. " name="land edit" value="21"/>
- <action description="Changer diverses options du terrain" longdescription="Activez Sécurisé (pas de dégâts), Voler, et autorisez les autres résidents à : modifier le terrain, construire, créer des repères et exécuter des scripts sur les terrains appartenant au groupe dans l&apos;onglet propos des terrains &gt; Options." name="land options" value="22"/>
+ <action description="Changer diverses options du terrain" longdescription="Activez Sécurisé (pas de dégâts), Voler, et autorisez les autres résidents à : modifier le terrain, construire, créer des repères et exécuter des scripts sur les terrains appartenant au groupe dans l&apos;onglet propos du terrain &gt; Options." name="land options" value="22"/>
</action_set>
<action_set description="Ces pouvoirs permettent aux membres d&apos;outrepasser les restrictions sur les parcelles du groupe." name="Parcel Powers">
<action description="Toujours autoriser Modifier le terrain" longdescription="Vous pouvez modifier le relief d&apos;une parcelle du groupe, même si l&apos;option est désactivée à partir du menu À propos du terrain &gt; Options." name="land allow edit land" value="23"/>
@@ -40,11 +40,11 @@
<action description="Toujours autoriser à créer des repères" longdescription="Vous pouvez créer un repère sur une parcelle du groupe, même si l&apos;option est désactivée à partir du menu À propos du terrain &gt; Options." name="land allow landmark" value="26"/>
<action description="Autoriser à définir un domicile sur le terrain du groupe" longdescription="Un membre dans un rôle avec ce pouvoir peut utiliser le menu Monde &gt; Repères &gt; Définir le domicile ici sur une parcelle cédée à ce groupe." name="land allow set home" value="28"/>
</action_set>
- <action_set description="Ces pouvoirs permettent d&apos;autoriser ou d&apos;interdire l&apos;accès à des parcelles du groupe et de geler ou d&apos;expulser des résidents." name="Parcel Access">
+ <action_set description="Ces pouvoirs permettent d&apos;autoriser ou d&apos;interdire l&apos;accès à des parcelles du groupe et de figer ou d&apos;expulser des résidents." name="Parcel Access">
<action description="Gérer la liste d&apos;accès à la parcelle" longdescription="Gérez la liste des résidents autorisés sur la parcelle à partir du menu À propos du terrain &gt; Accès." name="land manage allowed" value="29"/>
- <action description="Gérer la liste noire de cette parcelle" longdescription="Gérez les listes des résidents bannis des parcelles dans l&apos;onglet À propos des terrains &gt; Accès." name="land manage banned" value="30"/>
- <action description="Modifiez les paramètres Vendre des pass à" longdescription="Modifiez les paramètres Vendre des pass à dans l&apos;onglet À propos des terrains &gt; Accès." name="land manage passes" value="31"/>
- <action description="Expulser et geler des résidents" longdescription="Les membres dans un rôle avec ce pouvoir peuvent se charger des résidents indésirables sur une parcelle appartenant au groupe en cliquant dessus, puis en sélectionnant Expulser ou Geler." name="land admin" value="32"/>
+ <action description="Gérer la liste noire de cette parcelle" longdescription="Gérez les listes des résidents bannis des parcelles dans l&apos;onglet À propos du terrain &gt; Accès." name="land manage banned" value="30"/>
+ <action description="Modifiez les paramètres Vendre des pass à" longdescription="Modifiez les paramètres Vendre des pass à dans l&apos;onglet À propos du terrain &gt; Accès." name="land manage passes" value="31"/>
+ <action description="Expulser et figer des résidents" longdescription="Les membres dans un rôle avec ce pouvoir peuvent se charger des résidents indésirables sur une parcelle appartenant au groupe en cliquant dessus, puis en sélectionnant Expulser ou Figer." name="land admin" value="32"/>
</action_set>
<action_set description="Ces pouvoirs permettent de renvoyer des objets du groupe et de placer ou déplacer des plantes Linden pour aménager le paysage. Utilisez ce pouvoir avec précaution car les objets renvoyés le sont définitivement." name="Parcel Content">
<action description="Renvoyer les objets transférés au groupe" longdescription="Vous pouvez renvoyer des objets appartenant au groupe à partir du menu À propos du terrain &gt; Objets." name="land return group owned" value="48"/>
diff --git a/indra/newview/skins/default/xui/fr/sidepanel_appearance.xml b/indra/newview/skins/default/xui/fr/sidepanel_appearance.xml
index 60fd63bffc..69cb6cd53d 100644
--- a/indra/newview/skins/default/xui/fr/sidepanel_appearance.xml
+++ b/indra/newview/skins/default/xui/fr/sidepanel_appearance.xml
@@ -1,16 +1,17 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Tenues" name="appearance panel">
<string name="No Outfit" value="Aucune tenue"/>
+ <string name="Unsaved Changes" value="Modifications non enregistrées"/>
+ <string name="Now Wearing" value="Vous portez désormais..."/>
<panel name="panel_currentlook">
- <button label="Éditer" name="editappearance_btn"/>
- <text name="currentlook_title">
- (non enregistré)
+ <button label="M" name="editappearance_btn"/>
+ <button label="O" name="openoutfit_btn"/>
+ <text name="currentlook_status">
+ (État)
</text>
<text name="currentlook_name">
Ma tenue avec un nom très long comme ORIGNAL
</text>
</panel>
<filter_editor label="Filtrer les tenues" name="Filter"/>
- <button label="Porter" name="wear_btn"/>
- <button label="Nouvelle tenue" name="newlook_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/sidepanel_inventory.xml b/indra/newview/skins/default/xui/fr/sidepanel_inventory.xml
index eba399f6a3..893b64d4b2 100644
--- a/indra/newview/skins/default/xui/fr/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/fr/sidepanel_inventory.xml
@@ -3,6 +3,8 @@
<panel label="" name="sidepanel__inventory_panel">
<panel name="button_panel">
<button label="Profil" name="info_btn"/>
+ <button label="Partager" name="share_btn"/>
+ <button label="Acheter" name="shop_btn"/>
<button label="Porter" name="wear_btn"/>
<button label="Jouer" name="play_btn"/>
<button label="Téléporter" name="teleport_btn"/>
diff --git a/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml b/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml
index 688bed8cbf..c8e76118a1 100644
--- a/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/fr/sidepanel_task_info.xml
@@ -19,7 +19,7 @@
Vous ne pouvez pas modifier ces objets
</panel.string>
<panel.string name="text modify warning">
- Cet objet comprend des parties reliées
+ Cet objet comprend des parties liées
</panel.string>
<panel.string name="Cost Default">
Prix : L$
@@ -37,34 +37,34 @@
Vente mixte
</panel.string>
<text name="title" value="Profil de l&apos;objet"/>
- <text name="where" value="(dans le monde virtuel)"/>
- <panel label="">
+ <text name="where" value="(dans Second Life)"/>
+ <panel label="" name="properties_panel">
<text name="Name:">
- Nom :
+ Nom :
</text>
<text name="Description:">
Description :
</text>
<text name="CreatorNameLabel">
- Créateur :
+ Créateur :
</text>
<text name="Creator Name">
Erica Linden
</text>
<text name="Owner:">
- Propriétaire :
+ Propriétaire :
</text>
<text name="Owner Name">
Erica Linden
</text>
<text name="Group_label">
- Groupe :
+ Groupe :
</text>
- <button name="button set group" tool_tip="Choisissez un groupe pour partager les permissions de cet objet"/>
- <name_box initial_value="Chargement..." name="Group Name Proxy"/>
- <button label="Céder" label_selected="Céder" name="button deed" tool_tip="En cédant un objet, vous donnez aussi les permissions au prochain propriétaire. Seul un officier peut céder les objets d&apos;un groupe."/>
+ <button name="button set group" tool_tip="Choisir un groupe pour partager les droits relatifs à cet objet"/>
+ <name_box initial_value="Chargement…" name="Group Name Proxy"/>
+ <button label="Céder" label_selected="Céder" name="button deed" tool_tip="En cédant un objet, vous donnez aussi les droits au prochain propriétaire. Seul un officier peut céder les objets partagés d&apos;un groupe."/>
<text name="label click action">
- Cliquer pour :
+ Cliquer pour :
</text>
<combo_box name="clickaction">
<combo_box.item label="Toucher (défaut)" name="Touch/grab(default)"/>
@@ -78,16 +78,16 @@
Vous pouvez modifier cet objet
</text>
<text name="Anyone can:">
- N&apos;importe qui :
+ N&apos;importe qui :
</text>
<check_box label="Copier" name="checkbox allow everyone copy"/>
<check_box label="Bouger" name="checkbox allow everyone move"/>
<text name="GroupLabel">
- Groupe :
+ Groupe :
</text>
- <check_box label="Partager" name="checkbox share with group" tool_tip="Autorisez tous les membres du groupe choisi à utiliser et à partager vos droits pour cet objet. Pour activer les restrictions de rôles, vous devez d&apos;abord cliquer sur Transférer."/>
+ <check_box label="Partager" name="checkbox share with group" tool_tip="Autoriser tous les membres du groupe choisi à partager vos droits de modification pour cet objet. Pour activer les restrictions de rôles, vous devez d&apos;abord cliquer sur Céder."/>
<text name="NextOwnerLabel">
- Le prochain propriétaire :
+ Le prochain propriétaire :
</text>
<check_box label="Modifier" name="checkbox next owner can modify"/>
<check_box label="Copier" name="checkbox next owner can copy"/>
@@ -99,30 +99,31 @@
<combo_box.item label="Contenus" name="Contents"/>
<combo_box.item label="Original" name="Original"/>
</combo_box>
- <spinner label="Prix : L$" name="Edit Cost"/>
- <check_box label="Afficher dans les résultats de recherche" name="search_check" tool_tip="Permettre aux autres résidents de voir cet objet dans les résultats de recherche"/>
+ <spinner label="Prix : L$" name="Edit Cost"/>
+ <check_box label="Afficher avec la recherche" name="search_check" tool_tip="Permettre aux autres résidents de voir cet objet dans les résultats de recherche"/>
<text name="B:">
- B :
+ B :
</text>
<text name="O:">
- O :
+ O :
</text>
<text name="G:">
G :
</text>
<text name="E:">
- E :
+ E :
</text>
<text name="N:">
- N :
+ N :
</text>
<text name="F:">
- F :
+ F :
</text>
</panel>
<panel name="button_panel">
<button label="Ouvrir" name="open_btn"/>
<button label="Payer" name="pay_btn"/>
<button label="Acheter" name="buy_btn"/>
+ <button label="Détails" name="details_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index 1888dc1827..15d5847c58 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -23,7 +23,22 @@
Détection du matériel...
</string>
<string name="StartupLoading">
- Chargement
+ Chargement de [APP_NAME]...
+ </string>
+ <string name="StartupClearingCache">
+ Vidage du cache...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ Initialisation du cache des textures...
+ </string>
+ <string name="StartupInitializingVFS">
+ Initialisation VFS...
+ </string>
+ <string name="ProgressRestoring">
+ Restauration...
+ </string>
+ <string name="ProgressChangingResolution">
+ Changement de la résolution...
</string>
<string name="Fullbright">
Fullbright (Legacy)
@@ -85,9 +100,30 @@
<string name="LoginDownloadingClothing">
Habits en cours de téléchargement...
</string>
+ <string name="InvalidCertificate">
+ Certificat non valide ou corrompu renvoyé par le serveur. Contactez l&apos;administrateur de la grille.
+ </string>
+ <string name="CertInvalidHostname">
+ Nom d&apos;hôte non valide utilisé pour accéder au serveur. Vérifiez votre nom d&apos;hôte de grille ou SLURL.
+ </string>
+ <string name="CertExpired">
+ Il semble que le certificat renvoyé par la grille ait expiré. Vérifiez votre horloge système ou contactez l&apos;administrateur de la grille.
+ </string>
+ <string name="CertKeyUsage">
+ Impossible d&apos;utiliser le certificat renvoyé par le serveur pour SSL. Contactez l&apos;administrateur de la grille.
+ </string>
+ <string name="CertBasicConstraints">
+ Certificats trop nombreux dans la chaîne des certificats du serveur. Contactez l&apos;administrateur de la grille.
+ </string>
+ <string name="CertInvalidSignature">
+ Impossible de vérifier la signature de certificat renvoyée par le serveur de la grille. Contactez l&apos;administrateur de la grille.
+ </string>
<string name="LoginFailedNoNetwork">
Erreur réseau : impossible d&apos;établir la connexion. Veuillez vérifier votre connexion réseau.
</string>
+ <string name="LoginFailed">
+ Échec de la connexion.
+ </string>
<string name="Quit">
Quitter
</string>
@@ -97,6 +133,24 @@
<string name="AgentLostConnection">
Il y a peut-être des problèmes techniques dans cette région. Veuillez vérifier votre connexion Internet.
</string>
+ <string name="SavingSettings">
+ Enregistrement des paramètres...
+ </string>
+ <string name="LoggingOut">
+ Déconnexion...
+ </string>
+ <string name="ShuttingDown">
+ Arrêt en cours...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ Vous avez été déconnecté de la région où vous étiez.
+ </string>
+ <string name="SentToInvalidRegion">
+ Vous avez été transféré vers une région non valide.
+ </string>
+ <string name="TestingDisconnect">
+ Test de déconnexion du client
+ </string>
<string name="TooltipPerson">
Personne
</string>
@@ -151,6 +205,24 @@
<string name="TooltipAgentUrl">
Cliquez pour afficher le profil de ce résident
</string>
+ <string name="TooltipAgentMute">
+ Cliquer pour ignorer ce résident
+ </string>
+ <string name="TooltipAgentUnmute">
+ Cliquer pour ne plus ignorer ce résident
+ </string>
+ <string name="TooltipAgentIM">
+ Cliquer pour envoyer un IM à ce résident
+ </string>
+ <string name="TooltipAgentPay">
+ Cliquer pour payer ce résident
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Cliquer pour proposer une téléportation à ce résident
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Cliquer pour demander à ce résident d&apos;être votre ami
+ </string>
<string name="TooltipGroupUrl">
Cliquez pour afficher la description de ce groupe
</string>
@@ -176,18 +248,40 @@
Cliquez pour exécuter la commande secondlife:// command
</string>
<string name="CurrentURL" value=" URL actuelle : [CurrentURL]"/>
+ <string name="TooltipPrice" value="[PRICE] L$-"/>
<string name="SLurlLabelTeleport">
Me téléporter vers
</string>
<string name="SLurlLabelShowOnMap">
Afficher la carte pour
</string>
+ <string name="SLappAgentMute">
+ Ignorer
+ </string>
+ <string name="SLappAgentUnmute">
+ Ne plus ignorer
+ </string>
+ <string name="SLappAgentIM">
+ IM
+ </string>
+ <string name="SLappAgentPay">
+ Payer
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Proposer une téléportation à
+ </string>
+ <string name="SLappAgentRequestFriend">
+ Demande d&apos;amitié
+ </string>
<string name="BUTTON_CLOSE_DARWIN">
Fermer (⌘W)
</string>
<string name="BUTTON_CLOSE_WIN">
Fermer (Ctrl+W)
</string>
+ <string name="BUTTON_CLOSE_CHROME">
+ Fermer
+ </string>
<string name="BUTTON_RESTORE">
Restaurer
</string>
@@ -227,12 +321,12 @@
<string name="AvatarNameMultiple">
(multiple)
</string>
- <string name="AvatarNameHippos">
- (hippos)
- </string>
<string name="GroupNameNone">
(aucun)
</string>
+ <string name="AvalineCaller">
+ Appelant Avaline [ORDER]
+ </string>
<string name="AssetErrorNone">
Aucune erreur
</string>
@@ -338,6 +432,9 @@
<string name="symbolic link">
lien
</string>
+ <string name="symbolic folder link">
+ lien du dossier
+ </string>
<string name="AvatarEditingAppearance">
(Apparence en cours de modification)
</string>
@@ -593,6 +690,9 @@
<string name="hang_up">
Déconnecté du chat vocal
</string>
+ <string name="reconnect_nearby">
+ Vous allez maintenant être reconnecté(e) au chat vocal près de vous.
+ </string>
<string name="ScriptQuestionCautionChatGranted">
&apos;[OBJECTNAME]&apos;, un objet appartenant à [OWNERNAME], situé dans [REGIONNAME] à [REGIONPOS], a reçu le droit de : [PERMISSIONS].
</string>
@@ -642,7 +742,7 @@
Modéré
</string>
<string name="SIM_ACCESS_ADULT">
- Adult
+ Adulte
</string>
<string name="SIM_ACCESS_DOWN">
Hors ligne
@@ -741,10 +841,10 @@
Gants
</string>
<string name="undershirt">
- Sous-vêtements (homme)
+ Débardeur
</string>
<string name="underpants">
- Sous-vêtements (femme)
+ Caleçon
</string>
<string name="skirt">
Jupe
@@ -758,6 +858,45 @@
<string name="invalid">
non valide
</string>
+ <string name="shirt_not_worn">
+ Chemise non portée
+ </string>
+ <string name="pants_not_worn">
+ Pantalon non porté
+ </string>
+ <string name="shoes_not_worn">
+ Chaussures non portées
+ </string>
+ <string name="socks_not_worn">
+ Chaussettes non portées
+ </string>
+ <string name="jacket_not_worn">
+ Veste non portée
+ </string>
+ <string name="gloves_not_worn">
+ Gants non portés
+ </string>
+ <string name="undershirt_not_worn">
+ Débardeur non porté
+ </string>
+ <string name="underpants_not_worn">
+ Caleçon non porté
+ </string>
+ <string name="skirt_not_worn">
+ Jupe non portée
+ </string>
+ <string name="alpha_not_worn">
+ Alpha non porté
+ </string>
+ <string name="tattoo_not_worn">
+ Tatouage non porté
+ </string>
+ <string name="invalid_not_worn">
+ non valide
+ </string>
+ <string name="NewWearable">
+ Nouv. [WEARABLE_ITEM]
+ </string>
<string name="next">
Suivant
</string>
@@ -780,7 +919,7 @@
Consultez les notices précédentes ou choisissez de ne plus recevoir ces messages ici.
</string>
<string name="GroupNotifyOpenAttachment">
- Ouvrir la pièce jointe
+ Ouvrir pièce jointe
</string>
<string name="GroupNotifySaveAttachment">
Enregistrer la pièce jointe
@@ -825,7 +964,10 @@
Appuyez sur ESC pour quitter la vue subjective
</string>
<string name="InventoryNoMatchingItems">
- Aucun objet correspondant dans l&apos;inventaire.
+ Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/all/Rechercher [SEARCH_TERM]].
+ </string>
+ <string name="PlacesNoMatchingItems">
+ Vous n&apos;avez pas trouvé ce que vous cherchiez ? Essayez [secondlife:///app/search/places/Rechercher [SEARCH_TERM]].
</string>
<string name="FavoritesNoMatchingItems">
Faites glisser un repère ici pour l&apos;ajouter à vos Favoris.
@@ -846,6 +988,7 @@
Aucun contenu
</string>
<string name="WornOnAttachmentPoint" value=" (porté sur [ATTACHMENT_POINT])"/>
+ <string name="ActiveGesture" value="[GESLABEL] (actif)"/>
<string name="PermYes">
Oui
</string>
@@ -860,6 +1003,7 @@
<string name="Wave" value=" Faire signe"/>
<string name="HelloAvatar" value=" Bonjour, avatar !"/>
<string name="ViewAllGestures" value=" Tout afficher &gt;&gt;"/>
+ <string name="GetMoreGestures" value="Plus &gt;&gt;"/>
<string name="Animations" value=" Animations,"/>
<string name="Calling Cards" value=" Cartes de visite,"/>
<string name="Clothing" value=" Habits,"/>
@@ -945,6 +1089,9 @@
<string name="InvFolder My Outfits">
Mes tenues
</string>
+ <string name="InvFolder Accessories">
+ Accessoires
+ </string>
<string name="InvFolder Friends">
Amis
</string>
@@ -1201,10 +1348,10 @@
Problème lors du téléchargement
</string>
<string name="CompileQueueInsufficientPermDownload">
- Permissions insuffisantes pour télécharger un script.
+ Droits insuffisants pour télécharger un script.
</string>
<string name="CompileQueueInsufficientPermFor">
- Permissions insuffisantes pour
+ Droits insuffisants pour
</string>
<string name="CompileQueueUnknownFailure">
Échec du téléchargement, erreur inconnue
@@ -1324,6 +1471,9 @@
<string name="ScriptLimitsRequestError">
Une erreur est survenue pendant la requête d&apos;informations.
</string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ Aucune parcelle sélectionnée
+ </string>
<string name="ScriptLimitsRequestWrongRegion">
Erreur : les informations de script ne sont disponibles que dans votre région actuelle.
</string>
@@ -1465,6 +1615,12 @@
<string name="PanelContentsNewScript">
Nouveau script
</string>
+ <string name="PanelContentsTooltip">
+ Contenu de l&apos;objet
+ </string>
+ <string name="BusyModeResponseDefault">
+ Le résident auquel vous avez envoyé un message est en mode Occupé, ce qui signifie qu&apos;il a demandé à ne pas être dérangé. Votre message restera affiché dans son panneau IM afin qu&apos;il puisse le lire ultérieurement.
+ </string>
<string name="MuteByName">
(par nom)
</string>
@@ -1477,17 +1633,18 @@
<string name="MuteGroup">
(groupe)
</string>
+ <string name="MuteExternal">
+ (externe)
+ </string>
<string name="RegionNoCovenant">
Il n&apos;y a aucun règlement pour ce domaine.
</string>
<string name="RegionNoCovenantOtherOwner">
Il n&apos;y a aucun règlement pour ce domaine. Le terrain sur ce domaine est vendu par le propriétaire, non par Linden Lab. Pour en savoir plus, veuillez contacter le propriétaire.
</string>
- <string name="covenant_last_modified">
- Dernière modification :
- </string>
- <string name="none_text" value=" (aucun) "/>
- <string name="never_text" value=" (jamais) "/>
+ <string name="covenant_last_modified" value="Dernière modification :"/>
+ <string name="none_text" value=" (aucun)"/>
+ <string name="never_text" value=" (jamais)"/>
<string name="GroupOwned">
Propriété du groupe
</string>
@@ -1501,7 +1658,10 @@
(mise à jour après la publication)
</string>
<string name="NoPicksClassifiedsText">
- Il n&apos;y a pas de préférences/petites annonces ici
+ Vous n&apos;avez pas créé de favoris ni de petites annonces Cliquez sur le bouton Plus pour créer un favori ou une petite annonce.
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ L&apos;utilisateur n&apos;a ni favoris ni petites annonces
</string>
<string name="PicksClassifiedsLoadingText">
Chargement...
@@ -1576,7 +1736,10 @@
Annuler
</string>
<string name="UploadingCosts">
- Charger %s coûte
+ Le chargement de [NAME] coûte [AMOUNT] L$
+ </string>
+ <string name="BuyingCosts">
+ Cet achat coûte [AMOUNT] L$
</string>
<string name="UnknownFileExtension">
Extension de fichier inconnue .%s
@@ -1706,7 +1869,7 @@
Appartenant aux Lindens
</string>
<string name="Adult">
- Adult
+ Adulte
</string>
<string name="Arts&amp;Culture">
Arts et culture
@@ -1897,7 +2060,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Mèches de derrière
</string>
<string name="Baggy">
- Cernés
+ Plus
</string>
<string name="Bangs">
Frange
@@ -1924,7 +2087,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Volume : Haut
</string>
<string name="Big Head">
- Grosse tête
+ Plus
</string>
<string name="Big Pectorals">
Gros pectoraux
@@ -1960,13 +2123,13 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Grains de beauté
</string>
<string name="Body Thick">
- Corps épais
+ Plus
</string>
<string name="Body Thickness">
Épaisseur du corps
</string>
<string name="Body Thin">
- Corps mince
+ Moins
</string>
<string name="Bow Legged">
Jambes arquées
@@ -1987,7 +2150,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Large
</string>
<string name="Brow Size">
- Taille
+ Taille du front
</string>
<string name="Bug Eyes">
Yeux globuleux
@@ -2098,7 +2261,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Déviation du nez
</string>
<string name="Cuff Flare">
- Jambe
+ Jambes
</string>
<string name="Dark">
Sombre
@@ -2137,7 +2300,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Extrémités
</string>
<string name="Egg Head">
- Forme de la tête
+ Proéminence
</string>
<string name="Eye Bags">
Cernes
@@ -2215,7 +2378,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Jambes larges
</string>
<string name="Flat">
- Plat
+ Moins
</string>
<string name="Flat Butt">
Fesses plates
@@ -2260,10 +2423,10 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Brillant
</string>
<string name="Glove Fingers">
- Doigts avec gants
+ Gants avec doigts
</string>
<string name="Glove Length">
- Longueur des gants
+ Longueur
</string>
<string name="Hair">
Cheveux
@@ -2377,10 +2540,10 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Angle mâchoire
</string>
<string name="Jaw Jut">
- Saillie de la mâchoire
+ Saillie mâchoire
</string>
<string name="Jaw Shape">
- Forme de la mâchoire
+ Mâchoire
</string>
<string name="Join">
Rapprochés
@@ -2461,7 +2624,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Fente labiale
</string>
<string name="Lip Cleft Depth">
- Profondeur fente labiale
+ Prof. fente labiale
</string>
<string name="Lip Fullness">
Volume des lèvres
@@ -2488,7 +2651,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Couleur du rouge à lèvres
</string>
<string name="Long">
- Long
+ Plus
</string>
<string name="Long Head">
Tête longue
@@ -2545,7 +2708,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Abaisser
</string>
<string name="Lower Bridge">
- Arête plus basse
+ Arête inférieure
</string>
<string name="Lower Cheeks">
Joue inférieure
@@ -2587,7 +2750,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Plus
</string>
<string name="More Lower Lip">
- Plus
+ Inférieure plus grosse
</string>
<string name="More Muscles">
Plus
@@ -2611,7 +2774,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Plus
</string>
<string name="More Upper Lip">
- Plus
+ Supérieure plus grosse
</string>
<string name="More Vertical">
Plus
@@ -2647,7 +2810,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Couleur du vernis
</string>
<string name="Narrow">
- Étroit
+ Moins
</string>
<string name="Narrow Back">
Arrière étroit
@@ -2719,19 +2882,19 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Épaisseur du nez
</string>
<string name="Nose Tip Angle">
- Bout du nez
+ Angle bout du nez
</string>
<string name="Nose Tip Shape">
- Bout du nez
+ Forme bout du nez
</string>
<string name="Nose Width">
Largeur du nez
</string>
<string name="Nostril Division">
- Division des narines
+ Division narines
</string>
<string name="Nostril Width">
- Largeur des narines
+ Largeur narines
</string>
<string name="Opaque">
Opaque
@@ -2821,13 +2984,13 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Plus rose
</string>
<string name="Platform Height">
- Plateforme (hauteur)
+ Platef. (hauteur)
</string>
<string name="Platform Width">
- Plateforme (largeur)
+ Platef. (largeur)
</string>
<string name="Pointy">
- Pointu
+ Pointue
</string>
<string name="Pointy Heels">
Talons pointus
@@ -2845,10 +3008,10 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Å’il droit saillant
</string>
<string name="Puffy">
- Gonflées
+ Plus
</string>
<string name="Puffy Eyelids">
- Paupières
+ Paup. gonflées
</string>
<string name="Rainbow Color">
Couleur arc en ciel
@@ -2914,7 +3077,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Vers la gauche
</string>
<string name="Shift Mouth">
- Déplacer la bouche
+ Déplacement
</string>
<string name="Shift Right">
Vers la droite
@@ -3013,16 +3176,16 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Petites mains
</string>
<string name="Small Head">
- Petite tête
+ Moins
</string>
<string name="Smooth">
- Lisses
+ Moins
</string>
<string name="Smooth Hair">
Cheveux lisses
</string>
<string name="Socks Length">
- Longueur des chaussettes
+ Longueur
</string>
<string name="Soulpatch">
Barbichette
@@ -3034,7 +3197,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Mèches en pointe
</string>
<string name="Square">
- Carré
+ Carrée
</string>
<string name="Square Toe">
Orteil carré
@@ -3112,7 +3275,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Forme de l&apos;orteil
</string>
<string name="Toe Thickness">
- Épaisseur de l&apos;orteil
+ Épaisseur orteil
</string>
<string name="Torso Length">
Longueur du torse
@@ -3139,13 +3302,13 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Arête supérieure
</string>
<string name="Upper Cheeks">
- Pommette
+ Joue supérieure
</string>
<string name="Upper Chin Cleft">
Menton supérieur
</string>
<string name="Upper Eyelid Fold">
- Paupière supérieure
+ Paupière sup.
</string>
<string name="Upturned">
En trompette
@@ -3163,7 +3326,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Cheveux blancs
</string>
<string name="Wide">
- Large
+ Plus
</string>
<string name="Wide Back">
Derrière large
@@ -3213,6 +3376,15 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
<string name="LocationCtrlDamageTooltip">
Santé
</string>
+ <string name="LocationCtrlAdultIconTooltip">
+ Région de type Adulte
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ Région de type Modéré
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ Région de type Général
+ </string>
<string name="UpdaterWindowTitle">
[APP_NAME] - Mise à jour
</string>
@@ -3243,6 +3415,12 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
<string name="UpdaterFailStartTitle">
Impossible de lancer le client
</string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME] : transfert trop rapide des articles de [FROM_NAME] ; aperçu automatique désactivé pendant [TIME] secondes
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME] : transfert trop rapide des articles ; aperçu automatique désactivé pendant [TIME] secondes
+ </string>
<string name="IM_logging_string">
-- Archivage des IM activé --
</string>
@@ -3270,11 +3448,17 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
<string name="IM_moderator_label">
(Modérateur)
</string>
- <string name="started_call">
- A appelé quelqu&apos;un
+ <string name="answered_call">
+ Votre appel a fait l&apos;objet d&apos;une réponse
+ </string>
+ <string name="you_started_call">
+ Vous appelez.
</string>
- <string name="joined_call">
- A rejoint l&apos;appel
+ <string name="you_joined_call">
+ Vous avez rejoint l&apos;appel
+ </string>
+ <string name="name_started_call">
+ [NAME] appelle.
</string>
<string name="ringing-im">
En train de rejoindre l&apos;appel...
@@ -3363,4 +3547,219 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
<string name="unread_chat_multiple">
[SOURCES] ont dit quelque chose de nouveau
</string>
+ <string name="session_initialization_timed_out_error">
+ Expiration du délai d&apos;initialisation de la session
+ </string>
+ <string name="paid_you_ldollars">
+ [NAME] vous a payé [AMOUNT] L$
+ </string>
+ <string name="you_paid_ldollars">
+ Vous avez payé à [AMOUNT] L$ [REASON].
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ Vous avez payé [AMOUNT] L$.
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ Vous avez payé à [NAME] [AMOUNT] L$.
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ Vous avez payé à [AMOUNT] L$ [REASON].
+ </string>
+ <string name="for a parcel of land">
+ pour une parcelle de terrain
+ </string>
+ <string name="for a land access pass">
+ pour un pass d&apos;accès au terrain
+ </string>
+ <string name="for deeding land">
+ pour une cession de terrain
+ </string>
+ <string name="to create a group">
+ pour créer un groupe
+ </string>
+ <string name="to join a group">
+ pour rejoindre un groupe
+ </string>
+ <string name="to upload">
+ pour charger
+ </string>
+ <string name="giving">
+ Donner [AMOUNT] L$
+ </string>
+ <string name="uploading_costs">
+ Le chargement coûte [AMOUNT] L$
+ </string>
+ <string name="this_costs">
+ Cela coûte [AMOUNT] L$
+ </string>
+ <string name="buying_selected_land">
+ Achat du terrain sélectionné pour [AMOUNT] L$
+ </string>
+ <string name="this_object_costs">
+ Cet objet coûte [AMOUNT] L$
+ </string>
+ <string name="group_role_everyone">
+ Tous
+ </string>
+ <string name="group_role_officers">
+ Officiers
+ </string>
+ <string name="group_role_owners">
+ Propriétaires
+ </string>
+ <string name="uploading_abuse_report">
+ Chargement en cours...
+
+de l&apos;infraction signalée
+ </string>
+ <string name="New Shape">
+ Nouvelle silhouette
+ </string>
+ <string name="New Skin">
+ Nouvelle peau
+ </string>
+ <string name="New Hair">
+ Nouveaux cheveux
+ </string>
+ <string name="New Eyes">
+ Nouveaux yeux
+ </string>
+ <string name="New Shirt">
+ Nouvelle chemise
+ </string>
+ <string name="New Pants">
+ Nouveau pantalon
+ </string>
+ <string name="New Shoes">
+ Nouvelles chaussures
+ </string>
+ <string name="New Socks">
+ Nouvelles chaussettes
+ </string>
+ <string name="New Jacket">
+ Nouvelle veste
+ </string>
+ <string name="New Gloves">
+ Nouveaux gants
+ </string>
+ <string name="New Undershirt">
+ Nouveau débardeur
+ </string>
+ <string name="New Underpants">
+ Nouveau caleçon
+ </string>
+ <string name="New Skirt">
+ Nouvelle jupe
+ </string>
+ <string name="New Alpha">
+ Nouvel alpha
+ </string>
+ <string name="New Tattoo">
+ Nouveau tatouage
+ </string>
+ <string name="Invalid Wearable">
+ Objet à porter non valide
+ </string>
+ <string name="New Script">
+ Nouveau script
+ </string>
+ <string name="New Folder">
+ Nouveau dossier
+ </string>
+ <string name="Contents">
+ Contenus
+ </string>
+ <string name="Gesture">
+ Geste
+ </string>
+ <string name="Male Gestures">
+ Gestes masculins
+ </string>
+ <string name="Female Gestures">
+ Gestes féminins
+ </string>
+ <string name="Other Gestures">
+ Autres gestes
+ </string>
+ <string name="Speech Gestures">
+ Gestes liés à la parole
+ </string>
+ <string name="Common Gestures">
+ Gestes communs
+ </string>
+ <string name="Male - Excuse me">
+ Homme - Demander pardon
+ </string>
+ <string name="Male - Get lost">
+ Homme - Dire d&apos;aller au diable
+ </string>
+ <string name="Male - Blow kiss">
+ Homme - Envoyer un baiser
+ </string>
+ <string name="Male - Boo">
+ Homme - Hou !
+ </string>
+ <string name="Male - Bored">
+ Homme - Ennui
+ </string>
+ <string name="Male - Hey">
+ Homme - Hé !
+ </string>
+ <string name="Male - Laugh">
+ Homme - Rire
+ </string>
+ <string name="Male - Repulsed">
+ Homme - Dégoût
+ </string>
+ <string name="Male - Shrug">
+ Homme - Hausser les épaules
+ </string>
+ <string name="Male - Stick tougue out">
+ Homme - Tirer la langue
+ </string>
+ <string name="Male - Wow">
+ Homme - Ouah !
+ </string>
+ <string name="FeMale - Excuse me">
+ Femme - Demander pardon
+ </string>
+ <string name="FeMale - Get lost">
+ Femme - Dire d&apos;aller au diable
+ </string>
+ <string name="FeMale - Blow kiss">
+ Femme - Envoyer un baiser
+ </string>
+ <string name="FeMale - Boo">
+ Femme - Hou !
+ </string>
+ <string name="Female - Bored">
+ Femme - Ennui
+ </string>
+ <string name="Female - Hey">
+ Femme - Hé !
+ </string>
+ <string name="Female - Laugh">
+ Femme - Rire
+ </string>
+ <string name="Female - Repulsed">
+ Femme - Dégoût
+ </string>
+ <string name="Female - Shrug">
+ Femme - Hausser les épaules
+ </string>
+ <string name="Female - Stick tougue out">
+ Femme - Tirer la langue
+ </string>
+ <string name="Female - Wow">
+ Femme - Ouah !
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ aucun/aucun
+ </string>
+ <string name="texture_load_dimensions_error">
+ Impossible de charger des images de taille supérieure à [WIDTH]*[HEIGHT]
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/fr/teleport_strings.xml b/indra/newview/skins/default/xui/fr/teleport_strings.xml
index b76ae370fd..7c291c0984 100644
--- a/indra/newview/skins/default/xui/fr/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/fr/teleport_strings.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<teleport_messages name="">
+<teleport_messages>
<message_set name="errors">
<message name="invalid_tport">
Nous avons rencontré des problèmes en essayant de vous téléporter. Vous devrez peut-être vous reconnecter avant de pouvoir vous téléporter.
@@ -61,6 +61,9 @@ Veuillez réessayer dans un moment.
<message name="completing">
Téléportation sur le point d&apos;aboutir.
</message>
+ <message name="completed_from">
+ Téléportation depuis [T_SLURL] terminée
+ </message>
<message name="resolving">
Destination en cours de résolution.
</message>
diff --git a/indra/newview/skins/default/xui/it/floater_about.xml b/indra/newview/skins/default/xui/it/floater_about.xml
index a2fcaa63f6..026b7b7616 100644
--- a/indra/newview/skins/default/xui/it/floater_about.xml
+++ b/indra/newview/skins/default/xui/it/floater_about.xml
@@ -1,41 +1,41 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_about" title="Informazioni su [APP_NAME]">
+<floater name="floater_about" title="INFO [CAPITALIZED_APP_NAME]">
<floater.string name="AboutHeader">
[APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])
[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
</floater.string>
<floater.string name="AboutCompiler">
- Fatto con [COMPILER] versione [COMPILER_VERSION]
+ Generato con [COMPILER] versione [COMPILER_VERSION]
</floater.string>
<floater.string name="AboutPosition">
- Tu sei in [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] a [REGION] ospitata da [HOSTNAME] ([HOSTIP])
+ Tu sei [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] located at &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
[SERVER_VERSION]
[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
</floater.string>
<floater.string name="AboutSystem">
CPU: [CPU]
Memoria: [MEMORY_MB] MB
-Versione Sistema Operativo: [OS_VERSION]
-Venditore Scheda Grafica: [GRAPHICS_CARD_VENDOR]
-Scheda Grafica: [GRAPHICS_CARD]
+Versione sistema operativo: [OS_VERSION]
+Venditore scheda grafica: [GRAPHICS_CARD_VENDOR]
+Scheda grafica: [GRAPHICS_CARD]
</floater.string>
<floater.string name="AboutDriver">
- Versione Driver Scheda Grafica: [GRAPHICS_DRIVER_VERSION]
+ Versione driver Windows per grafica: [GRAPHICS_DRIVER_VERSION]
</floater.string>
<floater.string name="AboutLibs">
Versione OpenGL: [OPENGL_VERSION]
Versione libcurl: [LIBCURL_VERSION]
Versione J2C Decoder: [J2C_VERSION]
-Versione Audio Driver: [AUDIO_DRIVER_VERSION]
+Versione Driver audio: [AUDIO_DRIVER_VERSION]
Versione Qt Webkit: [QT_WEBKIT_VERSION]
-Versione Vivox: [VIVOX_VERSION]
+Versione Server voice: [VOICE_VERSION]
</floater.string>
<floater.string name="none">
(nessuno)
</floater.string>
<floater.string name="AboutTraffic">
- Pacchetti Perduti: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
+ Pacchetti perduti: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%) Informazioni
</floater.string>
<tab_container name="about_tab">
<panel label="Informazioni" name="support_panel">
@@ -43,13 +43,14 @@ Versione Vivox: [VIVOX_VERSION]
</panel>
<panel label="Ringraziamenti" name="credits_panel">
<text_editor name="credits_editor">
- Second Life è offerto da Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl and many others.
+ Second Life ti è offerto da Philip, Tessa, Andrew, Cory, Ian, James, Phoenix, Ryan, Haney, Dan, Char, Ben, John, Tanya, Eddie, Richard, Mitch, Doug, Eric, Frank, Bruce, Aaron, Peter, Alice, Charlie, Debra, Eileen, Helen, Janet, Steffan, Steve, Tom, Mark, Hunter, Xenon, Burgess, Bill, Jim, Lee, Hamlet, Daniel, Jeff, Todd, Sarah, Tim, Stephanie, Colin, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Jack, Vektor, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Jesse, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Yuko, Makiko, Thomas, Harry, Seth, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Brad, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, Beez, Milo, Hermia, Red, Thrax, Gulliver, Joe, Sally, Paul, Jose, Rejean, Dore, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, Dustin, George, Del, Matthew, Cat, Jacqui, Adrian, Viola, Alfred, Noel, Irfan, Yool, Rika, Jane, Frontier, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Jeremy, JP, Jake, Anthony, Maurice, Madhavi, Leopard, Kyle, Joon, Bert, Belinda, Jon, Kristi, Bridie, Pramod, Socrates, Maria, Aric, Adreanne, Jay, Kari, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Colossus, Zen, BigPapi, Pastrami, Kurz, Mani, Neuro, Mel, Sardonyx, MJ, Rowan, Sgt, Elvis, Samuel, Leo, Bryan, Niko, Austin, Soft, Poppy, Rachel, Aki, Banzai, Alexa, Sue, Bender, CG, Angelo, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Rothman, Niall, Marin, Allison, Katie, Dawn, Dusty, Katt, Judy, Andrea, Ambroff, Infinity, Rico, Gail, Kalpana, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Maestro, Simone, Yang, T, Shannon, Nelson, Khanh, Scott, Courtney, Charlene, Quixote, Susan, Zed, Amanda, Katelin, Enkidu, Roxie, Esbee, JoRoan, Scarlet, Tay, Kevin, Wolfgang, Johnny, Ray, Andren, Merov, Bob, Rand, Howard, Callen, Heff, Galen, Newell, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl, Ashley, JessieAnn, Huseby, Karina, Paris, Kurt, Rick, Lis, Kotler, Theeba, Lynx, Murphy, Doten, Taka, Norm, Jillian, Marcus, Mae, Novack, Esther, Perry, Dana, Ducot, Javier, Porter, Madison, Gecko, Dough, JR, Gisele, Crimp, Norie, Arch, Kimi, Fisher, Barbara, Jason, Peggy, Bernard, Jules, Leroy, Eva, Khederian, Campbell, Vogt, Masido, Karel, Torres, Lo, Breezer, Delby, Rountree, Anna, Servus, Rue, Itiaes, Chuck, Luna, Novella, Zaza, Wen, Gino, Lex, Cassandra, Limey, Nancy, Anukul, Silver, Brodesky, Jinsai, Squid, Gez, Rakesh, Ladan, Edelman, Marcet, Squire, Tatem, Tony, Jerm, Tia, Falcon, BK, Tiggs, Driscoll, Bacon, Timothee, Cru, Carmilla, Coyot, Webb, Kazu, Rudas, LJ, Sea, Ali Wallace, Bewest, Pup, Drub, Dragon, Inoshiro, Byron, Rhett, Xandix, Aimee, Fredrik, Thor, Teddy, Baron, Nelly, Ghengis, Epic, Eli, Stone, Grapes, Irie, Prep, Scobu, Valerie, Alain e molti altri ancora.
- Si ringraziano i seguenti residenti per aver contribuito a rendere questa versione la migliore possibile: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
+Si ringraziano i seguenti residenti per aver contribuito a rendere questa versione la migliore possibile: Drew Dwi, Zai Lynch, Latif Khalifa, Ellla McMahon, Harleen Gretzky, Squirrel Wood, Malarthi Behemoth, Dante Tucker, Buckaroo Mu, Eddi Decosta, Dirk, Talamasca, Torben Trautman, Irene Muni, Lilly Zenovka, Vick Forcella, Sasy Scarborough, Gentle Welinder, Elric Anatine, Techwolf Lupindo, Dusan Writer, WolfPup Lowenhar, Marianne McCann, Fiachra Lach, Sitearm Madonna, Sudane Erato, Sahkolihaa Contepomi, Sachi Vixen, Questar Utu, Dimitrio Lewis, Matto Destiny, Scrim Pinion, Radio Signals, Psi Merlin, Pixel Gausman, Mel Vanbeeck, Laurent Bechir, Lamorna Proctor, Lares Carter, Gwyneth Llewelyn, Hydra Shaftoe, Holger Gilruth, Gentle Heron, Carla Broek, Boroondas Gupte, Fury Rosewood, Flower Ducatillon, Colpo Wexler, gwampa Lomu, Borg Capalini, Beansy Twine, Ardy Lay, , 45ms Zhong, Adeon Writer, Aeonix Aeon, Ai Austin, Aiko Ying, Alexandrea Fride, Alliez Mysterio, Annie Milestone, Annika Genezzia, Ansariel Hiller, ArminasX Saiman, Arya Braveheart, Asaeda Meltingdots, Asturkon Jua, Avallyn Oakleaf, Avatar Quinzet, BabyA Littlething, Bacchus Ireto, Bazaar, Riva, Benjamin Bigdipper, Beth Walcher, Bezilon Kasei, Biancaluce Robbiani, Bill Walach, blakopal Galicia, Blitzckreed Levenque, Bryn Oh, Callipygian Christensen, Cap Carver, Carr Arbenlow, Chantal Harvey, Charles Courtois, Charlie Sazaland, Cherry Cheevers, ChickyBabes Zuzu, Christopher Organiser, Ciaran Laval, Clara Young, Celierra Darling, Corinne Helendale, Corro Moseley, Coughdrop Littlething, Darien Caldwell, Dartagan Shepherd, Debs Regent, Decro Schmooz, Denim Kamachi, DiJodi Dubratt, Dil Spitz, Edgware Marker, Egehan Dryke, Emma Portilo, Emmie Fairymeadow, Evangelista Emerald, Faelon Swordthain, Frenchimmo Sabra, Gaberoonie Zanzibar, Ganymedes Costagravas, Gene Frostbite, GeneJ Composer, Giggles Littlebird, Grady Echegaray, Guni Greenstein, Gypsy Tripsa, Hackshaven Harford, Ham Rambler, Han Shuffle, Hanglow Short, Hatzfeld Runo, herina Bode, Horatio Freund, Hypatia Callisto, Hypatia Pickens, Identity Euler, Imnotgoing Sideways, Innula Zenovka, Iyoba Tarantal, Jack Abraham, Jagga Meredith, Jennifer Boyle, Jeremy Marquez, Jessica Qin, Jinx Nordberg, Jo Bernandes, Jocial Sonnenkern, Joel Savard, Jondan Lundquist, Josef Munster, Josette Windlow, Juilan Tripsa, Juro Kothari, Justin RiversRunRed, Kagehi Kohn, Kaimen Takahe, Keklily Longfall, Ken Lavender, Kestral Karas, Khisme Nitely, Kimar Coba, Kithrak Kirkorian, Kitty Barnett, Kolor Fall, Komiko Okamoto, Korvel Noh, Larry Pixel, Leal Choche, len Starship, Lenae Munz, Lexi Frua, Lillie Cordeaux, Lizzy Macarthur, LSL Scientist, Luban Yiyuan, Luc Starsider, Maccus McCullough, Madison Blanc, Maggie Darwin, Mallory Destiny, Manx Wharton, Marc Claridge, Marc2 Sands, Matthew Anthony, Maxim RiversRunRed, Medhue Simoni, Melinda Latynina, Mencius Watts, Michi Lumin, Midian Farspire, Miles Glaz, Mindy Mathy, Mitch Wagner, Mo Hax, Mourna Biziou, Nao Noe, naofan Teardrop, Naomah Beaumont, Nathiel Siamendes, Nber Medici, Neko Link, Netpat Igaly, Neutron Chesnokov, Newfie Pendragon, Nicholai Laviscu, Nick Rhodes, Nicoladie Gymnast, Ollie Kubrick, Orenj Marat, Orion Delphis, Oryx Tempel, Parvati Silverweb, PeterPunk Mooney, Pixel Scientist, Pounce Teazle, Professor Noarlunga, Quantum Destiny, Quicksilver Hermes, Ralf Setsuko, RAT Quan, RedMokum Bravin, Revolution Perenti, Rezit Sideways, Rich Grainger, Rosco Teardrop, Rose Evans, Rudee Voom, RufusTT Horsefly, Saii Hallard, SaintLEOlions Zimer, Samm Larkham, Satanello Miami, SexySteven Morrisey, Sheet Spotter, Shnurui Troughton, sicarius Thorne, Sicarius Toxx, Sini Nubalo, SLB Wirefly, snowy Sidran, Soupa Segura, ST Mensing, Starshine Halasy, Stickman Ingmann, Synystyr Texan, Takeda Terrawyng, Tali Rosca, Templar Merlin, Tezcatlipoca Bisiani, Tiel Stonecutter, Tony Kembia, TouchaHoney Perhaps, Trey Reanimator, TriloByte Zanzibar, Trinity Dechou, Trinity Dejavu, Unlikely Quintessa, UsikuFarasi Kanarik, Veritas Raymaker, Vex Streeter, Viaticus Speculaas, Villain Baroque, Vixie Durant, Void Singer, Watty Berkson, Westley Schridde, Westley Streeter, Whimsy Winx, Winter Ventura, Wundur Primbee, xstorm Radek, YongYong Francois, Zak Westminster, Zana Kohime, Zaren Alexander, Zeja Pyle, ZenMondo Wormser, Zoex Flanagan e molti altri ancora.
- Per avere successo nel business, sii coraggioso, sii il primo, sii differente. --Henry Marchant
+
+&quot;Il lavoro continua, la causa sussiste, la speranza vive ancora e i sogni non svaniranno mai&quot; - Edward Kennedy
</text_editor>
</panel>
<panel label="Licenze" name="licenses_panel">
diff --git a/indra/newview/skins/default/xui/it/floater_about_land.xml b/indra/newview/skins/default/xui/it/floater_about_land.xml
index 4c82475a6f..942b79b7d3 100644
--- a/indra/newview/skins/default/xui/it/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/it/floater_about_land.xml
@@ -1,5 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterland" title="INFO SUL TERRENO">
+<floater name="floaterland" title="INFORMAZIONI SUL TERRENO">
+ <floater.string name="maturity_icon_general">
+ &quot;Parcel_PG_Dark&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_moderate">
+ &quot;Parcel_M_Dark&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_adult">
+ &quot;Parcel_R_Dark&quot;
+ </floater.string>
<floater.string name="Minutes">
[MINUTES] minuti
</floater.string>
@@ -10,12 +19,12 @@
[SECONDS] secondi
</floater.string>
<floater.string name="Remaining">
- restante
+ rimanenti
</floater.string>
<tab_container name="landtab">
<panel label="GENERALE" name="land_general_panel">
<panel.string name="new users only">
- Solo ai nuovi residenti
+ Soltanto nuovi residenti
</panel.string>
<panel.string name="anyone">
A chiunque
@@ -54,6 +63,9 @@
Nessun appezzamento selezionato.
Vai al menu Mondo &gt; Informazioni sul terreno oppure seleziona un altro appezzamento per vederne i dettagli.
</panel.string>
+ <panel.string name="time_stamp_template">
+ [wkday,datetime,local] [day,datetime,local] [mth,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </panel.string>
<text name="Name:">
Nome:
</text>
@@ -70,7 +82,7 @@ Vai al menu Mondo &gt; Informazioni sul terreno oppure seleziona un altro appezz
Categoria di accesso:
</text>
<text left="119" name="ContentRatingText">
- Adult
+ Adulti
</text>
<text name="Owner:">
Proprietario:
@@ -81,10 +93,12 @@ Vai al menu Mondo &gt; Informazioni sul terreno oppure seleziona un altro appezz
<text name="Group:">
Gruppo:
</text>
- <text left="119" name="GroupText" width="227"/>
- <button label="Imposta..." label_selected="Imposta..." name="Set..."/>
+ <text left="119" name="GroupText" width="227">
+ Leyla Linden
+ </text>
+ <button label="Imposta" name="Set..."/>
<check_box label="Permetti cessione al gruppo" left="119" name="check deed" tool_tip="Un funzionario del gruppo può cedere questa terra al gruppo stesso cosicchè essa sarà  supportata dalle terre del gruppo."/>
- <button label="Cedi..." label_selected="Cedi..." name="Deed..." tool_tip="Puoi solo offrire terra se sei un funzionario del gruppo selezionato."/>
+ <button label="Cedi" name="Deed..." tool_tip="Puoi solo offrire terra se sei un funzionario del gruppo selezionato."/>
<check_box label="Il proprietario fa un contributo con la cessione" left="119" name="check contrib" tool_tip="Quando la terra è ceduta al gruppo, il proprietario precedente contribuisce con abbastanza allocazione di terra per supportarlo."/>
<text name="For Sale:">
In vendita:
@@ -126,13 +140,14 @@ Vai al menu Mondo &gt; Informazioni sul terreno oppure seleziona un altro appezz
0
</text>
<button label="Acquista il terreno..." label_selected="Acquista il terreno..." left="130" name="Buy Land..." width="125"/>
- <button label="Acquista per il gruppo..." label_selected="Acquista per il gruppo..." name="Buy For Group..."/>
- <button label="Compra pass..." label_selected="Compra pass..." left="130" name="Buy Pass..." tool_tip="Un pass ti da un accesso temporaneo in questo territorio." width="125"/>
- <button label="Abbandona la terra..." label_selected="Abbandona la terra..." name="Abandon Land..."/>
- <button label="Reclama la terra..." label_selected="Reclama la terra..." name="Reclaim Land..."/>
- <button label="Vendita Linden..." label_selected="Vendita Linden..." name="Linden Sale..." tool_tip="La terra deve essere posseduta, con contenuto impostato, e non già messa in asta."/>
+ <button label="Informazioni script" name="Scripts..."/>
+ <button label="Acquista per il gruppo" name="Buy For Group..."/>
+ <button label="Compra Pass..." label_selected="Compra Pass..." left="130" name="Buy Pass..." tool_tip="Un pass ti da un accesso temporaneo in questo territorio." width="125"/>
+ <button label="Abbandona la terra" name="Abandon Land..."/>
+ <button label="Reclama la terra" name="Reclaim Land..."/>
+ <button label="Vendita Linden" name="Linden Sale..." tool_tip="La terra deve essere di proprietà, con contenuto impostato, e non già messa all&apos;asta."/>
</panel>
- <panel label="COVENANT" name="land_covenant_panel">
+ <panel label="REGOLAMENTO" name="land_covenant_panel">
<panel.string name="can_resell">
La terra acquistata in questa regione può essere rivenduta.
</panel.string>
@@ -181,22 +196,22 @@ o suddivisa.
Categoria di accesso:
</text>
<text left="125" name="region_maturity_text">
- Adult
+ Adulti
</text>
<text name="resellable_lbl">
Rivendita:
</text>
- <text left="125" name="resellable_clause">
+ <text name="resellable_clause">
La terra in questa regione non può essere rivenduta.
</text>
<text name="changeable_lbl">
Suddividi:
</text>
- <text left="125" name="changeable_clause">
+ <text name="changeable_clause">
La terra in questa regione non può essere unita/suddivisa.
</text>
</panel>
- <panel label="OBJECTS" name="land_objects_panel">
+ <panel label="OGGETTI" name="land_objects_panel">
<panel.string name="objects_available_text">
[COUNT] dei [MAX] ([AVAILABLE] disponibili)
</panel.string>
@@ -207,7 +222,7 @@ o suddivisa.
Fattore bonus degli oggetti della regione: [BONUS]
</text>
<text name="Simulator primitive usage:">
- Uso dei Primative :
+ Uso dei Prim:
</text>
<text left="214" name="objects_available" width="230">
[COUNT] dei [MAX] ([AVAILABLE] dsponibili)
@@ -231,7 +246,7 @@ o suddivisa.
[COUNT]
</text>
<button label="Mostra" label_selected="Mostra" name="ShowOwner" right="-135" width="60"/>
- <button label="Restituisci..." label_selected="Restituisci..." name="ReturnOwner..." right="-10" tool_tip="Restituisci gli oggetti ai loro proprietari." width="119"/>
+ <button label="Restituisci" name="ReturnOwner..." right="-10" tool_tip="Restituisci gli oggetti ai loro proprietari." width="119"/>
<text left="14" name="Set to group:" width="180">
Imposta al gruppo:
</text>
@@ -239,7 +254,7 @@ o suddivisa.
[COUNT]
</text>
<button label="Mostra" label_selected="Mostra" name="ShowGroup" right="-135" width="60"/>
- <button label="Restituisci..." label_selected="Restituisci..." name="ReturnGroup..." right="-10" tool_tip="Restituisci gli oggetti ai loro proprietari." width="119"/>
+ <button label="Restituisci" name="ReturnGroup..." right="-10" tool_tip="Restituisci gli oggetti ai loro proprietari." width="119"/>
<text left="14" name="Owned by others:" width="180">
Posseduti da altri:
</text>
@@ -247,15 +262,15 @@ o suddivisa.
[COUNT]
</text>
<button label="Mostra" label_selected="Mostra" name="ShowOther" right="-135" width="60"/>
- <button label="Restituisci..." label_selected="Restituisci..." name="ReturnOther..." right="-10" tool_tip="Restituisci gli oggetti ai loro proprietari." width="119"/>
+ <button label="Restituisci" name="ReturnOther..." right="-10" tool_tip="Restituisci gli oggetti ai loro proprietari." width="119"/>
<text left="14" name="Selected / sat upon:" width="193">
Selezionati / sui quali sei sopra:
</text>
<text left="214" name="selected_objects_text" width="48">
[COUNT]
</text>
- <text left="4" name="Autoreturn" width="412">
- Autorestituisci gli oggetti degli altri residenti (minuti, 0 per disabilitata):
+ <text name="Autoreturn">
+ Restituzione automatica degli oggetti di altri residenti (minuti, 0 per disattivarla):
</text>
<line_editor name="clean other time" right="-20"/>
<text name="Object Owners:" width="150">
@@ -282,16 +297,16 @@ Solamente terreni più grandi possono essere abilitati nella ricerca.
Questa opzione è disabilitata perchè tu non puoi modificare le opzioni di questo terreno.
</panel.string>
<panel.string name="mature_check_mature">
- Contenuto Mature
+ Contenuto Moderato
</panel.string>
<panel.string name="mature_check_adult">
- Contenuto Adult
+ Contenuto Adulti
</panel.string>
<panel.string name="mature_check_mature_tooltip">
- Il contenuto o le informazioni del tuo terreno sono considerate Mature.
+ Il contenuto o le informazioni del tuo terreno sono considerate di tipo Moderato.
</panel.string>
<panel.string name="mature_check_adult_tooltip">
- Il contenuto o le informazioni del tuo terreno sono considerate Adult.
+ Il contenuto o le informazioni del tuo terreno sono considerate di tipo per Adulti.
</panel.string>
<panel.string name="landing_point_none">
(nessuno)
@@ -303,7 +318,7 @@ Solamente terreni più grandi possono essere abilitati nella ricerca.
Nessuna spinta (Impostazione regionale)
</panel.string>
<text name="allow_label">
- Permetti agli altri residenti di:
+ Permetti ad altri residenti di:
</text>
<check_box label="Modificare il terreno" name="edit land check" tool_tip="Se spuntato, chiunque può terraformare il tuo terreno. E&apos; preferibile lasciare questo quadrato non spuntato, dato che sarai sempre in grado di modificare il tuo terreno."/>
<check_box label="Permetti il volo" name="check fly" tool_tip="Se spuntato, gli altri residenti potranno volare sul tuo terreno. Se non spuntato, potranno solamente arrivare in volo o sorvolare il terreno."/>
@@ -323,18 +338,18 @@ Solamente terreni più grandi possono essere abilitati nella ricerca.
<check_box label="Tutti i residenti" name="check other scripts"/>
<check_box label="Gruppo" name="check group scripts"/>
<text name="land_options_label">
- Opzioni della terra:
+ Opzioni per il terreno:
</text>
<check_box label="Sicuro (senza danno)" name="check safe" tool_tip="Se spuntato, imposta il terreno su &apos;sicuro&apos;, disabilitando i danni da combattimento. Se non spuntato, viene abilitato il combattimento a morte."/>
<check_box label="Nessuna spinta" name="PushRestrictCheck" tool_tip="Previeni i colpi. Selezionare questa opzione può essere utile per prevenire comportamenti dannosi sul tuo terreno."/>
- <check_box label="Mostra luogo nel Cerca (L$30/settimana)" name="ShowDirectoryCheck" tool_tip="Lascia che questa terra sia vista dagli altri nei risultati di ricerca"/>
- <combo_box left="282" name="land category with adult" width="140">
+ <check_box label="Mostra luogo nella ricerca (30 L$/settimana)" name="ShowDirectoryCheck" tool_tip="Lascia che questa terra sia vista dagli altri nei risultati di ricerca"/>
+ <combo_box name="land category with adult">
<combo_box.item label="Tutte le categorie" name="item0"/>
<combo_box.item label="Luogo dei Linden" name="item1"/>
- <combo_box.item label="Adult" name="item2"/>
- <combo_box.item label="Arte &amp; Cultura" name="item3"/>
+ <combo_box.item label="Adulti" name="item2"/>
+ <combo_box.item label="Arte e cultura" name="item3"/>
<combo_box.item label="Affari" name="item4"/>
- <combo_box.item label="Educazione" name="item5"/>
+ <combo_box.item label="Istruzione" name="item5"/>
<combo_box.item label="Gioco" name="item6"/>
<combo_box.item label="Divertimento" name="item7"/>
<combo_box.item label="Accoglienza nuovi residenti" name="item8"/>
@@ -343,7 +358,7 @@ Solamente terreni più grandi possono essere abilitati nella ricerca.
<combo_box.item label="Shopping" name="item11"/>
<combo_box.item label="Altro" name="item12"/>
</combo_box>
- <combo_box left="282" name="land category" width="140">
+ <combo_box name="land category">
<combo_box.item label="Tutte le categorie" name="item0"/>
<combo_box.item label="Luogo dei Linden" name="item1"/>
<combo_box.item label="Arte &amp; Cultura" name="item3"/>
@@ -357,7 +372,7 @@ Solamente terreni più grandi possono essere abilitati nella ricerca.
<combo_box.item label="Shopping" name="item11"/>
<combo_box.item label="Altro" name="item12"/>
</combo_box>
- <check_box label="Contenuto Mature" name="MatureCheck" tool_tip=" "/>
+ <check_box label="Contenuti di tipo Moderato" name="MatureCheck" tool_tip=" "/>
<text name="Snapshot:">
Fotografia:
</text>
@@ -385,10 +400,7 @@ Solamente terreni più grandi possono essere abilitati nella ricerca.
Home Page:
</text>
<line_editor left="97" name="media_url"/>
- <button label="Imposta..." label_selected="Imposta..." name="set_media_url" width="63"/>
- <text name="CurrentURL:">
- Pagina attuale:
- </text>
+ <button label="Imposta" name="set_media_url"/>
<check_box label="Nascondi indirizzo URL Media" left="94" name="hide_media_url" tool_tip="Abilitando questa opzione nasconderai l&apos;indirizzo url dei media a tutte le persone non autorizzate a vedere le informazioni del terreno. Nota che questo non è disponibile per contenuto di tipo HTML."/>
<text name="Description:">
Descrizione:
@@ -400,9 +412,7 @@ Texture:
</text>
<texture_picker label="" left="97" name="media texture" tool_tip="Clicca per scegliere un&apos;immagine"/>
<text name="replace_texture_help" width="285">
- (Gli oggetti che hanno questa texture applicata
-mostreranno il video o la pagina web dopo che avrai
-cliccato sulla freccia play.)
+ Gli oggetti che utilizzano questa texture mostreranno il video o la pagina web dopo aver cliccato sulla freccia di riproduzione. Seleziona la miniatura per scegliere una texture diversa.
</text>
<check_box label="Auto ridimensiona" left="94" name="media_auto_scale" tool_tip="Spuntando questa opzione, nell&apos;appezzamento il contenuto media si ridimensionerà automaticamente. Potrebbe darsi che appaia un po&apos; più lento e che diminuisca la qualità visiva ma nessun altro riadattamento o allineamento della texture sarà necessario."/>
<text left="99" name="media_size" tool_tip="Aumenta grandezza per far vedere meglio i media web, lascia a 0 per impostare il default." width="120">
@@ -420,12 +430,27 @@ Media:
<check_box label="Fai ripetere il video" left="265" name="media_loop" tool_tip="Fai ripetere il video continuamente. Quando il video è finito, reinizierà dal principio."/>
</panel>
<panel label="SUONO" name="land_audio_panel">
- <check_box label="Attiva Voice" name="parcel_enable_voice_channel"/>
- <check_box label="Attiva Voice (stabilito dalla Proprietà)" name="parcel_enable_voice_channel_is_estate_disabled"/>
+ <text name="MusicURL:">
+ URL musica:
+ </text>
+ <check_box label="Nascondi URL" name="hide_music_url" tool_tip="Questa opzione consente di nascondere l&apos;url della musica a chi non è autorizzato a visionare le informazioni di questo parcel."/>
+ <text name="Sound:">
+ Audio:
+ </text>
+ <check_box label="Limita l&apos;audio per oggetti e gesture a questo lotto" name="check sound local"/>
+ <text name="Voice settings:">
+ Voce:
+ </text>
+ <check_box label="Attiva voce" name="parcel_enable_voice_channel"/>
+ <check_box label="Attiva voce (stabilito dalla proprietà)" name="parcel_enable_voice_channel_is_estate_disabled"/>
+ <check_box label="Limita il chat vocale a questo lotto" name="parcel_enable_voice_channel_local"/>
</panel>
<panel label="ACCESSO" name="land_access_panel">
<panel.string name="access_estate_defined">
- (Definito dalla Proprietà)
+ (Definito dalla proprietà)
+ </panel.string>
+ <panel.string name="allow_public_access">
+ Consenti accesso pubblico ([MATURITY])
</panel.string>
<panel.string name="estate_override">
Una o più di queste impostazioni sono già impostate a livello regionale
@@ -433,12 +458,12 @@ Media:
<text name="Limit access to this parcel to:">
Accesso a questo terreno
</text>
- <check_box label="Permetti Accesso Pubblico [MATURITY]" name="public_access"/>
+ <check_box label="Consenti l&apos;accesso pubblico [MATURITY]" name="public_access"/>
<text name="Only Allow">
- Accesso ristretto ai Residenti verificati con:
+ Consenti l&apos;accesso soltanto ai residenti verificati tramite:
</text>
- <check_box label="Informazioni di pagamento on File [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Manda via residenti non identificati."/>
- <check_box label="Verifica dell&apos;età [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Espelli residenti che non hanno verificato l&apos;età. Vedi [SUPPORT_SITE] per maggiori informazioni."/>
+ <check_box label="Informazioni di pagamento in archivio [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Espelli i residenti non identificati."/>
+ <check_box label="Verifica dell&apos;età [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Espelli i residenti che non hanno la loro età verificata. Vedi [SUPPORT_SITE] per maggiori informazioni."/>
<check_box label="Permetti accesso al gruppo: [GROUP]" name="GroupCheck" tool_tip="Imposta il gruppo nel pannello generale."/>
<check_box label="Vendi pass a:" name="PassCheck" tool_tip="Permetti in questo terreno l&apos;accesso temporaneo"/>
<combo_box name="pass_combo">
@@ -448,7 +473,20 @@ Media:
<spinner label="Prezzo in L$:" name="PriceSpin"/>
<spinner label="Ore di accesso:" name="HoursSpin"/>
<panel name="Allowed_layout_panel">
+ <text label="Consenti sempre" name="AllowedText">
+ Residenti consentiti
+ </text>
<name_list name="AccessList" tool_tip="([LISTED] in lista, [MAX] max)"/>
+ <button label="Aggiungi" name="add_allowed"/>
+ <button label="Rimuovi" label_selected="Rimuovi" name="remove_allowed"/>
+ </panel>
+ <panel name="Banned_layout_panel">
+ <text label="Espelli" name="BanCheck">
+ Residenti con divieto
+ </text>
+ <name_list name="BannedList" tool_tip="([LISTED] in lista, [MAX] max)"/>
+ <button label="Aggiungi" name="add_banned"/>
+ <button label="Rimuovi" label_selected="Rimuovi" name="remove_banned"/>
</panel>
</panel>
</tab_container>
diff --git a/indra/newview/skins/default/xui/it/floater_activeim.xml b/indra/newview/skins/default/xui/it/floater_activeim.xml
index d19882fa48..0c1f0448e1 100644
--- a/indra/newview/skins/default/xui/it/floater_activeim.xml
+++ b/indra/newview/skins/default/xui/it/floater_activeim.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_activeim" title="ATTIVA IM"/>
+<floater name="floater_activeim" title="IM ATTIVO"/>
diff --git a/indra/newview/skins/default/xui/it/floater_animation_preview.xml b/indra/newview/skins/default/xui/it/floater_animation_preview.xml
index 74a994825d..77341cad63 100644
--- a/indra/newview/skins/default/xui/it/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/it/floater_animation_preview.xml
@@ -23,22 +23,22 @@ La lunghezza massima è [MAX_LENGTH] secondi.
Impossibile leggere la definizione del vincolo.
</floater.string>
<floater.string name="E_ST_NO_FILE">
- Non può aprire il file BVH.
+ Impossibile aprire il file BVH.
</floater.string>
<floater.string name="E_ST_NO_HIER">
- HIERARCHY header non valido.
+ Intestazione HIERARCHY non valida.
</floater.string>
<floater.string name="E_ST_NO_JOINT">
- Impossibile trovare la RADICE o UNIONE. ????????????
+ Impossibile trovare la ROOT o JOINT.
</floater.string>
<floater.string name="E_ST_NO_NAME">
- Impossibile trovare il nome MISTO. ??????
+ Impossibile trovare il nome JOINT.
</floater.string>
<floater.string name="E_ST_NO_OFFSET">
Impossibile trovare OFFSET.
</floater.string>
<floater.string name="E_ST_NO_CHANNELS">
- Impossibile trovare CHANNELS. ?????
+ Impossibile trovare CHANNELS.
</floater.string>
<floater.string name="E_ST_NO_ROTATION">
Impossibile ottenere un ordine di rotazione.
@@ -47,22 +47,22 @@ La lunghezza massima è [MAX_LENGTH] secondi.
Rotazione dell&apos;asse non disponibile.
</floater.string>
<floater.string name="E_ST_NO_MOTION">
- Impossibile trovare il GESTO.
+ Impossibile trovare MOTION.
</floater.string>
<floater.string name="E_ST_NO_FRAMES">
- Impossibile ottenere il numero dei frames.
+ Impossibile ottenere il numero dei frame.
</floater.string>
<floater.string name="E_ST_NO_FRAME_TIME">
Impossibile ottenere il tempo del frame.
</floater.string>
<floater.string name="E_ST_NO_POS">
- Impossibile ottenre una posizione dei valori.
+ Impossibile ottenere i valori della posizione.
</floater.string>
<floater.string name="E_ST_NO_ROT">
Impossibile ottenere i valori di rotazione.
</floater.string>
<floater.string name="E_ST_NO_XLT_FILE">
- Impossibile aprire la traduzione del file.
+ Impossibile aprire il file di traduzione.
</floater.string>
<floater.string name="E_ST_NO_XLT_HEADER">
Impossibile leggere l&apos;intestazione della traduzione.
@@ -71,31 +71,31 @@ La lunghezza massima è [MAX_LENGTH] secondi.
Impossibile leggere i nomi della traduzione.
</floater.string>
<floater.string name="E_ST_NO_XLT_IGNORE">
- Impossibile leggere la traduzione ignora il valore. ?????
+ Impossibile leggere la traduzione, ignora il valore.
</floater.string>
<floater.string name="E_ST_NO_XLT_RELATIVE">
Impossibile leggere la traduzione del valore relativo.
</floater.string>
<floater.string name="E_ST_NO_XLT_OUTNAME">
- Cannot read translation outname value.
+ Valore non trovato.
</floater.string>
<floater.string name="E_ST_NO_XLT_MATRIX">
Impossibile leggere la matrice di traduzione.
</floater.string>
<floater.string name="E_ST_NO_XLT_MERGECHILD">
- Impossibile unire il nome del bambino.
+ Impossibile trovare il nome mergechild.
</floater.string>
<floater.string name="E_ST_NO_XLT_MERGEPARENT">
- Impossibile unire il nome del genitore.
+ Impossibile ottenere il nome mergeparent.
</floater.string>
<floater.string name="E_ST_NO_XLT_PRIORITY">
- Impossibile ottenre il valore di priorità.
+ Impossibile ottenere il valore di priorità.
</floater.string>
<floater.string name="E_ST_NO_XLT_LOOP">
- Impossibile ottenere il valore di loop.
+ Impossibile ottenere il valore di ripetizione.
</floater.string>
<floater.string name="E_ST_NO_XLT_EASEIN">
- Impossibile essere in agio nei valori. ?????????
+ Impossibile ottenere i valori easeIn.
</floater.string>
<floater.string name="E_ST_NO_XLT_EASEOUT">
Cannot get ease Out values.
@@ -106,72 +106,75 @@ La lunghezza massima è [MAX_LENGTH] secondi.
<floater.string name="E_ST_NO_XLT_EMOTE">
Impossibile leggere il nome emote.
</floater.string>
+ <floater.string name="E_ST_BAD_ROOT">
+ Nome non corretto del root joint, usa &quot;hip&quot;.
+ </floater.string>
<text name="name_label">
Nome:
</text>
<text name="description_label">
Descrizione:
</text>
- <spinner label="Priorità" label_width="72" name="priority" tool_tip="Controlla quali altre animazioni possono prevalere su questa animazione" width="110"/>
- <check_box label="Ciclica" name="loop_check" tool_tip="Rendi questa animazione in loop"/>
- <spinner label="In(%)" name="loop_in_point" tool_tip="Imposta il momento nel quale l&apos;animazione inizia il loop"/>
- <spinner label="Out(%)" name="loop_out_point" tool_tip="Imposta il momento nel quale l&apos;animazione ferma il loop"/>
+ <spinner label="Priorità" label_width="72" name="priority" tool_tip="Definisce quali altre animazioni possono essere sostituite da questa animazione" width="110"/>
+ <check_box label="Ciclica" name="loop_check" tool_tip="Riproduce questa animazione in ripetizione"/>
+ <spinner label="In(%)" name="loop_in_point" tool_tip="Imposta il punto sul quale ritorna l&apos;animazione"/>
+ <spinner label="Out(%)" name="loop_out_point" tool_tip="Imposta il punto sul quale termina l&apos;animazione"/>
<text name="hand_label">
Postura della mano
</text>
- <combo_box left_delta="100" name="hand_pose_combo" tool_tip="Controlla ciò che fanno le mani durante l&apos;animazione" width="184">
+ <combo_box left_delta="100" name="hand_pose_combo" tool_tip="Definisce ciò che fanno le mani durante l&apos;animazione" width="184">
<combo_box.item label="Stendi" name="Spread"/>
<combo_box.item label="Rilassato" name="Relaxed"/>
- <combo_box.item label="indica entrambi" name="PointBoth"/>
+ <combo_box.item label="Indica entrambi" name="PointBoth"/>
<combo_box.item label="Pugno" name="Fist"/>
<combo_box.item label="Sinistra rilassata" name="RelaxedLeft"/>
<combo_box.item label="Indica sinistra" name="PointLeft"/>
- <combo_box.item label="Pugno sinistra" name="FistLeft"/>
+ <combo_box.item label="Pugno con la sinistra" name="FistLeft"/>
<combo_box.item label="Destra rilassata" name="RelaxedRight"/>
<combo_box.item label="Indica destra" name="PointRight"/>
- <combo_box.item label="Pugno Destro" name="FistRight"/>
- <combo_box.item label="Saluta Destra" name="SaluteRight"/>
- <combo_box.item label="Scrivendo" name="Typing"/>
- <combo_box.item label="Pace Destra" name="PeaceRight"/>
+ <combo_box.item label="Pugno destro" name="FistRight"/>
+ <combo_box.item label="Saluta a destra" name="SaluteRight"/>
+ <combo_box.item label="Battitura" name="Typing"/>
+ <combo_box.item label="Pace a destra" name="PeaceRight"/>
</combo_box>
<text name="emote_label">
Espressione
</text>
- <combo_box left_delta="100" name="emote_combo" tool_tip="Controlla ciò che fà il viso durante l&apos;animazione" width="184">
- <combo_box.item label="(Nessuno)" name="[None]"/>
- <combo_box.item label="Aaaaah" name="Aaaaah"/>
- <combo_box.item label="Spavento" name="Afraid"/>
- <combo_box.item label="Arrabbiato" name="Angry"/>
- <combo_box.item label="Grande sorriso" name="BigSmile"/>
- <combo_box.item label="Annoiato" name="Bored"/>
- <combo_box.item label="Pianto" name="Cry"/>
- <combo_box.item label="Disdegno" name="Disdain"/>
- <combo_box.item label="Imbarazzato" name="Embarrassed"/>
- <combo_box.item label="Accigliato ?????" name="Frown"/>
- <combo_box.item label="Bacio" name="Kiss"/>
- <combo_box.item label="Risata" name="Laugh"/>
- <combo_box.item label="Plllppt" name="Plllppt"/>
- <combo_box.item label="Repulsione" name="Repulsed"/>
- <combo_box.item label="Triste" name="Sad"/>
- <combo_box.item label="Scrollata di spalle" name="Shrug"/>
- <combo_box.item label="Sorriso" name="Smile"/>
- <combo_box.item label="Stupore" name="Surprise"/>
- <combo_box.item label="Occhiolino" name="Wink"/>
- <combo_box.item label="Preoccupato" name="Worry"/>
+ <combo_box left_delta="100" name="emote_combo" tool_tip="Definisce ciò che fa il viso durante l&apos;animazione" width="184">
+ <item label="(Nessuno)" name="[None]" value=""/>
+ <item label="Aaaaah" name="Aaaaah" value="Aaaaah"/>
+ <item label="Spavento" name="Afraid" value="Spavento"/>
+ <item label="Arrabbiato" name="Angry" value="Arrabbiato"/>
+ <item label="Grande sorriso" name="BigSmile" value="Grande sorriso"/>
+ <item label="Annoiato" name="Bored" value="Annoiato"/>
+ <item label="Pianto" name="Cry" value="Pianto"/>
+ <item label="Disdegno" name="Disdain" value="Disdegno"/>
+ <item label="Imbarazzato" name="Embarrassed" value="Imbarazzato"/>
+ <item label="Accigliato" name="Frown" value="Accigliato"/>
+ <item label="Bacio" name="Kiss" value="Bacio"/>
+ <item label="Risata" name="Laugh" value="Risata"/>
+ <item label="Plllppt" name="Plllppt" value="Linguaccia"/>
+ <item label="Repulsione" name="Repulsed" value="Repulsione"/>
+ <item label="Triste" name="Sad" value="Triste"/>
+ <item label="Scrollata di spalle" name="Shrug" value="Scrollata di spalle"/>
+ <item label="Sorriso" name="Smile" value="Sorriso"/>
+ <item label="Stupore" name="Surprise" value="Stupore"/>
+ <item label="Occhiolino" name="Wink" value="Occhiolino"/>
+ <item label="Preoccupato" name="Worry" value="Preoccupato"/>
</combo_box>
<text name="preview_label" width="250">
Vedi anteprima mentre
</text>
<combo_box left_delta="154" name="preview_base_anim" tool_tip="Da usarsi per controllare il comportamento dell&apos;animazione mentre l&apos;avatar svolge azioni abituali." width="130">
- <combo_box.item label="In piedi" name="Standing"/>
- <combo_box.item label="Camminando" name="Walking"/>
- <combo_box.item label="Sedendo" name="Sitting"/>
- <combo_box.item label="Volando" name="Flying"/>
+ <item label="In piedi" name="Standing" value="In piedi"/>
+ <item label="Camminando" name="Walking" value="Cammina"/>
+ <item label="Seduto" name="Sitting" value="Seduto"/>
+ <item label="Volo" name="Flying" value="Volo"/>
</combo_box>
- <spinner label="Avvio lento (sec)" label_width="125" name="ease_in_time" tool_tip="Tempo (in seconds) oltre il quale le animazioni si miscelano" width="192"/>
- <spinner bottom_delta="-20" label="Arresto lento (sec)" label_width="125" left="10" name="ease_out_time" tool_tip="Tempo (in seconds) oltre il quale le animazioni terminano di miscelarsi" width="192"/>
+ <spinner label="Avvio lento (sec)" label_width="125" name="ease_in_time" tool_tip="Durata (in secondi) della fusione in entrata delle animazioni" width="192"/>
+ <spinner bottom_delta="-20" label="Arresto lento (sec)" label_width="125" left="10" name="ease_out_time" tool_tip="Durata (in secondi) della fusione in uscita delle animazioni" width="192"/>
<button bottom_delta="-32" name="play_btn" tool_tip="Riproduci la tua animazione"/>
- <button name="pause_btn" tool_tip="La tua animazione in Pause"/>
+ <button name="pause_btn" tool_tip="Metti in pausa la tua animazione"/>
<button label="" name="stop_btn" tool_tip="Ferma la riproduzione dell&apos;animazione"/>
<text name="bad_animation_text">
Impossibile leggere il file dell&apos;animazione.
diff --git a/indra/newview/skins/default/xui/it/floater_auction.xml b/indra/newview/skins/default/xui/it/floater_auction.xml
index aa7b79fc50..4cad8b744d 100644
--- a/indra/newview/skins/default/xui/it/floater_auction.xml
+++ b/indra/newview/skins/default/xui/it/floater_auction.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_auction" title="INIZIA LA VENDITA DI TERRA LINDEN">
+<floater name="floater_auction" title="INIZIA LA VENDITA DI TERRENO LINDEN">
<floater.string name="already for sale">
Non puoi mettere in asta terreni che sono già in vendita.
</floater.string>
<check_box initial_value="true" label="Includi barriere di selezione gialle" name="fence_check"/>
<button label="Fotografia" label_selected="Fotografia" name="snapshot_btn"/>
<button label="Vendi a chiunque" label_selected="Vendi a chiunque" name="sell_to_anyone_btn"/>
- <button label="Annulla le Impostazioni" label_selected="Annulla le Impostazioni" name="reset_parcel_btn"/>
- <button label="Inizia l&apos;Asta" label_selected="Inizia l&apos;Asta" name="start_auction_btn"/>
+ <button label="Cancella impostazioni" label_selected="Cancella impostazioni" name="reset_parcel_btn"/>
+ <button label="Inizia l&apos;asta" label_selected="Inizia l&apos;asta" name="start_auction_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_avatar_picker.xml b/indra/newview/skins/default/xui/it/floater_avatar_picker.xml
index e583d0b8b5..7c037801e9 100644
--- a/indra/newview/skins/default/xui/it/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/it/floater_avatar_picker.xml
@@ -21,18 +21,18 @@
<tab_container name="ResidentChooserTabs">
<panel label="Cerca" name="SearchPanel">
<text name="InstructSearchResidentName">
- Scrivi parte del nome di una persona:
+ Comincia a digitare il nome della persona:
</text>
<button label="Vai" label_selected="Vai" name="Find"/>
</panel>
<panel label="Amici" name="FriendsPanel">
<text name="InstructSelectFriend">
- Seleziona una persona:
+ Scegli una persona:
</text>
</panel>
<panel label="Vicino a me" name="NearMePanel">
<text name="InstructSelectResident">
- Seleziona una persona nei dintorni:
+ Scegli una persona nei dintorni
</text>
<slider bottom_delta="-36" label="Range" name="near_me_range"/>
<text name="meters">
@@ -43,5 +43,5 @@
</panel>
</tab_container>
<button label="OK" label_selected="OK" name="ok_btn"/>
- <button label="Cancella" label_selected="Cancella" name="cancel_btn"/>
+ <button label="Annulla" label_selected="Annulla" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_avatar_textures.xml b/indra/newview/skins/default/xui/it/floater_avatar_textures.xml
index e5ce07f300..b6376973cd 100644
--- a/indra/newview/skins/default/xui/it/floater_avatar_textures.xml
+++ b/indra/newview/skins/default/xui/it/floater_avatar_textures.xml
@@ -1,32 +1,50 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="avatar_texture_debug" title="AVATAR TEXTURES">
+<floater name="avatar_texture_debug" title="TEXTURE DI AVATAR">
<floater.string name="InvalidAvatar">
AVATAR NON VALIDO
</floater.string>
- <text name="composite_label">
- Texture Composite
- </text>
- <button label="Deposito" label_selected="Deposito" name="Dump"/>
- <texture_picker label="Capelli" name="hair_grain"/>
- <texture_picker label="Capelli Alpha" name="hair_alpha"/>
- <texture_picker label="Trucco" name="head_bodypaint"/>
- <texture_picker label="Testa Alpha" name="head_alpha"/>
- <texture_picker label="Tatuaggio Testa" name="head_tattoo"/>
- <texture_picker label="Occhio" name="eyes_iris"/>
- <texture_picker label="Occhi Alpha" name="eyes_alpha"/>
- <texture_picker label="Bodypaint Corpo Superiore" name="upper_bodypaint"/>
- <texture_picker label="Maglietta intima" name="upper_undershirt"/>
- <texture_picker label="Guanti" name="upper_gloves"/>
- <texture_picker label="Camicia" name="upper_shirt"/>
- <texture_picker label="Giacca superiore" name="upper_jacket"/>
- <texture_picker label="Alpha Superiore" name="upper_alpha"/>
- <texture_picker label="Tatuaggio superiore" name="upper_tattoo"/>
- <texture_picker label="Bodypaint Corpo Inferiore" name="lower_bodypaint"/>
- <texture_picker label="Slip" name="lower_underpants"/>
- <texture_picker label="Calze" name="lower_socks"/>
- <texture_picker label="Scarpe" name="lower_shoes"/>
- <texture_picker label="Pantaloni" name="lower_pants"/>
- <texture_picker label="Giacca" name="lower_jacket"/>
- <texture_picker label="Alpha Inferiore" name="lower_alpha"/>
- <texture_picker label="Tatuaggio basso" name="lower_tattoo"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="label">
+ Baking delle
+texture
+ </text>
+ <text name="composite_label">
+ Composito
+Texture
+ </text>
+ <button label="Memorizza gli ID sulla console" label_selected="Dump" name="Dump"/>
+ <panel name="scroll_content_panel">
+ <texture_picker label="Capigliature" name="hair-baked"/>
+ <texture_picker label="Capigliature" name="hair_grain"/>
+ <texture_picker label="Alpha dei capelli" name="hair_alpha"/>
+ <texture_picker label="Testa" name="head-baked"/>
+ <texture_picker label="Makeup" name="head_bodypaint"/>
+ <texture_picker label="Alpha della testa" name="head_alpha"/>
+ <texture_picker label="Tatuaggio della testa" name="head_tattoo"/>
+ <texture_picker label="Occhi" name="eyes-baked"/>
+ <texture_picker label="Occhio" name="eyes_iris"/>
+ <texture_picker label="Alpha degli occhi" name="eyes_alpha"/>
+ <texture_picker label="Parte superiore del corpo" name="upper-baked"/>
+ <texture_picker label="Bodypaint parte superiore del corpo" name="upper_bodypaint"/>
+ <texture_picker label="Maglietta intima" name="upper_undershirt"/>
+ <texture_picker label="Guanti" name="upper_gloves"/>
+ <texture_picker label="Camicia" name="upper_shirt"/>
+ <texture_picker label="Parte superiore della giacca" name="upper_jacket"/>
+ <texture_picker label="Alpha superiore" name="upper_alpha"/>
+ <texture_picker label="Tatuaggio superiore" name="upper_tattoo"/>
+ <texture_picker label="Parte inferiore del corpo" name="lower-baked"/>
+ <texture_picker label="BodyPaint parte inferiore del corpo" name="lower_bodypaint"/>
+ <texture_picker label="Slip" name="lower_underpants"/>
+ <texture_picker label="Calzini" name="lower_socks"/>
+ <texture_picker label="Scarpe" name="lower_shoes"/>
+ <texture_picker label="Pantaloni" name="lower_pants"/>
+ <texture_picker label="Giacca" name="lower_jacket"/>
+ <texture_picker label="Alpha inferiore" name="lower_alpha"/>
+ <texture_picker label="Tattuaggio inferiore" name="lower_tattoo"/>
+ <texture_picker label="Gonna" name="skirt-baked"/>
+ <texture_picker label="Gonna" name="skirt"/>
+ </panel>
+ </panel>
+ </scroll_container>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_beacons.xml b/indra/newview/skins/default/xui/it/floater_beacons.xml
index 8fd69d811d..ca6711468d 100644
--- a/indra/newview/skins/default/xui/it/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/it/floater_beacons.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="beacons" title="BEACONS">
+<floater name="beacons" title="MARCATORI">
<panel name="beacons_panel">
<text name="label_show">
Mostra:
</text>
- <check_box label="Beacons" name="beacons"/>
- <check_box label="Highlights" name="highlights"/>
- <text name="beacon_width_label" tool_tip="Beacon width">
+ <check_box label="Marcatori" name="beacons"/>
+ <check_box label="In evidenza" name="highlights"/>
+ <text name="beacon_width_label" tool_tip="Larghezza marcatore">
Larghezza:
</text>
<text name="label_objects">
@@ -15,7 +15,7 @@
<check_box label="Fisico" name="physical"/>
<check_box label="Scripted" name="scripted"/>
<check_box label="Tocca solo" name="touch_only"/>
- <check_box label="Fonte del Suono" name="sounds"/>
- <check_box label="Fonte delle Particle" name="particles"/>
+ <check_box label="Fonti sonore" name="sounds"/>
+ <check_box label="Fonti delle particelle" name="particles"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_build_options.xml b/indra/newview/skins/default/xui/it/floater_build_options.xml
index 233efef19b..326aab1a31 100644
--- a/indra/newview/skins/default/xui/it/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/it/floater_build_options.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="build options floater" title="GRID OPTIONS">
- <spinner label="Grid Units (meters)" label_width="192" name="GridResolution" width="250"/>
+<floater name="build options floater" title="OPZIONI DELLA GRIGLIA">
+ <spinner label="Unità griglia (metri)" label_width="192" name="GridResolution" width="250"/>
<spinner label="Estensione della griglia (metri)" label_width="192" name="GridDrawSize" width="250"/>
- <check_box label="Usa allineamento sub-unitario" name="GridSubUnit"/>
- <check_box label="Guarda le cross-sections" name="GridCrossSection"/>
- <text name="grid_opacity_label" tool_tip="Opacità della Grid">
+ <check_box label="Usa sottounità" name="GridSubUnit"/>
+ <check_box label="Guarda le sezioni trasversali" name="GridCrossSection"/>
+ <text name="grid_opacity_label" tool_tip="Opacità della griglia">
Opacità:
</text>
<slider label="Trasparenza della griglia" name="GridOpacity" width="250"/>
diff --git a/indra/newview/skins/default/xui/it/floater_bulk_perms.xml b/indra/newview/skins/default/xui/it/floater_bulk_perms.xml
index 26890dc209..89f4a0cb71 100644
--- a/indra/newview/skins/default/xui/it/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/it/floater_bulk_perms.xml
@@ -13,27 +13,27 @@
Conclusa richiesta di modifica dei permessi.
</floater.string>
<check_box label="Animazioni" name="check_animation"/>
- <icon name="icon_animation" tool_tip="Animazioni"/>
+ <icon name="icon_animation" tool_tip="Animazione"/>
<check_box label="Parti del corpo" name="check_bodypart"/>
- <icon name="icon_bodypart" tool_tip="Parti del Corpo"/>
+ <icon name="icon_bodypart" tool_tip="Parti del corpo"/>
<check_box label="Abiti" name="check_clothing"/>
<icon name="icon_clothing" tool_tip="Vestiario"/>
<check_box label="Gesture" name="check_gesture"/>
- <icon name="icon_gesture" tool_tip="Gestures"/>
+ <icon name="icon_gesture" tool_tip="Gesture"/>
<check_box label="Notecard" name="check_notecard"/>
- <icon name="icon_notecard" tool_tip="Notecards"/>
+ <icon name="icon_notecard" tool_tip="Biglietti"/>
<check_box label="Oggetti" name="check_object"/>
<icon name="icon_object" tool_tip="Oggetti"/>
<check_box label="Script" name="check_script"/>
- <icon name="icon_script" tool_tip="Scripts"/>
+ <icon name="icon_script" tool_tip="Script"/>
<check_box label="Suoni" name="check_sound"/>
<icon name="icon_sound" tool_tip="Suoni"/>
<check_box label="Texture" name="check_texture"/>
- <icon name="icon_texture" tool_tip="Textures"/>
- <button label="√ Tutto" label_selected="Tutti" name="check_all"/>
- <button label="Pulisci" label_selected="Nessuno" name="check_none"/>
+ <icon name="icon_texture" tool_tip="Texture"/>
+ <button label="√ Tutti" label_selected="Tutti" name="check_all"/>
+ <button label="Cancella" label_selected="Nessuno" name="check_none"/>
<text name="newperms">
- Nuovo Permessi del Contenuto
+ Nuovi permessi del contenuto
</text>
<text name="GroupLabel">
Gruppo:
@@ -44,11 +44,11 @@
</text>
<check_box label="Copia" name="everyone_copy"/>
<text name="NextOwnerLabel">
- Prossimo proprietario:
+ Proprietario successivo:
</text>
<check_box label="Modificare" name="next_owner_modify"/>
<check_box label="Copiare" name="next_owner_copy"/>
- <check_box initial_value="true" label="Transfer" name="next_owner_transfer" tool_tip="Prossimo proprietario può donare o rivendere questo oggetto"/>
- <button label="Ok" name="apply"/>
- <button label="Cancella" name="close"/>
+ <check_box initial_value="true" label="Trasferisci" name="next_owner_transfer" tool_tip="Il prossimo proprietario può regalare o rivendere questo oggetto"/>
+ <button label="OK" name="apply"/>
+ <button label="Annulla" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_buy_contents.xml b/indra/newview/skins/default/xui/it/floater_buy_contents.xml
index e84d396138..a54751e629 100644
--- a/indra/newview/skins/default/xui/it/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/it/floater_buy_contents.xml
@@ -8,8 +8,7 @@
</text>
<button label="Annulla" label_selected="Annulla" name="cancel_btn" width="73"/>
<button label="Compra" label_selected="Compra" left_delta="-77" name="buy_btn" width="73"/>
- <check_box bottom="-234" label="Indossa adesso
-l&apos;indumento" left_delta="-125" name="wear_check"/>
+ <check_box bottom="-234" label="Indossa adesso l&apos;indumento" left_delta="-125" name="wear_check"/>
<string name="no_copy_text">
(non copiabile)
</string>
diff --git a/indra/newview/skins/default/xui/it/floater_buy_currency.xml b/indra/newview/skins/default/xui/it/floater_buy_currency.xml
index 9d97f7d72d..1327e8b172 100644
--- a/indra/newview/skins/default/xui/it/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/it/floater_buy_currency.xml
@@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="buy currency" title="COMPRA L$">
+<floater name="buy currency" title="ACQUISTA L$">
<floater.string name="buy_currency">
- Compra L$ [LINDENS] per approx. [LOCALAMOUNT]
+ Acquista [LINDENS] L$ per circa [LOCALAMOUNT]
</floater.string>
<text font="SansSerifLarge" left="5" name="info_need_more" right="-5">
- Necessiti di più L$
+ Ti servono più L$
</text>
<text name="contacting">
Sto contattando il LindeX...
</text>
<text name="info_buying">
- COMPRA L$
+ Acquista L$
</text>
<text name="balance_label">
Io ho
@@ -19,7 +19,7 @@
[AMT]L$
</text>
<text name="currency_action" width="45">
- Io voglio comprare
+ Voglio acquistare
</text>
<text name="currency_label">
L$
@@ -31,13 +31,13 @@
Al prezzo
</text>
<text name="currency_est">
- approx. [LOCALAMOUNT]
+ circa [LOCALAMOUNT]
</text>
<text name="getting_data">
- Calcolando...
+ Stima in corso...
</text>
<text name="buy_action">
- [NAME] [PRICE]L$
+ [ACTION]
</text>
<text name="total_label">
Il mio saldo sarà
@@ -46,18 +46,18 @@
[AMT]L$
</text>
<text name="currency_links">
- [http://www.secondlife.com/ payment method] | [http://www.secondlife.com/ currency] | [http://www.secondlife.com/my/account/exchange_rates.php exchange rate]
+ [http://www.secondlife.com/my/account/payment_method_management.php payment method] | [http://www.secondlife.com/my/account/currency.php currency] | [http://www.secondlife.com/my/account/exchange_rates.php exchange rate]
</text>
<text name="exchange_rate_note">
- Ri-scrivi un importo per vedere l&apos;ultimo rapporto di cambio.
+ Riscrivi l&apos;importo per vedere l&apos;ultimo tasso al cambio.
</text>
<text name="purchase_warning_repurchase">
- Confermando questo acquisto di soli L$, non l&apos;oggetto.
+ La conferma di questo acquisto compra solo L$, non l&apos;oggetto.
</text>
<text bottom_delta="16" name="purchase_warning_notenough">
- Non stai acquistando abbastanza L$. Per favore aumenta l&apos;importo.
+ Non stai acquistando abbastanza L$. Aumenta l&apos;importo.
</text>
- <button label="Compra ora" name="buy_btn"/>
+ <button label="Acquista adesso" name="buy_btn"/>
<button label="Cancella" name="cancel_btn"/>
<text left="5" name="info_cannot_buy" right="-5">
Non in grado di acquistare
diff --git a/indra/newview/skins/default/xui/it/floater_buy_currency_html.xml b/indra/newview/skins/default/xui/it/floater_buy_currency_html.xml
new file mode 100644
index 0000000000..4a1bf33403
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_buy_currency_html.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_buy_currency_html" title="ACQUISTA VALUTA"/>
diff --git a/indra/newview/skins/default/xui/it/floater_buy_land.xml b/indra/newview/skins/default/xui/it/floater_buy_land.xml
index 9fa5bd5570..f3b30f7048 100644
--- a/indra/newview/skins/default/xui/it/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/it/floater_buy_land.xml
@@ -1,5 +1,129 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="buy land" title="COMPRA LA TERRA">
+<floater name="buy land" title="ACQUISTA TERRENO">
+ <floater.string name="can_resell">
+ Può essere rivenduto.
+ </floater.string>
+ <floater.string name="can_not_resell">
+ Può non essere rivenduto.
+ </floater.string>
+ <floater.string name="can_change">
+ Può essere unito o suddiviso.
+ </floater.string>
+ <floater.string name="can_not_change">
+ Non può essere unito o suddiviso.
+ </floater.string>
+ <floater.string name="cant_buy_for_group">
+ Non sei autorizzato ad acquistare terreno per il tuo gruppo attivo.
+ </floater.string>
+ <floater.string name="no_land_selected">
+ Nessun terreno selezionato.
+ </floater.string>
+ <floater.string name="multiple_parcels_selected">
+ Hai selezionato lotti diversi.
+Prova a selezionare un&apos;area più piccola.
+ </floater.string>
+ <floater.string name="no_permission">
+ Non sei autorizzato ad acquistare terreno per il tuo gruppo attivo.
+ </floater.string>
+ <floater.string name="parcel_not_for_sale">
+ Il terreno selezionato non è in vendita.
+ </floater.string>
+ <floater.string name="group_already_owns">
+ Il gruppo possiede già il terreno.
+ </floater.string>
+ <floater.string name="you_already_own">
+ Sei già proprietario del terreno.
+ </floater.string>
+ <floater.string name="set_to_sell_to_other">
+ Il terreno selezionato è già impostato per la vendita ad un altro gruppo.
+ </floater.string>
+ <floater.string name="no_public_land">
+ L&apos;area selezionata non è pubblica.
+ </floater.string>
+ <floater.string name="not_owned_by_you">
+ Hai selezionato terreno di proprietà di un altro residente.
+Prova a scegliere una superficie più piccola.
+ </floater.string>
+ <floater.string name="processing">
+ Stiamo elaborando il tuo acquisto...
+
+(Potrebbe volerci un minuto o due.)
+ </floater.string>
+ <floater.string name="fetching_error">
+ Si &apos;e verificato un errore mentre si stavano ottenendo le informazioni sull&apos;acquisto del terreno.
+ </floater.string>
+ <floater.string name="buying_will">
+ Acuistando il terreno:
+ </floater.string>
+ <floater.string name="buying_for_group">
+ Acuistando il terreno per il gruppo:
+ </floater.string>
+ <floater.string name="cannot_buy_now">
+ Non puoi comprare ora:
+ </floater.string>
+ <floater.string name="not_for_sale">
+ Non in vendita:
+ </floater.string>
+ <floater.string name="none_needed">
+ nessuno necessario
+ </floater.string>
+ <floater.string name="must_upgrade">
+ Per acquistare terreno devi passare a un livello di abbonamento superiore.
+ </floater.string>
+ <floater.string name="cant_own_land">
+ Con questo account puoi essere proprietario di terreno.
+ </floater.string>
+ <floater.string name="land_holdings">
+ Sei proprietario di [BUYER] m² di terreno.
+ </floater.string>
+ <floater.string name="pay_to_for_land">
+ Paga [AMOUNT] L$ a [SELLER] per questa terra
+ </floater.string>
+ <floater.string name="buy_for_US">
+ Acquista L$ [AMOUNT] per circa [LOCAL_AMOUNT],
+ </floater.string>
+ <floater.string name="parcel_meters">
+ Questo lotto è di [AMOUNT] m²
+ </floater.string>
+ <floater.string name="premium_land">
+ Questo terreno è premium, e costerà come [AMOUNT] m².
+ </floater.string>
+ <floater.string name="discounted_land">
+ Questo terreno è scontato, e costerà come [AMOUNT] m².
+ </floater.string>
+ <floater.string name="meters_supports_object">
+ [AMOUNT] m²
+consente [AMOUNT2] oggetti
+ </floater.string>
+ <floater.string name="sold_with_objects">
+ venduta con oggetti
+ </floater.string>
+ <floater.string name="sold_without_objects">
+ Oggetti non inclusi
+ </floater.string>
+ <floater.string name="info_price_string">
+ L$ [PRICE]
+([PREZZO_PER_MQ] L$/m²)
+[VENDUTO_CON_OGGETTI]
+ </floater.string>
+ <floater.string name="insufficient_land_credits">
+ Il gruppo [GROUP] avrà bisogno di contributi di crediti di utilizzo terreno sufficienti a coprire il terreno prima che l&apos;acquisto sia completato.
+ </floater.string>
+ <floater.string name="have_enough_lindens">
+ Hai [AMOUNT] L$, che sono sufficienti per comprare questo terreno.
+ </floater.string>
+ <floater.string name="not_enough_lindens">
+ Hai solo [AMOUNT] L$, ed hai bisogno di altri [AMOUNT2] L$.
+ </floater.string>
+ <floater.string name="balance_left">
+ Dopo l&apos;acquisto, ti rimarranno [AMOUNT] L$.
+ </floater.string>
+ <floater.string name="balance_needed">
+ Hai bisogno di acquistare almeno [AMOUNT] L$ per comprare questo terreno.
+ </floater.string>
+ <floater.string name="no_parcel_selected">
+ (nessun terreno selezionato)
+ </floater.string>
<text name="region_name_label">
Regione:
</text>
@@ -58,8 +182,8 @@
</text>
<text name="info_price">
L$ 1500
-(L$ 1.1/m²)
-sold with objects
+( 1.1 L$/m²)
+venduto con oggetti
</text>
<text name="info_action">
Comprando questa terra:
@@ -75,16 +199,16 @@ sold with objects
Solo i membri premium possono possedere terra.
</text>
<combo_box name="account_level">
- <combo_box.item label="US$9.95/mese, addebitato mensilmente" name="US$9.95/month,billedmonthly"/>
- <combo_box.item label="US$7.50/mese, addebitato trimestralmente" name="US$7.50/month,billedquarterly"/>
- <combo_box.item label="US$6.00/mese, addebitato annualmente" name="US$6.00/month,billedannually"/>
+ <combo_box.item label="US$ 9.95 al mese, addebitato mensilmente" name="US$9.95/month,billedmonthly"/>
+ <combo_box.item label="US$ 7.50 al mese, addebitato trimestralmente" name="US$7.50/month,billedquarterly"/>
+ <combo_box.item label="US$ 6.00 al mese, addebitato annualmente" name="US$6.00/month,billedannually"/>
</combo_box>
<text name="land_use_action">
- Aumenta il tasso di pagamento mensile delle tasse d&apos;uso della terra a 40 US$/mese.
+ Aumenta le tariffe mensili di utilizzo del terreno a 40 US$/mese.
</text>
<text name="land_use_reason">
Tu occupi 1309 m² di terreno.
-This parcel is 512 m² di terreno.
+Questo lotto consiste in 512 m² di terreno.
</text>
<text name="purchase_action">
Paga il residente Joe 4000 L$ per la terra
@@ -99,7 +223,7 @@ This parcel is 512 m² di terreno.
1000
</line_editor>
<text name="currency_est">
- per circa. [LOCAL_AMOUNT]
+ per circa [LOCAL_AMOUNT]
</text>
<text name="currency_balance">
Possiedi 2.100 L$.
@@ -107,133 +231,4 @@ This parcel is 512 m² di terreno.
<check_box label="Rimuovi [AMOUNT] m² di contribuzione dal gruppo." name="remove_contribution"/>
<button label="Compra" name="buy_btn"/>
<button label="Annulla" name="cancel_btn"/>
- <string name="can_resell">
- Può essere rivenduta.
- </string>
- <string name="can_not_resell">
- Può non essere rivenduta.
- </string>
- <string name="can_change">
- Può essere unita o suddivisa.
- </string>
- <string name="can_not_change">
- Non può essere unita o suddivisa.
- </string>
- <string name="cant_buy_for_group">
- Non hai il permesso di comprare terra per il tuo gruppo attivo.
- </string>
- <string name="no_land_selected">
- Nessuna terra selezionata.
- </string>
- <string name="multiple_parcels_selected">
- Hai selezionato appezzamenti diversi.
-Prova a selezionare un&apos;area più piccola.
- </string>
- <string name="no_permission">
- Non hai il permesso di comprare terra per il tuo gruppo attivo.
- </string>
- <string name="parcel_not_for_sale">
- Il terreno selezionato non è in vendita.
- </string>
- <string name="group_already_owns">
- Il gruppo possiede già il terreno.
- </string>
- <string name="you_already_own">
- Possiedi già il terreno.
- </string>
- <string name="set_to_sell_to_other">
- Il terreno selezionato è già impostato per la vendita ad un altro gruppo.
- </string>
- <string name="no_public_land">
- L&apos;area selezionata non è pubblica.
- </string>
- <string name="not_owned_by_you">
- Hai selezionato una terra posseduta da un altro utente.
-Prova a selezionare un&apos;area più piccola.
- </string>
- <string name="processing">
- Stiamo elaborando il tuo acquisto...
-
-(Potrebbe volerci un minuto o due.)
- </string>
- <string name="fetching_error">
- C&apos;e stato un errore mentre si stavano ottenendo le informazioni sull&apos;acquisto della terra.
- </string>
- <string name="buying_will">
- Comprando questa terra:
- </string>
- <string name="buying_for_group">
- Comprare la terra per il gruppo farà:
- </string>
- <string name="cannot_buy_now">
- Non puoi comprare ora:
- </string>
- <string name="not_for_sale">
- Non in vendita:
- </string>
- <string name="none_needed">
- nessuno necessario
- </string>
- <string name="must_upgrade">
- Il tuo tipo di account ha bisogno di un upgrade per possedere terra.
- </string>
- <string name="cant_own_land">
- Il tuo account può possedere terra.
- </string>
- <string name="land_holdings">
- Tu occupi [BUYER] m² di terreno.
- </string>
- <string name="pay_to_for_land">
- Paga [AMOUNT] L$ a [SELLER] per questa terra
- </string>
- <string name="buy_for_US">
- Compra L$ [AMOUNT] per circa. [LOCAL_AMOUNT],
- </string>
- <string name="parcel_meters">
- Questo parcel è [AMOUNT] m²
- </string>
- <string name="premium_land">
- Questo terreno è premium, e costerà [AMOUNT] m².
- </string>
- <string name="discounted_land">
- Questo terreno è scontato, e costerà [AMOUNT] m².
- </string>
- <string name="meters_supports_object">
- [AMOUNT] m²
-mantiene [AMOUNT2] oggetti
- </string>
- <string name="sold_with_objects">
- venduta con oggetti
- </string>
- <string name="sold_without_objects">
- Oggetti non inclusi
- </string>
- <string name="info_price_string">
- L$ [PRICE]
-(L$ [PREZZO_PER_QM]/m²)
-[VENDUTO_CON_OGGETTI]
- </string>
- <string name="insufficient_land_credits">
- Il gruppo [GROUP] avrà bisogno di contribuzioni anticipate, mediante crediti d&apos;uso terriero,
-sufficienti a coprire l&apos;area del terreno prima che l&apos;acquisto
-sia completato.
- </string>
- <string name="have_enough_lindens">
- Hai [AMOUNT] L$, che sono sufficienti per comprare questa terra.
- </string>
- <string name="not_enough_lindens">
- Hai solo [AMOUNT] L$, ed hai bisogno di altri [AMOUNT2] L$.
- </string>
- <string name="balance_left">
- Dopo l&apos;acquisto, ti rimarranno [AMOUNT] L$.
- </string>
- <string name="balance_needed">
- Hai bisogno di acquistare almeno [AMOUNT] L$ per comprare questo terreno.
- </string>
- <string name="no_parcel_selected">
- (nessun terreno selezionato)
- </string>
- <string name="buy_currency">
- Compra [LINDENS] L$ per appross. [USD] US$
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_buy_object.xml b/indra/newview/skins/default/xui/it/floater_buy_object.xml
index 5f3413931b..895d8aa746 100644
--- a/indra/newview/skins/default/xui/it/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/it/floater_buy_object.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="contents" title="COMPRA COPIA DELL&apos;OGGETTO">
+<floater name="contents" title="ACQUISTA COPIA DELL&apos;OGGETTO">
<text name="contents_text">
Contiene:
</text>
diff --git a/indra/newview/skins/default/xui/it/floater_camera.xml b/indra/newview/skins/default/xui/it/floater_camera.xml
index 182f82f17f..f524bf9874 100644
--- a/indra/newview/skins/default/xui/it/floater_camera.xml
+++ b/indra/newview/skins/default/xui/it/floater_camera.xml
@@ -9,23 +9,28 @@
<floater.string name="move_tooltip">
Muovi la telecamera su e giù e a sinistra e destra
</floater.string>
+ <floater.string name="camera_modes_title">
+ Modalità della fotocamera
+ </floater.string>
+ <floater.string name="pan_mode_title">
+ Ruota visuale - Ingrandisci - Panoramica
+ </floater.string>
+ <floater.string name="presets_mode_title">
+ Visuali predefinite
+ </floater.string>
+ <floater.string name="free_mode_title">
+ Vedi oggetto
+ </floater.string>
<panel name="controls">
- <joystick_track name="cam_track_stick" tool_tip="Sposta la visuale sù e giù, sinistra e destra"/>
<panel name="zoom" tool_tip="Avvicina la telecamera nell&apos;inquadratura">
- <slider_bar name="zoom_slider" tool_tip="Zoom verso il focus"/>
- </panel>
- <joystick_rotate name="cam_rotate_stick" tool_tip="Ruota la visuale intorno al focus"/>
- <panel name="camera_presets">
- <button name="rear_view" tool_tip="Visuale posteriore"/>
- <button name="group_view" tool_tip="Visuale di Gruppo"/>
- <button name="front_view" tool_tip="Visuale Frontale"/>
- <button name="mouselook_view" tool_tip="Visuale Mouselook"/>
+ <joystick_rotate name="cam_rotate_stick" tool_tip="Ruota la visuale intorno al punto focale"/>
+ <slider_bar name="zoom_slider" tool_tip="Zoom verso il centro focale"/>
+ <joystick_track name="cam_track_stick" tool_tip="Sposta la visuale in su e in giù, a sinistra e a destra"/>
</panel>
</panel>
<panel name="buttons">
- <button label="" name="orbit_btn" tool_tip="Ruota la visuale"/>
- <button label="" name="pan_btn" tool_tip="Visuale Panoramica"/>
- <button label="" name="avatarview_btn" tool_tip="Guardare un avatar"/>
- <button label="" name="freecamera_btn" tool_tip="Vedi oggetto"/>
+ <button label="" name="presets_btn" tool_tip="Visuali predefinite"/>
+ <button label="" name="pan_btn" tool_tip="Ruota visuale - Ingrandisci - Panoramica"/>
+ <button label="" name="avatarview_btn" tool_tip="Modalità della fotocamera"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_color_picker.xml b/indra/newview/skins/default/xui/it/floater_color_picker.xml
index 8551d65da2..38d4a0a037 100644
--- a/indra/newview/skins/default/xui/it/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/it/floater_color_picker.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="ColorPicker" title="SELETTORE di COLORE">
+<floater name="ColorPicker" title="SELETTORE DI COLORE">
<text name="r_val_text">
Rosso:
</text>
@@ -24,10 +24,10 @@
Luminosità:
</text>
<spinner left="84" name="lspin" width="47"/>
- <check_box label="Applica ora" name="apply_immediate"/>
+ <check_box label="Applica adesso" name="apply_immediate"/>
<button left_delta="150" name="color_pipette"/>
<button label="Annulla" label_selected="Annulla" left_delta="55" name="cancel_btn"/>
- <button label="Ok" label_selected="Ok" name="select_btn"/>
+ <button label="OK" label_selected="OK" name="select_btn"/>
<text name="Current color:">
Colore attuale:
</text>
diff --git a/indra/newview/skins/default/xui/it/floater_customize.xml b/indra/newview/skins/default/xui/it/floater_customize.xml
index 63e08444cd..63c26b4d73 100644
--- a/indra/newview/skins/default/xui/it/floater_customize.xml
+++ b/indra/newview/skins/default/xui/it/floater_customize.xml
@@ -1,9 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater customize" title="ASPETTO" width="551">
- <tab_container name="customize tab container" tab_min_width="120" width="549">
- <placeholder label="Parti del corpo" name="body_parts_placeholder"/>
- <panel label="Forma del corpo" left="124" name="Shape" width="389">
- <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
+<floater name="floater customize" title="ASPETTO">
+ <tab_container name="customize tab container" tab_min_width="120">
+ <text label="Parti del corpo" name="body_parts_placeholder">
+ Parti del corpo
+ </text>
+ <panel label="Forma del corpo" left="124" name="Shape">
+ <button label="Crea una nuova forma del corpo" label_selected="Crea una nuova forma del corpo" name="Create New" width="190"/>
<button label="Corpo" label_selected="Corpo" name="Body"/>
<button label="Testa" label_selected="Testa" name="Head"/>
<button label="Occhi" label_selected="Occhi" name="Eyes"/>
@@ -14,8 +16,8 @@
<button label="Torso" label_selected="Torso" name="Torso"/>
<button label="Gambe" label_selected="Gambe" name="Legs"/>
<radio_group name="sex radio">
- <radio_item label="Femmina" name="radio"/>
- <radio_item label="Maschio" name="radio2"/>
+ <radio_item label="Femmina" name="radio" value="0"/>
+ <radio_item label="Maschio" name="radio2" value="1"/>
</radio_group>
<text name="title">
[DESC]
@@ -33,18 +35,17 @@
Ubicato in [PATH]
</text>
<text name="not worn instructions">
- Indossa una nuova Forma del Corpo trascinandone una dall&apos;inventario
-sul tuo avatar. In alternativa, puoi crearne una nuova ed indossarla.
+ Metti una nuova figura corporea trascinandola dal tuo inventario sul tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo.
</text>
<text name="no modify instructions">
Non hai il permesso di modificare questo indumento.
</text>
- <text name="Item Action Label" right="89">
+ <text name="Item Action Label">
Forma del corpo:
</text>
- <button label="Crea una nuova forma del corpo" label_selected="Crea una nuova forma del corpo" name="Create New" width="190"/>
- <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
- <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
+ <button label="Salva" label_selected="Salva" name="Save"/>
+ <button label="Salva come..." label_selected="Salva come..." name="Save As"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert"/>
</panel>
<panel label="Pelle" name="Skin">
<button label="Colore della pelle" label_selected="Colore della pelle" name="Skin Color" width="115"/>
@@ -67,8 +68,7 @@ sul tuo avatar. In alternativa, puoi crearne una nuova ed indossarla.
Ubicata in [PATH]
</text>
<text name="not worn instructions">
- Indossa una nuova pelle trascinandola dall&apos;inventario al tuo avatar.
-In alternativa, puoi crearne una nuova da zero ed indossarla.
+ Per mettere una nuova pelle, trascinala dal tuo inventario sul tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo.
</text>
<text name="no modify instructions">
Non hai il permesso di modificare questo indumento.
@@ -80,9 +80,9 @@ In alternativa, puoi crearne una nuova da zero ed indossarla.
<texture_picker label="Tatuaggi: superiori" name="Upper Tattoos" tool_tip="Clicca per scegliere un&apos;immagine" width="96"/>
<texture_picker label="Tatuaggi: inferiori" name="Lower Tattoos" tool_tip="Clicca per scegliere un&apos;immagine" width="96"/>
<button label="Crea una nuova pelle" label_selected="Crea una nuova pelle" name="Create New"/>
- <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
- <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
- <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
+ <button label="Salva" label_selected="Salva" name="Save"/>
+ <button label="Salva come..." label_selected="Salva come..." name="Save As"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert"/>
</panel>
<panel label="Capelli" name="Hair">
<button label="Capelli" label_selected="Colore" name="Color"/>
@@ -105,8 +105,7 @@ In alternativa, puoi crearne una nuova da zero ed indossarla.
Ubicati in [PATH]
</text>
<text name="not worn instructions">
- Indossa dei nuovi capelli trascinandoli dall&apos;inventario al tuo avatar.
-In alternativa, puoi crearne di nuovi da zero ed indossarli.
+ Per cambiare capelli, trascinali dal tuo inventario sul tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo.
</text>
<text name="no modify instructions">
Non hai il permesso per modificare questo indumento.
@@ -116,9 +115,9 @@ In alternativa, puoi crearne di nuovi da zero ed indossarli.
</text>
<texture_picker label="Texture" name="Texture" tool_tip="Clicca per scegliere un&apos;immagine"/>
<button label="Crea nuovi capelli" label_selected="Crea nuovi capelli" name="Create New"/>
- <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva" label_selected="Salva" name="Save"/>
<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
- <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>
</panel>
<panel label="Occhi" name="Eyes">
<text name="title">
@@ -137,8 +136,7 @@ In alternativa, puoi crearne di nuovi da zero ed indossarli.
Ubicati in [PATH]
</text>
<text name="not worn instructions">
- Indossa dei nuovi occhi trascinandoli dall&apos;inventario al tuo avatar.
-In alternativa, puoi crearne di nuovi da zero ed indossarli.
+ Puoi cambiare gli occhi trascinandoli dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo.
</text>
<text name="no modify instructions">
Non hai il permesso di modificare questo indumento.
@@ -148,19 +146,21 @@ In alternativa, puoi crearne di nuovi da zero ed indossarli.
</text>
<texture_picker label="Iride" name="Iris" tool_tip="Clicca per scegliere un&apos;immagine"/>
<button label="Crea nuovi occhi" label_selected="Crea nuovi occhi" name="Create New"/>
- <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva" label_selected="Salva" name="Save"/>
<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
- <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>
</panel>
- <placeholder label="Vestiti" name="clothes_placeholder"/>
+ <text label="Vestiti" name="clothes_placeholder">
+ Abiti
+ </text>
<panel label="Camicia" name="Shirt">
<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un&apos;immagine"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
- <button label="Crea una nuova camicia" label_selected="Crea una nuova camicia" name="Create New"/>
<button label="Togli" label_selected="Togli" name="Take Off"/>
- <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Crea una nuova camicia" label_selected="Crea una nuova camicia" name="Create New"/>
+ <button label="Salva" label_selected="Salva" name="Save"/>
<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
- <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>
<text name="title">
[DESC]
</text>
@@ -177,8 +177,7 @@ In alternativa, puoi crearne di nuovi da zero ed indossarli.
Ubicata in [PATH]
</text>
<text name="not worn instructions">
- Indossa una nuova maglietta trascinandola dall&apos;inventario al tuo avatar.
-In alternativa, puoi crearne una nuova da zero ed indossarla.
+ Metti una nuova camicia trascinandola dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo.
</text>
<text name="no modify instructions">
Non hai il permesso di modificare questo indumento.
@@ -190,11 +189,11 @@ In alternativa, puoi crearne una nuova da zero ed indossarla.
<panel label="Pantaloni" name="Pants">
<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un&apos;immagine"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
- <button label="Crea nuovi pantaloni" label_selected="Crea nuovi pantaloni" name="Create New"/>
<button label="Togli" label_selected="Togli" name="Take Off"/>
- <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Crea nuovi pantaloni" label_selected="Crea nuovi pantaloni" name="Create New"/>
+ <button label="Salva" label_selected="Salva" name="Save"/>
<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
- <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>
<text name="title">
[DESC]
</text>
@@ -211,8 +210,7 @@ In alternativa, puoi crearne una nuova da zero ed indossarla.
Ubicati in [PATH]
</text>
<text name="not worn instructions">
- Indossa dei nuovi pantaloni trascinandoli dall&apos;inventario al tuo avatar.
-In alternativa, puoi crearne uno paio nuovo da zero ed indossarlo.
+ Metti dei nuovi pantaloni trascinandoli dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo.
</text>
<text name="no modify instructions">
Non hai il permesso di modificare questo indumento.
@@ -238,9 +236,9 @@ In alternativa, puoi crearne uno paio nuovo da zero ed indossarlo.
Ubicate in [PATH]
</text>
<text name="not worn instructions">
- Indossa delle nuove scarpe trascinandole dall&apos;inventario al tuo avatar.
-In alternativa, puoi crearne uno paio nuovo da zero ed indossarlo.
+ Metti delle nuove scarpe trascinandole dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo.
</text>
+ <button label="Crea nuove scarpe" label_selected="Crea nuove scarpe" name="Create New"/>
<text name="no modify instructions">
Non hai il permesso di modificare questo indumento.
</text>
@@ -249,11 +247,10 @@ In alternativa, puoi crearne uno paio nuovo da zero ed indossarlo.
</text>
<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un&apos;immagine"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
- <button label="Crea nuove scarpe" label_selected="Crea nuove scarpe" name="Create New"/>
<button label="Togli" label_selected="Togli" name="Take Off"/>
- <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva" label_selected="Salva" name="Save"/>
<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
- <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>
</panel>
<panel label="Calze" name="Socks">
<text name="title">
@@ -272,9 +269,9 @@ In alternativa, puoi crearne uno paio nuovo da zero ed indossarlo.
Ubicato in [PATH]
</text>
<text name="not worn instructions">
- Indossa delle nuove calze trascinandole dall&apos;inventario al tuo avatar.
-In alternativa, puoi crearne uno paio nuovo da zero ed indossarlo.
+ Metti delle nuove calze trascinandole dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo.
</text>
+ <button label="Crea nuove calze" label_selected="Crea nuove calze" name="Create New"/>
<text name="no modify instructions">
Non hai il permesso di modificare questo indumento.
</text>
@@ -283,11 +280,10 @@ In alternativa, puoi crearne uno paio nuovo da zero ed indossarlo.
</text>
<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un&apos;immagine"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
- <button label="Crea nuove calze" label_selected="Crea nuove calze" name="Create New"/>
<button label="Togli" label_selected="Togli" name="Take Off"/>
- <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva" label_selected="Salva" name="Save"/>
<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
- <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>
</panel>
<panel label="Giacca" name="Jacket">
<text name="title">
@@ -306,9 +302,9 @@ In alternativa, puoi crearne uno paio nuovo da zero ed indossarlo.
Ubicata in [PATH]
</text>
<text name="not worn instructions">
- Indossa una nuova giacca trascinandola dall&apos;inventario al tuo avatar.
-In alternativa, puoi crearne una nuova da zero ed indossarla.
+ Metti una nuova giacca trascinandola dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo.
</text>
+ <button label="Crea una nuova giacca" label_selected="Crea una nuova giacca" name="Create New"/>
<text name="no modify instructions">
Non hai il permesso di modificare questo indumento.
</text>
@@ -318,11 +314,10 @@ In alternativa, puoi crearne una nuova da zero ed indossarla.
<texture_picker label="Tessuto: superiore" name="Upper Fabric" tool_tip="Clicca per scegliere un&apos;immagine" width="96"/>
<texture_picker label="Tessuto: inferiore" name="Lower Fabric" tool_tip="Clicca per scegliere un&apos;immagine" width="96"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
- <button label="Crea una nuova giacca" label_selected="Crea una nuova giacca" name="Create New"/>
<button label="Togli" label_selected="Togli" name="Take Off"/>
- <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva" label_selected="Salva" name="Save"/>
<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
- <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>
</panel>
<panel label="Guanti" name="Gloves">
<text name="title">
@@ -341,9 +336,9 @@ In alternativa, puoi crearne una nuova da zero ed indossarla.
Ubicati in [PATH]
</text>
<text name="not worn instructions">
- Indossa dei nuovi guanti trascinandoli dall&apos;inventario al tuo avatar.
-In alternativa, puoi crearne un paio nuovo da zero ed indossarlo.
+ Metti dei nuovi guanti trascinandoli dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo.
</text>
+ <button label="Crea nuovi guanti" label_selected="Crea nuovi guanti" name="Create New"/>
<text name="no modify instructions">
Non hai il permesso di modificare questo indumento.
</text>
@@ -352,11 +347,10 @@ In alternativa, puoi crearne un paio nuovo da zero ed indossarlo.
</text>
<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un&apos;immagine"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
- <button label="Crea nuovi guanti" label_selected="Crea nuovi guanti" name="Create New"/>
<button font="SansSerifSmall" label="Rimuovi l&apos;indumento" label_selected="Rimuovi l&apos;indumento" name="Take Off" width="115"/>
- <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva" label_selected="Salva" name="Save"/>
<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
- <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>
</panel>
<panel label="Canottiera" name="Undershirt">
<text name="title">
@@ -375,9 +369,9 @@ In alternativa, puoi crearne un paio nuovo da zero ed indossarlo.
Ubicata in [PATH]
</text>
<text name="not worn instructions">
- Indossa una nuova canottiera trascinandola dall&apos;inventario al tuo avatar.
-In alternativa, puoi crearne una nuovo da zero ed indossarla.
+ Metti una nuova maglietta intima trascinandola dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo.
</text>
+ <button label="Crea una nuova canottiera" label_selected="Crea una nuova canottiera" name="Create New"/>
<text name="no modify instructions">
Non hai il permesso di modificare questo indumento.
</text>
@@ -386,11 +380,10 @@ In alternativa, puoi crearne una nuovo da zero ed indossarla.
</text>
<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un&apos;immagine"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
- <button label="Crea una nuova canottiera" label_selected="Crea una nuova canottiera" name="Create New"/>
<button font="SansSerifSmall" label="Rimuovi l&apos;indumento" label_selected="Rimuovi l&apos;indumento" name="Take Off" width="115"/>
- <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva" label_selected="Salva" name="Save"/>
<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
- <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>
</panel>
<panel label="Mutande" name="Underpants">
<text name="title">
@@ -409,9 +402,9 @@ In alternativa, puoi crearne una nuovo da zero ed indossarla.
Ubicato in [PATH]
</text>
<text name="not worn instructions">
- Indossa delle nuove mutande trascinandole dall&apos;inventario al tuo avatar.
-In alternativa, puoi crearne una paio nuovo da zero ed indossarlo.
+ Metti dei nuovi slip trascinandoli dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo.
</text>
+ <button label="Crea nuove mutande" label_selected="Crea nuove mutande" name="Create New"/>
<text name="no modify instructions">
Non hai il permesso di modificare questo indumento.
</text>
@@ -420,11 +413,10 @@ In alternativa, puoi crearne una paio nuovo da zero ed indossarlo.
</text>
<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un&apos;immagine"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
- <button label="Crea nuove mutande" label_selected="Crea nuove mutande" name="Create New"/>
<button font="SansSerifSmall" label="Rimuovi l&apos;indumento" label_selected="Rimuovi l&apos;indumento" name="Take Off" width="115"/>
- <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva" label_selected="Salva" name="Save"/>
<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
- <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>
</panel>
<panel label="Gonna" name="Skirt">
<text name="title">
@@ -443,9 +435,9 @@ In alternativa, puoi crearne una paio nuovo da zero ed indossarlo.
Ubicata in [PATH]
</text>
<text name="not worn instructions">
- Indossa una nuova gonna trascinandola dall&apos;inventario al tuo avatar.
-In alternativa, puoi crearne una nuova da zero ed indossarla.
+ Metti una nuova gonna trascinandola dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo.
</text>
+ <button label="Crea una nuova gonna" label_selected="Crea una nuova gonna" name="Create New"/>
<text name="no modify instructions">
Non hai il permesso di modificare questo indumento.
</text>
@@ -454,13 +446,12 @@ In alternativa, puoi crearne una nuova da zero ed indossarla.
</text>
<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un&apos;immagine"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
- <button label="Crea una nuova gonna" label_selected="Crea una nuova gonna" name="Create New"/>
<button font="SansSerifSmall" label="Rimuovi l&apos;indumento" label_selected="Rimuovi l&apos;indumento" name="Take Off" width="115"/>
- <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva" label_selected="Salva" name="Save"/>
<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
- <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>
</panel>
- <panel label="Alpha" name="Alpha">
+ <panel label="Tatuaggio" name="Tattoo">
<text name="title">
[DESC]
</text>
@@ -468,7 +459,7 @@ In alternativa, puoi crearne una nuova da zero ed indossarla.
[DESC]: non può essere modificato
</text>
<text name="title_loading">
- [DESC]: caricando...
+ [DESC]: caricamento in corso...
</text>
<text name="title_not_worn">
[DESC]: non indossato
@@ -477,27 +468,24 @@ In alternativa, puoi crearne una nuova da zero ed indossarla.
Collocato in [PATH]
</text>
<text name="not worn instructions">
- Metti una nuova alpha mask trascinandone una dall&apos;inventario del tuo avatar.
-In alternativa, creane una nuova partendo da zero e indossala.
+ Metti un nuovo tatuaggio trascinandolo dal tuo inventario al avatar. Oppure, crea un nuovo tatuaggio e indossalo.
</text>
+ <button label="Crea un nuovo tatuaggio" label_selected="Crea un nuovo tatuaggio" name="Create New"/>
<text name="no modify instructions">
- Non hai i permessi per modificare questa vestibilità.
+ Non hai i permessi per modificare questo capo.
</text>
<text name="Item Action Label">
- Alpha:
+ Tatuaggio:
</text>
- <texture_picker label="Alpha inferiore" name="Lower Alpha" tool_tip="Clicca per scegliere una fotografia"/>
- <texture_picker label="Alpha superiore" name="Upper Alpha" tool_tip="Clicca per scegliere una foto"/>
- <texture_picker label="Alpha della testa" name="Head Alpha" tool_tip="Clicca per scegliere una fotografia"/>
- <texture_picker label="Alpha dell&apos;occhio" name="Eye Alpha" tool_tip="Clicca per scegliere una fotografia"/>
- <texture_picker label="Alpha dei capelli" name="Hair Alpha" tool_tip="Clicca per scegiere una fotografia"/>
- <button label="Crea nuova alpha" label_selected="Crea nuova alpha" name="Create New"/>
+ <texture_picker label="Tatuaggio della testa" name="Head Tattoo" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Tatuaggio superiore" name="Upper Tattoo" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Tattuaggio inferiore" name="Lower Tattoo" tool_tip="Clicca per scegliere una fotografia"/>
<button label="Togli" label_selected="Togli" name="Take Off"/>
<button label="Salva" label_selected="Salva" name="Save"/>
<button label="Salva con nome..." label_selected="Salva con nome..." name="Save As"/>
<button label="Ripristina" label_selected="Ripristina" name="Revert"/>
</panel>
- <panel label="Tatuaggio" name="Tattoo">
+ <panel label="Alpha (Trasparenza)" name="Alpha">
<text name="title">
[DESC]
</text>
@@ -505,7 +493,7 @@ In alternativa, creane una nuova partendo da zero e indossala.
[DESC]: non può essere modificato
</text>
<text name="title_loading">
- [DESC]: caricando...
+ [DESC]: caricamento in corso...
</text>
<text name="title_not_worn">
[DESC]: non indossato
@@ -514,26 +502,28 @@ In alternativa, creane una nuova partendo da zero e indossala.
Collocato in [PATH]
</text>
<text name="not worn instructions">
- Metti un nuovo tatuaggio trascinandone uno dall&apos;inventario del tuo avatar.
-In alternativa, creane uno nuovo partendo da zero e indossalo.
+ Metti una nuova alpha mask trascinandola dal tuo inventario al tuo avatar. Oppure, crea un nuovo tatuaggio e indossalo.
</text>
+ <button label="Crea nuovo Alpha" label_selected="Crea nuovo Alpha" name="Create New"/>
<text name="no modify instructions">
- Non hai i permessi per moficare questa vestibilità.
+ Non hai i permessi per modificare questo capo.
</text>
<text name="Item Action Label">
- Tatuaggio:
+ Alpha:
</text>
- <texture_picker label="Tatuaggio della testa" name="Head Tattoo" tool_tip="Clicca per scegliere una foto"/>
- <texture_picker label="Tatuaggio superiore" name="Upper Tattoo" tool_tip="Clicca per scegliere una fotografia"/>
- <texture_picker label="Tatuaggio inferiore" name="Lower Tattoo" tool_tip="Clicca per scegliere una fotografia"/>
- <button label="Crea Nuovo tatuaggio" label_selected="Crea un nuovo tatuaggio" name="Create New"/>
+ <texture_picker label="Alpha inferiore" name="Lower Alpha" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Alpha superiore" name="Upper Alpha" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Alpha della testa" name="Head Alpha" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Alpha dell&apos;occhio" name="Eye Alpha" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Alpha dei capelli" name="Hair Alpha" tool_tip="Clicca per scegliere una fotografia"/>
<button label="Togli" label_selected="Togli" name="Take Off"/>
<button label="Salva" label_selected="Salva" name="Save"/>
<button label="Salva con nome..." label_selected="Salva con nome..." name="Save As"/>
<button label="Ripristina" label_selected="Ripristina" name="Revert"/>
</panel>
</tab_container>
- <scroll_container left="254" name="panel_container"/>
+ <scroll_container name="panel_container"/>
+ <button label="Informazioni script" label_selected="Informazioni script" name="script_info" tool_tip="Mostra gli script collegati al tuo avatar"/>
<button label="Crea vestiario" label_selected="Crea vestiario" name="make_outfit_btn"/>
<button label="Annulla" label_selected="Annulla" name="Cancel"/>
<button label="OK" label_selected="OK" name="Ok"/>
diff --git a/indra/newview/skins/default/xui/it/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/it/floater_day_cycle_options.xml
index 7d50e322c0..98c385d29f 100644
--- a/indra/newview/skins/default/xui/it/floater_day_cycle_options.xml
+++ b/indra/newview/skins/default/xui/it/floater_day_cycle_options.xml
@@ -57,9 +57,9 @@
<text name="WL12amHash2">
|
</text>
- <button font="SansSerifSmall" width="96" left="546" label="Aggiungi voce" label_selected="Aggiungi voce" name="WLAddKey"/>
- <button font="SansSerifSmall" width="96" left="546" label="Cancella voce" label_selected="Cancella voce" name="WLDeleteKey"/>
- <text name="WLCurKeyFrameText" width="210" left="17">
+ <button label="Aggiungi voce" label_selected="Aggiungi voce" name="WLAddKey"/>
+ <button label_selected="Cancella voce" name="WLDeleteKey"/>
+ <text name="WLCurKeyFrameText">
Impostazioni del fotogramma chiave:
</text>
<text name="WLCurKeyTimeText">
@@ -84,9 +84,9 @@
<text name="DayCycleText3">
Anteprima:
</text>
- <button width="55" font="SansSerifSmall" label="Avvia" label_selected="Avvia" name="WLAnimSky"/>
- <button width="55" left_delta="60" font="SansSerifSmall" label="Arresta!" label_selected="Arresta" name="WLStopAnimSky"/>
- <button left_delta="60" width="150" font="SansSerifSmall" label="Usa l&apos;ora della proprietà" label_selected="Vai all&apos;ora della proprietà" name="WLUseLindenTime"/>
+ <button label="Avvia" label_selected="Avvia" name="WLAnimSky"/>
+ <button label="Arresta!" label_selected="Arresta" name="WLStopAnimSky"/>
+ <button label="Usa l&apos;ora della proprietà" label_selected="Vai all&apos;ora della proprietà" name="WLUseLindenTime"/>
<button label="Salva il test del giorno" label_selected="Salva il test del giorno" name="WLSaveDayCycle"/>
<button label="Carica il test del giorno" label_selected="Carica il test del giorno" name="WLLoadDayCycle"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/floater_device_settings.xml b/indra/newview/skins/default/xui/it/floater_device_settings.xml
index 2410a16882..97aa64086d 100644
--- a/indra/newview/skins/default/xui/it/floater_device_settings.xml
+++ b/indra/newview/skins/default/xui/it/floater_device_settings.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_device_settings" title="OPZIONI PER IL DISPOSITIVO VOICE CHAT"/>
+<floater name="floater_device_settings" title="OPZIONI CHAT VOCALE"/>
diff --git a/indra/newview/skins/default/xui/it/floater_event.xml b/indra/newview/skins/default/xui/it/floater_event.xml
new file mode 100644
index 0000000000..a0807e04c9
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_event.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="Evento" name="Event" title="DETTAGLI DELL&apos;EVENTO">
+ <floater.string name="none">
+ nessuno
+ </floater.string>
+ <floater.string name="notify">
+ Avvisare
+ </floater.string>
+ <floater.string name="dont_notify">
+ Non avvisare
+ </floater.string>
+ <floater.string name="moderate">
+ Moderato
+ </floater.string>
+ <floater.string name="adult">
+ Adulto
+ </floater.string>
+ <floater.string name="general">
+ Generale
+ </floater.string>
+ <floater.string name="unknown">
+ Sconosciuto
+ </floater.string>
+ <layout_stack name="layout">
+ <layout_panel name="profile_stack">
+ <text name="event_name">
+ Evento senza nome...di Doom De doom! Doom doom.
+ </text>
+ <text name="event_category">
+ (nessuna categoria)
+ </text>
+ <text name="event_runby_label">
+ Organizzato da:
+ </text>
+ <text initial_value="(recupero)" name="event_runby"/>
+ <text name="event_date_label">
+ Data:
+ </text>
+ <text name="event_date">
+ 10/10/2010
+ </text>
+ <text name="event_duration_label">
+ Durata:
+ </text>
+ <text name="event_duration">
+ 1 ora
+ </text>
+ <text name="event_covercharge_label">
+ Costo:
+ </text>
+ <text name="event_cover">
+ Gratis
+ </text>
+ <text name="event_location_label">
+ Luogo:
+ </text>
+ <text name="event_location" value="SampleParcel, Name Long (145, 228, 26)"/>
+ <text name="rating_label" value="Categoria:"/>
+ <text name="rating_value" value="sconosciuto"/>
+ <expandable_text name="event_desc">
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ </expandable_text>
+ </layout_panel>
+ <layout_panel name="button_panel">
+ <button name="create_event_btn" tool_tip="Crea evento"/>
+ <button name="god_delete_event_btn" tool_tip="Elimina evento"/>
+ <button label="Avvisami" name="notify_btn"/>
+ <button label="Teleport" name="teleport_btn"/>
+ <button label="Mappa" name="map_btn"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_gesture.xml b/indra/newview/skins/default/xui/it/floater_gesture.xml
index eefa3bb392..b9419ebc22 100644
--- a/indra/newview/skins/default/xui/it/floater_gesture.xml
+++ b/indra/newview/skins/default/xui/it/floater_gesture.xml
@@ -1,24 +1,24 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater label="Posti" name="gestures" title="GESTURES">
+<floater label="Luoghi" name="gestures" title="GESTURE">
<floater.string name="loading">
- Caricando...
+ Caricamento in corso...
</floater.string>
<floater.string name="playing">
- (Riproducendo)
+ (Riproduzione in corso)
</floater.string>
<floater.string name="copy_name">
Copia di [COPY_NAME]
</floater.string>
- <scroll_list bottom_delta="-385" height="360" name="gesture_list">
- <scroll_list.columns label="Nome" name="name" width="129"/>
- <scroll_list.columns label="Chat" name="trigger" width="106"/>
- <scroll_list.columns label="Pulsante" name="shortcut" width="65"/>
+ <scroll_list name="gesture_list">
+ <scroll_list.columns label="Nome" name="name"/>
+ <scroll_list.columns label="Chat" name="trigger"/>
+ <scroll_list.columns label="Pulsante" name="shortcut"/>
</scroll_list>
<panel label="bottom_panel" name="bottom_panel">
- <menu_button name="gear_btn" tool_tip="Più opzioni"/>
+ <menu_button name="gear_btn" tool_tip="Altre opzioni"/>
<button name="new_gesture_btn" tool_tip="Crea nuova gesture"/>
- <button name="activate_btn" tool_tip="Attiva/Disattiva la gesture selezionata"/>
- <button name="del_btn" tool_tip="Cancella questa gesture"/>
+ <button name="activate_btn" tool_tip="Attiva/Disattiva gesture selezionata"/>
+ <button name="del_btn" tool_tip="Elimina questa gesture"/>
</panel>
<button label="Modifica" name="edit_btn"/>
<button label="Play" name="play_btn"/>
diff --git a/indra/newview/skins/default/xui/it/floater_god_tools.xml b/indra/newview/skins/default/xui/it/floater_god_tools.xml
new file mode 100644
index 0000000000..32c79936cf
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_god_tools.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="godtools floater" title="GOD TOOLS">
+ <tab_container name="GodTools Tabs">
+ <panel label="Grid" name="grid"/>
+ <panel label="Region" name="region">
+ <text name="Region Name:">
+ Nome regione:
+ </text>
+ <check_box label="Reset Home On Teleport" name="check reset home" tool_tip="Quando un residente esce con un teleport, reimposta la sua posizione di base sul luogo di destinazione."/>
+ </panel>
+ <panel label="Objects" name="objects">
+ <text name="Region Name:">
+ Nome regione:
+ </text>
+ </panel>
+ </tab_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_hardware_settings.xml b/indra/newview/skins/default/xui/it/floater_hardware_settings.xml
index 08326b1da3..384e7c1272 100644
--- a/indra/newview/skins/default/xui/it/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/it/floater_hardware_settings.xml
@@ -22,8 +22,7 @@
Attiva VBO:
</text>
<check_box initial_value="true" label="Attiva oggetti OpenGL Vertex Buffer" name="vbo" tool_tip="Attivandolo su un hardware moderno aumenta la performance. Ma, su un vecchio hardware, spesso l&apos;implementazione dei VBO è scarsa e potresti avere dei crash quando è attivato."/>
- <slider label="Texture Memory (MB):" name="GraphicsCardTextureMemory" tool_tip="Spazio di memoria da ssegnare alle textures. Memoria della scheda video in Defaults. Ridurre questa impostazione potrebbe migliorare il rendimento ma potrebbe anche rendere le textures poco definite."/>
- <spinner label="Indice della distanza
-della nebbia:" name="fog"/>
+ <slider label="Memoria texture (MB):" name="GraphicsCardTextureMemory" tool_tip="Spazio di memoria da ssegnare alle textures. Utilizza la memoria della scheda video come impostazione predefinita. La riduzione di questa impostazione potrebbe migliorare il rendimento ma potrebbe anche rendere le texture poco definite."/>
+ <spinner label="Indice della distanza della nebbia:" name="fog"/>
<button label="OK" label_selected="OK" name="OK"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_help_browser.xml b/indra/newview/skins/default/xui/it/floater_help_browser.xml
index 9a158c5216..008643afac 100644
--- a/indra/newview/skins/default/xui/it/floater_help_browser.xml
+++ b/indra/newview/skins/default/xui/it/floater_help_browser.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_help_browser" title="HELP BROWSER">
+<floater name="floater_help_browser" title="BROWSER DELL&apos;AIUTO">
+ <floater.string name="loading_text">
+ Caricamento in corso...
+ </floater.string>
<layout_stack name="stack1">
- <layout_panel name="external_controls">
- <button label="Apri nel mio Web Browser" name="open_browser"/>
- </layout_panel>
+ <layout_panel name="external_controls"/>
</layout_stack>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_hud.xml b/indra/newview/skins/default/xui/it/floater_hud.xml
index e458913452..437d2d6496 100644
--- a/indra/newview/skins/default/xui/it/floater_hud.xml
+++ b/indra/newview/skins/default/xui/it/floater_hud.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_hud" title="TUTORIAL"/>
+<floater name="floater_hud" title="ESERCITAZIONE"/>
diff --git a/indra/newview/skins/default/xui/it/floater_im.xml b/indra/newview/skins/default/xui/it/floater_im.xml
index 6303615e60..aa916adf2c 100644
--- a/indra/newview/skins/default/xui/it/floater_im.xml
+++ b/indra/newview/skins/default/xui/it/floater_im.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<multi_floater name="im_floater" title="">
<string name="only_user_message">
- Sei l&apos;unico utente di questa sessione.
+ Sei il solo residente presente nella sessione.
</string>
<string name="offline_message">
[FIRST] [LAST] è offline.
@@ -10,7 +10,7 @@
Clicca il tasto [BUTTON NAME] per accettare/connetterti a questa voice chat.
</string>
<string name="muted_message">
- Hai bloccato questo residente. Spedendo un messaggio sarà automaticamente sbloccati.
+ Hai bloccato questo residente. Quando gli invii un messaggio, verrà automaticamente sbloccato.
</string>
<string name="generic_request_error">
Errore durante la richiesta, riprova più tardi.
@@ -31,7 +31,7 @@
Un moderatore di gruppo ti ha disabilitato dalla chat di testo.
</string>
<string name="add_session_event">
- Impossibile aggiungere utenti alla chat con [RECIPIENT].
+ Impossibile aggiungere residenti alla sessione chat con [RECIPIENT].
</string>
<string name="message_session_event">
Impossibile inviare il messaggio nella chat con [RECIPIENT].
diff --git a/indra/newview/skins/default/xui/it/floater_im_container.xml b/indra/newview/skins/default/xui/it/floater_im_container.xml
index 2970639f4c..fb8e77b32f 100644
--- a/indra/newview/skins/default/xui/it/floater_im_container.xml
+++ b/indra/newview/skins/default/xui/it/floater_im_container.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<multi_floater name="floater_im_box" title="Instant Messages"/>
+<multi_floater name="floater_im_box" title="CONVERSAZIONI"/>
diff --git a/indra/newview/skins/default/xui/it/floater_im_session.xml b/indra/newview/skins/default/xui/it/floater_im_session.xml
index 830c65b443..8d395ea04b 100644
--- a/indra/newview/skins/default/xui/it/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/it/floater_im_session.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="panel_im">
<layout_stack name="im_panels">
- <layout_panel label="Pannello di Controllo IM" name="panel_im_control_panel"/>
+ <layout_panel label="Pannello di controllo IM" name="panel_im_control_panel"/>
<layout_panel>
<line_editor label="A" name="chat_editor"/>
</layout_panel>
diff --git a/indra/newview/skins/default/xui/it/floater_image_preview.xml b/indra/newview/skins/default/xui/it/floater_image_preview.xml
index 341202d8bc..ee7be7b155 100644
--- a/indra/newview/skins/default/xui/it/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/it/floater_image_preview.xml
@@ -11,16 +11,16 @@
immagine come:
</text>
<combo_box label="Tipo d&apos;abito" left="120" name="clothing_type_combo" width="166">
- <combo_box.item label="Immagine" name="Image"/>
- <combo_box.item label="Capelli" name="Hair"/>
- <combo_box.item label="Testa Femminile" name="FemaleHead"/>
- <combo_box.item label="Corpo Femminile Superiore" name="FemaleUpperBody"/>
- <combo_box.item label="Corpo Femminile Inferiore" name="FemaleLowerBody"/>
- <combo_box.item label="Testa Maschile" name="MaleHead"/>
- <combo_box.item label="Corpo Maschile Superiore" name="MaleUpperBody"/>
- <combo_box.item label="Corpo Maschile Inferiore" name="MaleLowerBody"/>
- <combo_box.item label="Gonna" name="Skirt"/>
- <combo_box.item label="Sculpted Prim" name="SculptedPrim"/>
+ <item label="Immagine" name="Image" value="Immagine"/>
+ <item label="Capigliature" name="Hair" value="Capigliature"/>
+ <item label="Testa femminile" name="FemaleHead" value="Testa femminile"/>
+ <item label="Parte superiore del corpo femminile" name="FemaleUpperBody" value="Parte superiore del corpo femminile"/>
+ <item label="Parte inferiore del corpo femminile" name="FemaleLowerBody" value="Parte inferiore del corpo femminile"/>
+ <item label="Testa maschile" name="MaleHead" value="Testa maschile"/>
+ <item label="Parte superiore del corpo maschile" name="MaleUpperBody" value="Parte superiore del corpo maschile"/>
+ <item label="Parte inferiore del corpo maschile" name="MaleLowerBody" value="Parte inferiore del corpo maschile"/>
+ <item label="Gonna" name="Skirt" value="Gonna"/>
+ <item label="Prim Sculpted" name="SculptedPrim" value="Prim Sculpted"/>
</combo_box>
<text name="bad_image_text">
Non è stato possibile leggere l&apos;immagine.
diff --git a/indra/newview/skins/default/xui/it/floater_incoming_call.xml b/indra/newview/skins/default/xui/it/floater_incoming_call.xml
index fc7b8de6f4..4d9c1b98dd 100644
--- a/indra/newview/skins/default/xui/it/floater_incoming_call.xml
+++ b/indra/newview/skins/default/xui/it/floater_incoming_call.xml
@@ -1,16 +1,28 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="incoming call" title="UNA PERSONA SCONOSCIUTA STA&apos; CHIAMANDO">
+<floater name="incoming call" title="UNA PERSONA SCONOSCIUTA STA CHIAMANDO">
+ <floater.string name="lifetime">
+ 5
+ </floater.string>
<floater.string name="localchat">
- Voice Chat nei dintorni
+ Chat vocale nei dintorni
</floater.string>
<floater.string name="anonymous">
anonimo
</floater.string>
<floater.string name="VoiceInviteP2P">
- stà chiamando.
+ sta chiamando.
</floater.string>
<floater.string name="VoiceInviteAdHoc">
- ha aggiunto una chiamata in Voice Chat ad una conferenza in chat.
+ ha aderito ad una chiamata in chat vocale in conferenza.
+ </floater.string>
+ <floater.string name="VoiceInviteGroup">
+ ha appena aderito al canale voce &apos;[GROUP]&apos;.
+ </floater.string>
+ <floater.string name="VoiceInviteQuestionGroup">
+ Vuoi abbandonare [CURRENT_CHAT] e aderire alla chiamata con &apos;[GROUP]&apos;?
+ </floater.string>
+ <floater.string name="VoiceInviteQuestionDefault">
+ Vuoi abbandonare [CURRENT_CHAT] e aderire a questa voice chat?
</floater.string>
<text name="question">
Vuoi abbandonare [CURRENT_CHAT] e aderire a questa voice chat?
diff --git a/indra/newview/skins/default/xui/it/floater_inventory.xml b/indra/newview/skins/default/xui/it/floater_inventory.xml
index 5049bb3e58..2aa6795988 100644
--- a/indra/newview/skins/default/xui/it/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/it/floater_inventory.xml
@@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Inventory" title="INVENTARIO">
+<floater name="Inventory" title="IL MIO INVENTARIO">
<floater.string name="Title">
- Inventario
+ IL MIO INVENTARIO
</floater.string>
<floater.string name="TitleFetching">
- Inventario (Fetching [ITEM_COUNT] Items...) [FILTER]
+ IL MIO INVENTARIO (recupero di [ITEM_COUNT] articoli...) [FILTER]
</floater.string>
<floater.string name="TitleCompleted">
- Inventario ([ITEM_COUNT] Items) [FILTER]
+ IL MIO INVENTARIO ([ITEM_COUNT] articoli) [FILTER]
</floater.string>
<floater.string name="Fetched">
- Raggiunto ??????????
+ Completato
</floater.string>
<panel label="Pannello dell&apos;Inventario" name="Inventory Panel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml
index aaf7b71656..d3dc4d7eae 100644
--- a/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/it/floater_inventory_item_properties.xml
@@ -56,7 +56,7 @@
</text>
<check_box label="Condividi" name="CheckShareWithGroup"/>
<text name="NextOwnerLabel" width="230">
- Prossimo Proprietario:
+ Proprietario successivo:
</text>
<check_box label="Modifica" name="CheckNextOwnerModify"/>
<check_box label="Copiare" left_delta="88" name="CheckNextOwnerCopy"/>
diff --git a/indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml
index b5a17b2fc1..49130285f2 100644
--- a/indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/it/floater_inventory_view_finder.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Inventory Finder" title="INVENTARIO_COSE_RECENTI" width="165">
+<floater name="Inventory Finder" title="INVENTARIO_COSE_RECENTI">
<check_box label="Animazioni" name="check_animation"/>
<check_box label="Biglietti da visita" name="check_calling_card"/>
<check_box label="Abiti" name="check_clothing"/>
diff --git a/indra/newview/skins/default/xui/it/floater_joystick.xml b/indra/newview/skins/default/xui/it/floater_joystick.xml
index 3eff0cfceb..3d60ded7ab 100644
--- a/indra/newview/skins/default/xui/it/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/it/floater_joystick.xml
@@ -16,7 +16,7 @@
Modalità di controllo:
</text>
<check_box label="Avatar" name="JoystickAvatarEnabled"/>
- <check_box label="Costruire" left="192" name="JoystickBuildEnabled"/>
+ <check_box label="Costruire" name="JoystickBuildEnabled"/>
<check_box label="Camera dall&apos;alto" name="JoystickFlycamEnabled"/>
<text name="XScale">
Regolazione X
@@ -27,13 +27,13 @@
<text name="ZScale">
Regolazione Z
</text>
- <text left="3" name="PitchScale" width="112">
+ <text name="PitchScale">
Regolazione: Pitch
</text>
- <text left="3" name="YawScale" width="112">
+ <text name="YawScale">
Regolazione: Yaw
</text>
- <text left="3" name="RollScale" width="112">
+ <text name="RollScale">
Regolazione: Roll
</text>
<text name="XDeadZone">
@@ -45,22 +45,22 @@
<text name="ZDeadZone">
Angolo morto Z
</text>
- <text left="3" name="PitchDeadZone" width="112">
+ <text name="PitchDeadZone">
Angolo morto: Pitch
</text>
- <text left="3" name="YawDeadZone" width="112">
+ <text name="YawDeadZone">
Angolo morto: Yaw
</text>
- <text left="3" name="RollDeadZone" width="112">
+ <text name="RollDeadZone">
Angolo morto: Roll
</text>
<text name="Feathering">
Smussamento
</text>
- <text left="6" name="ZoomScale2" width="135">
+ <text name="ZoomScale2">
Regolazione dello zoom
</text>
- <text left="6" name="ZoomDeadZone" width="135">
+ <text name="ZoomDeadZone" width="140">
Angolo morto dello zoom
</text>
<button label="SpaceNavigator Defaults" name="SpaceNavigatorDefaults"/>
diff --git a/indra/newview/skins/default/xui/it/floater_lagmeter.xml b/indra/newview/skins/default/xui/it/floater_lagmeter.xml
index 93bf11b069..f7b2b1ab4a 100644
--- a/indra/newview/skins/default/xui/it/floater_lagmeter.xml
+++ b/indra/newview/skins/default/xui/it/floater_lagmeter.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_lagmeter" title="LAG METER">
+<floater name="floater_lagmeter" title="MISURATORE LAG">
<floater.string name="max_title_msg">
Misuratore del lag
</floater.string>
@@ -136,7 +136,7 @@
<text left="30" name="client_lag_cause" right="-10"/>
<button label="" label_selected="" name="network_lagmeter" tool_tip="Stato del lag del network"/>
<text name="network">
- Network
+ Rete
</text>
<text font="SansSerifSmall" name="network_text">
Normale
@@ -150,5 +150,5 @@
Normale
</text>
<text left="30" name="server_lag_cause" right="-32"/>
- <button label="&gt;&gt;" name="minimize" tool_tip="Pulsante per minimizzare"/>
+ <button label="&gt;&gt;" name="minimize" tool_tip="Cambia dimensioni floater"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_land_holdings.xml b/indra/newview/skins/default/xui/it/floater_land_holdings.xml
index 9f2884448d..1b2f2605f7 100644
--- a/indra/newview/skins/default/xui/it/floater_land_holdings.xml
+++ b/indra/newview/skins/default/xui/it/floater_land_holdings.xml
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="land holdings floater" title="LA MIA TERRA">
+<floater name="land holdings floater" title="IL MIO TERRENO">
<scroll_list name="parcel list">
- <column label="Parcel" name="name"/>
+ <column label="Lotto" name="name"/>
<column label="Regione" name="location"/>
<column label="Tipo" name="type"/>
<column label="Area" name="area"/>
</scroll_list>
<button label="Teletrasportati" label_selected="Teletrasportati" name="Teleport" tool_tip="Teletrasportati al centro di questo terreno."/>
- <button label="Mappa" label_selected="Mappa" name="Show on Map" tool_tip="Mostra questa terra nella mappa del mondo" width="130"/>
+ <button label="Mappa" label_selected="Mappa" name="Show on Map" tool_tip="Mostra il terreno sulla mappa del mondo" width="130"/>
<text name="contrib_label">
Contributi ai tuoi gruppi:
</text>
diff --git a/indra/newview/skins/default/xui/it/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/it/floater_live_lsleditor.xml
index d86b834c38..0bd2b02323 100644
--- a/indra/newview/skins/default/xui/it/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/it/floater_live_lsleditor.xml
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="script ed float" title="SCRIPT: NUOVO SCRIPT">
<floater.string name="not_allowed">
- Non puoi vedere o modificare questo script, perchè è impostato come &quot;no copy&quot;. Necesiti tutti i permessi per vedere o modificare lo script dentro un oggetto.
+ Per impostazione, questo script non può essere visualizzato né modificato. Per visualizzare o modificare uno script all&apos;interno di un oggetto, devi avere i necessari diritti di modifica.
</floater.string>
<floater.string name="script_running">
In esecuzione
</floater.string>
<floater.string name="Title">
- Script: [NAME]
+ SCRIPT: [NAME]
</floater.string>
<button label="Ripristina" label_selected="Ripristina" name="Reset"/>
<check_box initial_value="true" label="In esecuzione" left="4" name="running"/>
diff --git a/indra/newview/skins/default/xui/it/floater_lsl_guide.xml b/indra/newview/skins/default/xui/it/floater_lsl_guide.xml
index b699b280b6..47fe2de051 100644
--- a/indra/newview/skins/default/xui/it/floater_lsl_guide.xml
+++ b/indra/newview/skins/default/xui/it/floater_lsl_guide.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script ed float" title="LSL WIKI">
+<floater name="script ed float" title="RIFERIMENTO LSL">
<check_box label="Segui il cursore" name="lock_check"/>
<combo_box label="Blocca" left_delta="120" name="history_combo" width="70"/>
<button label="Indietro" left_delta="75" name="back_btn"/>
diff --git a/indra/newview/skins/default/xui/it/floater_map.xml b/indra/newview/skins/default/xui/it/floater_map.xml
index ec4bd4ef4a..d1e9c98e79 100644
--- a/indra/newview/skins/default/xui/it/floater_map.xml
+++ b/indra/newview/skins/default/xui/it/floater_map.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Map">
+<floater name="Map" title="">
<floater.string name="mini_map_north">
N
</floater.string>
diff --git a/indra/newview/skins/default/xui/it/floater_media_browser.xml b/indra/newview/skins/default/xui/it/floater_media_browser.xml
index 0e25cef60b..0a8c0f1c41 100644
--- a/indra/newview/skins/default/xui/it/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/it/floater_media_browser.xml
@@ -9,13 +9,13 @@
<layout_stack name="stack1">
<layout_panel name="nav_controls">
<button label="Indietro" name="back" width="75"/>
- <button label="Avanti" name="forward" left_delta="75" width="70"/>
- <button label="Ricarica" name="reload" left_delta="75"/>
+ <button label="Avanti" left_delta="75" name="forward" width="70"/>
+ <button label="Ricarica" left_delta="75" name="reload"/>
<combo_box left_delta="75" name="address" width="510"/>
- <button label="Vai" name="go" left_delta="515"/>
+ <button label="Vai" left_delta="515" name="go"/>
</layout_panel>
<layout_panel name="parcel_owner_controls">
- <button label="Invia questo URL al terreno" name="assign"/>
+ <button label="Invia la pagina attuale al lotto" name="assign"/>
</layout_panel>
<layout_panel name="external_controls">
<button label="Apri nel web browser" name="open_browser"/>
diff --git a/indra/newview/skins/default/xui/it/floater_media_settings.xml b/indra/newview/skins/default/xui/it/floater_media_settings.xml
index b99a11b881..d521502a4c 100644
--- a/indra/newview/skins/default/xui/it/floater_media_settings.xml
+++ b/indra/newview/skins/default/xui/it/floater_media_settings.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="media_settings" title="IMPOSTAZIONI MEDIA">
<button label="OK" label_selected="OK" name="OK"/>
- <button label="Cancella" label_selected="Cancella" name="Cancel"/>
+ <button label="Annulla" label_selected="Annulla" name="Cancel"/>
<button label="Applica" label_selected="Applica" name="Apply"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_mem_leaking.xml b/indra/newview/skins/default/xui/it/floater_mem_leaking.xml
index ee3d642fef..63074d5a4c 100644
--- a/indra/newview/skins/default/xui/it/floater_mem_leaking.xml
+++ b/indra/newview/skins/default/xui/it/floater_mem_leaking.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="MemLeak" title="SIMULA UNA PERDITA DI MEMORIA">
+<floater name="MemLeak" title="SIMULA UNA FUGA DI MEMORIA">
<spinner label="Perdità di velocità (bytes per frame):" name="leak_speed"/>
<spinner label="Memoria Persa Max (MB):" name="max_leak"/>
<text name="total_leaked_label">
diff --git a/indra/newview/skins/default/xui/it/floater_moveview.xml b/indra/newview/skins/default/xui/it/floater_moveview.xml
index edc5d9178d..cdafdb0089 100644
--- a/indra/newview/skins/default/xui/it/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/it/floater_moveview.xml
@@ -1,35 +1,75 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="move_floater">
<string name="walk_forward_tooltip">
- Cammina in avanti (premi Freccia Sù o W)
+ Cammina in avanti (premi freccia su o W)
</string>
<string name="walk_back_tooltip">
- Cammina indietro (premi Freccia Giù o S)
+ Cammina indietro (premi freccia giù o S)
+ </string>
+ <string name="walk_left_tooltip">
+ Cammina a sinistra (premi Maiusc + freccia sinistra o A)
+ </string>
+ <string name="walk_right_tooltip">
+ Cammina a destra (premi Maiusc + freccia destra o D)
</string>
<string name="run_forward_tooltip">
- Corri in avanti (premi Freccia Sù o W)
+ Corri in avanti (premi freccia su o W)
</string>
<string name="run_back_tooltip">
- Corri indietro (premi Freccia Giù o S)
+ Corri indietro (premi freccia giù o S)
+ </string>
+ <string name="run_left_tooltip">
+ Corri a sinistra (premi Maiusc + freccia sinistra o A)
+ </string>
+ <string name="run_right_tooltip">
+ Corri a destra (premi Maiusc + freccia destra o D)
</string>
<string name="fly_forward_tooltip">
- Vola in avanti (premi Freccia Sù o W)
+ Vola in avanti (premi freccia su o W)
</string>
<string name="fly_back_tooltip">
- Vola indietro (premi Freccia Giù o S)
+ Vola indietro (premi freccia giù o S)
+ </string>
+ <string name="fly_left_tooltip">
+ Vola a sinistra (premi Maiusc + freccia sinistra o A)
+ </string>
+ <string name="fly_right_tooltip">
+ Vola a destra (premi Maiusc + freccia destra o D)
+ </string>
+ <string name="fly_up_tooltip">
+ Vola in alto (premi E)
+ </string>
+ <string name="fly_down_tooltip">
+ Vola in basso (premi C)
+ </string>
+ <string name="jump_tooltip">
+ Salta (premi E)
+ </string>
+ <string name="crouch_tooltip">
+ Accovacciarsi (premi C)
+ </string>
+ <string name="walk_title">
+ Cammina
+ </string>
+ <string name="run_title">
+ Corri
+ </string>
+ <string name="fly_title">
+ Vola
</string>
<panel name="panel_actions">
- <button label="" label_selected="" name="turn left btn" tool_tip="Gira a sinistra (premi Freccia Sinistra o A)"/>
- <button label="" label_selected="" name="turn right btn" tool_tip="Gira a destra (premi Freccia Destra o D)"/>
- <button label="" label_selected="" name="move up btn" tool_tip="Vola in alto, premi &quot;E&quot;"/>
- <button label="" label_selected="" name="move down btn" tool_tip="Vola in basso, premi &quot;C&quot;"/>
- <joystick_turn name="forward btn" tool_tip="Cammina in avanti (premi Freccia Sù o W)"/>
- <joystick_turn name="backward btn" tool_tip="Cammina indietro (premi Freccia Giù o S)"/>
+ <button label="" label_selected="" name="move up btn" tool_tip="Vola in alto (premi E)"/>
+ <button label="" label_selected="" name="turn left btn" tool_tip="Gira a sinistra (premi freccia sinistra o A)"/>
+ <joystick_slide name="move left btn" tool_tip="Cammina a sinistra (premi Maiusc + freccia sinistra o A)"/>
+ <button label="" label_selected="" name="move down btn" tool_tip="Vola in basso (premi C)"/>
+ <button label="" label_selected="" name="turn right btn" tool_tip="Gira a destra (premi freccia destra o D)"/>
+ <joystick_slide name="move right btn" tool_tip="Cammina a destra (premi Maiusc + freccia destra o D)"/>
+ <joystick_turn name="forward btn" tool_tip="Cammina in avanti (premi freccia su o W)"/>
+ <joystick_turn name="backward btn" tool_tip="Cammina indietro (premi freccia giù o S)"/>
</panel>
<panel name="panel_modes">
- <button label="" name="mode_walk_btn" tool_tip="Modalità per camminare"/>
- <button label="" name="mode_run_btn" tool_tip="Modalità per correre"/>
- <button label="" name="mode_fly_btn" tool_tip="Modalità di volo"/>
- <button label="Ferma il volo" name="stop_fly_btn" tool_tip="Ferma il volo"/>
+ <button label="" name="mode_walk_btn" tool_tip="Modalità cammina"/>
+ <button label="" name="mode_run_btn" tool_tip="Modalità corsa"/>
+ <button label="" name="mode_fly_btn" tool_tip="Modalità volo"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_mute_object.xml b/indra/newview/skins/default/xui/it/floater_mute_object.xml
index 81cd46ec4d..dd1a2b67d7 100644
--- a/indra/newview/skins/default/xui/it/floater_mute_object.xml
+++ b/indra/newview/skins/default/xui/it/floater_mute_object.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="mute by name" title="BLOCCA OGGETTO PER NOME">
+<floater name="mute by name" title="BLOCCA OGGETTO IN BASE AL NOME">
<text name="message">
Blocca un oggetto:
</text>
diff --git a/indra/newview/skins/default/xui/it/floater_nearby_chat.xml b/indra/newview/skins/default/xui/it/floater_nearby_chat.xml
index 364b62fbdb..9878fe85ea 100644
--- a/indra/newview/skins/default/xui/it/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/it/floater_nearby_chat.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="nearby_chat" title="CHAT VICINA"/>
+<floater name="nearby_chat" title="CHAT NEI DINTORNI"/>
diff --git a/indra/newview/skins/default/xui/it/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/it/floater_outfit_save_as.xml
new file mode 100644
index 0000000000..dff5f33e57
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_outfit_save_as.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container" title="Salva vestiario">
+ <button label="Salva" label_selected="Salva" name="Save"/>
+ <button label="Annulla" label_selected="Annulla" name="Cancel"/>
+ <text name="Save item as:">
+ Salva quello che indosso
+come nuovo vestiario:
+ </text>
+ <line_editor name="name ed">
+ [DESC] (nuovo)
+ </line_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_outgoing_call.xml b/indra/newview/skins/default/xui/it/floater_outgoing_call.xml
index b4536e31cc..cdb180bacd 100644
--- a/indra/newview/skins/default/xui/it/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/it/floater_outgoing_call.xml
@@ -1,28 +1,40 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="outgoing call" title="CHIAMANDO">
+<floater name="outgoing call" title="CHIAMATA IN CORSO">
+ <floater.string name="lifetime">
+ 5
+ </floater.string>
<floater.string name="localchat">
- Voice Chat nei dintorni
+ Chat vocale nei dintorni
</floater.string>
<floater.string name="anonymous">
anonimo
</floater.string>
<floater.string name="VoiceInviteP2P">
- stà chiamando.
+ sta chiamando.
</floater.string>
<floater.string name="VoiceInviteAdHoc">
- ha aderito ad una chiamata Voice Chat con una chat in conferenza.
+ ha aderito ad una chiamata in chat vocale in conferenza.
</floater.string>
<text name="connecting">
- Connettendo a [CALLEE_NAME]
+ Collegamento in corso a [CALLEE_NAME]
</text>
<text name="calling">
- Chiamando [CALLEE_NAME]
+ Chiamata a [CALLEE_NAME]
</text>
<text name="noanswer">
- Nessuna risposta. Per favore riprova più tardi.
+ Nessuna risposta. Riprova più tardi.
+ </text>
+ <text name="nearby">
+ Sei stato scollegato da [VOICE_CHANNEL_NAME]. [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_other">
+ La chiamata è terminata. [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_agent">
+ Hai chiuso la chiamata. [RECONNECT_NEARBY]
</text>
<text name="leaving">
- Abbandonando [CURRENT_CHAT].
+ Chiusura chat [CURRENT_CHAT].
</text>
- <button label="Cancella" label_selected="Cancella" name="Cancel"/>
+ <button label="Annulla" label_selected="Annulla" name="Cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_pay.xml b/indra/newview/skins/default/xui/it/floater_pay.xml
index 59004bbbd7..c1ea8ec9c8 100644
--- a/indra/newview/skins/default/xui/it/floater_pay.xml
+++ b/indra/newview/skins/default/xui/it/floater_pay.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
<string name="payee_group">
- Paga Gruppo
+ Paga gruppo
</string>
<string name="payee_resident">
- Paga Residente
+ Paga residente
</string>
<text left="5" name="payee_label" width="105">
Paga:
@@ -18,7 +18,7 @@
<button label="10 L$" label_selected="10 L$" left="118" name="fastpay 10" width="80"/>
<button label="20 L$" label_selected="20 L$" left="210" name="fastpay 20"/>
<text left="4" name="amount text">
- O, scegli importo:
+ Oppure, scegli importo:
</text>
<line_editor left="70" name="amount" width="49"/>
<button label="Paga" label_selected="Paga" left="127" name="pay btn"/>
diff --git a/indra/newview/skins/default/xui/it/floater_pay_object.xml b/indra/newview/skins/default/xui/it/floater_pay_object.xml
index c51a2b7b31..37f549b5da 100644
--- a/indra/newview/skins/default/xui/it/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/it/floater_pay_object.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
<string halign="left" name="payee_group" width="100">
- Paga Gruppo
+ Paga gruppo
</string>
<string halign="left" name="payee_resident" width="120">
- Pags Residente
+ Paga residente
</string>
<icon name="icon_person" tool_tip="Persona"/>
<text left="120" name="payee_name">
@@ -15,14 +15,14 @@
</text>
<icon name="icon_object" tool_tip="Oggetti"/>
<text left="120" name="object_name_text">
- ...
+ Il mio oggetto con un nome veramente lungo
</text>
<button label="1 L$" label_selected="1 L$" left="125" name="fastpay 1" width="70"/>
<button label="5 L$" label_selected="5 L$" left="200" name="fastpay 5" width="70"/>
<button label="10 L$" label_selected="10 L$" left="125" name="fastpay 10" width="70"/>
<button label="20 L$" label_selected="20 L$" left="200" name="fastpay 20" width="70"/>
<text halign="left" left="5" name="amount text">
- O, scegli importo:
+ Oppure, scegli importo:
</text>
<line_editor left="74" name="amount" width="50"/>
<button label="Paga" label_selected="Paga" name="pay btn"/>
diff --git a/indra/newview/skins/default/xui/it/floater_perm_prefs.xml b/indra/newview/skins/default/xui/it/floater_perm_prefs.xml
index 67e4093951..a02b3b5075 100644
--- a/indra/newview/skins/default/xui/it/floater_perm_prefs.xml
+++ b/indra/newview/skins/default/xui/it/floater_perm_prefs.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="perm prefs" title="PERMESSI di UPLOAD in DEFAULT">
+<floater name="perm prefs" title="DIRITTI DI CARICAMENTO PREDEFINITI">
<panel label="Permessi" name="permissions">
<button label="?" label_selected="?" name="help"/>
<check_box label="Condividi con il gruppo" name="share_with_group"/>
diff --git a/indra/newview/skins/default/xui/it/floater_postcard.xml b/indra/newview/skins/default/xui/it/floater_postcard.xml
index de246db826..cb2916268a 100644
--- a/indra/newview/skins/default/xui/it/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/it/floater_postcard.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Postcard" title="ISTANTANEA IN EMAIL">
+<floater name="Postcard" title="INVIA FOTO VIA E-MAIL">
<text name="to_label" width="135">
Email del destinatario:
</text>
@@ -35,6 +35,6 @@
Vieni a vedere!
</string>
<string name="upload_message">
- Spedendo...
+ Invio...
</string>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_preferences.xml b/indra/newview/skins/default/xui/it/floater_preferences.xml
index a76b9e3e27..c5b6654a69 100644
--- a/indra/newview/skins/default/xui/it/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/it/floater_preferences.xml
@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater min_width="350" name="Preferences" title="PREFERENZE" width="646">
+<floater name="Preferences" title="PREFERENZE">
<button label="OK" label_selected="OK" name="OK"/>
<button label="Annulla" label_selected="Annulla" name="Cancel"/>
- <tab_container name="pref core" tab_width="146" width="646">
+ <tab_container name="pref core" tab_width="100">
<panel label="Generale" name="general"/>
<panel label="Grafica" name="display"/>
- <panel label="Privacy" name="im"/>
- <panel label="Suono" name="audio"/>
+ <panel label="Riservatezza" name="im"/>
+ <panel label="Audio e media" name="audio"/>
<panel label="Chat" name="chat"/>
<panel label="Notifiche" name="msgs"/>
- <panel label="Configurazione" name="input"/>
- <panel label="Avanzato" name="advanced1"/>
+ <panel label="Impostazione" name="input"/>
+ <panel label="Avanzate" name="advanced1"/>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_preview_animation.xml b/indra/newview/skins/default/xui/it/floater_preview_animation.xml
index 006198781b..73082c9526 100644
--- a/indra/newview/skins/default/xui/it/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/it/floater_preview_animation.xml
@@ -6,6 +6,6 @@
<text name="desc txt">
Descrizione:
</text>
- <button label="Esegui inworld" label_selected="Ferma" left="20" name="Anim play btn" tool_tip="Riproduci questa animazione così che gli altri possano vederla" width="131"/>
+ <button label="Riproduci in Second Life" label_selected="Ferma" left="20" name="Anim play btn" tool_tip="Riproduci questa animazione così che gli altri possano vederla" width="131"/>
<button label="Esegui localmente" label_selected="Ferma" left="162" name="Anim audition btn" tool_tip="Riproduci questa animazione così che solo tu possa vederla" width="125"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_preview_gesture.xml b/indra/newview/skins/default/xui/it/floater_preview_gesture.xml
index 850f4c21ac..4e926cedc9 100644
--- a/indra/newview/skins/default/xui/it/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/it/floater_preview_gesture.xml
@@ -24,6 +24,9 @@
<floater.string name="Title">
Gesture: [NAME]
</floater.string>
+ <text name="name_text">
+ Nome:
+ </text>
<text name="desc_label">
Descrizione:
</text>
@@ -47,18 +50,18 @@
<text name="steps_label">
Fasi:
</text>
- <button label="Sù" name="up_btn"/>
+ <button label="Su" name="up_btn"/>
<button label="Giù" name="down_btn"/>
<button label="Elimina" name="delete_btn"/>
<radio_group name="animation_trigger_type">
- <radio_item label="Inizia" name="start"/>
- <radio_item label="Stop" name="stop"/>
+ <radio_item label="Attiva" name="start"/>
+ <radio_item label="Ferma" name="stop"/>
</radio_group>
<check_box label="finché le animazioni sono eseguite" left="226" name="wait_anim_check"/>
<check_box label="tempo in secondi" name="wait_time_check"/>
<line_editor left_delta="114" name="wait_time_editor"/>
<text name="help_label">
- Tutte le fasi avvengono simultaneamente, a meno che non aggiungi una fase attendi.
+ Tutte le fasi avvengono contemporaneamente, a meno che non aggiungi fasi di attesa.
</text>
<check_box label="Attiva" name="active_check" tool_tip="Le gesture attivate possono essere eseguite scrivendo in chat la parola chiave o premendo i tasti chiave. Le gesture generalmente si disattivano quando c&apos;è un conflitto nei relativi tasti."/>
<button label="Anteprima" name="preview_btn"/>
diff --git a/indra/newview/skins/default/xui/it/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/it/floater_preview_gesture_info.xml
index 660b868cae..d490416cc7 100644
--- a/indra/newview/skins/default/xui/it/floater_preview_gesture_info.xml
+++ b/indra/newview/skins/default/xui/it/floater_preview_gesture_info.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Gesture" title="GESTURE SHORTCUT"/>
+<floater name="Gesture" title="SCORCIATOIA GESTURE"/>
diff --git a/indra/newview/skins/default/xui/it/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/it/floater_preview_gesture_shortcut.xml
index 942d5ed1ce..eb0bc4d868 100644
--- a/indra/newview/skins/default/xui/it/floater_preview_gesture_shortcut.xml
+++ b/indra/newview/skins/default/xui/it/floater_preview_gesture_shortcut.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Gesture" title="TASTO RAPIDO PER GESTURE">
+<floater name="Gesture" title="SCORCIATOIA GESTURE">
<text name="trigger_label">
Chat:
</text>
@@ -8,8 +8,8 @@
</text>
<combo_box label="Nessuno" name="modifier_combo"/>
<combo_box label="Nessuno" name="key_combo"/>
- <text name="replace_text" tool_tip="Sostituisci la parola chiave con queste parole. Per esempio, parola chiave &apos;ciao&apos; sostituendo con &apos;buongiorno&apos; cambierà la chat da &apos;Io dico ciao&apos; in &apos;Io dico buongiorno&apos; non appena attiverete la gesture!">
+ <text name="replace_text" tool_tip="Sostituisci la parola chiave con queste parole. Per esempio, se si sceglie di sostituire la parola chiave &apos;ciao&apos; con &apos;buongiorno&apos;, nella chat il testo &apos;Volevo dire ciao&apos; diventerà &apos;Volevo dire buongiorno&apos; e verrà attivata la gesture.">
Sostituisci:
</text>
- <line_editor name="replace_editor" tool_tip="Sostituisci la parola chiave con queste parole. Per esempio, parola chiave &apos;ciao&apos; sostituendo con &apos;buongiorno&apos; cambierà la chat da &apos;Io dico ciao&apos; in &apos;Io dico buongiorno&apos; non appena attiverete la gesture"/>
+ <line_editor name="replace_editor" tool_tip="Sostituisci la parola chiave con queste parole. Per esempio, se si sceglie di sostituire la parola chiave &apos;ciao&apos; con &apos;buongiorno&apos;, nella chat il testo &apos;Volevo dire ciao&apos; diventerà &apos;Volevo dire buongiorno&apos; e verrà attivata la gesture"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/it/floater_preview_gesture_steps.xml
index 7c1f55ddba..d490416cc7 100644
--- a/indra/newview/skins/default/xui/it/floater_preview_gesture_steps.xml
+++ b/indra/newview/skins/default/xui/it/floater_preview_gesture_steps.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Gesture" title="TASTO RAPIDO GESTURE"/>
+<floater name="Gesture" title="SCORCIATOIA GESTURE"/>
diff --git a/indra/newview/skins/default/xui/it/floater_preview_notecard.xml b/indra/newview/skins/default/xui/it/floater_preview_notecard.xml
index 08f5087242..7ec229f9d3 100644
--- a/indra/newview/skins/default/xui/it/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/it/floater_preview_notecard.xml
@@ -1,16 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview notecard" title="NOTE:">
+<floater name="preview notecard" title="BIGLIETTO:">
<floater.string name="no_object">
- Impossibile trovare l&apos;oggetto che contiene questa nota.
+ Impossibile trovare un oggetto contenente questo biglietto
</floater.string>
<floater.string name="not_allowed">
- Non hai i permessi per leggere questa nota.
+ Non hai il permesso di leggere questo biglietto.
</floater.string>
<floater.string name="Title">
- Notecard: [NAME]
- </floater.string>
- <floater.string label="Salva" label_selected="Salva" name="Save">
- Salva
+ Biglietto: [NAME]
</floater.string>
<text name="desc txt">
Descrizione:
@@ -19,4 +16,5 @@
In caricamento...
</text_editor>
<button label="Salva" label_selected="Salva" name="Save"/>
+ <button label="Elimina" label_selected="Elimina" name="Delete"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_preview_sound.xml b/indra/newview/skins/default/xui/it/floater_preview_sound.xml
index 182243561c..8eb9573e54 100644
--- a/indra/newview/skins/default/xui/it/floater_preview_sound.xml
+++ b/indra/newview/skins/default/xui/it/floater_preview_sound.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_sound">
<floater.string name="Title">
- Suono: [NAME]
+ Suono : [NAME]
</floater.string>
<text name="desc txt">
Descrizione:
</text>
- <button label="Avvia inworld" label_selected="Avvia inworld" name="Sound play btn" tool_tip="Riproduci questo suono in modo che gli altri possano sentirlo"/>
- <button label="Avvia localmente" label_selected="Avvia localmente" name="Sound audition btn" tool_tip="Riproduci questo suono in modo che solo tu possa sentirlo"/>
+ <button label="Riproduci in Second Life" label_selected="Riproduci in Second Life" name="Sound play btn" tool_tip="Riproduci questo suono in modo che anche gli altri possano udirlo"/>
+ <button label="Avvia localmente" label_selected="Avvia localmente" name="Sound audition btn" tool_tip="Riproduci questo suono in modo che solo tu possa udirlo"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_preview_texture.xml b/indra/newview/skins/default/xui/it/floater_preview_texture.xml
index dd24079ea3..5b4054514e 100644
--- a/indra/newview/skins/default/xui/it/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/it/floater_preview_texture.xml
@@ -10,35 +10,38 @@
Descrizione:
</text>
<text name="dimensions">
- [WIDTH]px x [HEIGHT]px
+ [WIDTH] px x [HEIGHT] px
</text>
- <combo_box name="combo_aspect_ratio" tool_tip="Anteprima del rapporto d&apos;aspetto impostato">
+ <text name="aspect_ratio">
+ Antreprima rapporto di visualizzazione
+ </text>
+ <combo_box name="combo_aspect_ratio" tool_tip="Anteprima con rapporto di visualizzazione fisso">
<combo_item name="Unconstrained">
Libero
</combo_item>
- <combo_item name="1:1" tool_tip="Immagine del Gruppo o Profilo nel Mondo Reale">
+ <combo_item name="1:1" tool_tip="Logo del gruppo o profilo nel mondo reale">
1:1
</combo_item>
- <combo_item name="4:3" tool_tip="[SECOND_LIFE] profilo">
+ <combo_item name="4:3" tool_tip="Profilo [SECOND_LIFE]">
4:3
</combo_item>
- <combo_item name="10:7" tool_tip="Annunci ed elenco del Cerca, landmarks">
+ <combo_item name="10:7" tool_tip="Annunci e inserzioni, punti di riferimento">
10:7
</combo_item>
- <combo_item name="3:2" tool_tip="Info sul terreno">
+ <combo_item name="3:2" tool_tip="Informazioni sul terreno">
3:2
</combo_item>
<combo_item name="16:10">
16:10
</combo_item>
- <combo_item name="16:9" tool_tip="Preferiti nel Profilo">
+ <combo_item name="16:9" tool_tip="Preferiti del Profilo">
16:9
</combo_item>
<combo_item name="2:1">
2:1
</combo_item>
</combo_box>
- <button label="OK" name="keep"/>
- <button label="Cancella" name="discard"/>
- <button label="Salva come:" name="save_tex_btn"/>
+ <button label="OK" name="Keep"/>
+ <button label="Elimina" name="Discard"/>
+ <button label="Salva con nome" name="save_tex_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_publish_classified.xml b/indra/newview/skins/default/xui/it/floater_publish_classified.xml
new file mode 100644
index 0000000000..6984412728
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_publish_classified.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="publish_classified" title="Pubblicazione inserzione">
+ <text name="explanation_text">
+ La tua inserzione sarà visibile per una settimana dal giorno della sua pubblicazione.
+
+Ricordiamo che i costi per gli annunci non possono essere rimborsati
+ </text>
+ <spinner label="Prezzo per inserzione:" name="price_for_listing" tool_tip="Prezzo per inserzione:" value="50"/>
+ <text name="l$_text" value="L$"/>
+ <text name="more_info_text">
+ Maggiori informazioni (link alla guida sugli annunci)
+ </text>
+ <button label="Pubblica" name="publish_btn"/>
+ <button label="Annulla" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_region_info.xml b/indra/newview/skins/default/xui/it/floater_region_info.xml
index 98808e4b55..dc2c24ca56 100644
--- a/indra/newview/skins/default/xui/it/floater_region_info.xml
+++ b/indra/newview/skins/default/xui/it/floater_region_info.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="regioninfo" title="REGIONE/PROPRIETA&apos;"/>
+<floater name="regioninfo" title="Regione/proprietà immobiliare"/>
diff --git a/indra/newview/skins/default/xui/it/floater_report_abuse.xml b/indra/newview/skins/default/xui/it/floater_report_abuse.xml
index a1e430b6b2..eeba54b0ca 100644
--- a/indra/newview/skins/default/xui/it/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/it/floater_report_abuse.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_report_abuse" title="DENUNCIA DI ABUSO">
<floater.string name="Screenshot">
- Fotografia
+ Immagine
</floater.string>
- <check_box label="Utilizza questa fotografia" name="screen_check"/>
+ <check_box label="Utilizza questa immagine" name="screen_check"/>
<text name="reporter_title">
Segnalato da:
</text>
@@ -41,8 +41,8 @@
<combo_box name="category_combo" tool_tip="Categoria -- scegli la categoria che descrive meglio questa segnalazione">
<combo_box.item label="Scegli la categoria" name="Select_category"/>
<combo_box.item label="Età &gt; Far finta di essere minore" name="Age__Age_play"/>
- <combo_box.item label="Età &gt; Residente adulto nella Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/>
- <combo_box.item label="Età &gt; Residente minorenne al di fuori della &apos;Second Life per Teenager&apos;" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
+ <combo_box.item label="Età &gt; Residente adulto in Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/>
+ <combo_box.item label="Età &gt; Residente minorenne fuori da Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
<combo_box.item label="Assalto &gt; sandbox da combattimento / area pericolosa" name="Assault__Combat_sandbox___unsafe_area"/>
<combo_box.item label="Assalto &gt; Area sicura" name="Assault__Safe_area"/>
<combo_box.item label="Assalto &gt; Test di armi in sandbox" name="Assault__Weapons_testing_sandbox"/>
@@ -67,8 +67,8 @@
<combo_box.item label="Molestie &gt; Abusi verbali" name="Harassment__Verbal_abuse"/>
<combo_box.item label="Indecenza &gt; Condotta o contenuti largamente offensivi" name="Indecency__Broadly_offensive_content_or_conduct"/>
<combo_box.item label="Indecenza &gt; Nome di un avatar inappropriato" name="Indecency__Inappropriate_avatar_name"/>
- <combo_box.item label="Indecenza &gt; Contenuto o condotta inappropriata in una regione PG" name="Indecency__Mature_content_in_PG_region"/>
- <combo_box.item label="Indecenza &gt; Contenuto o condotta inappropriata in una regione Mature" name="Indecency__Inappropriate_content_in_Mature_region"/>
+ <combo_box.item label="Indecenza &gt; Contenuto o condotta inappropriata in una regione con accesso Generale" name="Indecency__Mature_content_in_PG_region"/>
+ <combo_box.item label="Indecenza &gt; Contenuto o condotta inappropriata in una regione con accesso Moderato" name="Indecency__Inappropriate_content_in_Mature_region"/>
<combo_box.item label="Violazione della proprietà intellettuale &gt; Rimozione contenuti" name="Intellectual_property_infringement_Content_Removal"/>
<combo_box.item label="Violazione della proprietà intellettuale &gt; CopyBot o sblocco di permessi" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
<combo_box.item label="Intolleranza" name="Intolerance"/>
@@ -82,7 +82,7 @@
<text name="abuser_name_title">
Nome di chi ha commesso l&apos;abuso:
</text>
- <button label="Scegli un residente" label_selected="" name="select_abuser" tool_tip="Scegli il nome di chi ha commesso l&apos;abuso dalla lista"/>
+ <button label="Scegli" label_selected="" name="select_abuser" tool_tip="Scegli il nome di chi ha commesso l&apos;abuso dalla lista"/>
<text name="abuser_name_title2">
Luogo dell&apos;abuso:
</text>
@@ -93,10 +93,10 @@
Dettagli:
</text>
<text name="bug_aviso">
- Specifica data, luogo, natura dell&apos;abuso, testo rilevante di chat/IM, e se possibile indica l&apos;oggetto.
+ Fornisci informazioni specifiche il più possibile
</text>
<text name="incomplete_title">
- * Nota: segnalazioni incomplete non saranno esaminate
+ * le segnalazioni incomplete non saranno esaminate
</text>
<button label="Segnala abuso" label_selected="Segnala abuso" name="send_btn"/>
<button label="Annulla" label_selected="Annulla" name="cancel_btn"/>
diff --git a/indra/newview/skins/default/xui/it/floater_script_limits.xml b/indra/newview/skins/default/xui/it/floater_script_limits.xml
new file mode 100644
index 0000000000..2383b85bb7
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_script_limits.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="scriptlimits" title="INFORMAZIONI SULLO SCRIPT"/>
diff --git a/indra/newview/skins/default/xui/it/floater_script_preview.xml b/indra/newview/skins/default/xui/it/floater_script_preview.xml
index 9428297397..d007774f43 100644
--- a/indra/newview/skins/default/xui/it/floater_script_preview.xml
+++ b/indra/newview/skins/default/xui/it/floater_script_preview.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview lsl text" title="SCRIPT: SCRIPT DI ROTAZIONE">
<floater.string name="Title">
- Script: [NAME]
+ SCRIPT: [NAME]
</floater.string>
<text name="desc txt">
Descrizione:
diff --git a/indra/newview/skins/default/xui/it/floater_script_queue.xml b/indra/newview/skins/default/xui/it/floater_script_queue.xml
index 728fbe8c8d..f4117d30a2 100644
--- a/indra/newview/skins/default/xui/it/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/it/floater_script_queue.xml
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="queue" title="RESETTA IL PROGRESSO">
+<floater name="queue" title="AZZERA AVANZAMENTO">
<floater.string name="Starting">
- Conteggio [START] degli [COUNT] articoli.
+ Avvio di [START] di [COUNT] oggetti.
</floater.string>
<floater.string name="Done">
- Eseguito.
+ Fine.
</floater.string>
<floater.string name="Resetting">
- Resettando
+ Ripristino in corso
</floater.string>
<floater.string name="Running">
In esecuzione
diff --git a/indra/newview/skins/default/xui/it/floater_search.xml b/indra/newview/skins/default/xui/it/floater_search.xml
index 6afdd2437e..05f5dfe719 100644
--- a/indra/newview/skins/default/xui/it/floater_search.xml
+++ b/indra/newview/skins/default/xui/it/floater_search.xml
@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_search" title="TROVA">
<floater.string name="loading_text">
- Caricando...
+ Caricamento in corso...
</floater.string>
<floater.string name="done_text">
- Eseguito
+ Fine
</floater.string>
<layout_stack name="stack1">
<layout_panel name="browser_layout">
<text name="refresh_search">
- Redo search to reflect current God level
+ Ripeti ricerca in modo che rifletta il livello di diritti Admin attuale
</text>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/it/floater_select_key.xml b/indra/newview/skins/default/xui/it/floater_select_key.xml
index 181b7d5292..014bc76ffb 100644
--- a/indra/newview/skins/default/xui/it/floater_select_key.xml
+++ b/indra/newview/skins/default/xui/it/floater_select_key.xml
@@ -2,6 +2,6 @@
<floater name="modal container" title="">
<button label="Annulla" label_selected="Annulla" name="Cancel"/>
<text name="Save item as:">
- clicca un tasto per impostare la modalità PARLA con il tuo pulsante.
+ Premi una chiave per configurarla come pulsante da premere per parlare.
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_sell_land.xml b/indra/newview/skins/default/xui/it/floater_sell_land.xml
index 2a4fa05b54..0f8d24ebbd 100644
--- a/indra/newview/skins/default/xui/it/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/it/floater_sell_land.xml
@@ -1,21 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="sell land" title="VENDI LA TERRA">
+<floater name="sell land" title="VENDI TERRENO">
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
<text name="info_parcel_label">
- Parcel:
+ Lotto:
</text>
<text left="82" name="info_parcel">
- NOME DEL PARCEL
+ NOME DEL LOTTO
</text>
<text name="info_size_label">
- Misura:
+ Dimensioni:
</text>
<text left="82" name="info_size">
[AREA] m²
</text>
<text bottom_delta="-57" height="28" name="info_action">
- Vendere questo parcel:
+ Per vendere questo lotto:
</text>
<text name="price_label">
1. Imposta un prezzo:
@@ -30,36 +30,36 @@
0
</line_editor>
<text name="price_per_m">
- (L$[PER_METER] per m²)
+ ([PER_METER] L$ per m²)
</text>
<text name="sell_to_label">
- 2. Vendi la terra a:
+ 2. Vendi il terreno a:
</text>
<text name="sell_to_text">
- Scegli se vendere a chiunque o ad un specifico compratore.
+ Scegli se vendere a chiunque o ad un determinato acquirente.
</text>
<combo_box name="sell_to">
<combo_box.item label="- Seleziona uno -" name="--selectone--"/>
<combo_box.item label="Chiunque" name="Anyone"/>
- <combo_box.item label="Persona Specifica:" name="Specificuser:"/>
+ <combo_box.item label="Persona specifica:" name="Specificuser:"/>
</combo_box>
<button label="Seleziona" name="sell_to_select_agent"/>
<text name="sell_objects_label">
3. Vendi gli oggetti con la terra?
</text>
<text name="sell_objects_text">
- Gli oggetti trasferibili del proprietaio della Terra cambieranno proprietà.
+ Gli oggetti trasferibili del proprietario presenti sul lotto cambieranno di proprietà.
</text>
<radio_group bottom_delta="-58" name="sell_objects">
- <radio_item label="No, mantieni la proprietà sugli oggetti" name="no"/>
+ <radio_item label="No, mantieni la proprietà degli oggetti" name="no"/>
<radio_item label="Si, vendi gli oggetti con la terra" name="yes"/>
</radio_group>
- <button label="Mostra Oggetti" name="show_objects"/>
+ <button label="Mostra oggetti" name="show_objects"/>
<text name="nag_message_label">
RICORDA: Tutte le vendite sono definitive.
</text>
- <button label="Imposta Terra in Vendita" name="sell_btn"/>
- <button label="Cancella" name="cancel_btn"/>
+ <button label="Imposta terreno come in vendita" name="sell_btn"/>
+ <button label="Annulla" name="cancel_btn"/>
</panel>
</scroll_container>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_settings_debug.xml b/indra/newview/skins/default/xui/it/floater_settings_debug.xml
index 385a7ed6e9..aab00a26ce 100644
--- a/indra/newview/skins/default/xui/it/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/it/floater_settings_debug.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="settings_debug" title="DEBUG SETTINGS">
- <combo_box name="boolean_combo">
- <combo_box.item label="VERO" name="TRUE"/>
- <combo_box.item label="FALSO" name="FALSE"/>
- </combo_box>
+<floater name="settings_debug" title="PARAMETRI DI DEBUG">
+ <radio_group name="boolean_combo">
+ <radio_item label="VERO" name="TRUE" value="vero"/>
+ <radio_item label="FALSO" name="FALSE" value=""/>
+ </radio_group>
<color_swatch label="Colore" name="val_color_swatch"/>
<spinner label="x" name="val_spinner_1"/>
<spinner label="x" name="val_spinner_2"/>
diff --git a/indra/newview/skins/default/xui/it/floater_snapshot.xml b/indra/newview/skins/default/xui/it/floater_snapshot.xml
index 668c3c8c9e..d2ba980f62 100644
--- a/indra/newview/skins/default/xui/it/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/it/floater_snapshot.xml
@@ -1,80 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Snapshot" title="ANTEPRIMA FOTOGRAFIA" width="247">
- <text name="type_label">
- Destinazione della fotografia
- </text>
- <radio_group label="Tipo di fotografia" name="snapshot_type_radio" width="228">
- <radio_item label="Invia via email" name="postcard"/>
- <radio_item label="Salva nel tuo inventario ([AMOUNT] L$)" name="texture"/>
- <radio_item label="Salva sul tuo pc" name="local"/>
- </radio_group>
- <text name="file_size_label">
- Grandezza del file: [SIZE] KB
- </text>
- <button label="Aggiorna la fotografia" name="new_snapshot_btn"/>
- <button label="Invia" name="send_btn"/>
- <button label="Salva ([AMOUNT] L$)" name="upload_btn"/>
- <flyout_button label="Salva" name="save_btn" tool_tip="Salva l&apos;immagine come file">
- <flyout_button_item label="Salva" name="save_item"/>
- <flyout_button_item label="Salva come..." name="saveas_item"/>
- </flyout_button>
- <button label="Annulla" name="discard_btn"/>
- <button label="Espandi &gt;&gt;" name="more_btn" tool_tip="Opzioni Avanzate"/>
- <button label="&lt;&lt; Diminuisci" name="less_btn" tool_tip="Opzioni Avanzate"/>
- <text name="type_label2">
- Grandezza
- </text>
- <text name="format_label">
- Formato
- </text>
- <combo_box label="Risoluzione" name="postcard_size_combo">
- <combo_box.item label="Finestra corrente" name="CurrentWindow"/>
- <combo_box.item label="640x480" name="640x480"/>
- <combo_box.item label="800x600" name="800x600"/>
- <combo_box.item label="1024x768" name="1024x768"/>
- <combo_box.item label="Personalizzata" name="Custom"/>
- </combo_box>
- <combo_box label="Risoluzione" name="texture_size_combo">
- <combo_box.item label="Finestra corrente" name="CurrentWindow"/>
- <combo_box.item label="Piccola (128x128)" name="Small(128x128)"/>
- <combo_box.item label="Media (256x256)" name="Medium(256x256)"/>
- <combo_box.item label="Larga (512x512)" name="Large(512x512)"/>
- <combo_box.item label="Personalizzata" name="Custom"/>
- </combo_box>
- <combo_box label="Risoluzione" name="local_size_combo">
- <combo_box.item label="Finestra corrente" name="CurrentWindow"/>
- <combo_box.item label="320x240" name="320x240"/>
- <combo_box.item label="640x480" name="640x480"/>
- <combo_box.item label="800x600" name="800x600"/>
- <combo_box.item label="1024x768" name="1024x768"/>
- <combo_box.item label="1280x1024" name="1280x1024"/>
- <combo_box.item label="1600x1200" name="1600x1200"/>
- <combo_box.item label="Personalizzata" name="Custom"/>
- </combo_box>
- <combo_box label="Formato" name="local_format_combo">
- <combo_box.item label="PNG" name="PNG"/>
- <combo_box.item label="JPEG" name="JPEG"/>
- <combo_box.item label="BMP" name="BMP"/>
- </combo_box>
- <spinner label="Larghezza" label_width="58" name="snapshot_width" width="116"/>
- <spinner label="Altezza" label_width="41" left="130" name="snapshot_height" width="101"/>
- <check_box label="Mantieni le proporzioni" name="keep_aspect_check"/>
- <slider label="Qualità d&apos;immagine" name="image_quality_slider"/>
- <text name="layer_type_label" width="55">
- Fotografa:
- </text>
- <combo_box label="Layer dell&apos;immagine" left="68" name="layer_types" width="165">
- <combo_box.item label="Colori" name="Colors"/>
- <combo_box.item label="Profondità" name="Depth"/>
- <combo_box.item label="Colori primari degli oggetti" name="ObjectMattes"/>
- </combo_box>
- <check_box label="Mostra l&apos;interfaccia nella fotografia" name="ui_check"/>
- <check_box bottom_delta="-17" label="Mostra i dispositivi indossati nella foto" name="hud_check"/>
- <check_box bottom_delta="-17" label="Mantieni aperto dopo aver salvato" name="keep_open_check"/>
- <check_box bottom_delta="-17" label="Blocca l&apos;anteprima
-(Anteprima a schermo intero)" name="freeze_frame_check"/>
- <check_box bottom_delta="-29" label="Auto-Aggiorna" name="auto_snapshot_check"/>
- <string name="unknown">
+<floater name="Snapshot" title="Istantanea" width="247">
+ <floater.string name="unknown">
sconosciuto
- </string>
+ </floater.string>
+ <button label="Aggiorna la fotografia" name="new_snapshot_btn"/>
+ <line_editor label="Descrizione" name="description"/>
+ <panel name="panel_snapshot_main">
+ <button label="Condividi foto" name="share"/>
+ <button label="Salva foto" name="save"/>
+ <button label="Imposta come foto del profilo" name="set_profile_pic"/>
+ </panel>
+ <panel name="panel_snapshot_share">
+ <button label="Condividi su Web" name="share_to_web"/>
+ <button label="Invia foto via e-mail" name="share_to_email"/>
+ <button label="Indietro" name="cancel_share"/>
+ </panel>
+ <panel name="panel_snapshot_save">
+ <button label="Salva nell&apos;inventario" name="save_to_inventory"/>
+ <button label="Salva sul mio computer" name="save_to_computer"/>
+ <button label="Indietro" name="cancel_save"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_stats.xml b/indra/newview/skins/default/xui/it/floater_stats.xml
index 7c8e6ba1a1..aed2a03a21 100644
--- a/indra/newview/skins/default/xui/it/floater_stats.xml
+++ b/indra/newview/skins/default/xui/it/floater_stats.xml
@@ -2,68 +2,68 @@
<floater name="Statistics" title="STATISTICHE">
<scroll_container name="statistics_scroll">
<container_view name="statistics_view">
- <stat_view label="Base" name="basic">
+ <stat_view label="Di base" name="basic">
<stat_bar label="FPS" name="fps"/>
- <stat_bar label="Larghezza Banda" name="bandwidth"/>
- <stat_bar label="Perdita Pacchetti" name="packet_loss"/>
+ <stat_bar label="Larghezza banda" name="bandwidth"/>
+ <stat_bar label="Perdita pacchetti" name="packet_loss"/>
<stat_bar label="Tempo Ping Sim" name="ping"/>
</stat_view>
- <stat_view label="Avanzato" name="advanced">
+ <stat_view label="Avanzata" name="advanced">
<stat_view label="Render" name="render">
- <stat_bar label="KTris Disegnate" name="ktrisframe"/>
- <stat_bar label="KTris Disegnate" name="ktrissec"/>
- <stat_bar label="Totale Oggetti" name="objs"/>
- <stat_bar label="Nuovi Oggetti" name="newobjs"/>
+ <stat_bar label="KTris disegnate" name="ktrisframe"/>
+ <stat_bar label="KTris disegnate" name="ktrissec"/>
+ <stat_bar label="Totale oggetti" name="objs"/>
+ <stat_bar label="Nuovi oggetti" name="newobjs"/>
</stat_view>
<stat_view label="Texture" name="texture">
<stat_bar label="Conteggio" name="numimagesstat"/>
- <stat_bar label="Conteggio Grezzo" name="numrawimagesstat"/>
+ <stat_bar label="Conteggio grezzo" name="numrawimagesstat"/>
<stat_bar label="Memoria GL" name="gltexmemstat"/>
- <stat_bar label="Memoria Formattata" name="formattedmemstat"/>
- <stat_bar label="Memoria Complessiva" name="rawmemstat"/>
- <stat_bar label="Memoria Impegnata" name="glboundmemstat"/>
+ <stat_bar label="Memoria formattata" name="formattedmemstat"/>
+ <stat_bar label="Memoria complessiva" name="rawmemstat"/>
+ <stat_bar label="Memoria impegnata" name="glboundmemstat"/>
</stat_view>
<stat_view label="Rete" name="network">
- <stat_bar label="Pacchetti In Ingresso" name="packetsinstat"/>
- <stat_bar label="Pacchetti In Uscita" name="packetsoutstat"/>
+ <stat_bar label="Pacchetti in ingresso" name="packetsinstat"/>
+ <stat_bar label="Pacchetti in uscita" name="packetsoutstat"/>
<stat_bar label="Oggetti" name="objectkbitstat"/>
<stat_bar label="Texture" name="texturekbitstat"/>
- <stat_bar label="Risorse Server" name="assetkbitstat"/>
+ <stat_bar label="Risorse server" name="assetkbitstat"/>
<stat_bar label="Layer" name="layerskbitstat"/>
- <stat_bar label="Effettivi In Ingresso" name="actualinkbitstat"/>
- <stat_bar label="Effettivi in Uscita" name="actualoutkbitstat"/>
+ <stat_bar label="Effettivi in ingresso" name="actualinkbitstat"/>
+ <stat_bar label="Effettivi in uscita" name="actualoutkbitstat"/>
<stat_bar label="Operazioni pendenti VFS" name="vfspendingoperations"/>
</stat_view>
</stat_view>
<stat_view label="Simulatore" name="sim">
<stat_bar label="Dilatazione temporale" name="simtimedilation"/>
<stat_bar label="FPS Sim" name="simfps"/>
- <stat_bar label="FPS Motore Fisico" name="simphysicsfps"/>
- <stat_view label="Dettagli Motore Fisico" name="physicsdetail">
- <stat_bar label="Oggetti Pinzati" name="physicspinnedtasks"/>
+ <stat_bar label="FPS motore fisico" name="simphysicsfps"/>
+ <stat_view label="Dettagli motore fisico" name="physicsdetail">
+ <stat_bar label="Oggetti pinzati" name="physicspinnedtasks"/>
<stat_bar label="Oggetti a basso LOD" name="physicslodtasks"/>
- <stat_bar label="Memoria Allocata" name="physicsmemoryallocated"/>
- <stat_bar label="Agenti Aggiornamenti al Sec" name="simagentups"/>
- <stat_bar label="Agenti Principali" name="simmainagents"/>
- <stat_bar label="Agenti Figli" name="simchildagents"/>
+ <stat_bar label="Memoria allocata" name="physicsmemoryallocated"/>
+ <stat_bar label="Aggiornamenti agenti al sec" name="simagentups"/>
+ <stat_bar label="Avatar principali" name="simmainagents"/>
+ <stat_bar label="Avatar secondari" name="simchildagents"/>
<stat_bar label="Oggetti" name="simobjects"/>
- <stat_bar label="Oggetti Attivi" name="simactiveobjects"/>
- <stat_bar label="Script Attivi" name="simactivescripts"/>
- <stat_bar label="Eventi Script" name="simscripteps"/>
- <stat_bar label="Pacchetti In Ingresso" name="siminpps"/>
- <stat_bar label="Pacchetti In Uscita" name="simoutpps"/>
- <stat_bar label="Download Pendenti" name="simpendingdownloads"/>
- <stat_bar label="Upload Pendenti" name="simpendinguploads"/>
- <stat_bar label="Numero totale byte non risposti" name="simtotalunackedbytes"/>
+ <stat_bar label="Oggetti attivi" name="simactiveobjects"/>
+ <stat_bar label="Script attivi" name="simactivescripts"/>
+ <stat_bar label="Eventi di script" name="simscripteps"/>
+ <stat_bar label="Pacchetti in ingresso" name="siminpps"/>
+ <stat_bar label="Pacchetti in uscita" name="simoutpps"/>
+ <stat_bar label="Download in attesa" name="simpendingdownloads"/>
+ <stat_bar label="Caricamenti in attesa" name="simpendinguploads"/>
+ <stat_bar label="Numero totale byte non confermati (Unacked)" name="simtotalunackedbytes"/>
</stat_view>
<stat_view label="Tempo (ms)" name="simperf">
- <stat_bar label="Tempo Totale Frame" name="simframemsec"/>
- <stat_bar label="Tempo Netto" name="simnetmsec"/>
- <stat_bar label="Tempo Motore Fisico" name="simsimphysicsmsec"/>
- <stat_bar label="Tempo Simulazione" name="simsimothermsec"/>
- <stat_bar label="Tempo Agenti" name="simagentmsec"/>
- <stat_bar label="Tempo Immagini" name="simimagesmsec"/>
- <stat_bar label="Tempo Script" name="simscriptmsec"/>
+ <stat_bar label="Tempo totale Frame" name="simframemsec"/>
+ <stat_bar label="Tempo netto" name="simnetmsec"/>
+ <stat_bar label="Tempo motore fisico" name="simsimphysicsmsec"/>
+ <stat_bar label="Tempo simulazione" name="simsimothermsec"/>
+ <stat_bar label="Tempo avatar" name="simagentmsec"/>
+ <stat_bar label="Tempo immagini" name="simimagesmsec"/>
+ <stat_bar label="Tempo script" name="simscriptmsec"/>
</stat_view>
</stat_view>
</container_view>
diff --git a/indra/newview/skins/default/xui/it/floater_sys_well.xml b/indra/newview/skins/default/xui/it/floater_sys_well.xml
index 057d3657d0..e1c0b89902 100644
--- a/indra/newview/skins/default/xui/it/floater_sys_well.xml
+++ b/indra/newview/skins/default/xui/it/floater_sys_well.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="sys_well_window" title="NOTIFICHE">
+<floater name="sys_well_window" title="AVVISI">
<string name="title_im_well_window">
- SESSIONE IM
+ CONVERSAZIONI
</string>
<string name="title_notification_well_window">
- NOTIFICHE
+ AVVISI
</string>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_telehub.xml b/indra/newview/skins/default/xui/it/floater_telehub.xml
index 08f5564c7b..15312a8959 100644
--- a/indra/newview/skins/default/xui/it/floater_telehub.xml
+++ b/indra/newview/skins/default/xui/it/floater_telehub.xml
@@ -21,9 +21,9 @@
<button label="Aggiungi punti rigenerazione" name="add_spawn_point_btn" width="165"/>
<button label="Rimuovi punti" left="175" name="remove_spawn_point_btn" width="105"/>
<text name="spawn_point_help">
- Seleziona un oggetto e click &quot;Aggiungi Spawn&quot; per specificare la posizione.
+ Seleziona un oggetto e fai clic su Aggiungi per specificare la posizione.
Ora puoi spostare o cancellare l&apos;oggetto.
-Le Posizioni sono relative al centro del telehub.
+Le posizioni sono relative al centro del telehub.
Seleziona un oggetto nella lista per evidenziarlo nel mondo.
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml
index e57c37073a..7b77584ba0 100644
--- a/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/it/floater_texture_ctrl.xml
@@ -1,22 +1,22 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="texture picker" title="Foto: TEXTURE">
+<floater name="texture picker" title="PREFERITO: TEXTURE">
<string name="choose_picture">
Clicca per scegliere l&apos;immagine
</string>
<text name="Multiple">
- Textures multiple
+ Texture multiple
</text>
<text name="unknown">
- Misura: [Dimensions]
+ Dimensioni: [DIMENSIONS]
</text>
<button label="Default" label_selected="Default" name="Default"/>
<button label="Niente" label_selected="Niente" name="None"/>
<button label="Vuoto" label_selected="Vuoto" name="Blank"/>
<check_box label="Mostra cartelle" name="show_folders_check"/>
- <search_editor label="Filtro Textures" name="inventory search editor"/>
- <check_box label="Applica ora" name="apply_immediate_check"/>
+ <search_editor label="Filtro texture" name="inventory search editor"/>
+ <check_box label="Applica adesso" name="apply_immediate_check"/>
<button label="Annulla" label_selected="Annulla" name="Cancel"/>
- <button label="Ok" label_selected="Ok" name="Select"/>
+ <button label="OK" label_selected="OK" name="Select"/>
<string name="pick title">
Scegli:
</string>
diff --git a/indra/newview/skins/default/xui/it/floater_tools.xml b/indra/newview/skins/default/xui/it/floater_tools.xml
index dda957025b..68d193ff33 100644
--- a/indra/newview/skins/default/xui/it/floater_tools.xml
+++ b/indra/newview/skins/default/xui/it/floater_tools.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="toolbox floater" short_title="STRUMENTI/ATTREZZI PER COSTRUIRE" title="" width="288">
+<floater name="toolbox floater" short_title="STRUMENTI PER COSTRUZIONE">
<floater.string name="status_rotate">
Sposta le fasce colorate per ruotare l&apos;oggetto
</floater.string>
@@ -16,7 +16,7 @@
Clicca e trascina per spostare la camera
</floater.string>
<floater.string name="status_grab">
- Trascina per spostare, Ctrl per sollevare, Ctrl+Shift per ruotare
+ Trascina per spostare, Ctrl per sollevare, Ctrl+Maiusc per ruotare
</floater.string>
<floater.string name="status_place">
Clicca inworld per costruire
@@ -39,43 +39,46 @@
<floater.string name="grid_attachment_text">
Accessorio
</floater.string>
- <button label="" label_selected="" name="button focus" tool_tip="Focus"/>
- <button label="" label_selected="" name="button move" tool_tip="Muoviti"/>
+ <button label="" label_selected="" name="button focus" tool_tip="Ingrandisci"/>
+ <button label="" label_selected="" name="button move" tool_tip="Sposta"/>
<button label="" label_selected="" name="button edit" tool_tip="Modifica"/>
<button label="" label_selected="" name="button create" tool_tip="Crea"/>
- <button label="" label_selected="" name="button land" tool_tip="Terra"/>
- <text name="text status" width="280">
+ <button label="" label_selected="" name="button land" tool_tip="Terreno"/>
+ <text name="text status">
Trascina per muovere, trascina+maiuscolo per copiare
</text>
<radio_group name="focus_radio_group">
<radio_item label="Zoom" name="radio zoom"/>
<radio_item label="Guarda ruotando (Ctrl)" name="radio orbit"/>
- <radio_item label="Panoramica (Ctrl+Shift)" name="radio pan"/>
+ <radio_item label="Panoramica (Ctrl+Maiusc)" name="radio pan"/>
</radio_group>
<radio_group name="move_radio_group">
<radio_item label="Muovi" name="radio move"/>
<radio_item label="Alza (Ctrl)" name="radio lift"/>
- <radio_item label="Ruota (Ctrl+Shift)" name="radio spin"/>
+ <radio_item label="Gira (Ctrl+Maiusc)" name="radio spin"/>
</radio_group>
<radio_group name="edit_radio_group">
<radio_item label="Sposta" name="radio position"/>
<radio_item label="Ruota (Ctrl)" name="radio rotate"/>
- <radio_item label="Estendi/Stira???!!!! (Ctrl+Shift)" name="radio stretch"/>
- <radio_item label="Seleziona Faccia multimediale" name="radio select face"/>
+ <radio_item label="Allunga (Ctrl+Maiusc)" name="radio stretch"/>
+ <radio_item label="Seleziona faccia" name="radio select face"/>
</radio_group>
<check_box label="Modifica parti collegate" name="checkbox edit linked parts"/>
- <text name="RenderingCost" tool_tip="Mostra il rendering cost calcolato per questo oggetto">
+ <text name="RenderingCost" tool_tip="Mostra il costo di rendering calcolato per questo oggetto">
þ: [COUNT]
</text>
- <check_box label="Ridimens. simmetricamente" name="checkbox uniform"/>
+ <check_box label="" name="checkbox uniform"/>
+ <text label="Allunga entrambi i lati" name="checkbox uniform label">
+ Allunga entrambi i lati
+ </text>
<check_box initial_value="true" label="Ridimensiona le texture" name="checkbox stretch textures"/>
- <check_box initial_value="true" label="Posiziona nella rete???!!!" name="checkbox snap to grid"/>
- <combo_box left_delta="48" name="combobox grid mode" tool_tip="Scegli il tipo di righello per posizionare l&apos;oggetto">
- <combo_box.item label="Rete del Mondo" name="World"/>
+ <check_box initial_value="true" label="Posiziona nella griglia" name="checkbox snap to grid"/>
+ <combo_box name="combobox grid mode" tool_tip="Scegli il tipo di righello per posizionare l&apos;oggetto">
+ <combo_box.item label="Rete del mondo" name="World"/>
<combo_box.item label="Rete locale" name="Local"/>
- <combo_box.item label="Riferimento della rete???!!!!" name="Reference"/>
+ <combo_box.item label="Griglia di riferimento" name="Reference"/>
</combo_box>
- <button label="Opzioni..." label_selected="Opzioni..." name="Options..." tool_tip="Vedi più opzioni delle rete"/>
+ <button label="Opzioni..." label_selected="Opzioni..." name="Options..." tool_tip="Vedi più opzioni della griglia"/>
<button label="" label_selected="" name="ToolCube" tool_tip="Cubo"/>
<button label="" label_selected="" name="ToolPrism" tool_tip="Prisma"/>
<button label="" label_selected="" name="ToolPyramid" tool_tip="Piramide"/>
@@ -91,10 +94,10 @@
<button label="" label_selected="" name="ToolRing" tool_tip="Anello"/>
<button label="" label_selected="" name="ToolTree" tool_tip="Albero"/>
<button label="" label_selected="" name="ToolGrass" tool_tip="Erba"/>
- <check_box label="Mantieni lo strumento/attrezzo selezionato" name="checkbox sticky"/>
- <check_box label="Seleziona la Copia" name="checkbox copy selection"/>
- <check_box initial_value="true" label="Centra la Copia" name="checkbox copy centers"/>
- <check_box label="Ruotare la Copia" name="checkbox copy rotates"/>
+ <check_box label="Mantieni lo strumento selezionato" name="checkbox sticky"/>
+ <check_box label="Copia la selezione" name="checkbox copy selection"/>
+ <check_box initial_value="true" label="Centra la copia" name="checkbox copy centers"/>
+ <check_box label="Ruota la copia" name="checkbox copy rotates"/>
<radio_group name="land_radio_group">
<radio_item label="Seleziona il terreno" name="radio select land"/>
<radio_item label="Appiattisci" name="radio flatten"/>
@@ -110,30 +113,30 @@
<text name="Dozer Size:">
Grandezza
</text>
- <slider_bar initial_value="2.0" left="184" name="slider brush size" width="74"/>
+ <slider_bar initial_value="2.0" name="slider brush size"/>
<text name="Strength:">
Potenza
</text>
- <button label="Applica" label_selected="Applica" left="146" name="button apply to selection" tool_tip="Modifica la terra selezionata"/>
- <text left="134" name="obj_count">
+ <button label="Applica" label_selected="Applica" name="button apply to selection" tool_tip="Modifica il terreno selezionato"/>
+ <text name="obj_count">
Oggetti: [COUNT]
</text>
- <text left="134" name="prim_count">
- Prims: [COUNT]
+ <text name="prim_count">
+ Prim: [COUNT]
</text>
- <tab_container name="Object Info Tabs" tab_max_width="150" tab_min_width="30" width="288">
+ <tab_container name="Object Info Tabs">
<panel label="Generale" name="General">
<panel.string name="text deed continued">
- Intesta
+ Cessione
</panel.string>
<panel.string name="text deed">
Cedi al gruppo
</panel.string>
<panel.string name="text modify info 1">
- Puoi modificare questo oggetto
+ Tu puoi modificare questo oggetto
</panel.string>
<panel.string name="text modify info 2">
- Puoi modificare questi oggetti
+ Tu puoi modificare questi oggetti
</panel.string>
<panel.string name="text modify info 3">
Non puoi modificare questo oggetto
@@ -148,10 +151,10 @@
Prezzo: L$
</panel.string>
<panel.string name="Cost Total">
- Prezzo Totale: L$
+ Prezzo totale: L$
</panel.string>
<panel.string name="Cost Per Unit">
- Prezzo per Unità: L$
+ Prezzo per: L$
</panel.string>
<panel.string name="Cost Mixed">
Prezzo misto
@@ -180,20 +183,20 @@
<text name="Group:">
Gruppo:
</text>
- <button label="Imposta..." label_selected="Imposta..." name="button set group" tool_tip="Scegli un gruppo per condividere i permessi di questo oggetto"/>
- <name_box initial_value="Caricando..." name="Group Name Proxy"/>
- <button label="Intesta" label_selected="Intesta" left_delta="152" name="button deed" tool_tip="Intestando permette di regalare questo oggetto con i permessi del prossimo proprietario. Gli oggetti condivisi dal gruppo posso essere instestati solo da un officer del gruppo." width="98"/>
- <check_box label="Condividi" name="checkbox share with group" tool_tip="Permetti ai membri del gruppo selezionato di condividere i tuoi permessi modify per questo oggetto. Tu devi Intestare per attivare le restrizioni al ruolo."/>
- <text name="label click action" width="220">
- Clicca:
+ <button label="Imposta..." label_selected="Imposta..." name="button set group" tool_tip="Scegli un gruppo con cui condividere i diritti relativi all&apos;oggetto"/>
+ <name_box initial_value="Caricamento in corso..." name="Group Name Proxy"/>
+ <button label="Cessione" label_selected="Cessione" name="button deed" tool_tip="Con una cessione si trasferisce il bene con i diritti al proprietario successivo Gli oggetti in proprietà condivisa di gruppo possono essere ceduti soltanto da un funzionario del gruppo."/>
+ <check_box label="Condividi" name="checkbox share with group" tool_tip="Consenti a tutti i membri del gruppo selezionato di condividere i tuoi diritti di modifica di questo oggetto. Per attivare le restrizioni per ruolo devi prima effettuare la cessione."/>
+ <text name="label click action">
+ Fai clic per:
</text>
- <combo_box name="clickaction" width="192">
- <combo_box.item label="Tocca (default)" name="Touch/grab(default)"/>
+ <combo_box name="clickaction">
+ <combo_box.item label="Tocca (predefinito)" name="Touch/grab(default)"/>
<combo_box.item label="Siediti sull&apos;oggetto" name="Sitonobject"/>
<combo_box.item label="Compra l&apos;oggetto" name="Buyobject"/>
<combo_box.item label="Paga l&apos;oggetto" name="Payobject"/>
<combo_box.item label="Apri" name="Open"/>
- <combo_box.item label="Zoom" name="Zoom"/>
+ <combo_box.item label="Ingrandisci" name="Zoom"/>
</combo_box>
<check_box label="In vendita:" name="checkbox for sale"/>
<combo_box name="sale type">
@@ -205,7 +208,7 @@
<check_box label="Mostra nella ricerca" name="search_check" tool_tip="Permetti che l&apos;oggetto sia visibile nella ricerca"/>
<panel name="perms_build">
<text name="perm_modify">
- Puoi modificare questo oggetto
+ Tu puoi modificare questo oggetto
</text>
<text name="Anyone can:">
Chiunque:
@@ -213,11 +216,11 @@
<check_box label="Sposta" name="checkbox allow everyone move"/>
<check_box label="Copia" name="checkbox allow everyone copy"/>
<text name="Next owner can:">
- Prossimo proprietario:
+ Proprietario successivo:
</text>
<check_box label="Modificare" name="checkbox next owner can modify"/>
- <check_box label="Copiare" left_delta="80" name="checkbox next owner can copy"/>
- <check_box label="Transfer" left_delta="67" name="checkbox next owner can transfer" tool_tip="Il prossimo proprietario può regalare o rivendere questo oggetto"/>
+ <check_box label="Copiare" name="checkbox next owner can copy"/>
+ <check_box label="Trasferisci" name="checkbox next owner can transfer" tool_tip="Il prossimo proprietario può regalare o rivendere questo oggetto"/>
<text name="B:">
B:
</text>
@@ -241,7 +244,7 @@
<panel label="Oggetto" name="Object">
<check_box label="Bloccato" name="checkbox locked" tool_tip="Previene lo spostamento o la cancellazione dell&apos;oggetto. Spesso utile mentre si costruisce per evitare involontarie modifiche."/>
<check_box label="Fisico" name="Physical Checkbox Ctrl" tool_tip="Permette all&apos;oggetto di essere spostato e di subire gli effetti della gravità"/>
- <check_box label="Temporaneo" name="Temporary Checkbox Ctrl" tool_tip="Causa la cancellazione dell&apos;oggetto 1 minuto dopo la sua creazione"/>
+ <check_box label="Temporaneo" name="Temporary Checkbox Ctrl" tool_tip="Determina la cancellazione dell&apos;oggetto 1 minuto dopo la sua creazione"/>
<check_box label="Fantasma" name="Phantom Checkbox Ctrl" tool_tip="Rende l&apos;oggetto penetrabile dagli altri oggetti e dagli avatars"/>
<text name="label position">
Posizione (metri)
@@ -281,7 +284,7 @@
<combo_box.item label="Gomma" name="Rubber"/>
</combo_box>
<text name="text cut">
- Riduci una sezione (begin/end)
+ Riduci una sezione (inizio/fine)
</text>
<spinner label="I" name="cut begin"/>
<spinner label="F" name="cut end"/>
@@ -301,7 +304,7 @@
<combo_box.item label="Triangolare" name="Triangle"/>
</combo_box>
<text name="text twist">
- Attorciglia (begin/end)
+ Attorciglia (inizio/fine)
</text>
<spinner label="I" name="Twist Begin"/>
<spinner label="F" name="Twist End"/>
@@ -318,14 +321,14 @@
</text>
<spinner label="X" name="Shear X"/>
<spinner label="Y" name="Shear Y"/>
- <text name="advanced_cut" width="149">
- Riduci un bordo (begin/end)
+ <text name="advanced_cut">
+ Riduci un bordo (inizio/fine)
</text>
<text name="advanced_dimple">
- Fossetta???!!!! (begin/end)
+ Scava (inizio/fine)
</text>
<text name="advanced_slice">
- Taglia???!!! (begin/end)
+ Taglia (inizio/fine)
</text>
<spinner label="I" name="Path Limit Begin"/>
<spinner label="F" name="Path Limit End"/>
@@ -355,29 +358,29 @@
</combo_box>
</panel>
<panel label="Caratteristiche" name="Features">
- <text name="select_single" width="280">
+ <text name="select_single">
Seleziona solo un prim per modificarne le caratteristiche.
</text>
<text name="edit_object">
Modifica le caratteristiche dell&apos;oggetto:
</text>
- <check_box label="Flessibilità" name="Flexible1D Checkbox Ctrl" tool_tip="Permetti all&apos;oggetto di flettersi lungo l&apos;asse Z (Client-side only)"/>
- <spinner label="Morbidezza" label_width="72" name="FlexNumSections" width="135"/>
- <spinner label="Gravità" label_width="72" name="FlexGravity" width="135"/>
- <spinner label="Elasticità" label_width="72" name="FlexFriction" width="135"/>
- <spinner label="Sventolio" label_width="72" name="FlexWind" width="135"/>
- <spinner label="Tensione" label_width="72" name="FlexTension" width="135"/>
- <spinner label="Forza X" label_width="72" name="FlexForceX" width="135"/>
- <spinner label="Forza Y" label_width="72" name="FlexForceY" width="135"/>
- <spinner label="Forza Z" label_width="72" name="FlexForceZ" width="135"/>
+ <check_box label="Flessibilità" name="Flexible1D Checkbox Ctrl" tool_tip="Consenti all&apos;oggetto di flettersi lungo l&apos;asse Z (solo lato client)"/>
+ <spinner label="Morbidezza" name="FlexNumSections"/>
+ <spinner label="Gravità" name="FlexGravity"/>
+ <spinner label="Elasticità" name="FlexFriction"/>
+ <spinner label="Sventolio" name="FlexWind"/>
+ <spinner label="Tensione" name="FlexTension"/>
+ <spinner label="Forza X" name="FlexForceX"/>
+ <spinner label="Forza Y" name="FlexForceY"/>
+ <spinner label="Forza Z" name="FlexForceZ"/>
<check_box label="Luce" name="Light Checkbox Ctrl" tool_tip="Imposta l&apos;oggetto come sorgente di luce"/>
<color_swatch label="" name="colorswatch" tool_tip="Clicca per aprire il selettore dei colori"/>
- <texture_picker label="" name="light texture control" tool_tip="Clicca per scegliere una proiezione dell&apos;immagine (funziona solo con deferred rendering attivato)"/>
- <spinner label="Intensità" label_width="72" name="Light Intensity" width="135"/>
- <spinner label="FOV" name="Light FOV"/>
- <spinner label="Raggio" label_width="72" name="Light Radius" width="135"/>
- <spinner label="Focus" name="Light Focus"/>
- <spinner label="Attenuazione" label_width="72" name="Light Falloff" width="135"/>
+ <texture_picker label="" name="light texture control" tool_tip="Clicca per scegliere un&apos;immagine da proiettare (funziona solo con il rendering differito attivato)"/>
+ <spinner label="Intensità" name="Light Intensity"/>
+ <spinner label="Angolo di vista" name="Light FOV"/>
+ <spinner label="Raggio" name="Light Radius"/>
+ <spinner label="Centro focale" name="Light Focus"/>
+ <spinner label="Attenuazione" name="Light Falloff"/>
<spinner label="Atmosfera" name="Light Ambiance"/>
</panel>
<panel label="Texture" name="Texture">
@@ -395,29 +398,27 @@
<text name="glow label">
Bagliore
</text>
- <check_box bottom_delta="-21" label="Massima
-luminosità" name="checkbox fullbright"/>
+ <check_box label="Massima luminosità" name="checkbox fullbright"/>
<text name="tex gen">
- Applicazione
-della texture
+ Applicazione
</text>
- <combo_box bottom_delta="-38" name="combobox texgen">
+ <combo_box name="combobox texgen">
<combo_box.item label="Default" name="Default"/>
<combo_box.item label="Planare" name="Planar"/>
</combo_box>
- <text bottom="-120" name="label shininess">
+ <text name="label shininess">
Brillantezza
</text>
- <combo_box bottom_delta="-22" name="combobox shininess">
+ <combo_box name="combobox shininess">
<combo_box.item label="Nessuna" name="None"/>
<combo_box.item label="Bassa" name="Low"/>
<combo_box.item label="Media" name="Medium"/>
<combo_box.item label="Alta" name="High"/>
</combo_box>
- <text bottom="-120" name="label bumpiness">
+ <text name="label bumpiness">
Rilievo
</text>
- <combo_box bottom_delta="-22" name="combobox bumpiness" width="100">
+ <combo_box name="combobox bumpiness">
<combo_box.item label="Nessuna" name="None"/>
<combo_box.item label="Luminoso" name="Brightness"/>
<combo_box.item label="Scuro" name="Darkness"/>
@@ -438,32 +439,32 @@ della texture
<combo_box.item label="Trama" name="weave"/>
</combo_box>
<text name="tex scale">
- Ripeti / Lato
+ Ripetizioni / Faccia
</text>
<spinner label="Orizzontale (U)" name="TexScaleU"/>
<check_box label="Inverti" name="checkbox flip s"/>
<spinner label="Verticale (V)" name="TexScaleV"/>
<check_box label="Inverti" name="checkbox flip t"/>
- <spinner label="RotazioneËš" left="120" name="TexRot" width="60"/>
- <spinner label="Ripete / Metri" left="120" name="rptctrl" width="60"/>
- <button label="Applica" label_selected="Applica" left_delta="72" name="button apply"/>
+ <spinner label="RotazioneËš" name="TexRot"/>
+ <spinner label="Ripetizioni / Metro" name="rptctrl"/>
+ <button label="Applica" label_selected="Applica" name="button apply"/>
<text name="tex offset">
- Bilanciamento della Texture
+ Bilanciamento della texture
</text>
<spinner label="Orizzontale (U)" name="TexOffsetU"/>
<spinner label="Verticale (V)" name="TexOffsetV"/>
<panel name="Add_Media">
<text name="media_tex">
- Media
+ Multimediale
</text>
- <button name="add_media" tool_tip="Aggiungi Media"/>
+ <button name="add_media" tool_tip="Aggiungi media"/>
<button name="delete_media" tool_tip="Cancella questa media texture"/>
- <button name="edit_media" tool_tip="Modifica questo Media"/>
- <button label="Alllinea" label_selected="Allinea Media" name="button align" tool_tip="Allinea media texture (must load first)"/>
+ <button name="edit_media" tool_tip="Modifica questo media"/>
+ <button label="Alllinea" label_selected="Allinea media" name="button align" tool_tip="Allinea texture del media (il caricamento deve prima essere completato)"/>
</panel>
</panel>
<panel label="Contenuto" name="Contents">
- <button label="Nuovo Script" label_selected="Nuovo Script" name="button new script"/>
+ <button label="Nuovo Script" label_selected="Nuovo script" name="button new script"/>
<button label="Permessi" name="button permissions"/>
</panel>
</tab_container>
@@ -472,29 +473,22 @@ della texture
Informazioni sul terreno
</text>
<text name="label_area_price">
- Prezzo: L$[PRICE] per [AREA] m²
+ Prezzo: L$ [PRICE] per [AREA] m²
</text>
<text name="label_area">
- Area: [AREA] m²
+ Zona: [AREA] m²
</text>
- <button label="Info sul terreno" label_selected="Info sul terreno" name="button about land" width="156"/>
- <check_box label="Mostra i proprietari" name="checkbox show owners" tool_tip="Colora i terreni in base ai loro proprietari:
-
-Verde = il tuo terreno
-Acqua = la terra del tuo gruppo
-Rosso = posseduta da altri
-Giallo = in vendita
-Viola = in asta
-Grigia = pubblica"/>
+ <button label="Informazioni sui terreni" label_selected="Informazioni sui terreni" name="button about land"/>
+ <check_box label="Mostra i proprietari" name="checkbox show owners" tool_tip="Colora i terreni in base ai loro proprietari: Verde = il tuo terreno Acqua = la terra del tuo gruppo Rosso = posseduta da altri Giallo = in vendita Viola = in asta Grigia = pubblica"/>
<text name="label_parcel_modify">
Modifica il terreno
</text>
- <button label="Suddividi" label_selected="Suddividi" name="button subdivide land" width="156"/>
- <button label="Aderisci" label_selected="Aderisci" name="button join land" width="156"/>
+ <button label="Suddividi" label_selected="Suddividi" name="button subdivide land"/>
+ <button label="Iscriviti" label_selected="Iscriviti" name="button join land"/>
<text name="label_parcel_trans">
- Transazioni del territorio
+ Transazioni terreno
</text>
- <button label="Compra la Terra" label_selected="Compra la Terra" name="button buy land" width="156"/>
- <button label="Abbandona la Terra" label_selected="Abbandona la Terra" name="button abandon land" width="156"/>
+ <button label="Acquista terreno" label_selected="Acquista terreno" name="button buy land"/>
+ <button label="Abbandona il terreno" label_selected="Abbandona il terreno" name="button abandon land"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_top_objects.xml b/indra/newview/skins/default/xui/it/floater_top_objects.xml
index 8f7f3e060a..939c5e83a0 100644
--- a/indra/newview/skins/default/xui/it/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/it/floater_top_objects.xml
@@ -1,58 +1,59 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="top_objects" title="Oggetti principali">
+ <floater.string name="top_scripts_title">
+ Script pesanti
+ </floater.string>
+ <floater.string name="top_scripts_text">
+ [COUNT] script richiedono un totale di [TIME] ms
+ </floater.string>
+ <floater.string name="scripts_score_label">
+ Ora
+ </floater.string>
+ <floater.string name="scripts_mono_time_label">
+ Ora &apos;Mono&apos;
+ </floater.string>
+ <floater.string name="top_colliders_title">
+ Oggetti con maggiori collisioni
+ </floater.string>
+ <floater.string name="top_colliders_text">
+ I [COUNT] oggetti che sperimentano il maggior numero di collisioni
+ </floater.string>
+ <floater.string name="colliders_score_label">
+ Punteggio
+ </floater.string>
+ <floater.string name="none_descriptor">
+ Nulla di rilevato.
+ </floater.string>
<text name="title_text">
In caricamento...
</text>
<scroll_list name="objects_list">
- <column label="Punteggio" name="score" width="84"/>
- <column label="Nome" name="name" width="84"/>
- <column label="Proprietario" name="owner" width="84"/>
- <column label="Ubicazione" name="location" width="84"/>
- <column label="Ora" name="time" width="84"/>
- <column label="Ora (Mono)" name="mono_time" width="84"/>
+ <scroll_list.columns label="Punteggio" name="score" width="84"/>
+ <scroll_list.columns label="Nome" name="name" width="84"/>
+ <scroll_list.columns label="Proprietario" name="owner" width="84"/>
+ <scroll_list.columns label="Ubicazione" name="location" width="84"/>
+ <scroll_list.columns label="Ora" name="time" width="84"/>
+ <scroll_list.columns label="Ora (Mono)" name="mono_time" width="84"/>
+ <scroll_list.columns label="URL" name="URLs"/>
</scroll_list>
- <line_editor font="SansSerifSmall" left="90" name="id_editor" width="280"/>
- <line_editor font="SansSerifSmall" left="90" name="object_name_editor" width="280"/>
- <line_editor font="SansSerifSmall" left="90" name="owner_name_editor" width="280"/>
<text name="id_text">
ID oggetto:
</text>
+ <line_editor font="SansSerifSmall" left="90" name="id_editor" width="280"/>
<button label="Mostra segnali luminosi" name="show_beacon_btn" width="150"/>
<text name="obj_name_text">
Nome dell&apos;oggetto:
</text>
+ <line_editor font="SansSerifSmall" left="90" name="object_name_editor" width="280"/>
<button label="Filtro" name="filter_object_btn" width="150"/>
<text name="owner_name_text">
Proprietario:
</text>
+ <line_editor font="SansSerifSmall" left="90" name="owner_name_editor" width="280"/>
<button label="Filtro" name="filter_owner_btn" width="150"/>
+ <button label="Aggiorna" name="refresh_btn" width="150"/>
<button label="Restituisci selezionato" name="return_selected_btn" width="150"/>
<button label="Restituisci tutti" left="170" name="return_all_btn"/>
<button label="Disabilita selezionato" name="disable_selected_btn" width="150"/>
<button label="Disabilita per tutti" left="170" name="disable_all_btn"/>
- <button label="Aggiorna" name="refresh_btn" width="150"/>
- <string name="top_scripts_title">
- Script pesanti
- </string>
- <string name="top_scripts_text">
- [COUNT] script richiedono un totale di [TIME] ms
- </string>
- <string name="scripts_score_label">
- Ora
- </string>
- <string name="scripts_mono_time_label">
- Ora &apos;Mono&apos;
- </string>
- <string name="top_colliders_title">
- Oggetti con maggiori collisioni
- </string>
- <string name="top_colliders_text">
- I [COUNT] oggetti che sperimentano il maggior numero di collisioni
- </string>
- <string name="colliders_score_label">
- Punteggio
- </string>
- <string name="none_descriptor">
- Nulla di rilevato.
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_tos.xml b/indra/newview/skins/default/xui/it/floater_tos.xml
index f3f8072f56..28a2dfdda2 100644
--- a/indra/newview/skins/default/xui/it/floater_tos.xml
+++ b/indra/newview/skins/default/xui/it/floater_tos.xml
@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="modal container" title="">
+ <floater.string name="real_url">
+ http://secondlife.com/app/tos/
+ </floater.string>
+ <floater.string name="loading_url">
+ data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Caricamento in corso %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+ </floater.string>
<button label="Continua" label_selected="Continua" name="Continue"/>
<button label="Annulla" label_selected="Annulla" name="Cancel"/>
- <check_box label="Accetto i Termini di Servizio" name="agree_chk"/>
+ <check_box label="Accetto i Termini del servizio e le Regole sulla privacy" name="agree_chk"/>
<text name="tos_heading">
- Per favore leggi attentamente i seguenti Termini di Servizio. Per continuare il log in [SECOND_LIFE], devi accettare le condizioni.
+ Sei pregato di leggere attentamente i Termini del servizio e le Regole sulla privacy di seguito. Per continuare l&apos;accesso a [SECOND_LIFE], devi accettare le condizioni.
</text>
- <text_editor name="tos_text">
- TOS_TEXT
- </text_editor>
- <string name="real_url">
- http://secondlife.com/app/tos/
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_voice_controls.xml b/indra/newview/skins/default/xui/it/floater_voice_controls.xml
index e4c54d44eb..d2fd462062 100644
--- a/indra/newview/skins/default/xui/it/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/it/floater_voice_controls.xml
@@ -1,25 +1,28 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_voice_controls" title="Controlli del Voice">
+<floater name="floater_voice_controls" title="Regolazione voce">
<string name="title_nearby">
- VOICE NEI DINTORNI
+ VOCE NEI DINTORNI
</string>
<string name="title_group">
- Chiamata di Gruppo con [GROUP]
+ Chiamata di gruppo con [GROUP]
</string>
<string name="title_adhoc">
- Conference Call
+ Chiamata in conferenza
</string>
<string name="title_peer_2_peer">
- Chiama con [NAME]
+ Chiamata con [NAME]
</string>
<string name="no_one_near">
- Nessuno vicino
+ Nessuno nei dintorni ha attivato la funzione voce
</string>
- <panel name="control_panel">
- <layout_stack>
- <layout_panel name="leave_btn_panel">
- <button label="Chiudi Chiamata" name="leave_call_btn"/>
+ <layout_stack name="my_call_stack">
+ <layout_panel name="my_panel">
+ <text name="user_text" value="Il mio avatar:"/>
+ </layout_panel>
+ <layout_stack name="voice_effect_and_leave_call_stack">
+ <layout_panel name="leave_call_btn_panel">
+ <button label="Abbandona chiamata" name="leave_call_btn"/>
</layout_panel>
</layout_stack>
- </panel>
+ </layout_stack>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_voice_effect.xml b/indra/newview/skins/default/xui/it/floater_voice_effect.xml
new file mode 100644
index 0000000000..202be752c9
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_voice_effect.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="Luoghi" name="voice_effects" title="ANTEPRIMA MANIPOLAZIONE VOCE">
+ <string name="no_voice_effect">
+ (Nessuna manipolazione voce)
+ </string>
+ <string name="active_voice_effect">
+ (Attivato)
+ </string>
+ <string name="unsubscribed_voice_effect">
+ (Iscrizione annullata)
+ </string>
+ <string name="new_voice_effect">
+ (Nuovo!)
+ </string>
+ <text name="status_text">
+ Per ascoltare un&apos;anteprima degli effetti di manipolazione della voce, clicca sul pulsante Registra per registrare un campione di voce, quindi fai clic su uno degli effetti per ascoltare il risultato.
+
+Per ricollegarti alla voce nei dintorni, chiudi la finestra.
+ </text>
+ <button label="Registra campione" name="record_btn" tool_tip="Registra un campione della tua voce."/>
+ <button label="Ferma" name="record_stop_btn"/>
+ <text name="voice_morphing_link">
+ [[URL] Ottieni manipolazione voce]
+ </text>
+ <scroll_list name="voice_effect_list" tool_tip="Registra un campione della tua voce, quindi fai clic su uno degli effetti per un&apos;anteprima del risultato.">
+ <scroll_list.columns label="Manipolazione voce" name="name"/>
+ <scroll_list.columns label="Scade il" name="expires"/>
+ </scroll_list>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_water.xml b/indra/newview/skins/default/xui/it/floater_water.xml
index d2849440d6..c6ab646fbf 100644
--- a/indra/newview/skins/default/xui/it/floater_water.xml
+++ b/indra/newview/skins/default/xui/it/floater_water.xml
@@ -8,7 +8,7 @@
<button label="Salva" label_selected="Salva" name="WaterSavePreset"/>
<button label="Cancella" label_selected="Cancella" name="WaterDeletePreset"/>
<tab_container name="Water Tabs">
- <panel label="Impostazioni" name="Settings">
+ <panel label="IMPOSTAZIONI" name="Settings">
<text name="BHText">
Colore della nebbiosità dell&apos;acqua
</text>
@@ -62,7 +62,7 @@
</text>
<button label="?" left="650" name="WaterBlurMultiplierHelp"/>
</panel>
- <panel label="Immagine" name="Waves">
+ <panel label="IMMAGINE" name="Waves">
<text name="BHText">
Direzione della grande onda
</text>
diff --git a/indra/newview/skins/default/xui/it/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/it/floater_wearable_save_as.xml
index dcb7620bd5..7c3754f004 100644
--- a/indra/newview/skins/default/xui/it/floater_wearable_save_as.xml
+++ b/indra/newview/skins/default/xui/it/floater_wearable_save_as.xml
@@ -3,7 +3,7 @@
<button label="Salva" label_selected="Salva" name="Save"/>
<button label="Annulla" label_selected="Annulla" name="Cancel"/>
<text name="Save item as:">
- Salva oggetto come:
+ Salva oggetto nel mio inventario come:
</text>
<line_editor name="name ed">
Nuovo [DESC]
diff --git a/indra/newview/skins/default/xui/it/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/it/floater_whitelist_entry.xml
index 6d68db058d..9abc968b94 100644
--- a/indra/newview/skins/default/xui/it/floater_whitelist_entry.xml
+++ b/indra/newview/skins/default/xui/it/floater_whitelist_entry.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="whitelist_entry">
+<floater name="whitelist_entry" title="VOCE DELLA LISTA BIANCA">
<text name="media_label">
Inserisci un URL o una configurazione URL da aggiungere alla lista dei domini permessi
</text>
<line_editor name="whitelist_entry" tool_tip="Inserisci un URL o una configurazione URL alla lista bianca"/>
<button label="OK" name="ok_btn"/>
- <button label="Cancella" name="cancel_btn"/>
+ <button label="Annulla" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_windlight_options.xml b/indra/newview/skins/default/xui/it/floater_windlight_options.xml
index e86d656e39..1f6f0fab58 100644
--- a/indra/newview/skins/default/xui/it/floater_windlight_options.xml
+++ b/indra/newview/skins/default/xui/it/floater_windlight_options.xml
@@ -4,15 +4,15 @@
Cieli predefiniti:
</text>
<button label="Nuovo" label_selected="Nuovo" name="WLNewPreset"/>
- <button label="Salva" label_selected="Salva" name="WLSavePreset" left_delta="72"/>
- <button label="Elimina" label_selected="Elimina" name="WLDeletePreset" left_delta="72"/>
- <button font="SansSerifSmall" width="165" left_delta="85" label="Editor del ciclo giorno/notte" label_selected="Editor del ciclo giorno/notte" name="WLDayCycleMenuButton"/>
+ <button label="Salva" label_selected="Salva" left_delta="72" name="WLSavePreset"/>
+ <button label="Elimina" label_selected="Elimina" left_delta="72" name="WLDeletePreset"/>
+ <button font="SansSerifSmall" label="Editor del ciclo giorno/notte" label_selected="Editor del ciclo giorno/notte" left_delta="85" name="WLDayCycleMenuButton" width="165"/>
<tab_container name="WindLight Tabs">
- <panel label="Atmosfera" name="Atmosphere">
+ <panel label="ATMOSFERA" name="Atmosphere">
<text name="BHText">
Blu dell&apos;Orizzonte
</text>
- <button label="?" name="WLBlueHorizonHelp" left="189"/>
+ <button label="?" left="189" name="WLBlueHorizonHelp"/>
<text name="BHText2">
R
</text>
@@ -25,14 +25,14 @@
<text name="BHText5">
I
</text>
- <text name="BDensText" font="SansSerifSmall">
+ <text font="SansSerifSmall" name="BDensText">
Altezza della Foschia all&apos;Orizzonte
</text>
- <button label="?" name="WLHazeHorizonHelp" left="189" />
+ <button label="?" left="189" name="WLHazeHorizonHelp"/>
<text name="BDensText2">
Densità del Blu
</text>
- <button label="?" name="WLBlueDensityHelp" />
+ <button label="?" name="WLBlueDensityHelp"/>
<text name="BHText6">
R
</text>
@@ -52,17 +52,17 @@
<text name="DensMultText">
Moltiplicatore di Densità
</text>
- <button label="?" name="WLDensityMultHelp" left="645"/>
+ <button label="?" left="645" name="WLDensityMultHelp"/>
<text name="WLDistanceMultText">
Moltiplicatore della Distanza
</text>
- <button label="?" name="WLDistanceMultHelp" left="645"/>
+ <button label="?" left="645" name="WLDistanceMultHelp"/>
<text name="MaxAltText">
Altitudine Massima
</text>
- <button label="?" name="WLMaxAltitudeHelp" left="645"/>
+ <button label="?" left="645" name="WLMaxAltitudeHelp"/>
</panel>
- <panel label="Illuminazione" name="Lighting">
+ <panel label="ILLUMINAZIONE" name="Lighting">
<text name="SLCText">
Colore Sole/Luna
</text>
@@ -118,7 +118,7 @@
</text>
<button label="?" name="WLStarBrightnessHelp"/>
</panel>
- <panel label="Nuvole" name="Clouds">
+ <panel label="NUVOLE" name="Clouds">
<text name="WLCloudColorText">
Colore delle Nuvole
</text>
@@ -151,15 +151,15 @@
<text name="WLCloudCoverageText">
Copertura delle Nuvole
</text>
- <button label="?" name="WLCloudCoverageHelp" left="415"/>
+ <button label="?" left="415" name="WLCloudCoverageHelp"/>
<text name="WLCloudScaleText">
Altitudine delle Nuvole
</text>
- <button label="?" name="WLCloudScaleHelp" left="415"/>
+ <button label="?" left="415" name="WLCloudScaleHelp"/>
<text name="WLCloudDetailText">
Dettagli Nuvole (XY/ Densità)
</text>
- <button label="?" name="WLCloudDetailHelp" left="415"/>
+ <button label="?" left="415" name="WLCloudDetailHelp"/>
<text name="BHText8">
X
</text>
@@ -180,7 +180,7 @@
<button label="?" name="WLCloudScrollYHelp"/>
<check_box label="Blocca" name="WLCloudLockY"/>
<check_box label="Mostra le Nuvole Classiche" name="DrawClassicClouds"/>
- <button label="?" name="WLClassicCloudsHelp" left="645"/>
+ <button label="?" left="645" name="WLClassicCloudsHelp"/>
</panel>
</tab_container>
<string name="WLDefaultSkyNames">
diff --git a/indra/newview/skins/default/xui/it/floater_window_size.xml b/indra/newview/skins/default/xui/it/floater_window_size.xml
new file mode 100644
index 0000000000..036b74b7d9
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/floater_window_size.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="window_size" title="DIMENSIONE FINESTRA">
+ <string name="resolution_format">
+ [RES_X] x [RES_Y]
+ </string>
+ <text name="windowsize_text">
+ Imposta dimensione finestra:
+ </text>
+ <combo_box name="window_size_combo" tool_tip="larghezza x altezza">
+ <combo_box.item label="1000 x 700 (default)" name="item0"/>
+ <combo_box.item label="1024 x 768" name="item1"/>
+ <combo_box.item label="1280 x 720 (720p)" name="item2"/>
+ <combo_box.item label="1920 x 1080 (1080p)" name="item3"/>
+ </combo_box>
+ <button label="Imposta" name="set_btn"/>
+ <button label="Annulla" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/it/floater_world_map.xml b/indra/newview/skins/default/xui/it/floater_world_map.xml
index a672df0d96..b07daac6fb 100644
--- a/indra/newview/skins/default/xui/it/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/it/floater_world_map.xml
@@ -5,66 +5,66 @@
Legenda
</text>
</panel>
- <panel>
- <button font="SansSerifSmall" label="Mostra la mia posizione" label_selected="Mostra la mia posizione" left_delta="91" name="Show My Location" tool_tip="Centra la mappa sul luogo dove si trova il mio avatar" width="135"/>
- <text name="person_label">
+ <panel name="layout_panel_2">
+ <button name="Show My Location" tool_tip="Centra la mappa sulla posizione del mio avatar"/>
+ <text name="me_label">
Io
</text>
- <check_box label="Residenti" name="people_chk"/>
- <check_box label="Punto informativo" name="infohub_chk"/>
+ <text name="person_label">
+ Persona
+ </text>
<text name="infohub_label">
Infohub
</text>
- <check_box bottom="-170" label="Terra in vendita" name="land_for_sale_chk"/>
- <icon bottom="-170" name="landforsale"/>
<text name="land_sale_label">
- Vendita di terra
+ Vendita terreno
+ </text>
+ <text name="by_owner_label">
+ da parte del proprietario
</text>
<text name="auction_label">
- per conto del proprietario
+ asta di terreni
</text>
- <button label="Vai a Casa" label_selected="Vai a Casa" name="Go Home" tool_tip="Teleport a casa mia"/>
+ <button name="Go Home" tool_tip="Teleport a casa"/>
<text name="Home_label">
- Casa
+ Home
</text>
<text name="events_label">
Eventi:
</text>
- <check_box label="PG" name="event_chk"/>
- <check_box initial_value="true" label="Mature" name="event_mature_chk"/>
+ <text name="pg_label">
+ Generale
+ </text>
+ <check_box name="event_mature_chk"/>
<text name="mature_label">
- Mature
+ Moderato
+ </text>
+ <text name="adult_label">
+ Adulto
</text>
- <check_box label="Adult" name="event_adult_chk"/>
</panel>
- <panel>
+ <panel name="layout_panel_3">
<text name="find_on_map_label">
- Trova sulla Mappa
+ Trova sulla mappa
</text>
</panel>
- <panel>
- <combo_box label="Amici Online" name="friend combo" tool_tip="Mostra amici sulla mappa">
- <combo_box.item label="Miei Amici Online" name="item1"/>
+ <panel name="layout_panel_4">
+ <combo_box label="Amici online" name="friend combo" tool_tip="Mostra amici sulla mappa">
+ <combo_box.item label="I miei amici online" name="item1"/>
</combo_box>
- <combo_box label="Miei Landmarks" name="landmark combo" tool_tip="Landmark da mostrare sulla mappa">
- <combo_box.item label="Miei Landmarks" name="item1"/>
+ <combo_box label="I miei punti di riferimento" name="landmark combo" tool_tip="Punto di riferimento da mostrare sulla mappa">
+ <combo_box.item label="I miei punti di riferimento" name="item1"/>
</combo_box>
- <search_editor label="Regione per nome" name="location" tool_tip="Scrivi il nome di una regione"/>
- <button label="Trova" name="DoSearch" tool_tip="Cerca regione"/>
- <scroll_list bottom_delta="-310" height="304" name="search_results">
- <scroll_list.columns label="" name="icon"/>
- <scroll_list.columns label="" name="sim_name"/>
- </scroll_list>
- <button font="SansSerifSmall" label="Teletrasporto" label_selected="Teletrasporto" name="Teleport" tool_tip="Teletrasporto al luogo prescelto"/>
- <button font="SansSerifSmall" label="Copia SLurl" name="copy_slurl" tool_tip="Copia il luogo attuale come SLurl per essere usato nel web."/>
- <button font="SansSerifSmall" label="Mostra Selezione" label_selected="Mostra destinazione" left_delta="91" name="Show Destination" tool_tip="Centra la mappa sul luogo prescelto" width="135"/>
+ <search_editor label="Regioni secondo il nome" name="location" tool_tip="Digita il nome di una regione"/>
+ <button label="Trova" name="DoSearch" tool_tip="Cerca la regione"/>
+ <button name="Clear" tool_tip="Elimina le linee di monitoraggio e reimposta la mappa"/>
+ <button label="Teleport" name="Teleport" tool_tip="Teleport al luogo selezionato"/>
+ <button label="Copia SLurl" name="copy_slurl" tool_tip="Copia la posizione attuale come un SLurl da usare nel Web."/>
+ <button label="Mostra la selezione" name="Show Destination" tool_tip="Centra la mappa sul luogo selezionato"/>
</panel>
- <panel>
+ <panel name="layout_panel_5">
<text name="zoom_label">
- Zoom
+ Ingrandisci
</text>
</panel>
- <panel>
- <slider label="Zoom" name="zoom slider"/>
- </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/it/inspect_avatar.xml b/indra/newview/skins/default/xui/it/inspect_avatar.xml
index 61f7a69234..ec5561a5b2 100644
--- a/indra/newview/skins/default/xui/it/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/it/inspect_avatar.xml
@@ -5,17 +5,17 @@
-->
<floater name="inspect_avatar">
<string name="Subtitle">
- [ETA&apos;]
+ [AGE]
</string>
<string name="Details">
- [PROFILO_SL]
+ [SL_PROFILE]
</string>
- <slider name="volume_slider" tool_tip="Volume del Voice" value="0.5"/>
- <button label="Aggiungi Amico" name="add_friend_btn"/>
+ <slider name="volume_slider" tool_tip="Volume voce" value="0.5"/>
+ <button label="Aggiungi amico" name="add_friend_btn"/>
<button label="IM" name="im_btn"/>
- <button label="Di più" name="view_profile_btn"/>
+ <button label="Profilo" name="view_profile_btn"/>
<panel name="moderator_panel">
- <button label="Disattiva il Voice" name="disable_voice"/>
- <button label="Attiva Voice" name="enable_voice"/>
+ <button label="Disattiva voce" name="disable_voice"/>
+ <button label="Attiva voce" name="enable_voice"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/it/inspect_group.xml b/indra/newview/skins/default/xui/it/inspect_group.xml
index d7b86fdbcb..2416f4bb12 100644
--- a/indra/newview/skins/default/xui/it/inspect_group.xml
+++ b/indra/newview/skins/default/xui/it/inspect_group.xml
@@ -5,18 +5,18 @@
-->
<floater name="inspect_group">
<string name="PrivateGroup">
- Gruppo Privato
+ Gruppo privato
</string>
<string name="FreeToJoin">
Adesione libera
</string>
<string name="CostToJoin">
- L$[AMOUNT] per aderire
+ L$ [AMOUNT] per aderire
</string>
<string name="YouAreMember">
- Tu sei un Membro
+ Tu sei un iscritto
</string>
- <button label="Aderire" name="join_btn"/>
- <button label="Abbandona" name="leave_btn"/>
- <button label="Vedi Profilo" name="view_profile_btn"/>
+ <button label="Iscriviti" name="join_btn"/>
+ <button label="Chiudi" name="leave_btn"/>
+ <button label="Vedi profilo" name="view_profile_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/inspect_object.xml b/indra/newview/skins/default/xui/it/inspect_object.xml
index 7e6d195cb1..d8ab10cfda 100644
--- a/indra/newview/skins/default/xui/it/inspect_object.xml
+++ b/indra/newview/skins/default/xui/it/inspect_object.xml
@@ -9,10 +9,10 @@
</string>
<string name="CreatorAndOwner">
Di [CREATOR]
-owner [OWNER]
+Proprietario [OWNER]
</string>
<string name="Price">
- L$[AMOUNT]
+ L$ [AMOUNT]
</string>
<string name="PriceFree">
Gratis!
@@ -21,14 +21,21 @@ owner [OWNER]
Tocca
</string>
<string name="Sit">
- Siedi
+ Siediti
</string>
- <button label="Compra" name="buy_btn"/>
+ <text name="object_name" value="Nome oggetto di prova che si trova su due righe ed è molto lungo"/>
+ <text name="price_text">
+ L$ 30.000
+ </text>
+ <text name="object_description">
+ Questa è una descrizione di un oggetto che è molto lunga ed è di almeno 80 caratteri, ma potrebbe essere di 120 caratteri a questo punto. Chi lo sa veramente?
+ </text>
+ <button label="Acquista" name="buy_btn"/>
<button label="Paga" name="pay_btn"/>
- <button label="Fai una Copia" name="take_free_copy_btn"/>
+ <button label="Prendi copia" name="take_free_copy_btn"/>
<button label="Tocca" name="touch_btn"/>
- <button label="Siedi" name="sit_btn"/>
+ <button label="Siediti" name="sit_btn"/>
<button label="Apri" name="open_btn"/>
- <icon name="secure_browsing" tool_tip="Secure Browsing"/>
- <button label="Ulteriore" name="more_info_btn"/>
+ <icon name="secure_browsing" tool_tip="Browsing sicuro"/>
+ <button label="Altro" name="more_info_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/inspect_remote_object.xml b/indra/newview/skins/default/xui/it/inspect_remote_object.xml
index 9fabe2ca0b..b2d96ad757 100644
--- a/indra/newview/skins/default/xui/it/inspect_remote_object.xml
+++ b/indra/newview/skins/default/xui/it/inspect_remote_object.xml
@@ -8,6 +8,6 @@
Proprietario:
</text>
<button label="Mappa" name="map_btn"/>
- <button label="Bloccare" name="block_btn"/>
+ <button label="Blocca" name="block_btn"/>
<button label="Chiudi" name="close_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/it/language_settings.xml b/indra/newview/skins/default/xui/it/language_settings.xml
index 71418d446a..82cf789a6b 100644
--- a/indra/newview/skins/default/xui/it/language_settings.xml
+++ b/indra/newview/skins/default/xui/it/language_settings.xml
@@ -3,9 +3,9 @@
<strings>
<!-- Locale Information -->
- <string name="MicrosoftLocale">english</string>
- <string name="DarwinLocale">C</string>
- <string name="LinuxLocale">C</string>
+ <string name="MicrosoftLocale">italian</string>
+ <string name="DarwinLocale">it_IT.UTF-8</string>
+ <string name="LinuxLocale">it_IT.UTF-8</string>
<!--
datetimeToCodes["wkday"] = "%a"; // Thu
diff --git a/indra/newview/skins/default/xui/it/menu_attachment_other.xml b/indra/newview/skins/default/xui/it/menu_attachment_other.xml
index ff068b90a5..d4d6fd68d0 100644
--- a/indra/newview/skins/default/xui/it/menu_attachment_other.xml
+++ b/indra/newview/skins/default/xui/it/menu_attachment_other.xml
@@ -2,16 +2,16 @@
<!-- *NOTE: See also menu_avatar_other.xml -->
<context_menu name="Avatar Pie">
<menu_item_call label="Vedi profilo" name="Profile..."/>
- <menu_item_call label="Chiedi amicizia" name="Add Friend"/>
+ <menu_item_call label="Aggiungi amico" name="Add Friend"/>
<menu_item_call label="IM" name="Send IM..."/>
<menu_item_call label="Chiama" name="Call"/>
- <menu_item_call label="Invita nel gruppo" name="Invite..."/>
+ <menu_item_call label="Invita al gruppo" name="Invite..."/>
<menu_item_call label="Blocca" name="Avatar Mute"/>
- <menu_item_call label="Denuncia" name="abuse"/>
+ <menu_item_call label="Segnala" name="abuse"/>
<menu_item_call label="Congela" name="Freeze..."/>
<menu_item_call label="Espelli" name="Eject..."/>
- <menu_item_call label="Debug" name="Debug..."/>
- <menu_item_call label="Avvicinati" name="Zoom In"/>
+ <menu_item_call label="Debug delle texture" name="Debug..."/>
+ <menu_item_call label="Zoom avanti" name="Zoom In"/>
<menu_item_call label="Paga" name="Pay..."/>
- <menu_item_call label="Profilo oggetto" name="Object Inspect"/>
+ <menu_item_call label="Profilo dell&apos;oggetto" name="Object Inspect"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_attachment_self.xml b/indra/newview/skins/default/xui/it/menu_attachment_self.xml
index 9711b5918a..c480a2fe0e 100644
--- a/indra/newview/skins/default/xui/it/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/it/menu_attachment_self.xml
@@ -5,8 +5,9 @@
<menu_item_call label="Stacca" name="Detach"/>
<menu_item_call label="Lascia" name="Drop"/>
<menu_item_call label="Alzati" name="Stand Up"/>
- <menu_item_call label="Il mio aspetto fisico" name="Appearance..."/>
- <menu_item_call label="I miei amici" name="Friends..."/>
+ <menu_item_call label="Cambia vestiario" name="Change Outfit"/>
+ <menu_item_call label="I miei amici..." name="Friends..."/>
<menu_item_call label="I miei gruppi" name="Groups..."/>
<menu_item_call label="Il mio profilo" name="Profile..."/>
+ <menu_item_call label="Debug delle texture" name="Debug..."/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_avatar_icon.xml b/indra/newview/skins/default/xui/it/menu_avatar_icon.xml
index 522c7ab4e6..b93b695300 100644
--- a/indra/newview/skins/default/xui/it/menu_avatar_icon.xml
+++ b/indra/newview/skins/default/xui/it/menu_avatar_icon.xml
@@ -2,6 +2,6 @@
<menu name="Avatar Icon Menu">
<menu_item_call label="Vedi profilo" name="Show Profile"/>
<menu_item_call label="Manda IM..." name="Send IM"/>
- <menu_item_call label="Chiedi amicizia..." name="Add Friend"/>
+ <menu_item_call label="Aggiungi come amico..." name="Add Friend"/>
<menu_item_call label="Togli amicizia..." name="Remove Friend"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_avatar_other.xml b/indra/newview/skins/default/xui/it/menu_avatar_other.xml
index a435fcd311..c2edc32a49 100644
--- a/indra/newview/skins/default/xui/it/menu_avatar_other.xml
+++ b/indra/newview/skins/default/xui/it/menu_avatar_other.xml
@@ -2,15 +2,15 @@
<!-- *NOTE: See also menu_attachment_other.xml -->
<context_menu name="Avatar Pie">
<menu_item_call label="Vedi profilo" name="Profile..."/>
- <menu_item_call label="Chiedi amicizia" name="Add Friend"/>
+ <menu_item_call label="Aggiungi amico" name="Add Friend"/>
<menu_item_call label="IM" name="Send IM..."/>
<menu_item_call label="Chiama" name="Call"/>
- <menu_item_call label="Invita nel gruppo" name="Invite..."/>
+ <menu_item_call label="Invita al gruppo" name="Invite..."/>
<menu_item_call label="Blocca" name="Avatar Mute"/>
- <menu_item_call label="Denuncia" name="abuse"/>
+ <menu_item_call label="Segnala" name="abuse"/>
<menu_item_call label="Congela" name="Freeze..."/>
<menu_item_call label="Espelli" name="Eject..."/>
- <menu_item_call label="Debug" name="Debug..."/>
- <menu_item_call label="Avvicinati" name="Zoom In"/>
+ <menu_item_call label="Debug delle texture" name="Debug..."/>
+ <menu_item_call label="Zoom avanti" name="Zoom In"/>
<menu_item_call label="Paga" name="Pay..."/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_avatar_self.xml b/indra/newview/skins/default/xui/it/menu_avatar_self.xml
index b7a9f8efbe..7796d41286 100644
--- a/indra/newview/skins/default/xui/it/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/it/menu_avatar_self.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Self Pie">
<menu_item_call label="Alzati" name="Stand Up"/>
- <context_menu label="Vola &gt;" name="Take Off &gt;">
- <context_menu label="Abiti &gt;" name="Clothes &gt;">
- <menu_item_call label="Gonna" name="Shirt"/>
+ <context_menu label="Togli â–¶" name="Take Off &gt;">
+ <context_menu label="Abiti â–¶" name="Clothes &gt;">
+ <menu_item_call label="Camicia" name="Shirt"/>
<menu_item_call label="Pantaloni" name="Pants"/>
<menu_item_call label="Gonna" name="Skirt"/>
<menu_item_call label="Scarpe" name="Shoes"/>
@@ -13,15 +13,18 @@
<menu_item_call label="Maglietta intima" name="Self Undershirt"/>
<menu_item_call label="Slip" name="Self Underpants"/>
<menu_item_call label="Tatuaggio" name="Self Tattoo"/>
- <menu_item_call label="Alfa (trasparenza)" name="Self Alpha"/>
+ <menu_item_call label="Alpha (Trasparenza)" name="Self Alpha"/>
<menu_item_call label="Tutti gli abiti" name="All Clothes"/>
</context_menu>
- <context_menu label="HUD &gt;" name="Object Detach HUD"/>
- <context_menu label="Stacca &gt;" name="Object Detach"/>
+ <context_menu label="HUD â–¶" name="Object Detach HUD"/>
+ <context_menu label="Stacca â–¶" name="Object Detach"/>
<menu_item_call label="Stacca tutto" name="Detach All"/>
</context_menu>
- <menu_item_call label="Il mio aspetto fisico" name="Appearance..."/>
- <menu_item_call label="I miei amici" name="Friends..."/>
+ <menu_item_call label="Cambia vestiario" name="Chenge Outfit"/>
+ <menu_item_call label="Modifica il mio vestiario" name="Edit Outfit"/>
+ <menu_item_call label="Modifica la figura corporea" name="Edit My Shape"/>
+ <menu_item_call label="I miei amici..." name="Friends..."/>
<menu_item_call label="I miei gruppi" name="Groups..."/>
<menu_item_call label="Il mio profilo" name="Profile..."/>
+ <menu_item_call label="Debug delle texture" name="Debug..."/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_bottomtray.xml b/indra/newview/skins/default/xui/it/menu_bottomtray.xml
index 185cf75183..8ca5b24b48 100644
--- a/indra/newview/skins/default/xui/it/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/it/menu_bottomtray.xml
@@ -2,11 +2,16 @@
<menu name="hide_camera_move_controls_menu">
<menu_item_check label="Tasto Gesture" name="ShowGestureButton"/>
<menu_item_check label="Tasto Movimento" name="ShowMoveButton"/>
- <menu_item_check label="Tasto Camera" name="ShowCameraButton"/>
- <menu_item_check label="Tasto Snapshot" name="ShowSnapshotButton"/>
+ <menu_item_check label="Tasto Visuale" name="ShowCameraButton"/>
+ <menu_item_check label="Tasto Foto" name="ShowSnapshotButton"/>
+ <menu_item_check label="Pulsante barra laterale" name="ShowSidebarButton"/>
+ <menu_item_check label="Pulsante Costruisci" name="ShowBuildButton"/>
+ <menu_item_check label="Pulsante Cerca" name="ShowSearchButton"/>
+ <menu_item_check label="Pulsante Mappa" name="ShowWorldMapButton"/>
+ <menu_item_check label="Pulsante Mini mappa" name="ShowMiniMapButton"/>
<menu_item_call label="Taglia" name="NearbyChatBar_Cut"/>
<menu_item_call label="Copia" name="NearbyChatBar_Copy"/>
<menu_item_call label="Incolla" name="NearbyChatBar_Paste"/>
- <menu_item_call label="Cancella" name="NearbyChatBar_Delete"/>
- <menu_item_call label="Seleziona Tutto" name="NearbyChatBar_Select_All"/>
+ <menu_item_call label="Elimina" name="NearbyChatBar_Delete"/>
+ <menu_item_call label="Seleziona tutto" name="NearbyChatBar_Select_All"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_cof_attachment.xml b/indra/newview/skins/default/xui/it/menu_cof_attachment.xml
new file mode 100644
index 0000000000..699490c8f1
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_cof_attachment.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Attachment">
+ <menu_item_call label="Stacca" name="detach"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_cof_body_part.xml b/indra/newview/skins/default/xui/it/menu_cof_body_part.xml
new file mode 100644
index 0000000000..1e3658ef45
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_cof_body_part.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Body">
+ <menu_item_call label="Sostituisci" name="replace"/>
+ <menu_item_call label="Modifica" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_cof_clothing.xml b/indra/newview/skins/default/xui/it/menu_cof_clothing.xml
new file mode 100644
index 0000000000..5b4f8c0642
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_cof_clothing.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Clothing">
+ <menu_item_call label="Togli" name="take_off"/>
+ <menu_item_call label="Un livello in alto" name="move_up"/>
+ <menu_item_call label="Un livello in basso" name="move_down"/>
+ <menu_item_call label="Modifica" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_cof_gear.xml b/indra/newview/skins/default/xui/it/menu_cof_gear.xml
new file mode 100644
index 0000000000..10524ba92d
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_cof_gear.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Gear COF">
+ <menu label="Nuovi abiti" name="COF.Gear.New_Clothes"/>
+ <menu label="Nuove parti del corpo" name="COF.Geear.New_Body_Parts"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_edit.xml b/indra/newview/skins/default/xui/it/menu_edit.xml
new file mode 100644
index 0000000000..ffb20a02e9
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_edit.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu label="Modifica" name="Edit">
+ <menu_item_call label="Annulla" name="Undo"/>
+ <menu_item_call label="Ripeti" name="Redo"/>
+ <menu_item_call label="Taglia" name="Cut"/>
+ <menu_item_call label="Copia" name="Copy"/>
+ <menu_item_call label="Incolla" name="Paste"/>
+ <menu_item_call label="Elimina" name="Delete"/>
+ <menu_item_call label="Duplica" name="Duplicate"/>
+ <menu_item_call label="Seleziona tutto" name="Select All"/>
+ <menu_item_call label="Deseleziona" name="Deselect"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_favorites.xml b/indra/newview/skins/default/xui/it/menu_favorites.xml
index 9c4966d198..7813ef44b5 100644
--- a/indra/newview/skins/default/xui/it/menu_favorites.xml
+++ b/indra/newview/skins/default/xui/it/menu_favorites.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
<menu_item_call label="Teleport" name="Teleport To Landmark"/>
- <menu_item_call label="Vedi/Modifica Landmark" name="Landmark Open"/>
+ <menu_item_call label="Vedi/Modifica punto di riferimento" name="Landmark Open"/>
<menu_item_call label="Copia SLurl" name="Copy slurl"/>
<menu_item_call label="Mostra sulla mappa" name="Show On Map"/>
<menu_item_call label="Copia" name="Landmark Copy"/>
<menu_item_call label="Incolla" name="Landmark Paste"/>
- <menu_item_call label="Cancella" name="Delete"/>
+ <menu_item_call label="Elimina" name="Delete"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_gesture_gear.xml b/indra/newview/skins/default/xui/it/menu_gesture_gear.xml
index c4f9d21d14..7cfcc6287e 100644
--- a/indra/newview/skins/default/xui/it/menu_gesture_gear.xml
+++ b/indra/newview/skins/default/xui/it/menu_gesture_gear.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_gesture_gear">
- <menu_item_call label="Aggiungi/Cancella dai favoriti" name="activate"/>
+ <menu_item_call label="Aggiungi/Rimuovi dai preferiti" name="activate"/>
<menu_item_call label="Copia" name="copy_gesture"/>
<menu_item_call label="Incolla" name="paste"/>
<menu_item_call label="Copia UUID" name="copy_uuid"/>
- <menu_item_call label="Salva outfit" name="save_to_outfit"/>
+ <menu_item_call label="Salva vestiario" name="save_to_outfit"/>
<menu_item_call label="Modifica" name="edit_gesture"/>
<menu_item_call label="Ispeziona" name="inspect"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_group_plus.xml b/indra/newview/skins/default/xui/it/menu_group_plus.xml
index 6b7692a067..3b76fb94a9 100644
--- a/indra/newview/skins/default/xui/it/menu_group_plus.xml
+++ b/indra/newview/skins/default/xui/it/menu_group_plus.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_group_plus">
- <menu_item_call label="Unisciti al gruppo..." name="item_join"/>
+ <menu_item_call label="Aderisci al gruppo..." name="item_join"/>
<menu_item_call label="Nuovo gruppo..." name="item_new"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_hide_navbar.xml b/indra/newview/skins/default/xui/it/menu_hide_navbar.xml
index a87e76a19b..2c2c6c4bc5 100644
--- a/indra/newview/skins/default/xui/it/menu_hide_navbar.xml
+++ b/indra/newview/skins/default/xui/it/menu_hide_navbar.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_navbar_menu">
<menu_item_check label="Mostra la barra di navigazione" name="ShowNavbarNavigationPanel"/>
- <menu_item_check label="Mostra la barra dei favoriti" name="ShowNavbarFavoritesPanel"/>
+ <menu_item_check label="Mostra la barra dei Preferiti" name="ShowNavbarFavoritesPanel"/>
+ <menu_item_check label="Mostra mini barra del luogo" name="ShowMiniLocationPanel"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_im_well_button.xml b/indra/newview/skins/default/xui/it/menu_im_well_button.xml
new file mode 100644
index 0000000000..9e471b771c
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_im_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="IM Well Button Context Menu">
+ <menu_item_call label="Chiudi tutto" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/it/menu_imchiclet_group.xml
index f39ad316fe..baa4e671b0 100644
--- a/indra/newview/skins/default/xui/it/menu_imchiclet_group.xml
+++ b/indra/newview/skins/default/xui/it/menu_imchiclet_group.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="IMChiclet Group Menu">
- <menu_item_call label="Informazioni gruppo" name="Show Profile"/>
+ <menu_item_call label="Informazioni sul gruppo" name="Show Profile"/>
<menu_item_call label="Mostra sessione" name="Chat"/>
<menu_item_call label="Fine sessione" name="End Session"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/it/menu_imchiclet_p2p.xml
index e89576b1f9..2eacbb09ad 100644
--- a/indra/newview/skins/default/xui/it/menu_imchiclet_p2p.xml
+++ b/indra/newview/skins/default/xui/it/menu_imchiclet_p2p.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="IMChiclet P2P Menu">
<menu_item_call label="Vedi profilo" name="Show Profile"/>
- <menu_item_call label="Chiedi amicizia" name="Add Friend"/>
+ <menu_item_call label="Aggiungi amico" name="Add Friend"/>
<menu_item_call label="Mostra sessione" name="Send IM"/>
<menu_item_call label="Fine sessione" name="End Session"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml
index 968fbd37ae..22a37d7095 100644
--- a/indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/it/menu_inspect_avatar_gear.xml
@@ -1,17 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<menu name="Gear Menu">
<menu_item_call label="Vedi profilo" name="view_profile"/>
- <menu_item_call label="Chiedi amicizia" name="add_friend"/>
+ <menu_item_call label="Aggiungi amico" name="add_friend"/>
<menu_item_call label="IM" name="im"/>
<menu_item_call label="Chiama" name="call"/>
<menu_item_call label="Teleport" name="teleport"/>
- <menu_item_call label="Invita nel gruppo" name="invite_to_group"/>
+ <menu_item_call label="Invita al gruppo" name="invite_to_group"/>
<menu_item_call label="Blocca" name="block"/>
- <menu_item_call label="Denuncia" name="report"/>
+ <menu_item_call label="Sblocca" name="unblock"/>
+ <menu_item_call label="Segnala" name="report"/>
<menu_item_call label="Congela" name="freeze"/>
<menu_item_call label="Espelli" name="eject"/>
- <menu_item_call label="Debug" name="debug"/>
+ <menu_item_call label="Debug delle texture" name="debug"/>
<menu_item_call label="Trova sulla mappa" name="find_on_map"/>
- <menu_item_call label="Avvicinati" name="zoom_in"/>
+ <menu_item_call label="Zoom avanti" name="zoom_in"/>
<menu_item_call label="Paga" name="pay"/>
+ <menu_item_call label="Condividi" name="share"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/it/menu_inspect_object_gear.xml
index 74d828fc20..eb10ebd0b6 100644
--- a/indra/newview/skins/default/xui/it/menu_inspect_object_gear.xml
+++ b/indra/newview/skins/default/xui/it/menu_inspect_object_gear.xml
@@ -1,17 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<menu name="Gear Menu">
<menu_item_call label="Tocca" name="touch"/>
- <menu_item_call label="Siedi" name="sit"/>
+ <menu_item_call label="Siediti" name="sit"/>
<menu_item_call label="Paga" name="pay"/>
- <menu_item_call label="Compra" name="buy"/>
+ <menu_item_call label="Acquista" name="buy"/>
<menu_item_call label="Prendi" name="take"/>
<menu_item_call label="Prendi copia" name="take_copy"/>
<menu_item_call label="Apri" name="open"/>
<menu_item_call label="Modifica" name="edit"/>
<menu_item_call label="Indossa" name="wear"/>
- <menu_item_call label="Denuncia" name="report"/>
+ <menu_item_call label="Segnala" name="report"/>
<menu_item_call label="Blocca" name="block"/>
- <menu_item_call label="Avvicinati" name="zoom_in"/>
- <menu_item_call label="Cancella" name="remove"/>
- <menu_item_call label="Più info" name="more_info"/>
+ <menu_item_call label="Zoom avanti" name="zoom_in"/>
+ <menu_item_call label="Rimuovi" name="remove"/>
+ <menu_item_call label="Maggiori informazioni" name="more_info"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml
index 1812a21b0d..80edae8a2b 100644
--- a/indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/it/menu_inspect_self_gear.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<menu name="Gear Menu">
<menu_item_call label="Alzati" name="stand_up"/>
- <menu_item_call label="Il mio aspetto fisico" name="my_appearance"/>
+ <menu_item_call label="Cambia vestiario" name="change_outfit"/>
<menu_item_call label="Il mio profilo" name="my_profile"/>
- <menu_item_call label="I miei amici" name="my_friends"/>
+ <menu_item_call label="I miei amici..." name="my_friends"/>
<menu_item_call label="I miei gruppi" name="my_groups"/>
+ <menu_item_call label="Debug delle texture" name="Debug..."/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_inv_offer_chiclet.xml b/indra/newview/skins/default/xui/it/menu_inv_offer_chiclet.xml
new file mode 100644
index 0000000000..471640eff5
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_inv_offer_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="InvOfferChiclet Menu">
+ <menu_item_call label="Chiudi" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_inventory.xml b/indra/newview/skins/default/xui/it/menu_inventory.xml
index edb9490914..fb8361ad05 100644
--- a/indra/newview/skins/default/xui/it/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/it/menu_inventory.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
+ <menu_item_call label="Condividi" name="Share"/>
<menu_item_call label="Compra" name="Task Buy"/>
<menu_item_call label="Apri" name="Task Open"/>
<menu_item_call label="Esegui" name="Task Play"/>
@@ -8,62 +9,65 @@
<menu_item_call label="Elimina" name="Task Remove"/>
<menu_item_call label="Svuota il Cestino" name="Empty Trash"/>
<menu_item_call label="Svuota gli oggetti persi e ritrovati" name="Empty Lost And Found"/>
- <menu_item_call label="Nuova Cartella" name="New Folder"/>
- <menu_item_call label="Nuovo Script" name="New Script"/>
- <menu_item_call label="Nuova Notecard" name="New Note"/>
- <menu_item_call label="Nuova Gesture" name="New Gesture"/>
- <menu label="Maglietta Intima" name="New Clothes">
- <menu_item_call label="Nuova Maglietta" name="New Shirt"/>
- <menu_item_call label="Nuovi Pantaloni" name="New Pants"/>
- <menu_item_call label="Nuove Scarpe" name="New Shoes"/>
- <menu_item_call label="Nuove Calze" name="New Socks"/>
- <menu_item_call label="Nuova Giacca" name="New Jacket"/>
- <menu_item_call label="Nuova Gonna" name="New Skirt"/>
- <menu_item_call label="Nuovi Guanti" name="New Gloves"/>
- <menu_item_call label="Nuova Canottiera" name="New Undershirt"/>
- <menu_item_call label="Nuove Mutande" name="New Underpants"/>
+ <menu_item_call label="Nuova cartella" name="New Folder"/>
+ <menu_item_call label="Nuovo script" name="New Script"/>
+ <menu_item_call label="Nuovo biglietto" name="New Note"/>
+ <menu_item_call label="Nuova gesture" name="New Gesture"/>
+ <menu label="Maglietta intima" name="New Clothes">
+ <menu_item_call label="Nuova maglietta" name="New Shirt"/>
+ <menu_item_call label="Nuovi pantaloni" name="New Pants"/>
+ <menu_item_call label="Nuove scarpe" name="New Shoes"/>
+ <menu_item_call label="Nuove calze" name="New Socks"/>
+ <menu_item_call label="Nuova giacca" name="New Jacket"/>
+ <menu_item_call label="Nuova gonna" name="New Skirt"/>
+ <menu_item_call label="Nuovi guanti" name="New Gloves"/>
+ <menu_item_call label="Nuova canottiera" name="New Undershirt"/>
+ <menu_item_call label="Nuove mutande" name="New Underpants"/>
<menu_item_call label="Nuovo Alfa Mask" name="New Alpha Mask"/>
- <menu_item_call label="Nuovo Tatuaggio" name="New Tattoo"/>
+ <menu_item_call label="Nuovo tatuaggio" name="New Tattoo"/>
</menu>
- <menu label="Nuove Parti del Corpo" name="New Body Parts">
- <menu_item_call label="Nuova Forma del corpo" name="New Shape"/>
- <menu_item_call label="Nuova Pelle" name="New Skin"/>
- <menu_item_call label="Nuovi Capelli" name="New Hair"/>
- <menu_item_call label="Nuovi Occhi" name="New Eyes"/>
+ <menu label="Nuove parti del corpo" name="New Body Parts">
+ <menu_item_call label="Nuova forma del corpo" name="New Shape"/>
+ <menu_item_call label="Nuova pelle" name="New Skin"/>
+ <menu_item_call label="Nuovi capelli" name="New Hair"/>
+ <menu_item_call label="Nuovi occhi" name="New Eyes"/>
</menu>
- <menu label="Cambia Tipo" name="Change Type">
+ <menu label="Cambia tipo" name="Change Type">
<menu_item_call label="Predefinito" name="Default"/>
<menu_item_call label="Guanti" name="Gloves"/>
<menu_item_call label="Giacca" name="Jacket"/>
<menu_item_call label="Pantaloni" name="Pants"/>
- <menu_item_call label="Shape" name="Shape"/>
+ <menu_item_call label="Figura corporea" name="Shape"/>
<menu_item_call label="Scarpe" name="Shoes"/>
<menu_item_call label="Camicia" name="Shirt"/>
<menu_item_call label="Gonna" name="Skirt"/>
<menu_item_call label="Slip" name="Underpants"/>
- <menu_item_call label="Maglietta Intima" name="Undershirt"/>
+ <menu_item_call label="Maglietta intima" name="Undershirt"/>
</menu>
<menu_item_call label="Teletrasportati" name="Landmark Open"/>
<menu_item_call label="Apri" name="Animation Open"/>
<menu_item_call label="Apri" name="Sound Open"/>
+ <menu_item_call label="Sostituisci vestiti" name="Replace Outfit"/>
+ <menu_item_call label="Aggiungi al vestiario" name="Add To Outfit"/>
+ <menu_item_call label="Rimuovi dal vestiario attuale" name="Remove From Outfit"/>
+ <menu_item_call label="Trova originale" name="Find Original"/>
<menu_item_call label="Elimina oggetto" name="Purge Item"/>
<menu_item_call label="Ripristina oggetto" name="Restore Item"/>
- <menu_item_call label="Vai al Link" name="Goto Link"/>
<menu_item_call label="Apri" name="Open"/>
+ <menu_item_call label="Apri originale" name="Open Original"/>
<menu_item_call label="Proprietà" name="Properties"/>
<menu_item_call label="Rinomina" name="Rename"/>
<menu_item_call label="Copia UUID dell&apos;oggetto" name="Copy Asset UUID"/>
<menu_item_call label="Copia" name="Copy"/>
<menu_item_call label="Incolla" name="Paste"/>
- <menu_item_call label="Incolla come Link" name="Paste As Link"/>
+ <menu_item_call label="Incolla come link" name="Paste As Link"/>
+ <menu_item_call label="Rimuovi link" name="Remove Link"/>
<menu_item_call label="Cancella" name="Delete"/>
- <menu_item_call label="Togli gli oggetti" name="Take Off Items"/>
- <menu_item_call label="Aggiungi all&apos;outfit" name="Add To Outfit"/>
- <menu_item_call label="Sostituisci outfit" name="Replace Outfit"/>
+ <menu_item_call label="Elimina la cartella di sistema" name="Delete System Folder"/>
<menu_item_call label="Inizia la conferenza chat" name="Conference Chat Folder"/>
<menu_item_call label="Esegui" name="Sound Play"/>
- <menu_item_call label="Informazioni sul Landmark" name="About Landmark"/>
- <menu_item_call label="Esegui inworld" name="Animation Play"/>
+ <menu_item_call label="Informazioni sul punto di riferimento" name="About Landmark"/>
+ <menu_item_call label="Riproduci in Second Life" name="Animation Play"/>
<menu_item_call label="Esegui localmente" name="Animation Audition"/>
<menu_item_call label="Invia un Instant Message" name="Send Instant Message"/>
<menu_item_call label="Offri teletrasporto..." name="Offer Teleport..."/>
@@ -77,6 +81,7 @@
<menu label="Attacca all&apos;HUD" name="Attach To HUD"/>
<menu_item_call label="Modifica" name="Wearable Edit"/>
<menu_item_call label="Indossa" name="Wearable Wear"/>
+ <menu_item_call label="Aggiungi" name="Wearable Add"/>
<menu_item_call label="Togli" name="Take Off"/>
<menu_item_call label="--nessuna opzione--" name="--no options--"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_inventory_add.xml b/indra/newview/skins/default/xui/it/menu_inventory_add.xml
index d33dabc4c3..05f53f44ba 100644
--- a/indra/newview/skins/default/xui/it/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/it/menu_inventory_add.xml
@@ -1,32 +1,32 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_inventory_add">
- <menu label="Carica sul server" name="upload">
+ <menu label="Carica nel server" name="upload">
<menu_item_call label="Immagine ([COST]L$)..." name="Upload Image"/>
<menu_item_call label="Suono ([COST]L$)..." name="Upload Sound"/>
<menu_item_call label="Animazione ([COST]L$)..." name="Upload Animation"/>
<menu_item_call label="In blocco ([COST]L$ per file)..." name="Bulk Upload"/>
</menu>
- <menu_item_call label="Nuova Cartella" name="New Folder"/>
- <menu_item_call label="Nuovo Script" name="New Script"/>
- <menu_item_call label="Nuova Notecard" name="New Note"/>
- <menu_item_call label="Nuova Gesture" name="New Gesture"/>
- <menu label="Nuovi Abiti" name="New Clothes">
- <menu_item_call label="Nuova Camicia" name="New Shirt"/>
- <menu_item_call label="Nuovi Pantaloni" name="New Pants"/>
- <menu_item_call label="Nuove Scarpe" name="New Shoes"/>
- <menu_item_call label="Nuove Calze" name="New Socks"/>
- <menu_item_call label="Nuova Giacca" name="New Jacket"/>
- <menu_item_call label="Nuova Gonna" name="New Skirt"/>
- <menu_item_call label="Nuovi Guanti" name="New Gloves"/>
- <menu_item_call label="Nuova Maglietta Intima" name="New Undershirt"/>
- <menu_item_call label="Nuovi Slip" name="New Underpants"/>
- <menu_item_call label="Nuovo Alfa (Trasparenza)" name="New Alpha"/>
- <menu_item_call label="Nuovo Tatuaggio" name="New Tattoo"/>
+ <menu_item_call label="Nuova cartella" name="New Folder"/>
+ <menu_item_call label="Nuovo script" name="New Script"/>
+ <menu_item_call label="Nuovo biglietto" name="New Note"/>
+ <menu_item_call label="Nuova gesture" name="New Gesture"/>
+ <menu label="Maglietta intima" name="New Clothes">
+ <menu_item_call label="Nuova camicia" name="New Shirt"/>
+ <menu_item_call label="Nuovi pantaloni" name="New Pants"/>
+ <menu_item_call label="Nuove scarpe" name="New Shoes"/>
+ <menu_item_call label="Nuove calze" name="New Socks"/>
+ <menu_item_call label="Nuova giacca" name="New Jacket"/>
+ <menu_item_call label="Nuova gonna" name="New Skirt"/>
+ <menu_item_call label="Nuovi guanti" name="New Gloves"/>
+ <menu_item_call label="Nuova maglietta intima" name="New Undershirt"/>
+ <menu_item_call label="Nuovi slip" name="New Underpants"/>
+ <menu_item_call label="Nuovo Alfa (trasparenza)" name="New Alpha"/>
+ <menu_item_call label="Nuovo tatuaggio" name="New Tattoo"/>
</menu>
- <menu label="Nuove Parti del Corpo" name="New Body Parts">
- <menu_item_call label="Nuova Shape" name="New Shape"/>
- <menu_item_call label="Nuova Pelle" name="New Skin"/>
- <menu_item_call label="Nuovi Capelli" name="New Hair"/>
- <menu_item_call label="Nuovi Occhi" name="New Eyes"/>
+ <menu label="Nuove parti del corpo" name="New Body Parts">
+ <menu_item_call label="Nuova figura corporea" name="New Shape"/>
+ <menu_item_call label="Nuova pelle" name="New Skin"/>
+ <menu_item_call label="Nuovi capelli" name="New Hair"/>
+ <menu_item_call label="Nuovi occhi" name="New Eyes"/>
</menu>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml
index e97af5c950..cf87148f2e 100644
--- a/indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/it/menu_inventory_gear_default.xml
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_gear_default">
- <menu_item_call label="Nuova Finestra di Inventory" name="new_window"/>
- <menu_item_call label="Ordina per nome" name="sort_by_name"/>
- <menu_item_call label="Ordina per data (più recenti)" name="sort_by_recent"/>
- <menu_item_call label="Mostra i Filtri" name="show_filters"/>
- <menu_item_call label="Cancella i Filtri" name="reset_filters"/>
- <menu_item_call label="Chiudi le cartelle" name="close_folders"/>
+ <menu_item_call label="Nuova finestra inventario" name="new_window"/>
+ <menu_item_call label="Ordina in base al nome" name="sort_by_name"/>
+ <menu_item_call label="Mostra prima i più recenti" name="sort_by_recent"/>
+ <menu_item_call label="Mostra filtri" name="show_filters"/>
+ <menu_item_call label="Ripristina filtri" name="reset_filters"/>
+ <menu_item_call label="Chiudi tutte le cartelle" name="close_folders"/>
<menu_item_call label="Svuota cestino" name="empty_trash"/>
- <menu_item_call label="Svuota Persi e Ritrovati" name="empty_lostnfound"/>
+ <menu_item_call label="Svuota oggetti smarriti" name="empty_lostnfound"/>
<menu_item_call label="Salva texture come" name="Save Texture As"/>
<menu_item_call label="Trova originale" name="Find Original"/>
<menu_item_call label="Trova tutti i link" name="Find All Links"/>
diff --git a/indra/newview/skins/default/xui/it/menu_land.xml b/indra/newview/skins/default/xui/it/menu_land.xml
index 173c080c3f..f510078e14 100644
--- a/indra/newview/skins/default/xui/it/menu_land.xml
+++ b/indra/newview/skins/default/xui/it/menu_land.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Land Pie">
- <menu_item_call label="Info sul terreno" name="Place Information..."/>
- <menu_item_call label="Siedi qui" name="Sit Here"/>
- <menu_item_call label="Compra questo terreno" name="Land Buy"/>
- <menu_item_call label="Compra permesso" name="Land Buy Pass"/>
+ <menu_item_call label="Informazioni sui terreni" name="Place Information..."/>
+ <menu_item_call label="Siediti qui" name="Sit Here"/>
+ <menu_item_call label="Acquista questo terreno" name="Land Buy"/>
+ <menu_item_call label="Acquista Permesso" name="Land Buy Pass"/>
<menu_item_call label="Costruisci" name="Create"/>
<menu_item_call label="Modifica terreno" name="Edit Terrain"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_landmark.xml b/indra/newview/skins/default/xui/it/menu_landmark.xml
index 58e3e992ed..b3cddab783 100644
--- a/indra/newview/skins/default/xui/it/menu_landmark.xml
+++ b/indra/newview/skins/default/xui/it/menu_landmark.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="landmark_overflow_menu">
<menu_item_call label="Copia SLurl" name="copy"/>
- <menu_item_call label="Cancella" name="delete"/>
- <menu_item_call label="Crea luogo consigliato" name="pick"/>
- <menu_item_call label="Aggiungi alla barra dei favoriti" name="add_to_favbar"/>
+ <menu_item_call label="Elimina" name="delete"/>
+ <menu_item_call label="Crea Luogo consigliato" name="pick"/>
+ <menu_item_call label="Aggiungi alla barra dei Preferiti" name="add_to_favbar"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_login.xml b/indra/newview/skins/default/xui/it/menu_login.xml
index db3b84df29..0a6d803058 100644
--- a/indra/newview/skins/default/xui/it/menu_login.xml
+++ b/indra/newview/skins/default/xui/it/menu_login.xml
@@ -2,29 +2,22 @@
<menu_bar name="Login Menu">
<menu label="Io" name="File">
<menu_item_call label="Preferenze" name="Preferences..."/>
- <menu_item_call label="Chiudi" name="Quit"/>
+ <menu_item_call label="Esci da [APP_NAME]" name="Quit"/>
</menu>
<menu label="Aiuto" name="Help">
<menu_item_call label="Aiuto di [SECOND_LIFE]" name="Second Life Help"/>
+ <menu_item_call label="Informazioni su [APP_NAME]" name="About Second Life"/>
</menu>
+ <menu_item_check label="Mostra menu Debug" name="Show Debug Menu"/>
<menu label="Debug" name="Debug">
- <menu label="Modifica" name="Edit">
- <menu_item_call label="Annulla" name="Undo"/>
- <menu_item_call label="Ripeti" name="Redo"/>
- <menu_item_call label="Taglia" name="Cut"/>
- <menu_item_call label="Copia" name="Copy"/>
- <menu_item_call label="Incolla" name="Paste"/>
- <menu_item_call label="Cancella" name="Delete"/>
- <menu_item_call label="Duplica" name="Duplicate"/>
- <menu_item_call label="Seleziona Tutto" name="Select All"/>
- <menu_item_call label="Deseleziona" name="Deselect"/>
- </menu>
- <menu_item_call label="Mostra Impostazioni di Debug" name="Debug Settings"/>
- <menu_item_call label="Impostazioni colori Interfaccia" name="UI/Color Settings"/>
- <menu_item_call label="Mostra la finestra laterale" name="Show Side Tray"/>
- <menu label="Test Interfaccia Utente" name="UI Tests"/>
- <menu_item_call label="Mostra i Termini di Servizio (TOS)" name="TOS"/>
- <menu_item_call label="Mostra Messaggi critici" name="Critical"/>
- <menu_item_call label="Test Web browser" name="Web Browser Test"/>
+ <menu_item_call label="Mostra impostazioni di debug" name="Debug Settings"/>
+ <menu_item_call label="Impostazioni colori interfaccia" name="UI/Color Settings"/>
+ <menu label="Test interfaccia utente" name="UI Tests"/>
+ <menu_item_call label="Imposta dimensioni della finestra..." name="Set Window Size..."/>
+ <menu_item_call label="Mostra i Termini del servizio (TOS)" name="TOS"/>
+ <menu_item_call label="Mostra messaggio critico" name="Critical"/>
+ <menu_item_call label="Test browser Web" name="Web Browser Test"/>
+ <menu_item_check label="Mostra selettore griglia" name="Show Grid Picker"/>
+ <menu_item_call label="Mostra Console notifiche" name="Show Notifications Console"/>
</menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/it/menu_mini_map.xml b/indra/newview/skins/default/xui/it/menu_mini_map.xml
index 7caa7fd226..fa574230e0 100644
--- a/indra/newview/skins/default/xui/it/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/it/menu_mini_map.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="popup">
+<menu name="Popup">
<menu_item_call label="Zoom ravvicinato" name="Zoom Close"/>
<menu_item_call label="Zoom Medio" name="Zoom Medium"/>
<menu_item_call label="Zoom Distante" name="Zoom Far"/>
diff --git a/indra/newview/skins/default/xui/it/menu_navbar.xml b/indra/newview/skins/default/xui/it/menu_navbar.xml
index 3d855cf701..e42d913a6f 100644
--- a/indra/newview/skins/default/xui/it/menu_navbar.xml
+++ b/indra/newview/skins/default/xui/it/menu_navbar.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Navbar Menu">
<menu_item_check label="Mostra le coordinate" name="Show Coordinates"/>
- <menu_item_check label="Mostra proprietà parcel" name="Show Parcel Properties"/>
- <menu_item_call label="Landmark" name="Landmark"/>
+ <menu_item_check label="Mostra proprietà lotto" name="Show Parcel Properties"/>
+ <menu_item_call label="Punto di riferimento" name="Landmark"/>
<menu_item_call label="Taglia" name="Cut"/>
<menu_item_call label="Copia" name="Copy"/>
<menu_item_call label="Incolla" name="Paste"/>
- <menu_item_call label="Cancella" name="Delete"/>
+ <menu_item_call label="Elimina" name="Delete"/>
<menu_item_call label="Seleziona tutto" name="Select All"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_nearby_chat.xml b/indra/newview/skins/default/xui/it/menu_nearby_chat.xml
index 2a625fc763..719a6d3261 100644
--- a/indra/newview/skins/default/xui/it/menu_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/it/menu_nearby_chat.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="NearBy Chat Menu">
<menu_item_call label="Mostra le persone vicine..." name="nearby_people"/>
- <menu_item_check label="Mostra Testo bloccato" name="muted_text"/>
- <menu_item_check label="Mostra Icone amici" name="show_buddy_icons"/>
+ <menu_item_check label="Mostra il testo bloccato" name="muted_text"/>
+ <menu_item_check label="Mostra icone amici" name="show_buddy_icons"/>
<menu_item_check label="Mostra nomi" name="show_names"/>
- <menu_item_check label="Mostra Icone e nomi" name="show_icons_and_names"/>
- <menu_item_call label="Dimensioni del Font" name="font_size"/>
+ <menu_item_check label="Mostra icone e nomi" name="show_icons_and_names"/>
+ <menu_item_call label="Dimensioni caratteri" name="font_size"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_notification_well_button.xml b/indra/newview/skins/default/xui/it/menu_notification_well_button.xml
new file mode 100644
index 0000000000..8c82e30f0e
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_notification_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Notification Well Button Context Menu">
+ <menu_item_call label="Chiudi tutto" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_object.xml b/indra/newview/skins/default/xui/it/menu_object.xml
index 955d4c8776..237b6b3a0e 100644
--- a/indra/newview/skins/default/xui/it/menu_object.xml
+++ b/indra/newview/skins/default/xui/it/menu_object.xml
@@ -4,21 +4,24 @@
<menu_item_call label="Modifica" name="Edit..."/>
<menu_item_call label="Costruisci" name="Build"/>
<menu_item_call label="Apri" name="Open"/>
- <menu_item_call label="Siedi qui" name="Object Sit"/>
- <menu_item_call label="Profilo oggetto" name="Object Inspect"/>
- <context_menu label="Metti &gt;" name="Put On">
+ <menu_item_call label="Siediti qui" name="Object Sit"/>
+ <menu_item_call label="Alzati" name="Object Stand Up"/>
+ <menu_item_call label="Profilo dell&apos;oggetto" name="Object Inspect"/>
+ <menu_item_call label="Zoom avanti" name="Zoom In"/>
+ <context_menu label="Indossa â–¶" name="Put On">
<menu_item_call label="Indossa" name="Wear"/>
- <context_menu label="Attacca &gt;" name="Object Attach"/>
- <context_menu label="Attacca HUD &gt;" name="Object Attach HUD"/>
+ <context_menu label="Attacca â–¶" name="Object Attach"/>
+ <context_menu label="Attacca HUD â–¶" name="Object Attach HUD"/>
</context_menu>
- <context_menu label="Togli &gt;" name="Remove">
- <menu_item_call label="Prendi" name="Pie Object Take"/>
- <menu_item_call label="Denuncia abuso" name="Report Abuse..."/>
+ <context_menu label="Togli â–¶" name="Remove">
+ <menu_item_call label="Segnala abuso" name="Report Abuse..."/>
<menu_item_call label="Blocca" name="Object Mute"/>
<menu_item_call label="Restituisci" name="Return..."/>
- <menu_item_call label="Cancella" name="Delete"/>
+ <menu_item_call label="Elimina" name="Delete"/>
</context_menu>
+ <menu_item_call label="Acquista" name="Pie Object Bye"/>
+ <menu_item_call label="Prendi" name="Pie Object Take"/>
<menu_item_call label="Prendi copia" name="Take Copy"/>
<menu_item_call label="Paga" name="Pay..."/>
- <menu_item_call label="Compra" name="Buy..."/>
+ <menu_item_call label="Acquista" name="Buy..."/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_outfit_gear.xml b/indra/newview/skins/default/xui/it/menu_outfit_gear.xml
new file mode 100644
index 0000000000..cf39779b67
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_outfit_gear.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Gear Outfit">
+ <menu_item_call label="Indossa - Sostituisci vestiario attuale" name="wear"/>
+ <menu_item_call label="Togli - Rimuovi dal vestiario attuale" name="take_off"/>
+ <menu label="Nuovi abiti" name="New Clothes">
+ <menu_item_call label="Nuova camicia" name="New Shirt"/>
+ <menu_item_call label="Nuovi pantaloni" name="New Pants"/>
+ <menu_item_call label="Nuove scarpe" name="New Shoes"/>
+ <menu_item_call label="Nuove calze" name="New Socks"/>
+ <menu_item_call label="Nuova giacca" name="New Jacket"/>
+ <menu_item_call label="Nuova gonna" name="New Skirt"/>
+ <menu_item_call label="Nuovi guanti" name="New Gloves"/>
+ <menu_item_call label="Nuova maglietta intima" name="New Undershirt"/>
+ <menu_item_call label="Nuovi slip" name="New Underpants"/>
+ <menu_item_call label="Nuovo Alpha (trasparenza)" name="New Alpha"/>
+ <menu_item_call label="Nuovo tatuaggio" name="New Tattoo"/>
+ </menu>
+ <menu label="Nuove parti del corpo" name="New Body Parts">
+ <menu_item_call label="Nuova figura corporea" name="New Shape"/>
+ <menu_item_call label="Nuova pelle" name="New Skin"/>
+ <menu_item_call label="Nuovi capelli" name="New Hair"/>
+ <menu_item_call label="Nuovi occhi" name="New Eyes"/>
+ </menu>
+ <menu_item_call label="Cambia nome del vestiario" name="rename"/>
+ <menu_item_call label="Elimina vestito" name="delete_outfit"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_outfit_tab.xml b/indra/newview/skins/default/xui/it/menu_outfit_tab.xml
new file mode 100644
index 0000000000..4e0caf832c
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_outfit_tab.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit">
+ <menu_item_call label="Indossa - Sostituisci vestiario attuale" name="wear_replace"/>
+ <menu_item_call label="Indossa - Aggiungi al vestiario attuale" name="wear_add"/>
+ <menu_item_call label="Togli - Rimuovi dal vestiario attuale" name="take_off"/>
+ <menu_item_call label="Modifica vestiario" name="edit"/>
+ <menu_item_call label="Modifica nome" name="rename"/>
+ <menu_item_call label="Elimina vestito" name="delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_participant_list.xml b/indra/newview/skins/default/xui/it/menu_participant_list.xml
index 33c8fc404d..f70b886a1e 100644
--- a/indra/newview/skins/default/xui/it/menu_participant_list.xml
+++ b/indra/newview/skins/default/xui/it/menu_participant_list.xml
@@ -1,16 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Participant List Context Menu">
+ <menu_item_check label="Ordina in base al nome" name="SortByName"/>
+ <menu_item_check label="Ordina in base a intervenuti recenti" name="SortByRecentSpeakers"/>
<menu_item_call label="Vedi profilo" name="View Profile"/>
- <menu_item_call label="Chiedi amicizia" name="Add Friend"/>
+ <menu_item_call label="Aggiungi amico" name="Add Friend"/>
<menu_item_call label="IM" name="IM"/>
<menu_item_call label="Chiama" name="Call"/>
<menu_item_call label="Condividi" name="Share"/>
<menu_item_call label="Paga" name="Pay"/>
- <menu_item_check label="Blocca/Sblocca" name="Block/Unblock"/>
- <menu_item_check label="Muta testo" name="MuteText"/>
- <menu_item_check label="Consenti chat di testo" name="AllowTextChat"/>
- <menu_item_call label="Muta questo partecipante" name="ModerateVoiceMuteSelected"/>
- <menu_item_call label="Muta tutti gli altri" name="ModerateVoiceMuteOthers"/>
- <menu_item_call label="Riabilita questo partecipante" name="ModerateVoiceUnMuteSelected"/>
- <menu_item_call label="Riabilita tutti gli altri" name="ModerateVoiceUnMuteOthers"/>
+ <menu_item_check label="Icone persone" name="View Icons"/>
+ <menu_item_check label="Blocca voce" name="Block/Unblock"/>
+ <menu_item_check label="Blocca testo" name="MuteText"/>
+ <context_menu label="Opzioni moderatore &gt;" name="Moderator Options">
+ <menu_item_check label="Consenti chat di testo" name="AllowTextChat"/>
+ <menu_item_call label="Disattiva audio di questo participante" name="ModerateVoiceMuteSelected"/>
+ <menu_item_call label="Riattiva audio di questo participante" name="ModerateVoiceUnMuteSelected"/>
+ <menu_item_call label="Disattiva audio di tutti" name="ModerateVoiceMute"/>
+ <menu_item_call label="Riattiva audio di tutti" name="ModerateVoiceUnmute"/>
+ </context_menu>
</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/it/menu_people_friends_view_sort.xml
index ad8927be13..1f987890c4 100644
--- a/indra/newview/skins/default/xui/it/menu_people_friends_view_sort.xml
+++ b/indra/newview/skins/default/xui/it/menu_people_friends_view_sort.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_group_plus">
- <menu_item_check label="Ordina per nome" name="sort_name"/>
- <menu_item_check label="Ordina per stato" name="sort_status"/>
+ <menu_item_check label="Ordina in base al nome" name="sort_name"/>
+ <menu_item_check label="Ordina in base allo stato" name="sort_status"/>
<menu_item_check label="Icone persone" name="view_icons"/>
- <menu_item_call label="Mostra gli &amp; oggetti dei residenti bloccati" name="show_blocked_list"/>
+ <menu_item_call label="Mostra oggetti e residenti bloccati" name="show_blocked_list"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_people_groups.xml b/indra/newview/skins/default/xui/it/menu_people_groups.xml
new file mode 100644
index 0000000000..30a97a1c72
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_people_groups.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Mostra informazioni" name="View Info"/>
+ <menu_item_call label="Chat" name="Chat"/>
+ <menu_item_call label="Chiama" name="Call"/>
+ <menu_item_call label="Attiva" name="Activate"/>
+ <menu_item_call label="Chiudi" name="Leave"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_people_nearby.xml b/indra/newview/skins/default/xui/it/menu_people_nearby.xml
index be071a5074..a974bd181d 100644
--- a/indra/newview/skins/default/xui/it/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/it/menu_people_nearby.xml
@@ -1,10 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Avatar Context Menu">
<menu_item_call label="Vedi profilo" name="View Profile"/>
- <menu_item_call label="Chiedi amicizia" name="Add Friend"/>
+ <menu_item_call label="Aggiungi amico" name="Add Friend"/>
+ <menu_item_call label="Rimuovi amico" name="Remove Friend"/>
<menu_item_call label="IM" name="IM"/>
<menu_item_call label="Chiama" name="Call"/>
+ <menu_item_call label="Mappa" name="Map"/>
<menu_item_call label="Condividi" name="Share"/>
<menu_item_call label="Paga" name="Pay"/>
<menu_item_check label="Blocca/Sblocca" name="Block/Unblock"/>
+ <menu_item_call label="Offri Teleport" name="teleport"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/it/menu_people_nearby_multiselect.xml
index f9fda2fb98..9784a4cc9a 100644
--- a/indra/newview/skins/default/xui/it/menu_people_nearby_multiselect.xml
+++ b/indra/newview/skins/default/xui/it/menu_people_nearby_multiselect.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Multi-Selected People Context Menu">
- <menu_item_call label="Chiedi amicizie" name="Add Friends"/>
+ <menu_item_call label="Aggiungi amici" name="Add Friends"/>
+ <menu_item_call label="Rimuovi amici" name="Remove Friend"/>
<menu_item_call label="IM" name="IM"/>
<menu_item_call label="Chiama" name="Call"/>
<menu_item_call label="Condividi" name="Share"/>
diff --git a/indra/newview/skins/default/xui/it/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/it/menu_people_nearby_view_sort.xml
index c1b384196d..aae2313702 100644
--- a/indra/newview/skins/default/xui/it/menu_people_nearby_view_sort.xml
+++ b/indra/newview/skins/default/xui/it/menu_people_nearby_view_sort.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_group_plus">
- <menu_item_check label="Ordina mettendo per primo chi ha parlato per ultimo" name="sort_by_recent_speakers"/>
- <menu_item_check label="Ordina per nome" name="sort_name"/>
- <menu_item_check label="Ordina per Distanza" name="sort_distance"/>
- <menu_item_check label="Vedi le icone delle persone" name="view_icons"/>
- <menu_item_call label="Mostra gli &amp; oggetti dei residenti bloccati" name="show_blocked_list"/>
+ <menu_item_check label="Ordina in base a intervenuti recenti" name="sort_by_recent_speakers"/>
+ <menu_item_check label="Ordina in base al nome" name="sort_name"/>
+ <menu_item_check label="Ordina in base alla distanza" name="sort_distance"/>
+ <menu_item_check label="Icone persone" name="view_icons"/>
+ <menu_item_call label="Mostra oggetti e residenti bloccati" name="show_blocked_list"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/it/menu_people_recent_view_sort.xml
index f8fd9dca79..7fccd1621a 100644
--- a/indra/newview/skins/default/xui/it/menu_people_recent_view_sort.xml
+++ b/indra/newview/skins/default/xui/it/menu_people_recent_view_sort.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_group_plus">
<menu_item_check label="Mostra prima i più recenti" name="sort_most"/>
- <menu_item_check label="Ordina per nome" name="sort_name"/>
- <menu_item_check label="Vedi le icone delle persone" name="view_icons"/>
- <menu_item_call label="Mostra gli &amp; oggetti dei residenti bloccati" name="show_blocked_list"/>
+ <menu_item_check label="Ordina in base al nome" name="sort_name"/>
+ <menu_item_check label="Icone persone" name="view_icons"/>
+ <menu_item_call label="Mostra oggetti e residenti bloccati" name="show_blocked_list"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_picks.xml b/indra/newview/skins/default/xui/it/menu_picks.xml
index e84b321ccf..000d219ed0 100644
--- a/indra/newview/skins/default/xui/it/menu_picks.xml
+++ b/indra/newview/skins/default/xui/it/menu_picks.xml
@@ -4,5 +4,5 @@
<menu_item_call label="Modifica" name="pick_edit"/>
<menu_item_call label="Teleport" name="pick_teleport"/>
<menu_item_call label="Mappa" name="pick_map"/>
- <menu_item_call label="Cancella" name="pick_delete"/>
+ <menu_item_call label="Elimina" name="pick_delete"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_picks_plus.xml b/indra/newview/skins/default/xui/it/menu_picks_plus.xml
index d758a9715e..7fbd5abd57 100644
--- a/indra/newview/skins/default/xui/it/menu_picks_plus.xml
+++ b/indra/newview/skins/default/xui/it/menu_picks_plus.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="picks_plus_menu">
- <menu_item_call label="Nuovo luogo consigliato" name="create_pick"/>
- <menu_item_call label="Nuovo Annuncio" name="create_classified"/>
+ <menu_item_call label="Nuovo luogo preferito" name="create_pick"/>
+ <menu_item_call label="Nuovo annuncio" name="create_classified"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_place.xml b/indra/newview/skins/default/xui/it/menu_place.xml
index 5b9261b159..5381a4effa 100644
--- a/indra/newview/skins/default/xui/it/menu_place.xml
+++ b/indra/newview/skins/default/xui/it/menu_place.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="place_overflow_menu">
- <menu_item_call label="Prendi il Landmark" name="landmark"/>
- <menu_item_call label="Crea luogo consigliato" name="pick"/>
- <menu_item_call label="Compra Permesso" name="pass"/>
+ <menu_item_call label="Salva come punto di riferimento" name="landmark"/>
+ <menu_item_call label="Crea Luogo consigliato" name="pick"/>
+ <menu_item_call label="Acquista Permesso" name="pass"/>
<menu_item_call label="Modifica" name="edit"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_place_add_button.xml b/indra/newview/skins/default/xui/it/menu_place_add_button.xml
index 6dd10f422e..0e783c0000 100644
--- a/indra/newview/skins/default/xui/it/menu_place_add_button.xml
+++ b/indra/newview/skins/default/xui/it/menu_place_add_button.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_folder_gear">
<menu_item_call label="Aggiungi cartella" name="add_folder"/>
- <menu_item_call label="Aggiungi landmark" name="add_landmark"/>
+ <menu_item_call label="Aggiungi punto di riferimento" name="add_landmark"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/it/menu_places_gear_folder.xml
index 45765bf77d..59fbb86ddc 100644
--- a/indra/newview/skins/default/xui/it/menu_places_gear_folder.xml
+++ b/indra/newview/skins/default/xui/it/menu_places_gear_folder.xml
@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_folder_gear">
- <menu_item_call label="Aggiungi Landmark" name="add_landmark"/>
+ <menu_item_call label="Aggiungi punto di riferimento" name="add_landmark"/>
<menu_item_call label="Aggiungi cartella" name="add_folder"/>
<menu_item_call label="Taglia" name="cut"/>
<menu_item_call label="Copia" name="copy_folder"/>
<menu_item_call label="Incolla" name="paste"/>
- <menu_item_call label="Rinomina" name="rename"/>
- <menu_item_call label="Cancella" name="delete"/>
- <menu_item_call label="Apri" name="expand"/>
- <menu_item_call label="Chiudi" name="collapse"/>
+ <menu_item_call label="Modifica nome" name="rename"/>
+ <menu_item_call label="Elimina" name="delete"/>
+ <menu_item_call label="Espandi" name="expand"/>
+ <menu_item_call label="Comprimi" name="collapse"/>
<menu_item_call label="Apri tutte le cartelle" name="expand_all"/>
<menu_item_call label="Chiudi tutte le cartelle" name="collapse_all"/>
- <menu_item_check label="Ordina per data" name="sort_by_date"/>
+ <menu_item_check label="Ordina in base alla data" name="sort_by_date"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/it/menu_places_gear_landmark.xml
index 2c5b8a848c..32d7abc259 100644
--- a/indra/newview/skins/default/xui/it/menu_places_gear_landmark.xml
+++ b/indra/newview/skins/default/xui/it/menu_places_gear_landmark.xml
@@ -1,18 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_ladmark_gear">
<menu_item_call label="Teleport" name="teleport"/>
- <menu_item_call label="Maggiori Informazioni" name="more_info"/>
- <menu_item_call label="Mostra sulla Mappa" name="show_on_map"/>
- <menu_item_call label="Aggiungi Landmark" name="add_landmark"/>
- <menu_item_call label="Aggiungi Cartella" name="add_folder"/>
+ <menu_item_call label="Maggiori informazioni" name="more_info"/>
+ <menu_item_call label="Mostra sulla mappa" name="show_on_map"/>
+ <menu_item_call label="Aggiungi Punto di riferimento" name="add_landmark"/>
+ <menu_item_call label="Aggiungi cartella" name="add_folder"/>
<menu_item_call label="Taglia" name="cut"/>
- <menu_item_call label="Copia Landmark" name="copy_landmark"/>
+ <menu_item_call label="Copia punto di riferimento" name="copy_landmark"/>
<menu_item_call label="Copia SLurl" name="copy_slurl"/>
<menu_item_call label="Incolla" name="paste"/>
- <menu_item_call label="Rinomina" name="rename"/>
- <menu_item_call label="Cancella" name="delete"/>
+ <menu_item_call label="Modifica nome" name="rename"/>
+ <menu_item_call label="Elimina" name="delete"/>
<menu_item_call label="Apri tutte le cartelle" name="expand_all"/>
<menu_item_call label="Chiudi tutte le cartelle" name="collapse_all"/>
- <menu_item_check label="Ordina per Data" name="sort_by_date"/>
- <menu_item_call label="Crea Luogo Consigliato" name="create_pick"/>
+ <menu_item_check label="Ordina in base alla data" name="sort_by_date"/>
+ <menu_item_call label="Crea Luogo consigliato" name="create_pick"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_profile_overflow.xml b/indra/newview/skins/default/xui/it/menu_profile_overflow.xml
index 76a04a127e..56b695c597 100644
--- a/indra/newview/skins/default/xui/it/menu_profile_overflow.xml
+++ b/indra/newview/skins/default/xui/it/menu_profile_overflow.xml
@@ -1,5 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="profile_overflow_menu">
+ <menu_item_call label="Mappa" name="show_on_map"/>
<menu_item_call label="Paga" name="pay"/>
<menu_item_call label="Condividi" name="share"/>
+ <menu_item_call label="Blocca" name="block"/>
+ <menu_item_call label="Sblocca" name="unblock"/>
+ <menu_item_call label="Espelli" name="kick"/>
+ <menu_item_call label="Congela" name="freeze"/>
+ <menu_item_call label="Scongela" name="unfreeze"/>
+ <menu_item_call label="CSR" name="csr"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_save_outfit.xml b/indra/newview/skins/default/xui/it/menu_save_outfit.xml
new file mode 100644
index 0000000000..4882a8ac64
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_save_outfit.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="save_outfit_menu">
+ <menu_item_call label="Salva" name="save_outfit"/>
+ <menu_item_call label="Salva con nome" name="save_as_new_outfit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_script_chiclet.xml b/indra/newview/skins/default/xui/it/menu_script_chiclet.xml
new file mode 100644
index 0000000000..604f754ba8
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_script_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="ScriptChiclet Menu">
+ <menu_item_call label="Chiudi" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_teleport_history_gear.xml b/indra/newview/skins/default/xui/it/menu_teleport_history_gear.xml
index 71acda5a9d..409a62c31b 100644
--- a/indra/newview/skins/default/xui/it/menu_teleport_history_gear.xml
+++ b/indra/newview/skins/default/xui/it/menu_teleport_history_gear.xml
@@ -2,5 +2,5 @@
<menu name="Teleport History Gear Context Menu">
<menu_item_call label="Apri tutte le cartelle" name="Expand all folders"/>
<menu_item_call label="Chiudi tutte le cartelle" name="Collapse all folders"/>
- <menu_item_call label="Cancella la storia dei Teleport" name="Clear Teleport History"/>
+ <menu_item_call label="Cancella la cronologia Teleport" name="Clear Teleport History"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/it/menu_teleport_history_item.xml
index c01230584b..81053fbd65 100644
--- a/indra/newview/skins/default/xui/it/menu_teleport_history_item.xml
+++ b/indra/newview/skins/default/xui/it/menu_teleport_history_item.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Teleport History Item Context Menu">
<menu_item_call label="Teleport" name="Teleport"/>
- <menu_item_call label="Più informazioni" name="More Information"/>
+ <menu_item_call label="Maggiori informazioni" name="More Information"/>
<menu_item_call label="Copia negli appunti" name="CopyToClipboard"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_text_editor.xml b/indra/newview/skins/default/xui/it/menu_text_editor.xml
index baab233a21..4636ce9929 100644
--- a/indra/newview/skins/default/xui/it/menu_text_editor.xml
+++ b/indra/newview/skins/default/xui/it/menu_text_editor.xml
@@ -3,6 +3,6 @@
<menu_item_call label="Taglia" name="Cut"/>
<menu_item_call label="Copia" name="Copy"/>
<menu_item_call label="Incolla" name="Paste"/>
- <menu_item_call label="Cancella" name="Delete"/>
- <menu_item_call label="Seleziona Tutto" name="Select All"/>
+ <menu_item_call label="Elimina" name="Delete"/>
+ <menu_item_call label="Seleziona tutto" name="Select All"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_url_agent.xml b/indra/newview/skins/default/xui/it/menu_url_agent.xml
index 874f7a8df9..37755d5749 100644
--- a/indra/newview/skins/default/xui/it/menu_url_agent.xml
+++ b/indra/newview/skins/default/xui/it/menu_url_agent.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Url Popup">
- <menu_item_call label="Mostra profilo" name="show_agent"/>
- <menu_item_call label="Copia nome negli appunti" name="url_copy_label"/>
- <menu_item_call label="Copia SLurl negli appunti" name="url_copy"/>
+ <menu_item_call label="Mostra profilo residente" name="show_agent"/>
+ <menu_item_call label="Copia nome negli Appunti" name="url_copy_label"/>
+ <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_url_group.xml b/indra/newview/skins/default/xui/it/menu_url_group.xml
index ac9dab2b3c..d9a792ebdf 100644
--- a/indra/newview/skins/default/xui/it/menu_url_group.xml
+++ b/indra/newview/skins/default/xui/it/menu_url_group.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Url Popup">
- <menu_item_call label="Mostra info gruppo" name="show_group"/>
- <menu_item_call label="Copia gruppo negli appunti" name="url_copy_label"/>
- <menu_item_call label="Copia SLurl negli appunti" name="url_copy"/>
+ <menu_item_call label="Mostra informazioni gruppo" name="show_group"/>
+ <menu_item_call label="Copia gruppo negli Appunti" name="url_copy_label"/>
+ <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_url_http.xml b/indra/newview/skins/default/xui/it/menu_url_http.xml
index b8f965f2d6..e0153d9169 100644
--- a/indra/newview/skins/default/xui/it/menu_url_http.xml
+++ b/indra/newview/skins/default/xui/it/menu_url_http.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Url Popup">
- <menu_item_call label="Apri pagina web" name="url_open"/>
+ <menu_item_call label="Apri pagina Web" name="url_open"/>
<menu_item_call label="Apri nel browser interno" name="url_open_internal"/>
<menu_item_call label="Apri nel browser esterno" name="url_open_external"/>
- <menu_item_call label="Copia URL negli appunti" name="url_copy"/>
+ <menu_item_call label="Copia URL negli Appunti" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_url_inventory.xml b/indra/newview/skins/default/xui/it/menu_url_inventory.xml
index 0b410b4eff..a45a6bbc10 100644
--- a/indra/newview/skins/default/xui/it/menu_url_inventory.xml
+++ b/indra/newview/skins/default/xui/it/menu_url_inventory.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Url Popup">
- <menu_item_call label="Mostra elemento dell&apos;inventory" name="show_item"/>
- <menu_item_call label="Copia nome negli appunti" name="url_copy_label"/>
- <menu_item_call label="Copia SLurl negli appunti" name="url_copy"/>
+ <menu_item_call label="Mostra oggetto dell&apos;inventario" name="show_item"/>
+ <menu_item_call label="Copia nome negli Appunti" name="url_copy_label"/>
+ <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_url_map.xml b/indra/newview/skins/default/xui/it/menu_url_map.xml
index 096efcd1b9..cb7935b3ed 100644
--- a/indra/newview/skins/default/xui/it/menu_url_map.xml
+++ b/indra/newview/skins/default/xui/it/menu_url_map.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Url Popup">
<menu_item_call label="Mostra sulla mappa" name="show_on_map"/>
- <menu_item_call label="Teleportati nel luogo" name="teleport_to_location"/>
- <menu_item_call label="Copia SLurl negli appunti" name="url_copy"/>
+ <menu_item_call label="Teleport al luogo" name="teleport_to_location"/>
+ <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_url_objectim.xml b/indra/newview/skins/default/xui/it/menu_url_objectim.xml
index 67a9f0b914..763e65f17c 100644
--- a/indra/newview/skins/default/xui/it/menu_url_objectim.xml
+++ b/indra/newview/skins/default/xui/it/menu_url_objectim.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Url Popup">
- <menu_item_call label="Mostra info oggetto" name="show_object"/>
+ <menu_item_call label="Mostra informazioni oggetto" name="show_object"/>
<menu_item_call label="Mostra sulla mappa" name="show_on_map"/>
- <menu_item_call label="Teleportati sul luogo dell&apos;oggetto" name="teleport_to_object"/>
- <menu_item_call label="Copia nome oggetto negli appunti" name="url_copy_label"/>
- <menu_item_call label="Copia SLurl negli appunti" name="url_copy"/>
+ <menu_item_call label="Teleport sul luogo dell&apos;oggetto" name="teleport_to_object"/>
+ <menu_item_call label="Copia nome oggetto negli Appunti" name="url_copy_label"/>
+ <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_url_parcel.xml b/indra/newview/skins/default/xui/it/menu_url_parcel.xml
index e40d05f423..a032c33585 100644
--- a/indra/newview/skins/default/xui/it/menu_url_parcel.xml
+++ b/indra/newview/skins/default/xui/it/menu_url_parcel.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Url Popup">
- <menu_item_call label="Mostra info appezzamento" name="show_parcel"/>
+ <menu_item_call label="Mostra informazioni lotto" name="show_parcel"/>
<menu_item_call label="Mostra sulla mappa" name="show_on_map"/>
- <menu_item_call label="Copia SLurl negli appunti" name="url_copy"/>
+ <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_url_slapp.xml b/indra/newview/skins/default/xui/it/menu_url_slapp.xml
index 2e5ad64a59..b368aa9141 100644
--- a/indra/newview/skins/default/xui/it/menu_url_slapp.xml
+++ b/indra/newview/skins/default/xui/it/menu_url_slapp.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Url Popup">
- <menu_item_call label="Lancia questo comando" name="run_slapp"/>
- <menu_item_call label="Copia SLurl negli appunti" name="url_copy"/>
+ <menu_item_call label="Esegui questo comando" name="run_slapp"/>
+ <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_url_slurl.xml b/indra/newview/skins/default/xui/it/menu_url_slurl.xml
index 1850252669..355c7dbed9 100644
--- a/indra/newview/skins/default/xui/it/menu_url_slurl.xml
+++ b/indra/newview/skins/default/xui/it/menu_url_slurl.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Url Popup">
- <menu_item_call label="Mostra info del luogo" name="show_place"/>
+ <menu_item_call label="Mostra informazioni del luogo" name="show_place"/>
<menu_item_call label="Mostra sulla mappa" name="show_on_map"/>
- <menu_item_call label="Teleporta nel luogo" name="teleport_to_location"/>
- <menu_item_call label="Copia SLurl negli appunti" name="url_copy"/>
+ <menu_item_call label="Teleport al luogo" name="teleport_to_location"/>
+ <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_url_teleport.xml b/indra/newview/skins/default/xui/it/menu_url_teleport.xml
index 0a09090c26..c129e61f25 100644
--- a/indra/newview/skins/default/xui/it/menu_url_teleport.xml
+++ b/indra/newview/skins/default/xui/it/menu_url_teleport.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Url Popup">
- <menu_item_call label="Teleportati in questo posto" name="teleport"/>
- <menu_item_call label="Mostra Sulla mappa" name="show_on_map"/>
- <menu_item_call label="Copia SLurl negli appunti" name="url_copy"/>
+ <menu_item_call label="Teleport a questa destinazione" name="teleport"/>
+ <menu_item_call label="Mostra sulla mappa" name="show_on_map"/>
+ <menu_item_call label="Copia SLurl negli Appunti" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/it/menu_viewer.xml b/indra/newview/skins/default/xui/it/menu_viewer.xml
index f9605da22a..693f4f158e 100644
--- a/indra/newview/skins/default/xui/it/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/it/menu_viewer.xml
@@ -2,161 +2,154 @@
<menu_bar name="Main Menu">
<menu label="Io" name="Me">
<menu_item_call label="Preferenze" name="Preferences"/>
- <menu_item_call label="Il mio Pannello di Controllo" name="Manage My Account">
+ <menu_item_call label="Il mio Dashboard" name="Manage My Account">
<menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=it"/>
</menu_item_call>
<menu_item_call label="Compra L$" name="Buy and Sell L$"/>
- <menu_item_call label="Il Mio Profilo" name="Profile"/>
- <menu_item_call label="Il Mio Aspetto" name="Appearance"/>
- <menu_item_check label="Il Mio Inventory" name="Inventory"/>
- <menu_item_call label="Mostra Inventory su Barra Laterale" name="ShowSidetrayInventory"/>
- <menu_item_call label="Le mie Gesture" name="Gestures"/>
- <menu label="Il Mio Stato" name="Status">
- <menu_item_call label="Non Disponibile" name="Set Away"/>
- <menu_item_call label="Non Disponibile" name="Set Busy"/>
+ <menu_item_call label="Il mio profilo" name="Profile"/>
+ <menu_item_call label="Cambia vestiario" name="ChangeOutfit"/>
+ <menu_item_check label="Il mio inventario" name="Inventory"/>
+ <menu_item_check label="Il mio inventario" name="ShowSidetrayInventory"/>
+ <menu_item_check label="Le mie gesture" name="Gestures"/>
+ <menu_item_check label="La mia voce" name="ShowVoice"/>
+ <menu label="Il mio stato" name="Status">
+ <menu_item_call label="Assente" name="Set Away"/>
+ <menu_item_call label="Non disponibile" name="Set Busy"/>
</menu>
- <menu_item_call label="Richiedi Status Amministratore" name="Request Admin Options"/>
- <menu_item_call label="Lascia Status Amministratore" name="Leave Admin Options"/>
+ <menu_item_call label="Richiedi diritti Admin" name="Request Admin Options"/>
+ <menu_item_call label="Lascia stato Admin" name="Leave Admin Options"/>
<menu_item_call label="Esci da [APP_NAME]" name="Quit"/>
</menu>
<menu label="Comunica" name="Communicate">
- <menu_item_call label="I Miei Amici" name="My Friends"/>
- <menu_item_call label="I Miei Gruppi" name="My Groups"/>
- <menu_item_check label="Chat Limitrofa" name="Nearby Chat"/>
- <menu_item_call label="Persone Vicine" name="Active Speakers"/>
- <menu_item_check label="MultiMedia Vicini" name="Nearby Media"/>
+ <menu_item_call label="I miei amici..." name="My Friends"/>
+ <menu_item_call label="I miei gruppi" name="My Groups"/>
+ <menu_item_check label="Chat nei dintorni" name="Nearby Chat"/>
+ <menu_item_call label="Persone vicine" name="Active Speakers"/>
</menu>
<menu label="Mondo" name="World">
- <menu_item_check label="Muovi" name="Movement Controls"/>
- <menu_item_check label="Vista" name="Camera Controls"/>
- <menu_item_call label="Info Terreno" name="About Land"/>
- <menu_item_call label="Regione/Proprietà Immobiliari" name="Region/Estate"/>
- <menu_item_call label="Compra Terreno" name="Buy Land"/>
- <menu_item_call label="Il Mio Terreno" name="My Land"/>
- <menu label="Mostra" name="Land">
- <menu_item_check label="Linee Non Accessibili" name="Ban Lines"/>
- <menu_item_check label="Segnalatori" name="beacons"/>
- <menu_item_check label="Linee di Confine" name="Property Lines"/>
- <menu_item_check label="Proprietari della Terra" name="Land Owners"/>
+ <menu_item_check label="Mini mappa" name="Mini-Map"/>
+ <menu_item_check label="Mappa del mondo" name="World Map"/>
+ <menu_item_call label="Istantanea" name="Take Snapshot"/>
+ <menu_item_call label="Crea punto di riferimento per questo luogo" name="Create Landmark Here"/>
+ <menu label="Profilo del luogo" name="Land">
+ <menu_item_call label="Profilo del luogo" name="Place Profile"/>
+ <menu_item_call label="Informazioni sui terreni" name="About Land"/>
+ <menu_item_call label="Regione/proprietà immobiliare" name="Region/Estate"/>
</menu>
- <menu label="Landmark" name="Landmarks">
- <menu_item_call label="Crea Landmark Qui" name="Create Landmark Here"/>
- <menu_item_call label="Imposta Qui come Casa" name="Set Home to Here"/>
+ <menu_item_call label="Acquista questo terreno" name="Buy Land"/>
+ <menu_item_call label="Il mio terreno" name="My Land"/>
+ <menu label="Mostra" name="LandShow">
+ <menu_item_check label="Comandi del movimento" name="Movement Controls"/>
+ <menu_item_check label="Comandi visualizzazione" name="Camera Controls"/>
+ <menu_item_check label="Linee di divieto" name="Ban Lines"/>
+ <menu_item_check label="Marcatori" name="beacons"/>
+ <menu_item_check label="Linee di confine" name="Property Lines"/>
+ <menu_item_check label="Proprietari di terreno" name="Land Owners"/>
+ <menu_item_check label="Coordinate" name="Coordinates"/>
+ <menu_item_check label="Proprietà del lotto" name="Parcel Properties"/>
</menu>
- <menu_item_call label="Teleport Casa" name="Teleport Home"/>
- <menu_item_check label="Mini-Mappa" name="Mini-Map"/>
- <menu_item_check label="Mappa del Mondo" name="World Map"/>
- <menu_item_call label="Foto" name="Take Snapshot"/>
+ <menu_item_call label="Teleport a Casa" name="Teleport Home"/>
+ <menu_item_call label="Imposta come Casa mia" name="Set Home to Here"/>
<menu label="Sole" name="Environment Settings">
<menu_item_call label="Alba" name="Sunrise"/>
<menu_item_call label="Mezzogiorno" name="Noon"/>
<menu_item_call label="Tramonto" name="Sunset"/>
<menu_item_call label="Mezzanotte" name="Midnight"/>
- <menu_item_call label="Usa l&apos;ora della Proprietà" name="Revert to Region Default"/>
+ <menu_item_call label="Orario della proprietà" name="Revert to Region Default"/>
<menu_item_call label="Editor dell&apos;ambiente" name="Environment Editor"/>
</menu>
</menu>
- <menu label="Build" name="BuildTools">
- <menu_item_check label="Build" name="Show Build Tools"/>
- <menu label="Seleziona Strumento Build" name="Select Tool">
- <menu_item_call label="Strumento Focalizza" name="Focus"/>
+ <menu label="Costruisci" name="BuildTools">
+ <menu_item_check label="Costruisci" name="Show Build Tools"/>
+ <menu label="Seleziona strumento di costruzione" name="Select Tool">
+ <menu_item_call label="Strumento Ingrandisci" name="Focus"/>
<menu_item_call label="Strumento Movimento" name="Move"/>
<menu_item_call label="Strumento Modifica" name="Edit"/>
- <menu_item_call label="Crea Strumento" name="Create"/>
+ <menu_item_call label="Strumento Crea" name="Create"/>
<menu_item_call label="Strumento Terreno" name="Land"/>
</menu>
- <menu label="Modifica" name="Edit">
- <menu_item_call label="Annulla" name="Undo"/>
- <menu_item_call label="Rifai" name="Redo"/>
- <menu_item_call label="Taglia" name="Cut"/>
- <menu_item_call label="Copia" name="Copy"/>
- <menu_item_call label="Incolla" name="Paste"/>
- <menu_item_call label="Cancella" name="Delete"/>
- <menu_item_call label="Duplica" name="Duplicate"/>
- <menu_item_call label="Seleziona Tutto" name="Select All"/>
- <menu_item_call label="Deseleziona" name="Deselect"/>
+ <menu_item_call label="Collegamento" name="Link"/>
+ <menu_item_call label="Scollega" name="Unlink"/>
+ <menu_item_check label="Modifica le parti collegate" name="Edit Linked Parts"/>
+ <menu label="Seleziona parti collegate" name="Select Linked Parts">
+ <menu_item_call label="Seleziona parte successiva" name="Select Next Part"/>
+ <menu_item_call label="Seleziona parte precedente" name="Select Previous Part"/>
+ <menu_item_call label="Includi parte successiva" name="Include Next Part"/>
+ <menu_item_call label="Includi parte precedente" name="Include Previous Part"/>
</menu>
- <menu_item_call label="Unisci" name="Link"/>
- <menu_item_call label="Separa" name="Unlink"/>
- <menu_item_call label="Focalizza su Selezione" name="Focus on Selection"/>
- <menu_item_call label="Avvicina alla Selezione" name="Zoom to Selection"/>
+ <menu_item_call label="Ingrandisci selezione" name="Focus on Selection"/>
+ <menu_item_call label="Zoom sulla selezione" name="Zoom to Selection"/>
<menu label="Oggetto" name="Object">
- <menu_item_call label="Compra" name="Menu Object Take"/>
- <menu_item_call label="Prendi Copia" name="Take Copy"/>
- <menu_item_call label="Salva Nuovamente nell&apos;Inventory" name="Save Object Back to My Inventory"/>
- <menu_item_call label="Salva Nuovamente Nel Contenuto Oggetto" name="Save Object Back to Object Contents"/>
+ <menu_item_call label="Acquista" name="Menu Object Buy"/>
+ <menu_item_call label="Prendi" name="Menu Object Take"/>
+ <menu_item_call label="Prendi copia" name="Take Copy"/>
+ <menu_item_call label="Salva nell&apos;inventario" name="Save Object Back to My Inventory"/>
+ <menu_item_call label="Salva nei contenuti oggetto" name="Save Object Back to Object Contents"/>
</menu>
<menu label="Script" name="Scripts">
- <menu_item_call label="Ricompila Script (Mono)" name="Mono"/>
- <menu_item_call label="Ricompila gli Script(LSL)" name="LSL"/>
- <menu_item_call label="Reimposta gli Script" name="Reset Scripts"/>
- <menu_item_call label="Imposta gli Script in Esecuzione" name="Set Scripts to Running"/>
- <menu_item_call label="Imposta gli Script Non In Esecuzione" name="Set Scripts to Not Running"/>
+ <menu_item_call label="Ricompila script (Mono)" name="Mono"/>
+ <menu_item_call label="Ricompila gli script (LSL)" name="LSL"/>
+ <menu_item_call label="Reimposta script" name="Reset Scripts"/>
+ <menu_item_call label="Imposta gli script come in esecuzione" name="Set Scripts to Running"/>
+ <menu_item_call label="Imposta script come non in esecuzione" name="Set Scripts to Not Running"/>
</menu>
<menu label="Opzioni" name="Options">
- <menu_item_check label="Modifica Parti Unite" name="Edit Linked Parts"/>
- <menu_item_call label="Imposta Permessi di Upload predefiniti" name="perm prefs"/>
- <menu_item_check label="Mostra Permessi Avanzati" name="DebugPermissions"/>
- <menu label="Selezione" name="Selection">
- <menu_item_check label="Seleziona Solo i Miei Oggetti" name="Select Only My Objects"/>
- <menu_item_check label="Seleziona Solo Oggetti Mobili" name="Select Only Movable Objects"/>
- <menu_item_check label="Seleziona Se Racchiuso" name="Select By Surrounding"/>
- </menu>
- <menu label="Mostra" name="Show">
- <menu_item_check label="Mostra Selezione Nascosta" name="Show Hidden Selection"/>
- <menu_item_check label="Mostra Raggio Luce per Selezione" name="Show Light Radius for Selection"/>
- <menu_item_check label="Mostra Raggio Selezione" name="Show Selection Beam"/>
- </menu>
- <menu label="Griglia" name="Grid">
- <menu_item_check label="Allinea al Righello" name="Snap to Grid"/>
- <menu_item_call label="Allinea Coordinate XY alla Griglia" name="Snap Object XY to Grid"/>
- <menu_item_call label="Usa Selezione per la Griglia" name="Use Selection for Grid"/>
- <menu_item_call label="Opzioni Griglia" name="Grid Options"/>
- </menu>
+ <menu_item_call label="Definisci diritti di caricamento predefiniti" name="perm prefs"/>
+ <menu_item_check label="Mostra autorizzazioni avanzate" name="DebugPermissions"/>
+ <menu_item_check label="Seleziona solo i miei oggetti" name="Select Only My Objects"/>
+ <menu_item_check label="Seleziona solo gli oggetti spostabili" name="Select Only Movable Objects"/>
+ <menu_item_check label="Seleziona circostante" name="Select By Surrounding"/>
+ <menu_item_check label="Seleziona mostra nascosti" name="Show Hidden Selection"/>
+ <menu_item_check label="Seleziona mostra il raggio luminoso per la selezione" name="Show Light Radius for Selection"/>
+ <menu_item_check label="Mostra il raggio indicatore" name="Show Selection Beam"/>
+ <menu_item_check label="Posiziona nella griglia" name="Snap to Grid"/>
+ <menu_item_call label="Posiziona coordinate XY dell&apos;oggetto sulla griglia" name="Snap Object XY to Grid"/>
+ <menu_item_call label="Usa la selezione per la griglia" name="Use Selection for Grid"/>
+ <menu_item_call label="Opzioni della griglia" name="Grid Options"/>
</menu>
- <menu label="Seleziona Parti Unite" name="Select Linked Parts">
- <menu_item_call label="Seleziona Prossima Parte" name="Select Next Part"/>
- <menu_item_call label="Seleziona Parte Precedente" name="Select Previous Part"/>
- <menu_item_call label="Includi Prossima Parte" name="Include Next Part"/>
- <menu_item_call label="Includi Parte Precedente" name="Include Previous Part"/>
+ <menu label="Carica sul server" name="Upload">
+ <menu_item_call label="Immagine ([COST] L$)..." name="Upload Image"/>
+ <menu_item_call label="Suono ([COST] L$)..." name="Upload Sound"/>
+ <menu_item_call label="Animazione ([COST] L$)..." name="Upload Animation"/>
+ <menu_item_call label="In blocco ([COST] L$ per file)..." name="Bulk Upload"/>
</menu>
</menu>
<menu label="Aiuto" name="Help">
- <menu_item_call label="[SECOND_LIFE] Aiuto" name="Second Life Help"/>
- <menu_item_call label="Tutorial" name="Tutorial"/>
- <menu_item_call label="Denuncia Abuso" name="Report Abuse"/>
- <menu_item_call label="Segnala Bug" name="Report Bug"/>
+ <menu_item_call label="Aiuto di [SECOND_LIFE]" name="Second Life Help"/>
+ <menu_item_call label="Segnala abuso" name="Report Abuse"/>
+ <menu_item_call label="Segnala bug" name="Report Bug"/>
+ <menu_item_call label="Informazioni su [APP_NAME]" name="About Second Life"/>
</menu>
- <menu label="Avanzato" name="Advanced">
- <menu_item_check label="Imposta non disponibile dopo 30 Minuti" name="Go Away/AFK When Idle"/>
- <menu_item_call label="Ferma le Animazioni" name="Stop Animating My Avatar"/>
- <menu_item_call label="Ridisegna le Texture" name="Rebake Texture"/>
- <menu_item_call label="Riporta le Dimensioni dell&apos;interfaccia ai Valori Predefiniti" name="Set UI Size to Default"/>
- <menu_item_check label="Limita Distanza di Selezione" name="Limit Select Distance"/>
- <menu_item_check label="Disabilita i Vincoli della Camera" name="Disable Camera Distance"/>
+ <menu label="Avanzate" name="Advanced">
+ <menu_item_check label="Mostra menu Avanzato" name="Show Advanced Menu"/>
+ <menu_item_call label="Ferma animazione" name="Stop Animating My Avatar"/>
+ <menu_item_call label="Ridisegna le texture" name="Rebake Texture"/>
+ <menu_item_call label="Imposta dimensioni dell&apos;interfaccia sui valori predefiniti" name="Set UI Size to Default"/>
+ <menu_item_call label="Imposta dimensioni della finestra..." name="Set Window Size..."/>
+ <menu_item_check label="Limita distanza di selezione" name="Limit Select Distance"/>
+ <menu_item_check label="Disabilita vincoli fotocamera" name="Disable Camera Distance"/>
<menu_item_check label="Foto ad alta risoluzione" name="HighResSnapshot"/>
- <menu_item_check label="Manda Foto su Disco Senza Avvisi" name="QuietSnapshotsToDisk"/>
- <menu_item_check label="Comprimi le Foto su Disco" name="CompressSnapshotsToDisk"/>
- <menu label="Strumenti di Performance" name="Performance Tools">
- <menu_item_call label="Misuratore Lag" name="Lag Meter"/>
- <menu_item_check label="Barra Statistiche" name="Statistics Bar"/>
- <menu_item_check label="Mostra Il Costo Visualizzazione Avatar (ARC)" name="Avatar Rendering Cost"/>
+ <menu_item_check label="Manda foto su disco senza avvisi" name="QuietSnapshotsToDisk"/>
+ <menu_item_check label="Comprimi le foto su disco" name="CompressSnapshotsToDisk"/>
+ <menu label="Strumenti di performance" name="Performance Tools">
+ <menu_item_call label="Misuratore lag" name="Lag Meter"/>
+ <menu_item_check label="Barra statistiche" name="Statistics Bar"/>
+ <menu_item_check label="Mostra costo di rendering dell&apos;avatar" name="Avatar Rendering Cost"/>
</menu>
- <menu label="Evidenziazione e Visibilità" name="Highlighting and Visibility">
- <menu_item_check label="Effetto Lampeggiante Segnalatore" name="Cheesy Beacon"/>
- <menu_item_check label="Nascondi Particelle" name="Hide Particles"/>
- <menu_item_check label="Nascondi Selezionati" name="Hide Selected"/>
- <menu_item_check label="Evidenzia Trasparente" name="Highlight Transparent"/>
- <menu_item_check label="Mostra Attachment HUD" name="Show HUD Attachments"/>
- <menu_item_check label="Mostra Mirino in Soggettiva" name="ShowCrosshairs"/>
- <menu_item_check label="Mostra Tooltip sul Terreno" name="Land Tips"/>
+ <menu label="Evidenziazione e visibilità" name="Highlighting and Visibility">
+ <menu_item_check label="Effetto marcatore lampeggiante" name="Cheesy Beacon"/>
+ <menu_item_check label="Nascondi particelle" name="Hide Particles"/>
+ <menu_item_check label="Nascondi selezionati" name="Hide Selected"/>
+ <menu_item_check label="Evidenzia trasparenza" name="Highlight Transparent"/>
+ <menu_item_check label="Mostra elementi HUD" name="Show HUD Attachments"/>
+ <menu_item_check label="Mostra mirino visuale soggettiva" name="ShowCrosshairs"/>
</menu>
- <menu label="Modalità di Rendering" name="Rendering Types">
+ <menu label="Modalità di rendering" name="Rendering Types">
<menu_item_check label="Semplice" name="Simple"/>
- <menu_item_check label="Alfa (Trasparenza)" name="Alpha"/>
+ <menu_item_check label="Alpha (Trasparenza)" name="Alpha"/>
<menu_item_check label="Albero" name="Tree"/>
<menu_item_check label="Avatar" name="Character"/>
- <menu_item_check label="Superfici" name="SurfacePath"/>
+ <menu_item_check label="Superficie" name="SurfacePath"/>
<menu_item_check label="Cielo" name="Sky"/>
<menu_item_check label="Acqua" name="Water"/>
<menu_item_check label="Suolo" name="Ground"/>
@@ -166,161 +159,162 @@
<menu_item_check label="Particelle" name="Particles"/>
<menu_item_check label="Urti" name="Bump"/>
</menu>
- <menu label="Caratteristiche di Rendering" name="Rendering Features">
- <menu_item_check label="Interfaccia Utente" name="UI"/>
+ <menu label="Caratteristiche di rendering" name="Rendering Features">
+ <menu_item_check label="Interfaccia utente" name="UI"/>
<menu_item_check label="Selezionati" name="Selected"/>
<menu_item_check label="Evidenziato" name="Highlighted"/>
- <menu_item_check label="Texture Dinamiche" name="Dynamic Textures"/>
- <menu_item_check label="Ombre dei Piedi" name="Foot Shadows"/>
+ <menu_item_check label="Texture dinamiche" name="Dynamic Textures"/>
+ <menu_item_check label="Ombre dei piedi" name="Foot Shadows"/>
<menu_item_check label="Nebbia" name="Fog"/>
- <menu_item_check label="Oggetti Flessibili" name="Flexible Objects"/>
+ <menu_item_check label="Oggetti flessibili" name="Flexible Objects"/>
</menu>
- <menu_item_check label="Esegui Thread Multipli" name="Run Multiple Threads"/>
- <menu_item_call label="Pulisci la Cache di Gruppo" name="ClearGroupCache"/>
- <menu_item_check label="Fluidità Mouse" name="Mouse Smoothing"/>
- <menu_item_check label="Mostra IM nella Chat Limitrofa" name="IMInChat"/>
+ <menu_item_check label="Esegui thread multipli" name="Run Multiple Threads"/>
+ <menu_item_check label="Usa thread lettura plugin" name="Use Plugin Read Thread"/>
+ <menu_item_call label="Pulisci cache di gruppo" name="ClearGroupCache"/>
+ <menu_item_check label="Fluidità mouse" name="Mouse Smoothing"/>
<menu label="Scorciatoie" name="Shortcuts">
- <menu_item_check label="Ricerca" name="Search"/>
- <menu_item_call label="Rilascia Tasti" name="Release Keys"/>
- <menu_item_call label="Imposta dimensioni Interfacca a Valori Predefiniti" name="Set UI Size to Default"/>
- <menu_item_check label="Corri Sempre" name="Always Run"/>
+ <menu_item_call label="Immagine ([COST]L$)..." name="Upload Image"/>
+ <menu_item_check label="Cerca" name="Search"/>
+ <menu_item_call label="Rilascia tasti" name="Release Keys"/>
+ <menu_item_call label="Imposta dimensioni dell&apos;interfaccia sui valori predefiniti" name="Set UI Size to Default"/>
+ <menu_item_check label="Corri sempre" name="Always Run"/>
<menu_item_check label="Vola" name="Fly"/>
- <menu_item_call label="Chiudi Finestra" name="Close Window"/>
- <menu_item_call label="Chiudi Tutte le Finestre" name="Close All Windows"/>
- <menu_item_call label="Foto su Disco" name="Snapshot to Disk"/>
+ <menu_item_call label="Chiudi finestra" name="Close Window"/>
+ <menu_item_call label="Chiudi tutte le finestre" name="Close All Windows"/>
+ <menu_item_call label="Foto su disco" name="Snapshot to Disk"/>
<menu_item_call label="Soggettiva" name="Mouselook"/>
<menu_item_check label="Joystick Flycam" name="Joystick Flycam"/>
- <menu_item_call label="Reimposta Vista" name="Reset View"/>
- <menu_item_call label="Guarda l&apos;Ultimo che ha parlato" name="Look at Last Chatter"/>
- <menu label="Seleziona Strumento Build" name="Select Tool">
- <menu_item_call label="Strumento Focalizza" name="Focus"/>
+ <menu_item_call label="Reimposta vista" name="Reset View"/>
+ <menu_item_call label="Guarda l&apos;ultima conversazione" name="Look at Last Chatter"/>
+ <menu label="Seleziona strumento di costruzione" name="Select Tool">
+ <menu_item_call label="Strumento Ingrandisci" name="Focus"/>
<menu_item_call label="Strumento Movimento" name="Move"/>
<menu_item_call label="Strumento Modifica" name="Edit"/>
- <menu_item_call label="Crea Strumento" name="Create"/>
+ <menu_item_call label="Strumento Crea" name="Create"/>
<menu_item_call label="Strumento Terreno" name="Land"/>
</menu>
- <menu_item_call label="Avvicina" name="Zoom In"/>
- <menu_item_call label="Zoom Predefinito" name="Zoom Default"/>
- <menu_item_call label="Allontana" name="Zoom Out"/>
- <menu_item_call label="Alterna Schermo Intero" name="Toggle Fullscreen"/>
+ <menu_item_call label="Zoom avanti" name="Zoom In"/>
+ <menu_item_call label="Zoom predefinito" name="Zoom Default"/>
+ <menu_item_call label="Zoom indietro" name="Zoom Out"/>
</menu>
- <menu_item_call label="Mostra Impostazioni di Debug" name="Debug Settings"/>
- <menu_item_check label="Mostra Menu Sviluppo" name="Debug Mode"/>
+ <menu_item_call label="Mostra impostazioni di debug" name="Debug Settings"/>
+ <menu_item_check label="Mostra menu sviluppo" name="Debug Mode"/>
</menu>
<menu label="Sviluppo" name="Develop">
<menu label="Console" name="Consoles">
- <menu_item_check label="Console Texture" name="Texture Console"/>
+ <menu_item_check label="Console texture" name="Texture Console"/>
<menu_item_check label="Console di Debug" name="Debug Console"/>
- <menu_item_call label="Console Notifiche" name="Notifications"/>
- <menu_item_check label="Console Dimensioni Texture" name="Texture Size"/>
- <menu_item_check label="Console Categoria Texture" name="Texture Category"/>
- <menu_item_check label="Timer Veloci" name="Fast Timers"/>
+ <menu_item_call label="Console notifiche" name="Notifications"/>
+ <menu_item_check label="Console dimensioni texture" name="Texture Size"/>
+ <menu_item_check label="Console categoria texture" name="Texture Category"/>
+ <menu_item_check label="Timer veloci" name="Fast Timers"/>
<menu_item_check label="Memoria" name="Memory"/>
- <menu_item_call label="Info Regione Sulla Console di Debug" name="Region Info to Debug Console"/>
- <menu_item_check label="Camera" name="Camera"/>
+ <menu_item_call label="Informazioni regione sulla console di debug" name="Region Info to Debug Console"/>
+ <menu_item_check label="Fotocamera" name="Camera"/>
<menu_item_check label="Vento" name="Wind"/>
+ <menu_item_check label="Badge" name="Badge"/>
</menu>
- <menu label="Mostra Info" name="Display Info">
- <menu_item_check label="Mostra Tempo" name="Show Time"/>
- <menu_item_check label="Mostra Info Rendering" name="Show Render Info"/>
- <menu_item_check label="Mostra Colore sotto il Cursore" name="Show Color Under Cursor"/>
- <menu_item_check label="Mostra Aggiornamenti agli Oggetti" name="Show Updates"/>
+ <menu label="Mostra informazioni" name="Display Info">
+ <menu_item_check label="Mostra orario" name="Show Time"/>
+ <menu_item_check label="Mostra informazioni di rendering" name="Show Render Info"/>
+ <menu_item_check label="Mostra colore sotto il cursore" name="Show Color Under Cursor"/>
+ <menu_item_check label="Mostra aggiornamenti agli oggetti" name="Show Updates"/>
</menu>
- <menu label="Forza Errori" name="Force Errors">
- <menu_item_call label="Forza Breakpoint" name="Force Breakpoint"/>
+ <menu label="Forza un errore" name="Force Errors">
+ <menu_item_call label="Forza punto di rottura" name="Force Breakpoint"/>
<menu_item_call label="Forza LLError e Crash" name="Force LLError And Crash"/>
- <menu_item_call label="Forza Accesso Invalido alla Memoria" name="Force Bad Memory Access"/>
- <menu_item_call label="Forza Ciclo Infinito" name="Force Infinite Loop"/>
- <menu_item_call label="Forza il Crash del Driver" name="Force Driver Carsh"/>
- <menu_item_call label="Forza Eccezione Software" name="Force Software Exception"/>
- <menu_item_call label="Forza Disconnessione Viewer" name="Force Disconnect Viewer"/>
- <menu_item_call label="Simula un Memory Leak" name="Memory Leaking Simulation"/>
+ <menu_item_call label="Forza accesso non valido alla memoria" name="Force Bad Memory Access"/>
+ <menu_item_call label="Forza ciclo infinito" name="Force Infinite Loop"/>
+ <menu_item_call label="Forza il crash del driver" name="Force Driver Carsh"/>
+ <menu_item_call label="Forza eccezione software" name="Force Software Exception"/>
+ <menu_item_call label="Forza scollegamento viewer" name="Force Disconnect Viewer"/>
+ <menu_item_call label="Simula fuga di memoria" name="Memory Leaking Simulation"/>
</menu>
- <menu label="Test di Rendering" name="Render Tests">
- <menu_item_check label="Spostamento Camera" name="Camera Offset"/>
- <menu_item_check label="Framerate Casuale" name="Randomize Framerate"/>
- <menu_item_check label="Test Frame" name="Frame Test"/>
+ <menu label="Prove di rendering" name="Render Tests">
+ <menu_item_check label="Spostamento fotocamera" name="Camera Offset"/>
+ <menu_item_check label="Veloc. di visualizzazione casuale" name="Randomize Framerate"/>
+ <menu_item_check label="Test frame" name="Frame Test"/>
</menu>
<menu label="Rendering" name="Rendering">
<menu_item_check label="Assi" name="Axes"/>
<menu_item_check label="Wireframe" name="Wireframe"/>
- <menu_item_check label="Illuminazione Globale" name="Global Illumination"/>
- <menu_item_check label="Texture delle Animation" name="Animation Textures"/>
- <menu_item_check label="Disabilita Textures" name="Disable Textures"/>
- <menu_item_check label="Rendering Luci degli Attachment" name="Render Attached Lights"/>
- <menu_item_check label="Visualizza Particelle dagli Attachment" name="Render Attached Particles"/>
- <menu_item_check label="Gli Oggetti Brillano quando sono sotto il Cursore" name="Hover Glow Objects"/>
+ <menu_item_check label="Illuminazione globale" name="Global Illumination"/>
+ <menu_item_check label="Texture delle animazioni" name="Animation Textures"/>
+ <menu_item_check label="Disabilita texture" name="Disable Textures"/>
+ <menu_item_check label="Rendering delle luci unite" name="Render Attached Lights"/>
+ <menu_item_check label="Rendering particelle unite" name="Render Attached Particles"/>
+ <menu_item_check label="Gli oggetti brillano quando sono sotto il cursore" name="Hover Glow Objects"/>
</menu>
<menu label="Rete" name="Network">
- <menu_item_check label="Metti in Pausa Avatar" name="AgentPause"/>
- <menu_item_call label="Perdi un Pacchetto" name="Drop a Packet"/>
+ <menu_item_check label="Metti in pausa" name="AgentPause"/>
+ <menu_item_call label="Lascia un pacchetto" name="Drop a Packet"/>
</menu>
- <menu_item_call label="Urti, Spinte &amp; Contatti" name="Bumps, Pushes &amp;amp; Hits"/>
+ <menu_item_call label="Urti, spinte e contatti" name="Bumps, Pushes &amp;amp; Hits"/>
<menu label="Mondo" name="World">
- <menu_item_check label="Sostituisci al Sole della Regione" name="Sim Sun Override"/>
- <menu_item_check label="Effetto Lampeggiante Indicatore" name="Cheesy Beacon"/>
- <menu_item_check label="Fissa il Clima" name="Fixed Weather"/>
- <menu_item_call label="Stampa la Cache degli Oggetti in Regione" name="Dump Region Object Cache"/>
+ <menu_item_check label="Esclusione al sole della regione" name="Sim Sun Override"/>
+ <menu_item_check label="Effetto marcatore lampeggiante" name="Cheesy Beacon"/>
+ <menu_item_check label="Clima fisso" name="Fixed Weather"/>
+ <menu_item_call label="Dump della cache oggetti regione" name="Dump Region Object Cache"/>
</menu>
- <menu label="Interfaccia Utente" name="UI">
- <menu_item_call label="Test Browser Web" name="Web Browser Test"/>
- <menu_item_call label="Stampa Info per Oggetto Selezionato" name="Print Selected Object Info"/>
- <menu_item_call label="Statistiche Memoria" name="Memory Stats"/>
- <menu_item_check label="Doppio Click Pilota Automatico" name="Double-ClickAuto-Pilot"/>
- <menu_item_check label="Debug Click" name="Debug Clicks"/>
- <menu_item_check label="Debug Eventi del Mouse" name="Debug Mouse Events"/>
+ <menu label="Interfaccia utente" name="UI">
+ <menu_item_call label="Test browser Web" name="Web Browser Test"/>
+ <menu_item_call label="Stampa informazioni oggetto selezionato" name="Print Selected Object Info"/>
+ <menu_item_call label="Statistiche memoria" name="Memory Stats"/>
+ <menu_item_check label="Doppio clic pilota automatico" name="Double-ClickAuto-Pilot"/>
+ <menu_item_check label="Debug clic" name="Debug Clicks"/>
+ <menu_item_check label="Debug eventi mouse" name="Debug Mouse Events"/>
</menu>
<menu label="XUI" name="XUI">
- <menu_item_call label="Ricarica Impostazioni Colori" name="Reload Color Settings"/>
+ <menu_item_call label="Ricarica impostazioni colori" name="Reload Color Settings"/>
<menu_item_call label="Test Mostra Font" name="Show Font Test"/>
<menu_item_call label="Carica da XML" name="Load from XML"/>
<menu_item_call label="Salva in XML" name="Save to XML"/>
- <menu_item_check label="Mostra Nomi XUI" name="Show XUI Names"/>
- <menu_item_call label="Manda IM di Test" name="Send Test IMs"/>
+ <menu_item_check label="Mostra nomi XUI" name="Show XUI Names"/>
+ <menu_item_call label="Manda IM di prova" name="Send Test IMs"/>
</menu>
<menu label="Avatar" name="Character">
<menu label="Grab Baked Texture" name="Grab Baked Texture">
<menu_item_call label="Iride" name="Iris"/>
<menu_item_call label="Testa" name="Head"/>
- <menu_item_call label="Parte Superiore Corpo" name="Upper Body"/>
- <menu_item_call label="Parte Inferiore del Corpo" name="Lower Body"/>
+ <menu_item_call label="Parte superiore del corpo" name="Upper Body"/>
+ <menu_item_call label="Parte inferiore del corpo" name="Lower Body"/>
<menu_item_call label="Gonna" name="Skirt"/>
</menu>
- <menu label="Test Personaggio" name="Character Tests">
- <menu_item_call label="Alterna la Geometria dei Personaggi" name="Toggle Character Geometry"/>
- <menu_item_check label="Consenti Selezione Avatar" name="Allow Select Avatar"/>
+ <menu label="Test personaggio" name="Character Tests">
+ <menu_item_call label="Alterna la geometria dei personaggi" name="Toggle Character Geometry"/>
+ <menu_item_check label="Consenti selezione avatar" name="Allow Select Avatar"/>
</menu>
- <menu_item_call label="Forza i Parametri ai Valori Predefiniti" name="Force Params to Default"/>
- <menu_item_check label="Info delle Animation" name="Animation Info"/>
+ <menu_item_call label="Forza i parametri sui valori predefiniti" name="Force Params to Default"/>
+ <menu_item_check label="Informazioni sull&apos;animazione" name="Animation Info"/>
<menu_item_check label="Animazioni lente" name="Slow Motion Animations"/>
- <menu_item_check label="Disabilita Livello di Dettaglio" name="Disable LOD"/>
- <menu_item_check label="Mostra Schemi Collisione" name="Show Collision Skeleton"/>
- <menu_item_check label="Mostra Agent Destinazione" name="Display Agent Target"/>
- <menu_item_call label="Debug Texture dell&apos;Avatar" name="Debug Avatar Textures"/>
+ <menu_item_check label="Disabilita livello di dettaglio" name="Disable LOD"/>
+ <menu_item_check label="Mostra schemi collisione" name="Show Collision Skeleton"/>
+ <menu_item_check label="Mostra bersaglio" name="Display Agent Target"/>
+ <menu_item_call label="Debug texture dell&apos;avatar" name="Debug Avatar Textures"/>
</menu>
<menu_item_check label="Texture HTTP" name="HTTP Textures"/>
- <menu_item_check label="Finestra Console al Prossimo Lancio" name="Console Window"/>
- <menu_item_check label="Mostra Menu Admin" name="View Admin Options"/>
- <menu_item_call label="Richiedi Status Amministrator" name="Request Admin Options"/>
- <menu_item_call label="Lascia lo Stato di Admin" name="Leave Admin Options"/>
+ <menu_item_check label="Finestra Console al prossimo lancio" name="Console Window"/>
+ <menu_item_check label="Mostra menu Admin" name="View Admin Options"/>
+ <menu_item_call label="Richiedi diritti Admin" name="Request Admin Options"/>
+ <menu_item_call label="Lascia stato Admin" name="Leave Admin Options"/>
</menu>
- <menu label="Amministratore" name="Admin">
+ <menu label="Admin" name="Admin">
<menu label="Object">
- <menu_item_call label="Prendi Copia" name="Take Copy"/>
- <menu_item_call label="Rendimi Proprietario" name="Force Owner To Me"/>
- <menu_item_call label="Forza Proprietario Facoltativo?" name="Force Owner Permissive"/>
- <menu_item_call label="Cancella" name="Delete"/>
+ <menu_item_call label="Prendi copia" name="Take Copy"/>
+ <menu_item_call label="Rendimi proprietario" name="Force Owner To Me"/>
+ <menu_item_call label="Forza permesso proprietario" name="Force Owner Permissive"/>
+ <menu_item_call label="Elimina" name="Delete"/>
<menu_item_call label="Blocca" name="Lock"/>
</menu>
- <menu label="Appezzamento" name="Parcel">
- <menu_item_call label="Rendimi Proprietario" name="Owner To Me"/>
- <menu_item_call label="Imposta al Contenuto Linden" name="Set to Linden Content"/>
- <menu_item_call label="Prendi Terreno Pubblico" name="Claim Public Land"/>
+ <menu label="Lotto" name="Parcel">
+ <menu_item_call label="Rendimi proprietario" name="Owner To Me"/>
+ <menu_item_call label="Imposta sul contenuto Linden" name="Set to Linden Content"/>
+ <menu_item_call label="Rivendica terreno pubblico" name="Claim Public Land"/>
</menu>
<menu label="Regione" name="Region">
- <menu_item_call label="Stampa i Dati Temporanei degli Asset" name="Dump Temp Asset Data"/>
- <menu_item_call label="Salva Stato Regione" name="Save Region State"/>
+ <menu_item_call label="Dump di dati temporanei degli asset" name="Dump Temp Asset Data"/>
+ <menu_item_call label="Salva stato regione" name="Save Region State"/>
</menu>
- <menu_item_call label="Strumenti SuperUser" name="God Tools"/>
+ <menu_item_call label="Strumenti Admin" name="God Tools"/>
</menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/it/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/it/menu_wearable_list_item.xml
new file mode 100644
index 0000000000..79ef188993
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/menu_wearable_list_item.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit Wearable Context Menu">
+ <menu_item_call label="Indossa" name="wear"/>
+ <menu_item_call label="Aggiungi" name="wear_add"/>
+ <menu_item_call label="Togli / Stacca" name="take_off_or_detach"/>
+ <menu_item_call label="Stacca" name="detach"/>
+ <context_menu label="Attacca a â–¶" name="wearable_attach_to"/>
+ <context_menu label="Attacca a HUD â–¶" name="wearable_attach_to_hud"/>
+ <menu_item_call label="Togli" name="take_off"/>
+ <menu_item_call label="Modifica" name="edit"/>
+ <menu_item_call label="Profilo dell&apos;oggetto" name="object_profile"/>
+ <menu_item_call label="Mostra originale" name="show_original"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/it/mime_types_linux.xml b/indra/newview/skins/default/xui/it/mime_types_linux.xml
index 5db3eddca8..3bc30b507a 100644
--- a/indra/newview/skins/default/xui/it/mime_types_linux.xml
+++ b/indra/newview/skins/default/xui/it/mime_types_linux.xml
@@ -2,24 +2,24 @@
<mimetypes name="default">
<widgetset name="web">
<label name="web_label">
- Contenuto del Web
+ Contenuti Web
</label>
<tooltip name="web_tooltip">
- Questo luogo ha un contenuto Web
+ Questo luogo presenta contenuti Web
</tooltip>
<playtip name="web_playtip">
- Mostra il contenuto Web
+ Mostra contenuti Web
</playtip>
</widgetset>
<widgetset name="movie">
<label name="movie_label">
- Video
+ Filmato
</label>
<tooltip name="movie_tooltip">
- Qui c&apos;è un video da riprodurre
+ C&apos;è un filmato da vedere qui
</tooltip>
<playtip name="movie_playtip">
- Riproduci video
+ Riproduci il filmato
</playtip>
</widgetset>
<widgetset name="image">
@@ -27,10 +27,10 @@
Immagine
</label>
<tooltip name="image_tooltip">
- C&apos;è un immagine in questo luogo
+ C&apos;è un&apos;immagine in questo luogo
</tooltip>
<playtip name="image_playtip">
- Guarda l&apos;immagine di questo luogo
+ Vedi l&apos;immagine di questo luogo
</playtip>
</widgetset>
<widgetset name="audio">
@@ -38,25 +38,25 @@
Audio
</label>
<tooltip name="audio_tooltip">
- In questo luogo c&apos;è l&apos;audio
+ C&apos;è un audio in questo luogo
</tooltip>
<playtip name="audio_playtip">
- Riproduci l&apos;audio in questo luogo
+ Riproduci l&apos;audio di questo luogo
</playtip>
</widgetset>
<scheme name="rtsp">
<label name="rtsp_label">
- Real Time Streaming
+ Streaming in tempo reale
</label>
</scheme>
<mimetype name="blank">
<label name="blank_label">
- - Vuoto -
+ - Nessuno -
</label>
</mimetype>
<mimetype name="none/none">
<label name="none/none_label">
- - Vuoto -
+ - Nessuno -
</label>
</mimetype>
<mimetype name="audio/*">
@@ -76,7 +76,7 @@
</mimetype>
<mimetype name="video/vnd.secondlife.qt.legacy">
<label name="vnd.secondlife.qt.legacy_label">
- Video (QuickTime)
+ Filmato (QuickTime)
</label>
</mimetype>
<mimetype name="application/javascript">
@@ -116,7 +116,7 @@
</mimetype>
<mimetype name="application/x-director">
<label name="application/x-director_label">
- Direttore Macromedia
+ Macromedia Director
</label>
</mimetype>
<mimetype name="audio/mid">
@@ -186,32 +186,32 @@
</mimetype>
<mimetype name="video/mpeg">
<label name="video/mpeg_label">
- Video (MPEG)
+ Filmato (MPEG)
</label>
</mimetype>
<mimetype name="video/mp4">
<label name="video/mp4_label">
- Video (MP4)
+ Filmato (MP4)
</label>
</mimetype>
<mimetype name="video/quicktime">
<label name="video/quicktime_label">
- Video (QuickTime)
+ Filmato (QuickTime)
</label>
</mimetype>
<mimetype name="video/x-ms-asf">
<label name="video/x-ms-asf_label">
- Video (Windows Media ASF)
+ Filmato (Windows Media ASF)
</label>
</mimetype>
<mimetype name="video/x-ms-wmv">
<label name="video/x-ms-wmv_label">
- Video (Windows Media WMV)
+ Filmato (Windows Media WMV)
</label>
</mimetype>
<mimetype name="video/x-msvideo">
<label name="video/x-msvideo_label">
- Video (AVI)
+ Filmato (AVI)
</label>
</mimetype>
</mimetypes>
diff --git a/indra/newview/skins/default/xui/it/mime_types_mac.xml b/indra/newview/skins/default/xui/it/mime_types_mac.xml
index f91c9ce5bd..3bc30b507a 100644
--- a/indra/newview/skins/default/xui/it/mime_types_mac.xml
+++ b/indra/newview/skins/default/xui/it/mime_types_mac.xml
@@ -2,13 +2,13 @@
<mimetypes name="default">
<widgetset name="web">
<label name="web_label">
- Argomento nel Web
+ Contenuti Web
</label>
<tooltip name="web_tooltip">
- Questo luogo ha un argomento nel Web
+ Questo luogo presenta contenuti Web
</tooltip>
<playtip name="web_playtip">
- Mostra l&apos;argomento del Web
+ Mostra contenuti Web
</playtip>
</widgetset>
<widgetset name="movie">
@@ -30,7 +30,7 @@
C&apos;è un&apos;immagine in questo luogo
</tooltip>
<playtip name="image_playtip">
- Vedere l&apos;immagine di questo luogo
+ Vedi l&apos;immagine di questo luogo
</playtip>
</widgetset>
<widgetset name="audio">
@@ -46,7 +46,7 @@
</widgetset>
<scheme name="rtsp">
<label name="rtsp_label">
- Real Time Streaming
+ Streaming in tempo reale
</label>
</scheme>
<mimetype name="blank">
@@ -86,17 +86,17 @@
</mimetype>
<mimetype name="application/ogg">
<label name="application/ogg_label">
- Ogg Audio/Video
+ Audio/Video Ogg
</label>
</mimetype>
<mimetype name="application/pdf">
<label name="application/pdf_label">
- PDF Document
+ Documento PDF
</label>
</mimetype>
<mimetype name="application/postscript">
<label name="application/postscript_label">
- Postscript Document
+ Documento Postscript
</label>
</mimetype>
<mimetype name="application/rtf">
diff --git a/indra/newview/skins/default/xui/it/notifications.xml b/indra/newview/skins/default/xui/it/notifications.xml
index 2a370a2ed0..9f1472fc6f 100644
--- a/indra/newview/skins/default/xui/it/notifications.xml
+++ b/indra/newview/skins/default/xui/it/notifications.xml
@@ -11,18 +11,29 @@
</global>
<template name="okbutton">
<form>
- <button name="OK" text="$yestext"/>
+ <button name="OK_okbutton" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okignore">
+ <form>
+ <button name="OK_okignore" text="$yestext"/>
</form>
</template>
- <template name="okignore"/>
<template name="okcancelbuttons">
<form>
- <button name="Cancel" text="$notext"/>
+ <button name="OK_okcancelbuttons" text="$yestext"/>
+ <button name="Cancel_okcancelbuttons" text="$notext"/>
+ </form>
+ </template>
+ <template name="okcancelignore">
+ <form>
+ <button name="OK_okcancelignore" text="$yestext"/>
+ <button name="Cancel_okcancelignore" text="$notext"/>
</form>
</template>
- <template name="okcancelignore"/>
<template name="okhelpbuttons">
<form>
+ <button name="OK_okhelpbuttons" text="$yestext"/>
<button name="Help" text="$helptext"/>
</form>
</template>
@@ -30,12 +41,13 @@
<form>
<button name="Yes" text="$yestext"/>
<button name="No" text="$notext"/>
+ <button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
</form>
</template>
- <notification functor="GenericAcknowledge" label="Messaggio di Notifica Sconosciuto" name="MissingAlert">
- La versione di [APP_NAME] non riesce a visualizzare la notifica che ha ricevuto. Verifica di avere l&apos;ultima versione del Viewer installata.
+ <notification functor="GenericAcknowledge" label="Messaggio di notifica sconosciuto" name="MissingAlert">
+ La versione di [APP_NAME] non riesce a visualizzare la notifica appena ricevuta. Verifica di avere l&apos;ultima versione del Viewer installata.
-Dettaglio Errore: La notifica di nome &apos;[_NAME]&apos; non è stata trovata in notifications.xml.
+Dettagli errore: La notifica denominata &apos;[_NAME]&apos; non è stata trovata in notifications.xml.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="FloaterNotFound">
@@ -56,11 +68,11 @@ Dettaglio Errore: La notifica di nome &apos;[_NAME]&apos; non è stata trovata i
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="Si"/>
</notification>
<notification name="BadInstallation">
- Errore mentre si aggiornava [APP_NAME]. [http://get.secondlife.com Scarica l&apos;ultima versione] del Viewer.
+ Il programma [APP_NAME] ha riscontrato un&apos;errore durante il tentativo di aggiornamento. [http://get.secondlife.com Scarica l&apos;ultima versione] del Viewer.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LoginFailedNoNetwork">
- Non è possibile connettersi a [SECOND_LIFE_GRID].
+ Non è possibile collegarsi alla [SECOND_LIFE_GRID].
&apos;[DIAGNOSTIC]&apos;
Accertati che la tua connessione Internet stia funzionando correttamente.
<usetemplate name="okbutton" yestext="OK"/>
@@ -93,14 +105,18 @@ Scegli solo un oggetto e riprova.
Salva tutte le modifiche alle parti del corpo/abiti?
<usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Non Salvare" yestext="Salva Tutto"/>
</notification>
+ <notification name="FriendsAndGroupsOnly">
+ Chi non è tuo amico non saprà che hai scelto di ignorare le loro chiamate e IM.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="GrantModifyRights">
- Dare i diritti di modifica ad un altro residente gli consente di cambiare, cancellare o prendere QUALUNQUE oggetto che hai in [SECOND_LIFE]. Fai MOLTA attenzione quando concedi questo permesso.
-Vuoi davvero dare i diritti di modifica a [FIRST_NAME] [LAST_NAME]?
+ Quando concedi i diritti di modifica ad un altro residente, gli permetti di modificare, eliminare o prendere QUALSIASI oggetto che possiedi in Second Life. Pertanto ti consigliamo di essere ben sicuro quando concedi questo diritto.
+Vuoi concedere i diritti di modifica a [FIRST_NAME] [LAST_NAME]?
<usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
</notification>
<notification name="GrantModifyRightsMultiple">
- Dare i diritti di modifica ad un altro residente gli consente di cambiare QUALUNQUE oggetto che hai in [SECOND_LIFE]. Fai MOLTA attenzione quando concedi questo permesso.
-Vuoi davvero dare i diritti di modifica ai residenti selezionati?
+ Quando concedi i diritti di modifica ad un altro residente, gli permetti di modificare QUALSIASI oggetto che possiedi in Second Life. Pertanto ti consigliamo di essere ben sicuro quando concedi questo diritto.
+Vuoi concedere i diritti di modifica ai residenti selezionati?
<usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
</notification>
<notification name="RevokeModifyRights">
@@ -130,7 +146,7 @@ Vuoi davvero dare i diritti di modifica ai residenti selezionati?
Non si possono rimuovere membri da quel ruolo.
I membri devono dimettersi volontariamente dal ruolo.
Confermi l&apos;operazione?
- <usetemplate ignoretext="Conferma prima di aggiungere un nuovo Proprietario del Gruppo" name="okcancelignore" notext="No" yestext="Si"/>
+ <usetemplate ignoretext="Conferma prima di aggiungere un nuovo proprietario del gruppo" name="okcancelignore" notext="No" yestext="Si"/>
</notification>
<notification name="AssignDangerousActionWarning">
Stai per aggiungere il potere &apos;[ACTION_NAME]&apos; al ruolo &apos;[ROLE_NAME]&apos;.
@@ -150,23 +166,30 @@ Aggiungi questo potere a &apos;[ROLE_NAME]&apos;?
Aggiungi questo potere a &apos;[ROLE_NAME]&apos;?
<usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
</notification>
- <notification name="ClickUnimplemented">
- Mi dispiace, non è ancora stato implementato.
+ <notification name="AttachmentDrop">
+ Stai per abbandonare il tuo accessorio.
+ Vuoi continuare?
+ <usetemplate ignoretext="Conferma prima di distaccare gli accessori" name="okcancelignore" notext="No" yestext="Sì"/>
</notification>
<notification name="JoinGroupCanAfford">
Iscriversi a questo gruppo costa [COST]L$.
Vuoi proseguire?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="Iscriviti"/>
</notification>
+ <notification name="JoinGroupNoCost">
+ Aderisci al gruppo [NAME].
+Continuare?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Iscriviti"/>
+ </notification>
<notification name="JoinGroupCannotAfford">
Iscriversi a questo gruppo costa [COST]L$.
Non hai abbastanza L$ per iscriverti a questo gruppo.
</notification>
<notification name="CreateGroupCost">
- La Creazione di questo gruppo costerà L$100.
-I Gruppi devono avere più di un membro, o saranno cancellati definitivamente.
-Per favore invita altri membri entro le prossime 48 ore.
- <usetemplate canceltext="Annulla" name="okcancelbuttons" notext="Cancella" yestext="Crea un gruppo per L$100"/>
+ La creazione di questo gruppo costerà L$ 100.
+I gruppi devono avere più di un partecipante, o saranno eliminati definitivamente.
+Invita altri partecipanti entro le prossime 48 ore.
+ <usetemplate canceltext="Annulla" name="okcancelbuttons" notext="Annulla" yestext="Crea un gruppo per L$ 100"/>
</notification>
<notification name="LandBuyPass">
Pagando [COST]L$ puoi entrare in questa terra (&apos;[PARCEL_NAME]&apos;) per [TIME] ore. Compri un pass?
@@ -182,10 +205,10 @@ Il tuo prezzo di vendità è [SALE_PRICE]L$ ed è autorizzato alla vendita a [NA
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="ConfirmLandSaleToAnyoneChange">
- ATTENZIONE: Cliccando &apos;vendi a tutti&apos; rende questo terreno disponibile all&apos;intera comunità [SECOND_LIFE], perfino a quelli che non sono in questa regione.
+ ATTENZIONE: Quando selezioni &apos;vendi a tutti&apos;, rendi questo terreno disponibile all&apos;intera comunità di [SECOND_LIFE], anche alle persone che non si trovano in questa regione.
-Stai mettendo in vendita il terrendo selezionato di [LAND_SIZE] m².
-Il prezzo di vendità è [SALE_PRICE]L$ e verrà autorizzato alla vendita a [NAME].
+Il terrendo selezionato di [LAND_SIZE] m² sta per essere messo in vendita.
+Il prezzo di vendità sarà [SALE_PRICE]L$ e [NAME] viene autorizzato alla vendita.
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="ReturnObjectsDeededToGroup">
@@ -246,10 +269,10 @@ L&apos;intera regione ha l&apos;abilitazione danni.
Gli script devono essere autorizzati all&apos;esecuzione affinchè le armi funzionino.
</notification>
<notification name="MultipleFacesSelected">
- Multiple facce multimediale sono attualmente selezionate.
-Se prosegui con questa azione, esempi separati del media saranno impostati su facce multimediali dell&apos;oggetto. ???!!!
-Per impostare il media su una sola faccia multimediale, scegli Seleziona Faccia e clicca la faccia desiderata dell&apos;oggetto e poi clicca Aggiungi.
- <usetemplate ignoretext="Il Media sarà impostato su facce multimediali multiple" name="okcancelignore" notext="Cancella" yestext="OK"/>
+ Sono state selezionate più facce.
+Se prosegui con questa azione, sulle diverse facce dell&apos;oggetto verranno definite sessioni multimediali distinte.
+Per collocare il media su una sola faccia, scegli Seleziona faccia, clicca su una faccia e clicca su Aggiungi.
+ <usetemplate ignoretext="Il canale multimediale sarà impostato su più facce selezionate" name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
<notification name="MustBeInParcel">
Devi essere dentro il terreno per impostare il suo Punto di Atterraggio.
@@ -287,8 +310,8 @@ La cartella equipaggiamento non contiene abbigliamento, parti del corpo o attach
Non puoi indossare abiti e parti del corpo che sono nel cestino
</notification>
<notification name="MaxAttachmentsOnOutfit">
- L&apos;oggetto non può essere attaccato.
-Superato il limite di oggetti attaccati [MAX_ATTACHMENTS]. Per favore prima stacca un altro oggetto.
+ L&apos;oggetto non può essere collegato.
+Superato il limite di oggetti collegati [MAX_ATTACHMENTS]. Per favore prima stacca un altro oggetto.
</notification>
<notification name="CannotWearInfoNotComplete">
Non puoi indossare quell&apos;elemento perchè non è ancora stato caricato. Riprova fra un minuto.
@@ -303,12 +326,15 @@ Hai bisogno di un account per entrare in [SECOND_LIFE]. Ne vuoi creare uno adess
</url>
<usetemplate name="okcancelbuttons" notext="Riprova" yestext="Crea un nuovo account"/>
</notification>
+ <notification name="InvalidCredentialFormat">
+ Immetti sia il nome che il cognome del tuo avatar nel campo del nome utente, quindi effettua l&apos;accesso.
+ </notification>
<notification name="AddClassified">
- L&apos;inserzione apparirà nella sezione &apos;Annunci&apos; della Ricerca e su [http://secondlife.com/community/classifieds secondlife.com] per una settimana.
-Compila la tua inserzione, e quindi clicca &apos;Pubblica...&apos; per aggiungerla all&apos;elenco.
-Ti sarà chiesto un prezzo da pagare quando clicchi Pubblica.
-Pagando di più il tuo annuncio apparirà più in alto nella lista, e apparirà anche più in alto quando la gente cerca per Parole Chiavi.
- <usetemplate ignoretext="Come Creare una nuova Inserzione" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ L&apos;inserzione comparirà nella sezione &apos;Annunci&apos; della Ricerca e su [http://secondlife.com/community/classifieds secondlife.com] per una settimana.
+Compila la tua inserzione, quindi clicca &apos;Pubblica...&apos; per aggiungerla all&apos;elenco degli annunci.
+Quando clicchi su Pubblica, ti verrà chiesto di indicare quale prezzo vuoi pagare.
+Pagando di più, il tuo annuncio comparirà più in alto nella lista delle inserzioni, nonché nei risultati delle ricerche in base a parole chiave.
+ <usetemplate ignoretext="Come creare una nuova inserzione" name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
<notification name="DeleteClassified">
Cancella annuncio &apos;[NAME]&apos;?
@@ -316,16 +342,20 @@ Non ci sono rimborsi per la tariffa pagata.
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="DeleteMedia">
- Hai selezionato la cancellazione del media associato a questa faccia multimediale.
-Sei sicuro di voler continuare?
- <usetemplate ignoretext="Confemra la cancellazione del multimedia dall&apos;oggetto" name="okcancelignore" notext="No" yestext="Si"/>
+ Hai selezionato la cancellazione del media associato a questa faccia.
+Vuoi continuare?
+ <usetemplate ignoretext="Conferma prima di eliminare elementi multimediali dall&apos;oggetto" name="okcancelignore" notext="No" yestext="Sì"/>
</notification>
<notification name="ClassifiedSave">
Salva le modifiche all&apos;annuncio [NAME]?
<usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="Non salvare" yestext="Salva"/>
</notification>
+ <notification name="ClassifiedInsufficientFunds">
+ Denaro insufficiente per creare un&apos;inserzione.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="DeleteAvatarPick">
- Cancella il favorito [PICK]?
+ Elimina preferito &lt;nolink&gt;[PICK]&lt;/nolink&gt;?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="PromptGoToEventsPage">
@@ -341,26 +371,18 @@ Sei sicuro di voler continuare?
<notification name="SelectHistoryItemToView">
Scegli un item storico da vedere.
</notification>
- <notification name="ResetShowNextTimeDialogs">
- Vuoi riabilitare tutti le finestre di popup, che precedentemente hai indicato che &apos;Non vuoi vedere più&apos;?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
- <notification name="SkipShowNextTimeDialogs">
- Vuoi disabilitare tutti i popup che possono essere ignorati?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
- </notification>
<notification name="CacheWillClear">
- La Cache verrà cancellata dopo la ripartenza di [APP_NAME].
+ La cache verrà cancellata dopo il riavvio di [APP_NAME].
</notification>
<notification name="CacheWillBeMoved">
- La Cache verrà mossa dopo la ripartenza di [APP_NAME].
-Nota: Questo cancellerà anche la cache.
+ La cache verrà spostata dopo il riavvio di [APP_NAME].
+Nota: questa operazione cancellerà la cache.
</notification>
<notification name="ChangeConnectionPort">
- Le importazioni di Porte avranno effetto dopo la ripartenza di [APP_NAME].
+ Le impostazioni della porta avranno effetto dopo il riavvio di [APP_NAME].
</notification>
<notification name="ChangeSkin">
- La nuova skin apparirà dopo la ripartenza di [APP_NAME].
+ La nuova pelle comparirà dopo il riavvio di [APP_NAME].
</notification>
<notification name="GoToAuctionPage">
Vai alla pagina web [SECOND_LIFE] per vedere i dettagli dell&apos;asta oppure fai un&apos;offerta?
@@ -409,8 +431,8 @@ L&apos;oggetto potrebbe essere troppo lontano oppure essere stato cancellato.
C&apos;è stato un problema salvando lo script compilato a causa del seguente motivo: [REASON]. Riprova a salvare lo script più tardi.
</notification>
<notification name="StartRegionEmpty">
- Oops, la tua Regione di Inizio non è stata impostata.
-Per favore scrivi il nome della Regione nello spazio Regione di Inizio oppure scegli la mia ultima Ubicazione o Casa Mia come ultima ubicazione.
+ La tua Regione di inizio non è stata definita.
+Per scegliere il luogo dove vuoi trovarti all&apos;accesso, digita il nome della regione nel campo del luogo di partenza oppure scegli La mia ultima Ubicazione o Casa mia.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="CouldNotStartStopScript">
@@ -424,35 +446,35 @@ L&apos;oggetto potrebbe essere troppo lontano oppure essere stato cancellato.
Non è stato possibile scrivere il file [[FILE]]
</notification>
<notification name="UnsupportedHardware">
- Attenzione: Il tuo sistema non soddisfa i requisiti minimi per il funzionamento [APP_NAME]. Se continui ad usare [APP_NAME], potresti osservare una lentezza eccessiva. Sfortunatamente non possiamo fornire supporto tecnico per configurazioni di sistema non supportate.
+ Ti informiamo che il tuo computer non dispone dei requisiti minimi di sistema per [APP_NAME]. Il funzionamento può pertanto risultare ridotto. Purtroppo la pagina [SUPPORT_SITE] non può fornire assistenza tecnica in caso di problemi dovuti a configurazioni di sistema non compatibili.
-MINSPECS
-Vuoi visitare [_URL] per maggiori informazioni?
+Visitare [_URL] per ulteriori informazioni?
<url name="url" option="0">
http://secondlife.com/support/sysreqs.php?lang=it
</url>
- <usetemplate ignoretext="L&apos;hardware di questo computer non è supportato" name="okcancelignore" notext="No" yestext="Si"/>
+ <usetemplate ignoretext="L&apos;hardware di questo computer non è compatibile" name="okcancelignore" notext="No" yestext="Si"/>
</notification>
<notification name="UnknownGPU">
- Il tuo sistema contiene una scheda grafica ancora sconosciuta a [APP_NAME].
-Questo succede spesso con nuovo hardware che non è ancora stato verificato con [APP_NAME]. Probabilmente [APP_NAME] funzionerà correttamente, ma forse devi regolare le impostazioni grafiche a qualcosa di più appropriato.
+ Il tuo sistema utilizza una scheda grafica che [APP_NAME] non riconosce.
+Questo succede spesso con un nuovo hardware che non è stato ancora testato con [APP_NAME]. Probabilmente tutto andrà bene, ma devi riconfigurare le tue impostazioni grafiche.
(Io &gt; Preferenze &gt; Grafica).
<form name="form">
- <ignore name="ignore" text="La mia scheda grafica non è stata identificata"/>
+ <ignore name="ignore" text="La tua scheda grafica non è stata riconosciuta"/>
</form>
</notification>
<notification name="DisplaySettingsNoShaders">
- [APP_NAME] si è interrotta mentre stava inizializzando i driver grafici.
-La Qualità Grafica verrà impostata a Basso per evitare alcuni errori comuni di driver. Questo disabiliterà alcune caratteristiche grafiche.
-Si raccomanda di aggiornare i driver della scheda grafica.
-La Qualità Grafica può essere aumentata in Preferenze &gt; Grafica.
+ L&apos;esecuzione di [APP_NAME] si è interrotta durante l&apos;inizializzazione dei driver grafici.
+La qualità grafica verrà impostata a livello basso per evitare alcuni errori comuni di driver. Alcune funzionalità grafiche saranno disattivate.
+Si consiglia di aggiornare i driver della scheda grafica.
+La qualità grafica può essere aumentata in Preferenze &gt; Grafica.
</notification>
<notification name="RegionNoTerraforming">
La regione [REGION] non consente di terraformare.
</notification>
<notification name="CannotCopyWarning">
- Non hai il permesso di copiare questo elemento e lo perderai dal tuo inventario se lo regali.
-Confermi veramente di offrire questo elemento?
+ Non hai l&apos;autorizzazione a copiare i seguenti oggetti:
+[ITEMS]
+e se li dai via, verranno eliminati dal tuo inventario. Sicuro di volere offrire questi oggetti?
<usetemplate name="okcancelbuttons" notext="No" yestext="Si"/>
</notification>
<notification name="CannotGiveItem">
@@ -590,6 +612,11 @@ Attese [VALIDS]
<notification name="CannotEncodeFile">
Impossibile codificare il file: [FILE]
</notification>
+ <notification name="CorruptedProtectedDataStore">
+ Poiché non è possibile leggere i dati protetti, ora verranno ripristinati.
+ Ciò può succedere alla modifica delle impostazioni di rete.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CorruptResourceFile">
File risorsa corrotto: [FILE]
</notification>
@@ -600,14 +627,18 @@ Attese [VALIDS]
Impossibile creare il file in uscita: [FILE]
</notification>
<notification name="DoNotSupportBulkAnimationUpload">
- [APP_NAME] non supporta ancora l&apos;upload in blocco di file di animazione.
+ [APP_NAME] non supporta ancora il caricamento in blocco di file di animazione.
</notification>
<notification name="CannotUploadReason">
Impossibile importare il file [FILE] a causa del seguente motivo: [REASON]
Riprova più tardi.
</notification>
<notification name="LandmarkCreated">
- Hai aggiunto &quot;[LANDMARK_NAME]&quot; alla tua [FOLDER_NAME] cartella.
+ Hai aggiunto &quot;[LANDMARK_NAME]&quot; alla tua cartella [FOLDER_NAME].
+ </notification>
+ <notification name="LandmarkAlreadyExists">
+ Hai già il punto di riferimento di questo luogo.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="CannotCreateLandmarkNotOwner">
Non puoi creare qui un landmark perchè il proprietario di questo terreno non lo consente.
@@ -632,7 +663,7 @@ Seleziona oggetti con degli script.
Seleziona oggetti con script su cui hai i permessi di modifica.
</notification>
<notification name="CannotOpenScriptObjectNoMod">
- Impossibile aprire la script dell&apos;oggetto senza i permessi modify.
+ Impossibile aprire la script dell&apos;oggetto senza i diritti di modifica.
</notification>
<notification name="CannotSetRunningSelectObjectsNoScripts">
Impossibile mettere &apos;in esecuzione&apos; gli script.
@@ -657,16 +688,16 @@ Ho cercato: [FINALQUERY]
Le parole che hai usato per la ricerca sono troppo corte e non è stato possibile iniziare la ricerca.
</notification>
<notification name="CouldNotTeleportReason">
- Impossibile eseguire il teleport.
+ Teleport non riuscito.
[REASON]
</notification>
<notification name="invalid_tport">
- E&apos; stato incontrato un problema eseguendo la tua richiesta di teleport. Potresti avere bisogno di riloggarti per ritentare il teleport.
-Se continui a ricevere questo errore, controlla [SUPPORT_SITE].
+ C&apos;è stato un problema nell&apos;elaborare la tua richiesta di teleport. Potresti dover effettuare nuovamente l&apos;accesso prima di poter usare il teleport.
+Se si continua a visualizzare questo messaggio, consulta la pagina [SUPPORT_SITE].
</notification>
<notification name="invalid_region_handoff">
- Ci sono stati problemi eseguendo il passaggio di regione. Potresti avere bisogno di riloggarti per ritentare il passaggio di regione.
-Se continui a ricevere questo errore, controlla [SUPPORT_SITE].
+ Si è verificato un problema nel tentativo di attraversare regioni. È possibile che per potere attraversare le regioni, tu debba effettuare nuovamente l&apos;accesso.
+Se si continua a visualizzare questo messaggio, consulta la pagina [SUPPORT_SITE].
</notification>
<notification name="blocked_tport">
Spiacenti, il teletrasporto è bloccato al momento. Prova di nuovo tra pochi istanti. Se ancora non potrai teletrasportarti, per favore scollegati e ricollegati per risolvere il problema.
@@ -706,8 +737,8 @@ Nessun terreno selezionato.
Impossibile forzare la proprietà del terreno perchè la selezione si estende su diverse regioni. Seleziona una area più piccola e riprova.
</notification>
<notification name="ForceOwnerAuctionWarning">
- Questo terreno è venduta all&apos;asta. Forzare la proprietà cancellerà l&apos;asta e potrebbe disturbare residenti che abbiano già fatto offerte.
-Vuoi forzare la proprietà?
+ Questo lotto è all&apos;asta. La designazione di un proprietario determinerà l&apos;annullamento automatico dell&apos;asta e probabilmente può scontentare qualche residente se l&apos;asta è già iniziata.
+Vuoi designare un proprietario?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="CannotContentifyNothingSelected">
@@ -735,7 +766,7 @@ Nessun terreno selezionato.
Non riesco a trovare la regione dove è situato il terreno.
</notification>
<notification name="CannotCloseFloaterBuyLand">
- Non puoi chiudere la finestra di Acquisto Terreno finchè [APP_NAME] non finisce di stimare il prezzo di questa transazione.
+ Non puoi chiudere la finestra Acquista terreno finché [APP_NAME] non finisce di stimare il prezzo di questa transazione.
</notification>
<notification name="CannotDeedLandNothingSelected">
Impossibile cedere il terreno:
@@ -746,8 +777,8 @@ Nessun terreno selezionato.
Nessun gruppo selezionato.
</notification>
<notification name="CannotDeedLandNoRegion">
- Non è possibile donare il terreno:
-Non riesco a trovare la regione in cui si trova.
+ Non è possibile effettuare la cessione del terreno:
+Impossibile trovare la regione in cui si trova il terreno.
</notification>
<notification name="CannotDeedLandMultipleSelected">
Impossibile cedere il terreno:
@@ -755,13 +786,6 @@ Hai selezionato più di un terreno.
Prova a selezionare un solo terreno.
</notification>
- <notification name="ParcelCanPlayMedia">
- Questo posto può mostrare contenuto multimediale in streaming. Questo richiede una connessione Internet veloce.
-
-Mostra contenuto multimediale quando disponibile?
-(Puoi cambiare questa opzione anche successivamente su Preferenze &gt; Privacy.)
- <usetemplate name="okcancelbuttons" notext="Disabilita" yestext="Abilita MultiMedia"/>
- </notification>
<notification name="CannotDeedLandWaitingForServer">
Impossibile cedere il terreno:
Sto aspettando il server per segnalare la proprietà.
@@ -791,7 +815,7 @@ I terreni di tua proprietà vengono visualizzati in verde.
</notification>
<notification name="CannotReleaseLandRegionNotFound">
Non è possibile abbandonare il terreno:
-Non riesco a trovare la regione in cui si trova.
+Impossibile trovare la regione in cui si trova il terreno.
</notification>
<notification name="CannotReleaseLandNoTransfer">
Impossibile abbandonare il terreno:
@@ -829,11 +853,11 @@ Dividi il terreno?
</notification>
<notification name="CannotDivideLandNoRegion">
Non è possibile suddividere il terreno:
-Non riesco a trovare la regione in cui si trova.
+Impossibile trovare la regione in cui si trova il terreno.
</notification>
<notification name="CannotJoinLandNoRegion">
Non è possibile unire il terreno:
-Non riesco a trovare la regione in cui si trova.
+Impossibile trovare la regione in cui si trova il terreno.
</notification>
<notification name="CannotJoinLandNothingSelected">
Impossibile unire il terreno:
@@ -880,12 +904,11 @@ Unisci il terreno?
</notification>
<notification name="CannotSaveToAssetStore">
Non è possibile salvare [NAME] nel database centrale degli asset.
-Questo normalmente è un problema temporaneo. Riadatta e salva i vestiti e riprova fra qualche minuto.
+In genere si tratta di un problema temporaneo. Attendi alcuni minuti per modificare e salvare nuovamente gli elementi indossabili.
</notification>
<notification name="YouHaveBeenLoggedOut">
- Sei stato sconnesso da [SECOND_LIFE]:
+ Sei stato scollegato da [SECOND_LIFE].
[MESSAGE]
-Puoi ancora vedere gli IM e la chat cliccando &apos;Vedi IM &amp; Chat&apos;. Altrimenti clicca &apos;Esci&apos; per uscire immediatamente da[APP_NAME].
<usetemplate name="okcancelbuttons" notext="Esci" yestext="Vedi IM &amp; Chat"/>
</notification>
<notification name="OnlyOfficerCanBuyLand">
@@ -910,6 +933,36 @@ Offri l&apos;amicizia a [NAME]?
<button name="Cancel" text="Annulla"/>
</form>
</notification>
+ <notification label="Salva vestiario" name="SaveOutfitAs">
+ Salva gli abiti che indosso come nuovo vestiario:
+ <form name="form">
+ <input name="message">
+ [DESC] (nuovo)
+ </input>
+ <button name="Offer" text="OK"/>
+ <button name="Cancel" text="Annulla"/>
+ </form>
+ </notification>
+ <notification label="Salva capo da indossare" name="SaveWearableAs">
+ Salva oggetto nel mio inventario come:
+ <form name="form">
+ <input name="message">
+ [DESC] (nuovo)
+ </input>
+ <button name="Offer" text="OK"/>
+ <button name="Cancel" text="Annulla"/>
+ </form>
+ </notification>
+ <notification label="Cambia nome del vestiario" name="RenameOutfit">
+ Nuovo nome per il vestiario:
+ <form name="form">
+ <input name="new_name">
+ [NAME]
+ </input>
+ <button name="Offer" text="OK"/>
+ <button name="Cancel" text="Annulla"/>
+ </form>
+ </notification>
<notification name="RemoveFromFriends">
Vuoi rimuovere remove [FIRST_NAME] [LAST_NAME] dalla lista dei tuoi amici?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
@@ -944,6 +997,12 @@ su TUTTI I TERRENI di questa sim?
Introduci un prezzo più alto.
</notification>
+ <notification name="ConfirmItemDeleteHasLinks">
+ Almeno uno degli oggetti selezionati è collegato tramite link ad altri oggetti. Se elimini l&apos;oggetto, i relativi link non funzioneranno più. Pertanto si consiglia vivamente di eliminare prima i link.
+
+Sei sicuro di volere eliminare gli oggetti?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
+ </notification>
<notification name="ConfirmObjectDeleteLock">
Almeno uno degli elementi selezionati è bloccato.
@@ -1043,37 +1102,39 @@ Cedi questo terreno di [AREA] m² al gruppo &apos;[GROUP_NAME]&apos;?
</notification>
<notification name="ErrorMessage">
[ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AvatarMovedDesired">
- L&apos;ubicazione desiderata non è attualmente disponibile. Sei stato trasportato in una regione vicina.
+ L&apos;ubicazione prescelta non è attualmente disponibile.
+Sei stato trasferito in una regione vicina.
</notification>
<notification name="AvatarMovedLast">
- La tua ultima ubicazione non è al momento disponibile.
-Sei stato trasferito in una regione vicina .
+ La tua ultima posizione non è al momento disponibile.
+Sei stato trasferito in una regione vicina.
</notification>
<notification name="AvatarMovedHome">
L&apos;ubicazione di casa tua non è al momento disponibile.
-Sei stato trasferito in un&apos;ubicazione vicina.
-Potresti impostare una nuova ubicazione.
+Sei stato trasferito in una regione vicina.
+Ti consigliamo di impostare una nuova posizione iniziale.
</notification>
<notification name="ClothingLoading">
- Sto ancora scaricando i tuoi abiti.
-Puoi comunque usare [SECOND_LIFE] normalmente e gli altri ti vedranno correttamente.
+ Gli abiti sono in corso di scaricamento.
+Puoi comunque usare [SECOND_LIFE] normalmente e gli altri residenti ti vedranno correttamente.
<form name="form">
- <ignore name="ignore" text="Lo scarico degli abiti sta impiegando parecchio tempo"/>
+ <ignore name="ignore" text="Lo scaricamento sta richiedendo parecchio tempo"/>
</form>
</notification>
<notification name="FirstRun">
- L&apos;installazione di [APP_NAME] è completa.
+ L&apos;installazione di [APP_NAME] è terminata.
-Se questa è la prima volta che usi [SECOND_LIFE], devi creare un account prima che tu possa fare il log in.
-Vuoi ritornare su [http://join.secondlife.com secondlife.com] per creare un nuovo account?
+Se questa è la prima volta che usi [SECOND_LIFE], devi creare un account prima che tu possa effettuare l&apos;accesso.
+Vuoi tornare a [http://join.secondlife.com secondlife.com] per creare un nuovo account?
<usetemplate name="okcancelbuttons" notext="Continua" yestext="Nuovo Account..."/>
</notification>
<notification name="LoginPacketNeverReceived">
- Ci sono problemi di connessione. Può darsi che siano nella tua connessione Internet oppure in [SECOND_LIFE_GRID].
+ Ci sono problemi di connessione. È possibile che ci siano problemi con la tua connessione Internet oppure sulla [SECOND_LIFE_GRID].
-Puoi controllare la tua connessione Internet e riprovare fra qualche minuto, oppure cliccare Aiuto per vedere il [SUPPORT_SITE], oppure cliccare Teleport per tentare di teleportarti a casa.
+Controlla la tua connessione Internet e riprova fra qualche minuto, oppure clicca su Aiuto per visualizzare la pagina [SUPPORT_SITE], oppure clicca su Teleport per tentare il teleport a casa tua.
<url name="url">
http://it.secondlife.com/support/
</url>
@@ -1091,14 +1152,50 @@ Premi F1 in qualunque momento per la guida o per apprendere altre cose di [SECON
Scegli un avatar maschile o femminile. Puoi sempre cambiare idea più tardi.
<usetemplate name="okcancelbuttons" notext="Femminile" yestext="Maschile"/>
</notification>
+ <notification name="CantTeleportToGrid">
+ Impossibile effettuare il teleport su [SLURL], in quanto si trova su una griglia ([GRID]) diversa da quella attuale ([CURRENT_GRID]). Chiudi il viewer e prova nuovamente.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="GeneralCertificateError">
+ Impossibile collegarsi al server.
+[REASON]
+
+Nome oggetto: [SUBJECT_NAME_STRING]
+Nome emittente: [ISSUER_NAME_STRING]
+Valido da: [VALID_FROM]
+Valido fino a: [VALID_TO]
+Impronta MD5: [SHA1_DIGEST]
+Impronta SHA1: [MD5_DIGEST]
+Uso chiave: [KEYUSAGE]
+Uso chiave estesa: [EXTENDEDKEYUSAGE]
+Identificatore chiave oggetto: [SUBJECTKEYIDENTIFIER]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TrustCertificateError">
+ Autorità di certificazione di questo server sconosciuta.
+
+Informazioni sul certificato:
+Nome oggetto: [SUBJECT_NAME_STRING]
+Nome emittente: [ISSUER_NAME_STRING]
+Valido da: [VALID_FROM]
+Valido fino a: [VALID_TO]
+Impronta MD5: [SHA1_DIGEST]
+Impronta SHA1: [MD5_DIGEST]
+Uso chiave: [KEYUSAGE]
+Uso chiave estesa: [EXTENDEDKEYUSAGE]
+Identificatore chiave oggetto: [SUBJECTKEYIDENTIFIER]
+
+Accettare questa autorità?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Accetta"/>
+ </notification>
<notification name="NotEnoughCurrency">
[NAME] [PRICE]L$ Non hai abbastanza L$ per farlo.
</notification>
<notification name="GrantedModifyRights">
- [NAME] ti ha dato il permesso di editare i suoi oggetti.
+ [NAME] ti ha dato il permesso di modificare i suoi oggetti.
</notification>
<notification name="RevokedModifyRights">
- Ti è stato revocato il permesso di modificare gli oggetti di [NAME]
+ Non sei più autorizzato a modificare gli oggetti di [NAME]
</notification>
<notification name="FlushMapVisibilityCaches">
Questo reinizializzerà la cache della mappa di questa regione.
@@ -1177,107 +1274,107 @@ Imposta l&apos;oggetto per la vendita e riprova.
[DOWNLOAD_PATH].
</notification>
<notification name="DownloadWindowsMandatory">
- E&apos; disponibile una nuova versione di [APP_NAME].
+ È disponibile una nuova versione di [APP_NAME].
[MESSAGE]
-Devi scaricarla per usare [APP_NAME].
+Devi scaricare questo aggiornamento per utilizzare [APP_NAME].
<usetemplate name="okcancelbuttons" notext="Esci" yestext="Scarica l&apos;aggiornamento"/>
</notification>
<notification name="DownloadWindows">
- E&apos; disponibile una versione aggiornata di [APP_NAME].
+ È disponibile una versione aggiornata di [APP_NAME].
[MESSAGE]
-Questo aggiornamento non è obbligatorio, ma è consigliabile installarlo per migliorare le prestazioni e la stabilità.
+Questo aggiornamento non è necessario, ma ti consigliamo di installarlo per migliorare il rendimento e la stabilità.
<usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica l&apos;aggiornamento"/>
</notification>
<notification name="DownloadWindowsReleaseForDownload">
- E&apos; disponibile una versione aggiornata di [APP_NAME].
+ È disponibile una versione aggiornata di [APP_NAME].
[MESSAGE]
-Questo aggiornamento non è obbligatorio, ma è consigliabile installarlo per migliorare le prestazioni e la stabilità.
+Questo aggiornamento non è necessario, ma ti consigliamo di installarlo per migliorare il rendimento e la stabilità.
<usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica l&apos;aggiornamento"/>
</notification>
<notification name="DownloadLinuxMandatory">
- Una nuova versione di [APP_NAME] è disponibile.
+ È disponibile una nuova versione di [APP_NAME].
[MESSAGE]
-Devi scaricare questo aggiornamento per utilizzarlo [APP_NAME].
- <usetemplate name="okcancelbuttons" notext="Esci" yestext="Download"/>
+Devi scaricare questo aggiornamento per utilizzare [APP_NAME].
+ <usetemplate name="okcancelbuttons" notext="Esci" yestext="Scarica"/>
</notification>
<notification name="DownloadLinux">
- E&apos; disponibile una versione aggiornata di [APP_NAME].
+ È disponibile una versione aggiornata di [APP_NAME].
[MESSAGE]
-Questo aggiornamento non è necessario, ti consigliamo di installarlo per migliorare il rendimento e la stabilità.
- <usetemplate name="okcancelbuttons" notext="Continua" yestext="Download"/>
+Questo aggiornamento non è necessario, ma ti consigliamo di installarlo per migliorare il rendimento e la stabilità.
+ <usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica"/>
</notification>
<notification name="DownloadLinuxReleaseForDownload">
- E&apos; disponibile una versione aggiornata di [APP_NAME].
+ È disponibile una versione aggiornata di [APP_NAME].
[MESSAGE]
-Questo aggiornamento non è obbligatorio, ma è consigliata l&apos;installazione per migliorare le prestazioni e l&apos;affidabilità.
- <usetemplate name="okcancelbuttons" notext="Continua" yestext="Download"/>
+Questo aggiornamento non è necessario, ma ti consigliamo di installarlo per migliorare il rendimento e la stabilità.
+ <usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica"/>
</notification>
<notification name="DownloadMacMandatory">
- E&apos; disponibile una nuova versione di [APP_NAME].
+ È disponibile una nuova versione di [APP_NAME].
[MESSAGE]
-Devi scaricarla per usare [APP_NAME].
+Devi scaricare questo aggiornamento per utilizzare [APP_NAME].
-Scarico nella cartella Applicazioni?
+Scaricare nella cartella Applicazioni?
<usetemplate name="okcancelbuttons" notext="Esci" yestext="Scarica l&apos;aggiornamento"/>
</notification>
<notification name="DownloadMac">
- E&apos; disponibile una versione aggiornata di [APP_NAME].
+ È disponibile una versione aggiornata di [APP_NAME].
[MESSAGE]
-Questo aggiornamento non è obbligatorio, ma è consigliabile installarlo per migliorare le prestazioni e la stabilità.
+Questo aggiornamento non è necessario, ma ti consigliamo di installarlo per migliorare il rendimento e la stabilità.
-Scarico nella cartella Applicazioni?
+Scaricare nella cartella Applicazioni?
<usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica l&apos;aggiornamento"/>
</notification>
<notification name="DownloadMacReleaseForDownload">
- E&apos; disponibile una versione aggiornata di [APP_NAME].
+ È disponibile una versione aggiornata di [APP_NAME].
[MESSAGE]
-Questo aggiornamento non è obbligatorio, ma è consigliabile installarlo per migliorare le prestazioni e la stabilità.
+Questo aggiornamento non è necessario, ma ti consigliamo di installarlo per migliorare il rendimento e la stabilità.
-Scarico nella cartella Applicazioni?
+Scaricare nella cartella Applicazioni?
<usetemplate name="okcancelbuttons" notext="Continua" yestext="Scarica l&apos;aggiornamento"/>
</notification>
<notification name="DeedObjectToGroup">
La cessione di questo oggetto farà in modo che il gruppo:
* Riceva i L$ pagati all&apos;oggetto
- <usetemplate ignoretext="Conferma la donazione di un oggetto al gruppo" name="okcancelignore" notext="Annulla" yestext="Cedi"/>
+ <usetemplate ignoretext="Conferma la cessione di un oggetto al gruppo" name="okcancelignore" notext="Annulla" yestext="Cedi"/>
</notification>
<notification name="WebLaunchExternalTarget">
- Vuoi aprire il browser per vedere questo contenuto?
- <usetemplate ignoretext="Lancia il browser per vedere la pagina web" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ Vuoi aprire il browser per vedere questi contenuti?
+ <usetemplate ignoretext="Lancia il browser per consultare una pagina web" name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
<notification name="WebLaunchJoinNow">
Vuoi andare su [http://secondlife.com/account/ Dashboard] per gestire il tuo account?
- <usetemplate ignoretext="Lancia il browser pe gestire il mio account" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ <usetemplate ignoretext="Lancia il browser per gestire il mio account" name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
<notification name="WebLaunchSecurityIssues">
Visita la Wiki di [SECOND_LIFE] per i dettagli su come segnalare un problema di sicurezza.
- <usetemplate ignoretext="Lancia il browser per imparare a segnalare un Problema di Sicurezza" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ <usetemplate ignoretext="Lancia il browser per imparare a segnalare un problema di sicurezza" name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
<notification name="WebLaunchQAWiki">
Visita il controllo di qualità Wiki [SECOND_LIFE].
- <usetemplate ignoretext="Lancia il browser per vedere il QA Wiki" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ <usetemplate ignoretext="Lancia il browser per vedere la pagina Wiki sul controllo di qualità" name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
<notification name="WebLaunchPublicIssue">
Visita il registro pubblico dei problemi di [SECOND_LIFE], dove puoi segnalare bug ed altri problemi.
- <usetemplate ignoretext="Lancia il browser per vedere il Registro dei Problemi Pubblici" name="okcancelignore" notext="Annulla" yestext="Vai alla pagina"/>
+ <usetemplate ignoretext="Lancia il browser per vedere il registro pubblico di monitoraggio dei problemi" name="okcancelignore" notext="Annulla" yestext="Vai alla pagina"/>
</notification>
<notification name="WebLaunchSupportWiki">
Vai al blog ufficiale Linden, per le ultime notizie ed informazioni.
<usetemplate ignoretext="Lancia il browser per vedere il blog" name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
<notification name="WebLaunchLSLGuide">
- Vuoi aprire la Guida per lo Scripting per avere aiuto con lo scripting?
- <usetemplate ignoretext="Lancia il browser per vedere la Guida per lo Scripting" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ Vuoi aprire la Guida per lo scripting per avere aiuto con lo scripting?
+ <usetemplate ignoretext="Lancia il browser per vedere la Guida per lo scripting" name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
<notification name="WebLaunchLSLWiki">
- Vuoi visitare il Portale LSL per avere aiuto con lo Scripting?
+ Vuoi visitare il Portale LSL per avere aiuto con lo scripting?
<usetemplate ignoretext="Lancia il browser per vedere il Portale LSL" name="okcancelignore" notext="Annulla" yestext="Vai alla pagina"/>
</notification>
<notification name="ReturnToOwner">
Confermi di voler restituire gli oggetti selezionati ai loro proprietari? Gli oggetti trasferibili ceduti al gruppo, verranno restituiti ai proprietari precedenti.
*ATTENZIONE* Gli oggetti ceduti non trasferibili verranno cancellati!
- <usetemplate ignoretext="Conferma la restituzione degli oggetti ai loro proprietari" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ <usetemplate ignoretext="Conferma prima di restituire gli oggetti ai relativi proprietari" name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
<notification name="GroupLeaveConfirmMember">
Sei attualmente un membro del gruppo [GROUP].
@@ -1285,18 +1382,18 @@ Vuoi lasciare il gruppo?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="ConfirmKick">
- Vuoi VERAMENTE espellere tutti gli utenti dalla griglia?
- <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Espelli tutti gli utenti"/>
+ Vuoi veramente espellere tutti i residenti dalla griglia?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Espelli tutti i residenti"/>
</notification>
<notification name="MuteLinden">
- Mi dispiace, non puoi bloccare un Linden.
+ Spiacenti, non puoi bloccare un Linden.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="CannotStartAuctionAlreadyForSale">
Non è possibile mettere in vendita all&apos;asta un terreno che è già impostato per la vendita. Disabilita la vendita del terreno, se sei certo di voler avviare una vendita all&apos;asta.
</notification>
- <notification label="E&apos; fallito Il Blocco dell&apos;Oggetto" name="MuteByNameFailed">
- Hai già bloccato questo nome.
+ <notification label="Il blocco dell&apos;oggetto in base al nome non è riuscito," name="MuteByNameFailed">
+ hai già bloccato questo nome.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="RemoveItemWarn">
@@ -1313,18 +1410,21 @@ Vuoi cancellare quell&apos;elemento?
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="BusyModeSet">
- E&apos; stata impostata la modalità Non Disponibile.
-La Chat e gli IM verranno nascosti. Gli IM riceveranno la tua risposta di Non Disponibile. Tutte le offerte di teleport verranno declinate. Tutte le offerte di Inventory andranno nel Cestino.
- <usetemplate ignoretext="Cambio il mio stato in Non Disponibile" name="okignore" yestext="OK"/>
+ È stata impostata la modalità Non disponibile.
+La chat e gli IM verranno nascosti. Gli IM riceveranno la tua risposta di Non disponibile. Tutte le offerte di teleport verranno rifiutate. Tutte le offerte di Inventario andranno nel Cestino.
+ <usetemplate ignoretext="Cambio il mio stato sulla modalità Non disponibile" name="okignore" yestext="OK"/>
</notification>
<notification name="JoinedTooManyGroupsMember">
- Hai raggiunto il limite massimo di gruppi. Devi lasciare un gruppo prima di poterti unire a questo, oppure puoi declinare questa offerta.
-[NAME] ti ha invitato ad unirti al gruppo come membro.
-[INVITE]
+ Hai raggiunto il numero massimo di gruppi. Per favore abbandona almeno un gruppo prima di aderire a questo, oppure declina l&apos;offerta.
+[NAME] ti invita ad aderire ad un gruppo.
<usetemplate name="okcancelbuttons" notext="Declino" yestext="Unisciti"/>
</notification>
+ <notification name="JoinedTooManyGroups">
+ Hai raggiunto il numero massimo di gruppi. Per favore abbandona almeno un gruppo prima di aderire o crearne uno nuovo.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="KickUser">
- Espelli questo utente con quale messaggio?
+ Espelli questo residente con quale messaggio?
<form name="form">
<input name="message">
Un amministratore ti ha disconnesso.
@@ -1344,7 +1444,7 @@ La Chat e gli IM verranno nascosti. Gli IM riceveranno la tua risposta di Non Di
</form>
</notification>
<notification name="FreezeUser">
- Immobilizza questo utente con quale messaggio?
+ Congela questo residente con quale messaggio?
<form name="form">
<input name="message">
Sei stato immobilizzato. Non puoi muoverti o usare la chat. Un amministratore ti contatterà con un messaggio (IM).
@@ -1354,7 +1454,7 @@ La Chat e gli IM verranno nascosti. Gli IM riceveranno la tua risposta di Non Di
</form>
</notification>
<notification name="UnFreezeUser">
- Smobilizza questo utente con quale messaggio?
+ Scongela questo residente con quale messaggio?
<form name="form">
<input name="message">
Non sei più immobilizzato.
@@ -1374,7 +1474,7 @@ La Chat e gli IM verranno nascosti. Gli IM riceveranno la tua risposta di Non Di
</form>
</notification>
<notification name="OfferTeleportFromGod">
- Vuoi trasportare divinamente l&apos;utente nel posto dove sei?
+ Chiedere, in qualità di Admin, al residente di raggiungerti?
<form name="form">
<input name="message">
Raggiungimi in [REGION]
@@ -1384,16 +1484,20 @@ La Chat e gli IM verranno nascosti. Gli IM riceveranno la tua risposta di Non Di
</form>
</notification>
<notification name="TeleportFromLandmark">
- Confermi di volerti teleportare?
- <usetemplate ignoretext="Conferma il teleport verso un Landmark" name="okcancelignore" notext="Annulla" yestext="Teleportati"/>
+ Sei sicuro di volere il teleport a &lt;nolink&gt;[LOCATION]&lt;/nolink&gt;?
+ <usetemplate ignoretext="Conferma il teleport verso un punto di riferimento" name="okcancelignore" notext="Annulla" yestext="Teleportati"/>
</notification>
<notification name="TeleportToPick">
Teleport a [PICK]?
- <usetemplate ignoretext="Conferma il teleport verso l&apos;ubicazione nei Posti Consigliati" name="okcancelignore" notext="Annulla" yestext="Teleport"/>
+ <usetemplate ignoretext="Conferma che voglio il teleport verso l&apos;ubicazione nei Luoghi preferiti" name="okcancelignore" notext="Annulla" yestext="Teleport"/>
</notification>
<notification name="TeleportToClassified">
Teleport a [CLASSIFIED]?
- <usetemplate ignoretext="Confermo il teleport verso questa ubicazione negli Annunci" name="okcancelignore" notext="Cancella" yestext="Teleport"/>
+ <usetemplate ignoretext="Conferma il teleport verso questa posizione negli annunci" name="okcancelignore" notext="Annulla" yestext="Teleport"/>
+ </notification>
+ <notification name="TeleportToHistoryEntry">
+ Teleport a [HISTORY_ENTRY]?
+ <usetemplate ignoretext="Conferma il teleport verso un luogo che compare nella cronologia" name="okcancelignore" notext="Annulla" yestext="Teleport"/>
</notification>
<notification label="Manda un messaggio a tutti nella tua proprietà" name="MessageEstate">
Scrivi un annuncio breve che verrà mandato a tutti quelli che sono in questo momento nella tua proprietà.
@@ -1404,11 +1508,11 @@ La Chat e gli IM verranno nascosti. Gli IM riceveranno la tua risposta di Non Di
</form>
</notification>
<notification label="Cambia la tipologia della proprietà Linden" name="ChangeLindenEstate">
- Stai per cambiare la tipologia della proprietà Linden (mainland, griglia minorenni, orientamento, ecc.).
+ Stai per apportare modifiche ad una proprietà che appartiene a Linden (continente, teen grid, orientamento e così via).
-Questo è ESTREMAMENTE PERICOLOSO perchè può cambiare radicalmente l&apos;esperienza degli utenti. Sulla mainland cambierà migliaia di regioni e produrrà seri problemi ai vari server.
+Questa è un&apos;operazione da effettuare con molta cautela, in quanto può incidere profondamente sulla vita dei residenti in Second Life. Sul continente, l&apos;azione modificherà migliaia di regioni e creerà un grosso carico sul server.
-Confermi?
+Vuoi procedere?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification label="Cambia la tipologia Linden di accesso alla proprietà" name="ChangeLindenAccess">
@@ -1471,21 +1575,24 @@ Vuoi andare alla Knowledge Base per ulteriori informazioni sulle categorie di ac
<url name="url">
http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/it
</url>
- <usetemplate ignoretext="Non posso entrare in questa Regione, a causa delle restrizioni sulla Categoria di Accesso" name="okcancelignore" notext="Chiudi" yestext="Vai alla Knowledge Base"/>
+ <usetemplate ignoretext="Non posso entrare in questa regione a causa delle restrizioni della categoria di accesso" name="okcancelignore" notext="Chiudi" yestext="Vai alla Knowledge Base"/>
</notification>
<notification name="RegionEntryAccessBlocked_Notify">
Non sei ammesso in questa regione a causa della tua categoria d&apos;accesso.
</notification>
<notification name="RegionEntryAccessBlocked_Change">
- Non ti è consentito entrare in quella Regione a causa della tua Categoria di Accesso impostata nelle Preferenze.
+ Non ti è consentito entrare in quella regione a causa della categoria di accesso impostata nelle preferenze.
-Puoi cliccare su &apos;Cambia Preferenze&apos; per alzare la tua preferenza di Categoria di Accesso e quindi riuscire ad entrare. Sarai in grado di ricercare e di accedere da adesso in poi contenuto [REGIONMATURITY]. Se più tardi volessi cambiare di nuovo le tue impostazioni, vai su Me &gt; Preferenze &gt; Generali.
+Per entrare nella regione, dovrai modificare la tua categoria di accesso. Ciò ti consentirà inoltre di effettuare ricerche di contenuti di categoria [REGIONMATURITY]. Per annullare le modifiche in un secondo momento, vai a Io &gt; Preferenze &gt; Generali.
<form name="form">
- <button name="OK" text="Cambia Preferenza"/>
+ <button name="OK" text="Cambia preferenza"/>
<button default="true" name="Cancel" text="Chiudi"/>
- <ignore name="ignore" text="Le mie preferenze attivate nel Rating (Classificazione) prevengono il mio ingresso in una Regione"/>
+ <ignore name="ignore" text="La categoria di accesso impostata mi impedisce di entrare in una regione"/>
</form>
</notification>
+ <notification name="PreferredMaturityChanged">
+ La tua categoria di accesso attuale è [RATING].
+ </notification>
<notification name="LandClaimAccessBlocked">
Non puoi prendere possesso di questo terreno a causa della tua categoria di accesso. Questo può essere dovuto ad una mancanza di informazioni valide che confermino la tua età.
@@ -1499,16 +1606,16 @@ Vuoi andare alla Knowledge Base per maggiori informazioni sulle categorie di acc
<url name="url">
http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/it
</url>
- <usetemplate ignoretext="Non posso richiedere questo Terreno, a causa delle restrizioni sulla Categoria di Accesso" name="okcancelignore" notext="Chiudi" yestext="Vai alla Knowledge Base"/>
+ <usetemplate ignoretext="Non posso richiedere questo terreno a causa delle restrizioni della categoria di accesso" name="okcancelignore" notext="Chiudi" yestext="Vai alla Knowledge Base"/>
</notification>
<notification name="LandClaimAccessBlocked_Notify">
Non puoi prendere possesso di questa terra a causa della tua categoria di accesso.
</notification>
<notification name="LandClaimAccessBlocked_Change">
- Non puoi richiedere questo Terreno a causa delle tue preferenze di Categoria di Accesso.
+ Non puoi richiedere questo terreno a causa della tua categoria di accesso.
-Puoi cliccare su &apos;Cambia Preferenze&apos; per alzare la tua preferenza di Categoria di Accesso e quindi riuscire ad entrare. Sarai in grado di ricercare e di accedere da adesso in poi contenuto [REGIONMATURITY]. Se più tardi volessi cambiare di nuovo le tue impostazioni, vai su Me &gt; Preferenze &gt; Generali.
- <usetemplate ignoretext="Le mie preferenze di Categoria di Accesso mi impediscono di chiedere questo Terreno" name="okcancelignore" notext="Chiudi" yestext="Cambia le preferenze"/>
+Puoi cliccare su Cambia preferenze per modificare la categoria di accesso e quindi riuscire ad entrare. Da adesso potrai accedere ai contenuti [REGIONMATURITY] ed effettuare ricerche in questa categoria. Se in seguito tu volessi cambiare di nuovo le tue impostazioni, apri la finestra di dialogo da Io &gt; Preferenze &gt; Generale.
+ <usetemplate ignoretext="Le mie preferenze di categoria di accesso mi impediscono di richiedere terreno" name="okcancelignore" notext="Chiudi" yestext="Cambia le preferenze"/>
</notification>
<notification name="LandBuyAccessBlocked">
Non puoi acquistare questo terreno a causa della tua categoria di accesso. Questo può essere dovuto ad una mancanza di informazioni valide che confermino la tua età.
@@ -1523,16 +1630,16 @@ Vuoi andare alla Knowledge Base per maggiori informazioni sulle categorie di acc
<url name="url">
http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/it
</url>
- <usetemplate ignoretext="Non posso comprare questo Terreno , a causa delle restrizioni della Categoria di Accesso" name="okcancelignore" notext="Chiudi" yestext="Vai alla Knowledge Base"/>
+ <usetemplate ignoretext="Non posso acquistare questo terreno a causa delle restrizioni della categoria di accesso" name="okcancelignore" notext="Chiudi" yestext="Vai alla Knowledge Base"/>
</notification>
<notification name="LandBuyAccessBlocked_Notify">
Non puoi acquistare questa land a causa della tua categoria di accesso.
</notification>
<notification name="LandBuyAccessBlocked_Change">
- Non puoi comprare questo Terreno a causa delle tue preferenze di Categoria di Accesso.
+ Non puoi acquistare questo terreno a causa della tua categoria di accesso.
-Puoi cliccare su &apos;Cambia Preferenze&apos; per alzare la tua preferenza di Categoria di Accesso e quindi riuscire ad entrare. Sarai in grado di ricercare e di accedere da adesso in poi contenuto [REGIONMATURITY]. Se più tardi volessi cambiare di nuovo le tue impostazioni, vai su Me &gt; Preferenze &gt; Generali.
- <usetemplate ignoretext="Le mie Preferenze di Accesso mi impediscono l&apos;acquisto di questo Terreno" name="okcancelignore" notext="Chiudi" yestext="Cambia le preferenze"/>
+Puoi cliccare su Cambia preferenze per modificare la categoria di accesso e quindi riuscire ad entrare. Da adesso potrai accedere ai contenuti [REGIONMATURITY] ed effettuare ricerche in questa categoria. Se in seguito tu volessi cambiare di nuovo le tue impostazioni, apri la finestra di dialogo da Io &gt; Preferenze &gt; Generale.
+ <usetemplate ignoretext="Le mie Preferenze di accesso mi impediscono di acquistare terreno" name="okcancelignore" notext="Chiudi" yestext="Cambia le preferenze"/>
</notification>
<notification name="TooManyPrimsSelected">
Hai selezionato troppi prim. Seleziona non più di [MAX_PRIM_COUNT] prim e riprova
@@ -1567,11 +1674,11 @@ Pubblica questo annuncio adesso per [AMOUNT]L$?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="SetClassifiedMature">
- Queste inserzioni includono contenuto Mature?
+ Queste inserzioni includono contenuti di tipo Moderato?
<usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="No" yestext="Si"/>
</notification>
<notification name="SetGroupMature">
- Questo gruppo include contenuto Mature?
+ Questo gruppo include contenuti di tipo Moderato?
<usetemplate canceltext="Annulla" name="yesnocancelbuttons" notext="No" yestext="Si"/>
</notification>
<notification label="Conferma il riavvio" name="ConfirmRestart">
@@ -1586,12 +1693,14 @@ Pubblica questo annuncio adesso per [AMOUNT]L$?
<button name="Cancel" text="Annulla"/>
</form>
</notification>
- <notification label="Cambiato il contenuto Mature" name="RegionMaturityChange">
- La classificazione del contenuto Mature di questa regione è stata aggiornata.
-Può essere necessario un po&apos; di tempo prima che questo cambiamento sia visibile sulle mappe.
+ <notification label="Cambiato il contenuto Moderato" name="RegionMaturityChange">
+ La classificazione di questa regione è stata aggiornata.
+Un periodo di tempo è necessario prima che la modifica venga integrata nella mappa.
+
+Per accedere a regioni per adulti, i residenti devono avere un Account verificato, mediante verifica dell&apos;età oppure mediante verifica della modalità di pagamento.
</notification>
<notification label="Versione voice non compatibile" name="VoiceVersionMismatch">
- Questa versione di [APP_NAME] non è compatibile con le capacità di Chat Voice in questa regione. Per poter far funzionare correttamente la Chat Voice devi aggiornare [APP_NAME].
+ Questa versione di [APP_NAME] non è compatibile con la funzionalità di chat vocale in questa regione. Affinché la chat vocale funzioni correttamente, dovrai aggiornare [APP_NAME].
</notification>
<notification label="Impossibile comprare oggetti" name="BuyObjectOneOwner">
Impossibile comprare oggetti da proprietari diversi nello stesso momento.
@@ -1680,36 +1789,36 @@ Hai aggiornato l&apos;ubicazione di questo preferito ma gli altri dettagli conse
Questi elementi verranno trasferiti nel tuo inventario, ma non copiati.
Trasferisci gli elementi nell&apos;inventario?
- <usetemplate ignoretext="Avvertimi quando rimuovo gli elementi &apos;no-copy&apos; da un oggetto" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ <usetemplate ignoretext="Avvertimi quando tento di rimuovore elementi per i quali non è consentita la copia da un oggetto" name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
<notification name="MoveInventoryFromScriptedObject">
Hai selezionato elementi dell&apos;inventario non copiabili. Questi elementi verranno trasferiti nel tuo inventario, non verranno copiati.
Dato che questo oggetto è scriptato, il trasferimento di questi elementi nel tuo inventario potrebbe causare un malfunzionamento degli script.
Trasferisci gli elementi nell&apos;inventario?
- <usetemplate ignoretext="Avvertimi se la rimozione di elementi &apos;no-copy&apos; possono danneggiare un oggetto scriptato" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ <usetemplate ignoretext="Avvertimi se tento di rimuovore di elementi per i quali non è consentita la copia e che potrebbero danneggiare un oggetto scriptato" name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
<notification name="ClickActionNotPayable">
- Attenzione: E&apos; stata impostata l&apos;azione &apos;Paga Oggetto&apos;, ma funzionerà soltanto se inserisci uno script con un evento money().
+ Attenzione: l&apos;azione Paga oggetto è stata impostata, ma funzionerà soltanto se inserisci uno script con un evento money().
<form name="form">
- <ignore name="ignore" text="Ho impostato l&apos;azione &apos;Paga Oggetto&apos; costruendo un oggetto senza uno script money()"/>
+ <ignore name="ignore" text="Ho impostato l&apos;azione Paga oggetto costruendo un oggetto senza uno script money()"/>
</form>
</notification>
<notification name="OpenObjectCannotCopy">
Non ci sono elementi in questo oggetto che tu possa copiare.
</notification>
<notification name="WebLaunchAccountHistory">
- Vai su [http://secondlife.com/account/ Dashboard] per vedere la storia delle tue Transazioni?
- <usetemplate ignoretext="Lancia il browser per vedere la storia del mio account" name="okcancelignore" notext="Annulla" yestext="Vai alla pagina"/>
+ Vai al [http://secondlife.com/account/ Dashboard] per vedere la cronologia del tuo account?
+ <usetemplate ignoretext="Lancia il browser per vedere la cronologia del mio account" name="okcancelignore" notext="Annulla" yestext="Vai alla pagina"/>
</notification>
<notification name="ConfirmQuit">
Confermi di voler uscire?
- <usetemplate ignoretext="Conferma Uscita" name="okcancelignore" notext="Non Uscire" yestext="Esci"/>
+ <usetemplate ignoretext="Conferma prima di uscire" name="okcancelignore" notext="Non uscire" yestext="Esci"/>
</notification>
<notification name="HelpReportAbuseEmailLL">
- Usa questo strumento per segnalare violazioni del [http://secondlife.com/corporate/tos.php Terms of Service] e [http://secondlife.com/corporate/cs.php Community Standards].
+ Usa questo strumento per segnalare violazioni a [http://secondlife.com/corporate/tos.php Terms of Service] e [http://secondlife.com/corporate/cs.php Community Standards].
-Tutti gli abusi segnalati verranno investigati e risolti. Puoi verificare lo stato delle segnalazione leggendo [http://secondlife.com/support/incidentreport.php Incident Report].
+Ogni abuso segnalato verrà esaminato e risolto.
</notification>
<notification name="HelpReportAbuseSelectCategory">
Scegli una categoria per questa segnalazione di abuso.
@@ -1733,15 +1842,15 @@ Devi essere il più specifico possibile, includendo i nomi e i dettagli dell&apo
Inserendo una descrizione accurata ci aiuti a gestire ed elaborare le segnalazioni di abuso.
</notification>
<notification name="HelpReportAbuseContainsCopyright">
- Gentile Residente,
+ Gentile residente,
-Sembra che tu stia segnalando una violazione di proprietà intellettuale. Cerca di essere sicuro che la tua segnalazione stia riportando correttamente:
+Ci risulta che tu stia segnalando una violazione di proprietà intellettuale. Per segnalare correttamente la violazione:
-(1) Il processo di Abuso. Puoi inviare una segnalazione di abuso se ritieni che un residente stia sfruttando il sistema di permessi di [SECOND_LIFE], per esempio usando CopyBot o simili strumenti di copia, per rubare i diritti della proprietà intellettuale. L&apos;Ufficio Abusi investigherà e deciderà adeguate azioni disciplinari per comportamenti che violano i [http://secondlife.com/corporate/tos.php Termini di Servizio] di [SECOND_LIFE] oppure i [http://secondlife.com/corporate/cs.php Standard di Comunità]. Si tenga però presente che l&apos;ufficio Abusi non gestisce e non risponde alle richieste di rimozione di contentuo da [SECOND_LIFE].
+(1) Definizione di abuso. Puoi inviare una segnalazione di abuso se ritieni che un residente stia sfruttando il sistema di permessi di [SECOND_LIFE], per esempio usando CopyBot o simili strumenti di copia, per rubare i diritti di proprietà intellettuale. L&apos;Ufficio abusi investigherà e deciderà adeguate azioni disciplinari per comportamenti che violano i [http://secondlife.com/corporate/tos.php Termini del servizio] di [SECOND_LIFE] oppure gli [http://secondlife.com/corporate/cs.php Standard della comunità]. Tieni comunque presente che l&apos;Ufficio abusi non gestisce e non risponde alle richieste di rimozione di contenuti da [SECOND_LIFE].
-(2) Il processo di rimozione DMCA o processo di rimozione dei contenuti. Per richiedere la rimozione di contenuto da [SECOND_LIFE], DEVI compilare una denuncia valid di furto come definito nella nostra [http://secondlife.com/corporate/dmca.php Policy DMCA].
+(2) DMCA o rimozione di contenuti. Per richiedere la rimozione di contenuti da [SECOND_LIFE], devi compilare una denuncia valida di violazione come definito nelle nostra [http://secondlife.com/corporate/dmca.php Regole DMCA] (leggi sul copyright).
-Se desideri egualmente continuare con il processo di Abuso, chiudi questa finestra e completa la compilazione della segnalazione. Puoi specificare la categoria specifica &apos;CopyBot o Sfruttamento Permessi&apos;.
+Per continuare con il procedimento di abuso, chiudi questa finestra e completa la compilazione della segnalazione. È possibile che dovrai specificare la categoria CopyBot o Sfruttamento dei diritti.
Grazie,
@@ -1755,7 +1864,7 @@ Linden Lab
C&apos;è già un oggetto indossato in questo punto del corpo.
Vuoi sostituirlo con l&apos;oggetto selezionato?
<form name="form">
- <ignore name="ignore" save_option="true" text="Sostituisci un preesistente attachment con l&apos;elemento selezionato"/>
+ <ignore name="ignore" save_option="true" text="Sostituisci un pezzo collegato con l&apos;elemento selezionato"/>
<button ignore="Replace Automatically" name="Yes" text="OK"/>
<button ignore="Never Replace" name="No" text="Annulla"/>
</form>
@@ -1765,21 +1874,21 @@ Vuoi sostituirlo con l&apos;oggetto selezionato?
Desideri abbandonare la modalità &apos;Occupato&apos; prima di completare questa transazione?
<form name="form">
- <ignore name="ignore" save_option="true" text="Sto per pagare una persona o un oggetto mentro sono Non Disponibile"/>
+ <ignore name="ignore" save_option="true" text="Sto per pagare una persona o un oggetto mentro sono in modalià Non disponibile"/>
<button ignore="Always leave Busy Mode" name="Yes" text="OK"/>
<button ignore="Never leave Busy Mode" name="No" text="Abbandona"/>
</form>
</notification>
<notification name="ConfirmDeleteProtectedCategory">
- La cartella &apos;[FOLDERNAME]&apos; è una cartella di sistema. La cancellazione delle cartelle di sistema può creare instabilità. Sei sicuro di volerla cancellare?
- <usetemplate ignoretext="Conferma prima di cancellare una cartella di sistema" name="okcancelignore" notext="Cancella" yestext="OK"/>
+ La cartella &apos;[FOLDERNAME]&apos; è una cartella di sistema. L&apos;eliminazione di cartelle di sistema può creare instabilità. Sei sicuro di volerla eliminare?
+ <usetemplate ignoretext="Chiedi conferma prima di eliminare una cartella di sistema" name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
<notification name="ConfirmEmptyTrash">
- Vuoi veramente cancellare permanentemente il contenuto del tuo Cestino?
- <usetemplate ignoretext="Conferma lo svuotamento del contenuto del Cestino" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ Vuoi veramente eliminare in modo permanente il contenuto del tuo Cestino?
+ <usetemplate ignoretext="Conferma prima di svuotare la cartella del Cestino inventario" name="okcancelignore" notext="Annulla" yestext="OK"/>
</notification>
<notification name="ConfirmClearBrowserCache">
- Vuoi veramente cancellare la storia dei viaggi, web e delle ricerche fatte?
+ Vuoi veramente eliminare la cronologia viaggi, web e ricerche fatte?
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="ConfirmClearCookies">
@@ -1791,14 +1900,14 @@ Desideri abbandonare la modalità &apos;Occupato&apos; prima di completare quest
<usetemplate name="okcancelbuttons" notext="Annulla" yestext="Si"/>
</notification>
<notification name="ConfirmEmptyLostAndFound">
- Vuoi veramente cancellare permanentemente il contenuto dei tuoi Persi e Ritrovati?
- <usetemplate ignoretext="Conferma lo svuotamento della cartella Persi e Ritrovati" name="okcancelignore" notext="No" yestext="Si"/>
+ Vuoi veramente eliminare in modo definitivo il contenuto dei tuoi Oggetti smarriti?
+ <usetemplate ignoretext="Conferma prima di svuotare della cartella Oggetti smarriti" name="okcancelignore" notext="No" yestext="Si"/>
</notification>
<notification name="CopySLURL">
Lo SLurl seguente è stato copiato negli Appunti:
[SLURL]
-Inseriscilo in una pagina web per dare ad altri un accesso facile a questa ubicazione, o provala incollandola nella barra indirizzo di un browser web.
+Inseriscilo in una pagina web per dare ad altri un accesso facile a questa ubicazione, o provala incollandola nella barra degli indirizzi di un browser web.
<form name="form">
<ignore name="ignore" text="Lo SLurl è stato copiato negli Appunti"/>
</form>
@@ -1866,18 +1975,18 @@ Inseriscilo in una pagina web per dare ad altri un accesso facile a questa ubica
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="Cannot_Purchase_an_Attachment">
- Non puoi comprare un oggetto mentre è indossato.
+ Non puoi comprare un oggetto mentre è unito.
</notification>
<notification label="Informazioni sulle richieste per il permesso di addebito" name="DebitPermissionDetails">
Accettare questa richiesta da allo script il permesso continuativo di prendere Linden dollar (L$) dal tuo account. Per revocare questo permesso, il proprietario dell&apos;oggetto deve cancellare l&apos;oggetto oppure reimpostare gli script nell&apos;oggetto.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AutoWearNewClothing">
- Vuoi indossare automaticamente gli oggetti che stai per creare?
- <usetemplate ignoretext="Indossa gli abiti che creo mentre modifico il Mio Aspetto" name="okcancelignore" notext="No" yestext="Si"/>
+ Vuoi indossare automaticamente gli indumenti che stai per creare?
+ <usetemplate ignoretext="Indossare gli abiti che creo mentre modifico il mio aspetto" name="okcancelignore" notext="No" yestext="Si"/>
</notification>
<notification name="NotAgeVerified">
- Devi avere l&apos;Età Verificata per visitare quest&apos;area. Vuoi andare sul sito [SECOND_LIFE] per verificare la tua età?
+ Per entrare in questa zona, devi avere eseguito la verifica dell&apos;età. Vuoi andare sul sito di [SECOND_LIFE] per verificare la tua età?
[_URL]
<url name="url" option="0">
@@ -1886,13 +1995,13 @@ Inseriscilo in una pagina web per dare ad altri un accesso facile a questa ubica
<usetemplate ignoretext="Non ho verificato la mia età" name="okcancelignore" notext="No" yestext="Si"/>
</notification>
<notification name="Cannot enter parcel: no payment info on file">
- Devi avere le Informazioni di Pagamento registrate per poter visitare quest&apos;area. Vuoi andare sul sito di [SECOND_LIFE] ed impostarle?
+ Per poter visitare questa zona devi avere devi aver fornito informazioni di pagamento a Linden Lab. Vuoi andare sul sito di [SECOND_LIFE] ed impostarle?
[_URL]
<url name="url" option="0">
https://secondlife.com/account/index.php?lang=it
</url>
- <usetemplate ignoretext="Manca la registrazione delle Informazioni di Pagamento" name="okcancelignore" notext="No" yestext="Si"/>
+ <usetemplate ignoretext="Manca la registrazione delle informazioni di pagamento" name="okcancelignore" notext="No" yestext="Si"/>
</notification>
<notification name="MissingString">
La stringa [STRING_NAME] non è presente in strings.xml
@@ -1900,6 +2009,9 @@ Inseriscilo in una pagina web per dare ad altri un accesso facile a questa ubica
<notification name="SystemMessageTip">
[MESSAGE]
</notification>
+ <notification name="IMSystemMessageTip">
+ [MESSAGE]
+ </notification>
<notification name="Cancelled">
Annullato
</notification>
@@ -1922,12 +2034,17 @@ Inseriscilo in una pagina web per dare ad altri un accesso facile a questa ubica
[FIRST] [LAST] è Offline
</notification>
<notification name="AddSelfFriend">
- Anche se sei molto piacevole, non puoi aggiungerti come amicizia.
+ Anche se sei molto simpatico, non puoi aggiungere te stesso all&apos;elenco degli amici.
</notification>
<notification name="UploadingAuctionSnapshot">
Sto importando le fotografie per l&apos;uso inworld e per il web...
(Durata circa 5 minuti.)
</notification>
+ <notification name="UploadConfirmation">
+ Il costo per il caricamento è di L$ [AMOUNT].
+Continuare?
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Carica nel server"/>
+ </notification>
<notification name="UploadPayment">
Hai pagato [AMOUNT]L$ per il caricamento.
</notification>
@@ -1941,11 +2058,10 @@ Inseriscilo in una pagina web per dare ad altri un accesso facile a questa ubica
Terrain.raw caricato
</notification>
<notification name="GestureMissing">
- Manca la Gesture [NAME] dal database.
+ Manca la gesture [NAME] dal database.
</notification>
<notification name="UnableToLoadGesture">
Impossibile caricare la gesture [NAME].
-Riprova.
</notification>
<notification name="LandmarkMissing">
Landmark non trovato nel database.
@@ -1954,14 +2070,14 @@ Riprova.
Impossibile caricare il Landmark di riferimento. Riprova.
</notification>
<notification name="CapsKeyOn">
- Hai il Blocco delle Maiuscole attivato.
-Questo potrebbe influenzare la tua password.
+ Hai il blocco delle maiuscole attivato.
+Questo potrebbe incidere sulla tua password.
</notification>
<notification name="NotecardMissing">
Notecard non trovata nel database.
</notification>
<notification name="NotecardNoPermissions">
- Non hai il permesso di vedere questa notecard.
+ Non hai il permesso di vedere questo biglietto.
</notification>
<notification name="RezItemNoPermissions">
Permessi insufficienti per creare un oggetto.
@@ -1999,7 +2115,7 @@ Riprova.
Riprova.
</notification>
<notification name="CannotBuyObjectsFromDifferentOwners">
- Puoi comprare oggetti solo da un proprietario per volta.
+ Puoi acquistare oggetti soltanto da un proprietario per volta.
Seleziona solo un oggetto.
</notification>
<notification name="ObjectNotForSale">
@@ -2012,10 +2128,10 @@ Seleziona solo un oggetto.
Esci dalla modalità divina, livello [LEVEL]
</notification>
<notification name="CopyFailed">
- Non hai i permessi per copiare.
+ Non hai l&apos;autorizzazione a copiare.
</notification>
<notification name="InventoryAccepted">
- [NAME] ha ricevuto la tua offerta di Inventory.
+ [NAME] ha ricevuto la tua offerta di inventario.
</notification>
<notification name="InventoryDeclined">
[NAME] non ha accettato la tua offerta dall&apos;inventario.
@@ -2030,14 +2146,14 @@ Seleziona solo un oggetto.
Il tuo biglietto da visita non è stato accettato.
</notification>
<notification name="TeleportToLandmark">
- Puoi teleportarti alle ubicazioni come &apos;[NAME]&apos; aprendo il pannello Luoghi sul lato destro dello schermo, e quindi selezionare la linguetta Landmarks.
-Clicca su un landmark per selezionarlo e quindi clicca &apos;Teleport&apos; sul fondo del pannello.
-(Puoi anche fare doppio-click sul landmark oppure cliccarlo con il tasto destro e scegliere &apos;Teleport&apos;.)
+ Puoi teleportarti alle ubicazioni come &apos;[NAME]&apos; aprendo il pannello Luoghi sul lato destro dello schermo, quindi selezionare la scheda Punti di riferimento.
+Clicca su un punto di riferimento per selezionarlo, quindi clicca su Teleport sul lato inferiore del pannello.
+(Puoi anche fare doppio clic sul punto di riferimento oppure cliccare su di esso con il tasto destro del mouse e scegliere Teleport.)
</notification>
<notification name="TeleportToPerson">
- Puoi contattare residenti come &apos;[NAME]&apos; aprendo il pannello Persone sul lato destro dello schermo.
-Seleziona il residente dalla lista, e clica &apos;IM&apos; in fondo al pannello.
-(Puoi anche fare doppio click sul loro nome nella lista, oppure cliccare con il tasto destro e scegliere &apos;IM&apos;).
+ Puoi contattare il residente &apos;[NAME]&apos; aprendo il pannello Persone nel lato destro del tuo schermo.
+Seleziona il residente dall&apos;elenco, clicca su &apos;IM&apos; in basso nel pannello.
+(Puoi anche fare doppio clic sul nome nell&apos;elenco oppure fare clic con il pulsante destro del mouse e selezionare &apos;IM&apos;).
</notification>
<notification name="CantSelectLandFromMultipleRegions">
Non è possibile selezionare il terreno attraverso i confini del server.
@@ -2047,7 +2163,7 @@ Prova a selezionare una parte di terreno più piccola.
Alcuni termini della ricerca sono stati esclusi a causa delle restrizioni di contenuto come esposto negli Standard della comunità.
</notification>
<notification name="NoContentToSearch">
- Seleziona almeno un tipo di contenuto per la ricerca (PG, Mature, o Adult).
+ Seleziona almeno un tipo di contenuto per la ricerca (Generale, Moderato o Adulti).
</notification>
<notification name="GroupVote">
[NAME] ha proposto di votare su:
@@ -2087,19 +2203,19 @@ Prova a selezionare una parte di terreno più piccola.
[NAMES]
</notification>
<notification name="NoQuickTime">
- Il Software QuickTime di Apple non sembra installato sul tuo computer.
-Se vuoi vedere contenuto multimediale sugli appezzamenti che lo supportano devi andare su [http://www.apple.com/quicktime QuickTime site] e installare il Player QuickTime.
+ Il software QuickTime di Apple sembra non essere installato sul tuo computer.
+Se vuoi vedere contenuto multimediale in streaming sui lotti che lo supportano, vai alla pagina [http://www.apple.com/quicktime QuickTime] e installa il Player QuickTime.
</notification>
<notification name="NoPlugin">
- Nessun Media Plugin è stato trovato per gestire &quot;[MIME_TYPE]&quot; il tipo mime. Il Media di questo tipo non è disponibile.
+ Non è stato trovato alcun plugin multimediale per gestire il tipo mime [MIME_TYPE]. Il media di questo tipo non è disponibile.
</notification>
<notification name="MediaPluginFailed">
- Questo Media Plugin non funziona:
+ Questo plugin multimediale non funziona:
[PLUGIN]
-Per favore re-installa il plugin o contatta il venditore se continui ad avere questi problemi.
+Reinstalla il plugin o contatta il venditore se continui ad avere questi problemi.
<form name="form">
- <ignore name="ignore" text="Mancato funzionamento del Media Plugin"/>
+ <ignore name="ignore" text="Mancato funzionamento del plugin multimediale"/>
</form>
</notification>
<notification name="OwnedObjectsReturned">
@@ -2109,7 +2225,7 @@ Per favore re-installa il plugin o contatta il venditore se continui ad avere qu
Gli oggetti selezionati sul terreno che è di proprietà di [FIRST] [LAST] sono stati restituiti nel suo inventario.
</notification>
<notification name="OtherObjectsReturned2">
- Gli oggetti selezionati sul terreno di proprietà del residente &apos;[NAME]&apos; sono stati restituiti al loro proprietario.
+ Sono stati restituiti al proprietario gli oggetti selezionati sul lotto nella terra di proprietà del residente &apos;[NAME]&apos;.
</notification>
<notification name="GroupObjectsReturned">
Gli oggetti selezionati sul terreno e condivisi con il gruppo [GROUPNAME] sono stati restituiti nell&apos;inventario dei propietari.
@@ -2121,24 +2237,24 @@ Gli oggetti non trasferibili che erano stati ceduti al gruppo sono stati cancell
</notification>
<notification name="ServerObjectMessage">
Messaggio da [NAME]:
-[MSG]
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
</notification>
<notification name="NotSafe">
- Questo terreno è abilitato ai Danni da combattimento.
-Qui potresti ricevere ferite. Se dovessi morire verrai teleportato a casa tua.
+ Su questo terreno sono abilitati i danni.
+Qui potresti essere ferito. Se dovessi morire verrai teleportato a casa tua.
</notification>
<notification name="NoFly">
- Quest&apos;are ha il volo disabilitato.
+ In questa zona è proibito il volo.
Qui non puoi volare.
</notification>
<notification name="PushRestricted">
- Quest&apos;area non consente le spinte. Non puoi spingere gli altri a meno che tu non sia il proprietario del terreno.
+ Questa zona non consente le spinte. Non puoi spingere gli altri a meno che tu non sia il proprietario del terreno.
</notification>
<notification name="NoVoice">
- Quest&apos;area ha la chat voice disabilitata. Non puoi sentire nessuno parlare.
+ Questa zona ha la chat vocale disattivata. Non puoi sentire nessuno parlare.
</notification>
<notification name="NoBuild">
- Quest&apos;area ha il building disabilitato. Qui non puoi costruire o rezzare oggetti.
+ In questa zona è proibita la costruzione. Qui non puoi costruire né rezzare oggetti.
</notification>
<notification name="ScriptsStopped">
Un amministratore ha temporaneamente disabilitato gli script in questa regione.
@@ -2149,10 +2265,10 @@ Qui non puoi volare.
<notification name="NoOutsideScripts">
Questo terreno non consente script esterni.
-Qui funzinano solo gli script del proprietario del terreno.
+Qui funzionano soltanto gli script del proprietario del terreno.
</notification>
<notification name="ClaimPublicLand">
- Puoi solo chiedere terreni pubblici nella regione in cui sei posizionato.
+ Puoi solo richiedere terreni pubblici nella regione in cui sei posizionato.
</notification>
<notification name="RegionTPAccessBlocked">
Non puoi entrare in quella regione a causa della tua categoria di accesso. Può essere necessario validare l&apos;età e/o installare l&apos;ultima versione del programma.
@@ -2230,16 +2346,7 @@ Riprova tra qualche istante.
Non è stato trovato nessun territorio valido.
</notification>
<notification name="ObjectGiveItem">
- L&apos;oggetto [OBJECTFROMNAME] posseduto da [NAME_SLURL] ti ha dato [OBJECTTYPE]:
-[ITEM_SLURL]
- <form name="form">
- <button name="Keep" text="Prendi"/>
- <button name="Discard" text="Rifiuta"/>
- <button name="Mute" text="Blocca"/>
- </form>
- </notification>
- <notification name="ObjectGiveItemUnknownUser">
- Un oggetto di nome [OBJECTFROMNAME] posseduto da un residente sconosciuto ti ha dato [OBJECTTYPE]:
+ Un oggetto denominato [OBJECTFROMNAME] di proprietà di [NAME_SLURL] ti ha dato questo [OBJECTTYPE]:
[ITEM_SLURL]
<form name="form">
<button name="Keep" text="Prendi"/>
@@ -2248,12 +2355,12 @@ Riprova tra qualche istante.
</form>
</notification>
<notification name="UserGiveItem">
- [NAME_SLURL] ti ha dato [OBJECTTYPE]:
+ [NAME_SLURL] ti ha dato questo [OBJECTTYPE]:
[ITEM_SLURL]
<form name="form">
- <button name="Keep" text="Prendi"/>
<button name="Show" text="Mostra"/>
<button name="Discard" text="Rifiuta"/>
+ <button name="Mute" text="Blocca"/>
</form>
</notification>
<notification name="GodMessage">
@@ -2270,14 +2377,17 @@ Riprova tra qualche istante.
</form>
</notification>
<notification name="TeleportOffered">
- [NAME] ti ha offerto di teleportarti nella sua ubicazione:
+ [NAME_SLURL] ti ha offerto il teleport alla sua ubicazione:
-[MESSAGE]
+[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
<form name="form">
<button name="Teleport" text="Teleport"/>
<button name="Cancel" text="Cancella"/>
</form>
</notification>
+ <notification name="TeleportOfferSent">
+ Offerta di Teleport inviata a [TO_NAME]
+ </notification>
<notification name="GotoURL">
[MESSAGE]
[URL]
@@ -2287,11 +2397,11 @@ Riprova tra qualche istante.
</form>
</notification>
<notification name="OfferFriendship">
- [NAME] ti ha offerto la sua amicizia.
+ [NAME_SLURL] ti ha offerto di diventare amici.
[MESSAGE]
-(Di default, potrete vedervi reciprocamente online.)
+(L&apos;impostazione predefinita consente a ciascuno di vedere se l&apos;altro è online.)
<form name="form">
<button name="Accept" text="Accetta"/>
<button name="Decline" text="Rifiuta"/>
@@ -2315,22 +2425,27 @@ Riprova tra qualche istante.
<notification name="FriendshipDeclined">
[NAME] ha rifiutato la tua offerta di amicizia.
</notification>
+ <notification name="FriendshipAcceptedByMe">
+ Offerta di amicizia accettata.
+ </notification>
+ <notification name="FriendshipDeclinedByMe">
+ Offerta di amicizia rifiutata.
+ </notification>
<notification name="OfferCallingCard">
- [FIRST] [LAST] ti ha offerto il suo biglietto da visita.
-Questo aggiungerà un segnalibro nel tuo inventario.
-in modo da poter rapidamente inviargli un IM al residente.
+ [FIRST] [LAST] ti offre il suo biglietto da visita.
+Questo sarà aggiunto nel tuo inventario come segnalibro per consentirti di inviare rapidamente messaggi IM a questo residente.
<form name="form">
<button name="Accept" text="Accetta"/>
<button name="Decline" text="Rifiuta"/>
</form>
</notification>
<notification name="RegionRestartMinutes">
- Questa regione farà il restart fra [MINUTES] minuti.
-Se rimani qui verrai disconnesso.
+ Questa regione verrà riavviata fra [MINUTES] minuti.
+Se rimani qui verrai scollegato da Second Life.
</notification>
<notification name="RegionRestartSeconds">
- Questa regione farà il restart fra [SECONDS] secondi.
-Se rimani qui verrai disconnesso.
+ Questa regione verrà riavviata fra [SECONDS] secondi.
+Se rimani qui verrai scollegato da Second Life.
</notification>
<notification name="LoadWebPage">
Caricare pagina web [URL]?
@@ -2349,6 +2464,9 @@ Dall&apos;oggetto: [OBJECTNAME], di: [NAME]?
<notification name="FailedToFindWearable">
Impossibile trovare [TYPE] chiamato [DESC] nel database.
</notification>
+ <notification name="ShareToWebFailed">
+ Caricamento dell&apos;immagine su Web non riuscita.
+ </notification>
<notification name="InvalidWearable">
L&apos;elemento che stai tentando di indossare usa delle caratteristiche che il tuo viewer non può leggere. Aggiorna la versione di [APP_NAME] per poterlo indossare.
</notification>
@@ -2367,9 +2485,9 @@ Va bene?
Un oggetto di nome &apos;[OBJECTNAME]&apos;, posseduto da &apos;[NAME]&apos; vorrebbe:
[QUESTIONS]
-Se non ti fidi di questo oggetto e del suo creatore dovresti declinare la richiesta.
+Se non ti fidi di questo oggetto e del suo ideatore, dovresti rifiutare la richiesta.
-Consenti questa richiesta?
+Concedi questa richiesta?
<form name="form">
<button name="Grant" text="Accetta"/>
<button name="Deny" text="Nega"/>
@@ -2390,44 +2508,12 @@ Consenti questa richiesta?
<button name="Ignore" text="Ignora"/>
</form>
</notification>
- <notification name="ScriptToast">
- [FIRST] [LAST]&apos;s &apos;[TITLE]&apos; richiede il contributo dell&apos;utente.
- <form name="form">
- <button name="Open" text="Apri il Dialog"/>
- <button name="Ignore" text="Ignora"/>
- <button name="Block" text="Blocca"/>
- </form>
- </notification>
- <notification name="FirstBalanceIncrease">
- Hai appena ricevuto [AMOUNT]L$.
-Il tuo saldo in L$ è mostrato in alto a destra.
- </notification>
- <notification name="FirstBalanceDecrease">
- Hai appena pagato [AMOUNT]L$.
-Il tuo saldo in L$ è mostrato in alto a destra.
- </notification>
<notification name="BuyLindenDollarSuccess">
- Grazie per il pagamento!
+ Grazie per aver inviato il pagamento.
-Il tuo saldo in L$ sarà aggiornato al termine dell&apos;elaborazione. Se l&apos;elaborazione dovesse impiegare più di 20 minuti, la transazione verrà annullata. In quel caso l&apos;ammontare dell&apos;acquisto verrà rimborsato nel tuo saldo in US$.
+Il tuo saldo in L$ sarà aggiornato al termine dell&apos;elaborazione. Se l&apos;elaborazione dovesse impiegare più di 20 minuti, la transazione verrà annullata. In quel caso l&apos;ammontare dell&apos;acquisto verrà accreditato sul tuo saldo in US$.
-Lo stato del tuo pagamento potrà essere controllato nella pagina della Storia delle tue Transazioni su [http://secondlife.com/account/ Pannello di Controllo]
- </notification>
- <notification name="FirstSit">
- Sei seduto.
-Usa le frecce (oppure AWSD) per guardarti intorno.
-Clicca il bottone &apos;Alzati&apos; per alzarti.
- </notification>
- <notification name="FirstMap">
- Clicca e trascina la mappa per guardare attorno.
-Fai doppio click per teleportarti.
-Usa i controlli sulla destra per trovare cose e visualizzare sfondi differenti.
- </notification>
- <notification name="FirstBuild">
- Hai aperto gli Strumenti di Build. Ogni oggetto attorno a te è stato costruito con questi strumenti.
- </notification>
- <notification name="FirstTeleport">
- Puoi teleportarti solo in certe aree di questa regione. La freccia indica la tua destinazione. Clicca sulla freccia per farla sparire.
+Potrai controllare lo stato del pagamento nella pagina della cronologia delle transazioni nel tuo [http://secondlife.com/account/ Dashboard]
</notification>
<notification name="FirstOverrideKeys">
I tuoi movimenti della tastiera vengono ora gestiti da un oggetto.
@@ -2435,42 +2521,17 @@ Prova i tasti freccia o AWSD per vedere quello che fanno.
Alcuni oggetti (come pistole) richiedono di andare in mouselook per il loro utilizzo.
Premi &apos;M&apos; per farlo.
</notification>
- <notification name="FirstAppearance">
- Stai modificando il tuo aspetto.
-Usa le frecce per guardarti attorno.
-Quando hai finito premi &apos;Salva Tutto&apos;.
- </notification>
- <notification name="FirstInventory">
- Questo è il tuo Inventory, che contiene gli elementi che possiedi.
-
-* Per indossare qualcosa, trascinala su di te.
-* Per rezzare qualcosa inworld, trascinala sul suolo.
-* Per leggere una notecard, fai doppio click.
- </notification>
<notification name="FirstSandbox">
- Questa è una Sandbox, serve per aiutare i Residenti ad imparare a costruire.
+ Questa è una Sandbox, serve ai residenti per imparare a costruire.
-Gli oggetti che costruisci qui saranno cancellati dopo che te ne sei andato, perciò non dimenticare di cliccare sulle tue creazioni col tasto destro e scegliere &apos;Prendi&apos; per trasferirle nel tuo Inventory.
- </notification>
- <notification name="FirstFlexible">
- Questo oggetto è flessibile. Gli oggetti Flexy devono essere fantasma e non fisici.
- </notification>
- <notification name="FirstDebugMenus">
- Hai abilitato il menu Avanzato.
-
-Per abilitarlo/disabilitarlo,
- Windows: Ctrl+Alt+D
- Mac: &#8997;&#8984;D
- </notification>
- <notification name="FirstSculptedPrim">
- Stai modificando un prim Sculpted. Gli oggetti Sculpted hanno bisogno di una texture speciale per definire la loro forma.
+Gli oggetti che costruisci qui verranno eliminati dopo che te ne sei andato, perciò non dimenticare di cliccare sulle tue creazioni col tasto destro del mouse e scegliere Prendi per trasferirle nel tuo Inventario.
</notification>
<notification name="MaxListSelectMessage">
È possibile selezionare solo fino a [MAX_SELECT] oggetti da questa lista.
</notification>
<notification name="VoiceInviteP2P">
- [NAME] ti sta invitando ad una chiamata in Chat Voice.
-Clicca Accetta per unirti alla chiamata oppure Declina per declinare l&apos;invito. Clicca Blocca per bloccare questo chiamante.
+ [NAME] ti sta invitando ad una chiamata in chat vocale.
+Clicca su Accetta per unirti alla chiamata oppure su Declina to declinare l&apos;invito. Clicca su Blocca per bloccare questo chiamante.
<form name="form">
<button name="Accept" text="Accetta"/>
<button name="Decline" text="Rifiuta"/>
@@ -2478,17 +2539,17 @@ Clicca Accetta per unirti alla chiamata oppure Declina per declinare l&apos;invi
</form>
</notification>
<notification name="AutoUnmuteByIM">
- Hai appena inviato un IM a [FIRST] [LAST], che è stato automaticamente sbloccato.
+ [FIRST] [LAST] ha ricevuto un IM ed è stato automaticamente sbloccato.
</notification>
<notification name="AutoUnmuteByMoney">
- Hai appena inviato del denaro a [FIRST] [LAST], che è stato automaticamente sbloccato.
+ [FIRST] [LAST] ha ricevuto del denaro e pertanto è stato automaticamente sbloccato.
</notification>
<notification name="AutoUnmuteByInventory">
- Hai appena offerto un elemento dell&apos;Inventory a [FIRST] [LAST], che è stato automaticamente sbloccato.
+ A [FIRST] [LAST] è stato offerto un elemento dell&apos;Inventario e pertanto è stato automaticamente sbloccato.
</notification>
<notification name="VoiceInviteGroup">
- [NAME] si è aggiunto alla chiamata in Chat Voice con il gruppo [GROUP].
-Clicca Accetta per unirti alla chiamata oppure Declina per declinare l&apos;invito. Clicca Blocca per bloccare questo chiamante.
+ [NAME] si è aggiunto alla chiamata in chat vocale con il gruppo [GROUP].
+Clicca su Accetta per unirti alla chiamata oppure su Declina to declinare l&apos;invito. Clicca su Blocca per bloccare questo chiamante.
<form name="form">
<button name="Accept" text="Accetta"/>
<button name="Decline" text="Rifiuta"/>
@@ -2496,8 +2557,8 @@ Clicca Accetta per unirti alla chiamata oppure Declina per declinare l&apos;in
</form>
</notification>
<notification name="VoiceInviteAdHoc">
- [NAME] si è aggiunto alla chiamata in Chat Voice con una conferenza.
-Clicca Accetta per unirti alla chiamata oppure Declina to declinare l&apos;invito. Clicca Blocca per bloccare questo chiamante.
+ [NAME] si è aggiunto alla chiamata in chat vocale con una conferenza.
+Clicca su Accetta per unirti alla chiamata oppure su Declina to declinare l&apos;invito. Clicca su Blocca per bloccare questo chiamante.
<form name="form">
<button name="Accept" text="Accetta"/>
<button name="Decline" text="Rifiuta"/>
@@ -2506,7 +2567,7 @@ Clicca Accetta per unirti alla chiamata oppure Declina to declinare l&apos;invit
</notification>
<notification name="InviteAdHoc">
[NAME] ti sta invitando ad una conferenza in chat.
-Clicca Accetta per unirti alla chat oppure Declina per declinare l&apos;invito. Clicca Blocca per bloccare questo chiamante.
+Clicca su Accetta per unirti alla chat oppure su Declina per declinare l&apos;invito. Clicca su Blocca per bloccare questo chiamante.
<form name="form">
<button name="Accept" text="Accetta"/>
<button name="Decline" text="Rifiuta"/>
@@ -2520,25 +2581,40 @@ Clicca Accetta per unirti alla chat oppure Declina per declinare l&apos;invito.
Siamo spiacenti. Questa area ha raggiunto la capacità massima per le chiamate voice. Si prega di provare ad usare il voice in un&apos;altra area.
</notification>
<notification name="VoiceChannelDisconnected">
- Sei stato disconnesso da [VOICE_CHANNEL_NAME]. Verrai ora riconnesso alla Chat Voice Locale.
+ Sei stato scollegato da [VOICE_CHANNEL_NAME]. Verrai ora ricollegato alla chat vocale nei dintorni.
</notification>
<notification name="VoiceChannelDisconnectedP2P">
- [VOICE_CHANNEL_NAME] ha terminato la chiamata. Verrai ora riconnesso alla Chat Voice Locale.
+ [VOICE_CHANNEL_NAME] ha chiuso la chiamata. Verrai ora ricollegato alla chat vocale nei dintorni.
</notification>
<notification name="P2PCallDeclined">
- [VOICE_CHANNEL_NAME] ha declinato la tua chiamata. Verrai ora riconnesso alla Chat Voice Locale.
+ [VOICE_CHANNEL_NAME] ha declinato la tua chiamata. Verrai ora ricollegato alla chat vocale nei dintorni.
</notification>
<notification name="P2PCallNoAnswer">
- [VOICE_CHANNEL_NAME] non è disponibile per la tua chiamata. Verrai ora riconnesso alla Chat Voice Locale.
+ [VOICE_CHANNEL_NAME] non è disponibile per la tua chiamata. Verrai ora ricollegato alla chat vocale nei dintorni.
</notification>
<notification name="VoiceChannelJoinFailed">
- Connessione a [VOICE_CHANNEL_NAME] fallita, riprova più tardi. Verrai ora riconnesso alla Chat Voice Locale.
+ Collegamento a [VOICE_CHANNEL_NAME] non riuscito, riprova più tardi. Verrai ora ricollegato alla chat vocale nei dintorni.
</notification>
<notification name="VoiceLoginRetry">
Stiamo creando una canale voice per te. Questo può richiedere fino a un minuto.
</notification>
+ <notification name="VoiceEffectsExpired">
+ Almeno una delle manipolazioni vocali alle quali sei iscritto è scaduta.
+[[URL] Fai clic qui] per rinnovare l&apos;abbonamento.
+ </notification>
+ <notification name="VoiceEffectsExpiredInUse">
+ Poiché la manipolazione vocale attiva è scaduta, sono state applicate le tue impostazioni normali.
+[[URL] Fai clic qui] per rinnovare l&apos;abbonamento.
+ </notification>
+ <notification name="VoiceEffectsWillExpire">
+ Almeno una delle tue manipolazioni vocali scadrà tra meno di [INTERVAL] giorni.
+[[URL] Fai clic qui] per rinnovare l&apos;abbonamento.
+ </notification>
+ <notification name="VoiceEffectsNew">
+ Sono disponibili nuove manipolazioni vocali.
+ </notification>
<notification name="Cannot enter parcel: not a group member">
- Soltanto i membri di uno specifico gruppo possono visitare quest&apos;area.
+ Soltanto i membri di un determinato gruppo possono visitare questa zona.
</notification>
<notification name="Cannot enter parcel: banned">
Non puoi entrare nel terreno, sei stato bloccato.
@@ -2553,17 +2629,17 @@ Clicca Accetta per unirti alla chat oppure Declina per declinare l&apos;invito.
Si è verificato un errore durante il tentativo di collegarti a una voice chat con [VOICE_CHANNEL_NAME]. Riprova più tardi.
</notification>
<notification name="ServerVersionChanged">
- Sei appena entrato in una regione che usa una versione differente del server, questo potrebbe influenzare le prestazioni. [[URL] Guarda le Release Notes.]
+ Sei appena entrato in una regione che usa una versione differente del server: ciò potrebbe incidere sule prestazioni. [[URL] Visualizza le note sulla versione.]
</notification>
<notification name="UnsupportedCommandSLURL">
- Lo SLurl che hai cliccato non è attivo.
+ Lo SLurl su cui hai cliccato non è valido.
</notification>
<notification name="BlockedSLURL">
- Uno SLurl è stato ricevuto da un browser sconosciuto e per la tua sicurezza è stato bloccato.
+ Uno SLurl è stato ricevuto da un browser sconosciuto o non sicuro e, per sicurezza, è stato bloccato.
</notification>
<notification name="ThrottledSLURL">
- Multipli SLurls sono stati ricevuti da un browser sconosciuto in un breve periodo.
-Per la tua sicurezza verranno bloccati per alcuni secondi.
+ Sono stati ricevuti più SLurl da un browser sconosciuto o non sicuro in un breve periodo di tempo.
+Per sicurezza, verranno bloccati per alcuni secondi.
</notification>
<notification name="IMToast">
[MESSAGE]
@@ -2571,19 +2647,23 @@ Per la tua sicurezza verranno bloccati per alcuni secondi.
<button name="respondbutton" text="Rispondi"/>
</form>
</notification>
+ <notification name="ConfirmCloseAll">
+ Sicuro di voler chiudere tutti gli IM?
+ <usetemplate ignoretext="Conferma prima della chiusura di tutti gli IM" name="okcancelignore" notext="Annulla" yestext="OK"/>
+ </notification>
<notification name="AttachmentSaved">
- L&apos;Allegato (Attachment) è stato salvato.
+ L&apos;elemento da collegare è stato salvato.
</notification>
<notification name="UnableToFindHelpTopic">
- Impossibilitato a trovare il tema aiuto per questo elemento (nozione)???!!!!.
+ Impossibile trovare l&apos;argomento nell&apos;aiuto per questo elemento.
</notification>
<notification name="ObjectMediaFailure">
- Errore del Server: aggiornamento del Media o mancato funzionamento.
+ Errore del server: mancato aggiornamento o ottenimento del media.
&apos;[ERROR]&apos;
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="TextChatIsMutedByModerator">
- Il tuo testo nella chat è stato interrotto dal moderatore.
+ La tua chat di testo è stata interrotta dal moderatore.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="VoiceIsMutedByModerator">
@@ -2592,19 +2672,109 @@ Per la tua sicurezza verranno bloccati per alcuni secondi.
</notification>
<notification name="ConfirmClearTeleportHistory">
Sei sicuro di volere cancellare la cronologia dei tuoi teleport?
- <usetemplate name="okcancelbuttons" notext="Cancella" yestext="OK"/>
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="OK"/>
</notification>
<notification name="BottomTrayButtonCanNotBeShown">
- Il bottone selezionato non può essere mostrato in questo momento.
-Il bottone verrà mostrato quando ci sarà abbastanza spazio.
+ Il pulsante selezionato non può essere visualizzato in questo momento.
+Il pulsante verrà visualizzato quando lo spazio sarà sufficiente.
+ </notification>
+ <notification name="ShareNotification">
+ Scegli i residenti con i quali condividere.
+ </notification>
+ <notification name="ShareItemsConfirmation">
+ Sei sicuro di volere condividere gli oggetti
+
+[ITEMS]
+
+Con i seguenti residenti?
+
+[RESIDENTS]
+ <usetemplate name="okcancelbuttons" notext="Annulla" yestext="Ok"/>
+ </notification>
+ <notification name="ItemsShared">
+ Gli oggetti sono stati condivisi.
+ </notification>
+ <notification name="DeedToGroupFail">
+ Cessione al gruppo non riuscita.
+ </notification>
+ <notification name="AvatarRezNotification">
+ ( in esistenza da [EXISTENCE] secondi )
+Nuvola avatar &apos;[NAME]&apos; dileguata dopo [TIME] secondi.
+ </notification>
+ <notification name="AvatarRezSelfBakedDoneNotification">
+ ( in esistenza da [EXISTENCE] secondi )
+Baking dei vestiti terminato dopo [TIME] secondi.
+ </notification>
+ <notification name="AvatarRezSelfBakedUpdateNotification">
+ ( in esistenza da [EXISTENCE] secondi )
+Hai inviato un aggiornamento al tuo aspetto dopo [TIME] secondi.
+[STATUS]
+ </notification>
+ <notification name="AvatarRezCloudNotification">
+ ( presente da [EXISTENCE] secondi )
+Avatar &apos;[NAME]&apos; trasformato in nuvola.
+ </notification>
+ <notification name="AvatarRezArrivedNotification">
+ ( presente da [EXISTENCE] secondi )
+È comparso l&apos;avatar &apos;[NAME]&apos;.
+ </notification>
+ <notification name="AvatarRezLeftCloudNotification">
+ ( presente da [EXISTENCE] secondi )
+Avatar &apos;[NAME]&apos; partito dopo [TIME] secondi sotto forma di nuvola.
+ </notification>
+ <notification name="AvatarRezEnteredAppearanceNotification">
+ ( presente da [EXISTENCE] secondi )
+Avatar &apos;[NAME]&apos; è entrato nella modalità aspetto.
+ </notification>
+ <notification name="AvatarRezLeftAppearanceNotification">
+ ( presente da [EXISTENCE] secondi )
+Avatar &apos;[NAME]&apos; ha lasciato la modalità aspetto.
+ </notification>
+ <notification name="NoConnect">
+ Ci sono problemi di connessione tramite [PROTOCOL] [HOSTID].
+Ti consigliamo di controllare le tue impostazioni di rete e della firewall.
+ <form name="form">
+ <button name="OK" text="OK"/>
+ </form>
+ </notification>
+ <notification name="NoVoiceConnect">
+ A causa di problemi di connessione al server vocale
+
+[HOSTID]
+
+le comunicazioni tramite voce non saranno disponibili.
+Ti consigliamo di controllare le tue impostazioni di rete e della firewall.
+ <form name="form">
+ <button name="OK" text="OK"/>
+ </form>
+ </notification>
+ <notification name="AvatarRezLeftNotification">
+ ( presente da [EXISTENCE] secondi )
+Avatar &apos;[NAME]&apos; è partito completamente caricato.
+ </notification>
+ <notification name="AvatarRezSelfBakeNotification">
+ ( in esistenza da [EXISTENCE] secondi )
+Hai caricato una texture [RESOLUTION] completata per &apos;[BODYREGION]&apos; dopo [TIME] secondi.
+ </notification>
+ <notification name="ConfirmLeaveCall">
+ Sei sicuro di volere uscire dalla chiamata?
+ <usetemplate ignoretext="Conferma prima di uscire dalla chiamata" name="okcancelignore" notext="No" yestext="Sì"/>
+ </notification>
+ <notification name="ConfirmMuteAll">
+ Hai scelto di disattivare l&apos;audio di tutti i partecipanti alla chiamata di gruppo.
+In questo modo verrà disattivato l&apos;audio anche di tutti i residenti che si
+uniscono alla chiamata in un secondo momento, anche dopo che tu ti fossi scollegato.
+
+Disattiva audio di tutti?
+ <usetemplate ignoretext="Conferma prima di disattivare l&apos;audio di tutti i partecipanti alla chiamata di gruppo" name="okcancelignore" notext="Annulla" yestext="Ok"/>
</notification>
<global name="UnsupportedCPU">
- La velocità della tua CPU non soddisfa i requisiti minimi.
</global>
<global name="UnsupportedGLRequirements">
- Non sembra che tu abbia i requisiti hardware adeguati per [APP_NAME]. [APP_NAME] richiede una scheda grafica OpenGL con supporto multitexture. Se tu ce l&apos;hai, dovresti accertarti di avere i driver, i service pack e le patch più recenti della scheda grafica e del tuo sistema operativo.
+ Non sembra che tu abbia i requisiti hardware adeguati per [APP_NAME]. [APP_NAME] richiede una scheda grafica OpenGL con supporto multitexture. Se ne hai una in dotazione, accertati di avere i driver, i service pack e i patch più recenti per la scheda grafica e per il sistema operativo.
-Se continui ad avere problemi, visita [SUPPORT_SITE].
+Se continui ad avere problemi, visita la pagina [SUPPORT_SITE].
</global>
<global name="UnsupportedCPUAmount">
796
@@ -2619,7 +2789,7 @@ Se continui ad avere problemi, visita [SUPPORT_SITE].
- La memoria del tuo sistema non soddisfa i requisiti minimi.
</global>
<global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
- Se possiedi una parte di terra, puoi creare qui la tua ubicazione di casa.
-Altrimenti, puoi guardare sulla Mappa e trovare luoghi segnalati come &quot;Infohub&quot;.
+ Se sei proprietario di un appezzamento di terreno, puoi definirlo come la tua posizione iniziale.
+In alternativa, puoi guardare sulla mappa e trovare luoghi segnalati come &quot;Infohub&quot;.
</global>
</notifications>
diff --git a/indra/newview/skins/default/xui/it/outfit_accordion_tab.xml b/indra/newview/skins/default/xui/it/outfit_accordion_tab.xml
new file mode 100644
index 0000000000..bac885e5d8
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/outfit_accordion_tab.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: mantipov: this xml is intended to be used inside panel_outfits_list.xml for each outfit folder-->
+<!-- All accordion tabs in the My Appearance/My Outfits panel will be created from this one at runtume-->
+<accordion_tab name="Mockup Tab" title="Mockup Tab"/>
diff --git a/indra/newview/skins/default/xui/it/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/it/panel_adhoc_control_panel.xml
index 4a7c9b11c7..be001d09f8 100644
--- a/indra/newview/skins/default/xui/it/panel_adhoc_control_panel.xml
+++ b/indra/newview/skins/default/xui/it/panel_adhoc_control_panel.xml
@@ -1,8 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_im_control_panel">
- <panel name="panel_call_buttons">
- <button label="Chiama" name="call_btn"/>
- <button label="Abbandona Chiamata" name="end_call_btn"/>
- <button label="Voice Controls" name="voice_ctrls_btn"/>
- </panel>
+ <layout_stack name="vertical_stack">
+ <layout_panel name="call_btn_panel">
+ <button label="Chiama" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Abbandona chiamata" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Regolazione voce" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml
index 40f805774e..4c7f298590 100644
--- a/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/it/panel_avatar_list_item.xml
@@ -1,25 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="avatar_list_item">
<string name="FormatSeconds">
- [COUNT]s
+ [COUNT] s
</string>
<string name="FormatMinutes">
- [COUNT]m
+ [COUNT] m
</string>
<string name="FormatHours">
- [COUNT]h
+ [COUNT] h
</string>
<string name="FormatDays">
- [COUNT]d
+ [COUNT] g
</string>
<string name="FormatWeeks">
- [COUNT]w
+ [COUNT] sett
</string>
<string name="FormatMonths">
- [COUNT]mon
+ [COUNT] mes
</string>
<string name="FormatYears">
- [COUNT]y
+ [COUNT] a
</string>
<text name="avatar_name" value="Sconosciuto"/>
+ <button name="profile_btn" tool_tip="Vedi profilo"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/it/panel_block_list_sidetray.xml
index cf833924ae..610f561a65 100644
--- a/indra/newview/skins/default/xui/it/panel_block_list_sidetray.xml
+++ b/indra/newview/skins/default/xui/it/panel_block_list_sidetray.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="block_list_panel">
<text name="title_text">
- Lista bloccata
+ Blocca lista
</text>
- <scroll_list name="blocked" tool_tip="Lista dei residenti bloccati"/>
- <button label="Blocca il Residente..." label_selected="Blocca Residente..." name="Block resident..." tool_tip="Scegli un residente da bloccare"/>
+ <scroll_list name="blocked" tool_tip="Lista degli attuali residenti bloccati"/>
+ <button label="Blocca il residente..." label_selected="Blocca il residente..." name="Block resident..." tool_tip="Scegli un residente da bloccare"/>
<button label="Blocca l&apos;oggetto per nome..." label_selected="Blocca l&apos;oggetto per nome..." name="Block object by name..."/>
- <button label="Sblocca" label_selected="Sblocca" name="Unblock" tool_tip="Rimuovi dalla lista il residente o l&apos;oggetto bloccato"/>
+ <button label="Sblocca" label_selected="Sblocca" name="Unblock" tool_tip="Rimuovi un residente o un oggetto dalla lista bloccati"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/it/panel_body_parts_list_item.xml
new file mode 100644
index 0000000000..de764d8025
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_body_parts_list_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="wearable_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_bodyparts_list_button_bar.xml b/indra/newview/skins/default/xui/it/panel_bodyparts_list_button_bar.xml
new file mode 100644
index 0000000000..8fc23d34f1
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_bodyparts_list_button_bar.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="clothing_list_button_bar_panel">
+ <button label="Cambia" name="switch_btn"/>
+ <button label="Acquista &gt;" name="bodyparts_shop_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_bottomtray.xml b/indra/newview/skins/default/xui/it/panel_bottomtray.xml
index f2aab63dce..e4d99cc402 100644
--- a/indra/newview/skins/default/xui/it/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/it/panel_bottomtray.xml
@@ -1,23 +1,49 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="bottom_tray">
- <string name="SpeakBtnToolTip">
- Microfono on/off
- </string>
- <string name="VoiceControlBtnToolTip">
- Mostra/nascondi il pannello voice control
- </string>
+ <string name="SpeakBtnToolTip" value="Accende o spegne il microfono"/>
+ <string name="VoiceControlBtnToolTip" value="Mostra o nasconde il pannello di regolazione voce"/>
<layout_stack name="toolbar_stack">
+ <layout_panel name="speak_panel">
+ <talk_button name="talk">
+ <speak_button label="Parla" label_selected="Parla" name="speak_btn"/>
+ </talk_button>
+ </layout_panel>
<layout_panel name="gesture_panel">
- <gesture_combo_box label="Gesture" name="Gesture" tool_tip="Mostra/nascondi gestures"/>
+ <gesture_combo_list label="Gesture" name="Gesture" tool_tip="Mostra o nasconde le gesture"/>
</layout_panel>
<layout_panel name="movement_panel">
- <button label="Sposta" name="movement_btn" tool_tip="Mostra/nascondi i controlli del movimento"/>
+ <button label="Sposta" name="movement_btn" tool_tip="Mostra o nasconde i comandi del movimento"/>
</layout_panel>
<layout_panel name="cam_panel">
- <button label="Visualizza" name="camera_btn" tool_tip="Mostra/nascondi i controlli della camera"/>
+ <button label="Visuale" name="camera_btn" tool_tip="Mostra o nasconde le regolazioni della visuale"/>
</layout_panel>
<layout_panel name="snapshot_panel">
<button label="" name="snapshots" tool_tip="Scatta una foto"/>
</layout_panel>
+ <layout_panel name="sidebar_btn_panel">
+ <button label="Barra laterale" name="sidebar_btn" tool_tip="Mostra o nasconde la barra laterale"/>
+ </layout_panel>
+ <layout_panel name="build_btn_panel">
+ <button label="Costruisci" name="build_btn" tool_tip="Mostra o nasconde gli strumenti di costruzione"/>
+ </layout_panel>
+ <layout_panel name="search_btn_panel">
+ <button label="Cerca" name="search_btn" tool_tip="Mostra o nasconde la ricerca"/>
+ </layout_panel>
+ <layout_panel name="world_map_btn_panel">
+ <button label="Mappa" name="world_map_btn" tool_tip="Mostra o nasconde la mappa del mondo"/>
+ </layout_panel>
+ <layout_panel name="mini_map_btn_panel">
+ <button label="Mini mappa" name="mini_map_btn" tool_tip="Mostra o nasconde la mini mappa"/>
+ </layout_panel>
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Conversazioni"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="Notifiche"/>
+ </chiclet_notification>
+ </layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/it/panel_bottomtray_lite.xml
new file mode 100644
index 0000000000..ff576c7dd2
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_bottomtray_lite.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray_lite">
+ <layout_stack name="toolbar_stack_lite">
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="Gesture" name="Gesture" tool_tip="Mostra/nasconde gesture"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_classified_info.xml b/indra/newview/skins/default/xui/it/panel_classified_info.xml
index 2ba127d34a..3d363d9c75 100644
--- a/indra/newview/skins/default/xui/it/panel_classified_info.xml
+++ b/indra/newview/skins/default/xui/it/panel_classified_info.xml
@@ -1,17 +1,48 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_classified_info">
- <text name="title" value="Info sugli Annunci"/>
+ <panel.string name="l$_price">
+ L$ [PRICE]
+ </panel.string>
+ <panel.string name="click_through_text_fmt">
+ [TELEPORT] teleport, [MAP] mappa, [PROFILE] profilo
+ </panel.string>
+ <panel.string name="date_fmt">
+ [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
+ </panel.string>
+ <panel.string name="auto_renew_on">
+ Abilitato
+ </panel.string>
+ <panel.string name="auto_renew_off">
+ Disattivato
+ </panel.string>
+ <text name="title" value="Informazioni inserzione"/>
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
- <text name="classified_name" value="[nome]"/>
- <text name="classified_location" value="[caricando...]"/>
- <text name="content_type" value="[tipo di contenuto]"/>
- <text name="category" value="[categoria]"/>
- <check_box label="Auto rinnovo settimanale" name="auto_renew"/>
- <text name="price_for_listing" tool_tip="Prezzo di listino.">
- L$[PREZZO]
- </text>
- <text name="classified_desc" value="[descrizione]"/>
+ <text_editor name="classified_name" value="[name]"/>
+ <text name="classified_location_label" value="Luogo:"/>
+ <text_editor name="classified_location" value="[loading...]"/>
+ <text name="content_type_label" value="Tipo di contenuto:"/>
+ <text_editor name="content_type" value="[content type]"/>
+ <text name="category_label" value="Categoria:"/>
+ <text_editor name="category" value="[category]"/>
+ <text name="creation_date_label" value="Data di creazione:"/>
+ <text_editor name="creation_date" tool_tip="Data di creazione" value="[date]"/>
+ <text name="price_for_listing_label" value="Prezzo per inserzione:"/>
+ <text_editor name="price_for_listing" tool_tip="Prezzo per inserzione:" value="[price]"/>
+ <layout_stack name="descr_stack">
+ <layout_panel name="clickthrough_layout_panel">
+ <text name="click_through_label" value="Clic:"/>
+ <text_editor name="click_through_text" tool_tip="Dati di click through" value="[clicks]"/>
+ </layout_panel>
+ <layout_panel name="price_layout_panel">
+ <text name="auto_renew_label" value="Rinnovo automatico:"/>
+ <text name="auto_renew" value="Abilitato"/>
+ </layout_panel>
+ <layout_panel name="descr_layout_panel">
+ <text name="classified_desc_label" value="Descrizione:"/>
+ <text_editor name="classified_desc" value="[descrizione]"/>
+ </layout_panel>
+ </layout_stack>
</panel>
</scroll_container>
<panel name="buttons">
diff --git a/indra/newview/skins/default/xui/it/panel_clothing_list_button_bar.xml b/indra/newview/skins/default/xui/it/panel_clothing_list_button_bar.xml
new file mode 100644
index 0000000000..e9d9795b3a
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_clothing_list_button_bar.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="clothing_list_button_bar_panel">
+ <button label="Aggiungi +" name="add_btn"/>
+ <button label="Acquista &gt;" name="clothing_shop_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_clothing_list_item.xml b/indra/newview/skins/default/xui/it/panel_clothing_list_item.xml
new file mode 100644
index 0000000000..de764d8025
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_clothing_list_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="wearable_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_cof_wearables.xml b/indra/newview/skins/default/xui/it/panel_cof_wearables.xml
new file mode 100644
index 0000000000..d914a5740f
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_cof_wearables.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="cof_wearables">
+ <accordion name="cof_wearables_accordion">
+ <accordion_tab name="tab_attachments" title="Allegati"/>
+ <accordion_tab name="tab_clothing" title="Vestiario"/>
+ <accordion_tab name="tab_body_parts" title="Parti del corpo"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/it/panel_deletable_wearable_list_item.xml
new file mode 100644
index 0000000000..91d90a5660
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_deletable_wearable_list_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="deletable_wearable_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/it/panel_dummy_clothing_list_item.xml
new file mode 100644
index 0000000000..6af84de0c7
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_dummy_clothing_list_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="dummy_clothing_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_alpha.xml b/indra/newview/skins/default/xui/it/panel_edit_alpha.xml
index 652bef0430..286ee626cf 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_alpha.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_alpha.xml
@@ -2,7 +2,7 @@
<panel name="edit_alpha_panel">
<panel name="avatar_alpha_color_panel">
<texture_picker label="Alpha inferiore" name="Lower Alpha" tool_tip="Clicca per scegliere una fotografia"/>
- <texture_picker label="Alpha superiore" name="Upper Alpha" tool_tip="Click to choose a picture"/>
+ <texture_picker label="Alpha superiore" name="Upper Alpha" tool_tip="Clicca per scegliere una fotografia"/>
<texture_picker label="Alpha della testa" name="Head Alpha" tool_tip="Clicca per scegliere una fotografia"/>
<texture_picker label="Alpha dell&apos;occhio" name="Eye Alpha" tool_tip="Clicca per scegliere una fotografia"/>
<texture_picker label="Alpha dei capelli" name="Hair Alpha" tool_tip="Clicca per scegliere una fotografia"/>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_classified.xml b/indra/newview/skins/default/xui/it/panel_edit_classified.xml
index 81ef121dd8..bbe8ebbc32 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_classified.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_classified.xml
@@ -1,14 +1,22 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Modifica gli Annunci" name="panel_edit_classified">
+<panel label="Modifica inserzione" name="panel_edit_classified">
<panel.string name="location_notice">
- (sarà aggiornato dopo il salvataggio)
+ (si aggiornerà dopo il salvataggio)
</panel.string>
+ <string name="publish_label">
+ Pubblica
+ </string>
+ <string name="save_label">
+ Salva
+ </string>
<text name="title">
- Modifica gli Annunci
+ Modifica inserzione
</text>
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
- <icon label="" name="edit_icon" tool_tip="Clicca per selezionare un&apos;immagine"/>
+ <panel name="snapshot_panel">
+ <icon label="" name="edit_icon" tool_tip="Clicca per selezionare un&apos;immagine"/>
+ </panel>
<text name="Name:">
Titolo:
</text>
@@ -19,15 +27,22 @@
Luogo:
</text>
<text name="classified_location">
- caricando...
+ caricamento...
</text>
- <button label="Imposta sul luogo attuale" name="set_to_curr_location_btn"/>
- <spinner label="L$" name="price_for_listing" tool_tip="Fissare il Prezzo." value="50"/>
- <check_box label="Auto-rinnovo settimanale" name="auto_renew"/>
+ <button label="Imposta come luogo attuale" name="set_to_curr_location_btn"/>
+ <text name="category_label" value="Categoria:"/>
+ <text name="content_type_label" value="Tipo di contenuto:"/>
+ <icons_combo_box label="Contenuto generale" name="content_type">
+ <icons_combo_box.item label="Contenuto moderato" name="mature_ci" value="Moderato"/>
+ <icons_combo_box.item label="Contenuto generale" name="pg_ci" value="Generale"/>
+ </icons_combo_box>
+ <text name="price_for_listing_label" value="Prezzo per inserzione:"/>
+ <spinner label="L$" name="price_for_listing" tool_tip="Prezzo per inserzione:" value="50"/>
+ <check_box label="Rinnovo automatico ogni settimana" name="auto_renew"/>
</panel>
</scroll_container>
<panel label="bottom_panel" name="bottom_panel">
- <button label="Salva" name="save_changes_btn"/>
- <button label="Cancella" name="cancel_btn"/>
+ <button label="[LABEL]" name="save_changes_btn"/>
+ <button label="Annulla" name="cancel_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_eyes.xml b/indra/newview/skins/default/xui/it/panel_edit_eyes.xml
index 3b1e51e759..9f31bb7dc7 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_eyes.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_eyes.xml
@@ -3,7 +3,9 @@
<panel name="avatar_eye_color_panel">
<texture_picker label="Iride" name="Iris" tool_tip="Clicca per scegliere una fotografia"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="eyes_main_tab" title="Occhi"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="eyes_main_tab" title="Occhi"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_gloves.xml b/indra/newview/skins/default/xui/it/panel_edit_gloves.xml
index 2a80d6df3d..48024b8095 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_gloves.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_gloves.xml
@@ -4,7 +4,9 @@
<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="gloves_main_tab" title="Guanti"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="gloves_main_tab" title="Guanti"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_hair.xml b/indra/newview/skins/default/xui/it/panel_edit_hair.xml
index 137a5cabeb..50e2e7e4b3 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_hair.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_hair.xml
@@ -3,10 +3,12 @@
<panel name="avatar_hair_color_panel">
<texture_picker label="Texture" name="Texture" tool_tip="Clicca per scegliere una fotografia"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="hair_color_tab" title="Colore"/>
- <accordion_tab name="hair_style_tab" title="Stile"/>
- <accordion_tab name="hair_eyebrows_tab" title="Sopracciglia"/>
- <accordion_tab name="hair_facial_tab" title="Facciale"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="hair_color_tab" title="Colore"/>
+ <accordion_tab name="hair_style_tab" title="Stile"/>
+ <accordion_tab name="hair_eyebrows_tab" title="Sopracciglia"/>
+ <accordion_tab name="hair_facial_tab" title="Del viso"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_jacket.xml b/indra/newview/skins/default/xui/it/panel_edit_jacket.xml
index 43c825ff73..d77c1ec763 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_jacket.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_jacket.xml
@@ -5,7 +5,9 @@
<texture_picker label="Tessuto inferiore" name="Lower Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="jacket_main_tab" title="Giacca"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="jacket_main_tab" title="Giacca"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_pants.xml b/indra/newview/skins/default/xui/it/panel_edit_pants.xml
index cbab711fb1..83ef274877 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_pants.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_pants.xml
@@ -4,7 +4,9 @@
<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="pants_main_tab" title="Pantaloni"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="pants_main_tab" title="Pantaloni"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_pick.xml b/indra/newview/skins/default/xui/it/panel_edit_pick.xml
index 7f2e82e4ff..f93b953eac 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_pick.xml
@@ -1,7 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Modifica scelta ????" name="panel_edit_pick">
+<panel label="Modifica preferito" name="panel_edit_pick">
+ <panel.string name="location_notice">
+ (si aggiornerà dopo il salvataggio)
+ </panel.string>
<text name="title">
- Modifica scelta ????
+ Modifica preferito
</text>
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
@@ -16,13 +19,13 @@
Luogo:
</text>
<text name="pick_location">
- caricando...
+ caricamento...
</text>
<button label="Imposta come luogo attuale" name="set_to_curr_location_btn"/>
</panel>
</scroll_container>
<panel label="bottom_panel" name="bottom_panel">
- <button label="Salva [WHAT]" name="save_changes_btn"/>
- <button label="Cancella" name="cancel_btn"/>
+ <button label="Salva luogo preferito" name="save_changes_btn"/>
+ <button label="Annulla" name="cancel_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_profile.xml b/indra/newview/skins/default/xui/it/panel_edit_profile.xml
index b9779c77b5..3ecf4bcaf2 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_profile.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Modifica del profilo" name="edit_profile_panel">
+<panel label="Modifica profilo" name="edit_profile_panel">
<string name="CaptionTextAcctInfo">
[ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
</string>
<string name="RegisterDateFormat">
- [REG_DATE] ([ETA&apos;])
+ [REG_DATE] ([AGE])
</string>
<string name="AcctTypeResident" value="Residente"/>
<string name="AcctTypeTrial" value="Prova"/>
@@ -26,23 +26,26 @@
<icon label="" name="2nd_life_edit_icon" tool_tip="Clicca per selezionare un&apos;immagine"/>
</panel>
<panel name="first_life_image_panel">
- <text name="real_world_photo_title_text" value="Mondo Reale:"/>
+ <text name="real_world_photo_title_text" value="Mondo reale:"/>
</panel>
<icon label="" name="real_world_edit_icon" tool_tip="Clicca per selezionare un&apos;immagine"/>
<text name="title_homepage_text">
- Homepage:
+ Home page:
</text>
<check_box label="Mostrami nei risultati della ricerca" name="show_in_search_checkbox"/>
- <text name="title_acc_status_text" value="Mio Account:"/>
- <text name="my_account_link" value="[[URL] Vai al mio pannello personale]"/>
- <text name="acc_status_text" value="Residente. No payment info on file."/>
- <text name="title_partner_text" value="Mio Partner:"/>
- <text name="partner_edit_link" value="[[URL] Modifica]"/>
+ <text name="title_acc_status_text" value="Il mio account:"/>
+ <text_editor name="acc_status_text" value="Residente. Nessuna informazione di pagamento disponibile."/>
+ <text name="my_account_link" value="[[URL] Go to My Dashboard]"/>
+ <text name="title_partner_text" value="Il mio partner:"/>
+ <panel name="partner_data_panel">
+ <name_box initial_value="(recupero)" name="partner_text"/>
+ </panel>
+ <text name="partner_edit_link" value="[[URL] Edit]"/>
</panel>
</panel>
</scroll_container>
<panel name="profile_me_buttons_panel">
- <button label="Salva le modifiche" name="save_btn"/>
- <button label="Cancella" name="cancel_btn"/>
+ <button label="Salva modifiche" name="save_btn"/>
+ <button label="Annulla" name="cancel_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_shape.xml b/indra/newview/skins/default/xui/it/panel_edit_shape.xml
index f22b393ecd..fd6a7af69c 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_shape.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_shape.xml
@@ -1,23 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_shape_panel">
- <panel name="avatar_sex_panel">
- <text name="gender_text">
- Sesso:
- </text>
- <radio_group name="sex_radio">
- <radio_item label="Femminile" name="radio"/>
- <radio_item label="Maschile" name="radio2"/>
- </radio_group>
+ <string name="meters">
+ Metri
+ </string>
+ <string name="feet">
+ Piedi
+ </string>
+ <string name="height">
+ Statura:
+ </string>
+ <text name="avatar_height"/>
+ <panel label="Camicia" name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shape_body_tab" title="Corpo"/>
+ <accordion_tab name="shape_head_tab" title="Testa"/>
+ <accordion_tab name="shape_eyes_tab" title="Occhi"/>
+ <accordion_tab name="shape_ears_tab" title="Orecchie"/>
+ <accordion_tab name="shape_nose_tab" title="Naso"/>
+ <accordion_tab name="shape_mouth_tab" title="Bocca"/>
+ <accordion_tab name="shape_chin_tab" title="Mento"/>
+ <accordion_tab name="shape_torso_tab" title="Torace"/>
+ <accordion_tab name="shape_legs_tab" title="Gambe"/>
+ </accordion>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="shape_body_tab" title="Corpo"/>
- <accordion_tab name="shape_head_tab" title="Testa"/>
- <accordion_tab name="shape_eyes_tab" title="Occhi"/>
- <accordion_tab name="shape_ears_tab" title="Orecchie"/>
- <accordion_tab name="shape_nose_tab" title="Naso"/>
- <accordion_tab name="shape_mouth_tab" title="Bocca"/>
- <accordion_tab name="shape_chin_tab" title="Mento"/>
- <accordion_tab name="shape_torso_tab" title="Busto"/>
- <accordion_tab name="shape_legs_tab" title="Gambe"/>
- </accordion>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_shirt.xml b/indra/newview/skins/default/xui/it/panel_edit_shirt.xml
index 5d902ae40b..1f41b28348 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_shirt.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_shirt.xml
@@ -1,10 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_shirt_panel">
<panel name="avatar_shirt_color_panel">
- <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una foto"/>
+ <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="shirt_main_tab" title="Camicia"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shirt_main_tab" title="Camicia"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_shoes.xml b/indra/newview/skins/default/xui/it/panel_edit_shoes.xml
index bd1fa5b16d..7a82c8e99d 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_shoes.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_shoes.xml
@@ -4,7 +4,9 @@
<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="shoes_main_tab" title="Scarpe"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shoes_main_tab" title="Scarpe"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_skin.xml b/indra/newview/skins/default/xui/it/panel_edit_skin.xml
index 2fa76d4afc..a15489b333 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_skin.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_skin.xml
@@ -1,14 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_skin_panel">
<panel name="avatar_skin_color_panel">
- <texture_picker label="Tatuaggi Testa" name="Head Tattoos" tool_tip="Clicca per scegliere un&apos;immagine"/>
- <texture_picker label="Tatuaggi superiori" name="Upper Tattoos" tool_tip="Clicca per scegliere un&apos;immagine"/>
- <texture_picker label="Tatuaggi inferiori" name="Lower Tattoos" tool_tip="Clicca per scegliere un&apos;immagine"/>
+ <texture_picker label="Tatuaggi testa" name="Head Tattoos" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Tatuaggi superiori" name="Upper Tattoos" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Tatuaggi inferiori" name="Lower Tattoos" tool_tip="Clicca per scegliere una fotografia"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skin_color_tab" title="Colore della pelle"/>
+ <accordion_tab name="skin_face_tab" title="Dettagli del viso"/>
+ <accordion_tab name="skin_makeup_tab" title="Makeup"/>
+ <accordion_tab name="skin_body_tab" title="Dettagli del corpo"/>
+ </accordion>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="skin_color_tab" title="Colore della pelle"/>
- <accordion_tab name="skin_face_tab" title="Dettagli del Viso"/>
- <accordion_tab name="skin_makeup_tab" title="Trucco"/>
- <accordion_tab name="skin_body_tab" title="Dettagli del Corpo"/>
- </accordion>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_skirt.xml b/indra/newview/skins/default/xui/it/panel_edit_skirt.xml
index e036fff67e..7080b65737 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_skirt.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_skirt.xml
@@ -4,7 +4,9 @@
<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="skirt_main_tab" title="Gonna"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skirt_main_tab" title="Gonna"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_socks.xml b/indra/newview/skins/default/xui/it/panel_edit_socks.xml
index 1d1eb4bd3a..6731511282 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_socks.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_socks.xml
@@ -1,10 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_socks_panel">
<panel name="avatar_socks_color_panel">
- <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una foto"/>
+ <texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="socks_main_tab" title="Calze"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="socks_main_tab" title="Calzini"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/it/panel_edit_tattoo.xml
index 5435a28ff9..d76fb62c53 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_tattoo.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_tattoo.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_tattoo_panel">
<panel name="avatar_tattoo_color_panel">
- <texture_picker label="Tatuaggio sulla testa" name="Head Tattoo" tool_tip="Clicca per scegliere una foto"/>
- <texture_picker label="Tatuaggio superiore" name="Upper Tattoo" tool_tip="Clicca per scegliere una foto"/>
- <texture_picker label="Tatuaggio inferiore" name="Lower Tattoo" tool_tip="Clicca per scegliere una foto"/>
+ <texture_picker label="Tatuaggio della testa" name="Head Tattoo" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Tatuaggio superiore" name="Upper Tattoo" tool_tip="Clicca per scegliere una fotografia"/>
+ <texture_picker label="Tattuaggio inferiore" name="Lower Tattoo" tool_tip="Clicca per scegliere una fotografia"/>
+ <color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_underpants.xml b/indra/newview/skins/default/xui/it/panel_edit_underpants.xml
index ca2ba3ca01..671eb57551 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_underpants.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_underpants.xml
@@ -4,7 +4,9 @@
<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="underpants_main_tab" title="Slip"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="underpants_main_tab" title="Slip"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/it/panel_edit_undershirt.xml
index cf44dad464..fccc86f8fc 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_undershirt.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_undershirt.xml
@@ -4,7 +4,9 @@
<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere una fotografia"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="undershirt_main_tab" title="Maglietta intima"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="undershirt_main_tab" title="Maglietta intima"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_edit_wearable.xml b/indra/newview/skins/default/xui/it/panel_edit_wearable.xml
index baf585dad0..5eaae828d8 100644
--- a/indra/newview/skins/default/xui/it/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/it/panel_edit_wearable.xml
@@ -1,55 +1,55 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Indossabile" name="panel_edit_wearable">
<string name="edit_shape_title">
- Modifica la Shape
+ Modifica della figura corporea
</string>
<string name="edit_skin_title">
- Modifica la Skin
+ Modifica della pelle
</string>
<string name="edit_hair_title">
- Modifica capelli
+ Modifica dei capelli
</string>
<string name="edit_eyes_title">
- Modifica occhi
+ Modifica degli occhi
</string>
<string name="edit_shirt_title">
- Modifica camicia
+ Modifica della camicia
</string>
<string name="edit_pants_title">
- Modifica pantaloni
+ Modifica dei pantaloni
</string>
<string name="edit_shoes_title">
- Modifica scarpe
+ Modifica delle scarpe
</string>
<string name="edit_socks_title">
- Modifica calze
+ Modifica delle calze
</string>
<string name="edit_jacket_title">
- Modifica Giacca
+ Modifica della giacca
</string>
<string name="edit_skirt_title">
- Modifica gonna
+ Modifica della gonna
</string>
<string name="edit_gloves_title">
- Modifica guanti
+ Modifica dei guanti
</string>
<string name="edit_undershirt_title">
- Modifica maglietta intima
+ Modifica della maglietta intima
</string>
<string name="edit_underpants_title">
- Modifica slip
+ Modifica dello slip
</string>
<string name="edit_alpha_title">
- Modifica Alpha Mask
+ Modifica di Alpha Mask
</string>
<string name="edit_tattoo_title">
- Modifica tatuaggio
+ Modifica del tatuaggio
</string>
<string name="shape_desc_text">
- Shape:
+ Figura corporea:
</string>
<string name="skin_desc_text">
- Skin:
+ Pelle:
</string>
<string name="hair_desc_text">
Capelli:
@@ -72,8 +72,8 @@
<string name="jacket_desc_text">
Giacca:
</string>
- <string name="skirt_skirt_desc_text">
- Giacca:
+ <string name="skirt_desc_text">
+ Gonna:
</string>
<string name="gloves_desc_text">
Guanti:
@@ -90,9 +90,15 @@
<string name="tattoo_desc_text">
Tatuaggio:
</string>
- <text name="edit_wearable_title" value="Modifica Shape"/>
+ <text name="edit_wearable_title" value="Modifica della figura corporea"/>
<panel label="Camicia" name="wearable_type_panel">
- <text name="description_text" value="Shape:"/>
+ <text name="description_text" value="Figura corporea:"/>
+ <radio_group name="sex_radio">
+ <radio_item label="" name="sex_male" tool_tip="Maschio" value="1"/>
+ <radio_item label="" name="sex_female" tool_tip="Femmina" value="0"/>
+ </radio_group>
+ <icon name="male_icon" tool_tip="Maschio"/>
+ <icon name="female_icon" tool_tip="Femmina"/>
</panel>
<panel name="button_panel">
<button label="Salva con nome" name="save_as_button"/>
diff --git a/indra/newview/skins/default/xui/it/panel_friends.xml b/indra/newview/skins/default/xui/it/panel_friends.xml
index a3a985f5aa..cfe162a67b 100644
--- a/indra/newview/skins/default/xui/it/panel_friends.xml
+++ b/indra/newview/skins/default/xui/it/panel_friends.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="friends">
<string name="Multiple">
- Amici multipli
+ Più amici
</string>
<scroll_list name="friend_list" tool_tip="Tieni premuto shift o control mentre clicchi per selezionare più di un amico">
<column name="icon_online_status" tool_tip="Stato Online"/>
@@ -16,5 +16,5 @@
<button label="Teleport" name="offer_teleport_btn" tool_tip="Offri a questo amico un teleport per dove sei tu ora"/>
<button label="Paga" name="pay_btn" tool_tip="Dai Linden dollar (L$) a questo amico"/>
<button label="Rimuovi" name="remove_btn" tool_tip="Rimuovi questa persona dalla tua lista amici"/>
- <button label="Aggiungi" name="add_btn" tool_tip="Offri amicizia ad un residente"/>
+ <button label="Aggiungi" name="add_btn" tool_tip="Offri amicizia a un residente"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_group_control_panel.xml b/indra/newview/skins/default/xui/it/panel_group_control_panel.xml
index c2bceaeef6..2d17e4a0cd 100644
--- a/indra/newview/skins/default/xui/it/panel_group_control_panel.xml
+++ b/indra/newview/skins/default/xui/it/panel_group_control_panel.xml
@@ -1,9 +1,17 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_im_control_panel">
- <button label="Profilo del Gruppo" name="group_info_btn"/>
- <panel name="panel_call_buttons">
- <button label="Chiama Gruppo" name="call_btn"/>
- <button label="Chiudi Chiamata" name="end_call_btn"/>
- <button label="Apri Controlli Voice" name="voice_ctrls_btn"/>
- </panel>
+ <layout_stack name="vertical_stack">
+ <layout_panel name="group_info_btn_panel">
+ <button label="Profilo del gruppo" name="group_info_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Chiama il gruppo" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Abbandona chiamata" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Apri la regolazione voce" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_group_general.xml b/indra/newview/skins/default/xui/it/panel_group_general.xml
index 0ca1ce2064..49baa73811 100644
--- a/indra/newview/skins/default/xui/it/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/it/panel_group_general.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Generale" name="general_tab">
<panel.string name="help_text">
- La tabella generale contiene informazioni generali su questo gruppo, lista dei membri, preferenze generali del gruppo e opzioni dei membri.
+ La scheda generale contiene informazioni generali su questo gruppo, lista dei soci, preferenze del gruppo e opzioni dei soci.
-Muovi il tuo mouse sopra le opzioni per maggior aiuto.
+Muovi il tuo mouse sopra le opzioni per maggiore aiuto.
</panel.string>
<panel.string name="group_info_unchanged">
Le informazioni generali sul gruppo sono cambiate
@@ -11,27 +11,48 @@ Muovi il tuo mouse sopra le opzioni per maggior aiuto.
<panel.string name="incomplete_member_data_str">
Rilevando i dati dei membri
</panel.string>
+ <panel name="group_info_top">
+ <texture_picker label="" name="insignia" tool_tip="Clicca per scegliere una fotografia"/>
+ <text name="prepend_founded_by">
+ Fondatore:
+ </text>
+ <name_box initial_value="(recupero)" name="founder_name"/>
+ <text name="join_cost_text">
+ Gratis
+ </text>
+ <button label="ADERISCI ADESSO!" name="btn_join"/>
+ </panel>
<text_editor name="charter">
Statuto del gruppo
</text_editor>
<name_list name="visible_members">
- <name_list.columns label="Membro" name="name"/>
+ <name_list.columns label="Socio" name="name"/>
<name_list.columns label="Titolo" name="title"/>
+ <name_list.columns label="Stato" name="status"/>
</name_list>
+ <text name="my_group_settngs_label">
+ Io
+ </text>
<text name="active_title_label">
- Mio Titolo
+ Il mio titolo:
</text>
- <combo_box name="active_title" tool_tip="Imposta il titolo nella tag del tuo avatar quando questo gruppo è attivo."/>
- <check_box label="Ricevi notice dal gruppo" name="receive_notices" tool_tip="Imposta se vuoi ricevere Notice da questo. De-seleziona questa casella se il gruppo ti manda spam."/>
- <check_box label="Mostra nel mio Profilo" name="list_groups_in_profile" tool_tip="Imposta se vuoi mostrare questo gruppo nel tuo profilo"/>
+ <combo_box name="active_title" tool_tip="Imposta il titolo che compare con il nome del tuo avatar quando questo gruppo è attivo."/>
+ <check_box label="Ricevi avvisi dal gruppo" name="receive_notices" tool_tip="Imposta se vuoi ricevere avvisi da questo gruppo. Deseleziona questa casella se il gruppo ti manda messaggi indesiderati."/>
+ <check_box label="Mostra nel mio profilo" name="list_groups_in_profile" tool_tip="Imposta se vuoi mostrare questo gruppo nel tuo profilo"/>
<panel name="preferences_container">
- <check_box label="Iscrizione libera" name="open_enrollement" tool_tip="Imposta se questo gruppo permette ai nuovi membri di aderire senza essere invitati."/>
- <check_box label="Tassa d&apos;iscrizione" name="check_enrollment_fee" tool_tip="Imposta se richiedere una tassa d&apos;iscrizione per aderire al gruppo"/>
- <spinner label="L$" left_delta="136" name="spin_enrollment_fee" tool_tip="I nuovi membri devono pagare questa tassa d&apos;iscrizione quando tassa d&apos;iscrizione è selezionata." width="60"/>
- <combo_box name="group_mature_check" tool_tip="Imposta se le informazioni sul tuo gruppo sono da considerarsi Mature.">
- <combo_box.item label="Contenuto PG" name="pg"/>
- <combo_box.item label="Contenuto Mature" name="mature"/>
+ <text name="group_settngs_label">
+ Gruppo
+ </text>
+ <check_box label="Chiunque può aderire" name="open_enrollement" tool_tip="Imposta se questo gruppo permette ai nuovi membri di aderire senza essere invitati."/>
+ <check_box label="Quota di adesione" name="check_enrollment_fee" tool_tip="Imposta se richiedere una tassa d&apos;iscrizione per aderire al gruppo"/>
+ <spinner label="L$" left_delta="136" name="spin_enrollment_fee" tool_tip="I nuovi soci devono pagare questa tassa d&apos;iscrizione quando è selezionata." width="60"/>
+ <combo_box name="group_mature_check" tool_tip="Imposta se le informazioni sul tuo gruppo sono da considerarsi di tipo Moderato.">
+ <combo_item name="select_mature">
+ - Seleziona categoria di accesso -
+ </combo_item>
+ <combo_box.item label="Contenuti di tipo Moderato" name="mature"/>
+ <combo_box.item label="Contenuti di tipo Generale" name="pg"/>
</combo_box>
- <check_box initial_value="true" label="Mostra nella ricerca" name="show_in_group_list" tool_tip="Permetti alle persone di vedere questo gruppo nei risultati del Cerca"/>
+ <check_box initial_value="true" label="Mostra nella ricerca" name="show_in_group_list" tool_tip="Permetti alle persone di vedere questo gruppo nei risultati della ricerca"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/it/panel_group_info_sidetray.xml
index 26255943ed..da797b309f 100644
--- a/indra/newview/skins/default/xui/it/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/it/panel_group_info_sidetray.xml
@@ -1,36 +1,35 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Informazioni sul gruppo" name="GroupInfo">
+<panel label="Profilo del gruppo" name="GroupInfo">
<panel.string name="default_needs_apply_text">
- Ci sono variazioni non salvate nella tabella attuale
+ Ci sono modifiche non salvate
</panel.string>
<panel.string name="want_apply_text">
- Vuoi salvare queste variazioni?
+ Vuoi salvare le modifiche?
</panel.string>
<panel.string name="group_join_btn">
- Aderisci (L$[AMOUNT])
+ Aderisci ([AMOUNT] L$)
</panel.string>
<panel.string name="group_join_free">
Gratis
</panel.string>
- <text name="group_name" value="(Caricando...)"/>
- <line_editor label="Scrivi qui il nuovo nome del tuo gruppo" name="group_name_editor"/>
- <texture_picker label="" name="insignia" tool_tip="Clicca per scegliere uan fotografia"/>
- <text name="prepend_founded_by">
- Fondatore:
- </text>
- <name_box initial_value="(recuperando)" name="founder_name"/>
- <text name="join_cost_text">
- Gratis
- </text>
- <button label="ADERISCI ORA!" name="btn_join"/>
- <accordion name="groups_accordion">
- <accordion_tab name="group_general_tab" title="Generale"/>
- <accordion_tab name="group_roles_tab" title="Ruoli"/>
- <accordion_tab name="group_notices_tab" title="Notice"/>
- <accordion_tab name="group_land_tab" title="Terra/Beni ?????"/>
- </accordion>
- <panel name="button_row">
- <button label="Crea" label_selected="Nuovo gruppo" name="btn_create"/>
- <button label="Salva" label_selected="Salva" name="btn_apply"/>
+ <panel name="group_info_top">
+ <text name="group_name" value="(Caricamento in corso...)"/>
+ <line_editor label="Scrivi qui il nome del gruppo" name="group_name_editor"/>
</panel>
+ <layout_stack name="layout">
+ <layout_panel name="group_accordions">
+ <accordion name="groups_accordion">
+ <accordion_tab name="group_general_tab" title="Generale"/>
+ <accordion_tab name="group_roles_tab" title="Ruoli"/>
+ <accordion_tab name="group_notices_tab" title="Avvisi"/>
+ <accordion_tab name="group_land_tab" title="Terra/Beni"/>
+ </accordion>
+ </layout_panel>
+ <layout_panel name="button_row">
+ <button label="Chat" name="btn_chat"/>
+ <button label="Chiamata al gruppo" name="btn_call" tool_tip="Chiama questo gruppo"/>
+ <button label="Salva" label_selected="Salva" name="btn_apply"/>
+ <button label="Crea un gruppo" name="btn_create" tool_tip="Crea un nuovo gruppo"/>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_group_invite.xml b/indra/newview/skins/default/xui/it/panel_group_invite.xml
index 643d6b05fd..e3cb3c1092 100644
--- a/indra/newview/skins/default/xui/it/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/it/panel_group_invite.xml
@@ -7,23 +7,21 @@
(Attendi...)
</panel.string>
<panel.string name="already_in_group">
- Alcuni avatars sono già nel gruppo e non erano stati invitati.
+ Alcuni dei residenti selezionati sono già nel gruppo, pertanto l&apos;invito non verrà loro spedito.
</panel.string>
<text name="help_text">
- Puoi selezionare più di un residente
-da invitare nel tuo gruppo. Clicca su
-&apos;Scelta residenti&apos; per iniziare.
+ Puoi selezionare più residenti da invitare nel tuo gruppo. Per iniziare, clicca su Apri il selettore di residenti.
</text>
<button label="Scelta residenti" name="add_button" tool_tip=""/>
- <name_list name="invitee_list" tool_tip="Tieni premuto il tasto Ctrl e clicca il nome dei residenti per una multi-selezione"/>
- <button label="Rimuovi i selezionati dall&apos;elenco" name="remove_button" tool_tip="Rimuovi i residenti selezionati dalla lista invito"/>
+ <name_list name="invitee_list" tool_tip="Tieni premuto Ctrl e fai clic sui nomi dei residenti per selezionare più nomi"/>
+ <button label="Rimuovi i selezionati dall&apos;elenco" name="remove_button" tool_tip="Rimuove i residenti selezionati dalla lista degli inviti"/>
<text name="role_text">
Scegli che ruolo assegnare loro:
</text>
- <combo_box name="role_name" tool_tip="Choose from the list of Roles you are allowed to assign members to"/>
+ <combo_box name="role_name" tool_tip="Scegli dall&apos;elenco dei ruoli ai quali ti è consentito assegnare i membri"/>
<button label="Manda gli inviti" name="ok_button"/>
<button label="Annulla" name="cancel_button"/>
<string name="GroupInvitation">
- Invito del Gruppo
+ Invito di gruppo
</string>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_group_land_money.xml b/indra/newview/skins/default/xui/it/panel_group_land_money.xml
index a532e7a575..16cc91cd9d 100644
--- a/indra/newview/skins/default/xui/it/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/it/panel_group_land_money.xml
@@ -1,83 +1,84 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Terra &amp; L$" name="land_money_tab">
- <string name="help_text">
- Appare un avviso fino a quando la Terra Totale in Uso è meno o = alla Contribuzione Totale.
- </string>
- <button label="?" name="help_button"/>
- <string name="cant_view_group_land_text">
- Non hai i permessi per vedere la terra posseduta dal gruppo
- </string>
- <string name="cant_view_group_accounting_text">
- Non hai i permessi per vedere le informazioni sulla contabilità del gruppo.
- </string>
- <string name="loading_txt">
+ <panel.string name="help_text">
+ Viene visualizzata un&apos;avvertenza fino a quando il terreno totale in uso è inferiore o uguale al contributo totale.
+ </panel.string>
+ <panel.string name="cant_view_group_land_text">
+ Non sei autorizzato a vedere quali terreni appartengono al gruppo.
+ </panel.string>
+ <panel.string name="epmty_view_group_land_text">
+ Nessuna voce
+ </panel.string>
+ <panel.string name="cant_view_group_accounting_text">
+ Non sei autorizzato a visionare le informazioni finanziarie del gruppo.
+ </panel.string>
+ <panel.string name="loading_txt">
Attendi...
- </string>
- <text name="group_land_heading" width="250">
- Terra posseduta dal gruppo
- </text>
- <scroll_list name="group_parcel_list">
- <column label="Parcel" name="name"/>
- <column label="Regione" name="location"/>
- <column label="Tipo" name="type"/>
- <column label="Area" name="area"/>
- </scroll_list>
- <button label="Mappa" label_selected="Mappa" left="282" name="map_button" width="130"/>
- <text name="total_contributed_land_label">
- Contribuzione Totale:
- </text>
- <text name="total_contributed_land_value">
- [AREA] m²
- </text>
- <text name="total_land_in_use_label">
- Terra totale in uso:
- </text>
- <text name="total_land_in_use_value">
- [AREA] m²
- </text>
- <text name="land_available_label">
- Terreno disponibile:
- </text>
- <text name="land_available_value">
- [AREA] m²
- </text>
- <text name="your_contribution_label">
- La tua contribuzione:
- </text>
- <string name="land_contrib_error">
- Incapace di impostare la tua contribuzione di terreno
- </string>
- <text name="your_contribution_units">
- m²
- </text>
- <text name="your_contribution_max_value">
- ([IMPORTO] max)
- </text>
- <text name="group_over_limit_text">
- Sono necessari maggiori crediti di terreno per mantenere la terra in uso
- </text>
- <text name="group_money_heading">
- L$ del gruppo
- </text>
+ </panel.string>
+ <panel.string name="land_contrib_error">
+ Impossibile definire il tuo contributo di terreno
+ </panel.string>
+ <panel name="layout_panel_landmoney">
+ <scroll_list name="group_parcel_list">
+ <scroll_list.columns label="Lotto" name="name"/>
+ <scroll_list.columns label="Regione" name="location"/>
+ <scroll_list.columns label="Tipo" name="type"/>
+ <scroll_list.columns label="Superficie" name="area"/>
+ </scroll_list>
+ <text name="total_contributed_land_label">
+ Contributo totale:
+ </text>
+ <text name="total_contributed_land_value">
+ [AREA] m²
+ </text>
+ <button label="Mappa" label_selected="Mappa" name="map_button"/>
+ <text name="total_land_in_use_label">
+ Terreno totale in uso:
+ </text>
+ <text name="total_land_in_use_value">
+ [AREA] m²
+ </text>
+ <text name="land_available_label">
+ Terreno disponibile:
+ </text>
+ <text name="land_available_value">
+ [AREA] m²
+ </text>
+ <text name="your_contribution_label">
+ Il tuo contributo:
+ </text>
+ <text name="your_contribution_units">
+ m²
+ </text>
+ <text name="your_contribution_max_value">
+ ([AMOUNT] max)
+ </text>
+ <text name="group_over_limit_text">
+ Sono necessari più crediti del terreno per mantenere la terra in uso
+ </text>
+ <text name="group_money_heading">
+ L$ gruppo
+ </text>
+ </panel>
<tab_container name="group_money_tab_container">
<panel label="PIANIFICAZIONE" name="group_money_planning_tab">
<text_editor name="group_money_planning_text">
- Caricando...
+ Caricamento in corso...
</text_editor>
</panel>
<panel label="DETTAGLI" name="group_money_details_tab">
<text_editor name="group_money_details_text">
- Caricando...
+ Caricamento in corso...
</text_editor>
<button label="&lt; Precedente" label_selected="&lt; Precedente" name="earlier_details_button" tool_tip="Indietro" width="90"/>
- <button label="Successivo &gt;" label_selected="Successivo &gt;" left_delta="260" name="later_details_button" tool_tip="Prossimo" width="90"/>
+ <button label="Successivo &gt;" label_selected="Successivo &gt;" left_delta="260" name="later_details_button" tool_tip="Avanti" width="90"/>
</panel>
<panel label="VENDITE" name="group_money_sales_tab">
<text_editor name="group_money_sales_text">
- Caricando...
+ Caricamento in corso...
</text_editor>
<button label="&lt; Precedente" label_selected="&lt; Precedente" name="earlier_sales_button" tool_tip="Indietro" width="90"/>
- <button label="Successivo &gt;" label_selected="Successivo &gt;" left_delta="260" name="later_sales_button" tool_tip="Prossimo" width="90"/>
+ <button label="Successivo &gt;" label_selected="Successivo &gt;" left_delta="260" name="later_sales_button" tool_tip="Avanti" width="90"/>
</panel>
</tab_container>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_group_list_item.xml b/indra/newview/skins/default/xui/it/panel_group_list_item.xml
index 3e5419d1bb..7cdc4c7ff6 100644
--- a/indra/newview/skins/default/xui/it/panel_group_list_item.xml
+++ b/indra/newview/skins/default/xui/it/panel_group_list_item.xml
@@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="group_list_item">
<text name="group_name" value="Sconosciuto"/>
+ <button name="profile_btn" tool_tip="Vedi profilo"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_group_notices.xml b/indra/newview/skins/default/xui/it/panel_group_notices.xml
index dbeb9d56ff..8dd945830e 100644
--- a/indra/newview/skins/default/xui/it/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/it/panel_group_notices.xml
@@ -5,10 +5,10 @@
Puoi disattivare la ricezione delle notice nella finestra principale.
</panel.string>
<panel.string name="no_notices_text">
- Non ci sono vecchie Notice
+ Non ci sono avvisi precedenti
</panel.string>
<text name="lbl2">
- Le Notice sono conservate per 14 giorni.
+ Gli avvisi sono conservati per 14 giorni.
Massimo 200 per gruppo al giorno
</text>
<scroll_list name="notice_list">
@@ -17,10 +17,10 @@ Massimo 200 per gruppo al giorno
<scroll_list.columns label="Data" name="date"/>
</scroll_list>
<text name="notice_list_none_found">
- Nessuna trovata
+ Nessuno trovato
</text>
- <button label="Crea una nuova notice" label_selected="Crea una nuova notice" name="create_new_notice" tool_tip="Crea una nuova notice"/>
- <button label="Aggiorna" label_selected="Aggiorna l&apos;elenco" name="refresh_notices" tool_tip="Aggiorna la lista delle notice"/>
+ <button label="Crea un nuovo avviso" label_selected="Crea una nuova notice" name="create_new_notice" tool_tip="Crea un nuovo avviso"/>
+ <button label="Aggiorna" label_selected="Aggiorna l&apos;elenco" name="refresh_notices" tool_tip="Aggiorna la lista degli avvisi"/>
<panel label="Crea una nuova notice" name="panel_create_new_notice">
<text name="lbl">
Crea una notice
@@ -40,16 +40,17 @@ Massimo 200 per gruppo al giorno
<text name="string">
Trascina e rilascia qui l&apos;oggetto da allegare:
</text>
- <button label="Rimuovi" label_selected="Rimuovi allegato" name="remove_attachment"/>
- <button label="Spedisci" label_selected="Spedisci" name="send_notice"/>
- <group_drop_target name="drop_target" tool_tip="Trascina un oggetto dall&apos;inventario nello spazio ALLEGA per spedirlo con la notice. Devi avere i permessi copy e transfer relativi all&apos;oggetto da allegare."/>
+ <button label="Inventario" name="open_inventory" tool_tip="Apri l&apos;inventario"/>
+ <button label="Rimuovi" label_selected="Rimuovi allegato" name="remove_attachment" tool_tip="Rimuovi allegato dal tuo avviso"/>
+ <button label="Invia" label_selected="Invia" name="send_notice"/>
+ <group_drop_target name="drop_target" tool_tip="Trascina un oggetto dall&apos;inventario ín questa casella per spedirlo con questo avviso. Devi avere i diritti per la copia e il trasferimento per poter allegare l&apos;oggetto."/>
</panel>
<panel label="Vedi le notice precedenti" name="panel_view_past_notice">
<text name="lbl">
Notice archiviate
</text>
<text name="lbl2">
- Per spedire una nuova notice, clicca il bottone +
+ Per spedire un nuovo avviso, clicca sul pulsante +
</text>
<text name="lbl3">
Oggetto:
@@ -57,6 +58,6 @@ Massimo 200 per gruppo al giorno
<text name="lbl4">
Messaggio:
</text>
- <button label="Apri allegato" label_selected="Apri l&apos;allegato" name="open_attachment"/>
+ <button label="Apri l&apos;allegato" label_selected="Apri l&apos;allegato" name="open_attachment"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_group_notify.xml b/indra/newview/skins/default/xui/it/panel_group_notify.xml
index de6b139793..91a41353a5 100644
--- a/indra/newview/skins/default/xui/it/panel_group_notify.xml
+++ b/indra/newview/skins/default/xui/it/panel_group_notify.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="instant_message" name="panel_group_notify">
<panel label="header" name="header">
- <text name="title" value="Nome di chi spedisce / Nome del Gruppo"/>
+ <text name="title" value="Nome del mittente / Nome del gruppo"/>
</panel>
- <text name="attachment" value="Attachment"/>
- <button label="Ok" name="btn_ok"/>
+ <text name="attachment" value="Allegato"/>
+ <button label="OK" name="btn_ok"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_group_roles.xml b/indra/newview/skins/default/xui/it/panel_group_roles.xml
index bc98fdacaf..1769ef748d 100644
--- a/indra/newview/skins/default/xui/it/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/it/panel_group_roles.xml
@@ -1,41 +1,42 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Membri &amp; Ruoli" name="roles_tab">
<panel.string name="default_needs_apply_text">
- Ci sono modifiche non salvate nella scheda attuale
+ Ci sono modifiche non salvate
</panel.string>
<panel.string name="want_apply_text">
- Vuoi salvare queste modifiche?
+ Vuoi salvare le modifiche?
</panel.string>
- <tab_container height="164" name="roles_tab_container">
- <panel height="148" label="MEMBRI" name="members_sub_tab" tool_tip="Membri">
+ <tab_container name="roles_tab_container">
+ <panel label="MEMBRI" name="members_sub_tab" tool_tip="Membri">
<panel.string name="help_text">
Puoi aggiungere o rimuovere i ruoli assegnati ai membri.
Seleziona più membri tenendo premuto il tasto Ctrl e
cliccando sui loro nomi.
</panel.string>
<filter_editor label="Filtra Membri" name="filter_input"/>
- <name_list bottom_delta="-105" height="104" name="member_list">
- <name_list.columns label="Nome del Membro" name="name"/>
+ <name_list name="member_list">
+ <name_list.columns label="Socio" name="name"/>
<name_list.columns label="Donazioni" name="donated"/>
- <name_list.columns label="Status" name="online"/>
+ <name_list.columns label="Stato" name="online"/>
</name_list>
- <button label="Invita" name="member_invite" width="165"/>
+ <button label="Invita" name="member_invite"/>
<button label="Espelli" name="member_eject"/>
</panel>
- <panel height="148" label="RUOLI" name="roles_sub_tab">
+ <panel label="RUOLI" name="roles_sub_tab">
<panel.string name="help_text">
- I ruoli hanno un titolo con un elenco di abilità permesse che i membri possono eseguire.
- I membri possono avere uno o più ruoli. Un gruppo può avere fino a 10 ruoli, inclusi il ruolo base o &quot;Membro&quot; e
- il ruolo del Capogruppo.
+ I ruoli hanno un titolo con un elenco di abilità permesse
+che i membri possono eseguire. I membri possono avere
+uno o più ruoli. Un gruppo può avere fino a 10 ruoli,
+fra cui il ruolo base o &quot;Tutti&quot; e il ruolo del Proprietario, ovvero il capogruppo.
</panel.string>
<panel.string name="cant_delete_role">
- I Ruoli &apos;Everyone&apos; e &apos;Owners&apos; sono speciali e non possono essere cancellati.
+ I ruoli &apos;Tutti&apos; e &apos;Proprietari&apos; sono speciali e non possono essere eliminati.
</panel.string>
<panel.string name="power_folder_icon">
- Cartella Inventario chiusa
+ Inv_FolderClosed
</panel.string>
<filter_editor label="Filtra i ruoli" name="filter_input"/>
- <scroll_list bottom_delta="-104" height="104" name="role_list">
+ <scroll_list name="role_list">
<scroll_list.columns label="Ruolo" name="name"/>
<scroll_list.columns label="Titolo" name="title"/>
<scroll_list.columns label="#" name="members"/>
@@ -43,7 +44,7 @@ cliccando sui loro nomi.
<button label="Crea nuovo ruolo" name="role_create"/>
<button label="Elimina ruolo" name="role_delete"/>
</panel>
- <panel height="148" label="ABILITA&apos;" name="actions_sub_tab" tool_tip="Puoi vedere la descrizione dell&apos;abilità e quali Ruoli o Membri possono eseguirla.">
+ <panel height="148" label="ABILITÀ" name="actions_sub_tab" tool_tip="Puoi vedere la descrizione dell&apos;abilità e quali ruoli o membri possono eseguirla.">
<panel.string name="help_text">
Le abilità permettono ai membri nei ruoli di fare cose specifiche
in questo gruppo. C&apos;è una vasta gamma di abilità.
@@ -54,22 +55,22 @@ in questo gruppo. C&apos;è una vasta gamma di abilità.
</tab_container>
<panel name="members_footer">
<text name="static">
- Membri assegnati
+ Ruoli assegnati
</text>
<text name="static2">
Abilità permesse
</text>
- <scroll_list name="member_allowed_actions" tool_tip="Per i dettagli di ogni abilità consentita vedi il pannello abilità."/>
+ <scroll_list name="member_allowed_actions" tool_tip="Per i dettagli di ogni abilità consentita vedi la scheda abilità."/>
</panel>
<panel name="roles_footer">
<text name="static">
- Nome del Ruolo
+ Nome del ruolo
</text>
<line_editor name="role_name">
Addetti
</line_editor>
<text name="static3">
- Titolo del Ruolo
+ Titolo del ruolo
</text>
<line_editor name="role_title">
(attendi)
@@ -83,11 +84,11 @@ in questo gruppo. C&apos;è una vasta gamma di abilità.
<text name="static4">
Ruoli assegnati
</text>
- <check_box label="Mostrare i membri" name="role_visible_in_list" tool_tip="Imposta nella tabella Generale per i membri con questo ruolo di poter essere visti dalle persone esterne a questo gruppo."/>
+ <check_box label="Visualizza membri" name="role_visible_in_list" tool_tip="Imposta nella scheda Generale se i membri con questo ruolo possono essere visti dai residenti esterni a questo gruppo."/>
<text name="static5" tool_tip="Una lista delle abilità che il ruolo ora selezionato può eseguire.">
Abilità permesse
</text>
- <scroll_list name="role_allowed_actions" tool_tip="Per i dettagli di ogni abilità consentita vedi il pannello abilità."/>
+ <scroll_list name="role_allowed_actions" tool_tip="Per i dettagli di ogni abilità consentita vedi la scheda abilità."/>
</panel>
<panel name="actions_footer">
<text name="static">
diff --git a/indra/newview/skins/default/xui/it/panel_im_control_panel.xml b/indra/newview/skins/default/xui/it/panel_im_control_panel.xml
index f6c3fa9288..76b28eab24 100644
--- a/indra/newview/skins/default/xui/it/panel_im_control_panel.xml
+++ b/indra/newview/skins/default/xui/it/panel_im_control_panel.xml
@@ -1,13 +1,29 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_im_control_panel">
- <text name="avatar_name" value="Sconosciuto"/>
- <button label="Profilo" name="view_profile_btn"/>
- <button label="Aggiungi Amico" name="add_friend_btn"/>
- <button label="Teleport" name="teleport_btn"/>
- <button label="Condividi" name="share_btn"/>
- <panel name="panel_call_buttons">
- <button label="Chiama" name="call_btn"/>
- <button label="Abbandona chiamata" name="end_call_btn"/>
- <button label="Controllo Voice" name="voice_ctrls_btn"/>
- </panel>
+ <layout_stack name="button_stack">
+ <layout_panel name="view_profile_btn_panel">
+ <button label="Profilo" name="view_profile_btn"/>
+ </layout_panel>
+ <layout_panel name="add_friend_btn_panel">
+ <button label="Aggiungi amico" name="add_friend_btn"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_panel">
+ <button label="Teleport" name="teleport_btn" tool_tip="Offri teleport a questa persona"/>
+ </layout_panel>
+ <layout_panel name="share_btn_panel">
+ <button label="Condividi" name="share_btn"/>
+ </layout_panel>
+ <layout_panel name="pay_btn_panel">
+ <button label="Paga" name="pay_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Chiama" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Chiudi chiamata" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Regolazione voce" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_inventory_item.xml b/indra/newview/skins/default/xui/it/panel_inventory_item.xml
new file mode 100644
index 0000000000..d18047fbcf
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_inventory_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="inventory_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_landmark_info.xml b/indra/newview/skins/default/xui/it/panel_landmark_info.xml
index 5908a873cc..b4c5ab01bc 100644
--- a/indra/newview/skins/default/xui/it/panel_landmark_info.xml
+++ b/indra/newview/skins/default/xui/it/panel_landmark_info.xml
@@ -1,36 +1,37 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="landmark_info">
- <string name="title_create_landmark" value="Crea Landmark"/>
- <string name="title_edit_landmark" value="Modifica Landmark"/>
- <string name="title_landmark" value="Landmark"/>
- <string name="not_available" value="(N\A)"/>
+ <string name="title_create_landmark" value="Crea punto di riferimento"/>
+ <string name="title_edit_landmark" value="Modifica punto di riferimento"/>
+ <string name="title_landmark" value="Punto di riferimento"/>
+ <string name="not_available" value="(non pert.)"/>
<string name="unknown" value="(sconosciuto)"/>
<string name="public" value="(pubblico)"/>
<string name="server_update_text">
- Info sul luogo non disponibili senza l&apos;aggiornamento del server.
+ Informazioni sul luogo non disponibili senza l&apos;aggiornamento del server.
</string>
<string name="server_error_text">
- Info su questo luogo non disponibili ora, prova più tardi.
+ Informazioni su questo luogo non disponibili al momento, riprova più tardi.
</string>
<string name="server_forbidden_text">
- Info su questo luogo non disponibili a causa delle restrizioni di accesso. Controlla i tuoi permessi con il proprietario del terreno .
+ Informazioni su questo luogo non disponibili a causa delle limitazioni di accesso. Controlla i tuoi permessi con il proprietario del terreno.
</string>
<string name="acquired_date">
[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
</string>
- <text name="title" value="Colloca Profilo"/>
+ <button name="back_btn" tool_tip="Indietro"/>
+ <text name="title" value="Profilo del luogo"/>
<scroll_container name="place_scroll">
<panel name="scrolling_panel">
<text name="maturity_value" value="sconosciuto"/>
<panel name="landmark_info_panel">
<text name="owner_label" value="Proprietario:"/>
- <text name="creator_label" value="Creatore:"/>
+ <text name="creator_label" value="Ideatore:"/>
<text name="created_label" value="Creato:"/>
</panel>
<panel name="landmark_edit_panel">
<text name="title_label" value="Titolo:"/>
- <text name="notes_label" value="Mie note:"/>
- <text name="folder_label" value="Landmark del luogo:"/>
+ <text name="notes_label" value="Le mie note:"/>
+ <text name="folder_label" value="Ubicazione punto di riferimento:"/>
</panel>
</panel>
</scroll_container>
diff --git a/indra/newview/skins/default/xui/it/panel_landmarks.xml b/indra/newview/skins/default/xui/it/panel_landmarks.xml
index 0efeaac97d..74cd9e6fb1 100644
--- a/indra/newview/skins/default/xui/it/panel_landmarks.xml
+++ b/indra/newview/skins/default/xui/it/panel_landmarks.xml
@@ -2,13 +2,13 @@
<panel name="Landmarks">
<accordion name="landmarks_accordion">
<accordion_tab name="tab_favorites" title="Barra dei Preferiti"/>
- <accordion_tab name="tab_landmarks" title="Landmarks"/>
- <accordion_tab name="tab_inventory" title="Mio Inventario"/>
+ <accordion_tab name="tab_landmarks" title="I miei punti di riferimento"/>
+ <accordion_tab name="tab_inventory" title="Il mio inventario"/>
<accordion_tab name="tab_library" title="Libreria"/>
</accordion>
<panel name="bottom_panel">
<button name="options_gear_btn" tool_tip="Mostra opzioni addizionali"/>
- <button name="add_btn" tool_tip="Aggiungi nuovo landmark"/>
- <dnd_button name="trash_btn" tool_tip="Rimuovi landmark selezionato"/>
+ <button name="add_btn" tool_tip="Aggiungi un nuovo punto di riferimento"/>
+ <dnd_button name="trash_btn" tool_tip="Rimuovi il punto di riferimento selezionato"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_login.xml b/indra/newview/skins/default/xui/it/panel_login.xml
index 7706a044fa..473bcfa88d 100644
--- a/indra/newview/skins/default/xui/it/panel_login.xml
+++ b/indra/newview/skins/default/xui/it/panel_login.xml
@@ -8,26 +8,33 @@
</panel.string>
<layout_stack name="login_widgets">
<layout_panel name="login">
- <text name="first_name_text">
- Nome:
+ <text name="username_text">
+ Nome utente:
</text>
- <line_editor label="Nome" name="first_name_edit" tool_tip="[SECOND_LIFE] First Name"/>
- <line_editor label="Cognome" name="last_name_edit" tool_tip="[SECOND_LIFE] Last Name"/>
- <check_box label="Ricordare" name="remember_check"/>
+ <line_editor label="Nome utente" name="username_edit" tool_tip="Nome utente [SECOND_LIFE]"/>
+ <text name="password_text">
+ Password:
+ </text>
+ <check_box label="Ricorda password" name="remember_check"/>
+ <button label="Accedi" name="connect_btn"/>
<text name="start_location_text">
- Iniziare presso:
+ Inizia da:
</text>
<combo_box name="start_location_combo">
+ <combo_box.item label="La mia ultima ubicazione" name="MyLastLocation"/>
<combo_box.item label="Casa mia" name="MyHome"/>
+ <combo_box.item label="&lt;Scrivi nome regione&gt;" name="Typeregionname"/>
</combo_box>
- <button label="Log In" name="connect_btn"/>
</layout_panel>
<layout_panel name="links">
<text name="create_new_account_text">
- Aderire
+ Iscriviti
+ </text>
+ <text name="forgot_password_text">
+ Hai dimenticato il nome o la password?
</text>
<text name="login_help">
- Aiuto quando log in?
+ Ti serve aiuto con la fase di accesso?
</text>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/it/panel_main_inventory.xml b/indra/newview/skins/default/xui/it/panel_main_inventory.xml
index edaab6e60c..446b51ffa3 100644
--- a/indra/newview/skins/default/xui/it/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/it/panel_main_inventory.xml
@@ -1,64 +1,28 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Cose" name="main inventory panel">
- <panel.string name="Title">
- Cose
+ <panel.string name="ItemcountFetching">
+ Recupero di [ITEM_COUNT] oggetti... [FILTER]
</panel.string>
+ <panel.string name="ItemcountCompleted">
+ [ITEM_COUNT] oggetti [FILTER]
+ </panel.string>
+ <text name="ItemcountText">
+ Oggetti:
+ </text>
<filter_editor label="Filtro" name="inventory search editor"/>
<tab_container name="inventory filter tabs">
<inventory_panel label="Tutti gli elementi" name="All Items"/>
- <inventory_panel label="Elementi recenti" name="Recent Items"/>
+ <recent_inventory_panel label="Elementi recenti" name="Recent Items"/>
</tab_container>
- <panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="Mostra ulteriori opzioni"/>
- <button name="add_btn" tool_tip="Aggiungi nuovo elemento"/>
- <dnd_button name="trash_btn" tool_tip="Rimuovi l&apos;elemento selezionato"/>
- </panel>
- <menu_bar name="Inventory Menu">
- <menu label="File" name="File">
- <menu_item_call label="Apri" name="Open"/>
- <menu label="Carica nel server" name="upload">
- <menu_item_call label="Immagine ([COST]L$)..." name="Upload Image"/>
- <menu_item_call label="Suono ([COST]L$)..." name="Upload Sound"/>
- <menu_item_call label="Animazione ([COST]L$)..." name="Upload Animation"/>
- <menu_item_call label="In blocco ([COST]L$ per file)..." name="Bulk Upload"/>
- </menu>
- <menu_item_call label="Nuova Finestra" name="New Window"/>
- <menu_item_call label="Mostra Filtri" name="Show Filters"/>
- <menu_item_call label="Cancella Filtri" name="Reset Current"/>
- <menu_item_call label="Chiudi tutte le Cartelle" name="Close All Folders"/>
- <menu_item_call label="Svuota Cestino" name="Empty Trash"/>
- <menu_item_call label="Svuota Oggetti Smarriti" name="Empty Lost And Found"/>
- </menu>
- <menu label="Crea" name="Create">
- <menu_item_call label="Nuova Cartella" name="New Folder"/>
- <menu_item_call label="Nuovo Script" name="New Script"/>
- <menu_item_call label="Nuova Notecard" name="New Note"/>
- <menu_item_call label="Nuova Gesture" name="New Gesture"/>
- <menu label="Nuovi Abiti" name="New Clothes">
- <menu_item_call label="Nuova Camicia" name="New Shirt"/>
- <menu_item_call label="Nuovi Pantaloni" name="New Pants"/>
- <menu_item_call label="Nuove Scarpe" name="New Shoes"/>
- <menu_item_call label="Nuove Calze" name="New Socks"/>
- <menu_item_call label="Nuova Giacca" name="New Jacket"/>
- <menu_item_call label="Nuova Gonna" name="New Skirt"/>
- <menu_item_call label="Nuovi Guanti" name="New Gloves"/>
- <menu_item_call label="Nuova Maglietta Intima" name="New Undershirt"/>
- <menu_item_call label="Nuovi Slip" name="New Underpants"/>
- <menu_item_call label="Nuovo Alfa (Trasparenza)" name="New Alpha"/>
- <menu_item_call label="Nuovo Tatuaggio" name="New Tattoo"/>
- </menu>
- <menu label="Nuove Parti del Corpo" name="New Body Parts">
- <menu_item_call label="Nuova Shape" name="New Shape"/>
- <menu_item_call label="Nuova Pelle" name="New Skin"/>
- <menu_item_call label="Nuovi Capelli" name="New Hair"/>
- <menu_item_call label="Nuovi Occhi" name="New Eyes"/>
- </menu>
- </menu>
- <menu label="Ordina" name="Sort">
- <menu_item_check label="Per Nome" name="By Name"/>
- <menu_item_check label="Per Data" name="By Date"/>
- <menu_item_check label="Cartelle sempre per Nome" name="Folders Always By Name"/>
- <menu_item_check label="Cartelle di sistema all&apos;inizio" name="System Folders To Top"/>
- </menu>
- </menu_bar>
+ <layout_stack name="bottom_panel">
+ <layout_panel name="options_gear_btn_panel">
+ <button name="options_gear_btn" tool_tip="Mostra opzioni addizionali"/>
+ </layout_panel>
+ <layout_panel name="add_btn_panel">
+ <button name="add_btn" tool_tip="Aggiungi nuovo elemento"/>
+ </layout_panel>
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="trash_btn" tool_tip="Rimuovi l&apos;articolo selezionato"/>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_me.xml b/indra/newview/skins/default/xui/it/panel_me.xml
index 03678ecad5..66601aa165 100644
--- a/indra/newview/skins/default/xui/it/panel_me.xml
+++ b/indra/newview/skins/default/xui/it/panel_me.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Mio Profilo" name="panel_me">
+<panel label="Il mio profilo" name="panel_me">
<tab_container name="tabs">
- <panel label="PROFILO" name="panel_profile"/>
- <panel label="PREFERITI" name="panel_picks"/>
+ <panel label="IL MIO PROFILO" name="panel_profile"/>
+ <panel label="I MIEI PREFERITI" name="panel_picks"/>
</tab_container>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_media_settings_general.xml b/indra/newview/skins/default/xui/it/panel_media_settings_general.xml
index cb629e5cfb..5ed7b23679 100644
--- a/indra/newview/skins/default/xui/it/panel_media_settings_general.xml
+++ b/indra/newview/skins/default/xui/it/panel_media_settings_general.xml
@@ -4,27 +4,27 @@
Home Page:
</text>
<text name="home_fails_whitelist_label">
- (Questa pagina non passa la lista bianca specifica)
+ (Questa pagina non supera la revisione o lista bianca specifica)
</text>
- <line_editor name="home_url" tool_tip="La home page per questa fonte media"/>
+ <line_editor name="home_url" tool_tip="La home page per questa fonte multimediale"/>
<text name="preview_label">
Anteprima
</text>
<text name="current_url_label">
Pagina attuale:
</text>
- <text name="current_url" tool_tip="La pagina attuale per questa fonte media" value=""/>
- <button label="Resetta" name="current_url_reset_btn"/>
- <check_box initial_value="false" label="Auto Loop" name="auto_loop"/>
- <check_box initial_value="false" label="Primo Click Interagisce" name="first_click_interact"/>
- <check_box initial_value="false" label="Auto Zoom" name="auto_zoom"/>
- <check_box initial_value="false" label="Auto Play Media" name="auto_play"/>
+ <text name="current_url" tool_tip="La pagina attuale per questa fonte multimediale" value=""/>
+ <button label="Reimposta" name="current_url_reset_btn"/>
+ <check_box initial_value="false" label="Ripetizione automatica" name="auto_loop"/>
+ <check_box initial_value="false" label="Interazione col primo clic" name="first_click_interact"/>
+ <check_box initial_value="false" label="Zoom automatico" name="auto_zoom"/>
+ <check_box initial_value="false" label="Riproduzione multimediale automatica" name="auto_play"/>
<text name="media_setting_note">
- Nota: I Residenti possono annullare questa impostazione
+ Nota: I residenti possono annullare questa impostazione
</text>
- <check_box initial_value="false" label="Auto Scale Media on Face of Object" name="auto_scale"/>
+ <check_box initial_value="false" label="Messa in scala automatica dell&apos;elemento multimediale sulla faccia dell&apos;oggetto" name="auto_scale"/>
<text name="size_label">
- Misura:
+ Dimensioni:
</text>
<text name="X_label">
X
diff --git a/indra/newview/skins/default/xui/it/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/it/panel_media_settings_permissions.xml
index 551d86864d..0f0f1c9fe4 100644
--- a/indra/newview/skins/default/xui/it/panel_media_settings_permissions.xml
+++ b/indra/newview/skins/default/xui/it/panel_media_settings_permissions.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Personalizza" name="Media settings for controls">
<text name="controls_label">
- Controlli:
+ Regolazioni:
</text>
<combo_box name="controls">
<combo_item name="Standard">
@@ -11,10 +11,19 @@
Mini
</combo_item>
</combo_box>
- <check_box initial_value="false" label="Permetti Navigazione &amp; Interattività" name="perms_owner_interact"/>
+ <text name="owner_label">
+ Proprietario
+ </text>
+ <check_box initial_value="false" label="Permetti navigazione e interattività" name="perms_owner_interact"/>
<check_box initial_value="false" label="Mostra la barra di controllo" name="perms_owner_control"/>
- <check_box initial_value="false" label="Permetti Navigazione &amp; Interattività" name="perms_group_interact"/>
+ <text name="group_label">
+ Gruppo:
+ </text>
+ <check_box initial_value="false" label="Permetti navigazione e interattività" name="perms_group_interact"/>
<check_box initial_value="false" label="Mostra la barra di controllo" name="perms_group_control"/>
- <check_box initial_value="false" label="Permetti Navigazione &amp; Interattività" name="perms_anyone_interact"/>
+ <text name="anyone_label">
+ Chiunque
+ </text>
+ <check_box initial_value="false" label="Permetti navigazione e interattività" name="perms_anyone_interact"/>
<check_box initial_value="false" label="Mostra la barra di controllo" name="perms_anyone_control"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_media_settings_security.xml b/indra/newview/skins/default/xui/it/panel_media_settings_security.xml
index 0df0331198..785cd048a1 100644
--- a/indra/newview/skins/default/xui/it/panel_media_settings_security.xml
+++ b/indra/newview/skins/default/xui/it/panel_media_settings_security.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Sicurezza" name="Media Settings Security">
- <check_box initial_value="false" label="Accesso permesso solo a URLs specificati (by prefix)" name="whitelist_enable"/>
+ <check_box initial_value="false" label="Permetti l&apos;accesso solo ai modelli di URL specificati" name="whitelist_enable"/>
<text name="home_url_fails_some_items_in_whitelist">
- Annota che le home page mancate sono segnate:
+ Le mancate aperture di home page sono segnalate:
</text>
<button label="Aggiungi" name="whitelist_add"/>
- <button label="Cancella" name="whitelist_del"/>
+ <button label="Elimina" name="whitelist_del"/>
<text name="home_url_fails_whitelist">
- Attenzione: la home page specificata nella Tabella General non ha passato questa lista bianca. E&apos; stata disattivata fino a quando non sarà aggiunta un entrata valid.
+ Avvertenza: la home page specificata nella scheda Generale non ha superato la lista bianca. Viene disabilitata fino a che non venga inserita una voce valida.
</text>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_my_profile.xml b/indra/newview/skins/default/xui/it/panel_my_profile.xml
index 60faf4e7c5..08c050228f 100644
--- a/indra/newview/skins/default/xui/it/panel_my_profile.xml
+++ b/indra/newview/skins/default/xui/it/panel_my_profile.xml
@@ -1,37 +1,35 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Profilo" name="panel_profile">
<string name="no_partner_text" value="Nessuno"/>
+ <string name="no_group_text" value="Nessuno"/>
<string name="RegisterDateFormat">
[REG_DATE] ([AGE])
</string>
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <panel name="second_life_image_panel">
- <icon label="" name="2nd_life_edit_icon" tool_tip="Clicca il pulsante inferiore Modifica Profilo per cambiare immagine"/>
- </panel>
- <panel name="first_life_image_panel">
- <icon label="" name="real_world_edit_icon" tool_tip="Clicca il pulsante inferiore Modifica Profilo per cambiare immagine"/>
- <text name="title_rw_descr_text" value="Mondo Reale:"/>
- </panel>
- <text name="me_homepage_text">
- Homepage:
- </text>
- <text name="title_member_text" value="Membro dal:"/>
- <text name="title_acc_status_text" value="Stato dell&apos;account:"/>
- <text name="acc_status_text" value="Residente. Nessuna info di pagamento."/>
- <text name="title_partner_text" value="Partner:"/>
- <text name="title_groups_text" value="Gruppi:"/>
- </panel>
- </scroll_container>
- <panel name="profile_buttons_panel">
- <button label="Aggiungi amico" name="add_friend"/>
- <button label="IM" name="im"/>
- <button label="Chiama" name="call"/>
- <button label="Mappa" name="show_on_map_btn"/>
- <button label="Teleport" name="teleport"/>
- </panel>
- <panel name="profile_me_buttons_panel">
- <button label="Modifica Profilo" name="edit_profile_btn" tool_tip="Modifica le tue informazioni personali"/>
- <button label="Modifica aspetto" name="edit_appearance_btn" tool_tip="Crea/modifica la tua apparenza: aspetto fisico, vestiti, etc."/>
- </panel>
+ <layout_stack name="layout">
+ <layout_panel name="profile_stack">
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="second_life_image_panel">
+ <icon label="" name="2nd_life_edit_icon" tool_tip="Clicca sul pulsante Modifica profilo per cambiare l&apos;immagine"/>
+ <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <icon label="" name="real_world_edit_icon" tool_tip="Clicca sul pulsante Modifica profilo per cambiare l&apos;immagine"/>
+ <text name="title_rw_descr_text" value="Mondo reale:"/>
+ </panel>
+ <text name="title_member_text" value="Residente dal:"/>
+ <text name="title_acc_status_text" value="Stato account:"/>
+ <text name="title_partner_text" value="Partner:"/>
+ <panel name="partner_data_panel">
+ <name_box initial_value="(recupero)" name="partner_text"/>
+ </panel>
+ <text name="title_groups_text" value="Gruppi:"/>
+ </panel>
+ </scroll_container>
+ </layout_panel>
+ <layout_panel name="profile_me_buttons_panel">
+ <button label="Modifica profilo" name="edit_profile_btn" tool_tip="Modifica le tue informazioni personali"/>
+ <button label="Modifica aspetto fisico" name="edit_appearance_btn" tool_tip="Crea/modifica il tuo aspetto: parti del corpo, abiti ecc."/>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_navigation_bar.xml b/indra/newview/skins/default/xui/it/panel_navigation_bar.xml
index 2e057c2983..8e72167759 100644
--- a/indra/newview/skins/default/xui/it/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/it/panel_navigation_bar.xml
@@ -1,15 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="navigation_bar">
<panel name="navigation_panel">
- <button name="back_btn" tool_tip="Ritorna al luogo precedente"/>
- <button name="forward_btn" tool_tip="Vai ad un luogo"/>
- <button name="home_btn" tool_tip="Teleport a casa mia"/>
- <location_input label="Luogo" name="location_combo"/>
+ <pull_button name="back_btn" tool_tip="Torna al luogo precedente"/>
+ <pull_button name="forward_btn" tool_tip="Procedi un luogo in avanti"/>
+ <button name="home_btn" tool_tip="Teleport a casa"/>
+ <location_input label="Posizione" name="location_combo"/>
<search_combo_box label="Cerca" name="search_combo_box" tool_tip="Cerca">
<combo_editor label="Cerca [SECOND_LIFE]" name="search_combo_editor"/>
</search_combo_box>
</panel>
- <favorites_bar name="favorite">
- <chevron_button name="&gt;&gt;" tool_tip="Mostra più dei miei Preferiti"/>
+ <favorites_bar name="favorite" tool_tip="Trascina qui i punti di riferimento per un accesso rapido ai tuoi posti preferiti in Second Life.">
+ <label name="favorites_bar_label" tool_tip="Trascina qui i punti di riferimento per un accesso rapido ai tuoi posti preferiti in Second Life.">
+ Barra dei Preferiti
+ </label>
+ <chevron_button name="&gt;&gt;" tool_tip="Mostra altri Preferiti"/>
</favorites_bar>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/it/panel_nearby_chat_bar.xml
index 0361eb49ed..6317d3192e 100644
--- a/indra/newview/skins/default/xui/it/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/it/panel_nearby_chat_bar.xml
@@ -6,6 +6,6 @@
<string name="max_width">
320
</string>
- <line_editor label="Clicca qui per la chat." name="chat_box" tool_tip="Premi Invio per dire, Ctrl+Invio per gridare"/>
- <button name="show_nearby_chat" tool_tip="Mostra/Nasconde la chat log nei dintorni"/>
+ <line_editor label="Clicca qui per la chat." name="chat_box" tool_tip="Premi Invio per parlare, Ctrl+Invio per gridare"/>
+ <button name="show_nearby_chat" tool_tip="Mostra/Nasconde il registro della chat nei dintorni"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_nearby_media.xml b/indra/newview/skins/default/xui/it/panel_nearby_media.xml
new file mode 100644
index 0000000000..01e21d520a
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_nearby_media.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_media">
+ <string name="media_item_count_format">
+ (%ld oggetti multimediali)
+ </string>
+ <string name="empty_item_text">
+ &lt;vuoto&gt;
+ </string>
+ <string name="parcel_media_name">
+ Streaming media del lotto
+ </string>
+ <string name="parcel_audio_name">
+ Streaming audio del lotto
+ </string>
+ <string name="playing_suffix">
+ (riproduzione)
+ </string>
+ <panel name="minimized_controls">
+ <button label="Spegni" name="all_nearby_media_disable_btn" tool_tip="Spegni tutti i media nei dintorni"/>
+ <button label="Accendi tutto" name="all_nearby_media_enable_btn" tool_tip="Accendi tutti i media nei dintorni"/>
+ <button name="open_prefs_btn" tool_tip="Accedi alle preferenze del media"/>
+ <button label="Più &gt;&gt;" label_selected="Meno &lt;&lt;" name="more_btn" tool_tip="Opzioni avanzate"/>
+ <button label="Più &gt;&gt;" label_selected="Meno &lt;&lt;" name="less_btn" tool_tip="Opzioni avanzate"/>
+ </panel>
+ <panel name="nearby_media_panel">
+ <combo_box name="show_combo">
+ <combo_box.item label="Tutto" name="All"/>
+ <combo_box.item label="In questo lotto" name="WithinParcel"/>
+ <combo_box.item label="Fuori da questo lotto" name="OutsideParcel"/>
+ <combo_box.item label="su altri avatar" name="OnOthers"/>
+ </combo_box>
+ <scroll_list name="media_list">
+ <scroll_list.columns label="Dintorni" name="media_proximity"/>
+ <scroll_list.columns label="Visibile" name="media_visibility"/>
+ <scroll_list.columns label="Classe" name="media_class"/>
+ <scroll_list.columns label="Nome" name="media_name"/>
+ <scroll_list.columns label="Debug" name="media_debug"/>
+ </scroll_list>
+ <panel>
+ <layout_stack name="media_controls">
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="Interrompi supporto selezionato"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="Riproduci media selezionato"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="Pausa media selezionato"/>
+ </layout_panel>
+ <layout_panel name="volume_slider_ctrl">
+ <slider_bar initial_value="0.5" name="volume_slider" tool_tip="Volume audio per il media selezionato"/>
+ </layout_panel>
+ <layout_panel name="mute">
+ <button name="mute_btn" tool_tip="Disattiva audio dei supporti selezionati"/>
+ </layout_panel>
+ <layout_panel name="zoom">
+ <button name="zoom_btn" tool_tip="Zoom nel media selezionato"/>
+ </layout_panel>
+ <layout_panel name="unzoom">
+ <button name="unzoom_btn" tool_tip="Zoom indietro dal media selezionato"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_notes.xml b/indra/newview/skins/default/xui/it/panel_notes.xml
index ff843c1684..9ce6b47a32 100644
--- a/indra/newview/skins/default/xui/it/panel_notes.xml
+++ b/indra/newview/skins/default/xui/it/panel_notes.xml
@@ -1,20 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Note &amp; Privacy" name="panel_notes">
+<panel label="Note e Privacy" name="panel_notes">
<layout_stack name="layout">
<panel name="notes_stack">
<scroll_container name="profile_scroll">
<panel name="profile_scroll_panel">
<text name="status_message" value="Le mie note private:"/>
- <text name="status_message2" value="Permetti a questa persona di:"/>
- <check_box label="Vedermi On-line" name="status_check"/>
- <check_box label="Vedermi sull mappa" name="map_check"/>
- <check_box label="Modificare, cancellare o prendere i miei oggetti" name="objects_check"/>
+ <text name="status_message2" value="Consenti a questa persona di:"/>
+ <check_box label="Vedere se sono online" name="status_check"/>
+ <check_box label="Vedermi sulla mappa" name="map_check"/>
+ <check_box label="Modificare, eliminare o prendere i miei oggetti" name="objects_check"/>
</panel>
</scroll_container>
</panel>
<panel name="notes_buttons_panel">
- <button label="Aggiungi" name="add_friend" tool_tip="Offrire amicizia ad un residente"/>
- <button label="IM" name="im" tool_tip="Apri una sessione di messaggio istantaneo"/>
+ <button label="Aggiungi amico" name="add_friend" tool_tip="Offri amicizia a questo residente"/>
+ <button label="IM" name="im" tool_tip="Apri una sessione messaggio istantaneo"/>
<button label="Chiama" name="call" tool_tip="Chiama questo residente"/>
<button label="Mappa" name="show_on_map_btn" tool_tip="Mostra il residente sulla mappa"/>
<button label="Teleport" name="teleport" tool_tip="Offri teleport"/>
diff --git a/indra/newview/skins/default/xui/it/panel_online_status.xml b/indra/newview/skins/default/xui/it/panel_online_status.xml
new file mode 100644
index 0000000000..fdc489f375
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_online_status.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="friend_online_status" name="friend_online_status"/>
diff --git a/indra/newview/skins/default/xui/it/panel_online_status_toast.xml b/indra/newview/skins/default/xui/it/panel_online_status_toast.xml
new file mode 100644
index 0000000000..fdc489f375
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_online_status_toast.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="friend_online_status" name="friend_online_status"/>
diff --git a/indra/newview/skins/default/xui/it/panel_outfit_edit.xml b/indra/newview/skins/default/xui/it/panel_outfit_edit.xml
new file mode 100644
index 0000000000..57168096d5
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_outfit_edit.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray Outfit Edit panel -->
+<panel label="Modifica del vestiario" name="outfit_edit">
+ <string name="No Outfit" value="Nessun vestiario"/>
+ <string name="unsaved_changes" value="Modifiche non salvate"/>
+ <string name="now_editing" value="Modifica di"/>
+ <panel.string name="not_available">
+ (non pert.)
+ </panel.string>
+ <panel.string name="unknown">
+ (sconosciuto)
+ </panel.string>
+ <string name="Filter.All" value="Tutto"/>
+ <string name="Filter.Clothes/Body" value="Abiti/corpo"/>
+ <string name="Filter.Objects" value="Oggetti"/>
+ <string name="Filter.Custom" value="Filtro personalizzato"/>
+ <text name="title" value="Modifica vestiario"/>
+ <panel label="bottom_panel" name="header_panel">
+ <panel label="bottom_panel" name="outfit_name_and_status">
+ <text name="status" value="Modifica di..."/>
+ <text name="curr_outfit_name" value="[Current Outfit]"/>
+ </panel>
+ </panel>
+ <layout_stack name="im_panels">
+ <layout_panel label="Pannello di controllo IM" name="outfit_wearables_panel">
+ <layout_stack name="filter_panels">
+ <layout_panel name="add_button_and_combobox">
+ <button label="Aggiungi altri..." name="show_add_wearables_btn"/>
+ </layout_panel>
+ <layout_panel name="filter_panel">
+ <filter_editor label="Filtra capi da indossare dell&apos;inventario" name="look_item_filter"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="add_wearables_panel"/>
+ </layout_stack>
+ <panel name="save_revert_button_bar">
+ <button label="Salva" name="save_btn"/>
+ <button label="Ripristina" name="revert_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/it/panel_outfits_inventory.xml
index 9332a3ef36..8f8f7a25f4 100644
--- a/indra/newview/skins/default/xui/it/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/it/panel_outfits_inventory.xml
@@ -1,7 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="Outfits">
- <accordion name="outfits_accordion">
- <accordion_tab name="tab_cof" title="Vestiario attuale"/>
- <accordion_tab name="tab_outfits" title="Mio Vestiario"/>
- </accordion>
+<panel label="Cose" name="Outfits">
+ <tab_container name="appearance_tabs">
+ <panel label="I MIEI ABITI" name="outfitslist_tab"/>
+ <inventory_panel label="INDOSSA" name="cof_tab"/>
+ </tab_container>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Mostra opzioni addizionali"/>
+ <dnd_button name="trash_btn" tool_tip="Rimuovi l&apos;articolo selezionato"/>
+ <button label="Salva con nome" name="save_btn"/>
+ <button label="Indossa" name="wear_btn" tool_tip="Indossa il vestiario selezionato"/>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/it/panel_outfits_inventory_gear_default.xml
index c6be942312..9e1a45b129 100644
--- a/indra/newview/skins/default/xui/it/panel_outfits_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/it/panel_outfits_inventory_gear_default.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_gear_default">
- <menu_item_call label="Sostituisci il Vestiario attuale" name="wear"/>
- <menu_item_call label="Aggiungi al Vestiario attuale" name="add"/>
- <menu_item_call label="Rimuovi dal Vestiario attuale" name="remove"/>
- <menu_item_call label="Rinomina" name="rename"/>
- <menu_item_call label="Rimuovi" name="remove_link"/>
- <menu_item_call label="Cancella" name="delete"/>
+ <menu_item_call label="Sostituisci vestiario attuale" name="wear"/>
+ <menu_item_call label="Aggiungi al vestiario attuale" name="add"/>
+ <menu_item_call label="Rimuovi dal vestiario attuale" name="remove"/>
+ <menu_item_call label="Modifica nome" name="rename"/>
+ <menu_item_call label="Rimuovi link" name="remove_link"/>
+ <menu_item_call label="Elimina vestito" name="delete"/>
</menu>
diff --git a/indra/newview/skins/default/xui/it/panel_people.xml b/indra/newview/skins/default/xui/it/panel_people.xml
index b20db0d565..056e424436 100644
--- a/indra/newview/skins/default/xui/it/panel_people.xml
+++ b/indra/newview/skins/default/xui/it/panel_people.xml
@@ -1,33 +1,43 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Side tray panel -->
-<panel label="Persona" name="people_panel">
- <string name="no_people" value="Nessuna persona"/>
- <string name="no_one_near" value="Nessuno vicino"/>
+<panel label="Persone" name="people_panel">
+ <string name="no_recent_people" value="Nessuna persona recente. Stai cercando persone da frequentare? Prova la [secondlife:///app/search/people Ricerca] o la [secondlife:///app/worldmap Mappa del mondo]."/>
+ <string name="no_filtered_recent_people" value="Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/people/[SEARCH_TERM] Cerca]."/>
+ <string name="no_one_near" value="Nessuno vicino. Stai cercando persone da frequentare? Try la [secondlife:///app/search/people Ricerca] o la [secondlife:///app/worldmap Mappa del mondo]."/>
+ <string name="no_one_filtered_near" value="Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/people/[SEARCH_TERM] Cerca]."/>
<string name="no_friends_online" value="Nessun amico online"/>
<string name="no_friends" value="Nessun amico"/>
- <string name="no_groups" value="Nessun gruppo"/>
- <string name="people_filter_label" value="Filtro Persone"/>
- <string name="groups_filter_label" value="Filtro Gruppi"/>
+ <string name="no_friends_msg">
+ Per trovare amici, utilizza [secondlife:///app/search/people Cerca] oppure fai clic col tasto destro del mouse su un residente per aggiungerlo come amico.
+Stai cercando persone da frequentare? Prova la [secondlife:///app/worldmap Mappa del mondo].
+ </string>
+ <string name="no_filtered_friends_msg">
+ Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/people/[SEARCH_TERM] Cerca].
+ </string>
+ <string name="people_filter_label" value="Filtro persone"/>
+ <string name="groups_filter_label" value="Filtro gruppi"/>
+ <string name="no_filtered_groups_msg" value="Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/groups/[SEARCH_TERM] Cerca]."/>
+ <string name="no_groups_msg" value="Stai cercando gruppi di cui far parte? Prova [secondlife:///app/search/groups Cerca]."/>
<filter_editor label="Filtro" name="filter_input"/>
<tab_container name="tabs">
<panel label="NELLE VICINANZE" name="nearby_panel">
<panel label="bottom_panel" name="bottom_panel">
<button name="nearby_view_sort_btn" tool_tip="Opzioni"/>
- <button name="add_friend_btn" tool_tip="Aggiungi il residente selezionato alla tua lista di amici"/>
+ <button name="add_friend_btn" tool_tip="Aggiungi il residente selezionato alla tua lista degli amici"/>
</panel>
</panel>
- <panel label="AMICI" name="friends_panel">
+ <panel label="I MIEI AMICI" name="friends_panel">
<accordion name="friends_accordion">
<accordion_tab name="tab_online" title="Online"/>
- <accordion_tab name="tab_all" title="Tutti"/>
+ <accordion_tab name="tab_all" title="Tutto"/>
</accordion>
<panel label="bottom_panel" name="bottom_panel">
<button name="friends_viewsort_btn" tool_tip="Opzioni"/>
- <button name="add_btn" tool_tip="Offri amicizia ad un residente"/>
- <button name="del_btn" tool_tip="Rimuovi la persona selezionata dalla tua lista di amici"/>
+ <button name="add_btn" tool_tip="Offri amicizia a un residente"/>
+ <button name="del_btn" tool_tip="Rimuovi la persona selezionata dalla lista degli amici"/>
</panel>
</panel>
- <panel label="GRUPPI" name="groups_panel">
+ <panel label="I MIEI GRUPPI" name="groups_panel">
<panel label="bottom_panel" name="bottom_panel">
<button name="groups_viewsort_btn" tool_tip="Opzioni"/>
<button name="plus_btn" tool_tip="Aderisci al gruppo/Crea nuovo gruppo"/>
@@ -37,17 +47,18 @@
<panel label="RECENTE" name="recent_panel">
<panel label="bottom_panel" name="bottom_panel">
<button name="recent_viewsort_btn" tool_tip="Opzioni"/>
- <button name="add_friend_btn" tool_tip="Aggiungi il residente selezionato alla tua lista di amici"/>
+ <button name="add_friend_btn" tool_tip="Aggiungi il residente selezionato alla tua lista degli amici"/>
</panel>
</panel>
</tab_container>
<panel name="button_bar">
- <button label="Profilo" name="view_profile_btn" tool_tip="Mostra foto, gruppi, e info di altri residenti"/>
- <button label="IM" name="im_btn" tool_tip="Apri sessione instant message"/>
+ <button label="Profilo" name="view_profile_btn" tool_tip="Mostra immagine, gruppi e altre informazioni del residente"/>
+ <button label="IM" name="im_btn" tool_tip="Apri una sessione messaggio istantaneo"/>
<button label="Chiama" name="call_btn" tool_tip="Chiama questo residente"/>
- <button label="Condividi" name="share_btn"/>
+ <button label="Condividi" name="share_btn" tool_tip="Condividi un oggetto dell&apos;inventario"/>
<button label="Teleport" name="teleport_btn" tool_tip="Offri teleport"/>
- <button label="Profilo del Gruppo" name="group_info_btn" tool_tip="Mostra info del gruppo"/>
+ <button label="Profilo del gruppo" name="group_info_btn" tool_tip="Mostra informazioni gruppo"/>
<button label="Chat di gruppo" name="chat_btn" tool_tip="Apri sessione chat"/>
+ <button label="Chiamata al gruppo" name="group_call_btn" tool_tip="Chiama questo gruppo"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_pick_info.xml b/indra/newview/skins/default/xui/it/panel_pick_info.xml
index 4771457825..7c059b443d 100644
--- a/indra/newview/skins/default/xui/it/panel_pick_info.xml
+++ b/indra/newview/skins/default/xui/it/panel_pick_info.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_pick_info">
- <text name="title" value="Scegli Info ????"/>
+ <text name="title" value="Scegli Info"/>
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
<text name="pick_name" value="[nome]"/>
- <text name="pick_location" value="[Caricando...]"/>
+ <text name="pick_location" value="[caricamento...]"/>
<text name="pick_desc" value="[descrizione]"/>
</panel>
</scroll_container>
diff --git a/indra/newview/skins/default/xui/it/panel_picks.xml b/indra/newview/skins/default/xui/it/panel_picks.xml
index bcc433708d..823e0fcd03 100644
--- a/indra/newview/skins/default/xui/it/panel_picks.xml
+++ b/indra/newview/skins/default/xui/it/panel_picks.xml
@@ -1,20 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Foto" name="panel_picks">
- <string name="no_picks" value="Nessuna Foto"/>
- <string name="no_classifieds" value="Nessun Annuncio"/>
+<panel label="Preferiti" name="panel_picks">
+ <string name="no_picks" value="Nessun luogo preferito"/>
+ <string name="no_classifieds" value="Nessun annuncio"/>
<text name="empty_picks_panel_text">
Nessuna foto/annuncio qui
</text>
<accordion name="accordion">
- <accordion_tab name="tab_picks" title="Foto"/>
- <accordion_tab name="tab_classifieds" title="Annunci"/>
+ <accordion_tab name="tab_picks" title="Preferiti"/>
+ <accordion_tab name="tab_classifieds" title="Annunci pubblicitari"/>
</accordion>
<panel label="bottom_panel" name="edit_panel">
- <button name="new_btn" tool_tip="Crea una nuova foto o annuncio in questo luogo"/>
+ <button name="new_btn" tool_tip="Crea un nuovo luogo preferito o annuncio in questo luogo"/>
</panel>
<panel name="buttons_cucks">
- <button label="Info" name="info_btn" tool_tip="Mostra info sulla foto"/>
- <button label="Teleport" name="teleport_btn" tool_tip="Teleport all&apos;area corrispondente"/>
- <button label="Mappa" name="show_on_map_btn" tool_tip="Mostra l&apos;area corrispondente nella Mappa del Mondo"/>
+ <button label="Informazioni" name="info_btn" tool_tip="Mostra informazioni sul luogo preferito"/>
+ <button label="Teleport" name="teleport_btn" tool_tip="Teleport alla zona corrispondente"/>
+ <button label="Mappa" name="show_on_map_btn" tool_tip="Mostra la zona corrispondente nella mappa del Mondo"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_place_profile.xml b/indra/newview/skins/default/xui/it/panel_place_profile.xml
index 70e1577199..eace6c89ce 100644
--- a/indra/newview/skins/default/xui/it/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/it/panel_place_profile.xml
@@ -1,99 +1,107 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="place_profile">
- <string name="on" value="On"/>
- <string name="off" value="Off"/>
+ <string name="on" value="Attivo"/>
+ <string name="off" value="Disattivato"/>
<string name="anyone" value="Chiunque"/>
<string name="available" value="disponibile"/>
<string name="allocated" value="assegnato"/>
<string name="title_place" value="Profilo del luogo"/>
- <string name="title_teleport_history" value="Cronologia dei Teleport"/>
- <string name="not_available" value="(N\D)"/>
+ <string name="title_teleport_history" value="Cronologia Teleport"/>
+ <string name="not_available" value="(non pert.)"/>
<string name="unknown" value="(sconosciuto)"/>
- <string name="public" value="(publico)"/>
+ <string name="public" value="(pubblico)"/>
<string name="none_text" value="(nessuno)"/>
- <string name="sale_pending_text" value="(Vendita in attesa di)"/>
- <string name="group_owned_text" value="(Gruppo posseduto)"/>
+ <string name="sale_pending_text" value="(In corso di vendita)"/>
+ <string name="group_owned_text" value="(Di proprietà di un gruppo)"/>
<string name="price_text" value="L$"/>
<string name="area_text" value="m²"/>
- <string name="all_residents_text" value="Tutti i Residenti"/>
+ <string name="all_residents_text" value="Tutti i residenti"/>
<string name="group_text" value="Gruppo"/>
<string name="can_resell">
- La terra acquistata in questa regione può essere rivenduta.
+ Il terreno acquistato in questa regione può essere rivenduto.
</string>
<string name="can_not_resell">
- La terra acquistata in questa regione non può essere rivenduta.
+ Il terreno acquistato in questa regione non può essere rivenduto.
</string>
<string name="can_change">
- La terra acquistata in questa regione può essere unita o suddivisa.
+ Il terreno acquistato in questa regione può essere unito o suddiviso.
</string>
<string name="can_not_change">
- La terra acquistata in questa regione non può essere unita o suddivisa.
+ Il terreno acquistato in questa regione non può essere unito o suddiviso.
</string>
<string name="server_update_text">
- Informazioni su questo luogo non disponibili senza l&apos;aggiornamento del server.
+ Informazioni sul luogo non disponibili senza l&apos;aggiornamento del server.
</string>
<string name="server_error_text">
- Informazioni su questo luogo non sono disponibili ora, per favore riprova più tardi.
+ Informazioni su questo luogo non disponibili al momento, riprova più tardi.
</string>
<string name="server_forbidden_text">
- Informazioni su questo luogo non sono disponibili a cause delle restrizioni sull&apos;accesso. Per favore verifica i tuoi permessi con il proprietario del parcel.
+ Informazioni su questo luogo non disponibili a causa delle limitazioni di accesso. Controlla i tuoi permessi con il proprietario del terreno.
</string>
<string name="acquired_date">
[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
</string>
+ <button name="back_btn" tool_tip="Indietro"/>
<text name="title" value="Profilo del luogo"/>
<scroll_container name="place_scroll">
<panel name="scrolling_panel">
<text name="owner_label" value="Proprietario:"/>
<text name="maturity_value" value="sconosciuto"/>
<accordion name="advanced_info_accordion">
- <accordion_tab name="parcel_characteristics_tab" title="Parcel">
- <panel>
- <text name="rating_label" value="Valutazione:"/>
+ <accordion_tab name="parcel_characteristics_tab" title="Lotto">
+ <panel name="parcel_characteristics_panel">
+ <text name="rating_label" value="Categoria:"/>
<text name="rating_value" value="sconosciuto"/>
- <text name="voice_label" value="Voice:"/>
- <text name="voice_value" value="On"/>
+ <text name="voice_label" value="Voce:"/>
+ <text name="voice_value" value="Attivo"/>
<text name="fly_label" value="Vola:"/>
- <text name="fly_value" value="On"/>
+ <text name="fly_value" value="Attivo"/>
<text name="push_label" value="Spingi:"/>
- <text name="push_value" value="Off"/>
+ <text name="push_value" value="Disattivato"/>
<text name="build_label" value="Costruisci:"/>
- <text name="build_value" value="On"/>
- <text name="scripts_label" value="Scripts:"/>
- <text name="scripts_value" value="On"/>
- <text name="damage_label" value="Danno:"/>
- <text name="damage_value" value="Off"/>
- <button label="Info sul terreno" name="about_land_btn"/>
+ <text name="build_value" value="Attivo"/>
+ <text name="scripts_label" value="Script:"/>
+ <text name="scripts_value" value="Attivo"/>
+ <text name="damage_label" value="Danni:"/>
+ <text name="damage_value" value="Disattivato"/>
+ <button label="Informazioni sui terreni" name="about_land_btn"/>
</panel>
</accordion_tab>
<accordion_tab name="region_information_tab" title="Regione">
- <panel>
+ <panel name="region_information_panel">
<text name="region_name_label" value="Regione:"/>
- <text name="region_type_label" value="Scrivi:"/>
- <text name="region_rating_label" value="Valutazione:"/>
+ <text name="region_name" value="Mooseland"/>
+ <text name="region_type_label" value="Tipo:"/>
+ <text name="region_type" value="Moose"/>
+ <text name="region_rating_label" value="Categoria:"/>
+ <text name="region_rating" value="Adulti"/>
<text name="region_owner_label" value="Proprietario:"/>
+ <text name="region_owner" value="moose Van Moose"/>
<text name="region_group_label" value="Gruppo:"/>
- <button label="Regione/Proprietà immobiliare" name="region_info_btn"/>
+ <text name="region_group">
+ The Mighty Moose of mooseville soundvillemoose
+ </text>
+ <button label="Regione/proprietà immobiliare" name="region_info_btn"/>
</panel>
</accordion_tab>
<accordion_tab name="estate_information_tab" title="Proprietà immobiliare">
- <panel>
+ <panel name="estate_information_panel">
<text name="estate_name_label" value="Proprietà immobiliare:"/>
- <text name="estate_rating_label" value="Valutazione:"/>
- <text name="estate_owner_label" value="Proprietà:"/>
+ <text name="estate_rating_label" value="Categoria:"/>
+ <text name="estate_owner_label" value="Proprietario:"/>
<text name="covenant_label" value="Regolamento:"/>
</panel>
</accordion_tab>
<accordion_tab name="sales_tab" title="In vendita">
- <panel>
+ <panel name="sales_panel">
<text name="sales_price_label" value="Prezzo:"/>
- <text name="area_label" value="Area:"/>
+ <text name="area_label" value="Zona:"/>
<text name="traffic_label" value="Traffico:"/>
<text name="primitives_label" value="Primitive:"/>
- <text name="parcel_scripts_label" value="Scripts:"/>
- <text name="terraform_limits_label" value="Limiti per Terraform:"/>
+ <text name="parcel_scripts_label" value="Script:"/>
+ <text name="terraform_limits_label" value="Limiti terraform:"/>
<text name="subdivide_label" value="Suddividi/Unisci abilità:"/>
- <text name="resale_label" value="Rivendi abilità:"/>
+ <text name="resale_label" value="Abilità rivendita:"/>
<text name="sale_to_label" value="In vendita a:"/>
</panel>
</accordion_tab>
diff --git a/indra/newview/skins/default/xui/it/panel_places.xml b/indra/newview/skins/default/xui/it/panel_places.xml
index 8e50a8b9d9..9a052068f7 100644
--- a/indra/newview/skins/default/xui/it/panel_places.xml
+++ b/indra/newview/skins/default/xui/it/panel_places.xml
@@ -1,14 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Luoghi" name="places panel">
- <string name="landmarks_tab_title" value="MIEI LANDMARKS"/>
- <string name="teleport_history_tab_title" value="TELEPORT PRECEDENTI"/>
- <filter_editor label="Filtro Luoghi" name="Filter"/>
+ <string name="landmarks_tab_title" value="I MIEI PUNTI DI RIFERIMENTO"/>
+ <string name="teleport_history_tab_title" value="CRONOLOGIA TELEPORT"/>
+ <filter_editor label="Filtra i miei luoghi" name="Filter"/>
<panel name="button_panel">
- <button label="Teleport" name="teleport_btn"/>
- <button label="Mappa" name="map_btn"/>
- <button label="Modifica" name="edit_btn"/>
- <button label="Chiudi" name="close_btn"/>
- <button label="Cancella" name="cancel_btn"/>
+ <button label="Teleport" name="teleport_btn" tool_tip="Teleport alla zona selezionata"/>
+ <button label="Mappa" name="map_btn" tool_tip="Mostra la zona corrispondente nella mappa del Mondo"/>
+ <button label="Modifica" name="edit_btn" tool_tip="Modifica le informazioni del punto di riferimento"/>
+ <button label="â–¼" name="overflow_btn" tool_tip="Mostra opzioni addizionali"/>
<button label="Salva" name="save_btn"/>
+ <button label="Annulla" name="cancel_btn"/>
+ <button label="Chiudi" name="close_btn"/>
+ <button label="Profilo" name="profile_btn" tool_tip="Mostra il profilo del luogo"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml
index 13ffabbebf..842daaa331 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_advanced.xml
@@ -1,48 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
-<panel name="advanced">
- <panel.string name="resolution_format">
- [RES_X] x [RES_Y]
- </panel.string>
+<panel label="Avanzata" name="advanced">
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
- <check_box label="Chat a Bolle" name="bubble_text_chat"/>
- <color_swatch name="background" tool_tip="Scegli il colore delle vignette della Chat"/>
- <slider label="Opacità" name="bubble_chat_opacity"/>
- <text name="AspectRatioLabel1" tool_tip="larghezza/altezza">
- Rapporto di visualizzazione
- </text>
- <combo_box name="aspect_ratio" tool_tip="larghezza/altezza">
- <combo_box.item label="4:3 (Monitor Standard)" name="item1"/>
- <combo_box.item label="5:4 (1280x1024 LCD)" name="item2"/>
- <combo_box.item label="8:5 (Widescreen)" name="item3"/>
- <combo_box.item label="16:9 (Widescreen)" name="item4"/>
- </combo_box>
- <check_box label="Rilevamento automatico" name="aspect_auto_detect"/>
- <text name="heading1">
- Camera:
- </text>
- <slider label="Angolazione della visuale" name="camera_fov"/>
+ <panel.string name="middle_mouse">
+ Pulsante centrale del mouse
+ </panel.string>
+ <slider label="Angolo di visuale" name="camera_fov"/>
<slider label="Distanza" name="camera_offset_scale"/>
<text name="heading2">
- Posizionamento Automatico per:
+ Posizione automatica per:
</text>
- <check_box label="Costruire/Modificare" name="edit_camera_movement" tool_tip="Utilizza il posizionamento automatico della camera entrando e uscendo dalla modalità modifica"/>
- <check_box label="Aspetto Fisico" name="appearance_camera_movement" tool_tip="Utilizza il posizionamento automatico della camera in modalità modifica"/>
- <text name="heading3">
- Avatar:
+ <check_box label="Costruire/Modificare" name="edit_camera_movement" tool_tip="Utilizza il posizionamento automatico della fotocamera entrando o uscendo dalla modalità modifica"/>
+ <check_box label="Aspetto fisico" name="appearance_camera_movement" tool_tip="Utilizza il posizionamento automatico della camera in modalità modifica"/>
+ <check_box initial_value="vero" label="Barra laterale" name="appearance_sidebar_positioning" tool_tip="Utilizza il posizionamento automatico della fotocamera per la barra laterale"/>
+ <check_box label="Visualizzami in modalità soggettiva" name="first_person_avatar_visible"/>
+ <check_box label="Le frecce di direzione mi fanno sempre spostare" name="arrow_keys_move_avatar_check"/>
+ <check_box label="Doppio click e tieni premuto per correre" name="tap_tap_hold_to_run"/>
+ <check_box label="Movimento delle labbra dell&apos;avatar quando parla" name="enable_lip_sync"/>
+ <check_box label="Chat a bolla" name="bubble_text_chat"/>
+ <slider label="Opacità" name="bubble_chat_opacity"/>
+ <color_swatch name="background" tool_tip="Scegli il colore delle vignette della chat"/>
+ <text name="UI Size:">
+ Dimensioni interfaccia utente
</text>
- <check_box label="Mostra in modalità Mouselook" name="first_person_avatar_visible"/>
- <check_box label="Cammino sempre con le frecce di movimento" name="arrow_keys_move_avatar_check"/>
- <check_box label="Doppio Click-Tieni Premuto per correre" name="tap_tap_hold_to_run"/>
- <check_box label="Consente il movimento delle labbra dell&apos;Avatar quando parla" name="enable_lip_sync"/>
- <check_box label="Mostra errori degli script" name="show_script_errors"/>
+ <check_box label="Mostra errori dello script in:" name="show_script_errors"/>
<radio_group name="show_location">
- <radio_item label="In chat" name="0"/>
- <radio_item label="In una finestra" name="1"/>
+ <radio_item label="Chat nei dintorni" name="0"/>
+ <radio_item label="Finestra separata" name="1"/>
</radio_group>
- <check_box label="Modalità del microfono &quot;interruttore ON/OFF&quot; quando premo l&apos;interruttore PARLA:" name="push_to_talk_toggle_check" tool_tip="In modalità &quot;interruttore ON/OFF&quot; premi il tasto per attivare o disattivare il microfono. Quando non usi questa modalità, il microfono è attivo solo se tieni premuto il tasto."/>
- <line_editor label="Premi il pulsante per parlare" name="modifier_combo"/>
- <button label="Imposta" name="set_voice_hotkey_button"/>
- <button label="Pulsante centrale del Mouse" name="set_voice_middlemouse_button"/>
+ <check_box label="Attiva/disattiva la funzione parla quando premo:" name="push_to_talk_toggle_check" tool_tip="In modalità &quot;interruttore ON/OFF&quot; premi il tasto una volta per attivare o disattivare il microfono. Quando non usi questa modalità, il microfono è attivo solo se tieni premuto il tasto di comando."/>
+ <line_editor label="Pulsante di comando della funzione Premi per parlare" name="modifier_combo"/>
+ <button label="Imposta tasto" name="set_voice_hotkey_button"/>
+ <button label="Pulsante centrale del mouse" name="set_voice_middlemouse_button" tool_tip="Reimposta sul pulsante centrale del mouse"/>
+ <button label="Altri dispositivi" name="joystick_setup_button"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/it/panel_preferences_alerts.xml
index 02da9de4a4..fd1fd57761 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_alerts.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_alerts.xml
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Pop-up" name="popups" title="Pop-up">
<text name="tell_me_label">
- Dimmi:
+ Avvisami:
</text>
<check_box label="Quando spendo o ottengo L$" name="notify_money_change_checkbox"/>
- <check_box label="Quando i miei amici entrano o escono da SL" name="friends_online_notify_checkbox"/>
+ <check_box label="Quando i miei amici entrano o escono da Second Life" name="friends_online_notify_checkbox"/>
<text name="show_label">
- Mostra sempre questi allarmi:
+ Mostra sempre:
</text>
<text name="dont_show_label">
- Non mostrare mai questi allarmi:
+ Non mostrare mai:
</text>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml
index 9c064c2716..fb8ddf607d 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml
@@ -1,10 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Text Chat" name="chat">
+ <text name="font_size">
+ Dimensioni caratteri:
+ </text>
<radio_group name="chat_font_size">
- <radio_item label="Piccolo" name="radio"/>
- <radio_item label="Medio" name="radio2"/>
- <radio_item label="Grande" name="radio3"/>
+ <radio_item label="Piccola" name="radio" value="0"/>
+ <radio_item label="Media" name="radio2" value="1"/>
+ <radio_item label="Grande" name="radio3" value="2"/>
</radio_group>
+ <text name="font_colors">
+ Colori caratteri:
+ </text>
<color_swatch label="Tuo" name="user"/>
<text name="text_box1">
Io
@@ -38,9 +44,16 @@
URLs
</text>
<check_box initial_value="true" label="Simula la battitura tasti quando scrivi" name="play_typing_animation"/>
- <check_box label="Spediscimi nella email gli IM quando sono OFF-LINE" name="send_im_to_email"/>
- <radio_group name="chat_window" tool_tip="Mostra i tuoi Instant Messages in finestre separate, o in una finestra con diverse tabelle (Requires restart)">
- <radio_item label="Finestre multiple" name="radio"/>
- <radio_item label="Una finestra" name="radio2"/>
+ <check_box label="Quando sono OFF-LINE, spediscimi gli IM in una e-mail" name="send_im_to_email"/>
+ <check_box label="Attiva IM in testo semplice e cronologia chat" name="plain_text_chat_history"/>
+ <text name="show_ims_in_label">
+ Mostra gli IM in:
+ </text>
+ <text name="requires_restart_label">
+ (richiede il riavvio)
+ </text>
+ <radio_group name="chat_window" tool_tip="Mostra i tuoi messaggi istantanei in diverse finestre, o in una finestra con più schede (richiede il riavvio)">
+ <radio_item label="Finestre separate" name="radio" value="0"/>
+ <radio_item label="Schede" name="radio2" value="1"/>
</radio_group>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_general.xml b/indra/newview/skins/default/xui/it/panel_preferences_general.xml
index 80b152752b..e8c826609c 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_general.xml
@@ -4,7 +4,7 @@
Lingua:
</text>
<combo_box name="language_combobox">
- <combo_box.item label="System default" name="System Default Language"/>
+ <combo_box.item label="Default di sistema" name="System Default Language"/>
<combo_box.item label="English" name="English"/>
<combo_box.item label="Dansk (Danese) - Beta" name="Danish"/>
<combo_box.item label="Deutsch (Tedesco) - Beta" name="Deutsch(German)"/>
@@ -17,47 +17,50 @@
<combo_box.item label="日本語 (Giapponese) - Beta" name="(Japanese)"/>
</combo_box>
<text name="language_textbox2">
- (Richiede restart)
+ (Richiede il riavvio)
</text>
<text name="maturity_desired_prompt">
- Voglio accedere al contenuto di tipo:
+ Voglio accedere ai contenuti di tipo:
</text>
<text name="maturity_desired_textbox"/>
<combo_box name="maturity_desired_combobox">
- <combo_box.item label="PG, Mature e Adult" name="Desired_Adult"/>
- <combo_box.item label="PG e Mature" name="Desired_Mature"/>
- <combo_box.item label="PG" name="Desired_PG"/>
+ <combo_box.item label="Generale, Moderato e Adulti" name="Desired_Adult"/>
+ <combo_box.item label="Generale e Moderato" name="Desired_Mature"/>
+ <combo_box.item label="Generale" name="Desired_PG"/>
</combo_box>
<text name="start_location_textbox">
- Luogo d&apos;inizio:
+ Luogo di partenza:
</text>
<combo_box name="start_location_combo">
- <combo_box.item label="Ultimo posto visitato" name="MyLastLocation" tool_tip="Vai nell&apos;ultimo posto visitato di default quando fai login."/>
- <combo_box.item label="Casa mia" name="MyHome" tool_tip="Vai a casa di default quando fai login"/>
+ <combo_box.item label="Ultimo luogo visitato" name="MyLastLocation" tool_tip="Vai automaticamente all&apos;ultimo luogo visitato quando effettui l'accesso."/>
+ <combo_box.item label="Casa mia" name="MyHome" tool_tip="Vai automaticamente a casa quando effettui l'accesso"/>
</combo_box>
- <check_box initial_value="true" label="Mostra su login" name="show_location_checkbox"/>
+ <check_box initial_value="true" label="Mostra con il login" name="show_location_checkbox"/>
<text name="name_tags_textbox">
- Nome sulle tags:
+ Nome:
</text>
<radio_group name="Name_Tag_Preference">
- <radio_item label="Off" name="radio"/>
- <radio_item label="On" name="radio2"/>
- <radio_item label="Mostra brevemente" name="radio3"/>
+ <radio_item label="Off" name="radio" value="0"/>
+ <radio_item label="On" name="radio2" value="1"/>
+ <radio_item label="Mostra brevemente" name="radio3" value="2"/>
</radio_group>
<check_box label="Mostra il mio nome" name="show_my_name_checkbox1"/>
- <check_box initial_value="true" label="Nome piccolo sulle tags" name="small_avatar_names_checkbox"/>
+ <check_box initial_value="true" label="Nome in piccolo" name="small_avatar_names_checkbox"/>
<check_box label="Mostra titoli del gruppo" name="show_all_title_checkbox1"/>
<text name="effects_color_textbox">
- Miei effetti:
+ I miei effetti:
</text>
- <color_swatch label="" name="effect_color_swatch" tool_tip="Clicca per aprire la tavolozza dei colori"/>
<text name="title_afk_text">
- Pausa di Away:
- </text>
- <spinner label="Assente dopo:" name="afk_timeout_spinner"/>
- <text name="seconds_textbox">
- secondi
+ Pausa assenza:
</text>
+ <color_swatch label="" name="effect_color_swatch" tool_tip="Clicca per aprire la tavolozza dei colori"/>
+ <combo_box label="Pausa assenza:" name="afk">
+ <combo_box.item label="2 minuti" name="item0"/>
+ <combo_box.item label="5 minuti" name="item1"/>
+ <combo_box.item label="10 minuti" name="item2"/>
+ <combo_box.item label="30 minuti" name="item3"/>
+ <combo_box.item label="mai" name="item4"/>
+ </combo_box>
<text name="text_box3">
Risposta in modalità occupato:
</text>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml
index 647df27633..37857473aa 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_graphics1.xml
@@ -1,8 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Grafica" name="Display panel">
- <text name="UI Size:">
- misura UI:
- </text>
<text name="QualitySpeed">
Qualità e velocità:
</text>
@@ -47,12 +44,16 @@
<check_box initial_value="true" label="Avatar bidimensionali (Impostor)" name="AvatarImpostors"/>
<check_box initial_value="true" label="Hardware Skinning" name="AvatarVertexProgram"/>
<check_box initial_value="true" label="Abiti dell&apos;avatar" name="AvatarCloth"/>
- <slider label="Distanza di disegno:" label_width="158" name="DrawDistance" width="255"/>
+ <slider label="Distanza di disegno:" name="DrawDistance"/>
<text name="DrawDistanceMeterText2">
m
</text>
- <slider label="Conteggio massimo particelle:" label_width="158" name="MaxParticleCount" width="262"/>
- <slider label="Qualità in post-produzione:" label_width="158" name="RenderPostProcess" width="223"/>
+ <slider label="Conteggio massimo particelle:" name="MaxParticleCount"/>
+ <slider label="Distanza visual. max avatar:" name="MaxAvatarDrawDistance"/>
+ <text name="DrawDistanceMeterText3">
+ m
+ </text>
+ <slider label="Qualità in post-produzione:" name="RenderPostProcess"/>
<text name="MeshDetailText">
Dettagli reticolo:
</text>
@@ -87,8 +88,8 @@
Dettagli illuminazione:
</text>
<radio_group name="LightingDetailRadio">
- <radio_item label="Solo il sole e la luna" name="SunMoon"/>
- <radio_item label="Luci locali" name="LocalLights"/>
+ <radio_item label="Solo il sole e la luna" name="SunMoon" value="0"/>
+ <radio_item label="Luci locali" name="LocalLights" value="1"/>
</radio_group>
<text name="TerrainDetailText">
Dettagli terreno:
@@ -99,7 +100,7 @@
</radio_group>
</panel>
<button label="Applica" label_selected="Applica" name="Apply"/>
- <button label="Resetta" left="110" name="Defaults" width="190"/>
- <button label="Avanzato" name="Advanced"/>
+ <button label="Reimposta" name="Defaults"/>
+ <button label="Avanzate" name="Advanced"/>
<button label="Hardware" label_selected="Hardware" name="GraphicsHardwareButton"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml
index c84edbb47e..1002195baf 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_privacy.xml
@@ -1,27 +1,27 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Comunicazione" name="im">
<panel.string name="log_in_to_change">
- log in per cambiare
+ accedi per cambiare
</panel.string>
- <button label="Pulisci la cronologia" name="clear_cache"/>
+ <button label="Pulisci la cronologia" name="clear_cache" tool_tip="Elimina immagine login, ultimo luogo, cronologia teleport, web e texture cache"/>
<text name="cache_size_label_l">
- (Luoghi, immagini, web, cronologia del search)
+ (Luoghi, immagini, web, cronologia ricerche)
</text>
<check_box label="Solo amici e gruppi mi vedono online" name="online_visibility"/>
<check_box label="Solo amici e gruppi possono chiamarmi o mandarmi IM" name="voice_call_friends_only_check"/>
- <check_box label="Spegnere il microfono quando chiudi le chiamate" name="auto_disengage_mic_check"/>
- <check_box label="Accetta cookies" name="cookies_enabled"/>
- <check_box label="Permettere Media Autoplay" name="autoplay_enabled"/>
+ <check_box label="Spegnere il microfono alla chiusura delle chiamate" name="auto_disengage_mic_check"/>
+ <check_box label="Accetta cookie" name="cookies_enabled"/>
+ <check_box label="Consenti riproduzione multimediale automatica" name="autoplay_enabled"/>
<text name="Logs:">
- Logs:
+ Registri:
</text>
- <check_box label="Salvare le ultime chat logs nel mio computer" name="log_nearby_chat"/>
- <check_box label="Salvare gli IM logs nel mio computer" name="log_instant_messages"/>
- <check_box label="Aggiungere orario" name="show_timestamps_check_im"/>
+ <check_box label="Salva i registri delle conversazioni sul mio computer" name="log_nearby_chat"/>
+ <check_box label="Salva i registri degli IM nel mio computer" name="log_instant_messages"/>
+ <check_box label="Riporta data e ora" name="show_timestamps_check_im"/>
<line_editor left="288" name="log_path_string" right="-20"/>
<text name="log_path_desc">
- Luoghi delle logs
+ Ubicazione dei registri
</text>
- <button label="Browse" label_selected="Browse" name="log_path_button" width="130"/>
- <button label="Bloccare lista" name="block_list"/>
+ <button label="Sfoglia" label_selected="Sfoglia" name="log_path_button" width="130"/>
+ <button label="Lista dei bloccati" name="block_list"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_setup.xml b/indra/newview/skins/default/xui/it/panel_preferences_setup.xml
index 17257a7cb8..29618485c2 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_setup.xml
@@ -1,46 +1,49 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Input &amp; Camera" name="Input panel">
- <button bottom_delta="-40" label="Altri Dispositivi" name="joystick_setup_button" width="165"/>
+<panel label="Impostazione" name="Input panel">
+ <button bottom_delta="-40" label="Altri dispositivi" name="joystick_setup_button" width="165"/>
<text name="Mouselook:">
- Mouselook:
+ Soggettiva:
</text>
<text name=" Mouse Sensitivity">
- Sensibilità del Mouse
+ Sensibilità mouse
</text>
<check_box label="Inverti" name="invert_mouse"/>
<text name="Network:">
- Network:
+ Rete:
</text>
<text name="Maximum bandwidth">
- Banda Massima
+ Capacità massima di banda
</text>
<text name="text_box2">
kbps
</text>
- <check_box label="Custom port" name="connection_port_enabled"/>
- <spinner label="Port number:" name="web_proxy_port"/>
+ <check_box label="Porta personalizzata" name="connection_port_enabled"/>
+ <spinner label="Numero porta:" name="connection_port"/>
<text name="cache_size_label_l">
- Cache size
+ Dimensioni cache
</text>
<text name="text_box5">
MB
</text>
- <button label="Browse" label_selected="Browse" name="set_cache"/>
- <button label="Resetta" label_selected="Imposta" name="reset_cache"/>
<text name="Cache location">
- Cache location
+ Ubicazione della cache:
</text>
+ <button label="Sfoglia" label_selected="Sfoglia" name="set_cache"/>
+ <button label="Reimposta" label_selected="Reimposta" name="reset_cache"/>
<text name="Web:">
Web:
</text>
<radio_group name="use_external_browser">
- <radio_item label="Usa il built-in browser" name="internal" tool_tip="Usa il built-in web browser per aiuto, web links, etc. Questo browser apre come una nuova finestra all&apos;interno [APP_NAME]."/>
- <radio_item label="Usa il mio browser (IE, Firefox)" name="external" tool_tip="Usa il default system web browser per aiuto, web links, etc. Non raccomandato se utilizzi lo schermo pieno(full screen)."/>
+ <radio_item label="Usa il mio browser (IE, Firefox, Safari)" name="external" tool_tip="Utilizza il browser Web predefinito di sistema per l&apos;aiuto, per i link Web e così via. Sconsigliato durante l&apos;esecuzione a tutto schermo." value="1"/>
+ <radio_item label="Utilizza il browser Web integrato" name="internal" tool_tip="Utilizza il browser Web integrato per l&apos;aiuto, per i link Web e così via. Questo browser si apre in una nuova finestra in [APP_NAME]." value=""/>
</radio_group>
- <check_box initial_value="false" label="Web proxy" name="web_proxy_enabled"/>
- <line_editor name="web_proxy_editor" tool_tip="Nome o indirizzo IP del proxy che vorresti usare"/>
- <button label="Browse" label_selected="Browse" name="set_proxy"/>
+ <check_box label="Abilita plugin" name="browser_plugins_enabled"/>
+ <check_box label="Accetta cookie" name="cookies_enabled"/>
+ <check_box label="Abilita Javascript" name="browser_javascript_enabled"/>
+ <check_box label="Abilita proxy Web" name="web_proxy_enabled"/>
<text name="Proxy location">
- Proxy location
+ Ubicazione proxy:
</text>
+ <line_editor name="web_proxy_editor" tool_tip="Il nome o l&apos;indirizzo IP del proxy che preferisci usare"/>
+ <spinner label="Numero porta:" name="web_proxy_port"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_sound.xml b/indra/newview/skins/default/xui/it/panel_preferences_sound.xml
index c4d46291dd..9f8a13fedc 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_sound.xml
@@ -1,20 +1,27 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Suoni" name="Preference Media panel">
- <slider label="Principale" name="System Volume"/>
- <check_box initial_value="true" label="Spegni suono se minimizzato" name="mute_when_minimized"/>
- <slider label="Ambiente" name="Wind Volume"/>
+ <slider label="Vol. principale" name="System Volume"/>
+ <check_box initial_value="true" label="Disatt. se a icona" name="mute_when_minimized"/>
<slider label="Pulsanti" name="UI Volume"/>
- <slider label="MultiMedia" name="Media Volume"/>
- <slider label="Effetto Suoni" name="SFX Volume"/>
- <slider label="Musica" name="Music Volume"/>
- <check_box label="Voce" name="enable_voice_check"/>
- <slider label="Voice" name="Voice Volume"/>
+ <slider label="Ambiente" name="Wind Volume"/>
+ <slider label="Effetti sonori" name="SFX Volume"/>
+ <slider label="Musica in streaming" name="Music Volume"/>
+ <check_box label="Abilitato" name="music_enabled"/>
+ <slider label="Multimediale" name="Media Volume"/>
+ <check_box label="Abilitato" name="enable_media"/>
+ <slider label="Chat vocale" name="Voice Volume"/>
+ <check_box label="Abilitato" name="enable_voice_check"/>
+ <check_box label="Consenti riproduzione multimediale automatica" name="media_auto_play_btn" tool_tip="Seleziona qui per consentire la riproduzione multimediale automatica"/>
+ <check_box label="Riproduci media in uso da altri avatar" name="media_show_on_others_btn" tool_tip="Deseleziona qui per nascondere i media in uso dagli altri avatar nei dintorni"/>
+ <text name="voice_chat_settings">
+ Impostazioni Chat vocale
+ </text>
<text name="Listen from">
Ascolta da:
</text>
<radio_group name="ear_location">
- <radio_item label="Posizione della Camera" name="0"/>
- <radio_item label="Posizione dell&apos;Avatar" name="1"/>
+ <radio_item label="Posizione della fotocamera" name="0"/>
+ <radio_item label="Posizione dell&apos;avatar" name="1"/>
</radio_group>
<button label="Dispositivi di Input/Output" name="device_settings_btn" width="165"/>
<panel label="Impostazioni del dispositivo" name="device_settings_panel">
@@ -25,7 +32,7 @@
Input
</text>
<text name="My volume label">
- Mio volume:
+ Il mio volume:
</text>
<slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Cambia il volume utilizzando questa barra"/>
<text name="wait_text">
diff --git a/indra/newview/skins/default/xui/it/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/it/panel_prim_media_controls.xml
index dc7d59084e..ef7aaf2e8c 100644
--- a/indra/newview/skins/default/xui/it/panel_prim_media_controls.xml
+++ b/indra/newview/skins/default/xui/it/panel_prim_media_controls.xml
@@ -1,28 +1,79 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="MediaControls">
+ <string name="min_width">
+ 300
+ </string>
+ <string name="min_height">
+ 75
+ </string>
+ <string name="zoom_medium_padding">
+ 1.1
+ </string>
+ <string name="top_world_view_avoid_zone">
+ 50
+ </string>
+ <layout_stack name="progress_indicator_area">
+ <panel name="media_progress_indicator">
+ <progress_bar name="media_progress_bar" tool_tip="L&apos;elemento multimediale è in caricamento"/>
+ </panel>
+ </layout_stack>
<layout_stack name="media_controls">
+ <layout_panel name="back">
+ <button name="back_btn" tool_tip="Naviga indietro"/>
+ </layout_panel>
+ <layout_panel name="fwd">
+ <button name="fwd_btn" tool_tip="Naviga avanti"/>
+ </layout_panel>
+ <layout_panel name="home">
+ <button name="home_btn" tool_tip="Home page"/>
+ </layout_panel>
+ <layout_panel name="media_stop">
+ <button name="media_stop_btn" tool_tip="Interrompi supporto"/>
+ </layout_panel>
+ <layout_panel name="reload">
+ <button name="reload_btn" tool_tip="Ricarica"/>
+ </layout_panel>
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="Interrompi caricamento"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="Riproduci media"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="Pausa supporto"/>
+ </layout_panel>
<layout_panel name="media_address">
- <line_editor name="media_address_url" tool_tip="Media URL"/>
+ <line_editor name="media_address_url" tool_tip="URL multimedia"/>
<layout_stack name="media_address_url_icons">
<layout_panel>
- <icon name="media_whitelist_flag" tool_tip="Lista Bianca attivata"/>
+ <icon name="media_whitelist_flag" tool_tip="Lista bianca attivata"/>
</layout_panel>
<layout_panel>
- <icon name="media_secure_lock_flag" tool_tip="Secured Browsing"/>
+ <icon name="media_secure_lock_flag" tool_tip="Navigazione sicura"/>
</layout_panel>
</layout_stack>
</layout_panel>
<layout_panel name="media_play_position">
- <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="Avanzamento riproduzione Movie"/>
+ <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="Avanzamento riproduzione filmato"/>
+ </layout_panel>
+ <layout_panel name="skip_back">
+ <button name="skip_back_btn" tool_tip="Passo indietro"/>
+ </layout_panel>
+ <layout_panel name="skip_forward">
+ <button name="skip_forward_btn" tool_tip="Passo avanti"/>
</layout_panel>
<layout_panel name="media_volume">
- <button name="media_mute_button" tool_tip="Silenzia questo Media ????"/>
- <slider name="volume_slider" tool_tip="Volume Media"/>
+ <button name="media_mute_button" tool_tip="Silenzia questo elemento multimediale"/>
+ <slider name="volume_slider" tool_tip="Volume multimedia"/>
+ </layout_panel>
+ <layout_panel name="zoom_frame">
+ <button name="zoom_frame_btn" tool_tip="Zoom nel media"/>
+ </layout_panel>
+ <layout_panel name="close">
+ <button name="close_btn" tool_tip="Zoom indietro"/>
+ </layout_panel>
+ <layout_panel name="new_window">
+ <button name="new_window_btn" tool_tip="Apri URL nel browser"/>
</layout_panel>
- </layout_stack>
- <layout_stack>
- <panel name="media_progress_indicator">
- <progress_bar name="media_progress_bar" tool_tip="Media stà caricando"/>
- </panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_profile.xml b/indra/newview/skins/default/xui/it/panel_profile.xml
index 837aa4ac65..9927ecbb88 100644
--- a/indra/newview/skins/default/xui/it/panel_profile.xml
+++ b/indra/newview/skins/default/xui/it/panel_profile.xml
@@ -12,37 +12,41 @@
</string>
<string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=it-IT"/>
<string name="no_partner_text" value="Nessuno"/>
+ <string name="no_group_text" value="Nessuno"/>
<string name="RegisterDateFormat">
[REG_DATE] ([AGE])
</string>
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <panel name="second_life_image_panel">
- <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
- </panel>
- <panel name="first_life_image_panel">
- <text name="title_rw_descr_text" value="Mondo Reale:"/>
- </panel>
- <text name="me_homepage_text">
- Homepage:
- </text>
- <text name="title_member_text" value="Membro dal:"/>
- <text name="title_acc_status_text" value="Stato dell&apos;Account:"/>
- <text name="acc_status_text" value="Resident. No payment info on file."/>
- <text name="title_partner_text" value="Partner:"/>
- <text name="title_groups_text" value="Gruppi:"/>
- </panel>
- </scroll_container>
- <panel name="profile_buttons_panel">
- <button label="Aggiungi Amico" name="add_friend" tool_tip="Offri amicizia ad un residente"/>
- <button label="IM" name="im" tool_tip="Apri una sessione instant message"/>
- <button label="Chiama" name="call" tool_tip="Chiama questo residente"/>
- <button label="Mappa" name="show_on_map_btn" tool_tip="Mostra il residente sulla mappa"/>
- <button label="Teleport" name="teleport" tool_tip="Offri teleport"/>
- <button label="â–¼" name="overflow_btn" tool_tip="Paga o condividi l&apos;inventario con il residente"/>
- </panel>
- <panel name="profile_me_buttons_panel">
- <button label="Modifica Profilo" name="edit_profile_btn"/>
- <button label="Modifica Aspetto" name="edit_appearance_btn"/>
- </panel>
+ <layout_stack name="layout">
+ <layout_panel name="profile_stack">
+ <scroll_container name="profile_scroll">
+ <panel name="profile_scroll_panel">
+ <panel name="second_life_image_panel">
+ <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <text name="title_rw_descr_text" value="Mondo reale:"/>
+ </panel>
+ <text name="title_member_text" value="Residente dal:"/>
+ <text name="title_acc_status_text" value="Stato account:"/>
+ <text name="title_partner_text" value="Partner:"/>
+ <panel name="partner_data_panel">
+ <name_box initial_value="(recupero)" name="partner_text"/>
+ </panel>
+ <text name="title_groups_text" value="Gruppi:"/>
+ </panel>
+ </scroll_container>
+ </layout_panel>
+ <layout_panel name="profile_buttons_panel">
+ <button label="Aggiungi amico" name="add_friend" tool_tip="Offri amicizia a questo residente"/>
+ <button label="IM" name="im" tool_tip="Apri una sessione messaggio istantaneo"/>
+ <button label="Chiama" name="call" tool_tip="Chiama questo residente"/>
+ <button label="Mappa" name="show_on_map_btn" tool_tip="Mostra il residente sulla mappa"/>
+ <button label="Teleport" name="teleport" tool_tip="Offri teleport"/>
+ <button label="â–¼" name="overflow_btn" tool_tip="Paga del denaro o condividi qualcosa dall&apos;inventario con il residente"/>
+ </layout_panel>
+ <layout_panel name="profile_me_buttons_panel">
+ <button label="Modifica profilo" name="edit_profile_btn" tool_tip="Modifica le tue informazioni personali"/>
+ <button label="Modifica aspetto fisico" name="edit_appearance_btn" tool_tip="Crea/modifica il tuo aspetto: parti del corpo, abiti ecc."/>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_profile_view.xml b/indra/newview/skins/default/xui/it/panel_profile_view.xml
index bf89a3e6f6..20c62d4ceb 100644
--- a/indra/newview/skins/default/xui/it/panel_profile_view.xml
+++ b/indra/newview/skins/default/xui/it/panel_profile_view.xml
@@ -6,11 +6,11 @@
<string name="status_offline">
Offline
</string>
- <text_editor name="user_name" value="(Caricando...)"/>
+ <text_editor name="user_name" value="(Caricamento in corso...)"/>
<text name="status" value="Online"/>
<tab_container name="tabs">
<panel label="PROFILO" name="panel_profile"/>
- <panel label="PREFERITI" name="panel_picks"/>
- <panel label="NOTE &amp; PRIVACY" name="panel_notes"/>
+ <panel label="LUOGHI CONSIGLIATI" name="panel_picks"/>
+ <panel label="NOTE E PRIVACY" name="panel_notes"/>
</tab_container>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_region_covenant.xml b/indra/newview/skins/default/xui/it/panel_region_covenant.xml
index f35b451ac1..0d3117ca7a 100644
--- a/indra/newview/skins/default/xui/it/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/it/panel_region_covenant.xml
@@ -31,7 +31,7 @@
della proprietà.
</text>
<text bottom_delta="-36" name="covenant_instructions">
- Trascina ed inserisci una notecard per cambiare i Covenant di questa proprietà immobiliare.
+ Trascina e incolla un biglietto per cambiare il Regolamento di questa proprietà.
</text>
<text name="region_section_lbl">
Regione
diff --git a/indra/newview/skins/default/xui/it/panel_region_debug.xml b/indra/newview/skins/default/xui/it/panel_region_debug.xml
index 9e81d42410..45b3a016f4 100644
--- a/indra/newview/skins/default/xui/it/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/it/panel_region_debug.xml
@@ -26,9 +26,9 @@
<text name="options_text_lbl">
Opzioni:
</text>
- <check_box label="Con scripts" name="return_scripts" tool_tip="Ritorna solo gli oggetti che hanno scripts"/>
- <check_box label="Sulla terra di qualcun&apos;altro" name="return_other_land" tool_tip="Restituisci solo gli oggetti che sono in terreni appartenenti a qualcun altro"/>
- <check_box label="In ogni regione di questa proprietà" name="return_estate_wide" tool_tip="Restituisci tutti gli oggetti nelle varie regioni che costituiscono l&apos;insieme dei possedimenti terrieri"/>
+ <check_box label="Con script" name="return_scripts" tool_tip="Restituisci solo oggetti che hanno script"/>
+ <check_box label="Sul terreno di un altro residente" name="return_other_land" tool_tip="Restituisci solo gli oggetti che sono in terreni appartenenti a qualcun altro"/>
+ <check_box label="In tutte le regioni di questa proprietà" name="return_estate_wide" tool_tip="Restituisci tutti gli oggetti nelle varie regioni che costituiscono l&apos;insieme dei possedimenti terrieri"/>
<button label="Restituisci" name="return_btn"/>
<button label="Visualizza l&apos;elenco dei maggiori collidenti..." name="top_colliders_btn" tool_tip="Elenco degli oggetti che stanno potenzialmente subendo le maggiori collisioni" width="280"/>
<button label="?" left="297" name="top_colliders_help"/>
diff --git a/indra/newview/skins/default/xui/it/panel_region_estate.xml b/indra/newview/skins/default/xui/it/panel_region_estate.xml
index b6dc60a9c2..61e3f31024 100644
--- a/indra/newview/skins/default/xui/it/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/it/panel_region_estate.xml
@@ -1,10 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Proprietà immobiliari" name="Estate">
<text name="estate_help_text">
- I cambiamenti alle impostazioni in questa finestra
-avranno effetto su tutte le regioni della proprietà.
+ Le modifiche apportate in questa scheda saranno valide per tutte le regioni in questa proprietà.
</text>
- <text name="estate_text" width="140">
+ <text name="estate_text">
Proprietà immobiliari:
</text>
<text name="estate_name">
@@ -24,10 +23,10 @@ avranno effetto su tutte le regioni della proprietà.
<check_box label="Permetti accesso pubblico" name="externally_visible_check"/>
<button label="?" name="externally_visible_help"/>
<text name="Only Allow">
- Accesso ristretto ai Residenti verificati con:
+ Limita l&apos;accesso agli account verificati con:
</text>
- <check_box label="Informazioni di pagamento on File" name="limit_payment" tool_tip="Espelli residenti non identificati"/>
- <check_box label="Verifica dell&apos;età" name="limit_age_verified" tool_tip="Espelli i residenti che non hanno verificato l&apos;età. Vedi [SUPPORT_SITE] per maggiori informazioni."/>
+ <check_box label="Informazioni di pagamento in archivio" name="limit_payment" tool_tip="Espelli i residenti non identificati"/>
+ <check_box label="Verifica età" name="limit_age_verified" tool_tip="Espelli i residenti che non hanno la loro età verificata. Vedi [SUPPORT_SITE] per maggiori informazioni."/>
<check_box label="Permetti la chat voice" name="voice_chat_check"/>
<button label="?" name="voice_chat_help"/>
<check_box label="Permetti teleport diretto" name="allow_direct_teleport"/>
@@ -40,7 +39,7 @@ avranno effetto su tutte le regioni della proprietà.
</string>
<button label="?" name="abuse_email_address_help"/>
<button label="Applica" name="apply_btn"/>
- <button font="SansSerifSmall" label="Espelli persona dalle proprietà..." name="kick_user_from_estate_btn"/>
+ <button font="SansSerifSmall" label="Espelli residente dalla proprietà..." name="kick_user_from_estate_btn"/>
<button font="SansSerifSmall" label="Manda un messaggio di le proprietà..." name="message_estate_btn"/>
<text name="estate_manager_label">
Manager delle proprietà:
diff --git a/indra/newview/skins/default/xui/it/panel_region_general.xml b/indra/newview/skins/default/xui/it/panel_region_general.xml
index 8c31172ab5..6ca5dd878e 100644
--- a/indra/newview/skins/default/xui/it/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/it/panel_region_general.xml
@@ -3,51 +3,41 @@
<text name="region_text_lbl">
Regione:
</text>
- <text name="region_text" left="70">
+ <text left="70" name="region_text">
sconosciuta
</text>
<text name="version_channel_text_lbl">
Versione:
</text>
- <text name="version_channel_text" left="70">
+ <text left="70" name="version_channel_text">
sconosciuta
</text>
<text name="region_type_lbl">
Tipo:
</text>
- <text name="region_type" left="70">
+ <text left="70" name="region_type">
sconosciuto
</text>
<check_box label="Proibisci la modifica del terreno" name="block_terraform_check"/>
- <button label="?" name="terraform_help"/>
<check_box label="Impedisci il volo" name="block_fly_check"/>
- <button label="?" name="fly_help"/>
<check_box label="Abilita i danni" name="allow_damage_check"/>
- <button label="?" name="damage_help"/>
<check_box label="Limita gli urti" name="restrict_pushobject"/>
- <button label="?" name="restrict_pushobject_help"/>
<check_box label="Abilita la rivendita del terreno" name="allow_land_resell_check"/>
- <button label="?" name="land_resell_help" left="260"/>
<check_box label="Abilita unione/suddivisione del terreno" name="allow_parcel_changes_check"/>
- <button label="?" name="parcel_changes_help" left="260" />
<check_box label="Proibisci che il terreno appaia nelle ricerche" name="block_parcel_search_check" tool_tip="Permetti che le persone vedano questa regione e le sue suddivisioni nei risultati delle ricerche"/>
- <button label="?" name="parcel_search_help" left="260"/>
- <spinner label="Limite massimo di avatar" name="agent_limit_spin" label_width="135" width="190"/>
- <button label="?" name="agent_limit_help"/>
- <spinner label="Bonus di oggetti" name="object_bonus_spin" label_width="135" width="190"/>
- <button label="?" name="object_bonus_help"/>
+ <spinner label="Limite massimo di avatar" label_width="135" name="agent_limit_spin" width="190"/>
+ <spinner label="Bonus di oggetti" label_width="135" name="object_bonus_spin" width="190"/>
<text label="Maturità" name="access_text" width="120">
Categoria di accesso:
</text>
- <combo_box label="Mature" name="access_combo" left="126" width="74">
- <combo_box.item label="Adult" name="Adult"/>
- <combo_box.item label="Mature" name="Mature"/>
- <combo_box.item label="PG" name="PG"/>
- </combo_box>
- <button label="?" name="access_help"/>
+ <icons_combo_box label="Moderato" left="126" name="access_combo" width="74">
+ <icons_combo_box.item label="Adulti" name="Adult" value="42"/>
+ <icons_combo_box.item label="Moderato" name="Mature" value="21"/>
+ <icons_combo_box.item label="Generale" name="PG" value="13"/>
+ </icons_combo_box>
<button label="Applica" name="apply_btn"/>
- <button label="Teletrasporta a casa un utente..." name="kick_btn"/>
- <button label="Teletrasporta a casa tutti gli utenti..." name="kick_all_btn"/>
+ <button label="Teleport a casa un residente..." name="kick_btn"/>
+ <button label="Teleport a casa tutti i residenti..." name="kick_all_btn"/>
<button label="Invia messaggio alla regione..." name="im_btn"/>
<button label="Gestisci snodo di teleport..." name="manage_telehub_btn" width="210"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_region_general_layout.xml b/indra/newview/skins/default/xui/it/panel_region_general_layout.xml
new file mode 100644
index 0000000000..4cf31f4b6e
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_region_general_layout.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Regione" name="General">
+ <text name="region_text_lbl">
+ Regione:
+ </text>
+ <text name="region_text">
+ sconosciuto
+ </text>
+ <text name="version_channel_text_lbl">
+ Versione:
+ </text>
+ <text name="version_channel_text">
+ sconosciuto
+ </text>
+ <text name="region_type_lbl">
+ Tipo:
+ </text>
+ <text name="region_type">
+ sconosciuto
+ </text>
+ <check_box label="Impedisci Terraform" name="block_terraform_check"/>
+ <check_box label="Impedisci volo" name="block_fly_check"/>
+ <check_box label="Permetti danni" name="allow_damage_check"/>
+ <check_box label="Limita spinte" name="restrict_pushobject"/>
+ <check_box label="Permetti la rivendita dei terreni" name="allow_land_resell_check"/>
+ <check_box label="Permetti l&apos;unione/divisione del terreno" name="allow_parcel_changes_check"/>
+ <check_box label="Impedisci la visualizzazione del terreno nelle ricerche" name="block_parcel_search_check" tool_tip="Permetti alla gente di vedere questa regione e i suoi lotti nei risultati dellla ricerca"/>
+ <spinner label="N. massimo di avatar" name="agent_limit_spin"/>
+ <spinner label="Bonus oggetto" name="object_bonus_spin"/>
+ <text label="Categoria di accesso" name="access_text">
+ Categoria:
+ </text>
+ <combo_box label="Moderato" name="access_combo">
+ <combo_box.item label="Adulti" name="Adult"/>
+ <combo_box.item label="Moderato" name="Mature"/>
+ <combo_box.item label="Generale" name="PG"/>
+ </combo_box>
+ <button label="Applica" name="apply_btn"/>
+ <button label="Teleport a casa un residente..." name="kick_btn"/>
+ <button label="Teleport a casa tutti i residenti..." name="kick_all_btn"/>
+ <button label="Invia messaggio alla regione..." name="im_btn"/>
+ <button label="Gestisci telehub..." name="manage_telehub_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_region_texture.xml b/indra/newview/skins/default/xui/it/panel_region_texture.xml
index 23d6915a2f..1337ed18ca 100644
--- a/indra/newview/skins/default/xui/it/panel_region_texture.xml
+++ b/indra/newview/skins/default/xui/it/panel_region_texture.xml
@@ -25,16 +25,16 @@
Range di elevazione della texture
</text>
<text name="height_text_lbl6">
- Sud Ovest
+ Nordovest
</text>
<text name="height_text_lbl7">
- Nord Ovest
+ Nordest
</text>
<text name="height_text_lbl8">
- Sud Est
+ Sudovest
</text>
<text name="height_text_lbl9">
- Nord Est
+ Sudest
</text>
<spinner label="Bassa" name="height_start_spin_0"/>
<spinner label="Bassa" name="height_start_spin_1"/>
@@ -45,10 +45,10 @@
<spinner label="Alta" name="height_range_spin_2"/>
<spinner label="Alta" name="height_range_spin_3"/>
<text name="height_text_lbl10">
- Questi valori riproducono l&apos;insieme della gamma delle textures superiori.
+ Questi valori indicano la gamma di miscele per le texture di cui sopra.
</text>
<text name="height_text_lbl11">
- Misurato in metri, il valore MINIMO è l&apos;altezza MASSIMA della Texture n°1, e il valore MASSIMO è l&apos;altezza MINIMA della Texture n°4.
+ Misurato in metri, il valore BASSO è la MASSIMA altezza della texture n. 1, e il valore ALTO è l&apos;altezza MINIMA della texture n. 4.
</text>
<text name="height_text_lbl12">
Texture #1, e il valore più ALTO all&apos;altezza MINIMA della Texture #4.
diff --git a/indra/newview/skins/default/xui/it/panel_script_ed.xml b/indra/newview/skins/default/xui/it/panel_script_ed.xml
index a98a88950c..f550aee98e 100644
--- a/indra/newview/skins/default/xui/it/panel_script_ed.xml
+++ b/indra/newview/skins/default/xui/it/panel_script_ed.xml
@@ -1,43 +1,43 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="script panel">
<panel.string name="loading">
- Caricando...
+ Caricamento in corso...
</panel.string>
<panel.string name="can_not_view">
- Non puoi vedere o modificare questo script, perchè è impostato come &quot;no copy&quot;. Necesiti tutti i permessi per vedere o modificare lo script dentro un oggetto..
+ Per impostazione, questo script non può essere visualizzato né modificato. Per visualizzare o modificare uno script all&apos;interno di un oggetto, devi avere i necessari diritti di modifica.
</panel.string>
<panel.string name="public_objects_can_not_run">
- Oggetti Pubblici non possono attivare scripts
+ Gli oggetti pubblici non possono eseguire gli script
</panel.string>
<panel.string name="script_running">
- Attivando
+ In esecuzione
</panel.string>
<panel.string name="Title">
Script: [NAME]
</panel.string>
<text_editor name="Script Editor">
- Caricando...
+ Caricamento in corso...
</text_editor>
<button label="Salva" label_selected="Salva" name="Save_btn"/>
- <combo_box label="Inserire..." name="Insert..."/>
+ <combo_box label="Inserisci..." name="Insert..."/>
<menu_bar name="script_menu">
<menu label="File" name="File">
<menu_item_call label="Salva" name="Save"/>
- <menu_item_call label="Annulla tutti i cambiamenti" name="Revert All Changes"/>
+ <menu_item_call label="Annulla tutte le modifiche" name="Revert All Changes"/>
</menu>
<menu label="Modifica" name="Edit">
- <menu_item_call label="Slaccia" name="Undo"/>
+ <menu_item_call label="Annulla" name="Undo"/>
<menu_item_call label="Rifai" name="Redo"/>
<menu_item_call label="Taglia" name="Cut"/>
<menu_item_call label="Copia" name="Copy"/>
<menu_item_call label="Incolla" name="Paste"/>
- <menu_item_call label="Seleziona Tutto" name="Select All"/>
+ <menu_item_call label="Seleziona tutto" name="Select All"/>
<menu_item_call label="Deseleziona" name="Deselect"/>
<menu_item_call label="Cerca / Sostituisci..." name="Search / Replace..."/>
</menu>
- <menu label="Aiuto" name="Help">
+ <menu label="Guida" name="Help">
<menu_item_call label="Aiuto..." name="Help..."/>
- <menu_item_call label="Aiuto nella tastiera..." name="Keyword Help..."/>
+ <menu_item_call label="Aiuto con parole chiave..." name="Keyword Help..."/>
</menu>
</menu_bar>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/it/panel_script_limits_my_avatar.xml
new file mode 100644
index 0000000000..98096a391a
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_script_limits_my_avatar.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="IL MIO AVATAR" name="script_limits_my_avatar_panel">
+ <text name="script_memory">
+ Uso degli script avatar
+ </text>
+ <text name="loading_text">
+ Caricamento in corso...
+ </text>
+ <scroll_list name="scripts_list">
+ <scroll_list.columns label="Dimensione (kb)" name="size"/>
+ <scroll_list.columns label="URL" name="urls"/>
+ <scroll_list.columns label="Nome dell&apos;oggetto" name="name"/>
+ <scroll_list.columns label="Posizione" name="location"/>
+ </scroll_list>
+ <button label="Aggiorna lista" name="refresh_list_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/it/panel_script_limits_region_memory.xml
new file mode 100644
index 0000000000..df7b0eae1c
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_script_limits_region_memory.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="MEMORIA DELLA REGIONE" name="script_limits_region_memory_panel">
+ <text name="script_memory">
+ Memoria dello script del lotto
+ </text>
+ <text name="loading_text">
+ Caricamento in corso...
+ </text>
+ <scroll_list name="scripts_list">
+ <scroll_list.columns label="Dimensione (kb)" name="size"/>
+ <scroll_list.columns label="URL" name="urls"/>
+ <scroll_list.columns label="Nome dell&apos;oggetto" name="name"/>
+ <scroll_list.columns label="Proprietario dell&apos;oggetto" name="owner"/>
+ <scroll_list.columns label="Lotto" name="parcel"/>
+ <scroll_list.columns label="Posizione" name="location"/>
+ </scroll_list>
+ <button label="Aggiorna lista" name="refresh_list_btn"/>
+ <button label="In evidenza" name="highlight_btn"/>
+ <button label="Restituisci" name="return_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_side_tray.xml b/indra/newview/skins/default/xui/it/panel_side_tray.xml
index 06bc51f5db..e0143088a5 100644
--- a/indra/newview/skins/default/xui/it/panel_side_tray.xml
+++ b/indra/newview/skins/default/xui/it/panel_side_tray.xml
@@ -2,25 +2,28 @@
<!-- Side tray cannot show background because it is always
partially on screen to hold tab buttons. -->
<side_tray name="sidebar">
- <sidetray_tab description="Casa." name="sidebar_home">
+ <sidetray_tab description="Apri/chiudi la barra laterale." name="sidebar_openclose" tab_title="Apri/chiudi la barra laterale"/>
+ <sidetray_tab description="Casa." name="sidebar_home" tab_title="Home">
<panel label="casa" name="panel_home"/>
</sidetray_tab>
- <sidetray_tab description="Trova i tuoi amici, contatti e persone nelle vicinanze." name="sidebar_people">
+ <sidetray_tab description="Modifica il tuo profilo pubblico e i preferiti." name="sidebar_me" tab_title="Il mio profilo">
<panel_container name="panel_container">
- <panel label="Info di Gruppo" name="panel_group_info_sidetray"/>
- <panel label="Residenti bloccati &amp; Oggetti" name="panel_block_list_sidetray"/>
+ <panel label="Io" name="panel_me"/>
</panel_container>
</sidetray_tab>
- <sidetray_tab description="Trova luoghi dove andare e luoghi già visitati." label="Luoghi" name="sidebar_places">
- <panel label="Luoghi" name="panel_places"/>
+ <sidetray_tab description="Trova amici, contatti e persone nelle vicinanze." name="sidebar_people" tab_title="Persone">
+ <panel_container name="panel_container">
+ <panel label="Profilo del gruppo" name="panel_group_info_sidetray"/>
+ <panel label="Residenti e oggetti bloccati" name="panel_block_list_sidetray"/>
+ </panel_container>
</sidetray_tab>
- <sidetray_tab description="Modifica il tuo profilo pubblico e le foto." name="sidebar_me">
- <panel label="Io" name="panel_me"/>
+ <sidetray_tab description="Trova luoghi dove andare e luoghi già visitati." label="Luoghi" name="sidebar_places" tab_title="Luoghi">
+ <panel label="Luoghi" name="panel_places"/>
</sidetray_tab>
- <sidetray_tab description="Cambia il tuo aspetto ed il tuo look attuale." name="sidebar_appearance">
- <panel label="Modifica Aspetto" name="sidepanel_appearance"/>
+ <sidetray_tab description="Sfoglia il tuo inventario." name="sidebar_inventory" tab_title="Il mio inventario">
+ <panel label="Modifica inventario" name="sidepanel_inventory"/>
</sidetray_tab>
- <sidetray_tab description="Curiosa nel tuo inventario." name="sidebar_inventory">
- <panel label="Modifica Inventario" name="sidepanel_inventory"/>
+ <sidetray_tab description="Cambia il tuo aspetto ed il tuo look attuale." name="sidebar_appearance" tab_title="Il mio aspetto">
+ <panel label="Modifica aspetto fisico" name="sidepanel_appearance"/>
</sidetray_tab>
</side_tray>
diff --git a/indra/newview/skins/default/xui/it/panel_side_tray_tab_caption.xml b/indra/newview/skins/default/xui/it/panel_side_tray_tab_caption.xml
index 5e5f229ce4..753e89f2fd 100644
--- a/indra/newview/skins/default/xui/it/panel_side_tray_tab_caption.xml
+++ b/indra/newview/skins/default/xui/it/panel_side_tray_tab_caption.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="sidetray_tab_panel">
- <text name="sidetray_tab_title" value="Vaschetta laterale"/>
+ <text name="sidetray_tab_title" value="Pannello laterale"/>
<button name="show_help" tool_tip="Mostra Aiuto"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/it/panel_stand_stop_flying.xml
index 2fafc38ba1..e4ff7019ec 100644
--- a/indra/newview/skins/default/xui/it/panel_stand_stop_flying.xml
+++ b/indra/newview/skins/default/xui/it/panel_stand_stop_flying.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml-->
<panel name="panel_stand_stop_flying">
- <button label="Stare in piedi" name="stand_btn" tool_tip="Clicca qui per alzarti."/>
+ <button label="Alzati" name="stand_btn" tool_tip="Clicca qui per alzarti."/>
<button label="Ferma il volo" name="stop_fly_btn" tool_tip="Ferma il volo"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_status_bar.xml b/indra/newview/skins/default/xui/it/panel_status_bar.xml
index 9acbb34c79..6b1a8aa71b 100644
--- a/indra/newview/skins/default/xui/it/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/it/panel_status_bar.xml
@@ -21,9 +21,13 @@
<panel.string name="buycurrencylabel">
L$ [AMT]
</panel.string>
- <button label="" label_selected="" name="buycurrency" tool_tip="Il mio saldo: Clicca per comprare più L$"/>
- <text name="TimeText" tool_tip="Ora attuale (Pacific)">
- 12:00 AM
+ <panel name="balance_bg">
+ <text name="balance" tool_tip="Il mio saldo" value="L$ 20"/>
+ <button label="ACQUISTA L$" name="buyL" tool_tip="Clicca per acquistare più L$"/>
+ </panel>
+ <text name="TimeText" tool_tip="Orario attuale (Pacifico)">
+ 24:00, ora del Pacifico
</text>
- <button name="volume_btn" tool_tip="Controllo del volume globale"/>
+ <button name="media_toggle_btn" tool_tip="Attiva/ferma tutti i media (musica, video, pagine Web)"/>
+ <button name="volume_btn" tool_tip="Regolazione del volume globale"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_teleport_history.xml b/indra/newview/skins/default/xui/it/panel_teleport_history.xml
index 3f02b1449a..85f8f87e68 100644
--- a/indra/newview/skins/default/xui/it/panel_teleport_history.xml
+++ b/indra/newview/skins/default/xui/it/panel_teleport_history.xml
@@ -3,12 +3,16 @@
<accordion name="history_accordion">
<accordion_tab name="today" title="Oggi"/>
<accordion_tab name="yesterday" title="Ieri"/>
- <accordion_tab name="2_days_ago" title="2 giorni fà"/>
- <accordion_tab name="3_days_ago" title="3 giorni fà"/>
- <accordion_tab name="4_days_ago" title="4 giorni fà"/>
- <accordion_tab name="5_days_ago" title="5 giorni fà"/>
- <accordion_tab name="6_days_and_older" title="6 giorni fà o più vecchio"/>
- <accordion_tab name="1_month_and_older" title="1 mese o più vecchio"/>
- <accordion_tab name="6_months_and_older" title="6 mesi o più vecchio"/>
+ <accordion_tab name="2_days_ago" title="2 giorni fa"/>
+ 5
+ <accordion_tab name="3_days_ago" title="3 giorni fa"/>
+ <accordion_tab name="4_days_ago" title="4 giorni fa"/>
+ <accordion_tab name="5_days_ago" title="5 giorni fa"/>
+ <accordion_tab name="6_days_and_older" title="6 giorni o precedente"/>
+ <accordion_tab name="1_month_and_older" title="1 mese o precedente"/>
+ <accordion_tab name="6_months_and_older" title="6 mesi o precedente"/>
</accordion>
+ <panel name="bottom_panel">
+ <button name="gear_btn" tool_tip="Mostra opzioni addizionali"/>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/it/panel_teleport_history_item.xml
new file mode 100644
index 0000000000..2ba4baacaf
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_teleport_history_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="teleport_history_item">
+ <button name="profile_btn" tool_tip="Mostra informazioni dell&apos;oggetto"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_voice_effect.xml b/indra/newview/skins/default/xui/it/panel_voice_effect.xml
new file mode 100644
index 0000000000..78ce1ff24a
--- /dev/null
+++ b/indra/newview/skins/default/xui/it/panel_voice_effect.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_voice_effect">
+ <string name="no_voice_effect">
+ Nessuna manipolazione voce
+ </string>
+ <string name="preview_voice_effects">
+ Anteprima manipolazione voce â–¶
+ </string>
+ <string name="get_voice_effects">
+ Ottieni manipolazione voce â–¶
+ </string>
+ <combo_box name="voice_effect" tool_tip="Scegli un effetto di manipolazione per modificare il suono della tua voce.">
+ <combo_box.item label="Nessuna manipolazione voce" name="no_voice_effect"/>
+ </combo_box>
+</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_world_map.xml b/indra/newview/skins/default/xui/it/panel_world_map.xml
index 1349b36e2c..642af75028 100644
--- a/indra/newview/skins/default/xui/it/panel_world_map.xml
+++ b/indra/newview/skins/default/xui/it/panel_world_map.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="world_map">
<panel.string name="Loading">
- Sto Caricando...
+ Caricamento in corso...
</panel.string>
<panel.string name="InvalidLocation">
Luogo non valido
@@ -30,6 +30,12 @@
<panel.string name="world_map_northwest">
NO
</panel.string>
+ <panel.string name="world_map_person">
+ 1 persona
+ </panel.string>
+ <panel.string name="world_map_people">
+ [NUMBER] persone
+ </panel.string>
<text label="N" name="floater_map_north" text="N">
N
</text>
diff --git a/indra/newview/skins/default/xui/it/role_actions.xml b/indra/newview/skins/default/xui/it/role_actions.xml
index eab8e6b4e3..e3f95f7f86 100644
--- a/indra/newview/skins/default/xui/it/role_actions.xml
+++ b/indra/newview/skins/default/xui/it/role_actions.xml
@@ -1,72 +1,72 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<role_actions>
- <action_set description="Queste abilità permettono di aggiungere e rimuovere Membri dal gruppo, e permettono ai nuovi membri di aderire al gruppo senza invito." name="Membership">
- <action description="Invitare persone in questo Gruppo" longdescription="Invita Persone in questo Gruppo usando il bottone &apos;Invita&apos; nella sezione Ruoli &gt; tabella Membri." name="member invite"/>
- <action description="Espellere Membri da questo Gruppo" longdescription="Espelli Membri dal Gruppo usando il bottone &apos;Espelli&apos; nella sezione Ruoli &gt; tabella Membri. Un Proprietario può espellere chiunque eccetto un altro Proprietario. Se tu non sei un Proprietario, un Membro può essere espulso da un gruppo solo ed unicamente, se hanno il Ruolo Everyone, e nessun altro Ruolo. Per rimuovere Membri dai Ruoli, devi avere l&apos;Abilità &apos;Rimuovi Membri dai Ruoli&apos;." name="member eject"/>
- <action description="Seleziona &apos;Iscrizione libera&apos; e modifica da &apos;Tassa d&apos;Iscrizione&apos;" longdescription="Seleziona &apos;Iscrizione libera&apos; per permettere ai nuovi Membri di aderire senza invito, e modifica da &apos;Tassa d&apos;Iscrizione&apos; nella sezione Generale." name="member options"/>
+ <action_set description="Queste abilità permettono di aggiungere e rimuovere membri dal gruppo e consentono ai nuovi membri di aderire al gruppo senza invito." name="Membership">
+ <action description="Invita persone in questo gruppo" longdescription="Invita persone in questo gruppo usando il pulsante Invita nella sezione Ruoli &gt; scheda membri." name="member invite"/>
+ <action description="Espelli membri da questo gruppo" longdescription="Espelli membri dal gruppo usando il pulsante Espelli nella sezione Ruoli &gt; scheda membri. Un proprietario può espellere chiunque tranne un altro proprietario. Se non sei un proprietario, un membro può essere espulso da un gruppo soltanto qualora abbia soltanto il ruolo Tutti, e nessun altro ruolo. Per rimuovere membri dai ruoli, devi avere l&apos;Abilità corrispondente." name="member eject"/>
+ <action description="Seleziona Iscrizione libera e modifica la Quota d&apos;iscrizione" longdescription="Seleziona Iscrizione libera per permettere ai nuovi membri di aderire senza invito e modifica la quota d&apos;iscrizione nella scheda Generale." name="member options"/>
</action_set>
- <action_set description="Queste Abilità permettono di aggiungere, rimuovere, cambiare i Ruoli del Gruppo, aggiungere e rimuovere Membri dai Ruoli, e assegnare Abilità ai Ruoli." name="Roles">
- <action description="Creare nuovi Ruoli" longdescription="Crea nuovi Ruoli nella sezione Ruoli &gt; tabella Ruoli." name="role create"/>
- <action description="Cancellare Ruoli" longdescription="Cancella Ruoli nella sezione Ruoli &gt; tabella Ruoli." name="role delete"/>
- <action description="Cambia i nomi del Ruolo, titoli, descrizioni, se i membri in quel Ruolo sono resi pubblici" longdescription="Cambia i nomi del Ruolo, titoli, descrizioni, se i membri in quel Ruolo sono resi pubblici. Viene fatto nella parte bassa della sezione Ruoli &gt; tabella Ruoli dopo avere selezionato un Ruolo." name="role properties"/>
- <action description="Incaricare Membri ad Assegnare Ruoli" longdescription="Assegna un Ruolo a Membri nella lista dei Ruoli assegnati (Roles section &gt; Members tab). Un Membro con questa Abilità può aggiungere Membri ad un Ruolo già presente nell&apos;elenco." name="role assign member limited"/>
- <action description="Assegnare Membri a tutti i Ruoli" longdescription="Assegna Tutti i Ruoli a Membri nella lista dei Ruoli Assegnati (Roles section &gt; Members tab). *ATTENZIONE* Ogni Membro con questo Ruolo e Abilità può assegnarsi -- e assegnare ad altri Membri non Proprietari-- Ruoli con poteri maggiori di quelli normalmente concessi, potenzialmente elevandosi ai poteri concessi al Proprietario. Siate sicuri di quello che fate prima di assegnare questa Abilità." name="role assign member"/>
- <action description="Rimuovere Membri dai Ruoli" longdescription="Rimuovi dai Ruoli i Membri nella lista dei Ruoli Assegnati (Roles section &gt; Members tab). Il Proprietario non può essere rimosso." name="role remove member"/>
- <action description="Assegnare e Rimuovere Abilità nei Ruoli" longdescription="Assegna e Rimuovi Abilità per ogni Ruolo nella lista dei Ruoli Assegnati (Roles section &gt; Roles tab). *ATTENZIONE* Ogni Membro con questo Ruolo e Abilità può assegnarsi --ed assegnare ad altri Membri non Proprietà-- tutte le Abilità, che potenzialmente lo elevano ai poteri ai poteri concessi al Proprietario. Siate sicuri di quello che fate prima di assegnare questa Abilità ." name="role change actions"/>
+ <action_set description="Queste Abilità permettono di aggiungere, rimuovere, cambiare i ruoli del gruppo, aggiungere e rimuovere membri dai ruoli, nonché assegnare abilità ai ruoli." name="Roles">
+ <action description="Creare nuovi ruoli" longdescription="Crea nuovi ruoli nella sezione Ruoli &gt; scheda ruoli." name="role create"/>
+ <action description="Eliminare ruoli" longdescription="Elimina ruoli nella sezione Ruoli &gt; scheda ruoli." name="role delete"/>
+ <action description="Cambia i nomi di ruoli, i titoli, le descrizioni e definisci se i membri in quel ruolo sono resi pubblici" longdescription="Cambia i nomi di ruoli, i titoli, le descrizioni e definisci se i membri in quel ruolo sono resi pubblici Viene fatto nella parte inferiore della sezione Ruoli &gt; scheda Ruoli, dopo avere selezionato un ruolo." name="role properties"/>
+ <action description="Assegnare membri a ruoli del responsabile" longdescription="Assegna un ruolo a membri nella lista dei ruoli assegnati (sezione Ruoli &gt; scheda membri). Un utente con questa Abilità può aggiungere membri ad un ruolo nel quale il responsabile è già presente." name="role assign member limited"/>
+ <action description="Assegnare membri a qualsiasi ruolo" longdescription="Assegna i membri a qualsiasi ruolo nell&apos;elenco dei ruoli assegnati (sezione Ruoli &gt; scheda membri). *ATTENZIONE* Ogni membro con questo Ruolo e Abilità può assegnarsi -- e assegnare ad altri membri non proprietari -- ruoli con poteri maggiori di quelli normalmente concessi, potenzialmente con poteri analoghi a quelli di proprietario. Sii sicuro della scelta prima di assegnare questa Abilità." name="role assign member"/>
+ <action description="Rimuovere membri dai ruoli" longdescription="Rimuovi dai ruoli i membri nell&apos;elenco dei ruoli assegnati (sezione Ruoli &gt; scheda membri). Il proprietario non può essere rimosso." name="role remove member"/>
+ <action description="Assegnare e rimuovere abilità nei ruoli" longdescription="Assegna e Rimuovi Abilità per ogni ruolo nell&apos;elenco dei ruoli assegnati (sezione Ruoli &gt; scheda Ruoli). *ATTENZIONE* Ogni membro con questo ruolo e Abilità può assegnarsi -- ed assegnare ad altri membri non proprietari -- tutte le Abilità, che potenzialmente con poteri analoghi a quelli di proprietario. Sii sicuro della scelta prima di assegnare questa Abilità." name="role change actions"/>
</action_set>
- <action_set description="Queste Abilità permettono di modificare l&apos;identità di questo Gruppo, come il cambiamento della visibilità pubblica, lo statuto, e lo stemma." name="Group Identity">
- <action description="Cambiare lo Statuto, lo Stemma, e &apos;Mostra nel Cerca/Search&apos;" longdescription="Cambia Statuto, Immagine, e &apos;Mostra nel Cerca&apos;. Viene fatto nella sezione Generale." name="group change identity"/>
+ <action_set description="Queste abilità autorizzano a modificare l&apos;identità di questo gruppo, come ad esempio la modifica della visibilità pubblica, lo statuto e il logo." name="Group Identity">
+ <action description="Cambiare lo statuto, il logo, e &apos;Mostra nella ricerca&apos;" longdescription="Cambia statuto, logo e &apos;Mostra nella ricerca&apos;. Viene fatto nella sezione Generale." name="group change identity"/>
</action_set>
- <action_set description="Queste Abilità includono il potere di intestare, modificare, e vendere terreni di proprietà del Gruppo. Per aprire la finestra Info sul Terreno, click destro sulla terra e seleziona &apos;Info sul Terreno&apos;, o clicca l&apos;icona &apos;i&apos; sulla Barra di Navigazione." name="Parcel Management">
- <action description="Intestare terra e comprare terra per il gruppo" longdescription="Intesta terra e compra terra per il Gruppo. Viene fatto in Informazioni sul Terreno &gt; tabella Generale." name="land deed"/>
- <action description="Abbandonare la terra in favore di Governor Linden" longdescription="Abbandona la terra in favore di Governor Linden. *ATTENZIONE* Ogni Membro con questo Ruolo e Abilità può abbandonare la terra posseduta dal Gruppo in Informazioni sul Terreno &gt; tabella Generale, restituendola alla proprietà Linden senza una vendita! Devi essere sicuro di quello che fai prima di assegnare questa Abilità." name="land release"/>
- <action description="Impostare le info per la vendita della terra" longdescription="Imposta le info per la vendita della terra. *ATTENZIONE* Ogni Membro con questo Ruolo e Abilità può vendere la terra posseduta dal Gruppo in Info sul Terreno &gt; tabella Generale (al prezzo che vogliono)! Devi essere sicuro di quello che fai prima di assegnare questa Abilità." name="land set sale info"/>
- <action description="Suddividere e unire appezzamenti" longdescription="Suddividi e unisci parcel. Viene fatto con click destro sul terra, &apos;Modifica Terreno&apos;, trascinando poi il mouse sulla terra per creare una selezione. Per suddividere, seleziona quale parte vuoi dividere e clicca &apos;Suddividere&apos;. Per unire, seleziona due o più two parcel confinanti e clicca &apos;Unisci&apos;." name="land divide join"/>
+ <action_set description="Queste Abilità comprendono il potere di intestare, modificare e vendere terreni di proprietà del gruppo. Per aprire la finestra Informazioni sul terreno, fai clic con il pulsante destro del mouse sul terreno e seleziona Informazioni sul terreno, o clicca sull&apos;icona &apos;i&apos; nella Barra di Navigazione." name="Parcel Management">
+ <action description="Cessione di terreno e acquisto di terreno per il gruppo" longdescription="Intesta terreno e acquista terreno per il gruppo. Ciò viene fatto in Informazioni sul terreno &gt; scheda Generale." name="land deed"/>
+ <action description="Abbandonare il terreno in favore di Governor Linden" longdescription="Abbandona il terreno in favore di Governor Linden. *ATTENZIONE* Ogni membro con questo ruolo e abilità può abbandonare il terreno di proprietà del gruppo in Informazioni sul terreno &gt; scheda Generale, restituendolo alla proprietà Linden senza effettuare una vendita. Sii sicuro della scelta prima di assegnare questa Abilità." name="land release"/>
+ <action description="Informazioni su come impostare il terreno come in vendita" longdescription="Imposta le informazioni per la vendita del terreno. *ATTENZIONE* Ogni Membro con questo ruolo e abilità può vendere il terreno di proprietà del gruppo nella scheda Informazioni sul terreno &gt; scheda Generale. Pertanto sii sicuro della scelta prima di assegnare questa Abilità." name="land set sale info"/>
+ <action description="Suddividere e unire lotti" longdescription="Suddividi e unisci lotti. Viene fatto cliccando con il pulsante destro del mouse sul terreno, selezionando Modifica terreno e trascinando il mouse sul terreno per creare una selezione. Per suddividere, seleziona quale parte vuoi dividere e clicca su Suddividi. Per unire, seleziona due o più lotti confinanti e clicca su Unisci." name="land divide join"/>
</action_set>
- <action_set description="Queste Abilità permettono di cambiare il nome dell&apos;appezzamento, le impostazioni pre-definite, la visibilità nella mappatura, il punto di arrivo &amp; le coordinate del Teleport." name="Parcel Identity">
- <action description="Premi &apos;Mostra Luogo nel Cerca&apos; e seleziona una categoria" longdescription="Premi &apos;Mostra Luogo nel Cerca&apos; e seleziona una categoria di parcel in Info sul Terreno &gt; tabella Opzioni." name="land find places"/>
- <action description="Cambia il nome del parcel, descrizione, e impostazioni nel &apos;Mostra Luogo nel Cerca&apos;" longdescription="Cambia il nome del parcel, descrizione, e impostazioni nel &apos;Mostra Luogo nel Cerca&apos;. Viene fatto in Info sul Terreno &gt; tabella Opzioni." name="land change identity"/>
- <action description="Impostare il punto di arrivo e le coordinate del Teleport" longdescription="In un appezzamento posseduto da un Gruppo, i Membri con questo Ruolo e Abilità possono impostare un punto di arrivo per i Teleport entranti, e impostare anche le coordinate del Teleport per ulteriore precisione. Viene fatto in Informazioni sul Terreno &gt; tabella Opzioni." name="land set landing point"/>
+ <action_set description="Queste abilità permettono di cambiare il nome del lotto, le impostazioni di pubblicazione, la visibilità negli elenchi e il punto di arrivo, nonché opzioni di indirizzamento del Teleport." name="Parcel Identity">
+ <action description="Premi Mostra luogo nella ricerca e seleziona una categoria" longdescription="Premi Mostra luogo nella ricerca e seleziona una categoria di lotto in Informazioni sul terreno &gt; scheda Opzioni." name="land find places"/>
+ <action description="Cambia il nome del lotto, la descrizione e le impostazioni di Mostra luogo nella ricerca" longdescription="Cambia il nome del lotto, la descrizione e le impostazioni di Mostra luogo nella ricerca. Ciò viene fatto in Informazioni sul terreno &gt; scheda Opzioni." name="land change identity"/>
+ <action description="Impostare il punto di arrivo e l&apos;indirizzamento del Teleport" longdescription="In un lotto di proprietà di un gruppo, i membri con questo ruolo e abilità possono impostare un punto di arrivo per i teleport entranti e impostare anche l&apos;indirizzamento del teleport per ulteriore precisione. Viene fatto in Informazioni sul terreno &gt; Opzioni." name="land set landing point"/>
</action_set>
- <action_set description="Queste Abilità permettono alcune permessi nell&apos;appezzamento, quali &apos;Creare Oggetti&apos;, &apos;Editare il Terreno&apos;, trasmettere musica &amp; tabella Media." name="Parcel Settings">
- <action description="Cambiare musica &amp; tabella media" longdescription="Cambia le impostazioni per lo streaming della musica e dei video in Informazioni sul Terreno &gt; tabella Media." name="land change media"/>
- <action description="Cliccare &apos;Edita il Terreno&apos;" longdescription="Clicca &apos;Edita il Terreno&apos;. *ATTENZIONE* Informazioni sul Terreno &gt; tabella Opzioni &gt; Edita il Terreno permette a tutti di modificare la forma del terreno, collocare e spostare le piante Linden. Devi essere sicuro di quello che fai prima di assignera questa Abilità. Edita il terreno in Informazioni sul Terreno &gt; tabella Opzioni." name="land edit"/>
- <action description="Cliccare Informazioni sul Terreno &gt; Impostazione Opzioni" longdescription="Premi &apos;Salvo (nessun danno)&apos;, &apos;Vola&apos;, e permetti agli altri Residenti di: &apos;modifica Terreno&apos;, &apos;Crea&apos;, &apos;Crea Landmarks&apos;, e &apos;Scripts attivi&apos; nella terra posseduta da un Gruppo in Info sul Terreno &gt; tabella Opzioni." name="land options"/>
+ <action_set description="Queste abilità hanno poteri relativi alle opzioni dei lotti, come la creazione di oggetti, la modifica del terreno e le impostazioni per la musica e gli elementi multimediali." name="Parcel Settings">
+ <action description="Cambiare impostazioni musica e multimediali" longdescription="Cambia le impostazioni per lo streaming della musica e dei video in Informazioni sul terreno &gt; Media." name="land change media"/>
+ <action description="Attiva &apos;Modifica terreno&apos;" longdescription="Attiva &apos;Modifica terreno&apos;. *ATTENZIONE* Informazioni sul terreno &gt; Opzioni &gt; Modifica terreno consente a chiunque di modificare la forma del tuo terreno e di collocare e spostare le piante Linden. Pertanto sii sicuro della scelta prima di assegnare questa Abilità. La funzione di modifica del terreno è attivata in Informazioni sul terreno &gt; Opzioni." name="land edit"/>
+ <action description="Attivazione di parametri per Informazioni sul terreno &gt; Opzioni" longdescription="Premi Sicuro (nessun danno), Vola e consenti agli altri residenti di: modificare il terreno, costruire, creare punti di riferimento ed eseguire script nel terreno appartenente ad un gruppo in Informazioni sul terreno &gt; scheda Opzioni." name="land options"/>
</action_set>
- <action_set description="Queste Abilità permettono ai Membri di non avere restrizioni in un appezzamento posseduto da un Gruppo." name="Parcel Powers">
- <action description="Permettere sempre &apos;Edita il Terreno&apos;" longdescription="I Membri con questo Ruolo e Abilità possono editare il terreno posseduto da un Gruppo, anche se non è selezionato in Informazioni sul Terreno &gt; tabella Opzioni." name="land allow edit land"/>
- <action description="Permettere Vola Sempre&apos;" longdescription="I Membri con questo Ruolo e Abilità possono volare in un terreno posseduto da un Gruppo, anche se non è selezionato in Info sul Terreno &gt; tabella Opzioni." name="land allow fly"/>
- <action description="Permettere &apos;Crea Oggetti&apos; sempre" longdescription="I Membri con questo Ruolo e Abilità possono creare oggetti in un appezzamento posseduto da un Gruppo, anche se non è selezionato in Informazioni sul Terreno &gt; tabella Opzioni." name="land allow create"/>
- <action description="Permettere &apos;Crea Landmark&apos; sempre" longdescription="I Membri con questo Ruolo e Abilità possono creare Landmark in un appezzamento posseduto da un Gruppo , anche se non è evidenziato in Informazioni sul Terreno &gt; tabella Opzioni." name="land allow landmark"/>
- <action description="Permettere &apos;Teleportami a Casa&apos; in un appezzamento di un Gruppo" longdescription="I Membri in un Ruolo con questa Abilità possono usare il menu Mondo &gt; Landmarks &gt; Imposta come Casa su un parcel intestato ad un Gruppo." name="land allow set home"/>
+ <action_set description="Queste abilità permettono ai membri di non avere restrizioni in un lotto appartenente ad un gruppo." name="Parcel Powers">
+ <action description="Consenti sempre la modifica del terreno" longdescription="I membri con questo ruolo e abilità possono modificare il terreno appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno &gt; Opzioni." name="land allow edit land"/>
+ <action description="Consenti sempre il volo" longdescription=" I membri con questo ruolo e abilità possono volare in un terreno appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno &gt; Opzioni." name="land allow fly"/>
+ <action description="Consenti sempre la creazione di oggetti" longdescription="I membri con questo ruolo e abilità possono creare oggetti in un lotto appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno &gt; Opzioni." name="land allow create"/>
+ <action description="Consenti sempre la creazione di punti di riferimento" longdescription="I membri con questo ruolo e abilità possono creare punti di riferimento in un lotto appartenente ad un gruppo, anche se la funzionalità è disattivata in Informazioni sul terreno &gt; Opzioni." name="land allow landmark"/>
+ <action description="Consenti la funzione &apos;Imposta come Casa mia&apos; in un lotto di gruppo" longdescription="I membri in un ruolo con questa Abilità possono usare il menu Mondo &gt; Punti di riferimento &gt; Imposta come Casa su un lotto ceduto a questo gruppo." name="land allow set home"/>
</action_set>
- <action_set description="Queste Abilità permettono di concedere o limitare l&apos;accesso ad un appezzamento di un Gruppo, e includono Congela ed Espelli un Residente." name="Parcel Access">
- <action description="Gestire la lista degli Accessi Consentiti" longdescription="Gestisci la lista degli Accessi Consentiti in Informazioni sul Terreno &gt; tabella Accesso." name="land manage allowed"/>
- <action description="Gestire la lista degli Accessi Bloccati" longdescription="Gestisci la lista Espulsi dal parcel in Info sul Terreno &gt; tabella Accesso." name="land manage banned"/>
- <action description="Cambia le impostazioni del parcel in &apos;Vendi Pass a&apos;" longdescription="Cambia le impostazioni &apos;Vendi Pass a&apos; in Info sul Terreno &gt; tabella Accesso." name="land manage passes"/>
- <action description="Espellere e Congelare i Residenti in un appezzamento" longdescription="Membri in un Ruolo con questa Abilità possono occuparsi di un residente indesiderato in un parcel posseduto da un Gruppo, con click destro sul residente, selezionando &apos;Espelli&apos; o &apos;Immobilizza&apos;." name="land admin"/>
+ <action_set description="Queste Abilità consentono di concedere o limitare l&apos;accesso ad un lotto di un gruppo da parte di residenti, con le azioni Congela ed Espelli." name="Parcel Access">
+ <action description="Gestire la lista di accesso al lotto" longdescription="Gestisci la lista di accesso al lotto in Informazioni sul terreno &gt; Accesso." name="land manage allowed"/>
+ <action description="Gestire la lista dei residenti espulsi dal lotto" longdescription="Gestisci la lista Espulsi dal lotto in Informazioni sul terreno &gt; scheda Accesso." name="land manage banned"/>
+ <action description="Cambia le impostazioni del lotto in Vendi pass a" longdescription="Cambia le impostazioni Vendi pass a in Informazioni sul terreno &gt; scheda Accesso." name="land manage passes"/>
+ <action description="Espellere e Congelare i Residenti in un lotto" longdescription="Membri in un ruolo con questa Abilità possono occuparsi di un residente indesiderato in un lotto posseduto da un gruppo, facendo clic sul residente con il pulsante destro del mouse e selezionando Espelli o Congela." name="land admin"/>
</action_set>
- <action_set description="Queste Abilità permettono ai Membri di restituire oggetti, collocare e spostare piante Linden. Questo è utile ai Membri per ripulire da oggetti indesiderati e creare paesaggi, ma deve essere utilizzato con cura, perchè non si può annullare la restituzione degli Oggetti." name="Parcel Content">
- <action description="Restituire oggetti posseduti da un Gruppo" longdescription="Restituisci gli oggetti posseduti da un Gruppo in un appezzamento di un Gruppo in Informazioni sul Terreno &gt; tabella Oggetti." name="land return group owned"/>
- <action description="Restituire oggetti concessi ad un Gruppo" longdescription="Restituisci oggetti concessi ad un Gruppo in un appezzamento di un Gruppo in Informazioni sul Terreno &gt; tabella Oggetti." name="land return group set"/>
- <action description="Restituire oggetti estranei al Gruppo" longdescription="Restituire oggetti estranei al Gruppo in un appezzamento di un Gruppo in Info sul Terreno &gt; tabella Oggetti." name="land return non group"/>
- <action description="Creare un paesaggio utilizzando le piante Linden" longdescription="Abilità di creare paesaggi di posizionare e spostare alberi, piante, erba. Questi oggetti sono presenti nella Libreria del tuo Inventario &gt; Cartella Oggetti, o possono essere creati con il menu Crea." name="land gardening"/>
+ <action_set description="Queste abilità consentono ai membri di restituire oggetti, collocare e spostare piante Linden. Questo è utile ai membri per ripulire da oggetti indesiderati e creare paesaggi, ma deve essere utilizzato con cura, perchè la restituzione degli oggetti non può essere annullata." name="Parcel Content">
+ <action description="Restituire oggetti di proprietà di un gruppo" longdescription="Restituisci gli oggetti di proprietà di un gruppo in un appezzamento di un gruppo in Informazioni sul terreno &gt; Oggetti." name="land return group owned"/>
+ <action description="Restituire oggetti assegnati ad un gruppo" longdescription="Restituisci oggetti assegnati ad un gruppo in un lotto di un gruppo in Informazioni sul terreno &gt; Oggetti." name="land return group set"/>
+ <action description="Restituire oggetti estranei al gruppo" longdescription="Restituire oggetti estranei al gruppo in un appezzamento di un gruppo in Informazioni sul terreno &gt; Oggetti." name="land return non group"/>
+ <action description="Creare un paesaggio utilizzando le piante Linden" longdescription="Abilità di creare paesaggi e posizionare e spostare alberi, piante, erba Linden. Questi oggetti sono presenti nella Libreria del tuo Inventario &gt; cartella Oggetti, o possono essere creati con il menu Crea." name="land gardening"/>
</action_set>
- <action_set description="Queste Abilità includono il potere di intestare, modificare, vendere oggetti posseduti dal gruppo. Viene fatto in Build Tools &gt; tabella Generale. Click destro su un oggetto e Modifica per vedere le impostazioni." name="Object Management">
- <action description="Intestare oggetti ad un Gruppo" longdescription="Intesta oggetti ad un Gruppo in Build Tools &gt; tabella Generale." name="object deed"/>
- <action description="Modificare (sposta, copia, modifica) oggetti di un Gruppo" longdescription="Controlla (sposta, copia, modifica) gli oggetti posseduti da un Gruppo in Build Tools &gt; tabella Generale." name="object manipulate"/>
- <action description="Mettere in vendita oggetti di un Gruppo" longdescription="Metti in vendita oggetti posseduti da un Gruppo in Build Tools &gt; tabelle Generale." name="object set sale"/>
+ <action_set description="Queste Abilità includono il potere di cedere, modificare e vendere oggetti posseduti dal gruppo. Viene fatto negli strumenti Costruisci &gt; scheda Generale. Clic con il pulsante destro del mouse su un oggetto e Modifica per vedere le impostazioni." name="Object Management">
+ <action description="Intestare oggetti ad un gruppo" longdescription="Intesta oggetti ad un gruppo in Strumenti per costruzione &gt; scheda Generale." name="object deed"/>
+ <action description="Modificare (sposta, copia, modifica) oggetti di un gruppo" longdescription="Gestisci (sposta, copia, modifica) gli oggetti appartenenti ad un gruppo in Build Tools &gt; tabella Generale." name="object manipulate"/>
+ <action description="Mettere in vendita oggetti di un gruppo" longdescription="Metti in vendita oggetti posseduti da un Gruppo in Strumenti per costruzione &gt; scheda Generale." name="object set sale"/>
</action_set>
- <action_set description="Queste Abilità permettono di richiedere ai Membri di pagare le perdite del Gruppo e di ricevere i dividendi del Gruppo, e di limitare l&apos;accesso all&apos;account del Gruppo." name="Accounting">
- <action description="Pagare le perdite del Gruppo e ricevere i dividendi del Gruppo" longdescription="I Membri con questo Ruolo e Abilità pagheranno automaticamente le perdite del Gruppo e riceveranno i dividendi del Gruppo. Questo significa che riceveranno una porzione delle vendite di terre possedute dal gruppo (che sono risolte giornalmente), e contribuiranno anche su cose come le tasse di iscrizione dell&apos;appezzament. " name="accounting accountable"/>
+ <action_set description="Queste abilità consentono di richiedere ai membri di pagare le passività del gruppo e di ricevere i dividendi del gruppo, nonché di limitare l&apos;accesso alla cronologia finanziaria del gruppo." name="Accounting">
+ <action description="Pagare le passività del gruppo e ricevere i dividendi del gruppo" longdescription="I membri con questo ruolo e abilità pagheranno automaticamente le passività del gruppo e riceveranno i dividendi del gruppo. Questo significa che riceveranno una porzione delle vendite di terreni appartenenti al gruppo (che sono distribuite giornalmente) e contribuiranno fondi a spese come le quote di inserzione del lotto. " name="accounting accountable"/>
</action_set>
- <action_set description="Queste Abilità permettono ai Membri di spedire, ricevere, e vedere le Notice del Gruppo." name="Notices">
- <action description="Spedire Notice" longdescription="Membri in un Ruolo con questa Abilità possono spedire Notice nel Gruppo &gt; sezione Notice." name="notices send"/>
- <action description="Ricevere Notice e vedere Notice precedenti" longdescription="Membri in un ruolo con questa Abilità possono ricevere Notice e vedere Notice vecchie nel Gruppo &gt; sezione Notice." name="notices receive"/>
+ <action_set description="Queste abilità consentono ai membri di inviare, ricevere e vedere gli avvisi del gruppo." name="Notices">
+ <action description="Invia avvisi" longdescription="Membri in un ruolo con questa Abilità possono inviare avvisi tramite la sezione Gruppo &gt; Avvisi." name="notices send"/>
+ <action description="Ricevere avvisi e vedere avvisi precedenti" longdescription="Membri in un ruolo con questa Abilità possono ricevere avvisi e vedere avvisi precedenti nella sezione Gruppo &gt; Avvisi." name="notices receive"/>
</action_set>
- <action_set description="Queste Abilità permettono di concedere o limitare l&apos;accesso alle sessioni di chat e di voice chat nel gruppo." name="Chat">
- <action description="Aderire alla Chat di Gruppo" longdescription="I Membri con questo Ruolo e Abilità possono aderire alle sessioni di chat, sia scritte che in voice." name="join group chat"/>
- <action description="Aderire alla Voice Chat di Gruppo" longdescription="I Membri con questo Ruolo e Abilità possono aderire alle sessioni di Voice Chat nel gruppo. NOTA: Per poter partecipare alla Chat di Gruppo è necessario accedere alla sessione di voice chat." name="join voice chat"/>
- <action description="Moderare la Chat di Gruppo" longdescription="I Membri con questo Ruolo e Abilità possono controllare l&apos;accesso e la partecipazione alle sessioni di chat scritta e di voice chat nel Gruppo." name="moderate group chat"/>
+ <action_set description="Queste Abilità permettono di concedere o limitare l&apos;accesso alle sessioni di chat e di chat vocale nel gruppo." name="Chat">
+ <action description="Partecipare alla Chat di gruppo" longdescription="I membri con questo ruolo e abilità possono partecipare alle sessioni di chat, sia scritte che vocale." name="join group chat"/>
+ <action description="Partecipa alla Chat vocale di gruppo" longdescription=" I membri con questo ruolo e abilità possono partecipare alle sessioni di Chat vocale nel gruppo. NOTA: per poter partecipare alla Chat di gruppo è necessario accedere alla sessione di chat vocale." name="join voice chat"/>
+ <action description="Moderare la Chat di gruppo" longdescription="I membri con questo ruolo e abilità possono gestire l&apos;accesso e la partecipazione alle sessioni di chat scritta e di chat vocale nel gruppo." name="moderate group chat"/>
</action_set>
</role_actions>
diff --git a/indra/newview/skins/default/xui/it/sidepanel_appearance.xml b/indra/newview/skins/default/xui/it/sidepanel_appearance.xml
index 8dd7bfec42..df25772ffb 100644
--- a/indra/newview/skins/default/xui/it/sidepanel_appearance.xml
+++ b/indra/newview/skins/default/xui/it/sidepanel_appearance.xml
@@ -1,11 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Vestiario" name="appearance panel">
<string name="No Outfit" value="Nessun vestiario"/>
- <filter_editor label="Filtri per il vestiario" name="Filter"/>
- <panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="Mostra opzioni addizionali"/>
- <button name="newlook_btn" tool_tip="Aggiungi nuovo vestiario"/>
- <dnd_button name="trash_btn" tool_tip="Rimuovi l&apos;articolo selezionato"/>
- <button label="Indossa" name="wear_btn"/>
+ <string name="Unsaved Changes" value="Modifiche non salvate"/>
+ <string name="Now Wearing" value="Abbigliamento attuale..."/>
+ <panel name="panel_currentlook">
+ <button label="M" name="editappearance_btn"/>
+ <button label="A" name="openoutfit_btn"/>
+ <text name="currentlook_status">
+ (Stato)
+ </text>
</panel>
+ <filter_editor label="Filtri per il vestiario" name="Filter"/>
</panel>
diff --git a/indra/newview/skins/default/xui/it/sidepanel_inventory.xml b/indra/newview/skins/default/xui/it/sidepanel_inventory.xml
index 196eb75bd7..3944f8e306 100644
--- a/indra/newview/skins/default/xui/it/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/it/sidepanel_inventory.xml
@@ -2,10 +2,12 @@
<panel label="Cose" name="objects panel">
<panel label="" name="sidepanel__inventory_panel">
<panel name="button_panel">
- <button label="Profilo" name="info_btn"/>
- <button label="Indossa" name="wear_btn"/>
+ <button label="Profilo" name="info_btn" tool_tip="Mostra profilo dell&apos;oggetto"/>
+ <button label="Condividi" name="share_btn" tool_tip="Condividi un oggetto dell&apos;inventario"/>
+ <button label="Acquisti" name="shop_btn" tool_tip="Apri pagina web di Marketplace"/>
+ <button label="Indossa" name="wear_btn" tool_tip="Indossa il vestiario selezionato"/>
<button label="Riproduci" name="play_btn"/>
- <button label="Teleport" name="teleport_btn"/>
+ <button label="Teleport" name="teleport_btn" tool_tip="Teleport alla zona selezionata"/>
</panel>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/sidepanel_item_info.xml b/indra/newview/skins/default/xui/it/sidepanel_item_info.xml
index 23ca8b5ad8..e1ad1452ff 100644
--- a/indra/newview/skins/default/xui/it/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/it/sidepanel_item_info.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="item properties" title="Caratteristiche dell&apos;articolo nell&apos;Inventario">
+<panel name="item properties" title="Profilo dell&apos;oggetto">
<panel.string name="unknown">
- (Sconosciuto)
+ (sconosciuto)
</panel.string>
<panel.string name="public">
(pubblico)
@@ -10,12 +10,13 @@
Tu puoi:
</panel.string>
<panel.string name="owner_can">
- Il Proprietario può:
+ Il proprietario può:
</panel.string>
<panel.string name="acquiredDate">
[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
</panel.string>
- <text name="title" value="Caratteristiche dell&apos;articolo"/>
+ <text name="title" value="Profilo dell&apos;oggetto"/>
+ <text name="where" value="(Inventario)"/>
<panel label="">
<text name="LabelItemNameTitle">
Nome:
@@ -24,7 +25,7 @@
Descrizione:
</text>
<text name="LabelCreatorTitle">
- Creatore:
+ Ideatore:
</text>
<button label="Profilo..." name="BtnCreator"/>
<text name="LabelOwnerTitle">
@@ -35,36 +36,38 @@
Acquisito:
</text>
<text name="LabelAcquiredDate">
- Wed May 24 12:50:46 2006
+ mer 24 maggio 12:50:46 2006
</text>
- <text name="OwnerLabel">
- Tu:
- </text>
- <check_box label="Modifica" name="CheckOwnerModify"/>
- <check_box label="Copia" name="CheckOwnerCopy"/>
- <check_box label="Rivendi" name="CheckOwnerTransfer"/>
- <text name="AnyoneLabel">
- Chiunque:
- </text>
- <check_box label="Copia" name="CheckEveryoneCopy"/>
- <text name="GroupLabel">
- Gruppo:
- </text>
- <check_box label="Condividi" name="CheckShareWithGroup"/>
- <text name="NextOwnerLabel">
- Prossimo Proprietario:
- </text>
- <check_box label="Modifica" name="CheckNextOwnerModify"/>
- <check_box label="Copia" name="CheckNextOwnerCopy"/>
- <check_box label="Rivendi" name="CheckNextOwnerTransfer"/>
+ <panel name="perms_inv">
+ <text name="perm_modify">
+ Tu puoi:
+ </text>
+ <check_box label="Modifica" name="CheckOwnerModify"/>
+ <check_box label="Copia" name="CheckOwnerCopy"/>
+ <check_box label="Trasferisci" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ Chiunque:
+ </text>
+ <check_box label="Copia" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ Gruppo:
+ </text>
+ <check_box label="Condividi" name="CheckShareWithGroup" tool_tip="Consenti a tutti i membri del gruppo selezionato di condividere i tuoi diritti di modifica di questo oggetto. Per attivare le restrizioni per ruolo devi prima effettuare la cessione."/>
+ <text name="NextOwnerLabel">
+ Proprietario successivo:
+ </text>
+ <check_box label="Modifica" name="CheckNextOwnerModify"/>
+ <check_box label="Copia" name="CheckNextOwnerCopy"/>
+ <check_box label="Trasferisci" name="CheckNextOwnerTransfer" tool_tip="Il prossimo proprietario può regalare o rivendere questo oggetto"/>
+ </panel>
<check_box label="In vendita" name="CheckPurchase"/>
<combo_box name="combobox sale copy">
<combo_box.item label="Copia" name="Copy"/>
<combo_box.item label="Originale" name="Original"/>
</combo_box>
- <spinner label="Prezzo:" name="Edit Cost"/>
- <text name="CurrencySymbol">
- L$
- </text>
+ <spinner label="Prezzo: L$" name="Edit Cost"/>
+ </panel>
+ <panel name="button_panel">
+ <button label="Annulla" name="cancel_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/sidepanel_task_info.xml b/indra/newview/skins/default/xui/it/sidepanel_task_info.xml
index e5f27795be..67870d9b76 100644
--- a/indra/newview/skins/default/xui/it/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/it/sidepanel_task_info.xml
@@ -1,16 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="object properties" title="Caratteristiche dell&apos;oggetto">
+<panel name="object properties" title="Profilo dell&apos;oggetto">
<panel.string name="text deed continued">
- Intesta
+ Cessione
</panel.string>
<panel.string name="text deed">
- Intesta
+ Cessione
</panel.string>
<panel.string name="text modify info 1">
- Puoi modificare questo oggetto
+ Tu puoi modificare questo oggetto
</panel.string>
<panel.string name="text modify info 2">
- Puoi modificare questi oggetti
+ Tu puoi modificare questi oggetti
</panel.string>
<panel.string name="text modify info 3">
Non puoi modificare questo oggetto
@@ -19,101 +19,111 @@
Non puoi modificare questi oggetti
</panel.string>
<panel.string name="text modify warning">
- Questo oggetto ha parti unite
+ Questo oggetto ha parti collegate
</panel.string>
<panel.string name="Cost Default">
Prezzo: L$
</panel.string>
<panel.string name="Cost Total">
- Prezzo Totale: L$
+ Prezzo totale: L$
</panel.string>
<panel.string name="Cost Per Unit">
- Prezzo Per: L$
+ Prezzo per: L$
</panel.string>
<panel.string name="Cost Mixed">
- Prezzo assortito
+ Prezzo misto
</panel.string>
<panel.string name="Sale Mixed">
- Vendita assortita
+ Vendita mista
</panel.string>
- <panel label="">
+ <text name="title" value="Profilo dell&apos;oggetto"/>
+ <text name="where" value="(in Second Life)"/>
+ <panel label="" name="properties_panel">
<text name="Name:">
Nome:
</text>
<text name="Description:">
Descrizione:
</text>
- <text name="Creator:">
- Creatore:
+ <text name="CreatorNameLabel">
+ Ideatore:
+ </text>
+ <text name="Creator Name">
+ Erica Linden
</text>
<text name="Owner:">
Proprietario:
</text>
- <text name="Group:">
+ <text name="Owner Name">
+ Erica Linden
+ </text>
+ <text name="Group_label">
Gruppo:
</text>
- <button name="button set group" tool_tip="Scegli un gruppo per condividere i permessi di questo oggetto"/>
- <name_box initial_value="Caricando..." name="Group Name Proxy"/>
- <button label="Intesta" label_selected="Intesta" name="button deed" tool_tip="Intestando questo oggetto lo passa con i permessi del prossimo proprietario. Gli oggetti condivisi dal Gruppo possono essere intestati solo da un Officer del gruppo."/>
- <check_box label="Condividi" name="checkbox share with group" tool_tip="Permetti a tutti i Membri del gruppo impostato di condividere la tua modifica ai permessi di questo oggetto. Tu devi Intestare per consentire le restrizioni al ruolo."/>
+ <button name="button set group" tool_tip="Scegli un gruppo con cui condividere i diritti relativi all&apos;oggetto"/>
+ <name_box initial_value="Caricamento in corso..." name="Group Name Proxy"/>
+ <button label="Cessione" label_selected="Cessione" name="button deed" tool_tip="Con una cessione si trasferisce il bene con i diritti al proprietario successivo Gli oggetti in proprietà condivisa di gruppo possono essere ceduti soltanto da un funzionario del gruppo."/>
<text name="label click action">
- Clicca per:
+ Fai clic per:
</text>
<combo_box name="clickaction">
- <combo_box.item label="Tocca (default)" name="Touch/grab(default)"/>
- <combo_box.item label="Siedi sull&apos;oggetto" name="Sitonobject"/>
- <combo_box.item label="Compra l&apos;oggetto" name="Buyobject"/>
- <combo_box.item label="Paga l&apos;ogggetto" name="Payobject"/>
+ <combo_box.item label="Tocca (predefinito)" name="Touch/grab(default)"/>
+ <combo_box.item label="Siediti sull&apos;oggetto" name="Sitonobject"/>
+ <combo_box.item label="Acquista oggetto" name="Buyobject"/>
+ <combo_box.item label="Paga oggetto" name="Payobject"/>
<combo_box.item label="Apri" name="Open"/>
</combo_box>
- <check_box label="In Vendita:" name="checkbox for sale"/>
- <combo_box name="sale type">
- <combo_box.item label="Copia" name="Copy"/>
- <combo_box.item label="Contenuti" name="Contents"/>
- <combo_box.item label="Originale" name="Original"/>
- </combo_box>
- <spinner label="Prezzo: L$" name="Edit Cost"/>
- <check_box label="Mostra nella ricerca" name="search_check" tool_tip="Mostra questo oggetto nei risultati della ricerca"/>
- <panel name="perms_build">
+ <panel name="perms_inv">
<text name="perm_modify">
- Puoi modificare questo oggetto
+ Tu puoi modificare questo oggetto
</text>
<text name="Anyone can:">
Chiunque:
</text>
- <check_box label="Sposta" name="checkbox allow everyone move"/>
<check_box label="Copia" name="checkbox allow everyone copy"/>
- <text name="Next owner can:">
- Prossimo Proprietario:
+ <check_box label="Sposta" name="checkbox allow everyone move"/>
+ <text name="GroupLabel">
+ Gruppo:
+ </text>
+ <check_box label="Condividi" name="checkbox share with group" tool_tip="Consenti a tutti i membri del gruppo selezionato di condividere i tuoi diritti di modifica di questo oggetto. Per attivare le restrizioni per ruolo devi prima effettuare la cessione."/>
+ <text name="NextOwnerLabel">
+ Proprietario successivo:
</text>
<check_box label="Modifica" name="checkbox next owner can modify"/>
<check_box label="Copia" name="checkbox next owner can copy"/>
- <check_box label="Transfer" name="checkbox next owner can transfer" tool_tip="Prossimo proprietario può regalare o rivendere questo oggetto"/>
- <text name="B:">
- B:
- </text>
- <text name="O:">
- O:
- </text>
- <text name="G:">
- G:
- </text>
- <text name="E:">
- E:
- </text>
- <text name="N:">
- N:
- </text>
- <text name="F:">
- F:
- </text>
+ <check_box label="Trasferisci" name="checkbox next owner can transfer" tool_tip="Il prossimo proprietario può regalare o rivendere questo oggetto"/>
</panel>
+ <check_box label="In vendita" name="checkbox for sale"/>
+ <combo_box name="sale type">
+ <combo_box.item label="Copia" name="Copy"/>
+ <combo_box.item label="Contenuto" name="Contents"/>
+ <combo_box.item label="Originale" name="Original"/>
+ </combo_box>
+ <spinner label="Prezzo: L$" name="Edit Cost"/>
+ <check_box label="Mostra nella ricerca" name="search_check" tool_tip="Permetti alle persone di vedere questo oggetto nei risultati della ricerca"/>
+ <text name="B:">
+ B:
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ E:
+ </text>
+ <text name="N:">
+ N:
+ </text>
+ <text name="F:">
+ F:
+ </text>
</panel>
<panel name="button_panel">
<button label="Apri" name="open_btn"/>
<button label="Paga" name="pay_btn"/>
- <button label="Compra" name="buy_btn"/>
- <button label="Cancella" name="cancel_btn"/>
- <button label="Salva" name="save_btn"/>
+ <button label="Acquista" name="buy_btn"/>
+ <button label="Dettagli" name="details_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml
index 910e6e0960..d601c27d28 100644
--- a/indra/newview/skins/default/xui/it/strings.xml
+++ b/indra/newview/skins/default/xui/it/strings.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- This file contains strings that used to be hardcoded in the source.
It is only for those strings which do not belong in a floater.
- For example, the strings used in avatar chat bubbles, and strings
+ For example, the strings used in avatar chat bubbles, and strings
that are returned from one component and may appear in many places-->
<strings>
<string name="SECOND_LIFE">
@@ -10,6 +10,9 @@
<string name="APP_NAME">
Second Life
</string>
+ <string name="CAPITALIZED_APP_NAME">
+ SECOND LIFE
+ </string>
<string name="SUPPORT_SITE">
Portale di supporto di Second Life
</string>
@@ -17,13 +20,28 @@
Ricerca hardware...
</string>
<string name="StartupLoading">
- In Caricamento
+ Caricamento di [APP_NAME]...
+ </string>
+ <string name="StartupClearingCache">
+ Pulizia della cache...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ Inizializzazione della cache texture...
+ </string>
+ <string name="StartupInitializingVFS">
+ Inizializzazione VFS...
+ </string>
+ <string name="ProgressRestoring">
+ Ripristino in corso...
+ </string>
+ <string name="ProgressChangingResolution">
+ Modifica della risoluzione...
</string>
<string name="LoginInProgress">
In connessione. [APP_NAME] può sembrare rallentata. Attendi.
</string>
<string name="LoginInProgressNoFrozen">
- Logging in...
+ Accesso in corso...
</string>
<string name="LoginAuthenticating">
In autenticazione
@@ -76,11 +94,32 @@
<string name="LoginDownloadingClothing">
Sto caricando i vestiti...
</string>
+ <string name="InvalidCertificate">
+ Il server ha inviato un certificato non valido o errato. Rivolgiti all&apos;amministratore della griglia.
+ </string>
+ <string name="CertInvalidHostname">
+ Per accedere al server è stato utilizzato un nome host non valido; controlla lo SLURL o il nome host della griglia.
+ </string>
+ <string name="CertExpired">
+ Il certificato inviato dalla griglia sembra essere scaduto. Controlla l&apos;orologio del sistema o rivolgiti all&apos;amministratore della griglia.
+ </string>
+ <string name="CertKeyUsage">
+ Impossibile utilizzare per SSl il certificato inviato dal server. Rivolgiti all&apos;amministratore della griglia.
+ </string>
+ <string name="CertBasicConstraints">
+ Nella catena dei certificati del server erano presenti troppi certificati. Rivolgiti all&apos;amministratore della griglia.
+ </string>
+ <string name="CertInvalidSignature">
+ Impossibile verificare la firma del certificato inviato dal server della griglia. Rivolgiti all&apos;amministratore della griglia.
+ </string>
<string name="LoginFailedNoNetwork">
Errore di rete: Non è stato possibile stabilire un collegamento, controlla la tua connessione.
</string>
+ <string name="LoginFailed">
+ Accesso non riuscito.
+ </string>
<string name="Quit">
- Termina
+ Esci
</string>
<string name="create_account_url">
http://join.secondlife.com/index.php?lang=it-IT
@@ -88,6 +127,24 @@
<string name="AgentLostConnection">
Questa regione sta avendo problemi. Verifica la tua connessione a Internet.
</string>
+ <string name="SavingSettings">
+ Salvataggio delle impostazioni...
+ </string>
+ <string name="LoggingOut">
+ Uscita...
+ </string>
+ <string name="ShuttingDown">
+ Chiusura...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ Sei scollegato dalla regione in cui ti trovavi.
+ </string>
+ <string name="SentToInvalidRegion">
+ Sei stato indirizzato in una regione non valida.
+ </string>
+ <string name="TestingDisconnect">
+ Verifica scollegamento viewer
+ </string>
<string name="TooltipPerson">
Persona
</string>
@@ -140,7 +197,25 @@
Clicca per avere maggiori informazioni sul luogo
</string>
<string name="TooltipAgentUrl">
- Clicca per vedere il profilo del residente
+ Clicca per vedere il profilo di questo residente
+ </string>
+ <string name="TooltipAgentMute">
+ Clicca per disattivare l&apos;audio di questo residente
+ </string>
+ <string name="TooltipAgentUnmute">
+ Clicca per attivare l&apos;audio del residente
+ </string>
+ <string name="TooltipAgentIM">
+ Clicca per inviare un IM a questo residente
+ </string>
+ <string name="TooltipAgentPay">
+ Clicca per pagare il residente
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Fai clic per inviare un&apos;offerta di teleport al residente
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Fai clic per inviare una richiesta di amicizia al residente
</string>
<string name="TooltipGroupUrl">
Clicca per vedere la descrizione del gruppo
@@ -152,10 +227,10 @@
Clicca per vedere questa inserzione
</string>
<string name="TooltipParcelUrl">
- Clicca per vedere la descrizione della parcel
+ Clicca per vedere la descrizione del lotto
</string>
<string name="TooltipTeleportUrl">
- Clicca per teleportarti a questa destinazione
+ Clicca per effettuare il teleport a questa destinazione
</string>
<string name="TooltipObjectIMUrl">
Clicca per vedere la descrizione dell&apos;oggetto
@@ -166,19 +241,41 @@
<string name="TooltipSLAPP">
Clicca per avviare il comando secondlife://
</string>
- <string name="CurrentURL" value=" URL attuale: [CurrentURL]"/>
+ <string name="CurrentURL" value="URL attuale: [CurrentURL]"/>
+ <string name="TooltipPrice" value="L$ [PRICE]-"/>
<string name="SLurlLabelTeleport">
Teleportati a
</string>
<string name="SLurlLabelShowOnMap">
Mostra la mappa per
</string>
+ <string name="SLappAgentMute">
+ Disattiva audio
+ </string>
+ <string name="SLappAgentUnmute">
+ Riattiva audio
+ </string>
+ <string name="SLappAgentIM">
+ IM
+ </string>
+ <string name="SLappAgentPay">
+ Paga
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Offri teleport a
+ </string>
+ <string name="SLappAgentRequestFriend">
+ Richiesta di amicizia
+ </string>
<string name="BUTTON_CLOSE_DARWIN">
- Chiudi (&#8984;W)
+ Chiudi (⌘W)
</string>
<string name="BUTTON_CLOSE_WIN">
Chiudi (Ctrl+W)
</string>
+ <string name="BUTTON_CLOSE_CHROME">
+ Chiudi
+ </string>
<string name="BUTTON_RESTORE">
Ripristina
</string>
@@ -191,14 +288,11 @@
<string name="BUTTON_DOCK">
Àncora
</string>
- <string name="BUTTON_UNDOCK">
- Disàncora
- </string>
<string name="BUTTON_HELP">
- Mostra gli aiuti
+ Mostra Aiuto
</string>
<string name="Searching">
- In ricerca...
+ Ricerca in corso...
</string>
<string name="NoneFound">
Nessun risultato.
@@ -218,12 +312,12 @@
<string name="AvatarNameWaiting">
(in attesa)
</string>
- <string name="AvatarNameHippos">
- (hippos)
- </string>
<string name="GroupNameNone">
(nessuno)
</string>
+ <string name="AvalineCaller">
+ Chiamante Avaline [ORDER]
+ </string>
<string name="AssetErrorNone">
Nessun errore
</string>
@@ -267,19 +361,19 @@
biglietto da visita
</string>
<string name="landmark">
- landmark
+ punto di riferimento
</string>
<string name="legacy script">
script (vecchia versione)
</string>
<string name="clothing">
- abito
+ vestiario
</string>
<string name="object">
oggetto
</string>
<string name="note card">
- notecard
+ biglietto
</string>
<string name="folder">
cartella
@@ -309,7 +403,7 @@
immagine targa
</string>
<string name="trash">
- cestino
+ Cestino
</string>
<string name="jpeg image">
immagine jpeg
@@ -329,6 +423,9 @@
<string name="symbolic link">
link
</string>
+ <string name="symbolic folder link">
+ link alla cartella
+ </string>
<string name="AvatarAway">
Assente
</string>
@@ -546,7 +643,7 @@
Si
</string>
<string name="texture_loading">
- In Caricamento...
+ Caricamento in corso...
</string>
<string name="worldmap_offline">
Offline
@@ -581,6 +678,9 @@
<string name="hang_up">
Disconnesso dalla Voice Chat in-world
</string>
+ <string name="reconnect_nearby">
+ Sarai riconnesso alla chat vocale nei dintorni
+ </string>
<string name="ScriptQuestionCautionChatGranted">
A &apos;[OBJECTNAME]&apos;, un oggetto di proprietà di &apos;[OWNERNAME]&apos;, situato in [REGIONNAME] [REGIONPOS], è stato concesso il permesso di: [PERMISSIONS].
</string>
@@ -621,13 +721,13 @@
Controllare la tua fotocamera
</string>
<string name="SIM_ACCESS_PG">
- PG
+ Generale
</string>
<string name="SIM_ACCESS_MATURE">
- Mature
+ Moderato
</string>
<string name="SIM_ACCESS_ADULT">
- Adult
+ Adulti
</string>
<string name="SIM_ACCESS_DOWN">
Offline
@@ -638,6 +738,12 @@
<string name="land_type_unknown">
(sconosciuto)
</string>
+ <string name="Estate / Full Region">
+ Proprietà immobiliare / Regione completa
+ </string>
+ <string name="Mainland / Full Region">
+ Continente / Regione completa
+ </string>
<string name="all_files">
Tutti i file
</string>
@@ -684,25 +790,25 @@
Scegli la cartella
</string>
<string name="AvatarSetNotAway">
- Imposta non assente
+ Imposta come non assente
</string>
<string name="AvatarSetAway">
- Imposta assente
+ Imposta come assente
</string>
<string name="AvatarSetNotBusy">
- Imposta non occupato
+ Imposta come non occupato
</string>
<string name="AvatarSetBusy">
- Imposta occupato
+ Imposta come occupato
</string>
<string name="shape">
- Shape
+ Figura corporea
</string>
<string name="skin">
- Skin
+ Pelle
</string>
<string name="hair">
- Capelli
+ Capigliature
</string>
<string name="eyes">
Occhi
@@ -717,7 +823,7 @@
Scarpe
</string>
<string name="socks">
- Calze
+ Calzini
</string>
<string name="jacket">
Giacca
@@ -729,7 +835,7 @@
Maglietta intima
</string>
<string name="underpants">
- slip
+ Slip
</string>
<string name="skirt">
Gonna
@@ -743,17 +849,59 @@
<string name="invalid">
non valido
</string>
+ <string name="shirt_not_worn">
+ Camicia non indossata
+ </string>
+ <string name="pants_not_worn">
+ Pantaloni non indossati
+ </string>
+ <string name="shoes_not_worn">
+ Scarpe non indossate
+ </string>
+ <string name="socks_not_worn">
+ Calzini non indossati
+ </string>
+ <string name="jacket_not_worn">
+ Giacca non indossata
+ </string>
+ <string name="gloves_not_worn">
+ Guanti non indossati
+ </string>
+ <string name="undershirt_not_worn">
+ Maglietta intima non indossata
+ </string>
+ <string name="underpants_not_worn">
+ Slip non indossati
+ </string>
+ <string name="skirt_not_worn">
+ Gonna non indossata
+ </string>
+ <string name="alpha_not_worn">
+ Alpha non portato
+ </string>
+ <string name="tattoo_not_worn">
+ Tatuaggio non portato
+ </string>
+ <string name="invalid_not_worn">
+ non valido
+ </string>
+ <string name="NewWearable">
+ Nuovo [WEARABLE_ITEM]
+ </string>
+ <string name="CreateNewWearable">
+ Crea [WEARABLE_TYPE]
+ </string>
<string name="next">
- Seguente
+ Avanti
</string>
<string name="ok">
OK
</string>
<string name="GroupNotifyGroupNotice">
- Notice di gruppo
+ Avviso di gruppo
</string>
<string name="GroupNotifyGroupNotices">
- Notice di gruppo
+ Avvisi di gruppo
</string>
<string name="GroupNotifySentBy">
Inviato da
@@ -762,7 +910,7 @@
Allegato:
</string>
<string name="GroupNotifyViewPastNotices">
- Visualizza i notice passati o scegli qui di non riceverne.
+ Visualizza gli avvisi precedenti o scegli qui di non riceverne.
</string>
<string name="GroupNotifyOpenAttachment">
Apri l&apos;allegato
@@ -771,13 +919,10 @@
Salva l&apos;allegato
</string>
<string name="TeleportOffer">
- Offerta di Teletrasporto
- </string>
- <string name="StartUpNotification">
- [%d] una nuova notifica è arrivata mentre eri assente...
+ Offerta di Teleport
</string>
<string name="StartUpNotifications">
- [%d] nuove notifice sono arrivate mentre eri assente...
+ Mentre eri assente sono arrivate nuove notifiche...
</string>
<string name="OverflowInfoChannelString">
Hai ancora [%d] notifiche
@@ -810,49 +955,56 @@
Alto
</string>
<string name="LeaveMouselook">
- Premi ESC per tornare in visulizzazione normale
+ Premi ESC per tornare in visualizzazione normale
</string>
<string name="InventoryNoMatchingItems">
- Nessun oggetto corrispondente trovato in inventario.
+ Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/all/[SEARCH_TERM] Cerca].
+ </string>
+ <string name="PlacesNoMatchingItems">
+ Non riesci a trovare quello che cerchi? Prova [secondlife:///app/search/places/[SEARCH_TERM] Cerca].
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ Trascina qui un punto di riferimento per aggiungerlo ai Preferiti.
</string>
<string name="InventoryNoTexture">
- Non hai una copia
-di questa texture in inventario.
- </string>
- <string name="no_transfer" value=" (no transfer)"/>
- <string name="no_modify" value=" (no modify)"/>
- <string name="no_copy" value=" (no copy)"/>
- <string name="worn" value=" (indossato)"/>
- <string name="link" value=" (link)"/>
- <string name="broken_link" value=" (broken_link)"/>
+ Non hai una copia di questa texture nel tuo inventario
+ </string>
+ <string name="no_transfer" value="(nessun trasferimento)"/>
+ <string name="no_modify" value="(nessuna modifica)"/>
+ <string name="no_copy" value="(nessuna copia)"/>
+ <string name="worn" value="(indossato)"/>
+ <string name="link" value="(link)"/>
+ <string name="broken_link" value="(broken_link)&quot;"/>
<string name="LoadingContents">
- Contenuto in caricamento...
+ Caricamento del contenuto...
</string>
<string name="NoContents">
Nessun contenuto
</string>
- <string name="WornOnAttachmentPoint" value=" (indossato su [ATTACHMENT_POINT])"/>
- <string name="Chat" value=" Chat :"/>
- <string name="Sound" value=" Suono :"/>
- <string name="Wait" value=" --- Attendi :"/>
- <string name="AnimFlagStop" value=" Ferma l&apos;Animazione :"/>
- <string name="AnimFlagStart" value=" Inizia l&apos;Animazione :"/>
- <string name="Wave" value=" Wave"/>
- <string name="HelloAvatar" value=" Ciao, avatar!"/>
- <string name="ViewAllGestures" value=" Visualizza tutte le gesture &gt;&gt;"/>
- <string name="Animations" value=" Animazioni,"/>
- <string name="Calling Cards" value=" Biglietti da visita,"/>
- <string name="Clothing" value=" Vestiti,"/>
- <string name="Gestures" value=" Gesture,"/>
- <string name="Landmarks" value=" Landmark,"/>
- <string name="Notecards" value=" Notecard,"/>
- <string name="Objects" value=" Oggetti,"/>
- <string name="Scripts" value=" Script,"/>
- <string name="Sounds" value=" Suoni,"/>
- <string name="Textures" value=" Texture,"/>
- <string name="Snapshots" value=" Fotografie,"/>
- <string name="No Filters" value="No "/>
- <string name="Since Logoff" value=" - Dalla disconnessione"/>
+ <string name="WornOnAttachmentPoint" value="(indossato su [ATTACHMENT_POINT])"/>
+ <string name="ActiveGesture" value="[GESLABEL] (attivo)"/>
+ <string name="Chat" value="Chat :"/>
+ <string name="Sound" value="Suono :"/>
+ <string name="Wait" value="--- Attendi :"/>
+ <string name="AnimFlagStop" value="Ferma l&apos;animazione :"/>
+ <string name="AnimFlagStart" value="Inizia l&apos;animazione :"/>
+ <string name="Wave" value="Saluta con la mano"/>
+ <string name="HelloAvatar" value="Ciao, avatar!"/>
+ <string name="ViewAllGestures" value="Visualizza tutto &gt;&gt;"/>
+ <string name="GetMoreGestures" value="Altre &gt;&gt;"/>
+ <string name="Animations" value="Animazioni,"/>
+ <string name="Calling Cards" value="Biglietti da visita,"/>
+ <string name="Clothing" value="Vestiti,"/>
+ <string name="Gestures" value="Gesture,"/>
+ <string name="Landmarks" value="Punti di riferimento,"/>
+ <string name="Notecards" value="Biglietti,"/>
+ <string name="Objects" value="Oggetti,"/>
+ <string name="Scripts" value="Script,"/>
+ <string name="Sounds" value="Suoni,"/>
+ <string name="Textures" value="Texture,"/>
+ <string name="Snapshots" value="Fotografie,"/>
+ <string name="No Filters" value="No"/>
+ <string name="Since Logoff" value="- Dall&apos;uscita"/>
<string name="InvFolder My Inventory">
Il mio inventario
</string>
@@ -869,22 +1021,22 @@ di questa texture in inventario.
Suoni
</string>
<string name="InvFolder Calling Cards">
- Biglieti da visita
+ Biglietti da visita
</string>
<string name="InvFolder Landmarks">
- Landmark
+ Punti di riferimento
</string>
<string name="InvFolder Scripts">
Script
</string>
<string name="InvFolder Clothing">
- Vestiti
+ Vestiario
</string>
<string name="InvFolder Objects">
Oggetti
</string>
<string name="InvFolder Notecards">
- Notecard
+ Biglietti
</string>
<string name="InvFolder New Folder">
Nuova cartella
@@ -920,22 +1072,25 @@ di questa texture in inventario.
Preferiti
</string>
<string name="InvFolder Current Outfit">
- Outfit attuale
+ Abbigliamento attuale
</string>
<string name="InvFolder My Outfits">
- I miei Outfit
+ Il mio vestiario
+ </string>
+ <string name="InvFolder Accessories">
+ Accessori
</string>
<string name="InvFolder Friends">
Amici
</string>
<string name="InvFolder All">
- Tutti
+ Tutto
</string>
<string name="Buy">
- Compra
+ Acquista
</string>
<string name="BuyforL$">
- Compra per L$
+ Acquista per L$
</string>
<string name="Stone">
Pietra
@@ -962,7 +1117,7 @@ di questa texture in inventario.
Luce
</string>
<string name="KBShift">
- Shift
+ Maiusc
</string>
<string name="KBCtrl">
Ctrl
@@ -1112,13 +1267,13 @@ di questa texture in inventario.
[COUNT] giorni
</string>
<string name="GroupMembersA">
- [COUNT] membro
+ [COUNT] iscritto
</string>
<string name="GroupMembersB">
- [COUNT] membri
+ [COUNT] iscritti
</string>
<string name="GroupMembersC">
- [COUNT] membri
+ [COUNT] iscritti
</string>
<string name="AcctTypeResident">
Residente
@@ -1127,10 +1282,10 @@ di questa texture in inventario.
In prova
</string>
<string name="AcctTypeCharterMember">
- Membro onorario
+ Socio onorario
</string>
<string name="AcctTypeEmployee">
- Impiegato Linden Lab
+ Dipendente Linden Lab
</string>
<string name="PaymentInfoUsed">
Informazioni di pagamento usate
@@ -1139,7 +1294,7 @@ di questa texture in inventario.
Informazioni di pagamento registrate
</string>
<string name="NoPaymentInfoOnFile">
- Nessuna informazione di pagamento
+ Nessuna informazione di pagamento disponibile
</string>
<string name="AgeVerified">
Età verificata
@@ -1154,7 +1309,7 @@ di questa texture in inventario.
In alto a destra
</string>
<string name="Top">
- In alto
+ in alto
</string>
<string name="Top Left">
In alto a sinistra
@@ -1196,22 +1351,22 @@ di questa texture in inventario.
ricompila
</string>
<string name="ResetQueueTitle">
- Avanzamento reset
+ Azzera avanzamento
</string>
<string name="ResetQueueStart">
- reset
+ azzera
</string>
<string name="RunQueueTitle">
- Avanzamento attivazione
+ Attiva avanzamento
</string>
<string name="RunQueueStart">
- Attiva
+ attiva
</string>
<string name="NotRunQueueTitle">
- Avanzamento disattivazione
+ Disattiva avanzamento
</string>
<string name="NotRunQueueStart">
- Disattivazione
+ disattiva
</string>
<string name="CompileSuccessful">
Compilazione riuscita!
@@ -1231,18 +1386,18 @@ di questa texture in inventario.
<string name="GroupsNone">
nessuno
</string>
- <string name="Group" value=" (gruppo)"/>
+ <string name="Group" value="(gruppo)"/>
<string name="Unknown">
(Sconosciuto)
</string>
<string name="SummaryForTheWeek" value="Riassunto della settimana, partendo dal"/>
- <string name="NextStipendDay" value="Il prossimo giorno di stipendio è "/>
- <string name="GroupIndividualShare" value=" Gruppo Dividendi individuali"/>
+ <string name="NextStipendDay" value="Il prossimo giorno di stipendio è"/>
+ <string name="GroupIndividualShare" value="Gruppo Dividendi individuali"/>
<string name="Balance">
Saldo
</string>
<string name="Credits">
- Crediti
+ Ringraziamenti
</string>
<string name="Debits">
Debiti
@@ -1257,7 +1412,7 @@ di questa texture in inventario.
Proprietà principale
</string>
<string name="IMMainland">
- mainland
+ continente
</string>
<string name="IMTeen">
teen
@@ -1266,20 +1421,173 @@ di questa texture in inventario.
errore
</string>
<string name="RegionInfoAllEstatesOwnedBy">
- la proprietà posseduta da [OWNER]
+ tutte le proprietà immobiliari di [OWNER]
</string>
<string name="RegionInfoAllEstatesYouOwn">
- Le proprietà che possiedi
+ tutte le tue proprietà immobiliari
</string>
<string name="RegionInfoAllEstatesYouManage">
- Le proprietà di cui sei manager per conto di [OWNER]
+ tutte le proprietà immobiliari che gestisci per conto di [OWNER]
</string>
<string name="RegionInfoAllowedResidents">
- Residenti ammessi: ([ALLOWEDAGENTS], massimo [MAXACCESS])
+ Residenti consentiti: ([ALLOWEDAGENTS], massimo [MAXACCESS])
</string>
<string name="RegionInfoAllowedGroups">
Gruppi ammessi: ([ALLOWEDGROUPS], massimo [MAXACCESS])
</string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ Memoria dello script del lotto
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ Lotti in elenco: [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ Memoria utilizzata: [COUNT] kb di [MAX] kb; [AVAILABLE] kb disponibili
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ Memoria utilizzata: [COUNT] kb
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ URL degli script lotti
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ URL utilizzati: [COUNT] di [MAX]; [AVAILABLE] disponibili
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ URL utilizzati: [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Errore nella richiesta di informazioni
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ Nessun lotto selezionato
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ Errore: le informazioni sullo script sono disponibili solo nella tua regione attuale
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ Recupero informazioni in corso...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ Non hai il permesso di visionare questo lotto
+ </string>
+ <string name="SITTING_ON">
+ Seduto su
+ </string>
+ <string name="ATTACH_CHEST">
+ Petto
+ </string>
+ <string name="ATTACH_HEAD">
+ Testa
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ Spalla sinistra
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ Spalla destra
+ </string>
+ <string name="ATTACH_LHAND">
+ Mano sinistra
+ </string>
+ <string name="ATTACH_RHAND">
+ Mano destra
+ </string>
+ <string name="ATTACH_LFOOT">
+ Piede sinisto
+ </string>
+ <string name="ATTACH_RFOOT">
+ Piede destro
+ </string>
+ <string name="ATTACH_BACK">
+ Indietro
+ </string>
+ <string name="ATTACH_PELVIS">
+ Pelvi
+ </string>
+ <string name="ATTACH_MOUTH">
+ Bocca
+ </string>
+ <string name="ATTACH_CHIN">
+ Mento
+ </string>
+ <string name="ATTACH_LEAR">
+ Orecchio sinistro
+ </string>
+ <string name="ATTACH_REAR">
+ Orecchio destro
+ </string>
+ <string name="ATTACH_LEYE">
+ Occhio sinistro
+ </string>
+ <string name="ATTACH_REYE">
+ Occhio destro
+ </string>
+ <string name="ATTACH_NOSE">
+ Naso
+ </string>
+ <string name="ATTACH_RUARM">
+ Braccio destro
+ </string>
+ <string name="ATTACH_RLARM">
+ Avambraccio destro
+ </string>
+ <string name="ATTACH_LUARM">
+ Braccio sinistro
+ </string>
+ <string name="ATTACH_LLARM">
+ Avambraccio sinistro
+ </string>
+ <string name="ATTACH_RHIP">
+ Anca destra
+ </string>
+ <string name="ATTACH_RULEG">
+ Coscia destra
+ </string>
+ <string name="ATTACH_RLLEG">
+ Coscia destra
+ </string>
+ <string name="ATTACH_LHIP">
+ Anca sinista
+ </string>
+ <string name="ATTACH_LULEG">
+ Coscia sinistra
+ </string>
+ <string name="ATTACH_LLLEG">
+ Polpaccio sinistro
+ </string>
+ <string name="ATTACH_BELLY">
+ Addome
+ </string>
+ <string name="ATTACH_RPEC">
+ Petto destro
+ </string>
+ <string name="ATTACH_LPEC">
+ Petto sinistro
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ HUD in centro 2
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ HUD alto a destra
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ HUD alto in centro
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ HUD alto a sinistra
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ HUD in centro 1
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ HUD basso a sinistra
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ HUD basso
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ HUD basso a destra
+ </string>
<string name="CursorPos">
Riga [LINE], Colonna [COLUMN]
</string>
@@ -1287,33 +1595,40 @@ di questa texture in inventario.
[COUNT] trovato/i
</string>
<string name="PanelContentsNewScript">
- Nuovo Script
+ Nuovo script
+ </string>
+ <string name="PanelContentsTooltip">
+ Contenuto dell&apos;oggetto
+ </string>
+ <string name="BusyModeResponseDefault">
+ Il residente al quale hai inviato un messaggio è in modalità &apos;occupato&apos;, ovvero ha chiesto di non essere disturbato. Il tuo messaggio comparirà nel suo pannello IM, dove potrà essere letto in un secondo momento.
</string>
<string name="MuteByName">
- (per nome)
+ (In base al nome)
</string>
<string name="MuteAgent">
- (residente)
+ (Residente)
</string>
<string name="MuteObject">
- (oggetto)
+ (Oggetto)
</string>
<string name="MuteGroup">
- (gruppo)
+ (Gruppo)
+ </string>
+ <string name="MuteExternal">
+ (esterno)
</string>
<string name="RegionNoCovenant">
- Non esiste nessun regolamento per questa proprietà.
+ Non esiste alcun regolamento per questa proprietà.
</string>
<string name="RegionNoCovenantOtherOwner">
- Non esiste nessun regolamento per questa proprietà. Il terreno di questa proprietà è messo in vendita dal proprietario, non dalla Linden Lab. Contatta il proprietario del terreno per i dettagli della vendita.
+ Non esiste alcun regolamento per questa proprietà. Il terreno di questa proprietà è messo in vendita dal proprietario, non dalla Linden Lab. Contatta il proprietario del terreno per i dettagli della vendita.
</string>
- <string name="covenant_last_modified">
- Ultima modifica:
- </string>
- <string name="none_text" value=" (nessuno) "/>
- <string name="never_text" value=" (mai) "/>
+ <string name="covenant_last_modified" value="Ultima modifica:"/>
+ <string name="none_text" value="(nessuno)"/>
+ <string name="never_text" value="(mai)"/>
<string name="GroupOwned">
- Posseduta da un gruppo
+ Di proprietà di un gruppo
</string>
<string name="Public">
Pubblica
@@ -1324,26 +1639,35 @@ di questa texture in inventario.
<string name="ClassifiedUpdateAfterPublish">
(si aggiornerà dopo la pubblicazione)
</string>
+ <string name="NoPicksClassifiedsText">
+ Non hai creato luoghi preferiti né inserzioni. Clicca il pulsante + qui sotto per creare un luogo preferito o un&apos;inserzione.
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ L&apos;utente non ha luoghi preferiti né inserzioni
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ Caricamento in corso...
+ </string>
<string name="MultiPreviewTitle">
Anteprima
</string>
<string name="MultiPropertiesTitle">
- Proprietà
+ Beni immobiliari
</string>
<string name="InvOfferAnObjectNamed">
- Un oggetto chiamato
+ Un oggetto denominato
</string>
<string name="InvOfferOwnedByGroup">
- Posseduto dal gruppo
+ di proprietà del gruppo
</string>
<string name="InvOfferOwnedByUnknownGroup">
- Posseduto da un gruppo sconosciuto
+ di proprietà di un gruppo sconosciuto
</string>
<string name="InvOfferOwnedBy">
- Posseduto da
+ di proprietà di
</string>
<string name="InvOfferOwnedByUnknownUser">
- Posseduto da un&apos;utente sconosciuto
+ di proprietà di un utente sconosciuto
</string>
<string name="InvOfferGaveYou">
Ti ha offerto
@@ -1379,7 +1703,7 @@ di questa texture in inventario.
Saldo
</string>
<string name="GroupMoneyCredits">
- Crediti
+ Ringraziamenti
</string>
<string name="GroupMoneyDebits">
Debiti
@@ -1391,32 +1715,38 @@ di questa texture in inventario.
Oggetti acquisiti
</string>
<string name="Cancel">
- Cancella
+ Annulla
</string>
<string name="UploadingCosts">
- Costi di caricamento [%s]
+ Il caricamento di [NAME] costa L$ [AMOUNT]
+ </string>
+ <string name="BuyingCosts">
+ L&apos;acquisto di [NAME] costa L$ [AMOUNT]
</string>
<string name="UnknownFileExtension">
Estensione del file sconosciuta [.%s]
Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
</string>
+ <string name="MuteObject2">
+ Blocca
+ </string>
<string name="AddLandmarkNavBarMenu">
- Aggiungi landmark...
+ Aggiungi punto di riferimento...
</string>
<string name="EditLandmarkNavBarMenu">
- Modifica landmark...
+ Modifica punto di riferimento...
</string>
<string name="accel-mac-control">
- &#8963;
+ ⌃
</string>
<string name="accel-mac-command">
- &#8984;
+ ⌘
</string>
<string name="accel-mac-option">
- &#8997;
+ ⌥
</string>
<string name="accel-mac-shift">
- &#8679;
+ ⇧
</string>
<string name="accel-win-control">
Ctrl+
@@ -1428,22 +1758,22 @@ Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
Shift+
</string>
<string name="FileSaved">
- File Salvato
+ File salvato
</string>
<string name="Receiving">
In ricezione
</string>
<string name="AM">
- AM
+ antemeridiane
</string>
<string name="PM">
- PM
+ pomeridiane
</string>
<string name="PST">
- PST
+ Ora Pacifico
</string>
<string name="PDT">
- PDT
+ Ora legale Pacifico
</string>
<string name="Forward">
Avanti
@@ -1455,7 +1785,7 @@ Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
Destra
</string>
<string name="Back">
- Dietro
+ Indietro
</string>
<string name="North">
Nord
@@ -1476,13 +1806,13 @@ Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
Giù
</string>
<string name="Any Category">
- Tutte le categorie
+ Qualsiasi categoria
</string>
<string name="Shopping">
- Shopping
+ Acquisti
</string>
<string name="Land Rental">
- Affitto terreni
+ Affitto terreno
</string>
<string name="Property Rental">
Affitto proprietà
@@ -1494,13 +1824,13 @@ Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
Nuovi prodotti
</string>
<string name="Employment">
- Impiego
+ Lavoro
</string>
<string name="Wanted">
- Richiesti
+ Cercasi
</string>
<string name="Service">
- Servizi
+ Servizio
</string>
<string name="Personal">
Personale
@@ -1539,7 +1869,7 @@ Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
Residenziale
</string>
<string name="Stage">
- Stage
+ Fase
</string>
<string name="Other">
Altro
@@ -1551,10 +1881,10 @@ Tipi conosciuti .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
Tu
</string>
<string name="Multiple Media">
- Media Multipli
+ Più supporti
</string>
<string name="Play Media">
- Media Play/Pausa
+ Riproduci/Pausa supporto
</string>
<string name="MBCmdLineError">
Un errore è stato riscontrato analizzando la linea di comando.
@@ -1562,17 +1892,17 @@ Per informazioni: http://wiki.secondlife.com/wiki/Client_parameters
Errore:
</string>
<string name="MBCmdLineUsg">
- uso linea di comando del programma [APP_NAME] :
+ Uso linea di comando del programma [APP_NAME] :
</string>
<string name="MBUnableToAccessFile">
Il programma [APP_NAME] non è in grado di accedere ad un file necessario.
-Potrebbe darsi che tu abbia copie multiple attivate, o il tuo sistema reputa erroneamente che il file sia già aperto.
+Potrebbe darsi che tu abbia copie multiple attivate o che il tuo sistema reputi erroneamente che il file sia già aperto.
Se il problema persiste, riavvia il computer e riprova.
-Se il problema persiste ancora, dovresti completamente disinstallare l&apos;applicazione [APP_NAME] e reinstallarla.
+Se il problema continua ancora, dovresti completamente disinstallare l&apos;applicazione [APP_NAME] e reinstallarla.
</string>
<string name="MBFatalError">
- Errore fatale
+ Errore critico
</string>
<string name="MBRequiresAltiVec">
Il programma [APP_NAME] richiede un processore con AltiVec (G4 o superiore).
@@ -1591,7 +1921,7 @@ Vuoi mandare un crash report?
</string>
<string name="MBNoDirectX">
Il programmma [APP_NAME] non riesce a trovare una DirectX 9.0b o superiore.
-[APP_NAME] usa le DirectX per determinare hardware e/o i driver non aggiornati che possono causare problemi di stabilità, scarsa performance e interruzioni. Sebbene tu possa avviare il programma [APP_NAME] senza di esse, raccomandiamo caldamente di installare le DirectX 9.0b.
+[APP_NAME] usa DirectX per rilevare hardware e/o i driver non aggiornati che possono causare problemi di stabilità, scarsa performance e interruzioni. Benché tu possa avviare il programma [APP_NAME] senza di esse, consigliamo caldamente l&apos;esecuzione con DirectX 9.0b.
Vuoi continuare?
</string>
@@ -1599,8 +1929,8 @@ Vuoi continuare?
Attenzione
</string>
<string name="MBNoAutoUpdate">
- L&apos;aggiornamento automatico non è stato ancora implementato per Linux.
-Raccomandiamo di scaricare l&apos;utima versione da www.secondlife.com.
+ L&apos;aggiornamento automatico non è stato ancora realizzato per Linux.
+Consigliamo di scaricare l&apos;ultima versione direttamente da www.secondlife.com.
</string>
<string name="MBRegClassFailed">
RegisterClass non riuscito
@@ -1609,8 +1939,8 @@ Raccomandiamo di scaricare l&apos;utima versione da www.secondlife.com.
Errore
</string>
<string name="MBFullScreenErr">
- Impossibile visualizzare a schermo intero a risoluzione [WIDTH] x [HEIGHT].
-Visualizzazione corrente ridotta a finestra.
+ Impossibile visualizzare a schermo intero con risoluzione [WIDTH] x [HEIGHT].
+Visualizzazione corrente in modalità finestra.
</string>
<string name="MBDestroyWinFailed">
Errore di arresto durante il tentativo di chiusura della finestra (DestroyWindow() non riuscito)
@@ -1628,14 +1958,14 @@ Visualizzazione corrente ridotta a finestra.
Impossibile ottenere una descrizione del formato pixel
</string>
<string name="MBTrueColorWindow">
- [APP_NAME] richiede True Color (32-bit) per funzionare.
-Vai alle impostazioni dello schermo del tuo computer e imposta il colore in modalità 32-bit.
+ [APP_NAME] richiede True Color (32 bit) per funzionare.
+Vai alle impostazioni dello schermo del tuo computer e imposta il colore in modalità 32 bit.
</string>
<string name="MBAlpha">
- [APP_NAME] non funziona poichè è impossibile trovare un canale alpha ad 8 Bit. Questo problema normalmente deriva dai driver della scheda video.
+ [APP_NAME] non funziona poichè è impossibile trovare un canale alpha a 8 bit. Questo problema normalmente deriva dai driver della scheda video.
Assicurati di avere installato i driver della scheda video più recenti.
-Assicurati anche che il monitor sia impostato a True Color (32-bit) nel pannello di controllo &gt; Display &gt; Settings.
-Se il messaggio persiste, contatta contatta [SUPPORT_SITE].
+Assicurati anche che il monitor sia impostato a True Color (32 bit) nel Pannello di controllo &gt; Schermo &gt; Impostazioni.
+Se il messaggio persiste, contatta [SUPPORT_SITE].
</string>
<string name="MBPixelFmtSetErr">
Impossibile impostare il formato pixel
@@ -1647,7 +1977,7 @@ Se il messaggio persiste, contatta contatta [SUPPORT_SITE].
Impossibile attivare il GL rendering
</string>
<string name="MBVideoDrvErr">
- [APP_NAME] Non riesce ad avviarsi perchè i driver della tua scheda video non sono stati installati correttamente, non sono aggiornati, o sono per un hardware non supportato. Assicurati di avere i driver della scheda video più recenti e anche se li hai installati, prova a reinstallarli di nuovo.
+ [APP_NAME] Non riesce ad avviarsi perchè i driver della tua scheda video non sono stati installati correttamente, non sono aggiornati, o sono per un hardware non supportato. Assicurati di avere i driver della scheda video più recenti e anche se li hai installati, prova a installarli di nuovo.
Se il messaggio persiste, contatta [SUPPORT_SITE].
</string>
@@ -1672,44 +2002,20 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="Attached Earlobes">
Lobi attaccati
</string>
- <string name="Back Bangs">
- #Back Bangs
- </string>
- <string name="Back Bangs Down">
- #Back Bangs Down
- </string>
- <string name="Back Bangs Up">
- #Back Bangs Up
- </string>
<string name="Back Fringe">
Frangetta all&apos;indietro
</string>
- <string name="Back Hair">
- #Back Hair
- </string>
- <string name="Back Hair Down">
- #Back Hair Down
- </string>
- <string name="Back Hair Up">
- #Back Hair Up
- </string>
<string name="Baggy">
- Con le borse
+ Larghi
</string>
<string name="Bangs">
Frange
</string>
- <string name="Bangs Down">
- #Bangs Down
- </string>
- <string name="Bangs Up">
- #Bangs Up
- </string>
<string name="Beady Eyes">
Occhi piccoli
</string>
<string name="Belly Size">
- punto vita
+ Punto vita
</string>
<string name="Big">
Grande
@@ -1717,23 +2023,20 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="Big Butt">
Sedere grande
</string>
- <string name="Big Eyeball">
- #Big Eyeball
- </string>
<string name="Big Hair Back">
- Gonfiore dei capelli: dietro
+ Capigliatura grande: Indietro
</string>
<string name="Big Hair Front">
- Gonfiore dei capelli: davanti
+ Capigliatura grande: anteriore
</string>
<string name="Big Hair Top">
- Gonfiore dei capelli: sopra
+ Capigliatura grande: in alto
</string>
<string name="Big Head">
- Grandezza testa
+ Grande testa
</string>
<string name="Big Pectorals">
- Grandezza pettorali
+ Grandi pettorali
</string>
<string name="Big Spikes">
Capelli con punte
@@ -1766,13 +2069,13 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Lentiggini e nei
</string>
<string name="Body Thick">
- Corpo robusto
+ Corpo più robusto
</string>
<string name="Body Thickness">
Robustezza del corpo
</string>
<string name="Body Thin">
- Magrezza del corpo
+ Corpo più magro
</string>
<string name="Bow Legged">
Gambe arcuate
@@ -1781,7 +2084,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Altezza del seno
</string>
<string name="Breast Cleavage">
- Avvicinamento dei seni
+ Décolleté
</string>
<string name="Breast Size">
Grandezza del seno
@@ -1796,7 +2099,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Grandezza delle sopracciglia
</string>
<string name="Bug Eyes">
- Sporgenza degli occhi
+ Occhi sporgenti
</string>
<string name="Bugged Eyes">
Occhi sporgenti
@@ -1817,19 +2120,19 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Grandezza del sedere
</string>
<string name="bustle skirt">
- Arricciatura posteriore
+ Crinolina
</string>
<string name="no bustle">
- Meno arricciatura
+ Nessuna crinolina
</string>
<string name="more bustle">
- Più arricciatura
+ Più crinolina
</string>
<string name="Chaplin">
Baffetti
</string>
<string name="Cheek Bones">
- Mascella
+ Zigomi
</string>
<string name="Chest Size">
Ampiezza del torace
@@ -1838,7 +2141,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Angolo del mento
</string>
<string name="Chin Cleft">
- Fessura inf. del mento
+ Fossetta sul mento
</string>
<string name="Chin Curtains">
Barba sottomento
@@ -1847,16 +2150,16 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Profondità mento
</string>
<string name="Chin Heavy">
- Appuntita verso l&apos;alto
+ Mento forte
</string>
<string name="Chin In">
Mento in dentro
</string>
<string name="Chin Out">
- Mento in fuori
+ Mento sporgente
</string>
<string name="Chin-Neck">
- Grandezza mento-collo
+ Mento-collo
</string>
<string name="Clear">
Trasparente
@@ -1871,46 +2174,40 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Chiusa
</string>
<string name="Closed Back">
- Spacco chiuso dietro
+ Chiuso dietro
</string>
<string name="Closed Front">
- Spacco chiuso davanti
+ Chiuso davanti
</string>
<string name="Closed Left">
- Spacco chiuso sx
+ Chiuso sinistra
</string>
<string name="Closed Right">
- Spacco chiuso dx
+ Chiuso destra
</string>
<string name="Coin Purse">
Meno pronunciati
</string>
<string name="Collar Back">
- Scollatura posteriore
+ Colletto posteriore
</string>
<string name="Collar Front">
- Scollatura anteriore
+ Colletto anteriore
</string>
<string name="Corner Down">
Angolo all&apos;ingiù
</string>
- <string name="Corner Normal">
- Angolo Normale
- </string>
<string name="Corner Up">
Angolo all&apos;insù
</string>
<string name="Creased">
- Alzato
+ Piega
</string>
<string name="Crooked Nose">
Naso storto
</string>
- <string name="Cropped Hair">
- Capelli raccolti
- </string>
<string name="Cuff Flare">
- Fondo pantalone
+ Svasato con risvolto
</string>
<string name="Dark">
Scuro
@@ -1922,49 +2219,43 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Più scuro
</string>
<string name="Deep">
- Più pronunciato
+ Profondo
</string>
<string name="Default Heels">
Tacchi standard
</string>
- <string name="Default Toe">
- Punta del piede standard
- </string>
<string name="Dense">
- Meno rade
- </string>
- <string name="Dense hair">
- #Dense Hair
+ Folti
</string>
<string name="Double Chin">
Doppio mento
</string>
<string name="Downturned">
- Naso all&apos;ingiù
+ All&apos;ingiù
</string>
<string name="Duffle Bag">
Più pronunciati
</string>
<string name="Ear Angle">
- Orecchie a sventola
+ Angolo orecchie
</string>
<string name="Ear Size">
Grandezza orecchie
</string>
<string name="Ear Tips">
- Tipo di orecchio
+ Estremità orecchie
</string>
<string name="Egg Head">
Ovalizzazione testa
</string>
<string name="Eye Bags">
- Borse sotto agli occhi
+ Occhiaie
</string>
<string name="Eye Color">
Colore degli occhi
</string>
<string name="Eye Depth">
- Occhi incavati
+ Profondità degli occhi
</string>
<string name="Eye Lightness">
Luminosità degli occhi
@@ -1973,7 +2264,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Apertura degli occhi
</string>
<string name="Eye Pop">
- Differenza apertura occhi
+ Prominenza degli occhi
</string>
<string name="Eye Size">
Grandezza occhi
@@ -1981,9 +2272,6 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="Eye Spacing">
Distanza occhi
</string>
- <string name="Eyeball Size">
- #Eyeball Size
- </string>
<string name="Eyebrow Arc">
Arco delle sopracciglia
</string>
@@ -2008,69 +2296,21 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="Eyeliner Color">
Colore dell&apos;eyeliner
</string>
- <string name="Eyes Back">
- #Eyes Back
- </string>
<string name="Eyes Bugged">
Occhi sporgenti
</string>
- <string name="Eyes Forward">
- #Eyes Forward
- </string>
- <string name="Eyes Long Head">
- #Eyes Long Head
- </string>
- <string name="Eyes Shear Left Up">
- Distorsione occhi in alto a sx
- </string>
- <string name="Eyes Shear Right Up">
- Distorsione occhi in alto a dx
- </string>
- <string name="Eyes Short Head">
- #Eyes Short Head
- </string>
- <string name="Eyes Spread">
- #Eyes Spread
- </string>
- <string name="Eyes Sunken">
- #Eyes Sunken
- </string>
- <string name="Eyes Together">
- #Eyes Together
- </string>
<string name="Face Shear">
- Distorsione del viso
+ Taglio del viso
</string>
<string name="Facial Definition">
- Lineamenti del viso
+ Definizione del viso
</string>
<string name="Far Set Eyes">
Occhi distanti
</string>
- <string name="Fat">
- #Fat
- </string>
- <string name="Fat Head">
- #Fat Head
- </string>
<string name="Fat Lips">
Labbra carnose
</string>
- <string name="Fat Lower">
- #Fat Lower
- </string>
- <string name="Fat Lower Lip">
- Labbro inferiore sporgente
- </string>
- <string name="Fat Torso">
- #Fat Torso
- </string>
- <string name="Fat Upper">
- #Fat Upper
- </string>
- <string name="Fat Upper Lip">
- Labbro superiore sporgente
- </string>
<string name="Female">
Femmina
</string>
@@ -2081,7 +2321,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Dita
</string>
<string name="Flared Cuffs">
- Fondo largo
+ Risvolti svasati
</string>
<string name="Flat">
Piatto
@@ -2090,88 +2330,73 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Sedere piatto
</string>
<string name="Flat Head">
- Viso piatto
+ Testa piatta
</string>
<string name="Flat Toe">
Punta piatta
</string>
<string name="Foot Size">
- Grandezza piede
+ Misura piede
</string>
<string name="Forehead Angle">
Angolo della fronte
</string>
<string name="Forehead Heavy">
- Appuntita verso il basso
+ Fronte sporgente
</string>
<string name="Freckles">
Lentiggini
</string>
- <string name="Front Bangs Down">
- #Front Bangs Down
- </string>
- <string name="Front Bangs Up">
- #Front Bangs Up
- </string>
<string name="Front Fringe">
Frangetta
</string>
- <string name="Front Hair">
- #Front Hair
- </string>
- <string name="Front Hair Down">
- #Front Hair Down
- </string>
- <string name="Front Hair Up">
- #Front Hair Up
- </string>
<string name="Full Back">
- Scostati
+ Dietro gonfi
</string>
<string name="Full Eyeliner">
- Con eyeliner
+ Eyeliner marcato
</string>
<string name="Full Front">
- Anteriore pieno
+ Anteriore gonfio
</string>
<string name="Full Hair Sides">
- Riempimento lati
+ Lati capelli gonfi
</string>
<string name="Full Sides">
- Pieni
+ Lati gonfi
</string>
<string name="Glossy">
Lucido
</string>
<string name="Glove Fingers">
- Dita dei guanti
+ Dita con guanti
</string>
<string name="Glove Length">
Lunghezza guanti
</string>
<string name="Hair">
- Capelli
+ Capigliature
</string>
<string name="Hair Back">
- Capelli: dietro
+ Capelli: Indietro
</string>
<string name="Hair Front">
- Capelli: davanti
+ Capelli: anteriore
</string>
<string name="Hair Sides">
Capelli: lati
</string>
<string name="Hair Sweep">
- Traslazione
+ Direzione capigliatura
</string>
<string name="Hair Thickess">
- Spessore
+ Foltezza
</string>
<string name="Hair Thickness">
- Spessore barba
+ Foltezza
</string>
<string name="Hair Tilt">
- Rotazione capelli
+ Inclinazione
</string>
<string name="Hair Tilted Left">
Verso sinistra
@@ -2180,16 +2405,16 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Verso destra
</string>
<string name="Hair Volume">
- Capelli: volume
+ Capelli: Volume
</string>
<string name="Hand Size">
Grandezza mani
</string>
<string name="Handlebars">
- Baffi lunghi
+ Baffi a manubrio
</string>
<string name="Head Length">
- Sporgenza del viso
+ Lunghezza testa
</string>
<string name="Head Shape">
Forma della testa
@@ -2198,7 +2423,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Grandezza della testa
</string>
<string name="Head Stretch">
- Compressione lat testa
+ Allungamento testa
</string>
<string name="Heel Height">
Altezza tacchi
@@ -2222,7 +2447,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Alta
</string>
<string name="High and Tight">
- Cavallo alto
+ Alto e stretto
</string>
<string name="Higher">
Più alto
@@ -2267,7 +2492,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Forma del mento
</string>
<string name="Join">
- Avvicinati
+ Iscriviti
</string>
<string name="Jowls">
Guance
@@ -2297,7 +2522,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Meno
</string>
<string name="Less Body Fat">
- Meno grasso
+ Meno grasso corporeo
</string>
<string name="Less Curtains">
Meno
@@ -2339,16 +2564,16 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Meno
</string>
<string name="Lighter">
- Più chiaro
+ Più leggero
</string>
<string name="Lip Cleft">
- Distanza divis. labbro sup.
+ Distanza fossetta labbro
</string>
<string name="Lip Cleft Depth">
- Prof. spacco labbro sup.
+ Prof. fossetta labbro
</string>
<string name="Lip Fullness">
- Riempimento delle labbra
+ Volume labbra
</string>
<string name="Lip Pinkness">
Tonalità rosa labbra
@@ -2375,7 +2600,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Lungo
</string>
<string name="Long Head">
- Viso sporgente
+ Testa lunga
</string>
<string name="Long Hips">
Bacino alto
@@ -2387,7 +2612,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Collo lungo
</string>
<string name="Long Pigtails">
- Ciuffi laterali lunghi
+ Codini lunghi
</string>
<string name="Long Ponytail">
Codino lungo
@@ -2398,17 +2623,14 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="Long arms">
Braccia lunghe
</string>
- <string name="Longcuffs">
- Longcuffs
- </string>
<string name="Loose Pants">
- Non attillati
+ Pantaloni ampi
</string>
<string name="Loose Shirt">
- Non attillata
+ Camicia ampia
</string>
<string name="Loose Sleeves">
- Maniche lente
+ Maniche non attillate
</string>
<string name="Love Handles">
Maniglie dell&apos;amore
@@ -2426,7 +2648,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Bassa
</string>
<string name="Low and Loose">
- Cavallo basso
+ Basso e ampio
</string>
<string name="Lower">
Più basso
@@ -2435,7 +2657,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Parte bassa del setto
</string>
<string name="Lower Cheeks">
- Guance
+ Guance inferiori
</string>
<string name="Male">
Maschio
@@ -2444,13 +2666,13 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Riga nel mezzo
</string>
<string name="More">
- Di più
+ Altro
</string>
<string name="More Blush">
Più fard
</string>
<string name="More Body Fat">
- Più grasso
+ Più grasso corporeo
</string>
<string name="More Curtains">
Più
@@ -2519,7 +2741,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Posizione della bocca
</string>
<string name="Mowhawk">
- Vuoti
+ Moicana
</string>
<string name="Muscular">
Muscolatura
@@ -2563,9 +2785,6 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="No Eyeshadow">
Senza ombretto
</string>
- <string name="No Heels">
- No Heels
- </string>
<string name="No Lipgloss">
Senza lipgloss
</string>
@@ -2597,10 +2816,10 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Superiore normale
</string>
<string name="Nose Left">
- Storto a sinistra
+ Naso a sinistra
</string>
<string name="Nose Right">
- Storto a destra
+ Naso a destra
</string>
<string name="Nose Size">
Grandezza naso
@@ -2623,20 +2842,17 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="Nostril Width">
Larghezza narici
</string>
- <string name="Old">
- Vecchio
- </string>
<string name="Opaque">
Opaco
</string>
<string name="Open">
- Aperto
+ Apri
</string>
<string name="Open Back">
Retro aperto
</string>
<string name="Open Front">
- Aperto Frontale
+ Davanti aperto
</string>
<string name="Open Left">
Lato sin. aperto
@@ -2672,7 +2888,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Genitali
</string>
<string name="Painted Nails">
- Unghie colorate
+ Unghie smaltate
</string>
<string name="Pale">
Pallido
@@ -2687,7 +2903,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Lunghezza pantaloni
</string>
<string name="Pants Waist">
- Altezza slip
+ Taglia pantalone
</string>
<string name="Pants Wrinkles">
Pantaloni con le grinze
@@ -2705,7 +2921,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Pigmento
</string>
<string name="Pigtails">
- Ciuffi
+ Codini
</string>
<string name="Pink">
Rosa
@@ -2725,9 +2941,6 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="Pointy Heels">
Tacchi a spillo
</string>
- <string name="Pointy Toe">
- Punta appuntita
- </string>
<string name="Ponytail">
Codino
</string>
@@ -2752,15 +2965,9 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="Red Hair">
Presenza di rosso nei capelli
</string>
- <string name="Red Skin">
- Red Skin
- </string>
<string name="Regular">
Normale
</string>
- <string name="Regular Muscles">
- Muscolatura normale
- </string>
<string name="Right Part">
Riga a destra
</string>
@@ -2770,9 +2977,6 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="Round">
Rotondo
</string>
- <string name="Round Forehead">
- Round Forehead
- </string>
<string name="Ruddiness">
Rossore
</string>
@@ -2785,53 +2989,35 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="Saddle Bags">
Rotondità fianchi
</string>
- <string name="Saddlebags">
- Rotondità fianchi
- </string>
- <string name="Scrawny">
- Scrawny
- </string>
<string name="Scrawny Leg">
Gambe magre
</string>
<string name="Separate">
Separati
</string>
- <string name="Shading">
- Shading
- </string>
- <string name="Shadow hair">
- Shadow hair
- </string>
<string name="Shallow">
Meno pronunciato
</string>
<string name="Shear Back">
- Accostamento posteriore
+ Taglio posteriore
</string>
<string name="Shear Face">
- Distorsione viso
+ Taglio del viso
</string>
<string name="Shear Front">
- Riempimento davanti
- </string>
- <string name="Shear Left">
- A sinistra
+ Taglio anteriore
</string>
<string name="Shear Left Up">
Distorto a sinistra
</string>
- <string name="Shear Right">
- A destra
- </string>
<string name="Shear Right Up">
Distorto a destra
</string>
<string name="Sheared Back">
- Accostati
+ Taglio verso dietro
</string>
<string name="Sheared Front">
- Anteriormente vuoto
+ Taglio verso davanti
</string>
<string name="Shift Left">
A sinistra
@@ -2867,10 +3053,10 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Collo corto
</string>
<string name="Short Pigtails">
- Ciuffi laterali corti
+ Codini corti
</string>
<string name="Short Ponytail">
- Codino Corto
+ Codino corto
</string>
<string name="Short Sideburns">
Basette corte
@@ -2884,15 +3070,6 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="Shoulders">
Spalle
</string>
- <string name="Side Bangs">
- Side Bangs
- </string>
- <string name="Side Bangs Down">
- Side Bangs Down
- </string>
- <string name="Side Bangs Up">
- Side Bangs Up
- </string>
<string name="Side Fringe">
Ciuffi laterali
</string>
@@ -2900,16 +3077,13 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Basette
</string>
<string name="Sides Hair">
- Capigliatura later.
+ Capigliatura di lato
</string>
<string name="Sides Hair Down">
- Giù
+ Capigliatura di lato sciolta
</string>
<string name="Sides Hair Up">
- Su
- </string>
- <string name="Skinny">
- Skinny
+ Capigliatura di lato raccolta
</string>
<string name="Skinny Neck">
Collo fino
@@ -2930,19 +3104,19 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Morbidezza maniche
</string>
<string name="Slit Back">
- Spacco: posteriore
+ Spacco: Indietro
</string>
<string name="Slit Front">
Spacco: anteriore
</string>
<string name="Slit Left">
- Spacco: sinistro
+ Spacco: Sinistra
</string>
<string name="Slit Right">
- Spacco: destro
+ Spacco: Destra
</string>
<string name="Small">
- Piccolo
+ Piccola
</string>
<string name="Small Hands">
Mani piccole
@@ -2959,9 +3133,6 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="Socks Length">
Lunghezza calze
</string>
- <string name="Some">
- Some
- </string>
<string name="Soulpatch">
Pizzetto labbro inferiore
</string>
@@ -2980,9 +3151,6 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="Squash Head">
Testa schiacciata
</string>
- <string name="Squash/Stretch Head">
- Testa Schiacciata/Allungata
- </string>
<string name="Stretch Head">
Testa allungata
</string>
@@ -3001,18 +3169,6 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="Sweep Forward">
Avanti
</string>
- <string name="Swept Back">
- Swept Back
- </string>
- <string name="Swept Back Hair">
- Swept Back Hair
- </string>
- <string name="Swept Forward">
- Swept Forward
- </string>
- <string name="Swept Forward Hair">
- Swept Forward Hair
- </string>
<string name="Tall">
Alto
</string>
@@ -3031,44 +3187,35 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="Thick Toe">
Punta spessa
</string>
- <string name="Thickness">
- Thickness
- </string>
<string name="Thin">
- Ossute
+ Sottili
</string>
<string name="Thin Eyebrows">
- Sopracciglia fini
+ Sopracciglia sottili
</string>
<string name="Thin Lips">
- Labbra fini
+ Labbra sottili
</string>
<string name="Thin Nose">
- Naso fino
+ Naso sottile
</string>
<string name="Tight Chin">
- Mento magro
+ Mento stretto
</string>
<string name="Tight Cuffs">
Fondo stretto
</string>
<string name="Tight Pants">
- Attillati
+ Pantaloni attillati
</string>
<string name="Tight Shirt">
- Attilata
+ Camicia attillata
</string>
<string name="Tight Skirt">
- Attillata
+ Gonna attillata
</string>
<string name="Tight Sleeves">
- Attillate
- </string>
- <string name="Tilt Left">
- Tilt Left
- </string>
- <string name="Tilt Right">
- Tilt Right
+ Maniche strette
</string>
<string name="Toe Shape">
Forma della punta
@@ -3089,7 +3236,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Distaccato
</string>
<string name="Uncreased">
- Abbassato
+ Senza piega
</string>
<string name="Underbite">
Denti inf. in fuori
@@ -3104,13 +3251,13 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Parte alta degli zigomi
</string>
<string name="Upper Chin Cleft">
- Fessura sup. del mento
+ Fossetta sup. del mento
</string>
<string name="Upper Eyelid Fold">
Piega palpebra sup.
</string>
<string name="Upturned">
- Naso all&apos;insù
+ All&apos;insù
</string>
<string name="Very Red">
Molto rossi
@@ -3125,13 +3272,13 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Capelli bianchi
</string>
<string name="Wide">
- Spalancati
+ Largo
</string>
<string name="Wide Back">
- Laterali post. larghi
+ Dietro largo
</string>
<string name="Wide Front">
- Laterali ant. larghi
+ Davanti largo
</string>
<string name="Wide Lips">
Labbra larghe
@@ -3143,31 +3290,40 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Grinze
</string>
<string name="LocationCtrlAddLandmarkTooltip">
- Aggiungi ai miei landmark
+ Aggiungi ai miei punti di riferimento
</string>
<string name="LocationCtrlEditLandmarkTooltip">
- Modifica i miei landmark
+ Modifica i miei punti di riferimento
</string>
<string name="LocationCtrlInfoBtnTooltip">
- maggiori informazioni sulla posizione attuale
+ Maggiori informazioni sulla posizione attuale
</string>
<string name="LocationCtrlComboBtnTooltip">
- Lo storico delle mie posizioni
+ La cronologia delle mie posizioni
+ </string>
+ <string name="LocationCtrlAdultIconTooltip">
+ Regione con categoria adulti
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ Regione con categoria moderata
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ Regione generale
</string>
<string name="UpdaterWindowTitle">
Aggiornamento [APP_NAME]
</string>
<string name="UpdaterNowUpdating">
- [APP_NAME] In aggiornamento...
+ Aggiornamento di [APP_NAME]...
</string>
<string name="UpdaterNowInstalling">
- [APP_NAME] In installazione...
+ Installazione di [APP_NAME]...
</string>
<string name="UpdaterUpdatingDescriptive">
- Il Viewer del programma [APP_NAME] si sta aggiornando all&apos;ultima versione. Potrebbe volerci del tempo, attendi.
+ Il Viewer del programma [APP_NAME] si sta aggiornando all&apos;ultima versione. Potrebbe volerci del tempo, attendi.
</string>
<string name="UpdaterProgressBarTextWithEllipses">
- Aggiornamento in download...
+ Download dell&apos;aggiornamento...
</string>
<string name="UpdaterProgressBarText">
Download dell&apos;aggiornamento
@@ -3176,13 +3332,19 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
Download dell&apos;aggiornamento non riuscito
</string>
<string name="UpdaterFailUpdateDescriptive">
- Il programma [APP_NAME] ha riscontrato un&apos;errore nel tentativo di aggiornamento. Consigliamo di scaricare l&apos;ultima versione direttamente da www.secondlife.com.
+ Il programma [APP_NAME] ha riscontrato un&apos;errore durante il tentativo di aggiornamento. Consigliamo di scaricare l&apos;ultima versione direttamente da www.secondlife.com.
</string>
<string name="UpdaterFailInstallTitle">
- Tentativo di installazione aggiornamento non riuscito
+ Installazione dell&apos;aggiornamento non riuscita
</string>
<string name="UpdaterFailStartTitle">
- Errore nell&apos;apertura del viewer
+ Errore nell&apos;avvio del viewer
+ </string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME]: Oggetti in arrivo troppo velocemente da [FROM_NAME], anteprima automatica disattivata per [TIME] secondi
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME]: Oggetti in arrivo troppo velocemente, anteprima automatica disattivata per [TIME] secondi
</string>
<string name="IM_logging_string">
-- Registrazione messaggi instantanei abilitata --
@@ -3194,7 +3356,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
(anonimo)
</string>
<string name="IM_moderated_chat_label">
- (Moderato: Voice spento di default)
+ (Moderato: Voci disattivate di default)
</string>
<string name="IM_unavailable_text_label">
La chat di testo non è disponibile per questa chiamata.
@@ -3203,7 +3365,7 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
La chat di testo è stata disabilitata da un moderatore di gruppo.
</string>
<string name="IM_default_text_label">
- Clicca qua per inviare un messaggio instantaneo.
+ Clicca qui per inviare un messaggio instantaneo.
</string>
<string name="IM_to_label">
A
@@ -3211,6 +3373,27 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="IM_moderator_label">
(Moderatore)
</string>
+ <string name="answered_call">
+ Risposto alla chiamata
+ </string>
+ <string name="you_started_call">
+ Hai iniziato una chiamata vocale
+ </string>
+ <string name="you_joined_call">
+ Ti sei collegato alla chiamata in voce
+ </string>
+ <string name="name_started_call">
+ [NAME] ha iniziato una chiamata vocale
+ </string>
+ <string name="ringing-im">
+ Collegamento alla chiamata vocale...
+ </string>
+ <string name="connected-im">
+ Collegato, clicca Chiudi chiamata per agganciare
+ </string>
+ <string name="hang_up-im">
+ Chiusa la chiamata
+ </string>
<string name="only_user_message">
Sei l&apos;unico utente di questa sessione.
</string>
@@ -3220,6 +3403,12 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="invite_message">
Clicca il tasto [BUTTON NAME] per accettare/connetterti a questa voice chat.
</string>
+ <string name="muted_message">
+ Hai bloccato questo residente. Quando gli invii un messaggio, verrà automaticamente sbloccato.
+ </string>
+ <string name="generic">
+ Errore nella richiesta, riprova più tardi.
+ </string>
<string name="generic_request_error">
Errore durante la richiesta, riprova più tardi.
</string>
@@ -3238,19 +3427,283 @@ Se il messaggio persiste, contatta [SUPPORT_SITE].
<string name="not_a_mod_error">
Non sei un moderatore.
</string>
+ <string name="muted">
+ Il moderatore del gruppo ha disattivato la tua chat di testo.
+ </string>
<string name="muted_error">
Un moderatore di gruppo ti ha disabilitato dalla chat di testo.
</string>
<string name="add_session_event">
Impossibile aggiungere utenti alla chat con [RECIPIENT].
</string>
+ <string name="message">
+ Impossibile spedire il tuo messaggio nella sessione chat con [RECIPIENT].
+ </string>
<string name="message_session_event">
Impossibile inviare il messaggio nella chat con [RECIPIENT].
</string>
+ <string name="mute">
+ Errore durante la moderazione.
+ </string>
+ <string name="removed">
+ Sei stato rimosso dal gruppo.
+ </string>
<string name="removed_from_group">
Sei stato espulso dal gruppo.
</string>
<string name="close_on_no_ability">
Non hai più le abilitazioni per rimanere nella sessione chat.
</string>
+ <string name="unread_chat_single">
+ [SOURCES] ha detto qualcosa di nuovo
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] ha detto qualcosa di nuovo
+ </string>
+ <string name="session_initialization_timed_out_error">
+ Sessione di inizializzazione scaduta
+ </string>
+ <string name="voice_morphing_url">
+ http://secondlife.com/landing/voicemorphing
+ </string>
+ <string name="paid_you_ldollars">
+ [NAME] ti ha inviato un pagamento di L$[AMOUNT].
+ </string>
+ <string name="you_paid_ldollars">
+ Hai inviato un pagamento di L$[AMOUNT] a [NAME] [REASON].
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ Hai pagato L$ [AMOUNT].
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ Hai inviato un pagamento di L$[AMOUNT] a [NAME].
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ Hai pagato L$ [AMOUNT] [REASON].
+ </string>
+ <string name="for a parcel of land">
+ per un lotto di terreno
+ </string>
+ <string name="for a land access pass">
+ per un permesso di accesso al terreno
+ </string>
+ <string name="for deeding land">
+ per la cessione di terreno
+ </string>
+ <string name="to create a group">
+ per creare un gruppo
+ </string>
+ <string name="to join a group">
+ per aderire a un gruppo
+ </string>
+ <string name="to upload">
+ per caricare
+ </string>
+ <string name="giving">
+ Contributo di L$ [AMOUNT]
+ </string>
+ <string name="uploading_costs">
+ Il costo per il caricamento è di L$ [AMOUNT]
+ </string>
+ <string name="this_costs">
+ Il costo è L$ [AMOUNT]
+ </string>
+ <string name="buying_selected_land">
+ L&apos;acquisto del terreno prescelto costa L$ [AMOUNT]
+ </string>
+ <string name="this_object_costs">
+ Il costo dell&apos;oggetto è L$ [AMOUNT]
+ </string>
+ <string name="group_role_everyone">
+ Tutti
+ </string>
+ <string name="group_role_officers">
+ Funzionari
+ </string>
+ <string name="group_role_owners">
+ Proprietari
+ </string>
+ <string name="uploading_abuse_report">
+ Caricamento in corso...
+
+Segnala abuso
+ </string>
+ <string name="New Shape">
+ Nuova figura corporea
+ </string>
+ <string name="New Skin">
+ Nuova pelle
+ </string>
+ <string name="New Hair">
+ Nuovi capelli
+ </string>
+ <string name="New Eyes">
+ Nuovi occhi
+ </string>
+ <string name="New Shirt">
+ Nuova camicia
+ </string>
+ <string name="New Pants">
+ Nuovi pantaloni
+ </string>
+ <string name="New Shoes">
+ Nuove scarpe
+ </string>
+ <string name="New Socks">
+ Nuove calze
+ </string>
+ <string name="New Jacket">
+ Nuova giacca
+ </string>
+ <string name="New Gloves">
+ Nuovi guanti
+ </string>
+ <string name="New Undershirt">
+ Nuova maglietta intima
+ </string>
+ <string name="New Underpants">
+ Nuovi slip
+ </string>
+ <string name="New Skirt">
+ Nuova gonna
+ </string>
+ <string name="New Alpha">
+ Nuovo Alpha (trasparenza)
+ </string>
+ <string name="New Tattoo">
+ Nuovo tatuaggio
+ </string>
+ <string name="Invalid Wearable">
+ Capo da indossare non valido
+ </string>
+ <string name="New Script">
+ Nuovo script
+ </string>
+ <string name="New Folder">
+ Nuova cartella
+ </string>
+ <string name="Contents">
+ Contenuto
+ </string>
+ <string name="Gesture">
+ Gesture
+ </string>
+ <string name="Male Gestures">
+ Gesture maschili
+ </string>
+ <string name="Female Gestures">
+ Gesture femminili
+ </string>
+ <string name="Other Gestures">
+ Altre gesture
+ </string>
+ <string name="Speech Gestures">
+ Gesture del parlato
+ </string>
+ <string name="Common Gestures">
+ Gesture comuni
+ </string>
+ <string name="Male - Excuse me">
+ Maschio - Chiedere scusa
+ </string>
+ <string name="Male - Get lost">
+ Maschio - Levati dai piedi!
+ </string>
+ <string name="Male - Blow kiss">
+ Maschio - Butta un bacio
+ </string>
+ <string name="Male - Boo">
+ Maschio - Bu
+ </string>
+ <string name="Male - Bored">
+ Maschio - Annoiato
+ </string>
+ <string name="Male - Hey">
+ Maschio - Ehi
+ </string>
+ <string name="Male - Laugh">
+ Maschio - Ridere
+ </string>
+ <string name="Male - Repulsed">
+ Maschio - Disgustato
+ </string>
+ <string name="Male - Shrug">
+ Maschio - Spallucce
+ </string>
+ <string name="Male - Stick tougue out">
+ Maschio - Tira fuori la lingua
+ </string>
+ <string name="Male - Wow">
+ Maschio - Accipicchia
+ </string>
+ <string name="Female - Excuse me">
+ Femmina - Chiedere scusa
+ </string>
+ <string name="Female - Get lost">
+ Femmina - Levati dai piedi!
+ </string>
+ <string name="Female - Blow kiss">
+ Femmina - Butta un bacio
+ </string>
+ <string name="Female - Boo">
+ Femmina - Bu
+ </string>
+ <string name="Female - Bored">
+ Femmina - Annoiata
+ </string>
+ <string name="Female - Hey">
+ Femmina - Ehi
+ </string>
+ <string name="Female - Laugh">
+ Femmina - Ridere
+ </string>
+ <string name="Female - Repulsed">
+ Femmina - Disgustata
+ </string>
+ <string name="Female - Shrug">
+ Femmina - Spallucce
+ </string>
+ <string name="Female - Stick tougue out">
+ Femmina - Tira fuori la lingua
+ </string>
+ <string name="Female - Wow">
+ Femmina - Accipicchia
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [day,datetime,slt]/[mthnum,datetime,slt]/[year,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ nessuna/nessuna
+ </string>
+ <string name="texture_load_dimensions_error">
+ Impossibile caricare immagini di dimensioni superiori a [WIDTH]*[HEIGHT]
+ </string>
+ <string name="words_separator" value=","/>
+ <string name="server_is_down">
+ Nonostante i nostri tentativi, si è verificato un errore imprevisto.
+
+ Consulta la pagina status.secondlifegrid.net per determinare se si sia verificato un problema noto con il servizio.
+ Se il problema continua, ti consigliamo di controllare le tue impostazioni di rete e della firewall.
+ </string>
+ <string name="dateTimeWeekdaysNames">
+ lunedì:martedì:mercoledì:giovedì:venerdì:sabato:domenica
+ </string>
+ <string name="dateTimeWeekdaysShortNames">
+ lun:mar:mer:gio:ven:sab:dom
+ </string>
+ <string name="dateTimeMonthNames">
+ gennaio:febbraio:marzo:aprile:maggio:giugno:luglio:agosto:settembre:ottobre:novembre:dicembre
+ </string>
+ <string name="dateTimeMonthShortNames">
+ gen:feb:mar:apr:mag:giu:lug:ago:sett:ott:nov:dic
+ </string>
+ <string name="dateTimeDayFormat">
+ [MDAY]
+ </string>
+ <string name="dateTimeAM">
+ antemeridiane
+ </string>
+ <string name="dateTimePM">
+ pomeridiane
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/it/teleport_strings.xml b/indra/newview/skins/default/xui/it/teleport_strings.xml
index eff7516050..7a1046abd3 100644
--- a/indra/newview/skins/default/xui/it/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/it/teleport_strings.xml
@@ -2,12 +2,12 @@
<teleport_messages>
<message_set name="errors">
<message name="invalid_tport">
- C&apos;è stato un problema nell&apos;elaborare la tua richiesta di teleport. Potresti aver bisogno di ricollegarti prima di poter usare il teleport. Se continui ad avere problemi, controlla per favore le FAQ del Supporto Tecnico a:
-www.secondlife.com/support.
+ C&apos;è stato un problema nell&apos;elaborare la tua richiesta di teleport. Potresti dover effettuare nuovamente l&apos;accesso prima di poter usare il teleport.
+Se si continua a visualizzare questo messaggio, consulta la pagina [SUPPORT_SITE].
</message>
<message name="invalid_region_handoff">
- C&apos;è stato un problema nell&apos;elaborare il cambio di regione. Potresti aver bisogno di ricollegarti prima di poterlo effetuare. Se continui ad avere problemi, controlla per favore le FAQ del Supporto Tecnico a:
-www.secondlife.com/support.
+ Si è verificato un problema nel tentativo di attraversare regioni. È possibile che per potere attraversare le regioni, tu debba effettuare nuovamente l&apos;accesso.
+Se si continua a visualizzare questo messaggio, consulta la pagina [SUPPORT_SITE].
</message>
<message name="blocked_tport">
Spiacenti, il teletrasporto è bloccato al momento. Prova di nuovo tra pochi istanti. Se ancora non potrai teletrasportarti, per favore scollegati e ricollegati per risolvere il problema.
@@ -59,11 +59,14 @@ www.secondlife.com/support.
<message name="completing">
Teletrasporto completato
</message>
+ <message name="completed_from">
+ Teleport completato da [T_SLURL]
+ </message>
<message name="resolving">
Elaborazione della destinazione in corso...
</message>
<message name="contacting">
- Contattando la nuova regione.
+ Contatto in corso con la nuova regione.
</message>
<message name="arriving">
In arrivo a destinazione...
diff --git a/indra/newview/skins/default/xui/ja/floater_about.xml b/indra/newview/skins/default/xui/ja/floater_about.xml
index 0fa20ab1ac..d2765eb0c8 100644
--- a/indra/newview/skins/default/xui/ja/floater_about.xml
+++ b/indra/newview/skins/default/xui/ja/floater_about.xml
@@ -8,9 +8,9 @@
コンパイラー [COMPILER] [COMPILER_VERSION] ãƒãƒ¼ã‚¸ãƒ§ãƒ³
</floater.string>
<floater.string name="AboutPosition">
- You are at [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] located at [HOSTNAME] ([HOSTIP])
+ ã‚ãªãŸã®ç¾åœ¨åœ°ã¯ã€[POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] ã® [REGION] ã§ã™ã€‚ä½ç½®ã¯ &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ã§ã™ã€‚([HOSTIP])
[SERVER_VERSION]
-[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
+[[SERVER_RELEASE_NOTES_URL] [リリースノート]]
</floater.string>
<floater.string name="AboutSystem">
CPU: [CPU]
@@ -29,7 +29,7 @@ libcurl ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [LIBCURL_VERSION]
J2C デコーダãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [J2C_VERSION]
オーディオドライãƒãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [AUDIO_DRIVER_VERSION]
Qt Webkit ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [QT_WEBKIT_VERSION]
-Vivox ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [VIVOX_VERSION]
+ボイスサーãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [VOICE_VERSION]
</floater.string>
<floater.string name="none">
(ãªã—)
@@ -43,13 +43,14 @@ Vivox ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [VIVOX_VERSION]
</panel>
<panel label="クレジット" name="credits_panel">
<text_editor name="credits_editor">
- Second Lifeã¯ã€ Philipã€Tessaã€Andrewã€Coryã€Jamesã€Benã€Charã€Charlieã€Colinã€Danã€Danielã€Dougã€Ericã€Hamletã€Haneyã€Eveã€Hunterã€Ianã€Jeffã€Jenniferã€Jimã€Johnã€Leeã€Markã€Peterã€Phoenixã€Richardã€Robinã€Xenonã€Steveã€Tanyaã€Eddieã€Aviã€Frankã€Bruceã€Aaronã€Aliceã€Bobã€Debraã€Eileenã€Helenã€Janetã€Louieã€Leviathaniaã€Stefanã€Rayã€Kevinã€Tomã€Mikebã€MikeTã€Burgessã€Elenaã€Tracyã€Billã€Toddã€Ryanã€Zachã€Sarahã€Novaã€Timã€Stephanieã€Michaelã€Evanã€Nicolasã€Catherineã€Rachelleã€Daveã€Hollyã€Bubã€Kellyã€Magellanã€Ramziã€Donã€Sabinã€Jillã€Rheyaã€Jeskaã€Torleyã€Konaã€Callumã€Charityã€Ventrellaã€Jackã€Vektorã€Irisã€Chrisã€Nicoleã€Mickã€Reubenã€Blueã€Babbageã€Yedwabã€Deanaã€Laurenã€Brentã€Pathfinderã€Chadrickã€Altruimaã€Jesseã€Teenyã€Monroeã€Icculusã€Davidã€Tessã€Lizzieã€Patsyã€Isaacã€Lawrenceã€Cynã€Boã€Giaã€Annetteã€Mariusã€Tboneã€Jonathanã€Karenã€Ginsuã€Satokoã€Yukoã€Makikoã€Thomasã€Harryã€Sethã€Alexeiã€Brianã€Guyã€Runitaiã€Ethanã€Dataã€Corneliusã€Kennyã€Swissã€Zeroã€Natriaã€Wendyã€Stephenã€Teepleã€Thumperã€Lucyã€Deeã€Miaã€Lianaã€Warrenã€Brankaã€Auraã€beezã€Miloã€Hermiaã€Redã€Thraxã€Joeã€Sallyã€Magentaã€Moguraã€Paulã€Joseã€Rejeanã€Henrikã€Lexieã€Amberã€Loganã€Xanã€Noraã€Morpheusã€Donovanã€Leylaã€MichaelFrancisã€Beastã€Cubeã€Buckyã€Joshuaã€Stryfeã€Harmonyã€Teresaã€Claudiaã€Walkerã€Glennã€Fritzã€Fordakã€Juneã€Cleopetraã€Jeanã€Ivyã€Betsyã€Rooseveltã€Spikeã€Kenã€Whichã€Tofuã€Chiyoã€Robã€Zeeã€dustinã€Georgeã€Delã€Matthewã€Catã€Jacquiã€Lightfootã€Adrianã€Violaã€Alfredã€Noelã€Irfanã€Sunilã€Yoolã€Rikaã€Janeã€Xtremeã€Frontierã€a2ã€Neoã€Siobhanã€Yozã€Justinã€Elleã€Qarlã€Benjaminã€Isabelã€Gulliverã€Everettã€Christopherã€Izzyã€Stephanyã€Garryã€Sejongã€Seanã€Tobinã€Iridiumã€Metaã€Anthonyã€Jeremyã€JPã€Jakeã€Mauriceã€Madhaviã€Leopardã€Kyleã€Joonã€Kariã€Bertã€Belindaã€Jonã€Kristiã€Bridieã€Pramodã€KJã€Socratesã€Mariaã€Ivanã€Aricã€Yamasakiã€Adreanneã€Jayã€MitchKã€Cerenã€Cocoã€Durlã€Jennyã€Periapseã€Karticã€Storrsã€Lotteã€Sandyã€Rohnã€Colossusã€Zenã€BigPapiã€Bradã€Pastramiã€Kurzã€Maniã€Neuroã€Jaimeã€MJã€Rowanã€Sgtã€Elvisã€Geckoã€Samuelã€Sardonyxã€Leoã€Bryanã€Nikoã€Softã€Poppyã€Rachelã€Akiã€Angeloã€Banzaiã€Alexaã€Sueã€CeeLoã€Benderã€CGã€Gillianã€Pelleã€Nickã€Echoã€Zaraã€Christineã€Shamiranã€Emmaã€Blakeã€Keikoã€Plexusã€Joppaã€Sidewinderã€Ericaã€Ashleiã€Twilightã€Kristenã€Brettã€Qã€Enusã€Simonã€Bevisã€Kraftã€Kipã€Chandlerã€Ronã€LauraPã€Ramã€KyleJMã€Scouseã€Prosperoã€Melissaã€Martyã€Natã€Hamiltonã€Kendã€Lordanã€Jimmyã€Kosmoã€Seraphã€Greenã€Ekimã€Wiggoã€JTã€Romeã€Dorisã€Mizã€Benocã€Whumpã€Trinityã€Patchã€Kateã€TJã€Baoã€Joohwanã€Christyã€Sofiaã€Matiasã€Cogsworthã€Johanã€Orehã€Cheahã€Angelaã€Brandyã€Mangoã€Lanã€Aleksã€Gloriaã€Heidyã€Mitchellã€Spaceã€Coltonã€Bambersã€Einsteinã€Maggieã€Malbersã€Roseã€Winnieã€Stellaã€Miltonã€Rothmanã€Niallã€Marinã€Allisonã€Katieã€Dawnã€Kattã€Dustyã€Kalpanaã€Judyã€Andreaã€Ambroffã€Infinityã€Gailã€Ricoã€Raymondã€Yiã€Williamã€Christaã€Mã€Teaganã€Scoutã€Mollyã€Danteã€Corrã€Dynamikeã€Usiã€Kayleeã€Vidtutsã€Lilã€Danicaã€Saschaã€Kelvã€Jacobã€Nyaã€Rodneyã€Brandonã€Elsieã€Blondinã€Grantã€Katrinã€Nyxã€Gabrielã€Locklainnã€Claireã€Devinã€Minervaã€Montyã€Austinã€Bradfordã€Siã€Keiraã€Hã€Caitlinã€Ditaã€Makaiã€Jennã€Annã€Meredithã€Clareã€Joyã€Praveenã€Codyã€Edmundã€Rutheã€Sirenaã€Gayathriã€Spiderã€FJã€Davidoffã€Tianã€Jennieã€Louiseã€Oskarã€Landonã€Noelleã€Jarvã€Ingridã€Alã€Sommerã€Docã€Ariaã€Huinã€Grayã€Liliã€Virã€DJã€Yangã€Tã€Simoneã€Maestroã€Scottã€Charleneã€Quixoteã€Amandaã€Susanã€Zedã€Anneã€Enkiduã€Esbeeã€Joroanã€Katelinã€Roxieã€Tayã€Scarletã€Kevinã€Johnnyã€Wolfgangã€Andrenã€Bobã€Howardã€Merovã€Randã€Rayã€Michonã€Newellã€Galenã€Dessieã€Lesã€Michonã€Jenelleã€Geoã€Sizã€Shapiroã€Peteã€Calyleã€Seleneã€Allenã€Phoebeã€Goldinã€Kimmoraã€Dakotaã€Slatonã€Lindquistã€Zoeyã€Hariã€Othelloã€Rohitã€Sheldonã€Petraã€Vialeã€Gordonã€Kayeã€Pinkã€Fernyã€Emersonã€Davyã€Briã€Chanã€Juanã€Robertã€Terrenceã€Nathanã€Carlã¨ã€ãã®ä»–多数ã®äººé”ã«ã‚ˆã£ã¦ä½œæˆã•れã¾ã—ãŸã€‚
+ Second Life ã¯ã€Philip, Tessa, Andrew, Cory, Ian, James, Phoenix, Ryan, Haney, Dan, Char, Ben, John, Tanya, Eddie, Richard, Mitch, Doug, Eric, Frank, Bruce, Aaron, Peter, Alice, Charlie, Debra, Eileen, Helen, Janet, Steffan, Steve, Tom, Mark, Hunter, Xenon, Burgess, Bill, Jim, Lee, Hamlet, Daniel, Jeff, Todd, Sarah, Tim, Stephanie, Colin, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Jack, Vektor, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Jesse, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Yuko, Makiko, Thomas, Harry, Seth, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Brad, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, Beez, Milo, Hermia, Red, Thrax, Gulliver, Joe, Sally, Paul, Jose, Rejean, Dore, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, Dustin, George, Del, Matthew, Cat, Jacqui, Adrian, Viola, Alfred, Noel, Irfan, Yool, Rika, Jane, Frontier, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Jeremy, JP, Jake, Anthony, Maurice, Madhavi, Leopard, Kyle, Joon, Bert, Belinda, Jon, Kristi, Bridie, Pramod, Socrates, Maria, Aric, Adreanne, Jay, Kari, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Colossus, Zen, BigPapi, Pastrami, Kurz, Mani, Neuro, Mel, Sardonyx, MJ, Rowan, Sgt, Elvis, Samuel, Leo, Bryan, Niko, Austin, Soft, Poppy, Rachel, Aki, Banzai, Alexa, Sue, Bender, CG, Angelo, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Rothman, Niall, Marin, Allison, Katie, Dawn, Dusty, Katt, Judy, Andrea, Ambroff, Infinity, Rico, Gail, Kalpana, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Maestro, Simone, Yang, T, Shannon, Nelson, Khanh, Scott, Courtney, Charlene, Quixote, Susan, Zed, Amanda, Katelin, Enkidu, Roxie, Esbee, JoRoan, Scarlet, Tay, Kevin, Wolfgang, Johnny, Ray, Andren, Merov, Bob, Rand, Howard, Callen, Heff, Galen, Newell, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl, Ashley, JessieAnn, Huseby, Karina, Paris, Kurt, Rick, Lis, Kotler, Theeba, Lynx, Murphy, Doten, Taka, Norm, Jillian, Marcus, Mae, Novack, Esther, Perry, Dana, Ducot, Javier, Porter, Madison, Gecko, Dough, JR, Gisele, Crimp, Norie, Arch, Kimi, Fisher, Barbara, Jason, Peggy, Bernard, Jules, Leroy, Eva, Khederian, Campbell, Vogt, Masido, Karel, Torres, Lo, Breezer, Delby, Rountree, Anna, Servus, Rue, Itiaes, Chuck, Luna, Novella, Zaza, Wen, Gino, Lex, Cassandra, Limey, Nancy, Anukul, Silver, Brodesky, Jinsai, Squid, Gez, Rakesh, Ladan, Edelman, Marcet, Squire, Tatem, Tony, Jerm, Tia, Falcon, BK, Tiggs, Driscoll, Bacon, Timothee, Cru, Carmilla, Coyot, Webb, Kazu, Rudas, LJ, Sea, Ali Wallace, Bewest, Pup, Drub, Dragon, Inoshiro, Byron, Rhett, Xandix, Aimee, Fredrik, Thor, Teddy, Baron, Nelly, Ghengis, Epic, Eli, Stone, Grapes, Irie, Prep, Scobu, Valerie, Alain ãã®ä»–å¤§å‹¢ã®æ–¹ã€…ã«ã‚ˆã£ã¦æä¾›ã•れã¦ã„ã¾ã™ã€‚
- ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ã“れã¾ã§ã§æœ€é«˜ã®ã‚‚ã®ã«ãªã‚‹ã‚ˆã†ã”å”力をã„ãŸã ã„ãŸä»¥ä¸‹ã®ä½äººã®çš†æ§˜ã«æ·±ã感è¬ã„ãŸã—ã¾ã™ã€‚ able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
+ç¾åœ¨æœ€ã‚‚優れãŸãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¨ãªã‚‹ã‚ˆã†ã”å”力ã„ãŸã ã„ãŸæ¬¡ã®ä½äººã®çš†æ§˜ã«æ·±ã感è¬ã„ãŸã—ã¾ã™ã€‚ Drew Dwi, Zai Lynch, Latif Khalifa, Ellla McMahon, Harleen Gretzky, Squirrel Wood, Malarthi Behemoth, Dante Tucker, Buckaroo Mu, Eddi Decosta, Dirk, Talamasca, Torben Trautman, Irene Muni, Lilly Zenovka, Vick Forcella, Sasy Scarborough, Gentle Welinder, Elric Anatine, Techwolf Lupindo, Dusan Writer, WolfPup Lowenhar, Marianne McCann, Fiachra Lach, Sitearm Madonna, Sudane Erato, Sahkolihaa Contepomi, Sachi Vixen, Questar Utu, Dimitrio Lewis, Matto Destiny, Scrim Pinion, Radio Signals, Psi Merlin, Pixel Gausman, Mel Vanbeeck, Laurent Bechir, Lamorna Proctor, Lares Carter, Gwyneth Llewelyn, Hydra Shaftoe, Holger Gilruth, Gentle Heron, Carla Broek, Boroondas Gupte, Fury Rosewood, Flower Ducatillon, Colpo Wexler, gwampa Lomu, Borg Capalini, Beansy Twine, Ardy Lay, , 45ms Zhong, Adeon Writer, Aeonix Aeon, Ai Austin, Aiko Ying, Alexandrea Fride, Alliez Mysterio, Annie Milestone, Annika Genezzia, Ansariel Hiller, ArminasX Saiman, Arya Braveheart, Asaeda Meltingdots, Asturkon Jua, Avallyn Oakleaf, Avatar Quinzet, BabyA Littlething, Bacchus Ireto, Bazaar, Riva, Benjamin Bigdipper, Beth Walcher, Bezilon Kasei, Biancaluce Robbiani, Bill Walach, blakopal Galicia, Blitzckreed Levenque, Bryn Oh, Callipygian Christensen, Cap Carver, Carr Arbenlow, Chantal Harvey, Charles Courtois, Charlie Sazaland, Cherry Cheevers, ChickyBabes Zuzu, Christopher Organiser, Ciaran Laval, Clara Young, Celierra Darling, Corinne Helendale, Corro Moseley, Coughdrop Littlething, Darien Caldwell, Dartagan Shepherd, Debs Regent, Decro Schmooz, Denim Kamachi, DiJodi Dubratt, Dil Spitz, Edgware Marker, Egehan Dryke, Emma Portilo, Emmie Fairymeadow, Evangelista Emerald, Faelon Swordthain, Frenchimmo Sabra, Gaberoonie Zanzibar, Ganymedes Costagravas, Gene Frostbite, GeneJ Composer, Giggles Littlebird, Grady Echegaray, Guni Greenstein, Gypsy Tripsa, Hackshaven Harford, Ham Rambler, Han Shuffle, Hanglow Short, Hatzfeld Runo, herina Bode, Horatio Freund, Hypatia Callisto, Hypatia Pickens, Identity Euler, Imnotgoing Sideways, Innula Zenovka, Iyoba Tarantal, Jack Abraham, Jagga Meredith, Jennifer Boyle, Jeremy Marquez, Jessica Qin, Jinx Nordberg, Jo Bernandes, Jocial Sonnenkern, Joel Savard, Jondan Lundquist, Josef Munster, Josette Windlow, Juilan Tripsa, Juro Kothari, Justin RiversRunRed, Kagehi Kohn, Kaimen Takahe, Keklily Longfall, Ken Lavender, Kestral Karas, Khisme Nitely, Kimar Coba, Kithrak Kirkorian, Kitty Barnett, Kolor Fall, Komiko Okamoto, Korvel Noh, Larry Pixel, Leal Choche, len Starship, Lenae Munz, Lexi Frua, Lillie Cordeaux, Lizzy Macarthur, LSL Scientist, Luban Yiyuan, Luc Starsider, Maccus McCullough, Madison Blanc, Maggie Darwin, Mallory Destiny, Manx Wharton, Marc Claridge, Marc2 Sands, Matthew Anthony, Maxim RiversRunRed, Medhue Simoni, Melinda Latynina, Mencius Watts, Michi Lumin, Midian Farspire, Miles Glaz, Mindy Mathy, Mitch Wagner, Mo Hax, Mourna Biziou, Nao Noe, naofan Teardrop, Naomah Beaumont, Nathiel Siamendes, Nber Medici, Neko Link, Netpat Igaly, Neutron Chesnokov, Newfie Pendragon, Nicholai Laviscu, Nick Rhodes, Nicoladie Gymnast, Ollie Kubrick, Orenj Marat, Orion Delphis, Oryx Tempel, Parvati Silverweb, PeterPunk Mooney, Pixel Scientist, Pounce Teazle, Professor Noarlunga, Quantum Destiny, Quicksilver Hermes, Ralf Setsuko, RAT Quan, RedMokum Bravin, Revolution Perenti, Rezit Sideways, Rich Grainger, Rosco Teardrop, Rose Evans, Rudee Voom, RufusTT Horsefly, Saii Hallard, SaintLEOlions Zimer, Samm Larkham, Satanello Miami, SexySteven Morrisey, Sheet Spotter, Shnurui Troughton, sicarius Thorne, Sicarius Toxx, Sini Nubalo, SLB Wirefly, snowy Sidran, Soupa Segura, ST Mensing, Starshine Halasy, Stickman Ingmann, Synystyr Texan, Takeda Terrawyng, Tali Rosca, Templar Merlin, Tezcatlipoca Bisiani, Tiel Stonecutter, Tony Kembia, TouchaHoney Perhaps, Trey Reanimator, TriloByte Zanzibar, Trinity Dechou, Trinity Dejavu, Unlikely Quintessa, UsikuFarasi Kanarik, Veritas Raymaker, Vex Streeter, Viaticus Speculaas, Villain Baroque, Vixie Durant, Void Singer, Watty Berkson, Westley Schridde, Westley Streeter, Whimsy Winx, Winter Ventura, Wundur Primbee, xstorm Radek, YongYong Francois, Zak Westminster, Zana Kohime, Zaren Alexander, Zeja Pyle, ZenMondo Wormser, Zoex Flanagan ãã®ä»–å¤§å‹¢ã®æ–¹ã€…。
- ビジãƒã‚¹ã§æˆåŠŸã™ã‚‹ã«ã¯ã€å‹‡æ°—ã‚’æŒã£ã¦ã€èª°ã‚ˆã‚Šã‚‚å…ˆã«ã€äººã¨é•ã£ãŸã“ã¨ã‚’ã™ã‚‹ã“ã¨ã ã€‚ --Henry Marchant
+
+「努力ã¯ç¶šãã€‚ç›®æ¨™ã¯æŒç¶šã™ã‚‹ã€‚å¸Œæœ›ã¯æ®‹ã•れã¦ã„ã‚‹ã€‚å¤¢ã¯æ±ºã—ã¦æ¶ˆãˆãªã„。〠- エドワード・ケãƒãƒ‡ã‚£
</text_editor>
</panel>
<panel label="ライセンス" name="licenses_panel">
@@ -61,7 +62,8 @@ Vivox ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [VIVOX_VERSION]
FreeType Copyright (C) 1996-2002, The FreeType Project (www.freetype.org).
GL Copyright (C) 1999-2004 Brian Paul.
Havok.com(TM) Copyright (C) 1999-2001, Telekinesys Research Limited.
- jpeg2000 Copyright (C) 2001, David Taubman, The University of New South Wales (UNSW)
+ jpeg2000 Copyright (C) 2001, David Taubman, The University of New South
+ Wales (UNSW)
jpeglib Copyright (C) 1991-1998, Thomas G. Lane.
ogg/vorbis Copyright (C) 2001, Xiphophorus
OpenSSL Copyright (C) 1998-2002 The OpenSSL Project.
diff --git a/indra/newview/skins/default/xui/ja/floater_about_land.xml b/indra/newview/skins/default/xui/ja/floater_about_land.xml
index 71a38391cd..2f5065c05f 100644
--- a/indra/newview/skins/default/xui/ja/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/ja/floater_about_land.xml
@@ -1,5 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floaterland" title="土地情報">
+ <floater.string name="maturity_icon_general">
+ &quot;Parcel_PG_Dark&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_moderate">
+ &quot;Parcel_M_Dark&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_adult">
+ &quot;Parcel_R_Dark&quot;
+ </floater.string>
<floater.string name="Minutes">
[MINUTES] 分
</floater.string>
@@ -15,7 +24,7 @@
<tab_container name="landtab">
<panel label="一般" name="land_general_panel">
<panel.string name="new users only">
- æ–°è¦ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ã¿
+ æ–°è¦ä½äººå°‚用
</panel.string>
<panel.string name="anyone">
誰ã§ã‚‚
@@ -27,13 +36,13 @@
[AREA] 平方メートル
</panel.string>
<panel.string name="auction_id_text">
- オークションID: [ID]
+ オークション ID: [ID]
</panel.string>
<panel.string name="need_tier_to_modify">
ã“ã®åœŸåœ°ã‚’修正変更ã™ã‚‹ã«ã¯ã€è³¼å…¥ã‚’承èªã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
</panel.string>
<panel.string name="group_owned_text">
- (グループ所有)
+ (グループ所有)
</panel.string>
<panel.string name="profile_text">
プロフィール
@@ -42,17 +51,20 @@
情報
</panel.string>
<panel.string name="public_text">
- (公共)
+ (公共)
</panel.string>
<panel.string name="none_text">
(ãªã—)
</panel.string>
<panel.string name="sale_pending_text">
- (購入審査中)
+ (購入審査中)
</panel.string>
<panel.string name="no_selection_text">
区画ãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“。
</panel.string>
+ <panel.string name="time_stamp_template">
+ [year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
+ </panel.string>
<text name="Name:">
åå‰ï¼š
</text>
@@ -73,7 +85,7 @@
Adult
</text>
<text name="Owner:">
- オーナー:
+ 所有者:
</text>
<text name="OwnerText">
Leyla Linden
@@ -85,9 +97,9 @@
Leyla Linden
</text>
<button label="設定" label_selected="設定..." name="Set..."/>
- <check_box label="グループã¸ã®è­²æ¸¡ã‚’許å¯" name="check deed" tool_tip="グループã®ã‚ªãƒ•ィサーã¯ã“ã®åœŸåœ°ã‚’グループã«è­²æ¸¡ã§ãã¾ã™ã€‚ãã†ã™ã‚‹ã¨ã‚°ãƒ«ãƒ¼ãƒ—ã®åœŸåœ°å‰²ã‚Šå½“ã¦ã«ã‚ˆã£ã¦ã‚µãƒãƒ¼ãƒˆã•れã¾ã™ã€‚"/>
- <button label="譲渡" label_selected="譲渡..." name="Deed..." tool_tip="é¸æŠžã•れãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚ªãƒ•ィサーã§ã‚ã‚‹ã¨ãã®ã¿ã€åœŸåœ°ã‚’譲渡ã§ãã¾ã™ã€‚"/>
- <check_box label="オーナーãŒè­²æ¸¡ã¨å…±ã«å¯„付" name="check contrib" tool_tip="土地ãŒã‚°ãƒ«ãƒ¼ãƒ—ã«è­²æ¸¡ã•れるã¨ãã€å‰ã®æ‰€æœ‰è€…ã¯è­²æ¸¡ãŒæˆç«‹ã™ã‚‹ã‚ˆã†ã€å分ãªåœŸåœ°ã‚’寄付ã—ã¾ã™ã€‚"/>
+ <check_box label="グループã¸ã®è­²æ¸¡ã‚’許å¯" name="check deed" tool_tip="グループã®ã‚ªãƒ•ィサーã¯ã“ã®åœŸåœ°ã‚’グループã«è­²æ¸¡ã§ãã¾ã™ã€‚グループã®åœŸåœ°å‰²ã‚Šå½“ã¦ã«ã‚ˆã£ã¦ã‚µãƒãƒ¼ãƒˆã•れã¾ã™ã€‚"/>
+ <button label="譲渡" label_selected="譲渡..." name="Deed..." tool_tip="é¸æŠžã—ãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚ªãƒ•ィサーã®ã¿ã€åœŸåœ°ã‚’譲渡ã§ãã¾ã™ã€‚"/>
+ <check_box label="所有者ãŒè­²æ¸¡ã¨å…±ã«å¯„付" name="check contrib" tool_tip="土地ãŒã‚°ãƒ«ãƒ¼ãƒ—ã«è­²æ¸¡ã•れるã¨ãã€å‰ã®æ‰€æœ‰è€…ã¯è­²æ¸¡ãŒæˆç«‹ã™ã‚‹ã‚ˆã†ã€å分ãªåœŸåœ°ã‚’寄付ã—ã¾ã™ã€‚"/>
<text name="For Sale:">
è²©å£²ã®æœ‰ç„¡ï¼š
</text>
@@ -95,9 +107,9 @@
販売対象外
</text>
<text name="For Sale: Price L$[PRICE].">
- 価格: L$[PRICE] (L$[PRICE_PER_SQM]/平方メートル)
+ 価格: L$ [PRICE] (L$ [PRICE_PER_SQM] / 平方メートル)
</text>
- <button label="土地を売る" label_selected="土地を販売..." name="Sell Land..."/>
+ <button label="土地を売る" label_selected="土地を販売..." name="Sell Land..." width="100"/>
<text name="For sale to">
販売先:[BUYER]
</text>
@@ -107,7 +119,7 @@
<text name="Selling with no objects in parcel.">
オブジェクトã¯è²©å£²ã—ãªã„
</text>
- <button label="土地販売ã®å–り消ã—" label_selected="土地販売ã®å–り消ã—" name="Cancel Land Sale"/>
+ <button label="土地販売ã®å–り消ã—" label_selected="土地販売ã®å–り消ã—" name="Cancel Land Sale" width="100"/>
<text name="Claimed:">
å–得日時:
</text>
@@ -126,26 +138,26 @@
<text name="DwellText">
誤
</text>
- <button label="土地ã®è³¼å…¥" label_selected="土地を購入..." left="130" name="Buy Land..." width="125"/>
- <button label="スクリプト情報" name="Scripts..."/>
+ <button label="土地ã®è³¼å…¥" label_selected="土地を購入..." left="130" name="Buy Land..." width="100"/>
+ <button label="スクリプト情報" name="Scripts..." width="100"/>
<button label="グループã«è³¼å…¥" label_selected="グループ用ã«è³¼å…¥..." name="Buy For Group..."/>
- <button label="入場許å¯ã‚’購入" label_selected="入場許å¯ã‚’購入..." left="130" name="Buy Pass..." tool_tip="ã“ã®åœŸåœ°ã¸ã®ä¸€æ™‚çš„ãªã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã—ã¾ã™ã€‚" width="125"/>
+ <button label="入場許å¯ã‚’購入" label_selected="入場許å¯ã‚’購入..." left="130" name="Buy Pass..." tool_tip="ã“ã®åœŸåœ°ã¸ã®ä¸€æ™‚çš„ãªã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã—ã¾ã™ã€‚" width="100"/>
<button label="åœŸåœ°ã®æ”¾æ£„" label_selected="土地を放棄..." name="Abandon Land..."/>
<button label="土地をå–り戻ã™" label_selected="土地ã®è¿”é‚„ã‚’è¦æ±‚..." name="Reclaim Land..."/>
- <button label="リンデンセール" label_selected="Lindenセール..." name="Linden Sale..." tool_tip="åœŸåœ°ãŒæ‰€æœ‰ã•れã¦ãŠã‚Šã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ãŒè¨­å®šã•れã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚オークションã®å¯¾è±¡ã«ãªã£ã¦ã„ãªã„ã“ã¨ã‚‚å¿…è¦æ¡ä»¶ã§ã™ã€‚"/>
+ <button label="リンデンセール" label_selected="Linden セール..." name="Linden Sale..." tool_tip="åœŸåœ°ãŒæ‰€æœ‰ã•れã¦ãŠã‚Šã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ãŒè¨­å®šã•れã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚オークションã®å¯¾è±¡ã«ãªã£ã¦ã„ãªã„ã“ã¨ã‚‚å¿…è¦æ¡ä»¶ã§ã™ã€‚"/>
</panel>
<panel label="約款" name="land_covenant_panel">
<panel.string name="can_resell">
- ã“ã®åœ°åŸŸã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€å†è²©ã§ãã¾ã™ã€‚
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€å†è²©ã§ãã¾ã™ã€‚
</panel.string>
<panel.string name="can_not_resell">
- ã“ã®åœ°åŸŸã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€å†è²©ã§ããªã„ã“ã¨ãŒã‚りã¾ã™ã€‚
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€å†è²©ã§ããªã„ã“ã¨ãŒã‚りã¾ã™ã€‚
</panel.string>
<panel.string name="can_change">
- ã“ã®åœ°åŸŸã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€çµ±åˆã¾ãŸã¯å†åˆ†å‰²ã§ãã¾ã™ã€‚
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€çµ±åˆã¾ãŸã¯å†åˆ†å‰²ã§ãã¾ã™ã€‚
</panel.string>
<panel.string name="can_not_change">
- ã“ã®åœ°åŸŸã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€çµ±åˆï¼å†åˆ†å‰²ã§ããªã„ã“ã¨ãŒ
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã§è³¼å…¥ã—ãŸåœŸåœ°ã¯ã€çµ±åˆãƒ»å†åˆ†å‰²ã§ããªã„ã“ã¨ãŒã‚りã¾ã™ã€‚
ã‚りã¾ã™ã€‚
</panel.string>
<text font="SansSerifLarge" name="estate_section_lbl">
@@ -155,7 +167,7 @@
メインランド
</text>
<text name="estate_owner_lbl">
- オーナー:
+ 所有者:
</text>
<text name="estate_owner_text">
(ãªã—)
@@ -188,31 +200,30 @@
å†è²©ï¼š
</text>
<text name="resellable_clause">
- ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«ã‚る土地ã¯å†è²©ã§ãã¾ã›ã‚“。
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã«ã‚る土地ã¯å†è²©ã§ãã¾ã›ã‚“。
</text>
<text name="changeable_lbl">
å†åˆ†å‰²ï¼š
</text>
<text name="changeable_clause">
- ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«ã‚る土地ã¯çµ±åˆã¾ãŸã¯åˆ†å‰²ãŒã§ã
-ã¾ã›ã‚“。
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã«ã‚る土地ã¯çµ±åˆã¾ãŸã¯åˆ†å‰²ãŒã§ããªã„ã“ã¨ãŒã‚りã¾ã™ã€‚
</text>
</panel>
<panel label="オブジェクト" name="land_objects_panel">
<panel.string left="200" name="objects_available_text">
- [MAX]ã®å†…[COUNT]([AVAILABLE]利用å¯èƒ½ï¼‰
+ [MAX] ã®å†… [COUNT]([AVAILABLE] 利用å¯èƒ½ï¼‰
</panel.string>
<panel.string left="200" name="objects_deleted_text">
- [MAX]ã®å†…[COUNT]([DELETED]を削除)
+ [MAX] ã®å†… [COUNT]([DELETED] を削除)
</panel.string>
<text name="parcel_object_bonus">
- 地域オブジェクトボーナスè¦å› : [BONUS]
+ オブジェクトボーナス: [BONUS]
</text>
<text name="Simulator primitive usage:" width="500">
プリム使用状æ³ï¼š
</text>
<text left="200" name="objects_available">
- [MAX]ã®å†…[COUNT]([AVAILABLE]利用å¯èƒ½ï¼‰
+ [MAX] ã®å†… [COUNT] ([AVAILABLE] 利用å¯èƒ½ï¼‰
</text>
<text name="Primitives parcel supports:" width="200">
区画ã§ã‚µãƒãƒ¼ãƒˆã•れるプリム数:
@@ -227,13 +238,13 @@
[COUNT]
</text>
<text name="Owned by parcel owner:" width="300">
- 区画オーナーã«ã‚ˆã‚‹æ‰€æœ‰ï¼š
+ åŒºç”»æ‰€æœ‰è€…ã®æ‰€æœ‰ç‰©ï¼š
</text>
<text left="200" name="owner_objects_text">
[COUNT]
</text>
<button label="表示" label_selected="表示" name="ShowOwner" right="-145"/>
- <button label="è¿”å´" label_selected="è¿”å´..." name="ReturnOwner..." right="-15" tool_tip="オブジェクトをオーナーã«è¿”å´ã—ã¾ã™"/>
+ <button label="è¿”å´" label_selected="è¿”å´..." name="ReturnOwner..." right="-15" tool_tip="オブジェクトを所有者ã«è¿”å´ã—ã¾ã™"/>
<text name="Set to group:">
グループã«è¨­å®šï¼š
</text>
@@ -241,35 +252,35 @@
[COUNT]
</text>
<button label="表示" label_selected="表示" name="ShowGroup" right="-145"/>
- <button label="è¿”å´" label_selected="è¿”å´..." name="ReturnGroup..." right="-15" tool_tip="オブジェクトをオーナーã«è¿”å´ã—ã¾ã™"/>
+ <button label="è¿”å´" label_selected="è¿”å´..." name="ReturnGroup..." right="-15" tool_tip="オブジェクトを所有者ã«è¿”å´ã—ã¾ã™"/>
<text name="Owned by others:">
- 他人ã«ã‚ˆã‚‹æ‰€æœ‰ï¼š
+ ä»–äººã®æ‰€æœ‰ç‰©ï¼š
</text>
<text left="200" name="other_objects_text">
[COUNT]
</text>
<button label="表示" label_selected="表示" name="ShowOther" right="-145"/>
- <button label="è¿”å´" label_selected="è¿”å´..." name="ReturnOther..." right="-15" tool_tip="オブジェクトをオーナーã«è¿”å´ã—ã¾ã™"/>
+ <button label="è¿”å´" label_selected="è¿”å´..." name="ReturnOther..." right="-15" tool_tip="オブジェクトを所有者ã«è¿”å´ã—ã¾ã™"/>
<text name="Selected / sat upon:">
- é¸æŠžæ¸ˆã¿ï¼æ±ºå®šæ¸ˆã¿ï¼š
+ é¸æŠžæ¸ˆã¿ãƒ»æ±ºå®šæ¸ˆã¿ï¼š
</text>
<text left="200" name="selected_objects_text">
[COUNT]
</text>
- <text name="Autoreturn" width="500">
- 他人ã®ã‚ªãƒ–ジェクトを自動返å´ï¼ˆåˆ†å˜ä½ã€0ã§è‡ªå‹•è¿”å´ãªã—):
+ <text name="Autoreturn">
+ 他人ã®ã‚ªãƒ–ジェクトを自動返å´ï¼ˆåˆ†å˜ä½ã€0 ã§è‡ªå‹•è¿”å´ãªã—):
</text>
<line_editor left_delta="5" name="clean other time" right="-80"/>
<text name="Object Owners:" width="150">
- オブジェクトã®ã‚ªãƒ¼ãƒŠãƒ¼ï¼š
+ ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…:
</text>
- <button label="リスト更新" label_selected="リスト更新" left="146" name="Refresh List" tool_tip="オブジェクトã®ãƒªã‚¹ãƒˆã‚’æ›´æ–°"/>
+ <button label="リスト更新" label_selected="リスト更新" left="146" name="Refresh List" tool_tip="オブジェクトã®ãƒªã‚¹ãƒˆã‚’æ›´æ–°ã—ã¾ã™"/>
<button label="オブジェクトを返å´ã™ã‚‹" label_selected="オブジェクトã®è¿”å´..." left="256" name="Return objects..."/>
<name_list label="カウント" name="owner list">
<name_list.columns label="タイプ" name="type"/>
<name_list.columns name="online_status"/>
<name_list.columns label="åå‰" name="name"/>
- <name_list.columns label="カウント" name="count"/>
+ <name_list.columns label="æ•°" name="count"/>
<name_list.columns label="最新" name="mostrecent"/>
</name_list>
</panel>
@@ -278,62 +289,62 @@
ã“ã®åŒºç”»ã‚’æ¤œç´¢çµæžœã«è¡¨ç¤ºã™ã‚‹
</panel.string>
<panel.string name="search_disabled_small_tooltip">
- 区画é¢ç©ãŒ128平方メートルã‹ãれ以下ã®ãŸã‚ã€ã“ã®ã‚ªãƒ—ションã¯ç„¡åйã§ã™ã€‚
+ 区画é¢ç©ãŒ 128 平方メートルã‹ãれ以下ã®ãŸã‚ã€ã“ã®ã‚ªãƒ—ションã¯ç„¡åйã§ã™ã€‚
大ããªåŒºç”»ã®ã¿æ¤œç´¢ã«è¡¨ç¤ºã•ã›ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚
</panel.string>
<panel.string name="search_disabled_permissions_tooltip">
ã‚ãªãŸã¯ã“ã®åŒºç”»ã®è¨­å®šç·¨é›†ãŒã§ããªã„ãŸã‚ã€ã“ã®ã‚ªãƒ—ションã¯ç„¡åйã§ã™ã€‚
</panel.string>
<panel.string name="mature_check_mature">
- 控ãˆã‚コンテンツ
+ 「Moderateã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„
</panel.string>
<panel.string name="mature_check_adult">
- Adultコンテンツ
+ 「Adultã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„
</panel.string>
<panel.string name="mature_check_mature_tooltip">
- ã‚ãªãŸã®åŒºç”»æƒ…å ±åŠã³ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯æŽ§ãˆã‚ã¨ã•れã¦ã„ã¾ã™ã€‚
+ ã‚ãªãŸã®åŒºç”»æƒ…å ±åŠã³ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã€ŒModerateã€ã¨ã•れã¦ã„ã¾ã™ã€‚
</panel.string>
<panel.string name="mature_check_adult_tooltip">
- ã‚ãªãŸã®åŒºç”»æƒ…å ±åŠã³ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯Adultã¨ã•れã¦ã„ã¾ã™ã€‚
+ ã‚ãªãŸã®åŒºç”»æƒ…å ±åŠã³ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã€ŒAdultã€ã¨ã•れã¦ã„ã¾ã™ã€‚
</panel.string>
<panel.string name="landing_point_none">
(ãªã—)
</panel.string>
<panel.string name="push_restrict_text">
- プッシングを制é™
+ ãƒ—ãƒƒã‚·ãƒ¥ç¦æ­¢
</panel.string>
<panel.string name="push_restrict_region_text">
- ãƒ—ãƒƒã‚·ãƒ³ã‚°ã‚’åˆ¶é™ (地域優先)
+ ãƒ—ãƒƒã‚·ãƒ¥ç¦æ­¢ (地域設定優先)
</panel.string>
<text name="allow_label">
ä»–ã®ä½äººã¸ã®è¨±å¯ï¼š
</text>
<check_box label="地形を編集" name="edit land check" tool_tip="ãƒã‚§ãƒƒã‚¯ã‚’入れるã¨ã€ä»–人ãŒã‚ãªãŸã®åœŸåœ°ã®åœ°å½¢ç·¨é›†ã‚’行ã†ã“ã¨ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ã“ã®ã‚ªãƒ—ションã®ãƒã‚§ãƒƒã‚¯ã‚’外ã—ã¦ãŠãã“ã¨ã‚’ãŠã™ã™ã‚ã—ã¾ã™ã€‚外ã—ãŸçŠ¶æ…‹ã§ã‚ãªãŸã®åœŸåœ°ã®åœ°å½¢ç·¨é›†ãŒå¯èƒ½ã§ã™ã€‚"/>
<check_box label="飛行" name="check fly" tool_tip="ãƒã‚§ãƒƒã‚¯ã‚’入れるã¨ã“ã®åœŸåœ°ã§ã®é£›è¡ŒãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ãƒã‚§ãƒƒã‚¯ã‚’外ã™ã¨åœŸåœ°ã«å…¥ã‚‹éš›ã¨é€šã‚ŠéŽãŽã‚‹ã¨ãã®ã¿é£›è¡Œå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚"/>
- <text left="138" name="allow_label2" width="144">
+ <text name="allow_label2">
制作:
</text>
- <check_box label="全員" left="280" name="edit objects check"/>
- <check_box label="グループ" left="380" name="edit group objects check"/>
- <text left="138" name="allow_label3" width="144">
+ <check_box label="全員" name="edit objects check"/>
+ <check_box label="グループ" name="edit group objects check"/>
+ <text name="allow_label3">
オブジェクトã®é€²å…¥ï¼š
</text>
- <check_box label="全員" left="280" name="all object entry check"/>
- <check_box label="グループ" left="380" name="group object entry check"/>
- <text left="138" name="allow_label4" width="144">
+ <check_box label="全員" name="all object entry check"/>
+ <check_box label="グループ" name="group object entry check"/>
+ <text name="allow_label4">
スクリプトã®å®Ÿè¡Œï¼š
</text>
- <check_box label="全員" left="280" name="check other scripts"/>
- <check_box label="グループ" left="380" name="check group scripts"/>
+ <check_box label="全員" name="check other scripts"/>
+ <check_box label="グループ" name="check group scripts"/>
<text name="land_options_label">
土地オプション:
</text>
<check_box label="安全(ダメージãªã—)" name="check safe" tool_tip="ãƒã‚§ãƒƒã‚¯ã‚’入れるã¨ã“ã®åœŸåœ°ã§ã®ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚³ãƒ³ãƒãƒƒãƒˆãŒç„¡åйã«ãªã‚Šã€ã€Œå®‰å…¨ã€ã«è¨­å®šã•れã¾ã™ã€‚ ãƒã‚§ãƒƒã‚¯ã‚’外ã™ã¨ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚³ãƒ³ãƒãƒƒãƒˆãŒæœ‰åйã«ãªã‚Šã¾ã™ã€‚"/>
- <check_box label="プッシングを制é™" name="PushRestrictCheck" tool_tip="スクリプトã«ã‚ˆã‚‹ãƒ—ッシングを制é™ã—ã¾ã™ã€‚ ã“ã®ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’é¸æŠžã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ã‚ãªãŸã®åœŸåœ°ã§ã®ç ´å£Šçš„行動を妨ã’ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/>
- <check_box label="検索ã«åŒºç”»ã‚’表示(週 L$30)" name="ShowDirectoryCheck" tool_tip="æ¤œç´¢çµæžœã§ã“ã®åŒºç”»ã‚’表示ã•ã›ã‚‹"/>
+ <check_box label="ãƒ—ãƒƒã‚·ãƒ¥ç¦æ­¢" name="PushRestrictCheck" tool_tip="スクリプトã«ã‚ˆã‚‹ãƒ—ãƒƒã‚·ãƒ¥ã‚’ç¦æ­¢ã—ã¾ã™ã€‚ ã“ã®ã‚ªãƒ—ã‚·ãƒ§ãƒ³ã‚’é¸æŠžã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€ã‚ãªãŸã®åœŸåœ°ã§ã®ç ´å£Šçš„行動を防ãã“ã¨ãŒã§ãã¾ã™ã€‚"/>
+ <check_box label="検索ã«åŒºç”»ã‚’表示(週 L$ 30)" name="ShowDirectoryCheck" tool_tip="ã“ã®åŒºç”»ã‚’æ¤œç´¢çµæžœã«è¡¨ç¤ºã—ã¾ã™"/>
<combo_box name="land category with adult">
<combo_box.item label="全カテゴリ" name="item0"/>
- <combo_box.item label="Linden所在地" name="item1"/>
+ <combo_box.item label="Linden 所在地" name="item1"/>
<combo_box.item label="Adult" name="item2"/>
<combo_box.item label="アートã¨ã‚«ãƒ«ãƒãƒ£ãƒ¼" name="item3"/>
<combo_box.item label="ビジãƒã‚¹" name="item4"/>
@@ -347,8 +358,8 @@
<combo_box.item label="ãã®ä»–" name="item12"/>
</combo_box>
<combo_box name="land category">
- <combo_box.item label="全カテゴリー" name="item0"/>
- <combo_box.item label="Linden所在地" name="item1"/>
+ <combo_box.item label="全カテゴリ" name="item0"/>
+ <combo_box.item label="Linden 所在地" name="item1"/>
<combo_box.item label="アート&amp;カルãƒãƒ£ãƒ¼" name="item3"/>
<combo_box.item label="ビジãƒã‚¹" name="item4"/>
<combo_box.item label="教育的" name="item5"/>
@@ -360,18 +371,18 @@
<combo_box.item label="ショッピング" name="item11"/>
<combo_box.item label="ãã®ä»–" name="item12"/>
</combo_box>
- <check_box label="控ãˆã‚コンテンツ" name="MatureCheck" tool_tip=""/>
+ <check_box label="「Moderateã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„" name="MatureCheck" tool_tip=""/>
<text name="Snapshot:">
スナップショット:
</text>
- <texture_picker label="" left="116" name="snapshot_ctrl" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
+ <texture_picker label="" name="snapshot_ctrl" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
<text name="landing_point">
ç€åœ°ç‚¹: [LANDING]
</text>
<button label="設定" label_selected="設定" name="Set" tool_tip="訪å•者ã®ç€åœ°ç‚¹ã®è¨­å®šã‚’行ã„ã¾ã™ã€‚ã“ã®åŒºç”»å†…ã«ç«‹ã£ã¦è¡Œã£ã¦ãã ã•ã„。"/>
<button label="クリア" label_selected="クリア" name="Clear" tool_tip="ç€åœ°ç‚¹ã‚’クリア"/>
<text name="Teleport Routing: ">
- テレãƒãƒ¼ãƒˆåˆ¶é™ï¼š
+ テレãƒãƒ¼ãƒˆçµŒè·¯ï¼š
</text>
<combo_box name="landing type" tool_tip="テレãƒãƒ¼ãƒˆçµŒè·¯ -- ã‚ãªãŸã®åœŸåœ°ã¸ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆçµŒè·¯ã‚’é¸æŠž">
<combo_box.item label="ä¸å¯" name="Blocked"/>
@@ -383,33 +394,29 @@
<text name="with media:">
種類:
</text>
- <combo_box name="media type" tool_tip="URL ãŒå‹•ç”»ã€ã‚¦ã‚§ãƒ–・ページã€ãã®ä»–ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã®å ´åˆã«æŒ‡å®šã—ã¾ã™"/>
+ <combo_box name="media type" tool_tip="URL ãŒå‹•ç”»ã€Web ページã€ãã®ä»–ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‹ã‚’指定ã—ã¾ã™"/>
<text name="at URL:">
ホームページ:
</text>
- <button label="設定" label_selected="設定..." name="set_media_url"/>
- <text name="CurrentURL:">
- ç¾åœ¨ã®ãƒšãƒ¼ã‚¸ï¼š
- </text>
- <button label="リセット..." label_selected="リセット..." name="reset_media_url" tool_tip="URLを更新"/>
+ <button label="設定" name="set_media_url"/>
<check_box label="URL ã‚’éžè¡¨ç¤º" name="hide_media_url" tool_tip="ã“ã®ã‚ªãƒ—ションをオンã«ã™ã‚‹ã¨ã€è¨±å¯ãªã—ã§ã“ã®åŒºç”»æƒ…å ±ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã„るユーザーã«ã¯ãƒ¡ãƒ‡ã‚£ã‚¢ URL ãŒè¡¨ç¤ºã•れã¾ã›ã‚“。 ã“れ㯠HTML タイプã«ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“ã®ã§ã”注æ„ãã ã•ã„。"/>
<text name="Description:">
説明:
</text>
- <line_editor name="url_description" tool_tip="ï¼»å†ç”Ÿï¼½/[ロード]ボタンã®éš£ã«è¡¨ç¤ºã•れるテキスト"/>
+ <line_editor name="url_description" tool_tip="「å†ç”Ÿã€ã€Œãƒ­ãƒ¼ãƒ‰ã€ãƒœã‚¿ãƒ³ã®éš£ã«è¡¨ç¤ºã•れるテキストã§ã™"/>
<text name="Media texture:">
- テクスãƒãƒ£ã®ç½®ãæ›ãˆï¼š
+ テクスãƒãƒ£ç½®ãæ›ãˆï¼š
</text>
- <texture_picker label="" name="media texture" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
+ <texture_picker label="" left="120" name="media texture" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
<text name="replace_texture_help" width="290">
- ã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’使用ã™ã‚‹ã‚ªãƒ–ジェクトã®ãƒ—レイをクリックã™ã‚‹ã¨ã€ãƒ ãƒ¼ãƒ“ーや Web ページを表示ã—ã¾ã™ã€‚ テクスãƒãƒ£ã‚’変更ã™ã‚‹ã«ã¯ã‚µãƒ ãƒã‚¤ãƒ«ã‚’é¸æŠžã—ã¦ãã ã•ã„。
+ ã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’使用ã™ã‚‹ã‚ªãƒ–ジェクトã®ã€Œå†ç”Ÿã€ã‚’クリックã™ã‚‹ã¨ã€å‹•画や Web ページを表示ã—ã¾ã™ã€‚ テクスãƒãƒ£ã‚’変更ã™ã‚‹ã«ã¯ã‚µãƒ ãƒã‚¤ãƒ«ã‚’é¸æŠžã—ã¦ãã ã•ã„。
</text>
- <check_box label="スケールを自動設定" name="media_auto_scale" tool_tip="ã“ã®ã‚ªãƒ—ションをãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¨ã€ã“ã®åŒºç”»ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ã‚¹ã‚±ãƒ¼ãƒ«ãŒè‡ªå‹•çš„ã«è¨­å®šã•れã¾ã™ã€‚ 動作速度ã¨ç”»è³ªãŒå°‘ã—低下ã™ã‚‹ã“ã¨ãŒã‚りã¾ã™ãŒã€ä»–ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼ã®ã‚¹ã‚±ãƒ¼ãƒªãƒ³ã‚°ã‚„整列ãŒå¿…è¦ã«ãªã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“。"/>
- <text name="media_size" tool_tip="レンダリングã™ã‚‹ã‚¦ã‚§ãƒ–・メディアã®ã‚µã‚¤ã‚ºã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚">
+ <check_box label="スケールを自動設定" name="media_auto_scale" tool_tip="ã“ã®ã‚ªãƒ—ションをãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¨ã€ã“ã®åŒºç”»ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ã‚¹ã‚±ãƒ¼ãƒ«ãŒè‡ªå‹•çš„ã«è¨­å®šã•れã¾ã™ã€‚ 動作速度ã¨ç”»è³ªãŒå°‘ã—低下ã™ã‚‹ã“ã¨ãŒã‚りã¾ã™ãŒã€ä»–ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ã‚¹ã‚±ãƒ¼ãƒªãƒ³ã‚°ã‚„整列ãŒå¿…è¦ã«ãªã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“。"/>
+ <text name="media_size" tool_tip="レンダリングã™ã‚‹ Web メディアã®ã‚µã‚¤ã‚ºã§ã™ã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚">
サイズ:
</text>
- <spinner name="media_size_width" tool_tip="レンダリングã™ã‚‹ã‚¦ã‚§ãƒ–・メディアã®ã‚µã‚¤ã‚ºã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/>
- <spinner name="media_size_height" tool_tip="レンダリングã™ã‚‹ã‚¦ã‚§ãƒ–・メディアã®ã‚µã‚¤ã‚ºã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/>
+ <spinner name="media_size_width" tool_tip="レンダリングã™ã‚‹ Web メディアã®ã‚µã‚¤ã‚ºã§ã™ã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/>
+ <spinner name="media_size_height" tool_tip="レンダリングã™ã‚‹ Web メディアã®ã‚µã‚¤ã‚ºã§ã™ã€‚デフォルト㮠0 ã®ã¾ã¾ã«ã—ã¾ã™ã€‚"/>
<text name="pixels">
ピクセル
</text>
@@ -422,35 +429,39 @@
<text name="MusicURL:">
音楽 URL:
</text>
+ <check_box label="URL ã‚’éžè¡¨ç¤ºã«ã™ã‚‹" name="hide_music_url" tool_tip="ã“ã®ã‚ªãƒ—ションã«ãƒã‚§ãƒƒã‚¯ã‚’入れるã¨ã€æ¨©é™ã®ãªã„人ãŒåŒºç”»æƒ…報を見ãŸã¨ãã«éŸ³æ¥½ã® URL ãŒéš ã‚Œã¾ã™ã€‚"/>
<text name="Sound:">
サウンド:
</text>
- <check_box label="ジェスãƒãƒ£ãƒ¼ã¨ã‚ªãƒ–ジェクトã®éŸ³ã‚’ã“ã®åŒºç”»ã ã‘ã«é™å®š" name="check sound local"/>
+ <check_box label="ジェスãƒãƒ£ãƒ¼ã¨ã‚ªãƒ–ジェクトã®éŸ³ã‚’ã“ã®åŒºç”»ã ã‘ã«é™å®šã™ã‚‹" name="check sound local"/>
<text name="Voice settings:">
ボイス:
</text>
<check_box label="ボイスを有効ã«ã™ã‚‹" name="parcel_enable_voice_channel"/>
<check_box label="ボイスを有効ã«ã™ã‚‹ï¼ˆä¸å‹•産設定)" name="parcel_enable_voice_channel_is_estate_disabled"/>
- <check_box label="ã“ã®åŒºç”»ã§ã®ãƒœã‚¤ã‚¹ä½¿ç”¨ã‚’制é™" name="parcel_enable_voice_channel_parcel"/>
+ <check_box label="ボイスをã“ã®åŒºç”»ã«é™å®šã™ã‚‹" name="parcel_enable_voice_channel_local"/>
</panel>
<panel label="アクセス" name="land_access_panel">
<panel.string name="access_estate_defined">
(エステートã«é™å®šï¼‰
</panel.string>
+ <panel.string name="allow_public_access">
+ ãƒ‘ãƒ–ãƒªãƒƒã‚¯ã‚¢ã‚¯ã‚»ã‚¹ã‚’è¨±å¯ ï¼ˆ[MATURITY])
+ </panel.string>
<panel.string name="estate_override">
- 1ã¤ä»¥ä¸Šã®ã‚ªãƒ—ションãŒã€ä¸å‹•産レベルã§è¨­å®šã•れã¦ã„ã¾ã™ã€‚
+ 1 ã¤ä»¥ä¸Šã®ã‚ªãƒ—ションãŒã€ä¸å‹•産レベルã§è¨­å®šã•れã¦ã„ã¾ã™ã€‚
</panel.string>
<text name="Limit access to this parcel to:">
- ã“ã®åŒºç”»ã«ã‚¢ã‚¯ã‚»ã‚¹
+ ã“ã®åŒºç”»ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹
</text>
- <check_box label="ãƒ‘ãƒ–ãƒªãƒƒã‚¯ã‚¢ã‚¯ã‚»ã‚¹ã‚’è¨±å¯ [MATURITY]" name="public_access"/>
+ <check_box label="パブリックアクセスを許å¯ã™ã‚‹ [MATURITY]" name="public_access"/>
<text name="Only Allow">
- 次ã®ä½äººã®ã‚¢ã‚¯ã‚»ã‚¹ç¦æ­¢ï¼š
+ 次ã®ä½äººã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ï¼š
</text>
<check_box label="支払情報登録済 [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="未確èªã®ä½äººã®ç«‹å…¥ã‚’ç¦æ­¢ã—ã¾ã™ã€‚"/>
<check_box label="å¹´é½¢ç¢ºèª [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„ä½äººã®ç«‹å…¥ã‚’ç¦æ­¢ã—ã¾ã™ã€‚ 詳ã—ã„æƒ…報㯠[SUPPORT_SITE] ã‚’ã”覧下ã•ã„。"/>
- <check_box label="グループ・アクセスを許å¯ï¼š[GROUP]" name="GroupCheck" tool_tip="[一般]タブã§ã€ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã—ã¦ãã ã•ã„。"/>
- <check_box label="入場許å¯ã‚’販売:" name="PassCheck" tool_tip="ã“ã®åŒºç”»ã¸ã®ä¸€æ™‚çš„ãªã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯"/>
+ <check_box label="グループã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ï¼š[GROUP]" name="GroupCheck" tool_tip="「一般ã€ã‚¿ãƒ–ã§ã€ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã—ã¦ãã ã•ã„。"/>
+ <check_box label="入場許å¯ã‚’販売:" name="PassCheck" tool_tip="ã“ã®åŒºç”»ã¸ã®ä¸€æ™‚çš„ãªã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã—ã¾ã™ã€‚"/>
<combo_box name="pass_combo">
<combo_box.item label="誰ã§ã‚‚" name="Anyone"/>
<combo_box.item label="グループ" name="Group"/>
@@ -467,7 +478,7 @@
</panel>
<panel name="Banned_layout_panel">
<text label="ç¦æ­¢" name="BanCheck">
- ç«‹å…¥ç¦æ­¢ã•れãŸä½äºº
+ ç«‹å…¥ã‚’ç¦æ­¢ã•れãŸä½äºº
</text>
<name_list name="BannedList" tool_tip="(åˆè¨ˆ [LISTED] äººã€æœ€å¤§ [MAX] 人)"/>
<button label="追加" name="add_banned"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_animation_preview.xml b/indra/newview/skins/default/xui/ja/floater_animation_preview.xml
index c355924f33..548d24097f 100644
--- a/indra/newview/skins/default/xui/ja/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_animation_preview.xml
@@ -106,6 +106,9 @@
<floater.string name="E_ST_NO_XLT_EMOTE">
エモートåを読ã¿ã¨ã‚Œã¾ã›ã‚“。
</floater.string>
+ <floater.string name="E_ST_BAD_ROOT">
+ ルートジョイントåãŒç„¡åйã§ã™ã€‚「hipã€ã‚’使用ã—ã¦ãã ã•ã„。
+ </floater.string>
<text name="name_label">
åå‰ï¼š
</text>
@@ -114,8 +117,8 @@
</text>
<spinner label="優先順ä½" name="priority" tool_tip="ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ãŒã©ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’上書ãã™ã‚‹ã‹ã‚’決ã‚ã¾ã™"/>
<check_box label="ループ" name="loop_check" tool_tip="ã“ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ループå†ç”Ÿã—ã¾ã™"/>
- <spinner label="イン(ï¼…)" label_width="45" left="70" name="loop_in_point" tool_tip="アニメーションã®ãƒ«ãƒ¼ãƒ—復帰点を設定ã—ã¾ã™" width="100"/>
- <spinner label="アウト(ï¼…)" label_width="60" left="170" name="loop_out_point" tool_tip="アニメーションã®ãƒ«ãƒ¼ãƒ—終了点を設定ã—ã¾ã™" width="100"/>
+ <spinner label="イン(ï¼…)" label_width="45" left="60" name="loop_in_point" tool_tip="アニメーションã®ãƒ«ãƒ¼ãƒ—復帰点を設定ã—ã¾ã™" width="100"/>
+ <spinner label="アウト(ï¼…)" label_width="50" left="170" name="loop_out_point" tool_tip="アニメーションã®ãƒ«ãƒ¼ãƒ—終了点を設定ã—ã¾ã™" width="100"/>
<text name="hand_label">
手ã®å‹•ã
</text>
@@ -138,47 +141,47 @@
表ç¾
</text>
<combo_box label="" name="emote_combo" tool_tip="アニメーションå†ç”Ÿä¸­ã®é¡”ã®è¡¨æƒ…を決ã‚ã¾ã™">
- <combo_box.item label="(ãªã—)" name="[None]"/>
- <combo_box.item label="アーーーーー" name="Aaaaah"/>
- <combo_box.item label="æã‚Œã‚‹" name="Afraid"/>
- <combo_box.item label="怒る" name="Angry"/>
- <combo_box.item label="満é¢ã®ç¬‘ã¿" name="BigSmile"/>
- <combo_box.item label="退屈" name="Bored"/>
- <combo_box.item label="æ³£ã" name="Cry"/>
- <combo_box.item label="侮辱" name="Disdain"/>
- <combo_box.item label="æ¥ãšã‹ã—ãŒã‚‹" name="Embarrassed"/>
- <combo_box.item label="ã—ã‹ã‚ã£é¢" name="Frown"/>
- <combo_box.item label="キス" name="Kiss"/>
- <combo_box.item label="笑ã†" name="Laugh"/>
- <combo_box.item label="Plllppt" name="Plllppt"/>
- <combo_box.item label="嫌悪感" name="Repulsed"/>
- <combo_box.item label="悲ã—ã„" name="Sad"/>
- <combo_box.item label="è‚©ã‚’ã™ãã‚ã‚‹" name="Shrug"/>
- <combo_box.item label="微笑む" name="Smile"/>
- <combo_box.item label="驚ã" name="Surprise"/>
- <combo_box.item label="ウィンク" name="Wink"/>
- <combo_box.item label="心é…ã™ã‚‹" name="Worry"/>
+ <item label="(ãªã—)" name="[None]" value=""/>
+ <item label="アーーーーー" name="Aaaaah" value="アーーーーー"/>
+ <item label="æã‚Œã‚‹" name="Afraid" value="æã‚Œã‚‹"/>
+ <item label="怒る" name="Angry" value="怒る"/>
+ <item label="満é¢ã®ç¬‘ã¿" name="BigSmile" value="満é¢ã®ç¬‘ã¿"/>
+ <item label="退屈" name="Bored" value="退屈"/>
+ <item label="æ³£ã" name="Cry" value="æ³£ã"/>
+ <item label="侮辱" name="Disdain" value="侮辱"/>
+ <item label="æ¥ãšã‹ã—ãŒã‚‹" name="Embarrassed" value="æ¥ãšã‹ã—ãŒã‚‹"/>
+ <item label="ã—ã‹ã‚ã£é¢" name="Frown" value="ã—ã‹ã‚ã£é¢"/>
+ <item label="キス" name="Kiss" value="キス"/>
+ <item label="笑ã†" name="Laugh" value="笑ã†"/>
+ <item label="Plllppt" name="Plllppt" value="Plllppt"/>
+ <item label="嫌悪感" name="Repulsed" value="嫌悪感"/>
+ <item label="悲ã—ã„" name="Sad" value="悲ã—ã„"/>
+ <item label="è‚©ã‚’ã™ãã‚ã‚‹" name="Shrug" value="è‚©ã‚’ã™ãã‚ã‚‹"/>
+ <item label="微笑む" name="Smile" value="微笑む"/>
+ <item label="驚ã" name="Surprise" value="驚ã"/>
+ <item label="ウィンク" name="Wink" value="ウィンク"/>
+ <item label="心é…ã™ã‚‹" name="Worry" value="心é…ã™ã‚‹"/>
</combo_box>
<text name="preview_label">
åŒæ™‚進行行動
</text>
<combo_box label="" name="preview_base_anim" tool_tip="ã‚¢ãƒã‚¿ãƒ¼ãŒæ™®é€šã®è¡Œå‹•ã‚’ã™ã‚‹ã¨ãã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®å‹•ãをテストã™ã‚‹ãŸã‚ã«ã“れを使ã„ã¾ã™ã€‚">
- <combo_box.item label="ç«‹ã¤" name="Standing"/>
- <combo_box.item label="æ­©ã" name="Walking"/>
- <combo_box.item label="座る" name="Sitting"/>
- <combo_box.item label="飛ã¶" name="Flying"/>
+ <item label="ç«‹ã¤" name="Standing" value="ç«‹ã¤"/>
+ <item label="æ­©ã" name="Walking" value="æ­©ã"/>
+ <item label="座る" name="Sitting" value="座る"/>
+ <item label="飛ã¶" name="Flying" value="飛ã¶"/>
</combo_box>
- <spinner label="フェーズイï¾(ç§’)" name="ease_in_time" tool_tip="アニメーションã®ãƒ–レンドイン時間(秒)"/>
- <spinner label="フェーズアウト(ç§’)" name="ease_out_time" tool_tip="アニメーションã®ãƒ–レンドアウト時間(秒)"/>
+ <spinner label="イーズイン(ç§’)" name="ease_in_time" tool_tip="アニメーションã®ãƒ–レンドイン時間(秒)"/>
+ <spinner label="イーズアウト(ç§’)" name="ease_out_time" tool_tip="アニメーションã®ãƒ–レンドアウト時間(秒)"/>
<button label="" name="play_btn" tool_tip="アニメーションをå†ç”Ÿã™ã‚‹"/>
<button name="pause_btn" tool_tip="ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’ä¸€æ™‚åœæ­¢ã™ã‚‹"/>
<button label="" name="stop_btn" tool_tip="アニメーションã®å†ç”Ÿã‚’åœæ­¢"/>
<slider label="" name="playback_slider"/>
<text name="bad_animation_text">
- アニメーション・ファイルを読ã¿è¾¼ã‚ã¾ã›ã‚“。
+ アニメーションファイルを読ã¿è¾¼ã‚ã¾ã›ã‚“。
Poser 4ã‹ã‚‰ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã•れãŸBVHファイルを推奨ã—ã¾ã™ã€‚
</text>
- <button label="アップロードL$[AMOUNT]" name="ok_btn"/>
+ <button label="アップロードL$[AMOUNT]" name="ok_btn"/>
<button label="å–り消ã—" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml b/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml
index a199a10823..5c23b77498 100644
--- a/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml
+++ b/indra/newview/skins/default/xui/ja/floater_avatar_textures.xml
@@ -3,44 +3,48 @@
<floater.string name="InvalidAvatar">
無効ãªã‚¢ãƒã‚¿ãƒ¼
</floater.string>
- <text name="label">
- ベークドテクスãƒãƒ£
- </text>
- <text name="composite_label" width="128">
- åˆæˆãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼
- </text>
- <button label="テクスãƒãƒ£IDä¸€è¦§ã‚’ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã«æ›¸ã込む" label_selected="æ¨ã¦ã‚‹" name="Dump"/>
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
- <texture_picker label="髪" name="hair-baked"/>
- <texture_picker label="髪" name="hair_grain"/>
- <texture_picker label="髪ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="hair_alpha"/>
- <texture_picker label="é ­" name="head-baked"/>
- <texture_picker label="メイクアップ" name="head_bodypaint"/>
- <texture_picker label="頭部ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="head_alpha"/>
- <texture_picker label="頭部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="head_tattoo"/>
- <texture_picker label="ç›®" name="eyes-baked"/>
- <texture_picker label="ç›®" name="eyes_iris"/>
- <texture_picker label="ç›®ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="eyes_alpha"/>
- <texture_picker label="上åŠèº«" name="upper-baked"/>
- <texture_picker label="上åŠèº«ã®ãƒœãƒ‡ã‚£ãƒšã‚¤ãƒ³ãƒˆ" name="upper_bodypaint"/>
- <texture_picker label="下ç€ã‚·ãƒ£ãƒ„" name="upper_undershirt"/>
- <texture_picker label="手袋" name="upper_gloves"/>
- <texture_picker label="シャツ" name="upper_shirt"/>
- <texture_picker label="上ç€" name="upper_jacket"/>
- <texture_picker label="アルファ(上)" name="upper_alpha"/>
- <texture_picker label="上部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="upper_tattoo"/>
- <texture_picker label="下åŠèº«" name="lower-baked"/>
- <texture_picker label="下åŠèº«ã®ãƒœãƒ‡ã‚£ãƒšã‚¤ãƒ³ãƒˆ" name="lower_bodypaint"/>
- <texture_picker label="下ç€ãƒ‘ンツ" name="lower_underpants"/>
- <texture_picker label="é´ä¸‹" name="lower_socks"/>
- <texture_picker label="é´" name="lower_shoes"/>
- <texture_picker label="パンツ" name="lower_pants"/>
- <texture_picker label="ジャケット" name="lower_jacket"/>
- <texture_picker label="アルファ(下)" name="lower_alpha"/>
- <texture_picker label="下部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="lower_tattoo"/>
- <texture_picker label="スカート" name="skirt-baked"/>
- <texture_picker label="スカート" name="skirt"/>
+ <text name="label">
+ ベークド
+テクスãƒãƒ£
+ </text>
+ <text name="composite_label">
+ åˆæˆ
+テクスãƒãƒ£
+ </text>
+ <button label="ID をコンソールã«ãƒ€ãƒ³ãƒ—" label_selected="ダンプ" name="Dump"/>
+ <panel name="scroll_content_panel">
+ <texture_picker label="髪" name="hair-baked"/>
+ <texture_picker label="髪" name="hair_grain"/>
+ <texture_picker label="髪ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="hair_alpha"/>
+ <texture_picker label="é ­" name="head-baked"/>
+ <texture_picker label="メイクアップ" name="head_bodypaint"/>
+ <texture_picker label="頭部ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="head_alpha"/>
+ <texture_picker label="頭部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="head_tattoo"/>
+ <texture_picker label="ç›®" name="eyes-baked"/>
+ <texture_picker label="ç›®" name="eyes_iris"/>
+ <texture_picker label="ç›®ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="eyes_alpha"/>
+ <texture_picker label="上åŠèº«" name="upper-baked"/>
+ <texture_picker label="ボディペイント(上)" name="upper_bodypaint"/>
+ <texture_picker label="下ç€ã‚·ãƒ£ãƒ„" name="upper_undershirt"/>
+ <texture_picker label="手袋" name="upper_gloves"/>
+ <texture_picker label="シャツ" name="upper_shirt"/>
+ <texture_picker label="上ç€" name="upper_jacket"/>
+ <texture_picker label="アルファ(上)" name="upper_alpha"/>
+ <texture_picker label="上部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="upper_tattoo"/>
+ <texture_picker label="下åŠèº«" name="lower-baked"/>
+ <texture_picker label="ボディペイント(下)" name="lower_bodypaint"/>
+ <texture_picker label="下ç€ãƒ‘ンツ" name="lower_underpants"/>
+ <texture_picker label="é´ä¸‹" name="lower_socks"/>
+ <texture_picker label="é´" name="lower_shoes"/>
+ <texture_picker label="パンツ" name="lower_pants"/>
+ <texture_picker label="ジャケット" name="lower_jacket"/>
+ <texture_picker label="アルファ(下)" name="lower_alpha"/>
+ <texture_picker label="下部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="lower_tattoo"/>
+ <texture_picker label="スカート" name="skirt-baked"/>
+ <texture_picker label="スカート" name="skirt"/>
+ </panel>
</panel>
</scroll_container>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_build_options.xml b/indra/newview/skins/default/xui/ja/floater_build_options.xml
index 8d3dba3883..8cb67ca521 100644
--- a/indra/newview/skins/default/xui/ja/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/ja/floater_build_options.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="build options floater" title="グリッドオプション">
- <spinner label="グリッドユニット(メートル)" name="GridResolution"/>
- <spinner label="グリッド範囲(メートル)" name="GridDrawSize"/>
- <check_box label="サブユニットã«ã‚¹ãƒŠãƒƒãƒ—" name="GridSubUnit"/>
+ <spinner label="グリッドå˜ä½ï¼ˆãƒ¡ãƒ¼ãƒˆãƒ«ï¼‰" name="GridResolution"/>
+ <spinner label="グリッド゙範囲(メートル)" name="GridDrawSize"/>
+ <check_box label="より細ã‹ã„å˜ä½ã§ã‚¹ãƒŠãƒƒãƒ—フィット" name="GridSubUnit"/>
<check_box label="横断é¢ã‚’表示" name="GridCrossSection"/>
- <text name="grid_opacity_label" tool_tip="グリッドã®é€æ˜Žåº¦">
- 逿˜Žåº¦ï¼š
+ <text name="grid_opacity_label" tool_tip="グリッドã®ä¸é€æ˜Žåº¦">
+ ä¸é€æ˜Žåº¦ï¼š
</text>
<slider label="グリッドã®ä¸é€æ˜Žåº¦" name="GridOpacity"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml b/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml
index fbbbd85890..be24960c6e 100644
--- a/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/ja/floater_bulk_perms.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterbulkperms" title="コンテンツ権é™ã®ç·¨é›†">
+<floater name="floaterbulkperms" title="ä¸­èº«ã®æ¨©é™ã®ç·¨é›†">
<floater.string name="nothing_to_modify_text">
- é¸æŠžã—ãŸä¸­ã«ç·¨é›†ã§ããªã„コンテンツãŒå«ã¾ã‚Œã¦ã„ã¾ã™
+ é¸æŠžã—ãŸä¸­ã«ç·¨é›†ã§ããªã„ã‚‚ã®ãŒå«ã¾ã‚Œã¦ã„ã¾ã™
</floater.string>
<floater.string name="status_text">
[NAME]ã«æ¨©é™ã‚’設定中ã§ã™ã€‚
@@ -28,12 +28,12 @@
<icon name="icon_script" tool_tip="スクリプト"/>
<check_box label="サウンド" name="check_sound"/>
<icon name="icon_sound" tool_tip="サウンド"/>
- <check_box label="テクスãƒãƒ£ãƒ¼" name="check_texture"/>
+ <check_box label="テクスãƒãƒ£" name="check_texture"/>
<icon name="icon_texture" tool_tip="テクスãƒãƒ£"/>
<button label="ã™ã¹ã¦ã« √" label_selected="å…¨ã¦" name="check_all"/>
<button label="クリア" label_selected="ãªã—" name="check_none"/>
<text name="newperms">
- æ–°ã—ã„コンテンツ権é™
+ æ–°ã—ã„ä¸­èº«ã®æ¨©é™
</text>
<text name="GroupLabel">
グループ:
@@ -43,7 +43,7 @@
全員:
</text>
<check_box label="コピー" name="everyone_copy"/>
- <text name="NextOwnerLabel">
+ <text name="NextOwnerLabel" left="160">
æ¬¡ã®æ‰€æœ‰è€…:
</text>
<check_box label="修正" name="next_owner_modify"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_contents.xml b/indra/newview/skins/default/xui/ja/floater_buy_contents.xml
index 53b7f24141..ed17736eb3 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_contents.xml
@@ -1,22 +1,22 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater min_width="340" name="floater_buy_contents" title="コンテンツã®è³¼å…¥" width="340">
+<floater min_width="340" name="floater_buy_contents" title="中身ã®è³¼å…¥" width="340">
<text name="contains_text" width="320">
- [NAME]ã®å†…容:
+ [NAME] ã®ä¸­èº«ï¼š
</text>
<scroll_list name="item_list" width="310"/>
<text name="buy_text" width="320">
- コンテンツを[NAME]ã‹ã‚‰L$[AMOUNT]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ
+ 中身を [NAME] ã‹ã‚‰ L$[AMOUNT] ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ
</text>
<button label="å–り消ã—" label_selected="å–り消ã—" name="cancel_btn" width="73"/>
<button label="購入" label_selected="購入" left_delta="-77" name="buy_btn" width="73"/>
- <check_box label="今ã™ãæœã‚’ç€ã‚‹" left_delta="-125" name="wear_check"/>
+ <check_box label="今ã™ãç€ã‚‹" left_delta="-125" name="wear_check"/>
<text name="no_copy_text">
- (コピーãªã—)
+ (コピーä¸å¯ï¼‰
</text>
<text name="no_modify_text">
- (修正ãªã—)
+ (修正ä¸å¯ï¼‰
</text>
<text name="no_transfer_text">
- (転é€ãªã—)
+ (å†è²©ãƒ»ãƒ—レゼントä¸å¯ï¼‰
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_currency.xml b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
index ffdcf838d3..22af6e0ea2 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_currency.xml
@@ -37,16 +37,16 @@
見ç©ã‚‚り中...
</text>
<text name="buy_action">
- [NAME] L$ [PRICE]
+ [ACTION]
</text>
<text name="total_label">
- æ–°ã—ã„æ®‹é«˜
+ è³¼å…¥å¾Œã®æ®‹é«˜
</text>
<text name="total_amount">
L$ [AMT]
</text>
<text name="currency_links">
- [http://www.secondlife.com/my/account/payment_method_management.php?lang=ja-JP payment method] | [http://www.secondlife.com/my/account/currency.php?lang=ja-JP currency] | [http://www.secondlife.com/my/account/exchange_rates.php?lang=ja-JP exchange rate]
+ [http://www.secondlife.com/my/account/payment_method_management.php?lang=ja-JP 支払方法] | [http://www.secondlife.com/my/account/currency.php?lang=ja-JP 通貨] | [http://www.secondlife.com/my/account/exchange_rates.php?lang=ja-JP æ›ç®—レート]
</text>
<text name="exchange_rate_note">
金é¡ã‚’å†å…¥åŠ›ã—ã¦æœ€æ–°æ›ç®—レートを確èªã—ã¾ã™ã€‚
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_currency_html.xml b/indra/newview/skins/default/xui/ja/floater_buy_currency_html.xml
new file mode 100644
index 0000000000..37fd6826e5
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_buy_currency_html.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_buy_currency_html" title="通貨ã®è³¼å…¥"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_land.xml b/indra/newview/skins/default/xui/ja/floater_buy_land.xml
index 13b43d1257..34f9d38de1 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_land.xml
@@ -1,5 +1,129 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="buy land" title="土地ã®è³¼å…¥">
+ <floater.string name="can_resell">
+ å†è²©å¯èƒ½
+ </floater.string>
+ <floater.string name="can_not_resell">
+ å†è²©ä¸å¯èƒ½
+ </floater.string>
+ <floater.string name="can_change">
+ çµ±åˆãƒ»å†åˆ†å‰²å¯èƒ½
+ </floater.string>
+ <floater.string name="can_not_change">
+ çµ±åˆãƒ»å†åˆ†å‰²ä¸å¯èƒ½
+ </floater.string>
+ <floater.string name="cant_buy_for_group">
+ ã‚ãªãŸã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚°ãƒ«ãƒ¼ãƒ—用ã®åœŸåœ°è³¼å…¥ã‚’許å¯ã•れã¦ã„ã¾ã›ã‚“
+ </floater.string>
+ <floater.string name="no_land_selected">
+ 土地ãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“
+ </floater.string>
+ <floater.string name="multiple_parcels_selected">
+ 複数ã®ç•°ãªã£ãŸåŒºç”»ã‚’é¸æŠžã—ã¾ã—ãŸã€‚
+ã“れよりå°ã•ãªç¯„å›²ã‚’é¸æŠžã—ã¦ãã ã•ã„。
+ </floater.string>
+ <floater.string name="no_permission">
+ ã‚ãªãŸã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚°ãƒ«ãƒ¼ãƒ—用ã®åœŸåœ°è³¼å…¥ã‚’許å¯ã•れã¦ã„ã¾ã›ã‚“
+ </floater.string>
+ <floater.string name="parcel_not_for_sale">
+ é¸æŠžã•れãŸåŒºç”»ã¯è²©å£²å¯¾è±¡å¤–ã§ã™
+ </floater.string>
+ <floater.string name="group_already_owns">
+ グループã¯ã™ã§ã«ã“ã®åŒºç”»ã‚’所有ã—ã¦ã„ã¾ã™
+ </floater.string>
+ <floater.string name="you_already_own">
+ ã‚ãªãŸã¯ã™ã§ã«ã“ã®åŒºç”»ã‚’所有ã—ã¦ã„ã¾ã™
+ </floater.string>
+ <floater.string name="set_to_sell_to_other">
+ é¸æŠžã•れãŸåŒºç”»ã¯ã€ä»–ã®äººã¸ã®è²©å£²ãŒæ±ºã¾ã£ã¦ã„ã¾ã™
+ </floater.string>
+ <floater.string name="no_public_land">
+ é¸æŠžã•れãŸåœ°åŸŸã«ã€å…¬å…±ã®åœŸåœ°ã¯ã‚りã¾ã›ã‚“
+ </floater.string>
+ <floater.string name="not_owned_by_you">
+ ä»–ã®ä½äººãŒæ‰€æœ‰ã™ã‚‹åœŸåœ°ã‚’é¸æŠžã—ã¦ã„ã¾ã™ã€‚
+ã‚‚ã£ã¨ç‹­ã„ç¯„å›²ã‚’é¸æŠžã—ã¦ã¿ã¦ãã ã•ã„。
+ </floater.string>
+ <floater.string name="processing">
+ 購入処ç†ä¸­...
+
+(数分ã‹ã‹ã‚‹ã“ã¨ãŒã‚りã¾ã™ï¼‰
+ </floater.string>
+ <floater.string name="fetching_error">
+ åœŸåœ°è³¼å…¥ã®æƒ…報入手中ã«ã‚¨ãƒ©ãƒ¼ãŒèµ·ãã¾ã—ãŸ
+ </floater.string>
+ <floater.string name="buying_will">
+ ã“ã®åœŸåœ°ã‚’è²·ã†ã¨ï¼š
+ </floater.string>
+ <floater.string name="buying_for_group">
+ グループ用ã®åœŸåœ°ã‚’購入ã™ã‚‹ã¨ï¼š
+ </floater.string>
+ <floater.string name="cannot_buy_now">
+ ç¾åœ¨è³¼å…¥ä¸å¯ï¼š
+ </floater.string>
+ <floater.string name="not_for_sale">
+ 販売対象外:
+ </floater.string>
+ <floater.string name="none_needed">
+ 一切必è¦ãªã—
+ </floater.string>
+ <floater.string name="must_upgrade">
+ アカウントをアップグレードã—ãªã„ã¨ã€åœŸåœ°ã‚’所有ã§ãã¾ã›ã‚“
+ </floater.string>
+ <floater.string name="cant_own_land">
+ ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã§åœŸåœ°ã‚’所有ã§ãã¾ã™
+ </floater.string>
+ <floater.string name="land_holdings">
+ ã‚ãªãŸã¯ã€[BUYER] 平方メートルã®åœŸåœ°ã‚’所有ã—ã¦ã„ã¾ã™ã€‚
+ </floater.string>
+ <floater.string name="pay_to_for_land">
+ ã“ã®åœŸåœ°ã®ä»£é‡‘ã¨ã—ã¦ã€[SELLER]ã«L$[AMOUNT]を支払ã†
+ </floater.string>
+ <floater.string name="buy_for_US">
+ L$ [AMOUNT] ã‚’ã€ç´„ [LOCAL_AMOUNT] ã§è³¼å…¥ã—ã¾ã™ã€‚
+ </floater.string>
+ <floater.string name="parcel_meters">
+ ã“ã®åŒºç”»ã¯ [AMOUNT] 平方メートルã§ã™ã€‚
+ </floater.string>
+ <floater.string name="premium_land">
+ ã“ã®åœŸåœ°ã¯å‰²ã‚Šå¢—ã—付ã§ã™ã€‚ [AMOUNT] å¹³æ–¹ãƒ¡ãƒ¼ãƒˆãƒ«ã®æ–™é‡‘ãŒã‹ã‹ã‚Šã¾ã™ã€‚
+ </floater.string>
+ <floater.string name="discounted_land">
+ ã“ã®åœŸåœ°ã¯ãƒ‡ã‚£ã‚¹ã‚«ã‚¦ãƒ³ãƒˆã•れã¦ã„ã¾ã™ã€‚ [AMOUNT] å¹³æ–¹ãƒ¡ãƒ¼ãƒˆãƒ«ã®æ–™é‡‘ãŒã‹ã‹ã‚Šã¾ã™ã€‚
+ </floater.string>
+ <floater.string name="meters_supports_object">
+ [AMOUNT] 平方メートル
+オブジェクト [AMOUNT2] 個サãƒãƒ¼ãƒˆ
+ </floater.string>
+ <floater.string name="sold_with_objects">
+ オブジェクト込ã¿ã§è²©å£²
+ </floater.string>
+ <floater.string name="sold_without_objects">
+ オブジェクトã¯å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“
+ </floater.string>
+ <floater.string name="info_price_string">
+ L$ [PRICE]
+(L$[PRICE_PER_SQM]/平方メートル)
+[SOLD_WITH_OBJECTS]
+ </floater.string>
+ <floater.string name="insufficient_land_credits">
+ ã“ã® [GROUP] ãŒåŒºç”»ã®è³¼å…¥æ‰‹ç¶šãを完了ã™ã‚‹ã«ã¯ã€ 価格ã«è¦‹åˆã†ã ã‘ã®å¯„付ã•れãŸåœŸåœ°ã®åˆ©ç”¨å®Ÿç¸¾ãŒå¿…è¦ã§ã™
+ </floater.string>
+ <floater.string name="have_enough_lindens">
+ ã‚ãªãŸã®æ‰€æŒã™ã‚‹ L$ [AMOUNT]ã§ã€ã“ã®åœŸåœ°ã‚’購入ã§ãã¾ã™
+ </floater.string>
+ <floater.string name="not_enough_lindens">
+ ã‚ãªãŸã®æ‰€æŒé‡‘㯠L$ [AMOUNT]ã ã‘ã§ã€ã‚ã¨L$ [AMOUNT2] å¿…è¦ã§ã™
+ </floater.string>
+ <floater.string name="balance_left">
+ 購入後ã€ã‚ãªãŸã®æ®‹é¡ã¯L$[AMOUNT]ã«ãªã‚Šã¾ã™
+ </floater.string>
+ <floater.string name="balance_needed">
+ ã“ã®åœŸåœ°ã‚’è²·ã†ã«ã¯ã€å°‘ãªãã¨ã‚‚ L$ [AMOUNT] を購入ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™
+ </floater.string>
+ <floater.string name="no_parcel_selected">
+ (区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“)
+ </floater.string>
<text name="region_name_label">
地域:
</text>
@@ -27,10 +151,10 @@
<text name="resellable_changeable_label">
ã“ã®åœ°åŸŸã§è³¼å…¥ã—ãŸåœŸåœ°ï¼š
</text>
- <text name="resellable_clause">
+ <text left="460" name="resellable_clause">
å†è²©ã§ãã‚‹å ´åˆã¨ã§ããªã„å ´åˆãŒã‚りã¾ã™ã€‚
</text>
- <text name="changeable_clause">
+ <text left="460" name="changeable_clause">
çµ±åˆã¾ãŸã¯å†åˆ†å‰²ã§ãã‚‹å ´åˆã¨ã§ããªã„å ´åˆãŒã‚りã¾ã™ã€‚
</text>
<text name="covenant_text">
@@ -67,12 +191,12 @@
<text name="error_message">
何ã‹å¤‰ã§ã™
</text>
- <button label="ウェブ・サイトã«ç§»å‹•" name="error_web"/>
+ <button label="Webサイトã«ç§»å‹•" name="error_web"/>
<text name="account_action">
- プレミアム・メンãƒãƒ¼ã«ã‚¢ãƒƒãƒ—グレード
+ プレミアム会員ã«ã‚¢ãƒƒãƒ—グレード
</text>
<text name="account_reason">
- åœŸåœ°ã‚’ä¿æœ‰ã§ãã‚‹ã®ã¯ãƒ—レミアム・メンãƒãƒ¼ã ã‘ã§ã™
+ åœŸåœ°ã‚’ä¿æœ‰ã§ãã‚‹ã®ã¯ãƒ—レミアム会員ã ã‘ã§ã™
</text>
<combo_box name="account_level">
<combo_box.item label="æœˆé¡ 9.95米ドル〠月払ã„" name="US$9.95/month,billedmonthly"/>
@@ -107,131 +231,4 @@
<check_box label="グループã‹ã‚‰ [AMOUNT] 平方メートルã®è²¢çŒ®ã‚’å–り除ãã¾ã™ã€‚" name="remove_contribution"/>
<button label="購入" name="buy_btn"/>
<button label="å–り消ã—" name="cancel_btn"/>
- <string name="can_resell">
- å†è²©å¯èƒ½
- </string>
- <string name="can_not_resell">
- å†è²©ä¸å¯èƒ½
- </string>
- <string name="can_change">
- çµ±åˆï¼å†åˆ†å‰²å¯èƒ½
- </string>
- <string name="can_not_change">
- çµ±åˆï¼å†åˆ†å‰²ä¸å¯èƒ½
- </string>
- <string name="cant_buy_for_group">
- ã‚ãªãŸã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚°ãƒ«ãƒ¼ãƒ—用ã®åœŸåœ°è³¼å…¥ã‚’許å¯ã•れã¦ã„ã¾ã›ã‚“
- </string>
- <string name="no_land_selected">
- 土地ãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“
- </string>
- <string name="multiple_parcels_selected">
- 複数ã®ç•°ãªã£ãŸåŒºç”»ã‚’é¸æŠžã—ã¾ã—ãŸã€‚
-ã“れよりå°ã•ãªã‚¨ãƒªã‚¢ã‚’é¸æŠžã—ã¦ãã ã•ã„。
- </string>
- <string name="no_permission">
- ã‚ãªãŸã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚°ãƒ«ãƒ¼ãƒ—用ã®åœŸåœ°è³¼å…¥ã‚’許å¯ã•れã¦ã„ã¾ã›ã‚“
- </string>
- <string name="parcel_not_for_sale">
- é¸æŠžã•れãŸåŒºç”»ã¯è²©å£²å¯¾è±¡å¤–ã§ã™
- </string>
- <string name="group_already_owns">
- グループã¯ã™ã§ã«ã“ã®åŒºç”»ã‚’所有ã—ã¦ã„ã¾ã™
- </string>
- <string name="you_already_own">
- ã‚ãªãŸã¯ã™ã§ã«ã“ã®åŒºç”»ã‚’所有ã—ã¦ã„ã¾ã™
- </string>
- <string name="set_to_sell_to_other">
- é¸æŠžã•れãŸåŒºç”»ã¯ã€ä»–ã®äººã¸ã®è²©å£²ãŒæ±ºã¾ã£ã¦ã„ã¾ã™
- </string>
- <string name="no_public_land">
- é¸æŠžã•れãŸåœ°åŸŸã«ã€å…¬å…±ã®åœŸåœ°ã¯ã‚りã¾ã›ã‚“
- </string>
- <string name="not_owned_by_you">
- ä»–ã®ä½¿ç”¨è€…ã«æ‰€æœ‰ã•れãŸåœŸåœ°ãŒé¸æŠžã•れã¦ã„ã¾ã™ã€‚
-ã“れよりå°ã•ãªã‚¨ãƒªã‚¢ã‚’é¸æŠžã—ã¦ãã ã•ã„。
- </string>
- <string name="processing">
- 購入処ç†ä¸­...
-
-(数分ã‹ã‹ã‚‹ã“ã¨ãŒã‚りã¾ã™ï¼‰
- </string>
- <string name="fetching_error">
- åœŸåœ°è³¼å…¥ã®æƒ…報入手中ã«ã‚¨ãƒ©ãƒ¼ãŒèµ·ãã¾ã—ãŸ
- </string>
- <string name="buying_will">
- ã“ã®åœŸåœ°ã‚’è²·ã†ã¨ï¼š
- </string>
- <string name="buying_for_group">
- グループ用ã®åœŸåœ°ã‚’購入ã™ã‚‹ã¨ï¼š
- </string>
- <string name="cannot_buy_now">
- ç¾åœ¨è³¼å…¥ä¸å¯ï¼š
- </string>
- <string name="not_for_sale">
- 販売対象外:
- </string>
- <string name="none_needed">
- 一切必è¦ãªã—
- </string>
- <string name="must_upgrade">
- アカウントをアップグレードã—ãªã„ã¨ã€åœŸåœ°ã‚’所有ã§ãã¾ã›ã‚“
- </string>
- <string name="cant_own_land">
- ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã§åœŸåœ°ã‚’所有ã§ãã¾ã™
- </string>
- <string name="land_holdings">
- ã‚ãªãŸã¯ã€[BUYER] 平方メートルã®åœŸåœ°ã‚’所有ã—ã¦ã„ã¾ã™ã€‚
- </string>
- <string name="pay_to_for_land">
- ã“ã®åœŸåœ°ã®ä»£é‡‘ã¨ã—ã¦ã€[SELLER]ã«L$[AMOUNT]を支払ã†
- </string>
- <string name="buy_for_US">
- L$ [AMOUNT] ã‚’ã€ç´„ [LOCAL_AMOUNT] ã§è³¼å…¥ã—ã¾ã™ã€‚
- </string>
- <string name="parcel_meters">
- ã“ã®åŒºç”»ã¯ [AMOUNT] 平方メートルã§ã™ã€‚
- </string>
- <string name="premium_land">
- ã“ã®åœŸåœ°ã¯å‰²ã‚Šå¢—ã—付ã§ã™ã€‚ [AMOUNT] å¹³æ–¹ãƒ¡ãƒ¼ãƒˆãƒ«ã®æ–™é‡‘ãŒã‹ã‹ã‚Šã¾ã™ã€‚
- </string>
- <string name="discounted_land">
- ã“ã®åœŸåœ°ã¯ãƒ‡ã‚£ã‚¹ã‚«ã‚¦ãƒ³ãƒˆã•れã¦ã„ã¾ã™ã€‚ [AMOUNT] å¹³æ–¹ãƒ¡ãƒ¼ãƒˆãƒ«ã®æ–™é‡‘ãŒã‹ã‹ã‚Šã¾ã™ã€‚
- </string>
- <string name="meters_supports_object">
- [AMOUNT] 平方メートル
-オブジェクト [AMOUNT2] 個サãƒãƒ¼ãƒˆ
- </string>
- <string name="sold_with_objects">
- オブジェクトã¨å…±ã«è²©å£²æ¸ˆã¿
- </string>
- <string name="sold_without_objects">
- オブジェクトã¯å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“
- </string>
- <string name="info_price_string">
- L$ [PRICE]
-(L$[PRICE_PER_SQM]/平方メートル)
-[SOLD_WITH_OBJECTS]
- </string>
- <string name="insufficient_land_credits">
- ã“ã® [GROUP] ãŒåŒºç”»ã®è³¼å…¥æ‰‹ç¶šãを完了ã™ã‚‹ã«ã¯ã€ 価格ã«è¦‹åˆã†ã ã‘ã®å¯„付ã•れãŸåœŸåœ°ã®åˆ©ç”¨å®Ÿç¸¾ãŒå¿…è¦ã§ã™
- </string>
- <string name="have_enough_lindens">
- ã‚ãªãŸã®æ‰€æŒã™ã‚‹ L$ [AMOUNT]ã§ã€ã“ã®åœŸåœ°ã‚’購入ã§ãã¾ã™
- </string>
- <string name="not_enough_lindens">
- ã‚ãªãŸã®æ‰€æŒé‡‘㯠L$ [AMOUNT]ã ã‘ã§ã€ã‚ã¨L$ [AMOUNT2] å¿…è¦ã§ã™
- </string>
- <string name="balance_left">
- 購入後ã€ã‚ãªãŸã®æ®‹é¡ã¯L$[AMOUNT]ã«ãªã‚Šã¾ã™
- </string>
- <string name="balance_needed">
- ã“ã®åœŸåœ°ã‚’è²·ã†ã«ã¯ã€å°‘ãªãã¨ã‚‚ L$ [AMOUNT] を購入ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™
- </string>
- <string name="no_parcel_selected">
- (区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“)
- </string>
- <string name="buy_currency">
- ç´„US$ [USD]ã§L$ [LINDENS]を購入
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_buy_object.xml b/indra/newview/skins/default/xui/ja/floater_buy_object.xml
index f807e91573..f323263699 100644
--- a/indra/newview/skins/default/xui/ja/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/ja/floater_buy_object.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="contents" title="オブジェクトã®ã‚³ãƒ”ーを購入">
<text name="contents_text">
- 内容:
+ 中身:
</text>
<text name="buy_text">
- [NAME]ã‹ã‚‰L$[AMOUNT]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ
+ [NAME] ã‹ã‚‰ L$[AMOUNT] ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ
</text>
<button label="å–æ¶ˆ" label_selected="å–æ¶ˆ" name="cancel_btn"/>
<button label="購入" label_selected="購入" name="buy_btn"/>
@@ -12,15 +12,15 @@
購入
</text>
<string name="title_buy_copy_text">
- 次ã®ã‚‚ã®ã‚’è²·ã†
+ 次ã®ã‚‚ã®ã‚’購入
</string>
<text name="no_copy_text">
- (コピーãªã—)
+ (コピーä¸å¯ï¼‰
</text>
<text name="no_modify_text">
- (修正ãªã—)
+ (修正ä¸å¯ï¼‰
</text>
<text name="no_transfer_text">
- (転é€ãªã—)
+ (å†è²©ãƒ»ãƒ—レゼントä¸å¯ï¼‰
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_camera.xml b/indra/newview/skins/default/xui/ja/floater_camera.xml
index be118273fa..ec5c2a64a5 100644
--- a/indra/newview/skins/default/xui/ja/floater_camera.xml
+++ b/indra/newview/skins/default/xui/ja/floater_camera.xml
@@ -9,23 +9,28 @@
<floater.string name="move_tooltip">
カメラを上下左å³ã«ç§»å‹•
</floater.string>
+ <floater.string name="camera_modes_title">
+ カメラモード
+ </floater.string>
+ <floater.string name="pan_mode_title">
+ 旋回 - ズーム - 水平・垂直移動
+ </floater.string>
+ <floater.string name="presets_mode_title">
+ 事å‰è¨­å®šã®è¦–野
+ </floater.string>
+ <floater.string name="free_mode_title">
+ オブジェクトを見る
+ </floater.string>
<panel name="controls">
- <joystick_track name="cam_track_stick" tool_tip="カメラを上下左å³ã«å‹•ã‹ã—ã¾ã™"/>
- <panel name="zoom" tool_tip="å‘ã„ã¦ã‚‹æ–¹æ³•ã«ã‚«ãƒ¡ãƒ©ã‚’ズーム">
+ <panel name="zoom" tool_tip="å‘ã„ã¦ã„る方法ã«ã‚«ãƒ¡ãƒ©ã‚’ズーム">
+ <joystick_rotate name="cam_rotate_stick" tool_tip="自分を軸ã«ã‚«ãƒ¡ãƒ©ã‚’回ã™"/>
<slider_bar name="zoom_slider" tool_tip="å‘ã„ã¦ã„ã‚‹æ–¹å‘ã«ã‚«ãƒ¡ãƒ©ã‚’ズーム"/>
- </panel>
- <joystick_rotate name="cam_rotate_stick" tool_tip="自分を軸ã«ã‚«ãƒ¡ãƒ©ã‚’回ã™"/>
- <panel name="camera_presets">
- <button name="rear_view" tool_tip="後方視界"/>
- <button name="group_view" tool_tip="グループ視界"/>
- <button name="front_view" tool_tip="剿–¹è¦–界"/>
- <button name="mouselook_view" tool_tip="一人称視界"/>
+ <joystick_track name="cam_track_stick" tool_tip="カメラを上下左å³ã«å‹•ã‹ã—ã¾ã™"/>
</panel>
</panel>
<panel name="buttons">
- <button label="" name="orbit_btn" tool_tip="カメラを回ã™"/>
- <button label="" name="pan_btn" tool_tip="カメラを水平・垂直移動"/>
- <button label="" name="avatarview_btn" tool_tip="ã‚¢ãƒã‚¿ãƒ¼è¦–点"/>
- <button label="" name="freecamera_btn" tool_tip="オブジェクトを見る"/>
+ <button label="" name="presets_btn" tool_tip="事å‰è¨­å®šã®è¦–野"/>
+ <button label="" name="pan_btn" tool_tip="旋回 - ズーム - 水平・垂直移動"/>
+ <button label="" name="avatarview_btn" tool_tip="カメラモード"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_color_picker.xml b/indra/newview/skins/default/xui/ja/floater_color_picker.xml
index a98da4b8ba..dc87d27a15 100644
--- a/indra/newview/skins/default/xui/ja/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/ja/floater_color_picker.xml
@@ -18,7 +18,7 @@
<text name="l_val_text">
è¼åº¦ï¼š
</text>
- <check_box label="今ã™ãé©ç”¨" name="apply_immediate"/>
+ <check_box label="ã™ãé©ç”¨" name="apply_immediate"/>
<button label="" label_selected="" name="color_pipette"/>
<button label="å–り消ã—" label_selected="å–り消ã—" name="cancel_btn"/>
<button label="OK" label_selected="OK" name="select_btn"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_critical.xml b/indra/newview/skins/default/xui/ja/floater_critical.xml
index 39f6ee8e3f..f69c24622a 100644
--- a/indra/newview/skins/default/xui/ja/floater_critical.xml
+++ b/indra/newview/skins/default/xui/ja/floater_critical.xml
@@ -3,10 +3,10 @@
<button label="続行" label_selected="続行" name="Continue" />
<button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel" />
<text name="tos_title">
- クリティカル・メッセージ
+ クリティカルメッセージ
</text>
<text name="tos_heading">
- 次ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ³¨æ„æ·±ããŠèª­ã¿ãã ã•ã„。
+ 次ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’注æ„ã—ã¦ã‚ˆããŠèª­ã¿ãã ã•ã„。
</text>
<text_editor name="tos_text">
TOS_TEXT
diff --git a/indra/newview/skins/default/xui/ja/floater_customize.xml b/indra/newview/skins/default/xui/ja/floater_customize.xml
index 7d1809f1ed..cc0032e1ab 100644
--- a/indra/newview/skins/default/xui/ja/floater_customize.xml
+++ b/indra/newview/skins/default/xui/ja/floater_customize.xml
@@ -35,7 +35,7 @@
[PATH] ã«æ‰€åœ¨
</text>
<text name="not worn instructions">
- æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã«1ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„シェイプをã¤ã‘ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
+ æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã« 1 ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„シェイプをã¤ã‘ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
</text>
<text name="no modify instructions">
ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。
@@ -50,7 +50,7 @@
<panel label="スキン" name="Skin">
<button label="スキンã®è‰²" label_selected="スキンã®è‰²" name="Skin Color"/>
<button label="é¡”ã®ç´°éƒ¨" label_selected="é¡”ã®ç´°éƒ¨" name="Face Detail"/>
- <button label="メイクアップ" label_selected="メイクアップ" name="Makeup"/>
+ <button label="メイク" label_selected="メイク" name="Makeup"/>
<button label="身体細部" label_selected="身体細部" name="Body Detail"/>
<text name="title">
[DESC]
@@ -68,7 +68,7 @@
[PATH] ã«æ‰€åœ¨
</text>
<text name="not worn instructions">
- æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã«1ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„スキンをã¤ã‘ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
+ æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã« 1 ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„スキンをã¤ã‘ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
</text>
<text name="no modify instructions">
ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。
@@ -105,7 +105,7 @@
[PATH] ã«æ‰€åœ¨
</text>
<text name="not worn instructions">
- æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã«1ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„髪をã¤ã‘ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
+ æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã« 1 ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„髪をã¤ã‘ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
</text>
<text name="no modify instructions">
ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。
@@ -113,7 +113,7 @@
<text name="Item Action Label">
髪型:
</text>
- <texture_picker label="テクスãƒãƒ£ãƒ¼" name="Texture" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
+ <texture_picker label="テクスãƒãƒ£" name="Texture" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
<button label="æ–°ã—ã„髪を作æˆ" label_selected="æ–°ã—ã„髪を作æˆ" name="Create New"/>
<button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
<button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
@@ -156,8 +156,8 @@
<panel label="シャツ" name="Shirt">
<texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
<color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <button label="æ–°ã—ã„シャツを作æˆ" label_selected="æ–°ã—ã„シャツを作æˆ" name="Create New"/>
<button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
+ <button label="æ–°ã—ã„シャツを作æˆ" label_selected="æ–°ã—ã„シャツを作æˆ" name="Create New"/>
<button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
<button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
<button label="戻ã™" label_selected="戻ã™" name="Revert"/>
@@ -177,7 +177,7 @@
[PATH] ã«æ‰€åœ¨
</text>
<text name="not worn instructions">
- æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã«1ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„シャツをç€ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
+ æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã« 1 ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„シャツをç€ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
</text>
<text name="no modify instructions">
ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。
@@ -186,11 +186,11 @@
シャツ:
</text>
</panel>
- <panel label="ズボン" name="Pants">
+ <panel label="パンツ" name="Pants">
<texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
<color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <button label="æ–°ã—ã„ズボンを作æˆ" label_selected="æ–°ã—ã„ズボンを作æˆ" name="Create New"/>
<button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
+ <button label="æ–°ã—ã„パンツを作æˆ" label_selected="æ–°ã—ã„パンツを作æˆ" name="Create New"/>
<button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
<button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
<button label="戻ã™" label_selected="戻ã™" name="Revert"/>
@@ -216,7 +216,7 @@
ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。
</text>
<text name="Item Action Label">
- ズボン:
+ パンツ:
</text>
</panel>
<panel label="é´" name="Shoes">
@@ -238,6 +238,7 @@
<text name="not worn instructions">
ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„é´ã‚’å±¥ãã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
</text>
+ <button label="æ–°ã—ã„é´ã‚’作æˆ" label_selected="æ–°ã—ã„é´ã‚’作æˆ" name="Create New"/>
<text name="no modify instructions">
ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。
</text>
@@ -246,7 +247,6 @@
</text>
<texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
<color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <button label="æ–°ã—ã„é´ã‚’作æˆ" label_selected="æ–°ã—ã„é´ã‚’作æˆ" name="Create New"/>
<button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
<button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
<button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
@@ -271,6 +271,7 @@
<text name="not worn instructions">
ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„é´ä¸‹ã‚’å±¥ãã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
</text>
+ <button label="æ–°ã—ã„é´ä¸‹ã‚’作æˆ" label_selected="æ–°ã—ã„é´ä¸‹ã‚’作æˆ" name="Create New"/>
<text name="no modify instructions">
ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。
</text>
@@ -279,7 +280,6 @@
</text>
<texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
<color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <button label="æ–°ã—ã„é´ä¸‹ã‚’作æˆ" label_selected="æ–°ã—ã„é´ä¸‹ã‚’作æˆ" name="Create New"/>
<button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
<button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
<button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
@@ -302,8 +302,9 @@
[PATH] ã«æ‰€åœ¨
</text>
<text name="not worn instructions">
- æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã«1ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„ジャケットをç€ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
+ æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã« 1 ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„ジャケットをç€ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
</text>
+ <button label="æ–°ã—ã„上ç€ã‚’作æˆ" label_selected="æ–°ã—ã„上ç€ã‚’作æˆ" name="Create New"/>
<text name="no modify instructions">
ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。
</text>
@@ -313,7 +314,6 @@
<texture_picker label="上åŠèº«ã®ç”Ÿåœ°" name="Upper Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
<texture_picker label="下層生地" name="Lower Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
<color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <button label="æ–°ã—ã„上ç€ã‚’作æˆ" label_selected="æ–°ã—ã„上ç€ã‚’作æˆ" name="Create New"/>
<button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
<button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
<button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
@@ -338,6 +338,7 @@
<text name="not worn instructions">
ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„æ‰‹è¢‹ã‚’ã¤ã‘ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
</text>
+ <button label="æ–°ã—ã„æ‰‹è¢‹ã‚’作æˆ" label_selected="æ–°ã—ã„æ‰‹è¢‹ã‚’作æˆ" name="Create New"/>
<text name="no modify instructions">
ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。
</text>
@@ -346,7 +347,6 @@
</text>
<texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
<color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <button label="æ–°ã—ã„æ‰‹è¢‹ã‚’作æˆ" label_selected="æ–°ã—ã„æ‰‹è¢‹ã‚’作æˆ" name="Create New"/>
<button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
<button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
<button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
@@ -371,6 +371,7 @@
<text name="not worn instructions">
æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã«1ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„下ç€ï¼ˆä¸Šï¼‰ã‚’ç€ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
</text>
+ <button label="æ–°ã—ã„下ç€ã‚·ãƒ£ãƒ„を作æˆ" label_selected="æ–°ã—ã„下ç€ã‚·ãƒ£ãƒ„を作æˆ" name="Create New"/>
<text name="no modify instructions">
ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。
</text>
@@ -379,7 +380,6 @@
</text>
<texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
<color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <button label="æ–°ã—ã„下ç€ã‚·ãƒ£ãƒ„を作æˆ" label_selected="æ–°ã—ã„下ç€ã‚·ãƒ£ãƒ„を作æˆ" name="Create New"/>
<button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
<button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
<button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
@@ -404,6 +404,7 @@
<text name="not worn instructions">
ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„下ç€ï¼ˆä¸‹ï¼‰ã‚’å±¥ãã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
</text>
+ <button label="æ–°ã—ã„パンツを作æˆ" label_selected="æ–°ã—ã„パンツを作æˆ" name="Create New"/>
<text name="no modify instructions">
ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。
</text>
@@ -412,7 +413,6 @@
</text>
<texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
<color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <button label="æ–°ã—ã„パンツを作æˆ" label_selected="æ–°ã—ã„パンツを作æˆ" name="Create New"/>
<button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
<button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
<button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
@@ -435,8 +435,9 @@
[PATH] ã«æ‰€åœ¨
</text>
<text name="not worn instructions">
- æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã«1ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„スカートを履ãã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
+ æŒã¡ç‰©ã‹ã‚‰ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã« 1 ã¤ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„スカートを履ãã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
</text>
+ <button label="スカートを作æˆ" label_selected="スカートを作æˆ" name="Create New"/>
<text name="no modify instructions">
ã‚ãªãŸã¯ã“ã®æœã®ä¿®æ­£ã‚’許ã•れã¦ã„ã¾ã›ã‚“。
</text>
@@ -445,13 +446,12 @@
</text>
<texture_picker label="生地" name="Fabric" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
<color_swatch label="è‰²ï¼æ˜Žæš—" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <button label="スカートを作æˆ" label_selected="スカートを作æˆ" name="Create New"/>
<button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
<button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
<button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
<button label="戻ã™" label_selected="戻ã™" name="Revert"/>
</panel>
- <panel label="アルファ" name="Alpha">
+ <panel label="タトゥ" name="Tattoo">
<text name="title">
[DESC]
</text>
@@ -468,26 +468,24 @@
å‚ç…§ [PATH]
</text>
<text name="not worn instructions">
- ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„アルファマスクをã¤ã‘ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
+ ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„タトゥをã¤ã‘ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
</text>
+ <button label="æ–°ã—ã„タトゥを作æˆ" label_selected="æ–°ã—ã„タトゥを作æˆ" name="Create New"/>
<text name="no modify instructions">
ã“ã®ç€ç”¨ç‰©ã‚’修正ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。
</text>
<text name="Item Action Label">
- アルファ:
+ タトゥ:
</text>
- <texture_picker label="アルファ(下)" name="Lower Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <texture_picker label="アルファ(上)" name="Upper Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <texture_picker label="頭部ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Head Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <texture_picker label="ç›®ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Eye Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <texture_picker label="髪ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Hair Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <button label="æ–°ã—ã„アルファを作æˆ" label_selected="æ–°ã—ã„アルファを作æˆ" name="Create New"/>
+ <texture_picker label="頭部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Head Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="上部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Upper Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="下部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Lower Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
<button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
<button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
<button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
<button label="å…ƒã«æˆ»ã™" label_selected="å…ƒã«æˆ»ã™" name="Revert"/>
</panel>
- <panel label="タトゥ" name="Tattoo">
+ <panel label="アルファ" name="Alpha">
<text name="title">
[DESC]
</text>
@@ -504,25 +502,27 @@
å‚ç…§ [PATH]
</text>
<text name="not worn instructions">
- ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„タトゥをã¤ã‘ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
+ ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰ã‚¢ãƒã‚¿ãƒ¼ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€æ–°ã—ã„アルファマスクをã¤ã‘ã¾ã™ã€‚ 代ã‚りã«ã€ã¯ã˜ã‚ã‹ã‚‰æ–°ã—ã作æˆã—ã¦ç€ç”¨ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚
</text>
+ <button label="æ–°ã—ã„アルファを作æˆ" label_selected="æ–°ã—ã„アルファを作æˆ" name="Create New"/>
<text name="no modify instructions">
ã“ã®ç€ç”¨ç‰©ã‚’修正ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。
</text>
<text name="Item Action Label">
- タトゥ:
+ アルファ:
</text>
- <texture_picker label="頭部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Head Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <texture_picker label="上部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Upper Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <texture_picker label="下部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Lower Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <button label="æ–°ã—ã„タトゥを作æˆ" label_selected="æ–°ã—ã„タトゥを作æˆ" name="Create New"/>
+ <texture_picker label="アルファ(下)" name="Lower Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="アルファ(上)" name="Upper Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="頭部ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Head Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="ç›®ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Eye Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="髪ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Hair Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
<button label="å–り外ã™" label_selected="å–り外ã™" name="Take Off"/>
<button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
<button label="別åã§ä¿å­˜..." label_selected="別åã§ä¿å­˜..." name="Save As"/>
<button label="å…ƒã«æˆ»ã™" label_selected="å…ƒã«æˆ»ã™" name="Revert"/>
</panel>
</tab_container>
- <button label="スクリプト情報" label_selected="スクリプト情報" name="script_info"/>
+ <button label="スクリプト情報" label_selected="スクリプト情報" name="script_info" tool_tip="ã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ã«ä»˜ã„ã¦ã„るスクリプトを表示ã—ã¾ã™"/>
<button label="アウトフィット作æˆ" label_selected="アウトフィット作æˆ" name="make_outfit_btn"/>
<button label="キャンセル" label_selected="キャンセル" name="Cancel"/>
<button label="OK" label_selected="OK" name="Ok"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml
index 2d8b54cdd5..b0949cd4e0 100644
--- a/indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml
+++ b/indra/newview/skins/default/xui/ja/floater_day_cycle_options.xml
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="Day Cycle Floater" title="デイ・サイクル編集">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Day Cycle Floater" title="デイサイクル編集">
<tab_container name="Day Cycle Tabs">
- <panel label="デイ・サイクル" name="Day Cycle">
- <button label="?" name="WLDayCycleHelp" />
+ <panel label="デイサイクル" name="Day Cycle">
+ <button label="?" name="WLDayCycleHelp"/>
<text name="WL12am">
深夜 12時
</text>
@@ -57,41 +57,38 @@
<text name="WL12amHash2">
|
</text>
- <button label="キーã®è¿½åŠ " label_selected="キーã®è¿½åŠ " name="WLAddKey" />
- <button label="キーã®å‰Šé™¤" label_selected="キーã®å‰Šé™¤" name="WLDeleteKey" />
+ <button label="キーã®è¿½åŠ " label_selected="キーã®è¿½åŠ " name="WLAddKey"/>
+ <button label="キーã®å‰Šé™¤" label_selected="キーã®å‰Šé™¤" name="WLDeleteKey"/>
<text name="WLCurKeyFrameText">
キーフレームã®è¨­å®šï¼š
</text>
<text name="WLCurKeyTimeText">
- キー・タイム:
+ キータイム:
</text>
- <spinner label="時間" name="WLCurKeyHour" />
- <spinner label="分" name="WLCurKeyMin" />
+ <spinner label="時間" name="WLCurKeyHour"/>
+ <spinner label="分" name="WLCurKeyMin"/>
<text name="WLCurKeyTimeText2">
キーã®äº‹å‰è¨­å®šï¼š
</text>
- <combo_box label="事å‰è¨­å®š" name="WLKeyPresets" />
+ <combo_box label="事å‰è¨­å®š" name="WLKeyPresets"/>
<text name="DayCycleText">
スナップ:
</text>
- <combo_box label="5 分" name="WLSnapOptions" />
+ <combo_box label="5 分" name="WLSnapOptions"/>
<text name="DayCycleText2">
サイクルã®é•·ã•:
</text>
- <spinner label="時間" name="WLLengthOfDayHour" />
- <spinner label="分" name="WLLengthOfDayMin" />
- <spinner label="ç§’" name="WLLengthOfDaySec" />
+ <spinner label="時間" name="WLLengthOfDayHour"/>
+ <spinner label="分" name="WLLengthOfDayMin"/>
+ <spinner label="ç§’" name="WLLengthOfDaySec"/>
<text name="DayCycleText3">
プレビュー:
</text>
- <button label="å†ç”Ÿ" label_selected="å†ç”Ÿ" name="WLAnimSky" />
- <button label="åœæ­¢!" label_selected="åœæ­¢" name="WLStopAnimSky" />
- <button label="ä¸å‹•ç”£ã®æ™‚刻を使用"
- label_selected="ä¸å‹•ç”£ã®æ™‚刻ã«å¤‰æ›´" name="WLUseLindenTime" />
- <button label="デイ・テストをä¿å­˜"
- label_selected="デイ・テストをä¿å­˜" name="WLSaveDayCycle" />
- <button label="デイ・テストをロード"
- label_selected="デイ・テストをロード" name="WLLoadDayCycle" />
+ <button label="å†ç”Ÿ" label_selected="å†ç”Ÿ" name="WLAnimSky"/>
+ <button label="åœæ­¢" label_selected="åœæ­¢" name="WLStopAnimSky"/>
+ <button label="ä¸å‹•ç”£ã®æ™‚刻を使用" label_selected="ä¸å‹•ç”£ã®æ™‚刻ã«å¤‰æ›´" name="WLUseLindenTime"/>
+ <button label="デイテストをä¿å­˜" label_selected="デイテストをä¿å­˜" name="WLSaveDayCycle"/>
+ <button label="デイテストをロード" label_selected="デイテストをロード" name="WLLoadDayCycle"/>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_event.xml b/indra/newview/skins/default/xui/ja/floater_event.xml
new file mode 100644
index 0000000000..671f9077d9
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_event.xml
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="イベント" name="Event" title="イベント詳細">
+ <floater.string name="none">
+ ãªã—
+ </floater.string>
+ <floater.string name="notify">
+ 知らã›ã‚‹
+ </floater.string>
+ <floater.string name="dont_notify">
+ 知らã›ãªã„
+ </floater.string>
+ <floater.string name="moderate">
+ Moderate
+ </floater.string>
+ <floater.string name="adult">
+ Adult
+ </floater.string>
+ <floater.string name="general">
+ General
+ </floater.string>
+ <floater.string name="unknown">
+ 䏿˜Ž
+ </floater.string>
+ <layout_stack name="layout">
+ <layout_panel name="profile_stack">
+ <text name="event_name">
+ Nameless Event...of Doom! De doom! Doom doom.
+ </text>
+ <text name="event_category">
+ (カテゴリãªã—)
+ </text>
+ <text name="event_runby_label">
+ 主催者:
+ </text>
+ <text initial_value="(å–得中)" name="event_runby"/>
+ <text name="event_date_label">
+ 日付:
+ </text>
+ <text name="event_date">
+ 10/10/2010
+ </text>
+ <text name="event_duration_label">
+ 期間:
+ </text>
+ <text name="event_duration">
+ 1 時間
+ </text>
+ <text name="event_covercharge_label">
+ ã‚«ãƒãƒ¼ãƒãƒ£ãƒ¼ã‚¸ï¼š
+ </text>
+ <text name="event_cover">
+ ç„¡æ–™
+ </text>
+ <text name="event_location_label">
+ 場所:
+ </text>
+ <text name="event_location" value="SampleParcel, Name Long (145, 228, 26)"/>
+ <text name="rating_label" value="レーティング区分:"/>
+ <text name="rating_value" value="䏿˜Ž"/>
+ </layout_panel>
+ <layout_panel name="button_panel">
+ <button name="create_event_btn" tool_tip="イベント作æˆ"/>
+ <button name="god_delete_event_btn" tool_tip="イベント削除"/>
+ <button label="知らã›ã‚‹" name="notify_btn"/>
+ <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn"/>
+ <button label="地図" name="map_btn"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_gesture.xml b/indra/newview/skins/default/xui/ja/floater_gesture.xml
index a79854bcef..1ed5ad31db 100644
--- a/indra/newview/skins/default/xui/ja/floater_gesture.xml
+++ b/indra/newview/skins/default/xui/ja/floater_gesture.xml
@@ -9,7 +9,7 @@
<floater.string name="copy_name">
[COPY_NAME] ã®ã‚³ãƒ”ー
</floater.string>
- <scroll_list bottom_delta="-385" height="360" name="gesture_list">
+ <scroll_list name="gesture_list">
<scroll_list.columns label="åå‰" name="name"/>
<scroll_list.columns label="ãƒãƒ£ãƒƒãƒˆ" name="trigger"/>
<scroll_list.columns label="" name="key"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_god_tools.xml b/indra/newview/skins/default/xui/ja/floater_god_tools.xml
index 18380bddc2..9e5d473db7 100644
--- a/indra/newview/skins/default/xui/ja/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/ja/floater_god_tools.xml
@@ -2,12 +2,11 @@
<floater name="godtools floater" title="ゴッド・ツール">
<tab_container name="GodTools Tabs">
<panel label="グリッド" name="grid">
- <button label="ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追ã„出ã™" label_selected="ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追ã„出ã™" name="Kick all users"/>
<button label="ã“ã®åœ°åŸŸã®åœ°å›³ã®è¡¨ç¤ºã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’消去" label_selected="ã“ã®åœ°åŸŸã®åœ°å›³ã®è¡¨ç¤ºã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’消去" name="Flush This Region&apos;s Map Visibility Caches"/>
</panel>
<panel label="地域" name="region">
- <text name="Sim Name:">
- シムå:
+ <text name="Region Name:">
+ リージョンå:
</text>
<check_box label="準備" name="check prelude" tool_tip="ã“ã®è¨­å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸã®æº–備をã—ã¾ã™ã€‚"/>
<check_box label="太陽固定" name="check fixed sun" tool_tip="太陽ä½ç½®ã‚’固定([地域ï¼ä¸å‹•産]>[地形]ã®å ´åˆã¨åŒæ§˜ï¼‰"/>
@@ -15,7 +14,7 @@
<check_box label="å¯è¦–" name="check visible" tool_tip="ã“ã®è¨­å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸã‚’ゴッド・モード以外ã§ã‚‚å¯è¦–ã«ã—ã¾ã™ã€‚"/>
<check_box label="ダメージ" name="check damage" tool_tip="ã“ã®è¨­å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã§ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’有効化ã—ã¾ã™ã€‚"/>
<check_box label="トラフィック・トラッキングをブロック" name="block dwell" tool_tip="ã“ã®è¨­å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã®ãƒˆãƒ©ãƒ•ィック計算をオフã«ã—ã¾ã™ã€‚"/>
- <check_box label="土地整備をブロック" name="block terraform" tool_tip="ã“ã®è¨­å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã§ã®åœŸåœ°æ•´å‚™ã‚’ç¦æ­¢"/>
+ <check_box label="地形編集をブロック" name="block terraform" tool_tip="ã“ã®è¨­å®šã«ã‚ˆã‚Šã€ã“ã®åœ°åŸŸå†…ã§ã®åœŸåœ°æ•´å‚™ã‚’ç¦æ­¢"/>
<check_box label="サンドボックス" name="is sandbox" tool_tip="ã“れãŒã‚µãƒ³ãƒ‰ãƒœãƒƒã‚¯ã‚¹åœ°åŸŸã§ã‚‚切り替ãˆ"/>
<button label="地形を構築ã™ã‚‹" label_selected="地形を構築ã™ã‚‹" name="Bake Terrain" tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’デフォルトã¨ã—ã¦ä¿å­˜ã—ã¾ã™ã€‚"/>
<button label="åœ°å½¢ã‚’å…ƒã«æˆ»ã™" label_selected="åœ°å½¢ã‚’å…ƒã«æˆ»ã™" name="Revert Terrain" tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’デフォルトã«ç½®æ›ã—ã¾ã™ã€‚"/>
@@ -33,13 +32,15 @@
<line_editor name="gridposx" tool_tip="ã“れã¯ã€ã“ã®åœ°åŸŸã®ã‚°ãƒªãƒƒãƒ‰xã®ä½ç½®ã§ã™ã€‚"/>
<line_editor name="gridposy" tool_tip="ã“れã¯ã€ã“ã®åœ°åŸŸã®ã‚°ãƒªãƒƒãƒ‰yã®ä½ç½®ã§ã™ã€‚"/>
<text name="Redirect to Grid: ">
- グリッドã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆï¼š
+ グリッドã«ãƒªãƒ€
+イレクト:
</text>
<text name="billable factor text">
請求率:
</text>
<text name="land cost text">
- 平方メートル当ãŸã‚ŠL$:
+ 平方メートル当
+ãŸã‚ŠL$:
</text>
<button label="æ›´æ–°" label_selected="æ›´æ–°" name="Refresh" tool_tip="ä¸Šè¨˜ã®æƒ…報を更新ã™ã‚‹ã«ã¯ã€ã“ã“をクリックã—ã¾ã™ã€‚"/>
<button label="é©ç”¨" label_selected="é©ç”¨" name="Apply" tool_tip="上記ã®å¤‰æ›´ã‚’é©ç”¨ã™ã‚‹ã«ã¯ã€ã“ã“をクリックã—ã¾ã™ã€‚"/>
@@ -50,8 +51,8 @@
<panel.string name="no_target">
(ターゲットãªã—)
</panel.string>
- <text name="Sim Name:">
- シムå:
+ <text name="Region Name:">
+ リージョンå:
</text>
<text name="region name">
ウェルシュ
diff --git a/indra/newview/skins/default/xui/ja/floater_help_browser.xml b/indra/newview/skins/default/xui/ja/floater_help_browser.xml
index 0a783713d5..15200d7ef7 100644
--- a/indra/newview/skins/default/xui/ja/floater_help_browser.xml
+++ b/indra/newview/skins/default/xui/ja/floater_help_browser.xml
@@ -1,14 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_help_browser" title="ヘルプブラウザ">
- <floater.string name="home_page_url">
- http://jp.secondlife.com
- </floater.string>
- <floater.string name="support_page_url">
- http://jp.secondlife.com/support
+ <floater.string name="loading_text">
+ ローディング...
</floater.string>
<layout_stack name="stack1">
- <layout_panel name="external_controls">
- <button label="Web ブラウザã§é–‹ã" name="open_browser"/>
- </layout_panel>
+ <layout_panel name="external_controls"/>
</layout_stack>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_im.xml b/indra/newview/skins/default/xui/ja/floater_im.xml
index 9c323f25e6..2e8993ec21 100644
--- a/indra/newview/skins/default/xui/ja/floater_im.xml
+++ b/indra/newview/skins/default/xui/ja/floater_im.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<multi_floater name="im_floater" title="インスタント・メッセージ">
<string name="only_user_message">
- ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã„るユーザーã¯ã‚ãªãŸã ã‘ã§ã™ã€‚
+ ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã¯ã€ã‚ãªãŸã—ã‹ã„ã¾ã›ã‚“。
</string>
<string name="offline_message">
[FIRST] [LAST]ã¯ã‚ªãƒ•ラインã§ã™ã€‚
@@ -32,7 +32,7 @@
</string>
<!-- ALL of the event strings should have [RECIPIENT] in them -->
<string name="add_session_event">
- [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追加ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“
+ [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ä½äººã‚’追加ã§ãã¾ã›ã‚“。
</string>
<string name="message_session_event">
[RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“
diff --git a/indra/newview/skins/default/xui/ja/floater_im_container.xml b/indra/newview/skins/default/xui/ja/floater_im_container.xml
index 1d028258ec..06b65e27f0 100644
--- a/indra/newview/skins/default/xui/ja/floater_im_container.xml
+++ b/indra/newview/skins/default/xui/ja/floater_im_container.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<multi_floater name="floater_im_box" title="æ›ç®—"/>
+<multi_floater name="floater_im_box" title="会話"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_image_preview.xml b/indra/newview/skins/default/xui/ja/floater_image_preview.xml
index 57ed139e54..1ffc27fd70 100644
--- a/indra/newview/skins/default/xui/ja/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_image_preview.xml
@@ -7,26 +7,26 @@
説明:
</text>
<text name="preview_label">
- イメージã®ï¾Œï¾Ÿï¾šï¾‹ï¾žï½­ï½°ï¼š
+ プレビュー:
</text>
<combo_box label="æœã®ç¨®é¡ž" name="clothing_type_combo">
- <combo_box.item label="ç”»åƒ" name="Image"/>
- <combo_box.item label="髪" name="Hair"/>
- <combo_box.item label="女性ã®é ­" name="FemaleHead"/>
- <combo_box.item label="女性ã®ä¸ŠåŠèº«" name="FemaleUpperBody"/>
- <combo_box.item label="女性ã®ä¸‹åŠèº«" name="FemaleLowerBody"/>
- <combo_box.item label="男性ã®é ­" name="MaleHead"/>
- <combo_box.item label="男性ã®ä¸ŠåŠèº«" name="MaleUpperBody"/>
- <combo_box.item label="男性ã®ä¸‹åŠèº«" name="MaleLowerBody"/>
- <combo_box.item label="スカート" name="Skirt"/>
- <combo_box.item label="スカルプトプリム" name="SculptedPrim"/>
+ <item label="ç”»åƒ" name="Image" value="ç”»åƒ"/>
+ <item label="髪" name="Hair" value="髪"/>
+ <item label="女性ã®é ­" name="FemaleHead" value="女性ã®é ­"/>
+ <item label="女性ã®ä¸ŠåŠèº«" name="FemaleUpperBody" value="女性ã®ä¸ŠåŠèº«"/>
+ <item label="女性ã®ä¸‹åŠèº«" name="FemaleLowerBody" value="女性ã®ä¸‹åŠèº«"/>
+ <item label="男性ã®é ­" name="MaleHead" value="男性ã®é ­"/>
+ <item label="男性ã®ä¸ŠåŠèº«" name="MaleUpperBody" value="男性ã®ä¸ŠåŠèº«"/>
+ <item label="男性ã®ä¸‹åŠèº«" name="MaleLowerBody" value="男性ã®ä¸‹åŠèº«"/>
+ <item label="スカート" name="Skirt" value="スカート"/>
+ <item label="スカルプトプリム" name="SculptedPrim" value="スカルプトプリム"/>
</combo_box>
<text name="bad_image_text">
イメージを読ã¿å–れã¾ã›ã‚“。
24bitTarga(.tga)ã§ã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’ä¿å­˜ã—ã¦ãã ã•ã„。
</text>
- <check_box label="ロスã®ãªã„圧縮を使用" name="lossless_check"/>
+ <check_box label="å¯é€†åœ§ç¸®" name="lossless_check"/>
<button label="å–り消ã—" name="cancel_btn"/>
- <button label="アップロードL$[AMOUNT]" name="ok_btn"/>
+ <button label="アップロード゙L$[AMOUNT]" name="ok_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_incoming_call.xml b/indra/newview/skins/default/xui/ja/floater_incoming_call.xml
index 04013799ec..8e5177d6fe 100644
--- a/indra/newview/skins/default/xui/ja/floater_incoming_call.xml
+++ b/indra/newview/skins/default/xui/ja/floater_incoming_call.xml
@@ -16,7 +16,13 @@
ãŒã‚³ãƒ³ãƒ•ァレンスãƒãƒ£ãƒƒãƒˆã§ã€ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å‚加ã—ã¾ã—ãŸã€‚
</floater.string>
<floater.string name="VoiceInviteGroup">
- 㯠[GROUP]. ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«å‚加ã—ã¾ã—ãŸã€‚
+ &apos;[GROUP]&apos;ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒãƒ«ã«å‚加ãªã•ã„ã¾ã—ãŸã€‚
+ </floater.string>
+ <floater.string name="VoiceInviteQuestionGroup">
+ [CURRENT_CHAT]を退席ã—ã¦ã€&apos;[GROUP]&apos;ã¨ã®ãƒãƒ£ãƒƒãƒˆã«å‚加ã—ã¾ã™ã‹ï¼Ÿ
+ </floater.string>
+ <floater.string name="VoiceInviteQuestionDefault">
+ [CURRENT_CHAT]を退席ã—ã¦ã€ã“ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å‚加ã—ã¾ã™ã‹ï¼Ÿ
</floater.string>
<text name="question">
[CURRENT_CHAT] を退席ã—ã¦ã€ã“ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å‚加ã—ã¾ã™ã‹ï¼Ÿ
diff --git a/indra/newview/skins/default/xui/ja/floater_inspect.xml b/indra/newview/skins/default/xui/ja/floater_inspect.xml
index b7c657c2f9..b3825c0b7f 100644
--- a/indra/newview/skins/default/xui/ja/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/ja/floater_inspect.xml
@@ -3,12 +3,12 @@
<floater.string name="timeStamp">
[year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
</floater.string>
- <scroll_list name="object_list" tool_tip="ã“ã®ãƒªã‚¹ãƒˆã‹ã‚‰ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã€ã“ã®ä¸–界ã§å¼·èª¿è¡¨ç¤ºã—ã¾ã™ã€‚">
- <scroll_list.columns label="オブジェクトå" name="object_name"/>
+ <scroll_list name="object_list" tool_tip="リストã‹ã‚‰ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã€ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ã§å¼·èª¿è¡¨ç¤ºã—ã¾ã™ã€‚">
+ <scroll_list.columns label="åå‰" name="object_name"/>
<scroll_list.columns label="所有者å" name="owner_name"/>
<scroll_list.columns label="制作者å" name="creator_name"/>
<scroll_list.columns label="ä½œæˆæ—¥" name="creation_date"/>
</scroll_list>
- <button label="所有者ã®ãƒ—ロフィールを表示..." name="button owner" tool_tip="é¸æŠžã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…ã®ãƒ—ロフィールを見る"/>
- <button label="制作者ã®ãƒ—ロフィールを表示..." name="button creator" tool_tip="é¸æŠžã•れãŸã‚ªãƒ–ジェクトã®åˆ¶ä½œè€…ã®ãƒ—ロフィールを見る"/>
+ <button label="所有者ã®ãƒ—ロフィールを表示..." name="button owner" tool_tip="é¸æŠžã—ãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…ã®ãƒ—ロフィールを表示ã—ã¾ã™" width="180"/>
+ <button label="制作者ã®ãƒ—ロフィールを表示..." name="button creator" tool_tip="é¸æŠžã—ãŸã‚ªãƒ–ジェクトã®åˆ¶ä½œè€…ã®ãƒ—ロフィールを表示ã—ã¾ã™" width="180"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_inventory.xml b/indra/newview/skins/default/xui/ja/floater_inventory.xml
index 7cf16b8ff2..b113fde94a 100644
--- a/indra/newview/skins/default/xui/ja/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/floater_inventory.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Inventory" title="æŒã¡ç‰©">
<floater.string name="Title">
- インベントリ
+ æŒã¡ç‰©
</floater.string>
<floater.string name="TitleFetching">
æŒã¡ç‰© ( [ITEM_COUNT] アイテムをå–得中...) [FILTER]
diff --git a/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml
index 86bb5dcf62..47a63e5e20 100644
--- a/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/ja/floater_inventory_view_finder.xml
@@ -9,7 +9,7 @@
<check_box label="オブジェクト" name="check_object"/>
<check_box label="スクリプト" name="check_script"/>
<check_box label="サウンド" name="check_sound"/>
- <check_box label="テクスãƒãƒ£ãƒ¼" name="check_texture"/>
+ <check_box label="テクスãƒãƒ£" name="check_texture"/>
<check_box label="スナップショット" name="check_snapshot"/>
<button label="ã™ã¹ã¦" label_selected="ã™ã¹ã¦" name="All"/>
<button label="ãªã—" label_selected="ãªã—" name="None"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_joystick.xml b/indra/newview/skins/default/xui/ja/floater_joystick.xml
index 9d91fe8db9..daa480ef5a 100644
--- a/indra/newview/skins/default/xui/ja/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/ja/floater_joystick.xml
@@ -71,7 +71,7 @@
<spinner left="135" name="AvatarAxisDeadZone0" width="50"/>
<spinner left="205" name="BuildAxisDeadZone0" width="50"/>
<spinner left="275" name="FlycamAxisDeadZone0" width="50"/>
- <text left="0" name="PitchDeadZone" width="135">
+ <text left="0" name="PitchDeadZone" width="125">
ピッãƒãƒ»ãƒ‡ãƒƒãƒ‰ãƒ»ã‚¾ãƒ¼ãƒ³
</text>
<spinner left="135" name="AvatarAxisDeadZone4" width="50"/>
@@ -83,13 +83,13 @@
<spinner left="135" name="AvatarAxisDeadZone5" width="50"/>
<spinner left="205" name="BuildAxisDeadZone5" width="50"/>
<spinner left="275" name="FlycamAxisDeadZone5" width="50"/>
- <text left="0" name="RollDeadZone" width="135">
+ <text left="0" name="RollDeadZone" width="125">
ロール・デッド・ゾーン
</text>
<spinner left="205" name="BuildAxisDeadZone3" width="50"/>
<spinner left="275" name="FlycamAxisDeadZone3" width="50"/>
<text name="Feathering">
- 羽毛
+ 感度調整
</text>
<slider label="" left="126" name="AvatarFeathering" width="67"/>
<slider label="" left="196" name="BuildFeathering" width="67"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_land_holdings.xml b/indra/newview/skins/default/xui/ja/floater_land_holdings.xml
index 474bd32cb0..aca916f22f 100644
--- a/indra/newview/skins/default/xui/ja/floater_land_holdings.xml
+++ b/indra/newview/skins/default/xui/ja/floater_land_holdings.xml
@@ -7,17 +7,17 @@
<column label="é¢ç©" name="area"/>
<column label="" name="hidden"/>
</scroll_list>
- <button label="テレãƒãƒ¼ãƒˆ" label_selected="テレãƒãƒ¼ãƒˆ" name="Teleport" tool_tip="ã“ã®åœŸåœ°ã®ä¸­å¿ƒã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ"/>
+ <button label="テレãƒãƒ¼ãƒˆ" label_selected="テレãƒãƒ¼ãƒˆ" name="Teleport" tool_tip="ã“ã®åœŸåœ°ã®ä¸­å¿ƒã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™"/>
<button label="地図" label_selected="地図" name="Show on Map" tool_tip="ã“ã®åœŸåœ°ã‚’世界地図ã«è¡¨ç¤ºã—ã¾ã™"/>
<text name="contrib_label">
- ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—ã¸ã®è²¢çŒ®ï¼š
+ 所属グループã¸ã®è²¢çŒ®ï¼š
</text>
<scroll_list name="grant list">
<column label="グループå" name="group"/>
<column label="é¢ç©" name="area"/>
</scroll_list>
<text name="allowed_label">
- ç¾åœ¨ã®æ”¯æ‰•ã„プランã§ã®è¨±å¯ã•れãŸä¿æœ‰åœ°ï¼š
+ ç¾åœ¨ã®æ”¯æ‰•ã„プランã§è¨±å¯ã•れãŸä¿æœ‰åœ°ï¼š
</text>
<text name="allowed_text">
[AREA] 平方メートル
@@ -29,7 +29,7 @@
[AREA] 平方メートル
</text>
<text name="available_label">
- 土地購入å¯ï¼š
+ 購入å¯èƒ½ãªåœŸåœ°ï¼š
</text>
<text name="available_text">
[AREA] 平方メートル
diff --git a/indra/newview/skins/default/xui/ja/floater_map.xml b/indra/newview/skins/default/xui/ja/floater_map.xml
index f3cba7e674..79e211c31e 100644
--- a/indra/newview/skins/default/xui/ja/floater_map.xml
+++ b/indra/newview/skins/default/xui/ja/floater_map.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Map">
+<floater name="Map" title="">
<floater.string name="mini_map_north">
北
</floater.string>
@@ -25,7 +25,7 @@
北西
</floater.string>
<floater.string name="ToolTipMsg">
- [AGENT][REGION] (ダブルクリックã§åœ°å›³ã‚’é–‹ã)
+ [AGENT][REGION] (ダブルクリックã§åœ°å›³ã‚’é–‹ãã¾ã™ï¼‰
</floater.string>
<text label="北" name="floater_map_north" text="北">
北
diff --git a/indra/newview/skins/default/xui/ja/floater_media_browser.xml b/indra/newview/skins/default/xui/ja/floater_media_browser.xml
index 4f67523eec..c4731b73a3 100644
--- a/indra/newview/skins/default/xui/ja/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/ja/floater_media_browser.xml
@@ -22,8 +22,8 @@
<button label="ç¾åœ¨ã®ãƒšãƒ¼ã‚¸ã‚’区画ã«é€ã‚‹" name="assign"/>
</layout_panel>
<layout_panel name="external_controls">
- <button label="外部ウェブ・ブラウザã§é–‹ã" name="open_browser"/>
- <check_box label="常ã«å¤–部ã®ã‚¦ã‚§ãƒ–・ブラウザã§é–‹ã" name="open_always"/>
+ <button label="外部Webブラウザã§é–‹ã" name="open_browser"/>
+ <check_box label="常ã«å¤–部ã®Webブラウザã§é–‹ã" name="open_always"/>
<button label="é–‰ã˜ã‚‹" name="close"/>
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml b/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml
index 6167b6db91..f48bb94e32 100644
--- a/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml
+++ b/indra/newview/skins/default/xui/ja/floater_mem_leaking.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="MemLeak" title="メモリリークã®ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ãƒˆ">
- <spinner label="リークスピード(1フレームã”ã¨ã®ãƒã‚¤ãƒˆæ•°):" label_width="244" name="leak_speed"/>
- <spinner label="リークã—ãŸæœ€å¤§ãƒ¡ãƒ¢ãƒªæ•°(MB):" label_width="244" name="max_leak"/>
+ <spinner label="リーク速度(1フレームã”ã¨ã®ãƒã‚¤ãƒˆæ•°):" label_width="244" name="leak_speed"/>
+ <spinner label="最大メモリリーク(MB):" label_width="244" name="max_leak"/>
<text name="total_leaked_label">
- ç¾åœ¨ã®ãƒªãƒ¼ã‚¯ãƒ¡ãƒ¢ãƒªã‚µã‚¤ã‚ºï¼š [SIZE] KB
+ ç¾åœ¨ã®ãƒ¡ãƒ¢ãƒªãƒªãƒ¼ã‚¯ï¼š [SIZE] KB
</text>
<text name="note_label_1">
[NOTE1]
diff --git a/indra/newview/skins/default/xui/ja/floater_moveview.xml b/indra/newview/skins/default/xui/ja/floater_moveview.xml
index 8ba297c7a0..57ab32f486 100644
--- a/indra/newview/skins/default/xui/ja/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_moveview.xml
@@ -6,23 +6,64 @@
<string name="walk_back_tooltip">
後ã‚ã«æ­©ã(下矢å°ã‹ S を押ã™ï¼‰
</string>
+ <string name="walk_left_tooltip">
+ å·¦ã«æ°´å¹³ç§»å‹•(Shift + 左矢å°ã‹ A を押ã™ï¼‰
+ </string>
+ <string name="walk_right_tooltip">
+ å³ã«æ°´å¹³ç§»å‹•(Shift + å³çŸ¢å°ã‹ D を押ã™ï¼‰
+ </string>
<string name="run_forward_tooltip">
å‰ã«èµ°ã‚‹ï¼ˆä¸ŠçŸ¢å°ã‹ W を押ã™ï¼‰
</string>
<string name="run_back_tooltip">
後ã‚ã«èµ°ã‚‹ï¼ˆä¸‹çŸ¢å°ã‹ S を押ã™ï¼‰
</string>
+ <string name="run_left_tooltip">
+ å·¦ã«æ°´å¹³ç§»å‹•(Shift + 左矢å°ã‹ A を押ã™ï¼‰
+ </string>
+ <string name="run_right_tooltip">
+ å³ã«æ°´å¹³ç§»å‹•(Shift + å³çŸ¢å°ã‹ D を押ã™ï¼‰
+ </string>
<string name="fly_forward_tooltip">
å‰ã«é£›ã¶ï¼ˆä¸ŠçŸ¢å°ã‹ W を押ã™ï¼‰
</string>
<string name="fly_back_tooltip">
後ã‚ã«é£›ã¶ï¼ˆä¸‹çŸ¢å°ã‹ S を押ã™ï¼‰
</string>
+ <string name="fly_left_tooltip">
+ å·¦ã«æ°´å¹³ç§»å‹•(Shift + 左矢å°ã‹ A を押ã™ï¼‰
+ </string>
+ <string name="fly_right_tooltip">
+ å³ã«æ°´å¹³ç§»å‹•(Shift + å³çŸ¢å°ã‹ D を押ã™ï¼‰
+ </string>
+ <string name="fly_up_tooltip">
+ 上ã«ç§»å‹•(E を押ã™ï¼‰
+ </string>
+ <string name="fly_down_tooltip">
+ 下ã«ç§»å‹•(C を押ã™ï¼‰
+ </string>
+ <string name="jump_tooltip">
+ ジャンプ(E を押ã™ï¼‰
+ </string>
+ <string name="crouch_tooltip">
+ ã‹ãŒã‚€ï¼ˆC を押ã™ï¼‰
+ </string>
+ <string name="walk_title">
+ æ­©ã
+ </string>
+ <string name="run_title">
+ èµ°ã‚‹
+ </string>
+ <string name="fly_title">
+ 飛ã¶
+ </string>
<panel name="panel_actions">
+ <button label="" label_selected="" name="move up btn" tool_tip="上ã«ç§»å‹•(E を押ã™ï¼‰"/>
<button label="" label_selected="" name="turn left btn" tool_tip="左をå‘ã(左矢å°ã‹ A を押ã™ï¼‰"/>
+ <joystick_slide name="move left btn" tool_tip="å·¦ã«æ­©ã(Shift + 左矢å°ã‹ A を押ã™ï¼‰"/>
+ <button label="" label_selected="" name="move down btn" tool_tip="下ã«ç§»å‹•(C を押ã™ï¼‰"/>
<button label="" label_selected="" name="turn right btn" tool_tip="å³ã‚’å‘ã(å³çŸ¢å°ã‹ D を押ã™ï¼‰"/>
- <button label="" label_selected="" name="move up btn" tool_tip="飛ã¶ãƒ»E を押ã™"/>
- <button label="" label_selected="" name="move down btn" tool_tip="ç€åœ°ãƒ»C を押ã™"/>
+ <joystick_slide name="move right btn" tool_tip="å³ã«æ­©ã(Shift + å³çŸ¢å°ã‹ D を押ã™ï¼‰"/>
<joystick_turn name="forward btn" tool_tip="å‰ã«é€²ã‚€ï¼ˆä¸ŠçŸ¢å°ã‹ W を押ã™ï¼‰"/>
<joystick_turn name="backward btn" tool_tip="後ã‚ã«æ­©ã(下矢å°ã‹ S を押ã™ï¼‰"/>
</panel>
@@ -30,6 +71,5 @@
<button label="" name="mode_walk_btn" tool_tip="歩行モード"/>
<button label="" name="mode_run_btn" tool_tip="走行モード"/>
<button label="" name="mode_fly_btn" tool_tip="飛行モード"/>
- <button label="é£›è¡Œåœæ­¢" name="stop_fly_btn" tool_tip="é£›è¡Œåœæ­¢"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/ja/floater_outfit_save_as.xml
index a869b106ce..70555e6ded 100644
--- a/indra/newview/skins/default/xui/ja/floater_outfit_save_as.xml
+++ b/indra/newview/skins/default/xui/ja/floater_outfit_save_as.xml
@@ -1,11 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="modal container">
+<floater name="modal container" title="アウトフィットをä¿å­˜ã™ã‚‹">
<button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
<button label="キャンセル" label_selected="キャンセル" name="Cancel"/>
<text name="Save item as:">
- アウトフィットを別åã§ä¿å­˜ï¼š
+ ç€ç”¨ã—ã¦ã„ã‚‹ã‚‚ã®ã‚’
+æ–°ã—ã„アウトフィットã«ä¿å­˜ï¼š
</text>
<line_editor name="name ed">
- [DESC]
+ [DESC] (新)
</line_editor>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_outgoing_call.xml b/indra/newview/skins/default/xui/ja/floater_outgoing_call.xml
index 8d67108b77..f1a05e0eec 100644
--- a/indra/newview/skins/default/xui/ja/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/ja/floater_outgoing_call.xml
@@ -25,10 +25,13 @@
繋ãŒã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚ ã‚ã¨ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
</text>
<text name="nearby">
- [VOICE_CHANNEL_NAME] ã¸ã®æŽ¥ç¶šãŒåˆ‡ã‚Œã¾ã—ãŸã€‚ 「近ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã€ã«å†æŽ¥ç¶šã•れã¾ã™ã€‚
+ [VOICE_CHANNEL_NAME] ã¸ã®æŽ¥ç¶šãŒåˆ‡ã‚Œã¾ã—ãŸã€‚ [RECONNECT_NEARBY]
</text>
- <text name="nearby_P2P">
- [VOICE_CHANNEL_NAME] ãŒã‚³ãƒ¼ãƒ«ã‚’終了ã—ã¾ã—ãŸã€‚ 「近ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã€ã«å†æŽ¥ç¶šã•れã¾ã™ã€‚
+ <text name="nearby_P2P_by_other">
+ コールを切りã¾ã—ãŸã€‚ [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_agent">
+ コールを終了ã—ã¾ã—ãŸã€‚ [RECONNECT_NEARBY]
</text>
<text name="leaving">
[CURRENT_CHAT] を終了ã—ã¾ã™ã€‚
diff --git a/indra/newview/skins/default/xui/ja/floater_pay.xml b/indra/newview/skins/default/xui/ja/floater_pay.xml
index 4564354899..39bc37bc6c 100644
--- a/indra/newview/skins/default/xui/ja/floater_pay.xml
+++ b/indra/newview/skins/default/xui/ja/floater_pay.xml
@@ -7,7 +7,7 @@
ä½äººã«æ”¯æ‰•ã†
</string>
<text name="payee_label">
- 支払ã„:
+ 支払ã†ï¼š
</text>
<icon name="icon_person" tool_tip="ä½äºº"/>
<text name="payee_name">
@@ -20,6 +20,6 @@
<text name="amount text">
金é¡ã‚’指定:
</text>
- <button label="支払ã„" label_selected="支払ã„" name="pay btn"/>
+ <button label="支払ã†" label_selected="支払ã†" name="pay btn"/>
<button label="å–り消ã—" label_selected="å–り消ã—" name="cancel btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_perm_prefs.xml b/indra/newview/skins/default/xui/ja/floater_perm_prefs.xml
index adbb8596d3..98cda25a81 100644
--- a/indra/newview/skins/default/xui/ja/floater_perm_prefs.xml
+++ b/indra/newview/skins/default/xui/ja/floater_perm_prefs.xml
@@ -5,11 +5,11 @@
<check_box label="グループã§å…±åŒç®¡ç†" name="share_with_group"/>
<check_box label="誰ã«å¯¾ã—ã¦ã‚‚コピーを許å¯" name="everyone_copy"/>
<text name="NextOwnerLabel">
- 次ã®ã‚ªãƒ¼ãƒŠãƒ¼ãŒã§ãã‚‹æ“作:
+ æ¬¡ã®æ‰€æœ‰è€…ãŒã§ãã‚‹æ“作:
</text>
<check_box label="修正" name="next_owner_modify"/>
<check_box label="コピー" name="next_owner_copy"/>
- <check_box label="å†è²©/プレゼント" name="next_owner_transfer"/>
+ <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="next_owner_transfer"/>
</panel>
<button label="OK" label_selected="OK" name="ok"/>
<button label="å–り消ã—" label_selected="å–り消ã—" name="cancel"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_postcard.xml b/indra/newview/skins/default/xui/ja/floater_postcard.xml
index b2ca059ccd..9d9b59fa51 100644
--- a/indra/newview/skins/default/xui/ja/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/ja/floater_postcard.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Postcard" title="スナップショットをメール">
+<floater name="Postcard" title="スナップショットをEメールã§é€ä¿¡">
<text name="to_label">
- ä½äººã®Eメール:
+ å—ä¿¡å…ˆã®Eメール:
</text>
<line_editor left="145" name="to_form" width="125"/>
<text name="from_label">
@@ -15,14 +15,14 @@
<text name="subject_label">
ä»¶å:
</text>
- <line_editor label="ä»¶åã‚’ã“ã“ã«å…¥åŠ›" left="145" name="subject_form" width="125"/>
+ <line_editor label="ä»¶åを入力ã—ã¦ãã ã•ã„" left="145" name="subject_form" width="125"/>
<text name="msg_label">
メッセージ:
</text>
<text_editor bottom_delta="-120" height="110" name="msg_form">
メッセージをã“ã“ã«å…¥åŠ›ã—ã¦ãã ã•ã„。
</text_editor>
- <check_box label="ウェブ上ã§å…¬é–‹" name="allow_publish_check" tool_tip="ã“ã®ãƒã‚¹ãƒˆã‚«ãƒ¼ãƒ‰ã‚’ウェブ上ã§å…¬é–‹ã—ã¾ã™ã€‚"/>
+ <check_box label="Web上ã§å…¬é–‹" name="allow_publish_check" tool_tip="ã“ã®ãƒã‚¹ãƒˆã‚«ãƒ¼ãƒ‰ã‚’Web上ã§å…¬é–‹ã—ã¾ã™ã€‚"/>
<check_box label="æˆäººå‘ã‘コンテンツ" name="mature_check" tool_tip="ã“ã®ãƒã‚¹ãƒˆã‚«ãƒ¼ãƒ‰ã«ã¯æˆäººå‘ã‘内容ãŒå«ã¾ã‚Œã¾ã™ã€‚"/>
<button label="?" left="300" name="publish_help_btn"/>
<text name="fine_print">
diff --git a/indra/newview/skins/default/xui/ja/floater_preferences.xml b/indra/newview/skins/default/xui/ja/floater_preferences.xml
index 1493219b83..6ba27b71a6 100644
--- a/indra/newview/skins/default/xui/ja/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preferences.xml
@@ -6,9 +6,9 @@
<panel label="一般" name="general"/>
<panel label="グラフィック" name="display"/>
<panel label="プライãƒã‚·ãƒ¼" name="im"/>
- <panel label="サウンド" name="audio"/>
+ <panel label="サウンドã¨ãƒ¡ãƒ‡ã‚£ã‚¢" name="audio"/>
<panel label="ãƒãƒ£ãƒƒãƒˆ" name="chat"/>
- <panel label="通知" name="msgs"/>
+ <panel label="メッセージ" name="msgs"/>
<panel label="セットアップ" name="input"/>
<panel label="詳細" name="advanced1"/>
</tab_container>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_animation.xml b/indra/newview/skins/default/xui/ja/floater_preview_animation.xml
index fb2f2c7433..4fc59e16d3 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_animation.xml
@@ -6,6 +6,6 @@
<text name="desc txt">
説明:
</text>
- <button label="世界ã§å†ç”Ÿ" label_selected="åœæ­¢" name="Anim play btn" tool_tip="他人ã«è¦‹ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿ"/>
- <button label="ローカルã«å†ç”Ÿ" label_selected="åœæ­¢" name="Anim audition btn" tool_tip="自分ã ã‘ãŒè¦‹ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿ"/>
+ <button label="インワールドã§å†ç”Ÿ" label_selected="åœæ­¢" name="Anim play btn" tool_tip="他人ã«ã‚‚見ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿã—ã¾ã™"/>
+ <button label="ローカルå†ç”Ÿ" label_selected="åœæ­¢" name="Anim audition btn" tool_tip="自分ã ã‘ãŒè¦‹ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿã—ã¾ã™"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml b/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml
index a378700d15..64c577b879 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_gesture.xml
@@ -33,12 +33,12 @@
<text name="trigger_label">
トリガー:
</text>
- <text name="replace_text" tool_tip="トリガー・ワードをã“れらã®å˜èªžã«ç½®ãæ›ãˆã¾ã™ã€‚ ãŸã¨ãˆã°ã€ãƒˆãƒªã‚¬ãƒ¼ã€Œhelloã€ã‚’「Howdyã€ã«ç½®æ›ã™ã‚‹ã¨ã€ã€ŒI wanted to say helloã€ã¨ã„ã†ãƒãƒ£ãƒƒãƒˆæ–‡ãŒã€ŒI wanted to say howdyã€ã«å¤‰ã‚りã€ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã«ã‚‚ç½®æ›ãŒå映ã•れã¾ã™ã€‚">
+ <text name="replace_text" tool_tip="トリガーワードをã“れらã®å˜èªžã«ç½®ãæ›ãˆã¾ã™ã€‚ ãŸã¨ãˆã°ã€ãƒˆãƒªã‚¬ãƒ¼ã€Œhelloã€ã‚’「Howdyã€ã«ç½®æ›ã™ã‚‹ã¨ã€ã€ŒI wanted to say helloã€ã¨ã„ã†ãƒãƒ£ãƒƒãƒˆæ–‡ãŒã€ŒI wanted to say howdyã€ã«å¤‰ã‚りã€ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã«ã‚‚ç½®æ›ãŒå映ã•れã¾ã™ã€‚">
ç½®æ›ï¼š
</text>
- <line_editor name="replace_editor" tool_tip="トリガー・ワードをã“れらã®å˜èªžã«ç½®ãæ›ãˆã¾ã™ã€‚ ãŸã¨ãˆã°ã€ãƒˆãƒªã‚¬ãƒ¼ã€Œhelloã€ã‚’「Howdyã€ã«ç½®æ›ã™ã‚‹ã¨ã€ã€ŒI wanted to say helloã€ã¨ã„ã†ãƒãƒ£ãƒƒãƒˆæ–‡ãŒã€ŒI wanted to say howdyã€ã«å¤‰ã‚りã€ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã«ã‚‚ç½®æ›ãŒå映ã•れã¾ã™ã€‚"/>
+ <line_editor name="replace_editor" tool_tip="トリガーワードをã“れらã®å˜èªžã«ç½®ãæ›ãˆã¾ã™ã€‚ ãŸã¨ãˆã°ã€ãƒˆãƒªã‚¬ãƒ¼ã€Œhelloã€ã‚’「Howdyã€ã«ç½®æ›ã™ã‚‹ã¨ã€ã€ŒI wanted to say helloã€ã¨ã„ã†ãƒãƒ£ãƒƒãƒˆæ–‡ãŒã€ŒI wanted to say howdyã€ã«å¤‰ã‚りã€ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã«ã‚‚ç½®æ›ãŒå映ã•れã¾ã™ã€‚"/>
<text name="key_label">
- ショートカット・キー:
+ ショートカット:
</text>
<combo_box label="ãªã—" left="160" name="modifier_combo"/>
<combo_box label="ãªã—" name="key_combo"/>
@@ -62,7 +62,7 @@
<text name="help_label">
待機ステップを入れãªã„é™ã‚Šã¯ã€ã™ã¹ã¦ã®ã‚¹ãƒ†ãƒƒãƒ—ãŒåŒæ™‚ã«èµ·ã“りã¾ã™ã€‚
</text>
- <check_box label="アクティブ" left="120" name="active_check" tool_tip="アクティブ・ジェスãƒãƒ£ãƒ¼ã¯ã€ãƒˆãƒªã‚¬ãƒ¼ãƒ»ãƒ•レーズを使ã†ã‹ã€ã¾ãŸã¯ãƒ›ãƒƒãƒˆãƒ»ã‚­ãƒ¼ã‚’押ã™ã“ã¨ã«ã‚ˆã£ã¦ãƒˆãƒªã‚¬ãƒ¼ã§ãã¾ã™ã€‚ 1ã¤ã®ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆãƒ»ã‚­ãƒ¼ã«2ã¤ä»¥ä¸Šã®ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸå ´åˆã€ãã®ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã¯ä¸¡æ–¹ã¨ã‚‚アクティブã§ã¯ãªããªã‚Šã¾ã™ã€‚"/>
+ <check_box label="アクティブ" name="active_check" tool_tip="アクティブãªã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã¯ã€ãƒˆãƒªã‚¬ãƒ¼ãƒ•レーズを使ã†ã‹ã€ãƒ›ãƒƒãƒˆã‚­ãƒ¼ã‚’押ã™ã¨åˆ‡ã‚Šæ›¿ã‚りã¾ã™ã€‚ 1ã¤ã®ã‚·ãƒ§ãƒ¼ãƒˆã‚«ãƒƒãƒˆã‚­ãƒ¼ã«2ã¤ä»¥ä¸Šã®ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚ŒãŸå ´åˆã€ãã®ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã¯ä¸¡æ–¹ã¨ã‚‚アクティブã§ã¯ãªããªã‚Šã¾ã™ã€‚"/>
<button label="プレビュー" name="preview_btn"/>
<button label="ä¿å­˜" name="save_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/ja/floater_preview_gesture_shortcut.xml
index 596699d6c1..e96a43d0c1 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_gesture_shortcut.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_gesture_shortcut.xml
@@ -6,8 +6,8 @@
<text name="key_label">
キーボード:
</text>
- <combo_box label="ãªã—" name="modifier_combo"/>
- <combo_box label="ãªã—" name="key_combo"/>
+ <combo_box label="ãªã—" name="modifier_combo" width="60"/>
+ <combo_box label="ãªã—" name="key_combo" width="60"/>
<text name="replace_text" tool_tip="ã“れらã®å˜èªžã«ãƒˆãƒªã‚¬ãƒ¼ã¨ãªã‚‹å˜èªžã‚’ç½®ãæ›ãˆã¾ã™ã€‚ 例ãˆã°ã€ã€Œhowdyã€ã¨ã€Œhelloã€ã‚’ç½®ãæ›ãˆã‚‹ã¨ã€ã€ŒI wanted to say helloã€ã¨ã„ã†ãƒãƒ£ãƒƒãƒˆã¯ã€ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼ã‚’交ãˆãªãŒã‚‰ã®ã€ŒI wanted to say howdyã€ã«å¤‰ã‚りã¾ã™ã€‚">
ç½®ãæ›ãˆï¼š
</text>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_notecard.xml b/indra/newview/skins/default/xui/ja/floater_preview_notecard.xml
index 6e6e04c7d8..ae8ae9f7b5 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_notecard.xml
@@ -9,9 +9,6 @@
<floater.string name="Title">
ノートカード: [NAME]
</floater.string>
- <floater.string label="ä¿å­˜" label_selected="ä¿å­˜" name="Save">
- ä¿å­˜
- </floater.string>
<text name="desc txt">
説明:
</text>
@@ -19,4 +16,5 @@
ローディング...
</text_editor>
<button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
+ <button label="削除" label_selected="削除" name="Delete"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_sound.xml b/indra/newview/skins/default/xui/ja/floater_preview_sound.xml
index d3c06cbef4..5c0f05cec6 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_sound.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_sound.xml
@@ -6,6 +6,6 @@
<text name="desc txt">
説明:
</text>
- <button label="世界ã§å†ç”Ÿ" label_selected="世界ã§å†ç”Ÿ" name="Sound play btn" tool_tip="他人ãŒèžã“ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿ"/>
- <button label="ローカルã«å†ç”Ÿ" label_selected="ローカルã«å†ç”Ÿ" name="Sound audition btn" tool_tip="自分ã ã‘ãŒèžã“ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿ"/>
+ <button label="インワールドã§å†ç”Ÿ" label_selected="インワールドã§å†ç”Ÿ" name="Sound play btn" tool_tip="他人ã«ã‚‚èžã“ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿã—ã¾ã™"/>
+ <button label="ローカルå†ç”Ÿ" label_selected="ローカルå†ç”Ÿ" name="Sound audition btn" tool_tip="自分ã ã‘ãŒèžã“ãˆã‚‹ã‚ˆã†ã«å†ç”Ÿã—ã¾ã™"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_preview_texture.xml b/indra/newview/skins/default/xui/ja/floater_preview_texture.xml
index c322538127..6ea1d79cfc 100644
--- a/indra/newview/skins/default/xui/ja/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/ja/floater_preview_texture.xml
@@ -42,6 +42,6 @@
</combo_item>
</combo_box>
<button label="OK" name="Keep"/>
- <button label="キャンセル" name="Discard"/>
+ <button label="処分ã™ã‚‹" name="Discard"/>
<button label="別åã§ä¿å­˜" name="save_tex_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_publish_classified.xml b/indra/newview/skins/default/xui/ja/floater_publish_classified.xml
new file mode 100644
index 0000000000..ca6204424e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_publish_classified.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="publish_classified" title="クラシファイド広告掲載">
+ <text name="explanation_text">
+ ã‚ãªãŸã®ã‚¯ãƒ©ã‚·ãƒ•ァイド広告ã¯ã€æŽ²è¼‰ã•ã‚ŒãŸæ—¥ã‹ã‚‰1週間有効ã§ã™ã€‚
+
+クラシファイド広告ã¯è¿”金ã§ãã¾ã›ã‚“ã®ã§ã”了承ãã ã•ã„。
+ </text>
+ <spinner label="広告費:" name="price_for_listing" tool_tip="掲載価格" value="50"/>
+ <text name="l$_text" value="L$"/>
+ <text name="more_info_text">
+ 詳ã—ã„æƒ…報(クラシファイドヘルプã¸ã®ãƒªãƒ³ã‚¯ï¼‰
+ </text>
+ <button label="掲載" name="publish_btn"/>
+ <button label="キャンセル" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_report_abuse.xml b/indra/newview/skins/default/xui/ja/floater_report_abuse.xml
index ca6faf59c2..dc34441535 100644
--- a/indra/newview/skins/default/xui/ja/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/ja/floater_report_abuse.xml
@@ -25,7 +25,7 @@
<text name="select_object_label">
ボタンをクリックã—ã¦ã‹ã‚‰ã€æ‚ªæ„ã®ã‚るオブジェクトをクリック:
</text>
- <button label="" label_selected="" name="pick_btn" tool_tip="オブジェクト・ピッカー - ã“ã®å ±å‘Šã®ä¸»é¡Œã¨ãªã‚‹ã‚ªãƒ–ジェクトを特定"/>
+ <button label="" label_selected="" name="pick_btn" tool_tip="オブジェクトピッカー - 報告対象ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„"/>
<text name="object_name_label">
オブジェクト:
</text>
@@ -33,13 +33,13 @@
Consetetur Sadipscing
</text>
<text name="owner_name_label">
- オーナー:
+ 所有者:
</text>
<text name="owner_name">
Hendrerit Vulputate Kamawashi Longname
</text>
- <combo_box name="category_combo" tool_tip="カテゴリー -- ã“ã®å ±å‘Šã«æœ€ã‚‚é©ã—ãŸã‚«ãƒ†ã‚´ãƒªãƒ¼ã‚’é¸æŠžã—ã¦ãã ã•ã„">
- <combo_box.item label="ã‚«ãƒ†ã‚´ãƒªãƒ¼ã‚’é¸æŠž" name="Select_category"/>
+ <combo_box name="category_combo" tool_tip="カテゴリ -- ã“ã®å ±å‘Šã«æœ€ã‚‚é©ã—ãŸã‚«ãƒ†ã‚´ãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„">
+ <combo_box.item label="ã‚«ãƒ†ã‚´ãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„" name="Select_category"/>
<combo_box.item label="年齢>年齢å½è¨¼" name="Age__Age_play"/>
<combo_box.item label="å¹´é½¢ &gt; æˆäººã®ä½äººãŒ Teen Second Life ã«ã„ã‚‹" name="Age__Adult_resident_on_Teen_Second_Life"/>
<combo_box.item label="å¹´é½¢ &gt; 未æˆå¹´ã®ä½äººãŒTeen Second Life ã®å¤–ã«ã„ã‚‹" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
@@ -49,7 +49,7 @@
<combo_box.item label="商å–引>製å“ã¾ãŸã¯ã‚µãƒ¼ãƒ“ã‚¹ã®æä¾›ãŒè¡Œã‚れãªã„" name="Commerce__Failure_to_deliver_product_or_service"/>
<combo_box.item label="é–‹ç¤ºï¼žãƒªã‚¢ãƒ«ãƒ¯ãƒ¼ãƒ«ãƒ‰ã®æƒ…å ±" name="Disclosure__Real_world_information"/>
<combo_box.item label="開示>離れãŸã¨ã“ã‚ã‹ã‚‰ãƒãƒ£ãƒƒãƒˆã‚’モニターã—ã¦ã„ã‚‹" name="Disclosure__Remotely_monitoring chat"/>
- <combo_box.item label="開示>Second Lifeã®æƒ…å ±/ãƒãƒ£ãƒƒãƒˆ/IM" name="Disclosure__Second_Life_information_chat_IMs"/>
+ <combo_box.item label="開示>Second Life ã®æƒ…å ±/ãƒãƒ£ãƒƒãƒˆ/IM" name="Disclosure__Second_Life_information_chat_IMs"/>
<combo_box.item label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žåœ°åŸŸãƒªã‚½ãƒ¼ã‚¹ã®ä½¿ç”¨ãŒä¸å…¬å¹³" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
<combo_box.item label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトã®ä¹±ç”¨" name="Disturbing_the_peace__Excessive_scripted_objects"/>
<combo_box.item label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ¨ã¦ç½®ã" name="Disturbing_the_peace__Object_littering"/>
@@ -57,7 +57,7 @@
<combo_box.item label="å¹³ç©ã‚’ä¹±ã™è¡Œç‚ºï¼žä¸è¦ãªåºƒå‘Šã‚¹ãƒ‘ム" name="Disturbing_the_peace__Unwanted_advert_spam"/>
<combo_box.item label="è©æ¬ºï¼ž L$" name="Fraud__L$"/>
<combo_box.item label="è©æ¬ºï¼žåœŸåœ°" name="Fraud__Land"/>
- <combo_box.item label="è©æ¬ºï¼žãƒžãƒ«ãƒå•†æ³•ã¾ãŸã¯ãƒã‚§ãƒ¼ãƒ³ãƒ»ãƒ¡ãƒ¼ãƒ«" name="Fraud__Pyramid_scheme_or_chain_letter"/>
+ <combo_box.item label="è©æ¬ºï¼žãƒžãƒ«ãƒå•†æ³•ã¾ãŸã¯ãƒã‚§ãƒ¼ãƒ³ãƒ¡ãƒ¼ãƒ«" name="Fraud__Pyramid_scheme_or_chain_letter"/>
<combo_box.item label="è©æ¬ºï¼ž US$" name="Fraud__US$"/>
<combo_box.item label="嫌ãŒã‚‰ã›ï¼žåºƒå‘Šå§”託/視覚的ãªã‚¹ãƒ‘ム" name="Harassment__Advert_farms___visual_spam"/>
<combo_box.item label="嫌ãŒã‚‰ã›ï¼žå€‹äººã¾ãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—ã®ä¸­å‚·" name="Harassment__Defaming_individuals_or_groups"/>
@@ -68,11 +68,11 @@
<combo_box.item label="ã‚ã„ã›ã¤ï¼žè‘—ã—ãä¸å¿«ã§ã‚ã‚‹ã¨è¦‹ãªã•れるコンテンツã¾ãŸã¯è¡Œç‚º" name="Indecency__Broadly_offensive_content_or_conduct"/>
<combo_box.item label="ã‚ã„ã›ã¤ï¼žä¸é©åˆ‡ãªã‚¢ãƒã‚¿ãƒ¼å" name="Indecency__Inappropriate_avatar_name"/>
<combo_box.item label="ã‚ã„ã›ã¤ï¼žPG地域ã§ã®ä¸é©åˆ‡ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¾ãŸã¯è¡Œç‚º" name="Indecency__Mature_content_in_PG_region"/>
- <combo_box.item label="ã‚ã„ã›ã¤ &gt; 控ãˆã‚指定ã®åœ°åŸŸã§ã®ä¸é©åˆ‡ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¾ãŸã¯è¡Œç‚º" name="Indecency__Inappropriate_content_in_Mature_region"/>
+ <combo_box.item label="ã‚ã„ã›ã¤ &gt; 「Moderateã€æŒ‡å®šã®åœ°åŸŸã§ã®ä¸é©åˆ‡ãªã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¾ãŸã¯è¡Œç‚º" name="Indecency__Inappropriate_content_in_Mature_region"/>
<combo_box.item label="知的財産ã®ä¾µå®³ï¼žã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ’¤åŽ»" name="Intellectual_property_infringement_Content_Removal"/>
<combo_box.item label="知的財産ã®ä¾µå®³ï¼žã‚³ãƒ”ーBotåŠã³æ¨©é™ã®æ‚ªç”¨" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
<combo_box.item label="ä¸å¯›å®¹" name="Intolerance"/>
- <combo_box.item label="土地>サンドボックス・リソースã®ä¹±ç”¨" name="Land__Abuse_of_sandbox_resources"/>
+ <combo_box.item label="土地>サンドボックスã®ãƒªã‚½ãƒ¼ã‚¹ã®ä¹±ç”¨" name="Land__Abuse_of_sandbox_resources"/>
<combo_box.item label="åœŸåœ°ï¼žä¸æ³•侵入>オブジェクト/テクスãƒãƒ£ãƒ¼" name="Land__Encroachment__Objects_textures"/>
<combo_box.item label="åœŸåœ°ï¼žä¸æ³•侵入>パーティクル" name="Land__Encroachment__Particles"/>
<combo_box.item label="åœŸåœ°ï¼žä¸æ³•侵入>樹木/æ¤ç‰©" name="Land__Encroachment__Trees_plants"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_sell_land.xml b/indra/newview/skins/default/xui/ja/floater_sell_land.xml
index b06b16bbb3..1e884af5f2 100644
--- a/indra/newview/skins/default/xui/ja/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/ja/floater_sell_land.xml
@@ -36,7 +36,7 @@
2. 特定ã®äººã«è²©å£²ï¼š
</text>
<text name="sell_to_text" right="-6">
- è²©å£²å…ˆã®æŒ‡å®šãªã—ã‹ã€ç‰¹å®šã®äººã«è²©å£²ã™ã‚‹ã‹é¸æŠžã—ã¦ãã ã•ã„。
+ è²©å£²å…ˆã®æŒ‡å®šãªã—ã‹ã€ç‰¹å®šã®äººã«è²©å£²ã™ã‚‹ã‹ã‚’é¸æŠžã—ã¦ãã ã•ã„。
</text>
<combo_box name="sell_to">
<combo_box.item label="- 1ã¤é¸æŠž -" name="--selectone--"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_snapshot.xml b/indra/newview/skins/default/xui/ja/floater_snapshot.xml
index 6c84de9b19..c6e315fe48 100644
--- a/indra/newview/skins/default/xui/ja/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/ja/floater_snapshot.xml
@@ -1,79 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Snapshot" title="スナップショットã®ãƒ—レビュー">
- <text name="type_label">
- スナップショットã®é€ã‚Šå…ˆ
- </text>
- <radio_group label="スナップショット・タイプ" name="snapshot_type_radio">
- <radio_item label="メール" name="postcard"/>
- <radio_item label="ç§ã®æŒã¡ç‰©ï¼ˆL$[AMOUNT])" name="texture"/>
- <radio_item label="コンピューターã«ä¿å­˜" name="local"/>
- </radio_group>
- <text name="file_size_label">
- [SIZE] KB
- </text>
+<floater name="Snapshot" title="スナップショット">
+ <floater.string name="unknown">
+ 䏿˜Ž
+ </floater.string>
<button label="スナップショットを更新" name="new_snapshot_btn"/>
- <button label="é€ä¿¡" name="send_btn"/>
- <button label="ä¿å­˜ï¼ˆL$[AMOUNT])" name="upload_btn"/>
- <flyout_button label="ä¿å­˜" name="save_btn" tool_tip="ç”»åƒã‚’ファイルã«ä¿å­˜">
- <flyout_button.item label="ä¿å­˜" name="save_item"/>
- <flyout_button.item label="åå‰ã‚’付ã‘ã¦ä¿å­˜" name="saveas_item"/>
- </flyout_button>
- <button label="キャンセル" name="discard_btn"/>
- <button label="全表示" name="more_btn" tool_tip="詳ã—ã„設定"/>
- <button label="簡易" name="less_btn" tool_tip="詳ã—ã„設定"/>
- <text name="type_label2">
- サイズ
- </text>
- <text name="format_label" width="75">
- å½¢å¼
- </text>
- <combo_box label="è§£åƒåº¦" name="postcard_size_combo">
- <combo_box.item label="ç¾åœ¨ã®ï½³ï½¨ï¾ï¾„゙ウ" name="CurrentWindow"/>
- <combo_box.item label="640x480" name="640x480"/>
- <combo_box.item label="800x600" name="800x600"/>
- <combo_box.item label="1024x768" name="1024x768"/>
- <combo_box.item label="カスタム" name="Custom"/>
- </combo_box>
- <combo_box label="è§£åƒåº¦" name="texture_size_combo">
- <combo_box.item label="ç¾åœ¨ã®ï½³ï½¨ï¾ï¾„゙ウ" name="CurrentWindow"/>
- <combo_box.item label="å°ï¼ˆ128x128)" name="Small(128x128)"/>
- <combo_box.item label="中(256x256)" name="Medium(256x256)"/>
- <combo_box.item label="大(512x512)" name="Large(512x512)"/>
- <combo_box.item label="カスタム" name="Custom"/>
- </combo_box>
- <combo_box label="è§£åƒåº¦" name="local_size_combo">
- <combo_box.item label="ç¾åœ¨ã®ï½³ï½¨ï¾ï¾„゙ウ" name="CurrentWindow"/>
- <combo_box.item label="320x240" name="320x240"/>
- <combo_box.item label="640x480" name="640x480"/>
- <combo_box.item label="800x600" name="800x600"/>
- <combo_box.item label="1024x768" name="1024x768"/>
- <combo_box.item label="1280x1024" name="1280x1024"/>
- <combo_box.item label="1600x1200" name="1600x1200"/>
- <combo_box.item label="カスタム" name="Custom"/>
- </combo_box>
- <combo_box label="å½¢å¼" name="local_format_combo">
- <combo_box.item label="PNG" name="PNG"/>
- <combo_box.item label="JPEG" name="JPEG"/>
- <combo_box.item label="BMP" name="BMP"/>
- </combo_box>
- <spinner label="å¹…" label_width="25" name="snapshot_width" width="90"/>
- <spinner label="高ã•" label_width="30" left="115" name="snapshot_height" width="90"/>
- <check_box label="縦横比ã®å›ºå®š" name="keep_aspect_check"/>
- <slider label="画質" name="image_quality_slider"/>
- <text name="layer_type_label">
- キャプï¾ï½¬ï¼š
- </text>
- <combo_box label="ç”»åƒãƒ¬ã‚¤ãƒ¤ãƒ¼" name="layer_types">
- <combo_box.item label="色" name="Colors"/>
- <combo_box.item label="æ·±ã•" name="Depth"/>
- <combo_box.item label="オグジェクトã®ã¤ã‚„消ã—" name="ObjectMattes"/>
- </combo_box>
- <check_box label="インターフェース" name="ui_check"/>
- <check_box label="HUD" name="hud_check"/>
- <check_box label="ä¿å­˜å¾Œã‚‚é–‹ã„ãŸçŠ¶æ…‹ã‚’ä¿æŒ" name="keep_open_check"/>
- <check_box label="ç”»é¢å…¨ä½“ã‚’é™æ­¢" name="freeze_frame_check"/>
- <check_box label="自動更新" name="auto_snapshot_check"/>
- <string name="unknown">
- 未知
- </string>
+ <line_editor label="説明" name="description"/>
+ <panel name="panel_snapshot_main">
+ <button label="共有" name="share"/>
+ <button label="ä¿å­˜" name="save"/>
+ <button label="プロフィールã«è¨­å®š" name="set_profile_pic"/>
+ </panel>
+ <panel name="panel_snapshot_share">
+ <button label="Web ã§å…±æœ‰" name="share_to_web"/>
+ <button label="スナップショットをメール" name="share_to_email"/>
+ <button label="戻る" name="cancel_share"/>
+ </panel>
+ <panel name="panel_snapshot_save">
+ <button label="「æŒã¡ç‰©ã€ã«ä¿å­˜" name="save_to_inventory"/>
+ <button label="コンピューターã«ä¿å­˜" name="save_to_computer"/>
+ <button label="戻る" name="cancel_save"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_sound_preview.xml b/indra/newview/skins/default/xui/ja/floater_sound_preview.xml
index a24ba6e075..7d83309c46 100644
--- a/indra/newview/skins/default/xui/ja/floater_sound_preview.xml
+++ b/indra/newview/skins/default/xui/ja/floater_sound_preview.xml
@@ -9,7 +9,7 @@
<button label="å–り消ã—" label_selected="å–り消ã—" name="cancel_btn"/>
<button label="アップロード (L$[AMOUNT])" label_selected="アップロード (L$[AMOUNT])" name="ok_btn"/>
<text name="text">
- ビットレート(kbps):
+ ビットレート(kbps):
</text>
<radio_group name="bitrate">
<radio_item label="32" name="32"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_sys_well.xml b/indra/newview/skins/default/xui/ja/floater_sys_well.xml
index a7c0a2b391..45e97bdf5d 100644
--- a/indra/newview/skins/default/xui/ja/floater_sys_well.xml
+++ b/indra/newview/skins/default/xui/ja/floater_sys_well.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="notification_chiclet" title="通知">
+<floater name="sys_well_window" title="通知">
<string name="title_im_well_window">
- IMセッション
+ 会話
</string>
<string name="title_notification_well_window">
通知
diff --git a/indra/newview/skins/default/xui/ja/floater_telehub.xml b/indra/newview/skins/default/xui/ja/floater_telehub.xml
index bdb92c8e30..7318083771 100644
--- a/indra/newview/skins/default/xui/ja/floater_telehub.xml
+++ b/indra/newview/skins/default/xui/ja/floater_telehub.xml
@@ -10,7 +10,7 @@
「切断ã€ã‚’クリックã—ã¦å‰Šé™¤ã—ã¾ã™ã€‚
</text>
<text name="help_text_not_connected">
- ç‰©ä½“ã‚’é¸æŠžã—「テレãƒãƒ–ã®æŽ¥ç¶šã€ã‚’クリックã™ã‚‹
+ ç‰©ä½“ã‚’é¸æŠžã—ã¦ã€Œãƒ†ãƒ¬ãƒãƒ–ã®æŽ¥ç¶šã€ã‚’クリックã—ã¦ãã ã•ã„。
</text>
<button label="テレãƒãƒ–ã®æŽ¥ç¶š" name="connect_btn"/>
<button label="切断" name="disconnect_btn"/>
@@ -20,9 +20,6 @@
<button label="出ç¾ä½ç½®ã‚’追加" name="add_spawn_point_btn"/>
<button label="出ç¾åœ°ç‚¹ã‚’削除" name="remove_spawn_point_btn"/>
<text name="spawn_point_help">
- オブジェクトをé¸ã³ã€ã€Œå‡ºç¾åœ°ç‚¹ã‚’追加ã€ã‚’クリックã—ã¦ä½ç½®ã‚’指定ã—ã¾ã™ã€‚
-ãã†ã™ã‚‹ã¨ãã®ã‚ªãƒ–ジェクトを移動ã•ã›ãŸã‚Šå‰Šé™¤ã§ãã¾ã™ã€‚
-ä½ç½®ã¯ãƒ†ãƒ¬ãƒãƒ–センターã«é–¢é€£ã—ã¾ã™ã€‚
-リストã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ã¦ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ã§ãƒã‚¤ãƒ©ã‚¤ãƒˆã•ã›ã¾ã™ã€‚
+ オブジェクトをé¸ã³ã€ã€Œå‡ºç¾åœ°ç‚¹ã‚’追加ã€ã‚’クリックã—ã¦ä½ç½®ã‚’指定ã—ã¾ã™ã€‚ãã†ã™ã‚‹ã¨ãã®ã‚ªãƒ–ジェクトを移動ã•ã›ãŸã‚Šå‰Šé™¤ã§ãã¾ã™ã€‚ä½ç½®ã¯ãƒ†ãƒ¬ãƒãƒ–センターã«é–¢é€£ã—ã¾ã™ã€‚リストã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ã¦ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ã§ãƒã‚¤ãƒ©ã‚¤ãƒˆã•ã›ã¾ã™ã€‚
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml
index 1500808e60..399cffcce5 100644
--- a/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/ja/floater_texture_ctrl.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="texture picker" title="é¸æŠžï¼š テクスãƒãƒ£">
+<floater name="texture picker" title="テクスãƒãƒ£ã®é¸æŠž">
<string name="choose_picture">
クリックã—ã¦å†™çœŸã‚’é¸æŠž
</string>
@@ -9,12 +9,12 @@
<text name="unknown">
サイズ: [DIMENSIONS]
</text>
- <button label="デフォルト" label_selected="デフォルト" name="Default"/>
+ <button label="デフォルト" label_selected="デフォルト" name="Default"/>
<button label="ãªã—" label_selected="ãªã—" name="None"/>
<button label="ブランク" label_selected="ブランク" name="Blank"/>
<check_box label="フォルダを表示" name="show_folders_check"/>
<search_editor label="テクスãƒãƒ£ã‚’フィルター" name="inventory search editor"/>
- <check_box label="今ã™ãé©ç”¨" name="apply_immediate_check"/>
+ <check_box label="ã™ãé©ç”¨" name="apply_immediate_check"/>
<button label="" label_selected="" name="Pipette"/>
<button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel"/>
<button label="OK" label_selected="OK" name="Select"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_tools.xml b/indra/newview/skins/default/xui/ja/floater_tools.xml
index 52d3537d9a..d095dee974 100644
--- a/indra/newview/skins/default/xui/ja/floater_tools.xml
+++ b/indra/newview/skins/default/xui/ja/floater_tools.xml
@@ -4,19 +4,19 @@
色ã®ä»˜ã„ãŸãƒãƒ³ãƒ‰ã‚’ドラッグã—ã¦ã‚ªãƒ–ジェクトを回転
</floater.string>
<floater.string name="status_scale">
- é¸æŠžã—ãŸå´ã‚’クリックã—ã€ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦å¼•ã伸ã°ã™
+ é¸æŠžã—ãŸå´ã‚’クリックã—ã€ãƒ‰ãƒ©ãƒƒã‚°ã§å¼•ã伸ã°ã™
</floater.string>
<floater.string name="status_move">
- 移動:ドラッグã€ã‚³ãƒ”ー:Shiftを押ã—ãªãŒã‚‰ï¾„゙ラッグ
+ 移動:ドラッグã€ã‚³ãƒ”ー:Shift + ドラッグ
</floater.string>
<floater.string name="status_modifyland">
土地をクリックã—ã€ãƒœã‚¿ãƒ³ã‚’押ã—ãŸã¾ã¾å…¥åŠ›ã—ã¦ä¿®æ­£å¤‰æ›´
</floater.string>
<floater.string name="status_camera">
- クリック・ドラッグã§è¦–界移動
+ クリック + ドラッグã§è¦–界移動
</floater.string>
<floater.string name="status_grab">
- ドラッグã§ç§»å‹•ã€Ctrlã§æŒã¡ä¸Šã’ã€Ctrl+Shiftã§å›žè»¢
+ ドラッグã§ç§»å‹•ã€Ctrlã§æŒã¡ä¸Šã’ã€Ctrl + Shiftã§å›žè»¢
</floater.string>
<floater.string name="status_place">
インワールドã§ã‚¯ãƒªãƒƒã‚¯ã—ã¦ä½œæˆ
@@ -31,10 +31,10 @@
ローカル
</floater.string>
<floater.string name="grid_world_text">
- 世界
+ インワールド
</floater.string>
<floater.string name="grid_reference_text">
- å‚ç…§
+ レファレンス
</floater.string>
<floater.string name="grid_attachment_text">
アタッãƒãƒ¡ãƒ³ãƒˆ
@@ -49,13 +49,13 @@
</text>
<radio_group name="focus_radio_group">
<radio_item label="ズーム" name="radio zoom"/>
- <radio_item label="軌跡(Ctrl)" name="radio orbit"/>
- <radio_item label="水平・垂直移動 (Ctrl+Shift)" name="radio pan"/>
+ <radio_item label="旋回(Ctrl)" name="radio orbit"/>
+ <radio_item label="水平・垂直移動 (Ctrl + Shift)" name="radio pan"/>
</radio_group>
<radio_group name="move_radio_group">
<radio_item label="移動" name="radio move"/>
<radio_item label="æŒã¡ä¸Šã’る(Ctrl)" name="radio lift"/>
- <radio_item label="回転 (Ctrl+Shift)" name="radio spin"/>
+ <radio_item label="回転 (Ctrl + Shift)" name="radio spin"/>
</radio_group>
<radio_group name="edit_radio_group">
<radio_item label="移動" name="radio position"/>
@@ -67,15 +67,18 @@
<text name="RenderingCost" tool_tip="ã“ã®ã‚ªãƒ–ジェクトã«ã‹ã‹ã‚‹ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã‚³ã‚¹ãƒˆã‚’表示">
þ: [COUNT]
</text>
- <check_box label="両å´ã‚’引伸ã°ã™" left="116" name="checkbox uniform"/>
- <check_box initial_value="true" label="テクスãƒãƒ£ãƒ¼ã‚’引伸ã°ã™" name="checkbox stretch textures"/>
- <check_box initial_value="true" label="グリッドãƒã‚¤ãƒ³ãƒˆã«ã‚¹ãƒŠãƒƒãƒ—" left_delta="27" name="checkbox snap to grid"/>
- <combo_box left_delta="60" name="combobox grid mode" tool_tip="オブジェクトã®é…ç½®ã«ä½¿ã†ã‚°ãƒªãƒƒãƒ‰ãƒ«ãƒ¼ãƒ©ã‚’é¸æŠž" width="76">
- <combo_box.item label="ワールドグリッド" name="World"/>
+ <check_box label="" left="116" name="checkbox uniform"/>
+ <text label="両å´ã‚’å»¶ã°ã™" name="checkbox uniform label">
+ 両å´ã‚’å»¶ã°ã™
+ </text>
+ <check_box initial_value="true" label="テクスãƒãƒ£ã‚’引ãå»¶ã°ã™" name="checkbox stretch textures"/>
+ <check_box initial_value="true" label="グリッドã«ã‚¹ãƒŠãƒƒãƒ—" left_delta="27" name="checkbox snap to grid"/>
+ <combo_box left_delta="60" name="combobox grid mode" tool_tip="オブジェクトã®é…ç½®ã«ä½¿ã†ã‚°ãƒªãƒƒãƒ‰ãƒ«ãƒ¼ãƒ©ã‚’é¸æŠžã—ã¾ã™" width="76">
+ <combo_box.item label="インワールドグリッド" name="World"/>
<combo_box.item label="ローカルグリッド" name="Local"/>
<combo_box.item label="リファレンスグリッド" name="Reference"/>
</combo_box>
- <button label="オプション" label_selected="オプション" name="Options..." tool_tip="グリッドオプションをもã£ã¨è¦‹ã‚‹"/>
+ <button label="オプション" label_selected="オプション" name="Options..." tool_tip="グリッドオプションを表示ã—ã¾ã™"/>
<button label="" label_selected="" name="ToolCube" tool_tip="キューブ"/>
<button label="" label_selected="" name="ToolPrism" tool_tip="プリズム"/>
<button label="" label_selected="" name="ToolPyramid" tool_tip="ピラミッド"/>
@@ -84,7 +87,7 @@
<button label="" label_selected="" name="ToolHemiCylinder" tool_tip="åŠå††æŸ±"/>
<button label="" label_selected="" name="ToolCone" tool_tip="円éŒ"/>
<button label="" label_selected="" name="ToolHemiCone" tool_tip="åŠå††éŒ"/>
- <button label="" label_selected="" name="ToolSphere" tool_tip="çƒå½¢"/>
+ <button label="" label_selected="" name="ToolSphere" tool_tip="çƒä½“"/>
<button label="" label_selected="" name="ToolHemiSphere" tool_tip="åŠçƒ"/>
<button label="" label_selected="" name="ToolTorus" tool_tip="トーラス"/>
<button label="" label_selected="" name="ToolTube" tool_tip="ãƒãƒ¥ãƒ¼ãƒ–"/>
@@ -113,7 +116,7 @@
<text name="Strength:">
強度
</text>
- <button label="é©ç”¨" label_selected="é©ç”¨" name="button apply to selection" tool_tip="é¸æŠžã—ãŸåœŸåœ°ã‚’修正"/>
+ <button label="é©ç”¨" label_selected="é©ç”¨" name="button apply to selection" tool_tip="é¸æŠžã—ãŸåœŸåœ°ã‚’修正ã—ã¾ã™"/>
<text name="obj_count">
オブジェクト: [COUNT]
</text>
@@ -150,7 +153,7 @@
åˆè¨ˆï¼š L$
</panel.string>
<panel.string name="Cost Per Unit">
- Price Per: L$
+ å˜ä¾¡ï¼š L$
</panel.string>
<panel.string name="Cost Mixed">
æ··åˆä¾¡æ ¼
@@ -165,13 +168,13 @@
説明:
</text>
<text name="Creator:">
- クリエーター
+ 制作者:
</text>
<text name="Creator Name">
Esbee Linden
</text>
<text name="Owner:">
- オーナー:
+ 所有者:
</text>
<text name="Owner Name">
Erica Linden
@@ -179,29 +182,29 @@
<text name="Group:">
グループ:
</text>
- <button label="設定..." label_selected="設定..." name="button set group" tool_tip="ã“ã®ã‚ªãƒ–ジェクト権é™ã‚’共有ã™ã‚‹ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠž"/>
+ <button label="設定..." label_selected="設定..." name="button set group" tool_tip="ã“ã®ã‚ªãƒ–ジェクト権é™ã‚’共有ã™ã‚‹ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã—ã¾ã™"/>
<name_box initial_value="ローディング..." name="Group Name Proxy"/>
- <button label="譲渡" label_selected="譲渡" name="button deed" tool_tip="ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’譲渡ã™ã‚‹ã¨ã€Œæ¬¡ã®æ‰€æœ‰è€…ã€ã®æ¨©é™ãŒé©ç”¨ã•れã¾ã™ã€‚ グループ共有オブジェクトã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚ªãƒ•ィサーãŒè­²æ¸¡ã§ãã¾ã™ã€‚"/>
- <check_box label="共有" name="checkbox share with group" tool_tip="設定ã—ãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ¡ãƒ³ãƒãƒ¼å…¨å“¡ã«ã“ã®ã‚ªãƒ–ジェクトã®ä¿®æ­£æ¨©é™ã‚’与ãˆã¾ã™ã€‚ 譲渡ã—ãªã„é™ã‚Šã€å½¹å‰²åˆ¶é™ã‚’有効ã«ã¯ã§ãã¾ã›ã‚“。"/>
+ <button label="譲渡" label_selected="譲渡" name="button deed" tool_tip="ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’譲渡ã™ã‚‹ã¨ã€Œæ¬¡ã®æ‰€æœ‰è€…ã€ã®æ¨©é™ãŒé©ç”¨ã•れã¾ã™ã€‚ グループ共有オブジェクトã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚ªãƒ•ィサーãŒè­²æ¸¡ã§ãã¾ã™"/>
+ <check_box label="共有" name="checkbox share with group" tool_tip="設定ã—ãŸã‚°ãƒ«ãƒ¼ãƒ—ã®ãƒ¡ãƒ³ãƒãƒ¼å…¨å“¡ã«ã“ã®ã‚ªãƒ–ジェクトã®ä¿®æ­£æ¨©é™ã‚’与ãˆã¾ã™ã€‚ 譲渡ã—ãªã„é™ã‚Šã€å½¹å‰²åˆ¶é™ã‚’有効ã«ã¯ã§ãã¾ã›ã‚“"/>
<text name="label click action">
クリックã§ï¼š
</text>
<combo_box name="clickaction">
<combo_box.item label="触る(デフォルト)" name="Touch/grab(default)"/>
<combo_box.item label="オブジェクトã«åº§ã‚‹" name="Sitonobject"/>
- <combo_box.item label="オブジェクトを購入" name="Buyobject"/>
- <combo_box.item label="オブジェクトã¸ã®æ”¯æ‰•ã„" name="Payobject"/>
+ <combo_box.item label="オブジェクトを購入ã™ã‚‹" name="Buyobject"/>
+ <combo_box.item label="ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ”¯æ‰•ã†" name="Payobject"/>
<combo_box.item label="é–‹ã" name="Open"/>
- <combo_box.item label="ズーム" name="Zoom"/>
+ <combo_box.item label="ズームã™ã‚‹" name="Zoom"/>
</combo_box>
<check_box label="販売対象:" name="checkbox for sale"/>
<combo_box name="sale type">
<combo_box.item label="コピー" name="Copy"/>
- <combo_box.item label="コンテンツ" name="Contents"/>
+ <combo_box.item label="中身" name="Contents"/>
<combo_box.item label="オリジナル" name="Original"/>
</combo_box>
<spinner label="価格: L$" name="Edit Cost"/>
- <check_box label="検索ã«è¡¨ç¤º" name="search_check" tool_tip="æ¤œç´¢çµæžœã§ã€ã“ã®ã‚ªãƒ–ジェクトを人ã«è¦‹ã›ã‚‹"/>
+ <check_box label="検索ã«è¡¨ç¤º" name="search_check" tool_tip="æ¤œç´¢çµæžœã«ã“ã®ã‚ªãƒ–ジェクトを表示ã—ã¾ã™"/>
<panel name="perms_build">
<text name="perm_modify">
ã‚ãªãŸã¯ã“ã®ã‚ªãƒ–ジェクトを修正ã§ãã¾ã™
@@ -216,7 +219,7 @@
</text>
<check_box label="修正" name="checkbox next owner can modify"/>
<check_box label="コピー" name="checkbox next owner can copy"/>
- <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="checkbox next owner can transfer" tool_tip="æ¬¡ã®æ‰€æœ‰è€…ã¯ã“ã®ã‚ªãƒ–ジェクトを他人ã«ã‚ã’ãŸã‚Šå†è²©ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™"/>
+ <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="checkbox next owner can transfer" tool_tip="æ¬¡ã«æ‰€æœ‰ã™ã‚‹äººã¯ã€ã“ã®ã‚ªãƒ–ジェクトを他人ã«ã‚ã’ãŸã‚Šå†è²©ã§ãã¾ã™"/>
<text name="B:">
B:
</text>
@@ -238,10 +241,10 @@
</panel>
</panel>
<panel label="形状" name="Object">
- <check_box label="ロック済ã¿" name="checkbox locked" tool_tip="オブジェクトã®ç§»å‹•ã¨å‰Šé™¤ã‚’ç¦æ­¢ã—ã¾ã™ã€‚ ã“ã®æ©Ÿèƒ½ã‚’使ã†ã¨ã€æ§‹ç¯‰ä¸­ã«æ„図ã—ãªã„編集を防ãã“ã¨ãŒã§ãã¾ã™ã€‚"/>
- <check_box label="物ç†" name="Physical Checkbox Ctrl" tool_tip="オブジェクトã«å¯¾ã™ã‚‹é‡åŠ›ã®ä½œç”¨ã¨å½±éŸ¿ã‚’有効ã«ã™ã‚‹"/>
+ <check_box label="ロック" name="checkbox locked" tool_tip="オブジェクトã®ç§»å‹•ã¨å‰Šé™¤ã‚’ç¦æ­¢ã—ã¾ã™ã€‚ ã“ã®æ©Ÿèƒ½ã‚’使ã†ã¨ã€åˆ¶ä½œä¸­ã®æ„図ã›ã¬ç·¨é›†ã‚’防ãã“ã¨ãŒã§ãã¾ã™"/>
+ <check_box label="物ç†" name="Physical Checkbox Ctrl" tool_tip="オブジェクトã«å¯¾ã™ã‚‹é‡åŠ›ã®ä½œç”¨ã¨å½±éŸ¿ã‚’有効ã«ã—ã¾ã™"/>
<check_box label="臨時" name="Temporary Checkbox Ctrl" tool_tip="制作後 1 分ã§ã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™"/>
- <check_box label="ファントム" name="Phantom Checkbox Ctrl" tool_tip="オブジェクトåŒå£«ã®è¡çªã¾ãŸã¯ã‚ªãƒ–ジェクトã¨ã‚¢ãƒã‚¿ãƒ¼ã®è¡çªã‚’回é¿"/>
+ <check_box label="ファントム" name="Phantom Checkbox Ctrl" tool_tip="オブジェクトåŒå£«ã®è¡çªã¾ãŸã¯ã‚ªãƒ–ジェクトã¨ã‚¢ãƒã‚¿ãƒ¼ã®è¡çªã‚’回é¿ã—ã¾ã™"/>
<text name="label position">
ä½ç½®ï¼ˆãƒ¡ãƒ¼ãƒˆãƒ«ï¼‰
</text>
@@ -264,7 +267,7 @@
<combo_box.item label="ボックス" name="Box"/>
<combo_box.item label="シリンダー" name="Cylinder"/>
<combo_box.item label="プリズム" name="Prism"/>
- <combo_box.item label="çƒå½¢" name="Sphere"/>
+ <combo_box.item label="çƒä½“" name="Sphere"/>
<combo_box.item label="トーラス" name="Torus"/>
<combo_box.item label="ãƒãƒ¥ãƒ¼ãƒ–" name="Tube"/>
<combo_box.item label="リング" name="Ring"/>
@@ -280,7 +283,7 @@
<combo_box.item label="ゴム" name="Rubber"/>
</combo_box>
<text name="text cut">
- パスカット (始点/終点)
+ パスカット(始点ã¨çµ‚点)
</text>
<spinner label="B" name="cut begin"/>
<spinner label="E" name="cut end"/>
@@ -300,7 +303,7 @@
<combo_box.item label="三角形" name="Triangle"/>
</combo_box>
<text name="text twist">
- ã²ã­ã‚Š (始点/終点)
+ ã²ã­ã‚Šï¼ˆå§‹ç‚¹ã¨çµ‚点)
</text>
<spinner label="B" name="Twist Begin"/>
<spinner label="E" name="Twist End"/>
@@ -318,13 +321,13 @@
<spinner label="X" name="Shear X"/>
<spinner label="Y" name="Shear Y"/>
<text name="advanced_cut">
- プロフィールカット (始点/終点)
+ プロフィールカット(始点ã¨çµ‚点)
</text>
<text name="advanced_dimple">
- ãã¼ã¿ (始点/終点)
+ ãã¼ã¿ï¼ˆå§‹ç‚¹ã¨çµ‚点)
</text>
<text name="advanced_slice">
- 切りå–り (始点/終点)
+ 切りå–り(始点ã¨çµ‚点)
</text>
<spinner label="B" name="Path Limit Begin"/>
<spinner label="E" name="Path Limit End"/>
@@ -339,15 +342,15 @@
<text name="text revolutions">
回転体
</text>
- <texture_picker label="スカルプトテクスãƒãƒ£ãƒ¼" name="sculpt texture control" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¦ãã ã•ã„。"/>
- <check_box label="ミラー" name="sculpt mirror control" tool_tip="スカルプトプリムを X 軸上ã§å転ã•ã›ã‚‹"/>
- <check_box label="è£è¿”ã—" name="sculpt invert control" tool_tip="スカルプトプリムをå転ã•ã›ã¦è£è¿”ã™"/>
+ <texture_picker label="スカルプトテクスãƒãƒ£" name="sculpt texture control" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¦ãã ã•ã„"/>
+ <check_box label="ミラー" name="sculpt mirror control" tool_tip="スカルプトプリムを X 軸上ã§å転ã•ã›ã¾ã™"/>
+ <check_box label="è£è¿”ã—" name="sculpt invert control" tool_tip="スカルプトプリムをå転ã•ã›ã¦è£è¿”ã—ã¾ã™"/>
<text name="label sculpt type">
縫ã„ç›®ã®ã‚¿ã‚¤ãƒ—
</text>
<combo_box name="sculpt type control">
<combo_box.item label="(ãªã—)" name="None"/>
- <combo_box.item label="çƒå½¢" name="Sphere"/>
+ <combo_box.item label="çƒä½“" name="Sphere"/>
<combo_box.item label="トーラス" name="Torus"/>
<combo_box.item label="å¹³é¢" name="Plane"/>
<combo_box.item label="シリンダー" name="Cylinder"/>
@@ -355,23 +358,23 @@
</panel>
<panel label="特徴" name="Features">
<text name="select_single">
- プリムを1ã¤ã ã‘é¸æŠžã—ã¦ç·¨é›†ã—ã¦ãã ã•ã„
+ プリムを 1 ã¤ã ã‘é¸æŠžã—ã¦ç·¨é›†ã—ã¦ãã ã•ã„
</text>
<text name="edit_object">
オブジェクトã®ç‰¹å¾´ã‚’編集:
</text>
- <check_box label="フレキシブル・パス" name="Flexible1D Checkbox Ctrl" tool_tip="Z 軸を中心ã«ã‚ªãƒ–ジェクトã®å±ˆæ›²ã‚’有効ã«ã™ã‚‹ï¼ˆã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã®ã¿ï¼‰"/>
+ <check_box label="フレキシブルパス" name="Flexible1D Checkbox Ctrl" tool_tip="Z 軸を中心ã«ã‚ªãƒ–ジェクトã®å±ˆæ›²ã‚’有効ã«ã—ã¾ã™ï¼ˆã‚¯ãƒ©ã‚¤ã‚¢ãƒ³ãƒˆå´ã®ã¿ï¼‰"/>
<spinner label="柔軟性" label_width="72" name="FlexNumSections" width="135"/>
<spinner label="é‡åŠ›" label_width="72" name="FlexGravity" width="135"/>
<spinner label="ドラッグ" label_width="72" name="FlexFriction" width="135"/>
<spinner label="風" label_width="72" name="FlexWind" width="135"/>
<spinner label="ç·Šå¼µ" label_width="72" name="FlexTension" width="135"/>
- <spinner label="X軸方å‘ã®åŠ›" label_width="72" name="FlexForceX" width="135"/>
- <spinner label="Y軸方å‘ã®åŠ›" label_width="72" name="FlexForceY" width="135"/>
- <spinner label="Z軸方å‘ã®åŠ›" label_width="72" name="FlexForceZ" width="135"/>
- <check_box label="å…‰" name="Light Checkbox Ctrl" tool_tip="オブジェクトãŒç™ºå…‰"/>
+ <spinner label="X 軸方å‘ã®åŠ›" label_width="72" name="FlexForceX" width="135"/>
+ <spinner label="Y 軸方å‘ã®åŠ›" label_width="72" name="FlexForceY" width="135"/>
+ <spinner label="Z 軸方å‘ã®åŠ›" label_width="72" name="FlexForceZ" width="135"/>
+ <check_box label="å…‰" name="Light Checkbox Ctrl" tool_tip="オブジェクトãŒç™ºå…‰ã—ã¾ã™"/>
<color_swatch label="" left_delta="74" name="colorswatch" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
- <texture_picker label="" name="light texture control" tool_tip="ã‚¯ãƒªãƒƒã‚¯ã§æŠ•å½±ç”»ã‚’é¸æŠžï¼ˆé…延レンダリング有効時ã®ã¿ï¼‰"/>
+ <texture_picker label="" name="light texture control" tool_tip="ã‚¯ãƒªãƒƒã‚¯ã§æŠ•å½±ç”»ã‚’é¸æŠžã—ã¾ã™ï¼ˆé…延レンダリング有効時ã®ã¿ï¼‰"/>
<spinner label="è¼åº¦" label_width="72" name="Light Intensity" width="135"/>
<spinner label="FOV" name="Light FOV"/>
<spinner label="åŠå¾„" label_width="72" name="Light Radius" width="135"/>
@@ -381,12 +384,12 @@
</panel>
<panel label="æè³ª" name="Texture">
<panel.string name="string repeats per meter">
- メートルã”ã¨ã«ç¹°è¿”ã™
+ メートルã”ã¨ã«ç¹°ã‚Šè¿”ã™
</panel.string>
<panel.string name="string repeats per face">
é¢ã”ã¨ã«ç¹°ã‚Šè¿”ã™
</panel.string>
- <texture_picker label="テクスãƒãƒ£ãƒ¼" name="texture control" tool_tip="写真をクリックã—ã¦é¸æŠž"/>
+ <texture_picker label="テクスãƒãƒ£" name="texture control" tool_tip="写真をクリックã—ã¦é¸æŠžã—ã¾ã™"/>
<color_swatch label="色" name="colorswatch" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
<text name="color trans">
é€éŽåº¦ %
@@ -453,10 +456,10 @@
<text name="media_tex">
メディア
</text>
- <button name="add_media" tool_tip="メディアを追加"/>
- <button name="delete_media" tool_tip="ã“ã®ãƒ¡ãƒ‡ã‚£ã‚¢ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’削除"/>
- <button name="edit_media" tool_tip="ã“ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’編集"/>
- <button label="æƒãˆã‚‹" label_selected="ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’ä¸€åˆ—ã«æƒãˆã‚‹" name="button align" tool_tip="メディアテクスãƒãƒ£ã‚’ä¸€åˆ—ã«æƒãˆã‚‹ï¼ˆæœ€åˆã«èª­ã¿è¾¼ã‚€å¿…è¦ãŒã‚りã¾ã™ï¼‰"/>
+ <button name="add_media" tool_tip="メディアを追加ã—ã¾ã™"/>
+ <button name="delete_media" tool_tip="ã“ã®ãƒ¡ãƒ‡ã‚£ã‚¢ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’削除ã—ã¾ã™"/>
+ <button name="edit_media" tool_tip="ã“ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’編集ã—ã¾ã™"/>
+ <button label="æƒãˆã‚‹" label_selected="ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’ä¸€åˆ—ã«æƒãˆã¾ã™" name="button align" tool_tip="メディアテクスãƒãƒ£ã‚’ä¸€åˆ—ã«æƒãˆã¾ã™ï¼ˆæœ€åˆã«èª­ã¿è¾¼ã‚€å¿…è¦ãŒã‚りã¾ã™ï¼‰"/>
</panel>
</panel>
<panel label="中身" name="Contents">
@@ -475,7 +478,7 @@
é¢ç©ï¼š [AREA] 平方メートル
</text>
<button label="土地情報" label_selected="土地情報" name="button about land"/>
- <check_box label="オーナーを表示" name="checkbox show owners" tool_tip="所有者ã®ç¨®é¡žåˆ¥ã«åŒºç”»ã‚’色ã¥ã‘: ç·‘ = ã‚ãªãŸã®åœŸåœ° アクア = ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—所有地 赤 = ä»–äººãŒæ‰€æœ‰ã™ã‚‹åœŸåœ° 黄色 = 売り出ã—中 ç´« = オークション グレー = パブリック"/>
+ <check_box label="所有者を表示" name="checkbox show owners" tool_tip="所有者ã®ç¨®é¡žåˆ¥ã«åŒºç”»ã‚’色ã¥ã‘ã¾ã™ï¼š ç·‘ = ã‚ãªãŸã®åœŸåœ° アクア = ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—所有地 赤 = ä»–äººãŒæ‰€æœ‰ã™ã‚‹åœŸåœ° 黄色 = 売り出ã—中 ç´« = オークション グレー = パブリック"/>
<text name="label_parcel_modify">
区画ã®ç·¨é›†
</text>
diff --git a/indra/newview/skins/default/xui/ja/floater_tos.xml b/indra/newview/skins/default/xui/ja/floater_tos.xml
index 85ac102885..ae064724c0 100644
--- a/indra/newview/skins/default/xui/ja/floater_tos.xml
+++ b/indra/newview/skins/default/xui/ja/floater_tos.xml
@@ -1,22 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="modal container" title=" ">
+ <floater.string name="real_url">
+ http://secondlife.com/app/tos/
+ </floater.string>
+ <floater.string name="loading_url">
+ data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Loading %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+ </floater.string>
<button label="続行" label_selected="続行" name="Continue"/>
<button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel"/>
- <radio_group name="tos_agreement">
- <radio_item label="利用è¦ç´„ã«åŒæ„ã—ã¾ã›ã‚“" name="radio_disagree"/>
- <radio_item label="利用è¦ç´„ã«åŒæ„ã—ã¾ã™" name="radio_agree"/>
- </radio_group>
- <text name="tos_title">
- 利用è¦ç´„
- </text>
- <check_box label="利用è¦ç´„ã«åŒæ„ã—ã¾ã™" name="agree_chk"/>
+ <check_box label="利用è¦ç´„ã¨ãƒ—ライãƒã‚·ãƒ¼ãƒãƒªã‚·ãƒ¼ã«åŒæ„ã—ã¾ã™" name="agree_chk"/>
<text name="tos_heading">
- 次ã®åˆ©ç”¨è¦ç´„をよããŠèª­ã¿ãã ã•ã„。 [SECOND_LIFE] ã¸ã®ãƒ­ã‚°ã‚¤ãƒ³ã‚’ç¶šã‘ã‚‹ã«ã¯ã€è¦ç´„ã«åŒæ„ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
- </text>
- <text_editor name="tos_text">
- TOS_TEXT
- </text_editor>
- <text name="real_url">
- http://secondlife.com/app/tos/
+ 次ã®åˆ©ç”¨è¦ç´„ã¨ãƒ—ライãƒã‚·ãƒ¼ãƒãƒªã‚·ãƒ¼ã‚’よããŠèª­ã¿ãã ã•ã„。 [SECOND_LIFE] ã¸ã®ãƒ­ã‚°ã‚¤ãƒ³ã‚’ç¶šã‘ã‚‹ã«ã¯ã€è¦ç´„ã«åŒæ„ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_url_entry.xml b/indra/newview/skins/default/xui/ja/floater_url_entry.xml
index 9d3ca20c7c..8e09e4748a 100644
--- a/indra/newview/skins/default/xui/ja/floater_url_entry.xml
+++ b/indra/newview/skins/default/xui/ja/floater_url_entry.xml
@@ -3,11 +3,11 @@
<text name="media_label">
メディア URL:
</text>
- <combo_box left="100" name="media_entry" width="360" />
- <button label="OK" name="ok_btn" width="78"/>
+ <combo_box name="media_entry"/>
+ <button label="OK" name="ok_btn" width="38"/>
<button label="キャンセル" name="cancel_btn" width="80"/>
- <button label="クリア" name="clear_btn" />
- <text name="loading_label">
+ <button label="クリア" name="clear_btn" left_pad="76"/>
+ <text name="loading_label" left="140">
ロード中...
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_voice_controls.xml b/indra/newview/skins/default/xui/ja/floater_voice_controls.xml
index 5a0694e5c5..4b95aa544f 100644
--- a/indra/newview/skins/default/xui/ja/floater_voice_controls.xml
+++ b/indra/newview/skins/default/xui/ja/floater_voice_controls.xml
@@ -16,8 +16,13 @@
è¿‘ãã«ãƒœã‚¤ã‚¹ã‚’有効ã«ã—ã¦ã„る人ã¯ã„ã¾ã›ã‚“。
</string>
<layout_stack name="my_call_stack">
- <layout_panel name="leave_call_btn_panel">
- <button label="コール終了" name="leave_call_btn"/>
+ <layout_panel name="my_panel">
+ <text name="user_text" value="マイ ã‚¢ãƒã‚¿ãƒ¼ï¼š"/>
</layout_panel>
+ <layout_stack name="voice_effect_and_leave_call_stack">
+ <layout_panel name="leave_call_btn_panel">
+ <button label="コール終了" name="leave_call_btn"/>
+ </layout_panel>
+ </layout_stack>
</layout_stack>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_voice_effect.xml b/indra/newview/skins/default/xui/ja/floater_voice_effect.xml
new file mode 100644
index 0000000000..dd7294718c
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/floater_voice_effect.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="場所" name="voice_effects" title="ボイスモーフィングã®ãƒ—レビュー">
+ <string name="no_voice_effect">
+ (ボイスモーフィングãªã—)
+ </string>
+ <string name="active_voice_effect">
+ (アクティブ)
+ </string>
+ <string name="unsubscribed_voice_effect">
+ ï¼ˆå–æ¶ˆã—済ã¿ï¼‰
+ </string>
+ <string name="new_voice_effect">
+ (新登場ï¼ï¼‰
+ </string>
+ <text name="status_text">
+ ボイスモーフィングをプレビューã—ã¦ã‚¨ãƒ•ェクトを確ã‹ã‚ã‚‹ã«ã¯ã€éŒ²éŸ³ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ã”自分ã®å£°ã‚’å°‘ã—録音ã—ã¦ã‹ã‚‰ã€ãƒªã‚¹ãƒˆã«ã‚るボイスモーフィングを1ã¤ã‚¯ãƒªãƒƒã‚¯ã—ã¾ã™ã€‚
+
+ã“ã®ã‚¦ã‚¤ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã‚‹ã¨ã€ã€Œè¿‘ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã€ã«å†æŽ¥ç¶šã•れã¾ã™ã€‚
+ </text>
+ <button label="声を録音" name="record_btn" tool_tip="ã‚ãªãŸã®å£°ã‚’録音ã—ã¾ã™ã€‚"/>
+ <button label="åœæ­¢" name="record_stop_btn"/>
+ <text name="voice_morphing_link">
+ [[URL]ボイスモーフィングをå–å¾—]
+ </text>
+ <scroll_list name="voice_effect_list" tool_tip="声を録音ã—ã¦ãƒœã‚¤ã‚¹ãƒ¢ãƒ¼ãƒ•ィングを1ã¤ã‚¯ãƒªãƒƒã‚¯ã™ã‚‹ã¨ã€ãã®ã‚¨ãƒ•ェクトをプレビューã§ãã¾ã™ã€‚">
+ <scroll_list.columns label="ボイスモーフィング" name="name"/>
+ <scroll_list.columns label="有効期é™" name="expires"/>
+ </scroll_list>
+</floater>
diff --git a/indra/newview/skins/default/xui/ja/floater_water.xml b/indra/newview/skins/default/xui/ja/floater_water.xml
index 52cd91a08a..fb64332e79 100644
--- a/indra/newview/skins/default/xui/ja/floater_water.xml
+++ b/indra/newview/skins/default/xui/ja/floater_water.xml
@@ -28,10 +28,10 @@
<slider label="2" name="WaterNormalScaleY"/>
<slider label="3" name="WaterNormalScaleZ"/>
<text name="HDText">
- フレãƒãƒ«ãƒ»ã‚¹ã‚±ãƒ¼ãƒ«
+ フレãƒãƒ«ã®ã‚¹ã‚±ãƒ¼ãƒ«
</text>
<text name="FresnelOffsetText">
- フレãƒãƒ«ãƒ»ã‚ªãƒ•セット
+ フレãƒãƒ«ã®ã‚ªãƒ•セット
</text>
<text name="DensMultText">
æ°´é¢ã®å±ˆæŠ˜ã‚¹ã‚±ãƒ¼ãƒ«
@@ -63,7 +63,7 @@
Y
</text>
<text name="BHText3">
- ノーマル・マップ
+ ノーマルマップ
</text>
</panel>
</tab_container>
diff --git a/indra/newview/skins/default/xui/ja/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/ja/floater_wearable_save_as.xml
index fc9ddf5096..de8b590a80 100644
--- a/indra/newview/skins/default/xui/ja/floater_wearable_save_as.xml
+++ b/indra/newview/skins/default/xui/ja/floater_wearable_save_as.xml
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="modal container" title=" ">
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save" />
- <button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel" />
+ <button label="ä¿å­˜" label_selected="ä¿å­˜" name="Save"/>
+ <button label="å–り消ã—" label_selected="å–り消ã—" name="Cancel"/>
<text name="Save item as:">
- アイテムを別åã§ä¿å­˜ï¼š
+ アイテムを別åã§æŒã¡ç‰©ã«ä¿å­˜ï¼š
</text>
<line_editor name="name ed">
New [DESC]
diff --git a/indra/newview/skins/default/xui/ja/floater_window_size.xml b/indra/newview/skins/default/xui/ja/floater_window_size.xml
index a31336c0f8..152a5f4806 100644
--- a/indra/newview/skins/default/xui/ja/floater_window_size.xml
+++ b/indra/newview/skins/default/xui/ja/floater_window_size.xml
@@ -4,7 +4,7 @@
[RES_X] x [RES_Y]
</string>
<text name="windowsize_text">
- ウィンドウã®ã‚µã‚¤ã‚ºã®è¨­å®šï¼š
+ ウィンドウã®ã‚µã‚¤ã‚ºã‚’設定:
</text>
<combo_box name="window_size_combo" tool_tip="横幅 x 高ã•">
<combo_box.item label="1000 x 700 (標準)" name="item0"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_world_map.xml b/indra/newview/skins/default/xui/ja/floater_world_map.xml
index a0f2d98adf..ce9e7d0777 100644
--- a/indra/newview/skins/default/xui/ja/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/ja/floater_world_map.xml
@@ -2,13 +2,13 @@
<floater name="worldmap" title="世界地図">
<panel name="layout_panel_1">
<text name="events_label">
- レジェンド
+ 表記・記å·
</text>
</panel>
- <panel>
- <button label="ç¾åœ¨åœ°ã‚’表示" label_selected="ç¾åœ¨åœ°ã‚’表示" name="Show My Location" tool_tip="マップを中央ã«è¡¨ç¤ºã™ã‚‹"/>
+ <panel name="layout_panel_2">
+ <button label="ç¾åœ¨åœ°ã‚’表示" label_selected="ç¾åœ¨åœ°ã‚’表示" name="Show My Location" tool_tip="ã‚¢ãƒã‚¿ãƒ¼ã®ä½ç½®ã‚’地図ã®ä¸­å¿ƒã«è¡¨ç¤ºã—ã¾ã™"/>
<text name="me_label">
- ミー
+ 自分
</text>
<check_box label="ä½äºº" name="people_chk"/>
<text name="person_label">
@@ -23,12 +23,12 @@
土地販売
</text>
<text name="by_owner_label">
- by owner
+ 所有者ã®è²©å£²
</text>
<text name="auction_label">
土地オークション
</text>
- <button label="ホームã¸" label_selected="ホームã¸" name="Go Home" tool_tip="「ホームã€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ"/>
+ <button label="ホームã¸" label_selected="ホームã¸" name="Go Home" tool_tip="「ホームã€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™"/>
<text name="Home_label">
ホーム
</text>
@@ -37,45 +37,46 @@
</text>
<check_box label="PG" name="event_chk"/>
<text name="pg_label">
- 一般
+ General
</text>
<check_box initial_value="true" label="Mature" name="event_mature_chk"/>
<text name="mature_label">
- 控ãˆã‚
+ Moderate
</text>
<check_box label="Adult" name="event_adult_chk"/>
<text name="adult_label">
- アダルト
+ Adult
</text>
</panel>
- <panel>
+ <panel name="layout_panel_3">
<text name="find_on_map_label">
- åœ°å›³ã§æŽ¢ã™
+ 地図上ã§è¦‹ã¤ã‘ã‚‹
</text>
</panel>
- <panel>
+ <panel name="layout_panel_4">
<combo_box label="オンラインã®ãƒ•レンド" name="friend combo" tool_tip="フレンドを地図ã«è¡¨ç¤º">
<combo_box.item label="オンラインã®ãƒ•レンド" name="item1"/>
</combo_box>
- <combo_box label="マイ ランドマーク" name="landmark combo" tool_tip="地図ã«è¡¨ç¤ºã™ã‚‹ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯">
+ <combo_box label="マイ ランドマーク" name="landmark combo" tool_tip="地図上ã«è¡¨ç¤ºã™ã‚‹ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯">
<combo_box.item label="マイ ランドマーク" name="item1"/>
</combo_box>
- <search_editor label="リージョンå" name="location" tool_tip="地域åを入力ã—ã¦ãã ã•ã„。"/>
- <button label="検索" name="DoSearch" tool_tip="地域検索"/>
+ <search_editor label="リージョンå" name="location" tool_tip="リージョンåを入力ã—ã¾ã™"/>
+ <button label="検索" name="DoSearch" tool_tip="リージョン検索"/>
+ <button name="Clear" tool_tip="追跡ラインをクリアã—ã¦åœ°å›³ã‚’リセットã—ã¾ã™"/>
<scroll_list name="search_results">
<scroll_list.columns label="" name="icon"/>
<scroll_list.columns label="" name="sim_name"/>
</scroll_list>
- <button label="テレãƒãƒ¼ãƒˆ" label_selected="テレãƒãƒ¼ãƒˆ" name="Teleport" tool_tip="é¸æŠžã•れãŸãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ"/>
- <button label="SLurl をコピー" name="copy_slurl" tool_tip="ç¾åœ¨åœ°ã‚’ SLurl ã¨ã—ã¦ã‚³ãƒ”ーã—ã¦ã€Webã§ä½¿ç”¨ã—ã¾ã™ã€‚"/>
- <button label="é¸æŠžã—ãŸãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã‚’表示ã™ã‚‹" label_selected="目的地を表示" name="Show Destination" tool_tip="é¸æŠžã—ãŸãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚’地図ã®ä¸­å¿ƒã«ã™ã‚‹"/>
+ <button label="テレãƒãƒ¼ãƒˆ" label_selected="テレãƒãƒ¼ãƒˆ" name="Teleport" tool_tip="é¸æŠžã—ãŸå ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™"/>
+ <button label="SLurl をコピー" name="copy_slurl" tool_tip="ç¾åœ¨åœ°ã® SLurl をコピーã—㦠Web ã§ä½¿ç”¨ã—ã¾ã™"/>
+ <button label="é¸æŠžã‚’è¡¨ç¤ºã™ã‚‹" label_selected="目的地を表示" name="Show Destination" tool_tip="é¸æŠžã—ãŸå ´æ‰€ã‚’地図ã®ä¸­å¿ƒã«è¡¨ç¤ºã—ã¾ã™"/>
</panel>
- <panel>
+ <panel name="layout_panel_5">
<text name="zoom_label">
ズーム
</text>
</panel>
- <panel>
+ <panel name="layout_panel_6">
<slider label="ズーム" name="zoom slider"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/inspect_avatar.xml b/indra/newview/skins/default/xui/ja/inspect_avatar.xml
index 9371b80af5..fb4937242b 100644
--- a/indra/newview/skins/default/xui/ja/inspect_avatar.xml
+++ b/indra/newview/skins/default/xui/ja/inspect_avatar.xml
@@ -18,9 +18,9 @@
<slider name="volume_slider" tool_tip="ボイス音é‡" value="0.5"/>
<button label="フレンド登録" name="add_friend_btn"/>
<button label="IM" name="im_btn"/>
- <button label="詳細" name="view_profile_btn"/>
+ <button label="プロフィール" name="view_profile_btn"/>
<panel name="moderator_panel">
- <button label="ボイスを無効ã«ã™ã‚‹" name="disable_voice"/>
- <button label="ボイスを有効ã«ã™ã‚‹" name="enable_voice"/>
+ <button label="ボイスを無効" name="disable_voice"/>
+ <button label="ボイスを有効" name="enable_voice"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/ja/inspect_object.xml b/indra/newview/skins/default/xui/ja/inspect_object.xml
index 842030c39a..e6999ac9b1 100644
--- a/indra/newview/skins/default/xui/ja/inspect_object.xml
+++ b/indra/newview/skins/default/xui/ja/inspect_object.xml
@@ -8,8 +8,8 @@
制作者: [CREATOR]
</string>
<string name="CreatorAndOwner">
- 制作者: [CREATOR]
-所有者: [OWNER]
+ [CREATOR]ã«ã‚ˆã‚‹ãƒã‚§ãƒƒã‚¯
+[OWNER]ã«ã‚ˆã‚‹ãƒã‚§ãƒƒã‚¯
</string>
<string name="Price">
L$[AMOUNT]
@@ -23,16 +23,16 @@
<string name="Sit">
座る
</string>
- <text name="object_name" value="Test Object Name That Is Really Long"/>
+ <text name="object_name" value="二行ã«ã‚ãŸã‚‹é•·ã„オブジェクトåをテスト"/>
<text name="object_creator">
by secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
owner secondlife:///app/agent/0e346d8b-4433-4d66-a6b0-fd37083abc4c/about
</text>
<text name="price_text">
- L$300,000
+ L$30,000
</text>
<text name="object_description">
- This is a really long description for an object being as how it is at least 80 characters in length and maybe more like 120 at this point. Who knows, really?
+ This is a really long description for an object being as how it is at least 80 characters in length and so but maybe more like 120 at this point. Who knows, really?
</text>
<text name="object_media_url">
http://www.superdupertest.com
diff --git a/indra/newview/skins/default/xui/ja/language_settings.xml b/indra/newview/skins/default/xui/ja/language_settings.xml
index 71418d446a..72382417d9 100644
--- a/indra/newview/skins/default/xui/ja/language_settings.xml
+++ b/indra/newview/skins/default/xui/ja/language_settings.xml
@@ -3,9 +3,9 @@
<strings>
<!-- Locale Information -->
- <string name="MicrosoftLocale">english</string>
- <string name="DarwinLocale">C</string>
- <string name="LinuxLocale">C</string>
+ <string name="MicrosoftLocale">japanese</string>
+ <string name="DarwinLocale">ja_JP.UTF-8</string>
+ <string name="LinuxLocale">ja_JP.UTF-8</string>
<!--
datetimeToCodes["wkday"] = "%a"; // Thu
diff --git a/indra/newview/skins/default/xui/ja/menu_attachment_other.xml b/indra/newview/skins/default/xui/ja/menu_attachment_other.xml
index f163c2cf4f..5adf0b3745 100644
--- a/indra/newview/skins/default/xui/ja/menu_attachment_other.xml
+++ b/indra/newview/skins/default/xui/ja/menu_attachment_other.xml
@@ -10,7 +10,7 @@
<menu_item_call label="報告" name="abuse"/>
<menu_item_call label="フリーズ" name="Freeze..."/>
<menu_item_call label="追放" name="Eject..."/>
- <menu_item_call label="デãƒãƒƒã‚°" name="Debug..."/>
+ <menu_item_call label="テクスãƒãƒ£ã®ãƒ‡ãƒãƒƒã‚°" name="Debug..."/>
<menu_item_call label="ズームイン" name="Zoom In"/>
<menu_item_call label="支払ã†" name="Pay..."/>
<menu_item_call label="オブジェクトã®ãƒ—ロフィール" name="Object Inspect"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_attachment_self.xml b/indra/newview/skins/default/xui/ja/menu_attachment_self.xml
index 209edd80ba..48200cb53f 100644
--- a/indra/newview/skins/default/xui/ja/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/ja/menu_attachment_self.xml
@@ -5,8 +5,9 @@
<menu_item_call label="å–り外ã™" name="Detach"/>
<menu_item_call label="下ã«è½ã¨ã™" name="Drop"/>
<menu_item_call label="ç«‹ã¡ä¸ŠãŒã‚‹" name="Stand Up"/>
- <menu_item_call label="容姿" name="Appearance..."/>
+ <menu_item_call label="アウトフィットを変更" name="Change Outfit"/>
<menu_item_call label="フレンド" name="Friends..."/>
<menu_item_call label="グループ" name="Groups..."/>
<menu_item_call label="プロフィール" name="Profile..."/>
+ <menu_item_call label="テクスãƒãƒ£ã®ãƒ‡ãƒãƒƒã‚°" name="Debug..."/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_other.xml b/indra/newview/skins/default/xui/ja/menu_avatar_other.xml
index 74d877cdda..54dd96f5ef 100644
--- a/indra/newview/skins/default/xui/ja/menu_avatar_other.xml
+++ b/indra/newview/skins/default/xui/ja/menu_avatar_other.xml
@@ -10,7 +10,7 @@
<menu_item_call label="報告" name="abuse"/>
<menu_item_call label="フリーズ" name="Freeze..."/>
<menu_item_call label="追放" name="Eject..."/>
- <menu_item_call label="デãƒãƒƒã‚°" name="Debug..."/>
+ <menu_item_call label="テクスãƒãƒ£ã®ãƒ‡ãƒãƒƒã‚°" name="Debug..."/>
<menu_item_call label="ズームイン" name="Zoom In"/>
<menu_item_call label="支払ã†" name="Pay..."/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_self.xml b/indra/newview/skins/default/xui/ja/menu_avatar_self.xml
index 1bfadf8d45..6899a819b8 100644
--- a/indra/newview/skins/default/xui/ja/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/ja/menu_avatar_self.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Self Pie">
<menu_item_call label="ç«‹ã¡ä¸ŠãŒã‚‹" name="Stand Up"/>
- <context_menu label="脱ã>" name="Take Off &gt;">
- <context_menu label="衣類 &gt;" name="Clothes &gt;">
+ <context_menu label="脱ã â–¶" name="Take Off &gt;">
+ <context_menu label="衣類 ▶" name="Clothes &gt;">
<menu_item_call label="シャツ" name="Shirt"/>
<menu_item_call label="パンツ" name="Pants"/>
<menu_item_call label="スカート" name="Skirt"/>
@@ -16,12 +16,15 @@
<menu_item_call label="アルファ" name="Self Alpha"/>
<menu_item_call label="ã™ã¹ã¦ã®è¡£é¡ž" name="All Clothes"/>
</context_menu>
- <context_menu label="HUD &gt;" name="Object Detach HUD"/>
- <context_menu label="å–り外㙠&gt;" name="Object Detach"/>
+ <context_menu label="HUD â–¶" name="Object Detach HUD"/>
+ <context_menu label="å–り外㙠▶" name="Object Detach"/>
<menu_item_call label="ã™ã¹ã¦å–り外ã™" name="Detach All"/>
</context_menu>
- <menu_item_call label="容姿" name="Appearance..."/>
+ <menu_item_call label="アウトフィットを変更" name="Chenge Outfit"/>
+ <menu_item_call label="アウトフィットを編集" name="Edit Outfit"/>
+ <menu_item_call label="シェイプを編集" name="Edit My Shape"/>
<menu_item_call label="フレンド" name="Friends..."/>
<menu_item_call label="グループ" name="Groups..."/>
- <menu_item_call label="マイ プロフィール" name="Profile..."/>
+ <menu_item_call label="プロフィール" name="Profile..."/>
+ <menu_item_call label="テクスãƒãƒ£ã®ãƒ‡ãƒãƒƒã‚°" name="Debug..."/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_bottomtray.xml b/indra/newview/skins/default/xui/ja/menu_bottomtray.xml
index ea7ba1b741..e5703c559b 100644
--- a/indra/newview/skins/default/xui/ja/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/ja/menu_bottomtray.xml
@@ -4,6 +4,11 @@
<menu_item_check label="移動ボタン" name="ShowMoveButton"/>
<menu_item_check label="視界ボタン" name="ShowCameraButton"/>
<menu_item_check label="スナップショットボタン" name="ShowSnapshotButton"/>
+ <menu_item_check label="サイドãƒãƒ¼ãƒœã‚¿ãƒ³" name="ShowSidebarButton"/>
+ <menu_item_check label="制作ボタン" name="ShowBuildButton"/>
+ <menu_item_check label="検索ボタン" name="ShowSearchButton"/>
+ <menu_item_check label="地図ボタン" name="ShowWorldMapButton"/>
+ <menu_item_check label="ミニマップボタン" name="ShowMiniMapButton"/>
<menu_item_call label="切りå–り" name="NearbyChatBar_Cut"/>
<menu_item_call label="コピー" name="NearbyChatBar_Copy"/>
<menu_item_call label="貼り付ã‘" name="NearbyChatBar_Paste"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_cof_attachment.xml b/indra/newview/skins/default/xui/ja/menu_cof_attachment.xml
new file mode 100644
index 0000000000..e786d02e40
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_cof_attachment.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Attachment">
+ <menu_item_call label="å–り外ã™" name="detach"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_cof_body_part.xml b/indra/newview/skins/default/xui/ja/menu_cof_body_part.xml
new file mode 100644
index 0000000000..eb5faa2545
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_cof_body_part.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Body">
+ <menu_item_call label="交æ›" name="replace"/>
+ <menu_item_call label="編集" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_cof_clothing.xml b/indra/newview/skins/default/xui/ja/menu_cof_clothing.xml
new file mode 100644
index 0000000000..9da909fa17
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_cof_clothing.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Clothing">
+ <menu_item_call label="å–り外ã™" name="take_off"/>
+ <menu_item_call label="上ã®ãƒ¬ã‚¤ãƒ¤ãƒ¼ã«ç§»å‹•" name="move_up"/>
+ <menu_item_call label="下ã®ãƒ¬ã‚¤ãƒ¤ãƒ¼ã«ç§»å‹•" name="move_down"/>
+ <menu_item_call label="編集" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_cof_gear.xml b/indra/newview/skins/default/xui/ja/menu_cof_gear.xml
new file mode 100644
index 0000000000..a071abbd2e
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_cof_gear.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Gear COF">
+ <menu label="衣類" name="COF.Gear.New_Clothes"/>
+ <menu label="æ–°ã—ã„身体部ä½" name="COF.Geear.New_Body_Parts"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_edit.xml b/indra/newview/skins/default/xui/ja/menu_edit.xml
new file mode 100644
index 0000000000..c2ef0179b2
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_edit.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu label="編集" name="Edit">
+ <menu_item_call label="å…ƒã«æˆ»ã™" name="Undo"/>
+ <menu_item_call label="やり直ã—" name="Redo"/>
+ <menu_item_call label="切りå–り" name="Cut"/>
+ <menu_item_call label="コピー" name="Copy"/>
+ <menu_item_call label="貼り付ã‘" name="Paste"/>
+ <menu_item_call label="削除" name="Delete"/>
+ <menu_item_call label="複製" name="Duplicate"/>
+ <menu_item_call label="ã™ã¹ã¦é¸æŠž" name="Select All"/>
+ <menu_item_call label="é¸æŠžè§£é™¤" name="Deselect"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml b/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml
index 09e70b0d1f..3a1ae49700 100644
--- a/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml
+++ b/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml
@@ -2,4 +2,5 @@
<menu name="hide_navbar_menu">
<menu_item_check label="ナビゲーションãƒãƒ¼ã‚’表示" name="ShowNavbarNavigationPanel"/>
<menu_item_check label="ãŠæ°—ã«å…¥ã‚Šãƒãƒ¼ã‚’表示" name="ShowNavbarFavoritesPanel"/>
+ <menu_item_check label="「場所ã€ã®ãƒŸãƒ‹ãƒ•ィールドを表示" name="ShowMiniLocationPanel"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml
index 3d5086c52a..5fdaa9ae6b 100644
--- a/indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inspect_avatar_gear.xml
@@ -11,8 +11,9 @@
<menu_item_call label="報告" name="report"/>
<menu_item_call label="フリーズ" name="freeze"/>
<menu_item_call label="追放" name="eject"/>
- <menu_item_call label="デãƒãƒƒã‚°" name="debug"/>
+ <menu_item_call label="テクスãƒãƒ£ã®ãƒ‡ãƒãƒƒã‚°" name="debug"/>
<menu_item_call label="åœ°å›³ã§æŽ¢ã™" name="find_on_map"/>
<menu_item_call label="ズームイン" name="zoom_in"/>
<menu_item_call label="支払ã†" name="pay"/>
+ <menu_item_call label="共有" name="share"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml
index 76c01d6109..ee054673c5 100644
--- a/indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inspect_self_gear.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<menu name="Gear Menu">
<menu_item_call label="ç«‹ã¡ä¸ŠãŒã‚‹" name="stand_up"/>
- <menu_item_call label="マイ 容姿" name="my_appearance"/>
+ <menu_item_call label="アウトフィットを変更" name="change_outfit"/>
<menu_item_call label="プロフィール" name="my_profile"/>
<menu_item_call label="フレンド" name="my_friends"/>
<menu_item_call label="グループ" name="my_groups"/>
+ <menu_item_call label="テクスãƒãƒ£ã®ãƒ‡ãƒãƒƒã‚°" name="Debug..."/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_inv_offer_chiclet.xml b/indra/newview/skins/default/xui/ja/menu_inv_offer_chiclet.xml
new file mode 100644
index 0000000000..9a4a8138f5
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_inv_offer_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="InvOfferChiclet Menu">
+ <menu_item_call label="é–‰ã˜ã‚‹" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_inventory.xml b/indra/newview/skins/default/xui/ja/menu_inventory.xml
index 78c0dd0a78..782b9ea5a5 100644
--- a/indra/newview/skins/default/xui/ja/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/menu_inventory.xml
@@ -1,13 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
+ <menu_item_call label="共有" name="Share"/>
<menu_item_call label="購入" name="Task Buy"/>
<menu_item_call label="é–‹ã" name="Task Open"/>
<menu_item_call label="å†ç”Ÿ" name="Task Play"/>
<menu_item_call label="プロパティ" name="Task Properties"/>
<menu_item_call label="åå‰ã®å¤‰æ›´" name="Task Rename"/>
<menu_item_call label="削除" name="Task Remove"/>
- <menu_item_call label="ゴミ箱を空ã«ã™ã‚‹" name="Empty Trash"/>
- <menu_item_call label="éºå¤±ç‰©ãƒ•ォルダを空ã«ã™ã‚‹" name="Empty Lost And Found"/>
+ <menu_item_call label="ã”ã¿ç®±ã‚’空ã«ã™ã‚‹" name="Empty Trash"/>
+ <menu_item_call label="紛失物フォルダを空ã«ã™ã‚‹" name="Empty Lost And Found"/>
<menu_item_call label="æ–°ã—ã„フォルダ" name="New Folder"/>
<menu_item_call label="æ–°ã—ã„スクリプト" name="New Script"/>
<menu_item_call label="æ–°ã—ã„ノートカード" name="New Note"/>
@@ -49,36 +50,38 @@
<menu_item_call label="ç€ç”¨ä¸­ã®ã‚¢ã‚¦ãƒˆãƒ•ィットを入れ替ãˆã‚‹" name="Replace Outfit"/>
<menu_item_call label="ç€ç”¨ä¸­ã®ã‚¢ã‚¦ãƒˆãƒ•ィットã«è¿½åŠ ã™ã‚‹" name="Add To Outfit"/>
<menu_item_call label="ç€ç”¨ä¸­ã®ã‚¢ã‚¦ãƒˆãƒ•ィットã‹ã‚‰å–り除ã" name="Remove From Outfit"/>
- <menu_item_call label="アイテムを除外" name="Purge Item"/>
- <menu_item_call label="アイテムを復元" name="Restore Item"/>
<menu_item_call label="オリジナルを探ã™" name="Find Original"/>
+ <menu_item_call label="アイテムを除外ã™ã‚‹" name="Purge Item"/>
+ <menu_item_call label="アイテムを復元ã™ã‚‹" name="Restore Item"/>
<menu_item_call label="é–‹ã" name="Open"/>
+ <menu_item_call label="オリジナルを開ãã¾ã™" name="Open Original"/>
<menu_item_call label="プロパティ" name="Properties"/>
- <menu_item_call label="åå‰ã®å¤‰æ›´" name="Rename"/>
- <menu_item_call label="UUIDをコピー" name="Copy Asset UUID"/>
+ <menu_item_call label="åå‰ã‚’変更ã™ã‚‹" name="Rename"/>
+ <menu_item_call label="UUID をコピーã™ã‚‹" name="Copy Asset UUID"/>
<menu_item_call label="コピー" name="Copy"/>
<menu_item_call label="貼り付ã‘" name="Paste"/>
- <menu_item_call label="リンクã®è²¼ã‚Šä»˜ã‘" name="Paste As Link"/>
+ <menu_item_call label="リンクを貼り付ã‘ã‚‹" name="Paste As Link"/>
<menu_item_call label="リンクを外ã™" name="Remove Link"/>
<menu_item_call label="削除" name="Delete"/>
<menu_item_call label="システムフォルダを削除ã™ã‚‹" name="Delete System Folder"/>
- <menu_item_call label="会議ãƒãƒ£ãƒƒãƒˆé–‹å§‹" name="Conference Chat Folder"/>
- <menu_item_call label="å†ç”Ÿ" name="Sound Play"/>
+ <menu_item_call label="コンファレンスãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹ã™ã‚‹" name="Conference Chat Folder"/>
+ <menu_item_call label="å†ç”Ÿã™ã‚‹" name="Sound Play"/>
<menu_item_call label="ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã®æƒ…å ±" name="About Landmark"/>
- <menu_item_call label="世界ã§å†ç”Ÿ" name="Animation Play"/>
- <menu_item_call label="ローカルã«å†ç”Ÿ" name="Animation Audition"/>
- <menu_item_call label="インスタント・メッセージをé€ä¿¡" name="Send Instant Message"/>
- <menu_item_call label="テレãƒãƒ¼ãƒˆã‚’贈る..." name="Offer Teleport..."/>
- <menu_item_call label="会議ãƒãƒ£ãƒƒãƒˆé–‹å§‹" name="Conference Chat"/>
+ <menu_item_call label="インワールドã§å†ç”Ÿã™ã‚‹" name="Animation Play"/>
+ <menu_item_call label="ローカルã§å†ç”Ÿã™ã‚‹" name="Animation Audition"/>
+ <menu_item_call label="インスタントメッセージをé€ä¿¡ã™ã‚‹" name="Send Instant Message"/>
+ <menu_item_call label="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹..." name="Offer Teleport..."/>
+ <menu_item_call label="コンファレンスãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹ã™ã‚‹" name="Conference Chat"/>
<menu_item_call label="アクティブ" name="Activate"/>
<menu_item_call label="éžã‚¢ã‚¯ãƒ†ã‚£ãƒ–" name="Deactivate"/>
- <menu_item_call label="別åã§ä¿å­˜" name="Save As"/>
+ <menu_item_call label="別åã§ä¿å­˜ã™ã‚‹" name="Save As"/>
<menu_item_call label="自分ã‹ã‚‰å–り外ã™" name="Detach From Yourself"/>
<menu_item_call label="装ç€" name="Object Wear"/>
<menu label="装ç€å…ˆ" name="Attach To"/>
- <menu label="HUD装ç€å…ˆ" name="Attach To HUD"/>
+ <menu label="HUD 装ç€å…ˆ" name="Attach To HUD"/>
<menu_item_call label="編集" name="Wearable Edit"/>
<menu_item_call label="装ç€" name="Wearable Wear"/>
+ <menu_item_call label="追加" name="Wearable Add"/>
<menu_item_call label="å–り外ã™" name="Take Off"/>
<menu_item_call label="ï¼ï¼ã‚ªãƒ—ションãªã—ï¼ï¼" name="--no options--"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_login.xml b/indra/newview/skins/default/xui/ja/menu_login.xml
index 42a95ac3d3..e2a7f39dfd 100644
--- a/indra/newview/skins/default/xui/ja/menu_login.xml
+++ b/indra/newview/skins/default/xui/ja/menu_login.xml
@@ -8,25 +8,17 @@
<menu_item_call label="[SECOND_LIFE] ヘルプ" name="Second Life Help"/>
<menu_item_call label="[APP_NAME] ã«ã¤ã„ã¦" name="About Second Life"/>
</menu>
+ <menu_item_check label="デãƒãƒƒã‚°ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’表示ã™ã‚‹" name="Show Debug Menu"/>
<menu label="デãƒãƒƒã‚°" name="Debug">
- <menu label="編集" name="Edit">
- <menu_item_call label="å…ƒã«æˆ»ã™" name="Undo"/>
- <menu_item_call label="やり直ã—" name="Redo"/>
- <menu_item_call label="切りå–り" name="Cut"/>
- <menu_item_call label="コピー" name="Copy"/>
- <menu_item_call label="貼り付ã‘" name="Paste"/>
- <menu_item_call label="削除" name="Delete"/>
- <menu_item_call label="複製" name="Duplicate"/>
- <menu_item_call label="ã™ã¹ã¦é¸æŠž" name="Select All"/>
- <menu_item_call label="é¸æŠžè§£é™¤" name="Deselect"/>
- </menu>
<menu_item_call label="デãƒãƒƒã‚°è¨­å®šã‚’表示" name="Debug Settings"/>
<menu_item_call label="UI/色ã®è¨­å®š" name="UI/Color Settings"/>
<menu_item_call label="XUI プレビューツール" name="UI Preview Tool"/>
<menu label="UI テスト" name="UI Tests"/>
- <menu_item_call label="ウィンドウã®ã‚µã‚¤ã‚ºã®è¨­å®š..." name="Set Window Size..."/>
+ <menu_item_call label="ウィンドウã®ã‚µã‚¤ã‚ºã‚’設定..." name="Set Window Size..."/>
<menu_item_call label="利用è¦ç´„を表示" name="TOS"/>
<menu_item_call label="クリティカルメッセージを表示" name="Critical"/>
<menu_item_call label="Web ブラウザã®ãƒ†ã‚¹ãƒˆ" name="Web Browser Test"/>
+ <menu_item_check label="グリッドピッカーを表示ã™ã‚‹" name="Show Grid Picker"/>
+ <menu_item_call label="通知コンソールを表示ã™ã‚‹" name="Show Notifications Console"/>
</menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/ja/menu_mini_map.xml b/indra/newview/skins/default/xui/ja/menu_mini_map.xml
index ec49c3a98d..0a89c5e63a 100644
--- a/indra/newview/skins/default/xui/ja/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/ja/menu_mini_map.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="popup">
+<menu name="Popup">
<menu_item_call label="ズーム(近)" name="Zoom Close"/>
<menu_item_call label="ズーム(中)" name="Zoom Medium"/>
<menu_item_call label="ズーム(é ï¼‰" name="Zoom Far"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_object.xml b/indra/newview/skins/default/xui/ja/menu_object.xml
index a161c01514..e59a500534 100644
--- a/indra/newview/skins/default/xui/ja/menu_object.xml
+++ b/indra/newview/skins/default/xui/ja/menu_object.xml
@@ -5,20 +5,22 @@
<menu_item_call label="制作" name="Build"/>
<menu_item_call label="é–‹ã" name="Open"/>
<menu_item_call label="ã“ã“ã«åº§ã‚‹" name="Object Sit"/>
+ <menu_item_call label="ç«‹ã¡ä¸ŠãŒã‚‹" name="Object Stand Up"/>
<menu_item_call label="オブジェクトã®ãƒ—ロフィール" name="Object Inspect"/>
<menu_item_call label="ズームイン" name="Zoom In"/>
- <context_menu label="è£…ç€ &gt;" name="Put On">
+ <context_menu label="è£…ç€ â–¶" name="Put On">
<menu_item_call label="装ç€" name="Wear"/>
- <context_menu label="å–り付㑠&gt;" name="Object Attach"/>
- <context_menu label="HUD ã‚’å–り付㑠&gt;" name="Object Attach HUD"/>
+ <context_menu label="å–り付ã‘ã‚‹ â–¶" name="Object Attach"/>
+ <context_menu label="HUD ã‚’å–り付ã‘ã‚‹ â–¶" name="Object Attach HUD"/>
</context_menu>
- <context_menu label="削除 &gt;" name="Remove">
- <menu_item_call label="å–ã‚‹" name="Pie Object Take"/>
+ <context_menu label="å–り除ã â–¶" name="Remove">
<menu_item_call label="嫌ãŒã‚‰ã›ã®å ±å‘Š" name="Report Abuse..."/>
<menu_item_call label="ブロック" name="Object Mute"/>
<menu_item_call label="è¿”å´" name="Return..."/>
<menu_item_call label="削除" name="Delete"/>
</context_menu>
+ <menu_item_call label="è²·ã†" name="Pie Object Bye"/>
+ <menu_item_call label="å–ã‚‹" name="Pie Object Take"/>
<menu_item_call label="コピーをå–ã‚‹" name="Take Copy"/>
<menu_item_call label="支払ã†" name="Pay..."/>
<menu_item_call label="è²·ã†" name="Buy..."/>
diff --git a/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml b/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml
new file mode 100644
index 0000000000..e68ed5ccc7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Gear Outfit">
+ <menu_item_call label="ç€ã‚‹ - ç€ç”¨ä¸­ã®ã‚¢ã‚¦ãƒˆãƒ•ィットを入れ替ãˆã‚‹" name="wear"/>
+ <menu_item_call label="å–り外㙠- ç€ç”¨ä¸­ã®ã‚¢ã‚¦ãƒˆãƒ•ィットã‹ã‚‰å–り除ã" name="take_off"/>
+ <menu label="衣類" name="New Clothes">
+ <menu_item_call label="シャツ" name="New Shirt"/>
+ <menu_item_call label="パンツ" name="New Pants"/>
+ <menu_item_call label="é´" name="New Shoes"/>
+ <menu_item_call label="é´ä¸‹" name="New Socks"/>
+ <menu_item_call label="ジャケット" name="New Jacket"/>
+ <menu_item_call label="スカート" name="New Skirt"/>
+ <menu_item_call label="手袋" name="New Gloves"/>
+ <menu_item_call label="下ç€ï¼ˆä¸Šï¼‰" name="New Undershirt"/>
+ <menu_item_call label="下ç€ï¼ˆä¸‹ï¼‰" name="New Underpants"/>
+ <menu_item_call label="アルファ" name="New Alpha"/>
+ <menu_item_call label="æ–°ã—ã„タトゥ" name="New Tattoo"/>
+ </menu>
+ <menu label="æ–°ã—ã„身体部ä½" name="New Body Parts">
+ <menu_item_call label="æ–°ã—ã„シェイプ" name="New Shape"/>
+ <menu_item_call label="スキン" name="New Skin"/>
+ <menu_item_call label="髪" name="New Hair"/>
+ <menu_item_call label="ç›®" name="New Eyes"/>
+ </menu>
+ <menu_item_call label="アウトフィットã®åå‰ã‚’変更ã™ã‚‹" name="rename"/>
+ <menu_item_call label="アウトフィットを削除ã™ã‚‹" name="delete_outfit"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_outfit_tab.xml b/indra/newview/skins/default/xui/ja/menu_outfit_tab.xml
new file mode 100644
index 0000000000..8f4b61b702
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_outfit_tab.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit">
+ <menu_item_call label="ç€ã‚‹ - ç€ç”¨ä¸­ã®ã‚¢ã‚¦ãƒˆãƒ•ィットを入れ替ãˆã‚‹" name="wear_replace"/>
+ <menu_item_call label="ç€ã‚‹ - ç€ç”¨ä¸­ã®ã‚¢ã‚¦ãƒˆãƒ•ィットã«è¿½åŠ ã™ã‚‹" name="wear_add"/>
+ <menu_item_call label="å–り外㙠- ç€ç”¨ä¸­ã®ã‚¢ã‚¦ãƒˆãƒ•ィットã‹ã‚‰å–り除ã" name="take_off"/>
+ <menu_item_call label="アウトフィットã®ç·¨é›†" name="edit"/>
+ <menu_item_call label="åå‰ã®å¤‰æ›´" name="rename"/>
+ <menu_item_call label="アウトフィットを削除ã™ã‚‹" name="delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_participant_list.xml b/indra/newview/skins/default/xui/ja/menu_participant_list.xml
index 398a78bb61..3ef83756cb 100644
--- a/indra/newview/skins/default/xui/ja/menu_participant_list.xml
+++ b/indra/newview/skins/default/xui/ja/menu_participant_list.xml
@@ -8,13 +8,14 @@
<menu_item_call label="コール" name="Call"/>
<menu_item_call label="共有" name="Share"/>
<menu_item_call label="支払ã†" name="Pay"/>
+ <menu_item_check label="人ã®ã‚¢ã‚¤ã‚³ãƒ³è¡¨ç¤º" name="View Icons"/>
<menu_item_check label="ボイスをブロック" name="Block/Unblock"/>
- <menu_item_check label="文字をブロックã™ã‚‹" name="MuteText"/>
+ <menu_item_check label="文字をブロック" name="MuteText"/>
<context_menu label="モデレーターã®ã‚ªãƒ—ション &gt;" name="Moderator Options">
<menu_item_check label="文字ãƒãƒ£ãƒƒãƒˆã‚’許å¯" name="AllowTextChat"/>
<menu_item_call label="ã“ã®å‚加者をミュートã™ã‚‹" name="ModerateVoiceMuteSelected"/>
- <menu_item_call label="ä»–ã®äººå…¨å“¡ã‚’ミュートã™ã‚‹" name="ModerateVoiceMuteOthers"/>
<menu_item_call label="ã“ã®å‚加者ã®ãƒŸãƒ¥ãƒ¼ãƒˆã‚’解除ã™ã‚‹" name="ModerateVoiceUnMuteSelected"/>
- <menu_item_call label="ä»–ã®äººå…¨å“¡ã®ãƒŸãƒ¥ãƒ¼ãƒˆã‚’解除ã™ã‚‹" name="ModerateVoiceUnMuteOthers"/>
+ <menu_item_call label="全員をミュート" name="ModerateVoiceMute"/>
+ <menu_item_call label="全員ã®ãƒŸãƒ¥ãƒ¼ãƒˆè§£é™¤" name="ModerateVoiceUnmute"/>
</context_menu>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/ja/menu_people_friends_view_sort.xml
index e4ccbf43ad..5eaad31898 100644
--- a/indra/newview/skins/default/xui/ja/menu_people_friends_view_sort.xml
+++ b/indra/newview/skins/default/xui/ja/menu_people_friends_view_sort.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_group_plus">
<menu_item_check label="åå‰ã§ä¸¦ã¹æ›¿ãˆ" name="sort_name"/>
- <menu_item_check label="オンライン状æ³ã§ä¸¦ã¹æ›¿ãˆ" name="sort_status"/>
+ <menu_item_check label="オンライン状態ã§ä¸¦ã¹æ›¿ãˆ" name="sort_status"/>
<menu_item_check label="人ã®ã‚¢ã‚¤ã‚³ãƒ³è¡¨ç¤º" name="view_icons"/>
<menu_item_call label="ブロックã•れãŸä½äººã¨ã‚ªãƒ–ジェクトを表示" name="show_blocked_list"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_groups.xml b/indra/newview/skins/default/xui/ja/menu_people_groups.xml
index 4e5dc60a3d..842d79dc4b 100644
--- a/indra/newview/skins/default/xui/ja/menu_people_groups.xml
+++ b/indra/newview/skins/default/xui/ja/menu_people_groups.xml
@@ -3,6 +3,6 @@
<menu_item_call label="情報を表示" name="View Info"/>
<menu_item_call label="ãƒãƒ£ãƒƒãƒˆ" name="Chat"/>
<menu_item_call label="コール" name="Call"/>
- <menu_item_call label="有効化" name="Activate"/>
+ <menu_item_call label="アクティブ" name="Activate"/>
<menu_item_call label="脱退" name="Leave"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby.xml
index 2c8a346d1a..8d84b0e521 100644
--- a/indra/newview/skins/default/xui/ja/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/ja/menu_people_nearby.xml
@@ -2,8 +2,10 @@
<context_menu name="Avatar Context Menu">
<menu_item_call label="プロフィールã®è¡¨ç¤º" name="View Profile"/>
<menu_item_call label="フレンド登録" name="Add Friend"/>
+ <menu_item_call label="フレンドを削除" name="Remove Friend"/>
<menu_item_call label="IM" name="IM"/>
<menu_item_call label="コール" name="Call"/>
+ <menu_item_call label="地図" name="Map"/>
<menu_item_call label="共有" name="Share"/>
<menu_item_call label="支払ã†" name="Pay"/>
<menu_item_check label="ブロック・ブロック解除" name="Block/Unblock"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml
index bcd562e3ed..238bfc4af9 100644
--- a/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml
+++ b/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Multi-Selected People Context Menu">
<menu_item_call label="フレンド登録" name="Add Friends"/>
+ <menu_item_call label="フレンドを削除" name="Remove Friend"/>
<menu_item_call label="IM" name="IM"/>
<menu_item_call label="コール" name="Call"/>
<menu_item_call label="共有" name="Share"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_profile_overflow.xml b/indra/newview/skins/default/xui/ja/menu_profile_overflow.xml
index bb93990efe..9d3a5dda1c 100644
--- a/indra/newview/skins/default/xui/ja/menu_profile_overflow.xml
+++ b/indra/newview/skins/default/xui/ja/menu_profile_overflow.xml
@@ -1,7 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="profile_overflow_menu">
+ <menu_item_call label="地図" name="show_on_map"/>
<menu_item_call label="支払ã†" name="pay"/>
<menu_item_call label="共有" name="share"/>
+ <menu_item_call label="ブロック" name="block"/>
+ <menu_item_call label="ブロック解除" name="unblock"/>
<menu_item_call label="追放" name="kick"/>
<menu_item_call label="フリーズ" name="freeze"/>
<menu_item_call label="フリーズ解除" name="unfreeze"/>
diff --git a/indra/newview/skins/default/xui/ja/menu_save_outfit.xml b/indra/newview/skins/default/xui/ja/menu_save_outfit.xml
new file mode 100644
index 0000000000..6513d9264a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_save_outfit.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="save_outfit_menu">
+ <menu_item_call label="ä¿å­˜" name="save_outfit"/>
+ <menu_item_call label="別åã§ä¿å­˜" name="save_as_new_outfit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_script_chiclet.xml b/indra/newview/skins/default/xui/ja/menu_script_chiclet.xml
new file mode 100644
index 0000000000..a89dd0bcbe
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_script_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="ScriptChiclet Menu">
+ <menu_item_call label="é–‰ã˜ã‚‹" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_slurl.xml b/indra/newview/skins/default/xui/ja/menu_slurl.xml
index 2e06c53494..61ba3085d9 100644
--- a/indra/newview/skins/default/xui/ja/menu_slurl.xml
+++ b/indra/newview/skins/default/xui/ja/menu_slurl.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
- <menu_item_call label="URLã«ã¤ã„ã¦" name="about_url"/>
- <menu_item_call label="URLã¸ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹" name="teleport_to_url"/>
+ <menu_item_call label="URL ã«ã¤ã„ã¦" name="about_url"/>
+ <menu_item_call label="URL ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹" name="teleport_to_url"/>
<menu_item_call label="地図" name="show_on_map"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_url_http.xml b/indra/newview/skins/default/xui/ja/menu_url_http.xml
index c2f4f24db6..c3da8a8686 100644
--- a/indra/newview/skins/default/xui/ja/menu_url_http.xml
+++ b/indra/newview/skins/default/xui/ja/menu_url_http.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Url Popup">
<menu_item_call label="Web ページを開ã" name="url_open"/>
- <menu_item_call label="インターãƒãƒƒãƒˆãƒ–ラウザã§é–‹ã" name="url_open_internal"/>
+ <menu_item_call label="内蔵ブラウザã§é–‹ã" name="url_open_internal"/>
<menu_item_call label="外部ブラウザã§é–‹ã" name="url_open_external"/>
<menu_item_call label="URLをクリップボードã«ã‚³ãƒ”ー" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml
index db8583ca15..1573177914 100644
--- a/indra/newview/skins/default/xui/ja/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml
@@ -5,13 +5,14 @@
<menu_item_call label="マイアカウント" name="Manage My Account">
<menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=ja"/>
</menu_item_call>
- <menu_item_call label="L$ã®è³¼å…¥" name="Buy and Sell L$"/>
- <menu_item_call label="マイ プロフィール" name="Profile"/>
- <menu_item_call label="マイ 容姿" name="Appearance"/>
- <menu_item_check label="マイ æŒã¡ç‰©" name="Inventory"/>
- <menu_item_call label="æŒã¡ç‰©ã‚’サイドトレイã«è¡¨ç¤º" name="ShowSidetrayInventory"/>
- <menu_item_call label="マイ ジェスãƒãƒ£ãƒ¼" name="Gestures"/>
- <menu label="マイ ログイン状態" name="Status">
+ <menu_item_call label="L$ ã®è³¼å…¥" name="Buy and Sell L$"/>
+ <menu_item_call label="プロフィール" name="Profile"/>
+ <menu_item_call label="アウトフィットを変更" name="ChangeOutfit"/>
+ <menu_item_check label="æŒã¡ç‰©" name="Inventory"/>
+ <menu_item_check label="æŒã¡ç‰©" name="ShowSidetrayInventory"/>
+ <menu_item_check label="ジェスãƒãƒ£ãƒ¼" name="Gestures"/>
+ <menu_item_check label="マイボイス" name="ShowVoice"/>
+ <menu label="ログイン状態" name="Status">
<menu_item_call label="一時退席中" name="Set Away"/>
<menu_item_call label="å–り込ã¿ä¸­" name="Set Busy"/>
</menu>
@@ -24,7 +25,6 @@
<menu_item_call label="所属グループ" name="My Groups"/>
<menu_item_check label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆ" name="Nearby Chat"/>
<menu_item_call label="è¿‘ãã«ã„る人" name="Active Speakers"/>
- <menu_item_check label="è¿‘ãã®ãƒ¡ãƒ‡ã‚£ã‚¢" name="Nearby Media"/>
</menu>
<menu label="世界" name="World">
<menu_item_check label="ミニマップ" name="Mini-Map"/>
@@ -32,6 +32,7 @@
<menu_item_call label="スナップショット" name="Take Snapshot"/>
<menu_item_call label="ç¾åœ¨åœ°ã‚’ランドマーク" name="Create Landmark Here"/>
<menu label="場所ã®ãƒ—ロフィール" name="Land">
+ <menu_item_call label="場所ã®ãƒ—ロフィール" name="Place Profile"/>
<menu_item_call label="土地情報" name="About Land"/>
<menu_item_call label="地域 / ä¸å‹•産" name="Region/Estate"/>
</menu>
@@ -39,7 +40,13 @@
<menu_item_call label="自分ã®åœŸåœ°" name="My Land"/>
<menu label="表示" name="LandShow">
<menu_item_check label="移動コントロール" name="Movement Controls"/>
- <menu_item_check label="コントロールを表示" name="Camera Controls"/>
+ <menu_item_check label="カメラコントロール" name="Camera Controls"/>
+ <menu_item_check label="ç«‹å…¥ç¦æ­¢ãƒ©ã‚¤ãƒ³" name="Ban Lines"/>
+ <menu_item_check label="ビーコン(標識)" name="beacons"/>
+ <menu_item_check label="プロパティ境界線" name="Property Lines"/>
+ <menu_item_check label="土地所有者" name="Land Owners"/>
+ <menu_item_check label="座標" name="Coordinates"/>
+ <menu_item_check label="区画プロパティ" name="Parcel Properties"/>
</menu>
<menu_item_call label="ホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ" name="Teleport Home"/>
<menu_item_call label="ç¾åœ¨åœ°ã‚’ホームã«è¨­å®š" name="Set Home to Here"/>
@@ -49,37 +56,34 @@
<menu_item_call label="日没" name="Sunset"/>
<menu_item_call label="深夜" name="Midnight"/>
<menu_item_call label="エステートタイム" name="Revert to Region Default"/>
- <menu_item_call label="環境編集" name="Environment Editor"/>
+ <menu_item_call label="自然環境エディター" name="Environment Editor"/>
</menu>
</menu>
<menu label="制作" name="BuildTools">
<menu_item_check label="制作" name="Show Build Tools"/>
- <menu label="åˆ¶ä½œãƒ„ãƒ¼ãƒ«ã‚’é¸æŠž" name="Select Tool">
+ <menu label="åˆ¶ä½œãƒ„ãƒ¼ãƒ«ã‚’é¸æŠžã™ã‚‹" name="Select Tool">
<menu_item_call label="フォーカスツール" name="Focus"/>
<menu_item_call label="移動ツール" name="Move"/>
<menu_item_call label="編集ツール" name="Edit"/>
- <menu_item_call label="クリエーションツール" name="Create"/>
+ <menu_item_call label="作æˆãƒ„ール" name="Create"/>
<menu_item_call label="土地ツール" name="Land"/>
</menu>
- <menu label="編集" name="Edit">
- <menu_item_call label="å…ƒã«æˆ»ã™" name="Undo"/>
- <menu_item_call label="やり直ã—" name="Redo"/>
- <menu_item_call label="切りå–り" name="Cut"/>
- <menu_item_call label="コピー" name="Copy"/>
- <menu_item_call label="貼り付ã‘" name="Paste"/>
- <menu_item_call label="削除" name="Delete"/>
- <menu_item_call label="複製" name="Duplicate"/>
- <menu_item_call label="ã™ã¹ã¦é¸æŠž" name="Select All"/>
- <menu_item_call label="é¸æŠžè§£é™¤" name="Deselect"/>
- </menu>
<menu_item_call label="リンク" name="Link"/>
<menu_item_call label="リンクを外ã™" name="Unlink"/>
+ <menu_item_check label="リンクã—ãŸéƒ¨åˆ†ã‚’編集" name="Edit Linked Parts"/>
+ <menu label="リンクã—ãŸéƒ¨åˆ†ã‚’é¸æŠžã™ã‚‹" name="Select Linked Parts">
+ <menu_item_call label="次ã®éƒ¨åˆ†ã‚’é¸æŠžã™ã‚‹" name="Select Next Part"/>
+ <menu_item_call label="å‰å›žã®éƒ¨åˆ†ã‚’é¸æŠžã™ã‚‹" name="Select Previous Part"/>
+ <menu_item_call label="次ã®éƒ¨åˆ†ã‚’å«ã‚ã‚‹" name="Include Next Part"/>
+ <menu_item_call label="å‰å›žã®éƒ¨åˆ†ã‚’å«ã‚ã‚‹" name="Include Previous Part"/>
+ </menu>
<menu_item_call label="é¸æŠžã—ãŸã‚‚ã®ã«ç„¦ç‚¹ã‚’åˆã‚ã›ã‚‹" name="Focus on Selection"/>
<menu_item_call label="é¸æŠžã—ãŸã‚‚ã®ã‚’ズームã™ã‚‹" name="Zoom to Selection"/>
<menu label="オブジェクト" name="Object">
- <menu_item_call label="è²·ã†" name="Menu Object Take"/>
+ <menu_item_call label="è²·ã†" name="Menu Object Buy"/>
+ <menu_item_call label="å–ã‚‹" name="Menu Object Take"/>
<menu_item_call label="コピーをå–ã‚‹" name="Take Copy"/>
- <menu_item_call label="「マイ æŒã¡ç‰©ã€ã«ä¿å­˜" name="Save Object Back to My Inventory"/>
+ <menu_item_call label="「æŒã¡ç‰©ã€ã«ä¿å­˜" name="Save Object Back to My Inventory"/>
<menu_item_call label="オブジェクトã®ä¸­èº«ã«ä¿å­˜" name="Save Object Back to Object Contents"/>
</menu>
<menu label="スクリプト" name="Scripts">
@@ -90,62 +94,55 @@
<menu_item_call label="ã‚¹ã‚¯ãƒªãƒ—ãƒˆã‚’å®Ÿè¡Œåœæ­¢ã«ã™ã‚‹" name="Set Scripts to Not Running"/>
</menu>
<menu label="オプション" name="Options">
- <menu_item_check label="リンク部ä½ã‚’編集" name="Edit Linked Parts"/>
- <menu_item_call label="デフォルトã®ã‚¢ãƒƒãƒ—ロード権é™ã‚’設定" name="perm prefs"/>
- <menu_item_check label="権é™ã®è©³ç´°ã‚’表示" name="DebugPermissions"/>
- <menu label="é¸æŠž" name="Selection">
- <menu_item_check label="ç§ã®ã‚ªãƒ–ジェクトã ã‘ã‚’é¸æŠž" name="Select Only My Objects"/>
- <menu_item_check label="動的オブジェクトã®ã¿é¸æŠž" name="Select Only Movable Objects"/>
- <menu_item_check label="環境ã§é¸æŠž" name="Select By Surrounding"/>
- </menu>
- <menu label="表示" name="Show">
- <menu_item_check label="éžè¡¨ç¤ºã®é¸æŠžã‚’表示" name="Show Hidden Selection"/>
- <menu_item_check label="é¸æŠžã—ãŸå…‰ã®åŠå¾„範囲を表示" name="Show Light Radius for Selection"/>
- <menu_item_check label="é¸æŠžãƒ“ãƒ¼ãƒ ã‚’è¡¨ç¤º" name="Show Selection Beam"/>
- </menu>
- <menu label="グリッド" name="Grid">
- <menu_item_check label="グリッドãƒã‚¤ãƒ³ãƒˆã«ã‚¹ãƒŠãƒƒãƒ—" name="Snap to Grid"/>
- <menu_item_call label="オブジェクトã®XY軸をグリッドã«ã‚¹ãƒŠãƒƒãƒ—" name="Snap Object XY to Grid"/>
- <menu_item_call label="é¸æŠžã‚’ã‚°ãƒªãƒƒãƒ‰ã«ä½¿ç”¨" name="Use Selection for Grid"/>
- <menu_item_call label="グリッドオプション" name="Grid Options"/>
- </menu>
- </menu>
- <menu label="リンクã—ãŸéƒ¨åˆ†ã‚’é¸æŠž" name="Select Linked Parts">
- <menu_item_call label="次ã®éƒ¨ä½ã‚’é¸æŠž" name="Select Next Part"/>
- <menu_item_call label="å‰å›žã®éƒ¨ä½ã‚’é¸æŠž" name="Select Previous Part"/>
- <menu_item_call label="次ã®éƒ¨ä½ã‚’å«ã‚ã‚‹" name="Include Next Part"/>
- <menu_item_call label="å‰å›žã®éƒ¨ä½ã‚’å«ã‚ã‚‹" name="Include Previous Part"/>
+ <menu_item_call label="デフォルトã®ã‚¢ãƒƒãƒ—ロード権é™ã‚’設定ã™ã‚‹" name="perm prefs"/>
+ <menu_item_check label="権é™ã®è©³ç´°ã‚’表示ã™ã‚‹" name="DebugPermissions"/>
+ <menu_item_check label="ç§ã®ã‚ªãƒ–ジェクトã ã‘ã‚’é¸æŠžã™ã‚‹" name="Select Only My Objects"/>
+ <menu_item_check label="動的オブジェクトã ã‘ã‚’é¸æŠžã™ã‚‹" name="Select Only Movable Objects"/>
+ <menu_item_check label="ç¯„å›²å†…ã‚’é¸æŠžã™ã‚‹" name="Select By Surrounding"/>
+ <menu_item_check label="隠れãŸä½ç½®ã®é¸æŠžã‚‚表示ã™ã‚‹" name="Show Hidden Selection"/>
+ <menu_item_check label="é¸æŠžã—ãŸå…‰ã®åŠå¾„範囲を表示ã™ã‚‹" name="Show Light Radius for Selection"/>
+ <menu_item_check label="é¸æŠžãƒ“ãƒ¼ãƒ ã‚’è¡¨ç¤ºã™ã‚‹" name="Show Selection Beam"/>
+ <menu_item_check label="グリッドãƒã‚¤ãƒ³ãƒˆã«ã‚¹ãƒŠãƒƒãƒ—ã™ã‚‹" name="Snap to Grid"/>
+ <menu_item_call label="オブジェクト㮠XY 軸をグリッドã«ã‚¹ãƒŠãƒƒãƒ—ã™ã‚‹" name="Snap Object XY to Grid"/>
+ <menu_item_call label="é¸æŠžã‚’ã‚°ãƒªãƒƒãƒ‰ã«ä½¿ç”¨ã™ã‚‹" name="Use Selection for Grid"/>
+ <menu_item_call label="グリッドオプション" name="Grid Options"/>
+ </menu>
+ <menu label="アップロード" name="Upload">
+ <menu_item_call label="ç”»åƒï¼ˆL$[COST])..." name="Upload Image"/>
+ <menu_item_call label="サウンド(L$[COST])..." name="Upload Sound"/>
+ <menu_item_call label="アニメーション(L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="一括 (ファイルã«ã¤ãL$[COST])..." name="Bulk Upload"/>
</menu>
</menu>
<menu label="ヘルプ" name="Help">
<menu_item_call label="[SECOND_LIFE] ヘルプ" name="Second Life Help"/>
- <menu_item_call label="嫌ãŒã‚‰ã›ã‚’報告" name="Report Abuse"/>
- <menu_item_call label="ãƒã‚°å ±å‘Š" name="Report Bug"/>
+ <menu_item_call label="嫌ãŒã‚‰ã›ã‚’報告ã™ã‚‹" name="Report Abuse"/>
+ <menu_item_call label="ãƒã‚°ã‚’報告ã™ã‚‹" name="Report Bug"/>
<menu_item_call label="[APP_NAME] ã«ã¤ã„ã¦" name="About Second Life"/>
</menu>
<menu label="アドãƒãƒ³ã‚¹" name="Advanced">
- <menu_item_call label="ç§ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’åœæ­¢ã™ã‚‹" name="Stop Animating My Avatar"/>
- <menu_item_call label="テクスãƒãƒ£ã®ãƒªãƒ™ãƒ¼ã‚¯" name="Rebake Texture"/>
+ <menu_item_check label="アドãƒãƒ³ã‚¹ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‚’表示ã™ã‚‹" name="Show Advanced Menu"/>
+ <menu_item_call label="自分ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’åœæ­¢ã™ã‚‹" name="Stop Animating My Avatar"/>
+ <menu_item_call label="テクスãƒãƒ£ã®ãƒªãƒ™ãƒ¼ã‚¯ã‚’ã™ã‚‹" name="Rebake Texture"/>
<menu_item_call label="UI ã®ã‚µã‚¤ã‚ºã‚’デフォルトã«è¨­å®šã™ã‚‹" name="Set UI Size to Default"/>
- <menu_item_call label="ウィンドウã®ã‚µã‚¤ã‚ºã®è¨­å®šï¼š" name="Set Window Size..."/>
+ <menu_item_call label="ウィンドウã®ã‚µã‚¤ã‚ºã‚’設定ã™ã‚‹" name="Set Window Size..."/>
<menu_item_check label="é ãã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ãªã„" name="Limit Select Distance"/>
<menu_item_check label="カメラã®è·é›¢ç§»å‹•を制é™ã—ãªã„" name="Disable Camera Distance"/>
<menu_item_check label="高解åƒåº¦ã‚¹ãƒŠãƒƒãƒ—ショット" name="HighResSnapshot"/>
- <menu_item_check label="シャッター音ã¨ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ãªã—ã§ã‚¹ãƒŠãƒƒãƒ—ショットをディスクã«ä¿å­˜" name="QuietSnapshotsToDisk"/>
+ <menu_item_check label="シャッター音ã¨ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ãªã—ã§ã‚¹ãƒŠãƒƒãƒ—ショットをディスクã«ä¿å­˜ã™ã‚‹" name="QuietSnapshotsToDisk"/>
<menu_item_check label="圧縮ã—ã¦ã‚¹ãƒŠãƒƒãƒ—ショットをディスクã«ä¿å­˜ã™ã‚‹" name="CompressSnapshotsToDisk"/>
<menu label="パフォーマンスツール" name="Performance Tools">
<menu_item_call label="ラグ計測器" name="Lag Meter"/>
<menu_item_check label="統計ãƒãƒ¼" name="Statistics Bar"/>
- <menu_item_check label="ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã‚³ã‚¹ãƒˆã‚’表示" name="Avatar Rendering Cost"/>
+ <menu_item_check label="ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ¬ãƒ³ãƒ€ãƒªãƒ³ã‚°ã‚³ã‚¹ãƒˆã‚’表示ã™ã‚‹" name="Avatar Rendering Cost"/>
</menu>
<menu label="ãƒã‚¤ãƒ©ã‚¤ãƒˆã¨ç›®ã«è¦‹ãˆã‚‹ã‚‚ã®" name="Highlighting and Visibility">
<menu_item_check label="ãƒãƒ¼ã‚¸ãƒ¼ãƒ“ーコン" name="Cheesy Beacon"/>
<menu_item_check label="パーティクルをéžè¡¨ç¤ºã«ã™ã‚‹" name="Hide Particles"/>
<menu_item_check label="é¸æŠžã—ãŸã‚‚ã®ã‚’éžè¡¨ç¤ºã«ã™ã‚‹" name="Hide Selected"/>
- <menu_item_check label="逿˜Žéƒ¨åˆ†ã‚’ãƒã‚¤ãƒ©ã‚¤ãƒˆ" name="Highlight Transparent"/>
- <menu_item_check label="HUD を表示" name="Show HUD Attachments"/>
- <menu_item_check label="一人称視点ã®ã¨ãã«å字線を表示" name="ShowCrosshairs"/>
- <menu_item_check label="土地ã®ãƒ„ールãƒãƒƒãƒ—を表示" name="Land Tips"/>
+ <menu_item_check label="逿˜Žéƒ¨åˆ†ã‚’ãƒã‚¤ãƒ©ã‚¤ãƒˆã™ã‚‹" name="Highlight Transparent"/>
+ <menu_item_check label="HUD を表示ã™ã‚‹" name="Show HUD Attachments"/>
+ <menu_item_check label="一人称視点ã®ã¨ãã«å字線を表示ã™ã‚‹" name="ShowCrosshairs"/>
</menu>
<menu label="レンダリング(種類)" name="Rendering Types">
<menu_item_check label="シンプル" name="Simple"/>
@@ -173,23 +170,24 @@
<menu_item_check label="フレキシブルオブジェクト" name="Flexible Objects"/>
</menu>
<menu_item_check label="マルãƒã‚¹ãƒ¬ãƒƒãƒ‰å‡¦ç†" name="Run Multiple Threads"/>
+ <menu_item_check label="Use Plugin Read Thread" name="Use Plugin Read Thread"/>
<menu_item_call label="グループキャッシュã®ã‚¯ãƒªã‚¢" name="ClearGroupCache"/>
<menu_item_check label="マウスã®å¹³æ»‘化" name="Mouse Smoothing"/>
- <menu_item_check label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆã« IM を表示" name="IMInChat"/>
<menu label="ショートカット" name="Shortcuts">
+ <menu_item_call label="ç”»åƒ ï¼ˆL$ [COST] )..." name="Upload Image"/>
<menu_item_check label="検索" name="Search"/>
<menu_item_call label="キーをリリース" name="Release Keys"/>
- <menu_item_call label="UI ã®ã‚µã‚¤ã‚ºã‚’デフォルトã«è¨­å®š" name="Set UI Size to Default"/>
+ <menu_item_call label="UI ã®ã‚µã‚¤ã‚ºã‚’デフォルトã«è¨­å®šã™ã‚‹" name="Set UI Size to Default"/>
<menu_item_check label="常ã«èµ°ã‚‹" name="Always Run"/>
- <menu_item_check label="飛行" name="Fly"/>
+ <menu_item_check label="飛行ã™ã‚‹" name="Fly"/>
<menu_item_call label="ウィンドウを閉ã˜ã‚‹" name="Close Window"/>
<menu_item_call label="å…¨ã¦ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã‚‹" name="Close All Windows"/>
- <menu_item_call label="スナップショットをディスクã«ä¿å­˜" name="Snapshot to Disk"/>
+ <menu_item_call label="スナップショットをディスクã«ä¿å­˜ã™ã‚‹" name="Snapshot to Disk"/>
<menu_item_call label="一人称視点" name="Mouselook"/>
- <menu_item_check label="ジョイスティック・フライカム" name="Joystick Flycam"/>
- <menu_item_call label="表示をリセット" name="Reset View"/>
+ <menu_item_check label="ジョイスティックフライカム" name="Joystick Flycam"/>
+ <menu_item_call label="表示をリセットã™ã‚‹" name="Reset View"/>
<menu_item_call label="最後ã®ç™ºè¨€è€…を見る" name="Look at Last Chatter"/>
- <menu label="åˆ¶ä½œãƒ„ãƒ¼ãƒ«ã‚’é¸æŠž" name="Select Tool">
+ <menu label="åˆ¶ä½œãƒ„ãƒ¼ãƒ«ã‚’é¸æŠžã™ã‚‹" name="Select Tool">
<menu_item_call label="焦点ツール" name="Focus"/>
<menu_item_call label="移動ツール" name="Move"/>
<menu_item_call label="編集ツール" name="Edit"/>
@@ -197,12 +195,11 @@
<menu_item_call label="土地ツール" name="Land"/>
</menu>
<menu_item_call label="ズームイン" name="Zoom In"/>
- <menu_item_call label="ズーム・デフォルト" name="Zoom Default"/>
+ <menu_item_call label="ズーム(デフォルト)" name="Zoom Default"/>
<menu_item_call label="ズームアウト" name="Zoom Out"/>
- <menu_item_call label="全画é¢è¡¨ç¤º" name="Toggle Fullscreen"/>
</menu>
<menu_item_call label="デãƒãƒƒã‚°è¨­å®šã‚’表示ã™ã‚‹" name="Debug Settings"/>
- <menu_item_check label="開発メニューを表示" name="Debug Mode"/>
+ <menu_item_check label="開発メニューを表示ã™ã‚‹" name="Debug Mode"/>
</menu>
<menu label="開発" name="Develop">
<menu label="コンソール" name="Consoles">
@@ -210,7 +207,7 @@
<menu_item_check label="デãƒãƒƒã‚°ã‚³ãƒ³ã‚½ãƒ¼ãƒ«" name="Debug Console"/>
<menu_item_call label="通知コンソール" name="Notifications"/>
<menu_item_check label="テクスãƒãƒ£ã‚µã‚¤ã‚ºã®ã‚³ãƒ³ã‚½ãƒ¼ãƒ«" name="Texture Size"/>
- <menu_item_check label="テクスãƒãƒ£ã‚«ãƒ†ã‚´ãƒªãƒ»ã‚³ãƒ³ã‚½ãƒ¼ãƒ«" name="Texture Category"/>
+ <menu_item_check label="テクスãƒãƒ£ã‚«ãƒ†ã‚´ãƒªã®ã‚³ãƒ³ã‚½ãƒ¼ãƒ«" name="Texture Category"/>
<menu_item_check label="ファーストタイマー" name="Fast Timers"/>
<menu_item_check label="メモリ" name="Memory"/>
<menu_item_call label="リージョン情報をデãƒãƒƒã‚°ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã¸" name="Region Info to Debug Console"/>
@@ -219,28 +216,29 @@
<menu_item_check label="カメラ" name="Camera"/>
<menu_item_check label="風" name="Wind"/>
<menu_item_check label="FOV" name="FOV"/>
+ <menu_item_check label="ãƒãƒƒã‚¸" name="Badge"/>
</menu>
<menu label="情報を表示" name="Display Info">
- <menu_item_check label="時間を表示" name="Show Time"/>
- <menu_item_check label="æç”»æƒ…報を表示" name="Show Render Info"/>
- <menu_item_check label="マトリックスを表示" name="Show Matrices"/>
- <menu_item_check label="カーソルを乗ã›ãŸå ´æ‰€ã®è‰²ã‚’表示" name="Show Color Under Cursor"/>
- <menu_item_check label="オブジェクトã®ã‚¢ãƒƒãƒ—デートを表示" name="Show Updates"/>
+ <menu_item_check label="時間を表示ã™ã‚‹" name="Show Time"/>
+ <menu_item_check label="æç”»æƒ…報を表示ã™ã‚‹" name="Show Render Info"/>
+ <menu_item_check label="マトリックスを表示ã™ã‚‹" name="Show Matrices"/>
+ <menu_item_check label="カーソルを乗ã›ãŸå ´æ‰€ã®è‰²ã‚’表示ã™ã‚‹" name="Show Color Under Cursor"/>
+ <menu_item_check label="オブジェクトã®ã‚¢ãƒƒãƒ—デートを表示ã™ã‚‹" name="Show Updates"/>
</menu>
- <menu label="エラーを実行" name="Force Errors">
+ <menu label="エラー実行" name="Force Errors">
<menu_item_call label="ブレークãƒã‚¤ãƒ³ãƒˆ" name="Force Breakpoint"/>
- <menu_item_call label="LLError ã¨ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã‚’実行" name="Force LLError And Crash"/>
- <menu_item_call label="ãƒãƒƒãƒ‰ãƒ¡ãƒ¢ãƒªã‚¢ã‚¯ã‚»ã‚¹ã‚’実行" name="Force Bad Memory Access"/>
+ <menu_item_call label="LLError ã¨ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã‚’実行ã™ã‚‹" name="Force LLError And Crash"/>
+ <menu_item_call label="ãƒãƒƒãƒ‰ãƒ¡ãƒ¢ãƒªã‚¢ã‚¯ã‚»ã‚¹ã‚’実行ã™ã‚‹" name="Force Bad Memory Access"/>
<menu_item_call label="ç„¡é™ãƒ«ãƒ¼ãƒ—" name="Force Infinite Loop"/>
- <menu_item_call label="ドライãƒã®ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã‚’実行" name="Force Driver Carsh"/>
- <menu_item_call label="ソフトウェア例外エラーã®å®Ÿè¡Œ" name="Force Software Exception"/>
- <menu_item_call label="ãƒ“ãƒ¥ãƒ¼ãƒ¯ã®æŽ¥ç¶šé®æ–­ã‚’実行" name="Force Disconnect Viewer"/>
- <menu_item_call label="メモリリークã®ã‚·ãƒŸãƒ¥ãƒ¬ãƒ¼ãƒˆ" name="Memory Leaking Simulation"/>
+ <menu_item_call label="ドライãƒã®ã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã‚’実行ã™ã‚‹" name="Force Driver Carsh"/>
+ <menu_item_call label="ソフトウェア例外エラーã®å®Ÿè¡Œã™ã‚‹" name="Force Software Exception"/>
+ <menu_item_call label="ãƒ“ãƒ¥ãƒ¼ãƒ¯ã®æŽ¥ç¶šé®æ–­ã‚’実行ã™ã‚‹" name="Force Disconnect Viewer"/>
+ <menu_item_call label="メモリリークをシミュレートã™ã‚‹" name="Memory Leaking Simulation"/>
</menu>
<menu label="レンダーテスト" name="Render Tests">
<menu_item_check label="カメラオフセット" name="Camera Offset"/>
<menu_item_check label="フレームレートをランダム化" name="Randomize Framerate"/>
- <menu_item_check label="Periodic Slow Frame" name="Periodic Slow Frame"/>
+ <menu_item_check label="定期的ã«é…ã„フレームを挿入ã™ã‚‹" name="Periodic Slow Frame"/>
<menu_item_check label="フレームテスト" name="Frame Test"/>
</menu>
<menu label="メタデータã®ãƒ¬ãƒ³ãƒ€ãƒ¼" name="Render Metadata">
@@ -252,10 +250,10 @@
<menu_item_check label="アニメーション部分をテクスãƒãƒ£ã§è¡¨ç¤º" name="Texture Anim"/>
<menu_item_check label="テクスãƒãƒ£å„ªå…ˆåº¦" name="Texture Priority"/>
<menu_item_check label="テクスãƒãƒ£ã®ç¯„囲" name="Texture Area"/>
- <menu_item_check label="Face Area" name="Face Area"/>
+ <menu_item_check label="å´é¢" name="Face Area"/>
<menu_item_check label="å…‰" name="Lights"/>
<menu_item_check label="骨組ã¿ã®è¡çªåˆ¤å®š" name="Collision Skeleton"/>
- <menu_item_check label="Raycast" name="Raycast"/>
+ <menu_item_check label="レイキャスト" name="Raycast"/>
</menu>
<menu label="レンダリング" name="Rendering">
<menu_item_check label="軸" name="Axes"/>
@@ -263,10 +261,10 @@
<menu_item_call label="é¸æŠžã—ãŸãƒ†ã‚¯ã‚¹ãƒãƒ£æƒ…報基底" name="Selected Texture Info Basis"/>
<menu_item_check label="ワイヤーフレーム" name="Wireframe"/>
<menu_item_check label="オブジェクト間オクルージョン" name="Object-Object Occlusion"/>
- <menu_item_check label="フレームãƒãƒƒãƒ•ァ・オブジェクト" name="Framebuffer Objects"/>
+ <menu_item_check label="フレームãƒãƒƒãƒ•ァオブジェクト" name="Framebuffer Objects"/>
<menu_item_check label="é…延レンダリング" name="Deferred Rendering"/>
<menu_item_check label="グローãƒãƒ«ã‚¤ãƒ«ãƒŸãƒãƒ¼ã‚·ãƒ§ãƒ³" name="Global Illumination"/>
- <menu_item_check label="GLデãƒãƒƒã‚°" name="Debug GL"/>
+ <menu_item_check label="GL デãƒãƒƒã‚°" name="Debug GL"/>
<menu_item_check label="経路をデãƒãƒƒã‚°" name="Debug Pipeline"/>
<menu_item_check label="ファーストアルファ" name="Fast Alpha"/>
<menu_item_check label="アニメーションテクスãƒãƒ£" name="Animation Textures"/>
@@ -276,10 +274,10 @@
<menu_item_check label="テクスãƒãƒ£ã‚¢ãƒˆãƒ©ã‚¹" name="Texture Atlas"/>
<menu_item_check label="装ç€ã•れãŸå…‰æºã‚’æç”»ã™ã‚‹" name="Render Attached Lights"/>
<menu_item_check label="å–り付ã‘られãŸãƒ‘ーティクルをæç”»ã™ã‚‹" name="Render Attached Particles"/>
- <menu_item_check label="Hover Glow Objects" name="Hover Glow Objects"/>
+ <menu_item_check label="マウスオーãƒãƒ¼ã§å¼·èª¿è¡¨ç¤ºã™ã‚‹" name="Hover Glow Objects"/>
</menu>
<menu label="ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯" name="Network">
- <menu_item_check label="ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã‚’ä¸€æ™‚åœæ­¢" name="AgentPause"/>
+ <menu_item_check label="ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã‚’ä¸€æ™‚åœæ­¢ã™ã‚‹" name="AgentPause"/>
<menu_item_call label="メッセージログを有効ã«ã™ã‚‹" name="Enable Message Log"/>
<menu_item_call label="メッセージログを使用ä¸å¯ã«ã™ã‚‹" name="Disable Message Log"/>
<menu_item_check label="é€ŸåŠ›ãŒæŒ¿å…¥ã•れãŸã‚ªãƒ–ジェクト" name="Velocity Interpolate Objects"/>
@@ -297,9 +295,9 @@
</menu>
<menu label="世界" name="World">
<menu_item_check label="シムã®å¤ªé™½ã®è¨­å®šã‚’無視ã™ã‚‹" name="Sim Sun Override"/>
- <menu_item_check label="ビーコンã®å¼·èª¿è¡¨ç¤º" name="Cheesy Beacon"/>
+ <menu_item_check label="ビーコンを強調表示ã™ã‚‹" name="Cheesy Beacon"/>
<menu_item_check label="固定ã•れãŸå¤©æ°—" name="Fixed Weather"/>
- <menu_item_call label="リージョンオブジェクトã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’ダンプ" name="Dump Region Object Cache"/>
+ <menu_item_call label="リージョンオブジェクトã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’ダンプã™ã‚‹" name="Dump Region Object Cache"/>
</menu>
<menu label="UI" name="UI">
<menu_item_call label="Web ブラウザã®ãƒ†ã‚¹ãƒˆ" name="Web Browser Test"/>
@@ -310,7 +308,7 @@
<menu_item_call label="é¸æŠžã—ãŸã‚ªãƒ–ジェクト情報をプリント" name="Print Selected Object Info"/>
<menu_item_call label="エージェント情報をプリント" name="Print Agent Info"/>
<menu_item_call label="メモリ使用状æ³" name="Memory Stats"/>
- <menu_item_check label="ダブルクリックã—ãŸå ´æ‰€ã«è‡ªå‹•æ“作ã§ç§»å‹•" name="Double-ClickAuto-Pilot"/>
+ <menu_item_check label="ダブルクリックã—ãŸå ´æ‰€ã«è‡ªå‹•æ“作ã§ç§»å‹•ã™ã‚‹" name="Double-ClickAuto-Pilot"/>
<menu_item_check label="SelectMgr ã®ãƒ‡ãƒãƒƒã‚°" name="Debug SelectMgr"/>
<menu_item_check label="ダブルクリック" name="Debug Clicks"/>
<menu_item_check label="デãƒãƒƒã‚°è¡¨ç¤º" name="Debug Views"/>
@@ -320,15 +318,15 @@
<menu_item_check label="WindowProc ã®ãƒ‡ãƒãƒƒã‚°" name="Debug WindowProc"/>
</menu>
<menu label="XUI" name="XUI">
- <menu_item_call label="色ã®è¨­å®šã‚’æ›´æ–°" name="Reload Color Settings"/>
- <menu_item_call label="フォントテストを表示" name="Show Font Test"/>
+ <menu_item_call label="色ã®è¨­å®šã‚’æ›´æ–°ã™ã‚‹" name="Reload Color Settings"/>
+ <menu_item_call label="フォントテストを表示ã™ã‚‹" name="Show Font Test"/>
<menu_item_call label="XML ã‹ã‚‰èª­ã¿è¾¼ã‚€" name="Load from XML"/>
- <menu_item_call label="XML ã§ä¿å­˜" name="Save to XML"/>
- <menu_item_check label="XUI ãƒãƒ¼ãƒ ã‚’表示" name="Show XUI Names"/>
- <menu_item_call label="テスト用 IM ã‚’é€ä¿¡" name="Send Test IMs"/>
+ <menu_item_call label="XML ã§ä¿å­˜ã™ã‚‹" name="Save to XML"/>
+ <menu_item_check label="XUI ãƒãƒ¼ãƒ ã‚’表示ã™ã‚‹" name="Show XUI Names"/>
+ <menu_item_call label="テスト用 IM ã‚’é€ä¿¡ã™ã‚‹" name="Send Test IMs"/>
</menu>
<menu label="ã‚¢ãƒã‚¿ãƒ¼" name="Character">
- <menu label="ベークドテクスãƒãƒ£ã‚’å–å¾—" name="Grab Baked Texture">
+ <menu label="ベークドテクスãƒãƒ£ã‚’å–å¾—ã™ã‚‹" name="Grab Baked Texture">
<menu_item_call label="çž³" name="Iris"/>
<menu_item_call label="é ­" name="Head"/>
<menu_item_call label="上åŠèº«" name="Upper Body"/>
@@ -336,23 +334,23 @@
<menu_item_call label="スカート" name="Skirt"/>
</menu>
<menu label="キャラクターテスト" name="Character Tests">
- <menu_item_call label="容姿を XML ã«ä¿å­˜" name="Appearance To XML"/>
+ <menu_item_call label="容姿を XML ã«ä¿å­˜ã™ã‚‹" name="Appearance To XML"/>
<menu_item_call label="キャラクタジオメトリã®åˆ‡ã‚Šæ›¿ãˆ" name="Toggle Character Geometry"/>
<menu_item_call label="男性アãƒã‚¿ãƒ¼ã®ãƒ†ã‚¹ãƒˆ" name="Test Male"/>
<menu_item_call label="女性アãƒã‚¿ãƒ¼ã®ãƒ†ã‚¹ãƒˆ" name="Test Female"/>
<menu_item_call label="PG ã®ãƒˆã‚°ãƒ«" name="Toggle PG"/>
<menu_item_check label="é¸æŠžã‚¢ãƒã‚¿ãƒ¼è¨±å¯" name="Allow Select Avatar"/>
</menu>
- <menu_item_call label="Params をデフォルトã«å®Ÿè¡Œ" name="Force Params to Default"/>
+ <menu_item_call label="パラメータを強制的ã«ãƒ‡ãƒ•ォルトã«ã™ã‚‹" name="Force Params to Default"/>
<menu_item_check label="アニメーション情報" name="Animation Info"/>
- <menu_item_check label="アニメーションをスローモーション" name="Slow Motion Animations"/>
+ <menu_item_check label="スローモーションã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³" name="Slow Motion Animations"/>
<menu_item_check label="見ã¦ã„ã‚‹ã‚‚ã®ã‚’表示ã™ã‚‹" name="Show Look At"/>
<menu_item_check label="クリックã—ãŸå ´æ‰€ã‚’表示ã™ã‚‹" name="Show Point At"/>
<menu_item_check label="çµåˆéƒ¨ã®ã‚¢ãƒƒãƒ—デートã®ãƒ‡ãƒãƒƒã‚°" name="Debug Joint Updates"/>
<menu_item_check label="LOD を無効ã«ã™ã‚‹" name="Disable LOD"/>
<menu_item_check label="キャラクター Vis ã®ãƒ‡ãƒãƒƒã‚°" name="Debug Character Vis"/>
- <menu_item_check label="骨組ã¿ã®è¡çªåˆ¤å®šã‚’表示" name="Show Collision Skeleton"/>
- <menu_item_check label="エージェントã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚’表示" name="Display Agent Target"/>
+ <menu_item_check label="骨組ã¿ã®è¡çªåˆ¤å®šã‚’表示ã™ã‚‹" name="Show Collision Skeleton"/>
+ <menu_item_check label="エージェントã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆã‚’表示ã™ã‚‹" name="Display Agent Target"/>
--&gt;
<menu_item_call label="アタッãƒãƒ¡ãƒ³ãƒˆã‚’ダンプ" name="Dump Attachments"/>
<menu_item_call label="ã‚¢ãƒã‚¿ãƒ¼ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚’デãƒãƒƒã‚°" name="Debug Avatar Textures"/>
@@ -360,9 +358,9 @@
</menu>
<menu_item_check label="HTTP Texture" name="HTTP Textures"/>
<menu_item_call label="圧縮画åƒ" name="Compress Images"/>
- <menu_item_check label="Output Debug Minidump" name="Output Debug Minidump"/>
- <menu_item_check label="次回ã®èµ·å‹•時ã«ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’表示" name="Console Window"/>
- <menu_item_check label="管ç†è€…メニューを表示" name="View Admin Options"/>
+ <menu_item_check label="デãƒãƒƒã‚°ç”¨ã®ãƒŸãƒ‹ãƒ€ãƒ³ãƒ—を出力ã™ã‚‹" name="Output Debug Minidump"/>
+ <menu_item_check label="次回ã®èµ·å‹•時ã«ã‚³ãƒ³ã‚½ãƒ¼ãƒ«ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’表示ã™ã‚‹" name="Console Window"/>
+ <menu_item_check label="管ç†è€…メニューを表示ã™ã‚‹" name="View Admin Options"/>
<menu_item_call label="管ç†è€…ステータスã®å‘¼ã³å‡ºã—" name="Request Admin Options"/>
<menu_item_call label="管ç†è€…ステータス解除" name="Leave Admin Options"/>
</menu>
@@ -370,19 +368,19 @@
<menu label="Object">
<menu_item_call label="コピーをå–ã‚‹" name="Take Copy"/>
<menu_item_call label="ç§ã‚’所有者ã«ã™ã‚‹" name="Force Owner To Me"/>
- <menu_item_call label="所有者権é™ã®å®Ÿè¡Œ" name="Force Owner Permissive"/>
+ <menu_item_call label="所有者権é™ã‚’実行ã™ã‚‹" name="Force Owner Permissive"/>
<menu_item_call label="削除" name="Delete"/>
<menu_item_call label="ロック" name="Lock"/>
- <menu_item_call label="アセット ID ã‚’å–å¾—" name="Get Assets IDs"/>
+ <menu_item_call label="アセット ID ã‚’å–å¾—ã™ã‚‹" name="Get Assets IDs"/>
</menu>
<menu label="区画" name="Parcel">
<menu_item_call label="ç§ã‚’所有者ã«ã™ã‚‹" name="Owner To Me"/>
- <menu_item_call label="リンデンコンテンツã«è¨­å®š" name="Set to Linden Content"/>
- <menu_item_call label="パブリックã®åœŸåœ°ã‚’å–å¾—" name="Claim Public Land"/>
+ <menu_item_call label="リンデンコンテンツã«è¨­å®šã™ã‚‹" name="Set to Linden Content"/>
+ <menu_item_call label="パブリックã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹" name="Claim Public Land"/>
</menu>
<menu label="リージョン/地域" name="Region">
<menu_item_call label="一時アセットデータをダンプ" name="Dump Temp Asset Data"/>
- <menu_item_call label="リージョンã®çŠ¶æ…‹ã‚’ä¿å­˜" name="Save Region State"/>
+ <menu_item_call label="リージョンã®çŠ¶æ…‹ã‚’ä¿å­˜ã™ã‚‹" name="Save Region State"/>
</menu>
<menu_item_call label="グリッドツール" name="God Tools"/>
</menu>
diff --git a/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml
new file mode 100644
index 0000000000..0d8049bc0a
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit Wearable Context Menu">
+ <menu_item_call label="ç€ã‚‹" name="wear"/>
+ <menu_item_call label="追加" name="wear_add"/>
+ <menu_item_call label="å–り外ã™" name="take_off_or_detach"/>
+ <menu_item_call label="å–り外ã™" name="detach"/>
+ <context_menu label="è£…ç€ â–¶" name="wearable_attach_to"/>
+ <context_menu label="HUDã«è£…ç€ â–¶" name="wearable_attach_to_hud"/>
+ <menu_item_call label="å–り外ã™" name="take_off"/>
+ <menu_item_call label="編集" name="edit"/>
+ <menu_item_call label="オブジェクトã®ãƒ—ロフィール" name="object_profile"/>
+ <menu_item_call label="オリジナルを表示" name="show_original"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/ja/mime_types.xml b/indra/newview/skins/default/xui/ja/mime_types.xml
index 2f945b2010..54663a0367 100644
--- a/indra/newview/skins/default/xui/ja/mime_types.xml
+++ b/indra/newview/skins/default/xui/ja/mime_types.xml
@@ -2,13 +2,13 @@
<mimetypes name="default">
<widgetset name="web">
<label name="web_label">
- ウェブ・コンテンツ
+ Webコンテンツ
</label>
<tooltip name="web_tooltip">
- ã“ã“ã«ã‚¦ã‚§ãƒ–・コンテンツãŒã‚りã¾ã™ã€‚
+ ã“ã“ã«WebコンテンツãŒã‚りã¾ã™ã€‚
</tooltip>
<playtip name="web_playtip">
- ウェブ・コンテンツを表示
+ Webコンテンツを表示
</playtip>
</widgetset>
<widgetset name="movie">
@@ -119,7 +119,7 @@
</mimetype>
<mimetype name="application/xhtml+xml">
<label name="application/xhtml+xml_label">
- ウェブ・ページ (XHTML)
+ Webページ (XHTML)
</label>
</mimetype>
<mimetype name="application/x-director">
@@ -184,7 +184,7 @@
</mimetype>
<mimetype menu="1" name="text/html">
<label name="text/html_label">
- ウェブ・ページ
+ Webページ
</label>
</mimetype>
<mimetype menu="1" name="text/plain">
diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml
index b502fb2e6e..42f8ccbb32 100644
--- a/indra/newview/skins/default/xui/ja/notifications.xml
+++ b/indra/newview/skins/default/xui/ja/notifications.xml
@@ -11,18 +11,29 @@
</global>
<template name="okbutton">
<form>
- <button name="OK" text="$yestext"/>
+ <button name="OK_okbutton" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okignore">
+ <form>
+ <button name="OK_okignore" text="$yestext"/>
</form>
</template>
- <template name="okignore"/>
<template name="okcancelbuttons">
<form>
- <button name="Cancel" text="$notext"/>
+ <button name="OK_okcancelbuttons" text="$yestext"/>
+ <button name="Cancel_okcancelbuttons" text="$notext"/>
+ </form>
+ </template>
+ <template name="okcancelignore">
+ <form>
+ <button name="OK_okcancelignore" text="$yestext"/>
+ <button name="Cancel_okcancelignore" text="$notext"/>
</form>
</template>
- <template name="okcancelignore"/>
<template name="okhelpbuttons">
<form>
+ <button name="OK_okhelpbuttons" text="$yestext"/>
<button name="Help" text="$helptext"/>
</form>
</template>
@@ -30,16 +41,17 @@
<form>
<button name="Yes" text="$yestext"/>
<button name="No" text="$notext"/>
+ <button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
</form>
</template>
<notification functor="GenericAcknowledge" label="䏿˜Žã®é€šçŸ¥ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸" name="MissingAlert">
ã‚ãªãŸã® [APP_NAME] ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ä»Šå—ã‘å–ã£ãŸé€šçŸ¥ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 最新ビューワãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã‹ã”確èªãã ã•ã„。
-エラー詳細: 「[_NAME]ã€ã¨ã„ã†é€šçŸ¥ã¯ notifications.xml ã«ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚
+エラー詳細: 「 [_NAME] ã€ã¨ã„ã†é€šçŸ¥ã¯ notifications.xml ã«ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="FloaterNotFound">
- フロータ・エラー:下記ã®ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸï¼š
+ フロータエラー:下記ã®ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸï¼š
[CONTROLS]
<usetemplate name="okbutton" yestext="OK"/>
</notification>
@@ -69,29 +81,38 @@
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="WearableSave">
- ç¾åœ¨ã®è¡£æœ/ボディーパーツã®å¤‰æ›´ã‚’ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ
+ ç¾åœ¨ã®è¡£é¡žã€èº«ä½“部ä½ã®å¤‰æ›´ã‚’ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="ä¿å­˜ã—ãªã„" yestext="ä¿å­˜"/>
</notification>
<notification name="CompileQueueSaveText">
- 次ã®ç†ç”±ã§ã€ã‚¹ã‚¯ãƒªãƒ—ト用テキストã®ã‚¢ãƒƒãƒ—ロード時ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON] 後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
+ 次ã®ç†ç”±ã§ã€ã‚¹ã‚¯ãƒªãƒ—ト用テキストã®ã‚¢ãƒƒãƒ—ロード時ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚
+[REASON]
+後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="CompileQueueSaveBytecode">
- 次ã®ç†ç”±ã§ã€ã‚³ãƒ³ãƒ‘イルã—ãŸã‚¹ã‚¯ãƒªãƒ—トã®ã‚¢ãƒƒãƒ—ロード時ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON]後ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
+ 次ã®ç†ç”±ã§ã€ã‚³ãƒ³ãƒ‘イルã—ãŸã‚¹ã‚¯ãƒªãƒ—トã®ã‚¢ãƒƒãƒ—ロード時ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚
+[REASON]
+後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="WriteAnimationFail">
ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ãƒ‡ãƒ¼ã‚¿ã®æ›¸ãè¾¼ã¿ã«å•題ãŒã‚りã¾ã™ã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="UploadAuctionSnapshotFail">
- 次ã®ç†ç”±ã§ã€ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã®ã‚¹ãƒŠãƒƒãƒ—ショットã®ã‚¢ãƒƒãƒ—ロード時ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚ [REASON]
+ 次ã®ç†ç”±ã§ã€ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã®ã‚¹ãƒŠãƒƒãƒ—ショットã®ã‚¢ãƒƒãƒ—ロード時ã«å•題ãŒèµ·ã“りã¾ã—ãŸã€‚
+[REASON]
</notification>
<notification name="UnableToViewContentsMoreThanOne">
- 一度ã«è¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯è¡¨ç¤ºã§ãã¾ã›ã‚“。
-é¸æŠžã™ã‚‹ã‚¢ã‚¤ãƒ†ãƒ ã‚’1ã¤ã ã‘ã«ã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
+ 一度ã«è¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ä¸­èº«ã‚’表示ã§ãã¾ã›ã‚“。
+アイテムを 1 ã¤ã ã‘é¸æŠžã—ã¦ã€ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="SaveClothingBodyChanges">
- è¡£æœï¼èº«ä½“部ä½ã«å¯¾ã™ã‚‹å¤‰æ›´ã‚’ã™ã¹ã¦ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ
+ è¡£æœã€èº«ä½“部ä½ã«å¯¾ã™ã‚‹å¤‰æ›´ã‚’ã™ã¹ã¦ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ä¿å­˜ã—ãªã„" yestext="ã™ã¹ã¦ä¿å­˜"/>
</notification>
+ <notification name="FriendsAndGroupsOnly">
+ フレンド以外ã‹ã‚‰ã®ã‚³ãƒ¼ãƒ«ã‚„インスタントメッセージを無視ã™ã‚‹è¨­å®šã«ã—ãŸã“ã¨ã‚’ã€ç›¸æ‰‹ã«çŸ¥ã‚‰ã‚Œã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="GrantModifyRights">
他人ã«ä¿®æ­£æ¨©é™ã‚’与ãˆã‚‹ã¨ã€æ¨©é™ã‚’与ãˆã‚‰ã‚ŒãŸäººã¯ã‚ãªãŸãŒæ‰€æœ‰ã™ã‚‹ã‚¤ãƒ³ãƒ¯ãƒ¼ãƒ«ãƒ‰ã®ã‚ªãƒ–ジェクトを変更ã€å‰Šé™¤ã€æŒã¡å¸°ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®æ¨©é™ã‚’与ãˆã‚‹éš›ã«ã¯ååˆ†ã«æ³¨æ„ã—ã¦ãã ã•ã„。
[FIRST_NAME] [LAST_NAME] ã«ä¿®æ­£æ¨©é™ã‚’与ãˆã¾ã™ã‹ï¼Ÿ
@@ -103,7 +124,7 @@
<usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="RevokeModifyRights">
- [FIRST_NAME] [LAST_NAME]ã«å¯¾ã—ã¦å¤‰æ›´æ¨©é™ã‚’å–り消ã—ã¾ã™ã‹ï¼Ÿ
+ [FIRST_NAME] [LAST_NAME] ã«å¯¾ã—ã¦å¤‰æ›´æ¨©é™ã‚’å–り消ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="RevokeModifyRightsMultiple">
@@ -125,28 +146,27 @@
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AddGroupOwnerWarning">
- ã‚ãªãŸã¯ [ROLE_NAME]ã®å½¹å‰²ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’与ãˆã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚
+ ã‚ãªãŸã¯ [ROLE_NAME] ã®å½¹å‰²ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’与ãˆã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚
任命ã•れãŸãƒ¡ãƒ³ãƒãƒ¼ãŒè‡ªã‚‰é€€ä»»ã—ãªã„é™ã‚Šã€
-彼らを役柄ã‹ã‚‰å‰Šé™¤ã§ãã¾ã›ã‚“。
+役柄ã‹ã‚‰å‰Šé™¤ã§ãã¾ã›ã‚“。
æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="グループオーナーを新ã—ã追加ã™ã‚‹å‰ã«ç¢ºèª" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
+ <usetemplate ignoretext="グループオーナーを新ã—ã追加ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="AssignDangerousActionWarning">
- ã‚ãªãŸã¯[ROLE_NAME]ã« [ACTION_NAME]ã®èƒ½åŠ›ã‚’
+ ã‚ãªãŸã¯ [ROLE_NAME] ã« [ACTION_NAME] ã®èƒ½åŠ›ã‚’
与ãˆã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚
*警告*
ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€
自分ã¨ä»–ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ç¾åœ¨ã‚ˆã‚Šå¼·åŠ›ãªæ¨©é™ã‚’割り当ã¦ã€
-自分をオーナーã¨ã»ã¼åŒæ§˜ã®ç«‹å ´ã«
-任命ã™ã‚‹ã“ã¨ã‚‚ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ ã“ã®è¡Œç‚ºã®æ„味をよãç†è§£ã—ã¦ã‹ã‚‰
-実行ã—ã¦ãã ã•ã„。
+自分をオーナーã¨ã»ã¼åŒæ§˜ã®ç«‹å ´ã«ä»»å‘½ã™ã‚‹ã“ã¨ã‚‚ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚
+ã“ã®è¡Œç‚ºã®æ„味をよãç†è§£ã—ã¦ã‹ã‚‰å®Ÿè¡Œã—ã¦ãã ã•ã„。
-ã“ã®èƒ½åŠ›ã‚’[ROLE_NAME]ã«å‰²ã‚Šå½“ã¦ã¾ã™ã‹ï¼Ÿ
+ã“ã®èƒ½åŠ›ã‚’ [ROLE_NAME] ã«å‰²ã‚Šå½“ã¦ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="AssignDangerousAbilityWarning">
- ã‚ãªãŸã¯[ROLE_NAME]ã« [ACTION_NAME]ã®èƒ½åŠ›ã‚’
+ ã‚ãªãŸã¯ [ROLE_NAME] ã« [ACTION_NAME] ã®èƒ½åŠ›ã‚’
与ãˆã‚ˆã†ã¨ã—ã¦ã„ã¾ã™ã€‚
*警告*
@@ -154,97 +174,99 @@
自分ã¨ä»–ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ã™ã¹ã¦ã®èƒ½åŠ›ã‚’å‰²ã‚Šå½“ã¦ã€
自分をオーナーã¨ã»ã¼åŒæ§˜ã®ç«‹å ´ã«ä»»å‘½ã§ãã¾ã™ã€‚
-ã“ã®èƒ½åŠ›ã‚’[ROLE_NAME]ã«å‰²ã‚Šå½“ã¦ã¾ã™ã‹ï¼Ÿ
+ã“ã®èƒ½åŠ›ã‚’ [ROLE_NAME] ã«å‰²ã‚Šå½“ã¦ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="AttachmentDrop">
アタッãƒãƒ¡ãƒ³ãƒˆã‚’下ã«ç½®ã“ã†ã¨ã—ã¦ã„ã¾ã™ã€‚
ç¶šã‘ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="アタッãƒãƒ¡ãƒ³ãƒˆã‚’下ã«è½ã¨ã™å‰ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
- </notification>
- <notification name="ClickUnimplemented">
- 申ã—訳ã‚りã¾ã›ã‚“ãŒã€ã¾ã æœªå®Ÿè£…ã§ã™ã€‚
+ <usetemplate ignoretext="アタッãƒãƒ¡ãƒ³ãƒˆã‚’下ã«è½ã¨ã™å‰ã®ç¢ºèª" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="JoinGroupCanAfford">
- ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã«ã¯ã€L$[COST]ã‹ã‹ã‚Šã¾ã™ã€‚
+ ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã«ã¯ã€L$ [COST] ã‹ã‹ã‚Šã¾ã™ã€‚
続行ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="å‚加"/>
</notification>
+ <notification name="JoinGroupNoCost">
+ [NAME] ã¨ã„ã†ã‚°ãƒ«ãƒ¼ãƒ—ã«å…¥ã‚ã†ã¨ã—ã¦ã„ã¾ã™ã€‚
+ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="å‚加"/>
+ </notification>
<notification name="JoinGroupCannotAfford">
- ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«åŠ å…¥ã™ã‚‹ã«ã¯ã€L$[COST]å¿…è¦ã§ã™ã€‚
-L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«åŠ å…¥ã™ã‚‹ã«ã¯ã€L$ [COST] å¿…è¦ã§ã™ã€‚
+L$ ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
</notification>
<notification name="CreateGroupCost">
- ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—を作るã«ã¯ L$100 ã‹ã‹ã‚Šã¾ã™ã€‚
+ ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—を作るã«ã¯ L$ 100 ã‹ã‹ã‚Šã¾ã™ã€‚
一人ã§ã¯ã‚°ãƒ«ãƒ¼ãƒ—ã«ãªã‚‰ãªã„ã®ã§ã€æ°¸ä¹…ã«å‰Šé™¤ã•れã¦ã—ã¾ã„ã¾ã™ã€‚
48 時間以内ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’勧誘ã—ã€å…¥ä¼šã—ã¦ã‚‚らã£ã¦ãã ã•ã„。
<usetemplate canceltext="キャンセル" name="okcancelbuttons" notext="キャンセル" yestext="L$100 ã§ã‚°ãƒ«ãƒ¼ãƒ—を作æˆ"/>
</notification>
<notification name="LandBuyPass">
- L$[COST]ã§ [TIME]時間ã“ã®åœŸåœ°[PARCEL_NAME]ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+ L$ [COST] ã§ [TIME] 時間 [PARCEL_NAME] ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
入場許å¯ã‚’購入ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="SalePriceRestriction">
ä¸ç‰¹å®šã®äººã«å£²å´ã™ã‚‹å ´åˆã«ã¯ã€
-売å´ä¾¡æ ¼ã¯L$0以上ã«è¨­å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
-売å´ä¾¡æ ¼ã‚’L$0ã«è¨­å®šã™ã‚‹å ´åˆã¯ã€
+売å´ä¾¡æ ¼ã¯L$ 0 以上ã«è¨­å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
+売å´ä¾¡æ ¼ã‚’L$ 0 ã«è¨­å®šã™ã‚‹å ´åˆã¯ã€
売å´ã™ã‚‹å€‹äººã‚’é¸æŠžã—ã¦ãã ã•ã„。
</notification>
<notification name="ConfirmLandSaleChange">
- é¸æŠžã•れãŸ[LAND_SIZE]平方メートルã®åœŸåœ°ã¯ã€å£²ã‚Šå‡ºã—中ã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚
-売å´ä¾¡æ ¼L$[SALE_PRICE]ã§ã€[NAME]ã«å£²å´ã‚’èªå¯ã—ã¾ã™ã€‚
+ é¸æŠžã—㟠[LAND_SIZE] 平方メートルã®åœŸåœ°ã¯ã€å£²ã‚Šå‡ºã—中ã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚
+売å´ä¾¡æ ¼ L$ [SALE_PRICE] ã§ã€[NAME] ã«å£²å´ã‚’èªå¯ã—ã¾ã™ã€‚
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="ConfirmLandSaleToAnyoneChange">
注æ„: 「誰ã«ã§ã‚‚販売ã€ã‚’クリックã™ã‚‹ã“ã¨ã§ã€ã‚ãªãŸã®åœŸåœ°ã¯ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ã„る人ã«é™ã‚‰ãš [SECOND_LIFE] コミュニティ全体ã§åˆ©ç”¨å¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚
é¸æŠžã—㟠[LAND_SIZE] 平方メートルã®åœŸåœ°ã¯ã€è²©å£²å¯¾è±¡ã«è¨­å®šã•れã¾ã—ãŸã€‚
-販売価格 L$[SALE_PRICE] ã§ã€[NAME] ãŒè²©å£²å¯¾è±¡è€…ã¨ãªã‚Šã¾ã™ã€‚
+販売価格 L$ [SALE_PRICE] ã§ã€[NAME] ãŒè²©å£²å¯¾è±¡è€…ã¨ãªã‚Šã¾ã™ã€‚
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ReturnObjectsDeededToGroup">
- ã“ã®åŒºç”»ã®ã‚°ãƒ«ãƒ¼ãƒ—[NAME]共有ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトをã€ä»¥å‰ã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚
+ ã“ã®åŒºç”»ã®ã‚°ãƒ«ãƒ¼ãƒ— [NAME] 共有ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトをã€ä»¥å‰ã®æ‰€æœ‰è€…ã®ã€ŒæŒã¡ç‰©ã€ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚
æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
*警告* ã“れã«ã‚ˆã‚Šã€
-グループã«è­²æ¸¡ã•れãŸè­²æ¸¡ä¸å¯èƒ½ãªã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼
+グループã«è­²æ¸¡ã•れãŸã€Œå†è²©ãƒ»ãƒ—レゼントä¸å¯ã€ã®ã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼
オブジェクト: [N]
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="ReturnObjectsOwnedByUser">
ã“ã®åŒºç”»ã§ã€
-ä½äºº[NAME]ãŒæ‰€æœ‰ã™ã‚‹å…¨ã¦ã®ã‚ªãƒ–ジェクトを
-å½¼ã‚‰ã®æŒã¡ç‰©ã«æœ¬å½“ã«è¿”å´ã—ã¦ã‚‚よã„ã§ã™ã‹ï¼Ÿ
+ä½äºº [NAME] ãŒæ‰€æœ‰ã™ã‚‹å…¨ã¦ã®ã‚ªãƒ–ジェクトを
+本人ã®ã€ŒæŒã¡ç‰©ã€ã«æœ¬å½“ã«è¿”å´ã—ã¦ã‚‚よã„ã§ã™ã‹ï¼Ÿ
オブジェクト: [N]
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="ReturnObjectsOwnedBySelf">
ã“ã®åœŸåœ°åŒºç”»å†…ã«ã‚ã‚‹ã€ã‚ãªãŸãŒæ‰€æœ‰ã™ã‚‹ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトをã€
-ã‚ãªãŸã®æŒã¡ç‰©ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
+ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚ç¶šã‘ã¾ã™ã‹ï¼Ÿ
オブジェクト: [N]
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="ReturnObjectsNotOwnedBySelf">
ã“ã®åœŸåœ°åŒºç”»å†…ã«ã‚ã‚‹ã€ã‚ãªãŸä»¥å¤–ãŒæ‰€æœ‰ã™ã‚‹ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトをã€
-ãれãžã‚Œã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚
+ãれãžã‚Œã®æ‰€æœ‰è€…ã®ã€ŒæŒã¡ç‰©ã€ã«æˆ»ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚
æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
-グループã«è­²æ¸¡ã•れãŸè­²æ¸¡å¯èƒ½ã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•れã¾ã™ã€‚
+グループã«è­²æ¸¡ã•れãŸã€Œå†è²©ãƒ»ãƒ—レゼントå¯ã€ã®ã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®æ‰€æœ‰è€…ã«è¿”å´ã•れã¾ã™ã€‚
*警告* ã“れã«ã‚ˆã‚Šã€
-グループã«è­²æ¸¡ã•れãŸè­²æ¸¡ä¸å¯èƒ½ãªã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼
+グループã«è­²æ¸¡ã•れãŸã€Œå†è²©ãƒ»ãƒ—レゼントä¸å¯ã€ã®ã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼
オブジェクト: [N]
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="ReturnObjectsNotOwnedByUser">
ã“ã®åœŸåœ°åŒºç”»å†…ã«ã‚ã‚‹ã€
-[NAME]以外ã«ã‚ˆã‚‹æ‰€æœ‰ã®ã‚ªãƒ–ジェクトをã™ã¹ã¦ãれãžã‚Œã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«è¿”å´ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
-æ“作を続行ã—ã¾ã™ã‹ï¼Ÿã‚°ãƒ«ãƒ¼ãƒ—ã«è­²æ¸¡ã•れãŸè­²æ¸¡å¯èƒ½ã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•れã¾ã™ã€‚
+[NAME]以外ã«ã‚ˆã‚‹æ‰€æœ‰ã®ã‚ªãƒ–ジェクトをã™ã¹ã¦ãれãžã‚Œã®æ‰€æœ‰è€…ã®ã€ŒæŒã¡ç‰©ã€ã«è¿”å´ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
+æ“作を続行ã—ã¾ã™ã‹ï¼Ÿã‚°ãƒ«ãƒ¼ãƒ—ã«è­²æ¸¡ã•れãŸã€Œå†è²©ãƒ»ãƒ—レゼントå¯ã€ã®ã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®æ‰€æœ‰è€…ã«è¿”å´ã•れã¾ã™ã€‚
*警告* ã“れã«ã‚ˆã‚Šã€
-グループã«è­²æ¸¡ã•れãŸè­²æ¸¡ä¸å¯èƒ½ãªã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼
+グループã«è­²æ¸¡ã•れãŸã€Œå†è²©ãƒ»ãƒ—レゼントä¸å¯ã€ã®ã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼
オブジェクト: [N]
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
@@ -253,43 +275,42 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="DisableAllTopObjects">
- ã“ã®åœ°åŸŸå†…ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトを無効ã«ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰å†…ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトを無効ã«ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="ReturnObjectsNotOwnedByGroup">
- ã“ã®åœŸåœ°ã®åŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã‚°ãƒ«ãƒ¼ãƒ—[NAME]
-ã¨ã®é–“ã§å…±æœ‰ã—ã¦ã„ãªã„オブジェクトをオーナーã«è¿”å´ã—ã¾ã™ã‹ï¼Ÿ
+ ã“ã®åœŸåœ°ã®åŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã‚°ãƒ«ãƒ¼ãƒ— [NAME] ã¨ã®é–“ã§å…±æœ‰ã—ã¦ã„ãªã„オブジェクトを所有者ã«è¿”å´ã—ã¾ã™ã‹ï¼Ÿ
オブジェクト: [N]
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="UnableToDisableOutsideScripts">
スクリプトを無効ã«ã§ãã¾ã›ã‚“。
-ã“ã®åœ°åŸŸå…¨ä½“ãŒã€Œãƒ€ãƒ¡ãƒ¼ã‚¸æœ‰åйã€ã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚
+ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰å…¨ä½“ãŒã€Œãƒ€ãƒ¡ãƒ¼ã‚¸æœ‰åйã€ã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚
武器を使用ã™ã‚‹ã«ã¯ã‚¹ã‚¯ãƒªãƒ—トã®å®Ÿè¡Œã‚’許å¯ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
</notification>
<notification name="MultipleFacesSelected">
ç¾åœ¨è¤‡æ•°ã®é¢ãŒé¸æŠžã•れã¦ã„ã¾ã™ã€‚
ã“ã®ã¾ã¾ç¶šã‘ãŸå ´åˆã€ãƒ¡ãƒ‡ã‚£ã‚¢ã®åˆ¥ã€…ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ãŒã‚ªãƒ–ジェクトã®è¤‡æ•°ã®é¢ã«è¨­å®šã•れã¾ã™ã€‚
メディアを 1 ã¤ã®é¢ã ã‘ã«å–り付ã‘ã‚‹ã«ã¯ã€ã€Œé¢ã‚’é¸æŠžã€ã‚’é¸ã‚“ã§ã‚ªãƒ–ジェクトã®å¸Œæœ›ã™ã‚‹é¢ã‚’クリックã€ãれã‹ã‚‰ã€Œè¿½åŠ ã€ã‚’クリックã—ã¦ãã ã•ã„。
- <usetemplate ignoretext="メディアã¯é¸æŠžã—ãŸè¤‡æ•°ã®é¢ã«ã‚»ãƒƒãƒˆã•れã¾ã™ã€‚" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ <usetemplate ignoretext="メディアãŒé¸æŠžã—ãŸè¤‡æ•°ã®é¢ã«ã‚»ãƒƒãƒˆã•れるã¨ã" name="okcancelignore" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="MustBeInParcel">
ç€åœ°ç‚¹ã‚’設定ã™ã‚‹ã«ã¯ã€ã“ã®åŒºç”»ã®å†…å´ã«
ç«‹ã£ã¦ãã ã•ã„。
</notification>
<notification name="PromptRecipientEmail">
- å—ä¿¡è€…ã®æœ‰åйãªEメールアドレスを入力ã—ã¦ãã ã•ã„。
+ å—ä¿¡è€…ã®æœ‰åйãªãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’入力ã—ã¦ãã ã•ã„。
</notification>
<notification name="PromptSelfEmail">
- ã‚ãªãŸã®Eメール・アドレスを入力ã—ã¦ãã ã•ã„。
+ ã‚ãªãŸã®ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’入力ã—ã¦ãã ã•ã„。
</notification>
<notification name="PromptMissingSubjMsg">
デフォルトã®ä»¶åã¾ãŸã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’付ã‘ã¦ã€ã‚¹ãƒŠãƒƒãƒ—ショットをé€ä¿¡ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ErrorProcessingSnapshot">
- スナップショット・データã®å‡¦ç†ã‚¨ãƒ©ãƒ¼
+ スナップショットデータã®å‡¦ç†ã‚¨ãƒ©ãƒ¼
</notification>
<notification name="ErrorEncodingSnapshot">
スナップショットã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰åŒ–ã§ã‚¨ãƒ©ãƒ¼ãŒå‡ºã¾ã—ãŸï¼
@@ -304,11 +325,11 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
[SECOND_LIFE] ã¸ã®ãƒ­ã‚°ã‚¤ãƒ³ã‚’ç¶šã‘ã‚‹ã«ã¯ã€åˆ©ç”¨è¦ç´„ã«åŒæ„ã—ã¦ãã ã•ã„。
</notification>
<notification name="CouldNotPutOnOutfit">
- æœè£…を装ç€ã§ãã¾ã›ã‚“。
-æœè£…フォルダã«è¡£æœã€èº«ä½“部ä½ã€ä»˜å±žå“ãŒã‚りã¾ã›ã‚“。
+ アウトフィットを装ç€ã§ãã¾ã›ã‚“。
+アウトフィットフォルダã«è¡£é¡žã€èº«ä½“部ä½ã€ã‚¢ã‚¿ãƒƒãƒãƒ¡ãƒ³ãƒˆãŒã‚りã¾ã›ã‚“。
</notification>
<notification name="CannotWearTrash">
- ゴミ箱ã«ã‚ã‚‹æœã‚„ボディーパーツã®ç€ç”¨ã¯ã§ãã¾ã›ã‚“。
+ ã”ã¿ç®±ã«ã‚る衣類や身体部ä½ã®ç€ç”¨ã¯ã§ãã¾ã›ã‚“。
</notification>
<notification name="MaxAttachmentsOnOutfit">
オブジェクトを付ã‘られã¾ã›ã‚“ã§ã—ãŸã€‚
@@ -318,15 +339,18 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
ã¾ã èª­ã¿è¾¼ã¾ã‚Œã¦ã„ãªã„ãŸã‚ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’装ç€ã§ãã¾ã›ã‚“。後ã§ã‚„り直ã—ã¦ãã ã•ã„。
</notification>
<notification name="MustHaveAccountToLogIn">
- ãŠã£ã¨! 記入æ¼ã‚ŒãŒã‚りã¾ã™ã‚ˆã€‚
+ ãŠã£ã¨ï¼è¨˜å…¥æ¼ã‚ŒãŒã‚りã¾ã™ã‚ˆã€‚
ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ•ァーストãƒãƒ¼ãƒ ã¨ãƒ©ã‚¹ãƒˆãƒãƒ¼ãƒ ã®ä¸¡æ–¹ã‚’入力ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
-[SECOND_LIFE]ã«å…¥ã‚‹ã«ã¯ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒå¿…è¦ã§ã™ã€‚ アカウントを作æˆã—ã¾ã™ã‹ï¼Ÿ
+[SECOND_LIFE] ã«å…¥ã‚‹ã«ã¯ã€ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒå¿…è¦ã§ã™ã€‚ アカウントを作æˆã—ã¾ã™ã‹ï¼Ÿ
<url name="url">
https://join.secondlife.com/index.php?lang=ja-JP
</url>
<usetemplate name="okcancelbuttons" notext="ã‚‚ã†ä¸€åº¦è©¦ã™" yestext="æ–°ã—ã„アカウントを作æˆ"/>
</notification>
+ <notification name="InvalidCredentialFormat">
+ 「ユーザーãƒãƒ¼ãƒ ã€æ¬„ã«ã‚¢ãƒã‚¿ãƒ¼ã®ãƒ•ァーストãƒãƒ¼ãƒ ã¨ãƒ©ã‚¹ãƒˆãƒãƒ¼ãƒ ä¸¡æ–¹ã‚’入力ã—ã¦ã‹ã‚‰ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ãã ã•ã„。
+ </notification>
<notification name="AddClassified">
クラシファイド広告ã¯ã€æ¤œç´¢ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¨ [http://secondlife.com/community/classifieds secondlife.com] ã®ã€Œã‚¯ãƒ©ã‚·ãƒ•ァイド広告ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã«ä¸€é€±é–“掲載ã•れã¾ã™ã€‚
広告を記入ã—ãŸã‚‰ã€ã€ŒæŽ²è¼‰...ã€ã‚’クリックã—ã¦ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã«è¿½åŠ ã—ã¦ãã ã•ã„。
@@ -335,25 +359,29 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
<usetemplate ignoretext="æ–°è¦ã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šä½œæˆæ–¹æ³•" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="DeleteClassified">
- クラシファイド広告[NAME]ã®å‰Šé™¤ã‚’ã—ã¾ã™ã‹ï¼Ÿ
+ クラシファイド広告 [NAME] を削除ã—ã¾ã™ã‹ï¼Ÿ
æ”¯æ‰•ã„æ¸ˆã¿ã®æ–™é‡‘ã¯è¿”金ã•れã¾ã›ã‚“。
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="DeleteMedia">
ã“ã®é¢ã«ã‚るメディアを削除ã™ã‚‹é¸æŠžã‚’ã—ã¾ã—ãŸã€‚
ç¶šã‘ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="オブジェクトã‹ã‚‰ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’削除ã™ã‚‹å‰ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
+ <usetemplate ignoretext="オブジェクトã‹ã‚‰ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’削除ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="ClassifiedSave">
- クラシファイド広告[NAME]ã¸ã®å¤‰æ›´ã‚’ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ
+ クラシファイド広告 [NAME] ã¸ã®å¤‰æ›´ã‚’ä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="ä¿å­˜ã—ãªã„" yestext="ä¿å­˜"/>
</notification>
+ <notification name="ClassifiedInsufficientFunds">
+ クラシファイド広告を出ã™ã«ã¯ã€è³‡é‡‘ãŒè¶³ã‚Šã¾ã›ã‚“。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="DeleteAvatarPick">
- ピック[PICK]を削除ã—ã¾ã™ã‹ï¼Ÿ
+ &lt;nolink&gt;[PICK]&lt;/nolink&gt; を削除ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="PromptGoToEventsPage">
- [SECOND_LIFE]イベント・ウェブ・ページã«ç§»å‹•ã—ã¾ã™ã‹ï¼Ÿ
+ [SECOND_LIFE] イベント Web ページã«ç§»å‹•ã—ã¾ã™ã‹ï¼Ÿ
<url name="url">
http://secondlife.com/events/?lang=ja-JP
</url>
@@ -379,7 +407,7 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
æ–°ã—ã„スキン㯠[APP_NAME] ã‚’å†èµ·å‹•後ã«è¡¨ç¤ºã•れã¾ã™ã€‚
</notification>
<notification name="GoToAuctionPage">
- [SECOND_LIFE]ウェブ・ページã«ç§»å‹•ã—〠入札ã‚ã‚‹ã„ã¯ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã®è©³ç´°ã‚’確èªã—ã¾ã™ã‹ï¼Ÿ
+ [SECOND_LIFE]ã® Web ページã«ç§»å‹•ã—ã€å…¥æœ­ã‚ã‚‹ã„ã¯ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã®è©³ç´°ã‚’確èªã—ã¾ã™ã‹ï¼Ÿ
<url name="url">
http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID]
</url>
@@ -429,7 +457,7 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
</notification>
<notification name="StartRegionEmpty">
ログインä½ç½®ãŒæŒ‡å®šã•れã¦ã„ã¾ã›ã‚“。
-ログインä½ç½®ã®æ¬„ã«ãƒªãƒ¼ã‚¸ãƒ§ãƒ³åを入力ã™ã‚‹ã‹ã€ã€Œæœ€å¾Œã«ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã—ãŸå ´æ‰€ã€ã‹ã€Œè‡ªå®…(ホーム)ã€ã‚’é¸æŠžã—ã¦ãã ã•ã„。
+ログインä½ç½®ã®æ¬„ã«ãƒªãƒ¼ã‚¸ãƒ§ãƒ³åを入力ã™ã‚‹ã‹ã€ã€Œæœ€å¾Œã«ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã—ãŸå ´æ‰€ã€ã‹ã€Œãƒ›ãƒ¼ãƒ ã€ã‚’é¸æŠžã—ã¦ãã ã•ã„。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="CouldNotStartStopScript">
@@ -440,40 +468,36 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
ファイルをダウンロードã§ãã¾ã›ã‚“。
</notification>
<notification name="CannotWriteFile">
- ファイル[[FILE]]を書ãè¾¼ã‚ã¾ã›ã‚“。
+ ファイル [[FILE]] を書ãè¾¼ã‚ã¾ã›ã‚“。
</notification>
<notification name="UnsupportedHardware">
- 警告: ãŠä½¿ã„ã®ã‚·ã‚¹ãƒ†ãƒ ã¯ [APP_NAME] ã®å¿…è¦æœ€ä½Žé™ã®å‹•作環境を満ãŸã—ã¦ã„ã¾ã›ã‚“。 ã“ã®ã¾ã¾ [APP_NAME] を使用ã™ã‚‹ã¨ã€ãƒ‘フォーマンスã®ä½Žä¸‹ã‚’感ã˜ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 æã‚Œå…¥ã‚Šã¾ã™ãŒ [SUPPORT_SITE] ã§ã¯ã‚µãƒãƒ¼ãƒˆå¯¾è±¡å¤–ã®ã‚·ã‚¹ãƒ†ãƒ ã«é–¢ã™ã‚‹æŠ€è¡“的サãƒãƒ¼ãƒˆã¯è¡Œã£ã¦ãŠã‚Šã¾ã›ã‚“。
+ ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ューター㯠[APP_NAME] ã®å¿…è¦æœ€ä½Žé™ã®å‹•作環境を満ãŸã—ã¦ã„ã¾ã›ã‚“。 パフォーマンスã®ä½Žä¸‹ã‚’感ã˜ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 æã‚Œå…¥ã‚Šã¾ã™ãŒ [SUPPORT_SITE] ã§ã¯ã‚µãƒãƒ¼ãƒˆå¯¾è±¡å¤–ã®ã‚·ã‚¹ãƒ†ãƒ ã«é–¢ã™ã‚‹æŠ€è¡“的サãƒãƒ¼ãƒˆã¯è¡Œã£ã¦ãŠã‚Šã¾ã›ã‚“。
-最低動作環境
-[_URL] ã‚’é–‹ã„ã¦è©³ã—ã„æƒ…報を確èªã—ã¾ã™ã‹ï¼Ÿ
+[_URL] ã«ç§»å‹•ã—ã¦ç¢ºèªã‚’ã—ã¾ã™ã‹ï¼Ÿ
<url name="url" option="0">
http://secondlife.com/support/sysreqs.php?lang=ja
</url>
- <usetemplate ignoretext="使用ã—ã¦ã„るコンピューターã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
+ <usetemplate ignoretext="使用中ã®ã‚³ãƒ³ãƒ”ューターã®ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ãªã„ã¨ã" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="UnknownGPU">
- ãŠä½¿ã„ã®ã‚·ã‚¹ãƒ†ãƒ ã«ã¯ã€ç¾åœ¨ [APP_NAME] ãŒèªè­˜ã§ããªã„ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚«ãƒ¼ãƒ‰ãŒæ­è¼‰ã•れã¦ã„ã¾ã™ã€‚
-[APP_NAME] ã§ã¾ã ãƒ†ã‚¹ãƒˆã•れã¦ã„ãªã„最新ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®ãŸã‚ã ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ [APP_NAME] ã¯æ­£å¸¸ã«å®Ÿè¡Œã•れるå¯èƒ½æ€§ãŒé«˜ã„ã§ã™ãŒã€è¡¨ç¤ºè¨­å®šã‚’調整ã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。
+ ãŠä½¿ã„ã®ã‚·ã‚¹ãƒ†ãƒ ã«ã¯ã€[APP_NAME] ãŒèªè­˜ã§ããªã„ã‚°ãƒ©ãƒ•ã‚£ãƒƒã‚¯ã‚«ãƒ¼ãƒ‰ãŒæ­è¼‰ã•れã¦ã„ã¾ã™ã€‚
+[APP_NAME] ã§ã¾ã ãƒ†ã‚¹ãƒˆã•れã¦ã„ãªã„最新ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®ãŸã‚ã ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ å•題ãªã„ã¨ã¯æ€ã„ã¾ã™ãŒã€ã‚°ãƒ©ãƒ•ィックã®è¨­å®šã‚’調整ã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。
(ミー > 環境設定 > グラフィック)
<form name="form">
- <ignore name="ignore" text="使用中ã®ã‚°ãƒ©ãƒ•ックカードãŒèªè­˜ã•れã¾ã›ã‚“ã§ã—ãŸ"/>
+ <ignore name="ignore" text="使用中ã®ã‚°ãƒ©ãƒ•ックカードãŒèªè­˜ã•れãªã„ã¨ã"/>
</form>
</notification>
<notification name="DisplaySettingsNoShaders">
グラフィックドライãƒã‚’åˆæœŸåŒ–中㫠[APP_NAME] ãŒã‚¯ãƒ©ãƒƒã‚·ãƒ¥ã—ã¾ã—ãŸã€‚
-ドライãƒã®ä¸€èˆ¬çš„ãªã‚¨ãƒ©ãƒ¼ã‚’防ããŸã‚ã«ã€ã‚°ãƒ©ãƒ•ィックã®ã‚¯ã‚ªãƒªãƒ†ã‚£ãŒä½Žã«è¨­å®šã•れã¾ã™ã€‚ ãã®ãŸã‚ã€ä¸€éƒ¨ã®ã‚°ãƒ©ãƒ•ィック特性ã«åˆ¶é™ãŒå‡ºã¾ã™ã€‚
+ドライãƒã®ä¸€èˆ¬çš„ãªã‚¨ãƒ©ãƒ¼ã‚’防ããŸã‚ã«ã€ç”»è³ªãŒä½Žã«è¨­å®šã•れã¾ã™ã€‚ ãã®ãŸã‚ã€ä¸€éƒ¨ã®ã‚°ãƒ©ãƒ•ィック特性ã«åˆ¶é™ãŒå‡ºã¾ã™ã€‚
ãŠä½¿ã„ã®ã‚°ãƒ©ãƒ•ィックカードã®ãƒ‰ãƒ©ã‚¤ãƒã‚’アップデートã™ã‚‹ã‚ˆã†ãŠã™ã™ã‚ã—ã¾ã™ã€‚
-グラフィックã®ã‚¯ã‚ªãƒªãƒ†ã‚£ã¯ã€ç’°å¢ƒè¨­å®š > グラフィック ã§è¨­å®šã§ãã¾ã™ã€‚
+画質ã¯ã€ç’°å¢ƒè¨­å®š > グラフィック ã§è¨­å®šã§ãã¾ã™ã€‚
</notification>
<notification name="RegionNoTerraforming">
- ã“ã®åœ°åŸŸ[REGION] ã¯ã€ãƒ†ãƒ©ãƒ•ォーミングãŒã§ãã¾ã›ã‚“。
+ [REGION] ã§ã¯ã€åœ°å½¢ã®å¤‰æ›´ãŒã§ãã¾ã›ã‚“。
</notification>
<notification name="CannotCopyWarning">
- ã‚ãªãŸã¯ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚³ãƒ”ーを
-許ã•れã¦ã„ãªã„ã®ã§ã€äººã«ã‚ã’ã‚‹ã¨
-æŒã¡ç‰©ã‹ã‚‰å¤±ã‚れã¾ã™ã€‚ 本当ã«
-ã“れをã‚ã’ãŸã„ã§ã™ã‹ï¼Ÿ
+ ã‚ãªãŸã«ã¯[ITEMS]ã¨ã„ã†ã‚¢ã‚¤ãƒ†ãƒ ã‚’コピーã™ã‚‹è¨±å¯ãŒã‚りã¾ã›ã‚“。他ã®ä½äººã«æä¾›ã™ã‚‹ã¨ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã‹ã‚‰å‰Šé™¤ã•れã¾ã™ã€‚本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’譲りã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="CannotGiveItem">
@@ -483,34 +507,32 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
å–引ãŒã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•れã¾ã—ãŸã€‚
</notification>
<notification name="TooManyItems">
- 一度ã®ã‚¤ãƒ³ãƒ™ãƒ³ãƒˆãƒªäº¤æ›ã§ã€42以上ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯é€ã‚Œã¾ã›ã‚“。
+ 一度㫠42 個以上ã®ã‚¢ã‚¤ãƒ†ãƒ ã¯æ¸¡ã›ã¾ã›ã‚“。
</notification>
<notification name="NoItems">
- é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’譲渡ã§ãる権é™ãŒã‚りã¾ã›ã‚“。
+ é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’æ¸¡ã™æ¨©é™ãŒã‚りã¾ã›ã‚“。
</notification>
<notification name="CannotCopyCountItems">
- ã‚ãªãŸã¯é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®[COUNT]ã®ã‚³ãƒ”ーを
-許ã•れã¦ã„ã¾ã›ã‚“。
-ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚ãªãŸã®æŒã¡ç‰©ã‹ã‚‰å¤±ã‚れã¾ã™ã€‚
-本当ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’ã‚ã’ãŸã„ã§ã™ã‹ï¼Ÿ
+ ã‚ãªãŸã¯é¸æŠžã—㟠[COUNT] 個ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã®ã‚³ãƒ”ーを許ã•れã¦ã„ã¾ã›ã‚“。
+ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã‹ã‚‰å¤±ã‚れã¾ã™ã€‚
+本当ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’渡ã—ãŸã„ã§ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="CannotGiveCategory">
- é¸æŠžã—ãŸãƒ•ォルダを譲渡ã§ãる権é™ãŒã‚りã¾ã›ã‚“
+ é¸æŠžã—ãŸãƒ•ã‚©ãƒ«ãƒ€ã‚’æ¸¡ã™æ¨©é™ãŒã‚りã¾ã›ã‚“
</notification>
<notification name="FreezeAvatar">
ã“ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’フリーズã—ã¾ã™ã‹ï¼Ÿ
-ã‚¢ãƒã‚¿ãƒ¼ã¯ä¸€æ™‚çš„ã«å‹•ã‘ãªããªã‚Šã€
-ãƒãƒ£ãƒƒãƒˆãªã©ã€ã“ã®ä¸–界ã«å¯¾ã™ã‚‹é–¢ã‚りをæŒã¤ã“ã¨ãŒã§ããªããªã‚Šã¾ã™ã€‚
- <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="è§£å‡" yestext="フリーズ"/>
+ã‚¢ãƒã‚¿ãƒ¼ã¯ä¸€æ™‚çš„ã«å‹•ã‘ãªããªã‚Šã€ãƒãƒ£ãƒƒãƒˆã‚’å«ã‚インワールドã§ä½•ã‚‚ã§ããªããªã‚Šã¾ã™ã€‚
+ <usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="解除" yestext="フリーズ"/>
</notification>
<notification name="FreezeAvatarFullname">
[AVATAR_NAME]をフリーズã—ã¾ã™ã‹ï¼Ÿ
フリーズã•れãŸäººã¯ä¸€æ™‚çš„ã«å‹•ã‘ãªããªã‚Šã€ãƒãƒ£ãƒƒãƒˆãªã©ã€ã“ã®ä¸–界ã«å¯¾ã™ã‚‹é–¢ã‚りをæŒã¤ã“ã¨ãŒã§ããªããªã‚Šã¾ã™ã€‚
- <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="è§£å‡" yestext="フリーズ"/>
+ <usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="解除" yestext="フリーズ"/>
</notification>
<notification name="EjectAvatarFullname">
- ã‚ãªãŸã®åœŸåœ°ã‹ã‚‰[AVATAR_NAME]を追放ã—ã¾ã™ã‹ï¼Ÿ
+ ã‚ãªãŸã®åœŸåœ°ã‹ã‚‰ [AVATAR_NAME] を追放ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="追放ã¨ç¦æ­¢" yestext="追放"/>
</notification>
<notification name="EjectAvatarNoBan">
@@ -529,9 +551,8 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
</notification>
<notification name="AcquireErrorObjectSpan">
å–得エラー:
-オブジェクトãŒè¤‡æ•°ã®åœ°åŸŸã«ã¾ãŸãŒã£ã¦å­˜åœ¨ã—ã¦ã„ã¾ã™ã€‚
-å–å¾—ã™ã‚‹ã‚ªãƒ–ジェクトã¯ã€
-ã™ã¹ã¦åŒã˜åœ°åŸŸå†…ã«ç§»å‹•ã•ã›ã¦ãã ã•ã„。
+オブジェクトãŒè¤‡æ•°ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã«ã¾ãŸãŒã£ã¦å­˜åœ¨ã—ã¦ã„ã¾ã™ã€‚
+ã™ã¹ã¦åŒã˜ãƒªãƒ¼ã‚¸ãƒ§ãƒ³å†…ã«ç§»å‹•ã•ã›ã¦ã‹ã‚‰å–å¾—ã—ã¦ãã ã•ã„。
</notification>
<notification name="PromptGoToCurrencyPage">
[EXTRA]
@@ -543,32 +564,30 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="UnableToLinkObjects">
- ã“れらã®[COUNT]オブジェクトをリンクã§ãã¾ã›ã‚“。
-最大[MAX]オブジェクトをリンクã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+ [COUNT] 個ã®ã‚ªãƒ–ジェクトをリンクã§ãã¾ã›ã‚“。
+リンクã§ãã‚‹ã®ã¯æœ€å¤§ [MAX] 個ã§ã™ã€‚
</notification>
<notification name="CannotLinkIncompleteSet">
- セットã¨ã—ã¦æƒã£ã¦ã„るオブジェクトã®ã¿ãƒªãƒ³ã‚¯ã§ãã¾ã™ã€‚複数ã®
-ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
+ ã‚»ãƒƒãƒˆã§æƒã£ã¦ã„るオブジェクトã®ã¿ãƒªãƒ³ã‚¯ã§ãã¾ã™ã€‚
+複数ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
</notification>
<notification name="CannotLinkModify">
- ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトã«å¯¾ã™ã‚‹ä¿®æ­£è¨±å¯ãŒã‚ãªãŸã«ãªã„ãŸã‚ã€
-リンクã§ãã¾ã›ã‚“。
+ ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトã®ä¿®æ­£è¨±å¯ãŒãªã„ãŸã‚リンクã§ãã¾ã›ã‚“。
-オブジェクトãŒã™ã¹ã¦ãƒ­ãƒƒã‚¯ã•れã¦ãŠã‚‰ãšã€ã‚ãªãŸã®ã‚‚ã®ã§ã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。
+ã©ã®ã‚ªãƒ–ジェクトもロックã•れã¦ãŠã‚‰ãšã€ã‚ãªãŸã®ã‚‚ã®ã§ã‚ã‚‹ã“ã¨ã‚’確èªã—ã¦ãã ã•ã„。
</notification>
<notification name="CannotLinkDifferentOwners">
- 所有者ãŒç•°ãªã‚‹ãŸã‚ã€ã™ã¹ã¦ã®ã‚ªãƒ–ジェクトを
-リンクã§ãã¾ã›ã‚“。
+ 所有者ãŒç•°ãªã‚‹ãŸã‚ã€ã‚ªãƒ–ジェクトをリンクã§ãã¾ã›ã‚“。
è‡ªåˆ†ãŒæ‰€æœ‰ã—ã¦ã„るオブジェクトã ã‘ã‚’é¸æŠžã—ã¦ãã ã•ã„。
</notification>
<notification name="NoFileExtension">
- ファイル「[FILE]ã€ã®æ‹¡å¼µå­ãŒç„¡åйã§ã™ã€‚
+ 「 [FILE] ã€ã®æ‹¡å¼µå­ãŒç„¡åйã§ã™ã€‚
ã“ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®æ‹¡å¼µå­ãŒæ­£ã—ã„ã‹ã©ã†ã‹ã‚’確èªã—ã¦ãã ã•ã„。
</notification>
<notification name="InvalidFileExtension">
- ファイル拡張å­[EXTENSION]ã¯ç„¡åйã§ã™
+ [EXTENSION] ã¯ç„¡åйã§ã™ã€‚
æ­£ã—ã„æ‹¡å¼µå­ï¼š[VALIDS]
<usetemplate name="okbutton" yestext="OK"/>
</notification>
@@ -577,11 +596,11 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
[FILE]
</notification>
<notification name="SoundFileNotRIFF">
- ファイルãŒRIFF WAVEファイルã¨ã—ã¦èªè­˜ã•れã¾ã›ã‚“:
+ RIFF WAVE ファイルã¨ã—ã¦èªè­˜ã•れã¾ã›ã‚“:
[FILE]
</notification>
<notification name="SoundFileNotPCM">
- ファイルãŒPCM WAVEオーディオ・ファイルã¨ã—ã¦èªè­˜ã•れã¾ã›ã‚“:
+ PCM WAVE オーディオファイルã¨ã—ã¦èªè­˜ã•れã¾ã›ã‚“:
[FILE]
</notification>
<notification name="SoundFileInvalidChannelCount">
@@ -589,98 +608,100 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
[FILE]
</notification>
<notification name="SoundFileInvalidSampleRate">
- ファイルã®ã‚µãƒ³ãƒ—ル・レートãŒã‚µãƒãƒ¼ãƒˆå¤–ã§ã™ï¼ˆ44.1kを指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ï¼‰ï¼š
+ ファイルã®ã‚µãƒ³ãƒ—ルレートãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“(44.1k ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ï¼‰ï¼š
[FILE]
</notification>
<notification name="SoundFileInvalidWordSize">
- ファイルã®ãƒ¯ãƒ¼ãƒ‰ãƒ»ã‚µã‚¤ã‚ºãŒã‚µãƒãƒ¼ãƒˆå¤–ã§ã™ï¼ˆ8ã¾ãŸã¯16ビットを指定ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ï¼‰ï¼š
+ ファイルã®ãƒ¯ãƒ¼ãƒ‰ã‚µã‚¤ã‚ºãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“(8 ã¾ãŸã¯ 16 ビットã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ï¼‰ï¼š
[FILE]
</notification>
<notification name="SoundFileInvalidHeader">
- WAVヘッダーã«ãƒ‡ãƒ¼ã‚¿ãƒ»ãƒãƒ£ãƒ³ã‚¯ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“:
+ WAV ヘッダーã«ãƒ‡ãƒ¼ã‚¿ãƒãƒ£ãƒ³ã‚¯ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“:
[FILE]
</notification>
<notification name="SoundFileInvalidTooLong">
- オーディオ・ファイルãŒé•·ã™ãŽã¾ã™ã€‚(最大10秒):
+ オーディオファイルãŒé•·ã™ãŽã¾ã™ã€‚(最大 10 秒):
[FILE]
</notification>
<notification name="ProblemWithFile">
- ファイル[FILE]ã«ã‚¨ãƒ©ãƒ¼ãŒã‚りã¾ã™ã€‚
+ 「 [FILE] ã€ã«å•題ãŒã‚りã¾ã™ã€‚
[ERROR]
</notification>
<notification name="CannotOpenTemporarySoundFile">
- 書ãè¾¼ã¿ç”¨ã®ä¸€æ™‚圧縮サウンド・ファイルを開ãã“ã¨ãŒã§ãã¾ã›ã‚“:[FILE]
+ 書ãè¾¼ã¿ç”¨ã®ä¸€æ™‚圧縮サウンドファイルを開ãã“ã¨ãŒã§ãã¾ã›ã‚“:[FILE]
</notification>
<notification name="UnknownVorbisEncodeFailure">
- 未知ã®Vorbis æš—å·åŒ–ã«å¤±æ•—: [FILE]
+ 䏿˜Žã® Vorbis ã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ã«å¤±æ•—: [FILE]
</notification>
<notification name="CannotEncodeFile">
次ã®ãƒ•ァイルã®ã‚¨ãƒ³ã‚³ãƒ¼ãƒ‰ãŒã§ãã¾ã›ã‚“: [FILE]
</notification>
+ <notification name="CorruptedProtectedDataStore">
+ ä¿è­·ã•れã¦ã„るデータを読ã¿ã¨ã‚‹ã“ã¨ãŒå‡ºæ¥ãªã„ãŸã‚リセットã•れã¾ã™ã€‚
+ ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯è¨­å®šã‚’変更ã™ã‚‹ã¨èµ·ã“ã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CorruptResourceFile">
ç ´æã—ãŸãƒªã‚½ãƒ¼ã‚¹ãƒ•ァイル: [FILE]
</notification>
<notification name="UnknownResourceFileVersion">
- 未知ã®lindenリソースファイルã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [FILE]
+ 䏿˜Žã®ãƒªãƒ³ãƒ‡ãƒ³ãƒªã‚½ãƒ¼ã‚¹ãƒ•ァイルã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š [FILE]
</notification>
<notification name="UnableToCreateOutputFile">
- æœè£…ファイルを作æˆã§ãã¾ã›ã‚“: [FILE]
+ 出力ファイルを作æˆã§ãã¾ã›ã‚“: [FILE]
</notification>
<notification name="DoNotSupportBulkAnimationUpload">
ç¾åœ¨ [APP_NAME] ã§ã¯ã€ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã®ä¸€æ‹¬ã‚¢ãƒƒãƒ—ロードã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。
</notification>
<notification name="CannotUploadReason">
- 次ã®ç†ç”±ã§ã€[FILE] をアップロードã§ãã¾ã›ã‚“: [REASON]
+ 次ã®ç†ç”±ã§ã€ã€Œ [FILE] ã€ã‚’アップロードã§ãã¾ã›ã‚“: [REASON]
ã‚ã¨ã§ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
</notification>
<notification name="LandmarkCreated">
「 [LANDMARK_NAME] ã€ã‚’「 [FOLDER_NAME] ã€ãƒ•ォルダã«è¿½åŠ ã—ã¾ã—ãŸã€‚
</notification>
<notification name="LandmarkAlreadyExists">
- ã“ã®ä½ç½®ã®ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’æ—¢ã«æŒã£ã¦ã„ã¾ã™ã€‚
+ ç¾åœ¨åœ°ã®ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’æ—¢ã«æŒã£ã¦ã„ã¾ã™ã€‚
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="CannotCreateLandmarkNotOwner">
- åœŸåœ°ã®æ‰€æœ‰è€…ãŒè¨±å¯ã—ã¦ã„ãªã„ãŸã‚ã€
-ランドマークを作æˆã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
+ åœŸåœ°ã®æ‰€æœ‰è€…ãŒè¨±å¯ã—ã¦ã„ãªã„ãŸã‚ã€ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’作æˆã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
</notification>
<notification name="CannotRecompileSelectObjectsNoScripts">
- å†ç·¨é›†ã¯ä¸å¯èƒ½ã§ã™ã€‚
-スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
+ 「リコンパイルã€ã§ãã¾ã›ã‚“。
+スクリプトã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
</notification>
<notification name="CannotRecompileSelectObjectsNoPermission">
- 「å†ç·¨é›†ã€ã¯ä¸å¯èƒ½ã§ã™ã€‚
+ 「リコンパイルã€ã§ãã¾ã›ã‚“。
-変更修正権é™ã®ã‚ã‚‹
-スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
+修正修正権é™ã®ã‚るスクリプトã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
</notification>
<notification name="CannotResetSelectObjectsNoScripts">
- 「å†è¨­å®šã€ã‚’行ã†ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ 「å†è¨­å®šã€ãŒã§ãã¾ã›ã‚“。
-スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
+スクリプトã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
</notification>
<notification name="CannotResetSelectObjectsNoPermission">
- 「å†è¨­å®šã€ã‚’行ã†ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ 「å†è¨­å®šã€ãŒã§ãã¾ã›ã‚“。
-変更修正権é™ã®ã‚ã‚‹
-スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
+修正権é™ã®ã‚るスクリプトã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
</notification>
<notification name="CannotOpenScriptObjectNoMod">
- 編集権é™ã®ãªã„オブジェクトã®ã‚¹ã‚¯ãƒªãƒ—トを開ãã“ã¨ã¯ã§ãã¾ã›ã‚“。
+ 修正権é™ã®ãªã„オブジェクトã®ã‚¹ã‚¯ãƒªãƒ—トã¯é–‹ãã“ã¨ã¯ã§ãã¾ã›ã‚“。
</notification>
<notification name="CannotSetRunningSelectObjectsNoScripts">
- スクリプトã®ã€Œå®Ÿè¡Œã€ã®è¨­å®šãŒã§ãã¾ã›ã‚“。
+ スクリプトã®ã€Œå®Ÿè¡Œã€ãŒã§ãã¾ã›ã‚“。
-スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
+スクリプトã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
</notification>
<notification name="CannotSetRunningNotSelectObjectsNoScripts">
- スクリプトを「実行ã—ãªã„ã€ã«è¨­å®šã§ãã¾ã›ã‚“。
+ スクリプトを「実行ã—ãªã„ã€è¨­å®šã«ã§ãã¾ã›ã‚“。
-スクリプト化ã•れãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
+スクリプトã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã¦ãã ã•ã„。
</notification>
<notification name="NoFrontmostFloater">
- ä¿å­˜ã™ã¹ãfrontmostフロータãŒã‚りã¾ã›ã‚“。
+ ä¿å­˜ã™ã‚‹ frontmost フロータãŒã‚りã¾ã›ã‚“。
</notification>
<notification name="SeachFilteredOnShortWords">
指定ã—ãŸæ¤œç´¢ã‚¯ã‚¨ãƒªã¯å¤‰æ›´ã•れã€çŸ­ã™ãŽã‚‹èªžå¥ã¯å–り除ã‹ã‚Œã¦ã„ã¾ã™ã€‚
@@ -703,35 +724,35 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•度も出る場åˆã¯ã€[SUPPORT_SITE] ã‚’ã”確èªãã ã•ã„。
</notification>
<notification name="blocked_tport">
- 申ã—訳ã”ã–ã„ã¾ã›ã‚“。テレãƒãƒ¼ãƒˆã¯ç¾åœ¨ã€ãƒ–ロックã•れã¦ã„ã¾ã™ã€‚ã‚‚ã†å°‘ã—後ã§ã‚„り直ã—ã¦ãã ã•ã„。
-やり直ã—ã¦ã‚‚テレãƒãƒ¼ãƒˆã§ããªã„å ´åˆã¯ã€ã„ã£ãŸã‚“ログアウトã—ã€å†åº¦ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦å•題を解決ã—ã¦ãã ã•ã„。
+ 申ã—訳ã”ã–ã„ã¾ã›ã‚“。テレãƒãƒ¼ãƒˆã¯ç¾åœ¨ã€ãƒ–ロックã•れã¦ã„ã¾ã™ã€‚ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†åº¦ãŠè©¦ã—ãã ã•ã„。
+ãれã§ã‚‚テレãƒãƒ¼ãƒˆã§ããªã„å ´åˆã¯ã€ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã—ã€ãƒ­ã‚°ã‚¤ãƒ³ã—ç›´ã—ã¦å•題を解決ã—ã¦ãã ã•ã„。
</notification>
<notification name="nolandmark_tport">
- 残念ãªãŒã‚‰ã€ã‚·ã‚¹ãƒ†ãƒ ã¯ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ç›®çš„地を探ã›ã¾ã›ã‚“ã§ã—ãŸã€‚
+ 申ã—訳ã”ã–ã„ã¾ã›ã‚“。ランドマークã®ç›®çš„地ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
</notification>
<notification name="timeout_tport">
- 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆæŽ¥ç¶šã‚’完了ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
-ã‚‚ã†å°‘ã—後ã§ã‚„り直ã—ã¦ãã ã•ã„。
+ 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã«ã‚ˆã‚‹ãƒ†ãƒ¬ãƒãƒ¼ãƒˆæŽ¥ç¶šãŒå®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="noaccess_tport">
- 残念ãªãŒã‚‰ã€ãã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆç›®çš„地ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãŒã‚りã¾ã›ã‚“。
+ 残念ãªãŒã‚‰ã€ç›®çš„地ã¸ã‚¢ã‚¯ã‚»ã‚¹ãŒè¨±å¯ã•れã¦ã„ãªã„ãŸã‚ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§ãã¾ã›ã‚“。
</notification>
<notification name="missing_attach_tport">
- 添付物ã¯ã€ã¾ã åˆ°ç€ã—ã¦ã„ã¾ã›ã‚“。ã‚ã¨æ•°ç§’é–“ãŠå¾…ã¡ã„ãŸã ãã‹ã€ã„ã£ãŸã‚“ログアウトã—ã€å†åº¦ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ã‹ã‚‰ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’やり直ã—ã¦ã ã•ã„。
+ 添付物ãŒã¾ã å±Šã„ã¦ã„ã¾ã›ã‚“。テレãƒãƒ¼ãƒˆã‚’ã™ã‚‹å‰ã«ã‚ã¨æ•°ç§’é–“ãŠå¾…ã¡ã„ãŸã ãã‹ã€ã„ã£ãŸã‚“ログアウトã—ã€å†åº¦ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ãã ã•ã„。
</notification>
<notification name="too_many_uploads_tport">
- ã“ã®åœ°åŸŸã®è³‡ç”£ã‚­ãƒ¥ãƒ¼ãŒç¾åœ¨è¾¼ã¿åˆã£ã¦ã„ã‚‹ãŸã‚ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ»ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’時間通りã«å‡¦ç†ã™ã‚‹ã“ã¨ãŒé›£ã—ã„状æ³ã§ã™ã€‚
-数分後ã«ã‚„り直ã™ã‹ã€ã¾ãŸã¯æ··é›‘ã—ã¦ã„ãªã„ä»–ã®åœ°åŸŸã‚’ãŠè©¦ã—ãã ã•ã„。
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚¢ã‚»ãƒƒãƒˆã‚­ãƒ¥ãƒ¼ãŒç¾åœ¨æ··ã¿åˆã£ã¦ã„ã‚‹ãŸã‚ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’ã™ãã«å‡¦ç†ã™ã‚‹ã“ã¨ãŒé›£ã—ã„状æ³ã§ã™ã€‚
+数分後ã«ã‚„り直ã™ã‹ã€æ··é›‘ã—ã¦ã„ãªã„ä»–ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="expired_tport">
- 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ»ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’時間ã©ãŠã‚Šã«å®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚数分後ã«ã‚„り直ã—ã¦ãã ã•ã„。
+ 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’時間ã©ãŠã‚Šã«å®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚数分後ã«ã‚„り直ã—ã¦ãã ã•ã„。
</notification>
<notification name="expired_region_handoff">
- 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯åœ°åŸŸé–“ã®ç§»å‹•を時間ã©ãŠã‚Šã«å®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+ 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯ãƒªãƒ¼ã‚¸ãƒ§ãƒ³é–“ã®ç§»å‹•を時間ã©ãŠã‚Šã«å®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
数分後ã«ã‚„り直ã—ã¦ãã ã•ã„。
</notification>
<notification name="no_host">
- テレãƒãƒ¼ãƒˆç›®çš„地を見ã¤ã‘られã¾ã›ã‚“。目的地ãŒä¸€æ™‚çš„ã«åˆ©ç”¨ã§ããªã„状態ã‹ã€ã¾ãŸã¯ã™ã§ã«æ¶ˆæ»…ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚数分後ã«ã‚„り直ã—ã¦ãã ã•ã„。
+ テレãƒãƒ¼ãƒˆç›®çš„地を見ã¤ã‘られã¾ã›ã‚“。目的地ãŒä¸€æ™‚çš„ã«åˆ©ç”¨ã§ããªã„状態ã‹ã€ã™ã§ã«æ¶ˆæ»…ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚数分後ã«ã‚„り直ã—ã¦ãã ã•ã„。
</notification>
<notification name="no_inventory_host">
æŒã¡ç‰©ã‚·ã‚¹ãƒ†ãƒ ã¯ç¾åœ¨åˆ©ç”¨ã§ãã¾ã›ã‚“。
@@ -741,9 +762,8 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“。
</notification>
<notification name="CannotSetLandOwnerMultipleRegions">
- 複数ã®åœ°åŸŸãŒé¸æŠžã•れãŸãŸã‚ã€
-åœŸåœ°ã®æ‰€æœ‰æ¨©ã‚’å–å¾—ã§ãã¾ã›ã‚“。
-é¸æŠžã™ã‚‹é¢ç©ã‚’å°ã•ãã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
+ 複数ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ãŒé¸æŠžã•れãŸãŸã‚ã€åœŸåœ°ã®æ‰€æœ‰æ¨©ã‚’å–å¾—ã§ãã¾ã›ã‚“。
+é¸æŠžã™ã‚‹é¢ç©ã‚’å°ã•ãã—ã¦ã€ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="ForceOwnerAuctionWarning">
ã“ã®åŒºç”»ã¯ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã«å‡ºã•れã¦ã„ã¾ã™ã€‚ 所有権を変更ã™ã‚‹ã¨ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã¯ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã¨ãªã‚Šã€æ—¢ã«ã‚ªãƒ¼ã‚¯ã‚·ãƒ§ãƒ³ã«å‚加ã—ã¦ã„ã‚‹ä½äººãŒã„れã°ãã®äººã«è¿·æƒ‘ã‚’ã‹ã‘ã¦ã—ã¾ã„ã¾ã™ã€‚
@@ -759,12 +779,12 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
土地ãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“。
</notification>
<notification name="CannotReleaseLandNothingSelected">
- 土地を破棄ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“:
+ 土地を破棄ã§ãã¾ã›ã‚“:
区画ãŒé¸å®šã•れã¦ã„ã¾ã›ã‚“。
</notification>
<notification name="CannotReleaseLandNoRegion">
土地を破棄ã§ãã¾ã›ã‚“:
-地域ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
+リージョンãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
</notification>
<notification name="CannotBuyLandNothingSelected">
土地を購入ã§ãã¾ã›ã‚“:
@@ -772,7 +792,7 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
</notification>
<notification name="CannotBuyLandNoRegion">
土地を購入ã§ãã¾ã›ã‚“:
-ã“ã®åœŸåœ°ãŒã‚る地域を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“
+ã“ã®åœŸåœ°ãŒã‚るリージョンを見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“
</notification>
<notification name="CannotCloseFloaterBuyLand">
[APP_NAME] ãŒã“ã®å–引価格を見ç©ã‚‚ã‚‹ã¾ã§ã¯ã€åœŸåœ°ã®è³¼å…¥ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
@@ -793,15 +813,7 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
土地を譲渡ã§ãã¾ã›ã‚“:
複数ã®åŒºç”»ãŒé¸æŠžã•れã¦ã„ã¾ã™ã€‚
-ã“れより1ã¤ã®åŒºç”»ã‚’é¸æŠžã—ã¦ãã ã•ã„。
- </notification>
- <notification name="ParcelCanPlayMedia">
- ã“ã®å ´æ‰€ã§ã¯ã€ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ãƒ¡ãƒ‡ã‚£ã‚¢ã®å†ç”ŸãŒå¯èƒ½ã§ã™ã€‚
-ストリーミングメディアã«ã¯ã€é«˜é€Ÿã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šã‚’è¦ã—ã¾ã™ã€‚
-
-利用å¯èƒ½ãªã¨ãã«ã‚¹ãƒˆãƒªãƒ¼ãƒŸãƒ³ã‚°ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’å†ç”Ÿã—ã¾ã™ã‹ï¼Ÿ
-(ã“ã®ã‚ªãƒ—ションã¯ã€ã€Œç’°å¢ƒè¨­å®šã€ &gt; 「プライãƒã‚·ãƒ¼ã€ã§ã‚ã¨ã‹ã‚‰ã§ã‚‚変更ã§ãã¾ã™ã€‚)
- <usetemplate name="okcancelbuttons" notext="無効化" yestext="メディアをå†ç”Ÿ"/>
+区画を 1 ã¤é¸æŠžã—ã¦ãã ã•ã„。
</notification>
<notification name="CannotDeedLandWaitingForServer">
土地を譲渡ã§ãã¾ã›ã‚“:
@@ -811,7 +823,7 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
</notification>
<notification name="CannotDeedLandNoTransfer">
土地を譲渡ã§ãã¾ã›ã‚“:
-ã“ã®åœ°åŸŸ [REGION] ã§ã¯åœŸåœ°ã®è­²æ¸¡ãŒè¨±ã•れã¦ã„ã¾ã›ã‚“。
+[REGION] ã§ã¯åœŸåœ°ã®è­²æ¸¡ãŒè¨±ã•れã¦ã„ã¾ã›ã‚“。
</notification>
<notification name="CannotReleaseLandWatingForServer">
土地を破棄ã§ãã¾ã›ã‚“:
@@ -821,9 +833,9 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
</notification>
<notification name="CannotReleaseLandSelected">
土地を破棄ã§ãã¾ã›ã‚“:
-ã‚ãªãŸã¯ã€é¸æŠžã—ãŸã™ã¹ã¦ã®åŒºç”»ã‚’所有ã—ã¦ã„ã¾ã›ã‚“。
+ã‚ãªãŸã¯ã€é¸æŠžã—ãŸåŒºç”»ã®ã™ã¹ã¦ã‚’所有ã—ã¦ã„ã¾ã›ã‚“。
-1ã¤ã®åŒºç”»ã‚’é¸æŠžã—ã¦ãã ã•ã„。
+区画を 1 ã¤é¸æŠžã—ã¦ãã ã•ã„。
</notification>
<notification name="CannotReleaseLandDontOwn">
土地を破棄ã§ãã¾ã›ã‚“:
@@ -836,7 +848,7 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
</notification>
<notification name="CannotReleaseLandNoTransfer">
土地を破棄ã§ãã¾ã›ã‚“:
-ã“ã® [REGION] ã§ã¯åœŸåœ°ã®è­²æ¸¡ãŒè¨±ã•れã¦ã„ã¾ã›ã‚“。
+[REGION] ã§ã¯åœŸåœ°ã®è­²æ¸¡ãŒè¨±ã•れã¦ã„ã¾ã›ã‚“。
</notification>
<notification name="CannotReleaseLandPartialSelection">
土地を破棄ã§ãã¾ã›ã‚“:
@@ -845,9 +857,9 @@ L$ãŒä¸è¶³ã—ã¦ã„ã‚‹ã®ã§ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«å‚加ã™ã‚‹ã“ã¨ãŒã§ãã¾
åŒºç”»å…¨ä½“ã‚’é¸æŠžã™ã‚‹ã‹ã€ã¾ãŸã¯ã€ã¾ãšæœ€åˆã«åŒºç”»ã‚’分割ã—ã¦ãã ã•ã„。
</notification>
<notification name="ReleaseLandWarning">
- ã‚ãªãŸã¯ã€[AREA]平方メートルã®åœŸåœ°ã‚’破棄ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
+ ã‚ãªãŸã¯ã€[AREA] 平方メートルã®åœŸåœ°ã‚’破棄ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
ã“ã®åŒºç”»ã‚’破棄ã™ã‚‹ã¨ã‚ãªãŸã®åœŸåœ°ã§ã¯ãªããªã‚Šã¾ã™ãŒã€
-L$ã¯è¿”金ã•れã¾ã›ã‚“。
+L$ ã¯è¿”金ã•れã¾ã›ã‚“。
土地を破棄ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
@@ -864,7 +876,7 @@ L$ã¯è¿”金ã•れã¾ã›ã‚“。
区画ã®ä¸€éƒ¨ã‚’é¸æŠžã—ã¦ãã ã•ã„。
</notification>
<notification name="LandDivideWarning">
- ã“ã®åœŸåœ°ã‚’分割ã™ã‚‹ã¨ã€2ã¤ã®åŒºç”»ã«åˆ¥ã‚Œã¾ã™ã€‚
+ ã“ã®åœŸåœ°ã‚’分割ã™ã‚‹ã¨ã€2 ã¤ã®åŒºç”»ã«åˆ¥ã‚Œã¾ã™ã€‚
区画ã”ã¨ã®è¨­å®šãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ ã“ã®æ“作を行ã†ã¨ã€ä¸€éƒ¨ã®è¨­å®šãŒãƒ‡ãƒ•ォルトã«ãƒªã‚»ãƒƒãƒˆã•れã¾ã™ã€‚
土地ã®åˆ†å‰²æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
@@ -884,19 +896,18 @@ L$ã¯è¿”金ã•れã¾ã›ã‚“。
</notification>
<notification name="CannotJoinLandEntireParcelSelected">
土地を統åˆã§ãã¾ã›ã‚“:
-1ã¤ã®åŒºç”»ã—ã‹é¸æŠžã•れã¦ã„ã¾ã›ã‚“。
+区画㌠1 ã¤ã—ã‹é¸æŠžã•れã¦ã„ã¾ã›ã‚“。
両方ã®åŒºç”»ã‚’ã¾ãŸã„ã§åœŸåœ°ã‚’é¸æŠžã—ã¦ãã ã•ã„。
</notification>
<notification name="CannotJoinLandSelection">
土地を統åˆã§ãã¾ã›ã‚“:
-1ã¤ä»¥ä¸Šã®åŒºç”»ã‚’é¸æŠžã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
+区画を 1 ã¤ä»¥ä¸Šé¸æŠžã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
両方ã®åŒºç”»ã‚’ã¾ãŸã„ã§åœŸåœ°ã‚’é¸æŠžã—ã¦ãã ã•ã„。
</notification>
<notification name="JoinLandWarning">
- ã“ã®åœŸåœ°ã‚’çµ±åˆã™ã‚‹ã¨ã€é¸æŠžã•れãŸé•·æ–¹å½¢ã«äº¤å·®ã™ã‚‹
-å…¨ã¦ã®åŒºç”»ã‚’基ã«ã—ã¦1ã¤ã®å¤§ããªåŒºç”»ãŒä½œæˆã•れã¾ã™ã€‚
+ ã“ã®åœŸåœ°ã‚’çµ±åˆã™ã‚‹ã¨ã€é¸æŠžã•れãŸé•·æ–¹å½¢ã«äº¤å·®ã™ã‚‹å…¨ã¦ã®åŒºç”»ã‚’基ã«ã—ã¦ã€å¤§ããªåŒºç”»ãŒ 1 ã¤ä½œæˆã•れã¾ã™ã€‚
æ–°ã—ã„区画ã®åå‰ã¨ã‚ªãƒ—ションをå†è¨­å®šã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
土地を統åˆã—ã¾ã™ã‹ï¼Ÿ
@@ -911,7 +922,7 @@ L$ã¯è¿”金ã•れã¾ã›ã‚“。
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="コピー"/>
</notification>
<notification name="ResolutionSwitchFail">
- è§£åƒåº¦ã‚’ [RESX]x[RESY]ã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+ è§£åƒåº¦ã‚’ [RESX]x[RESY] ã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
</notification>
<notification name="ErrorUndefinedGrasses">
ã‚¨ãƒ©ãƒ¼ï¼šæœªå®šç¾©ã®æ¤ç‰©ï¼š[SPECIES]
@@ -920,44 +931,72 @@ L$ã¯è¿”金ã•れã¾ã›ã‚“。
ã‚¨ãƒ©ãƒ¼ï¼šæœªå®šç¾©ã®æ¨¹æœ¨ï¼š[SPECIES]
</notification>
<notification name="CannotSaveWearableOutOfSpace">
- 「[NAME]ã€ã‚’æœã®ãƒ•ァイルã«ä¿å­˜ã§ãã¾ã›ã‚“。 コンピューターã®
-ディスクスペースを少ã—増やã—ã¦ã‹ã‚‰ã€ã‚‚ã†ä¸€åº¦
-ä¿å­˜ã—ã¦ã¿ã¦ãã ã•ã„。
+ 「 [NAME] ã€ã‚’衣類ã®ãƒ•ァイルã«ä¿å­˜ã§ãã¾ã›ã‚“。
+コンピューターã®ãƒ‡ã‚£ã‚¹ã‚¯ã‚¹ãƒšãƒ¼ã‚¹ã‚’å°‘ã—増やã—ã¦ã‹ã‚‰ã€ã‚‚ã†ä¸€åº¦ä¿å­˜ã—ã¦ã¿ã¦ãã ã•ã„。
</notification>
<notification name="CannotSaveToAssetStore">
- [NAME] ã‚’ä¿å­˜ã§ãã¾ã›ã‚“。
+ 「 [NAME] ã€ã‚’ä¿å­˜ã§ãã¾ã›ã‚“。
通常ã“れã¯ä¸€æ™‚çš„ãªã‚¨ãƒ©ãƒ¼ã§ã™ã€‚ 数分後ã«ã‚‚ã†ä¸€åº¦ç€ç”¨ç‰©ã‚’カスタマイズ・ä¿å­˜ã—ã¦ãã ã•ã„。
</notification>
<notification name="YouHaveBeenLoggedOut">
- [SECOND_LIFE] ã‹ã‚‰ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã—ã¾ã—ãŸï¼š
+ ã—ã¾ã£ãŸã€ [SECOND_LIFE] ã‹ã‚‰ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã•れã¦ã—ã¾ã„ã¾ã—ãŸã€‚
[MESSAGE]
-「IMã¨ãƒãƒ£ãƒƒãƒˆã‚’見るã€ã‚’クリックã™ã‚‹ã¨ã€å¼•ãç¶šãæ—¢ã«é–‹ã„ã¦ã„ã‚‹ IM ã¨ãƒãƒ£ãƒƒãƒˆã‚’見るã“ã¨ãŒã§ãã¾ã™ã€‚ 「終了ã€ã‚’クリックã™ã‚‹ã¨ [APP_NAME] ã‚’ã™ãã«çµ‚了ã—ã¾ã™ã€‚
<usetemplate name="okcancelbuttons" notext="終了" yestext="IMã¨ãƒãƒ£ãƒƒãƒˆã‚’表示"/>
</notification>
<notification name="OnlyOfficerCanBuyLand">
グループ用ã®åœŸåœ°ã®è³¼å…¥ãŒã§ãã¾ã›ã‚“:
ã‚ãªãŸã«ã¯ã‚¢ã‚¯ãƒ†ã‚£ãƒ–ãªã‚°ãƒ«ãƒ¼ãƒ—ã®ãŸã‚ã«åœŸåœ°ã‚’購入ã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。
</notification>
- <notification label="フレンドを追加" name="AddFriend">
- フレンドã¨ã—ã¦è¿½åŠ ã™ã‚‹ã¨ã€ãŠäº’ã„ã®ç¾åœ¨åœ°ã®åœ°å›³ã¸ã®è¡¨ç¤ºè¨±å¯ã€ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹è¡¨ç¤ºã®è¨­å®šã‚’ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+ <notification label="フレンド登録" name="AddFriend">
+ フレンド登録ã™ã‚‹ã¨ã€ãŠäº’ã„ã®ç¾åœ¨åœ°ã®åœ°å›³ã¸ã®è¡¨ç¤ºè¨±å¯ã€ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã®è¡¨ç¤ºè¨­å®šãŒã§ãã¾ã™ã€‚
[NAME] ã«ãƒ•レンドシップをé€ã‚Šã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
- <notification label="フレンドを追加" name="AddFriendWithMessage">
- フレンドã¨ã—ã¦è¿½åŠ ã™ã‚‹ã¨ã€ãŠäº’ã„ã®ç¾åœ¨åœ°ã®åœ°å›³ã¸ã®è¡¨ç¤ºè¨±å¯ã€ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹è¡¨ç¤ºã®è¨­å®šã‚’ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+ <notification label="フレンド登録" name="AddFriendWithMessage">
+ フレンド登録ã™ã‚‹ã¨ã€ãŠäº’ã„ã®ç¾åœ¨åœ°ã®åœ°å›³ã¸ã®è¡¨ç¤ºè¨±å¯ã€ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã®è¡¨ç¤ºè¨­å®šãŒã§ãã¾ã™ã€‚
-[NAME] ã«ãƒ•レンドシップã®ã‚ªãƒ•ァーをã—ã¾ã™ã‹ï¼Ÿ
+[NAME] ã«ãƒ•レンドシップを申ã—出ã¾ã™ã‹ï¼Ÿ
+ <form name="form">
+ <input name="message">
+ フレンド登録ã—ã¦ãれã¾ã™ã‹ï¼Ÿ
+ </input>
+ <button name="Offer" text="OK"/>
+ <button name="Cancel" text="キャンセル"/>
+ </form>
+ </notification>
+ <notification label="アウトフィットをä¿å­˜ã™ã‚‹" name="SaveOutfitAs">
+ ç€ç”¨ä¸­ã®ã‚¢ã‚¦ãƒˆãƒ•ィットを新ã—ã„アウトフットã¨ã—ã¦ä¿å­˜ï¼š
<form name="form">
<input name="message">
- フレンドã¨ã—ã¦ç™»éŒ²ã—ã¦ãれã¾ã™ã‹ï¼Ÿ
+ [DESC] (新)
</input>
<button name="Offer" text="OK"/>
<button name="Cancel" text="キャンセル"/>
</form>
</notification>
+ <notification label="ç€ç”¨ç‰©ã‚’ä¿å­˜" name="SaveWearableAs">
+ アイテムを別åã§æŒã¡ç‰©ã«ä¿å­˜ï¼š
+ <form name="form">
+ <input name="message">
+ [DESC](新è¦ï¼‰
+ </input>
+ <button name="Offer" text="OK"/>
+ <button name="Cancel" text="å–り消ã—"/>
+ </form>
+ </notification>
+ <notification label="アウトフィットã®åå‰ã‚’変更ã™ã‚‹" name="RenameOutfit">
+ æ–°ã—ã„アウトフィットã®åå‰ï¼š
+ <form name="form">
+ <input name="new_name">
+ [NAME]
+ </input>
+ <button name="Offer" text="OK"/>
+ <button name="Cancel" text="å–り消ã—"/>
+ </form>
+ </notification>
<notification name="RemoveFromFriends">
- [FIRST_NAME] [LAST_NAME]をフレンドリストã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
+ [FIRST_NAME] [LAST_NAME] をフレンドリストã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="RemoveMultipleFromFriends">
@@ -966,135 +1005,140 @@ L$ã¯è¿”金ã•れã¾ã›ã‚“。
</notification>
<notification name="GodDeleteAllScriptedPublicObjectsByUser">
**[AVATAR_NAME]**
-所有ã®ã™ã¹ã¦ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトをã“ã®ã‚·ãƒ å†…ã®ä»–ã®ã™ã¹ã¦ã®åœŸåœ°ã‹ã‚‰å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
+所有ã®ã™ã¹ã¦ã®ã‚¹ã‚¯ãƒªãƒ—トオブジェクトをã“ã®ã‚·ãƒ å†…ã®ä»–ã®ã™ã¹ã¦ã®åœŸåœ°ã‹ã‚‰å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="GodDeleteAllScriptedObjectsByUser">
**[AVATAR_NAME]**
-所有ã®ã™ã¹ã¦ã®ã‚¹ã‚¯ãƒªãƒ—ト・オブジェクトをã“ã®ã‚·ãƒ å†…ã®ã™ã¹ã¦ã®åœŸåœ°ã‹ã‚‰å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
+所有ã®ã™ã¹ã¦ã®ã‚¹ã‚¯ãƒªãƒ—トオブジェクトをã“ã®ã‚·ãƒ å†…ã®ã™ã¹ã¦ã®åœŸåœ°ã‹ã‚‰å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="GodDeleteAllObjectsByUser">
**[AVATAR_NAME]**
-所有ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクト(スクリプト・オブジェクトã¨éžã‚¹ã‚¯ãƒªãƒ—ト・オブジェクト)を
+所有ã®ã™ã¹ã¦ã®ã‚ªãƒ–ジェクト(スクリプトオブジェクトã¨éžã‚¹ã‚¯ãƒªãƒ—トオブジェクト)を
ã“ã®ã‚·ãƒ å†…ã®ã™ã¹ã¦ã®åœŸåœ°ã‹ã‚‰å‰Šé™¤ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="BlankClassifiedName">
- クラシファイドã«åå‰ã‚’指定ã—ã¦ãã ã•ã„。
+ クラシファイドã®åå‰ã‚’指定ã—ã¦ãã ã•ã„。
</notification>
<notification name="MinClassifiedPrice">
- åºƒå‘Šæ–™ã®æ”¯æ‰•ã„金é¡ã¯ã€Lã¨[MIN_PRICE]ãŒä¸‹é™ã§ã™ã€‚
+ åºƒå‘Šæ–™ã¯æœ€ä½Ž L$ [MIN_PRICE] å¿…è¦ã§ã™ã€‚
金é¡ã‚’増やã—ã¦ãã ã•ã„。
</notification>
+ <notification name="ConfirmItemDeleteHasLinks">
+ ã“ã“ã«ãƒªãƒ³ã‚¯ã•れãŸã‚¢ã‚¤ãƒ†ãƒ ãŒå°‘ãªãã¨ã‚‚1ã¤ã‚りã¾ã™ã€‚ ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’削除ã™ã‚‹ã¨ã“ã“ã«ãƒªãƒ³ã‚¯ã•れãŸã‚‚ã®ãŒæ©Ÿèƒ½ã—ãªããªã‚Šã¾ã™ã€‚ リンクを先ã«å‰Šé™¤ã™ã‚‹ã“ã¨ã‚’å¼·ããŠå‹§ã‚ã—ã¾ã™ã€‚
+
+ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’削除ã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
+ </notification>
<notification name="ConfirmObjectDeleteLock">
- é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®1ã¤ä»¥ä¸ŠãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
+ é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®ã†ã¡ã€å°‘ãªãã¨ã‚‚ 1 ã¤ãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
-本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ConfirmObjectDeleteNoCopy">
- é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®1ã¤ä»¥ä¸ŠãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。
+ é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®ã†ã¡ã€å°‘ãªãã¨ã‚‚ 1 ã¤ãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。
-本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ConfirmObjectDeleteNoOwn">
- é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®1ã¤ä»¥ä¸Šã‚’ã€ã‚ãªãŸã¯æ‰€æœ‰ã—ã¦ã„ã¾ã›ã‚“。
+ é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã®ã†ã¡ã€å°‘ãªãã¨ã‚‚ 1 ã¤ãŒã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ã‚りã¾ã›ã‚“。
-本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ConfirmObjectDeleteLockNoCopy">
- 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
-一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。
+ å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
+å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。
-本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ConfirmObjectDeleteLockNoOwn">
- 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
-1ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトをã€ã‚ãªãŸã¯æ‰€æœ‰ã—ã¦ã„ã¾ã›ã‚“。
+ å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
+å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ã‚りã¾ã›ã‚“。
-本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ConfirmObjectDeleteNoCopyNoOwn">
- 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。
-1ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトをã€ã‚ãªãŸã¯æ‰€æœ‰ã—ã¦ã„ã¾ã›ã‚“。
+ å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。
+å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ã‚りã¾ã›ã‚“。
-本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ConfirmObjectDeleteLockNoCopyNoOwn">
- 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
-一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。
-1ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトをã€ã‚ãªãŸã¯æ‰€æœ‰ã—ã¦ã„ã¾ã›ã‚“。
+ å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
+å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒã‚³ãƒ”ーã§ãã¾ã›ã‚“。
+å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ã‚りã¾ã›ã‚“。
-本当ã«ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+本当ã«å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ConfirmObjectTakeLock">
- 一ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
+ å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
-ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å–å¾—ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+本当ã«ã“ã®ã¾ã¾å–å¾—ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ConfirmObjectTakeNoOwn">
- å–å¾—ã—よã†ã¨ã—ã¦ã„るオブジェクトã«ã¯ã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ãªã„オブジェクトãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚
-ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトをå–å¾—ã™ã‚‹ã¨ã€æ¬¡ã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æ¨©é™ãŒãã®ã‚ªãƒ–ジェクトã«é©ç”¨ã•れã¾ã™ã€‚
-ãã®ãŸã‚ã€å°†æ¥ã€å¤‰æ›´ã‚„コピーã®èƒ½åŠ›ãŒåˆ¶é™ã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚
+ å–å¾—ã—よã†ã¨ã—ã¦ã„るオブジェクトã«ã¯ã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚
+ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトをå–å¾—ã™ã‚‹ã¨ã€æ¬¡ã®æ‰€æœ‰è€…ã®æ¨©é™ãŒãã®ã‚ªãƒ–ジェクトã«é©ç”¨ã•れã¾ã™ã€‚
+ãã®ãŸã‚ã€å°†æ¥ã€ä¿®æ­£ã‚„コピーã®èƒ½åŠ›ãŒåˆ¶é™ã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚
-ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å–å¾—ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+本当ã«ã“ã®ã¾ã¾å–å¾—ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ConfirmObjectTakeLockNoOwn">
- 1ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
-å–å¾—ã—よã†ã¨ã—ã¦ã„るオブジェクトã«ã¯ã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ãªã„オブジェクトãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚
-ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトをå–å¾—ã™ã‚‹ã¨ã€æ¬¡ã®ã‚ªãƒ¼ãƒŠãƒ¼ã®æ¨©é™ãŒãã®ã‚ªãƒ–ジェクトã«é©ç”¨ã•れã¾ã™ã€‚
-ãã®ãŸã‚ã€å°†æ¥ã€å¤‰æ›´ã‚„コピーã®èƒ½åŠ›ãŒåˆ¶é™ã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚
+ å°‘ãªãã¨ã‚‚ 1 ã¤ã®ã‚ªãƒ–ジェクトãŒãƒ­ãƒƒã‚¯ã•れã¦ã„ã¾ã™ã€‚
+å–å¾—ã—よã†ã¨ã—ã¦ã„るオブジェクトã«ã¯ã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã€‚
+ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ãªã„オブジェクトをå–å¾—ã™ã‚‹ã¨ã€æ¬¡ã®æ‰€æœ‰è€…ã®æ¨©é™ãŒãã®ã‚ªãƒ–ジェクトã«é©ç”¨ã•れã¾ã™ã€‚
+ãã®ãŸã‚ã€å°†æ¥ã€ç·¨é›†ã‚„コピーã®èƒ½åŠ›ãŒåˆ¶é™ã•れるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚
ã“ã®é¸æŠžå†…容ã®ã¾ã¾ã§ç¶šè¡Œã™ã‚‹ã“ã¨ã¯å¯èƒ½ã§ã™ãŒã€
-ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã®å–å¾—ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+本当ã«ã“ã®ã¾ã¾å–å¾—ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="CantBuyLandAcrossMultipleRegions">
- 複数ã®åœ°åŸŸãŒé¸æŠžã•れãŸãŸã‚ã€åœŸåœ°ã‚’購入ã§ãã¾ã›ã‚“。
+ 複数ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ãŒé¸æŠžã•れãŸãŸã‚ã€åœŸåœ°ã‚’購入ã§ãã¾ã›ã‚“。
é¸æŠžã™ã‚‹é¢ç©ã‚’å°ã•ãã—ã¦ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
</notification>
<notification name="DeedLandToGroup">
ã“ã®åŒºç”»ã®è­²æ¸¡ã«éš›ã—ã¦ã¯ã€
-ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ãŒå分ãªåœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚’ä¿æœ‰ãŠã‚ˆã³ç¶­æŒã—ã¦ã„ã‚‹ã“ã¨ãŒå¿…è¦ã§ã™ã€‚
-土地ã®è³¼å…¥ä¾¡æ ¼ã¯ã€ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”金ã•れã¾ã›ã‚“。譲渡ã•れãŸåŒºç”»ãŒå£²ã‚Œã‚‹ã¨ã€è²©å£²ä¾¡æ ¼ã¯ã‚°ãƒ«ãƒ¼ãƒ—・メンãƒãƒ¼ã«å‡ç­‰ã«åˆ†é…ã•れã¾ã™ã€‚
+ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ãŒå分ãªåœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚’ä¿æœ‰ãŠã‚ˆã³ç¶­æŒã—ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
+土地ã®è³¼å…¥ä¾¡æ ¼ã¯ã€æ‰€æœ‰è€…ã«è¿”金ã•れã¾ã›ã‚“。譲渡ã•れãŸåŒºç”»ãŒå£²ã‚Œã‚‹ã¨ã€å£²ä¸Šé‡‘é¡ã¯ã‚°ãƒ«ãƒ¼ãƒ—メンãƒãƒ¼ã«å‡ç­‰ã«åˆ†é…ã•れã¾ã™ã€‚
-ã“ã®[AREA]平方メートルã®åœŸåœ°ã‚’ã€ã‚°ãƒ«ãƒ¼ãƒ—
-「[GROUP_NAME]ã€ã«è­²æ¸¡ã—ã¾ã™ã‹ï¼Ÿ
+ã“ã® [AREA] 平方メートルã®åœŸåœ°ã‚’ã€ã‚°ãƒ«ãƒ¼ãƒ—
+「 [GROUP_NAME] ã€ã«è­²æ¸¡ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="DeedLandToGroupWithContribution">
- ã“ã®åŒºç”»ã®è­²æ¸¡ã«éš›ã—ã¦ã¯ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ãŒ
-å分ãªåœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚’ä¿æœ‰ãŠã‚ˆã³ç¶­æŒã—ã¦ã„ã‚‹ã“ã¨ãŒå¿…è¦ã§ã™ã€‚
+ ã“ã®åŒºç”»ã®è­²æ¸¡ã«éš›ã—ã¦ã¯ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ãŒå分ãªåœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆã‚’ä¿æœ‰ãŠã‚ˆã³ç¶­æŒã—ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
ã“ã®è­²æ¸¡ã«ã‚ˆã‚Šã€
-「[FIRST_NAME] [LAST_NAME]ã€ã‹ã‚‰
+「 [FIRST_NAME] [LAST_NAME] ã€ã‹ã‚‰
グループã«å¯¾ã—ã¦åœŸåœ°ãŒåŒæ™‚ã«æä¾›ã•れã¾ã™ã€‚
-土地ã®è³¼å…¥ä¾¡æ ¼ã¯ã€ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”金ã•れã¾ã›ã‚“。
-譲渡ã•れãŸåŒºç”»ãŒå£²ã‚Œã‚‹ã¨ã€è²©å£²æ–™é‡‘ã¯ã‚°ãƒ«ãƒ¼ãƒ—・メンãƒãƒ¼ã«å‡ç­‰ã«åˆ†é…ã•れã¾ã™ã€‚
+土地ã®è³¼å…¥ä¾¡æ ¼ã¯ã€æ‰€æœ‰è€…ã«ã¯è¿”金ã•れã¾ã›ã‚“。
+譲渡ã•れãŸåŒºç”»ãŒå£²ã‚Œã‚‹ã¨ã€å£²ä¸Šé‡‘é¡ã¯ã‚°ãƒ«ãƒ¼ãƒ—メンãƒãƒ¼ã«å‡ç­‰ã«åˆ†é…ã•れã¾ã™ã€‚
-ã“ã®[AREA]平方メートルã®åœŸåœ°ã‚’ã€ã‚°ãƒ«ãƒ¼ãƒ—「[GROUP_NAME]ã€ã«è­²æ¸¡ã—ã¾ã™ã‹ï¼Ÿ
+ã“ã® [AREA] 平方メートルã®åœŸåœ°ã‚’ã€ã€Œ [GROUP_NAME] ã€ã«è­²æ¸¡ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="DisplaySetToSafe">
- -safeオプションを指定ã—ãŸã®ã§ã€
-表示設定ã¯ã‚»ãƒ¼ãƒ•・レベルã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚
+ -safe オプションを指定ã—ãŸã®ã§ã€
+表示設定ã¯ã‚»ãƒ¼ãƒ•レベルã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚
</notification>
<notification name="DisplaySetToRecommended">
- 表示設定ã¯ã€ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ æ§‹æˆã«
-基ã¥ã„ã¦æŽ¨å¥¨ã•れãŸãƒ¬ãƒ™ãƒ«ã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚
+ 表示設定ã¯ã€ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ æ§‹æˆã«åŸºã¥ã„ã¦æŽ¨å¥¨ã•れãŸãƒ¬ãƒ™ãƒ«ã«è¨­å®šã•れã¦ã„ã¾ã™ã€‚
</notification>
<notification name="ErrorMessage">
[ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AvatarMovedDesired">
目的地ã¯ç¾åœ¨ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。
@@ -1107,13 +1151,13 @@ L$ã¯è¿”金ã•れã¾ã›ã‚“。
<notification name="AvatarMovedHome">
ホームロケーションã¯ç¾åœ¨ã”利用ã„ãŸã ã‘ã¾ã›ã‚“。
è¿‘ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ç§»å‹•ã—ã¾ã—ãŸã€‚
-æ–°ãŸã«ãƒ›ãƒ¼ãƒ ã‚’設定ã—ãªãŠã—ãŸã»ã†ãŒã„ã„ã‹ã‚‚ã—れã¾ã›ã‚“。
+æ–°ãŸã«ãƒ›ãƒ¼ãƒ ã‚’設定ã—ç›´ã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。
</notification>
<notification name="ClothingLoading">
ç¾åœ¨è¡£é¡žã‚’ダウンロード中ã§ã™ã€‚
ã“ã®ã¾ã¾ [SECOND_LIFE] を通常通りã”使用ã„ãŸã ã‘ã¾ã™ã€‚他人ã‹ã‚‰ã¯ã‚ãªãŸã¯æ­£ã—ã表示ã•れã¾ã™ã€‚
<form name="form">
- <ignore name="ignore" text="衣類ãŒãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã•れるã¾ã§æ™‚é–“ãŒã‹ã‹ã£ã¦ã„ã¾ã™"/>
+ <ignore name="ignore" text="衣類ãŒãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã•れるã¾ã§æ™‚é–“ãŒã‹ã‹ã£ã¦ã„ã‚‹ã¨ã"/>
</form>
</notification>
<notification name="FirstRun">
@@ -1140,12 +1184,48 @@ L$ã¯è¿”金ã•れã¾ã›ã‚“。
ã¾ã‚‚ãªãã‚ãªãŸã®ã‚¢ãƒã‚¿ãƒ¼ãŒè¡¨ç¤ºã•れã¾ã™ã€‚
矢å°ã‚­ãƒ¼ã‚’使用ã—ã¦æ­©ãã¾ã™ã€‚
-ヘルプãŒå¿…è¦ãªã¨ãã‚„[SECOND_LIFE]ã«ã¤ã„ã¦çŸ¥ã‚ŠãŸã„ã¨ãã¯ã€
-F1キーを押ã—ã¦ãã ã•ã„。
+ヘルプãŒå¿…è¦ãªã¨ãã‚„ [SECOND_LIFE] ã«ã¤ã„ã¦çŸ¥ã‚ŠãŸã„ã¨ãã¯ã€
+F1 キーを押ã—ã¦ãã ã•ã„。
男性ã‚ã‚‹ã„ã¯å¥³æ€§ã®ã‚¢ãƒã‚¿ãƒ¼ã‚’é¸æŠžã—ã¦ãã ã•ã„。
ã‚ãªãŸã®æ±ºå®šã¯å¾Œã§å¤‰æ›´ã§ãã¾ã™ã€‚
<usetemplate name="okcancelbuttons" notext="女性" yestext="男性"/>
</notification>
+ <notification name="CantTeleportToGrid">
+ ç¾åœ¨ã®ã‚°ãƒªãƒƒãƒ‰ï¼ˆ[CURRENT_GRID])ã¨ã¯ã‚°ãƒªãƒƒãƒ‰ï¼ˆ[GRID])ãŒç•°ãªã‚‹ãŸã‚ã€[SLURL] ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ ビューワを閉ã˜ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="GeneralCertificateError">
+ サーãƒãƒ¼ã«æŽ¥ç¶šã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+[REASON]
+
+サブジェクトå: [SUBJECT_NAME_STRING]
+発行元: [ISSUER_NAME_STRING]
+有効日: [VALID_FROM]
+æ¬¡ã®æ›´æ–°æ—¥ï¼š [VALID_TO]
+MD5 フィンガープリント: [SHA1_DIGEST]
+SHA1 フィンガープリント: [MD5_DIGEST]
+キー使用法: [KEYUSAGE]
+拡張キー使用法: [EXTENDEDKEYUSAGE]
+サブジェクトキーèªè­˜åˆ¥å­ï¼š [SUBJECTKEYIDENTIFIER]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TrustCertificateError">
+ ã“ã®ã‚µãƒ¼ãƒãƒ¼ã®èªè¨¼æ©Ÿé–¢ã¯ä¸æ˜Žã§ã™ã€‚
+
+èªè¨¼æƒ…報:
+サブジェクトå: [SUBJECT_NAME_STRING]
+発行元: [ISSUER_NAME_STRING]
+有効日: [VALID_FROM]
+æ¬¡ã®æ›´æ–°æ—¥ï¼š [VALID_TO]
+MD5 フィンガープリント: [SHA1_DIGEST]
+SHA1 フィンガープリント: [MD5_DIGEST]
+キー使用法: [KEYUSAGE]
+拡張キー使用法: [EXTENDEDKEYUSAGE]
+サブジェクトキーèªè­˜åˆ¥å­ï¼š [SUBJECTKEYIDENTIFIER]
+
+ã“ã®èªè¨¼å±€ã‚’ä¿¡é ¼ã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="信用ã™ã‚‹"/>
+ </notification>
<notification name="NotEnoughCurrency">
[NAME] L$[PRICE] 残高ä¸è¶³ã®ãŸã‚実行ä¸å¯ã§ã™ã€‚
</notification>
@@ -1153,29 +1233,28 @@ F1キーを押ã—ã¦ãã ã•ã„。
[NAME] ã¯ã€ã‚ãªãŸã«ã‚ªãƒ–ジェクトã®ç·¨é›†æ¨©é™ã‚’与ãˆã¾ã—ãŸã€‚
</notification>
<notification name="RevokedModifyRights">
- [NAME] ã®ã‚ªãƒ–ジェクトを編集ã™ã‚‹æ¨©é™ã¯å–り消ã•れã¾ã—ãŸ
+ [NAME] ã®ã‚ªãƒ–ジェクトを編集ã™ã‚‹æ¨©é™ã¯å–り消ã•れã¾ã—ãŸã€‚
</notification>
<notification name="FlushMapVisibilityCaches">
- ã“ã®æ‰‹é †ã¯ã€ã“ã®åœ°åŸŸã®åœ°å›³ã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’消去ã—ã¾ã™ã€‚
-ã“れãŒä¾¿åˆ©ãªã®ã¯ãƒ‡ãƒãƒƒã‚°æ™‚ã®ã¿ã§ã™ã€‚
-(作æˆä¸­ã¯5分間経ã¤ã¨ã€å…¨å“¡ã®åœ°å›³ãŒå†åº¦ãƒ­ã‚°ã‚¤ãƒ³å¾Œã«
-æ›´æ–°ã•れã¾ã™ï¼‰
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã®åœ°å›³ã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’消去ã—ã¾ã™ã€‚
+デãƒãƒƒã‚°ç›®çš„ã®ã¿ã«ä¾¿åˆ©ãªæ“作ã§ã™ã€‚
+(作æˆä¸­ã¯ 5 分間経ã¤ã¨ã€å…¨å“¡ã®åœ°å›³ãŒå†åº¦ãƒ­ã‚°ã‚¤ãƒ³å¾Œã«æ›´æ–°ã•れã¾ã™ï¼‰
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="BuyOneObjectOnly">
- 一度ã«ä¸€ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトをã¨è²·ã†ã“ã¨ã¯ã§ãã¾ã›ã‚“。 オブジェクトを一ã¤ã ã‘é¸ã‚“ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
+ 一度㫠1 ã¤ä»¥ä¸Šã®ã‚ªãƒ–ジェクトを買ã†ã“ã¨ã¯ã§ãã¾ã›ã‚“。 オブジェクトを 1 ã¤ã ã‘é¸ã‚“ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="OnlyCopyContentsOfSingleItem">
- 一度ã«è¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã‚³ãƒ”ーã§ãã¾ã›ã‚“。
-é¸æŠžã™ã‚‹ã‚ªãƒ–ジェクトを1ã¤ã ã‘ã«ã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
+ 一度ã«è¤‡æ•°ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ä¸­èº«ã‚’コピーã§ãã¾ã›ã‚“。
+オブジェクトを 1 ã¤ã ã‘é¸æŠžã—ã¦ã€ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="KickUsersFromRegion">
- ã“ã®åœ°åŸŸã®å…¨ã¦ã®ä½äººã‚’ホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ã„ã‚‹å…¨ã¦ã®ä½äººã‚’ホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="EstateObjectReturn">
- [USER_NAME]ãŒæ‰€æœ‰ã—ã¦ã„るオブジェクトを返å´ã—ã¾ã™ã‹ï¼Ÿ
+ [USER_NAME] ãŒæ‰€æœ‰ã—ã¦ã„るオブジェクトを返å´ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="InvalidTerrainBitDepth">
@@ -1186,17 +1265,16 @@ F1キーを押ã—ã¦ãã ã•ã„。
</notification>
<notification name="InvalidTerrainSize">
地域テクスãƒãƒ£ã‚’設定ã§ãã¾ã›ã‚“ã§ã—ãŸï¼š
-地形テクスãƒãƒ£[TEXTURE_NUM]ã¯ã€[TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y]ã§ã¯å¤§ãã™ãŽã¾ã™ã€‚
+地形テクスãƒãƒ£ã€Œ [TEXTURE_NUM] ã€ã¯ã€[TEXTURE_SIZE_X]x[TEXTURE_SIZE_Y] ã§ã¯å¤§ãã™ãŽã¾ã™ã€‚
-テクスãƒãƒ£[TEXTURE_NUM]ã‚’24ビット512x512ã‹ãれ以下ã®ã‚¤ãƒ¡ãƒ¼ã‚¸ã¨äº¤æ›ã—ã€ã€Œé©ç”¨ã€ã‚’å†åº¦ã‚¯ãƒªãƒƒã‚¯ã—ã¦ãã ã•ã„。
+「 [TEXTURE_NUM] ã€ã‚’ 24 ビット 512x512 ã‹ãれ以下ã®ã‚¤ãƒ¡ãƒ¼ã‚¸ã¨äº¤æ›ã—ã€ã€Œé©ç”¨ã€ã‚’å†åº¦ã‚¯ãƒªãƒƒã‚¯ã—ã¦ãã ã•ã„。
</notification>
<notification name="RawUploadStarted">
- アップロード開始。 接続速度ã«ã‚ˆã£ã¦ã¯ã€
-最大2分間ã‹ã‹ã‚Šã¾ã™ã€‚
+ アップロードを開始ã—ã¾ã—ãŸã€‚ 接続速度ã«ã‚ˆã£ã¦ã¯ã€æœ€å¤§ 2 分間ã‹ã‹ã‚Šã¾ã™ã€‚
</notification>
<notification name="ConfirmBakeTerrain">
ç¾åœ¨ã®åœ°å½¢ã‚’構築ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
-ã“ã®æ“作を行ã†ã¨ã€ç¾åœ¨ã®åœ°å½¢ãŒä¸Šæ˜‡ï¼ä¸‹é™ã®åˆ¶é™ç¯„囲ã®ä¸­å¿ƒã«ãªã‚Šã€ã€Œå¾©å¸°ã€ãƒ„ールã®ãƒ‡ãƒ•ォルトã«ãªã‚Šã¾ã™ã€‚
+ã“ã®æ“作を行ã†ã¨ã€ç¾åœ¨ã®åœ°å½¢ãŒä¸Šæ˜‡ãƒ»ä¸‹é™ã®åˆ¶é™ç¯„囲ã®ä¸­å¿ƒã¨ãªã‚Šã€ã€Œå¾©å…ƒã€ãƒ„ールã®ãƒ‡ãƒ•ォルトã«ãªã‚Šã¾ã™ã€‚
æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
@@ -1204,35 +1282,34 @@ F1キーを押ã—ã¦ãã ã•ã„。
許å¯ä½äººã¯ [MAX_AGENTS] 人ã¾ã§ã§ã™ã€‚
</notification>
<notification name="MaxBannedAgentsOnRegion">
- ç¦æ­¢ä½äººã¯[MAX_BANNED]人ã¾ã§ã§ã™ã€‚
+ ç¦æ­¢ä½äººã¯ [MAX_BANNED] 人ã¾ã§ã§ã™ã€‚
</notification>
<notification name="MaxAgentOnRegionBatch">
[NUM_ADDED] 個ã®ã‚¨ãƒ¼ã‚¸ã‚§ãƒ³ãƒˆã‚’追加ã—よã†ã¨ã—ã¦å¤±æ•—ã—ã¾ã—ãŸï¼š [MAX_AGENTS] [LIST_TYPE] 制é™ã‚’ [NUM_EXCESS] 個超éŽã—ã¦ã„ã¾ã™ã€‚
</notification>
<notification name="MaxAllowedGroupsOnRegion">
- 許å¯ã‚°ãƒ«ãƒ¼ãƒ—ã¯[MAX_GROUPS]グループã¾ã§ã§ã™ã€‚
+ 許å¯ã‚°ãƒ«ãƒ¼ãƒ—㯠[MAX_GROUPS] グループã¾ã§ã§ã™ã€‚
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="構築ã™ã‚‹"/>
</notification>
<notification name="MaxManagersOnRegion">
- ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã¯[MAX_MANAGER]人ã¾ã§ã§ã™ã€‚
+ ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã¯ [MAX_MANAGER] 人ã¾ã§ã§ã™ã€‚
</notification>
<notification name="OwnerCanNotBeDenied">
- ä¸å‹•産オーナーをä¸å‹•ç”£ã€Œç¦æ­¢ä½äººã€ãƒªã‚¹ãƒˆã«è¿½åŠ ã§ãã¾ã›ã‚“。
+ ä¸å‹•産オーナーをä¸å‹•産ã®ã€Œç¦æ­¢ä½äººã€ãƒªã‚¹ãƒˆã«è¿½åŠ ã§ãã¾ã›ã‚“。
</notification>
<notification name="CanNotChangeAppearanceUntilLoaded">
- æœãŠã‚ˆã³å½¢ãŒãƒ­ãƒ¼ãƒ‰ã•れるã¾ã§ã€å®¹å§¿ã®å¤‰æ›´ã¯ã§ãã¾ã›ã‚“。
+ 衣類ãŠã‚ˆã³ã‚·ã‚§ã‚¤ãƒ—ãŒèª­ã¿è¾¼ã¾ã‚Œã‚‹ã¾ã§ã¯ã€å®¹å§¿ã®å¤‰æ›´ã¯ã§ãã¾ã›ã‚“。
</notification>
<notification name="ClassifiedMustBeAlphanumeric">
- クラシファイド広告ã®åå‰ã¯ã€ã‚¢ãƒ«ãƒ•ァベットã‹
-æ•°å­—ã§å§‹ã‚ã¾ã™ã€‚ å¥èª­ç‚¹ã§ã¯å§‹ã‚られã¾ã›ã‚“。
+ クラシファイド広告ã®åå‰ã¯ã€ã‚¢ãƒ«ãƒ•ã‚¡ãƒ™ãƒƒãƒˆã‹æ•°å­—ã§å§‹ã‚ã¾ã™ã€‚å¥èª­ç‚¹ã§ã¯å§‹ã‚られã¾ã›ã‚“。
</notification>
<notification name="CantSetBuyObject">
- オブジェクトãŒè²©å£²å¯¾è±¡ã§ã¯ãªã„ãŸã‚ã€ã‚ªãƒ–ジェクトã®è³¼å…¥ãŒè¨­å®šã§ãã¾ã›ã‚“。
-販売対象ã®ã‚ªãƒ–ジェクトを設定ã—ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
+ オブジェクトãŒè²©å£²å¯¾è±¡ã§ã¯ãªã„ãŸã‚ã€ã‚ªãƒ–ジェクトã®è³¼å…¥ãŒã§ãã¾ã›ã‚“。
+販売対象ã®ã‚ªãƒ–ジェクトを指定ã—ã¦ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
</notification>
<notification name="FinishedRawDownload">
- 未加工ã®åœ°å½¢ãƒ•ァイルを次ã¸ã¨ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã—ã¾ã—ãŸï¼š
-[DOWNLOAD_PATH]。
+ 未加工ã®åœ°å½¢ãƒ•ァイルをダウンロードã—ã¾ã—ãŸï¼š
+[DOWNLOAD_PATH]
</notification>
<notification name="DownloadWindowsMandatory">
[APP_NAME] ã®æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒã”利用å¯èƒ½ã§ã™ã€‚
@@ -1296,59 +1373,57 @@ F1キーを押ã—ã¦ãã ã•ã„。
</notification>
<notification name="DeedObjectToGroup">
ã“ã®ã‚ªãƒ–ジェクトを譲渡ã™ã‚‹ã¨ã‚°ãƒ«ãƒ¼ãƒ—ã¯ä»¥ä¸‹ã®ã“ã¨ãŒå¯èƒ½ã§ã™ï¼š
-* ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ”¯æ‰•ã‚れãŸL$ã‚’å—é ˜ã—ã¾ã™ã€‚
- <usetemplate ignoretext="オブジェクトをグループã«è­²æ¸¡ã™ã‚‹å‰ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="å–り消ã—" yestext="譲渡"/>
+* ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ”¯æ‰•ã‚れ㟠L$ ã‚’å—é ˜ã—ã¾ã™ã€‚
+ <usetemplate ignoretext="オブジェクトをグループã«è­²æ¸¡ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="å–り消ã—" yestext="譲渡"/>
</notification>
<notification name="WebLaunchExternalTarget">
Web ブラウザを開ã„ã¦ã“ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„を表示ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="ブラウザを起動ã—㦠Web ページを見る" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ <usetemplate ignoretext="ブラウザを起動ã—㦠Web ページを見るã¨ã" name="okcancelignore" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="WebLaunchJoinNow">
[http://jp.secondlife.com/account/ マイアカウント] ページã«ç§»å‹•ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’管ç†ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’管ç†ã™ã‚‹" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
+ <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‚’管ç†ã™ã‚‹ã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="WebLaunchSecurityIssues">
- [SECOND_LIFE] Wikiã§ã€
-セキュリティå•題を報告ã™ã‚‹æ–¹æ³•ã‚’ã”覧ãã ã•ã„。
- <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£å•題ã®å ±å‘Šã®ä»•方を確èªã™ã‚‹" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ [SECOND_LIFE] Wiki ã§ã€ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£å•題を報告ã™ã‚‹æ–¹æ³•ã‚’ã”覧ãã ã•ã„。
+ <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚»ã‚­ãƒ¥ãƒªãƒ†ã‚£å•題ã®å ±å‘Šã®ä»•方を確èªã™ã‚‹ã¨ã" name="okcancelignore" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="WebLaunchQAWiki">
- [SECOND_LIFE] å“質ä¿è¨¼é–¢é€£Wikiã‚’ã”覧ãã ã•ã„。
- <usetemplate ignoretext="ブラウザを起動ã—㦠QA Wiki を見る" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ [SECOND_LIFE] å“質ä¿è¨¼é–¢é€£ Wiki ã‚’ã”覧ãã ã•ã„。
+ <usetemplate ignoretext="ブラウザを起動ã—㦠QA Wiki を見るã¨ã" name="okcancelignore" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="WebLaunchPublicIssue">
- [SECOND_LIFE]ã®ãƒ‘ブリックå•題トラッカーã§ã€
+ [SECOND_LIFE] ã®ãƒ‘ブリックå•題トラッカーã§ã€
ãƒã‚°ã‚„ãã®ä»–ã®å•題を報告ã§ãã¾ã™ã€‚
- <usetemplate ignoretext="ブラウザを確èªã—ã¦ãƒ‘ブリックå•題トラッカーを使用ã™ã‚‹" name="okcancelignore" notext="キャンセル" yestext="ページã¸è¡Œã"/>
+ <usetemplate ignoretext="ブラウザを起動ã—ã¦ãƒ‘ブリックå•題トラッカーを使用ã™ã‚‹ã¨ã" name="okcancelignore" notext="キャンセル" yestext="ページã¸è¡Œã"/>
</notification>
<notification name="WebLaunchSupportWiki">
- Lindenå…¬å¼ãƒ–ログã§ã€æœ€æ–°ã®ãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚„情報を入手ã—ã¦ãã ã•ã„。
- <usetemplate ignoretext="ブラウザを起動ã—ã¦å…¬å¼ãƒ–ログを見る" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
+ Linden å…¬å¼ãƒ–ログã§ã€æœ€æ–°ã®ãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚„情報を入手ã—ã¦ãã ã•ã„。
+ <usetemplate ignoretext="ブラウザを起動ã—ã¦å…¬å¼ãƒ–ログを見るã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="WebLaunchLSLGuide">
スクリプトガイドを開ãã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚¹ã‚¯ãƒªãƒ—トガイドを見る" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
+ <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚¹ã‚¯ãƒªãƒ—トガイドを見るã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="WebLaunchLSLWiki">
LSL ãƒãƒ¼ã‚¿ãƒ«ã§ã‚¹ã‚¯ãƒªãƒ—トã«é–¢ã™ã‚‹æƒ…報を確èªã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="ブラウザを起動ã—㦠LSL ãƒãƒ¼ã‚¿ãƒ«ã‚’見る" name="okcancelignore" notext="å–り消ã—" yestext="ページã«ç§»å‹•"/>
+ <usetemplate ignoretext="ブラウザを起動ã—㦠LSL ãƒãƒ¼ã‚¿ãƒ«ã‚’見るã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="ページã«ç§»å‹•"/>
</notification>
<notification name="ReturnToOwner">
é¸æŠžã—ãŸã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’ã€æ‰€æœ‰è€…ã«è¿”å´ã—ã¾ã™ã‹ï¼Ÿ
-譲渡å¯èƒ½ãªã‚ªãƒ–ジェクトã¯
-以å‰ã®æ‰€æœ‰è€…ã«è¿”å´ã•れã¾ã™ã€‚
+「å†è²©ãƒ»ãƒ—レゼントå¯ã€ã®è­²æ¸¡ã•れãŸã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®æ‰€æœ‰è€…ã«è¿”å´ã•れã¾ã™ã€‚
-*警告* 移転ãŒä¸å¯èƒ½ã®è­²æ¸¡ã•れãŸã‚ªãƒ–ジェクトã¯å‰Šé™¤ã•れã¾ã™ï¼
- <usetemplate ignoretext="オブジェクトを所有者ã«è¿”å´ã™ã‚‹å‰ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
+*警告* 「å†è²©ãƒ»ãƒ—レゼントä¸å¯ã€ã®è­²æ¸¡ã•れãŸã‚ªãƒ–ジェクトã¯ã€å‰Šé™¤ã•れã¾ã™ï¼
+ <usetemplate ignoretext="オブジェクトを所有者ã«è¿”å´ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="GroupLeaveConfirmMember">
- ç¾åœ¨ã‚ãªãŸã¯ [GROUP]ã®ãƒ¡ãƒ³ãƒãƒ¼ã§ã™ã€‚
-ã“ã“ã‹ã‚‰æŠœã‘ã¾ã™ã‹ï¼Ÿ
+ ç¾åœ¨ã‚ãªãŸã¯ [GROUP] ã®ãƒ¡ãƒ³ãƒãƒ¼ã§ã™ã€‚
+ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—を抜ã‘ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="ConfirmKick">
- ã™ã¹ã¦ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’グリッド外ã«ã‚­ãƒƒã‚¯ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="å…¨ã¦ã®ãƒ¦ãƒ¼ã‚¶ã‚’追ã„出ã™"/>
+ 本当ã«ä½äººå…¨å“¡ã‚’グリッドã‹ã‚‰è¿½ã„出ã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="ä½äººå…¨å“¡ã‚’追ã„出ã™"/>
</notification>
<notification name="MuteLinden">
リンデンをブロックã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
@@ -1362,27 +1437,26 @@ F1キーを押ã—ã¦ãã ã•ã„。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="RemoveItemWarn">
- コンテンツを削除ã™ã‚‹ã¨ã€è¨±å¯ãŒã‚ã£ã¦ã‚‚ã€ã‚ªãƒ–ジェクトã«ãƒ€ãƒ¡ãƒ¼ã‚¸ã‚’与ãˆã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚
-ãã®ã‚¢ã‚¤ãƒ†ãƒ ã®å‰Šé™¤ã‚’ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+ コンテンツを削除ã™ã‚‹ã¨ã€è¨±å¯ãŒã‚ã£ã¦ã‚‚ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æå‚·ã‚’ä¸Žãˆã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚
+削除を続ã‘ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="CantOfferCallingCard">
- ç¾åœ¨ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’é€ã‚Œã¾ã›ã‚“。数分後ã«ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
+ ç¾åœ¨ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’é€ã‚Œã¾ã›ã‚“。数分後ã«ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="CantOfferFriendship">
- ç¾åœ¨ãƒ•レンドシップをé€ã‚Œã¾ã›ã‚“。数分後ã«è©¦ã—ã¦ãã ã•ã„。
+ ç¾åœ¨ãƒ•レンドシップをé€ã‚Œã¾ã›ã‚“。数分後ã«ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="BusyModeSet">
å–り込ã¿ä¸­ãƒ¢ãƒ¼ãƒ‰ã«ãªã‚Šã¾ã—ãŸã€‚
ãƒãƒ£ãƒƒãƒˆã¨ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯è¡¨ç¤ºã•れã¾ã›ã‚“。 å—ä¿¡ã™ã‚‹ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ãƒˆãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¯å–り込ã¿ä¸­è¿”答メッセージãŒè¡¨ç¤ºã•れã¾ã™ã€‚ テレãƒãƒ¼ãƒˆã®ã‚ªãƒ•ァーã¯å—ã‘å–り拒å¦ã¨ãªã‚Šã¾ã™ã€‚ アイテムã®ã‚ªãƒ•ァーã¯ã™ã¹ã¦ã”ã¿ç®±ã«å…¥ã‚Šã¾ã™ã€‚
- <usetemplate ignoretext="ログイン状態をå–り込ã¿ä¸­ãƒ¢ãƒ¼ãƒ‰ã«å¤‰æ›´ã™ã‚‹" name="okignore" yestext="OK"/>
+ <usetemplate ignoretext="ログイン状態をå–り込ã¿ä¸­ãƒ¢ãƒ¼ãƒ‰ã«å¤‰æ›´ã™ã‚‹ã¨ã" name="okignore" yestext="OK"/>
</notification>
<notification name="JoinedTooManyGroupsMember">
加入ã§ãã‚‹ã‚°ãƒ«ãƒ¼ãƒ—ã®æœ€å¤§é™ã«é”ã—ã¾ã—ãŸã€‚ ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«åŠ å…¥ã™ã‚‹ãŸã‚ã«ä»–ã®ã‚°ãƒ«ãƒ¼ãƒ—を脱退ã™ã‚‹ã‹ã€ã“ã®ç”³ã—入れを断ã£ã¦ãã ã•ã„。
[NAME] ãŒã‚ãªãŸã‚’グループã®ãƒ¡ãƒ³ãƒãƒ¼ã¨ã—ã¦å‹§èª˜ã—ã¦ã„ã¾ã™ã€‚
-[INVITE]
<usetemplate name="okcancelbuttons" notext="辞退" yestext="å‚加"/>
</notification>
<notification name="JoinedTooManyGroups">
@@ -1390,7 +1464,7 @@ F1キーを押ã—ã¦ãã ã•ã„。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="KickUser">
- ã©ã‚“ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦ã€ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追ã„出ã—ã¾ã™ã‹ï¼Ÿ
+ ã©ã®ã‚ˆã†ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ·»ãˆã¦ã“ã®ä½äººã‚’追ã„出ã—ã¾ã™ã‹ï¼Ÿ
<form name="form">
<input name="message">
ã‚ãªãŸã¯ç®¡ç†è€…ã«ã‚ˆã‚Šãƒ­ã‚°ã‚ªãƒ•ã•れã¾ã—ãŸã€‚
@@ -1400,7 +1474,7 @@ F1キーを押ã—ã¦ãã ã•ã„。
</form>
</notification>
<notification name="KickAllUsers">
- ã©ã‚“ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦ã€ã‚°ãƒªãƒƒãƒ‰ã«ã„る全員を追ã„出ã—ã¾ã™ã‹ï¼Ÿ
+ ã©ã®ã‚ˆã†ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ã¤ã‘ã¦ã‚°ãƒªãƒƒãƒ‰ã«ã„る全員を追ã„出ã—ã¾ã™ã‹ï¼Ÿ
<form name="form">
<input name="message">
ã‚ãªãŸã¯ç®¡ç†è€…ã«ã‚ˆã‚Šãƒ­ã‚°ã‚ªãƒ•ã•れã¾ã—ãŸã€‚
@@ -1410,17 +1484,17 @@ F1キーを押ã—ã¦ãã ã•ã„。
</form>
</notification>
<notification name="FreezeUser">
- ã©ã‚“ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦ã€ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’フリーズã—ã¾ã™ã‹ï¼Ÿ
+ ã©ã®ã‚ˆã†ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ·»ãˆã¦ã“ã®ä½äººã‚’フリーズã—ã¾ã™ã‹ï¼Ÿ
<form name="form">
<input name="message">
- ã‚ãªãŸã¯ãƒ•リーズã•れã¦ã„ã¾ã™ã€‚ å‹•ãã“ã¨ã‚‚ãƒãƒ£ãƒƒãƒˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã›ã‚“。 管ç†è€…ãŒIMを通ã˜ã¦ã‚ãªãŸã«é€£çµ¡ã—ã¾ã™ã€‚
+ ã‚ãªãŸã¯ãƒ•リーズã•れã¦ã„ã¾ã™ã€‚ å‹•ãã“ã¨ã‚‚ãƒãƒ£ãƒƒãƒˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã›ã‚“。 管ç†è€…㌠IM ã§ã‚ãªãŸã«é€£çµ¡ã—ã¾ã™ã€‚
</input>
<button name="OK" text="OK"/>
<button name="Cancel" text="å–り消ã—"/>
</form>
</notification>
<notification name="UnFreezeUser">
- ã©ã‚“ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¦ã€ã“ã®ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®ãƒ•リーズを解除ã—ã¾ã™ã‹ï¼Ÿ
+ ã©ã®ã‚ˆã†ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ·»ãˆã¦ã“ã®ä½äººã®ãƒ•リーズを解除ã—ã¾ã™ã‹ï¼Ÿ
<form name="form">
<input name="message">
ã‚‚ã†ãƒ•リーズã•れã¦ã„ã¾ã›ã‚“。
@@ -1430,40 +1504,43 @@ F1キーを押ã—ã¦ãã ã•ã„。
</form>
</notification>
<notification name="OfferTeleport">
- 次ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ·»ãˆã¦ã‚ãªãŸãŒä»Šã„る場所ã¸ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™ã‹ï¼Ÿ
+ 次ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ·»ãˆã¦ç¾åœ¨åœ°ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™ã‹ï¼Ÿ
<form name="form">
<input name="message">
- [REGION]ã«æ¥ã¾ã›ã‚“ã‹ï¼Ÿ
+ [REGION] ã«æ¥ã¾ã›ã‚“ã‹ï¼Ÿ
</input>
<button name="OK" text="OK"/>
<button name="Cancel" text="å–り消ã—"/>
</form>
</notification>
<notification name="OfferTeleportFromGod">
- ユーザーをゴッド・コールã§å‘¼ã³å¯„ã›ã¾ã™ã‹ï¼Ÿ
+ ç¾åœ¨åœ°ã«ä½äººã‚’ゴッドサモンã—ã¾ã™ã‹ï¼Ÿ
<form name="form">
<input name="message">
- [REGION]ã«æ¥ã¾ã›ã‚“ã‹ï¼Ÿ
+ [REGION] ã«æ¥ã¾ã›ã‚“ã‹ï¼Ÿ
</input>
<button name="OK" text="OK"/>
<button name="Cancel" text="å–り消ã—"/>
</form>
</notification>
<notification name="TeleportFromLandmark">
- 本当ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="ランドマークã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ãŸã„ã‹ç¢ºèªã™ã‚‹" name="okcancelignore" notext="キャンセル" yestext="テレãƒãƒ¼ãƒˆ"/>
+ ã“ã®ã¾ã¾ &lt;nolink&gt;[LOCATION]&lt;/nolink&gt; ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate ignoretext="ランドマークã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ãŸã„ã‹ã©ã†ã‹ã®ç¢ºèª" name="okcancelignore" notext="キャンセル" yestext="テレãƒãƒ¼ãƒˆ"/>
</notification>
<notification name="TeleportToPick">
[PICK] ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="ピックã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ãŸã„ã‹ç¢ºèªã™ã‚‹" name="okcancelignore" notext="キャンセル" yestext="テレãƒãƒ¼ãƒˆ"/>
+ <usetemplate ignoretext="ピックã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ãŸã„ã‹ã©ã†ã‹ã®ç¢ºèª" name="okcancelignore" notext="キャンセル" yestext="テレãƒãƒ¼ãƒˆ"/>
</notification>
<notification name="TeleportToClassified">
[CLASSIFIED] ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="クラシファイド広告ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ãŸã„ã‹ç¢ºèªã™ã‚‹" name="okcancelignore" notext="キャンセル" yestext="テレãƒãƒ¼ãƒˆ"/>
+ <usetemplate ignoretext="クラシファイド広告ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ãŸã„ã‹ã©ã†ã‹ã®ç¢ºèª" name="okcancelignore" notext="キャンセル" yestext="テレãƒãƒ¼ãƒˆ"/>
+ </notification>
+ <notification name="TeleportToHistoryEntry">
+ [HISTORY_ENTRY] ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate ignoretext="履歴ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ãŸã„ã‹ã©ã†ã‹ã®ç¢ºèª" name="okcancelignore" notext="キャンセル" yestext="テレãƒãƒ¼ãƒˆ"/>
</notification>
<notification label="ã‚ãªãŸã®ä¸å‹•産内ã®å…¨å“¡ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡" name="MessageEstate">
- 今ã‚ãªãŸã®ä¸å‹•産ã«ã„る人全員ã«é€ã‚‹
-短ã„メッセージを入力ã—ã¦ãã ã•ã„。
+ 今ã‚ãªãŸã®ä¸å‹•産ã«ã„る人全員ã«é€ã‚‹ã€çŸ­ã„メッセージを入力ã—ã¦ãã ã•ã„。
<form name="form">
<input name="message"/>
<button name="OK" text="OK"/>
@@ -1471,88 +1548,91 @@ F1キーを押ã—ã¦ãã ã•ã„。
</form>
</notification>
<notification label="Lindenã®ä¸å‹•産を変更" name="ChangeLindenEstate">
- ã‚ãªãŸã¯Linden所有ã®ä¸å‹•産(メインランドã€ãƒ†ã‚£ãƒ¼ãƒ³ã‚°ãƒªãƒƒãƒ‰ã€ã‚ªãƒªã‚¨ãƒ³ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ãªã©ï¼‰ã‚’変更ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
+ ãƒªãƒ³ãƒ‡ãƒ³ãŒæ‰€æœ‰ã™ã‚‹ã‚¨ã‚¹ãƒ†ãƒ¼ãƒˆï¼ˆãƒ¡ã‚¤ãƒ³ãƒ©ãƒ³ãƒ‰ã€ãƒ†ã‚£ãƒ¼ãƒ³ã‚°ãƒªãƒƒãƒ‰ã€ã‚ªãƒªã‚¨ãƒ³ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ãªã©ï¼‰ã‚’変更ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
-ã“れã¯ãƒ¦ãƒ¼ã‚¶ãƒ¼ã®çµŒé¨“を根本ã‹ã‚‰æºã‚‹ãŒã—ã‹ã­ãªã„「éžå¸¸ã«å±é™ºãªè¡Œç‚ºã€ã§ã™ã€‚ã“れã«ã‚ˆã‚Šã€ãƒ¡ã‚¤ãƒ³ãƒ©ãƒ³ãƒ‰ã§å¤šæ•°ã®åœ°åŸŸãŒå¤‰æ›´ã•れã€ã‚¹ãƒšãƒ¼ã‚¹ã‚µãƒ¼ãƒãƒ¼ã«æ‚ªå½±éŸ¿ãŒç”Ÿã˜ã¾ã™ã€‚
+ä½äººã®ä½“é¨“ã«æ ¹æœ¬çš„ã«å½±éŸ¿ã‚’与ãˆã‚‹ãŸã‚ã€éžå¸¸ã«å±é™ºãªè¡Œç‚ºã§ã™ã€‚ メインランドã§ã¯ã€ä½•åƒã¨ã„ã†ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ãŒå¤‰æ›´ã«ã‚ˆã‚‹å½±éŸ¿ã‚’å—ã‘ã€ãã®ãŸã‚スペースサーãƒãƒ¼ã«è² æ‹…ã‚’ã‹ã‘ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚
-æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
+ãれã§ã‚‚ç¶šã‘ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification label="Lindenã®ä¸å‹•産ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’変更" name="ChangeLindenAccess">
- ã‚ãªãŸã¯Linden所有ã®ä¸å‹•産(メインランドã€ãƒ†ã‚£ãƒ¼ãƒ³ã‚°ãƒªãƒƒãƒ‰ã€ã‚ªãƒªã‚¨ãƒ³ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ãªã©ï¼‰ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãƒªã‚¹ãƒˆã‚’変更ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
+ ã‚ãªãŸã¯ãƒªãƒ³ãƒ‡ãƒ³æ‰€æœ‰ã®ä¸å‹•産(メインランドã€ãƒ†ã‚£ãƒ¼ãƒ³ã‚°ãƒªãƒƒãƒ‰ã€ã‚ªãƒªã‚¨ãƒ³ãƒ†ãƒ¼ã‚·ãƒ§ãƒ³ãªã©ï¼‰ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ãƒªã‚¹ãƒˆã‚’変更ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
ã“ã®è¡Œç‚ºã¯ã€Œå±é™ºã€ã§ã‚りã€ã‚°ãƒªãƒƒãƒ‰ã‹ã‚‰ã‚ªãƒ–ジェクトやãŠé‡‘ã®è»¢é€ã‚’ã‚‚ãŸã‚‰ã™ãƒãƒƒã‚­ãƒ³ã‚°ã‚’引ãèµ·ã“ã™å¯èƒ½æ€§ãŒã‚ã‚‹ãŸã‚ã€å®Œå…¨ã«ãれをæ„図ã—ãŸå ´åˆã®ã¿è¡Œã†ã¹ãã‚‚ã®ã§ã™ã€‚
-ã“れã«ã‚ˆã‚Šå¤šæ•°ã®åœ°åŸŸãŒå¤‰æ›´ã•れã€ã‚¹ãƒšãƒ¼ã‚¹ã‚µãƒ¼ãƒãƒ¼ã«æ‚ªå½±éŸ¿ãŒç”Ÿã˜ã¾ã™ã€‚
+ã“れã«ã‚ˆã‚Šå¤šæ•°ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ãŒå¤‰æ›´ã•れã€ã‚¹ãƒšãƒ¼ã‚¹ã‚µãƒ¼ãƒãƒ¼ã«æ‚ªå½±éŸ¿ãŒç”Ÿã˜ã¾ã™ã€‚
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedAgentAdd">
- ã“ã®ä¸å‹•産ã®è¨±å¯ãƒªã‚¹ãƒˆã ã‘ã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚[ALL_ESTATES]ã®ã™ã¹ã¦ã®è¨±å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ
+ ã“ã®ä¸å‹•産é™å®šã®è¨±å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ [ALL_ESTATES] ã®è¨±å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/>
</notification>
<notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedAgentRemove">
- 許å¯ãƒªã‚¹ãƒˆã‹ã‚‰ã®å‰Šé™¤ã‚’ã“ã®ä¸å‹•産ã«ã¤ã„ã¦ã®ã¿è¡Œã„ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ã€[ALL_ESTATES]ã«ã¤ã„ã¦è¡Œã„ã¾ã™ã‹ï¼Ÿ
+ ã“ã®ä¸å‹•産é™å®šã®è¨±å¯ãƒªã‚¹ãƒˆã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ã€[ALL_ESTATES] ã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/>
</notification>
<notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedGroupAdd">
- ã“ã®ä¸å‹•産ã®ã‚°ãƒ«ãƒ¼ãƒ—許å¯ãƒªã‚¹ãƒˆã ã‘ã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚[ALL_ESTATES]ã®ã‚°ãƒ«ãƒ¼ãƒ—許å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ
+ ã“ã®ä¸å‹•産é™å®šã®ã‚°ãƒ«ãƒ¼ãƒ—許å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ [ALL_ESTATES] ã®ã‚°ãƒ«ãƒ¼ãƒ—許å¯ãƒªã‚¹ãƒˆã«è¿½åŠ ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/>
</notification>
<notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateAllowedGroupRemove">
- 許å¯ãƒªã‚¹ãƒˆã‹ã‚‰ã®å‰Šé™¤ã‚’ã“ã®ä¸å‹•産ã«ã¤ã„ã¦ã®ã¿è¡Œã„ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ã€[ALL_ESTATES]ã«ã¤ã„ã¦è¡Œã„ã¾ã™ã‹ï¼Ÿ
+ ã“ã®ä¸å‹•産é™å®šã®è¨±å¯ãƒªã‚¹ãƒˆã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ã€[ALL_ESTATES] ã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/>
</notification>
<notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateBannedAgentAdd">
- ã“ã®ä¸å‹•産ã«ã¤ã„ã¦ã®ã¿ã‚¢ã‚¯ã‚»ã‚¹ã‚’æ‹’å¦ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚[ALL_ESTATE]ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’æ‹’å¦ã—ã¾ã™ã‹ï¼Ÿ
+ ã“ã®ä¸å‹•産é™å®šã§ã‚¢ã‚¯ã‚»ã‚¹ã‚’æ‹’å¦ã—ã¾ã™ã‹ï¼Ÿ ãれã¨ã‚‚ [ALL_ESTATE] ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’æ‹’å¦ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/>
</notification>
<notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateBannedAgentRemove">
- ã“ã®ä½äººã‚’ã€ã“ã®ä¸å‹•産ã®ã¿ã€ã¾ãŸã¯[ALL_ESTATES]ã¸ã¨ã‚¢ã‚¯ã‚»ã‚¹ã§ãるよã†ã«ã€ç¦æ­¢ãƒªã‚¹ãƒˆã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
+ ã“ã®ä½äººãŒã€ã“ã®ä¸å‹•産é™å®šã€ã¾ãŸã¯ [ALL_ESTATES] ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãるよã†ã«ã€ç¦æ­¢ãƒªã‚¹ãƒˆã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/>
</notification>
<notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateManagerAdd">
- ã“ã®ä¸å‹•産ã®ã¿ã€ã¾ãŸã¯[ALL_ESTATES]ã«å¯¾ã—ã¦ã€ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’追加ã—ã¾ã™ã‹ï¼Ÿ
+ ã“ã®ä¸å‹•産é™å®šã€ã¾ãŸã¯ [ALL_ESTATES] ã®ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’追加ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/>
</notification>
<notification label="ä¸å‹•ç”£ã‚’é¸æŠž" name="EstateManagerRemove">
- ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’ã€ã“ã®ä¸å‹•産ã®ã¿ã€ã¾ãŸã¯[ALL_ESTATES]ã‹ã‚‰ã€å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
+ ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã‚’ã€ã“ã®ä¸å‹•産é™å®šã€ã¾ãŸã¯ [ALL_ESTATES] ã‹ã‚‰ã€å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate canceltext="å–り消ã—" name="yesnocancelbuttons" notext="ã™ã¹ã¦ã®ä¸å‹•産" yestext="ã“ã®ä¸å‹•産"/>
</notification>
<notification label="キックを確èª" name="EstateKickUser">
- ã“ã®ä¸å‹•産ã‹ã‚‰[EVIL_USER]を追ã„出ã—ã¾ã™ã‹ï¼Ÿ
+ ã“ã®ä¸å‹•産ã‹ã‚‰ [EVIL_USER] を追ã„出ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="EstateChangeCovenant">
- ä¸å‹•産約款を変更ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
+ ä¸å‹•産約款を変更ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ç¶šã‘ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="RegionEntryAccessBlocked">
- ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 年齢を確èªã™ã‚‹éš›ã®æƒ…å ±ã«ä¸è¶³ãŒã‚ã£ãŸãŸã‚ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚
+ ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 年齢を確èªã™ã‚‹éš›ã®æƒ…å ±ã«ä¸è¶³ãŒã‚ã£ãŸãŸã‚ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚
最新ビューワãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã‹ã‚’ã”確èªãã ã•ã„。ã“ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã§ã®ã‚¢ã‚¯ã‚»ã‚¹ã«é–¢ã™ã‚‹è©³ç´°ã¯ãƒŠãƒ¬ãƒƒã‚¸ãƒ™ãƒ¼ã‚¹ã‚’ã”覧ãã ã•ã„。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="RegionEntryAccessBlocked_KB">
- ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
ナレッジベースを開ãレーティング区分ã«ã¤ã„ã¦å­¦ã³ã¾ã™ã‹ï¼Ÿ
<url name="url">
http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/ja
</url>
- <usetemplate ignoretext="レーティング区分ã®åˆ¶é™ã®ãŸã‚ã€ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="ナレッジベースを開ã"/>
+ <usetemplate ignoretext="レーティング区分ã®åˆ¶é™ã®ãŸã‚ã€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥ã‚‹ã“ã¨ãŒã§ããªã„ã¨ã" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="ナレッジベースを開ã"/>
</notification>
<notification name="RegionEntryAccessBlocked_Notify">
- ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
</notification>
<notification name="RegionEntryAccessBlocked_Change">
- ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†è¨­å®šã«ã‚ˆã‚Šã€ãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ レーティング区分ã«é–¢ã™ã‚‹è¨­å®šã«ã‚ˆã‚Šã€ãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«ã¯ç«‹ã¡å…¥ã‚Œã¾ã›ã‚“。
-「設定を変更ã€ã‚’クリックã—ã¦ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã‚’上ã’ã‚‹ã¨ã€å…¥ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ã‚ãªãŸã¯ä»Šå¾Œ [REGIONMATURITY] ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ¤œç´¢åŠã³ã‚¢ã‚¯ã‚»ã‚¹ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ ã‚ã¨ã§è¨­å®šã‚’å…ƒã«æˆ»ã—ãŸã„å ´åˆã¯ã€ã€Œç·¨é›†ã€ï¼žã€Œç’°å¢ƒè¨­å®šã€ã‚’ã”覧ãã ã•ã„。
+ãã®åœ°åŸŸã«å…¥ã‚‹ã«ã¯ã€ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã®è¨­å®šã‚’変更ã—ã¦ãã ã•ã„。変更ã™ã‚‹ã¨ã€[REGIONMATURITY]ã®ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ¤œç´¢ã‚„アクセスãŒå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚å¤‰æ›´å†…å®¹ã‚’å…ƒã«æˆ»ã™ã«ã¯ã€ãƒŸãƒ¼ &gt; 環境設定 &gt; ä¸€èˆ¬ã‚’é¸æŠžã—ã¦ãã ã•ã„。
<form name="form">
<button name="OK" text="環境設定ã®å¤‰æ›´"/>
<button default="true" name="Cancel" text="é–‰ã˜ã‚‹"/>
- <ignore name="ignore" text="é¸æŠžã—ãŸãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒåŽŸå› ã§ã€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“"/>
+ <ignore name="ignore" text="é¸æŠžã—ãŸãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒåŽŸå› ã§ã€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥ã‚Œãªã„ã¨ã"/>
</form>
</notification>
+ <notification name="PreferredMaturityChanged">
+ ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†è¨­å®šã¯ç¾åœ¨ [RATING] ã§ã™ã€‚
+ </notification>
<notification name="LandClaimAccessBlocked">
ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 年齢を確èªã™ã‚‹éš›ã®æƒ…å ±ã«ä¸è¶³ãŒã‚ã£ãŸãŸã‚ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚
@@ -1575,7 +1655,7 @@ F1キーを押ã—ã¦ãã ã•ã„。
ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†è¨­å®šã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
「設定を変更ã€ã‚’クリックã—ã¦ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã‚’上ã’ã‚‹ã¨ã€å…¥ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ã‚ãªãŸã¯ä»Šå¾Œ [REGIONMATURITY] ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ¤œç´¢åŠã³ã‚¢ã‚¯ã‚»ã‚¹ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ ã‚ã¨ã§è¨­å®šã‚’å…ƒã«æˆ»ã—ãŸã„å ´åˆã¯ã€ã€Œç·¨é›†ã€ï¼žã€Œç’°å¢ƒè¨­å®šã€ã‚’ã”覧ãã ã•ã„。
- <usetemplate ignoretext="é¸æŠžã—ãŸãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒåŽŸå› ã§ã€åœŸåœ°ã‚’å–å¾—ã§ãã¾ã›ã‚“" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="設定ã®å¤‰æ›´"/>
+ <usetemplate ignoretext="é¸æŠžã—ãŸãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒåŽŸå› ã§ã€åœŸåœ°ã‚’å–å¾—ã§ããªã„ã¨ã" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="設定ã®å¤‰æ›´"/>
</notification>
<notification name="LandBuyAccessBlocked">
ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。 年齢を確èªã™ã‚‹éš›ã®æƒ…å ±ã«ä¸è¶³ãŒã‚ã£ãŸãŸã‚ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚
@@ -1599,58 +1679,57 @@ F1キーを押ã—ã¦ãã ã•ã„。
ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†è¨­å®šã«ã‚ˆã‚Šã€ã“ã®åœŸåœ°ã‚’購入ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
「設定を変更ã€ã‚’クリックã—ã¦ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã‚’上ã’ã‚‹ã¨ã€å…¥ã‚Œã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ã‚ãªãŸã¯ä»Šå¾Œ [REGIONMATURITY] ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ¤œç´¢åŠã³ã‚¢ã‚¯ã‚»ã‚¹ãŒå¯èƒ½ã¨ãªã‚Šã¾ã™ã€‚ ã‚ã¨ã§è¨­å®šã‚’å…ƒã«æˆ»ã—ãŸã„å ´åˆã¯ã€ã€Œç·¨é›†ã€ï¼žã€Œç’°å¢ƒè¨­å®šã€ã‚’ã”覧ãã ã•ã„。
- <usetemplate ignoretext="é¸æŠžã—ãŸãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒåŽŸå› ã§ã€åœŸåœ°ã‚’購入ã§ãã¾ã›ã‚“" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="設定ã®å¤‰æ›´"/>
+ <usetemplate ignoretext="é¸æŠžã—ãŸãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒåŽŸå› ã§ã€åœŸåœ°ã‚’購入ã§ããªã„ã¨ã" name="okcancelignore" notext="é–‰ã˜ã‚‹" yestext="設定ã®å¤‰æ›´"/>
</notification>
<notification name="TooManyPrimsSelected">
é¸æŠžã—ãŸãƒ—リムãŒå¤šã™ãŽã¾ã™ã€‚ [MAX_PRIM_COUNT] å€‹é¸æŠžã™ã‚‹ã‹ã€ãƒ—リム数を減らã—ã¦ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="ProblemImportingEstateCovenant">
- ä¸å‹•産約款ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆæ™‚ã«å•題発生。
+ ä¸å‹•産約款ã®ã‚¤ãƒ³ãƒãƒ¼ãƒˆæ™‚ã«å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="ProblemAddingEstateManager">
æ–°ã—ã„ä¸å‹•産マãƒãƒ¼ã‚¸ãƒ£ãƒ¼ã®è¿½åŠ ã«é–¢ã™ã‚‹å•題:
-1ã¤ä»¥ä¸Šã®ä¸å‹•産ã§ã€ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ãƒªã‚¹ãƒˆãŒæº€æ¯ã«ãªã£ã¦ã„ã¾ã™ã€‚
+ã„ãšã‚Œã‹ã®ä¸å‹•産ã®ãƒžãƒãƒ¼ã‚¸ãƒ£ãƒ¼ãƒªã‚¹ãƒˆãŒæº€æ¯ã«ãªã£ã¦ã„ã¾ã™ã€‚
</notification>
<notification name="ProblemAddingEstateGeneric">
ä¸å‹•産リストã®è¿½åŠ ã«é–¢ã™ã‚‹å•題:
-1ã¤ä»¥ä¸Šã®ä¸å‹•産ã§ã€ãƒªã‚¹ãƒˆãŒæº€æ¯ã«ãªã£ã¦ã„ã¾ã™ã€‚
+ã„ãšã‚Œã‹ã®ä¸å‹•産ã®ãƒªã‚¹ãƒˆãŒæº€æ¯ã«ãªã£ã¦ã„ã¾ã™ã€‚
</notification>
<notification name="UnableToLoadNotecardAsset">
- ç¾åœ¨ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®è³‡ç”£IDを読ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ ç¾åœ¨ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®ã‚¢ã‚»ãƒƒãƒˆ ID を読ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="NotAllowedToViewNotecard">
- è¦æ±‚ã•れãŸè³‡ç”£IDã«é–¢ã™ã‚‹ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’閲覧ã™ã‚‹ã«ã¯æ¨©é™ãŒä¸å分ã§ã™ã€‚
+ è¦æ±‚ã—ãŸã‚¢ã‚»ãƒƒãƒˆ ID ã«é–¢ã™ã‚‹ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’閲覧ã™ã‚‹ã«ã¯ã€æ¨©é™ãŒä¸å分ã§ã™ã€‚
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="MissingNotecardAssetID">
- ノートカード用資産IDãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ç™»éŒ²ã•れã¦ã„ã¾ã›ã‚“。
+ ノートカード用ã®ã‚¢ã‚»ãƒƒãƒˆ ID ãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ç™»éŒ²ã•れã¦ã„ã¾ã›ã‚“。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="PublishClassified">
注æ„ï¼šã‚¯ãƒ©ã‚·ãƒ•ã‚¡ã‚¤ãƒ‰åºƒå‘Šã®æ–™é‡‘ã¯æ‰•ã„æˆ»ã—ã•れã¾ã›ã‚“。
-L$[AMOUNT]ã§ã€ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ァイド広告を今ã™ã公開ã—ã¾ã™ã‹ï¼Ÿ
+L$ [AMOUNT] ã§ã€ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ァイド広告を今ã™ã公開ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="SetClassifiedMature">
- ã“ã®åºƒå‘Šã«ã€ŒæŽ§ãˆã‚ã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯å«ã¾ã‚Œã¦ã„ã¾ã™ã‹ï¼Ÿ
+ ã“ã®åºƒå‘Šã«ã€ŒModerateã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯å«ã¾ã‚Œã¦ã„ã¾ã™ã‹ï¼Ÿ
<usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="SetGroupMature">
- ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã€ŒæŽ§ãˆã‚ã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã‹ï¼Ÿ
+ ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã€ŒModerateã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ãŒå«ã¾ã‚Œã¦ã„ã¾ã™ã‹ï¼Ÿ
<usetemplate canceltext="キャンセル" name="yesnocancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification label="å†èµ·å‹•を確èª" name="ConfirmRestart">
- ã“ã®åœ°åŸŸã‚’2分後ã«å†èµ·å‹•ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
-æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ 2 分後ã«å†èµ·å‹•ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚
+ç¶šã‘ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
- <notification label="ã“ã®åœ°åŸŸå†…ã®å…¨å“¡ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡" name="MessageRegion">
- ã“ã®åœ°åŸŸã«ã„る人全員ã«é€ã‚‹
-短ã„メッセージを入力ã—ã¦ãã ã•ã„。
+ <notification label="ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡" name="MessageRegion">
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ã„る人全員ã«é€ã‚‹çŸ­ã„メッセージを入力ã—ã¦ãã ã•ã„。
<form name="form">
<input name="message"/>
<button name="OK" text="OK"/>
@@ -1658,16 +1737,16 @@ L$[AMOUNT]ã§ã€ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ァイド広告を今ã™ã公開ã—ã¾ã™ã‹ï
</form>
</notification>
<notification label="地域ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†æŒ‡å®šå¤‰æ›´æ¸ˆã¿" name="RegionMaturityChange">
- ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒã‚¢ãƒƒãƒ—デートã•れã¾ã—ãŸã€‚
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼ˆåœ°åŸŸï¼‰ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ãŒã‚¢ãƒƒãƒ—デートã•れã¾ã—ãŸã€‚
地図ã«å¤‰æ›´ãŒå映ã•れるã¾ã§æ•°åˆ†ã‹ã‹ã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚
-アダルト専用リージョンã«å…¥ã‚‹ã«ã¯ã€ä½äººã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒå¹´é½¢ç¢ºèªã‹æ”¯æ‰•方法ã®ã„ãšã‚Œã‹ã§ã€Œç¢ºèªæ¸ˆã¿ã€ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。
+Adult 専用リージョンã«å…¥ã‚‹ã«ã¯ã€ä½äººã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆãŒå¹´é½¢ç¢ºèªã‹æ”¯æ‰•方法ã®ã„ãšã‚Œã‹ã§ã€Œç¢ºèªæ¸ˆã¿ã€ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚“。
</notification>
<notification label="ボイスãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ä¸ä¸€è‡´" name="VoiceVersionMismatch">
[APP_NAME] ã®ã“ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯ã€ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ãŠã‘るボイスãƒãƒ£ãƒƒãƒˆã®äº’æ›æ€§ãŒã‚りã¾ã›ã‚“。 ボイスãƒãƒ£ãƒƒãƒˆã‚’正常ã«è¡Œã†ãŸã‚ã«ã¯ã€[APP_NAME] ã®ã‚¢ãƒƒãƒ—デートãŒå¿…è¦ã§ã™ã€‚
</notification>
<notification label="オブジェクトを購入ã§ãã¾ã›ã‚“" name="BuyObjectOneOwner">
- 複数ã®ã‚ªãƒ¼ãƒŠãƒ¼ã‹ã‚‰åŒæ™‚ã«ã‚ªãƒ–ジェクトを購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
+ è¤‡æ•°ã®æ‰€æœ‰è€…ã‹ã‚‰åŒæ™‚ã«ã‚ªãƒ–ジェクトを購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
å˜ä¸€ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
</notification>
<notification label="コンテンツを購入ã§ãã¾ã›ã‚“" name="BuyContentsOneOnly">
@@ -1675,62 +1754,64 @@ L$[AMOUNT]ã§ã€ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ァイド広告を今ã™ã公開ã—ã¾ã™ã‹ï
é¸æŠžã™ã‚‹ã‚ªãƒ–ジェクトを1ã¤ã ã‘ã«ã—ã¦ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
</notification>
<notification label="コンテンツを購入ã§ãã¾ã›ã‚“" name="BuyContentsOneOwner">
- 複数ã®ã‚ªãƒ¼ãƒŠãƒ¼ã‹ã‚‰åŒæ™‚ã«ã‚ªãƒ–ジェクトを購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
+ è¤‡æ•°ã®æ‰€æœ‰è€…ã‹ã‚‰åŒæ™‚ã«ã‚ªãƒ–ジェクトを購入ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
å˜ä¸€ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’é¸æŠžã—ã€ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
</notification>
<notification name="BuyOriginal">
- オリジナルã®ã‚ªãƒ–ジェクトを[OWNER]ã‹ã‚‰L$[PRICE]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ
-ã“れã«ã‚ˆã‚Šã€ã‚ãªãŸãŒã‚ªãƒ–ジェクトã®ã‚ªãƒ¼ãƒŠãƒ¼ã«ãªã‚Šã¾ã™ã€‚
+ オリジナルã®ã‚ªãƒ–ジェクトを [OWNER] ã‹ã‚‰ L$ [PRICE] ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ
+購入ã™ã‚‹ã¨ã€ã‚ãªãŸãŒã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…ã¨ãªã‚Šã¾ã™ã€‚
å¯èƒ½ãªæ“作ã¯ã€
-変更:[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]ã€
-å†è²©ï¼ãƒ—レゼント[RESELLPERM]ã§ã™ã€‚
+修正:[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]ã€
+å†è²©ãƒ»ãƒ—レゼント:[RESELLPERM] ã§ã™ã€‚
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="BuyOriginalNoOwner">
- L$[PRICE]ã§ã‚ªãƒªã‚¸ãƒŠãƒ«ã®ã‚ªãƒ–ジェクトを購入ã—ã¾ã™ã‹ï¼Ÿ
-ã“れã«ã‚ˆã‚Šã€ã‚ãªãŸãŒã‚ªãƒ–ジェクトã®ã‚ªãƒ¼ãƒŠãƒ¼ã«ãªã‚Šã¾ã™ã€‚
+ L$ [PRICE] ã§ã‚ªãƒªã‚¸ãƒŠãƒ«ã®ã‚ªãƒ–ジェクトを購入ã—ã¾ã™ã‹ï¼Ÿ
+購入ã™ã‚‹ã¨ã€ã‚ãªãŸãŒã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…ã¨ãªã‚Šã¾ã™ã€‚
å¯èƒ½ãªæ“作ã¯ã€
-変更:[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]ã€
-å†è²©ï¼ãƒ—レゼント[RESELLPERM]ã§ã™ã€‚
+修正:[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]ã€
+å†è²©ãƒ»ãƒ—レゼント:[RESELLPERM] ã§ã™ã€‚
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="BuyCopy">
- コピーを[OWNER]ã‹ã‚‰L$[PRICE]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ
-購入ã—ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚
-å¯èƒ½ãªæ“作ã¯ã€å¤‰æ›´ï¼š[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]ã€
-å†è²©ï¼ãƒ—レゼント[RESELLPERM]ã§ã™ã€‚
+ コピーを [OWNER] ã‹ã‚‰ L$ [PRICE] ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ
+購入ã—ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚
+å¯èƒ½ãªæ“作ã¯ã€
+修正:[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]ã€
+å†è²©ãƒ»ãƒ—レゼント:[RESELLPERM] ã§ã™ã€‚
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="BuyCopyNoOwner">
- L$[PRICE]ã§ã‚³ãƒ”ーを購入ã—ã¾ã™ã‹ï¼Ÿ
-購入ã—ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚
-å¯èƒ½ãªæ“作ã¯ã€å¤‰æ›´ï¼š[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]ã€
-å†è²©ï¼ãƒ—レゼント[RESELLPERM]ã§ã™ã€‚
+ L$ [PRICE] ã§ã‚³ãƒ”ーを購入ã—ã¾ã™ã‹ï¼Ÿ
+購入ã—ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚
+å¯èƒ½ãªæ“作ã¯ã€
+修正:[MODIFYPERM]ã€ã‚³ãƒ”ー:[COPYPERM]ã€
+å†è²©ãƒ»ãƒ—レゼント:[RESELLPERM] ã§ã™ã€‚
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="BuyContents">
- コンテンツを[OWNER]ã‹ã‚‰L$[PRICE]ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ
-購入ã—ãŸã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚
+ 中身を [OWNER] ã‹ã‚‰ L$ [PRICE] ã§è³¼å…¥ã—ã¾ã™ã‹ï¼Ÿ
+購入ã—ãŸä¸­èº«ã¯ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="BuyContentsNoOwner">
- L$[PRICE]ã§ã‚³ãƒ³ãƒ†ãƒ³ãƒ„を購入ã—ã¾ã™ã‹ï¼Ÿ
-購入ã—ãŸã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚
+ L$ [PRICE] ã§ä¸­èº«ã‚’購入ã—ã¾ã™ã‹ï¼Ÿ
+購入ã—ãŸä¸­èº«ã¯ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ã‚³ãƒ”ーã•れã¾ã™ã€‚
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="ConfirmPurchase">
ã“ã®å–引ã¯ä»¥ä¸‹ã®ã¨ãŠã‚Šè¡Œã‚れã¾ã™ï¼š
[ACTION]
-ã“ã®è³¼å…¥ã‚’続行ã—ã¾ã™ã‹ï¼Ÿ
+購入を続ã‘ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
</notification>
<notification name="ConfirmPurchasePassword">
ã“ã®å–引ã¯ä»¥ä¸‹ã®ã¨ãŠã‚Šè¡Œã‚れã¾ã™ï¼š
[ACTION]
-ã“ã®è³¼å…¥ã‚’続行ã—ã¾ã™ã‹ï¼Ÿ
-パスワードをå†å…¥åŠ›ã—ã€ã€ŒOKã€ã‚’クリックã—ã¦ãã ã•ã„。
+購入を続ã‘ã¾ã™ã‹ï¼Ÿ
+パスワードをå†å…¥åŠ›ã—ã€ã€Œ OK ã€ã‚’クリックã—ã¦ãã ã•ã„。
<form name="form">
<input name="message"/>
<button name="ConfirmPurchase" text="OK"/>
@@ -1739,31 +1820,31 @@ L$[AMOUNT]ã§ã€ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ァイド広告を今ã™ã公開ã—ã¾ã™ã‹ï
</notification>
<notification name="SetPickLocation">
メモ:
-本ピックã®ãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã‚’æ›´æ–°ã—ã¾ã—ãŸãŒã€
+本ピックã®ä½ç½®ã‚’æ›´æ–°ã—ã¾ã—ãŸãŒã€
ä»–ã®è©³ç´°ã¯å…ƒã®å€¤ã®ã¾ã¾ã«ãªã‚Šã¾ã™ã€‚
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="MoveInventoryFromObject">
- ã€Œã‚³ãƒ”ãƒ¼ç¦æ­¢ã€ã®æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ãŒé¸æŠžã•れã¾ã—ãŸã€‚
-ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚³ãƒ”ーã•れãªã„ã¾ã¾ã€ã‚ãªãŸã®æŒã¡ç‰©ã«ç§»å‹•ã•れã¾ã™ã€‚
+ 「コピーä¸å¯ã€ã®æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ã¾ã—ãŸã€‚
+ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚³ãƒ”ーã•れãªã„ã¾ã¾ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ç§»å‹•ã•れã¾ã™ã€‚
アイテムを動ã‹ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="「コピーä¸å¯ã€ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’オブジェクトã‹ã‚‰å‹•ã‹ã™å‰ã«è­¦å‘Šã™ã‚‹" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ <usetemplate ignoretext="「コピーä¸å¯ã€ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’オブジェクトã‹ã‚‰å‹•ã‹ã™å‰ã®è­¦å‘Š" name="okcancelignore" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="MoveInventoryFromScriptedObject">
- ã€Œã‚³ãƒ”ãƒ¼ç¦æ­¢ã€ã®æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ãŒé¸æŠžã•れã¾ã—ãŸã€‚
-ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚³ãƒ”ーã•れるã®ã§ã¯ãªãã€ã‚ãªãŸã®æŒã¡ç‰©ã«ç§»å‹•ã•れã¾ã™ã€‚
-ã“ã®ã‚ªãƒ–ジェクトã¯ã‚¹ã‚¯ãƒªãƒ—ト付ããªã®ã§ã€æŒã¡ç‰©ã«ç§»å‹•ã•ã›ã‚‹ã¨
+ 「コピーä¸å¯ã€ã®æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã—ã¾ã—ãŸã€‚
+ã“れらã®ã‚¢ã‚¤ãƒ†ãƒ ã¯ã‚³ãƒ”ーã•れãšã«ã€ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ç§»å‹•ã•れã¾ã™ã€‚
+ã“ã®ã‚ªãƒ–ジェクトã¯ã‚¹ã‚¯ãƒªãƒ—ト付ããªã®ã§ã€ã€ŒæŒã¡ç‰©ã€ã«ç§»å‹•ã•ã›ã‚‹ã¨
スクリプトã«èª¤å‹•作ãŒèµ·ãã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚
æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã‚’移動ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="スクリプト入りã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’å£Šã™æã‚Œã®ã‚る「コピーä¸å¯ã€ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’å‹•ã‹ã™å‰ã«è­¦å‘Šã™ã‚‹" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ <usetemplate ignoretext="スクリプト入りã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã‚’å£Šã™æã‚Œã®ã‚る「コピーä¸å¯ã€ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’å‹•ã‹ã™å‰ã®è­¦å‘Š" name="okcancelignore" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ClickActionNotPayable">
警告: クリックã§ã€Œã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ”¯æ‰•ã†ã€è¨­å®šã‚’ã—ã¾ã—ãŸã€‚スクリプト㫠money()イベントãŒè¿½åŠ ã•れるã¨å‹•作ã—ã¾ã™ã€‚
<form name="form">
- <ignore name="ignore" text="money() スクリプトを入れãšã«ã‚ªãƒ–ジェクトを制作中ã«ã€ã€Œã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ”¯æ‰•ã†ã€ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’設定"/>
+ <ignore name="ignore" text="オブジェクトを作æˆä¸­ã«ã€money() スクリプトを入れãšã«ã€Œã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã«æ”¯æ‰•ã†ã€ã‚¢ã‚¯ã‚·ãƒ§ãƒ³ã‚’設定ã—ãŸã¨ã"/>
</form>
</notification>
<notification name="OpenObjectCannotCopy">
@@ -1771,16 +1852,16 @@ L$[AMOUNT]ã§ã€ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ァイド広告を今ã™ã公開ã—ã¾ã™ã‹ï
</notification>
<notification name="WebLaunchAccountHistory">
[http://jp.secondlife.com/account/ マイアカウント] ページã«ç§»å‹•ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆå±¥æ­´ã‚’確èªã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆå±¥æ­´ã‚’見る" name="okcancelignore" notext="å–り消ã—" yestext="ページã«ç§»å‹•"/>
+ <usetemplate ignoretext="ブラウザを起動ã—ã¦ã‚¢ã‚«ã‚¦ãƒ³ãƒˆå±¥æ­´ã‚’見るã¨ã" name="okcancelignore" notext="å–り消ã—" yestext="ページã«ç§»å‹•"/>
</notification>
<notification name="ConfirmQuit">
- 終了ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚æ“作を続行ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="終了時ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="終了ã—ãªã„" yestext="終了"/>
+ 終了ã—よã†ã¨ã—ã¦ã„ã¾ã™ã€‚ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+ <usetemplate ignoretext="終了時ã®ç¢ºèª" name="okcancelignore" notext="終了ã—ãªã„" yestext="終了"/>
</notification>
<notification name="HelpReportAbuseEmailLL">
ã“ã®ãƒ„ールを利用ã—㦠[http://secondlife.com/corporate/tos.php 利用è¦ç´„] ã‚„ [http://jp.secondlife.com/corporate/cs.php コミュニティスタンダード] ã®é•åを報告ã—ã¦ãã ã•ã„。
-報告ã•れãŸå«ŒãŒã‚‰ã›ã¯ã™ã¹ã¦èª¿æŸ»ãƒ»è§£æ±ºã•れã¾ã™ã€‚ 解決ã•れãŸã‚‚ã®ã¯ [http://secondlife.com/support/incidentreport.php Incident Report] ã§è¦‹ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+報告ã•れãŸå«ŒãŒã‚‰ã›ã¯ã™ã¹ã¦èª¿æŸ»ãƒ»è§£æ±ºã•れã¾ã™ã€‚
</notification>
<notification name="HelpReportAbuseSelectCategory">
嫌ãŒã‚‰ã›å ±å‘Šã®ã‚«ãƒ†ã‚´ãƒªã‚’é¸æŠžã—ã¦ãã ã•ã„。
@@ -1815,44 +1896,42 @@ L$[AMOUNT]ã§ã€ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ァイド広告を今ã™ã公開ã—ã¾ã™ã‹ï
(2) DMCA ã¾ãŸã¯ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®æ’¤åŽ»ã®æ‰‹é † コンテンツを [SECOND_LIFE] ã‹ã‚‰å‰Šé™¤ã—ã¦æ¬²ã—ã„ã¨ã„ã†ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’ã™ã‚‹ã«ã¯ã€å¼Šç¤¾ [http://secondlife.com/corporate/dmca.php DMCA ãƒãƒªã‚·ãƒ¼] ã§æç¤ºã•れã¦ã„ã‚‹ã¨ãŠã‚Šã€æœ‰åйãªä¾µå®³ã®é€šçŸ¥ã‚’æå‡ºã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。.
-ã“ã®ã¾ã¾å«ŒãŒã‚‰ã›ã®å ±å‘Šã‚’ç¶šã‘ãŸã„å ´åˆã¯ã€ã“ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã¦å ±å‘Šã‚’é€ã£ã¦ãã ã•ã„。 「コピーBotåŠã³æ¨©é™ã®æ‚ªç”¨ã€ã®ã‚«ãƒ†ã‚´ãƒªã‚’é¸ã‚“ã æ–¹ãŒé©åˆ‡ã®å ´åˆãŒã‚りã¾ã™ã€‚
+ã“ã®ã¾ã¾å«ŒãŒã‚‰ã›ã®å ±å‘Šã‚’ç¶šã‘ãŸã„å ´åˆã¯ã€ã“ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’é–‰ã˜ã¦å ±å‘Šã‚’é€ã£ã¦ãã ã•ã„。 「コピー Bot åŠã³æ¨©é™ã®æ‚ªç”¨ã€ã®ã‚«ãƒ†ã‚´ãƒªã‚’é¸ã‚“ã æ–¹ãŒé©åˆ‡ã®å ´åˆãŒã‚りã¾ã™ã€‚
ã”å”力ã‚りãŒã¨ã†ã”ã–ã„ã¾ã™ã€‚
Linden Lab
</notification>
<notification name="FailedRequirementsCheck">
- 以下ã®å¿…è¦ãªã‚³ãƒ³ãƒãƒ¼ãƒãƒ³ãƒˆãŒã€[FLOATER]ã‹ã‚‰æŠœã‘è½ã¡ã¦ã„ã¾ã™
+ 以下ã®å¿…è¦ãªã‚³ãƒ³ãƒãƒ¼ãƒãƒ³ãƒˆãŒã€[FLOATER] ã‹ã‚‰æŠœã‘è½ã¡ã¦ã„ã¾ã™
[COMPONENTS]
</notification>
<notification label="既存ã®ä»˜å±žå“ã‚’ç½®æ›" name="ReplaceAttachment">
- 体ã®ã“ã®éƒ¨ä½ã«ã¯ã‚ªãƒ–ジェクトãŒè£…ç€ã•れã¦ã„ã¾ã™ã€‚
+ 体ã®ã“ã®éƒ¨ä½ã«ã¯æ—¢ã«ã‚ªãƒ–ジェクトãŒè£…ç€ã•れã¦ã„ã¾ã™ã€‚
é¸æŠžã•れãŸã‚ªãƒ–ジェクトã¨ç½®ãæ›ãˆã¾ã™ã‹ï¼Ÿ
<form name="form">
- <ignore name="ignore" save_option="true" text="装ç€ã—ã¦ã„るアイテムã¨é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’入れ替ãˆã‚‹"/>
+ <ignore name="ignore" save_option="true" text="装ç€ã—ã¦ã„るアイテムã¨é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’入れ替ãˆã‚‹ã¨ã"/>
<button ignore="自動的ã«äº¤æ›" name="Yes" text="OK"/>
<button ignore="交æ›ã—ãªã„" name="No" text="キャンセル"/>
</form>
</notification>
<notification label="å–り込ã¿ä¸­ã®è­¦å‘Š" name="BusyModePay">
- ç¾åœ¨ã€å–り込ã¿ä¸­ã®ãŸã‚ã€ã“ã®æ”¯æ‰•ã„ã¨
-å¼•ãæ›ãˆã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’å—ã‘å–ã‚‹ã“ã¨ãŒ
-ã§ãã¾ã›ã‚“。
+ ç¾åœ¨ã€ã€Œå–り込ã¿ä¸­ã€ãƒ¢ãƒ¼ãƒ‰ã®ãŸã‚ã€æ”¯æ‰•ã„ã¨å¼•ãæ›ãˆã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’å—ã‘å–ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
-ã“ã®å–引を完了ã™ã‚‹å‰ã«ã€å–り込ã¿ä¸­ã®è¨­å®šã‚’解除ã—ã¾ã™ã‹ï¼Ÿ
+ã“ã®å–引を行ã†ãŸã‚ã«ã€Œå–り込ã¿ä¸­ã€ã®è¨­å®šã‚’解除ã—ã¾ã™ã‹ï¼Ÿ
<form name="form">
- <ignore name="ignore" save_option="true" text="å–り込ã¿ä¸­ãƒ¢ãƒ¼ãƒ‰ã®æ™‚ã«æ”¯æ‰•ã‚’ã™ã‚‹"/>
- <button ignore="常ã«å–り込ã¿ä¸­ã®è¨­å®š" name="Yes" text="OK"/>
- <button ignore="å–り込ã¿ä¸­ã®è¨­å®šã«ã—ãªã„" name="No" text="キャンセル"/>
+ <ignore name="ignore" save_option="true" text="å–り込ã¿ä¸­ãƒ¢ãƒ¼ãƒ‰æ™‚ã«æ”¯æ‰•ã‚’ã™ã‚‹ã¨ã"/>
+ <button ignore="常ã«ã€Œå–り込ã¿ä¸­ã€ã®è¨­å®šã‚’解除" name="Yes" text="OK"/>
+ <button ignore="常ã«ã€Œå–り込ã¿ä¸­ã€ã®è¨­å®šã‚’継続" name="No" text="キャンセル"/>
</form>
</notification>
<notification name="ConfirmDeleteProtectedCategory">
「 [FOLDERNAME] 〠ã¯ã€ã‚·ã‚¹ãƒ†ãƒ ãƒ•ォルダã§ã™ã€‚ システムフォルダを削除ã™ã‚‹ã¨ä¸å®‰å®šã«ãªã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚ ç¶šã‘ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="システムフォルダを削除ã™ã‚‹å‰ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ <usetemplate ignoretext="システムフォルダを削除ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ConfirmEmptyTrash">
- ã”ã¿ç®±ã®é …目をã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="æŒã¡ç‰©ã®ã”ã¿ç®±ãƒ•ォルダを空ã«ã™ã‚‹å‰ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ ã”ã¿ç®±ã®ä¸­èº«ã‚’ã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate ignoretext="æŒã¡ç‰©ã®ã”ã¿ç®±ãƒ•ォルダを空ã«ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="ConfirmClearBrowserCache">
トラベルã€Webã€æ¤œç´¢ã®å±¥æ­´ã‚’ã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
@@ -1867,16 +1946,16 @@ Linden Lab
<usetemplate name="okcancelbuttons" notext="キャンセル" yestext="ã¯ã„"/>
</notification>
<notification name="ConfirmEmptyLostAndFound">
- 紛失物ã®é …目をã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="紛失物フォルダを空ã«ã™ã‚‹å‰ã«ç¢ºèªã™ã‚‹" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
+ 紛失物ã®ä¸­èº«ã‚’ã™ã¹ã¦å‰Šé™¤ã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate ignoretext="紛失物フォルダを空ã«ã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="CopySLURL">
次㮠SLurl ãŒã‚¯ãƒªãƒƒãƒ—ボードã«ã‚³ãƒ”ーã•れã¾ã—ãŸï¼š
[SLURL]
-Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™ã€‚Webブラウザã®ã‚¢ãƒ‰ãƒ¬ã‚¹ãƒãƒ¼ã«è²¼ã‚Šä»˜ã‘ã¦è©¦ã—ã¦ã¿ã¦ãã ã•ã„。
+Web ページã«ãƒªãƒ³ã‚¯ã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚¢ã‚¯ã‚»ã‚¹ã§ãã¾ã™ã€‚Web ブラウザã®ã‚¢ãƒ‰ãƒ¬ã‚¹ãƒãƒ¼ã«è²¼ã‚Šä»˜ã‘ã¦è©¦ã—ã¦ã¿ã¦ãã ã•ã„。
<form name="form">
- <ignore name="ignore" text="クリップボード㫠SLurl ãŒã‚³ãƒ”ーã•れる"/>
+ <ignore name="ignore" text="クリップボード㫠SLurl をコピーã™ã‚‹ã¨ã"/>
</form>
</notification>
<notification name="WLSavePresetAlert">
@@ -1884,14 +1963,14 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚
<usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="WLDeletePresetAlert">
- [SKY] を削除ã—ã¾ã™ã‹ï¼Ÿ
+ 「 [SKY] ã€ã‚’削除ã—ã¾ã™ã‹ï¼Ÿ
<usetemplate name="okcancelbuttons" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="WLNoEditDefault">
デフォルトã®è¨­å®šã‚’編集ã—ãŸã‚Šå‰Šé™¤ã—ãŸã‚Šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
</notification>
<notification name="WLMissingSky">
- ã“ã®ãƒ‡ã‚¤ãƒ»ã‚µã‚¤ã‚¯ãƒ«ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æ¬¡ã®å­˜åœ¨ã—ãªã„「空ã€ãƒ•ァイルをå‚ç…§ã—ã¦ã„ã¾ã™ï¼š [SKY]。
+ ã“ã®ãƒ‡ã‚¤ã‚µã‚¤ã‚¯ãƒ«ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¯æ¬¡ã®å­˜åœ¨ã—ãªã„「空ã€ãƒ•ァイルをå‚ç…§ã—ã¦ã„ã¾ã™ï¼š [SKY]。
</notification>
<notification name="PPSaveEffectAlert">
ãƒã‚¹ãƒˆãƒ—ロセス効果ãŒå­˜åœ¨ã—ã¾ã™ã€‚ 上書ãã—ã¾ã™ã‹ï¼Ÿ
@@ -1927,7 +2006,7 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚
デフォルトã®è¨­å®šã‚’編集ã—ãŸã‚Šå‰Šé™¤ã—ãŸã‚Šã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
</notification>
<notification name="ChatterBoxSessionStartError">
- [RECIPIENT]ã¨ã®æ–°ã—ã„ãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“
+ [RECIPIENT] ã¨æ–°ã—ã„ãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
[REASON]
<usetemplate name="okbutton" yestext="OK"/>
</notification>
@@ -1937,21 +2016,21 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="ForceCloseChatterBoxSession">
- [NAME]ã¨ã®ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’é–‰ã˜ã¾ã™ã€‚
+ [NAME] ã¨ã®ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’é–‰ã˜ã¾ã™ã€‚
[REASON]
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="Cannot_Purchase_an_Attachment">
- オブジェクトãŒå–り付ã‘られã¦ã„ã‚‹ã¨ãã¯è³¼å…¥ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ オブジェクトãŒå–り付ã‘られã¦ã„ã‚‹ã¾ã¾ã§ã¯è³¼å…¥ã§ãã¾ã›ã‚“。
</notification>
- <notification label="デビット許å¯ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«ã¤ã„ã¦" name="DebitPermissionDetails">
- ã“ã®è¦æ±‚を許å¯ã™ã‚‹ã¨ã€ã‚¹ã‚¯ãƒªãƒ—トã‹ã‚‰ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã«ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«ã‚’課金ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚
-ã“ã®è¨±å¯ã‚’å–り消ã™ã«ã¯ã€ã‚ªãƒ–ジェクトã®ã‚ªãƒ¼ãƒŠãƒ¼ã¯ã‚ªãƒ–ジェクトを削除ã™ã‚‹ã‹ã€ã‚ªãƒ–ジェクトã®ã‚¹ã‚¯ãƒªãƒ—トをリセットã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。
+ <notification label="引ã出ã—許å¯ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã«ã¤ã„ã¦" name="DebitPermissionDetails">
+ ã“ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’許å¯ã™ã‚‹ã¨ã€ã‚¹ã‚¯ãƒªãƒ—トã§ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã‹ã‚‰ãƒªãƒ³ãƒ‡ãƒ³ãƒ‰ãƒ«ã‚’引ã出ã›ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚
+ã“ã®è¨±å¯ã‚’å–り消ã™ã«ã¯ã€ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…ãŒã‚ªãƒ–ジェクトを削除ã™ã‚‹ã‹ã€ã‚ªãƒ–ジェクトã®ã‚¹ã‚¯ãƒªãƒ—トをリセットã—ãªã‘れã°ãªã‚Šã¾ã›ã‚“。
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AutoWearNewClothing">
- 作æˆã—よã†ã¨ã—ã¦ã„る衣類を自動的ã«è£…ç€ã—ã¾ã™ã‹ï¼Ÿ
- <usetemplate ignoretext="「マイ 容姿ã€ã‚’編集中ã«ã€ä½œæˆã™ã‚‹è¡£é¡žã‚’装ç€ã™ã‚‹" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
+ 作æˆã™ã‚‹è¡£é¡žã‚’自動的ã«è£…ç€ã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate ignoretext="「容姿ã€ã‚’編集中ã«ã€ä½œæˆã™ã‚‹è¡£é¡žã‚’装ç€ã™ã‚‹ã¨ã" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="NotAgeVerified">
年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„ã¨ã“ã®åŒºç”»ã‚’訪れるã“ã¨ãŒã§ãã¾ã›ã‚“。 [SECOND_LIFE] サイトã§å¹´é½¢ã®ç¢ºèªã‚’行ã„ã¾ã™ã‹ï¼Ÿ
@@ -1960,7 +2039,7 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚
<url name="url" option="0">
https://secondlife.com/account/verification.php?lang=ja
</url>
- <usetemplate ignoretext="å¹´é½¢ã®ç¢ºèªã‚’済ã¾ã›ã¦ã„ã¾ã›ã‚“" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
+ <usetemplate ignoretext="å¹´é½¢ã®ç¢ºèªã‚’済ã¾ã›ã¦ã„ãªã„ã¨ã" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="Cannot enter parcel: no payment info on file">
支払情報ãŒç™»éŒ²ã•れã¦ã„ãªã„ã¨ã“ã®ã‚¨ãƒªã‚¢ã‚’訪れるã“ã¨ãŒã§ãã¾ã›ã‚“。 [SECOND_LIFE] サイトã§ç™»éŒ²ã‚’行ã„ã¾ã™ã‹ï¼Ÿ
@@ -1969,53 +2048,61 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚
<url name="url" option="0">
https://secondlife.com/account/index.php?lang=ja
</url>
- <usetemplate ignoretext="支払情報ãŒç™»éŒ²ã•れã¦ã„ã¾ã›ã‚“" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
+ <usetemplate ignoretext="支払情報ãŒç™»éŒ²ã•れã¦ã„ãªã„ã¨ã" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
</notification>
<notification name="MissingString">
- 文字列[STRING_NAME]ãŒstrings.xmlã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“
+ 文字列 [STRING_NAME] ㌠strings.xml ã«å«ã¾ã‚Œã¦ã„ã¾ã›ã‚“。
</notification>
<notification name="SystemMessageTip">
[MESSAGE]
</notification>
+ <notification name="IMSystemMessageTip">
+ [MESSAGE]
+ </notification>
<notification name="Cancelled">
- å–り消ã•れã¾ã—ãŸ
+ å–り消ã•れã¾ã—ãŸã€‚
</notification>
<notification name="CancelledSit">
- 座るã®ã‚’å–り消ã•れã¾ã—ãŸ
+ 座るã®ã‚’ã‚„ã‚ã¾ã—ãŸã€‚
</notification>
<notification name="CancelledAttach">
- 添付ã¯å–り消ã•れã¾ã—ãŸ
+ 添付ãŒå–り消ã•れã¾ã—ãŸã€‚
</notification>
<notification name="ReplacedMissingWearable">
- 欠è½ã—ã¦ã„ã‚‹æœï¼èº«ä½“部ä½ã‚’デフォルトã«ç½®æ›ã—ã¾ã™ã€‚
+ 欠è½ã—ã¦ã„る衣類や身体部ä½ã‚’デフォルトã«ç½®ãæ›ãˆã¾ã™ã€‚
</notification>
<notification name="GroupNotice">
- ä»¶å: [SUBJECT], メッセージ: [MESSAGE]
+ ä»¶å: [SUBJECT]ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ï¼š [MESSAGE]
</notification>
<notification name="FriendOnline">
- [FIRST] [LAST] ã¯ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã§ã™ã€‚
+ [FIRST] [LAST] ã¯ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã§ã™
</notification>
<notification name="FriendOffline">
- [FIRST] [LAST] ã¯ã‚ªãƒ•ラインã§ã™ã€‚
+ [FIRST] [LAST] ã¯ã‚ªãƒ•ラインã§ã™
</notification>
<notification name="AddSelfFriend">
残念ãªãŒã‚‰è‡ªåˆ†è‡ªèº«ã‚’フレンド登録ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
</notification>
<notification name="UploadingAuctionSnapshot">
- インワールドã¨ã‚¦ã‚§ãƒ–・サイトã®ã‚¹ãƒŠãƒƒãƒ—ショットをアップロード中ã§ã™...
-ï¼ˆæ‰€è¦æ™‚間:約5分)
+ インワールド㨠Web サイトã®ã‚¹ãƒŠãƒƒãƒ—ショットをアップロード中ã§ã™...
+ï¼ˆæ‰€è¦æ™‚間:約 5 分)
+ </notification>
+ <notification name="UploadConfirmation">
+ アップロード料金㯠L$[AMOUNT] ã§ã™ã€‚
+ç¶šã‘ã¾ã™ã‹ï¼Ÿ
+ <usetemplate name="okcancelbuttons" notext="キャンセル" yestext="アップロード"/>
</notification>
<notification name="UploadPayment">
- アップロード㫠L$[AMOUNT] 支払ã„ã¾ã—ãŸã€‚
+ アップロード㫠L$ [AMOUNT] 支払ã„ã¾ã—ãŸã€‚
</notification>
<notification name="UploadWebSnapshotDone">
- Webサイトã®ã‚¹ãƒŠãƒƒãƒ—ショットãŒã‚¢ãƒƒãƒ—ロードã•れã¾ã—ãŸã€‚
+ Web サイトã®ã‚¹ãƒŠãƒƒãƒ—ショットãŒã‚¢ãƒƒãƒ—ロードã•れã¾ã—ãŸã€‚
</notification>
<notification name="UploadSnapshotDone">
インワールドã§ã®ã‚¹ãƒŠãƒƒãƒ—ショットã®ã‚¢ãƒƒãƒ—ロードãŒå®Œäº†ã—ã¾ã—ãŸã€‚
</notification>
<notification name="TerrainDownloaded">
- raw地形ãŒãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã•れã¾ã—ãŸ
+ raw 地形ãŒãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ã•れã¾ã—ãŸ
</notification>
<notification name="GestureMissing">
ジェスãƒãƒ£ãƒ¼ã® [NAME] ãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«è¦‹ã¤ã‹ã‚Šã¾ã›ã‚“。
@@ -2027,11 +2114,11 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚
データベースã«ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ãŒã‚りã¾ã›ã‚“。
</notification>
<notification name="UnableToLoadLandmark">
- ランドマークをロードã§ãã¾ã›ã‚“。 ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
+ ランドマークを読ã¿è¾¼ã‚ã¾ã›ã‚“。 ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="CapsKeyOn">
CapsLock ã‚­ãƒ¼ãŒæœ‰åйã«ãªã£ã¦ã„ã¾ã™ã€‚
-パスワードã«å½±éŸ¿ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。
+パスワードã«å½±éŸ¿ã™ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。
</notification>
<notification name="NotecardMissing">
ノートカードãŒãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«ã‚りã¾ã›ã‚“。
@@ -2040,10 +2127,10 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚
ã“ã®ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’見る権é™ãŒã‚りã¾ã›ã‚“。
</notification>
<notification name="RezItemNoPermissions">
- オブジェクトをrezã™ã‚‹ã«ã¯ãƒ‘ーミッション(承èªï¼‰ãŒä¸è¶³ã—ã¦ã¾ã™ã€‚
+ オブジェクトを Rez ã™ã‚‹ã«ã¯æ¨©é™ãŒä¸è¶³ã—ã¦ã„ã¾ã™ã€‚
</notification>
<notification name="UnableToLoadNotecard">
- ç¾åœ¨ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã®è³‡ç”£ã‚’ロードã§ãã¾ã›ã‚“。
+ ノートカードを読ã¿è¾¼ã‚ã¾ã›ã‚“。ã‚ã¨ã§å†åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="ScriptMissing">
データベースã«ã‚¹ã‚¯ãƒªãƒ—トãŒã‚りã¾ã›ã‚“。
@@ -2055,36 +2142,35 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚
スクリプトをロードã§ãã¾ã›ã‚“。 ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
</notification>
<notification name="IncompleteInventory">
- ã‚ãªãŸã®æä¾›ã™ã‚‹ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã€ã“ã®å ´æ‰€ã§ã¯ã¾ã å…¨éƒ¨æƒã„ã¾ã›ã‚“。
-å°‘ã—ã—ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
+ ã‚ãªãŸã®æä¾›ã™ã‚‹ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã¯ã€ãƒ­ãƒ¼ã‚«ãƒ«ã§ã¯ã¾ã å…¨éƒ¨æƒã£ã¦ã„ã¾ã›ã‚“。
+ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="CannotModifyProtectedCategories">
- ä¿è­·ã•れãŸã‚«ãƒ†ã‚´ãƒªãƒ¼ã¯ä¿®æ­£ã§ãã¾ã›ã‚“。
+ ä¿è­·ã•れãŸã‚«ãƒ†ã‚´ãƒªã¯ä¿®æ­£ã§ãã¾ã›ã‚“。
</notification>
<notification name="CannotRemoveProtectedCategories">
- ä¿è­·ã•れãŸã‚«ãƒ†ã‚´ãƒªãƒ¼ã¯å‰Šé™¤ã§ãã¾ã›ã‚“。
+ ä¿è­·ã•れãŸã‚«ãƒ†ã‚´ãƒªã¯å‰Šé™¤ã§ãã¾ã›ã‚“。
</notification>
<notification name="OfferedCard">
- ã‚ãªãŸã¯[FIRST] [LAST] ã«
-コーリング・カードをé€ã‚Šã¾ã—ãŸã€‚
+ [FIRST] [LAST] ã«ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’é€ã‚Šã¾ã—ãŸã€‚
</notification>
<notification name="UnableToBuyWhileDownloading">
オブジェクトデータã®ãƒ€ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ä¸­ã¯è³¼å…¥ã§ãã¾ã›ã‚“。
-ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
+ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="UnableToLinkWhileDownloading">
オブジェクトデータã®ã‚¦ãƒ³ãƒ­ãƒ¼ãƒ‰ä¸­ã¯ãƒªãƒ³ã‚¯ã§ãã¾ã›ã‚“。
-ã‚‚ã†ä¸€åº¦è©¦ã—ã¦ãã ã•ã„。
+ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="CannotBuyObjectsFromDifferentOwners">
- オブジェクトã¯ä¸€åº¦ã«ã¤ãä¸€äººã®æ‰€æœ‰è€…ã‹ã‚‰è³¼å…¥ã§ãã¾ã™ã€‚
+ オブジェクトã¯ä¸€åº¦ã«ä¸€äººã®æ‰€æœ‰è€…ã‹ã‚‰è³¼å…¥ã§ãã¾ã™ã€‚
オブジェクトを 1 ã¤ã ã‘é¸ã‚“ã§ãã ã•ã„。
</notification>
<notification name="ObjectNotForSale">
ã“ã®ã‚ªãƒ–ジェクトã¯è²©å£²å¯¾è±¡ã§ã¯ã‚りã¾ã›ã‚“。
</notification>
<notification name="EnteringGodMode">
- レベル[LEVEL]ã®ã‚´ãƒƒãƒ‰ãƒ»ãƒ¢ãƒ¼ãƒ‰ã«å…¥ã‚Šã¾ã™
+ レベル [LEVEL] ã®ã‚´ãƒƒãƒ‰ãƒ¢ãƒ¼ãƒ‰ã«å…¥ã‚Šã¾ã™
</notification>
<notification name="LeavingGodMode">
レベル [LEVEL] ã®ã‚´ãƒƒãƒ‰ãƒ¢ãƒ¼ãƒ‰ã‚’解除ã—ã¾ã™
@@ -2093,19 +2179,19 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚
ã“れをコピーã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。
</notification>
<notification name="InventoryAccepted">
- [NAME] ãŒã‚ãªãŸãŒæ¸¡ã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’å—ã‘å–りã¾ã—ãŸã€‚
+ [NAME] ã¯ã€ã‚ãªãŸãŒæ¸¡ã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’å—ã‘å–りã¾ã—ãŸã€‚
</notification>
<notification name="InventoryDeclined">
- [NAME]ã¯ã€æŒã¡ç‰©ã®æä¾›ã‚’断りã¾ã—ãŸã€‚
+ [NAME] ã¯ã€æŒã¡ç‰©ã®æä¾›ã‚’断りã¾ã—ãŸã€‚
</notification>
<notification name="ObjectMessage">
[NAME]: [MESSAGE]
</notification>
<notification name="CallingCardAccepted">
- コーリング・カードãŒå—ç†ã•れã¾ã—ãŸã€‚
+ コーリングカードãŒå—ç†ã•れã¾ã—ãŸã€‚
</notification>
<notification name="CallingCardDeclined">
- ã‚³ãƒ¼ãƒªãƒ³ã‚°ãƒ»ã‚«ãƒ¼ãƒ‰ãŒæ‹’å¦ã•れã¾ã—ãŸã€‚
+ ã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ãŒæ‹’å¦ã•れã¾ã—ãŸã€‚
</notification>
<notification name="TeleportToLandmark">
ç”»é¢å³ã®ã€Œå ´æ‰€ã€ãƒ‘ãƒãƒ«ã‚’é–‹ã„ã¦ã€ã€Œãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã€ã‚¿ãƒ–ã‚’é¸ã¶ã¨ã€[NAME] ã¨ã„ã£ãŸå ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§ãã¾ã™ã€‚
@@ -2125,7 +2211,7 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚
ã‚³ãƒŸãƒ¥ãƒ‹ãƒ†ã‚£ã‚¹ã‚¿ãƒ³ãƒ€ãƒ¼ãƒ‰ã«æ˜Žè¨˜ã•れã¦ã„るコンテンツ制é™ã«ã‚ˆã‚Šã€ã‚ãªãŸã®æ¤œç´¢èªžã®ä¸€éƒ¨ãŒé™¤å¤–ã•れã¾ã—ãŸã€‚
</notification>
<notification name="NoContentToSearch">
- å°‘ãªãã¨ã‚‚ã©ã‚Œã‹ä¸€ã¤ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ç¨®é¡žã‚’é¸æŠžã—ã¦æ¤œç´¢ã‚’行ã£ã¦ãã ã•ã„ã€‚ï¼ˆä¸€èˆ¬ã€æŽ§ãˆã‚ã€ã‚¢ãƒ€ãƒ«ãƒˆï¼‰
+ å°‘ãªãã¨ã‚‚ã©ã‚Œã‹ä¸€ã¤ã‚³ãƒ³ãƒ†ãƒ³ãƒ„ã®ç¨®é¡žã‚’é¸æŠžã—ã¦æ¤œç´¢ã‚’行ã£ã¦ãã ã•ã„。(Generalã€Moderateã€Adult)
</notification>
<notification name="GroupVote">
[NAME] ã¯æŠ•ç¥¨ã®ç”³è«‹ã‚’ã—ã¦ã„ã¾ã™ï¼š
@@ -2153,10 +2239,10 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚
</form>
</notification>
<notification name="TransferObjectsHighlighted">
- ã“ã®åŒºç”»ä¸Šã«å­˜åœ¨ã™ã‚‹ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã“ã®åŒºç”»ã®è³¼å…¥è€…ã«è­²æ¸¡ã•れるオブジェクトãŒã™ã¹ã¦å¼·èª¿è¡¨ç¤ºã•れã¾ã™ã€‚
+ ã“ã®åŒºç”»ã®è³¼å…¥è€…ã«å—ã‘æ¸¡ã•れるオブジェクトã¯ã€ã™ã¹ã¦åŒºç”»ä¸Šã§å¼·èª¿è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚
-*譲渡ã•れる樹木やæ¤ç‰©ã¯ã€å¼·èª¿è¡¨ç¤ºã•れã¾ã›ã‚“。
+*å—ã‘æ¸¡ã•れる樹木やæ¤ç‰©ã¯ã€å¼·èª¿è¡¨ç¤ºã•れã¦ã„ã¾ã›ã‚“。
<form name="form">
<button name="Done" text="完了"/>
</form>
@@ -2178,42 +2264,42 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚
プラグインをインストールã—ãªãŠã™ã‹ã€å•題ãŒè§£æ±ºã—ãªã„å ´åˆã¯ãƒ¡ãƒ¼ã‚«ãƒ¼ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。
<form name="form">
- <ignore name="ignore" text="メディアプラグインã®å®Ÿè¡Œã«å¤±æ•—"/>
+ <ignore name="ignore" text="メディアプラグインã®å®Ÿè¡Œã«å¤±æ•—ã—ãŸã¨ã"/>
</form>
</notification>
<notification name="OwnedObjectsReturned">
- é¸æŠžã—ãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚ã£ãŸã‚ãªãŸã®ã‚ªãƒ–ジェクトã¯ã€ã‚ãªãŸã®æŒã¡ç‰©ã«è¿”å´ã•れã¾ã—ãŸã€‚
+ é¸æŠžã—ãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚ã£ãŸã‚ãªãŸã®ã‚ªãƒ–ジェクトã¯ã€ã™ã¹ã¦ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«è¿”å´ã•れã¾ã—ãŸã€‚
</notification>
<notification name="OtherObjectsReturned">
- é¸æŠžã•れã¦ã„る土地ã®åŒºç”»ä¸Šã«ã‚ã£ãŸ
+ é¸æŠžã—ãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚ã£ãŸ
[FIRST] [LAST]
- ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクトã¯ã€ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«è¿”å´ã•れã¾ã—ãŸã€‚
+ ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクトã¯ã€ã™ã¹ã¦æ‰€æœ‰è€…ã®ã€ŒæŒã¡ç‰©ã€ã«è¿”å´ã•れã¾ã—ãŸã€‚
</notification>
<notification name="OtherObjectsReturned2">
- 「[NAME]ã€ã¨ã„ã†åå‰ã®ä½äººãŒæ‰€æœ‰ã™ã‚‹ã€é¸æŠžã—ãŸåŒºç”»ã«ã‚るオブジェクトã¯ã€æ‰€æœ‰è€…ã«è¿”å´ã•れã¾ã—ãŸã€‚
+ 「 [NAME] ã€ã¨ã„ã†åå‰ã®ä½äººãŒæ‰€æœ‰ã™ã‚‹ã€é¸æŠžã—ãŸåŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã¯ã€æœ¬äººã«è¿”å´ã•れã¾ã—ãŸã€‚
</notification>
<notification name="GroupObjectsReturned">
- é¸æŠžã•れã¦ã„る区画上ã«ã‚りã€[GROUPNAME] ã¨ã„ã†ã‚°ãƒ«ãƒ¼ãƒ—ã¨å…±æœ‰ã ã£ãŸã‚ªãƒ–ジェクトã¯ã€ã‚ªãƒ¼ãƒŠãƒ¼ã®æŒã¡ç‰©ã«è¿”å´ã•れã¾ã—ãŸã€‚
-譲渡ã•れã¦ã„ãŸè­²æ¸¡å¯èƒ½ãªã‚ªãƒ–ジェクトã¯ã€å‰ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•れã¾ã—ãŸã€‚
-グループã«è­²æ¸¡ã•れã¦ã„ãŸè­²æ¸¡ä¸å¯èƒ½ãªã‚ªãƒ–ジェクトã¯ã€å‰Šé™¤ã•れã¾ã—ãŸã€‚
+ é¸æŠžã—ãŸåŒºç”»ä¸Šã®ã€[GROUPNAME] ã¨ã„ã†ã‚°ãƒ«ãƒ¼ãƒ—ã¨å…±æœ‰ã—ã¦ã„ãŸã‚ªãƒ–ジェクトã¯ã€ãれãžã‚Œã®æ‰€æœ‰è€…ã®ã€ŒæŒã¡ç‰©ã€ã«è¿”å´ã•れã¾ã—ãŸã€‚
+譲渡ã•れã¦ã„ãŸã€Œå†è²©ãƒ»ãƒ—レゼントå¯ã€ã®ã‚ªãƒ–ジェクトã¯ã€ä»¥å‰ã®æ‰€æœ‰è€…ã«è¿”å´ã•れã¾ã—ãŸã€‚
+グループã«è­²æ¸¡ã•れã¦ã„ãŸã€Œå†è²©ãƒ»ãƒ—レゼントä¸å¯ã€ã®ã‚ªãƒ–ジェクトã¯ã€å‰Šé™¤ã•れã¾ã—ãŸã€‚
</notification>
<notification name="UnOwnedObjectsReturned">
- é¸æŠžã•れãŸåœŸåœ°ã®åŒºç”»ä¸Šã«ã‚りã€ã‚ãªãŸã®æ‰€æœ‰ã§ã€Œãªã‹ã£ãŸã€ã‚ªãƒ–ジェクトã¯ã€æœ¬æ¥ã®ã‚ªãƒ¼ãƒŠãƒ¼ã«è¿”å´ã•れã¾ã—ãŸã€‚
+ é¸æŠžã—ãŸåœŸåœ°ã®åŒºç”»ä¸Šã®ã€ã‚ãªãŸã®æ‰€æœ‰ç‰©ã§ã¯ã€Œãªã‹ã£ãŸã€ã‚ªãƒ–ジェクトã¯ã€æœ¬æ¥ã®æ‰€æœ‰è€…ã«è¿”å´ã•れã¾ã—ãŸã€‚
</notification>
<notification name="ServerObjectMessage">
[NAME] ã‹ã‚‰ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ï¼š
-[MSG]
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
</notification>
<notification name="NotSafe">
ã“ã®åœŸåœ°ã§ã¯ãƒ€ãƒ¡ãƒ¼ã‚¸ãŒæœ‰åйã§ã™ã€‚
-ケガをã™ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 死んã§ã—ã¾ã£ãŸå ´åˆã¯ãƒ›ãƒ¼ãƒ ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•れã¾ã™ã€‚
+ケガをã™ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 死んã§ã—ã¾ã£ãŸå ´åˆã¯ã€Œãƒ›ãƒ¼ãƒ ã€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•れã¾ã™ã€‚
</notification>
<notification name="NoFly">
ã“ã®ã‚¨ãƒªã‚¢ã§ã¯é£›è¡ŒãŒç¦æ­¢ã•れã¦ã„ã¾ã™ã€‚
ã“ã“ã§ã¯é£›ã¹ã¾ã›ã‚“。
</notification>
<notification name="PushRestricted">
- ã“ã®ã‚¨ãƒªã‚¢ã§ã¯ãƒ—ッシュãŒåˆ¶é™ã•れã¦ã„ã¾ã™ã€‚ 土地所有者以外ã¯ä»–人をプッシュã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
+ ã“ã®ã‚¨ãƒªã‚¢ã§ã¯ãƒ—ッシュãŒç¦æ­¢ã•れã¦ã„ã¾ã™ã€‚ 土地所有者以外ã¯ä»–人をプッシュã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
</notification>
<notification name="NoVoice">
ã“ã®ã‚¨ãƒªã‚¢ã§ã¯ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆãŒç„¡åйã§ã™ã€‚ 誰ã‹ãŒè©±ã—ã¦ã„ã‚‹ã®ã‚’èžãã“ã¨ã¯ã§ãã¾ã›ã‚“。
@@ -2222,41 +2308,41 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚
ã“ã®ã‚¨ãƒªã‚¢ã§ã¯åˆ¶ä½œãŒç¦æ­¢ã•れã¦ã„ã¾ã™ã€‚ オブジェクトを制作ã—ãŸã‚Š Rez ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
</notification>
<notification name="ScriptsStopped">
- 管ç†è€…ãŒã“ã®åœ°åŸŸå†…ã®ã‚¹ã‚¯ãƒªãƒ—ãƒˆã‚’ä¸€æ™‚åœæ­¢ã•ã›ã¾ã—ãŸã€‚
+ 管ç†è€…ãŒã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚¹ã‚¯ãƒªãƒ—ãƒˆã‚’ä¸€æ™‚åœæ­¢ã—ã¾ã—ãŸã€‚
</notification>
<notification name="ScriptsNotRunning">
- ã“ã®åœ°åŸŸã§ã¯ã‚¹ã‚¯ãƒªãƒ—トã®ä½¿ç”¨ãŒç¦æ­¢ã•れã¦ã„ã¾ã™
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã‚¹ã‚¯ãƒªãƒ—トã®ä½¿ç”¨ãŒç¦æ­¢ã•れã¦ã„ã¾ã™ã€‚
</notification>
<notification name="NoOutsideScripts">
ã“ã®åœŸåœ°ã§ã¯ã€å¤–部ã®ã‚¹ã‚¯ãƒªãƒ—トãŒç¦æ­¢ã•れã¦ã„ã¾ã™ã€‚
-土地所有者ã®ã‚‚ã®ä»¥å¤–ã¯ã‚¹ã‚¯ãƒªãƒ—トã¯å®Ÿè¡Œã•れã¾ã›ã‚“。
+土地所有者ã®ã‚‚ã®ä»¥å¤–ã¯ã‚¹ã‚¯ãƒªãƒ—トãŒå®Ÿè¡Œã•れã¾ã›ã‚“。
</notification>
<notification name="ClaimPublicLand">
ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ã„ãªã„ã¨å…¬å…±ã®åœŸåœ°ã‚’å–å¾—ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。
</notification>
<notification name="RegionTPAccessBlocked">
- ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šãã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 年齢確èªã‚’行ã†ã‹ã€æœ€æ–°ãƒ“ューワをインストールã—ã¦ãã ã•ã„。
+ ã‚ãªãŸã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã«ã‚ˆã‚Šãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã¸ã¯å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。 年齢確èªã‚’行ã†ã‹ã€æœ€æ–°ãƒ“ューワをインストールã—ã¦ãã ã•ã„。
ç¾åœ¨ã®ãƒ¬ãƒ¼ãƒ†ã‚£ãƒ³ã‚°åŒºåˆ†ã§ã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½ãªã‚¨ãƒªã‚¢ã«é–¢ã™ã‚‹è©³ç´°ã¯ãƒŠãƒ¬ãƒƒã‚¸ãƒ™ãƒ¼ã‚¹ã‚’å‚ç…§ã—ã¦ãã ã•ã„。
</notification>
<notification name="URBannedFromRegion">
- ã‚ãªãŸã¯åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã¸ã®ç«‹å…¥ãŒç¦æ­¢ã•れã¦ã„ã¾ã™ã€‚
+ ã‚ãªãŸã¯ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã¸ã®ç«‹å…¥ãŒç¦æ­¢ã•れã¦ã„ã¾ã™ã€‚
</notification>
<notification name="NoTeenGridAccess">
ã‚ãªãŸã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã§ã¯ãƒ†ã‚£ãƒ¼ãƒ³ã‚°ãƒªãƒƒãƒ‰ã«æŽ¥ç¶šã§ãã¾ã›ã‚“。
</notification>
<notification name="ImproperPaymentStatus">
- ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«å…¥ã‚‹ãŸã‚ã«é©ã—ãŸæ”¯æ‰•ã„ステータスãŒã‚りã¾ã›ã‚“。
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥ã‚‹ãŸã‚ã«é©ã—ãŸæ”¯æ‰•ã„ステータスãŒã‚りã¾ã›ã‚“。
</notification>
<notification name="MustGetAgeRgion">
- ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥ã‚‹ã«ã¯å¹´é½¢ç¢ºèªæ¸ˆã¿ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å…¥ã‚‹ãŸã‚ã«ã¯ã€å¹´é½¢ç¢ºèªã‚’済ã¾ã›ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
</notification>
<notification name="MustGetAgeParcel">
- ã“ã®åŒºç”»ã«å…¥ã‚‹ã«ã¯å¹´é½¢ç¢ºèªæ¸ˆã¿ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
+ ã“ã®åŒºç”»ã«å…¥ã‚‹ãŸã‚ã«ã¯ã€å¹´é½¢ç¢ºèªã‚’済ã¾ã›ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
</notification>
<notification name="NoDestRegion">
- 目的地ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
+ 目的地ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
</notification>
<notification name="NotAllowedInDest">
目的地ã«å…¥ã‚‹è¨±å¯ãŒã‚りã¾ã›ã‚“。
@@ -2274,20 +2360,20 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚
テレãƒãƒ¼ãƒˆãŒã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•れã¾ã—ãŸã€‚
</notification>
<notification name="FullRegionTryAgain">
- å…¥ã‚ã†ã¨ã—ã¦ã„る地域(リージョン)ã¯ç¾åœ¨æº€å“¡ã§ã™ã€‚
+ å…¥ã‚ã†ã¨ã—ã¦ã„るリージョンã¯ç¾åœ¨æº€å“¡ã§ã™ã€‚
ã—ã°ã‚‰ãã—ã¦ã‹ã‚‰å†åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="GeneralFailure">
よãã‚る失敗
</notification>
<notification name="RoutedWrongRegion">
- ç•°ãªã‚‹åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã«è¿‚回ã•れã¾ã—ãŸã€‚ ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
+ ç•°ãªã‚‹ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«è¿‚回ã•れã¾ã—ãŸã€‚ ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="NoValidAgentID">
- エージェントIDãŒç„¡åйã§ã™ã€‚
+ エージェント ID ãŒç„¡åйã§ã™ã€‚
</notification>
<notification name="NoValidSession">
- セッションIDãŒç„¡åйã§ã™ã€‚
+ セッション ID ãŒç„¡åйã§ã™ã€‚
</notification>
<notification name="NoValidCircuit">
回路コードãŒç„¡åйã§ã™ã€‚
@@ -2302,7 +2388,7 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚
内部エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
</notification>
<notification name="NoGoodTPDestination">
- ã“ã®åœ°åŸŸï¼ˆãƒªãƒ¼ã‚¸ãƒ§ãƒ³ï¼‰ã§ã¯é©åˆ‡ãªãƒ†ãƒ¬ãƒãƒ¼ãƒˆç›®çš„地ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
+ ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã§ã¯ã€é©åˆ‡ãªãƒ†ãƒ¬ãƒãƒ¼ãƒˆç›®çš„地ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
</notification>
<notification name="InternalErrorRegionResolver">
内部エラーãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
@@ -2314,16 +2400,7 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚
有効ãªåŒºç”»ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
</notification>
<notification name="ObjectGiveItem">
- [NAME_SLURL] ãŒæ‰€æœ‰ã™ã‚‹ [OBJECTFROMNAME] ã¨ã„ã†åå‰ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã«ã“ã® [OBJECTTYPE] を渡ã—ã¾ã—ãŸï¼š
-[ITEM_SLURL]
- <form name="form">
- <button name="Keep" text="å—ã‘å–ã‚‹"/>
- <button name="Discard" text="破棄"/>
- <button name="Mute" text="ブロック"/>
- </form>
- </notification>
- <notification name="ObjectGiveItemUnknownUser">
- ï¼ˆä¸æ˜Žã®ä½äººï¼‰ãŒæ‰€æœ‰ã™ã‚‹ [OBJECTFROMNAME] ã¨ã„ã†åå‰ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã«ã“ã® [OBJECTTYPE] を渡ã—ã¾ã—ãŸï¼š
+ [NAME_SLURL] ãŒæ‰€æœ‰ã™ã‚‹ [OBJECTFROMNAME] ã¨ã„ã†åå‰ã®ã‚ªãƒ–ジェクトãŒã€ã‚ãªãŸã« [OBJECTTYPE] を渡ã—ã¾ã—ãŸï¼š
[ITEM_SLURL]
<form name="form">
<button name="Keep" text="å—ã‘å–ã‚‹"/>
@@ -2332,7 +2409,7 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚
</form>
</notification>
<notification name="UserGiveItem">
- [NAME_SLURL] ãŒã‚ãªãŸã«ã“ã® [OBJECTTYPE] を渡ã—ã¾ã—ãŸï¼š
+ [NAME_SLURL] ãŒã‚ãªãŸã« [OBJECTTYPE] を渡ã—ã¾ã—ãŸï¼š
[ITEM_SLURL]
<form name="form">
<button name="Show" text="表示"/>
@@ -2354,9 +2431,9 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚
</form>
</notification>
<notification name="TeleportOffered">
- [NAME] ã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§ã‚ãªãŸã‚’呼んã§ã„ã¾ã™ã€‚
+ [NAME_SLURL] ã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã§ã‚ãªãŸã‚’呼んã§ã„ã¾ã™ã€‚
-[MESSAGE]
+[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
<form name="form">
<button name="Teleport" text="テレãƒãƒ¼ãƒˆ"/>
<button name="Cancel" text="å–り消ã—"/>
@@ -2374,40 +2451,44 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚
</form>
</notification>
<notification name="OfferFriendship">
- [NAME]ã¯ã€
-フレンド登録を申ã—込んã§ã„ã¾ã™ã€‚
+ [NAME_SLURL] ã¯ãƒ•レンド登録を申ã—込んã§ã„ã¾ã™ã€‚
[MESSAGE]
-(デフォルトã§ãŠäº’ã„ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ãƒ»ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚’見るã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚)
+(デフォルト設定ã ã¨ãŠäº’ã„ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã‚’è¦‹ã‚‹ã“ã¨ãŒã§ãã¾ã™ï¼‰
<form name="form">
<button name="Accept" text="å—ã‘入れる"/>
<button name="Decline" text="辞退"/>
- <button name="Send IM" text="IMã‚’é€ä¿¡"/>
</form>
</notification>
<notification name="FriendshipOffered">
[TO_NAME] ã«ãƒ•レンド登録を申ã—出ã¾ã—ãŸã€‚
</notification>
<notification name="OfferFriendshipNoMessage">
- [NAME]ã¯ã€
+ [NAME] ã¯ã€
フレンド登録を申ã—込んã§ã„ã¾ã™ã€‚
-(デフォルトã§ãŠäº’ã„ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³ãƒ»ã‚¹ãƒ†ãƒ¼ã‚¿ã‚¹ã‚’見るã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚)
+(デフォルトã§ãŠäº’ã„ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã‚’è¦‹ã‚‹ã“ã¨ãŒã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚)
<form name="form">
<button name="Accept" text="å—ã‘入れる"/>
<button name="Decline" text="æ‹’å¦"/>
</form>
</notification>
<notification name="FriendshipAccepted">
- [NAME]ã¯ã€ãƒ•レンド 登録をå—ã‘入れã¾ã—ãŸã€‚
+ [NAME]ã¯ã€ãƒ•レンド登録をå—ã‘入れã¾ã—ãŸã€‚
</notification>
<notification name="FriendshipDeclined">
- [NAME]ã¯ã€ãƒ•レンド 登録を断りã¾ã—ãŸã€‚
+ [NAME]ã¯ã€ãƒ•レンド登録を断りã¾ã—ãŸã€‚
+ </notification>
+ <notification name="FriendshipAcceptedByMe">
+ フレンドã®ç™»éŒ²ä¾é ¼ãŒæ‰¿èªã•れã¾ã—ãŸã€‚
+ </notification>
+ <notification name="FriendshipDeclinedByMe">
+ フレンドã®ç™»éŒ²ä¾é ¼ãŒæ‹’å¦ã•れã¾ã—ãŸã€‚
</notification>
<notification name="OfferCallingCard">
[FIRST] [LAST] ãŒã‚³ãƒ¼ãƒªãƒ³ã‚°ã‚«ãƒ¼ãƒ‰ã‚’渡ãã†ã¨ã—ã¦ã„ã¾ã™ã€‚
-ã‚ãªãŸã®æŒã¡ç‰©ã«ãƒ–ックマークãŒè¿½åŠ ã•れã€ã“ã®ä½äººã«ç´ æ—©ã IM ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
+ã‚ãªãŸã®ã€ŒæŒã¡ç‰©ã€ã«ãƒ–ックマークãŒè¿½åŠ ã•れã€ã“ã®ä½äººã«ç´ æ—©ã IM ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
<form name="form">
<button name="Accept" text="å—ã‘入れる"/>
<button name="Decline" text="辞退"/>
@@ -2422,27 +2503,30 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚
ã“ã®ã¾ã¾ã“ã“ã«ã„ã‚‹ã¨ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã•れã¾ã™ã€‚
</notification>
<notification name="LoadWebPage">
- ウェブ・ページ[URL]をロードã—ã¾ã™ã‹ï¼Ÿ
+ Web ページ [URL] を読ã¿è¾¼ã¿ã¾ã™ã‹ï¼Ÿ
[MESSAGE]
-ロード元ã®ã‚ªãƒ–ジェクト:[OBJECTNAME]ã€ã‚ªãƒ¼ãƒŠãƒ¼ï¼š[NAME]?
+読ã¿è¾¼ã¿å…ƒã®ã‚ªãƒ–ジェクト:[OBJECTNAME]ã€æ‰€æœ‰è€…:[NAME]
<form name="form">
- <button name="Gotopage" text="移動"/>
+ <button name="Gotopage" text="ページã«ç§»å‹•"/>
<button name="Cancel" text="å–り消ã—"/>
</form>
</notification>
<notification name="FailedToFindWearableUnnamed">
- データベースã«[TYPE]ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ
+ データベース㫠[TYPE] ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ
</notification>
<notification name="FailedToFindWearable">
- データベースã«[DESC]ã¨ã„ã†åå‰ã®[TYPE]ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
+ データベース㫠[DESC] ã¨ã„ã†åå‰ã® [TYPE] ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸã€‚
+ </notification>
+ <notification name="ShareToWebFailed">
+ Web サイトã¸ã®ç”»åƒã®ã‚¢ãƒƒãƒ—ロードã«å¤±æ•—ã—ã¾ã—ãŸã€‚
</notification>
<notification name="InvalidWearable">
ç€ç”¨ã—よã†ã¨ã—ã¦ã„るアイテムã¯ã‚ãªãŸã®ãƒ“ューワã§ã¯èª­ã¿è¾¼ã‚€ã“ã¨ãŒã§ãã¾ã›ã‚“。 [APP_NAME] ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’アップグレードã—ã¦ã‹ã‚‰ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ç€ç”¨ã—ã¦ãã ã•ã„。
</notification>
<notification name="ScriptQuestion">
- 「[NAME]ã€ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクト「[OBJECTNAME]ã€ã‚’:
+ [NAME] ãŒæ‰€æœ‰ã™ã‚‹ã‚ªãƒ–ジェクト「 [OBJECTNAME] ã€ã‚’:
[QUESTIONS]
よã‚ã—ã„ã§ã™ã‹ï¼Ÿ
@@ -2466,27 +2550,19 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚
</form>
</notification>
<notification name="ScriptDialog">
- [FIRST] [LAST]ã®ã€Œ[TITLE]ã€
+ [FIRST] [LAST] ã®ã€Œ [TITLE] ã€
[MESSAGE]
<form name="form">
<button name="Ignore" text="無視ã™ã‚‹"/>
</form>
</notification>
<notification name="ScriptDialogGroup">
- [GROUPNAME]ã®ã€Œ[TITLE]ã€
+ [GROUPNAME] ã®ã€Œ [TITLE] ã€
[MESSAGE]
<form name="form">
<button name="Ignore" text="無視ã™ã‚‹"/>
</form>
</notification>
- <notification name="ScriptToast">
- [FIRST] [LAST] ã®ã€Œ [TITLE] ã€ã¯ã€ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚¤ãƒ³ãƒ—ットをリクエストã—ã¦ã„ã¾ã™ã€‚
- <form name="form">
- <button name="Open" text="ダイアログを開ã"/>
- <button name="Ignore" text="無視"/>
- <button name="Block" text="ブロック"/>
- </form>
- </notification>
<notification name="BuyLindenDollarSuccess">
ãŠæ”¯æ‰•ã‚りãŒã¨ã†ã”ã–ã„ã¾ã™ã€‚
@@ -2496,9 +2572,9 @@ Webページã«ã“れをリンクã™ã‚‹ã¨ã€ä»–人ãŒã“ã®å ´æ‰€ã«ç°¡å˜ã«ã‚
</notification>
<notification name="FirstOverrideKeys">
ã‚ãªãŸã®ç§»å‹•ã‚­ãƒ¼ã‚’ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆãŒæ“作ã—ã¦ã„ã¾ã™ã€‚
-矢å°ã‹AWSDã®ã‚­ãƒ¼ã§å‹•作を確èªã—ã¦ãã ã•ã„。
-銃ãªã©ã®ã‚ªãƒ–ジェクトã ã¨ã€ä¸€äººç§°è¦–点(マウスルック)ã«å¤‰æ›´ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
-Mキーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
+矢å°ã‹ AWSD ã®ã‚­ãƒ¼ã§å‹•作を確èªã—ã¦ãã ã•ã„。
+銃ãªã©ã®ã‚ªãƒ–ジェクトã ã¨ã€ä¸€äººç§°è¦–点ã«å¤‰æ›´ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚
+M キーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
</notification>
<notification name="FirstSandbox">
ã“ã“ã¯ã‚µãƒ³ãƒ‰ãƒœãƒƒã‚¯ã‚¹ã‚¨ãƒªã‚¢ã§ã™ã€‚ä½äººãŒåˆ¶ä½œã‚’å­¦ã¶ã“ã¨ãŒã§ãã¾ã™ã€‚
@@ -2506,7 +2582,7 @@ Mキーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
ã“ã“ã§åˆ¶ä½œã•れãŸã‚‚ã®ã¯æ™‚é–“ãŒçµŒã¤ã¨å‰Šé™¤ã•れã¾ã™ã€‚制作ã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€Œå–ã‚‹ã€ã‚’é¸ã³ã€æŒã¡ç‰©ã«å…¥ã‚Œã¦ãŠæŒã¡å¸°ã‚Šã™ã‚‹ã®ã‚’ãŠå¿˜ã‚Œãªã。
</notification>
<notification name="MaxListSelectMessage">
- ã“ã®ãƒªã‚¹ãƒˆã‹ã‚‰[MAX_SELECT]個ã¾ã§ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã§ãã¾ã™ã€‚
+ ã“ã®ãƒªã‚¹ãƒˆã‹ã‚‰ [MAX_SELECT] 個ã¾ã§ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’é¸æŠžã§ãã¾ã™ã€‚
</notification>
<notification name="VoiceInviteP2P">
[NAME] ãŒã‚ãªãŸã‚’ボイスãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«æ‹›å¾…ã—ã¦ã„ã¾ã™ã€‚
@@ -2527,7 +2603,7 @@ Mキーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
[FIRST] [LAST] ã¯ã‚¢ã‚¤ãƒ†ãƒ ã‚’å—ã‘å–りã€è‡ªå‹•çš„ã«ãƒ–ロックãŒè§£é™¤ã•れã¾ã—ãŸã€‚
</notification>
<notification name="VoiceInviteGroup">
- [NAME] 㯠[GROUP]. ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«å‚加ã—ã¾ã—ãŸã€‚
+ [NAME] 㯠[GROUP] ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚³ãƒ¼ãƒ«ã«å‚加ã—ã¾ã—ãŸã€‚
å—ã‘入れるをクリックã™ã‚‹ã‹ã€æ–­ã‚‹å ´åˆã¯æ‹’å¦ã‚’クリックã—ã¦ãã ã•ã„。 ブロックをクリックã™ã‚‹ã¨ã€ã“ã®ç™ºä¿¡è€…をブロックã—ã¾ã™ã€‚
<form name="form">
<button name="Accept" text="å—ã‘入れる"/>
@@ -2554,7 +2630,7 @@ Mキーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
</form>
</notification>
<notification name="VoiceChannelFull">
- ã‚ãªãŸãŒå‚加ã—よã†ã¨ã—ã¦ã„るボイスコール[VOICE_CHANNEL_NAME]ã¯ã€å‚åŠ è€…ãŒæœ€å¤§é™ã«é”ã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
+ ã‚ãªãŸãŒå‚加ã—よã†ã¨ã—ã¦ã„るボイスコール [VOICE_CHANNEL_NAME] ã¯ã€å‚åŠ è€…ãŒæœ€å¤§é™ã«é”ã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="ProximalVoiceChannelFull">
ã“ã®ã‚¨ãƒªã‚¢ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã¯ã€æ··é›‘ã®ãŸã‚容é‡ã‚’è¶…ãˆã¦ã—ã¾ã£ã¦ã„ã¾ã™ã€‚申ã—訳ã‚りã¾ã›ã‚“ãŒã€ä»–ã®ã‚¨ãƒªã‚¢ã§ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã‚’ãŠè©¦ã—ãã ã•ã„。
@@ -2575,7 +2651,19 @@ Mキーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
[VOICE_CHANNEL_NAME] ã¸ã®æŽ¥ç¶šã«å¤±æ•—ã—ã¾ã—ãŸã€‚ã‚ã¨ã§å†åº¦ãŠè©¦ã—ãã ã•ã„。 「近ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã€ã«å†æŽ¥ç¶šã•れã¾ã™ã€‚
</notification>
<notification name="VoiceLoginRetry">
- ã‚ãªãŸç”¨ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒ³ãƒãƒ«ã‚’作æˆã—ã¦ã„ã¾ã™ã€‚1分ã»ã©ã‹ã‹ã‚Šã¾ã™ã€‚
+ ボイスãƒãƒ£ãƒ³ãƒãƒ«ã‚’作æˆã—ã¦ã„ã¾ã™ã€‚1 分ã»ã©ã‹ã‹ã‚Šã¾ã™ã€‚
+ </notification>
+ <notification name="VoiceEffectsExpired">
+ ボイスモーフィング効果ã®1ã¤ã¾ãŸã¯è¤‡æ•°ã®æœ‰åŠ¹æœŸé™ãŒçµ‚了ã—ã¾ã—ãŸã€‚期é™ã‚’延長・更新ã™ã‚‹ã«ã¯[[URL]ã“ã¡ã‚‰ã‚’クリック]ã—ã¦ãã ã•ã„。
+ </notification>
+ <notification name="VoiceEffectsExpiredInUse">
+ ãƒœã‚¤ã‚¹ãƒ¢ãƒ¼ãƒ•ã‚£ãƒ³ã‚°åŠ¹æžœã®æœ‰åŠ¹æœŸé™ãŒçµ‚了ã—ãŸãŸã‚ã€ã‚ãªãŸã®é€šå¸¸ã®ãƒœã‚¤ã‚¹è¨­å®šãŒé©ç”¨ã•れã¾ã—ãŸã€‚期é™ã‚’延長・更新ã™ã‚‹ã«ã¯[[URL]ã“ã¡ã‚‰ã‚’クリック]ã—ã¦ãã ã•ã„。
+ </notification>
+ <notification name="VoiceEffectsWillExpire">
+ ボイスモーフィング効果ã®1ã¤ã¾ãŸã¯è¤‡æ•°ã®æœ‰åŠ¹æœŸé™ãŒ[INTERVAL]日以内ã«çµ‚了ã—ã¾ã™ã€‚期é™ã‚’延長・更新ã™ã‚‹ã«ã¯[[URL]ã“ã¡ã‚‰ã‚’クリック]ã—ã¦ãã ã•ã„。
+ </notification>
+ <notification name="VoiceEffectsNew">
+ æ–°ã—ã„ボイスモーフィング効果ãŒç™»å ´ï¼
</notification>
<notification name="Cannot enter parcel: not a group member">
特定ã®ã‚°ãƒ«ãƒ¼ãƒ—メンãƒãƒ¼ã®ã¿ã“ã®ã‚¨ãƒªã‚¢ã‚’訪å•ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚
@@ -2584,16 +2672,16 @@ Mキーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
ç«‹å…¥ç¦æ­¢ã•れã¦ã„ã‚‹ãŸã‚ã€åŒºç”»ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
</notification>
<notification name="Cannot enter parcel: not on access list">
- アクセス・リストã«å«ã¾ã‚Œã¦ã„ãªã„ãŸã‚ã€åŒºç”»ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
+ アクセスリストã«å«ã¾ã‚Œã¦ã„ãªã„ãŸã‚ã€åŒºç”»ã«å…¥ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
</notification>
<notification name="VoiceNotAllowed">
- ã‚ãªãŸã«ã¯[VOICE_CHANNEL_NAME]ã®ãƒœã‚¤ã‚¹ãƒ»ãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。
+ ã‚ãªãŸã«ã¯ [VOICE_CHANNEL_NAME] ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。
</notification>
<notification name="VoiceCallGenericError">
- [VOICE_CHANNEL_NAME]ã®ãƒœã‚¤ã‚¹ãƒ»ãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šä¸­ã«ã€ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
+ [VOICE_CHANNEL_NAME] ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«æŽ¥ç¶šä¸­ã«ã€ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚後ã§ã‚‚ã†ä¸€åº¦ãŠè©¦ã—ãã ã•ã„。
</notification>
<notification name="ServerVersionChanged">
- ç•°ãªã‚‹ã‚µãƒ¼ãƒãƒ¼ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«æ¥ã¾ã—ãŸã€‚パフォーマンスã«å½±éŸ¿ã™ã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚ [[URL] リリースノートを確èª]
+ サーãƒãƒ¼ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒç•°ãªã‚‹ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«æ¥ã¾ã—ãŸã€‚パフォーマンスã«å½±éŸ¿ã™ã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚ [[URL] リリースノートを確èª]
</notification>
<notification name="UnsupportedCommandSLURL">
クリックã—㟠SLurl ã¯ã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã›ã‚“。
@@ -2613,7 +2701,7 @@ Mキーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
</notification>
<notification name="ConfirmCloseAll">
ã™ã¹ã¦ã® IM ã‚’é–‰ã˜ã¾ã™ã‹ï¼Ÿ
- <usetemplate name="okcancelignore" notext="キャンセル" yestext="OK"/>
+ <usetemplate ignoretext="ã™ã¹ã¦ã® IM ã‚’é–‰ã˜ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="キャンセル" yestext="OK"/>
</notification>
<notification name="AttachmentSaved">
アタッãƒãƒ¡ãƒ³ãƒˆãŒä¿å­˜ã•れã¾ã—ãŸã€‚
@@ -2642,6 +2730,96 @@ Mキーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
é¸æŠžã—ãŸãƒœã‚¿ãƒ³ã‚’ç¾åœ¨è¡¨ç¤ºã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
ã˜ã‚…ã†ã¶ã‚“ãªã‚¹ãƒšãƒ¼ã‚¹ãŒã§ãれã°ãƒœã‚¿ãƒ³ã¯è¡¨ç¤ºã•れã¾ã™ã€‚
</notification>
+ <notification name="ShareNotification">
+ 共有ã™ã‚‹ä½äººã‚’é¸æŠžã—ã¾ã™ã€‚
+ </notification>
+ <notification name="ShareItemsConfirmation">
+ 次ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’共有ã—ã¾ã™ã‹ï¼š
+
+[ITEMS]
+
+次ã®ä½äººã¨å…±æœ‰ã—ã¾ã™ã‹ï¼š
+
+[RESIDENTS]
+ <usetemplate name="okcancelbuttons" notext="å–り消ã—" yestext="OK"/>
+ </notification>
+ <notification name="ItemsShared">
+ アイテムãŒå…±æœ‰ã•れã¾ã—ãŸã€‚
+ </notification>
+ <notification name="DeedToGroupFail">
+ グループã¸ã®è­²æ¸¡ã«å¤±æ•—ã—ã¾ã—ãŸã€‚
+ </notification>
+ <notification name="AvatarRezNotification">
+ (作æˆå¾Œ[EXISTENCE]秒経éŽï¼‰
+&apos;[NAME]&apos;ã¨ã„ã†ã‚¢ãƒã‚¿ãƒ¼ã¯[TIME]秒後ã«å§¿ã‚’ç¾ã‚ã—ã¾ã—ãŸã€‚
+ </notification>
+ <notification name="AvatarRezSelfBakedDoneNotification">
+ (作æˆå¾Œ[EXISTENCE]秒経éŽï¼‰
+アウトフィットã®ãƒ™ãƒ¼ã‚¯ã¯[TIME]秒後ã«å®Œäº†ã—ã¾ã—ãŸã€‚
+ </notification>
+ <notification name="AvatarRezSelfBakedUpdateNotification">
+ (作æˆå¾Œ[EXISTENCE]秒経éŽï¼‰
+å®¹å§¿ã®æ›´æ–°ã¯[TIME]秒後ã«é€ä¿¡ã•れã¾ã—ãŸã€‚
+[STATUS]
+ </notification>
+ <notification name="AvatarRezCloudNotification">
+ ( [EXISTENCE] 秒)
+ã‚¢ãƒã‚¿ãƒ¼ã€Œ NAME ã€ãŒã‚¯ãƒ©ã‚¦ãƒ‰ã«ãªã‚Šã¾ã—ãŸã€‚
+ </notification>
+ <notification name="AvatarRezArrivedNotification">
+ ( [EXISTENCE] 秒)
+ã‚¢ãƒã‚¿ãƒ¼ã€Œ NAME ã€ãŒç¾ã‚Œã¾ã—ãŸã€‚
+ </notification>
+ <notification name="AvatarRezLeftCloudNotification">
+ ( [EXISTENCE] 秒)
+ã‚¢ãƒã‚¿ãƒ¼ã€Œ [NAME] ã€ãŒ [TIME] ç§’ã§ã‚¯ãƒ©ã‚¦ãƒ‰çŠ¶æ…‹ã‹ã‚‰å‡ºç¾ã—ã¾ã™ã€‚
+ </notification>
+ <notification name="AvatarRezEnteredAppearanceNotification">
+ ( [EXISTENCE] 秒)
+ã‚¢ãƒã‚¿ãƒ¼ã€Œ NAME ã€ãŒå®¹å§¿ç·¨é›†ãƒ¢ãƒ¼ãƒ‰ã«å…¥ã‚Šã¾ã—ãŸã€‚
+ </notification>
+ <notification name="AvatarRezLeftAppearanceNotification">
+ ( [EXISTENCE] 秒)
+ã‚¢ãƒã‚¿ãƒ¼ã€Œ NAME ã€ãŒå®¹å§¿ç·¨é›†ãƒ¢ãƒ¼ãƒ‰ã‚’解除ã—ã¾ã—ãŸã€‚
+ </notification>
+ <notification name="NoConnect">
+ [PROTOCOL] [HOSTID]を使ã£ã¦æŽ¥ç¶šã§ãã¾ã›ã‚“。
+ãŠä½¿ã„ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚„ファイアウォールã®è¨­å®šã‚’確èªã—ã¦ãã ã•ã„。
+ <form name="form">
+ <button name="OK" text="OK"/>
+ </form>
+ </notification>
+ <notification name="NoVoiceConnect">
+ ボイスサーãƒãƒ¼ã«æŽ¥ç¶šã§ãã¾ã›ã‚“:
+
+[HOSTID]
+
+ボイスãƒãƒ£ãƒƒãƒˆã«ã‚ˆã‚‹ã‚³ãƒŸãƒ¥ãƒ‹ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ãŒåˆ©ç”¨ã§ãã¾ã›ã‚“。
+ãŠä½¿ã„ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚„ファイアウォールã®è¨­å®šã‚’確èªã—ã¦ãã ã•ã„。
+ <form name="form">
+ <button name="OK" text="OK"/>
+ </form>
+ </notification>
+ <notification name="AvatarRezLeftNotification">
+ ( [EXISTENCE] 秒)
+ã‚¢ãƒã‚¿ãƒ¼ã€Œ NAME ã€ãŒå®Œå…¨ã«èª­ã¿è¾¼ã¾ã‚Œã¾ã—ãŸã€‚
+ </notification>
+ <notification name="AvatarRezSelfBakeNotification">
+ (作æˆå¾Œ[EXISTENCE]秒経éŽï¼‰
+&apos;[BODYREGION]&apos;ã®[RESOLUTION]ã®ãƒ™ãƒ¼ã‚¯ãƒ‰ãƒ†ã‚¯ã‚¹ãƒãƒ£ã¯[TIME]秒後ã«ã‚¢ãƒƒãƒ—ロードã•れã¾ã—ãŸã€‚
+ </notification>
+ <notification name="ConfirmLeaveCall">
+ ã“ã®ã‚³ãƒ¼ãƒ«ã‹ã‚‰æŠœã‘ã¾ã™ã‹ï¼Ÿ
+ <usetemplate ignoretext="コールã‹ã‚‰æŠœã‘ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="ã„ã„ãˆ" yestext="ã¯ã„"/>
+ </notification>
+ <notification name="ConfirmMuteAll">
+ グループコールã®å‚加者全員をミュートã—ã¾ã—ãŸã€‚
+ã‚ã¨ã‹ã‚‰ã“ã®ã‚³ãƒ¼ãƒ«ã«å‚加ã™ã‚‹ä½äººã‚‚
+ミュートã•れã¾ã™ã€‚ã‚ãªãŸãŒã‚³ãƒ¼ãƒ«ã‚’終了ã—ã¦ã‚‚ä»–ã®å‚加者ã®ãƒŸãƒ¥ãƒ¼ãƒˆçŠ¶æ…‹ãŒç¶šãã¾ã™ã€‚
+
+全員をミュートã—ã¾ã™ã‹ï¼Ÿ
+ <usetemplate ignoretext="グループコールã®å‚加者全員をミュートã™ã‚‹å‰ã®ç¢ºèª" name="okcancelignore" notext="å–り消ã—" yestext="OK"/>
+ </notification>
<global name="UnsupportedCPU">
- ã‚ãªãŸã® CPU ã®é€Ÿåº¦ã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。
</global>
@@ -2657,13 +2835,13 @@ Mキーを押ã—ã¦å¤‰æ›´ã—ã¾ã™ã€‚
510
</global>
<global name="UnsupportedGPU">
- - ã‚ãªãŸã®ã‚°ãƒ©ãƒ•ィック・カードã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。
+ - ã‚ãªãŸã®ã‚°ãƒ©ãƒ•ィックカードã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。
</global>
<global name="UnsupportedRAM">
- - ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ ãƒ»ãƒ¡ãƒ¢ãƒªã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。
+ - ã‚ãªãŸã®ã‚·ã‚¹ãƒ†ãƒ ãƒ¡ãƒ¢ãƒªã¯å¿…é ˆå‹•ä½œç’°å¢ƒã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„ã¾ã›ã‚“。
</global>
<global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
- 自分ã®åœŸåœ°ã‚’ãŠæŒã¡ã®å ´åˆã€ãƒ›ãƒ¼ãƒ ãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã«è¨­å®šã§ãã¾ã™ã€‚
-ãŠæŒã¡ã§ãªã„å ´åˆã¯ã€åœ°å›³ã§ã€Œã‚¤ãƒ³ãƒ•ã‚©ãƒãƒ–ã€ã‚’探ã—ã¦ãã ã•ã„。
+ 自分ã®åœŸåœ°ã‚’ãŠæŒã¡ã®å ´åˆã€ã€Œãƒ›ãƒ¼ãƒ ã€ã«è¨­å®šã§ãã¾ã™ã€‚
+ãŠæŒã¡ã§ãªã„å ´åˆã¯ã€åœ°å›³ã§ã€Œã‚¤ãƒ³ãƒ•ã‚©ãƒãƒ–ã€ã‚’ãŠæŽ¢ã—ãã ã•ã„。
</global>
</notifications>
diff --git a/indra/newview/skins/default/xui/ja/outfit_accordion_tab.xml b/indra/newview/skins/default/xui/ja/outfit_accordion_tab.xml
new file mode 100644
index 0000000000..bac885e5d8
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/outfit_accordion_tab.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: mantipov: this xml is intended to be used inside panel_outfits_list.xml for each outfit folder-->
+<!-- All accordion tabs in the My Appearance/My Outfits panel will be created from this one at runtume-->
+<accordion_tab name="Mockup Tab" title="Mockup Tab"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/ja/panel_body_parts_list_item.xml
new file mode 100644
index 0000000000..de764d8025
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_body_parts_list_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="wearable_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_bodyparts_list_button_bar.xml b/indra/newview/skins/default/xui/ja/panel_bodyparts_list_button_bar.xml
new file mode 100644
index 0000000000..42d8a21660
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_bodyparts_list_button_bar.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="clothing_list_button_bar_panel">
+ <button label="交æ›" name="switch_btn"/>
+ <button label="è²·ã„物 &gt;" name="bodyparts_shop_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_bottomtray.xml b/indra/newview/skins/default/xui/ja/panel_bottomtray.xml
index 414413a980..04b4893026 100644
--- a/indra/newview/skins/default/xui/ja/panel_bottomtray.xml
+++ b/indra/newview/skins/default/xui/ja/panel_bottomtray.xml
@@ -1,12 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="bottom_tray">
- <string name="SpeakBtnToolTip">
- マイクã®ã‚ªãƒ³ãƒ»ã‚ªãƒ•
- </string>
- <string name="VoiceControlBtnToolTip">
- ボイスコントロールパãƒãƒ«ã®è¡¨ç¤ºãƒ»éžè¡¨ç¤º
- </string>
+ <string name="SpeakBtnToolTip" value="マイクã®ã‚ªãƒ³ãƒ»ã‚ªãƒ•"/>
+ <string name="VoiceControlBtnToolTip" value="ボイスコントロールパãƒãƒ«ã®è¡¨ç¤ºãƒ»éžè¡¨ç¤º"/>
<layout_stack name="toolbar_stack">
+ <layout_panel name="speak_panel">
+ <talk_button name="talk">
+ <speak_button label="話ã™" label_selected="話ã™" name="speak_btn"/>
+ </talk_button>
+ </layout_panel>
<layout_panel name="gesture_panel">
<gesture_combo_list label="ジェスãƒãƒ£ãƒ¼" name="Gesture" tool_tip="ジェスãƒãƒ£ãƒ¼ã®è¡¨ç¤ºãƒ»éžè¡¨ç¤º"/>
</layout_panel>
@@ -17,11 +18,26 @@
<button label="視界" name="camera_btn" tool_tip="カメラコントロールã®è¡¨ç¤ºãƒ»éžè¡¨ç¤º"/>
</layout_panel>
<layout_panel name="snapshot_panel">
- <button label="" name="snapshots" tool_tip="スナップショットを撮る"/>
+ <button label="" name="snapshots" tool_tip="スナップショットを撮りã¾ã™"/>
+ </layout_panel>
+ <layout_panel name="sidebar_btn_panel">
+ <button label="サイドãƒãƒ¼" name="sidebar_btn" tool_tip="サイドãƒãƒ¼ã®è¡¨ç¤ºãƒ»éžè¡¨ç¤º"/>
+ </layout_panel>
+ <layout_panel name="build_btn_panel">
+ <button label="制作" name="build_btn" tool_tip="制作ツールã®è¡¨ç¤ºãƒ»éžè¡¨ç¤º"/>
+ </layout_panel>
+ <layout_panel name="search_btn_panel">
+ <button label="検索" name="search_btn" tool_tip="検索ã®è¡¨ç¤ºãƒ»éžè¡¨ç¤º"/>
+ </layout_panel>
+ <layout_panel name="world_map_btn_panel">
+ <button label="地図" name="world_map_btn" tool_tip="世界地図ã®è¡¨ç¤ºãƒ»éžè¡¨ç¤º"/>
+ </layout_panel>
+ <layout_panel name="mini_map_btn_panel">
+ <button label="ミニマップ" name="mini_map_btn" tool_tip="ミニマップã®è¡¨ç¤ºãƒ»éžè¡¨ç¤º"/>
</layout_panel>
<layout_panel name="im_well_panel">
<chiclet_im_well name="im_well">
- <button name="Unread IM messages" tool_tip="Conversations"/>
+ <button name="Unread IM messages" tool_tip="会話"/>
</chiclet_im_well>
</layout_panel>
<layout_panel name="notification_well_panel">
diff --git a/indra/newview/skins/default/xui/ja/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/ja/panel_bottomtray_lite.xml
new file mode 100644
index 0000000000..6eca8adfe5
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_bottomtray_lite.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray_lite">
+ <layout_stack name="toolbar_stack_lite">
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="ジェスãƒãƒ£ãƒ¼" name="Gesture" tool_tip="ジェスãƒãƒ£ãƒ¼ã®è¡¨ç¤ºãƒ»éžè¡¨ç¤º"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_classified_info.xml b/indra/newview/skins/default/xui/ja/panel_classified_info.xml
index 7fc4e6f674..0aa0e8a8a9 100644
--- a/indra/newview/skins/default/xui/ja/panel_classified_info.xml
+++ b/indra/newview/skins/default/xui/ja/panel_classified_info.xml
@@ -1,23 +1,54 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_classified_info">
<panel.string name="type_mature">
- 控ãˆã‚
+ Moderate
</panel.string>
<panel.string name="type_pg">
- 一般コンテンツ
+ 「Generalã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„
+ </panel.string>
+ <panel.string name="l$_price">
+ L$ [PRICE]
+ </panel.string>
+ <panel.string name="click_through_text_fmt">
+ [TELEPORT] テレãƒãƒ¼ãƒˆã€ [MAP] 地図〠[PROFILE] プロフィール
+ </panel.string>
+ <panel.string name="date_fmt">
+ [year,datetime,slt]/[mthnum,datetime,slt]/[day,datetime,slt]
+ </panel.string>
+ <panel.string name="auto_renew_on">
+ 有効
+ </panel.string>
+ <panel.string name="auto_renew_off">
+ 無効
</panel.string>
<text name="title" value="クラシファイド広告情報"/>
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
- <text name="classified_name" value="[name]"/>
- <text name="classified_location" value="[loading...]"/>
- <text name="content_type" value="[content type]"/>
- <text name="category" value="[category]"/>
- <check_box label="毎週自動更新" name="auto_renew"/>
- <text name="price_for_listing" tool_tip="掲載価格">
- L$ [PRICE]
- </text>
- <text name="classified_desc" value="[description]"/>
+ <text_editor name="classified_name" value="[name]"/>
+ <text name="classified_location_label" value="場所:"/>
+ <text_editor name="classified_location" value="[loading...]"/>
+ <text name="content_type_label" value="内容ã®ç¨®é¡žï¼š"/>
+ <text_editor name="content_type" value="[content type]"/>
+ <text name="category_label" value="カテゴリ:"/>
+ <text_editor name="category" value="[category]"/>
+ <text name="creation_date_label" value="制作日:"/>
+ <text_editor name="creation_date" tool_tip="制作日" value="[date]"/>
+ <text name="price_for_listing_label" value="掲載価格:"/>
+ <text_editor name="price_for_listing" tool_tip="掲載価格" value="[price]"/>
+ <layout_stack name="descr_stack">
+ <layout_panel name="clickthrough_layout_panel">
+ <text name="click_through_label" value="クリック数:"/>
+ <text_editor name="click_through_text" tool_tip="Click through data" value="[clicks]"/>
+ </layout_panel>
+ <layout_panel name="price_layout_panel">
+ <text name="auto_renew_label" value="自動更新:"/>
+ <text name="auto_renew" value="有効"/>
+ </layout_panel>
+ <layout_panel name="descr_layout_panel">
+ <text name="classified_desc_label" value="説明:"/>
+ <text_editor name="classified_desc" value="[description]"/>
+ </layout_panel>
+ </layout_stack>
</panel>
</scroll_container>
<panel name="buttons">
diff --git a/indra/newview/skins/default/xui/ja/panel_clothing_list_button_bar.xml b/indra/newview/skins/default/xui/ja/panel_clothing_list_button_bar.xml
new file mode 100644
index 0000000000..2159f17fec
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_clothing_list_button_bar.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="clothing_list_button_bar_panel">
+ <button label="追加 +" name="add_btn"/>
+ <button label="è²·ã„物 &gt;" name="clothing_shop_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_clothing_list_item.xml b/indra/newview/skins/default/xui/ja/panel_clothing_list_item.xml
new file mode 100644
index 0000000000..de764d8025
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_clothing_list_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="wearable_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_cof_wearables.xml b/indra/newview/skins/default/xui/ja/panel_cof_wearables.xml
new file mode 100644
index 0000000000..b9bc10c220
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_cof_wearables.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="cof_wearables">
+ <accordion name="cof_wearables_accordion">
+ <accordion_tab name="tab_attachments" title="アタッãƒãƒ¡ãƒ³ãƒˆ"/>
+ <accordion_tab name="tab_clothing" title="衣類"/>
+ <accordion_tab name="tab_body_parts" title="身体部ä½"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/ja/panel_deletable_wearable_list_item.xml
new file mode 100644
index 0000000000..91d90a5660
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_deletable_wearable_list_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="deletable_wearable_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/ja/panel_dummy_clothing_list_item.xml
new file mode 100644
index 0000000000..6af84de0c7
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_dummy_clothing_list_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="dummy_clothing_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_alpha.xml b/indra/newview/skins/default/xui/ja/panel_edit_alpha.xml
index 7825d81c53..f2e3e6e993 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_alpha.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_alpha.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_alpha_panel">
<panel name="avatar_alpha_color_panel">
- <texture_picker label="アルファ(下)" name="Lower Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <texture_picker label="アルファ(上)" name="Upper Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <texture_picker label="頭部ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Head Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="アルファ&#10;(下)" name="Lower Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="アルファ&#10;(上)" name="Upper Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <texture_picker label="頭部ã®ã‚¢&#10;ルファ" name="Head Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
<texture_picker label="ç›®ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Eye Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
<texture_picker label="髪ã®ã‚¢ãƒ«ãƒ•ã‚¡" name="Hair Alpha" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_classified.xml b/indra/newview/skins/default/xui/ja/panel_edit_classified.xml
index 4cb5884f28..5e90076a74 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_classified.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_classified.xml
@@ -3,12 +3,20 @@
<panel.string name="location_notice">
(掲載後更新)
</panel.string>
+ <string name="publish_label">
+ 掲載
+ </string>
+ <string name="save_label">
+ ä¿å­˜
+ </string>
<text name="title">
クラシファイド広告ã®ç·¨é›†
</text>
<scroll_container name="profile_scroll">
<panel name="scroll_content_panel">
- <icon label="" name="edit_icon" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠž"/>
+ <panel name="snapshot_panel">
+ <icon label="" name="edit_icon" tool_tip="クリックã—ã¦ç”»åƒã‚’é¸æŠž"/>
+ </panel>
<text name="Name:">
タイトル:
</text>
@@ -22,20 +30,19 @@
ローディング...
</text>
<button label="ç¾åœ¨åœ°ã«è¨­å®š" name="set_to_curr_location_btn"/>
- <combo_box name="content_type">
- <combo_item name="mature_ci">
- 控ãˆã‚コンテンツ
- </combo_item>
- <combo_item name="pg_ci">
- 一般コンテンツ
- </combo_item>
- </combo_box>
+ <text name="category_label" value="カテゴリ:"/>
+ <text name="content_type_label" value="内容ã®ç¨®é¡žï¼š"/>
+ <icons_combo_box label="「Generalã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„" name="content_type">
+ <icons_combo_box.item label="「Moderateã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„" name="mature_ci" value="Mature"/>
+ <icons_combo_box.item label="「Generalã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„" name="pg_ci" value="PG"/>
+ </icons_combo_box>
+ <text name="price_for_listing_label" value="掲載価格:"/>
<spinner label="L$" name="price_for_listing" tool_tip="掲載価格" value="50"/>
<check_box label="毎週自動更新" name="auto_renew"/>
</panel>
</scroll_container>
<panel label="bottom_panel" name="bottom_panel">
- <button label="ä¿å­˜" name="save_changes_btn"/>
+ <button label="[LABEL]" name="save_changes_btn"/>
<button label="キャンセル" name="cancel_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_eyes.xml b/indra/newview/skins/default/xui/ja/panel_edit_eyes.xml
index 0cee85f685..94967999a1 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_eyes.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_eyes.xml
@@ -3,7 +3,9 @@
<panel name="avatar_eye_color_panel">
<texture_picker label="çž³" name="Iris" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="eyes_main_tab" title="ç›®"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="eyes_main_tab" title="ç›®"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_gloves.xml b/indra/newview/skins/default/xui/ja/panel_edit_gloves.xml
index 393bd15236..83e9abca85 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_gloves.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_gloves.xml
@@ -4,7 +4,9 @@
<texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
<color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="gloves_main_tab" title="手袋"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="gloves_main_tab" title="手袋"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_hair.xml b/indra/newview/skins/default/xui/ja/panel_edit_hair.xml
index 065771df16..f73f760192 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_hair.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_hair.xml
@@ -3,10 +3,12 @@
<panel name="avatar_hair_color_panel">
<texture_picker label="テクスãƒãƒ£" name="Texture" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="hair_color_tab" title="色"/>
- <accordion_tab name="hair_style_tab" title="スタイル"/>
- <accordion_tab name="hair_eyebrows_tab" title="眉毛"/>
- <accordion_tab name="hair_facial_tab" title="フェイシャル"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="hair_color_tab" title="色"/>
+ <accordion_tab name="hair_style_tab" title="スタイル"/>
+ <accordion_tab name="hair_eyebrows_tab" title="眉毛"/>
+ <accordion_tab name="hair_facial_tab" title="フェイシャル"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_jacket.xml b/indra/newview/skins/default/xui/ja/panel_edit_jacket.xml
index 96a851cc4c..fe95061e57 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_jacket.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_jacket.xml
@@ -5,7 +5,9 @@
<texture_picker label="生地・下" name="Lower Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
<color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="jacket_main_tab" title="ジャケット"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="jacket_main_tab" title="ジャケット"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_pants.xml b/indra/newview/skins/default/xui/ja/panel_edit_pants.xml
index f93d3d6b14..9f672337aa 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_pants.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_pants.xml
@@ -4,7 +4,9 @@
<texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
<color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="pants_main_tab" title="パンツ"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="pants_main_tab" title="パンツ"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_pick.xml b/indra/newview/skins/default/xui/ja/panel_edit_pick.xml
index 88c05fbae7..e58fa979d7 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_pick.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_pick.xml
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="ピック編集" name="panel_edit_pick">
+ <panel.string name="location_notice">
+ (掲載後更新)
+ </panel.string>
<text name="title">
ピック編集
</text>
@@ -22,7 +25,7 @@
</panel>
</scroll_container>
<panel label="bottom_panel" name="bottom_panel">
- <button label="[WHAT] ã‚’ä¿å­˜" name="save_changes_btn"/>
+ <button label="ピックをä¿å­˜" name="save_changes_btn"/>
<button label="キャンセル" name="cancel_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_profile.xml b/indra/newview/skins/default/xui/ja/panel_edit_profile.xml
index 2a850ab29c..cd81565acb 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_profile.xml
@@ -42,13 +42,13 @@
<line_editor name="homepage_edit" value="http://"/>
<check_box label="æ¤œç´¢çµæžœã«è¡¨ç¤º" name="show_in_search_checkbox"/>
<text name="title_acc_status_text" value="マイアカウント:"/>
+ <text_editor name="acc_status_text" value="ä½äººã€‚ 支払情報未登録。"/>
<text name="my_account_link" value="[[URL] マイアカウントã«ç§»å‹•]"/>
- <text name="acc_status_text" value="ä½äººã€‚ 支払情報未登録。"/>
<text name="title_partner_text" value="マイパートナー:"/>
- <text name="partner_edit_link" value="[[URL] 編集]"/>
<panel name="partner_data_panel">
- <name_box name="partner_text" value="[FIRST] [LAST]"/>
+ <name_box initial_value="(å–得中)" name="partner_text" value="[FIRST] [LAST]"/>
</panel>
+ <text name="partner_edit_link" value="[[URL] 編集]" width="100"/>
</panel>
</panel>
</scroll_container>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_shape.xml b/indra/newview/skins/default/xui/ja/panel_edit_shape.xml
index 1e20eb26b6..5a3a949150 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_shape.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_shape.xml
@@ -1,23 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_shape_panel">
- <panel name="avatar_sex_panel">
- <text name="gender_text">
- 性別:
- </text>
- <radio_group name="sex_radio">
- <radio_item label="女性" name="radio"/>
- <radio_item label="男性" name="radio2"/>
- </radio_group>
+ <string name="meters">
+ メートル
+ </string>
+ <string name="feet">
+ フィート
+ </string>
+ <string name="height">
+ 高ã•:
+ </string>
+ <text name="avatar_height"/>
+ <panel label="シャツ" name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shape_body_tab" title="身体"/>
+ <accordion_tab name="shape_head_tab" title="é ­"/>
+ <accordion_tab name="shape_eyes_tab" title="ç›®"/>
+ <accordion_tab name="shape_ears_tab" title="耳"/>
+ <accordion_tab name="shape_nose_tab" title="é¼»"/>
+ <accordion_tab name="shape_mouth_tab" title="å£"/>
+ <accordion_tab name="shape_chin_tab" title="ã‚ã”"/>
+ <accordion_tab name="shape_torso_tab" title="上åŠèº«"/>
+ <accordion_tab name="shape_legs_tab" title="脚"/>
+ </accordion>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="shape_body_tab" title="身体"/>
- <accordion_tab name="shape_head_tab" title="é ­"/>
- <accordion_tab name="shape_eyes_tab" title="ç›®"/>
- <accordion_tab name="shape_ears_tab" title="耳"/>
- <accordion_tab name="shape_nose_tab" title="é¼»"/>
- <accordion_tab name="shape_mouth_tab" title="å£"/>
- <accordion_tab name="shape_chin_tab" title="ã‚ã”"/>
- <accordion_tab name="shape_torso_tab" title="é ­"/>
- <accordion_tab name="shape_legs_tab" title="脚"/>
- </accordion>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_shirt.xml b/indra/newview/skins/default/xui/ja/panel_edit_shirt.xml
index b2eb8fa18e..457c0bceb8 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_shirt.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_shirt.xml
@@ -4,7 +4,9 @@
<texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/>
<color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="shirt_main_tab" title="シャツ"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shirt_main_tab" title="シャツ"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_shoes.xml b/indra/newview/skins/default/xui/ja/panel_edit_shoes.xml
index 83e302f8f9..98b4c57fc7 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_shoes.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_shoes.xml
@@ -4,7 +4,9 @@
<texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
<color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="shoes_main_tab" title="é´"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shoes_main_tab" title="é´"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_skin.xml b/indra/newview/skins/default/xui/ja/panel_edit_skin.xml
index cd7efbec68..2c554dad94 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_skin.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_skin.xml
@@ -5,10 +5,12 @@
<texture_picker label="上部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Upper Tattoos" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/>
<texture_picker label="下部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Lower Tattoos" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="skin_color_tab" title="肌ã®è‰²"/>
- <accordion_tab name="skin_face_tab" title="é¡”ã®è©³ç´°"/>
- <accordion_tab name="skin_makeup_tab" title="メイクアップ"/>
- <accordion_tab name="skin_body_tab" title="身体ã®è©³ç´°"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skin_color_tab" title="肌ã®è‰²"/>
+ <accordion_tab name="skin_face_tab" title="é¡”ã®è©³ç´°"/>
+ <accordion_tab name="skin_makeup_tab" title="メイクアップ"/>
+ <accordion_tab name="skin_body_tab" title="身体ã®è©³ç´°"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_skirt.xml b/indra/newview/skins/default/xui/ja/panel_edit_skirt.xml
index 0a0936a3a9..b169bab591 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_skirt.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_skirt.xml
@@ -4,7 +4,9 @@
<texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/>
<color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="skirt_main_tab" title="スカート"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skirt_main_tab" title="スカート"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_socks.xml b/indra/newview/skins/default/xui/ja/panel_edit_socks.xml
index 7cbc75624f..b095257a56 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_socks.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_socks.xml
@@ -4,7 +4,9 @@
<texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
<color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="socks_main_tab" title="é´ä¸‹"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="socks_main_tab" title="é´ä¸‹"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/ja/panel_edit_tattoo.xml
index d6aec87b45..c3f8c12620 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_tattoo.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_tattoo.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="edit_tattoo_panel">
<panel name="avatar_tattoo_color_panel">
- <texture_picker label="頭部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Head Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/>
- <texture_picker label="上部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Upper Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/>
- <texture_picker label="下部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Lower Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž"/>
+ <texture_picker label="頭部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Head Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž" width="70"/>
+ <texture_picker label="上部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Upper Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž" width="70"/>
+ <texture_picker label="下部ã®ã‚¿ãƒˆã‚¥ãƒ¼" name="Lower Tattoo" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠž" width="70"/>
+ <color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_underpants.xml b/indra/newview/skins/default/xui/ja/panel_edit_underpants.xml
index 9287463b2c..fec34479c3 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_underpants.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_underpants.xml
@@ -4,7 +4,9 @@
<texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
<color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="underpants_main_tab" title="下ç€ãƒ‘ンツ"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="underpants_main_tab" title="下ç€ãƒ‘ンツ"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml
index 085ad97384..bd47d89947 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_undershirt.xml
@@ -4,7 +4,9 @@
<texture_picker label="生地" name="Fabric" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
<color_swatch label="色・色彩é…åˆ" name="Color/Tint" tool_tip="クリックã—ã¦ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
</panel>
- <accordion name="wearable_accordion">
- <accordion_tab name="undershirt_main_tab" title="下ç€ã‚·ãƒ£ãƒ„"/>
- </accordion>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="undershirt_main_tab" title="下ç€ã‚·ãƒ£ãƒ„"/>
+ </accordion>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_edit_wearable.xml b/indra/newview/skins/default/xui/ja/panel_edit_wearable.xml
index 2ae8e1863e..d63f047728 100644
--- a/indra/newview/skins/default/xui/ja/panel_edit_wearable.xml
+++ b/indra/newview/skins/default/xui/ja/panel_edit_wearable.xml
@@ -72,7 +72,7 @@
<string name="jacket_desc_text">
ジャケット:
</string>
- <string name="skirt_skirt_desc_text">
+ <string name="skirt_desc_text">
スカート:
</string>
<string name="gloves_desc_text">
@@ -93,6 +93,12 @@
<text name="edit_wearable_title" value="シェイプを編集中"/>
<panel label="シャツ" name="wearable_type_panel">
<text name="description_text" value="シェイプ:"/>
+ <radio_group name="sex_radio">
+ <radio_item label="" name="sex_male" tool_tip="男性" value="1"/>
+ <radio_item label="" name="sex_female" tool_tip="女性" value="0"/>
+ </radio_group>
+ <icon name="male_icon" tool_tip="男性"/>
+ <icon name="female_icon" tool_tip="女性"/>
</panel>
<panel name="button_panel">
<button label="別åã§ä¿å­˜" name="save_as_button"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_friends.xml b/indra/newview/skins/default/xui/ja/panel_friends.xml
index 80a68f8258..0c7114dbb7 100644
--- a/indra/newview/skins/default/xui/ja/panel_friends.xml
+++ b/indra/newview/skins/default/xui/ja/panel_friends.xml
@@ -3,8 +3,8 @@
<string name="Multiple">
複数ã®ãƒ•レンド
</string>
- <scroll_list name="friend_list" tool_tip="複数ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’é¸æŠžã™ã‚‹ã«ã¯ã€Shiftキーã¾ãŸã¯Ctrlキーを押ã—ãªãŒã‚‰åå‰ã‚’クリックã—ã¾ã™ã€‚">
- <column name="icon_online_status" tool_tip="オンライン・ステータス"/>
+ <scroll_list name="friend_list" tool_tip="複数ã®ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’é¸æŠžã™ã‚‹ã«ã¯ã€Shift キーã¾ãŸã¯ Ctrl キーを押ã—ãªãŒã‚‰åå‰ã‚’クリックã—ã¾ã™ã€‚">
+ <column name="icon_online_status" tool_tip="オンライン状態"/>
<column label="åå‰" name="friend_name" tool_tip="åå‰"/>
<column name="icon_visible_online" tool_tip="フレンドã¯ã€ã‚ãªãŸãŒã‚ªãƒ³ãƒ©ã‚¤ãƒ³ã‹ã©ã†ã‹ç¢ºèªã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/>
<column name="icon_visible_map" tool_tip="フレンドã¯ã€åœ°å›³ã§ã‚ãªãŸã®å±…場所を見ã¤ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚"/>
@@ -15,18 +15,18 @@
<text name="friend_name_label" right="-10">
ãƒ•ãƒ¬ãƒ³ãƒ‰ã‚’é¸æŠžã—ã¦æ¨©åˆ©ã‚’変更...
</text>
- <check_box label="オンライン・ステータスã®ç¢ºèªã‚’許å¯ã™ã‚‹" name="online_status_cb" tool_tip="コーリングカードã‚ã‚‹ã„ã¯ãƒ•レンドリストã§ã“ã®ãƒ•レンドãŒã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã‚’ç¢ºèªã§ãるよã†è¨­å®š"/>
- <check_box label="世界地図上ã§ã‚ãªãŸã®å±…場所を検索å¯èƒ½ã«ã™ã‚‹" name="map_status_cb" tool_tip="ã“ã®ãƒ•レンドãŒåœ°å›³ã§ç§ã®ä½ç½®ã‚’発見ã§ãるよã†ã«è¨­å®š"/>
- <check_box label="オブジェクトã®ä¿®æ­£ã‚’許å¯ã™ã‚‹" name="modify_status_cb" tool_tip="ã“ã®ãƒ•レンドãŒã‚ªãƒ–ジェクトを改造ã§ãる許å¯ã‚’与ãˆã‚‹"/>
+ <check_box label="オンライン状態ã®ç¢ºèªã‚’許å¯ã™ã‚‹" name="online_status_cb" tool_tip="コーリングカードã‚ã‚‹ã„ã¯ãƒ•レンドリストã§ã“ã®ãƒ•レンドãŒã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã‚’ç¢ºèªã§ãるよã†è¨­å®šã—ã¾ã™"/>
+ <check_box label="世界地図上ã§ã‚ãªãŸã®å±…場所を検索å¯èƒ½ã«ã™ã‚‹" name="map_status_cb" tool_tip="ã“ã®ãƒ•レンドãŒåœ°å›³ã§ç§ã®ä½ç½®ã‚’発見ã§ãるよã†ã«è¨­å®šã—ã¾ã™"/>
+ <check_box label="オブジェクトã®ä¿®æ­£ã‚’許å¯ã™ã‚‹" name="modify_status_cb" tool_tip="ã“ã®ãƒ•レンドã«ç§ã®ã‚ªãƒ–ジェクトを改造ã™ã‚‹è¨±å¯ã‚’与ãˆã¾ã™"/>
<text name="process_rights_label">
権利変更をプロセス中...
</text>
</panel>
<pad left="-95"/>
- <button label="IM/コール" name="im_btn" tool_tip="インスタントメッセージ・セッションを開ã" width="90"/>
+ <button label="IM・コール" name="im_btn" tool_tip="インスタントメッセージセッションを開ãã¾ã™ã€‚" width="90"/>
<button label="プロフィール" name="profile_btn" tool_tip="写真ã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ãŠã‚ˆã³ãã®ä»–ã®æƒ…報を表示ã—ã¾ã™ã€‚" width="90"/>
- <button label="テレãƒãƒ¼ãƒˆ" name="offer_teleport_btn" tool_tip="ã“ã®ãƒ•レンドã«ã€ã‚ãªãŸã®ç¾åœ¨ã®ãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã¾ã§ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’申ã—出ã¾ã™ã€‚" width="90"/>
- <button label="支払ã†" name="pay_btn" tool_tip="リンデンドル (L$) ã‚’ã“ã®ãƒ•レンドã«ã‚ã’ã‚‹" width="90"/>
+ <button label="テレãƒãƒ¼ãƒˆ" name="offer_teleport_btn" tool_tip="ã“ã®ãƒ•レンドã«ã€ã‚ãªãŸã®ç¾åœ¨åœ°ã¸ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’申ã—出ã¾ã™ã€‚" width="90"/>
+ <button label="支払ã†" name="pay_btn" tool_tip="リンデンドル (L$) ã‚’ã“ã®ãƒ•レンドã«ã‚ã’ã¾ã™ã€‚" width="90"/>
<button label="削除" name="remove_btn" tool_tip="ã“ã®äººç‰©ã‚’フレンドリストã‹ã‚‰å¤–ã—ã¾ã™ã€‚" width="90"/>
- <button label="追加" name="add_btn" tool_tip="フレンド登録を申ã—出る" width="90"/>
+ <button label="追加" name="add_btn" tool_tip="フレンド登録を申ã—出ã¾ã™ã€‚" width="90"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_control_panel.xml b/indra/newview/skins/default/xui/ja/panel_group_control_panel.xml
index 1c89675c1e..f7f575206a 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_control_panel.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_control_panel.xml
@@ -5,7 +5,7 @@
<button label="グループ情報" name="group_info_btn"/>
</layout_panel>
<layout_panel name="call_btn_panel">
- <button label="グループã«ã‚³ãƒ¼ãƒ«" name="call_btn"/>
+ <button label="グループコール" name="call_btn"/>
</layout_panel>
<layout_panel name="end_call_btn_panel">
<button label="コール終了" name="end_call_btn"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_general.xml b/indra/newview/skins/default/xui/ja/panel_group_general.xml
index 538f3800bd..bfe69cbdd9 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_general.xml
@@ -9,29 +9,50 @@
一般的ãªã‚°ãƒ«ãƒ¼ãƒ—情報ãŒå¤‰æ›´ã•れã¾ã—ãŸã€‚
</panel.string>
<panel.string name="incomplete_member_data_str">
- メンãƒãƒ¼ãƒ»ãƒ‡ãƒ¼ã‚¿ã‚’検索
+ メンãƒãƒ¼ã®ãƒ‡ãƒ¼ã‚¿ã‚’検索
</panel.string>
+ <panel name="group_info_top">
+ <texture_picker label="" name="insignia" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
+ <text name="prepend_founded_by">
+ 創設者:
+ </text>
+ <name_box initial_value="(å–得中)" name="founder_name"/>
+ <text name="join_cost_text">
+ ç„¡æ–™
+ </text>
+ <button label="å‚加ã—ã¾ã™ï¼" name="btn_join"/>
+ </panel>
<text_editor name="charter">
グループã®ç†å¿µã€æŒ‡é‡ã‚’記入ã—ã¦ãã ã•ã„
</text_editor>
<name_list name="visible_members">
<name_list.columns label="メンãƒãƒ¼" name="name"/>
<name_list.columns label="タイトル" name="title"/>
+ <name_list.columns label="ログイン" name="status"/>
</name_list>
+ <text name="my_group_settngs_label">
+ 個人ã®è¨­å®š
+ </text>
<text name="active_title_label">
- ç§ã®ã‚¿ã‚¤ãƒˆãƒ«
+ ç§ã®ã‚¿ã‚¤ãƒˆãƒ«ï¼š
</text>
<combo_box name="active_title" tool_tip="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—をアクティブã«ã—ãŸã¨ãã«ã€ã‚¢ãƒã‚¿ãƒ¼åã®ä¸Šã«è¡¨ç¤ºã•れるタイトルを設定ã—ã¾ã™ã€‚"/>
<check_box label="グループ通知をå—ä¿¡" name="receive_notices" tool_tip="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰ã®é€šçŸ¥ã‚’å—ä¿¡ã™ã‚‹ã‹ã©ã†ã‹ã®è¨­å®šã‚’行ã„ã¾ã™ã€‚ グループã‹ã‚‰ã‚¹ãƒ‘ムãŒé€ã‚‰ã‚Œã¦ãã‚‹å ´åˆã¯ã“ã®ãƒœãƒƒã‚¯ã‚¹ã®ãƒã‚§ãƒƒã‚¯ã‚’外ã—ã¦ãã ã•ã„。"/>
<check_box label="プロフィールã«è¡¨ç¤º" name="list_groups_in_profile" tool_tip="ã‚ãªãŸã®ãƒ—ロフィールã«ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—を表示ã™ã‚‹ã‹ã©ã†ã‹ã®è¨­å®šã‚’行ã„ã¾ã™ã€‚"/>
<panel name="preferences_container">
- <check_box label="会員募集" name="open_enrollement" tool_tip="招待ã•れãªãã¦ã‚‚æ–°è¦ãƒ¡ãƒ³ãƒãƒ¼ãŒåŠ å…¥ã§ãã‚‹ã‹ã©ã†ã‹ã‚’設定ã—ã¾ã™ã€‚"/>
- <check_box label="入会費" name="check_enrollment_fee" tool_tip="入会費ãŒå¿…è¦ã‹ã©ã†ã‹ã‚’設定ã—ã¾ã™ã€‚"/>
+ <text name="group_settngs_label">
+ グループã®è¨­å®š
+ </text>
+ <check_box label="誰ã§ã‚‚入会ã§ãã¾ã™" name="open_enrollement" tool_tip="招待ã•れãªãã¦ã‚‚æ–°è¦ãƒ¡ãƒ³ãƒãƒ¼ãŒåŠ å…¥ã§ãã‚‹ã‹ã©ã†ã‹ã‚’設定ã—ã¾ã™ã€‚"/>
+ <check_box label="入会費ãŒã‹ã‹ã‚Šã¾ã™" name="check_enrollment_fee" tool_tip="入会費ãŒå¿…è¦ã‹ã©ã†ã‹ã‚’設定ã—ã¾ã™ã€‚"/>
<spinner label="L$" name="spin_enrollment_fee" tool_tip="「入会費ã€ã«ãƒã‚§ãƒƒã‚¯ãŒå…¥ã£ã¦ã„ã‚‹å ´åˆã€æ–°è¦ãƒ¡ãƒ³ãƒãƒ¼ã¯æŒ‡å®šã•れãŸå…¥ä¼šè²»ã‚’支払ã‚ãªã‘れã°ã‚°ãƒ«ãƒ¼ãƒ—ã«å…¥ã‚Œã¾ã›ã‚“。"/>
- <check_box initial_value="true" label="検索ã«è¡¨ç¤º" name="show_in_group_list" tool_tip="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‚’æ¤œç´¢çµæžœã«è¡¨ç¤ºã•ã›ã¾ã™"/>
- <combo_box name="group_mature_check" tool_tip="ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã€ŒæŽ§ãˆã‚ã€ã«ãƒ¬ãƒ¼ãƒˆè¨­å®šã•ã‚ŒãŸæƒ…å ±ãŒã‚ã‚‹ã‹ã©ã†ã‹ã‚’設定ã—ã¾ã™">
- <combo_box.item label="一般コンテンツ" name="pg"/>
- <combo_box.item label="控ãˆã‚コンテンツ" name="mature"/>
+ <combo_box name="group_mature_check" tool_tip="ã‚ãªãŸã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã€ŒModerateã€ã«ãƒ¬ãƒ¼ãƒˆè¨­å®šã•ã‚ŒãŸæƒ…å ±ãŒã‚ã‚‹ã‹ã©ã†ã‹ã‚’設定ã—ã¾ã™">
+ <combo_item name="select_mature">
+ - レーティングã®é¸æŠž -
+ </combo_item>
+ <combo_box.item label="「Moderateã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„" name="mature"/>
+ <combo_box.item label="「Generalã€ã‚³ãƒ³ãƒ†ãƒ³ãƒ„" name="pg"/>
</combo_box>
+ <check_box initial_value="true" label="検索ã«è¡¨ç¤º" name="show_in_group_list" tool_tip="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‚’æ¤œç´¢çµæžœã«è¡¨ç¤ºã•ã›ã¾ã™"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml
index 0af1ce2ef2..4166108472 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_info_sidetray.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="グループ情報" name="GroupInfo">
<panel.string name="default_needs_apply_text">
- ç¾åœ¨ã®ã‚¿ãƒ–ã«ã¯ã€ä¿å­˜ã•れã¦ã„ãªã„変更ãŒã‚りã¾ã™ã€‚
+ ä¿å­˜ã—ã¦ã„ãªã„変更ãŒã‚りã¾ã™
</panel.string>
<panel.string name="want_apply_text">
変更をä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ
@@ -12,27 +12,24 @@
<panel.string name="group_join_free">
ç„¡æ–™
</panel.string>
- <text name="group_name" value="(ローディング...)"/>
- <line_editor label="æ–°ã—ã„グループã®åå‰ã‚’入力" name="group_name_editor"/>
- <texture_picker label="" name="insignia" tool_tip="クリックã—ã¦å†™çœŸã‚’é¸æŠžã—ã¾ã™"/>
- <text name="prepend_founded_by">
- 創始者:
- </text>
- <name_box initial_value="(å–得中)" name="founder_name"/>
- <text name="join_cost_text">
- ç„¡æ–™
- </text>
- <button label="å‚加ã—ã¾ã™ï¼" name="btn_join"/>
- <accordion name="groups_accordion">
- <accordion_tab name="group_general_tab" title="一般"/>
- <accordion_tab name="group_roles_tab" title="役割"/>
- <accordion_tab name="group_notices_tab" title="通知"/>
- <accordion_tab name="group_land_tab" title="土地・資産"/>
- </accordion>
- <panel name="button_row">
- <button label="作æˆ" label_selected="æ–°ã—ã„グループ" name="btn_create"/>
- <button label="グループãƒãƒ£ãƒƒãƒˆ" name="btn_chat"/>
- <button label="グループコール" name="btn_call"/>
- <button label="ä¿å­˜" label_selected="ä¿å­˜" name="btn_apply"/>
+ <panel name="group_info_top">
+ <text name="group_name" value="(ローディング...)"/>
+ <line_editor label="æ–°ã—ã„グループã®åå‰ã‚’入力ã—ã¦ãã ã•ã„" name="group_name_editor"/>
</panel>
+ <layout_stack name="layout">
+ <layout_panel name="group_accordions">
+ <accordion name="groups_accordion">
+ <accordion_tab name="group_general_tab" title="一般"/>
+ <accordion_tab name="group_roles_tab" title="役割"/>
+ <accordion_tab name="group_notices_tab" title="通知"/>
+ <accordion_tab name="group_land_tab" title="土地・資産"/>
+ </accordion>
+ </layout_panel>
+ <layout_panel name="button_row">
+ <button label="ãƒãƒ£ãƒƒãƒˆ" name="btn_chat"/>
+ <button label="グループコール" name="btn_call" tool_tip="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã‚³ãƒ¼ãƒ«ã™ã‚‹"/>
+ <button label="ä¿å­˜" label_selected="ä¿å­˜" name="btn_apply"/>
+ <button label="グループを作æˆ" name="btn_create" tool_tip="æ–°ã—ã„グループを作æˆ"/>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_invite.xml b/indra/newview/skins/default/xui/ja/panel_group_invite.xml
index dc58359133..a21b340fdd 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_invite.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="メンãƒãƒ¼ã‚’招待" name="invite_panel">
<panel.string name="confirm_invite_owner_str">
- æœ¬å½“ã«æ–°ã—ã„æ‰€æœ‰è€…を招待ã—ã¾ã™ã‹?ã“ã®æ“作ã¯å–り消ã—ã§ãã¾ã›ã‚“。
+ æœ¬å½“ã«æ–°ã—ã„æ‰€æœ‰è€…を招待ã—ã¾ã™ã‹ï¼Ÿã“ã®æ“作ã¯å–り消ã—ã§ãã¾ã›ã‚“。
</panel.string>
<panel.string name="loading">
(ローディング...)
diff --git a/indra/newview/skins/default/xui/ja/panel_group_land_money.xml b/indra/newview/skins/default/xui/ja/panel_group_land_money.xml
index cfbc51a44e..4b3a7f880b 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_land_money.xml
@@ -1,65 +1,65 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="土地ã¨L$" name="land_money_tab">
- <string name="help_text">
+ <panel.string name="help_text">
「土地利用ã®åˆè¨ˆã€ãŒã€Œå¯„付ç·é¡ã€ä»¥ä¸‹ã€ã¾ãŸã¯åŒã˜ã«ãªã‚‹ã¾ã§è­¦å‘ŠãŒè¡¨ç¤ºã•れã¾ã™ã€‚
- </string>
- <button label="?" name="help_button"/>
- <string name="cant_view_group_land_text">
+ </panel.string>
+ <panel.string name="cant_view_group_land_text">
グループ所有地を確èªã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。
- </string>
- <string name="cant_view_group_accounting_text">
+ </panel.string>
+ <panel.string name="epmty_view_group_land_text">
+ ãªã—
+ </panel.string>
+ <panel.string name="cant_view_group_accounting_text">
グループã®ä¼šè¨ˆæƒ…報を確èªã™ã‚‹æ¨©é™ãŒã‚りã¾ã›ã‚“。
- </string>
- <string name="loading_txt">
+ </panel.string>
+ <panel.string name="loading_txt">
ロード中...
- </string>
- <text name="group_land_heading">
- グループã®ä¿æœ‰åœ°
- </text>
- <scroll_list name="group_parcel_list">
- <column label="区画" name="name"/>
- <column label="地域(リージョン)" name="location"/>
- <column label="種類" name="type"/>
- <column label="é¢ç©" name="area"/>
- <column label="" name="hidden"/>
- </scroll_list>
- <button label="地図" label_selected="地図" name="map_button"/>
- <text name="total_contributed_land_label">
- 寄付åˆè¨ˆï¼š
- </text>
- <text name="total_contributed_land_value" width="150">
- [AREA] 平方メートル
- </text>
- <text name="total_land_in_use_label">
- 土地利用ã®åˆè¨ˆï¼š
- </text>
- <text name="total_land_in_use_value" width="150">
- [AREA] 平方メートル
- </text>
- <text name="land_available_label">
- 利用å¯èƒ½ã®åœŸåœ°ï¼š
- </text>
- <text name="land_available_value" width="150">
- [AREA] 平方メートル
- </text>
- <text name="your_contribution_label">
- ã‚ãªãŸã®è²¢çŒ®ï¼š
- </text>
- <string name="land_contrib_error">
+ </panel.string>
+ <panel.string name="land_contrib_error">
土地ã®è²¢çŒ®ã‚’設定ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“
- </string>
- <text name="your_contribution_units">
- 平方メートル
- </text>
- <text name="your_contribution_max_value">
- (最大 [AMOUNT])
- </text>
- <text name="group_over_limit_text">
- 土地を使用ã™ã‚‹ã«ã¯ã€åœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆãŒã‚‚ã£ã¨å¿…è¦ã§ã™
- </text>
- <text name="group_money_heading">
- グループL$
- </text>
+ </panel.string>
+ <panel name="layout_panel_landmoney">
+ <scroll_list name="group_parcel_list">
+ <scroll_list.columns label="区画" name="name"/>
+ <scroll_list.columns label="地域" name="location"/>
+ <scroll_list.columns label="種類" name="type"/>
+ <scroll_list.columns label="é¢ç©" name="area"/>
+ </scroll_list>
+ <text name="total_contributed_land_label">
+ 寄付åˆè¨ˆï¼š
+ </text>
+ <text name="total_contributed_land_value">
+ [AREA] 平方メートル
+ </text>
+ <button label="地図" label_selected="地図" name="map_button"/>
+ <text name="total_land_in_use_label">
+ 土地利用ã®åˆè¨ˆï¼š
+ </text>
+ <text name="total_land_in_use_value">
+ [AREA] 平方メートル
+ </text>
+ <text name="land_available_label">
+ 利用å¯èƒ½ã®åœŸåœ°ï¼š
+ </text>
+ <text name="land_available_value">
+ [AREA] 平方メートル
+ </text>
+ <text name="your_contribution_label">
+ ã‚ãªãŸã®è²¢çŒ®ï¼š
+ </text>
+ <text name="your_contribution_units">
+ m²
+ </text>
+ <text name="your_contribution_max_value">
+ (最大 [AMOUNT])
+ </text>
+ <text name="group_over_limit_text">
+ 土地利用をサãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã®åœŸåœ°ã‚¯ãƒ¬ã‚¸ãƒƒãƒˆãŒè¶³ã‚Šã¾ã›ã‚“
+ </text>
+ <text name="group_money_heading">
+ グループ㮠L$
+ </text>
+ </panel>
<tab_container name="group_money_tab_container">
<panel label="計画" name="group_money_planning_tab">
<text_editor name="group_money_planning_text">
diff --git a/indra/newview/skins/default/xui/ja/panel_group_notices.xml b/indra/newview/skins/default/xui/ja/panel_group_notices.xml
index c5168c4d7c..0b508bd79d 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_notices.xml
@@ -15,23 +15,23 @@
<scroll_list name="notice_list">
<scroll_list.columns label="" name="icon"/>
<scroll_list.columns label="ä»¶å" name="subject"/>
- <scroll_list.columns label="é€ã‚Šä¸»" name="from"/>
+ <scroll_list.columns label="é€ä¿¡è€…" name="from"/>
<scroll_list.columns label="日付" name="date"/>
</scroll_list>
<text name="notice_list_none_found">
見ã¤ã‹ã‚Šã¾ã›ã‚“ã§ã—ãŸ
</text>
- <button label="æ–°ã—ã„通知を作æˆ" label_selected="æ–°ã—ã„通知を作æˆ" name="create_new_notice" tool_tip="æ–°ã—ã„通知を作æˆ"/>
- <button label="更新" label_selected="リスト更新" name="refresh_notices" tool_tip="通知リストを更新"/>
+ <button label="æ–°ã—ã„通知を作æˆ" label_selected="æ–°ã—ã„通知を作æˆ" name="create_new_notice" tool_tip="æ–°ã—ã„通知を作æˆã—ã¾ã™"/>
+ <button label="æ›´æ–°" label_selected="リスト更新" name="refresh_notices" tool_tip="通知リストを更新ã—ã¾ã™"/>
<panel label="æ–°ã—ã„通知を作æˆ" name="panel_create_new_notice">
<text name="lbl">
- 通知を作æˆ
+ 通知ã®ä½œæˆ
</text>
<text name="lbl3">
ä»¶å:
</text>
<text name="lbl4">
- メッセージ:
+ 内容:
</text>
<text name="lbl5">
添付:
@@ -39,7 +39,8 @@
<text name="string">
ã“ã“ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’ドラッグ&ドロップã—ã¦æ·»ä»˜ã—ã¦ãã ã•ã„:
</text>
- <button label="å–り外ã™" label_selected="添付物を削除" name="remove_attachment"/>
+ <button label="æŒã¡ç‰©" name="open_inventory" tool_tip="æŒã¡ç‰©ã‚’é–‹ãã¾ã™"/>
+ <button label="å–り外ã™" label_selected="添付物を削除" name="remove_attachment" tool_tip="ã‚ãªãŸã®é€šçŸ¥ã‹ã‚‰æ·»ä»˜ã•れãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’削除ã—ã¾ã™"/>
<button label="é€ä¿¡" label_selected="é€ä¿¡" name="send_notice"/>
<group_drop_target name="drop_target" tool_tip="æŒã¡ç‰©ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’ã“ã®ãƒœãƒƒã‚¯ã‚¹ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€é€šçŸ¥ã¨ä¸€ç·’ã«é€ã‚Šã¾ã™ã€‚ 添付ã™ã‚‹ã«ã¯ã€ãã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã‚³ãƒ”ーã¨å†è²©ãƒ»ãƒ—ãƒ¬ã‚¼ãƒ³ãƒˆã®æ¨©é™ãŒã‚ãªãŸã«ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚"/>
</panel>
@@ -54,7 +55,7 @@
ä»¶å:
</text>
<text name="lbl4">
- メッセージ:
+ 内容:
</text>
<button label="添付アイテムを開ã" label_selected="添付物を開ã" name="open_attachment"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_group_roles.xml b/indra/newview/skins/default/xui/ja/panel_group_roles.xml
index 1f2d28ca4f..8a629be910 100644
--- a/indra/newview/skins/default/xui/ja/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/ja/panel_group_roles.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="メンãƒãƒ¼ã¨å½¹å‰²" name="roles_tab">
<panel.string name="default_needs_apply_text">
- ç¾åœ¨ã®ã‚¿ãƒ–ã«ã¯ã€ä¿å­˜ã•れã¦ã„ãªã„変更ãŒã‚りã¾ã™ã€‚
+ ä¿å­˜ã—ã¦ã„ãªã„変更ãŒã‚りã¾ã™
</panel.string>
<panel.string name="want_apply_text">
変更をä¿å­˜ã—ã¾ã™ã‹ï¼Ÿ
@@ -17,7 +17,7 @@ Ctrl キーを押ã—ãªãŒã‚‰ãƒ¡ãƒ³ãƒãƒ¼åをクリックã™ã‚‹ã¨
<name_list name="member_list">
<name_list.columns label="メンãƒãƒ¼" name="name"/>
<name_list.columns label="寄付" name="donated"/>
- <name_list.columns label="ステータス" name="online"/>
+ <name_list.columns label="ログイン" name="online"/>
</name_list>
<button label="招待" name="member_invite"/>
<button label="追放" name="member_eject"/>
@@ -44,7 +44,7 @@ Ctrl キーを押ã—ãªãŒã‚‰ãƒ¡ãƒ³ãƒãƒ¼åをクリックã™ã‚‹ã¨
<filter_editor label="役割をé¸åˆ¥" name="filter_input"/>
<scroll_list name="role_list">
<scroll_list.columns label="役割" name="name"/>
- <scroll_list.columns label="肩書ã" name="title"/>
+ <scroll_list.columns label="タイトル" name="title"/>
<scroll_list.columns label="#" name="members"/>
</scroll_list>
<button label="æ–°ã—ã„役割" name="role_create"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_groups.xml b/indra/newview/skins/default/xui/ja/panel_groups.xml
index 785fd868ab..de81a6431a 100644
--- a/indra/newview/skins/default/xui/ja/panel_groups.xml
+++ b/indra/newview/skins/default/xui/ja/panel_groups.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel name="groups">
<text name="groupdesc">
- アクティブãªï½¸ï¾žï¾™ï½°ï¾Œï¾Ÿåã¯å¤ªå­—ã§è¡¨ç¤ºã•れã¦ã„ã¾ã™
+ アクティブãªã‚°ãƒ«ãƒ¼ãƒ—ã¯å¤ªå­—ã§è¡¨ç¤ºã•れã¦ã„ã¾ã™
</text>
- <text name="groupcount">
- ã‚ãªãŸã¯[COUNT] ï½¸ï¾žï¾™ï½°ï¾Œï¾Ÿã«æ‰€å±žã—ã¦ã„ã¾ã™ (最大[MAX])
+ <text name="groupcount" width="270">
+ [COUNT] ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«æ‰€å±žã—ã¦ã„ã¾ã™ (最大[MAX])
</text>
- <button label="IM/コール" name="IM"
+ <button label="IM・コール" name="IM"
tool_tip="インスタントメッセージ・セッションを開ã" />
<button label="情報" name="Info" />
<button label="アクティブ" name="Activate" />
diff --git a/indra/newview/skins/default/xui/ja/panel_im_control_panel.xml b/indra/newview/skins/default/xui/ja/panel_im_control_panel.xml
index bfadcb13d3..f2429ac12a 100644
--- a/indra/newview/skins/default/xui/ja/panel_im_control_panel.xml
+++ b/indra/newview/skins/default/xui/ja/panel_im_control_panel.xml
@@ -9,11 +9,14 @@
<button label="フレンド登録" name="add_friend_btn"/>
</layout_panel>
<layout_panel name="teleport_btn_panel">
- <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn"/>
+ <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="ã“ã®äººã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™"/>
</layout_panel>
<layout_panel name="share_btn_panel">
<button label="共有" name="share_btn"/>
</layout_panel>
+ <layout_panel name="pay_btn_panel">
+ <button label="支払ã†" name="pay_btn"/>
+ </layout_panel>
<layout_panel name="call_btn_panel">
<button label="コール" name="call_btn"/>
</layout_panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_inventory_item.xml b/indra/newview/skins/default/xui/ja/panel_inventory_item.xml
new file mode 100644
index 0000000000..d18047fbcf
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_inventory_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="inventory_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_landmark_info.xml b/indra/newview/skins/default/xui/ja/panel_landmark_info.xml
index 9129c66a45..7fca66f90f 100644
--- a/indra/newview/skins/default/xui/ja/panel_landmark_info.xml
+++ b/indra/newview/skins/default/xui/ja/panel_landmark_info.xml
@@ -18,9 +18,6 @@
<string name="acquired_date">
[year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
</string>
- <string name="icon_PG" value="parcel_drk_PG"/>
- <string name="icon_M" value="parcel_drk_M"/>
- <string name="icon_R" value="parcel_drk_R"/>
<button name="back_btn" tool_tip="戻る"/>
<text name="title" value="場所ã®ãƒ—ロフィール"/>
<scroll_container name="place_scroll">
@@ -36,7 +33,7 @@
</panel>
<panel name="landmark_edit_panel">
<text name="title_label" value="タイトル:"/>
- <text name="notes_label" value="個人的メモ:"/>
+ <text name="notes_label" value="メモ:"/>
<text name="folder_label" value="ランドマークã®ä½ç½®ï¼š"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_landmarks.xml b/indra/newview/skins/default/xui/ja/panel_landmarks.xml
index 45767e8c50..993c52b561 100644
--- a/indra/newview/skins/default/xui/ja/panel_landmarks.xml
+++ b/indra/newview/skins/default/xui/ja/panel_landmarks.xml
@@ -2,13 +2,13 @@
<panel name="Landmarks">
<accordion name="landmarks_accordion">
<accordion_tab name="tab_favorites" title="ãŠæ°—ã«å…¥ã‚Šãƒãƒ¼"/>
- <accordion_tab name="tab_landmarks" title="ランドマーク"/>
+ <accordion_tab name="tab_landmarks" title="マイ ランドマーク"/>
<accordion_tab name="tab_inventory" title="æŒã¡ç‰©"/>
<accordion_tab name="tab_library" title="ライブラリ"/>
</accordion>
<panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="ãã®ä»–ã®ã‚ªãƒ—ションを表示"/>
- <button name="add_btn" tool_tip="æ–°ã—ã„ランドマークを追加"/>
- <dnd_button name="trash_btn" tool_tip="é¸æŠžã—ãŸãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’削除"/>
+ <button name="options_gear_btn" tool_tip="ãã®ä»–ã®ã‚ªãƒ—ションを表示ã—ã¾ã™"/>
+ <button name="add_btn" tool_tip="æ–°ã—ã„ランドマークを追加ã—ã¾ã™"/>
+ <dnd_button name="trash_btn" tool_tip="é¸æŠžã—ãŸãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’削除ã—ã¾ã™"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_login.xml b/indra/newview/skins/default/xui/ja/panel_login.xml
index 82c52abf38..47d7a88b4c 100644
--- a/indra/newview/skins/default/xui/ja/panel_login.xml
+++ b/indra/newview/skins/default/xui/ja/panel_login.xml
@@ -8,27 +8,23 @@
</panel.string>
<layout_stack name="login_widgets">
<layout_panel name="login">
- <text name="first_name_text">
- ファーストãƒãƒ¼ãƒ ï¼š
+ <text name="username_text">
+ ユーザーãƒãƒ¼ãƒ ï¼š
</text>
- <line_editor label="最åˆ" name="first_name_edit" tool_tip="[SECOND_LIFE] ファーストãƒãƒ¼ãƒ "/>
- <text name="last_name_text">
- ラストãƒãƒ¼ãƒ ï¼š
- </text>
- <line_editor label="最後" name="last_name_edit" tool_tip="[SECOND_LIFE] ラストãƒãƒ¼ãƒ "/>
+ <line_editor label="ユーザーãƒãƒ¼ãƒ " name="username_edit" tool_tip="[SECOND_LIFE] ユーザーãƒãƒ¼ãƒ "/>
<text name="password_text">
パスワード:
</text>
- <check_box label="記憶ã™ã‚‹" name="remember_check"/>
+ <check_box label="パスワードを記憶" name="remember_check"/>
+ <button label="ログイン" left_pad="30" name="connect_btn" width="60"/>
<text name="start_location_text">
開始地点:
</text>
- <combo_box name="start_location_combo">
+ <combo_box name="start_location_combo" width="160">
<combo_box.item label="最後ã«ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã—ãŸå ´æ‰€" name="MyLastLocation"/>
<combo_box.item label="ホーム" name="MyHome"/>
<combo_box.item label="<地域åを入力>" name="Typeregionname"/>
</combo_box>
- <button label="ログイン" name="connect_btn"/>
</layout_panel>
<layout_panel name="links">
<text name="create_new_account_text">
diff --git a/indra/newview/skins/default/xui/ja/panel_main_inventory.xml b/indra/newview/skins/default/xui/ja/panel_main_inventory.xml
index d533ce5e0d..ff968696b7 100644
--- a/indra/newview/skins/default/xui/ja/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/panel_main_inventory.xml
@@ -1,64 +1,28 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="ã‚‚ã®" name="main inventory panel">
- <panel.string name="Title">
- ã‚‚ã®
+ <panel.string name="ItemcountFetching">
+ [ITEM_COUNT] 個ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’å–得中ã§ã™... [FILTER]
</panel.string>
+ <panel.string name="ItemcountCompleted">
+ [ITEM_COUNT] 個ã®ã‚¢ã‚¤ãƒ†ãƒ ã€€[FILTER]
+ </panel.string>
+ <text name="ItemcountText">
+ アイテム:
+ </text>
<filter_editor label="æŒã¡ç‰©ã‚’フィルター" name="inventory search editor"/>
<tab_container name="inventory filter tabs">
<inventory_panel label="æŒã¡ç‰©" name="All Items"/>
- <inventory_panel label="最新" name="Recent Items"/>
+ <recent_inventory_panel label="最新" name="Recent Items"/>
</tab_container>
- <panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="ãã®ä»–ã®ã‚ªãƒ—ションを表示"/>
- <button name="add_btn" tool_tip="æ–°ã—ã„アイテムã®è¿½åŠ "/>
- <dnd_button name="trash_btn" tool_tip="é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’削除"/>
- </panel>
- <menu_bar name="Inventory Menu">
- <menu label="ファイル" name="File">
- <menu_item_call label="é–‹ã" name="Open"/>
- <menu label="アップロード" name="upload">
- <menu_item_call label="ç”»åƒ ï¼ˆL$ [COST] )..." name="Upload Image"/>
- <menu_item_call label="サウンド (L$[COST] )..." name="Upload Sound"/>
- <menu_item_call label="アニメーション (L$ [COST] )..." name="Upload Animation"/>
- <menu_item_call label="一括 (ファイルã«ã¤ã L$[COST] )..." name="Bulk Upload"/>
- </menu>
- <menu_item_call label="æ–°ã—ã„ウィンドウ" name="New Window"/>
- <menu_item_call label="フィルターを表示" name="Show Filters"/>
- <menu_item_call label="フィルターをリセット" name="Reset Current"/>
- <menu_item_call label="ã™ã¹ã¦ã®ãƒ•ォルダを閉ã˜ã‚‹" name="Close All Folders"/>
- <menu_item_call label="ã”ã¿ç®±ã‚’空ã«ã™ã‚‹" name="Empty Trash"/>
- <menu_item_call label="紛失物を空ã«ã™ã‚‹" name="Empty Lost And Found"/>
- </menu>
- <menu label="æ–°è¦ä½œæˆ" name="Create">
- <menu_item_call label="フォルダ" name="New Folder"/>
- <menu_item_call label="スクリプト" name="New Script"/>
- <menu_item_call label="æ–°ã—ã„ノートカード" name="New Note"/>
- <menu_item_call label="ジェスãƒãƒ£ãƒ¼" name="New Gesture"/>
- <menu label="衣類" name="New Clothes">
- <menu_item_call label="シャツ" name="New Shirt"/>
- <menu_item_call label="パンツ" name="New Pants"/>
- <menu_item_call label="é´" name="New Shoes"/>
- <menu_item_call label="é´ä¸‹" name="New Socks"/>
- <menu_item_call label="ジャケット" name="New Jacket"/>
- <menu_item_call label="シャツ" name="New Skirt"/>
- <menu_item_call label="手袋" name="New Gloves"/>
- <menu_item_call label="下ç€ï¼ˆä¸Šï¼‰" name="New Undershirt"/>
- <menu_item_call label="下ç€ï¼ˆä¸‹ï¼‰" name="New Underpants"/>
- <menu_item_call label="アルファ" name="New Alpha"/>
- <menu_item_call label="タトゥ" name="New Tattoo"/>
- </menu>
- <menu label="身体部ä½" name="New Body Parts">
- <menu_item_call label="シェイプ(体型)" name="New Shape"/>
- <menu_item_call label="スキン" name="New Skin"/>
- <menu_item_call label="髪" name="New Hair"/>
- <menu_item_call label="ç›®" name="New Eyes"/>
- </menu>
- </menu>
- <menu label="ä¸¦ã¹æ›¿ãˆ" name="Sort">
- <menu_item_check label="åå‰é †" name="By Name"/>
- <menu_item_check label="日付順" name="By Date"/>
- <menu_item_check label="フォルダを常ã«åå‰é †ã«ä¸¦ã¹ã‚‹" name="Folders Always By Name"/>
- <menu_item_check label="システムフォルダを上ã«ä¸¦ã¹ã‚‹" name="System Folders To Top"/>
- </menu>
- </menu_bar>
+ <layout_stack name="bottom_panel">
+ <layout_panel name="options_gear_btn_panel">
+ <button name="options_gear_btn" tool_tip="オプションを表示ã—ã¾ã™"/>
+ </layout_panel>
+ <layout_panel name="add_btn_panel">
+ <button name="add_btn" tool_tip="æ–°ã—ã„アイテムを追加ã—ã¾ã™"/>
+ </layout_panel>
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="trash_btn" tool_tip="é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’削除ã—ã¾ã™"/>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_me.xml b/indra/newview/skins/default/xui/ja/panel_me.xml
index fe51d8507d..dda5bc0009 100644
--- a/indra/newview/skins/default/xui/ja/panel_me.xml
+++ b/indra/newview/skins/default/xui/ja/panel_me.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="マイ プロフィール" name="panel_me">
<tab_container name="tabs">
- <panel label="プロフィール" name="panel_profile"/>
- <panel label="ピック" name="panel_picks"/>
+ <panel label="マイ プロフィール" name="panel_profile"/>
+ <panel label="マイ ピック" name="panel_picks"/>
</tab_container>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml b/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml
index 74e414c381..6321dbb048 100644
--- a/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml
+++ b/indra/newview/skins/default/xui/ja/panel_media_settings_general.xml
@@ -15,14 +15,14 @@
</text>
<text name="current_url" tool_tip="メディアソースã®ç¾åœ¨ã®ãƒšãƒ¼ã‚¸" value=""/>
<button label="リセット" name="current_url_reset_btn"/>
- <check_box initial_value="false" label="自動ループ" name="auto_loop"/>
- <check_box initial_value="false" label="最åˆã®ã‚¯ãƒªãƒƒã‚¯" name="first_click_interact"/>
+ <check_box initial_value="false" label="ループå†ç”Ÿ" name="auto_loop"/>
+ <check_box initial_value="false" label="最åˆã«ã‚¯ãƒªãƒƒã‚¯ã—ãŸã¨ãã®å‹•作" name="first_click_interact"/>
<check_box initial_value="false" label="自動ズーム" name="auto_zoom"/>
<check_box initial_value="false" label="自動メディアå†ç”Ÿ" name="auto_play"/>
<text name="media_setting_note">
- 注: ä½äººã¯ã“ã®è¨­å®šã‚’無視ã§ãã¾ã™
+ 注æ„: ä½äººã¯ã“ã®è¨­å®šã‚’無視ã§ãã¾ã™
</text>
- <check_box initial_value="false" label="オブジェクトã®è¡¨é¢ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã®è‡ªå‹•スケール" name="auto_scale"/>
+ <check_box initial_value="false" label="オブジェクトã®è¡¨é¢ã‚µã‚¤ã‚ºã«åˆã‚ã›ã¦è‡ªå‹•調整" name="auto_scale"/>
<text name="size_label">
サイズ:
</text>
diff --git a/indra/newview/skins/default/xui/ja/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/ja/panel_media_settings_permissions.xml
index 223bd3e28c..11d9ed4c16 100644
--- a/indra/newview/skins/default/xui/ja/panel_media_settings_permissions.xml
+++ b/indra/newview/skins/default/xui/ja/panel_media_settings_permissions.xml
@@ -11,10 +11,19 @@
ミニ
</combo_item>
</combo_box>
+ <text name="owner_label">
+ 所有者
+ </text>
<check_box initial_value="false" label="ナビゲーションã¨ç›¸äº’作用力を有効ã«ã™ã‚‹" name="perms_owner_interact"/>
<check_box initial_value="false" label="コントロールãƒãƒ¼ã‚’表示ã™ã‚‹" name="perms_owner_control"/>
+ <text name="group_label">
+ グループ:
+ </text>
<check_box initial_value="false" label="ナビゲーションã¨ç›¸äº’作用力を有効ã«ã™ã‚‹" name="perms_group_interact"/>
<check_box initial_value="false" label="コントロールãƒãƒ¼ã‚’表示ã™ã‚‹" name="perms_group_control"/>
+ <text name="anyone_label">
+ 全員
+ </text>
<check_box initial_value="false" label="ナビゲーションã¨ç›¸äº’作用力を有効ã«ã™ã‚‹" name="perms_anyone_interact"/>
<check_box initial_value="false" label="コントロールãƒãƒ¼ã‚’表示ã™ã‚‹" name="perms_anyone_control"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_media_settings_security.xml b/indra/newview/skins/default/xui/ja/panel_media_settings_security.xml
index 7822123a30..ea4fdb9ce5 100644
--- a/indra/newview/skins/default/xui/ja/panel_media_settings_security.xml
+++ b/indra/newview/skins/default/xui/ja/panel_media_settings_security.xml
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="セキュリティ" name="Media Settings Security">
- <check_box initial_value="false" label="指定ã—ãŸURLパターンã«ã®ã¿ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã™ã‚‹" name="whitelist_enable"/>
+ <check_box initial_value="false" label="指定ã—㟠URL パターンã‹ã‚‰å§‹ã¾ã‚‹æŽ¥ç¶šã‚’許å¯ã™ã‚‹" name="whitelist_enable"/>
<text name="home_url_fails_some_items_in_whitelist">
- ホームページã«å¤±æ•—ã—ãŸã‚¨ãƒ³ãƒˆãƒªãƒ¼ãŒãƒžãƒ¼ã‚¯ã•れã¾ã—ãŸï¼š
+ ホームページã«å¤±æ•—ã—ãŸã‚¨ãƒ³ãƒˆãƒªãƒ¼ãŒã‚りã¾ã—ãŸï¼š
</text>
<button label="追加" name="whitelist_add"/>
<button label="削除" name="whitelist_del"/>
<text name="home_url_fails_whitelist">
- 警告: 「一般ã€ã‚¿ãƒ–ã§æŒ‡å®šã•れãŸãƒ›ãƒ¼ãƒ ãƒšãƒ¼ã‚¸ã¯ã€ã“ã®ãƒ›ãƒ¯ã‚¤ãƒˆãƒªã‚¹ãƒˆã‚’パスã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ 有効ãªã‚¨ãƒ³ãƒˆãƒªãƒ¼ãŒè¿½åŠ ã•れるã¾ã§ã¯ã€ç„¡åйã«ãªã‚Šã¾ã™ã€‚
+ 警告: 「一般ã€ã‚¿ãƒ–ã§æŒ‡å®šã•れãŸãƒ›ãƒ¼ãƒ ãƒšãƒ¼ã‚¸ã¯ã€ãƒ›ãƒ¯ã‚¤ãƒˆãƒªã‚¹ãƒˆã«æŽ²è¼‰ã•れã¦ã„ã¾ã›ã‚“。 æ­£ã—ã„æ©Ÿèƒ½ãŒè¨­å®šã•れるã¾ã§ã€ã“ã®æ©Ÿèƒ½ã¯ä¸€æ™‚åœæ­¢ã—ã¾ã™ã€‚
</text>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_my_profile.xml b/indra/newview/skins/default/xui/ja/panel_my_profile.xml
index 4cce3798cf..17461ef771 100644
--- a/indra/newview/skins/default/xui/ja/panel_my_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_my_profile.xml
@@ -28,13 +28,16 @@
<icon label="" name="real_world_edit_icon" tool_tip="下ã®ã€Œãƒ—ロフィールã®ç·¨é›†ã€ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ç”»åƒã‚’変更ã—ã¾ã™"/>
<text name="title_rw_descr_text" value="ç¾å®Ÿä¸–界:"/>
</panel>
- <text name="title_member_text" value="ä½äººã¨ãªã£ãŸæ—¥ï¼š"/>
+ <text name="title_member_text" value="メンãƒãƒ¼ç™»éŒ²ï¼š"/>
<text name="title_acc_status_text" value="アカウントã®çŠ¶æ…‹ï¼š"/>
- <text name="acc_status_text">
+ <text_editor name="acc_status_text">
ä½äººã€‚ 支払情報未登録。
リンデン。
- </text>
+ </text_editor>
<text name="title_partner_text" value="パートナー:"/>
+ <panel name="partner_data_panel">
+ <name_box initial_value="(å–得中)" name="partner_text"/>
+ </panel>
<text name="title_groups_text" value="グループ:"/>
</panel>
</scroll_container>
diff --git a/indra/newview/skins/default/xui/ja/panel_navigation_bar.xml b/indra/newview/skins/default/xui/ja/panel_navigation_bar.xml
index a154442095..0426c4fe9a 100644
--- a/indra/newview/skins/default/xui/ja/panel_navigation_bar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_navigation_bar.xml
@@ -1,15 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="navigation_bar">
<panel name="navigation_panel">
- <button name="back_btn" tool_tip="å‰ã®å ´æ‰€"/>
- <button name="forward_btn" tool_tip="次ã®å ´æ‰€"/>
+ <pull_button name="back_btn" tool_tip="å‰ã®å ´æ‰€ã¸æˆ»ã‚Šã¾ã™"/>
+ <pull_button name="forward_btn" tool_tip="次ã®å ´æ‰€ã¸é€²ã¿ã¾ã™"/>
<button name="home_btn" tool_tip="「ホームã€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ"/>
<location_input label="場所" name="location_combo"/>
<search_combo_box label="検索" name="search_combo_box" tool_tip="検索">
<combo_editor label="[SECOND_LIFE] を検索:" name="search_combo_editor"/>
</search_combo_box>
</panel>
- <favorites_bar name="favorite">
+ <favorites_bar name="favorite" tool_tip="ランドマークをã“ã“ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€Second Lifeã®ãŠæ°—ã«å…¥ã‚Šã®å ´æ‰€ã«ç´ æ—©ãアクセスï¼">
+ <label name="favorites_bar_label" tool_tip="ランドマークをã“ã“ã«ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ã€Second Lifeã®ãŠæ°—ã«å…¥ã‚Šã®å ´æ‰€ã«ç´ æ—©ãアクセスï¼">
+ ãŠæ°—ã«å…¥ã‚Šãƒãƒ¼
+ </label>
<chevron_button name="&gt;&gt;" tool_tip="ãŠæ°—ã«å…¥ã‚Šã‚’ã‚‚ã£ã¨è¡¨ç¤º"/>
</favorites_bar>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml
index 3dbabc62be..5998206f27 100644
--- a/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_nearby_chat_bar.xml
@@ -1,11 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="chat_bar">
- <string name="min_width">
- 192
- </string>
- <string name="max_width">
- 320
- </string>
<line_editor label="ã“ã“をクリックã—ã¦ãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹ã—ã¾ã™ã€‚" name="chat_box" tool_tip="Enter キーを押ã—ã¦ç™ºè¨€ã—ã€Ctrl + Enter キーã§å«ã³ã¾ã™ã€‚"/>
<button name="show_nearby_chat" tool_tip="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆãƒ­ã‚°ã‚’表示・éžè¡¨ç¤º"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_nearby_media.xml b/indra/newview/skins/default/xui/ja/panel_nearby_media.xml
new file mode 100644
index 0000000000..d0e423bd18
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_nearby_media.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_media">
+ <string name="media_item_count_format">
+ (メディアアイテム %ld )
+ </string>
+ <string name="empty_item_text">
+ &lt;空&gt;
+ </string>
+ <string name="parcel_media_name">
+ 区画ストリーミングメディア
+ </string>
+ <string name="parcel_audio_name">
+ 区画ストリーミングオーディオ
+ </string>
+ <string name="playing_suffix">
+ (å†ç”Ÿä¸­ï¼‰
+ </string>
+ <panel name="minimized_controls">
+ <button label="ã™ã¹ã¦åœæ­¢" name="all_nearby_media_disable_btn" tool_tip="è¿‘ãã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’ã™ã¹ã¦ã‚ªãƒ•ã«ã—ã¾ã™"/>
+ <button label="ã™ã¹ã¦é–‹å§‹" name="all_nearby_media_enable_btn" tool_tip="è¿‘ãã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’ã™ã¹ã¦ã‚ªãƒ³ã«ã—ã¾ã™"/>
+ <button name="open_prefs_btn" tool_tip="メディアã®è¨­å®šã‚’é–‹ãã¾ã™"/>
+ <button label="詳細 &gt;&gt;" label_selected="簡易 &lt;&lt;" name="more_btn" tool_tip="アドãƒãƒ³ã‚¹ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«"/>
+ <button label="詳細 &gt;&gt;" label_selected="簡易 &lt;&lt;" name="less_btn" tool_tip="アドãƒãƒ³ã‚¹ã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«"/>
+ </panel>
+ <panel name="nearby_media_panel">
+ <combo_box name="show_combo">
+ <combo_box.item label="ã™ã¹ã¦" name="All"/>
+ <combo_box.item label="ã“ã®åŒºç”»å†…" name="WithinParcel"/>
+ <combo_box.item label="ã“ã®åŒºç”»å¤–" name="OutsideParcel"/>
+ <combo_box.item label="ä»–ã®ã‚¢ãƒã‚¿ãƒ¼" name="OnOthers"/>
+ </combo_box>
+ <scroll_list name="media_list">
+ <scroll_list.columns label="近接" name="media_proximity"/>
+ <scroll_list.columns label="表示" name="media_visibility"/>
+ <scroll_list.columns label="クラス" name="media_class"/>
+ <scroll_list.columns label="åå‰" name="media_name"/>
+ <scroll_list.columns label="デãƒãƒƒã‚°" name="media_debug"/>
+ </scroll_list>
+ <panel>
+ <layout_stack name="media_controls">
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã‚’åœæ­¢"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã‚’å†ç”Ÿ"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã‚’ä¸€æ™‚åœæ­¢"/>
+ </layout_panel>
+ <layout_panel name="volume_slider_ctrl">
+ <slider_bar initial_value="0.5" name="volume_slider" tool_tip="é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã®éŸ³é‡"/>
+ </layout_panel>
+ <layout_panel name="mute">
+ <button name="mute_btn" tool_tip="é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã®éŸ³ã‚’ミュート"/>
+ </layout_panel>
+ <layout_panel name="zoom">
+ <button name="zoom_btn" tool_tip="é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã«ã‚ºãƒ¼ãƒ "/>
+ </layout_panel>
+ <layout_panel name="unzoom">
+ <button name="unzoom_btn" tool_tip="é¸æŠžã—ãŸãƒ¡ãƒ‡ã‚£ã‚¢ã‹ã‚‰é ã–ã‹ã‚‹"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_notes.xml b/indra/newview/skins/default/xui/ja/panel_notes.xml
index 1948c54359..cbeb5a7f97 100644
--- a/indra/newview/skins/default/xui/ja/panel_notes.xml
+++ b/indra/newview/skins/default/xui/ja/panel_notes.xml
@@ -6,7 +6,7 @@
<panel name="profile_scroll_panel">
<text name="status_message" value="個人的メモ:"/>
<text name="status_message2" value="ã“ã®äººã«è¨±å¯ï¼š"/>
- <check_box label="オンライン状æ³ã®ç¢ºèª" name="status_check"/>
+ <check_box label="オンライン状態ã®ç¢ºèª" name="status_check"/>
<check_box label="地図ã§å±…場所を確èª" name="map_check"/>
<check_box label="ç§ã®ã‚ªãƒ–ジェクトã®ç·¨é›†ãƒ»å‰Šé™¤ãƒ»å–å¾—" name="objects_check"/>
</panel>
@@ -15,9 +15,9 @@
<layout_panel name="notes_buttons_panel">
<button label="フレンド登録" name="add_friend" tool_tip="フレンド登録を申ã—出ã¾ã™"/>
<button label="IM" name="im" tool_tip="インスタントメッセージを開ãã¾ã™"/>
- <button label="コール" name="call" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã™ã‚‹"/>
- <button label="地図" name="show_on_map_btn" tool_tip="ä½äººã‚’地図上ã§è¡¨ç¤ºã™ã‚‹"/>
- <button label="テレãƒãƒ¼ãƒˆ" name="teleport" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹"/>
+ <button label="コール" name="call" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã—ã¾ã™"/>
+ <button label="地図" name="show_on_map_btn" tool_tip="ä½äººã‚’地図上ã§è¡¨ç¤ºã—ã¾ã™"/>
+ <button label="テレãƒãƒ¼ãƒˆ" name="teleport" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_online_status.xml b/indra/newview/skins/default/xui/ja/panel_online_status.xml
new file mode 100644
index 0000000000..fdc489f375
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_online_status.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="friend_online_status" name="friend_online_status"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_online_status_toast.xml b/indra/newview/skins/default/xui/ja/panel_online_status_toast.xml
new file mode 100644
index 0000000000..fdc489f375
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_online_status_toast.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="friend_online_status" name="friend_online_status"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_outfit_edit.xml b/indra/newview/skins/default/xui/ja/panel_outfit_edit.xml
new file mode 100644
index 0000000000..30b2c078d5
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_outfit_edit.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray Outfit Edit panel -->
+<panel label="アウトフットã®ç·¨é›†" name="outfit_edit">
+ <string name="No Outfit" value="アウトフィットãªã—"/>
+ <string name="unsaved_changes" value="ä¿å­˜ã•れã¦ã„ãªã„変更"/>
+ <string name="now_editing" value="編集ã—ã¦ã„ã¾ã™..."/>
+ <panel.string name="not_available">
+ (該当ãªã—)
+ </panel.string>
+ <panel.string name="unknown">
+ ï¼ˆä¸æ˜Žï¼‰
+ </panel.string>
+ <string name="Filter.All" value="ã™ã¹ã¦"/>
+ <string name="Filter.Clothes/Body" value="衣類/身体"/>
+ <string name="Filter.Objects" value="オブジェクト"/>
+ <string name="Filter.Custom" value="フィルターã®ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚º"/>
+ <text name="title" value="アウトフットã®ç·¨é›†"/>
+ <panel label="bottom_panel" name="header_panel">
+ <panel label="bottom_panel" name="outfit_name_and_status">
+ <text name="status" value="編集ã—ã¦ã„ã¾ã™..."/>
+ <text name="curr_outfit_name" value="[Current Outfit]"/>
+ </panel>
+ </panel>
+ <layout_stack name="im_panels">
+ <layout_panel label="IM コントロールパãƒãƒ«" name="outfit_wearables_panel">
+ <layout_stack name="filter_panels">
+ <layout_panel name="add_button_and_combobox">
+ <button label="ã•らã«è¿½åŠ ..." name="show_add_wearables_btn"/>
+ </layout_panel>
+ <layout_panel name="filter_panel">
+ <filter_editor label="æŒã¡ç‰©ã®ç€ç”¨ç‰©ã‚’フィルター" name="look_item_filter"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="add_wearables_panel"/>
+ </layout_stack>
+ <panel name="save_revert_button_bar">
+ <button label="ä¿å­˜" name="save_btn"/>
+ <button label="å…ƒã«æˆ»ã™" name="revert_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml
index a109b1ab51..27bb224c18 100644
--- a/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/panel_outfits_inventory.xml
@@ -1,14 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="ã‚‚ã®" name="Outfits">
<tab_container name="appearance_tabs">
- <inventory_panel label="マイ アウトフィット" name="outfitslist_tab"/>
- <inventory_panel label="ç€ç”¨ä¸­" name="cof_accordionpanel"/>
+ <panel label="マイ アウトフィット" name="outfitslist_tab"/>
+ <inventory_panel label="ç€ç”¨ä¸­" name="cof_tab"/>
</tab_container>
<panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="ãã®ä»–ã®ã‚ªãƒ—ションを表示"/>
- <dnd_button name="trash_btn" tool_tip="é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’削除"/>
- <button label="アウトフィットをä¿å­˜ã™ã‚‹" name="make_outfit_btn" tool_tip="容姿をアウトフィットã«ä¿å­˜ã™ã‚‹"/>
- <button label="装ç€" name="wear_btn" tool_tip="é¸æŠžã—ãŸã‚¢ã‚¦ãƒˆãƒ•ィットをç€ç”¨ã™ã‚‹"/>
- <button label="M" name="look_edit_btn"/>
+ <button name="options_gear_btn" tool_tip="ãã®ä»–ã®ã‚ªãƒ—ションを表示ã—ã¾ã™"/>
+ <dnd_button name="trash_btn" tool_tip="é¸æŠžã—ãŸã‚¢ã‚¤ãƒ†ãƒ ã‚’削除ã—ã¾ã™"/>
+ <button label="別åã§ä¿å­˜" name="save_btn"/>
+ <button label="装ç€" name="wear_btn" tool_tip="é¸æŠžã—ãŸã‚¢ã‚¦ãƒˆãƒ•ィットをç€ç”¨ã—ã¾ã™"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_people.xml b/indra/newview/skins/default/xui/ja/panel_people.xml
index c955cf6e48..68af19910a 100644
--- a/indra/newview/skins/default/xui/ja/panel_people.xml
+++ b/indra/newview/skins/default/xui/ja/panel_people.xml
@@ -1,13 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- Side tray panel -->
<panel label="人" name="people_panel">
- <string name="no_people" value="誰もã„ã¾ã›ã‚“"/>
- <string name="no_one_near" value="è¿‘ãã«èª°ã‚‚ã„ã¾ã›ã‚“"/>
+ <string name="no_recent_people" value="最近交æµã—ãŸäººã¯ã„ã¾ã›ã‚“。 一緒ã«ä½•ã‹ã™ã‚‹ä»²é–“ã‚’ãŠæŽ¢ã—ã§ã™ã‹ï¼Ÿ [secondlife:///app/search/people 検索] ã‹ [secondlife:///app/worldmap 世界地図] ã‚’ãŠè©¦ã—ãã ã•ã„。"/>
+ <string name="no_filtered_recent_people" value="ãŠæŽ¢ã—ã®ã‚‚ã®ã¯è¦‹ã¤ã‹ã‚Šã¾ã—ãŸã‹ï¼Ÿ [secondlife:///app/search/people/[SEARCH_TERM] 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。"/>
+ <string name="no_one_near" value="è¿‘ãã«èª°ã‚‚ã„ã¾ã›ã‚“。 一緒ã«ä½•ã‹ã™ã‚‹ä»²é–“ã‚’ãŠæŽ¢ã—ã§ã™ã‹ï¼Ÿ [secondlife:///app/search/people 検索] ã‹ [secondlife:///app/worldmap 世界地図] ã‚’ãŠè©¦ã—ãã ã•ã„。"/>
+ <string name="no_one_filtered_near" value="ãŠæŽ¢ã—ã®ã‚‚ã®ã¯è¦‹ã¤ã‹ã‚Šã¾ã—ãŸã‹ï¼Ÿ [secondlife:///app/search/people/[SEARCH_TERM] 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。"/>
<string name="no_friends_online" value="オンラインã®ãƒ•レンドã¯ã„ã¾ã›ã‚“"/>
<string name="no_friends" value="フレンドã¯ã„ã¾ã›ã‚“"/>
- <string name="no_groups" value="グループã¯ã‚りã¾ã›ã‚“"/>
+ <string name="no_friends_msg">
+ å‹é”を見ã¤ã‘ã‚‹ã«ã¯ã€[secondlife:///app/search/people 検索] ã‚’ã™ã‚‹ã‹ã€ä½äººã‚’å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ãƒ•レンド登録ã—ã¦ãã ã•ã„。
+一緒ã«ä½•ã‹ã™ã‚‹ä»²é–“ã‚’ãŠæŽ¢ã—ã§ã™ã‹ï¼Ÿ [secondlife:///app/worldmap 世界地図] ã‚’ãŠè©¦ã—ãã ã•ã„。
+ </string>
+ <string name="no_filtered_friends_msg">
+ ãŠæŽ¢ã—ã®ã‚‚ã®ã¯è¦‹ã¤ã‹ã‚Šã¾ã—ãŸã‹ï¼Ÿ [secondlife:///app/search/people/[SEARCH_TERM] 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。
+ </string>
<string name="people_filter_label" value="人をフィルター"/>
<string name="groups_filter_label" value="グループをフィルター"/>
+ <string name="no_filtered_groups_msg" value="ãŠæŽ¢ã—ã®ã‚‚ã®ã¯è¦‹ã¤ã‹ã‚Šã¾ã—ãŸã‹ï¼Ÿ [secondlife:///app/search/groups/[SEARCH_TERM] 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。"/>
+ <string name="no_groups_msg" value="ã‚°ãƒ«ãƒ¼ãƒ—ã‚’ãŠæŽ¢ã—ã§ã™ã‹ï¼Ÿ [secondlife:///app/search/groups 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。"/>
<filter_editor label="フィルター" name="filter_input"/>
<tab_container name="tabs">
<panel label="è¿‘ã" name="nearby_panel">
@@ -16,22 +26,22 @@
<button name="add_friend_btn" tool_tip="é¸æŠžã—ãŸä½äººã‚’フレンドリストã«ç™»éŒ²"/>
</panel>
</panel>
- <panel label="フレンド" name="friends_panel">
+ <panel label="マイ フレンド" name="friends_panel">
<accordion name="friends_accordion">
<accordion_tab name="tab_online" title="オンライン"/>
<accordion_tab name="tab_all" title="全員"/>
</accordion>
<panel label="bottom_panel" name="bottom_panel">
<button name="friends_viewsort_btn" tool_tip="オプション"/>
- <button name="add_btn" tool_tip="フレンド登録を申ã—出る"/>
- <button name="del_btn" tool_tip="é¸æŠžã—ãŸäººã‚’フレンドリストã‹ã‚‰å‰Šé™¤"/>
+ <button name="add_btn" tool_tip="フレンド登録を申ã—出ã¾ã™"/>
+ <button name="del_btn" tool_tip="é¸æŠžã—ãŸäººã‚’フレンドリストã‹ã‚‰å‰Šé™¤ã—ã¾ã™"/>
</panel>
</panel>
- <panel label="グループ" name="groups_panel">
+ <panel label="マイ グループ" name="groups_panel">
<panel label="bottom_panel" name="bottom_panel">
<button name="groups_viewsort_btn" tool_tip="オプション"/>
- <button name="plus_btn" tool_tip="グループã«å‚加 / æ–°è¦ã‚°ãƒ«ãƒ¼ãƒ—を作æˆ"/>
- <button name="activate_btn" tool_tip="é¸æŠžã—ãŸã‚°ãƒ«ãƒ¼ãƒ—をアクティベート"/>
+ <button name="plus_btn" tool_tip="グループã«å‚加 / æ–°è¦ã‚°ãƒ«ãƒ¼ãƒ—を作æˆã—ã¾ã™"/>
+ <button name="activate_btn" tool_tip="é¸æŠžã—ãŸã‚°ãƒ«ãƒ¼ãƒ—をアクティブã«ã—ã¾ã™"/>
</panel>
</panel>
<panel label="最新" name="recent_panel">
@@ -42,13 +52,13 @@
</panel>
</tab_container>
<panel name="button_bar">
- <button label="プロフィール" name="view_profile_btn" tool_tip="写真ã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ãã®ä»–ä½äººæƒ…報を表示"/>
- <button label="IM" name="im_btn" tool_tip="インスタントメッセージを開ã"/>
- <button label="コール" name="call_btn" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã™ã‚‹"/>
- <button label="共有" name="share_btn"/>
- <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹"/>
- <button label="グループ情報" name="group_info_btn" tool_tip="グループ情報を表示"/>
- <button label="グループãƒãƒ£ãƒƒãƒˆ" name="chat_btn" tool_tip="ãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹"/>
- <button label="グループã«ã‚³ãƒ¼ãƒ«ã™ã‚‹" name="group_call_btn" tool_tip="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã‚³ãƒ¼ãƒ«ã™ã‚‹"/>
+ <button label="プロフィール" name="view_profile_btn" tool_tip="写真ã€ã‚°ãƒ«ãƒ¼ãƒ—ã€ãã®ä»–ä½äººæƒ…報を表示ã—ã¾ã™"/>
+ <button label="IM" name="im_btn" tool_tip="インスタントメッセージを開ãã¾ã™"/>
+ <button label="コール" name="call_btn" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã—ã¾ã™"/>
+ <button label="共有" name="share_btn" tool_tip="æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã‚’共有"/>
+ <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™"/>
+ <button label="グループ情報" name="group_info_btn" tool_tip="グループ情報を表示ã—ã¾ã™"/>
+ <button label="グループãƒãƒ£ãƒƒãƒˆ" name="chat_btn" tool_tip="ãƒãƒ£ãƒƒãƒˆã‚’é–‹å§‹ã—ã¾ã™"/>
+ <button label="グループコール" name="group_call_btn" tool_tip="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ã‚³ãƒ¼ãƒ«ã—ã¾ã™"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_picks.xml b/indra/newview/skins/default/xui/ja/panel_picks.xml
index f74bf7a073..4f58c032da 100644
--- a/indra/newview/skins/default/xui/ja/panel_picks.xml
+++ b/indra/newview/skins/default/xui/ja/panel_picks.xml
@@ -10,8 +10,8 @@
<button name="new_btn" tool_tip="ç¾åœ¨åœ°ã®æ–°ã—ã„ピックã€ã¾ãŸã¯ã‚¯ãƒ©ã‚·ãƒ•ァイド広告を作æˆã—ã¾ã™"/>
</panel>
<panel name="buttons_cucks">
- <button label="情報" name="info_btn" tool_tip="ãƒ”ãƒƒã‚¯ã®æƒ…報を表示"/>
- <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="該当ã™ã‚‹ã‚¨ãƒªã‚¢ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ"/>
- <button label="地図" name="show_on_map_btn" tool_tip="世界地図ã«è©²å½“ã™ã‚‹ã‚¨ãƒªã‚¢ã‚’表示"/>
+ <button label="情報" name="info_btn" tool_tip="ãƒ”ãƒƒã‚¯ã®æƒ…報を表示ã—ã¾ã™"/>
+ <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="該当ã™ã‚‹ã‚¨ãƒªã‚¢ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™"/>
+ <button label="地図" name="show_on_map_btn" tool_tip="世界地図ã«è©²å½“ã™ã‚‹ã‚¨ãƒªã‚¢ã‚’表示ã—ã¾ã™"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_place_profile.xml b/indra/newview/skins/default/xui/ja/panel_place_profile.xml
index ef4b71c4aa..b897e1d748 100644
--- a/indra/newview/skins/default/xui/ja/panel_place_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_place_profile.xml
@@ -6,7 +6,7 @@
<string name="available" value="利用å¯"/>
<string name="allocated" value="å‰²ã‚Šå½“ã¦æ¸ˆ"/>
<string name="title_place" value="場所ã®ãƒ—ロフィール"/>
- <string name="title_teleport_history" value="テレãƒãƒ¼ãƒˆå±¥æ­´ã®å ´æ‰€"/>
+ <string name="title_teleport_history" value="テレãƒãƒ¼ãƒˆã®å±¥æ­´"/>
<string name="not_available" value="(該当ãªã—)"/>
<string name="unknown" value="ï¼ˆä¸æ˜Žï¼‰"/>
<string name="public" value="(公開)"/>
@@ -41,21 +41,6 @@
<string name="acquired_date">
[year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
</string>
- <string name="icon_PG" value="parcel_drk_PG"/>
- <string name="icon_M" value="parcel_drk_M"/>
- <string name="icon_R" value="parcel_drk_R"/>
- <string name="icon_Voice" value="parcel_drk_Voice"/>
- <string name="icon_VoiceNo" value="parcel_drk_VoiceNo"/>
- <string name="icon_Fly" value="parcel_drk_Fly"/>
- <string name="icon_FlyNo" value="parcel_drk_FlyNo"/>
- <string name="icon_Push" value="parcel_drk_Push"/>
- <string name="icon_PushNo" value="parcel_drk_PushNo"/>
- <string name="icon_Build" value="parcel_drk_Build"/>
- <string name="icon_BuildNo" value="parcel_drk_BuildNo"/>
- <string name="icon_Scripts" value="parcel_drk_Scripts"/>
- <string name="icon_ScriptsNo" value="parcel_drk_ScriptsNo"/>
- <string name="icon_Damage" value="parcel_drk_Damage"/>
- <string name="icon_DamageNo" value="parcel_drk_DamageNo"/>
<button name="back_btn" tool_tip="戻る"/>
<text name="title" value="場所ã®ãƒ—ロフィール"/>
<scroll_container name="place_scroll">
@@ -68,8 +53,8 @@
<text name="maturity_value" value="䏿˜Ž"/>
<accordion name="advanced_info_accordion">
<accordion_tab name="parcel_characteristics_tab" title="区画">
- <panel>
- <text name="rating_label" value="レーティング区分:"/>
+ <panel name="parcel_characteristics_panel">
+ <text name="rating_label" value="レーティング:"/>
<text name="rating_value" value="䏿˜Ž"/>
<text name="voice_label" value="ボイス:"/>
<text name="voice_value" value="オン"/>
@@ -86,14 +71,14 @@
<button label="土地情報" name="about_land_btn"/>
</panel>
</accordion_tab>
- <accordion_tab name="region_information_tab" title="リージョン">
- <panel>
+ <accordion_tab name="region_information_tab" title="リージョン(地域) ">
+ <panel name="region_information_panel">
<text name="region_name_label" value="リージョン:"/>
<text name="region_name" value="Mooseland"/>
<text name="region_type_label" value="種類:"/>
<text name="region_type" value="Moose"/>
- <text name="region_rating_label" value="レーティング区分:"/>
- <text name="region_rating" value="アダルト"/>
+ <text name="region_rating_label" value="レーティング:"/>
+ <text name="region_rating" value="Adult"/>
<text name="region_owner_label" value="所有者:"/>
<text name="region_owner" value="moose Van Moose"/>
<text name="region_group_label" value="グループ:"/>
@@ -104,15 +89,15 @@
</panel>
</accordion_tab>
<accordion_tab name="estate_information_tab" title="エステート(ä¸å‹•産)">
- <panel>
- <text name="estate_name_label" value="エステート(ä¸å‹•産):"/>
- <text name="estate_rating_label" value="レーティング区分:"/>
+ <panel name="estate_information_panel">
+ <text name="estate_name_label" value="エステート:"/>
+ <text name="estate_rating_label" value="レーティング:"/>
<text name="estate_owner_label" value="所有者:"/>
<text name="covenant_label" value="約款:"/>
</panel>
</accordion_tab>
<accordion_tab name="sales_tab" title="販売中">
- <panel>
+ <panel name="sales_panel">
<text name="sales_price_label" value="価格:"/>
<text name="area_label" value="é¢ç©ï¼š"/>
<text name="traffic_label" value="トラフィック:"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_places.xml b/indra/newview/skins/default/xui/ja/panel_places.xml
index b1c7a3308f..c83e3591a7 100644
--- a/indra/newview/skins/default/xui/ja/panel_places.xml
+++ b/indra/newview/skins/default/xui/ja/panel_places.xml
@@ -5,11 +5,12 @@
<filter_editor label="場所をフィルター" name="Filter"/>
<panel name="button_panel">
<button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="該当ã™ã‚‹ã‚¨ãƒªã‚¢ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™"/>
- <button label="地図" name="map_btn"/>
+ <button label="地図" name="map_btn" tool_tip="世界地図ã«è©²å½“ã™ã‚‹ã‚¨ãƒªã‚¢ã‚’表示"/>
<button label="編集" name="edit_btn" tool_tip="ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã®æƒ…報を編集ã—ã¾ã™"/>
- <button name="overflow_btn" tool_tip="ãã®ä»–ã®ã‚ªãƒ—ションを表示"/>
- <button label="é–‰ã˜ã‚‹" name="close_btn"/>
- <button label="キャンセル" name="cancel_btn"/>
+ <button label="â–¼" name="overflow_btn" tool_tip="ãã®ä»–ã®ã‚ªãƒ—ションを表示"/>
<button label="ä¿å­˜" name="save_btn"/>
+ <button label="キャンセル" name="cancel_btn"/>
+ <button label="é–‰ã˜ã‚‹" name="close_btn"/>
+ <button label="プロフィール" name="profile_btn" tool_tip="場所ã®ãƒ—ロフィールを表示"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
index d444cccd2d..fdf33b5402 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_advanced.xml
@@ -1,27 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
-<panel name="advanced">
- <panel.string name="resolution_format">
- [RES_X] x [RES_Y]
- </panel.string>
+<panel label="アドãƒãƒ³ã‚¹" name="advanced">
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
- <check_box label="å¹ã出ã—ãƒãƒ£ãƒƒãƒˆ" name="bubble_text_chat"/>
- <color_swatch name="background" tool_tip="å¹ã出ã—ãƒãƒ£ãƒƒãƒˆã®è‰²ã‚’é¸æŠžã—ã¾ã™"/>
- <slider label="逿˜Žåº¦" name="bubble_chat_opacity"/>
- <text name="AspectRatioLabel1" tool_tip="(幅/高ã•)">
- 縦横比
- </text>
- <combo_box name="aspect_ratio" tool_tip="(幅/高ã•)">
- <combo_box.item label="4:3(標準CRT)" name="item1"/>
- <combo_box.item label="5:4(1280x1024 LCD)" name="item2"/>
- <combo_box.item label="8:5(ワイドスクリï¼ãƒ³ï¼‰" name="item3"/>
- <combo_box.item label="16:9(ワイドスクリï¼ãƒ³ï¼‰" name="item4"/>
- </combo_box>
- <check_box label="自動検出" name="aspect_auto_detect"/>
- <text name="heading1">
- カメラ:
- </text>
+ <panel.string name="middle_mouse">
+ マウスã®ä¸­å¤®
+ </panel.string>
<slider label="視界角" name="camera_fov"/>
<slider label="è·é›¢" name="camera_offset_scale"/>
<text name="heading2">
@@ -29,20 +13,25 @@
</text>
<check_box label="制作・編集" name="edit_camera_movement" tool_tip="編集モードã®ã‚ªãƒ³ãƒ»ã‚ªãƒ•ã®åˆ‡ã‚Šæ›¿ãˆã«ã€è‡ªå‹•カメラãƒã‚¸ã‚·ãƒ§ãƒ³ã‚’使ã„ã¾ã™"/>
<check_box label="容姿" name="appearance_camera_movement" tool_tip="編集モードã«å…¥ã£ãŸã¨ãã«ã€è‡ªå‹•カメラãƒã‚¸ã‚·ãƒ§ãƒ³ã‚’使ã„ã¾ã™"/>
- <text name="heading3">
- ã‚¢ãƒã‚¿ãƒ¼ï¼š
- </text>
+ <check_box initial_value="true" label="サイドãƒãƒ¼" name="appearance_sidebar_positioning" tool_tip="サイドãƒãƒ¼ã®åˆ‡ã‚Šæ›¿ãˆæ™‚ã«è‡ªå‹•カメラãƒã‚¸ã‚·ãƒ§ãƒ³ã‚’使ã„ã¾ã™"/>
<check_box label="一人称視点ã§è¡¨ç¤ºã™ã‚‹" name="first_person_avatar_visible"/>
<check_box label="常ã«ã‚­ãƒ¼æ“作ã§å‹•ãよã†ã«ã™ã‚‹" name="arrow_keys_move_avatar_check"/>
<check_box label="上矢å°ã‚­ãƒ¼2度押ã—+長押ã—ã§èµ°ã‚‹" name="tap_tap_hold_to_run"/>
<check_box label="話ã™ã¨ãã«ã‚¢ãƒã‚¿ãƒ¼ã®å£ã‚’å‹•ã‹ã™" name="enable_lip_sync"/>
- <check_box label="スクリプトã®ã‚¨ãƒ©ãƒ¼ã‚’表示ã™ã‚‹" name="show_script_errors"/>
+ <check_box label="å¹ã出ã—ãƒãƒ£ãƒƒãƒˆ" name="bubble_text_chat"/>
+ <slider label="逿˜Žåº¦" name="bubble_chat_opacity"/>
+ <color_swatch name="background" tool_tip="å¹ã出ã—ãƒãƒ£ãƒƒãƒˆã®è‰²ã‚’é¸æŠžã—ã¾ã™"/>
+ <text name="UI Size:">
+ UI サイズ
+ </text>
+ <check_box label="スクリプトã®ã‚¨ãƒ©ãƒ¼ã‚’表示:" name="show_script_errors"/>
<radio_group name="show_location">
- <radio_item label="ãƒãƒ£ãƒƒãƒˆ" name="0"/>
- <radio_item label="ウィンドウ" name="1"/>
+ <radio_item label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆ" name="0"/>
+ <radio_item label="別々ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="1"/>
</radio_group>
- <check_box label="トリガーキーを押ã—ãŸã¨ãã«ã€ãƒžã‚¤ã‚¯ã‚’切り替ãˆã‚‹ï¼š" name="push_to_talk_toggle_check" tool_tip="ãƒˆã‚°ãƒ«ãƒ¢ãƒ¼ãƒ‰ã®æ™‚ã«ãƒˆãƒªã‚¬ãƒ¼ã‚­ãƒ¼ã‚’1度押ã—ã¦æ”¾ã™ã¨ã€ãƒžã‚¤ã‚¯ã®ã‚ªãƒ³ãƒ»ã‚ªãƒ•設定を切り替ãˆã¾ã™ã€‚ トグルモードã§ã¯ãªã„ã¨ãã¯ã€ãƒˆãƒªã‚¬ãƒ¼ã‚­ãƒ¼ã‚’押ã—ãŸçŠ¶æ…‹ã®æ™‚ã®ã¿ã‚ãªãŸã®å£°ãŒç›¸æ‰‹ã«èžã“ãˆã¾ã™ã€‚"/>
+ <check_box label="ボイスã®ã‚ªãƒ³ãƒ»ã‚ªãƒ•切り替ãˆã«ä½¿ç”¨ã™ã‚‹ãƒˆãƒªã‚¬ãƒ¼ã‚­ãƒ¼ï¼š" name="push_to_talk_toggle_check" tool_tip="ãƒˆã‚°ãƒ«ãƒ¢ãƒ¼ãƒ‰ã®æ™‚ã«ãƒˆãƒªã‚¬ãƒ¼ã‚­ãƒ¼ã‚’ 1 度押ã—ã¦æ”¾ã™ã¨ã€ãƒžã‚¤ã‚¯ã®ã‚ªãƒ³ãƒ»ã‚ªãƒ•設定を切り替ãˆã¾ã™ã€‚ トグルモードã§ã¯ãªã„ã¨ãã¯ã€ãƒˆãƒªã‚¬ãƒ¼ã‚­ãƒ¼ã‚’押ã—ãŸçŠ¶æ…‹ã®æ™‚ã®ã¿ã‚ãªãŸã®å£°ãŒç›¸æ‰‹ã«èžã“ãˆã¾ã™ã€‚"/>
<line_editor label="プッシュ・トゥ・スピークã®ãƒˆãƒªã‚¬ãƒ¼" name="modifier_combo"/>
<button label="キー設定" name="set_voice_hotkey_button"/>
- <button label="マウスã®ä¸­å¤®ãƒœã‚¿ãƒ³" name="set_voice_middlemouse_button"/>
+ <button label="マウスã®ä¸­å¤®ãƒœã‚¿ãƒ³" name="set_voice_middlemouse_button" tool_tip="マウスã®ä¸­å¤®ãƒœã‚¿ãƒ³ã«ãƒªã‚»ãƒƒãƒˆã—ã¾ã™"/>
+ <button label="ãã®ä»–ã®ãƒ‡ã‚£ãƒã‚¤ã‚¹" name="joystick_setup_button"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/ja/panel_preferences_alerts.xml
index 16af659326..7fd2e31698 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_alerts.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_alerts.xml
@@ -4,11 +4,11 @@
知らã›ã‚‹ï¼š
</text>
<check_box label="リンデンドルを使用・å—ã‘å–ã‚‹ã¨ã" name="notify_money_change_checkbox"/>
- <check_box label="フレンドãŒãƒ­ã‚°ã‚¢ã‚¦ãƒˆãƒ»ãƒ­ã‚°ã‚¤ãƒ³ã™ã‚‹ã¨ã" name="friends_online_notify_checkbox"/>
+ <check_box label="フレンドãŒãƒ­ã‚°ã‚¤ãƒ³ãƒ»ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã™ã‚‹ã¨ã" name="friends_online_notify_checkbox"/>
<text name="show_label" width="300">
- 常ã«è¡¨ç¤ºã™ã‚‹é€šçŸ¥ï¼š
+ 常ã«è¡¨ç¤ºã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ï¼š
</text>
<text name="dont_show_label">
- 表示ã—ãªã„通知:
+ 表示ã—ãªã„メッセージ:
</text>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
index ece18a75ca..86f880de09 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
@@ -1,33 +1,39 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="ãƒãƒ£ãƒƒãƒˆ" name="chat">
+ <text name="font_size">
+ 文字ã®å¤§ãã•:
+ </text>
<radio_group name="chat_font_size">
<radio_item label="å°" name="radio" value="0"/>
<radio_item label="中" name="radio2" value="1"/>
<radio_item label="大" name="radio3" value="2"/>
</radio_group>
+ <text name="font_colors">
+ 文字ã®è‰²ï¼š
+ </text>
<color_swatch label="自分" name="user"/>
<text name="text_box1">
- ミー
+ 自分
</text>
<color_swatch label="ãã®ä»–" name="agent"/>
<text name="text_box2">
- ãã®ä»–
+ 他人
</text>
<color_swatch label="IM" name="im"/>
<text name="text_box3">
IM
</text>
- <color_swatch label="システム" name="system"/>
+ <color_swatch label="システム" name="system"/>
<text name="text_box4">
- システム
+ システム
</text>
<color_swatch label="エラー" name="script_error"/>
<text name="text_box5">
エラー
</text>
- <color_swatch label="オブジェクト" name="objects"/>
+ <color_swatch label="オブジェクト" name="objects"/>
<text name="text_box6">
- オブジェクト
+ オブジェクト
</text>
<color_swatch label="所有者" name="owner"/>
<text name="text_box7">
@@ -37,11 +43,17 @@
<text name="text_box9">
URL
</text>
- <check_box initial_value="true" label="ãƒãƒ£ãƒƒãƒˆä¸­ã¯ã‚¿ã‚¤ãƒ”ング動作ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’å†ç”Ÿ" name="play_typing_animation"/>
- <check_box label="オフライン時ã«å—ã‘å–ã£ãŸ IM をメールã§é€ä¿¡" name="send_im_to_email"/>
- <check_box label="文字ãƒãƒ£ãƒƒãƒˆã®å±¥æ­´ã‚’有効ã«ã™ã‚‹" name="plain_text_chat_history"/>
- <radio_group name="chat_window" tool_tip="インスタントメッセージを別ウィンドウã€ã¾ãŸã¯1ã¤ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã«è¤‡æ•°ã‚¿ãƒ–ã§è¡¨ç¤ºï¼ˆè¦å†èµ·å‹•)">
- <radio_item label="複数ウィンドウ" name="radio" value="0"/>
- <radio_item label="1ã¤ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="radio2" value="1"/>
+ <check_box initial_value="true" label="ãƒãƒ£ãƒƒãƒˆä¸­ã«ã‚¿ã‚¤ãƒ”ング動作ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ã‚’å†ç”Ÿ" name="play_typing_animation"/>
+ <check_box label="オフライン時ã«å—ã‘å–ã£ãŸ IM をメールã§å—ä¿¡" name="send_im_to_email"/>
+ <check_box label="IM ã¨ãƒãƒ£ãƒƒãƒˆå±¥æ­´ã«æ–‡å­—ã ã‘表示ã™ã‚‹" name="plain_text_chat_history"/>
+ <text name="show_ims_in_label">
+ IM ã®è¡¨ç¤ºæ–¹æ³•:
+ </text>
+ <text name="requires_restart_label">
+ (å†èµ·å‹•後ã«å映)
+ </text>
+ <radio_group name="chat_window" tool_tip="インスタントメッセージを別フローターã€ã¾ãŸã¯1ã¤ã®ãƒ•ローターã«è¤‡æ•°ã‚¿ãƒ–ã§è¡¨ç¤ºã—ã¾ã™ï¼ˆè¦å†èµ·å‹•)">
+ <radio_item label="別々ã®ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦" name="radio" value="0"/>
+ <radio_item label="タブ" name="radio2" value="1"/>
</radio_group>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
index 765662b96a..4ccb70b321 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_general.xml
@@ -24,16 +24,16 @@
</text>
<text name="maturity_desired_textbox"/>
<combo_box name="maturity_desired_combobox">
- <combo_box.item label="ä¸€èˆ¬ã€æŽ§ãˆã‚ã€ã‚¢ãƒ€ãƒ«ãƒˆ" name="Desired_Adult"/>
- <combo_box.item label="ä¸€èˆ¬ã¨æŽ§ãˆã‚" name="Desired_Mature"/>
- <combo_box.item label="一般" name="Desired_PG"/>
+ <combo_box.item label="Generalã€Moderateã€Adult" name="Desired_Adult"/>
+ <combo_box.item label="General 㨠Moderate" name="Desired_Mature"/>
+ <combo_box.item label="General" name="Desired_PG"/>
</combo_box>
<text name="start_location_textbox">
ログインä½ç½®ï¼š
</text>
<combo_box name="start_location_combo">
<combo_box.item label="最後ã«ãƒ­ã‚°ã‚¢ã‚¦ãƒˆã—ãŸå ´æ‰€" name="MyLastLocation" tool_tip="å¸¸ã«æœ€å¾Œã«ã„ãŸå ´æ‰€ã«ãƒ­ã‚°ã‚¤ãƒ³"/>
- <combo_box.item label="自宅(ホーム)" name="MyHome" tool_tip="常ã«è‡ªå®…(ホーム)ã«ãƒ­ã‚°ã‚¤ãƒ³"/>
+ <combo_box.item label="ホーム" name="MyHome" tool_tip="常ã«ãƒ›ãƒ¼ãƒ ï¼ˆè‡ªå®…)ã«ãƒ­ã‚°ã‚¤ãƒ³"/>
</combo_box>
<check_box initial_value="true" label="ログイン画é¢ã«è¡¨ç¤ºã™ã‚‹" name="show_location_checkbox"/>
<text name="name_tags_textbox">
@@ -44,21 +44,21 @@
<radio_item label="オン" name="radio2" value="1"/>
<radio_item label="一時的ã«è¡¨ç¤º" name="radio3" value="2"/>
</radio_group>
- <check_box label="ç§ã®åå‰ã‚’表示" name="show_my_name_checkbox1"/>
+ <check_box label="自分ã®åå‰ã‚’表示" name="show_my_name_checkbox1"/>
<check_box initial_value="true" label="å°ã•ã„ã‚¢ãƒã‚¿ãƒ¼å" name="small_avatar_names_checkbox"/>
<check_box label="グループタイトルを表示" name="show_all_title_checkbox1"/>
<text name="effects_color_textbox">
- ç§ã®ãƒ“ームã®è‰²ï¼š
+ ビームã®è‰²ï¼š
</text>
<text name="title_afk_text">
一時退席ã¾ã§ã®æ™‚間:
</text>
- <color_swatch label="" name="effect_color_swatch" tool_tip="カラー・ピッカーをクリックã—ã¦é–‹ã"/>
+ <color_swatch label="" name="effect_color_swatch" tool_tip="クリックã§ã‚«ãƒ©ãƒ¼ãƒ”ッカーを開ãã¾ã™"/>
<combo_box label="一時退席ã¾ã§ã®æ™‚間:" name="afk">
- <combo_box.item label="2分" name="item0"/>
- <combo_box.item label="5分" name="item1"/>
- <combo_box.item label="10分" name="item2"/>
- <combo_box.item label="30分" name="item3"/>
+ <combo_box.item label="2 分" name="item0"/>
+ <combo_box.item label="5 分" name="item1"/>
+ <combo_box.item label="10 分" name="item2"/>
+ <combo_box.item label="30 分" name="item3"/>
<combo_box.item label="一時退席設定ãªã—" name="item4"/>
</combo_box>
<text name="text_box3">
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml
index 191748fe91..75de773366 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_graphics1.xml
@@ -1,19 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="表示" name="Display panel">
- <text name="WindowSizeLabel">
- ウィンドウ・サイズ:
- </text>
- <check_box label="全画é¢" name="windowed mode"/>
- <combo_box name="windowsize combo">
- <combo_box.item label="640x480" name="640x480"/>
- <combo_box.item label="800x600" name="800x600"/>
- <combo_box.item label="720x480 (NTSC)" name="720x480"/>
- <combo_box.item label="768x576 (PAL)" name="768x576"/>
- <combo_box.item label="1024x768" name="1024x768"/>
- </combo_box>
- <text name="UI Size:">
- UI サイズ:
- </text>
<text name="QualitySpeed">
クオリティã¨ã‚¹ãƒ”ード:
</text>
@@ -55,7 +41,7 @@
<text name="AvatarRenderingText">
ã‚¢ãƒã‚¿ãƒ¼è¡¨ç¤ºï¼š
</text>
- <check_box initial_value="true" label="ã‚¢ãƒã‚¿ãƒ¼ã®ç²¾åº¦ã‚’上ã’ã‚‹" name="AvatarImpostors"/>
+ <check_box initial_value="true" label="ã‚¢ãƒã‚¿ãƒ¼ã®æç”»ã‚’簡略化" name="AvatarImpostors"/>
<check_box initial_value="true" label="ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã‚¹ã‚­ãƒ‹ãƒ³ã‚°" name="AvatarVertexProgram"/>
<check_box initial_value="true" label="ã‚¢ãƒã‚¿ãƒ¼ã®å¸ƒ" name="AvatarCloth"/>
<slider label="æç”»è·é›¢ï¼š" name="DrawDistance"/>
@@ -63,6 +49,10 @@
m
</text>
<slider label="最大パーティクル数:" name="MaxParticleCount"/>
+ <slider label="ã‚¢ãƒã‚¿ãƒ¼æœ€å¤§æç”»è·é›¢ï¼š" name="MaxAvatarDrawDistance"/>
+ <text name="DrawDistanceMeterText3">
+ m
+ </text>
<slider label="ãƒã‚¹ãƒˆãƒ—ロセスå“質:" name="RenderPostProcess"/>
<text name="MeshDetailText">
メッシュ詳細:
@@ -98,8 +88,8 @@
ライティング詳細:
</text>
<radio_group name="LightingDetailRadio">
- <radio_item label="å¤ªé™½ã¨æœˆã®ã¿" name="SunMoon"/>
- <radio_item label="è¿‘ãã®ãƒ­ãƒ¼ã‚«ãƒ«ã‚µã‚¤ãƒˆ" name="LocalLights"/>
+ <radio_item label="å¤ªé™½ã¨æœˆã®ã¿" name="SunMoon" value="0"/>
+ <radio_item label="è¿‘ãã®ãƒ­ãƒ¼ã‚«ãƒ«ã‚µã‚¤ãƒˆ" name="LocalLights" value="1"/>
</radio_group>
<text name="TerrainDetailText">
地形詳細:
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml
index 7a7cb8b96b..b81889b412 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_privacy.xml
@@ -3,22 +3,20 @@
<panel.string name="log_in_to_change">
ログインã—ã¦å¤‰æ›´
</panel.string>
- <button label="å±¥æ­´ã®æ¶ˆåŽ»" name="clear_cache"/>
+ <button label="履歴を消去" name="clear_cache" tool_tip="ログイン画åƒã€æœ€å¾Œã«ã„ãŸå ´æ‰€ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆå±¥æ­´ã€Webã€ãƒ†ã‚¯ã‚¹ãƒãƒ£ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’削除ã—ã¾ã™"/>
<text name="cache_size_label_l">
(ä½ç½®ã€ç”»åƒã€webã€æ¤œç´¢å±¥æ­´ï¼‰
</text>
- <check_box label="ç§ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çжæ³ã‚’確èªã§ãã‚‹ã®ã¯ã€ãƒ•レンドã¨ã‚°ãƒ«ãƒ¼ãƒ—ã ã‘" name="online_visibility"/>
- <check_box label="フレンドã¨ã‚°ãƒ«ãƒ¼ãƒ—以外ã‹ã‚‰ã¯ã‚³ãƒ¼ãƒ«ã¨IMã‚’å—ä¿¡ã—ãªã„" name="voice_call_friends_only_check"/>
- <check_box label="コールãŒçµ‚了ã—ãŸã‚‰ãƒžã‚¤ã‚¯ã®ã‚¹ã‚¤ãƒƒãƒã‚’切る" name="auto_disengage_mic_check"/>
- <check_box label="Cookieã‚’å—ã‘入れる" name="cookies_enabled"/>
- <check_box label="ãƒ¡ãƒ‡ã‚£ã‚¢ãŒæœ‰åйã§ã™" name="media_enabled"/>
- <check_box label="メディアを自動å†ç”Ÿã™ã‚‹" name="autoplay_enabled"/>
+ <check_box label="ç§ã®ã‚ªãƒ³ãƒ©ã‚¤ãƒ³çŠ¶æ…‹ã‚’ç¢ºèªã§ãã‚‹ã®ã¯ã€ãƒ•レンドã¨ã‚°ãƒ«ãƒ¼ãƒ—ã ã‘" name="online_visibility"/>
+ <check_box label="フレンドã¨ã‚°ãƒ«ãƒ¼ãƒ—以外ã‹ã‚‰ã¯ã‚³ãƒ¼ãƒ«ã¨ IM ã‚’å—ä¿¡ã—ãªã„" name="voice_call_friends_only_check"/>
+ <check_box label="コールãŒçµ‚了ã—ãŸã‚‰è‡ªå‹•çš„ã«ãƒžã‚¤ã‚¯ã®ã‚¹ã‚¤ãƒƒãƒã‚’切る" name="auto_disengage_mic_check"/>
+ <check_box label="Cookie ã‚’å—ã‘入れる" name="cookies_enabled"/>
<text name="Logs:">
ログ:
</text>
- <check_box label="コンピューターã«è¿‘ãã®ãƒãƒ£ãƒƒãƒˆãƒ­ã‚°ã‚’ä¿å­˜ã™ã‚‹" name="log_nearby_chat"/>
- <check_box label="コンピューター㫠IM ログをä¿å­˜ã™ã‚‹" name="log_instant_messages"/>
- <check_box label="タイムスタンプを追加ã™ã‚‹" name="show_timestamps_check_im"/>
+ <check_box label="è¿‘ãã®ãƒãƒ£ãƒƒãƒˆãƒ­ã‚°ã‚’コンピューターã«ä¿å­˜ã™ã‚‹" name="log_nearby_chat"/>
+ <check_box label="IM ログをコンピューターã«ä¿å­˜ã™ã‚‹" name="log_instant_messages"/>
+ <check_box label="日時を入れる" name="show_timestamps_check_im"/>
<text name="log_path_desc">
ログã®ä¿å­˜å ´æ‰€ï¼š
</text>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
index 12e21709ae..653d9fd3b3 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_setup.xml
@@ -5,7 +5,7 @@
一人称視点:
</text>
<text name=" Mouse Sensitivity">
- マウスã®ç²¾åº¦
+ ãƒžã‚¦ã‚¹ã®æ„Ÿåº¦
</text>
<check_box label="切り替ãˆ" name="invert_mouse"/>
<text name="Network:">
@@ -18,29 +18,32 @@
kbps
</text>
<check_box label="カスタムãƒãƒ¼ãƒˆ" name="connection_port_enabled"/>
- <spinner label="ãƒãƒ¼ãƒˆç•ªå·ï¼š" name="web_proxy_port"/>
+ <spinner label="ãƒãƒ¼ãƒˆç•ªå·ï¼š" name="connection_port"/>
<text name="cache_size_label_l">
キャッシュサイズ
</text>
<text name="text_box5">
MB
</text>
- <button label="å‚ç…§" label_selected="å‚ç…§" name="set_cache"/>
- <button label="リセット" label_selected="リセット" name="reset_cache"/>
<text name="Cache location">
キャッシュã®ä¿å­˜å ´æ‰€ï¼š
</text>
+ <button label="å‚ç…§" label_selected="å‚ç…§" name="set_cache"/>
+ <button label="リセット" label_selected="リセット" name="reset_cache"/>
<text name="Web:">
Web:
</text>
<radio_group name="use_external_browser">
- <radio_item label="内蔵ブラウザを使用" name="internal" tool_tip="内蔵ブラウザã§ãƒ˜ãƒ«ãƒ—ã‚„Webリンクãªã©ã‚’見ã¾ã™ã€‚[APP_NAME] å†…ã«æ–°ã—ã„ウィンドウã§ã“ã®ãƒ–ラウザãŒé–‹ãã¾ã™ã€‚"/>
- <radio_item label="外部ブラウザ(IEã‚„Firefox)を使用" name="external" tool_tip="デフォルトã®ã‚·ã‚¹ãƒ†ãƒ Webブラウザã§ãƒ˜ãƒ«ãƒ—ã‚„Webリンク先ãªã©ã‚’見ã¾ã™ã€‚全画é¢ã§èµ·å‹•中ã«ã¯ãŠã™ã™ã‚ã—ã¾ã›ã‚“。"/>
+ <radio_item label="指定ã®ãƒ–ラウザ(IE ã‚„ Firefox)を使用" name="external" tool_tip="デフォルトã®ã‚·ã‚¹ãƒ†ãƒ  Web ブラウザã§ãƒ˜ãƒ«ãƒ—ã‚„ Web リンク先ãªã©ã‚’見ã¾ã™ã€‚全画é¢ã§èµ·å‹•中ã«ã¯ãŠã™ã™ã‚ã—ã¾ã›ã‚“。" value="1"/>
+ <radio_item label="内蔵ブラウザを使用" name="internal" tool_tip="内蔵ブラウザã§ãƒ˜ãƒ«ãƒ—ã‚„ Web リンクãªã©ã‚’見ã¾ã™ã€‚[APP_NAME] å†…ã«æ–°ã—ã„ウィンドウã§ã“ã®ãƒ–ラウザãŒé–‹ãã¾ã™ã€‚" value=""/>
</radio_group>
- <check_box initial_value="false" label="Webプロキシ" name="web_proxy_enabled"/>
- <line_editor name="web_proxy_editor" tool_tip="使用ã™ã‚‹ãƒ—ロキシåã¾ãŸã¯IPアドレス"/>
- <button label="å‚ç…§" label_selected="å‚ç…§" name="set_proxy"/>
+ <check_box initial_value="true" label="プラグインを有効ã«ã™ã‚‹" name="browser_plugins_enabled"/>
+ <check_box initial_value="true" label="Cookie ã‚’å—ã‘入れる" name="cookies_enabled"/>
+ <check_box initial_value="true" label="Javascript を有効ã«ã™ã‚‹" name="browser_javascript_enabled"/>
+ <check_box initial_value="false" label="Web プロキシを有効ã«ã™ã‚‹" name="web_proxy_enabled"/>
<text name="Proxy location">
プロキシ:
</text>
+ <line_editor name="web_proxy_editor" tool_tip="使用ã™ã‚‹ãƒ—ロキシã®ãƒ›ã‚¹ãƒˆåã¾ãŸã¯ IP アドレス"/>
+ <spinner label="ãƒãƒ¼ãƒˆç•ªå·ï¼š" name="web_proxy_port"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
index 9fb0dd0b46..abbd29286b 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_sound.xml
@@ -2,13 +2,20 @@
<panel label="サウンド" name="Preference Media panel">
<slider label="全体ã®éŸ³é‡" name="System Volume"/>
<check_box initial_value="true" label="最å°åŒ–ã§ãƒŸãƒ¥ãƒ¼ãƒˆ" name="mute_when_minimized"/>
- <slider label="風" name="Wind Volume"/>
<slider label="ボタン" name="UI Volume"/>
- <slider label="メディア" name="Media Volume"/>
+ <slider label="風" name="Wind Volume"/>
<slider label="効果音" name="SFX Volume"/>
<slider label="ストリーミング音楽" name="Music Volume"/>
- <check_box label="ボイスを有効ã«ã™ã‚‹" name="enable_voice_check"/>
- <slider label="ボイス" name="Voice Volume"/>
+ <check_box label="有効" name="music_enabled"/>
+ <slider label="メディア" name="Media Volume"/>
+ <check_box label="有効" name="enable_media"/>
+ <slider label="ボイスãƒãƒ£ãƒƒãƒˆ" name="Voice Volume"/>
+ <check_box label="有効" name="enable_voice_check"/>
+ <check_box label="メディアを自動å†ç”Ÿã™ã‚‹" name="media_auto_play_btn" tool_tip="ã“ã“ã«ãƒã‚§ãƒƒã‚¯ã‚’入れã¦ãƒ¡ãƒ‡ã‚£ã‚¢ã®è‡ªå‹•å†ç”Ÿã‚’許å¯ã—ã¾ã™" value="true"/>
+ <check_box label="ä»–ã®ã‚¢ãƒã‚¿ãƒ¼ã«å–り付ã‘られãŸãƒ¡ãƒ‡ã‚£ã‚¢ã‚’å†ç”Ÿã™ã‚‹" name="media_show_on_others_btn" tool_tip="ã“ã®ãƒã‚§ãƒƒã‚¯ã‚’外ã™ã¨ã€è¿‘ãã«ã„ã‚‹ä»–ã®ã‚¢ãƒã‚¿ãƒ¼ã«å–り付ã‘られãŸãƒ¡ãƒ‡ã‚£ã‚¢ã‚’éžè¡¨ç¤ºã«ã—ã¾ã™" value="true"/>
+ <text name="voice_chat_settings">
+ ボイスãƒãƒ£ãƒƒãƒˆã®è¨­å®š
+ </text>
<text name="Listen from">
æ–¹å‘:
</text>
diff --git a/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml
index 0e1e2851e3..a9897c7ae4 100644
--- a/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml
+++ b/indra/newview/skins/default/xui/ja/panel_prim_media_controls.xml
@@ -13,10 +13,10 @@
</layout_stack>
<layout_stack name="media_controls">
<layout_panel name="back">
- <button name="back_btn" tool_tip="Navigate back"/>
+ <button name="back_btn" tool_tip="å‰ã¸"/>
</layout_panel>
<layout_panel name="fwd">
- <button name="fwd_btn" tool_tip="Navigate forward"/>
+ <button name="fwd_btn" tool_tip="次ã¸"/>
</layout_panel>
<layout_panel name="home">
<button name="home_btn" tool_tip="ホームページ"/>
@@ -51,10 +51,10 @@
<slider_bar initial_value="0.5" name="media_play_slider" tool_tip="ムービーå†ç”Ÿé€²è¡Œ"/>
</layout_panel>
<layout_panel name="skip_back">
- <button name="skip_back_btn" tool_tip="Step back"/>
+ <button name="skip_back_btn" tool_tip="å‰ã«ã‚¹ãƒ†ãƒƒãƒ—"/>
</layout_panel>
<layout_panel name="skip_forward">
- <button name="skip_forward_btn" tool_tip="Step forward"/>
+ <button name="skip_forward_btn" tool_tip="次ã«ã‚¹ãƒ†ãƒƒãƒ—"/>
</layout_panel>
<layout_panel name="media_volume">
<button name="media_mute_button" tool_tip="ミュート"/>
@@ -64,10 +64,10 @@
<button name="zoom_frame_btn" tool_tip="メディアã«ã‚ºãƒ¼ãƒ ã‚¤ãƒ³"/>
</layout_panel>
<layout_panel name="close">
- <button name="close_btn" tool_tip="Zoom Back"/>
+ <button name="close_btn" tool_tip="ズームãƒãƒƒã‚¯"/>
</layout_panel>
<layout_panel name="new_window">
- <button name="new_window_btn" tool_tip="URLをブラウザã§é–‹ã"/>
+ <button name="new_window_btn" tool_tip="URL をブラウザã§é–‹ã"/>
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_profile.xml b/indra/newview/skins/default/xui/ja/panel_profile.xml
index 98969f5ab3..e7bc989c52 100644
--- a/indra/newview/skins/default/xui/ja/panel_profile.xml
+++ b/indra/newview/skins/default/xui/ja/panel_profile.xml
@@ -26,13 +26,16 @@
<panel name="first_life_image_panel">
<text name="title_rw_descr_text" value="ç¾å®Ÿä¸–界:"/>
</panel>
- <text name="title_member_text" value="ä½äººã¨ãªã£ãŸæ—¥ï¼š"/>
+ <text name="title_member_text" value="ä½äººç™»éŒ²ï¼š"/>
<text name="title_acc_status_text" value="アカウントã®çŠ¶æ…‹ï¼š"/>
- <text name="acc_status_text">
+ <text_editor name="acc_status_text">
ä½äººã€‚ 支払情報未登録。
リンデン。
- </text>
+ </text_editor>
<text name="title_partner_text" value="パートナー:"/>
+ <panel name="partner_data_panel">
+ <name_box initial_value="(å–得中)" name="partner_text"/>
+ </panel>
<text name="title_groups_text" value="グループ:"/>
</panel>
</scroll_container>
@@ -40,9 +43,10 @@
<layout_panel name="profile_buttons_panel">
<button label="フレンド登録" name="add_friend" tool_tip="フレンド登録を申ã—出ã¾ã™"/>
<button label="IM" name="im" tool_tip="インスタントメッセージを開ãã¾ã™"/>
- <button label="コール" name="call" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã™ã‚‹"/>
- <button label="地図" name="show_on_map_btn" tool_tip="ä½äººã‚’地図上ã§è¡¨ç¤ºã™ã‚‹"/>
- <button label="テレãƒãƒ¼ãƒˆ" name="teleport" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚‹"/>
+ <button label="コール" name="call" tool_tip="ã“ã®ä½äººã«ã‚³ãƒ¼ãƒ«ã—ã¾ã™"/>
+ <button label="地図" name="show_on_map_btn" tool_tip="ä½äººã‚’地図上ã§è¡¨ç¤ºã—ã¾ã™"/>
+ <button label="テレãƒãƒ¼ãƒˆ" name="teleport" tool_tip="テレãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™"/>
+ <button label="â–¼" name="overflow_btn" tool_tip="ä½äººã«ãŠé‡‘を渡ã™ã‹æŒã¡ç‰©ã‚’共有ã—ã¾ã™"/>
</layout_panel>
<layout_panel name="profile_me_buttons_panel">
<button label="プロフィールã®ç·¨é›†" name="edit_profile_btn" tool_tip="å€‹äººçš„ãªæƒ…報を編集ã—ã¾ã™"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_covenant.xml b/indra/newview/skins/default/xui/ja/panel_region_covenant.xml
index 5f43f93113..5214f79141 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_covenant.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="約款" name="Covenant">
- <text font="SansSerifLarge" name="estate_section_lbl">
- エステート(ä¸å‹•産)
+ <text font="SansSerifLarge" name="estate_section_lbl" width="200">
+ ä¸å‹•産
</text>
<text name="estate_name_lbl">
åå‰ï¼š
@@ -26,14 +26,14 @@
ã“ã®ä¸å‹•産ã«ã¯ç´„款ãŒã‚りã¾ã›ã‚“。
</text_editor>
<button label="リセット" name="reset_covenant"/>
- <text name="covenant_help_text">
+ <text name="covenant_help_text" left="100">
約款ã®å¤‰æ›´ã¯ä¸å‹•産全区画ã«é©ç”¨ã¨ãªã‚Šã¾ã™ã€‚
</text>
- <text name="covenant_instructions">
- ã“ã®ä¸å‹•産約款ã®å¤‰æ›´ã‚’ã™ã‚‹éš›ã¯ã€ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’ドラッグ&ドロップã—ã¦ãã ã•ã„。
+ <text name="covenant_instructions" width="390">
+ ã“ã®ä¸å‹•産約款を変更ã™ã‚‹éš›ã¯ã€ãƒŽãƒ¼ãƒˆã‚«ãƒ¼ãƒ‰ã‚’ドラッグ&ドロップã—ã¦ãã ã•ã„。
</text>
- <text bottom_delta="-34" font="SansSerifLarge" name="region_section_lbl">
- リージョン(地域)
+ <text bottom_delta="-34" font="SansSerifLarge" name="region_section_lbl" width="200">
+ 地域
</text>
<text name="region_name_lbl">
åå‰ï¼š
diff --git a/indra/newview/skins/default/xui/ja/panel_region_debug.xml b/indra/newview/skins/default/xui/ja/panel_region_debug.xml
index 4209fb17e5..f6865c12b1 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_debug.xml
@@ -6,11 +6,11 @@
<text name="region_text">
未知
</text>
- <check_box label="スクリプト無効化" name="disable_scripts_check" tool_tip="ã“ã®åœ°åŸŸã®ã‚¹ã‚¯ãƒªãƒ—トをã™ã¹ã¦ç„¡åŠ¹åŒ–"/>
+ <check_box label="スクリプト無効化" name="disable_scripts_check" tool_tip="ã“ã®åœ°åŸŸã®ã‚¹ã‚¯ãƒªãƒ—トをã™ã¹ã¦ç„¡åйã«ã—ã¾ã™"/>
<button label="?" name="disable_scripts_help"/>
- <check_box label="è¡çªã‚’無効化" name="disable_collisions_check" tool_tip="ã“ã®åœ°åŸŸã®éžã‚¢ãƒã‚¿ãƒ¼è¡çªã‚’無効化"/>
+ <check_box label="è¡çªã‚’無効化" name="disable_collisions_check" tool_tip="ã“ã®åœ°åŸŸã®éžã‚¢ãƒã‚¿ãƒ¼è¡çªã‚’無効ã«ã—ã¾ã™"/>
<button label="?" name="disable_collisions_help"/>
- <check_box label="物ç†ä½œç”¨ã‚’無効化" name="disable_physics_check" tool_tip="ã“ã®åœ°åŸŸã®ç‰©ç†ä½œç”¨ã‚’ã™ã¹ã¦ç„¡åŠ¹åŒ–"/>
+ <check_box label="物ç†ä½œç”¨ã‚’無効化" name="disable_physics_check" tool_tip="ã“ã®åœ°åŸŸã®ç‰©ç†ä½œç”¨ã‚’ã™ã¹ã¦ç„¡åйã«ã—ã¾ã™"/>
<button label="?" name="disable_physics_help"/>
<button label="é©ç”¨" name="apply_btn"/>
<text name="objret_text_lbl" width="120">
@@ -27,14 +27,14 @@
オプション:
</text>
<check_box label="スクリプト付ãã®ã‚‚ã®" name="return_scripts" tool_tip="スクリプトã®ã‚ªãƒ–ジェクトã ã‘è¿”å´ã—ã¾ã™"/>
- <check_box label="他人ã®åœŸåœ°ã«ã‚ã‚‹ã‚‚ã®" name="return_other_land" tool_tip="他人ã«å±žã™ã‚‹åœŸåœ°ã«ã‚るオブジェクトã®ã¿ã‚’è¿”å´"/>
- <check_box label="ã“ã®ä¸å‹•産ã«å±žã™ã‚‹ã™ã¹ã¦ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚‚ã®" name="return_estate_wide" tool_tip="ã“ã®ä¸å‹•産ã«å«ã¾ã‚Œã¦ã„ã‚‹ã™ã¹ã¦ã®åœ°åŸŸã®ã‚ªãƒ–ジェクトを返å´"/>
+ <check_box label="他人ã®åœŸåœ°ã«ã‚ã‚‹ã‚‚ã®" name="return_other_land" tool_tip="他人ã«å±žã™ã‚‹åœŸåœ°ã«ã‚るオブジェクトã®ã¿ã‚’è¿”å´ã—ã¾ã™"/>
+ <check_box label="ã“ã®ä¸å‹•産ã«å±žã™ã‚‹ã™ã¹ã¦ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã®ã‚‚ã®" name="return_estate_wide" tool_tip="ã“ã®ä¸å‹•産ã«å«ã¾ã‚Œã¦ã„ã‚‹ã™ã¹ã¦ã®åœ°åŸŸã®ã‚ªãƒ–ジェクトを返å´ã—ã¾ã™"/>
<button label="è¿”å´" name="return_btn"/>
<button label="上部コライダーå–å¾—" name="top_colliders_btn" tool_tip="è¡çªã™ã‚‹å¯èƒ½æ€§ãŒæœ€ã‚‚高ã„オブジェクトã®ãƒªã‚¹ãƒˆ"/>
<button label="?" name="top_colliders_help"/>
<button label="上部スクリプトå–å¾—" name="top_scripts_btn" tool_tip="スクリプトã®å®Ÿè¡Œã«æœ€ã‚‚時間を費やã—ã¦ã„るオブジェクトã®ãƒªã‚¹ãƒˆ"/>
<button label="?" name="top_scripts_help"/>
- <button label="地域å†èµ·å‹•" name="restart_btn" tool_tip="2分間ã®ã‚«ã‚¦ãƒ³ãƒˆãƒ€ã‚¦ãƒ³å¾Œã€åœ°åŸŸã‚’å†èµ·å‹•"/>
+ <button label="地域å†èµ·å‹•" name="restart_btn" tool_tip="2分間ã®ã‚«ã‚¦ãƒ³ãƒˆãƒ€ã‚¦ãƒ³å¾Œã€åœ°åŸŸã‚’å†èµ·å‹•ã—ã¾ã™"/>
<button label="?" name="restart_help"/>
- <button label="å†èµ·å‹•ã‚’é…å»¶" name="cancel_restart_btn" tool_tip="地域ã®å†èµ·å‹•を1時間é…å»¶ã™ã‚‹"/>
+ <button label="å†èµ·å‹•ã‚’é…å»¶" name="cancel_restart_btn" tool_tip="地域ã®å†èµ·å‹•を1時間é…å»¶ã—ã¾ã™"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_estate.xml b/indra/newview/skins/default/xui/ja/panel_region_estate.xml
index 976cfacb3f..5b2ef36045 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_estate.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="ä¸å‹•産" name="Estate">
<text name="estate_help_text">
- ã“ã®ã‚¿ãƒ–ã®è¨­å®šã¸ã®å¤‰æ›´ã¯ã€ã‚¨ã‚¹ãƒ†ãƒ¼ãƒˆå†…ã®ã™ã¹ã¦ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«å½±éŸ¿ã•れã¾ã™ã€‚
+ ã“ã®ã‚¿ãƒ–内ã®è¨­å®šå¤‰æ›´ã¯ã€ä¸å‹•産内ã®ã™ã¹ã¦ã®åœ°åŸŸã«å½±éŸ¿ã—ã¾ã™ã€‚
</text>
<text name="estate_text">
ä¸å‹•産:
@@ -16,10 +16,10 @@
ï¼ˆä¸æ˜Žï¼‰
</text>
<text name="Only Allow">
- 次ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ã‚¢ã‚¯ã‚»ã‚¹ç¦æ­¢ï¼š
+ 次ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆã®ã¿ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ï¼š
</text>
<check_box label="支払情報登録済" name="limit_payment" tool_tip="未確èªã®ä½äººã®ç«‹å…¥ã‚’ç¦æ­¢ã—ã¾ã™"/>
- <check_box label="年齢確èª" name="limit_age_verified" tool_tip="年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„ä½äººã®ç«‹å…¥ã‚’ç¦æ­¢ã—ã¾ã™ã€‚ 詳ã—ã„æƒ…報㯠[SUPPORT_SITE] ã‚’ã”覧下ã•ã„。"/>
+ <check_box label="å¹´é½¢ç¢ºèªæ¸ˆ" name="limit_age_verified" tool_tip="年齢確èªã‚’済ã¾ã›ã¦ã„ãªã„ä½äººã®ç«‹å…¥ã‚’ç¦æ­¢ã—ã¾ã™ã€‚ 詳ã—ã„æƒ…報㯠[SUPPORT_SITE] ã‚’ã”覧下ã•ã„。"/>
<check_box label="ボイスãƒãƒ£ãƒƒãƒˆã‚’許å¯" name="voice_chat_check"/>
<button label="?" name="voice_chat_help"/>
<text name="abuse_email_text">
@@ -40,7 +40,7 @@
<check_box label="太陽固定" name="fixed_sun_check"/>
<button label="?" name="fixed_sun_help"/>
<slider label="段階" name="sun_hour_slider"/>
- <check_box label="パブリック・アクセスを許å¯" name="externally_visible_check"/>
+ <check_box label="パブリックアクセスを許å¯" name="externally_visible_check"/>
<button label="?" name="externally_visible_help"/>
<check_box label="直接テレãƒãƒ¼ãƒˆã‚’許å¯" name="allow_direct_teleport"/>
<button label="?" name="allow_direct_teleport_help"/>
@@ -69,6 +69,6 @@
<button label="?" name="ban_resident_help"/>
<button label="追加..." name="add_banned_avatar_btn"/>
<button label="削除..." name="remove_banned_avatar_btn"/>
- <button label="メッセージをä¸å‹•産ã¸é€ä¿¡..." name="message_estate_btn"/>
- <button label="土地ã‹ã‚‰ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追ã„出ã™..." name="kick_user_from_estate_btn"/>
+ <button label="メッセージをä¸å‹•産ã«é€ä¿¡..." name="message_estate_btn"/>
+ <button label="ä¸å‹•産ã‹ã‚‰ä½äººã‚’追ã„出ã™..." name="kick_user_from_estate_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_general.xml b/indra/newview/skins/default/xui/ja/panel_region_general.xml
index 00be5b6b03..54ec24773f 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_general.xml
@@ -3,51 +3,41 @@
<text name="region_text_lbl">
地域:
</text>
- <text left="90" name="region_text">
+ <text left_delta="70" name="region_text">
未知
</text>
<text name="version_channel_text_lbl" width="100">
ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š
</text>
- <text left="90" name="version_channel_text">
+ <text left_delta="70" name="version_channel_text">
䏿˜Ž
</text>
<text name="region_type_lbl">
種類:
</text>
- <text name="region_type">
+ <text left_delta="70" name="region_type">
䏿˜Ž
</text>
- <check_box label="土地整備をブロック" name="block_terraform_check"/>
- <button label="?" name="terraform_help"/>
+ <check_box label="地形編集をブロック" name="block_terraform_check"/>
<check_box label="飛行をブロック" name="block_fly_check"/>
- <button label="?" name="fly_help"/>
<check_box label="ダメージを許å¯" name="allow_damage_check"/>
- <button label="?" name="damage_help"/>
<check_box label="プッシュを制é™" name="restrict_pushobject"/>
- <button label="?" name="restrict_pushobject_help"/>
<check_box label="土地ã®å†è²©ã‚’許å¯" name="allow_land_resell_check"/>
- <button label="?" name="land_resell_help"/>
- <check_box label="土地ã®çµ±åˆï¼åˆ†å‰²ã‚’許å¯" name="allow_parcel_changes_check"/>
- <button label="?" name="parcel_changes_help"/>
- <check_box label="åœŸåœ°ã®æ¤œç´¢è¡¨ç¤ºã‚’ブロック" name="block_parcel_search_check" tool_tip="æ¤œç´¢çµæžœã§ã€ã“ã®åœ°åŸŸã¨åŒºç”»ã‚’人ã«è¦‹ã›ã‚‹"/>
- <button label="?" name="parcel_search_help"/>
+ <check_box label="土地ã®çµ±åˆãƒ»åˆ†å‰²ã‚’許å¯" name="allow_parcel_changes_check"/>
+ <check_box label="åœŸåœ°ã®æ¤œç´¢è¡¨ç¤ºã‚’ブロック" name="block_parcel_search_check" tool_tip="æ¤œç´¢çµæžœã§ã€ã“ã®åœ°åŸŸã¨åŒºç”»ã‚’表示ã™ã‚‹ã‹ã©ã†ã‹ã®è¨­å®šã§ã™"/>
<spinner label="ã‚¢ãƒã‚¿ãƒ¼æ•°ä¸Šé™" name="agent_limit_spin"/>
- <button label="?" name="agent_limit_help"/>
<spinner label="物体ボーナス" name="object_bonus_spin"/>
- <button label="?" name="object_bonus_help"/>
<text label="æˆäººæŒ‡å®š" name="access_text">
区分:
</text>
- <combo_box label="控ãˆã‚" name="access_combo">
- <combo_box.item label="Adult" name="Adult"/>
- <combo_box.item label="控ãˆã‚" name="Mature"/>
- <combo_box.item label="一般" name="PG"/>
- </combo_box>
- <button label="?" name="access_help"/>
+ <icons_combo_box label="Moderate" name="access_combo">
+ <icons_combo_box.item label="Adult" name="Adult" value="42"/>
+ <icons_combo_box.item label="Moderate" name="Mature" value="21"/>
+ <icons_combo_box.item label="General" name="PG" value="13"/>
+ </icons_combo_box>
<button label="é©ç”¨" name="apply_btn"/>
- <button label="ユーザー1人ホームテレãƒãƒ¼ãƒˆ" name="kick_btn"/>
- <button label="ユーザー全員ホームテレãƒãƒ¼ãƒˆ" name="kick_all_btn"/>
- <button label="メッセージを地域ã¸é€ä¿¡..." name="im_btn"/>
+ <button label="ä½äºº 1 åをホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ..." name="kick_btn"/>
+ <button label="ä½äººå…¨å“¡ã‚’ホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ..." name="kick_all_btn"/>
+ <button label="メッセージを地域ã«é€ä¿¡..." name="im_btn"/>
<button label="テレãƒãƒ–ã®ç®¡ç†..." name="manage_telehub_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_general_layout.xml b/indra/newview/skins/default/xui/ja/panel_region_general_layout.xml
index 9673953d06..188a60eb60 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_general_layout.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_general_layout.xml
@@ -1,21 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="リージョン(地域)" name="General">
<text name="region_text_lbl">
- リージョン:
+ 地域:
</text>
- <text name="region_text">
+ <text left_delta="70" name="region_text">
䏿˜Ž
</text>
<text name="version_channel_text_lbl">
ãƒãƒ¼ã‚¸ãƒ§ãƒ³ï¼š
</text>
- <text name="version_channel_text">
+ <text left_delta="70" name="version_channel_text">
䏿˜Ž
</text>
<text name="region_type_lbl">
種類:
</text>
- <text name="region_type">
+ <text left_delta="70" name="region_type">
䏿˜Ž
</text>
<check_box label="地形編集をブロック" name="block_terraform_check"/>
@@ -24,20 +24,20 @@
<check_box label="プッシュを制é™" name="restrict_pushobject"/>
<check_box label="土地ã®å†è²©ã‚’許å¯" name="allow_land_resell_check"/>
<check_box label="土地ã®çµ±åˆãƒ»åˆ†å‰²ã‚’許å¯" name="allow_parcel_changes_check"/>
- <check_box label="åœŸåœ°ã®æ¤œç´¢æ•™ç¤ºã‚’ブロック" name="block_parcel_search_check" tool_tip="ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã¨ãƒªãƒ¼ã‚¸ãƒ§ãƒ³å†…ã®åŒºç”»ã‚’æ¤œç´¢çµæžœã«è¡¨ç¤ºã™ã‚‹"/>
- <spinner label="ã‚¢ãƒã‚¿ãƒ¼æ•°ä¸Šé™" name="agent_limit_spin"/>
- <spinner label="オブジェクトボーナス" name="object_bonus_spin"/>
+ <check_box label="åœŸåœ°ã®æ¤œç´¢è¡¨ç¤ºã‚’ブロック" name="block_parcel_search_check" tool_tip="æ¤œç´¢çµæžœã§ã€ã“ã®åœ°åŸŸã¨åŒºç”»ã‚’表示ã™ã‚‹ã‹ã©ã†ã‹ã®è¨­å®šã§ã™"/>
+ <spinner label="ã‚¢ãƒã‚¿ãƒ¼æ•°ä¸Šé™" label_width="110" name="agent_limit_spin" width="190"/>
+ <spinner label="物体ボーナス" label_width="110" name="object_bonus_spin" width="190"/>
<text label="レーティング区分" name="access_text">
レーティング区分:
</text>
- <combo_box label="控ãˆã‚" name="access_combo">
- <combo_box.item label="アダルト" name="Adult"/>
- <combo_box.item label="控ãˆã‚" name="Mature"/>
- <combo_box.item label="一般" name="PG"/>
+ <combo_box label="Moderate" name="access_combo">
+ <combo_box.item label="Adult" name="Adult"/>
+ <combo_box.item label="Moderate" name="Mature"/>
+ <combo_box.item label="General" name="PG"/>
</combo_box>
<button label="é©ç”¨" name="apply_btn"/>
- <button label="ユーザー1åをホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ..." name="kick_btn"/>
- <button label="ユーザー全員をホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ..." name="kick_all_btn"/>
- <button label="リージョンã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡..." name="im_btn"/>
+ <button label="ä½äºº 1 åをホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ..." name="kick_btn"/>
+ <button label="ä½äººå…¨å“¡ã‚’ホームã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆ..." name="kick_all_btn"/>
+ <button label="メッセージを地域ã«é€ä¿¡..." name="im_btn"/>
<button label="テレãƒãƒ–ã®ç®¡ç†..." name="manage_telehub_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_terrain.xml b/indra/newview/skins/default/xui/ja/panel_region_terrain.xml
index d77f9749c2..8df803b2dc 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_terrain.xml
@@ -18,13 +18,13 @@
<button label="?" name="fixed_sun_help" />
<slider label="段階" name="sun_hour_slider" />
<button label="é©ç”¨" name="apply_btn" />
- <button label="RAW地形ダウンロード..." name="download_raw_btn"
- tool_tip="ä¸å‹•産オーナーã®ã¿åˆ©ç”¨å¯èƒ½ã€ç®¡ç†è€…ã¯åˆ©ç”¨ä¸å¯" />
+ <button label="RAW 地形ダウンロード..." name="download_raw_btn"
+ tool_tip="ä¸å‹•産オーナーã®ã¿åˆ©ç”¨å¯èƒ½ã€ç®¡ç†è€…ã¯åˆ©ç”¨ä¸å¯ã§ã™" />
<button label="?" name="download_raw_help" />
- <button label="RAW地形アップロード..." name="upload_raw_btn"
- tool_tip="ä¸å‹•産オーナーã®ã¿åˆ©ç”¨å¯èƒ½ã€ç®¡ç†è€…ã¯åˆ©ç”¨ä¸å¯" />
+ <button label="RAW 地形アップロード..." name="upload_raw_btn"
+ tool_tip="ä¸å‹•産オーナーã®ã¿åˆ©ç”¨å¯èƒ½ã€ç®¡ç†è€…ã¯åˆ©ç”¨ä¸å¯ã§ã™" />
<button label="?" name="upload_raw_help" />
<button label="åœ°å½¢ã®æ§‹ç¯‰" name="bake_terrain_btn"
- tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’上昇ï¼ä¸‹é™ç¯„囲ã®ä¸­é–“点ã¨ã—ã¦è¨­å®š" />
+ tool_tip="ç¾åœ¨ã®åœ°å½¢ã‚’上昇・下é™ç¯„囲ã®ä¸­é–“点ã¨ã—ã¦è¨­å®šã—ã¾ã™" />
<button label="?" name="bake_terrain_help" />
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_region_texture.xml b/indra/newview/skins/default/xui/ja/panel_region_texture.xml
index ea784df127..9e442ce091 100644
--- a/indra/newview/skins/default/xui/ja/panel_region_texture.xml
+++ b/indra/newview/skins/default/xui/ja/panel_region_texture.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="地é¢ãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼" name="Textures">
+<panel label="地é¢ãƒ†ã‚¯ã‚¹ãƒãƒ£" name="Textures">
<text name="region_text_lbl">
地域:
</text>
@@ -7,7 +7,7 @@
未知
</text>
<text name="detail_texture_text">
- 地形ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼ (512x512ã€24ビット .tgaファイルãŒå¿…è¦)
+ 地形ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ (512x512ã€24ビット .tgaファイルãŒå¿…è¦ã§ã™ï¼‰
</text>
<text name="height_text_lbl">
1(低)
@@ -19,22 +19,22 @@
3
</text>
<text name="height_text_lbl4">
- 4(高)
+ 4(高)
</text>
<text name="height_text_lbl5">
- テクスãƒãƒ£ãƒ¼æ¨™é«˜ç¯„囲
+ 地形テクスãƒãƒ£ã®éš†èµ·ç¯„囲
</text>
<text name="height_text_lbl6">
- å—西
+ 北西
</text>
<text name="height_text_lbl7">
- 北西
+ 北æ±
</text>
<text name="height_text_lbl8">
- å—æ±
+ å—西
</text>
<text name="height_text_lbl9">
- 北æ±
+ å—æ±
</text>
<spinner label="低" name="height_start_spin_0"/>
<spinner label="低" name="height_start_spin_1"/>
@@ -45,13 +45,14 @@
<spinner label="高" name="height_range_spin_2"/>
<spinner label="高" name="height_range_spin_3"/>
<text name="height_text_lbl10">
- 数値ã¯ä¸Šã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ãƒ–レンド範囲を示ã—ã¾ã™ã€‚
+ 数値ã¯ä¸Šã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ãŒèª¿å’Œã™ã‚‹ç¯„囲を示ã—ã¾ã™ã€‚
</text>
<text name="height_text_lbl11">
- 計測å˜ä½ã¯ãƒ¡ãƒ¼ãƒˆãƒ«ã§ã€ã€Œä½Žã€ã®å€¤ã¯ã€1番ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®é«˜ã•ã®ã€Œæœ€å¤§å€¤ã€ã§ã™ã€‚「高ã€ã®å€¤ã¯ã€4番ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®é«˜ã•ã®ã€Œæœ€ä½Žå€¤ã€ã§ã™ã€‚
+ 計測å˜ä½ã¯ãƒ¡ãƒ¼ãƒˆãƒ«ã§ã€ã€Œä½Žã€ã®å€¤ã¯ã€1番ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®é«˜ã•ã®
+「最大値ã€ã§ã™ã€‚「高ã€ã®å€¤ã¯ã€4番ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®é«˜ã•ã®ã€Œæœ€ä½Žå€¤ã€ã§ã™ã€‚
</text>
<text name="height_text_lbl12">
- ãã—ã¦ã€Œé«˜ã€ã®å€¤ã¯ãƒ†ã‚¯ã‚¹ãƒãƒ£ãƒ¼#4ã®é«˜ã•ã®ä¸‹é™ã¨ãªã‚Šã¾ã™ã€‚
+ ãã—ã¦ã€Œé«˜ã€ã®å€¤ã¯ãƒ†ã‚¯ã‚¹ãƒãƒ£#4ã®é«˜ã•ã®ä¸‹é™ã¨ãªã‚Šã¾ã™ã€‚
</text>
<button label="é©ç”¨" name="apply_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml
index e8b5be63ae..494884c187 100644
--- a/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_script_limits_my_avatar.xml
@@ -1,10 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="マイ ã‚¢ãƒã‚¿ãƒ¼" name="script_limits_my_avatar_panel">
+ <text name="script_memory">
+ ã‚¢ãƒã‚¿ãƒ¼ã®ã‚¹ã‚¯ãƒªãƒ—ト使用
+ </text>
<text name="loading_text">
ローディング...
</text>
<scroll_list name="scripts_list">
- <scroll_list.columns label="サイズ (kb)" name="size"/>
+ <scroll_list.columns label="サイズ (kb)" name="size" width="90"/>
<scroll_list.columns label="URL" name="urls"/>
<scroll_list.columns label="オブジェクトå" name="name"/>
<scroll_list.columns label="場所" name="location"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml
index fe0b44d8f4..d91eba9699 100644
--- a/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml
+++ b/indra/newview/skins/default/xui/ja/panel_script_limits_region_memory.xml
@@ -3,20 +3,18 @@
<text name="script_memory">
区画スクリプトメモリ
</text>
- <text name="parcels_listed">
- 区画所有者:
- </text>
- <text name="memory_used">
- 使用ã•れãŸãƒ¡ãƒ¢ãƒªï¼š
- </text>
+ <text name="parcels_listed"/>
+ <text name="memory_used"/>
<text name="loading_text">
ローディング...
</text>
<scroll_list name="scripts_list">
- <scroll_list.columns label="サイズ (kb)" name="size"/>
+ <scroll_list.columns label="サイズ (kb)" name="size" width="90"/>
+ <scroll_list.columns label="URL" name="urls"/>
<scroll_list.columns label="オブジェクトå" name="name"/>
- <scroll_list.columns label="ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…" name="owner"/>
- <scroll_list.columns label="区画・ä½ç½®" name="location"/>
+ <scroll_list.columns label="ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ‰€æœ‰è€…" name="owner" width="120"/>
+ <scroll_list.columns label="区画" name="parcel"/>
+ <scroll_list.columns label="場所" name="location"/>
</scroll_list>
<button label="リスト更新" name="refresh_list_btn"/>
<button label="ãƒã‚¤ãƒ©ã‚¤ãƒˆ" name="highlight_btn"/>
diff --git a/indra/newview/skins/default/xui/ja/panel_side_tray.xml b/indra/newview/skins/default/xui/ja/panel_side_tray.xml
index ce5f0b940c..3fd14ece06 100644
--- a/indra/newview/skins/default/xui/ja/panel_side_tray.xml
+++ b/indra/newview/skins/default/xui/ja/panel_side_tray.xml
@@ -2,26 +2,28 @@
<!-- Side tray cannot show background because it is always
partially on screen to hold tab buttons. -->
<side_tray name="sidebar">
- <sidetray_tab description="サイドãƒãƒ¼ã‚’表示・éžè¡¨ç¤º" name="sidebar_openclose"/>
- <sidetray_tab description="ホーム。" name="sidebar_home">
+ <sidetray_tab description="サイドãƒãƒ¼ã‚’表示・éžè¡¨ç¤º" name="sidebar_openclose" tab_title="サイドãƒãƒ¼ã‚’é–‹ã・閉ã˜ã‚‹"/>
+ <sidetray_tab description="ホーム。" name="sidebar_home" tab_title="ホーム">
<panel label="ホーム" name="panel_home"/>
</sidetray_tab>
- <sidetray_tab description="ã‚ãªãŸã®å…¬é–‹ãƒ—ロフィールã¨ãƒ”ックを編集ã—ã¦ãã ã•ã„。" name="sidebar_me">
- <panel label="ミー" name="panel_me"/>
+ <sidetray_tab description="ã‚ãªãŸã®å…¬é–‹ãƒ—ロフィールã¨ãƒ”ックを編集ã—ã¦ãã ã•ã„。" name="sidebar_me" tab_title="マイ プロフィール">
+ <panel_container name="panel_container">
+ <panel label="ミー" name="panel_me"/>
+ </panel_container>
</sidetray_tab>
- <sidetray_tab description="フレンドã€é€£çµ¡å…ˆã€è¿‘ãã®äººã‚’探ã—ã¦ãã ã•ã„。" name="sidebar_people">
+ <sidetray_tab description="フレンドã€é€£çµ¡å…ˆã€è¿‘ãã®äººã‚’探ã—ã¦ãã ã•ã„。" name="sidebar_people" tab_title="人">
<panel_container name="panel_container">
<panel label="グループ情報" name="panel_group_info_sidetray"/>
<panel label="ブロックã•れãŸä½äººã¨ã‚ªãƒ–ジェクト" name="panel_block_list_sidetray"/>
</panel_container>
</sidetray_tab>
- <sidetray_tab description="行ããŸã„場所ã€è¡Œã£ãŸã“ã¨ã®ã‚る場所を探ã—ã¦ãã ã•ã„。" label="場所" name="sidebar_places">
+ <sidetray_tab description="行ããŸã„場所ã€è¡Œã£ãŸã“ã¨ã®ã‚る場所を探ã—ã¦ãã ã•ã„。" label="場所" name="sidebar_places" tab_title="場所">
<panel label="場所" name="panel_places"/>
</sidetray_tab>
- <sidetray_tab description="ã‚ãªãŸã®æŒã¡ç‰©ã‚’眺ã‚ã¦ãã ã•ã„。" name="sidebar_inventory">
+ <sidetray_tab description="ã‚ãªãŸã®æŒã¡ç‰©ã‚’眺ã‚ã¦ãã ã•ã„。" name="sidebar_inventory" tab_title="æŒã¡ç‰©">
<panel label="æŒã¡ç‰©ã‚’編集" name="sidepanel_inventory"/>
</sidetray_tab>
- <sidetray_tab description="ã‚ãªãŸã®å®¹å§¿ã‚„ç¾åœ¨ã®è¦‹ãŸç›®ã‚’変更ã—ã¦ãã ã•ã„。" name="sidebar_appearance">
+ <sidetray_tab description="ã‚ãªãŸã®å®¹å§¿ã‚„ç¾åœ¨ã®è¦‹ãŸç›®ã‚’変更ã—ã¦ãã ã•ã„。" name="sidebar_appearance" tab_title="容姿">
<panel label="容姿ã®ç·¨é›†" name="sidepanel_appearance"/>
</sidetray_tab>
</side_tray>
diff --git a/indra/newview/skins/default/xui/ja/panel_sidetray_home_tab.xml b/indra/newview/skins/default/xui/ja/panel_sidetray_home_tab.xml
index aef1f90298..ea17cd6526 100644
--- a/indra/newview/skins/default/xui/ja/panel_sidetray_home_tab.xml
+++ b/indra/newview/skins/default/xui/ja/panel_sidetray_home_tab.xml
@@ -22,13 +22,13 @@
</text>
</panel>
<panel name="sidebar_appearance">
- <text name="tab_name" value="マイ 容姿"/>
+ <text name="tab_name" value="容姿"/>
<text name="tab_description">
ã‚ãªãŸã®å®¹å§¿ã‚„ç¾åœ¨ã®è¦‹ãŸç›®ã‚’変更ã—ã¾ã™ã€‚
</text>
</panel>
<panel name="sidebar_inventory">
- <text name="tab_name" value="マイ æŒã¡ç‰©"/>
+ <text name="tab_name" value="æŒã¡ç‰©"/>
<text name="tab_description">
ã‚ãªãŸã®æŒã¡ç‰©ã‚’眺ã‚ã¾ã™ã€‚
</text>
diff --git a/indra/newview/skins/default/xui/ja/panel_status_bar.xml b/indra/newview/skins/default/xui/ja/panel_status_bar.xml
index 063e584762..c3a5127981 100644
--- a/indra/newview/skins/default/xui/ja/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/ja/panel_status_bar.xml
@@ -21,10 +21,13 @@
<panel.string name="buycurrencylabel">
L$ [AMT]
</panel.string>
- <button label="" label_selected="" name="buycurrency" tool_tip="ç§ã®æ®‹é«˜"/>
- <button label="L$ ã®è³¼å…¥" name="buyL" tool_tip="クリックã—㦠L$ を購入ã—ã¾ã™"/>
+ <panel name="balance_bg">
+ <text name="balance" tool_tip="残高" value="L$20"/>
+ <button label="L$ ã®è³¼å…¥" name="buyL" tool_tip="クリックã—㦠L$ を購入ã—ã¾ã™"/>
+ </panel>
<text name="TimeText" tool_tip="ç¾åœ¨æ™‚刻(太平洋)">
- 12:00 AM
+ 24:00 AM PST
</text>
+ <button name="media_toggle_btn" tool_tip="ã™ã¹ã¦ã®ãƒ¡ãƒ‡ã‚£ã‚¢ã‚’é–‹å§‹ãƒ»åœæ­¢ï¼ˆéŸ³æ¥½ã€ãƒ“デオã€Web ページ)"/>
<button name="volume_btn" tool_tip="グローãƒãƒ«éŸ³é‡è¨­å®š"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_teleport_history.xml b/indra/newview/skins/default/xui/ja/panel_teleport_history.xml
index 2264ae965b..c1bf81f7e7 100644
--- a/indra/newview/skins/default/xui/ja/panel_teleport_history.xml
+++ b/indra/newview/skins/default/xui/ja/panel_teleport_history.xml
@@ -12,6 +12,6 @@
<accordion_tab name="6_months_and_older" title="åŠå¹´ä»¥ä¸Šå‰"/>
</accordion>
<panel label="bottom_panel" name="bottom_panel">
- <button name="gear_btn" tool_tip="ãã®ä»–ã®ã‚ªãƒ—ションを表示"/>
+ <button name="gear_btn" tool_tip="オプションを表示ã—ã¾ã™"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_voice_effect.xml b/indra/newview/skins/default/xui/ja/panel_voice_effect.xml
new file mode 100644
index 0000000000..d787d6ff23
--- /dev/null
+++ b/indra/newview/skins/default/xui/ja/panel_voice_effect.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_voice_effect">
+ <string name="no_voice_effect">
+ ボイスモーフィングãªã—
+ </string>
+ <string name="preview_voice_effects">
+ ボイスモーフィングをプレビュー ▶
+ </string>
+ <string name="get_voice_effects">
+ ボイスモーフィングをå–å¾— â–¶
+ </string>
+ <combo_box name="voice_effect" tool_tip="ãƒœã‚¤ã‚¹ãƒ¢ãƒ¼ãƒ•ã‚£ãƒ³ã‚°åŠ¹æžœã‚’é¸æŠžã—ã¦ã€éŸ³å£°ã‚’変更ã—ã¾ã™ã€‚">
+ <combo_box.item label="ボイスモーフィングãªã—" name="no_voice_effect"/>
+ </combo_box>
+</panel>
diff --git a/indra/newview/skins/default/xui/ja/panel_world_map.xml b/indra/newview/skins/default/xui/ja/panel_world_map.xml
index 2f5c2bf6a1..8ff853193a 100644
--- a/indra/newview/skins/default/xui/ja/panel_world_map.xml
+++ b/indra/newview/skins/default/xui/ja/panel_world_map.xml
@@ -30,6 +30,12 @@
<panel.string name="world_map_northwest">
北西
</panel.string>
+ <panel.string name="world_map_person">
+ 1 人
+ </panel.string>
+ <panel.string name="world_map_people">
+ [NUMBER] 人
+ </panel.string>
<text label="北" name="floater_map_north" text="北">
北
</text>
diff --git a/indra/newview/skins/default/xui/ja/role_actions.xml b/indra/newview/skins/default/xui/ja/role_actions.xml
index 59fceca2db..0a63cedf10 100644
--- a/indra/newview/skins/default/xui/ja/role_actions.xml
+++ b/indra/newview/skins/default/xui/ja/role_actions.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<role_actions>
- <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—・メンãƒãƒ¼ã‚’è¿½åŠ ã€æŽ’é™¤ã—ã€æ‹›å¾…状ãªã—ã«æ–°ãƒ¡ãƒ³ãƒãƒ¼ã®å‚加をèªã‚る権é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Membership">
+ <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—メンãƒãƒ¼ã‚’è¿½åŠ ã€æŽ’é™¤ã—ã€æ‹›å¾…状ãªã—ã«æ–°ãƒ¡ãƒ³ãƒãƒ¼ã®å‚加をèªã‚る権é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Membership">
<action description="ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«äººã‚’招待" longdescription="「役割ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã®ã€Œãƒ¡ãƒ³ãƒãƒ¼ã€ã‚¿ãƒ–内ã«ã‚る「招待ã€ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’招待ã—ã¾ã™ã€‚" name="member invite" value="1"/>
<action description="メンãƒãƒ¼ã‚’ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰è¿½æ”¾" longdescription="「役割ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã®ã€Œãƒ¡ãƒ³ãƒãƒ¼ã€ã‚¿ãƒ–内ã«ã‚る「追放ã€ãƒœã‚¿ãƒ³ã‚’押ã—ã¦ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰ãƒ¡ãƒ³ãƒãƒ¼ã‚’追放ã—ã¾ã™ã€‚ 「オーナーã€ã¯ã€ä»–ã®ã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ä»¥å¤–ã¯èª°ã§ã‚‚追放ã§ãã¾ã™ã€‚ 「オーナーã€ã§ã¯ãªã„人ãŒã€Œå…¨å“¡ï¼ˆEveryone)ã€ã«ã—ã‹å½¹å‰²ãŒãªã„å ´åˆã€ãƒ¡ãƒ³ãƒãƒ¼ã¯ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰è¿½æ”¾ã•れるã“ã¨ãŒã‚りã¾ã™ã€‚ 「役割ã€ã‹ã‚‰ãƒ¡ãƒ³ãƒãƒ¼ã‚’削除ã™ã‚‹ã«ã¯ã€ã€Œå½¹å‰²ã‹ã‚‰ãƒ¡ãƒ³ãƒãƒ¼ã‚’削除ã€ã®èƒ½åŠ›ãŒä¸Žãˆã‚‰ã‚Œã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" name="member eject" value="2"/>
<action description="「自由å‚加ã€ã¨ã€Œå…¥ä¼šè²»ã€ã®åˆ‡ã‚Šæ›¿ãˆ" longdescription="「自由å‚加ã€ã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã¨ã€æ‹›å¾…ã•れãªãã¦ã‚‚æ–°ã—ã„メンãƒãƒ¼ãŒå…¥ä¼šã§ãã¾ã™ã€‚「入会費ã€ã¯ã€Œä¸€èˆ¬ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã§å¤‰æ›´ã—ã¾ã™ã€‚" name="member options" value="3"/>
@@ -8,29 +8,29 @@
<action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—内ã®å½¹å‰²ã‚’追加ã€å‰Šé™¤ã€å¤‰æ›´ã—ã€å½¹å‰²ã«ãƒ¡ãƒ³ãƒãƒ¼ã‚’追加ã€å‰Šé™¤ã—ã€ã•らã«å½¹å‰²ã¸èƒ½åŠ›ã‚’å‰²ã‚Šå½“ã¦ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Roles">
<action description="æ–°ã—ã„役割を作æˆ" longdescription="æ–°ã—ã„「役割ã€ã¯ã€ã€Œå½¹å‰²ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ &gt; 「役割ã€ã‚¿ãƒ–ã§ä½œæˆã—ã¾ã™ã€‚" name="role create" value="4"/>
<action description="役割を削除" longdescription="「役割ã€ã¯ã€ã€Œå½¹å‰²ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ &gt; 「役割ã€ã‚¿ãƒ–ã§å‰Šé™¤ã§ãã¾ã™ã€‚" name="role delete" value="5"/>
- <action description="「役割ã€ã®åå‰ã€è‚©æ›¸ãã€èª¬æ˜Žã€ãƒ¡ãƒ³ãƒãƒ¼å…¬é–‹ã®æœ‰ç„¡ã‚’変更" longdescription="「役割ã€ã®åå‰ã€è‚©æ›¸ãã€èª¬æ˜Žã€ãƒ¡ãƒ³ãƒãƒ¼å…¬é–‹ã®æœ‰ç„¡ã‚’変更ã—ã¾ã™ã€‚ 「役割ã€ã‚’é¸æŠžå¾Œã«ã€ã€Œå½¹å‰²ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ &gt; 「役割ã€ã‚¿ãƒ– ã®ä¸‹ã§è¨­å®šã§ãã¾ã™ã€‚" name="role properties" value="6"/>
+ <action description="「役割ã€ã®åå‰ã€ã‚¿ã‚¤ãƒˆãƒ«ã€èª¬æ˜Žã€ãƒ¡ãƒ³ãƒãƒ¼å…¬é–‹ã®æœ‰ç„¡ã‚’変更" longdescription="「役割ã€ã®åå‰ã€ã‚¿ã‚¤ãƒˆãƒ«ã€èª¬æ˜Žã€ãƒ¡ãƒ³ãƒãƒ¼å…¬é–‹ã®æœ‰ç„¡ã‚’変更ã—ã¾ã™ã€‚ 「役割ã€ã‚’é¸æŠžå¾Œã«ã€ã€Œå½¹å‰²ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ &gt; 「役割ã€ã‚¿ãƒ– ã®ä¸‹ã§è¨­å®šã§ãã¾ã™ã€‚" name="role properties" value="6"/>
<action description="メンãƒãƒ¼ã‚’割り当ã¦äººã®å½¹å‰²ã«å‰²ã‚Šå½“ã¦ã‚‹" longdescription="「割り当ã¦ã‚‰ã‚ŒãŸå½¹å‰²ã€ï¼ˆã€Œå½¹å‰²ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ &gt; 「メンãƒãƒ¼ã€ã‚¿ãƒ–)ã®ãƒªã‚¹ãƒˆã§ã€ãƒ¡ãƒ³ãƒãƒ¼ã‚’「役割ã€ã«å‰²ã‚Šå½“ã¦ã¾ã™ã€‚ ã“ã®èƒ½åŠ›ãŒã‚るメンãƒãƒ¼ã¯ã€å‰²ã‚Šå½“ã¦ã‚‹äººãŒæ—¢ã«æ‰€å±žã™ã‚‹ã€Œå½¹å‰²ã€ã«ã®ã¿ãƒ¡ãƒ³ãƒãƒ¼ã‚’追加ã§ãã¾ã™ã€‚" name="role assign member limited" value="7"/>
<action description="メンãƒãƒ¼ã‚’ä»»æ„ã®å½¹å‰²ã«å‰²ã‚Šå½“ã¦ã‚‹" longdescription="「割り当ã¦ã‚‰ã‚ŒãŸå½¹å‰²ã€ï¼ˆã€Œå½¹å‰²ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ &gt; 「メンãƒãƒ¼ã€ã‚¿ãƒ–)ã®ãƒªã‚¹ãƒˆã§ã€ãƒ¡ãƒ³ãƒãƒ¼ã‚’ã©ã®ã€Œå½¹å‰²ã€ã«ã‚‚割り当ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ *警告* ã“ã®ã€Œèƒ½åŠ›ã€ãŒã‚る「役割ã€ã‚’æŒã¤ãƒ¡ãƒ³ãƒãƒ¼ãªã‚‰èª°ã§ã‚‚自分自身ã¨ã€ä»–ã®ã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ä»¥å¤–ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚’ç¾åœ¨ä»¥ä¸Šã®æ¨©é™ã®ã‚る「役割ã€ã«å‰²ã‚Šå½“ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã¤ã¾ã‚Šã€ã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ä»¥å¤–ã®äººãŒã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ã«è¿‘ã„力をæŒã¤ã‚ˆã†è¨­å®šã§ãã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚ ã“ã®ã€Œèƒ½åŠ›ã€ã‚’割り当ã¦ã‚‹å‰ã«ã€è‡ªåˆ†ãŒã—よã†ã¨ã—ã¦ã„ã‚‹ã“ã¨ã‚’ã‚ˆãæŠŠæ¡ã—ã¦ãã ã•ã„。" name="role assign member" value="8"/>
<action description="役割ã‹ã‚‰ãƒ¡ãƒ³ãƒãƒ¼ã‚’解除" longdescription="「割り当ã¦ã‚‰ã‚ŒãŸå½¹å‰²ã€ï¼ˆã€Œå½¹å‰²ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ &gt; 「メンãƒãƒ¼ã€ã‚¿ãƒ–)ã®ãƒªã‚¹ãƒˆã§ã€ãƒ¡ãƒ³ãƒãƒ¼ã‚’「役割ã€ã‹ã‚‰å‰Šé™¤ã—ã¾ã™ã€‚ 「オーナーã€ã¯å‰Šé™¤ã§ãã¾ã›ã‚“。" name="role remove member" value="9"/>
<action description="役割ã®èƒ½åŠ›ã®å‰²ã‚Šå½“ã¦ã¨è§£é™¤" longdescription="「許å¯ã•れãŸèƒ½åŠ›ã€ï¼ˆã€Œå½¹å‰²ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ &gt; 「役割ã€ã‚¿ãƒ–)ã®ãƒªã‚¹ãƒˆã«ã‚ã‚‹ã€å„「役割ã€ã®ã€Œèƒ½åŠ›ã€ã‚’割り当ã¦ãŸã‚Šã€å‰Šé™¤ã—ã¾ã™ã€‚ *警告* ã“ã®ã€Œèƒ½åŠ›ã€ãŒã‚る「役割ã€ã‚’æŒã¤ãƒ¡ãƒ³ãƒãƒ¼ãªã‚‰èª°ã§ã‚‚自分自身ã¨ã€ä»–ã®ã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ä»¥å¤–ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚’ã™ã¹ã¦ã®ã€Œèƒ½åŠ›ã€ã€ã«å‰²ã‚Šå½“ã¦ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã¤ã¾ã‚Šã€ã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ä»¥å¤–ã®äººãŒã€Œã‚ªãƒ¼ãƒŠãƒ¼ã€ã«è¿‘ã„æ¨©é™ã‚’æŒã¤ã‚ˆã†è¨­å®šã§ãã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚ ã“ã®ã€Œèƒ½åŠ›ã€ã‚’割り当ã¦ã‚‹å‰ã«ã€è‡ªåˆ†ãŒã—よã†ã¨ã—ã¦ã„ã‚‹ã“ã¨ã‚’ã‚ˆãæŠŠæ¡ã—ã¦ãã ã•ã„。" name="role change actions" value="10"/>
</action_set>
<action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ã®å…¬é–‹æ€§ã‚„ç†å¿µã€è¨˜ç« ã®å¤‰æ›´ã¨ã„ã£ãŸã€ã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚¢ã‚¤ãƒ‡ãƒ³ãƒ†ã‚£ãƒ†ã‚£ã‚’修正ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Group Identity">
- <action description="ç†å¿µã€è¨˜ç« ã€ã€ŒWeb上ã§å…¬é–‹ã€ã€ãŠã‚ˆã³ã‚°ãƒ«ãƒ¼ãƒ—情報内ã§å…¬é–‹ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚’変更。" longdescription="ç†å¿µã€è¨˜ç« ã€ã€Œæ¤œç´¢ã«è¡¨ç¤ºã€ã®å¤‰æ›´ã‚’ã—ã¾ã™ã€‚ 「一般ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã§è¡Œãˆã¾ã™ã€‚" name="group change identity" value="11"/>
+ <action description="ç†å¿µã€è¨˜ç« ã€ã€ŒWeb 上ã§å…¬é–‹ã€ã€ãŠã‚ˆã³ã‚°ãƒ«ãƒ¼ãƒ—情報内ã§å…¬é–‹ã®ãƒ¡ãƒ³ãƒãƒ¼ã‚’変更。" longdescription="ç†å¿µã€è¨˜ç« ã€ã€Œæ¤œç´¢ã«è¡¨ç¤ºã€ã®å¤‰æ›´ã‚’ã—ã¾ã™ã€‚ 「一般ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã§è¡Œãˆã¾ã™ã€‚" name="group change identity" value="11"/>
</action_set>
<action_set description="ã“れらã®ã€Œèƒ½åŠ›ã€ã«ã¯ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®æ‰€æœ‰åœ°ã®è­²æ¸¡ã€ä¿®æ­£ã€è²©å£²ã‚’ã™ã‚‹æ¨©é™ãŒã‚りã¾ã™ã€‚ 「土地情報ã€ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’見るã«ã¯ã€åœ°é¢ã‚’å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€ŒåœŸåœ°æƒ…å ±ã€ã‚’é¸ã¶ã‹ã€ãƒŠãƒ“ゲーションãƒãƒ¼ã®ã€Œiã€ã‚¢ã‚¤ã‚³ãƒ³ã‚’クリックã—ã¾ã™ã€‚" name="Parcel Management">
<action description="グループ用ã®åœŸåœ°ã®è­²æ¸¡ã¨è³¼å…¥" longdescription="グループ用ã®åœŸåœ°ã®è­²æ¸¡ã¨è³¼å…¥ã‚’行ã„ã¾ã™ã€‚ ã“ã®æ“作ã«ã¯ã€åœŸåœ°æƒ…å ±ç”»é¢ ï¼ž 一般タブを使ã„ã¾ã™ã€‚" name="land deed" value="12"/>
- <action description="Lindenç·ç£ã«åœŸåœ°ã‚’æ˜Žã‘æ¸¡ã™" longdescription="Lindenç·ç£ã«åœŸåœ°ã‚’æ˜Žã‘æ¸¡ã—ã¾ã™ã€‚ *警告* ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œä¸€èˆ¬ã€ã§ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åœŸåœ°ã‚’放棄ã—ã¦ã€å£²ã‚Šä¸Šã’ãªã—ã§Lindenç·ç£ã«æ˜Žã‘渡ã™ã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®èƒ½åŠ›ã®å‰²ã‚Šå½“ã¦ã¯ã€ãã®ã“ã¨ã‚’ç†è§£ã—ãŸä¸Šã§è¡Œã£ã¦ãã ã•ã„。" name="land release" value="13"/>
+ <action description="リンデンç·ç£ã«åœŸåœ°ã‚’æ˜Žã‘æ¸¡ã™" longdescription="リンデンç·ç£ã«åœŸåœ°ã‚’æ˜Žã‘æ¸¡ã—ã¾ã™ã€‚ *警告* ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œä¸€èˆ¬ã€ã§ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åœŸåœ°ã‚’放棄ã—ã¦ã€å£²ã‚Šä¸Šã’ãªã—ã§ãƒªãƒ³ãƒ‡ãƒ³ç·ç£ã«æ˜Žã‘渡ã™ã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®èƒ½åŠ›ã®å‰²ã‚Šå½“ã¦ã¯ã€ãã®ã“ã¨ã‚’ç†è§£ã—ãŸä¸Šã§è¡Œã£ã¦ãã ã•ã„。" name="land release" value="13"/>
<action description="売り地情報ã®è¨­å®š" longdescription="売り地情報を設定ã—ã¾ã™ã€‚ *警告* ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œä¸€èˆ¬ã€ã‚¿ãƒ–ã§ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åœŸåœ°ã‚’è‡ªåˆ†ã®æ€ã„ã©ãŠã‚Šã«è²©å£²ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®èƒ½åŠ›ã®å‰²ã‚Šå½“ã¦ã¯ã€ãã®ã“ã¨ã‚’ç†è§£ã—ãŸä¸Šã§è¡Œã£ã¦ãã ã•ã„。" name="land set sale info" value="14"/>
<action description="区画ã®å†åˆ†å‰²ã¨çµ±åˆ" longdescription="区画をå†åˆ†å‰²ã€çµ±åˆã—ã¾ã™ã€‚ 地é¢ã‚’å³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€Œåœ°å½¢ã‚’編集ã€ã‚’é¸ã³ã€ãƒžã‚¦ã‚¹ã‚’土地ã®ä¸Šã§ãƒ‰ãƒ©ãƒƒã‚°ã—ã¦ç¯„å›²ã‚’é¸æŠžã—ã¾ã™ã€‚ å†åˆ†å‰²ã™ã‚‹ã«ã¯ã€åˆ†å‰²å¯¾è±¡ã‚’é¸ã‚“ã§ã€Œå†åˆ†å‰²ã€ã‚’クリックã—ã¾ã™ã€‚ çµ±åˆã™ã‚‹ã«ã¯ã€2ã¤ä»¥ä¸Šã®éš£æŽ¥ã™ã‚‹åŒºç”»ã‚’é¸ã‚“ã§ã€Œçµ±åˆã€ã‚’クリックã—ã¾ã™ã€‚" name="land divide join" value="15"/>
</action_set>
- <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€åŒºç”»åã€å…¬é–‹è¨­å®šã€æ¤œç´¢ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¸ã®ç™»éŒ²ã€ç€åœ°ç‚¹ãªã‚‰ã³ã«TPルートã®ã‚ªãƒ—ションを変更ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Parcel Identity">
+ <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€åŒºç”»åã€å…¬é–‹è¨­å®šã€æ¤œç´¢ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¸ã®ç™»éŒ²ã€ç€åœ°ç‚¹ãªã‚‰ã³ã« TP ルートã®ã‚ªãƒ—ションを変更ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Parcel Identity">
<action description="「場所検索ã«è¡¨ç¤ºã€ã‚’切り替ãˆã‚«ãƒ†ã‚´ãƒªã‚’設定" longdescription="「場所検索ã«è¡¨ç¤ºã€ã«åˆ‡ã‚Šæ›¿ãˆã€ã€ŒåœŸåœ°æƒ…報〠&gt; 「オプションã€ã‚¿ãƒ–ã§åŒºç”»ã®ã‚«ãƒ†ã‚´ãƒªã‚’設定ã—ã¾ã™ã€‚" name="land find places" value="17"/>
<action description="区画åã€èª¬æ˜Žã€ã€Œå ´æ‰€æ¤œç´¢ã«è¡¨ç¤ºã€ã®è¨­å®šã‚’変更" longdescription="区画åã€èª¬æ˜Žã€ã€Œå ´æ‰€æ¤œç´¢ã«è¡¨ç¤ºã€ã®è¨­å®šã‚’変更ã—ã¾ã™ã€‚ 「土地情報〠&gt; 「オプションã€ã‚¿ãƒ–ã§è¡Œã„ã¾ã™ã€‚" name="land change identity" value="18"/>
- <action description="ç€åœ°ç‚¹ãŠã‚ˆã³ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ»ãƒ«ãƒ¼ãƒˆã‚’設定" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åŒºç”»ä¸Šã§ç€åœ°ç‚¹ã‚’設定ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šå¤–部ã‹ã‚‰ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã®åˆ°ç€ä½ç½®ã‚’指定ã§ãã‚‹ã¨å…±ã«ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ»ãƒ«ãƒ¼ãƒˆã‚’設定ã—ã¦ç´°ã‹ã制御ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®æ“作ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ—ションã€ã‚¿ãƒ–ã§è¡Œã„ã¾ã™ã€‚" name="land set landing point" value="19"/>
+ <action description="ç€åœ°ç‚¹ãŠã‚ˆã³ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ«ãƒ¼ãƒˆã‚’設定" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åŒºç”»ä¸Šã§ç€åœ°ç‚¹ã‚’設定ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šå¤–部ã‹ã‚‰ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã®åˆ°ç€ä½ç½®ã‚’指定ã§ãã‚‹ã¨å…±ã«ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ«ãƒ¼ãƒˆã‚’設定ã—ã¦ç´°ã‹ã制御ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ ã“ã®æ“作ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ—ションã€ã‚¿ãƒ–ã§è¡Œã„ã¾ã™ã€‚" name="land set landing point" value="19"/>
</action_set>
<action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã€Œã‚ªãƒ–ジェクトを作æˆã€ã€ã€Œåœ°å½¢ã‚’編集ã€ã€éŸ³æ¥½ã¨ãƒ¡ãƒ‡ã‚£ã‚¢ã®è¨­å®šãªã©ã€åŒºç”»ã®ã‚ªãƒ—ションã«é–¢é€£ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Parcel Settings">
- <action description="音楽ã¨ãƒ¡ãƒ‡ã‚£ã‚¢ã®è¨­å®šã‚’変更" longdescription="ストリーミング・ミュージックã¨å‹•ç”»ã®è¨­å®šã‚’変更ã™ã‚‹ã«ã¯ã€ã€ŒåœŸåœ°æƒ…報〠> 「メディアã€ã‚¿ãƒ–を使ã„ã¾ã™ã€‚" name="land change media" value="20"/>
- <action description="「地形を編集ã€ã«åˆ‡ã‚Šæ›¿ãˆ" longdescription="「地形を編集ã€ã«åˆ‡ã‚Šæ›¿ãˆã¾ã™ã€‚ *警告* 「土地情報ã€ï¼žã€Œã‚ªãƒ—ションã€ï¼žã€Œåœ°å½¢ã‚’編集ã€ã®é †ã§é€²ã‚€ã¨ã€èª°ã§ã‚‚ã‚ãªãŸã®åœŸåœ°ã®å½¢ã®æ•´å‚™ã‚„ã€ãƒªãƒ³ãƒ‡ãƒ³ãƒ—ラントã®è¨­ç½®ã€ç§»å‹•ãŒã§ãã¾ã™ã€‚ ã“ã®èƒ½åŠ›ã‚’å‰²ã‚ŠæŒ¯ã‚‹å‰ã«ã€ã“ã®ã“ã¨ã‚’よãç†è§£ã—ã¦ãŠã„ã¦ãã ã•ã„。 「土地情報ã€ï¼žã€Œã‚ªãƒ—ションã€ã‚¿ãƒ–ã‹ã‚‰ã€Œåœ°å½¢ã‚’編集ã€ã«åˆ‡ã‚Šæ›¿ãˆã‚‰ã‚Œã¾ã™ã€‚" name="land edit" value="21"/>
+ <action description="音楽ã¨ãƒ¡ãƒ‡ã‚£ã‚¢ã®è¨­å®šã‚’変更" longdescription="ストリーミングミュージックã¨å‹•ç”»ã®è¨­å®šã‚’変更ã™ã‚‹ã«ã¯ã€ã€ŒåœŸåœ°æƒ…報〠> 「メディアã€ã‚¿ãƒ–を使ã„ã¾ã™ã€‚" name="land change media" value="20"/>
+ <action description="「地形を編集ã€ã«åˆ‡ã‚Šæ›¿ãˆ" longdescription="「地形を編集ã€ã«åˆ‡ã‚Šæ›¿ãˆã¾ã™ã€‚ *警告* 「土地情報ã€ï¼žã€Œã‚ªãƒ—ションã€ï¼žã€Œåœ°å½¢ã‚’編集ã€ã®é †ã§é€²ã‚€ã¨ã€èª°ã§ã‚‚ã‚ãªãŸã®åœŸåœ°ã®å½¢ã®æ•´å‚™ã‚„ã€ãƒªãƒ³ãƒ‡ãƒ³è£½ã®æ¨¹æœ¨ã®è¨­ç½®ã€ç§»å‹•ãŒã§ãã¾ã™ã€‚ ã“ã®èƒ½åŠ›ã‚’å‰²ã‚ŠæŒ¯ã‚‹å‰ã«ã€ã“ã®ã“ã¨ã‚’よãç†è§£ã—ã¦ãŠã„ã¦ãã ã•ã„。 「土地情報ã€ï¼žã€Œã‚ªãƒ—ションã€ã‚¿ãƒ–ã‹ã‚‰ã€Œåœ°å½¢ã‚’編集ã€ã«åˆ‡ã‚Šæ›¿ãˆã‚‰ã‚Œã¾ã™ã€‚" name="land edit" value="21"/>
<action description="「土地情報ã€ï¼žã€Œã‚ªãƒ—ションã€ã‚¿ãƒ–内ã®ã•ã¾ã–ã¾ãªè¨­å®šã‚’切り替ãˆ" longdescription="「安全(ダメージãªã—)ã€ã€ã€Œé£›è¡Œã€ã‚’切り替ãˆã€ä½äººã«ä»¥ä¸‹ã‚’許å¯ã—ã¾ã™ï¼š グループ所有地ã®ã€ŒåœŸåœ°æƒ…報〠&gt; 「オプションã€ã‚¿ãƒ–内ã®ã€ã€Œåœ°å½¢ã‚’編集ã€ã€ã€Œåˆ¶ä½œã€ã€ã€Œãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã®ä½œæˆã€ã€ã€Œã‚¹ã‚¯ãƒªãƒ—トã®å®Ÿè¡Œã€ã€‚" name="land options" value="22"/>
</action_set>
<action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åŒºç”»ã«é–¢ã™ã‚‹è¦åˆ¶ã‚’迂回ã™ã‚‹ã“ã¨ã‚’ã€ãƒ¡ãƒ³ãƒãƒ¼ã«è¨±å¯ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Parcel Powers">
@@ -41,24 +41,24 @@
<action description="グループã®åœŸåœ°ã¸ã®ã€Œãƒ›ãƒ¼ãƒ è¨­å®šã€ã‚’許å¯" longdescription="ã“ã®ã€Œå½¹å‰²ã€ã‚’æŒã¤ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã«è­²æ¸¡ã•れãŸåŒºç”»ä¸Šã§ã€Œä¸–界ã€ãƒ¡ãƒ‹ãƒ¥ãƒ¼ &gt; ランドマーク &gt; ç¾åœ¨åœ°ã‚’ホームã«è¨­å®š を使用ã—ã¦ã€ãƒ›ãƒ¼ãƒ ã®è¨­å®šã‚’行ã†ã“ã¨ãŒã§ãã¾ã™ã€‚" name="land allow set home" value="28"/>
</action_set>
<action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ä½äººã®å‡çµã‚„追放をå«ã‚€ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®åŒºç”»ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’許å¯ã€åˆ¶é™ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Parcel Access">
- <action description="区画アクセス・リストã®ç®¡ç†" longdescription="区画アクセス・リストã®ç®¡ç†ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚¢ã‚¯ã‚»ã‚¹ã€ã‚¿ãƒ–ã§è¡Œã„ã¾ã™ã€‚" name="land manage allowed" value="29"/>
+ <action description="区画アクセスリストã®ç®¡ç†" longdescription="区画アクセス・リストã®ç®¡ç†ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚¢ã‚¯ã‚»ã‚¹ã€ã‚¿ãƒ–ã§è¡Œã„ã¾ã™ã€‚" name="land manage allowed" value="29"/>
<action description="åŒºç”»ç¦æ­¢ãƒªã‚¹ãƒˆã®ç®¡ç†" longdescription="「土地情報〠&gt; 「アクセスã€ã‚¿ãƒ–ã®ã€åŒºç”»ã®ç¦æ­¢ãƒªã‚¹ãƒˆã®ç®¡ç†ãŒã§ãã¾ã™ã€‚" name="land manage banned" value="30"/>
<action description="「入場許å¯ã‚’販売ã€ã®è¨­å®šã‚’変更" longdescription="「土地情報〠&gt; 「アクセスã€ã‚¿ãƒ–ã§ã€åŒºç”»ã®ã€Œå…¥å ´è¨±å¯ã‚’販売ã€ã®è¨­å®šã‚’変更ã—ã¾ã™ã€‚" name="land manage passes" value="31"/>
- <action description="区画上ã®ä½äººã®è¿½æ”¾ã¨å‡çµ" longdescription="ã“ã®ã€Œèƒ½åŠ›ã€ã‚’æŒã¤ã€Œå½¹å‰²ã€ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有地ã«ã„ã¦æ¬²ã—ããªã„ä½äººã‚’å³ã‚¯ãƒªãƒƒã‚¯ã—ã€ã€Œè¿½æ”¾ã€ã‚„「フリーズã€ã‚’é¸ã‚“ã§å¯¾å¿œã§ãã¾ã™ã€‚" name="land admin" value="32"/>
+ <action description="区画上ã®ä½äººã®è¿½æ”¾ã¨ãƒ•リーズ" longdescription="ã“ã®ã€Œèƒ½åŠ›ã€ã‚’æŒã¤ã€Œå½¹å‰²ã€ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有地ã«ã„ã¦æ¬²ã—ããªã„ä½äººã‚’å³ã‚¯ãƒªãƒƒã‚¯ã—ã€ã€Œè¿½æ”¾ã€ã‚„「フリーズã€ã‚’é¸ã‚“ã§å¯¾å¿œã§ãã¾ã™ã€‚" name="land admin" value="32"/>
</action_set>
<action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚ªãƒ–ジェクトã®è¿”å´ã€ãƒªãƒ³ãƒ‡ãƒ³ãƒ—ラントã®è¨­ç½®ã‚„移動をã€ãƒ¡ãƒ³ãƒãƒ¼ã«è¨±å¯ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚ ã“れã¯ãƒ¡ãƒ³ãƒãƒ¼ãŒã‚´ãƒŸå‡¦ç†ã‚„景観作æˆã‚’ã™ã‚‹éš›ã«ä¾¿åˆ©ã§ã™ãŒã€è¿”å´ã—ãŸã‚ªãƒ–ジェクトã¯å…ƒã«æˆ»ã›ãªã„ã®ã§ã€æ³¨æ„ã—ã¦è¡Œã„ã¾ã—ょã†ã€‚" name="Parcel Content">
<action description="グループ所有オブジェクトã®è¿”å´" longdescription="グループ所有ã®åŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®ã‚ªãƒ–ジェクトを返å´ã™ã‚‹ã«ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ–ジェクトã€ã‚¿ãƒ–を使ã„ã¾ã™ã€‚" name="land return group owned" value="48"/>
<action description="グループã«è¨­å®šã•れã¦ã„るオブジェクトを返å´" longdescription="グループ所有ã®åŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã‚°ãƒ«ãƒ¼ãƒ—ã«è¨­å®šã•れã¦ã„るオブジェクトを返å´ã™ã‚‹ã«ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ–ジェクトã€ã‚¿ãƒ–を使ã„ã¾ã™ã€‚" name="land return group set" value="33"/>
- <action description="éžã‚°ãƒ«ãƒ¼ãƒ—・オブジェクトã®è¿”å´" longdescription="グループ所有ã®åŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã‚°ãƒ«ãƒ¼ãƒ—以外ã®ã‚ªãƒ–ジェクトを返å´ã™ã‚‹ã«ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ–ジェクトã€ã‚¿ãƒ–を使ã„ã¾ã™ã€‚" name="land return non group" value="34"/>
- <action description="Lindenè£½ã®æ¤ç‰©ã‚’使用ã—ã¦æ™¯è¦³ä½œæˆ" longdescription="ãƒªãƒ³ãƒ‡ãƒ³è£½ã®æ¨¹æœ¨ã€æ¤ç‰©ã€è‰ã‚’æ¤ãˆã‚‹ã€æ™¯è¦³ã¥ãりã®èƒ½åŠ›ã§ã™ã€‚ ã“ã‚Œã‚‰ã®æ¤ç‰©ã¯ã‚ãªãŸã®æŒã¡ç‰©å†…ã®ã€Œãƒ©ã‚¤ãƒ–ラリ〠&gt; 「オブジェクトã€ãƒ•ォルダã«ã‚りã¾ã™ã€‚「制作ã€ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã§ä½œæˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚" name="land gardening" value="35"/>
+ <action description="éžã‚°ãƒ«ãƒ¼ãƒ—オブジェクトã®è¿”å´" longdescription="グループ所有ã®åŒºç”»ä¸Šã®ã‚ªãƒ–ジェクトã®ã†ã¡ã€ã‚°ãƒ«ãƒ¼ãƒ—以外ã®ã‚ªãƒ–ジェクトを返å´ã™ã‚‹ã«ã¯ã€ã€ŒåœŸåœ°æƒ…å ±ã€ï¼žã€Œã‚ªãƒ–ジェクトã€ã‚¿ãƒ–を使ã„ã¾ã™ã€‚" name="land return non group" value="34"/>
+ <action description="ãƒªãƒ³ãƒ‡ãƒ³è£½ã®æ¤ç‰©ã‚’使用ã—ã¦æ™¯è¦³ä½œæˆ" longdescription="ãƒªãƒ³ãƒ‡ãƒ³è£½ã®æ¨¹æœ¨ã€æ¤ç‰©ã€è‰ã‚’æ¤ãˆã‚‹ã€æ™¯è¦³ã¥ãりã®èƒ½åŠ›ã§ã™ã€‚ ã“ã‚Œã‚‰ã®æ¤ç‰©ã¯ã‚ãªãŸã®æŒã¡ç‰©å†…ã®ã€Œãƒ©ã‚¤ãƒ–ラリ〠&gt; 「オブジェクトã€ãƒ•ォルダã«ã‚りã¾ã™ã€‚「制作ã€ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã§ä½œæˆã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚" name="land gardening" value="35"/>
</action_set>
<action_set description="ã“れらã®ã€Œèƒ½åŠ›ã€ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®ã‚ªãƒ–ジェクトを譲渡ã€ä¿®æ­£ã€è²©å£²ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚ 変更ã¯ã€Œåˆ¶ä½œãƒ„ール〠&gt; 「一般ã€ã‚¿ãƒ–ã§è¡Œã„ã¾ã™ã€‚ オブジェクトをå³ã‚¯ãƒªãƒƒã‚¯ã—ã¦ã€Œç·¨é›†ã€ã‚’é–‹ãã¨è¨­å®šå†…容を確èªã§ãã¾ã™ã€‚" name="Object Management">
<action description="グループã«ã‚ªãƒ–ジェクトを譲渡" longdescription="「制作ツール〠&gt; 「一般ã€ã‚¿ãƒ–ã§ã€ã‚ªãƒ–ジェクトをグループã«è­²æ¸¡ã—ã¾ã™ã€‚" name="object deed" value="36"/>
<action description="ã‚°ãƒ«ãƒ¼ãƒ—æ‰€æœ‰ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆã®æ“作(移動ã€ã‚³ãƒ”ーã€ä¿®æ­£ï¼‰" longdescription="「制作ツール〠&gt; 「一般ã€ã‚¿ãƒ–ã§ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®ã‚ªãƒ–ジェクトをæ“作(移動ã€ã‚³ãƒ”ーã€ä¿®æ­£ï¼‰ã—ã¾ã™ã€‚" name="object manipulate" value="38"/>
<action description="グループ所有オブジェクトを販売å¯èƒ½ã«è¨­å®š" longdescription="「制作ツール〠&gt; 「一般ã€ã‚¿ãƒ–ã§ã€ã‚°ãƒ«ãƒ¼ãƒ—所有ã®ã‚ªãƒ–ジェクトを販売対象ã«è¨­å®šã—ã¾ã™ã€‚" name="object set sale" value="39"/>
</action_set>
- <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ãƒ¡ãƒ³ãƒãƒ¼ã«ã€ã‚°ãƒ«ãƒ¼ãƒ—ã®è² å‚µã®æ”¯æ‰•ã„ã¨åˆ©å­å—ã‘å–ã‚Šã‚’è¦æ±‚ã™ã‚‹æ¨©é™ã€ã‚°ãƒ«ãƒ¼ãƒ—å£åº§å±¥æ­´ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’制é™ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Accounting">
- <action description="グループ負債ã®è¿”済ã¨ã‚°ãƒ«ãƒ¼ãƒ—é…当ã®å—é ˜" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ã¤ã„ã¦ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—è² å‚µã®æ”¯æ‰•ã„ã¨ã‚°ãƒ«ãƒ¼ãƒ—é…当ã®å—ã‘å–りãŒè‡ªå‹•çš„ã«è¡Œã‚れã¾ã™ã€‚ ã¤ã¾ã‚Šã€ã“れらã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€æ¯Žæ—¥é…当ã•れるグループ所有ã®åœŸåœ°ã®å£²ã‚Šä¸Šã’金ã®ä¸€éƒ¨ã‚’å—ã‘å–ã‚‹ã¨å…±ã«ã€åŒºç”»ã®åºƒå‘Šè²»ãªã©ã‚’è² æ‹…ã™ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚" name="accounting accountable" value="40"/>
+ <action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ãƒ¡ãƒ³ãƒãƒ¼ã«ã€ã‚°ãƒ«ãƒ¼ãƒ—ã®è² å‚µã®æ”¯æ‰•ã„ã¨åˆ©å­å—ã‘å–ã‚Šã‚’è¦æ±‚ã™ã‚‹æ¨©é™ã€ã‚°ãƒ«ãƒ¼ãƒ—å£åº§å±¥æ­´ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚’制é™ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Accounting"><action description="グループ負債ã®è¿”済ã¨ã‚°ãƒ«ãƒ¼ãƒ—é…当ã®å—é ˜" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã«ã¤ã„ã¦ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—è² å‚µã®æ”¯æ‰•ã„ã¨ã‚°ãƒ«ãƒ¼ãƒ—é…当ã®å—ã‘å–りãŒè‡ªå‹•çš„ã«è¡Œã‚れã¾ã™ã€‚
+ ã¤ã¾ã‚Šã€ã“れらã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€æ¯Žæ—¥é…当ã•れるグループ所有地ã®å£²ã‚Šä¸Šã’金ã®ä¸€éƒ¨ã‚’å—ã‘å–ã‚‹ã¨å…±ã«ã€åŒºç”»ã®åºƒå‘Šè²»ãªã©ã‚’è² æ‹…ã™ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚" name="accounting accountable" value="40"/>
</action_set>
<action_set description="ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—通知ã®é€ä¿¡ã€å—ä¿¡ã€è¡¨ç¤ºã‚’メンãƒãƒ¼ã«è¨±å¯ã™ã‚‹æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚" name="Notices">
<action description="通知をé€ä¿¡" longdescription="ã“ã®ã€Œèƒ½åŠ›ã€ã‚’æŒã¤ã€Œå½¹å‰²ã€ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã€Œã‚°ãƒ«ãƒ¼ãƒ—〠&gt; 「通知ã€ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã‹ã‚‰é€šçŸ¥ã‚’é€ä¿¡ã§ãã¾ã™ã€‚" name="notices send" value="42"/>
@@ -68,9 +68,9 @@
<action description="ææ¡ˆã‚’作æˆ" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€æŠ•票ã®å¯¾è±¡ã¨ãªã‚‹å•題æèµ·ã‚’「グループ情報ã€ï¼žã€Œå•題æèµ·ã€ã‚¿ãƒ–上ã§ä½œæˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" name="proposal start" value="44"/>
<action description="å•題æèµ·ã«æŠ•票ã™ã‚‹" longdescription="ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—æƒ…å ±ï¼žææ¡ˆã‚¿ãƒ–ã§ææ¡ˆã«æŠ•ç¥¨ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚" name="proposal vote" value="45"/>
</action_set>
- <action_set description=" ã“れらã®ã‚¢ãƒ“リティã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—・ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚„グループ・ボイス・ãƒãƒ£ãƒƒãƒˆã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã®è¨±å¯ã‚„制é™ã®æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚ " name="Chat">
- <action description="グループ・ãƒãƒ£ãƒƒãƒˆã«å‚加ã™ã‚‹" longdescription=" ã“ã®ã‚¢ãƒ“リティをæŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—・ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ†ã‚­ã‚¹ãƒˆãŠã‚ˆã³ãƒœã‚¤ã‚¹ã§å‚加ã§ãã¾ã™ã€‚ " name="join group chat"/>
- <action description="グループ・ボイス・ãƒãƒ£ãƒƒãƒˆã«å‚加ã™ã‚‹" longdescription=" ã“ã®ã‚¢ãƒ“リティをæŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—・ボイス・ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«å‚加ã§ãã¾ã™ã€‚ 注: ボイス・ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—・ãƒãƒ£ãƒƒãƒˆã«å‚加ã™ã‚‹ã‚¢ãƒ“リティãŒå¿…è¦ã§ã™ã€‚ " name="join voice chat"/>
- <action description="グループ・ãƒãƒ£ãƒƒãƒˆã‚’管ç†ã™ã‚‹" longdescription=" ã“ã®ã‚¢ãƒ“リティをæŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—・ボイス・ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ãŠã‚ˆã³ã‚°ãƒ«ãƒ¼ãƒ—・テキスト・ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚„å‚加をコントロールã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ " name="moderate group chat"/>
+ <action_set description=" ã“れらã®èƒ½åŠ›ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚„グループボイスãƒãƒ£ãƒƒãƒˆã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã®è¨±å¯ã‚„制é™ã®æ¨©é™ãŒå«ã¾ã‚Œã¾ã™ã€‚ " name="Chat">
+ <action description="グループãƒãƒ£ãƒƒãƒˆã«å‚加ã™ã‚‹" longdescription=" ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ†ã‚­ã‚¹ãƒˆãŠã‚ˆã³ãƒœã‚¤ã‚¹ã§å‚加ã§ãã¾ã™ã€‚ " name="join group chat"/>
+ <action description="グループボイスãƒãƒ£ãƒƒãƒˆã«å‚加ã™ã‚‹" longdescription=" ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ボイスãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«å‚加ã§ãã¾ã™ã€‚ 注: ボイスãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã‚¢ã‚¯ã‚»ã‚¹ã™ã‚‹ã«ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ãƒãƒ£ãƒƒãƒˆã«å‚加ã™ã‚‹èƒ½åŠ›ãŒå¿…è¦ã§ã™ã€‚ " name="join voice chat"/>
+ <action description="グループãƒãƒ£ãƒƒãƒˆã‚’管ç†ã™ã‚‹" longdescription=" ã“ã®èƒ½åŠ›ã‚’æŒã¤å½¹å‰²ã®ãƒ¡ãƒ³ãƒãƒ¼ã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ボイスãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ãŠã‚ˆã³ã‚°ãƒ«ãƒ¼ãƒ—テキストãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã‚„å‚加をコントロールã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ " name="moderate group chat"/>
</action_set>
</role_actions>
diff --git a/indra/newview/skins/default/xui/ja/sidepanel_appearance.xml b/indra/newview/skins/default/xui/ja/sidepanel_appearance.xml
index 4fba4b1567..c453699c57 100644
--- a/indra/newview/skins/default/xui/ja/sidepanel_appearance.xml
+++ b/indra/newview/skins/default/xui/ja/sidepanel_appearance.xml
@@ -1,16 +1,17 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="アウトフィット" name="appearance panel">
<string name="No Outfit" value="アウトフィットãªã—"/>
+ <string name="Unsaved Changes" value="ä¿å­˜ã•れã¦ã„ãªã„変更"/>
+ <string name="Now Wearing" value="ç€ç”¨ã—ã¦ã„ã¾ã™..."/>
<panel name="panel_currentlook">
- <button label="編集" name="editappearance_btn"/>
- <text name="currentlook_title">
- (ä¿å­˜ã•れã¦ã„ã¾ã›ã‚“)
+ <button label="E" name="editappearance_btn"/>
+ <button label="O" name="openoutfit_btn"/>
+ <text name="currentlook_status">
+ (状態)
</text>
<text name="currentlook_name">
MyOutfit With a really Long Name like MOOSE
</text>
</panel>
- <filter_editor label="アウトフィットã®ãƒ•ィルター" name="Filter"/>
- <button label="装ç€" name="wear_btn"/>
- <button label="æ–°ã—ã„アウトフィット" name="newlook_btn"/>
+ <filter_editor label="アウトフィットをフィルター" name="Filter"/>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/sidepanel_inventory.xml b/indra/newview/skins/default/xui/ja/sidepanel_inventory.xml
index 0c97fed901..648719b6bd 100644
--- a/indra/newview/skins/default/xui/ja/sidepanel_inventory.xml
+++ b/indra/newview/skins/default/xui/ja/sidepanel_inventory.xml
@@ -2,10 +2,12 @@
<panel label="ã‚‚ã®" name="objects panel">
<panel label="" name="sidepanel__inventory_panel">
<panel name="button_panel">
- <button label="プロフィール" name="info_btn"/>
- <button label="装ç€" name="wear_btn"/>
+ <button label="プロフィール" name="info_btn" tool_tip="オブジェクトã®ãƒ—ロフィールを表示ã™ã‚‹"/>
+ <button label="共有" name="share_btn" tool_tip="「æŒã¡ç‰©ã€ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’共有ã™ã‚‹"/>
+ <button label="ショッピング" name="shop_btn" tool_tip="マーケットプレイスã®ã‚µã‚¤ãƒˆã‚’é–‹ã"/>
+ <button label="装ç€" name="wear_btn" tool_tip="é¸æŠžã—ãŸã‚¢ã‚¦ãƒˆãƒ•ィットをç€ç”¨ã™ã‚‹"/>
<button label="プレイ" name="play_btn"/>
- <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn"/>
+ <button label="テレãƒãƒ¼ãƒˆ" name="teleport_btn" tool_tip="該当ã™ã‚‹ã‚¨ãƒªã‚¢ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹"/>
</panel>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml
index c2d2af5346..ff9b5dc6aa 100644
--- a/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml
+++ b/indra/newview/skins/default/xui/ja/sidepanel_task_info.xml
@@ -37,8 +37,8 @@
Mixed Sale
</panel.string>
<text name="title" value="オブジェクトã®ãƒ—ロフィール"/>
- <text name="where" value="(ワールド内)"/>
- <panel label="">
+ <text name="where" value="(インワールド)"/>
+ <panel label="" name="properties_panel">
<text name="Name:">
åå‰ï¼š
</text>
@@ -60,7 +60,7 @@
<text name="Group_label">
グループ:
</text>
- <button name="button set group" tool_tip="ã“ã®ã‚ªãƒ–ジェクト権é™ã‚’共有ã™ã‚‹ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠž"/>
+ <button name="button set group" tool_tip="ã“ã®ã‚ªãƒ–ジェクト権é™ã‚’共有ã™ã‚‹ã‚°ãƒ«ãƒ¼ãƒ—ã‚’é¸æŠžã—ã¾ã™"/>
<name_box initial_value="ローディング..." name="Group Name Proxy"/>
<button label="譲渡" label_selected="譲渡" name="button deed" tool_tip="ã“ã®ã‚¢ã‚¤ãƒ†ãƒ ã‚’譲渡ã™ã‚‹ã¨ã€Œæ¬¡ã®æ‰€æœ‰è€…ã€ã®æ¨©é™ãŒé©ç”¨ã•れã¾ã™ã€‚ グループ共有オブジェクトã¯ã€ã‚°ãƒ«ãƒ¼ãƒ—ã®ã‚ªãƒ•ィサーãŒè­²æ¸¡ã§ãã¾ã™ã€‚"/>
<text name="label click action">
@@ -91,7 +91,7 @@
</text>
<check_box label="修正" name="checkbox next owner can modify"/>
<check_box label="コピー" name="checkbox next owner can copy"/>
- <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="checkbox next owner can transfer" tool_tip="æ¬¡ã®æ‰€æœ‰è€…ã¯ã“ã®ã‚ªãƒ–ジェクトを他人ã«ã‚ã’ãŸã‚Šå†è²©ã™ã‚‹ã“ã¨ãŒã§ãã¾ã™"/>
+ <check_box label="å†è²©ãƒ»ãƒ—レゼント" name="checkbox next owner can transfer" tool_tip="æ¬¡ã®æ‰€æœ‰è€…ã¯ã“ã®ã‚ªãƒ–ジェクトを他人ã«ã‚ã’ãŸã‚Šå†è²©ã§ãã¾ã™"/>
</panel>
<check_box label="販売中" name="checkbox for sale"/>
<combo_box name="sale type">
@@ -124,5 +124,6 @@
<button label="é–‹ã" name="open_btn"/>
<button label="支払ã†" name="pay_btn"/>
<button label="è²·ã†" name="buy_btn"/>
+ <button label="詳細" name="details_btn"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index 288ad4bc1d..8948722bf3 100644
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -23,7 +23,22 @@
ãƒãƒ¼ãƒ‰ã‚¦ã‚§ã‚¢ã®æ¤œå‡ºä¸­ã§ã™...
</string>
<string name="StartupLoading">
- ローディング
+ [APP_NAME] をインストール中ã§ã™...
+ </string>
+ <string name="StartupClearingCache">
+ キャッシュをクリア中ã§ã™...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ テクスãƒãƒ£ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’åˆæœŸåŒ–中ã§ã™...
+ </string>
+ <string name="StartupInitializingVFS">
+ VFS ã‚’åˆæœŸåŒ–中ã§ã™...
+ </string>
+ <string name="ProgressRestoring">
+ 復元中ã§ã™...
+ </string>
+ <string name="ProgressChangingResolution">
+ è§£åƒåº¦ã‚’変更中ã§ã™...
</string>
<string name="Fullbright">
明るã•全開(レガシー)
@@ -38,16 +53,16 @@
èªè¨¼ã—ã¦ã„ã¾ã™...
</string>
<string name="LoginMaintenance">
- アカウント・メンテナンスを実行ã—ã¦ã„ã¾ã™...
+ アカウントã®ãƒ¡ãƒ³ãƒ†ãƒŠãƒ³ã‚¹ã‚’実行ã—ã¦ã„ã¾ã™...
</string>
<string name="LoginAttempt">
- å‰å›žã®ãƒ­ã‚°ã‚¤ãƒ³ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ ログイン中ã§ã™([NUMBER]回目)
+ å‰å›žã®ãƒ­ã‚°ã‚¤ãƒ³ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ ログイン中ã§ã™ï¼ˆ[NUMBER] 回目)
</string>
<string name="LoginPrecaching">
- ワールドをロードã—ã¦ã„ã¾ã™...
+ ワールドを読ã¿è¾¼ã‚“ã§ã„ã¾ã™...
</string>
<string name="LoginInitializingBrowser">
- 埋ã‚è¾¼ã¿Webãƒ–ãƒ©ã‚¦ã‚¶ã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™...
+ 内蔵 Web ãƒ–ãƒ©ã‚¦ã‚¶ã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™...
</string>
<string name="LoginInitializingMultimedia">
マルãƒãƒ¡ãƒ‡ã‚£ã‚¢ã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™...
@@ -56,7 +71,7 @@
フォントをローディング中...
</string>
<string name="LoginVerifyingCache">
- キャッシュ・ファイルを検証ã—ã¦ã„ã¾ã™(æ‰€è¦æ™‚é–“ã¯60~90ç§’)...
+ キャッシュファイルを検証ã—ã¦ã„ã¾ã™ï¼ˆæ‰€è¦æ™‚間㯠60 ~ 90 秒)...
</string>
<string name="LoginProcessingResponse">
応答を処ç†ã—ã¦ã„ã¾ã™...
@@ -68,26 +83,47 @@
ç”»åƒã‚’デコードã—ã¦ã„ã¾ã™...
</string>
<string name="LoginInitializingQuicktime">
- QuickTimeã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™...
+ QuickTime ã‚’åˆæœŸåŒ–ã—ã¦ã„ã¾ã™...
</string>
<string name="LoginQuicktimeNotFound">
- QuickTimeãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã€‚åˆæœŸåŒ–ã«å¤±æ•—ã—ã¾ã—ãŸã€‚
+ QuickTime ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ã€‚åˆæœŸåŒ–ã«å¤±æ•—ã—ã¾ã—ãŸã€‚
</string>
<string name="LoginQuicktimeOK">
- QuickTimeãŒæ­£å¸¸ã«åˆæœŸåŒ–ã•れã¾ã—ãŸã€‚
+ QuickTime ãŒæ­£å¸¸ã«åˆæœŸåŒ–ã•れã¾ã—ãŸã€‚
</string>
<string name="LoginWaitingForRegionHandshake">
- 地域ã®ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’å¾…ã£ã¦ã„ã¾ã™...
+ リージョンã®ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚’å¾…ã£ã¦ã„ã¾ã™...
</string>
<string name="LoginConnectingToRegion">
- åœ°åŸŸã«æŽ¥ç¶šã—ã¦ã„ã¾ã™...
+ ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«æŽ¥ç¶šã—ã¦ã„ã¾ã™...
</string>
<string name="LoginDownloadingClothing">
- æœã‚’ダウンロードã—ã¦ã„ã¾ã™...
+ 衣類をダウンロードã—ã¦ã„ã¾ã™...
+ </string>
+ <string name="InvalidCertificate">
+ 証明書ãŒç„¡åйã¾ãŸã¯å£Šã‚Œã¦ã„ã¾ã™ã€‚ グリッド管ç†è€…ã«ã”連絡ãã ã•ã„。
+ </string>
+ <string name="CertInvalidHostname">
+ 無効ãªãƒ›ã‚¹ãƒˆãƒãƒ¼ãƒ ãŒã‚µãƒ¼ãƒãƒ¼ã«ã‚¢ã‚¯ã‚»ã‚¹ã—ã¦ã„ã¾ã—ãŸã€‚SLURL ã‹ã‚°ãƒªãƒƒãƒ‰ã®ãƒ›ã‚¹ãƒˆãƒãƒ¼ãƒ ã‚’ã”確èªãã ã•ã„。
+ </string>
+ <string name="CertExpired">
+ グリッドãŒè¿”ã—ãŸè¨¼æ˜Žæ›¸ã¯æœ‰åŠ¹æœŸé™ãŒçµ‚了ã—ã¦ã„ã‚‹ã¨è€ƒãˆã‚‰ã‚Œã¾ã™ã€‚ãŠä½¿ã„ã®ã‚·ã‚¹ãƒ†ãƒ ã‚¯ãƒ­ãƒƒã‚¯ã‚’確èªã™ã‚‹ã‹ã€ã‚°ãƒªãƒƒãƒ‰ã®ç®¡ç†è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。
+ </string>
+ <string name="CertKeyUsage">
+ SSL 証明書ã®ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ グリッド管ç†è€…ã«ã”連絡ãã ã•ã„。
+ </string>
+ <string name="CertBasicConstraints">
+ サーãƒãƒ¼ã®è¨¼æ˜Žæ›¸ãƒã‚§ãƒ¼ãƒ³ã«è¨¼æ˜Žæ›¸ãŒå¤šã™ãŽã¾ã™ã€‚ グリッド管ç†è€…ã«ã”連絡ãã ã•ã„。
+ </string>
+ <string name="CertInvalidSignature">
+ グリッドサーãƒãƒ¼ãŒè¿”ã—ãŸè¨¼æ˜Žæ›¸ã®ç½²åã‚’èªè¨¼ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚グリッドã®ç®¡ç†è€…ã«ãŠå•ã„åˆã‚ã›ãã ã•ã„。
</string>
<string name="LoginFailedNoNetwork">
ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¨ãƒ©ãƒ¼ï¼š 接続を確立ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚ãŠä½¿ã„ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯æŽ¥ç¶šã‚’ã”確èªãã ã•ã„。
</string>
+ <string name="LoginFailed">
+ ログインã«å¤±æ•—ã—ã¾ã—ãŸã€‚
+ </string>
<string name="Quit">
終了
</string>
@@ -97,23 +133,41 @@
<string name="AgentLostConnection">
ã“ã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ä¸éƒ½åˆãŒç™ºç”Ÿã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ ã”使用ã®ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆæŽ¥ç¶šã‚’ã”確èªãã ã•ã„。
</string>
+ <string name="SavingSettings">
+ 設定をä¿å­˜ä¸­ã§ã™...
+ </string>
+ <string name="LoggingOut">
+ ログアウト中ã§ã™...
+ </string>
+ <string name="ShuttingDown">
+ シャットダウン中ã§ã™...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ ã‚ãªãŸãŒã„ãŸãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã¸ã®æŽ¥ç¶šãŒåˆ‡ã‚Œã¾ã—ãŸã€‚
+ </string>
+ <string name="SentToInvalidRegion">
+ 無効ãªãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã•れã¾ã—ãŸã€‚
+ </string>
+ <string name="TestingDisconnect">
+ ãƒ“ãƒ¥ãƒ¼ãƒ¯ã®æŽ¥ç¶šã‚’åˆ‡ã‚‹ãƒ†ã‚¹ãƒˆä¸­
+ </string>
<string name="TooltipPerson">
人
</string>
<string name="TooltipNoName">
- (åå‰ãªã—)
+ (åå‰ãªã—)
</string>
<string name="TooltipOwner">
- オーナー:
+ 所有者:
</string>
<string name="TooltipPublic">
公共
</string>
<string name="TooltipIsGroup">
- (グループ)
+ (グループ)
</string>
<string name="TooltipForSaleL$">
- 売り出ã—中:L$[AMOUNT]
+ 売り出ã—中:L$ [AMOUNT]
</string>
<string name="TooltipFlagGroupBuild">
グループ作æˆ
@@ -131,7 +185,7 @@
é£›è¡Œç¦æ­¢
</string>
<string name="TooltipFlagGroupScripts">
- グループ・スクリプト
+ グループスクリプト
</string>
<string name="TooltipFlagNoScripts">
スクリプトãªã—
@@ -140,54 +194,94 @@
土地:
</string>
<string name="TooltipMustSingleDrop">
- 1ã¤ã®ã‚¢ã‚¤ãƒ†ãƒ ã®ã¿ã‚’ã“ã“ã«ãƒ‰ãƒ©ãƒƒã‚°ã§ãã¾ã™
+ アイテム㯠1 ã¤ã ã‘ã“ã“ã«ãƒ‰ãƒ©ãƒƒã‚°ã§ãã¾ã™
</string>
<string name="TooltipHttpUrl">
- クリックã—ã¦ã“ã®Webページを見る
+ クリックã—ã¦ã“ã® Web ページを見ã¾ã™
</string>
<string name="TooltipSLURL">
- クリックã—ã¦ã“ã®å ´æ‰€ã®æƒ…報を見る
+ クリックã—ã¦ã“ã®å ´æ‰€ã®æƒ…報を見ã¾ã™
</string>
<string name="TooltipAgentUrl">
- クリックã—ã¦ã“ã®ä½äººã®ãƒ—ロフィールを見る
+ クリックã—ã¦ã“ã®ä½äººã®ãƒ—ロフィールを見ã¾ã™
+ </string>
+ <string name="TooltipAgentMute">
+ クリックã—ã¦ã“ã®ä½äººã«å¯¾ã—ã¦ç„¡è¦–設定をã—ã¾ã™
+ </string>
+ <string name="TooltipAgentUnmute">
+ クリックã—ã¦ã“ã®ä½äººã«å¯¾ã™ã‚‹ç„¡è¦–設定を解除ã—ã¾ã™
+ </string>
+ <string name="TooltipAgentIM">
+ クリックã—ã¦ã“ã®ä½äººã« IM ã‚’é€ã‚Šã¾ã™
+ </string>
+ <string name="TooltipAgentPay">
+ クリックã—ã¦ã“ã®ä½äººã«æ”¯æ‰•ã„ã¾ã™
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ クリックã—ã¦ã“ã®ä½äººã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’é€ã‚Šã¾ã™
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ クリックã—ã¦ã“ã®ä½äººã«ãƒ•レンド登録リクエストをé€ã‚Šã¾ã™
</string>
<string name="TooltipGroupUrl">
- クリックã—ã¦ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®èª¬æ˜Žæ–‡ã‚’見る
+ クリックã—ã¦ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®èª¬æ˜Žæ–‡ã‚’見ã¾ã™
</string>
<string name="TooltipEventUrl">
- クリックã—ã¦ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®èª¬æ˜Žæ–‡ã‚’見る
+ クリックã—ã¦ã“ã®ã‚°ãƒ«ãƒ¼ãƒ—ã®èª¬æ˜Žæ–‡ã‚’見ã¾ã™
</string>
<string name="TooltipClassifiedUrl">
- クリックã—ã¦ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ァイド広告を見る
+ クリックã—ã¦ã“ã®ã‚¯ãƒ©ã‚·ãƒ•ァイド広告を見ã¾ã™
</string>
<string name="TooltipParcelUrl">
- クリックã—ã¦ã“ã®åŒºç”»ã®èª¬æ˜Žæ–‡ã‚’見る
+ クリックã—ã¦ã“ã®åŒºç”»ã®èª¬æ˜Žæ–‡ã‚’見ã¾ã™
</string>
<string name="TooltipTeleportUrl">
- クリックã—ã¦ã“ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã™ã‚‹
+ クリックã—ã¦ã“ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã—ã¾ã™
</string>
<string name="TooltipObjectIMUrl">
- クリックã—ã¦ã“ã®ã‚ªãƒ–ジェクトã®èª¬æ˜Žæ–‡ã‚’見る
+ クリックã—ã¦ã“ã®ã‚ªãƒ–ジェクトã®èª¬æ˜Žæ–‡ã‚’見ã¾ã™
</string>
<string name="TooltipMapUrl">
- クリックã—ã¦ã“ã®å ´æ‰€ã‚’地図ã«è¡¨ç¤ºã™ã‚‹
+ クリックã—ã¦ã“ã®å ´æ‰€ã‚’地図ã«è¡¨ç¤ºã—ã¾ã™
</string>
<string name="TooltipSLAPP">
- クリックã—㦠secondlife:// コマンドを出ã™
+ クリックã—㦠secondlife:// コマンドを出ã—ã¾ã™
</string>
- <string name="CurrentURL" value=" ç¾åœ¨ã®URL: [CurrentURL]"/>
+ <string name="CurrentURL" value=" ç¾åœ¨ã® URL: [CurrentURL]"/>
+ <string name="TooltipPrice" value="L$[PRICE]-"/>
<string name="SLurlLabelTeleport">
テレãƒãƒ¼ãƒˆ
</string>
<string name="SLurlLabelShowOnMap">
地図ã«è¡¨ç¤º
</string>
+ <string name="SLappAgentMute">
+ 無視
+ </string>
+ <string name="SLappAgentUnmute">
+ ミュート解除
+ </string>
+ <string name="SLappAgentIM">
+ IM
+ </string>
+ <string name="SLappAgentPay">
+ 支払ã†
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ 次ã®å ´æ‰€ã«ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’é€ã‚Šã¾ã™ï¼š
+ </string>
+ <string name="SLappAgentRequestFriend">
+ フレンド登録リクエスト
+ </string>
<string name="BUTTON_CLOSE_DARWIN">
é–‰ã˜ã‚‹ (⌘W)
</string>
<string name="BUTTON_CLOSE_WIN">
é–‰ã˜ã‚‹ (Ctrl+W)
</string>
+ <string name="BUTTON_CLOSE_CHROME">
+ é–‰ã˜ã‚‹
+ </string>
<string name="BUTTON_RESTORE">
復元
</string>
@@ -227,12 +321,12 @@
<string name="AvatarNameMultiple">
(複数)
</string>
- <string name="AvatarNameHippos">
- (hippos)
- </string>
<string name="GroupNameNone">
(ãªã—)
</string>
+ <string name="AvalineCaller">
+ Avaline コール [ORDER]
+ </string>
<string name="AssetErrorNone">
エラーãªã—
</string>
@@ -338,8 +432,11 @@
<string name="symbolic link">
リンク
</string>
+ <string name="symbolic folder link">
+ フォルダã®ãƒªãƒ³ã‚¯
+ </string>
<string name="AvatarEditingAppearance">
- (容姿ã®ç·¨é›†ï¼‰
+ (容姿ã®ç·¨é›†ä¸­ï¼‰
</string>
<string name="AvatarAway">
一時退席中
@@ -387,28 +484,28 @@
æ³£ã
</string>
<string name="anim_dance1">
- ダンス1
+ ダンス 1
</string>
<string name="anim_dance2">
- ダンス2
+ ダンス 2
</string>
<string name="anim_dance3">
- ダンス3
+ ダンス 3
</string>
<string name="anim_dance4">
- ダンス4
+ ダンス 4
</string>
<string name="anim_dance5">
- ダンス5
+ ダンス 5
</string>
<string name="anim_dance6">
- ダンス6
+ ダンス 6
</string>
<string name="anim_dance7">
- ダンス7
+ ダンス 7
</string>
<string name="anim_dance8">
- ダンス8
+ ダンス 8
</string>
<string name="anim_express_disdain">
侮蔑
@@ -588,16 +685,19 @@
接続ã—ã¾ã—ãŸ
</string>
<string name="unavailable">
- ã‚ãªãŸã®ç¾åœ¨ã®ãƒ­ã‚±ãƒ¼ã‚·ãƒ§ãƒ³ã§ã¯ã€ãƒœã‚¤ã‚¹ã‚’利用ã§ãã¾ã›ã‚“。
+ ç¾åœ¨åœ°ã§ã¯ã€ãƒœã‚¤ã‚¹ã‚’利用ã§ãã¾ã›ã‚“。
</string>
<string name="hang_up">
インワールドボイスãƒãƒ£ãƒƒãƒˆã®é€šè©±ãŒåˆ‡æ–­ã•れã¾ã—ãŸ
</string>
+ <string name="reconnect_nearby">
+ 「近ãã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã€ã«å†æŽ¥ç¶šã•れã¾ã™
+ </string>
<string name="ScriptQuestionCautionChatGranted">
- [REGIONNAME]ã®[REGIONPOS]ã¨ã„ã†å ´æ‰€ã«ã‚る「[OWNERNAME]ã€æ‰€æœ‰ã®ã€Œ[OBJECTNAME]ã€ã¨ã„ã†ã‚ªãƒ–ジェクトã¯ã€æ¬¡ã®æ¨©é™ã‚’許å¯ã—ã¾ã—ãŸï¼š [PERMISSIONS]
+ [REGIONNAME] ã® [REGIONPOS] ã¨ã„ã†å ´æ‰€ã«ã‚ã‚‹ã€ã€Œ [OWNERNAME] ã€ãŒæ‰€æœ‰ã™ã‚‹ã€Œ [OBJECTNAME] ã€ã¨ã„ã†ã‚ªãƒ–ジェクトã¯ã€æ¬¡ã®æ¨©é™ã‚’許å¯ã—ã¾ã—ãŸï¼š [PERMISSIONS]
</string>
<string name="ScriptQuestionCautionChatDenied">
- [REGIONNAME]ã®[REGIONPOS]ã¨ã„ã†å ´æ‰€ã«ã‚る「[OWNERNAME]ã€æ‰€æœ‰ã®ã€Œ[OBJECTNAME]ã€ã¨ã„ã†ã‚ªãƒ–ジェクトã¯ã€æ¬¡ã®æ¨©é™ã‚’æ‹’å¦ã—ã¾ã—ãŸï¼š [PERMISSIONS]
+ [REGIONNAME] ã® [REGIONPOS] ã¨ã„ã†å ´æ‰€ã«ã‚ã‚‹ã€ã€Œ [OWNERNAME] ã€ãŒæ‰€æœ‰ã™ã‚‹ã€Œ [OBJECTNAME] ã€ã¨ã„ã†ã‚ªãƒ–ジェクトã¯ã€æ¬¡ã®æ¨©é™ã‚’æ‹’å¦ã—ã¾ã—ãŸï¼š [PERMISSIONS]
</string>
<string name="ScriptTakeMoney">
リンデンドル(L$)を支払ã†
@@ -636,10 +736,10 @@
接続ã•れã¦ã„ã¾ã›ã‚“
</string>
<string name="SIM_ACCESS_PG">
- 一般
+ General
</string>
<string name="SIM_ACCESS_MATURE">
- 控ãˆã‚
+ Moderate
</string>
<string name="SIM_ACCESS_ADULT">
Adult
@@ -653,6 +753,12 @@
<string name="land_type_unknown">
ï¼ˆä¸æ˜Žï¼‰
</string>
+ <string name="Estate / Full Region">
+ ä¸å‹•産 / フルリージョン
+ </string>
+ <string name="Mainland / Full Region">
+ メインランド / フルリージョン
+ </string>
<string name="all_files">
å…¨ã¦ã®ãƒ•ァイル
</string>
@@ -672,22 +778,22 @@
ロード
</string>
<string name="targa_image_files">
- Targaç”»åƒ
+ Targa ç”»åƒ
</string>
<string name="bitmap_image_files">
ビットマップ画åƒ
</string>
<string name="avi_movie_file">
- AVIムービーファイル
+ AVI ムービーファイル
</string>
<string name="xaf_animation_file">
- XAFアニメーションファイル
+ XAF アニメーションファイル
</string>
<string name="xml_file">
- XMLファイル
+ XML ファイル
</string>
<string name="dot_raw_file">
- RAWファイル
+ RAW ファイル
</string>
<string name="compressed_image_files">
圧縮画åƒ
@@ -758,6 +864,48 @@
<string name="invalid">
無効
</string>
+ <string name="shirt_not_worn">
+ シャツ未ç€ç”¨
+ </string>
+ <string name="pants_not_worn">
+ パンツ未ç€ç”¨
+ </string>
+ <string name="shoes_not_worn">
+ é´æœªç€ç”¨
+ </string>
+ <string name="socks_not_worn">
+ é´ä¸‹æœªç€ç”¨
+ </string>
+ <string name="jacket_not_worn">
+ ジャケット未ç€ç”¨
+ </string>
+ <string name="gloves_not_worn">
+ 手袋未ç€ç”¨
+ </string>
+ <string name="undershirt_not_worn">
+ 下ç€ï¼ˆä¸Šï¼‰æœªç€ç”¨
+ </string>
+ <string name="underpants_not_worn">
+ 下ç€ï¼ˆä¸‹ï¼‰æœªç€ç”¨
+ </string>
+ <string name="skirt_not_worn">
+ スカート未ç€ç”¨
+ </string>
+ <string name="alpha_not_worn">
+ アルファ未ç€ç”¨
+ </string>
+ <string name="tattoo_not_worn">
+ タトゥー未ç€ç”¨
+ </string>
+ <string name="invalid_not_worn">
+ 無効
+ </string>
+ <string name="NewWearable">
+ æ–°ã—ã„ [WEARABLE_ITEM]
+ </string>
+ <string name="CreateNewWearable">
+ [WEARABLE_TYPE]を作æˆ
+ </string>
<string name="next">
次ã¸
</string>
@@ -786,13 +934,13 @@
添付アイテムをä¿å­˜
</string>
<string name="TeleportOffer">
- テレãƒãƒ¼ãƒˆã‚’渡ã™
+ テレãƒãƒ¼ãƒˆã‚’é€ã‚‹
</string>
<string name="StartUpNotifications">
ä¸åœ¨ä¸­ã«æ–°ã—ã„通知ãŒå±Šãã¾ã—ãŸã€‚
</string>
<string name="OverflowInfoChannelString">
- You have %d more notification
+ ã‚ãªãŸã«ã¯ã•ら㫠%d 通ã®é€šçŸ¥ãŒã‚りã¾ã™
</string>
<string name="BodyPartsRightArm">
å³è…•
@@ -807,7 +955,7 @@
左脚
</string>
<string name="BodyPartsTorso">
- é ­
+ 上åŠèº«
</string>
<string name="BodyPartsRightLeg">
å³è„š
@@ -822,18 +970,21 @@
高
</string>
<string name="LeaveMouselook">
- ESC キーを押ã—ã¦ãƒ¯ãƒ¼ãƒ«ãƒ‰ãƒ“ãƒ¥ãƒ¼ã«æˆ»ã‚‹
+ ESC キーを押ã—ã¦ãƒ¯ãƒ¼ãƒ«ãƒ‰ãƒ“ãƒ¥ãƒ¼ã«æˆ»ã‚Šã¾ã™
</string>
<string name="InventoryNoMatchingItems">
- 一致ã™ã‚‹ã‚¢ã‚¤ãƒ†ãƒ ãŒæŒã¡ç‰©ã«ã‚りã¾ã›ã‚“ã§ã—ãŸ
+ ãŠæŽ¢ã—ã®ã‚‚ã®ã¯è¦‹ã¤ã‹ã‚Šã¾ã—ãŸã‹ï¼Ÿ [secondlife:///app/search/all/[SEARCH_TERM] 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。
+ </string>
+ <string name="PlacesNoMatchingItems">
+ ãŠæŽ¢ã—ã®ã‚‚ã®ã¯è¦‹ã¤ã‹ã‚Šã¾ã—ãŸã‹ï¼Ÿ [secondlife:///app/search/places/[SEARCH_TERM] 検索] ã‚’ãŠè©¦ã—ãã ã•ã„。
</string>
<string name="FavoritesNoMatchingItems">
- ã“ã“ã«ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’ドラッグã—ã¦ã€ãŠæ°—ã«å…¥ã‚Šã«è¿½åŠ ã—ã¾ã™ã€‚
+ ã“ã“ã«ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã‚’ドラッグã—ã¦ãŠæ°—ã«å…¥ã‚Šã«è¿½åŠ ã—ã¾ã™ã€‚
</string>
<string name="InventoryNoTexture">
- æŒã¡ç‰©å†…ã«ã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ã‚³ãƒ”ーãŒã‚りã¾ã›ã‚“
+ 「æŒã¡ç‰©ã€å†…ã«ã“ã®ãƒ†ã‚¯ã‚¹ãƒãƒ£ã®ã‚³ãƒ”ーãŒã‚りã¾ã›ã‚“
</string>
- <string name="no_transfer" value=" (å†è²©/プレゼントä¸å¯ï¼‰"/>
+ <string name="no_transfer" value=" (å†è²©ãƒ»ãƒ—レゼントä¸å¯ï¼‰"/>
<string name="no_modify" value=" (編集ä¸å¯ï¼‰"/>
<string name="no_copy" value=" (コピーä¸å¯ï¼‰"/>
<string name="worn" value=" (ç€ç”¨ä¸­ï¼‰"/>
@@ -846,6 +997,7 @@
コンテンツãªã—
</string>
<string name="WornOnAttachmentPoint" value=" ([ATTACHMENT_POINT] ã«è£…ç€ä¸­ï¼‰"/>
+ <string name="ActiveGesture" value="[GESLABEL] (アクティブ)"/>
<string name="PermYes">
ã¯ã„
</string>
@@ -860,6 +1012,7 @@
<string name="Wave" value=" 手を振る"/>
<string name="HelloAvatar" value=" ã‚„ã‚ã€ã‚¢ãƒã‚¿ãƒ¼ï¼"/>
<string name="ViewAllGestures" value=" ã™ã¹ã¦è¡¨ç¤º &gt;&gt;"/>
+ <string name="GetMoreGestures" value="ショッピング &gt;&gt;"/>
<string name="Animations" value="アニメーションã€"/>
<string name="Calling Cards" value="コーリングカードã€"/>
<string name="Clothing" value="衣類ã€"/>
@@ -874,7 +1027,7 @@
<string name="No Filters" value="ã„ã„㈠"/>
<string name="Since Logoff" value=" - ログオフ以æ¥"/>
<string name="InvFolder My Inventory">
- マイ æŒã¡ç‰©
+ æŒã¡ç‰©
</string>
<string name="InvFolder My Favorites">
ãŠæ°—ã«å…¥ã‚Š
@@ -910,7 +1063,7 @@
æ–°è¦ãƒ•ォルダ
</string>
<string name="InvFolder Inventory">
- インベントリ
+ æŒã¡ç‰©
</string>
<string name="InvFolder Uncompressed Images">
圧縮ã•れã¦ã„ãªã„ç”»åƒ
@@ -945,6 +1098,9 @@
<string name="InvFolder My Outfits">
マイ アウトフィット
</string>
+ <string name="InvFolder Accessories">
+ アクセサリ
+ </string>
<string name="InvFolder Friends">
フレンド
</string>
@@ -955,7 +1111,7 @@
è²·ã†
</string>
<string name="BuyforL$">
- Buy for L$
+ L$ ã§è³¼å…¥
</string>
<string name="Stone">
石
@@ -1256,7 +1412,7 @@
ï¼ˆä¸æ˜Žï¼‰
</string>
<string name="SummaryForTheWeek" value="今週ã®ã¾ã¨ã‚。開始日ã¯"/>
- <string name="NextStipendDay" value="次回ã®ãŠå°é£ã„支給日ã¯"/>
+ <string name="NextStipendDay" value="ã§ã™ã€‚次回ã®ãŠå°é£ã„支給日:"/>
<string name="GroupIndividualShare" value=" グループ 個人ã®å‰²ã‚Šå½“ã¦"/>
<string name="Balance">
残高
@@ -1298,7 +1454,7 @@
許å¯ã•れãŸä½äººï¼š ([ALLOWEDAGENTS] äººã€æœ€å¤§ [MAXACCESS] 人)
</string>
<string name="RegionInfoAllowedGroups">
- 許å¯ã•れãŸã‚°ãƒ«ãƒ¼ãƒ—: ([ALLOWEDGROUPS]ã€æœ€å¤§ [MAXACCESS] グループ)
+ 許å¯ã•れãŸã‚°ãƒ«ãƒ¼ãƒ—: ([ALLOWEDGROUPS]ã€æœ€å¤§ [MAXACCESS] )
</string>
<string name="ScriptLimitsParcelScriptMemory">
区画スクリプトメモリ
@@ -1316,14 +1472,17 @@
区画ã®ã‚¹ã‚¯ãƒªãƒ—トURL
</string>
<string name="ScriptLimitsURLsUsed">
- 使用ã•れãŸURL: [MAX] 中 [COUNT] :[AVAILABLE] 利用å¯
+ 使用ã•れ㟠URL: [MAX] 中 [COUNT] :[AVAILABLE] 利用å¯
</string>
<string name="ScriptLimitsURLsUsedSimple">
- 使用ã•れãŸURL: [COUNT]
+ 使用ã•れ㟠URL: [COUNT]
</string>
<string name="ScriptLimitsRequestError">
情報ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸ
</string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ 区画ãŒé¸æŠžã•れã¦ã„ã¾ã›ã‚“。
+ </string>
<string name="ScriptLimitsRequestWrongRegion">
エラー: スクリプト情報ã¯ç¾åœ¨åœ°ã®ã¿å–å¾—ã§ãã¾ã™
</string>
@@ -1430,13 +1589,13 @@
HUD(中央 2)
</string>
<string name="ATTACH_HUD_TOP_RIGHT">
- HUDå³ä¸Š
+ HUD(å³ä¸Šï¼‰
</string>
<string name="ATTACH_HUD_TOP_CENTER">
HUD(上・中央)
</string>
<string name="ATTACH_HUD_TOP_LEFT">
- HUD 左上
+ HUD(左上)
</string>
<string name="ATTACH_HUD_CENTER_1">
HUD(中央 1)
@@ -1465,6 +1624,12 @@
<string name="PanelContentsNewScript">
æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ト
</string>
+ <string name="PanelContentsTooltip">
+ オブジェクトã®ä¸­èº«
+ </string>
+ <string name="BusyModeResponseDefault">
+ メッセージをé€ã£ãŸä½äººã¯ã€èª°ã«ã‚‚邪魔をã•れãŸããªã„ãŸã‚ç¾åœ¨ã€Œå–り込ã¿ä¸­ã€ãƒ¢ãƒ¼ãƒ‰ã§ã™ã€‚ ã‚ãªãŸã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€ã‚ã¨ã§ç¢ºèªã§ãるよã†ã« IM パãƒãƒ«ã«è¡¨ç¤ºã•れã¾ã™ã€‚
+ </string>
<string name="MuteByName">
(å称別)
</string>
@@ -1477,15 +1642,16 @@
<string name="MuteGroup">
(グループ)
</string>
+ <string name="MuteExternal">
+ (外部)
+ </string>
<string name="RegionNoCovenant">
ã“ã®ä¸å‹•産ã«ã¯ç´„款ãŒã‚りã¾ã›ã‚“。
</string>
<string name="RegionNoCovenantOtherOwner">
ã“ã®ä¸å‹•産ã«ã¯ç´„款ãŒã‚りã¾ã›ã‚“。 ã“ã®ä¸å‹•産上ã®åœŸåœ°ã¯ä¸å‹•産所有者ã«ã‚ˆã‚Šè²©å£²ã•れã€Linden Lab ã¯è²©å£²ã—ã¾ã›ã‚“。 販売ã«é–¢ã™ã‚‹ãŠå•ã„åˆã‚ã›ã¯ã€ä¸å‹•産所有者ã¾ã§ãŠé¡˜ã„致ã—ã¾ã™ã€‚
</string>
- <string name="covenant_last_modified">
- 最終修正日:
- </string>
+ <string name="covenant_last_modified" value="最終修正日:"/>
<string name="none_text" value=" (ãªã—) "/>
<string name="never_text" value=" (無) "/>
<string name="GroupOwned">
@@ -1501,7 +1667,10 @@
(掲載後更新)
</string>
<string name="NoPicksClassifiedsText">
- ã“ã“ã«ã¯ãƒ”ック・クラシファイド広告ã¯ã‚りã¾ã›ã‚“。
+ ピックやクラシファイド広告を作æˆã—ã¦ã„ã¾ã›ã‚“。 作æˆã™ã‚‹ã«ã¯ã€ä¸‹ã«ã‚る「プラスã€ãƒœã‚¿ãƒ³ã‚’クリックã—ã¾ã™ã€‚
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ ピックã€ã¾ãŸã¯ã‚¯ãƒ©ã‚·ãƒ•ァイド広告ãŒã‚りã¾ã›ã‚“
</string>
<string name="PicksClassifiedsLoadingText">
ローディング...
@@ -1531,25 +1700,25 @@
ãŒæ¸¡ã—ã¾ã—ãŸ
</string>
<string name="InvOfferYouDecline">
- You decline
+ æ‹’å¦ï¼š
</string>
<string name="InvOfferFrom">
- from
+ é€ä¿¡å…ƒï¼š
</string>
<string name="GroupMoneyTotal">
åˆè¨ˆ
</string>
<string name="GroupMoneyBought">
- ã¯è³¼å…¥ã—ã¾ã—ãŸ
+ 購入:
</string>
<string name="GroupMoneyPaidYou">
- ãŒã‚ãªãŸã«æ”¯æ‰•ã„ã¾ã—ãŸ
+ ã‚ãªãŸã«æ”¯æ‰•ã„:
</string>
<string name="GroupMoneyPaidInto">
paid into
</string>
<string name="GroupMoneyBoughtPassTo">
- bought pass to
+ 入場許å¯ã‚’購入:
</string>
<string name="GroupMoneyPaidFeeForEvent">
ãŒã‚¤ãƒ™ãƒ³ãƒˆç”¨ã®è²»ç”¨ã‚’支払ã„ã¾ã—ãŸ
@@ -1576,7 +1745,10 @@
キャンセル
</string>
<string name="UploadingCosts">
- %s ã®ã‚¢ãƒƒãƒ—ロード代金:
+ [NAME] ã®ã‚¢ãƒƒãƒ—ロード料金㯠L$[AMOUNT] ã§ã™
+ </string>
+ <string name="BuyingCosts">
+ ã“れを L$[AMOUNT] ã§è³¼å…¥ã—ã¾ã™
</string>
<string name="UnknownFileExtension">
䏿˜Žã®æ‹¡å¼µå­ï¼š %s
@@ -1679,7 +1851,7 @@
土地ã®ãƒ¬ãƒ³ã‚¿ãƒ«
</string>
<string name="Property Rental">
- 建物ã®ãƒ¬ãƒ³ã‚¿ãƒ«
+ プロパティã®ãƒ¬ãƒ³ã‚¿ãƒ«
</string>
<string name="Special Attraction">
特別アトラクション
@@ -1849,13 +2021,13 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
ãƒ”ã‚¯ã‚»ãƒ«å½¢å¼æƒ…å ±ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“
</string>
<string name="MBTrueColorWindow">
- [APP_NAME] を実行ã™ã‚‹ã«ã¯ã€True Color(32ビット)ãŒå¿…è¦ã§ã™ã€‚
+ [APP_NAME] を実行ã™ã‚‹ã«ã¯ã€True Color (32ビット)ãŒå¿…è¦ã§ã™ã€‚
ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ューターã®ã€Œã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ãƒ‘ãƒãƒ«ã€ï¼žã€Œç”»é¢ã€ï¼žã€Œè¨­å®šã€ã«è¡Œãã€ã€Œæœ€é«˜ (32 ビット)ã€ã«è¨­å®šã—ã¦ãã ã•ã„。
</string>
<string name="MBAlpha">
[APP_NAME] 㯠8 ビットã®ã‚¢ãƒ«ãƒ•ã‚¡ãƒãƒ£ãƒ³ãƒãƒ«ã‚’å–å¾—ã§ããªã„ãŸã‚実行ã§ãã¾ã›ã‚“。 通常ビデオカードã®ãƒ‰ãƒ©ã‚¤ãƒã®å•題ã§èµ·ã“りã¾ã™ã€‚
ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ãƒ¥ãƒ¼ã‚¿ãƒ¼ã«æœ€æ–°ã®ãƒ“デオカードドライãƒãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã‹ã”確èªãã ã•ã„。
-ã¾ãŸã€ã€Œã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ãƒ‘ãƒãƒ«ã€ï¼žã€Œç”»é¢ã€ï¼žã€Œè¨­å®šã€å†…ã§ã€ãƒ¢ãƒ‹ã‚¿ãƒ¼ãŒã€Œæœ€é«˜ (32ビット)ã€ã«è¨­å®šã•れã¦ã„ã‚‹ã“ã¨ã‚‚ã”確èªãã ã•ã„。
+ã¾ãŸã€ã€Œã‚³ãƒ³ãƒˆãƒ­ãƒ¼ãƒ«ãƒ‘ãƒãƒ«ã€ï¼žã€Œç”»é¢ã€ï¼žã€Œè¨­å®šã€å†…ã§ã€ãƒ¢ãƒ‹ã‚¿ãƒ¼ãŒã€Œæœ€é«˜ (32 ビット)ã€ã«è¨­å®šã•れã¦ã„ã‚‹ã“ã¨ã‚‚ã”確èªãã ã•ã„。
ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•度も出る場åˆã¯ã€[SUPPORT_SITE] ã¸ã”連絡ãã ã•ã„。
</string>
<string name="MBPixelFmtSetErr">
@@ -1868,7 +2040,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
GL レンダーコンテキストをアクティベートã§ãã¾ã›ã‚“
</string>
<string name="MBVideoDrvErr">
- ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ューターã®ãƒ“デオカードドライãƒãŒæ­£å¸¸ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã§ããªã‹ã£ãŸã€ã¾ãŸã¯å¤ã„ã‹ã‚µãƒãƒ¼ãƒˆå¯¾è±¡å¤–ã®ãŸã‚ã€[APP_NAME] ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“。 最新ã®ãƒ“デオカードドライãƒãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã®ã‚’確èªã—ã€ã•れã¦ã„ã‚‹å ´åˆã¯å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ãŠè©¦ã—ãã ã•ã„。
+ ãŠä½¿ã„ã®ã‚³ãƒ³ãƒ”ューターã®ãƒ“デオカードドライãƒãŒæ­£å¸¸ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã§ããªã‹ã£ãŸã€ã¾ãŸã¯å¤ã„ã‹ã‚µãƒãƒ¼ãƒˆå¯¾è±¡å¤–ã®ãŸã‚ã€[APP_NAME] ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“。 最新ã®ãƒ“デオカードドライãƒãŒã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ã®ã‚’確èªã—ã€ã•れã¦ã„ã‚‹å ´åˆã¯å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã‚’ãŠè©¦ã—ãã ã•ã„。
ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•度も出る場åˆã¯ã€[SUPPORT_SITE] ã¸ã”連絡ãã ã•ã„。
</string>
@@ -1897,7 +2069,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
後ã‚é«ªã®æ¯›å…ˆ
</string>
<string name="Baggy">
- ãŸã‚‹ã‚“ã§ã„ã‚‹
+ ãŸã‚‹ã‚“ã ä¸‹ã¾ã¶ãŸ
</string>
<string name="Bangs">
å‰é«ª
@@ -1987,7 +2159,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
広
</string>
<string name="Brow Size">
- 眉毛ã®å¤§ãã•
+ 眉毛上ã®éš†èµ·
</string>
<string name="Bug Eyes">
Bug Eyes
@@ -2020,7 +2192,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
膨らã¿å¤§
</string>
<string name="Chaplin">
- Chaplin
+ ãƒãƒ£ãƒƒãƒ—リン
</string>
<string name="Cheek Bones">
ã»ãŠéª¨
@@ -2041,7 +2213,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
ã‚ã”ã®é•·ã•
</string>
<string name="Chin Heavy">
- ã‚ã”ã«é‡ç‚¹
+ ã‚ã”を強調
</string>
<string name="Chin In">
ã²ã„ãŸã‚ã”
@@ -2233,7 +2405,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
ã²ãŸã„ã®è§’度
</string>
<string name="Forehead Heavy">
- ã²ãŸã„ã«é‡ç‚¹
+ ã²ãŸã„を強調
</string>
<string name="Freckles">
ã—ã¿ãƒ»ãã°ã‹ã™
@@ -2314,7 +2486,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
é ­ã®å¤§ãã•
</string>
<string name="Head Stretch">
- é ­ã®ä¼¸ã³
+ 縦横ã®é•·ã•
</string>
<string name="Heel Height">
ヒールã®é«˜ã•
@@ -2383,7 +2555,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
ã‚ã”ã®å½¢
</string>
<string name="Join">
- 寄ã›ãŸ
+ 寄ã›ãŸèƒ¸
</string>
<string name="Jowls">
ãˆã‚‰
@@ -2488,7 +2660,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
å£ç´…ã®è‰²
</string>
<string name="Long">
- é•·
+ ロング
</string>
<string name="Long Head">
å‰å¾Œå¹…ãŒåºƒã„é ­
@@ -2884,7 +3056,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
骨張ã£ãŸè„š
</string>
<string name="Separate">
- 離れãŸ
+ 離れãŸèƒ¸
</string>
<string name="Shallow">
ãªã ã‚‰ã‹
@@ -2932,7 +3104,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
é´ã®é•·ã•
</string>
<string name="Short">
- 短
+ ショート
</string>
<string name="Short Arms">
短
@@ -3046,7 +3218,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
縦長
</string>
<string name="Sunken">
- ã“ã‘ãŸ
+ ã“ã‘ãŸã»ãŠ
</string>
<string name="Sunken Chest">
å°
@@ -3061,7 +3233,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
å‰ã¸
</string>
<string name="Tall">
- 高
+ トール
</string>
<string name="Taper Back">
後ã‚ã«å…ˆç´°
@@ -3142,7 +3314,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
ã»ãŠã®ä¸Šéƒ¨
</string>
<string name="Upper Chin Cleft">
- ã‚ã”上部ã®å‰²ã‚Œå…·åˆ
+ ã‚ã”上部ã®å‰²ã‚Œ
</string>
<string name="Upper Eyelid Fold">
二é‡ã®å¹…
@@ -3157,7 +3329,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
ウエストã®é«˜ã•
</string>
<string name="Well-Fed">
- ã¤ã¾ã£ãŸ
+ ã¤ã¾ã£ãŸã»ãŠ
</string>
<string name="White Hair">
白髪
@@ -3178,7 +3350,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
ワイルド
</string>
<string name="Wrinkles">
- ã—ã‚ã‚り
+ ã—ã‚
</string>
<string name="LocationCtrlAddLandmarkTooltip">
マイ ランドマークã«è¿½åŠ 
@@ -3190,7 +3362,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
ç¾åœ¨åœ°ã®è©³ç´°ã‚’見る
</string>
<string name="LocationCtrlComboBtnTooltip">
- マイロケーション履歴
+ マイ ロケーション履歴
</string>
<string name="LocationCtrlForSaleTooltip">
ã“ã®åœŸåœ°ã‚’購入
@@ -3213,6 +3385,15 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
<string name="LocationCtrlDamageTooltip">
体力
</string>
+ <string name="LocationCtrlAdultIconTooltip">
+ Adult リージョン
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ Moderate リージョン
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ General リージョン
+ </string>
<string name="UpdaterWindowTitle">
[APP_NAME] アップデート
</string>
@@ -3243,11 +3424,17 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
<string name="UpdaterFailStartTitle">
ビューワã®èµ·å‹•ã«å¤±æ•—ã—ã¾ã—ãŸ
</string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME] : アイテム㌠[FROM_NAME] ã‹ã‚‰åŒæ™‚ã«ãŸãã•ん読ã¿è¾¼ã¾ã‚Œã¦ã„ã‚‹ãŸã‚ã€è‡ªå‹•プレビュー㌠[TIME] 秒間無効ã¨ãªã‚Šã¾ã™ã€‚
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME] : アイテムãŒåŒæ™‚ã«ãŸãã•ん読ã¿è¾¼ã¾ã‚Œã¦ã„ã‚‹ãŸã‚ã€è‡ªå‹•プレビュー㌠[TIME] 秒間無効ã¨ãªã‚Šã¾ã™ã€‚
+ </string>
<string name="IM_logging_string">
-- インスタントメッセージã®ä¿å­˜é–‹å§‹ --
</string>
<string name="IM_typing_start_string">
- [NAME] ã¯å…¥åЛ䏭...
+ [NAME] ã¯å…¥åЛ䏭ã§ã™...
</string>
<string name="Unnamed">
(åå‰ãªã—)
@@ -3270,12 +3457,18 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
<string name="IM_moderator_label">
(モデレータ)
</string>
- <string name="started_call">
+ <string name="answered_call">
+ 相手ãŒã‚³ãƒ¼ãƒ«ã‚’å—ã‘ã¾ã—ãŸ
+ </string>
+ <string name="you_started_call">
ボイスコールを開始ã—ã¾ã™
</string>
- <string name="joined_call">
+ <string name="you_joined_call">
ボイスコールã«å‚加ã—ã¾ã—ãŸ
</string>
+ <string name="name_started_call">
+ [NAME] ã¯ãƒœã‚¤ã‚¹ã‚³ãƒ¼ãƒ«ã‚’é–‹å§‹ã—ã¾ã™
+ </string>
<string name="ringing-im">
ボイスコールã«å‚加...
</string>
@@ -3292,7 +3485,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
アドホックコンファレンス
</string>
<string name="inventory_item_offered-im">
- æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ãŒé€ã‚‰ã‚Œã¦ãã¾ã—ãŸ
+ æŒã¡ç‰©ã‚¢ã‚¤ãƒ†ãƒ ã‚’é€ã‚Šã¾ã—ãŸ
</string>
<string name="share_alert">
æŒã¡ç‰©ã‹ã‚‰ã“ã“ã«ã‚¢ã‚¤ãƒ†ãƒ ã‚’ドラッグã—ã¾ã™
@@ -3301,10 +3494,10 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
ã“ã®ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã„るユーザーã¯ã‚ãªãŸã ã‘ã§ã™ã€‚
</string>
<string name="offline_message">
- [FIRST] [LAST]ã¯ã‚ªãƒ•ラインã§ã™ã€‚
+ [FIRST] [LAST] ã¯ã‚ªãƒ•ラインã§ã™ã€‚
</string>
<string name="invite_message">
- ã“ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å¿œç­”/接続ã™ã‚‹å ´åˆã¯ã€[BUTTON NAME]をクリックã—ã¦ãã ã•ã„。
+ ã“ã®ãƒœã‚¤ã‚¹ãƒãƒ£ãƒƒãƒˆã«å¿œç­”・接続ã™ã‚‹å ´åˆã¯ã€[BUTTON NAME] をクリックã—ã¦ãã ã•ã„。
</string>
<string name="muted_message">
ã“ã®ä½äººã‚’ブロックã—ã¦ã„ã¾ã™ã€‚ メッセージをé€ã‚‹ã¨ã€ãƒ–ロックãŒè‡ªå‹•çš„ã«è§£é™¤ã•れã¾ã™ã€‚
@@ -3328,7 +3521,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
ã‚ãªãŸã«ã¯ãã®èƒ½åŠ›ãŒã‚りã¾ã›ã‚“。
</string>
<string name="not_a_mod_error">
- ã‚ãªãŸã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒ»ãƒ¢ãƒ‡ãƒ¬ãƒ¼ã‚¿ã§ã¯ã‚りã¾ã›ã‚“。
+ ã‚ãªãŸã¯ã‚»ãƒƒã‚·ãƒ§ãƒ³ãƒ¢ãƒ‡ãƒ¬ãƒ¼ã‚¿ã§ã¯ã‚りã¾ã›ã‚“。
</string>
<string name="muted">
グループã®ãƒ¢ãƒ‡ãƒ¬ãƒ¼ã‚¿ãƒ¼ãŒã€ã‚ãªãŸã®ãƒ†ã‚­ã‚¹ãƒˆãƒãƒ£ãƒƒãƒˆã‚’ç¦æ­¢ã—ã¾ã—ãŸã€‚
@@ -3337,13 +3530,13 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
グループモデレータãŒã‚ãªãŸã®ãƒ†ã‚­ã‚¹ãƒˆãƒãƒ£ãƒƒãƒˆã‚’無効化ã—ã¾ã—ãŸ
</string>
<string name="add_session_event">
- [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追加ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“
+ [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ¦ãƒ¼ã‚¶ãƒ¼ã‚’追加ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“
</string>
<string name="message">
[RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã™ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“。
</string>
<string name="message_session_event">
- [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“
+ [RECIPIENT] ã¨ã®ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ã‚‹ã“ã¨ãŒã§ãã¾ã›ã‚“
</string>
<string name="mute">
モデレート中ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
@@ -3355,7 +3548,7 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
ã‚ãªãŸã¯ã‚°ãƒ«ãƒ¼ãƒ—ã‹ã‚‰å‰Šé™¤ã•れã¾ã—ãŸã€‚
</string>
<string name="close_on_no_ability">
- ã“ã®ãƒãƒ£ãƒƒãƒˆãƒ»ã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’継続ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“
+ ã“ã®ãƒãƒ£ãƒƒãƒˆã‚»ãƒƒã‚·ãƒ§ãƒ³ã‚’継続ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“
</string>
<string name="unread_chat_single">
[SOURCES] ã¯ä½•ã‹æ–°ã—ã„ã“ã¨ã‚’言ã„ã¾ã—ãŸã€‚
@@ -3363,4 +3556,250 @@ www.secondlife.com ã‹ã‚‰æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’ダウンロードã—ã¦ãã ã
<string name="unread_chat_multiple">
[SOURCES] ã¯ä½•ã‹æ–°ã—ã„ã“ã¨ã‚’言ã„ã¾ã—ãŸã€‚
</string>
+ <string name="session_initialization_timed_out_error">
+ セッションã®åˆæœŸåŒ–ãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—ã¾ã—ãŸ
+ </string>
+ <string name="voice_morphing_url">
+ http://secondlife.com/landing/voicemorphing
+ </string>
+ <string name="paid_you_ldollars">
+ [NAME] 㯠L$[AMOUNT] 支払ã„ã¾ã—ãŸ
+ </string>
+ <string name="you_paid_ldollars">
+ [NAME] ã« L$ [AMOUNT] を支払ã„ã¾ã—ãŸï¼š[REASON]
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ L$ [AMOUNT] を支払ã„ã¾ã—ãŸã€‚
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ [NAME] ã« L$ [AMOUNT] を支払ã„ã¾ã—ãŸã€‚
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ L$ [AMOUNT] を支払ã„ã¾ã—ãŸï¼š[REASON]
+ </string>
+ <string name="for a parcel of land">
+ 土地区画ã®ãŸã‚
+ </string>
+ <string name="for a land access pass">
+ 土地ã®å…¥å ´è¨±å¯ã‚’å¾—ã‚‹ãŸã‚
+ </string>
+ <string name="for deeding land">
+ 土地を譲渡ã™ã‚‹ãŸã‚
+ </string>
+ <string name="to create a group">
+ グループを作æˆã™ã‚‹ãŸã‚
+ </string>
+ <string name="to join a group">
+ グループã«å‚加ã™ã‚‹ãŸã‚
+ </string>
+ <string name="to upload">
+ アップロードã™ã‚‹ãŸã‚
+ </string>
+ <string name="giving">
+ L$[AMOUNT] を渡ã—ã¾ã™
+ </string>
+ <string name="uploading_costs">
+ アップロード料金㯠L$[AMOUNT] ã§ã™
+ </string>
+ <string name="this_costs">
+ 料金㯠L$[AMOUNT] ã§ã™
+ </string>
+ <string name="buying_selected_land">
+ é¸æŠžã—ãŸåœŸåœ°ã‚’ L$ [AMOUNT] ã§è³¼å…¥ã—ã¾ã™
+ </string>
+ <string name="this_object_costs">
+ ã“ã®ã‚ªãƒ–ジェクト㯠L$[AMOUNT] ã§ã™
+ </string>
+ <string name="group_role_everyone">
+ 全員
+ </string>
+ <string name="group_role_officers">
+ オフィサー
+ </string>
+ <string name="group_role_owners">
+ オーナー
+ </string>
+ <string name="uploading_abuse_report">
+ アップロード中...
+
+嫌ãŒã‚‰ã›ã®å ±å‘Š
+ </string>
+ <string name="New Shape">
+ æ–°ã—ã„シェイプ
+ </string>
+ <string name="New Skin">
+ æ–°ã—ã„スキン
+ </string>
+ <string name="New Hair">
+ æ–°ã—ã„髪
+ </string>
+ <string name="New Eyes">
+ æ–°ã—ã„ç›®
+ </string>
+ <string name="New Shirt">
+ æ–°ã—ã„シャツ
+ </string>
+ <string name="New Pants">
+ æ–°ã—ã„パンツ
+ </string>
+ <string name="New Shoes">
+ æ–°ã—ã„é´
+ </string>
+ <string name="New Socks">
+ æ–°ã—ã„é´ä¸‹
+ </string>
+ <string name="New Jacket">
+ æ–°ã—ã„ジャケット
+ </string>
+ <string name="New Gloves">
+ æ–°ã—ã„æ‰‹è¢‹
+ </string>
+ <string name="New Undershirt">
+ æ–°ã—ã„下ç€ï¼ˆä¸Šï¼‰
+ </string>
+ <string name="New Underpants">
+ æ–°ã—ã„下ç€ï¼ˆä¸‹ï¼‰
+ </string>
+ <string name="New Skirt">
+ æ–°ã—ã„スカート
+ </string>
+ <string name="New Alpha">
+ æ–°ã—ã„アルファ
+ </string>
+ <string name="New Tattoo">
+ æ–°ã—ã„タトゥ
+ </string>
+ <string name="Invalid Wearable">
+ 無効ãªç€ç”¨ç‰©
+ </string>
+ <string name="New Script">
+ æ–°è¦ã‚¹ã‚¯ãƒªãƒ—ト
+ </string>
+ <string name="New Folder">
+ æ–°è¦ãƒ•ォルダ
+ </string>
+ <string name="Contents">
+ コンテンツ
+ </string>
+ <string name="Gesture">
+ ジェスãƒãƒ£ãƒ¼
+ </string>
+ <string name="Male Gestures">
+ 男性用ジェスãƒãƒ£ãƒ¼
+ </string>
+ <string name="Female Gestures">
+ 女性用ジェスãƒãƒ£ãƒ¼
+ </string>
+ <string name="Other Gestures">
+ ãã®ä»–ã®ã‚¸ã‚§ã‚¹ãƒãƒ£ãƒ¼
+ </string>
+ <string name="Speech Gestures">
+ 会話ジェスãƒãƒ£ãƒ¼
+ </string>
+ <string name="Common Gestures">
+ 一般的ジェスãƒãƒ£ãƒ¼
+ </string>
+ <string name="Male - Excuse me">
+ 男性 - ã™ã¿ã¾ã›ã‚“
+ </string>
+ <string name="Male - Get lost">
+ 男性 - Get lost
+ </string>
+ <string name="Male - Blow kiss">
+ 男性 - 投ã’キッス
+ </string>
+ <string name="Male - Boo">
+ 男性 - Boo
+ </string>
+ <string name="Male - Bored">
+ 男性 - 退屈
+ </string>
+ <string name="Male - Hey">
+ 男性 - Hey
+ </string>
+ <string name="Male - Laugh">
+ 男性 - 笑ã†
+ </string>
+ <string name="Male - Repulsed">
+ 男性 - 拒絶
+ </string>
+ <string name="Male - Shrug">
+ 男性 - è‚©ã‚’ã™ãã‚ã‚‹
+ </string>
+ <string name="Male - Stick tougue out">
+ 男性 - 舌を出ã™
+ </string>
+ <string name="Male - Wow">
+ 男性 - Wow
+ </string>
+ <string name="Female - Excuse me">
+ 女性 – ã™ã¿ã¾ã›ã‚“
+ </string>
+ <string name="Female - Get lost">
+ 女性 – ã‚ã£ã¡è¡Œã£ã¦ã‚ˆ
+ </string>
+ <string name="Female - Blow kiss">
+ 女性 - 投ã’キッス
+ </string>
+ <string name="Female - Boo">
+ 女性 – ワッï¼
+ </string>
+ <string name="Female - Bored">
+ 女性 - 退屈
+ </string>
+ <string name="Female - Hey">
+ 女性 - Hey
+ </string>
+ <string name="Female - Laugh">
+ 女性 - 笑ã†
+ </string>
+ <string name="Female - Repulsed">
+ 女性 - 拒絶
+ </string>
+ <string name="Female - Shrug">
+ 女性 - è‚©ã‚’ã™ãã‚ã‚‹
+ </string>
+ <string name="Female - Stick tougue out">
+ 女性 - 舌を出ã™
+ </string>
+ <string name="Female - Wow">
+ 女性 - Wow
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [year,datetime,slt]/[mthnum,datetime,slt]/[day,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ ãªã—/ãªã—
+ </string>
+ <string name="texture_load_dimensions_error">
+ [WIDTH]*[HEIGHT] 以上ã®ç”»åƒã¯èª­ã¿è¾¼ã‚ã¾ã›ã‚“
+ </string>
+ <string name="words_separator" value=","/>
+ <string name="server_is_down">
+ 大変申ã—訳ã”ã–ã„ã¾ã›ã‚“ãŒã€äºˆæœŸã›ã¬å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚
+
+ status.secondlifegrid.netã§ã€ã‚µãƒ¼ãƒ“スã«é–¢ã™ã‚‹æ—¢çŸ¥ã®å•題ã«ã¤ã„ã¦ãŠèª¿ã¹ãã ã•ã„。
+ å•題ãŒå¼•ãç¶šã発生ã™ã‚‹å ´åˆã¯ã€ãŠä½¿ã„ã®ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚„ファイアウォールã®è¨­å®šã‚’確èªã—ã¦ãã ã•ã„。
+ </string>
+ <string name="dateTimeWeekdaysNames">
+ 日曜日:月曜日:ç«æ›œæ—¥:水曜日:木曜日:金曜日:土曜日
+ </string>
+ <string name="dateTimeWeekdaysShortNames">
+ æ—¥:月:ç«:æ°´:木:金:土
+ </string>
+ <string name="dateTimeMonthNames">
+ 1月:2月:3月:4月:5月:6月:7月:8月:9月:10月:11月:12月
+ </string>
+ <string name="dateTimeMonthShortNames">
+ 1月:2月:3月:4月:5月:6月:7月:8月:9月:10月:11月:12月
+ </string>
+ <string name="dateTimeDayFormat">
+ [MDAY]
+ </string>
+ <string name="dateTimeAM">
+ AM
+ </string>
+ <string name="dateTimePM">
+ PM
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/ja/teleport_strings.xml b/indra/newview/skins/default/xui/ja/teleport_strings.xml
index 72c183d03b..2f67d43707 100644
--- a/indra/newview/skins/default/xui/ja/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/ja/teleport_strings.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<teleport_messages name="">
+<teleport_messages>
<message_set name="errors">
<message name="invalid_tport">
テレãƒãƒ¼ãƒˆå‡¦ç†ä¸­ã«å•題ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚ ログインã—ç›´ã™å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。
@@ -10,14 +10,14 @@
ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•度も出る場åˆã¯ã€[SUPPORT_SITE] ã‚’ã”確èªãã ã•ã„。
</message>
<message name="blocked_tport">
- 申ã—訳ã”ã–ã„ã¾ã›ã‚“。テレãƒãƒ¼ãƒˆã¯ç¾åœ¨ã€ãƒ–ロックã•れã¦ã„ã¾ã™ã€‚ã‚‚ã†å°‘ã—後ã§ã‚„り直ã—ã¦ãã ã•ã„。
+ 申ã—訳ã”ã–ã„ã¾ã›ã‚“ãŒã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã¯ç¾åœ¨ã€ãƒ–ロックã•れã¦ã„ã¾ã™ã€‚ã‚‚ã†å°‘ã—後ã§ã‚„り直ã—ã¦ãã ã•ã„。
やり直ã—ã¦ã‚‚テレãƒãƒ¼ãƒˆã§ããªã„å ´åˆã¯ã€ã„ã£ãŸã‚“ログアウトã—ã€å†åº¦ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦å•題を解決ã—ã¦ãã ã•ã„。
</message>
<message name="nolandmark_tport">
- 残念ãªãŒã‚‰ã€ã‚·ã‚¹ãƒ†ãƒ ã¯ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ç›®çš„地を探ã›ã¾ã›ã‚“ã§ã—ãŸã€‚
+ 残念ãªãŒã‚‰ã€ã‚·ã‚¹ãƒ†ãƒ ã¯ãƒ©ãƒ³ãƒ‰ãƒžãƒ¼ã‚¯ã®ç›®çš„地を探ã›ã¾ã›ã‚“ã§ã—ãŸã€‚
</message>
<message name="timeout_tport">
- 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆæŽ¥ç¶šã‚’完了ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+ 申ã—訳ã”ã–ã„ã¾ã›ã‚“ãŒã€ã‚·ã‚¹ãƒ†ãƒ ã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã®æŽ¥ç¶šã‚’完了ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
ã‚‚ã†å°‘ã—後ã§ã‚„り直ã—ã¦ãã ã•ã„。
</message>
<message name="noaccess_tport">
@@ -27,18 +27,18 @@
添付物ã¯ã€ã¾ã åˆ°ç€ã—ã¦ã„ã¾ã›ã‚“。ã‚ã¨æ•°ç§’é–“ãŠå¾…ã¡ã„ãŸã ãã‹ã€ã„ã£ãŸã‚“ログアウトã—ã€å†åº¦ãƒ­ã‚°ã‚¤ãƒ³ã—ã¦ã‹ã‚‰ãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’やり直ã—ã¦ã ã•ã„。
</message>
<message name="too_many_uploads_tport">
- ã“ã®åœ°åŸŸã®è³‡ç”£ã‚­ãƒ¥ãƒ¼ãŒç¾åœ¨è¾¼ã¿åˆã£ã¦ã„ã‚‹ãŸã‚ã€ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ»ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’時間通りã«å‡¦ç†ã™ã‚‹ã“ã¨ãŒé›£ã—ã„状æ³ã§ã™ã€‚
+ ã“ã®åœ°åŸŸã®è³‡ç”£ã‚­ãƒ¥ãƒ¼ãŒç¾åœ¨è¾¼ã¿åˆã£ã¦ã„ã‚‹ãŸã‚ã€è¦æ±‚ã•れãŸãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’処ç†ã™ã‚‹ã“ã¨ãŒé›£ã—ã„状æ³ã§ã™ã€‚
数分後ã«ã‚„り直ã™ã‹ã€ã¾ãŸã¯æ··é›‘ã—ã¦ã„ãªã„ä»–ã®åœ°åŸŸã‚’ãŠè©¦ã—ãã ã•ã„。
</message>
<message name="expired_tport">
- 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãƒ»ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’時間ã©ãŠã‚Šã«å®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚数分後ã«ã‚„り直ã—ã¦ãã ã•ã„。
+ 申ã—訳ã”ã–ã„ã¾ã›ã‚“ãŒã€ã‚·ã‚¹ãƒ†ãƒ ã¯è¦æ±‚ã•れãŸãƒ†ãƒ¬ãƒãƒ¼ãƒˆã‚’完了ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚数分後ã«ã‚„り直ã—ã¦ãã ã•ã„。
</message>
<message name="expired_region_handoff">
- 申ã—訳ã”ã–ã„ã¾ã›ã‚“。システムã¯åœ°åŸŸé–“ã®ç§»å‹•を時間ã©ãŠã‚Šã«å®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
+ 申ã—訳ã”ã–ã„ã¾ã›ã‚“ãŒã€ã‚·ã‚¹ãƒ†ãƒ ã¯åœ°åŸŸé–“ã®ç§»å‹•を時間ã©ãŠã‚Šã«å®Œäº†ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚
数分後ã«ã‚„り直ã—ã¦ãã ã•ã„。
</message>
<message name="no_host">
- テレãƒãƒ¼ãƒˆç›®çš„地を見ã¤ã‘られã¾ã›ã‚“。目的地ãŒä¸€æ™‚çš„ã«åˆ©ç”¨ã§ããªã„状態ã‹ã€ã¾ãŸã¯ã™ã§ã«æ¶ˆæ»…ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚数分後ã«ã‚„り直ã—ã¦ãã ã•ã„。
+ テレãƒãƒ¼ãƒˆã®ç›®çš„地を見ã¤ã‘られã¾ã›ã‚“。目的地ãŒä¸€æ™‚çš„ã«åˆ©ç”¨ã§ããªã„状態ã‹ã€ã¾ãŸã¯ã™ã§ã«æ¶ˆæ»…ã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚数分後ã«ã‚„り直ã—ã¦ãã ã•ã„。
</message>
<message name="no_inventory_host">
æŒã¡ç‰©ã‚·ã‚¹ãƒ†ãƒ ã¯ç¾åœ¨åˆ©ç”¨ã§ãã¾ã›ã‚“。
@@ -49,19 +49,22 @@
目的地ã«é€ä¿¡ã—ã¦ã„ã¾ã™ã€‚
</message>
<message name="redirecting">
- 別ã®ç›®çš„地ã«å†æ¡ˆå†…ã—ã¦ã„ã¾ã™ã€‚
+ 別ã®ç›®çš„地ã«ãƒªãƒ€ã‚¤ãƒ¬ã‚¯ãƒˆã—ã¦ã„ã¾ã™ã€‚
</message>
<message name="relaying">
目的地ã«ä¸­ç¶™ã—ã¦ã„ã¾ã™ã€‚
</message>
<message name="sending_home">
- ホームä½ç½®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’é€ä¿¡ã—ã¦ã„ã¾ã™ã€‚
+ ホームä½ç½®ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’é€ä¿¡ã—ã¦ã„ã¾ã™ã€‚
</message>
<message name="sending_landmark">
- ランドマークä½ç½®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’é€ä¿¡ã—ã¦ã„ã¾ã™ã€‚
+ ランドマークä½ç½®ã®ãƒªã‚¯ã‚¨ã‚¹ãƒˆã‚’é€ä¿¡ã—ã¦ã„ã¾ã™ã€‚
</message>
<message name="completing">
- テレãƒãƒ¼ãƒˆã‚’完了ã—ã¦ã„ã¾ã™ã€‚
+ テレãƒãƒ¼ãƒˆã‚’完了ã—ã¾ã™ã€‚
+ </message>
+ <message name="completed_from">
+ [T_SLURL] ã‹ã‚‰ã®ãƒ†ãƒ¬ãƒãƒ¼ãƒˆãŒå®Œäº†ã—ã¾ã—ãŸ
</message>
<message name="resolving">
目的地を解決ã—ã¦ã„ã¾ã™ã€‚
diff --git a/indra/newview/skins/default/xui/nl/floater_about.xml b/indra/newview/skins/default/xui/nl/floater_about.xml
index 10c30eb361..f71f935c24 100644
--- a/indra/newview/skins/default/xui/nl/floater_about.xml
+++ b/indra/newview/skins/default/xui/nl/floater_about.xml
@@ -1,20 +1,60 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_about" title="OVER [CAPITALIZED_APP_NAME]">
-<tab_container name="about_tab">
- <panel name="credits_panel">
- <text_editor name="credits_editor">
- Second Life wordt u aangeboden door Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl and many others.
+ <floater.string name="AboutHeader">
+ [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])
+[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </floater.string>
+ <floater.string name="AboutCompiler">
+ Gemaakt met [COMPILER] versie [COMPILER_VERSION]
+ </floater.string>
+ <floater.string name="AboutPosition">
+ U bent op [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] in [REGION] gelegen op [HOSTNAME] ([HOSTIP])
+[SERVER_VERSION]
+[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </floater.string>
+ <floater.string name="AboutSystem">
+ CPU: [CPU]
+Geheugen: [MEMORY_MB] MB
+OS Versie: [OS_VERSION]
+Grafische Kaard Vendor: [GRAPHICS_CARD_VENDOR]
+Grafische Kaard: [GRAPHICS_CARD]
+ </floater.string>
+ <floater.string name="AboutDriver">
+ Windows Grafische Driver Versie: [GRAPHICS_DRIVER_VERSION]
+ </floater.string>
+ <floater.string name="AboutLibs">
+ OpenGL Versie: [OPENGL_VERSION]
+
+libcurl Versie: [LIBCURL_VERSION]
+J2C Decoder Versie: [J2C_VERSION]
+Audio Driver Versie: [AUDIO_DRIVER_VERSION]
+Qt Webkit Versie: [QT_WEBKIT_VERSION]
+Vivox Versie: [VIVOX_VERSION]
+ </floater.string>
+ <floater.string name="none">
+ (none)
+ </floater.string>
+ <floater.string name="AboutTraffic">
+ Pakketten Verloren: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
+ </floater.string>
+ <tab_container name="about_tab">
+ <panel label="Info" name="support_panel">
+ <button label="Kopiëren naar Klembord" name="copy_btn"/>
+ </panel>
+ <panel label="Credits" name="credits_panel">
+ <text_editor name="credits_editor">
+ Second Life wordt u aangeboden door Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl and many others.
Een &apos;Dank u&apos; voor de volgende bewoners voor het helpen zorgdragen dat dit de beste versie tot nu toe is: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
To be a success in business, be daring, be first, be different. --Henry Marchant
- </text_editor>
- </panel>
- <panel name="licenses_panel">
- <text_editor name="credits_editor">
-3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
+ </text_editor>
+ </panel>
+ <panel label="Licenties" name="licenses_panel">
+ <text_editor name="credits_editor">
+ 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
APR Copyright (C) 2000-2004 The Apache Software Foundation
cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004
@@ -35,10 +75,7 @@ google-perftools Copyright (c) 2005, Google Inc.
All rights reserved. See licenses.txt for details.
Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
- </text_editor>
- </panel>
-</tab_container>
- <string name="you_are_at">
- U bent op [POSITION]
- </string>
+ </text_editor>
+ </panel>
+ </tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_about_land.xml b/indra/newview/skins/default/xui/nl/floater_about_land.xml
index 3a77de70d2..7b8f1b42ab 100644
--- a/indra/newview/skins/default/xui/nl/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/nl/floater_about_land.xml
@@ -26,14 +26,14 @@
<text name="OwnerText" left="102" width="242">
Leyla Linden
</text>
- <button label="Profiel..." label_selected="Profiel..." name="Profile..."/>
+ <button label="Profiel" name="Profile..."/>
<text name="Group:">
Groep:
</text>
<text left="102" name="GroupText" width="242"/>
- <button label="Instellen..." label_selected="Instellen..." name="Set..."/>
+ <button label="Instellen" name="Set..."/>
<check_box label="Overdracht aan groep toestaan" name="check deed" tool_tip="Een groepofficier kan dit land aan de groep overdragen, zodat het ondersteund wordt door de landallocatie van de groep."/>
- <button label="Overdragen..." label_selected="Overdragen..." name="Deed..." tool_tip="U mag alleen land overdragen indien u een officier bent in de geselecteerde groep."/>
+ <button label="Overdragen" name="Deed..." tool_tip="U mag alleen land overdragen indien u een officier bent in de geselecteerde groep."/>
<check_box label="Eigenaar maakt bijdrage met overdracht" name="check contrib" tool_tip="Wanneer het land is overgedragen aan de groep, draagt de voormalig eigenaar voldoende landtoewijzing bij om het te ondersteunen."/>
<text name="For Sale:">
Te koop:
@@ -44,7 +44,7 @@
<text name="For Sale: Price L$[PRICE].">
Prijs: L$[PRICE] (L$[PRICE_PER_SQM]/m²).
</text>
- <button label="Verkoop land..." label_selected="Verkoop land..." name="Sell Land..."/>
+ <button label="Verkoop land" name="Sell Land..."/>
<text name="For sale to">
Te koop voor: [BUYER]
</text>
@@ -74,11 +74,11 @@
0
</text>
<button left="130" width="125" label="Koop land..." label_selected="Koop land..." name="Buy Land..."/>
- <button label="Koop voor groep..." label_selected="Koop voor groep..." name="Buy For Group..."/>
+ <button label="Koop voor groep" name="Buy For Group..."/>
<button left="130" width="125" label="Koop toegangspas..." label_selected="Koop toegangspas..." name="Buy Pass..." tool_tip="Een toegangspas geeft u tijdelijk toegang tot dit land."/>
- <button label="Land Afstaan..." label_selected="Land Afstaan..." name="Abandon Land..."/>
- <button label="Land terugvorderen..." label_selected="Land terugvorderen..." name="Reclaim Land..."/>
- <button label="Lindenverkoop..." label_selected="Lindenverkoop..." name="Linden Sale..." tool_tip="Land moet in bezit zijn, de inhoud moet ingesteld zijn en niet al ter veiling zijn aangeboden."/>
+ <button label="Land Afstaan" name="Abandon Land..."/>
+ <button label="Land terugvorderen" name="Reclaim Land..."/>
+ <button label="Lindenverkoop" name="Linden Sale..." tool_tip="Land moet in bezit zijn, de inhoud moet ingesteld zijn en niet al ter veiling zijn aangeboden."/>
<panel.string name="new users only">
Alleen nieuwe gebruikers
</panel.string>
@@ -224,7 +224,7 @@ of opgedeeld.
[COUNT]
</text>
<button label="Toon" label_selected="Toon" name="ShowOwner" right="-135" width="60"/>
- <button label="Retourneren..." label_selected="Retourneren..." name="ReturnOwner..." tool_tip="Retourneer objecten naar hun eigenaren." right="-10" width="119"/>
+ <button label="Retourneren" name="ReturnOwner..." tool_tip="Retourneer objecten naar hun eigenaren." right="-10" width="119"/>
<text name="Set to group:" left="14" width="180">
Groep toewijzen:
</text>
@@ -232,7 +232,7 @@ of opgedeeld.
[COUNT]
</text>
<button label="Toon" label_selected="Toon" name="ShowGroup" right="-135" width="60"/>
- <button label="Retourneren..." label_selected="Retourneren..." name="ReturnGroup..." tool_tip="Retourneer objecten naar hun eigenaren." right="-10" width="119"/>
+ <button label="Retourneren" name="ReturnGroup..." tool_tip="Retourneer objecten naar hun eigenaren." right="-10" width="119"/>
<text name="Owned by others:" left="14" width="128">
Eigendom van anderen:
</text>
@@ -240,7 +240,7 @@ of opgedeeld.
[COUNT]
</text>
<button label="Toon" label_selected="Toon" name="ShowOther" right="-135" width="60"/>
- <button label="Retourneren..." label_selected="Retourneren..." name="ReturnOther..." tool_tip="Retourneer objecten naar hun eigenaren." right="-10" width="119"/>
+ <button label="Retourneren" name="ReturnOther..." tool_tip="Retourneer objecten naar hun eigenaren." right="-10" width="119"/>
<text name="Selected / sat upon:" left="14" width="193">
Geselecteerd/Er op gezeten
</text>
@@ -256,7 +256,7 @@ of opgedeeld.
Objecteigenaren:
</text>
<button label="Ververs lijst" label_selected="Ververs lijst" name="Refresh List" bottom="-213"/>
- <button label="Retourneer objecten..." label_selected="Retourneer objecten..." name="Return objects..." width="164" bottom="-213"/>
+ <button label="Retourneer objecten" name="Return objects..." width="164" bottom="-213"/>
<name_list name="owner list" height="104">
<column label="Type" name="type"/>
<column label="Naam" name="name"/>
@@ -407,7 +407,7 @@ of opgedeeld.
<text name="at URL:">
Media URL:
</text>
- <button label="Instellen..." label_selected="Instellen..." name="set_media_url" width="66"/>
+ <button label="Instellen" name="set_media_url"/>
<text name="Description:">
Omschrijving:
</text>
diff --git a/indra/newview/skins/default/xui/nl/floater_customize.xml b/indra/newview/skins/default/xui/nl/floater_customize.xml
index 4de26347e1..e6a4ed7a27 100644
--- a/indra/newview/skins/default/xui/nl/floater_customize.xml
+++ b/indra/newview/skins/default/xui/nl/floater_customize.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater customize" title="UITERLIJK" width="551">
- <tab_container name="customize tab container" tab_min_width="120" width="549">
+<floater name="floater customize" title="UITERLIJK">
+ <tab_container name="customize tab container" tab_min_width="120">
<placeholder label="Lichaamsdelen" name="body_parts_placeholder"/>
<panel label="Postuur" name="Shape" left="124" width="389">
<button label="Herstel" label_selected="Herstel" name="Revert"/>
@@ -462,7 +462,7 @@ slepen. Ook kunt u zelf van begin af aan een nieuwe creëren en dragen.
<button label="Herstel" label_selected="Herstel" name="Revert"/>
</panel>
</tab_container>
- <scroll_container left="254" name="panel_container"/>
+ <scroll_container name="panel_container"/>
<button label="Annuleren" label_selected="Annuleren" name="Cancel"/>
<button label="OK" label_selected="OK" name="Ok"/>
<button label="Maak kleding..." label_selected="Maak kleding..." name="Make Outfit" left="110"/>
diff --git a/indra/newview/skins/default/xui/nl/floater_joystick.xml b/indra/newview/skins/default/xui/nl/floater_joystick.xml
index 505e3cd719..1d590dc1f3 100644
--- a/indra/newview/skins/default/xui/nl/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/nl/floater_joystick.xml
@@ -45,7 +45,7 @@
<text name="ZDeadZone">
Z dode zone
</text>
- <text name="PitchDeadZone" left="4" width="110">
+ <text name="PitchDeadZone">
Stampen dode zone
</text>
<text name="YawDeadZone">
diff --git a/indra/newview/skins/default/xui/nl/floater_mute_object.xml b/indra/newview/skins/default/xui/nl/floater_mute_object.xml
index 7a34be1bd7..edea63b42c 100644
--- a/indra/newview/skins/default/xui/nl/floater_mute_object.xml
+++ b/indra/newview/skins/default/xui/nl/floater_mute_object.xml
@@ -1,13 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="mute by name" title="NEGEER OBJECT OP NAAM">
- <text name="message" bottom_delta="-40">
- Negeer op naam heeft alleen invloed op object chat
-en IM, niet op geluiden. U dient de naam van het object
-exact te typen.
+<floater name="mute by name" title="BLOKKEER VOORWERP BIJ NAAM">
+ <text bottom_delta="-40" name="message">
+ Blokkeer een Voorwerp:
</text>
- <line_editor name="object_name" bottom_delta="-58">
+ <line_editor bottom_delta="-58" name="object_name">
Object naam
</line_editor>
+ <text name="note">
+ * Blokkeerd alleen object tekst, niet de geluiden
+ </text>
<button label="Ok" name="OK"/>
<button label="Annuleren" name="Cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_report_abuse.xml b/indra/newview/skins/default/xui/nl/floater_report_abuse.xml
index 19b11ede0a..a50773c2b3 100644
--- a/indra/newview/skins/default/xui/nl/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/nl/floater_report_abuse.xml
@@ -1,30 +1,33 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_report_abuse" title="MISBRUIK RAPPORTEREN">
- <check_box label="Voeg schermafbeelding toe" name="screen_check"/>
+ <floater.string name="Screenshot">
+ Schermafbeelding
+ </floater.string>
+ <check_box label="Gebruik deze schermafbeelding" name="screen_check"/>
<text name="reporter_title" width="110">
Rapporteur:
</text>
- <text name="reporter_field" left_delta="70">
- Loremipsum Dolorsitamut
+ <text left_delta="70" name="reporter_field">
+ Loremipsum Dolorsitamut Longnamez
</text>
<text name="sim_title">
Regio:
</text>
- <text name="sim_field" left_delta="70">
+ <text left_delta="70" name="sim_field">
Regionaam
</text>
<text name="pos_title">
Positie:
</text>
- <text name="pos_field" left_delta="70">
+ <text left_delta="70" name="pos_field">
{128.1, 128.1, 15.4}
</text>
<text name="select_object_label">
- Klik de knop, daarna het object:
+ Klik de knop, vervolgens het misbruik voorwerp:
</text>
<button label="" label_selected="" name="pick_btn" tool_tip="Objectkiezer - Identificeer een object als het onderwerp van dit rapport"/>
<text name="object_name_label">
- Naam:
+ voorwerp:
</text>
<text name="object_name" width="120">
Consetetur Sadipscing
@@ -33,54 +36,53 @@
Eigenaar:
</text>
<text name="owner_name">
- Hendrerit Vulputate
+ Hendrerit Vulputate Kamawashi Longname
</text>
<combo_box name="category_combo" tool_tip="Categorie -- selecteer de categorie die dit rapport het best beschrijft">
- <combo_box.item name="Select_category" label="Selecteer categorie"/>
- <combo_box.item name="Age__Age_play" label="Leeftijd &gt; Leeftijd spelen"/>
- <combo_box.item name="Age__Adult_resident_on_Teen_Second_Life" label="Leeftijd &gt; Volwassen inwoner in Teen Second Life"/>
- <combo_box.item name="Age__Underage_resident_outside_of_Teen_Second_Life" label="Leeftijd &gt; Minderjarige inwoner buiten Teen Second Life"/>
- <combo_box.item name="Assault__Combat_sandbox___unsafe_area" label="Aanval &gt; Gevechtszandbak / onveilig gebied"/>
- <combo_box.item name="Assault__Safe_area" label="Aanval &gt; Veilig gebied"/>
- <combo_box.item name="Assault__Weapons_testing_sandbox" label="Aanval &gt; Zandbak voor het testen van wapens"/>
- <combo_box.item name="Commerce__Failure_to_deliver_product_or_service" label="Handel &gt; Product of dienst is niet geleverd"/>
- <combo_box.item name="Disclosure__Real_world_information" label="Openbaring &gt; Echte wereld informatie"/>
- <combo_box.item name="Disclosure__Remotely_monitoring chat" label="Openbaring &gt; Op afstand chat afluisteren"/>
- <combo_box.item name="Disclosure__Second_Life_information_chat_IMs" label="Openbaring &gt; Second Life informatie/chat/IMs"/>
- <combo_box.item name="Disturbing_the_peace__Unfair_use_of_region_resources" label="Vredebreuk &gt; Oneerlijk gebruik van regiomiddelen"/>
- <combo_box.item name="Disturbing_the_peace__Excessive_scripted_objects" label="Vredebreuk &gt; Excessieve gescripte objecten"/>
- <combo_box.item name="Disturbing_the_peace__Object_littering" label="Vredebreuk &gt; Objecten laten rondslingeren"/>
- <combo_box.item name="Disturbing_the_peace__Repetitive_spam" label="Vredebreuk &gt; Herhaalde spam"/>
- <combo_box.item name="Disturbing_the_peace__Unwanted_advert_spam" label="Vredebreuk &gt; Ongewenste reclame-spam"/>
- <combo_box.item name="Fraud__L$" label="Fraude &gt; L$"/>
- <combo_box.item name="Fraud__Land" label="Fraude &gt; Land"/>
- <combo_box.item name="Fraud__Pyramid_scheme_or_chain_letter" label="Fraude &gt; Piramideschema of kettingbrief"/>
- <combo_box.item name="Fraud__US$" label="Fraude &gt; US$"/>
- <combo_box.item name="Harassment__Advert_farms___visual_spam" label="Intimidatie &gt; Reclameverzamelingen / visuele spam"/>
- <combo_box.item name="Harassment__Defaming_individuals_or_groups" label="Intimidatie &gt; Individuen of groepen in diskrediet brengen"/>
- <combo_box.item name="Harassment__Impeding_movement" label="Intimidatie &gt; Beweging verhinderen"/>
- <combo_box.item name="Harassment__Sexual_harassment" label="Intimidatie &gt; Seksuele intimidatie"/>
- <combo_box.item name="Harassment__Solicting_inciting_others_to_violate_ToS" label="Intimidatie &gt; Anderen uitnodigen/aanzetten tot het schenden van de ToS"/>
- <combo_box.item name="Harassment__Verbal_abuse" label="Intimidatie &gt; Verbaal misbruik"/>
- <combo_box.item name="Indecency__Broadly_offensive_content_or_conduct" label="Onfatsoenlijkheid &gt; Globaal beledigende inhoud of gedrag"/>
- <combo_box.item name="Indecency__Inappropriate_avatar_name" label="Onfatsoenlijkheid &gt; Ongepaste avatar naam"/>
- <combo_box.item name="Indecency__Mature_content_in_PG_region" label="Onfatsoenlijkheid &gt; Ongepaste inhoud of gedrag in een PG regio"/>
- <combo_box.item name="Indecency__Inappropriate_content_in_Mature_region" label="Onfatsoenlijkheid &gt; Ongepaste inhoud of gedrag in een Mature regio"/>
- <combo_box.item name="Intellectual_property_infringement_Content_Removal" label="Inbreuk op intellectueel eigendom &gt; Verwijderen van inhoud"/>
- <combo_box.item name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit" label="Inbreuk op intellectueel eigendom &gt; CopyBot of misbruik van permissies"/>
- <combo_box.item name="Intolerance" label="Intolerantie"/>
- <combo_box.item name="Land__Abuse_of_sandbox_resources" label="Land &gt; Misbruik van zandbakmiddelen"/>
- <combo_box.item name="Land__Encroachment__Objects_textures" label="Land &gt; Indringing &gt; Objecten/texturen"/>
- <combo_box.item name="Land__Encroachment__Particles" label="Land &gt; Indringing &gt; Particles"/>
- <combo_box.item name="Land__Encroachment__Trees_plants" label="Land &gt; Indringing &gt; Bomen/planten"/>
- <combo_box.item name="Wagering_gambling" label="Weddenschappen/gokken"/>
- <combo_box.item name="Other" label="Anders"/>
+ <combo_box.item label="Selecteer categorie" name="Select_category"/>
+ <combo_box.item label="Leeftijd &gt; Leeftijd spelen" name="Age__Age_play"/>
+ <combo_box.item label="Leeftijd &gt; Volwassen inwoner in Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/>
+ <combo_box.item label="Leeftijd &gt; Minderjarige inwoner buiten Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
+ <combo_box.item label="Aanval &gt; Gevechtszandbak / onveilig gebied" name="Assault__Combat_sandbox___unsafe_area"/>
+ <combo_box.item label="Aanval &gt; Veilig gebied" name="Assault__Safe_area"/>
+ <combo_box.item label="Aanval &gt; Zandbak voor het testen van wapens" name="Assault__Weapons_testing_sandbox"/>
+ <combo_box.item label="Handel &gt; Product of dienst is niet geleverd" name="Commerce__Failure_to_deliver_product_or_service"/>
+ <combo_box.item label="Openbaring &gt; Echte wereld informatie" name="Disclosure__Real_world_information"/>
+ <combo_box.item label="Openbaring &gt; Op afstand chat afluisteren" name="Disclosure__Remotely_monitoring chat"/>
+ <combo_box.item label="Openbaring &gt; Second Life informatie/chat/IMs" name="Disclosure__Second_Life_information_chat_IMs"/>
+ <combo_box.item label="Vredebreuk &gt; Oneerlijk gebruik van regiomiddelen" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
+ <combo_box.item label="Vredebreuk &gt; Excessieve gescripte objecten" name="Disturbing_the_peace__Excessive_scripted_objects"/>
+ <combo_box.item label="Vredebreuk &gt; Objecten laten rondslingeren" name="Disturbing_the_peace__Object_littering"/>
+ <combo_box.item label="Vredebreuk &gt; Herhaalde spam" name="Disturbing_the_peace__Repetitive_spam"/>
+ <combo_box.item label="Vredebreuk &gt; Ongewenste reclame-spam" name="Disturbing_the_peace__Unwanted_advert_spam"/>
+ <combo_box.item label="Fraude &gt; L$" name="Fraud__L$"/>
+ <combo_box.item label="Fraude &gt; Land" name="Fraud__Land"/>
+ <combo_box.item label="Fraude &gt; Piramideschema of kettingbrief" name="Fraud__Pyramid_scheme_or_chain_letter"/>
+ <combo_box.item label="Fraude &gt; US$" name="Fraud__US$"/>
+ <combo_box.item label="Intimidatie &gt; Reclameverzamelingen / visuele spam" name="Harassment__Advert_farms___visual_spam"/>
+ <combo_box.item label="Intimidatie &gt; Individuen of groepen in diskrediet brengen" name="Harassment__Defaming_individuals_or_groups"/>
+ <combo_box.item label="Intimidatie &gt; Beweging verhinderen" name="Harassment__Impeding_movement"/>
+ <combo_box.item label="Intimidatie &gt; Seksuele intimidatie" name="Harassment__Sexual_harassment"/>
+ <combo_box.item label="Intimidatie &gt; Anderen uitnodigen/aanzetten tot het schenden van de ToS" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
+ <combo_box.item label="Intimidatie &gt; Verbaal misbruik" name="Harassment__Verbal_abuse"/>
+ <combo_box.item label="Onfatsoenlijkheid &gt; Globaal beledigende inhoud of gedrag" name="Indecency__Broadly_offensive_content_or_conduct"/>
+ <combo_box.item label="Onfatsoenlijkheid &gt; Ongepaste avatar naam" name="Indecency__Inappropriate_avatar_name"/>
+ <combo_box.item label="Onfatsoenlijkheid &gt; Ongepaste inhoud of gedrag in een PG regio" name="Indecency__Mature_content_in_PG_region"/>
+ <combo_box.item label="Onfatsoenlijkheid &gt; Ongepaste inhoud of gedrag in een Mature regio" name="Indecency__Inappropriate_content_in_Mature_region"/>
+ <combo_box.item label="Inbreuk op intellectueel eigendom &gt; Verwijderen van inhoud" name="Intellectual_property_infringement_Content_Removal"/>
+ <combo_box.item label="Inbreuk op intellectueel eigendom &gt; CopyBot of misbruik van permissies" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
+ <combo_box.item label="Intolerantie" name="Intolerance"/>
+ <combo_box.item label="Land &gt; Misbruik van zandbakmiddelen" name="Land__Abuse_of_sandbox_resources"/>
+ <combo_box.item label="Land &gt; Indringing &gt; Objecten/texturen" name="Land__Encroachment__Objects_textures"/>
+ <combo_box.item label="Land &gt; Indringing &gt; Particles" name="Land__Encroachment__Particles"/>
+ <combo_box.item label="Land &gt; Indringing &gt; Bomen/planten" name="Land__Encroachment__Trees_plants"/>
+ <combo_box.item label="Weddenschappen/gokken" name="Wagering_gambling"/>
+ <combo_box.item label="Anders" name="Other"/>
</combo_box>
<text name="abuser_name_title">
Misbruikernaam:
</text>
<button label="Kies inwoner" label_selected="" name="select_abuser" tool_tip="Selecteer de naam van de misbruiker uit een lijst"/>
- <check_box label="Naam van misbruiker onbekend" name="omit_abuser_name" tool_tip="Vink dit aan wanneer u niet in staat bent de naam van de misbruiker te geven"/>
<text name="abuser_name_title2">
Locatie van misbruik:
</text>
@@ -91,13 +93,11 @@
Details:
</text>
<text name="bug_aviso">
- Wees alstublieft zo specifiek mogelijk m.b.t. datum, locatie,
-aard van het misbruik, relevante chat/IM tekst, en selecteer
-het object indien mogelijk.
+ Wees zo specifiek mogelijk
</text>
<text name="incomplete_title">
- Let op: onvolledige rapporten zullen niet worden onderzocht.
+ Let Op: Onvolledige verslagen zullen niet worden onderzocht
</text>
- <button label="Annuleren" label_selected="Annuleren" name="cancel_btn"/>
<button label="Misbruik rapporteren" label_selected="Misbruik rapporteren" name="send_btn"/>
+ <button label="Annuleren" label_selected="Annuleren" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_stats.xml b/indra/newview/skins/default/xui/nl/floater_stats.xml
new file mode 100644
index 0000000000..0db3f76735
--- /dev/null
+++ b/indra/newview/skins/default/xui/nl/floater_stats.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Statistics" title="STATISTIEKEN">
+ <scroll_container name="statistics_scroll">
+ <container_view name="statistics_view">
+ <stat_view label="Basis" name="basic">
+ <stat_bar label="FPS" name="fps"/>
+ <stat_bar label="Bandbreedte" name="bandwidth"/>
+ <stat_bar label="Pakket Verlies" name="packet_loss"/>
+ <stat_bar label="Ping Sim" name="ping"/>
+ </stat_view>
+ <stat_view label="Geavanceerd" name="advanced">
+ <stat_view label="Weergeven" name="render">
+ <stat_bar label="KTris Tekenen" name="ktrisframe"/>
+ <stat_bar label="KTris Tekenen" name="ktrissec"/>
+ <stat_bar label="Totaal Voorwerpen" name="objs"/>
+ <stat_bar label="Nieuwe Voorwerpen" name="newobjs"/>
+ </stat_view>
+ <stat_view label="Textuur" name="texture">
+ <stat_bar label="Count" name="numimagesstat"/>
+ <stat_bar label="Raw Count" name="numrawimagesstat"/>
+ <stat_bar label="GL Mem" name="gltexmemstat"/>
+ <stat_bar label="Formatted Mem" name="formattedmemstat"/>
+ <stat_bar label="Raw Mem" name="rawmemstat"/>
+ <stat_bar label="Bound Mem" name="glboundmemstat"/>
+ </stat_view>
+ <stat_view label="Netwerk" name="network">
+ <stat_bar label="Pakketten In" name="packetsinstat"/>
+ <stat_bar label="Pakketten Uit" name="packetsoutstat"/>
+ <stat_bar label="Voorwerpen" name="objectkbitstat"/>
+ <stat_bar label="Textuur" name="texturekbitstat"/>
+ <stat_bar label="Bezit" name="assetkbitstat"/>
+ <stat_bar label="Lagen" name="layerskbitstat"/>
+ <stat_bar label="Daadwerkelijk In" name="actualinkbitstat"/>
+ <stat_bar label="Daadwerkelijk Out" name="actualoutkbitstat"/>
+ <stat_bar label="VFS Pending Ops" name="vfspendingoperations"/>
+ </stat_view>
+ </stat_view>
+ <stat_view label="Simulator" name="sim">
+ <stat_bar label="Tijd Dilatatie" name="simtimedilation"/>
+ <stat_bar label="Sim FPS" name="simfps"/>
+ <stat_bar label="Physics FPS" name="simphysicsfps"/>
+ <stat_view label="Physics Details" name="physicsdetail">
+ <stat_bar label="Pinned Objects" name="physicspinnedtasks"/>
+ <stat_bar label="Low LOD Objects" name="physicslodtasks"/>
+ <stat_bar label="Memory Allocated" name="physicsmemoryallocated"/>
+ <stat_bar label="Agent Updates/Sec" name="simagentups"/>
+ <stat_bar label="Main Agents" name="simmainagents"/>
+ <stat_bar label="Child Agents" name="simchildagents"/>
+ <stat_bar label="Voorwerpen" name="simobjects"/>
+ <stat_bar label="Actieve Voorwerpen" name="simactiveobjects"/>
+ <stat_bar label="Actieve Scripts" name="simactivescripts"/>
+ <stat_bar label="Actieve Evenementen" name="simscripteps"/>
+ <stat_bar label="Pakketten In" name="siminpps"/>
+ <stat_bar label="Pakketten Uit" name="simoutpps"/>
+ <stat_bar label="Wachtende Downloads" name="simpendingdownloads"/>
+ <stat_bar label="Wachtende Uploads" name="simpendinguploads"/>
+ <stat_bar label="Total Unacked Bytes" name="simtotalunackedbytes"/>
+ </stat_view>
+ <stat_view label="Tijd (ms)" name="simperf">
+ <stat_bar label="Totale Frame Tijd" name="simframemsec"/>
+ <stat_bar label="Net Time" name="simnetmsec"/>
+ <stat_bar label="Physics Time" name="simsimphysicsmsec"/>
+ <stat_bar label="Simulatie Tijd" name="simsimothermsec"/>
+ <stat_bar label="Agent Tijd" name="simagentmsec"/>
+ <stat_bar label="Plaatjes Tijd" name="simimagesmsec"/>
+ <stat_bar label="Script Tijd" name="simscriptmsec"/>
+ </stat_view>
+ </stat_view>
+ </container_view>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/nl/floater_tools.xml b/indra/newview/skins/default/xui/nl/floater_tools.xml
index f79d3dbd6b..212cac0a5b 100644
--- a/indra/newview/skins/default/xui/nl/floater_tools.xml
+++ b/indra/newview/skins/default/xui/nl/floater_tools.xml
@@ -33,7 +33,10 @@
<combo_box.item name="Reference" label="Referentie"
/>
</combo_box>
- <check_box left="136" label="Beide zijden uitrekken" name="checkbox uniform"/>
+ <check_box left="136" name="checkbox uniform"/>
+ <text name="checkbox uniform label">
+ Beide zijden uitrekken
+ </text>
<check_box left="136" label="Texturen uitrekken" name="checkbox stretch textures"/>
<check_box left="136" label="Gebruik grid" name="checkbox snap to grid"/>
<button label="Opties..." label_selected="Opties..." name="Options..." height="18" bottom_delta="-15"/>
@@ -403,7 +406,7 @@
<text name="glow label">
Gloed
</text>
- <check_box label="Volledige &#10;helderheid" name="checkbox fullbright" bottom_delta="-21"/>
+ <check_box label="Volledige helderheid" name="checkbox fullbright"/>
<text name="tex gen">
Mapping
</text>
diff --git a/indra/newview/skins/default/xui/nl/language_settings.xml b/indra/newview/skins/default/xui/nl/language_settings.xml
index 71418d446a..dc4663705f 100644
--- a/indra/newview/skins/default/xui/nl/language_settings.xml
+++ b/indra/newview/skins/default/xui/nl/language_settings.xml
@@ -3,9 +3,9 @@
<strings>
<!-- Locale Information -->
- <string name="MicrosoftLocale">english</string>
- <string name="DarwinLocale">C</string>
- <string name="LinuxLocale">C</string>
+ <string name="MicrosoftLocale">dutch</string>
+ <string name="DarwinLocale">nl_NL.UTF-8</string>
+ <string name="LinuxLocale">nl_NL.UTF-8</string>
<!--
datetimeToCodes["wkday"] = "%a"; // Thu
diff --git a/indra/newview/skins/default/xui/nl/menu_inventory.xml b/indra/newview/skins/default/xui/nl/menu_inventory.xml
index 6a514422b9..c3b47cbddb 100644
--- a/indra/newview/skins/default/xui/nl/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/nl/menu_inventory.xml
@@ -12,7 +12,7 @@
<menu_item_call label="Nieuw script" name="New Script"/>
<menu_item_call label="Nieuwe notitie" name="New Note"/>
<menu_item_call label="Nieuw gebaar" name="New Gesture"/>
- <menu name="New Clothes" label="Nieuwe Kleding">
+ <menu label="Nieuwe Kleding" name="New Clothes">
<menu_item_call label="Nieuw shirt" name="New Shirt"/>
<menu_item_call label="Nieuwe broek" name="New Pants"/>
<menu_item_call label="Nieuwe schoenen" name="New Shoes"/>
@@ -22,31 +22,47 @@
<menu_item_call label="Nieuwe handschoenen" name="New Gloves"/>
<menu_item_call label="Nieuw onderhemd" name="New Undershirt"/>
<menu_item_call label="Nieuwe onderbroek" name="New Underpants"/>
+ <menu_item_call label="Nieuw Alpha Masker" name="New Alpha Mask"/>
+ <menu_item_call label="Nieuwe Tattoo" name="New Tattoo"/>
</menu>
- <menu name="New Body Parts" label="Nieuwe Lichaamsdelen">
+ <menu label="Nieuwe Lichaamsdelen" name="New Body Parts">
<menu_item_call label="Nieuwe postuur" name="New Shape"/>
<menu_item_call label="Nieuwe huid" name="New Skin"/>
<menu_item_call label="Nieuw haar" name="New Hair"/>
<menu_item_call label="Nieuwe ogen" name="New Eyes"/>
</menu>
+ <menu label="Change Type" name="Change Type">
+ <menu_item_call label="Standaard" name="Default"/>
+ <menu_item_call label="Handschoenen" name="Gloves"/>
+ <menu_item_call label="Jas" name="Jacket"/>
+ <menu_item_call label="Broek" name="Pants"/>
+ <menu_item_call label="Vorm" name="Shape"/>
+ <menu_item_call label="Schoenen" name="Shoes"/>
+ <menu_item_call label="Overhemd" name="Shirt"/>
+ <menu_item_call label="Rok" name="Skirt"/>
+ <menu_item_call label="Onderbroek" name="Underpants"/>
+ <menu_item_call label="Onderhemd" name="Undershirt"/>
+ </menu>
<menu_item_call label="Teleport" name="Landmark Open"/>
<menu_item_call label="Open" name="Animation Open"/>
<menu_item_call label="Open" name="Sound Open"/>
<menu_item_call label="Verwijderen item" name="Purge Item"/>
<menu_item_call label="Herstellen item" name="Restore Item"/>
+ <menu_item_call label="Ga Naar Link" name="Goto Link"/>
<menu_item_call label="Open" name="Open"/>
<menu_item_call label="Eigenschappen" name="Properties"/>
<menu_item_call label="Hernoemen" name="Rename"/>
<menu_item_call label="Kopieer asset UUID" name="Copy Asset UUID"/>
<menu_item_call label="Kopiëren" name="Copy"/>
<menu_item_call label="Plakken" name="Paste"/>
+ <menu_item_call label="Plak Als Link" name="Paste As Link"/>
<menu_item_call label="Verwijderen" name="Delete"/>
<menu_item_call label="Items uitdoen" name="Take Off Items"/>
<menu_item_call label="Voeg toe aan kleding" name="Add To Outfit"/>
<menu_item_call label="Vervang kleding" name="Replace Outfit"/>
<menu_item_call label="Start conferentie chat" name="Conference Chat Folder"/>
<menu_item_call label="Afspelen" name="Sound Play"/>
- <menu_item_call label="Over landmarkering" name="Teleport To Landmark"/>
+ <menu_item_call label="Over Landmark" name="About Landmark"/>
<menu_item_call label="In wereld afspelen" name="Animation Play"/>
<menu_item_call label="Lokaal afspelen" name="Animation Audition"/>
<menu_item_call label="Stuur instant message" name="Send Instant Message"/>
@@ -54,8 +70,8 @@
<menu_item_call label="Start conferentie chat" name="Conference Chat"/>
<menu_item_call label="Activeren" name="Activate"/>
<menu_item_call label="Deactiveren" name="Deactivate"/>
+ <menu_item_call label="Opslaan Als" name="Save As"/>
<menu_item_call label="Losmaken van jezelf" name="Detach From Yourself"/>
- <menu_item_call label="Herstellen naar laatste positie" name="Restore to Last Position"/>
<menu_item_call label="Dragen" name="Object Wear"/>
<menu label="Bevestigen aan" name="Attach To"/>
<menu label="Bevestigen aan HUD" name="Attach To HUD"/>
diff --git a/indra/newview/skins/default/xui/nl/menu_inventory_add.xml b/indra/newview/skins/default/xui/nl/menu_inventory_add.xml
new file mode 100644
index 0000000000..09330b9597
--- /dev/null
+++ b/indra/newview/skins/default/xui/nl/menu_inventory_add.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_inventory_add">
+ <menu label="Upload" name="upload">
+ <menu_item_call label="Plaatje (L$[COST])..." name="Upload Image"/>
+ <menu_item_call label="Geluid (L$[COST])..." name="Upload Sound"/>
+ <menu_item_call label="Animatie (L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="Bulk (L$[COST] per bestand)..." name="Bulk Upload"/>
+ </menu>
+ <menu_item_call label="Nieuwe Map" name="New Folder"/>
+ <menu_item_call label="Nieuw Script" name="New Script"/>
+ <menu_item_call label="Nieuw Notitie" name="New Note"/>
+ <menu_item_call label="Nieuw Gebaar" name="New Gesture"/>
+ <menu label="Nieuwe Kleding" name="New Clothes">
+ <menu_item_call label="Nieuw Overhemd" name="New Shirt"/>
+ <menu_item_call label="Nieuwe Broek" name="New Pants"/>
+ <menu_item_call label="Nieuwe Schoenen" name="New Shoes"/>
+ <menu_item_call label="Nieuwe Sokken" name="New Socks"/>
+ <menu_item_call label="Nieuw Jas" name="New Jacket"/>
+ <menu_item_call label="Nieuw Rok" name="New Skirt"/>
+ <menu_item_call label="Nieuwe Handschoenen" name="New Gloves"/>
+ <menu_item_call label="Nieuw Hemd" name="New Undershirt"/>
+ <menu_item_call label="Nieuwe Onderbroek" name="New Underpants"/>
+ <menu_item_call label="Nieuwe Alpha" name="New Alpha"/>
+ <menu_item_call label="Nieuwe Tattoo" name="New Tattoo"/>
+ </menu>
+ <menu label="Nieuwe Lichaamsdelen" name="New Body Parts">
+ <menu_item_call label="Nieuwe Vorm" name="New Shape"/>
+ <menu_item_call label="Nieuwe Huid" name="New Skin"/>
+ <menu_item_call label="Nieuw Haar" name="New Hair"/>
+ <menu_item_call label="Nieuwe Ogen" name="New Eyes"/>
+ </menu>
+</menu>
diff --git a/indra/newview/skins/default/xui/nl/menu_mini_map.xml b/indra/newview/skins/default/xui/nl/menu_mini_map.xml
index 0a6dfa3465..f7c09660ea 100644
--- a/indra/newview/skins/default/xui/nl/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/nl/menu_mini_map.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="popup">
+<menu name="Popup">
<menu_item_call label="Zoom dichtbij" name="Zoom Close"/>
<menu_item_call label="Zoom gemiddeld" name="Zoom Medium"/>
<menu_item_call label="Zoom veraf" name="Zoom Far"/>
diff --git a/indra/newview/skins/default/xui/nl/menu_picks.xml b/indra/newview/skins/default/xui/nl/menu_picks.xml
new file mode 100644
index 0000000000..2e53dbda58
--- /dev/null
+++ b/indra/newview/skins/default/xui/nl/menu_picks.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Picks">
+ <menu_item_call label="Info" name="pick_info"/>
+ <menu_item_call label="Bewerken" name="pick_edit"/>
+ <menu_item_call label="Teleport" name="pick_teleport"/>
+ <menu_item_call label="Kaart" name="pick_map"/>
+ <menu_item_call label="Verweideren" name="pick_delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/nl/panel_group_roles.xml b/indra/newview/skins/default/xui/nl/panel_group_roles.xml
index ffaaa8137a..507906c0d7 100644
--- a/indra/newview/skins/default/xui/nl/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/nl/panel_group_roles.xml
@@ -1,92 +1,50 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Leden &amp; Rollen" name="roles_tab">
- <string name="default_needs_apply_text">
- Er zijn niet toegepaste wijzigingen op de huidige sub-tab.
- </string>
- <string name="want_apply_text">
- Wilt u deze wijzigingen toepassen?
- </string>
- <button label="?" name="help_button"/>
- <panel name="members_header">
- <text name="static">
- Leden &amp; Rollen
- </text>
- <text name="static2">
- Groepsleden krijgen Rollen met Mogelijkheden toegekend. Deze instellingen
-kunnen eenvoudig aangepast worden, zodat meer organisatie en flexibiliteit
-mogelijk is.
- </text>
- </panel>
- <panel name="roles_header">
- <text name="static">
- Rollen
- </text>
- <text name="role_properties_modifiable">
- Selecteer een Rol hieronder. U kunt zijn Naam, Omschrijving en
-Lid Titel wijzigen.
- </text>
- <text name="role_properties_not_modifiable">
- Selecteer een Rol hieronder om zijn eigenschappen, Leden en
-toegestane Mogelijkheden te bekijken.
- </text>
- <text bottom_delta="-28" name="role_actions_modifiable">
- U kunt ook Mogelijkheden aan de Rol toekennen.
- </text>
- <text name="role_actions_not_modifiable">
- U kunt de toegekende Mogelijkheden bekijken, maar niet wijzigen.
- </text>
- </panel>
- <panel name="actions_header">
- <text name="static">
- Mogelijkheden
- </text>
- <text name="static2">
- U kunt de Omschrijving van een Mogelijkheid bekijken en welke Rollen en
-Leden de Mogelijkheid kunnen uitvoeren.
- </text>
- </panel>
+ <panel.string name="default_needs_apply_text">
+ Er zijn niet opgeslagen veranderingen op de huidige tab
+ </panel.string>
+ <panel.string name="want_apply_text">
+ Wilt u deze wijzigingen opslaan?
+ </panel.string>
<tab_container height="164" name="roles_tab_container">
- <panel height="148" label="Leden" name="members_sub_tab" tool_tip="Leden">
- <line_editor bottom="127" name="search_text"/>
- <button label="Zoeken" name="search_button"/>
- <button label="Alles Tonen" name="show_all_button"/>
- <name_list bottom_delta="-105" height="104" name="member_list">
- <column label="Lid Naam" name="name"/>
- <column label="Gedoneerde Tier" name="donated"/>
- <column label="Laatste Login" name="online"/>
- </name_list>
- <button label="Nieuw Lid Uitnodigen..." name="member_invite"/>
- <button label="Uitwerpen uit de Groep" name="member_eject"/>
- <string name="help_text">
+ <panel height="148" label="LEDEN" name="members_sub_tab" tool_tip="Leden">
+ <panel.string name="help_text">
U kunt Rollen aan Leden toewijzen of van Leden afnemen. Selecteer meerdere Leden door de Ctrl toets ingedrukt te houden en op hun namen te klikken.
- </string>
+ </panel.string>
+ <filter_editor label="Filter Leden" name="filter_input"/>
+ <name_list bottom_delta="-105" height="104" name="member_list">
+ <name_list.columns label="Lid Naam" name="name"/>
+ <name_list.columns label="Donaties" name="donated"/>
+ <name_list.columns label="Laatste Login" name="online"/>
+ </name_list>
+ <button label="Uitnodigen" name="member_invite"/>
+ <button label="Uitwerpen" name="member_eject"/>
</panel>
- <panel height="148" label="Rollen" name="roles_sub_tab">
- <line_editor bottom="127" name="search_text"/>
- <button label="Zoeken" name="search_button"/>
- <button label="Alles Tonen" name="show_all_button"/>
+ <panel height="148" label="ROLLEN" name="roles_sub_tab">
+ <panel.string name="help_text">
+ Rollen hebben een titel en een toegestane lijst met Vaardigheden die Leden kunnen uitvoeren. Leden kunnen tot 1 of meer Rollen behoren. Een groep kan tot 10 Rollen bevatten, inclusief de Iedereen en Eigenaren Rollen.
+ </panel.string>
+ <panel.string name="cant_delete_role">
+ De &apos;Iedereen&apos; en &apos;Eigenaren&apos; Rollen zijn speciaal en kunnen niet verwijderd worden.
+ </panel.string>
+ <panel.string name="power_folder_icon">
+ Inv_FolderClosed
+ </panel.string>
+ <filter_editor label="Filter Rollen" name="filter_input"/>
<scroll_list bottom_delta="-104" height="104" name="role_list">
- <column label="Rol Naam" name="name"/>
- <column label="Titel" name="title"/>
- <column label="Leden" name="members"/>
+ <scroll_list.columns label="Rol" name="name"/>
+ <scroll_list.columns label="Titel" name="title"/>
+ <scroll_list.columns label="Leden" name="members"/>
</scroll_list>
- <button label="Nieuwe Rol Maken..." name="role_create"/>
+ <button label="Nieuwe Rol..." name="role_create"/>
<button label="Rol Verwijderen" name="role_delete"/>
- <string name="help_text">
- Rollen hebben een titel en een toegestane lijst met Mogelijkheden die Leden kunnen uitvoeren. Leden kunnen tot 1 of meer Rollen behoren. Een groep kan tot 10 Rollen bevatten, inclusief de Iedereen en Eigenaren Rollen.
- </string>
- <string name="cant_delete_role">
- De &apos;Iedereen&apos; en &apos;Eigenaren&apos; Rollen zijn speciaal en kunnen niet verwijderd worden.
- </string>
</panel>
- <panel height="148" label="Mogelijkheden" name="actions_sub_tab">
- <line_editor bottom="127" name="search_text"/>
- <button label="Zoeken" name="search_button"/>
- <button label="Alles Tonen" name="show_all_button"/>
- <scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Selecteer een Mogelijkheid om meer details te bekijken."/>
- <string name="help_text">
+ <panel height="148" label="VAARDIGHEDEN" name="actions_sub_tab" tool_tip="Je kan een vaardigheid&apos;s beschrijving en welke Rollen en Leden kunnen uitvoeren van de Vaardigheid.">
+ <panel.string name="help_text">
Mogelijkheden stellen leden in staat om specifieke dingen in een groep te doen. Er is een brede variëteit aan Mogelijkheden.
- </string>
+ </panel.string>
+ <filter_editor label="Filter Vaardigheden" name="filter_input"/>
+ <scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Selecteer een Vaardigheid om meer details te bekijken"/>
</panel>
</tab_container>
<panel name="members_footer">
@@ -96,15 +54,12 @@ Leden de Mogelijkheid kunnen uitvoeren.
<text name="static2">
Toegestane Mogelijkheden
</text>
- <scroll_list name="member_allowed_actions" tool_tip="Kijk voor details van elke Toegestane Mogelijkheid in de Mogelijkheden tab."/>
+ <scroll_list name="member_allowed_actions" tool_tip="Voor details van elke Toegestane Vaardigheid in de Mogelijkheden tab"/>
</panel>
<panel name="roles_footer">
<text name="static">
Naam
</text>
- <text name="static2">
- Omschrijving
- </text>
<line_editor name="role_name">
Werknemers
</line_editor>
@@ -114,30 +69,33 @@ Leden de Mogelijkheid kunnen uitvoeren.
<line_editor name="role_title">
(wachten)
</line_editor>
+ <text name="static2">
+ Omschrijving
+ </text>
<text_editor name="role_description">
(wachten)
</text_editor>
<text name="static4">
- Toegewezen Leden
+ Toegewezen Rollen
</text>
+ <check_box label="Leden Onthullen" name="role_visible_in_list" tool_tip="Bepaalt of leden van deze rol zichtbaar zijn in de Algemeen tab voor mensen buiten de groep."/>
<text name="static5" tool_tip="Een lijst met Mogelijkheden die de geselecteerd rol kan uitvoeren.">
Toegestane Mogelijkheden
</text>
- <check_box label="Leden zijn zichtbaar" name="role_visible_in_list" tool_tip="Bepaalt of leden van deze rol zichtbaar zijn in de Algemeen tab voor mensen buiten de groep."/>
- <scroll_list name="role_allowed_actions" tool_tip="Kijk voor details van elke Toegestane Mogelijkheid in de Mogelijkheden tab."/>
+ <scroll_list name="role_allowed_actions" tool_tip="For details of each allowed ability see the abilities tab"/>
</panel>
<panel name="actions_footer">
<text name="static">
- Omschrijving
+ Vaardigheid omschrijving
</text>
<text_editor name="action_description">
Dit is de Mogelijkheid &apos;Werp Leden uit deze Groep&apos;. Alleen een Eigenaar kan een andere Eigenaar uitwerpen.
</text_editor>
<text name="static2">
- Rollen met Mogelijkheid
+ Rollen met deze vaardigheid
</text>
<text name="static3">
- Leden met Mogelijkheid
+ Leden met deze vaardigheid
</text>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_login.xml b/indra/newview/skins/default/xui/nl/panel_login.xml
index 235e15e7fb..bcc888061f 100644
--- a/indra/newview/skins/default/xui/nl/panel_login.xml
+++ b/indra/newview/skins/default/xui/nl/panel_login.xml
@@ -6,34 +6,36 @@
<panel.string name="forgot_password_url">
http://secondlife.com/account/request.php?lang=nl-NL
</panel.string>
-<panel name="login_widgets">
- <text name="first_name_text">
- Voornaam:
- </text>
- <text name="last_name_text">
- Achternaam:
- </text>
- <text name="password_text">
- Wachtwoord:
- </text>
- <text name="start_location_text">
- Startlocatie:
- </text>
- <combo_box name="start_location_combo">
- <combo_box.item name="MyHome" label="Mijn Thuis"/>
- <combo_box.item name="MyLastLocation" label="Mijn Laatste Locatie"/>
- <combo_box.item name="Typeregionname" label="&lt; Type regio naam &gt;"/>
- </combo_box>
- <check_box label="Onthoud wachtwoord" name="remember_check"/>
- <button label="Inloggen" label_selected="Inloggen" name="connect_btn"/>
- <text name="create_new_account_text">
- Nieuw account maken
- </text>
- <text name="forgot_password_text">
- Naam of wachtwoord vergeten?
- </text>
- <text name="channel_text">
- [VERSION]
- </text>
-</panel>
+ <panel name="login_widgets">
+ <text name="first_name_text">
+ Voornaam:
+ </text>
+ <line_editor name="first_name_edit" tool_tip="[SECOND_LIFE] Voornaam"/>
+ <text name="last_name_text">
+ Achternaam:
+ </text>
+ <line_editor name="last_name_edit" tool_tip="[SECOND_LIFE] Achternaam"/>
+ <text name="password_text">
+ Paswoord:
+ </text>
+ <button label="Inloggen" label_selected="Inloggen" name="connect_btn"/>
+ <text name="start_location_text">
+ Start locatie:
+ </text>
+ <combo_box name="start_location_combo">
+ <combo_box.item label="Mijn Laatste Locatie" name="MyLastLocation"/>
+ <combo_box.item label="Mijn Thuis" name="MyHome"/>
+ <combo_box.item label="&lt;Tik regio naam&gt;" name="Typeregionname"/>
+ </combo_box>
+ <check_box label="Onthoud paswoord" name="remember_check"/>
+ <text name="create_new_account_text">
+ Maak een nieuwe account
+ </text>
+ <text name="forgot_password_text">
+ Naam of paswoord vergeten?
+ </text>
+ <text name="channel_text">
+ [VERSION]
+ </text>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_main_inventory.xml b/indra/newview/skins/default/xui/nl/panel_main_inventory.xml
new file mode 100644
index 0000000000..c533cc20c0
--- /dev/null
+++ b/indra/newview/skins/default/xui/nl/panel_main_inventory.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Dingen" name="main inventory panel">
+ <panel.string name="Title">
+ Dingen
+ </panel.string>
+ <filter_editor label="Filter" name="inventory search editor"/>
+ <tab_container name="inventory filter tabs">
+ <inventory_panel label="Alle Voorwerpen" name="All Items"/>
+ <inventory_panel label="Recente Voorwerpen" name="Recent Items"/>
+ </tab_container>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Toon extra opties"/>
+ <button name="add_btn" tool_tip="Voeg nieuw voorwerp toe"/>
+ <dnd_button name="trash_btn" tool_tip="Remove selected item"/>
+ </panel>
+ <menu_bar name="Inventory Menu">
+ <menu label="Bestand" name="File">
+ <menu_item_call label="Open" name="Open"/>
+ <menu label="Upload" name="upload">
+ <menu_item_call label="Plaatje (L$[COST])..." name="Upload Image"/>
+ <menu_item_call label="Geluid (L$[COST])..." name="Upload Sound"/>
+ <menu_item_call label="Animatie (L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="Bulk (L$[COST] per bestand)..." name="Bulk Upload"/>
+ </menu>
+ <menu_item_call label="Nieuw Venster" name="New Window"/>
+ <menu_item_call label="Toon Filters" name="Show Filters"/>
+ <menu_item_call label="Reset Filters" name="Reset Current"/>
+ <menu_item_call label="Sluit Alle Mappen" name="Close All Folders"/>
+ <menu_item_call label="Prullenbak Leegmaken" name="Empty Trash"/>
+ <menu_item_call label="Leeg Verloren En Gevonden" name="Empty Lost And Found"/>
+ </menu>
+ <menu label="Maken" name="Create">
+ <menu_item_call label="Nieuwe Map" name="New Folder"/>
+ <menu_item_call label="Nieuw Script" name="New Script"/>
+ <menu_item_call label="Nieuwe Notitie" name="New Note"/>
+ <menu_item_call label="Nieuw Gebaar" name="New Gesture"/>
+ <menu label="Nieuwe Kleding" name="New Clothes">
+ <menu_item_call label="Nieuw Overhemd" name="New Shirt"/>
+ <menu_item_call label="Nieuwe Broek" name="New Pants"/>
+ <menu_item_call label="Nieuwe Schoenen" name="New Shoes"/>
+ <menu_item_call label="Nieuwe Sokken" name="New Socks"/>
+ <menu_item_call label="Nieuwe Jas" name="New Jacket"/>
+ <menu_item_call label="Nieuwe Rok" name="New Skirt"/>
+ <menu_item_call label="Nieuwe Handschoenen" name="New Gloves"/>
+ <menu_item_call label="Nieuw Hemd" name="New Undershirt"/>
+ <menu_item_call label="Nieuwe Onderbroek" name="New Underpants"/>
+ <menu_item_call label="Nieuwe Alpha" name="New Alpha"/>
+ <menu_item_call label="Nieuwe Tattoo" name="New Tattoo"/>
+ </menu>
+ <menu label="Nieuwe Lichaamsdelen" name="New Body Parts">
+ <menu_item_call label="Nieuwe Vorm" name="New Shape"/>
+ <menu_item_call label="Nieuwe Huid" name="New Skin"/>
+ <menu_item_call label="Nieuw Haar" name="New Hair"/>
+ <menu_item_call label="Nieuwe Ogen" name="New Eyes"/>
+ </menu>
+ </menu>
+ <menu label="Sorteer" name="Sort">
+ <menu_item_check label="Bij Naam" name="By Name"/>
+ <menu_item_check label="Bij Datum" name="By Date"/>
+ <menu_item_check label="Mappen Altijd Op Naam" name="Folders Always By Name"/>
+ <menu_item_check label="Syteemmappen Naar Boven" name="System Folders To Top"/>
+ </menu>
+ </menu_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/nl/panel_region_estate.xml b/indra/newview/skins/default/xui/nl/panel_region_estate.xml
index 7a5fa801d9..08b68c8d30 100644
--- a/indra/newview/skins/default/xui/nl/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/nl/panel_region_estate.xml
@@ -26,7 +26,7 @@ zullen alle regio&apos;s in de estate beïnvloeden.
<text name="Only Allow">
Beperk toegang tot:
</text>
- <check_box label="Inwoners met betalingsinformatie &#10;opgeslagen" name="limit_payment" tool_tip="Verban ongeïdentificeerde inwoners."/>
+ <check_box label="Inwoners met betalingsinformatie opgeslagen" name="limit_payment" tool_tip="Verban ongeïdentificeerde inwoners."/>
<check_box label="Leeftijdgeverifieerde volwassenen" name="limit_age_verified" tool_tip="Verban inwoners die hun leeftijd niet geverifieerd hebben. Zie support.secondlife.com voor meer informatie." bottom_delta="-30"/>
<check_box label="Voice chat toestaan" name="voice_chat_check"/>
<button label="?" name="voice_chat_help"/>
diff --git a/indra/newview/skins/default/xui/nl/panel_world_map.xml b/indra/newview/skins/default/xui/nl/panel_world_map.xml
index 11855b7fc1..d9a0b66fbc 100644
--- a/indra/newview/skins/default/xui/nl/panel_world_map.xml
+++ b/indra/newview/skins/default/xui/nl/panel_world_map.xml
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="world_map">
+ <panel.string name="Loading">
+ Laden...
+ </panel.string>
+ <panel.string name="InvalidLocation">
+ Ongeldige Locatie
+ </panel.string>
<panel.string name="world_map_north">
N
</panel.string>
diff --git a/indra/newview/skins/default/xui/nl/strings.xml b/indra/newview/skins/default/xui/nl/strings.xml
index 0be5ec9e86..ae8d3b89dc 100644
--- a/indra/newview/skins/default/xui/nl/strings.xml
+++ b/indra/newview/skins/default/xui/nl/strings.xml
@@ -4,10 +4,21 @@
For example, the strings used in avatar chat bubbles, and strings
that are returned from one component and may appear in many places-->
<strings>
- <string name="create_account_url">http://join.secondlife.com/index.php?lang=nl-NL</string>
+ <string name="SUPPORT_SITE">
+ Second Life Ondersteunings Portaal
+ </string>
+ <string name="StartupDetectingHardware">
+ Detecteert hardware...
+ </string>
+ <string name="StartupLoading">
+ Laden
+ </string>
<string name="LoginInProgress">
Inloggen. Het kan lijken dat [APP_NAME] is vastgelopen. Wacht u alstublieft... .
</string>
+ <string name="LoginInProgressNoFrozen">
+ Inloggen...
+ </string>
<string name="LoginAuthenticating">
Authenticeren
</string>
@@ -26,11 +37,14 @@
<string name="LoginInitializingMultimedia">
Multimedia initialiseren...
</string>
+ <string name="LoginInitializingFonts">
+ Lettertypen laden...
+ </string>
<string name="LoginVerifyingCache">
- Cache bestanden verifiëren (kan 60-90 seconden duren)...
+ Veriveren cache bestanden (kan 60-90 seconden duren)...
</string>
<string name="LoginProcessingResponse">
- Antwoord verwerken...
+ Reactie Verwerken...
</string>
<string name="LoginInitializingWorld">
Wereld initialiseren...
@@ -56,9 +70,15 @@
<string name="LoginDownloadingClothing">
Kleding downloaden...
</string>
+ <string name="LoginFailedNoNetwork">
+ Netwerk Fout: Kon geen verbinding maken, kijk uw nerwerk connectie na alstublieft.
+ </string>
<string name="Quit">
Afsluiten
</string>
+ <string name="create_account_url">
+ http://join.secondlife.com/index.php?lang=nl-NL
+ </string>
<string name="AgentLostConnection">
Deze regio kan problemen ondervinden. Controleer alstublieft uw verbinding met het internet.
</string>
@@ -77,39 +97,9 @@
<string name="TooltipIsGroup">
(Groep)
</string>
- <string name="TooltipFlagScript">
- Script
- </string>
- <string name="TooltipFlagPhysics">
- Fysiek
- </string>
- <string name="TooltipFlagTouch">
- Aanraken
- </string>
- <string name="TooltipFlagL$">
- L$
- </string>
- <string name="TooltipFlagDropInventory">
- Deponeer inventaris
- </string>
- <string name="TooltipFlagPhantom">
- Fantoom
- </string>
- <string name="TooltipFlagTemporary">
- Tijdelijk
- </string>
- <string name="TooltipFlagRightClickMenu">
- (Rechtsklikken voor menu)
- </string>
- <string name="TooltipFreeToCopy">
- Vrij te kopiëren
- </string>
<string name="TooltipForSaleL$">
Te koop: L$[AMOUNT]
</string>
- <string name="TooltipForSaleMsg">
- Te koop: [MESSAGE]
- </string>
<string name="TooltipFlagGroupBuild">
Groep bouwen
</string>
@@ -137,6 +127,76 @@
<string name="TooltipMustSingleDrop">
Slechts een enkel item kan hier naartoe gesleept worden
</string>
+ <string name="TooltipHttpUrl">
+ Klik om deze web pagina te bekijken
+ </string>
+ <string name="TooltipSLURL">
+ Klik om deze locatie informatie te bekijken
+ </string>
+ <string name="TooltipAgentUrl">
+ Klik om deze inwoner zijn profiel te bekijken
+ </string>
+ <string name="TooltipGroupUrl">
+ Klik om deze groeps informatie te bekijken
+ </string>
+ <string name="TooltipEventUrl">
+ Klik om deze evenement informatie te bekijken
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Klik om deze advertentie te bekijken
+ </string>
+ <string name="TooltipParcelUrl">
+ Klik om deze perceel informatie te bekijken
+ </string>
+ <string name="TooltipTeleportUrl">
+ Klik om naar deze lokatie te teleporteren
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Klik om deze object informatie te bekijken
+ </string>
+ <string name="TooltipMapUrl">
+ Klik om deze locatie op een map te bekijken
+ </string>
+ <string name="TooltipSLAPP">
+ Klik om het secondlife:// commando te starten
+ </string>
+ <string name="CurrentURL" value="HuidigeURL: [HuidigeURL]"/>
+ <string name="SLurlLabelTeleport">
+ Teleporteer naar
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Toon Map voor
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Sluiten (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Sluiten (Ctrl+W)
+ </string>
+ <string name="BUTTON_RESTORE">
+ Restore
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Minimaliseren
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Afscheuren
+ </string>
+ <string name="BUTTON_DOCK">
+ Koppelen
+ </string>
+ <string name="BUTTON_UNDOCK">
+ Loskoppelen
+ </string>
+ <string name="BUTTON_HELP">
+ Toon Help
+ </string>
+ <string name="Searching">
+ Zoeken...
+ </string>
+ <string name="NoneFound">
+ Geen gevonden.
+ </string>
<string name="RetrievingData">
Ophalen...
</string>
@@ -191,8 +251,77 @@
<string name="AssetErrorUnknownStatus">
Onbekende status
</string>
- <string name="AvatarEditingApparance">
- (Uiterlijk bewerken)
+ <string name="texture">
+ textuur
+ </string>
+ <string name="sound">
+ geluid
+ </string>
+ <string name="calling card">
+ visitekaart
+ </string>
+ <string name="landmark">
+ landmarkering
+ </string>
+ <string name="legacy script">
+ legacy script
+ </string>
+ <string name="clothing">
+ kleding
+ </string>
+ <string name="object">
+ object
+ </string>
+ <string name="note card">
+ notecard
+ </string>
+ <string name="folder">
+ map
+ </string>
+ <string name="root">
+ root
+ </string>
+ <string name="lsl2 script">
+ LSL2 script
+ </string>
+ <string name="lsl bytecode">
+ LSL bytecode
+ </string>
+ <string name="tga texture">
+ tga textuur
+ </string>
+ <string name="body part">
+ lichaamsdeel
+ </string>
+ <string name="snapshot">
+ foto
+ </string>
+ <string name="lost and found">
+ Verloren en Gevonden
+ </string>
+ <string name="targa image">
+ targa plaatje
+ </string>
+ <string name="trash">
+ Prullenbak
+ </string>
+ <string name="jpeg image">
+ jpeg plaatje
+ </string>
+ <string name="animation">
+ animatie
+ </string>
+ <string name="gesture">
+ gebaar
+ </string>
+ <string name="simstate">
+ simstate
+ </string>
+ <string name="favorite">
+ favorieten
+ </string>
+ <string name="symbolic link">
+ link
</string>
<string name="AvatarAway">
Afwezig
@@ -414,7 +543,19 @@
Laden...
</string>
<string name="worldmap_offline">
- Offline
+ Off line
+ </string>
+ <string name="worldmap_results_none_found">
+ Geen gevonden.
+ </string>
+ <string name="Ok">
+ OK
+ </string>
+ <string name="Premature end of file">
+ Vroegtijdig eind van bestand
+ </string>
+ <string name="ST_NO_JOINT">
+ Kan niet ROOT of JOINT vinden.
</string>
<string name="whisper">
fluistert:
@@ -422,6 +563,57 @@
<string name="shout">
schreeuwt:
</string>
+ <string name="ringing">
+ Verbinden met in-wereld voice chat...
+ </string>
+ <string name="connected">
+ Verbonden
+ </string>
+ <string name="unavailable">
+ Voice is niet beschikbaar op uw huidige locatie
+ </string>
+ <string name="hang_up">
+ Verbinding met in-wereld voicechat verbroken
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ &apos;[OBJECTNAME]&apos;, een object van &apos;[OWNERNAME]&apos;, gevestigd in [REGIONNAME] op [REGIONPOS], is toestemming verleend om te: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ &apos;[OBJECTNAME]&apos;, een object van &apos;[OWNERNAME]&apos;, gevestigd in [REGIONNAME] op [REGIONPOS], is toestemming geweigerd om te: [PERMISSIONS].
+ </string>
+ <string name="ScriptTakeMoney">
+ Linden dollars (L$) van u wegnemen
+ </string>
+ <string name="ActOnControlInputs">
+ Acteren op uw bedieningsinvoer
+ </string>
+ <string name="RemapControlInputs">
+ Uw bedieningsinvoer herdefiniëren
+ </string>
+ <string name="AnimateYourAvatar">
+ Animeer uw avatar
+ </string>
+ <string name="AttachToYourAvatar">
+ Bevestig aan uw avatar
+ </string>
+ <string name="ReleaseOwnership">
+ Eigendom vrijgeven en openbaar worden
+ </string>
+ <string name="LinkAndDelink">
+ Koppelen met en ontkoppelen van andere objecten
+ </string>
+ <string name="AddAndRemoveJoints">
+ Toevoegen en verwijderen koppelingen met andere objecten
+ </string>
+ <string name="ChangePermissions">
+ Wijzig zijn permissies
+ </string>
+ <string name="TrackYourCamera">
+ Volg uw camera
+ </string>
+ <string name="ControlYourCamera">
+ Bedien uw camera
+ </string>
<string name="SIM_ACCESS_PG">
PG
</string>
@@ -440,8 +632,6 @@
<string name="land_type_unknown">
(onbekend)
</string>
- <string name="covenant_never_modified">Laatst gewijzigd: (nooit)</string>
- <string name="covenant_modified">Laatst gewijzigd: </string>
<string name="all_files">
Alle bestanden
</string>
@@ -487,17 +677,739 @@
<string name="choose_the_directory">
Kies folder
</string>
+ <string name="AvatarSetNotAway">
+ Niet Afwezig Instellen
+ </string>
+ <string name="AvatarSetAway">
+ Afwezig Instellen
+ </string>
+ <string name="AvatarSetNotBusy">
+ Niet Bezig Instellen
+ </string>
+ <string name="AvatarSetBusy">
+ Bezig Instellen
+ </string>
+ <string name="shape">
+ Postuur
+ </string>
+ <string name="skin">
+ Huid
+ </string>
+ <string name="hair">
+ Haar
+ </string>
+ <string name="eyes">
+ Ogen
+ </string>
+ <string name="shirt">
+ Hemd
+ </string>
+ <string name="pants">
+ Broek
+ </string>
+ <string name="shoes">
+ Schoenen
+ </string>
+ <string name="socks">
+ Sokken
+ </string>
+ <string name="jacket">
+ Jas
+ </string>
+ <string name="gloves">
+ Handschoenen
+ </string>
+ <string name="undershirt">
+ onderhemd
+ </string>
+ <string name="underpants">
+ Onderbroek
+ </string>
+ <string name="skirt">
+ Rok
+ </string>
+ <string name="alpha">
+ Alpha
+ </string>
+ <string name="tattoo">
+ Tattoo
+ </string>
+ <string name="invalid">
+ ongeldig
+ </string>
+ <string name="next">
+ Volgende
+ </string>
+ <string name="ok">
+ OK
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Groep Mededeling
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Groep Mededelingen
+ </string>
+ <string name="GroupNotifySentBy">
+ Verzonden Door:
+ </string>
+ <string name="GroupNotifyAttached">
+ Bijgevoegt:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ Bekijk alle mededelingen en bijlages van verzonden Mededelingen in het verleden
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Open Bijlage
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Sla Bijlage Op
+ </string>
+ <string name="TeleportOffer">
+ Teleporteer Aanbieding
+ </string>
+ <string name="StartUpNotification">
+ [%d] Nieuwe mededelingen aangekomen terwijl u weg was ...
+ </string>
+ <string name="StartUpNotifications">
+ [%d] Nieuwe mededelingen aangekomen terwijl u weg was ...
+ </string>
+ <string name="OverflowInfoChannelString">
+ U heeft [%d] meer mededelingen
+ </string>
+ <string name="BodyPartsRightArm">
+ Rechter Arm
+ </string>
+ <string name="BodyPartsHead">
+ Hoofd
+ </string>
+ <string name="BodyPartsLeftArm">
+ Linker Arm
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Linker Been
+ </string>
+ <string name="BodyPartsTorso">
+ Torso
+ </string>
+ <string name="BodyPartsRightLeg">
+ Rechter Been
+ </string>
+ <string name="GraphicsQualityLow">
+ Laag
+ </string>
+ <string name="GraphicsQualityMid">
+ Middel
+ </string>
+ <string name="GraphicsQualityHigh">
+ Hoog
+ </string>
+ <string name="LeaveMouselook">
+ Druk op ESC om terug te keren naar Wereld Zicht
+ </string>
+ <string name="InventoryNoMatchingItems">
+ Geen overeenkomende objecten gevonden in de voorraad.
+ </string>
+ <string name="InventoryNoTexture">
+ Je hebt geen kopie van deze texture in je inventaris
+ </string>
+ <string name="no_transfer" value="(no transfer)"/>
+ <string name="no_modify" value="(no modify)"/>
+ <string name="no_copy" value="(no copy)"/>
+ <string name="worn" value="(worn)"/>
+ <string name="link" value="(link)"/>
+ <string name="broken_link" value="(broken_link)&quot;"/>
+ <string name="LoadingContents">
+ Loading contents...
+ </string>
+ <string name="NoContents">
+ No contents
+ </string>
+ <string name="WornOnAttachmentPoint" value="(worn on [ATTACHMENT_POINT])"/>
+ <string name="Chat" value="Chat :"/>
+ <string name="Sound" value="Geluid :"/>
+ <string name="Wait" value="--- Wachten :"/>
+ <string name="AnimFlagStop" value="Stop Animatie :"/>
+ <string name="AnimFlagStart" value="Start Animatie :"/>
+ <string name="Wave" value="Wave"/>
+ <string name="HelloAvatar" value="Hallo, avatar!"/>
+ <string name="ViewAllGestures" value="Bekijk alles &gt;"/>
+ <string name="Animations" value="Animaties,"/>
+ <string name="Calling Cards" value="Calling Cards,"/>
+ <string name="Clothing" value="Kleding,"/>
+ <string name="Gestures" value="Gestures,"/>
+ <string name="Landmarks" value="Landmarks,"/>
+ <string name="Notecards" value="Notecards,"/>
+ <string name="Objects" value="Objecten,"/>
+ <string name="Scripts" value="Scripts,"/>
+ <string name="Sounds" value="Geluiden,"/>
+ <string name="Textures" value="Textures,"/>
+ <string name="Snapshots" value="Snapshots,"/>
+ <string name="No Filters" value="Nee"/>
+ <string name="Since Logoff" value="- Sinds Afmelden"/>
+ <string name="InvFolder My Inventory">
+ Mijn Inventaris
+ </string>
+ <string name="InvFolder My Favorites">
+ Mijn Favorieten
+ </string>
+ <string name="InvFolder Library">
+ Bibliotheek
+ </string>
+ <string name="InvFolder Textures">
+ Textures
+ </string>
+ <string name="InvFolder Sounds">
+ Geluiden
+ </string>
+ <string name="InvFolder Calling Cards">
+ Calling Cards
+ </string>
+ <string name="InvFolder Landmarks">
+ Landmarks
+ </string>
+ <string name="InvFolder Scripts">
+ Scripts
+ </string>
+ <string name="InvFolder Clothing">
+ Kleding
+ </string>
+ <string name="InvFolder Objects">
+ Objecten
+ </string>
+ <string name="InvFolder Notecards">
+ Notecards
+ </string>
+ <string name="InvFolder New Folder">
+ Nieuwe Map
+ </string>
+ <string name="InvFolder Inventory">
+ Inventaris
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Ongecomprimeerde Afbeeldingen
+ </string>
+ <string name="InvFolder Body Parts">
+ Lichaams Delen
+ </string>
+ <string name="InvFolder Trash">
+ Afval
+ </string>
+ <string name="InvFolder Photo Album">
+ Foto Album
+ </string>
+ <string name="InvFolder Lost And Found">
+ Verloren en Gevonden
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Ongecomprimeerde Geluiden
+ </string>
+ <string name="InvFolder Animations">
+ Animaties
+ </string>
+ <string name="InvFolder Gestures">
+ Gebaren
+ </string>
+ <string name="InvFolder favorite">
+ Favoriten
+ </string>
+ <string name="InvFolder Current Outfit">
+ Huidige Uitrusting
+ </string>
+ <string name="InvFolder My Outfits">
+ Mijn Uitrustingen
+ </string>
+ <string name="InvFolder Friends">
+ Vrienden
+ </string>
+ <string name="InvFolder All">
+ Alles
+ </string>
+ <string name="Buy">
+ Koop
+ </string>
+ <string name="BuyforL$">
+ Koop voor L$
+ </string>
+ <string name="Stone">
+ Steen
+ </string>
+ <string name="Metal">
+ Metaal
+ </string>
+ <string name="Glass">
+ Glas
+ </string>
+ <string name="Wood">
+ Hout
+ </string>
+ <string name="Flesh">
+ Vlees
+ </string>
+ <string name="Plastic">
+ Plastic
+ </string>
+ <string name="Rubber">
+ Rubber
+ </string>
+ <string name="Light">
+ Licht
+ </string>
+ <string name="KBShift">
+ Shift
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ Borstkas
+ </string>
+ <string name="Skull">
+ Schedel
+ </string>
+ <string name="Left Shoulder">
+ Linker Schouder
+ </string>
+ <string name="Right Shoulder">
+ Rechter Schouder
+ </string>
+ <string name="Left Hand">
+ Linker Hand
+ </string>
+ <string name="Right Hand">
+ Rechter Hand
+ </string>
+ <string name="Left Foot">
+ Linker Voet
+ </string>
+ <string name="Right Foot">
+ Rechter Voet
+ </string>
+ <string name="Spine">
+ Ruggegraat
+ </string>
+ <string name="Pelvis">
+ Bekken
+ </string>
+ <string name="Mouth">
+ Mond
+ </string>
+ <string name="Chin">
+ Kin
+ </string>
+ <string name="Left Ear">
+ Linker Oor
+ </string>
+ <string name="Right Ear">
+ Rechter Oor
+ </string>
+ <string name="Left Eyeball">
+ Linker Oogbal
+ </string>
+ <string name="Right Eyeball">
+ Rechter Oogbal
+ </string>
+ <string name="Nose">
+ Neus
+ </string>
+ <string name="R Upper Arm">
+ R Boven Arm
+ </string>
+ <string name="R Forearm">
+ R Onder Arm
+ </string>
+ <string name="L Upper Arm">
+ L Boven Arm
+ </string>
+ <string name="L Forearm">
+ L Onder Arm
+ </string>
+ <string name="Right Hip">
+ Rechter Heup
+ </string>
+ <string name="R Upper Leg">
+ R Boven Been
+ </string>
+ <string name="R Lower Leg">
+ R Onder Been
+ </string>
+ <string name="Left Hip">
+ Linker Heub
+ </string>
+ <string name="L Upper Leg">
+ L Boven Been
+ </string>
+ <string name="L Lower Leg">
+ L Onder Been
+ </string>
+ <string name="Stomach">
+ Maag
+ </string>
+ <string name="Left Pec">
+ Left Pec
+ </string>
+ <string name="Right Pec">
+ Right Pec
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS] oud
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS] oud
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS] oud
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS] oud
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS] oud
+ </string>
+ <string name="TodayOld">
+ Vandaag toegetreden
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] jaar
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] jaar
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] jaar
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] maand
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] maanden
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] maanden
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] week
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] weken
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] weken
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] dag
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] dagen
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] dagen
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] lid
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] leden
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] leden
+ </string>
+ <string name="AcctTypeResident">
+ bewoner
+ </string>
+ <string name="AcctTypeTrial">
+ Trial
+ </string>
+ <string name="AcctTypeCharterMember">
+ Charter Member
+ </string>
+ <string name="AcctTypeEmployee">
+ Linden Lab Werknemer
+ </string>
+ <string name="PaymentInfoUsed">
+ Betalings info gebruikt
+ </string>
+ <string name="PaymentInfoOnFile">
+ Betalings info op bestand
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ Geen betalings info op bestand
+ </string>
+ <string name="AgeVerified">
+ Leeftijd gecontroleerd
+ </string>
+ <string name="NotAgeVerified">
+ Niet leeftijd gecontroleerd
+ </string>
+ <string name="Center 2">
+ Centrum 2
+ </string>
+ <string name="Top Right">
+ Rechts Boven
+ </string>
+ <string name="Top">
+ Boven
+ </string>
+ <string name="Top Left">
+ Links Boven
+ </string>
+ <string name="Center">
+ Centrum
+ </string>
+ <string name="Bottom Left">
+ Links beneden
+ </string>
+ <string name="Bottom">
+ Beneden
+ </string>
+ <string name="Bottom Right">
+ Rechts beneden
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Dedownload, nu samenstellen
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ Script niet gevonden op server.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Problem downloading
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Onvoldoende rechten om een script te downloaden.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Onvoldoende rechten voor
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Onbekende fout te downloaden
+ </string>
+ <string name="CompileQueueTitle">
+ Hercompilatie vooruitgang
+ </string>
+ <string name="CompileQueueStart">
+ Hercompilatie
+ </string>
+ <string name="ResetQueueTitle">
+ Reset Vooruitgang
+ </string>
+ <string name="ResetQueueStart">
+ reset
+ </string>
+ <string name="RunQueueTitle">
+ Set Running Progress
+ </string>
+ <string name="RunQueueStart">
+ set running
+ </string>
+ <string name="NotRunQueueTitle">
+ Set Not Running Progress
+ </string>
+ <string name="NotRunQueueStart">
+ set not running
+ </string>
+ <string name="CompileSuccessful">
+ Compileren succesvol!
+ </string>
+ <string name="CompileSuccessfulSaving">
+ Compileren succesvol, opslaan...
+ </string>
+ <string name="SaveComplete">
+ Opslaan gereed.
+ </string>
+ <string name="ObjectOutOfRange">
+ Script (object buiten het bereik)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ Object [OBJECT] eigendom van [OWNER]
+ </string>
+ <string name="GroupsNone">
+ geen
+ </string>
+ <string name="Group" value="(group)"/>
+ <string name="Unknown">
+ (Unknown)
+ </string>
+ <string name="SummaryForTheWeek" value="Samenvatting voor deze week, vanaf"/>
+ <string name="NextStipendDay" value="The next stipend day is"/>
+ <string name="GroupIndividualShare" value="Groep Individueel Aandeel"/>
+ <string name="Balance">
+ Banksaldo
+ </string>
+ <string name="Credits">
+ Credits
+ </string>
+ <string name="Debits">
+ Debiteert
+ </string>
+ <string name="Total">
+ Totaal
+ </string>
+ <string name="NoGroupDataFound">
+ Geen groep gegevens gevonden voor groep
+ </string>
+ <string name="IMParentEstate">
+ parent estate
+ </string>
+ <string name="IMMainland">
+ mainland
+ </string>
+ <string name="IMTeen">
+ tiener
+ </string>
+ <string name="RegionInfoError">
+ fout
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ all estates owned by [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ all estates that you own
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ all estates that you manage for [OWNER]
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Toegestane bewoners: ([ALLOWEDAGENTS], max [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Toegestane groepen: ([ALLOWEDGROUPS], max [MAXACCESS])
+ </string>
+ <string name="CursorPos">
+ Lijn [LINE], Column [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] gevonden
+ </string>
+ <string name="PanelContentsNewScript">
+ Nieuw Script
+ </string>
+ <string name="MuteByName">
+ (by name)
+ </string>
+ <string name="MuteAgent">
+ (resident)
+ </string>
+ <string name="MuteObject">
+ (object)
+ </string>
+ <string name="MuteGroup">
+ (group)
+ </string>
+ <string name="RegionNoCovenant">
+ There is no Covenant provided for this Estate.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ There is no Covenant provided for this Estate. The land on this estate is being sold by the Estate owner, not Linden Lab. Please contact the Estate Owner for sales details.
+ </string>
+ <string name="covenant_last_modified">
+ Laatst bewerkt:
+ </string>
+ <string name="none_text" value="(none)"/>
+ <string name="never_text" value="(never)"/>
+ <string name="GroupOwned">
+ Groep Eigendom
+ </string>
+ <string name="Public">
+ Openbaar
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Klikken: [TELEPORT] teleport, [MAP] map, [PROFILE] profiel
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (zal bijwerken na publiceren)
+ </string>
+ <string name="MultiPreviewTitle">
+ Preview
+ </string>
+ <string name="MultiPropertiesTitle">
+ Eigenschappen
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ Een object genaamd
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ Eigendom van groep
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ Eigendom van een onbekende groep
+ </string>
+ <string name="InvOfferOwnedBy">
+ Eigendom van
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ Eigendom van onbekende gebruiker
+ </string>
+ <string name="InvOfferGaveYou">
+ gaf je
+ </string>
+ <string name="InvOfferYouDecline">
+ You decline
+ </string>
+ <string name="InvOfferFrom">
+ van
+ </string>
+ <string name="GroupMoneyTotal">
+ Totaal
+ </string>
+ <string name="GroupMoneyBought">
+ kocht
+ </string>
+ <string name="GroupMoneyPaidYou">
+ betaald u
+ </string>
+ <string name="GroupMoneyPaidInto">
+ gestort
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ bought pass to
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ betaalde vergoeding voor evenement
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ betaalde prijs voor evenement
+ </string>
+ <string name="GroupMoneyBalance">
+ Banksaldo
+ </string>
+ <string name="GroupMoneyCredits">
+ Credits
+ </string>
+ <string name="GroupMoneyDebits">
+ Debiteert
+ </string>
+ <string name="ViewerObjectContents">
+ Inhoud
+ </string>
+ <string name="AcquiredItems">
+ Verworven objecten
+ </string>
+ <string name="Cancel">
+ Annuleren
+ </string>
+ <string name="UploadingCosts">
+ Uploading [%s] kosten
+ </string>
+ <string name="UnknownFileExtension">
+ Onbekende extensie [.%s]
+Verwacht .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Voeg Landmark toe...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Bewerk Landmark...
+ </string>
<string name="accel-mac-control">
- &#8963;
+ ⌃
</string>
<string name="accel-mac-command">
- &#8984;
+ ⌘
</string>
<string name="accel-mac-option">
- &#8997;
+ ⌥
</string>
<string name="accel-mac-shift">
- &#8679;
+ ⇧
</string>
<string name="accel-win-control">
Ctrl+
@@ -508,82 +1420,1790 @@
<string name="accel-win-shift">
Shift+
</string>
- <string name="GraphicsQualityLow">
- Laag
+ <string name="FileSaved">
+ Bestand Opgeslagen
</string>
- <string name="GraphicsQualityMid">
- Middel
+ <string name="Receiving">
+ Ontvangen
</string>
- <string name="GraphicsQualityHigh">
+ <string name="AM">
+ AM
+ </string>
+ <string name="PM">
+ PM
+ </string>
+ <string name="PST">
+ PST
+ </string>
+ <string name="PDT">
+ PDT
+ </string>
+ <string name="Forward">
+ Vooruit
+ </string>
+ <string name="Left">
+ Links
+ </string>
+ <string name="Right">
+ Rechts
+ </string>
+ <string name="Back">
+ Achteruit
+ </string>
+ <string name="North">
+ Noord
+ </string>
+ <string name="South">
+ Zuid
+ </string>
+ <string name="West">
+ West
+ </string>
+ <string name="East">
+ Oost
+ </string>
+ <string name="Up">
+ Omhoog
+ </string>
+ <string name="Down">
+ Omlaag
+ </string>
+ <string name="Any Category">
+ Elke Categorie
+ </string>
+ <string name="Shopping">
+ Boodschappen
+ </string>
+ <string name="Land Rental">
+ Land Verhuur
+ </string>
+ <string name="Property Rental">
+ Verhuur van onroerend goed
+ </string>
+ <string name="Special Attraction">
+ Speciale Attractie
+ </string>
+ <string name="New Products">
+ Nieuwe Producten
+ </string>
+ <string name="Employment">
+ Employment
+ </string>
+ <string name="Wanted">
+ Gezocht
+ </string>
+ <string name="Service">
+ Service
+ </string>
+ <string name="Personal">
+ Personal
+ </string>
+ <string name="None">
+ Geen
+ </string>
+ <string name="Linden Location">
+ Linden locatie
+ </string>
+ <string name="Adult">
+ Adult
+ </string>
+ <string name="Arts&amp;Culture">
+ Kunst &amp; Cultuur
+ </string>
+ <string name="Business">
+ Zakelijk
+ </string>
+ <string name="Educational">
+ Educatief
+ </string>
+ <string name="Gaming">
+ Spelen
+ </string>
+ <string name="Hangout">
+ Ontmoetingsplaats
+ </string>
+ <string name="Newcomer Friendly">
+ Nieuwkomervriendelijk
+ </string>
+ <string name="Parks&amp;Nature">
+ Parken &amp; natuur
+ </string>
+ <string name="Residential">
+ Woongebied
+ </string>
+ <string name="Stage">
+ Stage
+ </string>
+ <string name="Other">
+ Anders
+ </string>
+ <string name="Any">
+ Any
+ </string>
+ <string name="You">
+ Jij
+ </string>
+ <string name="Multiple Media">
+ Meerdere Media
+ </string>
+ <string name="Play Media">
+ Play/Pause Media
+ </string>
+ <string name="MBCmdLineError">
+ An error was found parsing the command line.
+Please see: http://wiki.secondlife.com/wiki/Client_parameters
+Error:
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] Command line usage:
+ </string>
+ <string name="MBUnableToAccessFile">
+ [APP_NAME] is unable to access a file that it needs.
+
+This can be because you somehow have multiple copies running, or your system incorrectly thinks a file is open.
+If this message persists, restart your computer and try again.
+If it continues to persist, you may need to completely uninstall [APP_NAME] and reinstall it.
+ </string>
+ <string name="MBFatalError">
+ Fatal Error
+ </string>
+ <string name="MBRequiresAltiVec">
+ [APP_NAME] requires a processor with AltiVec (G4 or later).
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] is already running.
+Check your task bar for a minimized copy of the program.
+If this message persists, restart your computer.
+ </string>
+ <string name="MBFrozenCrashed">
+ [APP_NAME] appears to have frozen or crashed on the previous run.
+Would you like to send a crash report?
+ </string>
+ <string name="MBAlert">
+ Alert
+ </string>
+ <string name="MBNoDirectX">
+ [APP_NAME] is unable to detect DirectX 9.0b or greater.
+[APP_NAME] uses DirectX to detect hardware and/or outdated drivers that can cause stability problems, poor performance and crashes. While you can run [APP_NAME] without it, we highly recommend running with DirectX 9.0b.
+
+Do you wish to continue?
+ </string>
+ <string name="MBWarning">
+ Warning
+ </string>
+ <string name="MBNoAutoUpdate">
+ Automatic updating is not yet implemented for Linux.
+Please download the latest version from www.secondlife.com.
+ </string>
+ <string name="MBRegClassFailed">
+ RegisterClass failed
+ </string>
+ <string name="MBError">
+ Error
+ </string>
+ <string name="MBFullScreenErr">
+ Unable to run fullscreen at [WIDTH] x [HEIGHT].
+Running in window.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Shutdown Error while destroying window (DestroyWindow() failed)
+ </string>
+ <string name="MBShutdownErr">
+ Shutdown Error
+ </string>
+ <string name="MBDevContextErr">
+ Can&apos;t make GL device context
+ </string>
+ <string name="MBPixelFmtErr">
+ Can&apos;t find suitable pixel format
+ </string>
+ <string name="MBPixelFmtDescErr">
+ Can&apos;t get pixel format description
+ </string>
+ <string name="MBTrueColorWindow">
+ [APP_NAME] requires True Color (32-bit) to run.
+Please go to your computer&apos;s display settings and set the color mode to 32-bit.
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] is unable to run because it can&apos;t get an 8 bit alpha channel. Usually this is due to video card driver issues.
+Please make sure you have the latest video card drivers installed.
+Also be sure your monitor is set to True Color (32-bit) in Control Panels &gt; Display &gt; Settings.
+If you continue to receive this message, contact the [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ Can&apos;t set pixel format
+ </string>
+ <string name="MBGLContextErr">
+ Can&apos;t create GL rendering context
+ </string>
+ <string name="MBGLContextActErr">
+ Can&apos;t activate GL rendering context
+ </string>
+ <string name="MBVideoDrvErr">
+ [APP_NAME] is unable to run because your video card drivers did not install properly, are out of date, or are for unsupported hardware. Please make sure you have the latest video card drivers and even if you do have the latest, try reinstalling them.
+
+If you continue to receive this message, contact the [SUPPORT_SITE].
+ </string>
+ <string name="5 O&apos;Clock Shadow">
+ Stoppels
+ </string>
+ <string name="All White">
+ Alles Wit
+ </string>
+ <string name="Anime Eyes">
+ Ogen Animeren
+ </string>
+ <string name="Arced">
+ Gebogen
+ </string>
+ <string name="Arm Length">
+ Arm Lengte
+ </string>
+ <string name="Attached">
+ Bijgevoegt
+ </string>
+ <string name="Attached Earlobes">
+ Bijgevoegde Oorlellen
+ </string>
+ <string name="Back Bangs">
+ Achterkant Pony
+ </string>
+ <string name="Back Bangs Down">
+ Achterkant Pony Neer
+ </string>
+ <string name="Back Bangs Up">
+ Achterkant Pony Omhoog
+ </string>
+ <string name="Back Fringe">
+ Achterkant Franje
+ </string>
+ <string name="Back Hair">
+ Achterkant Haar
+ </string>
+ <string name="Back Hair Down">
+ Achterkant Haar Neer
+ </string>
+ <string name="Back Hair Up">
+ Achterkant Haar Omhoog
+ </string>
+ <string name="Baggy">
+ Oogwallen
+ </string>
+ <string name="Bangs">
+ Pony
+ </string>
+ <string name="Bangs Down">
+ Pony Neer
+ </string>
+ <string name="Bangs Up">
+ Pony Omhoog
+ </string>
+ <string name="Beady Eyes">
+ Kraaloogjes
+ </string>
+ <string name="Belly Size">
+ Buik Grootte
+ </string>
+ <string name="Big">
+ Groot
+ </string>
+ <string name="Big Butt">
+ Grote Kont
+ </string>
+ <string name="Big Eyeball">
+ Grote Oogbol
+ </string>
+ <string name="Big Hair Back">
+ Haar Volume Achter
+ </string>
+ <string name="Big Hair Front">
+ Haar Volume Voor
+ </string>
+ <string name="Big Hair Top">
+ Haar Volume Boven
+ </string>
+ <string name="Big Head">
+ Groot Hoofd
+ </string>
+ <string name="Big Pectorals">
+ Groote Borstspieren
+ </string>
+ <string name="Big Spikes">
+ Grote Stekels
+ </string>
+ <string name="Black">
+ Zwart
+ </string>
+ <string name="Blonde">
+ Blond
+ </string>
+ <string name="Blonde Hair">
+ Blond Haar
+ </string>
+ <string name="Blush">
+ Blozen
+ </string>
+ <string name="Blush Color">
+ Bloos Kleur
+ </string>
+ <string name="Blush Opacity">
+ Bloos Opaciteit
+ </string>
+ <string name="Body Definition">
+ Lichaam Definitie
+ </string>
+ <string name="Body Fat">
+ Lichaam vet
+ </string>
+ <string name="Body Freckles">
+ Lichaam Sproeten
+ </string>
+ <string name="Body Thick">
+ Lichaam Dik
+ </string>
+ <string name="Body Thickness">
+ Lichaam Dikte
+ </string>
+ <string name="Body Thin">
+ Lichaam Dun
+ </string>
+ <string name="Bow Legged">
+ Boog Benen
+ </string>
+ <string name="Breast Buoyancy">
+ Borst Drijfvermogen
+ </string>
+ <string name="Breast Cleavage">
+ Borst Splijting
+ </string>
+ <string name="Breast Size">
+ Borst Grootte
+ </string>
+ <string name="Bridge Width">
+ Brug Breedte
+ </string>
+ <string name="Broad">
+ Breed
+ </string>
+ <string name="Brow Size">
+ Wenkbrauw Grootte
+ </string>
+ <string name="Bug Eyes">
+ Insect Ogen
+ </string>
+ <string name="Bugged Eyes">
+ Insect Ogen
+ </string>
+ <string name="Bulbous">
+ Bolle
+ </string>
+ <string name="Bulbous Nose">
+ Bolle Neus
+ </string>
+ <string name="Bushy Eyebrows">
+ Borstelige Wenkbrauwen
+ </string>
+ <string name="Bushy Hair">
+ Borstelig Haar
+ </string>
+ <string name="Butt Size">
+ Kont Grootte
+ </string>
+ <string name="bustle skirt">
+ Bustle Skirt
+ </string>
+ <string name="no bustle">
+ No Bustle
+ </string>
+ <string name="more bustle">
+ More Bustle
+ </string>
+ <string name="Chaplin">
+ Smalle Snor
+ </string>
+ <string name="Cheek Bones">
+ Jukbeenderen
+ </string>
+ <string name="Chest Size">
+ Borst Grootte
+ </string>
+ <string name="Chin Angle">
+ Kin Hoek
+ </string>
+ <string name="Chin Cleft">
+ Gespleten Kin
+ </string>
+ <string name="Chin Curtains">
+ Kin Gordijnen
+ </string>
+ <string name="Chin Depth">
+ Kin Diepte
+ </string>
+ <string name="Chin Heavy">
+ Kin Zware
+ </string>
+ <string name="Chin In">
+ Kin In
+ </string>
+ <string name="Chin Out">
+ Kin uit
+ </string>
+ <string name="Chin-Neck">
+ Kin-Nek
+ </string>
+ <string name="Clear">
+ Opschonen
+ </string>
+ <string name="Cleft">
+ Gespleten
+ </string>
+ <string name="Close Set Eyes">
+ Close Set Eyes
+ </string>
+ <string name="Closed">
+ Gesloten
+ </string>
+ <string name="Closed Back">
+ Gesloten Achterkant
+ </string>
+ <string name="Closed Front">
+ Gesloten Voorkant
+ </string>
+ <string name="Closed Left">
+ Gesloten Links
+ </string>
+ <string name="Closed Right">
+ Gesloten Rechts
+ </string>
+ <string name="Coin Purse">
+ Verminder Grootte
+ </string>
+ <string name="Collar Back">
+ Kraag Achterkant
+ </string>
+ <string name="Collar Front">
+ Kraag Voorkant
+ </string>
+ <string name="Corner Down">
+ Hoek Omlaag
+ </string>
+ <string name="Corner Normal">
+ Hoek Normaal
+ </string>
+ <string name="Corner Up">
+ Hoek Omhoog
+ </string>
+ <string name="Creased">
+ Gevouwen
+ </string>
+ <string name="Crooked Nose">
+ Kromte Neus
+ </string>
+ <string name="Cropped Hair">
+ Bijgesneden Haar
+ </string>
+ <string name="Cuff Flare">
+ Cuff Flare
+ </string>
+ <string name="Dark">
+ Donker
+ </string>
+ <string name="Dark Green">
+ Donker Groen
+ </string>
+ <string name="Darker">
+ Donkerder
+ </string>
+ <string name="Deep">
+ Diep
+ </string>
+ <string name="Default Heels">
+ Standaard Hielen
+ </string>
+ <string name="Default Toe">
+ Standaard Teen
+ </string>
+ <string name="Dense">
+ Dicht
+ </string>
+ <string name="Dense hair">
+ Dicht haar
+ </string>
+ <string name="Double Chin">
+ Dubbele Kin
+ </string>
+ <string name="Downturned">
+ Downturned
+ </string>
+ <string name="Duffle Bag">
+ Vergroot Grootte
+ </string>
+ <string name="Ear Angle">
+ Oor Hoek
+ </string>
+ <string name="Ear Size">
+ Oor Grootte
+ </string>
+ <string name="Ear Tips">
+ Oor Punten
+ </string>
+ <string name="Egg Head">
+ Ei Hoofd
+ </string>
+ <string name="Eye Bags">
+ Oog Zakken
+ </string>
+ <string name="Eye Color">
+ Oog Kleur
+ </string>
+ <string name="Eye Depth">
+ Oog Diepte
+ </string>
+ <string name="Eye Lightness">
+ Oog Lichtheid
+ </string>
+ <string name="Eye Opening">
+ Oog Opening
+ </string>
+ <string name="Eye Pop">
+ Asymmetrisch
+ </string>
+ <string name="Eye Size">
+ Oog Grootte
+ </string>
+ <string name="Eye Spacing">
+ Oog Afstand
+ </string>
+ <string name="Eyeball Size">
+ Oogbal Grootte
+ </string>
+ <string name="Eyebrow Arc">
+ Wenkbrauw Boog
+ </string>
+ <string name="Eyebrow Density">
+ Wenkbrauw Dichtheid
+ </string>
+ <string name="Eyebrow Height">
+ Wenkbrauw Hoogte
+ </string>
+ <string name="Eyebrow Points">
+ Wenkbrauw Punten
+ </string>
+ <string name="Eyebrow Size">
+ Eyebrow Grootte
+ </string>
+ <string name="Eyelash Length">
+ Eyelash Lengte
+ </string>
+ <string name="Eyeliner">
+ Eyeliner
+ </string>
+ <string name="Eyeliner Color">
+ Eyeliner Kleur
+ </string>
+ <string name="Eyes Back">
+ Ogen Achteruit
+ </string>
+ <string name="Eyes Bugged">
+ Insect Ogen
+ </string>
+ <string name="Eyes Forward">
+ Ogen Vooruit
+ </string>
+ <string name="Eyes Long Head">
+ Eyes Long Head
+ </string>
+ <string name="Eyes Shear Left Up">
+ Eyes Shear Left Up
+ </string>
+ <string name="Eyes Shear Right Up">
+ Eyes Shear Right Up
+ </string>
+ <string name="Eyes Short Head">
+ Eyes Short Head
+ </string>
+ <string name="Eyes Spread">
+ Eyes Spread
+ </string>
+ <string name="Eyes Sunken">
+ Ingevallen Ogen
+ </string>
+ <string name="Eyes Together">
+ Ogen Bij Elkaar
+ </string>
+ <string name="Face Shear">
+ Gezicht Gelijkheid
+ </string>
+ <string name="Facial Definition">
+ Gezichts Definitie
+ </string>
+ <string name="Far Set Eyes">
+ Ogen Uit Elkaar
+ </string>
+ <string name="Fat">
+ Dik
+ </string>
+ <string name="Fat Head">
+ Dik Hoofd
+ </string>
+ <string name="Fat Lips">
+ Dikke Lippen
+ </string>
+ <string name="Fat Lower">
+ Fat Lower
+ </string>
+ <string name="Fat Lower Lip">
+ Fat Lower Lip
+ </string>
+ <string name="Fat Torso">
+ Fat Torso
+ </string>
+ <string name="Fat Upper">
+ Fat Upper
+ </string>
+ <string name="Fat Upper Lip">
+ Dikke Boven Lip
+ </string>
+ <string name="Female">
+ Vrouw
+ </string>
+ <string name="Fingerless">
+ Vingerloos
+ </string>
+ <string name="Fingers">
+ Vingers
+ </string>
+ <string name="Flared Cuffs">
+ Verbrede Vorm
+ </string>
+ <string name="Flat">
+ Plat
+ </string>
+ <string name="Flat Butt">
+ Platte Kont
+ </string>
+ <string name="Flat Head">
+ Plat Hoofd
+ </string>
+ <string name="Flat Toe">
+ Platte Teen
+ </string>
+ <string name="Foot Size">
+ Voet Grootte
+ </string>
+ <string name="Forehead Angle">
+ Voorhoofd Hoek
+ </string>
+ <string name="Forehead Heavy">
+ Zwaar Voorhoofd
+ </string>
+ <string name="Freckles">
+ Sproeten
+ </string>
+ <string name="Front Bangs Down">
+ Voorkant Pony Omlaag
+ </string>
+ <string name="Front Bangs Up">
+ Voorkant Pony Omhoog
+ </string>
+ <string name="Front Fringe">
+ Voorste Rand
+ </string>
+ <string name="Front Hair">
+ Gezichtshaar
+ </string>
+ <string name="Front Hair Down">
+ Gezichtshaar Omlaag
+ </string>
+ <string name="Front Hair Up">
+ Gezichtshaar Omhoog
+ </string>
+ <string name="Full Back">
+ Volle Achterkant
+ </string>
+ <string name="Full Eyeliner">
+ Volle Eyeliner
+ </string>
+ <string name="Full Front">
+ Volle Voorkant
+ </string>
+ <string name="Full Hair Sides">
+ Full Hair Sides
+ </string>
+ <string name="Full Sides">
+ Volle Zijkanten
+ </string>
+ <string name="Glossy">
+ Glanzend
+ </string>
+ <string name="Glove Fingers">
+ Vinger Handschoenen
+ </string>
+ <string name="Glove Length">
+ Handschoen Lengte
+ </string>
+ <string name="Hair">
+ Haar
+ </string>
+ <string name="Hair Back">
+ Haar: Zwart
+ </string>
+ <string name="Hair Front">
+ Haar: Voorkant
+ </string>
+ <string name="Hair Sides">
+ Haar: Zijkant
+ </string>
+ <string name="Hair Sweep">
+ Hair Sweep
+ </string>
+ <string name="Hair Thickess">
+ Haar Dikheid
+ </string>
+ <string name="Hair Thickness">
+ Hair Dikheid
+ </string>
+ <string name="Hair Tilt">
+ Hair Tilt
+ </string>
+ <string name="Hair Tilted Left">
+ Hair Tilted Left
+ </string>
+ <string name="Hair Tilted Right">
+ Hair Tilted Right
+ </string>
+ <string name="Hair Volume">
+ Haar: Volume
+ </string>
+ <string name="Hand Size">
+ Hand Grootte
+ </string>
+ <string name="Handlebars">
+ Handlebars
+ </string>
+ <string name="Head Length">
+ Hoofd Lengte
+ </string>
+ <string name="Head Shape">
+ Hoofd Vorm
+ </string>
+ <string name="Head Size">
+ Hooft Grootte
+ </string>
+ <string name="Head Stretch">
+ Hoofd Uitrekken
+ </string>
+ <string name="Heel Height">
+ Hiel Hoogte
+ </string>
+ <string name="Heel Shape">
+ Hiel Vorm
+ </string>
+ <string name="Height">
+ Hoogte
+ </string>
+ <string name="High">
Hoog
</string>
-
- <!-- PARCEL_CATEGORY_UI_STRING -->
- <string name="Linden Location">Linden locatie</string>
- <string name="Adult">Adult</string>
- <string name="Arts&amp;Culture">Kunst &amp; Cultuur</string>
- <string name="Business">Zakelijk</string>
- <string name="Educational">Educatief</string>
- <string name="Gaming">Spelen</string>
- <string name="Hangout">Ontmoetingsplaats</string>
- <string name="Newcomer Friendly">Nieuwkomervriendelijk</string>
- <string name="Parks&amp;Nature">Parken &amp; natuur</string>
- <string name="Residential">Woongebied</string>
- <string name="Shopping">Winkelen</string>
- <string name="Other">Anders</string>
-
- <string name="ringing">
- Verbinden met in-wereld voice chat...
+ <string name="High Heels">
+ Hoge Hielen
</string>
- <string name="connected">
- Verbonden
+ <string name="High Jaw">
+ Hoge Kaak
</string>
- <string name="unavailable">
- Voice is niet beschikbaar op uw huidige locatie
+ <string name="High Platforms">
+ High Platforms
</string>
- <string name="hang_up">
- Verbinding met in-wereld voicechat verbroken
+ <string name="High and Tight">
+ Hoog en Strak
+ </string>
+ <string name="Higher">
+ Hoger
+ </string>
+ <string name="Hip Length">
+ Heup Lengte
+ </string>
+ <string name="Hip Width">
+ Heup Breedte
+ </string>
+ <string name="In">
+ Naar Binnen
+ </string>
+ <string name="In Shdw Color">
+ Binnenste Schaduw Kleur
+ </string>
+ <string name="In Shdw Opacity">
+ Binnenste Schaduw Opaciteit
+ </string>
+ <string name="Inner Eye Corner">
+ Binnenste Oog Hoek
+ </string>
+ <string name="Inner Eye Shadow">
+ Binnenste Oog Schaduw
+ </string>
+ <string name="Inner Shadow">
+ Binnenste Schaduw
+ </string>
+ <string name="Jacket Length">
+ Jas Lengte
+ </string>
+ <string name="Jacket Wrinkles">
+ Jas Rimpels
+ </string>
+ <string name="Jaw Angle">
+ Kaak Hoek
+ </string>
+ <string name="Jaw Jut">
+ Jaw Jut
+ </string>
+ <string name="Jaw Shape">
+ Kaak Vorm
+ </string>
+ <string name="Join">
+ Samenvoegen
+ </string>
+ <string name="Jowls">
+ Kaken
+ </string>
+ <string name="Knee Angle">
+ Knie Hoek
+ </string>
+ <string name="Knock Kneed">
+ Knieën Naar binnen
+ </string>
+ <string name="Large">
+ Fors
+ </string>
+ <string name="Large Hands">
+ Grote Handen
+ </string>
+ <string name="Left Part">
+ Linker Deel
+ </string>
+ <string name="Leg Length">
+ Been Lengte
+ </string>
+ <string name="Leg Muscles">
+ Been Spieren
+ </string>
+ <string name="Less">
+ Minder
+ </string>
+ <string name="Less Body Fat">
+ Minder Lichaams Vet
+ </string>
+ <string name="Less Curtains">
+ Less Curtains
+ </string>
+ <string name="Less Freckles">
+ Minder Sproeten
+ </string>
+ <string name="Less Full">
+ Minder Vol
+ </string>
+ <string name="Less Gravity">
+ Minder Zwaartekracht
+ </string>
+ <string name="Less Love">
+ Less Love
+ </string>
+ <string name="Less Muscles">
+ Minder Spieren
+ </string>
+ <string name="Less Muscular">
+ Minder Spieren
+ </string>
+ <string name="Less Rosy">
+ Minder Rooskleurig
+ </string>
+ <string name="Less Round">
+ Minder Rond
+ </string>
+ <string name="Less Saddle">
+ Minder Heupen
+ </string>
+ <string name="Less Square">
+ Minder Vierkant
+ </string>
+ <string name="Less Volume">
+ Minder Volume
+ </string>
+ <string name="Less soul">
+ Minder Ziel
+ </string>
+ <string name="Lighter">
+ Lichter
+ </string>
+ <string name="Lip Cleft">
+ Gespleten Lip
+ </string>
+ <string name="Lip Cleft Depth">
+ Gespleten Lip Diepte
+ </string>
+ <string name="Lip Fullness">
+ Lip Volheid
+ </string>
+ <string name="Lip Pinkness">
+ Rozeheid Lippen
+ </string>
+ <string name="Lip Ratio">
+ Lip Ratio
+ </string>
+ <string name="Lip Thickness">
+ Lip Dikheid
+ </string>
+ <string name="Lip Width">
+ Lip Breedte
+ </string>
+ <string name="Lipgloss">
+ Lipgloss
+ </string>
+ <string name="Lipstick">
+ Lipstick
+ </string>
+ <string name="Lipstick Color">
+ Lipstick Kleur
+ </string>
+ <string name="Long">
+ Lang
+ </string>
+ <string name="Long Head">
+ Lang Hoofd
+ </string>
+ <string name="Long Hips">
+ Lange Heupen
+ </string>
+ <string name="Long Legs">
+ Lange Benen
+ </string>
+ <string name="Long Neck">
+ Lange Nek
+ </string>
+ <string name="Long Pigtails">
+ Long Pigtails
+ </string>
+ <string name="Long Ponytail">
+ Lange Paardenstaart
+ </string>
+ <string name="Long Torso">
+ Lang Torso
+ </string>
+ <string name="Long arms">
+ Lange Armen
+ </string>
+ <string name="Longcuffs">
+ Longcuffs
+ </string>
+ <string name="Loose Pants">
+ Losse Broek
+ </string>
+ <string name="Loose Shirt">
+ Los Shirt
+ </string>
+ <string name="Loose Sleeves">
+ Losse Mouwen
+ </string>
+ <string name="Love Handles">
+ Love Handles
+ </string>
+ <string name="Low">
+ Laag
+ </string>
+ <string name="Low Heels">
+ Lage Hielen
+ </string>
+ <string name="Low Jaw">
+ Lage Kaak
+ </string>
+ <string name="Low Platforms">
+ Lage Platforms
+ </string>
+ <string name="Low and Loose">
+ Laag en Los
+ </string>
+ <string name="Lower">
+ Lager
+ </string>
+ <string name="Lower Bridge">
+ Lagere Brug
+ </string>
+ <string name="Lower Cheeks">
+ Lagere Wangen
+ </string>
+ <string name="Male">
+ Man
+ </string>
+ <string name="Middle Part">
+ Middelste Deel
+ </string>
+ <string name="More">
+ Meer
+ </string>
+ <string name="More Blush">
+ Meer Blozen
+ </string>
+ <string name="More Body Fat">
+ Meer Lichaams Vet
+ </string>
+ <string name="More Curtains">
+ More Curtains
+ </string>
+ <string name="More Eyeshadow">
+ Meer Oogshadow
+ </string>
+ <string name="More Freckles">
+ Meer Sproeten
+ </string>
+ <string name="More Full">
+ Meer Vol
+ </string>
+ <string name="More Gravity">
+ Meer Zwaartekracht
+ </string>
+ <string name="More Lipstick">
+ Meer Lippenstift
+ </string>
+ <string name="More Love">
+ Meer Lovehandels
+ </string>
+ <string name="More Lower Lip">
+ Meer Onder Lip
+ </string>
+ <string name="More Muscles">
+ Meer Spieren
+ </string>
+ <string name="More Muscular">
+ Meer Spieren
+ </string>
+ <string name="More Rosy">
+ More Rosy
+ </string>
+ <string name="More Round">
+ Meer Rond
+ </string>
+ <string name="More Saddle">
+ Meer Heupen
+ </string>
+ <string name="More Sloped">
+ Meer Hellend
+ </string>
+ <string name="More Square">
+ Meer Vierkant
+ </string>
+ <string name="More Upper Lip">
+ Meer Boven Lip
+ </string>
+ <string name="More Vertical">
+ Meer Verticaal
+ </string>
+ <string name="More Volume">
+ Meer Volume
+ </string>
+ <string name="More soul">
+ Meer ziel
+ </string>
+ <string name="Moustache">
+ Snor
+ </string>
+ <string name="Mouth Corner">
+ Mond Hoek
+ </string>
+ <string name="Mouth Position">
+ Mond Positie
+ </string>
+ <string name="Mowhawk">
+ Hanekam
+ </string>
+ <string name="Muscular">
+ Gespiert
+ </string>
+ <string name="Mutton Chops">
+ Mutton Chops
+ </string>
+ <string name="Nail Polish">
+ Nagel Lak
+ </string>
+ <string name="Nail Polish Color">
+ Nagel Lak Kleur
+ </string>
+ <string name="Narrow">
+ Smal
+ </string>
+ <string name="Narrow Back">
+ Smalle Achterkant
+ </string>
+ <string name="Narrow Front">
+ Smalle Voorkant
+ </string>
+ <string name="Narrow Lips">
+ Smalle Lippen
+ </string>
+ <string name="Natural">
+ Natural
+ </string>
+ <string name="Neck Length">
+ Nek Lengte
+ </string>
+ <string name="Neck Thickness">
+ Nek Dikheid
+ </string>
+ <string name="No Blush">
+ Geen Bloos
+ </string>
+ <string name="No Eyeliner">
+ Geen Eyeliner
+ </string>
+ <string name="No Eyeshadow">
+ Geen Oogschaduw
+ </string>
+ <string name="No Heels">
+ Geen Hakken
+ </string>
+ <string name="No Lipgloss">
+ Geen Lipgloss
+ </string>
+ <string name="No Lipstick">
+ Geen Lippenstift
+ </string>
+ <string name="No Part">
+ Geen Deel
+ </string>
+ <string name="No Polish">
+ Geen Glans
+ </string>
+ <string name="No Red">
+ Geen Rood
+ </string>
+ <string name="No Spikes">
+ Geen Stekels
+ </string>
+ <string name="No White">
+ Geen Wit
+ </string>
+ <string name="No Wrinkles">
+ Geen Rimpels
+ </string>
+ <string name="Normal Lower">
+ Normaal Onder
+ </string>
+ <string name="Normal Upper">
+ Normaal Boven
+ </string>
+ <string name="Nose Left">
+ Neus Links
+ </string>
+ <string name="Nose Right">
+ Neus Rechts
+ </string>
+ <string name="Nose Size">
+ Neus Grootte
+ </string>
+ <string name="Nose Thickness">
+ Neus Dickheid
+ </string>
+ <string name="Nose Tip Angle">
+ Neus Top Hoek
+ </string>
+ <string name="Nose Tip Shape">
+ Neus Top Vorm
+ </string>
+ <string name="Nose Width">
+ Neus Breedte
+ </string>
+ <string name="Nostril Division">
+ Nostril Division
+ </string>
+ <string name="Nostril Width">
+ Neusgat Breedte
+ </string>
+ <string name="Old">
+ Oud
+ </string>
+ <string name="Opaque">
+ Ondoorzichtig
+ </string>
+ <string name="Open">
+ Open
+ </string>
+ <string name="Open Back">
+ Open Achterkant
+ </string>
+ <string name="Open Front">
+ Open Voorkant
+ </string>
+ <string name="Open Left">
+ Open Links
+ </string>
+ <string name="Open Right">
+ Open Rechts
+ </string>
+ <string name="Orange">
+ Oranje
+ </string>
+ <string name="Out">
+ Uit
+ </string>
+ <string name="Out Shdw Color">
+ Buitenste Schaduw Kleur
+ </string>
+ <string name="Out Shdw Opacity">
+ Buitenste Schaduw Opaciteit
+ </string>
+ <string name="Outer Eye Corner">
+ Buitenste Oog Hoek
+ </string>
+ <string name="Outer Eye Shadow">
+ Buitenste Oog Schaduw
+ </string>
+ <string name="Outer Shadow">
+ Buitenste Schaduw
+ </string>
+ <string name="Overbite">
+ Overbeet
+ </string>
+ <string name="Package">
+ Genitaliën
+ </string>
+ <string name="Painted Nails">
+ Gelakte Nagels
+ </string>
+ <string name="Pale">
+ Dof
+ </string>
+ <string name="Pants Crotch">
+ Broek Kruis
+ </string>
+ <string name="Pants Fit">
+ Broek Passend
+ </string>
+ <string name="Pants Length">
+ Broek Lengte
+ </string>
+ <string name="Pants Waist">
+ Broek Teille
+ </string>
+ <string name="Pants Wrinkles">
+ Broek Rimpels
+ </string>
+ <string name="Part">
+ Deel
+ </string>
+ <string name="Part Bangs">
+ Part Bangs
+ </string>
+ <string name="Pectorals">
+ Borstspieren
+ </string>
+ <string name="Pigment">
+ Pigment
+ </string>
+ <string name="Pigtails">
+ Pigtails
+ </string>
+ <string name="Pink">
+ Roze
+ </string>
+ <string name="Pinker">
+ Rozer
+ </string>
+ <string name="Platform Height">
+ Platform Hoogte
+ </string>
+ <string name="Platform Width">
+ Platform Breedte
+ </string>
+ <string name="Pointy">
+ Puntig
+ </string>
+ <string name="Pointy Heels">
+ Puntige Hielen
+ </string>
+ <string name="Pointy Toe">
+ Puntige Tenen
+ </string>
+ <string name="Ponytail">
+ Paardenstaard
+ </string>
+ <string name="Poofy Skirt">
+ Poofy Skirt
+ </string>
+ <string name="Pop Left Eye">
+ Asymmetrisch Links
+ </string>
+ <string name="Pop Right Eye">
+ Asymmetrisch Rechts
+ </string>
+ <string name="Puffy">
+ Opgezwollen
+ </string>
+ <string name="Puffy Eyelids">
+ Opgezwollen Oogleden
+ </string>
+ <string name="Rainbow Color">
+ Regenboog Kleur
+ </string>
+ <string name="Red Hair">
+ Rood Haar
+ </string>
+ <string name="Red Skin">
+ Rode Huid
+ </string>
+ <string name="Regular">
+ Normaal
+ </string>
+ <string name="Regular Muscles">
+ Normale Spieren
+ </string>
+ <string name="Right Part">
+ Rechter Deel
+ </string>
+ <string name="Rosy Complexion">
+ Rosy Complexion
+ </string>
+ <string name="Round">
+ Rond
+ </string>
+ <string name="Round Forehead">
+ Rond Voorhoofd
+ </string>
+ <string name="Ruddiness">
+ Rossige kleur
+ </string>
+ <string name="Ruddy">
+ Rossig
+ </string>
+ <string name="Rumpled Hair">
+ Rumpled Hair
+ </string>
+ <string name="Saddle Bags">
+ Saddle Bags
+ </string>
+ <string name="Saddlebags">
+ Saddlebags
+ </string>
+ <string name="Scrawny">
+ Magere
+ </string>
+ <string name="Scrawny Leg">
+ Mager Been
+ </string>
+ <string name="Separate">
+ Scheiden
+ </string>
+ <string name="Shading">
+ Shading
+ </string>
+ <string name="Shadow hair">
+ Schaduw Haar
+ </string>
+ <string name="Shallow">
+ Ondiep
+ </string>
+ <string name="Shear Back">
+ Shear Back
+ </string>
+ <string name="Shear Face">
+ Shear Face
+ </string>
+ <string name="Shear Front">
+ Shear Front
+ </string>
+ <string name="Shear Left">
+ Shear Left
+ </string>
+ <string name="Shear Left Up">
+ Shear Left Up
+ </string>
+ <string name="Shear Right">
+ Shear Right
+ </string>
+ <string name="Shear Right Up">
+ Shear Right Up
+ </string>
+ <string name="Sheared Back">
+ Sheared Back
+ </string>
+ <string name="Sheared Front">
+ Sheared Front
+ </string>
+ <string name="Shift Left">
+ Verplaats Links
+ </string>
+ <string name="Shift Mouth">
+ Verplaats Mond
+ </string>
+ <string name="Shift Right">
+ Verplaats Rechts
+ </string>
+ <string name="Shirt Bottom">
+ Hemd Onderkant
+ </string>
+ <string name="Shirt Fit">
+ Hemd Passend
+ </string>
+ <string name="Shirt Wrinkles">
+ Hemd Rimpels
+ </string>
+ <string name="Shoe Height">
+ Schoen Hoogte
+ </string>
+ <string name="Short">
+ Kort
+ </string>
+ <string name="Short Arms">
+ Korte Armen
+ </string>
+ <string name="Short Legs">
+ Korte Benen
+ </string>
+ <string name="Short Neck">
+ Korte Nek
+ </string>
+ <string name="Short Pigtails">
+ Short Pigtails
+ </string>
+ <string name="Short Ponytail">
+ Korte Paardenstaart
+ </string>
+ <string name="Short Sideburns">
+ Korte Bakkebaarden
+ </string>
+ <string name="Short Torso">
+ Korte Torso
+ </string>
+ <string name="Short hips">
+ Korte Heupen
+ </string>
+ <string name="Shoulders">
+ Shouders
+ </string>
+ <string name="Side Bangs">
+ Side Bangs
+ </string>
+ <string name="Side Bangs Down">
+ Side Bangs Down
+ </string>
+ <string name="Side Bangs Up">
+ Side Bangs Up
+ </string>
+ <string name="Side Fringe">
+ Side Fringe
+ </string>
+ <string name="Sideburns">
+ Bakkebaarden
+ </string>
+ <string name="Sides Hair">
+ Sides Hair
+ </string>
+ <string name="Sides Hair Down">
+ Sides Hair Down
+ </string>
+ <string name="Sides Hair Up">
+ Sides Hair Up
+ </string>
+ <string name="Skinny">
+ Broodmager
+ </string>
+ <string name="Skinny Neck">
+ Smalle Nek
+ </string>
+ <string name="Skirt Fit">
+ Skirt Fit
+ </string>
+ <string name="Skirt Length">
+ Rok Lengte
+ </string>
+ <string name="Slanted Forehead">
+ Schuin voorhoofd
+ </string>
+ <string name="Sleeve Length">
+ Mouw Lengte
+ </string>
+ <string name="Sleeve Looseness">
+ Mouw Losheid
+ </string>
+ <string name="Slit Back">
+ Spleet: Achter
+ </string>
+ <string name="Slit Front">
+ Spleet: Voor
+ </string>
+ <string name="Slit Left">
+ Spleet: Links
+ </string>
+ <string name="Slit Right">
+ Spleet: Rechts
+ </string>
+ <string name="Small">
+ Klein
+ </string>
+ <string name="Small Hands">
+ Kleine Handen
+ </string>
+ <string name="Small Head">
+ Klein Hoofd
+ </string>
+ <string name="Smooth">
+ Glad
+ </string>
+ <string name="Smooth Hair">
+ Glad Haar
+ </string>
+ <string name="Socks Length">
+ Sok Lengte
+ </string>
+ <string name="Some">
+ enkele
+ </string>
+ <string name="Soulpatch">
+ Soulpatch
+ </string>
+ <string name="Sparse">
+ Schaars
+ </string>
+ <string name="Spiked Hair">
+ Puntig Haar
+ </string>
+ <string name="Square">
+ Vierkant
+ </string>
+ <string name="Square Toe">
+ Vierkante Teen
+ </string>
+ <string name="Squash Head">
+ Squash Head
+ </string>
+ <string name="Squash/Stretch Head">
+ Squash/Stretch Head
+ </string>
+ <string name="Stretch Head">
+ Uitgerekt Hoofd
+ </string>
+ <string name="Sunken">
+ Verzonken
+ </string>
+ <string name="Sunken Chest">
+ Verzonken Borstkas
+ </string>
+ <string name="Sunken Eyes">
+ Verzonken Ogen
+ </string>
+ <string name="Sweep Back">
+ Sweep Back
+ </string>
+ <string name="Sweep Forward">
+ Sweep Forward
+ </string>
+ <string name="Swept Back">
+ Swept Back
+ </string>
+ <string name="Swept Back Hair">
+ Swept Back Hair
+ </string>
+ <string name="Swept Forward">
+ Swept Forward
+ </string>
+ <string name="Swept Forward Hair">
+ Swept Forward Hair
+ </string>
+ <string name="Tall">
+ Lang
+ </string>
+ <string name="Taper Back">
+ Spits Achter
+ </string>
+ <string name="Taper Front">
+ Spits Voor
+ </string>
+ <string name="Thick Heels">
+ Dikke Hielen
+ </string>
+ <string name="Thick Neck">
+ Dikke Nek
+ </string>
+ <string name="Thick Toe">
+ Dikke Teen
+ </string>
+ <string name="Thickness">
+ Dikheid
+ </string>
+ <string name="Thin">
+ Dun
+ </string>
+ <string name="Thin Eyebrows">
+ Dunne Wenkbrouwen
+ </string>
+ <string name="Thin Lips">
+ Dunne Lippen
+ </string>
+ <string name="Thin Nose">
+ Dunne Neus
+ </string>
+ <string name="Tight Chin">
+ Strakke Kin
+ </string>
+ <string name="Tight Cuffs">
+ Strakke Manchetten
+ </string>
+ <string name="Tight Pants">
+ Strakke Broek
+ </string>
+ <string name="Tight Shirt">
+ Strak Hemd
+ </string>
+ <string name="Tight Skirt">
+ Strakke Rok
+ </string>
+ <string name="Tight Sleeves">
+ Strakke Mouwen
+ </string>
+ <string name="Tilt Left">
+ Tilt Left
+ </string>
+ <string name="Tilt Right">
+ Tilt Right
+ </string>
+ <string name="Toe Shape">
+ Teen Vorm
+ </string>
+ <string name="Toe Thickness">
+ Teen Dikheid
+ </string>
+ <string name="Torso Length">
+ Borstkas Lengte
+ </string>
+ <string name="Torso Muscles">
+ Borstkas Spieren
+ </string>
+ <string name="Torso Scrawny">
+ Magere Borstkas
+ </string>
+ <string name="Unattached">
+ Niet Verbonden
+ </string>
+ <string name="Uncreased">
+ Uncreased
+ </string>
+ <string name="Underbite">
+ onderbeet
+ </string>
+ <string name="Unnatural">
+ Onnatuurlijk
+ </string>
+ <string name="Upper Bridge">
+ Boven Brug
+ </string>
+ <string name="Upper Cheeks">
+ Bovenste Wangen
+ </string>
+ <string name="Upper Chin Cleft">
+ Bovenste Kin Gespleten
+ </string>
+ <string name="Upper Eyelid Fold">
+ Bovenste Ooglid Gevouwen
+ </string>
+ <string name="Upturned">
+ Omgekeerde
+ </string>
+ <string name="Very Red">
+ Erg Rood
+ </string>
+ <string name="Waist Height">
+ Taille Hoogte
+ </string>
+ <string name="Well-Fed">
+ Goed Gevoed
+ </string>
+ <string name="White Hair">
+ Wit Haar
+ </string>
+ <string name="Wide">
+ Breed
+ </string>
+ <string name="Wide Back">
+ Breede Achterkant
+ </string>
+ <string name="Wide Front">
+ Breed Voorkant
+ </string>
+ <string name="Wide Lips">
+ Breed Lippen
+ </string>
+ <string name="Wild">
+ Wild
+ </string>
+ <string name="Wrinkles">
+ Rimpels
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Add to My Landmarks
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Edit My Landmark
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ See more info about the current location
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ My location history
+ </string>
+ <string name="UpdaterWindowTitle">
+ [APP_NAME] Update
+ </string>
+ <string name="UpdaterNowUpdating">
+ Now updating [APP_NAME]...
+ </string>
+ <string name="UpdaterNowInstalling">
+ Installing [APP_NAME]...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Your [APP_NAME] Viewer is being updated to the latest release. This may take some time, so please be patient.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Downloading update...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Downloading update
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Failed to download update
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ An error occurred while updating [APP_NAME]. Please download the latest version from www.secondlife.com.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Failed to install update
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Failed to start viewer
+ </string>
+ <string name="IM_logging_string">
+ -- Instant message logging enabled --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] is typing...
+ </string>
+ <string name="Unnamed">
+ (Unnamed)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Moderated: Voices off by default)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Text chat is not available for this call.
+ </string>
+ <string name="IM_muted_text_label">
+ Your text chat has been disabled by a Group Moderator.
+ </string>
+ <string name="IM_default_text_label">
+ Click here to instant message.
+ </string>
+ <string name="IM_to_label">
+ To
+ </string>
+ <string name="IM_moderator_label">
+ (Moderator)
</string>
- <string name="ScriptQuestionCautionChatGranted">
- &apos;[OBJECTNAME]&apos;, een object van &apos;[OWNERNAME]&apos;, gevestigd in [REGIONNAME] op [REGIONPOS], is toestemming verleend om te: [PERMISSIONS].
- </string>
- <string name="ScriptQuestionCautionChatDenied">
- &apos;[OBJECTNAME]&apos;, een object van &apos;[OWNERNAME]&apos;, gevestigd in [REGIONNAME] op [REGIONPOS], is toestemming geweigerd om te: [PERMISSIONS].
- </string>
- <string name="ScriptTakeMoney">
- Linden dollars (L$) van u wegnemen
- </string>
- <string name="ActOnControlInputs">
- Acteren op uw bedieningsinvoer
- </string>
- <string name="RemapControlInputs">
- Uw bedieningsinvoer herdefiniëren
- </string>
- <string name="AnimateYourAvatar">
- Animeer uw avatar
- </string>
- <string name="AttachToYourAvatar">
- Bevestig aan uw avatar
- </string>
- <string name="ReleaseOwnership">
- Eigendom vrijgeven en openbaar worden
- </string>
- <string name="LinkAndDelink">
- Koppelen met en ontkoppelen van andere objecten
- </string>
- <string name="AddAndRemoveJoints">
- Toevoegen en verwijderen koppelingen met andere objecten
- </string>
- <string name="ChangePermissions">
- Wijzig zijn permissies
- </string>
- <string name="TrackYourCamera">
- Volg uw camera
- </string>
- <string name="ControlYourCamera">
- Bedien uw camera
- </string>
-
<string name="only_user_message">
U bent de enige gebruiker in deze sessie.
</string>
@@ -626,31 +3246,4 @@
<string name="close_on_no_ability">
U heeft niet langer de mogelijkheid om in deze chatsessie te zijn.
</string>
- <string name="AcctTypeResident">
- Inwoner
- </string>
- <string name="AcctTypeTrial">
- Proef
- </string>
- <string name="AcctTypeCharterMember">
- Charter lid
- </string>
- <string name="AcctTypeEmployee">
- Linden Lab werknemer
- </string>
- <string name="PaymentInfoUsed">
- Betalingsinformatie gebruikt
- </string>
- <string name="PaymentInfoOnFile">
- Betalingsinformatie aanwezig
- </string>
- <string name="NoPaymentInfoOnFile">
- Geen betalingsinfo aanwezig
- </string>
- <string name="AgeVerified">
- Leeftijd geverifieerd
- </string>
- <string name="NotAgeVerified">
- Leeftijd niet geverifieerd
- </string>
</strings>
diff --git a/indra/newview/skins/default/xui/nl/teleport_strings.xml b/indra/newview/skins/default/xui/nl/teleport_strings.xml
index ff43e0f32f..12a81447c0 100644
--- a/indra/newview/skins/default/xui/nl/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/nl/teleport_strings.xml
@@ -2,12 +2,12 @@
<teleport_messages>
<message_set name="errors">
<message name="invalid_tport">
- Er is een probleem opgetreden bij het verwerken van uw verzoek voor een teleport. U dient wellicht opnieuw in te loggen voor uw kunt teleporteren. Wanneer u deze boodschap blijft ontvangen, controleert u dan alstublieft de Tech Support FAQ op:
-www.secondlife.com/support
+ Probleem ondervonden bij het verwerken van uw verzoek voor een teleport. Het kan nodig zijn om opnieuw in te loggen voordat u kunt teleporteren.
+Als u dit bericht blijft krijgen, controleert u dan alstublieft [SUPPORT_SITE].
</message>
<message name="invalid_region_handoff">
- Er is een probleem opgetreden bij het oversteken naar een andere regio. U dient wellicht opnieuw in te loggen voor uw kunt oversteken naar andere regio&apos;s. Wanneer u deze boodschap blijft ontvangen, controleert u dan alstublieft de Tech Support FAQ op:
-www.secondlife.com/support
+ Er is een probleem opgetreden bij het oversteken naar een andere regio. U dient wellicht opnieuw in te loggen voor uw kunt oversteken naar andere regio&apos;s.
+Als u dit bericht blijft krijgen, controleert u dan alstublieft [SUPPORT_SITE].
</message>
<message name="blocked_tport">
Sorry, teleport is momenteel geblokkeerd. Probeer het zo meteen opnieuw. Indien u nog steeds niet kunt teleporteren, log dan alstublieft uit en weer in om het probleem te verhelpen.
diff --git a/indra/newview/skins/default/xui/pl/floater_about.xml b/indra/newview/skins/default/xui/pl/floater_about.xml
index 29a5aca90d..b49247c4bf 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_about.xml
+++ b/indra/newview/skins/default/xui/pl/floater_about.xml
@@ -8,7 +8,7 @@
Buduj z [COMPILER] wersjÄ… [COMPILER_VERSION]
</floater.string>
<floater.string name="AboutPosition">
- Znajdujesz siÄ™ na pozycji [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] w [REGION] zlokalizowanym w [HOSTNAME] ([HOSTIP])
+ Położenie [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] w [REGION] zlokalizowanym w &lt;nolink&gt;[HOSTNAME]&lt;/nolink&gt; ([HOSTIP])
[SERVER_VERSION]
[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
</floater.string>
@@ -16,18 +16,18 @@
Procesor: [CPU]
Pamięć: [MEMORY_MB] MB
Wersja OS: [OS_VERSION]
-Graphics Card Vendor: [GRAPHICS_CARD_VENDOR]
-Karta Graficzna: [GRAPHICS_CARD]
+Sprzedawca karty graficznej: [GRAPHICS_CARD_VENDOR]
+Karta graficzna: [GRAPHICS_CARD]
</floater.string>
<floater.string name="AboutDriver">
- Windows Sterownik Karty Graficznej: [GRAPHICS_DRIVER_VERSION]
+ Windows Sterownik karty graficznej: [GRAPHICS_DRIVER_VERSION]
</floater.string>
<floater.string name="AboutLibs">
Wersja OpenGL: [OPENGL_VERSION]
Wersja libcurl: [LIBCURL_VERSION]
-Wersja Dekodera J2C: [J2C_VERSION]
-Wersja Sterownika Audio: [AUDIO_DRIVER_VERSION]
+Wersja dekodera J2C: [J2C_VERSION]
+Wersja sterownika audio: [AUDIO_DRIVER_VERSION]
Wersja Qt Webkit: [QT_WEBKIT_VERSION]
Wersja Vivox: [VIVOX_VERSION]
</floater.string>
@@ -35,21 +35,19 @@ Wersja Vivox: [VIVOX_VERSION]
(żadne)
</floater.string>
<floater.string name="AboutTraffic">
- Stracone Pakiety: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
+ Stracone pakiety: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
</floater.string>
<tab_container name="about_tab">
<panel label="Info" name="support_panel">
- <button label="Kopiuj do Schowka" name="copy_btn"/>
+ <button label="Kopiuj do schowka" name="copy_btn"/>
</panel>
<panel label="Podziękowania" name="credits_panel">
<text_editor name="credits_editor">
- Second Life zostało stworzone dla Was przez: Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl i wielu innych.
+ Second Life zostało stworzone dla Was przez: Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les and many others.
- Podziękowania dla następujących rezydentów za pomoc w pracy nad obecną wersją Second Life: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
-
-
-
- I get by with a little help from my friends. --Richard Starkey
+Podziękowania dla następujących rezydentów za pomoc w pracy nad obecną wersją Second Life: (in progress)
+It is a rare mind indeed that can render the hitherto non-existent blindingly obvious. The cry &apos;I could have thought of that&apos; is a very popular and misleading one, for the fact is that they didn&apos;t, and a very significant and revealing fact it is too.
+ -- Douglas Adams
</text_editor>
</panel>
<panel label="Licencje" name="licenses_panel">
diff --git a/indra/newview/skins/default/xui/pl/floater_about_land.xml b/indra/newview/skins/default/xui/pl/floater_about_land.xml
index d456ea26b4..163868f200 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/pl/floater_about_land.xml
@@ -1,7 +1,68 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floaterland" title="O POSIADÅOÅšCI">
+ <floater.string name="maturity_icon_general">
+ &quot;Parcel_PG_Dark&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_moderate">
+ &quot;Parcel_M_Dark&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_adult">
+ &quot;Parcel_R_Dark&quot;
+ </floater.string>
+ <floater.string name="Minutes">
+ [MINUTES] minuty
+ </floater.string>
+ <floater.string name="Minute">
+ minuta
+ </floater.string>
+ <floater.string name="Seconds">
+ [SECONDS] sekundy
+ </floater.string>
+ <floater.string name="Remaining">
+ pozostały
+ </floater.string>
<tab_container name="landtab">
- <panel label="Ogólne" name="land_general_panel">
+ <panel label="OGÓLNE" name="land_general_panel">
+ <panel.string name="new users only">
+ Tylko nowi Rezydenci
+ </panel.string>
+ <panel.string name="anyone">
+ Każdy
+ </panel.string>
+ <panel.string name="area_text">
+ Obszar:
+ </panel.string>
+ <panel.string name="area_size_text">
+ [AREA] m²
+ </panel.string>
+ <panel.string name="auction_id_text">
+ Numer aukcji: [ID]
+ </panel.string>
+ <panel.string name="need_tier_to_modify">
+ Musisz zaakceptować zakup by móc modyfikować Posiadłość.
+ </panel.string>
+ <panel.string name="group_owned_text">
+ (Własność Grupy)
+ </panel.string>
+ <panel.string name="profile_text">
+ Profil...
+ </panel.string>
+ <panel.string name="info_text">
+ Info...
+ </panel.string>
+ <panel.string name="public_text">
+ (publiczne)
+ </panel.string>
+ <panel.string name="none_text">
+ (brak)
+ </panel.string>
+ <panel.string name="sale_pending_text">
+ (Sprzedaż w toku realizacji)
+ </panel.string>
+ <panel.string name="no_selection_text">
+ Posiadłość nie wybrana.
+Idź do Świat &gt; O Posiadłości albo wybierz inną posiadłość żeby pokazać jej dane.
+ </panel.string>
<text name="Name:">
Nazwa:
</text>
@@ -26,14 +87,16 @@
<text name="OwnerText">
Leyla Linden
</text>
- <button label="Profile..." label_selected="Profile..." name="Profile..."/>
<text name="Group:">
Grupa:
</text>
- <button label="Ustaw..." label_selected="Ustaw..." name="Set..."/>
- <check_box label="Udostępnij przypisywanie na grupę" name="check deed" tool_tip="Oficer grupy ma prawo przepisać prawo własności posiadłości na grupę. Posiadłość wspierana jest przez przydziały pochodzące od członków grupy."/>
- <button label="Przypisz..." label_selected="Przypisz..." name="Deed..." tool_tip="Prawo przypisania posiadłości na grupę może dokonać jedynie oficer grupy."/>
- <check_box label="Właścicel dokonuje wpłat związanych z posiadłością" name="check contrib" tool_tip="Kiedy posiadłość zostaje przypisana na grupę, poprzedni właściciel realizuje wpłaty z nią związane w celu jej utrzymania."/>
+ <text name="GroupText">
+ Leyla Linden
+ </text>
+ <button label="Ustaw" name="Set..."/>
+ <check_box label="Udostępnij przypisywanie na Grupę" name="check deed" tool_tip="Oficer Grupy ma prawo przepisać prawo własności Posiadłości na Grupę. Posiadłość wspierana jest przez przydziały pochodzące od członków Grupy."/>
+ <button label="Przypisz" name="Deed..." tool_tip="Prawo przypisania Posiadłości na Grupę może dokonać jedynie oficer Grupy."/>
+ <check_box label="Właścicel dokonuje wpłat związanych z Posiadłością" name="check contrib" tool_tip="Kiedy Posiadłość zostaje przypisana na Grupę, poprzedni Właściciel realizuje wpłaty z nią związane w celu jej utrzymania."/>
<text name="For Sale:">
Na Sprzedaż:
</text>
@@ -41,9 +104,9 @@
Nie
</text>
<text name="For Sale: Price L$[PRICE].">
- Cena: L$[PRICE] (L$[PRICE_PER_SQM]/m²).
+ Cena: [PRICE]L$ ([PRICE_PER_SQM]L$/m²).
</text>
- <button label="Sprzedaj Posiadłość..." label_selected="Sprzedaj Posiadłość..." name="Sell Land..."/>
+ <button label="Sprzedaj posiadłość" name="Sell Land..."/>
<text name="For sale to">
Na sprzedaż dla: [BUYER]
</text>
@@ -53,7 +116,7 @@
<text name="Selling with no objects in parcel.">
Obiekty nie są zawarte w sprzedaży.
</text>
- <button label="Anuluj Sprzedaż" label_selected="Anuluj Sprzedaż" name="Cancel Land Sale"/>
+ <button label="Anuluj sprzedaż" label_selected="Anuluj sprzedaż" name="Cancel Land Sale"/>
<text name="Claimed:">
Data:
</text>
@@ -73,138 +136,93 @@
0
</text>
<button label="Kup Posiadłość..." label_selected="Kup Posiadłość..." left="130" name="Buy Land..." width="125"/>
- <button label="Kup dla Grupy..." label_selected="Kup dla Grupy..." name="Buy For Group..."/>
+ <button label="Skrypt" name="Scripts..."/>
+ <button label="Kup dla Grupy" name="Buy For Group..."/>
<button label="Kup Przepustkę..." label_selected="Kup Przeputkę..." left="130" name="Buy Pass..." tool_tip="Przepustka udostępnia tymczasowy wstęp na posiadłość." width="125"/>
- <button label="Porzuć z Posiadłości..." label_selected="Porzuć z Posiadłości..." name="Abandon Land..."/>
- <button label="Odzyskaj Posiadłość..." label_selected="Odzyskaj Posiadłość..." name="Reclaim Land..."/>
- <button label="Sprzedaż przez Lindenów..." label_selected="Sprzedaż przez Lindenów..." name="Linden Sale..." tool_tip="Posiadłość musi mieć właściciela, zawartość oraz nie może być wystawiona na aukcę."/>
- <panel.string name="new users only">
- Tylko nowi użytkownicy
- </panel.string>
- <panel.string name="anyone">
- Każdy
- </panel.string>
- <panel.string name="area_text">
- Obszar:
- </panel.string>
- <panel.string name="area_size_text">
- [AREA] m²
- </panel.string>
- <panel.string name="auction_id_text">
- Numer aukcji: [ID]
- </panel.string>
- <panel.string name="need_tier_to_modify">
- Musisz zaakceptować zakup by móc modyfikować posiadłość.
- </panel.string>
- <panel.string name="group_owned_text">
- (Własność Grupy)
- </panel.string>
- <panel.string name="profile_text">
- Profil...
- </panel.string>
- <panel.string name="info_text">
- Info...
- </panel.string>
- <panel.string name="public_text">
- (publiczne)
+ <button label="Porzuć Posiadłość" name="Abandon Land..."/>
+ <button label="Odzyskaj Posiadłość" name="Reclaim Land..."/>
+ <button label="Sprzedaż przez Lindenów" name="Linden Sale..." tool_tip="Posiadłość musi mieć Właściciela, zawartość oraz nie może być wystawiona na Aukcję."/>
+ </panel>
+ <panel label="UMOWA" name="land_covenant_panel">
+ <panel.string name="can_resell">
+ Posiadłość zakupiona w tym Regionie może być odsprzedana.
</panel.string>
- <panel.string name="none_text">
- (brak)
+ <panel.string name="can_not_resell">
+ Posiadłość zakupiona w tym Regionie nie może być odsprzedana.
</panel.string>
- <panel.string name="sale_pending_text">
- (Sprzedaż w Toku Realizacji)
+ <panel.string name="can_change">
+ Posiadłość zakupiona w tym Regionie może być łączona/dzielona.
</panel.string>
- <panel.string name="no_selection_text">
- Posiadłość nie wybrana.
-Idź do Świat &gt; O Posiadłości albo wybierz inną posiadłość żeby pokazać jej dane.
+ <panel.string name="can_not_change">
+ Posiadłość zakupiona w tym Regionie nie może być
+łączona/dzielona.
</panel.string>
- </panel>
- <panel label="Umowa" name="land_covenant_panel">
<text name="estate_section_lbl">
MajÄ…tek:
</text>
- <text name="estate_name_lbl">
- Nazwa:
- </text>
- <text name="estate_name_text" left="115">
+ <text left="115" name="estate_name_text">
Główne
</text>
<text name="estate_owner_lbl">
Właściciel:
</text>
- <text name="estate_owner_text" left="115">
+ <text left="115" name="estate_owner_text">
(brak)
</text>
- <text_editor name="covenant_editor" left="115">
+ <text_editor left="115" name="covenant_editor">
Ta posiadłość nie wymaga żadej umowy.
</text_editor>
- <text name="covenant_timestamp_text" left="115">
+ <text left="115" name="covenant_timestamp_text">
Ostatnia Modyfikacja Wed Dec 31 16:00:00 1969
</text>
<text name="region_section_lbl">
Region:
</text>
- <text name="region_name_lbl">
- Nazwa:
- </text>
- <text name="region_name_text" left="115">
+ <text left="115" name="region_name_text">
leyla
</text>
<text name="region_landtype_lbl">
Typ:
</text>
- <text name="region_landtype_text" left="115">
+ <text left="115" name="region_landtype_text">
Region Główny / Ziemia
</text>
<text name="region_maturity_lbl">
Rodzaj:
</text>
- <text name="region_maturity_text" left="115">
+ <text left="115" name="region_maturity_text">
&apos;Adult&apos;
</text>
<text name="resellable_lbl">
Odsprzedaj:
</text>
- <text name="resellable_clause" width="338" left="115">
- Posiadłość zakupiona w tym regionie nie może być odsprzedana.
+ <text left="115" name="resellable_clause">
+ Posiadłość zakupiona w tym Regionie nie może być odsprzedana.
</text>
<text name="changeable_lbl">
Podziel:
</text>
- <text name="changeable_clause" width="338" left="115">
- Posiadłość zakupiona w tym regionie nie może być
+ <text left="115" name="changeable_clause">
+ Posiadłość zakupiona w tym Regionie nie może być
łączona/dzielona.
</text>
- <panel.string name="can_resell">
- Posiadłość zakupiona w tym regionie może być odsprzedana.
- </panel.string>
- <panel.string name="can_not_resell">
- Posiadłość zakupiona w tym regionie nie może być odsprzedana.
- </panel.string>
- <panel.string name="can_change">
- Posiadłość zakupiona w tym regionie może być łączona/dzielona.
+ </panel>
+ <panel label="OBIEKTY" name="land_objects_panel">
+ <panel.string name="objects_available_text">
+ [COUNT] z [MAX] ([AVAILABLE] jest dostępne)
</panel.string>
- <panel.string name="can_not_change">
- Posiadłość zakupiona w tym regionie nie może być
-łączona/dzielona.
+ <panel.string name="objects_deleted_text">
+ [COUNT] z [MAX] ([DELETED] zostanie usunięte)
</panel.string>
- </panel>
- <panel label="Obiekty" name="land_objects_panel">
<text name="parcel_object_bonus">
- Ilość Ekstra Obiektów: [BONUS]
+ Ilość ekstra obiektów: [BONUS]
</text>
<text name="Simulator primitive usage:">
- Ilość używanych primóww:
+ Ilość używanych primów:
</text>
<text name="objects_available" width="230">
[COUNT] z [MAX] ([AVAILABLE] jest dostępne)
</text>
- <panel.string name="objects_available_text">
- [COUNT] z [MAX] ([AVAILABLE] jest dostępne)
- </panel.string>
- <panel.string name="objects_deleted_text">
- [COUNT] z [MAX] ([DELETED] zostanie usunięte)
- </panel.string>
<text name="Primitives parcel supports:">
Maksymalna ilość primów:
</text>
@@ -212,19 +230,19 @@ Idź do Świat &gt; O Posiadłości albo wybierz inną posiadłość żeby pokaz
[COUNT]
</text>
<text name="Primitives on parcel:">
- Primy na posiadłości:
+ Primy na Posiadłości:
</text>
<text name="total_objects_text">
[COUNT]
</text>
<text name="Owned by parcel owner:">
- Właściciela posiadłości:
+ Właściciela Posiadłości:
</text>
<text name="owner_objects_text">
[COUNT]
</text>
<button label="Pokaż" label_selected="Pokaż" name="ShowOwner"/>
- <button label="Zwróć..." label_selected="Zwróć..." name="ReturnOwner..." tool_tip="Zwróć obiekty do ich właścicieli."/>
+ <button label="Zwróć" name="ReturnOwner..." tool_tip="Zwróć obiekty do ich Właścicieli."/>
<text name="Set to group:">
Grupy:
</text>
@@ -232,7 +250,7 @@ Idź do Świat &gt; O Posiadłości albo wybierz inną posiadłość żeby pokaz
[COUNT]
</text>
<button label="Pokaż" label_selected="Pokaż" name="ShowGroup"/>
- <button label="Zwróć..." label_selected="Zwróć..." name="ReturnGroup..." tool_tip="Zwróć obiekty do ich właścicieli.."/>
+ <button label="Zwróć" name="ReturnGroup..." tool_tip="Zwróć obiekty do ich Właścicieli.."/>
<text name="Owned by others:">
Innych Rezydentów:
</text>
@@ -240,7 +258,7 @@ Idź do Świat &gt; O Posiadłości albo wybierz inną posiadłość żeby pokaz
[COUNT]
</text>
<button label="Pokaż" label_selected="Pokaż" name="ShowOther"/>
- <button label="Zwróć..." label_selected="Zwróć..." name="ReturnOther..." tool_tip="Zwróć obiekty do ich właścicieli."/>
+ <button label="Zwróć" name="ReturnOther..." tool_tip="Zwróć obiekty do ich Właścicieli."/>
<text name="Selected / sat upon:">
Wybranych:
</text>
@@ -251,25 +269,55 @@ Idź do Świat &gt; O Posiadłości albo wybierz inną posiadłość żeby pokaz
Zwracaj obiekty innych Rezydentów (minut, 0 = wyłącz):
</text>
<text name="Object Owners:" width="108">
- Właściciel Obiektów:
+ Właściciel obiektów:
</text>
- <button label="Odśwież Listę" label_selected="Odśwież Listę" left="112" name="Refresh List"/>
+ <button label="Odśwież listę" label_selected="Odśwież listę" left="112" name="Refresh List" tool_tip="Refresh Object List"/>
<button label="Zwróć obiekty..." label_selected="Zwróć obiekty..." left="224" name="Return objects..."/>
<name_list name="owner list">
- <column label="Typ" name="type"/>
- <column name="online_status"/>
- <column label="Nazwa" name="name"/>
- <column label="Liczba" name="count"/>
- <column label="Najbardziej aktualne" name="mostrecent"/>
+ <name_list.columns label="Typ" name="type"/>
+ <name_list.columns name="online_status"/>
+ <name_list.columns label="Nazwa" name="name"/>
+ <name_list.columns label="Liczba" name="count"/>
+ <name_list.columns label="Najbardziej aktualne" name="mostrecent"/>
</name_list>
</panel>
- <panel label="Opcje" name="land_options_panel">
+ <panel label="OPCJE" name="land_options_panel">
+ <panel.string name="search_enabled_tooltip">
+ Udostępnij wyświetlanie tej Posiadłości w wyszukiwarce
+ </panel.string>
+ <panel.string name="search_disabled_small_tooltip">
+ Wybrana opcja jest wyłączona, ponieważ wielkość Posiadłości wynosi 128 m² bądź mniej.
+Jedynie większe posiadłości mogą być umieszczone w bazie wyszukiwarki.
+ </panel.string>
+ <panel.string name="search_disabled_permissions_tooltip">
+ Wybrana opcja jest wyłączona ponieważ nie posiadasz prawa do modyfikacji Posiadłości.
+ </panel.string>
+ <panel.string name="mature_check_mature">
+ Treść &apos;Mature&apos;
+ </panel.string>
+ <panel.string name="mature_check_adult">
+ Treść &apos;Adult&apos;
+ </panel.string>
+ <panel.string name="mature_check_mature_tooltip">
+ Twoja Posiadłość bądź treść jaką zawiera klasyfikowana jest jako &apos;Mature&apos;.
+ </panel.string>
+ <panel.string name="mature_check_adult_tooltip">
+ Informacje o Twojej Posiadłości i treści jaką zawiera klasyfikowane są jako &apos;Adult&apos;.
+ </panel.string>
+ <panel.string name="landing_point_none">
+ (brak)
+ </panel.string>
+ <panel.string name="push_restrict_text">
+ Popychanie niedozwolone
+ </panel.string>
+ <panel.string name="push_restrict_region_text">
+ Popychanie niedozwolone (Ustawienie Regionu)
+ </panel.string>
<text name="allow_label">
Udostępnij innym Rezydentom:
</text>
- <check_box label="Edytowanie Terenu" name="edit land check" tool_tip="Wybrana - każdy może kształtować Twój teren. Najlepiej jest zostawić tą opcję nie wybraną, Ty zawsze możesz kształtowć Twój teren."/>
- <check_box label="Zapisywania Miejsca" name="check landmark"/>
- <check_box label="Latanie" name="check fly" tool_tip="Wybrana - Rezydenci mogą latać na Twojej posiadłości. Nie wybrana - mogą tylko wlatywać do lub latać ponad Twoją posiadłością."/>
+ <check_box label="Edytowanie Terenu" name="edit land check" tool_tip="Wybrana - każdy może kształtować Twój teren. Najlepiej jest zostawić tą opcję nie wybraną, Ty zawsze możesz kształtować Twój teren."/>
+ <check_box label="Latanie" name="check fly" tool_tip="Wybrana - Rezydenci mogą latać na Twojej Posiadłości. Nie jest wybrana - mogą tylko wlatywać do lub latać ponad Twoją Posiadłością."/>
<text name="allow_label2">
Budowanie:
</text>
@@ -288,87 +336,39 @@ Idź do Świat &gt; O Posiadłości albo wybierz inną posiadłość żeby pokaz
<text name="land_options_label">
Opcje Posiadłości:
</text>
- <check_box label="Bezpieczna (brak zniszczeń)" name="check safe" tool_tip="Wybrana - posiadłość jest bezpieczna - zniszczenia w walce są zablokowane. Nie wybrana - zniszczenia w walce są włączone."/>
- <check_box label="Popychanie niedozwolone" name="PushRestrictCheck" tool_tip="Nie pozwalaj skryptom na popychanie. Wybranie tej opcji może być przydatne do ograniczenia zakłóceń spokoju w Twojej posiadłości."/>
- <check_box label="Wyświetlaj w wyszukiwarce (30L$/tyg.)" name="ShowDirectoryCheck" tool_tip="Udostępnij ukazywanie się nazwy posiadłości w wyszukiwarce"/>
- <panel.string name="search_enabled_tooltip">
- Udostępnij wyświetlanie tej posiadłości w wyszukiwarce
- </panel.string>
- <panel.string name="search_disabled_small_tooltip">
- Wybrana opcja jest wyłączona ze względu iż wielkość posiadłości wynosi 128 m² bądź mniej.
-Jedynie większe posiadłości mogą być umieszczone w bazie wyszukiwarki.
- </panel.string>
- <panel.string name="search_disabled_permissions_tooltip">
- Wybrana opcja jest wyłączona ponieważ nie posiadasz prawa do modyfikacji posiadłości.
- </panel.string>
+ <check_box label="Bezpieczna (brak zniszczeń)" name="check safe" tool_tip="Wybrana - Posiadłość jest bezpieczna - zniszczenia w walce są zablokowane. Nie jest wybrana - zniszczenia w walce są włączone."/>
+ <check_box label="Popychanie niedozwolone" name="PushRestrictCheck" tool_tip="Nie pozwalaj skryptom na popychanie. Wybranie tej opcji może być przydatne do ograniczenia zakłóceń spokoju w Twojej Posiadłości."/>
+ <check_box label="Wyświetlaj w wyszukiwarce (30L$/tyg.)" name="ShowDirectoryCheck" tool_tip="Udostępnij ukazywanie się nazwy Posiadłości w wyszukiwarce"/>
<combo_box name="land category with adult">
- <combo_box.item name="item0" label="Każda Kategoria"
- />
- <combo_box.item name="item1" label="Linden Lokacja"
- />
- <combo_box.item name="item2" label="&apos;Adult&apos;"
- />
- <combo_box.item name="item3" label="Sztuka i Kultura"
- />
- <combo_box.item name="item4" label="Biznes"
- />
- <combo_box.item name="item5" label="Edukacyjna"
- />
- <combo_box.item name="item6" label="Gra"
- />
- <combo_box.item name="item7" label="Poznawanie ludzi"
- />
- <combo_box.item name="item8" label="Przyjazne dla nowych"
- />
- <combo_box.item name="item9" label="Park i Natura"
- />
- <combo_box.item name="item10" label="Mieszkalna"
- />
- <combo_box.item name="item11" label="Zakupy"
- />
- <combo_box.item name="item12" label="Inna"
- />
+ <combo_box.item label="Każda kategoria" name="item0"/>
+ <combo_box.item label="Linden Lokalizacja" name="item1"/>
+ <combo_box.item label="&apos;Adult&apos;" name="item2"/>
+ <combo_box.item label="Sztuka i kultura" name="item3"/>
+ <combo_box.item label="Biznes" name="item4"/>
+ <combo_box.item label="Edukacyjna" name="item5"/>
+ <combo_box.item label="Gra" name="item6"/>
+ <combo_box.item label="Poznawanie ludzi" name="item7"/>
+ <combo_box.item label="Przyjazne dla nowych" name="item8"/>
+ <combo_box.item label="Park i natura" name="item9"/>
+ <combo_box.item label="Mieszkalna" name="item10"/>
+ <combo_box.item label="Zakupy" name="item11"/>
+ <combo_box.item label="Inna" name="item12"/>
</combo_box>
<combo_box name="land category">
- <combo_box.item name="item0" label="Każda Kategoria"
- />
- <combo_box.item name="item1" label="Linden Lokacja"
- />
- <combo_box.item name="item3" label="Sztuka i Kultura"
- />
- <combo_box.item name="item4" label="Biznes"
- />
- <combo_box.item name="item5" label="Edukacyjna"
- />
- <combo_box.item name="item6" label="Gra"
- />
- <combo_box.item name="item7" label="Poznawanie ludzi"
- />
- <combo_box.item name="item8" label="Przyjazna dla nowych"
- />
- <combo_box.item name="item9" label="Parki i Natura"
- />
- <combo_box.item name="item10" label="Mieszkalna"
- />
- <combo_box.item name="item11" label="Zakupy"
- />
- <combo_box.item name="item12" label="Inna"
- />
+ <combo_box.item label="Każda kategoria" name="item0"/>
+ <combo_box.item label="Linden Lokalizacja" name="item1"/>
+ <combo_box.item label="Sztuka i kultura" name="item3"/>
+ <combo_box.item label="Biznes" name="item4"/>
+ <combo_box.item label="Edukacyjna" name="item5"/>
+ <combo_box.item label="Gra" name="item6"/>
+ <combo_box.item label="Poznawanie ludzi" name="item7"/>
+ <combo_box.item label="Przyjazna dla nowych" name="item8"/>
+ <combo_box.item label="Parki i natura" name="item9"/>
+ <combo_box.item label="Mieszkalna" name="item10"/>
+ <combo_box.item label="Zakupy" name="item11"/>
+ <combo_box.item label="Inna" name="item12"/>
</combo_box>
- <button label="?" label_selected="?" name="?"/>
<check_box label="Treść &apos;Mature&apos;" name="MatureCheck" tool_tip=""/>
- <panel.string name="mature_check_mature">
- Treść &apos;Mature&apos;
- </panel.string>
- <panel.string name="mature_check_adult">
- Treść &apos;Adult&apos;
- </panel.string>
- <panel.string name="mature_check_mature_tooltip">
- Twoja posiadłość bądź treść jaką zawiera klasyfikowana jest jako &apos;Mature&apos;.
- </panel.string>
- <panel.string name="mature_check_adult_tooltip">
- Informacje o Twojej posiadłości i treści jaką zawiera klasyfikowane są jako &apos;Adult&apos;.
- </panel.string>
<text name="Snapshot:">
Zdjęcie:
</text>
@@ -376,38 +376,27 @@ Jedynie większe posiadłości mogą być umieszczone w bazie wyszukiwarki.
<text name="landing_point">
Punkt LÄ…dowania: [LANDING]
</text>
- <panel.string name="landing_point_none">
- (brak)
- </panel.string>
<button label="Ustaw" label_selected="Ustaw" name="Set" tool_tip="Ustal miejsce lądowania dla przybywających gości. Używa położenia Twojego awatara na tej posiadłości."/>
<button label="Nowy" label_selected="Nowy" name="Clear" tool_tip="Clear the landing point."/>
<text name="Teleport Routing: ">
- Trasa Teleportacji:
- </text>
- <combo_box name="landing type" tool_tip="Trasa Teleportacj-ustaw w jaki sposób będzie sę odbywać proces telportacji w posiadłości.">
- <combo_box.item name="Blocked" label="Zablokowana"
- />
- <combo_box.item name="LandingPoint" label="Punkt LÄ…dowania"
- />
- <combo_box.item name="Anywhere" label="Gdziekolwiek"
- />
+ Trasa teleportacji:
+ </text>
+ <combo_box name="landing type" tool_tip="Trasa teleportacj-ustaw w jaki sposób będzie sę odbywać proces telportacji w Posiadłości.">
+ <combo_box.item label="Zablokowana" name="Blocked"/>
+ <combo_box.item label="Punkt LÄ…dowania" name="LandingPoint"/>
+ <combo_box.item label="Gdziekolwiek" name="Anywhere"/>
</combo_box>
- <panel.string name="push_restrict_text">
- Popychanie niedozwolone
- </panel.string>
- <panel.string name="push_restrict_region_text">
- Popychanie niedozwolone (Ustawienie Regionu)
- </panel.string>
</panel>
- <panel label="Media" name="land_media_panel">
+ <panel label="MEDIA" name="land_media_panel">
<text name="with media:">
- Typ Mediów:
+ Typ mediów:
</text>
<combo_box name="media type" tool_tip=""/>
<text name="at URL:">
- URL Mediów:
+ URL mediów:
</text>
- <button label="Ustaw..." label_selected="Ustaw..." name="set_media_url"/>
+ <button label="Ustaw" name="set_media_url"/>
+ <check_box label="Ukryj URL mediów" name="hide_media_url" tool_tip="Wybranie tej opcji, zablokuje widok adresu do medów wszystkim nieautoryzowanym Użytkownikom. Nie dotyczy to jednak typów HTML."/>
<text name="Description:">
Opis:
</text>
@@ -418,18 +407,9 @@ TeksturÄ™:
</text>
<texture_picker label="" name="media texture" tool_tip="Kliknij by wybrać zdjęcie"/>
<text name="replace_texture_help">
- (Obiekty używające tej tekstury będą wyświetlały
-film lub stronę internetową po naciśnięciu
-przycisku odtwarzania.)
- </text>
- <text name="Options:">
- Opcje
-Mediów:
+ Obiekty używające tej tekstury będą wyświetlały film lub stronę internetową po naciśnięciu przycisku odtwarzania. Wybierz miniaturę, jeśli chcesz zmienić teksturę.
</text>
<check_box label="Automatyczna Skala" name="media_auto_scale" tool_tip="Wybranie tej opcji dobierze odpowiedni rozmiar zawartości mediów dla tej posiadłości automatycznie. Może to mieć znaczący wpływ na jakość odtwarzanego materialu - może zwolnić i zmniejszyć jakość materiału."/>
- <check_box label="Powtórka Odtwarzania" name="media_loop" tool_tip="Odtwarzaj media z powtórką. Po wyświetleniu materialu, rozpocznie się odtwarzanie od początku."/>
- <check_box label="Ukryj URL Mediów" name="hide_media_url" tool_tip="Wybranie tej opcji, zablokuje widok adresu do medów wszystkim nieautoryzowanym użytkownikom. Nie dotyczy to jednak typów HTML."/>
- <check_box label="Ukryj URL Muzyki" name="hide_music_url" tool_tip="Wybranie tej opcji, zablokuje widok adresu do medów muzycznych w posiadłości wszystkim nieautoryzowanym użytkownikom"/>
<text name="media_size" tool_tip="Rozmiar dla ładowania mediów internetowych. Zostaw 0 dla ustawień domyślnych.">
Rozmiar:
</text>
@@ -438,56 +418,48 @@ Mediów:
<text name="pixels">
pixeli
</text>
- <text name="MusicURL:">
- URL Muzyki:
- </text>
- <text name="Sound:">
- Dźwięk:
- </text>
- <check_box label="Restrykcja obiektów oraz gestur dozwolonych w tej posiadłości" name="check sound local"/>
- <button label="?" label_selected="?" name="?" left="432"/>
- <text name="Voice settings:">
- Głos:
+ <text name="Options:">
+ Opcje
+Mediów:
</text>
- <check_box label="Rozmowy Dozwolone" name="parcel_enable_voice_channel"/>
- <check_box label="Rozmowy Dozwolone (ustawione przez majÄ…tek)" name="parcel_enable_voice_channel_is_estate_disabled"/>
- <check_box label="Ogranicz komunikację głosową w tej posiadłości." name="parcel_enable_voice_channel_parcel"/>
+ <check_box label="Powtórka Odtwarzania" name="media_loop" tool_tip="Odtwarzaj media z powtórką. Po wyświetleniu materialu, rozpocznie się odtwarzanie od początku."/>
</panel>
- <panel label="Dostęp" name="land_access_panel">
+ <panel label="DŹWIĘK" name="land_audio_panel">
+ <check_box label="Ukryj URL muzyki" name="hide_music_url" tool_tip="Wybranie tej opcji, zablokuje widok adresu do medów muzycznych w posiadłości wszystkim nieautoryzowanym Użytkownikom"/>
+ <check_box label="Rozmowy dozwolone" name="parcel_enable_voice_channel"/>
+ <check_box label="Rozmowy dozwolone (ustawione przez MajÄ…tek)" name="parcel_enable_voice_channel_is_estate_disabled"/>
+ <check_box label="Ogranicz komunikację głosową w tej posiadłości." name="parcel_enable_voice_channel_local"/>
+ </panel>
+ <panel label="DOSTĘP" name="land_access_panel">
+ <panel.string name="access_estate_defined">
+ (Zdefiniowane przez MajÄ…tek)
+ </panel.string>
+ <panel.string name="allow_public_access">
+ Udostępnij dostęp publiczny ([MATURITY])
+ </panel.string>
+ <panel.string name="estate_override">
+ Jedna lub więcej z tych opcji ustawiona jest z poziomu Posiadłości
+ </panel.string>
<text name="Limit access to this parcel to:">
- Dostęp do tej posiadłości:
+ Dostęp do tej Posiadłości:
</text>
- <check_box label="Publiczny" name="public_access"/>
+ <check_box label="Publiczny [MATURITY]" name="public_access"/>
<text name="Only Allow">
Zablokuj dostęp dla:
</text>
- <check_box label="Rezydentów niezarejestrowanych w systemie płatniczym z Linden Lab" name="limit_payment" tool_tip="Ban unidentified residents."/>
- <check_box label="Rezydentów z brakiem weryfikacji wieku " name="limit_age_verified" tool_tip="Zbanuj Rezydetów bez weryfikacji wieku. Odwiedź support.secondlife.com po więcej informacji."/>
- <panel.string name="estate_override">
- Jedna lub więcej z tych opcji ustawiona jest z poziomu posiadłości
- </panel.string>
- <check_box label="Udostępnij wejście grupie: [GROUP]" name="GroupCheck" tool_tip="Ustaw grupę w głównej zakładce"/>
- <check_box label="Sprzedaj wejściówki:" name="PassCheck" tool_tip="Otwórz tymczasowy dostęp do tej posiadłości"/>
+ <check_box label="Rezydentów zarejestrowanych w systemie płatniczym Linden Lab [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Zbanuj Rezydentów niezarejestrowanych w systemie płatniczym z Linden Lab."/>
+ <check_box label="Weryfikacja Wieku: [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Zbanuj Rezydetów bez Weryfikacji Wieku. Odwiedź support.secondlife.com po więcej informacji."/>
+ <check_box label="Udostępnij wejście Grupie: [GROUP]" name="GroupCheck" tool_tip="Ustaw Grupę w głównej zakładce"/>
+ <check_box label="Sprzedaj przepustki:" name="PassCheck" tool_tip="Otwórz tymczasowy dostęp do tej Posiadłości"/>
<combo_box name="pass_combo">
- <combo_box.item name="Anyone" label="Każdemu"
- />
- <combo_box.item name="Group" label="Grupie"
- />
+ <combo_box.item label="Każdemu" name="Anyone"/>
+ <combo_box.item label="Grupie" name="Group"/>
</combo_box>
<spinner label="Cena w L$:" name="PriceSpin"/>
<spinner label="Ilość godzin dostępu:" name="HoursSpin"/>
- <text label="Zawsze udostępniaj" name="AllowedText">
- Dozwoleni Rezydenci
- </text>
- <name_list name="AccessList" tool_tip="([LISTED] na liście, [MAX] max)"/>
- <button label="Dodaj..." label_selected="Dodaj..." name="add_allowed"/>
- <button label="Usuń" label_selected="Usuń" name="remove_allowed"/>
- <text label="Ban" name="BanCheck">
- NieporzÄ…dani Rezydenci (bany)
- </text>
- <name_list name="BannedList" tool_tip="([LISTED] na liście, [MAX] max)"/>
- <button label="Dodaj..." label_selected="Dodaj..." name="add_banned"/>
- <button label="Usuń" label_selected="Usuń" name="remove_banned"/>
+ <panel name="Allowed_layout_panel">
+ <name_list name="AccessList" tool_tip="([LISTED] na liście, [MAX] maksimum)"/>
+ </panel>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_activeim.xml b/indra/newview/skins/default/xui/pl/floater_activeim.xml
new file mode 100644
index 0000000000..2a34409f8b
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_activeim.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_activeim" title="AKTYWNY IM"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_animation_preview.xml b/indra/newview/skins/default/xui/pl/floater_animation_preview.xml
index 0524b8ade3..ca06665c65 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/pl/floater_animation_preview.xml
@@ -1,172 +1,187 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Animation Preview" title="">
+ <floater.string name="failed_to_initialize">
+ Inicjalizacja ruchu nie powiodła się.
+ </floater.string>
+ <floater.string name="anim_too_long">
+ Długość pliku animacji wynosi [LENGTH] sekund.
+
+Maksymalna długość pliku animacji wynosi [MAX_LENGTH] sekund.
+ </floater.string>
+ <floater.string name="failed_file_read">
+ Brak możliwości odczytania plików animacji do wyświetlenia.
+
+[STATUS]
+ </floater.string>
+ <floater.string name="E_ST_OK">
+ Ok
+ </floater.string>
+ <floater.string name="E_ST_EOF">
+ Niewłaściwe zakończenie nazwy pliku.
+ </floater.string>
+ <floater.string name="E_ST_NO_CONSTRAINT">
+ Brak możliwości wyświetlenia definicji ograniczenia.
+ </floater.string>
+ <floater.string name="E_ST_NO_FILE">
+ Plik BVH nie może zostać otworzony.
+ </floater.string>
+ <floater.string name="E_ST_NO_HIER">
+ Niewłaściwy nagłówek HIERARCHI.
+ </floater.string>
+ <floater.string name="E_ST_NO_JOINT">
+ ROOT oraz JOINT nieodnalezione.
+ </floater.string>
+ <floater.string name="E_ST_NO_NAME">
+ Brak nazwy JOINT.
+ </floater.string>
+ <floater.string name="E_ST_NO_OFFSET">
+ OFFSET nieodnalezione.
+ </floater.string>
+ <floater.string name="E_ST_NO_CHANNELS">
+ CHANNELS nieodnalezione.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROTATION">
+ Brak otrzymania kolejności obrotu.
+ </floater.string>
+ <floater.string name="E_ST_NO_AXIS">
+ Brak osi obrotu.
+ </floater.string>
+ <floater.string name="E_ST_NO_MOTION">
+ MOTION nieodnalezione.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAMES">
+ Brak otrzymania liczby klatek obrazu.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAME_TIME">
+ Brak otrzymania czasu dla ilości klatek obrazu.
+ </floater.string>
+ <floater.string name="E_ST_NO_POS">
+ Brak otrzymania wartości pozycji.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROT">
+ Nie można odczytać wartości obrotu.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_FILE">
+ Nie można otworzyć pliku tłumaczenia.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HEADER">
+ Nie można przeczytać tłumaczenia nagłówka.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_NAME">
+ Nie można przetłumaczyć nazw.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_IGNORE">
+ Nie można przeczytać tłumaczenia dla wartości ignorowania.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_RELATIVE">
+ Nie można przeczytać tłumaczenia wartości relatywnej.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_OUTNAME">
+ Nie można przeczytać nazw wartości tłumaczenia.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MATRIX">
+ Nie można przeczytać tłumaczenia pola.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGECHILD">
+ Brak otrzymania nazwy dla mergechild.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGEPARENT">
+ Brak otrzymania nazwy dla mergeparent.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_PRIORITY">
+ Brak wartości prerogatywy.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_LOOP">
+ Brak otrzymania wartości powtórzeń.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEIN">
+ Brak otrzymawnia wartości easeIn.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEOUT">
+ Brak otrzymania wartości dla easeOut.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HAND">
+ Brak otrzymania wartości morfizacji.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EMOTE">
+ Niemożliwość przeczytania nazwy emocji.
+ </floater.string>
+ <floater.string name="E_ST_BAD_ROOT">
+ Nieprawidłowa nazwa, użyj &quot;hip&quot;.
+ </floater.string>
<text name="name_label">
Nazwa:
</text>
<text name="description_label">
Opis:
</text>
- <spinner label="Pierwszeństwo" name="priority"
- tool_tip="Kontroluj,animacje,które mogą zostać zdominowane przez tą animację" />
- <check_box label="Powtarzaj" name="loop_check" tool_tip="Powtarzaj tÄ… animacjÄ™" />
- <spinner label="Od(%)" name="loop_in_point"
- tool_tip="Wybierz punkt, od którego chcesz zacząć powtarzać animację" />
- <spinner label="Do(%)" name="loop_out_point"
- tool_tip="Wybierz punkt, od którego chcesz zakończyć powtarznie animacji" />
+ <spinner label="Pierwszeństwo" name="priority" tool_tip="Kontroluj animacje,które mogą zostać zdominowane przez tą animację"/>
+ <check_box label="Powtarzaj" name="loop_check" tool_tip="Powtarzaj tÄ… animacjÄ™"/>
+ <spinner label="Od(%)" name="loop_in_point" tool_tip="Wybierz punkt, od którego chcesz zacząć powtarzać animację"/>
+ <spinner label="Do(%)" name="loop_out_point" tool_tip="Wybierz punkt, od którego chcesz zakończyć powtarzanie animacji"/>
<text name="hand_label">
Pozycja Ręki
</text>
- <combo_box label="" name="hand_pose_combo"
- tool_tip="Kontroluje co robi ręka podczas animacji">
- <combo_item name="Spread">
- RozciÄ…gaj
- </combo_item>
- <combo_item name="Relaxed">
- Odpocznij
- </combo_item>
- <combo_item name="PointBoth">
- Wskazuj
- </combo_item>
- <combo_item name="Fist">
- Pięść
- </combo_item>
- <combo_item name="RelaxedLeft">
- Lewa-Odpocznij
- </combo_item>
- <combo_item name="PointLeft">
- Wskazuj LewÄ…
- </combo_item>
- <combo_item name="FistLeft">
- Zaciśnij Lewą
- </combo_item>
- <combo_item name="RelaxedRight">
- Prawa-Odpocznj
- </combo_item>
- <combo_item name="PointRight">
- Wskazuj PrawÄ…
- </combo_item>
- <combo_item name="FistRight">
- Zaciśnij Prawą
- </combo_item>
- <combo_item name="SaluteRight">
- Salutuj PrawÄ…
- </combo_item>
- <combo_item name="Typing">
- Pisz
- </combo_item>
- <combo_item name="PeaceRight">
- Prawa-Pokój
- </combo_item>
+ <combo_box label="" name="hand_pose_combo" tool_tip="Kontroluje co robi ręka podczas animacji">
+ <combo_box.item label="RozciÄ…gaj" name="Spread"/>
+ <combo_box.item label="Odpocznij" name="Relaxed"/>
+ <combo_box.item label="Wskazuj" name="PointBoth"/>
+ <combo_box.item label="Pięść" name="Fist"/>
+ <combo_box.item label="Lewa-Odpocznij" name="RelaxedLeft"/>
+ <combo_box.item label="Wskazuj LewÄ…" name="PointLeft"/>
+ <combo_box.item label="Zaciśnij Lewą" name="FistLeft"/>
+ <combo_box.item label="Prawa-Odpocznij" name="RelaxedRight"/>
+ <combo_box.item label="Wskazuj PrawÄ…" name="PointRight"/>
+ <combo_box.item label="Zaciśnij Prawą" name="FistRight"/>
+ <combo_box.item label="Salutuj PrawÄ…" name="SaluteRight"/>
+ <combo_box.item label="Pisz" name="Typing"/>
+ <combo_box.item label="Prawa-Pokój" name="PeaceRight"/>
</combo_box>
<text name="emote_label">
Ekspresja
</text>
- <combo_box label="" name="emote_combo"
- tool_tip="Kontroluj mimikÄ™ twarzy w czasie animacji">
- <combo_item name="[None]">
- [Żadne]
- </combo_item>
- <combo_item name="Aaaaah">
- Aaaaah
- </combo_item>
- <combo_item name="Afraid">
- Obawa
- </combo_item>
- <combo_item name="Angry">
- Złość
- </combo_item>
- <combo_item name="BigSmile">
- Duży Uśmiech
- </combo_item>
- <combo_item name="Bored">
- Znudzenie
- </combo_item>
- <combo_item name="Cry">
- Płacz
- </combo_item>
- <combo_item name="Disdain">
- Wzgarda
- </combo_item>
- <combo_item name="Embarrassed">
- Zakłopotanie
- </combo_item>
- <combo_item name="Frown">
- Marszczenie Brwi
- </combo_item>
- <combo_item name="Kiss">
- Pocałunek
- </combo_item>
- <combo_item name="Laugh">
- Åšmiech
- </combo_item>
- <combo_item name="Plllppt">
- Plllppt
- </combo_item>
- <combo_item name="Repulsed">
- Odrzucenie
- </combo_item>
- <combo_item name="Sad">
- Smutek
- </combo_item>
- <combo_item name="Shrug">
- Wzruszanie Ramionami
- </combo_item>
- <combo_item name="Smile">
- Uśmiech
- </combo_item>
- <combo_item name="Surprise">
- Niespodzianka
- </combo_item>
- <combo_item name="Wink">
- Mrugnięcie
- </combo_item>
- <combo_item name="Worry">
- Zmartwienie
- </combo_item>
+ <combo_box label="" name="emote_combo" tool_tip="Kontroluj mimikÄ™ twarzy w czasie animacji">
+ <combo_box.item label="(Żadne)" name="[None]"/>
+ <combo_box.item label="Aaaaah" name="Aaaaah"/>
+ <combo_box.item label="Obawa" name="Afraid"/>
+ <combo_box.item label="Złość" name="Angry"/>
+ <combo_box.item label="Duży Uśmiech" name="BigSmile"/>
+ <combo_box.item label="Znudzenie" name="Bored"/>
+ <combo_box.item label="Płacz" name="Cry"/>
+ <combo_box.item label="Wzgarda" name="Disdain"/>
+ <combo_box.item label="Zakłopotanie" name="Embarrassed"/>
+ <combo_box.item label="Marszczenie Brwi" name="Frown"/>
+ <combo_box.item label="Pocałunek" name="Kiss"/>
+ <combo_box.item label="Åšmiech" name="Laugh"/>
+ <combo_box.item label="Plllppt" name="Plllppt"/>
+ <combo_box.item label="Odrzucenie" name="Repulsed"/>
+ <combo_box.item label="Smutek" name="Sad"/>
+ <combo_box.item label="Wzruszenie Ramionami" name="Shrug"/>
+ <combo_box.item label="Uśmiech" name="Smile"/>
+ <combo_box.item label="Niespodzianka" name="Surprise"/>
+ <combo_box.item label="Mrugnięcie" name="Wink"/>
+ <combo_box.item label="Zmartwienie" name="Worry"/>
</combo_box>
<text name="preview_label">
PrzeglÄ…daj kiedy:
</text>
- <combo_box label="" name="preview_base_anim"
- tool_tip="Przetestuj zachowanie animacji kiedy awatar wykonuje normalne czynności">
- <combo_item name="Standing">
- Stoisz
- </combo_item>
- <combo_item name="Walking">
- Chodzisz
- </combo_item>
- <combo_item name="Sitting">
- Siedzisz
- </combo_item>
- <combo_item name="Flying">
- Latasz
- </combo_item>
+ <combo_box label="" name="preview_base_anim" tool_tip="Przetestuj zachowanie animacji kiedy awatar wykonuje normalne czynności">
+ <combo_box.item label="Stoisz" name="Standing"/>
+ <combo_box.item label="Chodzisz" name="Walking"/>
+ <combo_box.item label="Siedzisz" name="Sitting"/>
+ <combo_box.item label="Latasz" name="Flying"/>
</combo_box>
- <spinner label="Złagodzić w (sekund)" name="ease_in_time"
- tool_tip="Ilość Czasu (w sekundach), w których animacje mieszają się" />
- <spinner label="Złagodzić na zewnątrz (sekund)" name="ease_out_time"
- tool_tip="Ilość Czasu (w sekundach), w których animacje oddzielają się" />
- <button label="" name="play_btn" tool_tip="Play/pause your animation." />
- <button label="" name="stop_btn" tool_tip="Stop animation playback" />
- <slider label="" name="playback_slider" />
+ <spinner label="Złagodzić w (sekund)" name="ease_in_time" tool_tip="Ilość Czasu (w sekundach), w których animacje mieszają się"/>
+ <spinner label="Złagodzić na zewnątrz (sekund)" name="ease_out_time" tool_tip="Ilość Czasu (w sekundach), w których animacje oddzielają się"/>
+ <button label="" name="play_btn" tool_tip="Odtwarzaj animacjÄ™"/>
+ <button name="pause_btn" tool_tip="Zatrzymaj animacjÄ™"/>
+ <button label="" name="stop_btn" tool_tip="Stop animation playback"/>
+ <slider label="" name="playback_slider"/>
<text name="bad_animation_text">
Brak możliwości wczytania pliku animacji.
Doradzamy eksport plików BVH z Poser 4.
</text>
- <button label="Anuluj" name="cancel_btn" />
- <button label="Załaduj (L$[AMOUNT])" name="ok_btn" />
- <string name="failed_to_initialize">
- Inicjalizacja ruchu nie powiodła się.
- </string>
- <string name="anim_too_long">
- Długość pliku animacji wynosi [LENGTH] sekund.
-
-Maksymalna długość pliku animacji wynosi [MAX_LENGTH] sekund.
- </string>
- <string name="failed_file_read">
- Niemożliwość odczytania pliku animacji do wyświetlenia.
-
-[STATUS]
- </string>
+ <button label="Załaduj ([AMOUNT]L$)" name="ok_btn"/>
+ <button label="Anuluj" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_auction.xml b/indra/newview/skins/default/xui/pl/floater_auction.xml
index 37e35ed1e9..9399fa1115 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_auction.xml
+++ b/indra/newview/skins/default/xui/pl/floater_auction.xml
@@ -1,9 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_auction" title="ROZPOCZNIJ SPRZEDAÅ» POSIADÅOÅšCI">
- <check_box label="Zawierając żółte ogrodzenie" name="fence_check" />
- <button label="Zdjęce" label_selected="Zdjęce" name="snapshot_btn" />
- <button label="OK" label_selected="OK" name="ok_btn" />
- <string name="already for sale">
- Nie możesz umieścić posiadłości na aukcji, jeżeli już została wystawiona na sprzedaż.
- </string>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_auction" title="ROZPOCZNIJ SPRZEDAÅ» POSIADÅOÅšCI LINDENÓW">
+ <floater.string name="already for sale">
+ Nie możesz umieścić Posiadłości na Aukcji, jeżeli już została wystawiona na sprzedaż.
+ </floater.string>
+ <check_box initial_value="true" label="Zawierając żółte ogrodzenie" name="fence_check"/>
+ <button label="Zdjęce" label_selected="Zdjęce" name="snapshot_btn"/>
+ <button label="Sprzedaj każdemu" label_selected="Sprzedaj Każdemu" name="sell_to_anyone_btn"/>
+ <button label="Wyczyść ustawienia" label_selected="Wyczyść ustawienia" name="reset_parcel_btn"/>
+ <button label="Rozpocznij AukcjÄ™" label_selected="Rozpocznij AukcjÄ™" name="start_auction_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_avatar_picker.xml b/indra/newview/skins/default/xui/pl/floater_avatar_picker.xml
index 8c09f7294c..0897f59570 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/pl/floater_avatar_picker.xml
@@ -1,40 +1,46 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="avatarpicker" title="WYBIERZ REZYDENTA">
+ <floater.string name="not_found">
+ &apos;[TEXT]&apos; nie zostało odnalezione
+ </floater.string>
+ <floater.string name="no_one_near">
+ Nie ma nikogo w pobliżu
+ </floater.string>
+ <floater.string name="no_results">
+ Brak wyników
+ </floater.string>
+ <floater.string name="searching">
+ Wyszukiwanie...
+ </floater.string>
+ <string label="Wybierz" label_selected="Wybierz" name="Select">
+ Wybierz
+ </string>
+ <string name="Close">
+ Zamknij
+ </string>
<tab_container name="ResidentChooserTabs">
<panel label="Znajdź" name="SearchPanel">
<text name="InstructSearchResidentName">
- Wpisz imiÄ™ Rezydenta:
+ Wpisz fragment imienia:
</text>
- <button label="Znajdź" label_selected="Znajdź" name="Find"/>
+ <button label="Szukaj" label_selected="Szukaj" name="Find"/>
</panel>
- <panel label="Wizytówka" name="CallingCardsPanel">
- <text name="InstructSelectCallingCard">
- Wybierz wizytówkę:
+ <panel label="Znajomi" name="FriendsPanel">
+ <text name="InstructSelectFriend">
+ Wybierz osobÄ™:
</text>
</panel>
<panel label="Obok mnie:" name="NearMePanel">
<text name="InstructSelectResident">
- Wybierz Rezydenta obok:
+ Wybierz osobę w pobliżu:
</text>
- <button label="Odśwież" label_selected="Odśwież" name="Refresh"/>
<slider label="Zasięg" name="near_me_range"/>
<text name="meters">
Metry
</text>
+ <button label="Odśwież" label_selected="Odśwież" name="Refresh"/>
</panel>
</tab_container>
- <button label="Wybierz" label_selected="Wybierz" name="Select"/>
- <button label="Anuluj" label_selected="Anuluj" name="Cancel"/>
- <string name="not_found">
- &apos;[TEXT]&apos; nie zostało odnalezione
- </string>
- <string name="no_one_near">
- Nikt w pobliżu
- </string>
- <string name="no_results">
- Brak wyników
- </string>
- <string name="searching">
- Wyszukiwanie...
- </string>
+ <button label="OK" label_selected="OK" name="ok_btn"/>
+ <button label="Cofnij" label_selected="Cofnij" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_avatar_textures.xml b/indra/newview/skins/default/xui/pl/floater_avatar_textures.xml
index dce2330807..11651ad7e8 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_avatar_textures.xml
+++ b/indra/newview/skins/default/xui/pl/floater_avatar_textures.xml
@@ -1,30 +1,43 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="avatar_texture_debug" title="TEKSTURY AWATARA">
- <text name="baked_label">
- Tekstury Renderowane
- </text>
+ <floater.string name="InvalidAvatar">
+ NIEWÅAÅšCIWY AWATAR
+ </floater.string>
<text name="composite_label">
- Tekstury Kompozytowe
+ Tekstury kompozytowe
</text>
- <texture_picker label="Głowa" name="baked_head" />
- <texture_picker label="Makijaż" name="head_bodypaint" />
- <texture_picker label="Włosy" name="hair" />
- <button label="Zrzuć" label_selected="Zrzuć" name="Dump" />
- <texture_picker label="Oczy" name="baked_eyes" />
- <texture_picker label="Oko" name="eye_texture" />
- <texture_picker label="Góra Część Ciała" name="baked_upper_body" />
- <texture_picker label="Tatuaż Górnej Części Ciała" name="upper_bodypaint" />
- <texture_picker label="Podkoszulek" name="undershirt" />
- <texture_picker label="Rękawiczki" name="gloves" />
- <texture_picker label="Koszula" name="shirt" />
- <texture_picker label="Górna Część Kurtki" name="upper_jacket" />
- <texture_picker label="Dolna Część Ciała" name="baked_lower_body" />
- <texture_picker label="Tatuaż Dolnej Części Ciała" name="lower_bodypaint" />
- <texture_picker label="Bielizna" name="underpants" />
- <texture_picker label="Skarpety" name="socks" />
- <texture_picker label="Buty" name="shoes" />
- <texture_picker label="Spodnie" name="pants" />
- <texture_picker label="Kurtka" name="jacket" />
- <texture_picker label="Spódnica" name="baked_skirt" />
- <texture_picker label="Spódnica" name="skirt_texture" />
+ <button label="Zrzuć" label_selected="Zrzuć" name="Dump"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <texture_picker label="Włosy" name="hair-baked"/>
+ <texture_picker label="Włosy" name="hair_grain"/>
+ <texture_picker label="Alpha włosów" name="hair_alpha"/>
+ <texture_picker label="Głowa" name="head-baked"/>
+ <texture_picker label="Makijaż" name="head_bodypaint"/>
+ <texture_picker label="Alpha głowy" name="head_alpha"/>
+ <texture_picker label="Tatuaż głowy" name="head_tattoo"/>
+ <texture_picker label="Oczy" name="eyes-baked"/>
+ <texture_picker label="Oko" name="eyes_iris"/>
+ <texture_picker label="Alpha oczu" name="eyes_alpha"/>
+ <texture_picker label="Górna część ciała" name="upper-baked"/>
+ <texture_picker label="Górny wzór na ciele" name="upper_bodypaint"/>
+ <texture_picker label="Podkoszulek" name="upper_undershirt"/>
+ <texture_picker label="Rękawiczki" name="upper_gloves"/>
+ <texture_picker label="Koszula" name="upper_shirt"/>
+ <texture_picker label="Kurtka górna" name="upper_jacket"/>
+ <texture_picker label="Alpha górna" name="upper_alpha"/>
+ <texture_picker label="Tatuaż górny" name="upper_tattoo"/>
+ <texture_picker label="Dolna część ciała" name="lower-baked"/>
+ <texture_picker label="Dolny wzór na ciele" name="lower_bodypaint"/>
+ <texture_picker label="Bielizna" name="lower_underpants"/>
+ <texture_picker label="Skarpetki" name="lower_socks"/>
+ <texture_picker label="Buty" name="lower_shoes"/>
+ <texture_picker label="Spodnie" name="lower_pants"/>
+ <texture_picker label="Kurtka" name="lower_jacket"/>
+ <texture_picker label="Alpha dolna" name="lower_alpha"/>
+ <texture_picker label="Tatuaż dolny" name="lower_tattoo"/>
+ <texture_picker label="Spódnica" name="skirt-baked"/>
+ <texture_picker label="Spódnica" name="skirt"/>
+ </panel>
+ </scroll_container>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_beacons.xml b/indra/newview/skins/default/xui/pl/floater_beacons.xml
index 6e7013f2d7..547db2b351 100644
--- a/indra/newview/skins/default/xui/pl/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/pl/floater_beacons.xml
@@ -1,15 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="beacons" title="EMITERY">
<panel name="beacons_panel">
- <check_box label="Obiekty Dotykalne" name="touch_only"/>
- <check_box label="Obiekty Skryptowane" name="scripted"/>
- <check_box label="Obiekty Fizyczne" name="physical"/>
- <check_box label="Źródła Dźwięku" name="sounds"/>
- <check_box label="Źródła Cząsteczek" name="particles"/>
- <check_box label="Podkreśl Emitery" name="highlights"/>
- <check_box label="Pokaż Emitery" name="beacons"/>
- <text name="beacon_width_label">
- Zasięg Emiterów:
+ <text name="label_show">
+ Pokaż emitery:
</text>
+ <check_box label="Emitery" name="beacons"/>
+ <check_box label="Podkreśl emitery" name="highlights"/>
+ <text name="beacon_width_label" tool_tip="Zasięg emiterów">
+ Szer.
+ </text>
+ <text name="label_objects">
+ Dla tych obiektów:
+ </text>
+ <check_box label="Obiekty fizyczne" name="physical"/>
+ <check_box label="Obiekty skryptowane" name="scripted"/>
+ <check_box label="Obiekty dotykalne" name="touch_only"/>
+ <check_box label="Źródła dźwięku" name="sounds"/>
+ <check_box label="Źródła cząsteczek" name="particles"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_build_options.xml b/indra/newview/skins/default/xui/pl/floater_build_options.xml
index f538be218c..5d296aa725 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/pl/floater_build_options.xml
@@ -1,8 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="build options floater" title="OPCJE SIATKI">
- <spinner label="Jednostka Siatki (metry)" name="GridResolution" />
- <spinner label="Rozmiary Siatki (metry)" name="GridDrawSize" />
- <check_box label="Udostępnij Podjednostkowe Dopasowywanie" name="GridSubUnit" />
- <check_box label="Pokaż Sekcje Skośne" name="GridCrossSection" />
- <slider label="Nieprzezroczystość Siatki" name="GridOpacity" />
+ <spinner label="Jednostki siatki (metery)" name="GridResolution"/>
+ <spinner label="Rozmiary siatki (metry)" name="GridDrawSize"/>
+ <check_box label="Pokaż podjednostki" name="GridSubUnit"/>
+ <check_box label="Pokaż przekroje" name="GridCrossSection"/>
+ <text name="grid_opacity_label" tool_tip="Nieprzeźroczystość siatki:">
+ Nieprzeźroczystość:
+ </text>
+ <slider label="Nieprzezroczystość siatki" name="GridOpacity"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_bulk_perms.xml b/indra/newview/skins/default/xui/pl/floater_bulk_perms.xml
index f06615642e..f4721b05d8 100644
--- a/indra/newview/skins/default/xui/pl/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/pl/floater_bulk_perms.xml
@@ -1,44 +1,54 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floaterbulkperms" title="HURTOWA ZMIANA PRAW ZAWARTOÅšCI">
- <text name="applyto">
- Rodzaj Zawartości
- </text>
+ <floater.string name="nothing_to_modify_text">
+ Selekcja zawiera zawartość niemodfyfikowalną
+ </floater.string>
+ <floater.string name="status_text">
+ Ustawienie praw na [NAME]
+ </floater.string>
+ <floater.string name="start_text">
+ Rozpoczęcie prośby o zmianę praw...
+ </floater.string>
+ <floater.string name="done_text">
+ Zakończenie prośby o zmianę praw.
+ </floater.string>
<check_box label="Animacje" name="check_animation"/>
- <check_box label="Części Ciała" name="check_bodypart"/>
+ <icon name="icon_animation" tool_tip="Animacja"/>
+ <check_box label="Części ciała" name="check_bodypart"/>
+ <icon name="icon_bodypart" tool_tip="Części Ciała"/>
<check_box label="Ubranie" name="check_clothing"/>
+ <icon name="icon_clothing" tool_tip="Ubranie"/>
<check_box label="Gestury" name="check_gesture"/>
- <check_box label="Zapamiętane Miejsca" name="check_landmark"/>
+ <icon name="icon_gesture" tool_tip="Gestury"/>
<check_box label="Noty" name="check_notecard"/>
+ <icon name="icon_notecard" tool_tip="Noty"/>
<check_box label="Obiekty" name="check_object"/>
+ <icon name="icon_object" tool_tip="Obiekty"/>
<check_box label="Skrypty" name="check_script"/>
+ <icon name="icon_script" tool_tip="Skrypty"/>
<check_box label="Dźwięki" name="check_sound"/>
+ <icon name="icon_sound" tool_tip="Dźwięki"/>
<check_box label="Tekstury" name="check_texture"/>
- <button width="115" font="SansSerifSmall" label="Wybierz Wszystkie" label_selected="Wszystkie" name="check_all"/>
- <button width="115" font="SansSerifSmall" label="Odznacz Wszystkie" label_selected="Żadne" name="check_none"/>
+ <icon name="icon_texture" tool_tip="Tekstury"/>
+ <button font="SansSerifSmall" label="√ Wszystkie" label_selected="Wszystkie" name="check_all" width="115"/>
+ <button font="SansSerifSmall" label="Żadne" label_selected="Żadne" name="check_none" width="115"/>
<text name="newperms">
- Nowe Prawa
+ Nowe prawa zawartości
+ </text>
+ <text name="GroupLabel">
+ Grupa:
</text>
- <check_box label="Udostępnij Grupie" name="share_with_group"/>
- <check_box label="Pozwól kopiować każdemu" name="everyone_copy"/>
+ <check_box label="Udostępnij" name="share_with_group"/>
+ <text name="AnyoneLabel">
+ Każdy:
+ </text>
+ <check_box label="Kopiuj" name="everyone_copy"/>
<text name="NextOwnerLabel">
Następny Właściciel:
</text>
<check_box label="Modyfikuje" name="next_owner_modify"/>
<check_box label="Kopiuje" name="next_owner_copy"/>
- <check_box label="Oddaje/Sprzedaje" name="next_owner_transfer"/>
- <button label="Pomoc" name="help"/>
- <button label="Zastosuj" name="apply"/>
- <button label="Zamknij" name="close"/>
- <string name="nothing_to_modify_text">
- Selekcja zawiera zawartość niemodfyfikowalną
- </string>
- <string name="status_text">
- Ustawienie praw na [NAME]
- </string>
- <string name="start_text">
- Rozpoczęcie prośby o zmianę praw...
- </string>
- <string name="done_text">
- Zakończenie prośby o zmianę praw.
- </string>
+ <check_box initial_value="true" label="Oddaj/Sprzedaj" name="next_owner_transfer" tool_tip="Następny właściciel może oddać lub sprzedać ten obiekt."/>
+ <button label="OK" name="apply"/>
+ <button label="Anuluj" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_bumps.xml b/indra/newview/skins/default/xui/pl/floater_bumps.xml
index 10f9d73284..1f1b29a83e 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_bumps.xml
+++ b/indra/newview/skins/default/xui/pl/floater_bumps.xml
@@ -1,21 +1,24 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_bumps" title="ZDERZENIA, POPCHNIĘCIA, UDERZENIA">
- <string name="none_detected">
+ <floater.string name="none_detected">
Brak
- </string>
- <string name="bump">
+ </floater.string>
+ <floater.string name="bump">
[TIME] [FIRST] [LAST] awatar zderzył się z Tobą
- </string>
- <string name="llpushobject">
+ </floater.string>
+ <floater.string name="llpushobject">
[TIME] [FIRST] [LAST] awatar popchnÄ…Å‚ CiÄ™ swoim skryptem
- </string>
- <string name="selected_object_collide">
+ </floater.string>
+ <floater.string name="selected_object_collide">
[TIME] [FIRST] [LAST] awatar uderzył Cię swoim obiektem
- </string>
- <string name="scripted_object_collide">
+ </floater.string>
+ <floater.string name="scripted_object_collide">
[TIME] [FIRST] [LAST] awatar uderzył Cię swoim skryptowanym obiektem
- </string>
- <string name="physical_object_collide">
+ </floater.string>
+ <floater.string name="physical_object_collide">
[TIME] [FIRST] [LAST] awatar uderzył Cię swoim fizycznym obiektem
- </string>
+ </floater.string>
+ <floater.string name="timeStr">
+ [[hour,datetime,slt]:[min,datetime,slt]]
+ </floater.string>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_buy_contents.xml b/indra/newview/skins/default/xui/pl/floater_buy_contents.xml
index ebe1c9dfd8..94f2b50450 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/pl/floater_buy_contents.xml
@@ -1,14 +1,14 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_buy_contents" title="KUP ZAWARTOŚĆ">
<text name="contains_text">
[NAME] zawiera:
</text>
<text name="buy_text">
- Kupić za L$[AMOUNT] od [NAME]?
+ Kupić za [AMOUNT]L$ od [NAME]?
</text>
- <button label="Anuluj" label_selected="Anuluj" name="cancel_btn" />
- <button label="Kup" label_selected="Kup" name="buy_btn" />
- <check_box label="Załóż ubrania teraz" name="wear_check" />
+ <button label="Anuluj" label_selected="Anuluj" name="cancel_btn"/>
+ <button label="Kup" label_selected="Kup" name="buy_btn"/>
+ <check_box label="Załóż ubrania teraz" name="wear_check"/>
<string name="no_copy_text">
(bez prawa kopiowania)
</string>
diff --git a/indra/newview/skins/default/xui/pl/floater_buy_currency.xml b/indra/newview/skins/default/xui/pl/floater_buy_currency.xml
index 5e59482883..f2a6579dc3 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/pl/floater_buy_currency.xml
@@ -1,50 +1,43 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="buy currency" title="KUP $L">
- <text name="info_buying">
- Kup L$:
- </text>
- <text name="info_cannot_buy">
- Brak możliwości zakupu L$ teraz:
- </text>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="buy currency" title="KUP L$">
+ <floater.string name="buy_currency">
+ Kup [LINDENS] L$ za [LOCALAMOUNT]
+ </floater.string>
<text name="info_need_more">
- Potrzebujesz wiecęj L$:
+ Potrzebujesz więcej L$
</text>
- <text name="error_message">
- Pojawienie się błędu.
- </text>
- <button label="Idź do strony internetowej" name="error_web" width="168"/>
<text name="contacting">
Kontaktowanie z LindeX...
</text>
- <text name="buy_action_unknown">
- Kup L$ w systemie walutowej wymiany LindeX
+ <text name="info_buying">
+ Kup L$
</text>
- <text name="buy_action">
- [NAME] [PRICE]L$
+ <text name="balance_label">
+ Obecnie posiadasz
+ </text>
+ <text name="balance_amount">
+ [AMT]L$
</text>
<text name="currency_action">
Kup
</text>
- <line_editor name="currency_amt" left_delta="32">
+ <text name="currency_label">
+ L$
+ </text>
+ <line_editor label="L$" left_delta="32" name="currency_amt">
1234
</line_editor>
+ <text name="buying_label">
+ Cena
+ </text>
<text name="currency_est">
za [LOCALAMOUNT]
</text>
<text name="getting_data">
- Otrzymywanie danych...
+ Kalkulowanie...
</text>
- <text name="balance_label">
- Obecnie posiadasz
- </text>
- <text name="balance_amount">
- [AMT]L$
- </text>
- <text name="buying_label">
- Kupujesz
- </text>
- <text name="buying_amount">
- [AMT]L$
+ <text name="buy_action">
+ [ACTION]
</text>
<text name="total_label">
Twój nowy stan konta
@@ -52,18 +45,22 @@
<text name="total_amount">
[AMT]L$
</text>
- <text name="purchase_warning_repurchase" height="48" bottom_delta="-64" right="-10">
- DokonujÄ…c potwierdzenia na podanÄ… transakcjÄ™,
-wyrażasz zgodę jedynie na zakup waluty.
-Sprobuj wykonać operację ponownie.
+ <text name="currency_links">
+ [http://www.secondlife.com/my/account/payment_method_management.php metoda płatności] | [http://www.secondlife.com/my/account/currency.php waluta] | [http://www.secondlife.com/my/account/exchange_rates.php kurs wymiany]
+ </text>
+ <text name="exchange_rate_note">
+ Wpisz ponownie kwotę aby zobaczyć ostatni kurs wymiany.
</text>
- <text name="purchase_warning_notenough" bottom_delta="16">
- Nie zakupujesz wystarczającej ilości waluty.
-Proszę zwiększyć ilość.
+ <text bottom_delta="-64" height="48" name="purchase_warning_repurchase" right="-10">
+ Potwierdzasz zakup L$, nie obiektu.
+ </text>
+ <text bottom_delta="16" name="purchase_warning_notenough">
+ Nie zakupiono wystarczającej ilości L$. Proszę zwiększyć kwotę.
+ </text>
+ <button label="Kup teraz" name="buy_btn"/>
+ <button label="Anuluj" name="cancel_btn"/>
+ <text name="info_cannot_buy">
+ Nie można kupić
</text>
- <button label="Anuluj" name="cancel_btn" />
- <button label="Kup" name="buy_btn" />
- <string name="buy_currency">
- Kup [LINDENS]L$ za [LOCALAMOUNT]
- </string>
+ <button label="Przejdź na stronę WWW" name="error_web" width="168"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_buy_land.xml b/indra/newview/skins/default/xui/pl/floater_buy_land.xml
index 648888828b..7b4f459b4e 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/pl/floater_buy_land.xml
@@ -1,5 +1,130 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="buy land" title="BUY LAND">
+<floater name="buy land" title="KUP POSIADÅOŚĆ">
+ <floater.string name="can_resell">
+ Może być odsprzedana.
+ </floater.string>
+ <floater.string name="can_not_resell">
+ Nie może być odsprzedana.
+ </floater.string>
+ <floater.string name="can_change">
+ Mogą być łączone i dzielone.
+ </floater.string>
+ <floater.string name="can_not_change">
+ Nie mogą być łączone ani dzielone.
+ </floater.string>
+ <floater.string name="cant_buy_for_group">
+ Nie masz pozwolenia na zakup Posiadłości dla Twojej aktywnej Grupy.
+ </floater.string>
+ <floater.string name="no_land_selected">
+ Obszar nie jest wybrany.
+ </floater.string>
+ <floater.string name="multiple_parcels_selected">
+ Wybrałeś wiele różnych Posiadłości.
+Spróbuj wybrać mniejszy obszar.
+ </floater.string>
+ <floater.string name="no_permission">
+ Nie masz pozwolenia na zakup Posiadłości dla Twojej aktywnej Grupy.
+ </floater.string>
+ <floater.string name="parcel_not_for_sale">
+ Wybrana Posiadłość nie jest na sprzedaż.
+ </floater.string>
+ <floater.string name="group_already_owns">
+ Ta Posiadłość już należy do Grupy.
+ </floater.string>
+ <floater.string name="you_already_own">
+ Ta Posiadłość już należy do Ciebie.
+ </floater.string>
+ <floater.string name="set_to_sell_to_other">
+ Wybrana Posiadłość będzie sprzedana komuś innemu.
+ </floater.string>
+ <floater.string name="no_public_land">
+ Wybrany obszar nie ma publicznych Posiadłości.
+ </floater.string>
+ <floater.string name="not_owned_by_you">
+ Wybrałeś Posiadłość, której Właścicielem jest inny Rezydent.
+Spróbuj wybrać ponownie mniejszą powierzchnię Posiadłości.
+ </floater.string>
+ <floater.string name="processing">
+ Przetwarzanie Twojego zakupu...
+
+(Może zająć kilka minut)
+ </floater.string>
+ <floater.string name="fetching_error">
+ Błąd podczas wczytywania informacji zakupu Posiadłości.
+ </floater.string>
+ <floater.string name="buying_will">
+ Zakup tej Posiadłości spowoduje:
+ </floater.string>
+ <floater.string name="buying_for_group">
+ Zakup ziemi dla Grupy:
+ </floater.string>
+ <floater.string name="cannot_buy_now">
+ Nie możesz teraz kupić:
+ </floater.string>
+ <floater.string name="not_for_sale">
+ Nie jest na sprzedaż:
+ </floater.string>
+ <floater.string name="none_needed">
+ Poprawność danych.
+ </floater.string>
+ <floater.string name="must_upgrade">
+ Musisz mieć konto Premium żebyś mógł mieć Posiadłości.
+ </floater.string>
+ <floater.string name="cant_own_land">
+ Twoje konto pozwala Ci mieć Posiadłości.
+ </floater.string>
+ <floater.string name="land_holdings">
+ Jesteś właścicielem [BUYER] m² ziemi.
+ </floater.string>
+ <floater.string name="pay_to_for_land">
+ Zapłać [SELLER] [AMOUNT]L$ za Posiadłość
+ </floater.string>
+ <floater.string name="buy_for_US">
+ Kup L$ [AMOUNT] za [LOCAL_AMOUNT],
+ </floater.string>
+ <floater.string name="parcel_meters">
+ Podana posiadłość to [AMOUNT] m² ziemi.
+ </floater.string>
+ <floater.string name="premium_land">
+ Podana posiadłość jest w cenie premium adekwatnie jak za [AMOUNT] m².
+ </floater.string>
+ <floater.string name="discounted_land">
+ Wybrana posiadłość jest w cenie zniżkowej adekwatnie jak za [AMOUNT] m².
+ </floater.string>
+ <floater.string name="meters_supports_object">
+ [AMOUNT] m²
+wspiera [AMOUNT2] obiektów
+ </floater.string>
+ <floater.string name="sold_with_objects">
+ sprzedane z obiektami
+ </floater.string>
+ <floater.string name="sold_without_objects">
+ obiekty nie są zawarte w sprzedaży
+ </floater.string>
+ <floater.string name="info_price_string">
+ L$ [PRICE]
+(L$ [PRICE_PER_SQM]/m²)
+[SOLD_WITH_OBJECTS]
+ </floater.string>
+ <floater.string name="insufficient_land_credits">
+ Grupa [GROUP] musi mieć wystarczający kredyt na
+używanie Posiadłości żeby sfinalizować ten zakup.
+ </floater.string>
+ <floater.string name="have_enough_lindens">
+ Masz [AMOUNT]L$ co wystarcza na zakup tej Posiadłości.
+ </floater.string>
+ <floater.string name="not_enough_lindens">
+ Masz tylko [AMOUNT]L$ i potrzebujesz [AMOUNT2]L$ dodatkowo.
+ </floater.string>
+ <floater.string name="balance_left">
+ Po zakupie zostanie Ci [AMOUNT]L$.
+ </floater.string>
+ <floater.string name="balance_needed">
+ Musisz dokupić [AMOUNT]L$ żeby kupić tą Posiadłość.
+ </floater.string>
+ <floater.string name="no_parcel_selected">
+ (Posiadłość nie została wybrana)
+ </floater.string>
<text name="region_name_label">
Region:
</text>
@@ -74,9 +199,9 @@ sprzedaż z obiektami
Tylko członkowie z kontem Premium mogą mieć Posiadłosci.
</text>
<combo_box name="account_level">
- <combo_box.item name="US$9.95/month,billedmonthly" label="9.95US$/miesiąc, płatne miesięcznie" />
- <combo_box.item name="US$7.50/month,billedquarterly" label="7.50US$/miesiąc, płatne kwartalnie" />
- <combo_box.item name="US$6.00/month,billedannually" label="6.00US$/miesiąc, płatne rocznie" />
+ <combo_box.item label="US$9.95/miesięcznie, naliczane miesięcznie" name="US$9.95/month,billedmonthly"/>
+ <combo_box.item label="US$7.50/miesięcznie, naliczane kwartalnie" name="US$7.50/month,billedquarterly"/>
+ <combo_box.item label="US$6.00/miesięcznie, naliczane rocznie" name="US$6.00/month,billedannually"/>
</combo_box>
<text name="land_use_action">
Zwiększ opłatę za używanie Posiadłości do 40US$/miesiąc.
@@ -98,140 +223,12 @@ Posiadłość ta zawiera 512 m² ziemi.
1000
</line_editor>
<text name="currency_est">
- za około [AMOUNT2]US$
+ za [LOCAL_AMOUNT]
</text>
<text name="currency_balance">
Masz 2,100L$.
</text>
- <check_box label="Zabierz [AMOUNT] metrów donacji z Grupy." name="remove_contribution"/>
+ <check_box label="Usuń [AMOUNT] m² z kontrybucji w grupie." name="remove_contribution"/>
<button label="Zakup" name="buy_btn"/>
<button label="Anuluj" name="cancel_btn"/>
- <string name="can_resell">
- Może być odsprzedana.
- </string>
- <string name="can_not_resell">
- Nie może być odsprzedana.
- </string>
- <string name="can_change">
- Mogą być łączone i dzielone.
- </string>
- <string name="can_not_change">
- Nie mogą być łączone ani dzielone.
- </string>
- <string name="cant_buy_for_group">
- Nie masz pozwolenia na zakup Posiadłości dla Twojej aktywnej Grupy.
- </string>
- <string name="no_land_selected">
- Obszar nie jest wybrany.
- </string>
- <string name="multiple_parcels_selected">
- Wybrałeś wiele różnych Posiadłości.
-Spróbuj wybrać mniejszy obszar.
- </string>
- <string name="no_permission">
- Nie masz pozwolenia na zakup Posiadłości dla Twojej aktywnej Grupy.
- </string>
- <string name="parcel_not_for_sale">
- Wybrana Posiadłość nie jest na sprzedaż.
- </string>
- <string name="group_already_owns">
- Ta Posiadłość już należy do Grupy.
- </string>
- <string name="you_already_own">
- Ta Posiadłość już należy do Ciebie.
- </string>
- <string name="set_to_sell_to_other">
- Wybrana Posiadłość będzie sprzedana komu innemu.
- </string>
- <string name="no_public_land">
- Wybrany obszar nie ma publicznych Posiadłości.
- </string>
- <string name="not_owned_by_you">
- Wybrana Posiadłość należy do kogoś innego.
-Spróbuj wybrać inny obszar.
- </string>
- <string name="processing">
- Przetwarzanie Twojego zakupu...
-
-(Może zająć kilka minut)
- </string>
- <string name="fetching_error">
- Błąd podczas wczytywania informacji zakupu Posiadłości.
- </string>
- <string name="buying_will">
- Zakup tej Posiadłości spowoduje:
- </string>
- <string name="buying_for_group">
- Zakup ziemi dla grupy:
- </string>
- <string name="cannot_buy_now">
- Nie możesz teraz kupić:
- </string>
- <string name="not_for_sale">
- Nie jest na sprzedaż:
- </string>
- <string name="none_needed">
- Poprawność danych.
- </string>
- <string name="must_upgrade">
- Musisz mieć konto Premium żebyś mógł mieć Posiadłości.
- </string>
- <string name="cant_own_land">
- Twoje konto pozwala Ci mieć Posiadłości.
- </string>
- <string name="land_holdings">
- Jesteś właścicielem [BUYER] m² ziemi.
- </string>
- <string name="pay_to_for_land">
- Zapłać [SELLER] [AMOUNT]L$ za Posiadłość
- </string>
- <string name="buy_for_US">
- Kup L$ [AMOUNT] za US$ [AMOUNT2],
- </string>
- <string name="parcel_meters">
- Podana posiadłość to [AMOUNT] m² ziemi.
- </string>
- <string name="premium_land">
- Podana posiadłość jest w cenie premium adekwatnie jak za [AMOUNT] m².
- </string>
- <string name="discounted_land">
- Wybrana posiadłość jest w cenie zniżkowej adekwatnie jak za [AMOUNT] m².
- </string>
- <string name="meters_supports_object">
- [AMOUNT] m²
-wspiera [AMOUNT2] obiektów
- </string>
- <string name="sold_with_objects">
- sprzedane z obiektami
- </string>
- <string name="sold_without_objects">
- obiekty nie są zawarte w sprzedaży
- </string>
- <string name="info_price_string">
- L$ [PRICE]
-(L$ [PRICE_PER_SQM]/m²)
-[SOLD_WITH_OBJECTS]
- </string>
- <string name="insufficient_land_credits">
- Grupa [GROUP] musi mieć wystarczający kredyt na
-używanie Posiadłości żeby sfinalizować ten zakup.
- </string>
- <string name="have_enough_lindens">
- Masz [AMOUNT]L$ co wystarcza na zakup tej Posiadłości.
- </string>
- <string name="not_enough_lindens">
- Masz tylko [AMOUNT]L$ i potrzebujesz [AMOUNT2]L$ dodatkowo.
- </string>
- <string name="balance_left">
- Po zakupie zostanie Ci [AMOUNT]L$.
- </string>
- <string name="balance_needed">
- Musisz dokupić [AMOUNT]L$ żeby kupić tą Posiadłość.
- </string>
- <string name="no_parcel_selected">
- (Posiadłość nie wybrana)
- </string>
- <string name="buy_currency">
- Kup [LINDENS]L$ za około [USD]US$
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_buy_object.xml b/indra/newview/skins/default/xui/pl/floater_buy_object.xml
index bad7982228..7958ed76a1 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/pl/floater_buy_object.xml
@@ -1,13 +1,13 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="contents" title="KUP KOPIĘ OBIEKTU">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="contents" title="KUP KOPIĘ">
<text name="contents_text">
- i jej zawartość:
+ i jej zawartość
</text>
<text name="buy_text">
Kupić za [AMOUNT]L$ od [NAME]?
</text>
- <button label="Anuluj" label_selected="Anuluj" name="cancel_btn" />
- <button label="Kup" label_selected="Kup" name="buy_btn" />
+ <button label="Anuluj" label_selected="Anuluj" name="cancel_btn"/>
+ <button label="Kup" label_selected="Kup" name="buy_btn"/>
<string name="title_buy_text">
Kup
</string>
diff --git a/indra/newview/skins/default/xui/pl/floater_camera.xml b/indra/newview/skins/default/xui/pl/floater_camera.xml
index 5957018144..aec75f026f 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_camera.xml
+++ b/indra/newview/skins/default/xui/pl/floater_camera.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="camera_floater" title="">
<floater.string name="rotate_tooltip">
Obracaj kamerę wokół obiektu
@@ -9,8 +9,35 @@
<floater.string name="move_tooltip">
Poruszaj kamerą w dół/górę oraz w prawo/lewo
</floater.string>
+ <floater.string name="orbit_mode_title">
+ Obracaj
+ </floater.string>
+ <floater.string name="pan_mode_title">
+ W prawo lub w lewo
+ </floater.string>
+ <floater.string name="avatar_view_mode_title">
+ Ustawienia
+ </floater.string>
+ <floater.string name="free_mode_title">
+ Zobacz obiekt
+ </floater.string>
<panel name="controls">
- <joystick_track name="cam_track_stick" tool_tip="Poruszaj kamerą w dół/górę oraz w prawo/lewo"/>
- <joystick_zoom name="zoom" tool_tip="Najedź kamerą w kierunku obiektu"/>
+ <joystick_track name="cam_track_stick" tool_tip="Poruszaj kamerą w górę, w dół, w lewo i w prawo"/>
+ <panel name="zoom" tool_tip="Najedź kamerą w kierunku obiektu">
+ <slider_bar name="zoom_slider" tool_tip="Przybliż kamerę do ogniskowej"/>
+ </panel>
+ <joystick_rotate name="cam_rotate_stick" tool_tip="Obracaj kamerę wokoł osi"/>
+ <panel name="camera_presets">
+ <button name="rear_view" tool_tip="Widok z tyłu"/>
+ <button name="group_view" tool_tip="PodglÄ…d Grupy"/>
+ <button name="front_view" tool_tip="Widok z przodu"/>
+ <button name="mouselook_view" tool_tip="Widok panoramiczny"/>
+ </panel>
+ </panel>
+ <panel name="buttons">
+ <button label="" name="orbit_btn" tool_tip="Obracaj kamerÄ™"/>
+ <button label="" name="pan_btn" tool_tip="Kamera horyzontalna"/>
+ <button label="" name="avatarview_btn" tool_tip="Ustawienia"/>
+ <button label="" name="freecamera_btn" tool_tip="PodglÄ…d obiektu"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_choose_group.xml b/indra/newview/skins/default/xui/pl/floater_choose_group.xml
index 72b6617094..877cedc0bc 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_choose_group.xml
+++ b/indra/newview/skins/default/xui/pl/floater_choose_group.xml
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="groups" title="GRUPY">
<text name="groupdesc">
- Wybierz grupÄ™:
+ Wybierz GrupÄ™:
</text>
- <button label="OK" label_selected="OK" name="OK" />
- <button label="Anuluj" label_selected="Anuluj" name="Cancel" />
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="Anuluj" label_selected="Anuluj" name="Cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_color_picker.xml b/indra/newview/skins/default/xui/pl/floater_color_picker.xml
index 904a2cc270..a607ca982f 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/pl/floater_color_picker.xml
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="ColorPicker" title="WYBÓR KOLORU">
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="ColorPicker" title="WYBIERZ KOLOR">
<text name="r_val_text">
Czerwony:
</text>
@@ -18,14 +18,14 @@
<text name="l_val_text">
Luminacja:
</text>
- <check_box label="Zastosuj od razu" name="apply_immediate" />
- <button label="" label_selected="" name="color_pipette" />
- <button label="Anuluj" label_selected="Anuluj" name="cancel_btn" />
- <button label="Wybierz" label_selected="Wybierz" name="select_btn" />
+ <check_box label="Zastosuj teraz" name="apply_immediate"/>
+ <button label="" label_selected="" name="color_pipette"/>
+ <button label="Anuluj" label_selected="Anuluj" name="cancel_btn"/>
+ <button label="OK" label_selected="OK" name="select_btn"/>
<text name="Current color:">
- Obecny Kolor:
+ Obecny kolor:
</text>
<text name="(Drag below to save.)">
- (PrzeciÄ…gnij tutaj)
+ (Przeciągnij tutaj aby zapisać)
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_critical.xml b/indra/newview/skins/default/xui/pl/floater_critical.xml
index 8221a4e1bd..8221a4e1bd 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_critical.xml
+++ b/indra/newview/skins/default/xui/pl/floater_critical.xml
diff --git a/indra/newview/skins/default/xui/pl/floater_customize.xml b/indra/newview/skins/default/xui/pl/floater_customize.xml
index 0c01d15faf..dd1d5cf684 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_customize.xml
+++ b/indra/newview/skins/default/xui/pl/floater_customize.xml
@@ -1,7 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater customize" title="WYGLĄD">
<tab_container name="customize tab container">
- <placeholder label="Części Ciała" name="body_parts_placeholder"/>
+ <text label="Części Ciała" name="body_parts_placeholder">
+ Części ciała
+ </text>
<panel label="Kształt" name="Shape">
<button label="Wróć" label_selected="Wróć" name="Revert"/>
<button label="Ciało" label_selected="Ciało" name="Body"/>
@@ -14,8 +16,8 @@
<button label="Tułów" label_selected="Tułów" name="Torso"/>
<button label="Nogi" label_selected="Nogi" name="Legs"/>
<radio_group name="sex radio">
- <radio_item name="radio" label="Kobieta"/>
- <radio_item name="radio2" label="Mężczyzna"/>
+ <radio_item label="Kobieta" name="radio" value="0"/>
+ <radio_item label="Mężczyzna" name="radio2" value="1"/>
</radio_group>
<text name="title">
[DESC]
@@ -33,9 +35,7 @@
Zapisane w [PATH]
</text>
<text name="not worn instructions">
- Załóż nowy kształt poprzez przeciągnięcie go ze swojej szafy
-na awatara. Alternatywnie, możesz także stworzyć własny kształt
-z plików roboczych.
+ Załóż nowy kształt poprzez przeciągnięcie go ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć własny kształt z plików roboczych.
</text>
<text name="no modify instructions">
Nie posiadasz prawa do modyfikowania tego kształtu.
@@ -43,15 +43,15 @@ z plików roboczych.
<text name="Item Action Label">
Kształt:
</text>
- <button label="Nowy Kształt" label_selected="Nowy Kształt" name="Create New"/>
+ <button label="Nowy kształt" label_selected="Nowy kształt" name="Create New"/>
<button label="Zapisz" label_selected="Zapisz" name="Save"/>
- <button label="Zapisz Jako..." label_selected="Zapisz Jako..." name="Save As"/>
+ <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/>
</panel>
<panel label="Skórka" name="Skin">
- <button label="Kolor Skórki" label_selected="Kolor Skórki" name="Skin Color"/>
- <button label="Detale Twarzy" label_selected="Detale Twarzy" name="Face Detail"/>
+ <button label="Kolor skórki" label_selected="Kolor skórki" name="Skin Color"/>
+ <button label="Detale twarzy" label_selected="Detale twarzy" name="Face Detail"/>
<button label="Makijaż" label_selected="Makijaż" name="Makeup"/>
- <button label="Detale Ciała" label_selected="Detale Ciała" name="Body Detail"/>
+ <button label="Detale ciała" label_selected="Detale ciała" name="Body Detail"/>
<text name="title">
[DESC]
</text>
@@ -68,9 +68,7 @@ z plików roboczych.
Zapisane w [PATH]
</text>
<text name="not worn instructions">
- Załóż nową skórkę poprzez przeciągnięcie jej ze swojej szafy
-na awatara. Alternatywnie, możesz także stworzyć własną skórkę
-z plików roboczych.
+ Załóż nową skórkę poprzez przeciągnięcie jej ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć własną skórkę z plików roboczych.
</text>
<text name="no modify instructions">
Nie posiadasz prawa do modyfikowania tej skórki.
@@ -78,12 +76,12 @@ z plików roboczych.
<text name="Item Action Label">
Skórka:
</text>
- <texture_picker label="Tatuaże Głowy" name="Head Tattoos" tool_tip="Kliknij by wybrać teksturę"/>
- <texture_picker label="Tatuaże Górne" name="Upper Tattoos" tool_tip="Kliknij by wybrać teksturę"/>
- <texture_picker label="Tatuaże Dolne" name="Lower Tattoos" tool_tip="Kliknij by wybrać teksturę"/>
- <button label="Nowa Skórka" label_selected="Nowa Skórka" name="Create New"/>
+ <texture_picker label="Tatuaże głowy" name="Head Tattoos" tool_tip="Kliknij by wybrać teksturę"/>
+ <texture_picker label="Tatuaże górne" name="Upper Tattoos" tool_tip="Kliknij by wybrać teksturę"/>
+ <texture_picker label="Tatuaże dolne" name="Lower Tattoos" tool_tip="Kliknij by wybrać teksturę"/>
+ <button label="Nowa skórka" label_selected="Nowa skórka" name="Create New"/>
<button label="Zapisz" label_selected="Zapisz" name="Save"/>
- <button label="Zapisz Jako..." label_selected="Zapisz Jako..." name="Save As"/>
+ <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/>
<button label="Wróć" label_selected="Wróć" name="Revert"/>
</panel>
<panel label="Włosy" name="Hair">
@@ -107,9 +105,7 @@ z plików roboczych.
Zapisane w [PATH]
</text>
<text name="not worn instructions">
- Załóż nowe włosy poprzez przeciągnięcie ich ze swojej szafy
-na awatara. Alternatywnie, możesz także stworzyć własne włosy
-z plików roboczych.
+ Załóż nowe włosy poprzez przeciągnięcie ich ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć własne włosy z plików roboczych.
</text>
<text name="no modify instructions">
Nie posiadasz prawa do modyfikowania tych włosów.
@@ -118,9 +114,9 @@ z plików roboczych.
Włosy:
</text>
<texture_picker label="Tekstura" name="Texture" tool_tip="Kliknij by wybrać teksturę"/>
- <button label="Nowe Włosy" label_selected="Nowe Włosy" name="Create New"/>
+ <button label="Nowe włosy" label_selected="Nowe włosy" name="Create New"/>
<button label="Zapisz" label_selected="Zapisz" name="Save"/>
- <button label="Zapisz Jako..." label_selected="Zapisz Jako..." name="Save As"/>
+ <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/>
<button label="Wróć" label_selected="Wróć" name="Revert"/>
</panel>
<panel label="Oczy" name="Eyes">
@@ -140,9 +136,7 @@ z plików roboczych.
Zapisane w [PATH]
</text>
<text name="not worn instructions">
- Załóż nowe oczy poprzez przeciągnięcie ich ze swojej szafy
-na awatara. Alternatywnie, możesz także stworzyć własne oczy
-z plików roboczych.
+ Załóż nowe oczy poprzez przeciągnięcie ich ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć własne oczy z plików roboczych.
</text>
<text name="no modify instructions">
Nie posiadasz prawa do modyfikowania tych oczów.
@@ -151,19 +145,21 @@ z plików roboczych.
Oczy:
</text>
<texture_picker label="Tęczówka" name="Iris" tool_tip="Kliknij by wybrać teksturę"/>
- <button label="Nowe Oczy" label_selected="Nowe Oczy" name="Create New"/>
+ <button label="Nowe oczy" label_selected="Nowe oczy" name="Create New"/>
<button label="Zapisz" label_selected="Zapisz" name="Save"/>
- <button label="Zapisz Jako..." label_selected="Zapisz Jako..." name="Save As"/>
+ <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/>
<button label="Wróć" label_selected="Wróć" name="Revert"/>
</panel>
- <panel label="Ubrania" name="clothes_placeholder"/>
+ <text label="Ubrania" name="clothes_placeholder">
+ Ubrania
+ </text>
<panel label="Koszula" name="Shirt">
<texture_picker label="Materiał" name="Fabric" tool_tip="Kliknij by wybrać teksturę"/>
- <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij by wybrać kolor"/>
- <button label="Nowa Koszula" label_selected="Nowa Koszula" name="Create New"/>
+ <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/>
<button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/>
+ <button label="Nowa Koszula" label_selected="Nowa Koszula" name="Create New"/>
<button label="Zapisz" label_selected="Zapisz" name="Save"/>
- <button label="Zapisz Jako..." label_selected="Zapisz Jako..." name="Save As"/>
+ <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/>
<button label="Wróć" label_selected="Wróć" name="Revert"/>
<text name="title">
[DESC]
@@ -181,9 +177,7 @@ z plików roboczych.
Zapisane w [PATH]
</text>
<text name="not worn instructions">
- Załóż nową koszulę poprzez przeciągnięcie jej ze swojej szafy
-na awatara. Alternatywnie, możesz także stworzyć własną koszulę
-z plików roboczych.
+ Załóż nową koszulę poprzez przeciągnięcie jej ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć własną koszulę z plików roboczych.
</text>
<text name="no modify instructions">
Nie posiadasz prawa do modyfikowania tej koszuli.
@@ -194,11 +188,11 @@ z plików roboczych.
</panel>
<panel label="Spodnie" name="Pants">
<texture_picker label="Materiał" name="Fabric" tool_tip="Kliknij tutaj by wybrać teksturę"/>
- <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij by wybrać kolor"/>
- <button label="Nowe Spodnie" label_selected="Nowe Spodnie" name="Create New"/>
+ <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/>
<button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/>
+ <button label="Nowe spodnie" label_selected="Nowe spodnie" name="Create New"/>
<button label="Zapisz" label_selected="Zapisz" name="Save"/>
- <button label="Zapisz Jako..." label_selected="Zapisz Jako..." name="Save As"/>
+ <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/>
<button label="Wróć" label_selected="Wróć" name="Revert"/>
<text name="title">
[DESC]
@@ -216,9 +210,7 @@ z plików roboczych.
Zapisane w [PATH]
</text>
<text name="not worn instructions">
- Załóż nowe spodnie poprzez przeciągnięcie ich ze swojej szafy
-na awatara. Alternatywnie, możesz także stworzyć własne spodnie
-z plików roboczych.
+ Załóż nowe spodnie poprzez przeciągnięcie ich ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć własne spodnie z plików roboczych.
</text>
<text name="no modify instructions">
Nie posiadasz prawa do modyfikowania tych spodni.
@@ -244,10 +236,9 @@ z plików roboczych.
Zapisane w [PATH]
</text>
<text name="not worn instructions">
- Załóż nowe buty poprzez przeciągnięcie ich ze swojej szafy
-na awatara. Alternatywnie, możesz także stworzyć własne buty
-z plików roboczych.
+ Załóż nowe buty poprzez przeciągnięcie ich ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć własne buty z plików roboczych.
</text>
+ <button label="Nowe Buty" label_selected="Nowe Buty" name="Create New"/>
<text name="no modify instructions">
Nie posiadasz prawa do modyfikowania tych butów.
</text>
@@ -255,11 +246,10 @@ z plików roboczych.
Buty:
</text>
<texture_picker label="Materiał" name="Fabric" tool_tip="Kliknij by wybrać teksturę"/>
- <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij by wybrać kolor"/>
- <button label="Nowe Buty" label_selected="Nowe Buty" name="Create New"/>
+ <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/>
<button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/>
<button label="Zapisz" label_selected="Zapisz" name="Save"/>
- <button label="Zapisz Jako..." label_selected="Zapisz Jako..." name="Save As"/>
+ <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/>
<button label="Wróć" label_selected="Wróć" name="Revert"/>
</panel>
<panel label="Skarpety" name="Socks">
@@ -279,10 +269,9 @@ z plików roboczych.
Zapisane w [PATH]
</text>
<text name="not worn instructions">
- Załóż nowe skarpety poprzez przeciągnięcie ich ze swojej szafy
-na awatara. Alternatywnie, możesz także stworzyć własne skarpety
-z plików roboczych.
+ Załóż nowe skarpety poprzez przeciągnięcie ich ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć własne skarpety z plików roboczych.
</text>
+ <button label="Nowe Skarpety" label_selected="Nowe Skarpety" name="Create New"/>
<text name="no modify instructions">
Nie posiadasz prawa do modyfikowania tych skarpet.
</text>
@@ -290,11 +279,10 @@ z plików roboczych.
Skarpetki:
</text>
<texture_picker label="Materiał" name="Fabric" tool_tip="Kliknij by wybrać teksturę"/>
- <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij by wybrać kolor"/>
- <button label="Nowe Skarpety" label_selected="Nowe Skarpety" name="Create New"/>
+ <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/>
<button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/>
<button label="Zapisz" label_selected="Zapisz" name="Save"/>
- <button label="Zapisz Jako..." label_selected="Zapisz Jako..." name="Save As"/>
+ <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/>
<button label="Wróć" label_selected="Wróć" name="Revert"/>
</panel>
<panel label="Kurtka" name="Jacket">
@@ -314,23 +302,21 @@ z plików roboczych.
Zapisane w [PATH]
</text>
<text name="not worn instructions">
- Załóż nową kurtkę poprzez przeciągnięcie jej ze swojej szafy
-na awatara. Alternatywnie, możesz także stworzyć własną kurtkę
-z plików roboczych.
+ Załóż nową kurtkę poprzez przeciągnięcie jej ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć własną kurtkę z plików roboczych.
</text>
+ <button label="Nowa Kurtka" label_selected="Nowa Kurtka" name="Create New"/>
<text name="no modify instructions">
Nie posiadasz prawa do modyfikowania tej kurtki.
</text>
<text name="Item Action Label">
Kurtka:
</text>
- <texture_picker label="Górny Materiał" name="Upper Fabric" tool_tip="Kliknij by wybrać teksturę" width="76"/>
- <texture_picker label="Dolny Materiał" name="Lower Fabric" tool_tip="Kliknij by wybrać kolor" width="76"/>
- <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij by wybrać kolor" width="76"/>
- <button label="Nowa Kurtka" label_selected="Nowa Kurtka" name="Create New"/>
+ <texture_picker label="Górny materiał" name="Upper Fabric" tool_tip="Kliknij by wybrać teksturę" width="76"/>
+ <texture_picker label="Dolny materiał" name="Lower Fabric" tool_tip="Kliknij by wybrać kolor" width="76"/>
+ <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor" width="76"/>
<button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/>
<button label="Zapisz" label_selected="Zapisz" name="Save"/>
- <button label="Zapisz Jako..." label_selected="Zapisz Jako..." name="Save As"/>
+ <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/>
<button label="Wróć" label_selected="Wróć" name="Revert"/>
</panel>
<panel label="Rękawiczki" name="Gloves">
@@ -350,10 +336,9 @@ z plików roboczych.
Zapisane w [PATH]
</text>
<text name="not worn instructions">
- Załóż nowe rękawiczki poprzez przeciągnięcie ich ze swojej szafy
-na awatara. Alternatywnie, możesz także stworzyć własne rękawiczki
-z plików roboczych.
+ Załóż nowe rękawiczki poprzez przeciągnięcie ich ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć własne rękawiczki z plików roboczych.
</text>
+ <button label="Nowe Rękawiczki" label_selected="Nowe Rękawiczki" name="Create New"/>
<text name="no modify instructions">
Nie posiadasz prawa do modyfikowania tych rękawiczek
</text>
@@ -361,11 +346,10 @@ z plików roboczych.
Rękawiczki:
</text>
<texture_picker label="Materiał" name="Fabric" tool_tip="Kliknij by wybrać teksturę"/>
- <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij by wybrać kolor"/>
- <button label="Nowe Rękawiczki" label_selected="Nowe Rękawiczki" name="Create New"/>
+ <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/>
<button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/>
<button label="Zapisz" label_selected="Zapisz" name="Save"/>
- <button label="Zapisz Jako..." label_selected="Zapisz Jako..." name="Save As"/>
+ <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/>
<button label="Wróć" label_selected="Wróć" name="Revert"/>
</panel>
<panel label="Podkoszulek" name="Undershirt">
@@ -385,10 +369,9 @@ z plików roboczych.
Zapisane w [PATH]
</text>
<text name="not worn instructions">
- Załóż nowy podkoszulek poprzez przeciągnięcie ich ze swojej szafy
-na awatara. Alternatywnie, możesz także stworzyć własny podkoszulek
-z plików roboczych.
+ Załóż nowy podkoszulek poprzez przeciągnięcie ich ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć własny podkoszulek z plików roboczych.
</text>
+ <button label="Nowy Podkoszulek" label_selected="Nowy Podkoszulek" name="Create New"/>
<text name="no modify instructions">
Nie posiadasz prawa do modyfikowania tego podkoszulka.
</text>
@@ -396,11 +379,10 @@ z plików roboczych.
Podkoszulka:
</text>
<texture_picker label="Materiał" name="Fabric" tool_tip="Kliknij by wybrać teksturę"/>
- <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij by wybrać kolor"/>
- <button label="Nowy Podkoszulek" label_selected="Nowy Podkoszulek" name="Create New"/>
+ <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/>
<button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/>
<button label="Zapisz" label_selected="Zapisz" name="Save"/>
- <button label="Zapisz Jako..." label_selected="Zapisz Jako..." name="Save As"/>
+ <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/>
<button label="Wróć" label_selected="Wróć" name="Revert"/>
</panel>
<panel label="Bielizna" name="Underpants">
@@ -420,10 +402,9 @@ z plików roboczych.
Zapisane w [PATH]
</text>
<text name="not worn instructions">
- Załóż nową bieliznę poprzez przeciągnięcie jej ze swojej szafy
-na awatara. Alternatywnie, możesz także stworzyć własną bieliznę
-z plików roboczych.
+ Załóż nową bieliznę poprzez przeciągnięcie jej ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć własną bieliznę z plików roboczych.
</text>
+ <button label="Nowa Bielizna" label_selected="Nowa Bielizna" name="Create New"/>
<text name="no modify instructions">
Nie posiadasz prawa do modyfikowania tej bielizny.
</text>
@@ -431,11 +412,10 @@ z plików roboczych.
Bielizna:
</text>
<texture_picker label="Materiał" name="Fabric" tool_tip="Kliknij by wybrać teksturę"/>
- <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij by wybrać kolor"/>
- <button label="Nowa Bielizna" label_selected="Nowa Bielizna" name="Create New"/>
+ <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/>
<button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/>
<button label="Zapisz" label_selected="Zapisz" name="Save"/>
- <button label="Zapisz Jako..." label_selected="Zapisz Jako..." name="Save As"/>
+ <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/>
<button label="Wróć" label_selected="Wróć" name="Revert"/>
</panel>
<panel label="Spódnica" name="Skirt">
@@ -455,10 +435,9 @@ z plików roboczych.
Zapisane w [PATH]
</text>
<text name="not worn instructions">
- Załóż nową spódnicę poprzez przeciągnięcie jej ze swojej szafy
-na awatara. Alternatywnie, możesz także stworzyć własną spódnicę
-z plików roboczych.
+ Załóż nową spódnicę poprzez przeciągnięcie jej ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć własną spódnicę z plików roboczych.
</text>
+ <button label="Nowa Spódnica" label_selected="Nowa Spódnica" name="Create New"/>
<text name="no modify instructions">
Nie posiadasz prawa do modyfikowania tej spódnicy.
</text>
@@ -466,15 +445,85 @@ z plików roboczych.
Spódnica:
</text>
<texture_picker label="Materiał" name="Fabric" tool_tip="Kliknij by wybrać teksturę"/>
- <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij by wybrać kolor"/>
- <button label="Nowa Spódnica" label_selected="Nowa Spódnica" name="Create New"/>
+ <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/>
+ <button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/>
+ <button label="Zapisz" label_selected="Zapisz" name="Save"/>
+ <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/>
+ <button label="Wróć" label_selected="Wróć" name="Revert"/>
+ </panel>
+ <panel label="Tatuaż" name="Tattoo">
+ <text name="title">
+ [DESC]
+ </text>
+ <text name="title_no_modify">
+ [DESC]: nie można modyfikować
+ </text>
+ <text name="title_loading">
+ [DESC]: ładowanie...
+ </text>
+ <text name="title_not_worn">
+ [DESC]: nienałożone
+ </text>
+ <text name="path">
+ Zapisane w [PATH]
+ </text>
+ <text name="not worn instructions">
+ Załóż nowy tatuaż poprzez przeciągnięcie go ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć własny tatuaż z plików roboczych.
+ </text>
+ <button label="Utwórz Nowy Tatuaż" label_selected="Stwórz Nowy Tatuaż" name="Create New"/>
+ <text name="no modify instructions">
+ Nie posiadasz uprawnień do modyfikowania tych ubrań/części ciała.
+ </text>
+ <text name="Item Action Label">
+ Tatuaż:
+ </text>
+ <texture_picker label="Tatuaż głowy" name="Head Tattoo" tool_tip="Kliknij aby wybrać teksturę"/>
+ <texture_picker label="Górny tatuaż" name="Upper Tattoo" tool_tip="Kliknij aby wybrać teksturę"/>
+ <texture_picker label="Tatuaż dolnej części ciała" name="Lower Tattoo" tool_tip="Kliknij aby wybrać teksturę"/>
+ <button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/>
+ <button label="Zapisz" label_selected="Zapisz" name="Save"/>
+ <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/>
+ <button label="Wróć" label_selected="Wróć" name="Revert"/>
+ </panel>
+ <panel label="Alpha" name="Alpha">
+ <text name="title">
+ [DESC]
+ </text>
+ <text name="title_no_modify">
+ [DESC]: nie można modyfikować
+ </text>
+ <text name="title_loading">
+ [DESC]: ładowanie...
+ </text>
+ <text name="title_not_worn">
+ [DESC]: nienałożone
+ </text>
+ <text name="path">
+ Zapisane w [PATH]
+ </text>
+ <text name="not worn instructions">
+ Załóż nową maskę alpha poprzez przeciągnięcie jej ze swojej szafy na awatara. Alternatywnie, możesz także stworzyć własną z plików roboczych.
+ </text>
+ <button label="Stwórz nową Alpha" label_selected="Utwórz Nową Alpha" name="Create New"/>
+ <text name="no modify instructions">
+ Nie posiadasz uprawnień do modyfikowania tych ubrań/części ciała.
+ </text>
+ <text name="Item Action Label">
+ Alpha:
+ </text>
+ <texture_picker label="Dolna Alpha" name="Lower Alpha" tool_tip="Kliknij aby wybrać teksturę"/>
+ <texture_picker label="Alpha górnej części ciała" name="Upper Alpha" tool_tip="Kliknij aby wybrać teksturę"/>
+ <texture_picker label="Alpha głowy" name="Head Alpha" tool_tip="Kliknij aby wybrać teksturę"/>
+ <texture_picker label="Alpha oka" name="Eye Alpha" tool_tip="Kliknij aby wybrać teksturę"/>
+ <texture_picker label="Alpha włosów" name="Hair Alpha" tool_tip="Kliknij aby wybrać teksturę"/>
<button label="Zdejmij" label_selected="Zdejmij" name="Take Off"/>
<button label="Zapisz" label_selected="Zapisz" name="Save"/>
- <button label="Zapisz Jako..." label_selected="Zapisz Jako..." name="Save As"/>
+ <button label="Zapisz jako..." label_selected="Zapisz jako..." name="Save As"/>
<button label="Wróć" label_selected="Wróć" name="Revert"/>
</panel>
</tab_container>
+ <button label="Info o skrypcie" label_selected="Info o skrypcie" name="script_info" tool_tip="Pokaż skrypty przyłączone do Twojego awatara"/>
+ <button label="Stwórz ubranie" label_selected="Stwórz Ubranie" name="make_outfit_btn"/>
<button label="Anuluj" label_selected="Anuluj" name="Cancel"/>
<button label="OK" label_selected="OK" name="Ok"/>
- <button label="Stwórz Ubranie..." label_selected="Stwórz Ubranie..." name="Make Outfit" width="115"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml
index 6671bb853e..0cb2114f99 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml
+++ b/indra/newview/skins/default/xui/pl/floater_day_cycle_options.xml
@@ -62,7 +62,7 @@
<button label="Dodaj" label_selected="Dodaj" name="WLAddKey" />
<button label="Usuń" label_selected="Usuń" name="WLDeleteKey" />
<text name="WLCurKeyFrameText">
- Preferencje Czasu:
+ Preferencje czasu:
</text>
<text name="WLCurKeyTimeText">
Czas:
@@ -78,7 +78,7 @@
</text>
<combo_box label="5 min" name="WLSnapOptions" />
<text name="DayCycleText2">
- Długość Cyklu:
+ Długość cyklu:
</text>
<spinner label="Godz" name="WLLengthOfDayHour" />
<spinner label="Min" name="WLLengthOfDayMin" />
@@ -88,11 +88,11 @@
</text>
<button label="Start" label_selected="Start" name="WLAnimSky" />
<button label="Stop" label_selected="Stop" name="WLStopAnimSky" />
- <button label="Używaj Czasu Regionu" label_selected="Używaj Czasu Regionu"
+ <button label="Używaj czasu regionu" label_selected="Używaj czasu regionu"
name="WLUseLindenTime" />
- <button label="Zapisz Test Dnia" label_selected="Zapisz Test Dnia"
+ <button label="Zapisz test dnia" label_selected="Zapisz test dnia"
name="WLSaveDayCycle" />
- <button label="Załaduj Test Dnia" label_selected="Załaduj Test Dnia"
+ <button label="Załaduj test dnia" label_selected="Załaduj test dnia"
name="WLLoadDayCycle" />
</panel>
</tab_container>
diff --git a/indra/newview/skins/default/xui/pl/floater_device_settings.xml b/indra/newview/skins/default/xui/pl/floater_device_settings.xml
index e79478731d..c485fb2e29 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_device_settings.xml
+++ b/indra/newview/skins/default/xui/pl/floater_device_settings.xml
@@ -1,3 +1,2 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_device_settings"
- title="USTAWIENIA URZÄ„DZEŃ KOMUNIKACJI GÅOSOWEJ" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_device_settings" title="USTAWIENIA URZÄ„DZEŃ KOMUNIKACJI GÅOSOWEJ"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_env_settings.xml b/indra/newview/skins/default/xui/pl/floater_env_settings.xml
index e197d94b27..3ab854fbbb 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_env_settings.xml
+++ b/indra/newview/skins/default/xui/pl/floater_env_settings.xml
@@ -1,26 +1,28 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Environment Editor Floater" title="EDYTOR ÅšRODOWISKA">
+ <floater.string name="timeStr">
+ [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
+ </floater.string>
<text name="EnvTimeText">
Czas
</text>
<text name="EnvTimeText2">
12:00 PM
</text>
- <slider label="" name="EnvTimeSlider" />
+ <slider label="" name="EnvTimeSlider"/>
<text name="EnvCloudText">
Chmury:
</text>
- <slider label="" name="EnvCloudSlider" />
+ <slider label="" name="EnvCloudSlider"/>
<text name="EnvWaterColorText">
- Kolor Wody
+ Kolor wody
</text>
- <color_swatch label="" name="EnvWaterColor" tool_tip="Kliknij by wybrać kolor" />
+ <color_swatch label="" name="EnvWaterColor" tool_tip="Kliknij aby wybrać kolor"/>
<text name="EnvWaterFogText">
Zamglenie:
</text>
- <slider label="" name="EnvWaterFogSlider" />
- <button label="Używaj Czasu Regionu" name="EnvUseEstateTimeButton" />
- <button label="Zaawansowane Niebo" name="EnvAdvancedSkyButton" />
- <button label="Zaawansowana Woda" name="EnvAdvancedWaterButton" />
- <button label="?" name="EnvSettingsHelpButton" />
+ <slider label="" name="EnvWaterFogSlider"/>
+ <button label="Używaj czasu regionu" name="EnvUseEstateTimeButton"/>
+ <button label="Zaawansowane niebo" name="EnvAdvancedSkyButton"/>
+ <button label="Zaawansowana woda" name="EnvAdvancedWaterButton"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_event.xml b/indra/newview/skins/default/xui/pl/floater_event.xml
new file mode 100644
index 0000000000..7588493464
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_event.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="IMPREZA" name="Event" title="IMPREZA">
+ <floater.string name="none">
+ żadne
+ </floater.string>
+ <floater.string name="notify">
+ Zawiadom
+ </floater.string>
+ <floater.string name="dont_notify">
+ Nie zawiadamiaj
+ </floater.string>
+ <floater.string name="moderate">
+ Mature
+ </floater.string>
+ <floater.string name="adult">
+ Adult
+ </floater.string>
+ <floater.string name="general">
+ PG
+ </floater.string>
+ <floater.string name="unknown">
+ Nieznana
+ </floater.string>
+ <layout_stack name="layout">
+ <layout_panel name="profile_stack">
+ <text name="event_name">
+ Brak nazwy dla wydarzenia.
+ </text>
+ <text name="event_category">
+ (bez kategorii)
+ </text>
+ <text name="event_runby_label">
+ Prowadzona przez:
+ </text>
+ <text initial_value="(przetwarzanie)" name="event_runby"/>
+ <text name="event_date_label">
+ Data:
+ </text>
+ <text name="event_date">
+ 10/10/2010
+ </text>
+ <text name="event_duration_label">
+ Długość:
+ </text>
+ <text name="event_duration">
+ 1 godzina
+ </text>
+ <text name="event_covercharge_label">
+ Opłata:
+ </text>
+ <text name="event_cover">
+ Bez opłaty
+ </text>
+ <text name="event_location_label">
+ Lokalizacja:
+ </text>
+ <text name="event_location" value="SampleParcel, Name Long (145, 228, 26)"/>
+ <text name="rating_label" value="Rodzaj:"/>
+ <text name="rating_value" value="nieznane"/>
+ <expandable_text name="event_desc">
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ </expandable_text>
+ </layout_panel>
+ <layout_panel name="button_panel">
+ <button name="create_event_btn" tool_tip="Stwórz Imprezę"/>
+ <button name="god_delete_event_btn" tool_tip="Skasuj ImprezÄ™"/>
+ <button label="Zawiadom mnie" name="notify_btn"/>
+ <button label="Teleportuj" name="teleport_btn"/>
+ <button label="Mapa" name="map_btn"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_gesture.xml b/indra/newview/skins/default/xui/pl/floater_gesture.xml
index 4685eb6afe..750a9e4a66 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_gesture.xml
+++ b/indra/newview/skins/default/xui/pl/floater_gesture.xml
@@ -1,16 +1,27 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="gestures" title="AKTYWNE GESTY">
- <text name="help_label">
- Kliknij podwójnie by aktywować głos i animację gestu.
- </text>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="Miejsca" name="gestures" title="GESTY">
+ <floater.string name="loading">
+ Åadowanie...
+ </floater.string>
+ <floater.string name="playing">
+ (Odtwarzanie)
+ </floater.string>
+ <floater.string name="copy_name">
+ Kopia [COPY_NAME]
+ </floater.string>
<scroll_list name="gesture_list">
- <column label="Aktywuj" name="trigger" />
- <column label="Klucz" name="shortcut" />
- <column label="" name="key" />
- <column label="Nazwa" name="name" />
+ <scroll_list.columns label="Nazwa" name="name"/>
+ <scroll_list.columns label="Czat" name="trigger"/>
+ <scroll_list.columns label="" name="key"/>
+ <scroll_list.columns label="Klucz" name="shortcut"/>
</scroll_list>
- <button label="Nowy" name="new_gesture_btn" />
- <button label="Edytuj" name="edit_btn" />
- <button label="Odtwarzaj" name="play_btn" />
- <button label="Zatrzymaj" name="stop_btn" />
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="gear_btn" tool_tip="Więcej opcji"/>
+ <button name="new_gesture_btn" tool_tip="Stwórz nową gesturę"/>
+ <button name="activate_btn" tool_tip="Aktywuj/Dezaktywuj wybrany gest"/>
+ <button name="del_btn" tool_tip="Usuń gest"/>
+ </panel>
+ <button label="Edytuj" name="edit_btn"/>
+ <button label="Odtwarzaj" name="play_btn"/>
+ <button label="Zatrzymaj" name="stop_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_god_tools.xml b/indra/newview/skins/default/xui/pl/floater_god_tools.xml
index a3ccffac03..4d49c32fc1 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/pl/floater_god_tools.xml
@@ -2,26 +2,25 @@
<floater name="godtools floater" title="BOSKIE NARZĘDZIA">
<tab_container name="GodTools Tabs">
<panel label="Grid" name="grid">
- <button width="205" label="Usuń wszystkich użytkowników" label_selected="Usuń wszystkich użytkowników" name="Kick all users"/>
- <button width="285" label="Wyrównaj Widoczność Buforu Mapy Regionu" label_selected="Wyrównaj Widoczność Buforu Mapy Regionu" name="Flush This Region&apos;s Map Visibility Caches"/>
+ <button label="Wyrzuć wszystkich Rezydentów" label_selected="Wyrzuć wszystkich Rezydentów" name="Kick all users" width="205"/>
+ <button label="Wyrównaj widoczność buforu mapy Regionu" label_selected="Wyrównaj widoczność buforu mapy Regionu" name="Flush This Region&apos;s Map Visibility Caches" width="285"/>
</panel>
<panel label="Region" name="region">
<text name="Sim Name:" width="100">
Nazwa Symulatora:
</text>
- <line_editor left="115" name="region name" width="178" />
- <line_editor name="region name"/>
- <check_box label="Wstęp" name="check prelude" />
+ <line_editor left="115" name="region name" width="178"/>
+ <check_box label="Wstęp" name="check prelude" tool_tip="Set this to make the region a prelude"/>
<check_box label="Korekta Słońca" name="check fixed sun" tool_tip="Skorektuj ustawienia pozycji słońca."/>
- <check_box height="32" label="Zresetuj PozycjÄ™ &#10;Miejsca Startowego" name="check reset home" />
- <check_box bottom_delta="-32" label="Widoczny" name="check visible" tool_tip="Wybierz tę opcję by ustawić region widocznym dla wszystkich."/>
+ <check_box height="32" label="Zresetuj pozycję Miejsca Startowego" name="check reset home" tool_tip="Zresetuj miejsce startu Rezydentów po teleportacji"/>
+ <check_box bottom_delta="-32" label="Widoczny" name="check visible" tool_tip="Wybierz tą opcję by ustawić region widocznym dla wszystkich."/>
<check_box label="Zniszczenia" name="check damage" tool_tip="Wybierz tę opcję by uruchomić opcję zniszczeń w regionie."/>
- <check_box label="Zablokuj Monitorowanie Trafficu" name="block dwell" tool_tip="Wybierz tę opcję by zablokować monitorowanie trafficu w regionie."/>
- <check_box label="Zablokuj Terraformowanie" name="block terraform" tool_tip="Wybierz tę opcję by zablokować terraforming w regionie"/>
- <check_box label="Piaskownica" name="is sandbox" />
- <button width="138" label="Ustal Teren" label_selected="Ustal Teren" name="Bake Terrain" tool_tip="Zapamiętaj obecny teren jako początkowy dla cofnięcia modyfikacji terenu."/>
- <button width="138" label="Cofnięcie Modyfikacji" label_selected="Cofnięcie Modyfikacji" name="Revert Terrain" tool_tip="Przywróć Ustawienia Domyślne Regionu."/>
- <button width="138" label="Zamień Teren" label_selected="Zamień Teren" name="Swap Terrain" />
+ <check_box label="Zablokuj Monitorowanie Trafficu" name="block dwell" tool_tip="Wybierz tą opcję by zablokować monitorowanie trafficu w regionie."/>
+ <check_box label="Zablokuj Terraformowanie" name="block terraform" tool_tip="Wybierz tą opcję by zablokować terraforming w regionie"/>
+ <check_box label="Piaskownica" name="is sandbox" tool_tip="Toggle whether this is a sandbox region"/>
+ <button label="Ustal teren" label_selected="Ustal teren" name="Bake Terrain" tool_tip="Zapamiętaj obecny teren jako początkowy dla cofnięcia modyfikacji terenu." width="138"/>
+ <button label="Cofnięcie modyfikacji" label_selected="Cofnięcie modyfikacji" name="Revert Terrain" tool_tip="Przywróć ustawienia domyślne Regionu." width="138"/>
+ <button label="Zamień teren" label_selected="Zamień teren" name="Swap Terrain" tool_tip="Swap current terrain with default" width="138"/>
<text name="estate id">
ID Regionu:
</text>
@@ -33,46 +32,46 @@
<text name="Grid Pos: ">
Pozycje Gridu:
</text>
- <line_editor name="gridposx" tool_tip="Pozycja x gridu dla regionu" left_delta="110" width="35" />
- <line_editor name="gridposy" tool_tip="Pozycja y gridu dla regionu" left_delta="45" width="35" />
+ <line_editor left_delta="110" name="gridposx" tool_tip="Pozycja x gridu dla regionu" width="35"/>
+ <line_editor left_delta="45" name="gridposy" tool_tip="Pozycja y gridu dla regionu" width="35"/>
<text name="Redirect to Grid: ">
Przełącz do gridu:
</text>
- <line_editor left_delta="110" name="redirectx" width="35" />
- <line_editor left_delta="45" name="redirecty" width="35" />
- <spinner name="billable factor"/>
+ <line_editor left_delta="110" name="redirectx" width="35"/>
+ <line_editor left_delta="45" name="redirecty" width="35"/>
<text name="billable factor text">
- Czynnik Płatności:
+ Czynnik płatności:
</text>
- <spinner name="land cost"/>
+ <spinner name="billable factor"/>
<text name="land cost text">
L$/m²:
</text>
- <button label="Odśwież" label_selected="Odśwież" name="Refresh" />
- <button label="Zastosuj" label_selected="Zastosuj" name="Apply" />
- <button width="150" left="156" label="Wybierz Region" label_selected="Wybierz Region" name="Select Region" tool_tip="Wybierz cały region za pomocą narzędzi edycji terenu"/>
- <button width="150" left="156" label="Automatyczne Zapisanie" label_selected="Automatyczne Zapisanie" name="Autosave now" />
+ <spinner name="land cost"/>
+ <button label="Odśwież" label_selected="Odśwież" name="Refresh" tool_tip="Click here to refresh the above information"/>
+ <button label="Zastosuj" label_selected="Zastosuj" name="Apply" tool_tip="Click here to apply any changes from above"/>
+ <button label="Wybierz Region" label_selected="Wybierz Region" left="156" name="Select Region" tool_tip="Wybierz cały Region za pomocą narzędzi edycji terenu" width="150"/>
+ <button label="Automatyczne zapisanie" label_selected="Automatyczne zapisanie" left="156" name="Autosave now" tool_tip="Save gzipped state to autosave directory" width="150"/>
</panel>
<panel label="Obiekty" name="objects">
<text name="Sim Name:" width="105">
Nazwa Symulatora:
</text>
- <text name="region name" left_delta="110">
+ <text left_delta="110" name="region name">
Welsh
</text>
- <check_box label="Wyłącz Skrypty" name="disable scripts" />
- <check_box label="Deaktywuj Kolizje" name="disable collisions" />
- <check_box label="WylÄ…cz FizykÄ™" name="disable physics" />
- <button label="Zastosuj" label_selected="Zastosuj" name="Apply" />
- <button label="Ustaw Cel" label_selected="Set Target" name="Set Target" />
+ <check_box label="Wyłącz skrypty" name="disable scripts" tool_tip="Set this to disable all scripts in this region"/>
+ <check_box label="Deaktywuj kolizje" name="disable collisions" tool_tip="Set this to disable non-agent collisions in this region"/>
+ <check_box label="WylÄ…cz fizykÄ™" name="disable physics" tool_tip="Set this to disable all physics in this region"/>
+ <button label="Zastosuj" label_selected="Zastosuj" name="Apply" tool_tip="Click here to apply any changes from above"/>
+ <button label="Ustaw Cel" label_selected="Set Target" name="Set Target" tool_tip="Set the target avatar for object deletion"/>
<text name="target_avatar_name">
(brak)
</text>
- <button label="Usuń cel z oskryptowanych obiektów na innych posiadłościach" label_selected="Usuń cel &apos;s skryptowane obiekty na innych posiadłościach" name="Delete Target&apos;s Scripted Objects On Others Land" />
- <button label="Usuń cel z oskryptowanych obiektów na jakichkolwiek posiadłościach" label_selected="Usuń cel &apos;s skryptowane obiekty na jakichkolwiek posiadłościach" name="Delete Target&apos;s Scripted Objects On *Any* Land" />
- <button label="Usuń wszystkie cele i obiekty" label_selected="Usuń wszystkie cele i obiekty" name="Delete *ALL* Of Target&apos;s Objects" />
- <button label="Główne Kolizje" label_selected="Główne Kolizje" name="Get Top Colliders" />
- <button label="Główne Skrypty" label_selected="Główne Skrypty" name="Get Top Scripts" />
+ <button label="Usuń cel z oskryptowanych obiektów na innych posiadłościach" label_selected="Usuń cel &apos;s skryptowane obiekty na innych posiadłościach" name="Delete Target&apos;s Scripted Objects On Others Land" tool_tip="Delete all scripted objects owned by the target on land not owned by the target. (no copy) objects will be returned."/>
+ <button label="Usuń cel z oskryptowanych obiektów na jakichkolwiek posiadłościach" label_selected="Usuń cel &apos;s skryptowane obiekty na jakichkolwiek posiadłościach" name="Delete Target&apos;s Scripted Objects On *Any* Land" tool_tip="Delete all scripted objects owned by the target in this region. (no copy) objects will be returned."/>
+ <button label="Usuń wszystkie cele i obiekty" label_selected="Usuń wszystkie cele i obiekty" name="Delete *ALL* Of Target&apos;s Objects" tool_tip="Delete all objects owned by the target in this region. (no copy) objects will be returned."/>
+ <button label="Główne kolizje" label_selected="Główne kolizje" name="Get Top Colliders" tool_tip="Gets list of objects experiencing the most narrowphase callbacks"/>
+ <button label="Główne skrypty" label_selected="Główne skrypty" name="Get Top Scripts" tool_tip="Gets list of objects spending the most time running scripts"/>
<button label="Treść skryptów" label_selected="Treść skryptów" name="Scripts digest" tool_tip="Wyświetla listę wszystkich skryptów i liczbę ich zastosowań."/>
</panel>
<panel label="Zażądaj" name="request">
@@ -80,17 +79,17 @@
Cel:
</text>
<combo_box name="destination">
- <combo_box.item name="item1" label="Selekcja" />
- <combo_box.item name="item2" label="Agent Regionu" />
+ <combo_box.item label="Selekcja" name="item1"/>
+ <combo_box.item label="Agent Regionu" name="item2"/>
</combo_box>
<text name="Request:">
Żądanie:
</text>
<combo_box name="request">
- <combo_box.item name="item1" label="kolidery &lt;kroki&gt;" />
- <combo_box.item name="item2" label="skrypty &lt;policz&gt;,&lt;opcjonalnie powtórzenie&gt;" />
- <combo_box.item name="item3" label="obiekty &lt;powtórzenia&gt;" />
- <combo_box.item name="item4" label="rez &lt;asset_id&gt;" />
+ <combo_box.item label="kolidery &lt;kroki&gt;" name="item1"/>
+ <combo_box.item label="skrypty &lt;policz&gt;,&lt;opcjonalnie powtórzenie&gt;" name="item2"/>
+ <combo_box.item label="obiekty &lt;powtórzenia&gt;" name="item3"/>
+ <combo_box.item label="rez &lt;asset_id&gt;" name="item4"/>
</combo_box>
<text name="Parameter:">
Parameter:
diff --git a/indra/newview/skins/default/xui/pl/floater_hardware_settings.xml b/indra/newview/skins/default/xui/pl/floater_hardware_settings.xml
index 39695a67b6..bd5dd7e7d2 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/pl/floater_hardware_settings.xml
@@ -1,28 +1,28 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Hardware Settings Floater" title="USTAWIENIA SPRZĘTOWE">
<text name="Filtering:">
Filtrowanie:
</text>
- <check_box label="Filtrowanie Anizotropowe" name="ani" />
+ <check_box label="Filtr anizotropowy" name="ani"/>
<text name="Antialiasing:">
- Antialiasing:
+ Antyaliasing:
</text>
<combo_box label="Antialiasing" name="fsaa" width="84">
- <combo_box.item name="FSAADisabled" label="Wyłączone" />
- <combo_box.item name="2x" label="2x" />
- <combo_box.item name="4x" label="4x" />
- <combo_box.item name="8x" label="8x" />
- <combo_box.item name="16x" label="16x" />
+ <combo_box.item label="Wyłączone" name="FSAADisabled"/>
+ <combo_box.item label="2x" name="2x"/>
+ <combo_box.item label="4x" name="4x"/>
+ <combo_box.item label="8x" name="8x"/>
+ <combo_box.item label="16x" name="16x"/>
</combo_box>
- <spinner label="Gamma:" name="gamma" />
+ <spinner label="Gamma:" name="gamma"/>
<text name="(brightness, lower is brighter)">
- (jaskrawość, mniej jest jaśniej, 0=domyślny)
+ (0=domyślna jaskrawość, niższa wartość=jaśniej)
</text>
<text name="Enable VBO:">
Włącz VBO:
</text>
- <check_box label="Włącz Bufor Vertexów OpenGL" name="vbo" tool_tip="" />
- <slider label="Pamięć Tekstur (MB):" name="GrapicsCardTextureMemory" tool_tip="" />
- <spinner label="Stosunek Dystansu Mgły:" name="fog" />
- <button label="OK" label_selected="OK" name="OK" />
+ <check_box initial_value="true" label="Włącz rozszerzenie OpenGL" name="vbo" tool_tip=""/>
+ <slider label="Pamięć na tekstury (MB):" name="GraphicsCardTextureMemory" tool_tip="Ilość alokacji pamięci dla tekstur. Domyślne dla karty pamięci video. Obniżenie poziomu tych funkcji może polepszyć wydajność systemową jednak spowoduje zmniejszenie jakości i wyrazistości tekstur."/>
+ <spinner label="Stosunek dystansu mgły:" name="fog"/>
+ <button label="OK" label_selected="OK" name="OK"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_help_browser.xml b/indra/newview/skins/default/xui/pl/floater_help_browser.xml
new file mode 100644
index 0000000000..dfd5f907e5
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_help_browser.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_help_browser" title="PRZEGLĄDARKA POMOCY">
+ <floater.string name="loading_text">
+ Åadowanie...
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="external_controls"/>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_hud.xml b/indra/newview/skins/default/xui/pl/floater_hud.xml
index ff2d702132..a5d85aca4e 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_hud.xml
+++ b/indra/newview/skins/default/xui/pl/floater_hud.xml
@@ -1,2 +1,2 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="floater_hud" title="SAMOUCZEK" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_hud" title="SAMOUCZEK"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_im.xml b/indra/newview/skins/default/xui/pl/floater_im.xml
index 67c9d13496..e40935ccb7 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_im.xml
+++ b/indra/newview/skins/default/xui/pl/floater_im.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<multi_floater name="im_floater" title="Wiadomość (IM)">
<string name="only_user_message">
- JesteÅ› jedynÄ… osobÄ… w tej konferencji.
+ JesteÅ› jedynym uczestnikiem tej konferencji.
</string>
<string name="offline_message">
[FIRST] [LAST] - ta osoba jest obecnie niedostępna.
@@ -10,7 +10,7 @@
Kliknij na [BUTTON NAME] przycisk by zaakceptować/dołączyć do tej rozmowy.
</string>
<string name="muted_message">
- Ten Rezydent jest przez Ciebie wyciszony. Wysyłanie wiadomości automatycznie wyłączy tryb wyciszenia.
+ Zablokowałeś tego Rezydenta. Wysłanie wiadomości automatycznie odblokuje go.
</string>
<string name="generic_request_error">
Błąd. Spróbuj ponownie za kilka minut.
@@ -31,7 +31,7 @@
Moderator wyciszył Cię.
</string>
<string name="add_session_event">
- Nie można dodać nikogo do czatu z [RECIPIENT].
+ Niemożliwość dodania Rezydentów do tej konferencji z [RECIPIENT].
</string>
<string name="message_session_event">
Nie można wysłać Twojej wiadomości do sesji czatu z [RECIPIENT].
diff --git a/indra/newview/skins/default/xui/pl/floater_im_container.xml b/indra/newview/skins/default/xui/pl/floater_im_container.xml
new file mode 100644
index 0000000000..ddf0790fa8
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_im_container.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<multi_floater name="floater_im_box" title="ROZMOWY"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_im_session.xml b/indra/newview/skins/default/xui/pl/floater_im_session.xml
new file mode 100644
index 0000000000..db513f787c
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_im_session.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="panel_im">
+ <layout_stack name="im_panels">
+ <layout_panel label="Panel kontroli wiadomości prywatnej (IM)" name="panel_im_control_panel"/>
+ <layout_panel>
+ <line_editor label="Do" name="chat_editor"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_image_preview.xml b/indra/newview/skins/default/xui/pl/floater_image_preview.xml
index 27f898a66b..a27e8ffed3 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/pl/floater_image_preview.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Image Preview" title="">
<text name="name_label">
Nazwa:
@@ -10,23 +10,23 @@
Wyświetl obraz jako:
</text>
<combo_box label="Rodzaj Ubrania" name="clothing_type_combo">
- <combo_box.item name="Image" label="Obraz" />
- <combo_box.item name="Hair" label="Włosy" />
- <combo_box.item name="FemaleHead" label="Damska Głowa" />
- <combo_box.item name="FemaleUpperBody" label="Damska Górna Część Ciała" />
- <combo_box.item name="FemaleLowerBody" label="Damska Górna Część Ciała" />
- <combo_box.item name="MaleHead" label="Męska Głowa" />
- <combo_box.item name="MaleUpperBody" label="Męska Górna Część Ciała" />
- <combo_box.item name="MaleLowerBody" label="Męska Dolna Część Ciała" />
- <combo_box.item name="Skirt" label="Spódnica" />
- <combo_box.item name="SculptedPrim" label="Sculpt" />
+ <combo_box.item label="Obraz" name="Image"/>
+ <combo_box.item label="Włosy" name="Hair"/>
+ <combo_box.item label="Damska głowa" name="FemaleHead"/>
+ <combo_box.item label="Damska górna część ciała" name="FemaleUpperBody"/>
+ <combo_box.item label="Damska górna część ciała" name="FemaleLowerBody"/>
+ <combo_box.item label="Męska głowa" name="MaleHead"/>
+ <combo_box.item label="Męska górna część ciała" name="MaleUpperBody"/>
+ <combo_box.item label="Męska dolna część ciała" name="MaleLowerBody"/>
+ <combo_box.item label="Spódnica" name="Skirt"/>
+ <combo_box.item label="Prim sculptowy" name="SculptedPrim"/>
</combo_box>
<text name="bad_image_text">
Nie można wczytać obrazu.
Spróbuj zapisać obraz jako 24 bitową Targa (.tga).
</text>
- <check_box label="Użyj kompresji bez strat" name="lossless_check" />
- <button label="Anuluj" name="cancel_btn" />
- <button label="Załaduj ([AMOUNT]L$)" name="ok_btn" />
+ <check_box label="Użyj kompresji bez strat" name="lossless_check"/>
+ <button label="Anuluj" name="cancel_btn"/>
+ <button label="Załaduj ([AMOUNT]L$)" name="ok_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_incoming_call.xml b/indra/newview/skins/default/xui/pl/floater_incoming_call.xml
new file mode 100644
index 0000000000..e5ec3804ae
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_incoming_call.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="incoming call" title="DZWONI NIEZNANA OSOBA">
+ <floater.string name="lifetime">
+ 5
+ </floater.string>
+ <floater.string name="localchat">
+ Rozmowy głosowe w pobliżu
+ </floater.string>
+ <floater.string name="anonymous">
+ anonimowy
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ dzwoni.
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ rozpoczął rozmowę głosową w czacie konferencji.
+ </floater.string>
+ <floater.string name="VoiceInviteGroup">
+ zaczyna rozmowÄ™ z grupÄ… [GROUP].
+ </floater.string>
+ <text name="question">
+ Czy chcesz opuścić [CURRENT_CHAT] i dołączyć do tej rozmowy głosowej?
+ </text>
+ <button label="Zaakceptuj" label_selected="Zaakceptuj" name="Accept"/>
+ <button label="Odmów" label_selected="Odmów" name="Reject"/>
+ <button label="Rozpocznij IM" name="Start IM"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_inspect.xml b/indra/newview/skins/default/xui/pl/floater_inspect.xml
index c98e0541d8..2c66f2851d 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/pl/floater_inspect.xml
@@ -1,13 +1,14 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="inspect" title="INSPEKCJA OBIEKTÓW">
+ <floater.string name="timeStamp">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </floater.string>
<scroll_list name="object_list" tool_tip="">
- <column label="Nazwa" name="object_name" />
- <column label="Właściciel" name="owner_name" />
- <column label="Twórca" name="creator_name" />
- <column label="Data Kreacji" name="creation_date" />
+ <scroll_list.columns label="Nazwa" name="object_name"/>
+ <scroll_list.columns label="Właściciel" name="owner_name"/>
+ <scroll_list.columns label="Twórca" name="creator_name"/>
+ <scroll_list.columns label="Data kreacji" name="creation_date"/>
</scroll_list>
- <button label="Profil Właściciela..." label_selected="" name="button owner"
- tool_tip="" />
- <button label="Profil Twórcy..." label_selected="" name="button creator"
- tool_tip="" />
+ <button label="Profil Właściciela..." label_selected="" name="button owner" tool_tip=""/>
+ <button label="Profil Twórcy..." label_selected="" name="button creator" tool_tip=""/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_inventory.xml b/indra/newview/skins/default/xui/pl/floater_inventory.xml
index 157be76c4d..0dc4d5b96d 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/pl/floater_inventory.xml
@@ -1,47 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Inventory" title="MOJA SZAFA">
- <search_editor label="Wyszukiwarka" name="inventory search editor"/>
- <tab_container name="inventory filter tabs">
- <inventory_panel label="Wszystkie Obiekty" name="All Items"/>
- <inventory_panel label="Nowe Obiekty" name="Recent Items"/>
- </tab_container>
- <menu_bar name="Inventory Menu">
- <menu label="Plik" name="File">
- <menu_item_call label="Otwórz" name="Open"/>
- <menu_item_call label="Nowe Okno" name="New Window"/>
- <menu_item_call label="Pokaż Filtr" name="Show Filters"/>
- <menu_item_call label="Zresetuj Filtr" name="Reset Current"/>
- <menu_item_call label="Zamknij Wszystkie Foldery" name="Close All Folders"/>
- <menu_item_call label="Opróżnij Kosz" name="Empty Trash"/>
- </menu>
- <menu label="Stwórz" name="Create">
- <menu_item_call label="Nowy Folder" name="New Folder"/>
- <menu_item_call label="Nowy Skrypt" name="New Script"/>
- <menu_item_call label="NowÄ… NotÄ™" name="New Note"/>
- <menu_item_call label="Nowy Gest" name="New Gesture"/>
- <menu name="New Clothes">
- <menu_item_call label="Nowa Koszula" name="New Shirt"/>
- <menu_item_call label="Nowe Spodnie" name="New Pants"/>
- <menu_item_call label="Nowe Buty" name="New Shoes"/>
- <menu_item_call label="Nowe Skarpety" name="New Socks"/>
- <menu_item_call label="Nowa Kurtka" name="New Jacket"/>
- <menu_item_call label="Nowa Spódnica" name="New Skirt"/>
- <menu_item_call label="Nowe Rękawiczki" name="New Gloves"/>
- <menu_item_call label="Nowy Podkoszulek" name="New Undershirt"/>
- <menu_item_call label="Nowa Bielizna" name="New Underpants"/>
- </menu>
- <menu name="New Body Parts">
- <menu_item_call label="Nowy Kształt" name="New Shape"/>
- <menu_item_call label="Nową Skórkę" name="New Skin"/>
- <menu_item_call label="Nowe Włosy" name="New Hair"/>
- <menu_item_call label="Nowe Oczy" name="New Eyes"/>
- </menu>
- </menu>
- <menu label="PorzÄ…dkuj" name="Sort">
- <menu_item_check label="Według Nazwy" name="By Name"/>
- <menu_item_check label="Według Daty" name="By Date"/>
- <menu_item_check label="Foldery Zawsze Według Nazwy" name="Folders Always By Name"/>
- <menu_item_check label="Ułożenie Folderów od Góry" name="System Folders To Top"/>
- </menu>
- </menu_bar>
+ <floater.string name="Title">
+ MOJA SZAFA
+ </floater.string>
+ <floater.string name="TitleFetching">
+ MOJA SZAFA (Dostarczanie [ITEM_COUNT] obiektów...) [FILTER]
+ </floater.string>
+ <floater.string name="TitleCompleted">
+ MOJA SZAFA ([ITEM_COUNT] Obiektów) [FILTER]
+ </floater.string>
+ <floater.string name="Fetched">
+ Dostarczono
+ </floater.string>
+ <panel label="Panel Moja Szafa" name="Inventory Panel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml
index 665172dd49..1e63987585 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/pl/floater_inventory_item_properties.xml
@@ -1,5 +1,20 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="item properties" title="WÅAÅšCIWOÅšCI OBIEKTÓW W SZAFIE">
+ <floater.string name="unknown">
+ (nieznany)
+ </floater.string>
+ <floater.string name="public">
+ (publiczny)
+ </floater.string>
+ <floater.string name="you_can">
+ Opcje:
+ </floater.string>
+ <floater.string name="owner_can">
+ Właściciel może:
+ </floater.string>
+ <floater.string name="acquiredDate">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </floater.string>
<text name="LabelItemNameTitle">
Nazwa:
</text>
@@ -12,14 +27,14 @@
<text name="LabelCreatorName">
Nicole Linden
</text>
- <button label="Profil..." label_selected="" name="BtnCreator" />
+ <button label="Profil..." label_selected="" name="BtnCreator"/>
<text name="LabelOwnerTitle">
Właściciel:
</text>
<text name="LabelOwnerName">
Thrax Linden
</text>
- <button label="Profil..." label_selected="" name="BtnOwner" />
+ <button label="Profil..." label_selected="" name="BtnOwner"/>
<text name="LabelAcquiredTitle">
Nabyte:
</text>
@@ -27,55 +42,32 @@
Wed May 24 12:50:46 2006
</text>
<text name="OwnerLabel">
- Opcje:
- </text>
- <check_box label="Modyfikuj" name="CheckOwnerModify" />
- <check_box label="Kopiuj" name="CheckOwnerCopy" />
- <check_box label="Sprzedaj/Oddaj" name="CheckOwnerTransfer" />
- <text name="BaseMaskDebug">
- P:
- </text>
- <text name="OwnerMaskDebug">
- W:
+ Ty:
</text>
- <text name="GroupMaskDebug">
- G:
+ <check_box label="Edytuj" name="CheckOwnerModify"/>
+ <check_box label="Kopiuj" name="CheckOwnerCopy"/>
+ <check_box label="Odsprzedaż" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ Każdy:
</text>
- <text name="EveryoneMaskDebug">
- W:
+ <check_box label="Kopiuj" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ Grupa:
</text>
- <text name="NextMaskDebug">
- N:
- </text>
- <check_box label="Udostępnij grupie" name="CheckShareWithGroup" />
- <check_box label="Udostępnij kopiowanie każdemu" name="CheckEveryoneCopy" />
+ <check_box label="Udostępnij" name="CheckShareWithGroup"/>
<text name="NextOwnerLabel">
- Następna Osoba:
- </text>
- <check_box label="Modyfikuje" name="CheckNextOwnerModify" />
- <check_box label="Kopiuje" name="CheckNextOwnerCopy" />
- <check_box label="Sprzedaje/Oddaje" name="CheckNextOwnerTransfer" />
- <text name="SaleLabel">
- Zaznacz Artykuł:
+ Następny właściciel:
+ </text>
+ <check_box label="Edytuj" name="CheckNextOwnerModify"/>
+ <check_box label="Kopiuje" name="CheckNextOwnerCopy"/>
+ <check_box label="Odsprzedaż" name="CheckNextOwnerTransfer"/>
+ <check_box label="Sprzedaż" name="CheckPurchase"/>
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="Kopiuj" name="Copy"/>
+ <combo_box.item label="Oryginalny" name="Original"/>
+ </combo_box>
+ <spinner label="Cena:" name="Edit Cost"/>
+ <text name="CurrencySymbol">
+ L$
</text>
- <check_box label="Sprzedaż" name="CheckPurchase" />
- <radio_group name="RadioSaleType">
- <radio_item name="radio" label="Oryginał" />
- <radio_item name="radio2" label="Kopia" />
- </radio_group>
- <text name="TextPrice">
- Cena: L$
- </text>
- <string name="unknown">
- (nieznany)
- </string>
- <string name="public">
- (publiczny)
- </string>
- <string name="you_can">
- Opcje:
- </string>
- <string name="owner_can">
- Właściciel może:
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/pl/floater_inventory_view_finder.xml
index 9204262304..bd7b221c5d 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/pl/floater_inventory_view_finder.xml
@@ -4,7 +4,7 @@
<check_box label="Wizytówki" name="check_calling_card" />
<check_box label="Ubrania" name="check_clothing" />
<check_box label="Gesty" name="check_gesture" />
- <check_box label="Zakładki Miejsc" name="check_landmark" />
+ <check_box label="Landmarki" name="check_landmark" />
<check_box label="Noty" name="check_notecard" />
<check_box label="Obiekty" name="check_object" />
<check_box label="Skrypty" name="check_script" />
diff --git a/indra/newview/skins/default/xui/pl/floater_joystick.xml b/indra/newview/skins/default/xui/pl/floater_joystick.xml
index 22ac458b85..2b1e362b98 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/pl/floater_joystick.xml
@@ -1,110 +1,110 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Joystick" width="590" title="KONFIGURACJA JOYSTICKA">
- <check_box name="enable_joystick" label="Aktywuj Joystick:"/>
+<floater name="Joystick" title="KONFIGURACJA JOYSTICKA">
+ <check_box label="Aktywuj Joystick:" name="enable_joystick"/>
<text left="130" name="joystick_type" width="360"/>
- <spinner label="Kalibracja Osi X" left="20" width="170" label_width="130" name="JoystickAxis1"/>
- <spinner label="Kalibracja Osi Y" left="210" width="170" label_width="130" name="JoystickAxis2" />
- <spinner label="Kalibracja Osi Z" left="400" width="170" label_width="130" name="JoystickAxis0" />
- <spinner label="Kalibracja Wznoszenia" left="20" width="170" label_width="130" name="JoystickAxis4" />
- <spinner label="Kalibracja Wychylania" left="210" width="170" label_width="130" name="JoystickAxis5" />
- <spinner label="Kalibracja Obrotu" left="400" width="170" label_width="130" name="JoystickAxis3"/>
- <spinner label="Kalibracja Powiększania" width="170" label_width="130" name="JoystickAxis6" />
- <check_box label="Bezpośrednie" left="205" name="ZoomDirect" />
- <check_box label="Kursor 3D" left="340" name="Cursor3D" />
- <check_box label="Automatyczne" left="450" name="AutoLeveling" />
- <text left="22" name="Control Modes:">
+ <spinner label="Kalibracja Osi X" label_width="130" left="20" name="JoystickAxis1" width="170"/>
+ <spinner label="Kalibracja Osi Y" label_width="130" left="210" name="JoystickAxis2" width="170"/>
+ <spinner label="Kalibracja Osi Z" label_width="100" left="400" name="JoystickAxis0" width="140"/>
+ <spinner label="Kalibracja wznoszenia" label_width="130" left="20" name="JoystickAxis4" width="170"/>
+ <spinner label="Kalibracja wychylania" label_width="130" left="210" name="JoystickAxis5" width="170"/>
+ <spinner label="Kalibracja obrotu" label_width="100" left="400" name="JoystickAxis3" width="140"/>
+ <spinner label="Kalibracja powiększania" label_width="130" name="JoystickAxis6" width="170"/>
+ <check_box label="Bezpośrednie" left="205" name="ZoomDirect"/>
+ <check_box label="Kursor 3D" left="340" name="Cursor3D"/>
+ <check_box label="Automatyczne" left="450" name="AutoLeveling"/>
+ <text name="Control Modes:">
Kontroluj:
</text>
- <check_box left="130" width="90" name="JoystickAvatarEnabled" label="Awatara"/>
- <check_box left="205" width="90" name="JoystickBuildEnabled" label="Budowanie"/>
- <check_box left="282" width="90" name="JoystickFlycamEnabled" label="KamerÄ™ podczas latania"/>
- <text width="104" name="XScale">
+ <check_box label="Awatara" name="JoystickAvatarEnabled" width="90"/>
+ <check_box label="Budowanie" name="JoystickBuildEnabled" width="90"/>
+ <check_box label="KamerÄ™ podczas latania" left="300" name="JoystickFlycamEnabled" width="90"/>
+ <text name="XScale">
Skala X
</text>
- <spinner left="133" name="AvatarAxisScale1" />
- <spinner left="208" name="BuildAxisScale1" />
- <spinner left="283" name="FlycamAxisScale1" />
- <text width="104" name="YScale">
+ <spinner name="AvatarAxisScale1"/>
+ <spinner name="BuildAxisScale1"/>
+ <spinner left="300" name="FlycamAxisScale1"/>
+ <text name="YScale">
Skala Y
</text>
- <spinner left="133" name="AvatarAxisScale2" />
- <spinner left="208" name="BuildAxisScale2" />
- <spinner left="283" name="FlycamAxisScale2" />
- <text width="104" name="ZScale">
+ <spinner name="AvatarAxisScale2"/>
+ <spinner name="BuildAxisScale2"/>
+ <spinner left="300" name="FlycamAxisScale2"/>
+ <text name="ZScale">
Skala Z
</text>
- <spinner left="133" name="AvatarAxisScale0" />
- <spinner left="208" name="BuildAxisScale0" />
- <spinner left="283" name="FlycamAxisScale0" />
- <text width="104" name="PitchScale">
- Skala Wznoszenia
- </text>
- <spinner left="133" name="AvatarAxisScale4" />
- <spinner left="208" name="BuildAxisScale4" />
- <spinner left="283" name="FlycamAxisScale4" />
- <text width="104" name="YawScale">
- Skala Odchylania
- </text>
- <spinner left="133" name="AvatarAxisScale5" />
- <spinner left="208" name="BuildAxisScale5" />
- <spinner left="283" name="FlycamAxisScale5" />
- <text width="104" name="RollScale">
- Skala Obrotu
- </text>
- <spinner left="208" name="BuildAxisScale3" />
- <spinner left="283" name="FlycamAxisScale3" />
- <text width="104" name="XDeadZone">
- Tolerancja Osi X
- </text>
- <spinner left="133" name="AvatarAxisDeadZone1" />
- <spinner left="208" name="BuildAxisDeadZone1" />
- <spinner left="283" name="FlycamAxisDeadZone1" />
- <text width="104" name="YDeadZone">
- Tolerancja Osi Y
- </text>
- <spinner left="133" name="AvatarAxisDeadZone2" />
- <spinner left="208" name="BuildAxisDeadZone2" />
- <spinner left="283" name="FlycamAxisDeadZone2" />
- <text width="104" name="ZDeadZone">
- Tolerancja Osi Z
- </text>
- <spinner left="133" name="AvatarAxisDeadZone0" />
- <spinner left="208" name="BuildAxisDeadZone0" />
- <spinner left="283" name="FlycamAxisDeadZone0" />
- <text width="104" name="PitchDeadZone">
- Tolerancja Wznoszenia
- </text>
- <spinner left="133" name="AvatarAxisDeadZone4" />
- <spinner left="208" name="BuildAxisDeadZone4" />
- <spinner left="283" name="FlycamAxisDeadZone4" />
- <text width="104" name="YawDeadZone">
- Tolerancja Odchylania
- </text>
- <spinner left="133" name="AvatarAxisDeadZone5" />
- <spinner left="208" name="BuildAxisDeadZone5" />
- <spinner left="283" name="FlycamAxisDeadZone5" />
- <text width="104" name="RollDeadZone">
- Tolerancja Obrotu
- </text>
- <spinner left="208" name="BuildAxisDeadZone3" />
- <spinner left="283" name="FlycamAxisDeadZone3" />
- <text width="104" name="Feathering">
+ <spinner name="AvatarAxisScale0"/>
+ <spinner name="BuildAxisScale0"/>
+ <spinner left="300" name="FlycamAxisScale0"/>
+ <text name="PitchScale">
+ Skala wznoszenia
+ </text>
+ <spinner name="AvatarAxisScale4"/>
+ <spinner name="BuildAxisScale4"/>
+ <spinner left="300" name="FlycamAxisScale4"/>
+ <text name="YawScale">
+ Skala odchylania
+ </text>
+ <spinner name="AvatarAxisScale5"/>
+ <spinner name="BuildAxisScale5"/>
+ <spinner left="300" name="FlycamAxisScale5"/>
+ <text name="RollScale">
+ Skala obrotu
+ </text>
+ <spinner name="BuildAxisScale3"/>
+ <spinner left="300" name="FlycamAxisScale3"/>
+ <text name="XDeadZone">
+ Tolerancja osi X
+ </text>
+ <spinner name="AvatarAxisDeadZone1"/>
+ <spinner name="BuildAxisDeadZone1"/>
+ <spinner left="300" name="FlycamAxisDeadZone1"/>
+ <text name="YDeadZone">
+ Tolerancja osi Y
+ </text>
+ <spinner name="AvatarAxisDeadZone2"/>
+ <spinner name="BuildAxisDeadZone2"/>
+ <spinner left="300" name="FlycamAxisDeadZone2"/>
+ <text name="ZDeadZone">
+ Tolerancja osi Z
+ </text>
+ <spinner name="AvatarAxisDeadZone0"/>
+ <spinner name="BuildAxisDeadZone0"/>
+ <spinner left="300" name="FlycamAxisDeadZone0"/>
+ <text name="PitchDeadZone">
+ Tolerancja wznoszenia
+ </text>
+ <spinner name="AvatarAxisDeadZone4"/>
+ <spinner name="BuildAxisDeadZone4"/>
+ <spinner left="300" name="FlycamAxisDeadZone4"/>
+ <text name="YawDeadZone">
+ Tolerancja odchylania
+ </text>
+ <spinner name="AvatarAxisDeadZone5"/>
+ <spinner name="BuildAxisDeadZone5"/>
+ <spinner left="300" name="FlycamAxisDeadZone5"/>
+ <text name="RollDeadZone">
+ Tolerancja obrotu
+ </text>
+ <spinner name="BuildAxisDeadZone3"/>
+ <spinner left="300" name="FlycamAxisDeadZone3"/>
+ <text name="Feathering">
Przenikanie
</text>
- <slider left="125" label="" name="AvatarFeathering" />
- <slider left="200" label="" name="BuildFeathering" />
- <slider left="275" label="" name="FlycamFeathering" />
- <text width="104" name="ZoomScale2">
- Skala Powiększania
+ <slider label="" name="AvatarFeathering"/>
+ <slider label="" name="BuildFeathering"/>
+ <slider label="" left_delta="81" name="FlycamFeathering"/>
+ <text name="ZoomScale2">
+ Skala powiększania
</text>
- <spinner left="283" label="" name="FlycamAxisScale6" />
- <text width="104" name="ZoomDeadZone">
- Tolerancja Powiększania
+ <spinner label="" left="300" name="FlycamAxisScale6"/>
+ <text name="ZoomDeadZone">
+ Tolerancja powiększania
</text>
- <spinner left="283" label="" name="FlycamAxisDeadZone6" />
- <button left="366" label="Ustawienia Domyślne" name="SpaceNavigatorDefaults" />
- <button left="366" label="OK" label_selected="OK" name="ok_btn" />
- <button label="Anuluj" label_selected="Anuluj" name="cancel_btn" />
+ <spinner label="" left="300" name="FlycamAxisDeadZone6"/>
+ <button label="Ustawienia domyślne" name="SpaceNavigatorDefaults"/>
+ <button label="OK" label_selected="OK" left="366" name="ok_btn"/>
+ <button label="Anuluj" label_selected="Anuluj" name="cancel_btn"/>
<stat_view label="Monitor Joysticka" name="axis_view">
<stat_bar label="OÅ› 0" name="axis0"/>
<stat_bar label="OÅ› 1" name="axis1"/>
@@ -113,7 +113,7 @@
<stat_bar label="OÅ› 4" name="axis4"/>
<stat_bar label="OÅ› 5" name="axis5"/>
</stat_view>
- <string name="NoDevice">
+ <string name="NoDevice">
brak podłącznego urządzenia
</string>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_lagmeter.xml b/indra/newview/skins/default/xui/pl/floater_lagmeter.xml
index 69d563bdba..8038550bcb 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_lagmeter.xml
+++ b/indra/newview/skins/default/xui/pl/floater_lagmeter.xml
@@ -1,154 +1,151 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_lagmeter" title="POMIAR LAGÓW">
- <button label="" label_selected="" name="client_lagmeter"
- tool_tip="Status lagów klienta" />
- <text name="client">
- Klient:
- </text>
- <text name="client_text">
- W normie
- </text>
- <button label="" label_selected="" name="network_lagmeter"
- tool_tip="Network lag status" />
- <text name="network">
- Sieć:
- </text>
- <text name="network_text">
- W normie
- </text>
- <button label="" label_selected="" name="server_lagmeter" tool_tip="Server lag status" />
- <text name="server">
- Serwer:
- </text>
- <text name="server_text">
- W normie
- </text>
- <button label="?" name="server_help" />
- <button label="&gt;&gt;" name="minimize" />
- <string name="max_title_msg">
- Pomiar Lagów
- </string>
- <string name="max_width_px">
+ <floater.string name="max_title_msg">
+ Pomiar lagów
+ </floater.string>
+ <floater.string name="max_width_px">
360
- </string>
- <string name="min_title_msg">
+ </floater.string>
+ <floater.string name="min_title_msg">
Lag
- </string>
- <string name="min_width_px">
+ </floater.string>
+ <floater.string name="min_width_px">
90
- </string>
- <string name="client_text_msg">
+ </floater.string>
+ <floater.string name="client_text_msg">
Klient
- </string>
- <string name="client_frame_rate_critical_fps">
+ </floater.string>
+ <floater.string name="client_frame_rate_critical_fps">
10
- </string>
- <string name="client_frame_rate_warning_fps">
+ </floater.string>
+ <floater.string name="client_frame_rate_warning_fps">
15
- </string>
- <string name="client_frame_time_window_bg_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_window_bg_msg">
W normie, okno w tle
- </string>
- <string name="client_frame_time_critical_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_critical_msg">
Ilość klatek na sekundę klienta poniżej [CLIENT_FRAME_RATE_CRITICAL]
- </string>
- <string name="client_frame_time_warning_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_warning_msg">
Ilość klatek na sekundę pomiędzy [CLIENT_FRAME_RATE_CRITICAL] i [CLIENT_FRAME_RATE_WARNING]
- </string>
- <string name="client_frame_time_normal_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_normal_msg">
W normie
- </string>
- <string name="client_draw_distance_cause_msg">
- Przyczyna: Dystans rysowania jest za wysoki
- </string>
- <string name="client_texture_loading_cause_msg">
- Przyczyna: Åadowanie obrazu
- </string>
- <string name="client_texture_memory_cause_msg">
- Przyczyna: Za dużo obrazów w pamięci
- </string>
- <string name="client_complex_objects_cause_msg">
- Przyczyna: Za dużo złożonych obiektów
- </string>
- <string name="network_text_msg">
+ </floater.string>
+ <floater.string name="client_draw_distance_cause_msg">
+ Przyczyna: dystans rysowania jest za wysoki
+ </floater.string>
+ <floater.string name="client_texture_loading_cause_msg">
+ Przyczyna: ładowanie obrazu
+ </floater.string>
+ <floater.string name="client_texture_memory_cause_msg">
+ Przyczyna: za dużo obrazów w pamięci
+ </floater.string>
+ <floater.string name="client_complex_objects_cause_msg">
+ Przyczyna: za dużo złożonych obiektów
+ </floater.string>
+ <floater.string name="network_text_msg">
Sieć
- </string>
- <string name="network_packet_loss_critical_pct">
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_pct">
10
- </string>
- <string name="network_packet_loss_warning_pct">
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_pct">
5
- </string>
- <string name="network_packet_loss_critical_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_msg">
Utrata pakietów przekracza [NETWORK_PACKET_LOSS_CRITICAL]%
- </string>
- <string name="network_packet_loss_warning_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_msg">
Utrata pakietów przekracza [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]%
- </string>
- <string name="network_performance_normal_msg">
+ </floater.string>
+ <floater.string name="network_performance_normal_msg">
W normie
- </string>
- <string name="network_ping_critical_ms">
+ </floater.string>
+ <floater.string name="network_ping_critical_ms">
600
- </string>
- <string name="network_ping_warning_ms">
+ </floater.string>
+ <floater.string name="network_ping_warning_ms">
300
- </string>
- <string name="network_ping_critical_msg">
+ </floater.string>
+ <floater.string name="network_ping_critical_msg">
Fatalny ping - [NETWORK_PING_CRITICAL] ms
- </string>
- <string name="network_ping_warning_msg">
+ </floater.string>
+ <floater.string name="network_ping_warning_msg">
Wolny ping - [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
- </string>
- <string name="network_packet_loss_cause_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_cause_msg">
Złe połączenie lub przepustowość.
- </string>
- <string name="network_ping_cause_msg">
+ </floater.string>
+ <floater.string name="network_ping_cause_msg">
Złe połączenie lub aplikacja współdzieląca pliki.
- </string>
- <string name="server_text_msg">
+ </floater.string>
+ <floater.string name="server_text_msg">
Serwer
- </string>
- <string name="server_frame_rate_critical_fps">
+ </floater.string>
+ <floater.string name="server_frame_rate_critical_fps">
20
- </string>
- <string name="server_frame_rate_warning_fps">
+ </floater.string>
+ <floater.string name="server_frame_rate_warning_fps">
30
- </string>
- <string name="server_single_process_max_time_ms">
+ </floater.string>
+ <floater.string name="server_single_process_max_time_ms">
20
- </string>
- <string name="server_frame_time_critical_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_critical_msg">
Ilość klatek na sekundę poniżej [SERVER_FRAME_RATE_CRITICAL]
- </string>
- <string name="server_frame_time_warning_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_warning_msg">
Ilość klatek na sekundę pomiędzy [SERVER_FRAME_RATE_CRITICAL] i [SERVER_FRAME_RATE_WARNING]
- </string>
- <string name="server_frame_time_normal_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_normal_msg">
W normie
- </string>
- <string name="server_physics_cause_msg">
- Przyczyna: Za dużo obiektów fizycznych
- </string>
- <string name="server_scripts_cause_msg">
- Przyczyna: Za dużo obieków skryptowanych
- </string>
- <string name="server_net_cause_msg">
- Przyczyna: Za duży ruch w sieci
- </string>
- <string name="server_agent_cause_msg">
- Przyczyna: Za dużo poruszających się awatarów w regionie
- </string>
- <string name="server_images_cause_msg">
- Przyczyna: Za dużo kalkulacji obrazu
- </string>
- <string name="server_generic_cause_msg">
- Przyczyna: Symulator ładuje się zbyt powoli
- </string>
- <string name="smaller_label">
+ </floater.string>
+ <floater.string name="server_physics_cause_msg">
+ Przyczyna: za dużo obiektów fizycznych
+ </floater.string>
+ <floater.string name="server_scripts_cause_msg">
+ Przyczyna: za dużo obieków skryptowanych
+ </floater.string>
+ <floater.string name="server_net_cause_msg">
+ Przyczyna: za duży ruch w sieci
+ </floater.string>
+ <floater.string name="server_agent_cause_msg">
+ Przyczyna: za dużo poruszających się awatarów w regionie
+ </floater.string>
+ <floater.string name="server_images_cause_msg">
+ Przyczyna: za dużo kalkulacji obrazu
+ </floater.string>
+ <floater.string name="server_generic_cause_msg">
+ Przyczyna: symulator ładuje się zbyt powoli
+ </floater.string>
+ <floater.string name="smaller_label">
&gt;&gt;
- </string>
- <string name="bigger_label">
+ </floater.string>
+ <floater.string name="bigger_label">
&lt;&lt;
- </string>
+ </floater.string>
+ <button label="" label_selected="" name="client_lagmeter" tool_tip="Status lagów klienta"/>
+ <text name="client">
+ Klient
+ </text>
+ <text name="client_text">
+ W normie
+ </text>
+ <button label="" label_selected="" name="network_lagmeter" tool_tip="Network lag status"/>
+ <text name="network">
+ Sieć
+ </text>
+ <text name="network_text">
+ W normie
+ </text>
+ <button label="" label_selected="" name="server_lagmeter" tool_tip="Server lag status"/>
+ <text name="server">
+ Serwer
+ </text>
+ <text name="server_text">
+ W normie
+ </text>
+ <button label="&gt;&gt;" name="minimize" tool_tip="Złącz rozmiar pliku xml"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_land_holdings.xml b/indra/newview/skins/default/xui/pl/floater_land_holdings.xml
index 13e6a8b16d..72a078949a 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_land_holdings.xml
+++ b/indra/newview/skins/default/xui/pl/floater_land_holdings.xml
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="land holdings floater" title="MOJA POSIADÅOŚĆ">
<scroll_list name="parcel list">
- <column label="Nazwa posiadłości" name="name"/>
+ <column label="Posiadłość" name="name"/>
<column label="Region" name="location"/>
<column label="Typ" name="type"/>
<column label="Obszar" name="area"/>
<column label="" name="hidden"/>
</scroll_list>
<button label="Teleportuj" label_selected="Teleport" name="Teleport" tool_tip="Teleportuj się do centrum tej Posiadłości."/>
- <button label="Pokaż na Mapie" label_selected="Pokaż na mapie" name="Show on Map" tool_tip="Pokaż to miejsce na mapie świata."/>
+ <button label="Mapa" label_selected="Mapa" name="Show on Map" tool_tip="Pokaż to miejsce na mapie świata."/>
<text name="contrib_label">
Kontrybucje do Twoich Grup:
</text>
@@ -20,21 +20,21 @@
Dozwolone udziały przy obecnym planie płatności:
</text>
<text name="allowed_text">
- [AREA] metrów
+ [AREA] m²
</text>
<text name="current_label">
Udziały w Posiadłościach:
</text>
<text name="current_text">
- [AREA] metrów
+ [AREA] m²
</text>
<text name="available_label">
Dostępne na zakup Posiadłości:
</text>
<text name="available_text">
- [AREA] metrów
+ [AREA] m²
</text>
<string name="area_string">
- [AREA] metrów
+ [AREA] m²
</string>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/pl/floater_live_lsleditor.xml
index 8120ff8c77..e03c5faaeb 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/pl/floater_live_lsleditor.xml
@@ -1,12 +1,15 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="script ed float" title="SKRYPT: NOWY SKRYPT">
- <button label="Zresetuj" label_selected="Zresetuj" name="Reset" />
- <check_box label="Włącz" name="running" />
- <check_box label="Mono" name="mono" />
- <string name="not_allowed">
- Nie masz praw by widzieć zawartość tego skryptu.
- </string>
- <string name="script_running">
+ <floater.string name="not_allowed">
+ Nie posiadasz praw do zobaczenia lub edycji kodu tego skryptu ponieważ udostępnione Ci prawa to &quot;brak kopiowania&quot;. Musisz posiadać pełne prawa by móc zobaczyć lub edytować kod skryptu w zawartości obiektu.
+ </floater.string>
+ <floater.string name="script_running">
Włącz
- </string>
+ </floater.string>
+ <floater.string name="Title">
+ SKRYPT: [NAME]
+ </floater.string>
+ <button label="Zresetuj" label_selected="Zresetuj" name="Reset"/>
+ <check_box initial_value="true" label="Włącz" name="running"/>
+ <check_box initial_value="true" label="Mono" name="mono"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_lsl_guide.xml b/indra/newview/skins/default/xui/pl/floater_lsl_guide.xml
index 5601aa4464..7b1b395f87 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_lsl_guide.xml
+++ b/indra/newview/skins/default/xui/pl/floater_lsl_guide.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="script ed float" title="LSL WIKI">
- <check_box label="Idź za kursorem" name="lock_check" />
- <combo_box label="Zablokuj" name="history_combo" />
- <button label="Wróć" name="back_btn" />
- <button label="Do Przodu" name="fwd_btn" />
+ <check_box label="Idź za kursorem" name="lock_check"/>
+ <combo_box label="Zablokuj" name="history_combo"/>
+ <button label="Wróć" name="back_btn"/>
+ <button label="Do przodu" name="fwd_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_map.xml b/indra/newview/skins/default/xui/pl/floater_map.xml
index 6eabde7c52..1e5f3e6d46 100644
--- a/indra/newview/skins/default/xui/pl/floater_map.xml
+++ b/indra/newview/skins/default/xui/pl/floater_map.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Map">
+<floater name="Map" title="Mini-Mapa">
<floater.string name="mini_map_north">
N
</floater.string>
diff --git a/indra/newview/skins/default/xui/pl/floater_media_browser.xml b/indra/newview/skins/default/xui/pl/floater_media_browser.xml
index 74210c75e5..9787736ad8 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/pl/floater_media_browser.xml
@@ -1,19 +1,19 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_about" title="PRZEGLĄDARKA MEDIÓW">
<layout_stack name="stack1">
<layout_panel name="nav_controls">
- <button label="Wróć" name="back" />
- <button label="Do Przodu" name="forward" />
- <button label="Załaduj" name="reload" />
- <button label="Idź" name="go" />
+ <button label="Wróć" name="back"/>
+ <button label="Do przodu" name="forward"/>
+ <button label="Załaduj" name="reload"/>
+ <button label="Idź" name="go"/>
</layout_panel>
<layout_panel name="parcel_owner_controls">
- <button label="Wyślij Obecny URL do Posiadłości" name="assign" />
+ <button label="Wyślij bieżącą stronę do Parceli" name="assign"/>
</layout_panel>
<layout_panel name="external_controls">
- <button label="Użyj Mojej Przeglądarki" name="open_browser" />
- <check_box label="Zawsze otwieraj w mojej przeglÄ…darce internetowej" name="open_always" />
- <button label="Zamknij" name="close" />
+ <button label="Użyj mojej przeglądarki" name="open_browser"/>
+ <check_box label="Zawsze otwieraj w mojej przeglÄ…darce internetowej" name="open_always"/>
+ <button label="Zamknij" name="close"/>
</layout_panel>
</layout_stack>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_media_settings.xml b/indra/newview/skins/default/xui/pl/floater_media_settings.xml
new file mode 100644
index 0000000000..5a36331c9a
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_media_settings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="media_settings" title="MEDIA">
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="Anuluj" label_selected="Anuluj" name="Cancel"/>
+ <button label="Zastosuj" label_selected="Zastosuj" name="Apply"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_mem_leaking.xml b/indra/newview/skins/default/xui/pl/floater_mem_leaking.xml
index 88a878af72..9ce99692d0 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_mem_leaking.xml
+++ b/indra/newview/skins/default/xui/pl/floater_mem_leaking.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="MemLeak" title="SYMULACJA PRZECIEKÓW ALOKACJI PAMIĘCI">
- <spinner label="Prędkość Przecieków (byty na klatkę):" name="leak_speed" />
- <spinner label="Max Przecieki (MB):" name="max_leak" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="MemLeak" title="STYMULACJA WYCIEKU PAMIĘCI">
+ <spinner label="Prędkość przecieków (byty na klatkę):" name="leak_speed"/>
+ <spinner label="Max przecieki (MB):" name="max_leak"/>
<text name="total_leaked_label">
Przeciekło: [SIZE] KB
</text>
@@ -11,8 +11,8 @@
<text name="note_label_2">
[NOTE2]
</text>
- <button label="Start" name="start_btn" />
- <button label="Stop" name="stop_btn" />
- <button label="Uwolnij" name="release_btn" />
- <button label="Zamknij" name="close_btn" />
+ <button label="Start" name="start_btn"/>
+ <button label="Stop" name="stop_btn"/>
+ <button label="Uwolnij" name="release_btn"/>
+ <button label="Zamknij" name="close_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_moveview.xml b/indra/newview/skins/default/xui/pl/floater_moveview.xml
index e28cfd589d..9c97a8a0e7 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/pl/floater_moveview.xml
@@ -1,15 +1,43 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="move_floater">
-<panel name="panel_actions">
- <button label="" label_selected="" name="turn left btn" tool_tip="Obróć w lewo" />
- <button label="" label_selected="" name="turn right btn" tool_tip="Obroć w Prawo" />
- <button label="" label_selected="" name="move up btn"
- tool_tip="Skocz lub zacznij latać w górę" />
- <button label="" label_selected="" name="move down btn"
- tool_tip="Pochyl się lub zacznij latać w dół" />
- <joystick_slide name="slide left btn" tool_tip="Przesuń w lewo" />
- <joystick_slide name="slide right btn" tool_tip="Przesuń w prawo" />
- <joystick_turn name="forward btn" tool_tip="Przesuń do przodu" />
- <joystick_turn name="backward btn" tool_tip="Przesuń do tyłu" />
-</panel>
+ <string name="walk_forward_tooltip">
+ Idź (naciśnij Strzałkę w Górę lub W)
+ </string>
+ <string name="walk_back_tooltip">
+ Idź do tyłu (naciśnij Strzałkę w Dół lub S)
+ </string>
+ <string name="run_forward_tooltip">
+ Biegnij do przodu (naciśnij Strzałkę w Górę lub W)
+ </string>
+ <string name="run_back_tooltip">
+ Biegnij do przodu (naciśnij Strzałkę w Dół lub S)
+ </string>
+ <string name="fly_forward_tooltip">
+ Leć do przodu (naciśnij Strzałkę w Górę lub W)
+ </string>
+ <string name="fly_back_tooltip">
+ Leć do tyłu (naciśnij Strzałkę na Dół lub S)
+ </string>
+ <string name="walk_title">
+ Idź
+ </string>
+ <string name="run_title">
+ Biegnij
+ </string>
+ <string name="fly_title">
+ Lataj
+ </string>
+ <panel name="panel_actions">
+ <button label="" label_selected="" name="turn left btn" tool_tip="Obróć w lewo (naciśnij Lewą Strzałkę lub A)"/>
+ <button label="" label_selected="" name="turn right btn" tool_tip="Obróć w prawo (naciśnij Prawą Strzałkę lub D)"/>
+ <button label="" label_selected="" name="move up btn" tool_tip="Leć do góry, naciśnij E"/>
+ <button label="" label_selected="" name="move down btn" tool_tip="Leć w dół, naciśnij C"/>
+ <joystick_turn name="forward btn" tool_tip="Idź (naciśnij Strzałkę w Górę lub W)"/>
+ <joystick_turn name="backward btn" tool_tip="Cofaj się (naciśnij Strzałkę w Dół lub S)"/>
+ </panel>
+ <panel name="panel_modes">
+ <button label="" name="mode_walk_btn" tool_tip="Tryb chodzenia"/>
+ <button label="" name="mode_run_btn" tool_tip="Tryb biegu"/>
+ <button label="" name="mode_fly_btn" tool_tip="Tryb latania"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_mute_object.xml b/indra/newview/skins/default/xui/pl/floater_mute_object.xml
index 8055617371..4af5872ef5 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_mute_object.xml
+++ b/indra/newview/skins/default/xui/pl/floater_mute_object.xml
@@ -9,6 +9,6 @@
<text name="note">
* Zablokuj jedynie tekst obiektu, bez dźwięku
</text>
- <button label="Ok" name="OK"/>
+ <button label="OK" name="OK"/>
<button label="Anuluj" name="Cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_my_friends.xml b/indra/newview/skins/default/xui/pl/floater_my_friends.xml
index 0bcf6ba4d5..847c93f891 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_my_friends.xml
+++ b/indra/newview/skins/default/xui/pl/floater_my_friends.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_my_friends" title="KONTAKTY">
<tab_container name="friends_and_groups">
- <panel label="Znajomi" name="friends_panel" />
- <panel label="Grupy" name="groups_panel" />
+ <panel label="Znajomi" name="friends_panel"/>
+ <panel label="Grupy" name="groups_panel"/>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_nearby_chat.xml b/indra/newview/skins/default/xui/pl/floater_nearby_chat.xml
new file mode 100644
index 0000000000..e00b3188ea
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_nearby_chat.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="nearby_chat" title="CZAT LOKALNY"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_openobject.xml b/indra/newview/skins/default/xui/pl/floater_openobject.xml
index fbbed0f11d..8e94ae821c 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_openobject.xml
+++ b/indra/newview/skins/default/xui/pl/floater_openobject.xml
@@ -1,10 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="objectcontents" title="ZAWARTOŚĆ OBIEKTU">
<text name="object_name">
[DESC]:
</text>
- <button label="Kopiuj do Szafy" label_selected="Kopiuj do Szafy"
- name="copy_to_inventory_button" />
- <button label="Kopiuj i Zalóż" label_selected="Kopiuj i Załóż"
- name="copy_and_wear_button" />
+ <button label="Kopiuj do Szafy" label_selected="Kopiuj do Szafy" name="copy_to_inventory_button"/>
+ <button label="Kopiuj i zalóż" label_selected="Kopiuj i załóż" name="copy_and_wear_button"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/pl/floater_outfit_save_as.xml
new file mode 100644
index 0000000000..a8d2e10c5f
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_outfit_save_as.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container" title="Stwórz ubranie">
+ <button label="Zapisz" label_selected="Zapisz" name="Save"/>
+ <button label="Anuluj" label_selected="Anuluj" name="Cancel"/>
+ <text name="Save item as:">
+ Zapisz to co mam w tej chwili założone
+jako nowy komplet ubrania:
+ </text>
+ <line_editor name="name ed">
+ [DESC] (nowy)
+ </line_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_outgoing_call.xml b/indra/newview/skins/default/xui/pl/floater_outgoing_call.xml
new file mode 100644
index 0000000000..8a70cb3247
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_outgoing_call.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="outgoing call" title="ROZMOWA GÅOSOWA">
+ <floater.string name="lifetime">
+ 5
+ </floater.string>
+ <floater.string name="localchat">
+ Rozmowy głosowe w pobliżu
+ </floater.string>
+ <floater.string name="anonymous">
+ anonimowy
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ dzwoni.
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ uczestniczy w konferencyjnej rozmowie głosowej
+ </floater.string>
+ <text name="connecting">
+ ÅÄ…czy z [CALLEE_NAME]
+ </text>
+ <text name="calling">
+ Dzwoni [CALEE_NAME]
+ </text>
+ <text name="noanswer">
+ Brak odpowiedzi. Proszę spróbować ponownie później.
+ </text>
+ <text name="nearby">
+ Zostaleś rozłączony z [VOICE_CHANNEL_NAME]. [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_other">
+ [VOICE_CHANNEL_NAME] zakończył/a rozmowę głosową. [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_agent">
+ Zakończyłeś rozmowę. [RECONNECT_NEARBY]
+ </text>
+ <text name="leaving">
+ Opuszcza [CURRENT_CHAT]
+ </text>
+ <button label="Anuluj" label_selected="Anuluj" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_pay.xml b/indra/newview/skins/default/xui/pl/floater_pay.xml
index dfb1b6616c..dccb7ed2bb 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_pay.xml
+++ b/indra/newview/skins/default/xui/pl/floater_pay.xml
@@ -1,22 +1,26 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <button label="L$1" label_selected="L$1" name="fastpay 1" />
- <button label="L$5" label_selected="L$5" name="fastpay 5" />
- <button label="L$10" label_selected="L$10" name="fastpay 10" />
- <button label="L$20" label_selected="L$20" name="fastpay 20" />
- <button label="Zapłać" label_selected="Zapłać" name="pay btn" />
- <button label="Anuluj" label_selected="Anuluj" name="cancel btn" />
+ <string name="payee_group">
+ Zapłać Grupie
+ </string>
+ <string name="payee_resident">
+ Zapłać Rezydentowi
+ </string>
<text name="payee_label">
- Zapłata dla:
+ Zapłać:
</text>
+ <icon name="icon_person" tool_tip="Osoba"/>
<text name="payee_name">
[FIRST] [LAST]
</text>
- <text name="fastpay text" halign="left" left="12">
- Szybka Zapłata:
- </text>
+ <button label="L$1" label_selected="L$1" name="fastpay 1"/>
+ <button label="L$5" label_selected="L$5" name="fastpay 5"/>
+ <button label="L$10" label_selected="L$10" name="fastpay 10"/>
+ <button label="L$20" label_selected="L$20" name="fastpay 20"/>
<text name="amount text">
- Suma:
+ lub wybierz kwotÄ™:
</text>
- <line_editor left="52" name="amount" />
+ <line_editor left="52" name="amount"/>
+ <button label="Zapłać" label_selected="Zapłać" name="pay btn"/>
+ <button label="Anuluj" label_selected="Anuluj" name="cancel btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_pay_object.xml b/indra/newview/skins/default/xui/pl/floater_pay_object.xml
index 376f517aaa..d0c69a6c21 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/pl/floater_pay_object.xml
@@ -1,31 +1,30 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <text name="payee_group" width="100" halign="left">
- Zapłać Grupie:
- </text>
- <text name="payee_resident" width="120" halign="left" >
- Zapłać Rezydentowi:
- </text>
- <text name="payee_name" left="125">
+ <string halign="left" name="payee_group" width="100">
+ Zapłać Grupie
+ </string>
+ <string halign="left" name="payee_resident" width="120">
+ Zapłać Rezydentowi
+ </string>
+ <icon name="icon_person" tool_tip="Osoba"/>
+ <text left="125" name="payee_name">
[FIRST] [LAST]
</text>
- <text name="object_name_label" left="5" width="95" halign="left">
+ <text halign="left" left="5" name="object_name_label" width="95">
Poprzez Obiekt:
</text>
- <text name="object_name_text" left="105" >
- ...
- </text>
- <text name="fastpay text" width="95" halign="left">
- Szybka Zapłata:
+ <icon name="icon_object" tool_tip="Obiekt"/>
+ <text left="105" name="object_name_text">
+ Poprzez obiekt
</text>
- <text name="amount text" left="5" halign="left">
- Suma:
+ <button label="L$1" label_selected="L$1" left="105" name="fastpay 1"/>
+ <button label="L$5" label_selected="L$5" left="190" name="fastpay 5"/>
+ <button label="L$10" label_selected="L$10" left="105" name="fastpay 10"/>
+ <button label="L$20" label_selected="L$20" left="190" name="fastpay 20"/>
+ <text halign="left" left="5" name="amount text">
+ lub wybierz kwotÄ™:
</text>
- <button label="L$1" label_selected="L$1" name="fastpay 1" left="105"/>
- <button label="L$5" label_selected="L$5" name="fastpay 5" left="190"/>
- <button label="L$10" label_selected="L$10" name="fastpay 10" left="105"/>
- <button label="L$20" label_selected="L$20" name="fastpay 20" left="190"/>
- <button label="Zapłać" label_selected="Zapłać" name="pay btn" />
- <button label="Anuluj" label_selected="Anuluj" name="cancel btn" />
- <line_editor left="50" name="amount" width="50" />
+ <line_editor left="50" name="amount" width="50"/>
+ <button label="Zapłać" label_selected="Zapłać" name="pay btn"/>
+ <button label="Anuluj" label_selected="Anuluj" name="cancel btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_perm_prefs.xml b/indra/newview/skins/default/xui/pl/floater_perm_prefs.xml
index 834552e2b0..2128cfa3c8 100644
--- a/indra/newview/skins/default/xui/pl/floater_perm_prefs.xml
+++ b/indra/newview/skins/default/xui/pl/floater_perm_prefs.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="perm prefs" title="PRAWA DOMYÅšLNE">
+<floater name="perm prefs" title="USTAWIENIA DOMYÅšLNE ÅADOWANIA">
<panel label="Prawa" name="permissions">
<button label="?" label_selected="?" name="help"/>
<check_box label="Udostępnij grupie" name="share_with_group"/>
<check_box label="Pozwól kopiować każdemu" name="everyone_copy"/>
<text name="NextOwnerLabel">
- Następny właściciel:
+ Następny Właściciel:
</text>
<check_box label="Modyfikuje" name="next_owner_modify"/>
<check_box label="Kopiuje" name="next_owner_copy"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_post_process.xml b/indra/newview/skins/default/xui/pl/floater_post_process.xml
index 6bd91f97b1..a3515915bf 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_post_process.xml
+++ b/indra/newview/skins/default/xui/pl/floater_post_process.xml
@@ -16,40 +16,40 @@
</text>
<slider label="" name="wmiColorFilterContrast" />
<text name="wmiColorFilterBaseText">
- Kontrast Koloru Podstawowego
+ Kontrast koloru podstawowego
</text>
<slider label="R" name="wmiColorFilterBaseR" />
<slider label="G" name="wmiColorFilterBaseG" />
<slider label="B" name="wmiColorFilterBaseB" />
<slider label="I" name="wmiColorFilterBaseI" />
</panel>
- <panel label="Wizja Nocna" name="wmiNightVisionPanel">
+ <panel label="Wizja nocna" name="wmiNightVisionPanel">
<check_box label="Udostępnij" name="wmiNightVisionToggle" />
<text name="wmiNightVisionBrightMultText">
- Wielokrotne Wzmocnienie Światła
+ Wielokrotne wzmocnienie światła
</text>
<slider label="" name="wmiNightVisionBrightMult" />
<text name="wmiNightVisionNoiseSizeText">
- Rozmiar Szumu
+ Rozmiar szumu
</text>
<slider label="" name="wmiNightVisionNoiseSize" />
<text name="wmiNightVisionNoiseStrengthText">
- Moc Szumu
+ Moc szumu
</text>
<slider label="" name="wmiNightVisionNoiseStrength" />
</panel>
<panel label="Bloom" name="wmiBloomPanel">
<check_box label="Udostępnij" name="wmiBloomToggle" />
<text name="wmiBloomExtractText">
- Ekstracja Luminacji
+ Ekstracja luminacji
</text>
<slider label="" name="wmiBloomExtract" />
<text name="wmiBloomSizeText">
- Rozmiar Rozmazania Obrazu
+ Rozmiar rozmazania obrazu
</text>
<slider label="" name="wmiBloomSize" />
<text name="wmiBloomStrengthText">
- Moc Rozmazania Obrazu
+ Moc rozmazania obrazu
</text>
<slider label="" name="wmiBloomStrength" />
</panel>
diff --git a/indra/newview/skins/default/xui/pl/floater_postcard.xml b/indra/newview/skins/default/xui/pl/floater_postcard.xml
index 8f4018924d..095974aa61 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/pl/floater_postcard.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Postcard" title="WYŚLIJ POCZTÓWKĘ">
+<floater name="Postcard" title="WYŚLIJ POCZTÓWKĘ (EMAIL)">
<text name="to_label">
Email Odbiorcy:
</text>
@@ -20,12 +20,12 @@
Wpisz treść swojej wiadomości tutaj
</text_editor>
<text name="fine_print">
- Jeżeli odbiorca tej pocztówki dołączy do [SECOND_LIFE], otrzymasz bonusa.
+ Jeżeli Odbiorca tej pocztówki dołączy do [SECOND_LIFE], otrzymasz bonus.
</text>
<button label="Anuluj" name="cancel_btn"/>
<button label="Wyślij" name="send_btn"/>
<string name="default_subject">
- Pocztówki z [SECOND_LIFE]
+ Pocztówka z [SECOND_LIFE].
</string>
<string name="default_message">
Sprawdź i przekonaj się sam!
diff --git a/indra/newview/skins/default/xui/pl/floater_preferences.xml b/indra/newview/skins/default/xui/pl/floater_preferences.xml
index 2be663283f..3f62d764c6 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/pl/floater_preferences.xml
@@ -1,8 +1,15 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Preferences" title="USTAWIENIA">
- <button label="OK" label_selected="OK" name="OK" />
- <button label="Anuluj" label_selected="Anuluj" name="Cancel" />
- <button label="Zastosuj" label_selected="Zastosuj" name="Apply" />
- <button label="O Second Life" label_selected="O Second Life" name="About..." />
- <button label="Pomoc" label_selected="Pomoc" name="Help" />
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="Anuluj" label_selected="Anuluj" name="Cancel"/>
+ <tab_container name="pref core">
+ <panel label="Ogólne" name="general"/>
+ <panel label="Grafika" name="display"/>
+ <panel label="Prywatność" name="im"/>
+ <panel label="Dźwięk &amp; Media" name="audio"/>
+ <panel label="Czat" name="chat"/>
+ <panel label="Powiadomienia" name="msgs"/>
+ <panel label="Ustawienie" name="input"/>
+ <panel label="Zaawansowane" name="advanced1"/>
+ </tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_preview_animation.xml b/indra/newview/skins/default/xui/pl/floater_preview_animation.xml
index 7139c470a4..6ce6914771 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/pl/floater_preview_animation.xml
@@ -1,10 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_anim">
+ <floater.string name="Title">
+ Animacja: [NAME]
+ </floater.string>
<text name="desc txt">
Opis:
</text>
- <button label="Używaj w Świecie" label_selected="Stop" name="Anim play btn"
- tool_tip="Animacja będzie widoczna dla wszystkich." width="131" left="20"/>
- <button label="Używaj lokalnie" label_selected="Stop" name="Anim audition btn"
- tool_tip="Animacja będzie widoczna tylko dla Ciebie." width="125" left="162"/>
+ <button label="Uruchom in-world" label_selected="Stop" left="20" name="Anim play btn" tool_tip="Uruchom animacjÄ™ by widzieli jÄ… pozostali Rezydenci" width="131"/>
+ <button label="Używaj lokalnie" label_selected="Stop" left="162" name="Anim audition btn" tool_tip="Uruchom animację widoczną tylko przez Ciebie" width="125"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_preview_classified.xml b/indra/newview/skins/default/xui/pl/floater_preview_classified.xml
index eae9ba2690..d3d6588397 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_preview_classified.xml
+++ b/indra/newview/skins/default/xui/pl/floater_preview_classified.xml
@@ -1,2 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="classified_preview" title="REKLAMA" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="classified_preview" title="INFO O REKLAMIE">
+ <floater.string name="Title">
+ Reklama: [NAME]
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_preview_event.xml b/indra/newview/skins/default/xui/pl/floater_preview_event.xml
index 9fc0ff4da6..5d9e47bc00 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_preview_event.xml
+++ b/indra/newview/skins/default/xui/pl/floater_preview_event.xml
@@ -1,2 +1,6 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="event_preview" title="INFORMACJE O IMPREZIE" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="event_preview" title="INFO O IMPREZIE">
+ <floater.string name="Title">
+ Impreza: [NAME]
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_preview_gesture.xml b/indra/newview/skins/default/xui/pl/floater_preview_gesture.xml
index 1c7a3f6631..05758ac04d 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/pl/floater_preview_gesture.xml
@@ -1,14 +1,32 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="gesture_preview">
- <string name="stop_txt">
+ <floater.string name="step_anim">
+ Animacja
+ </floater.string>
+ <floater.string name="step_sound">
+ Dźwięk:
+ </floater.string>
+ <floater.string name="step_chat">
+ Czat:
+ </floater.string>
+ <floater.string name="step_wait">
+ Wstrzymaj:
+ </floater.string>
+ <floater.string name="stop_txt">
Stop
- </string>
- <string name="preview_txt">
+ </floater.string>
+ <floater.string name="preview_txt">
Pokaż
- </string>
- <string name="none_text">
+ </floater.string>
+ <floater.string name="none_text">
-- Brak --
- </string>
+ </floater.string>
+ <floater.string name="Title">
+ Gest: [NAME]
+ </floater.string>
+ <text name="name_text">
+ Nazwa:
+ </text>
<text name="desc_label">
Opis:
</text>
@@ -27,29 +45,23 @@
<text name="library_label">
Zbiór:
</text>
+ <scroll_list name="library_list"/>
+ <button label="Dodaj &gt;&gt;" name="add_btn"/>
<text name="steps_label">
Etapy:
</text>
- <scroll_list name="library_list">
- Animacja
-Dźwięk
-Czat
-Wstrzymaj
- </scroll_list>
- <button label="Dodaj &gt;&gt;" name="add_btn"/>
- <button label="W Górę" name="up_btn"/>
- <button label="W Dół" name="down_btn"/>
+ <button label="W górę" name="up_btn"/>
+ <button label="W dół" name="down_btn"/>
<button label="Usuń" name="delete_btn"/>
- <text name="help_label">
- Wszystkie etapy nastÄ…piÄ… razem,
-chyba, że dodasz pauzy.
- </text>
<radio_group name="animation_trigger_type">
- <radio_item name="start" label="Start" />
- <radio_item name="stop" label="Stop" />
+ <radio_item label="Start" name="start"/>
+ <radio_item label="Stop" name="stop"/>
</radio_group>
<check_box label="do końca animacji" name="wait_anim_check"/>
<check_box label="czas w sekundach" name="wait_time_check"/>
+ <text name="help_label">
+ Wszystkie etapy nastąpią razem, chyba, że dodasz pauzy.
+ </text>
<check_box label="Aktywny" name="active_check" tool_tip="Aktywne gesty można włączać używając przypisanej frazy w czacie albo używając przypisanego klawisza skrótowego. W przypaku konfliktu przypisań gesty zazwyczaj nie będą działać."/>
<button label="Pokaż" name="preview_btn"/>
<button label="Zapisz" name="save_btn"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/pl/floater_preview_gesture_info.xml
new file mode 100644
index 0000000000..d31cada96d
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_preview_gesture_info.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="GEST"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/pl/floater_preview_gesture_shortcut.xml
new file mode 100644
index 0000000000..d33b799476
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_preview_gesture_shortcut.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="GESTY">
+ <text name="trigger_label">
+ Czat:
+ </text>
+ <text name="key_label">
+ Klawiatura:
+ </text>
+ <combo_box label="Żaden" name="modifier_combo"/>
+ <combo_box label="Żaden" name="key_combo"/>
+ <text name="replace_text" tool_tip="Zmień włączającą frazę na inną. Na przykład zmiana &apos;witam&apos; na &apos;cześć&apos; zmieni czat &apos;Chciałem powiedzieć witam&apos; na &apos;Chciałem powiedzieć cześć&apos; i pokaże animację!">
+ Zamień na:
+ </text>
+ <line_editor name="replace_editor" tool_tip="Zmień włączającą frazę na inną. Na przykład zmiana &apos;witam&apos; na &apos;cześć&apos; zmieni czat &apos;Chciałem powiedzieć witam&apos; na &apos;Chciałem powiedzieć cześć&apos; i pokaże animację"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/pl/floater_preview_gesture_steps.xml
new file mode 100644
index 0000000000..6592d9dad0
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_preview_gesture_steps.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="GESTY"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_preview_notecard.xml b/indra/newview/skins/default/xui/pl/floater_preview_notecard.xml
index b9f80490ab..1ad07c236b 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/pl/floater_preview_notecard.xml
@@ -1,16 +1,22 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview notecard" title="NOTA:">
- <button label="Zapisz" label_selected="Zapisz" name="Save" />
+ <floater.string name="no_object">
+ Nie można znaleźć obiektu zawierającego tą notkę.
+ </floater.string>
+ <floater.string name="not_allowed">
+ Nie masz pozwolenia na zobaczenie tej notki.
+ </floater.string>
+ <floater.string name="Title">
+ Notka: [NAME]
+ </floater.string>
+ <floater.string label="Zapisz" label_selected="Zapisz" name="Save">
+ Zapisz
+ </floater.string>
<text name="desc txt">
Opis:
</text>
<text_editor name="Notecard Editor">
Åadowanie...
</text_editor>
- <string name="no_object">
- Nie można znaleść obiektu zawierającego tą notkę.
- </string>
- <string name="not_allowed">
- Nie masz pozwolenia na zobaczenie tej notki.
- </string>
+ <button label="Zapisz" label_selected="Zapisz" name="Save"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_preview_sound.xml b/indra/newview/skins/default/xui/pl/floater_preview_sound.xml
index 656b9bec38..d02b3ca75e 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_preview_sound.xml
+++ b/indra/newview/skins/default/xui/pl/floater_preview_sound.xml
@@ -1,12 +1,11 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_sound">
+ <floater.string name="Title">
+ Dźwięk: [NAME]
+ </floater.string>
<text name="desc txt">
Opis:
</text>
- <button label="Odtwarzaj Lokalnie" label_selected="Odtwarzaj Lokalnie"
- name="Sound audition btn"
- tool_tip="Dźwięk będzie słyszalny tylko dla Ciebie." />
- <button label="Odtwarzaj w Åšwiecie" label_selected="Odtwarzaj w Åšwiecie"
- name="Sound play btn"
- tool_tip="Dźwięk będzie słyszalny przez wszystkich." width="130" left_delta="-136"/>
+ <button label="Odtwarzaj" label_selected="Odtwarzaj" left_delta="-136" name="Sound play btn" tool_tip="Dźwięk będzie słyszalny przez wszystkich." width="130"/>
+ <button label="Odtwarzaj Lokalnie" label_selected="Odtwarzaj lokalnie" name="Sound audition btn" tool_tip="Dźwięk będzie słyszalny tylko dla Ciebie."/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_preview_texture.xml b/indra/newview/skins/default/xui/pl/floater_preview_texture.xml
index 8bcd800411..e58acee139 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/pl/floater_preview_texture.xml
@@ -1,9 +1,47 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_texture">
+ <floater.string name="Title">
+ Tekstura: [NAME]
+ </floater.string>
+ <floater.string name="Copy">
+ Kopiuj do Szafy
+ </floater.string>
<text name="desc txt">
Opis:
</text>
<text name="dimensions">
- Wymiary: [WIDTH] x [HEIGHT]
+ [WIDTH]px x [HEIGHT]px
</text>
+ <text name="aspect_ratio">
+ Zobacz proporcje
+ </text>
+ <combo_box name="combo_aspect_ratio" tool_tip="Wyświetl w domyślnych proporcjach">
+ <combo_item name="Unconstrained">
+ Swobodny
+ </combo_item>
+ <combo_item name="1:1" tool_tip="Insygnia Grupy lub realny Profil">
+ 1:1
+ </combo_item>
+ <combo_item name="4:3" tool_tip="[SECOND_LIFE] profil">
+ 4:3
+ </combo_item>
+ <combo_item name="10:7" tool_tip="Reklamy i atrakcje, landmarki">
+ 10:7
+ </combo_item>
+ <combo_item name="3:2" tool_tip="O Posiadłości">
+ 3:2
+ </combo_item>
+ <combo_item name="16:10">
+ 16:10
+ </combo_item>
+ <combo_item name="16:9" tool_tip="LubiÄ™">
+ 16:9
+ </combo_item>
+ <combo_item name="2:1">
+ 2:1
+ </combo_item>
+ </combo_box>
+ <button label="OK" name="Keep"/>
+ <button label="Wyrzuć" name="Discard"/>
+ <button label="Zapisz jako" name="save_tex_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_publish_classified.xml b/indra/newview/skins/default/xui/pl/floater_publish_classified.xml
new file mode 100644
index 0000000000..12cda04e10
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_publish_classified.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="publish_classified" title="Publikowanie Reklam">
+ <text name="explanation_text">
+ Twoja reklama zostanie wyświetlana przez okres jednego tygodnia od daty jej publikacji.
+
+Pamiętaj, opłaty za reklamy nie podlegają prawu zwrotu.
+ </text>
+ <spinner label="Cena za ReklamÄ™:" name="price_for_listing" tool_tip="Cena za umieszczenie reklamy w wyszukiwarce." value="50"/>
+ <text name="l$_text" value="L$"/>
+ <text name="more_info_text">
+ Więcej info (link do pomocy)
+ </text>
+ <button label="Publikuj" name="publish_btn"/>
+ <button label="Anuluj" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_region_info.xml b/indra/newview/skins/default/xui/pl/floater_region_info.xml
index ca3c1391db..a1f7785f48 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_region_info.xml
+++ b/indra/newview/skins/default/xui/pl/floater_region_info.xml
@@ -1,2 +1,2 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="regioninfo" title="REGION/MAJĄTEK" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="regioninfo" title="REGION/MAJĄTEK"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_report_abuse.xml b/indra/newview/skins/default/xui/pl/floater_report_abuse.xml
index 18ce1b230f..a6f8ba6c11 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/pl/floater_report_abuse.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_report_abuse" title="RAPORT O NADUŻYCIU">
<floater.string name="Screenshot">
- Zdjęcie Ekranu
+ Zdjęcie ekranu
</floater.string>
<check_box label="Załącz zdjęcie do raportu" name="screen_check"/>
<text name="reporter_title">
@@ -40,42 +40,42 @@
</text>
<combo_box name="category_combo" tool_tip="Wybór kategorii - wybierz kategorię, której dotyczy raport">
<combo_box.item label="Wybierz KategoriÄ™:" name="Select_category"/>
- <combo_box.item label="Wiek &gt; Udawanie Nieletniej Osoby" name="Age__Age_play"/>
+ <combo_box.item label="Wiek &gt; Udawanie nieletniej osoby" name="Age__Age_play"/>
<combo_box.item label="Wiek &gt; Dorosły Rezydent w Teen Second Life" name="Age__Adult_resident_on_Teen_Second_Life"/>
<combo_box.item label="Wiek &gt; Nieletni Rezydent poza Teen Second Life" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
- <combo_box.item label="Napaść &gt; Strefa Militarna / Niebezpieczny Obszar" name="Assault__Combat_sandbox___unsafe_area"/>
- <combo_box.item label="Napaść &gt; Bezpieczny Obszar" name="Assault__Safe_area"/>
- <combo_box.item label="Napaść &gt; Obszar do Testowania Broni" name="Assault__Weapons_testing_sandbox"/>
- <combo_box.item label="Handel &gt; Niedostarczenie Produktu lub Usługi" name="Commerce__Failure_to_deliver_product_or_service"/>
- <combo_box.item label="Naruszenie Prywatności &gt; Dane Osobiste" name="Disclosure__Real_world_information"/>
- <combo_box.item label="Ujawnienie &gt; Monitorowanie Czatu" name="Disclosure__Remotely_monitoring chat"/>
- <combo_box.item label="Ujawnienie &gt; Dane z Second Life / Czatu / IM" name="Disclosure__Second_Life_information_chat_IMs"/>
- <combo_box.item label="Zakłócanie Spokoju &gt; Nieuczciwe Używanie Zasobów Regionu" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
- <combo_box.item label="Zakłócanie Spokoju &gt; Przesadnie Skryptowane Obiekty" name="Disturbing_the_peace__Excessive_scripted_objects"/>
- <combo_box.item label="Zakłócanie Spokoju &gt; Śmiecenie Obiektami" name="Disturbing_the_peace__Object_littering"/>
- <combo_box.item label="Zakłócanie Spokoju &gt; Ciągły Spam" name="Disturbing_the_peace__Repetitive_spam"/>
- <combo_box.item label="Zakłócanie Spokoju &gt; Nieporządany Spam Reklamowy" name="Disturbing_the_peace__Unwanted_advert_spam"/>
+ <combo_box.item label="Napaść &gt; strefa militarna / niebezpieczny obszar" name="Assault__Combat_sandbox___unsafe_area"/>
+ <combo_box.item label="Napaść &gt; nezpieczny obszar" name="Assault__Safe_area"/>
+ <combo_box.item label="Napaść &gt; obszar do testowania broni" name="Assault__Weapons_testing_sandbox"/>
+ <combo_box.item label="Handel &gt; niedostarczenie produktu lub usługi" name="Commerce__Failure_to_deliver_product_or_service"/>
+ <combo_box.item label="Naruszenie prywatności &gt; dane osobiste" name="Disclosure__Real_world_information"/>
+ <combo_box.item label="Ujawnienie &gt; monitorowanie czatu" name="Disclosure__Remotely_monitoring chat"/>
+ <combo_box.item label="Ujawnienie &gt; dane z Second Life / Czatu / IM" name="Disclosure__Second_Life_information_chat_IMs"/>
+ <combo_box.item label="Zakłócanie spokoju &gt; nieuczciwe używanie zasobów Regionu" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
+ <combo_box.item label="Zakłócanie spokoju &gt; przesadnie skryptowane obiekty" name="Disturbing_the_peace__Excessive_scripted_objects"/>
+ <combo_box.item label="Zakłócanie spokoju &gt; śmiecenie obiektami" name="Disturbing_the_peace__Object_littering"/>
+ <combo_box.item label="Zakłócanie spokoju &gt; ciągły spam" name="Disturbing_the_peace__Repetitive_spam"/>
+ <combo_box.item label="Zakłócanie spokoju &gt; nieporządany spam reklamowy" name="Disturbing_the_peace__Unwanted_advert_spam"/>
<combo_box.item label="Oszustwo &gt; L$" name="Fraud__L$"/>
<combo_box.item label="Oszustwo &gt; Posiadłości" name="Fraud__Land"/>
- <combo_box.item label="Oszustwo &gt; Piramidy albo Listy ÅaÅ„cuchowe" name="Fraud__Pyramid_scheme_or_chain_letter"/>
+ <combo_box.item label="Oszustwo &gt; piramidy albo listy łańcuchowe" name="Fraud__Pyramid_scheme_or_chain_letter"/>
<combo_box.item label="Oszustwo &gt; US$" name="Fraud__US$"/>
- <combo_box.item label="Prześladowanie &gt; Farmy Reklamowe / Wizualny Spam" name="Harassment__Advert_farms___visual_spam"/>
- <combo_box.item label="Prześladowanie &gt; Zniesławianie Jedostek lub Grup" name="Harassment__Defaming_individuals_or_groups"/>
- <combo_box.item label="Prześladowanie &gt; Ograniczanie Ruchu" name="Harassment__Impeding_movement"/>
- <combo_box.item label="Prześladowanie &gt; Molestowanie Seksualne" name="Harassment__Sexual_harassment"/>
- <combo_box.item label="PrzeÅ›ladowanie &gt; Namawianie/ZachÄ™canie Innych do Åamania Warunków Umowy (ToS)" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
+ <combo_box.item label="Prześladowanie &gt; farmy reklamowe / wizualny spam" name="Harassment__Advert_farms___visual_spam"/>
+ <combo_box.item label="Prześladowanie &gt; zniesławianie jedostek lub grup" name="Harassment__Defaming_individuals_or_groups"/>
+ <combo_box.item label="Prześladowanie &gt; Ograniczanie ruchu" name="Harassment__Impeding_movement"/>
+ <combo_box.item label="Prześladowanie &gt; Molestowanie seksualne" name="Harassment__Sexual_harassment"/>
+ <combo_box.item label="Prześladowanie &gt; Namawianie/Zachęcanie innych do łamania warunków umowy (ToS)" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
<combo_box.item label="Prześladowanie &gt; Znieważanie Słowne" name="Harassment__Verbal_abuse"/>
- <combo_box.item label="Nieprzyzwoitość &gt; Obraźliwa Treść lub Postępowanie" name="Indecency__Broadly_offensive_content_or_conduct"/>
- <combo_box.item label="Nieprzyzwoitość &gt; Niestosowne Imię Awatara" name="Indecency__Inappropriate_avatar_name"/>
- <combo_box.item label="Nieprzyzwoitość &gt; Obraźliwa treść i postępowanie w regionie &apos;PG&apos;" name="Indecency__Mature_content_in_PG_region"/>
- <combo_box.item label="Nieprzyzwoitość &gt; Obraźliwa treść i postępowanie w regionie &apos;Mature&apos;" name="Indecency__Inappropriate_content_in_Mature_region"/>
- <combo_box.item label="Naruszenie Własności Intelektualnej &gt; Usunięcie Treści" name="Intellectual_property_infringement_Content_Removal"/>
- <combo_box.item label="Naruszenie Własności Intelektualnej &gt; CopyBot albo Nadużycie Przywilejów" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
+ <combo_box.item label="Nieprzyzwoitość &gt; Obraźliwa treść lub postępowanie" name="Indecency__Broadly_offensive_content_or_conduct"/>
+ <combo_box.item label="Nieprzyzwoitość &gt; Niestosowne imię awatara" name="Indecency__Inappropriate_avatar_name"/>
+ <combo_box.item label="Nieprzyzwoitość &gt; Obraźliwa treść i postępowanie w Regionie &apos;PG&apos;" name="Indecency__Mature_content_in_PG_region"/>
+ <combo_box.item label="Nieprzyzwoitość &gt; Obraźliwa treść i postępowanie w Regionie &apos;Mature&apos;" name="Indecency__Inappropriate_content_in_Mature_region"/>
+ <combo_box.item label="Naruszenie własności intelektualnej &gt; usunięcie treści" name="Intellectual_property_infringement_Content_Removal"/>
+ <combo_box.item label="Naruszenie własności intelektualnej &gt; CopyBot albo nadużycie przywilejów" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
<combo_box.item label="Nietolerancja" name="Intolerance"/>
- <combo_box.item label="Posiadłości &gt; Nadużywanie Piaskownicy" name="Land__Abuse_of_sandbox_resources"/>
- <combo_box.item label="Posiadłości &gt; Naruszenie &gt; Obiekty/Tekstury" name="Land__Encroachment__Objects_textures"/>
- <combo_box.item label="Posiadłości &gt; Naruszenie &gt; Cząsteczki" name="Land__Encroachment__Particles"/>
- <combo_box.item label="Posiadłości &gt; Naruszenie &gt; Drzewa/Rośliny" name="Land__Encroachment__Trees_plants"/>
+ <combo_box.item label="Posiadłości &gt; nadużywanie piaskownicy" name="Land__Abuse_of_sandbox_resources"/>
+ <combo_box.item label="Posiadłości &gt; naruszenie &gt; obiekty/tekstury" name="Land__Encroachment__Objects_textures"/>
+ <combo_box.item label="Posiadłości &gt; naruszenie &gt; cząsteczki" name="Land__Encroachment__Particles"/>
+ <combo_box.item label="Posiadłości &gt; naruszenie &gt; drzewa/rośliny" name="Land__Encroachment__Trees_plants"/>
<combo_box.item label="Zakłady/Hazard" name="Wagering_gambling"/>
<combo_box.item label="Inne" name="Other"/>
</combo_box>
diff --git a/indra/newview/skins/default/xui/pl/floater_script_debug.xml b/indra/newview/skins/default/xui/pl/floater_script_debug.xml
index 714a600262..714a600262 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_script_debug.xml
+++ b/indra/newview/skins/default/xui/pl/floater_script_debug.xml
diff --git a/indra/newview/skins/default/xui/pl/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/pl/floater_script_debug_panel.xml
new file mode 100644
index 0000000000..e70a30fa24
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_script_debug_panel.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script" short_title="[ALL SCRIPTS]" title="[ALL SCRIPTS]"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_script_limits.xml b/indra/newview/skins/default/xui/pl/floater_script_limits.xml
new file mode 100644
index 0000000000..dd13d641a0
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_script_limits.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="scriptlimits" title="SKRYPT"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_script_preview.xml b/indra/newview/skins/default/xui/pl/floater_script_preview.xml
index e3e72e15a3..eb6a1df77b 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_script_preview.xml
+++ b/indra/newview/skins/default/xui/pl/floater_script_preview.xml
@@ -1,5 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview lsl text" title="SKRYPT: SKRYPT OBROTU">
+ <floater.string name="Title">
+ Skrypt: [NAME]
+ </floater.string>
<text name="desc txt">
Opis:
</text>
diff --git a/indra/newview/skins/default/xui/pl/floater_script_queue.xml b/indra/newview/skins/default/xui/pl/floater_script_queue.xml
index 7655f5fcac..bdfdba569e 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/pl/floater_script_queue.xml
@@ -1,4 +1,19 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="queue" title="ZRESETUJ PRACĘ W TOKU">
- <button label="Zamknij" label_selected="Zamknij" name="close" />
+ <floater.string name="Starting">
+ Rozpoczęcie [START] [COUNT] elementów.
+ </floater.string>
+ <floater.string name="Done">
+ Wykonane.
+ </floater.string>
+ <floater.string name="Resetting">
+ Trwa resetowanie
+ </floater.string>
+ <floater.string name="Running">
+ Skrypt działa
+ </floater.string>
+ <floater.string name="NotRunning">
+ Skrypt nie działa
+ </floater.string>
+ <button label="Zamknij" label_selected="Zamknij" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_script_search.xml b/indra/newview/skins/default/xui/pl/floater_script_search.xml
index 255ab4264c..cb010daee4 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_script_search.xml
+++ b/indra/newview/skins/default/xui/pl/floater_script_search.xml
@@ -1,10 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="script search" title="SZUKAJ SKRYPTU">
- <check_box label="CapsLoock Nieaktywny" name="case_text" />
- <button label="Szukaj" label_selected="Szukaj" name="search_btn" />
- <button label="Zamień" label_selected="Zamień" name="replace_btn" />
- <button label="Zamień Wszystko" label_selected="Zamień Wszystko"
- name="replace_all_btn" />
+ <check_box label="CapsLoock nieaktywny" name="case_text"/>
+ <button label="Szukaj" label_selected="Szukaj" name="search_btn"/>
+ <button label="Zamień" label_selected="Zamień" name="replace_btn"/>
+ <button label="Zamień Wszystko" label_selected="Zamień wszystko" name="replace_all_btn"/>
<text name="txt">
Szukaj
</text>
diff --git a/indra/newview/skins/default/xui/pl/floater_search.xml b/indra/newview/skins/default/xui/pl/floater_search.xml
new file mode 100644
index 0000000000..a0198670e4
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_search.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_search" title="SZUKAJ">
+ <floater.string name="loading_text">
+ Åadowanie...
+ </floater.string>
+ <floater.string name="done_text">
+ Wykonano
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="browser_layout">
+ <text name="refresh_search">
+ Ustaw wyszukiwanie na odzwierciedlanie poziomu boskiego
+ </text>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_select_key.xml b/indra/newview/skins/default/xui/pl/floater_select_key.xml
index 194a6da1bd..190ad61352 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_select_key.xml
+++ b/indra/newview/skins/default/xui/pl/floater_select_key.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="modal container" title="">
- <button label="Anuluj" label_selected="Anuluj" name="Cancel" />
+ <button label="Anuluj" label_selected="Anuluj" name="Cancel"/>
<text name="Save item as:">
- By wybrać wciśnij klawisz
+ Naciśnij klawisz aby ustawić przełącznik Mówić.
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_sell_land.xml b/indra/newview/skins/default/xui/pl/floater_sell_land.xml
index a306ec2c34..eb1ed74797 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/pl/floater_sell_land.xml
@@ -1,62 +1,65 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="sell land" title="SELL LAND">
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <text name="info_parcel_label">
- Posiadłość:
- </text>
- <text name="info_parcel">
- NAZWA POSIADÅOÅšCI
- </text>
- <text name="info_size_label">
- Obszar:
- </text>
- <text name="info_size">
- [AREA] m.
- </text>
- <text name="info_action">
- Aby sprzedać tą Posiadłość:
- </text>
- <text name="price_label">
- Ustal cenÄ™:
- </text>
- <text name="price_text">
- Wybierz właściwą cenę za tą Posiadłość.
- </text>
- <text name="price_ld">
- L$
- </text>
- <text name="price_per_m">
- ([PER_METER]L$ za metr)
- </text>
- <text name="sell_to_label">
- Kupiec:
- </text>
- <text name="sell_to_text">
- Wybierz sprzedaż dla kogokolwiek albo dla wybranego kupca.
- </text>
- <combo_box name="sell_to">
- <combo_box.item name="--selectone--" label="wybierz --" />
- <combo_box.item name="Anyone" label="Ktokolwiek" />
- <combo_box.item name="Specificuser:" label="Wybrany kupiec:" />
- </combo_box>
- <button label="Wybierz..." name="sell_to_select_agent" />
- <text name="sell_objects_label">
- Obiekty sprzedawane razem z Posiadłością?
- </text>
- <text name="sell_objects_text">
- Przekazywalne obiekty właściciela Posiadłości zmienią właściciela.
- </text>
- <radio_group name="sell_objects">
- <radio_item name="no" label="Nie, zatrzymaj obiekty" />
- <radio_item name="yes" label="Tak, sprzedaj obiekty razem z Posiadłością" />
- </radio_group>
- <button label="Pokaż Obiekty" name="show_objects" />
- <text name="nag_message_label">
- PAMIĘTAJ: Sprzedaż jest nieodwracalna.
- </text>
- <button label="Wystaw Ziemię na Sprzedaż" name="sell_btn" />
- <button label="Anuluj" name="cancel_btn" />
- </panel>
- </scroll_container>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="sell land" title="SPRZEDAJ POSIADÅOŚĆ">
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="info_parcel_label">
+ Posiadłość:
+ </text>
+ <text name="info_parcel">
+ NAZWA POSIADÅOÅšCI
+ </text>
+ <text name="info_size_label">
+ Rozmiar:
+ </text>
+ <text name="info_size">
+ [AREA] m²
+ </text>
+ <text name="info_action">
+ Aby sprzedać tą Posiadłość:
+ </text>
+ <text name="price_label">
+ 1. Ustal cenÄ™:
+ </text>
+ <text name="price_text">
+ Wybierz właściwą cenę za tą Posiadłość.
+ </text>
+ <text name="price_ld">
+ L$
+ </text>
+ <line_editor name="price">
+ 0
+ </line_editor>
+ <text name="price_per_m">
+ (L$[PER_METER] za m²)
+ </text>
+ <text name="sell_to_label">
+ 2. Sprzedaj Posiadłość:
+ </text>
+ <text name="sell_to_text">
+ Wybierz sprzedaż dla kogokolwiek albo dla wybranego kupca.
+ </text>
+ <combo_box name="sell_to">
+ <combo_box.item label="- Wybierz -" name="--selectone--"/>
+ <combo_box.item label="Ktokolwiek" name="Anyone"/>
+ <combo_box.item label="Wybrany Kupiec:" name="Specificuser:"/>
+ </combo_box>
+ <button label="Wybierz" name="sell_to_select_agent"/>
+ <text name="sell_objects_label">
+ 3. Obiekty sprzedawane razem z Posiadłością?
+ </text>
+ <text name="sell_objects_text">
+ Przekazywalne obiekty właściciela Posiadłości zmienią właściciela.
+ </text>
+ <radio_group name="sell_objects">
+ <radio_item label="Nie, zatrzymaj obiekty" name="no"/>
+ <radio_item label="Tak, sprzedaj obiekty razem z Posiadłością" name="yes"/>
+ </radio_group>
+ <button label="Pokaż Obiekty" name="show_objects"/>
+ <text name="nag_message_label">
+ PAMIĘTAJ: Sprzedaż jest nieodwracalna.
+ </text>
+ <button label="Wystaw ziemię na sprzedaż" name="sell_btn"/>
+ <button label="Anuluj" name="cancel_btn"/>
+ </panel>
+ </scroll_container>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_settings_debug.xml b/indra/newview/skins/default/xui/pl/floater_settings_debug.xml
index f87e2edecc..7c29d52e7b 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/pl/floater_settings_debug.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="settings_debug" title="USTAWIENIA USUWANIA BÅĘDÓW">
- <combo_box name="boolean_combo">
- <combo_box.item name="TRUE" label="PRAWDA" />
- <combo_box.item name="FALSE" label="NIEPRAWDA" />
- </combo_box>
- <color_swatch label="Kolor" name="color_swatch"/>
+<floater name="settings_debug" title="USTAWIENIA DEBUGOWANIA">
+ <radio_group name="boolean_combo">
+ <radio_item label="PRAWDA" name="TRUE" value="prawda"/>
+ <radio_item label="NIEPRAWDA" name="FALSE" value=""/>
+ </radio_group>
+ <color_swatch label="Kolor" name="val_color_swatch"/>
<spinner label="x" name="val_spinner_1"/>
<spinner label="x" name="val_spinner_2"/>
<spinner label="x" name="val_spinner_3"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_snapshot.xml b/indra/newview/skins/default/xui/pl/floater_snapshot.xml
index c807087170..df4e5b43bc 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/pl/floater_snapshot.xml
@@ -4,23 +4,23 @@
Lokacja zapisu
</text>
<radio_group label="Rodzaje zdjęć" name="snapshot_type_radio">
- <radio_item name="postcard" label="Wyślij (email) pocztówkę" />
- <radio_item name="texture" label="Załaduj do szafy ([AMOUNT]L$)" />
- <radio_item name="local" label="Zapisz na dysk" />
+ <radio_item label="Email" name="postcard"/>
+ <radio_item label="Załaduj do Szafy (L$[AMOUNT])" name="texture"/>
+ <radio_item label="Zapisz na dysk" name="local"/>
</radio_group>
<text name="file_size_label">
- Rozmiar pliku: [SIZE] KB
+ [SIZE] KB
</text>
- <button label="Odśwież Zdjęcie" name="new_snapshot_btn"/>
+ <button label="Odśwież zdjęcie" name="new_snapshot_btn"/>
<button label="Wyślij" name="send_btn"/>
<button label="Załaduj (L$[AMOUNT])" name="upload_btn"/>
<flyout_button label="Zapisz" name="save_btn" tool_tip="Zapisz zdjęcie na dysk">
- <flyout_button.item name="save_item" label="Zapisz"/>
- <flyout_button.item name="saveas_item" label="Zapisz Jako..."/>
+ <flyout_button.item label="Zapisz" name="save_item"/>
+ <flyout_button.item label="Zapisz jako..." name="saveas_item"/>
</flyout_button>
<button label="Anuluj" name="discard_btn"/>
- <button label="Więcej &gt;&gt;" name="more_btn" tool_tip="Ustawienia Zaawansowane"/>
- <button label="&lt;&lt; Mniej" name="less_btn" tool_tip="Ustawienia Zaawansowane"/>
+ <button label="Więcej" name="more_btn" tool_tip="Zaawansowane"/>
+ <button label="Mniej" name="less_btn" tool_tip="Zaawansowane"/>
<text name="type_label2">
Wymiar
</text>
@@ -28,45 +28,45 @@
Format
</text>
<combo_box label="Rozdzielczość" name="postcard_size_combo">
- <combo_box.item name="CurrentWindow" label="Obecne Okno" />
- <combo_box.item name="640x480" label="640x480" />
- <combo_box.item name="800x600" label="800x600" />
- <combo_box.item name="1024x768" label="1024x768" />
- <combo_box.item name="Custom" label="Wybierz" />
+ <combo_box.item label="Obecne Okno" name="CurrentWindow"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="Wybierz" name="Custom"/>
</combo_box>
<combo_box label="Rozdzielczość" name="texture_size_combo">
- <combo_box.item name="CurrentWindow" label="Obecne Okno" />
- <combo_box.item name="Small(128x128)" label="Mały (128x128)" />
- <combo_box.item name="Medium(256x256)" label="Åšredni (256x256)" />
- <combo_box.item name="Large(512x512)" label="Duży (512x512)" />
- <combo_box.item name="Custom" label="Wybierz" />
+ <combo_box.item label="Obecne Okno" name="CurrentWindow"/>
+ <combo_box.item label="Mały (128x128)" name="Small(128x128)"/>
+ <combo_box.item label="Åšredni (256x256)" name="Medium(256x256)"/>
+ <combo_box.item label="Duży (512x512)" name="Large(512x512)"/>
+ <combo_box.item label="Wybierz" name="Custom"/>
</combo_box>
<combo_box label="Rozdzielczość" name="local_size_combo">
- <combo_box.item name="CurrentWindow" label="Obecne Okno" />
- <combo_box.item name="320x240" label="320x240" />
- <combo_box.item name="640x480" label="640x480" />
- <combo_box.item name="800x600" label="800x600" />
- <combo_box.item name="1024x768" label="1024x768" />
- <combo_box.item name="1280x1024" label="1280x1024" />
- <combo_box.item name="1600x1200" label="1600x1200" />
- <combo_box.item name="Custom" label="Wybierz" />
+ <combo_box.item label="Obecne Okno" name="CurrentWindow"/>
+ <combo_box.item label="320x240" name="320x240"/>
+ <combo_box.item label="640x480" name="640x480"/>
+ <combo_box.item label="800x600" name="800x600"/>
+ <combo_box.item label="1024x768" name="1024x768"/>
+ <combo_box.item label="1280x1024" name="1280x1024"/>
+ <combo_box.item label="1600x1200" name="1600x1200"/>
+ <combo_box.item label="Wybierz" name="Custom"/>
</combo_box>
<combo_box label="Format" name="local_format_combo">
- <combo_box.item name="PNG" label="PNG" />
- <combo_box.item name="JPEG" label="JPEG" />
- <combo_box.item name="BMP" label="BMP" />
+ <combo_box.item label="PNG" name="PNG"/>
+ <combo_box.item label="JPEG" name="JPEG"/>
+ <combo_box.item label="BMP" name="BMP"/>
</combo_box>
<spinner label="Szer." name="snapshot_width"/>
<spinner label="Wys." name="snapshot_height"/>
- <check_box label="Ograniczone Proporcje" name="keep_aspect_check"/>
- <slider label="Jakość Zdjęcia" name="image_quality_slider"/>
+ <check_box label="Ograniczone proporcje" name="keep_aspect_check"/>
+ <slider label="Jakość zdjęcia" name="image_quality_slider"/>
<text name="layer_type_label">
Zapisz:
</text>
<combo_box label="Warstwy Obrazu" name="layer_types">
- <combo_box.item name="Colors" label="Kolory" />
- <combo_box.item name="Depth" label="Głębokość" />
- <combo_box.item name="ObjectMattes" label="Obiekty Åšlepe" />
+ <combo_box.item label="Kolory" name="Colors"/>
+ <combo_box.item label="Głębokość" name="Depth"/>
+ <combo_box.item label="Obiekty ślepe" name="ObjectMattes"/>
</combo_box>
<check_box label="Pokaż interfejs na zdjęciu" name="ui_check"/>
<check_box label="Pokaż obiekty HUD na zdjęciu" name="hud_check"/>
diff --git a/indra/newview/skins/default/xui/pl/floater_sound_preview.xml b/indra/newview/skins/default/xui/pl/floater_sound_preview.xml
index 0826508fd6..ac041dff6a 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_sound_preview.xml
+++ b/indra/newview/skins/default/xui/pl/floater_sound_preview.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Sound Preview" title="DŹWIĘK.WAV">
<text name="name_label">
Opis:
@@ -6,6 +6,6 @@
<text name="description_label">
Opis:
</text>
- <button label="Anuluj" label_selected="Anuluj" name="cancel_btn" />
- <button label="Załaduj (L$[AMOUNT])" label_selected="Załaduj (L$[AMOUNT])" name="ok_btn" />
+ <button label="Anuluj" label_selected="Anuluj" name="cancel_btn"/>
+ <button label="Załaduj ([AMOUNT]L$)" label_selected="Załaduj ([AMOUNT]L$)" name="ok_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_stats.xml b/indra/newview/skins/default/xui/pl/floater_stats.xml
index acd3df0585..ee5fba4d63 100644
--- a/indra/newview/skins/default/xui/pl/floater_stats.xml
+++ b/indra/newview/skins/default/xui/pl/floater_stats.xml
@@ -3,17 +3,17 @@
<scroll_container name="statistics_scroll">
<container_view name="statistics_view">
<stat_view label="Podstawowe" name="basic">
- <stat_bar label="Ilość Obrazów/Sec (FPS)" name="fps"/>
+ <stat_bar label="Ilość obrazów/sek (FPS)" name="fps"/>
<stat_bar label="Przepustowość" name="bandwidth"/>
- <stat_bar label="Stracone Pakiety" name="packet_loss"/>
- <stat_bar label="Ping Sim" name="ping"/>
+ <stat_bar label="Stracone pakiety" name="packet_loss"/>
+ <stat_bar label="Ping sim" name="ping"/>
</stat_view>
<stat_view label="Zaawansowane" name="advanced">
<stat_view label="Renderuj" name="render">
<stat_bar label="KTris Drawn" name="ktrisframe"/>
<stat_bar label="KTris Drawn" name="ktrissec"/>
- <stat_bar label="Wszystkie Obiekty" name="objs"/>
- <stat_bar label="Nowe Obiekty" name="newobjs"/>
+ <stat_bar label="Wszystkie obiekty" name="objs"/>
+ <stat_bar label="Nowe obiekty" name="newobjs"/>
</stat_view>
<stat_view label="Tekstura" name="texture">
<stat_bar label="Suma" name="numimagesstat"/>
@@ -24,8 +24,8 @@
<stat_bar label="Bound Mem" name="glboundmemstat"/>
</stat_view>
<stat_view label="Sieć" name="network">
- <stat_bar label="Pakiety Wewnętrzne" name="packetsinstat"/>
- <stat_bar label="Pakiety Zewnętrzne" name="packetsoutstat"/>
+ <stat_bar label="Pakiety wewnętrzne" name="packetsinstat"/>
+ <stat_bar label="Pakiety zewnętrzne" name="packetsoutstat"/>
<stat_bar label="Obiekty" name="objectkbitstat"/>
<stat_bar label="Tesktura" name="texturekbitstat"/>
<stat_bar label="Asset" name="assetkbitstat"/>
@@ -40,30 +40,30 @@
<stat_bar label="Ilość Obrazów/Sec na Symulatorze (Sim FPS)" name="simfps"/>
<stat_bar label="Fizyka Obrazów/Sec" name="simphysicsfps"/>
<stat_view label="Szczegóły Fizyki" name="physicsdetail">
- <stat_bar label="Pinned Objects" name="physicspinnedtasks"/>
+ <stat_bar label="Pinned objects" name="physicspinnedtasks"/>
<stat_bar label="Niskie LOD Obiektów" name="physicslodtasks"/>
- <stat_bar label="Alokacja Pamięci" name="physicsmemoryallocated"/>
- <stat_bar label="Aktualizacja Agentów/Sec" name="simagentups"/>
- <stat_bar label="Główni Agenci" name="simmainagents"/>
- <stat_bar label="Child Agents" name="simchildagents"/>
+ <stat_bar label="Alokacja pamięci" name="physicsmemoryallocated"/>
+ <stat_bar label="Aktualizacja agentów/Sek" name="simagentups"/>
+ <stat_bar label="Główni agenci" name="simmainagents"/>
+ <stat_bar label="Child agents" name="simchildagents"/>
<stat_bar label="Obiekty" name="simobjects"/>
- <stat_bar label="Aktywne Obiekty" name="simactiveobjects"/>
- <stat_bar label="Aktywne Skrypty" name="simactivescripts"/>
- <stat_bar label="Wydarzenie Skryptowe" name="simscripteps"/>
- <stat_bar label="Pakiety Wewnętrzne" name="siminpps"/>
- <stat_bar label="Pakiety Zewnętrzne" name="simoutpps"/>
- <stat_bar label="Oczekiwane na Pobranie" name="simpendingdownloads"/>
- <stat_bar label="Oczekiwane na Załadowanie" name="simpendinguploads"/>
- <stat_bar label="Wszystkie Niepotwierdzone Bity" name="simtotalunackedbytes"/>
+ <stat_bar label="Aktywne obiekty" name="simactiveobjects"/>
+ <stat_bar label="Aktywne skrypty" name="simactivescripts"/>
+ <stat_bar label="Wydarzenie skryptowe" name="simscripteps"/>
+ <stat_bar label="Pakiety wewnętrzne" name="siminpps"/>
+ <stat_bar label="Pakiety zewnętrzne" name="simoutpps"/>
+ <stat_bar label="Oczekiwane na pobranie" name="simpendingdownloads"/>
+ <stat_bar label="Oczekiwane na załadowanie" name="simpendinguploads"/>
+ <stat_bar label="Wszystkie niepotwierdzone bity" name="simtotalunackedbytes"/>
</stat_view>
<stat_view label="Czas (ms)" name="simperf">
- <stat_bar label="Całkowity Czas Obrazu" name="simframemsec"/>
- <stat_bar label="Czas Sieciowy" name="simnetmsec"/>
- <stat_bar label="Czas Fizyki" name="simsimphysicsmsec"/>
- <stat_bar label="Czas Symulatora" name="simsimothermsec"/>
- <stat_bar label="Czas Agenta" name="simagentmsec"/>
- <stat_bar label="Czas Obrazu" name="simimagesmsec"/>
- <stat_bar label="Czas Skryptu" name="simscriptmsec"/>
+ <stat_bar label="Całkowity czas obrazu" name="simframemsec"/>
+ <stat_bar label="Czas sieciowy" name="simnetmsec"/>
+ <stat_bar label="Czas fizyki" name="simsimphysicsmsec"/>
+ <stat_bar label="Czas symulatora" name="simsimothermsec"/>
+ <stat_bar label="Czas agenta" name="simagentmsec"/>
+ <stat_bar label="Czas obrazu" name="simimagesmsec"/>
+ <stat_bar label="Czas skryptu" name="simscriptmsec"/>
</stat_view>
</stat_view>
</container_view>
diff --git a/indra/newview/skins/default/xui/pl/floater_sys_well.xml b/indra/newview/skins/default/xui/pl/floater_sys_well.xml
new file mode 100644
index 0000000000..e6c73af4f3
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_sys_well.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="sys_well_window" title="ZAWIADOMIENIA">
+ <string name="title_im_well_window">
+ ROZMOWY
+ </string>
+ <string name="title_notification_well_window">
+ ZAWIADOMIENIA
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_telehub.xml b/indra/newview/skins/default/xui/pl/floater_telehub.xml
index 9f564452a9..32cc08810d 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_telehub.xml
+++ b/indra/newview/skins/default/xui/pl/floater_telehub.xml
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="telehub" title="OBSÅUGA TELEPORTERA" min_height="300" height="300" >
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater height="300" min_height="300" name="telehub" title="TELPORTER">
<text name="status_text_connected" width="250">
Teleporter połączony z obiektem [OBJECT]
</text>
@@ -12,20 +12,17 @@
<text name="help_text_not_connected">
Wybierz obiekt i kliknij Połącz z teleporterem
</text>
- <button label="Połącz z teleporterem" name="connect_btn" width="132" />
- <button label="Rozłącz" name="disconnect_btn" left="152" width="88"/>
+ <button label="Połącz z teleporterem" name="connect_btn" width="132"/>
+ <button label="Rozłącz" left="152" name="disconnect_btn" width="88"/>
<text name="spawn_points_text" width="250">
- Punkty Składowe (pozycje - nie obiekty!):
+ Punkty składowe (pozycje - nie obiekty!):
</text>
- <button label="Dodaj Punkt" name="add_spawn_point_btn" />
- <button label="Usuń Punkt" name="remove_spawn_point_btn" />
+ <button label="Dodaj punkt" name="add_spawn_point_btn"/>
+ <button label="Usuń punkt" name="remove_spawn_point_btn"/>
<text name="spawn_point_help">
- Wybierz obiekt i wybierz Dodaj by sprecyzować
-pozycję. Wówczas możesz przesunąć lub
-usunąć obiekt. Pozycje są relatywne do części
-centralnej teleportera.
-
-Wybierz obiekt z listy by zobaczyć jego pozycję
-w świecie.
+ Wybierz obiekt i wybierz &quot;Dodaj&quot; by sprecyzować pozycję.
+Możesz przesunąć lub usunąć obiekt.
+Pozycje są relatywne do części centralnej teleportera.
+Wybierz obiekt z listy by zobaczyć jego pozycję w świecie.
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml
index 48366e2b64..52c0cb8a93 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/pl/floater_texture_ctrl.xml
@@ -1,23 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="texture picker" title="WYBÓR TEKSTURY">
+<floater name="texture picker" title="ULUBIONE: TEKSTURA">
<string name="choose_picture">
Kliknij by wybrać obraz
</string>
<text name="Multiple">
- Wiele
+ Wiele tekstur
</text>
<text name="unknown">
- Wymiary: [DIMENSIONS]
+ Rozmiar: [DIMENSIONS]
</text>
<button label="Domyślna" label_selected="Domyślna" name="Default"/>
<button label="Żadna" label_selected="Żadna" name="None"/>
<button label="Pusta" label_selected="Pusta" name="Blank"/>
- <check_box label="Pokaż Foldery" name="show_folders_check"/>
- <search_editor label="Wpisz nazwę tutaj by wyszukać" name="inventory search editor"/>
- <check_box label="Zastosuj od razu" name="apply_immediate_check"/>
+ <check_box label="Pokaż foldery" name="show_folders_check"/>
+ <search_editor label="Filtruj tektury" name="inventory search editor"/>
+ <check_box label="Zastosuj teraz" name="apply_immediate_check"/>
<button label="" label_selected="" name="Pipette"/>
<button label="Anuluj" label_selected="Anuluj" name="Cancel"/>
- <button label="Wybierz" label_selected="Wybierz" name="Select"/>
+ <button label="OK" label_selected="OK" name="Select"/>
<string name="pick title">
Wybór:
</string>
diff --git a/indra/newview/skins/default/xui/pl/floater_tools.xml b/indra/newview/skins/default/xui/pl/floater_tools.xml
index e898c283c5..5b4f99e9d1 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_tools.xml
+++ b/indra/newview/skins/default/xui/pl/floater_tools.xml
@@ -1,45 +1,84 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="toolbox floater" title="" short_title="BUDUJ">
+<floater name="toolbox floater" short_title="BUDUJ" title="">
+ <floater.string name="status_rotate">
+ Przeciągaj kolorowe pierścienie żeby obracać obiekt
+ </floater.string>
+ <floater.string name="status_scale">
+ Kliknij i przeciągaj żeby rozciągnąć wybraną stronę
+ </floater.string>
+ <floater.string name="status_move">
+ Wybierz opcjÄ™:
+ </floater.string>
+ <floater.string name="status_modifyland">
+ Kliknij i przytrzymaj żeby modyfikować teren
+ </floater.string>
+ <floater.string name="status_camera">
+ Kliknij i przeciągnij żeby zmienić widok
+ </floater.string>
+ <floater.string name="status_grab">
+ Przeciągnij by przesunąć, wybierz Ctrl by podnieść, wybierz Ctrl-Shift by obrócić
+ </floater.string>
+ <floater.string name="status_place">
+ Kliknij in-world by zacząć budować
+ </floater.string>
+ <floater.string name="status_selectland">
+ Edytowanie Terenu:
+ </floater.string>
+ <floater.string name="grid_screen_text">
+ Widok
+ </floater.string>
+ <floater.string name="grid_local_text">
+ Lokalna
+ </floater.string>
+ <floater.string name="grid_world_text">
+ Åšwiat
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ Względa
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ Załączniki
+ </floater.string>
<button label="" label_selected="" name="button focus" tool_tip="Zbliżenie"/>
<button label="" label_selected="" name="button move" tool_tip="Przesunięcie"/>
<button label="" label_selected="" name="button edit" tool_tip="Edycja"/>
<button label="" label_selected="" name="button create" tool_tip="Stwórz"/>
<button label="" label_selected="" name="button land" tool_tip="Teren"/>
+ <text name="text status">
+ Przeciągnij żeby przenieść, shift-przeciągnij żeby skopiować
+ </text>
<radio_group name="focus_radio_group">
<radio_item label="Zbliżenie" name="radio zoom"/>
<radio_item label="Obracanie (Ctrl)" name="radio orbit"/>
- <radio_item label="Przesunięcie (Ctrl-Shift)" name="radio pan"/>
+ <radio_item label="Przesunięcie (Ctrl+Shift)" name="radio pan"/>
</radio_group>
<radio_group name="move_radio_group">
<radio_item label="Przesuń" name="radio move"/>
<radio_item label="PodnieÅ› (Ctrl)" name="radio lift"/>
- <radio_item label="Obróć (Ctrl-Shift)" name="radio spin"/>
+ <radio_item label="Obracanie (Ctrl+Shift)" name="radio spin"/>
</radio_group>
<radio_group name="edit_radio_group">
- <radio_item label="Pozycja" name="radio position"/>
+ <radio_item label="Przesuń" name="radio position"/>
<radio_item label="Obróć (Ctrl)" name="radio rotate"/>
- <radio_item label="RozciÄ…gnij (Ctrl-Shift)" name="radio stretch"/>
- <radio_item label="Wybierz TeksturÄ™" name="radio select face"/>
+ <radio_item label="RozciÄ…gnij (Ctrl+Shift)" name="radio stretch"/>
+ <radio_item label="Wybierz teksturÄ™" name="radio select face"/>
</radio_group>
- <check_box label="Edytuj Połączone Części" name="checkbox edit linked parts"/>
- <text name="text ruler mode">
- Linijka:
+ <check_box label="Edytuj połączone części" name="checkbox edit linked parts"/>
+ <text name="RenderingCost" tool_tip="Pokazuje koszt renderowania tego obiektu">
+ þ: [COUNT]
</text>
- <combo_box name="combobox grid mode">
- <combo_box.item name="World" label="Åšwiat"
- />
- <combo_box.item name="Local" label="Lokalna"
- />
- <combo_box.item name="Reference" label="Względna"
- />
- </combo_box>
- <check_box label="RozciÄ…gnij 2 Strony" name="checkbox uniform"/>
- <check_box label="RozciÄ…gnij TeksturÄ™" name="checkbox stretch textures"/>
- <check_box label="Użyj Siatki" name="checkbox snap to grid"/>
- <button label="Opcje..." label_selected="Opcje..." name="Options..."/>
- <text name="text status">
- Przeciągnij żeby przenieść, shift-przeciągnij żeby skopiować
+ <check_box name="checkbox uniform"/>
+ <text name="checkbox uniform label">
+ RozciÄ…gnij 2 Strony
</text>
+ <check_box initial_value="true" label="RozciÄ…gnij TeksturÄ™" name="checkbox stretch textures"/>
+ <check_box initial_value="true" label="Użyj siatki" name="checkbox snap to grid"/>
+ <combo_box name="combobox grid mode" tool_tip="Wybierz rodzaj linijki siatki dla pozycjonowania obiektu">
+ <combo_box.item label="Åšwiat" name="World"/>
+ <combo_box.item label="Lokalna" name="Local"/>
+ <combo_box.item label="Względna" name="Reference"/>
+ </combo_box>
+ <button label="Opcje..." label_selected="Opcje..." name="Options..." tool_tip="Więcej opcji siatki"/>
<button label="" label_selected="" name="ToolCube" tool_tip="Sześcian"/>
<button label="" label_selected="" name="ToolPrism" tool_tip="Graniastosłup"/>
<button label="" label_selected="" name="ToolPyramid" tool_tip="Ostrosłup"/>
@@ -57,7 +96,7 @@
<button label="" label_selected="" name="ToolGrass" tool_tip="Trawa"/>
<check_box label="Trzymaj zaznaczone" name="checkbox sticky"/>
<check_box label="Kopiuj zaznaczone" name="checkbox copy selection"/>
- <check_box label="Åšrodek" name="checkbox copy centers"/>
+ <check_box initial_value="true" label="Åšrodek" name="checkbox copy centers"/>
<check_box label="Obróć" name="checkbox copy rotates"/>
<radio_group name="land_radio_group">
<radio_item label="Zaznaczanie" name="radio select land"/>
@@ -68,7 +107,6 @@
<radio_item label="Fałdowanie" name="radio noise"/>
<radio_item label="Cofnij modyfikacjÄ™" name="radio revert"/>
</radio_group>
- <button label="Zastosuj" label_selected="Zastosuj" name="button apply to selection" tool_tip="Modyfikuj zaznaczony teren"/>
<text name="Bulldozer:">
Burzenie:
</text>
@@ -78,15 +116,52 @@
<text name="Strength:">
Siła
</text>
- <volume_slider name="slider force"/>
+ <slider_bar initial_value="0.00" name="slider force"/>
+ <button label="Zastosuj" label_selected="Zastosuj" name="button apply to selection" tool_tip="Modyfikuj zaznaczony teren"/>
<text name="obj_count">
- Wybrane obiekty: [COUNT]
+ Obiekty: [COUNT]
</text>
<text name="prim_count">
- primy: [COUNT]
+ Primy: [COUNT]
</text>
<tab_container name="Object Info Tabs">
<panel label="Ogólne" name="General">
+ <panel.string name="text deed continued">
+ Przypisz
+ </panel.string>
+ <panel.string name="text deed">
+ Przypisz
+ </panel.string>
+ <panel.string name="text modify info 1">
+ Możesz modyfikować ten obiekt
+ </panel.string>
+ <panel.string name="text modify info 2">
+ Możesz modyfikować te obiekty
+ </panel.string>
+ <panel.string name="text modify info 3">
+ Nie możesz modyfikować tego obiektu
+ </panel.string>
+ <panel.string name="text modify info 4">
+ Nie możesz modyfikować tych obiektów
+ </panel.string>
+ <panel.string name="text modify warning">
+ Musisz zaznaczyć cały obiekt by ustawić prawa.
+ </panel.string>
+ <panel.string name="Cost Default">
+ Cena: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ Cena całkowita: L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Cena za: L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Cena mieszana
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Sprzedaż mieszana
+ </panel.string>
<text name="Name:">
Nazwa:
</text>
@@ -101,133 +176,74 @@
<text name="Creator Name">
Thrax Linden
</text>
- <button label="Profil..." label_selected="Profil..." name="button creator profile"/>
<text name="Owner:">
Właściciel:
</text>
<text name="Owner Name">
Thrax Linden
</text>
- <button label="Profil..." label_selected="Profil..." name="button owner profile"/>
<text name="Group:">
Grupa:
</text>
- <text name="Group Name Proxy">
- The Lindens
- </text>
- <button label="Ustaw..." label_selected="Ustaw..." name="button set group"/>
- <text name="Permissions:">
- Prawa:
- </text>
-
- <check_box label="Udostępnij grupie" name="checkbox share with group" tool_tip="Pozwól członkom grupy przesuwać, modyfikować, kopiować i usuwać."/>
- <string name="text deed continued">
- Przypisz...
- </string>
- <string name="text deed">
- Przypisz
- </string>
- <button label="Przypisz..." label_selected="Przypisz..." name="button deed" tool_tip=""/>
- <check_box label="Pozwól przesuwać każdemu" name="checkbox allow everyone move"/>
- <check_box label="Pozwól kopiować każdemu" name="checkbox allow everyone copy"/>
- <check_box label="Pokaż w wyszukiwarce" name="search_check" tool_tip="Udostępnij wyświetlanie się tego przedmiotu w wynikach wyszukiwania"/>
- <check_box label="Na Sprzedaż" name="checkbox for sale"/>
- <text name="Cost">
- Cena: L$
+ <button label="Ustaw..." label_selected="Ustaw..." name="button set group" tool_tip="Wybierz grupę, która uzyska dostęp do praw obiektu"/>
+ <name_box initial_value="Åadowanie..." name="Group Name Proxy"/>
+ <button label="Przypisz" label_selected="Przypisz" name="button deed" tool_tip="Przypisanie oddaje prawa następnemu właścicielowi. Obiekty posiadane przez grupę mogą zostać przypisane przez oficera grupy."/>
+ <check_box label="Udostępnij" name="checkbox share with group" tool_tip="Pozwól członkom grupy na dzielenie praw do modyfikacji tego obiektu. Musisz przypisać obiekt aby uaktywnić ograniczenia dla ról."/>
+ <text name="label click action">
+ Kliknij:
</text>
- <line_editor name="Edit Cost"/>
+ <combo_box name="clickaction">
+ <combo_box.item label="Dotknij (domyślne)" name="Touch/grab(default)"/>
+ <combo_box.item label="Usiądź na obiekcie" name="Sitonobject"/>
+ <combo_box.item label="Kup obiekt" name="Buyobject"/>
+ <combo_box.item label="Zapłać obiektowi" name="Payobject"/>
+ <combo_box.item label="Otwórz" name="Open"/>
+ <combo_box.item label="Przybliż" name="Zoom"/>
+ </combo_box>
+ <check_box label="Na sprzedaż:" name="checkbox for sale"/>
<combo_box name="sale type">
<combo_box.item label="Kopia" name="Copy"/>
<combo_box.item label="Zawartość" name="Contents"/>
<combo_box.item label="Orginał" name="Original"/>
</combo_box>
-
- <text name="label click action">
- Lewe Kliknięcie:
- </text>
- <combo_box name="clickaction">
- <combo_box.item name="Touch/grab(default)" label="Dotknij (domyślne)"
- />
- <combo_box.item name="Sitonobject" label="Usiądź na Obiekcie"
- />
- <combo_box.item name="Buyobject" label="Kup Obiekt"
- />
- <combo_box.item name="Payobject" label="Zapłać Obiektowi"
- />
- <combo_box.item name="Open" label="Otwórz"
- />
- <combo_box.item name="Play" label="Odtwarzaj Media"
- />
- <combo_box.item name="Opemmedia" label="Otwrórz Media"
- />
- </combo_box>
- <panel name="perms_build">
- <text name="perm_modify">
- Nie masz prawda do modyfikacji tego obiektu
- </text>
- <text name="B:">
- B:
- </text>
- <text name="O:">
- O:
- </text>
- <text name="G:">
- G:
- </text>
- <text name="E:">
- E:
- </text>
- <text name="N:">
- N:
- </text>
- <text name="F:">
- F:
- </text>
- <text name="Next owner can:">
- Następny właściciel:
- </text>
- <check_box label="Zmienia" name="checkbox next owner can modify"/>
- <check_box label="Kopiuje" name="checkbox next owner can copy"/>
- <check_box name="checkbox next owner can transfer"/>
- </panel>
- <string name="text modify info 1">
- Możesz modyfikować ten obiekt
- </string>
- <string name="text modify info 2">
- Możesz modyfikować te obiekty
- </string>
- <string name="text modify info 3">
- Nie możesz modyfikować tego obiektu
- </string>
- <string name="text modify info 4">
- Nie możesz modyfikować tych obieków
- </string>
- <string name="text modify warning">
- Musisz zaznaczyć cały obiekt by ustawić prawa
- </string>
- <string name="Cost Default">
- Cena: L$
- </string>
- <string name="Cost Total">
- Cena Całości: L$
- </string>
- <string name="Cost Per Unit">
- Cena Za: L$
- </string>
- <string name="Cost Mixed">
- Cena Mieszana
- </string>
- <string name="Sale Mixed">
- Sprzedaż Mieszana
- </string>
+ <spinner label="Cena: L$" name="Edit Cost"/>
+ <check_box label="Pokaż w wyszukiwarce" name="search_check" tool_tip="Udostępnij wyświetlanie się tego przedmiotu w wynikach wyszukiwania"/>
+ <panel name="perms_build">
+ <text name="perm_modify">
+ Możesz modyfikować ten obiekt
+ </text>
+ <text name="Anyone can:">
+ Każdy:
+ </text>
+ <check_box label="Przesuń" name="checkbox allow everyone move"/>
+ <check_box label="Kopiuj" name="checkbox allow everyone copy"/>
+ <text name="Next owner can:">
+ Następny Właściciel:
+ </text>
+ <check_box label="Zmienia" name="checkbox next owner can modify"/>
+ <check_box label="Kopiuje" name="checkbox next owner can copy"/>
+ <check_box label="Oddaje/Sprzedaje" name="checkbox next owner can transfer" tool_tip="Następny Właściciel może oddawać lub sprzedawać ten obiekt"/>
+ <text name="B:">
+ B:
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ E:
+ </text>
+ <text name="N:">
+ N:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
</panel>
<panel label="Obiekt" name="Object">
- <text name="select_single">
- Wybierz tylko jeden element by edytować jego parametry
- </text>
- <text name="edit_object">
- Edytuj parametry obiektu:
- </text>
<check_box label="Zablokowany" name="checkbox locked" tool_tip="Chroni obiekty przed ich przesunięciem lub usunięciem. Pomocne także w czasie budowania by uniknąc niepotrzebnych edycji."/>
<check_box label="Fizyczny" name="Physical Checkbox Ctrl" tool_tip="Umożliwia obcność sił grawitacyjnych i oddziaływania pomiędzy obiektami."/>
<check_box label="Tymczasowy" name="Temporary Checkbox Ctrl" tool_tip="Umożliwia usunięcie obiektu po 1 minucie od jego stworzenia."/>
@@ -250,48 +266,27 @@
<spinner label="X" name="Rot X"/>
<spinner label="Y" name="Rot Y"/>
<spinner label="Z" name="Rot Z"/>
- <text name="label material">
- Materiał
- </text>
- <combo_box name="material">
- <combo_box.item name="Stone" label="Kamień"
- />
- <combo_box.item name="Metal" label="Metal"
- />
- <combo_box.item name="Glass" label="Szkło"
- />
- <combo_box.item name="Wood" label="Drewno"
- />
- <combo_box.item name="Flesh" label="Ciało"
- />
- <combo_box.item name="Plastic" label="Plastik"
- />
- <combo_box.item name="Rubber" label="Guma"
- />
- </combo_box>
- <text name="label basetype">
- Rodzaj Bloku Budowalnego
- </text>
<combo_box name="comboBaseType">
- <combo_box.item name="Box" label="Klocek"
- />
- <combo_box.item name="Cylinder" label="Walec"
- />
- <combo_box.item name="Prism" label="Graniastosłup"
- />
- <combo_box.item name="Sphere" label="Kula"
- />
- <combo_box.item name="Torus" label="Torus"
- />
- <combo_box.item name="Tube" label="Rura"
- />
- <combo_box.item name="Ring" label="Pierścień"
- />
- <combo_box.item name="Sculpted" label="Skulpty"
- />
+ <combo_box.item label="Klocek" name="Box"/>
+ <combo_box.item label="Walec" name="Cylinder"/>
+ <combo_box.item label="Graniastosłup" name="Prism"/>
+ <combo_box.item label="Kula" name="Sphere"/>
+ <combo_box.item label="Torus" name="Torus"/>
+ <combo_box.item label="Rura" name="Tube"/>
+ <combo_box.item label="Pierścień" name="Ring"/>
+ <combo_box.item label="Skulpty" name="Sculpted"/>
+ </combo_box>
+ <combo_box name="material">
+ <combo_box.item label="Kamień" name="Stone"/>
+ <combo_box.item label="Metal" name="Metal"/>
+ <combo_box.item label="Szkło" name="Glass"/>
+ <combo_box.item label="Drewno" name="Wood"/>
+ <combo_box.item label="Ciało" name="Flesh"/>
+ <combo_box.item label="Plastik" name="Plastic"/>
+ <combo_box.item label="Guma" name="Rubber"/>
</combo_box>
<text name="text cut">
- Wykrój początek i koniec
+ Wykrój (początek/koniec)
</text>
<spinner label="P" name="cut begin"/>
<spinner label="K" name="cut end"/>
@@ -307,17 +302,13 @@
Kształt Wydrążenia
</text>
<combo_box name="hole">
- <combo_box.item name="Default" label="Domyślny"
- />
- <combo_box.item name="Circle" label="Koło"
- />
- <combo_box.item name="Square" label="Kwadrat"
- />
- <combo_box.item name="Triangle" label="Trójkąt"
- />
+ <combo_box.item label="Domyślny" name="Default"/>
+ <combo_box.item label="Koło" name="Circle"/>
+ <combo_box.item label="Kwadrat" name="Square"/>
+ <combo_box.item label="Trójkąt" name="Triangle"/>
</combo_box>
<text name="text twist">
- Skręcenie
+ Skręcenie (początek/koniec)
</text>
<spinner label="P" name="Twist Begin"/>
<spinner label="K" name="Twist End"/>
@@ -325,23 +316,23 @@
Zwężenie
</text>
<text name="scale_hole">
- Rozmiar Wgłębienia
+ Rozmiar wgłębienia
</text>
<spinner label="X" name="Taper Scale X"/>
<spinner label="Y" name="Taper Scale Y"/>
<text name="text topshear">
- Przesunięcie Górne
+ Przesunięcie górne
</text>
<spinner label="X" name="Shear X"/>
<spinner label="Y" name="Shear Y"/>
<text name="advanced_cut">
- Wykrojenie Przekroju
+ Wykrojenie przekroju (poczÄ…tek/koniec)
</text>
<text name="advanced_dimple">
- Przesunięcie Promienia
+ Przesunięcie promienia (początek/koniec)
</text>
<text name="advanced_slice">
- Przetnij poczÄ…tek i koniec
+ Przetnij(poczÄ…tek/koniec)
</text>
<spinner label="P" name="Path Limit Begin"/>
<spinner label="K" name="Path Limit End"/>
@@ -358,23 +349,18 @@
</text>
<spinner name="Radius Offset"/>
<spinner name="Revolutions"/>
- <texture_picker label="Tekstura Skulptowa" name="sculpt texture control" tool_tip="Click to choose a picture"/>
- <check_box label="Odbicie" name="sculpt mirror control" tool_tip="Odwraca skulpt wzdłóż osi X."/>
- <check_box label="Åšrodek na zewnÄ…trz" name="sculpt invert control" tool_tip="Odwarca normalne skulptu."/>
+ <texture_picker label="Tekstura skulptowa" name="sculpt texture control" tool_tip="Click to choose a picture"/>
+ <check_box label="Odbicie" name="sculpt mirror control" tool_tip="Odwraca skulpt wzdłuż osi X."/>
+ <check_box label="Åšrodek na zewnÄ…trz" name="sculpt invert control" tool_tip="Odwraca normalne skulptu."/>
<text name="label sculpt type">
- Typ Ścięgna
+ Typ ścięgna
</text>
<combo_box name="sculpt type control">
- <combo_box.item name="None" label="(żadne)"
- />
- <combo_box.item name="Sphere" label="Kula"
- />
- <combo_box.item name="Torus" label="Torus"
- />
- <combo_box.item name="Plane" label="Płaczyzna"
- />
- <combo_box.item name="Cylinder" label="Walec"
- />
+ <combo_box.item label="(żadne)" name="None"/>
+ <combo_box.item label="Kula" name="Sphere"/>
+ <combo_box.item label="Torus" name="Torus"/>
+ <combo_box.item label="Płaszczyzna" name="Plane"/>
+ <combo_box.item label="Walec" name="Cylinder"/>
</combo_box>
</panel>
<panel label="Atrybuty" name="Features">
@@ -384,7 +370,7 @@
<text name="edit_object">
Edytuj cechy obiektu:
</text>
- <check_box label="Elastyczność" name="Flexible1D Checkbox Ctrl" tool_tip=""/>
+ <check_box label="Elastyczność" name="Flexible1D Checkbox Ctrl" tool_tip="Elastyczność wzdłuż osi Z (tylko po stronie klienta)"/>
<spinner label="Gładkość" name="FlexNumSections"/>
<spinner label="Ciężar" name="FlexGravity"/>
<spinner label="Drżenie" name="FlexFriction"/>
@@ -394,124 +380,99 @@
<spinner label="Siła Y" name="FlexForceY"/>
<spinner label="Siła Z" name="FlexForceZ"/>
<check_box label="Światło" name="Light Checkbox Ctrl" tool_tip="Umożliwia emitajcę światła"/>
- <text name="label color">
- Kolor
- </text>
- <color_swatch label="" name="colorswatch" tool_tip="Kliknij by wybrać kolor"/>
+ <color_swatch label="" name="colorswatch" tool_tip="Kliknij aby wybrać kolor"/>
+ <texture_picker label="" name="light texture control" tool_tip="Kliknij aby wybrać obraz (efekt występuje tylko z aktywowanym opóźnionym renderowaniem)"/>
<spinner label="Siła" name="Light Intensity"/>
+ <spinner label="FOV" name="Light FOV"/>
<spinner label="Promień" name="Light Radius"/>
+ <spinner label="Przybliżenie" name="Light Focus"/>
<spinner label="Spadek" name="Light Falloff"/>
+ <spinner label="Otoczenie/Nastrój" name="Light Ambiance"/>
</panel>
<panel label="Tekstura" name="Texture">
+ <panel.string name="string repeats per meter">
+ Powtórzenia / m
+ </panel.string>
+ <panel.string name="string repeats per face">
+ Powtórzenia
+ </panel.string>
<texture_picker label="Tekstura" name="texture control" tool_tip="Kliknij by wybrać obraz"/>
- <color_swatch label="Kolor" name="colorswatch" tool_tip="Kliknij by wybrać kolor"/>
- <text name="color trans" left="170" width="99">
+ <color_swatch label="Kolor" name="colorswatch" tool_tip="Kliknij aby wybrać kolor"/>
+ <text left="170" name="color trans" width="99">
Przezroczystość%
</text>
<spinner left="170" name="ColorTrans"/>
- <text name="glow label" left="170">
+ <text left="170" name="glow label">
Blask
</text>
<spinner left="170" name="glow"/>
- <check_box label="Jaskrawość" name="checkbox fullbright" left="170"/>
+ <check_box label="Jaskrawość" left="170" name="checkbox fullbright"/>
<text name="tex gen">
Mapowanie
</text>
<combo_box name="combobox texgen">
- <combo_box.item name="Default" label="Domyślne"
- />
- <combo_box.item name="Planar" label="Planarne"
- />
+ <combo_box.item label="Domyślne" name="Default"/>
+ <combo_box.item label="Planarne" name="Planar"/>
</combo_box>
<text name="label shininess">
Połysk
</text>
<combo_box name="combobox shininess">
- <combo_box.item name="None" label="Żadny"
- />
- <combo_box.item name="Low" label="Niski"
- />
- <combo_box.item name="Medium" label="Åšredni"
- />
- <combo_box.item name="High" label="Wysoki"
- />
+ <combo_box.item label="Żadny" name="None"/>
+ <combo_box.item label="Niski" name="Low"/>
+ <combo_box.item label="Åšredni" name="Medium"/>
+ <combo_box.item label="Wysoki" name="High"/>
</combo_box>
<text name="label bumpiness">
Powierzchnia
</text>
<combo_box name="combobox bumpiness">
- <combo_box.item name="None" label="Żadna"
- />
- <combo_box.item name="Brightness" label="Najjaśniejsza"
- />
- <combo_box.item name="Darkness" label="Najciemniejsza"
- />
- <combo_box.item name="woodgrain" label="Drewniano-ziarnista"
- />
- <combo_box.item name="bark" label="Kory Drzewa"
- />
- <combo_box.item name="bricks" label="Cegieł"
- />
- <combo_box.item name="checker" label="Planszy Szachowej"
- />
- <combo_box.item name="concrete" label="Betonu"
- />
- <combo_box.item name="crustytile" label="Płytki/Kafelki"
- />
- <combo_box.item name="cutstone" label="Kamienia"
- />
- <combo_box.item name="discs" label="Dysku CD"
- />
- <combo_box.item name="gravel" label="Żwiru"
- />
- <combo_box.item name="petridish" label="Skamieliny"
- />
- <combo_box.item name="siding" label="Brzegu"
- />
- <combo_box.item name="stonetile" label="Płytki Kamiennej"
- />
- <combo_box.item name="stucco" label="Stucco"
- />
- <combo_box.item name="suction" label="Suction"
- />
- <combo_box.item name="weave" label="Fali"
- />
+ <combo_box.item label="Żadna" name="None"/>
+ <combo_box.item label="Najjaśniejsza" name="Brightness"/>
+ <combo_box.item label="Najciemniejsza" name="Darkness"/>
+ <combo_box.item label="Drewniano-ziarnista" name="woodgrain"/>
+ <combo_box.item label="Kory Drzewa" name="bark"/>
+ <combo_box.item label="Cegieł" name="bricks"/>
+ <combo_box.item label="Planszy Szachowej" name="checker"/>
+ <combo_box.item label="Betonu" name="concrete"/>
+ <combo_box.item label="Płytki/Kafelki" name="crustytile"/>
+ <combo_box.item label="Kamienia" name="cutstone"/>
+ <combo_box.item label="Dysku CD" name="discs"/>
+ <combo_box.item label="Żwiru" name="gravel"/>
+ <combo_box.item label="Skamieliny" name="petridish"/>
+ <combo_box.item label="Brzegu" name="siding"/>
+ <combo_box.item label="Płytki Kamiennej" name="stonetile"/>
+ <combo_box.item label="Stucco" name="stucco"/>
+ <combo_box.item label="Suction" name="suction"/>
+ <combo_box.item label="Fali" name="weave"/>
</combo_box>
<text name="tex scale">
- Ilość powtórzeń
+ Powtórzenia
</text>
<spinner label="Poziomo (U)" name="TexScaleU"/>
<check_box label="Odwróć" name="checkbox flip s"/>
<spinner label="Pionowo (V)" name="TexScaleV"/>
<check_box label="Odwróć" name="checkbox flip t"/>
- <text name="tex rotate">
- Obrót (stopnie)
- </text>
- <spinner name="TexRot"/>
- <string name="string repeats per meter">
- Powtórzenia / m
- </string>
- <string name="string repeats per face">
- Powtórzenia
- </string>
- <text name="rpt">
- Powtórzenia / m
- </text>
- <spinner name="rptctrl"/>
+ <spinner label="Powtórzenia˚" name="TexRot"/>
+ <spinner label="Powtórzenia / metr" name="rptctrl"/>
<button label="Zastosuj" label_selected="Zastosuj" name="button apply"/>
<text name="tex offset">
- Dopasowanie
+ Wyrównanie tekstury
</text>
<spinner label="Poziome (U)" name="TexOffsetU"/>
<spinner label="Pionowe (V)" name="TexOffsetV"/>
- <text name="textbox autofix">
- Dopasuj Teksturę Mediów
-(najpierw załaduj)
- </text>
- <button label="Dopasuj" label_selected="Dopasuj" name="button align" left="160"/>
+ <panel name="Add_Media">
+ <text name="media_tex">
+ Media
+ </text>
+ <button name="add_media" tool_tip="Dodaj media"/>
+ <button name="delete_media" tool_tip="Usuń tą teksturę mediów"/>
+ <button name="edit_media" tool_tip="Edytuj media"/>
+ <button label="Dodaj" label_selected="Dopasuj teksturę mediów" name="button align" tool_tip="Dodaj teksturę mediów (musi się najpierw załadować)"/>
+ </panel>
</panel>
<panel label="Treść" name="Contents">
- <button label="Nowy Skrypt" label_selected="Nowy Skrypt" name="button new script"/>
+ <button label="Nowy skrypt" label_selected="Nowy skrypt" name="button new script"/>
<button label="Prawa" name="button permissions"/>
</panel>
</tab_container>
@@ -520,62 +481,29 @@
Informacje o Posiadłości
</text>
<text name="label_area_price">
- Cena: L$[PRICE] za [AREA] m
+ Cena: L$[PRICE] za [AREA] m²
</text>
<text name="label_area">
- Obszar: [AREA] m
+ Obszar: [AREA] m²
</text>
- <button label="O Posiadłości..." label_selected="O Posiadłości..." name="button about land"/>
- <check_box label="Pokaż Właścicieli" name="checkbox show owners" tool_tip="Pokoloruj posiadłości zgodnie z przynależnością do właściciela: &#10;&#10;Zielony = Twoja Posiadłość &#10;Morski = Posiadłość Twojej Grupy &#10;Czerwony = Posiadłości Innych &#10;Żółty = Na Sprzedaż &#10;Fioletowy = Na Aukcję &#10;Szary = Publiczna"/>
- <button label="?" label_selected="?" name="button show owners help" left_delta="120"/>
+ <button label="O Posiadłości" label_selected="O Posiadłości" name="button about land"/>
+ <check_box label="Pokaż Właścicieli" name="checkbox show owners" tool_tip="Pokoloruj Posiadłości zgodnie z przynależnością do Właściciela:
+
+Zielony = Twoja Posiadłość
+Morski = Posiadłość Twojej Grupy
+Czerwony = Posiadłości innych
+Żółty = Na sprzedaż
+Fioletowy = Na aukcjÄ™
+Szary = Publiczna"/>
<text name="label_parcel_modify">
Modyfikuj Posiadłość
</text>
<button label="Podziel" label_selected="Podziel" name="button subdivide land"/>
<button label="Złącz" label_selected="Złącz" name="button join land"/>
<text name="label_parcel_trans">
- Transakcje na posiadłości
+ Transakcje na Posiadłości
</text>
- <button label="Kup" label_selected="Kup" name="button buy land"/>
- <button label="Anuluj" label_selected="Anuluj" name="button abandon land"/>
+ <button label="Kup Posiadłość" label_selected="Kup Posiadłość" name="button buy land"/>
+ <button label="Porzuć Posiadłość" label_selected="Porzuć Posiadłość" name="button abandon land"/>
</panel>
- <floater.string name="status_rotate">
- Przeciągaj kolorowe pierścienie żeby obracać obiekt
- </floater.string>
- <floater.string name="status_scale">
- Kliknij i przeciągaj żeby rozciągnąć wybraną stronę
- </floater.string>
- <floater.string name="status_move">
- Wybierz opcjÄ™:
- </floater.string>
- <floater.string name="status_modifyland">
- Kliknij i przytrzymaj żeby modyfikować teren
- </floater.string>
- <floater.string name="status_camera">
- Kliknij i przeciągnij żeby zmienić widok
- </floater.string>
- <floater.string name="status_grab">
- Przeciągnij by przesunąć, wybierz Ctrl by podnieść, wybierz Ctrl-Shift by obrócić
- </floater.string>
- <floater.string name="status_place">
- Kliknij in-world by zacząć budować
- </floater.string>
- <floater.string name="status_selectland">
- Edytowanie Terenu:
- </floater.string>
- <floater.string name="grid_screen_text">
- Widok
- </floater.string>
- <floater.string name="grid_local_text">
- Lokalna
- </floater.string>
- <floater.string name="grid_world_text">
- Åšwiat
- </floater.string>
- <floater.string name="grid_reference_text">
- Względa
- </floater.string>
- <floater.string name="grid_attachment_text">
- Załączniki
- </floater.string>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_top_objects.xml b/indra/newview/skins/default/xui/pl/floater_top_objects.xml
index e7299b0abb..6afbce7e10 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/pl/floater_top_objects.xml
@@ -1,55 +1,56 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="top_objects" title="ÅADOWANIE...">
+<floater name="top_objects" title="Główne Obiekty">
+ <floater.string name="top_scripts_title">
+ Główne skrypty
+ </floater.string>
+ <floater.string name="top_scripts_text">
+ [COUNT] skryptów działa w czasie [TIME] ms
+ </floater.string>
+ <floater.string name="scripts_score_label">
+ Czas
+ </floater.string>
+ <floater.string name="scripts_mono_time_label">
+ Mono Time
+ </floater.string>
+ <floater.string name="top_colliders_title">
+ Główne kolizje
+ </floater.string>
+ <floater.string name="top_colliders_text">
+ [COUNT] obiektów odczuwa działanie wielu potencjalnych kolizji
+ </floater.string>
+ <floater.string name="colliders_score_label">
+ Wynik
+ </floater.string>
+ <floater.string name="none_descriptor">
+ Nieodnalezione
+ </floater.string>
<text name="title_text">
Åadowanie...
</text>
<scroll_list name="objects_list">
- <column label="Wynik" name="score"/>
- <column label="Nazwa" name="name"/>
- <column label="Właściciel" name="owner"/>
- <column label="Miejsce" name="location"/>
- <column label="Czas" name="time"/>
- <column label="Mono Time" name="mono_time"/>
+ <scroll_list.columns label="Wynik" name="score"/>
+ <scroll_list.columns label="Nazwa" name="name"/>
+ <scroll_list.columns label="Właściciel" name="owner"/>
+ <scroll_list.columns label="Miejsce" name="location"/>
+ <scroll_list.columns label="Czas" name="time"/>
+ <scroll_list.columns label="Mono Time" name="mono_time"/>
+ <scroll_list.columns label="URL" name="URLs"/>
</scroll_list>
<text name="id_text">
- ID Obiektu:
+ ID obiektu:
</text>
- <button label="Pokaż Emitery" name="show_beacon_btn"/>
+ <button label="Pokaż emitery" name="show_beacon_btn"/>
<text name="obj_name_text">
- Nazwa Obiektu:
+ Nazwa obiektu:
</text>
<button label="Filtr" name="filter_object_btn"/>
<text name="owner_name_text">
- Owner Name:
+ Właściciel:
</text>
<button label="Filter" name="filter_owner_btn"/>
- <button label="Zwróć Wybrane" name="return_selected_btn"/>
- <button label="Zwróć Wszystko" name="return_all_btn"/>
- <button label="Deaktywuj Wybrane" name="disable_selected_btn"/>
- <button label="Deaktywuj Wszystko" name="disable_all_btn"/>
<button label="Odśwież" name="refresh_btn"/>
- <string name="top_scripts_title">
- Główne Skrypty
- </string>
- <string name="top_scripts_text">
- [COUNT] skryptów działa w czasie [TIME] ms
- </string>
- <string name="scripts_score_label">
- Czas
- </string>
- <string name="scripts_mono_time_label">
- Mono Time
- </string>
- <string name="top_colliders_title">
- Główne Kolizje
- </string>
- <string name="top_colliders_text">
- [COUNT] obiektów odczuwa działanie wielu potencjalnych kolizji
- </string>
- <string name="colliders_score_label">
- Wynik
- </string>
- <string name="none_descriptor">
- Nie odnalezione
- </string>
+ <button label="Zwróć wybrane" name="return_selected_btn"/>
+ <button label="Zwróć wszystko" name="return_all_btn"/>
+ <button label="Deaktywuj wybrane" name="disable_selected_btn"/>
+ <button label="Deaktywuj wszystko" name="disable_all_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_tos.xml b/indra/newview/skins/default/xui/pl/floater_tos.xml
index b9a146df22..6f71488347 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_tos.xml
+++ b/indra/newview/skins/default/xui/pl/floater_tos.xml
@@ -1,11 +1,10 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="modal container" title="">
- <button label="Kontynuuj" label_selected="Kontynuuj" name="Continue" />
- <button label="Anuluj" label_selected="Anuluj" name="Cancel" />
- <check_box label="Zgadzam siÄ™ na Warunki Serwisu (Terms of Service)" name="agree_chk" />
+ <button label="Kontynuuj" label_selected="Kontynuuj" name="Continue"/>
+ <button label="Anuluj" label_selected="Anuluj" name="Cancel"/>
+ <check_box label="Zgadzam się na Warunki Serwisu (Terms of Service) i Politykę Prywatności (Privacy Policy)" name="agree_chk"/>
<text name="tos_heading">
- Proszę dokładnie przeczytać następujące Warunki Serwisu (Terms of Service). Musisz
-zaakceptować umowę żeby kontynuować logowanie do [SECOND_LIFE].
+ Proszę dokładnie przeczytać następujące Warunki Serwisu (Terms of Service) i Politykę Prywatności (Privacy Policy). Musisz zaakceptować umowę żeby kontynuować logowanie do [SECOND_LIFE].
</text>
<text_editor name="tos_text">
TOS_TEXT
diff --git a/indra/newview/skins/default/xui/pl/floater_url_entry.xml b/indra/newview/skins/default/xui/pl/floater_url_entry.xml
index fc170d8d1b..fc170d8d1b 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_url_entry.xml
+++ b/indra/newview/skins/default/xui/pl/floater_url_entry.xml
diff --git a/indra/newview/skins/default/xui/pl/floater_voice_controls.xml b/indra/newview/skins/default/xui/pl/floater_voice_controls.xml
new file mode 100644
index 0000000000..6bee3e911c
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_voice_controls.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_voice_controls" title="Przełączniki Głosu">
+ <string name="title_nearby">
+ ROZMOWY GÅOSOWE W POBLIÅ»U
+ </string>
+ <string name="title_group">
+ Rozmowa głosowa z grupą [GROUP]
+ </string>
+ <string name="title_adhoc">
+ Konferencja
+ </string>
+ <string name="title_peer_2_peer">
+ Rozmowa głosowa z [NAME]
+ </string>
+ <string name="no_one_near">
+ Nikt w pobliżu nie ma aktywnych rozmów głosowych
+ </string>
+ <layout_stack name="my_call_stack">
+ <layout_panel name="my_panel">
+ <text name="user_text" value="Mój awatar:"/>
+ </layout_panel>
+ <layout_panel name="leave_call_btn_panel">
+ <button label="Zakończ" name="leave_call_btn"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_water.xml b/indra/newview/skins/default/xui/pl/floater_water.xml
index 7333633c1d..9720dae516 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_water.xml
+++ b/indra/newview/skins/default/xui/pl/floater_water.xml
@@ -1,32 +1,32 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Water Floater" title="ZAAWANSOWANY EDYTOR WODY">
<text name="KeyFramePresetsText">
- Ustawienia Wody:
+ Ustawienia wody:
</text>
- <button label="Nowe" label_selected="Nowe" name="WaterNewPreset" />
- <button label="Zapisz" label_selected="Zapisz" name="WaterSavePreset" />
- <button label="Usuń" label_selected="Usuń" name="WaterDeletePreset" />
+ <button label="Nowe" label_selected="Nowe" name="WaterNewPreset"/>
+ <button label="Zapisz" label_selected="Zapisz" name="WaterSavePreset"/>
+ <button label="Usuń" label_selected="Usuń" name="WaterDeletePreset"/>
<tab_container name="Water Tabs">
- <panel label="Ustawienia" name="Settings">
+ <panel label="USTAWIENIA" name="Settings">
<text name="BHText">
- Kolor Podwodnej Mgły
+ Kolor podwodnej mgły
</text>
- <button label="?" name="WaterFogColorHelp" />
- <color_swatch label="" name="WaterFogColor" tool_tip="Kliknij by wybrać kolor" />
+ <button label="?" name="WaterFogColorHelp"/>
+ <color_swatch label="" name="WaterFogColor" tool_tip="Kliknij aby wybrać kolor"/>
<text name="WaterFogDensText">
- Wykładnik Gęstości Mgły
+ Wykładnik gęstości mgły
</text>
- <button label="?" name="WaterFogDensityHelp" />
- <slider label="" name="WaterFogDensity" />
+ <button label="?" name="WaterFogDensityHelp"/>
+ <slider label="" name="WaterFogDensity"/>
<text name="WaterUnderWaterFogModText">
- Modyfikator Mgły
+ Modyfikator mgły
</text>
- <button label="?" name="WaterUnderWaterFogModHelp" />
- <slider label="" name="WaterUnderWaterFogMod" />
+ <button label="?" name="WaterUnderWaterFogModHelp"/>
+ <slider label="" name="WaterUnderWaterFogMod"/>
<text name="BDensText">
- Skala Zmarszczeń
+ Skala zmarszczeń
</text>
- <button label="?" name="WaterNormalScaleHelp" />
+ <button label="?" name="WaterNormalScaleHelp"/>
<text name="BHText2">
1
</text>
@@ -36,65 +36,65 @@
<text name="BHText4">
3
</text>
- <slider label="" name="WaterNormalScaleX" />
- <slider label="" name="WaterNormalScaleY" />
- <slider label="" name="WaterNormalScaleZ" />
+ <slider label="" name="WaterNormalScaleX"/>
+ <slider label="" name="WaterNormalScaleY"/>
+ <slider label="" name="WaterNormalScaleZ"/>
<text name="HDText">
Skala Fresnela
</text>
- <button label="?" name="WaterFresnelScaleHelp" />
- <slider label="" name="WaterFresnelScale" />
+ <button label="?" name="WaterFresnelScaleHelp"/>
+ <slider label="" name="WaterFresnelScale"/>
<text name="FresnelOffsetText">
Przesunięcie Fresnela
</text>
- <button label="?" name="WaterFresnelOffsetHelp" />
- <slider label="" name="WaterFresnelOffset" />
+ <button label="?" name="WaterFresnelOffsetHelp"/>
+ <slider label="" name="WaterFresnelOffset"/>
<text name="DensMultText">
- Górna Refrakcja
+ Górna refrakcja
</text>
- <button label="?" name="WaterScaleAboveHelp" />
- <slider label="" name="WaterScaleAbove" />
+ <button label="?" name="WaterScaleAboveHelp"/>
+ <slider label="" name="WaterScaleAbove"/>
<text name="WaterScaleBelowText">
- Dolna Refrakcja
+ Dolna refrakcja
</text>
- <button label="?" name="WaterScaleBelowHelp" />
- <slider label="" name="WaterScaleBelow" />
+ <button label="?" name="WaterScaleBelowHelp"/>
+ <slider label="" name="WaterScaleBelow"/>
<text name="MaxAltText">
- Mnożnik Rozmycia
+ Mnożnik rozmycia
</text>
- <button label="?" name="WaterBlurMultiplierHelp" />
- <slider label="" name="WaterBlurMult" />
+ <button label="?" name="WaterBlurMultiplierHelp"/>
+ <slider label="" name="WaterBlurMult"/>
</panel>
- <panel label="Rysowanie" name="Waves">
+ <panel label="OBRAZ" name="Waves">
<text name="BHText">
- Kierunek Dużych Fal
+ Kierunek dużych fal
</text>
- <button label="?" name="WaterWave1Help" />
+ <button label="?" name="WaterWave1Help"/>
<text name="WaterWave1DirXText">
X
</text>
<text name="WaterWave1DirYText">
Y
</text>
- <slider label="" name="WaterWave1DirX" />
- <slider label="" name="WaterWave1DirY" />
+ <slider label="" name="WaterWave1DirX"/>
+ <slider label="" name="WaterWave1DirY"/>
<text name="BHText2">
- Kierunek Małych Fal
+ Kierunek małych fal
</text>
- <button label="?" name="WaterWave2Help" />
+ <button label="?" name="WaterWave2Help"/>
<text name="WaterWave2DirXText">
X
</text>
<text name="WaterWave2DirYText">
Y
</text>
- <slider label="" name="WaterWave2DirX" />
- <slider label="" name="WaterWave2DirY" />
+ <slider label="" name="WaterWave2DirX"/>
+ <slider label="" name="WaterWave2DirY"/>
<text name="BHText3">
- Mapa Normalnych
+ Mapa normalnych
</text>
- <button label="?" name="WaterNormalMapHelp" />
- <texture_picker label="" name="WaterNormalMap" />
+ <button label="?" name="WaterNormalMapHelp"/>
+ <texture_picker label="" name="WaterNormalMap"/>
</panel>
</tab_container>
<string name="WLDefaultWaterNames">
diff --git a/indra/newview/skins/default/xui/pl/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/pl/floater_wearable_save_as.xml
index 2d4582392c..925295102e 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_wearable_save_as.xml
+++ b/indra/newview/skins/default/xui/pl/floater_wearable_save_as.xml
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="modal container" title="">
- <button label="Zapisz" label_selected="Zapisz" name="Save" />
- <button label="Anuluj" label_selected="Anuluj" name="Cancel" />
+ <button label="Zapisz" label_selected="Zapisz" name="Save"/>
+ <button label="Anuluj" label_selected="Anuluj" name="Cancel"/>
<text name="Save item as:">
- Zachowaj jako:
+ Zapisz obiekt w mojej Szafie jako:
</text>
<line_editor name="name ed">
Nowe [DESC]
diff --git a/indra/newview/skins/default/xui/pl/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/pl/floater_whitelist_entry.xml
new file mode 100644
index 0000000000..4081b8a37e
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_whitelist_entry.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="whitelist_entry" title="BIAÅA LISTA">
+ <text name="media_label">
+ Wprowadź URL lub wzorzec URL dla dodania do listy dozwolonych domen
+ </text>
+ <line_editor name="whitelist_entry" tool_tip="Wprowadź URL lub wzorzec URL do Białej Listy"/>
+ <button label="OK" name="ok_btn"/>
+ <button label="Anuluj" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_windlight_options.xml b/indra/newview/skins/default/xui/pl/floater_windlight_options.xml
index 86ef9300da..49e523fae8 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_windlight_options.xml
+++ b/indra/newview/skins/default/xui/pl/floater_windlight_options.xml
@@ -1,19 +1,18 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="WindLight floater" title="ZAAWANSOWANY EDYTOR NIEBA">
<text name="KeyFramePresetsText">
- Ustawienia Nieba:
+ Ustawienia nieba:
</text>
- <button label="Nowe" label_selected="Nowe" name="WLNewPreset" />
- <button label="Zapisz" label_selected="Zapisz" name="WLSavePreset" />
- <button label="Usuń" label_selected="Usuń" name="WLDeletePreset" />
- <button label="Edytor Cyklu Dnia" label_selected="Edytor Cyklu Dnia"
- name="WLDayCycleMenuButton" />
+ <button label="Nowe" label_selected="Nowe" name="WLNewPreset"/>
+ <button label="Zapisz" label_selected="Zapisz" name="WLSavePreset"/>
+ <button label="Usuń" label_selected="Usuń" name="WLDeletePreset"/>
+ <button label="Edytor cyklu dnia" label_selected="Edytor cyklu dnia" name="WLDayCycleMenuButton"/>
<tab_container name="WindLight Tabs">
- <panel label="Atmosfera" name="Atmosphere">
+ <panel label="ATMOSFERA" name="Atmosphere">
<text name="BHText">
- Horyzont Błękitu
+ Horyzont błękitu
</text>
- <button label="?" name="WLBlueHorizonHelp" />
+ <button label="?" name="WLBlueHorizonHelp"/>
<text name="BHText2">
R
</text>
@@ -26,19 +25,19 @@
<text name="BHText5">
I
</text>
- <slider label="" name="WLBlueHorizonR" />
- <slider label="" name="WLBlueHorizonG" />
- <slider label="" name="WLBlueHorizonB" />
- <slider label="" name="WLBlueHorizonI" />
+ <slider label="" name="WLBlueHorizonR"/>
+ <slider label="" name="WLBlueHorizonG"/>
+ <slider label="" name="WLBlueHorizonB"/>
+ <slider label="" name="WLBlueHorizonI"/>
<text name="BDensText">
- Horyzont Zamglenia
+ Horyzont zamglenia
</text>
- <button label="?" name="WLHazeHorizonHelp" />
- <slider label="" name="WLHazeHorizon" />
+ <button label="?" name="WLHazeHorizonHelp"/>
+ <slider label="" name="WLHazeHorizon"/>
<text name="BDensText2">
- Gęstość Błękitu
+ Gęstość błękitu
</text>
- <button label="?" name="WLBlueDensityHelp" />
+ <button label="?" name="WLBlueDensityHelp"/>
<text name="BHText6">
R
</text>
@@ -51,36 +50,36 @@
<text name="BHText9">
I
</text>
- <slider label="" name="WLBlueDensityR" />
- <slider label="" name="WLBlueDensityG" />
- <slider label="" name="WLBlueDensityB" />
- <slider label="" name="WLBlueDensityI" />
+ <slider label="" name="WLBlueDensityR"/>
+ <slider label="" name="WLBlueDensityG"/>
+ <slider label="" name="WLBlueDensityB"/>
+ <slider label="" name="WLBlueDensityI"/>
<text name="HDText">
- Gęstość Zamglenia
+ Gęstość zamglenia
</text>
- <button label="?" name="WLHazeDensityHelp" />
- <slider label="" name="WLHazeDensity" />
+ <button label="?" name="WLHazeDensityHelp"/>
+ <slider label="" name="WLHazeDensity"/>
<text name="DensMultText">
- Mnożnik Gęsości
+ Mnożnik gęsości
</text>
- <button label="?" name="WLDensityMultHelp" />
- <slider label="" name="WLDensityMult" />
+ <button label="?" name="WLDensityMultHelp"/>
+ <slider label="" name="WLDensityMult"/>
<text name="WLDistanceMultText">
- Mnożnik Dystansu
+ Mnożnik dystansu
</text>
- <button label="?" name="WLDistanceMultHelp" />
- <slider label="" name="WLDistanceMult" />
+ <button label="?" name="WLDistanceMultHelp"/>
+ <slider label="" name="WLDistanceMult"/>
<text name="MaxAltText">
- Max Wysokość
+ Max wysokość
</text>
- <button label="?" name="WLMaxAltitudeHelp" />
- <slider label="" name="WLMaxAltitude" />
+ <button label="?" name="WLMaxAltitudeHelp"/>
+ <slider label="" name="WLMaxAltitude"/>
</panel>
- <panel label="Światło" name="Lighting">
+ <panel label="ÅšWIATÅO" name="Lighting">
<text name="SLCText">
- Kolor Słońca/Księżyca
+ Kolor słońca/księżyca
</text>
- <button label="?" name="WLSunlightColorHelp" />
+ <button label="?" name="WLSunlightColorHelp"/>
<text name="BHText">
R
</text>
@@ -93,19 +92,19 @@
<text name="BHText4">
I
</text>
- <slider label="" name="WLSunlightR" />
- <slider label="" name="WLSunlightG" />
- <slider label="" name="WLSunlightB" />
- <slider label="" name="WLSunlightI" />
+ <slider label="" name="WLSunlightR"/>
+ <slider label="" name="WLSunlightG"/>
+ <slider label="" name="WLSunlightB"/>
+ <slider label="" name="WLSunlightI"/>
<text name="TODText">
- Pozycja Słońca/Księżyca
+ Pozycja słońca/księżyca
</text>
- <button label="?" name="WLTimeOfDayHelp" />
- <slider label="" name="WLSunAngle" />
+ <button label="?" name="WLTimeOfDayHelp"/>
+ <slider label="" name="WLSunAngle"/>
<text name="WLAmbientText">
Otoczenie
</text>
- <button label="?" name="WLAmbientHelp" />
+ <button label="?" name="WLAmbientHelp"/>
<text name="BHText5">
R
</text>
@@ -118,37 +117,37 @@
<text name="BHText8">
I
</text>
- <slider label="" name="WLAmbientR" />
- <slider label="" name="WLAmbientG" />
- <slider label="" name="WLAmbientB" />
- <slider label="" name="WLAmbientI" />
+ <slider label="" name="WLAmbientR"/>
+ <slider label="" name="WLAmbientG"/>
+ <slider label="" name="WLAmbientB"/>
+ <slider label="" name="WLAmbientI"/>
<text name="WLEastAngleText">
- Pozycja Wschodu
+ Pozycja wschodu
</text>
- <button label="?" name="WLEastAngleHelp" />
- <slider label="" name="WLEastAngle" />
+ <button label="?" name="WLEastAngleHelp"/>
+ <slider label="" name="WLEastAngle"/>
<text name="SunGlowText">
- Blask Słońca
+ Blask słońca
</text>
- <button label="?" name="WLSunGlowHelp" />
- <slider label="Ostrość" name="WLGlowB" />
- <slider label="Rozmiar" name="WLGlowR" />
+ <button label="?" name="WLSunGlowHelp"/>
+ <slider label="Ostrość" name="WLGlowB"/>
+ <slider label="Rozmiar" name="WLGlowR"/>
<text name="SceneGammaText">
- Jasność Obrazu
+ Jasność obrazu
</text>
- <button label="?" name="WLSceneGammaHelp" />
- <slider label="" name="WLGamma" />
+ <button label="?" name="WLSceneGammaHelp"/>
+ <slider label="" name="WLGamma"/>
<text name="WLStarText">
- Blask Gwiazd
+ Blask gwiazd
</text>
- <button label="?" name="WLStarBrightnessHelp" />
- <slider label="" name="WLStarAlpha" />
+ <button label="?" name="WLStarBrightnessHelp"/>
+ <slider label="" name="WLStarAlpha"/>
</panel>
- <panel label="Chmury" name="Clouds">
+ <panel label="CHMURY" name="Clouds">
<text name="WLCloudColorText">
- Kolor Chmur
+ Kolor chmur
</text>
- <button label="?" name="WLCloudColorHelp" />
+ <button label="?" name="WLCloudColorHelp"/>
<text name="BHText">
R
</text>
@@ -161,14 +160,14 @@
<text name="BHText4">
I
</text>
- <slider label="" name="WLCloudColorR" />
- <slider label="" name="WLCloudColorG" />
- <slider label="" name="WLCloudColorB" />
- <slider label="" name="WLCloudColorI" />
+ <slider label="" name="WLCloudColorR"/>
+ <slider label="" name="WLCloudColorG"/>
+ <slider label="" name="WLCloudColorB"/>
+ <slider label="" name="WLCloudColorI"/>
<text name="WLCloudColorText2">
Chmury (XY/Gęstość)
</text>
- <button label="?" name="WLCloudDensityHelp" />
+ <button label="?" name="WLCloudDensityHelp"/>
<text name="BHText5">
X
</text>
@@ -178,23 +177,23 @@
<text name="BHText7">
G
</text>
- <slider label="" name="WLCloudX" />
- <slider label="" name="WLCloudY" />
- <slider label="" name="WLCloudDensity" />
+ <slider label="" name="WLCloudX"/>
+ <slider label="" name="WLCloudY"/>
+ <slider label="" name="WLCloudDensity"/>
<text name="WLCloudCoverageText">
- Pokrycie Chmur
+ Pokrycie chmur
</text>
- <button label="?" name="WLCloudCoverageHelp" />
- <slider label="" name="WLCloudCoverage" />
+ <button label="?" name="WLCloudCoverageHelp"/>
+ <slider label="" name="WLCloudCoverage"/>
<text name="WLCloudScaleText">
- Skala Chmur
+ Skala chmur
</text>
- <button label="?" name="WLCloudScaleHelp" />
- <slider label="" name="WLCloudScale" />
+ <button label="?" name="WLCloudScaleHelp"/>
+ <slider label="" name="WLCloudScale"/>
<text name="WLCloudDetailText">
- Szczegóły (XY/Gęstość)
+ Szczegóły (XY/gęstość)
</text>
- <button label="?" name="WLCloudDetailHelp" />
+ <button label="?" name="WLCloudDetailHelp"/>
<text name="BHText8">
X
</text>
@@ -204,23 +203,23 @@
<text name="BHText10">
G
</text>
- <slider label="" name="WLCloudDetailX" />
- <slider label="" name="WLCloudDetailY" />
- <slider label="" name="WLCloudDetailDensity" />
+ <slider label="" name="WLCloudDetailX"/>
+ <slider label="" name="WLCloudDetailY"/>
+ <slider label="" name="WLCloudDetailDensity"/>
<text name="WLCloudScrollXText">
- Przewijanie Chmur X
+ Przewijanie chmur X
</text>
- <button label="?" name="WLCloudScrollXHelp" />
- <check_box label="Zablokuj" name="WLCloudLockX" />
- <slider label="" name="WLCloudScrollX" />
+ <button label="?" name="WLCloudScrollXHelp"/>
+ <check_box label="Zablokuj" name="WLCloudLockX"/>
+ <slider label="" name="WLCloudScrollX"/>
<text name="WLCloudScrollYText">
- Przewijanie Chmur Y
+ Przewijanie chmur Y
</text>
- <button label="?" name="WLCloudScrollYHelp" />
- <check_box label="Zablokuj" name="WLCloudLockY" />
- <slider label="" name="WLCloudScrollY" />
- <check_box label="Klasyczne Chmury" name="DrawClassicClouds" />
- <button label="?" name="WLClassicCloudsHelp" />
+ <button label="?" name="WLCloudScrollYHelp"/>
+ <check_box label="Zablokuj" name="WLCloudLockY"/>
+ <slider label="" name="WLCloudScrollY"/>
+ <check_box label="Klasyczne chmury" name="DrawClassicClouds"/>
+ <button label="?" name="WLClassicCloudsHelp"/>
</panel>
</tab_container>
<string name="WLDefaultSkyNames">
diff --git a/indra/newview/skins/default/xui/pl/floater_window_size.xml b/indra/newview/skins/default/xui/pl/floater_window_size.xml
new file mode 100644
index 0000000000..2a6c257e54
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/floater_window_size.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="window_size" title="WYMIARY OKNA">
+ <string name="resolution_format">
+ [RES_X] x [RES_Y]
+ </string>
+ <text name="windowsize_text">
+ Ustaw rozmiar okna:
+ </text>
+ <combo_box name="window_size_combo" tool_tip="szerokość x wysokość">
+ <combo_box.item label="1000 x 700 (domyślnie)" name="item0"/>
+ <combo_box.item label="1024 x 768" name="item1"/>
+ <combo_box.item label="1280 x 720 (720p)" name="item2"/>
+ <combo_box.item label="1920 x 1080 (1080p)" name="item3"/>
+ </combo_box>
+ <button label="Ustaw" name="set_btn"/>
+ <button label="Anuluj" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pl/floater_world_map.xml b/indra/newview/skins/default/xui/pl/floater_world_map.xml
index 36e3b0651b..05287ad42a 100755..100644
--- a/indra/newview/skins/default/xui/pl/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/pl/floater_world_map.xml
@@ -1,59 +1,70 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="worldmap" title="MAPA ÅšWIATA">
- <tab_container name="maptab">
- <panel label="Obiekty" name="objects_mapview"/>
- <panel label="Teren" name="terrain_mapview"/>
- </tab_container>
- <text name="you_label">
- Ty
- </text>
- <icon left="1058" name="home"/>
- <text name="home_label">
- Start
- </text>
- <text name="auction_label">
- Aukcja
- </text>
- <text name="land_for_sale_label">
- Na Sprzedaż
- </text>
- <button width="122" left="1116" label="Teleportuj do Start" label_selected="Teleportuj do Start" name="Go Home" tool_tip="Teleportuj siÄ™ do miejsca startowego"/>
- <check_box label="Rezydent" name="people_chk"/>
- <check_box label="Infohub" name="infohub_chk"/>
- <check_box label="Telehub" name="telehubchk"/>
- <check_box label="Posiadłość na &#10;sprzedaż" name="land_for_sale_chk"/>
- <text name="events_label">
- Wydarzenia:
- </text>
- <check_box label="&apos;PG&apos;" name="event_chk"/>
- <check_box label="&apos;Mature&apos;" name="event_mature_chk"/>
- <check_box label="&apos;Adult&apos;" name="event_adult_chk"/>
- <icon bottom="-196" name="avatar_icon"/>
- <combo_box label="Dostępni Znajomi" name="friend combo" tool_tip="Znajomi na mapie">
- <combo_box.item name="item1" label="Dostępni Znajomi" />
- </combo_box>
- <combo_box label="Zapisane Miejsca" name="landmark combo" tool_tip="Zapisane miejsca na mapie">
- <combo_box.item name="item1" label="Zapisane Miejsca" />
- </combo_box>
- <line_editor label="Szukaj po nazwie regionu" name="location" tool_tip="Wpisz nazwÄ™ regionu"/>
- <button label="Szukaj" name="DoSearch" tool_tip="Wyszukiwaie regionu"/>
- <text name="search_label">
- Wyniki wyszukiwania:
- </text>
- <scroll_list name="search_results" bottom_delta="-310" height="304" >
- <column label="" name="icon"/>
- <column label="" name="sim_name"/>
- </scroll_list>
- <text name="location_label">
- Położenie:
- </text>
- <spinner name="spin x" tool_tip="współrzędne X na mapie"/>
- <spinner name="spin y" tool_tip="współrzędne Y na mapie"/>
- <spinner name="spin z" tool_tip="współrzędne Z na mapie"/>
- <button label="Teleportuj" label_selected="Teleportuj" name="Teleport" tool_tip="Teleportuj do wybranego miejsca"/>
- <button label="Pokaż Cel" label_selected="Pokaż Cel" name="Show Destination" tool_tip="Wycentruj miejsce celu na mapie"/>
- <button label="Wyczyść" label_selected="Wyczyść" name="Clear" tool_tip="Stop tracking"/>
- <button label="Pokaż moje miejsce" label_selected="Pokaż moje miejsce" name="Show My Location" tool_tip="Wycentruj pozcję awatara na mapie"/>
- <button label="Kopiuj SLurl do schowka" name="copy_slurl" tool_tip="Kopie SLurl obecnego miejsca będę mogły zostać użyte na stronie internetowej."/>
- <slider label="Skala" name="zoom slider"/>
+ <panel name="layout_panel_1">
+ <text name="events_label">
+ Legenda
+ </text>
+ </panel>
+ <panel name="layout_panel_2">
+ <button name="Show My Location" tool_tip="Wyśrodkuj mapę w miejscu, gdzie znajduje się mój awatar"/>
+ <text name="me_label">
+ Ja
+ </text>
+ <text name="person_label">
+ Osoba
+ </text>
+ <text name="infohub_label">
+ Infohub
+ </text>
+ <text name="land_sale_label">
+ Sprzedaż Posiadłości
+ </text>
+ <text name="by_owner_label">
+ przez Właściciela
+ </text>
+ <text name="auction_label">
+ aukcja Posiadłości
+ </text>
+ <button name="Go Home" tool_tip="Teleportuj do mojego Miejsca Startowego"/>
+ <text name="Home_label">
+ Miejsce Startu
+ </text>
+ <text name="events_label">
+ Wydarzenia:
+ </text>
+ <text name="pg_label">
+ Ogólne
+ </text>
+ <check_box name="event_mature_chk"/>
+ <text name="mature_label">
+ Moderuj
+ </text>
+ <text name="adult_label">
+ Adult
+ </text>
+ </panel>
+ <panel name="layout_panel_3">
+ <text name="find_on_map_label">
+ Znajdź na mapie
+ </text>
+ </panel>
+ <panel name="layout_panel_4">
+ <combo_box label="Dostępni Znajomi" name="friend combo" tool_tip="Pokaż znajomych na mapie">
+ <combo_box.item label="Moi Dostępni Znajomi" name="item1"/>
+ </combo_box>
+ <combo_box label="Zapisane Miejsca" name="landmark combo" tool_tip="Pokaż zapisane miejsce na mapie">
+ <combo_box.item label="Zapisane Miejsca" name="item1"/>
+ </combo_box>
+ <search_editor label="Regiony Według Nazwy" name="location" tool_tip="Wpisz nazwę regionu"/>
+ <button label="Znajdź" name="DoSearch" tool_tip="Szukaj regionu"/>
+ <button name="Clear" tool_tip="Wyczyść zapamiętane linie oraz zresetuj mapę"/>
+ <button label="Teleportuj" name="Teleport" tool_tip="Teleportuj do wybranego miejsca"/>
+ <button label="Kopiuj SLurl" name="copy_slurl" tool_tip="Kopie obecnego miejsca jako SLurl mogą zostać użyte na stronie internetowej."/>
+ <button label="Pokaż wybrane" name="Show Destination" tool_tip="Wyśrodkuj mapę w wybranym miejscu"/>
+ </panel>
+ <panel name="layout_panel_5">
+ <text name="zoom_label">
+ Przybliż
+ </text>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/pl/inspect_avatar.xml b/indra/newview/skins/default/xui/pl/inspect_avatar.xml
new file mode 100644
index 0000000000..3ee0b976eb
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/inspect_avatar.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_avatar">
+ <string name="Subtitle">
+ [AGE]
+ </string>
+ <string name="Details">
+ [SL_PROFILE]
+ </string>
+ <slider name="volume_slider" tool_tip="Posiom Głośności" value="0.5"/>
+ <button label="Dodaj Znajomość" name="add_friend_btn"/>
+ <button label="IM" name="im_btn"/>
+ <button label="Profil" name="view_profile_btn"/>
+ <panel name="moderator_panel">
+ <button label="Wyłącz komunikację głosową" name="disable_voice"/>
+ <button label="Włącz komunikację głosową" name="enable_voice"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/pl/inspect_group.xml b/indra/newview/skins/default/xui/pl/inspect_group.xml
new file mode 100644
index 0000000000..0a2a62ce74
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/inspect_group.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_group">
+ <string name="PrivateGroup">
+ Grupa prywatna
+ </string>
+ <string name="FreeToJoin">
+ Wstęp wolny
+ </string>
+ <string name="CostToJoin">
+ L$[AMOUNT] by dołączyć
+ </string>
+ <string name="YouAreMember">
+ Jesteś członkiem
+ </string>
+ <button label="Dołącz" name="join_btn"/>
+ <button label="Opuść" name="leave_btn"/>
+ <button label="Zobacz Profil" name="view_profile_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pl/inspect_object.xml b/indra/newview/skins/default/xui/pl/inspect_object.xml
new file mode 100644
index 0000000000..2e15691463
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/inspect_object.xml
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_object">
+ <string name="Creator">
+ Przez [CREATOR]
+ </string>
+ <string name="CreatorAndOwner">
+ przez [CREATOR]
+właściciel [OWNER]
+ </string>
+ <string name="Price">
+ L$[AMOUNT]
+ </string>
+ <string name="PriceFree">
+ Darmowe!
+ </string>
+ <string name="Touch">
+ Dotknij
+ </string>
+ <string name="Sit">
+ Usiądź tutaj
+ </string>
+ <button label="Kup" name="buy_btn"/>
+ <button label="Zapłać" name="pay_btn"/>
+ <button label="Weź kopię" name="take_free_copy_btn"/>
+ <button label="Dotknij" name="touch_btn"/>
+ <button label="Usiądź tutaj" name="sit_btn"/>
+ <button label="Otwórz" name="open_btn"/>
+ <icon name="secure_browsing" tool_tip="Zabezpiecz przeglÄ…danie"/>
+ <button label="Więcej" name="more_info_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pl/inspect_remote_object.xml b/indra/newview/skins/default/xui/pl/inspect_remote_object.xml
new file mode 100644
index 0000000000..0d570940c1
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/inspect_remote_object.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_remote_object">
+ <text name="object_owner_label">
+ Właściciel:
+ </text>
+ <button label="Mapa" name="map_btn"/>
+ <button label="Zablokuj" name="block_btn"/>
+ <button label="Zamknij" name="close_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pl/language_settings.xml b/indra/newview/skins/default/xui/pl/language_settings.xml
index 71418d446a..debc451a33 100644
--- a/indra/newview/skins/default/xui/pl/language_settings.xml
+++ b/indra/newview/skins/default/xui/pl/language_settings.xml
@@ -3,9 +3,9 @@
<strings>
<!-- Locale Information -->
- <string name="MicrosoftLocale">english</string>
- <string name="DarwinLocale">C</string>
- <string name="LinuxLocale">C</string>
+ <string name="MicrosoftLocale">polish</string>
+ <string name="DarwinLocale">pl_PL.UTF-8</string>
+ <string name="LinuxLocale">pl_PL.UTF-8</string>
<!--
datetimeToCodes["wkday"] = "%a"; // Thu
diff --git a/indra/newview/skins/default/xui/pl/menu_attachment_self.xml b/indra/newview/skins/default/xui/pl/menu_attachment_self.xml
index 1107a5d9d1..ff695be205 100644
--- a/indra/newview/skins/default/xui/pl/menu_attachment_self.xml
+++ b/indra/newview/skins/default/xui/pl/menu_attachment_self.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Attachment Pie">
- <menu_item_call label="Dotnij" name="Attachment Object Touch"/>
+ <menu_item_call label="Dotknij" name="Attachment Object Touch"/>
<menu_item_call label="Edytuj" name="Edit..."/>
<menu_item_call label="Odłącz" name="Detach"/>
<menu_item_call label="Opuść" name="Drop"/>
diff --git a/indra/newview/skins/default/xui/pl/menu_avatar_self.xml b/indra/newview/skins/default/xui/pl/menu_avatar_self.xml
index 427c0d464b..0bca90168f 100644
--- a/indra/newview/skins/default/xui/pl/menu_avatar_self.xml
+++ b/indra/newview/skins/default/xui/pl/menu_avatar_self.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Self Pie">
<menu_item_call label="Wstań" name="Stand Up"/>
- <context_menu label="Zdejmij &gt;" name="Take Off &gt;">
- <context_menu label="Ubranie &gt;" name="Clothes &gt;">
+ <context_menu label="Zdejmij â–¶" name="Take Off &gt;">
+ <context_menu label="Ubrania â–¶" name="Clothes &gt;">
<menu_item_call label="KoszulkÄ™" name="Shirt"/>
<menu_item_call label="Spodnie" name="Pants"/>
<menu_item_call label="Spódnicę" name="Skirt"/>
@@ -16,8 +16,8 @@
<menu_item_call label="Ubranie Przezroczyste" name="Self Alpha"/>
<menu_item_call label="Wszystko" name="All Clothes"/>
</context_menu>
- <context_menu label="HUD &gt;" name="Object Detach HUD"/>
- <context_menu label="Odłącz &gt;" name="Object Detach"/>
+ <context_menu label="HUD â–¶" name="Object Detach HUD"/>
+ <context_menu label="Odłącz ▶" name="Object Detach"/>
<menu_item_call label="Odłącz Wszystko" name="Detach All"/>
</context_menu>
<menu_item_call label="Mój Wygląd" name="Appearance..."/>
diff --git a/indra/newview/skins/default/xui/pl/menu_bottomtray.xml b/indra/newview/skins/default/xui/pl/menu_bottomtray.xml
index 818dfc08ae..9fcf1b3440 100644
--- a/indra/newview/skins/default/xui/pl/menu_bottomtray.xml
+++ b/indra/newview/skins/default/xui/pl/menu_bottomtray.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_camera_move_controls_menu">
- <menu_item_check label="Przycisk Gesturek" name="ShowGestureButton"/>
+ <menu_item_check label="Przycisk Gestur" name="ShowGestureButton"/>
<menu_item_check label="Przycisk Ruchu" name="ShowMoveButton"/>
<menu_item_check label="Przycisk Widoku" name="ShowCameraButton"/>
<menu_item_check label="Przycisk Zdjęć" name="ShowSnapshotButton"/>
@@ -8,5 +8,5 @@
<menu_item_call label="Kopiuj" name="NearbyChatBar_Copy"/>
<menu_item_call label="Wklej" name="NearbyChatBar_Paste"/>
<menu_item_call label="Usuń" name="NearbyChatBar_Delete"/>
- <menu_item_call label="Zaznacz Wszystko" name="NearbyChatBar_Select_All"/>
+ <menu_item_call label="Zaznacz wszystko" name="NearbyChatBar_Select_All"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_favorites.xml b/indra/newview/skins/default/xui/pl/menu_favorites.xml
index 0a0b54a548..cbacaf4beb 100644
--- a/indra/newview/skins/default/xui/pl/menu_favorites.xml
+++ b/indra/newview/skins/default/xui/pl/menu_favorites.xml
@@ -3,7 +3,7 @@
<menu_item_call label="Teleportuj" name="Teleport To Landmark"/>
<menu_item_call label="Zobacz/Edytuj Ulubione Miejsce" name="Landmark Open"/>
<menu_item_call label="Kopiuj SLurl" name="Copy slurl"/>
- <menu_item_call label="Pokaż na Mapie" name="Show On Map"/>
+ <menu_item_call label="Pokaż na mapie" name="Show On Map"/>
<menu_item_call label="Kopiuj" name="Landmark Copy"/>
<menu_item_call label="Wklej" name="Landmark Paste"/>
<menu_item_call label="Usuń" name="Delete"/>
diff --git a/indra/newview/skins/default/xui/pl/menu_hide_navbar.xml b/indra/newview/skins/default/xui/pl/menu_hide_navbar.xml
index 1c2687338d..d30f5a4d3f 100644
--- a/indra/newview/skins/default/xui/pl/menu_hide_navbar.xml
+++ b/indra/newview/skins/default/xui/pl/menu_hide_navbar.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="hide_navbar_menu">
- <menu_item_check label="Pokaż Pasek Nawigacji" name="ShowNavbarNavigationPanel"/>
- <menu_item_check label="Pokaż Pasek Ulubionych" name="ShowNavbarFavoritesPanel"/>
+ <menu_item_check label="Pokaż pasek Nawigacji" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Pokaż pasek Ulubionych" name="ShowNavbarFavoritesPanel"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_im_well_button.xml b/indra/newview/skins/default/xui/pl/menu_im_well_button.xml
new file mode 100644
index 0000000000..207bc2211b
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_im_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="IM Well Button Context Menu">
+ <menu_item_call label="Zamknij wszystkie" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_imchiclet_adhoc.xml b/indra/newview/skins/default/xui/pl/menu_imchiclet_adhoc.xml
index 925272d5ee..4ead44878a 100644
--- a/indra/newview/skins/default/xui/pl/menu_imchiclet_adhoc.xml
+++ b/indra/newview/skins/default/xui/pl/menu_imchiclet_adhoc.xml
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="IMChiclet AdHoc Menu">
- <menu_item_call label="Zakończ Rozmowę" name="End Session"/>
+ <menu_item_call label="Zakończ rozmowę" name="End Session"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/pl/menu_imchiclet_group.xml
index dc232c096d..c53f72c043 100644
--- a/indra/newview/skins/default/xui/pl/menu_imchiclet_group.xml
+++ b/indra/newview/skins/default/xui/pl/menu_imchiclet_group.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="IMChiclet Group Menu">
<menu_item_call label="O Grupie" name="Show Profile"/>
- <menu_item_call label="Pokaż Sesję" name="Chat"/>
- <menu_item_call label="Zakończ Rozmowę" name="End Session"/>
+ <menu_item_call label="Pokaż sesję" name="Chat"/>
+ <menu_item_call label="Zakończ rozmowę" name="End Session"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/pl/menu_imchiclet_p2p.xml
index df991cbc36..c0c812c0a7 100644
--- a/indra/newview/skins/default/xui/pl/menu_imchiclet_p2p.xml
+++ b/indra/newview/skins/default/xui/pl/menu_imchiclet_p2p.xml
@@ -2,6 +2,6 @@
<menu name="IMChiclet P2P Menu">
<menu_item_call label="Zobacz Profil" name="Show Profile"/>
<menu_item_call label="Dodaj Znajomość" name="Add Friend"/>
- <menu_item_call label="Pokaż Sesję" name="Send IM"/>
- <menu_item_call label="Zakończ Rozmowę" name="End Session"/>
+ <menu_item_call label="Pokaż sesję" name="Send IM"/>
+ <menu_item_call label="Zakończ rozmowę" name="End Session"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml
index 22d81cb823..325072d0fb 100644
--- a/indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml
+++ b/indra/newview/skins/default/xui/pl/menu_inspect_avatar_gear.xml
@@ -7,11 +7,13 @@
<menu_item_call label="Teleportuj" name="teleport"/>
<menu_item_call label="ZaproÅ› do Grupy" name="invite_to_group"/>
<menu_item_call label="Zablokuj" name="block"/>
+ <menu_item_call label="Odblokuj" name="unblock"/>
<menu_item_call label="Raport" name="report"/>
<menu_item_call label="Unieruchom" name="freeze"/>
<menu_item_call label="Wyrzuć" name="eject"/>
<menu_item_call label="Debug" name="debug"/>
- <menu_item_call label="Znajdź na Mapie" name="find_on_map"/>
+ <menu_item_call label="Znajdź na mapie" name="find_on_map"/>
<menu_item_call label="Przybliż" name="zoom_in"/>
<menu_item_call label="Zapłać" name="pay"/>
+ <menu_item_call label="Udostępnij" name="share"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/pl/menu_inspect_object_gear.xml
index 988c31a6e4..2c56d2ca3d 100644
--- a/indra/newview/skins/default/xui/pl/menu_inspect_object_gear.xml
+++ b/indra/newview/skins/default/xui/pl/menu_inspect_object_gear.xml
@@ -5,7 +5,7 @@
<menu_item_call label="Zapłać" name="pay"/>
<menu_item_call label="Kup" name="buy"/>
<menu_item_call label="Weź" name="take"/>
- <menu_item_call label="Weź Kopię" name="take_copy"/>
+ <menu_item_call label="Weź kopię" name="take_copy"/>
<menu_item_call label="Otwórz" name="open"/>
<menu_item_call label="Edytuj" name="edit"/>
<menu_item_call label="Ubierz" name="wear"/>
@@ -13,5 +13,5 @@
<menu_item_call label="Zablokuj" name="block"/>
<menu_item_call label="Przybliż" name="zoom_in"/>
<menu_item_call label="Usuń" name="remove"/>
- <menu_item_call label="Więcej Informacji" name="more_info"/>
+ <menu_item_call label="Więcej informacji" name="more_info"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_inventory.xml b/indra/newview/skins/default/xui/pl/menu_inventory.xml
index 75c84c275d..7fe9da3c0c 100755..100644
--- a/indra/newview/skins/default/xui/pl/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/pl/menu_inventory.xml
@@ -4,32 +4,32 @@
<menu_item_call label="Otwórz" name="Task Open"/>
<menu_item_call label="Odtwarzaj" name="Task Play"/>
<menu_item_call label="Właściwości" name="Task Properties"/>
- <menu_item_call label="Zmień Nazwę" name="Task Rename"/>
+ <menu_item_call label="Zmień nazwę" name="Task Rename"/>
<menu_item_call label="Usuń" name="Task Remove"/>
<menu_item_call label="Opróżnij Kosz" name="Empty Trash"/>
<menu_item_call label="Opróżnij Folder Zgubione i Odnalezione" name="Empty Lost And Found"/>
- <menu_item_call label="Nowy Folder" name="New Folder"/>
- <menu_item_call label="Nowy Skrypt" name="New Script"/>
- <menu_item_call label="Nowa Nota" name="New Note"/>
- <menu_item_call label="Nowy Gest" name="New Gesture"/>
+ <menu_item_call label="Nowy folder" name="New Folder"/>
+ <menu_item_call label="Nowy skrypt" name="New Script"/>
+ <menu_item_call label="Nowa nota" name="New Note"/>
+ <menu_item_call label="Nowy gest" name="New Gesture"/>
<menu label="Nowe Ubranie" name="New Clothes">
- <menu_item_call label="Nowa Koszulka" name="New Shirt"/>
- <menu_item_call label="Nowe Spodnie" name="New Pants"/>
- <menu_item_call label="Nowe Buty" name="New Shoes"/>
- <menu_item_call label="Nowe Skarpety" name="New Socks"/>
- <menu_item_call label="Nowa Kurtka" name="New Jacket"/>
- <menu_item_call label="Nowa Spódnica" name="New Skirt"/>
- <menu_item_call label="Nowe Rękawiczki" name="New Gloves"/>
- <menu_item_call label="Nowy Podkoszulek" name="New Undershirt"/>
- <menu_item_call label="Nowa Bielizna" name="New Underpants"/>
- <menu_item_call label="Nowa Maska Przezroczysta" name="New Alpha Mask"/>
- <menu_item_call label="Nowy Tatuaż" name="New Tattoo"/>
+ <menu_item_call label="Nowa koszulka" name="New Shirt"/>
+ <menu_item_call label="Nowe spodnie" name="New Pants"/>
+ <menu_item_call label="Nowe buty" name="New Shoes"/>
+ <menu_item_call label="Nowe skarpety" name="New Socks"/>
+ <menu_item_call label="Nowa kurtka" name="New Jacket"/>
+ <menu_item_call label="Nowa spódnica" name="New Skirt"/>
+ <menu_item_call label="Nowe rękawiczki" name="New Gloves"/>
+ <menu_item_call label="Nowy podkoszulek" name="New Undershirt"/>
+ <menu_item_call label="Nowa bielizna" name="New Underpants"/>
+ <menu_item_call label="Nowa maska Alpha" name="New Alpha Mask"/>
+ <menu_item_call label="Nowy tatuaż" name="New Tattoo"/>
</menu>
<menu label="Nowa Część Ciała" name="New Body Parts">
- <menu_item_call label="Nowy Kształt" name="New Shape"/>
- <menu_item_call label="Nowa Skórka" name="New Skin"/>
- <menu_item_call label="Nowe Włosy" name="New Hair"/>
- <menu_item_call label="Nowe Oczy" name="New Eyes"/>
+ <menu_item_call label="Nowy kształt" name="New Shape"/>
+ <menu_item_call label="Nowa skórka" name="New Skin"/>
+ <menu_item_call label="Nowe włosy" name="New Hair"/>
+ <menu_item_call label="Nowe oczy" name="New Eyes"/>
</menu>
<menu label="Zmień Czcionkę" name="Change Type">
<menu_item_call label="Domyślna" name="Default"/>
@@ -46,32 +46,31 @@
<menu_item_call label="Teleportuj" name="Landmark Open"/>
<menu_item_call label="Otwórz" name="Animation Open"/>
<menu_item_call label="Otwórz" name="Sound Open"/>
- <menu_item_call label="Usuń Obiekt" name="Purge Item"/>
- <menu_item_call label="Przywróć Obiekt" name="Restore Item"/>
- <menu_item_call label="Otwórz Link" name="Goto Link"/>
+ <menu_item_call label="Zmień strój" name="Replace Outfit"/>
+ <menu_item_call label="Dodaj do stroju" name="Add To Outfit"/>
+ <menu_item_call label="Usuń obiekt" name="Purge Item"/>
+ <menu_item_call label="Przywróć obiekt" name="Restore Item"/>
<menu_item_call label="Otwórz" name="Open"/>
<menu_item_call label="Właściwości" name="Properties"/>
- <menu_item_call label="Zmień Nazwę" name="Rename"/>
- <menu_item_call label="Kopiuj Dane UUID" name="Copy Asset UUID"/>
+ <menu_item_call label="Zmień nazwę" name="Rename"/>
+ <menu_item_call label="Kopiuj dane UUID" name="Copy Asset UUID"/>
<menu_item_call label="Kopiuj" name="Copy"/>
<menu_item_call label="Wklej" name="Paste"/>
- <menu_item_call label="Wklej jako Link" name="Paste As Link"/>
+ <menu_item_call label="Wklej jako link" name="Paste As Link"/>
<menu_item_call label="Usuń" name="Delete"/>
- <menu_item_call label="Zdejmij Obiekt" name="Take Off Items"/>
- <menu_item_call label="Dodaj do Stroju" name="Add To Outfit"/>
- <menu_item_call label="Zmień Strój" name="Replace Outfit"/>
- <menu_item_call label="Rozpocznij KonferencjÄ™ CzatowÄ…" name="Conference Chat Folder"/>
+ <menu_item_call label="Skasuj Folder Systemu" name="Delete System Folder"/>
+ <menu_item_call label="Rozpocznij konferencjÄ™ czatowÄ…" name="Conference Chat Folder"/>
<menu_item_call label="Odtwarzaj" name="Sound Play"/>
<menu_item_call label="O Miejscu" name="About Landmark"/>
- <menu_item_call label="Odtwarzaj w Åšwiecie" name="Animation Play"/>
- <menu_item_call label="Odtwarzaj Lokalnie" name="Animation Audition"/>
+ <menu_item_call label="Używaj in-world" name="Animation Play"/>
+ <menu_item_call label="Odtwarzaj lokalnie" name="Animation Audition"/>
<menu_item_call label="Wyślij IM" name="Send Instant Message"/>
- <menu_item_call label="Zaoferuj TeleportacjÄ™..." name="Offer Teleport..."/>
- <menu_item_call label="Rozpocznij KonferencjÄ™ CzatowÄ…" name="Conference Chat"/>
+ <menu_item_call label="Teleportuj..." name="Offer Teleport..."/>
+ <menu_item_call label="Rozpocznij konferencjÄ™ czatowÄ…" name="Conference Chat"/>
<menu_item_call label="Aktywuj" name="Activate"/>
<menu_item_call label="Deaktywuj" name="Deactivate"/>
<menu_item_call label="Zapisz jako" name="Save As"/>
- <menu_item_call label="Odłącz od Siebie" name="Detach From Yourself"/>
+ <menu_item_call label="Odłącz od siebie" name="Detach From Yourself"/>
<menu_item_call label="Ubierz" name="Object Wear"/>
<menu label="Dołącz do" name="Attach To"/>
<menu label="Dołącz do Załączników HUD" name="Attach To HUD"/>
diff --git a/indra/newview/skins/default/xui/pl/menu_inventory_add.xml b/indra/newview/skins/default/xui/pl/menu_inventory_add.xml
index 5b8c5426dd..b4d85c2c5c 100644
--- a/indra/newview/skins/default/xui/pl/menu_inventory_add.xml
+++ b/indra/newview/skins/default/xui/pl/menu_inventory_add.xml
@@ -1,32 +1,32 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_inventory_add">
<menu label="Załaduj" name="upload">
- <menu_item_call label="Obraz (L$[COST])..." name="Upload Image"/>
- <menu_item_call label="Dźwięk (L$[COST])..." name="Upload Sound"/>
- <menu_item_call label="AnimacjÄ™ (L$[COST])..." name="Upload Animation"/>
- <menu_item_call label="Zbiór Plików (L$[COST] za jeden plik)..." name="Bulk Upload"/>
+ <menu_item_call label="obraz (L$[COST])..." name="Upload Image"/>
+ <menu_item_call label="dźwięk (L$[COST])..." name="Upload Sound"/>
+ <menu_item_call label="animacjÄ™ (L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="zbiór plików (L$[COST] za jeden plik)..." name="Bulk Upload"/>
</menu>
- <menu_item_call label="Nowy Folder" name="New Folder"/>
- <menu_item_call label="Nowy Skrypt" name="New Script"/>
- <menu_item_call label="Nowa Nota" name="New Note"/>
- <menu_item_call label="Nowa Gesturka" name="New Gesture"/>
+ <menu_item_call label="Nowy folder" name="New Folder"/>
+ <menu_item_call label="Nowy skrypt" name="New Script"/>
+ <menu_item_call label="Nowa nota" name="New Note"/>
+ <menu_item_call label="Nowy gest" name="New Gesture"/>
<menu label="Nowe Ubranie" name="New Clothes">
- <menu_item_call label="Nowa Koszulka" name="New Shirt"/>
- <menu_item_call label="Nowe Spodnie" name="New Pants"/>
- <menu_item_call label="Nowe Buty" name="New Shoes"/>
- <menu_item_call label="Nowe Skarpetki" name="New Socks"/>
- <menu_item_call label="Nowa Kurtka" name="New Jacket"/>
- <menu_item_call label="Nowa Spódnica" name="New Skirt"/>
- <menu_item_call label="Nowe Rękawiczki" name="New Gloves"/>
- <menu_item_call label="Nowy Podkoszulek" name="New Undershirt"/>
- <menu_item_call label="Nowa Bielizna" name="New Underpants"/>
- <menu_item_call label="Nowe Ubranie Przezroczyste" name="New Alpha"/>
- <menu_item_call label="Nowy Tatuaż" name="New Tattoo"/>
+ <menu_item_call label="Nowa koszulka" name="New Shirt"/>
+ <menu_item_call label="Nowe spodnie" name="New Pants"/>
+ <menu_item_call label="Nowe buty" name="New Shoes"/>
+ <menu_item_call label="Nowe skarpetki" name="New Socks"/>
+ <menu_item_call label="Nowa kurtka" name="New Jacket"/>
+ <menu_item_call label="Nowa spódnica" name="New Skirt"/>
+ <menu_item_call label="Nowe rękawiczki" name="New Gloves"/>
+ <menu_item_call label="Nowy podkoszulek" name="New Undershirt"/>
+ <menu_item_call label="Nowa bielizna" name="New Underpants"/>
+ <menu_item_call label="Nowe ubranie Przezroczyste" name="New Alpha"/>
+ <menu_item_call label="Nowy tatuaż" name="New Tattoo"/>
</menu>
<menu label="Nowa Część Ciała" name="New Body Parts">
- <menu_item_call label="Nowy Kształt" name="New Shape"/>
- <menu_item_call label="Nowa Skórka" name="New Skin"/>
- <menu_item_call label="Nowe Włosy" name="New Hair"/>
- <menu_item_call label="Nowe Oczy" name="New Eyes"/>
+ <menu_item_call label="Nowy kształt" name="New Shape"/>
+ <menu_item_call label="Nowa skórka" name="New Skin"/>
+ <menu_item_call label="Nowe włosy" name="New Hair"/>
+ <menu_item_call label="Nowe oczy" name="New Eyes"/>
</menu>
</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml
index 8f5f94a02f..2ec3741682 100644
--- a/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/pl/menu_inventory_gear_default.xml
@@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_gear_default">
- <menu_item_call label="Nowe Okno Szafy" name="new_window"/>
- <menu_item_call label="Porządkuj Według Nazwy" name="sort_by_name"/>
- <menu_item_call label="Porządkuj Według Daty" name="sort_by_recent"/>
- <menu_item_call label="Pokaż Filtry" name="show_filters"/>
- <menu_item_call label="Zresetuj Filtry" name="reset_filters"/>
- <menu_item_call label="Zamknij Wszystkie Foldery" name="close_folders"/>
+ <menu_item_call label="Nowe okno Szafy" name="new_window"/>
+ <menu_item_call label="Porządkuj według nazwy" name="sort_by_name"/>
+ <menu_item_call label="Porządkuj według daty" name="sort_by_recent"/>
+ <menu_item_call label="Pokaż filtry" name="show_filters"/>
+ <menu_item_call label="Zresetuj filtry" name="reset_filters"/>
+ <menu_item_call label="Zamknij wszystkie foldery" name="close_folders"/>
<menu_item_call label="Opróżnij Kosz" name="empty_trash"/>
<menu_item_call label="Opróżnij Zagubione i Odnalezione" name="empty_lostnfound"/>
- <menu_item_call label="Zapisz TeksturÄ™ Jako" name="Save Texture As"/>
- <menu_item_call label="Znajdź Oryginał" name="Find Original"/>
- <menu_item_call label="Znajdź Wszystkie Linki" name="Find All Links"/>
+ <menu_item_call label="Zapisz teksturÄ™ jako" name="Save Texture As"/>
+ <menu_item_call label="Znajdź oryginał" name="Find Original"/>
+ <menu_item_call label="Znajdź wszystkie linki" name="Find All Links"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_land.xml b/indra/newview/skins/default/xui/pl/menu_land.xml
index 2c89b43525..1e1ce73089 100644
--- a/indra/newview/skins/default/xui/pl/menu_land.xml
+++ b/indra/newview/skins/default/xui/pl/menu_land.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Land Pie">
<menu_item_call label="O Posiadłości" name="Place Information..."/>
- <menu_item_call label="Usiądź Tutaj" name="Sit Here"/>
+ <menu_item_call label="Usiądź tutaj" name="Sit Here"/>
<menu_item_call label="Kup Posiadłość" name="Land Buy"/>
- <menu_item_call label="Kup Wstęp" name="Land Buy Pass"/>
+ <menu_item_call label="Kup przepustkÄ™" name="Land Buy Pass"/>
<menu_item_call label="Buduj" name="Create"/>
- <menu_item_call label="Edytuj Teren" name="Edit Terrain"/>
+ <menu_item_call label="Edytuj teren" name="Edit Terrain"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_landmark.xml b/indra/newview/skins/default/xui/pl/menu_landmark.xml
index 8cd7e03bf1..aa5808390c 100644
--- a/indra/newview/skins/default/xui/pl/menu_landmark.xml
+++ b/indra/newview/skins/default/xui/pl/menu_landmark.xml
@@ -3,5 +3,5 @@
<menu_item_call label="Kopiuj SLurl" name="copy"/>
<menu_item_call label="Usuń" name="delete"/>
<menu_item_call label="Utwórz" name="pick"/>
- <menu_item_call label="Dodaj do Paska Ulubionych" name="add_to_favbar"/>
+ <menu_item_call label="Dodaj do paska Ulubionych" name="add_to_favbar"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_login.xml b/indra/newview/skins/default/xui/pl/menu_login.xml
index 5084b59397..ed4937182f 100755..100644
--- a/indra/newview/skins/default/xui/pl/menu_login.xml
+++ b/indra/newview/skins/default/xui/pl/menu_login.xml
@@ -2,10 +2,11 @@
<menu_bar name="Login Menu">
<menu label="Ja" name="File">
<menu_item_call label="Ustawienia" name="Preferences..."/>
- <menu_item_call label="Wyłącz Program" name="Quit"/>
+ <menu_item_call label="Wyłącz program" name="Quit"/>
</menu>
<menu label="Pomoc" name="Help">
<menu_item_call label="[SECOND_LIFE]: Pomoc" name="Second Life Help"/>
+ <menu_item_call label="O [APP_NAME]" name="About Second Life"/>
</menu>
<menu label="Debug" name="Debug">
<menu label="Edytuj" name="Edit">
@@ -16,15 +17,15 @@
<menu_item_call label="Wklej" name="Paste"/>
<menu_item_call label="Usuń" name="Delete"/>
<menu_item_call label="Powiel" name="Duplicate"/>
- <menu_item_call label="Zaznacz Wszystko" name="Select All"/>
+ <menu_item_call label="Zaznacz wszystko" name="Select All"/>
<menu_item_call label="Odznacz" name="Deselect"/>
</menu>
- <menu_item_call label="Ustawienia Debugowania" name="Debug Settings"/>
- <menu_item_call label="Ustawienia UI/Kolor" name="UI/Color Settings"/>
- <menu_item_call label="Pokaż schowek" name="Show Side Tray"/>
+ <menu_item_call label="Ustawienia debugowania" name="Debug Settings"/>
+ <menu_item_call label="Ustawienia UI/kolor" name="UI/Color Settings"/>
<menu label="UI Testy" name="UI Tests"/>
+ <menu_item_call label="Ustaw rozmiar interfejsu..." name="Set Window Size..."/>
<menu_item_call label="Wyświetl TOS" name="TOS"/>
- <menu_item_call label="Wyświetl Wiadomość Krytyczną" name="Critical"/>
- <menu_item_call label="Test PrzeglÄ…darki Internetowej" name="Web Browser Test"/>
+ <menu_item_call label="Wyświetl wiadomość krytyczną" name="Critical"/>
+ <menu_item_call label="Test przeglÄ…darki internetowej" name="Web Browser Test"/>
</menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/pl/menu_mini_map.xml b/indra/newview/skins/default/xui/pl/menu_mini_map.xml
index 4152fb41c8..94e4c91abb 100644
--- a/indra/newview/skins/default/xui/pl/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/pl/menu_mini_map.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="popup">
- <menu_item_call label="Zoom Blisko" name="Zoom Close"/>
- <menu_item_call label="Zoom Åšrednio" name="Zoom Medium"/>
- <menu_item_call label="Zoom Daleko" name="Zoom Far"/>
- <menu_item_check label="Obróć Mapę" name="Rotate Map"/>
+<menu name="Popup">
+ <menu_item_call label="Zoom blisko" name="Zoom Close"/>
+ <menu_item_call label="Zoom średnio" name="Zoom Medium"/>
+ <menu_item_call label="Zoom daleko" name="Zoom Far"/>
+ <menu_item_check label="Obróć mapę" name="Rotate Map"/>
<menu_item_call label="Zatrzymaj" name="Stop Tracking"/>
<menu_item_call label="Mapa Åšwiata" name="World Map"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_navbar.xml b/indra/newview/skins/default/xui/pl/menu_navbar.xml
index 8d84f3e764..f38b805ee2 100644
--- a/indra/newview/skins/default/xui/pl/menu_navbar.xml
+++ b/indra/newview/skins/default/xui/pl/menu_navbar.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Navbar Menu">
- <menu_item_check label="Pokaż Współrzędne" name="Show Coordinates"/>
- <menu_item_check label="Pokaż Właściwości Posiadłości" name="Show Parcel Properties"/>
+ <menu_item_check label="Pokaż współrzędne" name="Show Coordinates"/>
+ <menu_item_check label="Pokaż właściwości Posiadłości" name="Show Parcel Properties"/>
<menu_item_call label="Ulubione Miejsce" name="Landmark"/>
<menu_item_call label="Wytnij" name="Cut"/>
<menu_item_call label="Kopiuj" name="Copy"/>
<menu_item_call label="Wklej" name="Paste"/>
<menu_item_call label="Usuń" name="Delete"/>
- <menu_item_call label="Zaznacz Wszystko" name="Select All"/>
+ <menu_item_call label="Zaznacz wszystko" name="Select All"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_nearby_chat.xml b/indra/newview/skins/default/xui/pl/menu_nearby_chat.xml
index 78b8c0a4fc..fe5bc6ba6f 100644
--- a/indra/newview/skins/default/xui/pl/menu_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/pl/menu_nearby_chat.xml
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="NearBy Chat Menu">
- <menu_item_call label="Pokaż Osoby w Pobliżu..." name="nearby_people"/>
- <menu_item_check label="Pokaż Zablokowany Tekst" name="muted_text"/>
- <menu_item_check label="Wyświetlaj Ikonki Znajomych" name="show_buddy_icons"/>
- <menu_item_check label="Wyświetlaj Imiona" name="show_names"/>
- <menu_item_check label="Wyświetlaj Ikonki i Imiona" name="show_icons_and_names"/>
- <menu_item_call label="Rozmiar Czcionki" name="font_size"/>
+ <menu_item_call label="Pokaż osoby w pobliżu..." name="nearby_people"/>
+ <menu_item_check label="Pokaż zablokowany tekst" name="muted_text"/>
+ <menu_item_check label="Wyświetlaj ikonki znajomych" name="show_buddy_icons"/>
+ <menu_item_check label="Wyświetlaj imiona" name="show_names"/>
+ <menu_item_check label="Wyświetlaj ikonki i imiona" name="show_icons_and_names"/>
+ <menu_item_call label="Rozmiar czcionki" name="font_size"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_notification_well_button.xml b/indra/newview/skins/default/xui/pl/menu_notification_well_button.xml
new file mode 100644
index 0000000000..bd3d42f9b1
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_notification_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Notification Well Button Context Menu">
+ <menu_item_call label="Zamknij" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_object.xml b/indra/newview/skins/default/xui/pl/menu_object.xml
index bdeeb61bf4..763b120f89 100644
--- a/indra/newview/skins/default/xui/pl/menu_object.xml
+++ b/indra/newview/skins/default/xui/pl/menu_object.xml
@@ -4,21 +4,24 @@
<menu_item_call label="Edytuj" name="Edit..."/>
<menu_item_call label="Buduj" name="Build"/>
<menu_item_call label="Otwórz" name="Open"/>
- <menu_item_call label="Usiądź Tutaj" name="Object Sit"/>
+ <menu_item_call label="Usiądź tutaj" name="Object Sit"/>
+ <menu_item_call label="Wstań" name="Object Stand Up"/>
<menu_item_call label="Sprawdź" name="Object Inspect"/>
- <context_menu label="Połóż &gt;" name="Put On">
+ <menu_item_call label="Przybliż" name="Zoom In"/>
+ <context_menu label="Załóż na ▶" name="Put On">
<menu_item_call label="Załóż" name="Wear"/>
- <context_menu label="Dołącz do &gt;" name="Object Attach"/>
- <context_menu label="Dołącz do HUD &gt;" name="Object Attach HUD"/>
+ <context_menu label="Dołącz ▶" name="Object Attach"/>
+ <context_menu label="Dołącz HUD ▶" name="Object Attach HUD"/>
</context_menu>
- <context_menu label="Usuń &gt;" name="Remove">
- <menu_item_call label="Weź" name="Pie Object Take"/>
+ <context_menu label="Usuń ▶" name="Remove">
<menu_item_call label="Raport" name="Report Abuse..."/>
<menu_item_call label="Zablokuj" name="Object Mute"/>
<menu_item_call label="Zwróć" name="Return..."/>
<menu_item_call label="Usuń" name="Delete"/>
</context_menu>
- <menu_item_call label="Weź Kopię" name="Take Copy"/>
+ <menu_item_call label="Kup" name="Pie Object Bye"/>
+ <menu_item_call label="Weź" name="Pie Object Take"/>
+ <menu_item_call label="Weź kopię" name="Take Copy"/>
<menu_item_call label="Zapłać" name="Pay..."/>
<menu_item_call label="Kup" name="Buy..."/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_participant_list.xml b/indra/newview/skins/default/xui/pl/menu_participant_list.xml
index 604ee2d104..079b8558da 100644
--- a/indra/newview/skins/default/xui/pl/menu_participant_list.xml
+++ b/indra/newview/skins/default/xui/pl/menu_participant_list.xml
@@ -1,16 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Participant List Context Menu">
+ <menu_item_check label="Sortuj według imienia" name="SortByName"/>
+ <menu_item_check label="Sortuj według ostatniego mówcy" name="SortByRecentSpeakers"/>
<menu_item_call label="Zobacz Profil" name="View Profile"/>
<menu_item_call label="Dodaj Znajomość" name="Add Friend"/>
<menu_item_call label="IM" name="IM"/>
<menu_item_call label="Zadzwoń" name="Call"/>
<menu_item_call label="Udostępnij" name="Share"/>
<menu_item_call label="Zapłać" name="Pay"/>
- <menu_item_check label="Zablokuj/Odblokuj" name="Block/Unblock"/>
- <menu_item_check label="Zablokuj Tekst" name="MuteText"/>
- <menu_item_check label="Odblokuj Tekst" name="AllowTextChat"/>
- <menu_item_call label="Zablokuj tego uczestnika" name="ModerateVoiceMuteSelected"/>
- <menu_item_call label="Zablokuj wszystkich pozostałych" name="ModerateVoiceMuteOthers"/>
- <menu_item_call label="Oblokuj tego uczestnika" name="ModerateVoiceUnMuteSelected"/>
- <menu_item_call label="Odblokuj wszystkich pozostałych" name="ModerateVoiceUnMuteOthers"/>
+ <menu_item_check label="Zablokuj głos" name="Block/Unblock"/>
+ <menu_item_check label="Zablokuj tekst" name="MuteText"/>
+ <context_menu label="Opcje Moderatora &gt;" name="Moderator Options">
+ <menu_item_check label="Czat/IM dozwolony" name="AllowTextChat"/>
+ <menu_item_call label="Wycisz tego uczestnika" name="ModerateVoiceMuteSelected"/>
+ <menu_item_call label="Wycisz wszystkich pozostałych" name="ModerateVoiceMuteOthers"/>
+ <menu_item_call label="Odblokuj wyciszenie tego uczestnika" name="ModerateVoiceUnMuteSelected"/>
+ <menu_item_call label="Odblokuj wyciszenie wszystkich" name="ModerateVoiceUnMuteOthers"/>
+ </context_menu>
</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/pl/menu_people_friends_view_sort.xml
index 0043030035..9c33fad00f 100644
--- a/indra/newview/skins/default/xui/pl/menu_people_friends_view_sort.xml
+++ b/indra/newview/skins/default/xui/pl/menu_people_friends_view_sort.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_group_plus">
- <menu_item_check label="Porządkuj Według Nazwy" name="sort_name"/>
- <menu_item_check label="Porządkuj Według Statusu" name="sort_status"/>
- <menu_item_check label="Wyświetlaj Ikonki" name="view_icons"/>
- <menu_item_call label="Pokaż Zablokowanych Rezydentów &amp; Obiekty" name="show_blocked_list"/>
+ <menu_item_check label="Porządkuj według nazwy" name="sort_name"/>
+ <menu_item_check label="Porządkuj według statusu" name="sort_status"/>
+ <menu_item_check label="Wyświetlaj ikonki" name="view_icons"/>
+ <menu_item_call label="Pokaż zablokowanych Rezydentów &amp; obiekty" name="show_blocked_list"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_people_groups.xml b/indra/newview/skins/default/xui/pl/menu_people_groups.xml
new file mode 100644
index 0000000000..567482dcda
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/menu_people_groups.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Zobacz Info" name="View Info"/>
+ <menu_item_call label="Czat" name="Chat"/>
+ <menu_item_call label="Rozmowa" name="Call"/>
+ <menu_item_call label="Aktywuj" name="Activate"/>
+ <menu_item_call label="Opuść" name="Leave"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/pl/menu_people_groups_view_sort.xml
index f661cfeba0..4be60d9b83 100644
--- a/indra/newview/skins/default/xui/pl/menu_people_groups_view_sort.xml
+++ b/indra/newview/skins/default/xui/pl/menu_people_groups_view_sort.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_group_plus">
- <menu_item_check label="Wyświetlaj Ikonki Grupy" name="Display Group Icons"/>
- <menu_item_call label="Opuść Zaznaczone Grupy" name="Leave Selected Group"/>
+ <menu_item_check label="Wyświetlaj ikonki Grupy" name="Display Group Icons"/>
+ <menu_item_call label="Opuść zaznaczone Grupy" name="Leave Selected Group"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_people_nearby.xml b/indra/newview/skins/default/xui/pl/menu_people_nearby.xml
index 0f80b56c16..afe3a5200b 100644
--- a/indra/newview/skins/default/xui/pl/menu_people_nearby.xml
+++ b/indra/newview/skins/default/xui/pl/menu_people_nearby.xml
@@ -2,9 +2,12 @@
<context_menu name="Avatar Context Menu">
<menu_item_call label="Zobacz Profil" name="View Profile"/>
<menu_item_call label="Dodaj Znajomość" name="Add Friend"/>
+ <menu_item_call label="Usuń z listy Znajomych" name="Remove Friend"/>
<menu_item_call label="IM" name="IM"/>
<menu_item_call label="Zadzwoń" name="Call"/>
+ <menu_item_call label="Mapa" name="Map"/>
<menu_item_call label="Udostępnij" name="Share"/>
<menu_item_call label="Zapłać" name="Pay"/>
<menu_item_check label="Zablokuj/Odblokuj" name="Block/Unblock"/>
+ <menu_item_call label="Teleportuj" name="teleport"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/pl/menu_people_nearby_multiselect.xml
index 156c10e3f3..bc89402a96 100644
--- a/indra/newview/skins/default/xui/pl/menu_people_nearby_multiselect.xml
+++ b/indra/newview/skins/default/xui/pl/menu_people_nearby_multiselect.xml
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Multi-Selected People Context Menu">
<menu_item_call label="Dodaj Znajomych" name="Add Friends"/>
+ <menu_item_call label="Usuń Znajomych" name="Remove Friend"/>
<menu_item_call label="IM" name="IM"/>
<menu_item_call label="Zadzwoń" name="Call"/>
<menu_item_call label="Udostępnij" name="Share"/>
diff --git a/indra/newview/skins/default/xui/pl/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/pl/menu_people_nearby_view_sort.xml
index 9e5f1a5917..8ec3820f84 100644
--- a/indra/newview/skins/default/xui/pl/menu_people_nearby_view_sort.xml
+++ b/indra/newview/skins/default/xui/pl/menu_people_nearby_view_sort.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_group_plus">
- <menu_item_check label="Porządkuj Według Ostatnich Rozmówców" name="sort_by_recent_speakers"/>
- <menu_item_check label="Porządkuj Według Nazwy" name="sort_name"/>
- <menu_item_check label="Porządkuj Według Odległości" name="sort_distance"/>
- <menu_item_check label="Wyświetlaj Ikonki" name="view_icons"/>
- <menu_item_call label="Pokaż Zablokowanych Rezydentów &amp; Obiekty" name="show_blocked_list"/>
+ <menu_item_check label="Porządkuj według ostatnich rozmówców" name="sort_by_recent_speakers"/>
+ <menu_item_check label="Porządkuj według nazwy" name="sort_name"/>
+ <menu_item_check label="Porządkuj według odległości" name="sort_distance"/>
+ <menu_item_check label="Wyświetlaj ikonki" name="view_icons"/>
+ <menu_item_call label="Pokaż zablokowanych Rezydentów &amp; obiekty" name="show_blocked_list"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/pl/menu_people_recent_view_sort.xml
index 418b67bce8..b474a556bd 100644
--- a/indra/newview/skins/default/xui/pl/menu_people_recent_view_sort.xml
+++ b/indra/newview/skins/default/xui/pl/menu_people_recent_view_sort.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_group_plus">
- <menu_item_check label="Porządkuj Według Daty" name="sort_most"/>
- <menu_item_check label="Porządkuj Według Nazwy" name="sort_name"/>
- <menu_item_check label="Wyświetlaj Ikonki" name="view_icons"/>
- <menu_item_call label="Pokaż Zablokowanych Rezydentów &amp; Obiekty" name="show_blocked_list"/>
+ <menu_item_check label="Porządkuj według daty" name="sort_most"/>
+ <menu_item_check label="Porządkuj według nazwy" name="sort_name"/>
+ <menu_item_check label="Wyświetlaj ikonki" name="view_icons"/>
+ <menu_item_call label="Pokaż zablokowanych Rezydentów &amp; obiekty" name="show_blocked_list"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_picks_plus.xml b/indra/newview/skins/default/xui/pl/menu_picks_plus.xml
index 14ab9c2978..8f196612a8 100644
--- a/indra/newview/skins/default/xui/pl/menu_picks_plus.xml
+++ b/indra/newview/skins/default/xui/pl/menu_picks_plus.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="picks_plus_menu">
- <menu_item_call label="Utwórz" name="create_pick"/>
+ <menu_item_call label="Stwórz" name="create_pick"/>
<menu_item_call label="Nowa Reklama" name="create_classified"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_place.xml b/indra/newview/skins/default/xui/pl/menu_place.xml
index 72f4b1265f..312bfc6bb0 100644
--- a/indra/newview/skins/default/xui/pl/menu_place.xml
+++ b/indra/newview/skins/default/xui/pl/menu_place.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="place_overflow_menu">
- <menu_item_call label="Zapisz Ulubione Miejsce" name="landmark"/>
+ <menu_item_call label="Zapisz Landmark" name="landmark"/>
<menu_item_call label="Utwórz" name="pick"/>
- <menu_item_call label="Kup Wstęp" name="pass"/>
+ <menu_item_call label="Kup PrzepustkÄ™" name="pass"/>
<menu_item_call label="Edytuj" name="edit"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_place_add_button.xml b/indra/newview/skins/default/xui/pl/menu_place_add_button.xml
index a737fc49ce..6175671fb9 100644
--- a/indra/newview/skins/default/xui/pl/menu_place_add_button.xml
+++ b/indra/newview/skins/default/xui/pl/menu_place_add_button.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_folder_gear">
- <menu_item_call label="Dodaj Folder" name="add_folder"/>
- <menu_item_call label="Dodaj do Ulubionych Miejsc" name="add_landmark"/>
+ <menu_item_call label="Dodaj folder" name="add_folder"/>
+ <menu_item_call label="Dodaj do Landmarków" name="add_landmark"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml
index f5ece87b28..d17b6c1033 100644
--- a/indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml
+++ b/indra/newview/skins/default/xui/pl/menu_places_gear_folder.xml
@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_folder_gear">
- <menu_item_call label="Dodaj do Ulubionych Miejsc" name="add_landmark"/>
- <menu_item_call label="Dodaj Folder" name="add_folder"/>
+ <menu_item_call label="Dodaj do Landmarków" name="add_landmark"/>
+ <menu_item_call label="Dodaj folder" name="add_folder"/>
<menu_item_call label="Wytnij" name="cut"/>
<menu_item_call label="Kopiuj" name="copy_folder"/>
<menu_item_call label="Wklej" name="paste"/>
- <menu_item_call label="Zmień Nazwę" name="rename"/>
+ <menu_item_call label="Zmień nazwę" name="rename"/>
<menu_item_call label="Usuń" name="delete"/>
<menu_item_call label="Rozwiń" name="expand"/>
<menu_item_call label="Schowaj" name="collapse"/>
- <menu_item_call label="Rozwiń Wszystkie Foldery" name="expand_all"/>
- <menu_item_call label="Schowaj Wszystkie Foldery" name="collapse_all"/>
+ <menu_item_call label="Rozwiń wszystkie foldery" name="expand_all"/>
+ <menu_item_call label="Schowaj wszystkie foldery" name="collapse_all"/>
<menu_item_check label="Sortuj według daty" name="sort_by_date"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml
index e88f650ed0..0720aea8aa 100644
--- a/indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml
+++ b/indra/newview/skins/default/xui/pl/menu_places_gear_landmark.xml
@@ -1,18 +1,18 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="menu_ladmark_gear">
<menu_item_call label="Teleportuj" name="teleport"/>
- <menu_item_call label="Więcej Informacji" name="more_info"/>
- <menu_item_call label="Pokaż na Mapie" name="show_on_map"/>
- <menu_item_call label="Dodaj do Ulubionych Miejsc" name="add_landmark"/>
- <menu_item_call label="Dodaj Folder" name="add_folder"/>
+ <menu_item_call label="Więcej informacji" name="more_info"/>
+ <menu_item_call label="Pokaż na mapie" name="show_on_map"/>
+ <menu_item_call label="Dodaj do Landmarków" name="add_landmark"/>
+ <menu_item_call label="Dodaj folder" name="add_folder"/>
<menu_item_call label="Wytnij" name="cut"/>
- <menu_item_call label="Kopiuj Ulubione Miejsce" name="copy_landmark"/>
+ <menu_item_call label="Kopiuj Landmark" name="copy_landmark"/>
<menu_item_call label="Kopiuj SLurl" name="copy_slurl"/>
<menu_item_call label="Wklej" name="paste"/>
- <menu_item_call label="Zmień Nazwę" name="rename"/>
+ <menu_item_call label="Zmień nazwę" name="rename"/>
<menu_item_call label="Usuń" name="delete"/>
- <menu_item_call label="Rozwiń Wszystkie Foldery" name="expand_all"/>
- <menu_item_call label="Schowaj Wszystkie Foldery" name="collapse_all"/>
+ <menu_item_call label="Rozwiń wszystkie foldery" name="expand_all"/>
+ <menu_item_call label="Schowaj wszystkie foldery" name="collapse_all"/>
<menu_item_check label="Sortuj według daty" name="sort_by_date"/>
<menu_item_call label="Stwórz Ulubione" name="create_pick"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_profile_overflow.xml b/indra/newview/skins/default/xui/pl/menu_profile_overflow.xml
index 8405d48e49..ef836c8ecf 100644
--- a/indra/newview/skins/default/xui/pl/menu_profile_overflow.xml
+++ b/indra/newview/skins/default/xui/pl/menu_profile_overflow.xml
@@ -1,5 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<toggleable_menu name="profile_overflow_menu">
+ <menu_item_call label="Mapa" name="show_on_map"/>
<menu_item_call label="Zapłać" name="pay"/>
<menu_item_call label="Udostępnij" name="share"/>
+ <menu_item_call label="Zablokuj" name="block"/>
+ <menu_item_call label="Odblokuj" name="unblock"/>
+ <menu_item_call label="Wyrzuć" name="kick"/>
+ <menu_item_call label="Unieruchom" name="freeze"/>
+ <menu_item_call label="Uruchom" name="unfreeze"/>
+ <menu_item_call label="CSR" name="csr"/>
</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_slurl.xml b/indra/newview/skins/default/xui/pl/menu_slurl.xml
index 719959df6a..719959df6a 100755..100644
--- a/indra/newview/skins/default/xui/pl/menu_slurl.xml
+++ b/indra/newview/skins/default/xui/pl/menu_slurl.xml
diff --git a/indra/newview/skins/default/xui/pl/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/pl/menu_teleport_history_item.xml
index 7e58747267..cd36c116b0 100644
--- a/indra/newview/skins/default/xui/pl/menu_teleport_history_item.xml
+++ b/indra/newview/skins/default/xui/pl/menu_teleport_history_item.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Teleport History Item Context Menu">
<menu_item_call label="Teleportuj" name="Teleport"/>
- <menu_item_call label="Więcej Szczegółów" name="More Information"/>
+ <menu_item_call label="Więcej szczegółów" name="More Information"/>
<menu_item_call label="Kopiuj do schowka" name="CopyToClipboard"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_url_agent.xml b/indra/newview/skins/default/xui/pl/menu_url_agent.xml
index 0f210b140b..7c90e6582d 100644
--- a/indra/newview/skins/default/xui/pl/menu_url_agent.xml
+++ b/indra/newview/skins/default/xui/pl/menu_url_agent.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Url Popup">
<menu_item_call label="Pokaż Profil Rezydenta" name="show_agent"/>
- <menu_item_call label="Kopiuj NazwÄ™ do Schowka" name="url_copy_label"/>
+ <menu_item_call label="Kopiuj nazwÄ™ do schowka" name="url_copy_label"/>
<menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_url_group.xml b/indra/newview/skins/default/xui/pl/menu_url_group.xml
index 38e4360691..109f96e562 100644
--- a/indra/newview/skins/default/xui/pl/menu_url_group.xml
+++ b/indra/newview/skins/default/xui/pl/menu_url_group.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Url Popup">
- <menu_item_call label="Pokaż Szczegóły o Grupie" name="show_group"/>
- <menu_item_call label="Kopiuj GrupÄ™ do Schowka" name="url_copy_label"/>
+ <menu_item_call label="Pokaż szczegóły o Grupie" name="show_group"/>
+ <menu_item_call label="Kopiuj GrupÄ™ do schowka" name="url_copy_label"/>
<menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_url_http.xml b/indra/newview/skins/default/xui/pl/menu_url_http.xml
index 0d8793d41e..e73f7b6745 100644
--- a/indra/newview/skins/default/xui/pl/menu_url_http.xml
+++ b/indra/newview/skins/default/xui/pl/menu_url_http.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Url Popup">
- <menu_item_call label="Otwórz Przeglądarkę Internetową" name="url_open"/>
- <menu_item_call label="Otwórz w Wewnętrzenej Przeglądarce" name="url_open_internal"/>
- <menu_item_call label="Otwórz w Zewnętrznej Przeglądarce" name="url_open_external"/>
+ <menu_item_call label="Otwórz przeglądarkę internetową" name="url_open"/>
+ <menu_item_call label="Otwórz w wewnętrzenej przeglądarce" name="url_open_internal"/>
+ <menu_item_call label="Otwórz w zewnętrznej przeglądarce" name="url_open_external"/>
<menu_item_call label="Kopiuj URL do schowka" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_url_inventory.xml b/indra/newview/skins/default/xui/pl/menu_url_inventory.xml
index c11860d6fe..ce3309cba0 100644
--- a/indra/newview/skins/default/xui/pl/menu_url_inventory.xml
+++ b/indra/newview/skins/default/xui/pl/menu_url_inventory.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Url Popup">
- <menu_item_call label="Pokaż Obiekt w Szafie" name="show_item"/>
- <menu_item_call label="Kopiuj NazwÄ™ do Schowka" name="url_copy_label"/>
+ <menu_item_call label="Pokaż obiekt w Szafie" name="show_item"/>
+ <menu_item_call label="Kopiuj nazwÄ™ do schowka" name="url_copy_label"/>
<menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_url_map.xml b/indra/newview/skins/default/xui/pl/menu_url_map.xml
index becbd8276f..179ab1f676 100644
--- a/indra/newview/skins/default/xui/pl/menu_url_map.xml
+++ b/indra/newview/skins/default/xui/pl/menu_url_map.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Url Popup">
- <menu_item_call label="Pokaż na Mapie" name="show_on_map"/>
- <menu_item_call label="Teleportuj do Miejsca" name="teleport_to_location"/>
+ <menu_item_call label="Pokaż na mapie" name="show_on_map"/>
+ <menu_item_call label="Teleportuj do miejsca" name="teleport_to_location"/>
<menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_url_objectim.xml b/indra/newview/skins/default/xui/pl/menu_url_objectim.xml
index 0bdf1da2a4..7576208a9e 100644
--- a/indra/newview/skins/default/xui/pl/menu_url_objectim.xml
+++ b/indra/newview/skins/default/xui/pl/menu_url_objectim.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Url Popup">
- <menu_item_call label="Pokaż Szczegóły o Obiekcie" name="show_object"/>
- <menu_item_call label="Pokaż na Mapie" name="show_on_map"/>
- <menu_item_call label="Teleportuj to Miejsca Obiektu" name="teleport_to_object"/>
- <menu_item_call label="Kopiuj NazwÄ™ Obiektu do Schowka" name="url_copy_label"/>
+ <menu_item_call label="Pokaż szczegóły o obiekcie" name="show_object"/>
+ <menu_item_call label="Pokaż na mapie" name="show_on_map"/>
+ <menu_item_call label="Teleportuj to miejsca obiektu" name="teleport_to_object"/>
+ <menu_item_call label="Kopiuj nazwÄ™ obiektu do schowka" name="url_copy_label"/>
<menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_url_parcel.xml b/indra/newview/skins/default/xui/pl/menu_url_parcel.xml
index 881c010bc1..43b945b8be 100644
--- a/indra/newview/skins/default/xui/pl/menu_url_parcel.xml
+++ b/indra/newview/skins/default/xui/pl/menu_url_parcel.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Url Popup">
- <menu_item_call label="Pokaż Szczegóły o Miejscu" name="show_parcel"/>
- <menu_item_call label="Pokaż na Mapie" name="show_on_map"/>
+ <menu_item_call label="Pokaż szczegóły o Miejscu" name="show_parcel"/>
+ <menu_item_call label="Pokaż na mapie" name="show_on_map"/>
<menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_url_slurl.xml b/indra/newview/skins/default/xui/pl/menu_url_slurl.xml
index b9fa692365..456146d8e5 100644
--- a/indra/newview/skins/default/xui/pl/menu_url_slurl.xml
+++ b/indra/newview/skins/default/xui/pl/menu_url_slurl.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<context_menu name="Url Popup">
- <menu_item_call label="Pokaż Szczegóły o Miejscu" name="show_place"/>
- <menu_item_call label="Pokaż na Mapie" name="show_on_map"/>
+ <menu_item_call label="Pokaż szczegóły o Miejscu" name="show_place"/>
+ <menu_item_call label="Pokaż na mapie" name="show_on_map"/>
<menu_item_call label="Teleportuj do miejsca" name="teleport_to_location"/>
<menu_item_call label="Kopiuj SLurl do schowka" name="url_copy"/>
</context_menu>
diff --git a/indra/newview/skins/default/xui/pl/menu_viewer.xml b/indra/newview/skins/default/xui/pl/menu_viewer.xml
index 2a5842e553..d1f0ac0e5c 100755..100644
--- a/indra/newview/skins/default/xui/pl/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/pl/menu_viewer.xml
@@ -7,44 +7,45 @@
<menu_item_call label="Mój Profil" name="Profile"/>
<menu_item_call label="Mój Wygląd" name="Appearance"/>
<menu_item_check label="Moja Szafa" name="Inventory"/>
- <menu_item_call label="Pokaż Szafę w Schowku" name="ShowSidetrayInventory"/>
- <menu_item_call label="Moje Gesturki" name="Gestures"/>
+ <menu_item_check label="Moja Szafa" name="ShowSidetrayInventory"/>
+ <menu_item_check label="Moje Gesty" name="Gestures"/>
<menu label="Mój Status" name="Status">
<menu_item_call label="Tryb Oddalenia" name="Set Away"/>
<menu_item_call label="Tryb Pracy" name="Set Busy"/>
</menu>
- <menu_item_call label="ZarzÄ…daj Statusu Administratora" name="Request Admin Options"/>
+ <menu_item_call label="Zażądaj Statusu Administratora" name="Request Admin Options"/>
<menu_item_call label="Wyłącz Status Administratora" name="Leave Admin Options"/>
<menu_item_call label="Wyłącz [APP_NAME]" name="Quit"/>
</menu>
- <menu label="Kommunikacja" name="Communicate">
+ <menu label="Komunikacja" name="Communicate">
<menu_item_call label="Znajomi" name="My Friends"/>
<menu_item_call label="Grupy" name="My Groups"/>
<menu_item_check label="Czat Lokalny" name="Nearby Chat"/>
<menu_item_call label="Osoby w Pobliżu" name="Active Speakers"/>
- <menu_item_check label="Media w Pobliżu" name="Nearby Media"/>
</menu>
<menu label="Åšwiat" name="World">
- <menu_item_check label="Ustawienia Ruchu" name="Movement Controls"/>
- <menu_item_check label="Widok" name="Camera Controls"/>
- <menu_item_call label="O Posiadłości" name="About Land"/>
- <menu_item_call label="Region/MajÄ…tek" name="Region/Estate"/>
+ <menu_item_check label="Mini-Mapa" name="Mini-Map"/>
+ <menu_item_check label="Mapa Åšwiata" name="World Map"/>
+ <menu_item_call label="Zrób Zdjęcie" name="Take Snapshot"/>
+ <menu_item_call label="Zapamiętaj to Miejsce" name="Create Landmark Here"/>
+ <menu label="Miejsce" name="Land">
+ <menu_item_call label="O Posiadłości" name="About Land"/>
+ <menu_item_call label="Region/MajÄ…tek" name="Region/Estate"/>
+ </menu>
<menu_item_call label="Kup Posiadłość" name="Buy Land"/>
<menu_item_call label="Moje Posiadłości" name="My Land"/>
- <menu label="Pokaż" name="Land">
- <menu_item_check label="Linie Banu" name="Ban Lines"/>
+ <menu label="Pokaż" name="LandShow">
+ <menu_item_check label="Ustawienia Ruchu" name="Movement Controls"/>
+ <menu_item_check label="Zobacz Ustawienia" name="Camera Controls"/>
+ <menu_item_check label="Linie Bana" name="Ban Lines"/>
<menu_item_check label="Emitery" name="beacons"/>
<menu_item_check label="Granice Posiadłości" name="Property Lines"/>
<menu_item_check label="Właściciele Posiadłości" name="Land Owners"/>
+ <menu_item_check label="Współrzędne" name="Coordinates"/>
+ <menu_item_check label="Właściwości Posiadłości" name="Parcel Properties"/>
</menu>
- <menu label="Ulubione Miejsca" name="Landmarks">
- <menu_item_call label="Zapisz Ulubione Miejsce" name="Create Landmark Here"/>
- <menu_item_call label="Ustaw Miejsce Startu" name="Set Home to Here"/>
- </menu>
- <menu_item_call label="Miejsce Startu" name="Teleport Home"/>
- <menu_item_check label="Mini-Mapa" name="Mini-Map"/>
- <menu_item_check label="Mapa Åšwiata" name="World Map"/>
- <menu_item_call label="Zrób Zdjęcie" name="Take Snapshot"/>
+ <menu_item_call label="Teleportuj do Miejsca Startu" name="Teleport Home"/>
+ <menu_item_call label="Ustaw Miejsce Startu" name="Set Home to Here"/>
<menu label="Słońce" name="Environment Settings">
<menu_item_call label="Wschód Słońca" name="Sunrise"/>
<menu_item_call label="Południe" name="Noon"/>
@@ -74,12 +75,14 @@
<menu_item_call label="Zaznacz Wszystko" name="Select All"/>
<menu_item_call label="Cofnij Zaznaczenie" name="Deselect"/>
</menu>
- <menu_item_call label="Grupuj" name="Link"/>
+ <menu_item_call label="Linkuj" name="Link"/>
<menu_item_call label="Rozlinkuj" name="Unlink"/>
+ <menu_item_check label="Edytuj Zgrupowane Obiekty" name="Edit Linked Parts"/>
<menu_item_call label="Ogniskowa Selekcji" name="Focus on Selection"/>
<menu_item_call label="Przybliż do Selekcji" name="Zoom to Selection"/>
<menu label="Obiekt" name="Object">
- <menu_item_call label="Kup" name="Menu Object Take"/>
+ <menu_item_call label="Kup" name="Menu Object Buy"/>
+ <menu_item_call label="Weź" name="Menu Object Take"/>
<menu_item_call label="Weź Kopię" name="Take Copy"/>
<menu_item_call label="Zapisz Obiekt do Szafy" name="Save Object Back to My Inventory"/>
<menu_item_call label="Zapisz do Treści Obiektu" name="Save Object Back to Object Contents"/>
@@ -92,25 +95,18 @@
<menu_item_call label="Wstrzymaj Działanie Skryptów w Selekcji" name="Set Scripts to Not Running"/>
</menu>
<menu label="Opcje" name="Options">
- <menu_item_check label="Edytuj Części Zlinkowane" name="Edit Linked Parts"/>
<menu_item_call label="Ustaw DomyÅ›lne Pozwolenia Åadowania" name="perm prefs"/>
<menu_item_check label="Pokaż Zaawansowane Pozwolenia" name="DebugPermissions"/>
- <menu label="Selekcja" name="Selection">
- <menu_item_check label="Wybierz Tylko Moje Obiekty" name="Select Only My Objects"/>
- <menu_item_check label="Zaznacz Tylko PoruszajÄ…ce siÄ™ Obiekty" name="Select Only Movable Objects"/>
- <menu_item_check label="Wybierz Przez Zaznaczenie" name="Select By Surrounding"/>
- </menu>
- <menu label="Pokaż" name="Show">
- <menu_item_check label="Pokaż Ukrytą Selekcję" name="Show Hidden Selection"/>
- <menu_item_check label="Pokaż Promień Światła dla Selekcji" name="Show Light Radius for Selection"/>
- <menu_item_check label="Pokaż Emitery Selekcji" name="Show Selection Beam"/>
- </menu>
- <menu label="Siatka" name="Grid">
- <menu_item_check label="PrzeciÄ…gnij Obiekt" name="Snap to Grid"/>
- <menu_item_call label="PrzeciÄ…gnij Obiekt XY do Siatki" name="Snap Object XY to Grid"/>
- <menu_item_call label="Zastosuj Zaznaczenie dla Siatki" name="Use Selection for Grid"/>
- <menu_item_call label="Ustawienia Siatki" name="Grid Options"/>
- </menu>
+ <menu_item_check label="Wybierz Tylko Moje Obiekty" name="Select Only My Objects"/>
+ <menu_item_check label="Wybierz Tylko Obiekty Przesuwalne" name="Select Only Movable Objects"/>
+ <menu_item_check label="Wybierz przez Otoczenie" name="Select By Surrounding"/>
+ <menu_item_check label="Zobacz UkrytÄ… SelekcjÄ™" name="Show Hidden Selection"/>
+ <menu_item_check label="Pokaż Promień Emitera dla Selekcji" name="Show Light Radius for Selection"/>
+ <menu_item_check label="Pokaż Emiter Selekcji" name="Show Selection Beam"/>
+ <menu_item_check label="Uruchom SiatkÄ™" name="Snap to Grid"/>
+ <menu_item_call label="PrzeciÄ…gnij Obiekt do Siatki" name="Snap Object XY to Grid"/>
+ <menu_item_call label="Wybierz Zaznaczenie Siatki" name="Use Selection for Grid"/>
+ <menu_item_call label="Opcje Siatki" name="Grid Options"/>
</menu>
<menu label="Wybierz Zlinkowane Części" name="Select Linked Parts">
<menu_item_call label="Wybierz Następną Część" name="Select Next Part"/>
@@ -121,15 +117,15 @@
</menu>
<menu label="Pomoc" name="Help">
<menu_item_call label="[SECOND_LIFE] Portal Pomocy" name="Second Life Help"/>
- <menu_item_call label="Samouczek" name="Tutorial"/>
<menu_item_call label="Złóż Raport o Nadużyciu" name="Report Abuse"/>
<menu_item_call label="Zgłoś Błędy Klienta" name="Report Bug"/>
+ <menu_item_call label="O [APP_NAME]" name="About Second Life"/>
</menu>
<menu label="Zaawansowane" name="Advanced">
- <menu_item_check label="Uruchom Tryb Oddalenia po 30 Minutach" name="Go Away/AFK When Idle"/>
<menu_item_call label="Zatrzymaj Wszystkie Animacje" name="Stop Animating My Avatar"/>
<menu_item_call label="Odswież Wyświetlanie Tekstur" name="Rebake Texture"/>
<menu_item_call label="Domyślne Ustawienia Rozmiaru Interfejsu" name="Set UI Size to Default"/>
+ <menu_item_call label="Ustaw Rozmiar Interfejsu..." name="Set Window Size..."/>
<menu_item_check label="Ogranicz Dystans Selekcji" name="Limit Select Distance"/>
<menu_item_check label="Wyłącz Ograniczenia Zasięgu Kamery" name="Disable Camera Distance"/>
<menu_item_check label="Wysoka Rozdzielczość Zdjęć" name="HighResSnapshot"/>
@@ -176,8 +172,8 @@
<menu_item_check label="Uruchom Wiele Wątków" name="Run Multiple Threads"/>
<menu_item_call label="Wyczyść Bufor Danych Grupy" name="ClearGroupCache"/>
<menu_item_check label="Wygładzanie Ruchu Myszki" name="Mouse Smoothing"/>
- <menu_item_check label="Pokaż Wiadomości w Pobliżu" name="IMInChat"/>
<menu label="Skróty" name="Shortcuts">
+ <menu_item_call label="Obraz (L$[COST])..." name="Upload Image"/>
<menu_item_check label="Szukaj" name="Search"/>
<menu_item_call label="Zwolnij Klawisze" name="Release Keys"/>
<menu_item_call label="Domyślne Ustawienia Rozmiaru Interfejsu" name="Set UI Size to Default"/>
@@ -189,7 +185,7 @@
<menu_item_call label="Widok Panoramiczny" name="Mouselook"/>
<menu_item_check label="Wolna Kamera" name="Joystick Flycam"/>
<menu_item_call label="Reset Widoku" name="Reset View"/>
- <menu_item_call label="Zobacz Ostatniego Rozmówce" name="Look at Last Chatter"/>
+ <menu_item_call label="Zobacz Ostatniego Rozmówcę" name="Look at Last Chatter"/>
<menu label="Wybierz Narzędzie Budowania" name="Select Tool">
<menu_item_call label="Narzędzie Ogniskowej" name="Focus"/>
<menu_item_call label="Narzędzie Ruchu" name="Move"/>
@@ -205,7 +201,7 @@
<menu_item_call label="Pokaż Ustawienia Debugowania" name="Debug Settings"/>
<menu_item_check label="Pokaż Menu Progresu" name="Debug Mode"/>
</menu>
- <menu label="Postęp" name="Develop">
+ <menu label="Postęp..." name="Develop">
<menu label="Konsola" name="Consoles">
<menu_item_check label="Konsola Tekstur" name="Texture Console"/>
<menu_item_check label="Debugowanie Zdarzeń Konsoli" name="Debug Console"/>
@@ -217,6 +213,7 @@
<menu_item_call label="Info Regionu do Debugowania Konsoli" name="Region Info to Debug Console"/>
<menu_item_check label="Kamera" name="Camera"/>
<menu_item_check label="Wiatr" name="Wind"/>
+ <menu_item_check label="Znak" name="Badge"/>
</menu>
<menu label="Pokaż Informacje" name="Display Info">
<menu_item_check label="Pokaż Czas" name="Show Time"/>
diff --git a/indra/newview/skins/default/xui/pl/mime_types.xml b/indra/newview/skins/default/xui/pl/mime_types.xml
index c90d5761e6..cbf2afa91d 100755..100644
--- a/indra/newview/skins/default/xui/pl/mime_types.xml
+++ b/indra/newview/skins/default/xui/pl/mime_types.xml
@@ -2,13 +2,13 @@
<mimetypes name="default">
<widgetset name="web">
<label name="web_label">
- Zawartość Strony Internetowej
+ Zawartość przeglądarki internetowej
</label>
<tooltip name="web_tooltip">
- To miejsce posiada zawartość strony internetowej
+ To miejsce posiada zawartość przeglądarki internetowej
</tooltip>
<playtip name="web_playtip">
- Pokaż zawartość strony internetowej
+ Pokaż zawartość przeglądarki internetowej
</playtip>
</widgetset>
<widgetset name="movie">
diff --git a/indra/newview/skins/default/xui/pl/mime_types_linux.xml b/indra/newview/skins/default/xui/pl/mime_types_linux.xml
new file mode 100644
index 0000000000..a2b8168b51
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/mime_types_linux.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Zawartość przeglądarki internetowej
+ </label>
+ <tooltip name="web_tooltip">
+ W tym miejscu można zobaczyć zawartość przeglądarki internetowej
+ </tooltip>
+ <playtip name="web_playtip">
+ Pokaż zawartość przeglądarki internetowej
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Film
+ </label>
+ <tooltip name="movie_tooltip">
+ To miejsce wyświtela filmy
+ </tooltip>
+ <playtip name="movie_playtip">
+ Zacznij odtwarzanie filmu
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Obraz
+ </label>
+ <tooltip name="image_tooltip">
+ W tym miejscu można zobaczyć obrazy
+ </tooltip>
+ <playtip name="image_playtip">
+ Zobacz obrazy wyświetlane w tym miejscu
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Audio
+ </label>
+ <tooltip name="audio_tooltip">
+ W tym miejscu odtwarzane jest audio
+ </tooltip>
+ <playtip name="audio_playtip">
+ Zacznij odtwarzanie audio
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Strumieniowe w czasie rzeczywistym
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Żadne -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Żadne -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Audio
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Video
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Obraz
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Film (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Ogg Audio/Video
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ Dokument PDF
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Dokument Postscript
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Tekst (RTF)
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Synchronized Multimedia Integration Language (SMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Strona internetowa (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Audio (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Audio (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Audio (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Audio (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Obraz (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Obraz (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Obraz (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Obraz (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Obraz (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Obraz (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Strona internetowa
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ Tekst
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Film (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Film (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Film (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Film (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Film (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Film (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/pl/mime_types_mac.xml b/indra/newview/skins/default/xui/pl/mime_types_mac.xml
new file mode 100644
index 0000000000..ae860249bb
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/mime_types_mac.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Zawartość przeglądarki internetowej
+ </label>
+ <tooltip name="web_tooltip">
+ W tym miejscu można zobaczyć zawartość przeglądarki internetowej
+ </tooltip>
+ <playtip name="web_playtip">
+ Pokaż zawartość przeglądarki internetowej
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Film
+ </label>
+ <tooltip name="movie_tooltip">
+ To miejsce posiada zawartość filmową
+ </tooltip>
+ <playtip name="movie_playtip">
+ OglÄ…daj Film
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Obraz
+ </label>
+ <tooltip name="image_tooltip">
+ To miejsce posiada zwartość graficzną
+ </tooltip>
+ <playtip name="image_playtip">
+ Zobacz zdjęcie miejsca
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Audio
+ </label>
+ <tooltip name="audio_tooltip">
+ To miejsce posiada zwartość audio
+ </tooltip>
+ <playtip name="audio_playtip">
+ Rozpocznij odtwarzanie audio
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Synchroniczne Strumienie Medialne
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Żadne -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Żadne -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Audio
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Video
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Obraz
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Film (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Skrypt Java
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Ogg Audio/Video
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ Dokument PDF
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Dokument Postscript
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Dokument RTF
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Język Integracyjnej Synchronizacji Multimedialnej (SMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Strona Internetowa (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Audio (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Audio (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Audio (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Audio (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Obraz (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Obraz (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Obraz (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Obraz (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Obraz (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Obraz (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Strona Internetowa
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ Tekst
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Film (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Film (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Film (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Film (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Film (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Film (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/pl/notifications.xml b/indra/newview/skins/default/xui/pl/notifications.xml
index 3cf9be507d..12d68ed30e 100644
--- a/indra/newview/skins/default/xui/pl/notifications.xml
+++ b/indra/newview/skins/default/xui/pl/notifications.xml
@@ -9,72 +9,43 @@
<global name="implicitclosebutton">
Zamknij
</global>
- <template name="okbutton">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- </form>
- </template>
-
- <template name="okignore">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <ignore text="$ignoretext"/>
- </form>
- </template>
-
- <template name="okcancelbuttons">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Cancel"
- text="$notext"/>
- </form>
- </template>
-
- <template name="okcancelignore">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Cancel"
- text="$notext"/>
- <ignore text="$ignoretext"/>
- </form>
- </template>
-
- <template name="okhelpbuttons">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Help"
- text="$helptext"/>
- </form>
- </template>
-
- <template name="yesnocancelbuttons">
- <form>
- <button
- name="Yes"
- text="$yestext"/>
- <button
- name="No"
- text="$notext"/>
- <button
- name="Cancel"
- text="$canceltext"/>
- </form>
- </template>
+ <template name="okbutton">
+ <form>
+ <button name="OK_okbutton" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okignore">
+ <form>
+ <button name="OK_okignore" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okcancelbuttons">
+ <form>
+ <button name="OK_okcancelbuttons" text="$yestext"/>
+ <button name="Cancel_okcancelbuttons" text="$notext"/>
+ </form>
+ </template>
+ <template name="okcancelignore">
+ <form>
+ <button name="OK_okcancelignore" text="$yestext"/>
+ <button name="Cancel_okcancelignore" text="$canceltext"/>
+ </form>
+ </template>
+ <template name="okhelpbuttons">
+ <form>
+ <button name="OK_okhelpbuttons" text="$yestext"/>
+ <button name="Help" text="$helptext"/>
+ </form>
+ </template>
+ <template name="yesnocancelbuttons">
+ <form>
+ <button name="Yes" text="$yestext"/>
+ <button name="No" text="$notext"/>
+ <button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
+ </form>
+ </template>
<notification functor="GenericAcknowledge" label="Nieznany rodzaj komunikatu" name="MissingAlert">
- Twoja wersja klienta [APP_NAME] nie może wyświetlić odebranej wiadomości.
+ Twoja wersja klienta [APP_NAME] nie może wyświetlić odebranej wiadomości. Upewnij się, że posiadasz najnowszą wersję klienta.
Szczegóły błędu: Błąd o nazwie &apos;[_NAME]&apos; nie został odnaleziony w pliku notifications.xml.
<usetemplate name="okbutton" yestext="OK"/>
@@ -97,24 +68,18 @@ Szczegóły błędu: Błąd o nazwie &apos;[_NAME]&apos; nie został odnaleziony
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Tak"/>
</notification>
<notification name="BadInstallation">
- Podczas aktualizacji klienta [APP_NAME] wystąpił błąd. Proszę odwiedzić stronę secondlife.com by ściągnąć najnowszą wersje klienta.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ Podczas aktualizacji [APP_NAME] wystąpił błąd. Proszę odwiedzić stronę [http://get.secondlife.com download the latest version] by ściągnąć najnowszą wersje klienta.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LoginFailedNoNetwork">
- Błąd sieci: Brak połączenia.
+ Brak połączenia z [SECOND_LIFE_GRID].
&apos;[DIAGNOSTIC]&apos;
Sprawdź stan swojego połączenia sieciowego.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="MessageTemplateNotFound">
Wzór komunikatu dla [PATH] nie odnaleziony.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="WearableSave">
Zapisać zmiany dotyczące ubrania/części ciała?
@@ -124,7 +89,7 @@ Sprawdź stan swojego połączenia sieciowego.
W trakcie ładwania tekstu dla skryptu pojawił się problem z następującego powodu: [REASON]. Spróbuj ponownie za kilka minut.
</notification>
<notification name="CompileQueueSaveBytecode">
- W trakcie ładwania skompilowanego skryptu pojawił się problem z następującego powodu: [REASON]. Spróbuj ponownie za kilka minut.
+ W trakcie ładowania skompilowanego skryptu pojawił się problem z następującego powodu: [REASON]. Spróbuj ponownie za kilka minut.
</notification>
<notification name="WriteAnimationFail">
Problem w zapisywaniu danych animacji. Spróbuj ponownie za kilka minut.
@@ -140,15 +105,17 @@ Wybierz pojedynczy obiekt i spróbuj jeszcze raz.
Zapisać wszystkie zmiany dotyczące ubrania/cześci ciała?
<usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie Zapisuj" yestext="Zapisz"/>
</notification>
+ <notification name="FriendsAndGroupsOnly">
+ Osoby spoza listy znajomych, których rozmowy głosowe i IM są ignorowane, nie wiedzą o tym.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="GrantModifyRights">
- Udzielenie praw modyfikacji innemu Rezydentowi umożliwia modyfikację, usuwanie lub wzięcie JAKIEGOKOLWIEK z Twoich obiektów.
-Używaj tej opcji z rozwagą!
+ Udzielenie praw modyfikacji innemu Rezydentowi umożliwia modyfikację, usuwanie lub wzięcie JAKIEGOKOLWIEK z Twoich obiektów. Używaj tej opcji z rozwagą!
Czy chcesz dać prawa modyfikacji osobie [FIRST_NAME] [LAST_NAME]?
<usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/>
</notification>
<notification name="GrantModifyRightsMultiple">
- Udzielenie praw modyfikacji innym Rezydentom umożliwia im modyfikację, usuwanie lub wzięcie JAKIEGOKOLWIEK z Twoich obiektów.
-Używaj tej opcji z rozwagą!
+ Udzielenie praw modyfikacji innym Rezydentom umożliwia im modyfikację, usuwanie lub wzięcie JAKIEGOKOLWIEK z Twoich obiektów. Używaj tej opcji z rozwagą!
Czy chcesz dać prawa modyfikacji wybranym osobom?
<usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/>
</notification>
@@ -179,7 +146,7 @@ Czy chcesz dać prawa modyfikacji wybranym osobom?
Ta funkcja nie może być odebrana.
Członkowie muszą sami zrezygnować z pełnienia tej funkcji.
Chcesz kontynuować?
- <usetemplate ignoretext="Podczas dodawania członków grupy do funkcji właściciela" name="okcancelignore" notext="Nie" yestext="Tak"/>
+ <usetemplate ignoretext="Przed dodaniem nowego właściciela do grupy, proszę potwierdzić swoją decyzję." name="okcancelignore" notext="Nie" yestext="Tak"/>
</notification>
<notification name="AssignDangerousActionWarning">
Dodajesz przywilej [ACTION_NAME] do fukcji [ROLE_NAME].
@@ -201,67 +168,31 @@ Udzielaj tego przywileju z rozwagÄ….
Dodać ten przywilej do funkcji [ROLE_NAME]?
<usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/>
</notification>
- <notification name="ClickPublishHelpLand">
- Wybranie opcji Publikuj w Wyszukiwarce Wybranie tej opcji umożliwi pokazywanie:
-- tej posiadłości w wynikach wyszukiwarki
-- publicznych obiektów na tej posiadłości
-- tej posiadłości w przeglądarce internetowej
- </notification>
- <notification name="ClickSoundHelpLand">
- Media oraz muzyka są aktywne według ustawień posiadłości dla mediów. Dźwięk oraz komunikacja głosowa mogą być ograniczone w danej posiadłości, w zależności od ustawień rodzaju treści jaką zawiera. Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera.
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=5046
- </url>
- <usetemplate
- name="okcancelbuttons"
- yestext="[SECOND_LIFE]:Pomoc"
- notext="Zamknij" />
- </notification>
- <notification name="ClickSearchHelpAll">
- Wyniki wyszukiwania wyświetlają się na podstawie rodzaju zakładki wyszukiwarki, z której korzystasz, rodzaju statusu Twojego wieku, wybranej kategorii, oraz innych czynników. By uzyskać wiecej szczegółów skorzystaj z [SECOND_LIFE]:Pomoc.
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=4722
- </url>
- <usetemplate
- name="okcancelbuttons"
- yestext="[SECOND_LIFE]:Pomoc"
- notext="Zamknij" />
- </notification>
- <notification name="ClickPublishHelpLandDisabled">
- Ta posiadłość nie może być pokazywana w wynikach wyszukiwania ponieważ region w którym się znajduje zabrania tego.
- </notification>
- <notification name="ClickPublishHelpAvatar">
- Wybranie opcji Publikuj w Wyszukiwarce umożliwi pokazywanie:
-- Twojego profilu w wynikach wyszukiwarki
-- linku do Twojego profilu na publicznych stronach
- </notification>
- <notification name="ClickPartnerHelpAvatar">
- Możesz zaproponować związek innemu Rezydentowi lub rozwiązać istniejący związek na stronie internetowej [SECOND_LIFE].
-
-Chcesz dowiedzieć się więcej na temat związków w [SECOND_LIFE]?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Idź na stronę"/>
- </notification>
- <notification name="ClickUploadHelpPermissions">
- Twoje domyślne ustawienia praw dla Twoich obiektów mogą nie działać poprawnie w starszych regionach.
- </notification>
- <notification name="ClickWebProfileHelpAvatar">
- Jeżeli ten Rezydent posiada link URL w profilu możesz:
- * Kliknąć &apos;Załaduj&apos; żeby zobaczyć stronę w tej zakładce WWW.
- * Kliknąć &apos;Załaduj&apos; &gt; &apos;Użyj zewnętrznej przeglądarki&apos; żeby zobaczyć stronę używając domyślnej zewnętrznej przeglądarki.
- * Kliknąć &apos;Załaduj&apos; &gt; &apos;Otwórz URL strony profilu&apos; żeby wrócić do strony tego Rezydenta po jej opuszczeniu.
-
-Oglądając swój profil możesz wpisać dowolny link URL i kliknąć OK żeby go zapisać.
-Rezydenci mogą odwiedzać podany adres, kiedy przeglądają Twój profil.
+ <notification name="AttachmentDrop">
+ Wybrałeś opcję opuszczenia swojego załącznika.
+ Czy chcesz kontynuować?
+ <usetemplate ignoretext="Potwierdź przed zdjęciem załącznika." name="okcancelignore" notext="Nie" yestext="Tak"/>
</notification>
<notification name="JoinGroupCanAfford">
Dołączenie do tej grupy kosztuje [COST]L$.
Chcesz kontynuować?
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Dołącz"/>
</notification>
+ <notification name="JoinGroupNoCost">
+ Dołączasz do grupy [NAME].
+Czy chcesz kontynuować?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Zaakceptuj"/>
+ </notification>
<notification name="JoinGroupCannotAfford">
Członkostwo w tej grupie kosztuje [COST]L$
Masz za mało L$ żeby zostać członkiem.
</notification>
+ <notification name="CreateGroupCost">
+ Stworzenie tej grupy kosztuje 100L$.
+W grupie powinien być więcej niż jeden członek, albo zostanie na zawsze skasowana.
+Zaproś proszę członków w ciągu 48 godzin.
+ <usetemplate canceltext="Anuluj" name="okcancelbuttons" notext="Anuluj" yestext="Stwórz grupę za 100L$"/>
+ </notification>
<notification name="LandBuyPass">
Za [COST]L$ możesz odwiedzić tą posiadłość (&apos;[PARCEL_NAME]&apos;) na [TIME] godzin. Chcesz kupić przepustkę?
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
@@ -276,9 +207,9 @@ Cena wynosi [SALE_PRICE]L$ i sprzedaż będzie autoryzowana dla [NAME].
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="ConfirmLandSaleToAnyoneChange">
- UWAGA: Wybierając Sprzedaż dla Kogokolwiek umożliwiasz zakup posiadłości wszystkim Rezydentom [SECOND_LIFE].
+ UWAGA: Wybierając opcję &quot;Sprzedaj Każdemu&quot; udostępniasz swoją posiadłość do sprzedaży dla jakiegokolwiek Rezydenta [SECOND_LIFE] , nawet osób nieobecnych w tym regionie.
-Posiadłość o powierzchni [LAND_SIZE] m zostaje wystawiona na sprzedaż.
+Posiadłość o powierzchni [LAND_SIZE] m² zostaje wystawiona na sprzedaż.
Cena wynosi [SALE_PRICE]L$ i sprzedaż będzie autoryzowana dla [NAME].
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
</notification>
@@ -324,7 +255,7 @@ Obiekty: [N]
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="DisableAllTopObjects">
- Czy na pewno chcesz deaktywować wszystkie obiekty w tym regionie?
+ Czy na pewno chcesz deaktywować wszystkie obiekty w tym Regionie?
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="ReturnObjectsNotOwnedByGroup">
@@ -338,6 +269,12 @@ Obiekty: [N]
Ten region pozwala na uszkodzenia.
Skrypty muszą pozostać aktywne dla prawidłowego działania broni.
</notification>
+ <notification name="MultipleFacesSelected">
+ Obecnie zaznaczono wiele powierzchni.
+Jeśli działanie będzie kontynuowane, oddzielne media będą ustawione na wielu powierzchniach obiektu.
+W celu umieszczenia mediów tylko na jednej powierzchni skorzystaj z Wybierz Powierzchnię i kliknij na wybranej powierzchni obiektu oraz kliknij Dodaj.
+ <usetemplate ignoretext="Media zostanÄ… ustawione na wielu zaznaczonych powierzchniach" name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ </notification>
<notification name="MustBeInParcel">
Musisz znajdować się wewnątrz posiadłości żeby wybrać punkt lądowania.
</notification>
@@ -373,6 +310,10 @@ Folder stroju nie zawiera żadnego ubrania, części ciała ani załączników.
<notification name="CannotWearTrash">
Nie możesz założyć ubrania, które znajduje się w koszu.
</notification>
+ <notification name="MaxAttachmentsOnOutfit">
+ Nie można dołączyć obiektu.
+Limit [MAX_ATTACHMENTS] załączników został przekroczony. Proszę najpierw odłączyć inny obiekt.
+ </notification>
<notification name="CannotWearInfoNotComplete">
Nie możesz założyć tego artkułu ponieważ nie załadował się poprawnie. Spróbuj ponownie za kilka minut.
</notification>
@@ -382,27 +323,36 @@ Czy chcesz przejść na stronę www.secondlife.com by założyć konto?
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="AddClassified">
- Ogłoszenia reklamowe ukazują się w zakładce Reklama w wyszukiwarce (Szukaj) oraz na stronie internetowej www.secondlife.com przez tydzień.
+ Ogłoszenia reklamowe ukazują się w zakładce Reklama w wyszukiwarce (Szukaj) oraz na [http://secondlife.com/community/classifieds secondlife.com] przez tydzień.
Napisz treść swojej reklamy, kliknij Zamieść by dodać katalogu ogłoszeń.
-Po zamieszczeniu reklamy zostaniesz poproszony o sprecyzowanie opłaty za reklamę.
+Po zamieszczeniu reklamy zostaniesz poproszony o sprecyzowanie opłaty za Reklamę.
Im wyższa opłata tym wyżej Twoja reklama wyświetla się w katalogu i wyszukiwarce po wpisaniu słów kluczowych.
- <usetemplate ignoretext="W momencie dodawania nowej reklamy" name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ <usetemplate ignoretext="Jak stworzyć nową reklamę?" name="okcancelignore" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="DeleteClassified">
Usunąć reklamę &apos;[NAME]&apos;?
Pamiętaj! Nie ma rekompensaty za poniesione koszta.
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
</notification>
+ <notification name="DeleteMedia">
+ Wybrano usunięcie mediów związanych z tą powierzchnią.
+Czy na pewno chcesz kontynuować?
+ <usetemplate ignoretext="Potwierdź przed usunięciem mediów z obiektu" name="okcancelignore" notext="Nie" yestext="Tak"/>
+ </notification>
<notification name="ClassifiedSave">
- Zapisać zmiany w reklamie [NAME]?
+ Zapisać zmiany w Reklamie [NAME]?
<usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie Zapisuj" yestext="Zapisz"/>
</notification>
+ <notification name="ClassifiedInsufficientFunds">
+ Nie posiadasz wystarczających środków aby dodać Reklamę.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="DeleteAvatarPick">
Usunąć wybór [PICK] z kategorii Lubię?
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="PromptGoToEventsPage">
- Odwiedzić internetową stronę imprez [SECOND_LIFE]?
+ Odwiedzić internetową stronę Imprez [SECOND_LIFE]?
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="SelectProposalToView">
@@ -411,26 +361,18 @@ Pamiętaj! Nie ma rekompensaty za poniesione koszta.
<notification name="SelectHistoryItemToView">
Wybierz obiekt z historii, który chcesz zobaczyć.
</notification>
- <notification name="ResetShowNextTimeDialogs">
- Zresetować &apos;Pokaż następnym razem&apos; opcję we wszystkich dialogach?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="SkipShowNextTimeDialogs">
- Wyłączyć &apos;Pokaż następnym razem&apos; opcję we wszystkich dialogach?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
- </notification>
<notification name="CacheWillClear">
- Bufor danych na dysku zostanie zresetowany po relogu do [APP_NAME].
+ Bufor danych zostanie wyczyszczony po restarcie aplikacji [APP_NAME].
</notification>
<notification name="CacheWillBeMoved">
- Bufor danych na dysku zostanie przemieszczony po relogu do [APP_NAME].
-Bufor będzie również wyczyszczony.
+ Bufor danych zostanie przeniesiony po restarcie aplikacji [APP_NAME].
+Pamiętaj: Opcja ta wyczyszcza bufor danych.
</notification>
<notification name="ChangeConnectionPort">
- Ustawienia portu zostanÄ… wprowadzone po relogu do [APP_NAME].
+ Ustawienia portu zostajÄ… zaktualizowane po restarcie aplikacji [APP_NAME].
</notification>
<notification name="ChangeSkin">
- Nowa skórka zostanie wprowadzona po relogu do [APP_NAME].
+ Nowa skórka zostanie wczytana po restarcie aplikacji [APP_NAME].
</notification>
<notification name="GoToAuctionPage">
Odwiedzić stronę internetową [SECOND_LIFE] żeby zobaczyć szczgóły aukcji lub zrobić ofertę?
@@ -450,17 +392,17 @@ Usuń kilka etapów i zapisz jeszcze raz.
</notification>
<notification name="GestureSaveFailedObjectNotFound">
Nie można zapisać gestu ponieważ obiekt lub szafa powiązanego obiektu nie został znaleziony.
-Obiekt może znajdować się zbyt daleko albo został usuniety.
+Obiekt może znajdować się zbyt daleko albo został usunięty.
</notification>
<notification name="GestureSaveFailedReason">
- Nie można zapisać gestu z następującego powodu: [REASON]. Spróbuj zapisać jeszcze raz póżniej.
+ Nie można zapisać gestu z następującego powodu: [REASON]. Spróbuj zapisać jeszcze raz później.
</notification>
<notification name="SaveNotecardFailObjectNotFound">
Nie można zapisać notki ponieważ obiekt lub szafa powiązanego obiektu nie został znaleziony.
Obiekt może znajdować się zbyt daleko albo został usuniety.
</notification>
<notification name="SaveNotecardFailReason">
- Nie można zapisać notki z następującego powodu: [REASON]. Spróbuj zapisać jeszcze raz póżniej.
+ Nie można zapisać notki z następującego powodu: [REASON]. Spróbuj zapisać jeszcze raz później.
</notification>
<notification name="ScriptCannotUndo">
Nie można cofnąć wszystkich zmian w Twojej wersji skryptu.
@@ -469,7 +411,7 @@ Czy chcesz załadować ostatnią wersję zapisaną na serwerze?
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="SaveScriptFailReason">
- Nie można zapisać skryptu z następującego powodu: [REASON]. Spróbuj zapisać jeszcze raz póżniej.
+ Nie można zapisać skryptu z następującego powodu: [REASON]. Spróbuj zapisać jeszcze raz później.
</notification>
<notification name="SaveScriptFailObjectNotFound">
Nie można zapisać skryptu ponieważ obiekt w którym się zawiera nie został znaleziony.
@@ -478,6 +420,11 @@ Obiekt może znajdować się zbyt daleko albo został usuniety.
<notification name="SaveBytecodeFailReason">
Nie można zapisać skompilowanego skryptu z następującego powodu: [REASON]. Spróbuj zapisać jeszcze raz póżniej.
</notification>
+ <notification name="StartRegionEmpty">
+ Oops, Twoje miejsce startu nie zostało określone.
+Wpisz proszÄ™ nazwÄ™ regionu w lokalizacjÄ™ startu w polu Lokalizacja Startu lub wybierz Moja Ostatnia Lokalizacja albo Miejsce Startu.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CouldNotStartStopScript">
Nie można uruchomić lub zatrzymać skryptu ponieważ obiekt w którym się zawiera nie został znaleziony.
Obiekt może znajdować się zbyt daleko albo został usuniety.
@@ -489,26 +436,26 @@ Obiekt może znajdować się zbyt daleko albo został usuniety.
Nie można zapisać pliku [[FILE]]
</notification>
<notification name="UnsupportedHardware">
- Uwaga: Twój system nie spełnia minimalnych wymagań sprzętowych [APP_NAME]. Jakość i prędkość [APP_NAME] mogą być pogorszone. Niestety, nie będziemy w stanie udzielić Ci technicznej pomocy, ponieważ konfiguracja Twojego systemu nie spełnia wymagań sprzętowych.
+ Niestety Twój komputer nie spełnia minimalnych wymogów sprzętowych dla poprawnego działania [APP_NAME]. Możesz odczuwać bardzo niską wydajność operacyjną. Niestety portal pomocy, [SUPPORT_SITE] nie posiada informacji na temat poprawnej konfiguracji technicznej Twojego systemu.
-MINSPECS
-Czy chcesz odwiedzić stronę [_URL] po dodatkowe informacje?
+Po więcej info, odwiedź stronę [_URL] .
<url name="url" option="0">
http://www.secondlife.com/corporate/sysreqs.php
</url>
- <usetemplate ignoretext="Zignoruj ostrzeżenie" name="okcancelignore" notext="Nie" yestext="Tak"/>
+ <usetemplate ignoretext="Dysk twardy mojego komputera nie jest wspomagany" name="okcancelignore" notext="Nie" yestext="Tak"/>
</notification>
<notification name="UnknownGPU">
- Twój system jest wyposażony w kartę graficzną której jeszcze nie znamy.
-To się często zdarza z nowym sprzętem, którego jeszcze nie testowaliśmy.
-[APP_NAME] najprawdopodobniej będzie działało poprawnie. Możliwe, że będziesz musiał wyregulować ustawienia grafiki.
-(Edycja &gt; Ustawienia &gt; Grafika).
+ Twój system jest wyposażony w kartę graficzną, która nie jest rozpoznana przez [APP_NAME].
+Zdarza się to częstow w przypadku nowego sprzętu, który nie był testowany z [APP_NAME]. Prawdopodobnie wystarczy dostosowanie ustawień grafiki aby działanie było poprawne.
+(Ja &gt; Właściwości &gt; Grafika).
<form name="form">
- <ignore name="ignore" text="Zignoruj ostrzeżenie"/>
+ <ignore name="ignore" text="Karta graficzna nie została zidentyfikowana."/>
</form>
</notification>
<notification name="DisplaySettingsNoShaders">
- [APP_NAME] zawiesił się podczas inicjalizacji sterowników graficznych. Jakość grafiki została zmniejszona - może pomoże. Pewne funkcje graficzne zostały wyłączone. Zalecamy aktualizcje strerowników grapicznych.
+ [APP_NAME] zawiesił się podczas inicjalizacji sterowników graficznych.
+Jakość grafiki została zmniejszona - może pomoże.
+Pewne funkcje graficzne zostały wyłączone. Zalecamy aktualizcje sterowników graficznych.
Możesz podnieść jakość grafiki pod Ustawienia &gt; Grafika.
</notification>
<notification name="RegionNoTerraforming">
@@ -553,6 +500,9 @@ Ta osoba tymczasowo nie będzie mógła się poruszać, nie będzie mógł używ
Wyrzucić [AVATAR_NAME] z Twojej posiadłości?
<usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Wyrzuć i zabroń wstępu (ban)" yestext="Wyrzuć"/>
</notification>
+ <notification name="EjectAvatarFromGroup">
+ Wyrzuć [AVATAR_NAME] z grupy [GROUP_NAME]
+ </notification>
<notification name="AcquireErrorTooManyObjects">
BÅÄ„D OTRZYMYWANIA: Zbyt wiele wybranych obiektów.
</notification>
@@ -562,12 +512,12 @@ Ta osoba tymczasowo nie będzie mógła się poruszać, nie będzie mógł używ
<notification name="PromptGoToCurrencyPage">
[EXTRA]
-Iść na stronę [_URL] po informacje dotyczące zakupu L$?
+Odwiedź stronę [_URL] po więcej informacji na temat zakupu L$?
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="UnableToLinkObjects">
Nie można połączyć [COUNT] obiektów.
-Maksimalnie można połączyć [MAX] obiektów.
+Maksymalnie można połączyć [MAX] obiektów.
</notification>
<notification name="CannotLinkIncompleteSet">
Możesz łączyć tylko kompletne zbiory obiektów i musisz wybrać więcej niż jeden obiekt.
@@ -643,12 +593,19 @@ Oczekiwana - [VALIDS]
Nie można utworzyć pliku wyjściowego: [FILE]
</notification>
<notification name="DoNotSupportBulkAnimationUpload">
- Åadowanie zbiorów plików animacji nie jest jeszcze dostÄ™pne.
+ [APP_NAME] obecnie nie wspomaga ładowania grupowego plików animacji.
</notification>
<notification name="CannotUploadReason">
Åadowanie pliku [FILE] nie powiodÅ‚o siÄ™ z powodu: [REASON]
Spróbuj jeszcze raz póżniej.
</notification>
+ <notification name="LandmarkCreated">
+ Dodano &quot;[LANDMARK_NAME]&quot; do folderu [FOLDER_NAME].
+ </notification>
+ <notification name="LandmarkAlreadyExists">
+ Posiadasz już landmark dla tej lokalizacji.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CannotCreateLandmarkNotOwner">
Nie możesz zapamiętać tego miejsca (LM) ponieważ właściciel posiadłości nie pozwala na to.
</notification>
@@ -672,6 +629,9 @@ Wybierz obiekty zawierajÄ…ce skrypty.
Wybierz skryptowane obiekty do których masz prawa modyfikacji.
</notification>
+ <notification name="CannotOpenScriptObjectNoMod">
+ Nie można otworzyć skryptu bez prawa do modyfikacji obiektu.
+ </notification>
<notification name="CannotSetRunningSelectObjectsNoScripts">
&apos;Uruchomienie&apos; skryptów nie powiodło się.
@@ -697,52 +657,47 @@ Nowe zapytanie: [FINALQUERY]
Teleportacja nie powiodła się.
[REASON]
</notification>
-
- <notification name="invalid_tport">
-Wystąpił problem z teleportacją. Wyloguj się i zaloguj ponownie.
-Jeśli nadal otrzymujesz ten komunikat sprawdź Pomoc Techniczną na stronie:
-www.secondlife.com/support.
- </notification>
- <notification name="invalid_region_handoff">
-Wystąpił problem ze zmianą regionu. Wyloguj się i zaloguj ponownie.
-Jeśli nadal otrzymujesz ten komunikat sprawdź Pomoc Techniczną na stronie:
-www.secondlife.com/support.
- </notification>
- <notification name="blocked_tport">
-Przepraszamy, teleportacja jest chwilowo niedostępna. Spróbuj jeszcze raz.
+ <notification name="invalid_tport">
+ Niestety, pojawił się błąd podczas próby teleportacji. Proponujemy wylogowanie się i spróbowanie teleportacji ponownie.
+Jeżeli nadal otrzymujesz tę wiadomość proponujemy odwiedzić stronę [SUPPORT_SITE].
+ </notification>
+ <notification name="invalid_region_handoff">
+ Niestety, pojawił się błąd podczas próby przedostania się na drugi region. Proponujemy wylogowanie się i spróbowanie przedostania się na drugi region ponownie.
+Jeżeli nadal otrzymujesz tę wiadomość proponujemy odwiedzić stronę [SUPPORT_SITE].
+ </notification>
+ <notification name="blocked_tport">
+ Przepraszamy, teleportacja jest chwilowo niedostępna. Spróbuj jeszcze raz.
Jeśli nadal nie możesz się teleportować wyloguj się i ponownie zaloguj.
- </notification>
- <notification name="nolandmark_tport">
-Przepraszamy, ale nie możemy znaleźć miejsca docelowego.
- </notification>
- <notification name="timeout_tport">
-Przepraszamy, ale nie udało się przeprowadzić teleportacji. Spróbuj jeszcze raz.
- </notification>
- <notification name="noaccess_tport">
-Przepraszamy, ale nie masz dostępu do miejsca docelowego.
- </notification>
- <notification name="missing_attach_tport">
-Czekamy na Twoje akcesoria. Możesz poczekać kilka minut lub zrobić relog przed następną próbą teleportacji.
- </notification>
- <notification name="too_many_uploads_tport">
-Obecnie ten region ma problemy z ładowaniem obiektów w związku z czym teleportacja bardzo sie opóznia.
+ </notification>
+ <notification name="nolandmark_tport">
+ Przepraszamy, ale nie możemy znaleźć miejsca docelowego.
+ </notification>
+ <notification name="timeout_tport">
+ Przepraszamy, ale nie udało się przeprowadzić teleportacji. Spróbuj jeszcze raz.
+ </notification>
+ <notification name="noaccess_tport">
+ Przepraszamy, ale nie masz dostępu do miejsca docelowego.
+ </notification>
+ <notification name="missing_attach_tport">
+ Czekamy na Twoje akcesoria. Możesz poczekać kilka minut lub zrobić relog przed następną próbą teleportacji.
+ </notification>
+ <notification name="too_many_uploads_tport">
+ Obecnie ten region ma problemy z ładowaniem obiektów w związku z czym teleportacja bardzo sie opóźnia.
Spróbuj jeszcze raz za kilka minut albo teleportuj się do mniej zatłoczonego miejsca.
- </notification>
- <notification name="expired_tport">
-Przepraszamy, ale nie udało się przeprowadzić teleportacji wystarczająco szybko. Spróbuj jeszcze raz za kilka minut.
- </notification>
- <notification name="expired_region_handoff">
-Przepraszamy, ale nie udało się przeprowadzić zmiany regionu wystarczająco szybko. Spróbuj jeszcze raz za kilka minut.
- </notification>
- <notification name="no_host">
-Nie możemy znaleść miejsca docelowego. To miejsce może być chwilowo nieosiągalne albo przestało istnieć.
+ </notification>
+ <notification name="expired_tport">
+ Przepraszamy, ale nie udało się przeprowadzić teleportacji wystarczająco szybko. Spróbuj jeszcze raz za kilka minut.
+ </notification>
+ <notification name="expired_region_handoff">
+ Przepraszamy, ale nie udało się przeprowadzić zmiany regionu wystarczająco szybko. Spróbuj jeszcze raz za kilka minut.
+ </notification>
+ <notification name="no_host">
+ Nie możemy znaleść miejsca docelowego. To miejsce może być chwilowo nieosiągalne albo przestało istnieć.
Spróbuj jeszcze raz za kilka minut.
- </notification>
- <notification name="no_inventory_host">
-Szafa chwilowo nie działa.
- </notification>
-
-
+ </notification>
+ <notification name="no_inventory_host">
+ Szafa chwilowo nie działa.
+ </notification>
<notification name="CannotSetLandOwnerNothingSelected">
Nie można wybrać właściciela posiadłości.
Posiadłość nie została wybrana.
@@ -751,7 +706,8 @@ Posiadłość nie została wybrana.
Nie można wybrać właściciela posiadłości ponieważ wybrany obszar przekracza granicę regionów. Wybierz mniejszy obszar i spróbuj jeszcze raz.
</notification>
<notification name="ForceOwnerAuctionWarning">
- Ta posiadłość jest wystawiona na aukcję. Wymuszenie własności anulue aukcję i potencjalnie może zdenerwować zainteresowanych Rezydentów, jeżeli licytacja już się rozpoczęła. Wymusić własność?
+ Ta posiadłość jest wystawiona na aukcję. Wymuszenie własności anuluje aukcję i potencjalnie może zdenerwować zainteresowanych Rezydentów, jeżeli licytacja już się rozpoczęła.
+Wymusić własność?
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="CannotContentifyNothingSelected">
@@ -779,7 +735,7 @@ Posiadłość nie została wybrana.
Region nie znaleziony.
</notification>
<notification name="CannotCloseFloaterBuyLand">
- Dialog Kup Posiadłość nie może zostać zamknięty dopóki [APP_NAME] nie oszacuje ceny tej tranzakcji.
+ Okno zakupu landu nie może zostać zamknięte dopóki aplikacja [APP_NAME] nie określi ceny dla tej transkacji.
</notification>
<notification name="CannotDeedLandNothingSelected">
Nie można przekazać posiadłości:
@@ -790,8 +746,8 @@ Posiadłość nie została wybrana.
Grupa nie została wybrana.
</notification>
<notification name="CannotDeedLandNoRegion">
- Nie można przekazać posiadłości:
-Region nie znaleziony.
+ Brak możliwości przepisania posiadłości grupie:
+Region, gdzie posiadłość się znajduje nie został odnaleziony.
</notification>
<notification name="CannotDeedLandMultipleSelected">
Nie można przekazać posiadłości:
@@ -799,14 +755,6 @@ Wiele posiadłości jest wybranych.
Spróbuj wybrać pojedynczą posiadłość.
</notification>
- <notification name="ParcelCanPlayMedia">
- To miejsce może odtwarzać strumienie mediów.
-Odtwarzanie strumieni wymaga szybkiego połączenia do Internetu.
-
-Odtwarzać dostępne strumienie mediów?
-(Selekcja może zostać zmieniona póżniej pod Ustawienia &gt; Audio i Video.)
- <usetemplate name="okcancelbuttons" notext="Wyłącz" yestext="Odtwarzaj"/>
- </notification>
<notification name="CannotDeedLandWaitingForServer">
Nie można przekazać posiadłości:
Serwer aktualizuje dane własności.
@@ -836,8 +784,8 @@ Nie masz praw do porzucenia tej posiadłości.
Twoje posiadłości są podkreślone na zielono.
</notification>
<notification name="CannotReleaseLandRegionNotFound">
- Nie można porzucić posiadłości:
-Region nie znaleziony.
+ Brak możliwości porzucenia posiadłości:
+Region, gdzie posiadłość się znajduje nie został odnaleziony.
</notification>
<notification name="CannotReleaseLandNoTransfer">
Nie możesz porzucić posiadłości:
@@ -875,12 +823,12 @@ Podzielić posiadłość?
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="CannotDivideLandNoRegion">
- Nie można podzielić posiadłości:
-Region nie znaleziony.
+ Brak możliwości podziału posiadłości:
+Region, gdzie posiadłość się znajduje nie został odnaleziony.
</notification>
<notification name="CannotJoinLandNoRegion">
- Nie można połączyć posiadłości:
-Region nie znaleziony.
+ Brak możliwości złączenia posiadłości:
+Region, gdzie posiadłość się znajduje nie został odnaleziony.
</notification>
<notification name="CannotJoinLandNothingSelected">
Nie można połączyć posiadłości:
@@ -904,17 +852,6 @@ Wybierz obaszar usytuowany na obu posiadłościach.
Połączyć posiadłości?
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
</notification>
- <notification name="ShowOwnersHelp">
- Pokaż właścicieli:
-Pokoloruj posiadłości zgodnie z przynależnością do właściciela
-
-Zielony = Twoja Posiadłość
-Morski = Posiadłość Twojej Grupy
-Czerwony = Posiadłości Innych
-Żółty = Na Sprzedaż
-Fioletowy = Na AukcjÄ™
-Szary = Publiczna
- </notification>
<notification name="ConfirmNotecardSave">
Ta notka musi być zapisana żeby mogła być skopiowana lub zobaczona. Zapisać notkę?
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
@@ -927,10 +864,10 @@ Szary = Publiczna
Zmiana rozdzielczości do [RESX] x [RESY] nie powidła się
</notification>
<notification name="ErrorUndefinedGrasses">
- Błąd: Niezdefiniowane trawy: [SPECIES]
+ Błąd: niezdefiniowane trawy: [SPECIES]
</notification>
<notification name="ErrorUndefinedTrees">
- Bład: Niezdefiniowane drzewa: [SPECIES]
+ Bład: niezdefiniowane drzewa: [SPECIES]
</notification>
<notification name="CannotSaveWearableOutOfSpace">
Nie można zapisać &apos;[NAME]&apos; do pliku stroju. Musisz zwolnić trochę miejsca na Twoim komputerze i zapisać strój jeszcze raz.
@@ -940,11 +877,8 @@ Szary = Publiczna
Zazwyczaj jest to tymczasowy problem. Możesz kontynuować modyfikacje i zapisać strój ponownie za kilka minut.
</notification>
<notification name="YouHaveBeenLoggedOut">
- Twoja sesja [SECOND_LIFE] została zakończona:
-[MESSAGE]
-
-Kliknij Kontynuuj żeby zobaczyć IMy i czat.
-Żadne inne operacje nie będą dozwolone. Kliknij Wyłącz w celu natychmiastowego opuszczenia [APP_NAME].
+ Nastąpiło wylogowanie z [SECOND_LIFE]
+ [MESSAGE]
<usetemplate name="okcancelbuttons" notext="Wyłącz" yestext="Kontynuuj"/>
</notification>
<notification name="OnlyOfficerCanBuyLand">
@@ -996,7 +930,7 @@ ze wszystkich posiadłości w tym symulatorze?
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="BlankClassifiedName">
- Musisz nadać tytuł Twojej reklamie.
+ Musisz nadać tytuł Twojej Reklamie.
</notification>
<notification name="MinClassifiedPrice">
Minimalna cena za publikacjÄ™ wynosi [MIN_PRICE]L$.
@@ -1097,29 +1031,39 @@ Przekazać tą posiadłość o powierzchni [AREA] m² grupie &apos;[GROUP_NAME]&
</notification>
<notification name="ErrorMessage">
[ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
- <notification name="AvatarMoved">
- Twoje miejsce [TYPE] jest obecnie niedostępne. [HELP]
-Przeniesiono CiÄ™ do pobliskiego regionu.
+ <notification name="AvatarMovedDesired">
+ Miejsce, do którego chcesz się teleportować jest chwilowo nieobecne.
+Zostałeś przeniesiony do regionu sąsiedniego.
+ </notification>
+ <notification name="AvatarMovedLast">
+ Twoje miejsce startu jest obecnie niedostępne.
+Zostałeś przeniesiony do sąsiedniego regionu.
+ </notification>
+ <notification name="AvatarMovedHome">
+ Twoje miejsce startu jest obecnie niedostępne.
+Zostałeś przeniesiony do pobliskiego regionu.
+Możesz ustawić nowe miejsce startu.
</notification>
<notification name="ClothingLoading">
Twoje ubranie wciąż się ładuje.
Możesz normalnie używać [SECOND_LIFE], inni użytkownicy będą Cię widzieli poprawnie.
<form name="form">
- <ignore name="ignore" text="Åadowanie ubrania zajmuje dużo czasu"/>
+ <ignore name="ignore" text="Åadowanie ubraÅ„ nadal trwa"/>
</form>
</notification>
<notification name="FirstRun">
Instalacja [APP_NAME] zakończona.
Jeżeli używasz [SECOND_LIFE] po raz pierwszy to musisz stworzyć konto żeby móc się zalogować.
-Przejść na stronę www.secondlife.com żeby stworzyć nowe konto?
+Czy chcesz przejść na stronę [http://join.secondlife.com secondlife.com] żeby stworzyć nowe konto?
<usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Nowe Konto..."/>
</notification>
<notification name="LoginPacketNeverReceived">
- Problemy z połączeniem. Problem może być spowodowany Twoim połączeniem z Internetem albo może istnieć po stronie serwerów [SECOND_LIFE].
+ Problemy z połączeniem. Problem może być spowodowany Twoim połączeniem z Internetem albo może istnieć po stronie [SECOND_LIFE_GRID].
-Możesz sprawdzić swoje połączenie z Internetem i spróbować ponownie za kilka minut albo kliknij Pomoc żeby połączyć się ze stroną pomocy technicznej albo wybierz Teleportuj żeby spróbować teleportacji do Twojego miejsca startu.
+Możesz sprawdzić swoje połączenie z Internetem i spróbować ponownie za kilka minut lub połączyć się ze stroną pomocy technicznej tutaj [SUPPORT_SITE] lub wybrać Teleportuj by teleportować się do swojego miejsca startu.
<form name="form">
<button name="OK" text="OK"/>
<button name="Help" text="Pomoc"/>
@@ -1139,10 +1083,10 @@ Ten wybór będzie można później zmienić.
[NAME] [PRICE]L$ Masz za mało L$.
</notification>
<notification name="GrantedModifyRights">
- Masz teraz prawa modyfikacji obiektów należących do [FIRST_NAME] [LAST_NAME].
+ Masz teraz prawa modyfikacji obiektów należących do [NAME].
</notification>
<notification name="RevokedModifyRights">
- Prawa modyfikacji obiektów należących do [FIRST_NAME] [LAST_NAME] zostały Ci odebrane.
+ Prawa modyfikacji obiektów należących do [NAME] zostały Ci odebrane.
</notification>
<notification name="FlushMapVisibilityCaches">
To spowoduje wyczyszczenie buforów map regionu.
@@ -1188,10 +1132,10 @@ Zamień teksturę [TEXTURE_NUM] na 24-o bitową teksturę o wymiarze 512x512 lub
Maksymalna liczba gości wynosi [MAX_AGENTS].
</notification>
<notification name="MaxBannedAgentsOnRegion">
- Maksymalna liczba nieporządanych Rezydentów (banów) wynosi [MAX_BANNED].
+ Maksymalna liczba niepożądanych Rezydentów (banów) wynosi [MAX_BANNED].
</notification>
<notification name="MaxAgentOnRegionBatch">
- Próba dodania [NUM_ADDED] osób nie powidła się:
+ Próba dodania [NUM_ADDED] osób nie powiodła się:
[MAX_AGENTS] [LIST_TYPE] limit przekroczony o [NUM_EXCESS].
</notification>
<notification name="MaxAllowedGroupsOnRegion">
@@ -1236,12 +1180,30 @@ Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prędkości i st
Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prędkości i stabilności.
<usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Załaduj"/>
</notification>
+ <notification name="DownloadLinuxMandatory">
+ Nowa wersja [APP_NAME] jest dostępna.
+[MESSAGE]
+Musisz pobrać aktualizację aby korzystać z [APP_NAME].
+ <usetemplate name="okcancelbuttons" notext="Wyjdź" yestext="Pobieranie"/>
+ </notification>
+ <notification name="DownloadLinux">
+ Aktualizacja [APP_NAME] jest dostępna.
+[MESSAGE]
+Ta aktualizacja nie jest wymagana ale zaleca się jej instalację w celu poprawienia szybkości i stabilności.
+ <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Pobieranie"/>
+ </notification>
+ <notification name="DownloadLinuxReleaseForDownload">
+ Uaktualniona wersja [APP_NAME]została opublikowana.
+[MESSAGE]
+Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prędkości i stabilności.
+ <usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Pobieranie"/>
+ </notification>
<notification name="DownloadMacMandatory">
Nowa wersja [APP_NAME] została opublikowana.
[MESSAGE]
Musisz zainstalować nową wersję żeby używać [APP_NAME].
-Załadować do foldera Aplikacji?
+Pobrać i zapisać w folderze Aplikacji?
<usetemplate name="okcancelbuttons" notext="Wyłącz program" yestext="Załaduj"/>
</notification>
<notification name="DownloadMac">
@@ -1249,7 +1211,7 @@ Załadować do foldera Aplikacji?
[MESSAGE]
Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prędkości i stabilności.
-Załadować do foldera Aplikacji?
+Pobrać i zapisać w folderze Aplikacji?
<usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Załaduj"/>
</notification>
<notification name="DownloadMacReleaseForDownload">
@@ -1257,55 +1219,51 @@ Załadować do foldera Aplikacji?
[MESSAGE]
Aktualizacja nie jest wymagana ale jest zalecana w celu poprawy prędkości i stabilności.
-Załadować do foldera Aplikacji?
+Pobrać i zapisać w folderze Aplikacji?
<usetemplate name="okcancelbuttons" notext="Kontynuuj" yestext="Załaduj"/>
</notification>
<notification name="DeedObjectToGroup">
- Przekazanie tego obiektu spowoduje, że grupa:
+ Przekazanie tego obiektu spowoduje, że Grupa:
* Otrzyma L$ zapłacone temu obiektowi
- <usetemplate ignoretext="Przekazując obiekty grupom" name="okcancelignore" notext="Anuluj" yestext="Przekaż"/>
+ <usetemplate ignoretext="Proszę potwierdzić decyzję przed przepisaniem obiektu do grupy" name="okcancelignore" notext="Anuluj" yestext="Przekaż"/>
</notification>
<notification name="WebLaunchExternalTarget">
- Otworzyć systemową przegłądarke żeby zobaczyć tą zawartość?
- <usetemplate ignoretext="Otwierając systemową przeglądarkę żeby zobaczyć stronę" name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ Czy chcesz otworzyć swoją przeglądarkę internetową by zobaczyć zawartość?
+ <usetemplate ignoretext="Uruchom przeglądarkę internetową by zobaczyć stronę internetową" name="okcancelignore" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="WebLaunchJoinNow">
- Otworzyć stronę www.secondlife.com żeby zarządzać Twoim kontem?
- <usetemplate ignoretext="Otwierając systemową przeglądarkę żeby zarządzać Twoim kontem" name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ By dokonać zmian i aktualizacji swojego konta, odwiedź [http://secondlife.com/account/ Dashboard].
+ <usetemplate ignoretext="Uruchom przeglądarkę internetową by dokonać zmian w konfiguracji mojego konta" name="okcancelignore" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="WebLaunchSecurityIssues">
Odwiedź [SECOND_LIFE] Wiki i zobacz jak zgłaszać problemy z bezpieczeństwem danych.
- <usetemplate ignoretext="Otwierając przeglądarkę żeby zobaczyć Wiki kwestii bezpieczeństwa danych" name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ <usetemplate ignoretext="Uruchom przeglądarkę internetową by dowiedzieć się więcej na temat zgłaszania problemów bezpieczeństwa" name="okcancelignore" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="WebLaunchQAWiki">
Odwiedź [SECOND_LIFE] Wiki pytań i odpowiedzi.
- <usetemplate ignoretext="Otwierając przeglądarkę żeby zobaczyć Wiki pytań i odpowiedzi" name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ <usetemplate ignoretext="Uruchom przeglądarkę internetową by zobaczyć QA Wiki" name="okcancelignore" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="WebLaunchPublicIssue">
Odwiedź [SECOND_LIFE] katalog publicznych problemów, gdzie możesz zgłaszać błędy i inne problemy.
- <usetemplate ignoretext="Otwierając przeglądarkę żeby zobaczyć katalog publicznych problemów" name="okcancelignore" notext="Anuluj" yestext="OK"/>
- </notification>
- <notification name="WebLaunchPublicIssueHelp">
- Odwiedź [SECOND_LIFE] Wiki i sprawdź jak używać katalogu publicznych problemów.
- <usetemplate ignoretext="Otwierając przeglądarkę żeby zobaczyć Wiki katalogu publicznych problemów" name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ <usetemplate ignoretext="Uruchom przeglądarkę internetową by wysłać Błędy Klienta" name="okcancelignore" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="WebLaunchSupportWiki">
Otwórz oficjalny blog Lindenów żeby zobaczyć nowe wiadomości i informacje.
- <usetemplate ignoretext="Otwierając przeglądarkę żeby zobaczyć blog" name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ <usetemplate ignoretext="Uruchom przeglądarkę internetową by zobaczyć blog" name="okcancelignore" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="WebLaunchLSLGuide">
- Otworzyć przewodnik skryptowania po pomoc ze skryptami?
- <usetemplate ignoretext="Otwierając przeglądarkę żeby zobaczyć przewodnik skryptowania" name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ Czy chcesz otworzyć samouczek Języka Skryptowania?
+ <usetemplate ignoretext="Uruchom przeglądarkę internetową by samouczek Języka Skryptowania" name="okcancelignore" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="WebLaunchLSLWiki">
- Otworzyć portal LSL po pomoc ze skryptami?
- <usetemplate ignoretext="Otwierając przeglądarkę żeby zobaczyć portal LSL" name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ Czy napewno chcesz odwiedzić portal LSL Portal?
+ <usetemplate ignoretext="Uruchom przeglÄ…darkÄ™ internetowÄ… by LSL Portal" name="okcancelignore" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="ReturnToOwner">
Czy na pewno chcesz zwrócić wybrane obiekty do ich właścicieli? Wszystkie udostępnione obiekty z prawem transferu zostaną zwrócone poprzednim właścicielom.
*UWAGA* Wszystkie udostępnione obiekty bez prawa transferu zostaną usunięte!
- <usetemplate ignoretext="Zwracając obiekty ich właścicielom" name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ <usetemplate ignoretext="Potwierdź zanim zwrócisz obiekty do ich właścicieli" name="okcancelignore" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="GroupLeaveConfirmMember">
Jesteś członkiem grupy [GROUP].
@@ -1313,18 +1271,18 @@ Chcesz opuścić grupę?
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="ConfirmKick">
- NA PEWNO chcesz wyrzucić wszystkich użytkowników z sieci?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Wyrzuć Wszystkich Użytkowników"/>
+ Napewno chcesz wyrzucić wszystkich Rezydentów z gridu?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Wyrzuć wszystkich Rezydentów"/>
</notification>
<notification name="MuteLinden">
- Przepraszamy, ale nie możesz wyciszyć Lindena.
+ Przepraszamy, ale nie możesz zablokować Lindena.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="CannotStartAuctionAlreadyForSale">
Aukcja nie może zostać rozpoczęta w posiadłości, która została już wcześniej wystawiona na aukcję. Deaktywuj opcję sprzedaży posiadłości jeżeli chcesz rozpocząć aukcję.
</notification>
- <notification label="Błąd Wyciszenia Obiektu Przez Nazwę" name="MuteByNameFailed">
- Ta osoba została już wyciszona przez Ciebie.
+ <notification label="Zablokuj obiekty według wpisanej nazwy" name="MuteByNameFailed">
+ Rezydent/obiekt jest już zablokowany.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="RemoveItemWarn">
@@ -1341,19 +1299,21 @@ Chcesz opuścić grupę?
</notification>
<notification name="BusyModeSet">
Tryb Pracy jest włączony.
-Czat i IMy bedą ukryte. Wysłane IMy będą otrzymywały Twoją odpowiedź Trybu Pracy. Propozycje teleportacji będą odrzucone.
-Dodatkowo, wszystkie podarowane dla Ciebie obiekty będą automatycznie zapisywane w folderze "Kosz" w Twojej szafie.
- <usetemplate ignoretext="Włączając Tryb Pracy" name="okignore" yestext="OK"/>
+Czat i IM będą ukryte. Wysłane IM będą otrzymywały Twoją odpowiedź Trybu Pracy. Propozycje teleportacji będą odrzucone.
+Dodatkowo, wszystkie podarowane dla Ciebie obiekty będą automatycznie zapisywane w folderze &quot;Kosz&quot; w Twojej szafie.
+ <usetemplate ignoretext="Status zmieniony na Tryb Pracy" name="okignore" yestext="OK"/>
</notification>
<notification name="JoinedTooManyGroupsMember">
- Należysz już do maksymalnej ilości grup.
-Musisz opuścić przynajmniej jedną grupę żeby przyjąć członkostwo w tej grupie, albo musisz odmówić. W celu opuszczenia grupy wybierz opcję &apos;Grupy...&apos; z menu &apos;Edycja&apos;.
+ Należysz już do maksymalnej ilości grup. Opuść proszę przynajmniej jedną grupę żeby przyjąć członkostwo w tej grupie, albo odmów.
[NAME] oferuje Ci członkostwo w grupie.
-[INVITE]
<usetemplate name="okcancelbuttons" notext="Odmów" yestext="Przyjmij"/>
</notification>
+ <notification name="JoinedTooManyGroups">
+ Należysz już do maksymalnej ilości grup. Opuść proszę przynajmiej jedną grupę żeby przyjąć członkostwo w tej grupie, albo odmów.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="KickUser">
- Z jakim komunikatem wyrzucić tego użytkownia?
+ Wyrzuć tego Rezydenta, wysyłając następujący komunikat.
<form name="form">
<input name="message">
Administrator wylogował Cię.
@@ -1373,7 +1333,7 @@ Musisz opuścić przynajmniej jedną grupę żeby przyjąć członkostwo w tej g
</form>
</notification>
<notification name="FreezeUser">
- Z jakim komunikatem unieruchomić tego użytkownia?
+ Unieruchom tego Rezydenta, wysyłając następujący komunikat.
<form name="form">
<input name="message">
Unieruchomiono Cię. Nie możesz się ruszać ani rozmawiać. Administrator skontaktuje się z Tobą poprzez IM.
@@ -1383,7 +1343,7 @@ Musisz opuścić przynajmniej jedną grupę żeby przyjąć członkostwo w tej g
</form>
</notification>
<notification name="UnFreezeUser">
- Z jakim komunikatem odblokować tego użytkownia?
+ Cofnij unieruchomienie tego Rezydenta, wysyłając następujący komunikat.
<form name="form">
<input name="message">
Odblokowano CiÄ™.
@@ -1403,7 +1363,7 @@ Musisz opuścić przynajmniej jedną grupę żeby przyjąć członkostwo w tej g
</form>
</notification>
<notification name="OfferTeleportFromGod">
- Wymusić przeniesienie użytkownika do miejsca Twojego pobytu?
+ Wysłać propozycję teleportacji do Twojego miejsca?
<form name="form">
<input name="message">
Zapraszam do siebie. Region: [REGION]
@@ -1413,8 +1373,16 @@ Musisz opuścić przynajmniej jedną grupę żeby przyjąć członkostwo w tej g
</form>
</notification>
<notification name="TeleportFromLandmark">
- Na pewno chcesz się teleportować?
- <usetemplate ignoretext="TeleportujÄ…c z miejsca (LM) z Twojej szafy" name="okcancelignore" notext="Anuluj" yestext="Teleportuj"/>
+ Na pewno chcesz się teleportować do &lt;nolink&gt;[LOCATION]&lt;/nolink&gt;?
+ <usetemplate ignoretext="Potwierdź próbę teleportacji do zapisanego miejsca" name="okcancelignore" notext="Anuluj" yestext="Teleportuj"/>
+ </notification>
+ <notification name="TeleportToPick">
+ Teleportuj do [PICK]?
+ <usetemplate ignoretext="Potwierdź, że chcesz teleportować się do miejsca w Ulubionych" name="okcancelignore" notext="Anuluj" yestext="Teleportuj"/>
+ </notification>
+ <notification name="TeleportToClassified">
+ Teleportuj do [CLASSIFIED]?
+ <usetemplate ignoretext="Potwierdź, że chcesz teleportować się do lokalizacji z Reklamy" name="okcancelignore" notext="Anuluj" yestext="Teleportuj"/>
</notification>
<notification label="Wiadomość do Wszystkich w Twoim Majątku" name="MessageEstate">
Wpisz krótką wiadomość która zostanie wysłana do wszystkich osób w Twoim majątku.
@@ -1425,9 +1393,9 @@ Musisz opuścić przynajmniej jedną grupę żeby przyjąć członkostwo w tej g
</form>
</notification>
<notification label="Zmiana Majątku Lindenów" name="ChangeLindenEstate">
- Dokonujesz zmiany w Regionie Głównym należącym do Lindenów (Regiony Główne, Teen Grid, Orientacja).
-
-Żądana operacja jest wyjątkowo niebezpieczna dla wszystkich Rezydentów przebywających w regionie. Dodatkowo, zmiany dokonane w Regionie Głównym mogą spowodować problemy przestrzeni serwerowej innych regionów.
+ Czy napewno chcesz zmienić ustawienia majątku Linden (mainland, teen grid, orientacja, itp).
+
+Jest to wyjątkowo niebezpieczna decyzja, odczuwalna przez wszystkich Rezydentów. Dla mainland, spowoduje to zmianę tysięcy regionów oraz ich przestrzeń serwerową.
Kontynuować?
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
@@ -1485,9 +1453,7 @@ Kontynuować?
Ze względu na Twój wiek, nie jesteś uprawniony do przebywania w tym regionie. Może być to wynikiem braku informacji na temat weryfikacji Twojego wieku.
Upewnij się, że masz zainstalowaną najnowszą wersję klienta i skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="RegionEntryAccessBlocked_KB">
Ze względu na Twój wiek, nie jesteś uprawniony do przebywania w tym regionie.
@@ -1496,37 +1462,26 @@ Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostęp
<url name="url">
https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
</url>
- <usetemplate
- name="okcancelignore"
- yestext="[SECOND_LIFE]:Pomoc"
- notext="Zamknij"
- ignoretext="Dostęp do posiadłości jest zablokowany ze względu na rodzaj treści jaką zawiera"/>
+ <usetemplate ignoretext="Ze względu na Twój wiek, nie jesteś uprawniony do przebywania w tym regionie. Może być to wynikiem braku informacji na temat weryfikacji Twojego wieku." name="okcancelignore" notext="Zamknij" yestext="[SECOND_LIFE]:Pomoc"/>
</notification>
<notification name="RegionEntryAccessBlocked_Notify">
Ze względu na Twój wiek, nie jesteś uprawniony do przebywania w tym regionie.
</notification>
<notification name="RegionEntryAccessBlocked_Change">
- W związku ze statusem ustawień Twojego wieku, nie jesteś uprawniony do przebywania w tym regionie.
-
-Możeszy wybrać &apos;Zmień Ustawienia&apos; by dokonać zmian w ustawieniach Twojego wieku by uzyskać dostęp do regionu. Wówczas będziesz w stanie znaleźć oraz mieć dostęp do [REGIONMATURITY] treści. Jeżeli zdecydujesz się na powrót do poprzednich ustawień, wybierz Edycja &gt; Ustawienia... &gt; Główne.
- <form name="form">
- <button
- name="OK"
- text="Zmień Ustawienia"/>
- <button
- default="true"
- name="Cancel"
- text="Zamknij"/>
- <ignore name="ignore" text="Dostęp do posiadłości jest zablokowany ze względu na ustawienia rodzaju treści jaką zawiera"/>
- </form>
+ Ze względu na Twój wiek, nie jesteś uprawniony do przebywania w tym regionie.
+
+Możesz wybrać &apos;Zmień Ustawienia&apos; by dokonać zmian w ustawieniach Twojego wieku by uzyskać dostęp do regionu. Wówczas będziesz w stanie znaleźć oraz mieć dostęp do [REGIONMATURITY] treści. Jeżeli zdecydujesz się na powrót do poprzednich ustawień, wybierz Ja &gt; Ustawienia &gt; Główne.
+ <form name="form">
+ <button name="OK" text="Zmień Ustawienia"/>
+ <button default="true" name="Cancel" text="Zamknij"/>
+ <ignore name="ignore" text="Moje ustawienia wieku nie dopuszczajÄ… do regionu"/>
+ </form>
</notification>
<notification name="LandClaimAccessBlocked">
W związku ze statusem ustawień Twojego wieku, nie możesz odzyskać tej posiadłości. Możesz potrzebować weryfikacji wieku bądź instalacji najnowszej wersji klienta.
Upewnij się, że masz zainstalowaną najnowszą wersję klienta i skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LandClaimAccessBlocked_KB">
Ze względu na Twój wiek, nie możesz odzyskać tej posiadłości.
@@ -1535,11 +1490,7 @@ Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostęp
<url name="url">
https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
</url>
- <usetemplate
- name="okcancelignore"
- yestext="[SECOND_LIFE]:Pomoc"
- notext="Zamknij"
- ignoretext="Odzyskanie posiadłości jest zablokowane ze względu na rodzaj treści jaką zwiera"/>
+ <usetemplate ignoretext="W związku ze statusem ustawień Twojego wieku, nie możesz odzyskać tej posiadłości." name="okcancelignore" notext="Zamknij" yestext="[SECOND_LIFE]:Pomoc"/>
</notification>
<notification name="LandClaimAccessBlocked_Notify">
Ze względu na Twój wiek, nie możesz odzyskać tej posiadłości.
@@ -1547,20 +1498,14 @@ Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostęp
<notification name="LandClaimAccessBlocked_Change">
W związku ze statusem ustawień Twojego wieku, nie możesz odzyskać tej posiadłości.
-Możeszy wybrać &apos;Zmień Ustawienia&apos; by dokonać zmian w ustawieniach Twojego wieku by uzyskać dostęp do posiadłości. Wówczas będziesz w stanie znaleźć, oraz mieć dostęp do [REGIONMATURITY] treści. Jeżeli zdecydujesz się na powrót do poprzednich ustawień, wybierz Edycja &gt; Ustawienia... &gt; Główne.
- <usetemplate
- name="okcancelignore"
- yestext="Zmień Ustawienia"
- notext="Zamknij"
- ignoretext="Odzyskanie posiadłości jest zablokowane ze względu na ustawienia rodzaju treści jaką zawiera"/>
+Możesz wybrać &apos;Zmień Ustawienia&apos; by dokonać zmian w ustawieniach Twojego wieku by uzyskać dostęp do regionu. Wówczas będziesz w stanie znaleźć oraz mieć dostęp do [REGIONMATURITY] treści. Jeżeli zdecydujesz się na powrót do poprzednich ustawień, wybierz Ja &gt; Ustawienia &gt; Główne.
+ <usetemplate ignoretext="Ze względu na Twój wiek, nie możesz odzyskać tej posiadłości." name="okcancelignore" notext="Zamknij" yestext="Zmień Ustawienia"/>
</notification>
<notification name="LandBuyAccessBlocked">
Ze względu na Twój wiek, nie możesz kupić tej posiadłości. Może być to wynikiem braku informacji na temat weryfikacji Twojego wieku.
Upewnij się, że masz zainstalowaną najnowszą wersję klienta i skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostępu do regionów z podanym rodzajem treści jaką zawiera.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LandBuyAccessBlocked_KB">
Ze względu na Twój wiek, nie możesz kupić tej posiadłości.
@@ -1569,11 +1514,7 @@ Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostęp
<url name="url">
https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=6010
</url>
- <usetemplate
- name="okcancelignore"
- yestext="[SECOND_LIFE]:Pomoc"
- notext="Zamknij"
- ignoretext="Zakup posiadłości jest zablokowany ze względu na rodzaj treści jaką zawiera"/>
+ <usetemplate ignoretext="Ze względu na Twój wiek, nie możesz kupić tej posiadłości." name="okcancelignore" notext="Zamknij" yestext="[SECOND_LIFE]:Pomoc"/>
</notification>
<notification name="LandBuyAccessBlocked_Notify">
Ze względu na Twój wiek, nie możesz kupić tej posiadłości.
@@ -1581,12 +1522,11 @@ Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostęp
<notification name="LandBuyAccessBlocked_Change">
W związku ze statusem ustawień Twojego wieku, nie możesz kupić tej posiadłości.
-Możesz wybrać &apos;Zmień Ustawienia&apos; by dokonać zmian w ustawieniach Twojego wieku by uzyskać dostęp do posiadłości. Wówczas będziesz w stanie znaleźć oraz mieć dostęp do [REGIONMATURITY] treści. Jeżeli zdecydujesz się na powrót do poprzednich ustawień, wybierz Edycja &gt; Ustawienia... &gt; Główne.
- <usetemplate
- name="okcancelignore"
- yestext="Zmień Ustawienia"
- notext="Zamknij"
- ignoretext="Zakup posiadłości jest zablokowany ze względu na ustawienia rodzaju treści jaką zawiera"/>
+Możesz wybrać &apos;Zmień Ustawienia&apos; by dokonać zmian w ustawieniach Twojego wieku by uzyskać dostęp do regionu. Wówczas będziesz w stanie znaleźć oraz mieć dostęp do [REGIONMATURITY] treści. Jeżeli zdecydujesz się na powrót do poprzednich ustawień, wybierz Ja &gt; Ustawienia &gt; Główne.
+ <usetemplate ignoretext="W związku ze statusem ustawień Twojego wieku, nie możesz kupić tej posiadłości." name="okcancelignore" notext="Zamknij" yestext="Zmień Ustawienia"/>
+ </notification>
+ <notification name="TooManyPrimsSelected">
+ Zbyt wiele wybranych obiektów. Wybierz [MAX_PRIM_COUNT] lub mniej i spróbuj ponownie
</notification>
<notification name="ProblemImportingEstateCovenant">
Problem z importem umowy majÄ…tku.
@@ -1600,9 +1540,7 @@ Możesz wybrać &apos;Zmień Ustawienia&apos; by dokonać zmian w ustawieniach T
</notification>
<notification name="UnableToLoadNotecardAsset">
Brak możliwości załadowania noty w tej chwili.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="NotAllowedToViewNotecard">
NiewystarczajÄ…ce prawa do zobaczenia notki przypisanej do wybranego ID.
@@ -1620,19 +1558,11 @@ Zamieścić tą reklamę za [AMOUNT]L$?
</notification>
<notification name="SetClassifiedMature">
Czy ta reklama zawiera treść &apos;Mature&apos;?
- <usetemplate
- canceltext="Anuluj"
- name="yesnocancelbuttons"
- notext="Nie"
- yestext="Tak"/>
+ <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie" yestext="Tak"/>
</notification>
<notification name="SetGroupMature">
Czy ta grupa zawiera treść &apos;Mature&apos;?
- <usetemplate
- canceltext="Anuluj"
- name="yesnocancelbuttons"
- notext="Nie"
- yestext="Tak"/>
+ <usetemplate canceltext="Anuluj" name="yesnocancelbuttons" notext="Nie" yestext="Tak"/>
</notification>
<notification label="Potwierdź Restart" name="ConfirmRestart">
Na pewno chcesz zrobić restart tego regionu za 2 minuty?
@@ -1646,201 +1576,14 @@ Zamieścić tą reklamę za [AMOUNT]L$?
<button name="Cancel" text="Anuluj"/>
</form>
</notification>
- <notification label="Blokowanie Kształtowania Terenu" name="HelpRegionBlockTerraform">
- Jeżeli ta opcja jest wybrana właściciele posiadłości nie będą mogli kształtować terenu niezależnie od ustawienia opcji &apos;Edycja Terenu&apos; dla posiadłości.
-
-Domyślnie: nie wybrana
- </notification>
- <notification label="Blokowanie Latania" name="HelpRegionBlockFly">
- Jeżeli ta opcja jest wybrana ludzie nie będą mogli latać w tym regionie niezależnie od ustawienia opcji &apos;Latanie&apos; dla posiadłości.
-
-Domyślnie: nie wybrana
- </notification>
- <notification label="Zezwalanie na Uszkodzenia" name="HelpRegionAllowDamage">
- Jeżeli ta opcja jest wybrana system zdrowia będzie aktywny we wszystkich posiadłościach niezależnie od ustawień dla indywidualnych posiadłości. Jeżeli ta opcja nie jest wybrana właściciele indywidualych posiadłości będą mogli kontrolować system zdrowia w swoich posiadłościach.
-
-Domyślnie: nie wybrana
- </notification>
- <notification label="Limit Liczby Awatarów" name="HelpRegionAgentLimit">
- Wybierz maksymalną liczbę awatarów dozwoloną w tym regionie.
-Wydajność systemu może się zmieniać w zależności od liczby obecnych awatarów.
-
-Domyślnie: 40
- </notification>
- <notification label="Ekstra Obiekty" name="HelpRegionObjectBonus">
- Ekstra Obiekty jest to mnożnik dla dozwolonych elementów (obiektów prostych). Dozwolony zakres to 1 do 10. Ustawienie &apos;1&apos; pozwala na 117 elementów na każdej posiadłości o powierzchni 512m. Ustawienie &apos;2&apos; pozwala na 234 elementy, czyli dwa razy tyle, itd.
-Maksymalna liczba elementów w regionie to 15000 niezależnie od ustawienia Ekstra Obiektów. Pamiętaj - zmniejszenie Ekstra Obiektów po fakcie może spowodować odsyłanie lub usuwanie istniejących obiektów.
-
-Domyślnie: 1,0
- </notification>
- <notification label="Treść" name="HelpRegionMaturity">
- Aktywuj opcję klasyfikacji regionu ze względu na treść jaką zawiera, która zostaje wyświetlana w górnym pasku widoku w nazwie regionu oraz w podpowiedziach Mapy Świata. Dodatkowo, opcja ta wpływa na dostęp do wyników w czasie wyszukiwania danego regionu. By móc odwiedzić dany region lub mieć dostęp do jego wyników w czasie wyszukiwania, Rezydent musi mieć takie same ustawienia dla treści jak dany region.
-
-By dokonana zmiana została zsynchronizowana z Mapą Świata, poczekaj kilka minut.
- </notification>
- <notification label="Blokowanie Popychania" name="HelpRegionRestrictPushObject">
- Ta opcja powoduje, że popychanie będzie ograniczone w całym regionie. Jeżeli ta opcja jest wybrana Rezydenci mogą być popchnięci tylko przez samych siebie lub przez właściciela posiadłości.
-(Popychanie odnosi sie do funkcji llPushObject() w LSL.)
-
-Domyślnie: nie wybrana
- </notification>
- <notification label="Dzielenie / ÅÄ…czenie PosiadÅ‚oÅ›ci" name="HelpParcelChanges">
- Ta opcja kontroluje czy posiadłości nie należące do właściciela tego majątku mogą być łączone / dzielone.
-Jeżeli opcja nie jest wybrana:
-* Tylko właściciele majątku i zarządcy mogą łączyć / dzielić posiadłości.
-* Tylko posiadłości należące do właściciela albo do grupy mogą być
- łączone / dzielone przez członków z wystarczającymi prawami.
-Jeżeli ta opcja jest wybrana:
-* Wszyscy właściciele mogą łączyć / dzielić swoje posiadłości.
-* Posiadłości należące do grupy mogą być łączone / dzielone
- przez członków z wystarczającymi prawami.
-
-Domyślnie: wybrana
- </notification>
- <notification label="Nie Pokazuj w Wyszukiwaniu" name="HelpRegionSearch">
- Wybranie tej opcji uniemożliwi właścicielom posiadłość wyświetlanie ich posiadłości w wyszukiwaniu
-Domyślinie: nie wybrana
- </notification>
<notification label="Zmienione Restrykcje Wieku dla Regionu" name="RegionMaturityChange">
Ustawienie restrykcji wieku dla regionu zostało zmienione.
Zazwyczaj musi upłynąć nieco czasu zanim ta zmiana zostanie odzwierciedlona na mapie.
- </notification>
- <notification label="Odsprzedaż Posiadłości" name="HelpRegionLandResell">
- Właściciele majątku i zarządcy mogą sprzedawać posiadłości należące do właściciela majątku.
-Jeżeli ta opcja nie jest wybrana kupujący nie będą mogli odsprzedać posiadłości w tym regionie.
-Jeżeli ta opcja jest wybrana kupujący będą mogli odsprzedać posiadłości w tym regionie.
-
-Domyślinie: nie pozwalaj
- </notification>
- <notification label="Wyłącz Skrypty" name="HelpRegionDisableScripts">
- Słaba wydajność / prędkość symulatora może być spowodowana przez skrypt. Otwórz panel Statystyki (Ctrl+Shift+1). Sprawdź ilość klatek na sekundę (FPS) w Fizyce Symulatora. Jeżeli jest mniej niż 45 wybierz panel Czas znajdujący się na dole panelu Statystyki. Jeżeli Czas Skryptów wynosi 25 ms lub więcej kliknij na Główne Skrypty. Zobaczysz listę nazw i lokacji skryptów które mogą być odpowiedzialne za pogorszenie wydajności.
-
-Wybranie opcji Wyłącz Skrypty i naciśnięcie Zastosuj tymczasowo wyłączy wszystkie skrypty w tym regionie. Wybranie tej opcji może być niezbędne w celu umożliwienia podróży do lokacji wymienionego Głównego Skryptu.
-Po przebyciu na miejsce zobacz skrypt i sprawdź czy jest on źródłem problemu. W razie potrzeby skontaktuj się z właścicielem skryptu albo usuń lub zwróć obiekt.
-Wyłączenie opcji Wyłącz Skrypty i naciśnięcie Zastosuj ponownie włączy skrypty w tym regionie.
-
-Domyślnie: nie wybrana
- </notification>
- <notification label="Wyłącz Kolizje" name="HelpRegionDisableCollisions">
- Słaba wydajność / prędkość symulatora może być spowodowana przez fizyczne obiekty. Otwórz panel Statystyki (Ctrl+Shift+1). Sprawdź ilość klatek na sekundę (FPS) w Fizyce Symulatora. Jeżeli jest mniej niż 45 wybierz panel Czas znajdujący się na dole panelu Statystyki. Jeżeli Czas Symulatora (Fizyka) wynosi 20 ms lub więcej kliknij na Główne Kolizje. Zobaczysz listę nazw i lokacji fizycznych obiektów które mogą być odpowiedzialne za pogorszenie wydajności.
-
-Wybranie opcji Wyłącz Kolizje i naciśnięcie Zastosuj tymczasowo wyłączy kolizje obiektów. Wybranie tej opcji może być niezbędne w celu umożliwienia podróży do lokacji wymienionych Główneych Kolizji.
-Po przebyciu na miejsce zobacz obiekt i sprawdź czy jest on źródłem kolizji z innymi obiektami. W razie potrzeby skontaktuj się z właścicielem obiektu albo usuń lub zwróć obiekt.
-Wyłączenie opcji Wyłącz Kolizje i naciśnięcie Zastosuj ponownie włączy kolizje w tym regionie.
-
-Domyślnie: nie wybrana
- </notification>
- <notification label="Wyłącz Fizykę" name="HelpRegionDisablePhysics">
- Opcja Wyłącz Fizykę jest podobna do opcji Wyłącz Kolizje i spowoduje wyłączenie symulacji fizyki. Oznacza to, że nie tylko obiekty przestaną się zderzać, ale również awatary nie będą się mogły poruszać.
-
-Ta opcja powinna być używana wyłącznie w przypadku kiedy użycie opcji Wyłącz Kolizje nie zwiększa wystarczająco wydajności symulatora w celu sprawdzenia problemów związanych z fizyką i z kolizjami.
-
-Po zakończeniu badań musisz ponownie włączyć fizykę żeby awatary mogły się poruszać.
-
-Domyślnie: nie wybrana
- </notification>
- <notification label="Główne Kolizje" name="HelpRegionTopColliders">
- Pokaż listę obiektów potencjalnie doświadczających największej ilości kolizji między obiektami. Te obiekty mogą być odpowiedzialne za zmniejszenie wydajności. Wybierz Widok &gt; Statystyki i zobacz Symulator &gt; Czas &gt; Czas Symulatora (Fizyka) i sprawdź czy więcej niż 20 ms jest spędzane w fizyce.
- </notification>
- <notification label="Główne Skrypty" name="HelpRegionTopScripts">
- Pokaż listę obiektów spędzających najwęcej czasu wykonując skrypty LSL. Te obiekty mogą być odpowiedzialne za zmniejszenie wydajności. Wybierz Widok &gt; Statystyki i zobacz Symulator &gt; Czas &gt; Czas Skryptów i sprawdź czy więcej niż 25 ms jest spędzane w skryptach.
- </notification>
- <notification label="Restart Regionu" name="HelpRegionRestart">
- Restart procesu na serwerze obsługującym ten region za dwie minuty. Wszyscy Rezydenci w tym regionie zostaną wylogowani. Region zapisze swoje dane i powinien wystartować w przeciągu 90 sekund.
-
-Restart regionu nie naprawi większości problemów związanych z wydajnością / prędkością i generalnie powinnien być używany na polecenie.
- </notification>
- <notification label="Poziom Wody" name="HelpRegionWaterHeight">
- Jest to poziom w metrach gdzie pojawia się woda. Jeżeli jest wybrana inna wartość niż 20 i Twoja woda sąsiaduje z krawędzią świata lub pustym miejscem to będzie widoczny uskok.
-
-Domyślnie: 20
- </notification>
- <notification label="Wznoszenie Terenu" name="HelpRegionTerrainRaise">
- Jest to dystans w metrach o który właściciele posiadłości mogą podnieść teren powyżej ustalonego poziomu odniesienia.
-
-Domyślnie: 4
- </notification>
- <notification label="Obniżanie Terenu" name="HelpRegionTerrainLower">
- Jest to dystans w metrach o który właściciele posiadłości mogą obniżyć teren poniżej ustalonego poziomu odniesienia.
-
-Domyślnie: -4
- </notification>
- <notification label="Åadowanie RAW Terenu" name="HelpRegionUploadRaw">
- Ten przycisk ładuje plik .RAW dla tego regionu.
-Plik musi mieć poprawne wymiary (RGB, 256x256) i 13 kanałów.
-Najprostszy sposób na stworzenie pliku terenu to zapisanie istniejącego pliku RAW. Zalecany pierwszy krok to modyfikacje kanału czerwieni (wysokość terenu) i ładowanie nowego pliku.
-
-Åadowanie pliku może zająć 45 sekund. ZaÅ‚adowanie terenu nie przemieÅ›ci obiektów znajdujÄ…cych siÄ™ na tym terenie, tylko teren i prawa przypisane do posiadÅ‚oÅ›ci ulegnÄ… zmianie. Może to spowodować, że niektóre obiekty zniknÄ… pod ziemiÄ….
-
-Aby uzyskać więcej informacji o edycji map wysokości sprawdź F1 Pomoc.
- </notification>
- <notification label="Zapisywanie RAW Terenu" name="HelpRegionDownloadRaw">
- Ten przycisk zapisuje plik zawierający mapę wysokości, wymiary posiadłości, dane o posiadłościach na sprzedaż i niektóre prawa przypisane do posiadłości w tym regionie. Jeżeli otwierasz ten plik w programie takim jak Photoshop musisz zdefniować wymiary dokumentu jako: RGB, 256x256, 13 kanałów. Ten plik terenu nie może zostać otwarty w żaden inny sposób.
-
-Aby uzyskać więcej informacji o edycji map wysokości sprawdź F1 Pomoc.
- </notification>
- <notification label="Używaj Słońca Majątku" name="HelpRegionUseEstateSun">
- Ta opcja ustala pozycję słońca w tym regionie żeby była taka sama jak pozycja słońca w reszcie majątku.
-
-Domyślnie: włączona
- </notification>
- <notification label="Stałe Słońce" name="HelpRegionFixedSun">
- Ta opcja ustala pozycję słońca do pozycji w suwaku faz i unieruchamia słońce w wybranej pozycji.
-
-Domyślnie: nie włączona
- </notification>
- <notification label="Ustalanie Terenu" name="HelpRegionBakeTerrain">
- Ten przycisk zapisuje obecne ukształtowanie terenu jako nowy punkt odniesienia dla regionu. Po ustaleniu punktu odniesienia teren może zostać odtworzony do zapisanego kształtu wybierając opcję Odtwórz w Edycji Terenu. Zapisany, ustalony teren jest również punktem odniesienia dla górnego i dolnego limitu zmian wysokości.
- </notification>
- <notification label="ZarzÄ…dcy MajÄ…tku" name="HelpEstateEstateManager">
- Zarządca majątku jest Rezydentem oddelegowanym przez Ciebie do kontroli ustawień regionu i majątku. Zarządca majątku może zmieniać wszystkie ustawienia dostępne na tym panelu, za wyjątkiem ładowania, zapisywania i ustalania terenu. W szczgólności może kontrolować dostęp innych Rezydentów (bany) do Twojego majątku.
-
-Zarządcy majątku mogą być dodawani i usuwani wyłącznie przez właściciela majątku. Wybieraj na zarządców tylko tych Rezydentów którym ufasz ponieważ ponosisz odpowiedzialność za ich działania.
- </notification>
- <notification label="Używaj Globalnego Czasu" name="HelpEstateUseGlobalTime">
- Ta opcja ustala pozycję słońca w Twoim majątku żeby była taka sama jak pozycja słońca w regionach głównych należących do Lindenów.
- </notification>
- <notification label="Stałe Słońce" name="HelpEstateFixedSun">
- Ta opcja ustala pozycję słońca do pozycji w suwaku faz i unieruchamia słońce w wybranej pozycji.
- </notification>
- <notification label="Dostęp Publiczny" name="HelpEstateExternallyVisible">
- Ta opcja kontroluje czy Rezydenci znajdujący się w innych majątkach mogą przenosić się do tego majątku jeżeli nie są umieszczeni na liście dostępu.
-
-Domyślnie: włączona
- </notification>
- <notification label="Pozwalaj na Bezpośrednią Teleportację" name="HelpEstateAllowDirectTeleport">
- Włączenie tej opcji pozwala Rezydentom na bezpośrednią teleportację do dowolnego miejsca a Twoim majątku. Jeżeli ta opcja nie jest wyłączona Rezydenci mogą się teleportować do najbliższego teleportera.
-Domyślnie: nie włączona
- </notification>
- <notification label="Dostęp do Majątku" name="HelpEstateAllowResident">
- Dostęp do tego majątku będzie ograniczony do wymienionych Rezydentów i poniższych grup. Ta opcja jest dostępna tylko wtedy kiedy opcja Dostępu Publicznego jest wyłączona.
- </notification>
- <notification label="Dostęp Grup do Majątku" name="HelpEstateAllowGroup">
- Dostęp do tego majątku będzie ograniczony do wymienionych grup i powyższych Rezydentów. Ta opcja jest dostępna tylko wtedy kiedy opcja Dostępu Publicznego jest wyłączona.
- </notification>
- <notification label="Email o Nadużyciach" name="HelpEstateAbuseEmailAddress">
- Wpisanie ważnego email adresu spowoduje, że raporty o nadużyciach w obrębie tego majątku będą wysyłane na ten adres. Zostawienie pustego miejsca spowoduje, że raporty o nadużyciach będą wysyłane wyłącznie do Linden Lab.
- </notification>
- <notification label="Wstęp Wzbroniony (bany)" name="HelpEstateBanResident">
- Rezydenci umieszczeni na tej liście nie mają dostępu do Twojego majątku, niezależnie od jakichkolwiek innych ustawień.
- </notification>
- <notification label="Pozwalaj na Rozmowy" name="HelpEstateVoiceChat">
- Posiadłości w tym majątku mogą mieć własne kanały głosu pozwalające Rezydentom na rozmowy z osobami w pobliżu.
-
-Domyślnie: nie włączone
+Aby wejść do regionu Adult, Rezydenci muszą posiadać zweryfikowane konto, albo w wyniku weryfikacji wieku albo płatości.
</notification>
<notification label="Wersja Niezgodna z Systemem Rozmów" name="VoiceVersionMismatch">
- Ta wersja [APP_NAME] nie jest kompatybilna z systemem Rozmów w tym regionie. Musisz zainstalować aktualną wersję [APP_NAME] żeby Rozmowy działały porawnie.
- </notification>
- <notification label="Umowa MajÄ…tku" name="HelpEstateCovenant">
- Włączenie opcji umowy majątku jest wymagane w celu umożliwienia sprzedaży posiadłości w obrębie majątku.
-Jeżeli opcja umowy nie jest wybrana sprzedaż posiadłości nie jest dozwolona. Notka określająca Twoją umowę może być pusta jeżeli nie chcesz ustalić zasad specyficznych dla Twojego majątku i jeżeli nie chcesz uprzedzać nabywców o faktach odnoszących się do posiadłości przed zakupem.
-
-Umowa może być używana w celu określenia zasad, zaleceń, przekazywania informacji o kulturze lub, po prostu, Twoich własnych oczekiwań w odniesieniu do potencjalnego nabywacy.
-Możesz zdefiniować zasady podziału posidłości, prawa budowlane, zasady opłat i wszystkie dodatkowe informacje z którymi nowy właściciel powinien zapoznać się i zaakceptować przed zakupem.
-
-Nabywca musi wybrać opcję akceptacji umowy żeby trasakcja mogła zostać sfinalizowana. Umowa majątku jest zawsze dostępna w dialogu O Posiadłości dla każedej posiadłości ze zdefinowaną umową.
+ Ta wersja [APP_NAME] nie jest kompatybilna z systemem rozmów w tym Regionie. Musisz zainstalować aktualną wersję [APP_NAME] aby komunikacja głosowa działała poprawnie.
</notification>
<notification label="Nie Można Kupić Obiektów" name="BuyObjectOneOwner">
Jednorazowo możesz kupować tylko od jednego właściciela.
@@ -1917,63 +1660,45 @@ Wpisz hasło ponownie i kliknij OK.
</notification>
<notification name="SetPickLocation">
Uwaga:
-Lokacja tego wyboru została zaktualizowana ale pozostałe szczegóły zachowają oryginalne wartości.
+Lokalizacja tego wyboru została zaktualizowana ale pozostałe szczegóły zachowają oryginalne wartości.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="MoveInventoryFromObject">
- Wybrane obiekty szafy nie majÄ… praw kopiowania.
-Obiekty zostanÄ… przeniesione do Twojej szafy, nie zostanÄ… skopiowane.
+ Wybrane obiekty Szafy nie majÄ… praw kopiowania.
+Obiekty zostanÄ… przeniesione do Twojej Szafy, nie zostanÄ… skopiowane.
-Przenieść obiekty szafy?
- <usetemplate ignoretext="Przenosząc szafę bez praw kopiowania z obiektów" name="okcancelignore" notext="Anuluj" yestext="OK"/>
+Przenieść obiekty Szafy?
+ <usetemplate ignoretext="Uprzedź przed przeniesieniem zawartości niekopiowalnej z obiektu" name="okcancelignore" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="MoveInventoryFromScriptedObject">
- Wybrane obiekty szafy nie majÄ… praw kopiowania.
+ Wybrane obiekty Szafy nie majÄ… praw kopiowania.
Obiekty zostanÄ… przeniesione do Twojej Szafy, nie zostanÄ… skopiowane.
-Ponieważ obiekty zawierają skrypty, przeniesienie obiektów do Twojej szafy może spowodować niepoprawne działanie skryptów.
+Ponieważ obiekty zawierają skrypty, przeniesienie obiektów do Twojej Szafy może spowodować niepoprawne działanie skryptów.
Przenieść obiekty szafy?
- <usetemplate ignoretext="Przenosząc szafę bez praw kopiowania ze skryptowanych obiektów" name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ <usetemplate ignoretext="Uprzedź przed przeniesieniem zawartości niekopiowalnej z obiektu, która może uszkodzić skrypty obiektu" name="okcancelignore" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="ClickActionNotPayable">
- Uwaga: Opcja &apos;Zapłać Obiektowi&apos; została wybrana, ale żeby ta opcja działała musi być dodany skrypt z funkcją money().
+ Uwaga: Opcja Zapłać Obiektowi została wybrana, ale żeby ta opcja działała musi być dodany skrypt z funkcją money().
<form name="form">
- <ignore name="ignore" text="Wybierając opcję Zapłać Obiektowi dla obiektów bez funkcji money()"/>
+ <ignore name="ignore" text="Opcja Zapłać Obiektowi została aktywowana podczas budowania obiektów bez skryptu z funkcją money()."/>
</form>
</notification>
<notification name="OpenObjectCannotCopy">
W tym obiekcie nie ma elementów które możesz skopiować.
</notification>
<notification name="WebLaunchAccountHistory">
- Przejść na stronę [SECOND_LIFE] żeby zobaczyć historię konta?
- <usetemplate ignoretext="ÅadujÄ…c stronÄ™ historii konta." name="okcancelignore" notext="Anuluj" yestext="Idź na stronÄ™"/>
- </notification>
- <notification name="ClickOpenF1Help">
- Przejść na stronę [SECOND_LIFE]?
- <usetemplate ignoretext="Odwiedzając stronę [SECOND_LIFE]." name="okcancelignore" notext="Anuluj" yestext="Idź"/>
+ Przejść na stronę [http://secondlife.com/account/ Dashboard] żeby zobaczyć historię konta?
+ <usetemplate ignoretext="Uruchom przeglądarkę internetową by zobaczyć historię konta" name="okcancelignore" notext="Anuluj" yestext="Idź na stronę"/>
</notification>
<notification name="ConfirmQuit">
Na pewno chcesz skończyć?
- <usetemplate ignoretext="Wyłączając [APP_NAME]." name="okcancelignore" notext="Kontynuuj" yestext="Wyłącz"/>
+ <usetemplate ignoretext="Na pewno chcesz skończyć?" name="okcancelignore" notext="Nie kończ" yestext="Wyłącz"/>
</notification>
<notification name="HelpReportAbuseEmailLL">
- Używaj tej opcji do zgłaszania nadużyć Warunków Umowy (Terms of Service) i Standardów Społeczeństwa (Community Standards). Zobacz:
-
-http://secondlife.com/corporate/tos.php
-http://secondlife.com/corporate/cs.php
-
-Wszystkie zgłoszone nadużycia Warunków Umowy (Terms of Service) i Standardów Społeczeństwa (Community Standards) są badane i rozwiązywane. Możesz zobaczyć konkluzję zgłoszenia w Raporcie Zgłoszeń pod:
+ Używaj tej opcji do zgłaszania nadużyć [http://secondlife.com/corporate/tos.php Warunków Umowy (Terms of Service)] i [http://secondlife.com/corporate/cs.php Standardów Społeczeństwa (Community Standards)].
-http://secondlife.com/support/incidentreport.php
- </notification>
- <notification name="HelpReportAbuseEmailEO">
- UWAGA: Ten raport zostanie wysłany do właściciela regionu w którym się znajdujesz i nie będzie wysłany do Linden Lab.
-
-W ramach serwisu dla Rezydentów i gości właściciel tego regionu postanowił odbierać i rozwiązywać wszystkie reporty wysłane z tego regionu. Linden Lab nie będzie analizował żadnych reportów zgłoszonych z tego miejsca.
-
-Właściciel regionu będzie rozpatrywał raporty w oparciu o lokalne prawa tego regionu zdefiniowane w umowie majątku. (Możesz zobaczyć umowę wybierając opcję O Posiadłości z menu Świat.)
-
-Rozwiązanie tego raportu odnosi się wyłącznie do tego regionu; konkluzja tego raportu nie będzie miała wpływu na dostęp Rezydentów do innych regionów w [SECOND_LIFE]. Wyłącznie Linden Lab może całkowicie odebrać dostęp do [SECOND_LIFE].
+Wszystkie zgłoszone nadużycia są badane i rozwiązywane.
</notification>
<notification name="HelpReportAbuseSelectCategory">
Wybierz kategorię dla tego raportu o nadużyciu.
@@ -2001,9 +1726,9 @@ Dokładne dane pomogą nam w klasyfikacji i prztwarzaniu raportu.
Jeżeli składasz raport dotyczący naruszenia praw autorskich proszę się upewnić, że robisz to poprawnie:
-(1) Przypadek Nadużycia. Możesz złożyć raport jeżeli sądzisz, że Rezydent narusza system przywilejów [SECOND_LIFE], na przykład używając CopyBot lub podobnych narzędzi robiących kopie, naruszając prawa autorskie. Komisja Nadużyć bada wykrocznia i stosuje akcje dyscyplinarne za zachowania sprzeczne z zasadami Warunków Umowy (Terms of Service) i Standardów Społeczeństwa (Community Standards) [SECOND_LIFE]. Komisja Nadużyć nie zajmuje się i nie odpowiada na żądania usunięcia treści ze środowiska [SECOND_LIFE].
+(1) Przypadek Nadużycia. Możesz złożyć raport jeżeli sądzisz, że Rezydent narusza system przywilejów [SECOND_LIFE], na przykład używając CopyBot lub podobnych narzędzi robiących kopie, naruszając prawa autorskie. Komisja Nadużyć bada wykroczenia i stosuje akcje dyscyplinarne za zachowania sprzeczne z zasadami Warunków Umowy [SECOND_LIFE] [http://secondlife.com/corporate/tos.php Terms of Service] i Standardów Społeczeństwa [http://secondlife.com/corporate/cs.php Community Standards]. Komisja Nadużyć nie zajmuje się i nie odpowiada na żądania usunięcia treści ze środowiska [SECOND_LIFE].
-(2) Przypadek DMCA lub Usuwanie Treści. Aby wystąpić z żądaniem o usunięcie treści ze środowiska [SECOND_LIFE] MUSISZ przedłożyć ważne zawiadomienie o nadużyciu zgodne z naszą polisą DMCA pod http://secondlife.com/corporate/dmca.php.
+(2) Przypadek DMCA lub Usuwanie Treści. Aby wystąpić z żądaniem o usunięcie treści ze środowiska [SECOND_LIFE] MUSISZ przedłożyć ważne zawiadomienie o nadużyciu zgodne z naszą polityką DMCA [http://secondlife.com/corporate/dmca.php DMCA Policy].
Jeżeli chcesz kontynuować dalej zamknij to okno i dokończ wysyłanie raportu. Może być potrzebny wybór kategorii &apos;CopyBot albo Nadużycie Przywilejów&apos;.
@@ -2019,7 +1744,7 @@ Linden Lab
Obecnie masz już dołączony obiekt do tej części Twojego ciała.
Chcesz go zamienić na wybrany obiekt?
<form name="form">
- <ignore name="ignore" save_option="true" text="ZamieniajÄ…c istniejÄ…ce dodatki"/>
+ <ignore name="ignore" save_option="true" text="Obecnie masz już dołączony obiekt do tej części Twojego ciała.Chcesz go zamienić na wybrany obiekt?"/>
<button ignore="Zamień Automatycznie" name="Yes" text="OK"/>
<button ignore="Nie Zamieniaj" name="No" text="Anuluj"/>
</form>
@@ -2029,18 +1754,22 @@ Chcesz go zamienić na wybrany obiekt?
Chcesz wyłączyć Tryb Pracy przed zakończeniem tej tranzakcji?
<form name="form">
- <ignore name="ignore" save_option="true" text="Płacąc osobie lub obiektowi będąc w Trybie Pracy"/>
+ <ignore name="ignore" save_option="true" text="Jesteś w Trybie Pracy co oznacza, że nie dostaniesz żadnych obiektów w zamian za tą opłatę. Chcesz wyłączyć Tryb Pracy przed zakończeniem tej transakcji?"/>
<button ignore="Zawsz wyłączaj Tryb Pracy" name="Yes" text="OK"/>
<button ignore="Nie wyłączaj Trybu Pracy" name="No" text="Anuluj"/>
</form>
</notification>
+ <notification name="ConfirmDeleteProtectedCategory">
+ Ten folder &apos;[FOLDERNAME]&apos; to folder systemowy. Usunięcie foldera systemowego spowoduje niestabilność. Czy na pewno chcesz go skasować?
+ <usetemplate ignoretext="Potwierdź zanim folder systemu zostanie skasowany" name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ </notification>
<notification name="ConfirmEmptyTrash">
- Na pewno chcesz permanentnie usunąć zawartość Śmietnika?
- <usetemplate ignoretext="Usuwając zawartość Śmietnika" name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ Na pewno chcesz permanentnie usunąć zawartość Kosza?
+ <usetemplate ignoretext="Potwierdź przed usunięciem zawartości Kosza" name="okcancelignore" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="ConfirmClearBrowserCache">
Na pewno chcesz wyczyścić bufor przeglądarki?
- <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Tak"/>
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
</notification>
<notification name="ConfirmClearCookies">
Na pewno chcesz wyczyścić ciasteczka?
@@ -2051,39 +1780,18 @@ Chcesz wyłączyć Tryb Pracy przed zakończeniem tej tranzakcji?
<usetemplate name="okcancelbuttons" notext="Anuluj" yestext="Tak"/>
</notification>
<notification name="ConfirmEmptyLostAndFound">
- Na pewno chcesz permanentnie usunąć zawartość Twojego foldera Zgubione i Znalezione?
- <usetemplate ignoretext="UsuwajÄ…c szafÄ™ z Twojego foldera Zgubione i Znalezione" name="okcancelignore" notext="Nie" yestext="Tak"/>
+ Na pewno chcesz permanentnie usunąć zawartość Twojego foldera Zgubione i Odnalezione?
+ <usetemplate ignoretext="Potwierdź przed usunięciem zawartości foldera Zagubione i Odnalezione" name="okcancelignore" notext="Nie" yestext="Tak"/>
</notification>
<notification name="CopySLURL">
- Następujący link SLurl został skopiowany do pamięci podręcznej:
+ Następujący link SLURL został skopiowany do schowka:
[SLURL]
-Zamieść go na stronie Internetowej żeby umożliwić innym łatwy dostęp do tego miejsca, albo wklej go do panela adresu Twojej przeglądarki żeby go wypróbować.
+Zamieść go na stronie internetowej żeby umożliwić innym łatwy dostęp do tego miejsca, albo wklej go do panela adresu Twojej przeglądarki żeby go otworzyć.
<form name="form">
- <ignore name="ignore" text="Kopiując SLurl do pamięci podręcznej"/>
+ <ignore name="ignore" text="SLurl skopiowany do schowka"/>
</form>
</notification>
- <notification name="GraphicsPreferencesHelp">
- Ten panel kontroluje wymiary i rozdzielczość okna oraz jakość grafiki klienta. Panel Ustawienia &gt; Grafika pozwala na wybór jednego z czterech poziomów jakości grafiki: Niska, Średnia, Wysoka i Super. Możesz również dostosować grafikę do własnych potrzeb wybierając opcję Zaawansowane i zmieniając następujące ustawienia:
-
-Shadery: Opcja ta pozwala włączyć i wyłączyć różne rodzaje shaderów pikseli.
-
-Ustawienia Odbić: Określa rodzaje obiektów które mogą odbijać się w wodzie.
-
-Prezentacja Awatarów: Określa opcje mające wpływ na rysowanie awatarów przez klienta.
-
-Głębia Rysowania: Określa od jakiej odległości od pozycji kamery obiekty będą rysowane w tle.
-
-Liczba Cząsteczek: Określa maksymalną liczbę cząsteczek widocznych jednocześnie na ekranie.
-
-Jakość Post-Procesu: Określa rozdzielczość z jaką jest wyświetlana poświata.
-
-Szczegóły Meszu: Określa ilość szczegółów albo liczbę trójkątów używaną przy rysowaniu pewnych obiektów. Większa wartość zwalnia prędkość rysowania ale powoduje, że obiekty wyglądają bardziej szczgółowo.
-
-Ustawienia Światła: Określa jaki rodzaj światła jest używany do rysowania.
-
-Szczegóły Terenu: Określa ilość szczgółów widoczną w teksturach terenu.
- </notification>
<notification name="WLSavePresetAlert">
Chcesz zmienić zapisane ustawienia?
<usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/>
@@ -2102,152 +1810,6 @@ Szczegóły Terenu: Określa ilość szczgółów widoczną w teksturach terenu.
Efekt Post-Procesu już istnieje. Chcesz zapisać nowy na jego miejsce?
<usetemplate name="okcancelbuttons" notext="Nie" yestext="Tak"/>
</notification>
- <notification name="HelpEditSky">
- Ustaw suwaki żeby stworzyć i zapisać zbiór nieb.
- </notification>
- <notification name="HelpEditDayCycle">
- Wybierz których nieb używać w przeciągu dnia.
- </notification>
- <notification name="EnvSettingsHelpButton">
- Te ustawienia zmieniają wygląd środowiska na Twoim komputerze. Twoja karta graficzna musi posiadać opcję shaderów atmosfery aby umożliwić dostęp do wszystkich ustawień.
-
-Ustaw suwak &quot;Pora Dnia&quot; żeby zmienić lokalną porę dnia w kliencie.
-
-Ustaw suwak &quot;Chmury&quot; żeby zmienić ilość chmur widoczną na niebie.
-
-Wybierz kolor w selekcji &quot;Kolor Wody&quot; żeby zmienić kolor wody.
-
-Ustaw suwak &quot;Zamglenie&quot; żeby zmienić gęstość zamglenia pod wodą.
-
-Kliknij &quot;Używaj Czasu Regionu&quot; żeby dostosowywać porę dnia do pory dnia w regionie.
-
-Kliknij &quot;Zaawansowane Niebo&quot; żeby wybrać bardziej szczegółowy edytor ustawień nieba.
-
-Kliknij &quot;Zaawansowana Woda&quot; żeby wybrać bardziej szczegółowy edytor ustawień wody.
- </notification>
- <notification name="HelpDayCycle">
- Edytor Cyklu Dnia pozwala na kontrolę nieba podczas cyklu dnia/nocy w [SECOND_LIFE]. Ten cykl jest używany przez suwak Pora Dnia w podstawowym Edytorze Środowiska.
-
-Edytor Cyklu Dnia ustala klatki odniesienia. Są to punkty (widoczne jako szare plamki na wykresie czasu) które mają przypisane Ustawienia Nieba. W miarę upływu czasu niebo jest animowane używając średnich pomiędzy klatkami odniesienia.
-
-Żółta strzałka powyżej linii czasu odpowiada biżącemu widokowi opartemu na Porze Dnia. Kliknij i przeciągnij strzałkę żeby zobaczyć animację w przeciągu dnia. Możesz dodawać i usuwać klatki odniesienia używająć przycisków Dodaj i Usuń po prawej stronie linii czasu.
-
-Długość Cyklu dyktuje całkowitą długość &quot;dnia&quot;. Wybranie małej wartości (na przykład 2 min) oznacza, że Twoja 24-o godzinna linia czasu będzie animowana w całości w przeciągu dwóch minut czasu rzeczywistego! Po wybraniu odpowiednich ustawień linii czasu i klatek odniesienia użyj przycisków Start i Stop żeby zobaczyć rezultaty. Pamiętaj - zawsze możesz używać żółtej strzałki wskażnika czasu powyżej linii czasu żeby zmieniać animację dynamicznie. Użycie przycisku Używaj Czasu Regionu zsynchronizuje Twoją długość dnia i czas z cyklem Regionu.
-
-Po zdefiniowaniu Cyklu Dnia możesz zapisać i załadować ustawienia używając przycisków Zapisz Test Dnia i Załaduj Test Dnia. Uwaga, obecnie tylko jeden Cykl Dnia jest dozwolony.
- </notification>
- <notification name="HelpBlueHorizon">
- Ustaw suwaki Czerwony/Zielony/Niebieski (RGB) żeby zmienić kolor nieba. Możesz używać suwaka Intensywność (I) żeby zmieniać ustawienia suwaków wszystkich kolorów (RGB) jednocześnie.
- </notification>
- <notification name="HelpHazeHorizon">
- Horyzont Zamglenia jest jednym z ważniejszych parametrów kontrolujących oświetlenie sceny. Jest efektywnym do symulacji wielu ustawień oświetlenia takich jak rozbyski słońca i ciemniejsze ustawienia zamkniętej przesłony.
- </notification>
- <notification name="HelpBlueDensity">
- Gęstość Błękitu ma wpływ na nasycenie koloru nieba i mgły. Jeżeli przesuniesz suwak Intensywności (I) w prawo kolory będą jaśniejsze i żywsze. Jeżeli przesuniesz całkowicie w lewo kolory będą rozmywać się aż do przejścia w biel i czerń. Jeżeli chcesz precyzyjnie kontrolować balans koloru nieba możesz używać suwaków kolorów Czerwony/Zielony/Niebieski (RGB) w celu zmiany nasycenia indywidualnych składników.
- </notification>
- <notification name="HelpHazeDensity">
- Gęstość Zamglenia kontroluje zawartość mętnego, szarego zamglenia w atmosferze. Jest to przydatne do symulacji scen z dużą ilością dymu i zanieczyszczeń.
-Oraz do symulacji mgły i zamgleń.
- </notification>
- <notification name="HelpDensityMult">
- Mnożnik Gęstości wpływa na gęstość atmosfery w całości. Niskie ustawienie sprawia wrażenie lekkiego powietrza, wyższe ustawienia tworzą bardzo ciężki, zamglony efekt.
- </notification>
- <notification name="HelpDistanceMult">
- Mnożnik Dystansu wpływa na postrzeganie dystansu. Wartość zero niweluje wpływ dystansu na wygląd terenu i obiektów.
-Wartości większe od 1 symulują większy dystans tworząc silniejszy efekt atmosferyczny.
- </notification>
- <notification name="HelpMaxAltitude">
- Max Wysokość wpływa na obliczanie światła atmosferycznego.
-O póżniejszych porach dnia ta wartość jest przydatna do regulacji percepcji dystansu zachodącego słońca.
- </notification>
- <notification name="HelpSunlightColor">
- Reguluje kolor i intensywność bezpośredniego światła w scenie.
- </notification>
- <notification name="HelpSunAmbient">
- Reguluje kolor i intensywność rozproszonego światła atmosferycznego w scenie.
- </notification>
- <notification name="HelpSunGlow">
- Suwak Rozmiar kontroluje wielkość słońca.
-Suwak Ostrość kontroluje ostrość słońca na niebie.
- </notification>
- <notification name="HelpSceneGamma">
- Reguluje dystrybucję światła i cienia na ekranie.
- </notification>
- <notification name="HelpStarBrightness">
- Reguluje blask gwiazd na niebie.
- </notification>
- <notification name="HelpTimeOfDay">
- Kontroluje pozycję słońca na niebie.
-Zbliżone do wysokości.
- </notification>
- <notification name="HelpEastAngle">
- Kontroluje pozycję słońca na niebie.
-Zbliżone do azymutu.
- </notification>
- <notification name="HelpCloudColor">
- Kontroluje kolor chmur. Generalnie powinny być białawe, ale hej, pobaw się jeżeli masz ochotę.
- </notification>
- <notification name="HelpCloudDetail">
- Kontroluje szczegółowy obraz nałożony na górę głównego obrazu chmur. X i Y kontrolują jego pozycję. G (Gęstość) kontroluje jak puchate lub postrzępione są chmury.
- </notification>
- <notification name="HelpCloudDensity">
- Suwaki X i Y kontrolujÄ… pozycjÄ™ chmur.
-Suwak G (Gęstość) kontroluje gęstość chmur.
- </notification>
- <notification name="HelpCloudCoverage">
- Kontroluje ilość chmur pokrywających niebo.
- </notification>
- <notification name="HelpCloudScale">
- Kontroluje skalÄ™ obrazu chmur na kopule nieba.
- </notification>
- <notification name="HelpCloudScrollX">
- Kontroluje prędkość przemieszczania chmur wzdłuż osi X.
- </notification>
- <notification name="HelpCloudScrollY">
- Kontroluje prędkość przemieszczania chmur wzdłuż osi Y.
- </notification>
- <notification name="HelpClassicClouds">
- Wybierz tą opcję w celu używania dodatkowo starszej, klasycznej wersji chmur [SECOND_LIFE].
- </notification>
- <notification name="HelpWaterFogColor">
- Kontroluje kolor podwodnej mgły.
- </notification>
- <notification name="HelpWaterFogDensity">
- Kontroluje gęstość mgły i głębie wizji pod wodą.
- </notification>
- <notification name="HelpUnderWaterFogMod">
- Modyfikuje wpływ wykładnika gęstości mgły na głębie wizji awatara pod wodą.
- </notification>
- <notification name="HelpWaterGlow">
- Kontroluje emisję światła z powierzchni wody.
- </notification>
- <notification name="HelpWaterNormalScale">
- Kontroluje skalę trzech zmarszczeń które tworzą wodę.
- </notification>
- <notification name="HelpWaterFresnelScale">
- Kontroluje jak dużo światła jest odbijane pod różnymi kątami.
- </notification>
- <notification name="HelpWaterFresnelOffset">
- Kontroluje jak dużo intensywności światła jest odbijane.
- </notification>
- <notification name="HelpWaterScaleAbove">
- Kontroluje jak dużo światła odbija się od górnej powierzchni wody.
- </notification>
- <notification name="HelpWaterScaleBelow">
- Kontroluje jak dużo światła odbija się od dolnej powierzchni wody.
- </notification>
- <notification name="HelpWaterBlurMultiplier">
- Kontroluje jak fale i odbicia sÄ… mieszane.
- </notification>
- <notification name="HelpWaterNormalMap">
- Kontroluje która mapa normalnych jest używana w wodzie do określania odbić/załamań.
- </notification>
- <notification name="HelpWaterWave1">
- Kontroluje gdzie i jak szybko duża wersja mapy normalnych przemieszcza się wzdłuż osi X i Y.
- </notification>
- <notification name="HelpWaterWave2">
- Kontroluje gdzie i jak szybko mała wersja mapy normalnych przemieszcza się wzdłuż osi X i Y.
- </notification>
<notification name="NewSkyPreset">
Nazwij nowe niebo.
<form name="form">
@@ -2275,7 +1837,7 @@ Suwak G (Gęstość) kontroluje gęstość chmur.
Ustawienie już istnieje!
</notification>
<notification name="WaterNoEditDefault">
- Domyśle ustawienie nie może być zmienione ani usunięte.
+ Domyślne ustawienie nie może być zmienione ani usunięte.
</notification>
<notification name="ChatterBoxSessionStartError">
Błąd podczas rozpoczynania czatu/IM z [RECIPIENT].
@@ -2293,8 +1855,7 @@ Suwak G (Gęstość) kontroluje gęstość chmur.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="Cannot_Purchase_an_Attachment">
- Rzeczy nie mogą być kupione jeżeli
- są częścią załącznika.
+ Rzeczy nie mogą być kupione jeżeli są częścią załącznika.
</notification>
<notification label="Prośba o Zgodę na Pobieranie L$" name="DebitPermissionDetails">
Akceptując tą prośbę wyrażasz zgodę na ciągłe pobieranie Lindenów (L$) z Twojego konta. Żeby cofnąć to pozwolenie właściciel obiektu będzie musiał usunąć ten obiekt albo zresetowć skrypty obieku.
@@ -2302,27 +1863,25 @@ Suwak G (Gęstość) kontroluje gęstość chmur.
</notification>
<notification name="AutoWearNewClothing">
Czy chcesz automatycznie nosić ubranie które tworzysz?
- <usetemplate ignoretext="Automatycznie noÅ› nowe ubranie" name="okcancelignore" notext="Nie" yestext="Tak"/>
+ <usetemplate ignoretext="Załóż ubranie automatycznie będąc w trybie Edycji Wyglądu" name="okcancelignore" notext="Nie" yestext="Tak"/>
</notification>
<notification name="NotAgeVerified">
- Nie masz dostępu do tej posiadłości ze względu na brak weryfikacji Twojego wieku.
-Czy chcesz odwiedzić stronę [SECOND_LIFE] żeby to zmienić?
+ Nie masz dostępu do tej posiadłości ze względu na brak weryfikacji Twojego wieku. Czy chcesz odwiedzić stronę [SECOND_LIFE] żeby to zmienić?
[_URL]
<url name="url" option="0">
https://secondlife.com/account/verification.php
</url>
- <usetemplate ignoretext="Ostrzegaj o braku weryfikacji wieku" name="okcancelignore" notext="Nie" yestext="Tak"/>
+ <usetemplate ignoretext="Brak weryfikacji wieku" name="okcancelignore" notext="Nie" yestext="Tak"/>
</notification>
<notification name="Cannot enter parcel: no payment info on file">
- Nie masz dostępu do tej posiadłości ze względu na brak danych o Twoim koncie.
-Czy chcesz odwiedzić stronę [SECOND_LIFE] żeby to zmienić?
+ Nie masz dostępu do tej posiadłości ze względu na brak danych o Twoim koncie. Czy chcesz odwiedzić stronę [SECOND_LIFE] żeby to zmienić?
[_URL]
<url name="url" option="0">
https://secondlife.com/account/
</url>
- <usetemplate ignoretext="Ostrzegaj o braku danych konta" name="okcancelignore" notext="Nie" yestext="Tak"/>
+ <usetemplate ignoretext="Brak danych o koncie" name="okcancelignore" notext="Nie" yestext="Tak"/>
</notification>
<notification name="MissingString">
Zdanie [STRING_NAME] nie znalezione w strings.xml
@@ -2371,11 +1930,10 @@ Czy chcesz odwiedzić stronę [SECOND_LIFE] żeby to zmienić?
Plik terrain.raw ściągniety.
</notification>
<notification name="GestureMissing">
- Gest [NAME] nie znaleziony w bazie danych.
+ Gesturka [NAME] nie znaleziony w bazie danych.
</notification>
<notification name="UnableToLoadGesture">
Åadowanie gestu [NAME] nie powiodÅ‚o siÄ™.
-Spróbuj jeszcze raz.
</notification>
<notification name="LandmarkMissing">
Miejsce (LM) nie znalezione w bazie danych.
@@ -2444,7 +2002,7 @@ Wybierz jeden obiekt.
Wyłączanie trybu boskiego, poziom [LEVEL]
</notification>
<notification name="CopyFailed">
- Kopiowanie się nie powiodło - nie masz pozwolenia
+ Nie masz praw do skopiowania wybranych obiektów.
</notification>
<notification name="InventoryAccepted">
Podarunek od Ciebie został przyjęty przez [NAME].
@@ -2462,12 +2020,14 @@ Wybierz jeden obiekt.
Twoja wizytówka została odrzucona.
</notification>
<notification name="TeleportToLandmark">
- Jesteś w Głównym Regionie i możesz się stąd teleportować do innych miejsc jak &apos;[NAME]&apos; wybierając Moja Szafa w prawym dolnym rogu ekranu i wybierając folder Miejsca (LM).
-Kliknij dwa razy na miejsce (LM) i wybierz Teleportuj żeby tam się przenieść.
+ Jesteś w Głównym Regionie i możesz się stąd teleportować do innych miejsc jak &apos;[NAME]&apos; wybierając Moja Szafa w prawym dolnym rogu ekranu
+i wybierajÄ…c folder Zapisane Miejsca (LM).
+(Kliknij dwa razy na miejsce (LM) i wybierz &apos;Teleport&apos; żeby tam się przenieść.)
</notification>
<notification name="TeleportToPerson">
- Jesteś w Głównym Regionie i możesz komunikować się z innymi Rezydentami jak &apos;[NAME]&apos; wybierając Moja Szafa w prawym dolnym rogu ekranu i wybierając folder Wizytówki.
-Kliknij dwa razy na wizytówce, wybierz Wyślij IM i napisz wiadomość.
+ Możesz skontaktować się z Rezydentem &apos;[NAME]&apos; poprzez otworzenie panelu Ludzie po prawej stronie ekranu.
+Wybierz Rezydenta z listy, następnie kliknij &apos;IM&apos; na dole panelu.
+(Możesz także kliknąć podwójnie na ich imię na liście, lub prawym przyciskiem i wybrać &apos;IM&apos;).
</notification>
<notification name="CantSelectLandFromMultipleRegions">
Nie możesz przekraczać granic serwera wybierając obszar.
@@ -2490,6 +2050,9 @@ Spróbuj wybrać mniejszy obszar.
<notification name="SystemMessage">
[MESSAGE]
</notification>
+ <notification name="PaymentRecived">
+ [MESSAGE]
+ </notification>
<notification name="EventNotification">
Zawiadomienie o Imprezie:
@@ -2515,7 +2078,19 @@ Spróbuj wybrać mniejszy obszar.
</notification>
<notification name="NoQuickTime">
Wygląda na to, że QuickTime z Apple nie jest zainstalowany na Twoim komputerze.
-Jeżeli chcesz odtwarzać media na tej posiadłości które używają QuickTime idź do http://www.apple.com/quicktime i zainstaluj odtwarzacz.
+Jeżeli chcesz odtwarzać media na tej posiadłości które używają QuickTime idź do [http://www.apple.com/quicktime QuickTime site] i zainstaluj odtwarzacz.
+ </notification>
+ <notification name="NoPlugin">
+ Nie znaleziono wtyczki mediów dla &quot;[MIME_TYPE]&quot; typu mime. Media tego typu będą niedostępne.
+ </notification>
+ <notification name="MediaPluginFailed">
+ Następujące wtyczki mediów nie działają:
+ [PLUGIN]
+
+Zainstaluj proszę wtyczki ponownie lub skontaktuj się z dostawcą jeśli nadal problem będzie występował.
+ <form name="form">
+ <ignore name="ignore" text="Wtyczka mediów nie działa"/>
+ </form>
</notification>
<notification name="OwnedObjectsReturned">
Twoje obiekty z wybranej posiadłości zostały zwrócone do Twojej Szafy.
@@ -2524,7 +2099,7 @@ Jeżeli chcesz odtwarzać media na tej posiadłości które używają QuickTime
Obiekty należące do [FIRST] [LAST] na wybranej posiadłości zostały zwrócone do szafy tej osoby.
</notification>
<notification name="OtherObjectsReturned2">
- Obiekty z wybranej posiadłości należącej do Rezydenta &apos;[NAME]&apos; zostały zwrócone do ich właściciela.
+ Obiekty z posiadłości należącej do Rezydenta&apos;[NAME]&apos; zostały zwrócone do właściciela.
</notification>
<notification name="GroupObjectsReturned">
Obiekty z wybranej posiadłości przypisane do grupy [GROUPNAME] zostały zwrócone do szafy ich właścicieli.
@@ -2534,6 +2109,10 @@ Nieprzekazywalne obiekty przekazane grupie zostały usunięte.
<notification name="UnOwnedObjectsReturned">
Obiekty z wybranej posiadłości które nie należą do Ciebie zostały zwrócone do ich właścicieli.
</notification>
+ <notification name="ServerObjectMessage">
+ Wiadomość od [NAME]:
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
+ </notification>
<notification name="NotSafe">
Ta posiadłość pozwala na uszkodzenia.
Możesz doznać tutaj urazu. Jeżeli zginiesz nastąpi teleportacja do Twojego miejsca startu.
@@ -2543,15 +2122,13 @@ Możesz doznać tutaj urazu. Jeżeli zginiesz nastąpi teleportacja do Twojego m
Nie możesz tutaj latać.
</notification>
<notification name="PushRestricted">
- Popychanie niedozwolone.
-Nie możesz tutaj popychać innych, chyba, że jesteś właścicielem tej posiadłości.
+ Popychanie niedozwolone. Nie możesz tutaj popychać innych, chyba, że jesteś właścicielem tej posiadłości.
</notification>
<notification name="NoVoice">
Ta posiadłość nie pozwala na rozmowy.
</notification>
<notification name="NoBuild">
- Ta posiadłość nie pozwala na budowanie.
-Nie możesz tworzyć tutaj obiektów.
+ Ta posiadłość nie pozwala na budowanie. Nie możesz tworzyć tutaj obiektów.
</notification>
<notification name="ScriptsStopped">
Administrator czasowo zatrzymał skrypty w tym regionie.
@@ -2561,7 +2138,8 @@ Nie możesz tworzyć tutaj obiektów.
</notification>
<notification name="NoOutsideScripts">
Ta posiadłość nie pozwala na zewnętrzne skrypty.
-Żadne skrypty nie będą tutaj działać za wyjątkiem skryptów zleżących do właściciela posiadłości.
+
+Żadne skrypty nie będą tutaj działać za wyjątkiem skryptów należących do właściciela posiadłości.
</notification>
<notification name="ClaimPublicLand">
Tylko publiczne posiadłości w tym regionie mogą być przejęte.
@@ -2577,16 +2155,9 @@ Skorzystaj z [SECOND_LIFE]:Pomoc by uzyskać więcej informacji na temat dostęp
<notification name="NoTeenGridAccess">
Twoje konto nie może zostać połączone z podanym regionem Teen Grid.
</notification>
- <notification name="NoHelpIslandTP">
- Brak możliwości ponownej teleportacji do Help Island.
-Odwiedź &apos;Help Island Public&apos; by powtórzyć szkolenie.
- </notification>
<notification name="ImproperPaymentStatus">
Nie posiadasz odpowiedniego statusu płatniczego by uzyskać dostęp do regionu.
</notification>
- <notification name="MustGetAgeRegion">
- By odwiedzić ten region, Twoje konto musi zostać poddane weryfikacji wieku.
- </notification>
<notification name="MustGetAgeParcel">
By móc przebywać na tej posiadłości wymagana jest weryfikacja Twojego wieku.
</notification>
@@ -2649,31 +2220,35 @@ Spróbuj ponowanie za kilka minut.
Nieważana posiadłość.
</notification>
<notification name="ObjectGiveItem">
- Obiekt [OBJECTFROMNAME] należący do [FIRST] [LAST] dał Ci [OBJECTTYPE] [OBJECTNAME].
+ Obiekt [OBJECTFROMNAME] należący do [NAME_SLURL] dał Ci [OBJECTTYPE]:
+[ITEM_SLURL]
<form name="form">
<button name="Keep" text="Zachowaj"/>
<button name="Discard" text="Wyrzuć"/>
- <button name="Mute" text="Wycisz"/>
+ <button name="Mute" text="Zablokuj"/>
</form>
</notification>
<notification name="ObjectGiveItemUnknownUser">
- Obiekt [OBJECTFROMNAME] należący do (właściciel nieznany) dał Ci [OBJECTTYPE] [OBJECTNAME].
+ Obiekt [OBJECTFROMNAME] należący (właściciel nieznany) dał Ci [OBJECTTYPE]:
+[ITEM_SLURL]
<form name="form">
<button name="Keep" text="Zachowaj"/>
<button name="Discard" text="Wyrzuć"/>
- <button name="Mute" text="Wycisz"/>
+ <button name="Mute" text="Zablokuj"/>
</form>
</notification>
<notification name="UserGiveItem">
- [NAME] dał Ci [OBJECTTYPE] &apos;[OBJECTNAME]&apos;.
+ [NAME_SLURL] dał Ci [OBJECTTYPE]:
+[ITEM_SLURL]
<form name="form">
- <button name="Keep" text="Zachowaj"/>
+ <button name="Show" text="Pokaż"/>
<button name="Discard" text="Wyrzuć"/>
- <button name="Mute" text="Wycisz"/>
+ <button name="Mute" text="Zablokuj"/>
</form>
</notification>
<notification name="GodMessage">
[NAME]
+
[MESSAGE]
</notification>
<notification name="JoinGroup">
@@ -2685,7 +2260,7 @@ Spróbuj ponowanie za kilka minut.
</form>
</notification>
<notification name="TeleportOffered">
- [NAME] proponuje Ci teleportacjÄ™ do siebie:
+ [NAME] proponuje Ci teleportcjÄ™ do siebie:
[MESSAGE]
<form name="form">
@@ -2693,6 +2268,9 @@ Spróbuj ponowanie za kilka minut.
<button name="Cancel" text="Anuluj"/>
</form>
</notification>
+ <notification name="TeleportOfferSent">
+ Oferta teleportacji wysłana do [TO_NAME]
+ </notification>
<notification name="GotoURL">
[MESSAGE]
[URL]
@@ -2712,6 +2290,9 @@ Spróbuj ponowanie za kilka minut.
<button name="Decline" text="Odmów"/>
</form>
</notification>
+ <notification name="FriendshipOffered">
+ Oferta znajomości dla [TO_NAME]
+ </notification>
<notification name="OfferFriendshipNoMessage">
[NAME] proponuje Ci znajomość.
@@ -2727,9 +2308,15 @@ Spróbuj ponowanie za kilka minut.
<notification name="FriendshipDeclined">
Twoja propozycja znajomości została odrzucona przez [NAME].
</notification>
+ <notification name="FriendshipAcceptedByMe">
+ Propozycja znajomości została zaakceptowana.
+ </notification>
+ <notification name="FriendshipDeclinedByMe">
+ Propozycja znajomości została odrzucona.
+ </notification>
<notification name="OfferCallingCard">
- [FIRST] [LAST] daje Ci swoją wizytówkę.
-Wizytówka w Twojej Szafie może być używana do komunikowania się (IM) z tym Rezydentem.
+ [FIRST] [LAST] daje Tobie swoją wizytówkę.
+Wizytówka będzie znajdowała się w Szafie i umożliwi szybkie wysłanie IM do tego Rezydenta.
<form name="form">
<button name="Accept" text="Zaakceptuj"/>
<button name="Decline" text="Odmów"/>
@@ -2740,7 +2327,7 @@ Wizytówka w Twojej Szafie może być używana do komunikowania się (IM) z tym
Nastąpi wylogowanie jeżeli zostaniesz w tym regionie.
</notification>
<notification name="RegionRestartSeconds">
- Restart regionu za [MINUTES] sek.
+ Restart regionu za [SECONDS] sec.
Nastąpi wylogowanie jeżeli zostaniesz w tym regionie.
</notification>
<notification name="LoadWebPage">
@@ -2761,7 +2348,7 @@ Obiekt: [OBJECTNAME], właściciel: [NAME]?
[TYPE] [DESC] - nie znaleziono w bazie danych.
</notification>
<notification name="InvalidWearable">
- Obiekt, który chcesz założyć używa narzędzia nieobecnego w wersji klienta, którą używasz. By go założyć ściągnij najnowszą wersję klienta [APP_NAME].
+ Obiekt, który chcesz założyć używa narzędzia nieobecnego w wersji klienta, którą używasz. By go założyć ściągnij najnowszą wersję [APP_NAME].
</notification>
<notification name="ScriptQuestion">
&apos;[OBJECTNAME]&apos;, właściciel: &apos;[NAME]&apos;, chciał by:
@@ -2771,14 +2358,14 @@ Zgadzasz siÄ™?
<form name="form">
<button name="Yes" text="Tak"/>
<button name="No" text="Nie"/>
- <button name="Mute" text="Wycisz"/>
+ <button name="Mute" text="Zablokuj"/>
</form>
</notification>
<notification name="ScriptQuestionCaution">
- &apos;[OBJECTNAME]&apos;, właściciel: &apos;[NAME]&apos;, chciał by:
+ Obiekt &apos;[OBJECTNAME]&apos;, należący do &apos;[NAME]&apos; proponuje Ci:
[QUESTIONS]
-Jeżeli nie ufasz temu obiektowi lub jego twórcy - odmów. Wybierz Szczegóły żeby otrzymać więcej informacji.
+Jeżeli nie znasz tego obiektu lub kreatora, odmów.
Zgadzasz siÄ™?
<form name="form">
@@ -2801,39 +2388,12 @@ Zgadzasz siÄ™?
<button name="Ignore" text="Zignoruj"/>
</form>
</notification>
- <notification name="FirstBalanceIncrease">
- Przekazano Ci [AMOUNT]L$.
-Obiekty i inni użytkownicy mogą Ci dawać L$.
-Twój balans jest wyświetlony w prawym górnym rogu ekranu.
- </notification>
- <notification name="FirstBalanceDecrease">
- Pobrano od Ciebie [AMOUNT]L$.
-Twój balans jest wyświetlony w prawym górnym rogu ekranu.
- </notification>
- <notification name="FirstSit">
- Siedzisz.
-Używaj strzałek (albo AWSD) żeby zmieniać widok.
-Naciśnij przycisk Wstań żeby sie podnieść.
- </notification>
- <notification name="FirstMap">
- Kliknij i przeciągnij by przsuwać mapę.
-Kliknij dwa razy żeby się teleportować.
-Używaj narzędzi po prawej stronie żeby znajdować i wyświetlać różne obiekty.
- </notification>
- <notification name="FirstBuild">
- Możesz budować nowe obiekty w niektórych miejscach.
-Używaj narzędzi w lewym górnym rogu żeby budować, przyciskaj Ctrl lub Alt żeby szybko zmieniać narzędzia.
-Naciśnij Esc żeby skończyć budować.
- </notification>
- <notification name="FirstLeftClickNoHit">
- Lewy klik żeby używać specjalnych obiektów.
-Jeżeli strzałka zmieni się na rączkę możesz używać tego obiektu.
-Prawy klik zawsze pokazuje menu dostępnych operacji.
- </notification>
- <notification name="FirstTeleport">
- Nastąpiła teleportacja.
-Jesteś przy Infohub najbliższej Twojego celu.
-Twój cel jest zaznaczony wysokim czerwonym wskaźnikiem.
+ <notification name="BuyLindenDollarSuccess">
+ Dziękujemy za wpłatę!
+
+Twój stan konta L$ zostanie zaktualizowany w momencie zakończenia transakcji. Jeżeli w ciągu 20 minut, Twój balans konta nie ulegnie zmianie, transakcja została anulowana. W tym przypadku, pobrana kwota zostanie zwrócona na stan konta w US$.
+
+Status transkacji możesz sprawdzić odwiedzając Historię Transakcji swojego konta na [http://secondlife.com/account/ Dashboard]
</notification>
<notification name="FirstOverrideKeys">
Twoje sterujące klawisze zostały przejęte przez obiekt.
@@ -2841,41 +2401,10 @@ Użyj strzałek lub AWSD żeby sprawdzić ich działanie.
Niektóre obiekty (np broń) wymagają trybu panoramicznego.
Nacisnij &apos;M&apos; żeby go wybrać.
</notification>
- <notification name="FirstAppearance">
- Edytujesz swój wygląd.
-Używaj strzałek do obracania i zbliżenia.
-Po skończeniu wybierz &apos;Zapisz Zmiany&apos;
-żeby zapisać Twój wygląd i wyjść.
-Możesz edytować wygląd jak często chcesz.
- </notification>
- <notification name="FirstInventory">
- To jest Twoja Szafa, który zawiera obikty, notki, ubrania i inne Twoje rzeczy.
-* Żeby założyć obiekt lub strój (folder) przeciągnij go na siebie.
-* Żeby przenieść obiekt do świata przeciągnij go na grunt.
-* Żeby przeczytać notkę kliknij na niej dwa razy.
- </notification>
<notification name="FirstSandbox">
Ten region to piaskownica.
-Obiekty które tu zbudujesz mogą zostać usunięte jak opuścisz ten obszar - piaskownice są regularnie czyszczone, sprawdź informacje na górze ekranu obok nazwy regionu.
-Piaskownice spotyka siÄ™ rzadko i sÄ… zawsze oznakowane.
- </notification>
- <notification name="FirstFlexible">
- To jest elastyczny obiekt.
-Obiekty elastyczne nie mogą być fizyczne i muszą być typu fantom.
- </notification>
- <notification name="FirstDebugMenus">
- Zaawansowane menu zostało włączone.
-To menu zawiera funkcje użyteczne dla programistów analizujących [SECOND_LIFE].
-To menu jest aktywowane dzięki kombinacji klawiszy Ctrl+Alt+D (Windows) lub &#8997;&#8984;D (Mac).
- </notification>
- <notification name="FirstSculptedPrim">
- Edytujesz sculpt.
-Skulpty wymagają specjalnych tekstur które definiują ich kształt.
-Przykłady tekstur znajdują się w bibliotece szafy.
- </notification>
- <notification name="FirstMedia">
- Odtwarzasz media. Możesz wybrać automatyczne odtwarzanie w Ustawieniach pod Audio i Video. Odtwarzanie mediów w miejscach którym nie ufasz może być niebezpieczne.
+Obiekty które tu zbudujesz mogą zostać usunięte jak opuścisz ten obszar - piaskownice są regularnie czyszczone, sprawdź informacje na górze ekranu obok nazwy regionu.
</notification>
<notification name="MaxListSelectMessage">
Maksymalnie możesz wybrać [MAX_SELECT] rzeczy
@@ -2884,50 +2413,47 @@ z tej listy.
<notification name="VoiceInviteP2P">
[NAME] zaprasza Cię do rozmowy głosem.
Wybierz Zaakceptuj żeby rozmawiać albo Odmów żeby nie przyjąć zaproszenia.
-Wybierz Wycisz żeby wyciszyć dzwoniącą osobę.
+Wybierz Zablokuj żeby wyciszyć dzwoniącą osób
<form name="form">
<button name="Accept" text="Zaakceptuj"/>
<button name="Decline" text="Odmów"/>
- <button name="Mute" text="Wycisz"/>
+ <button name="Mute" text="Zablokuj"/>
</form>
</notification>
<notification name="AutoUnmuteByIM">
- Wiadomość (IM) została wysłana do [FIRST] [LAST] i wyciszenie zostało automatycznie usunięte.
+ Wiadomość (IM) została wysłana do [FIRST] [LAST] i blokada została automatycznie usunięta.
</notification>
<notification name="AutoUnmuteByMoney">
- Pieniądze zostały przekazane do [FIRST] [LAST] i wyciszenie zostało automatycznie usunięte.
+ Pieniądze zostały przekazane do [FIRST] [LAST] i blokada została automatycznie usunięta.
</notification>
<notification name="AutoUnmuteByInventory">
- Oferta z szafy dla [FIRST] [LAST] automatycznie usunęła wyciszenie.
+ Oferta z szafy dla [FIRST] [LAST] i blokada została automatycznie usunięta.
</notification>
<notification name="VoiceInviteGroup">
[NAME] zaczyna rozmowÄ™ z grupÄ… [GROUP].
-Wybierz Zaakceptuj żeby rozmawiać albo Odmów żeby nie przyjąć zaproszenia.
-Wybierz Wycisz żeby wyciszyć dzwoniącą osobę.
+Wybierz Zaakceptuj żeby rozmawiać albo Odmów żeby nie przyjąć zaproszenia. Wybierz Zablokuj żeby wyciszyć dzwoniącą osobę.
<form name="form">
<button name="Accept" text="Zaakceptuj"/>
<button name="Decline" text="Odmów"/>
- <button name="Mute" text="Wycisz"/>
+ <button name="Mute" text="Zablokuj"/>
</form>
</notification>
<notification name="VoiceInviteAdHoc">
[NAME] zaczyna konferencję głosem.
-Wybierz Zaakceptuj żeby rozmawiać albo Odmów żeby nie przyjąć zaproszenia.
-Wybierz Wycisz żeby wyciszyć dzwoniącą osobę.
+Wybierz Zaakceptuj żeby rozmawiać albo Odmów żeby nie przyjąć zaproszenia. Wybierz Zablokuj żeby wyciszyć dzwoniącą osobę.
<form name="form">
<button name="Accept" text="Zaakceptuj"/>
<button name="Decline" text="Odmów"/>
- <button name="Mute" text="Wycisz"/>
+ <button name="Mute" text="Zablokuj"/>
</form>
</notification>
<notification name="InviteAdHoc">
[NAME] zaprasza CiÄ™ do konferencji poprzez Czat/IM.
-Wybierz Zaakceptuj żeby zacząć czat albo Odmów żeby nie przyjąć zaproszenia.
-Wybierz Wycisz żeby wyciszyć tą osobę.
+Wybierz Zaakceptuj żeby zacząć czat albo Odmów żeby nie przyjąć zaproszenia. Wybierz Zablokuj żeby wyciszyć tą osobę.
<form name="form">
<button name="Accept" text="Zaakceptuj"/>
<button name="Decline" text="Odmów"/>
- <button name="Mute" text="Wycisz"/>
+ <button name="Mute" text="Block"/>
</form>
</notification>
<notification name="VoiceChannelFull">
@@ -2970,10 +2496,54 @@ Wybierz Wycisz żeby wyciszyć tą osobę.
Błąd podczas łączenia z rozmową [VOICE_CHANNEL_NAME]. Spróbuj póżniej.
</notification>
<notification name="ServerVersionChanged">
- Ten region używa innej wersji symulatora. Kliknij na tą wiadomość żeby uzyskać więcej informacji.
+ Ten region używa innej wersji symulatora. Kliknij na tą wiadomość żeby uzyskać więcej informacji: [[URL] View the release notes.]
+ </notification>
+ <notification name="UnsupportedCommandSLURL">
+ Nie można otworzyć wybranego SLurl.
</notification>
- <notification name="UnableToOpenCommandURL">
- Wybrany link nie daje się otworzyć z tej przeglądarki.
+ <notification name="BlockedSLURL">
+ SLurl został otrzymany z niesprawdzonej przeglądarki i został zablokowany dla bezpieczeństwa.
+ </notification>
+ <notification name="ThrottledSLURL">
+ Wiele SLurlów zostało otrzymanych w krótkim czasie od niesprawdzonej przeglądarki.
+Zostaną zablokowane na kilka sekund dla bezpieczeństwa.
+ </notification>
+ <notification name="IMToast">
+ [MESSAGE]
+ <form name="form">
+ <button name="respondbutton" text="Odpowiedź"/>
+ </form>
+ </notification>
+ <notification name="ConfirmCloseAll">
+ Czy chcesz zamknąć wszystkie wiadomości IM?
+ <usetemplate ignoretext="Potwierdź, przed zamknięciem wszystkich wiadomości prywatnych (IM)." name="okcancelignore" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="AttachmentSaved">
+ Załącznik został zapisany.
+ </notification>
+ <notification name="UnableToFindHelpTopic">
+ Nie można znależć tematu pomocy dla tego elementu.
+ </notification>
+ <notification name="ObjectMediaFailure">
+ Błąd serwera: aktualizacja mediów nie powiodła się.
+&apos;[ERROR]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TextChatIsMutedByModerator">
+ Twój czat został wyciszony przez moderatora.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="VoiceIsMutedByModerator">
+ Twoja rozmowa głosowa została wyciszona przez moderatora.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearTeleportHistory">
+ Czy na pewno chcesz usunąć historię teleportacji?
+ <usetemplate name="okcancelbuttons" notext="Anuluj" yestext="OK"/>
+ </notification>
+ <notification name="BottomTrayButtonCanNotBeShown">
+ Wybrany przycisk nie może zostać wyświetlony w tej chwili.
+Przycisk zostanie wyświetlony w przypadku dostatecznej ilości przestrzeni.
</notification>
<global name="UnsupportedCPU">
- Prędkość Twojego CPU nie spełnia minimalnych wymagań.
@@ -2981,7 +2551,7 @@ Wybierz Wycisz żeby wyciszyć tą osobę.
<global name="UnsupportedGLRequirements">
Wygląda na to, że Twój system nie spełnia wymagań sprzętowych [APP_NAME]. [APP_NAME] wymaga karty graficznej kompatybilnej z OpenGL z multiteksturami. Jeżeli masz taką kartę zainstaluj najnowsze sterowniki do niej i uaktualnienia systemu operacyjnego.
-Jeżeli wciąż masz problemy sprawdź: http://www.secondlife.com/support
+Jeżeli wciąż masz problemy sprawdź: [SUPPORT_SITE].
</global>
<global name="UnsupportedCPUAmount">
796
@@ -2995,10 +2565,8 @@ Jeżeli wciąż masz problemy sprawdź: http://www.secondlife.com/support
<global name="UnsupportedRAM">
- Pamięć Twojego systemu nie spełnia minimalnych wymagań.
</global>
- <global name="PermYes">
- Tak
- </global>
- <global name="PermNo">
- Nie
+ <global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
+ Jeśli jesteś właścicielem posiadłości, możesz ustawić na niej miejsce startu.
+W innym przypadku możesz poszukać na mapie miejsca oznaczone jako &quot;Infohub&quot;.
</global>
</notifications>
diff --git a/indra/newview/skins/default/xui/pl/panel_active_object_row.xml b/indra/newview/skins/default/xui/pl/panel_active_object_row.xml
new file mode 100644
index 0000000000..57dc8a3dd7
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_active_object_row.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_activeim_row">
+ <string name="unknown_obj">
+ Nieznany Obiekt
+ </string>
+ <text name="object_name">
+ Nienazwany Obiekt
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/pl/panel_adhoc_control_panel.xml
new file mode 100644
index 0000000000..6cd47c6ce7
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_adhoc_control_panel.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="vertical_stack">
+ <layout_panel name="call_btn_panel">
+ <button label="Dzwoń" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Zakończ Rozmowe" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Przełączniki Głosu" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_audio_device.xml b/indra/newview/skins/default/xui/pl/panel_audio_device.xml
index fc3b3776f0..fa8dde77eb 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_audio_device.xml
+++ b/indra/newview/skins/default/xui/pl/panel_audio_device.xml
@@ -13,7 +13,7 @@
Poziom Wejścia
</text>
<text_editor name="voice_intro_text1">
- Użyj suwaka by dostosować jak głośno Cię słychać dla innych Rezydentów. By przetestować poziom wejścia, zacznij mówić do mikrofonu.
+ Użyj suwaka by dostosować jak głośno Cię słychać dla innych Rezydentów. W celu przetestowania poziomu wejścia, zacznij mówić do mikrofonu.
</text_editor>
<volume_slider name="mic_volume_slider"
tool_tip="By zmienić poziom głośności użyj suwaka" />
diff --git a/indra/newview/skins/default/xui/pl/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/pl/panel_avatar_list_item.xml
new file mode 100644
index 0000000000..917610d3e9
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_avatar_list_item.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="avatar_list_item">
+ <string name="FormatSeconds">
+ [COUNT]s
+ </string>
+ <string name="FormatMinutes">
+ [COUNT]m
+ </string>
+ <string name="FormatHours">
+ [COUNT]h
+ </string>
+ <string name="FormatDays">
+ [COUNT]d
+ </string>
+ <string name="FormatWeeks">
+ [COUNT]tyg
+ </string>
+ <string name="FormatMonths">
+ [COUNT]mc
+ </string>
+ <string name="FormatYears">
+ [COUNT]lat
+ </string>
+ <text name="avatar_name" value="Nieznane"/>
+ <button name="profile_btn" tool_tip="Zobacz profil"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/pl/panel_block_list_sidetray.xml
index d7fcb8c966..122d834bdd 100644
--- a/indra/newview/skins/default/xui/pl/panel_block_list_sidetray.xml
+++ b/indra/newview/skins/default/xui/pl/panel_block_list_sidetray.xml
@@ -3,8 +3,8 @@
<text name="title_text">
Lista Blokad
</text>
- <scroll_list name="blocked" tool_tip="Lista zablokowanych obecnie rezydentów"/>
- <button label="Zablokuj Rezydenta..." label_selected="Zablokuj Rezydenta..." name="Block resident..." tool_tip="Wybierz rezydenta, którego chcesz zablokować"/>
+ <scroll_list name="blocked" tool_tip="Lista Zablokowanych Osób"/>
+ <button label="Zablokuj Rezydenta..." label_selected="Zablokuj Rezydenta..." name="Block resident..." tool_tip="Wybierz Rezydenta aby zablokować"/>
<button label="Zablokuj obiekt według nazwy..." label_selected="Zablokuj obiekt według nazwy..." name="Block object by name..."/>
- <button label="Odblokuj" label_selected="Odblokuj" name="Unblock" tool_tip="Usuń rezydenta lub obiekt z listy blokad"/>
+ <button label="Odblokuj" label_selected="Odblokuj" name="Unblock" tool_tip="Usuń Rezydenta lub Obiekt z Listy Zablokowanych"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_bottomtray.xml b/indra/newview/skins/default/xui/pl/panel_bottomtray.xml
new file mode 100644
index 0000000000..e21d8a077d
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_bottomtray.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray">
+ <string name="SpeakBtnToolTip">
+ Włącza/Wyłącza mikrofon
+ </string>
+ <string name="VoiceControlBtnToolTip">
+ Pokazuje/Ukrywa panel kontroli głosu
+ </string>
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="speak_panel">
+ <talk_button name="talk">
+ <speak_button label="Mów" label_selected="Mów" name="speak_btn"/>
+ </talk_button>
+ </layout_panel>
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="Gestury" name="Gesture" tool_tip="Pokazuje/Ukrywa gestury"/>
+ </layout_panel>
+ <layout_panel name="movement_panel">
+ <button label="Ruch" name="movement_btn" tool_tip="Pokaż/Ukryj Ustawienia Ruchu"/>
+ </layout_panel>
+ <layout_panel name="cam_panel">
+ <button label="Widok" name="camera_btn" tool_tip="Pokaż/Ukryj Ustawienia Kamery"/>
+ </layout_panel>
+ <layout_panel name="snapshot_panel">
+ <button label="" name="snapshots" tool_tip="Zrób Zdjęcie"/>
+ </layout_panel>
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Rozmowy"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="Ogłoszenia"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/pl/panel_bottomtray_lite.xml
new file mode 100644
index 0000000000..77d2e86b7e
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_bottomtray_lite.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray_lite">
+ <layout_stack name="toolbar_stack_lite">
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="Gest" name="Gest" tool_tip="Pokaż/ukryj gestury"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_classified_info.xml b/indra/newview/skins/default/xui/pl/panel_classified_info.xml
new file mode 100644
index 0000000000..0b275d6dcf
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_classified_info.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_classified_info">
+ <panel.string name="l$_price">
+ L$[PRICE]
+ </panel.string>
+ <panel.string name="click_through_text_fmt">
+ [TELEPORT] teleport, [MAP] map, [PROFILE] profile
+ </panel.string>
+ <panel.string name="date_fmt">
+ [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
+ </panel.string>
+ <panel.string name="auto_renew_on">
+ Aktywne
+ </panel.string>
+ <panel.string name="auto_renew_off">
+ Wyłączone
+ </panel.string>
+ <text name="title" value="Reklama"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text_editor name="classified_name" value="[name]"/>
+ <text name="classified_location_label" value="Miejsce:"/>
+ <text_editor name="classified_location" value="[loading...]"/>
+ <text name="content_type_label" value="Rodzaj Zawartości:"/>
+ <text_editor name="content_type" value="[content type]"/>
+ <text name="category_label" value="Kategoria:"/>
+ <text_editor name="category" value="[category]"/>
+ <text name="creation_date_label" value="Data stworzenia:"/>
+ <text_editor name="creation_date" tool_tip="Data stworzenia" value="[date]"/>
+ <text name="price_for_listing_label" value="Cena za wyświetlenie:"/>
+ <text_editor name="price_for_listing" tool_tip="Cena za umieszczenie reklamy." value="[price]"/>
+ <layout_stack name="descr_stack">
+ <layout_panel name="clickthrough_layout_panel">
+ <text name="click_through_label" value="Kliknięcia:"/>
+ <text_editor name="click_through_text" tool_tip="Kliknij według daty" value="[clicks]"/>
+ </layout_panel>
+ <layout_panel name="price_layout_panel">
+ <text name="auto_renew_label" value="Automatyczne przedłużenie:"/>
+ <text name="auto_renew" value="Aktywne"/>
+ </layout_panel>
+ <layout_panel name="descr_layout_panel">
+ <text name="classified_desc_label" value="Opis:"/>
+ <text_editor name="classified_desc" value="[description]"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <button label="Teleportuj" name="teleport_btn"/>
+ <button label="Mapa" name="show_on_map_btn"/>
+ <button label="Edytuj" name="edit_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_alpha.xml b/indra/newview/skins/default/xui/pl/panel_edit_alpha.xml
new file mode 100644
index 0000000000..ac2739633e
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_edit_alpha.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_alpha_panel">
+ <panel name="avatar_alpha_color_panel">
+ <texture_picker label="Alpha Dolnej Części Ciała" name="Lower Alpha" tool_tip="Kliknij aby wybrać teksturę"/>
+ <texture_picker label="Alpha Górnej Części Ciała" name="Upper Alpha" tool_tip="Kliknij aby wybrać teksturę"/>
+ <texture_picker label="Alpha Głowy" name="Head Alpha" tool_tip="Kliknij aby wybrać teksturę"/>
+ <texture_picker label="Alpha Oka" name="Eye Alpha" tool_tip="Kliknij aby wybrać teksturę"/>
+ <texture_picker label="Alpha Włosów" name="Hair Alpha" tool_tip="Kliknij aby wybrać teksturę"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_classified.xml b/indra/newview/skins/default/xui/pl/panel_edit_classified.xml
new file mode 100644
index 0000000000..6395d5c59a
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_edit_classified.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Edytuj ReklamÄ™" name="panel_edit_classified">
+ <panel.string name="location_notice">
+ (zostanie zaktualizowane po zapisaniu)
+ </panel.string>
+ <string name="publish_label">
+ Publikuj
+ </string>
+ <string name="save_label">
+ Zapisz
+ </string>
+ <text name="title">
+ Edytuj ReklamÄ™
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="snapshot_panel">
+ <icon label="" name="edit_icon" tool_tip="Kliknij by wybrać teksturę"/>
+ </panel>
+ <text name="Name:">
+ Tytuł:
+ </text>
+ <text name="description_label">
+ Opis:
+ </text>
+ <text name="location_label">
+ Lokalizacja:
+ </text>
+ <text name="classified_location">
+ ładowanie...
+ </text>
+ <button label="Ustaw na bieżącą lokalizację" name="set_to_curr_location_btn"/>
+ <text name="category_label" value="Kategoria:"/>
+ <text name="content_type_label" value="Typ Zawartości:"/>
+ <icons_combo_box label="Treść Ogólna" name="content_type">
+ <icons_combo_box.item label="Moderuj Treść" name="mature_ci" value="Mature"/>
+ <icons_combo_box.item label="Treść Ogólna" name="pg_ci" value="PG"/>
+ </icons_combo_box>
+ <text name="price_for_listing_label" value="Cena za wyświetlenie:"/>
+ <spinner label="L$" name="price_for_listing" tool_tip="Cena za umieszczenie reklamy." value="50"/>
+ <check_box label="Ponawiaj automatycznie co tydzień." name="auto_renew"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button label="[LABEL]" name="save_changes_btn"/>
+ <button label="Anuluj" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_eyes.xml b/indra/newview/skins/default/xui/pl/panel_edit_eyes.xml
new file mode 100644
index 0000000000..5e7a3a8fa0
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_edit_eyes.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_eyes_panel">
+ <panel name="avatar_eye_color_panel">
+ <texture_picker label="Iris" name="Iris" tool_tip="Kliknij aby wybrać teksturę"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="eyes_main_tab" title="Oczy"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_gloves.xml b/indra/newview/skins/default/xui/pl/panel_edit_gloves.xml
new file mode 100644
index 0000000000..8b16506d9c
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_edit_gloves.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_gloves_panel">
+ <panel name="avatar_gloves_color_panel">
+ <texture_picker label="Materiał" name="Fabric" tool_tip="Kliknij aby wybrać teksturę"/>
+ <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać teksturę"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="gloves_main_tab" title="Rękawiczki"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_hair.xml b/indra/newview/skins/default/xui/pl/panel_edit_hair.xml
new file mode 100644
index 0000000000..567ff10506
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_edit_hair.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_hair_panel">
+ <panel name="avatar_hair_color_panel">
+ <texture_picker label="Tekstura" name="Texture" tool_tip="Kliknij aby wybrać teksturę"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="hair_color_tab" title="Kolor"/>
+ <accordion_tab name="hair_style_tab" title="Styl"/>
+ <accordion_tab name="hair_eyebrows_tab" title="Brwi"/>
+ <accordion_tab name="hair_facial_tab" title="Twarzy"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_jacket.xml b/indra/newview/skins/default/xui/pl/panel_edit_jacket.xml
new file mode 100644
index 0000000000..f4ea9303aa
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_edit_jacket.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_jacket_panel">
+ <panel name="avatar_jacket_color_panel">
+ <texture_picker label="Górny materiał" name="Upper Fabric" tool_tip="Kliknij aby wybrać teksturę"/>
+ <texture_picker label="Dolny materiał" name="Lower Fabric" tool_tip="Kliknij aby wybrać teksturę"/>
+ <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="jacket_main_tab" title="Kurtka"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_pants.xml b/indra/newview/skins/default/xui/pl/panel_edit_pants.xml
new file mode 100644
index 0000000000..247d63c5a3
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_edit_pants.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_pants_panel">
+ <panel name="avatar_pants_color_panel">
+ <texture_picker label="Materiał" name="Fabric" tool_tip="Kliknij aby wybrać teksturę"/>
+ <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="pants_main_tab" title="Spodnie"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_pick.xml b/indra/newview/skins/default/xui/pl/panel_edit_pick.xml
new file mode 100644
index 0000000000..22fb00671d
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_edit_pick.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Edytuj Ulubione" name="panel_edit_pick">
+ <panel.string name="location_notice">
+ (aktualizacja nastÄ…pi po zapisaniu)
+ </panel.string>
+ <text name="title">
+ Edytuj Ulubione
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <icon label="" name="edit_icon" tool_tip="Kliknij aby wybrać teksturę"/>
+ <text name="Name:">
+ Tytuł:
+ </text>
+ <text name="description_label">
+ Opis:
+ </text>
+ <text name="location_label">
+ Lokalizacja:
+ </text>
+ <text name="pick_location">
+ ładowanie...
+ </text>
+ <button label="Ustaw na bieżąca lokalizację" name="set_to_curr_location_btn"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button label="Zapisz obrazek" name="save_changes_btn"/>
+ <button label="Anuluj" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_profile.xml b/indra/newview/skins/default/xui/pl/panel_edit_profile.xml
index 97fa3118f8..edd7415751 100644
--- a/indra/newview/skins/default/xui/pl/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/pl/panel_edit_profile.xml
@@ -1,45 +1,51 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="edit_profile_panel">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="AcctTypeResident"
- value="Rezydent" />
- <string name="AcctTypeTrial"
- value="Próbne" />
- <string name="AcctTypeCharterMember"
- value="Członek-zalożyciel" />
- <string name="AcctTypeEmployee"
- value="Pracownik Linden Lab" />
- <string name="PaymentInfoUsed"
- value="Dane Konta Używane" />
- <string name="PaymentInfoOnFile"
- value="Dane Konta Dostępne" />
- <string name="NoPaymentInfoOnFile"
- value="Brak Danych Konta" />
- <string name="AgeVerified"
- value="Wiek Zweryfikowany" />
- <string name="NotAgeVerified"
- value="Brak Weryfikacji Wieku" />
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=pl
- </string>
- <panel name="scroll_content_panel">
- <panel name="data_panel" >
- <panel name="lifes_images_panel">
- <panel name="second_life_image_panel">
- <text name="second_life_photo_title_text">
- [SECOND_LIFE]:
- </text>
- </panel>
- </panel>
- <text name="title_partner_text" value="Partner:"/>
- <panel name="partner_data_panel">
- <text name="partner_text" value="[FIRST] [LAST]"/>
- </panel>
- <text name="text_box3">
- Pracuś Mówi:
- </text>
- </panel>
- </panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Edycja profilu" name="edit_profile_panel">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <string name="AcctTypeResident" value="Rezydent"/>
+ <string name="AcctTypeTrial" value="Próbne"/>
+ <string name="AcctTypeCharterMember" value="Członek-zalożyciel"/>
+ <string name="AcctTypeEmployee" value="Pracownik Linden Lab"/>
+ <string name="PaymentInfoUsed" value="Dane konta używane"/>
+ <string name="PaymentInfoOnFile" value="Dane konta dostępne"/>
+ <string name="NoPaymentInfoOnFile" value="Brak danych konta"/>
+ <string name="AgeVerified" value="Wiek zweryfikowany"/>
+ <string name="NotAgeVerified" value="Brak weryfikacji wieku"/>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=pl
+ </string>
+ <string name="no_partner_text" value="Żadne"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="data_panel">
+ <panel name="lifes_images_panel">
+ <icon label="" name="2nd_life_edit_icon" tool_tip="Kliknij aby wybrać teksturę"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <text name="real_world_photo_title_text" value="Życie#1:"/>
+ </panel>
+ <icon label="" name="real_world_edit_icon" tool_tip="Kliknij aby wybrać teksturę"/>
+ <text name="title_homepage_text">
+ WWW:
+ </text>
+ <check_box label="Pokaż w wyszukiwarce" name="show_in_search_checkbox"/>
+ <text name="title_acc_status_text" value="Moje Konto:"/>
+ <text name="my_account_link" value="[[URL] idź do Dashboard]"/>
+ <text name="acc_status_text" value="Rezydent. Brak danych konta."/>
+ <text name="title_partner_text" value="Partner:"/>
+ <text name="partner_edit_link" value="[[URL] Edytuj]"/>
+ <panel name="partner_data_panel">
+ <text initial_value="(wyszukiwanie)" name="partner_text" value="[FIRST] [LAST]"/>
+ </panel>
+ </panel>
+ </panel>
+ </scroll_container>
+ <panel name="profile_me_buttons_panel">
+ <button label="Zapisz zmiany" name="save_btn"/>
+ <button label="Anuluj" name="cancel_btn"/>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_shape.xml b/indra/newview/skins/default/xui/pl/panel_edit_shape.xml
new file mode 100644
index 0000000000..3cacbd7fdd
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_edit_shape.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shape_panel">
+ <panel name="avatar_sex_panel">
+ <text name="gender_text">
+ Płeć:
+ </text>
+ <radio_group name="sex_radio">
+ <radio_item label="Kobieta" name="radio"/>
+ <radio_item label="Mężczyzna" name="radio2"/>
+ </radio_group>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shape_body_tab" title="Ciało"/>
+ <accordion_tab name="shape_head_tab" title="Głowa"/>
+ <accordion_tab name="shape_eyes_tab" title="Oczy"/>
+ <accordion_tab name="shape_ears_tab" title="Uszy"/>
+ <accordion_tab name="shape_nose_tab" title="Nos"/>
+ <accordion_tab name="shape_mouth_tab" title="Usta"/>
+ <accordion_tab name="shape_chin_tab" title="Podbródek"/>
+ <accordion_tab name="shape_torso_tab" title="Tułów"/>
+ <accordion_tab name="shape_legs_tab" title="Nogi"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_shirt.xml b/indra/newview/skins/default/xui/pl/panel_edit_shirt.xml
new file mode 100644
index 0000000000..27d8981e80
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_edit_shirt.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shirt_panel">
+ <panel name="avatar_shirt_color_panel">
+ <texture_picker label="Materiał" name="Fabric" tool_tip="Kliknij by wybrać grafikę"/>
+ <color_swatch label="Kolor/Odcień" name="Color/Tint" tool_tip="Kliknij by wybrać kolor"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shirt_main_tab" title="Spódnica"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_shoes.xml b/indra/newview/skins/default/xui/pl/panel_edit_shoes.xml
new file mode 100644
index 0000000000..09eb1008e8
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_edit_shoes.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shoes_panel">
+ <panel name="avatar_shoes_color_panel">
+ <texture_picker label="Materiał" name="Fabric" tool_tip="Kliknij aby wybrać teksturę"/>
+ <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shoes_main_tab" title="Buty"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_skin.xml b/indra/newview/skins/default/xui/pl/panel_edit_skin.xml
new file mode 100644
index 0000000000..617aad8650
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_edit_skin.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skin_panel">
+ <panel name="avatar_skin_color_panel">
+ <texture_picker label="Tatuaż na głowie" name="Head Tattoos" tool_tip="Kliknij aby wybrać teksturę"/>
+ <texture_picker label="Górny tatuaż" name="Upper Tattoos" tool_tip="Kliknij aby wybrać teksturę"/>
+ <texture_picker label="Dolny tatuaż" name="Lower Tattoos" tool_tip="Kliknij aby wybrać teksturę"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skin_color_tab" title="Kolor skórki"/>
+ <accordion_tab name="skin_face_tab" title="Szczegóły twarzy"/>
+ <accordion_tab name="skin_makeup_tab" title="Makijaż"/>
+ <accordion_tab name="skin_body_tab" title="Szczegóły budowy ciała"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_skirt.xml b/indra/newview/skins/default/xui/pl/panel_edit_skirt.xml
new file mode 100644
index 0000000000..f89148ffac
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_edit_skirt.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skirt_panel">
+ <panel name="avatar_skirt_color_panel">
+ <texture_picker label="Materiał" name="Fabric" tool_tip="Kliknij aby wybrać teksturę"/>
+ <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skirt_main_tab" title="Spódnica"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_socks.xml b/indra/newview/skins/default/xui/pl/panel_edit_socks.xml
new file mode 100644
index 0000000000..5481c73804
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_edit_socks.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_socks_panel">
+ <panel name="avatar_socks_color_panel">
+ <texture_picker label="Materiał" name="Fabric" tool_tip="Kliknij aby wybrać teksturę"/>
+ <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="socks_main_tab" title="Skarpetki"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/pl/panel_edit_tattoo.xml
new file mode 100644
index 0000000000..b5e1828588
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_edit_tattoo.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_tattoo_panel">
+ <panel name="avatar_tattoo_color_panel">
+ <texture_picker label="Tatuaż głowy" name="Head Tattoo" tool_tip="Kliknij by wybrać grafikę"/>
+ <texture_picker label="Tatuaż górnej części ciała" name="Upper Tattoo" tool_tip="Kliknij by wybrać grafikę"/>
+ <texture_picker label="Tatuaż dolnej części ciała" name="Lower Tattoo" tool_tip="Kliknij by wybrać grafikę"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_underpants.xml b/indra/newview/skins/default/xui/pl/panel_edit_underpants.xml
new file mode 100644
index 0000000000..94034aa8ab
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_edit_underpants.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_underpants_panel">
+ <panel name="avatar_underpants_color_panel">
+ <texture_picker label="Materiał" name="Fabric" tool_tip="Kliknij aby wybrać kolor"/>
+ <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="underpants_main_tab" title="Bielizna"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/pl/panel_edit_undershirt.xml
new file mode 100644
index 0000000000..72b72b76de
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_edit_undershirt.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_undershirt_panel">
+ <panel name="avatar_undershirt_color_panel">
+ <texture_picker label="Materiał" name="Fabric" tool_tip="Kliknij aby wybrać teksturę"/>
+ <color_swatch label="Kolor/Barwa" name="Color/Tint" tool_tip="Kliknij aby wybrać kolor"/>
+ </panel>
+ <accordion name="wearable_accordion">
+ <accordion_tab name="undershirt_main_tab" title="Podkoszulek"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_edit_wearable.xml b/indra/newview/skins/default/xui/pl/panel_edit_wearable.xml
new file mode 100644
index 0000000000..cf17afea3f
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_edit_wearable.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Ubranie/części ciała" name="panel_edit_wearable">
+ <string name="edit_shape_title">
+ Edycja kształtu
+ </string>
+ <string name="edit_skin_title">
+ Edycja skórki
+ </string>
+ <string name="edit_hair_title">
+ Edycja włosów
+ </string>
+ <string name="edit_eyes_title">
+ Edycja oczu
+ </string>
+ <string name="edit_shirt_title">
+ Edycja spódnicy
+ </string>
+ <string name="edit_pants_title">
+ Edycja spodni
+ </string>
+ <string name="edit_shoes_title">
+ Edycja butów
+ </string>
+ <string name="edit_socks_title">
+ Edycja skarpetek
+ </string>
+ <string name="edit_jacket_title">
+ Edycja kurtki
+ </string>
+ <string name="edit_skirt_title">
+ Edycja spódnicy
+ </string>
+ <string name="edit_gloves_title">
+ Edycja rękawiczek
+ </string>
+ <string name="edit_undershirt_title">
+ Edycja podkoszulki
+ </string>
+ <string name="edit_underpants_title">
+ Edycja bielizny
+ </string>
+ <string name="edit_alpha_title">
+ Edycja maski Alpha
+ </string>
+ <string name="edit_tattoo_title">
+ Edycja tatuażu
+ </string>
+ <string name="shape_desc_text">
+ Kształt:
+ </string>
+ <string name="skin_desc_text">
+ Skórka:
+ </string>
+ <string name="hair_desc_text">
+ Włosy:
+ </string>
+ <string name="eyes_desc_text">
+ Oczy:
+ </string>
+ <string name="shirt_desc_text">
+ Koszula:
+ </string>
+ <string name="pants_desc_text">
+ Spodnie:
+ </string>
+ <string name="shoes_desc_text">
+ Buty:
+ </string>
+ <string name="socks_desc_text">
+ Skarpetki:
+ </string>
+ <string name="jacket_desc_text">
+ Kurtka:
+ </string>
+ <string name="skirt_skirt_desc_text">
+ Spódnica:
+ </string>
+ <string name="gloves_desc_text">
+ Rękawiczki:
+ </string>
+ <string name="undershirt_desc_text">
+ Podkoszulek:
+ </string>
+ <string name="underpants_desc_text">
+ Bielizna:
+ </string>
+ <string name="alpha_desc_text">
+ Maska Alpha:
+ </string>
+ <string name="tattoo_desc_text">
+ Tatuaż:
+ </string>
+ <text name="edit_wearable_title" value="Edycja Kształtu"/>
+ <panel label="Koszula" name="wearable_type_panel">
+ <text name="description_text" value="Kształt:"/>
+ </panel>
+ <panel name="button_panel">
+ <button label="Zapisz" name="save_as_button"/>
+ <button label="Wróć" name="revert_button"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_friends.xml b/indra/newview/skins/default/xui/pl/panel_friends.xml
index b6df36f199..fca0dad380 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_friends.xml
+++ b/indra/newview/skins/default/xui/pl/panel_friends.xml
@@ -1,27 +1,20 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="friends">
<string name="Multiple">
- Znajomi...
+ Znajomi
</string>
- <scroll_list name="friend_list"
- tool_tip="By wybrać wielu znajomych za jednym razem przetrzymaj klawisz shift lub control">
- <column name="icon_online_status" tool_tip="Status dostępności" />
- <column label="ImiÄ™" name="friend_name" tool_tip="ImiÄ™" />
- <column name="icon_visible_online"
- tool_tip="Ta osoba może widzieć czy jesteś w Second Life" />
- <column name="icon_visible_map"
- tool_tip="Ta osoba może zlokalizować Cię na mapie" />
- <column name="icon_edit_mine"
- tool_tip="Ta osoba może edytować, usunąć lub wziąć Twoje obiekty" />
- <column name="icon_edit_theirs" tool_tip="Możesz edytować obiekty tej osoby" />
+ <scroll_list name="friend_list" tool_tip="By wybrać wielu znajomych za jednym razem przetrzymaj klawisz shift lub control">
+ <column name="icon_online_status" tool_tip="Status dostępności"/>
+ <column label="ImiÄ™" name="friend_name" tool_tip="ImiÄ™"/>
+ <column name="icon_visible_online" tool_tip="Ta osoba może widzieć czy jesteś w Second Life"/>
+ <column name="icon_visible_map" tool_tip="Ta osoba może zlokalizować Cię na mapie"/>
+ <column name="icon_edit_mine" tool_tip="Ta osoba może edytować, usunąć lub wziąć Twoje obiekty"/>
+ <column name="icon_edit_theirs" tool_tip="Możesz edytować obiekty tej osoby"/>
</scroll_list>
- <button label="Czat/IM" name="im_btn" tool_tip="Rozpocznij sesjÄ™ czatu/IM" />
- <button label="Profil" name="profile_btn"
- tool_tip="Pokaż zdjęcia, grupy i inne informacje" />
- <button label="Teleportuj..." name="offer_teleport_btn"
- tool_tip="Zaoferuj teleportacjÄ™ do siebie" />
- <button label="Zapłać..." name="pay_btn" tool_tip="Zapłać L$ tej osobie" />
- <button label="Usuń..." name="remove_btn"
- tool_tip="Usuń tę osobę z listy znajomych" />
- <button label="Dodaj..." name="add_btn" tool_tip="Zaproponuj znajomość" />
+ <button label="Czat/IM" name="im_btn" tool_tip="Rozpocznij sesjÄ™ czatu/IM"/>
+ <button label="Profil" name="profile_btn" tool_tip="Pokaż zdjęcia, grupy i inne informacje"/>
+ <button label="Teleportuj" name="offer_teleport_btn" tool_tip="Zaoferuj teleportacjÄ™ do siebie"/>
+ <button label="Zapłać" name="pay_btn" tool_tip="Zapłać L$ tej osobie"/>
+ <button label="Usuń" name="remove_btn" tool_tip="Usuń tę osobę z listy znajomych"/>
+ <button label="Dodaj" name="add_btn" tool_tip="Zaoferuj znajomość"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_group_control_panel.xml b/indra/newview/skins/default/xui/pl/panel_group_control_panel.xml
new file mode 100644
index 0000000000..b57ec8f2e6
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_group_control_panel.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="vertical_stack">
+ <layout_panel name="group_info_btn_panel">
+ <button label="Grupa" name="group_info_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Dzwoń" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Zakończ Rozmowę" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Przełączniki Głosu" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_group_general.xml b/indra/newview/skins/default/xui/pl/panel_group_general.xml
index d09ff72226..67fa0bf085 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/pl/panel_group_general.xml
@@ -1,70 +1,55 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Ogólne" name="general_tab">
- <string name="help_text">
- Zakładka Ogólne zawiera informacje na temat tej grupy, listę właścicieli, widocznych członków, ustawienia grupy oraz opcje członkostwa.
- </string>
- <string name="group_info_unchanged">
+ <panel.string name="help_text">
+ Zakładka Główne zawiera ogólne informacje na temat tej grupy, ustawień dla całej grupy oraz danego członka.
+
+By otrzymać pomoc i dodatkowe wskazówki przesuń kursor na przyciski.
+ </panel.string>
+ <panel.string name="group_info_unchanged">
Ogólne informacje na temat grupy uległy zmianie.
- </string>
- <button label="?" label_selected="?" name="help_button"/>
- <line_editor label="Wpisz nazwÄ™ grupy tutaj" name="group_name_editor"/>
- <text name="group_name">
- Wpisz nazwÄ™ grupy tutaj
- </text>
- <text name="prepend_founded_by">
- Założyciel:
- </text>
- <text name="founder_name">
- (proszę czekać)
- </text>
- <text name="group_charter_label">
- Status Grupy
- </text>
- <texture_picker label="Insygnia Grupy" name="insignia" tool_tip="Kliknij by wybrać zdjęcie"/>
+ </panel.string>
+ <panel.string name="incomplete_member_data_str">
+ Wyszukiwanie informacji o członku
+ </panel.string>
+ <panel name="group_info_top">
+ <texture_picker label="" name="insignia" tool_tip="Kliknij by wybrać obraz"/>
+ <text name="prepend_founded_by">
+ Założyciel:
+ </text>
+ <name_box initial_value="(przetwarzanie)" name="founder_name"/>
+ <text name="join_cost_text">
+ Wstęp wolny
+ </text>
+ <button label="DOÅÄ„CZ TERAZ!" name="btn_join"/>
+ </panel>
<text_editor name="charter">
Status Grupy
</text_editor>
- <button label="Dołącz (L$0)" label_selected="Dołącz (L$0)" name="join_button"/>
- <button label="Szczegóły" label_selected="Szczegóły" name="info_button"/>
- <text name="text_owners_and_visible_members">
- Właściciele i widoczni członkowie
- </text>
- <text name="text_owners_are_shown_in_bold">
- (Właściciele wyświetlają się pogrubioną czcionką)
- </text>
<name_list name="visible_members">
- <name_list.columns label="ImiÄ™" name="name"/>
+ <name_list.columns label="Członek" name="name"/>
<name_list.columns label="Tytuł" name="title"/>
- <name_list.columns label="Ostatnio w SL" name="online"/>
+ <name_list.columns label="Status" name="status"/>
</name_list>
- <text name="text_group_preferences">
- Ustawienia Grupy
+ <text name="my_group_settngs_label">
+ ja
</text>
+ <text name="active_title_label">
+ Mój Aktywny Tytuł:
+ </text>
+ <combo_box name="active_title" tool_tip="Ustaw tytuł który wyświetla się kiedy grupa jest aktywna."/>
+ <check_box label="Otrzymuj grupowe ogłoszenia" name="receive_notices" tool_tip="Zaznacz jeżeli chcesz otrzymywać ogłoszenia z tej grupy. Anuluj z zaznaczenia, jeżeli nie chcesz otrzymywać żadnych ogłoszeń z tej grupy."/>
+ <check_box label="Wyświetl grupę w profilu" name="list_groups_in_profile" tool_tip="Zaznacz jeżeli chcesz by grupa wyświetlała się w Twoim profilu"/>
<panel name="preferences_container">
- <check_box label="Wyświetlaj w wyszukiwarce" name="show_in_group_list" tool_tip="Udostępnij info o grupie w wyszukiwarce"/>
- <check_box label="Wolny Wstęp" name="open_enrollement" tool_tip="Sprawdź czy grupa oferuje wolny wstęp i nie wymaga zaproszenia."/>
- <check_box label="Opłata Wstępu:" name="check_enrollment_fee" tool_tip="Ustaw opłatę za przyłączenie się do grupy."/>
- <spinner name="spin_enrollment_fee" tool_tip="Nowi członkowie grupy muszą zapłacić wymaganą opłatę by dołączyć do grupy."/>
+ <text name="group_settngs_label">
+ Grupa
+ </text>
+ <check_box label="Wolny wstęp" name="open_enrollement" tool_tip="Sprawdź czy grupa oferuje wolny wstęp i nie wymaga zaproszenia."/>
+ <check_box label="Opłata wstępu" name="check_enrollment_fee" tool_tip="Ustaw opłatę za przyłączenie się do grupy."/>
+ <spinner label="L$" name="spin_enrollment_fee" tool_tip="Nowi członkowie grupy muszą zapłacić wymaganą opłatę by dołączyć do grupy."/>
<combo_box name="group_mature_check" tool_tip="Wybierz jeżeli uważasz, iż Twoja grupa klasyfikowana jest jako &apos;Mature&apos;.">
- <combo_box.item name="select_mature" label="- Wybierz Treść -"/>
- <combo_box.item name="mature" label="Treść &apos;Mature&apos;"/>
- <combo_box.item name="pg" label="Treść &apos;PG&apos;"/>
+ <combo_box.item label="Treść &apos;PG&apos;" name="pg"/>
+ <combo_box.item label="Treść &apos;Mature&apos;" name="mature"/>
</combo_box>
- <panel name="title_container">
- <text name="active_title_label">
- Mój Aktywny Tytuł
- </text>
- <combo_box name="active_title" tool_tip="Ustaw tytuł który wyświetla się kiedy grupa jest aktywna."/>
- </panel>
- <check_box label="Otrzymuj grupowe ogłoszenia" name="receive_notices" tool_tip="Zaznacz jeżeli chcesz otrzymywać ogłoszenia z tej grupy. Anuluj z zaznaczenia, jeżeli nie chcesz otrzymywać żadnych ogłoszeń z tej grupy."/>
- <check_box label="Wyświetl grupę w profilu" name="list_groups_in_profile" tool_tip="Zaznacz jeżeli chcesz by grupa wyświetlała się w Twoim profilu"/>
+ <check_box initial_value="true" label="Wyświetlaj w wyszukiwarce" name="show_in_group_list" tool_tip="Udostępnij info o grupie w wyszukiwarce"/>
</panel>
- <string name="incomplete_member_data_str">
- Wyszukiwanie informacji o członku
- </string>
- <string name="confirm_group_create_str">
- Koszt utworzenia tej grupy wynosi L$100.
-Czy napewno jesteś PEWNY,że chcesz zapłacić L$100 by utworzyć grupę?
-Pamiętaj, jeżeli w ciągu 48h od utworzenia grupy nikt do niej nie dołączy, informacje o grupie zostaną usunięte z bazy, a nazwa grupy zablokowana do użycia w przyszłości.
- </string>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/pl/panel_group_info_sidetray.xml
new file mode 100644
index 0000000000..509c2893cf
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_group_info_sidetray.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="O Grupie" name="GroupInfo">
+ <panel.string name="default_needs_apply_text">
+ Nie zapisałeś zmian
+ </panel.string>
+ <panel.string name="want_apply_text">
+ Czy chcesz zachować te zmiany?
+ </panel.string>
+ <panel.string name="group_join_btn">
+ Dołącz (L$[AMOUNT])
+ </panel.string>
+ <panel.string name="group_join_free">
+ Darmowe
+ </panel.string>
+ <panel name="group_info_top">
+ <text name="group_name" value="(Åadowanie...)"/>
+ <line_editor label="Wpisz nazwÄ™ swojej nowej grupy tutaj" name="group_name_editor"/>
+ </panel>
+ <layout_stack name="layout">
+ <layout_panel name="group_accordions">
+ <accordion name="groups_accordion">
+ <accordion_tab name="group_general_tab" title="Ogólne"/>
+ <accordion_tab name="group_roles_tab" title="Funkcja"/>
+ <accordion_tab name="group_notices_tab" title="Notki"/>
+ <accordion_tab name="group_land_tab" title="Posiadlość/Majątek"/>
+ </accordion>
+ </layout_panel>
+ <layout_panel name="button_row">
+ <button label="Czat" name="btn_chat"/>
+ <button label="Konferencja Głosowa" name="btn_call" tool_tip="Konferencja Głosowa"/>
+ <button label="Zapisz" label_selected="Zapisz" name="btn_apply"/>
+ <button label="Stwórz nową Grupę" name="btn_create" tool_tip="Stwórz nową Grupę"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_group_invite.xml b/indra/newview/skins/default/xui/pl/panel_group_invite.xml
index 12d48279ad..e520c06944 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/pl/panel_group_invite.xml
@@ -1,23 +1,27 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Zaproszenie do Grupy" name="invite_panel">
+ <panel.string name="confirm_invite_owner_str">
+ Jesteś pewny, że chcesz wybrać nowych właścieli grupy? Ta decyzja jest ostateczna!
+ </panel.string>
+ <panel.string name="loading">
+ (ładowanie...)
+ </panel.string>
+ <panel.string name="already_in_group">
+ Niektórzy Rezydenci, których wybrałeś już należą do grupy i nie otrzymali zaproszenia.
+ </panel.string>
<text name="help_text">
- Możesz zaprosić kilku Rezydentów
-do swojej grupy. Wybierz &apos;Otwórz
-Katalog Osobisty&apos; by rozpocząć.
+ Możesz zaprosić kilku Rezydentów do swojej grupy. Wybierz &apos;Otwórz Katalog Osobisty&apos; aby rozpocząć.
</text>
<button label="Otwórz Katalog Osobisty" name="add_button" tool_tip=""/>
- <name_list name="invitee_list" tool_tip="" />
- <button label="Usuń z Listy" name="remove_button" tool_tip="" />
+ <name_list name="invitee_list" tool_tip="Przytrzymaj klawisz Ctrl i kliknij imię Rezydenta aby wybrać kilka osób."/>
+ <button label="Usuń z Listy" name="remove_button" tool_tip="Usuwa wybranych powyżej Rezydentów z listy zaproszeń."/>
<text name="role_text">
Wybierz rolę dla nowego członka:
</text>
- <combo_box name="role_name" tool_tip="" />
- <button label="Wyślij Zaproszenia" name="ok_button" />
- <button label="Anuluj" name="cancel_button" />
- <string name="confirm_invite_owner_str">
- Jesteś pewny, że chcesz wybrać nowych właścieli grupy? Ta decyzja jest ostateczna!
- </string>
- <string name="loading">
- (loading...)
+ <combo_box name="role_name" tool_tip="Wybierz z listy Role, które możesz przypisać Członkom"/>
+ <button label="Wyślij Zaproszenia" name="ok_button"/>
+ <button label="Anuluj" name="cancel_button"/>
+ <string name="GroupInvitation">
+ Zaproszenie do Grupy
</string>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_group_land_money.xml b/indra/newview/skins/default/xui/pl/panel_group_land_money.xml
index dbfa8e3122..a52b7f7745 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/pl/panel_group_land_money.xml
@@ -1,84 +1,81 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Posiadłości i L$" name="land_money_tab">
- <string name="help_text">
- Posiadłości, które są własnością grupy zawierają dane poszczególnych kontrybucji ich członków. W przypadku kiedy całkowita ilość metrów przypisanej danej posiadłości przez grupę jest mniejsza lub równa całkowitej liczbie kontrybucji dla przypisanej ilości metrów pojawia się ostrzeżenie. Zakładki: Planowanie, Szczegóły oraz Sprzedaże udostępniają informacje na temat statusu finansowego grupy.
- </string>
- <button label="?" name="help_button"/>
- <string name="cant_view_group_land_text">
+ <panel.string name="help_text">
+ Ostrzeżenie pojawia siÄ™ kiedy ÅÄ…czna Powierzchnia PosiadÅ‚oÅ›ci jest mniejsza lub = Kontrybucjom
+ </panel.string>
+ <panel.string name="cant_view_group_land_text">
Nie masz pozwolenia na oglądanie Posiadłości Grupy.
- </string>
- <string name="cant_view_group_accounting_text">
+ </panel.string>
+ <panel.string name="cant_view_group_accounting_text">
Nie masz dostępu do konta, finansów Grupy.
- </string>
- <string name="loading_txt">
+ </panel.string>
+ <panel.string name="loading_txt">
Åadowanie...
- </string>
- <text name="group_land_heading">
- Posiadłości Grupy
- </text>
- <scroll_list name="group_parcel_list">
- <column label="Posiadłości" name="name"/>
- <column label="Region" name="location"/>
- <column label="Typ" name="type"/>
- <column label="Obszar" name="area"/>
- <column label="" name="hidden"/>
- </scroll_list>
- <button label="Pokaż na Mapie" label_selected="Pokaż na Mapie" name="map_button"/>
- <text name="total_contributed_land_label">
- Kontrybucje:
- </text>
- <text name="total_contributed_land_value">
- [AREA] metrów
- </text>
- <text name="total_land_in_use_label">
- Używane Posiadłości:
- </text>
- <text name="total_land_in_use_value">
- [AREA] metrów
- </text>
- <text name="land_available_label">
- Dostępne Posiadłości:
- </text>
- <text name="land_available_value">
- [AREA] metrów
- </text>
- <text name="your_contribution_label">
- Twoje Kontrybucje:
- </text>
- <string name="land_contrib_error">
+ </panel.string>
+ <panel.string name="land_contrib_error">
Nie można ustalić Twoich kontrybucji.
- </string>
- <text name="your_contribution_units">
- ( m )
- </text>
- <text name="your_contribution_max_value">
- ([AMOUNT] maksimum)
- </text>
- <text name="group_over_limit_text">
- Członkowie Grupy muszą zwiększyć kredyt na używanie Posiadłości.
- </text>
- <text name="group_money_heading">
- L$ Grupy
- </text>
+ </panel.string>
+ <panel name="layout_panel_landmoney">
+ <scroll_list name="group_parcel_list">
+ <scroll_list.columns label="Posiadłość" name="name"/>
+ <scroll_list.columns label="Region" name="location"/>
+ <scroll_list.columns label="Typ" name="type"/>
+ <scroll_list.columns label="Obszar" name="area"/>
+ </scroll_list>
+ <text name="total_contributed_land_label">
+ Kontrybucje:
+ </text>
+ <text name="total_contributed_land_value">
+ [AREA] m²
+ </text>
+ <button label="Mapa" label_selected="Mapa" name="map_button"/>
+ <text name="total_land_in_use_label">
+ Używane Posiadłości:
+ </text>
+ <text name="total_land_in_use_value">
+ [AREA] m²
+ </text>
+ <text name="land_available_label">
+ Dostępne Posiadłości:
+ </text>
+ <text name="land_available_value">
+ [AREA] m²
+ </text>
+ <text name="your_contribution_label">
+ Twoje Kontrybucje:
+ </text>
+ <text name="your_contribution_units">
+ m²
+ </text>
+ <text name="your_contribution_max_value">
+ ([AMOUNT] max)
+ </text>
+ <text name="group_over_limit_text">
+ Należy zwięszyć kredyt na używanie Posiadłości.
+ </text>
+ <text name="group_money_heading">
+ L$ Grupy
+ </text>
+ </panel>
<tab_container name="group_money_tab_container">
- <panel label="Planowanie" name="group_money_planning_tab">
+ <panel label="PLANOWANIE" name="group_money_planning_tab">
<text_editor name="group_money_planning_text">
- Obliczanie...
+ Åadowanie...
</text_editor>
</panel>
- <panel label="Szczegóły" name="group_money_details_tab">
+ <panel label="SZCZEGÓÅY" name="group_money_details_tab">
<text_editor name="group_money_details_text">
- Obliczanie...
+ Åadowanie...
</text_editor>
- <button label="&lt; Wcześniej" label_selected="&lt; Wcześniej" name="earlier_details_button" tool_tip="Do tyłu w czasie"/>
- <button label="Później &gt;" label_selected="Później &gt;" name="later_details_button" tool_tip="Do przodu w czasie"/>
+ <button label="&lt; Wcześniej" label_selected="&lt; Wcześniej" name="earlier_details_button" tool_tip="Wcześniej"/>
+ <button label="Później &gt;" label_selected="Później &gt;" name="later_details_button" tool_tip="Później"/>
</panel>
- <panel label="Sprzedaż" name="group_money_sales_tab">
+ <panel label="SPRZEDAÅ»" name="group_money_sales_tab">
<text_editor name="group_money_sales_text">
- Obliczanie...
+ Åadowanie...
</text_editor>
- <button label="&lt; Wcześniej" label_selected="&lt; Wcześniej" name="earlier_sales_button" tool_tip="Do tyłu w czasie"/>
- <button label="Później &gt;" label_selected="Później &gt;" name="later_sales_button" tool_tip="Do przodu w czasie"/>
+ <button label="&lt; Wcześniej" label_selected="&lt; Wcześniej" name="earlier_sales_button" tool_tip="Wcześniej"/>
+ <button label="Później &gt;" label_selected="Później &gt;" name="later_sales_button" tool_tip="Później"/>
</panel>
</tab_container>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_group_list_item.xml b/indra/newview/skins/default/xui/pl/panel_group_list_item.xml
new file mode 100644
index 0000000000..a8b4056976
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_group_list_item.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="group_list_item">
+ <text name="group_name" value="Nieznana"/>
+ <button name="profile_btn" tool_tip="Zobacz profil"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_group_notices.xml b/indra/newview/skins/default/xui/pl/panel_group_notices.xml
index 1c19571ec0..31882ab0e6 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/pl/panel_group_notices.xml
@@ -1,38 +1,30 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Ogłoszenia" name="notices_tab">
- <string name="help_text">
+ <panel.string name="help_text">
Ogłoszenia to szybka droga do komunikowania się ze wszystkmi członkami grupy poprzez wysylanie ich na grupowym kanale. Dodatkowo, do ogłoszenia można dołańczać załączniki. Ogłoszenia docierają jedynie do członków grupy, którzy mają zdolność ich otrzymywania. By nie otrzymywać ogłoszeń, w zakładce Ogólne pozostaw niezaznaczonym &quot;Otrzymuj grupowe ogłoszenia&quot;.
- </string>
- <string name="no_notices_text">
+ </panel.string>
+ <panel.string name="no_notices_text">
Brak przeszłych ogłoszeń
- </string>
- <button label="?" label_selected="?" name="help_button" />
- <text name="lbl">
- Archiwum Grupowych Ogłoszeń
- </text>
+ </panel.string>
<text name="lbl2">
- Ogłoszenia przechowywane są przez 14 dni.
+ Ogłoszenia przechowywane są przez 14 dni.
Limit dzienny ogłoszeń dla grupy wynosi 200.
</text>
<scroll_list name="notice_list">
- <column label="" name="icon" />
- <column label="Temat" name="subject" />
- <column label="Autor" name="from" />
- <column label="Data" name="date" />
+ <scroll_list.columns label="" name="icon"/>
+ <scroll_list.columns label="Temat" name="subject"/>
+ <scroll_list.columns label="Autor" name="from"/>
+ <scroll_list.columns label="Data" name="date"/>
</scroll_list>
<text name="notice_list_none_found">
- Nie znalezione.
+ Nie znaleziono
</text>
- <button label="Stwórz Nowe Ogłoszenie" label_selected="Stwórz Nowe Ogłoszenie"
- name="create_new_notice" />
- <button label="Odśwież" label_selected="Odśwież Listę" name="refresh_notices" />
+ <button label="Stwórz Ogłoszenie" label_selected="Stwórz Nowe Ogłoszenie" name="create_new_notice" tool_tip="Stwórz Ogłoszenie"/>
+ <button label="Odśwież" label_selected="Odśwież Listę" name="refresh_notices" tool_tip="Użyj Odśwież by zobaczyć czy nowe ogłoszenia zostały wysłane."/>
<panel label="Stwórz Nowe Ogłoszenie" name="panel_create_new_notice">
<text name="lbl">
Stwórz Ogłoszenie
</text>
- <text name="lbl2">
- Możesz także dołączyć pojedynczy załącznik ze swojej szafy. Załącznik musi mieć prawo modyfikacyjne do kopiowania oraz transferu.
- </text>
<text name="lbl3">
Temat:
</text>
@@ -42,17 +34,19 @@ Limit dzienny ogłoszeń dla grupy wynosi 200.
<text name="lbl5">
Załącz:
</text>
- <button label="Usuń Załącznik" label_selected="Usuń Załącznik"
- name="remove_attachment" />
- <button label="Wyślij" label_selected="Wyślij" name="send_notice" />
- <panel name="drop_target" tool_tip="" />
+ <text name="string">
+ Przeciągnij i upuść załącznik tutaj aby go dodać:
+ </text>
+ <button label="Usuń załącznik" label_selected="Usuń Załącznik" name="remove_attachment" tool_tip="Usuń załącznik z noty"/>
+ <button label="Wyślij" label_selected="Wyślij" name="send_notice"/>
+ <group_drop_target name="drop_target" tool_tip="Przeciągnij załącznik ze swojej Szafy na pole docelowe aby wysłać go z Ogłoszeniem. Musisz posiadać prawo do kopiowania i transferu załącznika aby go dodać do ogłoszenia."/>
</panel>
- <panel label="Zobacz Przeszłe Ogłoszenia" name="panel_view_past_notice">
+ <panel label="Zobacz przeszłe Ogłoszenia" name="panel_view_past_notice">
<text name="lbl">
- Ogłoszenia Zachowane
+ Ogłoszenia zachowane
</text>
<text name="lbl2">
- By wysłać nowe ogłoszenie, kliknij Stwórz Nowe Ogłoszenie.
+ W celu wysłania nowego ogłoszenia kliknij przycisk +
</text>
<text name="lbl3">
Temat:
@@ -60,7 +54,6 @@ Limit dzienny ogłoszeń dla grupy wynosi 200.
<text name="lbl4">
Treść:
</text>
- <button label="Otwórz Załącznik" label_selected="Otwórz Załącznik"
- name="open_attachment" />
+ <button label="Otwórz Załącznik" label_selected="Otwórz Załącznik" name="open_attachment"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_group_notify.xml b/indra/newview/skins/default/xui/pl/panel_group_notify.xml
new file mode 100644
index 0000000000..d81c3f68f2
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_group_notify.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_group_notify">
+ <panel label="header" name="header">
+ <text name="title" value="ImiÄ™ Nadawcy / Nazwa Grupy"/>
+ </panel>
+ <text name="attachment" value="Załącznik"/>
+ <button label="OK" name="btn_ok"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_group_roles.xml b/indra/newview/skins/default/xui/pl/panel_group_roles.xml
index dd46b4aeaa..8a422e2586 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/pl/panel_group_roles.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Członkowie" name="roles_tab">
<panel.string name="default_needs_apply_text">
- Zakładka zawiera niezapisane zmiany
+ Panel zawiera niezapisane zmiany.
</panel.string>
<panel.string name="want_apply_text">
Czy chcesz zapisać zmiany?
@@ -16,7 +16,7 @@ Możesz wybrać wielu Członków naciskając Ctrl i klikając na ich imionach.
<name_list name="member_list">
<name_list.columns label="Członek" name="name"/>
<name_list.columns label="Dotacje" name="donated"/>
- <name_list.columns label="Ostatnio w SL" name="online"/>
+ <name_list.columns label="Status" name="online"/>
</name_list>
<button label="ZaproÅ› do Grupy" name="member_invite"/>
<button label="Usuń z Grupy" name="member_eject"/>
@@ -29,7 +29,7 @@ jedną lub wiele funkcji. Każda grupa może posiadać maksymalnie 10 funkcji,
łącznie z funkcją Każdy i Właściciel.
</panel.string>
<panel.string name="cant_delete_role">
- Specjalne Funkcje Każdy i Właściciel nie mogą zostać usunięte.
+ Funkcje &quot;Wszyscy&quot; oraz &quot;Właściciele&quot; są domyślnie oraz nie mogą zostać usunięte.
</panel.string>
<panel.string name="power_folder_icon">
Inv_FolderClosed
@@ -38,7 +38,7 @@ jedną lub wiele funkcji. Każda grupa może posiadać maksymalnie 10 funkcji,
<scroll_list name="role_list">
<scroll_list.columns label="Funkcja" name="name"/>
<scroll_list.columns label="Tytuł" name="title"/>
- <scroll_list.columns label="Liczba" name="members"/>
+ <scroll_list.columns label="#" name="members"/>
</scroll_list>
<button label="Stwórz Nową Funkcję" name="role_create"/>
<button label="Usuń Funkcję" name="role_delete"/>
@@ -57,7 +57,7 @@ Istnieje wiele Przywilei.
</tab_container>
<panel name="members_footer">
<text name="static">
- Funkcje
+ Przywileje
</text>
<scroll_list name="member_assigned_roles">
<scroll_list.columns label="" name="checkbox"/>
@@ -73,13 +73,13 @@ Istnieje wiele Przywilei.
</panel>
<panel name="roles_footer">
<text name="static">
- Nazwa
+ Nazwa Funkcji
</text>
<line_editor name="role_name">
Liczba
</line_editor>
<text name="static3">
- Tytuł
+ Nazwa Funkcji
</text>
<line_editor name="role_title">
(proszę czekać)
diff --git a/indra/newview/skins/default/xui/pl/panel_groups.xml b/indra/newview/skins/default/xui/pl/panel_groups.xml
index 9df90fc797..9df90fc797 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_groups.xml
+++ b/indra/newview/skins/default/xui/pl/panel_groups.xml
diff --git a/indra/newview/skins/default/xui/pl/panel_im_control_panel.xml b/indra/newview/skins/default/xui/pl/panel_im_control_panel.xml
new file mode 100644
index 0000000000..ffd75994cb
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_im_control_panel.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="button_stack">
+ <layout_panel name="view_profile_btn_panel">
+ <button label="Profil" name="view_profile_btn"/>
+ </layout_panel>
+ <layout_panel name="add_friend_btn_panel">
+ <button label="Poznaj" name="add_friend_btn"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_panel">
+ <button label="Teleportuj" name="teleport_btn" tool_tip="Teleportuj"/>
+ </layout_panel>
+ <layout_panel name="share_btn_panel">
+ <button label="Udostępnij" name="share_btn"/>
+ </layout_panel>
+ <layout_panel name="pay_btn_panel">
+ <button label="Zapłać" name="pay_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Dzwoń" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Zakończ Rozmowę" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Przełączniki Głosu" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_landmark_info.xml b/indra/newview/skins/default/xui/pl/panel_landmark_info.xml
new file mode 100644
index 0000000000..64479176fa
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_landmark_info.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="landmark_info">
+ <string name="title_create_landmark" value="Zapamiętaj Miejsce"/>
+ <string name="title_edit_landmark" value="Edytuj Zapamiętane Miejsce"/>
+ <string name="title_landmark" value="Zapamiętane Miejsce (LM)"/>
+ <string name="not_available" value="(N\A)"/>
+ <string name="unknown" value="(nieznane)"/>
+ <string name="public" value="(publiczne)"/>
+ <string name="server_update_text">
+ Informacje o miejscu nie są dostępne bez aktualizacji serwera.
+ </string>
+ <string name="server_error_text">
+ Informacje o miejscu nie są dostępne w tej chwili. Prosimy sprobować później.
+ </string>
+ <string name="server_forbidden_text">
+ Informacje o miejscu są niedostępne z powodu braku dostępu. Prosimy sprawdzić swoje prawa z właścicielem posiadłości.
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </string>
+ <button name="back_btn" tool_tip="Cofnij"/>
+ <text name="title" value="Profil Miejsca"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="maturity_value" value="nieznany"/>
+ <panel name="landmark_info_panel">
+ <text name="owner_label" value="Właściciel:"/>
+ <text name="creator_label" value="Twórca:"/>
+ <text name="created_label" value="Stworzone:"/>
+ </panel>
+ <panel name="landmark_edit_panel">
+ <text name="title_label" value="Tytuł:"/>
+ <text name="notes_label" value="Moje notatki:"/>
+ <text name="folder_label" value="Lokalizacja zapisanego miejsca:"/>
+ </panel>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_landmarks.xml b/indra/newview/skins/default/xui/pl/panel_landmarks.xml
new file mode 100644
index 0000000000..dcc495b5a8
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_landmarks.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Landmarks">
+ <accordion name="landmarks_accordion">
+ <accordion_tab name="tab_favorites" title="Ulubione"/>
+ <accordion_tab name="tab_landmarks" title="Landmarki"/>
+ <accordion_tab name="tab_inventory" title="Moja Szafa"/>
+ <accordion_tab name="tab_library" title="Biblioteka"/>
+ </accordion>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Pokaż dodatkowe opcje"/>
+ <button name="add_btn" tool_tip="Dodaj nowy landmark"/>
+ <dnd_button name="trash_btn" tool_tip="Usuń zaznaczony landmark"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_login.xml b/indra/newview/skins/default/xui/pl/panel_login.xml
index cec7e34da5..6b0061926b 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_login.xml
+++ b/indra/newview/skins/default/xui/pl/panel_login.xml
@@ -6,33 +6,29 @@
<panel.string name="forgot_password_url">
http://secondlife.com/account/request.php
</panel.string>
- <panel name="login_widgets">
- <text name="first_name_text">
- ImiÄ™:
- </text>
- <line_editor name="first_name_edit" tool_tip="[SECOND_LIFE] ImiÄ™"/>
- <text name="last_name_text">
- Nazwisko
- </text>
- <line_editor name="last_name_edit" tool_tip="[SECOND_LIFE] Nazwisko"/>
- <text name="password_text">
- Hasło:
- </text>
- <button label="Zaloguj" label_selected="Zaloguj" name="connect_btn"/>
- <text name="start_location_text">
- Miejsce Startu:
- </text>
- <combo_box name="start_location_combo">
- <combo_box.item label="Moje Ostatnie Miejsce" name="MyLastLocation"/>
- <combo_box.item label="Moje Miejsce Startu" name="MyHome"/>
- <combo_box.item label="&lt;Wpisz nazwÄ™ regionu&gt;" name="Typeregionname"/>
- </combo_box>
- <check_box label="Zapamiętaj Hasło" name="remember_check"/>
- <text name="create_new_account_text">
- Załóż Nowe Konto
- </text>
- <text name="forgot_password_text">
- Nie pamiętasz swojego imienia lub hasła?
- </text>
- </panel>
+ <layout_stack name="login_widgets">
+ <layout_panel name="login">
+ <text name="first_name_text">
+ ImiÄ™:
+ </text>
+ <line_editor label="ImiÄ™" name="first_name_edit" tool_tip="[SECOND_LIFE] First Name"/>
+ <line_editor label="Nazwisko" name="last_name_edit" tool_tip="[SECOND_LIFE] Last Name"/>
+ <check_box label="Zapamiętaj Hasło" name="remember_check"/>
+ <text name="start_location_text">
+ Rozpocznij w:
+ </text>
+ <combo_box name="start_location_combo">
+ <combo_box.item label="Moje Miejsce Startu" name="MyHome"/>
+ </combo_box>
+ <button label="Połącz" name="connect_btn"/>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_new_account_text">
+ Utwórz nowe konto
+ </text>
+ <text name="login_help">
+ Potrzebujesz pomocy z logowaniem siÄ™?
+ </text>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_main_inventory.xml b/indra/newview/skins/default/xui/pl/panel_main_inventory.xml
index e34fd69671..e0d9def8b3 100644
--- a/indra/newview/skins/default/xui/pl/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/pl/panel_main_inventory.xml
@@ -1,26 +1,22 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Rzeczy" name="main inventory panel">
- <panel.string name="Title">
- Rzeczy
+ <panel.string name="ItemcountFetching">
+ Dostarczanie [ITEM_COUNT] obiektów... [FILTER]
</panel.string>
- <filter_editor label="Filtr" name="inventory search editor"/>
- <tab_container name="inventory filter tabs">
- <inventory_panel label="Wszystkie Obiekty" name="All Items"/>
- <inventory_panel label="Ostatnio Dodane Obiekty" name="Recent Items"/>
- </tab_container>
- <panel name="bottom_panel">
- <button name="options_gear_btn" tool_tip="Pokaż dodatkowe opcje"/>
- <button name="add_btn" tool_tip="Dodaj nowy obiekt"/>
- <dnd_button name="trash_btn" tool_tip="Usuń wybrany obiekt"/>
- </panel>
+ <panel.string name="ItemcountCompleted">
+ [ITEM_COUNT] obiekty [FILTER]
+ </panel.string>
+ <text name="ItemcountText">
+ Obiekty:
+ </text>
<menu_bar name="Inventory Menu">
<menu label="Plik" name="File">
<menu_item_call label="Otwórz" name="Open"/>
<menu label="Załaduj" name="upload">
- <menu_item_call label="Obraz (L$[COST])..." name="Upload Image"/>
- <menu_item_call label="Dźwięk (L$[COST])..." name="Upload Sound"/>
- <menu_item_call label="AnimacjÄ™ (L$[COST])..." name="Upload Animation"/>
- <menu_item_call label="Zbiór Plików (L$[COST] za jeden plik)..." name="Bulk Upload"/>
+ <menu_item_call label="obraz (L$[COST])..." name="Upload Image"/>
+ <menu_item_call label="dźwięk (L$[COST])..." name="Upload Sound"/>
+ <menu_item_call label="animacjÄ™ (L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="zbiór plików (L$[COST] za jeden plik)..." name="Bulk Upload"/>
</menu>
<menu_item_call label="Nowe Okno" name="New Window"/>
<menu_item_call label="Pokaż Filtry" name="Show Filters"/>
@@ -30,35 +26,45 @@
<menu_item_call label="Opróżnij Folder Zgubione i Znalezione" name="Empty Lost And Found"/>
</menu>
<menu label="Stwórz" name="Create">
- <menu_item_call label="Nowy Folder" name="New Folder"/>
- <menu_item_call label="Nowy Skrypt" name="New Script"/>
- <menu_item_call label="NowÄ… NotÄ™" name="New Note"/>
- <menu_item_call label="NowÄ… GesturkÄ™" name="New Gesture"/>
+ <menu_item_call label="Nowy folder" name="New Folder"/>
+ <menu_item_call label="Nowy skrypt" name="New Script"/>
+ <menu_item_call label="Nowa nota" name="New Note"/>
+ <menu_item_call label="Nowy gest" name="New Gesture"/>
<menu label="Nowe Ubranie" name="New Clothes">
- <menu_item_call label="NowÄ… KoszulkÄ™" name="New Shirt"/>
- <menu_item_call label="Nowe Spodnie" name="New Pants"/>
- <menu_item_call label="Nowe Buty" name="New Shoes"/>
- <menu_item_call label="Nowe Skarpetki" name="New Socks"/>
- <menu_item_call label="NowÄ… KurtkÄ™" name="New Jacket"/>
- <menu_item_call label="Nową Spódnicę" name="New Skirt"/>
- <menu_item_call label="Nowe Rękawiczki" name="New Gloves"/>
- <menu_item_call label="Nowy Podkoszulek" name="New Undershirt"/>
- <menu_item_call label="NowÄ… BieliznÄ™" name="New Underpants"/>
- <menu_item_call label="Nowe Ubranie Przezroczyste" name="New Alpha"/>
- <menu_item_call label="Nowy Tatuaż" name="New Tattoo"/>
+ <menu_item_call label="NowÄ… kkoszulkÄ™" name="New Shirt"/>
+ <menu_item_call label="Nowe spodnie" name="New Pants"/>
+ <menu_item_call label="Nowe buty" name="New Shoes"/>
+ <menu_item_call label="Nowe skarpetki" name="New Socks"/>
+ <menu_item_call label="NowÄ… kurtkÄ™" name="New Jacket"/>
+ <menu_item_call label="Nową spódnicę" name="New Skirt"/>
+ <menu_item_call label="Nowe rękawiczki" name="New Gloves"/>
+ <menu_item_call label="Nowy podkoszulek" name="New Undershirt"/>
+ <menu_item_call label="NowÄ… bieliznÄ™" name="New Underpants"/>
+ <menu_item_call label="Nowe ubranie Alpha" name="New Alpha"/>
+ <menu_item_call label="Nowy tatuaż" name="New Tattoo"/>
</menu>
<menu label="Nową Część Ciała" name="New Body Parts">
- <menu_item_call label="Nowy Kształt" name="New Shape"/>
- <menu_item_call label="Nową Skórkę" name="New Skin"/>
- <menu_item_call label="Nowe Włosy" name="New Hair"/>
- <menu_item_call label="Nowe Oczy" name="New Eyes"/>
+ <menu_item_call label="Nowy kształt" name="New Shape"/>
+ <menu_item_call label="Nową skórkę" name="New Skin"/>
+ <menu_item_call label="Nowe włosy" name="New Hair"/>
+ <menu_item_call label="Nowe oczy" name="New Eyes"/>
</menu>
</menu>
<menu label="UporzÄ…dkuj" name="Sort">
- <menu_item_check label="Wegług Nazwy" name="By Name"/>
- <menu_item_check label="Według Daty" name="By Date"/>
+ <menu_item_check label="Wegług bazwy" name="By Name"/>
+ <menu_item_check label="Według daty" name="By Date"/>
<menu_item_check label="Foldery zawsze według nazwy" name="Folders Always By Name"/>
- <menu_item_check label="Foldery Systemowe od Góry" name="System Folders To Top"/>
+ <menu_item_check label="Foldery Systemowe od góry" name="System Folders To Top"/>
</menu>
</menu_bar>
+ <filter_editor label="Filtr" name="inventory search editor"/>
+ <tab_container name="inventory filter tabs">
+ <inventory_panel label="Wszystkie obiekty" name="All Items"/>
+ <inventory_panel label="Ostatnio dodane obiekty" name="Recent Items"/>
+ </tab_container>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Pokaż dodatkowe opcje"/>
+ <button name="add_btn" tool_tip="Dodaj nowy obiekt"/>
+ <dnd_button name="trash_btn" tool_tip="Usuń wybrany obiekt"/>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_me.xml b/indra/newview/skins/default/xui/pl/panel_me.xml
new file mode 100644
index 0000000000..72a5f51520
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_me.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Mój Profil" name="panel_me">
+ <tab_container name="tabs">
+ <panel label="PROFIL" name="panel_profile"/>
+ <panel label="ULUBIONE" name="panel_picks"/>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_media_settings_general.xml b/indra/newview/skins/default/xui/pl/panel_media_settings_general.xml
new file mode 100644
index 0000000000..03b063ddfe
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_media_settings_general.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Ogólne" name="Media Settings General">
+ <text name="home_label">
+ Strona Domowa:
+ </text>
+ <text name="home_fails_whitelist_label">
+ (ta strona nie została zaakceptowana przez filtr listy dostępowej)
+ </text>
+ <line_editor name="home_url" tool_tip="Strona domowa dla źródla mediów"/>
+ <text name="preview_label">
+ Pokaż
+ </text>
+ <text name="current_url_label">
+ Obecna Strona:
+ </text>
+ <text name="current_url" tool_tip="The current page for this media source" value=""/>
+ <button label="Zresetuj" name="current_url_reset_btn"/>
+ <check_box initial_value="false" label="Pętla" name="auto_loop"/>
+ <check_box initial_value="false" label="Interakcja Kliknięcia" name="first_click_interact"/>
+ <check_box initial_value="false" label="Autopowiększenie" name="auto_zoom"/>
+ <check_box initial_value="false" label="Automatyczne Odtwarzanie Mediów" name="auto_play"/>
+ <text name="media_setting_note">
+ Pamiętaj: Rezydenci mogą zmienić to ustawienie
+ </text>
+ <check_box initial_value="false" label="Automatyczne dopasowanie mediów na twarzy lub obiekcie" name="auto_scale"/>
+ <text name="size_label">
+ Rozmiar:
+ </text>
+ <text name="X_label">
+ X
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/pl/panel_media_settings_permissions.xml
new file mode 100644
index 0000000000..939bcbbb42
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_media_settings_permissions.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Dopasuj" name="Media settings for controls">
+ <text name="controls_label">
+ Ustawienia:
+ </text>
+ <combo_box name="controls">
+ <combo_item name="Standard">
+ Standardowe
+ </combo_item>
+ <combo_item name="Mini">
+ Mini
+ </combo_item>
+ </combo_box>
+ <check_box initial_value="false" label="Pozwól na nawigację &amp; interaktywność" name="perms_owner_interact"/>
+ <check_box initial_value="false" label="Pokaż Pasek Kontroli" name="perms_owner_control"/>
+ <check_box initial_value="false" label="Pozwól na nawigację &amp; Interaktywność" name="perms_group_interact"/>
+ <check_box initial_value="false" label="Pokaż Pasek Kontroli" name="perms_group_control"/>
+ <check_box initial_value="false" label="Pozwól na nawigację &amp; interaktywność" name="perms_anyone_interact"/>
+ <check_box initial_value="false" label="Pokaż Pasek Kontroli" name="perms_anyone_control"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_media_settings_security.xml b/indra/newview/skins/default/xui/pl/panel_media_settings_security.xml
new file mode 100644
index 0000000000..da3142b54e
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_media_settings_security.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Ochrona" name="Media Settings Security">
+ <check_box initial_value="false" label="Dostęp dozwolony tylko dla wybranych URL" name="whitelist_enable"/>
+ <text name="home_url_fails_some_items_in_whitelist">
+ Wejścia na stronę WWW, które się nie powiodły są zaznaczone:
+ </text>
+ <button label="Dodaj" name="whitelist_add"/>
+ <button label="Usuń" name="whitelist_del"/>
+ <text name="home_url_fails_whitelist">
+ UWAGA: WWW wyszczególnione w Ogólne nie przeszły Białej Listy. Została ona wyłączona dopóki poprawny zapis nie zostanie dodany.
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_my_profile.xml b/indra/newview/skins/default/xui/pl/panel_my_profile.xml
new file mode 100644
index 0000000000..7ca762b825
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_my_profile.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Profil" name="panel_profile">
+ <string name="no_partner_text" value="Żadne"/>
+ <string name="no_group_text" value="Żadne"/>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <layout_stack name="layout">
+ <layout_panel name="profile_stack">
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="second_life_image_panel">
+ <icon label="" name="2nd_life_edit_icon" tool_tip="Kliknij przycisk Edytuj Profil by zmienić zdjęcie"/>
+ <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <icon label="" name="real_world_edit_icon" tool_tip="Kliknij przycisk Edytuj Profil by zmienić zdjęcie"/>
+ <text name="title_rw_descr_text" value="Życie#1:"/>
+ </panel>
+ <text name="title_member_text" value="Urodziny:"/>
+ <text name="title_acc_status_text" value="Konto:"/>
+ <text name="title_partner_text" value="Partner:"/>
+ <panel name="partner_data_panel">
+ <name_box initial_value="(przetwarzanie)" name="partner_text"/>
+ </panel>
+ <text name="title_groups_text" value="Grupy:"/>
+ </panel>
+ </scroll_container>
+ </layout_panel>
+ <layout_panel name="profile_me_buttons_panel">
+ <button label="Edytuj Profil" name="edit_profile_btn" tool_tip="Edytuj swoje dane"/>
+ <button label="Edytuj Wygląd" name="edit_appearance_btn" tool_tip="Stwórz/edytuj swój wygląd: dane fizyczne, ubrania itp."/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_navigation_bar.xml b/indra/newview/skins/default/xui/pl/panel_navigation_bar.xml
new file mode 100644
index 0000000000..b01e686c41
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_navigation_bar.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="navigation_bar">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="Wróć do poprzedniej lokalizacji"/>
+ <pull_button name="forward_btn" tool_tip="Idź do następnej lokalizacji"/>
+ <button name="home_btn" tool_tip="Teleportuj do miejsca startu"/>
+ <location_input label="Lokalizacja" name="location_combo"/>
+ <search_combo_box label="Szukaj" name="search_combo_box" tool_tip="Szukaj">
+ <combo_editor label="Szukaj [SECOND_LIFE]" name="search_combo_editor"/>
+ </search_combo_box>
+ </panel>
+ <favorites_bar name="favorite" tool_tip="Przeciągnij swoje landmarki tutaj by szybko dostać się do swoich ulubionych miejsc w Second Life!">
+ <label name="favorites_bar_label" tool_tip="Przeciągnij swoje landmarki tutaj by szybko dostać się do swoich ulubionych miejsc w Second Life!">
+ Pasek Ulubionych
+ </label>
+ <chevron_button name="&gt;&gt;" tool_tip="Pokaż więcej Moich Ulubionych"/>
+ </favorites_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_nearby_chat.xml b/indra/newview/skins/default/xui/pl/panel_nearby_chat.xml
new file mode 100644
index 0000000000..bcecaeabb3
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- All our XML is utf-8 encoded. -->
+<panel name="nearby_chat">
+ <panel name="chat_caption">
+ <text name="sender_name">
+ CZAT LOKALNY
+ </text>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/pl/panel_nearby_chat_bar.xml
new file mode 100644
index 0000000000..2d1decd960
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_nearby_chat_bar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chat_bar">
+ <string name="min_width">
+ 192
+ </string>
+ <string name="max_width">
+ 320
+ </string>
+ <line_editor label="Kliknij tutaj aby rozmawiać." name="chat_box" tool_tip="Naciśnij Enter aby mówić, Ctrl + Enter aby krzyknąć"/>
+ <button name="show_nearby_chat" tool_tip="Pokazuje/ukrywa pobliski Czat"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_nearby_media.xml b/indra/newview/skins/default/xui/pl/panel_nearby_media.xml
new file mode 100644
index 0000000000..a05c0d856f
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_nearby_media.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_media">
+ <string name="empty_item_text">
+ &lt;empty&gt;
+ </string>
+ <string name="parcel_media_name">
+ Strumień Mediów Posiadłości
+ </string>
+ <string name="parcel_audio_name">
+ Strumień Audio Posiadłości
+ </string>
+ <string name="playing_suffix">
+ (odtwarzanie)
+ </string>
+ <panel name="minimized_controls">
+ <button label="Zatrzymaj" name="all_nearby_media_disable_btn" tool_tip="Wyłącz wszystkie media w pobliżu"/>
+ <button label="Włącz" name="all_nearby_media_enable_btn" tool_tip="Włącz wszystkie media w pobliżu"/>
+ <button name="open_prefs_btn" tool_tip="Uruchom preferencje medialne"/>
+ <button label="Więcej &gt;&gt;" label_selected="Mniej &lt;&lt;" name="more_less_btn" tool_tip="Zaawansowane"/>
+ </panel>
+ <panel name="nearby_media_panel">
+ <text name="nearby_media">
+ Media w pobliżu
+ </text>
+ <text name="show">
+ Pokaż:
+ </text>
+ <combo_box name="show_combo">
+ <combo_box.item label="Wszystkie" name="All"/>
+ <combo_box.item label="Na obecnej Parceli" name="WithinParcel"/>
+ <combo_box.item label="Poza Posiadłością" name="OutsideParcel"/>
+ <combo_box.item label="Na innych awatarach" name="OnOthers"/>
+ </combo_box>
+ <scroll_list name="media_list">
+ <scroll_list.columns label="Dokładność" name="media_proximity"/>
+ <scroll_list.columns label="Widoczność" name="media_visibility"/>
+ <scroll_list.columns label="Klasa" name="media_class"/>
+ <scroll_list.columns label="Nazwa" name="media_name"/>
+ <scroll_list.columns label="Debugowanie" name="media_debug"/>
+ </scroll_list>
+ <panel name="media_controls_panel">
+ <layout_stack name="media_controls">
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="Zatrzymaj wybrane media"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="Odtwarzaj wybrane media"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="Zatrzymaj wybrane media"/>
+ </layout_panel>
+ <layout_panel name="volume_slider_ctrl">
+ <slider_bar initial_value="0.5" name="volume_slider" tool_tip="Regulacja audio dla wybranych mediów"/>
+ </layout_panel>
+ <layout_panel name="mute">
+ <button name="mute_btn" tool_tip="Wycisz audio wybranych mediów"/>
+ </layout_panel>
+ <layout_panel name="zoom">
+ <button name="zoom_btn" tool_tip="Przybliż do wybranych mediów"/>
+ </layout_panel>
+ <layout_panel name="unzoom">
+ <button name="unzoom_btn" tool_tip="Oddal od wybranych mediów"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_notes.xml b/indra/newview/skins/default/xui/pl/panel_notes.xml
new file mode 100644
index 0000000000..35cb7e1bce
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_notes.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Notatki &amp; Prywatność" name="panel_notes">
+ <layout_stack name="layout">
+ <panel name="notes_stack">
+ <scroll_container name="profile_scroll">
+ <panel name="profile_scroll_panel">
+ <text name="status_message" value="Notatki:"/>
+ <text name="status_message2" value="Pozwól tej osobie na:"/>
+ <check_box label="Widzenie mojego statusu" name="status_check"/>
+ <check_box label="Lokalizowanie mnie na mapie" name="map_check"/>
+ <check_box label="Edytowanie, kasowanie lub zabieranie moich obiektów" name="objects_check"/>
+ </panel>
+ </scroll_container>
+ </panel>
+ <panel name="notes_buttons_panel">
+ <button label="Dodaj do znajomych" name="add_friend" tool_tip="Zaoferuj znajomość Rezydentowi"/>
+ <button label="IM" name="im" tool_tip="Otwórz wiadomości IM"/>
+ <button label="Dzwoń" name="call" tool_tip="Zadzwoń do Rezydenta"/>
+ <button label="Mapa" name="show_on_map_btn" tool_tip="Pokaż Rezydenta na mapie"/>
+ <button label="Teleportuj" name="teleport" tool_tip="Teleportuj"/>
+ </panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_online_status.xml b/indra/newview/skins/default/xui/pl/panel_online_status.xml
new file mode 100644
index 0000000000..fdc489f375
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_online_status.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="friend_online_status" name="friend_online_status"/>
diff --git a/indra/newview/skins/default/xui/pl/panel_online_status_toast.xml b/indra/newview/skins/default/xui/pl/panel_online_status_toast.xml
new file mode 100644
index 0000000000..fdc489f375
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_online_status_toast.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="friend_online_status" name="friend_online_status"/>
diff --git a/indra/newview/skins/default/xui/pl/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/pl/panel_outfits_inventory.xml
new file mode 100644
index 0000000000..5e7fd46754
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_outfits_inventory.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Rzeczy" name="Outfits">
+ <tab_container name="appearance_tabs">
+ <inventory_panel label="MOJE UBRANIA" name="outfitslist_tab"/>
+ <inventory_panel label="ZAÅOÅ»ONE" name="cof_tab"/>
+ </tab_container>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Pokaż opcje dodatkowe"/>
+ <dnd_button name="trash_btn" tool_tip="Usuń zaznaczony obiekt"/>
+ <button label="Zapisz Ubranie" name="make_outfit_btn" tool_tip="Zapisz wyglÄ…d jako ubranie"/>
+ <button label="Ubierz" name="wear_btn" tool_tip="Ubierz wybrany obiekt"/>
+ <button label="M" name="look_edit_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/pl/panel_outfits_inventory_gear_default.xml
new file mode 100644
index 0000000000..5b77c390ca
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_outfits_inventory_gear_default.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gear_default">
+ <menu_item_call label="ZastÄ…p Obecne Ubranie" name="wear"/>
+ <menu_item_call label="Dodaj do Obecnego Ubrania" name="add"/>
+ <menu_item_call label="Usuń z Obecnego Ubrania" name="remove"/>
+ <menu_item_call label="Zmień nazwę" name="rename"/>
+ <menu_item_call label="Usuń Link" name="remove_link"/>
+ <menu_item_call label="Usuń Ubranie" name="delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pl/panel_people.xml b/indra/newview/skins/default/xui/pl/panel_people.xml
new file mode 100644
index 0000000000..09958c84d6
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_people.xml
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray panel -->
+<panel label="Ludzie" name="people_panel">
+ <string name="no_people" value="Brak ludzi"/>
+ <string name="no_one_near" value="Nikogo w pobliżu"/>
+ <string name="no_friends_online" value="Brak dostępnych Znajomych"/>
+ <string name="no_friends" value="Brak Znajomych"/>
+ <string name="people_filter_label" value="Filtruj Ludzi"/>
+ <string name="groups_filter_label" value="Filtruj Grupy"/>
+ <string name="no_filtered_groups_msg" value="[secondlife:///app/search/groups Może spróbuj odnaleźć Grupę korzystając z Szukaj?]"/>
+ <string name="no_groups_msg" value="[secondlife:///app/search/groups Spróbuj wyszukać grupy aby do nich dołączyć.]"/>
+ <filter_editor label="Filtr" name="filter_input"/>
+ <tab_container name="tabs">
+ <panel label="W POBLIŻU" name="nearby_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="nearby_view_sort_btn" tool_tip="Opcje"/>
+ <button name="add_friend_btn" tool_tip="Dodaj wybranego Rezydenta do Znajomych"/>
+ </panel>
+ </panel>
+ <panel label="ZNAJOMI" name="friends_panel">
+ <accordion name="friends_accordion">
+ <accordion_tab name="tab_online" title="Dostępni"/>
+ <accordion_tab name="tab_all" title="Wszyscy"/>
+ </accordion>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="friends_viewsort_btn" tool_tip="Opcje"/>
+ <button name="add_btn" tool_tip="Zaproponuj znajomość"/>
+ <button name="del_btn" tool_tip="Usuń wybraną osobę ze swojej listy znajomych"/>
+ </panel>
+ <text name="no_friends_msg">
+ By dodać nową znajomość skorzystaj ze strony [secondlife:///app/search/people ogólne wyszukiwanie] lub kliknij prawym przyciskiem myszki na Rezydenta by wysłać mu zaproszenie.
+Jeżeli szukasz ludzi, z którymi można się spotkać, kliknij tutaj [secondlife:///app/worldmap skorzystaj z mapy].
+ </text>
+ </panel>
+ <panel label="GRUPY" name="groups_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="groups_viewsort_btn" tool_tip="Opcje"/>
+ <button name="plus_btn" tool_tip="Dołącz do grupy/Stwórz nową grupę"/>
+ <button name="activate_btn" tool_tip="Aktywuj wybranÄ… grupÄ™"/>
+ </panel>
+ </panel>
+ <panel label="OSTATNIE" name="recent_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="recent_viewsort_btn" tool_tip="Opcje"/>
+ <button name="add_friend_btn" tool_tip="Dodaj wybranego Rezydenta do Znajomych"/>
+ </panel>
+ </panel>
+ </tab_container>
+ <panel name="button_bar">
+ <button width="55" label="Profil" name="view_profile_btn" tool_tip="Pokaż zdjęcie, grupy i inne informacje o Rezydencie"/>
+ <button width="35" label="IM" name="im_btn" tool_tip="Rozpocznij rozmowÄ™ prywatnÄ… (IM)"/>
+ <button width="62" label="Zadzwoń" name="call_btn" tool_tip="Zadzwoń do tego Rezydenta"/>
+ <button width="72" label="Podziel siÄ™" name="share_btn"/>
+ <button width="70" label="Teleportuj" name="teleport_btn" tool_tip="Zaproponuj teleportacjÄ™"/>
+ <button width="69" label="Profil grupy" name="group_info_btn" tool_tip="Pokaż informacje o grupie"/>
+ <button width="124" label="Konferencja Grupowa" name="chat_btn" tool_tip="Rozpocznij konferencÄ™"/>
+ <button width="108" label="Rozmowa Głosowa" name="group_call_btn" tool_tip="Rozmowa Głosowa w tej Grupie"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_pick_info.xml b/indra/newview/skins/default/xui/pl/panel_pick_info.xml
new file mode 100644
index 0000000000..0454ecc430
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_pick_info.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_pick_info">
+ <text name="title" value="Info o Ulubionych"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="pick_name" value="[name]"/>
+ <text name="pick_location" value="[loading...]"/>
+ <text name="pick_desc" value="[description]"/>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <button label="Teleportuj" name="teleport_btn"/>
+ <button label="Mapa" name="show_on_map_btn"/>
+ <button label="Edytuj" name="edit_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_picks.xml b/indra/newview/skins/default/xui/pl/panel_picks.xml
new file mode 100644
index 0000000000..5d69c25ff3
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_picks.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Ulubione" name="panel_picks">
+ <string name="no_picks" value="Brak Ulubionych"/>
+ <string name="no_classifieds" value="Brak Reklam"/>
+ <text name="empty_picks_panel_text">
+ Brak ulubionych/reklam w tym miejscu
+ </text>
+ <accordion name="accordion">
+ <accordion_tab name="tab_picks" title="Ulubione"/>
+ <accordion_tab name="tab_classifieds" title="Reklamy"/>
+ </accordion>
+ <panel label="bottom_panel" name="edit_panel">
+ <button name="new_btn" tool_tip="Stwórz w obecnym miejscu nową zakładkę w ulubionych lub reklamę"/>
+ </panel>
+ <panel name="buttons_cucks">
+ <button label="Info" name="info_btn" tool_tip="Pokaż info o ulubionych"/>
+ <button label="Teleportuj" name="teleport_btn" tool_tip="Teleportuj do odpowiadajÄ…cego miejsca"/>
+ <button label="Mapa" name="show_on_map_btn" tool_tip="Pokaż odpowiadające miejsce w Mapie Świata"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_place_profile.xml b/indra/newview/skins/default/xui/pl/panel_place_profile.xml
new file mode 100644
index 0000000000..3714a141db
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_place_profile.xml
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="place_profile">
+ <string name="on" value="Włącz"/>
+ <string name="off" value="Wyłącz"/>
+ <string name="anyone" value="Każdy"/>
+ <string name="available" value="dostępny"/>
+ <string name="allocated" value="przydzielony"/>
+ <string name="title_place" value="Profil Miejsca"/>
+ <string name="title_teleport_history" value="Historia teleportacji"/>
+ <string name="not_available" value="(brak)"/>
+ <string name="unknown" value="(nieznany)"/>
+ <string name="public" value="(publiczny)"/>
+ <string name="none_text" value="(żaden)"/>
+ <string name="sale_pending_text" value="(Sprzedaż w Toku Realizacji)"/>
+ <string name="group_owned_text" value="(Własność Grupy)"/>
+ <string name="price_text" value="L$"/>
+ <string name="area_text" value="m²"/>
+ <string name="all_residents_text" value="Każdemu"/>
+ <string name="group_text" value="Grupie"/>
+ <string name="can_resell">
+ Posiadłość zakupiona w tym regionie może być odsprzedana.
+ </string>
+ <string name="can_not_resell">
+ Posiadłość zakupiona w tym regionie nie może być odsprzedana.
+ </string>
+ <string name="can_change">
+ Posiadłość zakupiona w tym regionie może być łączona/dzielona.
+ </string>
+ <string name="can_not_change">
+ Posiadłość zakupiona w tym regionie nie może być łączona/dzielona.
+ </string>
+ <string name="server_update_text">
+ Informacje o tym miejscu nie będą dostępne bez aktualizacji serwera.
+ </string>
+ <string name="server_error_text">
+ Informacje o tym miejscu są obecnie niedostępne, spróbuj później.
+ </string>
+ <string name="server_forbidden_text">
+ Dostęp do informacji o tym miejscu jest ograniczony. Zweryfikuj swoje przywileje z właścicielem posiadłości.
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </string>
+ <button name="back_btn" tool_tip="Cofnij"/>
+ <text name="title" value="Profil Miejsca"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="owner_label" value="Właściciel:"/>
+ <text name="maturity_value" value="nieznany"/>
+ <accordion name="advanced_info_accordion">
+ <accordion_tab name="parcel_characteristics_tab" title="Posiadłość">
+ <panel name="parcel_characteristics_panel">
+ <text name="rating_label" value="Rodzaj:"/>
+ <text name="rating_value" value="nieznane"/>
+ <text name="voice_label" value="Komunikacja Głosowa:"/>
+ <text name="voice_value" value="Włączone"/>
+ <text name="fly_label" value="Lataj:"/>
+ <text name="fly_value" value="Włączone"/>
+ <text name="push_label" value="Popchnięcia:"/>
+ <text name="push_value" value="Wyłączone"/>
+ <text name="build_label" value="Budowanie:"/>
+ <text name="build_value" value="Włączone"/>
+ <text name="scripts_label" value="Skrypty:"/>
+ <text name="scripts_value" value="Włączone"/>
+ <text name="damage_label" value="Zniszczenia:"/>
+ <text name="damage_value" value="Wyłączone"/>
+ <button label="O Posiadłości" name="about_land_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="region_information_tab" title="Region">
+ <panel name="region_information_panel">
+ <text name="region_name_label" value="Region:"/>
+ <text name="region_name" value="Mooseland"/>
+ <text name="region_type_label" value="Typ:"/>
+ <text name="region_type" value="Moose"/>
+ <text name="region_rating_label" value="Rodzaj:"/>
+ <text name="region_rating" value="Adult"/>
+ <text name="region_owner_label" value="Właściciel:"/>
+ <text name="region_owner" value="moose Van Moose"/>
+ <text name="region_group_label" value="Grupa:"/>
+ <text name="region_group">
+ The Mighty Moose of mooseville soundvillemoose
+ </text>
+ <button label="Region/MajÄ…tek" name="region_info_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="estate_information_tab" title="MajÄ…tek">
+ <panel name="estate_information_panel">
+ <text name="estate_name_label" value="MajÄ…tek:"/>
+ <text name="estate_rating_label" value="Rodzaj:"/>
+ <text name="estate_owner_label" value="Właściciel:"/>
+ <text name="covenant_label" value="Umowa:"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="sales_tab" title="Na Sprzedaż">
+ <panel name="sales_panel">
+ <text name="sales_price_label" value="Cena:"/>
+ <text name="area_label" value="Powierzchnia:"/>
+ <text name="traffic_label" value="Ruch:"/>
+ <text name="primitives_label" value="Primy:"/>
+ <text name="parcel_scripts_label" value="Skrypty:"/>
+ <text name="terraform_limits_label" value="Ograniczenia terraformingu:"/>
+ <text name="subdivide_label" value="Podziel/Złącz:"/>
+ <text name="resale_label" value="Możliwość sprzedaży:"/>
+ <text name="sale_to_label" value="Na sprzedaż:"/>
+ </panel>
+ </accordion_tab>
+ </accordion>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_places.xml b/indra/newview/skins/default/xui/pl/panel_places.xml
new file mode 100644
index 0000000000..c7f3f00d98
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_places.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Miejsca" name="places panel">
+ <string name="landmarks_tab_title" value="MOJE LANDMARKI"/>
+ <string name="teleport_history_tab_title" value="HISTORIA TELEPORTÓW"/>
+ <filter_editor label="Filtruj Moje Miejsca" name="Filter"/>
+ <panel name="button_panel">
+ <button label="Teleportuj" name="teleport_btn" tool_tip="Teleportuj do wybranego miejsca"/>
+ <button label="Mapa" name="map_btn"/>
+ <button label="Edytuj" name="edit_btn" tool_tip="Edytuj informacje landmarka"/>
+ <button label="▼" name="overflow_btn" tool_tip="Pokaż opcje dodatkowe"/>
+ <button label="Zamknij" name="close_btn"/>
+ <button label="Anuluj" name="cancel_btn"/>
+ <button label="Zapisz" name="save_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml
index c3bd66274b..9905bbbc18 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_advanced.xml
@@ -1,48 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
-<panel name="advanced">
- <panel.string name="resolution_format">
- [RES_X] x [RES_Y]
- </panel.string>
+<panel label="Zaawansowane" name="advanced">
<panel.string name="aspect_ratio_text">
[NUM]:[DEN]
</panel.string>
- <check_box label="Czat Chmurkowy" name="bubble_text_chat"/>
- <color_swatch name="background" tool_tip="Wybierz kolor czatu w chmurce"/>
- <slider label="Intensywność" name="bubble_chat_opacity"/>
- <text name="AspectRatioLabel1" tool_tip="width / height">
- Proporcje
- </text>
- <combo_box name="aspect_ratio" tool_tip="width / height">
- <combo_box.item label="4:3 (Standardowy CRT)" name="item1"/>
- <combo_box.item label="5:4 (1280x1024 LCD)" name="item2"/>
- <combo_box.item label="8:5 (Panoramiczny)" name="item3"/>
- <combo_box.item label="16:9 (Panoramiczny)" name="item4"/>
- </combo_box>
- <check_box label="Automatyczne Wykrywanie" name="aspect_auto_detect"/>
- <text name="heading1">
- Kamery:
- </text>
- <slider label="KÄ…t Widoku" name="camera_fov"/>
+ <panel.string name="middle_mouse">
+ Åšrodkowy klawisz myszki
+ </panel.string>
+ <slider label="KÄ…t widoku" name="camera_fov"/>
<slider label="Odległość" name="camera_offset_scale"/>
<text name="heading2">
- Automatyczne pozycjonowanie dla:
+ Automatyczna pozycja dla:
</text>
<check_box label="Buduj/Edytuj" name="edit_camera_movement" tool_tip="Używaj automatycznego pozycjonowania kamery aktywując i deaktywując tryb edycji"/>
<check_box label="Wygląd" name="appearance_camera_movement" tool_tip="Używaj automatycznego pozycjonowania kamery podczas trybu edycji"/>
- <text name="heading3">
- Awatary:
- </text>
<check_box label="Pokaż w trybie widoku panoramicznego" name="first_person_avatar_visible"/>
<check_box label="Aktywacja klawiszy strzałek do poruszania awatarem" name="arrow_keys_move_avatar_check"/>
<check_box label="kliknij-kliknij-przytrzymaj, aby uruchomić" name="tap_tap_hold_to_run"/>
<check_box label="Poruszaj ustami awatara kiedy używana jest komunikacja głosowa" name="enable_lip_sync"/>
- <check_box label="Pokaż błędy skryptów" name="show_script_errors"/>
+ <check_box label="Czat Chmurkowy" name="bubble_text_chat"/>
+ <slider label="Intensywność" name="bubble_chat_opacity"/>
+ <color_swatch name="background" tool_tip="Wybierz kolor czatu w chmurce"/>
+ <check_box label="Pokaż błędy skryptu w:" name="show_script_errors"/>
<radio_group name="show_location">
- <radio_item label="W czacie" name="0"/>
- <radio_item label="W oknie" name="1"/>
+ <radio_item label="Czat Lokalny" name="0"/>
+ <radio_item label="Osobne okno:" name="1"/>
</radio_group>
- <check_box label="Uruchom tryb mówienia przez mikrofon podczas nasiśnięcia przycisku Mów:" name="push_to_talk_toggle_check" tool_tip="Jeżeli jesteś w trybie mówienia, w celu aktywacji lub deaktywacji swojego mikrofonu wybierz i wyłącz przycisk Mów tylko raz. Jeżeli nie jesteś w trybie mówienia, mikrofon przesyła Twój głos tylko w momencie aktywacji pełnej przycisku Mów."/>
+ <check_box label="Włącz/Wyłącz głos:" name="push_to_talk_toggle_check" tool_tip="Jeżeli jesteś w trybie mówienia, w celu aktywacji lub deaktywacji swojego mikrofonu wybierz i wyłącz przycisk Mów tylko raz. Jeżeli nie jesteś w trybie mówienia, mikrofon przesyła Twój głos tylko w momencie aktywacji pełnej przycisku Mów."/>
<line_editor label="Naciśnij Mów by rozpocząć komunikację głosową" name="modifier_combo"/>
<button label="wybierz Klawisz" name="set_voice_hotkey_button"/>
- <button label="Åšrodkowy Przycisk Myszki" name="set_voice_middlemouse_button"/>
+ <button label="Środkowy Przycisk Myszki" name="set_voice_middlemouse_button" tool_tip="Zresetuj do środkowego przycisku myszy"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/pl/panel_preferences_alerts.xml
index 7195c30f20..e843342aa2 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_alerts.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_alerts.xml
@@ -4,11 +4,11 @@
Powiadom mnie:
</text>
<check_box label="Kiedy wydajÄ™ lub otrzymujÄ™ L$" name="notify_money_change_checkbox"/>
- <check_box label="Kiedy moi znajomi siÄ™ logujÄ… lub wylogowujÄ…" name="friends_online_notify_checkbox"/>
+ <check_box label="Kiedy moi Znajomi zalogowujÄ… siÄ™ i wylogowujÄ…" name="friends_online_notify_checkbox"/>
<text name="show_label">
- Zawsze pokazuj te powiadomienia:
+ Zawsze pokazuj:
</text>
<text name="dont_show_label">
- Nigdy nie pokazuj tych powiadomień:
+ Nie pokazuj:
</text>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml
index 5599c21686..ae13cf662f 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml
@@ -1,10 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Czat/IM" name="chat">
+ <text name="font_size">
+ Rozmiar czcionki:
+ </text>
<radio_group name="chat_font_size">
- <radio_item label="Mała" name="radio"/>
- <radio_item label="Åšrednia" name="radio2"/>
- <radio_item label="Duża" name="radio3"/>
+ <radio_item label="Mała" name="radio" value="0"/>
+ <radio_item label="Åšrednia" name="radio2" value="1"/>
+ <radio_item label="Duża" name="radio3" value="2"/>
</radio_group>
+ <text name="font_colors">
+ Kolor czcionki:
+ </text>
<color_swatch label="Ty" name="user"/>
<text name="text_box1">
Ja
@@ -39,4 +45,14 @@
</text>
<check_box initial_value="true" label="Używaj animacji podczas pisania" name="play_typing_animation"/>
<check_box label="Wysyłaj wszystkie wiadomości (IM) na moją skrzynkę pocztową kiedy jestem niedostępny" name="send_im_to_email"/>
+ <text name="show_ims_in_label">
+ Pokaż wiadomości (IM) w:
+ </text>
+ <text name="requires_restart_label">
+ (restart wymagany)
+ </text>
+ <radio_group name="chat_window" tool_tip="Pokaż wiadomości IM osobno lub razem (restart wymagany)">
+ <radio_item label="Osobne okna" name="radio" value="0"/>
+ <radio_item label="Etykiety" name="radio2" value="1"/>
+ </radio_group>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_general.xml b/indra/newview/skins/default/xui/pl/panel_preferences_general.xml
index 97b4975f29..e7134f23c3 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_general.xml
@@ -1,91 +1,67 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Ogólne" name="general_panel">
- <combo_box name="start_location_combo">
- <combo_box.item name="MyHome" tool_tip="Domyślnie loguj mnie do mojego miejsca startu." label="Mój Start"/>
- <combo_box.item name="MyLastLocation" tool_tip="Domyślnie loguj mnie do ostatnio odwiedzonego miejsca." label="Ostatnie Miejsce"/>
- </combo_box>
- <check_box label="Pokaż Miejsce Startu podczas Logowania" name="show_location_checkbox"/>
- <combo_box name="fade_out_combobox">
- <combo_box.item name="Never" label="Nigdy"/>
- <combo_box.item name="Show Temporarily" label="Tymczasowo"/>
- <combo_box.item name="Always" label="Zawsze"/>
- </combo_box>
- <check_box label="Używaj Małych Imion Awatarów" name="small_avatar_names_checkbox"/>
- <check_box label="Nie Wyświetlaj Mojego Imienia" name="show_my_name_checkbox"/>
- <text name="group_titles_textbox">
- Tytuły Grupowe:
- </text>
- <check_box label="Nie Wyświetlaj Żadnych Tytułów Grupowych" name="show_all_title_checkbox"/>
- <check_box label="Nie Wyświetlaj Mojego Tytułu Grupowego" name="show_my_title_checkbox"/>
- <color_swatch label="" name="effect_color_swatch" tool_tip="Selekcja koloru"/>
- <text name="UI Size:">
- Wymiar Interfejsu (UI):
+ <text name="language_textbox">
+ Język:
</text>
- <slider name="ui_scale_slider"/>
- <check_box label="Używaj Skali Nizależnej od Rozdzielczości" name="ui_auto_scale"/>
- <spinner label="Zasypiaj w:" name="afk_timeout_spinner"/>
- <check_box label="Powiadamiaj o Wydatkach i Zarobkach (L$)" name="notify_money_change_checkbox"/>
- <text name="maturity_desired_label">
- Treść:
+ <combo_box name="language_combobox">
+ <combo_box.item label="Domyślny" name="System Default Language"/>
+ <combo_box.item label="English (Angielski)" name="English"/>
+ <combo_box.item label="Dansk (Duński) - Beta" name="Danish"/>
+ <combo_box.item label="Deutsch (Niemiecki) - Beta" name="Deutsch(German)"/>
+ <combo_box.item label="Español (Hiszpański) - Beta" name="Spanish"/>
+ <combo_box.item label="Français (Francuski) - Beta" name="French"/>
+ <combo_box.item label="Italiano (Włoski) - Beta" name="Italian"/>
+ <combo_box.item label="Nederlands (Niderlandzki) - Beta" name="Dutch"/>
+ <combo_box.item label="Polski - Beta" name="Polish"/>
+ <combo_box.item label="Portugués (Portugalski) - Beta" name="Portugese"/>
+ <combo_box.item label="日本語 (Japoński) - Beta" name="(Japanese)"/>
+ </combo_box>
+ <text name="language_textbox2">
+ (Restart wymagany)
</text>
<text name="maturity_desired_prompt">
Chcę uzyskać dostęp do miejsc zakwalifikowanych jako:
</text>
+ <text name="maturity_desired_textbox"/>
<combo_box name="maturity_desired_combobox">
- <combo_box.item name="Desired_Adult" label="&apos;PG&apos;, &apos;Mature&apos; oraz &apos;Adult&apos;"/>
- <combo_box.item name="Desired_Mature" label="&apos;PG&apos; i &apos;Mature&apos;"/>
- <combo_box.item name="Desired_PG" label="&apos;PG&apos;"/>
+ <combo_box.item label="&apos;PG&apos;, &apos;Mature&apos; oraz &apos;Adult&apos;" name="Desired_Adult"/>
+ <combo_box.item label="&apos;PG&apos; i &apos;Mature&apos;" name="Desired_Mature"/>
+ <combo_box.item label="&apos;PG&apos;" name="Desired_PG"/>
</combo_box>
- <text name="maturity_desired_textbox">
- &apos;PG&apos;
- </text>
<text name="start_location_textbox">
Miejsce Startu:
</text>
- <text name="show_names_textbox">
+ <combo_box name="start_location_combo">
+ <combo_box.item label="Ostatnie Miejsce" name="MyLastLocation" tool_tip="Domyślnie loguj mnie do ostatnio odwiedzonego miejsca."/>
+ <combo_box.item label="Mój Start" name="MyHome" tool_tip="Domyślnie loguj mnie do mojego miejsca startu."/>
+ </combo_box>
+ <check_box initial_value="true" label="Pokaż przy zalogowaniu" name="show_location_checkbox"/>
+ <text name="name_tags_textbox">
Imiona:
</text>
+ <radio_group name="Name_Tag_Preference">
+ <radio_item label="Wyłącz" name="radio" value="0"/>
+ <radio_item label="Włącz" name="radio2" value="1"/>
+ <radio_item label="Pokaż w skrócie" name="radio3" value="2"/>
+ </radio_group>
+ <check_box label="Wyświetl moje imię:" name="show_my_name_checkbox1"/>
+ <check_box initial_value="true" label="Używaj Małych Imion Awatarów" name="small_avatar_names_checkbox"/>
+ <check_box label="Wyświetl Tytuł Grupowy" name="show_all_title_checkbox1"/>
<text name="effects_color_textbox">
- Kolor dla Moich Efektów:
- </text>
- <text name="seconds_textbox">
- sekund
- </text>
- <text name="crash_report_textbox">
- Zgłaszanie Błędów:
- </text>
- <text name="language_textbox">
- Język:
+ Kolor moich efektów:
</text>
- <text name="language_textbox2">
- (Restart wymagany)
+ <text name="title_afk_text">
+ Zasypiaj w czasie:
</text>
- <string name="region_name_prompt">
- &lt;Wpisz Region&gt;
- </string>
- <combo_box name="crash_behavior_combobox">
- <combo_box.item name="Askbeforesending" label="Pytaj przed wysłaniem"/>
- <combo_box.item name="Alwayssend" label="Zawsze wysyłaj"/>
- <combo_box.item name="Neversend" label="Nigdy nie wysyłaj"/>
- </combo_box>
- <combo_box name="language_combobox">
- <combo_box.item name="System Default Language" label="Domyślny"/>
- <combo_box.item name="English" label="English (Angielski)"/>
- <combo_box.item name="Danish" label="Dansk (Duński) - Beta"/>
- <combo_box.item name="Deutsch(German)" label="Deutsch (Niemiecki) - Beta"/>
- <combo_box.item name="Spanish" label="Español (Hiszpański) - Beta"/>
- <combo_box.item name="French" label="Français (Francuski) - Beta"/>
- <combo_box.item name="Italian" label="Italiano (Włoski) - Beta"/>
- <combo_box.item name="Hungarian" label="Magyar (Węgierski) - Beta"/>
- <combo_box.item name="Dutch" label="Nederlands (Niderlandzki) - Beta"/>
- <combo_box.item name="Polish" label="Polski - Beta"/>
- <combo_box.item name="Portugese" label="Portugués (Portugalski) - Beta"/>
- <combo_box.item name="Russian" label="РуÑÑкий (Rosyjski) - Beta"/>
- <combo_box.item name="Turkish" label="Türkçe (Turecki) - Beta"/>
- <combo_box.item name="Ukrainian" label="УкраїнÑька (UkraiÅ„ski) - Beta"/>
- <combo_box.item name="Chinese" label="中文 (简体) (Chiński) - Beta"/>
- <combo_box.item name="(Japanese)" label="日本語 (Japoński) - Beta"/>
- <combo_box.item name="(Korean)" label="한국어 (Koreański) - Beta"/>
+ <color_swatch label="" name="effect_color_swatch" tool_tip="Selekcja koloru"/>
+ <combo_box label="Czas Trybu Oddalenia:" name="afk">
+ <combo_box.item label="2 minuty" name="item0"/>
+ <combo_box.item label="5 minut" name="item1"/>
+ <combo_box.item label="10 minut" name="item2"/>
+ <combo_box.item label="30 minut" name="item3"/>
+ <combo_box.item label="nigdy" name="item4"/>
</combo_box>
- <check_box label="Język znany publicznie" name="language_is_public" tool_tip="Pozwala obiektom w świecie poznać Twój wybór język."/>
+ <text name="text_box3">
+ Odpowiedź w trybie pracy:
+ </text>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml
index ddd4c736d6..bc08e025dd 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_graphics1.xml
@@ -1,42 +1,18 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Grafika" name="Display panel">
- <button label="?" name="GraphicsPreferencesHelpButton" />
- <check_box label="Uruchom Second Life w oknie" name="windowed mode" />
- <text_editor name="FullScreenInfo">
- Wyłączone = klient uruchamiany w trybie pełnoekranowym.
- </text_editor>
- <text name="WindowSizeLabel">
- Wymiary Okna:
+ <text name="UI Size:">
+ UI rozmiar:
</text>
- <combo_box name="windowsize combo">
- <combo_box.item name="640x480" label="640x480" />
- <combo_box.item name="800x600" label="800x600" />
- <combo_box.item name="720x480" label="720x480 (NTSC)" />
- <combo_box.item name="768x576" label="768x576 (PAL)" />
- <combo_box.item name="1024x768" label="1024x768" />
- </combo_box>
- <text name="DisplayResLabel">
- Rozdzielczość:
- </text>
- <text name="AspectRatioLabel1" tool_tip="width / height">
- Proporcje:
- </text>
- <combo_box name="aspect_ratio" tool_tip="width / height">
- <combo_box.item name="4:3(StandardCRT)" label="4:3 (Standardowy CRT)" />
- <combo_box.item name="5:4(1280x1024LCD)" label="5:4 (1280x1024 LCD)" />
- <combo_box.item name="8:5(Widescreen)" label="8:5 (Panoramiczny)" />
- <combo_box.item name="16:9(Widescreen)" label="16:9 (Panoramiczny)" />
- </combo_box>
- <check_box label="Detekcja proporcji" name="aspect_auto_detect" />
- <text name="HigherText">
- Jakość i
- </text>
- <text name="QualityText">
- Prędkość:
+ <text name="QualitySpeed">
+ Jakość i prędkość:
</text>
<text name="FasterText">
Prędkość
</text>
+ <text name="BetterText">
+ Lepiej
+ </text>
+ <slider label="" name="QualityPerformanceSelection"/>
<text name="ShadersPrefText">
Niska
</text>
@@ -49,99 +25,82 @@
<text name="ShadersPrefText4">
Super
</text>
- <text name="HigherText2">
- Wyższa
- </text>
- <text name="QualityText2">
- Jakość
- </text>
- <slider label="" name="QualityPerformanceSelection" />
- <check_box label="Zaawansowane" name="CustomSettings" />
- <panel name="CustomGraphics Panel">
- <text name="ShadersText">
- Shadery:
- </text>
- <check_box label="Mapowanie Wypukłości i Połysk" name="BumpShiny" />
- <check_box label="Podstawowe Shadery" name="BasicShaders"
- tool_tip="Wyłączenie tej opcji może naprawić błędy niektórych sterowników graficznych." />
- <check_box label="Shadery Atmosfery" name="WindLightUseAtmosShaders" />
- <check_box label="Odbicia w Wodzie" name="Reflections" />
- <text name="ReflectionDetailText">
- Ustawienia Odbić:
- </text>
- <radio_group name="ReflectionDetailRadio">
- <radio_item name="0" label="Teren i Drzewa" />
- <radio_item name="1" label="Obiekty Statyczne" />
- <radio_item name="2" label="Awatary i Obiekty" />
- <radio_item name="3" label="Wszystko" />
- </radio_group>
- <text name="AvatarRenderingText">
- Prezentacja Awatarów:
- </text>
- <check_box label="Impostoryzacja Awatarowa" name="AvatarImpostors" />
- <check_box label="Skinning" name="AvatarVertexProgram" />
- <check_box label="Ubranie Awatarów" name="AvatarCloth" />
- <text name="DrawDistanceMeterText1">
- m
- </text>
- <text name="DrawDistanceMeterText2">
- m
- </text>
- <slider label="Głębia Rysowania:" name="DrawDistance" />
- <slider label="Liczba CzÄ…steczek:" name="MaxParticleCount" />
- <slider label="Jakość Post-Procesu:" name="RenderPostProcess" />
- <text name="MeshDetailText">
- Szczegóły Meszu:
- </text>
- <slider label=" Obiekty:" name="ObjectMeshDetail" />
- <slider label=" Elastyczne:" name="FlexibleMeshDetail" />
- <slider label=" Drzewa:" name="TreeMeshDetail" />
- <slider label=" Awatary:" name="AvatarMeshDetail" />
- <slider label=" Teren:" name="TerrainMeshDetail" />
- <slider label=" Niebo:" name="SkyMeshDetail" />
- <text name="PostProcessText">
- Mało
- </text>
- <text name="ObjectMeshDetailText">
- Mało
- </text>
- <text name="FlexibleMeshDetailText">
- Mało
- </text>
- <text name="TreeMeshDetailText">
- Mało
- </text>
- <text name="AvatarMeshDetailText">
- Mało
- </text>
- <text name="TerrainMeshDetailText">
- Mało
- </text>
- <text name="SkyMeshDetailText">
- Mało
- </text>
- <text name="LightingDetailText">
- Ustawienia Światła:
- </text>
- <radio_group name="LightingDetailRadio">
- <radio_item name="SunMoon" label="Tylko Słońce i Księżyc" />
- <radio_item name="LocalLights" label="Tylko Bliskie Światła" />
- </radio_group>
- <text name="TerrainDetailText">
- Szczgóły Terenu:
- </text>
- <radio_group name="TerrainDetailRadio">
- <radio_item name="0" label="Mało" />
- <radio_item name="2" label="Dużo" />
- </radio_group>
+ <panel label="CustomGraphics" name="CustomGraphics Panel">
+ <text name="ShadersText">
+ Cieniowanie pixeli (shadery):
+ </text>
+ <check_box initial_value="true" label="Mapowanie Wypukłości i Połysk" name="BumpShiny"/>
+ <check_box initial_value="true" label="Podstawowe Shadery" name="BasicShaders" tool_tip="Wyłączenie tej opcji może naprawić błędy niektórych sterowników graficznych."/>
+ <check_box initial_value="true" label="Shadery Atmosfery" name="WindLightUseAtmosShaders"/>
+ <check_box initial_value="true" label="Refleksy w wodzie" name="Reflections"/>
+ <text name="ReflectionDetailText">
+ Ustawienia refleksów:
+ </text>
+ <radio_group name="ReflectionDetailRadio">
+ <radio_item label="Teren i drzewa" name="0"/>
+ <radio_item label="Obiekty Statyczne" name="1"/>
+ <radio_item label="Awatary i Obiekty" name="2"/>
+ <radio_item label="Wszystko" name="3"/>
+ </radio_group>
+ <text name="AvatarRenderingText">
+ Rendering awatarów
+ </text>
+ <check_box initial_value="true" label="Impostoryzacja Awatarowa" name="AvatarImpostors"/>
+ <check_box initial_value="true" label="Rendering awatara przez GPU" name="AvatarVertexProgram"/>
+ <check_box initial_value="true" label="Oddzielne warstwy ubrań" name="AvatarCloth"/>
+ <slider label="Pole widzenia:" name="DrawDistance"/>
+ <text name="DrawDistanceMeterText2">
+ m
+ </text>
+ <slider label="Liczba czÄ…steczek:" name="MaxParticleCount"/>
+ <slider label="Jakość Post-Procesu:" name="RenderPostProcess"/>
+ <text name="MeshDetailText">
+ Szczególy obiektów:
+ </text>
+ <slider label=" Przedmioty:" name="ObjectMeshDetail"/>
+ <slider label=" Obiekty elastyczne:" name="FlexibleMeshDetail"/>
+ <slider label=" Drzewa:" name="TreeMeshDetail"/>
+ <slider label=" Awatary:" name="AvatarMeshDetail"/>
+ <slider label=" Teren:" name="TerrainMeshDetail"/>
+ <slider label=" Niebo:" name="SkyMeshDetail"/>
+ <text name="PostProcessText">
+ Mało
+ </text>
+ <text name="ObjectMeshDetailText">
+ Mało
+ </text>
+ <text name="FlexibleMeshDetailText">
+ Mało
+ </text>
+ <text name="TreeMeshDetailText">
+ Mało
+ </text>
+ <text name="AvatarMeshDetailText">
+ Mało
+ </text>
+ <text name="TerrainMeshDetailText">
+ Mało
+ </text>
+ <text name="SkyMeshDetailText">
+ Mało
+ </text>
+ <text name="LightingDetailText">
+ Ustawienia świateł:
+ </text>
+ <radio_group name="LightingDetailRadio">
+ <radio_item label="Tylko Słońce i Księżyc" name="SunMoon" value="0"/>
+ <radio_item label="Tylko Bliskie Światła" name="LocalLights" value="1"/>
+ </radio_group>
+ <text name="TerrainDetailText">
+ Szczegóły terenu:
+ </text>
+ <radio_group name="TerrainDetailRadio">
+ <radio_item label="Niska" name="0"/>
+ <radio_item label="Wysoka" name="2"/>
+ </radio_group>
</panel>
- <button label="Ustawienia Domyślne" name="Defaults" />
- <button label="Ustawnia Sprzętowe" label_selected="Ustawienia Sprzętowe"
- name="GraphicsHardwareButton" />
- <panel.string name="resolution_format">
- [RES_X] x [RES_Y]
- </panel.string>
- <panel.string name="aspect_ratio_text">
- [NUM]:[DEN]
- </panel.string>
+ <button label="Zastosuj" label_selected="Zastosuj" name="Apply"/>
+ <button label="Zresetuj" name="Defaults"/>
+ <button label="Zaawansowane" name="Advanced"/>
+ <button label="Sprzęt" label_selected="Sprzęt" name="GraphicsHardwareButton"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml
index e3cdaae840..9504019f79 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_privacy.xml
@@ -1,33 +1,25 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Komunikacja" name="im">
- <text name="text_box">
- Mój Status Online:
+ <panel.string name="log_in_to_change">
+ Zaloguj się ponownie, aby zmienić
+ </panel.string>
+ <button label="Wyczyść Historię" name="clear_cache" tool_tip="Wyczyść obraz zapisu, ostatniej lokalizacji, historii teleportów, stron i bufor danych tekstur"/>
+ <text name="cache_size_label_l">
+ (Miejsca, obrazy, przeglÄ…darka internetowa, wyszukiwarka historii)
</text>
- <check_box label="Mój status online jest dostepny tylko dla Znajomych i Grup"
- name="online_visibility" />
- <text name="text_box2">
- Ustawienia IM:
+ <check_box label="Mój status online jest dostępny tylko dla znajomych i grup do których należę" name="online_visibility"/>
+ <check_box label="Możliwość wysyłania wiadomości prywatnej (IM) oraz rozmowy głosowej tylko dla znajomych i grup do których należę" name="voice_call_friends_only_check"/>
+ <check_box label="Wyłącz mikrofon po zakończeniu rozmowy głosowej" name="auto_disengage_mic_check"/>
+ <check_box label="Akceptuj Ciasteczka" name="cookies_enabled"/>
+ <text name="Logs:">
+ Logi:
</text>
- <string name="log_in_to_change">
- zaloguj się żeby zmienić
- </string>
- <check_box label="Wysyłaj IMy na email ([EMAIL])" name="send_im_to_email" />
- <check_box label="Dołącz IMy do Konsola Czatu" name="include_im_in_chat_console" />
- <check_box label="Pokazuj czas w IM" name="show_timestamps_check" />
- <check_box label="Powiadamiaj o zalogowanych znajomych"
- name="friends_online_notify_checkbox" />
- <text name="text_box3">
- Pracuś Mówi:
+ <check_box label="Zapisz logi rozmów ogólnych na moim komputerze" name="log_nearby_chat"/>
+ <check_box label="Zapisuj logi wiadomości prywatnych (IM) na moim komputerze" name="log_instant_messages"/>
+ <check_box label="Pokazuj czas" name="show_timestamps_check_im"/>
+ <text name="log_path_desc">
+ Lokalizacja zapisu:
</text>
- <text name="text_box4">
- Ustawienia Zapisu:
- </text>
- <check_box label="Zapisuj IMy" name="log_instant_messages" />
- <check_box label="Pokazuj czas w zapisie IM" name="log_instant_messages_timestamp" />
- <check_box label="Pokazuj koniec ostatniego dialogu IM" name="log_show_history" />
- <check_box label="Zapisuj czat" name="log_chat" />
- <check_box label="Pokazuj czas w zapisie czatu" name="log_chat_timestamp" />
- <check_box label="Pokazuj nowe IMy w zapisie czatu" name="log_chat_IM" />
- <check_box label="Pokazuj czas łącznie z datą" name="log_date_timestamp" />
- <button label="Lokacja" label_selected="Lokacja" name="log_path_button" />
+ <button label="PrzeglÄ…daj" label_selected="PrzeglÄ…daj" name="log_path_button"/>
+ <button label="Lista Zablokowanych" name="block_list"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml b/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml
index 1e2289b496..98fdffeb50 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_setup.xml
@@ -1,31 +1,50 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Joystick i Kamera" name="Input panel">
- <text name=" Mouselook Options:">
- Widok Panoramiczny:
+<panel label="Ustawienia" name="Input panel">
+ <button label="Ustawienia Joysticka" name="joystick_setup_button"/>
+ <text name="Mouselook:">
+ Widok panoramiczny:
</text>
- <text name=" Mouse Sensitivity:">
- Czułość Myszki:
+ <text name=" Mouse Sensitivity">
+ Czułość Myszki
</text>
- <slider_bar name="mouse_sensitivity"/>
- <check_box label="Zamień klawisze myszy" name="invert_mouse"/>
- <text name=" Auto Fly Options:">
- Automatczne Latanie:
+ <slider name="mouse_sensitivity"/>
+ <check_box label="Zmień klawisze myszki" name="invert_mouse"/>
+ <text name="Network:">
+ Sieć:
</text>
- <check_box label="Lataj/Ląduj Używając Klawiszy PgUp/PgDn" name="automatic_fly"/>
- <text name=" Camera Options:">
- Ustawienia Kamery:
+ <text name="Maximum bandwidth">
+ Maksymalna przepustowość
</text>
- <text name="camera_fov_label">
- KÄ…t Widoku Kamery:
+ <text name="text_box2">
+ kbps
</text>
- <text name="Camera Follow Distance:">
- Dystans Kamery:
+ <check_box label="Port dedykowany dla aplikacji" name="connection_port_enabled"/>
+ <spinner label="Numer Portu:" name="connection_port"/>
+ <text name="cache_size_label_l">
+ Rozmiar bufora danych
</text>
- <check_box label="Edycja - Automatyczny Ruch Kamery" name="edit_camera_movement" tool_tip="Używaj automatycznego ustawienia kamery podczas włączania i wyłączania trybu edycji"/>
- <check_box label="Wygląd - Automatyczny Ruch Kamery" name="appearance_camera_movement" tool_tip="Używaj automatycznego ustawienia kamery w trybu edycji"/>
- <text name="text2">
- Wyświetlanie Awatara:
+ <text name="text_box5">
+ MB
</text>
- <check_box label="Awatar Widoczny w Trybie Panoramicznym" name="first_person_avatar_visible"/>
- <button label="Ustawienia Joysticka" name="joystick_setup_button"/>
+ <text name="Cache location">
+ Lokalizacja bufora danych:
+ </text>
+ <button label="Ustaw" label_selected="Ustaw" name="set_cache"/>
+ <button label="Zresetuj" label_selected="Zresetuj" name="reset_cache"/>
+ <text name="Web:">
+ Internet:
+ </text>
+ <radio_group name="use_external_browser">
+ <radio_item label="Użyj zewnętrznej przeglądarki (IE, Firefox, Safari)" name="external" tool_tip="Używaj zewnętrznej przeglądarki. Nie jest to rekomendowane w trybie pełnoekranowym." value="1"/>
+ <radio_item label="Używaj wbudowanej przeglądarki." name="internal" tool_tip="Używaj wbudowanej przeglądarki. Ta przeglądarka otworzy nowe okno w [APP_NAME]." value=""/>
+ </radio_group>
+ <check_box label="Zezwalaj na wtyczki" name="browser_plugins_enabled"/>
+ <check_box label="Akceptuj ciasteczka z Internetu" name="cookies_enabled"/>
+ <check_box label="Zezwalaj na Javascript" name="browser_javascript_enabled"/>
+ <check_box label="Używaj Serwera Proxy" name="web_proxy_enabled"/>
+ <text name="Proxy location">
+ Lokalizacja Proxy:
+ </text>
+ <line_editor name="web_proxy_editor" tool_tip="Nazwa lub IP proxy, którego chcesz użyć"/>
+ <spinner label="Numer portu:" name="web_proxy_port"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml b/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml
index f9b5d221a5..6ab5be77d8 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_sound.xml
@@ -1,14 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Dźwięki" name="Preference Media panel">
<slider label="Główny" name="System Volume"/>
- <check_box initial_value="true" label="Wycisz podczas minimalizacji" name="mute_when_minimized"/>
- <slider label="Otoczenie" name="Wind Volume"/>
+ <check_box label="Wycisz podczas minimalizacji" name="mute_when_minimized"/>
<slider label="Interfejs" name="UI Volume"/>
+ <slider label="Otoczenie" name="Wind Volume"/>
+ <slider label="Efekty dźwiękowe" name="SFX Volume"/>
+ <slider label="Muzyka strumieniowa" name="Music Volume"/>
+ <check_box label="Odtwarzaj media audio" name="music_enabled"/>
<slider label="Media" name="Media Volume"/>
- <slider label="Efekty Dźwiękowe" name="SFX Volume"/>
- <slider label="Muzyka Strumieniowa" name="Music Volume"/>
- <check_box label="Głos" name="enable_voice_check"/>
- <slider label="Głos" name="Voice Volume"/>
+ <check_box label="Odtwarzaj media" name="enable_media"/>
+ <slider label="Komunikacja Głosowa" name="Voice Volume"/>
+ <check_box label="Pozwól na rozmowy głosowe" name="enable_voice_check"/>
+ <check_box label="Automatycznie odtwarzaj media" name="media_auto_play_btn" tool_tip="Zaznacz tę funkcję by uruchomić automatyczne uruchamianie mediów"/>
+ <check_box label="Uruchom media załączone do innych awatarów" name="media_show_on_others_btn" tool_tip="Odznacz tę funkcję by ukryć media załączone to awatarów w publiżu"/>
+ <text name="voice_chat_settings">
+ Ustawienia Komunikacji Głosowej
+ </text>
<text name="Listen from">
Odtwarzaj z:
</text>
diff --git a/indra/newview/skins/default/xui/pl/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/pl/panel_prim_media_controls.xml
new file mode 100644
index 0000000000..f10ce5ea4d
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_prim_media_controls.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="MediaControlsPanel">
+ <string name="min_width">
+ 300
+ </string>
+ <string name="min_height">
+ 75
+ </string>
+ <string name="zoom_medium_padding">
+ 1.1
+ </string>
+ <string name="top_world_view_avoid_zone">
+ 50
+ </string>
+ <layout_stack name="progress_indicator_area">
+ <panel name="media_progress_indicator">
+ <progress_bar name="media_progress_bar" tool_tip="Wczytywanie mediów"/>
+ </panel>
+ </layout_stack>
+ <layout_stack name="media_controls">
+ <layout_panel name="back">
+ <button name="back_btn" tool_tip="Przejdź do poprzedniego"/>
+ </layout_panel>
+ <layout_panel name="fwd">
+ <button name="fwd_btn" tool_tip="Przejdź do następnego"/>
+ </layout_panel>
+ <layout_panel name="home">
+ <button name="home_btn" tool_tip="Strona Domowa"/>
+ </layout_panel>
+ <layout_panel name="media_stop">
+ <button name="media_stop_btn" tool_tip="Zatrzymaj media"/>
+ </layout_panel>
+ <layout_panel name="reload">
+ <button name="reload_btn" tool_tip="Odśwież"/>
+ </layout_panel>
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="Zatrzymaj wczytywanie"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="Odtwarzaj Media"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="Wstrzymaj media"/>
+ </layout_panel>
+ <layout_panel name="media_address">
+ <line_editor name="media_address_url" tool_tip="URL Mediów"/>
+ <layout_stack name="media_address_url_icons">
+ <layout_panel>
+ <icon name="media_whitelist_flag" tool_tip="Biała Lista aktywna"/>
+ </layout_panel>
+ <layout_panel>
+ <icon name="media_secure_lock_flag" tool_tip="Zabezpiecz przeglÄ…danie"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="media_play_position">
+ <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="Postęp odtwarzania filmu"/>
+ </layout_panel>
+ <layout_panel name="skip_back">
+ <button name="skip_back_btn" tool_tip="Przewiń do tyłu"/>
+ </layout_panel>
+ <layout_panel name="skip_forward">
+ <button name="skip_forward_btn" tool_tip="Przewiń do przodu"/>
+ </layout_panel>
+ <layout_panel name="media_volume">
+ <button name="media_mute_button" tool_tip="Wycisz Media"/>
+ <slider name="volume_slider" tool_tip="Głośność Mediów"/>
+ </layout_panel>
+ <layout_panel name="zoom_frame">
+ <button name="zoom_frame_btn" tool_tip="Przybliż do mediów"/>
+ </layout_panel>
+ <layout_panel name="close">
+ <button name="close_btn" tool_tip="Oddal"/>
+ </layout_panel>
+ <layout_panel name="new_window">
+ <button name="new_window_btn" tool_tip="Otwórz URL w przeglądarce"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_profile.xml b/indra/newview/skins/default/xui/pl/panel_profile.xml
new file mode 100644
index 0000000000..766ed94822
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_profile.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Profil" name="panel_profile">
+ <string name="no_partner_text" value="Brak"/>
+ <string name="no_group_text" value="Żadne"/>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <layout_stack name="layout">
+ <layout_panel name="profile_stack">
+ <scroll_container name="profile_scroll">
+ <panel name="profile_scroll_panel">
+ <panel name="second_life_image_panel">
+ <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <text name="title_rw_descr_text" value="Życie#1:"/>
+ </panel>
+ <text name="title_member_text" value="Urodziny:"/>
+ <text name="title_acc_status_text" value="Konto:"/>
+ <text name="title_partner_text" value="Partner:"/>
+ <panel name="partner_data_panel">
+ <name_box initial_value="(przetwarzanie)" name="partner_text"/>
+ </panel>
+ <text name="title_groups_text" value="Grupy:"/>
+ </panel>
+ </scroll_container>
+ </layout_panel>
+ <layout_panel name="profile_buttons_panel">
+ <button label="Poznaj" name="add_friend" tool_tip="Zaoferuj znajomość Rezydentowi"/>
+ <button label="IM" name="im" tool_tip="Rozpocznij sesjÄ™ czatu (IM)"/>
+ <button label="Dzwoń" name="call" tool_tip="Zadzwoń"/>
+ <button label="Mapa" name="show_on_map_btn" tool_tip="Pokaż Rezydenta na mapie"/>
+ <button label="Teleportuj" name="teleport" tool_tip="Teleportuj"/>
+ <button label="▼" name="overflow_btn" tool_tip="Zapłać lub udostępnij obiekty Rezydentowi"/>
+ </layout_panel>
+ <layout_panel name="profile_me_buttons_panel">
+ <button label="Edytuj Profil" name="edit_profile_btn" tool_tip="Edytuj swoje dane"/>
+ <button label="Edytuj Wygląd" name="edit_appearance_btn" tool_tip="Stwórz/edytuj swój wygląd: dane fizyczne, ubranie..."/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_profile_view.xml b/indra/newview/skins/default/xui/pl/panel_profile_view.xml
new file mode 100644
index 0000000000..637b278ef2
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_profile_view.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_target_profile">
+ <string name="status_online">
+ Obecnie w SL
+ </string>
+ <string name="status_offline">
+ Nieaktywny
+ </string>
+ <text_editor name="user_name" value="(Åadowanie...)"/>
+ <text name="status" value="Obecnie w SL"/>
+ <tab_container name="tabs">
+ <panel label="PROFIL" name="panel_profile"/>
+ <panel label="ULUBIONE" name="panel_picks"/>
+ <panel label="NOTATKI &amp; PRYWATNOŚĆ" name="panel_notes"/>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_region_covenant.xml b/indra/newview/skins/default/xui/pl/panel_region_covenant.xml
index f20387dd25..2b37dd96b7 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/pl/panel_region_covenant.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Umowa" name="Covenant">
<text name="estate_section_lbl">
- MajÄ…tek:
+ MajÄ…tek
</text>
<text name="estate_name_lbl">
Nazwa:
@@ -26,45 +26,45 @@
Brak umowy dla tego majÄ…tku.
</text_editor>
<button label="Wyresetuj" name="reset_covenant"/>
- <text name="covenant_help_text" bottom_delta="-6">
+ <text bottom_delta="-6" name="covenant_help_text">
Zmiany w umowie zostaną wyświetlone we
wszystkich posiadłościach majątku.
</text>
- <text name="covenant_instructions" bottom_delta="-36">
+ <text bottom_delta="-36" name="covenant_instructions">
Przeciągnij oraz wrzuć notę by zmienić umowę dla tego majątku.
</text>
<text name="region_section_lbl">
- Region:
+ Region
</text>
<text name="region_name_lbl">
Nazwa:
</text>
- <text name="region_name_text" left="115">
+ <text left="115" name="region_name_text">
leyla
</text>
<text name="region_landtype_lbl">
Typ:
</text>
- <text name="region_landtype_text" left="115">
+ <text left="115" name="region_landtype_text">
Region Główny / Ziemia
</text>
<text name="region_maturity_lbl">
Rodzaj:
</text>
- <text name="region_maturity_text" left="115">
+ <text left="115" name="region_maturity_text">
&apos;Adult&apos;
</text>
<text name="resellable_lbl">
Odsprzedaj:
</text>
- <text name="resellable_clause" left="115" width="350">
- Posiadłość zakupiona w tym regionie nie może być odsprzedana.
+ <text left="115" name="resellable_clause" width="350">
+ Posiadłość kupiona w tym Regionie nie może być odsprzedana.
</text>
<text name="changeable_lbl">
Podziel:
</text>
- <text name="changeable_clause" left="115" width="350">
- Posiadłość zakupiona w tym regionie nie może być
+ <text left="115" name="changeable_clause" width="350">
+ Posiadłość kupiona w tym Regionie nie może być
łączona/dzielona.
</text>
<string name="can_resell">
diff --git a/indra/newview/skins/default/xui/pl/panel_region_debug.xml b/indra/newview/skins/default/xui/pl/panel_region_debug.xml
index fe7b554a13..c5b08383dc 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/pl/panel_region_debug.xml
@@ -6,15 +6,15 @@
<text name="region_text">
brak danych
</text>
- <check_box label="Zablokuj Skrypty" name="disable_scripts_check" tool_tip="Zablokuj wszystkie skrypty w tym Regionie"/>
+ <check_box label="Zablokuj skrypty" name="disable_scripts_check" tool_tip="Zablokuj wszystkie skrypty w tym Regionie"/>
<button label="?" name="disable_scripts_help"/>
- <check_box label="Zablokuj Kolizje" name="disable_collisions_check" tool_tip="Zablokuj kolizje obiektów (nie Awatarów) w tym Regionie"/>
+ <check_box label="Zablokuj kolizje" name="disable_collisions_check" tool_tip="Zablokuj kolizje obiektów (nie awatarów) w tym Regionie"/>
<button label="?" name="disable_collisions_help"/>
- <check_box label="Zablokuj Fizykę" name="disable_physics_check" tool_tip="Zablokuj wpływ fizyki w tym Regionie"/>
+ <check_box label="Zablokuj fizykę" name="disable_physics_check" tool_tip="Zablokuj wpływ fizyki w tym Regionie"/>
<button label="?" name="disable_physics_help"/>
<button label="Zastosuj" name="apply_btn"/>
<text name="objret_text_lbl">
- Zwrot Obiektu
+ Zwrot obiektu
</text>
<text name="resident_text_lbl">
Rezydent:
@@ -22,19 +22,19 @@
<line_editor name="target_avatar_name">
(brak)
</line_editor>
- <button label="Wybierz..." name="choose_avatar_btn"/>
+ <button label="Wybierz" name="choose_avatar_btn"/>
<text name="options_text_lbl">
Opcje:
</text>
- <check_box label="Odeślij wyłącznie obiekty ze skryptami" name="return_scripts" tool_tip="Odeślij wyłącznie obiekty ze skryptami."/>
+ <check_box label="Ze skryptami" name="return_scripts" tool_tip="Odeślij wyłącznie obiekty ze skryptami"/>
<check_box label="Odeślij wyłącznie obiekty które są na posiadłościach innych osób" name="return_other_land" tool_tip="Odeślij wyłącznie obiekty które są na posiadłościach innych osób"/>
- <check_box label="Odeślij obiekty z wszystkich regionów w tym majątku" name="return_estate_wide" tool_tip="Odeślij obiekty z wszystkich regionów w tym majątku"/>
+ <check_box label="W każdym regionie tego majątku" name="return_estate_wide" tool_tip="Odeślij obiekty z wszystkich regionów w tym majątku"/>
<button label="Odeślij" name="return_btn"/>
- <button label="Znajdź Główne Kolizje..." name="top_colliders_btn" tool_tip="Lista obiektów doświadczających najwięcej potencjalnych kolizji"/>
+ <button label="Znajdź główne kolizje..." name="top_colliders_btn" tool_tip="Lista obiektów doświadczających najwięcej potencjalnych kolizji"/>
<button label="?" name="top_colliders_help"/>
- <button label="Główne Skrypty..." name="top_scripts_btn" tool_tip="Lista obiektów najdłużej wykonujących skrypty"/>
+ <button label="Główne skrypty..." name="top_scripts_btn" tool_tip="Lista obiektów najdłużej wykonujących skrypty"/>
<button label="?" name="top_scripts_help"/>
<button label="Restart Regionu" name="restart_btn" tool_tip="Odliczanie i restart Regionu za dwie minuty"/>
<button label="?" name="restart_help"/>
- <button label="Opóźnij Restart" name="cancel_restart_btn" tool_tip="Opóźnij restart Regionu o godzinę"/>
+ <button label="Opóźnij restart" name="cancel_restart_btn" tool_tip="Opóźnij restart Regionu o godzinę"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_region_estate.xml b/indra/newview/skins/default/xui/pl/panel_region_estate.xml
index 4275f3f647..a796274738 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/pl/panel_region_estate.xml
@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="MajÄ…tek" name="Estate">
<text name="estate_help_text">
- Zmiany ustawień na tej zakładce odnoszą się
-do wszystkich Regionów w tym Majątku.
+ Zmiany w tej zakładce będą odczuwalne w całym Regionie.
</text>
<text name="estate_text">
MajÄ…tek:
@@ -11,24 +10,24 @@ do wszystkich Regionów w tym Majątku.
(brak danych)
</text>
<text name="owner_text">
- Właściciel:
+ Właściciel Majątku:
</text>
<text name="estate_owner">
(brak danych)
</text>
- <check_box label="Używaj Czasu Światowego" name="use_global_time_check"/>
+ <check_box label="Używaj czasu światowego" name="use_global_time_check"/>
<button label="?" name="use_global_time_help"/>
<check_box label="Stałe Słońce" name="fixed_sun_check"/>
<button label="?" name="fixed_sun_help"/>
- <slider label="Pora Doby" name="sun_hour_slider"/>
- <check_box label="Dostęp Publiczny" name="externally_visible_check"/>
+ <slider label="Pora doby" name="sun_hour_slider"/>
+ <check_box label="Dostęp publiczny" name="externally_visible_check"/>
<button label="?" name="externally_visible_help"/>
<text name="Only Allow">
- Dostęp Ograniczony do:
+ Ogranicz dostęp dla kont zweryfikowanych przez:
</text>
- <check_box label="Rezydenci z danymi o koncie" name="limit_payment" tool_tip="Zablokuj niepożądanych Rezydentów."/>
- <check_box label="Dorośli ze sprawdzonym wiekiem" name="limit_age_verified" tool_tip="Zablokuj Rezydentów którzy nie zweryfikowali swojego wieku. Dodatkowe informacje pod support.secondlife.com."/>
- <check_box label="Rozmowy Dozwolone" name="voice_chat_check"/>
+ <check_box label="Rezydenci z danymi o koncie" name="limit_payment" tool_tip="Zbanuj niezidentyfikowanych Rezydentów"/>
+ <check_box label="Rezydenci, którzy dokonali weryfikacji wieku" name="limit_age_verified" tool_tip="Zbanuj Rezydentów, którzy nie zweryfikowali swojego wieku. Odwiedź stronę [SUPPORT_SITE] po więcej informacji."/>
+ <check_box label="Rozmowy dozwolone" name="voice_chat_check"/>
<button label="?" name="voice_chat_help"/>
<check_box label="Teleportacja Dozwolona" name="allow_direct_teleport"/>
<button label="?" name="allow_direct_teleport_help"/>
@@ -41,7 +40,7 @@ do wszystkich Regionów w tym Majątku.
</string>
<button label="?" name="abuse_email_address_help"/>
<button label="Zastosuj" name="apply_btn"/>
- <button label="Wyrzuć Awatara z Majątku..." name="kick_user_from_estate_btn"/>
+ <button label="Wyrzuć Rezydenta z Majątku..." name="kick_user_from_estate_btn"/>
<button label="Wyślij Wiadomość do Majątku..." name="message_estate_btn"/>
<text name="estate_manager_label">
ZarzÄ…dcy MajÄ…tku:
diff --git a/indra/newview/skins/default/xui/pl/panel_region_general.xml b/indra/newview/skins/default/xui/pl/panel_region_general.xml
index 20296dac71..1410a2a882 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/pl/panel_region_general.xml
@@ -18,36 +18,26 @@
<text name="region_type">
nieznany
</text>
- <check_box label="Zablokuj Zmiany Terenu" name="block_terraform_check"/>
- <button label="?" name="terraform_help"/>
- <check_box label="Zablokuj Latanie" name="block_fly_check"/>
- <button label="?" name="fly_help"/>
- <check_box label="Uszkodzenia Dozwolone" name="allow_damage_check"/>
- <button label="?" name="damage_help"/>
- <check_box label="Zablokuj Popychanie" name="restrict_pushobject"/>
- <button label="?" name="restrict_pushobject_help"/>
- <check_box label="Odsprzedaż Dozwolona" name="allow_land_resell_check"/>
- <button label="?" name="land_resell_help"/>
- <check_box label="ÅÄ…czenie/Dzielenie Dozwolone" name="allow_parcel_changes_check"/>
- <button label="?" name="parcel_changes_help"/>
- <check_box label="Zablokuj Wyszukiwanie" name="block_parcel_search_check" tool_tip="Pozwól na wyświetlanie nazwy regionu i posiadłości w wynikach wyszukiwania"/>
- <button label="?" name="parcel_search_help"/>
+ <check_box label="Zablokuj zmiany terenu" name="block_terraform_check"/>
+ <check_box label="Zablokuj latanie" name="block_fly_check"/>
+ <check_box label="Uszkodzenia dozwolone" name="allow_damage_check"/>
+ <check_box label="Zablokuj popychanie" name="restrict_pushobject"/>
+ <check_box label="Odsprzedaż dozwolona" name="allow_land_resell_check"/>
+ <check_box label="ÅÄ…czenie/Dzielenie dozwolone" name="allow_parcel_changes_check"/>
+ <check_box label="Zablokuj wyszukiwanie" name="block_parcel_search_check" tool_tip="Pozwól na wyświetlanie nazwy regionu i posiadłości w wynikach wyszukiwania"/>
<spinner label="Limit Gości" name="agent_limit_spin"/>
- <button label="?" name="agent_limit_help"/>
- <spinner label="Ekstra Obiekty" name="object_bonus_spin"/>
- <button label="?" name="object_bonus_help"/>
- <text label="Ograniczenia Wieku" name="access_text">
+ <spinner label="Ekstra obiekty" name="object_bonus_spin"/>
+ <text label="Ograniczenia wieku" name="access_text">
Rodzaj:
</text>
- <combo_box label="&apos;Mature&apos;" name="access_combo">
- <combo_box.item label="&apos;Adult&apos;" name="Adult"/>
- <combo_box.item label="&apos;Mature&apos;" name="Mature"/>
- <combo_box.item label="&apos;PG&apos;" name="PG"/>
- </combo_box>
- <button label="?" name="access_help"/>
+ <icons_combo_box label="&apos;Mature&apos;" name="access_combo">
+ <icons_combo_box.item label="&apos;Adult&apos;" name="Adult" value="42"/>
+ <icons_combo_box.item label="&apos;Mature&apos;" name="Mature" value="21"/>
+ <icons_combo_box.item label="&apos;PG&apos;" name="PG" value="13"/>
+ </icons_combo_box>
<button label="Zastosuj" name="apply_btn"/>
- <button label="Wyrzuć Awatara..." name="kick_btn"/>
- <button label="Wyrzuć Wszystkich..." name="kick_all_btn"/>
- <button label="Wyślij Wiadomość do Regionu..." name="im_btn"/>
- <button label="Obsługa Teleportera..." name="manage_telehub_btn"/>
+ <button label="Teleportuj do Miejsca Startu jednego Rezydenta..." name="kick_btn"/>
+ <button label="Teleportuj do Miejsca Startu wszystkich Rezydentów..." name="kick_all_btn"/>
+ <button label="Wyślij wiadomość do Regionu..." name="im_btn"/>
+ <button label="Obsługa teleportera..." name="manage_telehub_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_region_general_layout.xml b/indra/newview/skins/default/xui/pl/panel_region_general_layout.xml
new file mode 100644
index 0000000000..ffa8f1e18a
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_region_general_layout.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Region" name="General">
+ <text name="region_text_lbl">
+ Region:
+ </text>
+ <text name="region_text">
+ nieznany
+ </text>
+ <text name="version_channel_text_lbl">
+ Wersja:
+ </text>
+ <text name="version_channel_text">
+ nieznany
+ </text>
+ <text name="region_type_lbl">
+ Typ:
+ </text>
+ <text name="region_type">
+ nieznany
+ </text>
+ <check_box label="Zablokuj zmiany terenu" name="block_terraform_check"/>
+ <check_box label="Zablokuj latanie" name="block_fly_check"/>
+ <check_box label="Uszkodzenia dozwolone" name="allow_damage_check"/>
+ <check_box label="Zablokuj popychanie" name="restrict_pushobject"/>
+ <check_box label="Odsprzedaż dozwolona" name="allow_land_resell_check"/>
+ <check_box label="ÅÄ…czenie/Dzielenie dozwolone" name="allow_parcel_changes_check"/>
+ <check_box label="Zablokuj wyszukiwanie" name="block_parcel_search_check" tool_tip="Pozwól na wyświetlanie nazwy Regionu i Posiadłości w wynikach wyszukiwania"/>
+ <spinner label="Limit Gości" name="agent_limit_spin"/>
+ <spinner label="Ekstra obiekty" name="object_bonus_spin"/>
+ <text label="Restrykcje wieku" name="access_text">
+ Rodzaj:
+ </text>
+ <combo_box label="Moderuj" name="access_combo">
+ <combo_box.item label="Adult" name="Adult"/>
+ <combo_box.item label="Moderuj" name="Mature"/>
+ <combo_box.item label="Ogólne" name="PG"/>
+ </combo_box>
+ <button label="Zastosuj" name="apply_btn"/>
+ <button label="Teleportuj do Miejsca Startu jednego Rezydenta..." name="kick_btn"/>
+ <button label="Teleportuj do Miejsca Startu wszystkich Rezydentów..." name="kick_all_btn"/>
+ <button label="Wyślij wiadomość do Regionu..." name="im_btn"/>
+ <button label="Obsługa teleportera..." name="manage_telehub_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_region_terrain.xml b/indra/newview/skins/default/xui/pl/panel_region_terrain.xml
index b206616e34..917ae91774 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_region_terrain.xml
+++ b/indra/newview/skins/default/xui/pl/panel_region_terrain.xml
@@ -6,22 +6,22 @@
<text name="region_text">
brak danych
</text>
- <spinner label="Poziom Wody" name="water_height_spin" />
+ <spinner label="Poziom wody" name="water_height_spin" />
<button label="?" name="water_height_help" />
- <spinner label="Górny Limit Terenu" name="terrain_raise_spin" />
+ <spinner label="Górny limit terenu" name="terrain_raise_spin" />
<button label="?" name="terrain_raise_help" />
- <spinner label="Dolny Limit Terenu" name="terrain_lower_spin" />
+ <spinner label="Dolny limit terenu" name="terrain_lower_spin" />
<button label="?" name="terrain_lower_help" />
<check_box label="Używaj Słońca Majątku" name="use_estate_sun_check" />
<button label="?" name="use_estate_sun_help" />
<check_box label="Stałe Słońce" name="fixed_sun_check" />
<button label="?" name="fixed_sun_help" />
- <slider label="Pora Doby" name="sun_hour_slider" />
+ <slider label="Pora doby" name="sun_hour_slider" />
<button label="Zastosuj" name="apply_btn" />
- <button label="Zapisz Surowy Teren..." name="download_raw_btn"
+ <button label="Zapisz surowy teren..." name="download_raw_btn"
tool_tip="Dostępne tylko dla Właścicieli Majątku, nie dla Zarządców" />
<button label="?" name="download_raw_help" />
- <button label="Załaduj Surowy Teren..." name="upload_raw_btn"
+ <button label="Załaduj surowy teren..." name="upload_raw_btn"
tool_tip="Dostępne tylko dla Właścicieli Majątku, nie dla Zarządców" />
<button label="?" name="upload_raw_help" />
<button label="Ustal Teren" name="bake_terrain_btn"
diff --git a/indra/newview/skins/default/xui/pl/panel_region_texture.xml b/indra/newview/skins/default/xui/pl/panel_region_texture.xml
index d24579fc75..156f3db63f 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_region_texture.xml
+++ b/indra/newview/skins/default/xui/pl/panel_region_texture.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Tekstury Gruntu" name="Textures">
<text name="region_text_lbl">
Region:
@@ -25,33 +25,33 @@
Zakres Poziomów dla Tekstury
</text>
<text name="height_text_lbl6">
- Południe-Zachód
+ Północny-Zachód
</text>
<text name="height_text_lbl7">
- Północ-Zachód
+ Północny-Wschód
</text>
<text name="height_text_lbl8">
- Południe-Wschód
+ Południowy-Zachód
</text>
<text name="height_text_lbl9">
- Północ-Wschód
- </text>
- <spinner label="Dół" name="height_start_spin_0" />
- <spinner label="Dół" name="height_start_spin_1" />
- <spinner label="Dół" name="height_start_spin_2" />
- <spinner label="Dół" name="height_start_spin_3" />
- <spinner label="Góra" name="height_range_spin_0" />
- <spinner label="Góra" name="height_range_spin_1" />
- <spinner label="Góra" name="height_range_spin_2" />
- <spinner label="Góra" name="height_range_spin_3" />
+ Południowy-Wschód
+ </text>
+ <spinner label="Dół" name="height_start_spin_0"/>
+ <spinner label="Dół" name="height_start_spin_1"/>
+ <spinner label="Dół" name="height_start_spin_2"/>
+ <spinner label="Dół" name="height_start_spin_3"/>
+ <spinner label="Góra" name="height_range_spin_0"/>
+ <spinner label="Góra" name="height_range_spin_1"/>
+ <spinner label="Góra" name="height_range_spin_2"/>
+ <spinner label="Góra" name="height_range_spin_3"/>
<text name="height_text_lbl10">
Wartości reprezentują zakresy zlewania powyższych tekstur.
</text>
<text name="height_text_lbl11">
- Wartość DÓÅ, wyrażona w metrach, to MAKSYMALNY poziom dla tekstury #1,
+ Wartość DÓÅ, wyrażona w metrach, to MAKSYMALNY poziom dla tekstury #1, a wartość GÓRA to MINIMALNY poziom dla tekstury #4.
</text>
<text name="height_text_lbl12">
a wartość GÓRA to MINIMALNY poziom dla tekstury #4.
</text>
- <button label="Zastosuj" name="apply_btn" />
+ <button label="Zastosuj" name="apply_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_script_ed.xml b/indra/newview/skins/default/xui/pl/panel_script_ed.xml
new file mode 100644
index 0000000000..09c3d8ad04
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_script_ed.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="script panel">
+ <panel.string name="loading">
+ Åadowanie...
+ </panel.string>
+ <panel.string name="can_not_view">
+ Nie posiadasz praw do zobaczenia lub edycji kodu tego skryptu ponieważ udostępnione Ci prawa to &quot;brak kopiowania&quot;. Musisz posiadać pełne prawa by móc zobaczyć lub edytować kod skryptu w zawartości obiektu.
+ </panel.string>
+ <panel.string name="public_objects_can_not_run">
+ Publiczne obiekty nie mogą uruchamiać skryptów
+ </panel.string>
+ <panel.string name="script_running">
+ Uruchomione
+ </panel.string>
+ <panel.string name="Title">
+ Skrypt: [NAME]
+ </panel.string>
+ <text_editor name="Script Editor">
+ Åadowanie...
+ </text_editor>
+ <button label="Zapisz" label_selected="Zapisz" name="Save_btn"/>
+ <combo_box label="Wklej..." name="Insert..."/>
+ <menu_bar name="script_menu">
+ <menu label="Plik" name="File">
+ <menu_item_call label="Zapisz" name="Save"/>
+ <menu_item_call label="Cofnij wszystkie zmiany" name="Revert All Changes"/>
+ </menu>
+ <menu label="Edytuj" name="Edit">
+ <menu_item_call label="Cofnij" name="Undo"/>
+ <menu_item_call label="Do Przodu" name="Redo"/>
+ <menu_item_call label="Wytnij" name="Cut"/>
+ <menu_item_call label="Kopiuj" name="Copy"/>
+ <menu_item_call label="Wklej" name="Paste"/>
+ <menu_item_call label="Wybierz Wszystko" name="Select All"/>
+ <menu_item_call label="Odznacz" name="Deselect"/>
+ <menu_item_call label="Znajdź / Zamień..." name="Search / Replace..."/>
+ </menu>
+ <menu label="Pomoc" name="Help">
+ <menu_item_call label="Pomoc..." name="Help..."/>
+ <menu_item_call label="Pomoc..." name="Keyword Help..."/>
+ </menu>
+ </menu_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/pl/panel_script_limits_my_avatar.xml
new file mode 100644
index 0000000000..e1863517a2
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_script_limits_my_avatar.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="MÓJ AWATAR" name="script_limits_my_avatar_panel">
+ <text name="script_memory">
+ Zużycie Skryptów przez Awatara
+ </text>
+ <text name="loading_text">
+ Åadowanie...
+ </text>
+ <scroll_list name="scripts_list">
+ <scroll_list.columns label="Rozmiar (kb)" name="size"/>
+ <scroll_list.columns label="URL" name="urls"/>
+ <scroll_list.columns label="Nazwa Obiektu" name="name"/>
+ <scroll_list.columns label="Lokalizacja" name="location"/>
+ </scroll_list>
+ <button label="Odśwież listę" name="refresh_list_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/pl/panel_script_limits_region_memory.xml
new file mode 100644
index 0000000000..1419a9c9f6
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_script_limits_region_memory.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="PAMIĘĆ REGIONU" name="script_limits_region_memory_panel">
+ <text name="script_memory">
+ Pamięć Skryptu Parceli
+ </text>
+ <text name="loading_text">
+ Åadowanie...
+ </text>
+ <scroll_list name="scripts_list">
+ <scroll_list.columns label="Rozmiar (kb)" name="size"/>
+ <scroll_list.columns label="URL" name="urls"/>
+ <scroll_list.columns label="Nazwa Obiektu" name="name"/>
+ <scroll_list.columns label="Właściciel" name="owner"/>
+ <scroll_list.columns label="Parcela" name="parcel"/>
+ <scroll_list.columns label="Lokalizacja" name="location"/>
+ </scroll_list>
+ <button label="Odśwież listę" name="refresh_list_btn"/>
+ <button label="Pokaż" name="highlight_btn"/>
+ <button label="Zwróć" name="return_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_scrolling_param.xml b/indra/newview/skins/default/xui/pl/panel_scrolling_param.xml
index 70a6e39412..70a6e39412 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_scrolling_param.xml
+++ b/indra/newview/skins/default/xui/pl/panel_scrolling_param.xml
diff --git a/indra/newview/skins/default/xui/pl/panel_side_tray.xml b/indra/newview/skins/default/xui/pl/panel_side_tray.xml
new file mode 100644
index 0000000000..f34fd0e108
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_side_tray.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray cannot show background because it is always
+ partially on screen to hold tab buttons. -->
+<side_tray name="sidebar">
+ <sidetray_tab description="Przełącz Panel Boczny" name="sidebar_openclose" tab_title="Przełącz Panel Boczny"/>
+ <sidetray_tab description="Miejsce Startu." name="sidebar_home" tab_title="Home">
+ <panel label="miejsce startu" name="panel_home"/>
+ </sidetray_tab>
+ <sidetray_tab description="Edytuj swój publiczny profil oraz ulubione zakładki." name="sidebar_me" tab_title="My Profile">
+ <panel_container name="panel_container">
+ <panel label="Ja" name="panel_me"/>
+ </panel_container>
+ </sidetray_tab>
+ <sidetray_tab description="Znajdź swoich znajomych, kontakty oraz Rezydentów w pobliżu Ciebie." name="sidebar_people" tab_title="People">
+ <panel_container name="panel_container">
+ <panel label="Grupa" name="panel_group_info_sidetray"/>
+ <panel label="Zablokowani Rezydenci &amp; Obiekty" name="panel_block_list_sidetray"/>
+ </panel_container>
+ </sidetray_tab>
+ <sidetray_tab description="Znajdź i odwiedź miejsca, w których byłeś wcześniej." label="Miejsca" name="sidebar_places" tab_title="Places">
+ <panel label="Miejsca" name="panel_places"/>
+ </sidetray_tab>
+ <sidetray_tab description="PrzeglÄ…daj SzafÄ™." name="sidebar_inventory" tab_title="My Inventory">
+ <panel label="Edytuj SzafÄ™" name="sidepanel_inventory"/>
+ </sidetray_tab>
+ <sidetray_tab description="Zmień swój obecny wygląd i ubranie." name="sidebar_appearance" tab_title="My Appearance">
+ <panel label="Edytuj WyglÄ…d" name="sidepanel_appearance"/>
+ </sidetray_tab>
+</side_tray>
diff --git a/indra/newview/skins/default/xui/pl/panel_side_tray_tab_caption.xml b/indra/newview/skins/default/xui/pl/panel_side_tray_tab_caption.xml
new file mode 100644
index 0000000000..0ae9c1cf61
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_side_tray_tab_caption.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="sidetray_tab_panel">
+ <text name="sidetray_tab_title" value="Schowek"/>
+ <button name="show_help" tool_tip="Pomoc"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/pl/panel_stand_stop_flying.xml
new file mode 100644
index 0000000000..0f99f3911c
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_stand_stop_flying.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml-->
+<panel name="panel_stand_stop_flying">
+ <button label="Wstań" name="stand_btn" tool_tip="Kliknij tutaj by wstać."/>
+ <button label="Zatrzymaj latanie" name="stop_fly_btn" tool_tip="Zatrzymaj latanie"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_status_bar.xml b/indra/newview/skins/default/xui/pl/panel_status_bar.xml
index 9226e67dff..313c2732ff 100755..100644
--- a/indra/newview/skins/default/xui/pl/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/pl/panel_status_bar.xml
@@ -1,39 +1,31 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="status">
- <text name="ParcelNameText" tool_tip="Nazwa posiadłości w której się znajdujesz. Po więcej informacji kliknij O Posiadłości.">
- Nazwa Posiadłości
- </text>
- <text name="BalanceText" tool_tip="Stan Konta">
- Åadowanie...
- </text>
- <button label="" label_selected="" name="buycurrency" tool_tip="Kup $L" />
- <text name="TimeText" tool_tip="Obecny Czas (Pacyficzny)">
- 12:00 AM
- </text>
- <string name="StatBarDaysOfWeek">
+ <panel.string name="StatBarDaysOfWeek">
Niedziela:Poniedziałek:Wtorek:Środa:Czwartek:Piątek:Sobota
- </string>
- <string name="StatBarMonthsOfYear">
+ </panel.string>
+ <panel.string name="StatBarMonthsOfYear">
Styczeń:Luty:Marzec:Kwiecień:Maj:Czerwiec:Lipiec:Styczeń:Wrzesień:Październik:Listopad:Grudzień
- </string>
- <button label="" label_selected="" name="scriptout" tool_tip="Błędy i Ostrzeżenia Skryptów" />
- <button label="" label_selected="" name="health" tool_tip="Stan" />
- <text name="HealthText" tool_tip="Stan">
- 100%
- </text>
- <button label="" label_selected="" name="no_fly" tool_tip="Latanie jest niedozwolone" />
- <button label="" label_selected="" name="no_build" tool_tip="Budowanie/rezzowanie jest niedozwolone" />
- <button label="" label_selected="" name="no_scripts" tool_tip="Używanie skryptów jest niedozwolone" />
- <button label="" label_selected="" name="restrictpush" tool_tip="Pochnięcia są niedozwolone" />
- <button label="" label_selected="" name="status_no_voice" tool_tip="Używanie komunikacji głosowej jest niedozwolone" />
- <button label="" label_selected="" name="buyland" tool_tip="Kup tą posiadłość" />
- <button label="" name="menubar_search_bevel_bg" />
- <line_editor label="Szukaj" name="search_editor" tool_tip="Szukaj w [SECOND_LIFE]" />
- <button label="" label_selected="" name="search_btn" tool_tip="Szukaj w [SECOND_LIFE]" />
- <string name="packet_loss_tooltip">
- Utracone Pakiety
- </string>
- <string name="bandwidth_tooltip">
+ </panel.string>
+ <panel.string name="packet_loss_tooltip">
+ Utracone pakiety
+ </panel.string>
+ <panel.string name="bandwidth_tooltip">
Przepustowość
- </string>
+ </panel.string>
+ <panel.string name="time">
+ [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+ </panel.string>
+ <panel.string name="timeTooltip">
+ [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+ </panel.string>
+ <panel.string name="buycurrencylabel">
+ L$ [AMT]
+ </panel.string>
+ <button label="" label_selected="" name="buycurrency" tool_tip="Bilans"/>
+ <button label="Kup L$" name="buyL" tool_tip="Kliknij aby kupić L$"/>
+ <text name="TimeText" tool_tip="Obecny Czas (Pacyficzny)">
+ 24:00 AM PST
+ </text>
+ <button name="media_toggle_btn" tool_tip="Start/Stop Wszystkie Media (Muzyka, Video, WWW)"/>
+ <button name="volume_btn" tool_tip="Regulacja Głośności"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_teleport_history.xml b/indra/newview/skins/default/xui/pl/panel_teleport_history.xml
new file mode 100644
index 0000000000..d143843eaf
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_teleport_history.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Teleport History">
+ <accordion name="history_accordion">
+ <accordion_tab name="today" title="Dzisiaj"/>
+ <accordion_tab name="yesterday" title="Wczoraj"/>
+ <accordion_tab name="2_days_ago" title="2 dni temu"/>
+ 5
+ <accordion_tab name="3_days_ago" title="3 dni temu"/>
+ <accordion_tab name="4_days_ago" title="4 dni temu"/>
+ <accordion_tab name="5_days_ago" title="5 dni temu"/>
+ <accordion_tab name="6_days_and_older" title="6 dni i więcej"/>
+ <accordion_tab name="1_month_and_older" title="1 miesiąc i więcej"/>
+ <accordion_tab name="6_months_and_older" title="6 miesięcy i więcej"/>
+ </accordion>
+ <panel name="bottom_panel">
+ <button name="gear_btn" tool_tip="Pokaż dodatkowe opcje"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/pl/panel_teleport_history_item.xml
new file mode 100644
index 0000000000..f0fe28c4ce
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/panel_teleport_history_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="teleport_history_item">
+ <button name="profile_btn" tool_tip="Pokaż info o obiekcie"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_world_map.xml b/indra/newview/skins/default/xui/pl/panel_world_map.xml
index 70479fe209..849b01a1ce 100644
--- a/indra/newview/skins/default/xui/pl/panel_world_map.xml
+++ b/indra/newview/skins/default/xui/pl/panel_world_map.xml
@@ -4,7 +4,7 @@
Åadowanie...
</panel.string>
<panel.string name="InvalidLocation">
- Niewłaściwa Lokalizacja
+ Niewłaściwa lokalizacja
</panel.string>
<panel.string name="world_map_north">
N
diff --git a/indra/newview/skins/default/xui/pl/role_actions.xml b/indra/newview/skins/default/xui/pl/role_actions.xml
index 5711eacf2f..ccfa5f222e 100755..100644
--- a/indra/newview/skins/default/xui/pl/role_actions.xml
+++ b/indra/newview/skins/default/xui/pl/role_actions.xml
@@ -1,197 +1,76 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<role_actions>
- <action_set
- description="Przywileje pozwajające na dodawanie i usuwanie Członków oraz pozwalają nowym Członkom na dodawanie się bez zaproszenia."
- name="Membership">
- <action description="Zapraszanie do Grupy"
- longdescription="Zapraszanie nowych Ludzi do Grupy używając &apos;Zaproś Nową Osobę...&apos; pod Członkowie &gt; Członkowie."
- name="member invite" />
- <action description="Usuwanie z Grupy"
- longdescription="Usuwanie Członków z Grupy używając &apos;Usuń z Grupy&apos; pod Członkowie &gt; Członkowie. Właściciel może usunąć każdego za wyjątkiem innego Właściciela. Jeżeli nie jesteś Właścicielem możesz tylko usuwać Członków w Funkcji Każdy i tylko wtedy kiedy nie mają żadnej innej Funkcji. Aby odebrać Członkowi Funkcję musisz mieć Przywilej &apos;Odbieranie Funkcji&apos;."
- name="member eject" />
- <action
- description="Selekcja opcji &apos;Wolne Zapisy&apos; i wybór &apos;Opłaty Wstępnej&apos;"
- longdescription="Selekcja opcji &apos;Wolne Zapisy&apos; (pozwola nowym Członkom na dodawanie sie bez zaproszenia) i wybiór &apos;Opłaty Wstępnej&apos; w Ustawieniach Grupy w sekcji Ogólne."
- name="member options" />
+ <action_set description="Przywileje pozwajające na dodawanie i usuwanie Członków oraz pozwalają nowym Członkom na dodawanie się bez zaproszenia." name="Membership">
+ <action description="Zapraszanie do Grupy" longdescription="Zapraszanie nowych Ludzi do Grupy używając przycisku &apos;Zaproś&apos; w sekcji Ról &gt; Członkowie" name="member invite"/>
+ <action description="Usuwanie z Grupy" longdescription="Usuwanie Członków z Grupy używając &apos;Usuń z Grupy&apos;; pod Członkowie &gt; Członkowie. Właściciel może usunąć każdego za wyjątkiem innego Właściciela. Jeżeli nie jesteś Właścicielem możesz tylko usuwać Członków w Funkcji Każdy i tylko wtedy kiedy nie mają żadnej innej Funkcji. Aby odebrać Członkowi Funkcję musisz mieć Przywilej &apos;Odbieranie Funkcji&apos;." name="member eject"/>
+ <action description="Selekcja opcji &apos;Wolne Zapisy&apos; i wybór &apos;Opłaty Wstępnej&apos;" longdescription="Selekcja opcji &apos;Wolne Zapisy&apos; (pozwala nowym Członkom na dodawanie się bez zaproszenia) i wybór &apos;Opłaty Wstępnej&apos; w Ustawieniach Grupy w sekcji Ogólne." name="member options"/>
</action_set>
- <action_set
- description="Przywileje pozwalające na dodawanie, usuwanie i edycję Funkcji w Grupie, oraz na nadawanie i odbieranie Funkcji, oraz na przypisywanie Przywilejów do Funkcji."
- name="Roles">
- <action description="Dodawanie Funkcji"
- longdescription="Dodawanie nowych Funkcji pod Członkowie &gt; Funkcje."
- name="role create" />
- <action description="Usuwanie Funkcji"
- longdescription="Usuwanie Funkcji pod Członkowie &gt; Funkcje."
- name="role delete" />
- <action description="Zmiany nazw Funkcji, Tytułów i Opisów"
- longdescription="Zmiany nazw Funkcji, Tytułów i Opisów w dolnej części Członkowie &gt; Funkcje po wybraniu Funkcje."
- name="role properties" />
- <action description="Przypisywanie Członków do posiadanych Funkcji"
- longdescription="Przypisywanie Członków do Funkcji w sekcji Przypisane Funkcje pod Członkowie &gt; Członkowie. Członek z tym Przywilejem może dodawać Członków do Funkcji które sam już posiada."
- name="role assign member limited" />
- <action description="Przypisywanie Członków do wszystkich Funkcji"
- longdescription="Przypisywanie Członków do wszystkich Funkcji w sekcji Przypisane Funkcje pod Członkowie &gt; Członkowie. *UWAGA* Członek w Funkcji z tym Przywilejem może przypisać siebie i innych Członków nie będących Właścicielami do Funkcji dających więcej Przywilejów niż posiadane obecnie potencjalnie dające możliwości zbliżone do możliwości Właściciela. Udzielaj tego Przywileju z rozwagą."
- name="role assign member" />
- <action description="Odbieranie Funkcji"
- longdescription="Odbieranie Funkcji w sekcji Przypisane Funkcje pod Członkowie &gt; Członkowie. Funkcja Właściciela nie może być odebrana."
- name="role remove member" />
- <action description="Dodawanie i Usuwanie Przywilejów z Funkcji"
- longdescription="Dodawanie i Usuwanie Przywilejów z Funkcji w sekcji Przwileje pod Członkowie &gt; Funkcje. *UWAGA* Członek w Funkcji z tym Przywilejem może przypisać sobie i innychm Członkom nie będącym Właścicielami wszystkie Przywileje potencjalnie dające możliwości zbliżone do możliwości Właściciela. Udzielaj tego Przywileju z rozwagą."
- name="role change actions" />
+ <action_set description="Przywileje pozwalające na dodawanie, usuwanie i edycję Funkcji w Grupie, oraz na nadawanie i odbieranie Funkcji, oraz na przypisywanie Przywilejów do Funkcji." name="Roles">
+ <action description="Dodawanie Funkcji" longdescription="Dodawanie nowych Funkcji pod Członkowie &gt; Funkcje." name="role create"/>
+ <action description="Usuwanie Funkcji" longdescription="Usuń Funkcje w zakładce Funkcje &gt; Funkcje" name="role delete"/>
+ <action description="Zmiany nazw Funkcji, Tytułów i Opisów i widoczność Członków w Informacjach o Grupie" longdescription="Zmiany nazw Funkcji, Tytułów i Opisów i wybór czy Członkowie z daną Rolą są widoczni Informacji o Grupie w dolnej części sekcji Funkcji &gt; Funkcje po wybraniu Funkcje." name="role properties"/>
+ <action description="Przypisywanie Członków do posiadanych Funkcji" longdescription="Przypisywanie Członków do Funkcji w sekcji Przypisane Funkcje pod Członkowie &gt; Członkowie. Członek z tym Przywilejem może dodawać Członków do Funkcji które sam już posiada." name="role assign member limited"/>
+ <action description="Przypisywanie Członków do wszystkich Funkcji" longdescription="Przypisywanie Członków do wszystkich Funkcji w sekcji Przypisane Funkcje pod Członkowie &gt; Członkowie. *UWAGA* Członek w Funkcji z tym Przywilejem może przypisać siebie i innych Członków nie będących Właścicielami do Funkcji dających więcej Przywilejów niż posiadane obecnie potencjalnie dające możliwości zbliżone do możliwości Właściciela. Udzielaj tego Przywileju z rozwagą." name="role assign member"/>
+ <action description="Odbieranie Funkcji" longdescription="Odbieranie Funkcji w sekcji Przypisane Funkcje pod Członkowie &gt; Członkowie. Funkcja Właściciela nie może być odebrana." name="role remove member"/>
+ <action description="Dodawanie i Usuwanie Przywilejów z Funkcji" longdescription="Dodawanie i Usuwanie Przywilejów z Funkcji w sekcji Przwileje pod Członkowie &gt; Funkcje. *UWAGA* Członek w Funkcji z tym Przywilejem może przypisać sobie i innym Członkom nie będącym Właścicielami wszystkie Przywileje potencjalnie dające możliwości zbliżone do możliwości Właściciela. Udzielaj tego Przywileju z rozwagą." name="role change actions"/>
</action_set>
- <action_set
- description="Przywileje pozwalające na edycję atrybutów Grupy takich jak widoczność w wyszukiwarce, status i insygnia."
- name="Group Identity">
- <action
- description="Zmiany Statusu Grupy, Insygniów, &apos;Widoczność w Wyszukiwarce&apos; i widoczność Członków w Informacjach o Grupie."
- longdescription="Zmiany Statusu Grupy, Insygniów, &apos;Widoczność w Wyszukiwarce&apos; i widoczność Członków w Informacjach o Grupie. Dostęp poprzez ustawienia Ogólne."
- name="group change identity" />
+ <action_set description="Przywileje pozwalające na edycję atrybutów Grupy takich jak widoczność w wyszukiwarce, status i insygnia." name="Group Identity">
+ <action description="Zmiany Statusu Grupy, Insygniów, &apos;Widoczność w Wyszukiwarce&apos; i widoczność Członków w Informacjach o Grupie." longdescription="Zmiany Statusu Grupy, Insygniów, i Widoczność w Wyszukiwarce. Dostęp poprzez ustawienia Ogólne." name="group change identity"/>
</action_set>
- <action_set
- description="Przywileje pozwalające na przypisywanie, modyfikacje i sprzedaż Posiadłości Grupy. Aby zobaczyć okno O Posiadlości wybierz grunt prawym klawiszem myszki i wybierz &apos;O Posiadlości&apos; albo wybierz O Posiadłości w głównym menu."
- name="Parcel Management">
- <action description="Przypisywanie i kupowanie Posiadłości dla Grupy"
- longdescription="Przypisywanie i kupowanie Posiadłości dla Grupy. Dostęp poprzez O Posiadlości &gt; ustawienia Ogólne."
- name="land deed" />
- <action description="Oddawanie Posiadłości do Linden Lab"
- longdescription="Oddawanie Posiadłości do Linden Lab. *UWAGA* Członek w Funkcji z tym Przywilejem może porzucać Posiadlości Grupy poprzez O Posiadlości &gt; ustawienia Ogólne oddając Posiadłości za darmo do Linden Labs! Udzielaj tego Przywileju z rozwagą."
- name="land release" />
- <action description="Sprzedaż Posiadłości"
- longdescription="Sprzedaż Posiadłości. *UWAGA* Członek w Funkcji z tym Przywilejem może sprzedawać Posiadlości Grupy poprzez O Posiadlości &gt; ustawienia Ogólne! Udzielaj tego Przywileju z rozwagą."
- name="land set sale info" />
- <action description="PodziaÅ‚ i ÅÄ…czenie PosiadÅ‚oÅ›ci"
- longdescription="PodziaÅ‚ i ÅÄ…czenie PosiadÅ‚oÅ›ci. DostÄ™p poprzez wybranie gruntu prawym klawiszem myszki, &apos;Edycja Terenu&apos;, i przesuwanie myszkÄ… po gruncie wybierajÄ…c obszar. Aby podzielić wybierz obszar i naciÅ›nij &apos;Podziel...&apos;. Aby połączyć wybierz dwie albo wiÄ™cej sÄ…siadujÄ…ce PosiadÅ‚oÅ›ci i naciÅ›nij &apos;Połącz...&apos;."
- name="land divide join" />
+ <action_set description="Przywileje pozwalające na przypisywanie, modyfikacje i sprzedaż Posiadłości Grupy. Aby zobaczyć okno O Posiadłości wybierz grunt prawym klawiszem myszki i wybierz &apos;O Posiadłości&apos; albo wybierz ikonę &apos;i&apos; w głównym menu." name="Parcel Management">
+ <action description="Przypisywanie i kupowanie Posiadłości dla Grupy" longdescription="Przypisywanie i kupowanie Posiadłości dla Grupy. Dostęp poprzez O Posiadlości &gt; ustawienia Ogólne." name="land deed"/>
+ <action description="Oddawanie Posiadłości do Linden Lab" longdescription="Oddawanie Posiadłości do Linden Lab. *UWAGA* Członek w Funkcji z tym Przywilejem może porzucać Posiadlości Grupy poprzez O Posiadlości &gt; ustawienia Ogólne oddając Posiadłości za darmo do Linden Labs! Udzielaj tego Przywileju z rozwagą." name="land release"/>
+ <action description="Sprzedaż Posiadłości" longdescription="Sprzedaż Posiadłości. *UWAGA* Członek w Funkcji z tym Przywilejem może sprzedawać Posiadlości Grupy poprzez O Posiadlości &gt; ustawienia Ogólne! Udzielaj tego Przywileju z rozwagą." name="land set sale info"/>
+ <action description="PodziaÅ‚ i ÅÄ…czenie PosiadÅ‚oÅ›ci" longdescription="PodziaÅ‚ i ÅÄ…czenie PosiadÅ‚oÅ›ci. DostÄ™p poprzez wybranie gruntu prawym klawiszem myszki, &apos;Edycja Terenu&apos;, i przesuwanie myszkÄ… po gruncie wybierajÄ…c obszar. Aby podzielić wybierz obszar i naciÅ›nij &apos;Podziel&apos;. Aby połączyć wybierz dwie albo wiÄ™cej sÄ…siadujÄ…ce PosiadÅ‚oÅ›ci i naciÅ›nij &apos;Połącz&apos;." name="land divide join"/>
</action_set>
- <action_set
- description="Przywileje pozwalające na zmianę nazwy Posiadłości, widoczność w wyszukiwarce, widoczność w wyszukiwarce, wybór miejsce lądowania i zmianę ustawień teleportacji (TP)."
- name="Parcel Identity">
- <action
- description="Selekcja opcji &apos;Pokazuj w szukaniu miejsc&apos; i wybór kategorii"
- longdescription="Selekcja opcji &apos;Pokazuj w szukaniu miejsc&apos; i wybór kategorii Posiadłości pod O Posiadłości &gt; Opcje."
- name="land find places" />
- <action
- description="Zmiany nazwy Posiadłości, opisu i selekcja &apos;Widoczność w Wyszukiwarce&apos;"
- longdescription="Zmiany nazwy Posiadłości, opisu i selekcja &apos;Widoczność w Wyszukiwarce&apos;. Dostęp poprzez O Posiadłości &gt; Opcje."
- name="land change identity" />
- <action description="Wybór miejsca lądowania i ustawienia teleportacji (TP)"
- longdescription="Na Posiadłości Grupy Członek w Funkcji z tym Przywilejem może wybrać miejsce gdzie teleportujące się osoby będą ladować oraz może ustalić dodatkowe parametry teleportacji (TP). Dostęp poprzez O Posiadłości &gt; Opcje."
- name="land set landing point" />
+ <action_set description="Przywileje pozwalające na zmianę nazwy Posiadłości, widoczność w wyszukiwarce, widoczność w wyszukiwarce, wybór miejsce lądowania i zmianę ustawień teleportacji (TP)." name="Parcel Identity">
+ <action description="Selekcja opcji &apos;Pokazuj w szukaniu miejsc&apos; i wybór kategorii" longdescription="Selekcja opcji &apos;Pokazuj w szukaniu miejsc&apos; i wybór kategorii Posiadłości pod O Posiadłości &gt; Opcje." name="land find places"/>
+ <action description="Zmiany nazwy Posiadłości, opisu i selekcja &apos;Widoczność w Wyszukiwarce&apos;" longdescription="Zmiany nazwy Posiadłości, opisu i selekcja &apos;Widoczność w Wyszukiwarce&apos;. Dostęp poprzez O Posiadłości &gt; Opcje." name="land change identity"/>
+ <action description="Wybór miejsca lądowania i ustawienia teleportacji (TP)" longdescription="Na Posiadłości Grupy Członek w Funkcji z tym Przywilejem może wybrać miejsce gdzie teleportujące się osoby będą ladować oraz może ustalić dodatkowe parametry teleportacji (TP). Dostęp poprzez O Posiadłości &gt; Opcje." name="land set landing point"/>
</action_set>
- <action_set
- description="Przywileje pozwalające na zmianę opcji Posiadłości takich jak &apos;Tworzenie Obiektów&apos;, &apos;Edycja Terenu&apos; i zmianę ustawień muzyki &amp; mediów."
- name="Parcel Settings">
- <action description="Zmiany ustawień muzyki &amp; mediów"
- longdescription="Zmiany ustawień muzyki &amp; mediów pod O Posiadłości &gt; Media."
- name="land change media" />
- <action description="Selekcja opcji &apos;Edycja Terenu&apos;"
- longdescription="Selekcja opcji &apos;Edycja Terenu&apos;. *UWAGA* O Posiadłości &gt; Opcje &gt; Edycja Terenu pozwala każdemu na formowanie gruntów Twojej Posiadłości oraz na przemieszczanie roślin z Linden Labs. Udzielaj tego Przywileju z rozwagą. Selekcja opcji Edycji Terenu jest dostępna poprzez O Posiadłości &gt; Opcje."
- name="land edit" />
- <action description="Dodatkowe ustawienia O Posiadłości &gt; Opcje"
- longdescription="Selekcja opcji &apos;Bezpieczeństwo (brak uszkodzeń)&apos;, &apos;Latanie&apos;, opcje dla innych Rezydentów: &apos;Tworzenie Obiektów&apos;, &apos;Edycja Terenu&apos;, &apos;Zapamiętywanie Miejsca (LM)&apos;, &apos;Skrypty&apos; na Posiadłościach Grupy pod O Posiadłości &gt; Opcje."
- name="land options" />
+ <action_set description="Przywileje pozwalające na zmianę opcji Posiadłości takich jak &apos;Tworzenie Obiektów&apos;, &apos;Edycja Terenu&apos; i zmianę ustawień muzyki &amp; mediów." name="Parcel Settings">
+ <action description="Zmiany ustawień muzyki &amp; mediów" longdescription="Zmiany ustawień muzyki &amp; mediów pod O Posiadłości &gt; Media." name="land change media"/>
+ <action description="Selekcja opcji &apos;Edycja Terenu&apos;" longdescription="Selekcja opcji &apos;Edycja Terenu&apos;. *UWAGA* O Posiadłości &gt; Opcje &gt; Edycja Terenu pozwala każdemu na formowanie gruntów Twojej Posiadłości oraz na przemieszczanie roślin z Linden Labs. Udzielaj tego Przywileju z rozwagą. Selekcja opcji Edycji Terenu jest dostępna poprzez O Posiadłości &gt; Opcje." name="land edit"/>
+ <action description="Dodatkowe ustawienia O Posiadłości &gt; Opcje" longdescription="Selekcja opcji &apos;Bezpieczeństwo (brak uszkodzeń)&apos; &apos;Latanie&apos;, opcje dla innych Rezydentów: &apos;Tworzenie Obiektów&apos;; &apos;Edycja Terenu&apos;, &apos;Zapamiętywanie Miejsca (LM)&apos;, i &apos;Skrypty&apos; na Posiadłościach Grupy pod O Posiadłości &gt; Opcje." name="land options"/>
</action_set>
- <action_set
- description="Przywileje pozwalające Członkom na omijanie ograniczeń na Posiadłościach Grupy."
- name="Parcel Powers">
- <action description="Pozwól na Edycję Terenu"
- longdescription="Członkowie w Funkcji z tym Przywilejem mogą zawsze edytować teren na Posiadłościach Grupy."
- name="land allow edit land" />
- <action description="Pozwól na Latanie"
- longdescription="Członkowie w Funkcji z tym Przywilejem mogą zawsze latać na Posiadłościach Grupy."
- name="land allow fly" />
- <action description="Pozwól na Tworzenie Obiektów"
- longdescription="Członkowie w Funkcji z tym Przywilejem mogą zawsze tworzyć obiekty na Posiadłościach Grupy."
- name="land allow create" />
- <action description="Pozwól na Zapamiętywanie Miejsc (LM)"
- longdescription="Członkowie w Funkcji z tym Przywilejem mogą zawsze zapamiętywać miejsca (LM) na Posiadłościach Grupy."
- name="land allow landmark" />
- <action description="Pozwól na wybór Miejsca Startu na Posiadłościach Grupy"
- longdescription="Członkowie w Funkcji z tym Przywilejem mogą zawsze wybrać Miejsce Startu na Posiadłościach Grupy."
- name="land allow set home" />
+ <action_set description="Przywileje pozwalające Członkom na omijanie ograniczeń na Posiadłościach Grupy." name="Parcel Powers">
+ <action description="Pozwól na Edycję Terenu" longdescription="Członkowie w Funkcji z tym Przywilejem mogą zawsze edytować teren na Posiadłościach Grupy." name="land allow edit land"/>
+ <action description="Pozwól na Latanie" longdescription="Członkowie w Funkcji z tym Przywilejem mogą zawsze latać na Posiadłościach Grupy." name="land allow fly"/>
+ <action description="Pozwól na Tworzenie Obiektów" longdescription="Członkowie w Funkcji z tym Przywilejem mogą zawsze tworzyć obiekty na Posiadłościach Grupy." name="land allow create"/>
+ <action description="Pozwól na Zapamiętywanie Miejsc (LM)" longdescription="Członkowie w Funkcji z tym Przywilejem mogą zawsze zapamiętywać miejsca (LM) na Posiadłościach Grupy." name="land allow landmark"/>
+ <action description="Pozwól na wybór Miejsca Startu na Posiadłościach Grupy" longdescription="Członkowie w Funkcji z tym Przywilejem mogą używać menu Świat &gt; Zapamiętaj Miejsce &gt; Miejsce Startu na Posiadłości przypisanej Grupie." name="land allow set home"/>
</action_set>
- <action_set
- description="Przywileje pozwalające na dawanie i odbieranie dostępu do Posiadłości Grupy zawierające możliwości unieruchomiania i wyrzucania Rezydentów."
- name="Parcel Access">
- <action description="Zarządzanie Listą Dostępu do Posiadłości"
- longdescription="Zarządzanie Listą Dostępu do Posiadłości pod O Posiadłości &gt; Dostęp."
- name="land manage allowed" />
- <action description="Zarządzanie Listą Usuniętych z Posiadłości (Bany)"
- longdescription="Zarządzanie Listą Usuniętych z Posiadłości (Bany) pod O Posiadlości &gt; Usuwanie."
- name="land manage banned" />
- <action description="Selekcja opcji &apos;Wstęp Płatny...&apos;"
- longdescription="Selekcja opcji &apos;Wstęp Płatny...&apos; pod O Posiadłości &gt; Dostęp."
- name="land manage passes" />
- <action description="Wyrzucanie i unieruchamianie Rezydentów na Posiadłościach"
- longdescription="Członkowie w Funkcji z tym Przywilejem mogą wpływać na niepożądanych na Posiadłościach Grupy Rezydentów wybierając ich prawym klawiszem myszki i wybierając Więcej &gt; &apos;Wyrzuć...&apos; albo &apos;Unieruchom...&apos;."
- name="land admin" />
+ <action_set description="Przywileje pozwalające na dawanie i odbieranie dostępu do Posiadłości Grupy zawierające możliwości unieruchomiania i wyrzucania Rezydentów." name="Parcel Access">
+ <action description="Zarządzanie Listą Dostępu do Posiadłości" longdescription="Zarządzanie Listą Dostępu do Posiadłości pod O Posiadłości &gt; Dostęp." name="land manage allowed"/>
+ <action description="Zarządzanie Listą Usuniętych z Posiadłości (Bany)" longdescription="Zarządzanie Listą Dostępu do Posiadłości pod O Posiadłości &gt; Dostęp." name="land manage banned"/>
+ <action description="Selekcja opcji &apos;Wstęp Płatny&apos;" longdescription="Selekcja opcji &apos;Wstęp Płatny&apos;; pod O Posiadłości &gt; Dostęp." name="land manage passes"/>
+ <action description="Wyrzucanie i unieruchamianie Rezydentów na Posiadłościach" longdescription="Członkowie w Funkcji z tym Przywilejem mogą wpływać na niepożądanych na Posiadłościach Grupy Rezydentów wybierając ich prawym klawiszem myszki i wybierając &apos;;Wyrzuć&apos; albo &apos;Unieruchom&apos;." name="land admin"/>
</action_set>
- <action_set
- description="Przywileje pozwalające na odsyłanie obiektów i przemieszczanie roślin z Linden Lab. Użyteczne przy porządkowaniu i przemieszczaniu roślinności. *UWAGA* Odsyłanie obiektów jest nieodwracalne."
- name="Parcel Content">
- <action description="Odsyłanie obiektów należących do Grupy"
- longdescription="Odsyłanie obiektów należących do Grupy pod O Posiadłości &gt; Obiekty."
- name="land return group owned" />
- <action description="Odsyłanie obiektów przypisanych do Grupy"
- longdescription="Odsyłanie obiektów przypisanych do Grupy pod O Posiadłości &gt; Obiekty."
- name="land return group set" />
- <action description="Odsyłanie obiektów nie przypisanych do Grupy"
- longdescription="Odsyłanie obiektów nie przypisanych do Grupy pod O Posiadłości &gt; Obiekty."
- name="land return non group" />
- <action description="Ogrodnictwo używając roślin z Linden Lab"
- longdescription="Ogrodnictwo pozwala na umieszczanie i przemieszczanie drzew, roślin i trawy z Linden Lab. Te obiekty znajdują się w Twojej Szafie pod Zbiór &gt; Obiekty, mogą też być stworzone używając przycisku Buduj."
- name="land gardening" />
+ <action_set description="Przywileje pozwalające na odsyłanie obiektów i przemieszczanie roślin z Linden Lab. Użyteczne przy porządkowaniu i przemieszczaniu roślinności. *UWAGA* Odsyłanie obiektów jest nieodwracalne." name="Parcel Content">
+ <action description="Odsyłanie obiektów należących do Grupy" longdescription="Odsyłanie obiektów należących do Grupy pod O Posiadłości &gt; Obiekty." name="land return group owned"/>
+ <action description="Odsyłanie obiektów przypisanych do Grupy" longdescription="Odsyłanie obiektów przypisanych do Grupy pod O Posiadłości &gt; Obiekty." name="land return group set"/>
+ <action description="Odsyłanie obiektów nie przypisanych do Grupy" longdescription="Odsyłanie obiektów nie przypisanych do Grupy pod O Posiadłości &gt; Obiekty." name="land return non group"/>
+ <action description="Ogrodnictwo używając roślin z Linden Lab" longdescription="Możliwość przemieszczenia roślin z Linden Lab. Obiekty te mogą zostać odnalezione w Twojej Szafie, w folderze Biblioteka &gt; Folderze Obiektów lub mogą zostać stworzone dzięki aktywacji Narzędzi Edycji." name="land gardening"/>
</action_set>
- <action_set
- description="Przywileje pozwalające na przypisywanie, modyfikacje i sprzedaż obiektów należących do Grupy. Dostęp poprzez Narzędzia Edycji &gt; Ogólne. Wybierz obiekt prawym klawiszem myszki i wybierz Edycja żeby zobaczyć ustawienia."
- name="Object Management">
- <action description="Przypisywanie obiektów do Grupy"
- longdescription="Przypisywanie obiektów do Grupy pod Narzędzia Edycji &gt; Ogólne."
- name="object deed" />
- <action
- description="Manipulowanie (wklejanie, kopiowanie, modyfikacja) obiektami należącymi do Grupy"
- longdescription="Manipulowanie (wklejanie, kopiowanie, modyfikacja) obiektami należącymi do Grupy pod Narzędzia Edycji &gt; Ogólne."
- name="object manipulate" />
- <action description="Sprzedaż obiektów należących do Grupy"
- longdescription="Sprzedaż obiektów należących do Grupy pod Narzędzia Edycji &gt; Ogólne."
- name="object set sale" />
+ <action_set description="Przywileje pozwalające na odsyłanie obiektów i przemieszczenia roślin z Linden Lab. Użyteczne przy porządkowaniu i przemieszczenia roślinności. *UWAGA* Odsyłanie obiektów jest nieodwracalne." name="Object Management">
+ <action description="Przypisywanie obiektów do Grupy" longdescription="Przypisywanie obiektów do Grupy w Narzędziach Edycji &gt; Ogólne" name="object deed"/>
+ <action description="Manipulowanie (wklejanie, kopiowanie, modyfikacja) obiektami należącymi do Grupy" longdescription="Manipulowanie (wklejanie, kopiowanie, modyfikacja) obiektami należącymi do Grupy w Narzędziach Edycji &gt; Ogólne" name="object manipulate"/>
+ <action description="Sprzedaż obiektów należących do Grupy" longdescription="Sprzedaż obiektów należących do Grupy pod Narzędzia Edycji &gt; Ogólne." name="object set sale"/>
</action_set>
- <action_set
- description="Przywileje pozwalające na wybór opłat grupowych, otrzymywanie dochodu i ograniczanie dostępu do historii konta grupy."
- name="Accounting">
- <action description="Opłaty grupowe i dochód grupowy"
- longdescription="Członkowie w Funkcji z tym Przywilejem będą automatycznie wnosić opłaty grupowe i będą otrzymywać dochód grupowy. Tzn. będą codziennie otrzymywać część dochodu ze sprzedaży Posiadłości Grupy oraz będą partycypować w kosztach ogłoszeń itp."
- name="accounting accountable" />
+ <action_set description="Przywileje pozwalające na wybór opłat grupowych, otrzymywanie dochodu i ograniczanie dostępu do historii konta grupy." name="Accounting">
+ <action description="Opłaty grupowe i dochód grupowy" longdescription="Członkowie w Funkcji z tym Przywilejem będą automatycznie wnosić opłaty grupowe i będą otrzymywać dochód grupowy. Tzn. będą codziennie otrzymywać część dochodu ze sprzedaży Posiadłości Grupy oraz będą partycypować w kosztach ogłoszeń itp." name="accounting accountable"/>
</action_set>
- <action_set
- description="Przywileje pozwalające na wysyłanie, odbieranie i czytanie Notek Grupy."
- name="Notices">
- <action description="Wysyłanie Notek"
- longdescription="Członkowie w Funkcji z tym Przywilejem mogą wysyłać Notki wybierając O Grupie &gt; Notek."
- name="notices send" />
- <action description="Odbieranie Notek i dostęp do dawniejszych Notek"
- longdescription="Członkowie w Funkcji z tym Przywilejem mogą odbierać nowe i czytać dawniejsze Notki wybierając O Grupie &gt; Notki."
- name="notices receive" />
+ <action_set description="Przywileje pozwalające na wysyłanie, odbieranie i czytanie Notek Grupy." name="Notices">
+ <action description="Wysyłanie Notek" longdescription="Członkowie w Funkcji z tym Przywilejem mogą wysyłać Notki wybierając O Grupie &gt; Notek." name="notices send"/>
+ <action description="Odbieranie Notek i dostęp do dawniejszych Notek" longdescription="Członkowie w Funkcji z tym Przywilejem mogą odbierać nowe i czytać dawniejsze Notki wybierając O Grupie &gt; Notki." name="notices receive"/>
</action_set>
- <action_set
- description="Przywileje pozwalające na zgłaszanie Propozycji, głosowanie nad Propozycjami i śledzenie historii głosowania."
- name="Proposals">
- <action description="Zgłaszanie Propozycji"
- longdescription="Członkowie w Funkcji z tym Przywilejem mogą zgłaszać Propozycje do głosowania wybierając O Grupie &gt; Propozycje."
- name="proposal start" />
- <action description="Głosowanie nad Propozycjami"
- longdescription="Członkowie w Funkcji z tym Przywilejem mogą głosować nad Propozycjami zgłoszonymi do głosowania wybierając O Grupie &gt; Propozycje."
- name="proposal vote" />
+ <action_set description="Przywileje pozwalające na zgłaszanie Propozycji, głosowanie nad Propozycjami i śledzenie historii głosowania." name="Proposals">
+ <action description="Zgłaszanie Propozycji" longdescription="Członkowie w Funkcji z tym Przywilejem mogą zgłaszać Propozycje do głosowania wybierając O Grupie &gt; Propozycje." name="proposal start"/>
+ <action description="Głosowanie nad Propozycjami" longdescription="Członkowie w Funkcji z tym Przywilejem mogą głosować nad Propozycjami zgłoszonymi do głosowania wybierając O Grupie &gt; Propozycje." name="proposal vote"/>
</action_set>
<action_set description="Przywileje kontrolujÄ…ce czat i rozmowy grupowe." name="Chat">
- <action description="Dostęp do Czatu Grupowego"
- longdescription="Członkowie w Funkcji z tym Przywilejem mogą uczestniczyć w czacie i rozmowach grupowych."
- name="join group chat" />
- <action description="Dostęp do Rozmów Grupowych"
- longdescription="Członkowie w Funkcji z tym Przywilejem mogą uczestniczyć w rozmowach grupowych. UWAGA: Dostęp do Czatu Grupowego jest wymagany dla rozmów grupowych."
- name="join voice chat" />
- <action description="Moderator Czatu Grupowego"
- longdescription="Członkowie w Funkcji z tym Przywilejem mogą kontrolować dostęp do czatu i rozmów grupowych."
- name="moderate group chat" />
+ <action description="Dostęp do Czatu Grupowego" longdescription="Członkowie w Funkcji z tym Przywilejem mogą uczestniczyć w czacie i rozmowach grupowych." name="join group chat"/>
+ <action description="Dostęp do Rozmów Grupowych" longdescription="Członkowie w Funkcji z tym Przywilejem mogą uczestniczyć w rozmowach grupowych. UWAGA: Dostęp do Czatu Grupowego jest wymagany dla rozmów grupowych." name="join voice chat"/>
+ <action description="Moderator Czatu Grupowego" longdescription="Członkowie w Funkcji z tym Przywilejem mogą kontrolować dostęp do czatu i rozmów grupowych." name="moderate group chat"/>
</action_set>
</role_actions>
diff --git a/indra/newview/skins/default/xui/pl/sidepanel_appearance.xml b/indra/newview/skins/default/xui/pl/sidepanel_appearance.xml
new file mode 100644
index 0000000000..ecbf262777
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/sidepanel_appearance.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Ubrania" name="appearance panel">
+ <string name="No Outfit" value="Bez Ubrania"/>
+ <panel name="panel_currentlook">
+ <text name="currentlook_title">
+ (niezapisane)
+ </text>
+ </panel>
+ <filter_editor label="PrzeglÄ…daj Ubrania" name="Filter"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/sidepanel_inventory.xml b/indra/newview/skins/default/xui/pl/sidepanel_inventory.xml
new file mode 100644
index 0000000000..d7a813b1b7
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/sidepanel_inventory.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Rzeczy" name="objects panel">
+ <panel label="" name="sidepanel__inventory_panel">
+ <panel name="button_panel">
+ <button label="Profil" name="info_btn"/>
+ <button label="Ubierz" name="wear_btn"/>
+ <button label="Odtwarzaj" name="play_btn"/>
+ <button label="Teleportuj" name="teleport_btn"/>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/sidepanel_item_info.xml b/indra/newview/skins/default/xui/pl/sidepanel_item_info.xml
new file mode 100644
index 0000000000..3b038a7102
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/sidepanel_item_info.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="item properties" title="Profil Obiektu">
+ <panel.string name="unknown">
+ (nieznany)
+ </panel.string>
+ <panel.string name="public">
+ (publiczny)
+ </panel.string>
+ <panel.string name="you_can">
+ Ty możesz:
+ </panel.string>
+ <panel.string name="owner_can">
+ Właściciel może:
+ </panel.string>
+ <panel.string name="acquiredDate">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </panel.string>
+ <text name="title" value="Profil Obiektu"/>
+ <text name="where" value="(Szafa)"/>
+ <panel label="">
+ <text name="LabelItemNameTitle">
+ Nazwa:
+ </text>
+ <text name="LabelItemDescTitle">
+ Opis:
+ </text>
+ <text name="LabelCreatorTitle">
+ Twórca:
+ </text>
+ <button label="Profil..." name="BtnCreator"/>
+ <text name="LabelOwnerTitle">
+ Właściciel:
+ </text>
+ <button label="Profil..." name="BtnOwner"/>
+ <text name="LabelAcquiredTitle">
+ Nabyte:
+ </text>
+ <text name="LabelAcquiredDate">
+ Wed May 24 12:50:46 2006
+ </text>
+ <panel name="perms_inv">
+ <text name="perm_modify">
+ Ty możesz:
+ </text>
+ <check_box label="Zmienia" name="CheckOwnerModify"/>
+ <check_box label="Kopiuje" name="CheckOwnerCopy"/>
+ <check_box label="Sprzedaje/Oddaje" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ Każdy:
+ </text>
+ <check_box label="Kopiuje" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ Grupa:
+ </text>
+ <check_box label="Udostępnij" name="CheckShareWithGroup" tool_tip="Pozwól wszystkim członkom ustawionej grupy na dzielenie prawa do modyfikacji dla tego obiektu. Musisz Przypisać aby aktywować ograniczenia wynikające z roli."/>
+ <text name="NextOwnerLabel">
+ Następny Właściciel:
+ </text>
+ <check_box label="Modyfikuje" name="CheckNextOwnerModify"/>
+ <check_box label="Kopiuje" name="CheckNextOwnerCopy"/>
+ <check_box label="Sprzedaje/Oddaje" name="CheckNextOwnerTransfer" tool_tip="Następny właściciel może oddać lub sprzedać ten obiekt"/>
+ </panel>
+ <check_box label="Na Sprzedaż" name="CheckPurchase"/>
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="Kopia" name="Copy"/>
+ <combo_box.item label="Originał" name="Original"/>
+ </combo_box>
+ <spinner label="Cena: L$" name="Edit Cost"/>
+ </panel>
+ <panel name="button_panel">
+ <button label="Anuluj" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/sidepanel_task_info.xml b/indra/newview/skins/default/xui/pl/sidepanel_task_info.xml
new file mode 100644
index 0000000000..17cd13f970
--- /dev/null
+++ b/indra/newview/skins/default/xui/pl/sidepanel_task_info.xml
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="object properties" title="Profil Obiektu">
+ <panel.string name="text deed continued">
+ Przypisz
+ </panel.string>
+ <panel.string name="text deed">
+ Przypisz
+ </panel.string>
+ <panel.string name="text modify info 1">
+ Możesz modyfikować ten obiekt
+ </panel.string>
+ <panel.string name="text modify info 2">
+ Możesz modyfikować te obiekty
+ </panel.string>
+ <panel.string name="text modify info 3">
+ Nie możesz modyfikować tego obiektu
+ </panel.string>
+ <panel.string name="text modify info 4">
+ Nie możesz modyfikować tych obiektów
+ </panel.string>
+ <panel.string name="text modify warning">
+ Ten obiekt ma części zgrupowane
+ </panel.string>
+ <panel.string name="Cost Default">
+ Cena: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ Cena całkowita: L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Cena za jednostkÄ™: L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Cena mieszana
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Sprzedaż mieszana
+ </panel.string>
+ <text name="title" value="Profil Obiektu"/>
+ <text name="where" value="(w świecie)"/>
+ <panel label="" name="properties_panel">
+ <text name="Name:">
+ Nazwa:
+ </text>
+ <text name="Description:">
+ Opis:
+ </text>
+ <text name="CreatorNameLabel">
+ Twórca:
+ </text>
+ <text name="Creator Name">
+ Erica Linden
+ </text>
+ <text name="Owner:">
+ Właściciel:
+ </text>
+ <text name="Owner Name">
+ Erica Linden
+ </text>
+ <text name="Group_label">
+ Grupa:
+ </text>
+ <button name="button set group" tool_tip="Wybierz grupę by udostępnić jej prawa do tego obiektu"/>
+ <name_box initial_value="Åadowanie..." name="Group Name Proxy"/>
+ <button label="Przypisz" label_selected="Przypisz" name="button deed" tool_tip="Opcja przepisania udostępnia obiektowi takie same prawa jak zostały zaznaczone dla następnego właściciela. Obiekty udostępnione grupie mogą zostać przepisane dla grupy przez oficera grupy."/>
+ <text name="label click action">
+ Kliknij by:
+ </text>
+ <combo_box name="clickaction">
+ <combo_box.item label="Dotknij (domyślne)" name="Touch/grab(default)"/>
+ <combo_box.item label="Usiądź na obiekcie" name="Sitonobject"/>
+ <combo_box.item label="Kup obiekt" name="Buyobject"/>
+ <combo_box.item label="Zapłać obiektowi" name="Payobject"/>
+ <combo_box.item label="Otwórz" name="Open"/>
+ </combo_box>
+ <panel name="perms_inv">
+ <text name="perm_modify">
+ Możesz modyfikować ten obiekt
+ </text>
+ <text name="Anyone can:">
+ Każdy:
+ </text>
+ <check_box label="Kopiuj" name="checkbox allow everyone copy"/>
+ <check_box label="Przesuń" name="checkbox allow everyone move"/>
+ <text name="GroupLabel">
+ Groupie:
+ </text>
+ <check_box label="Udostępnij" name="checkbox share with group" tool_tip="Udostępnij prawa do modyfikacji tego obiektu wszystkim członkom, którzy posiadają przywilej modyfikacji obiektów grupy. By ograniczyć, przypisz obiekt do grupy."/>
+ <text name="NextOwnerLabel">
+ Następny Właściciel:
+ </text>
+ <check_box label="Modyfikuj" name="checkbox next owner can modify"/>
+ <check_box label="Kopiuj" name="checkbox next owner can copy"/>
+ <check_box label="Oddaj" name="checkbox next owner can transfer" tool_tip="Następny właściciel może sprzedać lub oddać ten obiekt"/>
+ </panel>
+ <check_box label="Na Sprzedaż" name="checkbox for sale"/>
+ <combo_box name="sale type">
+ <combo_box.item label="Kopiuj" name="Copy"/>
+ <combo_box.item label="Treść" name="Contents"/>
+ <combo_box.item label="Oryginał" name="Original"/>
+ </combo_box>
+ <spinner label="Cena: L$" name="Edit Cost"/>
+ <check_box label="Pokaż w wyszukiwarce" name="search_check" tool_tip="Udostępnij widzialność tego obiektu w wyszukiwarce"/>
+ <text name="B:">
+ B:
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ E:
+ </text>
+ <text name="N:">
+ N:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
+ <panel name="button_panel">
+ <button label="Otwórz" name="open_btn"/>
+ <button label="Zapłać" name="pay_btn"/>
+ <button label="Kup" name="buy_btn"/>
+ <button label="Szczegóły" name="details_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml
index e8dcfac02d..c72f783a51 100755..100644
--- a/indra/newview/skins/default/xui/pl/strings.xml
+++ b/indra/newview/skins/default/xui/pl/strings.xml
@@ -1,9 +1,12 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- This file contains strings that used to be hardcoded in the source.
It is only for those strings which do not belong in a floater.
- For example, the strings used in avatar chat bubbles, and strings
+ For example, the strings used in avatar chat bubbles, and strings
that are returned from one component and may appear in many places-->
<strings>
+ <string name="CAPITALIZED_APP_NAME">
+ SECOND LIFE
+ </string>
<string name="SUPPORT_SITE">
Portal Pomocy Second Life
</string>
@@ -11,7 +14,22 @@
Wykrywanie dysku twardego...
</string>
<string name="StartupLoading">
- Åadowanie
+ Åadowanie [APP_NAME]...
+ </string>
+ <string name="StartupClearingCache">
+ Czyszczenie bufora danych...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ Inicjowanie bufora danych tekstur...
+ </string>
+ <string name="StartupInitializingVFS">
+ Inicjowanie VFS...
+ </string>
+ <string name="ProgressRestoring">
+ Przywracanie...
+ </string>
+ <string name="ProgressChangingResolution">
+ Zmiana rozdzielczości...
</string>
<string name="LoginInProgress">
Trwa logowanie. [APP_NAME] Proszę czekać.
@@ -73,12 +91,33 @@
<string name="LoginFailedNoNetwork">
Błąd sieci: Brak połączenia z siecią, sprawdź status swojego połączenia internetowego.
</string>
+ <string name="LoginFailed">
+ Logowanie nie powiodło się.
+ </string>
<string name="Quit">
Wyłącz Program
</string>
<string name="AgentLostConnection">
Ten region może mieć problemy. Sprawdź podłączenie do Internetu.
</string>
+ <string name="SavingSettings">
+ Zachowanie ustawień...
+ </string>
+ <string name="LoggingOut">
+ Trwa wylogowanie...
+ </string>
+ <string name="ShuttingDown">
+ Zamykanie...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ Nastąpiło rozłączenie z regionem.
+ </string>
+ <string name="SentToInvalidRegion">
+ Region jest niedostępny.
+ </string>
+ <string name="TestingDisconnect">
+ Nastąpiło rozłączenie testowania klienta
+ </string>
<string name="TooltipPerson">
Osoba
</string>
@@ -131,7 +170,25 @@
Kliknij by zobaczyć szczegóły tego miejsca
</string>
<string name="TooltipAgentUrl">
- Kliknij by zobaczyć profil tego rezydenta
+ Kliknij aby zobaczyc profil Rezydenta
+ </string>
+ <string name="TooltipAgentMute">
+ Kliknij aby wyciszyc tego Rezydenta
+ </string>
+ <string name="TooltipAgentUnmute">
+ Kliknij aby cofnąć zablokowanie tego Rezydenta
+ </string>
+ <string name="TooltipAgentIM">
+ Kliknij aby wysłać wiadomość IM do tego Rezydenta
+ </string>
+ <string name="TooltipAgentPay">
+ Kliknij aby zapłacić temu Rezydentowi
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Kliknij aby oferować teleport temu Rezydentowi
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Kliknij aby wysłać temu Rezydentowi zaproszenie do Znajomych
</string>
<string name="TooltipGroupUrl">
Kliknij by zobaczyć opis tej grupy
@@ -158,14 +215,33 @@
Kliknij by uruchomić secondlife:// command
</string>
<string name="CurrentURL" value=" Obecny Adres: [CurrentURL]"/>
+ <string name="TooltipPrice" value="L$[PRICE]-"/>
<string name="SLurlLabelTeleport">
Teleportuj do
</string>
<string name="SLurlLabelShowOnMap">
Pokaż na Mapie
</string>
+ <string name="SLappAgentMute">
+ Zablokuj
+ </string>
+ <string name="SLappAgentUnmute">
+ Cofnij zablokowanie
+ </string>
+ <string name="SLappAgentIM">
+ IM
+ </string>
+ <string name="SLappAgentPay">
+ Zapłać
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Teleportuj do
+ </string>
+ <string name="SLappAgentRequestFriend">
+ Oferta znajomości
+ </string>
<string name="BUTTON_CLOSE_DARWIN">
- Zamknij (&#8984;W)
+ Zamknij (⌘W)
</string>
<string name="BUTTON_CLOSE_WIN">
Zamknij (Ctrl+W)
@@ -182,9 +258,6 @@
<string name="BUTTON_DOCK">
Przyłącz
</string>
- <string name="BUTTON_UNDOCK">
- Odłącz
- </string>
<string name="BUTTON_HELP">
Pokaż Pomoc
</string>
@@ -209,9 +282,6 @@
<string name="AvatarNameWaiting">
(ładowanie)
</string>
- <string name="AvatarNameHippos">
- (hippos)
- </string>
<string name="GroupNameNone">
(brak danych)
</string>
@@ -320,6 +390,9 @@
<string name="symbolic link">
link
</string>
+ <string name="symbolic folder link">
+ link folderu
+ </string>
<string name="AvatarAway">
Åšpi
</string>
@@ -572,6 +645,9 @@
<string name="hang_up">
Połączenie rozmowy utracone.
</string>
+ <string name="reconnect_nearby">
+ Przełączanie do pobliskich rozmów głosowych
+ </string>
<string name="ScriptQuestionCautionChatGranted">
&apos;[OBJECTNAME]&apos;, właściciel: &apos;[OWNERNAME]&apos;, położenie: [REGIONNAME] [REGIONPOS], pozwala Ci na: [PERMISSIONS].
</string>
@@ -734,6 +810,9 @@
<string name="invalid">
niewłaściwa funkcja
</string>
+ <string name="NewWearable">
+ Nowa [WEARABLE_ITEM]
+ </string>
<string name="next">
Następne
</string>
@@ -764,11 +843,8 @@
<string name="TeleportOffer">
Oferta teleportacji
</string>
- <string name="StartUpNotification">
- [%d] nowe zawiadomienie zostało wysłane kiedy byłeś w trybie oddalenia...
- </string>
<string name="StartUpNotifications">
- [%d] nowe zawiadomienia zostały wysłane kiedy byłeś w trybie oddalenia...
+ Nowe zawiadomienia zostały wysłane kiedy byłeś w trybie oddalenia...
</string>
<string name="OverflowInfoChannelString">
Masz jeszcze [%d] powiadomień
@@ -804,11 +880,13 @@
Wybierz ESC by powrócić do trybu widoku normalne
</string>
<string name="InventoryNoMatchingItems">
- Brak wyników w szafie dla wpisanego słowa.
+ Obiektu nie znaleziono w Szafie. Spróbuj [secondlife:///app/search/groups &quot;Search&quot;].
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ Przeciągnij landmark tutaj aby dodać go do swoich ulubionych.
</string>
<string name="InventoryNoTexture">
- Nie posiadasz kopi
-tej tekstury w swojej szafie
+ Nie posiadasz kopii tej tekstury w Twojej Szafie.
</string>
<string name="no_transfer" value=" (brak oddawania)"/>
<string name="no_modify" value=" (brak modyfikowania)"/>
@@ -823,6 +901,7 @@ tej tekstury w swojej szafie
Brak zawartości
</string>
<string name="WornOnAttachmentPoint" value=" (założony na [ATTACHMENT_POINT])"/>
+ <string name="ActiveGesture" value="[GESLABEL] (aktywne)"/>
<string name="Chat" value=" Czat :"/>
<string name="Sound" value=" Dźwięk :"/>
<string name="Wait" value=" --- Zaczekaj :"/>
@@ -916,6 +995,9 @@ tej tekstury w swojej szafie
<string name="InvFolder My Outfits">
Moje Ubranie
</string>
+ <string name="InvFolder Accessories">
+ Akcesoria
+ </string>
<string name="InvFolder Friends">
Znajomi
</string>
@@ -1266,11 +1348,164 @@ tej tekstury w swojej szafie
wszystkie majątki, które nadzorujesz dla [OWNER]
</string>
<string name="RegionInfoAllowedResidents">
- Rezydenci mający dostęp: ([ALLOWEDAGENTS], max [MAXACCESS])
+ Dozwoleni Rezydenci: ([ALLOWEDAGENTS], maks. [MAXACCESS])
</string>
<string name="RegionInfoAllowedGroups">
Grupy mające dostęp: ([ALLOWEDGROUPS], max [MAXACCESS])
</string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ Pamięć Skryptów Parceli
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ Parcele: [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ Pamięć wykorzystana: [COUNT] kb z [MAX] kb; [AVAILABLE] kb pozostało
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ Pamięć wykorzystana: [COUNT] kb
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ Skrypty URL Parceli
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ URL: [COUNT] z [MAX]; [AVAILABLE] dostępne
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ URL: [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Błąd wyszukiwania informacji
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ Posiadłość nie została wybrana
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ Błąd: informacja o skrypcie jest dostępna tylko w obecnym regionie.
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ Wyszukiwanie informacji...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ Nie masz pozwolenia na sprawdzenie parceli.
+ </string>
+ <string name="SITTING_ON">
+ Usiądź na
+ </string>
+ <string name="ATTACH_CHEST">
+ Klatka piersiowa
+ </string>
+ <string name="ATTACH_HEAD">
+ Głowa
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ Lewe RamiÄ™
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ RamiÄ™ Prawe
+ </string>
+ <string name="ATTACH_LHAND">
+ Ręka Lewa
+ </string>
+ <string name="ATTACH_RHAND">
+ Prawa Ręka
+ </string>
+ <string name="ATTACH_LFOOT">
+ Lewa Stopa
+ </string>
+ <string name="ATTACH_RFOOT">
+ Stopa Prawa
+ </string>
+ <string name="ATTACH_BACK">
+ Plecy
+ </string>
+ <string name="ATTACH_PELVIS">
+ Miednica
+ </string>
+ <string name="ATTACH_MOUTH">
+ Usta
+ </string>
+ <string name="ATTACH_CHIN">
+ Podbródek
+ </string>
+ <string name="ATTACH_LEAR">
+ Ucho Lewe
+ </string>
+ <string name="ATTACH_REAR">
+ Prawe Ucho
+ </string>
+ <string name="ATTACH_LEYE">
+ Lewe Oko
+ </string>
+ <string name="ATTACH_REYE">
+ Prawe Oko
+ </string>
+ <string name="ATTACH_NOSE">
+ Nos
+ </string>
+ <string name="ATTACH_RUARM">
+ Ramię P Górne
+ </string>
+ <string name="ATTACH_RLARM">
+ Prawe dolne ramiÄ™
+ </string>
+ <string name="ATTACH_LUARM">
+ Ramię L Górne
+ </string>
+ <string name="ATTACH_LLARM">
+ Lewe dolne ramiÄ™
+ </string>
+ <string name="ATTACH_RHIP">
+ Biodro prawe
+ </string>
+ <string name="ATTACH_RULEG">
+ P Górna Noga
+ </string>
+ <string name="ATTACH_RLLEG">
+ Noga P Dolna
+ </string>
+ <string name="ATTACH_LHIP">
+ Biodro Lewe
+ </string>
+ <string name="ATTACH_LULEG">
+ L Górna Noga
+ </string>
+ <string name="ATTACH_LLLEG">
+ Noga L Dolna
+ </string>
+ <string name="ATTACH_BELLY">
+ Brzuch
+ </string>
+ <string name="ATTACH_RPEC">
+ Prawa klatka
+ </string>
+ <string name="ATTACH_LPEC">
+ Lewa klatka
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ HUD Åšrodek 2
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ HUD P Górny
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ HUD Środek Górny
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ HUD L Góra
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ HUD Åšrodek 1
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ HUD Dolna L Strona
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ HUD Dolny
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ HUD Dolna P Strona
+ </string>
<string name="CursorPos">
Linia [LINE], Kolumna [COLUMN]
</string>
@@ -1280,11 +1515,17 @@ tej tekstury w swojej szafie
<string name="PanelContentsNewScript">
Nowy Skrypt
</string>
+ <string name="PanelContentsTooltip">
+ Zawartość obiektu
+ </string>
+ <string name="BusyModeResponseDefault">
+ Rezydent, do którego wysłałeś wiadomość prywatną znajduje się w trybie pracy. Oznacza to, iż Twoja wiadomość zostanie zapisana do przeglądnięcia poźniej.
+ </string>
<string name="MuteByName">
(według nazwy)
</string>
<string name="MuteAgent">
- (rezydenta)
+ (Rezydent)
</string>
<string name="MuteObject">
(obiekt)
@@ -1315,6 +1556,15 @@ tej tekstury w swojej szafie
<string name="ClassifiedUpdateAfterPublish">
(zostanie zaktualizowane po publikacji)
</string>
+ <string name="NoPicksClassifiedsText">
+ Nie dodałeś nic do Ulubionych i Reklam. Kliknij na poniższy przycisk Dodaj aby dodać miejsce do Ulubionych lub Reklamy.
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ Użytkownik nie posiada Ulubionych lub Reklam
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ Åadowanie...
+ </string>
<string name="MultiPreviewTitle">
PodglÄ…d
</string>
@@ -1385,22 +1635,36 @@ tej tekstury w swojej szafie
Anuluj
</string>
<string name="UploadingCosts">
- Koszty załadowania [%s]
+ Załadowanie [NAME] kosztuje [AMOUNT]L$
+ </string>
+ <string name="BuyingCosts">
+ Cena zakupu tego wynosi L$ [AMOUNT]
</string>
<string name="UnknownFileExtension">
Nieznane rozszerzenie dla pliku [.%s]
Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
</string>
+ <string name="MuteObject2">
+ Zablokuj
+ </string>
<string name="AddLandmarkNavBarMenu">
Dodaj Ulubione Miejsce...
</string>
<string name="EditLandmarkNavBarMenu">
Edytuj Ulubione Miejce...
</string>
- <string name="accel-mac-control">&#8963;</string>
- <string name="accel-mac-command">&#8984;</string>
- <string name="accel-mac-option">&#8997;</string>
- <string name="accel-mac-shift">&#8679;</string>
+ <string name="accel-mac-control">
+ ⌃
+ </string>
+ <string name="accel-mac-command">
+ ⌘
+ </string>
+ <string name="accel-mac-option">
+ ⌥
+ </string>
+ <string name="accel-mac-shift">
+ ⇧
+ </string>
<string name="accel-win-control">
Ctrl+
</string>
@@ -1638,43 +1902,25 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Cień o godzinie 5
</string>
<string name="All White">
- Wszystko Białe
+ Wszystko białe
</string>
<string name="Anime Eyes">
- Animuj Oczy
+ Animuj oczy
</string>
<string name="Arced">
Obrócony
</string>
<string name="Arm Length">
- Długość Ramienia
+ Długość ramienia
</string>
<string name="Attached">
Dołączone
</string>
<string name="Attached Earlobes">
- Płatki Uszu Dołączone
- </string>
- <string name="Back Bangs">
- Tylnie Pasemka
- </string>
- <string name="Back Bangs Down">
- Tylnie Pasemka w Dół
- </string>
- <string name="Back Bangs Up">
- Tylnie Pasemka do Góry
+ Płatki uszu dołączone
</string>
<string name="Back Fringe">
- Tylnia Grzywka
- </string>
- <string name="Back Hair">
- Back Hair
- </string>
- <string name="Back Hair Down">
- Back Hair Down
- </string>
- <string name="Back Hair Up">
- Back Hair Up
+ Tylnia grzywka
</string>
<string name="Baggy">
Wypchane
@@ -1682,12 +1928,6 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
<string name="Bangs">
Pasemka
</string>
- <string name="Bangs Down">
- Pasemka w Dół
- </string>
- <string name="Bangs Up">
- Pasemka do Góry
- </string>
<string name="Beady Eyes">
Oczy Załzawione
</string>
@@ -1700,17 +1940,14 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
<string name="Big Butt">
Duży Pośladek
</string>
- <string name="Big Eyeball">
- Duża Gałka Oczna
- </string>
<string name="Big Hair Back">
- Duże Włosy: z Tyłu
+ Duże Włosy: z tyłu
</string>
<string name="Big Hair Front">
- Duże Włosy: z Przodu
+ Duże Włosy: z przodu
</string>
<string name="Big Hair Top">
- Duże Włosy: z Góry
+ Duże Włosy: z góry
</string>
<string name="Big Head">
Duża Głowa
@@ -1728,22 +1965,22 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Blond
</string>
<string name="Blonde Hair">
- Włosy Koloru Blond
+ Włosy Blond
</string>
<string name="Blush">
Rumieniec
</string>
<string name="Blush Color">
- Kolor Rumieńca
+ Kolor rumieńca
</string>
<string name="Blush Opacity">
- Intensywność Rumieńca
+ Intensywność rumieńca
</string>
<string name="Body Definition">
- Detale Ciała
+ Detale ciała
</string>
<string name="Body Fat">
- Zawartość Tkanki Tłuszczowej
+ Zawartość tkanki tłuszczowej
</string>
<string name="Body Freckles">
Piegi
@@ -1761,13 +1998,13 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Bow Legged
</string>
<string name="Breast Buoyancy">
- Jędrność Piersi
+ Jędrność piersi
</string>
<string name="Breast Cleavage">
- Odstęp Między Piersiami
+ Odstęp między piersiami
</string>
<string name="Breast Size">
- Rozmiar Piersi
+ Rozmiar piersi
</string>
<string name="Bridge Width">
Szerokość
@@ -1776,7 +2013,7 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Szerokie
</string>
<string name="Brow Size">
- Rozmiar Czoła
+ Rozmiar czoła
</string>
<string name="Bug Eyes">
Bug Eyes
@@ -1812,34 +2049,34 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Chaplin
</string>
<string name="Cheek Bones">
- Kości Policzkowe
+ Kości policzkowe
</string>
<string name="Chest Size">
- Rozmiar Klatki Piersiowej
+ Rozmiar klatki piersiowej
</string>
<string name="Chin Angle">
- Kąt Podbródka
+ Kąt podbródka
</string>
<string name="Chin Cleft">
- Dołek w Podbródku
+ Dołek w podbródku
</string>
<string name="Chin Curtains">
- Zasłonięcie Podbródka
+ Zasłonięcie podbródka
</string>
<string name="Chin Depth">
- Długość Podbródka
+ Długość podbródka
</string>
<string name="Chin Heavy">
- Ciężar Podbródka
+ Ciężar podbródka
</string>
<string name="Chin In">
- Podbródek Wewnątrz
+ Podbródek wewnątrz
</string>
<string name="Chin Out">
- Podbródek Zewnętrzny
+ Podbródek zewnętrzny
</string>
<string name="Chin-Neck">
- Podwójny Podbródek
+ Podwójny podbródek
</string>
<string name="Clear">
Wyczyść
@@ -1854,32 +2091,29 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Zamknięte
</string>
<string name="Closed Back">
- Zamknięte z Tyłu
+ Zamknięte z tyłu
</string>
<string name="Closed Front">
- Zamknięte z Przodu
+ Zamknięte z przodu
</string>
<string name="Closed Left">
- Lewe Oko Zamknięte
+ Lewe Oko zamknięte
</string>
<string name="Closed Right">
- Prawe Oko Zamknięte
+ Prawe Oko zamknięte
</string>
<string name="Coin Purse">
Coin Purse
</string>
<string name="Collar Back">
- Kołnierz z Tyłu
+ Kołnierz z tyłu
</string>
<string name="Collar Front">
- Kołnierz z Przodu
+ Kołnierz z przodu
</string>
<string name="Corner Down">
Corner Down
</string>
- <string name="Corner Normal">
- Corner Normal
- </string>
<string name="Corner Up">
Corner Up
</string>
@@ -1887,10 +2121,7 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Pognieciony
</string>
<string name="Crooked Nose">
- Skrzywienie Nosa
- </string>
- <string name="Cropped Hair">
- Przycięte Włosy
+ Skrzywienie nosa
</string>
<string name="Cuff Flare">
Cuff Flare
@@ -1899,7 +2130,7 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Ciemne
</string>
<string name="Dark Green">
- Ciemne Zielone
+ Ciemne zielone
</string>
<string name="Darker">
Ciemniejsze
@@ -1910,17 +2141,11 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
<string name="Default Heels">
Domyślne Buty na Obcasie
</string>
- <string name="Default Toe">
- Domyślny Palec
- </string>
<string name="Dense">
Gęstość
</string>
- <string name="Dense hair">
- Gęste Włosy
- </string>
<string name="Double Chin">
- Podwójny Podbródek
+ Podwójny podbródek
</string>
<string name="Downturned">
Downturned
@@ -1929,61 +2154,58 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Duffle Bag
</string>
<string name="Ear Angle">
- Odstawanie Uszu
+ Odstawanie uszu
</string>
<string name="Ear Size">
- Rozmiar Uszu
+ Rozmiar uszu
</string>
<string name="Ear Tips">
- Wierzchołki Uszu
+ Wierzchołki uszu
</string>
<string name="Egg Head">
- Jajowata Głowa
+ Jajowata głowa
</string>
<string name="Eye Bags">
- Woreczek Åzowy
+ Woreczek łzowy
</string>
<string name="Eye Color">
- Kolor Oczu
+ Kolor oczu
</string>
<string name="Eye Depth">
- Głębokość Osadzenia Oczu
+ Głębokość osadzenia oczu
</string>
<string name="Eye Lightness">
- Ustawienie Jasności Oczu
+ Ustawienie jasności oczu
</string>
<string name="Eye Opening">
- Oczy Otwarte
+ Oczy otwarte
</string>
<string name="Eye Pop">
- Różnica w Wielkości Oczu
+ Różnica w wielkości oczu
</string>
<string name="Eye Size">
- Rozmiar Oczu
+ Rozmiar oczu
</string>
<string name="Eye Spacing">
- Rozstaw Oczu
- </string>
- <string name="Eyeball Size">
- Wielkość Gałki Ocznej
+ Rozstaw oczu
</string>
<string name="Eyebrow Arc">
- Åuk Brwiowy
+ Åuk brwiowy
</string>
<string name="Eyebrow Density">
- Gęstość Brwi
+ Gęstość brwi
</string>
<string name="Eyebrow Height">
- Wysokość Brwi
+ Wysokość brwi
</string>
<string name="Eyebrow Points">
- Kształt Brwi
+ Kształt brwi
</string>
<string name="Eyebrow Size">
- Rozmiar Brwi
+ Rozmiar brwi
</string>
<string name="Eyelash Length">
- Długość Rzęs
+ Długość rzęs
</string>
<string name="Eyeliner">
Eyeliner
@@ -1991,68 +2213,20 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
<string name="Eyeliner Color">
Kolor Eyeliner&apos;a
</string>
- <string name="Eyes Back">
- Eyes Back
- </string>
<string name="Eyes Bugged">
Eyes Bugged
</string>
- <string name="Eyes Forward">
- Eyes Forward
- </string>
- <string name="Eyes Long Head">
- Eyes Long Head
- </string>
- <string name="Eyes Shear Left Up">
- Eyes Shear Left Up
- </string>
- <string name="Eyes Shear Right Up">
- Eyes Shear Right Up
- </string>
- <string name="Eyes Short Head">
- Eyes Short Head
- </string>
- <string name="Eyes Spread">
- Rozmieszczenie Oczu
- </string>
- <string name="Eyes Sunken">
- Eyes Sunken
- </string>
- <string name="Eyes Together">
- Oczy Razem
- </string>
<string name="Face Shear">
- Usunięcie Twarzy
+ Usunięcie twarzy
</string>
<string name="Facial Definition">
- Detale Twarzy
+ Detale twarzy
</string>
<string name="Far Set Eyes">
Far Set Eyes
</string>
- <string name="Fat">
- Grubość
- </string>
- <string name="Fat Head">
- Gruba Głowa
- </string>
<string name="Fat Lips">
- Grube Usta
- </string>
- <string name="Fat Lower">
- Fat Lower
- </string>
- <string name="Fat Lower Lip">
- Fat Lower Lip
- </string>
- <string name="Fat Torso">
- Gruby Tułów
- </string>
- <string name="Fat Upper">
- Fat Upper
- </string>
- <string name="Fat Upper Lip">
- Fat Upper Lip
+ Grube usta
</string>
<string name="Female">
Kobieta
@@ -2064,64 +2238,49 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Palce
</string>
<string name="Flared Cuffs">
- Flared Cuffs
+ Rozszerzane rękawy
</string>
<string name="Flat">
Płaskość
</string>
<string name="Flat Butt">
- Płaskie Pośladki
+ Płaskie pośladki
</string>
<string name="Flat Head">
- Płaska Głowa
+ Płaska głowa
</string>
<string name="Flat Toe">
- Płaski Palec
+ Płaski palec
</string>
<string name="Foot Size">
- Rozmiar Stopy
+ Rozmiar stopy
</string>
<string name="Forehead Angle">
- Kształt Czoła
+ Kształt czoła
</string>
<string name="Forehead Heavy">
- Ciężar Czoła
+ Ciężar czoła
</string>
<string name="Freckles">
Piegi
</string>
- <string name="Front Bangs Down">
- Przednie Pasemka w Dół
- </string>
- <string name="Front Bangs Up">
- Przednie Pasemka do Góry
- </string>
<string name="Front Fringe">
Przednia Grzywka
</string>
- <string name="Front Hair">
- Front Hair
- </string>
- <string name="Front Hair Down">
- Front Hair Down
- </string>
- <string name="Front Hair Up">
- Przednie Włosy do Góry
- </string>
<string name="Full Back">
- Gęstość Włosów po Bokach
+ Gęstość włosów po bokach
</string>
<string name="Full Eyeliner">
- Gęsty Eyeliner
+ Gęsta kredka do oczu
</string>
<string name="Full Front">
- Gęsty Przód
+ Gęsty przód
</string>
<string name="Full Hair Sides">
- Gęste Włosy po Bokach
+ Gęste włosy po bokach
</string>
<string name="Full Sides">
- Gęste Boki
+ Gęste boki
</string>
<string name="Glossy">
Błyszczące
@@ -2130,64 +2289,64 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Rękawiczki
</string>
<string name="Glove Length">
- Długość Rękawiczek
+ Długość rękawiczek
</string>
<string name="Hair">
Włosy
</string>
<string name="Hair Back">
- Włosy: z Tyłu
+ Włosy: z tyłu
</string>
<string name="Hair Front">
- Włosy: z Przodu
+ Włosy: z przodu
</string>
<string name="Hair Sides">
- Hair: Boki
+ Włosy: boki
</string>
<string name="Hair Sweep">
- Kierunek Zaczesania
+ Kierunek zaczesania
</string>
<string name="Hair Thickess">
- Grubość Włosów
+ Grubość włosów
</string>
<string name="Hair Thickness">
- Grubość Włosów
+ Grubość włosów
</string>
<string name="Hair Tilt">
- Przesunięcie Fryzury
+ Przes. fryzury
</string>
<string name="Hair Tilted Left">
- Przesunięcie Fryzury w Lewo
+ Przes. fryzury L
</string>
<string name="Hair Tilted Right">
- Przesunięcie Fryzury w Prawo
+ Przes. fryzury P
</string>
<string name="Hair Volume">
- Włosy: Objętość
+ Włosy: objętość
</string>
<string name="Hand Size">
- Rozmiar Dłoni
+ Rozmiar dłoni
</string>
<string name="Handlebars">
Handlebars
</string>
<string name="Head Length">
- Długość Głowy
+ Długość głowy
</string>
<string name="Head Shape">
- Kształt Głowy
+ Kształt głowy
</string>
<string name="Head Size">
- Rozmiar Głowy
+ Rozmiar głowy
</string>
<string name="Head Stretch">
- Rozciągnięcie Głowy
+ Rozciągnięcie głowy
</string>
<string name="Heel Height">
- Wysokość Obcasa
+ Wysokość obcasa
</string>
<string name="Heel Shape">
- Ksztalt Obcasa
+ Ksztalt obcasa
</string>
<string name="Height">
Wysokość
@@ -2196,7 +2355,7 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Wysoka
</string>
<string name="High Heels">
- Wysokie Obcasy
+ Wysokie obcasy
</string>
<string name="High Jaw">
High Jaw
@@ -2211,34 +2370,34 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Wyżej
</string>
<string name="Hip Length">
- Długość Bioder
+ Długość bioder
</string>
<string name="Hip Width">
- Szerokość Bioder
+ Szerokość bioder
</string>
<string name="In">
W
</string>
<string name="In Shdw Color">
- Wewnętrzny Kolor Cienia
+ Wewnętrzny kolor cienia
</string>
<string name="In Shdw Opacity">
- Wewnętrzna Intensywność Cienia
+ Wewnętrzna intensywność cienia
</string>
<string name="Inner Eye Corner">
- Wenwętrzny Bok Oka
+ Wenwętrzny bok oka
</string>
<string name="Inner Eye Shadow">
- Wewnętrzny Cień Oka
+ Wewnętrzny cień oka
</string>
<string name="Inner Shadow">
- Wewnętrzny Cień
+ Wewnętrzny cień
</string>
<string name="Jacket Length">
- Długość Kurtki
+ Długość kurtki
</string>
<string name="Jacket Wrinkles">
- Zmarszczki na Kurtce
+ Zmarszczki na kurtce
</string>
<string name="Jaw Angle">
Jaw Angle
@@ -2256,7 +2415,7 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Jowls
</string>
<string name="Knee Angle">
- KÄ…t Kolana
+ KÄ…t kolana
</string>
<string name="Knock Kneed">
Knock Kneed
@@ -2265,22 +2424,22 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Duże
</string>
<string name="Large Hands">
- Duże Dłonie
+ Duże dłonie
</string>
<string name="Left Part">
Left Part
</string>
<string name="Leg Length">
- Długość Nogi
+ Długość nogi
</string>
<string name="Leg Muscles">
- Umięśnione Nogi
+ Umięśnione nogi
</string>
<string name="Less">
Mniej
</string>
<string name="Less Body Fat">
- Mniejsza Zawartości Tkanki Tłuszczowej
+ Mniejsza zawartości tkanki tłuszczowej
</string>
<string name="Less Curtains">
Less Curtains
@@ -2289,7 +2448,7 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Mniej Piegów
</string>
<string name="Less Full">
- Less Full
+ Mniej Pełne
</string>
<string name="Less Gravity">
Mniej Ciężaru
@@ -2298,25 +2457,25 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Less Love
</string>
<string name="Less Muscles">
- Mniej Mięśni
+ Mniej mięśni
</string>
<string name="Less Muscular">
- Mniej Umięśnienia
+ Mniej umięśnienia
</string>
<string name="Less Rosy">
Less Rosy
</string>
<string name="Less Round">
- Mniej ZaaokrÄ…glone
+ Mniej zaaokrÄ…glone
</string>
<string name="Less Saddle">
Less Saddle
</string>
<string name="Less Square">
- Mniej Kwadratowe
+ Mniej kwadratowe
</string>
<string name="Less Volume">
- Mniej Objętości
+ Mniej objętości
</string>
<string name="Less soul">
Less soul
@@ -2325,25 +2484,25 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Lżejsze
</string>
<string name="Lip Cleft">
- Szerokość Rozszczepienia Górnej Wargi
+ Szerokość Rozszczepienia górnej wargi
</string>
<string name="Lip Cleft Depth">
- Głębokość Rozszczepienia Górnej Wargi
+ Głębokość rozszczepienia górnej wargi
</string>
<string name="Lip Fullness">
- Pełność Ust
+ Pełne usta
</string>
<string name="Lip Pinkness">
- Róż Ust
+ Róż ust
</string>
<string name="Lip Ratio">
- Proporcje Ust
+ Proporcje ust
</string>
<string name="Lip Thickness">
- Grubość Ust
+ Grubość ust
</string>
<string name="Lip Width">
- Szerokość Ust
+ Szerokość ust
</string>
<string name="Lipgloss">
Połysk
@@ -2352,46 +2511,43 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Szminka
</string>
<string name="Lipstick Color">
- Kolor Szminki
+ Kolor szminki
</string>
<string name="Long">
Dlugość
</string>
<string name="Long Head">
- Długa Głowa
+ Długa głowa
</string>
<string name="Long Hips">
- Długie Biodra
+ Długie biodra
</string>
<string name="Long Legs">
- Długie Nogi
+ Długie nogi
</string>
<string name="Long Neck">
- Długi Kark
+ Długi kark
</string>
<string name="Long Pigtails">
- Długi Warkocz
+ Długi warkocz
</string>
<string name="Long Ponytail">
- Długi Kucyk
+ Długi kucyk
</string>
<string name="Long Torso">
- Długi Tułów
+ Długi tułów
</string>
<string name="Long arms">
- Dlugie Ramiona
- </string>
- <string name="Longcuffs">
- Długie Rękawy
+ Dlugie ramiona
</string>
<string name="Loose Pants">
- Luźne Spodnie
+ Luźne spodnie
</string>
<string name="Loose Shirt">
- Luźna Koszulka
+ Luźna koszulka
</string>
<string name="Loose Sleeves">
- Luźne Rękawy
+ Luźne rękawy
</string>
<string name="Love Handles">
Love Handles
@@ -2400,16 +2556,16 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Nisko
</string>
<string name="Low Heels">
- Niskie Obcasy
+ Niskie obcasy
</string>
<string name="Low Jaw">
- Niska Szczęka
+ Niska szczęka
</string>
<string name="Low Platforms">
Low Platforms
</string>
<string name="Low and Loose">
- Niskie i Luźne
+ Niskie i luźne
</string>
<string name="Lower">
Niżej
@@ -2424,7 +2580,7 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Mężczyzna
</string>
<string name="Middle Part">
- Część Środkowa
+ Część środkowa
</string>
<string name="More">
Więcej
@@ -2433,7 +2589,7 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
More Blush
</string>
<string name="More Body Fat">
- Więcej Zawartości Tkanki Tłuszczowej
+ Więcej zawartości tkanki tłuszczowej
</string>
<string name="More Curtains">
More Curtains
@@ -2442,34 +2598,34 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
More Eyeshadow
</string>
<string name="More Freckles">
- Więcej Piegów
+ Więcej piegów
</string>
<string name="More Full">
More Full
</string>
<string name="More Gravity">
- Więcej Ciężaru
+ Więcej ciężaru
</string>
<string name="More Lipstick">
- Więcej Szminki
+ Więcej szminki
</string>
<string name="More Love">
More Love
</string>
<string name="More Lower Lip">
- Więcej Dolnej Wargi
+ Więcej dolnej wargi
</string>
<string name="More Muscles">
- Więcej Mięśni
+ Więcej mięśni
</string>
<string name="More Muscular">
- Więcej Umięśnienia
+ Więcej umięśnienia
</string>
<string name="More Rosy">
More Rosy
</string>
<string name="More Round">
- Więcej Zaokrąglenia
+ Więcej zaokrąglenia
</string>
<string name="More Saddle">
More Saddle
@@ -2478,16 +2634,16 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
More Sloped
</string>
<string name="More Square">
- Więcej Kwadratowy
+ Więcej kwadratowy
</string>
<string name="More Upper Lip">
- Więcej Górnej Wargi
+ Więcej górnej wargi
</string>
<string name="More Vertical">
More Vertical
</string>
<string name="More Volume">
- Więcej Objętości
+ Więcej objętości
</string>
<string name="More soul">
More soul
@@ -2511,10 +2667,10 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Mutton Chops
</string>
<string name="Nail Polish">
- Lakier na Paznokciach
+ Lakier na paznokciach
</string>
<string name="Nail Polish Color">
- Kolor Lakieru na Paznokciach
+ Kolor lakieru na paznokciach
</string>
<string name="Narrow">
WÄ…skie
@@ -2532,10 +2688,10 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Naturalne
</string>
<string name="Neck Length">
- Długość Karku
+ Długość karku
</string>
<string name="Neck Thickness">
- Grubość Karku
+ Grubość karku
</string>
<string name="No Blush">
No Blush
@@ -2544,70 +2700,64 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Brak Eyeliner&apos;s
</string>
<string name="No Eyeshadow">
- Brak Cienia pod PowiekÄ…
- </string>
- <string name="No Heels">
- Brak Obcasów
+ Brak cienia pod powiekÄ…
</string>
<string name="No Lipgloss">
- Brak Połysku
+ Brak połysku
</string>
<string name="No Lipstick">
- Brak Szminki
+ Brak szminki
</string>
<string name="No Part">
No Part
</string>
<string name="No Polish">
- Brak Lakieru
+ Brak lakieru
</string>
<string name="No Red">
- Brak Czerwieni
+ Brak czerwieni
</string>
<string name="No Spikes">
- Brak Szpiców
+ Brak szpiców
</string>
<string name="No White">
- Brak Białego
+ Brak białego
</string>
<string name="No Wrinkles">
- Brak Zmarszczek
+ Brak zmarszczek
</string>
<string name="Normal Lower">
- Dół Normalny
+ Dół normalny
</string>
<string name="Normal Upper">
- Góra Normalna
+ Góra normalna
</string>
<string name="Nose Left">
- Nos w StronÄ™ LewÄ…
+ Nos w stronÄ™ lewÄ…
</string>
<string name="Nose Right">
- Nos w StronÄ™ PrawÄ…
+ Nos w stronÄ™ prawÄ…
</string>
<string name="Nose Size">
- Rozmiar Nosa
+ Rozmiar nosa
</string>
<string name="Nose Thickness">
- Grubość Nosa
+ Grubość nosa
</string>
<string name="Nose Tip Angle">
- KÄ…t Czubka Nosa
+ KÄ…t czubka nosa
</string>
<string name="Nose Tip Shape">
- Kształt Czubka Nosa
+ Kształt czubka nosa
</string>
<string name="Nose Width">
- Szerokość Nosa
+ Szerokość nosa
</string>
<string name="Nostril Division">
- Przegroda Nosa
+ Przegroda nosa
</string>
<string name="Nostril Width">
- Wielkość Dziurek w Nosie
- </string>
- <string name="Old">
- Stare
+ Wielkość dziurek w nosie
</string>
<string name="Opaque">
Intensywność
@@ -2616,16 +2766,16 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Otwarte
</string>
<string name="Open Back">
- Otwarte z Tyłu
+ Otwarte z tyłu
</string>
<string name="Open Front">
- Otwarte z Przodu
+ Otwarte z przodu
</string>
<string name="Open Left">
- Otwarte z Lewej
+ Otwarte z lewej
</string>
<string name="Open Right">
- Otwarte z Prawej
+ Otwarte z prawej
</string>
<string name="Orange">
Pomarańczowe
@@ -2634,19 +2784,19 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Zewnętrznie
</string>
<string name="Out Shdw Color">
- Zewnętrzny Kolor Cienia
+ Zewnętrzny kolor cienia
</string>
<string name="Out Shdw Opacity">
- Zewnętrzna Grubość Cienia
+ Zewnętrzna grubość cienia
</string>
<string name="Outer Eye Corner">
- Zewnętrzny Bok Oka
+ Zewnętrzny bok oka
</string>
<string name="Outer Eye Shadow">
- Zewnętrzny Cień Oka
+ Zewnętrzny cień oka
</string>
<string name="Outer Shadow">
- Zewnętrzny Cień
+ Zewnętrzny cień
</string>
<string name="Overbite">
Overbite
@@ -2655,25 +2805,25 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Package
</string>
<string name="Painted Nails">
- Pomalowane Paznokcie
+ Pomalowane paznokcie
</string>
<string name="Pale">
Pale
</string>
<string name="Pants Crotch">
- Krocze Spodni
+ Krocze spodni
</string>
<string name="Pants Fit">
Pants Fit
</string>
<string name="Pants Length">
- Długość Spodni
+ Długość spodni
</string>
<string name="Pants Waist">
- Talia Spodni
+ Talia spodni
</string>
<string name="Pants Wrinkles">
- Zmarszczki Spodni
+ Zmarszczki spodni
</string>
<string name="Part">
Część
@@ -2682,7 +2832,7 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Part Bangs
</string>
<string name="Pectorals">
- Mięśnie Klatki Piersiowej
+ Mięśnie klatki piersiowej
</string>
<string name="Pigment">
Pigment
@@ -2708,9 +2858,6 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
<string name="Pointy Heels">
Pointy Heels
</string>
- <string name="Pointy Toe">
- Pointy Toe
- </string>
<string name="Ponytail">
Kucyk
</string>
@@ -2735,27 +2882,18 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
<string name="Red Hair">
Czerwone Włosy
</string>
- <string name="Red Skin">
- Czerwona Skóra
- </string>
<string name="Regular">
Regularne
</string>
- <string name="Regular Muscles">
- Regularne Mięśnie
- </string>
<string name="Right Part">
- Prawa Cześć
+ Prawa część
</string>
<string name="Rosy Complexion">
- Kompleksowość Różu
+ Kompleksowość różu
</string>
<string name="Round">
ZaokrÄ…glenie
</string>
- <string name="Round Forehead">
- ZaokrÄ…glenie na Czole
- </string>
<string name="Ruddiness">
Rudowatość
</string>
@@ -2768,62 +2906,44 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
<string name="Saddle Bags">
Saddle Bags
</string>
- <string name="Saddlebags">
- Saddlebags
- </string>
- <string name="Scrawny">
- Scrawny
- </string>
<string name="Scrawny Leg">
Scrawny Leg
</string>
<string name="Separate">
Odzielne
</string>
- <string name="Shading">
- Cieniowanie
- </string>
- <string name="Shadow hair">
- Cieniowane Włosy
- </string>
<string name="Shallow">
Płytkie
</string>
<string name="Shear Back">
- Tylne Usunięcie Włosów
+ Tylne usunięcie włosów
</string>
<string name="Shear Face">
- Usunięcie Twarzy
+ Usunięcie twarzy
</string>
<string name="Shear Front">
- Przednie Usunięcie Włosów
- </string>
- <string name="Shear Left">
- Usunięcie z Lewej Strony
+ Przednie usunięcie włosów
</string>
<string name="Shear Left Up">
- Usunięcie od Lewej Strony do Góry
- </string>
- <string name="Shear Right">
- Usunięcie z Prawej Strony
+ Usunięcie od lewej strony do góry
</string>
<string name="Shear Right Up">
- Usunięcie od Prawej Strony do Góry
+ Usunięcie od prawej strony do góry
</string>
<string name="Sheared Back">
- Tylnie Usunięcie Włosów
+ Tylnie usunięcie włosów
</string>
<string name="Sheared Front">
- Przednie Usunięcie Włosów
+ Przednie usunięcie włosów
</string>
<string name="Shift Left">
- Przesuń w Lewo
+ Przesuń w lewo
</string>
<string name="Shift Mouth">
- Przesuń Usta
+ Przesuń usta
</string>
<string name="Shift Right">
- Przesuń w Prawo
+ Przesuń w prawo
</string>
<string name="Shirt Bottom">
Dolna Część Koszulki
@@ -2832,22 +2952,22 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Shirt Fit
</string>
<string name="Shirt Wrinkles">
- Zmarszczki na Koszulce
+ Zmarszczki na koszulce
</string>
<string name="Shoe Height">
- Wysokość Buta
+ Wysokość buta
</string>
<string name="Short">
Krótkie
</string>
<string name="Short Arms">
- Krótkie Ramiona
+ Krótkie ramiona
</string>
<string name="Short Legs">
- Krótkie Nogi
+ Krótkie nogi
</string>
<string name="Short Neck">
- Krótki Kark
+ Krótki kark
</string>
<string name="Short Pigtails">
Short Pigtails
@@ -2859,25 +2979,16 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Krótkie Baczki
</string>
<string name="Short Torso">
- Krótki Tułów
+ Krótki tułów
</string>
<string name="Short hips">
- Krótkie Biodra
+ Krótkie biodra
</string>
<string name="Shoulders">
Ramiona
</string>
- <string name="Side Bangs">
- Boczne Pasemka
- </string>
- <string name="Side Bangs Down">
- Boczne Pasemka w Dół
- </string>
- <string name="Side Bangs Up">
- Boczne Pasemka do Góry
- </string>
<string name="Side Fringe">
- Boczna Grzywka
+ Boczna grzywka
</string>
<string name="Sideburns">
Baczki
@@ -2891,9 +3002,6 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
<string name="Sides Hair Up">
Boczne Włosy do Góry
</string>
- <string name="Skinny">
- Smukłość
- </string>
<string name="Skinny Neck">
Smukły Kark
</string>
@@ -2901,16 +3009,16 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Skirt Fit
</string>
<string name="Skirt Length">
- Długość Spódnicy
+ Długość spódnicy
</string>
<string name="Slanted Forehead">
- Ukośne Czoło
+ Ukośne czoło
</string>
<string name="Sleeve Length">
- Długość Rękawów
+ Długość rękawów
</string>
<string name="Sleeve Looseness">
- Luźność Rękawów
+ Luźność rękawów
</string>
<string name="Slit Back">
Slit: Back
@@ -2928,22 +3036,19 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Małe
</string>
<string name="Small Hands">
- Małe Dłonie
+ Małe dłonie
</string>
<string name="Small Head">
- Mała Głowa
+ Mała głowa
</string>
<string name="Smooth">
Gładkie
</string>
<string name="Smooth Hair">
- Gładkie Włosy
+ Gładkie włosy
</string>
<string name="Socks Length">
- Długość Skarpetek
- </string>
- <string name="Some">
- Some
+ Długość skarpetek
</string>
<string name="Soulpatch">
Soulpatch
@@ -2958,16 +3063,13 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Kwadratowe
</string>
<string name="Square Toe">
- Kwadratowy Palec
+ Kwadratowy palec
</string>
<string name="Squash Head">
- Ściśnięta Głowa
- </string>
- <string name="Squash/Stretch Head">
- Ściśnięta/Rozciągnięta Głowa
+ Ściśnięta głowa
</string>
<string name="Stretch Head">
- Rozciągnięta Głowa
+ Rozciągnięta głowa
</string>
<string name="Sunken">
Sunken
@@ -2984,18 +3086,6 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
<string name="Sweep Forward">
Sweep Forward
</string>
- <string name="Swept Back">
- Swept Back
- </string>
- <string name="Swept Back Hair">
- Swept Back Hair
- </string>
- <string name="Swept Forward">
- Swept Forward
- </string>
- <string name="Swept Forward Hair">
- Swept Forward Hair
- </string>
<string name="Tall">
Wysokość
</string>
@@ -3006,67 +3096,58 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Taper Front
</string>
<string name="Thick Heels">
- Grube Obcasy
+ Grube obcasy
</string>
<string name="Thick Neck">
- Gruby Kark
+ Gruby kark
</string>
<string name="Thick Toe">
- Gruby Palec
- </string>
- <string name="Thickness">
- Grubość
+ Gruby palec
</string>
<string name="Thin">
WÄ…ski
</string>
<string name="Thin Eyebrows">
- WÄ…skie Brwi
+ WÄ…skie brwi
</string>
<string name="Thin Lips">
- WÄ…skie Usta
+ WÄ…skie usta
</string>
<string name="Thin Nose">
- WÄ…ski Nos
+ WÄ…ski nos
</string>
<string name="Tight Chin">
- Obcisły Podbródek
+ Obcisły podbródek
</string>
<string name="Tight Cuffs">
- Obcisłe Rękawy
+ Obcisłe rękawy
</string>
<string name="Tight Pants">
- Obciesłe Spodnie
+ Obciesłe spodnie
</string>
<string name="Tight Shirt">
- Obcisły Podkoszulek
+ Obcisły podkoszulek
</string>
<string name="Tight Skirt">
- Tight Skirt
+ Wąska spódnica
</string>
<string name="Tight Sleeves">
- Obcisłe Rękawy
- </string>
- <string name="Tilt Left">
- Przesuń w Lewo
- </string>
- <string name="Tilt Right">
- Przesuń w Prawo
+ Obcisłe rękawy
</string>
<string name="Toe Shape">
- Kształt Palca
+ Kształt palca
</string>
<string name="Toe Thickness">
- Grubość Palca
+ Grubość palca
</string>
<string name="Torso Length">
- Długość Tułowia
+ Długość tułowia
</string>
<string name="Torso Muscles">
- Mięśnie Tułowia
+ Mięśnie tułowia
</string>
<string name="Torso Scrawny">
- Wychudzony Tułów
+ Wychudzony tułów
</string>
<string name="Unattached">
Nieprzyłączone
@@ -3081,43 +3162,43 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
Nienaturalne
</string>
<string name="Upper Bridge">
- Górny Mostek
+ Górny mostek
</string>
<string name="Upper Cheeks">
- Górne Policzki
+ Górne policzki
</string>
<string name="Upper Chin Cleft">
- Roszczepienie Górnego Podbródka
+ Roszczepienie górnego podbródka
</string>
<string name="Upper Eyelid Fold">
- Górna Powieka
+ Górna powieka
</string>
<string name="Upturned">
Zadarta
</string>
<string name="Very Red">
- Bardzo Czerwona
+ Bardzo czerwona
</string>
<string name="Waist Height">
- Wysokość Tali
+ Wysokość talii
</string>
<string name="Well-Fed">
Well-Fed
</string>
<string name="White Hair">
- Białe Włosy
+ Białe włosy
</string>
<string name="Wide">
Szerokie
</string>
<string name="Wide Back">
- Szeroki Tył
+ Szeroki tył
</string>
<string name="Wide Front">
- Szeroki Przód
+ Szeroki przód
</string>
<string name="Wide Lips">
- Szerokie Usta
+ Szerokie usta
</string>
<string name="Wild">
Dzikość
@@ -3194,6 +3275,21 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
<string name="IM_moderator_label">
(Moderator)
</string>
+ <string name="started_call">
+ Rozpoczęta rozmowa głosowa
+ </string>
+ <string name="joined_call">
+ Dołączył do rozmowy głosowej
+ </string>
+ <string name="ringing-im">
+ Rozmowa głosowa...
+ </string>
+ <string name="connected-im">
+ Połączono, kliknij Zakończ Rozmowe aby się rozłączyć
+ </string>
+ <string name="hang_up-im">
+ Rozmowa głosowa zakończona
+ </string>
<string name="only_user_message">
JesteÅ› jedynÄ… osobÄ… w tej konferencji.
</string>
@@ -3203,6 +3299,12 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
<string name="invite_message">
Kliknij na [BUTTON NAME] przycisk by zaakceptować/dołączyć do tej rozmowy.
</string>
+ <string name="muted_message">
+ Zablokowałeś tego Rezydenta. Wysłanie wiadomości automatycznie odblokuje go.
+ </string>
+ <string name="generic">
+ Błąd zapytania, proszę spróbować później
+ </string>
<string name="generic_request_error">
Błąd. Spróbuj ponownie za kilka minut.
</string>
@@ -3221,19 +3323,153 @@ Jeżeli nadal otrzymujesz ten komunikat, skontaktuj się z [SUPPORT_SITE].
<string name="not_a_mod_error">
Nie jesteÅ› moderatorem konferencji.
</string>
+ <string name="muted">
+ Moderator grupy wyłączył czat.
+ </string>
<string name="muted_error">
Moderator wyciszył Cię.
</string>
<string name="add_session_event">
Nie można dodać nikogo do czatu z [RECIPIENT].
</string>
+ <string name="message">
+ Nie można wysłać Twojej wiadomości do sesji czatu z [RECIPIENT].
+ </string>
<string name="message_session_event">
Nie można wysłać Twojej wiadomości do sesji czatu z [RECIPIENT].
</string>
+ <string name="mute">
+ Błąd poczas moderacji.
+ </string>
+ <string name="removed">
+ Zostałeś usunięty z grupy
+ </string>
<string name="removed_from_group">
Usunięto Cię z grupy.
</string>
<string name="close_on_no_ability">
Nie posiadasz praw by uczestniczyć w tej konferencji.
</string>
+ <string name="unread_chat_single">
+ [SOURCES] powiedział/a coś nowego
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] powiedział/a coś nowego
+ </string>
+ <string name="paid_you_ldollars">
+ [NAME] zapłacił Ci L$[AMOUNT]
+ </string>
+ <string name="you_paid_ldollars">
+ Zapłacono [NAME] [AMOUNT]L$ [REASON].
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ Zapłacono [NAME] [AMOUNT]L$.
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ Zapłacono [AMOUNT]L$ [REASON].
+ </string>
+ <string name="for a parcel of land">
+ za posiadłość
+ </string>
+ <string name="for a land access pass">
+ za przepustkę na Posiadłość
+ </string>
+ <string name="for deeding land">
+ dla przypisania Posiadłości
+ </string>
+ <string name="to create a group">
+ aby stworzyć grupę
+ </string>
+ <string name="to join a group">
+ aby dołączyć do grupy
+ </string>
+ <string name="to upload">
+ aby pobrać
+ </string>
+ <string name="giving">
+ Dajesz L$ [AMOUNT]
+ </string>
+ <string name="uploading_costs">
+ Åadowanie kosztuje [AMOUNT]L$
+ </string>
+ <string name="this_costs">
+ To kosztuje [AMOUNT]L$
+ </string>
+ <string name="buying_selected_land">
+ Kupno wybranej Posiadłości [AMOUNT]L$
+ </string>
+ <string name="this_object_costs">
+ Ten obiekt kosztuje [AMOUNT]L$
+ </string>
+ <string name="group_role_everyone">
+ Każdy
+ </string>
+ <string name="group_role_officers">
+ Oficerowie
+ </string>
+ <string name="group_role_owners">
+ Właściciele
+ </string>
+ <string name="uploading_abuse_report">
+ Pobieranie...
+
+Raport o Nadużyciu
+ </string>
+ <string name="New Shape">
+ Nowy ksztalt
+ </string>
+ <string name="New Skin">
+ Nowa skórka
+ </string>
+ <string name="New Hair">
+ Nowe włosy
+ </string>
+ <string name="New Eyes">
+ Nowe oczy
+ </string>
+ <string name="New Shirt">
+ Nowa koszula
+ </string>
+ <string name="New Pants">
+ Nowe spodnie
+ </string>
+ <string name="New Shoes">
+ Nowe buty
+ </string>
+ <string name="New Socks">
+ Nowe skarpetki
+ </string>
+ <string name="New Jacket">
+ Nowa kurtka
+ </string>
+ <string name="New Gloves">
+ Nowe rękawiczki
+ </string>
+ <string name="New Undershirt">
+ Nowy podkoszulek
+ </string>
+ <string name="New Underpants">
+ Nowa bielizna
+ </string>
+ <string name="New Skirt">
+ Nowa spódnica
+ </string>
+ <string name="New Alpha">
+ Nowa Alpha
+ </string>
+ <string name="New Tattoo">
+ Nowy tatuaż
+ </string>
+ <string name="Invalid Wearable">
+ Nieaktualne ubranie/część ciała
+ </string>
+ <string name="New Script">
+ Nowy skrypt
+ </string>
+ <string name="New Folder">
+ Nowy folder
+ </string>
+ <string name="Contents">
+ Zawartość
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/pl/teleport_strings.xml b/indra/newview/skins/default/xui/pl/teleport_strings.xml
index 906978effe..6c4723dd7e 100755..100644
--- a/indra/newview/skins/default/xui/pl/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/pl/teleport_strings.xml
@@ -62,6 +62,9 @@ Spróbuj jeszcze raz za kilka minut.
<message name="completing">
Finalizowanie teleportacji.
</message>
+ <message name="completed_from">
+ Teleportacja zakończona z [T_SLURL]
+ </message>
<message name="resolving">
Namierzanie celu.
</message>
diff --git a/indra/newview/skins/default/xui/pl/xui_version.xml b/indra/newview/skins/default/xui/pl/xui_version.xml
index 0e777751d3..0e777751d3 100755..100644
--- a/indra/newview/skins/default/xui/pl/xui_version.xml
+++ b/indra/newview/skins/default/xui/pl/xui_version.xml
diff --git a/indra/newview/skins/default/xui/pt/floater_about.xml b/indra/newview/skins/default/xui/pt/floater_about.xml
index 704e2f4107..4044110b47 100644
--- a/indra/newview/skins/default/xui/pt/floater_about.xml
+++ b/indra/newview/skins/default/xui/pt/floater_about.xml
@@ -1,19 +1,60 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_about" title="SOBRE O [CAPITALIZED_APP_NAME]">
-<tab_container name="about_tab">
- <panel name="credits_panel">
- <text_editor name="credits_editor">
- Second Life é oferecido a você por Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les, Michon, Jenelle, Geo, Siz, Shapiro, Pete, Calyle, Selene, Allen, Phoebe, Goldin, Kimmora, Dakota, Slaton, Lindquist, Zoey, Hari, Othello, Rohit, Sheldon, Petra, Viale, Gordon, Kaye, Pink, Ferny, Emerson, Davy, Bri, Chan, Juan, Robert, Terrence, Nathan, Carl e muitos outros.
+<floater name="floater_about" title="SOBRE [CAPITALIZED_APP_NAME]">
+ <floater.string name="AboutHeader">
+ [APP_NAME] [VIEWER_VERSION_0].[VIEWER_VERSION_1].[VIEWER_VERSION_2] ([VIEWER_VERSION_3]) [BUILD_DATE] [BUILD_TIME] ([CHANNEL])[[VIEWER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </floater.string>
+ <floater.string name="AboutCompiler">
+ Construído com [COMPILER] versão [COMPILER_VERSION]
+ </floater.string>
+ <floater.string name="AboutPosition">
+ Você está em [POSITION_0,number,1], [POSITION_1,number,1], [POSITION_2,number,1] em [REGION] localizado em [HOSTNAME]&lt;/nolink&gt;([HOSTIP])
+[SERVER_VERSION]
+[[SERVER_RELEASE_NOTES_URL] [ReleaseNotes]]
+ </floater.string>
+ <floater.string name="AboutSystem">
+ CPU: [CPU]
+Memória: [MEMORY_MB] MBs
+Versão OS: [OS_VERSION]
+Placa de vídeo: [GRAPHICS_CARD_VENDOR]
+Placa gráfica: [GRAPHICS_CARD]
+ </floater.string>
+ <floater.string name="AboutDriver">
+ Versão do driver de vídeo Windows: [GRAPHICS_CARD_VENDOR]
+ </floater.string>
+ <floater.string name="AboutLibs">
+ Versão OpenGL: [OPENGL_VERSION]
- Obrigado aos seguintes residentes por ajudar a garantir para que esta versão seja ainda melhor: able whitman, Adeon Writer, adonaira aabye, Aeron Kohime, Agathos Frascati, Aimee Trescothick, Aleric Inglewood, Alissa Sabre, Aminom Marvin, Angela Talamasca, Aralara Rajal, Armin Weatherwax, Ashrilyn Hayashida, Athanasius Skytower, Aura Dirval, Barney Boomslang, Biancaluce Robbiani, Biker Offcourse, Borg Capalini, Bulli Schumann, catherine pfeffer, Chalice Yao, Corre Porta, Court Goodman, Cummere Mayo, Dale Innis, Darien Caldwell, Darjeeling Schoonhoven, Daten Thielt, dimentox travanti, Dirk Talamasca, Drew Dwi, Duckless Vandyke, Elanthius Flagstaff, Electro Burnstein, emiley tomsen, Escort DeFarge, Eva Rau, Ezian Ecksol, Fire Centaur, Fluf Fredriksson, Francisco Koolhoven, Frontera Thor, Frungi Stastny, Gally Young, gearsawe stonecutter, Gigs Taggart, Gordon Wendt, Gudmund Shepherd, Gypsy Paz, Harleen Gretzky, Henri Beauchamp, Inma Rau, Irene Muni, Iskar Ariantho, Jacek Antonelli, JB Kraft, Jessicka Graves, Joeseph Albanese, Joshua Philgarlic, Khyota Wulluf, kirstenlee Cinquetti, Latif Khalifa, Lex Neva, Lilibeth Andree, Lisa Lowe, Lunita Savira, Loosey Demonia, lum pfohl, Marcos Fonzarelli, MartinRJ Fayray, Marusame Arai, Matthew Dowd, Maya Remblai, McCabe Maxsted, Meghan Dench, Melchoir Tokhes, Menos Short, Michelle2 Zenovka, Mimika Oh, Minerva Memel, Mm Alder, Ochi Wolfe, Omei Turnbull, Pesho Replacement, Phantom Ninetails, phoenixflames kukulcan, Polo Gufler, prez pessoa, princess niven, Prokofy Neva, Qie Niangao, Rem Beattie, RodneyLee Jessop, Saijanai Kuhn, Seg Baphomet, Sergen Davies, Shirley Marquez, SignpostMarv Martin, Sindy Tsure, Sira Arbizu, Skips Jigsaw, Sougent Harrop, Spritely Pixel, Squirrel Wood, StarSong Bright, Subversive Writer, Sugarcult Dagger, Sylumm Grigorovich, Tammy Nowotny, Tanooki Darkes, Tayra Dagostino, Theoretical Chemistry, Thickbrick Sleaford, valerie rosewood, Vex Streeter, Vixen Heron, Whoops Babii, Winter Ventura, Xiki Luik, Yann Dufaux, Yina Yao, Yukinoroh Kamachi, Zolute Infinity, Zwagoth Klaar
+Versão libcurl: [LIBCURL_VERSION]
+Versão J2C Decoder: [J2C_VERSION]
+Versão do driver de áudio: [AUDIO_DRIVER_VERSION]
+Versão Qt Webkit: [QT_WEBKIT_VERSION]
+Versão do servidor de voz: [VOICE_VERSION]
+ </floater.string>
+ <floater.string name="none">
+ (nenhum)
+ </floater.string>
+ <floater.string name="AboutTraffic">
+ Packets Lost: [PACKETS_LOST,number,0]/[PACKETS_IN,number,0] ([PACKETS_PCT,number,1]%)
+ </floater.string>
+ <tab_container name="about_tab">
+ <panel label="Info" name="support_panel">
+ <button label="Copiar" name="copy_btn"/>
+ </panel>
+ <panel label="Créditos" name="credits_panel">
+ <text_editor name="credits_editor">
+ O Second Life é o resultado do trabalho de Philip, Tessa, Andrew, Cory, James, Ben, Char, Charlie, Colin, Dan, Daniel, Doug, Eric, Hamlet, Haney, Eve, Hunter, Ian, Jeff, Jennifer, Jim, John, Lee, Mark, Peter, Phoenix, Richard, Robin, Xenon, Steve, Tanya, Eddie, Avi, Frank, Bruce, Aaron, Alice, Bob, Debra, Eileen, Helen, Janet, Louie, Leviathania, Stefan, Ray, Kevin, Tom, Mikeb, MikeT, Burgess, Elena, Tracy, Bill, Todd, Ryan, Zach, Sarah, Nova, Tim, Stephanie, Michael, Evan, Nicolas, Catherine, Rachelle, Dave, Holly, Bub, Kelly, Magellan, Ramzi, Don, Sabin, Jill, Rheya, Jeska, Torley, Kona, Callum, Charity, Ventrella, Jack, Vektor, Iris, Chris, Nicole, Mick, Reuben, Blue, Babbage, Yedwab, Deana, Lauren, Brent, Pathfinder, Chadrick, Altruima, Jesse, Teeny, Monroe, Icculus, David, Tess, Lizzie, Patsy, Isaac, Lawrence, Cyn, Bo, Gia, Annette, Marius, Tbone, Jonathan, Karen, Ginsu, Satoko, Yuko, Makiko, Thomas, Harry, Seth, Alexei, Brian, Guy, Runitai, Ethan, Data, Cornelius, Kenny, Swiss, Zero, Natria, Wendy, Stephen, Teeple, Thumper, Lucy, Dee, Mia, Liana, Warren, Branka, Aura, beez, Milo, Hermia, Red, Thrax, Joe, Sally, Magenta, Mogura, Paul, Jose, Rejean, Henrik, Lexie, Amber, Logan, Xan, Nora, Morpheus, Donovan, Leyla, MichaelFrancis, Beast, Cube, Bucky, Joshua, Stryfe, Harmony, Teresa, Claudia, Walker, Glenn, Fritz, Fordak, June, Cleopetra, Jean, Ivy, Betsy, Roosevelt, Spike, Ken, Which, Tofu, Chiyo, Rob, Zee, dustin, George, Del, Matthew, Cat, Jacqui, Lightfoot, Adrian, Viola, Alfred, Noel, Irfan, Sunil, Yool, Rika, Jane, Xtreme, Frontier, a2, Neo, Siobhan, Yoz, Justin, Elle, Qarl, Benjamin, Isabel, Gulliver, Everett, Christopher, Izzy, Stephany, Garry, Sejong, Sean, Tobin, Iridium, Meta, Anthony, Jeremy, JP, Jake, Maurice, Madhavi, Leopard, Kyle, Joon, Kari, Bert, Belinda, Jon, Kristi, Bridie, Pramod, KJ, Socrates, Maria, Ivan, Aric, Yamasaki, Adreanne, Jay, MitchK, Ceren, Coco, Durl, Jenny, Periapse, Kartic, Storrs, Lotte, Sandy, Rohn, Colossus, Zen, BigPapi, Brad, Pastrami, Kurz, Mani, Neuro, Jaime, MJ, Rowan, Sgt, Elvis, Gecko, Samuel, Sardonyx, Leo, Bryan, Niko, Soft, Poppy, Rachel, Aki, Angelo, Banzai, Alexa, Sue, CeeLo, Bender, CG, Gillian, Pelle, Nick, Echo, Zara, Christine, Shamiran, Emma, Blake, Keiko, Plexus, Joppa, Sidewinder, Erica, Ashlei, Twilight, Kristen, Brett, Q, Enus, Simon, Bevis, Kraft, Kip, Chandler, Ron, LauraP, Ram, KyleJM, Scouse, Prospero, Melissa, Marty, Nat, Hamilton, Kend, Lordan, Jimmy, Kosmo, Seraph, Green, Ekim, Wiggo, JT, Rome, Doris, Miz, Benoc, Whump, Trinity, Patch, Kate, TJ, Bao, Joohwan, Christy, Sofia, Matias, Cogsworth, Johan, Oreh, Cheah, Angela, Brandy, Mango, Lan, Aleks, Gloria, Heidy, Mitchell, Space, Colton, Bambers, Einstein, Maggie, Malbers, Rose, Winnie, Stella, Milton, Rothman, Niall, Marin, Allison, Katie, Dawn, Katt, Dusty, Kalpana, Judy, Andrea, Ambroff, Infinity, Gail, Rico, Raymond, Yi, William, Christa, M, Teagan, Scout, Molly, Dante, Corr, Dynamike, Usi, Kaylee, Vidtuts, Lil, Danica, Sascha, Kelv, Jacob, Nya, Rodney, Brandon, Elsie, Blondin, Grant, Katrin, Nyx, Gabriel, Locklainn, Claire, Devin, Minerva, Monty, Austin, Bradford, Si, Keira, H, Caitlin, Dita, Makai, Jenn, Ann, Meredith, Clare, Joy, Praveen, Cody, Edmund, Ruthe, Sirena, Gayathri, Spider, FJ, Davidoff, Tian, Jennie, Louise, Oskar, Landon, Noelle, Jarv, Ingrid, Al, Sommer, Doc, Aria, Huin, Gray, Lili, Vir, DJ, Yang, T, Simone, Maestro, Scott, Charlene, Quixote, Amanda, Susan, Zed, Anne, Enkidu, Esbee, Joroan, Katelin, Roxie, Tay, Scarlet, Kevin, Johnny, Wolfgang, Andren, Bob, Howard, Merov, Rand, Ray, Michon, Newell, Galen, Dessie, Les e muitos mais.
+Agradecemos também aos seguintes residentes por sua colaboração na mais nova versão do Second Life: Drew Dwi, Zai Lynch, Latif Khalifa, Ellla McMahon, Harleen Gretzky, Squirrel Wood, Malarthi Behemoth, Dante Tucker, Buckaroo Mu, Eddi Decosta, Dirk, Talamasca, Torben Trautman, Irene Muni, Lilly Zenovka, Vick Forcella, Sasy Scarborough, Gentle Welinder, Elric Anatine, Techwolf Lupindo, Dusan Writer, WolfPup Lowenhar, Marianne McCann, Fiachra Lach, Sitearm Madonna, Sudane Erato, Sahkolihaa Contepomi, Sachi Vixen, Questar Utu, Dimitrio Lewis, Matto Destiny, Scrim Pinion, Radio Signals, Psi Merlin, Pixel Gausman, Mel Vanbeeck, Laurent Bechir, Lamorna Proctor, Lares Carter, Gwyneth Llewelyn, Hydra Shaftoe, Holger Gilruth, Gentle Heron, Carla Broek, Boroondas Gupte, Fury Rosewood, Flower Ducatillon, Colpo Wexler, gwampa Lomu, Borg Capalini, Beansy Twine, Ardy Lay, , 45ms Zhong, Adeon Writer, Aeonix Aeon, Ai Austin, Aiko Ying, Alexandrea Fride, Alliez Mysterio, Annie Milestone, Annika Genezzia, Ansariel Hiller, ArminasX Saiman, Arya Braveheart, Asaeda Meltingdots, Asturkon Jua, Avallyn Oakleaf, Avatar Quinzet, BabyA Littlething, Bacchus Ireto, Bazaar, Riva, Benjamin Bigdipper, Beth Walcher, Bezilon Kasei, Biancaluce Robbiani, Bill Walach, blakopal Galicia, Blitzckreed Levenque, Bryn Oh, Callipygian Christensen, Cap Carver, Carr Arbenlow, Chantal Harvey, Charles Courtois, Charlie Sazaland, Cherry Cheevers, ChickyBabes Zuzu, Christopher Organiser, Ciaran Laval, Clara Young, Celierra Darling, Corinne Helendale, Corro Moseley, Coughdrop Littlething, Darien Caldwell, Dartagan Shepherd, Debs Regent, Decro Schmooz, Denim Kamachi, DiJodi Dubratt, Dil Spitz, Edgware Marker, Egehan Dryke, Emma Portilo, Emmie Fairymeadow, Evangelista Emerald, Faelon Swordthain, Frenchimmo Sabra, Gaberoonie Zanzibar, Ganymedes Costagravas, Gene Frostbite, GeneJ Composer, Giggles Littlebird, Grady Echegaray, Guni Greenstein, Gypsy Tripsa, Hackshaven Harford, Ham Rambler, Han Shuffle, Hanglow Short, Hatzfeld Runo, herina Bode, Horatio Freund, Hypatia Callisto, Hypatia Pickens, Identity Euler, Imnotgoing Sideways, Innula Zenovka, Iyoba Tarantal, Jack Abraham, Jagga Meredith, Jennifer Boyle, Jeremy Marquez, Jessica Qin, Jinx Nordberg, Jo Bernandes, Jocial Sonnenkern, Joel Savard, Jondan Lundquist, Josef Munster, Josette Windlow, Juilan Tripsa, Juro Kothari, Justin RiversRunRed, Kagehi Kohn, Kaimen Takahe, Keklily Longfall, Ken Lavender, Kestral Karas, Khisme Nitely, Kimar Coba, Kithrak Kirkorian, Kitty Barnett, Kolor Fall, Komiko Okamoto, Korvel Noh, Larry Pixel, Leal Choche, len Starship, Lenae Munz, Lexi Frua, Lillie Cordeaux, Lizzy Macarthur, LSL Scientist, Luban Yiyuan, Luc Starsider, Maccus McCullough, Madison Blanc, Maggie Darwin, Mallory Destiny, Manx Wharton, Marc Claridge, Marc2 Sands, Matthew Anthony, Maxim RiversRunRed, Medhue Simoni, Melinda Latynina, Mencius Watts, Michi Lumin, Midian Farspire, Miles Glaz, Mindy Mathy, Mitch Wagner, Mo Hax, Mourna Biziou, Nao Noe, naofan Teardrop, Naomah Beaumont, Nathiel Siamendes, Nber Medici, Neko Link, Netpat Igaly, Neutron Chesnokov, Newfie Pendragon, Nicholai Laviscu, Nick Rhodes, Nicoladie Gymnast, Ollie Kubrick, Orenj Marat, Orion Delphis, Oryx Tempel, Parvati Silverweb, PeterPunk Mooney, Pixel Scientist, Pounce Teazle, Professor Noarlunga, Quantum Destiny, Quicksilver Hermes, Ralf Setsuko, RAT Quan, RedMokum Bravin, Revolution Perenti, Rezit Sideways, Rich Grainger, Rosco Teardrop, Rose Evans, Rudee Voom, RufusTT Horsefly, Saii Hallard, SaintLEOlions Zimer, Samm Larkham, Satanello Miami, SexySteven Morrisey, Sheet Spotter, Shnurui Troughton, sicarius Thorne, Sicarius Toxx, Sini Nubalo, SLB Wirefly, snowy Sidran, Soupa Segura, ST Mensing, Starshine Halasy, Stickman Ingmann, Synystyr Texan, Takeda Terrawyng, Tali Rosca, Templar Merlin, Tezcatlipoca Bisiani, Tiel Stonecutter, Tony Kembia, TouchaHoney Perhaps, Trey Reanimator, TriloByte Zanzibar, Trinity Dechou, Trinity Dejavu, Unlikely Quintessa, UsikuFarasi Kanarik, Veritas Raymaker, Vex Streeter, Viaticus Speculaas, Villain Baroque, Vixie Durant, Void Singer, Watty Berkson, Westley Schridde, Westley Streeter, Whimsy Winx, Winter Ventura, Wundur Primbee, xstorm Radek, YongYong Francois, Zak Westminster, Zana Kohime, Zaren Alexander, Zeja Pyle, ZenMondo Wormser, Zoex Flanagan e muitos mais.
- Para ter sucesso nos negócios, seja ousado, seja o primeiro, seja diferente. --Henry Marchant
- </text_editor>
- </panel>
- <panel name="licenses_panel">
- <text_editor name="credits_editor">
- 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
+
+
+
+&quot;O trabalho continua, a causa vive, a esperança persiste, e os sonhos nunca morrem&quot; - Edward Kennedy
+ </text_editor>
+ </panel>
+ <panel label="Licenças" name="licenses_panel">
+ <text_editor name="credits_editor">
+ 3Dconnexion SDK Copyright (C) 1992-2007 3Dconnexion
APR Copyright (C) 2000-2004 The Apache Software Foundation
cURL Copyright (C) 1996-2002, Daniel Stenberg, (daniel@haxx.se)
DBus/dbus-glib Copyright (C) 2002, 2003 CodeFactory AB / Copyright (C) 2003, 2004 Red Hat, Inc.
@@ -34,10 +75,7 @@
Todos os direitos reservados. Veja licenças.txt para detalhes.
Voice chat Audio coding: Polycom(R) Siren14(TM) (ITU-T Rec. G.722.1 Annex C)
- </text_editor>
- </panel>
-</tab_container>
- <string name="you_are_at">
- Você está em [POSITION]
- </string>
+ </text_editor>
+ </panel>
+ </tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_about_land.xml b/indra/newview/skins/default/xui/pt/floater_about_land.xml
index 19981cf48c..56ffcbdece 100644
--- a/indra/newview/skins/default/xui/pt/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/pt/floater_about_land.xml
@@ -1,7 +1,71 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floaterland" title="SOBRE O TERRENO">
+ <floater.string name="maturity_icon_general">
+ &quot;Parcel_PG_Dark
+ </floater.string>
+ <floater.string name="maturity_icon_moderate">
+ &quot;Parcel_M_Dark&quot;
+ </floater.string>
+ <floater.string name="maturity_icon_adult">
+ &quot;Parcel_R_Dark&quot;
+ </floater.string>
+ <floater.string name="Minutes">
+ [MINUTES] minutos
+ </floater.string>
+ <floater.string name="Minute">
+ minuto
+ </floater.string>
+ <floater.string name="Seconds">
+ [SECONDS] segundos
+ </floater.string>
+ <floater.string name="Remaining">
+ faltam
+ </floater.string>
<tab_container name="landtab">
- <panel label="Geral" name="land_general_panel">
+ <panel label="GERAL" name="land_general_panel">
+ <panel.string name="new users only">
+ Somente novos residentes
+ </panel.string>
+ <panel.string name="anyone">
+ Qualquer um
+ </panel.string>
+ <panel.string name="area_text">
+ Ãrea
+ </panel.string>
+ <panel.string name="area_size_text">
+ [AREA] m²
+ </panel.string>
+ <panel.string name="auction_id_text">
+ ID do Leilão: [ID]
+ </panel.string>
+ <panel.string name="need_tier_to_modify">
+ Sua compra deve ser aprovada para você modificar este terreno.
+ </panel.string>
+ <panel.string name="group_owned_text">
+ (Propriedade do grupo)
+ </panel.string>
+ <panel.string name="profile_text">
+ Perfil...
+ </panel.string>
+ <panel.string name="info_text">
+ Informação...
+ </panel.string>
+ <panel.string name="public_text">
+ (público)
+ </panel.string>
+ <panel.string name="none_text">
+ (nenhum)
+ </panel.string>
+ <panel.string name="sale_pending_text">
+ (Venda pendendo)
+ </panel.string>
+ <panel.string name="no_selection_text">
+ Nenhum lote selecionado.
+Vá para o menu Mundo &gt; Sobre o terreno ou selecione outro lote para mostrar os detalhes.
+ </panel.string>
+ <panel.string name="time_stamp_template">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </panel.string>
<text name="Name:">
Nome:
</text>
@@ -18,7 +82,7 @@
Classificação:
</text>
<text name="ContentRatingText">
- Adult
+ Adulto
</text>
<text name="Owner:">
Proprietário:
@@ -26,36 +90,38 @@
<text name="OwnerText">
Leyla Linden
</text>
- <button label="Perfil..." label_selected="Perfil..." name="Profile..."/>
<text name="Group:">
Grupo:
</text>
- <button label="Ajustar..." label_selected="Ajustar..." name="Set..."/>
- <check_box label="Permitir posse para o grupo" name="check deed" tool_tip="O gerente do grupo pode acionar essa terra ao grupo, então esta será mantida pelo gestor da ilha"/>
- <button label="Passar..." label_selected="Passar..." name="Deed..." tool_tip="Você só pode delegar esta terra se você for um gerente selecionado pelo grupo."/>
- <check_box label="Proprietário faz contribuição com delegação" name="check contrib" tool_tip="Quando a terra é delegada ao grupo, o proprietário anterior contribui alocando terra suficiente para mantê-la."/>
+ <text name="GroupText">
+ Leyla Linden
+ </text>
+ <button label="Ajustar" name="Set..."/>
+ <check_box label="Permitir doação para o grupo" name="check deed" tool_tip="Oficiais do grupo podem doar esse terreno ao grupo, passando a administração para o gestor da ilha"/>
+ <button label="Passar" name="Deed..." tool_tip="Você só pode doar o terreno se você for um dos oficiais do grupo selecionado."/>
+ <check_box label="Proprietário faz contribuição com doação" name="check contrib" tool_tip="Quando o terreno é doado ao grupo, o proprietário anterior contribui alocando terra suficiente para mantê-la."/>
<text name="For Sale:">
- À Venda:
+ À venda:
</text>
<text name="Not for sale.">
- Não está à Venda.
+ Não está à venda.
</text>
<text name="For Sale: Price L$[PRICE].">
Preço: L$[PRICE] (L$[PRICE_PER_SQM]/m²).
</text>
- <button label="Vender Terra..." label_selected="Vender Terra..." name="Sell Land..."/>
+ <button label="Vender Terra" name="Sell Land..."/>
<text name="For sale to">
À venda para: [BUYER]
</text>
<text name="Sell with landowners objects in parcel.">
- À venda (Objetos incluídos).
+ À venda (objetos incluídos).
</text>
<text name="Selling with no objects in parcel.">
- À venda (Objetos não incluídos).
+ À venda (objetos não incluídos).
</text>
<button label="Cancelar venda do terreno" label_selected="Cancelar venda do terreno" left="275" name="Cancel Land Sale" width="165"/>
<text name="Claimed:">
- Reclamado:
+ Posse em:
</text>
<text name="DateClaimText">
Ter Ago 15 13:47:25 2006
@@ -72,62 +138,32 @@
<text name="DwellText">
0
</text>
- <button label="Comprar Terra..." label_selected="Comprar Terra..." left="130" name="Buy Land..." width="125"/>
- <button label="Comprar para o Grupo..." label_selected="Comprar para o Grupo..." name="Buy For Group..."/>
- <button label="Comprar Passe..." label_selected="Comprar Passe..." left="130" name="Buy Pass..." tool_tip="Um passe concede a você acesso temporário a esta terra." width="125"/>
- <button label="Abandonar Terra.." label_selected="Abandonar Terra.." name="Abandon Land..."/>
- <button label="Reclamar Terra..." label_selected="Reclamar Terra..." name="Reclaim Land..."/>
- <button label="Venda Linden..." label_selected="Venda Linden..." name="Linden Sale..." tool_tip="A terra precisa ser possuída, estar com o conteúdo configurado e não estar pronta para leilão."/>
- <panel.string name="new users only">
- Somente novos usuários
- </panel.string>
- <panel.string name="anyone">
- Qualquer um
- </panel.string>
- <panel.string name="area_text">
- Ãrea
- </panel.string>
- <panel.string name="area_size_text">
- [AREA] m²
- </panel.string>
- <panel.string name="auction_id_text">
- ID do Leilão: [ID]
- </panel.string>
- <panel.string name="need_tier_to_modify">
- Você deve ter sua compra aprovada para modificar este terreno.
- </panel.string>
- <panel.string name="group_owned_text">
- (Possuído pelo Grupo)
- </panel.string>
- <panel.string name="profile_text">
- Perfil...
- </panel.string>
- <panel.string name="info_text">
- Informação...
- </panel.string>
- <panel.string name="public_text">
- (público)
+ <button label="Comprar terreno..." label_selected="Comprar terreno..." left="130" name="Buy Land..." width="125"/>
+ <button label="Dados do script" name="Scripts..."/>
+ <button label="Comprar para o grupo" name="Buy For Group..."/>
+ <button label="Comprar passe..." label_selected="Comprar passe..." left="130" name="Buy Pass..." tool_tip="Um passe concede a você acesso temporário a este terreno." width="125"/>
+ <button label="Abandonar terreno..." label_selected="Abandonar terreno..." name="Abandon Land..."/>
+ <button label="Pedir terreno" name="Reclaim Land..."/>
+ <button label="Venda Linden" name="Linden Sale..." tool_tip="O terreno precisa ser possuído, estar com o conteúdo configurado e não estar pronto para leilão."/>
+ </panel>
+ <panel label="CONTRATO" name="land_covenant_panel">
+ <panel.string name="can_resell">
+ Permitido para terrenos comprados nesta região.
</panel.string>
- <panel.string name="none_text">
- (nenhum)
+ <panel.string name="can_not_resell">
+ Proibido para terrenos comprados nesta região.
</panel.string>
- <panel.string name="sale_pending_text">
- (Venda Pendente)
+ <panel.string name="can_change">
+ Permitido subdividir terrenos comprados nesta região.
</panel.string>
- <panel.string name="no_selection_text">
- Nenhum lote selecionado.
-Vá para o menu Mundo &gt; Sobre a Terra ou selecione outro lote para mostrar seus detalhes.
+ <panel.string name="can_not_change">
+ Proibido compartilhar ou subdividir terrenos comprados nesta região.
</panel.string>
- </panel>
- <panel label="Corretor" name="land_covenant_panel">
<text name="estate_section_lbl">
Propriedade:
</text>
- <text name="estate_name_lbl">
- Nome:
- </text>
<text name="estate_name_text">
- mainland
+ continente
</text>
<text name="estate_owner_lbl">
Dono:
@@ -139,14 +175,11 @@ Vá para o menu Mundo &gt; Sobre a Terra ou selecione outro lote para mostrar se
Não há corretor para esta Propriedade.
</text_editor>
<text name="covenant_timestamp_text">
- Última Alteração: Qua, Dez 31 16:00:00 1969
+ Última modificação: Qua, Dez 31 16:00:00 1969
</text>
<text name="region_section_lbl">
Região:
</text>
- <text name="region_name_lbl">
- Nome:
- </text>
<text name="region_name_text">
leyla
</text>
@@ -160,59 +193,45 @@ Vá para o menu Mundo &gt; Sobre a Terra ou selecione outro lote para mostrar se
Classificação:
</text>
<text name="region_maturity_text">
- Adult
+ Adulto
</text>
<text name="resellable_lbl">
Revender:
</text>
<text name="resellable_clause">
- Terra nesta região não pode ser revendida.
+ Proibido revender terrenos nesta região.
</text>
<text name="changeable_lbl">
Subdividir:
</text>
<text name="changeable_clause">
- Terra nesta região não pode ser unida/sub-dividida.
+ Proibido juntar/subdividir terrenos nesta região.
</text>
- <panel.string name="can_resell">
- Terra comprada nesta região pode ser revendida.
- </panel.string>
- <panel.string name="can_not_resell">
- Terra comprada nesta região não pode ser revendida.
- </panel.string>
- <panel.string name="can_change">
- Terra comprada nesta região pode ser compartilhada
-ou sub-dividida.
+ </panel>
+ <panel label="OBJETOS" name="land_objects_panel">
+ <panel.string name="objects_available_text">
+ [COUNT] de [MAX] ([AVAILABLE] disponíveis)
</panel.string>
- <panel.string name="can_not_change">
- Terra comprada nesta região não pode ser compartilhada
-ou sub-dividida.
+ <panel.string name="objects_deleted_text">
+ [COUNT] de [MAX] ([DELETED] serão deletados)
</panel.string>
- </panel>
- <panel label="Objetos" name="land_objects_panel">
<text name="parcel_object_bonus">
- Fator de Bonus para Objetos na Região: [BONUS]
+ Fator de bônus para objetos na região: [BONUS]
</text>
<text name="Simulator primitive usage:">
- Uso do simulador de primitivas:
+ Uso de prims:
</text>
<text left="214" name="objects_available" width="230">
[COUNT] de [MAX] ([AVAILABLE] disponíveis)
</text>
- <panel.string name="objects_available_text">
- [COUNT] de [MAX] ([AVAILABLE] disponíveis)
- </panel.string>
- <panel.string name="objects_deleted_text">
- [COUNT] de [MAX] ([DELETED] serão deletados)
- </panel.string>
<text name="Primitives parcel supports:" width="200">
- Primitivas suportadas pelo lote:
+ Prims suportados pelo lote:
</text>
<text left="214" name="object_contrib_text" width="152">
[COUNT]
</text>
<text name="Primitives on parcel:">
- Primitivas no Lote:
+ Prims no lote:
</text>
<text left="214" name="total_objects_text" width="48">
[COUNT]
@@ -224,73 +243,46 @@ ou sub-dividida.
[COUNT]
</text>
<button label="Mostrar" label_selected="Mostrar" name="ShowOwner" right="-135" width="60"/>
- <button label="Retornar..." label_selected="Retornar..." name="ReturnOwner..." right="-10" tool_tip="Retornar os objetos aos seus donos." width="119"/>
+ <button label="Devolver" name="ReturnOwner..." right="-10" tool_tip="Devolver objetos a seus donos." width="119"/>
<text left="14" name="Set to group:" width="180">
- Configurados ao grupo:
+ Reservado para o grupo:
</text>
<text left="214" name="group_objects_text" width="48">
[COUNT]
</text>
<button label="Mostrar" label_selected="Mostrar" name="ShowGroup" right="-135" width="60"/>
- <button label="Retornar..." label_selected="Retornar..." name="ReturnGroup..." right="-10" tool_tip="Retornar os objetos para seus donos." width="119"/>
+ <button label="Devolver" name="ReturnGroup..." right="-10" tool_tip="Devolver objetos a seus donos." width="119"/>
<text left="14" name="Owned by others:" width="128">
- Propriedade de Outros:
+ Propriedade de outros:
</text>
<text left="214" name="other_objects_text" width="48">
[COUNT]
</text>
<button label="Mostrar" label_selected="Mostrar" name="ShowOther" right="-135" width="60"/>
- <button label="Retornar..." label_selected="Retornar..." name="ReturnOther..." right="-10" tool_tip="Retornar os objetos aos seus donos." width="119"/>
+ <button label="Devolver" name="ReturnOther..." right="-10" tool_tip="Devolver objetos a seus donos." width="119"/>
<text left="14" name="Selected / sat upon:" width="193">
Selecionado/Sentado:
</text>
<text left="214" name="selected_objects_text" width="48">
[COUNT]
</text>
- <text left="4" name="Autoreturn" width="412">
- Auto-retornar objetos dos outros residentes (minutos, 0 para desligado):
+ <text name="Autoreturn">
+ Devolver objetos de outros residentes (p/ desligar tecle 0)
</text>
<line_editor name="clean other time" right="-10"/>
<text name="Object Owners:">
- Donos dos Objetos:
+ Donos dos objetos:
</text>
- <button label="Atualizar Lista" label_selected="Atualizar Lista" name="Refresh List" left="118"/>
- <button label="Retornar objetos..." label_selected="Retornar objetos..." name="Return objects..." left="230"/>
+ <button label="Atualizar lista" label_selected="Atualizar lista" left="118" name="Refresh List" tool_tip="Refresh Object List"/>
+ <button label="Devolver objetos..." label_selected="Devolver objetos..." left="230" name="Return objects..."/>
<name_list name="owner list">
- <column label="Tipo" name="type"/>
- <column label="Nome" name="name"/>
- <column label="Contar" name="count"/>
- <column label="Mais recente" name="mostrecent"/>
+ <name_list.columns label="Tipo" name="type"/>
+ <name_list.columns label="Nome" name="name"/>
+ <name_list.columns label="Contar" name="count"/>
+ <name_list.columns label="Mais recente" name="mostrecent"/>
</name_list>
</panel>
- <panel label="Opções" name="land_options_panel">
- <text name="allow_label">
- Permitir outros residentes a:
- </text>
- <check_box label="Editar Terreno" name="edit land check" tool_tip="Se ativado, qualquer um pode modificar a forma da sua terra. É melhor deixar esta opção desativada, uma vez que você sempre pode editar seu próprio terreno."/>
- <check_box label="Criar Landmarks" name="check landmark"/>
- <check_box label="Voar" name="check fly" tool_tip="Se ativado, os Residentes podem voar na sua terra. Se desativado, eles podem voar apenas para dentro e por cima de sua terra."/>
- <text name="allow_label2" left="172">
- Criar Objetos:
- </text>
- <check_box label="Residentes" name="edit objects check"/>
- <check_box label="Grupo" name="edit group objects check"/>
- <text name="allow_label3" left="172">
- Entrada do Objeto:
- </text>
- <check_box label="Residentes" name="all object entry check"/>
- <check_box label="Grupo" name="group object entry check"/>
- <text name="allow_label4" left="172">
- Executar Scripts:
- </text>
- <check_box label="Residentes" name="check other scripts"/>
- <check_box label="Grupo" name="check group scripts"/>
- <text name="land_options_label">
- Opções de Terra:
- </text>
- <check_box label="Salvo (sem dano)" name="check safe" tool_tip="Se ativado, ajusta o terreno para Seguro, desabilitando combate com danos. Se não ativado, o combate com danos é habilitado."/>
- <check_box label="Sem Empurrar" name="PushRestrictCheck" tool_tip="Evita scripts que empurram. A ativação dessa opção pode ser útil para prevenir comportamentos desordeiros na sua terra."/>
- <check_box label="Mostra o Lugar na Busca (L$30/semana) sob" name="ShowDirectoryCheck" tool_tip="Permitir que as pessoas vejam este terreno nos resultados de busca"/>
+ <panel label="OPÇÕES" name="land_options_panel">
<panel.string name="search_enabled_tooltip">
Permitir que as pessoas vejam este lote nos resultados de busca
</panel.string>
@@ -301,74 +293,83 @@ Apenas lotes maiores podem ser listados na busca.
<panel.string name="search_disabled_permissions_tooltip">
Esta opção está desabilitada porque você não pode modificar as opções deste lote.
</panel.string>
- <combo_box name="land category with adult" left="265" width="155">
- <combo_box.item name="item0" label="Qualquer Categoria"
- />
- <combo_box.item name="item1" label="Locação Linden"
- />
- <combo_box.item name="item2" label="Adult"
- />
- <combo_box.item name="item3" label="Artes e Cultura"
- />
- <combo_box.item name="item4" label="Negócios"
- />
- <combo_box.item name="item5" label="Educacional"
- />
- <combo_box.item name="item6" label="Jogos"
- />
- <combo_box.item name="item7" label="Moradia"
- />
- <combo_box.item name="item8" label="Amigável a Novos Usuários"
- />
- <combo_box.item name="item9" label="Parques &amp; Natureza"
- />
- <combo_box.item name="item10" label="Residencial"
- />
- <combo_box.item name="item11" label="Compras"
- />
- <combo_box.item name="item12" label="Outros"
- />
- </combo_box>
- <combo_box name="land category" left="265" width="155">
- <combo_box.item name="item0" label="Qualquer Categoria"
- />
- <combo_box.item name="item1" label="Locação Linden"
- />
- <combo_box.item name="item3" label="Artes e Cultura"
- />
- <combo_box.item name="item4" label="Negócios"
- />
- <combo_box.item name="item5" label="Educacional"
- />
- <combo_box.item name="item6" label="Jogos"
- />
- <combo_box.item name="item7" label="Moradia"
- />
- <combo_box.item name="item8" label="Amigável a Novos Usuários"
- />
- <combo_box.item name="item9" label="Parques e Natureza"
- />
- <combo_box.item name="item10" label="Residencial"
- />
- <combo_box.item name="item11" label="Compras"
- />
- <combo_box.item name="item12" label="Outros"
- />
- </combo_box>
- <button label="?" label_selected="?" left="426" name="?"/>
- <check_box label="Conteúdo Mature" name="MatureCheck" tool_tip=""/>
<panel.string name="mature_check_mature">
- Conteúdo Mature
+ Conteúdo Adulto
</panel.string>
<panel.string name="mature_check_adult">
- Conteúdo Adult
+ Conteúdo Adulto
</panel.string>
<panel.string name="mature_check_mature_tooltip">
- A informação do seu lote ou seu conteúdo são considerados mature.
+ Os dados do seu lote ou seu conteúdo são considerados adulto.
</panel.string>
<panel.string name="mature_check_adult_tooltip">
- A informação do seu lote ou seu conteúdo são considerados adult.
+ Os dados do seu lote ou seu conteúdo são considerados adulto.
+ </panel.string>
+ <panel.string name="landing_point_none">
+ (nenhum)
</panel.string>
+ <panel.string name="push_restrict_text">
+ Proibido empurrar
+ </panel.string>
+ <panel.string name="push_restrict_region_text">
+ Proibido empurrar (regulamento da região)
+ </panel.string>
+ <text name="allow_label">
+ Autorizar outros residentes a:
+ </text>
+ <check_box label="Editar terreno" name="edit land check" tool_tip="Se ativado, qualquer um pode modificar o terreno. É melhor deixar esta opção desativada, uma vez que você sempre pode editar seu próprio terreno."/>
+ <check_box label="Voar" name="check fly" tool_tip="Se ativado, residentes podem voar sobre seu terreno. Se desativado, eles podem voar apenas até chegar ou sobrevoar o seu terreno."/>
+ <text name="allow_label2">
+ Criar objetos:
+ </text>
+ <check_box label="Residentes" name="edit objects check"/>
+ <check_box label="Grupo" name="edit group objects check"/>
+ <text name="allow_label3">
+ Entrada de objetos:
+ </text>
+ <check_box label="Residentes" name="all object entry check"/>
+ <check_box label="Grupo" name="group object entry check"/>
+ <text name="allow_label4">
+ Executar scripts:
+ </text>
+ <check_box label="Residentes" name="check other scripts"/>
+ <check_box label="Grupo" name="check group scripts"/>
+ <text name="land_options_label">
+ Opções do terreno:
+ </text>
+ <check_box label="Seguro (sem danos)" name="check safe" tool_tip="Se ativado, ajusta o terreno para Seguro, impedindo lutas com danos. Se não ativado, lutas com danos é habilitado."/>
+ <check_box label="Proibido empurrar" name="PushRestrictCheck" tool_tip="Evita scripts que empurram. Ativar essa opção ajuda a prevenir comportamentos desordeiros no seu terreno."/>
+ <check_box label="Mostrar terreno nos resultados de busca (L$30/semana)" name="ShowDirectoryCheck" tool_tip="Permitir que as pessoas vejam este terreno nos resultados de busca"/>
+ <combo_box left="265" name="land category with adult" width="155">
+ <combo_box.item label="Qualquer categoria" name="item0"/>
+ <combo_box.item label="Locação Linden" name="item1"/>
+ <combo_box.item label="Adulto" name="item2"/>
+ <combo_box.item label="Artes e cultura" name="item3"/>
+ <combo_box.item label="Negócios" name="item4"/>
+ <combo_box.item label="Educacional" name="item5"/>
+ <combo_box.item label="Jogos" name="item6"/>
+ <combo_box.item label="Moradia" name="item7"/>
+ <combo_box.item label="Amigável a novos usuários" name="item8"/>
+ <combo_box.item label="Parques &amp; Natureza" name="item9"/>
+ <combo_box.item label="Residencial" name="item10"/>
+ <combo_box.item label="Compras" name="item11"/>
+ <combo_box.item label="Outros" name="item12"/>
+ </combo_box>
+ <combo_box left="265" name="land category" width="155">
+ <combo_box.item label="Qualquer categoria" name="item0"/>
+ <combo_box.item label="Locação Linden" name="item1"/>
+ <combo_box.item label="Artes e cultura" name="item3"/>
+ <combo_box.item label="Negócios" name="item4"/>
+ <combo_box.item label="Educacional" name="item5"/>
+ <combo_box.item label="Jogos" name="item6"/>
+ <combo_box.item label="Moradia" name="item7"/>
+ <combo_box.item label="Amigável a novos usuários" name="item8"/>
+ <combo_box.item label="Parques e Natureza" name="item9"/>
+ <combo_box.item label="Residencial" name="item10"/>
+ <combo_box.item label="Compras" name="item11"/>
+ <combo_box.item label="Outros" name="item12"/>
+ </combo_box>
+ <check_box label="Conteúdo adulto" name="MatureCheck" tool_tip=""/>
<text name="Snapshot:">
Foto:
</text>
@@ -376,39 +377,28 @@ Apenas lotes maiores podem ser listados na busca.
<text name="landing_point">
Ponto de Aterrissagem: [LANDING]
</text>
- <panel.string name="landing_point_none">
- (nenhum)
- </panel.string>
- <button label="Definir" label_selected="Definir" name="Set" tool_tip="Define o ponto de aterrissagem aonde o visitante chega. Define para o ponto em que seu avatar se encontra neste lote."/>
+ <button label="Definir" label_selected="Definir" name="Set" tool_tip="Define o ponto de aterrissagem de visitantes. Define para o ponto em que seu avatar se encontra neste lote."/>
<button label="Limpar" label_selected="Limpar" name="Clear" tool_tip="Limpar o ponto de aterrissagem."/>
<text name="Teleport Routing: ">
- Rota de Tele-transporte:
- </text>
- <combo_box width="160" left="140" name="landing type" tool_tip="Rota de Teletransporte -- Selecione como tratar os tele-transportes no seu lote.">
- <combo_box.item name="Blocked" label="Bloqueado"
- />
- <combo_box.item name="LandingPoint" label="Ponto de Aterrissagem"
- />
- <combo_box.item name="Anywhere" label="Qualquer lugar"
- />
+ Rota de teletransporte:
+ </text>
+ <combo_box left="140" name="landing type" tool_tip="Rota de Teletransporte -- Selecione como tratar os teletransportes no seu lote." width="160">
+ <combo_box.item label="Bloqueado" name="Blocked"/>
+ <combo_box.item label="Ponto de aterrissagem" name="LandingPoint"/>
+ <combo_box.item label="Qualquer lugar" name="Anywhere"/>
</combo_box>
- <panel.string name="push_restrict_text">
- Sem Empurrar
- </panel.string>
- <panel.string name="push_restrict_region_text">
- Sem Empurrar (Imposição na Região)
- </panel.string>
</panel>
- <panel label="Mídia" name="land_media_panel">
+ <panel label="MÃDIA" name="land_media_panel">
<text name="with media:" width="85">
Tipo de Mídia:
</text>
<combo_box left="97" name="media type" tool_tip="Especificar se a URL é um filme, uma página web ou outra mídia"/>
<text name="at URL:" width="85">
- URL da Mídia:
+ Página web:
</text>
<line_editor left="97" name="media_url"/>
<button label="Definir..." label_selected="Definir..." name="set_media_url"/>
+ <check_box label="Esconder a URL da mídia" left="97" name="hide_media_url" tool_tip="Ativando esta opção, a URL da mídia se ocultará para quaisquer visualizadores não autorizados a ver esta informação do lote. Notar que isto não está disponível para tipos HTML."/>
<text name="Description:">
Descrição:
</text>
@@ -419,18 +409,9 @@ Textura:
</text>
<texture_picker label="" left="97" name="media texture" tool_tip="Clique para escolher uma imagem"/>
<text name="replace_texture_help">
- (Objetos usando esta textura, mostrarão o filme ou
-a página web depois que você clicar na seta de
-reproduzir.)
- </text>
- <text name="Options:">
- Opções de
-Mídia:
+ Objetos com esta textura vão aparecer no filme ou página da web depois de clicar em Tocar. Selecione outras texturas clicando nas miniaturas.
</text>
<check_box label="Escala automática" left="97" name="media_auto_scale" tool_tip="Marcando esta opção o conteúdo se ajustará ao lote automaticamente. A mídia pode se tornar lenta e com baixa qualidade visual mas nenhum outro ajuste de textura ou alinhamento será necessário."/>
- <check_box label="Mídia em Repetição" name="media_loop" tool_tip="Executar a mídia repetidamente. Quando a mídia terminar a execução, ela reiniciará do começo."/>
- <check_box label="Esconder a URL da Mídia" left="97" name="hide_media_url" tool_tip="Ativando esta opção, a URL da mídia se ocultará para quaisquer visualizadores não autorizados a ver esta informação do lote. Notar que isto não está disponível para tipos HTML."/>
- <check_box label="Esconder a URL de Música" name="hide_music_url" tool_tip="Ativando esta opção, a URL de música se esconderá para visualizadores não autorizados a ver esta informação do lote"/>
<text left="102" name="media_size" tool_tip="Tamanho para desenhar a mídia Web, deixar 0 como padrão." width="115">
Tamanho da mídia:
</text>
@@ -439,57 +420,48 @@ Mídia:
<text name="pixels">
pixels
</text>
- <text name="MusicURL:">
- URL da Música:
- </text>
- <line_editor left="97" name="music_url"/>
- <text name="Sound:">
- Som:
- </text>
- <check_box label="Restringir gestos e sons de objetos a este lote" left="97" name="check sound local"/>
- <button label="?" label_selected="?" name="?"/>
- <text name="Voice settings:">
- Voz:
+ <text name="Options:">
+ Opções de
+Mídia:
</text>
- <check_box left="97" label="Habilitar Voz" name="parcel_enable_voice_channel"/>
- <check_box left="97" label="Habilitar Voz (definida pela Propriedade)" name="parcel_enable_voice_channel_is_estate_disabled"/>
- <check_box left="117" label="Restringir Voz a este lote" name="parcel_enable_voice_channel_parcel"/>
+ <check_box label="Repetir mídia" name="media_loop" tool_tip="Executar a mídia repetidamente. Quando a mídia chegar ao fim, ela recomeça."/>
</panel>
- <panel label="Acesso" name="land_access_panel">
+ <panel label="SOM" name="land_audio_panel">
+ <check_box label="Ocultar URL" name="hide_music_url" tool_tip="Selecionar esta opção oculta o URL de música a visitantes não autorizados aos dados do terreno."/>
+ <check_box label="Ativar voz" name="parcel_enable_voice_channel"/>
+ <check_box label="Ativar voz (definições do terreno)" name="parcel_enable_voice_channel_is_estate_disabled"/>
+ <check_box label="Limitar bate-papo de voz a este lote" name="parcel_enable_voice_channel_local"/>
+ </panel>
+ <panel label="ACESSO" name="land_access_panel">
+ <panel.string name="access_estate_defined">
+ (Definições do terreno)
+ </panel.string>
+ <panel.string name="allow_public_access">
+ Acesso para público: [MATURITY]
+ </panel.string>
+ <panel.string name="estate_override">
+ Uma ou mais destas opções está definida no nível de propriedade.
+ </panel.string>
<text name="Limit access to this parcel to:">
- Acesso a Este Lote
+ Acesso a este lote
</text>
- <check_box label="Permitir Acesso Público" name="public_access"/>
+ <check_box label="Acesso para público categoria [MATURITY]" name="public_access"/>
<text name="Only Allow">
- Bloquear Acesso por:
+ Restringir acesso a contas confirmardas por:
</text>
- <check_box label="Residentes que não forneceram informações de pagamento para a Linden Lab" name="limit_payment" tool_tip="Banir residentes não identificados."/>
- <check_box label="Residentes que não tiveram a idade de adulto confirmada" name="limit_age_verified" tool_tip="Banir residentes que não tiveram sua idade verificada. Veja support.secondlife.com para maiores informações."/>
- <panel.string name="estate_override">
- Uma ou mais destas opções está definida no nível de propriedade.
- </panel.string>
- <check_box label="Permitir Acesso do Grupo: [GROUP]" name="GroupCheck" tool_tip="Definir grupo na aba Geral."/>
+ <check_box label="Dados de pagamento fornecidos [ESTATE_PAYMENT_LIMIT]" name="limit_payment" tool_tip="Banir residentes sem identificação."/>
+ <check_box label="Idade comprovada: [ESTATE_AGE_LIMIT]" name="limit_age_verified" tool_tip="Banir residentes que não comprovaram a idade. Consulte o [SUPPORT_SITE] para saber mais."/>
+ <check_box label="Permitir acesso do grupo: [GROUP]" name="GroupCheck" tool_tip="Definir grupo na aba Geral."/>
<check_box label="Vender passes para:" name="PassCheck" tool_tip="Permite acesso temporário a este terreno"/>
<combo_box name="pass_combo">
- <combo_box.item name="Anyone" label="Qualquer um"
- />
- <combo_box.item name="Group" label="Grupo"
- />
+ <combo_box.item label="Qualquer um" name="Anyone"/>
+ <combo_box.item label="Grupo" name="Group"/>
</combo_box>
<spinner label="Preço em L$:" name="PriceSpin"/>
- <spinner label="Horas de Acesso:" name="HoursSpin"/>
- <text label="Permitir Sempre" name="AllowedText">
- Residentes Permitidos
- </text>
- <name_list name="AccessList" tool_tip="([LISTED] listados, [MAX] máximo)"/>
- <button label="Adicionar..." label_selected="Adicionar..." name="add_allowed"/>
- <button label="Remover" label_selected="Remover" name="remove_allowed"/>
- <text label="Banir" name="BanCheck">
- Residentes Banidos
- </text>
- <name_list name="BannedList" tool_tip="([LISTED] listados, [MAX] máximo)"/>
- <button label="Adicionar..." label_selected="Adicionar..." name="add_banned"/>
- <button label="Remover" label_selected="Remover" name="remove_banned"/>
+ <spinner label="Horas de acesso:" name="HoursSpin"/>
+ <panel name="Allowed_layout_panel">
+ <name_list name="AccessList" tool_tip="(Total [LISTED], máx de [MAX])"/>
+ </panel>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_activeim.xml b/indra/newview/skins/default/xui/pt/floater_activeim.xml
new file mode 100644
index 0000000000..892ccdf974
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_activeim.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_activeim" title="MI ativa"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_animation_preview.xml b/indra/newview/skins/default/xui/pt/floater_animation_preview.xml
index f3297ea5ee..3ec81612a1 100644
--- a/indra/newview/skins/default/xui/pt/floater_animation_preview.xml
+++ b/indra/newview/skins/default/xui/pt/floater_animation_preview.xml
@@ -1,70 +1,180 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Animation Preview" title="">
+ <floater.string name="failed_to_initialize">
+ Não foi possível iniciar o movimento
+ </floater.string>
+ <floater.string name="anim_too_long">
+ O arquivo de animação tem [LENGTH] segundos de duração.
+
+A duração máxima de animação permitida é de [MAX_LENGTH] segundos.
+ </floater.string>
+ <floater.string name="failed_file_read">
+ Não foi possível ler o arquivo de animação.
+
+[STATUS]
+ </floater.string>
+ <floater.string name="E_ST_OK">
+ OK
+ </floater.string>
+ <floater.string name="E_ST_EOF">
+ Fim de arquivo prematuro
+ </floater.string>
+ <floater.string name="E_ST_NO_CONSTRAINT">
+ Impossível ler definição constraint.
+ </floater.string>
+ <floater.string name="E_ST_NO_FILE">
+ Impossível abrir arquivo BVH.
+ </floater.string>
+ <floater.string name="E_ST_NO_HIER">
+ Invalid HIERARCHY header.
+ </floater.string>
+ <floater.string name="E_ST_NO_JOINT">
+ RAIZ ou JUNTA não encontrados.
+ </floater.string>
+ <floater.string name="E_ST_NO_NAME">
+ Impossível obter nome JOINT.
+ </floater.string>
+ <floater.string name="E_ST_NO_OFFSET">
+ Impossível localizar OFFSET.
+ </floater.string>
+ <floater.string name="E_ST_NO_CHANNELS">
+ Impossível localizar CHANNELS.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROTATION">
+ Impossível obter ordem de rotação.
+ </floater.string>
+ <floater.string name="E_ST_NO_AXIS">
+ Impossível obter eixo de rotação.
+ </floater.string>
+ <floater.string name="E_ST_NO_MOTION">
+ Impossível localizar MOTION.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAMES">
+ Impossível determinar número de quadros.
+ </floater.string>
+ <floater.string name="E_ST_NO_FRAME_TIME">
+ Impossível determinar tempo dos quadros.
+ </floater.string>
+ <floater.string name="E_ST_NO_POS">
+ Impossível definir posicionamento.
+ </floater.string>
+ <floater.string name="E_ST_NO_ROT">
+ Impossível definir valores da rotação.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_FILE">
+ Impossível abrir arquivo de tradução.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HEADER">
+ Impossível ler cabeçalho de tradução.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_NAME">
+ Impossível ler nomes traduzidos.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_IGNORE">
+ Impossível obter valor traduzido a ignorar.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_RELATIVE">
+ Impossível obter valor traduzido relativo.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_OUTNAME">
+ Impossível obter valor traduzido.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MATRIX">
+ Impossível ler matriz de tradução.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGECHILD">
+ Impossível obter nome mergechild.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_MERGEPARENT">
+ Impossível obter nome mergeparent.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_PRIORITY">
+ Impossível obter valor prioritário.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_LOOP">
+ Impossível obter valor do loop.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEIN">
+ Impossível obter valor easeIn.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EASEOUT">
+ Impossível obter valor easeOut.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_HAND">
+ Impossível obter valor de morph da mão.
+ </floater.string>
+ <floater.string name="E_ST_NO_XLT_EMOTE">
+ Impossível ler nome do emote.
+ </floater.string>
+ <floater.string name="E_ST_BAD_ROOT">
+ Nome da junta incorreto, use &quot;quadril&quot;.
+ </floater.string>
<text name="name_label">
Nome:
</text>
<text name="description_label">
Descrição:
</text>
- <spinner label_width="72" width="110" label="Prioridade" name="priority" tool_tip="Controla quais animações podem se sobrepor a esta animação."/>
- <check_box label="Loop" name="loop_check" tool_tip="Executa a animação repetidamente."/>
- <spinner label_width="56" left="65" width="116" label="Dentro(%)" name="loop_in_point" tool_tip="Ajusta o ponto da animação onde a repetição começa."/>
- <spinner label_width="40" left="185" label="Fora(%)" name="loop_out_point" tool_tip="Ajusta o ponto da animação onde a repetição termina."/>
+ <spinner label="Prioridade" label_width="72" name="priority" tool_tip="Controla quais animações podem ser interrompidas por esta animação" width="110"/>
+ <check_box label="Loop" name="loop_check" tool_tip="Executa esta animação sem parar"/>
+ <spinner label="Dentro(%)" label_width="56" left="65" name="loop_in_point" tool_tip="Define o ponto em que a animação em loop reinicia" width="116"/>
+ <spinner label="Fora(%)" label_width="40" left="185" name="loop_out_point" tool_tip="Define o ponto em que a animação em loop acaba"/>
<text name="hand_label">
Pose de Mão
</text>
- <combo_box left_delta="100" width="184" name="hand_pose_combo" tool_tip="Controla o que as mãos fazem durante a animação">
- <combo_box.item name="Spread" label="Espreguiçar" />
- <combo_box.item name="Relaxed" label="Relaxado" />
- <combo_box.item name="PointBoth" label="Apontar Ambos" />
- <combo_box.item name="Fist" label="Punho" />
- <combo_box.item name="RelaxedLeft" label="Relaxado para Esquerda" />
- <combo_box.item name="PointLeft" label="Apontar à Esquerda" />
- <combo_box.item name="FistLeft" label="Punho Esquerdo" />
- <combo_box.item name="RelaxedRight" label="Relaxado para Direita" />
- <combo_box.item name="PointRight" label="Apontar à Direita" />
- <combo_box.item name="FistRight" label="Punho Direito" />
- <combo_box.item name="SaluteRight" label="Saudar à Direita" />
- <combo_box.item name="Typing" label="Digitando" />
- <combo_box.item name="PeaceRight" label="Pacífico à Direita" />
+ <combo_box left_delta="100" name="hand_pose_combo" tool_tip="Controla os gestos das mãos durante a animação" width="184">
+ <combo_box.item label="Abrir" name="Spread"/>
+ <combo_box.item label="Relaxado" name="Relaxed"/>
+ <combo_box.item label="Apontar ambas" name="PointBoth"/>
+ <combo_box.item label="Punho" name="Fist"/>
+ <combo_box.item label="E relaxada" name="RelaxedLeft"/>
+ <combo_box.item label="Apontar E" name="PointLeft"/>
+ <combo_box.item label="Punho E" name="FistLeft"/>
+ <combo_box.item label="D relaxada" name="RelaxedRight"/>
+ <combo_box.item label="Apontar D" name="PointRight"/>
+ <combo_box.item label="Punho D" name="FistRight"/>
+ <combo_box.item label="Saudação D" name="SaluteRight"/>
+ <combo_box.item label="Escrevendo" name="Typing"/>
+ <combo_box.item label="Paz D" name="PeaceRight"/>
</combo_box>
<text name="emote_label">
Expressão
</text>
- <combo_box left_delta="100" width="184" name="emote_combo" tool_tip="Controla o que a face faz durante a animação.">
- <combo_box.item name="[None]" label="None]" />
- <combo_box.item name="Aaaaah" label="Aaaaah" />
- <combo_box.item name="Afraid" label="Temeroso" />
- <combo_box.item name="Angry" label="Raivoso" />
- <combo_box.item name="BigSmile" label="Sorrisão" />
- <combo_box.item name="Bored" label="Entediado" />
- <combo_box.item name="Cry" label="Chorar" />
- <combo_box.item name="Disdain" label="Desprezar" />
- <combo_box.item name="Embarrassed" label="Envergonhado" />
- <combo_box.item name="Frown" label="Franzir a testa" />
- <combo_box.item name="Kiss" label="Beijar" />
- <combo_box.item name="Laugh" label="Rir" />
- <combo_box.item name="Plllppt" label="Plllppt" />
- <combo_box.item name="Repulsed" label="Enojado" />
- <combo_box.item name="Sad" label="Triste" />
- <combo_box.item name="Shrug" label="Indiferença" />
- <combo_box.item name="Smile" label="Sorriso" />
- <combo_box.item name="Surprise" label="Surpreso" />
- <combo_box.item name="Wink" label="Piscar" />
- <combo_box.item name="Worry" label="Preocupado" />
+ <combo_box left_delta="100" name="emote_combo" tool_tip="Controla as expressões faciais durante a animação" width="184">
+ <item label="(nenhum)" name="[None]" value=""/>
+ <item label="Aaaaah" name="Aaaaah" value="Aaaaah"/>
+ <item label="Com medo" name="Afraid" value="Com medo"/>
+ <item label="Bravo" name="Angry" value="Bravo"/>
+ <item label="Sorriso contagiante" name="BigSmile" value="Sorriso contagiante"/>
+ <item label="À toa" name="Bored" value="À toa"/>
+ <item label="Chorar" name="Cry" value="Chorar"/>
+ <item label="Desdenho" name="Disdain" value="Desdenho"/>
+ <item label="Com vergonha" name="Embarrassed" value="Com vergonha"/>
+ <item label="Franzir testa" name="Frown" value="Franzir testa"/>
+ <item label="Beijo" name="Kiss" value="Beijo"/>
+ <item label="Rir" name="Laugh" value="Rir"/>
+ <item label="Mostrar a língua" name="Plllppt" value="Mostrar a língua"/>
+ <item label="Asco" name="Repulsed" value="Asco"/>
+ <item label="Triste" name="Sad" value="Triste"/>
+ <item label="Encolher os ombros" name="Shrug" value="Encolher os ombros"/>
+ <item label="Sorriso" name="Smile" value="Sorriso"/>
+ <item label="Surpresa" name="Surprise" value="Surpresa"/>
+ <item label="Piscar" name="Wink" value="Piscar"/>
+ <item label="Preocupado" name="Worry" value="Preocupado"/>
</combo_box>
<text name="preview_label" width="250">
Prever enquanto
</text>
- <combo_box left_delta="100" width="130" name="preview_base_anim" tool_tip="Use isto para testar o comportamento de sua animação enquanto seu avatar executa ações comuns.">
- <combo_box.item name="Standing" label="Parado" />
- <combo_box.item name="Walking" label="Andando" />
- <combo_box.item name="Sitting" label="Sentando" />
- <combo_box.item name="Flying" label="Voando" />
+ <combo_box left_delta="100" name="preview_base_anim" tool_tip="Use isto para testar o comportamento de sua animação enquanto seu avatar executa ações comuns." width="130">
+ <item label="Em pé" name="Standing" value="Em pé"/>
+ <item label="Andando" name="Walking" value="Andando"/>
+ <item label="Sentado" name="Sitting" value="Sentado"/>
+ <item label="Voando" name="Flying" value="Voando"/>
</combo_box>
- <spinner label_width="125" width="192" label="Facilitar a entrada (sec)" name="ease_in_time" tool_tip="Quantidade de tempo (em segundos) para que as animações se mesclem."/>
- <spinner bottom_delta="-20" label_width="125" left="10" width="192" label="Facilitar a saída (sec)" name="ease_out_time" tool_tip="Quantidade de tempo (em segundos) para que a animações se mesclem."/>
- <button bottom_delta="-32" name="play_btn" tool_tip="Executa/pausa sua animação."/>
+ <spinner label="Facilitar a entrada (sec)" label_width="125" name="ease_in_time" tool_tip="Tempo (em segundos) da transição inicial da animação" width="192"/>
+ <spinner bottom_delta="-20" label="Facilitar a saída (sec)" label_width="125" left="10" name="ease_out_time" tool_tip="Tempo (em segundos) da transição de saída da animação" width="192"/>
+ <button bottom_delta="-32" name="play_btn" tool_tip="Executar animação"/>
+ <button name="pause_btn" tool_tip="Pausar a animação"/>
<button label="" name="stop_btn" tool_tip="Interrompe a execução da animação."/>
<text name="bad_animation_text">
Incapaz de ler o arquivo de animação.
@@ -72,19 +182,6 @@
Nós recomendamos exportar arquivos BVH do
Poser 4.
</text>
- <button label="Cancelar" name="cancel_btn"/>
<button label="Carregar (L$[AMOUNT])" name="ok_btn"/>
- <string name="failed_to_initialize">
- Não foi possível iniciar o movimento
- </string>
- <string name="anim_too_long">
- O arquivo de animação tem [LENGTH] segundos de duração.
-
-A duração máxima de animação permitida é de [MAX_LENGTH] segundos.
- </string>
- <string name="failed_file_read">
- Não foi possível ler o arquivo de animação.
-
-[STATUS]
- </string>
+ <button label="Cancelar" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_auction.xml b/indra/newview/skins/default/xui/pt/floater_auction.xml
index 34cd17d781..074f7bf001 100644
--- a/indra/newview/skins/default/xui/pt/floater_auction.xml
+++ b/indra/newview/skins/default/xui/pt/floater_auction.xml
@@ -1,9 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_auction" title="INICIAR A VENDA DE TERRENOS DA LINDEN">
- <check_box label="Incluir marcador de seleção amarelo" name="fence_check"/>
- <button label="Foto" label_selected="Foto" name="snapshot_btn"/>
- <button label="OK" label_selected="OK" name="ok_btn"/>
- <text name="already for sale">
+<floater name="floater_auction" title="INICIAR VENDA DE TERRENO LINDEN START">
+ <floater.string name="already for sale">
Você não pode leiloar terrenos que já estão configurados para venda.
- </text>
+ </floater.string>
+ <check_box initial_value="true" label="Incluir marcador de seleção amarelo" name="fence_check"/>
+ <button label="Foto" label_selected="Foto" name="snapshot_btn"/>
+ <button label="Vender a qualquer um" label_selected="Vender a qualquer um" name="sell_to_anyone_btn"/>
+ <button label="Clear Settings" label_selected="Limpar configurações" name="reset_parcel_btn"/>
+ <button label="Iniciar Leilão" label_selected="Iniciar Leilão" name="start_auction_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_avatar_picker.xml b/indra/newview/skins/default/xui/pt/floater_avatar_picker.xml
index 186ef30e1b..a2e6f7945a 100644
--- a/indra/newview/skins/default/xui/pt/floater_avatar_picker.xml
+++ b/indra/newview/skins/default/xui/pt/floater_avatar_picker.xml
@@ -1,42 +1,47 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="avatarpicker" title="ESCOLHA O RESIDENTE" min_width="285" width="285">
+<floater min_width="285" name="avatarpicker" title="SELECIONE O RESIDENTE" width="285">
+ <floater.string name="not_found">
+ &apos;[TEXT]&apos; não encontrado
+ </floater.string>
+ <floater.string name="no_one_near">
+ Ninguém por perto
+ </floater.string>
+ <floater.string name="no_results">
+ Nenhum resultado
+ </floater.string>
+ <floater.string name="searching">
+ Buscando...
+ </floater.string>
+ <string label="Selecionar" label_selected="Selecionar" name="Select">
+ Selecionar
+ </string>
+ <string name="Close">
+ Fechar
+ </string>
<tab_container name="ResidentChooserTabs" width="275">
<panel label="Buscar" name="SearchPanel">
<text name="InstructSearchResidentName">
- Digite parte do nome do Residente:
+ Digite parte do nome de alguém:
</text>
- <button label="Encontrar" label_selected="Encontrar" name="Find"/>
+ <button label="OK" label_selected="OK" name="Find"/>
</panel>
- <panel label="Cartões de Visita" name="CallingCardsPanel">
- <text name="InstructSelectCallingCard">
- Selecione um cartão de visita:
+ <panel label="Amigos" name="FriendsPanel">
+ <text name="InstructSelectFriend">
+ Selecione alguém:
</text>
</panel>
<panel label="Próximo a Mim" name="NearMePanel">
<text name="InstructSelectResident">
- Selecione residente
-próximo:
+ Selecione alguém por perto:
</text>
- <button font="SansSerifSmall" left_delta="1" width="115" label="Atualizar Lista" label_selected="Atualizar Lista" name="Refresh"/>
- <slider label="Faixa" name="near_me_range" bottom_delta="-36"/>
+ <slider bottom_delta="-36" label="Faixa" name="near_me_range"/>
<text name="meters">
Metros
</text>
- <scroll_list bottom_delta="-169" height="159" name="NearMe" />
+ <button font="SansSerifSmall" label="Atualizar Lista" label_selected="Atualizar Lista" left_delta="1" name="Refresh" width="115"/>
+ <scroll_list bottom_delta="-169" height="159" name="NearMe"/>
</panel>
</tab_container>
- <button label="Selecionar" label_selected="Selecionar" name="Select"/>
- <button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
- <string name="not_found">
- &apos;[TEXT]&apos; não encontrado
- </string>
- <string name="no_one_near">
- Ninguém proximo
- </string>
- <string name="no_results">
- Nenhum resultado
- </string>
- <string name="searching">
- Buscando...
- </string>
+ <button label="OK" label_selected="OK" name="ok_btn"/>
+ <button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_avatar_textures.xml b/indra/newview/skins/default/xui/pt/floater_avatar_textures.xml
index 04a78efb12..9473ee7ce9 100644
--- a/indra/newview/skins/default/xui/pt/floater_avatar_textures.xml
+++ b/indra/newview/skins/default/xui/pt/floater_avatar_textures.xml
@@ -1,30 +1,50 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="avatar_texture_debug" title="TEXTURAS DO AVATAR">
- <text name="baked_label">
- Texturas sobrepostas
- </text>
- <text name="composite_label">
- Texturas compostas
- </text>
- <texture_picker label="Cabeça" name="baked_head"/>
- <texture_picker label="Maquiagem" name="head_bodypaint"/>
- <texture_picker label="Cabelo" name="hair"/>
- <button label="Tombar" label_selected="Tombar" name="Dump"/>
- <texture_picker label="Olhos" name="baked_eyes"/>
- <texture_picker label="Olho" name="eye_texture"/>
- <texture_picker label="Parte de cima" name="baked_upper_body"/>
- <texture_picker label="Tatuagem para partes de cima" name="upper_bodypaint"/>
- <texture_picker label="Camiseta" name="undershirt"/>
- <texture_picker label="Luvas" name="gloves"/>
- <texture_picker label="Camisa" name="shirt"/>
- <texture_picker label="Jaqueta" name="upper_jacket"/>
- <texture_picker label="Parte de baixo" name="baked_lower_body"/>
- <texture_picker label="Tatuagem para partes de baixo" name="lower_bodypaint"/>
- <texture_picker label="Roupas de baixo" name="underpants"/>
- <texture_picker label="Meias" name="socks"/>
- <texture_picker label="Calçados" name="shoes"/>
- <texture_picker label="Calças" name="pants"/>
- <texture_picker label="Jaqueta" name="jacket"/>
- <texture_picker label="Saia" name="baked_skirt"/>
- <texture_picker label="Saia" name="skirt_texture"/>
+<floater name="avatar_texture_debug" title="TEXTURAS DE AVATAR">
+ <floater.string name="InvalidAvatar">
+ AVATAR INVÃLIDO
+ </floater.string>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="label">
+ Pronto
+Texturas
+ </text>
+ <text name="composite_label">
+ Compósito:
+Texturas
+ </text>
+ <button label="Enviar IDs para painel" label_selected="Dump" name="Dump"/>
+ <panel name="scroll_content_panel">
+ <texture_picker label="Cabelo" name="hair-baked"/>
+ <texture_picker label="Cabelo" name="hair_grain"/>
+ <texture_picker label="Cabelo alpha" name="hair_alpha"/>
+ <texture_picker label="Cabeça" name="head-baked"/>
+ <texture_picker label="Maquilagem" name="head_bodypaint"/>
+ <texture_picker label="Cabeça Alpha" name="head_alpha"/>
+ <texture_picker label="Tatuagem na cabeça" name="head_tattoo"/>
+ <texture_picker label="Olhos" name="eyes-baked"/>
+ <texture_picker label="Olho" name="eyes_iris"/>
+ <texture_picker label="Olhos Alpha" name="eyes_alpha"/>
+ <texture_picker label="Cintura acima" name="upper-baked"/>
+ <texture_picker label="Pintura corporal, cintura para cima" name="upper_bodypaint"/>
+ <texture_picker label="Camiseta" name="upper_undershirt"/>
+ <texture_picker label="Luvas" name="upper_gloves"/>
+ <texture_picker label="Camisa" name="upper_shirt"/>
+ <texture_picker label="Jaqueta (cima)" name="upper_jacket"/>
+ <texture_picker label="Alpha de cima" name="upper_alpha"/>
+ <texture_picker label="Tatuagem parte de cima" name="upper_tattoo"/>
+ <texture_picker label="Cintura para baixo" name="lower-baked"/>
+ <texture_picker label="Cintura para baixo" name="lower_bodypaint"/>
+ <texture_picker label="Roupa de baixo" name="lower_underpants"/>
+ <texture_picker label="Meias" name="lower_socks"/>
+ <texture_picker label="Sapatos" name="lower_shoes"/>
+ <texture_picker label="Calças" name="lower_pants"/>
+ <texture_picker label="Jaqueta" name="lower_jacket"/>
+ <texture_picker label="Alpha inferior" name="lower_alpha"/>
+ <texture_picker label="Tatuagem de baixo" name="lower_tattoo"/>
+ <texture_picker label="Saia" name="skirt-baked"/>
+ <texture_picker label="Saia" name="skirt"/>
+ </panel>
+ </panel>
+ </scroll_container>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_beacons.xml b/indra/newview/skins/default/xui/pt/floater_beacons.xml
index 82f055745f..b16ff6003e 100644
--- a/indra/newview/skins/default/xui/pt/floater_beacons.xml
+++ b/indra/newview/skins/default/xui/pt/floater_beacons.xml
@@ -1,15 +1,21 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="beacons" title="BALIZAS">
<panel name="beacons_panel">
- <check_box label="Objetos programados com toque apenas" name="touch_only"/>
- <check_box label="Objetos programados" name="scripted"/>
- <check_box label="Objetos físicos" name="physical"/>
- <check_box label="Fontes de Som" name="sounds"/>
- <check_box label="Fontes de Partículas" name="particles"/>
- <check_box label="Renderização de Highlights" name="highlights"/>
- <check_box label="Renderização de Balizas" name="beacons"/>
- <text name="beacon_width_label">
- Largura da Baliza
+ <text name="label_show">
+ Mostrar:
</text>
+ <check_box label="Balizas" name="beacons"/>
+ <check_box label="Realce" name="highlights"/>
+ <text name="beacon_width_label" tool_tip="Largura da baliza">
+ Largura:
+ </text>
+ <text name="label_objects">
+ Para estes objetos:
+ </text>
+ <check_box label="Físicos" name="physical"/>
+ <check_box label="Com script" name="scripted"/>
+ <check_box label="Só tocar" name="touch_only"/>
+ <check_box label="Fontes de som" name="sounds"/>
+ <check_box label="Fontes de partículas" name="particles"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_build_options.xml b/indra/newview/skins/default/xui/pt/floater_build_options.xml
index bce78fad21..71a1483dde 100644
--- a/indra/newview/skins/default/xui/pt/floater_build_options.xml
+++ b/indra/newview/skins/default/xui/pt/floater_build_options.xml
@@ -1,8 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="build options floater" title="OPÇÕES DE GRADE">
- <spinner label="Uni. Grade (metros)" name="GridResolution" width="180" label_width="122"/>
- <spinner label="Ext. da Grade (metros)" name="GridDrawSize" width="180" label_width="122"/>
- <check_box label="Habilitar ajuste de sub-grade" name="GridSubUnit"/>
- <check_box label="Mostrar as seções de cruzamento" name="GridCrossSection"/>
+ <spinner label="Unidade da grade (metros)" label_width="122" name="GridResolution" width="180"/>
+ <spinner label="Ext. da Grade (metros)" label_width="122" name="GridDrawSize" width="180"/>
+ <check_box label="Encaixar em sub-unidades" name="GridSubUnit"/>
+ <check_box label="Ver corte transversal" name="GridCrossSection"/>
+ <text name="grid_opacity_label" tool_tip="Opacidade da grade">
+ Opacidade:
+ </text>
<slider label="Opacidade da grade" name="GridOpacity" width="220"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml b/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml
index 7443e19721..8823d04b62 100644
--- a/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml
+++ b/indra/newview/skins/default/xui/pt/floater_bulk_perms.xml
@@ -1,44 +1,54 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floaterbulkperms" title="MUDANÇA CONJUNTA DAS PERMISSÕES DE CONTEÚDO">
- <text name="applyto">
- Tipos de Conteúdo
- </text>
+<floater name="floaterbulkperms" title="EDITAR AUTORIZAÇÕES DE CONTEÚDO">
+ <floater.string name="nothing_to_modify_text">
+ A seleção não contém nenhum conteúdo editável.
+ </floater.string>
+ <floater.string name="status_text">
+ Definindo permissões em [NAME]
+ </floater.string>
+ <floater.string name="start_text">
+ Solicitando mudança de permissão...
+ </floater.string>
+ <floater.string name="done_text">
+ Solicitação de mudança de permissão concluída.
+ </floater.string>
<check_box label="Animação" name="check_animation"/>
- <check_box label="Partes do Corpo" name="check_bodypart"/>
+ <icon name="icon_animation" tool_tip="Animação"/>
+ <check_box label="Partes do corpo" name="check_bodypart"/>
+ <icon name="icon_bodypart" tool_tip="Partes do corpo"/>
<check_box label="Roupas" name="check_clothing"/>
+ <icon name="icon_clothing" tool_tip="Vestuário"/>
<check_box label="Gestos" name="check_gesture"/>
- <check_box label="Landmarks" name="check_landmark"/>
- <check_box label="Notecards" name="check_notecard"/>
+ <icon name="icon_gesture" tool_tip="Gestos"/>
+ <check_box label="Anotações" name="check_notecard"/>
+ <icon name="icon_notecard" tool_tip="Anotações"/>
<check_box label="Objetos" name="check_object"/>
+ <icon name="icon_object" tool_tip="Objects"/>
<check_box label="Scripts" name="check_script"/>
+ <icon name="icon_script" tool_tip="Scripts"/>
<check_box label="Sons" name="check_sound"/>
+ <icon name="icon_sound" tool_tip="Sons"/>
<check_box label="Texturas" name="check_texture"/>
- <button label="Marcar Todas" label_selected="Todas" name="check_all"/>
- <button label="Desmarcar Todas" label_selected="Nenhuma" name="check_none"/>
+ <icon name="icon_texture" tool_tip="Texturas"/>
+ <button label="Tudo" label_selected="Todas" name="check_all"/>
+ <button label="Limpar" label_selected="Nenhuma" name="check_none"/>
<text name="newperms">
- Novas Permissões
+ Novas autorizações de conteúdo
+ </text>
+ <text name="GroupLabel">
+ Grupo:
</text>
- <check_box label="Compartilhar com o grupo" name="share_with_group"/>
- <check_box label="Permitir que qualquer um copie" name="everyone_copy"/>
+ <check_box label="Compartilhar" name="share_with_group"/>
+ <text name="AnyoneLabel">
+ Todos:
+ </text>
+ <check_box label="Copiar" name="everyone_copy"/>
<text name="NextOwnerLabel">
- O próximo dono pode:
+ Próximo proprietário:
</text>
<check_box label="Modificar" name="next_owner_modify"/>
<check_box label="Copiar" name="next_owner_copy"/>
- <check_box label="Revender/Dar" name="next_owner_transfer"/>
- <button label="Ajuda" name="help"/>
- <button label="Aplicar" name="apply"/>
- <button label="Fechar" name="close"/>
- <string name="nothing_to_modify_text">
- A seleção não contém nenhum conteúdo editável.
- </string>
- <string name="status_text">
- Definindo permissões em [NAME]
- </string>
- <string name="start_text">
- Iniciando solicitação de mudança de permissão...
- </string>
- <string name="done_text">
- Solicitação de mudança de permissão concluída.
- </string>
+ <check_box initial_value="true" label="Transferir" name="next_owner_transfer" tool_tip="O próximo dono poderá revender ou dar este objeto"/>
+ <button label="OK" name="apply"/>
+ <button label="Cancelar" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_bumps.xml b/indra/newview/skins/default/xui/pt/floater_bumps.xml
index 1833cd4335..5e656f4730 100644
--- a/indra/newview/skins/default/xui/pt/floater_bumps.xml
+++ b/indra/newview/skins/default/xui/pt/floater_bumps.xml
@@ -1,21 +1,24 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_bumps" title="COLISÕES, IMPULSOS E BATIDAS">
- <text name="none_detected">
+ <floater.string name="none_detected">
Nada detectado
- </text>
- <text name="bump">
+ </floater.string>
+ <floater.string name="bump">
[TIME] [FIRST] [LAST] conflitou com você
- </text>
- <text name="llpushobject">
+ </floater.string>
+ <floater.string name="llpushobject">
[TIME] [FIRST] [LAST] empurrou você com um script
- </text>
- <text name="selected_object_collide">
+ </floater.string>
+ <floater.string name="selected_object_collide">
[TIME] [FIRST] [LAST] o atingiu com um objeto
- </text>
- <text name="scripted_object_collide">
+ </floater.string>
+ <floater.string name="scripted_object_collide">
[TIME] [FIRST] [LAST] o atingiu com um objeto programado
- </text>
- <text name="physical_object_collide">
+ </floater.string>
+ <floater.string name="physical_object_collide">
[TIME] [FIRST] [LAST] o atingiu com um objeto físico
- </text>
+ </floater.string>
+ <floater.string name="timeStr">
+ [[hour,datetime,slt]:[min,datetime,slt]]
+ </floater.string>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_buy_contents.xml b/indra/newview/skins/default/xui/pt/floater_buy_contents.xml
index 322a07575a..c64523ceb3 100644
--- a/indra/newview/skins/default/xui/pt/floater_buy_contents.xml
+++ b/indra/newview/skins/default/xui/pt/floater_buy_contents.xml
@@ -7,8 +7,8 @@
Comprar por L$[AMOUNT] de(a) [NAME]?
</text>
<button label="Cancelar" label_selected="Cancelar" name="cancel_btn" width="73"/>
- <button label="Comprar" label_selected="Comprar" name="buy_btn" width="73" left_delta="-77"/>
- <check_box label="Vestir roupa agora" name="wear_check" left_delta="-130"/>
+ <button label="Comprar" label_selected="Comprar" left_delta="-77" name="buy_btn" width="73"/>
+ <check_box label="Vestir roupa agora" left_delta="-130" name="wear_check"/>
<string name="no_copy_text">
(sem copiar)
</string>
diff --git a/indra/newview/skins/default/xui/pt/floater_buy_currency.xml b/indra/newview/skins/default/xui/pt/floater_buy_currency.xml
index f17c069ecf..a737212b50 100644
--- a/indra/newview/skins/default/xui/pt/floater_buy_currency.xml
+++ b/indra/newview/skins/default/xui/pt/floater_buy_currency.xml
@@ -1,71 +1,66 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="buy currency" title="COMPRAR DINHEIRO">
- <text name="info_buying">
- Comprando Dinheiro:
- </text>
- <text name="info_cannot_buy">
- Não pode comprar agora:
- </text>
+<floater name="buy currency" title="Comprar L$">
+ <floater.string name="buy_currency">
+ Compre L$ [LINDENS] por aprox. [LOCALAMOUNT]
+ </floater.string>
<text name="info_need_more">
- Você precisa de mais dinheiro:
+ Você precisa de mais L$
</text>
- <text name="error_message">
- Algo não está certo.
- </text>
- <button label="Ir para o website" name="error_web"/>
<text name="contacting">
Contatando LindeX...
</text>
- <text name="buy_action_unknown">
- Comprar L$ no câmbio atual da LindeX
- </text>
- <text name="buy_action">
- [NAME] L$ [PRICE]
- </text>
- <text name="currency_action" width="60">
+ <text name="info_buying">
Comprar L$
</text>
- <line_editor name="currency_amt" left_delta="65" width="70">
- 1234
- </line_editor>
- <text name="currency_est" left_delta="72">
- por aproxim. [LOCALAMOUNT]
- </text>
- <text name="getting_data">
- Obtendo dados...
- </text>
<text name="balance_label">
- Você tem atualmente
+ Tenho
</text>
<text name="balance_amount">
L$ [AMT]
</text>
+ <text name="currency_action" width="60">
+ Comprar
+ </text>
+ <text name="currency_label">
+ L$
+ </text>
+ <line_editor label="L$" left_delta="65" name="currency_amt" width="70">
+ 1234
+ </line_editor>
<text name="buying_label">
- Você está comprando
+ O preço é
</text>
- <text name="buying_amount">
- L$ [AMT]
+ <text left_delta="72" name="currency_est">
+ aprox. [LOCALAMOUNT]
+ </text>
+ <text name="getting_data">
+ Calculando...
+ </text>
+ <text name="buy_action">
+ [ACTION]
</text>
<text name="total_label">
- Seu saldo será
+ Saldo resultante:
</text>
<text name="total_amount">
L$ [AMT]
</text>
<text name="currency_links">
- [http://www.secondlife.com/my/account/payment_method_management.php?lang=pt-BR payment method] | [http://www.secondlife.com/my/account/currency.php?lang=pt-BR currency] | [http://www.secondlife.com/my/account/exchange_rates.php?lang=pt-BR exchange rate]
+ [http://www.secondlife.com/my/account/payment_method_management.php payment method] | [http://www.secondlife.com/my/account/currency.php currency] | [http://www.secondlife.com/my/account/exchange_rates.php exchange rate]
+ </text>
+ <text name="exchange_rate_note">
+ Digite o valor novamente para ver o câmbio atual.
</text>
<text name="purchase_warning_repurchase">
- Confirmando esta compra só compra a moeda.
-Você precisará tentar novamente a operação.
+ Confirmar esta transação compra somente L$, não o objeto.
</text>
<text name="purchase_warning_notenough">
- Você não está comprando moeda suficiente.
-Aumente a quantidade de compra.
+ O valor da transação não é suficiente. Aumente o volume da compra.
</text>
+ <button label="Comprar já!" name="buy_btn"/>
<button label="Fechar" name="cancel_btn"/>
- <button label="Adquirir" name="buy_btn"/>
- <string name="buy_currency">
- Comprar L$ [LINDENS] por aproxim. [LOCALAMOUNT]
- </string>
+ <text name="info_cannot_buy">
+ Transação incompleta
+ </text>
+ <button label="Prosseguir para a web" name="error_web"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_buy_currency_html.xml b/indra/newview/skins/default/xui/pt/floater_buy_currency_html.xml
new file mode 100644
index 0000000000..24e41ac8c8
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_buy_currency_html.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_buy_currency_html" title="COMPRAR MOEDA"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_buy_land.xml b/indra/newview/skins/default/xui/pt/floater_buy_land.xml
index 6e502ad6e5..5c5ee3b7a0 100644
--- a/indra/newview/skins/default/xui/pt/floater_buy_land.xml
+++ b/indra/newview/skins/default/xui/pt/floater_buy_land.xml
@@ -1,27 +1,151 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="buy land" title="COMPRAR TERRA">
+<floater name="buy land" title="COMPRAR TERRENO">
+ <floater.string name="can_resell">
+ Pode ser revendida.
+ </floater.string>
+ <floater.string name="can_not_resell">
+ Não pode ser revendida.
+ </floater.string>
+ <floater.string name="can_change">
+ Pode ser unida ou subdivida.
+ </floater.string>
+ <floater.string name="can_not_change">
+ Não pode ser unida ou subdividida.
+ </floater.string>
+ <floater.string name="cant_buy_for_group">
+ Você não tem permissão para comprar terra para seu grupo ativo.
+ </floater.string>
+ <floater.string name="no_land_selected">
+ Nenhuma terra selecionada.
+ </floater.string>
+ <floater.string name="multiple_parcels_selected">
+ Múltiplos e diferentes lotes selecionados. Tente selecionar uma área menor.
+ </floater.string>
+ <floater.string name="no_permission">
+ Você não tem permissão para comprar uma terra para seu grupo ativo.
+ </floater.string>
+ <floater.string name="parcel_not_for_sale">
+ O lote selecionado não está a venda.
+ </floater.string>
+ <floater.string name="group_already_owns">
+ O grupo já possui o lote.
+ </floater.string>
+ <floater.string name="you_already_own">
+ Você já possui o lote.
+ </floater.string>
+ <floater.string name="set_to_sell_to_other">
+ O lote selecionado está configurado para ser vendido para outro grupo.
+ </floater.string>
+ <floater.string name="no_public_land">
+ A área selecionada não tem terras públicas.
+ </floater.string>
+ <floater.string name="not_owned_by_you">
+ Terrenos de outros residentes foram selecionados.
+Tente selecionar uma área menor.
+ </floater.string>
+ <floater.string name="processing">
+ Processando sua compra...
+
+(Isso pode levar um minuto.)
+ </floater.string>
+ <floater.string name="fetching_error">
+ Houve um erro ao buscar informações sobre compra de terras.
+ </floater.string>
+ <floater.string name="buying_will">
+ Comprar esta terra irá:
+ </floater.string>
+ <floater.string name="buying_for_group">
+ Ao comprar terra para o grupo:
+ </floater.string>
+ <floater.string name="cannot_buy_now">
+ Não foi possível comprar agora:
+ </floater.string>
+ <floater.string name="not_for_sale">
+ Não disponível para venda:
+ </floater.string>
+ <floater.string name="none_needed">
+ nada necessário
+ </floater.string>
+ <floater.string name="must_upgrade">
+ Sua conta deve ser evoluída para adquirir um lote.
+ </floater.string>
+ <floater.string name="cant_own_land">
+ Sua conta pode possuir uma terra.
+ </floater.string>
+ <floater.string name="land_holdings">
+ Você tem [BUYER] m².
+ </floater.string>
+ <floater.string name="pay_to_for_land">
+ Pagar L$ [AMOUNT] para [SELLER] por esta terra
+ </floater.string>
+ <floater.string name="buy_for_US">
+ Compre L$ [AMOUNT] por cerca de [LOCAL_AMOUNT],
+ </floater.string>
+ <floater.string name="parcel_meters">
+ Este lote tem [AMOUNT] m²
+ </floater.string>
+ <floater.string name="premium_land">
+ Esse é um terreno premium e custa o equivalente a [AMOUNT] m².
+ </floater.string>
+ <floater.string name="discounted_land">
+ Esse é um terreno com desconto, e custa o equivalente a [AMOUNT] m².
+ </floater.string>
+ <floater.string name="meters_supports_object">
+ [AMOUNT] m²
+suporta [AMOUNT2] objetos
+ </floater.string>
+ <floater.string name="sold_with_objects">
+ vendido com objetos
+ </floater.string>
+ <floater.string name="sold_without_objects">
+ objetos não incluídos
+ </floater.string>
+ <floater.string name="info_price_string">
+ L$ [PRICE]
+(L$ [PRICE_PER_SQM]/m²)
+[SOLD_WITH_OBJECTS]
+ </floater.string>
+ <floater.string name="insufficient_land_credits">
+ O grupo [GROUP] precisará de fundos suficientes de terras
+contribuídas para cobrir este lote antes da aquisição se completar.
+ </floater.string>
+ <floater.string name="have_enough_lindens">
+ Você tem L$ [AMOUNT], suficiente para comprar este lote.
+ </floater.string>
+ <floater.string name="not_enough_lindens">
+ Você tem somente L$ [AMOUNT], e precisa de mais L$ [AMOUNT2].
+ </floater.string>
+ <floater.string name="balance_left">
+ Após a compra, restará L$ [AMOUNT].
+ </floater.string>
+ <floater.string name="balance_needed">
+ Você precisa comprar pelo menos L$ [AMOUNT] para ter recursos para este lote.
+ </floater.string>
+ <floater.string name="no_parcel_selected">
+ (nenhum lote selecionado)
+ </floater.string>
<text name="region_name_label">
Região:
</text>
- <text name="region_name_text" left="560">
+ <text left="560" name="region_name_text">
(desconhecido)
</text>
<text name="region_type_label">
Tipo:
</text>
- <text name="region_type_text" left="560">
+ <text left="560" name="region_type_text">
(desconhecido)
</text>
<text name="estate_name_label">
Propriedade:
</text>
- <text name="estate_name_text" left="560">
+ <text left="560" name="estate_name_text">
(desconhecido)
</text>
- <text name="estate_owner_label" width="105" right="565">
+ <text name="estate_owner_label" right="565" width="105">
Dono da propriedade:
</text>
- <text name="estate_owner_text" left="560" >
+ <text left="560" name="estate_owner_text">
(desconhecido)
</text>
<text name="resellable_changeable_label">
@@ -40,7 +164,7 @@
<text_editor name="covenant_editor">
Carregando...
</text_editor>
- <check_box label="Eu concordo com as definições do &#10;Corretor feitas acima." name="agree_covenant"/>
+ <check_box label="Eu concordo com as definições do Corretor feitas acima." name="agree_covenant"/>
<text name="info_parcel_label">
Lote:
</text>
@@ -58,8 +182,7 @@
</text>
<text name="info_price">
L$ 1500
-(L$ 1.1/m²)
-vendido com os objetos
+(L$ 1,1/m²) inclui objetos
</text>
<text name="info_action">
Comprar este lote irá:
@@ -67,7 +190,7 @@ vendido com os objetos
<text name="error_message">
Algo ainda não está correto.
</text>
- <button label="Ir para a página da web" name="error_web" width="150" />
+ <button label="Ir para a página da web" name="error_web" width="150"/>
<text name="account_action">
Evoluir sua conta para membro Premium
</text>
@@ -75,16 +198,16 @@ vendido com os objetos
Somente membros Premium podem possuir terra.
</text>
<combo_box name="account_level">
- <combo_box.item name="US$9.95/month,billedmonthly" label="US$9.95/mês, debitado mensalmente" />
- <combo_box.item name="US$7.50/month,billedquarterly" label="US$7.50/mês, debitado trimestralmente" />
- <combo_box.item name="US$6.00/month,billedannually" label="US$6.00/mês, debitado anualmente" />
+ <combo_box.item label="US$9.95/mês, pagamento mensal" name="US$9.95/month,billedmonthly"/>
+ <combo_box.item label="US$7,50/mês, pagamento trimestral" name="US$7.50/month,billedquarterly"/>
+ <combo_box.item label="US$6.00/mês, pagamento trimestral" name="US$6.00/month,billedannually"/>
</combo_box>
<text name="land_use_action">
Aumente sua taxa de locação de terra para US$ 40/mês.
</text>
<text name="land_use_reason">
- Você possui 1309 m² de terra.
-Este lote tem 512 m² de terra.
+ Você tem 1309 m².
+Este lote mede 512 m².
</text>
<text name="purchase_action">
Pagar ao Residente Joe L$4000 pela terra
@@ -95,142 +218,16 @@ Este lote tem 512 m² de terra.
<text name="currency_action" width="116">
Compre L$ adicionais
</text>
- <line_editor name="currency_amt" left="190" width="65">
+ <line_editor left="190" name="currency_amt" width="65">
1000
</line_editor>
<text name="currency_est">
- por aproxim. US$ [AMOUNT2]
+ cerca de [LOCAL_AMOUNT]
</text>
<text name="currency_balance">
Você tem L$2,100.
</text>
- <check_box label="Remover [AMOUNT] m² de contribuição do grupo." name="remove_contribution"/>
+ <check_box label="Subtrair [AMOUNT] m² da minha contribuição." name="remove_contribution"/>
<button label="Adquirir" name="buy_btn"/>
<button label="Cancelar" name="cancel_btn"/>
- <string name="can_resell">
- Pode ser revendida.
- </string>
- <string name="can_not_resell">
- Não pode ser revendida.
- </string>
- <string name="can_change">
- Pode ser unida ou subdivida.
- </string>
- <string name="can_not_change">
- Não pode ser unida ou subdividida.
- </string>
- <string name="cant_buy_for_group">
- Você não tem permissão para comprar terra para seu grupo ativo.
- </string>
- <string name="no_land_selected">
- Nenhuma terra selecionada.
- </string>
- <string name="multiple_parcels_selected">
- Múltiplos e diferentes lotes selecionados. Tente selecionar uma área menor.
- </string>
- <string name="no_permission">
- Você não tem permissão para comprar uma terra para seu grupo ativo.
- </string>
- <string name="parcel_not_for_sale">
- O lote selecionado não está a venda.
- </string>
- <string name="group_already_owns">
- O grupo já possui o lote.
- </string>
- <string name="you_already_own">
- Você já possui o lote.
- </string>
- <string name="set_to_sell_to_other">
- O lote selecionado está configurado para ser vendido para outro grupo.
- </string>
- <string name="no_public_land">
- A área selecionada não tem terras públicas.
- </string>
- <string name="not_owned_by_you">
- Está selecionada uma terra pertencente a outro usuário. Tente selecionar uma área menor.
- </string>
- <string name="processing">
- Processando sua compra...
-
-(Isso pode levar um minuto.)
- </string>
- <string name="fetching_error">
- Houve um erro ao buscar informações sobre compra de terras.
- </string>
- <string name="buying_will">
- Comprar esta terra irá:
- </string>
- <string name="buying_for_group">
- Ao comprar terra para o grupo:
- </string>
- <string name="cannot_buy_now">
- Não foi possível comprar agora:
- </string>
- <string name="not_for_sale">
- Não disponível para venda:
- </string>
- <string name="none_needed">
- nada necessário
- </string>
- <string name="must_upgrade">
- Sua conta deve ser evoluída para adquirir um lote.
- </string>
- <string name="cant_own_land">
- Sua conta pode possuir uma terra.
- </string>
- <string name="land_holdings">
- Você possui [BUYER] m² de terra.
- </string>
- <string name="pay_to_for_land">
- Pagar L$ [AMOUNT] para [SELLER] por esta terra
- </string>
- <string name="buy_for_US">
- Comprar L$ [AMOUNT] por aprox. US$ [AMOUNT2],
- </string>
- <string name="parcel_meters">
- Este lote tem [AMOUNT] m².
- </string>
- <string name="premium_land">
- Esta terra é premium e será taxada como [AMOUNT] m².
- </string>
- <string name="discounted_land">
- Esta terra tem desconto e será taxada como [AMOUNT] m².
- </string>
- <string name="meters_supports_object">
- [AMOUNT] m²
-aceita [AMOUNT2] objetos
- </string>
- <string name="sold_with_objects">
- vendido com objetos
- </string>
- <string name="sold_without_objects">
- objetos não incluídos
- </string>
- <string name="info_price_string">
- L$ [PRICE]
-(L$ [PRICE_PER_SQM]/m²)
-[SOLD_WITH_OBJECTS]
- </string>
- <string name="insufficient_land_credits">
- O grupo [GROUP] precisará de fundos suficientes de terras
-contribuídas para cobrir este lote antes da aquisição se completar.
- </string>
- <string name="have_enough_lindens">
- Você tem L$ [AMOUNT], suficiente para comprar este lote.
- </string>
- <string name="not_enough_lindens">
- Você tem somente L$ [AMOUNT], e precisa de mais L$ [AMOUNT2].
- </string>
- <string name="balance_left">
- Após a compra, restará L$ [AMOUNT].
- </string>
- <string name="balance_needed">
- Você precisa comprar pelo menos L$ [AMOUNT] para ter recursos para este lote.
- </string>
- <string name="no_parcel_selected">
- (nenhum lote selecionado)
- </string>
- <string name="buy_currency">
- Comprar L$ [LINDENS] por aproxim. US$ [USD]
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_buy_object.xml b/indra/newview/skins/default/xui/pt/floater_buy_object.xml
index e9968ed8f8..d71eb04cc4 100644
--- a/indra/newview/skins/default/xui/pt/floater_buy_object.xml
+++ b/indra/newview/skins/default/xui/pt/floater_buy_object.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="contents" title="COMPRAR CÓPIA DO OBJETO">
<text name="contents_text">
- e seus conteúdos:
+ Contém:
</text>
<text name="buy_text">
Comprar por L$[AMOUNT] de(a) [NAME]?
diff --git a/indra/newview/skins/default/xui/pt/floater_camera.xml b/indra/newview/skins/default/xui/pt/floater_camera.xml
index b61e261148..7343bd9aa8 100644
--- a/indra/newview/skins/default/xui/pt/floater_camera.xml
+++ b/indra/newview/skins/default/xui/pt/floater_camera.xml
@@ -9,8 +9,28 @@
<floater.string name="move_tooltip">
Mover a Câmera para Cima e para Baixo, para a Esquerda e para a Direita
</floater.string>
+ <floater.string name="camera_modes_title">
+ Modos de câmera
+ </floater.string>
+ <floater.string name="pan_mode_title">
+ Pan zoom orbital
+ </floater.string>
+ <floater.string name="presets_mode_title">
+ Ângulos predefinidos
+ </floater.string>
+ <floater.string name="free_mode_title">
+ Visualizar objeto
+ </floater.string>
<panel name="controls">
- <joystick_track name="cam_track_stick" tool_tip="Mover a Câmera para Cima e para Baixo, para a Esquerda e para a Direita"/>
- <joystick_zoom name="zoom" tool_tip="Aproximar a Câmera in direção ao Foco"/>
+ <panel name="zoom" tool_tip="Aproximar a Câmera in direção ao Foco">
+ <joystick_rotate name="cam_rotate_stick" tool_tip="Girar câmera ao redor do foco"/>
+ <slider_bar name="zoom_slider" tool_tip="Zoom de câmera para focalizar"/>
+ <joystick_track name="cam_track_stick" tool_tip="Move a câmera para cima e para baixo, direita e esquerda"/>
+ </panel>
+ </panel>
+ <panel name="buttons">
+ <button label="" name="presets_btn" tool_tip="Ângulos predefinidos"/>
+ <button label="" name="pan_btn" tool_tip="Pan zoom orbital"/>
+ <button label="" name="avatarview_btn" tool_tip="Modos de câmera"/>
</panel>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_choose_group.xml b/indra/newview/skins/default/xui/pt/floater_choose_group.xml
index ae395734e9..60f01a3733 100644
--- a/indra/newview/skins/default/xui/pt/floater_choose_group.xml
+++ b/indra/newview/skins/default/xui/pt/floater_choose_group.xml
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="groups" title="GRUPOS">
<text name="groupdesc">
Escolha um grupo:
</text>
- <button label="OK" label_selected="OK" name="OK" />
- <button label="Cancelar" label_selected="Cancelar" name="Cancel" />
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_color_picker.xml b/indra/newview/skins/default/xui/pt/floater_color_picker.xml
index 6a4263f4ff..4ea014335f 100644
--- a/indra/newview/skins/default/xui/pt/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/pt/floater_color_picker.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="ColorPicker" title="SELETOR DE COR">
+<floater name="ColorPicker" title="DESTAQUE DE COR">
<text name="r_val_text">
Vermelho:
</text>
@@ -18,15 +18,14 @@
<text name="l_val_text">
Lum:
</text>
- <check_box label="Aplicar imediatamente" name="apply_immediate"/>
- <button left_delta="150" name="color_pipette" />
- <button left_delta="55" label="Cancelar" label_selected="Cancelar" name="cancel_btn"/>
- <button label="Selecionar" label_selected="Selecionar" name="select_btn"/>
+ <check_box label="inscrever-se agora" name="apply_immediate"/>
+ <button left_delta="150" name="color_pipette"/>
+ <button label="Cancelar" label_selected="Cancelar" left_delta="55" name="cancel_btn"/>
+ <button label="OK" label_selected="OK" name="select_btn"/>
<text name="Current color:">
Cor atual:
</text>
<text name="(Drag below to save.)">
- (Arraste abaixo
- para salvar)
+ (Arrastar abaixo para salvar)
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_customize.xml b/indra/newview/skins/default/xui/pt/floater_customize.xml
index 55946933e7..a9ec0b9b1f 100644
--- a/indra/newview/skins/default/xui/pt/floater_customize.xml
+++ b/indra/newview/skins/default/xui/pt/floater_customize.xml
@@ -1,7 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater customize" title="APARÊNCIA" width="546">
- <tab_container name="customize tab container" tab_min_width="115" width="544">
- <placeholder label="Partes de corpo" name="body_parts_placeholder"/>
+<floater name="floater customize" title="APARÊNCIA">
+ <tab_container name="customize tab container" tab_min_width="115">
+ <text label="Corpo" name="body_parts_placeholder">
+ Partes do corpo
+ </text>
<panel label="Forma" name="Shape">
<button label="Reverter" label_selected="Reverter" name="Revert"/>
<button label="Corpo" label_selected="Corpo" name="Body"/>
@@ -14,8 +16,8 @@
<button label="Tórax" label_selected="Tórax" name="Torso"/>
<button label="Pernas" label_selected="Pernas" name="Legs"/>
<radio_group name="sex radio">
- <radio_item name="radio" label="Feminino" />
- <radio_item name="radio2" label="Masculino" />
+ <radio_item label="Feminino" name="radio" value="0"/>
+ <radio_item label="Masculino" name="radio2" value="1"/>
</radio_group>
<text name="title">
[DESC]
@@ -33,8 +35,7 @@
Localizado em [PATH]
</text>
<text name="not worn instructions">
- Coloque uma nova forma arrastando uma do seu inventário para seu avatar.
-Alternativamente, você pode criar uma nova de um esboço e usá-la.
+ Para obter um físico novo, arraste um do inventário para o seu avatar. Ou crie um novo.
</text>
<text name="no modify instructions">
Você não tem permissão para modificar esta vestimenta.
@@ -42,15 +43,15 @@ Alternativamente, você pode criar uma nova de um esboço e usá-la.
<text name="Item Action Label">
Forma:
</text>
- <button label="Criar Nova Forma" label_selected="Criar Nova Forma" name="Create New"/>
+ <button label="Nova" label_selected="Nova" name="Create New"/>
<button label="Salvar" label_selected="Salvar" name="Save"/>
<button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
</panel>
<panel label="Pele" name="Skin">
- <button width="115" label="Cor de Pele" label_selected="Cor de Pele" name="Skin Color"/>
- <button width="115" label="Detalhes Faciais" label_selected="Detalhes Faciais" name="Face Detail"/>
- <button width="115" label="Maquiagem" label_selected="Maquiagem" name="Makeup"/>
- <button width="115" label="Detalhes do Corpo" label_selected="Detalhes do Corpo" name="Body Detail"/>
+ <button label="Cor de pele" label_selected="Cor de pele" name="Skin Color" width="115"/>
+ <button label="Detalhes faciais" label_selected="Detalhes faciais" name="Face Detail" width="115"/>
+ <button label="Maquilagem" label_selected="Maquilagem" name="Makeup" width="115"/>
+ <button label="Detalhes do corpo" label_selected="Detalhes do corpo" name="Body Detail" width="115"/>
<text name="title">
[DESC]
</text>
@@ -67,9 +68,7 @@ Alternativamente, você pode criar uma nova de um esboço e usá-la.
Localizada em [PATH]
</text>
<text name="not worn instructions">
- Coloque uma nova pele arrastando uma de seu inventário para seu avatar.
-Alternativamente, você pode criar uma nova forma a partir de um esboço
-e usá-la.
+ Para obter uma pele nova, arraste uma do inventário para o seu avatar. Ou crie uma pele nova.
</text>
<text name="no modify instructions">
Você não tem permissão para modificar esta vestimenta.
@@ -77,19 +76,19 @@ e usá-la.
<text name="Item Action Label">
Pele:
</text>
- <texture_picker width="86" label="Tattoo: cabeça" name="Head Tattoos" tool_tip="Clique para escolher um desenho"/>
- <texture_picker width="86" label="Tattoo: superior" name="Upper Tattoos" tool_tip="Clique para escolher um desenho"/>
- <texture_picker width="86" label="Tattoo: inferior" name="Lower Tattoos" tool_tip="Clique para escolher um desenho"/>
- <button label="Criar Nova Pele" label_selected="Criar Nova Pele" name="Create New"/>
+ <texture_picker label="Tattoo: cabeça" name="Head Tattoos" tool_tip="Clique para escolher um desenho" width="86"/>
+ <texture_picker label="Tattoo: superior" name="Upper Tattoos" tool_tip="Clique para escolher um desenho" width="86"/>
+ <texture_picker label="Tattoo: inferior" name="Lower Tattoos" tool_tip="Clique para escolher um desenho" width="86"/>
+ <button label="Novo" label_selected="Novo" name="Create New"/>
<button label="Salvar" label_selected="Salvar" name="Save"/>
<button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
<button label="Reverter" label_selected="Reverter" name="Revert"/>
</panel>
<panel label="Cabelo" name="Hair">
- <button width="115" label="Cor" label_selected="Cor" name="Color"/>
- <button width="115" label="Estilo" label_selected="Estilo" name="Style"/>
- <button width="115" label="Sombrancelhas" label_selected="Sombrancelhas" name="Eyebrows"/>
- <button width="115" label="Rosto" label_selected="Rosto" name="Facial"/>
+ <button label="Cor" label_selected="Cor" name="Color" width="115"/>
+ <button label="Estilo" label_selected="Estilo" name="Style" width="115"/>
+ <button label="Sombrancelhas" label_selected="Sombrancelhas" name="Eyebrows" width="115"/>
+ <button label="Rosto" label_selected="Rosto" name="Facial" width="115"/>
<text name="title">
[DESC]
</text>
@@ -106,9 +105,7 @@ e usá-la.
Localizado em [PATH]
</text>
<text name="not worn instructions">
- Ponha um novo cabelo em seu avatar arrastando um do seu inventário.
-Alternativamente, você pode criar um novo modelo a partir de um esboço
-e usá-lo.
+ Para obter um cabelo novo, arraste um tipo de cabelo do inventário para o seu avatar. Ou crie um cabelo novo.
</text>
<text name="no modify instructions">
Você não ter permissão para modificar essa vestimenta.
@@ -117,7 +114,7 @@ e usá-lo.
Cabelo:
</text>
<texture_picker label="Texture" name="Texture" tool_tip="Clique para escolher uma imagem"/>
- <button label="Criar Novo Cabelo" label_selected="Criar Novo Cabelo" name="Create New"/>
+ <button label="Criar novo cabelo" label_selected="Criar novo cabelo" name="Create New"/>
<button label="Salvar" label_selected="Salvar" name="Save"/>
<button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
<button label="Reverter" label_selected="Reverter" name="Revert"/>
@@ -139,8 +136,7 @@ e usá-lo.
Localizado em [PATH]
</text>
<text name="not worn instructions">
- Para colocar novos olhos, arraste um do seu inventário para seu avatar.
-Alternativamente, você pode criar um novo modelo de um esboço e usá-lo.
+ Para obter novos olhos, arraste um tipo de olhos do inventário para o seu avatar. Ou crie olhos novos.
</text>
<text name="no modify instructions">
Você não tem permissão para alterar esta vestimenta.
@@ -149,17 +145,19 @@ Alternativamente, você pode criar um novo modelo de um esboço e usá-lo.
Olhos:
</text>
<texture_picker label="Ãris" name="Iris" tool_tip="Clique para escolher uma imagem"/>
- <button label="Criar Novos Olhos" label_selected="Criar Novos Olhos" name="Create New"/>
+ <button label="Criar novos olhos" label_selected="Criar novos olhos" name="Create New"/>
<button label="Salvar" label_selected="Salvar" name="Save"/>
<button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
<button label="Reverter" label_selected="Reverter" name="Revert"/>
</panel>
- <panel label="Roupas" name="clothes_placeholder"/>
+ <text label="Roupas" name="clothes_placeholder">
+ Roupa
+ </text>
<panel label="Camisa" name="Shirt">
<texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Clique para pegar o conta-gotas"/>
- <button label="Criar Nova Camisa" label_selected="Criar Nova Camisa" name="Create New"/>
+ <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
<button label="Remover" label_selected="Remover" name="Take Off"/>
+ <button label="Criar nova camisa" label_selected="Criar nova camisa" name="Create New"/>
<button label="Salvar" label_selected="Salvar" name="Save"/>
<button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
<button label="Reverter" label_selected="Reverter" name="Revert"/>
@@ -179,9 +177,7 @@ Alternativamente, você pode criar um novo modelo de um esboço e usá-lo.
Localizado em [PATH]
</text>
<text name="not worn instructions">
- Para por uma nova camisa em seu avatar, arraste uma do seu inventário para
-seu avatar. Alternativamente, você pode criar um novo modelo a partir de
-um esboço e usá-lo.
+ Para obter uma camisa nova, arraste uma do inventário para o seu avatar. Ou crie uma camisa nova.
</text>
<text name="no modify instructions">
Você não ter permissão para modificar esta vestimenta.
@@ -192,9 +188,9 @@ um esboço e usá-lo.
</panel>
<panel label="Calças" name="Pants">
<texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Clique para abrir o conta-gotas."/>
- <button label="Criar Novas Calças" label_selected="Criar Novas Calças" name="Create New"/>
+ <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
<button label="Remover" label_selected="Remover" name="Take Off"/>
+ <button label="Criar novas calças" label_selected="Criar novas calças" name="Create New"/>
<button label="Salvar" label_selected="Salvar" name="Save"/>
<button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
<button label="Reverter" label_selected="Reverter" name="Revert"/>
@@ -214,9 +210,7 @@ um esboço e usá-lo.
Localizado em [PATH]
</text>
<text name="not worn instructions">
- Para por uma nova calça em seu avatar, basta arrastar uma outra do seu
-inventário. Alternativamente, você pode criar um novo modelo a partir
-de um esboço e usá-lo.
+ Para obter calças novas, arraste uma do inventário para o seu avatar. Ou crie calças novas.
</text>
<text name="no modify instructions">
Você não tem permissão para modificar esta vestimenta.
@@ -242,10 +236,9 @@ de um esboço e usá-lo.
Localizado em [PATH]
</text>
<text name="not worn instructions">
- Para por novos sapatos em seu avatar, basta arrastar um novo do seu
-inventário. Alternativamente, você pode criar um novo modelo a partir
-de um esboço e usá-lo.
+ Para obter novos olhos, arraste um tipo de olhos do inventário para o seu avatar. Ou crie olhos novos.
</text>
+ <button label="Criar novos sapatos" label_selected="Criar novos sapatos" name="Create New" width="166"/>
<text name="no modify instructions">
Você não tem permissão para modificar esta vestimenta.
</text>
@@ -253,8 +246,7 @@ de um esboço e usá-lo.
Sapatos:
</text>
<texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Clique para pegar o conta-gotas"/>
- <button label="Criar Novos Sapatos" label_selected="Criar Novos Sapatos" name="Create New" width="166"/>
+ <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
<button label="Remover" label_selected="Remover" name="Take Off"/>
<button label="Salvar" label_selected="Salvar" name="Save"/>
<button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
@@ -277,10 +269,9 @@ de um esboço e usá-lo.
Localizado em [PATH]
</text>
<text name="not worn instructions">
- Para por novas meias em seu avatar, basta arrastar uma nova do seu
-inventário. Alternativamente, você pode criar novas meias a partir de
-um esboço e usá-las.
+ Para obter meias novas, arraste um par do inventário para o seu avatar. Ou crie meias novas.
</text>
+ <button label="Criar novas meias" label_selected="Criar novas meias" name="Create New"/>
<text name="no modify instructions">
Você não tem permissão para modificar essa vestimenta.
</text>
@@ -288,8 +279,7 @@ um esboço e usá-las.
Meias:
</text>
<texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Clique para pegar o conta-gotas"/>
- <button label="Criar Novas Meias" label_selected="Criar Novas Meias" name="Create New"/>
+ <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
<button label="Remover" label_selected="Remover" name="Take Off"/>
<button label="Salvar" label_selected="Salvar" name="Save"/>
<button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
@@ -312,20 +302,18 @@ um esboço e usá-las.
Localizado em [PATH]
</text>
<text name="not worn instructions">
- Para por uma nova jaqueta em seu avatar, basta arrastar um novo modelo
-do seu inventário. Alternativamente, você pode criar um novo modelo a
-partir de um esboço e usá-lo.
+ Para por uma jaqueta nova, arraste uma do inventário para o seu avatar. Ou crie uma jaqueta nova.
</text>
+ <button label="Criar nova jaqueta" label_selected="Criar nova jaqueta" name="Create New"/>
<text name="no modify instructions">
Você não tem permissão para modificar esta vestimenta.
</text>
<text name="Item Action Label">
Jaqueta:
</text>
- <texture_picker label="Tecido Superior" name="Upper Fabric" tool_tip="Clique para escolher uma imagem." width="84"/>
+ <texture_picker label="Tecido superior" name="Upper Fabric" tool_tip="Clique para escolher uma imagem." width="84"/>
<texture_picker label="Tecido Inferior" name="Lower Fabric" tool_tip="Clique para escolher uma imagem." width="84"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Clique para pegar o conta-gotas"/>
- <button label="Criar Nova Jaqueta" label_selected="Criar Nova Jaqueta" name="Create New"/>
+ <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
<button label="Remover" label_selected="Remover" name="Take Off"/>
<button label="Salvar" label_selected="Salvar" name="Save"/>
<button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
@@ -348,10 +336,9 @@ partir de um esboço e usá-lo.
Localizado em [PATH]
</text>
<text name="not worn instructions">
- Para colocar uma nova jaqueta em seu avatar, basta arrastar um novo modelo
-do seu inventário. Alternativamente, você pode criar uma novo modelo a
-partir de um esboço e usá-lo.
+ Para obter luvas novas, arraste um par do inventário para o seu avatar. Ou crie luvas novas.
</text>
+ <button label="Criar novas luvas" label_selected="Criar novas luvas" name="Create New"/>
<text name="no modify instructions">
Você não tem permissão para modificar essa vestimenta.
</text>
@@ -359,8 +346,7 @@ partir de um esboço e usá-lo.
Luvas:
</text>
<texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Clique para abrir o conta-gotas"/>
- <button label="Criar Novas Luvas" label_selected="Criar Novas Luvas" name="Create New"/>
+ <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
<button label="Remover" label_selected="Remover" name="Take Off"/>
<button label="Salvar" label_selected="Salvar" name="Save"/>
<button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
@@ -383,10 +369,9 @@ partir de um esboço e usá-lo.
Localizado em [PATH]
</text>
<text name="not worn instructions">
- Para por uma nova Camiseta em seu avatar, basta arrastar um novo modelo
-de seu inventário. Alternativamente, você pode criar um novo modelo a
-partir de um esboço e usá-lo.
+ Para obter uma camiseta nova, arraste uma do inventário para o seu avatar. Ou crie uma camiseta nova.
</text>
+ <button label="Criar nova camiseta" label_selected="Criar nova camiseta" name="Create New"/>
<text name="no modify instructions">
Você não ter permissão para modificar essa vestimenta.
</text>
@@ -394,8 +379,7 @@ partir de um esboço e usá-lo.
Camiseta:
</text>
<texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Clique para abrir o conta-gotas"/>
- <button label="Criar Nova Camiseta" label_selected="Criar Nova Camiseta" name="Create New"/>
+ <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
<button label="Remover" label_selected="Remover" name="Take Off"/>
<button label="Salvar" label_selected="Salvar" name="Save"/>
<button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
@@ -418,19 +402,17 @@ partir de um esboço e usá-lo.
Localizado em [PATH]
</text>
<text name="not worn instructions">
- Para por novas roupas de baixo em seu avatar, basta arrastar um novo
-modelo do seu inventário. Alternativamente, você pode criar um novo
-modelo a partir de um esboço e usá-lo.
+ Para obter roupa de baixo nova, arraste um modelo do inventário para o seu avatar. Ou crie uma roupa de baixo nova.
</text>
+ <button label="Criar novas" label_selected="Criar novas" name="Create New" width="180"/>
<text name="no modify instructions">
Você não tem permissão para modificar essa vestimenta.
</text>
<text name="Item Action Label">
- Roupas de Baixo:
+ Roupas de baixo:
</text>
<texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Clique para pegar o conta-gotas"/>
- <button label="Criar Novas Roupas de Baixo" label_selected="Criar Novas Roupas de Baixo" name="Create New" width="180"/>
+ <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
<button label="Remover" label_selected="Remover" name="Take Off"/>
<button label="Salvar" label_selected="Salvar" name="Save"/>
<button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
@@ -453,10 +435,9 @@ modelo a partir de um esboço e usá-lo.
Localizado em [PATH]
</text>
<text name="not worn instructions">
- Para por uma nova saia em seu avatar, basta arrastar um novo modelo
-do seu inventário. Alternativamente, você pode criar um novo modelo a
-partir de um esboço e usá-lo.
+ Para obter um saia nova, arraste uma saia do inventário para o seu avatar. Ou crie uma saia nova.
</text>
+ <button label="Criar nova saia" label_selected="Criar nova saia" name="Create New"/>
<text name="no modify instructions">
Você não tem permissão para modificar esta vestimenta.
</text>
@@ -464,16 +445,86 @@ partir de um esboço e usá-lo.
Saia:
</text>
<texture_picker label="Tecido" name="Fabric" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Click to open Color Picker"/>
- <button label="Criar Nova Saia" label_selected="Criar Nova Saia" name="Create New"/>
+ <color_swatch label="Cor/Tint" name="Color/Tint" tool_tip="Selecionar a cor"/>
<button label="Remover" label_selected="Remover" name="Take Off"/>
<button label="Salvar" label_selected="Salvar" name="Save"/>
<button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
<button label="Reverter" label_selected="Reverter" name="Revert"/>
</panel>
+ <panel label="Tatuagem" name="Tattoo">
+ <text name="title">
+ [DESC]:
+ </text>
+ <text name="title_no_modify">
+ [DESC]: não pode ser modificado
+ </text>
+ <text name="title_loading">
+ [DESC]: Carregando...
+ </text>
+ <text name="title_not_worn">
+ [DESC]: não vestido
+ </text>
+ <text name="path">
+ Localização: [PATH]
+ </text>
+ <text name="not worn instructions">
+ Para por uma tatuagem nova, arraste uma tatuagem do inventário para o seu avatar. Ou crie uma tatuagem nova.
+ </text>
+ <button label="Criar tatuagem" label_selected="Criar tatuagem" name="Create New"/>
+ <text name="no modify instructions">
+ Você não está autorizado a modificar este acessório.
+ </text>
+ <text name="Item Action Label">
+ Tatuagem:
+ </text>
+ <texture_picker label="Tatuagem na cabeça" name="Head Tattoo" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Tatuagem parte de cima" name="Upper Tattoo" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Tatuagem de baixo" name="Lower Tattoo" tool_tip="Selecionar imagem"/>
+ <button label="Tirar" label_selected="Tirar" name="Take Off"/>
+ <button label="Salvar" label_selected="Salvar" name="Save"/>
+ <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
+ <button label="Reverter" label_selected="Reverter" name="Revert"/>
+ </panel>
+ <panel label="Alpha" name="Alpha">
+ <text name="title">
+ [DESC]:
+ </text>
+ <text name="title_no_modify">
+ [DESC]: não pode ser modificado
+ </text>
+ <text name="title_loading">
+ [DESC]: Carregando...
+ </text>
+ <text name="title_not_worn">
+ [DESC]: não vestido
+ </text>
+ <text name="path">
+ Localização: [PATH]
+ </text>
+ <text name="not worn instructions">
+ Para por uma máscara alpha nova, arraste a máscara do inventário para o seu avatar. Ou crie uma máscara nova.
+ </text>
+ <button label="Criar Alpha novo" label_selected="Criar Alpha novo" name="Create New"/>
+ <text name="no modify instructions">
+ Você não está autorizado a modificar este acessório.
+ </text>
+ <text name="Item Action Label">
+ Alpha:
+ </text>
+ <texture_picker label="Alpha inferior" name="Lower Alpha" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Alpha de cima" name="Upper Alpha" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Cabeça Alpha" name="Head Alpha" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Olhos Alpha" name="Eye Alpha" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Cabelo alpha" name="Hair Alpha" tool_tip="Selecionar imagem"/>
+ <button label="Tirar" label_selected="Tirar" name="Take Off"/>
+ <button label="Salvar" label_selected="Salvar" name="Save"/>
+ <button label="Salvar como..." label_selected="Salvar como..." name="Save As"/>
+ <button label="Reverter" label_selected="Reverter" name="Revert"/>
+ </panel>
</tab_container>
<scroll_container left="249" name="panel_container"/>
+ <button label="Dados do script" label_selected="Dados do script" name="script_info" tool_tip="Mostrar scripts anexados ao seu avatar"/>
+ <button label="Criar look" label_selected="Criar look" name="make_outfit_btn"/>
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
<button label="OK" label_selected="OK" name="Ok"/>
- <button label="Criar Vestimenta..." label_selected="Criar Vestimenta..." name="Make Outfit" left="117" width="125" />
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml
index 42f34a3d82..306487939e 100644
--- a/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml
+++ b/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml
@@ -30,9 +30,9 @@
<text name="WL12am2">
24:00
</text>
- <button font="SansSerifSmall" width="96" left="546" label="Adicionar chave" label_selected="Adicionar chave" name="WLAddKey"/>
- <button font="SansSerifSmall" width="96" left="546" label="Apagar chave" label_selected="Apagar chave" name="WLDeleteKey"/>
- <text name="WLCurKeyFrameText" width="190" left="17">
+ <button label="Adicionar chave" label_selected="Adicionar chave" name="WLAddKey"/>
+ <button label="Apagar chave" label_selected="Apagar chave" name="WLDeleteKey"/>
+ <text name="WLCurKeyFrameText">
Configurações de Quadro-chave:
</text>
<text name="WLCurKeyTimeText">
@@ -47,7 +47,7 @@
<text name="DayCycleText">
Grudar:
</text>
- <combo_box label="5 minutos" name="WLSnapOptions" width="85"/>
+ <combo_box label="5 minutos" name="WLSnapOptions"/>
<text name="DayCycleText2">
Duração do Ciclo:
</text>
@@ -55,11 +55,11 @@
<spinner label="Minuto" name="WLLengthOfDayMin"/>
<spinner label="Segundo" name="WLLengthOfDaySec"/>
<text name="DayCycleText3">
- Prévia:
+ Visualizar
</text>
<button label="Tocar" label_selected="Tocar" name="WLAnimSky"/>
<button label="Pare!" label_selected="Pare" name="WLStopAnimSky"/>
- <button width="175" font="SansSerifSmall" label="Usar o horário da Propriedade" label_selected="Ir para o horário da Propriedade" name="WLUseLindenTime"/>
+ <button label="Usar o horário da Propriedade" label_selected="Ir para o horário da Propriedade" name="WLUseLindenTime"/>
<button label="Salvar o Dia teste" label_selected="Salvar o Dia teste" name="WLSaveDayCycle"/>
<button label="Carregar o Dia teste" label_selected="Carregar o Dia teste" name="WLLoadDayCycle"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/floater_device_settings.xml b/indra/newview/skins/default/xui/pt/floater_device_settings.xml
index fa4da834b8..48a4a6ef6f 100644
--- a/indra/newview/skins/default/xui/pt/floater_device_settings.xml
+++ b/indra/newview/skins/default/xui/pt/floater_device_settings.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_device_settings" title="AJUSTES DO DISPOSITIVO DE CONVERSA POR VOZ"/>
+<floater name="floater_device_settings" title="CONFIGURAÇÃO DE DISPOSITIVO DE VOZ"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_env_settings.xml b/indra/newview/skins/default/xui/pt/floater_env_settings.xml
index 4a43801b48..3ca8d934c9 100644
--- a/indra/newview/skins/default/xui/pt/floater_env_settings.xml
+++ b/indra/newview/skins/default/xui/pt/floater_env_settings.xml
@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Environment Editor Floater" title="EDITOR DO AMBIENTE">
+ <floater.string name="timeStr">
+ [hour12,datetime,utc]:[min,datetime,utc] [ampm,datetime,utc]
+ </floater.string>
<text name="EnvTimeText">
Hora do Dia
</text>
@@ -13,13 +16,12 @@ Nuvens
<text name="EnvWaterColorText">
Cor da água
</text>
- <color_swatch label="" name="EnvWaterColor" tool_tip="Clique para abrir o Editor de cores"/>
+ <color_swatch label="" name="EnvWaterColor" tool_tip="Selecionar a cor"/>
<text name="EnvWaterFogText">
Névoa da
água
</text>
<button bottom="-144" label="Usar hora da propriedade" name="EnvUseEstateTimeButton" width="155"/>
- <button label="Céu Avançado" name="EnvAdvancedSkyButton" width="155" left="167"/>
- <button label="Ãgua Avançada" name="EnvAdvancedWaterButton" width="155" left="326"/>
- <button label="?" name="EnvSettingsHelpButton"/>
+ <button label="Céu Avançado" left="167" name="EnvAdvancedSkyButton" width="155"/>
+ <button label="Ãgua Avançada" left="326" name="EnvAdvancedWaterButton" width="155"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_event.xml b/indra/newview/skins/default/xui/pt/floater_event.xml
new file mode 100644
index 0000000000..1cd4dcbda4
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_event.xml
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="Evento" name="Event" title="DETALHES DO EVENTO">
+ <floater.string name="none">
+ nenhum
+ </floater.string>
+ <floater.string name="notify">
+ Avisar
+ </floater.string>
+ <floater.string name="dont_notify">
+ Não avisar
+ </floater.string>
+ <floater.string name="moderate">
+ Moderado
+ </floater.string>
+ <floater.string name="adult">
+ Adulto
+ </floater.string>
+ <floater.string name="general">
+ Público geral
+ </floater.string>
+ <floater.string name="unknown">
+ Desconhecido
+ </floater.string>
+ <layout_stack name="layout">
+ <layout_panel name="profile_stack">
+ <text name="event_name">
+ Evento sem nome... Terror! Terror Aterrorizante.
+ </text>
+ <text name="event_category">
+ (não categorizado)
+ </text>
+ <text name="event_runby_label">
+ Organização:
+ </text>
+ <text initial_value="(pesquisando)" name="event_runby"/>
+ <text name="event_date_label">
+ Data:
+ </text>
+ <text name="event_date">
+ 10/10/2010
+ </text>
+ <text name="event_duration_label">
+ Duração:
+ </text>
+ <text name="event_duration">
+ 1 hora
+ </text>
+ <text name="event_covercharge_label">
+ Cover:
+ </text>
+ <text name="event_cover">
+ Grátis
+ </text>
+ <text name="event_location_label">
+ Localização:
+ </text>
+ <text name="event_location" value="LoteExemplo, Nome extenso (145, 228, 26)"/>
+ <text name="rating_label" value="Classificação:"/>
+ <text name="rating_value" value="(Desconhecido)"/>
+ <expandable_text name="event_desc">
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
+ </expandable_text>
+ </layout_panel>
+ <layout_panel name="button_panel">
+ <button name="create_event_btn" tool_tip="Criar evento"/>
+ <button name="god_delete_event_btn" tool_tip="Excluir evento"/>
+ <button label="Avise-me" name="notify_btn"/>
+ <button label="Teletransportar" name="teleport_btn"/>
+ <button label="Mapa" name="map_btn"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_gesture.xml b/indra/newview/skins/default/xui/pt/floater_gesture.xml
index b0bc42685d..2e5b92aaf7 100644
--- a/indra/newview/skins/default/xui/pt/floater_gesture.xml
+++ b/indra/newview/skins/default/xui/pt/floater_gesture.xml
@@ -1,14 +1,25 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="gestures" title="GESTOS ATIVOS">
- <text name="help_label">
- Clicar duas vezes no gesto para executar animações e sons.
- </text>
+<floater label="Lugares" name="gestures" title="GESTOS">
+ <floater.string name="loading">
+ Carregando...
+ </floater.string>
+ <floater.string name="playing">
+ (Em execução)
+ </floater.string>
+ <floater.string name="copy_name">
+ Cópia de [COPY_NAME]
+ </floater.string>
<scroll_list name="gesture_list">
- <column label="Acionar" name="trigger"/>
- <column label="Chave" name="shortcut"/>
- <column label="Nome" name="name"/>
+ <scroll_list.columns label="Nome" name="name"/>
+ <scroll_list.columns label="Bate-papo" name="trigger"/>
+ <scroll_list.columns label="Chave" name="shortcut"/>
</scroll_list>
- <button label="Novo" name="new_gesture_btn"/>
+ <panel label="bottom_panel" name="bottom_panel">
+ <menu_button name="gear_btn" tool_tip="Mais opções"/>
+ <button name="new_gesture_btn" tool_tip="Criar novo gesto"/>
+ <button name="activate_btn" tool_tip="Ativar/Desativar gesto selecionado"/>
+ <button name="del_btn" tool_tip="Excluir este gesto"/>
+ </panel>
<button label="Editar" name="edit_btn"/>
<button label="Executar" name="play_btn"/>
<button label="Parar" name="stop_btn"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_god_tools.xml b/indra/newview/skins/default/xui/pt/floater_god_tools.xml
index 4b7b2eb34e..8003a35d16 100644
--- a/indra/newview/skins/default/xui/pt/floater_god_tools.xml
+++ b/indra/newview/skins/default/xui/pt/floater_god_tools.xml
@@ -2,20 +2,19 @@
<floater name="godtools floater" title="FERRAMENTAS DE DEUS">
<tab_container name="GodTools Tabs">
<panel label="Grade" name="grid">
- <button label="Desconectar todos os usuários" label_selected="Desconectar todos os usuários" name="Kick all users"/>
- <button label="Limpar os cachês de visibilidade do mapa da região." label_selected="Limpar os cachês de visibilidade do mapa da região." name="Flush This Region&apos;s Map Visibility Caches"/>
+ <button label="Limpar os caches de visibilidade do mapa da região." label_selected="Limpar os caches de visibilidade do mapa da região." name="Flush This Region&apos;s Map Visibility Caches"/>
</panel>
<panel label="Região" name="region">
- <text name="Sim Name:">
- Nome do Simulador:
+ <text name="Region Name:">
+ Nome da região:
</text>
<check_box label="Prelúdio" name="check prelude" tool_tip="Ajustar para tornar esta região um prelúdio."/>
<check_box label="Fixar Sol" name="check fixed sun" tool_tip="Fixa a posição do sol (como em Região/Estados) &gt; Terreno."/>
- <check_box label="Redefinir Home no teletransporte" name="check reset home" tool_tip="Quando um residente se teletransporta, redefine sua home para a posição de destino."/>
+ <check_box label="Redefinir Início no teletransporte" name="check reset home" tool_tip="Quando um residente sair, definir o destino com sua posição inicial."/>
<check_box label="Visível" name="check visible" tool_tip="Ajustar para fazer essa região visível para os não-deuses"/>
<check_box label="Dano" name="check damage" tool_tip="Ajustar para permitir dano nesta região"/>
<check_box label="Bloquear ratreamento do Tráfego" name="block dwell" tool_tip="Configure isto para fazer a região não computar o tráfego."/>
- <check_box label="Bloquear Terraform" name="block terraform" tool_tip="Ajustar para desabilitar as pessoas a terraplanarem seus terrenos"/>
+ <check_box label="Bloquear terraplenagens" name="block terraform" tool_tip="Ajustar para desabilitar as pessoas a terraplanarem seus terrenos"/>
<check_box label="Sandbox" name="is sandbox" tool_tip="Alterar se esta região for uma sandbox."/>
<button label="Nivelar o terreno" label_selected="Nivelar o Terreno" name="Bake Terrain" tool_tip="Salva o terreno atual como padrão."/>
<button label="Reverter Terreno" label_selected="Reverter Terreno" name="Revert Terrain" tool_tip="Substituir o terreno atual pelo padrão."/>
@@ -47,8 +46,8 @@
<button label="Autosalvar Agora" label_selected="Autosalvar Agora" name="Autosave now" tool_tip="Salvar estado compactado para o diretório de gravação automática."/>
</panel>
<panel label="Objetos" name="objects">
- <text name="Sim Name:">
- Sim Nome:
+ <text name="Region Name:">
+ Nome da região:
</text>
<text name="region name">
Welsh
@@ -64,26 +63,26 @@
<button label="Apagar objetos programados do alvo em outras terras" label_selected="Apagar objetos programados do alvo em outras terras" name="Delete Target&apos;s Scripted Objects On Others Land" tool_tip="Apagar todos os objetos programados possuídos pelo alvo nas terras fora do domínio do alvo. Objetos (sem cópia) irão retornar."/>
<button label="Apagar objetos programados do Alvo em qualquer terreno" label_selected="Apagar objetos programados do Alvo em qualquer terreno" name="Delete Target&apos;s Scripted Objects On *Any* Land" tool_tip="Apagar todos os objetos programados do alvo nesta região. Objetos (sem cópia) irão retornar."/>
<button label="Apagar *TODOS* os objetos do alvo" label_selected="Apagar *TODOS* os objetos do alvo" name="Delete *ALL* Of Target&apos;s Objects" tool_tip="Apagar todos os objetos possuídos pelo alvo nesta região. Objetos (sem cópia) objetos irão retornar."/>
- <button label="Pegar os maiores colidentes" label_selected="Pegar os maiores colidentes" name="Get Top Colliders" tool_tip="Pega a lista de objetos que estão experimentando as chamadas mais freqüentes."/>
- <button label="Pegar os scripts principais" label_selected="Pegar os scripts principais" name="Get Top Scripts" tool_tip="Pegar a lista de objetos programados com a maior duração em tempo de execução."/>
- <button label="Informações de Scripts" label_selected="Informações de Scripts" name="Scripts digest" tool_tip="Pega uma lista de todos os scripts e o número de ocorrências de cada um."/>
+ <button label="Principais colidentes" label_selected="Lista dos maiores colidentes" name="Get Top Colliders" tool_tip="Gera a lista de objetos que estão experimentando as chamadas mais frequentes."/>
+ <button label="Principais scripts" label_selected="Lista dos scripts principais" name="Get Top Scripts" tool_tip="Gera a lista de objetos programados com a maior duração em tempo de execução."/>
+ <button label="Dados dos scripts" label_selected="Dados dos scripts" name="Scripts digest" tool_tip="Gera uma lista de todos os scripts e o número de ocorrências de cada um."/>
</panel>
<panel label="Requisição" name="request">
<text name="Destination:">
Destino:
</text>
<combo_box name="destination">
- <combo_box.item name="item1" label="Seleção" />
- <combo_box.item name="item2" label="Região do Agente" />
+ <combo_box.item label="Seleção" name="item1"/>
+ <combo_box.item label="Região do Agente" name="item2"/>
</combo_box>
<text name="Request:">
Requisição:
</text>
<combo_box name="request">
- <combo_box.item name="item1" label="Passos de Colisão" />
- <combo_box.item name="item2" label="Contagem de scripts, padrão opcional" />
- <combo_box.item name="item3" label="Padrão de Objetos" />
- <combo_box.item name="item4" label="rez &lt;asset_id&gt;" />
+ <combo_box.item label="Passos de Colisão" name="item1"/>
+ <combo_box.item label="Contagem de scripts, padrão opcional" name="item2"/>
+ <combo_box.item label="Padrão de Objetos" name="item3"/>
+ <combo_box.item label="rez &lt;asset_id&gt;" name="item4"/>
</combo_box>
<text name="Parameter:">
Parametro:
diff --git a/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml b/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml
index 8921e6ea12..c666a941fe 100644
--- a/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml
+++ b/indra/newview/skins/default/xui/pt/floater_hardware_settings.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Hardware Settings Floater" title="AJUSTES DE HARDWARE">
+<floater name="Hardware Settings Floater" title="CONFIGURAÇÃO DO HARDWARE">
<text name="Filtering:">
Filtragem:
</text>
@@ -8,21 +8,21 @@
Suavização:
</text>
<combo_box label="Suavização" name="fsaa" width="94">
- <combo_box.item name="FSAADisabled" label="Desabilitado"/>
- <combo_box.item name="2x" label="2x"/>
- <combo_box.item name="4x" label="4x"/>
- <combo_box.item name="8x" label="8x"/>
- <combo_box.item name="16x" label="16x"/>
+ <combo_box.item label="Desativado" name="FSAADisabled"/>
+ <combo_box.item label="2x" name="2x"/>
+ <combo_box.item label="4x" name="4x"/>
+ <combo_box.item label="8x" name="8x"/>
+ <combo_box.item label="16x" name="16x"/>
</combo_box>
<spinner label="Gama:" name="gamma"/>
<text name="(brightness, lower is brighter)">
- (brilho, quanto menor, mais brilho, 0=usar padrão)
+ (0 = brilho padrão, menor = mais brilho)
</text>
<text name="Enable VBO:">
Habilitar VBO:
</text>
- <check_box label="Habilitar Objetos com Armazenamento de Vértices" name="vbo" tool_tip="Habilitando-o em máquinas novas, ele oferece um ganho de performance. Contudo, as máquinas antigas tem freqüentemente implementações pobres de VBOs e você pode ter travamentos quando esta opção é habilitada."/>
- <slider label="Memória de Textura (MB):" name="GrapicsCardTextureMemory" tool_tip="Quantidade de memória a se reservar para texturas. Usa por padrão, a Memória da Placa de Vídeo. Sua redução pode aumentar a performance mas pode também deixar as texturas borradas."/>
- <spinner label="Relação de Distância de &#10;Nevoeiro:" name="fog"/>
+ <check_box initial_value="true" label="Habilitar Objetos com Armazenamento de Vértices" name="vbo" tool_tip="Habilitando-o em máquinas novas, ele oferece um ganho de performance. Contudo, as máquinas antigas tem freqüentemente implementações pobres de VBOs e você pode ter travamentos quando esta opção é habilitada."/>
+ <slider label="Memória de texturas (MB):" name="GraphicsCardTextureMemory" tool_tip="Quanto da memória deve ser alocado para texturas. O padrão é definido pela memória da placa de vídeo. Reduzir este valor pode melhorar o desempenho, mas as texturas podem fica fora de foco."/>
+ <spinner label="Relação de Distância de Nevoeiro:" name="fog"/>
<button label="OK" label_selected="OK" name="OK"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_help_browser.xml b/indra/newview/skins/default/xui/pt/floater_help_browser.xml
new file mode 100644
index 0000000000..9cc8a0a6b2
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_help_browser.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_help_browser" title="NAVEGADOR DA AJUDA">
+ <floater.string name="loading_text">
+ Carregando...
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="external_controls"/>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_im.xml b/indra/newview/skins/default/xui/pt/floater_im.xml
index 75c3409339..c81d0dd7ef 100644
--- a/indra/newview/skins/default/xui/pt/floater_im.xml
+++ b/indra/newview/skins/default/xui/pt/floater_im.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<multi_floater name="im_floater" title="Mensagem Instantânea">
<string name="only_user_message">
- Você é o único usuário desta sessão.
+ Você é o único residente nesta sessão
</string>
<string name="offline_message">
[FIRST] [LAST] está offline.
@@ -10,7 +10,7 @@
Clique no botão [BUTTON NAME] para aceitar/ conectar a este bate-papo em voz.
</string>
<string name="muted_message">
- Você emudeceu este residente. Enviar uma mensagem vai automaticamente reativá-lo novamente.
+ Você bloqueou este residente. Se quiser retirar o bloqueio, basta enviar uma mensagem.
</string>
<string name="generic_request_error">
Erro na requisição, por favor, tente novamente.
@@ -31,7 +31,7 @@
Um moderador do grupo desabilitou seu bate-papo em texto.
</string>
<string name="add_session_event">
- Não foi possível adicionar usuários na sessão de bate-papo com [RECIPIENT].
+ Não foi possível adicionar residentes ao bate-papo com [RECIPIENT].
</string>
<string name="message_session_event">
Não foi possível enviar sua mensagem na sessão de bate- papo com [RECIPIENT].
diff --git a/indra/newview/skins/default/xui/pt/floater_im_container.xml b/indra/newview/skins/default/xui/pt/floater_im_container.xml
new file mode 100644
index 0000000000..0fbb826a96
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_im_container.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<multi_floater name="floater_im_box" title="CONVERSAS"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_im_session.xml b/indra/newview/skins/default/xui/pt/floater_im_session.xml
new file mode 100644
index 0000000000..39dde3408b
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_im_session.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="panel_im">
+ <layout_stack name="im_panels">
+ <layout_panel label="Painel de controle de MI" name="panel_im_control_panel"/>
+ <layout_panel>
+ <line_editor label="Para" name="chat_editor"/>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_image_preview.xml b/indra/newview/skins/default/xui/pt/floater_image_preview.xml
index a0d8c02ef0..3582923ed0 100644
--- a/indra/newview/skins/default/xui/pt/floater_image_preview.xml
+++ b/indra/newview/skins/default/xui/pt/floater_image_preview.xml
@@ -10,17 +10,17 @@
Prévia da
imagem como:
</text>
- <combo_box label="Tipo de Roupas" name="clothing_type_combo" left="100" width="186">
- <combo_box.item name="Image" label="Imagem" />
- <combo_box.item name="Hair" label="Cabelo" />
- <combo_box.item name="FemaleHead" label="Cabeça Feminina" />
- <combo_box.item name="FemaleUpperBody" label="Parte Superior do Corpo Feminino" />
- <combo_box.item name="FemaleLowerBody" label="Parte Inferior do Corpo Feminino" />
- <combo_box.item name="MaleHead" label="Cabeça Masculina" />
- <combo_box.item name="MaleUpperBody" label="Parte Superior do Corpo Masculino" />
- <combo_box.item name="MaleLowerBody" label="Parte Inferiro do Corpo Masculino" />
- <combo_box.item name="Skirt" label="Saia" />
- <combo_box.item name="SculptedPrim" label="Primitiva Esculpida" />
+ <combo_box label="Tipo de Roupas" left="100" name="clothing_type_combo" width="186">
+ <item label="Imagem" name="Image" value="Imagem"/>
+ <item label="Cabelo" name="Hair" value="Cabelo"/>
+ <item label="Cabeça de mulher" name="FemaleHead" value="Cabeça de mulher"/>
+ <item label="Cintura para cima, mulher" name="FemaleUpperBody" value="Cintura para cima, mulher"/>
+ <item label="Cintura para baixo, mulher" name="FemaleLowerBody" value="Cintura para baixo, mulher"/>
+ <item label="Cabeça de homem" name="MaleHead" value="Cabeça de homem"/>
+ <item label="Cintura para cima, homem" name="MaleUpperBody" value="Cintura para cima, homem"/>
+ <item label="Cintura para baixo, homem" name="MaleLowerBody" value="Cintura para baixo, homem"/>
+ <item label="Saia" name="Skirt" value="Saia"/>
+ <item label="Prim esculpido" name="SculptedPrim" value="Prim esculpido"/>
</combo_box>
<text name="bad_image_text">
Incapaz de ler a imagem.
diff --git a/indra/newview/skins/default/xui/pt/floater_incoming_call.xml b/indra/newview/skins/default/xui/pt/floater_incoming_call.xml
new file mode 100644
index 0000000000..4b9553adfe
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_incoming_call.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="incoming call" title="LIGAÇÃO DE DESCONHECIDO">
+ <floater.string name="lifetime">
+ 5
+ </floater.string>
+ <floater.string name="localchat">
+ Bate-papo local
+ </floater.string>
+ <floater.string name="anonymous">
+ anônimo
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ está ligando.
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ entrou numa ligação de voz via conferência.
+ </floater.string>
+ <floater.string name="VoiceInviteGroup">
+ chegou ao canal de voz do &apos;[GROUP]&apos;.
+ </floater.string>
+ <floater.string name="VoiceInviteQuestionGroup">
+ Deseja sair do [CURRENT_CHAT] e entrar na ligação de &apos;[GROUP]&apos;?
+ </floater.string>
+ <floater.string name="VoiceInviteQuestionDefault">
+ Sair do [CURRENT_CHAT] e entrar neste bate-papo de voz?
+ </floater.string>
+ <text name="question">
+ Sair do [CURRENT_CHAT] e entrar neste bate-papo?
+ </text>
+ <button label="Aceitar" label_selected="Aceitar" name="Accept"/>
+ <button label="Rejeitar" label_selected="Rejeitar" name="Reject"/>
+ <button label="Enviar MI" name="Start IM"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_inspect.xml b/indra/newview/skins/default/xui/pt/floater_inspect.xml
index 97c2c6eaeb..6a00b1a628 100644
--- a/indra/newview/skins/default/xui/pt/floater_inspect.xml
+++ b/indra/newview/skins/default/xui/pt/floater_inspect.xml
@@ -1,11 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="inspect" title="INSPECIONAR OBJETO" min_width="450">
+<floater min_width="450" name="inspect" title="EXAMINAR OBJETOS">
+ <floater.string name="timeStamp">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </floater.string>
<scroll_list name="object_list" tool_tip="Selecione um objeto nesta lista para destacá-lo in-world">
- <column label="Nome do Objeto" name="object_name"/>
- <column label="Proprietário" name="owner_name"/>
- <column label="Criador" name="creator_name"/>
- <column label="Data de Criação" name="creation_date"/>
+ <scroll_list.columns label="Nome do Objeto" name="object_name"/>
+ <scroll_list.columns label="Proprietário" name="owner_name"/>
+ <scroll_list.columns label="Criador" name="creator_name"/>
+ <scroll_list.columns label="Data de Criação" name="creation_date"/>
</scroll_list>
- <button width="185" label="Ver Perfil do Proprietário..." label_selected="" name="button owner" tool_tip="Veja o perfil do proprietário do objeto destacado"/>
- <button width="165" left="205" label="Ver perfil do criador..." label_selected="" name="button creator" tool_tip="Veja o perfil do criador original do objeto destacado"/>
+ <button label="Ver Perfil do Proprietário..." label_selected="" name="button owner" tool_tip="Veja o perfil do proprietário do objeto destacado" width="185"/>
+ <button label="Ver perfil do criador..." label_selected="" left="205" name="button creator" tool_tip="Veja o perfil do criador original do objeto destacado" width="165"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_inventory.xml b/indra/newview/skins/default/xui/pt/floater_inventory.xml
index 1c2a3a9233..ae3312eab0 100644
--- a/indra/newview/skins/default/xui/pt/floater_inventory.xml
+++ b/indra/newview/skins/default/xui/pt/floater_inventory.xml
@@ -1,47 +1,16 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Inventory" title="INVENTÃRIO">
- <search_editor label="Escreva aqui para busca" name="inventory search editor"/>
- <tab_container name="inventory filter tabs">
- <inventory_panel label="Todos os Itens" name="All Items"/>
- <inventory_panel label="Itens Recentes" name="Recent Items"/>
- </tab_container>
- <menu_bar name="Inventory Menu">
- <menu label="Arquivo" name="File">
- <menu_item_call label="Abrir" name="Open"/>
- <menu_item_call label="Nova Janela" name="New Window"/>
- <menu_item_call label="Mostrar Filtros" name="Show Filters"/>
- <menu_item_call label="Redefinir Filtros" name="Reset Current"/>
- <menu_item_call label="Fechar Todas as Pastas" name="Close All Folders"/>
- <menu_item_call label="Limpar Lixeira" name="Empty Trash"/>
- </menu>
- <menu label="Criar" name="Create">
- <menu_item_call label="Nova Pasta" name="New Folder"/>
- <menu_item_call label="Novo Script" name="New Script"/>
- <menu_item_call label="Nova Nota" name="New Note"/>
- <menu_item_call label="Novo Gesto" name="New Gesture"/>
- <menu label="Nova Roupa" name="New Clothes">
- <menu_item_call label="Nova Camisa" name="New Shirt"/>
- <menu_item_call label="Nova Calça" name="New Pants"/>
- <menu_item_call label="Novos Sapatos" name="New Shoes"/>
- <menu_item_call label="Novas Meias" name="New Socks"/>
- <menu_item_call label="Nova Jaqueta" name="New Jacket"/>
- <menu_item_call label="Nova Saia" name="New Skirt"/>
- <menu_item_call label="Novas Luvas" name="New Gloves"/>
- <menu_item_call label="Nova Anágua" name="New Undershirt"/>
- <menu_item_call label="Novas Roupas de Baixo" name="New Underpants"/>
- </menu>
- <menu label="Parte do corpo" name="New Body Parts">
- <menu_item_call label="Nova Forma" name="New Shape"/>
- <menu_item_call label="Nova Pele" name="New Skin"/>
- <menu_item_call label="Novo Cabelo" name="New Hair"/>
- <menu_item_call label="Novos Olhos" name="New Eyes"/>
- </menu>
- </menu>
- <menu label="Ordenar" name="Sort">
- <menu_item_check label="Por Nome" name="By Name"/>
- <menu_item_check label="Por Data" name="By Date"/>
- <menu_item_check label="Pastas Sempre por Nome" name="Folders Always By Name"/>
- <menu_item_check label="Pastas do sistema primeiro" name="System Folders To Top"/>
- </menu>
- </menu_bar>
+<floater name="Inventory" title="MEU INVENTÃRIO">
+ <floater.string name="Title">
+ MEU INVENTÃRIO
+ </floater.string>
+ <floater.string name="TitleFetching">
+ MEU INVENTÃRIO (Pegando [ITEM_COUNT] items...) [FILTER]
+ </floater.string>
+ <floater.string name="TitleCompleted">
+ MEU INVENTÃRIO ([ITEM_COUNT] items) [FILTER]
+ </floater.string>
+ <floater.string name="Fetched">
+ Obtido
+ </floater.string>
+ <panel label="Painel do inventário" name="Inventory Panel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml b/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml
index 2a6b02f9c2..8fe69c097d 100644
--- a/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml
+++ b/indra/newview/skins/default/xui/pt/floater_inventory_item_properties.xml
@@ -1,5 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="item properties" title="PROPRIEDADES DO ITEM DE INVENTÃRIO">
+<floater name="item properties" title="PROPRIEDADES DE ITEM NO INVENTÃRIO">
+ <floater.string name="unknown">
+ (desconhecido)
+ </floater.string>
+ <floater.string name="public">
+ (público)
+ </floater.string>
+ <floater.string name="you_can">
+ Você pode:
+ </floater.string>
+ <floater.string name="owner_can">
+ Proprietário pode :
+ </floater.string>
+ <floater.string name="acquiredDate">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </floater.string>
<text name="LabelItemNameTitle">
Nome:
</text>
@@ -27,55 +42,32 @@
Qua Mai 24 12:50:46 2006
</text>
<text name="OwnerLabel">
- Você pode:
+ Você:
</text>
- <check_box label="Modificar" name="CheckOwnerModify"/>
+ <check_box label="Editar" name="CheckOwnerModify"/>
<check_box label="Copiar" name="CheckOwnerCopy"/>
- <check_box label="Revender/Doar" name="CheckOwnerTransfer"/>
- <text name="BaseMaskDebug">
- B:
- </text>
- <text name="OwnerMaskDebug">
- O:
- </text>
- <text name="GroupMaskDebug">
- G:
+ <check_box label="Revender" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ Todos:
</text>
- <text name="EveryoneMaskDebug">
- E:
+ <check_box label="Cortar" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ Grupo:
</text>
- <text name="NextMaskDebug">
- N:
- </text>
- <check_box label="Compartilhar com o grupo" name="CheckShareWithGroup"/>
- <check_box label="Permitir qualquer um copiar" name="CheckEveryoneCopy"/>
+ <check_box label="Compartilhar" name="CheckShareWithGroup"/>
<text name="NextOwnerLabel" width="230">
- Próximo dono pode:
+ Próximo proprietário:
</text>
- <check_box label="Modificar" name="CheckNextOwnerModify"/>
+ <check_box label="Editar" name="CheckNextOwnerModify"/>
<check_box label="Copiar" name="CheckNextOwnerCopy"/>
- <check_box label="Revender/Doar" name="CheckNextOwnerTransfer"/>
- <text name="SaleLabel">
- Marcar Item:
- </text>
+ <check_box label="Revender" name="CheckNextOwnerTransfer"/>
<check_box label="À venda" name="CheckPurchase"/>
- <radio_group name="RadioSaleType">
- <radio_item name="radio" label="Original" />
- <radio_item name="radio2" label="Cópia" />
- </radio_group>
- <text name="TextPrice">
- Price: L$
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="Cortar" name="Copy"/>
+ <combo_box.item label="Original" name="Original"/>
+ </combo_box>
+ <spinner label="Preço:" name="Edit Cost"/>
+ <text name="CurrencySymbol">
+ L$
</text>
- <string name="unknown">
- (desconhecido)
- </string>
- <string name="public">
- (público)
- </string>
- <string name="you_can">
- Você pode:
- </string>
- <string name="owner_can">
- Proprietário pode :
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml b/indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml
index 57cdd50dcc..d21e574011 100644
--- a/indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml
+++ b/indra/newview/skins/default/xui/pt/floater_inventory_view_finder.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Inventory Finder" title="ITENS_DE_INVENTÃRIO_RECENTES" width="165">
+<floater name="Inventory Finder" title="ITENS_DE_INVENTÃRIO_RECENTES">
<check_box label="Animação" name="check_animation"/>
<check_box label="Cartões de chamadas" name="check_calling_card"/>
<check_box label="Roupas" name="check_clothing"/>
@@ -13,8 +13,8 @@
<check_box label="Fotos" name="check_snapshot"/>
<button label="Tudo" label_selected="Tudo" name="All"/>
<button label="Nenhum" label_selected="Nenhum" name="None"/>
- <check_box label="Sempre mostrar as pastas" name="check_show_empty" left="3"/>
- <check_box label="Desde o Logoff" name="check_since_logoff" left="3"/>
+ <check_box label="Sempre mostrar as pastas" name="check_show_empty"/>
+ <check_box label="Desde o Logoff" name="check_since_logoff"/>
<text name="- OR -">
- OU -
</text>
diff --git a/indra/newview/skins/default/xui/pt/floater_joystick.xml b/indra/newview/skins/default/xui/pt/floater_joystick.xml
index 0793a0b161..98d8c0e319 100644
--- a/indra/newview/skins/default/xui/pt/floater_joystick.xml
+++ b/indra/newview/skins/default/xui/pt/floater_joystick.xml
@@ -1,23 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Joystick" title="CONFIGURAÇÃO DO JOYSTICK">
- <check_box name="enable_joystick" label="Habilitar Joystick:"/>
+ <check_box label="Habilitar Joystick:" name="enable_joystick"/>
<text left="135" name="joystick_type" width="360"/>
- <spinner label="Mapeamento: eixo X" name="JoystickAxis1" label_width="124" width="164"/>
- <spinner label="Mapeamento: eixo Y" name="JoystickAxis2" label_width="124" width="164"/>
- <spinner label="Mapeamento: eixo Z" name="JoystickAxis0" label_width="124" width="164"/>
- <spinner label="Mapeamento: Elevação" name="JoystickAxis4" label_width="124" width="164"/>
- <spinner label="Mapeamento: Guinada" name="JoystickAxis5" label_width="124" width="164"/>
- <spinner label="Mapeamento: Rolagem" name="JoystickAxis3" label_width="124" width="164"/>
- <spinner label="Mapeamento: Zoom" name="JoystickAxis6" label_width="124" width="164"/>
- <check_box label="Zoom Direto" name="ZoomDirect" left="194"/>
+ <spinner label="Mapeamento: eixo X" label_width="124" name="JoystickAxis1" width="164"/>
+ <spinner label="Mapeamento: eixo Y" label_width="124" name="JoystickAxis2" width="164"/>
+ <spinner label="Mapeamento: eixo Z" label_width="124" name="JoystickAxis0" width="164"/>
+ <spinner label="Mapeamento: Elevação" label_width="124" name="JoystickAxis4" width="164"/>
+ <spinner label="Mapeamento: Guinada" label_width="124" name="JoystickAxis5" width="164"/>
+ <spinner label="Mapeamento: Rolagem" label_width="124" name="JoystickAxis3" width="164"/>
+ <spinner label="Mapeamento: Zoom" label_width="124" name="JoystickAxis6" width="164"/>
+ <check_box label="Zoom Direto" left="194" name="ZoomDirect"/>
<check_box label="Cursor 3D" name="Cursor3D"/>
<check_box label="Nível Automático" name="AutoLeveling"/>
<text name="Control Modes:">
Modos de Controle:
</text>
- <check_box name="JoystickAvatarEnabled" label="Avatar"/>
- <check_box name="JoystickBuildEnabled" left="192" label="Construir"/>
- <check_box name="JoystickFlycamEnabled" label="Camera aérea"/>
+ <check_box label="Avatar" name="JoystickAvatarEnabled"/>
+ <check_box label="Construir" name="JoystickBuildEnabled"/>
+ <check_box label="Camera aérea" name="JoystickFlycamEnabled"/>
<text name="XScale">
Escala X
</text>
@@ -27,13 +27,13 @@
<text name="ZScale">
Escala Z
</text>
- <text name="PitchScale" left="3" width="115">
+ <text name="PitchScale">
Escala de Elevação
</text>
- <text name="YawScale" left="3" width="115">
+ <text name="YawScale">
Escala da Guinada
</text>
- <text name="RollScale" left="3" width="115">
+ <text name="RollScale">
Escala de Rolagem
</text>
<text name="XDeadZone">
@@ -45,13 +45,13 @@
<text name="ZDeadZone">
Zona Morta Z
</text>
- <text name="PitchDeadZone" left="3" width="115">
+ <text name="PitchDeadZone">
Zona Morta: Elevação
</text>
- <text name="YawDeadZone" left="3" width="115">
+ <text name="YawDeadZone">
Zona Morta: Guinada
</text>
- <text name="RollDeadZone" left="3" width="115">
+ <text name="RollDeadZone">
Zona Morta: Rolagem
</text>
<text name="Feathering">
@@ -60,10 +60,10 @@
<text name="ZoomScale2">
Escala de Zoom
</text>
- <text name="ZoomDeadZone" width="110" left="4">
+ <text name="ZoomDeadZone">
Zona Morta de Zoom
</text>
- <button label="Padrões do SpaceNavigator" name="SpaceNavigatorDefaults" font="SansSerifSmall"/>
+ <button font="SansSerifSmall" label="Padrões do SpaceNavigator" name="SpaceNavigatorDefaults"/>
<button label="OK" label_selected="OK" name="ok_btn"/>
<button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/>
<stat_view label="Monitor do Joystick" name="axis_view">
diff --git a/indra/newview/skins/default/xui/pt/floater_lagmeter.xml b/indra/newview/skins/default/xui/pt/floater_lagmeter.xml
index 2728633438..9932318293 100644
--- a/indra/newview/skins/default/xui/pt/floater_lagmeter.xml
+++ b/indra/newview/skins/default/xui/pt/floater_lagmeter.xml
@@ -1,155 +1,154 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater_lagmeter" title="MEDIDOR DE ATRASO">
- <button label="" label_selected="" name="client_lagmeter" tool_tip="Status de atraso no Cliente"/>
- <text left="30" name="client_lag_cause" right="-10" />
- <text left="30" name="network_lag_cause" right="-10" />
- <text left="30" name="server_lag_cause" right="-32" />
- <text name="client">
- Cliente:
- </text>
- <text name="client_text" font="SansSerifSmall">
- Normal
- </text>
- <button label="" label_selected="" name="network_lagmeter" tool_tip="Status de atraso na rede"/>
- <text name="network">
- Rede:
- </text>
- <text name="network_text" font="SansSerifSmall">
- Normal
- </text>
- <button label="" label_selected="" name="server_lagmeter" tool_tip="Status de atraso no servidor"/>
- <text name="server">
- Servidor:
- </text>
- <text name="server_text" font="SansSerifSmall">
- Normal
- </text>
- <button label="?" name="server_help"/>
- <button label="&gt;&gt;" name="minimize"/>
- <string name="max_title_msg">
+<floater name="floater_lagmeter" title="LAG - Ãndice">
+ <floater.string name="max_title_msg">
Medidor de Atraso
- </string>
- <string name="max_width_px">
+ </floater.string>
+ <floater.string name="max_width_px">
360
- </string>
- <string name="min_title_msg">
+ </floater.string>
+ <floater.string name="min_title_msg">
Atraso
- </string>
- <string name="min_width_px">
+ </floater.string>
+ <floater.string name="min_width_px">
90
- </string>
- <string name="client_text_msg">
+ </floater.string>
+ <floater.string name="client_text_msg">
Cliente
- </string>
- <string name="client_frame_rate_critical_fps">
+ </floater.string>
+ <floater.string name="client_frame_rate_critical_fps">
10
- </string>
- <string name="client_frame_rate_warning_fps">
+ </floater.string>
+ <floater.string name="client_frame_rate_warning_fps">
15
- </string>
- <string name="client_frame_time_window_bg_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_window_bg_msg">
Normal, janela por baixo
- </string>
- <string name="client_frame_time_critical_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_critical_msg">
Taxa de quadros do Cliente abaixo de [CLIENT_FRAME_RATE_CRITICAL]
- </string>
- <string name="client_frame_time_warning_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_warning_msg">
Taxa de quadros do Cliente entre [CLIENT_FRAME_RATE_CRITICAL] e [CLIENT_FRAME_RATE_WARNING]
- </string>
- <string name="client_frame_time_normal_msg">
+ </floater.string>
+ <floater.string name="client_frame_time_normal_msg">
Normal
- </string>
- <string name="client_draw_distance_cause_msg">
+ </floater.string>
+ <floater.string name="client_draw_distance_cause_msg">
Causa possível: Distância de desenho ajustada muito alta
- </string>
- <string name="client_texture_loading_cause_msg">
+ </floater.string>
+ <floater.string name="client_texture_loading_cause_msg">
Causa possível: Carregamento de Imagens
- </string>
- <string name="client_texture_memory_cause_msg">
+ </floater.string>
+ <floater.string name="client_texture_memory_cause_msg">
Causa possível: Muitas imagens na memória
- </string>
- <string name="client_complex_objects_cause_msg">
+ </floater.string>
+ <floater.string name="client_complex_objects_cause_msg">
Causa possível: Muitos objetos complexos na cena
- </string>
- <string name="network_text_msg">
+ </floater.string>
+ <floater.string name="network_text_msg">
Rede
- </string>
- <string name="network_packet_loss_critical_pct">
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_pct">
10
- </string>
- <string name="network_packet_loss_warning_pct">
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_pct">
5
- </string>
- <string name="network_packet_loss_critical_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_critical_msg">
Conexão está caindo para cerca de [NETWORK_PACKET_LOSS_CRITICAL]% de pacotes
- </string>
- <string name="network_packet_loss_warning_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_warning_msg">
Conexão está caindo [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% de pacotes
- </string>
- <string name="network_performance_normal_msg">
+ </floater.string>
+ <floater.string name="network_performance_normal_msg">
Normal
- </string>
- <string name="network_ping_critical_ms">
+ </floater.string>
+ <floater.string name="network_ping_critical_ms">
600
- </string>
- <string name="network_ping_warning_ms">
+ </floater.string>
+ <floater.string name="network_ping_warning_ms">
300
- </string>
- <string name="network_ping_critical_msg">
+ </floater.string>
+ <floater.string name="network_ping_critical_msg">
Tempo de conexão de ping é cerca de [NETWORK_PING_CRITICAL] ms
- </string>
- <string name="network_ping_warning_msg">
+ </floater.string>
+ <floater.string name="network_ping_warning_msg">
Tempo de conexão de ping é [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms
- </string>
- <string name="network_packet_loss_cause_msg">
+ </floater.string>
+ <floater.string name="network_packet_loss_cause_msg">
Possível conexão ruim ou &apos;Largura de Banda&apos; escolhida muito alta.
- </string>
- <string name="network_ping_cause_msg">
+ </floater.string>
+ <floater.string name="network_ping_cause_msg">
Possível conexão ruim ou aplicativos compartilhando arquivos.
- </string>
- <string name="server_text_msg">
+ </floater.string>
+ <floater.string name="server_text_msg">
Servidor
- </string>
- <string name="server_frame_rate_critical_fps">
+ </floater.string>
+ <floater.string name="server_frame_rate_critical_fps">
20
- </string>
- <string name="server_frame_rate_warning_fps">
+ </floater.string>
+ <floater.string name="server_frame_rate_warning_fps">
30
- </string>
- <string name="server_single_process_max_time_ms">
+ </floater.string>
+ <floater.string name="server_single_process_max_time_ms">
20
- </string>
- <string name="server_frame_time_critical_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_critical_msg">
Taxa de quadros abaixo de [SERVER_FRAME_RATE_CRITICAL]
- </string>
- <string name="server_frame_time_warning_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_warning_msg">
Taxa de quadros entre [SERVER_FRAME_RATE_CRITICAL] e [SERVER_FRAME_RATE_WARNING]
- </string>
- <string name="server_frame_time_normal_msg">
+ </floater.string>
+ <floater.string name="server_frame_time_normal_msg">
Normal
- </string>
- <string name="server_physics_cause_msg">
+ </floater.string>
+ <floater.string name="server_physics_cause_msg">
Causa possível: Muitos objetos físicos
- </string>
- <string name="server_scripts_cause_msg">
+ </floater.string>
+ <floater.string name="server_scripts_cause_msg">
Causa possível: Muitos objetos com scripts
- </string>
- <string name="server_net_cause_msg">
+ </floater.string>
+ <floater.string name="server_net_cause_msg">
Causa possível: Muito tráfego na rede
- </string>
- <string name="server_agent_cause_msg">
+ </floater.string>
+ <floater.string name="server_agent_cause_msg">
Causa possível: Muitas pessoas se movendo na região
- </string>
- <string name="server_images_cause_msg">
+ </floater.string>
+ <floater.string name="server_images_cause_msg">
Causa possível: Muitos cálculos de imagem
- </string>
- <string name="server_generic_cause_msg">
+ </floater.string>
+ <floater.string name="server_generic_cause_msg">
Causa possível: Carga no simulador muito pesada
- </string>
- <string name="smaller_label">
+ </floater.string>
+ <floater.string name="smaller_label">
&gt;&gt;
- </string>
- <string name="bigger_label">
+ </floater.string>
+ <floater.string name="bigger_label">
&lt;&lt;
- </string>
+ </floater.string>
+ <button label="" label_selected="" name="client_lagmeter" tool_tip="Status de atraso no Cliente"/>
+ <text name="client">
+ Cliente
+ </text>
+ <text font="SansSerifSmall" name="client_text">
+ Normal
+ </text>
+ <text left="30" name="client_lag_cause" right="-10"/>
+ <button label="" label_selected="" name="network_lagmeter" tool_tip="Status de atraso na rede"/>
+ <text name="network">
+ Rede
+ </text>
+ <text font="SansSerifSmall" name="network_text">
+ Normal
+ </text>
+ <text left="30" name="network_lag_cause" right="-10"/>
+ <button label="" label_selected="" name="server_lagmeter" tool_tip="Status de atraso no servidor"/>
+ <text name="server">
+ Servidor
+ </text>
+ <text font="SansSerifSmall" name="server_text">
+ Normal
+ </text>
+ <text left="30" name="server_lag_cause" right="-32"/>
+ <button label="&gt;&gt;" name="minimize" tool_tip="Alternar o tamanho da janela"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_land_holdings.xml b/indra/newview/skins/default/xui/pt/floater_land_holdings.xml
index d8588e2f05..2b0d6790f2 100644
--- a/indra/newview/skins/default/xui/pt/floater_land_holdings.xml
+++ b/indra/newview/skins/default/xui/pt/floater_land_holdings.xml
@@ -1,13 +1,13 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="land holdings floater" title="MEU TERRENO">
+<floater name="land holdings floater" title="MEUS TERRENOS">
<scroll_list name="parcel list">
- <column label="Nome do Lote" name="name"/>
+ <column label="Lote" name="name"/>
<column label="Região" name="location"/>
<column label="Tipo" name="type"/>
<column label="Ãrea" name="area"/>
</scroll_list>
<button label="Teletransporte" label_selected="Teletransporte" name="Teleport" tool_tip="Teletransportar para o centro do terreno."/>
- <button width="130" label="Mostrar no mapa" label_selected="Mostrar no mapa" name="Show on Map" tool_tip="Mostrar esse terreno no mapa do mundo."/>
+ <button label="Mapa" label_selected="Mapa" name="Show on Map" tool_tip="Mostrar terreno na mápa-mundi" width="130"/>
<text name="contrib_label">
Contribuições para os seus grupos:
</text>
@@ -18,19 +18,19 @@
<text name="allowed_label" width="380">
Propriedades de terreno permitidas com o plano de pagamento atual:
</text>
- <text name="allowed_text" left_delta="390">
+ <text left_delta="390" name="allowed_text">
[AREA] m²
</text>
<text name="current_label">
Propriedades de terrenos atuais:
</text>
- <text name="current_text" left_delta="390">
+ <text left_delta="390" name="current_text">
[AREA] m²
</text>
<text name="available_label">
Disponível para compra de terras:
</text>
- <text name="available_text" left_delta="390">
+ <text left_delta="390" name="available_text">
[AREA] m²
</text>
<string name="area_string">
diff --git a/indra/newview/skins/default/xui/pt/floater_live_lsleditor.xml b/indra/newview/skins/default/xui/pt/floater_live_lsleditor.xml
index c0b726c476..5ad116ac8a 100644
--- a/indra/newview/skins/default/xui/pt/floater_live_lsleditor.xml
+++ b/indra/newview/skins/default/xui/pt/floater_live_lsleditor.xml
@@ -1,12 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="script ed float" title="SCRIPT: NOVO SCRIPT">
- <button label="Resetar" label_selected="Resetar" name="Reset"/>
- <check_box label="Correndo" name="running"/>
- <check_box label="Mono" name="mono" left="86"/>
- <string name="not_allowed">
- Você não tem permissão para visualizar este script.
- </string>
- <string name="script_running">
+ <floater.string name="not_allowed">
+ Você não pode ver ou editar o script, uma vez que está definido como &quot;não&quot; copiar. Você precisa de permissões para ver ou editar um script dentro de um objeto.
+ </floater.string>
+ <floater.string name="script_running">
Executando
- </string>
+ </floater.string>
+ <floater.string name="Title">
+ SCRIPT: [NAME]
+ </floater.string>
+ <button label="Resetar" label_selected="Resetar" name="Reset"/>
+ <check_box initial_value="true" label="Correndo" name="running"/>
+ <check_box initial_value="true" label="Mono" left="86" name="mono"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_lsl_guide.xml b/indra/newview/skins/default/xui/pt/floater_lsl_guide.xml
index 49a9e7fcf5..73f187f0e4 100644
--- a/indra/newview/skins/default/xui/pt/floater_lsl_guide.xml
+++ b/indra/newview/skins/default/xui/pt/floater_lsl_guide.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<floater name="script ed float" title="LSL WIKI">
- <check_box label="Seguir o Cursor" name="lock_check" />
- <combo_box label="Bloquear" name="history_combo" left_delta="120" width="70"/>
- <button label="Anterior" name="back_btn" left_delta="75"/>
- <button label="Posterior" name="fwd_btn" />
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script ed float" title="LSL REFERENCE">
+ <check_box label="Seguir o Cursor" name="lock_check"/>
+ <combo_box label="Bloquear" left_delta="120" name="history_combo" width="70"/>
+ <button label="Anterior" left_delta="75" name="back_btn"/>
+ <button label="Posterior" name="fwd_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_map.xml b/indra/newview/skins/default/xui/pt/floater_map.xml
index ff60f77c4b..f8e4e76752 100644
--- a/indra/newview/skins/default/xui/pt/floater_map.xml
+++ b/indra/newview/skins/default/xui/pt/floater_map.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Map">
+<floater name="Map" title="">
<floater.string name="mini_map_north">
N
</floater.string>
diff --git a/indra/newview/skins/default/xui/pt/floater_media_browser.xml b/indra/newview/skins/default/xui/pt/floater_media_browser.xml
index 1cd6d5662c..7491218067 100644
--- a/indra/newview/skins/default/xui/pt/floater_media_browser.xml
+++ b/indra/newview/skins/default/xui/pt/floater_media_browser.xml
@@ -15,7 +15,7 @@
<button label="Ir" left_delta="505" name="go" width="35"/>
</layout_panel>
<layout_panel name="parcel_owner_controls">
- <button label="Enviar a URL atual para o terreno" name="assign"/>
+ <button label="Enviar esta página para lote" name="assign"/>
</layout_panel>
<layout_panel name="external_controls">
<button label="Abrir no meu Navegador de Web" name="open_browser" width="196"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_media_settings.xml b/indra/newview/skins/default/xui/pt/floater_media_settings.xml
new file mode 100644
index 0000000000..5af002c502
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_media_settings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="media_settings" title="CONFIGURAÇÕES DE MÃDIA">
+ <button label="OK" label_selected="OK" name="OK"/>
+ <button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
+ <button label="Aplicar" label_selected="Aplicar" name="Apply"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_mem_leaking.xml b/indra/newview/skins/default/xui/pt/floater_mem_leaking.xml
index 4f93eb90e5..efb5da4ace 100644
--- a/indra/newview/skins/default/xui/pt/floater_mem_leaking.xml
+++ b/indra/newview/skins/default/xui/pt/floater_mem_leaking.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="MemLeak" title="SIMULAÇÃO DE PERDA DE MEMÓRIA">
+<floater name="MemLeak" title="SIMULAR UM VAZAMENTO DE MEMÓRIA">
<spinner label="Velocidade da Perda (bytes por quadro):" name="leak_speed"/>
<spinner label="Máximo de Memória Perdida (MB):" name="max_leak"/>
<text name="total_leaked_label">
diff --git a/indra/newview/skins/default/xui/pt/floater_moveview.xml b/indra/newview/skins/default/xui/pt/floater_moveview.xml
index 996a974254..b1dc65e3af 100644
--- a/indra/newview/skins/default/xui/pt/floater_moveview.xml
+++ b/indra/newview/skins/default/xui/pt/floater_moveview.xml
@@ -1,13 +1,75 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="move_floater">
-<panel name="panel_actions">
- <button label="" label_selected="" name="turn left btn" tool_tip="Virar à esquerda"/>
- <button label="" label_selected="" name="turn right btn" tool_tip="Virar à direita"/>
- <button label="" label_selected="" name="move up btn" tool_tip="Pular ou Voar"/>
- <button label="" label_selected="" name="move down btn" tool_tip="Agaixar ou pousar"/>
- <joystick_slide name="slide left btn" tool_tip="Mover para a esquerda"/>
- <joystick_slide name="slide right btn" tool_tip="Mover para a direita"/>
- <joystick_turn name="forward btn" tool_tip="Mover para a frente."/>
- <joystick_turn name="backward btn" tool_tip="Mover para trás"/>
-</panel>
+ <string name="walk_forward_tooltip">
+ Andar para frente (flecha para cima ou W)
+ </string>
+ <string name="walk_back_tooltip">
+ Andar para trás (flecha para baixo ou S)
+ </string>
+ <string name="walk_left_tooltip">
+ Andar para a esquerda (Shift + Seta esquerda ou A)
+ </string>
+ <string name="walk_right_tooltip">
+ Andar para a direita (Shift + Seta direita ou D)
+ </string>
+ <string name="run_forward_tooltip">
+ Correr para frente (flecha para cima ou W)
+ </string>
+ <string name="run_back_tooltip">
+ Correr para trás (flecha para baixo ou S)
+ </string>
+ <string name="run_left_tooltip">
+ Correr para a esquerda (Shift + Seta esquerda ou A)
+ </string>
+ <string name="run_right_tooltip">
+ Correr para a direita (Shift + Seta direita ou D)
+ </string>
+ <string name="fly_forward_tooltip">
+ Voar para frente (flecha para cima ou W)
+ </string>
+ <string name="fly_back_tooltip">
+ Voar para trás (flecha para baixo ou S)
+ </string>
+ <string name="fly_left_tooltip">
+ Voar para a esquerda (Shift + Seta esquerda ou A)
+ </string>
+ <string name="fly_right_tooltip">
+ Voar para a direita (Shift + Seta direita ou D)
+ </string>
+ <string name="fly_up_tooltip">
+ Voar para cima (tecla E)
+ </string>
+ <string name="fly_down_tooltip">
+ Voar para baixo (tecla C)
+ </string>
+ <string name="jump_tooltip">
+ Pular (tecla E)
+ </string>
+ <string name="crouch_tooltip">
+ Agachar (tecla C)
+ </string>
+ <string name="walk_title">
+ Andar
+ </string>
+ <string name="run_title">
+ Correr
+ </string>
+ <string name="fly_title">
+ Voar
+ </string>
+ <panel name="panel_actions">
+ <button label="" label_selected="" name="move up btn" tool_tip="Voar para cima (tecla E)"/>
+ <button label="" label_selected="" name="turn left btn" tool_tip="Virar à esquerda (flecha ESQ ou A)"/>
+ <joystick_slide name="move left btn" tool_tip="Andar para a esquerda (Shift + Seta esquerda ou A)"/>
+ <button label="" label_selected="" name="move down btn" tool_tip="Voar para baixo (tecla C)"/>
+ <button label="" label_selected="" name="turn right btn" tool_tip="Virar à direita (flecha DIR ou D)"/>
+ <joystick_slide name="move right btn" tool_tip="Andar para a direita (Shift + Seta direita ou D)"/>
+ <joystick_turn name="forward btn" tool_tip="Andar para frente (flecha para cima ou W)"/>
+ <joystick_turn name="backward btn" tool_tip="Andar para trás (flecha para baixo ou S)"/>
+ </panel>
+ <panel name="panel_modes">
+ <button label="" name="mode_walk_btn" tool_tip="Modo caminhar"/>
+ <button label="" name="mode_run_btn" tool_tip="Modo correr"/>
+ <button label="" name="mode_fly_btn" tool_tip="Modo voar"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_mute_object.xml b/indra/newview/skins/default/xui/pt/floater_mute_object.xml
index cc669951c3..97fbd35fcc 100644
--- a/indra/newview/skins/default/xui/pt/floater_mute_object.xml
+++ b/indra/newview/skins/default/xui/pt/floater_mute_object.xml
@@ -1,12 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="mute by name" title="SILENCIAR OBJETO PELO NOME">
+<floater name="mute by name" title="BLOQUEAR OBJETO POR NOME">
<text name="message">
- Silenciar pelo nome afeta apenas conversa de objeto e MI,
-não sons. Você deve digitar o nome exato do objeto.
+ Bloquear o objeto:
</text>
<line_editor name="object_name">
Nome do objeto
</line_editor>
+ <text name="note">
+ * Bloquear apenas texto do objeto, não sons
+ </text>
<button label="OK" name="OK"/>
<button label="Cancelar" name="Cancel"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_nearby_chat.xml b/indra/newview/skins/default/xui/pt/floater_nearby_chat.xml
new file mode 100644
index 0000000000..5ba2dcd925
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_nearby_chat.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="nearby_chat" title="Bate-papo local"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_outfit_save_as.xml b/indra/newview/skins/default/xui/pt/floater_outfit_save_as.xml
new file mode 100644
index 0000000000..dec8a7676a
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_outfit_save_as.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="modal container" title="Salvar este look">
+ <button label="Salvar" label_selected="Salvar" name="Save"/>
+ <button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
+ <text name="Save item as:">
+ Veja o meu novo visual:
+ </text>
+ <line_editor name="name ed">
+ [DESC] (new)
+ </line_editor>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_outgoing_call.xml b/indra/newview/skins/default/xui/pt/floater_outgoing_call.xml
new file mode 100644
index 0000000000..35afde7612
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_outgoing_call.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="outgoing call" title="LIGANDO">
+ <floater.string name="lifetime">
+ 5
+ </floater.string>
+ <floater.string name="localchat">
+ Bate-papo local
+ </floater.string>
+ <floater.string name="anonymous">
+ anônimo
+ </floater.string>
+ <floater.string name="VoiceInviteP2P">
+ está ligando.
+ </floater.string>
+ <floater.string name="VoiceInviteAdHoc">
+ entrou numa ligação de voz via conferência.
+ </floater.string>
+ <text name="connecting">
+ Conectando com [CALLEE_NAME]
+ </text>
+ <text name="calling">
+ Ligando para [CALLEE_NAME]
+ </text>
+ <text name="noanswer">
+ Não há resposta. Tente novamente mais tarde.
+ </text>
+ <text name="nearby">
+ Você saiu da ligação com [VOICE_CHANNEL_NAME]. [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_other">
+ A ligação foi desligada. [RECONNECT_NEARBY]
+ </text>
+ <text name="nearby_P2P_by_agent">
+ Você encerrou a ligação. [RECONNECT_NEARBY]
+ </text>
+ <text name="leaving">
+ Saindo de [CURRENT_CHAT].
+ </text>
+ <button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_pay.xml b/indra/newview/skins/default/xui/pt/floater_pay.xml
index 187df8fd18..81c861687f 100644
--- a/indra/newview/skins/default/xui/pt/floater_pay.xml
+++ b/indra/newview/skins/default/xui/pt/floater_pay.xml
@@ -1,21 +1,25 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <button label="L$1" label_selected="L$1" name="fastpay 1" left="112" />
- <button label="L$5" label_selected="L$5" name="fastpay 5" />
- <button label="L$10" label_selected="L$10" name="fastpay 10" left="112" />
- <button label="L$20" label_selected="L$20" name="fastpay 20" />
- <button label="Pagar" label_selected="Pagar" name="pay btn" />
- <button label="Cancelar" label_selected="Cancelar" name="cancel btn" />
- <text name="payee_label" width="110" left="5">
- Pagar residente:
+ <string name="payee_group">
+ Pagar grupo
+ </string>
+ <string name="payee_resident">
+ Pagar residente
+ </string>
+ <text left="5" name="payee_label" width="110">
+ Pagar:
</text>
- <text name="payee_name" left="115">
+ <icon name="icon_person" tool_tip="Pessoa"/>
+ <text left="115" name="payee_name">
[FIRST] [LAST]
</text>
- <text name="fastpay text" width="120" halign="left">
- Pagamento rápido:
- </text>
- <text name="amount text" left="4" >
- Quantia:
+ <button label="L$1" label_selected="L$1" left="112" name="fastpay 1"/>
+ <button label="L$5" label_selected="L$5" name="fastpay 5"/>
+ <button label="L$10" label_selected="L$10" left="112" name="fastpay 10"/>
+ <button label="L$20" label_selected="L$20" name="fastpay 20"/>
+ <text left="4" name="amount text">
+ Outro valor:
</text>
+ <button label="Pagar" label_selected="Pagar" name="pay btn"/>
+ <button label="Cancelar" label_selected="Cancelar" name="cancel btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_pay_object.xml b/indra/newview/skins/default/xui/pt/floater_pay_object.xml
index 3a3dd9e52e..464afd7f18 100644
--- a/indra/newview/skins/default/xui/pt/floater_pay_object.xml
+++ b/indra/newview/skins/default/xui/pt/floater_pay_object.xml
@@ -1,31 +1,30 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="Give Money" title="">
- <text name="payee_group" width="100" halign="left">
- Pagar Grupo:
- </text>
- <text name="payee_resident" width="120" halign="left" >
- Pagar residente:
- </text>
- <text name="payee_name" left="105">
+ <string halign="left" name="payee_group" width="100">
+ Pagar grupo
+ </string>
+ <string halign="left" name="payee_resident" width="120">
+ Pagar residente
+ </string>
+ <icon name="icon_person" tool_tip="Pessoa"/>
+ <text left="105" name="payee_name">
[FIRST] [LAST]
</text>
- <text name="object_name_label" left="5" width="95" halign="left">
+ <text halign="left" left="5" name="object_name_label" width="95">
Via objeto:
</text>
- <text name="object_name_text" left="105" >
- ...
- </text>
- <text name="fastpay text" width="115" halign="left">
- Pagamento Rápido:
+ <icon name="icon_object" tool_tip="Objects"/>
+ <text left="105" name="object_name_text">
+ Meu objeto maravilho, fantástico e com nome comprido e imaginativo
</text>
- <text name="amount text" left="5" halign="left">
- Quantia:
+ <button label="L$1" label_selected="L$1" left="125" name="fastpay 1" width="70"/>
+ <button label="L$5" label_selected="L$5" left="200" name="fastpay 5" width="70"/>
+ <button label="L$10" label_selected="L$10" left="125" name="fastpay 10" width="70"/>
+ <button label="L$20" label_selected="L$20" left="200" name="fastpay 20" width="70"/>
+ <text halign="left" left="5" name="amount text">
+ Outro valor:
</text>
- <button label="L$1" label_selected="L$1" name="fastpay 1" left="125" width="70"/>
- <button label="L$5" label_selected="L$5" name="fastpay 5" left="200" width="70"/>
- <button label="L$10" label_selected="L$10" name="fastpay 10" left="125" width="70"/>
- <button label="L$20" label_selected="L$20" name="fastpay 20" left="200" width="70"/>
- <button label="Pagar" label_selected="Pagar" name="pay btn" />
- <button label="Cancelar" label_selected="Cancelar" name="cancel btn" />
- <line_editor left="60" name="amount" width="50" />
+ <line_editor left="60" name="amount" width="50"/>
+ <button label="Pagar" label_selected="Pagar" name="pay btn"/>
+ <button label="Cancelar" label_selected="Cancelar" name="cancel btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_postcard.xml b/indra/newview/skins/default/xui/pt/floater_postcard.xml
index cf63726df2..9740fbcb4d 100644
--- a/indra/newview/skins/default/xui/pt/floater_postcard.xml
+++ b/indra/newview/skins/default/xui/pt/floater_postcard.xml
@@ -1,22 +1,22 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Postcard" title="FOTO POR EMAIL">
+<floater name="Postcard" title="ENVIAR FOTO VIA EMAIL">
<text name="to_label" width="135">
- Email do Destinatário:
+ Para (email):
</text>
- <line_editor name="to_form" left="143" width="127" />
+ <line_editor left="143" name="to_form" width="127"/>
<text name="from_label">
- Seu Email:
+ De (email):
</text>
- <line_editor name="from_form" left="143" width="127" />
+ <line_editor left="143" name="from_form" width="127"/>
<text name="name_label">
Seu nome:
</text>
- <line_editor name="name_form" left="143" width="127" />
+ <line_editor left="143" name="name_form" width="127"/>
<text name="subject_label">
Assunto:
</text>
- <line_editor name="subject_form" left="143" width="127" />
- <line_editor label="Digite seu assunto aqui." name="subject_form"/>
+ <line_editor left="143" name="subject_form" width="127"/>
+ <line_editor label="Digite o assunto aqui" name="subject_form"/>
<text name="msg_label">
Mensagem:
</text>
@@ -29,7 +29,7 @@
<button label="Cancelar" name="cancel_btn"/>
<button label="Enviar" name="send_btn"/>
<string name="default_subject">
- Cartão postal do [SECOND_LIFE]
+ Postal do [SECOND_LIFE].
</string>
<string name="default_message">
Dá uma olhada nisto!
diff --git a/indra/newview/skins/default/xui/pt/floater_preferences.xml b/indra/newview/skins/default/xui/pt/floater_preferences.xml
index d2c3c79160..2c76a72ca8 100644
--- a/indra/newview/skins/default/xui/pt/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/pt/floater_preferences.xml
@@ -1,9 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Preferences" title="PREFERÊNCIAS" min_width="332" width="628">
+<floater name="Preferences" title="PREFERÊNCIAS">
<button label="OK" label_selected="OK" name="OK"/>
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
- <button label="Aplicar" label_selected="Aplicar" name="Apply"/>
- <button label="Sobre" label_selected="Sobre" name="About..."/>
- <button label="Ajuda" label_selected="Ajuda" name="Help"/>
- <tab_container name="pref core" tab_width="128" width="628" />
+ <tab_container name="pref core">
+ <panel label="Geral" name="general"/>
+ <panel label="Vídeo" name="display"/>
+ <panel label="Privacidade" name="im"/>
+ <panel label="Som e mídia" name="audio"/>
+ <panel label="Bate-papo" name="chat"/>
+ <panel label="Notificações" name="msgs"/>
+ <panel label="Configurações" name="input"/>
+ <panel label="Avançado" name="advanced1"/>
+ </tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_animation.xml b/indra/newview/skins/default/xui/pt/floater_preview_animation.xml
index 26ca8f87e0..b66159354f 100644
--- a/indra/newview/skins/default/xui/pt/floater_preview_animation.xml
+++ b/indra/newview/skins/default/xui/pt/floater_preview_animation.xml
@@ -1,8 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_anim">
+ <floater.string name="Title">
+ Animação: [NOME]
+ </floater.string>
<text name="desc txt">
Descrição:
</text>
- <button label="Executar in World" label_selected="Parar" left="20" name="Anim play btn" tool_tip="Executar esta animação para que outros vejam." width="131"/>
- <button label="Executar localmente" label_selected="Parar" left="162" name="Anim audition btn" tool_tip="Executar esta animação somente para você ver." width="125"/>
+ <button label="Tocar inworld" label_selected="Parar" left="20" name="Anim play btn" tool_tip="Tocar essa animação de forma que outros possam ver" width="131"/>
+ <button label="Executar localmente" label_selected="Parar" left="162" name="Anim audition btn" tool_tip="Tocar essa animação de forma que apenas você possa ver" width="125"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_classified.xml b/indra/newview/skins/default/xui/pt/floater_preview_classified.xml
index 0e8814b9f8..bb626430ed 100644
--- a/indra/newview/skins/default/xui/pt/floater_preview_classified.xml
+++ b/indra/newview/skins/default/xui/pt/floater_preview_classified.xml
@@ -1,2 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="classified_preview" title="INFORMAÇÃO DO ANÚNCIO CLASSIFICADO"/>
+<floater name="classified_preview" title="INFORMAÇÕES CLASSIFICADAS">
+ <floater.string name="Title">
+ Classificados: [NAME]
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_event.xml b/indra/newview/skins/default/xui/pt/floater_preview_event.xml
index c03feacf0c..b422580f3b 100644
--- a/indra/newview/skins/default/xui/pt/floater_preview_event.xml
+++ b/indra/newview/skins/default/xui/pt/floater_preview_event.xml
@@ -1,2 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="event_preview" title="INFORMAÇÃO DO EVENTO"/>
+<floater name="event_preview" title="DADOS DO EVENTO">
+ <floater.string name="Title">
+ Evento: [NAME]
+ </floater.string>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml b/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml
index 87bf86c282..48f27f1968 100644
--- a/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml
+++ b/indra/newview/skins/default/xui/pt/floater_preview_gesture.xml
@@ -1,14 +1,32 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="gesture_preview">
- <string name="stop_txt">
+ <floater.string name="step_anim">
+ Selecionar animação:
+ </floater.string>
+ <floater.string name="step_sound">
+ Selecionar animação:
+ </floater.string>
+ <floater.string name="step_chat">
+ Diga por bate-papo:
+ </floater.string>
+ <floater.string name="step_wait">
+ Espere:
+ </floater.string>
+ <floater.string name="stop_txt">
Parar
- </string>
- <string name="preview_txt">
+ </floater.string>
+ <floater.string name="preview_txt">
Prévia
- </string>
- <string name="none_text">
+ </floater.string>
+ <floater.string name="none_text">
-- Nenhum --
- </string>
+ </floater.string>
+ <floater.string name="Title">
+ Gesto: [NAME]
+ </floater.string>
+ <text name="name_text">
+ Nome:
+ </text>
<text name="desc_label">
Descrição:
</text>
@@ -22,37 +40,30 @@
<text name="key_label">
Tecla de Atalho:
</text>
- <combo_box label="Nenhum" name="modifier_combo" left="116" width="76"/>
- <combo_box label="Nenhum" name="key_combo" width="76" left_delta="80"/>
+ <combo_box label="Nenhum" left="116" name="modifier_combo" width="76"/>
+ <combo_box label="Nenhum" left_delta="80" name="key_combo" width="76"/>
<text name="library_label">
Biblioteca:
</text>
+ <scroll_list name="library_list" width="84"/>
+ <button label="Incluir" left="118" name="add_btn" width="87"/>
<text name="steps_label">
Passos:
</text>
- <scroll_list name="library_list" width="84">
- Animação
-Som
-Bate Papo
-Esperar
- </scroll_list>
- <button label="Incluir" name="add_btn" left="118" width="87"/>
- <button label="Mover Para Cima" name="up_btn" width="114" left_delta="-13"/>
- <button label="Mover Para Baixo" name="down_btn" width="114"/>
- <button label="Remover" name="delete_btn" width="84" left_delta="13"/>
- <scroll_list left="226" name="step_list" width="205" />
- <text name="help_label">
- Todos os passos acontecem
-simultaneamente, a menos que
-você inclua passos de espera.
- </text>
+ <scroll_list left="226" name="step_list" width="205"/>
+ <button label="P/ cima" left_delta="-13" name="up_btn" width="114"/>
+ <button label="P/ baixo" name="down_btn" width="114"/>
+ <button label="Remover" left_delta="13" name="delete_btn" width="84"/>
<radio_group name="animation_trigger_type">
- <radio_item name="start" label="Iniciar" />
- <radio_item name="stop" label="Parar" />
+ <radio_item label="OK" name="start"/>
+ <radio_item label="Pare" name="stop"/>
</radio_group>
- <check_box bottom_delta="34" label="até que as animações estejam &#10;concluídas" name="wait_anim_check"/>
+ <check_box bottom_delta="34" label="até que as animações estejam concluídas" name="wait_anim_check"/>
<check_box bottom_delta="-30" label="tempo em segundos" name="wait_time_check"/>
- <line_editor left_delta="130" name="wait_time_editor" />
+ <line_editor left_delta="130" name="wait_time_editor"/>
+ <text name="help_label">
+ Se não incluir etapas de espera, todas as etapas ocorrem ao mesmo tempo.
+ </text>
<check_box label="Ativar" name="active_check" tool_tip="Gestos ativos podem ser gatilhados escrevendo suas frases de gatilho no chat ou através de suas teclas de atalho. Gestos normalmente ficam inativos quando existe um conflito nas teclas de atalho."/>
<button label="Prévia" name="preview_btn"/>
<button label="Salvar" name="save_btn"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_gesture_info.xml b/indra/newview/skins/default/xui/pt/floater_preview_gesture_info.xml
new file mode 100644
index 0000000000..aabcff70d3
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_preview_gesture_info.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="ATALHO DE GESTO"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_gesture_shortcut.xml b/indra/newview/skins/default/xui/pt/floater_preview_gesture_shortcut.xml
new file mode 100644
index 0000000000..64bb7785f6
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_preview_gesture_shortcut.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="ATALHO DE GESTO">
+ <text name="trigger_label">
+ Bate-papo:
+ </text>
+ <text name="key_label">
+ Tecla:
+ </text>
+ <combo_box label="Nenhum" name="modifier_combo"/>
+ <combo_box label="Nenhum" name="key_combo"/>
+ <text name="replace_text" tool_tip="Substituir a(s) palavra(s) de comando. Por exemplo, substitua o comando &apos;olá&apos; por &apos;oi&apos; para trocar &apos;Olá, tudo bem&apos; por &apos;Oi tudo bem&apos;. O gesto também será executado.">
+ Trocar:
+ </text>
+ <line_editor name="replace_editor" tool_tip="Substituir a(s) palavra(s) de comando. Por exemplo, substitua o comando &apos;olá&apos; por &apos;oi&apos; para trocar &apos;Olá, tudo bem&apos; por &apos;Oi tudo bem&apos;. O gesto também será executado."/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_gesture_steps.xml b/indra/newview/skins/default/xui/pt/floater_preview_gesture_steps.xml
new file mode 100644
index 0000000000..aabcff70d3
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_preview_gesture_steps.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Gesture" title="ATALHO DE GESTO"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_notecard.xml b/indra/newview/skins/default/xui/pt/floater_preview_notecard.xml
index 6f8944942a..d094c1b63a 100644
--- a/indra/newview/skins/default/xui/pt/floater_preview_notecard.xml
+++ b/indra/newview/skins/default/xui/pt/floater_preview_notecard.xml
@@ -1,16 +1,20 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="preview notecard" title="NOTA:">
- <button label="Salvar" label_selected="Salvar" name="Save"/>
+<floater name="preview notecard" title="Anotação:">
+ <floater.string name="no_object">
+ O objeto com esta anotação não foi encontrado.
+ </floater.string>
+ <floater.string name="not_allowed">
+ Você não está autorizado a ler esta nota.
+ </floater.string>
+ <floater.string name="Title">
+ Anotação: [NAME]
+ </floater.string>
<text name="desc txt">
Descrição:
</text>
<text_editor name="Notecard Editor">
Carregando...
</text_editor>
- <string name="no_object">
- Não foi possível encontrar o objeto que contém esta nota.
- </string>
- <string name="not_allowed">
- Você não tem permissão de visualizar esta nota.
- </string>
+ <button label="Salvar" label_selected="Salvar" name="Save"/>
+ <button label="Excluir" label_selected="Excluir" name="Delete"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_sound.xml b/indra/newview/skins/default/xui/pt/floater_preview_sound.xml
index 3dd2f84f91..7c5a1538f2 100644
--- a/indra/newview/skins/default/xui/pt/floater_preview_sound.xml
+++ b/indra/newview/skins/default/xui/pt/floater_preview_sound.xml
@@ -1,8 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_sound">
+ <floater.string name="Title">
+ Som: [NAME]
+ </floater.string>
<text name="desc txt">
Descrição:
</text>
- <button left_delta="-132" label="Executar in-World" label_selected="Executar in-World" name="Sound play btn" tool_tip="Executar este som para que todos possam ouvi-lo."/>
- <button width="135" left="152" label="Executar Localmente" label_selected="Executar Localmente" name="Sound audition btn" tool_tip="Executar este som somente para você ouvir."/>
+ <button label="Tocar inworld" label_selected="Tocar inworld" left_delta="-132" name="Sound play btn" tool_tip="Tocar som para todos ouvirem"/>
+ <button label="Executar Localmente" label_selected="Executar Localmente" left="152" name="Sound audition btn" tool_tip="Tocar som de forma que apenas você possa ouvir" width="135"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_preview_texture.xml b/indra/newview/skins/default/xui/pt/floater_preview_texture.xml
index 72bc42fa19..6f39635240 100644
--- a/indra/newview/skins/default/xui/pt/floater_preview_texture.xml
+++ b/indra/newview/skins/default/xui/pt/floater_preview_texture.xml
@@ -1,9 +1,47 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview_texture">
+ <floater.string name="Title">
+ Textura: [NAME]
+ </floater.string>
+ <floater.string name="Copy">
+ Copiar para inventário
+ </floater.string>
<text name="desc txt">
Descrição:
</text>
<text name="dimensions">
- Dimensões: [WIDTH] x [HEIGHT]
+ [WIDTH]px x [HEIGHT]px
</text>
+ <text name="aspect_ratio">
+ Visualizar relação de aspecto
+ </text>
+ <combo_box name="combo_aspect_ratio" tool_tip="Visualizar com proporção de aspecto fixa">
+ <combo_item name="Unconstrained">
+ Sem limites
+ </combo_item>
+ <combo_item name="1:1" tool_tip="Símbolo ou perfil RW do grupo">
+ 1:1
+ </combo_item>
+ <combo_item name="4:3" tool_tip="[SECOND_LIFE] perfil">
+ 4:3
+ </combo_item>
+ <combo_item name="10:7" tool_tip="Procurar anúncios classificados e marcos">
+ 10:7
+ </combo_item>
+ <combo_item name="3:2" tool_tip="Sobre terrenos">
+ 3:2
+ </combo_item>
+ <combo_item name="16:10">
+ 16:10
+ </combo_item>
+ <combo_item name="16:9" tool_tip="Perfis destacados">
+ 16:9
+ </combo_item>
+ <combo_item name="2:1">
+ 2:1
+ </combo_item>
+ </combo_box>
+ <button label="OK" name="Keep"/>
+ <button label="Descartar" name="Discard"/>
+ <button label="Salvar como" name="save_tex_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_publish_classified.xml b/indra/newview/skins/default/xui/pt/floater_publish_classified.xml
new file mode 100644
index 0000000000..988f8f2ce1
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_publish_classified.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="publish_classified" title="Publicando anúncio">
+ <text name="explanation_text">
+ Seu anúncio será publicado por uma semana a partir da data de publicação.
+
+Lembre-se, o pagamento do anúncio não é reembolsável
+ </text>
+ <spinner label="Preço do anúncio:" name="price_for_listing" tool_tip="Preço do anúncio." value="50"/>
+ <text name="l$_text" value="L$"/>
+ <text name="more_info_text">
+ Mais informações (link para ajuda com anúncios)
+ </text>
+ <button label="Publicar" name="publish_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_report_abuse.xml b/indra/newview/skins/default/xui/pt/floater_report_abuse.xml
index 0d226a9502..08413a9231 100644
--- a/indra/newview/skins/default/xui/pt/floater_report_abuse.xml
+++ b/indra/newview/skins/default/xui/pt/floater_report_abuse.xml
@@ -1,11 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="floater_report_abuse" title="REPORTAR ABUSO">
- <check_box label="Incluir cópia da tela" name="screen_check"/>
+ <floater.string name="Screenshot">
+ Captura de tela
+ </floater.string>
+ <check_box label="Usar esta captura de tela" name="screen_check"/>
<text name="reporter_title">
Denunciador:
</text>
<text name="reporter_field">
- Loremipsum Dolorsitamut
+ Loremipsum Dolorsitamut Longnamez
</text>
<text name="sim_title">
Região:
@@ -20,11 +23,11 @@
{128.1, 128.1, 15.4}
</text>
<text name="select_object_label">
- Clique no botão e em seguida no objeto:
+ Clique no botão e em seguida no objeto abusivo:
</text>
<button label="" label_selected="" name="pick_btn" tool_tip="Object Picker - Identifica um objeto como o assunto deste report"/>
<text name="object_name_label">
- Nome:
+ Objeto:
</text>
<text name="object_name">
Consetetur Sadipscing
@@ -33,54 +36,53 @@
Proprietário:
</text>
<text name="owner_name">
- Hendrerit Vulputate
+ Hendrerit Vulputate Kamawashi Longname
</text>
<combo_box name="category_combo" tool_tip="Categoria -- Selecione a categoria que melhor descreve este report">
- <combo_box.item name="Select_category" label="Selecionar categoria"/>
- <combo_box.item name="Age__Age_play" label="Idade &gt; Idade no jogo"/>
- <combo_box.item name="Age__Adult_resident_on_Teen_Second_Life" label="Idade &gt; Residente adulto no Second Life Jovem"/>
- <combo_box.item name="Age__Underage_resident_outside_of_Teen_Second_Life" label="Idade &gt; Residente menor de idade fora do Second Life Teen"/>
- <combo_box.item name="Assault__Combat_sandbox___unsafe_area" label="Assalto &gt; Sandbox de combate / área não segura"/>
- <combo_box.item name="Assault__Safe_area" label="Assalto &gt; Ãrea segura"/>
- <combo_box.item name="Assault__Weapons_testing_sandbox" label="Assalto &gt; Testando armas em sandbox"/>
- <combo_box.item name="Commerce__Failure_to_deliver_product_or_service" label="Comércio &gt; Falha em enviar produto ou serviço"/>
- <combo_box.item name="Disclosure__Real_world_information" label="Revelar &gt; Informação do mundo real"/>
- <combo_box.item name="Disclosure__Remotely_monitoring chat" label="Revelar &gt; Conversa monitorada remotamente"/>
- <combo_box.item name="Disclosure__Second_Life_information_chat_IMs" label="Revelar &gt; Informação do Second Life/conversa/MIs"/>
- <combo_box.item name="Disturbing_the_peace__Unfair_use_of_region_resources" label="Distúrbio da paz &gt; Uso injusto dos recursos da região"/>
- <combo_box.item name="Disturbing_the_peace__Excessive_scripted_objects" label="Distúrbio da paz &gt; Objetos com excesso de scripts"/>
- <combo_box.item name="Disturbing_the_peace__Object_littering" label="Distúrbio da paz &gt; Objeto despejando lixo"/>
- <combo_box.item name="Disturbing_the_peace__Repetitive_spam" label="Distúrbio da paz &gt; Spam repetitivo"/>
- <combo_box.item name="Disturbing_the_peace__Unwanted_advert_spam" label="Distúrbio da paz &gt; Spam de anúncio indesejado"/>
- <combo_box.item name="Fraud__L$" label="Fraude &gt; L$"/>
- <combo_box.item name="Fraud__Land" label="Fraude &gt; Terra"/>
- <combo_box.item name="Fraud__Pyramid_scheme_or_chain_letter" label="Fraude &gt; Esquema de pirâmide ou cartas encadeadas"/>
- <combo_box.item name="Fraud__US$" label="Fraude &gt; R$"/>
- <combo_box.item name="Harassment__Advert_farms___visual_spam" label="Perturbação &gt; Fazendas de Anúncios / spam visual"/>
- <combo_box.item name="Harassment__Defaming_individuals_or_groups" label="Perturbação &gt; Difamação de indivíduos ou grupos"/>
- <combo_box.item name="Harassment__Impeding_movement" label="Perturbação &gt; Impedindo movimentos"/>
- <combo_box.item name="Harassment__Sexual_harassment" label="Perturbação &gt; Perturbação sexual"/>
- <combo_box.item name="Harassment__Solicting_inciting_others_to_violate_ToS" label="Perturbação &gt; Solicitando/incitando outros a violarem o ToS"/>
- <combo_box.item name="Harassment__Verbal_abuse" label="Perturbação &gt; Abuso verbal"/>
- <combo_box.item name="Indecency__Broadly_offensive_content_or_conduct" label="Indecência &gt; Conteúdo ou conduta amplamente ofensivos"/>
- <combo_box.item name="Indecency__Inappropriate_avatar_name" label="Indecência &gt; Nome de avatar inapropriado"/>
- <combo_box.item name="Indecency__Mature_content_in_PG_region" label="Indecência &gt; Conduta ou conteúdo inapropriados numa região PG"/>
- <combo_box.item name="Indecency__Inappropriate_content_in_Mature_region" label="Indecência &gt; Conduta ou conteúdo inapropriados numa região Mature"/>
- <combo_box.item name="Intellectual_property_infringement_Content_Removal" label="Violação de propriedade intelectual &gt; Remoção de Conteúdo"/>
- <combo_box.item name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit" label="Violação de Propriedade intelectual &gt; Cópia Ilegal ou Aproveitar-se de Permissões"/>
- <combo_box.item name="Intolerance" label="Intolerância"/>
- <combo_box.item name="Land__Abuse_of_sandbox_resources" label="Terra &gt; Abuso dos recursos da sandbox"/>
- <combo_box.item name="Land__Encroachment__Objects_textures" label="Terra &gt; Invasão &gt; Objetos/texturas"/>
- <combo_box.item name="Land__Encroachment__Particles" label="Terra &gt; Invasão &gt; Partículas"/>
- <combo_box.item name="Land__Encroachment__Trees_plants" label="Terra &gt; Violação &gt; Ãrvores/plantas"/>
- <combo_box.item name="Wagering_gambling" label="Apostas/jogos de azar"/>
- <combo_box.item name="Other" label="Outro"/>
+ <combo_box.item label="Selecionar categoria" name="Select_category"/>
+ <combo_box.item label="Idade &gt; Idade no jogo" name="Age__Age_play"/>
+ <combo_box.item label="Idade &gt; Residente adulto ou adolescente" name="Age__Adult_resident_on_Teen_Second_Life"/>
+ <combo_box.item label="Idade &gt; Residente menor de idade, fora do Second Life teen" name="Age__Underage_resident_outside_of_Teen_Second_Life"/>
+ <combo_box.item label="Assalto &gt; Sandbox de combate / área não segura" name="Assault__Combat_sandbox___unsafe_area"/>
+ <combo_box.item label="Assalto &gt; Ãrea segura" name="Assault__Safe_area"/>
+ <combo_box.item label="Assalto &gt; Testando armas em sandbox" name="Assault__Weapons_testing_sandbox"/>
+ <combo_box.item label="Comércio &gt; Falha em enviar produto ou serviço" name="Commerce__Failure_to_deliver_product_or_service"/>
+ <combo_box.item label="Revelar &gt; Informação do mundo real" name="Disclosure__Real_world_information"/>
+ <combo_box.item label="Revelar &gt; Conversa monitorada remotamente" name="Disclosure__Remotely_monitoring chat"/>
+ <combo_box.item label="Revelar &gt; Informação do Second Life/conversa/MIs" name="Disclosure__Second_Life_information_chat_IMs"/>
+ <combo_box.item label="Distúrbio da paz &gt; Uso injusto dos recursos da região" name="Disturbing_the_peace__Unfair_use_of_region_resources"/>
+ <combo_box.item label="Distúrbio da paz &gt; Objetos com excesso de scripts" name="Disturbing_the_peace__Excessive_scripted_objects"/>
+ <combo_box.item label="Distúrbio da paz &gt; Objeto despejando lixo" name="Disturbing_the_peace__Object_littering"/>
+ <combo_box.item label="Distúrbio da paz &gt; Spam repetitivo" name="Disturbing_the_peace__Repetitive_spam"/>
+ <combo_box.item label="Distúrbio da paz &gt; Spam de anúncio indesejado" name="Disturbing_the_peace__Unwanted_advert_spam"/>
+ <combo_box.item label="Fraude &gt; L$" name="Fraud__L$"/>
+ <combo_box.item label="Fraude &gt; Terra" name="Fraud__Land"/>
+ <combo_box.item label="Fraude &gt; Esquema de pirâmide ou cartas encadeadas" name="Fraud__Pyramid_scheme_or_chain_letter"/>
+ <combo_box.item label="Fraude &gt; R$" name="Fraud__US$"/>
+ <combo_box.item label="Perturbação &gt; Fazendas de Anúncios / spam visual" name="Harassment__Advert_farms___visual_spam"/>
+ <combo_box.item label="Perturbação &gt; Difamação de indivíduos ou grupos" name="Harassment__Defaming_individuals_or_groups"/>
+ <combo_box.item label="Perturbação &gt; Impedindo movimentos" name="Harassment__Impeding_movement"/>
+ <combo_box.item label="Perturbação &gt; Perturbação sexual" name="Harassment__Sexual_harassment"/>
+ <combo_box.item label="Perturbação &gt; Solicitando/incitando outros a violarem o ToS" name="Harassment__Solicting_inciting_others_to_violate_ToS"/>
+ <combo_box.item label="Perturbação &gt; Abuso verbal" name="Harassment__Verbal_abuse"/>
+ <combo_box.item label="Indecência &gt; Conteúdo ou conduta amplamente ofensivos" name="Indecency__Broadly_offensive_content_or_conduct"/>
+ <combo_box.item label="Indecência &gt; Nome de avatar inapropriado" name="Indecency__Inappropriate_avatar_name"/>
+ <combo_box.item label="Indecência &gt; Conduta ou conteúdo inapropriados numa região PG" name="Indecency__Mature_content_in_PG_region"/>
+ <combo_box.item label="Indecência &gt; Conduta ou conteúdo inapropriados numa região Mature" name="Indecency__Inappropriate_content_in_Mature_region"/>
+ <combo_box.item label="Violação de propriedade intelectual &gt; Remoção de Conteúdo" name="Intellectual_property_infringement_Content_Removal"/>
+ <combo_box.item label="Violação de Propriedade intelectual &gt; Cópia Ilegal ou Aproveitar-se de Permissões" name="Intellectual_property_infringement_CopyBot_or_Permissions_Exploit"/>
+ <combo_box.item label="Intolerância" name="Intolerance"/>
+ <combo_box.item label="Terra &gt; Abuso dos recursos da sandbox" name="Land__Abuse_of_sandbox_resources"/>
+ <combo_box.item label="Terra &gt; Invasão &gt; Objetos/texturas" name="Land__Encroachment__Objects_textures"/>
+ <combo_box.item label="Terra &gt; Invasão &gt; Partículas" name="Land__Encroachment__Particles"/>
+ <combo_box.item label="Terra &gt; Violação &gt; Ãrvores/plantas" name="Land__Encroachment__Trees_plants"/>
+ <combo_box.item label="Apostas/jogos de azar" name="Wagering_gambling"/>
+ <combo_box.item label="Outro" name="Other"/>
</combo_box>
<text name="abuser_name_title">
Nome do Denunciado:
</text>
- <button label="Escolher Residente" label_selected="" name="select_abuser" tool_tip="Selecione o nome do Denunciado numa lista"/>
- <check_box label="Não sei o nome do denunciado" name="omit_abuser_name" tool_tip="Marque aqui se você não consegue fornecer o nome do denunciado"/>
+ <button label="Selecionar" label_selected="" name="select_abuser" tool_tip="Selecione o nome do Denunciado numa lista"/>
<text name="abuser_name_title2">
Local do Abuso:
</text>
@@ -91,13 +93,11 @@
Detalhes:
</text>
<text name="bug_aviso">
- Por favor, seja específico(a) sobre data, localidade,
-natureza do abuso, texto relevante de conversa/MI e
-selecione o objeto, se possível.
+ Seja o mais específico possível
</text>
<text name="incomplete_title">
- Nota: Relatos incompletos não serão investigados.
+ * Denúncias incompletas não serão investigadas
</text>
- <button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/>
<button label="Reportar Abuso" label_selected="Reportar Abuso" name="send_btn"/>
+ <button label="Cancelar" label_selected="Cancelar" name="cancel_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_script_debug_panel.xml b/indra/newview/skins/default/xui/pt/floater_script_debug_panel.xml
new file mode 100644
index 0000000000..e70a30fa24
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_script_debug_panel.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="script" short_title="[ALL SCRIPTS]" title="[ALL SCRIPTS]"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_script_limits.xml b/indra/newview/skins/default/xui/pt/floater_script_limits.xml
new file mode 100644
index 0000000000..64a8a49c85
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_script_limits.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="scriptlimits" title="DADOS DO SCRIPT"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_script_preview.xml b/indra/newview/skins/default/xui/pt/floater_script_preview.xml
index 3c0570791c..5be866d052 100644
--- a/indra/newview/skins/default/xui/pt/floater_script_preview.xml
+++ b/indra/newview/skins/default/xui/pt/floater_script_preview.xml
@@ -1,5 +1,8 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="preview lsl text" title="SCRIPT: ROTATION SCRIPT">
+ <floater.string name="Title">
+ SCRIPT: [NAME]
+ </floater.string>
<text name="desc txt">
Descrição:
</text>
diff --git a/indra/newview/skins/default/xui/pt/floater_script_queue.xml b/indra/newview/skins/default/xui/pt/floater_script_queue.xml
index 6e0e174c07..5fb6dd1c35 100644
--- a/indra/newview/skins/default/xui/pt/floater_script_queue.xml
+++ b/indra/newview/skins/default/xui/pt/floater_script_queue.xml
@@ -1,4 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="queue" title="RESETAR PROGRESSO">
+ <floater.string name="Starting">
+ Iniciando [START] de [COUNT] items.
+ </floater.string>
+ <floater.string name="Done">
+ Pronto.
+ </floater.string>
+ <floater.string name="Resetting">
+ Redefinindo
+ </floater.string>
+ <floater.string name="Running">
+ Executando
+ </floater.string>
+ <floater.string name="NotRunning">
+ Inerte
+ </floater.string>
<button label="Fechar" label_selected="Fechar" name="close"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_script_search.xml b/indra/newview/skins/default/xui/pt/floater_script_search.xml
index 3a62f1711f..8878590a4e 100644
--- a/indra/newview/skins/default/xui/pt/floater_script_search.xml
+++ b/indra/newview/skins/default/xui/pt/floater_script_search.xml
@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="script search" title="BUSCA DE SCRIPT" width="320">
- <check_box label="Não diferenciar Maiúsculas de Minúsculas" name="case_text" left="75"/>
+<floater name="script search" title="BUSCAR SCRIPT" width="320">
+ <check_box label="Não diferenciar Maiúsculas de Minúsculas" left="75" name="case_text"/>
<button label="Buscar" label_selected="Buscar" name="search_btn" width="85"/>
- <button label="Substituir" label_selected="Substituir" name="replace_btn" left="100" width="85"/>
- <button label="Substituir Tudo" label_selected="Substituir Tudo" name="replace_all_btn" left="190" width="122"/>
+ <button label="Substituir" label_selected="Substituir" left="100" name="replace_btn" width="85"/>
+ <button label="Substituir Tudo" label_selected="Substituir Tudo" left="190" name="replace_all_btn" width="122"/>
<text name="txt" width="65">
Buscar
</text>
<text name="txt2" width="65">
Substituir
</text>
- <line_editor left="75" name="search_text" width="240" />
- <line_editor left="75" name="replace_text" width="240" />
+ <line_editor left="75" name="search_text" width="240"/>
+ <line_editor left="75" name="replace_text" width="240"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_search.xml b/indra/newview/skins/default/xui/pt/floater_search.xml
new file mode 100644
index 0000000000..4bf7181180
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_search.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_search" title="BUSCAR">
+ <floater.string name="loading_text">
+ Carregando...
+ </floater.string>
+ <floater.string name="done_text">
+ Pronto
+ </floater.string>
+ <layout_stack name="stack1">
+ <layout_panel name="browser_layout">
+ <text name="refresh_search">
+ Buscar novamente com status God
+ </text>
+ </layout_panel>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_select_key.xml b/indra/newview/skins/default/xui/pt/floater_select_key.xml
index e41a565d11..7264a5a713 100644
--- a/indra/newview/skins/default/xui/pt/floater_select_key.xml
+++ b/indra/newview/skins/default/xui/pt/floater_select_key.xml
@@ -2,6 +2,6 @@
<floater name="modal container" title="">
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
<text name="Save item as:">
- Aperte uma tecla para selecionar
+ Pressione uma tecla para definir o seu botão Falar.
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_sell_land.xml b/indra/newview/skins/default/xui/pt/floater_sell_land.xml
index f58c4098ef..e6d4dc7ed6 100644
--- a/indra/newview/skins/default/xui/pt/floater_sell_land.xml
+++ b/indra/newview/skins/default/xui/pt/floater_sell_land.xml
@@ -1,65 +1,65 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="sell land" title="VENDER TERRENO">
- <scroll_container name="profile_scroll">
- <panel name="scroll_content_panel">
- <text name="info_parcel_label">
- Lote:
- </text>
- <text name="info_parcel">
- Nome do Lote
- </text>
- <text name="info_size_label">
- Tamanho:
- </text>
- <text name="info_size">
- [AREA] m²
- </text>
- <text name="info_action" bottom_delta="-67">
- Para vender este lote:
- </text>
- <icon bottom_delta="-66" name="step_price" />
- <text name="price_label">
- Defina um preço:
- </text>
- <text name="price_text">
- Escolha um preço apropriado para esta terra.
- </text>
- <text name="price_ld">
- L$
- </text>
- <text name="price_per_m">
- (L$[PER_METER] por m²)
- </text>
- <text name="sell_to_label">
- Vender esta terra para:
- </text>
- <text name="sell_to_text">
- Escolha se venderá para qualquer um ou para um comprador em
-particular.
- </text>
- <combo_box name="sell_to" bottom_delta="-32">
- <combo_box.item name="--selectone--" label="Selecione um --" />
- <combo_box.item name="Anyone" label="Qualquer um" />
- <combo_box.item name="Specificuser:" label="Usuário Específico:" />
- </combo_box>
- <button label="Selecione..." name="sell_to_select_agent"/>
- <text name="sell_objects_label">
- Vender os objetos com a terra?
- </text>
- <text name="sell_objects_text">
- Os objetos tranferíveis do proprietário do terreno que estão neste
-lote irão mudar de propriedade.
- </text>
- <radio_group name="sell_objects" bottom_delta="-58">
- <radio_item name="no" label="Não, manter a propriedade sobre os objetos" />
- <radio_item name="yes" label="Sim, vender objetos com a terra" />
- </radio_group>
- <button label="Mostrar Objetos" name="show_objects"/>
- <text name="nag_message_label">
- LEMBRE-SE: Todas as vendas são finais.
- </text>
- <button label="Definir Terra para Venda" name="sell_btn"/>
- <button label="Cancelar" name="cancel_btn"/>
- </panel>
- </scroll_container>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="info_parcel_label">
+ Lote:
+ </text>
+ <text name="info_parcel">
+ NOME DO LOTE
+ </text>
+ <text name="info_size_label">
+ Tamanho:
+ </text>
+ <text name="info_size">
+ [AREA] m²
+ </text>
+ <text bottom_delta="-67" name="info_action">
+ Para vender este terreno:
+ </text>
+ <text name="price_label">
+ 1. Preço:
+ </text>
+ <text name="price_text">
+ Determine o preço adequado.
+ </text>
+ <text name="price_ld">
+ L$
+ </text>
+ <line_editor name="price">
+ 0
+ </line_editor>
+ <text name="price_per_m">
+ (L$[PER_METER] por m²)
+ </text>
+ <text name="sell_to_label">
+ 2. Vender para:
+ </text>
+ <text name="sell_to_text">
+ Vender para qualquer pessoa ou determinado comprador.
+ </text>
+ <combo_box bottom_delta="-32" name="sell_to">
+ <combo_box.item label="- Selecione -" name="--selectone--"/>
+ <combo_box.item label="Todos" name="Anyone"/>
+ <combo_box.item label="Pessoa específica:" name="Specificuser:"/>
+ </combo_box>
+ <button label="Selecionar" name="sell_to_select_agent"/>
+ <text name="sell_objects_label">
+ 3. Vender o terreno com os objetos?
+ </text>
+ <text name="sell_objects_text">
+ O objetos transferíveis do terreno passam a ser do novo dono.
+ </text>
+ <radio_group bottom_delta="-58" name="sell_objects">
+ <radio_item label="Não, os objetos continuam sendo meus" name="no"/>
+ <radio_item label="Sim, vender o terreno com os objetos" name="yes"/>
+ </radio_group>
+ <button label="Mostrar objetos" name="show_objects"/>
+ <text name="nag_message_label">
+ LEMBRE-SE: Qualquer transação de compra e venda é irreversível.
+ </text>
+ <button label="Colocar terreno à venda" name="sell_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ </panel>
+ </scroll_container>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_settings_debug.xml b/indra/newview/skins/default/xui/pt/floater_settings_debug.xml
index 394a9771e0..c6694d13b2 100644
--- a/indra/newview/skins/default/xui/pt/floater_settings_debug.xml
+++ b/indra/newview/skins/default/xui/pt/floater_settings_debug.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="settings_debug" title="CONFIGURAÇÕES DE DEBUG">
- <combo_box name="boolean_combo">
- <combo_box.item name="TRUE" label="VERDADEIRO" />
- <combo_box.item name="FALSE" label="FALSO" />
- </combo_box>
- <color_swatch label="Cor" name="color_swatch"/>
+<floater name="settings_debug" title="DEBUG SETTINGS">
+ <radio_group name="boolean_combo">
+ <radio_item label="TRUE" name="TRUE" value="verdadeiro"/>
+ <radio_item label="FALSE" name="FALSE" value=""/>
+ </radio_group>
+ <color_swatch label="Cor" name="val_color_swatch"/>
<spinner label="x" name="val_spinner_1"/>
<spinner label="x" name="val_spinner_2"/>
<spinner label="x" name="val_spinner_3"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_snapshot.xml b/indra/newview/skins/default/xui/pt/floater_snapshot.xml
index c3c4c73a89..1d86b0d413 100644
--- a/indra/newview/skins/default/xui/pt/floater_snapshot.xml
+++ b/indra/newview/skins/default/xui/pt/floater_snapshot.xml
@@ -1,79 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Snapshot" title="PRÉVIA DA FOTO">
- <text name="type_label">
- Destino da foto
- </text>
- <radio_group label="Tipo de Foto" name="snapshot_type_radio">
- <radio_item name="postcard" label="Enviar por email" />
- <radio_item name="texture" label="Salvar no seu inventário (L$[AMOUNT])" />
- <radio_item name="local" label="Salvar no seu disco rígido" />
- </radio_group>
- <text name="file_size_label">
- Tamanho do arquivo: [SIZE] KB
- </text>
- <button label="Atualizar a foto" name="new_snapshot_btn"/>
- <button label="Enviar" name="send_btn"/>
- <button label="Salvar (L$[AMOUNT])" name="upload_btn"/>
- <flyout_button label="Salvar" name="save_btn" tool_tip="Salvar imagem em um arquivo">
- <flyout_button.item name="save_item" label="Salvar"/>
- <flyout_button.item name="saveas_item" label="Salvar como..."/>
- </flyout_button>
- <button label="Cancelar" name="discard_btn"/>
- <button label="Mais &gt;" name="more_btn" tool_tip="Opções Avançadas"/>
- <button label="&lt; Menos" name="less_btn" tool_tip="Opções Avançadas"/>
- <text name="type_label2">
- Tamanho
- </text>
- <text name="format_label">
- Formato
- </text>
- <combo_box label="Resolução" name="postcard_size_combo">
- <combo_box.item name="CurrentWindow" label="Janela Atual" />
- <combo_box.item name="640x480" label="640x480" />
- <combo_box.item name="800x600" label="800x600" />
- <combo_box.item name="1024x768" label="1024x768" />
- <combo_box.item name="Custom" label="Customizado" />
- </combo_box>
- <combo_box label="Resolução" name="texture_size_combo">
- <combo_box.item name="CurrentWindow" label="Janela Atual" />
- <combo_box.item name="Small(128x128)" label="Pequeno (128x128)" />
- <combo_box.item name="Medium(256x256)" label="Médio (256x256)" />
- <combo_box.item name="Large(512x512)" label="Grande (512x512)" />
- <combo_box.item name="Custom" label="Customizado" />
- </combo_box>
- <combo_box label="Resolução" name="local_size_combo">
- <combo_box.item name="CurrentWindow" label="Janela Atual" />
- <combo_box.item name="320x240" label="320x240" />
- <combo_box.item name="640x480" label="640x480" />
- <combo_box.item name="800x600" label="800x600" />
- <combo_box.item name="1024x768" label="1024x768" />
- <combo_box.item name="1280x1024" label="1280x1024" />
- <combo_box.item name="1600x1200" label="1600x1200" />
- <combo_box.item name="Custom" label="Customizado" />
- </combo_box>
- <combo_box label="Formato" name="local_format_combo">
- <combo_box.item name="PNG" label="PNG" />
- <combo_box.item name="JPEG" label="JPEG" />
- <combo_box.item name="BMP" label="BMP" />
- </combo_box>
- <spinner label="Largura" name="snapshot_width" label_width="41" width="101"/>
- <spinner label="Altura" name="snapshot_height" label_width="31" width="91" left="119"/>
- <check_box label="Restringir proporções" name="keep_aspect_check"/>
- <slider label="Qualidade da Imagem" name="image_quality_slider"/>
- <text name="layer_type_label">
- Capturar:
- </text>
- <combo_box label="Camadas da Imagem" name="layer_types">
- <combo_box.item name="Colors" label="Cores" />
- <combo_box.item name="Depth" label="Formato" />
- <combo_box.item name="ObjectMattes" label="Decoração do Objeto" />
- </combo_box>
- <check_box label="Mostrar interface na Foto" name="ui_check"/>
- <check_box bottom_delta="-17" label="Mostrar Objetos HUD na Foto" name="hud_check"/>
- <check_box bottom_delta="-17" label="Manter aberto após salvar" name="keep_open_check"/>
- <check_box bottom_delta="-17" label="Quadro Congelado&#10; (prévia da tela inteira)" name="freeze_frame_check"/>
- <check_box bottom_delta="-29" label="Auto-atualizar" name="auto_snapshot_check"/>
- <string name="unknown">
+<floater name="Snapshot" title="Foto">
+ <floater.string name="unknown">
desconhecido
- </string>
+ </floater.string>
+ <button label="Atualizar a foto" name="new_snapshot_btn"/>
+ <line_editor label="Descrição" name="description"/>
+ <panel name="panel_snapshot_main">
+ <button label="Compartilhar foto" name="share"/>
+ <button label="Salvar foto" name="save"/>
+ <button label="Usar como foto do perfil" name="set_profile_pic"/>
+ </panel>
+ <panel name="panel_snapshot_share">
+ <button label="Compartilhar na web" name="share_to_web"/>
+ <button label="Enviar foto por email" name="share_to_email"/>
+ <button label="Atrás" name="cancel_share"/>
+ </panel>
+ <panel name="panel_snapshot_save">
+ <button label="Salvar no meu inventário" name="save_to_inventory"/>
+ <button label="Salvar no meu PC" name="save_to_computer"/>
+ <button label="Atrás" name="cancel_save"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_sound_preview.xml b/indra/newview/skins/default/xui/pt/floater_sound_preview.xml
index d5d252c0dd..e62260c2e3 100644
--- a/indra/newview/skins/default/xui/pt/floater_sound_preview.xml
+++ b/indra/newview/skins/default/xui/pt/floater_sound_preview.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="Sound Preview" title="SOUND.WAV">
+<floater name="Sound Preview" title="SOM.WAV">
<text name="name_label">
Nome:
</text>
diff --git a/indra/newview/skins/default/xui/pt/floater_statistics.xml b/indra/newview/skins/default/xui/pt/floater_statistics.xml
index c56c9fb2e0..ecbf638157 100644
--- a/indra/newview/skins/default/xui/pt/floater_statistics.xml
+++ b/indra/newview/skins/default/xui/pt/floater_statistics.xml
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="stats floater" title="STATÃSTICA"/>
+<floater name="stats floater" title="ESTATÃSTICAS"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_stats.xml b/indra/newview/skins/default/xui/pt/floater_stats.xml
new file mode 100644
index 0000000000..11589b31b6
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_stats.xml
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="Statistics" title="ESTATÃSTICAS">
+ <scroll_container name="statistics_scroll">
+ <container_view name="statistics_view">
+ <stat_view label="Básico" name="basic">
+ <stat_bar label="FPS" name="fps"/>
+ <stat_bar label="Bandwidth" name="bandwidth"/>
+ <stat_bar label="Bandwidth" name="packet_loss"/>
+ <stat_bar label="Ping Sim" name="ping"/>
+ </stat_view>
+ <stat_view label="Avançado" name="advanced">
+ <stat_view label="Render" name="render">
+ <stat_bar label="KTris Drawn" name="ktrisframe"/>
+ <stat_bar label="KTris Drawn" name="ktrissec"/>
+ <stat_bar label="Total Objects" name="objs"/>
+ <stat_bar label="New Objects" name="newobjs"/>
+ </stat_view>
+ <stat_view label="Texture" name="texture">
+ <stat_bar label="Count" name="numimagesstat"/>
+ <stat_bar label="Raw Count" name="numrawimagesstat"/>
+ <stat_bar label="GL Mem" name="gltexmemstat"/>
+ <stat_bar label="Formatted Mem" name="formattedmemstat"/>
+ <stat_bar label="Raw Mem" name="rawmemstat"/>
+ <stat_bar label="Bound Mem" name="glboundmemstat"/>
+ </stat_view>
+ <stat_view label="Rede" name="network">
+ <stat_bar label="Packets In" name="packetsinstat"/>
+ <stat_bar label="Packets Out" name="packetsoutstat"/>
+ <stat_bar label="Objects" name="objectkbitstat"/>
+ <stat_bar label="Texture" name="texturekbitstat"/>
+ <stat_bar label="Asset" name="assetkbitstat"/>
+ <stat_bar label="Layers" name="layerskbitstat"/>
+ <stat_bar label="Actual In" name="actualinkbitstat"/>
+ <stat_bar label="Actual Out" name="actualoutkbitstat"/>
+ <stat_bar label="VFS Pending Ops" name="vfspendingoperations"/>
+ </stat_view>
+ </stat_view>
+ <stat_view label="Simulator" name="sim">
+ <stat_bar label="Time Dilation" name="simtimedilation"/>
+ <stat_bar label="Sim FPS" name="simfps"/>
+ <stat_bar label="Physics FPS" name="simphysicsfps"/>
+ <stat_view label="Physics Details" name="physicsdetail">
+ <stat_bar label="Pinned Objects" name="physicspinnedtasks"/>
+ <stat_bar label="Low LOD Objects" name="physicslodtasks"/>
+ <stat_bar label="Memory Allocated" name="physicsmemoryallocated"/>
+ <stat_bar label="Agent Updates/Sec" name="simagentups"/>
+ <stat_bar label="Main Agents" name="simmainagents"/>
+ <stat_bar label="Child Agents" name="simchildagents"/>
+ <stat_bar label="Objects" name="simobjects"/>
+ <stat_bar label="Active Objects" name="simactiveobjects"/>
+ <stat_bar label="Active Scripts" name="simactivescripts"/>
+ <stat_bar label="Script Events" name="simscripteps"/>
+ <stat_bar label="Packets In" name="siminpps"/>
+ <stat_bar label="Packets Out" name="simoutpps"/>
+ <stat_bar label="Pending Downloads" name="simpendingdownloads"/>
+ <stat_bar label="Pending Uploads" name="simpendinguploads"/>
+ <stat_bar label="Total Unacked Bytes" name="simtotalunackedbytes"/>
+ </stat_view>
+ <stat_view label="Time (ms)" name="simperf">
+ <stat_bar label="Total Frame Time" name="simframemsec"/>
+ <stat_bar label="Net Time" name="simnetmsec"/>
+ <stat_bar label="Physics Time" name="simsimphysicsmsec"/>
+ <stat_bar label="Simulation Time" name="simsimothermsec"/>
+ <stat_bar label="Agent Time" name="simagentmsec"/>
+ <stat_bar label="Images Time" name="simimagesmsec"/>
+ <stat_bar label="Script Time" name="simscriptmsec"/>
+ </stat_view>
+ </stat_view>
+ </container_view>
+ </scroll_container>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_sys_well.xml b/indra/newview/skins/default/xui/pt/floater_sys_well.xml
new file mode 100644
index 0000000000..38beec022c
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_sys_well.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="sys_well_window" title="AVISOS">
+ <string name="title_im_well_window">
+ CONVERSAS
+ </string>
+ <string name="title_notification_well_window">
+ AVISOS
+ </string>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_telehub.xml b/indra/newview/skins/default/xui/pt/floater_telehub.xml
index 5c775ab45d..6b35d3f919 100644
--- a/indra/newview/skins/default/xui/pt/floater_telehub.xml
+++ b/indra/newview/skins/default/xui/pt/floater_telehub.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="telehub" title="TELEHUB" min_height="310" height="310" width="286">
+<floater height="310" min_height="310" name="telehub" title="TELEHUB" width="286">
<text name="status_text_connected">
Telehub conectado ao objeto [OBJECT]
</text>
@@ -17,16 +17,13 @@
<text name="spawn_points_text" width="265">
Pontos de Nascimento (posições, não objetos):
</text>
- <scroll_list name="spawn_points_list" width="265" />
- <button width="135" label="Adicionar Nascimento" name="add_spawn_point_btn"/>
- <button width="130" label="Remover Nascimento" name="remove_spawn_point_btn" left="150"/>
+ <scroll_list name="spawn_points_list" width="265"/>
+ <button label="Adicionar Nascimento" name="add_spawn_point_btn" width="135"/>
+ <button label="Remover Nascimento" left="150" name="remove_spawn_point_btn" width="130"/>
<text name="spawn_point_help">
- Selecione um objeto e clique Adicionar para
-especificar a posição.
-Em seguida, você pode mover ou apagar o objeto.
-As posições são relativas ao centro do telehub.
-
-Selecione um item na lista para mostrar a posição
-in-world.
+ Selecione o objeto e clique em &apos;Adicionar spawn&apos; para especificar a posição.
+O objeto pode ser excluído ou movido posteriormente.
+As posições são definidas em relação ao centro do telehub.
+Selecione um item da lista para realçá-lo inworld.
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml
index b63c4a9bbf..144bc0340e 100644
--- a/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml
+++ b/indra/newview/skins/default/xui/pt/floater_texture_ctrl.xml
@@ -1,22 +1,22 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="texture picker" title="PEGAR: TEXTURA">
+<floater name="texture picker" title="DESTAQUE: TEXTURA">
<string name="choose_picture">
Clique para escolher uma imagem
</string>
<text name="Multiple">
- Multiplo
+ Multiplas texturas
</text>
<text name="unknown">
- Dimensões: [DIMENSIONS]
+ Tamanho: [DIMENSÕES]
</text>
<button label="Padrão" label_selected="Padrão" name="Default"/>
<button label="Nenhum" label_selected="Nenhum" name="None"/>
<button label="Branco" label_selected="Branco" name="Blank"/>
- <check_box label="Mostrar Pastas" name="show_folders_check"/>
- <search_editor label="Clique aqui para buscar" name="inventory search editor"/>
- <check_box label="Aplicar Imediatamente" name="apply_immediate_check"/>
+ <check_box label="Exibir pastas" name="show_folders_check"/>
+ <search_editor label="Filtrar texturas" name="inventory search editor"/>
+ <check_box label="Applicar agora" name="apply_immediate_check"/>
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
- <button label="Selecionar" label_selected="Selecionar" name="Select"/>
+ <button label="OK" label_selected="OK" name="Select"/>
<string name="pick title">
Pegar:
</string>
diff --git a/indra/newview/skins/default/xui/pt/floater_tools.xml b/indra/newview/skins/default/xui/pt/floater_tools.xml
index b9ab018606..dbc8b3ffbe 100644
--- a/indra/newview/skins/default/xui/pt/floater_tools.xml
+++ b/indra/newview/skins/default/xui/pt/floater_tools.xml
@@ -1,45 +1,84 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="toolbox floater" title="" short_title="CONSTRUIR" width="288">
+<floater name="toolbox floater" short_title="BUILD TOOLS" title="" width="288">
+ <floater.string name="status_rotate">
+ Arrastar as bandas coloridas para girar o objeto
+ </floater.string>
+ <floater.string name="status_scale">
+ Clicar e arrastar para esticar o lado selecionado
+ </floater.string>
+ <floater.string name="status_move">
+ Arrastar para mover, Shift-arrastar para copiar
+ </floater.string>
+ <floater.string name="status_modifyland">
+ Clicar e reter para modificar a terra
+ </floater.string>
+ <floater.string name="status_camera">
+ Clique e arraste para mexer a câmera
+ </floater.string>
+ <floater.string name="status_grab">
+ Arraste para mexer, Ctrl para levantar, Ctrl+Shift para girar
+ </floater.string>
+ <floater.string name="status_place">
+ Clique no mundo para construir
+ </floater.string>
+ <floater.string name="status_selectland">
+ Clicar e arrastar para selecionar a terra
+ </floater.string>
+ <floater.string name="grid_screen_text">
+ Tela
+ </floater.string>
+ <floater.string name="grid_local_text">
+ Local
+ </floater.string>
+ <floater.string name="grid_world_text">
+ Mundo
+ </floater.string>
+ <floater.string name="grid_reference_text">
+ Referência
+ </floater.string>
+ <floater.string name="grid_attachment_text">
+ Anexo
+ </floater.string>
<button label="" label_selected="" name="button focus" tool_tip="Foco"/>
<button label="" label_selected="" name="button move" tool_tip="Mover"/>
<button label="" label_selected="" name="button edit" tool_tip="Editar"/>
<button label="" label_selected="" name="button create" tool_tip="Criar"/>
<button label="" label_selected="" name="button land" tool_tip="Terra"/>
+ <text name="text status" width="280">
+ Arraste para mover, shift+Arrastar para Copiar
+ </text>
<radio_group name="focus_radio_group">
<radio_item label="Zoom" name="radio zoom"/>
<radio_item label="Órbita (Ctrl)" name="radio orbit"/>
- <radio_item label="Pan (Ctrl-Shift)" name="radio pan"/>
+ <radio_item label="Pan (Ctrl+Shift)" name="radio pan"/>
</radio_group>
<radio_group name="move_radio_group">
<radio_item label="Mover" name="radio move"/>
<radio_item label="Suspender (Ctrl)" name="radio lift"/>
- <radio_item label="Girar (Ctrl-Shift)" name="radio spin"/>
+ <radio_item label="Spin (Ctrl+Shift)" name="radio spin"/>
</radio_group>
<radio_group name="edit_radio_group">
- <radio_item label="Posição" name="radio position"/>
+ <radio_item label="Movimentar" name="radio position"/>
<radio_item label="Rotacionar (Ctrl)" name="radio rotate"/>
- <radio_item label="Esticar (Ctrl-Shift)" name="radio stretch"/>
- <radio_item label="Selecionar Textura" name="radio select face"/>
+ <radio_item label="Stretch (Ctrl+Shift)" name="radio stretch"/>
+ <radio_item label="Face selecionada" name="radio select face"/>
</radio_group>
- <check_box label="Editar partes unidas" name="checkbox edit linked parts"/>
- <text name="text ruler mode">
- Régua:
+ <check_box label="Editar partes linkadas" name="checkbox edit linked parts"/>
+ <text name="RenderingCost" tool_tip="Mostra o cálculo do custo de renderização do objeto">
+ þ: [COUNT]
</text>
- <combo_box name="combobox grid mode">
- <combo_box.item name="World" label="Mundo"
- />
- <combo_box.item name="Local" label="Local"
- />
- <combo_box.item name="Reference" label="Referência"
- />
- </combo_box>
- <check_box label="Esticar ambos os lados" name="checkbox uniform"/>
- <check_box label="Esticar Texturas" name="checkbox stretch textures"/>
- <check_box label="Usar Grade" name="checkbox snap to grid"/>
- <button label="Opções..." label_selected="Opções..." name="Options..."/>
- <text name="text status" width="280">
- Arraste para mover, shift+Arrastar para Copiar
+ <check_box label="" name="checkbox uniform"/>
+ <text label="Esticar ambos lados" name="checkbox uniform label">
+ Esticar ambos lados
</text>
+ <check_box initial_value="true" label="Esticar texturas" name="checkbox stretch textures"/>
+ <check_box initial_value="true" label="Mostrar na grade" name="checkbox snap to grid"/>
+ <combo_box name="combobox grid mode" tool_tip="Selecione o tipo de régua da grade onde o objeto será colocado">
+ <combo_box.item label="Grid SL" name="World"/>
+ <combo_box.item label="Grid local" name="Local"/>
+ <combo_box.item label="Grid de referência" name="Reference"/>
+ </combo_box>
+ <button label="Opções..." label_selected="Opções..." name="Options..." tool_tip="Mais opções de grade"/>
<button label="" label_selected="" name="ToolCube" tool_tip="Cubo"/>
<button label="" label_selected="" name="ToolPrism" tool_tip="Prisma"/>
<button label="" label_selected="" name="ToolPyramid" tool_tip="Pirâmide"/>
@@ -55,10 +94,10 @@
<button label="" label_selected="" name="ToolRing" tool_tip="Anel"/>
<button label="" label_selected="" name="ToolTree" tool_tip="Ãrvore"/>
<button label="" label_selected="" name="ToolGrass" tool_tip="Grama"/>
- <check_box label="Manter selecionado" name="checkbox sticky"/>
- <check_box label="Copiar selecionado" name="checkbox copy selection"/>
- <check_box label="Centro" name="checkbox copy centers"/>
- <check_box label="Rotacionar" name="checkbox copy rotates"/>
+ <check_box label="Ficar com ferramenta selecionada" name="checkbox sticky"/>
+ <check_box label="Copiar seleção" name="checkbox copy selection"/>
+ <check_box initial_value="true" label="Copiar parte central" name="checkbox copy centers"/>
+ <check_box label="Girar cópia" name="checkbox copy rotates"/>
<radio_group name="land_radio_group">
<radio_item label="Selecionar Terra" name="radio select land"/>
<radio_item label="Aplainar" name="radio flatten"/>
@@ -68,7 +107,6 @@
<radio_item label="Endurecer" name="radio noise"/>
<radio_item label="Reverter" name="radio revert"/>
</radio_group>
- <button label="Aplicar" label_selected="Aplicar" name="button apply to selection" tool_tip="Modificar Terra Selecionada"/>
<text name="Bulldozer:">
Escavadeira:
</text>
@@ -78,14 +116,51 @@
<text name="Strength:">
Força
</text>
- <text name="obj_count" left="134">
- Objetos selecionados: [COUNT]
+ <button label="Aplicar" label_selected="Aplicar" name="button apply to selection" tool_tip="Modificar a terra selecionada"/>
+ <text left="134" name="obj_count">
+ Objetos: [COUNT]
</text>
- <text name="prim_count" left="134">
- primitivas: [COUNT]
+ <text left="134" name="prim_count">
+ Prims: [COUNT]
</text>
<tab_container name="Object Info Tabs" tab_max_width="60" tab_min_width="30" width="288">
<panel label="Comum" name="General">
+ <panel.string name="text deed continued">
+ Doar
+ </panel.string>
+ <panel.string name="text deed">
+ Doar
+ </panel.string>
+ <panel.string name="text modify info 1">
+ Você pode modificar este objeto
+ </panel.string>
+ <panel.string name="text modify info 2">
+ Você pode modificar estes objetos
+ </panel.string>
+ <panel.string name="text modify info 3">
+ Você não pode modificar este objeto
+ </panel.string>
+ <panel.string name="text modify info 4">
+ Você não pode modificar estes objetos
+ </panel.string>
+ <panel.string name="text modify warning">
+ Selecione o objeto intereiro para configurar as autorizações
+ </panel.string>
+ <panel.string name="Cost Default">
+ Preço: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ Total: L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Preço unitário: L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Preço Misturado
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Venda Misturada
+ </panel.string>
<text name="Name:">
Nome:
</text>
@@ -98,135 +173,77 @@
<text name="Creator Name">
Thrax Linden
</text>
- <button label="Perfil..." label_selected="Perfil..." name="button creator profile"/>
<text name="Owner:">
Proprietário:
</text>
<text name="Owner Name">
Thrax Linden
</text>
- <button label="Perfil..." label_selected="Perfil..." name="button owner profile"/>
<text name="Group:">
Grupo:
</text>
- <text name="Group Name Proxy">
- The Lindens
- </text>
- <button label="Definir..." label_selected="Definir..." name="button set group"/>
- <text name="Permissions:">
- Permissões:
- </text>
-
- <check_box label="Compartilhar com o Grupo" name="checkbox share with group" tool_tip="Permite que todos os membros do grupo definido compartilhem e usem suas permissões para este objeto. Você precisa Doar ao Grupo para habilitar as restrições de função."/>
- <string name="text deed continued">
- Doar...
- </string>
- <string name="text deed">
- Doar
- </string>
- <button label="Doar..." label_selected="Doar..." name="button deed" tool_tip="Objetos compartilhados do Grupo pode ser doados pelo gerente do grupo."/>
- <check_box label="Permitir que qualquer um mova" name="checkbox allow everyone move"/>
- <check_box label="Permitir que qualquer um copie" name="checkbox allow everyone copy"/>
- <check_box label="Mostrar na busca" name="search_check" tool_tip="Permitir que as pessoas vejam este objeto nos resultados de busca"/>
- <check_box label="À Venda" name="checkbox for sale"/>
- <text name="Cost">
- Preço: L$
- </text>
+ <button label="Definir..." label_selected="Definir..." name="button set group" tool_tip="Selecione o grupo que terá acesso à autorização do objeto"/>
+ <name_box initial_value="Carregando..." name="Group Name Proxy"/>
+ <button label="Doar" label_selected="Doar" name="button deed" tool_tip="Ao doar este item, o próximo dono terá permissões de próximo dono. Objetos de grupos podem ser doados por um oficial do grupo."/>
+ <check_box label="Compartilhar" name="checkbox share with group" tool_tip="Permitir que todos os membros do grupo tenhas suas permissões de modificação para este objeto. Faça uma doação para ativar restrições de função."/>
+ <text name="label click action">
+ Clique para:
+ </text>
+ <combo_box name="clickaction">
+ <combo_box.item label="Tocar (padrão)" name="Touch/grab(default)"/>
+ <combo_box.item label="Sentar no objeto" name="Sitonobject"/>
+ <combo_box.item label="Comprar objeto" name="Buyobject"/>
+ <combo_box.item label="Pagar Objeto" name="Payobject"/>
+ <combo_box.item label="Abrir" name="Open"/>
+ <combo_box.item label="Zoom" name="Zoom"/>
+ </combo_box>
+ <check_box label="À venda" name="checkbox for sale"/>
<combo_box name="sale type">
<combo_box.item label="Cópia" name="Copy"/>
<combo_box.item label="Conteúdo" name="Contents"/>
<combo_box.item label="Original" name="Original"/>
</combo_box>
-
- <text name="label click action" width="220">
- Quando clicado com o botão esquerdo:
- </text>
- <combo_box name="clickaction" width="192">
- <combo_box.item name="Touch/grab(default)" label="Tocar/Pegar (padrão)"
- />
- <combo_box.item name="Sitonobject" label="Sentar no objeto"
- />
- <combo_box.item name="Buyobject" label="Comprar objeto"
- />
- <combo_box.item name="Payobject" label="Pagar Objeto"
- />
- <combo_box.item name="Open" label="Abrir"
- />
- <combo_box.item name="Play" label="Executar a mídia do lote"
- />
- <combo_box.item name="Opemmedia" label="Abrir a mídia do lote"
- />
- </combo_box>
- <panel name="perms_build">
- <text name="perm_modify">
- Você pode modificar este objeto
- </text>
- <text name="B:">
- B:
- </text>
- <text name="O:">
- O:
- </text>
- <text name="G:">
- G:
- </text>
- <text name="E:">
- E:
- </text>
- <text name="N:">
- N:
- </text>
- <text name="F:">
- F:
- </text>
- <text name="Next owner can:">
- Próximo Proprietário pode:
- </text>
- <check_box label="Modificar" name="checkbox next owner can modify"/>
- <check_box label="Copiar" name="checkbox next owner can copy" left_delta="80"/>
- <check_box name="checkbox next owner can transfer" left_delta="67"/>
- </panel>
- <string name="text modify info 1">
- Você pode modificar este objeto
- </string>
- <string name="text modify info 2">
- Você pode modificar estes objetos
- </string>
- <string name="text modify info 3">
- Você não pode modificar este objeto
- </string>
- <string name="text modify info 4">
- Você não pode modificar estes objetos
- </string>
- <string name="text modify warning">
- Você precisa selecionar o objeto todo para ajustar as permissões
- </string>
- <string name="Cost Default">
- Preço: L$
- </string>
- <string name="Cost Total">
- Preço Total: L$
- </string>
- <string name="Cost Per Unit">
- Preço Por: L$
- </string>
- <string name="Cost Mixed">
- Preço Misturado
- </string>
- <string name="Sale Mixed">
- Venda Misturada
- </string>
+ <spinner label="Preço: L$" name="Edit Cost"/>
+ <check_box label="Mostrar na busca" name="search_check" tool_tip="Permitir que as pessoas vejam este objeto nos resultados de busca"/>
+ <panel name="perms_build">
+ <text name="perm_modify">
+ Você pode modificar este objeto
+ </text>
+ <text name="Anyone can:">
+ Todos:
+ </text>
+ <check_box label="Movimentar" name="checkbox allow everyone move"/>
+ <check_box label="Copiar" name="checkbox allow everyone copy"/>
+ <text name="Next owner can:">
+ Próximo proprietário:
+ </text>
+ <check_box label="Modificar" name="checkbox next owner can modify"/>
+ <check_box label="Copiar" left_delta="80" name="checkbox next owner can copy"/>
+ <check_box label="Transferir" left_delta="67" name="checkbox next owner can transfer" tool_tip="O próximo dono poderá revender ou dar este objeto"/>
+ <text name="B:">
+ B:
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ E:
+ </text>
+ <text name="N:">
+ N:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
</panel>
<panel label="Objeto" name="Object">
- <text name="select_single" width="272">
- Selecione apenas uma primitiva para editar os parâmetros.
- </text>
- <text name="edit_object">
- Editar os parâmetros do Objeto:
- </text>
<check_box label="Travado" name="checkbox locked" tool_tip="Previne que o objeto seja movido ou apagado. Muito útil para evitar edições não intencionais durante a construção."/>
<check_box label="Física" name="Physical Checkbox Ctrl" tool_tip="Permite que os objetos sejam empurrados e sofram efeito da gravidade"/>
- <check_box label="Temporário" name="Temporary Checkbox Ctrl" tool_tip="Faz com que o objeto seja apagado 1 minuto após ser criado."/>
+ <check_box label="Temporário" name="Temporary Checkbox Ctrl" tool_tip="O objeto será excluído um minuto depois de ser criado"/>
<check_box label="Fantasma" name="Phantom Checkbox Ctrl" tool_tip="Faz com que o objeto não colida com outros objetos ou avatares"/>
<text name="label position">
Posição (metros)
@@ -246,48 +263,27 @@
<spinner label="X" name="Rot X"/>
<spinner label="Y" name="Rot Y"/>
<spinner label="Z" name="Rot Z"/>
- <text name="label material">
- Material
- </text>
- <combo_box name="material">
- <combo_box.item name="Stone" label="Pedra"
- />
- <combo_box.item name="Metal" label="Metal"
- />
- <combo_box.item name="Glass" label="Vidro"
- />
- <combo_box.item name="Wood" label="Madeira"
- />
- <combo_box.item name="Flesh" label="Carne"
- />
- <combo_box.item name="Plastic" label="Plástico"
- />
- <combo_box.item name="Rubber" label="Couro"
- />
- </combo_box>
- <text name="label basetype">
- Forma básica
- </text>
<combo_box name="comboBaseType">
- <combo_box.item name="Box" label="Caixa"
- />
- <combo_box.item name="Cylinder" label="Cilindro"
- />
- <combo_box.item name="Prism" label="Prisma"
- />
- <combo_box.item name="Sphere" label="Esfera"
- />
- <combo_box.item name="Torus" label="Toróide"
- />
- <combo_box.item name="Tube" label="Tubo"
- />
- <combo_box.item name="Ring" label="Anel"
- />
- <combo_box.item name="Sculpted" label="Esculpida"
- />
+ <combo_box.item label="Caixa" name="Box"/>
+ <combo_box.item label="Cilindro" name="Cylinder"/>
+ <combo_box.item label="Prisma" name="Prism"/>
+ <combo_box.item label="Esfera" name="Sphere"/>
+ <combo_box.item label="Toróide" name="Torus"/>
+ <combo_box.item label="Tubo" name="Tube"/>
+ <combo_box.item label="Anel" name="Ring"/>
+ <combo_box.item label="Esculpida" name="Sculpted"/>
+ </combo_box>
+ <combo_box name="material">
+ <combo_box.item label="Pedra" name="Stone"/>
+ <combo_box.item label="Metal" name="Metal"/>
+ <combo_box.item label="Vidro" name="Glass"/>
+ <combo_box.item label="Madeira" name="Wood"/>
+ <combo_box.item label="Carne" name="Flesh"/>
+ <combo_box.item label="Plástico" name="Plastic"/>
+ <combo_box.item label="Couro" name="Rubber"/>
</combo_box>
<text name="text cut">
- Recorte Início e final
+ Path Cut (begin/end)
</text>
<spinner label="I" name="cut begin"/>
<spinner label="F" name="cut end"/>
@@ -301,17 +297,13 @@
Forma Vazia
</text>
<combo_box name="hole">
- <combo_box.item name="Default" label="Padrão"
- />
- <combo_box.item name="Circle" label="Circulo"
- />
- <combo_box.item name="Square" label="Quadrado"
- />
- <combo_box.item name="Triangle" label="Triâgulo"
- />
+ <combo_box.item label="Padrão" name="Default"/>
+ <combo_box.item label="Circulo" name="Circle"/>
+ <combo_box.item label="Quadrado" name="Square"/>
+ <combo_box.item label="Triâgulo" name="Triangle"/>
</combo_box>
<text name="text twist">
- Torcer no Início e final
+ Twist (begin/end)
</text>
<spinner label="I" name="Twist Begin"/>
<spinner label="F" name="Twist End"/>
@@ -329,13 +321,13 @@
<spinner label="X" name="Shear X"/>
<spinner label="Y" name="Shear Y"/>
<text name="advanced_cut" width="156">
- Perfil Recortado no Início e fim
+ Profile Cut (begin/end)
</text>
<text name="advanced_dimple">
- Cova Início e final
+ Dimple (begin/end)
</text>
<text name="advanced_slice">
- Pedaço Início e fim
+ Slice (begin/end)
</text>
<spinner label="I" name="Path Limit Begin"/>
<spinner label="F" name="Path Limit End"/>
@@ -351,22 +343,17 @@
Revoluções
</text>
<texture_picker label="Texture de Escultura" name="sculpt texture control" tool_tip="Click to choose a picture"/>
- <check_box label="Espelho" name="sculpt mirror control" tool_tip="Inverter a primitiva esculpida ao longo do eixo X."/>
- <check_box label="De dentro para fora" name="sculpt invert control" tool_tip="Inverte as normais das primitivas esculpidas, fazendo-as parecer de dentro para fora."/>
+ <check_box label="Espelho" name="sculpt mirror control" tool_tip="Flips sculpted prim along the X axis"/>
+ <check_box label="De dentro para fora" name="sculpt invert control" tool_tip="Inverts the sculpted prims normals, making it appear inside-out"/>
<text name="label sculpt type">
Tipo costura
</text>
<combo_box name="sculpt type control">
- <combo_box.item name="None" label="(nenhum)"
- />
- <combo_box.item name="Sphere" label="Esfera"
- />
- <combo_box.item name="Torus" label="Toróide"
- />
- <combo_box.item name="Plane" label="Plano"
- />
- <combo_box.item name="Cylinder" label="Cilindro"
- />
+ <combo_box.item label="(nenhum)" name="None"/>
+ <combo_box.item label="Esfera" name="Sphere"/>
+ <combo_box.item label="Toróide" name="Torus"/>
+ <combo_box.item label="Plano" name="Plane"/>
+ <combo_box.item label="Cilindro" name="Cylinder"/>
</combo_box>
</panel>
<panel label="Recursos" name="Features">
@@ -376,7 +363,7 @@
<text name="edit_object">
Editar características do Objeto:
</text>
- <check_box label="Flexíbilidade" name="Flexible1D Checkbox Ctrl" tool_tip="Permite que o objeto flexione no eixo Z. (Somente no lado do Cliente)"/>
+ <check_box label="Flexíbilidade" name="Flexible1D Checkbox Ctrl" tool_tip="Allows object to flex about the Z axis (Client-side only)"/>
<spinner label="Suavidade" name="FlexNumSections"/>
<spinner label="Gravidade" name="FlexGravity"/>
<spinner label="Arrastar" name="FlexFriction"/>
@@ -386,17 +373,24 @@
<spinner label="Força Y" name="FlexForceY"/>
<spinner label="Força Z" name="FlexForceZ"/>
<check_box label="Luz" name="Light Checkbox Ctrl" tool_tip="Faz com que o objeto emita luz"/>
- <text name="label color">
- Cor
- </text>
- <color_swatch label="" name="colorswatch" tool_tip="Clique para abrir o Seletor de Cores"/>
+ <color_swatch label="" name="colorswatch" tool_tip="Selecionar a cor"/>
+ <texture_picker label="" name="light texture control" tool_tip="Clique para selecionar uma imagem de projeção (só com renderização suspesa ativada)"/>
<spinner label="Intensidade" name="Light Intensity"/>
+ <spinner label="FOV" name="Light FOV"/>
<spinner label="Raio" name="Light Radius"/>
+ <spinner label="Enfocar" name="Light Focus"/>
<spinner label="Queda" name="Light Falloff"/>
+ <spinner label="Ambiente" name="Light Ambiance"/>
</panel>
<panel label="Textura" name="Texture">
+ <panel.string name="string repeats per meter">
+ Repetir por Metro
+ </panel.string>
+ <panel.string name="string repeats per face">
+ Repetir por Face
+ </panel.string>
<texture_picker label="Textura" name="texture control" tool_tip="Clique para escolher uma imagem"/>
- <color_swatch label="Cor" name="colorswatch" tool_tip="Clique para abrir o Seletor de Cores"/>
+ <color_swatch label="Cor" name="colorswatch" tool_tip="Selecionar a cor"/>
<text name="color trans" width="100">
Transparência %
</text>
@@ -408,99 +402,69 @@
Mapeamento
</text>
<combo_box name="combobox texgen">
- <combo_box.item name="Default" label="Padrão"
- />
- <combo_box.item name="Planar" label="Planar"
- />
+ <combo_box.item label="Padrão" name="Default"/>
+ <combo_box.item label="Planar" name="Planar"/>
</combo_box>
<text name="label shininess">
Brilho
</text>
<combo_box name="combobox shininess">
- <combo_box.item name="None" label="Nenhum"
- />
- <combo_box.item name="Low" label="Baixo"
- />
- <combo_box.item name="Medium" label="Médio"
- />
- <combo_box.item name="High" label="Alto"
- />
+ <combo_box.item label="Nenhum" name="None"/>
+ <combo_box.item label="Baixo" name="Low"/>
+ <combo_box.item label="Médio" name="Medium"/>
+ <combo_box.item label="Alto" name="High"/>
</combo_box>
<text name="label bumpiness">
Ondulação
</text>
- <combo_box name="combobox bumpiness" width="100" >
- <combo_box.item name="None" label="Nenhum"
- />
- <combo_box.item name="Brightness" label="Claridade"
- />
- <combo_box.item name="Darkness" label="Escuridão"
- />
- <combo_box.item name="woodgrain" label="Granulação"
- />
- <combo_box.item name="bark" label="Casca"
- />
- <combo_box.item name="bricks" label="Tijolos"
- />
- <combo_box.item name="checker" label="Caixa"
- />
- <combo_box.item name="concrete" label="Concreto"
- />
- <combo_box.item name="crustytile" label="Encaroçado"
- />
- <combo_box.item name="cutstone" label="Pedra Cortante"
- />
- <combo_box.item name="discs" label="Discos"
- />
- <combo_box.item name="gravel" label="Cascalho"
- />
- <combo_box.item name="petridish" label="Pedrisco"
- />
- <combo_box.item name="siding" label="Revestimento"
- />
- <combo_box.item name="stonetile" label="Empedrado"
- />
- <combo_box.item name="stucco" label="Grafiato"
- />
- <combo_box.item name="suction" label="Sulcos"
- />
- <combo_box.item name="weave" label="Weave"
- />
+ <combo_box name="combobox bumpiness" width="100">
+ <combo_box.item label="Nenhum" name="None"/>
+ <combo_box.item label="Claridade" name="Brightness"/>
+ <combo_box.item label="Escuridão" name="Darkness"/>
+ <combo_box.item label="Granulação" name="woodgrain"/>
+ <combo_box.item label="Casca" name="bark"/>
+ <combo_box.item label="Tijolos" name="bricks"/>
+ <combo_box.item label="Caixa" name="checker"/>
+ <combo_box.item label="Concreto" name="concrete"/>
+ <combo_box.item label="Encaroçado" name="crustytile"/>
+ <combo_box.item label="Pedra Cortante" name="cutstone"/>
+ <combo_box.item label="Discos" name="discs"/>
+ <combo_box.item label="Cascalho" name="gravel"/>
+ <combo_box.item label="Pedrisco" name="petridish"/>
+ <combo_box.item label="Revestimento" name="siding"/>
+ <combo_box.item label="Empedrado" name="stonetile"/>
+ <combo_box.item label="Grafiato" name="stucco"/>
+ <combo_box.item label="Sulcos" name="suction"/>
+ <combo_box.item label="Weave" name="weave"/>
</combo_box>
<text name="tex scale">
- Repetir por Face
+ Repeats / Face
</text>
<spinner label="Horizontal (U)" name="TexScaleU"/>
<check_box label="Flip" name="checkbox flip s"/>
<spinner label="Vertical (V)" name="TexScaleV"/>
<check_box label="Flip" name="checkbox flip t"/>
- <text name="tex rotate">
- Rotação (graus)
- </text>
- <string name="string repeats per meter">
- Repetir por Metro
- </string>
- <string name="string repeats per face">
- Repetir por Face
- </string>
- <text name="rpt">
- Repetir por Metro
- </text>
+ <spinner label="RotationËš" name="TexRot"/>
+ <spinner label="Repeats / Meter" name="rptctrl"/>
<button label="Aplicar" label_selected="Aplicar" name="button apply"/>
<text name="tex offset">
- Deslocamento
+ Texture Offset
</text>
<spinner label="Horizontal (U)" name="TexOffsetU"/>
<spinner label="Vertical (V)" name="TexOffsetV"/>
- <text name="textbox autofix">
- Alinhar Texturas
- </text>
- <button label="Alinhar" label_selected="Alinhar" name="button align"/>
+ <panel name="Add_Media">
+ <text name="media_tex">
+ Mídia
+ </text>
+ <button name="add_media" tool_tip="Adicionar mídia"/>
+ <button name="delete_media" tool_tip="Excluir esta textura de mídia"/>
+ <button name="edit_media" tool_tip="Editar esta mídia"/>
+ <button label="Alinhar" label_selected="Alinhar mídias" name="button align" tool_tip="Alinhar textura da mídia (após carregar mídia)"/>
+ </panel>
</panel>
<panel label="Conteúdo" name="Contents">
- <button label="Novo Script" label_selected="Novo Script" name="button new script"/>
- <button label="Permissões" name="button permissions"/>
- <panel name="ContentsInventory" width="272" />
+ <button label="Novo Script" label_selected="Novo script" name="button new script"/>
+ <button label="Autorizações" name="button permissions"/>
</panel>
</tab_container>
<panel name="land info panel">
@@ -508,62 +472,22 @@
Informações do Lote
</text>
<text name="label_area_price">
- Preço: L$[PRICE] por [AREA] m².
+ Preço: L$[PRICE] por [AREA] m²
</text>
<text name="label_area">
- Ãrea: [AREA] m².
+ Ãrea: [AREA] m²
</text>
- <button label="Sobre a Terra..." label_selected="Sobre a Terra..." name="button about land"/>
- <check_box label="Mostrar donos" name="checkbox show owners" tool_tip="Colorir lotes de acordo com seus donos: &#10;&#10;Green = Sua terra &#10;Aqua = Terra do seu grupo &#10;Red = Possuída por outros &#10;Yellow = À venda &#10;Purple = A leilão &#10;Grey = Pública"/>
- <button label="?" label_selected="?" name="button show owners help" left_delta="100"/>
+ <button label="Sobre terrenos" label_selected="Sobre terrenos" name="button about land"/>
+ <check_box label="Mostrar donos" name="checkbox show owners" tool_tip="Colorir lotes de acordo com seus donos: Green = Sua terra Aqua = Terra do seu grupo Red = Possuída por outros Yellow = À venda Purple = A leilão Grey = Pública"/>
<text name="label_parcel_modify">
Modificar Lote
</text>
- <button label="Sub-Dividir" label_selected="Sub-Dividir" name="button subdivide land"/>
- <button label="Unir" label_selected="Unir" name="button join land"/>
+ <button label="Subdividir" label_selected="Subdividir" name="button subdivide land"/>
+ <button label="Juntar" label_selected="Juntar" name="button join land"/>
<text name="label_parcel_trans">
Transações com a Terra
</text>
- <button label="Comprar Terra" label_selected="Comprar Terra" name="button buy land"/>
- <button label="Abandonar Terra" label_selected="Abandonar Terra" name="button abandon land"/>
+ <button label="Comprar terreno" label_selected="Comprar terreno" name="button buy land"/>
+ <button label="Abandonar terreno" label_selected="Abandonar terreno" name="button abandon land"/>
</panel>
- <floater.string name="status_rotate">
- Arrastar as bandas coloridas para girar o objeto
- </floater.string>
- <floater.string name="status_scale">
- Clicar e arrastar para esticar o lado selecionado
- </floater.string>
- <floater.string name="status_move">
- Arrastar para mover, Shift-arrastar para copiar
- </floater.string>
- <floater.string name="status_modifyland">
- Clicar e reter para modificar a terra
- </floater.string>
- <floater.string name="status_camera">
- Clicar e arrastar para mudar a vista
- </floater.string>
- <floater.string name="status_grab">
- Arrastar para mover, Ctrl para levantar, Ctrl-Shift para rotacionar
- </floater.string>
- <floater.string name="status_place">
- Clique no mundo para construir
- </floater.string>
- <floater.string name="status_selectland">
- Clicar e arrastar para selecionar a terra
- </floater.string>
- <floater.string name="grid_screen_text">
- Tela
- </floater.string>
- <floater.string name="grid_local_text">
- Local
- </floater.string>
- <floater.string name="grid_world_text">
- Mundo
- </floater.string>
- <floater.string name="grid_reference_text">
- Referência
- </floater.string>
- <floater.string name="grid_attachment_text">
- Anexo
- </floater.string>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_top_objects.xml b/indra/newview/skins/default/xui/pt/floater_top_objects.xml
index 15e69c450c..dc3bf73818 100644
--- a/indra/newview/skins/default/xui/pt/floater_top_objects.xml
+++ b/indra/newview/skins/default/xui/pt/floater_top_objects.xml
@@ -1,58 +1,59 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="top_objects" title="CARREGANDO...">
+<floater name="top_objects" title="Principais objetos:">
+ <floater.string name="top_scripts_title">
+ Principais Scripts
+ </floater.string>
+ <floater.string name="top_scripts_text">
+ [COUNT] scripts tomando um total de [TIME] ms
+ </floater.string>
+ <floater.string name="scripts_score_label">
+ Tempo
+ </floater.string>
+ <floater.string name="scripts_mono_time_label">
+ Hora Mono
+ </floater.string>
+ <floater.string name="top_colliders_title">
+ Principais Colidentes
+ </floater.string>
+ <floater.string name="top_colliders_text">
+ [COUNT] objetos principais experimentando muitas potenciais colisões
+ </floater.string>
+ <floater.string name="colliders_score_label">
+ Placar
+ </floater.string>
+ <floater.string name="none_descriptor">
+ Nenhum encontrado.
+ </floater.string>
<text name="title_text">
Carregando...
</text>
<scroll_list name="objects_list">
- <column label="Placar" name="score"/>
- <column label="Nome" name="name"/>
- <column label="Proprietário" name="owner"/>
- <column label="Local" name="location"/>
- <column label="Tempo" name="time"/>
- <column label="Hora Mono" name="mono_time"/>
+ <scroll_list.columns label="Placar" name="score"/>
+ <scroll_list.columns label="Nome" name="name"/>
+ <scroll_list.columns label="Proprietário" name="owner"/>
+ <scroll_list.columns label="Local" name="location"/>
+ <scroll_list.columns label="Tempo" name="time"/>
+ <scroll_list.columns label="Hora Mono" name="mono_time"/>
+ <scroll_list.columns label="URLs" name="URLs"/>
</scroll_list>
<text name="id_text">
ID do Objeto:
</text>
+ <line_editor font="SansSerifSmall" left="140" name="id_editor" width="280"/>
<button label="Mostrar Avisos" name="show_beacon_btn"/>
<text name="obj_name_text">
- Nome do Objeto:
+ Nome do objeto:
</text>
+ <line_editor font="SansSerifSmall" left="140" name="object_name_editor" width="280"/>
<button label="Filtro" name="filter_object_btn"/>
<text name="owner_name_text" width="130">
- Nome do Proprietário:
+ Proprietário:
</text>
- <line_editor font="SansSerifSmall" left="140" name="id_editor" width="280"/>
- <line_editor font="SansSerifSmall" left="140" name="object_name_editor" width="280"/>
<line_editor font="SansSerifSmall" left="140" name="owner_name_editor" width="280"/>
<button label="Filtro" name="filter_owner_btn"/>
+ <button label="Atualizar" name="refresh_btn"/>
<button label="Retornar Selecionado" name="return_selected_btn" width="170"/>
- <button label="Retornar Tudo" name="return_all_btn" left="190"/>
+ <button label="Retornar Tudo" left="190" name="return_all_btn"/>
<button label="Desabilitar Selecionado" name="disable_selected_btn" width="170"/>
- <button label="Desabilitar Tudo" name="disable_all_btn" left="190"/>
- <button label="Atualizar" name="refresh_btn"/>
- <string name="top_scripts_title">
- Principais Scripts
- </string>
- <string name="top_scripts_text">
- [COUNT] scripts tomando um total de [TIME] ms
- </string>
- <string name="scripts_score_label">
- Tempo
- </string>
- <string name="scripts_mono_time_label">
- Hora Mono
- </string>
- <string name="top_colliders_title">
- Principais Colidentes
- </string>
- <string name="top_colliders_text">
- [COUNT] objetos principais experimentando muitas potenciais colisões
- </string>
- <string name="colliders_score_label">
- Placar
- </string>
- <string name="none_descriptor">
- Nenhum encontrado.
- </string>
+ <button label="Desabilitar Tudo" left="190" name="disable_all_btn"/>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_tos.xml b/indra/newview/skins/default/xui/pt/floater_tos.xml
index 7a0c187517..2675979783 100644
--- a/indra/newview/skins/default/xui/pt/floater_tos.xml
+++ b/indra/newview/skins/default/xui/pt/floater_tos.xml
@@ -1,16 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<floater name="modal container" title=" ">
+ <floater.string name="real_url">
+ http://secondlife.com/app/tos/
+ </floater.string>
+ <floater.string name="loading_url">
+ data:text/html,%3Chtml%3E%3Chead%3E%3C/head%3E%3Cbody text=%22000000%22%3E%3Ch2%3E Carregando %3Ca%20target%3D%22_external%22%20href%3D%22http%3A//secondlife.com/app/tos/%22%3ETerms%20of%20Service%3C/a%3E...%3C/h2%3E %3C/body%3E %3C/html%3E
+ </floater.string>
<button label="Continuar" label_selected="Continuar" name="Continue"/>
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
- <check_box label="Eu concordo com os Termos do Serviço" name="agree_chk"/>
+ <check_box label="Concordo com os Termos de Serviço e com a Política de Privacidade" name="agree_chk"/>
<text name="tos_heading">
- Por favor, leia os seguintes Termos de Serviço cuidadosamente. Para continuar acessando o
-[SECOND_LIFE], você precisa aceitar o acordo.
+ Leia com atenção os Termos do Serviço e a Política de Privacidade. Para continuar a entrar no [SECOND_LIFE], é preciso aceitar esses termos.
</text>
- <text_editor name="tos_text">
- TOS_TEXT
- </text_editor>
- <string name="real_url">
- http://secondlife.com/app/tos/
- </string>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_voice_controls.xml b/indra/newview/skins/default/xui/pt/floater_voice_controls.xml
new file mode 100644
index 0000000000..44f08b76b5
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_voice_controls.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="floater_voice_controls" title="Controles de voz">
+ <string name="title_nearby">
+ VOZ LOCAL
+ </string>
+ <string name="title_group">
+ Ligação de grupo com [GROUP]
+ </string>
+ <string name="title_adhoc">
+ Teleconferência
+ </string>
+ <string name="title_peer_2_peer">
+ Ligação para [NAME]
+ </string>
+ <string name="no_one_near">
+ Ninguém por perto ativou a voz
+ </string>
+ <layout_stack name="my_call_stack">
+ <layout_panel name="my_panel">
+ <text name="user_text" value="Meu avatar:"/>
+ </layout_panel>
+ <layout_stack name="voice_effect_and_leave_call_stack">
+ <layout_panel name="leave_call_btn_panel">
+ <button label="Desligar" name="leave_call_btn"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_stack>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_voice_effect.xml b/indra/newview/skins/default/xui/pt/floater_voice_effect.xml
new file mode 100644
index 0000000000..4bc8575588
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_voice_effect.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater label="Lugares" name="voice_effects" title="CHECAR DISTORÇÃO DE VOZ">
+ <string name="no_voice_effect">
+ (Não distorcer voz)
+ </string>
+ <string name="active_voice_effect">
+ (Ativo)
+ </string>
+ <string name="unsubscribed_voice_effect">
+ (Cancelou)
+ </string>
+ <string name="new_voice_effect">
+ (Novo!)
+ </string>
+ <text name="status_text">
+ Para ouvir um efeito de Distorção de voz, clique no botão Gravar, grave alguns instantes de voz, depois clique em Distorcer voz na lista para ouvir o resultado.
+
+Para reconectar à Voz local, basta fechar esta janela.
+ </text>
+ <button label="Gravar amostra" name="record_btn" tool_tip="Grave uma amostra da sua voz."/>
+ <button label="Parar" name="record_stop_btn"/>
+ <text name="voice_morphing_link">
+ [[URL] Distorcer voz]
+ </text>
+ <scroll_list name="voice_effect_list" tool_tip="Grave sua voz por alguns instantes, depois clique num efeito para ouvir a distorção.">
+ <scroll_list.columns label="Distorcer voz" name="name"/>
+ <scroll_list.columns label="Vence em" name="expires"/>
+ </scroll_list>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_water.xml b/indra/newview/skins/default/xui/pt/floater_water.xml
index bad9aa0943..b4613e0890 100644
--- a/indra/newview/skins/default/xui/pt/floater_water.xml
+++ b/indra/newview/skins/default/xui/pt/floater_water.xml
@@ -3,29 +3,29 @@
<text name="KeyFramePresetsText" width="154">
Pré-configurações da Ãgua:
</text>
- <combo_box left_delta="160" name="WaterPresetsCombo" width="150" />
+ <combo_box left_delta="160" name="WaterPresetsCombo" width="150"/>
<button label="Novo" label_selected="Novo" name="WaterNewPreset"/>
<button label="Salvar" label_selected="Salvar" name="WaterSavePreset"/>
<button label="Deletar" label_selected="Deletar" name="WaterDeletePreset"/>
<tab_container name="Water Tabs">
- <panel label="Configurações" name="Settings">
+ <panel label="DEFINIÇÕES" name="Settings">
<text name="BHText">
Cor da névoa da Ãgua
</text>
<button label="?" name="WaterFogColorHelp"/>
- <color_swatch label="" name="WaterFogColor" tool_tip="Clique para abrir o Capturador de Cor"/>
+ <color_swatch label="" name="WaterFogColor" tool_tip="Selecionar a cor"/>
<text name="WaterFogDensText">
Expoente da Densidade de névoa
</text>
- <button label="?" name="WaterFogDensityHelp" left="209"/>
+ <button label="?" left="209" name="WaterFogDensityHelp"/>
<text name="WaterUnderWaterFogModText">
Modificador da névoa Subaquática
</text>
- <button label="?" name="WaterUnderWaterFogModHelp" left="209"/>
+ <button label="?" left="209" name="WaterUnderWaterFogModHelp"/>
<text name="BDensText">
Escala da Marola de Reflexão
</text>
- <button label="?" name="WaterNormalScaleHelp" left="415"/>
+ <button label="?" left="415" name="WaterNormalScaleHelp"/>
<text name="BHText2">
1
</text>
@@ -38,29 +38,29 @@
<text name="HDText">
Escala de Fresnel
</text>
- <button label="?" name="WaterFresnelScaleHelp" left="415"/>
+ <button label="?" left="415" name="WaterFresnelScaleHelp"/>
<text name="FresnelOffsetText">
Deslocamento de Fresnel
</text>
- <button label="?" name="WaterFresnelOffsetHelp" left="415"/>
+ <button label="?" left="415" name="WaterFresnelOffsetHelp"/>
<text name="DensMultText">
Refratar a Escala para Cima
</text>
- <button label="?" name="WaterScaleAboveHelp" left="640"/>
+ <button label="?" left="640" name="WaterScaleAboveHelp"/>
<text name="WaterScaleBelowText">
Refratar a Escala para Baixo
</text>
- <button label="?" name="WaterScaleBelowHelp" left="640"/>
+ <button label="?" left="640" name="WaterScaleBelowHelp"/>
<text name="MaxAltText">
Multiplicador de Difusão
</text>
- <button label="?" name="WaterBlurMultiplierHelp" left="640"/>
+ <button label="?" left="640" name="WaterBlurMultiplierHelp"/>
</panel>
- <panel label="Imagem" name="Waves">
+ <panel label="IMAGEM" name="Waves">
<text name="BHText">
Direção da Onda Maior
</text>
- <button label="?" name="WaterWave1Help" left="170"/>
+ <button label="?" left="170" name="WaterWave1Help"/>
<text name="WaterWave1DirXText">
X
</text>
@@ -70,7 +70,7 @@
<text name="BHText2">
Direção da Onda Pequena
</text>
- <button label="?" name="WaterWave2Help" left="170"/>
+ <button label="?" left="170" name="WaterWave2Help"/>
<text name="WaterWave2DirXText">
X
</text>
diff --git a/indra/newview/skins/default/xui/pt/floater_wearable_save_as.xml b/indra/newview/skins/default/xui/pt/floater_wearable_save_as.xml
index 2b2c669a18..282bf0e268 100644
--- a/indra/newview/skins/default/xui/pt/floater_wearable_save_as.xml
+++ b/indra/newview/skins/default/xui/pt/floater_wearable_save_as.xml
@@ -3,7 +3,7 @@
<button label="Salvar" label_selected="Salvar" name="Save"/>
<button label="Cancelar" label_selected="Cancelar" name="Cancel"/>
<text name="Save item as:">
- Salvar item como:
+ Salvar item no inventário como:
</text>
<line_editor name="name ed">
Novo [DESC]
diff --git a/indra/newview/skins/default/xui/pt/floater_whitelist_entry.xml b/indra/newview/skins/default/xui/pt/floater_whitelist_entry.xml
new file mode 100644
index 0000000000..865d939d24
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_whitelist_entry.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="whitelist_entry" title="LISTA BRANCA">
+ <text name="media_label">
+ Digite um URL ou série de URLs para a lista de domínios permitidos
+ </text>
+ <line_editor name="whitelist_entry" tool_tip="Digite um URL ou série de URLs para a lista branca"/>
+ <button label="OK" name="ok_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_windlight_options.xml b/indra/newview/skins/default/xui/pt/floater_windlight_options.xml
index 951e37a1a6..22632a4ef8 100644
--- a/indra/newview/skins/default/xui/pt/floater_windlight_options.xml
+++ b/indra/newview/skins/default/xui/pt/floater_windlight_options.xml
@@ -5,11 +5,11 @@
</text>
<combo_box left_delta="130" name="WLPresetsCombo"/>
<button label="Novo" label_selected="Novo" name="WLNewPreset"/>
- <button label="Salvar" label_selected="Salvar" name="WLSavePreset" left_delta="72"/>
- <button label="Deletar" label_selected="Deletar" name="WLDeletePreset" left_delta="72"/>
- <button label="Editor de Ciclos do Dia" label_selected="Editor de Ciclos do Dia" name="WLDayCycleMenuButton" width="150" left_delta="84" />
+ <button label="Salvar" label_selected="Salvar" left_delta="72" name="WLSavePreset"/>
+ <button label="Deletar" label_selected="Deletar" left_delta="72" name="WLDeletePreset"/>
+ <button label="Editor de Ciclos do Dia" label_selected="Editor de Ciclos do Dia" left_delta="84" name="WLDayCycleMenuButton" width="150"/>
<tab_container name="WindLight Tabs">
- <panel label="Atmosfera" name="Atmosphere">
+ <panel label="ATMOSFERA" name="Atmosphere">
<text name="BHText">
Horizonte Azul
</text>
@@ -53,17 +53,17 @@
<text name="DensMultText">
Multiplicador de Densidade
</text>
- <button label="?" name="WLDensityMultHelp" left="635"/>
+ <button label="?" left="635" name="WLDensityMultHelp"/>
<text name="WLDistanceMultText">
Multiplicador de Distância
</text>
- <button label="?" name="WLDistanceMultHelp" left="635"/>
+ <button label="?" left="635" name="WLDistanceMultHelp"/>
<text name="MaxAltText">
Altitude Máxima
</text>
- <button label="?" name="WLMaxAltitudeHelp" left="635"/>
+ <button label="?" left="635" name="WLMaxAltitudeHelp"/>
</panel>
- <panel label="Iluminação" name="Lighting">
+ <panel label="ILUMINAÇÃO" name="Lighting">
<text name="SLCText">
Cor do Sol/Lua
</text>
@@ -119,7 +119,7 @@
</text>
<button label="?" name="WLStarBrightnessHelp"/>
</panel>
- <panel label="Nuvens" name="Clouds">
+ <panel label="NUVENS" name="Clouds">
<text name="WLCloudColorText">
Cor da Nuvem
</text>
@@ -157,10 +157,10 @@
Escala da Nuvem
</text>
<button label="?" name="WLCloudScaleHelp"/>
- <text name="WLCloudDetailText" font="SansSerifSmall">
+ <text font="SansSerifSmall" name="WLCloudDetailText">
Detalhe da Nuvem (XY/Densidade)
</text>
- <button label="?" name="WLCloudDetailHelp" left="421"/>
+ <button label="?" left="421" name="WLCloudDetailHelp"/>
<text name="BHText8">
X
</text>
@@ -181,7 +181,7 @@
<button label="?" name="WLCloudScrollYHelp"/>
<check_box label="Travar" name="WLCloudLockY"/>
<check_box label="Desenhar Nuvens Clássicas" name="DrawClassicClouds"/>
- <button label="?" name="WLClassicCloudsHelp" left="645"/>
+ <button label="?" left="645" name="WLClassicCloudsHelp"/>
</panel>
</tab_container>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_window_size.xml b/indra/newview/skins/default/xui/pt/floater_window_size.xml
new file mode 100644
index 0000000000..6a8ccbd002
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/floater_window_size.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<floater name="window_size" title="TAMANHO DA JANELA">
+ <string name="resolution_format">
+ [RES_X] x [RES_Y]
+ </string>
+ <text name="windowsize_text">
+ Definir tamanho da janela:
+ </text>
+ <combo_box name="window_size_combo" tool_tip="largura x altura">
+ <combo_box.item label="1000 x 700 (padrão)" name="item0"/>
+ <combo_box.item label="1024 x 768" name="item1"/>
+ <combo_box.item label="1280 x 720 (720p)" name="item2"/>
+ <combo_box.item label="1920 x 1080 (1080p)" name="item3"/>
+ </combo_box>
+ <button label="Definir" name="set_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/floater_world_map.xml b/indra/newview/skins/default/xui/pt/floater_world_map.xml
index 034602d6ea..878d0b1973 100644
--- a/indra/newview/skins/default/xui/pt/floater_world_map.xml
+++ b/indra/newview/skins/default/xui/pt/floater_world_map.xml
@@ -1,53 +1,78 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="worldmap" title="MAPA MUNDI">
- <tab_container name="maptab">
- <panel label="Objetos" name="objects_mapview"/>
- <panel label="Terreno" name="terrain_mapview"/>
- </tab_container>
- <text name="you_label">
- Você
- </text>
- <text name="home_label">
- Casa
- </text>
- <text name="auction_label">
- Leilão
- </text>
- <text name="land_for_sale_label">
- Terra à venda
- </text>
- <button label="Ir para Casa" label_selected="Ir para casa" name="Go Home" tool_tip="Teletransportar para sua Casa"/>
- <check_box label="Residente" name="people_chk"/>
- <check_box label="Infohub" name="infohub_chk"/>
- <check_box label="Telehub" name="telehubchk"/>
- <check_box label="Terra à Venda" name="land_for_sale_chk"/>
- <text name="events_label">
- Eventos:
- </text>
- <check_box label="PG" name="event_chk"/>
- <check_box label="Mature" name="event_mature_chk"/>
- <check_box label="Adult" name="event_adult_chk"/>
- <combo_box label="Amigos Conectados" name="friend combo" tool_tip="Amigos para mostrar no Mapa">
- <combo_box.item name="item1" label="Amigos Conectados" />
- </combo_box>
- <combo_box label="Landmarks" name="landmark combo" tool_tip="Landmark para mostrar no Mapa">
- <combo_box.item name="item1" label="Landmarks" />
- </combo_box>
- <line_editor label="Procurar por nome de região" name="location" tool_tip="Digite o nome de uma Região"/>
- <button label="Procurar" name="DoSearch" tool_tip="Procurar por região"/>
- <text name="search_label">
- Resultados da Procura:
- </text>
- <text name="location_label">
- Localização:
- </text>
- <spinner name="spin x" tool_tip="Coordenada X da posição mostrada no mapa"/>
- <spinner name="spin y" tool_tip="Coordenada Y da posição mostrada no mapa"/>
- <spinner name="spin z" tool_tip="Coordenada Z da posição mostrada no Mapa"/>
- <button font="SansSerifSmall" label="Teletransporte" label_selected="Teletransporte" name="Teleport" tool_tip="Teletransportar para a posição selecionada"/>
- <button font="SansSerifSmall" left_delta="91" width="135" label="Mostrar destino" label_selected="Mostrar Destino" name="Show Destination" tool_tip="Centralizar mapa na posição selecionada"/>
- <button font="SansSerifSmall" label="Limpar" label_selected="Limpar" name="Clear" tool_tip="Parar de percorrer"/>
- <button font="SansSerifSmall" left_delta="91" width="135" label="Mostra minha localização" label_selected="Mostra minha localização" name="Show My Location" tool_tip="Centraliza o mapa na posição do seu Avatar"/>
- <button font="SansSerifSmall" label="Copiar SLurl para área de transferência" name="copy_slurl" tool_tip="Copia a posição atual como SLurl para ser usada na Web"/>
- <slider label="Zoom" name="zoom slider"/>
+<floater name="worldmap" title="MAPA-MÚNDI">
+ <panel name="layout_panel_1">
+ <text name="events_label">
+ Legenda
+ </text>
+ </panel>
+ <panel name="layout_panel_2">
+ <button font="SansSerifSmall" label="Mostra minha localização" label_selected="Mostra minha localização" left_delta="91" name="Show My Location" tool_tip="Centrar o mapa na localização do meu avatar" />
+ <text name="me_label">
+ Eu
+ </text>
+ <check_box label="Residente" name="people_chk"/>
+ <text name="person_label">
+ Pessoa
+ </text>
+ <check_box label="Infohub" name="infohub_chk"/>
+ <text name="infohub_label">
+ Infohub
+ </text>
+ <check_box label="Terra à Venda" name="land_for_sale_chk"/>
+ <text name="land_sale_label">
+ Venda de terreno
+ </text>
+ <text name="by_owner_label">
+ o proprietário
+ </text>
+ <text name="auction_label">
+ leilão de terrenos
+ </text>
+ <button label="Voltar ao meu início" label_selected="Voltar ao meu início" name="Go Home" tool_tip="Teletransportar para meu início"/>
+ <text name="Home_label">
+ Início
+ </text>
+ <text name="events_label">
+ Eventos:
+ </text>
+ <check_box label="PG" name="event_chk"/>
+ <text name="pg_label">
+ Público geral
+ </text>
+ <check_box label="Mature" name="event_mature_chk"/>
+ <text name="mature_label">
+ Moderado
+ </text>
+ <check_box label="Adult" name="event_adult_chk"/>
+ <text name="adult_label">
+ Adulto
+ </text>
+ </panel>
+ <panel name="layout_panel_3">
+ <text name="find_on_map_label">
+ Localizar no mapa
+ </text>
+ </panel>
+ <panel name="layout_panel_4">
+ <combo_box label="Amigos online" name="friend combo" tool_tip="Mostrar amigos no mapa">
+ <combo_box.item label="Amigos conectados" name="item1"/>
+ </combo_box>
+ <combo_box label="Meus marcos" name="landmark combo" tool_tip="Mostrar marco no mapa">
+ <combo_box.item label="Meus marcos" name="item1"/>
+ </combo_box>
+ <search_editor label="Regiões por nome" name="location" tool_tip="Digite o nome da região"/>
+ <button label="Buscar" name="DoSearch" tool_tip="Buscar região"/>
+ <button name="Clear" tool_tip="Limpar linhas e redefinir mapa"/>
+ <button font="SansSerifSmall" label="Teletransportar" label_selected="Teletransporte" name="Teleport" tool_tip="Teletransportar para o lugar selecionado"/>
+ <button font="SansSerifSmall" label="Copiar SLurl" name="copy_slurl" tool_tip="Copia a localização atual como um SLurl para usar na web."/>
+ <button font="SansSerifSmall" label="Mostrar seleção" label_selected="Mostrar Destino" left_delta="91" name="Show Destination" tool_tip="Centrar mapa no local selecionado" width="135"/>
+ </panel>
+ <panel name="layout_panel_5">
+ <text name="zoom_label">
+ Zoom
+ </text>
+ </panel>
+ <panel name="layout_panel_6">
+ <slider label="Zoom" name="zoom slider"/>
+ </panel>
</floater>
diff --git a/indra/newview/skins/default/xui/pt/inspect_avatar.xml b/indra/newview/skins/default/xui/pt/inspect_avatar.xml
new file mode 100644
index 0000000000..a74ea15be0
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/inspect_avatar.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_avatar">
+ <string name="Subtitle">
+ [IDADE]
+ </string>
+ <string name="Details">
+ [PERFIL_SL]
+ </string>
+ <slider name="volume_slider" tool_tip="Volume de Voz" value="0.5"/>
+ <button label="Adicionar amigo" name="add_friend_btn"/>
+ <button label="MI" name="im_btn"/>
+ <button label="Perfil" name="view_profile_btn"/>
+ <panel name="moderator_panel">
+ <button label="Disabilitar Voz" name="disable_voice"/>
+ <button label="Habilitar Voz" name="enable_voice"/>
+ </panel>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/inspect_group.xml b/indra/newview/skins/default/xui/pt/inspect_group.xml
new file mode 100644
index 0000000000..889d35f269
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/inspect_group.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_group">
+ <string name="PrivateGroup">
+ Grupo privado
+ </string>
+ <string name="FreeToJoin">
+ Livre para ingressar
+ </string>
+ <string name="CostToJoin">
+ [AMOUNT]L$ para ingressar
+ </string>
+ <string name="YouAreMember">
+ Você é um membro
+ </string>
+ <button label="Ingressar" name="join_btn"/>
+ <button label="Abandonar" name="leave_btn"/>
+ <button label="Visualizar Perfil" name="view_profile_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/inspect_object.xml b/indra/newview/skins/default/xui/pt/inspect_object.xml
new file mode 100644
index 0000000000..b72de7038d
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/inspect_object.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_object">
+ <string name="Creator">
+ Autor: [CREATOR]
+ </string>
+ <string name="CreatorAndOwner">
+ Autor [CREATOR]
+Proprietário [OWNER]
+ </string>
+ <string name="Price">
+ L$[AMOUNT]
+ </string>
+ <string name="PriceFree">
+ Grátis!
+ </string>
+ <string name="Touch">
+ Tocar
+ </string>
+ <string name="Sit">
+ Sentar
+ </string>
+ <text name="object_name" value="Test Object Name That Is actually two lines and Really Long"/>
+ <text name="price_text">
+ L$30.000
+ </text>
+ <text name="object_description">
+ This is a really long description for an object being as how it is at least 80 characters in length and so but maybe more like 120 at this point. Who knows, really?
+ </text>
+ <button label="Comprar" name="buy_btn"/>
+ <button label="Pagar" name="pay_btn"/>
+ <button label="Pegar uma cópia" name="take_free_copy_btn"/>
+ <button label="Tocar" name="touch_btn"/>
+ <button label="Sentar" name="sit_btn"/>
+ <button label="Abrir" name="open_btn"/>
+ <icon name="secure_browsing" tool_tip="Navegação segura"/>
+ <button label="Mais" name="more_info_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/inspect_remote_object.xml b/indra/newview/skins/default/xui/pt/inspect_remote_object.xml
new file mode 100644
index 0000000000..789194bf2e
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/inspect_remote_object.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!--
+ Not can_close / no title to avoid window chrome
+ Single instance - only have one at a time, recycle it each spawn
+-->
+<floater name="inspect_remote_object">
+ <text name="object_owner_label">
+ Proprietário:
+ </text>
+ <button label="Mapa" name="map_btn"/>
+ <button label="Bloquear" name="block_btn"/>
+ <button label="Fechar" name="close_btn"/>
+</floater>
diff --git a/indra/newview/skins/default/xui/pt/language_settings.xml b/indra/newview/skins/default/xui/pt/language_settings.xml
index 71418d446a..f25e77574d 100644
--- a/indra/newview/skins/default/xui/pt/language_settings.xml
+++ b/indra/newview/skins/default/xui/pt/language_settings.xml
@@ -3,9 +3,9 @@
<strings>
<!-- Locale Information -->
- <string name="MicrosoftLocale">english</string>
- <string name="DarwinLocale">C</string>
- <string name="LinuxLocale">C</string>
+ <string name="MicrosoftLocale">portuguese</string>
+ <string name="DarwinLocale">pt_PT.UTF-8</string>
+ <string name="LinuxLocale">pt_PT.UTF-8</string>
<!--
datetimeToCodes["wkday"] = "%a"; // Thu
diff --git a/indra/newview/skins/default/xui/pt/menu_attachment_other.xml b/indra/newview/skins/default/xui/pt/menu_attachment_other.xml
new file mode 100644
index 0000000000..cfd69158bc
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_attachment_other.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_avatar_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Ver perfil" name="Profile..."/>
+ <menu_item_call label="Adicionar amigo..." name="Add Friend"/>
+ <menu_item_call label="MI" name="Send IM..."/>
+ <menu_item_call label="Ligar" name="Call"/>
+ <menu_item_call label="Convidar para entrar no grupo" name="Invite..."/>
+ <menu_item_call label="Bloquear" name="Avatar Mute"/>
+ <menu_item_call label="Denunciar" name="abuse"/>
+ <menu_item_call label="Congelar" name="Freeze..."/>
+ <menu_item_call label="Ejetar" name="Eject..."/>
+ <menu_item_call label="Depurar texturas" name="Debug..."/>
+ <menu_item_call label="Mais zoom" name="Zoom In"/>
+ <menu_item_call label="Pagar" name="Pay..."/>
+ <menu_item_call label="Perfil do objeto" name="Object Inspect"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_attachment_self.xml b/indra/newview/skins/default/xui/pt/menu_attachment_self.xml
new file mode 100644
index 0000000000..5cb1b211cf
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_attachment_self.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Attachment Pie">
+ <menu_item_call label="Tocar" name="Attachment Object Touch"/>
+ <menu_item_call label="Editar" name="Edit..."/>
+ <menu_item_call label="Tirar" name="Detach"/>
+ <menu_item_call label="Largar" name="Drop"/>
+ <menu_item_call label="Ficar de pé" name="Stand Up"/>
+ <menu_item_call label="Trocar de look" name="Change Outfit"/>
+ <menu_item_call label="Meus amigos" name="Friends..."/>
+ <menu_item_call label="Meus grupos" name="Groups..."/>
+ <menu_item_call label="Meu perfil" name="Profile..."/>
+ <menu_item_call label="Depurar texturas" name="Debug..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_avatar_icon.xml b/indra/newview/skins/default/xui/pt/menu_avatar_icon.xml
new file mode 100644
index 0000000000..beba969b7e
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_avatar_icon.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Avatar Icon Menu">
+ <menu_item_call label="Ver perfil" name="Show Profile"/>
+ <menu_item_call label="Enviar MI..." name="Send IM"/>
+ <menu_item_call label="Adicionar amigo..." name="Add Friend"/>
+ <menu_item_call label="Remover amigo..." name="Remove Friend"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_avatar_other.xml b/indra/newview/skins/default/xui/pt/menu_avatar_other.xml
new file mode 100644
index 0000000000..a4a26144c7
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_avatar_other.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: See also menu_attachment_other.xml -->
+<context_menu name="Avatar Pie">
+ <menu_item_call label="Ver perfil" name="Profile..."/>
+ <menu_item_call label="Adicionar amigo..." name="Add Friend"/>
+ <menu_item_call label="MI" name="Send IM..."/>
+ <menu_item_call label="Ligar" name="Call"/>
+ <menu_item_call label="Convidar para entrar no grupo" name="Invite..."/>
+ <menu_item_call label="Bloquear" name="Avatar Mute"/>
+ <menu_item_call label="Denunciar" name="abuse"/>
+ <menu_item_call label="Congelar" name="Freeze..."/>
+ <menu_item_call label="Ejetar" name="Eject..."/>
+ <menu_item_call label="Depurar texturas" name="Debug..."/>
+ <menu_item_call label="Mais zoom" name="Zoom In"/>
+ <menu_item_call label="Pagar" name="Pay..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_avatar_self.xml b/indra/newview/skins/default/xui/pt/menu_avatar_self.xml
new file mode 100644
index 0000000000..62055303b5
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_avatar_self.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Self Pie">
+ <menu_item_call label="Ficar de pé" name="Stand Up"/>
+ <context_menu label="Tirar â–¶" name="Take Off &gt;">
+ <context_menu label="Roupa â–¶" name="Clothes &gt;">
+ <menu_item_call label="Camisa" name="Shirt"/>
+ <menu_item_call label="Calças" name="Pants"/>
+ <menu_item_call label="Saia" name="Skirt"/>
+ <menu_item_call label="Sapatos" name="Shoes"/>
+ <menu_item_call label="Meias" name="Socks"/>
+ <menu_item_call label="Jaqueta" name="Jacket"/>
+ <menu_item_call label="Luvas" name="Gloves"/>
+ <menu_item_call label="Camiseta" name="Self Undershirt"/>
+ <menu_item_call label="Roupa de baixo" name="Self Underpants"/>
+ <menu_item_call label="Tatuagem" name="Self Tattoo"/>
+ <menu_item_call label="Alpha" name="Self Alpha"/>
+ <menu_item_call label="Todas as roupas" name="All Clothes"/>
+ </context_menu>
+ <context_menu label="HUD â–¶" name="Object Detach HUD"/>
+ <context_menu label="Tirar â–¶" name="Object Detach"/>
+ <menu_item_call label="Tirar tudo" name="Detach All"/>
+ </context_menu>
+ <menu_item_call label="Trocar de look" name="Chenge Outfit"/>
+ <menu_item_call label="Editar meu look" name="Edit Outfit"/>
+ <menu_item_call label="Editar meu corpo" name="Edit My Shape"/>
+ <menu_item_call label="Meus amigos" name="Friends..."/>
+ <menu_item_call label="Meus grupos" name="Groups..."/>
+ <menu_item_call label="Meu perfil" name="Profile..."/>
+ <menu_item_call label="Depurar texturas" name="Debug..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_bottomtray.xml b/indra/newview/skins/default/xui/pt/menu_bottomtray.xml
new file mode 100644
index 0000000000..479d02512f
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_bottomtray.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_camera_move_controls_menu">
+ <menu_item_check label="Botão de gestos" name="ShowGestureButton"/>
+ <menu_item_check label="Botão de movimento" name="ShowMoveButton"/>
+ <menu_item_check label="Botão de ver" name="ShowCameraButton"/>
+ <menu_item_check label="Botão de fotos" name="ShowSnapshotButton"/>
+ <menu_item_check label="Botão da Barra lateral" name="ShowSidebarButton"/>
+ <menu_item_check label="Botão Construir" name="ShowBuildButton"/>
+ <menu_item_check label="Botão Buscar" name="ShowSearchButton"/>
+ <menu_item_check label="Botão Mapa" name="ShowWorldMapButton"/>
+ <menu_item_check label="Botão do Mini Mapa" name="ShowMiniMapButton"/>
+ <menu_item_call label="Cortar" name="NearbyChatBar_Cut"/>
+ <menu_item_call label="Copiar" name="NearbyChatBar_Copy"/>
+ <menu_item_call label="Colar" name="NearbyChatBar_Paste"/>
+ <menu_item_call label="Excluir" name="NearbyChatBar_Delete"/>
+ <menu_item_call label="Selecionar tudo" name="NearbyChatBar_Select_All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_cof_attachment.xml b/indra/newview/skins/default/xui/pt/menu_cof_attachment.xml
new file mode 100644
index 0000000000..527e3af3c9
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_cof_attachment.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Attachment">
+ <menu_item_call label="Separar" name="detach"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_cof_body_part.xml b/indra/newview/skins/default/xui/pt/menu_cof_body_part.xml
new file mode 100644
index 0000000000..704fd226eb
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_cof_body_part.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Body">
+ <menu_item_call label="Trocar" name="replace"/>
+ <menu_item_call label="Editar" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_cof_clothing.xml b/indra/newview/skins/default/xui/pt/menu_cof_clothing.xml
new file mode 100644
index 0000000000..a58353f14e
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_cof_clothing.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="COF Clothing">
+ <menu_item_call label="Tirar" name="take_off"/>
+ <menu_item_call label="Subir um nível" name="move_up"/>
+ <menu_item_call label="Baixar um nível" name="move_down"/>
+ <menu_item_call label="Editar" name="edit"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_cof_gear.xml b/indra/newview/skins/default/xui/pt/menu_cof_gear.xml
new file mode 100644
index 0000000000..8716992a5e
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_cof_gear.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Gear COF">
+ <menu label="Roupas novas" name="COF.Gear.New_Clothes"/>
+ <menu label="Nova parte do corpo" name="COF.Geear.New_Body_Parts"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_edit.xml b/indra/newview/skins/default/xui/pt/menu_edit.xml
new file mode 100644
index 0000000000..ff431c9a21
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_edit.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu label="Editar" name="Edit">
+ <menu_item_call label="Desfazer" name="Undo"/>
+ <menu_item_call label="Repetir" name="Redo"/>
+ <menu_item_call label="Cortar" name="Cut"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+ <menu_item_call label="Colar" name="Paste"/>
+ <menu_item_call label="Excluir" name="Delete"/>
+ <menu_item_call label="Replicar" name="Duplicate"/>
+ <menu_item_call label="Selecionar tudo" name="Select All"/>
+ <menu_item_call label="Desfazer seleção" name="Deselect"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_favorites.xml b/indra/newview/skins/default/xui/pt/menu_favorites.xml
new file mode 100644
index 0000000000..062820fbca
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_favorites.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Popup">
+ <menu_item_call label="Teletransportar" name="Teleport To Landmark"/>
+ <menu_item_call label="Ver/Editar marco" name="Landmark Open"/>
+ <menu_item_call label="Copiar SLurl" name="Copy slurl"/>
+ <menu_item_call label="Mostrar no mapa" name="Show On Map"/>
+ <menu_item_call label="Copiar" name="Landmark Copy"/>
+ <menu_item_call label="Colar" name="Landmark Paste"/>
+ <menu_item_call label="Excluir" name="Delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_gesture_gear.xml b/indra/newview/skins/default/xui/pt/menu_gesture_gear.xml
new file mode 100644
index 0000000000..70d8ae7a8e
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_gesture_gear.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gesture_gear">
+ <menu_item_call label="Adicionar/remover de favoritos" name="activate"/>
+ <menu_item_call label="Copiar" name="copy_gesture"/>
+ <menu_item_call label="Colar" name="paste"/>
+ <menu_item_call label="Copiar UUID" name="copy_uuid"/>
+ <menu_item_call label="Salvar para look atual" name="save_to_outfit"/>
+ <menu_item_call label="Editar" name="edit_gesture"/>
+ <menu_item_call label="Verificar" name="inspect"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_group_plus.xml b/indra/newview/skins/default/xui/pt/menu_group_plus.xml
new file mode 100644
index 0000000000..1083845d68
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_group_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Entrar no grupo..." name="item_join"/>
+ <menu_item_call label="Novo grupo..." name="item_new"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_hide_navbar.xml b/indra/newview/skins/default/xui/pt/menu_hide_navbar.xml
new file mode 100644
index 0000000000..c2b063193e
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_hide_navbar.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="hide_navbar_menu">
+ <menu_item_check label="Mostrar barra de navegação" name="ShowNavbarNavigationPanel"/>
+ <menu_item_check label="Mostrar barra de favoritos" name="ShowNavbarFavoritesPanel"/>
+ <menu_item_check label="Mostrar minibarra de localização" name="ShowMiniLocationPanel"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_im_well_button.xml b/indra/newview/skins/default/xui/pt/menu_im_well_button.xml
new file mode 100644
index 0000000000..2d37cefd6f
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_im_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="IM Well Button Context Menu">
+ <menu_item_call label="Fechar tudo" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_imchiclet_adhoc.xml b/indra/newview/skins/default/xui/pt/menu_imchiclet_adhoc.xml
new file mode 100644
index 0000000000..ead949ba13
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_imchiclet_adhoc.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet AdHoc Menu">
+ <menu_item_call label="Encerrar esta sessão" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/pt/menu_imchiclet_group.xml
new file mode 100644
index 0000000000..dd177d1b8d
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_imchiclet_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet Group Menu">
+ <menu_item_call label="Sobre o grupo" name="Show Profile"/>
+ <menu_item_call label="Mostrar sessão" name="Chat"/>
+ <menu_item_call label="Encerrar esta sessão" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/pt/menu_imchiclet_p2p.xml
new file mode 100644
index 0000000000..d821b3ded0
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_imchiclet_p2p.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="IMChiclet P2P Menu">
+ <menu_item_call label="Ver perfil" name="Show Profile"/>
+ <menu_item_call label="Adicionar amigo..." name="Add Friend"/>
+ <menu_item_call label="Mostrar sessão" name="Send IM"/>
+ <menu_item_call label="Encerrar esta sessão" name="End Session"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_inspect_avatar_gear.xml b/indra/newview/skins/default/xui/pt/menu_inspect_avatar_gear.xml
new file mode 100644
index 0000000000..6a511e6ab7
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_inspect_avatar_gear.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Ver perfil" name="view_profile"/>
+ <menu_item_call label="Adicionar amigo..." name="add_friend"/>
+ <menu_item_call label="MI" name="im"/>
+ <menu_item_call label="Ligar" name="call"/>
+ <menu_item_call label="Teletransportar" name="teleport"/>
+ <menu_item_call label="Convidar para entrar no grupo" name="invite_to_group"/>
+ <menu_item_call label="Bloquear" name="block"/>
+ <menu_item_call label="Desbloquear" name="unblock"/>
+ <menu_item_call label="Denunciar" name="report"/>
+ <menu_item_call label="Congelar" name="freeze"/>
+ <menu_item_call label="Ejetar" name="eject"/>
+ <menu_item_call label="Depurar texturas" name="debug"/>
+ <menu_item_call label="Localizar no mapa" name="find_on_map"/>
+ <menu_item_call label="Mais zoom" name="zoom_in"/>
+ <menu_item_call label="Pagar" name="pay"/>
+ <menu_item_call label="Compartilhar" name="share"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/pt/menu_inspect_object_gear.xml
new file mode 100644
index 0000000000..b69d205533
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_inspect_object_gear.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Tocar" name="touch"/>
+ <menu_item_call label="Sentar" name="sit"/>
+ <menu_item_call label="Pagar" name="pay"/>
+ <menu_item_call label="Comprar" name="buy"/>
+ <menu_item_call label="Pegar" name="take"/>
+ <menu_item_call label="Pegar uma cópia" name="take_copy"/>
+ <menu_item_call label="Abrir" name="open"/>
+ <menu_item_call label="Editar" name="edit"/>
+ <menu_item_call label="Vestir" name="wear"/>
+ <menu_item_call label="Denunciar" name="report"/>
+ <menu_item_call label="Bloquear" name="block"/>
+ <menu_item_call label="Mais zoom" name="zoom_in"/>
+ <menu_item_call label="Tirar" name="remove"/>
+ <menu_item_call label="Mais informações" name="more_info"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_inspect_self_gear.xml b/indra/newview/skins/default/xui/pt/menu_inspect_self_gear.xml
new file mode 100644
index 0000000000..c3e0608954
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_inspect_self_gear.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu name="Gear Menu">
+ <menu_item_call label="Ficar de pé" name="stand_up"/>
+ <menu_item_call label="Trocar de look" name="change_outfit"/>
+ <menu_item_call label="Meu perfil" name="my_profile"/>
+ <menu_item_call label="Meus amigos" name="my_friends"/>
+ <menu_item_call label="Meus grupos" name="my_groups"/>
+ <menu_item_call label="Depurar texturas" name="Debug..."/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_inv_offer_chiclet.xml b/indra/newview/skins/default/xui/pt/menu_inv_offer_chiclet.xml
new file mode 100644
index 0000000000..c404719c95
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_inv_offer_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="InvOfferChiclet Menu">
+ <menu_item_call label="Fechar" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_inventory.xml b/indra/newview/skins/default/xui/pt/menu_inventory.xml
index 486588158e..aa195e5739 100644
--- a/indra/newview/skins/default/xui/pt/menu_inventory.xml
+++ b/indra/newview/skins/default/xui/pt/menu_inventory.xml
@@ -1,66 +1,87 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu name="Popup">
+ <menu_item_call label="Compartilhar" name="Share"/>
<menu_item_call label="Comprar" name="Task Buy"/>
<menu_item_call label="Abrir" name="Task Open"/>
<menu_item_call label="Executar" name="Task Play"/>
<menu_item_call label="Propriedades" name="Task Properties"/>
<menu_item_call label="Renomear" name="Task Rename"/>
<menu_item_call label="Apagar" name="Task Remove"/>
- <menu_item_call label="Limpar Lixeira" name="Empty Trash"/>
- <menu_item_call label="Limpar Achados e perdidos" name="Empty Lost And Found"/>
- <menu_item_call label="Nova Pasta" name="New Folder"/>
- <menu_item_call label="Novo Script" name="New Script"/>
- <menu_item_call label="Nova Nota" name="New Note"/>
- <menu_item_call label="Novo Gesto" name="New Gesture"/>
- <menu label="Nova Roupa" name="New Clothes">
- <menu_item_call label="Nova Camisa" name="New Shirt"/>
- <menu_item_call label="Nova Calça" name="New Pants"/>
- <menu_item_call label="Novos Calçados" name="New Shoes"/>
- <menu_item_call label="Novas Meias" name="New Socks"/>
- <menu_item_call label="Nova Jaqueta" name="New Jacket"/>
- <menu_item_call label="Nova Saia" name="New Skirt"/>
- <menu_item_call label="Novas Luvas" name="New Gloves"/>
- <menu_item_call label="Nova Anágua" name="New Undershirt"/>
+ <menu_item_call label="Limpar lixeira" name="Empty Trash"/>
+ <menu_item_call label="Limpar Achados &amp; perdidos" name="Empty Lost And Found"/>
+ <menu_item_call label="Nova pasta" name="New Folder"/>
+ <menu_item_call label="Novo script" name="New Script"/>
+ <menu_item_call label="Nova anotação" name="New Note"/>
+ <menu_item_call label="Novo gesto" name="New Gesture"/>
+ <menu label="Novas roupas" name="New Clothes">
+ <menu_item_call label="Nova camisa" name="New Shirt"/>
+ <menu_item_call label="Nova calça" name="New Pants"/>
+ <menu_item_call label="Novos calçados" name="New Shoes"/>
+ <menu_item_call label="Novas meias" name="New Socks"/>
+ <menu_item_call label="Nova jaqueta" name="New Jacket"/>
+ <menu_item_call label="Nova saia" name="New Skirt"/>
+ <menu_item_call label="Novas luvas" name="New Gloves"/>
+ <menu_item_call label="Nova anágua" name="New Undershirt"/>
<menu_item_call label="Nova roupa de baixo" name="New Underpants"/>
+ <menu_item_call label="Nova máscara alfa" name="New Alpha Mask"/>
+ <menu_item_call label="Nova tatuagem" name="New Tattoo"/>
</menu>
- <menu label="Parte do corpo" name="New Body Parts">
+ <menu label="Nova parte do corpo" name="New Body Parts">
<menu_item_call label="Nova forma" name="New Shape"/>
<menu_item_call label="Nova pele" name="New Skin"/>
<menu_item_call label="Novo cabelo" name="New Hair"/>
<menu_item_call label="Novos olhos" name="New Eyes"/>
</menu>
+ <menu label="Alterar fonte" name="Change Type">
+ <menu_item_call label="Padrão" name="Default"/>
+ <menu_item_call label="Luvas" name="Gloves"/>
+ <menu_item_call label="Jaqueta" name="Jacket"/>
+ <menu_item_call label="Calças" name="Pants"/>
+ <menu_item_call label="Silhueta" name="Shape"/>
+ <menu_item_call label="Sapatos" name="Shoes"/>
+ <menu_item_call label="Camisa" name="Shirt"/>
+ <menu_item_call label="Saia" name="Skirt"/>
+ <menu_item_call label="Roupa de baixo" name="Underpants"/>
+ <menu_item_call label="Camiseta" name="Undershirt"/>
+ </menu>
<menu_item_call label="Teletransporte" name="Landmark Open"/>
<menu_item_call label="Abrir" name="Animation Open"/>
<menu_item_call label="Abrir" name="Sound Open"/>
+ <menu_item_call label="Substituir equipamento" name="Replace Outfit"/>
+ <menu_item_call label="Adicionar ao equipamento" name="Add To Outfit"/>
+ <menu_item_call label="Tirar do look atual" name="Remove From Outfit"/>
+ <menu_item_call label="Encontrar original" name="Find Original"/>
<menu_item_call label="Remover item" name="Purge Item"/>
<menu_item_call label="Restaurar item" name="Restore Item"/>
<menu_item_call label="Abrir" name="Open"/>
+ <menu_item_call label="Abrir original" name="Open Original"/>
<menu_item_call label="Propriedades" name="Properties"/>
<menu_item_call label="Renomear" name="Rename"/>
- <menu_item_call label="Copy Asset UUID" name="Copy Asset UUID"/>
+ <menu_item_call label="Copiar item UUID" name="Copy Asset UUID"/>
<menu_item_call label="Copiar" name="Copy"/>
<menu_item_call label="Colar" name="Paste"/>
+ <menu_item_call label="Colar como link" name="Paste As Link"/>
+ <menu_item_call label="Remover link" name="Remove Link"/>
<menu_item_call label="Apagar" name="Delete"/>
- <menu_item_call label="Remover os itens" name="Take Off Items"/>
- <menu_item_call label="Adicionar ao equipamento" name="Add To Outfit"/>
- <menu_item_call label="Substituir equipamento" name="Replace Outfit"/>
- <menu_item_call label="Iniciar conversa em conferência" name="Conference Chat Folder"/>
- <menu_item_call label="Executar" name="Sound Play"/>
- <menu_item_call label="Sobre as Landmarks" name="Teleport To Landmark"/>
- <menu_item_call label="Executar in World" name="Animation Play"/>
- <menu_item_call label="Executar localmente" name="Animation Audition"/>
- <menu_item_call label="Mandar Mensagem Instantânea" name="Send Instant Message"/>
+ <menu_item_call label="Excluir pasta do sistema" name="Delete System Folder"/>
+ <menu_item_call label="Pasta conversa em conferência" name="Conference Chat Folder"/>
+ <menu_item_call label="Executar som" name="Sound Play"/>
+ <menu_item_call label="Sobre o marco" name="About Landmark"/>
+ <menu_item_call label="Executar animação" name="Animation Play"/>
+ <menu_item_call label="Executar áudio" name="Animation Audition"/>
+ <menu_item_call label="Mandar MI" name="Send Instant Message"/>
<menu_item_call label="Oferecer teletransporte..." name="Offer Teleport..."/>
- <menu_item_call label="Iniciar conversa em conferência" name="Conference Chat"/>
+ <menu_item_call label="Bate-papo em conferência" name="Conference Chat"/>
<menu_item_call label="Ativar" name="Activate"/>
<menu_item_call label="Desativar" name="Deactivate"/>
- <menu_item_call label="Retirar de você" name="Detach From Yourself"/>
- <menu_item_call label="Recuperar Última Posição" name="Restore to Last Position"/>
- <menu_item_call label="Vestir" name="Object Wear"/>
+ <menu_item_call label="Salvar como" name="Save As"/>
+ <menu_item_call label="Retirar de si mesmo" name="Detach From Yourself"/>
+ <menu_item_call label="Vestir objeto" name="Object Wear"/>
<menu label="Anexar a" name="Attach To"/>
<menu label="Anexar ao HUD" name="Attach To HUD"/>
<menu_item_call label="Editar" name="Wearable Edit"/>
<menu_item_call label="Vestir" name="Wearable Wear"/>
- <menu_item_call label="Retirar" name="Take Off"/>
+ <menu_item_call label="Adicionar" name="Wearable Add"/>
+ <menu_item_call label="Tirar" name="Take Off"/>
<menu_item_call label="--Sem opções--" name="--no options--"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_inventory_add.xml b/indra/newview/skins/default/xui/pt/menu_inventory_add.xml
new file mode 100644
index 0000000000..fc40384891
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_inventory_add.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_inventory_add">
+ <menu label="Upload" name="upload">
+ <menu_item_call label="Imagem (L$[COST])..." name="Upload Image"/>
+ <menu_item_call label="Som (L$[COST])..." name="Upload Sound"/>
+ <menu_item_call label="Animação (L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="Volume (L$[COST] per file)..." name="Bulk Upload"/>
+ </menu>
+ <menu_item_call label="Nova pasta" name="New Folder"/>
+ <menu_item_call label="Novo script" name="New Script"/>
+ <menu_item_call label="Nova anotação" name="New Note"/>
+ <menu_item_call label="Novo gesto" name="New Gesture"/>
+ <menu label="Novas roupas" name="New Clothes">
+ <menu_item_call label="Nova camisa" name="New Shirt"/>
+ <menu_item_call label="Novas calças" name="New Pants"/>
+ <menu_item_call label="Novos sapatos" name="New Shoes"/>
+ <menu_item_call label="Novas meias" name="New Socks"/>
+ <menu_item_call label="Nova blusa" name="New Jacket"/>
+ <menu_item_call label="Nova saia" name="New Skirt"/>
+ <menu_item_call label="Novas luvas" name="New Gloves"/>
+ <menu_item_call label="Nova camiseta" name="New Undershirt"/>
+ <menu_item_call label="Novas roupa de baixo" name="New Underpants"/>
+ <menu_item_call label="Novo alpha" name="New Alpha"/>
+ <menu_item_call label="Nova tatuagem" name="New Tattoo"/>
+ </menu>
+ <menu label="Nova parte do corpo" name="New Body Parts">
+ <menu_item_call label="Nova forma" name="New Shape"/>
+ <menu_item_call label="Nova pele" name="New Skin"/>
+ <menu_item_call label="Novo cabelo" name="New Hair"/>
+ <menu_item_call label="Novos olhos" name="New Eyes"/>
+ </menu>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/pt/menu_inventory_gear_default.xml
new file mode 100644
index 0000000000..8bae7afddc
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_inventory_gear_default.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gear_default">
+ <menu_item_call label="Nova janela de inventário" name="new_window"/>
+ <menu_item_call label="Ordenar por nome" name="sort_by_name"/>
+ <menu_item_call label="Ordenar por mais recente" name="sort_by_recent"/>
+ <menu_item_call label="Mostrar filtros" name="show_filters"/>
+ <menu_item_call label="Restabelecer filtros" name="reset_filters"/>
+ <menu_item_call label="Fechar todas as pastas" name="close_folders"/>
+ <menu_item_call label="Esvaziar lixeira" name="empty_trash"/>
+ <menu_item_call label="Esvaziar achados e perdidos" name="empty_lostnfound"/>
+ <menu_item_call label="Salvar textura como" name="Save Texture As"/>
+ <menu_item_call label="Encontrar original" name="Find Original"/>
+ <menu_item_call label="Encontrar todos os links" name="Find All Links"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_land.xml b/indra/newview/skins/default/xui/pt/menu_land.xml
new file mode 100644
index 0000000000..9182ce321a
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_land.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Land Pie">
+ <menu_item_call label="Sobre terrenos" name="Place Information..."/>
+ <menu_item_call label="Sentar aqui" name="Sit Here"/>
+ <menu_item_call label="Comprar este terreno" name="Land Buy"/>
+ <menu_item_call label="Comprar passe" name="Land Buy Pass"/>
+ <menu_item_call label="Construir" name="Create"/>
+ <menu_item_call label="Editar a topografia" name="Edit Terrain"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_landmark.xml b/indra/newview/skins/default/xui/pt/menu_landmark.xml
new file mode 100644
index 0000000000..6accfebee7
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_landmark.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="landmark_overflow_menu">
+ <menu_item_call label="Copiar SLurl" name="copy"/>
+ <menu_item_call label="Excluir" name="delete"/>
+ <menu_item_call label="Criar destaque" name="pick"/>
+ <menu_item_call label="Adicionar à barra de favoritos" name="add_to_favbar"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_login.xml b/indra/newview/skins/default/xui/pt/menu_login.xml
index 7ec324cb3f..a43ac271a9 100644
--- a/indra/newview/skins/default/xui/pt/menu_login.xml
+++ b/indra/newview/skins/default/xui/pt/menu_login.xml
@@ -1,13 +1,23 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Login Menu">
- <menu label="Arquivo" name="File">
- <menu_item_call label="Sair" name="Quit"/>
- </menu>
- <menu label="Editar" name="Edit">
- <menu_item_call label="Preferências..." name="Preferences..."/>
+ <menu label="Eu" name="File">
+ <menu_item_call label="Preferências" name="Preferences..."/>
+ <menu_item_call label="Sair do [APP_NAME]" name="Quit"/>
</menu>
<menu label="Ajuda" name="Help">
<menu_item_call label="Ajuda do [SECOND_LIFE]" name="Second Life Help"/>
- <menu_item_call label="Sobre o [APP_NAME]..." name="About Second Life..."/>
+ <menu_item_call label="Sobre [APP_NAME]" name="About Second Life"/>
+ </menu>
+ <menu_item_check label="Exibir menu de depuração" name="Show Debug Menu"/>
+ <menu label="Depurar" name="Debug">
+ <menu_item_call label="Mostrar configurações" name="Debug Settings"/>
+ <menu_item_call label="Configurações da interface e cor" name="UI/Color Settings"/>
+ <menu label="Testes de UI" name="UI Tests"/>
+ <menu_item_call label="Definir tamanho da janela:" name="Set Window Size..."/>
+ <menu_item_call label="Mostrar TOS" name="TOS"/>
+ <menu_item_call label="Mostrar mensagem crítica" name="Critical"/>
+ <menu_item_call label="Teste de navegador web" name="Web Browser Test"/>
+ <menu_item_check label="Exibir seletor da grade" name="Show Grid Picker"/>
+ <menu_item_call label="Exibir painel de notificações" name="Show Notifications Console"/>
</menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/pt/menu_mini_map.xml b/indra/newview/skins/default/xui/pt/menu_mini_map.xml
index 1293f4e17f..380bd8cf11 100644
--- a/indra/newview/skins/default/xui/pt/menu_mini_map.xml
+++ b/indra/newview/skins/default/xui/pt/menu_mini_map.xml
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<menu name="popup">
+<menu name="Popup">
<menu_item_call label="Zoom Perto" name="Zoom Close"/>
<menu_item_call label="Zoom Médio" name="Zoom Medium"/>
<menu_item_call label="Zoom Longe" name="Zoom Far"/>
+ <menu_item_check label="Girar mapa" name="Rotate Map"/>
<menu_item_call label="Parar Acompanhamento" name="Stop Tracking"/>
- <menu_item_call label="Perfil..." name="Profile"/>
+ <menu_item_call label="Mapa-múndi" name="World Map"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_navbar.xml b/indra/newview/skins/default/xui/pt/menu_navbar.xml
new file mode 100644
index 0000000000..57c1471de3
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_navbar.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Navbar Menu">
+ <menu_item_check label="Mostrar coordenadas" name="Show Coordinates"/>
+ <menu_item_check label="Mostrar as propriedades do terreno" name="Show Parcel Properties"/>
+ <menu_item_call label="Marco" name="Landmark"/>
+ <menu_item_call label="Cortar" name="Cut"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+ <menu_item_call label="Colar" name="Paste"/>
+ <menu_item_call label="Excluir" name="Delete"/>
+ <menu_item_call label="Selecionar tudo" name="Select All"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_nearby_chat.xml b/indra/newview/skins/default/xui/pt/menu_nearby_chat.xml
new file mode 100644
index 0000000000..f1ea83c837
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="NearBy Chat Menu">
+ <menu_item_call label="Mostrar quem está aqui..." name="nearby_people"/>
+ <menu_item_check label="Mostrar texto bloqueado" name="muted_text"/>
+ <menu_item_check label="Mostrar ícones de amigos" name="show_buddy_icons"/>
+ <menu_item_check label="Mostrar nomes" name="show_names"/>
+ <menu_item_check label="Mostrar ícones e nomes" name="show_icons_and_names"/>
+ <menu_item_call label="Tamanho da fonte" name="font_size"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_notification_well_button.xml b/indra/newview/skins/default/xui/pt/menu_notification_well_button.xml
new file mode 100644
index 0000000000..43ad4134ec
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_notification_well_button.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Notification Well Button Context Menu">
+ <menu_item_call label="Fechar tudo" name="Close All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_object.xml b/indra/newview/skins/default/xui/pt/menu_object.xml
new file mode 100644
index 0000000000..a5969cacc3
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_object.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Object Pie">
+ <menu_item_call label="Tocar" name="Object Touch"/>
+ <menu_item_call label="Editar" name="Edit..."/>
+ <menu_item_call label="Construir" name="Build"/>
+ <menu_item_call label="Abrir" name="Open"/>
+ <menu_item_call label="Sentar aqui" name="Object Sit"/>
+ <menu_item_call label="Ficar de pé" name="Object Stand Up"/>
+ <menu_item_call label="Perfil do objeto" name="Object Inspect"/>
+ <menu_item_call label="Mais zoom" name="Zoom In"/>
+ <context_menu label="Colocar no(a)" name="Put On">
+ <menu_item_call label="Vestir" name="Wear"/>
+ <context_menu label="Anexar &gt;" name="Object Attach"/>
+ <context_menu label="Anexar o HUD &gt;" name="Object Attach HUD"/>
+ </context_menu>
+ <context_menu label="Tirar &gt;" name="Remove">
+ <menu_item_call label="Denunciar abuso" name="Report Abuse..."/>
+ <menu_item_call label="Bloquear" name="Object Mute"/>
+ <menu_item_call label="Devolver" name="Return..."/>
+ <menu_item_call label="Excluir" name="Delete"/>
+ </context_menu>
+ <menu_item_call label="Comprar" name="Pie Object Bye"/>
+ <menu_item_call label="Pegar" name="Pie Object Take"/>
+ <menu_item_call label="Pegar uma cópia" name="Take Copy"/>
+ <menu_item_call label="Pagar" name="Pay..."/>
+ <menu_item_call label="Comprar" name="Buy..."/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_object_icon.xml b/indra/newview/skins/default/xui/pt/menu_object_icon.xml
new file mode 100644
index 0000000000..7af760a6ee
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_object_icon.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Object Icon Menu">
+ <menu_item_call label="Perfil do objeto..." name="Object Profile"/>
+ <menu_item_call label="Bloquear..." name="Block"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml b/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml
new file mode 100644
index 0000000000..eb1c026708
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_outfit_gear.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Gear Outfit">
+ <menu_item_call label="Vestir - Substituir look atual" name="wear"/>
+ <menu_item_call label="Tirar - Tirar do look atual" name="take_off"/>
+ <menu label="Roupas novas" name="New Clothes">
+ <menu_item_call label="Nova camisa" name="New Shirt"/>
+ <menu_item_call label="Novas calças" name="New Pants"/>
+ <menu_item_call label="Novos sapatos" name="New Shoes"/>
+ <menu_item_call label="Novas meias" name="New Socks"/>
+ <menu_item_call label="Nova blusa" name="New Jacket"/>
+ <menu_item_call label="Nova saia" name="New Skirt"/>
+ <menu_item_call label="Novas luvas" name="New Gloves"/>
+ <menu_item_call label="Nova camiseta" name="New Undershirt"/>
+ <menu_item_call label="Novas roupa de baixo" name="New Underpants"/>
+ <menu_item_call label="Novo alpha" name="New Alpha"/>
+ <menu_item_call label="Nova tatuagem" name="New Tattoo"/>
+ </menu>
+ <menu label="Nova parte do corpo" name="New Body Parts">
+ <menu_item_call label="Nova silhueta" name="New Shape"/>
+ <menu_item_call label="Nova pele" name="New Skin"/>
+ <menu_item_call label="Novo cabelo" name="New Hair"/>
+ <menu_item_call label="Novos olhos" name="New Eyes"/>
+ </menu>
+ <menu_item_call label="Renomear look" name="rename"/>
+ <menu_item_call label="Excluir visual" name="delete_outfit"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_outfit_tab.xml b/indra/newview/skins/default/xui/pt/menu_outfit_tab.xml
new file mode 100644
index 0000000000..7c30e8ac55
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_outfit_tab.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit">
+ <menu_item_call label="Vestir - Substituir look atual" name="wear_replace"/>
+ <menu_item_call label="Vestir - Sem tirar look atual" name="wear_add"/>
+ <menu_item_call label="Tirar - Tirar do look atual" name="take_off"/>
+ <menu_item_call label="Editar look" name="edit"/>
+ <menu_item_call label="Renomear" name="rename"/>
+ <menu_item_call label="Excluir visual" name="delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_participant_list.xml b/indra/newview/skins/default/xui/pt/menu_participant_list.xml
new file mode 100644
index 0000000000..01f1d4ef80
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_participant_list.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Participant List Context Menu">
+ <menu_item_check label="Ordenar por nome" name="SortByName"/>
+ <menu_item_check label="Ordenar por conversas mais recentes" name="SortByRecentSpeakers"/>
+ <menu_item_call label="Ver perfil" name="View Profile"/>
+ <menu_item_call label="Adicionar amigo..." name="Add Friend"/>
+ <menu_item_call label="MI" name="IM"/>
+ <menu_item_call label="Ligar" name="Call"/>
+ <menu_item_call label="Compartilhar" name="Share"/>
+ <menu_item_call label="Pagar" name="Pay"/>
+ <menu_item_check label="Ver ícones de pessoas" name="View Icons"/>
+ <menu_item_check label="Bloquear voz" name="Block/Unblock"/>
+ <menu_item_check label="Bloquear texto" name="MuteText"/>
+ <context_menu label="Opções do moderador &gt;" name="Moderator Options">
+ <menu_item_check label="Pode bater papo por escrito" name="AllowTextChat"/>
+ <menu_item_call label="Silenciar este participante" name="ModerateVoiceMuteSelected"/>
+ <menu_item_call label="Desfazer silenciar deste participante" name="ModerateVoiceUnMuteSelected"/>
+ <menu_item_call label="Silenciar todos" name="ModerateVoiceMute"/>
+ <menu_item_call label="Desfazer silenciar para todos" name="ModerateVoiceUnmute"/>
+ </context_menu>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/pt/menu_people_friends_view_sort.xml
new file mode 100644
index 0000000000..25a37488d7
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_people_friends_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Ordenar por nome" name="sort_name"/>
+ <menu_item_check label="Ordenar por status" name="sort_status"/>
+ <menu_item_check label="Ver ícones de pessoas" name="view_icons"/>
+ <menu_item_call label="Ver residentes e objetos bloqueados" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_people_groups.xml b/indra/newview/skins/default/xui/pt/menu_people_groups.xml
new file mode 100644
index 0000000000..9a924ad7b9
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_people_groups.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_call label="Ver dados" name="View Info"/>
+ <menu_item_call label="Bate-papo" name="Chat"/>
+ <menu_item_call label="Ligar" name="Call"/>
+ <menu_item_call label="Ativar" name="Activate"/>
+ <menu_item_call label="Sair" name="Leave"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_people_groups_view_sort.xml b/indra/newview/skins/default/xui/pt/menu_people_groups_view_sort.xml
new file mode 100644
index 0000000000..86a9d2263f
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_people_groups_view_sort.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Mostrar ícones de grupos" name="Display Group Icons"/>
+ <menu_item_call label="Sair do grupo selecionado" name="Leave Selected Group"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_people_nearby.xml b/indra/newview/skins/default/xui/pt/menu_people_nearby.xml
new file mode 100644
index 0000000000..7c720f262b
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_people_nearby.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Avatar Context Menu">
+ <menu_item_call label="Ver perfil" name="View Profile"/>
+ <menu_item_call label="Adicionar amigo..." name="Add Friend"/>
+ <menu_item_call label="Remover amigo..." name="Remove Friend"/>
+ <menu_item_call label="MI" name="IM"/>
+ <menu_item_call label="Ligar" name="Call"/>
+ <menu_item_call label="Mapa" name="Map"/>
+ <menu_item_call label="Compartilhar" name="Share"/>
+ <menu_item_call label="Pagar" name="Pay"/>
+ <menu_item_check label="Bloquear/desbloquear" name="Block/Unblock"/>
+ <menu_item_call label="Teletransportar?" name="teleport"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/pt/menu_people_nearby_multiselect.xml
new file mode 100644
index 0000000000..fc08b3accb
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_people_nearby_multiselect.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Multi-Selected People Context Menu">
+ <menu_item_call label="Adicionar amigo..." name="Add Friends"/>
+ <menu_item_call label="Remover amigo..." name="Remove Friend"/>
+ <menu_item_call label="MI" name="IM"/>
+ <menu_item_call label="Ligar" name="Call"/>
+ <menu_item_call label="Compartilhar" name="Share"/>
+ <menu_item_call label="Pagar" name="Pay"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_people_nearby_view_sort.xml b/indra/newview/skins/default/xui/pt/menu_people_nearby_view_sort.xml
new file mode 100644
index 0000000000..228ce46a31
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_people_nearby_view_sort.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Ordenar por conversas mais recentes" name="sort_by_recent_speakers"/>
+ <menu_item_check label="Ordenar por nome" name="sort_name"/>
+ <menu_item_check label="Ordenar por distância" name="sort_distance"/>
+ <menu_item_check label="Ver ícones de pessoas" name="view_icons"/>
+ <menu_item_call label="Ver residentes e objetos bloqueados" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_people_recent_view_sort.xml b/indra/newview/skins/default/xui/pt/menu_people_recent_view_sort.xml
new file mode 100644
index 0000000000..f3b89e01cd
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_people_recent_view_sort.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_group_plus">
+ <menu_item_check label="Ordenar por mais recente" name="sort_most"/>
+ <menu_item_check label="Ordenar por nome" name="sort_name"/>
+ <menu_item_check label="Ver ícones de pessoas" name="view_icons"/>
+ <menu_item_call label="Ver residentes e objetos bloqueados" name="show_blocked_list"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_picks.xml b/indra/newview/skins/default/xui/pt/menu_picks.xml
new file mode 100644
index 0000000000..8b9e10fc02
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_picks.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Picks">
+ <menu_item_call label="Info" name="pick_info"/>
+ <menu_item_call label="Editar" name="pick_edit"/>
+ <menu_item_call label="Teletransportar" name="pick_teleport"/>
+ <menu_item_call label="Mapa" name="pick_map"/>
+ <menu_item_call label="Excluir" name="pick_delete"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_picks_plus.xml b/indra/newview/skins/default/xui/pt/menu_picks_plus.xml
new file mode 100644
index 0000000000..95a7c05262
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_picks_plus.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="picks_plus_menu">
+ <menu_item_call label="Adicionar" name="create_pick"/>
+ <menu_item_call label="Novo anúncio" name="create_classified"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_place.xml b/indra/newview/skins/default/xui/pt/menu_place.xml
new file mode 100644
index 0000000000..282ea20a7a
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_place.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="place_overflow_menu">
+ <menu_item_call label="Criar marco" name="landmark"/>
+ <menu_item_call label="Criar destaque" name="pick"/>
+ <menu_item_call label="Comprar passe" name="pass"/>
+ <menu_item_call label="Editar" name="edit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_place_add_button.xml b/indra/newview/skins/default/xui/pt/menu_place_add_button.xml
new file mode 100644
index 0000000000..d099d04f8d
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_place_add_button.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Adicionar pasta" name="add_folder"/>
+ <menu_item_call label="Adicionar marco" name="add_landmark"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/pt/menu_places_gear_folder.xml
new file mode 100644
index 0000000000..2059a9ed2d
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_places_gear_folder.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_folder_gear">
+ <menu_item_call label="Adicionar marco" name="add_landmark"/>
+ <menu_item_call label="Adicionar pasta" name="add_folder"/>
+ <menu_item_call label="Cortar" name="cut"/>
+ <menu_item_call label="Copiar" name="copy_folder"/>
+ <menu_item_call label="Colar" name="paste"/>
+ <menu_item_call label="Renomear" name="rename"/>
+ <menu_item_call label="Excluir" name="delete"/>
+ <menu_item_call label="Expanda" name="expand"/>
+ <menu_item_call label="Recolher" name="collapse"/>
+ <menu_item_call label="Expandir todas as pastas" name="expand_all"/>
+ <menu_item_call label="Recolher todas as pastas" name="collapse_all"/>
+ <menu_item_check label="Ordenar por data" name="sort_by_date"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/pt/menu_places_gear_landmark.xml
new file mode 100644
index 0000000000..52a9d13735
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_places_gear_landmark.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_ladmark_gear">
+ <menu_item_call label="Teletransportar" name="teleport"/>
+ <menu_item_call label="Mais informações" name="more_info"/>
+ <menu_item_call label="Mostrar no mapa" name="show_on_map"/>
+ <menu_item_call label="Adicionar marco" name="add_landmark"/>
+ <menu_item_call label="Adicionar pasta" name="add_folder"/>
+ <menu_item_call label="Cortar" name="cut"/>
+ <menu_item_call label="Copiar marco" name="copy_landmark"/>
+ <menu_item_call label="Copiar SLurl" name="copy_slurl"/>
+ <menu_item_call label="Colar" name="paste"/>
+ <menu_item_call label="Renomear" name="rename"/>
+ <menu_item_call label="Excluir" name="delete"/>
+ <menu_item_call label="Expandir todas as pastas" name="expand_all"/>
+ <menu_item_call label="Recolher todas as pastas" name="collapse_all"/>
+ <menu_item_check label="Ordenar por data" name="sort_by_date"/>
+ <menu_item_call label="Criar destaque" name="create_pick"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_profile_overflow.xml b/indra/newview/skins/default/xui/pt/menu_profile_overflow.xml
new file mode 100644
index 0000000000..d41ecbd755
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_profile_overflow.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="profile_overflow_menu">
+ <menu_item_call label="Mapa" name="show_on_map"/>
+ <menu_item_call label="Pagar" name="pay"/>
+ <menu_item_call label="Compartilhar" name="share"/>
+ <menu_item_call label="Bloquear" name="block"/>
+ <menu_item_call label="Desbloquear" name="unblock"/>
+ <menu_item_call label="Chutar" name="kick"/>
+ <menu_item_call label="Congelar" name="freeze"/>
+ <menu_item_call label="Descongelar" name="unfreeze"/>
+ <menu_item_call label="CSR" name="csr"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_save_outfit.xml b/indra/newview/skins/default/xui/pt/menu_save_outfit.xml
new file mode 100644
index 0000000000..61c6b9202f
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_save_outfit.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<toggleable_menu name="save_outfit_menu">
+ <menu_item_call label="Salvar" name="save_outfit"/>
+ <menu_item_call label="Salvar como" name="save_as_new_outfit"/>
+</toggleable_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_script_chiclet.xml b/indra/newview/skins/default/xui/pt/menu_script_chiclet.xml
new file mode 100644
index 0000000000..ccf3878e14
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_script_chiclet.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="ScriptChiclet Menu">
+ <menu_item_call label="Fechar" name="Close"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_slurl.xml b/indra/newview/skins/default/xui/pt/menu_slurl.xml
index 67a4b51b61..6d4c84fc3c 100644
--- a/indra/newview/skins/default/xui/pt/menu_slurl.xml
+++ b/indra/newview/skins/default/xui/pt/menu_slurl.xml
@@ -2,5 +2,5 @@
<menu name="Popup">
<menu_item_call label="Sobre a URL" name="about_url"/>
<menu_item_call label="Teletransporte para a URL" name="teleport_to_url"/>
- <menu_item_call label="Mostrar no Mapa" name="show_on_map"/>
+ <menu_item_call label="Mapa" name="show_on_map"/>
</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_teleport_history_gear.xml b/indra/newview/skins/default/xui/pt/menu_teleport_history_gear.xml
new file mode 100644
index 0000000000..f034509be8
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_teleport_history_gear.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="Teleport History Gear Context Menu">
+ <menu_item_call label="Expandir todas as pastas" name="Expand all folders"/>
+ <menu_item_call label="Recolher todas as pastas" name="Collapse all folders"/>
+ <menu_item_call label="Limpar histórico de teletransporte" name="Clear Teleport History"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/pt/menu_teleport_history_item.xml
new file mode 100644
index 0000000000..ec1e7a0950
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_teleport_history_item.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Teletransportar" name="Teleport"/>
+ <menu_item_call label="Mais informações" name="More Information"/>
+ <menu_item_call label="Copiar" name="CopyToClipboard"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_teleport_history_tab.xml b/indra/newview/skins/default/xui/pt/menu_teleport_history_tab.xml
new file mode 100644
index 0000000000..6a633cf74c
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_teleport_history_tab.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Teleport History Item Context Menu">
+ <menu_item_call label="Abrir" name="TabOpen"/>
+ <menu_item_call label="Fechar" name="TabClose"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_text_editor.xml b/indra/newview/skins/default/xui/pt/menu_text_editor.xml
new file mode 100644
index 0000000000..31c284c6ed
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_text_editor.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Text editor context menu">
+ <menu_item_call label="Cortar" name="Cut"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+ <menu_item_call label="Colar" name="Paste"/>
+ <menu_item_call label="Excluir" name="Delete"/>
+ <menu_item_call label="Selecionar tudo" name="Select All"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_url_agent.xml b/indra/newview/skins/default/xui/pt/menu_url_agent.xml
new file mode 100644
index 0000000000..ba5e055124
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_url_agent.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar perfil de residente" name="show_agent"/>
+ <menu_item_call label="Copiar nome para área de transferência" name="url_copy_label"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_url_group.xml b/indra/newview/skins/default/xui/pt/menu_url_group.xml
new file mode 100644
index 0000000000..5b67a69c9a
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_url_group.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar informações do grupo" name="show_group"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy_label"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_url_http.xml b/indra/newview/skins/default/xui/pt/menu_url_http.xml
new file mode 100644
index 0000000000..e53a2572b8
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_url_http.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Abrir página da web" name="url_open"/>
+ <menu_item_call label="Abrir no navegador do SL" name="url_open_internal"/>
+ <menu_item_call label="Abrir no navegador externo" name="url_open_external"/>
+ <menu_item_call label="Copiar URL para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_url_inventory.xml b/indra/newview/skins/default/xui/pt/menu_url_inventory.xml
new file mode 100644
index 0000000000..45c14355d0
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_url_inventory.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar item de inventário" name="show_item"/>
+ <menu_item_call label="Copiar nome para área de transferência" name="url_copy_label"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_url_map.xml b/indra/newview/skins/default/xui/pt/menu_url_map.xml
new file mode 100644
index 0000000000..ba114cccaa
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_url_map.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar no mapa" name="show_on_map"/>
+ <menu_item_call label="Teletransportar para este lugar" name="teleport_to_location"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_url_objectim.xml b/indra/newview/skins/default/xui/pt/menu_url_objectim.xml
new file mode 100644
index 0000000000..c197444181
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_url_objectim.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar informações sobre o objeto" name="show_object"/>
+ <menu_item_call label="Mostrar no mapa" name="show_on_map"/>
+ <menu_item_call label="Teletransportar para lugar do objeto" name="teleport_to_object"/>
+ <menu_item_call label="Copiar nome do objeto para área de transferência" name="url_copy_label"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_url_parcel.xml b/indra/newview/skins/default/xui/pt/menu_url_parcel.xml
new file mode 100644
index 0000000000..6cc668bfd3
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_url_parcel.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar informações sobre este lote" name="show_parcel"/>
+ <menu_item_call label="Mostrar no mapa" name="show_on_map"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_url_slapp.xml b/indra/newview/skins/default/xui/pt/menu_url_slapp.xml
new file mode 100644
index 0000000000..d0784149ac
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_url_slapp.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Executar este comando" name="run_slapp"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_url_slurl.xml b/indra/newview/skins/default/xui/pt/menu_url_slurl.xml
new file mode 100644
index 0000000000..7216ccf0b3
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_url_slurl.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Mostrar informações sobre este lugar" name="show_place"/>
+ <menu_item_call label="Mostrar no mapa" name="show_on_map"/>
+ <menu_item_call label="Teletransportar para este lugar" name="teleport_to_location"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_url_teleport.xml b/indra/newview/skins/default/xui/pt/menu_url_teleport.xml
new file mode 100644
index 0000000000..f007425646
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_url_teleport.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Url Popup">
+ <menu_item_call label="Teletransportar para este lugar" name="teleport"/>
+ <menu_item_call label="Mostrar no mapa" name="show_on_map"/>
+ <menu_item_call label="Copiar SLurl para área de transferência" name="url_copy"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/menu_viewer.xml b/indra/newview/skins/default/xui/pt/menu_viewer.xml
index 2c887fa50c..5a5a418370 100644
--- a/indra/newview/skins/default/xui/pt/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/pt/menu_viewer.xml
@@ -1,217 +1,320 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<menu_bar name="Main Menu">
- <menu name="Me">
+ <menu label="Eu" name="Me">
<menu_item_call label="Preferências" name="Preferences"/>
- <menu_item_call name="Manage My Account">
- <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=pt" />
+ <menu_item_call label="Meu painel" name="Manage My Account">
+ <menu_item_call.on_click name="ManageMyAccount_url" parameter="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=pt"/>
</menu_item_call>
+ <menu_item_call label="Comprar L$" name="Buy and Sell L$"/>
+ <menu_item_call label="Meu perfil" name="Profile"/>
+ <menu_item_call label="Trocar de look" name="ChangeOutfit"/>
+ <menu_item_check label="Meu inventário" name="Inventory"/>
+ <menu_item_check label="Meu inventário" name="ShowSidetrayInventory"/>
+ <menu_item_check label="Meus gestos" name="Gestures"/>
+ <menu_item_check label="Minha voz" name="ShowVoice"/>
+ <menu label="Meu status" name="Status">
+ <menu_item_call label="Ausente" name="Set Away"/>
+ <menu_item_call label="Ocupado" name="Set Busy"/>
+ </menu>
+ <menu_item_call label="Request Admin Status" name="Request Admin Options"/>
+ <menu_item_call label="Sair do modo admin" name="Leave Admin Options"/>
+ <menu_item_call label="Sair do [APP_NAME]" name="Quit"/>
</menu>
- <menu label="Arquivo" name="File">
- <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
- <menu label="Upload" name="upload">
- <menu_item_call label="Imagem (L$[COST])..." name="Upload Image"/>
- <menu_item_call label="Som (L$[COST])..." name="Upload Sound"/>
- <menu_item_call label="Animação (L$[COST])..." name="Upload Animation"/>
- <menu_item_call label="Bulk (L$[COST] por arquivo)..." name="Bulk Upload"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Definir Permissões Padrão..." name="perm prefs"/>
- </menu>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Fechar janela" name="Close Window"/>
- <menu_item_call label="Fechar todas as janelas" name="Close All Windows"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Salvar textura como..." name="Save Texture As..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Tirar Foto" name="Take Snapshot"/>
- <menu_item_call label="Salvar Foto no disco" name="Snapshot to Disk"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Sair" name="Quit"/>
- </menu>
- <menu label="Editar" name="Edit">
- <menu_item_call label="Voltar" name="Undo"/>
- <menu_item_call label="Avançar" name="Redo"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Cortar" name="Cut"/>
- <menu_item_call label="Copiar" name="Copy"/>
- <menu_item_call label="Colar" name="Paste"/>
- <menu_item_call label="Apagar" name="Delete"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Procurar..." name="Search..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Selecionar todos" name="Select All"/>
- <menu_item_call label="Retirar seleção" name="Deselect"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Duplicar" name="Duplicate"/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu label="Anexar objeto" name="Attach Object"/>
- <menu label="Desanexar objeto" name="Detach Object"/>
- <menu label="Tirar a roupa" name="Take Off Clothing">
- <menu_item_call label="Camiseta" name="Shirt"/>
- <menu_item_call label="Calças" name="Pants"/>
- <menu_item_call label="Sapatos" name="Shoes"/>
- <menu_item_call label="Meias" name="Socks"/>
- <menu_item_call label="Blusa" name="Jacket"/>
- <menu_item_call label="Luvas" name="Gloves"/>
- <menu_item_call label="Anágua" name="Menu Undershirt"/>
- <menu_item_call label="Roupa de baixo" name="Menu Underpants"/>
- <menu_item_call label="saia" name="Skirt"/>
- <menu_item_call label="Toda a roupa" name="All Clothes"/>
- </menu>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Gestos..." name="Gestures..."/>
- <menu_item_call label="Perfil..." name="Profile..."/>
- <menu_item_call label="Aparência..." name="Appearance..."/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu_item_check label="Amigos..." name="Friends..."/>
- <menu_item_call label="Grupos..." name="Groups..."/>
- <menu_item_separator label="-----------" name="separator8"/>
- <menu_item_call label="Preferências..." name="Preferences..."/>
- </menu>
- <menu label="Exibir" name="View">
- <tearoff_menu label="~~~~~~~~~~~" name="~~~~~~~~~~~"/>
- <menu_item_call label="Visão do mouse" name="Mouselook"/>
- <menu_item_check label="Construir" name="Build"/>
- <menu_item_check label="Câmera voadora pelo joystick" name="Joystick Flycam"/>
- <menu_item_call label="Resetar visão" name="Reset View"/>
- <menu_item_call label="Olhar para o último movimento" name="Look at Last Chatter"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Barra de ferramentas" name="Toolbar"/>
- <menu_item_check label="Conversa local" name="Chat History"/>
- <menu_item_check label="Comunicar" name="Instant Message"/>
- <menu_item_check label="Inventário" name="Inventory"/>
- <menu_item_check label="Falantes Ativos" name="Active Speakers"/>
- <menu_item_check label="Lista de residentes e objetos silenciados" name="Mute List"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_check label="Controles de câmera" name="Camera Controls"/>
- <menu_item_check label="Controles de movimento" name="Movement Controls"/>
- <menu_item_check label="Mapa do mundo" name="World Map"/>
- <menu_item_check label="Mini-Mapa" name="Mini-Map"/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_check label="Barra de estatísticas" name="Statistics Bar"/>
- <menu_item_check label="Linhas de propriedades" name="Property Lines"/>
- <menu_item_check label="Linhas de banimento" name="Banlines"/>
- <menu_item_check label="Donos de terrenos" name="Land Owners"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu label="Dicas" name="Hover Tips">
- <menu_item_check label="Mostrar dicas" name="Show Tips"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Dicas de terreno" name="Land Tips"/>
- <menu_item_check label="Dicas de todos os objetos" name="Tips On All Objects"/>
- </menu>
- <menu_item_check label="Luz para transparência" name="Highlight Transparent"/>
- <menu_item_check label="Balizas" name="beacons"/>
- <menu_item_check label="Esconder partículas" name="Hide Particles"/>
- <menu_item_check label="Mostrar anexo em HUD" name="Show HUD Attachments"/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu_item_call label="Mais zoom" name="Zoom In"/>
- <menu_item_call label="Zoom padrão" name="Zoom Default"/>
- <menu_item_call label="Menos zoom" name="Zoom Out"/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Tela cheia" name="Toggle Fullscreen"/>
- <menu_item_call label="Ajustar o tamanho da UI ao padrão" name="Set UI Size to Default"/>
+ <menu label="Comunicar" name="Communicate">
+ <menu_item_call label="Meus amigos" name="My Friends"/>
+ <menu_item_call label="Meus grupos" name="My Groups"/>
+ <menu_item_check label="Bate-papo local" name="Nearby Chat"/>
+ <menu_item_call label="Pessoas por perto" name="Active Speakers"/>
</menu>
<menu label="Mundo" name="World">
- <menu_item_call label="Conversa" name="Chat"/>
- <menu_item_check label="Sempre Correr" name="Always Run"/>
- <menu_item_check label="Voar" name="Fly"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Criar Landmark aqui" name="Create Landmark Here"/>
- <menu_item_call label="Marcar como casa" name="Set Home to Here"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Teletransportar para casa" name="Teleport Home"/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Deixar ausente" name="Set Away"/>
- <menu_item_call label="Deixar Ocupado" name="Set Busy"/>
- <menu_item_call label="Parar Animação do Meu Avatar" name="Stop Animating My Avatar"/>
- <menu_item_call label="Liberar teclas" name="Release Keys"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Histórico de conta..." name="Account History...">
- <on_click name="AccountHistory_url" userdata="WebLaunchAccountHistory,http://secondlife.com/account/transactions.php?lang=pt"/>
- </menu_item_call>
- <menu_item_call label="Gerenciar minha conta..." name="Manage My Account...">
- <on_click name="ManageMyAccount_url" userdata="WebLaunchJoinNow,http://secondlife.com/account/index.php?lang=pt"/>
- </menu_item_call>
- <menu_item_call label="Comprar L$..." name="Buy and Sell L$..."/>
- <menu_item_separator label="-----------" name="separator5"/>
- <menu_item_call label="Meu terreno..." name="My Land..."/>
- <menu_item_call label="Sobre o terreno..." name="About Land..."/>
- <menu_item_call label="Comprar terreno..." name="Buy Land..."/>
- <menu_item_call label="Região/Propriedade..." name="Region/Estate..."/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu label="Configurações de ambiente" name="Environment Settings">
+ <menu_item_check label="Mini Mapa" name="Mini-Map"/>
+ <menu_item_check label="Mapa-múndi" name="World Map"/>
+ <menu_item_call label="Foto" name="Take Snapshot"/>
+ <menu_item_call label="Criar marco deste lugar" name="Create Landmark Here"/>
+ <menu label="Perfil da região" name="Land">
+ <menu_item_call label="Perfil da região" name="Place Profile"/>
+ <menu_item_call label="Sobre terrenos" name="About Land"/>
+ <menu_item_call label="Região/Propriedade" name="Region/Estate"/>
+ </menu>
+ <menu_item_call label="Comprar este terreno" name="Buy Land"/>
+ <menu_item_call label="Meus terrenos" name="My Land"/>
+ <menu label="Mostrar" name="LandShow">
+ <menu_item_check label="Controles de movimento" name="Movement Controls"/>
+ <menu_item_check label="Ver controles" name="Camera Controls"/>
+ <menu_item_check label="Limites" name="Ban Lines"/>
+ <menu_item_check label="Balizas" name="beacons"/>
+ <menu_item_check label="Limites do imóvel" name="Property Lines"/>
+ <menu_item_check label="Proprietários" name="Land Owners"/>
+ <menu_item_check label="Coordenadas" name="Coordinates"/>
+ <menu_item_check label="Propriedades do lote" name="Parcel Properties"/>
+ </menu>
+ <menu_item_call label="Teletransportar para meu início" name="Teleport Home"/>
+ <menu_item_call label="Definir como Início" name="Set Home to Here"/>
+ <menu label="Sol" name="Environment Settings">
<menu_item_call label="Amanhecer" name="Sunrise"/>
<menu_item_call label="Meio-dia" name="Noon"/>
<menu_item_call label="Pôr-do-Sol" name="Sunset"/>
<menu_item_call label="Meia-noite" name="Midnight"/>
- <menu_item_call label="Reverter ao padrão da região" name="Revert to Region Default"/>
- <menu_item_separator label="-----------" name="separator"/>
+ <menu_item_call label="Horário da propriedade" name="Revert to Region Default"/>
<menu_item_call label="Editor de ambiente" name="Environment Editor"/>
</menu>
</menu>
- <menu label="Ferramentas" name="Tools">
- <menu label="Selecionar ferramenta" name="Select Tool">
- <menu_item_call label="Foco" name="Focus"/>
- <menu_item_call label="Mover" name="Move"/>
- <menu_item_call label="Editar" name="Edit"/>
- <menu_item_call label="Criar" name="Create"/>
- <menu_item_call label="Terreno" name="Land"/>
- </menu>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_check label="Selecionar apenas meus objetos" name="Select Only My Objects"/>
- <menu_item_check label="Selecionar apenas objetos móveis" name="Select Only Movable Objects"/>
- <menu_item_check label="Selecionar objetos pela vizinhança" name="Select By Surrounding"/>
- <menu_item_check label="Mostrar seleções escondidas" name="Show Hidden Selection"/>
- <menu_item_check label="Mostrar luz radiante para seleção" name="Show Light Radius for Selection"/>
- <menu_item_check label="Mostrar seleções de feixes" name="Show Selection Beam"/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_check label="Alinhar à grade" name="Snap to Grid"/>
- <menu_item_call label="Alinhar xy do objeto à grade" name="Snap Object XY to Grid"/>
- <menu_item_call label="Usar seleção na grade" name="Use Selection for Grid"/>
- <menu_item_call label="Opções de grade..." name="Grid Options..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_check label="Editar partes unidas" name="Edit Linked Parts"/>
- <menu_item_call label="Unir" name="Link"/>
- <menu_item_call label="Desunir" name="Unlink"/>
- <menu_item_separator label="-----------" name="separator4"/>
- <menu_item_call label="Foco na seleção" name="Focus on Selection"/>
- <menu_item_call label="Zoom na Seleção" name="Zoom to Selection"/>
- <menu_item_call label="Comprar el objeto" name="Menu Object Take">
- <on_enable userdata="Comprar,Pegar" name="EnableBuyOrTake"/>
- </menu_item_call>
- <menu_item_call label="Pegar cópia" name="Take Copy"/>
- <menu_item_call label="Salvar objeto de volta aos conteúdos do objeto" name="Save Object Back to Object Contents"/>
- <menu_item_separator label="-----------" name="separator6"/>
- <menu_item_call label="Mostrar scripts defeituosos/Erros de janela" name="Show Script Warning/Error Window"/>
- <menu label="Recompilar os scripts na seleção" name="Recompile Scripts in Selection">
- <menu_item_call label="Mono" name="Mono"/>
- <menu_item_call label="LSL" name="LSL"/>
- </menu>
- <menu_item_call label="Resetar scripts selecionados" name="Reset Scripts in Selection"/>
- <menu_item_call label="Ajustar scripts para rodar na seleção" name="Set Scripts to Running in Selection"/>
- <menu_item_call label="Ajustar scripts para não rodar na seleção" name="Set Scripts to Not Running in Selection"/>
+ <menu label="Construir" name="BuildTools">
+ <menu_item_check label="Construir" name="Show Build Tools"/>
+ <menu label="Selecionar ferramenta de construção" name="Select Tool">
+ <menu_item_call label="Ferramenta enfoque" name="Focus"/>
+ <menu_item_call label="Ferramenta de movimentação" name="Move"/>
+ <menu_item_call label="Ferramenta de edição" name="Edit"/>
+ <menu_item_call label="Ferramenta criar" name="Create"/>
+ <menu_item_call label="Ferramenta de terrenos" name="Land"/>
+ </menu>
+ <menu_item_call label="Link" name="Link"/>
+ <menu_item_call label="Desconectar links" name="Unlink"/>
+ <menu_item_check label="Edit Linked Parts" name="Edit Linked Parts"/>
+ <menu label="Selecionar partes conectadas" name="Select Linked Parts">
+ <menu_item_call label="Selecionar próxima parte" name="Select Next Part"/>
+ <menu_item_call label="Selecionar parte anterior" name="Select Previous Part"/>
+ <menu_item_call label="Incluir próxima parte" name="Include Next Part"/>
+ <menu_item_call label="Incluir parte anterior" name="Include Previous Part"/>
+ </menu>
+ <menu_item_call label="Enfocar seleção" name="Focus on Selection"/>
+ <menu_item_call label="Ampliar seleção" name="Zoom to Selection"/>
+ <menu label="Objeto:" name="Object">
+ <menu_item_call label="Comprar" name="Menu Object Buy"/>
+ <menu_item_call label="Pegar" name="Menu Object Take"/>
+ <menu_item_call label="Pegar uma cópia" name="Take Copy"/>
+ <menu_item_call label="Salvar no meu inventário" name="Save Object Back to My Inventory"/>
+ <menu_item_call label="Save Back to Object Contents" name="Save Object Back to Object Contents"/>
+ </menu>
+ <menu label="Scripts" name="Scripts">
+ <menu_item_call label="Recompilar scripts (LSL)" name="Mono"/>
+ <menu_item_call label="Recompilar scripts (LSL)" name="LSL"/>
+ <menu_item_call label="Resetar scripts" name="Reset Scripts"/>
+ <menu_item_call label="Scripts em modo execução" name="Set Scripts to Running"/>
+ <menu_item_call label="Scripts em modo não execução" name="Set Scripts to Not Running"/>
+ </menu>
+ <menu label="Opções" name="Options">
+ <menu_item_call label="Definir permissões padrão de upload" name="perm prefs"/>
+ <menu_item_check label="Mostrar permissões avançadas" name="DebugPermissions"/>
+ <menu_item_check label="Só selecionar meus objetos" name="Select Only My Objects"/>
+ <menu_item_check label="Só selecionar objetos móveis" name="Select Only Movable Objects"/>
+ <menu_item_check label="Selecionar contornando" name="Select By Surrounding"/>
+ <menu_item_check label="Mostrar seleção oculta" name="Show Hidden Selection"/>
+ <menu_item_check label="Mostrar alcance de luz da seleção" name="Show Light Radius for Selection"/>
+ <menu_item_check label="Mostrar raio de seleção" name="Show Selection Beam"/>
+ <menu_item_check label="Encaixar em grade" name="Snap to Grid"/>
+ <menu_item_call label="Encaixar objeto XY em grade" name="Snap Object XY to Grid"/>
+ <menu_item_call label="Usar seleção em grade" name="Use Selection for Grid"/>
+ <menu_item_call label="Opções de grade" name="Grid Options"/>
+ </menu>
+ <menu label="Upload" name="Upload">
+ <menu_item_call label="Imagem (L$[COST])..." name="Upload Image"/>
+ <menu_item_call label="Som (L$[COST])..." name="Upload Sound"/>
+ <menu_item_call label="Animação (L$[COST])..." name="Upload Animation"/>
+ <menu_item_call label="Volume (L$[COST] por arquivo)..." name="Bulk Upload"/>
+ </menu>
</menu>
<menu label="Ajuda" name="Help">
- <menu_item_call label="Ajuda [SECOND_LIFE]" name="Second Life Help"/>
- <menu_item_call label="Tutorial" name="Tutorial"/>
- <menu_item_separator label="-----------" name="separator"/>
- <menu_item_call label="Blog oficial da Linden..." name="Official Linden Blog..."/>
- <menu_item_separator label="-----------" name="separator2"/>
- <menu_item_call label="Portal de Scripts..." name="Scripting Portal..."/>
- <menu_item_separator label="-----------" name="separator3"/>
- <menu_item_call label="Reportar Abuso..." name="Report Abuse..."/>
- <menu_item_call label="Colisões, impulsos e batidas..." name="Bumps, Pushes &amp;amp; Hits..."/>
- <menu_item_call label="Medidor de Lag" name="Lag Meter"/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu label="Reportando Bug" name="Bug Reporting">
- <menu_item_call label="Rastreador público de problemas..." name="Public Issue Tracker..."/>
- <menu_item_call label="Ajuda do rastreador público de problemas..." name="Publc Issue Tracker Help..."/>
- <menu_item_separator label="-----------" name="separator7"/>
- <menu_item_call label="Reportando Bug 101..." name="Bug Reporing 101..."/>
- <menu_item_call label="Questões de Segurança..." name="Security Issues..."/>
- <menu_item_call label="Wiki de QA ..." name="QA Wiki..."/>
- <menu_item_separator label="-----------" name="separator9"/>
- <menu_item_call label="Reportar Bug..." name="Report Bug..."/>
- </menu>
- <menu_item_call label="Sobre [APP_NAME]..." name="About Second Life..."/>
+ <menu_item_call label="[SECOND_LIFE] Ajuda" name="Second Life Help"/>
+ <menu_item_call label="Denunciar abuso" name="Report Abuse"/>
+ <menu_item_call label="Relatar bug" name="Report Bug"/>
+ <menu_item_call label="Sobre [APP_NAME]" name="About Second Life"/>
+ </menu>
+ <menu label="Avançado" name="Advanced">
+ <menu_item_check label="Exibir menu avançado" name="Show Advanced Menu"/>
+ <menu_item_call label="Parar minha animação" name="Stop Animating My Avatar"/>
+ <menu_item_call label="Recarregar texturas" name="Rebake Texture"/>
+ <menu_item_call label="Interface tamanho padrão" name="Set UI Size to Default"/>
+ <menu_item_call label="Definir tamanho da janela:" name="Set Window Size..."/>
+ <menu_item_check label="Limitar distância da seleção" name="Limit Select Distance"/>
+ <menu_item_check label="Disable Camera Constraints" name="Disable Camera Distance"/>
+ <menu_item_check label="Foto de alta resolução" name="HighResSnapshot"/>
+ <menu_item_check label="Compactar fotos para HD" name="QuietSnapshotsToDisk"/>
+ <menu_item_check label="Compactar fotos para HD" name="CompressSnapshotsToDisk"/>
+ <menu label="Ferramentas de desempenho" name="Performance Tools">
+ <menu_item_call label="Medidor de lag" name="Lag Meter"/>
+ <menu_item_check label="Barra de estatísticas" name="Statistics Bar"/>
+ <menu_item_check label="Carga de renderização de avatar" name="Avatar Rendering Cost"/>
+ </menu>
+ <menu label="Realces e visibilidade" name="Highlighting and Visibility">
+ <menu_item_check label="Efeito baliza piscando" name="Cheesy Beacon"/>
+ <menu_item_check label="Hide Particles" name="Hide Particles"/>
+ <menu_item_check label="Ocultar seleções" name="Hide Selected"/>
+ <menu_item_check label="Realçar transparentes" name="Highlight Transparent"/>
+ <menu_item_check label="Mostrar anexos HUD" name="Show HUD Attachments"/>
+ <menu_item_check label="Mostrar retículo na vista subjetiva" name="ShowCrosshairs"/>
+ </menu>
+ <menu label="Tipos de renderização" name="Rendering Types">
+ <menu_item_check label="Simples" name="Simple"/>
+ <menu_item_check label="Alpha" name="Alpha"/>
+ <menu_item_check label="Ãrvore" name="Tree"/>
+ <menu_item_check label="Avatares" name="Character"/>
+ <menu_item_check label="SurfacePath" name="SurfacePath"/>
+ <menu_item_check label="Céu" name="Sky"/>
+ <menu_item_check label="Ãgua" name="Water"/>
+ <menu_item_check label="Chão" name="Ground"/>
+ <menu_item_check label="Volume" name="Volume"/>
+ <menu_item_check label="Grama" name="Grass"/>
+ <menu_item_check label="Nuvens" name="Clouds"/>
+ <menu_item_check label="Particles" name="Particles"/>
+ <menu_item_check label="Elevação" name="Bump"/>
+ </menu>
+ <menu label="Recursos de renderização" name="Rendering Features">
+ <menu_item_check label="Interface" name="UI"/>
+ <menu_item_check label="Selecionado" name="Selected"/>
+ <menu_item_check label="Realçado" name="Highlighted"/>
+ <menu_item_check label="Texturas dinâmicas" name="Dynamic Textures"/>
+ <menu_item_check label="Sombras nos pés" name="Foot Shadows"/>
+ <menu_item_check label="Neblina" name="Fog"/>
+ <menu_item_check label="Objetos flexíveis" name="Flexible Objects"/>
+ </menu>
+ <menu_item_check label="Executar diversas instâncias" name="Run Multiple Threads"/>
+ <menu_item_check label="Usar plugin de leitura de threads" name="Use Plugin Read Thread"/>
+ <menu_item_call label="Limpar cache de grupo" name="ClearGroupCache"/>
+ <menu_item_check label="Smoothing de mouse" name="Mouse Smoothing"/>
+ <menu label="Atalhos" name="Shortcuts">
+ <menu_item_call label="Imagem (L$[COST])..." name="Upload Image"/>
+ <menu_item_check label="Busca" name="Search"/>
+ <menu_item_call label="Soltar objeto" name="Release Keys"/>
+ <menu_item_call label="Interface tamanho padrão" name="Set UI Size to Default"/>
+ <menu_item_check label="Correr sempre" name="Always Run"/>
+ <menu_item_check label="Voar" name="Fly"/>
+ <menu_item_call label="Fechar janela" name="Close Window"/>
+ <menu_item_call label="Fechar todas as janelas" name="Close All Windows"/>
+ <menu_item_call label="Gravar fotos no HD" name="Snapshot to Disk"/>
+ <menu_item_call label="Visão subjetiva" name="Mouselook"/>
+ <menu_item_check label="Flycam Joystick" name="Joystick Flycam"/>
+ <menu_item_call label="Visão padrão" name="Reset View"/>
+ <menu_item_call label="Olhar para quem fala por último" name="Look at Last Chatter"/>
+ <menu label="Selecionar ferramenta de construção" name="Select Tool">
+ <menu_item_call label="Ferramenta enfoque" name="Focus"/>
+ <menu_item_call label="Ferramenta de movimentação" name="Move"/>
+ <menu_item_call label="Ferramenta de edição" name="Edit"/>
+ <menu_item_call label="Ferramenta criar" name="Create"/>
+ <menu_item_call label="Ferramenta de terrenos" name="Land"/>
+ </menu>
+ <menu_item_call label="Mais zoom" name="Zoom In"/>
+ <menu_item_call label="Zoom padrão" name="Zoom Default"/>
+ <menu_item_call label="Menos zoom" name="Zoom Out"/>
+ </menu>
+ <menu_item_call label="Mostrar configurações de depuração" name="Debug Settings"/>
+ <menu_item_check label="Show Develop Menu" name="Debug Mode"/>
+ </menu>
+ <menu label="Desenvolver" name="Develop">
+ <menu label="Painéis" name="Consoles">
+ <menu_item_check label="Painel de textura" name="Texture Console"/>
+ <menu_item_check label="Console de depuração" name="Debug Console"/>
+ <menu_item_call label="Painel de avisos" name="Notifications"/>
+ <menu_item_check label="Painel de tamanho de textura" name="Texture Size"/>
+ <menu_item_check label="Painel de texturas" name="Texture Category"/>
+ <menu_item_check label="Tempos" name="Fast Timers"/>
+ <menu_item_check label="Memória" name="Memory"/>
+ <menu_item_call label="Region Info to Debug Console" name="Region Info to Debug Console"/>
+ <menu_item_check label="Câmera:" name="Camera"/>
+ <menu_item_check label="Vento" name="Wind"/>
+ <menu_item_check label="Crachá" name="Badge"/>
+ </menu>
+ <menu label="Show Info" name="Display Info">
+ <menu_item_check label="Mostrar hora" name="Show Time"/>
+ <menu_item_check label="Dados de renderização" name="Show Render Info"/>
+ <menu_item_check label="Mostrar cor sob o cursor" name="Show Color Under Cursor"/>
+ <menu_item_check label="Mostrar mudanças a objetos" name="Show Updates"/>
+ </menu>
+ <menu label="Force an Error" name="Force Errors">
+ <menu_item_call label="Force Breakpoint" name="Force Breakpoint"/>
+ <menu_item_call label="Force LLError And Crash" name="Force LLError And Crash"/>
+ <menu_item_call label="Force Bad Memory Access" name="Force Bad Memory Access"/>
+ <menu_item_call label="Force an Infinite Loop" name="Force Infinite Loop"/>
+ <menu_item_call label="Force Driver Crash" name="Force Driver Carsh"/>
+ <menu_item_call label="Force Software Exception" name="Force Software Exception"/>
+ <menu_item_call label="Force Disconnect Viewer" name="Force Disconnect Viewer"/>
+ <menu_item_call label="Simulate a Memory Leak" name="Memory Leaking Simulation"/>
+ </menu>
+ <menu label="Render Tests" name="Render Tests">
+ <menu_item_check label="Camera Offset" name="Camera Offset"/>
+ <menu_item_check label="Taxa de quadros aleatória" name="Randomize Framerate"/>
+ <menu_item_check label="Frame Test" name="Frame Test"/>
+ </menu>
+ <menu label="Rendering" name="Rendering">
+ <menu_item_check label="Axes" name="Axes"/>
+ <menu_item_check label="Wireframe" name="Wireframe"/>
+ <menu_item_check label="Global Illumination" name="Global Illumination"/>
+ <menu_item_check label="Texturas de animação" name="Animation Textures"/>
+ <menu_item_check label="Desativar texturas" name="Disable Textures"/>
+ <menu_item_check label="Render Attached Lights" name="Render Attached Lights"/>
+ <menu_item_check label="Render Attached Particles" name="Render Attached Particles"/>
+ <menu_item_check label="Objetos iridescentes" name="Hover Glow Objects"/>
+ </menu>
+ <menu label="Rede" name="Network">
+ <menu_item_check label="Pausar avatar" name="AgentPause"/>
+ <menu_item_call label="Drop a Packet" name="Drop a Packet"/>
+ </menu>
+ <menu_item_call label="Empurrões, trombadas e tapas" name="Bumps, Pushes &amp;amp; Hits"/>
+ <menu label="Mundo" name="World">
+ <menu_item_check label="Impor sobre sol regional" name="Sim Sun Override"/>
+ <menu_item_check label="Efeito baliza piscando" name="Cheesy Beacon"/>
+ <menu_item_check label="Fixed Weather" name="Fixed Weather"/>
+ <menu_item_call label="Dump Region Object Cache" name="Dump Region Object Cache"/>
+ </menu>
+ <menu label="Interface" name="UI">
+ <menu_item_call label="Teste de navegador web" name="Web Browser Test"/>
+ <menu_item_call label="Print Selected Object Info" name="Print Selected Object Info"/>
+ <menu_item_call label="Dados de memória" name="Memory Stats"/>
+ <menu_item_check label="Double-Click Auto-Pilot" name="Double-ClickAuto-Pilot"/>
+ <menu_item_check label="Debug Clicks" name="Debug Clicks"/>
+ <menu_item_check label="Debug Mouse Events" name="Debug Mouse Events"/>
+ </menu>
+ <menu label="XUI" name="XUI">
+ <menu_item_call label="Recarregar cores" name="Reload Color Settings"/>
+ <menu_item_call label="Teste de fonte" name="Show Font Test"/>
+ <menu_item_call label="Carregar de XML" name="Load from XML"/>
+ <menu_item_call label="Salvar para XML" name="Save to XML"/>
+ <menu_item_check label="Mostrar nomes XUI" name="Show XUI Names"/>
+ <menu_item_call label="Enviar MIs de teste" name="Send Test IMs"/>
+ </menu>
+ <menu label="Avatar" name="Character">
+ <menu label="Grab Baked Texture" name="Grab Baked Texture">
+ <menu_item_call label="Ãris" name="Iris"/>
+ <menu_item_call label="Cabeça" name="Head"/>
+ <menu_item_call label="Cintura acima" name="Upper Body"/>
+ <menu_item_call label="Cintura para baixo" name="Lower Body"/>
+ <menu_item_call label="Saia" name="Skirt"/>
+ </menu>
+ <menu label="Testes de personagem" name="Character Tests">
+ <menu_item_call label="Toggle Character Geometry" name="Toggle Character Geometry"/>
+ <menu_item_check label="Allow Select Avatar" name="Allow Select Avatar"/>
+ </menu>
+ <menu_item_call label="Force Params to Default" name="Force Params to Default"/>
+ <menu_item_check label="Dados da animação" name="Animation Info"/>
+ <menu_item_check label="Mostrar animação de movimento" name="Slow Motion Animations"/>
+ <menu_item_check label="Disable Level Of Detail" name="Disable LOD"/>
+ <menu_item_check label="Show Collision Skeleton" name="Show Collision Skeleton"/>
+ <menu_item_check label="Display Agent Target" name="Display Agent Target"/>
+ <menu_item_call label="Depurar texturas do avatar" name="Debug Avatar Textures"/>
+ </menu>
+ <menu_item_check label="Texturas HTTP" name="HTTP Textures"/>
+ <menu_item_check label="Console Window on next Run" name="Console Window"/>
+ <menu_item_check label="Mostrar menu admin" name="View Admin Options"/>
+ <menu_item_call label="Request Admin Status" name="Request Admin Options"/>
+ <menu_item_call label="Sair do modo admin" name="Leave Admin Options"/>
+ </menu>
+ <menu label="Admin" name="Admin">
+ <menu label="Object">
+ <menu_item_call label="Pegar uma cópia" name="Take Copy"/>
+ <menu_item_call label="Force Owner To Me" name="Force Owner To Me"/>
+ <menu_item_call label="Force Owner Permissive" name="Force Owner Permissive"/>
+ <menu_item_call label="Excluir" name="Delete"/>
+ <menu_item_call label="Bloquear" name="Lock"/>
+ </menu>
+ <menu label="Lote" name="Parcel">
+ <menu_item_call label="Force Owner To Me" name="Owner To Me"/>
+ <menu_item_call label="Conteúdo da Linden Lab" name="Set to Linden Content"/>
+ <menu_item_call label="Pedir terras públicas" name="Claim Public Land"/>
+ </menu>
+ <menu label="Região" name="Region">
+ <menu_item_call label="Dump Temporary Asset Data" name="Dump Temp Asset Data"/>
+ <menu_item_call label="Save Region State" name="Save Region State"/>
+ </menu>
+ <menu_item_call label="God Tools" name="God Tools"/>
</menu>
</menu_bar>
diff --git a/indra/newview/skins/default/xui/pt/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/pt/menu_wearable_list_item.xml
new file mode 100644
index 0000000000..dbf942796c
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/menu_wearable_list_item.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<context_menu name="Outfit Wearable Context Menu">
+ <menu_item_call label="Vestir" name="wear"/>
+ <menu_item_call label="Adicionar" name="wear_add"/>
+ <menu_item_call label="Tirar / Separar" name="take_off_or_detach"/>
+ <menu_item_call label="Separar" name="detach"/>
+ <context_menu label="Colocar em â–¶" name="wearable_attach_to"/>
+ <context_menu label="Anexar ao HUD â–¶" name="wearable_attach_to_hud"/>
+ <menu_item_call label="Tirar" name="take_off"/>
+ <menu_item_call label="Editar" name="edit"/>
+ <menu_item_call label="Perfil do objeto" name="object_profile"/>
+ <menu_item_call label="Mostrar original" name="show_original"/>
+</context_menu>
diff --git a/indra/newview/skins/default/xui/pt/mime_types_linux.xml b/indra/newview/skins/default/xui/pt/mime_types_linux.xml
new file mode 100644
index 0000000000..789843cbba
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/mime_types_linux.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Conteúdo web
+ </label>
+ <tooltip name="web_tooltip">
+ Este lugar possui conteúdo na web
+ </tooltip>
+ <playtip name="web_playtip">
+ Mostrar conteúdo na web
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Filme
+ </label>
+ <tooltip name="movie_tooltip">
+ Aqui tem um vídeo para você assistir
+ </tooltip>
+ <playtip name="movie_playtip">
+ Mostrar vídeo
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Imagem
+ </label>
+ <tooltip name="image_tooltip">
+ Aqui tem uma imagem para você ver
+ </tooltip>
+ <playtip name="image_playtip">
+ Mostrar imagem
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Ãudio
+ </label>
+ <tooltip name="audio_tooltip">
+ Aqui tem um clipe de áudio para você ouvir
+ </tooltip>
+ <playtip name="audio_playtip">
+ Tocar clipe
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Stream em tempo real
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Nenhum -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Nenhum -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Ãudio
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Vídeo
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Imagem
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Vídeo (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Ogg Ãudio/Vídeo
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ Arquivo PDF
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Arquivo Postscript
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Rich Text (RTF)
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Synchronized Multimedia Integration Language (SMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Página web (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Ãudio (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Ãudio (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Ãudio (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Ãudio (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Imagem (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Imagem (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Imagem (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Imagem (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Imagem (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Imagem (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Página web
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ Texto
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Vídeo (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Vídeo (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Vídeo (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Vídeo (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Vídeo (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Vídeo (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/pt/mime_types_mac.xml b/indra/newview/skins/default/xui/pt/mime_types_mac.xml
new file mode 100644
index 0000000000..34b40e94ab
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/mime_types_mac.xml
@@ -0,0 +1,217 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<mimetypes name="default">
+ <widgetset name="web">
+ <label name="web_label">
+ Conteúdo Web
+ </label>
+ <tooltip name="web_tooltip">
+ Esta localização tem conteúdo Web
+ </tooltip>
+ <playtip name="web_playtip">
+ Exibir conteúdo Web
+ </playtip>
+ </widgetset>
+ <widgetset name="movie">
+ <label name="movie_label">
+ Filme
+ </label>
+ <tooltip name="movie_tooltip">
+ Há um filme que vai passar aqui
+ </tooltip>
+ <playtip name="movie_playtip">
+ Começar filme
+ </playtip>
+ </widgetset>
+ <widgetset name="image">
+ <label name="image_label">
+ Imagem
+ </label>
+ <tooltip name="image_tooltip">
+ Ha uma imagem nesta localização
+ </tooltip>
+ <playtip name="image_playtip">
+ Visualizar a imagem desta localização
+ </playtip>
+ </widgetset>
+ <widgetset name="audio">
+ <label name="audio_label">
+ Audio
+ </label>
+ <tooltip name="audio_tooltip">
+ Há áudio nesta localização
+ </tooltip>
+ <playtip name="audio_playtip">
+ Tocar o áudio desta localização
+ </playtip>
+ </widgetset>
+ <scheme name="rtsp">
+ <label name="rtsp_label">
+ Real Time Streaming
+ </label>
+ </scheme>
+ <mimetype name="blank">
+ <label name="blank_label">
+ - Nenhum -
+ </label>
+ </mimetype>
+ <mimetype name="none/none">
+ <label name="none/none_label">
+ - Nenhum -
+ </label>
+ </mimetype>
+ <mimetype name="audio/*">
+ <label name="audio2_label">
+ Ãudio
+ </label>
+ </mimetype>
+ <mimetype name="video/*">
+ <label name="video2_label">
+ Vídeo
+ </label>
+ </mimetype>
+ <mimetype name="image/*">
+ <label name="image2_label">
+ Imagem
+ </label>
+ </mimetype>
+ <mimetype name="video/vnd.secondlife.qt.legacy">
+ <label name="vnd.secondlife.qt.legacy_label">
+ Filme (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="application/javascript">
+ <label name="application/javascript_label">
+ Javascript
+ </label>
+ </mimetype>
+ <mimetype name="application/ogg">
+ <label name="application/ogg_label">
+ Ogg Ãudio/Video
+ </label>
+ </mimetype>
+ <mimetype name="application/pdf">
+ <label name="application/pdf_label">
+ Documento PDF
+ </label>
+ </mimetype>
+ <mimetype name="application/postscript">
+ <label name="application/postscript_label">
+ Documento Postscript
+ </label>
+ </mimetype>
+ <mimetype name="application/rtf">
+ <label name="application/rtf_label">
+ Rich Text (RTF)
+ </label>
+ </mimetype>
+ <mimetype name="application/smil">
+ <label name="application/smil_label">
+ Linguagem sincronizada de integração multimidia (SMIL)
+ </label>
+ </mimetype>
+ <mimetype name="application/xhtml+xml">
+ <label name="application/xhtml+xml_label">
+ Página Web (XHTML)
+ </label>
+ </mimetype>
+ <mimetype name="application/x-director">
+ <label name="application/x-director_label">
+ Macromedia Director
+ </label>
+ </mimetype>
+ <mimetype name="audio/mid">
+ <label name="audio/mid_label">
+ Ãudio (MIDI)
+ </label>
+ </mimetype>
+ <mimetype name="audio/mpeg">
+ <label name="audio/mpeg_label">
+ Ãudio (MP3)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-aiff">
+ <label name="audio/x-aiff_label">
+ Ãudio (AIFF)
+ </label>
+ </mimetype>
+ <mimetype name="audio/x-wav">
+ <label name="audio/x-wav_label">
+ Ãudio (WAV)
+ </label>
+ </mimetype>
+ <mimetype name="image/bmp">
+ <label name="image/bmp_label">
+ Imagem (BMP)
+ </label>
+ </mimetype>
+ <mimetype name="image/gif">
+ <label name="image/gif_label">
+ Imagem (GIF)
+ </label>
+ </mimetype>
+ <mimetype name="image/jpeg">
+ <label name="image/jpeg_label">
+ Imagem (JPEG)
+ </label>
+ </mimetype>
+ <mimetype name="image/png">
+ <label name="image/png_label">
+ Imagem (PNG)
+ </label>
+ </mimetype>
+ <mimetype name="image/svg+xml">
+ <label name="image/svg+xml_label">
+ Imagem (SVG)
+ </label>
+ </mimetype>
+ <mimetype name="image/tiff">
+ <label name="image/tiff_label">
+ Imagem (TIFF)
+ </label>
+ </mimetype>
+ <mimetype name="text/html">
+ <label name="text/html_label">
+ Página Web
+ </label>
+ </mimetype>
+ <mimetype name="text/plain">
+ <label name="text/plain_label">
+ Texto
+ </label>
+ </mimetype>
+ <mimetype name="text/xml">
+ <label name="text/xml_label">
+ XML
+ </label>
+ </mimetype>
+ <mimetype name="video/mpeg">
+ <label name="video/mpeg_label">
+ Filme (MPEG)
+ </label>
+ </mimetype>
+ <mimetype name="video/mp4">
+ <label name="video/mp4_label">
+ Filme (MP4)
+ </label>
+ </mimetype>
+ <mimetype name="video/quicktime">
+ <label name="video/quicktime_label">
+ Filme (QuickTime)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-asf">
+ <label name="video/x-ms-asf_label">
+ Filme (Windows Media ASF)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-ms-wmv">
+ <label name="video/x-ms-wmv_label">
+ Filme (Windows Media WMV)
+ </label>
+ </mimetype>
+ <mimetype name="video/x-msvideo">
+ <label name="video/x-msvideo_label">
+ Filme (AVI)
+ </label>
+ </mimetype>
+</mimetypes>
diff --git a/indra/newview/skins/default/xui/pt/notifications.xml b/indra/newview/skins/default/xui/pt/notifications.xml
index c3ce53861f..4a738bf0ea 100644
--- a/indra/newview/skins/default/xui/pt/notifications.xml
+++ b/indra/newview/skins/default/xui/pt/notifications.xml
@@ -9,74 +9,45 @@
<global name="implicitclosebutton">
Fechar
</global>
- <template name="okbutton">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- </form>
- </template>
-
- <template name="okignore">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <ignore text="$ignoretext"/>
- </form>
- </template>
-
- <template name="okcancelbuttons">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Cancel"
- text="$notext"/>
- </form>
- </template>
-
- <template name="okcancelignore">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Cancel"
- text="$notext"/>
- <ignore text="$ignoretext"/>
- </form>
- </template>
-
- <template name="okhelpbuttons">
- <form>
- <button
- name="OK"
- text="$yestext"/>
- <button
- name="Help"
- text="$helptext"/>
- </form>
- </template>
-
- <template name="yesnocancelbuttons">
- <form>
- <button
- name="Yes"
- text="$yestext"/>
- <button
- name="No"
- text="$notext"/>
- <button
- name="Cancel"
- text="$canceltext"/>
- </form>
- </template>
- <notification functor="GenericAcknowledge" label="Mensagem de Alerta Desconhecida" name="MissingAlert">
- Sua versão do [APP_NAME] não sabe como mostrar a mensagem de alerta que acabou de receber.
-
-Detalhes do erro: O alerta chamado &apos;[_NAME]&apos; não foi encontrado em notifications.xml.
+ <template name="okbutton">
+ <form>
+ <button name="OK_okbutton" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okignore">
+ <form>
+ <button name="OK_okignore" text="$yestext"/>
+ </form>
+ </template>
+ <template name="okcancelbuttons">
+ <form>
+ <button name="OK_okcancelbuttons" text="$yestext"/>
+ <button name="Cancel_okcancelbuttons" text="$notext"/>
+ </form>
+ </template>
+ <template name="okcancelignore">
+ <form>
+ <button name="OK_okcancelignore" text="$yestext"/>
+ <button name="Cancel_okcancelignore" text="$notext"/>
+ </form>
+ </template>
+ <template name="okhelpbuttons">
+ <form>
+ <button name="OK_okhelpbuttons" text="$yestext"/>
+ <button name="Help" text="$helptext"/>
+ </form>
+ </template>
+ <template name="yesnocancelbuttons">
+ <form>
+ <button name="Yes" text="$yestext"/>
+ <button name="No" text="$notext"/>
+ <button name="Cancel_yesnocancelbuttons" text="$canceltext"/>
+ </form>
+ </template>
+ <notification functor="GenericAcknowledge" label="Notificação desconhecida" name="MissingAlert">
+ Esta versão do [APP_NAME] não consegue exibir o aviso recebido. Verifique se você possui a versão mais recente do Visualizador.
+
+Detalhes do erro: O aviso &apos;[_NAME]&apos; não foi localizado no arquivo notifications.xml.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="FloaterNotFound">
@@ -96,24 +67,18 @@ Detalhes do erro: O alerta chamado &apos;[_NAME]&apos; não foi encontrado em no
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sim"/>
</notification>
<notification name="BadInstallation">
- Ocorreu um erro atualizando o [APP_NAME]. Por favor, faça o download da última versão em secondlife.com.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ Um erro ocorreu ao atualizar o [APP_NAME]. [http://get.secondlife.com Baixe a versão atual] do Visualizador.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LoginFailedNoNetwork">
- Erro de Rede: Não conseguiu estabelecer uma conexão.
+ Falha de conexão com o [SECOND_LIFE_GRID].
&apos;[DIAGNOSTIC]&apos;
-Por favor, verifique sua conexão de rede.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+Verifique se a conexão à internet está funcionando.
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="MessageTemplateNotFound">
Modelo de Mensagem [PATH] não encontrado.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="WearableSave">
Salvar modificações?
@@ -139,15 +104,18 @@ Por favor, selecione apenas um objeto e tente novamente.
Salvar todas as mudanças de roupas/ partes do corpo?
<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Não Salvar" yestext="Salvar tudo"/>
</notification>
+ <notification name="FriendsAndGroupsOnly">
+ Residentes que não são amigos não veem que você decidiu ignorar ligações e MIs deles.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="GrantModifyRights">
- Conceder direitos de modificar a outros residentes lhes permite trocar, deletar ou pegar QUAISQUER objetos que você possa ter no mundo.
-Seja MUITO cuidadoso(a) quando passar esta permissão.
-Você deseja conceder direitos de modificar para [FIRST_NAME] [LAST_NAME]?
+ Conceder direitos de modificação a outros residentes vai autorizá-los a mudar, apagar ou pegar TODOS os seus objetos. Seja MUITO cuidadoso ao conceder esta autorização.
+Deseja modificar os direitos de modificação de [FIRST_NAME] [LAST_NAME]?
<usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/>
</notification>
<notification name="GrantModifyRightsMultiple">
- Conceder direitos para modificar seus objetos a outro residente permite ele mudar QUAISQUER objetos que você possa ter no mundo. Tenha muito cuidado quando conceder essa permissão.
-Você deseja permitir que os residentes selecionados tenham direito de edição?
+ Conceder direitos de modificação a outros residentes vai autorizá-los a mudar TODOS os seus objetos. Seja MUITO cuidadoso ao conceder esta autorização.
+Deseja conceder direitos de modificação para os residentes selecionados?
<usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/>
</notification>
<notification name="RevokeModifyRights">
@@ -177,7 +145,7 @@ Você deseja permitir que os residentes selecionados tenham direito de edição?
Membros não podem ser removidos dessa função.
Os membros podem, eles próprios, recusar a função.
Deseja continuar?
- <usetemplate ignoretext="Quando adicionar membro ao grupo como dono" name="okcancelignore" notext="Não" yestext="Sim"/>
+ <usetemplate ignoretext="Confirmar antes de adicionar novo Proprietário do grupo" name="okcancelignore" notext="Não" yestext="Sim"/>
</notification>
<notification name="AssignDangerousActionWarning">
Você está prestes a adicionar a habilidade &apos;[ACTION_NAME]&apos; para a função &apos;[ROLE_NAME]&apos;
@@ -197,68 +165,31 @@ Qualquer membro numa função com esta habilidade, pode atribuir a sí mesmo --
Adicionar esta habilidade a &apos;[ROLE_NAME]&apos;?
<usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/>
</notification>
- <notification name="ClickPublishHelpLand">
- Selecionando &quot;Publicar na Busca&quot;
-Clicando neste Box, será mostrado:
-- este lote nos resultados de busca
-- os objetos públicos deste lote
-- este lote na busca da web
- </notification>
- <notification name="ClickSoundHelpLand">
- Mídia e Música podem apenas ser utilizadas dentro deste lote. As opções de Som e Voz podem ser restritas ao lote ou serão ouvidas por residentes fora do lote, dependendo de suas Classificações de maturidade. Ir para o Banco de Conhecimento para saber mais sobre como definir essas opções?
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=5046
- </url>
- <usetemplate
- name="okcancelbuttons"
- yestext="Ir para o Banco de Conhecimento"
- notext="Fechar" />
- </notification>
- <notification name="ClickSearchHelpAll">
- Os resultados de busca são organizados com base na aba em que você se encontra, sua Classificação de maturidade, a categoria escolhida e outros fatores. Para mais detalhes, por favor veja o Banco de Conhecimento.
- <url name="url">
- https://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;task=knowledge&amp;questionID=4722
- </url>
- <usetemplate
- name="okcancelbuttons"
- yestext="Ir para o Banco de Conhecimento"
- notext="Fechar" />
- </notification>
- <notification name="ClickPublishHelpLandDisabled">
- Você não pode fazer este lote visível na busca porque ele está localizado numa região que proíbe isso.
- </notification>
- <notification name="ClickPublishHelpAvatar">
- Selecionando &quot;Mostrar na Busca&quot; será mostrado:
-- meu perfil nos resultados de busca
-- um link para meu perfil nas páginas de grupos públicos
- </notification>
- <notification name="ClickPartnerHelpAvatar">
- Você pode propor a outro Residente ou dissolver uma parceria existente através do website [SECOND_LIFE].
-
-Ir para o site do [SECOND_LIFE] para mais informações sobre parceria?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Ir para a Página"/>
- </notification>
- <notification name="ClickUploadHelpPermissions">
- Suas permissões padrão podem não funcionar em regiões antigas.
- </notification>
- <notification name="ClickWebProfileHelpAvatar">
- Se este Residente definiu uma URL de perfil na web, então você pode:
- * Clicar em &apos;Carregar&apos; para ver a página na aba Web.
- * Clicar Carregar &gt; &apos;Em navegador externo&apos; para ver a página no seu navegador de web padrão.
- * Clicar Carregar &gt; &apos;URL de Casa&apos; para voltar ao perfil do Residente na web se você navegou adiante.
-
-Quando você está vendo seu próprio perfil, você pode entrar com qualquer URL como sendo seu perfil na web e clicar OK para definí-la.
-Outros residentes podem visitar a URL que você definiu, quando eles olharem seu perfil.
+ <notification name="AttachmentDrop">
+ Você está prestes a largar seu anexo.
+ Tem certeza de que quer prosseguir?
+ <usetemplate ignoretext="Confirmar antes de largar anexos" name="okcancelignore" notext="Não" yestext="Sim"/>
</notification>
<notification name="JoinGroupCanAfford">
Unir-se a esse grupo custa L$[COST].
Deseja prosseguir?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Unir-se"/>
</notification>
+ <notification name="JoinGroupNoCost">
+ Você está prestes a entrar no grupo [NAME].
+Deseja continuar?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Entrar"/>
+ </notification>
<notification name="JoinGroupCannotAfford">
Associar-se a este grupo custa L$[COST].
Você não tem L$ suficientes para associar-se a este grupo.
</notification>
+ <notification name="CreateGroupCost">
+ Criar este grupo custa L$100.
+Grupos ser formados por mais de um membro, caso contrário serão definitivamente excluídos.
+Convite outros membros dentro de 48 horas.
+ <usetemplate canceltext="Cancelar" name="okcancelbuttons" notext="Cancelar" yestext="Criar grupo por L$100"/>
+ </notification>
<notification name="LandBuyPass">
Por L$[COST] você pode ingressar no terreno (&apos;[PARCEL_NAME]&apos;) por [TIME] horas. Comprar um passe de acesso?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
@@ -268,36 +199,36 @@ Você não tem L$ suficientes para associar-se a este grupo.
Por favor, selecione um indivíduo para realizar a venda se o valor for 0 L$.
</notification>
<notification name="ConfirmLandSaleChange">
- [LAND_SIZE] m² selecionados de terra estão sendo configurados para venda.
+ [LAND_SIZE] m² selecionados de terreno estão sendo configurados para venda.
Seu preço de venda será L$[SALE_PRICE] e está autorizado para venda para [NAME]. Gostaria de continuar a fazer essa alteração?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Continuar"/>
</notification>
<notification name="ConfirmLandSaleToAnyoneChange">
- ATENÇÃO: Ao clicar em &apos;vender para qualquer um&apos; torna a sua terra disponível para toda a comunidade [SECOND_LIFE], mesmo aqueles que não estão nesta região.
+ ATENÇÃO: Clicar em &apos;vender a qualquer um&apos; torna o terreno disponível para toda a comunidade do [SECOND_LIFE], inclusive residentes de outras regiões.
-A área de [LAND_SIZE] m² de terra selecionada está posta para venda.
-Seu preço de venda será L$ [SALE_PRICE] e está autorizado para [NAME].
+O terreno selecionado, de [LAND_SIZE] m², está sendo reservado para venda.
+O preço será L$[SALE_PRICE] e [NAME] pode comprar o terreno.
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="ReturnObjectsDeededToGroup">
- Você tem certeza de que quer retornar todos os objetos compartilhados com o grupo &apos;[NAME]&apos; neste lote de terra, para o inventário do seu antigo Proprietário?
+ Tem certeza de que quer devolver todos os objetos compartilhados com o grupo &apos;[NAME]&apos; neste lote, para o inventário do seu antigo Proprietário?
*AVISO* Isso irá deletar os objetos não transferíveis doados ao grupo!
Objetos: [N]
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Retornar"/>
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Devolver"/>
</notification>
<notification name="ReturnObjectsOwnedByUser">
- Você tem certeza de que deseja retornar todos os objetos do residente &apos;[NAME]&apos; neste lote para o inventário dele?
+ Você tem certeza de que deseja devolver todos os objetos do residente &apos;[NAME]&apos; neste lote para o inventário dele?
Objetos: [N]
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Retornar"/>
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Devolver"/>
</notification>
<notification name="ReturnObjectsOwnedBySelf">
Você tem certeza de que deseja retornar todos os objetos de sua propriedade neste lote para seu inventário?
Objetos: [N]
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Retornar"/>
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Devolver"/>
</notification>
<notification name="ReturnObjectsNotOwnedBySelf">
Você tem certeza de que deseja retornar todos os objetos que NÃO são seus para o inventário de seus proprietários?
@@ -306,7 +237,7 @@ Objetos transferíveis doados ao grupo retornarão para seu proprietários.
*AVISO* Isso fará com que os objetos não-transferíveis sejam deletados!
Objetos: [N]
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Retornar"/>
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Devolver"/>
</notification>
<notification name="ReturnObjectsNotOwnedByUser">
Você tem certeza de que deseja retornar todos os objetos deste lote NÃO pertencentes a [NAME] para o inventário do proprietário?
@@ -314,11 +245,11 @@ Objetos: [N]
*AVISO* Esta ação irá apagar os objetos não transferíveis doados ao grupo!
Objetos: [N]
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Retornar"/>
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Devolver"/>
</notification>
<notification name="ReturnAllTopObjects">
Você tem certeza de que deseja enviar todos os objetos listados de volta aos inventários de seus proprietários?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Retornar"/>
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Devolver"/>
</notification>
<notification name="DisableAllTopObjects">
Você tem certeza que deseja desativar todos os objetos desta região?
@@ -328,13 +259,19 @@ Objetos: [N]
Retornar os objetos deste lote que NÃO são compartilhados com o grupo [NAME] de volta para seus proprietários?
Objetos: [N]
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Retornar"/>
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Devolver"/>
</notification>
<notification name="UnableToDisableOutsideScripts">
- Não é possível desabilitar scripts externos.
+ Não é possível desativar scripts externos.
Toda esta região possui dano habilitado.
Scripts devem ser permitidos para fazer as armas funcionarem.
</notification>
+ <notification name="MultipleFacesSelected">
+ Diversas faces foram selecionadas.
+Se você optar por prosseguir, diversas ocorrências a mídia serão colocadas nas diferentes faces do objeto.
+Para colocar a mídia em só uma face, selecione Selecionar face e clique na face desejada do objeto. Depois clique em Adicionar.
+ <usetemplate ignoretext="A mídia será colocada nas diferentes faces selecionadas." name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
<notification name="MustBeInParcel">
Você deve permanecer dentro do lote para definir o ponto de aterrissagem.
</notification>
@@ -364,43 +301,59 @@ Scripts devem ser permitidos para fazer as armas funcionarem.
Você deve concordar com os Termos de Serviço para continuar a entrar no [SECOND_LIFE].
</notification>
<notification name="CouldNotPutOnOutfit">
- Não foi possível vestir o conjunto. A pasta do conjunto não contém roupas, partes do corpo ou acessórios.
+ Não foi possível vestir o look. A pasta do look não contém roupas, partes do corpo ou acessórios.
</notification>
<notification name="CannotWearTrash">
Não é possível usar roupas ou partes do corpo que estão no lixo.
</notification>
+ <notification name="MaxAttachmentsOnOutfit">
+ Não foi possível anexar o objeto.
+Ele ultrapassa o limite de anexos, de [MAX_ATTACHMENTS] objetos. Remova um objeto para poder anexar outro.
+ </notification>
<notification name="CannotWearInfoNotComplete">
- Você não pode vestir este item porque ele ainda não carregou. Por favor, tente novamente em um minuto.
+ Você não pode vestir este item porque ele ainda não carregou. Tente novamente em um minuto.
</notification>
<notification name="MustHaveAccountToLogIn">
Oops! Alguma coisa foi deixada em branco.
Você precisa entrar com ambos os Nome e Sobrenome do seu avatar.
-Você precisa de uma conta para entrar no [SECOND_LIFE]. Você gostaria de criar uma conta agora?
+Você precisa de uma conta para entrar no [SECOND_LIFE]. Você gostaria de abrir uma conta agora?
<url name="url">
https://join.secondlife.com/index.php?lang=pt-BR
</url>
- <usetemplate name="okcancelbuttons" notext="Tentar novamente" yestext="Criar uma nova conta"/>
+ <usetemplate name="okcancelbuttons" notext="Tentar novamente" yestext="Abrir conta"/>
+ </notification>
+ <notification name="InvalidCredentialFormat">
+ Digite o nome e sobrenome do seu avatar no campo Nome de usuário, depois faça o login novamente.
</notification>
<notification name="AddClassified">
- Anúncios classificados aparecem na seção &apos;Classificados&apos; do diretório de Busca e no [http://secondlife.com/community/classifieds/?lang=pt-BR secondlife.com] por uma semana.
-Preencha seu anúncio e então clique &apos;Publicar...&apos; para adicioná-lo ao diretório.
-Será solicitado a você um preço a ser pago, quando você clicar Publicar.
-Pagando mais, faz com que seu anúncio apareça em posição mais alta na lista e também em posição mais alta, quando as pessoas buscarem por palavras-chave.
- <usetemplate ignoretext="Quando adicionando um Classificado novo" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ Os anúncios serão publicados na seção &apos;Classificados&apos; das buscas e em [http://secondlife.com/community/classifieds secondlife.com] durante uma semana.
+Escreva seu anúncio e clique em &apos;Publicar...&apos;
+Depois, decida quanto deseja pagar pelo anúncio.
+Quanto mais você pagar, mais alto será o posicionamento do seu anúncio nos classficados e nos resultados de busca das suas palavras-chave.
+ <usetemplate ignoretext="Como colocar um anúncio" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="DeleteClassified">
Apagar classificado&apos;[NAME]&apos;?
Não há reembolso por taxas já pagas.
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Apagar"/>
</notification>
+ <notification name="DeleteMedia">
+ Você optor por excluir a mídia associada a esta face.
+Tem certeza de que quer prosseguir?
+ <usetemplate ignoretext="Confirmar antes de apagar mídia de objetos" name="okcancelignore" notext="Não" yestext="Sim"/>
+ </notification>
<notification name="ClassifiedSave">
Salvar as mudanças no classificado [NAME]?
<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Não Salvar" yestext="Salvar"/>
</notification>
+ <notification name="ClassifiedInsufficientFunds">
+ Fundos insuficientes para pagar o anúncio.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="DeleteAvatarPick">
- Apagar pegar [PICK]?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Delete"/>
+ Excluir destaque &lt;nolink&gt;[PICK]&lt;/nolink&gt;?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Apagar"/>
</notification>
<notification name="PromptGoToEventsPage">
Ir até a página web de enventos [SECOND_LIFE] ?
@@ -410,31 +363,23 @@ Não há reembolso por taxas já pagas.
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Ir à página"/>
</notification>
<notification name="SelectProposalToView">
- Por favor, selecione uma proposta para visualizar.
+ Selecione uma proposta para visualizar.
</notification>
<notification name="SelectHistoryItemToView">
- Por favor, selecione um item do histórico para exibí-lo.
- </notification>
- <notification name="ResetShowNextTimeDialogs">
- Você gostaria de reabilitar todas estas pop ups que você indicou previamente como &apos;Não me mostrar novamente&apos;?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
- </notification>
- <notification name="SkipShowNextTimeDialogs">
- Você gostaria de desabilitar todas as popups que podem ser puladas?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ Selecione um item do histórico para exibi-lo.
</notification>
<notification name="CacheWillClear">
- O cache será limpo quando você reiniciar [APP_NAME].
+ O cache será limpo quando o [APP_NAME] for iniciado.
</notification>
<notification name="CacheWillBeMoved">
- O Cache será removido após reiniciar [APP_NAME].
-Nota: Isto limpará o cache.
+ O cache será limpo quando o [APP_NAME] for iniciado.
+Nota: Este procedimento limpa o cache.
</notification>
<notification name="ChangeConnectionPort">
- Configuração de porta terá efeito após reiniciar [APP_NAME].
+ Reinicie o [APP_NAME] para ativar a reconfiguração da porta.
</notification>
<notification name="ChangeSkin">
- A nova pele será exibida após reiniciar [APP_NAME].
+ Reinicie o [APP_NAME] para ativar a pele nova.
</notification>
<notification name="GoToAuctionPage">
Ir para a página do [SECOND_LIFE] para ver os detalhes do leilão ou fazer um lance?
@@ -464,7 +409,7 @@ O objeto pode estar fora de alcance ou foi deletado.
O objeto pode estar fora de alcance ou foi deletado.
</notification>
<notification name="SaveNotecardFailReason">
- Houve um problema em salvar uma nota devido a seguinte razão: [REASON]. Por favor, tente salvar a nota novamente mais tarde.
+ Houve um problema em salvar uma nota devido a seguinte razão: [REASON]. Tente salvar a nota novamente mais tarde.
</notification>
<notification name="ScriptCannotUndo">
Não foi possível desfazer todas as mudanças na sua versão de script.
@@ -473,7 +418,7 @@ Gostaria de carregar a última versão salva?
<usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/>
</notification>
<notification name="SaveScriptFailReason">
- Houve um problema em salvar um script devido à seguinte razão: [REASON]. Por favor, tente salvar novamente o script mais tarde.
+ Houve um problema em salvar um script devido à seguinte razão: [REASON]. Tente salvar novamente o script mais tarde.
</notification>
<notification name="SaveScriptFailObjectNotFound">
Não foi possível salvar o script pois o objeto em que ele está não pôde ser encontrado.
@@ -482,6 +427,11 @@ O objeto pode estar fora de alcance ou ter sido deletado.
<notification name="SaveBytecodeFailReason">
Houve um problema em salvar uma compilação de script devido a seguinte razão: [REASON]. Por favor, tente salvar novamente o script mais tarde.
</notification>
+ <notification name="StartRegionEmpty">
+ Oops, você ainda não definiu sua região de partida.
+Digite o nome da região na caixa &apos;Ponto de partida&apos; ou selecione &apos;Última localização&apos; ou &apos;Meu início&apos; como ponto de partida.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CouldNotStartStopScript">
Não foi possível iniciar ou parar o script pois o objeto em que ele está não pôde ser encontrado.
O objeto pode estar fora de alcance ou ter sido deletado.
@@ -493,35 +443,35 @@ O objeto pode estar fora de alcance ou ter sido deletado.
Não foi possível escrever o arquivo [[FILE]]
</notification>
<notification name="UnsupportedHardware">
- Aviso: Seu sistema não é compatível com os requisitos mínimos exigidos pelo [APP_NAME]. Se você continuar usando o [APP_NAME] pode experimentar uma performance ruim. Infelizmente não podemos oferecer suporte técnico para configurações de sistema não suportado.
+ Sabe de uma coisa? Seu computador não tem os requisitos mínimos do [APP_NAME]. Talvez o desempenho seja um pouco sofrível. O suporte não pode atender pedidos de assistência técnicas em sistemas não suportados.
-MINSPECS
-Você deseja visitar [_URL] para maiores informações?
+Consultar [_URL] para mais informações?
<url name="url" option="0">
http://secondlife.com/support/sysreqs.php?lang=pt
</url>
- <usetemplate ignoretext="Ao detectar hardware não suportado" name="okcancelignore" notext="Não" yestext="Sim"/>
+ <usetemplate ignoretext="O hardware do meu computador não é suportado" name="okcancelignore" notext="Não" yestext="Sim"/>
</notification>
<notification name="UnknownGPU">
- Seu sistema possui uma placa gráfica que nos é desconhecido neste momento.
-Este é normalmente o caso de um novo hardware que nós não tivemos a chance de testar. [APP_NAME] vai muito provavelmente executar corretamente, mas talvez seja necessário ajustar suas configurações de gráficos para algo mais apropriado.
-(Menu Editar &gt; Preferências &gt; Gráficos).
+ A placa de vídeo do seu sistema não é reconhecida pelo [APP_NAME].
+Isto acontece quando novos hardwares que ainda não foram testados no [APP_NAME]. Talvez isso não cause problemas, mas pode ser preciso checar as configurações de vídeo.
+( Eu &gt; Preferências &gt; Vídeo)
<form name="form">
- <ignore name="ignore" text="Ao detectar uma placa de vídeo desconhecida"/>
+ <ignore name="ignore" text="Minha placa de vídeo não foi reconhecida."/>
</form>
</notification>
<notification name="DisplaySettingsNoShaders">
- [APP_NAME] travou quando inicializava os drivers gráficos.
-A Qualidade Gráfica será ajustada para baixa, para evitar alguns erros comuns de drivers.
-Isto irá desabilitar alguns atributos gráficos.
-Nós recomendamos a atualização dos drivers de sua placa gráfica.
-A Qualidade Gráfica pode ser aumentada no Preferências &gt; Gráficos.
+ O [APP_NAME] sofreu uma pane ao iniciar os drivers de vídeo.
+A Qualidade do vídeo será definida como baixa para evitar os erros de driver mais comuns. Assim, alguns recursos de vídeo serão desativados.
+Tente atualizar o driver da sua placa de vídeo.
+Para aumentar a qualidade do vídeo, vá para Preferências &gt; Vídeo.
</notification>
<notification name="RegionNoTerraforming">
A região [REGION] não permite ser aplainada.
</notification>
<notification name="CannotCopyWarning">
- Você não tem permissão para copiar este item e irá perdê-lo do seu inventário se entregá-lo a alguém. Quer realmente oferecer este item?
+ Você não tem autorização para copiar os itens abaixo:
+[ITENS]
+ao dá-los, você ficará sem eles no seu inventário. Deseja realmente dar estes itens?
<usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/>
</notification>
<notification name="CannotGiveItem">
@@ -555,28 +505,31 @@ Ele ou ela vai ficar temporariamente incapaz de se mover, usar o bate-papo ou in
<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Descongelar" yestext="Congelar"/>
</notification>
<notification name="EjectAvatarFullname">
- Ejetar [AVATAR_NAME] da sua terra?
+ Ejetar [AVATAR_NAME] do seu terreno?
<usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Ejetar e Banir" yestext="Ejetar"/>
</notification>
<notification name="EjectAvatarNoBan">
- Ejetar este avatar da sua terra?
+ Ejetar este avatar do seu terreno?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Ejetar"/>
</notification>
<notification name="EjectAvatarFullnameNoBan">
- Ejetar [AVATAR_NAME] da sua terra?
+ Ejetar [AVATAR_NAME] do seu terreno?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Ejetar"/>
</notification>
+ <notification name="EjectAvatarFromGroup">
+ Você ejetou [AVATAR_NAME] do grupo [GROUP_NAME]
+ </notification>
<notification name="AcquireErrorTooManyObjects">
Erro de aquisição: Muitos objetos selecionados.
</notification>
<notification name="AcquireErrorObjectSpan">
Erro de aquisição: Objetos criados em mais de uma região.
-Por favor, mova todos os objetos a serem adquiridos para uma mesma região.
+Mova todos os objetos a serem adquiridos para uma mesma região.
</notification>
<notification name="PromptGoToCurrencyPage">
[EXTRA]
-Vá para [_URL] para informação sobre compra de L$.
+Para mais informações sobre como comprar L$, consulte [_URL].
<url name="url">
http://secondlife.com/app/currency/?lang=pt-BR
</url>
@@ -655,6 +608,11 @@ Esperada [VALIDS]
<notification name="CannotEncodeFile">
Impossível codificar o arquivo: [FILE]
</notification>
+ <notification name="CorruptedProtectedDataStore">
+ Não foi possível fazer a leitura dos dados protegidos, redefinindo.
+ Isso pode ocorrer após mudanças na configuração da rede.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CorruptResourceFile">
Fonte do arquivo corrompida: [FILE]
</notification>
@@ -665,12 +623,19 @@ Esperada [VALIDS]
Incapaz de criar arquivo de saída: [FILE]
</notification>
<notification name="DoNotSupportBulkAnimationUpload">
- Atualmente, não suportamos o envio de arquivos de animação em massa.
+ O [APP_NAME] ainda não faz o upload de vários arquivos de animação de uma vez.
</notification>
<notification name="CannotUploadReason">
Incapaz de carregar [FILE] devido ao seguinte motivo: [REASON]
Por favor tente novamente mais tarde.
</notification>
+ <notification name="LandmarkCreated">
+ Você adicionou &quot;[LANDMARK_NAME]&quot; a sua pasta [FOLDER_NAME].
+ </notification>
+ <notification name="LandmarkAlreadyExists">
+ Você já tem um marco deste lugar.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="CannotCreateLandmarkNotOwner">
Você não pode criar um ponto de referência porque o proprietário do terreno não permite. Tente novamente a alguns metros de distância.
</notification>
@@ -693,6 +658,9 @@ Selecione objetos com scripts.
Selecione objetos com scripts que você tem permissão para modificar.
</notification>
+ <notification name="CannotOpenScriptObjectNoMod">
+ Impossível abrir script em objeto sem ter autorização para modificar.
+ </notification>
<notification name="CannotSetRunningSelectObjectsNoScripts">
Impossibilitado de definir quaisquer scripts para &apos;rodando&apos;.
@@ -715,49 +683,47 @@ Pesquisava por: [FINALQUERY]
Os termos de sua pesquisa eram muito curtos então nenhuma pesquisa foi feita.
</notification>
<notification name="CouldNotTeleportReason">
- Não é possível teletransportar-se.
+ O teletransporte falhou.
[REASON]
</notification>
-
- <notification name="invalid_tport">
-Problema encontrado ao processar seu pedido de Teletransporte. Você pode tentar reiniciar antes de tentar teletransportar-se. Se você continuar a receber esta mensagem, por favor verifique a FAQ do Suporte Técnico em:
-www.secondlife.com/support
- </notification>
- <notification name="invalid_region_handoff">
-Problema encontrado ao processar a passagem de regiões. Você pode tentar reiniciar antes de tentar atravessar regiões novamente. Se você continuar a receber esta mensagem, por favor verifique a FAQ do Suporte Técnico em:
-www.secondlife.com/support
- </notification>
- <notification name="blocked_tport">
-Desculpe, teletransportes estão atualmente bloqueados. Tente novamente dentro de alguns instantes. Se você continuar com problemas de teletransporte, por favor tente deslogar e relogar para resolver o problema.
- </notification>
- <notification name="nolandmark_tport">
-Desculpe, mas o sistema não conseguiu localizar a landmark de destino.
- </notification>
- <notification name="timeout_tport">
-Desculpe, não foi possível para o sistema executar o teletransporte. Tente novamente dentro de alguns instantes.
- </notification>
- <notification name="noaccess_tport">
-Desculpe, você não tem acesso ao destino deste teletransporte.
- </notification>
- <notification name="missing_attach_tport">
-Seu anexos ainda não chegaram. Tente esperar por alguns momentos ou deslogar e logar antes de tentar teleransportar-se novamente.
- </notification>
- <notification name="too_many_uploads_tport">
-Afluxo nesta região é atualmente tão alto que seu pedido de teletransporte não será possível em tempo oportuno. Por favor, tente novamente em alguns minutos ou vá a uma área menos ocupada.
- </notification>
- <notification name="expired_tport">
-Desculpe, mas o sistema não conseguiu concluir o seu pedido de teletransporte em tempo hábil. Por favor, tente novamente em alguns minutos.
- </notification>
- <notification name="expired_region_handoff">
-Desculpe, mas o sistema não pôde concluir a sua travessia de região em tempo hábil. Por favor, tente novamente em alguns minutos.
- </notification>
- <notification name="no_host">
-Não foi possível encontrar o destino do teletransporte. O destino pode estar temporariamente indisponível ou não existir mais. Por favor, tente novamente em poucos minutos.
- </notification>
- <notification name="no_inventory_host">
-O sistema de inventário está indisponível no momento.
- </notification>
-
+ <notification name="invalid_tport">
+ Houve um problema ao processar o teletransporte. Talvez seja preciso sair e entrar do Second Life para fazer o teletransporte.
+Se você continuar a receber esta mensagem, consulte [SUPPORT_SITE].
+ </notification>
+ <notification name="invalid_region_handoff">
+ Problema encontrado ao processar a passagem de regiões. Talvez seja preciso sair e entrar do Second Life atravessar regiões novamente.
+Se você continuar a receber esta mensagem, consulte [SUPPORT_SITE].
+ </notification>
+ <notification name="blocked_tport">
+ Desculpe, teletransportes estão atualmente bloqueados. Tente novamente dentro de alguns instantes. Se você continuar com problemas de teletransporte, por favor tente deslogar e relogar para resolver o problema.
+ </notification>
+ <notification name="nolandmark_tport">
+ Desculpe, mas o sistema não conseguiu localizar a landmark de destino.
+ </notification>
+ <notification name="timeout_tport">
+ Desculpe, não foi possível para o sistema executar o teletransporte. Tente novamente dentro de alguns instantes.
+ </notification>
+ <notification name="noaccess_tport">
+ Desculpe, você não tem acesso ao destino deste teletransporte.
+ </notification>
+ <notification name="missing_attach_tport">
+ Seu anexos ainda não chegaram. Tente esperar por alguns momentos ou deslogar e logar antes de tentar teleransportar-se novamente.
+ </notification>
+ <notification name="too_many_uploads_tport">
+ Afluxo nesta região é atualmente tão alto que seu pedido de teletransporte não será possível em tempo oportuno. Por favor, tente novamente em alguns minutos ou vá a uma área menos ocupada.
+ </notification>
+ <notification name="expired_tport">
+ Desculpe, mas o sistema não conseguiu concluir o seu pedido de teletransporte em tempo hábil. Por favor, tente novamente em alguns minutos.
+ </notification>
+ <notification name="expired_region_handoff">
+ Desculpe, mas o sistema não pôde concluir a sua travessia de região em tempo hábil. Por favor, tente novamente em alguns minutos.
+ </notification>
+ <notification name="no_host">
+ Não foi possível encontrar o destino do teletransporte. O destino pode estar temporariamente indisponível ou não existir mais. Por favor, tente novamente em poucos minutos.
+ </notification>
+ <notification name="no_inventory_host">
+ O sistema de inventário está indisponível no momento.
+ </notification>
<notification name="CannotSetLandOwnerNothingSelected">
Incapaz de estabelecer o proprietário do terreno:
Nenhum lote selecionado.
@@ -766,7 +732,8 @@ Nenhum lote selecionado.
Não é possível exigir a posse do terreno porque a seleção alcançou múltiplas regiões. Por favor, selecione uma área menor e tente novamente.
</notification>
<notification name="ForceOwnerAuctionWarning">
- Este lote está oferecido em leilão. Exigir a posse do terreno irá cancelar o leilão e possivelmente deixará alguns residentes infelizes, se os lances já começaram. Exigir posse?
+ Este lote vai a leilão. Forçar a mudança do dono cancela o leilão, podendo deixar residentes que já deram lances insatisfeitos.
+Deseja forçar mudança de dono?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Retomar"/>
</notification>
<notification name="CannotContentifyNothingSelected">
@@ -794,7 +761,7 @@ Nenhum lote selecionado.
Não é possível achar a região em que este terreno se encontra.
</notification>
<notification name="CannotCloseFloaterBuyLand">
- Você não pode fechar a janela de Compra de Terreno até que o [APP_NAME] calcule o preço desta transação.
+ A janela Comprar terreno poderá ser fechada quando o [APP_NAME] determinar o preço da transação.
</notification>
<notification name="CannotDeedLandNothingSelected">
Não é possível transferir posse do terreno:
@@ -805,41 +772,33 @@ Nenhum lote selecionado.
Nenhum grupo selecionado.
</notification>
<notification name="CannotDeedLandNoRegion">
- Não é possível transferir posse do terreno:
-Não é possível se achar a região em que este terreno se encontra.
+ Houve um problema ao processar a doação do terreno:
+A região do terreno não pôde ser localizada.
</notification>
<notification name="CannotDeedLandMultipleSelected">
- Impossibilitado de passar a propriedade da terra:
-Selecionados vários lotes.
+ Não é possível doar o terreno:
+Vários lotes foram selecionados.
Tente selecionar um único lote.
</notification>
- <notification name="ParcelCanPlayMedia">
- Esta localidade pode executar fluxo de mídia.
-Fluxo de mídia necessita de uma conexão de Internet rápida.
-
-Executar fluxo de mídia quando disponível?
-(Você pode mudar esta opção mais tarde no Preferências &gt; Ãudio &amp; Vídeo.)
- <usetemplate name="okcancelbuttons" notext="Desabilitar" yestext="Exibir Mídia"/>
- </notification>
<notification name="CannotDeedLandWaitingForServer">
- Impossibilitado de passar a propriedade da terra:
-Esperando pelo servidor informar de quem é a propriedade.
+ Não é possível doar o terreno:
+Esperando o servidor informar de quem é a propriedade.
Por favor, tente novamente.
</notification>
<notification name="CannotDeedLandNoTransfer">
- Não é possível transferir posse do terreno:
-A região [REGION] não permite transferência do terreno.
+ Não é possível doar o terreno:
+A região [REGION] não permite transferências de terreno.
</notification>
<notification name="CannotReleaseLandWatingForServer">
- Impossibilitado de abandonar a terra:
+ Não é possível abandonar o terreno:
Esperando o servidor atualizar as informações do lote.
Tente novamente em alguns segundos.
</notification>
<notification name="CannotReleaseLandSelected">
- Impossibilitado de abandonar a terra:
+ Não é possível abandonar o terreno:
Você não é dono de todos os lotes selecionados.
Por favor, selecione um único lote.
@@ -850,33 +809,33 @@ Você não tem permissão de liberar este lote.
Os lotes que você possui estão em verde.
</notification>
<notification name="CannotReleaseLandRegionNotFound">
- Impossibilitado de abandonar a terra:
-Não consegue achar a região em que esta terra se encontra.
+ Houve um problema ao processar o abandono do terreno:
+A região do terreno não pôde ser localizada.
</notification>
<notification name="CannotReleaseLandNoTransfer">
Não é possível abandonar terreno:
A região [REGION] não permite transferência de terreno.
</notification>
<notification name="CannotReleaseLandPartialSelection">
- Impossibilitado de abandonar a terra:
-Você deve selecionar um lote inteiro para liberá-lo.
+ Não é possível abandonar o terreno:
+Selecione um lote inteiro e abra mão dele.
Selecione um lote inteiro ou primeiro divida seu lote.
</notification>
<notification name="ReleaseLandWarning">
- Você está para liberar [AREA] m² de terra.
-Liberando este terreno, o liberará de suas posses, mas não lhe concederá quaisquer L$.
+ Você está prestes a abrir mão de [AREA] m².
+Ao abrir mão deste terreno, ele deixa de ser uma propriedade. Note que você não receberá nenhum L$.
-Liberar esta terra?
+Abrir mão deste terreno?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Renunciar"/>
</notification>
<notification name="CannotDivideLandNothingSelected">
- Impossibilitado de dividir a terra:
+ Não é possível dividir o terreno:
-Nenhum lote selecionado.
+Nenhum lote foi selecionado.
</notification>
<notification name="CannotDivideLandPartialSelection">
- Impossibilitado de dividir a terra:
+ Não é possível dividir o terreno:
Você selecionou um lote inteiro.
Tente selecionar uma parte do lote.
@@ -888,49 +847,38 @@ Quer dividir o terreno?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Dividir"/>
</notification>
<notification name="CannotDivideLandNoRegion">
- Impossibilitado de dividir a terra:
-Não consegue achar a região em que esta terra se encontra.
+ Houve um problema ao processar a divisão do terreno:
+A região do terreno não pôde ser localizada.
</notification>
<notification name="CannotJoinLandNoRegion">
- Impossibilitado de unir a terra:
-Não consegue achar a região em que esta terra se encontra.
+ Houve um problema ao processar a união dos terrenos:
+A região do terreno não pôde ser localizada.
</notification>
<notification name="CannotJoinLandNothingSelected">
- Não é possível unir terreno:
+ Não é possível unir os terrenos:
Nenhum lote selecionado.
</notification>
<notification name="CannotJoinLandEntireParcelSelected">
- Impossibilitado de unir a terra:
+ Não é possível unir os terrenos:
Você selecionou apenas um lote.
Selecione a terra através de ambos os lotes.
</notification>
<notification name="CannotJoinLandSelection">
- Impossibilitado de unir a terra:
+ Não é possível unir os terrenos:
Você deve selecionar mais de um lote.
-Selecione a terra através de ambos os lotes.
+Selecione terrenos localizados em dois lotes.
</notification>
<notification name="JoinLandWarning">
- Unir esta terra vai criar um grande lote que envolve todos os lotes que intersectam o retângulo selecionado.
+ Unir os terrenos vai criar um grande lote, formado por todos os lotes que intersectam o retângulo selecionado.
Você vai ter que redefinir nome e as opções do novo lote.
-Unir a terra?
+Unir os terrenos?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Unir"/>
</notification>
- <notification name="ShowOwnersHelp">
- Mostrar donos:
-Colorir os lotes para mostrar o tipo de dono.
-
-Green = Sua terra
-Aqua = Terra do seu Grupo
-Red = Possuída por outros
-Yellow = À venda
-Purple = A leilão
-Grey = Pública
- </notification>
<notification name="ConfirmNotecardSave">
- Esta nota precisa ser salva antes do item ser copiado ou visualizado. Salvar nota?
+ Esta anotação precisa ser salva antes de o item ser copiado ou visualizado. Salvar anotação?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Salvar"/>
</notification>
<notification name="ConfirmItemCopy">
@@ -950,13 +898,12 @@ Grey = Pública
Não é possível salvar &apos;[NAME]&apos; para um arquivo de vestimenta. Você precisa liberar algum espaço no seu computador e salvar o arquivo novamente.
</notification>
<notification name="CannotSaveToAssetStore">
- Impossibilitado de salvar [NAME] no armazenamento central de ativos.
-Isso é geralmente uma falha temporária. Por favor personalize e salve novamente a vestimenta em poucos minutos.
+ Ocorreu um problema ao salvar [NAME].
+Em geral, essa é uma falha técnica temporária. Personalize e volte a salvar o item novamente dentro de alguns minutos.
</notification>
<notification name="YouHaveBeenLoggedOut">
- Você foi deslogado do [SECOND_LIFE]:
+ Ah não! O [SECOND_LIFE] teve de fechar.
[MESSAGE]
-Você ainda pode olhar o bate-papo e as mensagens instantâneas existentes, clicando em &apos;Exibir IM &amp; bate-papo&apos;. Caso contrário, clique em &apos;Sair&apos; para sair do [APP_NAME] imediatamente.
<usetemplate name="okcancelbuttons" notext="Sair" yestext="Exibir IM &amp; bate-papo"/>
</notification>
<notification name="OnlyOfficerCanBuyLand">
@@ -981,6 +928,36 @@ Oferecer amizade para [NAME]?
<button name="Cancel" text="Cancelar"/>
</form>
</notification>
+ <notification label="Salvar este look" name="SaveOutfitAs">
+ Veja o meu novo visual:
+ <form name="form">
+ <input name="message">
+ [DESC] (novo)
+ </input>
+ <button name="Offer" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification label="Salvar item de vestuário" name="SaveWearableAs">
+ Salvar item no meu inventário como:
+ <form name="form">
+ <input name="message">
+ [DESC] (novo)
+ </input>
+ <button name="Offer" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
+ <notification label="Renomear look" name="RenameOutfit">
+ Nome do novo look:
+ <form name="form">
+ <input name="new_name">
+ [NAME]
+ </input>
+ <button name="Offer" text="OK"/>
+ <button name="Cancel" text="Cancelar"/>
+ </form>
+ </notification>
<notification name="RemoveFromFriends">
Você quer remover [FIRST_NAME] [LAST_NAME] da sua lista de amigos?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Remover"/>
@@ -1015,6 +992,12 @@ em TODOS OS TERRENOS deste sim?
Por favor, insira um valor maior.
</notification>
+ <notification name="ConfirmItemDeleteHasLinks">
+ Pelo menos um dos itens possui links que levam a ele. Ao excluir o item, os links não funcionarão mais. Por isso, recomendamos excluir os links primeiro.
+
+Tem certeza de que quer excluir estes items?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
<notification name="ConfirmObjectDeleteLock">
Pelo menos um dos itens que você selecionou está trancado.
@@ -1080,24 +1063,23 @@ Tem certeza de que deseja pegar estes itens?
<usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/>
</notification>
<notification name="CantBuyLandAcrossMultipleRegions">
- Não foi possível comprar terreno, pois a seleção abrange várias regiões.
+ Não foi possível comprar o terreno, pois a seleção abrange várias regiões.
Por favor, selecione uma área menor e tente novamente.
</notification>
<notification name="DeedLandToGroup">
- Na transferência de propriedade deste lote, o grupo deverá ter e manter créditos suficientes de uso da terra.
-O preço de aquisição dos terrenos não é restituído ao o proprietário. Se uma parcela transferida é vendida, o preço de venda é dividido igualmente entre os membros do grupo.
+ No ato da doação deste lote, o grupo deverá ter e manter créditos suficientes para ter o terreno.
+O preço de aquisição dos terrenos não é restituído ao proprietário. Se uma parcela doada for vendida, o preço de venda é dividido igualmente entre os membros do grupo.
-Transferir propriedade de [AREA] m² de terra ao grupo &apos;[GROUP_NAME]&apos;?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Acionar"/>
+Doar [AREA] m² ao grupo &apos;[GROUP_NAME]&apos;?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="DeedLandToGroupWithContribution">
- Na transferência de propriedade deste lote, o grupo deverá ter e manter créditos suficientes de uso da terra.
-A Transferência incluirá uma contribuição de terra simultanea para o grupo de &apos;[FIRST_NAME] [LAST_NAME]&apos;.
-O preço da compra não será restituído ao proprietário. Se um lote for vendido, o preço da venda será dividido igualmente entre os membros do grupo.
+ No ato da doação deste lote, o grupo deverá ter e manter créditos suficientes para ter o terreno. A doação inclui uma contribuição simultânea para o grupo de &apos;[FIRST_NAME] [LAST_NAME]&apos;.
+O preço de aquisição dos terrenos não é restituído ao proprietário. Se uma parcela doada for vendida, o preço de venda é dividido igualmente entre os membros do grupo.
-Transferir propriedade destes [AREA] m² de terreno para o grupo &apos;[GROUP_NAME]&apos;?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Acionar"/>
+Doar [AREA] m² para o grupo &apos;[GROUP_NAME]&apos;?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="DisplaySetToSafe">
Configurações de display foram ajustadas para níveis de segurança porque você especificou -- opção de segurança.
@@ -1107,30 +1089,39 @@ Transferir propriedade destes [AREA] m² de terreno para o grupo &apos;[GROUP_NA
</notification>
<notification name="ErrorMessage">
[ERROR_MESSAGE]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="AvatarMovedDesired">
+ Esse destino não está disponível no momento.
+Você chegou a uma região próxima.
+ </notification>
+ <notification name="AvatarMovedLast">
+ Esse destino não está disponível no momento.
+Você chegou a uma região próxima.
</notification>
- <notification name="AvatarMoved">
- Sua [TYPE] localização não está disponível no momento.
- [HELP]
-Você foi movido para uma região vizinha.
+ <notification name="AvatarMovedHome">
+ Esse destino não está disponível no momento.
+Você chegou a uma região próxima.
+Pense em usar outra região como seu início.
</notification>
<notification name="ClothingLoading">
- Sua vestimenta ainda está baixando.
-Você pode usar o [SECOND_LIFE] normalmente e os outros o visualizarão corretamente.
+ As suas roupas estão sendo transferidas.
+Enquando isso, use o [SECOND_LIFE] normalmente. Seu visual será exibido corretamente.
<form name="form">
- <ignore name="ignore" text="Quando o vestuário está levando muito tempo para fazer download"/>
+ <ignore name="ignore" text="A roupa está demorando para chegar"/>
</form>
</notification>
<notification name="FirstRun">
- A instalação do [APP_NAME] está completa.
+ A instalação do [APP_NAME] está pronta.
-Se esta é a primeira vez usando o[SECOND_LIFE], será necessário que você crie uma conta antes de poder se logar.
-Retornar a [https://join.secondlife.com/index.php?lang=pt-BR secondlife.com] para criar uma nova conta?
+Se você ainda não conhece o [SECOND_LIFE], basta criar uma conta para começar.
+Voltar para [http://join.secondlife.com secondlife.com] para criar sua conta?
<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Nova conta.."/>
</notification>
<notification name="LoginPacketNeverReceived">
- Estamos com problemas de conexão. Pode ser problema com a conexão de sua internet ou com os servidores do [SECOND_LIFE].
+ Estamos detectando um problema de conexão. Pode haver um problema com a sua conexão à internet ou com o [SECOND_LIFE_GRID].
-Voce tanto pode checar a conexão de sua internet e tentar novamente em alguns minutos, ou clicar em Teletransporte para tentar teletransportar-se para sua casa.
+Cheque sua conexão e tente em alguns minutos, clique na Ajuda para acessar o [SUPPORT_SITE], ou tente voltar para casa clicando em &apos;Teletransportar&apos;.
<url name="url">
http://br.secondlife.com/support/
</url>
@@ -1148,14 +1139,50 @@ Pressione a tecla F1 para ajuda ou aprender mais sobre [SECOND_LIFE].
Por favor, escolha se o seu avatar é feminino ou masculino. Você pode mudar de idéia depois.
<usetemplate name="okcancelbuttons" notext="Feminino" yestext="Masculino"/>
</notification>
+ <notification name="CantTeleportToGrid">
+ Não foi possível ir para [SLURL], que fica em outro grid ([GRID]) em relação ao grid atual, ([CURRENT_GRID]). Feche o Visualizador e tente novamente.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="GeneralCertificateError">
+ Falha de conexão com o servidor.
+[REASON]
+
+SubjectName: [SUBJECT_NAME_STRING]
+IssuerName: [ISSUER_NAME_STRING]
+Válido de: [VALID_FROM]
+Válido até: [VALID_TO]
+MD5 Fingerprint: [SHA1_DIGEST]
+Impressão digital SHA1: [MD5_DIGEST]
+Uso da chave: [KEYUSAGE]
+Uso estendido da chave: [EXTENDEDKEYUSAGE]
+Identificador chave de assunto: [SUBJECTKEYIDENTIFIER]
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TrustCertificateError">
+ A autoridade de certificação deste servidor é desconhecida.
+
+Dados do certificado:
+SubjectName: [SUBJECT_NAME_STRING]
+IssuerName: [ISSUER_NAME_STRING]
+Válido de: [VALID_FROM]
+Válido até: [VALID_TO]
+MD5 Fingerprint: [SHA1_DIGEST]
+Impressão digital SHA1: [MD5_DIGEST]
+Uso da chave: [KEYUSAGE]
+Uso estendido da chave: [EXTENDEDKEYUSAGE]
+Identificador chave de assunto: [SUBJECTKEYIDENTIFIER]
+
+Confiar nesta autoridade?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Confiança"/>
+ </notification>
<notification name="NotEnoughCurrency">
[NAME] L$ [PRICE] Você não possui suficientes L$ para fazer isso.
</notification>
<notification name="GrantedModifyRights">
- Foi garantido à você o privilégio de alterar o(s) objeto(s) de [FIRST_NAME] [LAST_NAME]&apos;
+ [NAME] autorizou você a editar seus objetos.
</notification>
<notification name="RevokedModifyRights">
- Seu privilégio para alterar o(s) objeto(s) de [FIRST_NAME] [LAST_NAME]&apos;s foi removido.
+ Seu direito de modificar objetos do/da [NAME] foi revogado
</notification>
<notification name="FlushMapVisibilityCaches">
Isto irá descarregar os caches de mapa relativos a esta região.
@@ -1171,7 +1198,7 @@ Isso é realmente útil apenas para depuração.
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="KickUsersFromRegion">
- Teletransportar para casa todos os residentes nesta região?
+ Teletransportar para o início todos os residentes nesta região?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="EstateObjectReturn">
@@ -1232,113 +1259,126 @@ Por favor, ponha o objeto à venda e tente novamente.
[DOWNLOAD_PATH]
</notification>
<notification name="DownloadWindowsMandatory">
- Uma nova versão do [APP_NAME] está disponível.
+ Existe uma nova versão do [APP_NAME]
[MESSAGE]
-Você deve baixar essa atualização para utilizar o [APP_NAME].
+Baixe a atualização para usar o [APP_NAME].
<usetemplate name="okcancelbuttons" notext="Sair" yestext="Atualizar"/>
</notification>
<notification name="DownloadWindows">
- Uma versão atualizada do [APP_NAME] está disponível.
+ Existe uma nova versão do [APP_NAME]
[MESSAGE]
-Essa atualização não é mandatória, mas sugerimos que você a instale para melhorar a performance e a estabilidade.
+Não é preciso passar para a nova versão, mas ela pode melhorar o desempenho e estabilidade do visualizador.
<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Atualizar"/>
</notification>
<notification name="DownloadWindowsReleaseForDownload">
- Uma versão atualizada do [APP_NAME] está disponível.
+ Existe uma nova versão do [APP_NAME]
[MESSAGE]
-Essa atualização não é mandatória, mas sugerimos que você a instale para melhorar a performance e a estabilidade.
+Não é preciso passar para a nova versão, mas ela pode melhorar o desempenho e estabilidade do visualizador.
<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Atualizar"/>
</notification>
+ <notification name="DownloadLinuxMandatory">
+ Existe uma nova versão do [APP_NAME]
+[MESSAGE]
+Baixe a atualização para usar o [APP_NAME].
+ <usetemplate name="okcancelbuttons" notext="Sair" yestext="Baixar"/>
+ </notification>
+ <notification name="DownloadLinux">
+ Existe uma nova versão do [APP_NAME]
+[MESSAGE]
+Não é preciso passar para a nova versão, mas ela pode melhorar o desempenho e estabilidade.
+ <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Baixar"/>
+ </notification>
+ <notification name="DownloadLinuxReleaseForDownload">
+ Existe uma nova versão do [APP_NAME]
+[MESSAGE]
+Não é preciso passar para a nova versão, mas ela pode melhorar o desempenho e estabilidade.
+ <usetemplate name="okcancelbuttons" notext="Continuar" yestext="Baixar"/>
+ </notification>
<notification name="DownloadMacMandatory">
- Uma nova versão do [APP_NAME] está disponível.
+ Existe uma nova versão do [APP_NAME]
[MESSAGE]
-Você deve baixar esta atualização para utilizar o [APP_NAME].
+Baixe a atualização para usar o [APP_NAME].
-Baixar para sua pasta de Aplicativos?
+Salvar na pasta Aplicativos?
<usetemplate name="okcancelbuttons" notext="Sair" yestext="Atualizar"/>
</notification>
<notification name="DownloadMac">
- Uma nova versão do [APP_NAME] está disponível.
+ Existe uma nova versão do [APP_NAME]
[MESSAGE]
-Essa atualização não é mandatória, mas sugerimos que você a instale para melhorar a performance e a estabilidade.
+Não é preciso passar para a nova versão, mas ela pode melhorar o desempenho e estabilidade do visualizador.
-Baixar para a sua pasta de Aplicativos?
+Salvar na pasta Aplicativos?
<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Atualizar"/>
</notification>
<notification name="DownloadMacReleaseForDownload">
- Uma nova versão do [APP_NAME] está disponível.
-
+ Existe uma nova versão do [APP_NAME]
[MESSAGE]
-Essa atualização não é mandatória, mas sugerimos que você a instale para melhorar a performance e a estabilidade.
+Não é preciso passar para a nova versão, mas ela pode melhorar o desempenho e estabilidade do visualizador.
-Baixar para sua pasta de Aplicativos?
+Salvar na pasta Aplicativos?
<usetemplate name="okcancelbuttons" notext="Continuar" yestext="Atualizar"/>
</notification>
<notification name="DeedObjectToGroup">
Delegar este objeto causará ao grupo:
* Receber os L$ pagos ao objeto
- <usetemplate ignoretext="Ao transferir objetos aos grupos" name="okcancelignore" notext="Cancelar" yestext="Acionar"/>
+ <usetemplate ignoretext="Confirmar doações de um objeto a um grupo antes de fazer a doação" name="okcancelignore" notext="Cancelar" yestext="Acionar"/>
</notification>
<notification name="WebLaunchExternalTarget">
- Abrir o navegador do seu sistema para ver este conteúdo?
- <usetemplate ignoretext="Ao abrir o navegador web do seu sistema para visualizar uma página Web" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ Abrir uma janela do navegador para ver essas informações?
+ <usetemplate ignoretext="Abrir o navegador para acessar uma página na web" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="WebLaunchJoinNow">
- Ir ao www.secondlife.com para gerenciar sua conta?
- <usetemplate ignoretext="Ao abrir o navegador web para gerenciar sua conta" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ Deseja abrir o [http://secondlife.com/account/ Painel] para gerenciar sua conta?
+ <usetemplate ignoretext="Abrir o navegador para acessar minha conta" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="WebLaunchSecurityIssues">
Visite a Wiki do [SECOND_LIFE] para detalhes de como Reportar um Problema de Segurança.
- <usetemplate ignoretext="Ao abrir o navegador da web para visualizar a Wiki de Problemas de Segurança" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ <usetemplate ignoretext="Abrir o navegador para ver como denunciar uma ocorrência" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="WebLaunchQAWiki">
Visite o Wiki de QA do [SECOND_LIFE].
- <usetemplate ignoretext="Ao abrir o navegador web para visualizar a Wiki de QA" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ <usetemplate ignoretext="Abrir meu navegador para ver a página Wiki" name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<notification name="WebLaunchPublicIssue">
Visite o Rastreador Público de Problemas do [SECOND_LIFE], onde você poderá reportar Bugs e outros Problemas.
- <usetemplate ignoretext="Ao abrir o navegador web para visualizar o Rastreador Público de Problemas" name="okcancelignore" notext="Cancelar" yestext="Ir para a Página"/>
- </notification>
- <notification name="WebLaunchPublicIssueHelp">
- Visite a Wiki [SECOND_LIFE] para informações sobre como utilizar o Rastrador de Público de Problemas.
- <usetemplate ignoretext="Ao abrir o navegador web para visualizar a wiki do Rastreador Público de Problemas" name="okcancelignore" notext="Cancelar" yestext="Ir para a página"/>
+ <usetemplate ignoretext="Abrir o navegador para usar o Monitor de problemas" name="okcancelignore" notext="Cancelar" yestext="Ir para a Página"/>
</notification>
<notification name="WebLaunchSupportWiki">
Ir até o Blog Oficial da Linden buscar pelas últimas notícias e informações.
- <usetemplate ignoretext="Ao abrir o navegador da web para visualizar o blog" name="okcancelignore" notext="Cancelar" yestext="Ir até a página"/>
+ <usetemplate ignoretext="Abrir meu navegador para ler o blog" name="okcancelignore" notext="Cancelar" yestext="Ir até a página"/>
</notification>
<notification name="WebLaunchLSLGuide">
- Ir para a página guia do LSL para ajuda com script?
- <usetemplate ignoretext="Ao abrir o navegador web para visualizar o Guia de Scripts." name="okcancelignore" notext="Cancelar" yestext="Ir para a página"/>
+ Abrir o Guia de scripts para obter ajuda?
+ <usetemplate ignoretext="Abrir meu navegador para usar o Guia de scripts" name="okcancelignore" notext="Cancelar" yestext="Ir para a página"/>
</notification>
<notification name="WebLaunchLSLWiki">
- Ir para o portal LSL para ajuda com script?
- <usetemplate ignoretext="Ao abrir o navegador da web para visualizar o Portal de LSL" name="okcancelignore" notext="Cancelar" yestext="Ir para a página"/>
+ Consultar o LSL Portal para obter ajuda com scripts?
+ <usetemplate ignoretext="Abrir meu navegador para consultar o LSL Portal" name="okcancelignore" notext="Cancelar" yestext="Ir para a página"/>
</notification>
<notification name="ReturnToOwner">
Você tem certeza que deseja retornar os objetos selecionados para seus proprietários? Objetos transferíveis doados irão retornar aos proprietários anteriores.
*AVISO* Objetos doados não – transferíveis serão deletados!
- <usetemplate ignoretext="Ao retornar objetos a seus proprietários" name="okcancelignore" notext="Cancelar" yestext="Retornar"/>
+ <usetemplate ignoretext="Confirmar antes de devolver objetos a seus donos" name="okcancelignore" notext="Cancelar" yestext="Retornar"/>
</notification>
<notification name="GroupLeaveConfirmMember">
Você é atualmente um membro do grupo [GROUP].
-Deixar este grupo?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Deixar"/>
+Sair do grupo?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sair"/>
</notification>
<notification name="ConfirmKick">
- Você quer REALMENTE expulsar todos os usuários deste grid?
- <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Expulsar todos os usuários"/>
+ Tem CERTEZA de que deseja expulsar todos os residentes do grid?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Chutar todos"/>
</notification>
<notification name="MuteLinden">
- Desculpe, você não pode silenciar um Linden.
+ Desculpe, nenhum Linden pode ser bloqueado.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="CannotStartAuctionAlreadyForSale">
- Você não pode começar um leilão com um lote que já foi colocado à venda. Desabilite a venda da terra se você tem certeza que deseja iniciar um leilão.
+ Você não pode começar um leilão com um lote que já foi colocado à venda. Desabilite a venda se você tem certeza que deseja fazer um leilão.
</notification>
- <notification label="Silenciar objeto pelo nome falhou" name="MuteByNameFailed">
- Você já silenciou este nome.
+ <notification label="Falha ao bloquear objeto por nome" name="MuteByNameFailed">
+ Você já bloqueou este residente.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="RemoveItemWarn">
@@ -1354,18 +1394,21 @@ Deixar este grupo?
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="BusyModeSet">
- Definido o Modo Ocupado.
-Bate-papo e mensagens instantâneas serão escondidas. Mensagens instantâneas irão receber a sua resposta de modo ocupado. Todas as ofertas de teletransporte serão recusadas. Todas as ofertas de inventário irão para a sua Lixeira.
- <usetemplate ignoretext="Ao definir o Modo Ocupado" name="okignore" yestext="OK"/>
+ Modo ocupado ativado.
+O bate-papo e MIs não serão exibidos. MIs enviadas para você receberão sua resposta de modo ocupado. Todas as ofertas de teletransporte serão recusadas. Todas as ofertas de inventário serão colocadas na Lixeira.
+ <usetemplate ignoretext="Passar meu status para o modo ocupado" name="okignore" yestext="OK"/>
</notification>
<notification name="JoinedTooManyGroupsMember">
- Você já pertence a muitos grupos para entrar em outro. Por favor, deixe pelo menos um grupo antes de entrar neste. Para sair de um grupo, selecione o Menu Editar e a opção Meus &apos;Grupos...&apos;
-[NAME] convidou você para entrar num grupo como membro.
-[INVITE]
+ Você atingiu o limite máximo de grupos. Saia de outro grupo para poder entrar nesse ou recuse o convite.
+[NAME] está te convidando para entrar em um grupo.
<usetemplate name="okcancelbuttons" notext="Recusar" yestext="Entrar"/>
</notification>
+ <notification name="JoinedTooManyGroups">
+ Você atingiu o limite máximo de grupos. Sai de um grupo para entrar ou criar outro.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
<notification name="KickUser">
- Expulsar este usuário com qual mensagem?
+ Chutar este residente com qual mensagem?
<form name="form">
<input name="message">
Um administrador desligou você.
@@ -1385,7 +1428,7 @@ Bate-papo e mensagens instantâneas serão escondidas. Mensagens instantâneas i
</form>
</notification>
<notification name="FreezeUser">
- Paralise este usuário com qual mensagem?
+ Congelar este residente com qual mensagem?
<form name="form">
<input name="message">
Você foi congelado. Você não pode se mover ou conversar. Um administrador irá contatá-lo via mensagem instantânea (MI).
@@ -1395,7 +1438,7 @@ Bate-papo e mensagens instantâneas serão escondidas. Mensagens instantâneas i
</form>
</notification>
<notification name="UnFreezeUser">
- Liberar este usuário com qual mensagem?
+ Descongelar este residente com qual mensagem?
<form name="form">
<input name="message">
Você não está mais congelado.
@@ -1415,7 +1458,7 @@ Bate-papo e mensagens instantâneas serão escondidas. Mensagens instantâneas i
</form>
</notification>
<notification name="OfferTeleportFromGod">
- God user convocou para a sua localização?
+ Convocar residente à sua localização com poderes de deus?
<form name="form">
<input name="message">
Junte-se a mim em [REGION]
@@ -1425,8 +1468,20 @@ Bate-papo e mensagens instantâneas serão escondidas. Mensagens instantâneas i
</form>
</notification>
<notification name="TeleportFromLandmark">
- Você tem certeza que quer se teletransportar?
- <usetemplate ignoretext="Ao se teletransportar a partir de uma Landmark no inventário" name="okcancelignore" notext="Cancelar" yestext="Teletransportar"/>
+ Tem certeza de quer ser teletransportado para &lt;nolink&gt;[LOCATION]&lt;/nolink&gt;?
+ <usetemplate ignoretext="Confirmar se eu quero ser teletransportado para marcos" name="okcancelignore" notext="Cancelar" yestext="Teletransportar"/>
+ </notification>
+ <notification name="TeleportToPick">
+ Teletransportar para [PICK]?
+ <usetemplate ignoretext="Confirmar se eu quero ser teletransportado para Destaques" name="okcancelignore" notext="Cancelar" yestext="Teletransportar"/>
+ </notification>
+ <notification name="TeleportToClassified">
+ Teletransportar para [CLASSIFIED]?
+ <usetemplate ignoretext="Confirmar se eu quero ser teletransportado lugar do anúncio" name="okcancelignore" notext="Cancelar" yestext="Teletransportar"/>
+ </notification>
+ <notification name="TeleportToHistoryEntry">
+ Teletransportar para [HISTORY_ENTRY]?
+ <usetemplate ignoretext="Confirmar se eu quero ser teletransportado para marcos" name="okcancelignore" notext="Cancelar" yestext="Teletransportar"/>
</notification>
<notification label="Mensagem para todos na sua Propriedade" name="MessageEstate">
Digite um breve anúncio que será enviado para todos que estejam atualmente na sua propriedade.
@@ -1437,11 +1492,11 @@ Bate-papo e mensagens instantâneas serão escondidas. Mensagens instantâneas i
</form>
</notification>
<notification label="Mudar propriedade Linden" name="ChangeLindenEstate">
- Você está prestes a mudar uma propriedade pertencente a Linden (continente, teen grid, orientação, etc.)
+ Você está prestes a modificar uma propriedade da Linden (continente, teen, grid, orientação, etc)
-Isto é EXTREMAMENTE PERIGOSO porque pode fundamentalmente afetar a experiência do usuário. No continente, vai mudar milhares de regiões e fazer o spaceserver soluçar.
+Esta ação é EXTREMAMENTE PERIGOSA -- ela pode afetar a experiência dos residentes. No continente, isso vai mudar milhares de regiões e deixar o spaceserver sobrecarregado.
-Proceder?
+Deseja prosseguir?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Mudar Propriedade"/>
</notification>
<notification label="Mudar o acesso à propriedade Linden" name="ChangeLindenAccess">
@@ -1495,9 +1550,7 @@ Isto mudará milhares de regiões e fará o spaceserver soluçar.
Você não é permitido na Região devido à sua Classificação de maturidade. Isto pode ser o resultado da falta de informação de validação de sua idade.
Por favor, verifique se você está com o último Visualizador instalado e vá ao Banco de Conhecimento para detalhes em como acessar áreas com esta classificação de maturidade.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="RegionEntryAccessBlocked_KB">
Você não é permitido nesta região devido à sua Classificação de maturidade.
@@ -1506,37 +1559,29 @@ Ir para o Banco de Conhecimento para maiores informações sobre Classificaçõe
<url name="url">
http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/pt
</url>
- <usetemplate
- name="okcancelignore"
- yestext="Ir para o Banco de Conhecimento"
- notext="Fechar"
- ignoretext="Quando a entrada na região está bloqueada devido à Classificação de maturidade"/>
+ <usetemplate ignoretext="Não posso entrar nessa região devido à classificação do conteúdo" name="okcancelignore" notext="Fechar" yestext="Ir para o Banco de Conhecimento"/>
</notification>
<notification name="RegionEntryAccessBlocked_Notify">
Você não é permitido nesta região devido à sua Classificação de maturidade.
</notification>
<notification name="RegionEntryAccessBlocked_Change">
- Você não é permitido nessa região devido à sua preferência de Classificação de maturidade.
-
-Você pode clicar em &apos;Mudar Preferência&apos; para aumentar sua preferência de Classificação de maturidade agora e permitir sua entrada. Você estará habilitado a buscar e acessar conteúdo [REGIONMATURITY] a partir de agora. Se você desejar mais tarde voltar à configuração anterior, vá para Editar &gt; Preferencias... &gt; Geral.
- <form name="form">
- <button
- name="OK"
- text="Mudar Preferência"/>
- <button
- default="true"
- name="Cancel"
- text="Fechar"/>
- <ignore name="ignore" text="Quando a entrada na Região está bloqueada devido à preferência de Classificação de maturidade"/>
- </form>
+ Você não pode entrar nessa região devido à sua seleção de maturidade.
+
+Para entrar na região desejada, mude o nível de maturidade. Você então poderá fazer buscas e acessar conteúdo [REGIONMATURITY]. Para desfazer qualquer mudança, vá para Eu &gt; Preferências &gt; Geral.
+ <form name="form">
+ <button name="OK" text="Mudar preferência"/>
+ <button default="true" name="Cancel" text="Fechar"/>
+ <ignore name="ignore" text="Minha preferência de maturidade impede que eu vá a uma região"/>
+ </form>
+ </notification>
+ <notification name="PreferredMaturityChanged">
+ Sua opção de nível de maturidade é [RATING].
</notification>
<notification name="LandClaimAccessBlocked">
Você não pode reclamar esta terra devido à sua Classificação de maturidade. Isto pode ser o resultado de falta de informação na validação de sua idade.
Por favor, verifique se você tem o último Visualizador instalado e vá para o Banco de Conhecimento para detalhes sobre o acesso de áreas com esta Classificação de maturidade.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LandClaimAccessBlocked_KB">
Você não pode reclamar esta terra devido à sua Classificação de maturidade.
@@ -1545,32 +1590,22 @@ Ir para a o Banco de Conhecimento para maiores informações sobre ClassificaçÃ
<url name="url">
http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/pt
</url>
- <usetemplate
- name="okcancelignore"
- yestext="Ir para o Banco de Conhecimento"
- notext="Fechar"
- ignoretext="Quando reclamar a Terra está bloqueado devido à Classificação de maturidade"/>
+ <usetemplate ignoretext="Não reivindicar essa região devido à classificação do conteúdo" name="okcancelignore" notext="Fechar" yestext="Ir para o Banco de Conhecimento"/>
</notification>
<notification name="LandClaimAccessBlocked_Notify">
Você não pode reclamar esta terra devido à sua Classificação de maturidade.
</notification>
<notification name="LandClaimAccessBlocked_Change">
- Você não pode reclamar esta terra devido à sua preferência de Classsificação de maturidade.
+ Você não pode reivindicar essa região devido à sua preferência de maturidade
-Você pode clicar em &apos;Mudar Preferência&apos; para aumentar sua preferência de Classificação de maturidade agora e permitir sua entrada. Você estará habilitado a buscar e acessar conteúdo [REGIONMATURITY] a partir de agora. Se você desejar mais tarde voltar à configuração anterior, vá para Editar &gt; Preferencias... &gt; Geral.
- <usetemplate
- name="okcancelignore"
- yestext="Mudar Preferência"
- notext="Fechar"
- ignoretext="Quando reclamar a Terra está bloqueado devido à preferência de Classificação de maturidade"/>
+Clique em &apos;Mudar preferência&apos; para aumentar o nível de maturidade e entrar nessa região. De agora em diante você pode buscar e acessar conteúdo [REGIONMATURITY] . Para modificar esta configuração, vá à Eu &gt; Preferências &gt; Geral.
+ <usetemplate ignoretext="Minha preferência de conteúdo impede que eu reivindique terrenos" name="okcancelignore" notext="Fechar" yestext="Mudar Preferência"/>
</notification>
<notification name="LandBuyAccessBlocked">
Você não pode comprar esta terra devido à sua Classificação de maturidade. Isto pode ser o resultado de falta de informação na validação de sua idade.
Por favor, verifique se você tem o último Visualizador instalado e vá para o Banco de Conhecimento para detalhes sobre o acesso de áreas com esta Classificação de maturidade.
- <usetemplate
- name="okbutton"
- yestext="OK"/>
+ <usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="LandBuyAccessBlocked_KB">
Você não pode comprar esta terra devido à sua Classificação de maturidade.
@@ -1579,27 +1614,19 @@ Ir para o Banco de Conhecimento para maiores informações sobre Classificaçõe
<url name="url">
http://wiki.secondlife.com/wiki/Linden_Lab_Official:Maturity_ratings:_an_overview/pt
</url>
- <usetemplate
- name="okcancelignore"
- yestext="Ir para o Banco de Conhecimento"
- notext="Fechar"
- ignoretext="Quando a compra de Terra está bloqueada devido à Classificação de maturidade"/>
+ <usetemplate ignoretext="Não posso comprar essa região devido à classificação do conteúdo" name="okcancelignore" notext="Fechar" yestext="Ir para o Banco de Conhecimento"/>
</notification>
<notification name="LandBuyAccessBlocked_Notify">
Você não pode comprar esta terra devido à sua Classificação de maturidade.
</notification>
<notification name="LandBuyAccessBlocked_Change">
- Você não pode comprar esta terra devido à sua preferência de Classificação de maturidade.
+ Você não pode comprar esse terreno devido à sua preferência de maturidade
-Você pode clicar em &apos;Mudar Preferência&apos; para aumentar sua preferência de Classificação de maturidade agora e permitir sua entrada. Você estará habilitado a buscar e acessar conteúdo [REGIONMATURITY] a partir de agora. Se você desejar mais tarde voltar à configuração anterior, vá para Editar &gt; Preferencias... &gt; Geral.
- <usetemplate
- name="okcancelignore"
- yestext="Mudar Preferência"
- notext="Fechar"
- ignoretext="Quando a compra de Terra está bloqueada devido à preferência de Classificação de maturidade"/>
+Clique em &apos;Mudar preferência&apos; para aumentar o nível de maturidade e entrar nessa região. De agora em diante você pode buscar e acessar conteúdo [REGIONMATURITY] . Para modificar esta configuração, vá à Eu &gt; Preferências &gt; Geral.
+ <usetemplate ignoretext="Minha preferência de conteúdo não me deixa comprar terrenos" name="okcancelignore" notext="Fechar" yestext="Mudar Preferência"/>
</notification>
<notification name="TooManyPrimsSelected">
- &quot;Muitos prims foram selecionados. Por favor, selecione [MAX_PRIM_COUNT] ou menos e tente novamente.&quot;
+ Muitos prims foram selecionados. Selecione [MAX_PRIM_COUNT] ou menos prims, e tente de novo
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="ProblemImportingEstateCovenant">
@@ -1632,19 +1659,11 @@ Publicar este classificado agora por L$ [AMOUNT]?
</notification>
<notification name="SetClassifiedMature">
Este classificado contém conteúdo Mature?
- <usetemplate
- canceltext="Cancelar"
- name="yesnocancelbuttons"
- notext="Não"
- yestext="Sim"/>
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Não" yestext="Sim"/>
</notification>
<notification name="SetGroupMature">
Este grupo contém conteúdo Mature?
- <usetemplate
- canceltext="Cancelar"
- name="yesnocancelbuttons"
- notext="Não"
- yestext="Sim"/>
+ <usetemplate canceltext="Cancelar" name="yesnocancelbuttons" notext="Não" yestext="Sim"/>
</notification>
<notification label="Confirmar reiniciar" name="ConfirmRestart">
Você quer realmente reiniciar esta região em 2 minutos?
@@ -1658,217 +1677,14 @@ Publicar este classificado agora por L$ [AMOUNT]?
<button name="Cancel" text="Cancelar"/>
</form>
</notification>
- <notification label="Bloquear Terraforma" name="HelpRegionBlockTerraform">
- Se esta opção for assinalada, donos de Terrenos não serão capazes de terraformar independentemente da configuração &apos;Editar Terreno&apos; de suas terras por lote.
-
-Padrão: desligado
- </notification>
- <notification label="Bloquear Vôo" name="HelpRegionBlockFly">
- Se esta caixa estiver marcada, as pessoas não poderão voar nesta região independente das configurações por lote de &apos;Voar&apos;.
-
-Padrão: desligado.
- </notification>
- <notification label="Mudança Conjunta das Permissões de Conteúdo" name="HelpBulkPermission">
- A ferramenta de Mudança Conjunta das Permissões lhe ajuda a mudar, rapidamente, as permissões de múltiplos itens que estão no conteúdo do(s) objeto(s) selecionado(s). Por favor observe que, no entanto, você está apenas definindo permissões para on itens que estão no conteúdo dos objetos selecionados -- não as permissões para o container dos próprios objetos.
-
-Também observe que as permissões não se aplicam aos conteúdos aninhados, contidos em quaisquer dos objetos. Sua solicitação opera apenas nos itens em exatamente um nível de profundidade.
-
-Você pode escolher seletivamente quais tipos de itens modificar, usando a lista de conferência aqui, abaixo de &apos;Tipos de Conteúdo&apos;. Quando você seleciona Texturas, as fotos são incluídas.
-
-* Esta ferramenta apenas mudará as permissões em itens que você pode mudar.
-* Você não pode dar ao Próximo dono, as permissões que você já não tem.
-* As permissões ao Próximo dono são meramente solicitações. Se um dos itens não puder assumir todas as novas permissões, nenhuma delas mudará.
-
-Quando você estiver pronto para mudar as permissões globais, clique &apos;Aplicar&apos; e aguarde os resultados na tela.
-
-Se você fechar a janela de Permissões Conjuntas enquanto elas estiverem sendo alteradas, a operação será suspensa.
- </notification>
- <notification label="Permitir Dano" name="HelpRegionAllowDamage">
- Marcar essa caixa habilita o sistema de vitalidade em todos os lotes independente das configurações individuais. Se esta caixa ficar desmarcada, os proprietários de lotes individuais ainda estarão aptos a ativar o sistema de vitalidade de seus lotes.
-
-Padrão: desligado.
- </notification>
- <notification label="Limite de Agentes" name="HelpRegionAgentLimit">
- Define o número máximo de residentes permitidos nesta região.
-Quanto mais residentes existirem em sua região, pior pode ser a performance.
-
-Padrão: 40
- </notification>
- <notification label="Bonus de Objetos" name="HelpRegionObjectBonus">
- O Bônus de objetos é um multiplicador para primitivas permitidas em qualquer lote. O intervalo permitido é de 1 a 10.
-Se fixado em &apos;1 &apos;, 512m² de cada lote permitem 117 objetos.
-Fixado em &apos;2 &apos;, 512m² cada lote permitem 234, ou o dobro, e assim por diante.
-O número máximo de objetos permitidos por região permanece 15000 não importa qual seja o Bônus de objeto. Uma vez estabelecido, esteja ciente de que a redução do Bônus de objetos pode retornar objetos ou apagá-los.
-
-Padrão: 1.0
- </notification>
- <notification label="Maturidade" name="HelpRegionMaturity">
- Define a Classificação de Maturidade da região, como mostrado na barra de menu, no topo de qualquer visualizador do Residente e nas dicas no Mapa-Mundi, quando o cursor passa sobre esta Região. Esta definição também afeta o acesso a esta Região e aos resultados de busca. Outros Residentes podem apenas entrar em Regiões ou ver resultados de busca com a mesma Classificação de maturidade que eles escolheram em suas preferências.
-
-Pode levar algum tempo até que esta mudança se reflita no mapa.
- </notification>
- <notification label="Restringir Empurrar" name="HelpRegionRestrictPushObject">
- Esta caixa de verificação Configura toda a região para permissões restritivas de empurrar.
-Quando habilitada, os agentes só podem empurrar a si mesmos ou serem empurrados pelo dono do lote.
-(Empurrar se refere à função LSL llPushObject().)
-
-Padrão: Desligado.
- </notification>
- <notification label="Unir/dividir lote" name="HelpParcelChanges">
- Configura se os lotes que não pertencem ao dono da propriedade podem ser unidos ou subdivididos.
-Se esta opção estiver desmarcada:
- * Apenas os donos ou gerentes de propriedades podem unir ou dividir lotes.
- * Eles podem unir ou subdividir lotes pertencentes ao dono ou ao grupo onde eles tem os poderes apropriados.
-Se esta opção estiver marcada:
- * Todos os donos de lotes podem unir ou subdividir os lotes que eles possuem.
- * Para lotes pertencentes a grupos, aqueles com os poderes apropriados podem unir ou subdividir lotes.
-
-Padrão: Marcado.
- </notification>
- <notification label="Não Mostrar na Pesquisa" name="HelpRegionSearch">
- Ao marcar esta caixa irá bloquear os donos de lotes de listar seus lotes na busca
-
-Padrão: desligado
- </notification>
<notification label="Modificar a maturidade da Região" name="RegionMaturityChange">
- A classificação de maturidade para esta região foi atualizada.
-Pode levar algum tempo para que a mudança seja refletida no mapa.
- </notification>
- <notification label="Revenda de Terreno" name="HelpRegionLandResell">
- Os gerentes e os donos de propriedades podem vender qualquer terreno pertencente ao dono da propriedade.
-Se esta opção estiver desmarcada, os compradores não podem revender seus terrenos nesta região.
-Se esta opção estiver marcada, compradores podem vender seus terrenos nesta região.
-
-Padrão: Desabilitada.
- </notification>
- <notification label="Desabilitar Scripts" name="HelpRegionDisableScripts">
- Quando a performance do simulador está ruim, um script pode ser o culpado. Abra a Barra de Estatísticas (Ctrl+Shift+1). Olhe no Simulador de Física FPS. Se estiver abaixo de 45, então abra o painel &apos;Tempo&apos; localizado na parte de baixo da Barra de Estatísticas. Se o Tempo de Script indicar 25 ms ou mais, clique no botão &apos;Get Top CScripts&apos;. Será dado o nome e a localização do script que pode estar causando uma performance ruim. Marque a caixa &apos;Desabilitar Scripts&apos; e aperte o botão &apos;Aplicar&apos;. Isto temporariamente desabilitará todos os scripts nesta região. Uma vez que você chegar ao local, investigue o script para determinar se ele está causando o problema. Você pode querer entrar em contato com o proprietário do script, excluir ou devolver o objeto. Desmarque a caixa &apos;Desabilitar Script&apos; e então clique em &apos;Aplicar&apos; para reativar os scripts na região. Padrão: desligado.
- </notification>
- <notification label="Desabilitar Colisões" name="HelpRegionDisableCollisions">
- Quando a performance do simulador é pobre, os objetos físicos podem ser os culpados.Abra a a Barra de Estatísticas (Ctrl+Shift+1).
-Olhe a taxa de quadros por segundos (FPS) dos objetos físicos.
-
-Se ela estiver abaixo de 45, abra o painel de Tempo, localizado na parte inferior da Barra de Estatísticas. Se o Tempo (Físicos) do Simulador mostrar 20 ms ou mais, clique o botão &apos;Pegue os Maiores Colidentes&apos;. Será fornecido a você o nome e a localidade dos objetos físicos que podem estar causando uma performance pobre.
-Ativando a caixa Desabilitar Colisões e então pressionando o botão Aplicar, as colisões objeto-objeto serão temporariamente desabilitadas. Você pode precisar fazer isso para que possa viajar até a localidade onde observou um &apos;colidente-mor&apos;. Uma vez tendo chegado à localidade, investigue o objeto – ele está constantemente colidindo com outros objetos? Você pode desejar contatar o dono do objeto ou deletar ou retornar o objeto.
-Desative a caixa &apos;Desabilitar Colisões&apos; e então use &apos;Aplicar&apos; para reativar as colisões na região.
-
-Padrão: off
- </notification>
- <notification label="Desabilitar Física" name="HelpRegionDisablePhysics">
- Desabilitar Física é similar a desabilitar Colisões, com exceção de que todas as simulações físicas serão desabilitadas. Isto significa que não só os objetos pararão de colidir, mas também que os avatares não poderão se mover.
-
-Isto só deve ser usado quando Desabilitar Colisões não trouxer performance suficiente à região para investigar um problema de Física ou do &apos;Colidente-Mor&apos;.
-
-Esteja certo de reabilitar Física quando você terminar, ou os avatares não poderão se mover.
-
-Default: desligado
- </notification>
- <notification label="Principais Colidentes" name="HelpRegionTopColliders">
- Mostra uma lista de objetos com o maior número de potenciais colisões objeto-objeto. Estes objetos podem diminuir a performance do simulador.
-Selecione Ver &gt; Barra de Estatísticas e olhe em Simulador &gt; Tempo &gt; Tempo de Simulação (Física) para ver se mais de 20 ms são gastos em física.
- </notification>
- <notification label="Principais Scripts" name="HelpRegionTopScripts">
- Mostra uma lista dos objetos gastando mais tempo rodando scripts LSL. Estes objetos podem diminuir a performance do simulador.
-Selecione Ver &gt; Barra de Estatísticas e olhe em Simulador &gt; Tempo &gt; Tempo de Script para ver se mais de 25 ms são gastos em scripts.
- </notification>
- <notification label="Reiniciar Região" name="HelpRegionRestart">
- Reinicia o processo do servidor rodando esta região, após um aviso de dois minutos. Todos os residentes nesta região serão desconectados. A região salvará seus dados e deverá retornar em até 90 segundos.
-
-Reiniciar a região não consertará a maioria dos problemas de performance, e deveria ser utilizada somente quando solicitado.
- </notification>
- <notification label="Altura da água" name="HelpRegionWaterHeight">
- Esta é a altura em metros onde a água aparece. Caso este ajuste seja diferente de 20 e você tenha águas adjacentes ao limite do seu terreno ou águas continentais, haverá uma abertura visível.
-
-Padrão: 20
- </notification>
- <notification label="Limite do aumento" name="HelpRegionTerrainRaise">
- Esta é a distância em metros que os donos de lotes podem elevar o terreno, a partir da altura nivelada do terreno.
-
-Padrão: 4
- </notification>
- <notification label="Limite mais baixo" name="HelpRegionTerrainLower">
- Esta é a distância em metros que os donos de lotes podem abaixar o terreno, a partir da altura nivelada do terreno.
-
-Padrão: -4
- </notification>
- <notification label="Carregar terreno RAW" name="HelpRegionUploadRaw">
- Este botão faz upload de um arquivo .RAW para a região em que você está.
-O arquivo precisa conter as dimensões/número de canais corretos: RGB, 256x256 e 13 canais. A melhor forma de criar um arquivo da região é baixando o arquivo .RAW existente. Um bom primeiro passo seria modificar o primeiro canal (altura da região) e fazer o upload do arquivo.
-
-O upload pode levar certa de 45 segundos. Note que fazer upload do arquivo da região *não* moverá os objetos que estão na região, apenas o terreno e as permissões associadas a ele. Isso pode fazer com que alguns objetos fiquem debaixo da terra.
-
-Para mais informações sobre edição dos campos de altura da região, consulte a ajuda F1.
- </notification>
- <notification label="Baixar RAW de terreno" name="HelpRegionDownloadRaw">
- Este botão faz download de um arquivo contendo dados de altura do campo, dimensões do lote, status de lotes à venda e algumas permissões de lote para este terreno. Ao abrir o arquivo em programas como o Photoshop, você precisa especificar as dimensões do documento, que são: RGB, 256x256 com 13 canais. Este arquivo de terras não pode ser aberto de outra forma.
-
-Para mais informações sobre edição dos campos de altura da região, consulte a Ajuda F1.
- </notification>
- <notification label="Usar Sol da Propriedade" name="HelpRegionUseEstateSun">
- Esta caixa de opção faz com que a posição do sol nesta região seja a mesma que no resto da região.
-
-Padrão: ligada
- </notification>
- <notification label="Sol fixo" name="HelpRegionFixedSun">
- Esta caixa de opção ajusta a posição do sol no equalizador de fuso e interrompe o movimento do sol.
-
-Padrão: desligada
- </notification>
- <notification label="Nivelar Terreno" name="HelpRegionBakeTerrain">
- Este botão salva a forma atual do terreno como o novo padrão para a região. Uma vez nivelado, o terreno pode reverter à forma que foi salva, sempre que você ou outros utilizarem a ferramenta &apos;Revert&apos; na edição de terreno. O terreno nivelado é também o ponto médio entre os limites de elevação e redução de terreno.
- </notification>
- <notification label="Gerentes da Propriedade" name="HelpEstateEstateManager">
- Um gerente da propriedade é um residente a quem você delegou o controle das configurações da região. Ele pode alterar qualquer configuração da região, com exceção de elevar, abaixar ou nivelar o terreno. Em particular, eles podem permitir ou banir residentes da sua propriedade. Gerentes da propriedade só podem ser adicionados ou removidos pelo dono da propriedade.
-
-Um gerente não pode adicionar ou remover outro gerente. Por favor, escolha somente residentes em quem você confia para serem gerentes da propriedade, pois você poderá ser responsabilizado pelas ações deles.
- </notification>
- <notification label="Usar hora Global" name="HelpEstateUseGlobalTime">
- Esta caixa de opção faz com que o Sol em sua propriedade siga a mesma posição do Sol nas propriedades da &apos;mainland&apos; do Linden Lab.
-
-Padrão: ligado
- </notification>
- <notification label="Sol fixo" name="HelpEstateFixedSun">
- Esta caixa de opção ajusta a posição do sol no equalizador de fuso e interrompe o movimento do sol.
- </notification>
- <notification label="Acesso público" name="HelpEstateExternallyVisible">
- Esta caixa de verificação define se os Residentes que estão em outras propriedades podem entrar nesta, sem estar em uma lista de acesso.
+ O conteúdo desta região foi reclassificado.
+Talvez leve algum tempo para a mudança ser refletida no mapa.
-Padrão: on
- </notification>
- <notification label="Permitir Teletransporte direto" name="HelpEstateAllowDirectTeleport">
- Quando marcada, permite que os residentes se teletransportem diretamente para qualquer ponto da sua propriedade. Quando desmarcada, os residentes serão teleportados para o telehub mais próximo.
-
-Padrão: desmarcada
- </notification>
- <notification label="Permitir acesso" name="HelpEstateAllowResident">
- Acesso a esta propriedade estará limitado aos Residentes listados aqui e em quaisquer grupos abaixo.
-Esta definição está disponível apenas quando o Acesso Público estiver desmarcado.
- </notification>
- <notification label="Permitir acesso de grupo" name="HelpEstateAllowGroup">
- Acesso a esta propriedade estará limitado aos grupos listados aqui e a quaisquer Residentes acima.
-Esta definição está disponível apenas quando o Acesso Público estiver desmarcado.
- </notification>
- <notification label="Endereço de Email do Abuso" name="HelpEstateAbuseEmailAddress">
- Configurar isto para um endereço de email válido, fará com que relatos de abuso nesta propriedade sejam enviados para esse endereço.
-Definí-lo em branco fará com que os relatórios de abuso sejam enviados apenas para a Linden Lab.
- </notification>
- <notification label="Negar acesso" name="HelpEstateBanResident">
- Residentes desta lista estão proibidos de acessar a sua propriedade, independentemente de outras configurações.
- </notification>
- <notification label="Permitir Conversa por Voz" name="HelpEstateVoiceChat">
- Lotes nesta propriedade têm permissão para ter seus canais de voz próprios, nos quais os residentes podem ouvir e falar com os outros residentes próximos.
-
-Padrão: desligado
+Para ir a regiões de conteúdo Adulto, é preciso ter uma conta verificada, seja comprovando a idade ou com dados de pagamento.
</notification>
<notification label="Discordância de Versão de Voz" name="VoiceVersionMismatch">
- Esta versão do [APP_NAME] não é compatível com as características do Canal de Voz desta região. Para que a Conversa por Voz funcione corretamente, você precisará atualizar o [APP_NAME].
- </notification>
- <notification label="Corretor da Propriedade" name="HelpEstateCovenant">
- Definir um corretor da propriedade lhe permite vender lotes nesta propriedade. Se um corretor não for definido, você não pode vender terras. O cartão do seu corretor pode ficar vazio se você não desejar aplicar quaisquer regras ou avisar os compradores sobre qualquer coisa em relação ao lote antes da compra.
-
-Um corretor pode ser usado para comunicar regras, orientações, informações culturais ou simplesmente suas expectativas quanto ao futuro comprador. Isto pode incluir zoneamento, regulamentos para construções, opções de pagamento ou qualquer outra informação que você julgar importante que o novo proprietário veja e concorde antes da compra.
-
-O comprador precisa concordar com o corretor marcando a caixa de verificação antes de concluir a compra. Corretores são sempre visíveis na caixa de diálogo &apos;Sobre a Terra&apos; para todos os lotes que têm corretores definidos.
+ Esta versão do [APP_NAME] não é compatível com o recurso &apos;Bate-papo de voz&apos; desta região. Para o bate-papo de voz funcionar, atualize o [APP_NAME].
</notification>
<notification label="Impossível Comprar Objetos" name="BuyObjectOneOwner">
Não é possível comprar objetos de diferentes proprietários ao mesmo tempo.
@@ -1956,53 +1772,36 @@ Por favor, re-insira sua senha e clique &apos;Confirmar Compra&apos;.
Estes itens serão movidos para o seu inventário, não copiados.
Mover os itens do inventário?
- <usetemplate ignoretext="Quando estiver movendo inventário não copiável a partir de objetos." name="okcancelignore" notext="Não mover" yestext="Mover"/>
+ <usetemplate ignoretext="Avisar antes de eu pegar items &apos;cópia proibida&apos; de um objeto" name="okcancelignore" notext="Não mover" yestext="Mover"/>
</notification>
<notification name="MoveInventoryFromScriptedObject">
Você selecionou itens de inventário não copiáveis.
Estes itens serão movidos para seu inventário, não copiados. Pelo fato de o objeto ter scripts, mover estes itens ao inventário pode provocar um mal funcionamento do script.
Mover para o inventário o(s) item(s)?
- <usetemplate ignoretext="Quando movendo objetos com scripts não copiáveis ao inventário" name="okcancelignore" notext="Não mover" yestext="Mover"/>
+ <usetemplate ignoretext="Avisar antes de eu pegar items &apos;cópia proibida&apos; que podem quebrar objetos com script" name="okcancelignore" notext="Não mover" yestext="Mover"/>
</notification>
<notification name="ClickActionNotPayable">
- Aviso: A ação de &apos;Pagar Objeto&apos; com clique foi definida, mas funcionará apenas se for adicionado um script com o evento money().
+ Aviso: O clique em &apos;Pagar por objeto&apos; foi processado, mas só pode funcionar se um script tiver um evento money().
<form name="form">
- <ignore name="ignore" text="Quando Definindo &apos;Pagar&apos; em objetos sem eventos money()"/>
+ <ignore name="ignore" text="Definir &apos;Pagar por objeto&apos; ao construir um objeto sem script money()"/>
</form>
</notification>
<notification name="OpenObjectCannotCopy">
Não há itens neste objeto que você está autorizado a copiar.
</notification>
<notification name="WebLaunchAccountHistory">
- Ir para o site do [SECOND_LIFE] para visualizar o histórico de sua conta?
- <usetemplate ignoretext="Ao abrir a página web de histórico de conta" name="okcancelignore" notext="Cancelar" yestext="Ir para a página"/>
- </notification>
- <notification name="ClickOpenF1Help">
- Visitar o website de Suporte do [SECOND_LIFE]?
- <usetemplate ignoretext="Quando visitando o website de Suporte do [SECOND_LIFE]" name="okcancelignore" notext="Cancelar" yestext="Ir"/>
+ Deseja abrir o [http://secondlife.com/account/ Painel] para ver o histórico da sua conta?
+ <usetemplate ignoretext="Abrir o navegador para acessar minha conta" name="okcancelignore" notext="Cancelar" yestext="Ir para a página"/>
</notification>
<notification name="ConfirmQuit">
Tem certeza que deseja sair?
- <usetemplate ignoretext="Quando Saindo do [APP_NAME]." name="okcancelignore" notext="Continuar" yestext="Sair"/>
+ <usetemplate ignoretext="Confirmar antes de sair" name="okcancelignore" notext="Não sair" yestext="Sair"/>
</notification>
<notification name="HelpReportAbuseEmailLL">
- Use esta ferramenta para reportar violações aos [http://secondlife.com/corporate/tos.php?lang=pt-BR Termos de Serviço] e aos [http://secondlife.com/corporate/cs.php?lang=pt-BR Padrões da Comunidade].
+ Use esta ferramenta para denunciar infrações dos [http://secondlife.com/corporate/tos.php Termos do Serviço] e das [http://secondlife.com/corporate/cs.php Normas da Comunidade].
-Todos os abusos aos Termos de Serviço e aos Padrões da Comunidade reportados, são investigados e resolvidos. Você pode ver a resolução do incidente na Reportagem de Incidentes em:
-
-http://secondlife.com/support/incidentreport.php
- </notification>
- <notification name="HelpReportAbuseEmailEO">
- IMPORTANTE: Esta reportagem irá para o dono da região em que você se encontra atualmente e não para a Linden Lab.
-
-Como um serviço aos residentes e visitantes, o dono da região em que você se encontra foi eleito para receber e resolver todas as reportagens originadas nesta região. A Linden Lab não irá investigar reportagens que você envia desta localidade.
-
-O dono da região resolverá as reportagens baseado nas regras locais desta região, como definido na Declaração da propriedade.
-(Veja as declarações indo ao menu Mundo e selecionando Sobre a Terra.)
-
-A resolução desta reportagem se aplica apenas a esta região; o acesso de Residentes às outras áreas do [SECOND_LIFE] não será afetado pelas decisões desta reportagem.
-Apenas a Linden Lab pode restringir acesso a todo o [SECOND_LIFE].
+Todas as denúncias de abuso são investigadas e resolvidas.
</notification>
<notification name="HelpReportAbuseSelectCategory">
Por favor, selecione uma categoria para a reportagem deste abuso.
@@ -2026,17 +1825,18 @@ Seja tão específico quanto você puder, incluindo nomes e os detalhes do incid
Fazer uma descrição precisa nos ajuda a arquivar e processar as reportagens de abuso.
</notification>
<notification name="HelpReportAbuseContainsCopyright">
- Caro Residente,
+ Caro residente,
+
+Aparentemente você fez uma denúncia de infranção de propriedade intelectual. Certifique-se de que sua denúncia está correta:
-Você parece estar relatando violação de propriedade intelectual. Por favor, certifique-se de que está relatando corretamente:
+(1) Procedimento do abuso Se você tem motivos para acreditar que um residente está burlando o sistema de autorização do [SECOND_LIFE] usando o CopyBot ou ferramentas parecidas para infringir direitos de propriedade intelectual, envie um relatório de abuso. A equipe anti-abuso investiga e impõe sanções em casos de infranção dos [SECOND_LIFE] [http://secondlife.com/corporate/tos.php Termos de Serviço] ou das [http://secondlife.com/corporate/cs.php Normas da Comunidade]. Entretando, a equipe anti-abuso não lida com pedidos de remoção de conteúdo do [SECOND_LIFE]. Tais pedidos não serão atendidos.
-(1) O Processo de abuso. Você pode apresentar um relatório de abuso se você acredita que um Residente está infringindo o sistema de permissões do [SECOND_LIFE], por exemplo, utilizando ferramentas CopyBot para copiar ou similar, para violar os direitos de propriedade intelectual. A Equipe de Abuso investiga e divulga a ação disciplinar adequada para o comportamento que viola o Estatuto da Comunidade do [SECOND_LIFE] ou os Termos de Serviço. No entanto, a mesma não controla e não irá responder aos pedidos para remover o conteúdo do mundo [SECOND_LIFE].
+(2) Procedimentos DMCA ou remoção de conteúdo. Para solicitar a remoção de conteúdo do [SECOND_LIFE], é imprescindível enviar uma notificação de infração elaborada conforme as disposicões da [http://secondlife.com/corporate/dmca.php Política DMCA].
-(2) O processo de remoção de conteúdo ou DMCA. Para solicitar a remoção de conteúdo do [SECOND_LIFE], você deve enviar uma notificação válida de infração, conforme previsto em nossa Política de DMCA em http://secondlife.com/corporate/dmca.php.
+Se você deseja continuar o procedimento de denúncia de abuso, feche esta janela e termine o relatório. A categoria &apos;CopyBot or Permissions Exploit&apos; (robô de cópia ou exploit de autorização)
-Se você ainda deseja prosseguir com o processo de abuso, por favor, feche esta janela e termine de enviar seu relatório. Pode ser necessário selecionar a categoria específica &apos;CopyBot Infração de Permissões&apos;.
+Obrigado.
-Obrigado,
Linden Lab
</notification>
<notification name="FailedRequirementsCheck">
@@ -2047,9 +1847,9 @@ Linden Lab
Já existe um objeto anexado a este ponto do seu corpo.
Você deseja substituí-lo pelo objeto selecionado?
<form name="form">
- <ignore name="ignore" save_option="true" text="Ao substituir os anexos existentes"/>
- <button name="Yes" text="Sim"/>
- <button name="No" text="Não"/>
+ <ignore name="ignore" save_option="true" text="Trocar um anexo atual pelo item selecionado"/>
+ <button ignore="Replace Automatically" name="Yes" text="Sim"/>
+ <button ignore="Never Replace" name="No" text="Não"/>
</form>
</notification>
<notification label="Aviso de Modo Ocupado" name="BusyModePay">
@@ -2057,18 +1857,22 @@ Você deseja substituí-lo pelo objeto selecionado?
Você gostaria de deixar o modo Ocupado antes de completar esta transação?
<form name="form">
- <ignore name="ignore" save_option="true" text="Ao pagar uma pessoa ou objeto no modo ocupado"/>
- <button name="Yes" text="Sim"/>
- <button name="No" text="Não"/>
+ <ignore name="ignore" save_option="true" text="Estou prestes a pagar alguém ou um objeto no modo ocupado"/>
+ <button ignore="Always leave Busy Mode" name="Yes" text="Sim"/>
+ <button ignore="Never leave Busy Mode" name="No" text="Não"/>
</form>
</notification>
+ <notification name="ConfirmDeleteProtectedCategory">
+ A pasta &apos;[FOLDERNAME]&apos; é uma pasta do sistema. Excluir pastas de sistema pode deixar o sistema instável. Tem certeza de que quer prosseguir?
+ <usetemplate ignoretext="Confirmar antes de excluir pastas do sistema." name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
<notification name="ConfirmEmptyTrash">
- Tem certeza de que deseja remover permanentemente o conteúdo da lixeira de seu inventário?
- <usetemplate ignoretext="Ao esvaziar a pasta da lixeira no seu inventário" name="okcancelignore" notext="Não" yestext="Sim"/>
+ Tem certeza de que deseja excluir o conteúdo da Lixeira? Para sempre?
+ <usetemplate ignoretext="Confirmar antes de esvaziar a pasta Lixeira" name="okcancelignore" notext="Não" yestext="Sim"/>
</notification>
<notification name="ConfirmClearBrowserCache">
- Você tem certeza que deseja limpar o cache do seu navegador?
- <usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/>
+ Tem certeza de que quer apagar todo o histórico de viagens, web e buscas?
+ <usetemplate name="okcancelbuttons" notext="Não" yestext="OK"/>
</notification>
<notification name="ConfirmClearCookies">
Você tem certeza de que deseja limpar os cookies?
@@ -2079,39 +1883,18 @@ Você gostaria de deixar o modo Ocupado antes de completar esta transação?
<usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Sim"/>
</notification>
<notification name="ConfirmEmptyLostAndFound">
- Deseja realmente remover permanentemente o conteúdo da pasta achados e perdidos?
- <usetemplate ignoretext="Ao esvaziar pasta Achados e Perdidos do seu inventário" name="okcancelignore" notext="Não" yestext="Sim"/>
+ Tem certeza de que deseja excluir o conteúdo dos Achados e Perdidos? Para sempre?
+ <usetemplate ignoretext="Confirmar antes de esvaziar a pasta Achados e Perdidos" name="okcancelignore" notext="Não" yestext="Sim"/>
</notification>
<notification name="CopySLURL">
- A seguinte SLurl foi copiada para o seu clipboard:
+ O seguinte SLurl foi copiado para a área de transferência:
[SLURL]
-Coloque-a em uma página web para dar aos outros um fácil acesso a este local ou tente você, colando-a na barra de endereços do seu navegador.
+Inclua um link para facilitar o acesso para visitantes. Teste o link na barra de endereço de qualquer navegador da web.
<form name="form">
- <ignore name="ignore" text="Ao copiar a SURL para o seu clipboard"/>
+ <ignore name="ignore" text="SLurl copiado para área de transferência."/>
</form>
</notification>
- <notification name="GraphicsPreferencesHelp">
- Este painel controla o tamanho da janela, resolução e a qualidade dos gráficos do computador cliente. O Preferências &gt; Interface Gráfica permite escolher entre quatro níveis gráficos: Baixo, Médio, Alto e Ultra. Você também pode personalizar suas configurações de gráficos selecionando a opção Personalizar e manipulando as seguintes definições:
-
-Sombreamento: Ativar ou desativar vários tipos de sombreadores de pixel.
-
-Detalhes de Reflexão: Define os tipos de objetos que a água pode refletir.
-
-Renderização de Avatar: Define opções que afetam a forma como o cliente renderizará os avatares.
-
-Alcance: Afeta a distância do seu ponto de vista que os objetos serão renderizados na cena.
-
-Número máximo de partículas: Define o número máximo de partículas que será capaz de ver na sua tela de uma só vez.
-
-Qualidade de Pós-Processamento: Define a resolução com a qual o brilho será renderizado.
-
-Detalhes de malha: Ajusta a quantidade de detalhes ou número de triângulos utilizados na renderização de certos objetos. Um valor mais alto leva mais tempo para renderizar, mas torna esses objetos mais detalhados.
-
-Detalhe de Iluminação: Seleciona os tipos de luzes que você gostaria de renderizar.
-
-Detalhe de Terreno: Ajusta a quantidade de detalhes que você gostaria de ver para a textura do terreno.
- </notification>
<notification name="WLSavePresetAlert">
Você deseja substituir a pré-configuração salva?
<usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/>
@@ -2130,149 +1913,6 @@ Detalhe de Terreno: Ajusta a quantidade de detalhes que você gostaria de ver pa
Existe efeito de Pós-Processamento. Você deseja substituí-lo?
<usetemplate name="okcancelbuttons" notext="Não" yestext="Sim"/>
</notification>
- <notification name="HelpEditSky">
- Editar os controles graduais do WindLight para configurar e salvar um conjunto de céus.
- </notification>
- <notification name="HelpEditDayCycle">
- Definir quais céus colocar durante todo o dia.
- </notification>
- <notification name="EnvSettingsHelpButton">
- Essas configurações ajustam a forma como o ambiente parece localmente no seu computador. Sua placa de vídeo precisa suportar o sombreador atmosférico, a fim de ter acesso a todas as definições.
-
-Ajuste o controle gradual &quot;Hora do Dia&quot; para alterar a fase do dia localmente no visualizador.
-
-Ajuste o controle gradual de &quot;Cobertura das nuvens&quot; para controlar quantas nuvens cobrem o céu.
-
-Pegue uma cor na paleta de cores de &quot;Cor da Ãgua&quot; para mudar a cor desta.
-
-Ajuste o controle gradual de &quot;Névoa de Ãgua&quot; para controlar o quão densa é a névoa dentro da água.
-
-Clique &quot;Usar Horário da Propriedade&quot; para redefinir a hora do dia para o horário atual do dia da região e permanecer atrelado a ela.
-
-Clique &quot;Céu Avançado &quot; para abrir um editor com configurações mais avançadas para o céu.
-
-Clique &quot;Ãgua Avançada &quot; para abrir um editor com configurações mais avançadas para a água.
- </notification>
- <notification name="HelpDayCycle">
- O editor de Ciclo do Dia dá a você o controle do céu durante um ciclo de dia/noite do [SECOND_LIFE]. Este é o ciclo usado pelo controle gradual da hora do dia do editor de ambiente básico.
-
-O editor do ciclo de dia trabalha configurando quadros-chave. Estes são pontos (representados pelos ícones cinza no gráfico de horário) que possuem um pré-ajuste de céu associado a eles. Conforme o dia passa, o céu do Windlight &quot; anima &quot; a interpolação entre esses quadros-chave.
-
-A seta amarela acima da linha de tempo representa a sua vista atual, baseada no horário do dia. Clique e arraste para ver como o seu dia será animado. Você pode adicionar ou deletar os quadros-chave pressionando os botões Adicionar Chave e Deletar chave ao lado direito da linha de tempo.
-
-Você pode configurar a posição do tempo de um quadro-chave arrastando-o pela linha do tempo, ou configurando manualmente no quadro de configurações do seu quadro-chave. Será possível a você associar o seu quadro-chave a este respectivo padrão WindLight.
-
-A duração do ciclo determina a duração geral do &quot;dia&quot;. Configurá-la para um valor baixo (por exmplo, 2 min.) quer dizer que a linha do tempo de 24 horas será animada completamente em apenas dois minutos reais! Assim que estiver satisfeito com a linha do tempo e o ciclo dos quadros-chave, use os botões Play e Stop para uma prévia de como ficará o resultado. Lembre-se, você também pode utilizar a seta amarela indicadora do tempo acima da linha do tempo para ver o ciclo animado interativamente. Usando o botão do tempo da popriedade irá sincronizar a duração do seu dia ao ciclo diário da propriedade.
-
-Assim que estiver satisfeito com o seu ciclo diário, você pode salvá-lo ou carregá-lo através dos botões Salvar Dia Teste e Carregar Dia Teste. Note que, por enquanto, nós permitimos apenas um Ciclo de dia.
- </notification>
- <notification name="HelpBlueHorizon">
- Use os cursores Vermelho/Verde/Azul ( Red/Green/Blue -RGB) para ajustar as cores do céu. Você também pode usar o controle de Intensidade (I) para mover os três controles RGB simultaneamente.
- </notification>
- <notification name="HelpHazeHorizon">
- Haze Horizon é um dos parâmetros mais úteis para ajuste global de exposição de luz na cena. Ele é eficaz para simular diversas configurações de exposição, tais como configurações para super-exposição do sol e escuros halos de Iris.
- </notification>
- <notification name="HelpBlueDensity">
- A densidade global azul afeta a saturação da cor do céu e nevoeiro. Se você mover o controle gradual de intensidade (I) para a direita, as cores vão se tornar mais brilhantes e vibrantes. Se você movê-lo totalmente para a esquerda, as cores perdem intensidade e cor, eventualmente chegando a preto e branco. Se pretende um ajuste fino do equilíbrio de cor do céu, você pode controlar os diversos elementos da saturação, utilizando os controles graduais para vermelho / verde / azul (RGB).
- </notification>
- <notification name="HelpHazeDensity">
- Densidade de Poeira controla o nível de fumaça, poeira cinza na atmosfera. Eficaz para simular cenas com altos níveis de poeira e poluentes. É também efetivo em simular névoa e nevoeiro.
- </notification>
- <notification name="HelpDensityMult">
- O Multiplicador de Densidade pode ser usado para afetar a densidade atmosférica global. Com definições mais baixas, ele cria uma sensação de &quot;ar rarefeito&quot; e em definições mais altas, ele cria um efeito mais denso, mais esfumaçado.
- </notification>
- <notification name="HelpDistanceMult">
- Ajusta como a distância no WindLight é percebida. Um valor zero efetivamente desativa a influência do WindLight sobre terrenos e objetos. Valores superiores a 1 simulam os efeitos atmosféricos mais espessos a maiores distâncias.
- </notification>
- <notification name="HelpMaxAltitude">
- Max Altitude ajusta os cálculos de performance de altitude do WindLight, quando computa sua iluminação atmosférica. Em períodos vespertinos do dia, é útil para ajustar a &quot;profundidade&quot; de como o pôr-do-sol aparece.
- </notification>
- <notification name="HelpSunlightColor">
- Ajustar a cor e intensidade da luz direta na cena.
- </notification>
- <notification name="HelpSunAmbient">
- Ajusta a cor e a intensidade da luz ambiente atmosférica na cena.
- </notification>
- <notification name="HelpSunGlow">
- O controle gradual de Tamanho controla o tamanho do sol.
-O controle gradual de Foco controla o quanto o sol aparecerá desfocado no céu.
- </notification>
- <notification name="HelpSceneGamma">
- Ajusta a distribuição na tela de luz e escuridão.
- </notification>
- <notification name="HelpStarBrightness">
- Ajusta o brilho das estrelas no céu.
- </notification>
- <notification name="HelpTimeOfDay">
- Controla a localização do sol no céu. Semelhante a elevação.
- </notification>
- <notification name="HelpEastAngle">
- Controla a localização do sol no céu.
-Similar ao azimute.
- </notification>
- <notification name="HelpCloudColor">
- Edita as cores das nuvens, É normalmente recomendado manter o tom esbranquiçado, mas hey! Você pode se divertir se desejar.
- </notification>
- <notification name="HelpCloudDetail">
- Controla os detalhes da camada de imagem superior na imagem de nuvem principal. X e Y controla sua posição. D (Densidade) controla o quão cheio ou estratificada as nuvens devem aparecer.
- </notification>
- <notification name="HelpCloudDensity">
- Permite que você controle a posição das nuvens com os cursores X e Y e a densidade deles com o cursor D.
- </notification>
- <notification name="HelpCloudCoverage">
- Controla o quanto as nuvens cobrem o céu.
- </notification>
- <notification name="HelpCloudScale">
- Controla o dimensionamento da imagem de nuvens na cúpula celeste.
- </notification>
- <notification name="HelpCloudScrollX">
- Controla a velocidade das nuvens que se movem na direção X.
- </notification>
- <notification name="HelpCloudScrollY">
- Controla a velocidade que as núvens se movem na direção Y.
- </notification>
- <notification name="HelpClassicClouds">
- Marque esta check box para permitir a reprodução das nuvens clássicas mais velhas do [SECOND_LIFE], além das nuvens WindLight.
- </notification>
- <notification name="HelpWaterFogColor">
- Escolhe a cor da neblina subaquática.
- </notification>
- <notification name="HelpWaterFogDensity">
- Controla a densidade da neblina da água e a distância de visibilidade debaixo d&apos;água.
- </notification>
- <notification name="HelpUnderWaterFogMod">
- Modifica o efeito do expoente de densidade de Neblina para controlar até onde você pode ver quando o seu avatar está imerso.
- </notification>
- <notification name="HelpWaterGlow">
- Controla o quanto a superfície da água deve brilhar.
- </notification>
- <notification name="HelpWaterNormalScale">
- Controla o escalonamento das três marolas que compõem a água.
- </notification>
- <notification name="HelpWaterFresnelScale">
- Controla o quanto de luz será refletido por ângulos diferentes.
- </notification>
- <notification name="HelpWaterFresnelOffset">
- Controla o quanto da intensidade da luz é refletida.
- </notification>
- <notification name="HelpWaterScaleAbove">
- Controla o quanto de luz será refratado olhando acima da superfície da água.
- </notification>
- <notification name="HelpWaterScaleBelow">
- Controla o quanto de luz sera refratado visto debaixo da superfície da água.
- </notification>
- <notification name="HelpWaterBlurMultiplier">
- Controla como ondas e reflexos são misturados.
- </notification>
- <notification name="HelpWaterNormalMap">
- Controla o mapeamento normal em todos os níveis da água para determinar reflexões / refrações.
- </notification>
- <notification name="HelpWaterWave1">
- Controla aonde e com que velocidade a versão em escala maior do mapa normal se move nas direções X e Y .
- </notification>
- <notification name="HelpWaterWave2">
- Controla onde e a velocidade com que o mapa normal em escala menor se move nas direções X e Y.
- </notification>
<notification name="NewSkyPreset">
Me dê o nome para o novo céu.
<form name="form">
@@ -2318,35 +1958,33 @@ Similar ao azimute.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="Cannot_Purchase_an_Attachment">
- Os itens não podem ser comprados enquanto forem parte de um anexo.
+ Objetos não podem ser adquiridos quando estão anexados.
</notification>
<notification label="Sobre o pedido de Permissão de Débito" name="DebitPermissionDetails">
Conceder esse pedido dá permissão ao script para tirar Linden dólares (L$) de sua conta. Para revogar esta permissão, o proprietário do objeto deve excluir o objeto ou resetar os scripts dele.
<usetemplate name="okbutton" yestext="OK"/>
</notification>
<notification name="AutoWearNewClothing">
- Você gostaria de vestir automaticamente o item de vestuário que você criar?
- <usetemplate ignoretext="Automaticamente vestir novo vestuário" name="okcancelignore" notext="Não" yestext="Sim"/>
+ Vestir automaticamente a roupa que você vai criar?
+ <usetemplate ignoretext="Vestir as roupas que eu criar enquanto edito minha aparência" name="okcancelignore" notext="Não" yestext="Sim"/>
</notification>
<notification name="NotAgeVerified">
- Você precisa ter a idade verificada para acessar este lote.
-Gostaria de visitar o site do [SECOND_LIFE] para verificação de idade?
+ Ãrea restrita a residentes com idade comprovada. Deseja ir ao site do [SECOND_LIFE] para comprovar sua idade?
[_URL]
<url name="url" option="0">
https://secondlife.com/account/verification.php?lang=pt
</url>
- <usetemplate ignoretext="Alertar sobre a falta de verificação de idade" name="okcancelignore" notext="Não" yestext="Sim"/>
+ <usetemplate ignoretext="Ainda não comprovei minha idade" name="okcancelignore" notext="Não" yestext="Sim"/>
</notification>
<notification name="Cannot enter parcel: no payment info on file">
- Este lote exige que você tenha informações de pagamento no arquivo antes de poder acessá-lo.
-Gostaria de visitar o site do [SECOND_LIFE] para configurá-lo?
+ Ãrea restrita a residentes que já cadastraram seus dados de pagamento Deseja ir ao site do [SECOND_LIFE] para cuidar disso?
[_URL]
<url name="url" option="0">
https://secondlife.com/account/index.php?lang=pt
</url>
- <usetemplate ignoretext="Avisar sobre a falta de informação de pagamento." name="okcancelignore" notext="Não" yestext="Sim"/>
+ <usetemplate ignoretext="Ainda não tenho cadastro de pagamento" name="okcancelignore" notext="Não" yestext="Sim"/>
</notification>
<notification name="MissingString">
A sequência [STRING_NAME] está faltando do strings.xml
@@ -2354,6 +1992,9 @@ Gostaria de visitar o site do [SECOND_LIFE] para configurá-lo?
<notification name="SystemMessageTip">
[MESSAGE]
</notification>
+ <notification name="IMSystemMessageTip">
+ [MESSAGE]
+ </notification>
<notification name="Cancelled">
Cancelado
</notification>
@@ -2376,12 +2017,17 @@ Gostaria de visitar o site do [SECOND_LIFE] para configurá-lo?
[FIRST] [LAST] está Offline
</notification>
<notification name="AddSelfFriend">
- Você não pode adicionar a si mesmo como amigo
+ Você é o máximo! Mesmo assim, não dá para adicionar a si mesmo(a) como amigo(a).
</notification>
<notification name="UploadingAuctionSnapshot">
Fazendo o upload das fotos do site da web e do mundo...
(Leva cerca de 5 minutos)
</notification>
+ <notification name="UploadConfirmation">
+ O upload custa L$ [AMOUNT].
+Deseja continuar?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="Upload"/>
+ </notification>
<notification name="UploadPayment">
Você paga L$[AMOUNT] para fazer o upload.
</notification>
@@ -2395,11 +2041,10 @@ Gostaria de visitar o site do [SECOND_LIFE] para configurá-lo?
Feito o download de Terrain.raw
</notification>
<notification name="GestureMissing">
- O Gesto [NAME] não se encontra na base de dados
+ O gesto [NAME] não está no banco de dados.
</notification>
<notification name="UnableToLoadGesture">
- Impossível de carregar o gesto [NAME].
-Por favor, tente novamente.
+ Falhar ao carregar o gesto [NAME].
</notification>
<notification name="LandmarkMissing">
O landmark foi perdido na base de dados
@@ -2408,14 +2053,14 @@ Por favor, tente novamente.
Impossível carregar o landmark. Por favor, tente de novo.
</notification>
<notification name="CapsKeyOn">
- Seu botão CAPS LOCK está ativado.
-Como isto afeta a senha digitada, você provavelmente desejará desativá-lo.
+ A tecla Maiúsc. está ligada.
+Ela pode afetar a digitação da senha.
</notification>
<notification name="NotecardMissing">
Notecard foi perdido no banco de dados.
</notification>
<notification name="NotecardNoPermissions">
- Permissões insuficientes para visualizar o notecard
+ Você não está autorizado a ler esta nota.
</notification>
<notification name="RezItemNoPermissions">
Sem permissões suficientes para criar objetos.
@@ -2453,11 +2098,11 @@ Por favor, tente novamente.
Por favor, tente novamente.
</notification>
<notification name="CannotBuyObjectsFromDifferentOwners">
- Impossível comprar objetos de diferentes compradores ao mesmo tempo.
-Por favor, compre apenas um objeto.
+ Só dá para comprar objetos de um dono por vez.
+Selecione só um objeto.
</notification>
<notification name="ObjectNotForSale">
- Este objeto não está a venda.
+ Este objeto não está à venda.
</notification>
<notification name="EnteringGodMode">
Entrando em god mode, nível [LEVEL]
@@ -2466,10 +2111,10 @@ Por favor, compre apenas um objeto.
Saindo do god mode, nível [LEVEL]
</notification>
<notification name="CopyFailed">
- A cópia falhou porque você não tem permissão para copiar.
+ Você não está autorizado a copiar isso.
</notification>
<notification name="InventoryAccepted">
- [NAME] aceitou sua oferta de inventário.
+ [NAME] recebeu sua oferta de inventário.
</notification>
<notification name="InventoryDeclined">
[NAME] rejeitou sua oferta de inventário.
@@ -2484,12 +2129,14 @@ Por favor, compre apenas um objeto.
Seu cartão de visita foi negado.
</notification>
<notification name="TeleportToLandmark">
- Agora que você chegou à mainland, você pode se teletransportar para locais como &apos;[NAME]&apos; clicando no botão de Inventário, no canto direito inferior de sua tela, e selecionando a pasta Landmarks.
-Dê um duplo-clique na landmark e clique Teletransportar para viajar para o local desejado.
+ Para se teletransportar para lugares como &apos;[NAME]&apos;, abra o painel &apos;Lugares&apos; à direita da tela e selecione a guia Marcos.
+Basta clicar em qualquer marco e depois clicar em &apos;Teletransportar&apos; na parte inferior da tela.
+(Também é possível clicar duas vezes no marco, ou clicar no marco com o botão direito e selecionar &apos;Teletransportar&apos;.)
</notification>
<notification name="TeleportToPerson">
- Agora que você chegou à mainland, você pode contatar residentes como &apos;[NAME]&apos; clicando no botão de Inventário, canto direito inferior de sua tela, e selecionando a pasta Cartões de Visita.
-Dê um duplo-clique num cartão de visita e em Mensagem Instantânea, digite sua mensagem.
+ Para entrar em contato com residentes como &apos;&apos;[NAME]&apos;, abra o painel &apos;Pessoas&apos; à direita da tela.
+Selecione o residente da lista e clique em &apos;MI&apos; na parte de baixo do painel.
+(Também é possível clicar duas vezes no nome, ou clicar no nome com o botão direito e selecionar &apos;MI&apos;.)
</notification>
<notification name="CantSelectLandFromMultipleRegions">
Impossível selecionar terra nas fronteiras do servidor. Tente selecionar um pedaço menor de terra.
@@ -2511,6 +2158,9 @@ Dê um duplo-clique num cartão de visita e em Mensagem Instantânea, digite sua
<notification name="SystemMessage">
[MESSAGE]
</notification>
+ <notification name="PaymentRecived">
+ [MESSAGE]
+ </notification>
<notification name="EventNotification">
Notificação de evento:
@@ -2533,8 +2183,20 @@ Dê um duplo-clique num cartão de visita e em Mensagem Instantânea, digite sua
[NAMES]
</notification>
<notification name="NoQuickTime">
- O software QuickTime da Apple parece não estar instalado em seu sistema.
-Se você deseja ver fluxo de mídia em terrenos que aceitem isso, você deverá ir ao site do QickTime (http://www.apple.com/quicktime) e instalar o player do QuickTime.
+ Aparentemente o QuickTime da Apple ainda não foi instalado no seu computador.
+Para ver mídia em stream nas regiões que oferecem esse formato, vá ao [http://www.apple.com/quicktime site do QuickTime] e instale o QuickTime Player.
+ </notification>
+ <notification name="NoPlugin">
+ Nenhum plugin de mídia detectado para lidar com o tipo de mime &quot;[MIME_TYPE]&quot;. Este tipo de mídia não poderão ser acessados.
+ </notification>
+ <notification name="MediaPluginFailed">
+ Falha no plugin de mídia abaixo:
+ [PLUGIN]
+
+Instale o plugin novamente ou contate o fabricante se o problema persistir.
+ <form name="form">
+ <ignore name="ignore" text="Falha do plugin de mídia"/>
+ </form>
</notification>
<notification name="OwnedObjectsReturned">
Os objetos que lhe pertencem no lote selecionado do terreno, voltaram ao seu inventário.
@@ -2543,7 +2205,7 @@ Se você deseja ver fluxo de mídia em terrenos que aceitem isso, você deverá
Os objetos no lote selecionado de terra que pertence a [FIRST] [LAST], voltaram ao seu inventário.
</notification>
<notification name="OtherObjectsReturned2">
- Os objetos no lote de terra selecionado que pertence ao residente &apos;[NAME]&apos;, voltaram aos seus donos.
+ Os objetos no lote selecionado, do residente [NAME], foram devolidos ao proprietãrio.
</notification>
<notification name="GroupObjectsReturned">
Os objetos no lote selecionado de terreno compartilhado pelo grupo [GROUPNAME], voltaram para os inventários de seus donos.
@@ -2553,23 +2215,26 @@ Objetos não transferíveis dados ao grupo foram deletados.
<notification name="UnOwnedObjectsReturned">
Os objetos no lote selecionado que NÃO são seus, voltaram aos seus donos.
</notification>
+ <notification name="ServerObjectMessage">
+ Mensagem de [NAME]:
+&lt;nolink&gt;[MSG]&lt;/nolink&gt;
+ </notification>
<notification name="NotSafe">
- Esta terra permite que você sofra ataques.
-Você pode ser ferido aqui. Se você morrer, você será teletransportado à sua posição inicial.
+ A opção &apos;danos&apos; desta região está ativada.
+Você pode se dar mal aqui. Se você morrer, você será teletransportado de volta para seu início.
</notification>
<notification name="NoFly">
- Este terreno tem a opção Voar desabilitada.
-Ou seja, você não pode voar aqui.
+ Esta área desativou a opção de voar.
+Logo, não é possível voar aqui.
</notification>
<notification name="PushRestricted">
- Esta terra é “Não empurreâ€.
-Você não pode empurrar os outros, a não ser que seja o proprietário da terra.
+ Esta área não tolera empurrões. Não é possível empurrar os outros aqui, a não ser que você seja o proprietário.
</notification>
<notification name="NoVoice">
- O uso de voz está desabilitado nesta terra.
+ Esta área desativou o bate-papo de voz. Você não vai ouvir ninguém falar.
</notification>
<notification name="NoBuild">
- Este terreno tem a opção de construir desabilitada, ou seja, você não pode criar objetos aqui.
+ Esta área desativou a opção de construir. Não é possível construir ou fazer rez de objetos nesta área.
</notification>
<notification name="ScriptsStopped">
Um administrador não permitiu scripts temporariamente nesta região.
@@ -2578,10 +2243,12 @@ Você não pode empurrar os outros, a não ser que seja o proprietário da terra
Esta região não roda nenhum script.
</notification>
<notification name="NoOutsideScripts">
- Neste terreno, nenhum script funcionará, a não ser os scripts do próprio dono da terra.
+ Esta região não permite scripts de fora.
+
+Os únicos scripts que funcionam são os do proprietário do terreno.
</notification>
<notification name="ClaimPublicLand">
- Pode apenas reclamar terreno público na região em que você está.
+ Você só pode reivindicar terrenos públicos na região onde você está.
</notification>
<notification name="RegionTPAccessBlocked">
Você não é permitido na Região devido à sua Classificação de maturidade. Você precisa validar sua idade e/ou instalar o último Visualizador.
@@ -2594,16 +2261,9 @@ Por favor, vá ao Banco de Conhecimento para detalhes sobre o acesso de áreas c
<notification name="NoTeenGridAccess">
Sua conta não pode conectar a esta região da grade teen.
</notification>
- <notification name="NoHelpIslandTP">
- Você não pode se tele-transportar de volta à Ilha de Ajuda.
-Vá para a Ilha de Ajuda Pública para repetir este tutorial.
- </notification>
<notification name="ImproperPaymentStatus">
Você não tem o status de pagamento adequado para entrar nesta região.
</notification>
- <notification name="MustGetAgeRegion">
- Você precisa ter sua idade verificada para entrar nesta região.
- </notification>
<notification name="MustGetAgeParcel">
Você precisa ter a idade verificada para entrar neste lote.
</notification>
@@ -2666,31 +2326,26 @@ Por favor, tente novamente em alguns instantes.
Nenhum lote válido foi encontrado.
</notification>
<notification name="ObjectGiveItem">
- Um objeto nomeado [OBJECTFROMNAME] do dono [FIRST] [LAST] deu a você [OBJECTTYPE] nomeado &apos;[OBJECTNAME]&apos;.
+ Um objeto chamado [OBJECTFROMNAME] de [NAME_SLURL] lhe deu [OBJECTTYPE]:
+[ITEM_SLURL]
<form name="form">
<button name="Keep" text="Segure"/>
<button name="Discard" text="Descarte"/>
- <button name="Mute" text="Mudo"/>
- </form>
- </notification>
- <notification name="ObjectGiveItemUnknownUser">
- Um objeto nomeado [OBJECTFROMNAME], de dono desconhecido, deu a você um [OBJECTTYPE] nomeado [OBJECTNAME].
- <form name="form">
- <button name="Keep" text="Segure"/>
- <button name="Discard" text="Descarte"/>
- <button name="Mute" text="Mudo"/>
+ <button name="Mute" text="Bloquear"/>
</form>
</notification>
<notification name="UserGiveItem">
- [NAME]deu a voce um [OBJECTTYPE] nomeado &apos;[OBJECTNAME]&apos;.
+ [NAME_SLURL] lhe deu [OBJECTTYPE]:
+[ITEM_SLURL]
<form name="form">
- <button name="Keep" text="Mantenha"/>
+ <button name="Show" text="Mostrar"/>
<button name="Discard" text="Descarte"/>
- <button name="Mute" text="Mudo"/>
+ <button name="Mute" text="Bloquear"/>
</form>
</notification>
<notification name="GodMessage">
[NAME]
+
[MESSAGE]
</notification>
<notification name="JoinGroup">
@@ -2702,14 +2357,17 @@ Por favor, tente novamente em alguns instantes.
</form>
</notification>
<notification name="TeleportOffered">
- [NAME] ofereceu um teletransporte para seu local:
+ [NAME_SLURL] quer teletransportar você para a região deles:
-[MESSAGE]
+[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
<form name="form">
<button name="Teleport" text="Teletransporte"/>
<button name="Cancel" text="Cancelar"/>
</form>
</notification>
+ <notification name="TeleportOfferSent">
+ Oferta de teletransporte enviada para [TO_NAME]
+ </notification>
<notification name="GotoURL">
[MESSAGE]
[URL]
@@ -2719,16 +2377,19 @@ Por favor, tente novamente em alguns instantes.
</form>
</notification>
<notification name="OfferFriendship">
- [NAME] está lhe oferecendo sua amizade
+ [NAME_SLURL] quer a sua amizade.
[MESSAGE]
-(Por definição vocês serão capazes de ver um ao outro online)
+Cada um pode ver o status do outro (definição padrão).
<form name="form">
<button name="Accept" text="Aceitar"/>
<button name="Decline" text="Recusar"/>
</form>
</notification>
+ <notification name="FriendshipOffered">
+ Você convidou [TO_NAME] para ser seu amigo(a)
+ </notification>
<notification name="OfferFriendshipNoMessage">
[NAME] está lhe oferecendo sua amizade.
@@ -2744,21 +2405,27 @@ Por favor, tente novamente em alguns instantes.
<notification name="FriendshipDeclined">
[NAME] recusou seu convite de amizade
</notification>
+ <notification name="FriendshipAcceptedByMe">
+ Oferta de amizada aceita.
+ </notification>
+ <notification name="FriendshipDeclinedByMe">
+ Oferta de amizada aceita.
+ </notification>
<notification name="OfferCallingCard">
- [FIRST] [LAST] está oferecendo seu cartão de visita.
-Isto adicionará uma anotação em seu inventário, de modo que você possa mandar rapidamente uma IM para este residente.
+ [FIRST] [LAST] estão te oferecendo um cartão de visita.
+Ele colocará um item de inventário, para você possa contatá-lo facilmente.
<form name="form">
<button name="Accept" text="Aceitar"/>
<button name="Decline" text="Recusar"/>
</form>
</notification>
<notification name="RegionRestartMinutes">
- A região será reiniciada em [MINUTES] minutos.
-Se permanecer nesta região, você será desconectado.
+ Esta região será reiniciada em [MINUTES] minutos.
+Se permanecer aqui, você será desconectado.
</notification>
<notification name="RegionRestartSeconds">
- Região será reiniciada em [SECONDS] segundos.
-Se permanecer nesta região, você será desconectado.
+ Esta região será reiniciada em [SECONDS] segundos.
+Se permanecer aqui, você será desconectado.
</notification>
<notification name="LoadWebPage">
Carregar página da web [URL]?
@@ -2777,8 +2444,11 @@ Do objeto: [OBJECTNAME], dono: [NAME]?
<notification name="FailedToFindWearable">
Falhou ao procurar [TYPE] nomeado [DESC] no banco de dados.
</notification>
+ <notification name="ShareToWebFailed">
+ Falha de upload da imagem na web.
+ </notification>
<notification name="InvalidWearable">
- O item que você está tentando vestir usa uma característica que seu Visualizador não lê. Por favor, atualize sua versão do [APP_NAME] para vestir este item.
+ O item que você está tentando usar tem um recurso que seu Visualizador não consegue ler. Atualize o [APP_NAME] para poder vestir esse item.
</notification>
<notification name="ScriptQuestion">
&apos;[OBJECTNAME]&apos;, um objeto pertencente a &apos;[NAME]&apos;, gostaria de:
@@ -2788,16 +2458,16 @@ Está OK?
<form name="form">
<button name="Yes" text="Sim"/>
<button name="No" text="Não"/>
- <button name="Mute" text="Mudo"/>
+ <button name="Mute" text="Bloquear"/>
</form>
</notification>
<notification name="ScriptQuestionCaution">
- &apos;[OBJECTNAME]&apos;, um objeto de &apos;[NAME]&apos;, gostaria de:
+ Um objeto chamado &apos;[OBJECTNAME]&apos;, de &apos;[NAME]&apos; gostaria de:
[QUESTIONS]
-Se você não confia neste objeto ou em seu criador, você deveria negar o pedido. Para informações adicionais clique no botão Detalhes.
+Se você não confia nos objetos deste autor, recuse-o.
-Autorizar este pedido?
+Deixar?
<form name="form">
<button name="Grant" text="Autorizar"/>
<button name="Deny" text="Negar"/>
@@ -2818,39 +2488,12 @@ Autorizar este pedido?
<button name="Ignore" text="Ignorar"/>
</form>
</notification>
- <notification name="FirstBalanceIncrease">
- Você recebeu uma quantia de L$[AMOUNT].
-Objetos e outros usuários podem dar L$ a você.
-Seu saldo é mostrado no canto superior direito da tela.
- </notification>
- <notification name="FirstBalanceDecrease">
- Você pagou L$[AMOUNT].
-O seu balanço de dinheiro está sendo mostrado no canto superior direito da tela.
- </notification>
- <notification name="FirstSit">
- Você está sentado.
-Use as setas (ou AWSD) para mudar a visão.
-Clique em &apos;Levantar&apos; para levantar.
- </notification>
- <notification name="FirstMap">
- Clique e arraste para movimentar o mapa.
-Dê um duplo clique para teletransportar-se.
-Use os controles à direita para achar coisas e mostrar fundos diferentes.
- </notification>
- <notification name="FirstBuild">
- Você pode construir novos objetos em algumas áreas do [SECOND_LIFE].
-Use as ferramentas acima, à esquerda para construir e tente manter apertadas as teclas Ctrl ou Alt para mudar rapidamente as ferramentas.
-Aperte ESC para parar de construir.
- </notification>
- <notification name="FirstLeftClickNoHit">
- Clicando com esquerdo, você interage com os objetos especiais.
-Se o ponteiro do mouse mudar a uma mão, você pode interagir com o objeto.
-Clique com o direito que será mostrado sempre um menu das ações que você pode fazer.
- </notification>
- <notification name="FirstTeleport">
- Esta região não permite teletransporte ponto-a-ponto. Assim, você foi teletransportado para o telehub mais próximo.
-Seu destino está assinalado com um farol alto.
-Siga a flecha vermelha até o farol, ou clique nela para apagar o farol.
+ <notification name="BuyLindenDollarSuccess">
+ Obrigado e volte sempre!
+
+Seu saldo L$ será atualizado findo o processamento da transação. Se o processamento levar mais de 20 min, a transação pode vir a ser cancelada. Neste caso, o valor da compra será creditado ao seu saldo em US$.
+
+Para checar o status do pagamento, consulte seu Histórico de transações no [http://secondlife.com/account/ Painel]
</notification>
<notification name="FirstOverrideKeys">
Suas chaves do movimento estão sendo seguras agora por um objeto.
@@ -2858,88 +2501,57 @@ Tente as teclas de setas ou AWSD para ver o que elas fazem.
Alguns objetos (como armas) requerem que você passe para mouselook para usá-los.
Pressione &apos;M&apos; para fazer isto.
</notification>
- <notification name="FirstAppearance">
- Você está editando sua aparência.
-Para girar e ver em zoom, use as teclas de setas.
-Quando terminar, aperte &apos;Salvar Tudo&apos; para salvar sua aparência e sair.
-Você pode editar sua aparência quantas vezes quiser.
- </notification>
- <notification name="FirstInventory">
- Este é o seu inventário, que contém objetos, notecards, roupas e outras coisas suas.
-* Para vestir um objeto ou uma pasta completa, arraste-o para si mesmo(a).
-* Para trzer um objeto ao mundo, arraste-o ao chão.
-* Para ler um notecard, dê um duplo-click nele.
- </notification>
<notification name="FirstSandbox">
- Esta é a região conhecida como sandbox.
-Os objetos que você constrói aqui podem ser deletados depois que você deixa a área.
-As sandboxes são limpas de forma periódica.
-Por favor, veja a informação no alto da tela, próxima ao nome da região.
-As regiões de sandbox não são comuns e são marcadas com símbolos.
- </notification>
- <notification name="FirstFlexible">
- Este objeto tem a propriedade flexível.
-Objetos flexíveis não podem ser físicos e devem ser fantasmas até que a caixa de verificação seja desmarcada.
- </notification>
- <notification name="FirstDebugMenus">
- Você ativou o menu Avançado.
-Este menu contém funcionalidades úteis para desenvolvedores debugarem o [SECOND_LIFE].
-Para mostrar esse menu no Windows pressione Ctrl+Alt+D. No Mac pressione &#8997;&#8984;D.
- </notification>
- <notification name="FirstSculptedPrim">
- Você está editando uma primitiva esculpida.
-Primitivas esculpidas requerem uma textura especial para especificar suas formas.
-Você encontrará exemplos dessas texturas na Biblioteca do Inventário.
- </notification>
- <notification name="FirstMedia">
- Você começou a tocar uma mídia. Mídias podem ser autorizadas a iniciar automaticamente se você assim escolher na janela de Preferências, sob Ãudio/Vídeo. Atente para o risco de segurança que pode haver ao acessar websites de mídia que você não confia.
+ Este é um sandbox, uma área onde residentes podem aprender a construir.
+
+Qualquer objeto deixado aqui será apagado quando você sair. Não se esqueça de clicar duas vezes e selecionar &apos;Pegar&apos; para levar seu projeto para o seu inventário.
</notification>
<notification name="MaxListSelectMessage">
Você pode selecionar até [MAX_SELECT] itens desta lista.
</notification>
<notification name="VoiceInviteP2P">
- [NAME] está lhe convidando para uma conversa com voz.
-Clique Aceitar para atender, ou Recusar para recusar o convite. Clique Mudo para calar quem está chamando.
+ [NAME] está te convidando para um bate-papo de voz.
+Clique em Aceitar para atender ou em Recusar para recusar este convite. Clique em Bloquear para bloquear ligações deste avatar.
<form name="form">
<button name="Accept" text="Aceitar"/>
<button name="Decline" text="Recusar"/>
- <button name="Mute" text="Mudo"/>
+ <button name="Mute" text="Bloquear"/>
</form>
</notification>
<notification name="AutoUnmuteByIM">
- [FIRST] [LAST] recebeu uma Mensagem Instantânea sua e automaticamente não está mais no modo mudo.
+ [FIRST] [LAST] recebeu uma MI e foi desbloqueado(a) automaticamente.
</notification>
<notification name="AutoUnmuteByMoney">
- [FIRST] [LAST] recebeu pagamento seu e automaticamente não está mais no modo mudo.
+ [FIRST] [LAST] recebeu dinheiro e foi desbloqueado(a) automaticamente.
</notification>
<notification name="AutoUnmuteByInventory">
- [FIRST] [LAST] recebeu inventário seu e automaticamente não está mais mudo.
+ [FIRST] [LAST] recebeu dinheiro e foi desbloqueado(a) automaticamente.
</notification>
<notification name="VoiceInviteGroup">
- [NAME] juntou-se a uma conversa com voz do grupo [GROUP].
-Clique Aceitar para atender, ou Recusar para recusar o convite. Clique Mudo para calar quem está chamando.
+ [NAME] atendeu uma ligação de bate-papo de voz com o grupo [GROUP].
+Clique em Aceitar para atender ou em Recusar para recusar este convite. Clique em Bloquear para bloquear ligações deste avatar.
<form name="form">
<button name="Accept" text="Aceitar"/>
<button name="Decline" text="Recusar"/>
- <button name="Mute" text="Mudo"/>
+ <button name="Mute" text="Bloquear"/>
</form>
</notification>
<notification name="VoiceInviteAdHoc">
- [NAME] juntou-se a uma chamada de Conferência com voz...
-Clique Aceitar para juntar-se à chamada ou Recusar para recusar o convite. Clique Mudo para calar este usuário.
+ [NAME] atendeu uma ligação de teleconferência.
+Clique em Aceitar para atender ou em Recusar para recusar este convite. Clique em Bloquear para bloquear ligações deste avatar.
<form name="form">
<button name="Accept" text="Aceitar"/>
<button name="Decline" text="Recusar"/>
- <button name="Mute" text="Mudo"/>
+ <button name="Mute" text="Bloquear"/>
</form>
</notification>
<notification name="InviteAdHoc">
- [NAME] está lhe convidando para uma conversa em conferência...
- Clique Aceitar para se juntar à conversa, ou Recusar para recusar o convite. Clique Mudo para calar este usuário.
+ [NAME] está te convidando para uma teleconferência de bate-papo.
+Clique em Aceitar para atender ou em Recusar para recusar este convite. Clique em Bloquear para bloquear ligações deste avatar.
<form name="form">
<button name="Accept" text="Aceitar"/>
<button name="Decline" text="Recusar"/>
- <button name="Mute" text="Mudo"/>
+ <button name="Mute" text="Bloquear"/>
</form>
</notification>
<notification name="VoiceChannelFull">
@@ -2949,25 +2561,40 @@ Clique Aceitar para juntar-se à chamada ou Recusar para recusar o convite. Cliq
Desculpe-nos. Esta área atingiu seu limite de capacidade para conversas com voz. Favor tentar usar voz em outra área.
</notification>
<notification name="VoiceChannelDisconnected">
- Você foi desconectado de [VOICE_CHANNEL_NAME]. Voce será reconectado agora à Conversa com voz local.
+ Você saiu da ligação com [VOICE_CHANNEL_NAME]. Agora você será reconectado ao bate-papo local.
</notification>
<notification name="VoiceChannelDisconnectedP2P">
- [VOICE_CHANNEL_NAME] desligou a chamada. Voce será reconectado agora à Conversa com voz local.
+ [VOICE_CHANNEL_NAME] encerrou a ligação. Agora você será reconectado ao bate-papo local.
</notification>
<notification name="P2PCallDeclined">
- [VOICE_CHANNEL_NAME] recusou sua chamada. Voce será reconectado agora à Conversa com voz local.
+ [VOICE_CHANNEL_NAME] recusou a ligação. Agora você será reconectado ao bate-papo local.
</notification>
<notification name="P2PCallNoAnswer">
- [VOICE_CHANNEL_NAME] não está disponível para aceitar sua chamada. Voce será reconectado agora à Conversa com voz local.
+ [VOICE_CHANNEL_NAME] não está disponível para atender sua ligação. Agora você será reconectado ao bate-papo local.
</notification>
<notification name="VoiceChannelJoinFailed">
- Falha na conexão com [VOICE_CHANNEL_NAME], tente novamente mais tarde. Voce será reconectado agora à Conversa com voz local.
+ Falha de conexão com [VOICE_CHANNEL_NAME]. Tente novamente mais tarde. Agora você será reconectado ao bate-papo local.
</notification>
<notification name="VoiceLoginRetry">
Estamos criando uma canal de voz para você. Isto pode levar até um minuto.
</notification>
+ <notification name="VoiceEffectsExpired">
+ Um ou mais serviços de distorção de voz que você assinou veceu.
+[[URL] Clique aqui] para renovar o serviço.
+ </notification>
+ <notification name="VoiceEffectsExpiredInUse">
+ A Distorção de voz ativa expirou. Suas configurações de voz padrão foram ativadas.
+[[URL] Clique aqui] para renovar o serviço.
+ </notification>
+ <notification name="VoiceEffectsWillExpire">
+ Uma ou mais das suas distorções de voz tem vencimento em menos de [INTERVAL] dias.
+[[URL] Clique aqui] para renovar o serviço.
+ </notification>
+ <notification name="VoiceEffectsNew">
+ Novas Distorções de voz!
+ </notification>
<notification name="Cannot enter parcel: not a group member">
- Você não pode entrar nessa terra, você não é membro do grupo autorizado.
+ Só membros de um grupo podem acessar esta área.
</notification>
<notification name="Cannot enter parcel: banned">
Você não pode entrar nessa terra, você foi banido.
@@ -2982,18 +2609,152 @@ Clique Aceitar para juntar-se à chamada ou Recusar para recusar o convite. Cliq
Ocorreu um erro enquanto você tentava se conectar à conversa de voz de [VOICE_CHANNEL_NAME]. Favor tentar novamente mais tarde.
</notification>
<notification name="ServerVersionChanged">
- A região em que você entrou está rodando uma versão diferente de simulador. Clique aqui para mais detalhes.
+ Você chegou a uma região com uma versão diferente de servidor, que pode afetar o desempenho. [[URL] Consultar notas da versão.]
+ </notification>
+ <notification name="UnsupportedCommandSLURL">
+ O SLurl no qual você clicou não é suportado.
+ </notification>
+ <notification name="BlockedSLURL">
+ Um SLurl recebido de um navegador inidôneo foi bloqueado para a sua segurança.
+ </notification>
+ <notification name="ThrottledSLURL">
+ Vários SLurls foram recebidos de um navegador inidôneo em pouco tempo.
+Para sua segurança, os SLurls serão bloqueados por alguns instantes.
+ </notification>
+ <notification name="IMToast">
+ [MESSAGE]
+ <form name="form">
+ <button name="respondbutton" text="Responder"/>
+ </form>
+ </notification>
+ <notification name="ConfirmCloseAll">
+ Tem certeza de que quer fechar todas as MIs?
+ <usetemplate ignoretext="Confirmar antes de fechar todas as MIs" name="okcancelignore" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="AttachmentSaved">
+ Anexo salvo.
+ </notification>
+ <notification name="UnableToFindHelpTopic">
+ Nenhum tópico de ajuda foi encontrado com relação a este elemento.
+ </notification>
+ <notification name="ObjectMediaFailure">
+ Erro do servidor: Falha ao atualizar ou executar a mídia.
+&apos;[ERROR]&apos;
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="TextChatIsMutedByModerator">
+ Seu texto de bate-papo foi silenciado pelo moderador.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="VoiceIsMutedByModerator">
+ Sua voz foi silenciada pelo moderador.
+ <usetemplate name="okbutton" yestext="OK"/>
+ </notification>
+ <notification name="ConfirmClearTeleportHistory">
+ Tem certeza que deseja apagar todo o seu histórico de teletransporte?
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="BottomTrayButtonCanNotBeShown">
+ O botão selecionado não pode ser exibido no momento.
+O botão será exibido quando houver espaço suficente.
+ </notification>
+ <notification name="ShareNotification">
+ Selecione os residentes com quem compartilhar.
+ </notification>
+ <notification name="ShareItemsConfirmation">
+ Tem certeza de que quer compartilhar os items abaixo?
+
+[ITENS]
+
+Com os seguintes residentes:
+
+[RESIDENTS]
+ <usetemplate name="okcancelbuttons" notext="Cancelar" yestext="OK"/>
+ </notification>
+ <notification name="ItemsShared">
+ Itens compartilhados.
+ </notification>
+ <notification name="DeedToGroupFail">
+ Ocorreu uma falha durante a doação ao grupo.
+ </notification>
+ <notification name="AvatarRezNotification">
+ ( [EXISTENCE] segundos de vida )
+O avatar de &apos;[NAME]&apos; emergiu em [TIME] segundos.
</notification>
- <notification name="UnableToOpenCommandURL">
- A URL que vocÊ clicou não pode ser aberta no navegador web.
+ <notification name="AvatarRezSelfBakedDoneNotification">
+ ( [EXISTENCE] segundos de vida )
+Você confeccionou seu look em [TIME] segundos.
+ </notification>
+ <notification name="AvatarRezSelfBakedUpdateNotification">
+ ( [EXISTENCE] segundos de vida )
+Você enviou uma atualização da sua aparência em [TIME] segundos.
+[STATUS]
+ </notification>
+ <notification name="AvatarRezCloudNotification">
+ ( [EXISTENCE] segundos de vida )
+Avatar &apos;[NAME]&apos; transformou-se em nuvem.
+ </notification>
+ <notification name="AvatarRezArrivedNotification">
+ ( [EXISTENCE] segundos de vida )
+Avatar &apos;[NAME]&apos; surgiu.
+ </notification>
+ <notification name="AvatarRezLeftCloudNotification">
+ ( [EXISTENCE] segundos de vida )
+O avatar de &apos;[NAME]&apos; transformou-se em nuvem depois de [TIME] segundos.
+ </notification>
+ <notification name="AvatarRezEnteredAppearanceNotification">
+ ( [EXISTENCE] segundos de vida )
+Avatar &apos;[NAME]&apos; entrou no modo aparência.
+ </notification>
+ <notification name="AvatarRezLeftAppearanceNotification">
+ ( [EXISTENCE] segundos de vida )
+Avatar &apos;[NAME]&apos; sair do modo aparecer.
+ </notification>
+ <notification name="NoConnect">
+ Detectamos um problema de conexão com [PROTOCOL] [HOSTID].
+Verifique a configuração da sua rede e firewall.
+ <form name="form">
+ <button name="OK" text="OK"/>
+ </form>
+ </notification>
+ <notification name="NoVoiceConnect">
+ Estamos tendo problemas de conexão com o seu servidor de voz:
+
+[HOSTID]
+
+Talvez não seja possível se comunicar via voz.
+Verifique a configuração da sua rede e firewall.
+ <form name="form">
+ <button name="OK" text="OK"/>
+ </form>
+ </notification>
+ <notification name="AvatarRezLeftNotification">
+ ( [EXISTENCE] segundos de vida )
+Avatar &apos;[NAME]&apos; saiu totalmente carregado.
+ </notification>
+ <notification name="AvatarRezSelfBakeNotification">
+ ( [EXISTENCE] segundos de vida )
+Você carregou uma textura com [RESOLUTION] para o(a) &apos;[BODYREGION]&apos; em [TIME] segundos.
+ </notification>
+ <notification name="ConfirmLeaveCall">
+ Tem certeza de que quer sair desta ligação?
+ <usetemplate ignoretext="Confirmar antes de deixar ligação" name="okcancelignore" notext="Não" yestext="Sim"/>
+ </notification>
+ <notification name="ConfirmMuteAll">
+ Você silenciou todos os participantes de uma ligação de grupo.
+Todos os demais residentes que entrarem na ligação mais tarde também serão silenciados, mesmo se você sair da ligação.
+
+
+Silenciar todos?
+ <usetemplate ignoretext="Confirmar antes de silenciar todos os participantes em ligações de grupo." name="okcancelignore" notext="Cancelar" yestext="OK"/>
</notification>
<global name="UnsupportedCPU">
- A velocidade da sua CPU não suporta os requisitos mínimos exigidos.
</global>
<global name="UnsupportedGLRequirements">
- Você não parece ter os requisitos de hardware recomendados para rodar o [APP_NAME]. O [APP_NAME] exige uma placa gráfica OpenGL que tem apoio a multi- texturas. Se este for o caso, você pode se certificar de que tem os drivers mais recentes para sua placa gráfica, e os patches e pacotes de serviços para seu sistema operacional.
+ Aparentemente a sua máquina não atende os requisitos de hardware do [APP_NAME]. [APP_NAME] requer placas de vídeo OpenGL com suporte a multitexturas. Se sua place de vídeo tiver este perfil, atualize o driver da placa de vídeo, assim como patches e service packs do sistema operacional.
-Se continuar com problemas, por favor visite: http://www.secondlife.com/support
+Se você continuar a receber esta mensagem, consulte o [SUPPORT_SITE].
</global>
<global name="UnsupportedCPUAmount">
796
@@ -3007,10 +2768,8 @@ Se continuar com problemas, por favor visite: http://www.secondlife.com/support
<global name="UnsupportedRAM">
- A memória do seu sistema não suporta os requisitos mínimos exigidos.
</global>
- <global name="PermYes">
- Sim
- </global>
- <global name="PermNo">
- Não
+ <global name="You can only set your &apos;Home Location&apos; on your land or at a mainland Infohub.">
+ Se você tem um terreno, seu terreno pode ser seu início.
+Outra opção é procurar por lugares com a tag &apos;Infohub&apos; no mapa.
</global>
</notifications>
diff --git a/indra/newview/skins/default/xui/pt/outfit_accordion_tab.xml b/indra/newview/skins/default/xui/pt/outfit_accordion_tab.xml
new file mode 100644
index 0000000000..b1ffa0d2e5
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/outfit_accordion_tab.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- *NOTE: mantipov: this xml is intended to be used inside panel_outfits_list.xml for each outfit folder-->
+<!-- All accordion tabs in the My Appearance/My Outfits panel will be created from this one at runtume-->
+<accordion_tab name="Mockup Tab" title="Guia Protótipo"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_active_object_row.xml b/indra/newview/skins/default/xui/pt/panel_active_object_row.xml
new file mode 100644
index 0000000000..73f6b2225f
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_active_object_row.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_activeim_row">
+ <string name="unknown_obj">
+ Objeto desconhecido
+ </string>
+ <text name="object_name">
+ Objeto sem nome
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_adhoc_control_panel.xml b/indra/newview/skins/default/xui/pt/panel_adhoc_control_panel.xml
new file mode 100644
index 0000000000..bd50d4953d
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_adhoc_control_panel.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="vertical_stack">
+ <layout_panel name="call_btn_panel">
+ <button label="Ligar" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Desligar" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Controles de voz" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/pt/panel_avatar_list_item.xml
new file mode 100644
index 0000000000..06d8823a74
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_avatar_list_item.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="avatar_list_item">
+ <string name="FormatSeconds">
+ [COUNT]s
+ </string>
+ <string name="FormatMinutes">
+ [COUNT]min
+ </string>
+ <string name="FormatHours">
+ [COUNT]h
+ </string>
+ <string name="FormatDays">
+ [COUNT]dias
+ </string>
+ <string name="FormatWeeks">
+ [COUNT]semanas
+ </string>
+ <string name="FormatMonths">
+ [COUNT]meses
+ </string>
+ <string name="FormatYears">
+ [COUNT]anos
+ </string>
+ <text name="avatar_name" value="Desconhecido"/>
+ <button name="profile_btn" tool_tip="Ver perfil"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_block_list_sidetray.xml b/indra/newview/skins/default/xui/pt/panel_block_list_sidetray.xml
new file mode 100644
index 0000000000..c5f93d719a
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_block_list_sidetray.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="block_list_panel">
+ <text name="title_text">
+ Lista de bloqueados
+ </text>
+ <scroll_list name="blocked" tool_tip="Lista atual dos residentes bloqueados"/>
+ <button label="Bloquear residente..." label_selected="Bloquear residente..." name="Block resident..." tool_tip="Selecione o residente a bloquear"/>
+ <button label="Bloquear objeto por nome..." label_selected="Bloquear objeto por nome..." name="Block object by name..."/>
+ <button label="Desbloquear" label_selected="Desbloquear" name="Unblock" tool_tip="Remover residente ou objeto da lista dos bloqueados"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_body_parts_list_item.xml b/indra/newview/skins/default/xui/pt/panel_body_parts_list_item.xml
new file mode 100644
index 0000000000..de764d8025
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_body_parts_list_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="wearable_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_bodyparts_list_button_bar.xml b/indra/newview/skins/default/xui/pt/panel_bodyparts_list_button_bar.xml
new file mode 100644
index 0000000000..094a03553b
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_bodyparts_list_button_bar.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="clothing_list_button_bar_panel">
+ <button label="Trocar" name="switch_btn"/>
+ <button label="Comprar &gt;" name="bodyparts_shop_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_bottomtray.xml b/indra/newview/skins/default/xui/pt/panel_bottomtray.xml
new file mode 100644
index 0000000000..9fd7da55df
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_bottomtray.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray">
+ <string name="SpeakBtnToolTip" value="Liga e desliga o microfone"/>
+ <string name="VoiceControlBtnToolTip" value="Mostra/oculta os controles de voz"/>
+ <layout_stack name="toolbar_stack">
+ <layout_panel name="speak_panel">
+ <talk_button name="talk">
+ <speak_button label="Falar" label_selected="Falar" name="speak_btn"/>
+ </talk_button>
+ </layout_panel>
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="Gesto" name="Gesture" tool_tip="Mostra/oculta os gestos"/>
+ </layout_panel>
+ <layout_panel name="movement_panel">
+ <button label="Movimentar" name="movement_btn" tool_tip="Mostra/oculta os controles de movimento"/>
+ </layout_panel>
+ <layout_panel name="cam_panel">
+ <button label="Exibir" name="camera_btn" tool_tip="Mostra/oculta os controles da câmera"/>
+ </layout_panel>
+ <layout_panel name="snapshot_panel">
+ <button label="" name="snapshots" tool_tip="Tirar foto"/>
+ </layout_panel>
+ <layout_panel name="sidebar_btn_panel">
+ <button label="Barra lateral" name="sidebar_btn" tool_tip="Mostra/oculta a barra lateral"/>
+ </layout_panel>
+ <layout_panel name="build_btn_panel">
+ <button label="Construir" name="build_btn" tool_tip="Mostra/oculta ferramentas de Construção"/>
+ </layout_panel>
+ <layout_panel name="search_btn_panel">
+ <button label="Busca" name="search_btn" tool_tip="Mostra/oculta os gestos"/>
+ </layout_panel>
+ <layout_panel name="world_map_btn_panel">
+ <button label="Mapa" name="world_map_btn" tool_tip="Mostra/oculta o Mapa Múndi"/>
+ </layout_panel>
+ <layout_panel name="mini_map_btn_panel">
+ <button label="Mini Mapa" name="mini_map_btn" tool_tip="Mostra/oculta o Mini Mapa"/>
+ </layout_panel>
+ <layout_panel name="im_well_panel">
+ <chiclet_im_well name="im_well">
+ <button name="Unread IM messages" tool_tip="Conversas"/>
+ </chiclet_im_well>
+ </layout_panel>
+ <layout_panel name="notification_well_panel">
+ <chiclet_notification name="notification_well">
+ <button name="Unread" tool_tip="Notificações"/>
+ </chiclet_notification>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_bottomtray_lite.xml b/indra/newview/skins/default/xui/pt/panel_bottomtray_lite.xml
new file mode 100644
index 0000000000..78d9826099
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_bottomtray_lite.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="bottom_tray_lite">
+ <layout_stack name="toolbar_stack_lite">
+ <layout_panel name="gesture_panel">
+ <gesture_combo_list label="Gesto" name="Gesture" tool_tip="Mostra/oculta os gestos"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_classified_info.xml b/indra/newview/skins/default/xui/pt/panel_classified_info.xml
new file mode 100644
index 0000000000..191c005b1a
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_classified_info.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_classified_info">
+ <panel.string name="l$_price">
+ L$ [PRICE]
+ </panel.string>
+ <panel.string name="click_through_text_fmt">
+ [TELEPORT] teletransporte, [MAP] mapa, [PROFILE] perfil
+ </panel.string>
+ <panel.string name="date_fmt">
+ [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
+ </panel.string>
+ <panel.string name="auto_renew_on">
+ Ativado
+ </panel.string>
+ <panel.string name="auto_renew_off">
+ Desativado
+ </panel.string>
+ <text name="title" value="Dados do anúncio"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text_editor name="classified_name" value="[name]"/>
+ <text name="classified_location_label" value="Localização:"/>
+ <text_editor name="classified_location" value="[loading...]"/>
+ <text name="content_type_label" value="Tipo de conteúdo:"/>
+ <text_editor name="content_type" value="[content type]"/>
+ <text name="category_label" value="Categoria:"/>
+ <text_editor name="category" value="[category]"/>
+ <text name="creation_date_label" value="Data de criação"/>
+ <text_editor name="creation_date" tool_tip="Data de criação" value="[date]"/>
+ <text name="price_for_listing_label" value="Preço do anúncio:"/>
+ <text_editor name="price_for_listing" tool_tip="Preço do anúncio." value="[price]"/>
+ <layout_stack name="descr_stack">
+ <layout_panel name="clickthrough_layout_panel">
+ <text name="click_through_label" value="Cliques:"/>
+ <text_editor name="click_through_text" tool_tip="Dados de click-through" value="[clicks]"/>
+ </layout_panel>
+ <layout_panel name="price_layout_panel">
+ <text name="auto_renew_label" value="Renovação automática:"/>
+ <text name="auto_renew" value="Ativado"/>
+ </layout_panel>
+ <layout_panel name="descr_layout_panel">
+ <text name="classified_desc_label" value="Descrição:"/>
+ <text_editor name="classified_desc" value="[description]"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <button label="Teletransportar" name="teleport_btn"/>
+ <button label="Mapa" name="show_on_map_btn"/>
+ <button label="Editar" name="edit_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_clothing_list_button_bar.xml b/indra/newview/skins/default/xui/pt/panel_clothing_list_button_bar.xml
new file mode 100644
index 0000000000..bfdc7290d2
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_clothing_list_button_bar.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="clothing_list_button_bar_panel">
+ <button label="Adicionar +" name="add_btn"/>
+ <button label="Comprar &gt;" name="clothing_shop_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_clothing_list_item.xml b/indra/newview/skins/default/xui/pt/panel_clothing_list_item.xml
new file mode 100644
index 0000000000..de764d8025
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_clothing_list_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="wearable_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_cof_wearables.xml b/indra/newview/skins/default/xui/pt/panel_cof_wearables.xml
new file mode 100644
index 0000000000..3e4b12b001
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_cof_wearables.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="cof_wearables">
+ <accordion name="cof_wearables_accordion">
+ <accordion_tab name="tab_attachments" title="Anexos"/>
+ <accordion_tab name="tab_clothing" title="Vestuário"/>
+ <accordion_tab name="tab_body_parts" title="Corpo"/>
+ </accordion>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_deletable_wearable_list_item.xml b/indra/newview/skins/default/xui/pt/panel_deletable_wearable_list_item.xml
new file mode 100644
index 0000000000..91d90a5660
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_deletable_wearable_list_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="deletable_wearable_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_dummy_clothing_list_item.xml b/indra/newview/skins/default/xui/pt/panel_dummy_clothing_list_item.xml
new file mode 100644
index 0000000000..6af84de0c7
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_dummy_clothing_list_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="dummy_clothing_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_alpha.xml b/indra/newview/skins/default/xui/pt/panel_edit_alpha.xml
new file mode 100644
index 0000000000..f8be9daf1b
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_alpha.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_alpha_panel">
+ <panel name="avatar_alpha_color_panel">
+ <texture_picker label="Alpha inferior" name="Lower Alpha" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Alpha de cima" name="Upper Alpha" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Cabeça Alpha" name="Head Alpha" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Olhos Alpha" name="Eye Alpha" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Cabelo alpha" name="Hair Alpha" tool_tip="Selecionar imagem"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_classified.xml b/indra/newview/skins/default/xui/pt/panel_edit_classified.xml
new file mode 100644
index 0000000000..f6fb223599
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_classified.xml
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Editar anúncio" name="panel_edit_classified">
+ <panel.string name="location_notice">
+ (salvar para atualizar)
+ </panel.string>
+ <string name="publish_label">
+ Publicar
+ </string>
+ <string name="save_label">
+ Salvar
+ </string>
+ <text name="title">
+ Editar anúncio
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="snapshot_panel">
+ <icon label="" name="edit_icon" tool_tip="Selecione uma imagem"/>
+ </panel>
+ <text name="Name:">
+ Cargo:
+ </text>
+ <text name="description_label">
+ Descrição:
+ </text>
+ <text name="location_label">
+ Localização:
+ </text>
+ <text name="classified_location">
+ Carregando...
+ </text>
+ <button label="Usar configuração local" name="set_to_curr_location_btn"/>
+ <text name="category_label" value="Categoria:"/>
+ <text name="content_type_label" value="Tipo de conteúdo:"/>
+ <icons_combo_box label="Público geral" name="content_type">
+ <icons_combo_box.item label="Moderado" name="mature_ci" value="Adulto"/>
+ <icons_combo_box.item label="Público geral" name="pg_ci" value="Adequado para menores"/>
+ </icons_combo_box>
+ <text name="price_for_listing_label" value="Preço do anúncio:"/>
+ <spinner label="L$" name="price_for_listing" tool_tip="Preço do anúncio" value="50"/>
+ <check_box label="Renovação automática semanal" name="auto_renew"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button label="[LABEL]" name="save_changes_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_eyes.xml b/indra/newview/skins/default/xui/pt/panel_edit_eyes.xml
new file mode 100644
index 0000000000..f21656d526
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_eyes.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_eyes_panel">
+ <panel name="avatar_eye_color_panel">
+ <texture_picker label="Ãris" name="Iris" tool_tip="Selecionar imagem"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="eyes_main_tab" title="Olhos"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_gloves.xml b/indra/newview/skins/default/xui/pt/panel_edit_gloves.xml
new file mode 100644
index 0000000000..a94716e659
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_gloves.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_gloves_panel">
+ <panel name="avatar_gloves_color_panel">
+ <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/>
+ <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="gloves_main_tab" title="Luvas"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_hair.xml b/indra/newview/skins/default/xui/pt/panel_edit_hair.xml
new file mode 100644
index 0000000000..13f1f892f9
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_hair.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_hair_panel">
+ <panel name="avatar_hair_color_panel">
+ <texture_picker label="Texture" name="Texture" tool_tip="Selecionar imagem"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="hair_color_tab" title="Cor"/>
+ <accordion_tab name="hair_style_tab" title="Estilo"/>
+ <accordion_tab name="hair_eyebrows_tab" title="Sombrancelhas"/>
+ <accordion_tab name="hair_facial_tab" title="Faciais"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_jacket.xml b/indra/newview/skins/default/xui/pt/panel_edit_jacket.xml
new file mode 100644
index 0000000000..f555bd9ac7
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_jacket.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_jacket_panel">
+ <panel name="avatar_jacket_color_panel">
+ <texture_picker label="Tecido de cima" name="Upper Fabric" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Tecido de baixo" name="Lower Fabric" tool_tip="Selecionar imagem"/>
+ <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="jacket_main_tab" title="Jaqueta"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_pants.xml b/indra/newview/skins/default/xui/pt/panel_edit_pants.xml
new file mode 100644
index 0000000000..67c300cc8d
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_pants.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_pants_panel">
+ <panel name="avatar_pants_color_panel">
+ <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/>
+ <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="pants_main_tab" title="Calças"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_pick.xml b/indra/newview/skins/default/xui/pt/panel_edit_pick.xml
new file mode 100644
index 0000000000..96a294bc28
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_pick.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Editar destaques" name="panel_edit_pick">
+ <panel.string name="location_notice">
+ (salvar para atualizar)
+ </panel.string>
+ <text name="title">
+ Editar destaques
+ </text>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <icon label="" name="edit_icon" tool_tip="Selecione uma imagem"/>
+ <text name="Name:">
+ Cargo:
+ </text>
+ <text name="description_label">
+ Descrição:
+ </text>
+ <text name="location_label">
+ Localização:
+ </text>
+ <text name="pick_location">
+ Carregando...
+ </text>
+ <button label="Usar configuração local" name="set_to_curr_location_btn"/>
+ </panel>
+ </scroll_container>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button label="Salvar destaque" name="save_changes_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_profile.xml b/indra/newview/skins/default/xui/pt/panel_edit_profile.xml
index a989cab167..c9e5513424 100644
--- a/indra/newview/skins/default/xui/pt/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/pt/panel_edit_profile.xml
@@ -1,45 +1,51 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
-<panel name="edit_profile_panel">
- <string name="CaptionTextAcctInfo">
- [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
- </string>
- <string name="AcctTypeResident"
- value="Residente" />
- <string name="AcctTypeTrial"
- value="Teste" />
- <string name="AcctTypeCharterMember"
- value="Estatuto do membro" />
- <string name="AcctTypeEmployee"
- value="Contratado da Linden Lab" />
- <string name="PaymentInfoUsed"
- value="Infor. de pagamento utilizadas" />
- <string name="PaymentInfoOnFile"
- value="Infor. de pagamento no arquivo" />
- <string name="NoPaymentInfoOnFile"
- value="Sem infor. de pagamento no arquivo" />
- <string name="AgeVerified"
- value="Idade Verificada" />
- <string name="NotAgeVerified"
- value="Idade não Verificada" />
- <string name="partner_edit_link_url">
- http://www.secondlife.com/account/partners.php?lang=pt
- </string>
- <panel name="scroll_content_panel">
- <panel name="data_panel" >
- <panel name="lifes_images_panel">
- <panel name="second_life_image_panel">
- <text name="second_life_photo_title_text">
- [SECOND_LIFE]:
- </text>
- </panel>
- </panel>
- <text name="title_partner_text" value="Parceiro:"/>
- <panel name="partner_data_panel">
- <text name="partner_text" value="[FIRST] [LAST]"/>
- </panel>
- <text name="text_box3">
- Resposta no Modo Ocupado:
- </text>
- </panel>
- </panel>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Editar perfil" name="edit_profile_panel">
+ <string name="CaptionTextAcctInfo">
+ [ACCTTYPE] [PAYMENTINFO] [AGEVERIFICATION]
+ </string>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <string name="AcctTypeResident" value="Residente"/>
+ <string name="AcctTypeTrial" value="Teste"/>
+ <string name="AcctTypeCharterMember" value="Estatuto do membro"/>
+ <string name="AcctTypeEmployee" value="Contratado da Linden Lab"/>
+ <string name="PaymentInfoUsed" value="Infor. de pagamento utilizadas"/>
+ <string name="PaymentInfoOnFile" value="Infor. de pagamento no arquivo"/>
+ <string name="NoPaymentInfoOnFile" value="Sem infor. de pagamento no arquivo"/>
+ <string name="AgeVerified" value="Idade Verificada"/>
+ <string name="NotAgeVerified" value="Idade não Verificada"/>
+ <string name="partner_edit_link_url">
+ http://www.secondlife.com/account/partners.php?lang=pt
+ </string>
+ <string name="no_partner_text" value="Nenhum"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="data_panel">
+ <panel name="lifes_images_panel">
+ <icon label="" name="2nd_life_edit_icon" tool_tip="Selecione uma imagem"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <text name="real_world_photo_title_text" value="Mundo real:"/>
+ </panel>
+ <icon label="" name="real_world_edit_icon" tool_tip="Selecione uma imagem"/>
+ <text name="title_homepage_text">
+ Página web:
+ </text>
+ <check_box label="Mostrar nos resultados de busca" name="show_in_search_checkbox"/>
+ <text name="title_acc_status_text" value="Minha conta:"/>
+ <text_editor name="acc_status_text" value="Residente. Dados de pagamento: não constam"/>
+ <text name="my_account_link" value="[[URL] Abrir meu painel]"/>
+ <text name="title_partner_text" value="Parceiro(a):"/>
+ <panel name="partner_data_panel">
+ <name_box initial_value="(pesquisando)" name="partner_text"/>
+ </panel>
+ <text name="partner_edit_link" value="[[URL] Editar]"/>
+ </panel>
+ </panel>
+ </scroll_container>
+ <panel name="profile_me_buttons_panel">
+ <button label="Salvar alterações" name="save_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_shape.xml b/indra/newview/skins/default/xui/pt/panel_edit_shape.xml
new file mode 100644
index 0000000000..de41ba3ad2
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_shape.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shape_panel">
+ <string name="meters">
+ Metros
+ </string>
+ <string name="feet">
+ Pés
+ </string>
+ <string name="height">
+ Altura:
+ </string>
+ <text name="avatar_height"/>
+ <panel label="Camisa" name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shape_body_tab" title="Corpo"/>
+ <accordion_tab name="shape_head_tab" title="Cabeça"/>
+ <accordion_tab name="shape_eyes_tab" title="Olhos"/>
+ <accordion_tab name="shape_ears_tab" title="Orelhas"/>
+ <accordion_tab name="shape_nose_tab" title="Nariz"/>
+ <accordion_tab name="shape_mouth_tab" title="Boca"/>
+ <accordion_tab name="shape_chin_tab" title="Queixo"/>
+ <accordion_tab name="shape_torso_tab" title="Tronco"/>
+ <accordion_tab name="shape_legs_tab" title="Pernas"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_shirt.xml b/indra/newview/skins/default/xui/pt/panel_edit_shirt.xml
new file mode 100644
index 0000000000..fb7c4c080c
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_shirt.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shirt_panel">
+ <panel name="avatar_shirt_color_panel">
+ <texture_picker label="tecido" name="Fabric" tool_tip="Clique para escolher uma foto"/>
+ <color_swatch label="Cor/Matiz" name="Color/Tint" tool_tip="Clique para abrir o selecionador de cor"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shirt_main_tab" title="Camisa"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_shoes.xml b/indra/newview/skins/default/xui/pt/panel_edit_shoes.xml
new file mode 100644
index 0000000000..d1d30cf46e
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_shoes.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_shoes_panel">
+ <panel name="avatar_shoes_color_panel">
+ <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/>
+ <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="shoes_main_tab" title="Sapatos"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_skin.xml b/indra/newview/skins/default/xui/pt/panel_edit_skin.xml
new file mode 100644
index 0000000000..f3d88123f2
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_skin.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skin_panel">
+ <panel name="avatar_skin_color_panel">
+ <texture_picker label="Tatuagens na cabeça" name="Head Tattoos" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Tatuagem parte de cima" name="Upper Tattoos" tool_tip="Selecionar imagem"/>
+ <texture_picker label="Tatuagem de baixo" name="Lower Tattoos" tool_tip="Selecionar imagem"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skin_color_tab" title="Cor da pele"/>
+ <accordion_tab name="skin_face_tab" title="Detalhe do rosto"/>
+ <accordion_tab name="skin_makeup_tab" title="Maquilagem"/>
+ <accordion_tab name="skin_body_tab" title="Detalhe do corpo"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_skirt.xml b/indra/newview/skins/default/xui/pt/panel_edit_skirt.xml
new file mode 100644
index 0000000000..b67cd53a83
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_skirt.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_skirt_panel">
+ <panel name="avatar_skirt_color_panel">
+ <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/>
+ <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="skirt_main_tab" title="Saia"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_socks.xml b/indra/newview/skins/default/xui/pt/panel_edit_socks.xml
new file mode 100644
index 0000000000..405568abeb
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_socks.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_socks_panel">
+ <panel name="avatar_socks_color_panel">
+ <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/>
+ <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="socks_main_tab" title="Meias"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_tattoo.xml b/indra/newview/skins/default/xui/pt/panel_edit_tattoo.xml
new file mode 100644
index 0000000000..f85bb3c499
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_tattoo.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_tattoo_panel">
+ <panel name="avatar_tattoo_color_panel">
+ <texture_picker label="Tatuagem de cabeça" name="Head Tattoo" tool_tip="Clique para escolher uma foto"/>
+ <texture_picker label="Tatuagem superior" name="Upper Tattoo" tool_tip="Selecione uma foto"/>
+ <texture_picker label="Tatuagem inferior" name="Lower Tattoo" tool_tip="Selecione uma foto"/>
+ <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_underpants.xml b/indra/newview/skins/default/xui/pt/panel_edit_underpants.xml
new file mode 100644
index 0000000000..f858dc0495
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_underpants.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_underpants_panel">
+ <panel name="avatar_underpants_color_panel">
+ <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/>
+ <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="underpants_main_tab" title="Roupa de baixo"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_undershirt.xml b/indra/newview/skins/default/xui/pt/panel_edit_undershirt.xml
new file mode 100644
index 0000000000..9c18fc1d6c
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_undershirt.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="edit_undershirt_panel">
+ <panel name="avatar_undershirt_color_panel">
+ <texture_picker label="Tecido" name="Fabric" tool_tip="Selecionar imagem"/>
+ <color_swatch label="Cor/Tonalidade" name="Color/Tint" tool_tip="Selecionar a cor"/>
+ </panel>
+ <panel name="accordion_panel">
+ <accordion name="wearable_accordion">
+ <accordion_tab name="undershirt_main_tab" title="Camiseta"/>
+ </accordion>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_edit_wearable.xml b/indra/newview/skins/default/xui/pt/panel_edit_wearable.xml
new file mode 100644
index 0000000000..e921dd1bea
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_edit_wearable.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Vestível" name="panel_edit_wearable">
+ <string name="edit_shape_title">
+ Editando forma
+ </string>
+ <string name="edit_skin_title">
+ Editando pele
+ </string>
+ <string name="edit_hair_title">
+ Editando cabelo
+ </string>
+ <string name="edit_eyes_title">
+ Editando os olhos
+ </string>
+ <string name="edit_shirt_title">
+ Editando camisa
+ </string>
+ <string name="edit_pants_title">
+ Editando calças
+ </string>
+ <string name="edit_shoes_title">
+ Editando sapatos
+ </string>
+ <string name="edit_socks_title">
+ Editando meias
+ </string>
+ <string name="edit_jacket_title">
+ Editando jaqueta
+ </string>
+ <string name="edit_skirt_title">
+ Editando saia
+ </string>
+ <string name="edit_gloves_title">
+ Editando luvas
+ </string>
+ <string name="edit_undershirt_title">
+ Editando camiseta
+ </string>
+ <string name="edit_underpants_title">
+ Editando roupa de baixo
+ </string>
+ <string name="edit_alpha_title">
+ Editando máscara Alpha
+ </string>
+ <string name="edit_tattoo_title">
+ Editando tatuagem
+ </string>
+ <string name="shape_desc_text">
+ Forma:
+ </string>
+ <string name="skin_desc_text">
+ Pele:
+ </string>
+ <string name="hair_desc_text">
+ Cabelo:
+ </string>
+ <string name="eyes_desc_text">
+ Olhos:
+ </string>
+ <string name="shirt_desc_text">
+ Camisa:
+ </string>
+ <string name="pants_desc_text">
+ Calças:
+ </string>
+ <string name="shoes_desc_text">
+ Sapatos:
+ </string>
+ <string name="socks_desc_text">
+ Meias:
+ </string>
+ <string name="jacket_desc_text">
+ Jaqueta:
+ </string>
+ <string name="skirt_desc_text">
+ Saia:
+ </string>
+ <string name="gloves_desc_text">
+ Luvas:
+ </string>
+ <string name="undershirt_desc_text">
+ Camiseta:
+ </string>
+ <string name="underpants_desc_text">
+ Roupa de baixo:
+ </string>
+ <string name="alpha_desc_text">
+ Máscara alpha:
+ </string>
+ <string name="tattoo_desc_text">
+ Tatuagem:
+ </string>
+ <text name="edit_wearable_title" value="Editando forma"/>
+ <panel label="Camisa" name="wearable_type_panel">
+ <text name="description_text" value="Forma:"/>
+ <radio_group name="sex_radio">
+ <radio_item label="" name="sex_male" tool_tip="Masculino" value="1"/>
+ <radio_item label="" name="sex_female" tool_tip="Feminino" value="0"/>
+ </radio_group>
+ <icon name="male_icon" tool_tip="Masculino"/>
+ <icon name="female_icon" tool_tip="Feminino"/>
+ </panel>
+ <panel name="button_panel">
+ <button label="Salvar como" name="save_as_button"/>
+ <button label="Reverter" name="revert_button"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_friends.xml b/indra/newview/skins/default/xui/pt/panel_friends.xml
index d430d637ad..34073f9ce1 100644
--- a/indra/newview/skins/default/xui/pt/panel_friends.xml
+++ b/indra/newview/skins/default/xui/pt/panel_friends.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="friends">
<string name="Multiple">
- Múltiplos amigos...
+ Diversos amigos
</string>
<scroll_list name="friend_list" tool_tip="Aperte shift ou control enquanto clica para selecionar múltiplos amigos">
<column name="icon_online_status" tool_tip="Status Online"/>
@@ -11,10 +11,10 @@
<column name="icon_edit_mine" tool_tip="Amigo pode editar, apagar ou pegar seus objetos"/>
<column name="icon_edit_theirs" tool_tip="Você pode editar os objetos deste amigo"/>
</scroll_list>
- <button width="86" label="MI/Chamar" name="im_btn" tool_tip="Abrir sessão de Mensagem Instantânea"/>
- <button width="86" label="Perfil" name="profile_btn" tool_tip="Mostrar foto, grupos e outras informações"/>
- <button width="86" label="Teletransp..." name="offer_teleport_btn" tool_tip="Oferecer a este amigo o teletransporte para sua localização atual"/>
- <button width="86" label="Pagar..." name="pay_btn" tool_tip="Dar Linden dólares (L$) a este amigo"/>
- <button width="86" label="Remover..." name="remove_btn" tool_tip="Remover esta pessoa de sua lista de amigos"/>
- <button width="86" label="Adicionar..." name="add_btn" tool_tip="Oferecer amizade a um residente"/>
+ <button label="MI/Chamar" name="im_btn" tool_tip="Abrir sessão de Mensagem Instantânea" width="86"/>
+ <button label="Perfil" name="profile_btn" tool_tip="Mostrar foto, grupos e outras informações" width="86"/>
+ <button label="Teletransportar" name="offer_teleport_btn" tool_tip="Oferecer a este amigo o teletransporte para sua localização atual" width="86"/>
+ <button label="Pagar" name="pay_btn" tool_tip="Dar Linden dólares (L$) a este amigo" width="86"/>
+ <button label="Tirar" name="remove_btn" tool_tip="Remover esta pessoa de sua lista de amigos" width="86"/>
+ <button label="Adicionar" name="add_btn" tool_tip="Oferecer amizade para um residente" width="86"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_group_control_panel.xml b/indra/newview/skins/default/xui/pt/panel_group_control_panel.xml
new file mode 100644
index 0000000000..502dae8d67
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_group_control_panel.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="vertical_stack">
+ <layout_panel name="group_info_btn_panel">
+ <button label="Perfil do grupo" name="group_info_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Ligar para o grupo" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Desligar" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Abrir controles de voz" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_group_general.xml b/indra/newview/skins/default/xui/pt/panel_group_general.xml
index 226011c138..6060f23bba 100644
--- a/indra/newview/skins/default/xui/pt/panel_group_general.xml
+++ b/indra/newview/skins/default/xui/pt/panel_group_general.xml
@@ -1,70 +1,58 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Geral" name="general_tab">
- <string name="help_text">
- A aba Geral contém informações gerais sobre este grupo, a lista dos donos e membros visíveis, preferências gerais do grupo e opções dos membros. Passe o mouse sobre as opções para mais ajuda.
- </string>
- <string name="group_info_unchanged">
- Informações gerais do grupo foram modificadas
- </string>
- <button label="?" label_selected="?" name="help_button"/>
- <line_editor label="Digite o nome do seu novo grupo aqui" name="group_name_editor"/>
- <text name="group_name">
- Digite o nome do seu novo grupo aqui
- </text>
- <text name="prepend_founded_by">
- Fundado por:
- </text>
- <text name="founder_name" left_delta="74" >
- (espera)
- </text>
- <text name="group_charter_label">
- Declaração do Grupo
- </text>
- <texture_picker label="Insígnia do Grupo" name="insignia" tool_tip="Clique para escolher uma imagem"/>
+ <panel.string name="help_text">
+ A guia Geral contém informações gerais sobre o grupo, uma lista de membros, preferências do grupo e opções para membros.
+
+Para obter mais ajuda, passe o mouse sobre as opções.
+ </panel.string>
+ <panel.string name="group_info_unchanged">
+ Informações gerais do grupo modificadas.
+ </panel.string>
+ <panel.string name="incomplete_member_data_str">
+ Recuperando dados do membro
+ </panel.string>
+ <panel name="group_info_top">
+ <texture_picker label="" name="insignia" tool_tip="Selecionar imagem"/>
+ <text name="prepend_founded_by">
+ Fundador:
+ </text>
+ <name_box initial_value="(pesquisando)" name="founder_name"/>
+ <text name="join_cost_text">
+ Grátis
+ </text>
+ <button label="ENTRAR AGORA!" name="btn_join"/>
+ </panel>
<text_editor name="charter">
Declaração do grupo
</text_editor>
- <button label="Unir (L$0)" label_selected="Unir (L$0)" name="join_button"/>
- <button label="Vista detalhada" label_selected="Vista detalhada" name="info_button"/>
- <text name="text_owners_and_visible_members">
- Proprietários &amp; Membros visíveis
- </text>
- <text name="text_owners_are_shown_in_bold">
- (Proprietários são mostrados em negrito )
- </text>
<name_list name="visible_members">
- <name_list.columns label="Nome do membro" name="name"/>
+ <name_list.columns label="Membro" name="name"/>
<name_list.columns label="Título" name="title"/>
- <name_list.columns label="Último login" name="online"/>
+ <name_list.columns label="Status" name="status"/>
</name_list>
- <text name="text_group_preferences">
- Preferências do Grupo
+ <text name="my_group_settngs_label">
+ Eu
</text>
+ <text name="active_title_label">
+ Meu cargo
+ </text>
+ <combo_box name="active_title" tool_tip="Define o cargo que é exibido com o nome do seu avatar quando o grupo está ativo."/>
+ <check_box label="Receber avisos do grupo" name="receive_notices" tool_tip="Define o seu recebimento de avisos deste grupo. Desmarque esta opção se o grupo envia spam."/>
+ <check_box label="Mostrar no meu perfil" name="list_groups_in_profile" tool_tip="Define se você deseja incluir este grupo no seu perfil."/>
<panel name="preferences_container">
- <check_box label="Mostre na busca" name="show_in_group_list" tool_tip="Deixe as pessoas verem este grupo nos resultados de busca."/>
- <check_box label="Adesão aberta" name="open_enrollement" tool_tip="Definir se este grupo permite que novos membros entrem sem serem convidados"/>
- <check_box label="Taxa de adesão:" name="check_enrollment_fee" tool_tip="Define se é necessária uma taxa de adesão para se unir ao grupo."/>
- <spinner width="60" left_delta="120" name="spin_enrollment_fee" tool_tip="Os novos membros devem pagar esta taxa para se unir ao grupo quando a Taxa de Adesão está marcada."/>
- <combo_box width="170" name="group_mature_check" tool_tip="Define se a informação do seu grupo é considerada mature.">
- <combo_box.item name="select_mature" label="- Selecionar Maturidade -"/>
- <combo_box.item name="mature" label="Conteúdo Mature"/>
- <combo_box.item name="pg" label="Conteúdo PG"/>
+ <text name="group_settngs_label">
+ Grupo
+ </text>
+ <check_box label="Qualquer um pode entrar" name="open_enrollement" tool_tip="Controla a entrada de novos membros, com ou sem convite."/>
+ <check_box label="Taxa de inscrição" name="check_enrollment_fee" tool_tip="Controla a cobrança de uma taxa de associação ao grupo."/>
+ <spinner label="L$" left_delta="120" name="spin_enrollment_fee" tool_tip="Se a opção &apos;Taxa de associação&apos; estiver marcada, novos membros precisam pagar o valor definido para entrar no grupo." width="60"/>
+ <combo_box name="group_mature_check" tool_tip="Define se os dados do seu grupo são conteúdo moderado." width="170">
+ <combo_item name="select_mature">
+ - Selecione Maduro -
+ </combo_item>
+ <combo_box.item label="Conteúdo Mature" name="mature"/>
+ <combo_box.item label="Conteúdo PG" name="pg"/>
</combo_box>
- <panel name="title_container">
- <text name="active_title_label">
- Meu título ativo
- </text>
- <combo_box name="active_title" tool_tip="Define o título que aparece em seu avatar quando o grupo estiver ativo."/>
- </panel>
- <check_box label="Receber notícias do grupo" name="receive_notices" tool_tip="Define se Você deseja receber notícias deste grupo. Desmarque esta caixa se o grupo está lhe fazendo spam."/>
- <check_box label="Listar grupo no meu perfil" name="list_groups_in_profile" tool_tip="Define se você deseja listar este grupo no seu Perfil"/>
+ <check_box initial_value="true" label="Mostre na busca" name="show_in_group_list" tool_tip="Incluir o grupo nos resultados de busca"/>
</panel>
- <string name="incomplete_member_data_str">
- Recuperando dados do membro
- </string>
- <string name="confirm_group_create_str">
- Criar este grupo irá custar L$100.
-Você está realmente, realmente, REALMENTE seguro que deseja gastar L$100 para criar este grupo?
-Esteja consciente de que se ninguém mais se juntar a este grupo dentro de 48 horas, este será dissolvido e o nome não estará disponível para uso futuro.
- </string>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/pt/panel_group_info_sidetray.xml
new file mode 100644
index 0000000000..29d757346c
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_group_info_sidetray.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Perfil do grupo" name="GroupInfo">
+ <panel.string name="default_needs_apply_text">
+ Algumas modificações não foram salvas
+ </panel.string>
+ <panel.string name="want_apply_text">
+ Deseja salvar essas mudanças?
+ </panel.string>
+ <panel.string name="group_join_btn">
+ Entrar (L$[AMOUNT])
+ </panel.string>
+ <panel.string name="group_join_free">
+ Grátis
+ </panel.string>
+ <panel name="group_info_top">
+ <text name="group_name" value="Carregando..."/>
+ <line_editor label="Digite o nome do grupo novo aqui" name="group_name_editor"/>
+ </panel>
+ <layout_stack name="layout">
+ <layout_panel name="group_accordions">
+ <accordion name="groups_accordion">
+ <accordion_tab name="group_general_tab" title="Geral"/>
+ <accordion_tab name="group_roles_tab" title="Cargos"/>
+ <accordion_tab name="group_notices_tab" title="Avisos"/>
+ <accordion_tab name="group_land_tab" title="Terrenos/Bens"/>
+ </accordion>
+ </layout_panel>
+ <layout_panel name="button_row">
+ <button label="Bate-papo" name="btn_chat"/>
+ <button label="Ligar para o grupo" name="btn_call" tool_tip="Ligar para este grupo"/>
+ <button label="Salvar" label_selected="Salvar" name="btn_apply"/>
+ <button label="Criar grupo" name="btn_create" tool_tip="Criar um grupo novo"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_group_invite.xml b/indra/newview/skins/default/xui/pt/panel_group_invite.xml
index a02a17139b..c7def0ed96 100644
--- a/indra/newview/skins/default/xui/pt/panel_group_invite.xml
+++ b/indra/newview/skins/default/xui/pt/panel_group_invite.xml
@@ -1,23 +1,27 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Convidar um membro" name="invite_panel" width="224">
+ <panel.string name="confirm_invite_owner_str">
+ Você tem certeza de que deseja convidar novo(s) proprietário(s)? Esta ação é permanente!
+ </panel.string>
+ <panel.string name="loading">
+ (carregando...)
+ </panel.string>
+ <panel.string name="already_in_group">
+ Alguns dos residentes selecionados já estão no grupo, portanto não receberam convite.
+ </panel.string>
<text name="help_text" width="214">
- Voce pode selecionar vários residentes
-para convidar ao seu grupo. Clique
-&apos;Abrir Seletor de Residente&apos; para iniciar.
+ Selecione um ou mais residentes para convidar. Clique em &apos;Abrir seletor de residentes&apos; para começar.
</text>
<button label="Abrir Seletor de Residente" name="add_button" tool_tip=""/>
- <name_list name="invitee_list" tool_tip="Mantenha apertada a tecla Control e clique nos nomes dos residentes para uma seleção múltipla."/>
- <button left_delta="-7" width="214" label="Remove os selecionados acima da lista" name="remove_button" tool_tip="Remove os residentes selecionados acima da lista de convite."/>
+ <name_list name="invitee_list" tool_tip="Pressione Ctrl enquanto clica nos nomes dos residentes"/>
+ <button label="Remove os selecionados acima da lista" left_delta="-7" name="remove_button" tool_tip="Exclui os residentes selecionados acima da lista de convidados" width="214"/>
<text name="role_text">
Escolha que Função atribuir a eles:
</text>
- <combo_box name="role_name" tool_tip="Escolha a partir da lista de Funções autorizadas a você para inclusão de membros."/>
+ <combo_box name="role_name" tool_tip="Selecione o cargo da lista de cargos que você pode designar a membros"/>
<button label="Mandar convites" name="ok_button"/>
<button label="Cancelar" name="cancel_button"/>
- <string name="confirm_invite_owner_str">
- Você tem certeza de que deseja convidar novo(s) proprietário(s)? Esta ação é permanente!
- </string>
- <string name="loading">
- (carregando...)
+ <string name="GroupInvitation">
+ Convite
</string>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_group_land_money.xml b/indra/newview/skins/default/xui/pt/panel_group_land_money.xml
index 5b09363e3c..e57a85a726 100644
--- a/indra/newview/skins/default/xui/pt/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/pt/panel_group_land_money.xml
@@ -1,84 +1,84 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Terra &amp; L$" name="land_money_tab">
- <string name="help_text">
- Lotes pertencentes ao grupo são listados adiante, com os detalhes de contribuição. Um aviso aparece até que o Total de Terra em Uso seja menor ou igual à Contribuição Total. As abas de Planejamento, Detalhes e Vendas fornecem informações sobre as finanças do grupo.
- </string>
- <button label="?" name="help_button"/>
- <string name="cant_view_group_land_text">
- Você não tem permissão para ver as terras pertencentes ao grupo.
- </string>
- <string name="cant_view_group_accounting_text">
- Você não tem permissão para ver as informações sobre as contas do grupo.
- </string>
- <string name="loading_txt">
+ <panel.string name="help_text">
+ Será exibido um aviso até o Total de terrenos usados for igual ou inferior à contribuição total.
+ </panel.string>
+ <panel.string name="cant_view_group_land_text">
+ Você não está autorizado a acessar terrenos de grupos
+ </panel.string>
+ <panel.string name="epmty_view_group_land_text">
+ Nada consta
+ </panel.string>
+ <panel.string name="cant_view_group_accounting_text">
+ Você não está autorizado a acessar os dados de contabilidade do grupo.
+ </panel.string>
+ <panel.string name="loading_txt">
Carregando...
- </string>
- <text name="group_land_heading" width="250">
- Terra percentente ao grupo
- </text>
- <scroll_list name="group_parcel_list">
- <column label="Nome do Lote" name="name"/>
- <column label="Região" name="location"/>
- <column label="Tipo" name="type"/>
- <column label="Ãrea" name="area"/>
- </scroll_list>
- <button label="Mostrar no Mapa" label_selected="Mostrar no Mapa" name="map_button" left="282" width="130"/>
- <text name="total_contributed_land_label">
- Contribuição Total:
- </text>
- <text name="total_contributed_land_value">
- [AREA] m²
- </text>
- <text name="total_land_in_use_label">
- Total de Terra em Uso:
- </text>
- <text name="total_land_in_use_value">
- [AREA] m²
- </text>
- <text name="land_available_label">
- Terra Disponível:
- </text>
- <text name="land_available_value">
- [AREA] m²
- </text>
- <text name="your_contribution_label">
- Sua Contribuição:
- </text>
- <string name="land_contrib_error">
- Não é possível definir sua contribuição para o terreno.
- </string>
- <text name="your_contribution_units">
- ( m² )
- </text>
- <text name="your_contribution_max_value">
- ([AMOUNT] máxima)
- </text>
- <text name="group_over_limit_text">
- Membros do grupo precisam contribuir com mais créditos de Terra para
-garantir a terra em uso.
- </text>
- <text name="group_money_heading">
- Grupo L$
- </text>
+ </panel.string>
+ <panel.string name="land_contrib_error">
+ Não foi possível definir sua contribuição
+ </panel.string>
+ <panel name="layout_panel_landmoney">
+ <scroll_list name="group_parcel_list">
+ <scroll_list.columns label="Lote" name="name"/>
+ <scroll_list.columns label="Região" name="location"/>
+ <scroll_list.columns label="Tipo" name="type"/>
+ <scroll_list.columns label="Ãrea:" name="area"/>
+ </scroll_list>
+ <text name="total_contributed_land_label">
+ Total contribuído:
+ </text>
+ <text name="total_contributed_land_value">
+ [AREA] m²
+ </text>
+ <button label="Mapa" label_selected="Mapa" name="map_button"/>
+ <text name="total_land_in_use_label">
+ Total em uso:
+ </text>
+ <text name="total_land_in_use_value">
+ [AREA] m²
+ </text>
+ <text name="land_available_label">
+ Disponíveis:
+ </text>
+ <text name="land_available_value">
+ [AREA] m²
+ </text>
+ <text name="your_contribution_label">
+ Sua contribuição:
+ </text>
+ <text name="your_contribution_units">
+ m²
+ </text>
+ <text name="your_contribution_max_value">
+ ([AMOUNT] max)
+ </text>
+ <text name="group_over_limit_text">
+ O terreno em uso requer mais créditos
+ </text>
+ <text name="group_money_heading">
+ L$ do grupo
+ </text>
+ </panel>
<tab_container name="group_money_tab_container">
- <panel label="Planejamento" name="group_money_planning_tab">
+ <panel label="PLANEJAMENTO" name="group_money_planning_tab">
<text_editor name="group_money_planning_text">
- Computando..
+ Carregando...
</text_editor>
</panel>
- <panel label="Detalhes" name="group_money_details_tab">
+ <panel label="DETALHES" name="group_money_details_tab">
<text_editor name="group_money_details_text">
- Computando...
+ Carregando...
</text_editor>
- <button label="&lt; Mais Cedo" label_selected="&lt; Cedo" name="earlier_details_button" tool_tip="Voltar no Tempo"/>
- <button label="Mais Tarde &gt;" label_selected="Tarde &gt;" name="later_details_button" tool_tip="Adiantar o Tempo"/>
+ <button label="&lt; Mais Cedo" label_selected="&lt; Cedo" name="earlier_details_button" tool_tip="Atrás"/>
+ <button label="Mais Tarde &gt;" label_selected="Tarde &gt;" name="later_details_button" tool_tip="Próximo"/>
</panel>
- <panel label="Vendas" name="group_money_sales_tab">
+ <panel label="VENDAS" name="group_money_sales_tab">
<text_editor name="group_money_sales_text">
- Computando...
+ Carregando...
</text_editor>
- <button label="&lt; Mais Cedo" label_selected="&lt; Mais Cedo" name="earlier_sales_button" tool_tip="Voltar no Tempo"/>
- <button label="Mais Tarde &gt;" label_selected="Mais Tarde &gt;" name="later_sales_button" tool_tip="Adiantar o Tempo"/>
+ <button label="&lt; Mais Cedo" label_selected="&lt; Mais Cedo" name="earlier_sales_button" tool_tip="Atrás"/>
+ <button label="Mais Tarde &gt;" label_selected="Mais Tarde &gt;" name="later_sales_button" tool_tip="Próximo"/>
</panel>
</tab_container>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_group_list_item.xml b/indra/newview/skins/default/xui/pt/panel_group_list_item.xml
new file mode 100644
index 0000000000..19c34d2f10
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_group_list_item.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="group_list_item">
+ <text name="group_name" value="Desconhecido"/>
+ <button name="profile_btn" tool_tip="Ver perfil"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_group_notices.xml b/indra/newview/skins/default/xui/pt/panel_group_notices.xml
index d5c0f01e33..9ccb85cdf6 100644
--- a/indra/newview/skins/default/xui/pt/panel_group_notices.xml
+++ b/indra/newview/skins/default/xui/pt/panel_group_notices.xml
@@ -1,58 +1,55 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Notícias" name="notices_tab">
- <text name="help_text">
+ <panel.string name="help_text">
As notícias são uma maneira rápida de comunicar-se através de um grupo transmitindo uma mensagem e entregando um item anexo, opcionalmente. As notícias vão apenas a membros do grupo que têm a função habilitada para receber notícias. Você pode desligar Notícias na aba Geral.
- </text>
- <text name="no_notices_text">
- Não existem notícias anteriores.
- </text>
- <button label="?" label_selected="?" name="help_button"/>
- <text name="lbl">
- Arquivo de notícias do grupo
- </text>
+ </panel.string>
+ <panel.string name="no_notices_text">
+ Não há nenhum aviso antigo
+ </panel.string>
<text name="lbl2">
- As notícias são mantidas por 14 dias.
-Listas de aviso estão limitadas a 200 por grupo, diariamente.
+ Cada aviso é armazenado por 14 dias.
+Cada grupo pode enviar no máximo 200 avisos/dia
</text>
<scroll_list name="notice_list">
- <column label="Assunto" name="subject"/>
- <column label="Para" name="from"/>
- <column label="Data" name="date"/>
+ <scroll_list.columns label="Assunto" name="subject"/>
+ <scroll_list.columns label="Para" name="from"/>
+ <scroll_list.columns label="Data" name="date"/>
</scroll_list>
<text name="notice_list_none_found">
- Nenhum encontrado.
+ Nenhum resultado foi encontrado.
</text>
- <button label="Criar nova notícia" label_selected="Criar nova notícia" name="create_new_notice"/>
- <button label="Atualizar" label_selected="Atualizar Lista" name="refresh_notices"/>
+ <button label="Criar um novo aviso" label_selected="Criar nova notícia" name="create_new_notice" tool_tip="Criar um novo aviso"/>
+ <button label="Atualizar" label_selected="Atualizar lista" name="refresh_notices" tool_tip="Atualizar lista de avisos"/>
<panel label="Criar nova notícia" name="panel_create_new_notice">
<text name="lbl">
- Criar uma notícia
+ Criar notícia
</text>
- <text name="lbl2">
- Você pode adicionar um item simples à notícia, arrastando-o do seu Inventário para o painel. Itens anexados devem ser copiáveis e transferíveis e você não pode mandar uma pasta.
- </text>
- <text name="lbl3" left="20">
+ <text left="20" name="lbl3">
Assunto:
</text>
- <line_editor name="create_subject" width="251" left_delta="61"/>
- <text name="lbl4" left="15" width="60">
+ <line_editor left_delta="61" name="create_subject" width="251"/>
+ <text left="15" name="lbl4" width="60">
Mensagem:
</text>
- <text_editor name="create_message" left_delta="66" width="330"/>
+ <text_editor left_delta="66" name="create_message" width="330"/>
<text name="lbl5" width="68">
Anexo:
</text>
- <line_editor name="create_inventory_name" width="190" left_delta="74"/>
- <button label="Remover o anexo" label_selected="Remover o anexo" name="remove_attachment"/>
+ <line_editor left_delta="74" name="create_inventory_name" width="190"/>
+ <text name="string">
+ Arrastar e soltar o item aqui para anexá-lo:
+ </text>
+ <button label="Inventário" name="open_inventory" tool_tip="Inventário aberto"/>
+ <button label="Tirar" label_selected="Remover o anexo" name="remove_attachment" tool_tip="Remover anexo da notificação."/>
<button label="Enviar" label_selected="Enviar" name="send_notice"/>
- <panel name="drop_target" tool_tip="Arraste um item do inventário para dentro da caixa de mensagem para enviá-lo com a notícia. Você deve ter permissão para copiar e transferir o objeto, para enviá-lo com a notícia."/>
+ <group_drop_target name="drop_target" tool_tip="Arrastar um item do inventário para a caixa para enviá-lo com o aviso. É preciso ter autorização de cópia e transferência do item para anexá-lo ao aviso."/>
</panel>
- <panel label="Visualizar Notícia Anterior" name="panel_view_past_notice">
+ <panel label="Visualizar notícia anterior" name="panel_view_past_notice">
<text name="lbl">
Notícia arquivada
</text>
<text name="lbl2">
- Para enviar uma notícia nova, clique no botão &apos;Criar Nova Notícia&apos; acima.
+ Para enviar um novo aviso, clique no botão +
</text>
<text name="lbl3">
Asunto:
@@ -60,6 +57,6 @@ Listas de aviso estão limitadas a 200 por grupo, diariamente.
<text name="lbl4">
Mensagem:
</text>
- <button label="Abrir o anexo" label_selected="Abrir o anexo" name="open_attachment"/>
+ <button label="Abrir anexo" label_selected="Abrir o anexo" name="open_attachment"/>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_group_notify.xml b/indra/newview/skins/default/xui/pt/panel_group_notify.xml
new file mode 100644
index 0000000000..5a8ea81074
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_group_notify.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="instant_message" name="panel_group_notify">
+ <panel label="header" name="header">
+ <text name="title" value="Nome do remetente / grupo"/>
+ </panel>
+ <text name="attachment" value="Anexo"/>
+ <button label="OK" name="btn_ok"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_group_roles.xml b/indra/newview/skins/default/xui/pt/panel_group_roles.xml
index 087cf0c107..9c3792ec43 100644
--- a/indra/newview/skins/default/xui/pt/panel_group_roles.xml
+++ b/indra/newview/skins/default/xui/pt/panel_group_roles.xml
@@ -1,146 +1,104 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Membros e Funções" name="roles_tab">
- <string name="default_needs_apply_text">
- Existem alterações não aplicadas na sub-aba atual.
- </string>
- <string name="want_apply_text">
- Você quer submeter essas alterações?
- </string>
- <button label="?" name="help_button"/>
- <panel name="members_header">
- <text name="static">
- Membros e Funções
- </text>
- <text name="static2">
- São atribuídas funções com habilidades aos membros do grupo.
-Estes ajustes podem ser facilmente customizados para uma flexibilidade
-e organização maiores.
- </text>
- </panel>
- <panel name="roles_header">
- <text name="static">
- Funções
- </text>
- <text name="role_properties_modifiable">
- Selecionar uma função abaixo. Você pode modificar o nome, a descrição
-e o título do membro.
- </text>
- <text name="role_properties_not_modifiable">
- Selecione uma função abaixo para ver suas propriedades, membros e
-habilidades permitidas.
- </text>
- <text bottom_delta="-28" name="role_actions_modifiable">
- Você também pode atribuir habilidades à função.
- </text>
- <text name="role_actions_not_modifiable">
- Você pode ver, mas não pode alterar habilidades atribuídas.
- </text>
- </panel>
- <panel name="actions_header">
- <text name="static">
- Habilidades
- </text>
- <text name="static2">
- Você pode ver a descrição de uma habilidade e quais funções e membros
-podem executar essa habilidade.
- </text>
- </panel>
+ <panel.string name="default_needs_apply_text">
+ Algumas modificações não foram salvas
+ </panel.string>
+ <panel.string name="want_apply_text">
+ Deseja salvar essas mudanças?
+ </panel.string>
<tab_container height="164" name="roles_tab_container">
- <panel height="148" label="Membros" name="members_sub_tab" tool_tip="Membros">
- <line_editor bottom="127" name="search_text"/>
- <button label="Pesquisar" name="search_button" width="75"/>
- <button label="Mostrar todos" name="show_all_button" left_delta="80"/>
- <name_list name="member_list" bottom_delta="-105" height="104" >
- <column label="Nome do membro" name="name"/>
- <column label="Tarifa doada" name="donated"/>
- <column label="Último login" name="online"/>
- </name_list>
- <button label="Convidar Novo Membro..." name="member_invite" width="165"/>
- <button label="Ejetar do Grupo" name="member_eject"/>
- <string name="help_text">
+ <panel height="148" label="MEMBROS" name="members_sub_tab" tool_tip="Membros">
+ <panel.string name="help_text">
Você pode adicionar ou remover as funções designadas aos membros. Selecione vários membros, segurando a tecla Ctrl e clicando em seus nomes.
- </string>
+ </panel.string>
+ <filter_editor label="Filtrar por membro" name="filter_input"/>
+ <name_list bottom_delta="-105" height="104" name="member_list">
+ <name_list.columns label="Membro" name="name"/>
+ <name_list.columns label="Doações" name="donated"/>
+ <name_list.columns label="Status" name="online"/>
+ </name_list>
+ <button label="Convidar" name="member_invite" width="165"/>
+ <button label="Ejetar" name="member_eject"/>
</panel>
- <panel height="148" label="Funções" name="roles_sub_tab">
- <line_editor bottom="127" name="search_text"/>
- <button label="Busca" name="search_button" width="75"/>
- <button label="Mostrar todos" name="show_all_button" left_delta="80"/>
- <scroll_list name="role_list" bottom_delta="-104" height="104">
- <column label="Nome da função" name="name"/>
- <column label="Título" name="title"/>
- <column label="Membro" name="members"/>
+ <panel height="148" label="CARGOS" name="roles_sub_tab">
+ <panel.string name="help_text">
+ Cada cargo tem um nome e uma lista das funções que membros designados podem desempenhar.
+ Os membros podem ter um ou mais cargos.
+ Cada grupo pode ter 10 cargos, incluindo Membro e Dono do Grupo.
+ </panel.string>
+ <panel.string name="cant_delete_role">
+ As funções &apos;Todos&apos; e &apos;Owners&apos; são especiais e não podem ser apagadas.
+ </panel.string>
+ <panel.string name="power_folder_icon">
+ Inv_FolderClosed
+ </panel.string>
+ <filter_editor label="Filtrar por cargo" name="filter_input"/>
+ <scroll_list bottom_delta="-104" height="104" name="role_list">
+ <scroll_list.columns label="Cargo" name="name"/>
+ <scroll_list.columns label="Título" name="title"/>
+ <scroll_list.columns label="#" name="members"/>
</scroll_list>
- <button label="Criar nova função..." name="role_create"/>
+ <button label="Adicionar cargo" name="role_create"/>
<button label="Apagar função" name="role_delete"/>
- <string name="help_text">
- As funções têm um título e uma lista de habilidades
-permitidas que os membros podem executar. Os membros poderão ter um ou mais funções.
- Um grupo poderá ter até 10 funções, incluíndo as funções dos membros e do dono do grupo.
- </string>
- <string name="cant_delete_role">
- As funções &apos;todos&apos; e &apos;donos&apos; são especiais e não podem ser deletadas.
- </string>
</panel>
- <panel height="148" label="Habilidades" name="actions_sub_tab">
- <line_editor bottom="127" name="search_text"/>
- <button label="Busca" name="search_button" width="75"/>
- <button label="Mostrar todos" name="show_all_button" left_delta="80"/>
- <scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Selecione uma habilidade para ver mais detalhes."/>
- <string name="help_text">
+ <panel height="148" label="FUNÇÕES" name="actions_sub_tab" tool_tip="Você pode ver a descrição de uma função e quais cargos e membros podem desempenhá-la.">
+ <panel.string name="help_text">
As habilidades permitem que os membros nas funções façam coisas específicas dentro do grupo.
Há uma grande variedade de habilidades.
- </string>
+ </panel.string>
+ <filter_editor label="Filtrar por função" name="filter_input"/>
+ <scroll_list bottom_delta="-120" height="118" name="action_list" tool_tip="Selecione uma função para ver mais detalhes"/>
</panel>
</tab_container>
<panel name="members_footer">
<text name="static">
- Funções atribuídas
+ Cargos desempenhados
</text>
<text name="static2">
Habilidades permitidas
</text>
- <scroll_list name="member_allowed_actions" tool_tip="Para detalhes de cada habilidade permitida, veja a aba Habilidades."/>
+ <scroll_list name="member_allowed_actions" tool_tip="Clique na guia Funções para ver mais detalhes"/>
</panel>
<panel name="roles_footer">
<text name="static">
- Nome
- </text>
- <text name="static2">
- Descrição
+ Nome da função
</text>
<line_editor name="role_name">
Empregados
</line_editor>
<text name="static3">
- Título
+ Título da função
</text>
<line_editor name="role_title">
(esperando)
</line_editor>
+ <text name="static2">
+ Descrição
+ </text>
<text_editor name="role_description">
(esperando)
</text_editor>
<text name="static4">
- Membros atribuídos
+ Cargos desempenhados
</text>
+ <check_box label="Revelar membros" name="role_visible_in_list" tool_tip="Define se os membros dessa função são visíveis na guia geral para pessoas de fora do grupo."/>
<text name="static5" tool_tip="Uma lista de habilidades que a função selecionada atualmente pode executar.">
Habilidades permitidas
</text>
- <check_box label="Membros estão visíveis" name="role_visible_in_list" tool_tip="Selecione se os membros desta função estarão visíveis na aba Diversos, para as pessoas de fora do grupo."/>
- <scroll_list name="role_allowed_actions" tool_tip="Para ver detalhes de cada habilidade permitida, veja a aba correspondente."/>
+ <scroll_list name="role_allowed_actions" tool_tip="Clique na guia Funções para ver mais detalhes"/>
</panel>
<panel name="actions_footer">
<text name="static">
- Descrição
+ Descrição da função
</text>
<text_editor name="action_description">
Essa habilidade permite tirar alguem do grupo. Somente o dono do grupo poderá retirar outro dono do grupo.
</text_editor>
<text name="static2">
- Funções com habilidades
+ Cargos com esta função
</text>
<text name="static3">
- Membros com habilidades
+ Membros com esta função
</text>
</panel>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_groups.xml b/indra/newview/skins/default/xui/pt/panel_groups.xml
index aaea1178a6..0aea0d53dd 100644
--- a/indra/newview/skins/default/xui/pt/panel_groups.xml
+++ b/indra/newview/skins/default/xui/pt/panel_groups.xml
@@ -1,15 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="groups">
<text name="groupdesc" width="268">
- Seu grupo ativo atual es&apos;ta mostrado em negrito.
+ Seu grupo ativo atual está em negrito.
</text>
<text name="groupcount" width="300">
- Você pertence a [COUNT] grupos (de no máximo [MAX]).
+ Você pertence a [COUNT] grupos (máximo [MAX]).
</text>
- <button width="86" label="MI/Chamada" name="IM" tool_tip="Abrir sessão de Mensagem Instantânea"/>
+ <button width="86" label="MI/Ligação" name="IM" tool_tip="Abrir sessão de Mensagem Instantânea"/>
<button width="86" label="Informações" name="Info"/>
<button width="86" label="Ativar" name="Activate"/>
- <button width="86" label="Deixar" name="Leave"/>
+ <button width="86" label="Sair" name="Leave"/>
<button width="86" label="Criar..." name="Create"/>
<button width="86" label="Buscar..." name="Search..."/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_im_control_panel.xml b/indra/newview/skins/default/xui/pt/panel_im_control_panel.xml
new file mode 100644
index 0000000000..91b7d1b7cd
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_im_control_panel.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_im_control_panel">
+ <layout_stack name="button_stack">
+ <layout_panel name="view_profile_btn_panel">
+ <button label="Perfil" name="view_profile_btn"/>
+ </layout_panel>
+ <layout_panel name="add_friend_btn_panel">
+ <button label="Adicionar amigo" name="add_friend_btn"/>
+ </layout_panel>
+ <layout_panel name="teleport_btn_panel">
+ <button label="Teletransportar" name="teleport_btn" tool_tip="Oferecer teletransporte"/>
+ </layout_panel>
+ <layout_panel name="share_btn_panel">
+ <button label="Compartilhar" name="share_btn"/>
+ </layout_panel>
+ <layout_panel name="pay_btn_panel">
+ <button label="Pagar" name="pay_btn"/>
+ </layout_panel>
+ <layout_panel name="call_btn_panel">
+ <button label="Ligar" name="call_btn"/>
+ </layout_panel>
+ <layout_panel name="end_call_btn_panel">
+ <button label="Encerrar ligação" name="end_call_btn"/>
+ </layout_panel>
+ <layout_panel name="voice_ctrls_btn_panel">
+ <button label="Controles de voz" name="voice_ctrls_btn"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_inventory_item.xml b/indra/newview/skins/default/xui/pt/panel_inventory_item.xml
new file mode 100644
index 0000000000..d18047fbcf
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_inventory_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="inventory_item">
+ <text name="item_name" value="..."/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_landmark_info.xml b/indra/newview/skins/default/xui/pt/panel_landmark_info.xml
new file mode 100644
index 0000000000..6196c06d09
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_landmark_info.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="landmark_info">
+ <string name="title_create_landmark" value="Criar Landmark"/>
+ <string name="title_edit_landmark" value="Editar Landmark"/>
+ <string name="title_landmark" value="Landmark"/>
+ <string name="not_available" value="(N\A)"/>
+ <string name="unknown" value="(desconhecido)"/>
+ <string name="public" value="(público)"/>
+ <string name="server_update_text">
+ Informação do lugar não disponível sem atualização do servidor.
+ </string>
+ <string name="server_error_text">
+ Informações sobre esta localização não está disponível neste momento, por favor, tente novamente mais tarde.
+ </string>
+ <string name="server_forbidden_text">
+ Informações sobre esta localização está indisponível devido a restrições de acesso. Por favor, verifique as permissões com o proprietário da parcela.
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </string>
+ <button name="back_btn" tool_tip="Atrás"/>
+ <text name="title" value="Perfil do Lugar"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="maturity_value" value="desconhecido"/>
+ <panel name="landmark_info_panel">
+ <text name="owner_label" value="Proprietário:"/>
+ <text name="creator_label" value="Criador:"/>
+ <text name="created_label" value="Criado:"/>
+ </panel>
+ <panel name="landmark_edit_panel">
+ <text name="title_label" value="Título:"/>
+ <text name="notes_label" value="Minhas notas:"/>
+ <text name="folder_label" value="Localização da Landmark:"/>
+ </panel>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_landmarks.xml b/indra/newview/skins/default/xui/pt/panel_landmarks.xml
new file mode 100644
index 0000000000..3f357bcefe
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_landmarks.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Landmarks">
+ <accordion name="landmarks_accordion">
+ <accordion_tab name="tab_favorites" title="Barra &apos;Destaques&apos;"/>
+ <accordion_tab name="tab_landmarks" title="Meus marcos"/>
+ <accordion_tab name="tab_inventory" title="Meu inventário"/>
+ <accordion_tab name="tab_library" title="Biblioteca"/>
+ </accordion>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Mostrar opções adicionais"/>
+ <button name="add_btn" tool_tip="Adicionar marco"/>
+ <dnd_button name="trash_btn" tool_tip="Excluir marco selecionado"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_login.xml b/indra/newview/skins/default/xui/pt/panel_login.xml
index d7ff3f29df..94a885960a 100644
--- a/indra/newview/skins/default/xui/pt/panel_login.xml
+++ b/indra/newview/skins/default/xui/pt/panel_login.xml
@@ -1,39 +1,40 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="panel_login">
<panel.string name="create_account_url">
- http://join.secondlife.com/index.php?lang=pt-BR
+ http://join.secondlife.com/
</panel.string>
<panel.string name="forgot_password_url">
http://secondlife.com/account/request.php?lang=pt
</panel.string>
-<panel name="login_widgets">
- <text name="first_name_text">
- Primeiro nome:
- </text>
- <text name="last_name_text">
- Sobrenome:
- </text>
- <text name="password_text">
- Senha:
- </text>
- <text name="start_location_text">
- Posição inicial:
- </text>
- <combo_box name="start_location_combo">
- <combo_box.item name="MyHome" label="Minha casa" />
- <combo_box.item name="MyLastLocation" label="Minha última localização" />
- <combo_box.item name="Typeregionname" label="&lt; Digite o nome da região &gt;" />
- </combo_box>
- <check_box label="Lembrar senha" name="remember_check"/>
- <button label="Entrar" label_selected="Entrar" name="connect_btn"/>
- <text name="create_new_account_text">
- Registrar-se para uma conta
- </text>
- <text name="forgot_password_text" left="-240" width="230">
- Esqueceu seu nome de usuário ou senha?
- </text>
- <text name="channel_text">
- [VERSION]
- </text>
-</panel>
+ <layout_stack name="login_widgets">
+ <layout_panel name="login">
+ <text name="username_text">
+ Nome de usuário:
+ </text>
+ <line_editor label="Nome de usuário" name="username_edit" tool_tip="[SECOND_LIFE] Nome de usuário"/>
+ <text name="password_text">
+ Senha:
+ </text>
+ <check_box label="Lembrar senha" name="remember_check"/>
+ <button label="conectar" name="connect_btn"/>
+ <text name="start_location_text">
+ Começar em:
+ </text>
+ <combo_box name="start_location_combo">
+ <combo_box.item label="Última posição" name="MyLastLocation"/>
+ <combo_box.item label="Meu início" name="MyHome"/>
+ </combo_box>
+ </layout_panel>
+ <layout_panel name="links">
+ <text name="create_new_account_text">
+ Cadastre-se
+ </text>
+ <text name="forgot_password_text">
+ Esqueceu seu nome ou senha?
+ </text>
+ <text name="login_help">
+ Precisa de ajuda ao conectar?
+ </text>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_main_inventory.xml b/indra/newview/skins/default/xui/pt/panel_main_inventory.xml
new file mode 100644
index 0000000000..dbf8e4fa52
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_main_inventory.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Coisas" name="main inventory panel">
+ <panel.string name="ItemcountFetching">
+ Reunindo [ITEM_COUNT] itens ... [FILTER]
+ </panel.string>
+ <panel.string name="ItemcountCompleted">
+ [ITEM_COUNT] itens [FILTER]
+ </panel.string>
+ <text name="ItemcountText">
+ Itens:
+ </text>
+ <filter_editor label="Filtro" name="inventory search editor"/>
+ <tab_container name="inventory filter tabs">
+ <inventory_panel label="Todos os itens" name="All Items"/>
+ <recent_inventory_panel label="Itens recentes" name="Recent Items"/>
+ </tab_container>
+ <layout_stack name="bottom_panel">
+ <layout_panel name="options_gear_btn_panel">
+ <button name="options_gear_btn" tool_tip="Mostrar opções adicionais"/>
+ </layout_panel>
+ <layout_panel name="add_btn_panel">
+ <button name="add_btn" tool_tip="Adicionar novo item"/>
+ </layout_panel>
+ <layout_panel name="trash_btn_panel">
+ <dnd_button name="trash_btn" tool_tip="Remover item selecionado"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_me.xml b/indra/newview/skins/default/xui/pt/panel_me.xml
new file mode 100644
index 0000000000..412f75ca78
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_me.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Meu perfil" name="panel_me">
+ <tab_container name="tabs">
+ <panel label="MEU PERFIL" name="panel_profile"/>
+ <panel label="MEUS DESTAQUES" name="panel_picks"/>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_media_settings_general.xml b/indra/newview/skins/default/xui/pt/panel_media_settings_general.xml
new file mode 100644
index 0000000000..43c0820036
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_media_settings_general.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Geral" name="Media Settings General">
+ <text name="home_label">
+ Página web:
+ </text>
+ <text name="home_fails_whitelist_label">
+ (Esta página não atende à lista de páginas aprovadas)
+ </text>
+ <line_editor name="home_url" tool_tip="Website desta mídia"/>
+ <text name="preview_label">
+ Visualizar
+ </text>
+ <text name="current_url_label">
+ Página atual:
+ </text>
+ <text name="current_url" tool_tip="Website desta mídia" value=""/>
+ <button label="Redefinir" name="current_url_reset_btn"/>
+ <check_box initial_value="false" label="Loop contínuo" name="auto_loop"/>
+ <check_box initial_value="false" label="Interagir no primeiro clique" name="first_click_interact"/>
+ <check_box initial_value="false" label="Zoom automático" name="auto_zoom"/>
+ <check_box initial_value="false" label="Mídia auto-executável" name="auto_play"/>
+ <text name="media_setting_note">
+ Nota: Residentes podem redefinir a configuração.
+ </text>
+ <check_box initial_value="false" label="Dimensionamento automático na frente do objeto" name="auto_scale"/>
+ <text name="size_label">
+ Tamanho:
+ </text>
+ <text name="X_label">
+ X
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_media_settings_permissions.xml b/indra/newview/skins/default/xui/pt/panel_media_settings_permissions.xml
new file mode 100644
index 0000000000..55226db274
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_media_settings_permissions.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Customizar" name="Media settings for controls">
+ <text name="controls_label">
+ Controles:
+ </text>
+ <combo_box name="controls">
+ <combo_item name="Standard">
+ Padrão
+ </combo_item>
+ <combo_item name="Mini">
+ Mini
+ </combo_item>
+ </combo_box>
+ <text name="owner_label">
+ Proprietário
+ </text>
+ <check_box initial_value="false" label="Permitir navegação &amp; interatividade" name="perms_owner_interact"/>
+ <check_box initial_value="false" label="Exibir barra de controle" name="perms_owner_control"/>
+ <text name="group_label">
+ Grupo:
+ </text>
+ <check_box initial_value="false" label="Permitir navegação &amp; interatividade" name="perms_group_interact"/>
+ <check_box initial_value="false" label="Exibir barra de controle" name="perms_group_control"/>
+ <text name="anyone_label">
+ Todos
+ </text>
+ <check_box initial_value="false" label="Permitir navegação &amp; interatividade" name="perms_anyone_interact"/>
+ <check_box initial_value="false" label="Exibir barra de controle" name="perms_anyone_control"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_media_settings_security.xml b/indra/newview/skins/default/xui/pt/panel_media_settings_security.xml
new file mode 100644
index 0000000000..646969946c
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_media_settings_security.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Segurança" name="Media Settings Security">
+ <check_box initial_value="false" label="Acesso permitido a URLs com padrão específico" name="whitelist_enable"/>
+ <text name="home_url_fails_some_items_in_whitelist">
+ URLs com falha de acesso na página inicial são indicados com um:
+ </text>
+ <button label="Adicionar" name="whitelist_add"/>
+ <button label="Excluir" name="whitelist_del"/>
+ <text name="home_url_fails_whitelist">
+ Aviso: A página inicial especificada na aba Geral não consta na lista de acesso. Seu acesso será autorizado quando a lista for retificada.
+ </text>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_my_profile.xml b/indra/newview/skins/default/xui/pt/panel_my_profile.xml
new file mode 100644
index 0000000000..b1ca318add
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_my_profile.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Perfil" name="panel_profile">
+ <string name="no_partner_text" value="Nenhum"/>
+ <string name="no_group_text" value="Nenhum"/>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <layout_stack name="layout">
+ <layout_panel name="profile_stack">
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <panel name="second_life_image_panel">
+ <icon label="" name="2nd_life_edit_icon" tool_tip="Clique no botão Editar para trocar a imagem"/>
+ <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <icon label="" name="real_world_edit_icon" tool_tip="Clique no botão Editar para trocar a imagem"/>
+ <text name="title_rw_descr_text" value="Mundo real:"/>
+ </panel>
+ <text name="title_member_text" value="Residente desde:"/>
+ <text name="title_acc_status_text" value="Conta:"/>
+ <text name="title_partner_text" value="Parceiro(a):"/>
+ <panel name="partner_data_panel">
+ <name_box initial_value="(pesquisando)" name="partner_text"/>
+ </panel>
+ <text name="title_groups_text" value="Grupos:"/>
+ </panel>
+ </scroll_container>
+ </layout_panel>
+ <layout_panel name="profile_me_buttons_panel">
+ <button label="Editar perfil" name="edit_profile_btn" tool_tip="Editar dados pessoais"/>
+ <button label="Editar aparência" name="edit_appearance_btn" tool_tip="Criar/editar aparência: físico, roupas, etc."/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_navigation_bar.xml b/indra/newview/skins/default/xui/pt/panel_navigation_bar.xml
new file mode 100644
index 0000000000..01930bf3b3
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_navigation_bar.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="navigation_bar">
+ <panel name="navigation_panel">
+ <pull_button name="back_btn" tool_tip="Voltar para região anterior"/>
+ <pull_button name="forward_btn" tool_tip="Avançar uma região"/>
+ <button name="home_btn" tool_tip="Teletransportar para meu início"/>
+ <location_input label="Onde" name="location_combo"/>
+ <search_combo_box label="Busca" name="search_combo_box" tool_tip="Busca">
+ <combo_editor label="Buscar no [SECOND_LIFE]" name="search_combo_editor"/>
+ </search_combo_box>
+ </panel>
+ <favorites_bar name="favorite" tool_tip="Arraste marcos para cá para acessar seus lugares preferidos do Second Life!">
+ <label name="favorites_bar_label" tool_tip="Arraste marcos para cá para acessar seus lugares preferidos do Second Life!">
+ Barra Destaques
+ </label>
+ <chevron_button name="&gt;&gt;" tool_tip="Mostrar mais favoritos"/>
+ </favorites_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml b/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml
new file mode 100644
index 0000000000..bdbf29e70b
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_nearby_chat.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- All our XML is utf-8 encoded. -->
+<panel name="nearby_chat">
+ <panel name="chat_caption">
+ <text name="sender_name">
+ Bate-papo local
+ </text>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/pt/panel_nearby_chat_bar.xml
new file mode 100644
index 0000000000..9b993488be
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_nearby_chat_bar.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="chat_bar">
+ <line_editor label="Clique aqui para bater papo." name="chat_box" tool_tip="Tecle Enter para falar, Ctrl+Enter para gritar"/>
+ <button name="show_nearby_chat" tool_tip="Mostra/oculta o histórico do bate-papo local"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_nearby_media.xml b/indra/newview/skins/default/xui/pt/panel_nearby_media.xml
new file mode 100644
index 0000000000..8d08177eed
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_nearby_media.xml
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="nearby_media">
+ <string name="media_item_count_format">
+ (%ld itens de mídia)
+ </string>
+ <string name="empty_item_text">
+ &lt;vazio&gt;
+ </string>
+ <string name="parcel_media_name">
+ Mídia em stream deste lote
+ </string>
+ <string name="parcel_audio_name">
+ Ãudio em stream do lote
+ </string>
+ <string name="playing_suffix">
+ (em execução)
+ </string>
+ <panel name="minimized_controls">
+ <button label="Parar tudo" name="all_nearby_media_disable_btn" tool_tip="Desligar mídias por perto"/>
+ <button label="Executar tudo" name="all_nearby_media_enable_btn" tool_tip="Ligar mídias por perto"/>
+ <button name="open_prefs_btn" tool_tip="Preferências de mídia"/>
+ <button label="Mais &gt;&gt;" label_selected="Menos &lt;&lt;" name="more_btn" tool_tip="Controles avançados"/>
+ <button label="Mais &gt;&gt;" label_selected="Menos &lt;&lt;" name="less_btn" tool_tip="Controles avançados"/>
+ </panel>
+ <panel name="nearby_media_panel">
+ <combo_box name="show_combo">
+ <combo_box.item label="Tudo" name="All"/>
+ <combo_box.item label="Neste lote" name="WithinParcel"/>
+ <combo_box.item label="Fora deste lote" name="OutsideParcel"/>
+ <combo_box.item label="Nos outros avatares" name="OnOthers"/>
+ </combo_box>
+ <scroll_list name="media_list">
+ <scroll_list.columns label="Proximidade" name="media_proximity"/>
+ <scroll_list.columns label="Visíveis" name="media_visibility"/>
+ <scroll_list.columns label="Classe" name="media_class"/>
+ <scroll_list.columns label="Nome" name="media_name"/>
+ <scroll_list.columns label="Depurar" name="media_debug"/>
+ </scroll_list>
+ <panel>
+ <layout_stack name="media_controls">
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="Parar mídia selecionada"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="Tocar mídia selecionada"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="Pausar mídia selecionada"/>
+ </layout_panel>
+ <layout_panel name="volume_slider_ctrl">
+ <slider_bar initial_value="0.5" name="volume_slider" tool_tip="Volume da mídia selecionada"/>
+ </layout_panel>
+ <layout_panel name="mute">
+ <button name="mute_btn" tool_tip="Silenciar mídia selecionada"/>
+ </layout_panel>
+ <layout_panel name="zoom">
+ <button name="zoom_btn" tool_tip="Enfocar mídia"/>
+ </layout_panel>
+ <layout_panel name="unzoom">
+ <button name="unzoom_btn" tool_tip="Desenfocar mídia selecionada"/>
+ </layout_panel>
+ </layout_stack>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_notes.xml b/indra/newview/skins/default/xui/pt/panel_notes.xml
new file mode 100644
index 0000000000..9aa842d9a5
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_notes.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Anotações e Privacidade" name="panel_notes">
+ <layout_stack name="layout">
+ <panel name="notes_stack">
+ <scroll_container name="profile_scroll">
+ <panel name="profile_scroll_panel">
+ <text name="status_message" value="Minhas anotações privadas:"/>
+ <text name="status_message2" value="Deixar esta pessoa:"/>
+ <check_box label="Ver meu status" name="status_check"/>
+ <check_box label="Ver minha localização no mapa" name="map_check"/>
+ <check_box label="Pegar, editar ou excluir objetos meus" name="objects_check"/>
+ </panel>
+ </scroll_container>
+ </panel>
+ <panel name="notes_buttons_panel">
+ <button label="Adicionar amigo" name="add_friend" tool_tip="Oferecer amizade ao residente"/>
+ <button label="MI" name="im" tool_tip="Abrir sessão de mensagem instantânea"/>
+ <button label="Ligar" name="call" tool_tip="Ligar para este residente"/>
+ <button label="Mapa" name="show_on_map_btn" tool_tip="Exibir o residente no mapa"/>
+ <button label="Teletransportar" name="teleport" tool_tip="Oferecer teletransporte"/>
+ </panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_online_status.xml b/indra/newview/skins/default/xui/pt/panel_online_status.xml
new file mode 100644
index 0000000000..fdc489f375
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_online_status.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="friend_online_status" name="friend_online_status"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_online_status_toast.xml b/indra/newview/skins/default/xui/pt/panel_online_status_toast.xml
new file mode 100644
index 0000000000..fdc489f375
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_online_status_toast.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="friend_online_status" name="friend_online_status"/>
diff --git a/indra/newview/skins/default/xui/pt/panel_outfit_edit.xml b/indra/newview/skins/default/xui/pt/panel_outfit_edit.xml
new file mode 100644
index 0000000000..bbf5b397c3
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_outfit_edit.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray Outfit Edit panel -->
+<panel label="Editar look" name="outfit_edit">
+ <string name="No Outfit" value="Nenhum"/>
+ <string name="unsaved_changes" value="Mudanças não salvas"/>
+ <string name="now_editing" value="Editando..."/>
+ <panel.string name="not_available">
+ (N\A)
+ </panel.string>
+ <panel.string name="unknown">
+ (Desconhecido)
+ </panel.string>
+ <string name="Filter.All" value="Tudo"/>
+ <string name="Filter.Clothes/Body" value="Roupas/Corpo"/>
+ <string name="Filter.Objects" value="Objects"/>
+ <string name="Filter.Custom" value="Filtro personalizado"/>
+ <text name="title" value="Editar look"/>
+ <panel label="bottom_panel" name="header_panel">
+ <panel label="bottom_panel" name="outfit_name_and_status">
+ <text name="status" value="Editando..."/>
+ <text name="curr_outfit_name" value="[Look atual]"/>
+ </panel>
+ </panel>
+ <layout_stack name="im_panels">
+ <layout_panel label="Painel de controle de MIs" name="outfit_wearables_panel">
+ <layout_stack name="filter_panels">
+ <layout_panel name="add_button_and_combobox">
+ <button label="Adicionar mais..." name="show_add_wearables_btn"/>
+ </layout_panel>
+ <layout_panel name="filter_panel">
+ <filter_editor label="Filtrar itens de vestuário" name="look_item_filter"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="add_wearables_panel"/>
+ </layout_stack>
+ <panel name="save_revert_button_bar">
+ <button label="Salvar" name="save_btn"/>
+ <button label="Reverter" name="revert_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/pt/panel_outfits_inventory.xml
new file mode 100644
index 0000000000..10ef2a332f
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_outfits_inventory.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Coisas" name="Outfits">
+ <tab_container name="appearance_tabs">
+ <panel label="MEUS LOOKS" name="outfitslist_tab"/>
+ <inventory_panel label="EM USO" name="cof_tab"/>
+ </tab_container>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Mostrar opções adicionais"/>
+ <dnd_button name="trash_btn" tool_tip="Remover item selecionado"/>
+ <button label="Salvar como" name="save_btn"/>
+ <button label="Vestir" name="wear_btn" tool_tip="Vestir look selecionado"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_outfits_inventory_gear_default.xml b/indra/newview/skins/default/xui/pt/panel_outfits_inventory_gear_default.xml
new file mode 100644
index 0000000000..736b8f1fdd
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_outfits_inventory_gear_default.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<menu name="menu_gear_default">
+ <menu_item_call label="Substituir look atual" name="wear"/>
+ <menu_item_call label="Adicionar ao look atual" name="add"/>
+ <menu_item_call label="Tirar do look atual" name="remove"/>
+ <menu_item_call label="Renomear" name="rename"/>
+ <menu_item_call label="Remover link" name="remove_link"/>
+ <menu_item_call label="Excluir visual" name="delete"/>
+</menu>
diff --git a/indra/newview/skins/default/xui/pt/panel_people.xml b/indra/newview/skins/default/xui/pt/panel_people.xml
new file mode 100644
index 0000000000..efeea89fa9
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_people.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray panel -->
+<panel label="Pessoas" name="people_panel">
+ <string name="no_recent_people" value="Ninguém, recentemente. Em busca de alguém para conversar? Use a [secondlife:///app/search/people Busca] ou o [secondlife:///app/worldmap Mapa-Múndi]."/>
+ <string name="no_filtered_recent_people" value="Não encontrou o que procura? Tente buscar no [secondlife:///app/search/people/[SEARCH_TERM] Search]."/>
+ <string name="no_one_near" value="Ninguém por perto Em busca de alguém para conversar? Use a [secondlife:///app/search/people Busca] ou o [secondlife:///app/worldmap Mapa-Múndi]."/>
+ <string name="no_one_filtered_near" value="Não encontrou o que procura? Tente buscar no [secondlife:///app/search/people/[SEARCH_TERM] Search]."/>
+ <string name="no_friends_online" value="Nenhum amigo online"/>
+ <string name="no_friends" value="Nenhum amigo"/>
+ <string name="no_friends_msg">
+ Encontre amigos fazendo uma [secondlife:///app/search/people busca de pessoas] ou clique em um residente para adicioná-lo.
+Em busca de alguém para conversar? Procure no [secondlife:///app/worldmap Mapa-Múndi].
+ </string>
+ <string name="no_filtered_friends_msg">
+ Não encontrou o que procura? Tente buscar no [secondlife:///app/search/people/[SEARCH_TERM] Search].
+ </string>
+ <string name="people_filter_label" value="Filtro de pessoas"/>
+ <string name="groups_filter_label" value="Filtro de grupos"/>
+ <string name="no_filtered_groups_msg" value="Não encontrou o que procura? Tente buscar no [secondlife:///app/search/groups/[SEARCH_TERM] Search]."/>
+ <string name="no_groups_msg" value="À procura de grupos interessantes? Tente fazer uma [secondlife:///app/search/groups Busca]."/>
+ <filter_editor label="Filtro" name="filter_input"/>
+ <tab_container name="tabs">
+ <panel label="PROXIMIDADE" name="nearby_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="nearby_view_sort_btn" tool_tip="Opções"/>
+ <button name="add_friend_btn" tool_tip="Adicionar o residente selecionado para sua lista de amigos"/>
+ </panel>
+ </panel>
+ <panel label="MEUS AMIGOS" name="friends_panel">
+ <accordion name="friends_accordion">
+ <accordion_tab name="tab_online" title="Online"/>
+ <accordion_tab name="tab_all" title="Todos"/>
+ </accordion>
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="friends_viewsort_btn" tool_tip="Opções"/>
+ <button name="add_btn" tool_tip="Oferecer amizade para um residente"/>
+ <button name="del_btn" tool_tip="Remover a pessoa selecionada da sua lista de amigos"/>
+ </panel>
+ </panel>
+ <panel label="MEUS GRUPOS" name="groups_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="groups_viewsort_btn" tool_tip="Opções"/>
+ <button name="plus_btn" tool_tip="Ingressar em um grupo/Criar novo grupo"/>
+ <button name="activate_btn" tool_tip="Ativar o grupo selecionado"/>
+ </panel>
+ </panel>
+ <panel label="RECENTE" name="recent_panel">
+ <panel label="bottom_panel" name="bottom_panel">
+ <button name="recent_viewsort_btn" tool_tip="Opções"/>
+ <button name="add_friend_btn" tool_tip="Adicionar o residente selecionado para sua lista de amigos"/>
+ </panel>
+ </panel>
+ </tab_container>
+ <panel name="button_bar">
+ <button label="Perfil" name="view_profile_btn" tool_tip="Exibir fotografia, grupos e outras informações dos residentes" width="50"/>
+ <button label="MI" name="im_btn" tool_tip="Iniciar MI" width="24"/>
+ <button label="Chamada" name="call_btn" tool_tip="Ligar para este residente" width="61"/>
+ <button label="Compartilhar" name="share_btn" tool_tip="Compartilhar item de inventário" width="82"/>
+ <button label="Teletransporte" name="teleport_btn" tool_tip="Oferecer teletransporte" width="86"/>
+ <button label="Perfil do grupo" name="group_info_btn" tool_tip="Exibir informação de grupo"/>
+ <button label="Bate-papo de grupo" name="chat_btn" tool_tip="Iniciar bate-papo"/>
+ <button label="Ligar para o grupo" name="group_call_btn" tool_tip="Ligar para este grupo"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_pick_info.xml b/indra/newview/skins/default/xui/pt/panel_pick_info.xml
new file mode 100644
index 0000000000..007965a8c9
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_pick_info.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_pick_info">
+ <text name="title" value="Detalhes do destaque"/>
+ <scroll_container name="profile_scroll">
+ <panel name="scroll_content_panel">
+ <text name="pick_name" value="[NAME]"/>
+ <text name="pick_location" value="[carregando...]"/>
+ <text name="pick_desc" value="[descrição]"/>
+ </panel>
+ </scroll_container>
+ <panel name="buttons">
+ <button label="Teletransportar" name="teleport_btn"/>
+ <button label="Mapa" name="show_on_map_btn"/>
+ <button label="Editar" name="edit_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_picks.xml b/indra/newview/skins/default/xui/pt/panel_picks.xml
new file mode 100644
index 0000000000..453954bc3e
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_picks.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Destaques" name="panel_picks">
+ <string name="no_picks" value="Sem destaques"/>
+ <string name="no_classifieds" value="Sem classificados"/>
+ <text name="empty_picks_panel_text">
+ Não ha nenhum destaque/ classificado aqui
+ </text>
+ <accordion name="accordion">
+ <accordion_tab name="tab_picks" title="Destaques"/>
+ <accordion_tab name="tab_classifieds" title="Classificados"/>
+ </accordion>
+ <panel label="bottom_panel" name="edit_panel">
+ <button name="new_btn" tool_tip="Criar um novo destaque ou classificado na localização atual"/>
+ </panel>
+ <panel name="buttons_cucks">
+ <button label="Info" name="info_btn" tool_tip="Exibir informação de destaque"/>
+ <button label="Teletransportar" name="teleport_btn" tool_tip="Teletransportar para a área correspondente"/>
+ <button label="Mapa" name="show_on_map_btn" tool_tip="Exibir a área correspondente no Mapa Mundi"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_place_profile.xml b/indra/newview/skins/default/xui/pt/panel_place_profile.xml
new file mode 100644
index 0000000000..03f997f31b
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_place_profile.xml
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="place_profile">
+ <string name="on" value="Ligar"/>
+ <string name="off" value="Desligar"/>
+ <string name="anyone" value="Todos"/>
+ <string name="available" value="disponível"/>
+ <string name="allocated" value="alocados"/>
+ <string name="title_place" value="Perfil da região"/>
+ <string name="title_teleport_history" value="Teletransportes"/>
+ <string name="not_available" value="(N\A)"/>
+ <string name="unknown" value="(Desconhecido)"/>
+ <string name="public" value="(público)"/>
+ <string name="none_text" value="(nenhum)"/>
+ <string name="sale_pending_text" value="(Venda em andamento)"/>
+ <string name="group_owned_text" value="(Propriedade do grupo)"/>
+ <string name="price_text" value="L$"/>
+ <string name="area_text" value="m²"/>
+ <string name="all_residents_text" value="Todos os residentes"/>
+ <string name="group_text" value="Grupo"/>
+ <string name="can_resell">
+ Esta região permite a compra e venda de lotes.
+ </string>
+ <string name="can_not_resell">
+ Esta região não permite a compra e venda de lotes.
+ </string>
+ <string name="can_change">
+ Esta região permite a junção ou subdivisão de lotes.
+ </string>
+ <string name="can_not_change">
+ Esta região não permite a junção ou subdivisão de lotes.
+ </string>
+ <string name="server_update_text">
+ Dados sobre o local requerem atualização do servidor.
+ </string>
+ <string name="server_error_text">
+ Dados sobre o local não disponíveis no momento. Favor tentar mais tarde.
+ </string>
+ <string name="server_forbidden_text">
+ Dados sobre o local controlados por lista de acesso. Verifique se você está autorizado a acessá-los com o dono do lote.
+ </string>
+ <string name="acquired_date">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </string>
+ <button name="back_btn" tool_tip="Atrás"/>
+ <text name="title" value="Perfil da região"/>
+ <scroll_container name="place_scroll">
+ <panel name="scrolling_panel">
+ <text name="owner_label" value="Proprietário:"/>
+ <text name="maturity_value" value="(Desconhecido)"/>
+ <accordion name="advanced_info_accordion">
+ <accordion_tab name="parcel_characteristics_tab" title="Lote">
+ <panel name="parcel_characteristics_panel">
+ <text name="rating_label" value="Classificação:"/>
+ <text name="rating_value" value="desconhecido"/>
+ <text name="voice_label" value="Voz:"/>
+ <text name="voice_value" value="Ligar"/>
+ <text name="fly_label" value="Voar:"/>
+ <text name="fly_value" value="Ligar"/>
+ <text name="push_label" value="Empurrar:"/>
+ <text name="push_value" value="Desligar"/>
+ <text name="build_label" value="Construir:"/>
+ <text name="build_value" value="Ligar"/>
+ <text name="scripts_label" value="Scripts:"/>
+ <text name="scripts_value" value="Ligar"/>
+ <text name="damage_label" value="Dano:"/>
+ <text name="damage_value" value="Desligar"/>
+ <button label="Sobre terrenos" name="about_land_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="region_information_tab" title="Região">
+ <panel name="region_information_panel">
+ <text name="region_name_label" value="Região:"/>
+ <text name="region_name" value="Alcelândia"/>
+ <text name="region_type_label" value="Tipo:"/>
+ <text name="region_type" value="Alce"/>
+ <text name="region_rating_label" value="Classificação:"/>
+ <text name="region_rating" value="Adulto"/>
+ <text name="region_owner_label" value="Proprietário:"/>
+ <text name="region_owner" value="moose Van Moose"/>
+ <text name="region_group_label" value="Grupo:"/>
+ <text name="region_group">
+ The Mighty Moose of mooseville soundvillemoose
+ </text>
+ <button label="Região/Propriedade" name="region_info_btn"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="estate_information_tab" title="Propriedade">
+ <panel name="estate_information_panel">
+ <text name="estate_name_label" value="Propriedade:"/>
+ <text name="estate_rating_label" value="Classificação:"/>
+ <text name="estate_owner_label" value="Proprietário:"/>
+ <text name="covenant_label" value="Contrato:"/>
+ </panel>
+ </accordion_tab>
+ <accordion_tab name="sales_tab" title="À venda">
+ <panel name="sales_panel">
+ <text name="sales_price_label" value="Preço:"/>
+ <text name="area_label" value="Ãrea:"/>
+ <text name="traffic_label" value="Trânsito:"/>
+ <text name="primitives_label" value="Prims:"/>
+ <text name="parcel_scripts_label" value="Scripts:"/>
+ <text name="terraform_limits_label" value="Limite de terraplenagem:"/>
+ <text name="subdivide_label" value="Capacidade de juntar/subdividir:"/>
+ <text name="resale_label" value="Revenda:"/>
+ <text name="sale_to_label" value="À venda para:"/>
+ </panel>
+ </accordion_tab>
+ </accordion>
+ </panel>
+ </scroll_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_places.xml b/indra/newview/skins/default/xui/pt/panel_places.xml
new file mode 100644
index 0000000000..5f2c56ab8c
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_places.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Lugares" name="places panel">
+ <string name="landmarks_tab_title" value="MEUS MARCOS"/>
+ <string name="teleport_history_tab_title" value="TELETRANSPORTES"/>
+ <filter_editor label="Filtrar meus lugares" name="Filter"/>
+ <panel name="button_panel">
+ <button label="Teletransportar" name="teleport_btn" tool_tip="Teletransportar para a área selecionada"/>
+ <button label="Mapa" name="map_btn" tool_tip="Mostrar a área no Mapa Múndi"/>
+ <button label="Editar" name="edit_btn" tool_tip="Editar dados do marco"/>
+ <button label="▼" name="overflow_btn" tool_tip="Mostrar opções adicionais"/>
+ <button label="Salvar" name="save_btn"/>
+ <button label="Cancelar" name="cancel_btn"/>
+ <button label="Fechar" name="close_btn"/>
+ <button label="Perfil" name="profile_btn" tool_tip="Mostrar perfil do lugar"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml b/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml
index 5ca80bd74d..13cb8a444e 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_advanced.xml
@@ -1,12 +1,37 @@
<?xml version="1.0" encoding="utf-8"?>
-<panel name="advanced">
- <text name="AspectRatioLabel1" tool_tip="largura / altura">
- Relação de Aspecto:
+<panel label="Avançado" name="advanced">
+ <panel.string name="aspect_ratio_text">
+ [NUM]:[DEN]
+ </panel.string>
+ <panel.string name="middle_mouse">
+ Botão do meio do mouse
+ </panel.string>
+ <slider label="Ângulo de visão" name="camera_fov"/>
+ <slider label="Distância" name="camera_offset_scale"/>
+ <text name="heading2">
+ Posicionamento automático da:
</text>
- <combo_box name="aspect_ratio" tool_tip="largura / altura">
- <combo_box.item label="4:3 (CRT Padrão)" name="item1"/>
- <combo_box.item label="5:4 (1280x1024 LCD)" name="item2"/>
- <combo_box.item label="8:5 (tela ampla)" name="item3"/>
- <combo_box.item label="16:9 (tela ampla)" name="item4"/>
- </combo_box>
+ <check_box label="Construção/Edição" name="edit_camera_movement" tool_tip="Use o posicionamento automático da câmera quando entrar e sair do modo de edição"/>
+ <check_box label="Aparência" name="appearance_camera_movement" tool_tip="Use o posicionamento automático da câmera quando em modo de edição"/>
+ <check_box initial_value="verdadeiro" label="Barra lateral" name="appearance_sidebar_positioning" tool_tip="Usar posicionamento automático da câmera na barra lateral"/>
+ <check_box label="Mostre-me em visão de mouse" name="first_person_avatar_visible"/>
+ <check_box label="Teclas de seta sempre me movem" name="arrow_keys_move_avatar_check"/>
+ <check_box label="Dê dois toques e pressione para correr" name="tap_tap_hold_to_run"/>
+ <check_box label="Mover os lábios do avatar ao falar" name="enable_lip_sync"/>
+ <check_box label="Balão de bate-papo" name="bubble_text_chat"/>
+ <slider label="Opacidade" name="bubble_chat_opacity"/>
+ <color_swatch name="background" tool_tip="Cor do balão de bate-papo"/>
+ <text name="UI Size:">
+ Interface
+ </text>
+ <check_box label="Mostrar erros de script" name="show_script_errors"/>
+ <radio_group name="show_location">
+ <radio_item label="Bate-papo local" name="0"/>
+ <radio_item label="Janelas separadas" name="1"/>
+ </radio_group>
+ <check_box label="Tecla liga/desliga da minha voz:" name="push_to_talk_toggle_check" tool_tip="Quando em modo de alternância, pressione e solte o botão UMA vez para ligar e desligar o microfone. Quando em modo de alternância, o microfone só transmite sua voz quando o botão estiver pressionado."/>
+ <line_editor label="Botão apertar e falar" name="modifier_combo"/>
+ <button label="Definir tecla" name="set_voice_hotkey_button"/>
+ <button label="Botão do meio do mouse" name="set_voice_middlemouse_button" tool_tip="Redefinir como botão do meio do mouse"/>
+ <button label="Outros dispositivos" name="joystick_setup_button"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_alerts.xml b/indra/newview/skins/default/xui/pt/panel_preferences_alerts.xml
index e060d784da..2ffe720ccf 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_alerts.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_alerts.xml
@@ -1,18 +1,14 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Popups" name="popups" title="Popups">
- <text name="dont_show_label">
- Não mostrar estas popups:
+ <text name="tell_me_label">
+ Avisar:
</text>
- <button label="Habilitar esta popup" label_selected="Habilitar este popup" name="enable_popup"/>
- <button label="Habilitar todas as popups..." label_selected="Reiniciar Dialogos que serão mostrados na próxima vez..." name="reset_dialogs_btn" tool_tip="Habilitar todas as popups opcionais e notificações de “primeiro usoâ€." width="200"/>
+ <check_box label="Quando eu gasto ou recebo L$" name="notify_money_change_checkbox"/>
+ <check_box label="Quando meus amigos entram e saem" name="friends_online_notify_checkbox"/>
<text name="show_label">
- Mostrar estas popups:
+ Mostrar sempre:
</text>
- <button label="Desabilitar todas estas popups..." name="skip_dialogs_btn" tool_tip="Desabilitar todas as popups opcionais e notificações de “primeiro usoâ€." width="200"/>
- <text name="text_box2">
- Ofertas de notecards, texturas e landmarks:
+ <text name="dont_show_label">
+ Nunca mostrar:
</text>
- <check_box label="Aceitar automaticamente" name="accept_new_inventory"/>
- <check_box label="Visualizar automaticamente após aceitar" name="show_new_inventory"/>
- <check_box label="Mostrar automaticamente objetos aceitos recentemente no inventário." name="show_in_inventory"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml
index aa40f97fe3..02b0ef35fe 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml
@@ -1,17 +1,19 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Chat" name="chat">
- <text name="text_box">
- Tamanho da Fonte
-do Chat:
+ <text name="font_size">
+ Tamanho da fonte:
</text>
<radio_group name="chat_font_size">
- <radio_item name="radio" label="Pequeno" />
- <radio_item name="radio2" label="Médio" />
- <radio_item name="radio3" label="Grande" />
+ <radio_item label="Pequeno" name="radio" value="0"/>
+ <radio_item label="Médio" name="radio2" value="1"/>
+ <radio_item label="Grande" name="radio3" value="2"/>
</radio_group>
+ <text name="font_colors">
+ Cor da fonte:
+ </text>
<color_swatch label="Você" name="user"/>
<text name="text_box1">
- Você
+ Eu
</text>
<color_swatch label="Outros" name="agent"/>
<text name="text_box2">
@@ -37,23 +39,21 @@ do Chat:
<text name="text_box7">
Dono
</text>
- <color_swatch label="Bolha" name="background"/>
- <text name="text_box8">
- Bolha
- </text>
<color_swatch label="URLs" name="links"/>
<text name="text_box9">
URLs
</text>
- <check_box label="Mostrar Erros de Script e avisos como chat comum" name="script_errors_as_chat"/>
- <spinner label="Ocultar Chat depois" label_width="108" name="fade_chat_time" width="160"/>
- <spinner left="373" name="max_chat_count"/>
- <slider label="Opacidade" name="console_opacity"/>
- <check_box label="Use a largura total da tela (Precisa reiniciar)" name="chat_full_width_check"/>
- <check_box label="Feche a barra de conversa após pressionar retornar" name="close_chat_on_return_check"/>
- <check_box label="Teclas de Setas sempre movem o avatar durante a conversa" name="arrow_keys_move_avatar_check"/>
- <check_box label="Mostrar a hora na conversa local" name="show_timestamps_check"/>
- <check_box label="Executar animação digitada quando estiver conversando" name="play_typing_animation"/>
- <check_box label="Mostrar bolhas do chat" name="bubble_text_chat"/>
- <slider label="Opacidade" name="bubble_chat_opacity"/>
+ <check_box initial_value="true" label="Executar animação digitada quando estiver conversando" name="play_typing_animation"/>
+ <check_box label="Enviar MIs por email se estiver desconectado" name="send_im_to_email"/>
+ <check_box label="Ativar MIs e bate-papos de texto simples" name="plain_text_chat_history"/>
+ <text name="show_ims_in_label">
+ Mostrar MIs em:
+ </text>
+ <text name="requires_restart_label">
+ (Reinicie para ativar)
+ </text>
+ <radio_group name="chat_window" tool_tip="Exibir cada bate-papo em uma janela separada ou exibir todos em uma única janela com uma aba para cada pessoa (requer reinício)">
+ <radio_item label="Janelas separadas" name="radio" value="0"/>
+ <radio_item label="Guias" name="radio2" value="1"/>
+ </radio_group>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_general.xml b/indra/newview/skins/default/xui/pt/panel_preferences_general.xml
index 8bde39545c..8a34897c9b 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_general.xml
@@ -1,90 +1,67 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Geral" name="general_panel">
- <combo_box name="start_location_combo">
- <combo_box.item name="MyHome" tool_tip="Como padrão, registrar na minha casa." label="Minha Casa"/>
- <combo_box.item name="MyLastLocation" tool_tip="Por padrão, registrar na minha última localidade." label="Minha Última Localidade"/>
- </combo_box>
- <check_box label="Mostrar Posição Inicial na Tela de Login" name="show_location_checkbox"/>
- <combo_box name="fade_out_combobox">
- <combo_box.item name="Never" label="Nunca"/>
- <combo_box.item name="Show Temporarily" label="Mostrar Temporariamente"/>
- <combo_box.item name="Always" label="Sempre"/>
- </combo_box>
- <check_box label="Avatar com Nomes Pequenos" name="small_avatar_names_checkbox"/>
- <check_box label="Ocultar meu Nome na minha Tela" name="show_my_name_checkbox"/>
- <text name="group_titles_textbox">
- Títulos dos Grupos:
- </text>
- <check_box label="Ocultar todos os Títulos de Grupos" name="show_all_title_checkbox"/>
- <check_box label="Ocultar meu Título no Grupo" name="show_my_title_checkbox"/>
- <color_swatch label="" name="effect_color_swatch" tool_tip="Clique para abrir o seletor de cores"/>
- <text name="UI Size:">
- Tamanho da UI:
+ <text name="language_textbox">
+ Idioma:
</text>
- <check_box label="Usar escala independente da resolução" name="ui_auto_scale"/>
- <spinner label="Tempo para ficar Ausente:" name="afk_timeout_spinner"/>
- <check_box label="Avisar quando receber ou gastar Linden dollars (L$)" name="notify_money_change_checkbox"/>
- <text name="maturity_desired_label">
- Classificação:
+ <combo_box name="language_combobox">
+ <combo_box.item label="Padrão" name="System Default Language"/>
+ <combo_box.item label="English (Inglês)" name="English"/>
+ <combo_box.item label="Dansk (Dinamarquês) - Beta" name="Danish"/>
+ <combo_box.item label="Deutsch (Alemão) - Beta" name="Deutsch(German)"/>
+ <combo_box.item label="Español (Espanhol) - Beta" name="Spanish"/>
+ <combo_box.item label="Français (Francês) - Beta" name="French"/>
+ <combo_box.item label="Italiano - Beta" name="Italian"/>
+ <combo_box.item label="Nederlands (Holandês) - Beta" name="Dutch"/>
+ <combo_box.item label="Polski (Polonês) - Beta" name="Polish"/>
+ <combo_box.item label="Português - Beta" name="Portugese"/>
+ <combo_box.item label="日本語 (Japonês) - Beta" name="(Japanese)"/>
+ </combo_box>
+ <text name="language_textbox2">
+ (Reinicie para trocar de idioma)
</text>
<text name="maturity_desired_prompt">
- Eu quero acessar conteúdo classificado:
+ Quero acessar conteúdo:
</text>
+ <text name="maturity_desired_textbox"/>
<combo_box name="maturity_desired_combobox">
- <combo_box.item name="Desired_Adult" label="PG, Mature e Adult"/>
- <combo_box.item name="Desired_Mature" label="PG e Mature"/>
- <combo_box.item name="Desired_PG" label="PG"/>
+ <combo_box.item label="Geral, Moderado e Adulto" name="Desired_Adult"/>
+ <combo_box.item label="Geral e Moderado" name="Desired_Mature"/>
+ <combo_box.item label="Geral" name="Desired_PG"/>
</combo_box>
- <text name="maturity_desired_textbox">
- PG
- </text>
<text name="start_location_textbox">
- Posição Inicial:
+ Posição inicial:
</text>
- <text name="show_names_textbox">
- Mostrar Nomes:
+ <combo_box name="start_location_combo">
+ <combo_box.item label="Última localização" name="MyLastLocation" tool_tip="Voltar ao lugar onde estava antes."/>
+ <combo_box.item label="Meu início" name="MyHome" tool_tip="Voltar ao meu início."/>
+ </combo_box>
+ <check_box initial_value="true" label="Mostrar ao entrar" name="show_location_checkbox"/>
+ <text name="name_tags_textbox">
+ Mostrar nomes:
</text>
+ <radio_group name="Name_Tag_Preference">
+ <radio_item label="Desligar" name="radio" value="0"/>
+ <radio_item label="Ligar" name="radio2" value="1"/>
+ <radio_item label="Brevemente" name="radio3" value="2"/>
+ </radio_group>
+ <check_box label="Mostrar meu nome" name="show_my_name_checkbox1"/>
+ <check_box initial_value="true" label="Nome curto" name="small_avatar_names_checkbox"/>
+ <check_box label="Mostrar cargo" name="show_all_title_checkbox1"/>
<text name="effects_color_textbox">
- Cores para Meus Efeitos:
- </text>
- <text name="seconds_textbox">
- segundos
- </text>
- <text name="crash_report_textbox">
- Relatórios de Falhas:
- </text>
- <text name="language_textbox">
- Linguagem:
+ Meus efeitos:
</text>
- <text name="language_textbox2">
- (Precisa de reinício para efetivar)
+ <text name="title_afk_text">
+ Entrar no modo ausente em:
</text>
- <string name="region_name_prompt">
- Digite o nome da Região
- </string>
- <combo_box name="crash_behavior_combobox">
- <combo_box.item name="Askbeforesending" label="Perguntar antes de enviar"/>
- <combo_box.item name="Alwayssend" label="Sempre enviar"/>
- <combo_box.item name="Neversend" label="Nunca Enviar"/>
- </combo_box>
- <combo_box name="language_combobox">
- <combo_box.item name="System Default Language" label="Padrão do Sistema"/>
- <combo_box.item name="English" label="English (Inglês)"/>
- <combo_box.item name="Danish" label="Dansk (Dinamarquês) - Beta"/>
- <combo_box.item name="Deutsch(German)" label="Deutsch (Alemão) - Beta"/>
- <combo_box.item name="Spanish" label="Español (Espanhol) - Beta"/>
- <combo_box.item name="French" label="Français (Francês) - Beta"/>
- <combo_box.item name="Italian" label="Italiano - Beta"/>
- <combo_box.item name="Hungarian" label="Magyar (Húngaro) - Beta"/>
- <combo_box.item name="Dutch" label="Nederlands (Holandês) - Beta"/>
- <combo_box.item name="Polish" label="Polski (Polonês) - Beta"/>
- <combo_box.item name="Portugese" label="Português - Beta"/>
- <combo_box.item name="Russian" label="РуÑÑкий (Russo) - Beta"/>
- <combo_box.item name="Turkish" label="Türkçe (Turco) - Beta"/>
- <combo_box.item name="Ukrainian" label="УкраїнÑька (Ucraniano) - Beta"/>
- <combo_box.item name="Chinese" label="中文 (简体) (Chinês) - Beta"/>
- <combo_box.item name="(Japanese)" label="日本語 (Japonês) - Beta"/>
- <combo_box.item name="(Korean)" label="한국어 (Coreano) - Beta"/>
+ <color_swatch label="" name="effect_color_swatch" tool_tip="Clique para abrir o seletor de cores"/>
+ <combo_box label="Entrar no modo ausente em:" name="afk">
+ <combo_box.item label="2 minutos" name="item0"/>
+ <combo_box.item label="5 minutos" name="item1"/>
+ <combo_box.item label="10 minutos" name="item2"/>
+ <combo_box.item label="30 minutos" name="item3"/>
+ <combo_box.item label="(nunca)" name="item4"/>
</combo_box>
- <check_box label="Compartilhar a linguagem com objetos" name="language_is_public" tool_tip="Isto permite que os objetos no mundo conheçam sua linguagem preferida."/>
+ <text name="text_box3">
+ Mensagem do modo ocupado:
+ </text>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml b/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml
index d7982ab940..ccf213099e 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_graphics1.xml
@@ -1,43 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Gráficos" name="Display panel">
- <button label="?" name="GraphicsPreferencesHelpButton"/>
- <check_box label="Execute Second Life em uma janela" name="windowed mode"/>
- <text_editor bottom="-56" height="40" name="FullScreenInfo" width="480">
- Se desmarcado, o visualizador exibirá tela inteira quando fizer o acesso.
- </text_editor>
- <text name="WindowSizeLabel">
- Tamanho da Janela:
- </text>
- <combo_box name="windowsize combo">
- <combo_box.item name="640x480" label="640x480" />
- <combo_box.item name="800x600" label="800x600" />
- <combo_box.item name="720x480" label="720x480 (NTSC)" />
- <combo_box.item name="768x576" label="768x576 (PAL)" />
- <combo_box.item name="1024x768" label="1024x768" />
- </combo_box>
- <text name="DisplayResLabel">
- Resolução de Display:
- </text>
- <text name="AspectRatioLabel1" tool_tip="largura / altura">
- Relação de Aspecto:
- </text>
- <combo_box name="aspect_ratio" tool_tip="largura / altura">
- <combo_box.item name="4:3(StandardCRT)" label="4:3 (CRT Padrão)" />
- <combo_box.item name="5:4(1280x1024LCD)" label="5:4 (1280x1024 LCD)" />
- <combo_box.item name="8:5(Widescreen)" label="8:5 (tela ampla)" />
- <combo_box.item name="16:9(Widescreen)" label="16:9 (tela ampla)" />
- </combo_box>
- <check_box label="Auto-detectar a relação" name="aspect_auto_detect"/>
- <text name="HigherText">
- Qualidade e
- </text>
- <text name="QualityText">
- Performance:
+ <text name="QualitySpeed">
+ Qualidade e velocidade:
</text>
<text name="FasterText">
Mais
rápido
</text>
+ <text name="BetterText">
+ Melhor
+ </text>
<text name="ShadersPrefText">
Baixo
</text>
@@ -50,96 +22,86 @@ rápido
<text name="ShadersPrefText4">
Ultra
</text>
- <text name="HigherText2">
- Mais alto
- </text>
- <text name="QualityText2">
- Qualidade
- </text>
- <check_box label="Personalizar" left="395" name="CustomSettings"/>
- <panel name="CustomGraphics Panel">
- <text name="ShadersText">
- Sombreadores:
- </text>
- <check_box label="Bump de Mapeamento e Brilho" name="BumpShiny"/>
- <check_box label="Sombreadores básicos" name="BasicShaders" tool_tip="Desabilitar esta opção poderá impedir que alguns drivers de placa de vídeo a travem."/>
- <check_box label="Sombreadores Atmosféricos" name="WindLightUseAtmosShaders"/>
- <check_box label="Reflexos de Ãgua" name="Reflections"/>
- <text name="ReflectionDetailText">
- Detalhes de Reflexão:
- </text>
- <radio_group name="ReflectionDetailRadio">
- <radio_item name="0" label="Terreno e Ãrvores" />
- <radio_item name="1" label="Todos os objetos estáticos" />
- <radio_item name="2" label="Todos os avatares e Objetos" />
- <radio_item name="3" label="Tudo" />
- </radio_group>
- <text name="AvatarRenderingText">
- Renderização de Avatar:
- </text>
- <check_box label="Atributos do Avatar" name="AvatarImpostors"/>
- <check_box label="Melhoria de Hardware" name="AvatarVertexProgram"/>
- <check_box label="Vestimenta do Avatar" name="AvatarCloth"/>
- <text name="DrawDistanceMeterText1">
- m
- </text>
- <text name="DrawDistanceMeterText2">
- m
- </text>
- <slider label="Distancia de desenho:" label_width="150" name="DrawDistance" width="255"/>
- <slider label="Contador máx. de partículas:" label_width="150" name="MaxParticleCount" width="262"/>
- <slider label="Qualidade de Pós-processamento:" label_width="178" name="RenderPostProcess" width="223"/>
- <text name="MeshDetailText">
- Detalhes de Malha:
- </text>
- <slider label=" Objetos:" name="ObjectMeshDetail"/>
- <slider label=" Primitivas Flexiveis:" name="FlexibleMeshDetail"/>
- <slider label=" Ãrvores:" name="TreeMeshDetail"/>
- <slider label=" Avatares:" name="AvatarMeshDetail"/>
- <slider label=" Terreno:" name="TerrainMeshDetail"/>
- <slider label=" Céu:" name="SkyMeshDetail"/>
- <text name="PostProcessText">
- Baixo
- </text>
- <text name="ObjectMeshDetailText">
- Baixo
- </text>
- <text name="FlexibleMeshDetailText">
- Baixo
- </text>
- <text name="TreeMeshDetailText">
- Baixo
- </text>
- <text name="AvatarMeshDetailText">
- Baixo
- </text>
- <text name="TerrainMeshDetailText">
- Baixo
- </text>
- <text name="SkyMeshDetailText">
- Baixo
- </text>
- <text name="LightingDetailText">
- Detalhes de Iluminação:
- </text>
- <radio_group name="LightingDetailRadio">
- <radio_item name="SunMoon" label="Sol e Lua apenas" />
- <radio_item name="LocalLights" label="Luzes locais nas proximidades" />
- </radio_group>
- <text name="TerrainDetailText">
- Detalhe do Terreno:
- </text>
- <radio_group left_delta="45" name="TerrainDetailRadio" width="276">
- <radio_item name="0" label="Baixo" />
- <radio_item name="2" label="Alto" />
- </radio_group>
+ <panel label="CustomGraphics" name="CustomGraphics Panel">
+ <text name="ShadersText">
+ Sombreadores:
+ </text>
+ <check_box initial_value="true" label="Bump de Mapeamento e Brilho" name="BumpShiny"/>
+ <check_box initial_value="true" label="Sombreadores básicos" name="BasicShaders" tool_tip="Desabilitar esta opção poderá impedir que alguns drivers de placa de vídeo a travem."/>
+ <check_box initial_value="true" label="Sombreadores Atmosféricos" name="WindLightUseAtmosShaders"/>
+ <check_box initial_value="true" label="Reflexos de Ãgua" name="Reflections"/>
+ <text name="ReflectionDetailText">
+ Detalhes de Reflexão:
+ </text>
+ <radio_group name="ReflectionDetailRadio">
+ <radio_item label="Terreno e árvores" name="0"/>
+ <radio_item label="Todos os objetos estáticos" name="1"/>
+ <radio_item label="Todos os avatares e Objetos" name="2"/>
+ <radio_item label="Tudo" name="3"/>
+ </radio_group>
+ <text name="AvatarRenderingText">
+ Renderização de Avatar:
+ </text>
+ <check_box initial_value="true" label="Atributos do Avatar" name="AvatarImpostors"/>
+ <check_box initial_value="true" label="Melhoria de Hardware" name="AvatarVertexProgram"/>
+ <check_box initial_value="true" label="Vestimenta do Avatar" name="AvatarCloth"/>
+ <slider label="Distancia de desenho:" name="DrawDistance"/>
+ <text name="DrawDistanceMeterText2">
+ m
+ </text>
+ <slider label="Contador máx. de partículas:" name="MaxParticleCount"/>
+ <slider label="Distância máx. desenho avatar:" name="MaxAvatarDrawDistance"/>
+ <text name="DrawDistanceMeterText3">
+ m
+ </text>
+ <slider label="Qualidade de Pós-processamento:" name="RenderPostProcess"/>
+ <text name="MeshDetailText">
+ Detalhes de Malha:
+ </text>
+ <slider label=" Objetos:" name="ObjectMeshDetail"/>
+ <slider label=" Primitivas Flexiveis:" name="FlexibleMeshDetail"/>
+ <slider label=" Ãrvores:" name="TreeMeshDetail"/>
+ <slider label=" Avatares:" name="AvatarMeshDetail"/>
+ <slider label=" Terreno:" name="TerrainMeshDetail"/>
+ <slider label=" Céu:" name="SkyMeshDetail"/>
+ <text name="PostProcessText">
+ Baixo
+ </text>
+ <text name="ObjectMeshDetailText">
+ Baixo
+ </text>
+ <text name="FlexibleMeshDetailText">
+ Baixo
+ </text>
+ <text name="TreeMeshDetailText">
+ Baixo
+ </text>
+ <text name="AvatarMeshDetailText">
+ Baixo
+ </text>
+ <text name="TerrainMeshDetailText">
+ Baixo
+ </text>
+ <text name="SkyMeshDetailText">
+ Baixo
+ </text>
+ <text name="LightingDetailText">
+ Detalhes de Iluminação:
+ </text>
+ <radio_group name="LightingDetailRadio">
+ <radio_item label="Sol e Lua apenas" name="SunMoon" value="0"/>
+ <radio_item label="Luzes locais nas proximidades" name="LocalLights" value="1"/>
+ </radio_group>
+ <text name="TerrainDetailText">
+ Detalhe do Terreno:
+ </text>
+ <radio_group left_delta="45" name="TerrainDetailRadio">
+ <radio_item label="Baixo" name="0"/>
+ <radio_item label="Alto" name="2"/>
+ </radio_group>
</panel>
- <button label="Configurações Recomendadas" name="Defaults" width="190" left="110"/>
- <button label="Opções de Hardware" label_selected="Opções de Hardware" name="GraphicsHardwareButton"/>
- <panel.string name="resolution_format">
- [RES_X] x [RES_Y]
- </panel.string>
- <panel.string name="aspect_ratio_text">
- [NUM]:[DEN]
- </panel.string>
+ <button label="Aplicar" label_selected="Aplicar" name="Apply"/>
+ <button label="Redefinir" left="110" name="Defaults"/>
+ <button label="Avançado" name="Advanced"/>
+ <button label="Hardware" label_selected="Hardware" name="GraphicsHardwareButton"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml b/indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml
index 84c6c934c8..0cf2b7a4af 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_privacy.xml
@@ -1,33 +1,26 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Comunicação" name="im">
- <text name="text_box">
- Minha situação online:
+ <panel.string name="log_in_to_change">
+ autentique-se para mudar
+ </panel.string>
+ <button label="Limpar histórico" name="clear_cache" tool_tip="Apagar imagem do login, última localização, histórico de teletransporte, cache de texturas e web"/>
+ <text name="cache_size_label_l">
+ (Locações, imagens, web, histórico de busca)
</text>
- <check_box label="Apenas meus Amigos e Grupos podem me ver online" name="online_visibility"/>
- <text name="text_box2">
- Opções MI:
+ <check_box label="Apenas amigos e grupos sabem que estou online" name="online_visibility"/>
+ <check_box label="Apenas amigos e grupos podem me chamar ou enviar MI" name="voice_call_friends_only_check"/>
+ <check_box label="Desligar o microfone quando terminar chamadas" name="auto_disengage_mic_check"/>
+ <check_box label="Aceitar cookies" name="cookies_enabled"/>
+ <text name="Logs:">
+ Logs:
</text>
- <string name="log_in_to_change">
- Logar para Alterar
- </string>
- <check_box label="Enviar MI para o e-mail ([EMAIL])" name="send_im_to_email"/>
- <check_box label="Incluir MIs no console do chat" name="include_im_in_chat_console"/>
- <check_box label="Mostrar data e hora na MI" name="show_timestamps_check"/>
- <check_box label="Mostrar notificação de Amigo online" name="friends_online_notify_checkbox"/>
- <text name="text_box3" width="134">
- Resposta no Modo
-Ocupado:
+ <check_box label="Salvar logs de bate- papo das proximidades no meu computador" name="log_nearby_chat"/>
+ <check_box label="Salvar logs de MI no meu computador" name="log_instant_messages"/>
+ <check_box label="Adicionar timestamp" name="show_timestamps_check_im"/>
+ <text name="log_path_desc">
+ Localização dos logs:
</text>
- <text name="text_box4">
- Opções de Registro:
- </text>
- <check_box label="Salvar um registro das MIs em meu computador" name="log_instant_messages"/>
- <check_box label="Mostrar a hora nas MIs" name="log_instant_messages_timestamp"/>
- <check_box label="Mostrar o final da última conversa em MI" name="log_show_history"/>
- <check_box label="Salvar um registro da Conversa local em meu computador" name="log_chat"/>
- <check_box label="Mostrar a hora no registro da Conversa local" name="log_chat_timestamp"/>
- <check_box label="Mostrar MIs recebidas no registro de Conversa local" name="log_chat_IM"/>
- <check_box label="Incluir data e hora" name="log_date_timestamp"/>
- <button label="Mudar Local" label_selected="Alterar Caminho" name="log_path_button" width="120"/>
<line_editor left="278" name="log_path_string" right="-20"/>
+ <button label="Navegar" label_selected="Navegar" name="log_path_button" width="120"/>
+ <button label="Lista dos bloqueados" name="block_list"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml b/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml
index 3c94090131..5266f646b7 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_setup.xml
@@ -1,33 +1,49 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Câmera" name="Input panel">
- <text name=" Mouselook Options:">
- Mouselook:
+<panel label="Configurações" name="Input panel">
+ <button bottom_delta="-40" label="Outros dispositivos" name="joystick_setup_button" width="165"/>
+ <text name="Mouselook:">
+ Visão subjetiva:
</text>
- <text name=" Mouse Sensitivity:">
- Sensibilidade do Mouse:
+ <text name=" Mouse Sensitivity">
+ Sensibilidade do mouse
</text>
- <check_box label="Inverter o Mouse" name="invert_mouse"/>
- <text name=" Auto Fly Options:">
- Vôo Automático:
+ <check_box label="Inverter" name="invert_mouse"/>
+ <text name="Network:">
+ Rede:
</text>
- <check_box label="Voar/Aterrissar pressionando teclas para cima/baixo" name="automatic_fly"/>
- <text name=" Camera Options:">
- Opções de Câmera:
+ <text name="Maximum bandwidth">
+ Largura de banda máxima
</text>
- <text name="camera_fov_label" width="218">
- Angulo de Visão da Câmera:
+ <text name="text_box2">
+ kbps
</text>
- <slider bottom_delta="-6" width="128" left="360" name="camera_fov" />
- <text name="Camera Follow Distance:" width="218">
- Distância de Acompanhamento da Camêra:
+ <check_box label="Personalizar porta" name="connection_port_enabled"/>
+ <spinner label="Número da porta:" name="connection_port"/>
+ <text name="cache_size_label_l">
+ Tamanho do cache
</text>
- <slider bottom_delta="-6" width="128" left="360" name="camera_offset_scale" />
- <check_box label="Edição automática do movimento da câmera" name="edit_camera_movement" tool_tip="Usar posicionamento automático da câmera quando entrar e sair do modo de edição"/>
- <check_box label="Movimento Automático da Câmera na edição de aparência" name="appearance_camera_movement" tool_tip="Usar posicionamento automático da câmera em modo de edição"/>
- <text name="text2">
- Opções de Exibição
-do Avatar:
+ <text name="text_box5">
+ MB
</text>
- <check_box label="Mostra o avatar em primeira pessoa" name="first_person_avatar_visible"/>
- <button bottom_delta="-40" label="Configuração do Joystick" name="joystick_setup_button" width="165"/>
+ <text name="Cache location">
+ Localização do cache:
+ </text>
+ <button label="Procurar" label_selected="Procurar" name="set_cache"/>
+ <button label="Redefinir" label_selected="Redefinir" name="reset_cache"/>
+ <text name="Web:">
+ Web:
+ </text>
+ <radio_group name="use_external_browser">
+ <radio_item label="Usar meu navegador (IE, Firefox, Safari)" name="external" tool_tip="Use o navegador incluso para consultar a ajuda, abrir links da web, etc. Uso em tela inteira não recomendado." value="1"/>
+ <radio_item label="Usar navegador incluso" name="internal" tool_tip="Use este navegador para consultar a ajuda, abrir links da web, etc. As janelas abrem dentro do [APP_NAME]." value=""/>
+ </radio_group>
+ <check_box initial_value="true" label="Habilitar plugins" name="browser_plugins_enabled"/>
+ <check_box initial_value="true" label="Aceitar cookies" name="cookies_enabled"/>
+ <check_box initial_value="true" label="Habilitar Javascript" name="browser_javascript_enabled"/>
+ <check_box initial_value="false" label="Ativar web proxy" name="web_proxy_enabled"/>
+ <text name="Proxy location">
+ Localização do proxy:
+ </text>
+ <line_editor name="web_proxy_editor" tool_tip="O nome ou endereço IP do proxy da sua preferência"/>
+ <spinner label="Porta:" name="web_proxy_port"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml
index 5574679cde..43c970841a 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_sound.xml
@@ -1,39 +1,45 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel label="Ãudio &amp; Vídeo" name="Preference Media panel">
- <slider label="Mestre" name="System Volume"/>
+<panel label="Sons" name="Preference Media panel">
+ <slider label="Volume principal" name="System Volume"/>
+ <check_box initial_value="true" label="Silenciar ao minimizar" name="mute_when_minimized"/>
+ <slider label="Botões" name="UI Volume"/>
<slider label="Ambiente" name="Wind Volume"/>
- <slider label="Sons" name="SFX Volume"/>
+ <slider label="Efeitos sonoros" name="SFX Volume"/>
+ <slider label="Streaming de música" name="Music Volume"/>
+ <check_box label="Ativado" name="music_enabled"/>
<slider label="Mídia" name="Media Volume"/>
- <slider label="UI" name="UI Volume"/>
- <slider label="Música" name="Music Volume"/>
- <slider label="Voz" name="Voice Volume"/>
- <text_editor name="voice_unavailable">
- Bate-papo de Voz nâo está disponível
- </text_editor>
- <check_box label="Habilitar bate-papo de Voz" name="enable_voice_check"/>
- <radio_group name="ear_location">
- <radio_item name="0" label="Ouvir o bate-papo de voz pela posição de câmera" />
- <radio_item name="1" label="Ouvir o bate-papo de voz pela posição do avatar" />
- </radio_group>
- <button label="Configurações do dispositivo" name="device_settings_btn" width="180"/>
- <text name="muting_text">
- Volume:
- </text>
- <text name="streaming_prefs_text">
- Preferências de
-Streaming:
+ <check_box label="Ativado" name="enable_media"/>
+ <slider label="Bate-papo de voz" name="Voice Volume"/>
+ <check_box label="Ativado" name="enable_voice_check"/>
+ <check_box label="Autorizar auto-play de mídias" name="media_auto_play_btn" tool_tip="Marque esta opção para auto-executar mídias, se elas quiserem"/>
+ <check_box label="Tocar mídia anexada em outros avatares" name="media_show_on_others_btn" tool_tip="Desmarque esta opção para ocultar mídias anexadas em avatares por perto"/>
+ <text name="voice_chat_settings">
+ Configuração de bate-papo de voz
</text>
- <text name="audio_prefs_text">
- Preferências de Ãudio:
+ <text name="Listen from">
+ Ouvir a partir de:
</text>
- <panel label="Volume" name="Volume Panel"/>
- <check_box label="Tocar música em streaming" name="streaming_music"/>
- <check_box label="Tocar streaming de Mídia" name="streaming_video"/>
- <check_box label="Tocar mídia automaticamente" name="auto_streaming_video"/>
- <check_box label="Silenciar Ãudio quando minimizar janela" name="mute_when_minimized"/>
- <slider label="Efeito Doppler" name="Doppler Effect"/>
- <slider label="Fator Distância" name="Distance Factor"/>
- <slider label="Fator Rolloff" name="Rolloff Factor"/>
- <spinner label="Mudar nível de alerta de L$" name="L$ Change Threshold" label_width="165" width="229"/>
- <spinner label="Mudar nível de alerta de Saúde" name="Health Change Threshold" label_width="165" width="229"/>
+ <radio_group name="ear_location">
+ <radio_item label="Posição de câmera" name="0"/>
+ <radio_item label="Posição do avatar" name="1"/>
+ </radio_group>
+ <button label="Controles de entrada/saída" name="device_settings_btn" width="180"/>
+ <panel label="Configuração dos dispositivo" name="device_settings_panel">
+ <panel.string name="default_text">
+ Padrão
+ </panel.string>
+ <text name="Input">
+ Entrada
+ </text>
+ <text name="My volume label">
+ Meu volume:
+ </text>
+ <slider_bar initial_value="1.0" name="mic_volume_slider" tool_tip="Mude o volume usando o controle deslizante"/>
+ <text name="wait_text">
+ Aguarde
+ </text>
+ <text name="Output">
+ Saída
+ </text>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_prim_media_controls.xml b/indra/newview/skins/default/xui/pt/panel_prim_media_controls.xml
new file mode 100644
index 0000000000..a1254b4da0
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_prim_media_controls.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="MediaControls">
+ <string name="min_width">
+ 300
+ </string>
+ <string name="min_height">
+ 75
+ </string>
+ <string name="zoom_medium_padding">
+ 1.1
+ </string>
+ <string name="top_world_view_avoid_zone">
+ 50
+ </string>
+ <layout_stack name="progress_indicator_area">
+ <panel name="media_progress_indicator">
+ <progress_bar name="media_progress_bar" tool_tip="Carregando mídia"/>
+ </panel>
+ </layout_stack>
+ <layout_stack name="media_controls">
+ <layout_panel name="back">
+ <button name="back_btn" tool_tip="Navegar para trás"/>
+ </layout_panel>
+ <layout_panel name="fwd">
+ <button name="fwd_btn" tool_tip="Navegar para frente"/>
+ </layout_panel>
+ <layout_panel name="home">
+ <button name="home_btn" tool_tip="Página web:"/>
+ </layout_panel>
+ <layout_panel name="media_stop">
+ <button name="media_stop_btn" tool_tip="Parar mídia"/>
+ </layout_panel>
+ <layout_panel name="reload">
+ <button name="reload_btn" tool_tip="Recarregar"/>
+ </layout_panel>
+ <layout_panel name="stop">
+ <button name="stop_btn" tool_tip="Parar de carregar"/>
+ </layout_panel>
+ <layout_panel name="play">
+ <button name="play_btn" tool_tip="Tocar mídia"/>
+ </layout_panel>
+ <layout_panel name="pause">
+ <button name="pause_btn" tool_tip="Pausar mídia"/>
+ </layout_panel>
+ <layout_panel name="media_address">
+ <line_editor name="media_address_url" tool_tip="URL da mídia"/>
+ <layout_stack name="media_address_url_icons">
+ <layout_panel>
+ <icon name="media_whitelist_flag" tool_tip="Lista ativada"/>
+ </layout_panel>
+ <layout_panel>
+ <icon name="media_secure_lock_flag" tool_tip="Navegação segura"/>
+ </layout_panel>
+ </layout_stack>
+ </layout_panel>
+ <layout_panel name="media_play_position">
+ <slider_bar initial_value="0.5" name="media_play_slider" tool_tip="Andamento do vídeo"/>
+ </layout_panel>
+ <layout_panel name="skip_back">
+ <button name="skip_back_btn" tool_tip="Passo para trás"/>
+ </layout_panel>
+ <layout_panel name="skip_forward">
+ <button name="skip_forward_btn" tool_tip="Passo para frente"/>
+ </layout_panel>
+ <layout_panel name="media_volume">
+ <button name="media_mute_button" tool_tip="Silenciar esta mídia"/>
+ <slider name="volume_slider" tool_tip="Volume"/>
+ </layout_panel>
+ <layout_panel name="zoom_frame">
+ <button name="zoom_frame_btn" tool_tip="Enfocar mídia"/>
+ </layout_panel>
+ <layout_panel name="close">
+ <button name="close_btn" tool_tip="Menos zoom"/>
+ </layout_panel>
+ <layout_panel name="new_window">
+ <button name="new_window_btn" tool_tip="Abrir URL em navegador"/>
+ </layout_panel>
+ </layout_stack>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_profile.xml b/indra/newview/skins/default/xui/pt/panel_profile.xml
index ff53aa6a41..805e3aaebd 100644
--- a/indra/newview/skins/default/xui/pt/panel_profile.xml
+++ b/indra/newview/skins/default/xui/pt/panel_profile.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<panel name="panel_profile">
+<panel label="Perfil" name="panel_profile">
<string name="CaptionTextAcctInfo">
[ACCTTYPE]
[PAYMENTINFO] [AGEVERIFICATION]
@@ -11,4 +11,42 @@
http://www.secondlife.com/account/partners.php?lang=pt
</string>
<string name="my_account_link_url" value="http://secondlife.com/my/account/index.php?lang=pt-BR"/>
+ <string name="no_partner_text" value="Ninguém"/>
+ <string name="no_group_text" value="Nenhum"/>
+ <string name="RegisterDateFormat">
+ [REG_DATE] ([AGE])
+ </string>
+ <layout_stack name="layout">
+ <layout_panel name="profile_stack">
+ <scroll_container name="profile_scroll">
+ <panel name="profile_scroll_panel">
+ <panel name="second_life_image_panel">
+ <text name="title_sl_descr_text" value="[SECOND_LIFE]:"/>
+ </panel>
+ <panel name="first_life_image_panel">
+ <text name="title_rw_descr_text" value="Mundo real:"/>
+ </panel>
+ <text name="title_member_text" value="Residente desde:"/>
+ <text name="title_acc_status_text" value="Conta:"/>
+ <text name="title_partner_text" value="Parceiro(a):"/>
+ <panel name="partner_data_panel">
+ <name_box initial_value="(pesquisando)" name="partner_text"/>
+ </panel>
+ <text name="title_groups_text" value="Grupos:"/>
+ </panel>
+ </scroll_container>
+ </layout_panel>
+ <layout_panel name="profile_buttons_panel">
+ <button label="Adicionar amigo" name="add_friend" tool_tip="Oferecer amizade ao residente"/>
+ <button label="MI" name="im" tool_tip="Abrir sessão de mensagem instantânea"/>
+ <button label="Ligar" name="call" tool_tip="Ligar para este residente"/>
+ <button label="Mapa" name="show_on_map_btn" tool_tip="Exibir o residente no mapa"/>
+ <button label="Teletransportar" name="teleport" tool_tip="Oferecer teletransporte"/>
+ <button label="▼" name="overflow_btn" tool_tip="Pagar ou compartilhar inventário com o residente"/>
+ </layout_panel>
+ <layout_panel name="profile_me_buttons_panel">
+ <button label="Editar perfil" name="edit_profile_btn" tool_tip="Editar dados pessoais"/>
+ <button label="Editar aparência" name="edit_appearance_btn" tool_tip="Criar/editar aparência: físico, roupas, etc."/>
+ </layout_panel>
+ </layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_profile_view.xml b/indra/newview/skins/default/xui/pt/panel_profile_view.xml
new file mode 100644
index 0000000000..62a16c6fbe
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_profile_view.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_target_profile">
+ <string name="status_online">
+ Conectado
+ </string>
+ <string name="status_offline">
+ Desconectado
+ </string>
+ <text_editor name="user_name" value="Carregando..."/>
+ <text name="status" value="Conectado"/>
+ <tab_container name="tabs">
+ <panel label="PERFIL" name="panel_profile"/>
+ <panel label="DESTAQUES" name="panel_picks"/>
+ <panel label="ANOTAÇÕES E PRIVACIDADE" name="panel_notes"/>
+ </tab_container>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_region_covenant.xml b/indra/newview/skins/default/xui/pt/panel_region_covenant.xml
index 4977a1fac9..65ac89baf8 100644
--- a/indra/newview/skins/default/xui/pt/panel_region_covenant.xml
+++ b/indra/newview/skins/default/xui/pt/panel_region_covenant.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Corretagem" name="Covenant">
<text name="estate_section_lbl">
- Propriedade:
+ Propriedade
</text>
<text bottom_delta="-19" name="estate_name_lbl">
Nome:
@@ -22,7 +22,7 @@
Última modificação: Quarta, 31 de dezembro de 1969 às 16:00:00 horas
</text>
<button label="?" name="covenant_help"/>
- <text_editor name="covenant_editor" bottom="-247" height="162" >
+ <text_editor bottom="-247" height="162" name="covenant_editor">
Não há nenhuma regra fornecida para esta Propriedade.
</text_editor>
<button label="Resetar" name="reset_covenant"/>
@@ -30,12 +30,11 @@
As mudanças das regras serão mostradas em todos os lotes
da propriedade.
</text>
- <text bottom_delta="-36" name="covenant_instructions">
- Arraste e solte um notecard, para mudar as Regras desta
- Propriedade.
+ <text bottom_delta="-36" name="covenant_instructions">
+ Arrastar e soltar uma anotação para alterar o contrato em vigor nesta propriedade.
</text>
<text bottom_delta="-36" name="region_section_lbl">
- Região:
+ Região
</text>
<text name="region_name_lbl">
Nome:
diff --git a/indra/newview/skins/default/xui/pt/panel_region_debug.xml b/indra/newview/skins/default/xui/pt/panel_region_debug.xml
index 724df20155..f2cc9f644d 100644
--- a/indra/newview/skins/default/xui/pt/panel_region_debug.xml
+++ b/indra/newview/skins/default/xui/pt/panel_region_debug.xml
@@ -6,15 +6,15 @@
<text name="region_text">
desconhecido
</text>
- <check_box label="Desabilitar Scripts" name="disable_scripts_check" tool_tip="Desabilitar todos os scripts nesta região"/>
+ <check_box label="Desativar scripts" name="disable_scripts_check" tool_tip="Desativar todos os scripts nesta região"/>
<button label="?" name="disable_scripts_help"/>
- <check_box label="Desabilitar colisões" name="disable_collisions_check" tool_tip="Desabilitar colisões de não-avatares nessa região"/>
+ <check_box label="Desativar colisões" name="disable_collisions_check" tool_tip="Desabilitar colisões de não-avatares nessa região"/>
<button label="?" name="disable_collisions_help"/>
- <check_box label="Desabilitar física" name="disable_physics_check" tool_tip="Desabilitar toda a físíca nesta região"/>
+ <check_box label="Desativar física" name="disable_physics_check" tool_tip="Desativar toda a físíca nesta região"/>
<button label="?" name="disable_physics_help"/>
<button label="Aplicar" name="apply_btn"/>
<text name="objret_text_lbl" width="130">
- Retornar objeto
+ Devolver objeto
</text>
<text name="resident_text_lbl">
Residente:
@@ -22,19 +22,19 @@
<line_editor name="target_avatar_name">
(nenhum)
</line_editor>
- <button label="Escolher..." name="choose_avatar_btn"/>
+ <button label="Selecionar" name="choose_avatar_btn"/>
<text name="options_text_lbl">
Opções:
</text>
- <check_box label="Retornar apenas aqueles objetos que contenham scripts" name="return_scripts" tool_tip="Retornar apenas objetos que contenham scripts."/>
- <check_box label="Retornar apenas aqueles objetos na terra de alguém" name="return_other_land" tool_tip="Retornar apenas objetos que estejam na terra pertencente a alguém"/>
- <check_box label="Retornar objetos em cada região desta propriedade" name="return_estate_wide" tool_tip="Retornar objetos em todas as regiões que constituem esta propriedade"/>
- <button label="Retornar" name="return_btn"/>
- <button width="280" label="Pegar os principais colidentes..." name="top_colliders_btn" tool_tip="Lista dos objetos que experimentam as mais potenciais colisões"/>
- <button label="?" name="top_colliders_help" left="297"/>
- <button width="280" label="Pegar Principais Scripts..." name="top_scripts_btn" tool_tip="Lista de objetos gastando mais tempo rodando scripts"/>
- <button label="?" name="top_scripts_help" left="297"/>
- <button label="Reiniciar a Região" name="restart_btn" tool_tip="Dar 2 minutos de contagem regressiva e reiniciar a região"/>
+ <check_box label="Com scripts" name="return_scripts" tool_tip="Só devolver objetos com scripts"/>
+ <check_box label="No terreno de outra pessoa" name="return_other_land" tool_tip="Devolver apenas objetos que estejam em terrenos de outra pessoa"/>
+ <check_box label="Em todas as regiões desta propriedade" name="return_estate_wide" tool_tip="Devolver objetos em todas as regiões que constituem esta propriedade"/>
+ <button label="Devolver" name="return_btn"/>
+ <button label="Principais colidentes..." name="top_colliders_btn" tool_tip="Lista dos objetos com maior potencial de colisão" width="280"/>
+ <button label="?" left="297" name="top_colliders_help"/>
+ <button label="Principais scripts..." name="top_scripts_btn" tool_tip="Lista de objetos que mais passam tempo executando scripts" width="280"/>
+ <button label="?" left="297" name="top_scripts_help"/>
+ <button label="Reiniciar a região" name="restart_btn" tool_tip="Após 2 minutos de contagem regressiva, reiniciar a região"/>
<button label="?" name="restart_help"/>
- <button label="Atrasar o Reinicio" name="cancel_restart_btn" tool_tip="Atrasar o reinicio da região por uma hora"/>
+ <button label="Adiar reinício" name="cancel_restart_btn" tool_tip="Adiar o reinício da região por uma hora"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_region_estate.xml b/indra/newview/skins/default/xui/pt/panel_region_estate.xml
index f43402be15..e5d394865c 100644
--- a/indra/newview/skins/default/xui/pt/panel_region_estate.xml
+++ b/indra/newview/skins/default/xui/pt/panel_region_estate.xml
@@ -1,8 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Propriedade" name="Estate">
<text name="estate_help_text">
- Mudanças nas definições nesta guia irão afetar
-todas as regiões desta propriedade.
+ Mudar as opções desta guia afeta todas as regiões desta propriedade.
</text>
<text name="estate_text">
Propriedade:
@@ -11,7 +10,7 @@ todas as regiões desta propriedade.
(desconhecido)
</text>
<text name="owner_text">
- Proprietário:
+ Proprietário do imóvel:
</text>
<text name="estate_owner">
(desconhecido)
@@ -24,10 +23,10 @@ todas as regiões desta propriedade.
<check_box label="Permitir acesso público" name="externally_visible_check"/>
<button label="?" name="externally_visible_help"/>
<text name="Only Allow">
- Acesso restrito a Residentes...
+ Restringir acesso a contas confirmardas por:
</text>
- <check_box label="com info. de pagamento em arquivo" name="limit_payment" tool_tip="Banir residentes não identificados."/>
- <check_box label="Adultos com idade verificada" name="limit_age_verified" tool_tip="Banir residentes que não tenham confirmado a sua idade. Ver support.secondlife.com para mais informações."/>
+ <check_box label="Dados de pagamento fornecidos" name="limit_payment" tool_tip="Banir residentes sem identificação."/>
+ <check_box label="Verificação de idade" name="limit_age_verified" tool_tip="Banir residentes que não comprovaram a idade. Consulte o [SUPPORT_SITE] para saber mais."/>
<check_box label="Permitir conversa de voz" name="voice_chat_check"/>
<button label="?" name="voice_chat_help"/>
<check_box label="Permitir Tele-transporte direto" name="allow_direct_teleport"/>
@@ -40,7 +39,7 @@ todas as regiões desta propriedade.
</string>
<button label="?" name="abuse_email_address_help"/>
<button label="Aplicar" name="apply_btn"/>
- <button label="Chutar usuário da propriedade..." name="kick_user_from_estate_btn"/>
+ <button label="Expulsar da propriedade..." name="kick_user_from_estate_btn"/>
<button label="Enviar mensagem à Propriedade" name="message_estate_btn"/>
<text name="estate_manager_label">
Gerentes da propriedade:
diff --git a/indra/newview/skins/default/xui/pt/panel_region_general.xml b/indra/newview/skins/default/xui/pt/panel_region_general.xml
index 1a06d91aa8..d1a5eaa11e 100644
--- a/indra/newview/skins/default/xui/pt/panel_region_general.xml
+++ b/indra/newview/skins/default/xui/pt/panel_region_general.xml
@@ -19,35 +19,25 @@
desconhecido
</text>
<check_box label="Bloquear Terraform" name="block_terraform_check"/>
- <button label="?" name="terraform_help"/>
<check_box label="Bloquear Vôo" name="block_fly_check"/>
- <button label="?" name="fly_help"/>
<check_box label="Permitir Dano" name="allow_damage_check"/>
- <button label="?" name="damage_help"/>
<check_box label="Restringir Empurrar" name="restrict_pushobject"/>
- <button label="?" name="restrict_pushobject_help"/>
<check_box label="Permitir Revenda de Terra" name="allow_land_resell_check"/>
- <button label="?" name="land_resell_help"/>
<check_box label="Permitir Unir/Dividir Terra" name="allow_parcel_changes_check"/>
- <button label="?" name="parcel_changes_help"/>
<check_box label="Bloquear Mostrar Terra na Busca" name="block_parcel_search_check" tool_tip="Permitir que as pessoas vejam esta região e seus lotes nos resultados de busca"/>
- <button label="?" name="parcel_search_help"/>
<spinner label="Limit do Agente" name="agent_limit_spin"/>
- <button label="?" name="agent_limit_help"/>
<spinner label="Objeto Bonus" name="object_bonus_spin"/>
- <button label="?" name="object_bonus_help"/>
<text label="Maturidade" name="access_text">
Classificação:
</text>
- <combo_box label="Mature" name="access_combo">
- <combo_box.item label="Adult" name="Adult"/>
- <combo_box.item label="Mature" name="Mature"/>
- <combo_box.item label="PG" name="PG"/>
- </combo_box>
- <button label="?" name="access_help"/>
+ <icons_combo_box label="Mature" name="access_combo">
+ <icons_combo_box.item label="Adult" name="Adult" value="42"/>
+ <icons_combo_box.item label="Mature" name="Mature" value="21"/>
+ <icons_combo_box.item label="PG" name="PG" value="13"/>
+ </icons_combo_box>
<button label="Aplicar" name="apply_btn"/>
- <button label="Teletransportar um usuário para Casa..." name="kick_btn"/>
- <button label="Teletransportar Todos os Usuários..." name="kick_all_btn"/>
+ <button label="Teletransportar um residente para início..." name="kick_btn"/>
+ <button label="Teletransportar todos para início..." name="kick_all_btn"/>
<button label="Enviar Mensagem para a Região..." name="im_btn"/>
<button label="Gerenciar Telehub..." name="manage_telehub_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_region_general_layout.xml b/indra/newview/skins/default/xui/pt/panel_region_general_layout.xml
new file mode 100644
index 0000000000..534b2826af
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_region_general_layout.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Região" name="General">
+ <text name="region_text_lbl">
+ Região:
+ </text>
+ <text name="region_text">
+ (Desconhecido)
+ </text>
+ <text name="version_channel_text_lbl">
+ Versão:
+ </text>
+ <text name="version_channel_text">
+ (Desconhecido)
+ </text>
+ <text name="region_type_lbl">
+ Tipo:
+ </text>
+ <text name="region_type">
+ (Desconhecido)
+ </text>
+ <check_box label="Bloquear terraplanagens" name="block_terraform_check"/>
+ <check_box label="Bloquear voos" name="block_fly_check"/>
+ <check_box label="Permitir danos" name="allow_damage_check"/>
+ <check_box label="Limitar empurrões" name="restrict_pushobject"/>
+ <check_box label="Permitir revenda de terrenos" name="allow_land_resell_check"/>
+ <check_box label="Permitir união e divisão de terrenos" name="allow_parcel_changes_check"/>
+ <check_box label="Não mostrar nos resultados de pesquisa" name="block_parcel_search_check" tool_tip="Mostrar esta região e lotes nos resultados de pesquisa"/>
+ <spinner label="Limite do agente" name="agent_limit_spin"/>
+ <spinner label="Bônus do objeto" name="object_bonus_spin"/>
+ <text label="Nível de maturidade" name="access_text">
+ Classificação:
+ </text>
+ <combo_box label="Moderado" name="access_combo">
+ <combo_box.item label="Público adulto" name="Adult"/>
+ <combo_box.item label="Moderado" name="Mature"/>
+ <combo_box.item label="Geral" name="PG"/>
+ </combo_box>
+ <button label="Aplicar" name="apply_btn"/>
+ <button label="Teletransportar um residente para início..." name="kick_btn"/>
+ <button label="Teletransportar todos para início..." name="kick_all_btn"/>
+ <button label="Enviar mensagem para região..." name="im_btn"/>
+ <button label="Gerenciar telehub..." name="manage_telehub_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_region_texture.xml b/indra/newview/skins/default/xui/pt/panel_region_texture.xml
index 4787b59a8d..35928ccc67 100644
--- a/indra/newview/skins/default/xui/pt/panel_region_texture.xml
+++ b/indra/newview/skins/default/xui/pt/panel_region_texture.xml
@@ -1,4 +1,4 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel label="Texturas de Chão" name="Textures">
<text name="region_text_lbl">
Região:
@@ -25,33 +25,33 @@
Escalas de Elevação de Terreno
</text>
<text name="height_text_lbl6">
- Sudeste
+ Noroeste
</text>
<text name="height_text_lbl7">
- Noroeste
+ Nordeste
</text>
<text name="height_text_lbl8">
Sudoeste
</text>
<text name="height_text_lbl9">
- Noroeste
+ Sudeste
</text>
- <spinner label="Baixo" name="height_start_spin_0" />
- <spinner label="Baixo" name="height_start_spin_1" />
- <spinner label="Baixo" name="height_start_spin_2" />
- <spinner label="Baixo" name="height_start_spin_3" />
- <spinner label="Alto" name="height_range_spin_0" />
- <spinner label="Alto" name="height_range_spin_1" />
- <spinner label="Alto" name="height_range_spin_2" />
- <spinner label="Alto" name="height_range_spin_3" />
+ <spinner label="Baixo" name="height_start_spin_0"/>
+ <spinner label="Baixo" name="height_start_spin_1"/>
+ <spinner label="Baixo" name="height_start_spin_2"/>
+ <spinner label="Baixo" name="height_start_spin_3"/>
+ <spinner label="Alto" name="height_range_spin_0"/>
+ <spinner label="Alto" name="height_range_spin_1"/>
+ <spinner label="Alto" name="height_range_spin_2"/>
+ <spinner label="Alto" name="height_range_spin_3"/>
<text name="height_text_lbl10">
- Estes valores respresentam o tipo de escala para as texturas acima.
+ Os valores representam o intervalo de mistura das texturas acima.
</text>
<text name="height_text_lbl11">
- Medido em metros, o valor Baixo é a altura máxima da Textura #1,
+ Em metros, o valor BAIXO é a altura MÃXIMA da Textura 1, e HIGH é a altura MÃNIMA da Textura 4.
</text>
<text name="height_text_lbl12">
e o valor Alto é a altura Mínima da Textura #4.
</text>
- <button label="Aplicar" name="apply_btn" />
+ <button label="Aplicar" name="apply_btn"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_script_ed.xml b/indra/newview/skins/default/xui/pt/panel_script_ed.xml
new file mode 100644
index 0000000000..6f022945c2
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_script_ed.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="script panel">
+ <panel.string name="loading">
+ Carregando...
+ </panel.string>
+ <panel.string name="can_not_view">
+ Você não pode ver ou editar o script, uma vez que está definido como &quot;não&quot; copiar &quot;. Você precisa de permissões para ver ou editar um script dentro de um objeto.
+ </panel.string>
+ <panel.string name="public_objects_can_not_run">
+ Objetos públicos não podem executar scripts
+ </panel.string>
+ <panel.string name="script_running">
+ Executando
+ </panel.string>
+ <panel.string name="Title">
+ Script: [NOME]
+ </panel.string>
+ <text_editor name="Script Editor">
+ Carregando...
+ </text_editor>
+ <button label="Salvar" label_selected="Salvar" name="Save_btn"/>
+ <combo_box label="Inserir..." name="Insert..."/>
+ <menu_bar name="script_menu">
+ <menu label="Arquivo" name="File">
+ <menu_item_call label="Salvar" name="Save"/>
+ <menu_item_call label="Reverter todas as alterações" name="Revert All Changes"/>
+ </menu>
+ <menu label="Editar" name="Edit">
+ <menu_item_call label="desfazer" name="Undo"/>
+ <menu_item_call label="Refazer" name="Redo"/>
+ <menu_item_call label="Cortar" name="Cut"/>
+ <menu_item_call label="Copiar" name="Copy"/>
+ <menu_item_call label="Colar" name="Paste"/>
+ <menu_item_call label="Selecionar tudo" name="Select All"/>
+ <menu_item_call label="Desmarcar" name="Deselect"/>
+ <menu_item_call label="Buscar / Substituir..." name="Search / Replace..."/>
+ </menu>
+ <menu label="Ajuda" name="Help">
+ <menu_item_call label="ajuda..." name="Help..."/>
+ <menu_item_call label="ajuda palavra- chave..." name="Keyword Help..."/>
+ </menu>
+ </menu_bar>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_script_limits_my_avatar.xml b/indra/newview/skins/default/xui/pt/panel_script_limits_my_avatar.xml
new file mode 100644
index 0000000000..daf87c4dc6
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_script_limits_my_avatar.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="MEU AVATAR" name="script_limits_my_avatar_panel">
+ <text name="script_memory">
+ Uso de scripts
+ </text>
+ <text name="loading_text">
+ Carregando...
+ </text>
+ <scroll_list name="scripts_list">
+ <scroll_list.columns label="Tamanho (kb)" name="size"/>
+ <scroll_list.columns label="URLs" name="urls"/>
+ <scroll_list.columns label="Nome do objeto" name="name"/>
+ <scroll_list.columns label="Localização" name="location"/>
+ </scroll_list>
+ <button label="Atualizar lista" name="refresh_list_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_script_limits_region_memory.xml b/indra/newview/skins/default/xui/pt/panel_script_limits_region_memory.xml
new file mode 100644
index 0000000000..94274b2cfe
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_script_limits_region_memory.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="MEMÓRIA DA REGIÃO" name="script_limits_region_memory_panel">
+ <text name="script_memory">
+ Memória de scripts no lote
+ </text>
+ <text name="loading_text">
+ Carregando...
+ </text>
+ <scroll_list name="scripts_list">
+ <scroll_list.columns label="Tamanho (kb)" name="size"/>
+ <scroll_list.columns label="URLs" name="urls"/>
+ <scroll_list.columns label="Nome do objeto" name="name"/>
+ <scroll_list.columns label="Dono do objeto" name="owner"/>
+ <scroll_list.columns label="Lote" name="parcel"/>
+ <scroll_list.columns label="Localização" name="location"/>
+ </scroll_list>
+ <button label="Atualizar lista" name="refresh_list_btn"/>
+ <button label="Destaque" name="highlight_btn"/>
+ <button label="Devolver" name="return_btn"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_side_tray.xml b/indra/newview/skins/default/xui/pt/panel_side_tray.xml
new file mode 100644
index 0000000000..1a424fb7f1
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_side_tray.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Side tray cannot show background because it is always
+ partially on screen to hold tab buttons. -->
+<side_tray name="sidebar">
+ <sidetray_tab description="Exibir ou não barra lateral" name="sidebar_openclose" tab_title="Exibir ou não barra lateral"/>
+ <sidetray_tab description="Início" name="sidebar_home" tab_title="Início">
+ <panel label="Início" name="panel_home"/>
+ </sidetray_tab>
+ <sidetray_tab description="Edite seu perfil público e destaques." name="sidebar_me" tab_title="Meu perfil">
+ <panel_container name="panel_container">
+ <panel label="Eu" name="panel_me"/>
+ </panel_container>
+ </sidetray_tab>
+ <sidetray_tab description="Encontre seus amigos, contatos e pessoas nas proximidades." name="sidebar_people" tab_title="Pessoas">
+ <panel_container name="panel_container">
+ <panel label="Perfil do grupo" name="panel_group_info_sidetray"/>
+ <panel label="Residentes&amp; Objetos bloqueados" name="panel_block_list_sidetray"/>
+ </panel_container>
+ </sidetray_tab>
+ <sidetray_tab description="Encontre lugares para ir e lugares que você ja visitou." label="Lugares" name="sidebar_places" tab_title="Lugares">
+ <panel label="Lugares" name="panel_places"/>
+ </sidetray_tab>
+ <sidetray_tab description="Abra seu inventário." name="sidebar_inventory" tab_title="Meu inventário">
+ <panel label="Editar inventário" name="sidepanel_inventory"/>
+ </sidetray_tab>
+ <sidetray_tab description="Muda sua aparência e seu visual atual." name="sidebar_appearance" tab_title="Minha aparência">
+ <panel label="Editar aparência" name="sidepanel_appearance"/>
+ </sidetray_tab>
+</side_tray>
diff --git a/indra/newview/skins/default/xui/pt/panel_side_tray_tab_caption.xml b/indra/newview/skins/default/xui/pt/panel_side_tray_tab_caption.xml
new file mode 100644
index 0000000000..7c06119901
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_side_tray_tab_caption.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="sidetray_tab_panel">
+ <text name="sidetray_tab_title" value="Bandeja lateral"/>
+ <button name="show_help" tool_tip="Mostrar ajuda"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_stand_stop_flying.xml b/indra/newview/skins/default/xui/pt/panel_stand_stop_flying.xml
new file mode 100644
index 0000000000..05869cf67a
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_stand_stop_flying.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Width and height of this panel should be synchronized with "panel_modes" in the floater_moveview.xml-->
+<panel name="panel_stand_stop_flying">
+ <button label="Levantar-se" name="stand_btn" tool_tip="Clique aqui para ficar de pé."/>
+ <button label="Parar de voar" name="stop_fly_btn" tool_tip="Parar de voar"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_status_bar.xml b/indra/newview/skins/default/xui/pt/panel_status_bar.xml
index 7f3d2b34a6..fbbcf0d1be 100644
--- a/indra/newview/skins/default/xui/pt/panel_status_bar.xml
+++ b/indra/newview/skins/default/xui/pt/panel_status_bar.xml
@@ -1,38 +1,33 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="status">
- <text name="ParcelNameText" tool_tip="Nome do pedaço de terra em que você está. Clique Sobre a Terra para informações.">
- Nome do pedaço de terra vai aqui
- </text>
- <text name="BalanceText" tool_tip="Saldo">
- Carregando...
- </text>
- <button label="" label_selected="" name="buycurrency" tool_tip="Comprar dinheiro"/>
- <text name="TimeText" tool_tip="Hora atual (do Pacífico)">
- 12:00 AM
- </text>
- <string name="StatBarDaysOfWeek">
+ <panel.string name="StatBarDaysOfWeek">
Domingo:Segunda-feira:Terça-feira:Quarta-feira:Quinta-feira:Sexta-feira:Sábado
- </string>
- <string name="StatBarMonthsOfYear">
+ </panel.string>
+ <panel.string name="StatBarMonthsOfYear">
Janeiro:Fevereiro:Março:Abril:Maio:Junho:Julho:Agosto:Setembro:Outubro:Novembro:Dezembro
- </string>
- <button label="" label_selected="" name="scriptout" tool_tip="Erros e avisos do Script"/>
- <button label="" label_selected="" name="health" tool_tip="Saúde"/>
- <text name="HealthText" tool_tip="Saúde">
- 100%
- </text>
- <button label="" label_selected="" name="no_fly" tool_tip="Não é permitido Voar"/>
- <button label="" label_selected="" name="no_build" tool_tip="Construir/Rezzar não permitido"/>
- <button label="" label_selected="" name="no_scripts" tool_tip="Scripts não permitidos"/>
- <button label="" label_selected="" name="restrictpush" tool_tip="Não Empurrar"/>
- <button label="" label_selected="" name="status_no_voice" tool_tip="Voz não disponível aqui"/>
- <button label="" label_selected="" name="buyland" tool_tip="Comprar este lote"/>
- <line_editor label="Buscar" name="search_editor" tool_tip="Buscar no [SECOND_LIFE]"/>
- <button label="" label_selected="" name="search_btn" tool_tip="Buscar no [SECOND_LIFE]"/>
- <string name="packet_loss_tooltip">
+ </panel.string>
+ <panel.string name="packet_loss_tooltip">
Perda de pacote
- </string>
- <string name="bandwidth_tooltip">
+ </panel.string>
+ <panel.string name="bandwidth_tooltip">
Banda
- </string>
+ </panel.string>
+ <panel.string name="time">
+ [hour12, datetime, slt]:[min, datetime, slt] [ampm, datetime, slt] [timezone,datetime, slt]
+ </panel.string>
+ <panel.string name="timeTooltip">
+ [weekday, datetime, slt], [day, datetime, slt] [month, datetime, slt] [year, datetime, slt]
+ </panel.string>
+ <panel.string name="buycurrencylabel">
+ L$ [AMT]
+ </panel.string>
+ <panel name="balance_bg">
+ <text name="balance" tool_tip="Meu saldo" value="L$20"/>
+ <button label="Comprar L$" name="buyL" tool_tip="Comprar mais L$"/>
+ </panel>
+ <text name="TimeText" tool_tip="Hora atual (Pacífico)">
+ 24:00 AM PST
+ </text>
+ <button name="media_toggle_btn" tool_tip="Tocar/Pausar todas mídias (música, vídeo, páginas web)"/>
+ <button name="volume_btn" tool_tip="Volume geral"/>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_teleport_history.xml b/indra/newview/skins/default/xui/pt/panel_teleport_history.xml
new file mode 100644
index 0000000000..ba83fee7ba
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_teleport_history.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="Teleport History">
+ <accordion name="history_accordion">
+ <accordion_tab name="today" title="Hoje"/>
+ <accordion_tab name="yesterday" title="Ontem"/>
+ <accordion_tab name="2_days_ago" title="2 dias atrás"/>
+ 5
+ <accordion_tab name="3_days_ago" title="3 dias atrás"/>
+ <accordion_tab name="4_days_ago" title="4 dias atrás"/>
+ <accordion_tab name="5_days_ago" title="5 dias atrás"/>
+ <accordion_tab name="6_days_and_older" title="6 dias e mais velhos"/>
+ <accordion_tab name="1_month_and_older" title="1 mês e mais velhos"/>
+ <accordion_tab name="6_months_and_older" title="6 meses e mais velhos"/>
+ </accordion>
+ <panel name="bottom_panel">
+ <button name="gear_btn" tool_tip="Mostrar opções adicionais"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_teleport_history_item.xml b/indra/newview/skins/default/xui/pt/panel_teleport_history_item.xml
new file mode 100644
index 0000000000..65f80fddd2
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_teleport_history_item.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="teleport_history_item">
+ <button name="profile_btn" tool_tip="Mostrar dados do item"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_voice_effect.xml b/indra/newview/skins/default/xui/pt/panel_voice_effect.xml
new file mode 100644
index 0000000000..08e89f46f9
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/panel_voice_effect.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="panel_voice_effect">
+ <string name="no_voice_effect">
+ Não distorcer voz
+ </string>
+ <string name="preview_voice_effects">
+ Checar distorção de voz ▶
+ </string>
+ <string name="get_voice_effects">
+ Distorcer voz â–¶
+ </string>
+ <combo_box name="voice_effect" tool_tip="Selecione um efeito de distorção para mudar sua voz.">
+ <combo_box.item label="Não distorcer voz" name="no_voice_effect"/>
+ </combo_box>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/panel_world_map.xml b/indra/newview/skins/default/xui/pt/panel_world_map.xml
index 2fda713ec7..accab068fd 100644
--- a/indra/newview/skins/default/xui/pt/panel_world_map.xml
+++ b/indra/newview/skins/default/xui/pt/panel_world_map.xml
@@ -1,5 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<panel name="world_map">
+ <panel.string name="Loading">
+ Carregando...
+ </panel.string>
+ <panel.string name="InvalidLocation">
+ Localização inválida
+ </panel.string>
<panel.string name="world_map_north">
N
</panel.string>
@@ -24,6 +30,12 @@
<panel.string name="world_map_northwest">
NO
</panel.string>
+ <panel.string name="world_map_person">
+ 1 pessoa
+ </panel.string>
+ <panel.string name="world_map_people">
+ [NUMBER] pessoas
+ </panel.string>
<text label="N" name="floater_map_north" text="N">
N
</text>
diff --git a/indra/newview/skins/default/xui/pt/role_actions.xml b/indra/newview/skins/default/xui/pt/role_actions.xml
index 8d192d4002..2e6e4dd133 100644
--- a/indra/newview/skins/default/xui/pt/role_actions.xml
+++ b/indra/newview/skins/default/xui/pt/role_actions.xml
@@ -1,186 +1,71 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<role_actions>
- <action_set
- description="Esta habilidades incluem poderes de adicionar ou remover membros do grupo e permitir que novos membros se juntem sem um convite."
- name="Membership">
- <action description="Convidar pessoas para este grupo"
- longdescription="Convide pessoas para este grupo usando o botão &apos;Convidar nova pessoa...&apos; em Membros &amp; aba Funções &gt; sub-aba Membros."
- name="member invite" />
- <action description="Expulsar membros deste grupo"
- longdescription="Expulse membros deste grupo usando o botão &apos;Expulsar do grupo&apos; em Membros &amp; aba Funções &gt; sub-aba Membros. Um proprietário pode expulsar qualquer um, exceto outro proprietário. Se você não é um proprietário, um membro pode expulsá-lo do grupo se, e somente se, ele apenas tiver a função de todos e não outras funções. Para remover membros de funções, você precisa ter a habilidade &apos;Remover membros de funções&apos;."
- name="member eject" />
- <action
- description="Ativar/desativar &apos;Abrir registro&apos; e mudar &apos;Taxa de assinatura&apos;"
- longdescription="Ative/desative &apos;Abrir registro&apos; para permitir que novos membros se unam sem um convite, e mude a &apos;Taxa de registro&apos; na seção Preferência de grupo da aba Geral."
- name="member options" />
+ <action_set description="Esta habilidades incluem poderes de adicionar ou remover membros do grupo e permitir que novos membros se juntem sem um convite." name="Membership">
+ <action description="Convidar pessoas para este grupo" longdescription="Em Membros &gt; Cargos, use o botão &apos;Convidar&apos; para convidar pessoas para entrar no grupo." name="member invite"/>
+ <action description="Expulsar membros deste grupo" longdescription="Em Membros &gt; Cargos, use o botão &apos;Ejetar&apos; para tirar pessoas do grupo. Proprietários podem expulsar qualquer pessoa, menos outro proprietário. Se você não é Proprietário, um membro só pode ser expulso se tiver cargo &apos;Todos&apos; e nenhum outro cargo. Para destituir um membro de seu cargo, você precisa ter a função &apos;Destituir membro com cargo&apos;." name="member eject"/>
+ <action description="Alterna entre &apos;Inscrições abertas&apos; e &apos;Taxa de associação&apos;." longdescription="Ative &apos;Inscrições abertas&apos; para que novos membros entrem no grupo sem convite, mude a &apos;Taxa de associação&apos; na seção Geral." name="member options"/>
</action_set>
- <action_set
- description="Estas habilidades incluem poderes de adicionar, remover e mudar funções do grupo; adicionar e remover membros em funções e designar habilidades a funções."
- name="Roles">
- <action description="Criar novas funções"
- longdescription="Crie novas funções em Membros &amp; aba Funções &gt; sub-aba Funções."
- name="role create" />
- <action description="Apagar funções"
- longdescription="Apague funções em Membros &amp; aba Funções &gt; sub-aba Funções."
- name="role delete" />
- <action description="Mudar nomes de função, títulos e descrições"
- longdescription="Mude o nome de funções, títulos e descrições na parte inferior de Membros &amp; aba Funções &gt; sub-aba Funções após selecionar uma função."
- name="role properties" />
- <action description="Designar membros para a função do designador"
- longdescription="Designe membros a funções na seção de funções designadas de Membros &amp; aba Funções &gt; sub-aba Membros. Um membro com este poder pode somente adicionar membros para a função que o designador já possui."
- name="role assign member limited" />
- <action description="Designar membros para qualquer função"
- longdescription="Designe membros a qualquer função na seção de funções designadas de Membros &amp; aba Funções &gt; sub-aba Membros. *AVISO* Quaisquer membros em uma função com esta habilidade podem designar a si próprios--e quaisquer outros membros não proprietários--para funções que têm mais poderes do que as atuais, elevando-os a poderes próximos ao do proprietário. Certifique-se de saber o que está fazendo antes de designar esta habilidade."
- name="role assign member" />
- <action description="Remover membros das funções"
- longdescription="Remova membros de funções na seção de funções designadas de Membros &amp; aba Funções &gt; sub-aba Membros. Proprietários não podem ser removidos."
- name="role remove member" />
- <action description="Determinar e remover habilidades em funções"
- longdescription="Designe e remova habilidades em funções na seção habilidades pertmitidas de Membros &amp; aba Funções &gt; sub-aba Funções. *AVISO* Quaisquer membros em uma função com esta habilidade podem desginar a si próprios--e quaisquer outros membros não proprietários--todas as habilidades, elevando-os a poderes próximos ao do proprietário. Certifique-se de saber o que está fazendo antes de designar esta habilidade."
- name="role change actions" />
+ <action_set description="Estas habilidades incluem poderes de adicionar, remover e mudar funções do grupo; adicionar e remover membros em funções e designar habilidades a funções." name="Roles">
+ <action description="Criar novas funções" longdescription="Crie novos cargos na guia Cargos." name="role create"/>
+ <action description="Apagar funções" longdescription="Exclua cargos na guia Cargos." name="role delete"/>
+ <action description="Modificar o nome, título e a descrição de cargos, e se o acesso a essas informações é público ou não" longdescription="Modificar o nome, título e a descrição de cargos, e se o acesso a essas informações é público ou não. Essas configurações ficam na guia Cargos, depois da seleção do cargo." name="role properties"/>
+ <action description="Designar membros para a função do designador" longdescription="Na lista Cargos desempenhados, distribua os cargos aos membros (em Cargos &gt; guia Membros). Membros exercendo esta função devem exercer um cargo para poder adicionar outros membros ao mesmo cargo." name="role assign member limited"/>
+ <action description="Designar membros para qualquer função" longdescription="Designe cargos aos membros na lista Cargos desempenhados (Cargos &gt; guia Membros). *ATENÇÃO* Qualquer membro exercendo um cargo com esta função pode se designar -- ou designar outros membros não-proprietários -- a cargos com mais poder do que têm. Ou seja, membros com essa função podem assumir poderes quase iguais aos do proprietário. Pense bem antes de dar esta função a alguém." name="role assign member"/>
+ <action description="Remover membros das funções" longdescription="Use a lista Cargos desempenhados para destituir membros de seus cargos (Cargos &gt; guia Membros). Proprietários não podem ser destituídos." name="role remove member"/>
+ <action description="Determinar e remover habilidades em funções" longdescription="Use a lista Funções autorizadas para adicionar e tirar as funções de cada cargo (Cargos &gt; guia Cargos). *ATENÇÃO* Qualquer membro exercendo um cargo com esta função pode dar a sim mesmo -- ou a outros membros não-proprietários -- todas as funções. Membros excercendo todas as funções podem assumir poderes quase iguais aos do proprietário. Pense bem antes de dar esta função a alguém." name="role change actions"/>
</action_set>
- <action_set
- description="Estas habilidade incluem poderes para modificar esta identidade de grupo, como mudar a visibilidade pública, apresentação e insígnia."
- name="Group Identity">
- <action
- description="Mudar apresentação, insígnia, &apos;Publicar na web&apos;, e quais membros estão publicamente visíveis em Informações do Grupo."
- longdescription="Mude a apresentação, insígnia, &apos;Publicar na web&apos; e quais membros estão publicamente visíveis em Informações do grupo. É feito na aba Geral."
- name="group change identity" />
+ <action_set description="Estas habilidade incluem poderes para modificar esta identidade de grupo, como mudar a visibilidade pública, apresentação e insígnia." name="Group Identity">
+ <action description="Mudar apresentação, insígnia, &apos;Publicar na web&apos;, e quais membros estão publicamente visíveis em Informações do Grupo." longdescription="Modificar o estatuto, símbolo e exibição nos resultados de busca. Use a seção Geral." name="group change identity"/>
</action_set>
- <action_set
- description="Estas habilidades incluem poderes para transferir, modificar e vender terrenos do grupo. Vá pra a janela Sobre o terreno, clique com o botão direito no terreno e selecione &apos;Sobre o terreno...&apos; ou clique na informação da parcela na barra do menu."
- name="Parcel Management">
- <action description="Transferir e comprar terreno para o grupo"
- longdescription="Transfere e compre terreno para o grupo. É feito em Sobre o terreno &gt; aba Geral."
- name="land deed" />
- <action description="Abandonar terreno para Governador Linden"
- longdescription="Abandone terreno para Governador Linden. *AVISO* Qualquer membro em uma função com esta habilidade pode abandonar o terreno pertencente ao grupo em Sobre o terreno &gt; aba Geral, revertendo à posse Linden sem uma venda! Certifique-se de saber o que está fazendo antes de designar esta habilidade."
- name="land release" />
- <action description="Definir terreno para informação de venda"
- longdescription="Defina informações de venda para terreno. *AVISO* Qualquer membro em uma função com esta habilidade pode vender terrenos pertencentes ao grupo em Sobre o terreno &gt; aba Geral como quiser! Certifique-se de sabe o que está fazendo antes de designar esta habilidade."
- name="land set sale info" />
- <action description="Subdividir e unir parcelas"
- longdescription="Subdivide and join parcels. This is done by right-clicking the ground, &apos;Edit Terrain&apos;, and dragging your mouse on the land to make a selection. To subdivide, select what you want to split and click &apos;Subdivide...&apos;. To join, select two or more contiguous parcels and click &apos;Join...&apos;. "
- name="land divide join" />
+ <action_set description="Estas funções incluem poderes de transferir, vender e modificar os terrenos do grupo. Para acessar a janela &apos;Sobre terrenos&apos;, clique no chão com o botão direito e selecione &apos;Sobre terrenos&apos;. Ou clique no ícone &apos;i&apos; da barra de navegação." name="Parcel Management">
+ <action description="Transferir e comprar terreno para o grupo" longdescription="Transfere e compre terreno para o grupo. É feito em Sobre o terreno &gt; aba Geral." name="land deed"/>
+ <action description="Abandonar terreno para Governador Linden" longdescription="Abandone terreno para Governador Linden. *AVISO* Qualquer membro em uma função com esta habilidade pode abandonar o terreno pertencente ao grupo em Sobre o terreno &gt; aba Geral, revertendo à posse Linden sem uma venda! Certifique-se de saber o que está fazendo antes de designar esta habilidade." name="land release"/>
+ <action description="Definir terreno para informação de venda" longdescription="Defina informações de venda para terreno. *AVISO* Qualquer membro em uma função com esta habilidade pode vender terrenos pertencentes ao grupo em Sobre o terreno &gt; aba Geral como quiser! Certifique-se de sabe o que está fazendo antes de designar esta habilidade." name="land set sale info"/>
+ <action description="Subdividir e unir parcelas" longdescription="Juntar ou dividir lotes. Clique no chão com o botão direito, selecione &apos;Editar terreno&apos; e arraste o mouse sobre o terreno para ver as opções. Para dividir um terreno, selecione a área a ser dividida e clique em &apos;Dividir&apos;. Para juntar terrenos, selecione dois ou mais lotes adjacentes e clique em &apos;Juntar&apos;." name="land divide join"/>
</action_set>
- <action_set
- description="Estas habilidades incluem poderes para mudar o nome da parcelas e configurações de publicação, visibilidade da busca de diretório e ponto de aterrissagem &amp; opções de rota de TP."
- name="Parcel Identity">
- <action
- description="Ativar/desativar &apos;Exibir em locais de encontro&apos; e definir categoria"
- longdescription="Ativar/desativar &apos;Exibir em locais de encontro&apos; e configurar uma categoria de parcela em Sobre o terreno &gt; aba Opções."
- name="land find places" />
- <action
- description="Mudar nome da parcela, descrição, e configurações &apos;Publicar na web&apos;"
- longdescription="Mude o nome da parcela, descrição e configurações de &apos;Publicar na web&apos;. É feito em Sobre o terreno &gt; aba Opções."
- name="land change identity" />
- <action description="Definir ponto de aterrissagem e rota de teletransporte"
- longdescription="Em uma parcela pertencente ao grupo, membros em uma função com esta habilidade podem definir um ponto de aterrissagem para especificar onde os teletransportes chegam e também definir a rota do teletransporte para um maior controle. É feito em Sobre o terreno &gt; aba Opções."
- name="land set landing point" />
+ <action_set description="Estas habilidades incluem poderes para mudar o nome da parcelas e configurações de publicação, visibilidade da busca de diretório e ponto de aterrissagem &amp; opções de rota de TP." name="Parcel Identity">
+ <action description="Alternar &apos;Exibir nos resultados de busca&apos; e selecionar a categoria" longdescription="Alterne entre &apos;Exibir nos resultados de busca&apos; ou não, e selecione a categoria do terreno em &apos;Sobre o terreno&apos;." name="land find places"/>
+ <action description="Mude o nome, a descrição e a exibição do terreno nos resultados de busca." longdescription="Mude o nome, a descrição e a exibição do terreno nos resultados de busca. Veja essas opções em Sobre o terreno &gt; guia Opções." name="land change identity"/>
+ <action description="Definir ponto de aterrissagem e rota de teletransporte" longdescription="Em uma parcela pertencente ao grupo, membros em uma função com esta habilidade podem definir um ponto de aterrissagem para especificar onde os teletransportes chegam e também definir a rota do teletransporte para um maior controle. É feito em Sobre o terreno &gt; aba Opções." name="land set landing point"/>
</action_set>
- <action_set
- description="Estas habilidade incluem poderes que afetam opções de parcela, como &apos;Criar objetos&apos;, &apos;Editar terreno&apos; e música &amp; configurações de mídia."
- name="Parcel Settings">
- <action description="Mudar música &amp; configurações de mídia"
- longdescription="Mude streaming de música e configurações de vídeo em Sobre o terreno &gt; aba Mídia."
- name="land change media" />
- <action description="Ativar/desativar &apos;Editar terreno&apos;"
- longdescription="Ative/desative &apos;Editar terreno&apos;. *AVISO* Sobre o terreno &gt; aba Opções &gt; Editar terreno permite a qualquer um alterar as formas de seu terreno, substituir e mover plantas Linden. Certifique-se de saber o que está fazendo antes de desginar esta habilidade. A edição de terreno é ativada/desativada em Sobre o terreno &gt; aba Opções."
- name="land edit" />
- <action
- description="Ativar/desativar variados Sobre o Terreno &gt; Opções de configuração"
- longdescription="Ative/desative &apos;Seguro (sem dano)&apos;, &apos;Voar&apos;, e permita a outros residentes: &apos;Criar objetos&apos;, &apos;Editar terreno&apos;, &apos;Criar pontos de referência&apos;, e &apos;Executar scripts&apos; em um terreno pertencente ao grupo em Sobre o terreno &gt; aba Opções."
- name="land options" />
+ <action_set description="Estas habilidade incluem poderes que afetam opções de parcela, como &apos;Criar objetos&apos;, &apos;Editar terreno&apos; e música &amp; configurações de mídia." name="Parcel Settings">
+ <action description="Mudar música &amp; configurações de mídia" longdescription="Mude streaming de música e configurações de vídeo em Sobre o terreno &gt; aba Mídia." name="land change media"/>
+ <action description="Ativar/desativar &apos;Editar terreno&apos;" longdescription="Ative/desative &apos;Editar terreno&apos;. *AVISO* Sobre o terreno &gt; aba Opções &gt; Editar terreno permite a qualquer um alterar as formas de seu terreno, substituir e mover plantas Linden. Certifique-se de saber o que está fazendo antes de desginar esta habilidade. A edição de terreno é ativada/desativada em Sobre o terreno &gt; aba Opções." name="land edit"/>
+ <action description="Ativar/desativar variados Sobre o Terreno &gt; Opções de configuração" longdescription="Alterna as opções &apos;Seguro (zero danos)&apos;, &apos;Voar&apos; e autorizar outros residentes a: &apos;Editar terreno&apos;, &apos;Contruir&apos;, &apos;Criar marcos&apos; e &apos;Executar scripts&apos; nos terrenos do grupo. Clique em Sobre o terreno &gt; guia Opções." name="land options"/>
</action_set>
- <action_set
- description="Estas habilidades incluem poderes que permitem a membros ultrapassar restrições em parcelas pertencentes ao grupo."
- name="Parcel Powers">
- <action description="Sempre permitir &apos;Editar terreno&apos;"
- longdescription="Membros em uma função com esta habilidade podem editar terreno em uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno &gt; aba Opções."
- name="land allow edit land" />
- <action description="Sempre permitir &apos;Voar&apos;"
- longdescription="Membros em uma função com esta habilidade podem voar sobre uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno &gt; aba Opções."
- name="land allow fly" />
- <action description="Sempre permitir &apos;Criar objetos&apos;"
- longdescription="Membros em uma função com esta habilidade podem criar objetos em uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno &gt; aba Opções."
- name="land allow create" />
- <action description="Sempre permitir &apos;Criar ponto de referência&apos;"
- longdescription="Membros em uma função com esta habilidade podem colocar um ponto de referência uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno &gt; aba Opções."
- name="land allow landmark" />
- <action description="Permitir &apos;Colocar casa aqui&apos; no terreno do grupo"
- longdescription="Membros em uma função com esta habilidade podem usar o menu Mundo &gt; Definir lar aqui em uma parcela do grupo (definir terreno ou transferir para este grupo)."
- name="land allow set home" />
+ <action_set description="Estas habilidades incluem poderes que permitem a membros ultrapassar restrições em parcelas pertencentes ao grupo." name="Parcel Powers">
+ <action description="Sempre permitir &apos;Editar terreno&apos;" longdescription="Membros em uma função com esta habilidade podem editar terreno em uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno &gt; aba Opções." name="land allow edit land"/>
+ <action description="Sempre permitir &apos;Voar&apos;" longdescription="Membros em uma função com esta habilidade podem voar sobre uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno &gt; aba Opções." name="land allow fly"/>
+ <action description="Sempre permitir &apos;Criar objetos&apos;" longdescription="Membros em uma função com esta habilidade podem criar objetos em uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno &gt; aba Opções." name="land allow create"/>
+ <action description="Sempre permitir &apos;Criar ponto de referência&apos;" longdescription="Membros em uma função com esta habilidade podem colocar um ponto de referência uma parcela pertencente ao grupo, mesmo se estiver desativada em Sobre o terreno &gt; aba Opções." name="land allow landmark"/>
+ <action description="Permitir &apos;Colocar casa aqui&apos; no terreno do grupo" longdescription="Membros exercendo cargos com esta função podem selecionar no menu Mundo &gt; Marcos &gt; Definir como casa em lotes doados ao grupo." name="land allow set home"/>
</action_set>
- <action_set
- description="Estas habilidades incluem poderes de permitir ou restringir acesso a parcelas pertencentes ao grupo, incluindo congelar e expulsar residentes."
- name="Parcel Access">
- <action description="Gerenciar listas de acesso à parcela"
- longdescription="Gerencie a lista de acesso à parcela em Sobre o terreno &gt; aba Acesso."
- name="land manage allowed" />
- <action description="Gerenciar lista de banidos da parcela"
- longdescription="Gerencie a lista de banidos da parcela em Sobre o terreno &gt; aba Banido."
- name="land manage banned" />
- <action description="Mudar configurações de parcela &apos;Vender passes...&apos;"
- longdescription="Mude configurações de &apos;Vender passes...&apos; em Sobre o terreno &gt; aba Acesso."
- name="land manage passes" />
- <action description="Expulsar e congelar residentes nas parcelas"
- longdescription="Membros em uma função com esta habilidade podem lidar com um residente indesejado em uma parcela pertencente ao grupo clicando com o botão direitos sobre ele, Mais &gt; e selecionado &apos;Expulsar...&apos; ou &apos;Congelar...&apos;."
- name="land admin" />
+ <action_set description="Estas habilidades incluem poderes de permitir ou restringir acesso a parcelas pertencentes ao grupo, incluindo congelar e expulsar residentes." name="Parcel Access">
+ <action description="Gerenciar listas de acesso à parcela" longdescription="Gerencie a lista de acesso à parcela em Sobre o terreno &gt; aba Acesso." name="land manage allowed"/>
+ <action description="Gerenciar lista de banidos da parcela" longdescription="Administre as listas de acesso e bloqueio em Sobre o terreno &gt; guia Acesso." name="land manage banned"/>
+ <action description="Modificar as opções &apos;Vender passes para&apos;" longdescription="Mude as opções &apos;Vender passes para&apos; em Sobre o terreno &gt; guia Acesso." name="land manage passes"/>
+ <action description="Expulsar e congelar residentes nas parcelas" longdescription="Membros exercendo cargos com esta função podem lidar com residentes problemáticos nos terrenos do grupo. Clique no residente com o botão direito, depois selecione &apos;Ejetar&apos; ou &apos;Congelar&apos;." name="land admin"/>
</action_set>
- <action_set
- description="Estas habilidades incluem poderes de permitir a membros retornar objetos e colocar e mover plantas Linden. Útil para que membros organizem a paisagem, porém deve ser usado com cuidado, devido a não ser possível desfazer a mudança dos objetos."
- name="Parcel Content">
- <action description="Retornar objetos que pertencem ao grupo"
- longdescription="Retorne objetos em parcelas pertencentes ao grupo que pertencem ao grupo em Sobre o terreno &gt; aba Objetos."
- name="land return group owned" />
- <action description="Retornar objetos definidos para o grupo"
- longdescription="Retorne objetos em parcelas pertencentes ao grupo que em Sobre o terrreno &gt; aba Objetos."
- name="land return group set" />
- <action description="Retornar objetos que não pertencem ao grupo"
- longdescription="Retorne objetos nas parcelas pertencentes a um grupo que estão sem grupo em em Sobre o terreno &gt; aba Objetos."
- name="land return non group" />
- <action description="Ajardinar usando plantas Linden"
- longdescription="A habilidade de ajardinar permite colocar e mover árvores Linden, plantas e gramas. Estes itens podem ser encontrando na Biblioteca de seu inventário &gt; pasta Objetos ou podem ser criados através do botão Construir."
- name="land gardening" />
+ <action_set description="Estas habilidades incluem poderes de permitir a membros retornar objetos e colocar e mover plantas Linden. Útil para que membros organizem a paisagem, porém deve ser usado com cuidado, devido a não ser possível desfazer a mudança dos objetos." name="Parcel Content">
+ <action description="Retornar objetos que pertencem ao grupo" longdescription="Retorne objetos em parcelas pertencentes ao grupo que pertencem ao grupo em Sobre o terreno &gt; aba Objetos." name="land return group owned"/>
+ <action description="Retornar objetos definidos para o grupo" longdescription="Retorne objetos em parcelas pertencentes ao grupo que em Sobre o terrreno &gt; aba Objetos." name="land return group set"/>
+ <action description="Retornar objetos que não pertencem ao grupo" longdescription="Retorne objetos nas parcelas pertencentes a um grupo que estão sem grupo em em Sobre o terreno &gt; aba Objetos." name="land return non group"/>
+ <action description="Ajardinar usando plantas Linden" longdescription="Função de paisagismo: poder de plantar e mudar árvores, plantas e grama Linden. A pasta Biblioteca &gt; Objetos do inventário contém material de paisagismo. Use o menu Construir para criar suas próprias plantas." name="land gardening"/>
</action_set>
- <action_set
- description="These Abilities include powers to deed, modify, and sell group-owned objects. These changes are done in the Edit Tools &gt; General Tab. Right-click an object and Edit to see its settings. "
- name="Object Management">
- <action description="Transferir objetos para o grupo"
- longdescription="Transfere objetos para o grupo em Editar ferramentas &gt; aba Geral."
- name="object deed" />
- <action description="Manipular (mover, copiar, modificar) objetos do grupo"
- longdescription="Manipule (mover,copiar, modificar) objetos pertencentes ao grupo em Editar Ferramentas &gt; aba Geral."
- name="object manipulate" />
- <action description="Definir objetos pertencentes ao grupo para venda"
- longdescription="Defina objetos pertencentes ao grupo para venda em Editar Ferramentas &gt; aba Geral."
- name="object set sale" />
+ <action_set description="Estas funções incluem poderes de transferir, vender e modificar os objetos do grupo. Essas opções ficam nas Ferramentas de contrução &gt; guia Geral. Clique em um objeto com o botão direito e selecione Editar para ver as configurações do objeto." name="Object Management">
+ <action description="Transferir objetos para o grupo" longdescription="Transfira objetos para o grupo em Ferramentas de construção &gt; guia Geral." name="object deed"/>
+ <action description="Manipular (mover, copiar, modificar) objetos do grupo" longdescription="Manipule (transportar, copiar, modificar) objetos do grupo nas Ferramentas de construção &gt; guia Geral." name="object manipulate"/>
+ <action description="Definir objetos pertencentes ao grupo para venda" longdescription="Ponha objetos do grupo à venda nas Ferramentas de construção &gt; guia Geral." name="object set sale"/>
</action_set>
- <action_set
- description="Estas habilidades incluem poderes que requerem que membros paguem dívidas e recebam dividendos do grupo, e restringem acesso ao histórico de conta do grupo."
- name="Accounting">
- <action description="Pagar débitos e receber dividendos do grupo"
- longdescription="Members in a Role with this Ability will automatically pay group liabilities and receive group dividends. This means they will receive a portion of group-owned land sales which are distributed daily, as well as contribute towards things like parcel listing fees. "
- name="accounting accountable" />
+ <action_set description="Estas habilidades incluem poderes que requerem que membros paguem dívidas e recebam dividendos do grupo, e restringem acesso ao histórico de conta do grupo." name="Accounting">
+ <action description="Pagar débitos e receber dividendos do grupo" longdescription="Members in a Role with this Ability will automatically pay group liabilities and receive group dividends. This means they will receive a portion of group-owned land sales which are distributed daily, as well as contribute towards things like parcel listing fees. " name="accounting accountable"/>
</action_set>
- <action_set
- description="Estas habilidade incluem poderes de permitir enviar, receber e ver avisos de grupo."
- name="Notices">
- <action description="Enviar aviso"
- longdescription="Membros em uma função com esta habiliade podem enviar avisos em Informações de grupo &gt; aba Avisos."
- name="notices send" />
- <action description="Receber novos avisos e ver os anteriores"
- longdescription="Membros em uma função com esta habilidade podem receber os novos avisos e ver os anteriores em Informações de grupo &gt; aba Avisos."
- name="notices receive" />
+ <action_set description="Estas habilidade incluem poderes de permitir enviar, receber e ver avisos de grupo." name="Notices">
+ <action description="Enviar aviso" longdescription="Membros que exercem cargos com esta função podem enviar avisos na seção Avisos." name="notices send"/>
+ <action description="Receber novos avisos e ver os anteriores" longdescription="Membros que exercem cargos com esta função podem receber e ler avisos antigos na seção Avisos." name="notices receive"/>
</action_set>
- <action_set
- description="Estas habilidades incluem poderes de permitir a membros definir e votar em propostas e ver histórico de votação."
- name="Proposals">
- <action description="Criar proposta"
- longdescription="Membros em uma função com esta habilidade podem criar proposta para serem votadas em Informações de grupo &gt; aba Propostas."
- name="proposal start" />
- <action description="Votar em propostas"
- longdescription="Membros em uma função com esta habilidade podem votar em propostas em Informações de grupo &gt; aba Propostas."
- name="proposal vote" />
+ <action_set description="Estas habilidades incluem poderes de permitir a membros definir e votar em propostas e ver histórico de votação." name="Proposals">
+ <action description="Criar proposta" longdescription="Membros em uma função com esta habilidade podem criar proposta para serem votadas em Informações de grupo &gt; aba Propostas." name="proposal start"/>
+ <action description="Votar em propostas" longdescription="Membros em uma função com esta habilidade podem votar em propostas em Informações de grupo &gt; aba Propostas." name="proposal vote"/>
</action_set>
</role_actions>
diff --git a/indra/newview/skins/default/xui/pt/sidepanel_appearance.xml b/indra/newview/skins/default/xui/pt/sidepanel_appearance.xml
new file mode 100644
index 0000000000..f075f45b8f
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/sidepanel_appearance.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Looks" name="appearance panel">
+ <string name="No Outfit" value="Nenhum"/>
+ <string name="Unsaved Changes" value="Mudanças não salvas"/>
+ <string name="Now Wearing" value="Look atual..."/>
+ <panel name="panel_currentlook">
+ <button label="E" name="editappearance_btn"/>
+ <button label="O" name="openoutfit_btn"/>
+ <text name="currentlook_status">
+ (Status)
+ </text>
+ </panel>
+ <filter_editor label="Filtrar looks" name="Filter"/>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/sidepanel_inventory.xml b/indra/newview/skins/default/xui/pt/sidepanel_inventory.xml
new file mode 100644
index 0000000000..e382da258f
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/sidepanel_inventory.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel label="Coisas" name="objects panel">
+ <panel label="" name="sidepanel__inventory_panel">
+ <panel name="button_panel">
+ <button label="Perfil" name="info_btn" tool_tip="Mostrar perfil do objeto"/>
+ <button label="Compartilhar" name="share_btn" tool_tip="Compartilhar item de inventário"/>
+ <button label="Comprar" name="shop_btn" tool_tip="Abrir página do Marketplace"/>
+ <button label="Vestir" name="wear_btn" tool_tip="Vestir visual selecionado"/>
+ <button label="Tocar" name="play_btn"/>
+ <button label="Teletransportar" name="teleport_btn" tool_tip="Teletransportar para a área selecionada"/>
+ </panel>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml b/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml
new file mode 100644
index 0000000000..4fc50bac67
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/sidepanel_item_info.xml
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="item properties" title="Perfil do objeto">
+ <panel.string name="unknown">
+ (desconhecido)
+ </panel.string>
+ <panel.string name="public">
+ (público)
+ </panel.string>
+ <panel.string name="you_can">
+ você pode:
+ </panel.string>
+ <panel.string name="owner_can">
+ Proprietário pode:
+ </panel.string>
+ <panel.string name="acquiredDate">
+ [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
+ </panel.string>
+ <text name="title" value="Perfil do objeto"/>
+ <text name="where" value="(Inventário)"/>
+ <panel label="">
+ <text name="LabelItemNameTitle">
+ Nome:
+ </text>
+ <text name="LabelItemDescTitle">
+ Descrição:
+ </text>
+ <text name="LabelCreatorTitle">
+ Criador:
+ </text>
+ <button label="Perfil..." name="BtnCreator"/>
+ <text name="LabelOwnerTitle">
+ Proprietário:
+ </text>
+ <button label="Perfil..." name="BtnOwner"/>
+ <text name="LabelAcquiredTitle">
+ Adquirido:
+ </text>
+ <text name="LabelAcquiredDate">
+ Quarta 24 de Maio 12:50:46 2006
+ </text>
+ <panel name="perms_inv">
+ <text name="perm_modify">
+ Você pode:
+ </text>
+ <check_box label="Modificar" name="CheckOwnerModify"/>
+ <check_box label="Copiar" name="CheckOwnerCopy"/>
+ <check_box label="Transferir" name="CheckOwnerTransfer"/>
+ <text name="AnyoneLabel">
+ Todos:
+ </text>
+ <check_box label="Copiar" name="CheckEveryoneCopy"/>
+ <text name="GroupLabel">
+ Grupo:
+ </text>
+ <check_box label="Compartilhar" name="CheckShareWithGroup" tool_tip="Permitir que todos os membros do grupo tenham o seu nível de modificação para este objeto. Faça uma doação para ativar restrições de função."/>
+ <text name="NextOwnerLabel">
+ Próximo proprietário:
+ </text>
+ <check_box label="Modificar" name="CheckNextOwnerModify"/>
+ <check_box label="Copiar" name="CheckNextOwnerCopy"/>
+ <check_box label="Transferir" name="CheckNextOwnerTransfer" tool_tip="O próximo dono poderá revender ou dar este objeto"/>
+ </panel>
+ <check_box label="À venda" name="CheckPurchase"/>
+ <combo_box name="combobox sale copy">
+ <combo_box.item label="Copiar" name="Copy"/>
+ <combo_box.item label="Original" name="Original"/>
+ </combo_box>
+ <spinner label="Preço: L$" name="Edit Cost"/>
+ </panel>
+ <panel name="button_panel">
+ <button label="Cancelar" name="cancel_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml b/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml
new file mode 100644
index 0000000000..9193730018
--- /dev/null
+++ b/indra/newview/skins/default/xui/pt/sidepanel_task_info.xml
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<panel name="object properties" title="Perfil do objeto">
+ <panel.string name="text deed continued">
+ Doar
+ </panel.string>
+ <panel.string name="text deed">
+ Doar
+ </panel.string>
+ <panel.string name="text modify info 1">
+ Você pode modificar este objeto
+ </panel.string>
+ <panel.string name="text modify info 2">
+ Você pode modificar estes objetos
+ </panel.string>
+ <panel.string name="text modify info 3">
+ Você não pode modificar este objeto
+ </panel.string>
+ <panel.string name="text modify info 4">
+ Você não pode modificar estes objetos
+ </panel.string>
+ <panel.string name="text modify warning">
+ O objeto contém links ligando suas partes
+ </panel.string>
+ <panel.string name="Cost Default">
+ Preço: L$
+ </panel.string>
+ <panel.string name="Cost Total">
+ Preço total: L$
+ </panel.string>
+ <panel.string name="Cost Per Unit">
+ Preço unitário: L$
+ </panel.string>
+ <panel.string name="Cost Mixed">
+ Preço misto
+ </panel.string>
+ <panel.string name="Sale Mixed">
+ Venda mista
+ </panel.string>
+ <text name="title" value="Perfil do objeto"/>
+ <text name="where" value="(inworld)"/>
+ <panel label="" name="properties_panel">
+ <text name="Name:">
+ Nome:
+ </text>
+ <text name="Description:">
+ Descrição:
+ </text>
+ <text name="CreatorNameLabel">
+ Criador:
+ </text>
+ <text name="Creator Name">
+ Erica Linden
+ </text>
+ <text name="Owner:">
+ Proprietário:
+ </text>
+ <text name="Owner Name">
+ Erica Linden
+ </text>
+ <text name="Group_label">
+ Grupo:
+ </text>
+ <button name="button set group" tool_tip="Selecione o grupo que terá acesso à autorização do objeto"/>
+ <name_box initial_value="Carregando..." name="Group Name Proxy"/>
+ <button label="Doar" label_selected="Doar" name="button deed" tool_tip="Ao doar este item, o próximo dono terá permissões de próximo dono. Objetos de grupos podem ser doados por um oficial do grupo."/>
+ <text name="label click action">
+ Clique para:
+ </text>
+ <combo_box name="clickaction">
+ <combo_box.item label="Tocar (padrão)" name="Touch/grab(default)"/>
+ <combo_box.item label="Sentar em objeto" name="Sitonobject"/>
+ <combo_box.item label="Comprar objeto" name="Buyobject"/>
+ <combo_box.item label="Pagar por objeto" name="Payobject"/>
+ <combo_box.item label="Abrir" name="Open"/>
+ </combo_box>
+ <panel name="perms_inv">
+ <text name="perm_modify">
+ Você pode modificar este objeto
+ </text>
+ <text name="Anyone can:">
+ Todos:
+ </text>
+ <check_box label="Copiar" name="checkbox allow everyone copy"/>
+ <check_box label="Movimentar" name="checkbox allow everyone move"/>
+ <text name="GroupLabel">
+ Grupo:
+ </text>
+ <check_box label="Compartilhar" name="checkbox share with group" tool_tip="Permitir que todos os membros do grupo tenham o seu nível de modificação para este objeto. Faça uma doação para ativar restrições de função."/>
+ <text name="NextOwnerLabel">
+ Próximo proprietário:
+ </text>
+ <check_box label="Modificar" name="checkbox next owner can modify"/>
+ <check_box label="Copiar" name="checkbox next owner can copy"/>
+ <check_box label="Transferir" name="checkbox next owner can transfer" tool_tip="O próximo dono poderá revender ou dar este objeto"/>
+ </panel>
+ <check_box label="À venda" name="checkbox for sale"/>
+ <combo_box name="sale type">
+ <combo_box.item label="Copiar" name="Copy"/>
+ <combo_box.item label="Conteúdo" name="Contents"/>
+ <combo_box.item label="Original" name="Original"/>
+ </combo_box>
+ <spinner label="Preço: L$" name="Edit Cost"/>
+ <check_box label="Mostrar nos resultados de busca" name="search_check" tool_tip="Incluir o objeto nos resultados de busca"/>
+ <text name="B:">
+ B:
+ </text>
+ <text name="O:">
+ O:
+ </text>
+ <text name="G:">
+ G:
+ </text>
+ <text name="E:">
+ E:
+ </text>
+ <text name="N:">
+ N:
+ </text>
+ <text name="F:">
+ F:
+ </text>
+ </panel>
+ <panel name="button_panel">
+ <button label="Abrir" name="open_btn"/>
+ <button label="Pagar" name="pay_btn"/>
+ <button label="Comprar" name="buy_btn"/>
+ <button label="Detalhes" name="details_btn"/>
+ </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml
index 9acfce99dd..80f52dfe46 100644
--- a/indra/newview/skins/default/xui/pt/strings.xml
+++ b/indra/newview/skins/default/xui/pt/strings.xml
@@ -1,12 +1,41 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<!-- This file contains strings that used to be hardcoded in the source.
It is only for those strings which do not belong in a floater.
- For example, the strings used in avatar chat bubbles, and strings
+ For example, the strings used in avatar chat bubbles, and strings
that are returned from one component and may appear in many places-->
<strings>
- <string name="create_account_url">http://join.secondlife.com/index.php?lang=pt-BR</string>
+ <string name="CAPITALIZED_APP_NAME">
+ SECOND LIFE
+ </string>
+ <string name="SUPPORT_SITE">
+ Portal de Supporte Second Life
+ </string>
+ <string name="StartupDetectingHardware">
+ Detectando hardware...
+ </string>
+ <string name="StartupLoading">
+ Carregando [APP_NAME]...
+ </string>
+ <string name="StartupClearingCache">
+ Limpando o cache...
+ </string>
+ <string name="StartupInitializingTextureCache">
+ Iniciando cache de texturas...
+ </string>
+ <string name="StartupInitializingVFS">
+ Iniciando VFS...
+ </string>
+ <string name="ProgressRestoring">
+ Restaurando...
+ </string>
+ <string name="ProgressChangingResolution">
+ Alterando a resolução...
+ </string>
<string name="LoginInProgress">
- Fazendo Login. [APP_NAME] pode parecer congelado. Por favor, aguarde.
+ Fazendo login. [APP_NAME] pode parecer congelado. Por favor, aguarde.
+ </string>
+ <string name="LoginInProgressNoFrozen">
+ Logando...
</string>
<string name="LoginAuthenticating">
Autenticando
@@ -15,7 +44,7 @@
Executando manutenção da conta...
</string>
<string name="LoginAttempt">
- Falha na tentativa anterior de login. Fazendo Login, tentativa [NUMBER]
+ Falha na tentativa anterior de login. Login, tentativa [NUMBER]
</string>
<string name="LoginPrecaching">
Carregando mundo...
@@ -26,14 +55,17 @@
<string name="LoginInitializingMultimedia">
Inicializando multimídia...
</string>
+ <string name="LoginInitializingFonts">
+ Carregando fontes...
+ </string>
<string name="LoginVerifyingCache">
- Verificando arquivos no cache (pode levar 60-90 segundos)...
+ Verificando arquivos cache (pode levar de 60-90 segundos)...
</string>
<string name="LoginProcessingResponse">
- Processando Resposta...
+ Processando resposta...
</string>
<string name="LoginInitializingWorld">
- Inicializando Mundo...
+ Inicializando mundo...
</string>
<string name="LoginDecodingImages">
Decodificando imagens...
@@ -42,13 +74,13 @@
Inicializando o QuickTime...
</string>
<string name="LoginQuicktimeNotFound">
- O QuickTime não foi encontrado - incapaz de inicializar.
+ O QuickTime não foi encontrado - falha ao iniciar.
</string>
<string name="LoginQuicktimeOK">
O QuickTime foi inicializado com sucesso.
</string>
<string name="LoginWaitingForRegionHandshake">
- Aguardando o handshake com a região...
+ Aguardando handshake com a região...
</string>
<string name="LoginConnectingToRegion">
Conectando à região...
@@ -56,9 +88,57 @@
<string name="LoginDownloadingClothing">
Baixando roupas...
</string>
+ <string name="InvalidCertificate">
+ O servidor respondeu com um certificado inválido ou corrompido. Por favor contate o administrador do Grid.
+ </string>
+ <string name="CertInvalidHostname">
+ Um hostname inválido foi usado para acessar o servidor. Verifique o SLURL ou hostname do Grid.
+ </string>
+ <string name="CertExpired">
+ O certificado dado pelo Grid parece estar vencido. Verifique o relógio do sistema ou contate o administrador do Grid.
+ </string>
+ <string name="CertKeyUsage">
+ O certificado dado pelo servidor não pôde ser usado para SSL. Por favor contate o administrador do Grid.
+ </string>
+ <string name="CertBasicConstraints">
+ A cadeia de certificados do servidor tinha certificados demais. Por favor contate o administrador do Grid.
+ </string>
+ <string name="CertInvalidSignature">
+ A assinatura do certificado dado pelo servidor do Grid não pôde ser verificada. Contate o administrador do seu Grid.
+ </string>
+ <string name="LoginFailedNoNetwork">
+ Erro de rede: Não foi possível estabelecer a conexão, verifique sua conexão de rede.
+ </string>
+ <string name="LoginFailed">
+ Falha do login.
+ </string>
+ <string name="Quit">
+ Sair
+ </string>
+ <string name="create_account_url">
+ http://join.secondlife.com/index.php?lang=pt-BR
+ </string>
<string name="AgentLostConnection">
Esta região pode estar passando por problemas. Por favor, verifique sua conexão com a internet.
</string>
+ <string name="SavingSettings">
+ Salvando configurações...
+ </string>
+ <string name="LoggingOut">
+ Saindo...
+ </string>
+ <string name="ShuttingDown">
+ Fechando...
+ </string>
+ <string name="YouHaveBeenDisconnected">
+ Você foi desconectado da região onde estava.
+ </string>
+ <string name="SentToInvalidRegion">
+ Você foi enviado para uma região inválida.
+ </string>
+ <string name="TestingDisconnect">
+ Teste de desconexão
+ </string>
<string name="TooltipPerson">
Pessoa
</string>
@@ -74,59 +154,29 @@
<string name="TooltipIsGroup">
(Grupo)
</string>
- <string name="TooltipFlagScript">
- Script
- </string>
- <string name="TooltipFlagPhysics">
- Física
- </string>
- <string name="TooltipFlagTouch">
- Toque
- </string>
- <string name="TooltipFlagL$">
- L$
- </string>
- <string name="TooltipFlagDropInventory">
- Dar Inventário
- </string>
- <string name="TooltipFlagPhantom">
- Imaterial
- </string>
- <string name="TooltipFlagTemporary">
- Temporário
- </string>
- <string name="TooltipFlagRightClickMenu">
- (Clique com o botão direito para acessar o menu)
- </string>
- <string name="TooltipFreeToCopy">
- Cópia Permitida
- </string>
<string name="TooltipForSaleL$">
À venda: L$[AMOUNT]
</string>
- <string name="TooltipForSaleMsg">
- À venda: [MESSAGE]
- </string>
<string name="TooltipFlagGroupBuild">
Construído por Grupo
</string>
<string name="TooltipFlagNoBuild">
- Não é Permitido Construir
+ Não é permitido construir
</string>
<string name="TooltipFlagNoEdit">
Construído por Grupo
</string>
<string name="TooltipFlagNotSafe">
- Não é Seguro
+ Não é seguro
</string>
<string name="TooltipFlagNoFly">
- Não é Permitido Voar
+ Não é permitido voar
</string>
<string name="TooltipFlagGroupScripts">
Scripts de Grupo
</string>
<string name="TooltipFlagNoScripts">
- Não são Permitidos Scripts
+ Não são permitidos scripts
</string>
<string name="TooltipLand">
Terreno:
@@ -134,11 +184,118 @@
<string name="TooltipMustSingleDrop">
Apenas um item único pode ser arrastado para este local
</string>
+ <string name="TooltipHttpUrl">
+ Clique para ver a página web
+ </string>
+ <string name="TooltipSLURL">
+ Clique para ver os dados desta localização
+ </string>
+ <string name="TooltipAgentUrl">
+ Clique para ver o perfil deste residente
+ </string>
+ <string name="TooltipAgentMute">
+ Clique para silenciar este residente
+ </string>
+ <string name="TooltipAgentUnmute">
+ Clique para desfazer silenciar neste residente
+ </string>
+ <string name="TooltipAgentIM">
+ Clique para enviar uma MI para este residente
+ </string>
+ <string name="TooltipAgentPay">
+ Clique para pagar este residente
+ </string>
+ <string name="TooltipAgentOfferTeleport">
+ Clique para enviar um pedido de amizade a este residente
+ </string>
+ <string name="TooltipAgentRequestFriend">
+ Clique para enviar um pedido de amizade a este residente
+ </string>
+ <string name="TooltipGroupUrl">
+ Clique para ver a descrição deste Grupo
+ </string>
+ <string name="TooltipEventUrl">
+ Clique para ver a descrição deste evento
+ </string>
+ <string name="TooltipClassifiedUrl">
+ Clique para ver este anúncio
+ </string>
+ <string name="TooltipParcelUrl">
+ Clique para ver a descrição desta parcela
+ </string>
+ <string name="TooltipTeleportUrl">
+ Clique para teletransportar para esta localização
+ </string>
+ <string name="TooltipObjectIMUrl">
+ Clique para ver a descrição deste objeto
+ </string>
+ <string name="TooltipMapUrl">
+ Clique para ver esta localização no mapa
+ </string>
+ <string name="TooltipSLAPP">
+ Clique para ativar no secondlife:// comando
+ </string>
+ <string name="CurrentURL" value="URL atual: [CurrentURL]"/>
+ <string name="TooltipPrice" value="L$[PRICE]-"/>
+ <string name="SLurlLabelTeleport">
+ Teletransportar para
+ </string>
+ <string name="SLurlLabelShowOnMap">
+ Mostrar no mapa para
+ </string>
+ <string name="SLappAgentMute">
+ Silenciar
+ </string>
+ <string name="SLappAgentUnmute">
+ Desfazer silenciar
+ </string>
+ <string name="SLappAgentIM">
+ MI
+ </string>
+ <string name="SLappAgentPay">
+ Pagar
+ </string>
+ <string name="SLappAgentOfferTeleport">
+ Oferecer teletransporte para
+ </string>
+ <string name="SLappAgentRequestFriend">
+ Pedido de amizade
+ </string>
+ <string name="BUTTON_CLOSE_DARWIN">
+ Fechar (⌘W)
+ </string>
+ <string name="BUTTON_CLOSE_WIN">
+ Fechar (Ctrl+W)
+ </string>
+ <string name="BUTTON_CLOSE_CHROME">
+ Fechar
+ </string>
+ <string name="BUTTON_RESTORE">
+ Restaurar
+ </string>
+ <string name="BUTTON_MINIMIZE">
+ Minimizar
+ </string>
+ <string name="BUTTON_TEAR_OFF">
+ Separar-se da janela
+ </string>
+ <string name="BUTTON_DOCK">
+ conectar-se à barra
+ </string>
+ <string name="BUTTON_HELP">
+ Mostrar ajuda
+ </string>
+ <string name="Searching">
+ Buscando...
+ </string>
+ <string name="NoneFound">
+ Não encontrado.
+ </string>
<string name="RetrievingData">
Buscando...
</string>
<string name="ReleaseNotes">
- Notas de Distribuição
+ Notas de versão
</string>
<string name="LoadingData">
Carregando...
@@ -149,12 +306,12 @@
<string name="AvatarNameWaiting">
(aguardando)
</string>
- <string name="AvatarNameHippos">
- (hippos)
- </string>
<string name="GroupNameNone">
(nenhum)
</string>
+ <string name="AvalineCaller">
+ Interlocutor Avaline [ORDER]
+ </string>
<string name="AssetErrorNone">
Nenhum erro
</string>
@@ -188,8 +345,80 @@
<string name="AssetErrorUnknownStatus">
Status desconhecido
</string>
- <string name="AvatarEditingApparance">
- (Editando Aparência)
+ <string name="texture">
+ textura
+ </string>
+ <string name="sound">
+ som
+ </string>
+ <string name="calling card">
+ cartão de visitas
+ </string>
+ <string name="landmark">
+ landmark
+ </string>
+ <string name="legacy script">
+ script obsoleto
+ </string>
+ <string name="clothing">
+ roupas
+ </string>
+ <string name="object">
+ objeto
+ </string>
+ <string name="note card">
+ anotação
+ </string>
+ <string name="folder">
+ pasta
+ </string>
+ <string name="root">
+ raiz
+ </string>
+ <string name="lsl2 script">
+ script LSL2
+ </string>
+ <string name="lsl bytecode">
+ bytecode LSL
+ </string>
+ <string name="tga texture">
+ textura tga
+ </string>
+ <string name="body part">
+ parte do corpo
+ </string>
+ <string name="snapshot">
+ fotografia
+ </string>
+ <string name="lost and found">
+ Achados e Perdidos
+ </string>
+ <string name="targa image">
+ imagem targa
+ </string>
+ <string name="trash">
+ Lixo
+ </string>
+ <string name="jpeg image">
+ imagem jpeg
+ </string>
+ <string name="animation">
+ animação
+ </string>
+ <string name="gesture">
+ gesto
+ </string>
+ <string name="simstate">
+ simstate
+ </string>
+ <string name="favorite">
+ favorito
+ </string>
+ <string name="symbolic link">
+ link
+ </string>
+ <string name="symbolic folder link">
+ link da pasta
</string>
<string name="AvatarAway">
Distante
@@ -225,7 +454,7 @@
Entediado
</string>
<string name="anim_bow">
- Saudar curvando
+ Reverência
</string>
<string name="anim_clap">
Aplaudir
@@ -285,10 +514,10 @@
Impaciente
</string>
<string name="anim_jumpforjoy">
- Pular de Alegria
+ Pular de alegria
</string>
<string name="anim_kissmybutt">
- Beije meu Bumbum
+ Beije meu bumbum
</string>
<string name="anim_express_kiss">
Beijar
@@ -309,7 +538,7 @@
Nya-nya-nya
</string>
<string name="anim_punch_onetwo">
- Soco Um-Dois
+ Soco um-dois
</string>
<string name="anim_express_open_mouth">
Abrir a boca
@@ -324,10 +553,10 @@
Apontar para si
</string>
<string name="anim_punch_l">
- Socar Esquerda
+ Soco esquerdo
</string>
<string name="anim_punch_r">
- Socar Direita
+ Soco direito
</string>
<string name="anim_rps_countdown">
RPS contar
@@ -366,16 +595,16 @@
Fumar à toa
</string>
<string name="anim_smoke_inhale">
- Inalar Fumaça
+ Inalar fumaça
</string>
<string name="anim_smoke_throw_down">
- Expelir Fumaça
+ Expelir fumaça
</string>
<string name="anim_express_surprise">
Surpresa
</string>
<string name="anim_sword_strike_r">
- Golpe de Espada
+ Golpe de espada
</string>
<string name="anim_angry_tantrum">
Enraivecer
@@ -411,7 +640,19 @@
Carregando...
</string>
<string name="worldmap_offline">
- Desconectado
+ Offline
+ </string>
+ <string name="worldmap_results_none_found">
+ Nenhum encontrado.
+ </string>
+ <string name="Ok">
+ OK
+ </string>
+ <string name="Premature end of file">
+ término prematuro do arquivo
+ </string>
+ <string name="ST_NO_JOINT">
+ Não é possível encontrar a raiz (ROOT) ou junção (JOINT).
</string>
<string name="whisper">
sussurra:
@@ -419,14 +660,68 @@
<string name="shout">
grita:
</string>
+ <string name="ringing">
+ Conectando à conversa de voz no mundo
+ </string>
+ <string name="connected">
+ Conectado
+ </string>
+ <string name="unavailable">
+ Voz não disponível na sua localização atual
+ </string>
+ <string name="hang_up">
+ Desconectado da conversa de Voz no mundo
+ </string>
+ <string name="reconnect_nearby">
+ Agora você será reconectado ao bate-papo local.
+ </string>
+ <string name="ScriptQuestionCautionChatGranted">
+ &apos;[OBJECTNAME]&apos;, um objeto de &apos;[OWNERNAME]&apos;, localizado em [REGIONNAME] a [REGIONPOS], obteve permissão para: [PERMISSIONS].
+ </string>
+ <string name="ScriptQuestionCautionChatDenied">
+ &apos;[OBJECTNAME]&apos;, um objeto de &apos;[OWNERNAME]&apos;, localizado em [REGIONNAME] a [REGIONPOS], teve permissão negada para: [PERMISSIONS].
+ </string>
+ <string name="ScriptTakeMoney">
+ Tomar linden dólares (L$) de você
+ </string>
+ <string name="ActOnControlInputs">
+ Atue nas suas entradas de controle
+ </string>
+ <string name="RemapControlInputs">
+ Remapeie suas entradas de controle
+ </string>
+ <string name="AnimateYourAvatar">
+ Faça uma animação para o seu avatar
+ </string>
+ <string name="AttachToYourAvatar">
+ Anexe ao seu avatar
+ </string>
+ <string name="ReleaseOwnership">
+ Libere a propriedade e torne-a pública
+ </string>
+ <string name="LinkAndDelink">
+ Una e desuna de outros objetos
+ </string>
+ <string name="AddAndRemoveJoints">
+ Adicione e remova junções com outros objetos
+ </string>
+ <string name="ChangePermissions">
+ Modifique as permissões
+ </string>
+ <string name="TrackYourCamera">
+ Acompanhe sua câmera
+ </string>
+ <string name="ControlYourCamera">
+ Controle sua camera
+ </string>
<string name="SIM_ACCESS_PG">
- PG
+ Público geral
</string>
<string name="SIM_ACCESS_MATURE">
- Mature
+ Moderado
</string>
<string name="SIM_ACCESS_ADULT">
- Adult
+ Adulto
</string>
<string name="SIM_ACCESS_DOWN">
Desconectado
@@ -437,10 +732,14 @@
<string name="land_type_unknown">
(desconhecido)
</string>
- <string name="covenant_never_modified">Última modificação: (nunca)</string>
- <string name="covenant_modified">Última modificação: </string>
+ <string name="Estate / Full Region">
+ Propriedadade / Região inteira:
+ </string>
+ <string name="Mainland / Full Region">
+ Continente / Região inteira:
+ </string>
<string name="all_files">
- Todos os Arquivos
+ Todos os arquivos
</string>
<string name="sound_files">
Sons
@@ -464,10 +763,10 @@
Imagens Bitmap
</string>
<string name="avi_movie_file">
- Arquivo de filme AVI
+ Arquivo de vídeo AVI
</string>
<string name="xaf_animation_file">
- Arquivo de Animação XAF
+ Arquivo de animação XAF
</string>
<string name="xml_file">
Arquivo XML
@@ -476,25 +775,972 @@
Arquivo RAW
</string>
<string name="compressed_image_files">
- Imagens Compactadas
+ Imagens compactadas
</string>
<string name="load_files">
- Carregar Arquivos
+ Carregar arquivos
</string>
<string name="choose_the_directory">
- Escolher Diretório
+ Selecionar pasta
+ </string>
+ <string name="AvatarSetNotAway">
+ deixar como ausente
+ </string>
+ <string name="AvatarSetAway">
+ deixar como ausente
+ </string>
+ <string name="AvatarSetNotBusy">
+ deixar como não ocupado
+ </string>
+ <string name="AvatarSetBusy">
+ Deixar como ocupado
+ </string>
+ <string name="shape">
+ Silhueta
+ </string>
+ <string name="skin">
+ Pele
+ </string>
+ <string name="hair">
+ Cabelo
+ </string>
+ <string name="eyes">
+ Olhos
+ </string>
+ <string name="shirt">
+ Camisa
+ </string>
+ <string name="pants">
+ Calças
+ </string>
+ <string name="shoes">
+ Sapatos
+ </string>
+ <string name="socks">
+ Meias
+ </string>
+ <string name="jacket">
+ Blusa
+ </string>
+ <string name="gloves">
+ Luvas
+ </string>
+ <string name="undershirt">
+ Camiseta
+ </string>
+ <string name="underpants">
+ Roupa de baixo
+ </string>
+ <string name="skirt">
+ Saia
+ </string>
+ <string name="alpha">
+ Alpha
+ </string>
+ <string name="tattoo">
+ Tatuagem
+ </string>
+ <string name="invalid">
+ Inválido
+ </string>
+ <string name="shirt_not_worn">
+ Camisa não vestida
+ </string>
+ <string name="pants_not_worn">
+ Calças não vestidas
+ </string>
+ <string name="shoes_not_worn">
+ Sapatos não calçados
+ </string>
+ <string name="socks_not_worn">
+ Meias não calçadas
+ </string>
+ <string name="jacket_not_worn">
+ Jaqueta não vestida
+ </string>
+ <string name="gloves_not_worn">
+ Luvas não calçadas
+ </string>
+ <string name="undershirt_not_worn">
+ Camiseta não vestida
+ </string>
+ <string name="underpants_not_worn">
+ Roupa de baixo não vestida
+ </string>
+ <string name="skirt_not_worn">
+ Saia não vestida
+ </string>
+ <string name="alpha_not_worn">
+ Alpha não vestido
+ </string>
+ <string name="tattoo_not_worn">
+ Tatuagem não usada
+ </string>
+ <string name="invalid_not_worn">
+ inválido
+ </string>
+ <string name="NewWearable">
+ Novo [WEARABLE_ITEM]
+ </string>
+ <string name="CreateNewWearable">
+ Criar [WEARABLE_TYPE]
+ </string>
+ <string name="next">
+ Próximo
+ </string>
+ <string name="ok">
+ OK
+ </string>
+ <string name="GroupNotifyGroupNotice">
+ Anúncio de grupo
+ </string>
+ <string name="GroupNotifyGroupNotices">
+ Anúncios do grupo
+ </string>
+ <string name="GroupNotifySentBy">
+ Enviado por
+ </string>
+ <string name="GroupNotifyAttached">
+ Anexo:
+ </string>
+ <string name="GroupNotifyViewPastNotices">
+ Ver últimos anúncios ou optar por não receber essas mensagens aqui.
+ </string>
+ <string name="GroupNotifyOpenAttachment">
+ Abrir anexo
+ </string>
+ <string name="GroupNotifySaveAttachment">
+ Salvar anexo
+ </string>
+ <string name="TeleportOffer">
+ Oferta de teletransporte
+ </string>
+ <string name="StartUpNotifications">
+ Novas notificações chegaram enquanto você estava fora...
+ </string>
+ <string name="OverflowInfoChannelString">
+ Você tem mais [%d] notificações
+ </string>
+ <string name="BodyPartsRightArm">
+ Braço direito
+ </string>
+ <string name="BodyPartsHead">
+ Cabeça
+ </string>
+ <string name="BodyPartsLeftArm">
+ Braço esquerdo
+ </string>
+ <string name="BodyPartsLeftLeg">
+ Perna esquerda
+ </string>
+ <string name="BodyPartsTorso">
+ Tronco
+ </string>
+ <string name="BodyPartsRightLeg">
+ Perna direita
+ </string>
+ <string name="GraphicsQualityLow">
+ Baixo
+ </string>
+ <string name="GraphicsQualityMid">
+ Meio
+ </string>
+ <string name="GraphicsQualityHigh">
+ Alto
+ </string>
+ <string name="LeaveMouselook">
+ Pressione ESC para retornar para visão do mundo
+ </string>
+ <string name="InventoryNoMatchingItems">
+ Não encontrou o que procura? Tente buscar no [secondlife:///app/search/people/[SEARCH_TERM] Search].
+ </string>
+ <string name="PlacesNoMatchingItems">
+ Não encontrou o que procura? Tente buscar no [secondlife:///app/search/groups/[SEARCH_TERM] Search].
+ </string>
+ <string name="FavoritesNoMatchingItems">
+ Arraste um marco para adicioná-lo aos seus favoritos.
+ </string>
+ <string name="InventoryNoTexture">
+ Você não possui uma cópia desta textura no seu inventário
+ </string>
+ <string name="no_transfer" value="(não transferível)"/>
+ <string name="no_modify" value="(não modificável)"/>
+ <string name="no_copy" value="(não copiável)"/>
+ <string name="worn" value="(vestido)"/>
+ <string name="link" value="(link)"/>
+ <string name="broken_link" value="(link_quebrado)&quot;"/>
+ <string name="LoadingContents">
+ Carregando conteúdo...
+ </string>
+ <string name="NoContents">
+ Nenhum conteúdo
+ </string>
+ <string name="WornOnAttachmentPoint" value="(vestido em [ATTACHMENT_POINT])"/>
+ <string name="ActiveGesture" value="[GESLABEL] (ativado)"/>
+ <string name="Chat" value="Bate papo"/>
+ <string name="Sound" value="Som"/>
+ <string name="Wait" value="--- Aguarde"/>
+ <string name="AnimFlagStop" value="Parar animação"/>
+ <string name="AnimFlagStart" value="Iniciar animação"/>
+ <string name="Wave" value="Acenar"/>
+ <string name="HelloAvatar" value="Olá, avatar!"/>
+ <string name="ViewAllGestures" value="Ver todos&gt;&gt;"/>
+ <string name="GetMoreGestures" value="Mais &gt;&gt;"/>
+ <string name="Animations" value="Animações,"/>
+ <string name="Calling Cards" value="Cartões de visitas,"/>
+ <string name="Clothing" value="Vestuário,"/>
+ <string name="Gestures" value="Gestos,"/>
+ <string name="Landmarks" value="Marcos"/>
+ <string name="Notecards" value="Anotações"/>
+ <string name="Objects" value="Objetos,"/>
+ <string name="Scripts" value="Scripts,"/>
+ <string name="Sounds" value="Sons"/>
+ <string name="Textures" value="Texturas"/>
+ <string name="Snapshots" value="Fotografias"/>
+ <string name="No Filters" value="Não"/>
+ <string name="Since Logoff" value="- Desde desligado"/>
+ <string name="InvFolder My Inventory">
+ Meu inventário
+ </string>
+ <string name="InvFolder My Favorites">
+ Meus favoritos
+ </string>
+ <string name="InvFolder Library">
+ Biblioteca
+ </string>
+ <string name="InvFolder Textures">
+ Texturas
+ </string>
+ <string name="InvFolder Sounds">
+ Sons
+ </string>
+ <string name="InvFolder Calling Cards">
+ Cartões de visitas
+ </string>
+ <string name="InvFolder Landmarks">
+ Marcos
+ </string>
+ <string name="InvFolder Scripts">
+ Scripts
+ </string>
+ <string name="InvFolder Clothing">
+ Vestuário
+ </string>
+ <string name="InvFolder Objects">
+ Objetos
+ </string>
+ <string name="InvFolder Notecards">
+ Anotações
+ </string>
+ <string name="InvFolder New Folder">
+ Nova pasta
+ </string>
+ <string name="InvFolder Inventory">
+ Inventário
+ </string>
+ <string name="InvFolder Uncompressed Images">
+ Imagens descompactadas
+ </string>
+ <string name="InvFolder Body Parts">
+ Corpo
+ </string>
+ <string name="InvFolder Trash">
+ Lixo
+ </string>
+ <string name="InvFolder Photo Album">
+ Ãlbum de fotografias
+ </string>
+ <string name="InvFolder Lost And Found">
+ Achados e Perdidos
+ </string>
+ <string name="InvFolder Uncompressed Sounds">
+ Sons descompactados
+ </string>
+ <string name="InvFolder Animations">
+ Animações
+ </string>
+ <string name="InvFolder Gestures">
+ Gestos
+ </string>
+ <string name="InvFolder favorite">
+ Favoritos
+ </string>
+ <string name="InvFolder Current Outfit">
+ Look atual
+ </string>
+ <string name="InvFolder My Outfits">
+ Meus looks
+ </string>
+ <string name="InvFolder Accessories">
+ Acessórios
+ </string>
+ <string name="InvFolder Friends">
+ Amigos
+ </string>
+ <string name="InvFolder All">
+ Tudo
+ </string>
+ <string name="Buy">
+ Comprar
+ </string>
+ <string name="BuyforL$">
+ Comprar por L$
+ </string>
+ <string name="Stone">
+ Pedra
+ </string>
+ <string name="Metal">
+ Metal
+ </string>
+ <string name="Glass">
+ Vidro
+ </string>
+ <string name="Wood">
+ Madeira
+ </string>
+ <string name="Flesh">
+ Carne
+ </string>
+ <string name="Plastic">
+ Plástico
+ </string>
+ <string name="Rubber">
+ Borrracha
+ </string>
+ <string name="Light">
+ Luz
+ </string>
+ <string name="KBShift">
+ Shift
+ </string>
+ <string name="KBCtrl">
+ Ctrl
+ </string>
+ <string name="Chest">
+ Peito
+ </string>
+ <string name="Skull">
+ Crânio
+ </string>
+ <string name="Left Shoulder">
+ Ombro esquerdo
+ </string>
+ <string name="Right Shoulder">
+ Ombro direito
+ </string>
+ <string name="Left Hand">
+ Mão esquerda
+ </string>
+ <string name="Right Hand">
+ Mão direita
+ </string>
+ <string name="Left Foot">
+ Pé esquerdo
+ </string>
+ <string name="Right Foot">
+ Pé direito
+ </string>
+ <string name="Spine">
+ Espinha
+ </string>
+ <string name="Pelvis">
+ Pélvis
+ </string>
+ <string name="Mouth">
+ Boca
+ </string>
+ <string name="Chin">
+ Queixo
+ </string>
+ <string name="Left Ear">
+ Orelha esquerda
+ </string>
+ <string name="Right Ear">
+ Orelha direita
+ </string>
+ <string name="Left Eyeball">
+ Globo ocular esquerdo
+ </string>
+ <string name="Right Eyeball">
+ Globo ocular direito
+ </string>
+ <string name="Nose">
+ Nariz
+ </string>
+ <string name="R Upper Arm">
+ Braço superior D
+ </string>
+ <string name="R Forearm">
+ Antebraço D
+ </string>
+ <string name="L Upper Arm">
+ Braço superior E
+ </string>
+ <string name="L Forearm">
+ Antebraço E
+ </string>
+ <string name="Right Hip">
+ Quadril direito
+ </string>
+ <string name="R Upper Leg">
+ Coxa D
+ </string>
+ <string name="R Lower Leg">
+ Perna inferior D
+ </string>
+ <string name="Left Hip">
+ Quadril esquerdo
+ </string>
+ <string name="L Upper Leg">
+ Coxa E
+ </string>
+ <string name="L Lower Leg">
+ Perna inferior E
+ </string>
+ <string name="Stomach">
+ Estômago
+ </string>
+ <string name="Left Pec">
+ Peitoral E
+ </string>
+ <string name="Right Pec">
+ Peitoral D
+ </string>
+ <string name="YearsMonthsOld">
+ [AGEYEARS] [AGEMONTHS] de idade
+ </string>
+ <string name="YearsOld">
+ [AGEYEARS] de idade
+ </string>
+ <string name="MonthsOld">
+ [AGEMONTHS] de idade
+ </string>
+ <string name="WeeksOld">
+ [AGEWEEKS] de idade
+ </string>
+ <string name="DaysOld">
+ [AGEDAYS] de idade
+ </string>
+ <string name="TodayOld">
+ Cadastrado hoje
+ </string>
+ <string name="AgeYearsA">
+ [COUNT] ano
+ </string>
+ <string name="AgeYearsB">
+ [COUNT] anos
+ </string>
+ <string name="AgeYearsC">
+ [COUNT] anos
+ </string>
+ <string name="AgeMonthsA">
+ [COUNT] mês
+ </string>
+ <string name="AgeMonthsB">
+ [COUNT] meses
+ </string>
+ <string name="AgeMonthsC">
+ [COUNT] meses
+ </string>
+ <string name="AgeWeeksA">
+ [COUNT] semana
+ </string>
+ <string name="AgeWeeksB">
+ [COUNT] semanas
+ </string>
+ <string name="AgeWeeksC">
+ [COUNT] semanas
+ </string>
+ <string name="AgeDaysA">
+ [COUNT] dia
+ </string>
+ <string name="AgeDaysB">
+ [COUNT] dias
+ </string>
+ <string name="AgeDaysC">
+ [COUNT] dias
+ </string>
+ <string name="GroupMembersA">
+ [COUNT] membro
+ </string>
+ <string name="GroupMembersB">
+ [COUNT] membros
+ </string>
+ <string name="GroupMembersC">
+ [COUNT] membros
+ </string>
+ <string name="AcctTypeResident">
+ Residente
+ </string>
+ <string name="AcctTypeTrial">
+ Prova
+ </string>
+ <string name="AcctTypeCharterMember">
+ Lista de membros
+ </string>
+ <string name="AcctTypeEmployee">
+ Empregado da Linden Lab
+ </string>
+ <string name="PaymentInfoUsed">
+ Dados de pagamento usados
+ </string>
+ <string name="PaymentInfoOnFile">
+ Dados de pagamento fornecidos
+ </string>
+ <string name="NoPaymentInfoOnFile">
+ Nenhum dado de pagamento
+ </string>
+ <string name="AgeVerified">
+ Idade comprovada
+ </string>
+ <string name="NotAgeVerified">
+ Idade não comprovada
+ </string>
+ <string name="Center 2">
+ Centro 2
+ </string>
+ <string name="Top Right">
+ Topo direita
+ </string>
+ <string name="Top">
+ Topo
+ </string>
+ <string name="Top Left">
+ Topo esquerda
+ </string>
+ <string name="Center">
+ Centro
+ </string>
+ <string name="Bottom Left">
+ Inferior esquerdo
+ </string>
+ <string name="Bottom">
+ Inferior
+ </string>
+ <string name="Bottom Right">
+ Inferior direito
+ </string>
+ <string name="CompileQueueDownloadedCompiling">
+ Baixado, agora compilando
+ </string>
+ <string name="CompileQueueScriptNotFound">
+ Script não encontrado no servidor.
+ </string>
+ <string name="CompileQueueProblemDownloading">
+ Problema no download
+ </string>
+ <string name="CompileQueueInsufficientPermDownload">
+ Permissões insuficientes para fazer o download do script.
+ </string>
+ <string name="CompileQueueInsufficientPermFor">
+ Permissões insuficientes para
+ </string>
+ <string name="CompileQueueUnknownFailure">
+ Falha desconhecida para download
+ </string>
+ <string name="CompileQueueTitle">
+ Progresso do recompilamento
+ </string>
+ <string name="CompileQueueStart">
+ recompilar
+ </string>
+ <string name="ResetQueueTitle">
+ Reset Progresso
+ </string>
+ <string name="ResetQueueStart">
+ Zerar
+ </string>
+ <string name="RunQueueTitle">
+ Definir funcionamento do progresso
+ </string>
+ <string name="RunQueueStart">
+ deixar funcionando
+ </string>
+ <string name="NotRunQueueTitle">
+ Definir progresso não funcionando
+ </string>
+ <string name="NotRunQueueStart">
+ não deixar funcionando
+ </string>
+ <string name="CompileSuccessful">
+ Compilação bem sucedida
+ </string>
+ <string name="CompileSuccessfulSaving">
+ Compilação bem sucedida, salvando...
+ </string>
+ <string name="SaveComplete">
+ Salvo.
+ </string>
+ <string name="ObjectOutOfRange">
+ Script (objeto fora de alcance)
+ </string>
+ <string name="GodToolsObjectOwnedBy">
+ Objeto [OBJECT] de propriedade de [OWNER]
+ </string>
+ <string name="GroupsNone">
+ nenhum
+ </string>
+ <string name="Group" value="(grupo)"/>
+ <string name="Unknown">
+ (Desconhecido)
+ </string>
+ <string name="SummaryForTheWeek" value="Resumo para esta semana, com início em"/>
+ <string name="NextStipendDay" value="Próximo dia de salário é"/>
+ <string name="GroupIndividualShare" value="Grupo Divisão individualI"/>
+ <string name="Balance">
+ Balanço
+ </string>
+ <string name="Credits">
+ Créditos
+ </string>
+ <string name="Debits">
+ Débitos
+ </string>
+ <string name="Total">
+ Total
+ </string>
+ <string name="NoGroupDataFound">
+ Não há dados de grupo
+ </string>
+ <string name="IMParentEstate">
+ Propriedade-pai
+ </string>
+ <string name="IMMainland">
+ continente
+ </string>
+ <string name="IMTeen">
+ adolescente
+ </string>
+ <string name="RegionInfoError">
+ erro
+ </string>
+ <string name="RegionInfoAllEstatesOwnedBy">
+ todas as propriedades pertencem a [OWNER]
+ </string>
+ <string name="RegionInfoAllEstatesYouOwn">
+ todas as propriedades que você possui
+ </string>
+ <string name="RegionInfoAllEstatesYouManage">
+ todas as propriedades que você gerencia para [OWNER]
+ </string>
+ <string name="RegionInfoAllowedResidents">
+ Residentes autorizados: ([ALLOWEDAGENTS], max [MAXACCESS])
+ </string>
+ <string name="RegionInfoAllowedGroups">
+ Grupos permitidos: ([ALLOWEDGROUPS], max [MAXACCESS])
+ </string>
+ <string name="ScriptLimitsParcelScriptMemory">
+ Memória de scripts no lote
+ </string>
+ <string name="ScriptLimitsParcelsOwned">
+ Lotes listados: [PARCELS]
+ </string>
+ <string name="ScriptLimitsMemoryUsed">
+ Memória usada: [COUNT] kb de [MAX] kb; [AVAILABLE] kb disponíveis
+ </string>
+ <string name="ScriptLimitsMemoryUsedSimple">
+ Memória usada: [COUNT] kb
+ </string>
+ <string name="ScriptLimitsParcelScriptURLs">
+ URL dos scripts do lote
+ </string>
+ <string name="ScriptLimitsURLsUsed">
+ URLs usados: [COUNT] de [MAX]; [AVAILABLE] disponíveis
+ </string>
+ <string name="ScriptLimitsURLsUsedSimple">
+ URLs usados: [COUNT]
+ </string>
+ <string name="ScriptLimitsRequestError">
+ Erro ao solicitar dados
+ </string>
+ <string name="ScriptLimitsRequestNoParcelSelected">
+ Nenhum lote foi selecionado
+ </string>
+ <string name="ScriptLimitsRequestWrongRegion">
+ Erro: dados de script só disponíveis na região da posição atual
+ </string>
+ <string name="ScriptLimitsRequestWaiting">
+ Obtendo dados...
+ </string>
+ <string name="ScriptLimitsRequestDontOwnParcel">
+ Você não está autorizado a examinar este lote.
+ </string>
+ <string name="SITTING_ON">
+ Sentado em
+ </string>
+ <string name="ATTACH_CHEST">
+ Peito
+ </string>
+ <string name="ATTACH_HEAD">
+ Cabeça
+ </string>
+ <string name="ATTACH_LSHOULDER">
+ Ombro esquerdo
+ </string>
+ <string name="ATTACH_RSHOULDER">
+ Ombro direito
+ </string>
+ <string name="ATTACH_LHAND">
+ Mão esquerda
+ </string>
+ <string name="ATTACH_RHAND">
+ Mão direita
+ </string>
+ <string name="ATTACH_LFOOT">
+ Pé esquerdo
+ </string>
+ <string name="ATTACH_RFOOT">
+ Pé direito
+ </string>
+ <string name="ATTACH_BACK">
+ Atrás
+ </string>
+ <string name="ATTACH_PELVIS">
+ Pélvis
+ </string>
+ <string name="ATTACH_MOUTH">
+ Boca
+ </string>
+ <string name="ATTACH_CHIN">
+ Queixo
+ </string>
+ <string name="ATTACH_LEAR">
+ Orelha esquerda
+ </string>
+ <string name="ATTACH_REAR">
+ Orelha direita
+ </string>
+ <string name="ATTACH_LEYE">
+ Olho esquerdo
+ </string>
+ <string name="ATTACH_REYE">
+ Olho direito
+ </string>
+ <string name="ATTACH_NOSE">
+ Nariz
+ </string>
+ <string name="ATTACH_RUARM">
+ Braço direito
+ </string>
+ <string name="ATTACH_RLARM">
+ Antebraço direito
+ </string>
+ <string name="ATTACH_LUARM">
+ Braço esquerdo
+ </string>
+ <string name="ATTACH_LLARM">
+ Antebraço esquerdo
+ </string>
+ <string name="ATTACH_RHIP">
+ Quadril direito
+ </string>
+ <string name="ATTACH_RULEG">
+ Coxa direita
+ </string>
+ <string name="ATTACH_RLLEG">
+ Perna direita
+ </string>
+ <string name="ATTACH_LHIP">
+ Quadril esquerdo
+ </string>
+ <string name="ATTACH_LULEG">
+ Coxa esquerda
+ </string>
+ <string name="ATTACH_LLLEG">
+ Perna esquerda
+ </string>
+ <string name="ATTACH_BELLY">
+ Barriga
+ </string>
+ <string name="ATTACH_RPEC">
+ Peitorais D
+ </string>
+ <string name="ATTACH_LPEC">
+ Peitorais E
+ </string>
+ <string name="ATTACH_HUD_CENTER_2">
+ HUD Central 2
+ </string>
+ <string name="ATTACH_HUD_TOP_RIGHT">
+ HUD superior direito
+ </string>
+ <string name="ATTACH_HUD_TOP_CENTER">
+ HUD centro superior
+ </string>
+ <string name="ATTACH_HUD_TOP_LEFT">
+ HUD superior esquerdo
+ </string>
+ <string name="ATTACH_HUD_CENTER_1">
+ HUD Central 1
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_LEFT">
+ HUD esquerda inferior
+ </string>
+ <string name="ATTACH_HUD_BOTTOM">
+ HUD inferior
+ </string>
+ <string name="ATTACH_HUD_BOTTOM_RIGHT">
+ HUD direito inferior
+ </string>
+ <string name="CursorPos">
+ Linha [LINE], Coluna [COLUMN]
+ </string>
+ <string name="PanelDirCountFound">
+ [COUNT] encontrado
+ </string>
+ <string name="PanelContentsNewScript">
+ Novo Script
+ </string>
+ <string name="PanelContentsTooltip">
+ Conteúdo do objeto
+ </string>
+ <string name="BusyModeResponseDefault">
+ O residente para o qual escreveu está no modo &apos;ocupado&apos;, ou seja, ele prefere não receber nada no momento. Sua mensagem será exibida como uma MI mais tarde.
+ </string>
+ <string name="MuteByName">
+ (por nome)
+ </string>
+ <string name="MuteAgent">
+ (residente)
+ </string>
+ <string name="MuteObject">
+ (objeto)
+ </string>
+ <string name="MuteGroup">
+ (grupo)
+ </string>
+ <string name="MuteExternal">
+ (Externo)
+ </string>
+ <string name="RegionNoCovenant">
+ Não foi definido um contrato para essa região.
+ </string>
+ <string name="RegionNoCovenantOtherOwner">
+ Não foi definido um contrato para essa Região. O terreno nesta região está sendo vendido pelo Proprietário, não pela Linden Lab. Favor contatar o Proprietário da região para detalhes de venda.
+ </string>
+ <string name="covenant_last_modified" value="Última modificação:"/>
+ <string name="none_text" value="(nenhum)"/>
+ <string name="never_text" value="(nunca)"/>
+ <string name="GroupOwned">
+ Propriedade do Grupo
+ </string>
+ <string name="Public">
+ Público
+ </string>
+ <string name="ClassifiedClicksTxt">
+ Cliques: [TELEPORT] teletransporte, [MAP] mapa, [PROFILE] perfil
+ </string>
+ <string name="ClassifiedUpdateAfterPublish">
+ (vai atualizar depois de publicado)
+ </string>
+ <string name="NoPicksClassifiedsText">
+ Você não criou nenhum Destaque ou Anúncio. Clique no botão &quot;+&quot; para criar um Destaque ou Anúncio.
+ </string>
+ <string name="NoAvatarPicksClassifiedsText">
+ O usuário não tem nenhum destaque ou anúncio
+ </string>
+ <string name="PicksClassifiedsLoadingText">
+ Carregando...
+ </string>
+ <string name="MultiPreviewTitle">
+ Preview
+ </string>
+ <string name="MultiPropertiesTitle">
+ Propriedades
+ </string>
+ <string name="InvOfferAnObjectNamed">
+ um objeto chamado
+ </string>
+ <string name="InvOfferOwnedByGroup">
+ possuído pelo grupo
+ </string>
+ <string name="InvOfferOwnedByUnknownGroup">
+ de um grupo desconhecido
+ </string>
+ <string name="InvOfferOwnedBy">
+ de
+ </string>
+ <string name="InvOfferOwnedByUnknownUser">
+ de usuário desconhecido
+ </string>
+ <string name="InvOfferGaveYou">
+ deu a você
+ </string>
+ <string name="InvOfferYouDecline">
+ Você recusa
+ </string>
+ <string name="InvOfferFrom">
+ de
+ </string>
+ <string name="GroupMoneyTotal">
+ Total
+ </string>
+ <string name="GroupMoneyBought">
+ comprou
+ </string>
+ <string name="GroupMoneyPaidYou">
+ pagou a você
+ </string>
+ <string name="GroupMoneyPaidInto">
+ depositado
+ </string>
+ <string name="GroupMoneyBoughtPassTo">
+ comprou passe para
+ </string>
+ <string name="GroupMoneyPaidFeeForEvent">
+ pagou taxa para o evento
+ </string>
+ <string name="GroupMoneyPaidPrizeForEvent">
+ pagou prêmio para o evento
+ </string>
+ <string name="GroupMoneyBalance">
+ Saldo
+ </string>
+ <string name="GroupMoneyCredits">
+ Créditos
+ </string>
+ <string name="GroupMoneyDebits">
+ Débitos
+ </string>
+ <string name="ViewerObjectContents">
+ Conteúdo
+ </string>
+ <string name="AcquiredItems">
+ Itens adquiridos
+ </string>
+ <string name="Cancel">
+ Cancelar
+ </string>
+ <string name="UploadingCosts">
+ Carregar [NAME] custa L$ [AMOUNT]
+ </string>
+ <string name="BuyingCosts">
+ Isso custa L$ [AMOUNT]
+ </string>
+ <string name="UnknownFileExtension">
+ Extensão de arquivo desconhecida [.%s]
+Expected .wav, .tga, .bmp, .jpg, .jpeg, or .bvh
+ </string>
+ <string name="MuteObject2">
+ Bloquear
+ </string>
+ <string name="AddLandmarkNavBarMenu">
+ Adicionar marco...
+ </string>
+ <string name="EditLandmarkNavBarMenu">
+ Editar marco...
</string>
<string name="accel-mac-control">
- &#8963;
+ ⌃
</string>
<string name="accel-mac-command">
- &#8984;
+ ⌘
</string>
<string name="accel-mac-option">
- &#8997;
+ ⌥
</string>
<string name="accel-mac-shift">
- &#8679;
+ ⇧
</string>
<string name="accel-win-control">
Ctrl+
@@ -505,80 +1751,1642 @@
<string name="accel-win-shift">
Shift+
</string>
- <string name="GraphicsQualityLow">
+ <string name="FileSaved">
+ Arquivo salvo
+ </string>
+ <string name="Receiving">
+ Recebendo
+ </string>
+ <string name="AM">
+ AM
+ </string>
+ <string name="PM">
+ PM
+ </string>
+ <string name="PST">
+ PST
+ </string>
+ <string name="PDT">
+ PDT
+ </string>
+ <string name="Forward">
+ Avante
+ </string>
+ <string name="Left">
+ Esquerda
+ </string>
+ <string name="Right">
+ Direita
+ </string>
+ <string name="Back">
+ Atrás
+ </string>
+ <string name="North">
+ Norte
+ </string>
+ <string name="South">
+ Sul
+ </string>
+ <string name="West">
+ Oeste
+ </string>
+ <string name="East">
+ Leste
+ </string>
+ <string name="Up">
+ Acima
+ </string>
+ <string name="Down">
+ Abaixo
+ </string>
+ <string name="Any Category">
+ Qualquer categoria
+ </string>
+ <string name="Shopping">
+ Compras
+ </string>
+ <string name="Land Rental">
+ Aluguel de terrenos
+ </string>
+ <string name="Property Rental">
+ Aluguel de propriedade
+ </string>
+ <string name="Special Attraction">
+ Atração especial
+ </string>
+ <string name="New Products">
+ Novos Produtos
+ </string>
+ <string name="Employment">
+ Emprego
+ </string>
+ <string name="Wanted">
+ Desejado
+ </string>
+ <string name="Service">
+ Serviço
+ </string>
+ <string name="Personal">
+ Pessoal
+ </string>
+ <string name="None">
+ Nenhum
+ </string>
+ <string name="Linden Location">
+ Locação Linden
+ </string>
+ <string name="Adult">
+ Adulto
+ </string>
+ <string name="Arts&amp;Culture">
+ Artes e Cultura
+ </string>
+ <string name="Business">
+ Negócios
+ </string>
+ <string name="Educational">
+ Educacional
+ </string>
+ <string name="Gaming">
+ Games
+ </string>
+ <string name="Hangout">
+ Moradia
+ </string>
+ <string name="Newcomer Friendly">
+ Para recém-chegados
+ </string>
+ <string name="Parks&amp;Nature">
+ Parques &amp; Natureza
+ </string>
+ <string name="Residential">
+ Residencial
+ </string>
+ <string name="Stage">
+ Estágio
+ </string>
+ <string name="Other">
+ Outros
+ </string>
+ <string name="Any">
+ Qualquer
+ </string>
+ <string name="You">
+ Você
+ </string>
+ <string name="Multiple Media">
+ Mídia múltipla
+ </string>
+ <string name="Play Media">
+ Tocar/Pausar mídia
+ </string>
+ <string name="MBCmdLineError">
+ Um erro foi encontrado analisando a linha de comando.
+Consulte: http://wiki.secondlife.com/wiki/Client_parameters
+Erro:
+ </string>
+ <string name="MBCmdLineUsg">
+ [APP_NAME] Uso de linha de comando:
+ </string>
+ <string name="MBUnableToAccessFile">
+ [APP_NAME] não é capaz de acessar um arquivo que ele precisa.
+
+Isto pode ocorrer porque você de alguma maneira tem várias cópias em execução, ou o seu sistema acredita de maneira incorreta que um arquivo está aberto.
+Se a mensagem persistir, reinicie o computador e tente novamente.
+Se o error persistir, pode ser necessário desinstalar completamente [APP_NAME] e reinstalá-lo.
+ </string>
+ <string name="MBFatalError">
+ Erro fatal
+ </string>
+ <string name="MBRequiresAltiVec">
+ [APP_NAME] exige processador com AltiVec (G4 ou superior).
+ </string>
+ <string name="MBAlreadyRunning">
+ [APP_NAME] já está em execução.
+Verifique a sua barra de tarefas para obter uma cópia do programa minimizado.
+Se a mensagem persistir, reinicie o computador.
+ </string>
+ <string name="MBFrozenCrashed">
+ [APP_NAME] parece ter congelado ou falhado na execução anterior. Enviar relatório de falha?
+ </string>
+ <string name="MBAlert">
+ Alerta
+ </string>
+ <string name="MBNoDirectX">
+ [APP_NAME] é incapaz de detectar o DirectX 9.0b ou superior.
+[APP_NAME] usa o DirectX para a detecção de hardware e / ou controladores desatualizados que podem causar problemas de estabilidade, desempenho ruim e falhas. Embora você possa executar [APP_NAME] sem ele, nós recomendamos fortemente que utilize o DirectX 9.0b.
+
+Deseja continuar?
+ </string>
+ <string name="MBWarning">
+ Aviso
+ </string>
+ <string name="MBNoAutoUpdate">
+ Atualização automática ainda não está implementada para o Linux.
+Faça o download da versão mais recente do www.secondlife.com.
+ </string>
+ <string name="MBRegClassFailed">
+ RegisterClass falhou
+ </string>
+ <string name="MBError">
+ Erro
+ </string>
+ <string name="MBFullScreenErr">
+ Incapaz de funcionar com tela cheia de [WIDTH] x [HEIGHT].
+Executando em janela.
+ </string>
+ <string name="MBDestroyWinFailed">
+ Erro de desligamento ao destruir janela (DestroyWindow() failed)
+ </string>
+ <string name="MBShutdownErr">
+ Erro de desligamento
+ </string>
+ <string name="MBDevContextErr">
+ Não é possível fazer contexto do dispositivo GL
+ </string>
+ <string name="MBPixelFmtErr">
+ Não é possível encontrar um formato de pixel adequado
+ </string>
+ <string name="MBPixelFmtDescErr">
+ Não é possível encontrar descrição de formato de pixel
+ </string>
+ <string name="MBTrueColorWindow">
+ [APP_NAME] requer True Color (32-bit) para ser executado.
+Por favor, vá para as configurações de vídeo do computador e defina o modo de cores para 32-bit.
+ </string>
+ <string name="MBAlpha">
+ [APP_NAME] é incapaz de executar porque ele não consegue obter um canal alpha de 8 bits. Geralmente isso ocorre devido a problemas de drivers da placa de vídeo.
+Por favor, certifique-se que os últimos drivers da placa de vídeo estão instalados.
+Também não se esqueça de definir seu monitor para True Color (32-bit), em painéis de controle Configurações&gt; Display&gt;.
+Se você continuar a receber esta mensagem, contate o [SUPPORT_SITE].
+ </string>
+ <string name="MBPixelFmtSetErr">
+ Não é possível definir o formato de pixel
+ </string>
+ <string name="MBGLContextErr">
+ Não é possível criar o contexto de renderização GL
+ </string>
+ <string name="MBGLContextActErr">
+ Não é possível ativar o contexto de renderização GL
+ </string>
+ <string name="MBVideoDrvErr">
+ [APP_NAME] é incapaz de funcionar por causa do seu driver de video não ter sido instalado corretamente, estão desatualizados, ou não são suportados pelo hardware. Por favor certifique-se que você possui os drivers de placa de vídeo mais recente e mesmo assim, tente reinstalá-los.
+
+If you continue to receive this message, contact the [SUPPORT_SITE].
+ </string>
+ <string name="5 O&apos;Clock Shadow">
+ Barba por fazer
+ </string>
+ <string name="All White">
+ Todo branco
+ </string>
+ <string name="Anime Eyes">
+ Olhos de Anime
+ </string>
+ <string name="Arced">
+ Arqueados
+ </string>
+ <string name="Arm Length">
+ Comprimento do braço
+ </string>
+ <string name="Attached">
+ Anexado
+ </string>
+ <string name="Attached Earlobes">
+ Lóbulos da orelha anexados
+ </string>
+ <string name="Back Fringe">
+ corte traseiro
+ </string>
+ <string name="Baggy">
+ folgado
+ </string>
+ <string name="Bangs">
+ Franja
+ </string>
+ <string name="Beady Eyes">
+ Olhos pequenos
+ </string>
+ <string name="Belly Size">
+ Tamanho da barriga
+ </string>
+ <string name="Big">
+ Grande
+ </string>
+ <string name="Big Butt">
+ Bunda grande
+ </string>
+ <string name="Big Hair Back">
+ Cabelo volumoso: Trás
+ </string>
+ <string name="Big Hair Front">
+ Cabelo volumoso: Frente
+ </string>
+ <string name="Big Hair Top">
+ Cabelo volumoso: Topo
+ </string>
+ <string name="Big Head">
+ cabeça grande
+ </string>
+ <string name="Big Pectorals">
+ Peitorais grandes
+ </string>
+ <string name="Big Spikes">
+ Pontas grandes
+ </string>
+ <string name="Black">
+ Negro
+ </string>
+ <string name="Blonde">
+ Loiro
+ </string>
+ <string name="Blonde Hair">
+ Cabelo loiro
+ </string>
+ <string name="Blush">
+ Blush
+ </string>
+ <string name="Blush Color">
+ Cor do blush
+ </string>
+ <string name="Blush Opacity">
+ Opacidade do blush
+ </string>
+ <string name="Body Definition">
+ Definição do corpo
+ </string>
+ <string name="Body Fat">
+ Gordura
+ </string>
+ <string name="Body Freckles">
+ Sardas
+ </string>
+ <string name="Body Thick">
+ Corpo cheio
+ </string>
+ <string name="Body Thickness">
+ Ossatura
+ </string>
+ <string name="Body Thin">
+ Corpo magro
+ </string>
+ <string name="Bow Legged">
+ Pernas arqueadas
+ </string>
+ <string name="Breast Buoyancy">
+ Caimento dos seios
+ </string>
+ <string name="Breast Cleavage">
+ Separação dos seios
+ </string>
+ <string name="Breast Size">
+ Tamanho dos seios
+ </string>
+ <string name="Bridge Width">
+ Largura do nariz
+ </string>
+ <string name="Broad">
+ Largo
+ </string>
+ <string name="Brow Size">
+ Tamanho da sobrancelha
+ </string>
+ <string name="Bug Eyes">
+ Olhos saltados
+ </string>
+ <string name="Bugged Eyes">
+ Olhos esbugalhados
+ </string>
+ <string name="Bulbous">
+ Bulbos
+ </string>
+ <string name="Bulbous Nose">
+ Nariz em bulbo
+ </string>
+ <string name="Bushy Eyebrows">
+ Sobrancelhas grossas
+ </string>
+ <string name="Bushy Hair">
+ Cabelo grosso
+ </string>
+ <string name="Butt Size">
+ Tamanho do traseiro
+ </string>
+ <string name="bustle skirt">
+ Saia armada
+ </string>
+ <string name="no bustle">
+ Saia reta
+ </string>
+ <string name="more bustle">
+ Mais
+ </string>
+ <string name="Chaplin">
+ Chaplin
+ </string>
+ <string name="Cheek Bones">
+ Maçãs do rosto
+ </string>
+ <string name="Chest Size">
+ Tamanho do peito
+ </string>
+ <string name="Chin Angle">
+ Ângulo do queixo
+ </string>
+ <string name="Chin Cleft">
+ Fissura do queixo
+ </string>
+ <string name="Chin Curtains">
+ Barba de contorno
+ </string>
+ <string name="Chin Depth">
+ Profundidade do queixo
+ </string>
+ <string name="Chin Heavy">
+ Queixo pronunciado
+ </string>
+ <string name="Chin In">
+ Queixo para dentro
+ </string>
+ <string name="Chin Out">
+ Queixo para fora
+ </string>
+ <string name="Chin-Neck">
+ Queixo-pescoço
+ </string>
+ <string name="Clear">
+ Limpar
+ </string>
+ <string name="Cleft">
+ Fenda
+ </string>
+ <string name="Close Set Eyes">
+ Fechar conjunto de olhos
+ </string>
+ <string name="Closed">
+ Fechado
+ </string>
+ <string name="Closed Back">
+ Trás fechada
+ </string>
+ <string name="Closed Front">
+ Frente fechada
+ </string>
+ <string name="Closed Left">
+ Esquerda fechada
+ </string>
+ <string name="Closed Right">
+ Direita fechada
+ </string>
+ <string name="Coin Purse">
+ Pouco volume
+ </string>
+ <string name="Collar Back">
+ Colarinho posterior
+ </string>
+ <string name="Collar Front">
+ Colarinho anterior
+ </string>
+ <string name="Corner Down">
+ Canto para baixo
+ </string>
+ <string name="Corner Up">
+ Canto para cima
+ </string>
+ <string name="Creased">
+ Vincado
+ </string>
+ <string name="Crooked Nose">
+ Nariz torto
+ </string>
+ <string name="Cuff Flare">
+ Bainha larga
+ </string>
+ <string name="Dark">
+ Escuro
+ </string>
+ <string name="Dark Green">
+ Verde escuro
+ </string>
+ <string name="Darker">
+ Mais escuro
+ </string>
+ <string name="Deep">
+ Profundidade
+ </string>
+ <string name="Default Heels">
+ Salto padrão
+ </string>
+ <string name="Dense">
+ Densidade
+ </string>
+ <string name="Double Chin">
+ Queixo duplo
+ </string>
+ <string name="Downturned">
+ Curvado para baixo
+ </string>
+ <string name="Duffle Bag">
+ Mais volume
+ </string>
+ <string name="Ear Angle">
+ Ângulo da orelha
+ </string>
+ <string name="Ear Size">
+ Tamanho da orelha
+ </string>
+ <string name="Ear Tips">
+ Pontas das orelhas
+ </string>
+ <string name="Egg Head">
+ Cabeça oval
+ </string>
+ <string name="Eye Bags">
+ Olheiras
+ </string>
+ <string name="Eye Color">
+ Cor dos olhos
+ </string>
+ <string name="Eye Depth">
+ Profundidade dos olhos
+ </string>
+ <string name="Eye Lightness">
+ Luminosidade dos olhos
+ </string>
+ <string name="Eye Opening">
+ Abertura dos olhos
+ </string>
+ <string name="Eye Pop">
+ Olho saltado
+ </string>
+ <string name="Eye Size">
+ Tamanho dos olhos
+ </string>
+ <string name="Eye Spacing">
+ Espaçamento dos olhos
+ </string>
+ <string name="Eyebrow Arc">
+ Arco da sobrancelha
+ </string>
+ <string name="Eyebrow Density">
+ Densidade da sobrancelha
+ </string>
+ <string name="Eyebrow Height">
+ Altura da sobrancelha
+ </string>
+ <string name="Eyebrow Points">
+ Pontas da sobrancelha
+ </string>
+ <string name="Eyebrow Size">
+ Tamanho da sobrancelha
+ </string>
+ <string name="Eyelash Length">
+ Comprimento das pestanas
+ </string>
+ <string name="Eyeliner">
+ Delineador
+ </string>
+ <string name="Eyeliner Color">
+ Cor do delineador
+ </string>
+ <string name="Eyes Bugged">
+ Olhos esbugalhados
+ </string>
+ <string name="Face Shear">
+ Face raspada
+ </string>
+ <string name="Facial Definition">
+ Definição facial
+ </string>
+ <string name="Far Set Eyes">
+ Distância entre os olhos
+ </string>
+ <string name="Fat Lips">
+ Lábios carnudos
+ </string>
+ <string name="Female">
+ Feminino
+ </string>
+ <string name="Fingerless">
+ Dedos
+ </string>
+ <string name="Fingers">
+ Dedos
+ </string>
+ <string name="Flared Cuffs">
+ Punhos largos
+ </string>
+ <string name="Flat">
+ Chato
+ </string>
+ <string name="Flat Butt">
+ Traseiro chato
+ </string>
+ <string name="Flat Head">
+ Cabeça chata
+ </string>
+ <string name="Flat Toe">
+ Dedos dos pés chatos
+ </string>
+ <string name="Foot Size">
+ Tamanho dos pés
+ </string>
+ <string name="Forehead Angle">
+ Ângulo da testa
+ </string>
+ <string name="Forehead Heavy">
+ Testa pronunciada
+ </string>
+ <string name="Freckles">
+ Sardas
+ </string>
+ <string name="Front Fringe">
+ Franja
+ </string>
+ <string name="Full Back">
+ Trás cheia
+ </string>
+ <string name="Full Eyeliner">
+ Delienador cheio
+ </string>
+ <string name="Full Front">
+ Frente cheia
+ </string>
+ <string name="Full Hair Sides">
+ Cabelos laterais cheios
+ </string>
+ <string name="Full Sides">
+ Lados cheios
+ </string>
+ <string name="Glossy">
+ Brilhante
+ </string>
+ <string name="Glove Fingers">
+ Dedos da luva
+ </string>
+ <string name="Glove Length">
+ Comprimento das luvas
+ </string>
+ <string name="Hair">
+ Cabelo
+ </string>
+ <string name="Hair Back">
+ Cabelo: Trás
+ </string>
+ <string name="Hair Front">
+ Cabelo: Frente
+ </string>
+ <string name="Hair Sides">
+ Cabelos: Lateral
+ </string>
+ <string name="Hair Sweep">
+ Cabelo penteado
+ </string>
+ <string name="Hair Thickess">
+ Espessura do cabelo
+ </string>
+ <string name="Hair Thickness">
+ Espessura do cabelo
+ </string>
+ <string name="Hair Tilt">
+ Divisão do cabelo
+ </string>
+ <string name="Hair Tilted Left">
+ Divistão do cabelo esquerda
+ </string>
+ <string name="Hair Tilted Right">
+ Divisão do cabelo direita
+ </string>
+ <string name="Hair Volume">
+ Cabelo: Volume
+ </string>
+ <string name="Hand Size">
+ Tamanho das mãos
+ </string>
+ <string name="Handlebars">
+ Bigode
+ </string>
+ <string name="Head Length">
+ Comprimento da cabeça
+ </string>
+ <string name="Head Shape">
+ Formato da cabeça
+ </string>
+ <string name="Head Size">
+ Tamanho da cabeça
+ </string>
+ <string name="Head Stretch">
+ Extensão da cabeça
+ </string>
+ <string name="Heel Height">
+ Altura do salto
+ </string>
+ <string name="Heel Shape">
+ Formato do salto
+ </string>
+ <string name="Height">
+ Altura
+ </string>
+ <string name="High">
+ Alto
+ </string>
+ <string name="High Heels">
+ Salto alto
+ </string>
+ <string name="High Jaw">
+ Maxilar alto
+ </string>
+ <string name="High Platforms">
+ Plataformas altas
+ </string>
+ <string name="High and Tight">
+ Alto e justo
+ </string>
+ <string name="Higher">
+ Mais alto
+ </string>
+ <string name="Hip Length">
+ Comprimento do quadril
+ </string>
+ <string name="Hip Width">
+ Largura do quadril
+ </string>
+ <string name="In">
+ Dentro
+ </string>
+ <string name="In Shdw Color">
+ Cor da sombra interna
+ </string>
+ <string name="In Shdw Opacity">
+ Opacidade da sombra interna
+ </string>
+ <string name="Inner Eye Corner">
+ Canto interno dos olhos
+ </string>
+ <string name="Inner Eye Shadow">
+ Sombra interna dos olhos
+ </string>
+ <string name="Inner Shadow">
+ Sombra interna
+ </string>
+ <string name="Jacket Length">
+ Comprimento da blusa
+ </string>
+ <string name="Jacket Wrinkles">
+ Dobras da jaqueta
+ </string>
+ <string name="Jaw Angle">
+ Ângulo da mandíbula
+ </string>
+ <string name="Jaw Jut">
+ Posição do maxilar
+ </string>
+ <string name="Jaw Shape">
+ Formato do maxilar
+ </string>
+ <string name="Join">
+ Juntar
+ </string>
+ <string name="Jowls">
+ Papo
+ </string>
+ <string name="Knee Angle">
+ Ângulo do joelho
+ </string>
+ <string name="Knock Kneed">
+ Joelhos para dentro
+ </string>
+ <string name="Large">
+ Grande
+ </string>
+ <string name="Large Hands">
+ Mãos grandes
+ </string>
+ <string name="Left Part">
+ Parte esquerda
+ </string>
+ <string name="Leg Length">
+ Comprimento da perna
+ </string>
+ <string name="Leg Muscles">
+ Musculatura da perna
+ </string>
+ <string name="Less">
+ Menos
+ </string>
+ <string name="Less Body Fat">
+ Menos gordura
+ </string>
+ <string name="Less Curtains">
+ Menos barba
+ </string>
+ <string name="Less Freckles">
+ Menos sardas
+ </string>
+ <string name="Less Full">
+ Menos
+ </string>
+ <string name="Less Gravity">
+ Menos gravidade
+ </string>
+ <string name="Less Love">
+ Menos excesso
+ </string>
+ <string name="Less Muscles">
+ Menos músculos
+ </string>
+ <string name="Less Muscular">
+ Menos musculoso
+ </string>
+ <string name="Less Rosy">
+ Menos rosado
+ </string>
+ <string name="Less Round">
+ Menos arredondado
+ </string>
+ <string name="Less Saddle">
+ Menos ancas
+ </string>
+ <string name="Less Square">
+ Menos quadrado
+ </string>
+ <string name="Less Volume">
+ Menos volume
+ </string>
+ <string name="Less soul">
+ Menos alma
+ </string>
+ <string name="Lighter">
+ Lighter
+ </string>
+ <string name="Lip Cleft">
+ Fenda dos lábios
+ </string>
+ <string name="Lip Cleft Depth">
+ Profundidade da fenda dos lábios
+ </string>
+ <string name="Lip Fullness">
+ Volume dos lábios
+ </string>
+ <string name="Lip Pinkness">
+ Rosado dos lábios
+ </string>
+ <string name="Lip Ratio">
+ Proporção dos lábios
+ </string>
+ <string name="Lip Thickness">
+ Espessura dos lábios
+ </string>
+ <string name="Lip Width">
+ Largura dos lábios
+ </string>
+ <string name="Lipgloss">
+ Brilho dos lábios
+ </string>
+ <string name="Lipstick">
+ Batom
+ </string>
+ <string name="Lipstick Color">
+ Cor do batom
+ </string>
+ <string name="Long">
+ Longo
+ </string>
+ <string name="Long Head">
+ Cabeça alongada
+ </string>
+ <string name="Long Hips">
+ Lábios longos
+ </string>
+ <string name="Long Legs">
+ Pernas longas
+ </string>
+ <string name="Long Neck">
+ Pescoço longo
+ </string>
+ <string name="Long Pigtails">
+ Chiquinhas longas
+ </string>
+ <string name="Long Ponytail">
+ Rabo de cavalo longo
+ </string>
+ <string name="Long Torso">
+ Torso longo
+ </string>
+ <string name="Long arms">
+ Braços longos
+ </string>
+ <string name="Loose Pants">
+ Pantalonas
+ </string>
+ <string name="Loose Shirt">
+ Camisa folgada
+ </string>
+ <string name="Loose Sleeves">
+ Mangas folgadas
+ </string>
+ <string name="Love Handles">
+ Pneu
+ </string>
+ <string name="Low">
Baixo
</string>
- <string name="GraphicsQualityMid">
- Meio
+ <string name="Low Heels">
+ Salto baixo
</string>
- <string name="GraphicsQualityHigh">
+ <string name="Low Jaw">
+ Maxilar baixo
+ </string>
+ <string name="Low Platforms">
+ Plataformas baixas
+ </string>
+ <string name="Low and Loose">
+ Baixo e solto
+ </string>
+ <string name="Lower">
+ Mais baixo
+ </string>
+ <string name="Lower Bridge">
+ Mais baixa
+ </string>
+ <string name="Lower Cheeks">
+ Bochechas abaixadas
+ </string>
+ <string name="Male">
+ Masculino
+ </string>
+ <string name="Middle Part">
+ Parte do meio
+ </string>
+ <string name="More">
+ Mais
+ </string>
+ <string name="More Blush">
+ Mais blush
+ </string>
+ <string name="More Body Fat">
+ Mais gordura
+ </string>
+ <string name="More Curtains">
+ Mais barba
+ </string>
+ <string name="More Eyeshadow">
+ Mais sombra dos olhos
+ </string>
+ <string name="More Freckles">
+ Mais sardas
+ </string>
+ <string name="More Full">
+ Mais volume
+ </string>
+ <string name="More Gravity">
+ Mais gravidade
+ </string>
+ <string name="More Lipstick">
+ Mais batom
+ </string>
+ <string name="More Love">
+ Mais cintura
+ </string>
+ <string name="More Lower Lip">
+ Mais lábio inferior
+ </string>
+ <string name="More Muscles">
+ Mais músculos
+ </string>
+ <string name="More Muscular">
+ Mais musculoso
+ </string>
+ <string name="More Rosy">
+ Mais rosado
+ </string>
+ <string name="More Round">
+ Mais arredondado
+ </string>
+ <string name="More Saddle">
+ Mais ancas
+ </string>
+ <string name="More Sloped">
+ Mais inclinado
+ </string>
+ <string name="More Square">
+ Mais quadrado
+ </string>
+ <string name="More Upper Lip">
+ Mais lábios superiores
+ </string>
+ <string name="More Vertical">
+ Mais vertical
+ </string>
+ <string name="More Volume">
+ Mais volume
+ </string>
+ <string name="More soul">
+ Mais alma
+ </string>
+ <string name="Moustache">
+ Bigode
+ </string>
+ <string name="Mouth Corner">
+ Canto da boca
+ </string>
+ <string name="Mouth Position">
+ Posição da boca
+ </string>
+ <string name="Mowhawk">
+ Moicano
+ </string>
+ <string name="Muscular">
+ Muscular
+ </string>
+ <string name="Mutton Chops">
+ Costeletas
+ </string>
+ <string name="Nail Polish">
+ Esmate das unhas
+ </string>
+ <string name="Nail Polish Color">
+ Cor do esmalte das unhas
+ </string>
+ <string name="Narrow">
+ Estreito
+ </string>
+ <string name="Narrow Back">
+ Costas estreitas
+ </string>
+ <string name="Narrow Front">
+ Frente estreita
+ </string>
+ <string name="Narrow Lips">
+ Lábios estreitos
+ </string>
+ <string name="Natural">
+ Natural
+ </string>
+ <string name="Neck Length">
+ Comprimento do pescoço
+ </string>
+ <string name="Neck Thickness">
+ Espessura do pescoço
+ </string>
+ <string name="No Blush">
+ Sem blush
+ </string>
+ <string name="No Eyeliner">
+ Sem delineador
+ </string>
+ <string name="No Eyeshadow">
+ Sem sombra
+ </string>
+ <string name="No Lipgloss">
+ Sem brilho
+ </string>
+ <string name="No Lipstick">
+ Sem batom
+ </string>
+ <string name="No Part">
+ Sem parte
+ </string>
+ <string name="No Polish">
+ Sem esmalte
+ </string>
+ <string name="No Red">
+ Sem vermelho
+ </string>
+ <string name="No Spikes">
+ Sem pontas
+ </string>
+ <string name="No White">
+ Sem branco
+ </string>
+ <string name="No Wrinkles">
+ Sem dobras
+ </string>
+ <string name="Normal Lower">
+ Normal inferior
+ </string>
+ <string name="Normal Upper">
+ Normal superior
+ </string>
+ <string name="Nose Left">
+ Nariz para esquerda
+ </string>
+ <string name="Nose Right">
+ Nariz para direita
+ </string>
+ <string name="Nose Size">
+ Tamanho do nariz
+ </string>
+ <string name="Nose Thickness">
+ Espessura do nariz
+ </string>
+ <string name="Nose Tip Angle">
+ Ângulo da ponta do nariz
+ </string>
+ <string name="Nose Tip Shape">
+ Formato da ponta do nariz
+ </string>
+ <string name="Nose Width">
+ Largura do nariz
+ </string>
+ <string name="Nostril Division">
+ Divisão das narinas
+ </string>
+ <string name="Nostril Width">
+ Largura das narinas
+ </string>
+ <string name="Opaque">
+ Opaco
+ </string>
+ <string name="Open">
+ Abrir
+ </string>
+ <string name="Open Back">
+ Aberto atrás
+ </string>
+ <string name="Open Front">
+ Aberto na frente
+ </string>
+ <string name="Open Left">
+ Aberto esquerdo
+ </string>
+ <string name="Open Right">
+ Aberto direito
+ </string>
+ <string name="Orange">
+ Laranja
+ </string>
+ <string name="Out">
+ Fora
+ </string>
+ <string name="Out Shdw Color">
+ Cor da sombra externa
+ </string>
+ <string name="Out Shdw Opacity">
+ Opacidade da sombra externa
+ </string>
+ <string name="Outer Eye Corner">
+ Canto externo do olho
+ </string>
+ <string name="Outer Eye Shadow">
+ Sombra externa do olho
+ </string>
+ <string name="Outer Shadow">
+ Sombra externa
+ </string>
+ <string name="Overbite">
+ Má oclusão
+ </string>
+ <string name="Package">
+ Púbis
+ </string>
+ <string name="Painted Nails">
+ Unhas pintadas
+ </string>
+ <string name="Pale">
+ Pálido
+ </string>
+ <string name="Pants Crotch">
+ Cavalo da calça
+ </string>
+ <string name="Pants Fit">
+ Caimento das calças
+ </string>
+ <string name="Pants Length">
+ Comprimento das calças
+ </string>
+ <string name="Pants Waist">
+ Cintura da calça
+ </string>
+ <string name="Pants Wrinkles">
+ Dobras das calças
+ </string>
+ <string name="Part">
+ Parte
+ </string>
+ <string name="Part Bangs">
+ Divisão da franja
+ </string>
+ <string name="Pectorals">
+ Peitorais
+ </string>
+ <string name="Pigment">
+ Pigmento
+ </string>
+ <string name="Pigtails">
+ Chiquinhas
+ </string>
+ <string name="Pink">
+ Rosa
+ </string>
+ <string name="Pinker">
+ Mais rosado
+ </string>
+ <string name="Platform Height">
+ Altura da plataforma
+ </string>
+ <string name="Platform Width">
+ Largura da plataforma
+ </string>
+ <string name="Pointy">
+ Pontudo
+ </string>
+ <string name="Pointy Heels">
+ Salto agulha
+ </string>
+ <string name="Ponytail">
+ Rabo de cavalo
+ </string>
+ <string name="Poofy Skirt">
+ Saia bufante
+ </string>
+ <string name="Pop Left Eye">
+ Olho saltado esquerdo
+ </string>
+ <string name="Pop Right Eye">
+ Olho saltado direito
+ </string>
+ <string name="Puffy">
+ Inchado
+ </string>
+ <string name="Puffy Eyelids">
+ Pálpebras inchadas
+ </string>
+ <string name="Rainbow Color">
+ Cor do arco íris
+ </string>
+ <string name="Red Hair">
+ Cabelo ruivo
+ </string>
+ <string name="Regular">
+ Normal
+ </string>
+ <string name="Right Part">
+ Parte direita
+ </string>
+ <string name="Rosy Complexion">
+ Rosado da face
+ </string>
+ <string name="Round">
+ Arredondado
+ </string>
+ <string name="Ruddiness">
+ Rubor
+ </string>
+ <string name="Ruddy">
+ Corado
+ </string>
+ <string name="Rumpled Hair">
+ Cabelo desalinhado
+ </string>
+ <string name="Saddle Bags">
+ Culote
+ </string>
+ <string name="Scrawny Leg">
+ Pernas magricelas
+ </string>
+ <string name="Separate">
+ Separar
+ </string>
+ <string name="Shallow">
+ Raso
+ </string>
+ <string name="Shear Back">
+ Trás rente
+ </string>
+ <string name="Shear Face">
+ Face raspada
+ </string>
+ <string name="Shear Front">
+ Frente rente
+ </string>
+ <string name="Shear Left Up">
+ Esquerda rente para cima
+ </string>
+ <string name="Shear Right Up">
+ Trás rente para cima
+ </string>
+ <string name="Sheared Back">
+ Rente atrás
+ </string>
+ <string name="Sheared Front">
+ Rente frente
+ </string>
+ <string name="Shift Left">
+ Deslocar p/ esquerda
+ </string>
+ <string name="Shift Mouth">
+ Deslocar boca
+ </string>
+ <string name="Shift Right">
+ Deslocar p/ direita
+ </string>
+ <string name="Shirt Bottom">
+ Barra da camisa
+ </string>
+ <string name="Shirt Fit">
+ Ajuste da camisa
+ </string>
+ <string name="Shirt Wrinkles">
+ +/- amassada
+ </string>
+ <string name="Shoe Height">
+ Altura do sapato
+ </string>
+ <string name="Short">
+ Curto
+ </string>
+ <string name="Short Arms">
+ Braços curtos
+ </string>
+ <string name="Short Legs">
+ Pernas curtas
+ </string>
+ <string name="Short Neck">
+ Pescoço curto
+ </string>
+ <string name="Short Pigtails">
+ Chiquinhas curtas
+ </string>
+ <string name="Short Ponytail">
+ Rabo de cavalo curto
+ </string>
+ <string name="Short Sideburns">
+ Costeletas curtas
+ </string>
+ <string name="Short Torso">
+ Tronco curto
+ </string>
+ <string name="Short hips">
+ Quadril curto
+ </string>
+ <string name="Shoulders">
+ Ombros
+ </string>
+ <string name="Side Fringe">
+ pontas laterais
+ </string>
+ <string name="Sideburns">
+ Costeletas
+ </string>
+ <string name="Sides Hair">
+ Cabelo lateral
+ </string>
+ <string name="Sides Hair Down">
+ Cabelo lateral long
+ </string>
+ <string name="Sides Hair Up">
+ Cabelo lateral superior
+ </string>
+ <string name="Skinny Neck">
+ Pescoço fino
+ </string>
+ <string name="Skirt Fit">
+ Ajuste de saia
+ </string>
+ <string name="Skirt Length">
+ Comprimento da saia
+ </string>
+ <string name="Slanted Forehead">
+ Testa inclinada
+ </string>
+ <string name="Sleeve Length">
+ Comprimento da manga
+ </string>
+ <string name="Sleeve Looseness">
+ Folga da manga
+ </string>
+ <string name="Slit Back">
+ Abertura : Atrás
+ </string>
+ <string name="Slit Front">
+ Abertura: Frente
+ </string>
+ <string name="Slit Left">
+ Abertura: Esquerda
+ </string>
+ <string name="Slit Right">
+ Abertura: Direita
+ </string>
+ <string name="Small">
+ Pequeno
+ </string>
+ <string name="Small Hands">
+ Mãos pequenas
+ </string>
+ <string name="Small Head">
+ Cabeça pequena
+ </string>
+ <string name="Smooth">
+ Suavizar
+ </string>
+ <string name="Smooth Hair">
+ Suavizar cabelo
+ </string>
+ <string name="Socks Length">
+ Comprimento das meias
+ </string>
+ <string name="Soulpatch">
+ Cavanhaque
+ </string>
+ <string name="Sparse">
+ Disperso
+ </string>
+ <string name="Spiked Hair">
+ Cabelo espetado
+ </string>
+ <string name="Square">
+ Quadrado
+ </string>
+ <string name="Square Toe">
+ Dedo quadrado
+ </string>
+ <string name="Squash Head">
+ Cabeça de Pera
+ </string>
+ <string name="Stretch Head">
+ Cabeça esticada
+ </string>
+ <string name="Sunken">
+ Afundar
+ </string>
+ <string name="Sunken Chest">
+ Peito afundado
+ </string>
+ <string name="Sunken Eyes">
+ Olhos afundados
+ </string>
+ <string name="Sweep Back">
+ Pentear para trás
+ </string>
+ <string name="Sweep Forward">
+ Pentear para frente
+ </string>
+ <string name="Tall">
Alto
</string>
-
- <!-- PARCEL_CATEGORY_UI_STRING -->
- <string name="Linden Location">Locação Linden</string>
- <string name="Adult">Adult</string>
- <string name="Arts&amp;Culture">Artes e Cultura</string>
- <string name="Business">Negócios</string>
- <string name="Educational">Educacional</string>
- <string name="Gaming">Jogos</string>
- <string name="Hangout">Moradia</string>
- <string name="Newcomer Friendly">Amigável a Novos Usuários</string>
- <string name="Parks&amp;Nature">Parques &amp; Natureza</string>
- <string name="Residential">Residencial</string>
- <string name="Shopping">Compras</string>
- <string name="Other">Outros</string>
- <string name="ringing">
- Conectando à conversa de Voz no mundo
+ <string name="Taper Back">
+ Afinar atrás
</string>
- <string name="connected">
- Conectado
+ <string name="Taper Front">
+ Afinar a frente
</string>
- <string name="unavailable">
- Voz não disponível na sua localização atual
+ <string name="Thick Heels">
+ Salto grosso
</string>
- <string name="hang_up">
- Desconectado da conversa de Voz no mundo
+ <string name="Thick Neck">
+ Pescoço grosso
+ </string>
+ <string name="Thick Toe">
+ Dedo grosso
+ </string>
+ <string name="Thin">
+ Fino
+ </string>
+ <string name="Thin Eyebrows">
+ Sobrancelhas finas
+ </string>
+ <string name="Thin Lips">
+ Lábios finos
+ </string>
+ <string name="Thin Nose">
+ Nariz fino
+ </string>
+ <string name="Tight Chin">
+ Queixo apertado
+ </string>
+ <string name="Tight Cuffs">
+ Punho justo
+ </string>
+ <string name="Tight Pants">
+ Calça justa
+ </string>
+ <string name="Tight Shirt">
+ Camisa justa
+ </string>
+ <string name="Tight Skirt">
+ Saia justa
+ </string>
+ <string name="Tight Sleeves">
+ Tight Sleeves
+ </string>
+ <string name="Toe Shape">
+ Formato dos dedos
+ </string>
+ <string name="Toe Thickness">
+ Espessura dos dos dedos
+ </string>
+ <string name="Torso Length">
+ Comprimento do tronco
+ </string>
+ <string name="Torso Muscles">
+ Músculos do tronco
+ </string>
+ <string name="Torso Scrawny">
+ Tronco magricela
+ </string>
+ <string name="Unattached">
+ Desanexado
+ </string>
+ <string name="Uncreased">
+ Uncreased
+ </string>
+ <string name="Underbite">
+ Underbite
+ </string>
+ <string name="Unnatural">
+ Não natural
+ </string>
+ <string name="Upper Bridge">
+ Parte alta do nariz
+ </string>
+ <string name="Upper Cheeks">
+ Bochechas altas
+ </string>
+ <string name="Upper Chin Cleft">
+ fenda do queixo alta
+ </string>
+ <string name="Upper Eyelid Fold">
+ Curvatura dos cílios supériores
+ </string>
+ <string name="Upturned">
+ Voltado para cima
+ </string>
+ <string name="Very Red">
+ Bem vermelho
+ </string>
+ <string name="Waist Height">
+ Altura da cintura
+ </string>
+ <string name="Well-Fed">
+ Corpulento
+ </string>
+ <string name="White Hair">
+ Grisalho
+ </string>
+ <string name="Wide">
+ Amplo
+ </string>
+ <string name="Wide Back">
+ Costas largas
+ </string>
+ <string name="Wide Front">
+ Testa larga
+ </string>
+ <string name="Wide Lips">
+ Lábios amplos
+ </string>
+ <string name="Wild">
+ Selvagem
+ </string>
+ <string name="Wrinkles">
+ Rugas
+ </string>
+ <string name="LocationCtrlAddLandmarkTooltip">
+ Adicionar às minhas Landmarks
+ </string>
+ <string name="LocationCtrlEditLandmarkTooltip">
+ Editar minhas Landmarks
+ </string>
+ <string name="LocationCtrlInfoBtnTooltip">
+ Ver mais informações sobre a localização atual
+ </string>
+ <string name="LocationCtrlComboBtnTooltip">
+ Histórico de localizações
+ </string>
+ <string name="LocationCtrlAdultIconTooltip">
+ Região Adulta
+ </string>
+ <string name="LocationCtrlModerateIconTooltip">
+ Região Moderada
+ </string>
+ <string name="LocationCtrlGeneralIconTooltip">
+ Região em geral
+ </string>
+ <string name="UpdaterWindowTitle">
+ [APP_NAME] Atualização
+ </string>
+ <string name="UpdaterNowUpdating">
+ Atualizando agora o [APP_NAME]...
+ </string>
+ <string name="UpdaterNowInstalling">
+ Instalando [APP_NAME]...
+ </string>
+ <string name="UpdaterUpdatingDescriptive">
+ Seu visualizador [APP_NAME] está sendo atualizado para a versão mais recente. Isso pode levar algum tempo, então por favor seja paciente.
+ </string>
+ <string name="UpdaterProgressBarTextWithEllipses">
+ Fazendo o download da atualização...
+ </string>
+ <string name="UpdaterProgressBarText">
+ Fazendo o download da atualização
+ </string>
+ <string name="UpdaterFailDownloadTitle">
+ Falha no download da atualização
+ </string>
+ <string name="UpdaterFailUpdateDescriptive">
+ Um erro ocorreu ao atualizar [APP_NAME]. Por favor, faça o download da versão mais recente em www.secondlife.com.
+ </string>
+ <string name="UpdaterFailInstallTitle">
+ Falha ao instalar a atualização
+ </string>
+ <string name="UpdaterFailStartTitle">
+ Falha ao iniciar o visualizador
+ </string>
+ <string name="ItemsComingInTooFastFrom">
+ [APP_NAME]: Entrada de itens rápida demais de [FROM_NAME], visualização automática suspensa por [TIME] segundos
+ </string>
+ <string name="ItemsComingInTooFast">
+ [APP_NAME]: Entrada de itens rápida demais, visualização automática suspensa por [TIME] segundos
+ </string>
+ <string name="IM_logging_string">
+ -- Log de mensagem instantânea habilitado --
+ </string>
+ <string name="IM_typing_start_string">
+ [NAME] está digitando...
+ </string>
+ <string name="Unnamed">
+ (Anônimo)
+ </string>
+ <string name="IM_moderated_chat_label">
+ (Moderado: Voz desativado por padrão)
+ </string>
+ <string name="IM_unavailable_text_label">
+ Bate-papo de texto não está disponível para esta chamada.
+ </string>
+ <string name="IM_muted_text_label">
+ Seu bate- papo de texto foi desabilitado por um Moderador do Grupo.
+ </string>
+ <string name="IM_default_text_label">
+ Clique aqui para menagem instantânea.
+ </string>
+ <string name="IM_to_label">
+ Para
+ </string>
+ <string name="IM_moderator_label">
+ (Moderador)
+ </string>
+ <string name="answered_call">
+ Ligação atendida
+ </string>
+ <string name="you_started_call">
+ Você iniciou uma ligação de voz
+ </string>
+ <string name="you_joined_call">
+ Você entrou na ligação
+ </string>
+ <string name="name_started_call">
+ [NAME] iniciou uma ligação de voz
+ </string>
+ <string name="ringing-im">
+ Entrando em ligação de voz...
+ </string>
+ <string name="connected-im">
+ Conectado. Para sair, clique em Desligar
+ </string>
+ <string name="hang_up-im">
+ Saiu da ligação de voz
</string>
- <string name="ScriptQuestionCautionChatGranted">
- &apos;[OBJECTNAME]&apos;, um objeto de &apos;[OWNERNAME]&apos;, localizado em [REGIONNAME] a [REGIONPOS], obteve permissão para: [PERMISSIONS].
- </string>
- <string name="ScriptQuestionCautionChatDenied">
- &apos;[OBJECTNAME]&apos;, um objeto de &apos;[OWNERNAME]&apos;, localizado em [REGIONNAME] a [REGIONPOS], teve permissão negada para: [PERMISSIONS].
- </string>
- <string name="ScriptTakeMoney">
- Tomar linden dólares (L$) de você
- </string>
- <string name="ActOnControlInputs">
- Atue nas suas entradas de controle
- </string>
- <string name="RemapControlInputs">
- Remapeie suas entradas de controle
- </string>
- <string name="AnimateYourAvatar">
- Faça uma animação para o seu avatar
- </string>
- <string name="AttachToYourAvatar">
- Anexe ao seu avatar
- </string>
- <string name="ReleaseOwnership">
- Libere a propriedade e torne-a pública
- </string>
- <string name="LinkAndDelink">
- Una e desuna de outros objetos
- </string>
- <string name="AddAndRemoveJoints">
- Adicione e remova junções com outros objetos
- </string>
- <string name="ChangePermissions">
- Modifique as permissões
- </string>
- <string name="TrackYourCamera">
- Acompanhe sua câmera
- </string>
- <string name="ControlYourCamera">
- Controle sua camera
- </string>
<string name="only_user_message">
Você é o único usuário desta sessão.
</string>
@@ -588,6 +3396,12 @@
<string name="invite_message">
Clique no botão [BUTTON NAME] para aceitar/ conectar a este bate-papo em voz.
</string>
+ <string name="muted_message">
+ Você bloqueou este residente. Se quiser retirar o bloqueio, basta enviar uma mensagem.
+ </string>
+ <string name="generic">
+ Erro de solicitação, tente novamente mais tarde.
+ </string>
<string name="generic_request_error">
Erro na requisição, por favor, tente novamente.
</string>
@@ -606,46 +3420,283 @@
<string name="not_a_mod_error">
Você não é um moderador de sessão.
</string>
+ <string name="muted">
+ Bate-papo de texto desativado por um moderador.
+ </string>
<string name="muted_error">
Um moderador do grupo desabilitou seu bate-papo em texto.
</string>
<string name="add_session_event">
Não foi possível adicionar usuários na sessão de bate-papo com [RECIPIENT].
</string>
+ <string name="message">
+ Não foi possível enviar sua mensagem para o bate-papo com [RECIPIENT].
+ </string>
<string name="message_session_event">
Não foi possível enviar sua mensagem na sessão de bate- papo com [RECIPIENT].
</string>
+ <string name="mute">
+ Erro durante a moderação.
+ </string>
+ <string name="removed">
+ Você foi tirado do grupo.
+ </string>
<string name="removed_from_group">
Você foi removido do grupo.
</string>
<string name="close_on_no_ability">
Você não possui mais a habilidade de estar na sessão de bate-papo.
</string>
- <string name="AcctTypeResident">
- Residente
- </string>
- <string name="AcctTypeTrial">
- Teste
- </string>
- <string name="AcctTypeCharterMember">
- Estatuto do membro
- </string>
- <string name="AcctTypeEmployee">
- Contratado da Linden Lab
- </string>
- <string name="PaymentInfoUsed">
- Infor. de pagamento utilizadas
- </string>
- <string name="PaymentInfoOnFile">
- Infor. de pagamento no arquivo
- </string>
- <string name="NoPaymentInfoOnFile">
- Sem infor. de pagamento no arquivo
- </string>
- <string name="AgeVerified">
- Idade Verificada
- </string>
- <string name="NotAgeVerified">
- Idade não Verificada
- </string>
+ <string name="unread_chat_single">
+ [SOURCES] disse alguma coisa
+ </string>
+ <string name="unread_chat_multiple">
+ [SOURCES] disseram alguma coisa
+ </string>
+ <string name="session_initialization_timed_out_error">
+ A inicialização da sessão expirou
+ </string>
+ <string name="voice_morphing_url">
+ http://secondlife.com/landing/voicemorphing
+ </string>
+ <string name="paid_you_ldollars">
+ [NAME] lhe pagou L$ [AMOUNT]
+ </string>
+ <string name="you_paid_ldollars">
+ You pagou L$[AMOUNT] por [REASON] a [NAME].
+ </string>
+ <string name="you_paid_ldollars_no_info">
+ Você acaba de pagar L$[AMOUNT].
+ </string>
+ <string name="you_paid_ldollars_no_reason">
+ You pagou L$[AMOUNT] a [NAME].
+ </string>
+ <string name="you_paid_ldollars_no_name">
+ You pagou L$[AMOUNT] por [REASON].
+ </string>
+ <string name="for a parcel of land">
+ por uma parcela
+ </string>
+ <string name="for a land access pass">
+ por um passe de acesso
+ </string>
+ <string name="for deeding land">
+ para doar um terreno
+ </string>
+ <string name="to create a group">
+ para criar um grupo
+ </string>
+ <string name="to join a group">
+ para entrar em um grupo
+ </string>
+ <string name="to upload">
+ para carregar
+ </string>
+ <string name="giving">
+ Dando L$ [AMOUNT]
+ </string>
+ <string name="uploading_costs">
+ O upload custa L$ [AMOUNT]
+ </string>
+ <string name="this_costs">
+ Isso custa L$ [AMOUNT]
+ </string>
+ <string name="buying_selected_land">
+ Comprando terreno selecionado L$ [AMOUNT]
+ </string>
+ <string name="this_object_costs">
+ Esse objeto custa L$ [AMOUNT]
+ </string>
+ <string name="group_role_everyone">
+ Todos
+ </string>
+ <string name="group_role_officers">
+ Oficiais
+ </string>
+ <string name="group_role_owners">
+ Proprietários
+ </string>
+ <string name="uploading_abuse_report">
+ Carregando...
+
+Denunciar abuso
+ </string>
+ <string name="New Shape">
+ Nova forma
+ </string>
+ <string name="New Skin">
+ Nova pele
+ </string>
+ <string name="New Hair">
+ Novo cabelo
+ </string>
+ <string name="New Eyes">
+ Novos olhos
+ </string>
+ <string name="New Shirt">
+ Nova camisa
+ </string>
+ <string name="New Pants">
+ Novas calças
+ </string>
+ <string name="New Shoes">
+ Novos sapatos
+ </string>
+ <string name="New Socks">
+ Novas meias
+ </string>
+ <string name="New Jacket">
+ Nova blusa
+ </string>
+ <string name="New Gloves">
+ Novas luvas
+ </string>
+ <string name="New Undershirt">
+ Nova camiseta
+ </string>
+ <string name="New Underpants">
+ Novas roupa de baixo
+ </string>
+ <string name="New Skirt">
+ Nova saia
+ </string>
+ <string name="New Alpha">
+ Novo alpha
+ </string>
+ <string name="New Tattoo">
+ Nova tatuagem
+ </string>
+ <string name="Invalid Wearable">
+ Item inválido
+ </string>
+ <string name="New Script">
+ Novo script
+ </string>
+ <string name="New Folder">
+ Nova pasta
+ </string>
+ <string name="Contents">
+ Conteúdo
+ </string>
+ <string name="Gesture">
+ Gesto
+ </string>
+ <string name="Male Gestures">
+ Gestos masculinos
+ </string>
+ <string name="Female Gestures">
+ Gestos femininos
+ </string>
+ <string name="Other Gestures">
+ Outros gestos
+ </string>
+ <string name="Speech Gestures">
+ Gestos da fala
+ </string>
+ <string name="Common Gestures">
+ Gestos comuns
+ </string>
+ <string name="Male - Excuse me">
+ Perdão - masculino
+ </string>
+ <string name="Male - Get lost">
+ Deixe-me em paz - masculino
+ </string>
+ <string name="Male - Blow kiss">
+ Mandar beijo - masculino
+ </string>
+ <string name="Male - Boo">
+ Vaia - masculino
+ </string>
+ <string name="Male - Bored">
+ Maçante - masculino
+ </string>
+ <string name="Male - Hey">
+ Ôpa! - masculino
+ </string>
+ <string name="Male - Laugh">
+ Risada - masculino
+ </string>
+ <string name="Male - Repulsed">
+ Quero distância! - masculino
+ </string>
+ <string name="Male - Shrug">
+ Encolher de ombros - masculino
+ </string>
+ <string name="Male - Stick tougue out">
+ Mostrar a língua - masculino
+ </string>
+ <string name="Male - Wow">
+ Wow - masculino
+ </string>
+ <string name="Female - Excuse me">
+ Perdão - fem
+ </string>
+ <string name="Female - Get lost">
+ Deixe-me em paz - feminino
+ </string>
+ <string name="Female - Blow kiss">
+ Mandar beijo - fem
+ </string>
+ <string name="Female - Boo">
+ Vaia - fem
+ </string>
+ <string name="Female - Bored">
+ Maçante - feminino
+ </string>
+ <string name="Female - Hey">
+ Ôpa - feminino
+ </string>
+ <string name="Female - Laugh">
+ Risada - feminina
+ </string>
+ <string name="Female - Repulsed">
+ Quero distância! - feminino
+ </string>
+ <string name="Female - Shrug">
+ Encolher ombros - feminino
+ </string>
+ <string name="Female - Stick tougue out">
+ Mostrar a língua - feminino
+ </string>
+ <string name="Female - Wow">
+ Wow - feminino
+ </string>
+ <string name="AvatarBirthDateFormat">
+ [mthnum,datetime,slt]/[day,datetime,slt]/[year,datetime,slt]
+ </string>
+ <string name="DefaultMimeType">
+ nenhum/nehum
+ </string>
+ <string name="texture_load_dimensions_error">
+ A imagem excede o limite [WIDTH]*[HEIGHT]
+ </string>
+ <string name="words_separator" value=","/>
+ <string name="server_is_down">
+ Aconteceu algo inesperado, apesar de termos tentador impedir isso.
+
+ Cheque secondlifegrid.net para saber se foi detectado um problema com o serviço.
+ Se o problema persisitr, cheque a configuração da sua rede e firewall.
+ </string>
+ <string name="dateTimeWeekdaysNames">
+ Domingo:Segunda:Terça:Quarta:Quinta:Sexta:Sábado
+ </string>
+ <string name="dateTimeWeekdaysShortNames">
+ Dom:Seg:Ter:Qua:Qui:Sex:Sab
+ </string>
+ <string name="dateTimeMonthNames">
+ Janeiro:Fevereiro:Março:Abril:Maio:Junho:Julho:Agosto:Setembro:Outubro:Novembro:Dezembro
+ </string>
+ <string name="dateTimeMonthShortNames">
+ Jan:Fev:Mar:Abr:Maio:Jun:Jul:Ago:Set:Out:Nov:Dez
+ </string>
+ <string name="dateTimeDayFormat">
+ [MDAY]
+ </string>
+ <string name="dateTimeAM">
+ AM
+ </string>
+ <string name="dateTimePM">
+ PM
+ </string>
</strings>
diff --git a/indra/newview/skins/default/xui/pt/teleport_strings.xml b/indra/newview/skins/default/xui/pt/teleport_strings.xml
index 6eecc45bcf..11ea0f4195 100644
--- a/indra/newview/skins/default/xui/pt/teleport_strings.xml
+++ b/indra/newview/skins/default/xui/pt/teleport_strings.xml
@@ -2,12 +2,12 @@
<teleport_messages>
<message_set name="errors">
<message name="invalid_tport">
- Problema encontrado ao processar seu pedido de Teletransporte. Você pode tentar reiniciar antes de tentar teletransportar-se. Se você continuar a receber esta mensagem, por favor verifique a FAQ do Suporte Técnico em:
-www.secondlife.com/support
+ Houve um problema ao processar o teletransporte. Talvez seja preciso sair e entrar do Second Life para fazer o teletransporte.
+Se você continuar a receber esta mensagem, por favor consulte o [SUPPORT_SITE].
</message>
<message name="invalid_region_handoff">
- Problema encontrado ao processar a passagem de regiões. Você pode tentar reiniciar antes de tentar atravessar regiões novamente. Se você continuar a receber esta mensagem, por favor verifique a FAQ do Suporte Técnico em:
-www.secondlife.com/support
+ Problema encontrado ao processar a passagem de regiões. Talvez seja preciso sair e entrar do Second Life atravessar regiões novamente.
+Se você continuar a receber esta mensagem, por favor consulte o [SUPPORT_SITE].
</message>
<message name="blocked_tport">
Desculpe, teletransportes estão atualmente bloqueados. Tente novamente dentro de alguns instantes. Se você continuar com problemas de teletransporte, por favor tente deslogar e relogar para resolver o problema.
@@ -51,7 +51,7 @@ www.secondlife.com/support
Transferindo para o destino.
</message>
<message name="sending_home">
- Enviando solicitação de localização da casa.
+ Enviando solicitação de localização de início.
</message>
<message name="sending_landmark">
Enviando solicitação de localização de landmark.
@@ -59,6 +59,9 @@ www.secondlife.com/support
<message name="completing">
Completando teletransporte.
</message>
+ <message name="completed_from">
+ Teletransporte de [T_SLURL] concluído
+ </message>
<message name="resolving">
Identificando destino.
</message>
diff --git a/indra/newview/tests/lllogininstance_test.cpp b/indra/newview/tests/lllogininstance_test.cpp
index f7ac5361c5..1c29feec5f 100644
--- a/indra/newview/tests/lllogininstance_test.cpp
+++ b/indra/newview/tests/lllogininstance_test.cpp
@@ -2,7 +2,7 @@
* @file lllogininstance_test.cpp
* @brief Test for lllogininstance.cpp.
*
- * $LicenseInfo:firstyear=2008&license=internal$
+ * $LicenseInfo:firstyear=2008&license=viewergpl$
* Copyright (c) 2008, Linden Research, Inc.
* $/LicenseInfo$
*/
@@ -10,7 +10,10 @@
// Precompiled header
#include "../llviewerprecompiledheaders.h"
// Own header
+#include "../llsecapi.h"
+#include "../llviewernetwork.h"
#include "../lllogininstance.h"
+
// STL headers
// std headers
// external library headers
@@ -33,7 +36,12 @@ const std::string APPVIEWER_SERIALNUMBER("appviewer_serialno");
//-----------------------------------------------------------------------------
static LLEventStream gTestPump("test_pump");
+#include "../llslurl.h"
+#include "../llstartup.h"
+LLSLURL LLStartUp::sStartSLURL;
+
#include "lllogin.h"
+
static std::string gLoginURI;
static LLSD gLoginCreds;
static bool gDisconnectCalled = false;
@@ -54,17 +62,75 @@ void LLLogin::disconnect()
gDisconnectCalled = true;
}
+LLSD LLCredential::getLoginParams()
+{
+ LLSD result = LLSD::emptyMap();
+
+ // legacy credential
+ result["passwd"] = "$1$testpasssd";
+ result["first"] = "myfirst";
+ result["last"] ="mylast";
+ return result;
+}
+void LLCredential::identifierType(std::string &idType)
+{
+}
+
+void LLCredential::authenticatorType(std::string &idType)
+{
+}
+
//-----------------------------------------------------------------------------
#include "../llviewernetwork.h"
-unsigned char gMACAddress[MAC_ADDRESS_BYTES] = {'1','2','3','4','5','6'};
+LLGridManager::~LLGridManager()
+{
+}
+
+void LLGridManager::addGrid(LLSD& grid_data)
+{
+}
+LLGridManager::LLGridManager()
+{
+}
-LLViewerLogin::LLViewerLogin() : mGridChoice(GRID_INFO_NONE) {}
-LLViewerLogin::~LLViewerLogin() {}
-void LLViewerLogin::getLoginURIs(std::vector<std::string>& uris) const
+void LLGridManager::getLoginURIs(std::vector<std::string>& uris)
{
uris.push_back(VIEWERLOGIN_URI);
}
-std::string LLViewerLogin::getGridLabel() const { return VIEWERLOGIN_GRIDLABEL; }
+
+void LLGridManager::addSystemGrid(const std::string& label,
+ const std::string& name,
+ const std::string& login,
+ const std::string& helper,
+ const std::string& login_page,
+ const std::string& login_id)
+{
+}
+std::map<std::string, std::string> LLGridManager::getKnownGrids(bool favorite_only)
+{
+ std::map<std::string, std::string> result;
+ return result;
+}
+
+void LLGridManager::setGridChoice(const std::string& grid_name)
+{
+}
+
+bool LLGridManager::isInProductionGrid()
+{
+ return false;
+}
+
+void LLGridManager::saveFavorites()
+{}
+std::string LLGridManager::getSLURLBase(const std::string& grid_name)
+{
+ return "myslurl";
+}
+std::string LLGridManager::getAppSLURLBase(const std::string& grid_name)
+{
+ return "myappslurl";
+}
//-----------------------------------------------------------------------------
#include "../llviewercontrol.h"
@@ -86,10 +152,6 @@ BOOL LLControlGroup::declareString(const std::string& name, const std::string &i
#include "lluicolortable.h"
void LLUIColorTable::saveUserSettings(void)const {}
-//-----------------------------------------------------------------------------
-#include "../llurlsimstring.h"
-LLURLSimString LLURLSimString::sInstance;
-bool LLURLSimString::parse() { return true; }
//-----------------------------------------------------------------------------
#include "llnotifications.h"
@@ -197,15 +259,29 @@ namespace tut
gSavedSettings.declareString("NextLoginLocation", "", "", FALSE);
gSavedSettings.declareBOOL("LoginLastLocation", FALSE, "", FALSE);
- credentials["first"] = "testfirst";
- credentials["last"] = "testlast";
- credentials["passwd"] = "testpass";
+ LLSD authenticator = LLSD::emptyMap();
+ LLSD identifier = LLSD::emptyMap();
+ identifier["type"] = "agent";
+ identifier["first_name"] = "testfirst";
+ identifier["last_name"] = "testlast";
+ authenticator["passwd"] = "testpass";
+ agentCredential = new LLCredential();
+ agentCredential->setCredentialData(identifier, authenticator);
+
+ authenticator = LLSD::emptyMap();
+ identifier = LLSD::emptyMap();
+ identifier["type"] = "account";
+ identifier["username"] = "testuser";
+ authenticator["secret"] = "testsecret";
+ accountCredential = new LLCredential();
+ accountCredential->setCredentialData(identifier, authenticator);
logininstance->setNotificationsInterface(&notifications);
}
LLLoginInstance* logininstance;
- LLSD credentials;
+ LLPointer<LLCredential> agentCredential;
+ LLPointer<LLCredential> accountCredential;
MockNotifications notifications;
};
@@ -219,7 +295,7 @@ namespace tut
set_test_name("Test Simple Success And Disconnect");
// Test default connect.
- logininstance->connect(credentials);
+ logininstance->connect(agentCredential);
ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI);
@@ -260,7 +336,7 @@ namespace tut
const std::string test_uri = "testing-uri";
// Test default connect.
- logininstance->connect(test_uri, credentials);
+ logininstance->connect(test_uri, agentCredential);
// connect should call LLLogin::connect to init gLoginURI and gLoginCreds.
ensure_equals("Default connect uri", gLoginURI, "testing-uri");
@@ -282,7 +358,7 @@ namespace tut
ensure("No TOS, failed auth", logininstance->authFailure());
// Start again.
- logininstance->connect(test_uri, credentials);
+ logininstance->connect(test_uri, agentCredential);
gTestPump.post(response); // Fail for tos again.
gTOSReplyPump->post(true); // Accept tos, should reconnect w/ agree_to_tos.
ensure_equals("Accepted agree to tos", gLoginCreds["params"]["agree_to_tos"].asBoolean(), true);
@@ -294,11 +370,11 @@ namespace tut
gTestPump.post(response);
ensure("TOS auth failure", logininstance->authFailure());
- logininstance->connect(test_uri, credentials);
+ logininstance->connect(test_uri, agentCredential);
ensure_equals("Reset to default for agree to tos", gLoginCreds["params"]["agree_to_tos"].asBoolean(), false);
// Critical Message failure response.
- logininstance->connect(test_uri, credentials);
+ logininstance->connect(test_uri, agentCredential);
response["data"]["reason"] = "critical"; // Change response to "critical message"
gTestPump.post(response);
@@ -312,7 +388,7 @@ namespace tut
response["data"]["reason"] = "key"; // bad creds.
gTestPump.post(response);
ensure("TOS auth failure", logininstance->authFailure());
- logininstance->connect(test_uri, credentials);
+ logininstance->connect(test_uri, agentCredential);
ensure_equals("Default for agree to tos", gLoginCreds["params"]["read_critical"].asBoolean(), false);
}
@@ -323,7 +399,7 @@ namespace tut
// Part 1 - Mandatory Update, with User accepts response.
// Test connect with update needed.
- logininstance->connect(credentials);
+ logininstance->connect(agentCredential);
ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI);
@@ -349,7 +425,7 @@ namespace tut
set_test_name("Test Mandatory Update User Decline");
// Test connect with update needed.
- logininstance->connect(credentials);
+ logininstance->connect(agentCredential);
ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI);
@@ -375,7 +451,7 @@ namespace tut
// Part 3 - Mandatory Update, with bogus response.
// Test connect with update needed.
- logininstance->connect(credentials);
+ logininstance->connect(agentCredential);
ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI);
@@ -401,7 +477,7 @@ namespace tut
// Part 3 - Mandatory Update, with bogus response.
// Test connect with update needed.
- logininstance->connect(credentials);
+ logininstance->connect(agentCredential);
ensure_equals("Default connect uri", gLoginURI, VIEWERLOGIN_URI);
diff --git a/indra/newview/tests/llsecapi_test.cpp b/indra/newview/tests/llsecapi_test.cpp
new file mode 100644
index 0000000000..caa1461987
--- /dev/null
+++ b/indra/newview/tests/llsecapi_test.cpp
@@ -0,0 +1,188 @@
+/**
+ * @file llsecapi_test.cpp
+ * @author Roxie
+ * @date 2009-02-10
+ * @brief Test the sec api functionality
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden LregisterSecAPIab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+#include "../llviewerprecompiledheaders.h"
+#include "../llviewernetwork.h"
+#include "../test/lltut.h"
+#include "../llsecapi.h"
+#include "../../llxml/llcontrol.h"
+
+
+//----------------------------------------------------------------------------
+// Mock objects for the dependencies of the code we're testing
+
+LLControlGroup::LLControlGroup(const std::string& name)
+: LLInstanceTracker<LLControlGroup, std::string>(name) {}
+LLControlGroup::~LLControlGroup() {}
+BOOL LLControlGroup::declareString(const std::string& name,
+ const std::string& initial_val,
+ const std::string& comment,
+ BOOL persist) {return TRUE;}
+void LLControlGroup::setString(const std::string& name, const std::string& val){}
+std::string LLControlGroup::getString(const std::string& name)
+{
+ return "";
+}
+
+
+LLControlGroup gSavedSettings("test");
+class LLSecAPIBasicHandler : public LLSecAPIHandler
+{
+protected:
+ LLPointer<LLCertificateChain> mCertChain;
+ LLPointer<LLCertificate> mCert;
+ LLPointer<LLCertificateStore> mCertStore;
+ LLSD mLLSD;
+
+public:
+ LLSecAPIBasicHandler() {}
+
+ virtual ~LLSecAPIBasicHandler() {}
+
+ // instantiate a certificate from a pem string
+ virtual LLPointer<LLCertificate> getCertificate(const std::string& pem_cert)
+ {
+ return mCert;
+ }
+
+
+ // instiate a certificate from an openssl X509 structure
+ virtual LLPointer<LLCertificate> getCertificate(X509* openssl_cert)
+ {
+ return mCert;
+ }
+
+
+ // instantiate a chain from an X509_STORE_CTX
+ virtual LLPointer<LLCertificateChain> getCertificateChain(const X509_STORE_CTX* chain)
+ {
+ return mCertChain;
+ }
+
+ // instantiate a cert store given it's id. if a persisted version
+ // exists, it'll be loaded. If not, one will be created (but not
+ // persisted)
+ virtual LLPointer<LLCertificateStore> getCertificateStore(const std::string& store_id)
+ {
+ return mCertStore;
+ }
+
+ // persist data in a protected store
+ virtual void setProtectedData(const std::string& data_type,
+ const std::string& data_id,
+ const LLSD& data) {}
+
+ // retrieve protected data
+ virtual LLSD getProtectedData(const std::string& data_type,
+ const std::string& data_id)
+ {
+ return mLLSD;
+ }
+
+ virtual void deleteProtectedData(const std::string& data_type,
+ const std::string& data_id)
+ {
+ }
+
+ virtual LLPointer<LLCredential> createCredential(const std::string& grid,
+ const LLSD& identifier,
+ const LLSD& authenticator)
+ {
+ LLPointer<LLCredential> cred = NULL;
+ return cred;
+ }
+
+ virtual LLPointer<LLCredential> loadCredential(const std::string& grid)
+ {
+ LLPointer<LLCredential> cred = NULL;
+ return cred;
+ }
+
+ virtual void saveCredential(LLPointer<LLCredential> cred, bool save_authenticator) {}
+
+ virtual void deleteCredential(LLPointer<LLCredential> cred) {}
+};
+
+// -------------------------------------------------------------------------------------------
+// TUT
+// -------------------------------------------------------------------------------------------
+namespace tut
+{
+ // Test wrapper declaration : wrapping nothing for the moment
+ struct secapiTest
+ {
+
+ secapiTest()
+ {
+ }
+ ~secapiTest()
+ {
+ }
+ };
+
+ // Tut templating thingamagic: test group, object and test instance
+ typedef test_group<secapiTest> secapiTestFactory;
+ typedef secapiTestFactory::object secapiTestObject;
+ tut::secapiTestFactory tut_test("llsecapi");
+
+ // ---------------------------------------------------------------------------------------
+ // Test functions
+ // ---------------------------------------------------------------------------------------
+ // registration
+ template<> template<>
+ void secapiTestObject::test<1>()
+ {
+ // retrieve an unknown handler
+
+ ensure("'Unknown' handler should be NULL", !(BOOL)getSecHandler("unknown"));
+ LLPointer<LLSecAPIHandler> test1_handler = new LLSecAPIBasicHandler();
+ registerSecHandler("sectest1", test1_handler);
+ ensure("'Unknown' handler should be NULL", !(BOOL)getSecHandler("unknown"));
+ LLPointer<LLSecAPIHandler> retrieved_test1_handler = getSecHandler("sectest1");
+ ensure("Retrieved sectest1 handler should be the same",
+ retrieved_test1_handler == test1_handler);
+
+ // insert a second handler
+ LLPointer<LLSecAPIHandler> test2_handler = new LLSecAPIBasicHandler();
+ registerSecHandler("sectest2", test2_handler);
+ ensure("'Unknown' handler should be NULL", !(BOOL)getSecHandler("unknown"));
+ retrieved_test1_handler = getSecHandler("sectest1");
+ ensure("Retrieved sectest1 handler should be the same",
+ retrieved_test1_handler == test1_handler);
+
+ LLPointer<LLSecAPIHandler> retrieved_test2_handler = getSecHandler("sectest2");
+ ensure("Retrieved sectest1 handler should be the same",
+ retrieved_test2_handler == test2_handler);
+
+ }
+}
diff --git a/indra/newview/tests/llsechandler_basic_test.cpp b/indra/newview/tests/llsechandler_basic_test.cpp
new file mode 100644
index 0000000000..fa9fff3ac9
--- /dev/null
+++ b/indra/newview/tests/llsechandler_basic_test.cpp
@@ -0,0 +1,1071 @@
+/**
+ * @file llsechandler_basic_test.cpp
+ * @author Roxie
+ * @date 2009-02-10
+ * @brief Test the 'basic' sec handler functions
+ *
+ * $LicenseInfo:firstyear=2005&license=viewergpl$
+ *
+ * Copyright (c) 2005-2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+#include "../llviewerprecompiledheaders.h"
+#include "../test/lltut.h"
+#include "../llsecapi.h"
+#include "../llsechandler_basic.h"
+#include "../../llxml/llcontrol.h"
+#include "../llviewernetwork.h"
+#include "lluuid.h"
+#include "llxorcipher.h"
+#include "apr_base64.h"
+#include <vector>
+#include <ios>
+#include <llsdserialize.h>
+#include <openssl/pem.h>
+#include <openssl/err.h>
+#include <openssl/evp.h>
+#include "llxorcipher.h"
+#include <openssl/ossl_typ.h>
+#include <openssl/x509.h>
+#include <openssl/x509v3.h>
+#include <openssl/pem.h>
+#include <openssl/asn1.h>
+#include <openssl/rand.h>
+#include <openssl/err.h>
+#include "../llmachineid.h"
+
+#define ensure_throws(str, exc_type, cert, func, ...) \
+try \
+{ \
+func(__VA_ARGS__); \
+fail("throws, " str); \
+} \
+catch(exc_type& except) \
+{ \
+ensure("Exception cert is incorrect for " str, except.getCert() == cert); \
+}
+
+extern bool _cert_hostname_wildcard_match(const std::string& hostname, const std::string& wildcard_string);
+
+//----------------------------------------------------------------------------
+// Mock objects for the dependencies of the code we're testing
+
+std::string gFirstName;
+std::string gLastName;
+LLControlGroup::LLControlGroup(const std::string& name)
+: LLInstanceTracker<LLControlGroup, std::string>(name) {}
+LLControlGroup::~LLControlGroup() {}
+BOOL LLControlGroup::declareString(const std::string& name,
+ const std::string& initial_val,
+ const std::string& comment,
+ BOOL persist) {return TRUE;}
+void LLControlGroup::setString(const std::string& name, const std::string& val){}
+std::string LLControlGroup::getString(const std::string& name)
+{
+
+ if (name == "FirstName")
+ return gFirstName;
+ else if (name == "LastName")
+ return gLastName;
+ return "";
+}
+
+LLSD LLCredential::getLoginParams()
+{
+ LLSD result = LLSD::emptyMap();
+
+ // legacy credential
+ result["passwd"] = "$1$testpasssd";
+ result["first"] = "myfirst";
+ result["last"] ="mylast";
+ return result;
+}
+
+void LLCredential::identifierType(std::string &idType)
+{
+}
+
+void LLCredential::authenticatorType(std::string &idType)
+{
+}
+
+
+LLControlGroup gSavedSettings("test");
+unsigned char gMACAddress[MAC_ADDRESS_BYTES] = {77,21,46,31,89,2};
+
+
+S32 LLMachineID::getUniqueID(unsigned char *unique_id, size_t len)
+{
+ memcpy(unique_id, gMACAddress, len);
+ return 1;
+}
+S32 LLMachineID::init() { return 1; }
+
+
+// -------------------------------------------------------------------------------------------
+// TUT
+// -------------------------------------------------------------------------------------------
+namespace tut
+{
+ // Test wrapper declaration : wrapping nothing for the moment
+ struct sechandler_basic_test
+ {
+ std::string mPemTestCert, mPemRootCert, mPemIntermediateCert, mPemChildCert, mSha1RSATestCert, mSha1RSATestCA;
+ std::string mDerFormat;
+ X509 *mX509TestCert, *mX509RootCert, *mX509IntermediateCert, *mX509ChildCert;
+
+ sechandler_basic_test()
+ {
+ LLMachineID::init();
+ OpenSSL_add_all_algorithms();
+ OpenSSL_add_all_ciphers();
+ OpenSSL_add_all_digests();
+ ERR_load_crypto_strings();
+ gFirstName = "";
+ gLastName = "";
+ LLFile::remove("test_password.dat");
+ LLFile::remove("sechandler_settings.tmp");
+ mPemTestCert = "-----BEGIN CERTIFICATE-----\n"
+ "MIIEuDCCA6CgAwIBAgIBBDANBgkqhkiG9w0BAQUFADCBtDELMAkGA1UEBhMCQlIx\n"
+ "EzARBgNVBAoTCklDUC1CcmFzaWwxPTA7BgNVBAsTNEluc3RpdHV0byBOYWNpb25h\n"
+ "bCBkZSBUZWNub2xvZ2lhIGRhIEluZm9ybWFjYW8gLSBJVEkxETAPBgNVBAcTCEJy\n"
+ "YXNpbGlhMQswCQYDVQQIEwJERjExMC8GA1UEAxMoQXV0b3JpZGFkZSBDZXJ0aWZp\n"
+ "Y2Fkb3JhIFJhaXogQnJhc2lsZWlyYTAeFw0wMTExMzAxMjU4MDBaFw0xMTExMzAy\n"
+ "MzU5MDBaMIG0MQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE9MDsG\n"
+ "A1UECxM0SW5zdGl0dXRvIE5hY2lvbmFsIGRlIFRlY25vbG9naWEgZGEgSW5mb3Jt\n"
+ "YWNhbyAtIElUSTERMA8GA1UEBxMIQnJhc2lsaWExCzAJBgNVBAgTAkRGMTEwLwYD\n"
+ "VQQDEyhBdXRvcmlkYWRlIENlcnRpZmljYWRvcmEgUmFpeiBCcmFzaWxlaXJhMIIB\n"
+ "IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwPMudwX/hvm+Uh2b/lQAcHVA\n"
+ "isamaLkWdkwP9/S/tOKIgRrL6Oy+ZIGlOUdd6uYtk9Ma/3pUpgcfNAj0vYm5gsyj\n"
+ "Qo9emsc+x6m4VWwk9iqMZSCK5EQkAq/Ut4n7KuLE1+gdftwdIgxfUsPt4CyNrY50\n"
+ "QV57KM2UT8x5rrmzEjr7TICGpSUAl2gVqe6xaii+bmYR1QrmWaBSAG59LrkrjrYt\n"
+ "bRhFboUDe1DK+6T8s5L6k8c8okpbHpa9veMztDVC9sPJ60MWXh6anVKo1UcLcbUR\n"
+ "yEeNvZneVRKAAU6ouwdjDvwlsaKydFKwed0ToQ47bmUKgcm+wV3eTRk36UOnTwID\n"
+ "AQABo4HSMIHPME4GA1UdIARHMEUwQwYFYEwBAQAwOjA4BggrBgEFBQcCARYsaHR0\n"
+ "cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0RQQ2FjcmFpei5wZGYwPQYDVR0f\n"
+ "BDYwNDAyoDCgLoYsaHR0cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0xDUmFj\n"
+ "cmFpei5jcmwwHQYDVR0OBBYEFIr68VeEERM1kEL6V0lUaQ2kxPA3MA8GA1UdEwEB\n"
+ "/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAZA5c1\n"
+ "U/hgIh6OcgLAfiJgFWpvmDZWqlV30/bHFpj8iBobJSm5uDpt7TirYh1Uxe3fQaGl\n"
+ "YjJe+9zd+izPRbBqXPVQA34EXcwk4qpWuf1hHriWfdrx8AcqSqr6CuQFwSr75Fos\n"
+ "SzlwDADa70mT7wZjAmQhnZx2xJ6wfWlT9VQfS//JYeIc7Fue2JNLd00UOSMMaiK/\n"
+ "t79enKNHEA2fupH3vEigf5Eh4bVAN5VohrTm6MY53x7XQZZr1ME7a55lFEnSeT0u\n"
+ "mlOAjR2mAbvSM5X5oSZNrmetdzyTj2flCM8CC7MLab0kkdngRIlUBGHF1/S5nmPb\n"
+ "K+9A46sd33oqK8n8\n"
+ "-----END CERTIFICATE-----\n";
+
+ mPemRootCert = "-----BEGIN CERTIFICATE-----\n"
+ "MIIB0TCCATqgAwIBAgIJANaTqrzEvHaRMA0GCSqGSIb3DQEBBAUAMBsxGTAXBgNV\n"
+ "BAMTEFJveGllcyB0ZXN0IHJvb3QwHhcNMDkwNDE1MjEwNzQ3WhcNMTAwNDE1MjEw\n"
+ "NzQ3WjAbMRkwFwYDVQQDExBSb3hpZXMgdGVzdCByb290MIGfMA0GCSqGSIb3DQEB\n"
+ "AQUAA4GNADCBiQKBgQCpo5nDW6RNz9IHUVZd7Tw2XAQiBniDF4xH0N1w7sUYTiFq\n"
+ "21mABsnOPJD3ra+MtOsXPHcaljm661JjTD8L40v5sfEbqDUPcOw76ClrPqnuAeyT\n"
+ "38qk8DHku/mT8YdprevGZdVcUXQg3vosVzOL93HOOHK+u61mEEoM9W5xoNVEdQID\n"
+ "AQABox0wGzAMBgNVHRMEBTADAQH/MAsGA1UdDwQEAwIBBjANBgkqhkiG9w0BAQQF\n"
+ "AAOBgQAzn0aW/+zWPmcTbvxonyiYYUr9b4SOB/quhAkT8KT4ir1dcZAXRR59+kEn\n"
+ "HSTu1FAodV0gvESqyobftF5hZ1XMxdJqGu//xP+YCwlv244G/0pp7KLI8ihNO2+N\n"
+ "lPBUJgbo++ZkhiE1jotZi9Ay0Oedh3s/AfbMZPyfpJ23ll6+BA==\n"
+ "-----END CERTIFICATE-----\n";
+
+
+
+ mPemIntermediateCert = "-----BEGIN CERTIFICATE-----\n"
+ "MIIBzzCCATigAwIBAgIBATANBgkqhkiG9w0BAQQFADAbMRkwFwYDVQQDExBSb3hp\n"
+ "ZXMgdGVzdCByb290MB4XDTA5MDQxNTIxMzE1NloXDTEwMDQxNTIxMzE1NlowITEf\n"
+ "MB0GA1UEAxMWUm94aWVzIGludGVybWVkaWF0ZSBDQTCBnzANBgkqhkiG9w0BAQEF\n"
+ "AAOBjQAwgYkCgYEA15MM0W1R37rx/24Q2Qkb5bSiQZxTUcQAhJ2pA8mwUucXuCVt\n"
+ "6ayI2TuN32nkjmsCgUkiT/bdXWp0OJo7/MXRIFeUNMCRxrpeFnxuigYEqbIXAdN6\n"
+ "qu/vdG2X4PRv/v9Ijrju4cBEiKIldIgOurWEIfXEsVSFP2XmFQHesF04qDcCAwEA\n"
+ "AaMdMBswDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAQYwDQYJKoZIhvcNAQEEBQAD\n"
+ "gYEAYljikYgak3W1jSo0vYthNHUy3lBVAKzDhpM96lY5OuXFslpCRX42zNL8X3kN\n"
+ "U/4IaJUVtZqx8WsUXl1eXHzBCaXCftapV4Ir6cENLIsXCdXs8paFYzN5nPJA5GYU\n"
+ "zWgkSEl1MEhNIc+bJW34vwi29EjrAShAhsIZ84Mt/lvD3Pc=\n"
+ "-----END CERTIFICATE-----\n";
+
+ mPemChildCert = "-----BEGIN CERTIFICATE-----\n"
+ "MIIB5DCCAU0CBEnm9eUwDQYJKoZIhvcNAQEEBQAwITEfMB0GA1UEAxMWUm94aWVz\n"
+ "IGludGVybWVkaWF0ZSBDQTAeFw0wOTA0MTYwMDAzNDlaFw0xMDA0MTYwMDAzNDla\n"
+ "MCAxHjAcBgNVBAMTFWVuaWFjNjMubGluZGVubGFiLmNvbTCBnzANBgkqhkiG9w0B\n"
+ "AQEFAAOBjQAwgYkCgYEAp9I5rofEzbjNht+9QejfnsIlEPqSxskoWKCG255TesWR\n"
+ "RTmw9wafHQQkJk/VIsaU4RMBYHkknGbHX2dGvMHmKZoWUPSQ/8FZz09o0Qx3TNUZ\n"
+ "l7KlGOD2d1c7ZxXDPqlLC6QW8DrE1/8zfwJ5cbYBXc8e7OKdSZeRrnwHyw4Q8r8C\n"
+ "AwEAAaMvMC0wEwYDVR0lBAwwCgYIKwYBBQUHAwEwCQYDVR0TBAIwADALBgNVHQ8E\n"
+ "BAMCBaAwDQYJKoZIhvcNAQEEBQADgYEAIG0M5tqYlXyMiGKPZfXy/R3M3ZZOapDk\n"
+ "W0dsXJYXAc35ftwtn0VYu9CNnZCcli17/d+AKhkK8a/oGPazqudjFF6WLJLTXaY9\n"
+ "NmhkJcOPADXkbyQPUPXzLe4YRrkEQeGhzMb4rKDQ1TKAcXfs0Y068pTpsixNSxja\n"
+ "NhAUUcve5Is=\n"
+ "-----END CERTIFICATE-----\n";
+
+ mDerFormat = "MIIEuDCCA6CgAwIBAgIBBDANBgkqhkiG9w0BAQUFADCBtDELMAkGA1UEBhMCQlIxEzARBgNVBAoT"
+"CklDUC1CcmFzaWwxPTA7BgNVBAsTNEluc3RpdHV0byBOYWNpb25hbCBkZSBUZWNub2xvZ2lhIGRh"
+"IEluZm9ybWFjYW8gLSBJVEkxETAPBgNVBAcTCEJyYXNpbGlhMQswCQYDVQQIEwJERjExMC8GA1UE"
+"AxMoQXV0b3JpZGFkZSBDZXJ0aWZpY2Fkb3JhIFJhaXogQnJhc2lsZWlyYTAeFw0wMTExMzAxMjU4"
+"MDBaFw0xMTExMzAyMzU5MDBaMIG0MQswCQYDVQQGEwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDE9"
+"MDsGA1UECxM0SW5zdGl0dXRvIE5hY2lvbmFsIGRlIFRlY25vbG9naWEgZGEgSW5mb3JtYWNhbyAt"
+"IElUSTERMA8GA1UEBxMIQnJhc2lsaWExCzAJBgNVBAgTAkRGMTEwLwYDVQQDEyhBdXRvcmlkYWRl"
+"IENlcnRpZmljYWRvcmEgUmFpeiBCcmFzaWxlaXJhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB"
+"CgKCAQEAwPMudwX/hvm+Uh2b/lQAcHVAisamaLkWdkwP9/S/tOKIgRrL6Oy+ZIGlOUdd6uYtk9Ma"
+"/3pUpgcfNAj0vYm5gsyjQo9emsc+x6m4VWwk9iqMZSCK5EQkAq/Ut4n7KuLE1+gdftwdIgxfUsPt"
+"4CyNrY50QV57KM2UT8x5rrmzEjr7TICGpSUAl2gVqe6xaii+bmYR1QrmWaBSAG59LrkrjrYtbRhF"
+"boUDe1DK+6T8s5L6k8c8okpbHpa9veMztDVC9sPJ60MWXh6anVKo1UcLcbURyEeNvZneVRKAAU6o"
+"uwdjDvwlsaKydFKwed0ToQ47bmUKgcm+wV3eTRk36UOnTwIDAQABo4HSMIHPME4GA1UdIARHMEUw"
+"QwYFYEwBAQAwOjA4BggrBgEFBQcCARYsaHR0cDovL2FjcmFpei5pY3BicmFzaWwuZ292LmJyL0RQ"
+"Q2FjcmFpei5wZGYwPQYDVR0fBDYwNDAyoDCgLoYsaHR0cDovL2FjcmFpei5pY3BicmFzaWwuZ292"
+"LmJyL0xDUmFjcmFpei5jcmwwHQYDVR0OBBYEFIr68VeEERM1kEL6V0lUaQ2kxPA3MA8GA1UdEwEB"
+"/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAZA5c1U/hgIh6OcgLA"
+"fiJgFWpvmDZWqlV30/bHFpj8iBobJSm5uDpt7TirYh1Uxe3fQaGlYjJe+9zd+izPRbBqXPVQA34E"
+"Xcwk4qpWuf1hHriWfdrx8AcqSqr6CuQFwSr75FosSzlwDADa70mT7wZjAmQhnZx2xJ6wfWlT9VQf"
+"S//JYeIc7Fue2JNLd00UOSMMaiK/t79enKNHEA2fupH3vEigf5Eh4bVAN5VohrTm6MY53x7XQZZr"
+"1ME7a55lFEnSeT0umlOAjR2mAbvSM5X5oSZNrmetdzyTj2flCM8CC7MLab0kkdngRIlUBGHF1/S5"
+"nmPbK+9A46sd33oqK8n8";
+
+ mSha1RSATestCert = "-----BEGIN CERTIFICATE-----\n"
+ "MIIDFDCCAn2gAwIBAgIDDqqYMA0GCSqGSIb3DQEBBQUAME4xCzAJBgNVBAYTAlVT\n"
+ "MRAwDgYDVQQKEwdFcXVpZmF4MS0wKwYDVQQLEyRFcXVpZmF4IFNlY3VyZSBDZXJ0\n"
+ "aWZpY2F0ZSBBdXRob3JpdHkwHhcNMTAwMTA1MDAzNjMwWhcNMTEwMTA3MjAyMTE0\n"
+ "WjCBnjEpMCcGA1UEBRMgQmNmc0RBRkl1U0YwdFpWVm5vOFJKbjVUbW9hNGR2Wkgx\n"
+ "CzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1TYW4g\n"
+ "RnJhbmNpc2NvMR0wGwYDVQQKExRMaW5kZW4gUmVzZWFyY2ggSW5jLjEYMBYGA1UE\n"
+ "AxQPKi5saW5kZW5sYWIuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD2\n"
+ "14Jdko8v6GB33hHbW+lNQyloFQtc2h4ykjf+fYPJ27dw6tQO2if7N3k/5XDkwC1N\n"
+ "krGgE9vt3iecCPgasue6k67Zyfj9HbEP2D+j38eROudrsxLaRFDQx50BvZ5YMNl3\n"
+ "4zQCj8/gCMsuq8cvaP9/rbJTUpgYWFGLsm8yAYOgWwIDAQABo4GuMIGrMA4GA1Ud\n"
+ "DwEB/wQEAwIE8DAdBgNVHQ4EFgQUIBK/JB9AyqquSEbkzt2Zux6v9sYwOgYDVR0f\n"
+ "BDMwMTAvoC2gK4YpaHR0cDovL2NybC5nZW90cnVzdC5jb20vY3Jscy9zZWN1cmVj\n"
+ "YS5jcmwwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gjIBBPM5iQn9QwHQYDVR0lBBYw\n"
+ "FAYIKwYBBQUHAwEGCCsGAQUFBwMCMA0GCSqGSIb3DQEBBQUAA4GBAKKR84+hvLuB\n"
+ "pop9VG7HQPIyEKtZq3Nnk+UlJGfjGY3csLWSFmxU727r5DzdEP1W1PwF3rxuoKcZ\n"
+ "4nJJpKdzoGVujgBMP2U/J0PJvU7D8U3Zqu7nrXAjOHj7iVnvJ3EKJ1bvwXaisgPN\n"
+ "wt21kKfGnA4OlhJtJ6VQvUkcF12I3pTP\n"
+ "-----END CERTIFICATE-----\n";
+
+ mSha1RSATestCA = "-----BEGIN CERTIFICATE-----\n"
+ "MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV\n"
+ "UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy\n"
+ "dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1\n"
+ "MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx\n"
+ "dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B\n"
+ "AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f\n"
+ "BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A\n"
+ "cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC\n"
+ "AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ\n"
+ "MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm\n"
+ "aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw\n"
+ "ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj\n"
+ "IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF\n"
+ "MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA\n"
+ "A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y\n"
+ "7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh\n"
+ "1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4\n"
+ "-----END CERTIFICATE-----\n";
+
+
+
+
+ mX509TestCert = NULL;
+ mX509RootCert = NULL;
+ mX509IntermediateCert = NULL;
+ mX509ChildCert = NULL;
+
+ BIO * validation_bio = BIO_new_mem_buf((void*)mPemTestCert.c_str(), mPemTestCert.length());
+ PEM_read_bio_X509(validation_bio, &mX509TestCert, 0, NULL);
+ BIO_free(validation_bio);
+ validation_bio = BIO_new_mem_buf((void*)mPemRootCert.c_str(), mPemRootCert.length());
+ PEM_read_bio_X509(validation_bio, &mX509RootCert, 0, NULL);
+ BIO_free(validation_bio);
+ validation_bio = BIO_new_mem_buf((void*)mPemIntermediateCert.c_str(), mPemIntermediateCert.length());
+ PEM_read_bio_X509(validation_bio, &mX509IntermediateCert, 0, NULL);
+ BIO_free(validation_bio);
+ validation_bio = BIO_new_mem_buf((void*)mPemChildCert.c_str(), mPemChildCert.length());
+ PEM_read_bio_X509(validation_bio, &mX509ChildCert, 0, NULL);
+ BIO_free(validation_bio);
+ }
+ ~sechandler_basic_test()
+ {
+ LLFile::remove("test_password.dat");
+ LLFile::remove("sechandler_settings.tmp");
+ LLFile::remove("mycertstore.pem");
+ X509_free(mX509TestCert);
+ X509_free(mX509RootCert);
+ X509_free(mX509IntermediateCert);
+ X509_free(mX509ChildCert);
+ }
+ };
+
+ // Tut templating thingamagic: test group, object and test instance
+ typedef test_group<sechandler_basic_test> sechandler_basic_test_factory;
+ typedef sechandler_basic_test_factory::object sechandler_basic_test_object;
+ tut::sechandler_basic_test_factory tut_test("llsechandler_basic");
+
+ // ---------------------------------------------------------------------------------------
+ // Test functions
+ // ---------------------------------------------------------------------------------------
+ // test cert data retrieval
+ template<> template<>
+ void sechandler_basic_test_object::test<1>()
+
+ {
+ char buffer[4096];
+ LLPointer<LLCertificate> test_cert = new LLBasicCertificate(mPemTestCert);
+
+ ensure_equals("Resultant pem is correct",
+ mPemTestCert, test_cert->getPem());
+ std::vector<U8> binary_cert = test_cert->getBinary();
+
+ apr_base64_encode(buffer, (const char *)&binary_cert[0], binary_cert.size());
+
+ ensure_equals("Der Format is correct", memcmp(buffer, mDerFormat.c_str(), mDerFormat.length()), 0);
+
+ LLSD llsd_cert;
+ test_cert->getLLSD(llsd_cert);
+ std::ostringstream llsd_value;
+ llsd_value << LLSDOStreamer<LLSDNotationFormatter>(llsd_cert) << std::endl;
+ std::string llsd_cert_str = llsd_value.str();
+ ensure_equals("Issuer Name/commonName",
+ (std::string)llsd_cert["issuer_name"]["commonName"], "Autoridade Certificadora Raiz Brasileira");
+ ensure_equals("Issure Name/countryName", (std::string)llsd_cert["issuer_name"]["countryName"], "BR");
+ ensure_equals("Issuer Name/localityName", (std::string)llsd_cert["issuer_name"]["localityName"], "Brasilia");
+ ensure_equals("Issuer Name/org name", (std::string)llsd_cert["issuer_name"]["organizationName"], "ICP-Brasil");
+ ensure_equals("IssuerName/org unit",
+ (std::string)llsd_cert["issuer_name"]["organizationalUnitName"], "Instituto Nacional de Tecnologia da Informacao - ITI");
+ ensure_equals("IssuerName/state", (std::string)llsd_cert["issuer_name"]["stateOrProvinceName"], "DF");
+ ensure_equals("Issuer name string",
+ (std::string)llsd_cert["issuer_name_string"], "CN=Autoridade Certificadora Raiz Brasileira,ST=DF,"
+ "L=Brasilia,OU=Instituto Nacional de Tecnologia da Informacao - ITI,O=ICP-Brasil,C=BR");
+ ensure_equals("subject Name/commonName",
+ (std::string)llsd_cert["subject_name"]["commonName"], "Autoridade Certificadora Raiz Brasileira");
+ ensure_equals("subject Name/countryName", (std::string)llsd_cert["subject_name"]["countryName"], "BR");
+ ensure_equals("subject Name/localityName", (std::string)llsd_cert["subject_name"]["localityName"], "Brasilia");
+ ensure_equals("subject Name/org name", (std::string)llsd_cert["subject_name"]["organizationName"], "ICP-Brasil");
+ ensure_equals("subjectName/org unit",
+ (std::string)llsd_cert["subject_name"]["organizationalUnitName"], "Instituto Nacional de Tecnologia da Informacao - ITI");
+ ensure_equals("subjectName/state", (std::string)llsd_cert["subject_name"]["stateOrProvinceName"], "DF");
+ ensure_equals("subject name string",
+ (std::string)llsd_cert["subject_name_string"], "CN=Autoridade Certificadora Raiz Brasileira,ST=DF,"
+ "L=Brasilia,OU=Instituto Nacional de Tecnologia da Informacao - ITI,O=ICP-Brasil,C=BR");
+
+ ensure_equals("md5 digest", (std::string)llsd_cert["md5_digest"], "96:89:7d:61:d1:55:2b:27:e2:5a:39:b4:2a:6c:44:6f");
+ ensure_equals("serial number", (std::string)llsd_cert["serial_number"], "04");
+ // sha1 digest is giving a weird value, and I've no idea why...feh
+ //ensure_equals("sha1 digest", (std::string)llsd_cert["sha1_digest"], "8e:fd:ca:bc:93:e6:1e:92:5d:4d:1d:ed:18:1a:43:20:a4:67:a1:39");
+ ensure_equals("valid from", (std::string)llsd_cert["valid_from"], "2001-11-30T12:58:00Z");
+ ensure_equals("valid to", (std::string)llsd_cert["valid_to"], "2011-11-30T23:59:00Z");
+ LLSD expectedKeyUsage = LLSD::emptyArray();
+ expectedKeyUsage.append(LLSD((std::string)"certSigning"));
+ expectedKeyUsage.append(LLSD((std::string)"crlSigning"));
+ ensure("key usage", valueCompareLLSD(llsd_cert["keyUsage"], expectedKeyUsage));
+ ensure("basic constraints", (bool)llsd_cert["basicConstraints"]["CA"]);
+
+ ensure("x509 is equal", !X509_cmp(mX509TestCert, test_cert->getOpenSSLX509()));
+ }
+
+
+ // test protected data
+ template<> template<>
+ void sechandler_basic_test_object::test<2>()
+
+ {
+
+ std::string protected_data = "sUSh3wj77NG9oAMyt3XIhaej3KLZhLZWFZvI6rIGmwUUOmmelrRg0NI9rkOj8ZDpTPxpwToaBT5u"
+ "GQhakdaGLJznr9bHr4/6HIC1bouKj4n2rs4TL6j2WSjto114QdlNfLsE8cbbE+ghww58g8SeyLQO"
+ "nyzXoz+/PBz0HD5SMFDuObccoPW24gmqYySz8YoEWhSwO0pUtEEqOjVRsAJgF5wLAtJZDeuilGsq"
+ "4ZT9Y4wZ9Rh8nnF3fDUL6IGamHe1ClXM1jgBu10F6UMhZbnH4C3aJ2E9+LiOntU+l3iCb2MpkEpr"
+ "82r2ZAMwIrpnirL/xoYoyz7MJQYwUuMvBPToZJrxNSsjI+S2Z+I3iEJAELMAAA==";
+
+ std::vector<U8> binary_data(apr_base64_decode_len(protected_data.c_str()));
+ apr_base64_decode_binary(&binary_data[0], protected_data.c_str());
+
+ LLXORCipher cipher(gMACAddress, MAC_ADDRESS_BYTES);
+ cipher.decrypt(&binary_data[0], 16);
+ unsigned char unique_id[MAC_ADDRESS_BYTES];
+ LLMachineID::getUniqueID(unique_id, sizeof(unique_id));
+ LLXORCipher cipher2(unique_id, sizeof(unique_id));
+ cipher2.encrypt(&binary_data[0], 16);
+ std::ofstream temp_file("sechandler_settings.tmp", std::ofstream::binary);
+ temp_file.write((const char *)&binary_data[0], binary_data.size());
+ temp_file.close();
+
+ LLPointer<LLSecAPIBasicHandler> handler = new LLSecAPIBasicHandler("sechandler_settings.tmp",
+ "test_password.dat");
+ handler->init();
+ // data retrieval for existing data
+ LLSD data = handler->getProtectedData("test_data_type", "test_data_id");
+
+
+ ensure_equals("retrieve existing data1", (std::string)data["data1"], "test_data_1");
+ ensure_equals("retrieve existing data2", (std::string)data["data2"], "test_data_2");
+ ensure_equals("retrieve existing data3", (std::string)data["data3"]["elem1"], "test element1");
+
+ // data storage
+ LLSD store_data = LLSD::emptyMap();
+ store_data["store_data1"] = "test_store_data1";
+ store_data["store_data2"] = 27;
+ store_data["store_data3"] = LLSD::emptyMap();
+ store_data["store_data3"]["subelem1"] = "test_subelem1";
+
+ handler->setProtectedData("test_data_type", "test_data_id1", store_data);
+ data = handler->getProtectedData("test_data_type", "test_data_id");
+
+ data = handler->getProtectedData("test_data_type", "test_data_id");
+ // verify no overwrite of existing data
+ ensure_equals("verify no overwrite 1", (std::string)data["data1"], "test_data_1");
+ ensure_equals("verify no overwrite 2", (std::string)data["data2"], "test_data_2");
+ ensure_equals("verify no overwrite 3", (std::string)data["data3"]["elem1"], "test element1");
+
+ // verify written data is good
+ data = handler->getProtectedData("test_data_type", "test_data_id1");
+ ensure_equals("verify stored data1", (std::string)data["store_data1"], "test_store_data1");
+ ensure_equals("verify stored data2", (int)data["store_data2"], 27);
+ ensure_equals("verify stored data3", (std::string)data["store_data3"]["subelem1"], "test_subelem1");
+
+ // verify overwrite works
+ handler->setProtectedData("test_data_type", "test_data_id", store_data);
+ data = handler->getProtectedData("test_data_type", "test_data_id");
+ ensure_equals("verify overwrite stored data1", (std::string)data["store_data1"], "test_store_data1");
+ ensure_equals("verify overwrite stored data2", (int)data["store_data2"], 27);
+ ensure_equals("verify overwrite stored data3", (std::string)data["store_data3"]["subelem1"], "test_subelem1");
+
+ // verify other datatype doesn't conflict
+ store_data["store_data3"] = "test_store_data3";
+ store_data["store_data4"] = 28;
+ store_data["store_data5"] = LLSD::emptyMap();
+ store_data["store_data5"]["subelem2"] = "test_subelem2";
+
+ handler->setProtectedData("test_data_type1", "test_data_id", store_data);
+ data = handler->getProtectedData("test_data_type1", "test_data_id");
+ ensure_equals("verify datatype stored data3", (std::string)data["store_data3"], "test_store_data3");
+ ensure_equals("verify datatype stored data4", (int)data["store_data4"], 28);
+ ensure_equals("verify datatype stored data5", (std::string)data["store_data5"]["subelem2"], "test_subelem2");
+
+ // test data not found
+
+ data = handler->getProtectedData("test_data_type1", "test_data_not_found");
+ ensure("not found", data.isUndefined());
+
+ // cause a 'write' by using 'LLPointer' to delete then instantiate a handler
+ handler = NULL;
+ handler = new LLSecAPIBasicHandler("sechandler_settings.tmp", "test_password.dat");
+ handler->init();
+
+ data = handler->getProtectedData("test_data_type1", "test_data_id");
+ ensure_equals("verify datatype stored data3a", (std::string)data["store_data3"], "test_store_data3");
+ ensure_equals("verify datatype stored data4a", (int)data["store_data4"], 28);
+ ensure_equals("verify datatype stored data5a", (std::string)data["store_data5"]["subelem2"], "test_subelem2");
+
+ // rewrite the initial file to verify reloads
+ handler = NULL;
+ std::ofstream temp_file2("sechandler_settings.tmp", std::ofstream::binary);
+ temp_file2.write((const char *)&binary_data[0], binary_data.size());
+ temp_file2.close();
+
+ // cause a 'write'
+ handler = new LLSecAPIBasicHandler("sechandler_settings.tmp", "test_password.dat");
+ handler->init();
+ data = handler->getProtectedData("test_data_type1", "test_data_id");
+ ensure("not found", data.isUndefined());
+
+ handler->deleteProtectedData("test_data_type", "test_data_id");
+ ensure("Deleted data not found", handler->getProtectedData("test_data_type", "test_data_id").isUndefined());
+
+ LLFile::remove("sechandler_settings.tmp");
+ handler = new LLSecAPIBasicHandler("sechandler_settings.tmp", "test_password.dat");
+ handler->init();
+ data = handler->getProtectedData("test_data_type1", "test_data_id");
+ ensure("not found", data.isUndefined());
+ handler = NULL;
+
+ ensure(LLFile::isfile("sechandler_settings.tmp"));
+ }
+
+ // test credenitals
+ template<> template<>
+ void sechandler_basic_test_object::test<3>()
+ {
+ LLPointer<LLSecAPIBasicHandler> handler = new LLSecAPIBasicHandler("sechandler_settings.tmp", "test_password.dat");
+ handler->init();
+
+ LLSD my_id = LLSD::emptyMap();
+ LLSD my_authenticator = LLSD::emptyMap();
+ my_id["type"] = "test_type";
+ my_id["username"] = "testuser@lindenlab.com";
+ my_authenticator["type"] = "test_auth";
+ my_authenticator["creds"] = "12345";
+
+ // test creation of credentials
+ LLPointer<LLCredential> my_cred = handler->createCredential("my_grid", my_id, my_authenticator);
+
+ // test retrieval of credential components
+ ensure_equals("basic credential creation: identifier", my_id, my_cred->getIdentifier());
+ ensure_equals("basic credential creation: authenticator", my_authenticator, my_cred->getAuthenticator());
+ ensure_equals("basic credential creation: grid", "my_grid", my_cred->getGrid());
+
+ // test setting/overwriting of credential components
+ my_id["first_name"] = "firstname";
+ my_id.erase("username");
+ my_authenticator.erase("creds");
+ my_authenticator["hash"] = "6563245";
+
+ my_cred->setCredentialData(my_id, my_authenticator);
+ ensure_equals("set credential data: identifier", my_id, my_cred->getIdentifier());
+ ensure_equals("set credential data: authenticator", my_authenticator, my_cred->getAuthenticator());
+ ensure_equals("set credential data: grid", "my_grid", my_cred->getGrid());
+
+ // test loading of a credential, that hasn't been saved, without
+ // any legacy saved credential data
+ LLPointer<LLCredential> my_new_cred = handler->loadCredential("my_grid2");
+ ensure("unknown credential load test", my_new_cred->getIdentifier().isMap());
+ ensure("unknown credential load test", !my_new_cred->getIdentifier().has("type"));
+ ensure("unknown credential load test", my_new_cred->getAuthenticator().isMap());
+ ensure("unknown credential load test", !my_new_cred->getAuthenticator().has("type"));
+ // test saving of a credential
+ handler->saveCredential(my_cred, true);
+
+ // test loading of a known credential
+ my_new_cred = handler->loadCredential("my_grid");
+ ensure_equals("load a known credential: identifier", my_id, my_new_cred->getIdentifier());
+ ensure_equals("load a known credential: authenticator",my_authenticator, my_new_cred->getAuthenticator());
+ ensure_equals("load a known credential: grid", "my_grid", my_cred->getGrid());
+
+ // test deletion of a credential
+ handler->deleteCredential(my_new_cred);
+
+ ensure("delete credential: identifier", my_new_cred->getIdentifier().isUndefined());
+ ensure("delete credentialt: authenticator", my_new_cred->getIdentifier().isUndefined());
+ ensure_equals("delete credential: grid", "my_grid", my_cred->getGrid());
+ // load unknown cred
+
+ my_new_cred = handler->loadCredential("my_grid");
+ ensure("deleted credential load test", my_new_cred->getIdentifier().isMap());
+ ensure("deleted credential load test", !my_new_cred->getIdentifier().has("type"));
+ ensure("deleted credential load test", my_new_cred->getAuthenticator().isMap());
+ ensure("deleted credential load test", !my_new_cred->getAuthenticator().has("type"));
+
+ // test loading of an unknown credential with legacy saved username, but without
+ // saved password
+ gFirstName = "myfirstname";
+ gLastName = "mylastname";
+ my_new_cred = handler->loadCredential("my_legacy_grid");
+ ensure_equals("legacy credential with no password: type",
+ (const std::string)my_new_cred->getIdentifier()["type"], "agent");
+ ensure_equals("legacy credential with no password: first_name",
+ (const std::string)my_new_cred->getIdentifier()["first_name"], "myfirstname");
+ ensure_equals("legacy credential with no password: last_name",
+ (const std::string)my_new_cred->getIdentifier()["last_name"], "mylastname");
+
+ ensure("legacy credential with no password: no authenticator", my_new_cred->getAuthenticator().isUndefined());
+
+ // test loading of an unknown credential with legacy saved password and username
+
+ std::string hashed_password = "fSQcLG03eyIWJmkzfyYaKm81dSweLmsxeSAYKGE7fSQ=";
+ int length = apr_base64_decode_len(hashed_password.c_str());
+ std::vector<char> decoded_password(length);
+ apr_base64_decode(&decoded_password[0], hashed_password.c_str());
+ LLXORCipher cipher(gMACAddress, MAC_ADDRESS_BYTES);
+ cipher.decrypt((U8*)&decoded_password[0], length);
+ unsigned char unique_id[MAC_ADDRESS_BYTES];
+ LLMachineID::getUniqueID(unique_id, sizeof(unique_id));
+ LLXORCipher cipher2(unique_id, sizeof(unique_id));
+ cipher2.encrypt((U8*)&decoded_password[0], length);
+ llofstream password_file("test_password.dat", std::ofstream::binary);
+ password_file.write(&decoded_password[0], length);
+ password_file.close();
+
+ my_new_cred = handler->loadCredential("my_legacy_grid2");
+ ensure_equals("legacy credential with password: type",
+ (const std::string)my_new_cred->getIdentifier()["type"], "agent");
+ ensure_equals("legacy credential with password: first_name",
+ (const std::string)my_new_cred->getIdentifier()["first_name"], "myfirstname");
+ ensure_equals("legacy credential with password: last_name",
+ (const std::string)my_new_cred->getIdentifier()["last_name"], "mylastname");
+
+ LLSD legacy_authenticator = my_new_cred->getAuthenticator();
+ ensure_equals("legacy credential with password: type",
+ (std::string)legacy_authenticator["type"],
+ "hash");
+ ensure_equals("legacy credential with password: algorithm",
+ (std::string)legacy_authenticator["algorithm"],
+ "md5");
+ ensure_equals("legacy credential with password: algorithm",
+ (std::string)legacy_authenticator["secret"],
+ "01234567890123456789012345678901");
+
+ // test creation of credentials
+ my_cred = handler->createCredential("mysavedgrid", my_id, my_authenticator);
+ // test save without saving authenticator.
+ handler->saveCredential(my_cred, FALSE);
+ my_new_cred = handler->loadCredential("mysavedgrid");
+ ensure_equals("saved credential without auth",
+ (const std::string)my_new_cred->getIdentifier()["type"], "test_type");
+ ensure("no authenticator values were saved", my_new_cred->getAuthenticator().isUndefined());
+ }
+
+ // test cert vector
+ template<> template<>
+ void sechandler_basic_test_object::test<4>()
+ {
+
+ // validate create from empty vector
+ LLPointer<LLBasicCertificateVector> test_vector = new LLBasicCertificateVector();
+ ensure_equals("when loading with nothing, we should result in no certs in vector", test_vector->size(), 0);
+
+ test_vector->add(new LLBasicCertificate(mPemTestCert));
+ ensure_equals("one element in vector", test_vector->size(), 1);
+ test_vector->add(new LLBasicCertificate(mPemChildCert));
+ ensure_equals("two elements in vector after add", test_vector->size(), 2);
+
+ test_vector->add(new LLBasicCertificate(mPemChildCert));
+ ensure_equals("two elements in vector after re-add", test_vector->size(), 2);
+ // validate order
+ X509* test_cert = (*test_vector)[0]->getOpenSSLX509();
+ ensure("first cert added remains first cert", !X509_cmp(test_cert, mX509TestCert));
+ X509_free(test_cert);
+
+ test_cert = (*test_vector)[1]->getOpenSSLX509();
+ ensure("adding a duplicate cert", !X509_cmp(test_cert, mX509ChildCert));
+ X509_free(test_cert);
+
+ //
+ // validate iterator
+ //
+ LLBasicCertificateVector::iterator current_cert = test_vector->begin();
+ LLBasicCertificateVector::iterator copy_current_cert = current_cert;
+ // operator++(int)
+ ensure("validate iterator++ element in vector is expected cert", *current_cert++ == (*test_vector)[0]);
+ ensure("validate 2nd iterator++ element in vector is expected cert", *current_cert++ == (*test_vector)[1]);
+ ensure("validate end iterator++", current_cert == test_vector->end());
+
+ // copy
+ ensure("validate copy iterator element in vector is expected cert", *copy_current_cert == (*test_vector)[0]);
+
+ // operator--(int)
+ current_cert--;
+ ensure("validate iterator-- element in vector is expected cert", *current_cert-- == (*test_vector)[1]);
+ ensure("validate iterator-- element in vector is expected cert", *current_cert == (*test_vector)[0]);
+
+ ensure("begin iterator is equal", current_cert == test_vector->begin());
+
+ // operator++
+ ensure("validate ++iterator element in vector is expected cert", *++current_cert == (*test_vector)[1]);
+ ensure("end of cert vector after ++iterator", ++current_cert == test_vector->end());
+ // operator--
+ ensure("validate --iterator element in vector is expected cert", *--current_cert == (*test_vector)[1]);
+ ensure("validate 2nd --iterator element in vector is expected cert", *--current_cert == (*test_vector)[0]);
+
+ // validate remove
+ // validate create from empty vector
+ test_vector = new LLBasicCertificateVector();
+ test_vector->add(new LLBasicCertificate(mPemTestCert));
+ test_vector->add(new LLBasicCertificate(mPemChildCert));
+ test_vector->erase(test_vector->begin());
+ ensure_equals("one element in store after remove", test_vector->size(), 1);
+ test_cert = (*test_vector)[0]->getOpenSSLX509();
+ ensure("validate cert was removed", !X509_cmp(test_cert, mX509ChildCert));
+ X509_free(test_cert);
+
+ // validate insert
+ test_vector->insert(test_vector->begin(), new LLBasicCertificate(mPemChildCert));
+ test_cert = (*test_vector)[0]->getOpenSSLX509();
+
+ ensure("validate cert was inserted", !X509_cmp(test_cert, mX509ChildCert));
+ X509_free(test_cert);
+
+ //validate find
+ LLSD find_info = LLSD::emptyMap();
+ test_vector->insert(test_vector->begin(), new LLBasicCertificate(mPemRootCert));
+ find_info["issuer_name"] = LLSD::emptyMap();
+ find_info["issuer_name"]["commonName"] = "Roxies intermediate CA";
+ find_info["md5_digest"] = "97:24:c7:4c:d4:ba:2d:0e:9c:a1:18:8e:3a:c6:1f:c3";
+ current_cert = test_vector->find(find_info);
+ ensure("found", current_cert != test_vector->end());
+ ensure("found cert", (*current_cert).get() == (*test_vector)[1].get());
+ find_info["sha1_digest"] = "bad value";
+ current_cert =test_vector->find(find_info);
+ ensure("didn't find cert", current_cert == test_vector->end());
+ }
+
+ // test cert store
+ template<> template<>
+ void sechandler_basic_test_object::test<5>()
+ {
+ // validate load with nothing
+ LLFile::remove("mycertstore.pem");
+ LLPointer<LLBasicCertificateStore> test_store = new LLBasicCertificateStore("mycertstore.pem");
+ ensure_equals("when loading with nothing, we should result in no certs in store", test_store->size(), 0);
+
+ // validate load with empty file
+ test_store->save();
+ test_store = NULL;
+ test_store = new LLBasicCertificateStore("mycertstore.pem");
+ ensure_equals("when loading with nothing, we should result in no certs in store", test_store->size(), 0);
+ test_store=NULL;
+
+ // instantiate a cert store from a file
+ llofstream certstorefile("mycertstore.pem", std::ios::out);
+ certstorefile << mPemChildCert << std::endl << mPemTestCert << std::endl;
+ certstorefile.close();
+ // validate loaded certs
+ test_store = new LLBasicCertificateStore("mycertstore.pem");
+ ensure_equals("two elements in store", test_store->size(), 2);
+
+ // operator[]
+ X509* test_cert = (*test_store)[0]->getOpenSSLX509();
+
+ ensure("validate first element in store is expected cert", !X509_cmp(test_cert, mX509ChildCert));
+ X509_free(test_cert);
+ test_cert = (*test_store)[1]->getOpenSSLX509();
+ ensure("validate second element in store is expected cert", !X509_cmp(test_cert, mX509TestCert));
+ X509_free(test_cert);
+
+
+ // validate save
+ LLFile::remove("mycertstore.pem");
+ test_store->save();
+ test_store = NULL;
+ test_store = new LLBasicCertificateStore("mycertstore.pem");
+ ensure_equals("two elements in store after save", test_store->size(), 2);
+ LLCertificateStore::iterator current_cert = test_store->begin();
+ test_cert = (*current_cert)->getOpenSSLX509();
+ ensure("validate first element in store is expected cert", !X509_cmp(test_cert, mX509ChildCert));
+ current_cert++;
+ X509_free(test_cert);
+ test_cert = (*current_cert)->getOpenSSLX509();
+ ensure("validate second element in store is expected cert", !X509_cmp(test_cert, mX509TestCert));
+ X509_free(test_cert);
+ current_cert++;
+ ensure("end of cert store", current_cert == test_store->end());
+
+ }
+
+ // cert name wildcard matching
+ template<> template<>
+ void sechandler_basic_test_object::test<6>()
+ {
+ ensure("simple name match",
+ _cert_hostname_wildcard_match("foo", "foo"));
+
+ ensure("simple name match, with end period",
+ _cert_hostname_wildcard_match("foo.", "foo."));
+
+ ensure("simple name match, with begin period",
+ _cert_hostname_wildcard_match(".foo", ".foo"));
+
+ ensure("simple name match, with mismatched period cn",
+ _cert_hostname_wildcard_match("foo.", "foo"));
+
+ ensure("simple name match, with mismatched period hostname",
+ _cert_hostname_wildcard_match("foo", "foo."));
+
+ ensure("simple name match, with subdomain",
+ _cert_hostname_wildcard_match("foo.bar", "foo.bar"));
+
+ ensure("stutter name match",
+ _cert_hostname_wildcard_match("foobbbbfoo", "foo*bbbfoo"));
+
+ ensure("simple name match, with beginning wildcard",
+ _cert_hostname_wildcard_match("foobar", "*bar"));
+
+ ensure("simple name match, with ending wildcard",
+ _cert_hostname_wildcard_match("foobar", "foo*"));
+
+ ensure("simple name match, with beginning null wildcard",
+ _cert_hostname_wildcard_match("foobar", "*foobar"));
+
+ ensure("simple name match, with ending null wildcard",
+ _cert_hostname_wildcard_match("foobar", "foobar*"));
+
+ ensure("simple name match, with embedded wildcard",
+ _cert_hostname_wildcard_match("foobar", "f*r"));
+
+ ensure("simple name match, with embedded null wildcard",
+ _cert_hostname_wildcard_match("foobar", "foo*bar"));
+
+ ensure("simple name match, with dual embedded wildcard",
+ _cert_hostname_wildcard_match("foobar", "f*o*ar"));
+
+ ensure("simple name mismatch",
+ !_cert_hostname_wildcard_match("bar", "foo"));
+
+ ensure("simple name mismatch, with end period",
+ !_cert_hostname_wildcard_match("foobar.", "foo."));
+
+ ensure("simple name mismatch, with begin period",
+ !_cert_hostname_wildcard_match(".foobar", ".foo"));
+
+ ensure("simple name mismatch, with subdomain",
+ !_cert_hostname_wildcard_match("foobar.bar", "foo.bar"));
+
+ ensure("simple name mismatch, with beginning wildcard",
+ !_cert_hostname_wildcard_match("foobara", "*bar"));
+
+ ensure("simple name mismatch, with ending wildcard",
+ !_cert_hostname_wildcard_match("oobar", "foo*"));
+
+ ensure("simple name mismatch, with embedded wildcard",
+ !_cert_hostname_wildcard_match("oobar", "f*r"));
+
+ ensure("simple name mismatch, with dual embedded wildcard",
+ !_cert_hostname_wildcard_match("foobar", "f*d*ar"));
+
+ ensure("simple wildcard",
+ _cert_hostname_wildcard_match("foobar", "*"));
+
+ ensure("long domain",
+ _cert_hostname_wildcard_match("foo.bar.com", "foo.bar.com"));
+
+ ensure("long domain with multiple wildcards",
+ _cert_hostname_wildcard_match("foo.bar.com", "*.b*r.com"));
+
+ ensure("end periods",
+ _cert_hostname_wildcard_match("foo.bar.com.", "*.b*r.com."));
+
+ ensure("match end period",
+ _cert_hostname_wildcard_match("foo.bar.com.", "*.b*r.com"));
+
+ ensure("match end period2",
+ _cert_hostname_wildcard_match("foo.bar.com", "*.b*r.com."));
+
+ ensure("wildcard mismatch",
+ !_cert_hostname_wildcard_match("bar.com", "*.bar.com"));
+
+ ensure("wildcard match",
+ _cert_hostname_wildcard_match("foo.bar.com", "*.bar.com"));
+
+ ensure("wildcard match",
+ _cert_hostname_wildcard_match("foo.foo.bar.com", "*.bar.com"));
+
+ ensure("wildcard match",
+ _cert_hostname_wildcard_match("foo.foo.bar.com", "*.*.com"));
+
+ ensure("wildcard mismatch",
+ !_cert_hostname_wildcard_match("foo.foo.bar.com", "*.foo.com"));
+ }
+
+ // test cert chain
+ template<> template<>
+ void sechandler_basic_test_object::test<7>()
+ {
+ // validate create from empty chain
+ LLPointer<LLBasicCertificateChain> test_chain = new LLBasicCertificateChain(NULL);
+ ensure_equals("when loading with nothing, we should result in no certs in chain", test_chain->size(), 0);
+
+ // Single cert in the chain.
+ X509_STORE_CTX *test_store = X509_STORE_CTX_new();
+ test_store->cert = mX509ChildCert;
+ test_store->untrusted = NULL;
+ test_chain = new LLBasicCertificateChain(test_store);
+ X509_STORE_CTX_free(test_store);
+ ensure_equals("two elements in store", test_chain->size(), 1);
+ X509* test_cert = (*test_chain)[0]->getOpenSSLX509();
+ ensure("validate first element in store is expected cert", !X509_cmp(test_cert, mX509ChildCert));
+ X509_free(test_cert);
+
+ // cert + CA
+
+ test_store = X509_STORE_CTX_new();
+ test_store->cert = mX509ChildCert;
+ test_store->untrusted = sk_X509_new_null();
+ sk_X509_push(test_store->untrusted, mX509IntermediateCert);
+ test_chain = new LLBasicCertificateChain(test_store);
+ X509_STORE_CTX_free(test_store);
+ ensure_equals("two elements in store", test_chain->size(), 2);
+ test_cert = (*test_chain)[0]->getOpenSSLX509();
+ ensure("validate first element in store is expected cert", !X509_cmp(test_cert, mX509ChildCert));
+ X509_free(test_cert);
+ test_cert = (*test_chain)[1]->getOpenSSLX509();
+ ensure("validate second element in store is expected cert", !X509_cmp(test_cert, mX509IntermediateCert));
+ X509_free(test_cert);
+
+ // cert + nonrelated
+
+ test_store = X509_STORE_CTX_new();
+ test_store->cert = mX509ChildCert;
+ test_store->untrusted = sk_X509_new_null();
+ sk_X509_push(test_store->untrusted, mX509TestCert);
+ test_chain = new LLBasicCertificateChain(test_store);
+ X509_STORE_CTX_free(test_store);
+ ensure_equals("two elements in store", test_chain->size(), 1);
+ test_cert = (*test_chain)[0]->getOpenSSLX509();
+ ensure("validate first element in store is expected cert", !X509_cmp(test_cert, mX509ChildCert));
+ X509_free(test_cert);
+
+ // cert + CA + nonrelated
+ test_store = X509_STORE_CTX_new();
+ test_store->cert = mX509ChildCert;
+ test_store->untrusted = sk_X509_new_null();
+ sk_X509_push(test_store->untrusted, mX509IntermediateCert);
+ sk_X509_push(test_store->untrusted, mX509TestCert);
+ test_chain = new LLBasicCertificateChain(test_store);
+ X509_STORE_CTX_free(test_store);
+ ensure_equals("two elements in store", test_chain->size(), 2);
+ test_cert = (*test_chain)[0]->getOpenSSLX509();
+ ensure("validate first element in store is expected cert", !X509_cmp(test_cert, mX509ChildCert));
+ X509_free(test_cert);
+ test_cert = (*test_chain)[1]->getOpenSSLX509();
+ ensure("validate second element in store is expected cert", !X509_cmp(test_cert, mX509IntermediateCert));
+ X509_free(test_cert);
+
+ // cert + intermediate + CA
+ test_store = X509_STORE_CTX_new();
+ test_store->cert = mX509ChildCert;
+ test_store->untrusted = sk_X509_new_null();
+ sk_X509_push(test_store->untrusted, mX509IntermediateCert);
+ sk_X509_push(test_store->untrusted, mX509RootCert);
+ test_chain = new LLBasicCertificateChain(test_store);
+ X509_STORE_CTX_free(test_store);
+ ensure_equals("three elements in store", test_chain->size(), 3);
+ test_cert = (*test_chain)[0]->getOpenSSLX509();
+ ensure("validate first element in store is expected cert", !X509_cmp(test_cert, mX509ChildCert));
+ X509_free(test_cert);
+ test_cert = (*test_chain)[1]->getOpenSSLX509();
+ ensure("validate second element in store is expected cert", !X509_cmp(test_cert, mX509IntermediateCert));
+ X509_free(test_cert);
+
+ test_cert = (*test_chain)[2]->getOpenSSLX509();
+ ensure("validate second element in store is expected cert", !X509_cmp(test_cert, mX509RootCert));
+ X509_free(test_cert);
+ }
+ // test cert validation
+ template<> template<>
+ void sechandler_basic_test_object::test<8>()
+ {
+ // start with a trusted store with our known root cert
+ LLFile::remove("mycertstore.pem");
+ LLPointer<LLBasicCertificateStore> test_store = new LLBasicCertificateStore("mycertstore.pem");
+ test_store->add(new LLBasicCertificate(mX509RootCert));
+ LLSD validation_params;
+
+ // validate basic trust for a chain containing only the intermediate cert. (1 deep)
+ LLPointer<LLBasicCertificateChain> test_chain = new LLBasicCertificateChain(NULL);
+
+ test_chain->add(new LLBasicCertificate(mX509IntermediateCert));
+
+ test_store->validate(0, test_chain, validation_params);
+
+ // add the root certificate to the chain and revalidate
+ test_chain->add(new LLBasicCertificate(mX509RootCert));
+ test_store->validate(0, test_chain, validation_params);
+
+ // add the child cert at the head of the chain, and revalidate (3 deep chain)
+ test_chain->insert(test_chain->begin(), new LLBasicCertificate(mX509ChildCert));
+ test_store->validate(0, test_chain, validation_params);
+
+ // basic failure cases
+ test_chain = new LLBasicCertificateChain(NULL);
+ //validate with only the child cert in chain, but child cert was previously
+ // trusted
+ test_chain->add(new LLBasicCertificate(mX509ChildCert));
+
+ // validate without the trust flag.
+ test_store->validate(VALIDATION_POLICY_TRUSTED, test_chain, validation_params);
+
+ // Validate with child cert but no parent, and no parent in CA store
+ test_store = new LLBasicCertificateStore("mycertstore.pem");
+ ensure_throws("no CA, with only a child cert",
+ LLCertValidationTrustException,
+ (*test_chain)[0],
+ test_store->validate,
+ VALIDATION_POLICY_TRUSTED,
+ test_chain,
+ validation_params);
+
+
+ // validate without the trust flag.
+ test_store->validate(0, test_chain, validation_params);
+
+ // clear out the store
+ test_store = new LLBasicCertificateStore("mycertstore.pem");
+ // append the intermediate cert
+ test_chain->add(new LLBasicCertificate(mX509IntermediateCert));
+ ensure_throws("no CA, with child and intermediate certs",
+ LLCertValidationTrustException,
+ (*test_chain)[1],
+ test_store->validate,
+ VALIDATION_POLICY_TRUSTED,
+ test_chain,
+ validation_params);
+ // validate without the trust flag
+ test_store->validate(0, test_chain, validation_params);
+
+ // Test time validity
+ LLSD child_info;
+ ((*test_chain)[0])->getLLSD(child_info);
+ validation_params = LLSD::emptyMap();
+ validation_params[CERT_VALIDATION_DATE] = LLDate(child_info[CERT_VALID_FROM].asDate().secondsSinceEpoch() + 1.0);
+ test_store->validate(VALIDATION_POLICY_TIME, test_chain, validation_params);
+
+ validation_params = LLSD::emptyMap();
+ validation_params[CERT_VALIDATION_DATE] = child_info[CERT_VALID_FROM].asDate();
+
+ validation_params[CERT_VALIDATION_DATE] = LLDate(child_info[CERT_VALID_FROM].asDate().secondsSinceEpoch() - 1.0);
+
+ // test not yet valid
+ ensure_throws("Child cert not yet valid" ,
+ LLCertValidationExpirationException,
+ (*test_chain)[0],
+ test_store->validate,
+ VALIDATION_POLICY_TIME,
+ test_chain,
+ validation_params);
+ validation_params = LLSD::emptyMap();
+ validation_params[CERT_VALIDATION_DATE] = LLDate(child_info[CERT_VALID_TO].asDate().secondsSinceEpoch() + 1.0);
+
+ // test cert expired
+ ensure_throws("Child cert expired",
+ LLCertValidationExpirationException,
+ (*test_chain)[0],
+ test_store->validate,
+ VALIDATION_POLICY_TIME,
+ test_chain,
+ validation_params);
+
+ // test SSL KU
+ // validate basic trust for a chain containing child and intermediate.
+ test_chain = new LLBasicCertificateChain(NULL);
+ test_chain->add(new LLBasicCertificate(mX509ChildCert));
+ test_chain->add(new LLBasicCertificate(mX509IntermediateCert));
+ test_store->validate(VALIDATION_POLICY_SSL_KU, test_chain, validation_params);
+
+ test_chain = new LLBasicCertificateChain(NULL);
+ test_chain->add(new LLBasicCertificate(mX509TestCert));
+
+ test_store = new LLBasicCertificateStore("mycertstore.pem");
+ ensure_throws("Cert doesn't have ku",
+ LLCertKeyUsageValidationException,
+ (*test_chain)[0],
+ test_store->validate,
+ VALIDATION_POLICY_SSL_KU,
+ test_chain,
+ validation_params);
+
+ // test sha1RSA validation
+ test_chain = new LLBasicCertificateChain(NULL);
+ test_chain->add(new LLBasicCertificate(mSha1RSATestCert));
+ test_chain->add(new LLBasicCertificate(mSha1RSATestCA));
+
+ test_store->validate(0, test_chain, validation_params);
+ }
+
+};
+
diff --git a/indra/newview/tests/llslurl_test.cpp b/indra/newview/tests/llslurl_test.cpp
new file mode 100644
index 0000000000..803020dc7a
--- /dev/null
+++ b/indra/newview/tests/llslurl_test.cpp
@@ -0,0 +1,258 @@
+/**
+ * @file llsecapi_test.cpp
+ * @author Roxie
+ * @date 2009-02-10
+ * @brief Test the sec api functionality
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden Lab
+ * to you under the terms of the GNU General Public License, version maps.secondlife.com2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+#include "../llviewerprecompiledheaders.h"
+#include "../llviewernetwork.h"
+#include "../test/lltut.h"
+#include "../llslurl.h"
+#include "../../llxml/llcontrol.h"
+#include "llsdserialize.h"
+//----------------------------------------------------------------------------
+// Mock objects for the dependencies of the code we're testing
+
+LLControlGroup::LLControlGroup(const std::string& name)
+: LLInstanceTracker<LLControlGroup, std::string>(name) {}
+LLControlGroup::~LLControlGroup() {}
+BOOL LLControlGroup::declareString(const std::string& name,
+ const std::string& initial_val,
+ const std::string& comment,
+ BOOL persist) {return TRUE;}
+void LLControlGroup::setString(const std::string& name, const std::string& val){}
+
+std::string gCmdLineLoginURI;
+std::string gCmdLineGridChoice;
+std::string gCmdLineHelperURI;
+std::string gLoginPage;
+std::string gCurrentGrid;
+std::string LLControlGroup::getString(const std::string& name)
+{
+ if (name == "CmdLineGridChoice")
+ return gCmdLineGridChoice;
+ else if (name == "CmdLineHelperURI")
+ return gCmdLineHelperURI;
+ else if (name == "LoginPage")
+ return gLoginPage;
+ else if (name == "CurrentGrid")
+ return gCurrentGrid;
+ return "";
+}
+
+LLSD LLControlGroup::getLLSD(const std::string& name)
+{
+ if (name == "CmdLineLoginURI")
+ {
+ if(!gCmdLineLoginURI.empty())
+ {
+ return LLSD(gCmdLineLoginURI);
+ }
+ }
+ return LLSD();
+}
+
+
+LLControlGroup gSavedSettings("test");
+
+// -------------------------------------------------------------------------------------------
+// TUT
+// -------------------------------------------------------------------------------------------
+namespace tut
+{
+ // Test wrapper declaration : wrapping nothing for the moment
+ struct slurlTest
+ {
+ slurlTest()
+ {
+ LLGridManager::getInstance()->initialize(std::string(""));
+ }
+ ~slurlTest()
+ {
+ }
+ };
+
+ // Tut templating thingamagic: test group, object and test instance
+ typedef test_group<slurlTest> slurlTestFactory;
+ typedef slurlTestFactory::object slurlTestObject;
+ tut::slurlTestFactory tut_test("llslurl");
+
+ // ---------------------------------------------------------------------------------------
+ // Test functions
+ // ---------------------------------------------------------------------------------------
+ // construction from slurl string
+ template<> template<>
+ void slurlTestObject::test<1>()
+ {
+ LLGridManager::getInstance()->setGridChoice("util.agni.lindenlab.com");
+
+ LLSLURL slurl = LLSLURL("");
+ ensure_equals("null slurl", (int)slurl.getType(), LLSLURL::LAST_LOCATION);
+
+ slurl = LLSLURL("http://slurl.com/secondlife/myregion");
+ ensure_equals("slurl.com slurl, region only - type", slurl.getType(), LLSLURL::LOCATION);
+ ensure_equals("slurl.com slurl, region only", slurl.getSLURLString(),
+ "http://maps.secondlife.com/secondlife/myregion/128/128/0");
+
+ slurl = LLSLURL("http://maps.secondlife.com/secondlife/myregion/1/2/3");
+ ensure_equals("maps.secondlife.com slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION);
+ ensure_equals("maps.secondlife.com slurl, region + coords", slurl.getSLURLString(),
+ "http://maps.secondlife.com/secondlife/myregion/1/2/3");
+
+ slurl = LLSLURL("secondlife://myregion");
+ ensure_equals("secondlife: slurl, region only - type", slurl.getType(), LLSLURL::LOCATION);
+ ensure_equals("secondlife: slurl, region only", slurl.getSLURLString(),
+ "http://maps.secondlife.com/secondlife/myregion/128/128/0");
+
+ slurl = LLSLURL("secondlife://myregion/1/2/3");
+ ensure_equals("secondlife: slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION);
+ ensure_equals("secondlife slurl, region + coords", slurl.getSLURLString(),
+ "http://maps.secondlife.com/secondlife/myregion/1/2/3");
+
+ slurl = LLSLURL("/myregion");
+ ensure_equals("/region slurl, region- type", slurl.getType(), LLSLURL::LOCATION);
+ ensure_equals("/region slurl, region ", slurl.getSLURLString(),
+ "http://maps.secondlife.com/secondlife/myregion/128/128/0");
+
+ slurl = LLSLURL("/myregion/1/2/3");
+ ensure_equals("/: slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION);
+ ensure_equals("/ slurl, region + coords", slurl.getSLURLString(),
+ "http://maps.secondlife.com/secondlife/myregion/1/2/3");
+
+ slurl = LLSLURL("my region/1/2/3");
+ ensure_equals(" slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION);
+ ensure_equals(" slurl, region + coords", slurl.getSLURLString(),
+ "http://maps.secondlife.com/secondlife/my%20region/1/2/3");
+
+ slurl = LLSLURL("https://my.grid.com/region/my%20region/1/2/3");
+ ensure_equals("grid slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION);
+ ensure_equals("grid slurl, region + coords", slurl.getSLURLString(),
+ "https://my.grid.com/region/my%20region/1/2/3");
+
+ slurl = LLSLURL("https://my.grid.com/region/my region");
+ ensure_equals("grid slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION);
+ ensure_equals("grid slurl, region + coords", slurl.getSLURLString(),
+ "https://my.grid.com/region/my%20region/128/128/0");
+
+ LLGridManager::getInstance()->setGridChoice("foo.bar.com");
+ slurl = LLSLURL("/myregion/1/2/3");
+ ensure_equals("/: slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION);
+ ensure_equals("/ slurl, region + coords", slurl.getSLURLString(),
+ "https://foo.bar.com/region/myregion/1/2/3");
+
+ slurl = LLSLURL("myregion/1/2/3");
+ ensure_equals(": slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION);
+ ensure_equals(" slurl, region + coords", slurl.getSLURLString(),
+ "https://foo.bar.com/region/myregion/1/2/3");
+
+ slurl = LLSLURL(LLSLURL::SIM_LOCATION_HOME);
+ ensure_equals("home", slurl.getType(), LLSLURL::HOME_LOCATION);
+
+ slurl = LLSLURL(LLSLURL::SIM_LOCATION_LAST);
+ ensure_equals("last", slurl.getType(), LLSLURL::LAST_LOCATION);
+
+ slurl = LLSLURL("secondlife:///app/foo/bar?12345");
+ ensure_equals("app", slurl.getType(), LLSLURL::APP);
+ ensure_equals("appcmd", slurl.getAppCmd(), "foo");
+ ensure_equals("apppath", slurl.getAppPath().size(), 1);
+ ensure_equals("apppath2", slurl.getAppPath()[0].asString(), "bar");
+ ensure_equals("appquery", slurl.getAppQuery(), "12345");
+ ensure_equals("grid1", "foo.bar.com", slurl.getGrid());
+
+ slurl = LLSLURL("secondlife://Aditi/app/foo/bar?12345");
+ ensure_equals("app", slurl.getType(), LLSLURL::APP);
+ ensure_equals("appcmd", slurl.getAppCmd(), "foo");
+ ensure_equals("apppath", slurl.getAppPath().size(), 1);
+ ensure_equals("apppath2", slurl.getAppPath()[0].asString(), "bar");
+ ensure_equals("appquery", slurl.getAppQuery(), "12345");
+ ensure_equals("grid2", "util.aditi.lindenlab.com", slurl.getGrid());
+
+ LLGridManager::getInstance()->setGridChoice("foo.bar.com");
+ slurl = LLSLURL("secondlife:///secondlife/myregion/1/2/3");
+ ensure_equals("/: slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION);
+ ensure_equals("location", slurl.getType(), LLSLURL::LOCATION);
+ ensure_equals("region" , "myregion", slurl.getRegion());
+ ensure_equals("grid3", "util.agni.lindenlab.com", slurl.getGrid());
+
+ slurl = LLSLURL("secondlife://Aditi/secondlife/myregion/1/2/3");
+ ensure_equals("/: slurl, region + coords - type", slurl.getType(), LLSLURL::LOCATION);
+ ensure_equals("location", slurl.getType(), LLSLURL::LOCATION);
+ ensure_equals("region" , "myregion", slurl.getRegion());
+ ensure_equals("grid4", "util.aditi.lindenlab.com", slurl.getGrid());
+
+ slurl = LLSLURL("https://my.grid.com/app/foo/bar?12345");
+ ensure_equals("app", slurl.getType(), LLSLURL::APP);
+ ensure_equals("appcmd", slurl.getAppCmd(), "foo");
+ ensure_equals("apppath", slurl.getAppPath().size(), 1);
+ ensure_equals("apppath2", slurl.getAppPath()[0].asString(), "bar");
+ ensure_equals("appquery", slurl.getAppQuery(), "12345");
+
+ }
+
+ // construction from grid/region/vector combos
+ template<> template<>
+ void slurlTestObject::test<2>()
+ {
+ LLSLURL slurl = LLSLURL("mygrid.com", "my region");
+ ensure_equals("grid/region - type", slurl.getType(), LLSLURL::LOCATION);
+ ensure_equals("grid/region", slurl.getSLURLString(),
+ "https://mygrid.com/region/my%20region/128/128/0");
+
+ slurl = LLSLURL("mygrid.com", "my region", LLVector3(1,2,3));
+ ensure_equals("grid/region/vector - type", slurl.getType(), LLSLURL::LOCATION);
+ ensure_equals(" grid/region/vector", slurl.getSLURLString(),
+ "https://mygrid.com/region/my%20region/1/2/3");
+
+ LLGridManager::getInstance()->setGridChoice("foo.bar.com.bar");
+ slurl = LLSLURL("my region", LLVector3(1,2,3));
+ ensure_equals("grid/region/vector - type", slurl.getType(), LLSLURL::LOCATION);
+ ensure_equals(" grid/region/vector", slurl.getSLURLString(),
+ "https://foo.bar.com.bar/region/my%20region/1/2/3");
+
+ LLGridManager::getInstance()->setGridChoice("util.agni.lindenlab.com");
+ slurl = LLSLURL("my region", LLVector3(1,2,3));
+ ensure_equals("default grid/region/vector - type", slurl.getType(), LLSLURL::LOCATION);
+ ensure_equals(" default grid/region/vector", slurl.getSLURLString(),
+ "http://maps.secondlife.com/secondlife/my%20region/1/2/3");
+
+ }
+ // Accessors
+ template<> template<>
+ void slurlTestObject::test<3>()
+ {
+ LLSLURL slurl = LLSLURL("https://my.grid.com/region/my%20region/1/2/3");
+ ensure_equals("login string", slurl.getLoginString(), "uri:my region&amp;1&amp;2&amp;3");
+ ensure_equals("location string", slurl.getLocationString(), "my region/1/2/3");
+ ensure_equals("grid", slurl.getGrid(), "my.grid.com");
+ ensure_equals("region", slurl.getRegion(), "my region");
+ ensure_equals("position", slurl.getPosition(), LLVector3(1, 2, 3));
+
+ }
+}
diff --git a/indra/newview/tests/llviewerhelputil_test.cpp b/indra/newview/tests/llviewerhelputil_test.cpp
index dd61ac6ae5..eecc79d36c 100644
--- a/indra/newview/tests/llviewerhelputil_test.cpp
+++ b/indra/newview/tests/llviewerhelputil_test.cpp
@@ -86,7 +86,7 @@ public:
#ifdef __GNUC__
__attribute__ ((noinline))
#endif
- BOOL isGodlike() const { return FALSE; }
+ bool isGodlike() const { return FALSE; }
};
LLAgent gAgent;
diff --git a/indra/newview/tests/llviewernetwork_test.cpp b/indra/newview/tests/llviewernetwork_test.cpp
new file mode 100644
index 0000000000..5fba5eb69c
--- /dev/null
+++ b/indra/newview/tests/llviewernetwork_test.cpp
@@ -0,0 +1,582 @@
+/**
+ * @file llviewernetwork_test.cpp
+ * @author Roxie
+ * @date 2009-03-9
+ * @brief Test the viewernetwork functionality
+ *
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
+ * Second Life Viewer Source Code
+ * The source code in this file ("Source Code") is provided by Linden LregisterSecAPIab
+ * to you under the terms of the GNU General Public License, version 2.0
+ * ("GPL"), unless you have obtained a separate licensing agreement
+ * ("Other License"), formally executed by you and Linden Lab. Terms of
+ * the GPL can be found in doc/GPL-license.txt in this distribution, or
+ * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+ *
+ * There are special exceptions to the terms and conditions of the GPL as
+ * it is applied to this Source Code. View the full text of the exception
+ * in the file doc/FLOSS-exception.txt in this software distribution, or
+ * online at
+ * http://secondlifegrid.net/programs/open_source/licensing/flossexception
+ *
+ * By copying, modifying or distributing this software, you acknowledge
+ * that you have read and understood your obligations described above,
+ * and agree to abide by those obligations.
+ *
+ * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+ * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+ * COMPLETENESS OR PERFORMANCE.
+ * $/LicenseInfo$
+ */
+#include "../llviewerprecompiledheaders.h"
+#include "../llviewernetwork.h"
+#include "../test/lltut.h"
+#include "../../llxml/llcontrol.h"
+#include "llfile.h"
+
+//----------------------------------------------------------------------------
+// Mock objects for the dependencies of the code we're testing
+
+LLControlGroup::LLControlGroup(const std::string& name)
+: LLInstanceTracker<LLControlGroup, std::string>(name) {}
+LLControlGroup::~LLControlGroup() {}
+BOOL LLControlGroup::declareString(const std::string& name,
+ const std::string& initial_val,
+ const std::string& comment,
+ BOOL persist) {return TRUE;}
+void LLControlGroup::setString(const std::string& name, const std::string& val){}
+
+std::string gCmdLineLoginURI;
+std::string gCmdLineGridChoice;
+std::string gCmdLineHelperURI;
+std::string gLoginPage;
+std::string gCurrentGrid;
+std::string LLControlGroup::getString(const std::string& name)
+{
+ if (name == "CmdLineGridChoice")
+ return gCmdLineGridChoice;
+ else if (name == "CmdLineHelperURI")
+ return gCmdLineHelperURI;
+ else if (name == "LoginPage")
+ return gLoginPage;
+ else if (name == "CurrentGrid")
+ return gCurrentGrid;
+ return "";
+}
+
+LLSD LLControlGroup::getLLSD(const std::string& name)
+{
+ if (name == "CmdLineLoginURI")
+ {
+ if(!gCmdLineLoginURI.empty())
+ {
+ return LLSD(gCmdLineLoginURI);
+ }
+ }
+ return LLSD();
+}
+
+
+LLControlGroup gSavedSettings("test");
+
+const char *gSampleGridFile = "<llsd><map>"
+"<key>grid1</key><map>"
+" <key>favorite</key><integer>1</integer>"
+" <key>helper_uri</key><string>https://helper1/helpers/</string>"
+" <key>label</key><string>mylabel</string>"
+" <key>login_page</key><string>loginpage</string>"
+" <key>login_uri</key><array><string>myloginuri</string></array>"
+" <key>name</key><string>grid1</string>"
+" <key>visible</key><integer>1</integer>"
+" <key>credential_type</key><string>agent</string>"
+" <key>grid_login_id</key><string>MyGrid</string>"
+"</map>"
+"<key>util.agni.lindenlab.com</key><map>"
+" <key>favorite</key><integer>1</integer>"
+" <key>helper_uri</key><string>https://helper1/helpers/</string>"
+" <key>label</key><string>mylabel</string>"
+" <key>login_page</key><string>loginpage</string>"
+" <key>login_uri</key><array><string>myloginuri</string></array>"
+" <key>name</key><string>util.agni.lindenlab.com</string>"
+"</map></map></llsd>";
+// -------------------------------------------------------------------------------------------
+// TUT
+// -------------------------------------------------------------------------------------------
+namespace tut
+{
+ // Test wrapper declaration : wrapping nothing for the moment
+ struct viewerNetworkTest
+ {
+ viewerNetworkTest()
+ {
+ LLFile::remove("grid_test.xml");
+ gCmdLineLoginURI.clear();
+ gCmdLineGridChoice.clear();
+ gCmdLineHelperURI.clear();
+ gLoginPage.clear();
+ gCurrentGrid.clear();
+ }
+ ~viewerNetworkTest()
+ {
+ LLFile::remove("grid_test.xml");
+ }
+ };
+
+ // Tut templating thingamagic: test group, object and test instance
+ typedef test_group<viewerNetworkTest> viewerNetworkTestFactory;
+ typedef viewerNetworkTestFactory::object viewerNetworkTestObject;
+ tut::viewerNetworkTestFactory tut_test("llviewernetwork");
+
+ // ---------------------------------------------------------------------------------------
+ // Test functions
+ // ---------------------------------------------------------------------------------------
+ // initialization without a grid file
+ template<> template<>
+ void viewerNetworkTestObject::test<1>()
+ {
+
+ LLGridManager *manager = LLGridManager::getInstance();
+ // grid file doesn't exist
+ manager->initialize("grid_test.xml");
+ // validate that some of the defaults are available.
+ std::map<std::string, std::string> known_grids = manager->getKnownGrids();
+ ensure_equals("Known grids is a string-string map of size 23", known_grids.size(), 23);
+ ensure_equals("Agni has the right name and label",
+ known_grids[std::string("util.agni.lindenlab.com")], std::string("Agni"));
+ ensure_equals("None exists", known_grids[""], "None");
+
+ LLSD grid;
+ LLGridManager::getInstance()->getGridInfo("util.agni.lindenlab.com", grid);
+ ensure("Grid info for agni is a map", grid.isMap());
+ ensure_equals("name is correct for agni",
+ grid[GRID_VALUE].asString(), std::string("util.agni.lindenlab.com"));
+ ensure_equals("label is correct for agni",
+ grid[GRID_LABEL_VALUE].asString(), std::string("Agni"));
+ ensure("Login URI is an array",
+ grid[GRID_LOGIN_URI_VALUE].isArray());
+ ensure_equals("Agni login uri is correct",
+ grid[GRID_LOGIN_URI_VALUE][0].asString(),
+ std::string("https://login.agni.lindenlab.com/cgi-bin/login.cgi"));
+ ensure_equals("Agni helper uri is correct",
+ grid[GRID_HELPER_URI_VALUE].asString(),
+ std::string("https://secondlife.com/helpers/"));
+ ensure_equals("Agni login page is correct",
+ grid[GRID_LOGIN_PAGE_VALUE].asString(),
+ std::string("http://secondlife.com/app/login/"));
+ ensure("Agni is a favorite",
+ grid.has(GRID_IS_FAVORITE_VALUE));
+ ensure("Agni is a system grid",
+ grid.has(GRID_IS_SYSTEM_GRID_VALUE));
+ ensure("Grid file wasn't greated as it wasn't saved",
+ !LLFile::isfile("grid_test.xml"));
+ }
+
+ // initialization with a grid file
+ template<> template<>
+ void viewerNetworkTestObject::test<2>()
+ {
+ llofstream gridfile("grid_test.xml");
+ gridfile << gSampleGridFile;
+ gridfile.close();
+
+ LLGridManager::getInstance()->initialize("grid_test.xml");
+ std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids();
+ ensure_equals("adding a grid via a grid file increases known grid size",
+ known_grids.size(), 24);
+ ensure_equals("Agni is still there after we've added a grid via a grid file",
+ known_grids["util.agni.lindenlab.com"], std::string("Agni"));
+
+
+ // assure Agni doesn't get overwritten
+ LLSD grid;
+ LLGridManager::getInstance()->getGridInfo("util.agni.lindenlab.com", grid);
+
+ ensure_equals("Agni grid label was not modified by grid file",
+ grid[GRID_LABEL_VALUE].asString(), std::string("Agni"));
+
+ ensure_equals("Agni name wasn't modified by grid file",
+ grid[GRID_VALUE].asString(), std::string("util.agni.lindenlab.com"));
+ ensure("Agni grid URI is still an array after grid file",
+ grid[GRID_LOGIN_URI_VALUE].isArray());
+ ensure_equals("Agni login uri still the same after grid file",
+ grid[GRID_LOGIN_URI_VALUE][0].asString(),
+ std::string("https://login.agni.lindenlab.com/cgi-bin/login.cgi"));
+ ensure_equals("Agni helper uri still the same after grid file",
+ grid[GRID_HELPER_URI_VALUE].asString(),
+ std::string("https://secondlife.com/helpers/"));
+ ensure_equals("Agni login page the same after grid file",
+ grid[GRID_LOGIN_PAGE_VALUE].asString(),
+ std::string("http://secondlife.com/app/login/"));
+ ensure("Agni still a favorite after grid file",
+ grid.has(GRID_IS_FAVORITE_VALUE));
+ ensure("Agni system grid still set after grid file",
+ grid.has(GRID_IS_SYSTEM_GRID_VALUE));
+
+ ensure_equals("Grid file adds to name<->label map",
+ known_grids["grid1"], std::string("mylabel"));
+ LLGridManager::getInstance()->getGridInfo("grid1", grid);
+ ensure_equals("grid file grid name is set",
+ grid[GRID_VALUE].asString(), std::string("grid1"));
+ ensure_equals("grid file label is set",
+ grid[GRID_LABEL_VALUE].asString(), std::string("mylabel"));
+ ensure("grid file login uri is an array",
+ grid[GRID_LOGIN_URI_VALUE].isArray());
+ ensure_equals("grid file login uri is set",
+ grid[GRID_LOGIN_URI_VALUE][0].asString(),
+ std::string("myloginuri"));
+ ensure_equals("grid file helper uri is set",
+ grid[GRID_HELPER_URI_VALUE].asString(),
+ std::string("https://helper1/helpers/"));
+ ensure_equals("grid file login page is set",
+ grid[GRID_LOGIN_PAGE_VALUE].asString(),
+ std::string("loginpage"));
+ ensure("grid file favorite is set",
+ grid.has(GRID_IS_FAVORITE_VALUE));
+ ensure("grid file isn't a system grid",
+ !grid.has(GRID_IS_SYSTEM_GRID_VALUE));
+ ensure("Grid file still exists after loading",
+ LLFile::isfile("grid_test.xml"));
+ }
+
+ // Initialize via command line
+
+ template<> template<>
+ void viewerNetworkTestObject::test<3>()
+ {
+ // USE --grid command line
+ // initialize with a known grid
+ LLSD grid;
+ gCmdLineGridChoice = "Aditi";
+ LLGridManager::getInstance()->initialize("grid_test.xml");
+ // with single login uri specified.
+ std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids();
+ ensure_equals("Using a known grid via command line doesn't increase number of known grids",
+ known_grids.size(), 23);
+ ensure_equals("getGridLabel", LLGridManager::getInstance()->getGridLabel(), std::string("Aditi"));
+ // initialize with a known grid in lowercase
+ gCmdLineGridChoice = "agni";
+ LLGridManager::getInstance()->initialize("grid_test.xml");
+ ensure_equals("getGridLabel", LLGridManager::getInstance()->getGridLabel(), std::string("Agni"));
+
+ // now try a command line with a custom grid identifier
+ gCmdLineGridChoice = "mycustomgridchoice";
+ LLGridManager::getInstance()->initialize("grid_test.xml");
+ known_grids = LLGridManager::getInstance()->getKnownGrids();
+ ensure_equals("adding a command line grid with custom name increases known grid size",
+ known_grids.size(), 24);
+ ensure_equals("Custom Command line grid is added to the list of grids",
+ known_grids["mycustomgridchoice"], std::string("mycustomgridchoice"));
+ LLGridManager::getInstance()->getGridInfo("mycustomgridchoice", grid);
+ ensure_equals("Custom Command line grid name is set",
+ grid[GRID_VALUE].asString(), std::string("mycustomgridchoice"));
+ ensure_equals("Custom Command line grid label is set",
+ grid[GRID_LABEL_VALUE].asString(), std::string("mycustomgridchoice"));
+ ensure("Custom Command line grid login uri is an array",
+ grid[GRID_LOGIN_URI_VALUE].isArray());
+ ensure_equals("Custom Command line grid login uri is set",
+ grid[GRID_LOGIN_URI_VALUE][0].asString(),
+ std::string("https://mycustomgridchoice/cgi-bin/login.cgi"));
+ ensure_equals("Custom Command line grid helper uri is set",
+ grid[GRID_HELPER_URI_VALUE].asString(),
+ std::string("https://mycustomgridchoice/helpers/"));
+ ensure_equals("Custom Command line grid login page is set",
+ grid[GRID_LOGIN_PAGE_VALUE].asString(),
+ std::string("http://mycustomgridchoice/app/login/"));
+ }
+
+ // validate override of login uri with cmd line
+ template<> template<>
+ void viewerNetworkTestObject::test<4>()
+ {
+ // Override with loginuri
+ // override known grid
+ LLSD grid;
+ gCmdLineGridChoice = "Aditi";
+ gCmdLineLoginURI = "https://my.login.uri/cgi-bin/login.cgi";
+ LLGridManager::getInstance()->initialize("grid_test.xml");
+ std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids();
+ ensure_equals("Override known grid login uri: No grids are added",
+ known_grids.size(), 23);
+ LLGridManager::getInstance()->getGridInfo(grid);
+ ensure("Override known grid login uri: login uri is an array",
+ grid[GRID_LOGIN_URI_VALUE].isArray());
+ ensure_equals("Override known grid login uri: Command line grid login uri is set",
+ grid[GRID_LOGIN_URI_VALUE][0].asString(),
+ std::string("https://my.login.uri/cgi-bin/login.cgi"));
+ ensure_equals("Override known grid login uri: helper uri is not changed",
+ grid[GRID_HELPER_URI_VALUE].asString(),
+ std::string("http://aditi-secondlife.webdev.lindenlab.com/helpers/"));
+ ensure_equals("Override known grid login uri: login page is not set",
+ grid[GRID_LOGIN_PAGE_VALUE].asString(),
+ std::string("http://secondlife.com/app/login/"));
+
+ // Override with loginuri
+ // override custom grid
+ gCmdLineGridChoice = "mycustomgridchoice";
+ gCmdLineLoginURI = "https://my.login.uri/cgi-bin/login.cgi";
+ LLGridManager::getInstance()->initialize("grid_test.xml");
+ known_grids = LLGridManager::getInstance()->getKnownGrids();
+ LLGridManager::getInstance()->getGridInfo(grid);
+ ensure_equals("Override custom grid login uri: Grid is added",
+ known_grids.size(), 24);
+ ensure("Override custom grid login uri: login uri is an array",
+ grid[GRID_LOGIN_URI_VALUE].isArray());
+ ensure_equals("Override custom grid login uri: login uri is set",
+ grid[GRID_LOGIN_URI_VALUE][0].asString(),
+ std::string("https://my.login.uri/cgi-bin/login.cgi"));
+ ensure_equals("Override custom grid login uri: Helper uri is not set",
+ grid[GRID_HELPER_URI_VALUE].asString(),
+ std::string("https://mycustomgridchoice/helpers/"));
+ ensure_equals("Override custom grid login uri: Login page is not set",
+ grid[GRID_LOGIN_PAGE_VALUE].asString(),
+ std::string("http://mycustomgridchoice/app/login/"));
+ }
+
+ // validate override of helper uri with cmd line
+ template<> template<>
+ void viewerNetworkTestObject::test<5>()
+ {
+ // Override with helperuri
+ // override known grid
+ LLSD grid;
+ gCmdLineGridChoice = "Aditi";
+ gCmdLineLoginURI = "";
+ gCmdLineHelperURI = "https://my.helper.uri/mycustomhelpers";
+ LLGridManager::getInstance()->initialize("grid_test.xml");
+ std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids();
+ ensure_equals("Override known grid helper uri: No grids are added",
+ known_grids.size(), 23);
+ LLGridManager::getInstance()->getGridInfo(grid);
+ ensure("Override known known helper uri: login uri is an array",
+ grid[GRID_LOGIN_URI_VALUE].isArray());
+ ensure_equals("Override known grid helper uri: login uri is not changed",
+ grid[GRID_LOGIN_URI_VALUE][0].asString(),
+ std::string("https://login.aditi.lindenlab.com/cgi-bin/login.cgi"));
+ ensure_equals("Override known grid helper uri: helper uri is changed",
+ grid[GRID_HELPER_URI_VALUE].asString(),
+ std::string("https://my.helper.uri/mycustomhelpers"));
+ ensure_equals("Override known grid helper uri: login page is not changed",
+ grid[GRID_LOGIN_PAGE_VALUE].asString(),
+ std::string("http://secondlife.com/app/login/"));
+
+ // Override with helperuri
+ // override custom grid
+ gCmdLineGridChoice = "mycustomgridchoice";
+ gCmdLineHelperURI = "https://my.helper.uri/mycustomhelpers";
+ LLGridManager::getInstance()->initialize("grid_test.xml");
+ known_grids = LLGridManager::getInstance()->getKnownGrids();
+ ensure_equals("Override custom grid helper uri: grids is added",
+ known_grids.size(), 24);
+ LLGridManager::getInstance()->getGridInfo(grid);
+ ensure("Override custom helper uri: login uri is an array",
+ grid[GRID_LOGIN_URI_VALUE].isArray());
+ ensure_equals("Override custom grid helper uri: login uri is not changed",
+ grid[GRID_LOGIN_URI_VALUE][0].asString(),
+ std::string("https://mycustomgridchoice/cgi-bin/login.cgi"));
+ ensure_equals("Override custom grid helper uri: helper uri is changed",
+ grid[GRID_HELPER_URI_VALUE].asString(),
+ std::string("https://my.helper.uri/mycustomhelpers"));
+ ensure_equals("Override custom grid helper uri: login page is not changed",
+ grid[GRID_LOGIN_PAGE_VALUE].asString(),
+ std::string("http://mycustomgridchoice/app/login/"));
+ }
+
+ // validate overriding of login page via cmd line
+ template<> template<>
+ void viewerNetworkTestObject::test<6>()
+ {
+ // Override with login page
+ // override known grid
+ LLSD grid;
+ gCmdLineGridChoice = "Aditi";
+ gCmdLineHelperURI = "";
+ gLoginPage = "myloginpage";
+ LLGridManager::getInstance()->initialize("grid_test.xml");
+ std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids();
+ ensure_equals("Override known grid login page: No grids are added",
+ known_grids.size(), 23);
+ LLGridManager::getInstance()->getGridInfo(grid);
+ ensure("Override known grid login page: Command line grid login uri is an array",
+ grid[GRID_LOGIN_URI_VALUE].isArray());
+ ensure_equals("Override known grid login page: login uri is not changed",
+ grid[GRID_LOGIN_URI_VALUE][0].asString(),
+ std::string("https://login.aditi.lindenlab.com/cgi-bin/login.cgi"));
+ ensure_equals("Override known grid login page: helper uri is not changed",
+ grid[GRID_HELPER_URI_VALUE].asString(),
+ std::string("http://aditi-secondlife.webdev.lindenlab.com/helpers/"));
+ ensure_equals("Override known grid login page: login page is changed",
+ grid[GRID_LOGIN_PAGE_VALUE].asString(),
+ std::string("myloginpage"));
+
+ // Override with login page
+ // override custom grid
+ gCmdLineGridChoice = "mycustomgridchoice";
+ gLoginPage = "myloginpage";
+ LLGridManager::getInstance()->initialize("grid_test.xml");
+ known_grids = LLGridManager::getInstance()->getKnownGrids();
+ ensure_equals("Override custom grid login page: grids are added",
+ known_grids.size(), 24);
+ LLGridManager::getInstance()->getGridInfo(grid);
+ ensure("Override custom grid login page: Command line grid login uri is an array",
+ grid[GRID_LOGIN_URI_VALUE].isArray());
+ ensure_equals("Override custom grid login page: login uri is not changed",
+ grid[GRID_LOGIN_URI_VALUE][0].asString(),
+ std::string("https://mycustomgridchoice/cgi-bin/login.cgi"));
+ ensure_equals("Override custom grid login page: helper uri is not changed",
+ grid[GRID_HELPER_URI_VALUE].asString(),
+ std::string("https://mycustomgridchoice/helpers/"));
+ ensure_equals("Override custom grid login page: login page is changed",
+ grid[GRID_LOGIN_PAGE_VALUE].asString(),
+ std::string("myloginpage"));
+
+ }
+
+ // validate grid selection
+ template<> template<>
+ void viewerNetworkTestObject::test<7>()
+ {
+ LLSD loginURI = LLSD::emptyArray();
+ LLSD grid = LLSD::emptyMap();
+ // adding a grid with simply a name will populate the values.
+ grid[GRID_VALUE] = "myaddedgrid";
+
+ LLGridManager::getInstance()->initialize("grid_test.xml");
+ LLGridManager::getInstance()->addGrid(grid);
+ LLGridManager::getInstance()->setGridChoice("util.agni.lindenlab.com");
+ ensure_equals("getGridLabel", LLGridManager::getInstance()->getGridLabel(), std::string("Agni"));
+ ensure_equals("getGrid", LLGridManager::getInstance()->getGrid(),
+ std::string("util.agni.lindenlab.com"));
+ ensure_equals("getHelperURI", LLGridManager::getInstance()->getHelperURI(),
+ std::string("https://secondlife.com/helpers/"));
+ ensure_equals("getLoginPage", LLGridManager::getInstance()->getLoginPage(),
+ std::string("http://secondlife.com/app/login/"));
+ ensure_equals("getLoginPage2", LLGridManager::getInstance()->getLoginPage("util.agni.lindenlab.com"),
+ std::string("http://secondlife.com/app/login/"));
+ ensure("Is Agni a production grid", LLGridManager::getInstance()->isInProductionGrid());
+ std::vector<std::string> uris;
+ LLGridManager::getInstance()->getLoginURIs(uris);
+ ensure_equals("getLoginURIs size", uris.size(), 1);
+ ensure_equals("getLoginURIs", uris[0],
+ std::string("https://login.agni.lindenlab.com/cgi-bin/login.cgi"));
+ LLGridManager::getInstance()->setGridChoice("myaddedgrid");
+ ensure_equals("getGridLabel", LLGridManager::getInstance()->getGridLabel(), std::string("myaddedgrid"));
+ ensure("Is myaddedgrid a production grid", !LLGridManager::getInstance()->isInProductionGrid());
+
+ LLGridManager::getInstance()->setFavorite();
+ LLGridManager::getInstance()->getGridInfo("myaddedgrid", grid);
+ ensure("setting favorite", grid.has(GRID_IS_FAVORITE_VALUE));
+ }
+
+ // name based grid population
+ template<> template<>
+ void viewerNetworkTestObject::test<8>()
+ {
+ LLGridManager::getInstance()->initialize("grid_test.xml");
+ LLSD grid = LLSD::emptyMap();
+ // adding a grid with simply a name will populate the values.
+ grid[GRID_VALUE] = "myaddedgrid";
+ LLGridManager::getInstance()->addGrid(grid);
+ LLGridManager::getInstance()->getGridInfo("myaddedgrid", grid);
+
+ ensure_equals("name based grid has name value",
+ grid[GRID_VALUE].asString(),
+ std::string("myaddedgrid"));
+ ensure_equals("name based grid has label value",
+ grid[GRID_LABEL_VALUE].asString(),
+ std::string("myaddedgrid"));
+ ensure_equals("name based grid has name value",
+ grid[GRID_HELPER_URI_VALUE].asString(),
+ std::string("https://myaddedgrid/helpers/"));
+ ensure_equals("name based grid has name value",
+ grid[GRID_LOGIN_PAGE_VALUE].asString(),
+ std::string("http://myaddedgrid/app/login/"));
+ ensure("name based grid has array loginuri",
+ grid[GRID_LOGIN_URI_VALUE].isArray());
+ ensure_equals("name based grid has single login uri value",
+ grid[GRID_LOGIN_URI_VALUE].size(), 1);
+ ensure_equals("Name based grid login uri is correct",
+ grid[GRID_LOGIN_URI_VALUE][0].asString(),
+ std::string("https://myaddedgrid/cgi-bin/login.cgi"));
+ ensure("name based grid is not a favorite yet",
+ !grid.has(GRID_IS_FAVORITE_VALUE));
+ ensure("name based grid does not have system setting",
+ !grid.has(GRID_IS_SYSTEM_GRID_VALUE));
+
+ llofstream gridfile("grid_test.xml");
+ gridfile << gSampleGridFile;
+ gridfile.close();
+ }
+
+ // persistence of the grid list with an empty gridfile.
+ template<> template<>
+ void viewerNetworkTestObject::test<9>()
+ {
+ // try with initial grid list without a grid file,
+ // without setting the grid to a saveable favorite.
+ LLGridManager::getInstance()->initialize("grid_test.xml");
+ LLSD grid = LLSD::emptyMap();
+ grid[GRID_VALUE] = std::string("mynewgridname");
+ LLGridManager::getInstance()->addGrid(grid);
+ LLGridManager::getInstance()->saveFavorites();
+ ensure("Grid file exists after saving",
+ LLFile::isfile("grid_test.xml"));
+ LLGridManager::getInstance()->initialize("grid_test.xml");
+ // should not be there
+ std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids();
+ ensure("New grid wasn't added to persisted list without being marked a favorite",
+ known_grids.find(std::string("mynewgridname")) == known_grids.end());
+
+ // mark a grid a favorite to make sure it's persisted
+ LLGridManager::getInstance()->addGrid(grid);
+ LLGridManager::getInstance()->setGridChoice("mynewgridname");
+ LLGridManager::getInstance()->setFavorite();
+ LLGridManager::getInstance()->saveFavorites();
+ ensure("Grid file exists after saving",
+ LLFile::isfile("grid_test.xml"));
+ LLGridManager::getInstance()->initialize("grid_test.xml");
+ // should not be there
+ known_grids = LLGridManager::getInstance()->getKnownGrids();
+ ensure("New grid wasn't added to persisted list after being marked a favorite",
+ known_grids.find(std::string("mynewgridname")) !=
+ known_grids.end());
+ }
+
+ // persistence of the grid file with existing gridfile
+ template<> template<>
+ void viewerNetworkTestObject::test<10>()
+ {
+
+ llofstream gridfile("grid_test.xml");
+ gridfile << gSampleGridFile;
+ gridfile.close();
+
+ LLGridManager::getInstance()->initialize("grid_test.xml");
+ LLSD grid = LLSD::emptyMap();
+ grid[GRID_VALUE] = std::string("mynewgridname");
+ LLGridManager::getInstance()->addGrid(grid);
+ LLGridManager::getInstance()->saveFavorites();
+ // validate we didn't lose existing favorites
+ LLGridManager::getInstance()->initialize("grid_test.xml");
+ std::map<std::string, std::string> known_grids = LLGridManager::getInstance()->getKnownGrids();
+ ensure("New grid wasn't added to persisted list after being marked a favorite",
+ known_grids.find(std::string("grid1")) !=
+ known_grids.end());
+
+ // add a grid
+ LLGridManager::getInstance()->addGrid(grid);
+ LLGridManager::getInstance()->setGridChoice("mynewgridname");
+ LLGridManager::getInstance()->setFavorite();
+ LLGridManager::getInstance()->saveFavorites();
+ known_grids = LLGridManager::getInstance()->getKnownGrids();
+ ensure("New grid wasn't added to persisted list after being marked a favorite",
+ known_grids.find(std::string("grid1")) !=
+ known_grids.end());
+ known_grids = LLGridManager::getInstance()->getKnownGrids();
+ ensure("New grid wasn't added to persisted list after being marked a favorite",
+ known_grids.find(std::string("mynewgridname")) !=
+ known_grids.end());
+ }
+}
diff --git a/indra/newview/tests/llxmlrpclistener_test.cpp b/indra/newview/tests/llxmlrpclistener_test.cpp
index c94ba0a3e8..c2c7e963b9 100644
--- a/indra/newview/tests/llxmlrpclistener_test.cpp
+++ b/indra/newview/tests/llxmlrpclistener_test.cpp
@@ -4,7 +4,7 @@
* @date 2009-03-20
* @brief Test for llxmlrpclistener.
*
- * $LicenseInfo:firstyear=2009&license=internal$
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
* Copyright (c) 2009, Linden Research, Inc.
* $/LicenseInfo$
*/
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 15a51bbe14..0b30128ff3 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -34,6 +34,7 @@ import sys
import os.path
import re
import tarfile
+import time
viewer_dir = os.path.dirname(__file__)
# add llmanifest library to our path so we don't have to muck with PYTHONPATH
sys.path.append(os.path.join(viewer_dir, '../lib/python/indra/util'))
@@ -41,9 +42,12 @@ 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
+ # 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 (see copy_w_viewer_manifest
+ # and copy_l_viewer_manifest targets)
+ return 'package' in self.args['actions']
def construct(self):
super(ViewerManifest, self).construct()
@@ -105,6 +109,12 @@ class ViewerManifest(LLManifest):
self.end_prefix("*/html")
self.end_prefix("skins")
+ # local_assets dir (for pre-cached textures)
+ if self.prefix(src="local_assets"):
+ self.path("*.j2c")
+ self.path("*.tga")
+ self.end_prefix("local_assets")
+
# Files in the newview/ directory
self.path("gpu_table.txt")
@@ -169,13 +179,6 @@ 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.
# It is used as a temporary override during the construct method
@@ -332,6 +335,12 @@ class WindowsManifest(ViewerManifest):
self.path("media_plugin_webkit.dll")
self.end_prefix()
+ # winmm.dll shim
+ if self.prefix(src='../media_plugins/winmmshim/%s' % self.args['configuration'], dst="llplugin"):
+ self.path("winmm.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"):
@@ -479,8 +488,8 @@ class WindowsManifest(ViewerManifest):
grid_vars_template = """
OutFile "%(installer_file)s"
!define INSTFLAGS "%(flags)s"
- !define INSTNAME "SecondLife"
- !define SHORTCUT "Second Life"
+ !define INSTNAME "SecondLifeViewer2"
+ !define SHORTCUT "Second Life Viewer 2"
!define URLNAME "secondlife"
Caption "Second Life ${VERSION}"
"""
@@ -551,6 +560,10 @@ class WindowsManifest(ViewerManifest):
class DarwinManifest(ViewerManifest):
+ def is_packaging_viewer(self):
+ # darwin requires full app bundle packaging even for debugging.
+ return True
+
def construct(self):
# copy over the build result (this is a no-op if run within the xcode script)
self.path(self.args['configuration'] + "/Second Life.app", dst="")
@@ -629,7 +642,9 @@ class DarwinManifest(ViewerManifest):
if dylibs["llcommon"]:
for libfile in ("libapr-1.0.3.7.dylib",
"libaprutil-1.0.3.8.dylib",
- "libexpat.0.5.0.dylib"):
+ "libexpat.0.5.0.dylib",
+ "libexception_handler.dylib",
+ ):
self.path(os.path.join(libdir, libfile), libfile)
#libfmodwrapper.dylib
@@ -639,14 +654,20 @@ class DarwinManifest(ViewerManifest):
self.path("../mac_crash_logger/" + self.args['configuration'] + "/mac-crash-logger.app", "mac-crash-logger.app")
self.path("../mac_updater/" + self.args['configuration'] + "/mac-updater.app", "mac-updater.app")
+ # plugin launcher
+ self.path("../llplugin/slplugin/" + self.args['configuration'] + "/SLPlugin.app", "SLPlugin.app")
+
# our apps dependencies on shared libs
if dylibs["llcommon"]:
mac_crash_logger_res_path = self.dst_path_of("mac-crash-logger.app/Contents/Resources")
mac_updater_res_path = self.dst_path_of("mac-updater.app/Contents/Resources")
+ slplugin_res_path = self.dst_path_of("SLPlugin.app/Contents/Resources")
for libfile in ("libllcommon.dylib",
"libapr-1.0.3.7.dylib",
"libaprutil-1.0.3.8.dylib",
- "libexpat.0.5.0.dylib"):
+ "libexpat.0.5.0.dylib",
+ "libexception_handler.dylib",
+ ):
target_lib = os.path.join('../../..', libfile)
self.run_command("ln -sf %(target)r %(link)r" %
{'target': target_lib,
@@ -656,9 +677,10 @@ class DarwinManifest(ViewerManifest):
{'target': target_lib,
'link' : os.path.join(mac_updater_res_path, libfile)}
)
-
- # plugin launcher
- self.path("../llplugin/slplugin/" + self.args['configuration'] + "/SLPlugin", "SLPlugin")
+ self.run_command("ln -sf %(target)r %(link)r" %
+ {'target': target_lib,
+ 'link' : os.path.join(slplugin_res_path, libfile)}
+ )
# plugins
if self.prefix(src="", dst="llplugin"):
@@ -686,7 +708,7 @@ class DarwinManifest(ViewerManifest):
def package_finish(self):
- channel_standin = 'Second Life' # hah, our default channel is not usable on its own
+ channel_standin = 'Second Life Viewer 2' # hah, our default channel is not usable on its own
if not self.default_channel():
channel_standin = self.channel()
@@ -716,55 +738,72 @@ class DarwinManifest(ViewerManifest):
# mount the image and get the name of the mount point and device node
hdi_output = self.run_command('hdiutil attach -private %r' % sparsename)
- devfile = re.search("/dev/disk([0-9]+)[^s]", hdi_output).group(0).strip()
- volpath = re.search('HFS\s+(.+)', hdi_output).group(1).strip()
+ try:
+ devfile = re.search("/dev/disk([0-9]+)[^s]", hdi_output).group(0).strip()
+ volpath = re.search('HFS\s+(.+)', hdi_output).group(1).strip()
- # Copy everything in to the mounted .dmg
+ # Copy everything in to the mounted .dmg
- if self.default_channel() and not self.default_grid():
- app_name = "Second Life " + self.args['grid']
- else:
- app_name = channel_standin.strip()
-
- # Hack:
- # Because there is no easy way to coerce the Finder into positioning
- # the app bundle in the same place with different app names, we are
- # adding multiple .DS_Store files to svn. There is one for release,
- # one for release candidate and one for first look. Any other channels
- # will use the release .DS_Store, and will look broken.
- # - Ambroff 2008-08-20
- dmg_template = os.path.join(
- 'installers',
- 'darwin',
- '%s-dmg' % "".join(self.channel_unique().split()).lower())
-
- if not os.path.exists (self.src_path_of(dmg_template)):
- dmg_template = os.path.join ('installers', 'darwin', 'release-dmg')
-
- for s,d in {self.get_dst_prefix():app_name + ".app",
- os.path.join(dmg_template, "_VolumeIcon.icns"): ".VolumeIcon.icns",
- os.path.join(dmg_template, "background.jpg"): "background.jpg",
- os.path.join(dmg_template, "_DS_Store"): ".DS_Store"}.items():
- print "Copying to dmg", s, d
- self.copy_action(self.src_path_of(s), os.path.join(volpath, d))
-
- # Hide the background image, DS_Store file, and volume icon file (set their "visible" bit)
- for f in ".VolumeIcon.icns", "background.jpg", ".DS_Store":
- self.run_command('SetFile -a V %r' % os.path.join(volpath, f))
-
- # Create the alias file (which is a resource file) from the .r
- self.run_command('rez %r -o %r' %
- (self.src_path_of("installers/darwin/release-dmg/Applications-alias.r"),
- os.path.join(volpath, "Applications")))
-
- # Set the alias file's alias and custom icon bits
- self.run_command('SetFile -a AC %r' % os.path.join(volpath, "Applications"))
-
- # Set the disk image root's custom icon bit
- self.run_command('SetFile -a C %r' % volpath)
-
- # Unmount the image
- self.run_command('hdiutil detach -force %r' % devfile)
+ if self.default_channel() and not self.default_grid():
+ app_name = "Second Life " + self.args['grid']
+ else:
+ app_name = channel_standin.strip()
+
+ # Hack:
+ # Because there is no easy way to coerce the Finder into positioning
+ # the app bundle in the same place with different app names, we are
+ # adding multiple .DS_Store files to svn. There is one for release,
+ # one for release candidate and one for first look. Any other channels
+ # will use the release .DS_Store, and will look broken.
+ # - Ambroff 2008-08-20
+ dmg_template = os.path.join(
+ 'installers',
+ 'darwin',
+ '%s-dmg' % "".join(self.channel_unique().split()).lower())
+
+ if not os.path.exists (self.src_path_of(dmg_template)):
+ dmg_template = os.path.join ('installers', 'darwin', 'release-dmg')
+
+ for s,d in {self.get_dst_prefix():app_name + ".app",
+ os.path.join(dmg_template, "_VolumeIcon.icns"): ".VolumeIcon.icns",
+ os.path.join(dmg_template, "background.jpg"): "background.jpg",
+ os.path.join(dmg_template, "_DS_Store"): ".DS_Store"}.items():
+ print "Copying to dmg", s, d
+ self.copy_action(self.src_path_of(s), os.path.join(volpath, d))
+
+ # Hide the background image, DS_Store file, and volume icon file (set their "visible" bit)
+ for f in ".VolumeIcon.icns", "background.jpg", ".DS_Store":
+ pathname = os.path.join(volpath, f)
+ # We've observed mysterious "no such file" failures of the SetFile
+ # command, especially on the first file listed above -- yet
+ # subsequent inspection of the target directory confirms it's
+ # there. Timing problem with copy command? Try to handle.
+ for x in xrange(3):
+ if os.path.exists(pathname):
+ print "Confirmed existence: %r" % pathname
+ break
+ print "Waiting for %s copy command to complete (%s)..." % (f, x+1)
+ sys.stdout.flush()
+ time.sleep(1)
+ # If we fall out of the loop above without a successful break, oh
+ # well, possibly we've mistaken the nature of the problem. In any
+ # case, don't hang up the whole build looping indefinitely, let
+ # the original problem manifest by executing the desired command.
+ self.run_command('SetFile -a V %r' % pathname)
+
+ # Create the alias file (which is a resource file) from the .r
+ self.run_command('rez %r -o %r' %
+ (self.src_path_of("installers/darwin/release-dmg/Applications-alias.r"),
+ os.path.join(volpath, "Applications")))
+
+ # Set the alias file's alias and custom icon bits
+ self.run_command('SetFile -a AC %r' % os.path.join(volpath, "Applications"))
+
+ # Set the disk image root's custom icon bit
+ self.run_command('SetFile -a C %r' % volpath)
+ finally:
+ # Unmount the image even if exceptions from any of the above
+ self.run_command('hdiutil detach -force %r' % devfile)
print "Converting temp disk image to final disk image"
self.run_command('hdiutil convert %(sparse)r -format UDZO -imagekey zlib-level=9 -o %(final)r' % {'sparse':sparsename, 'final':finalname})
@@ -854,16 +893,10 @@ class Linux_i686Manifest(LinuxManifest):
print "Skipping %s - not found" % libfile
pass
-
- if(self.args['buildtype'].lower() == 'release'):
- print "* packaging stripped viewer binary."
- self.path("secondlife-stripped","bin/do-not-directly-run-secondlife-bin")
- else:
- print "* packaging un-stripped viewer binary."
- self.path("secondlife-bin","bin/do-not-directly-run-secondlife-bin")
+ self.path("secondlife-bin","bin/do-not-directly-run-secondlife-bin")
- self.path("../linux_crash_logger/linux-crash-logger-stripped","bin/linux-crash-logger.bin")
- self.path("../linux_updater/linux-updater-stripped", "bin/linux-updater.bin")
+ self.path("../linux_crash_logger/linux-crash-logger","bin/linux-crash-logger.bin")
+ self.path("../linux_updater/linux-updater", "bin/linux-updater.bin")
self.path("../llplugin/slplugin/SLPlugin", "bin/SLPlugin")
if self.prefix("res-sdl"):
self.path("*")
@@ -882,6 +915,7 @@ class Linux_i686Manifest(LinuxManifest):
if self.prefix("../../libraries/i686-linux/lib_release_client", dst="lib"):
self.path("libapr-1.so.0")
self.path("libaprutil-1.so.0")
+ self.path("libbreakpad_client.so.0.0.0", "libbreakpad_client.so.0")
self.path("libdb-4.2.so")
self.path("libcrypto.so.0.9.7")
self.path("libexpat.so.1")
@@ -914,23 +948,16 @@ 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") # no - we'll re-use the viewer's own OAL lib
+ #self.path("libvivoxoal.so.1") # no - we'll re-use the viewer's own OpenAL lib
self.path("libvivoxsdk.so")
self.path("libvivoxplatform.so")
self.end_prefix("lib")
-class Linux_x86_64Manifest(LinuxManifest):
- def construct(self):
- super(Linux_x86_64Manifest, self).construct()
- self.path("secondlife-stripped","bin/do-not-directly-run-secondlife-bin")
- self.path("../linux_crash_logger/linux-crash-logger-stripped","linux-crash-logger.bin")
- if self.prefix("res-sdl"):
- self.path("*")
- # recurse
- self.end_prefix("res-sdl")
+ if self.args['buildtype'].lower() == 'release' and self.is_packaging_viewer():
+ print "* Going strip-crazy on the packaged binaries, since this is a RELEASE build"
+ self.run_command("find %(d)r/bin %(d)r/lib -type f | xargs --no-run-if-empty strip -S" % {'d': self.get_dst_prefix()} ) # makes some small assumptions about our packaged dir structure
- self.path("featuretable_linux.txt")
- self.path("secondlife-i686.supp")
+################################################################
if __name__ == "__main__":
main()
diff --git a/indra/test/CMakeLists.txt b/indra/test/CMakeLists.txt
index c1360987a5..66c78a86c4 100644
--- a/indra/test/CMakeLists.txt
+++ b/indra/test/CMakeLists.txt
@@ -13,6 +13,7 @@ include(LLXML)
include(LScript)
include(Linking)
include(Tut)
+include(LLAddBuildTest)
include(GoogleMock)
@@ -30,7 +31,7 @@ include_directories(
set(test_SOURCE_FILES
io.cpp
-# llapp_tut.cpp # Temporarily removed until thread issues can be solved
+# llapp_tut.cpp # Temporarily removed until thread issues can be solved
llblowfish_tut.cpp
llbuffer_tut.cpp
lldoubledispatch_tut.cpp
@@ -117,19 +118,12 @@ endif (WINDOWS)
get_target_property(TEST_EXE test LOCATION)
-IF(WINDOWS)
- set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR})
-ELSEIF(DARWIN)
- set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/Resources:/usr/lib)
-ELSE(WINDOWS)
- set(LD_LIBRARY_PATH ${SHARED_LIB_STAGING_DIR}:/usr/lib)
-ENDIF(WINDOWS)
-
-LL_TEST_COMMAND("${LD_LIBRARY_PATH}"
+SET_TEST_PATH(LD_LIBRARY_PATH)
+LL_TEST_COMMAND(command "${LD_LIBRARY_PATH}"
"${TEST_EXE}" "--output=${CMAKE_CURRENT_BINARY_DIR}/cpp_test_results.txt" "--touch=${CMAKE_CURRENT_BINARY_DIR}/cpp_tests_ok.txt")
ADD_CUSTOM_COMMAND(
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/cpp_tests_ok.txt
- COMMAND ${LL_TEST_COMMAND_value}
+ COMMAND ${command}
DEPENDS test
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMENT "C++ unit tests"
diff --git a/indra/test/llpermissions_tut.cpp b/indra/test/llpermissions_tut.cpp
index 4eadc64b5a..d5795ef4a0 100644
--- a/indra/test/llpermissions_tut.cpp
+++ b/indra/test/llpermissions_tut.cpp
@@ -61,7 +61,7 @@ namespace tut
uuid2 == LLUUID::null && uuid3 == LLUUID::null));
ensure("LLPermission Get Functions failed", (permissions.getMaskBase() == PERM_ALL && permissions.getMaskOwner() == PERM_ALL &&
permissions.getMaskGroup() == PERM_ALL && permissions.getMaskEveryone() == PERM_ALL && permissions.getMaskNextOwner() == PERM_ALL));
- ensure("Ownership functions failed", (permissions.isGroupOwned() == FALSE && permissions.isOwned() == FALSE));
+ ensure("Ownership functions failed", ((! permissions.isGroupOwned()) && (! permissions.isOwned())));
}
template<> template<>
@@ -204,7 +204,7 @@ namespace tut
LLPermissions perm1;
LLUUID uuid;
BOOL is_group_owned = FALSE;
- ensure("1:getOwnership:failed ", (FALSE == perm1.getOwnership(uuid,is_group_owned)));
+ ensure("1:getOwnership:failed ", ! perm1.getOwnership(uuid,is_group_owned));
LLPermissions perm;
LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");
@@ -213,11 +213,11 @@ namespace tut
LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");
perm.init(creator,owner,lastOwner,group);
perm.getOwnership(uuid,is_group_owned);
- ensure("2:getOwnership:failed ", ((uuid == owner) && (FALSE == is_group_owned)));
+ ensure("2:getOwnership:failed ", ((uuid == owner) && (! is_group_owned)));
perm.init(creator,LLUUID::null,lastOwner,group);
perm.getOwnership(uuid,is_group_owned);
- ensure("3:getOwnership:failed ", ((uuid == group) && (TRUE == is_group_owned)));
+ ensure("3:getOwnership:failed ", ((uuid == group) && is_group_owned));
}
template<> template<>
@@ -240,17 +240,17 @@ namespace tut
LLUUID agent("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");
LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806");
LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");
- bool is_atomic = TRUE;
- ensure("setOwnerAndGroup():failed ", (TRUE == perm.setOwnerAndGroup(agent,owner,group,is_atomic)));
+ bool is_atomic = true;
+ ensure("setOwnerAndGroup():failed ", perm.setOwnerAndGroup(agent,owner,group,is_atomic));
LLUUID owner2("68edcf47-ccd7-45b8-9f90-1649d7f12807");
LLUUID group2("9c8eca51-53d5-42a7-bb58-cef070395db9");
// cant change - agent need to be current owner
- ensure("setOwnerAndGroup():failed ", (FALSE == perm.setOwnerAndGroup(agent,owner2,group2,is_atomic)));
+ ensure("setOwnerAndGroup():failed ", ! perm.setOwnerAndGroup(agent,owner2,group2,is_atomic));
// should be able to change - agent and owner same as current owner
- ensure("setOwnerAndGroup():failed ", (TRUE == perm.setOwnerAndGroup(owner,owner,group2,is_atomic)));
+ ensure("setOwnerAndGroup():failed ", perm.setOwnerAndGroup(owner,owner,group2,is_atomic));
}
template<> template<>
@@ -259,7 +259,7 @@ namespace tut
LLPermissions perm;
LLUUID agent;
LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");
- ensure("deedToGroup():failed ", (TRUE == perm.deedToGroup(agent,group)));
+ ensure("deedToGroup():failed ", perm.deedToGroup(agent,group));
}
template<> template<>
void permission_object_t::test<11>()
@@ -268,12 +268,12 @@ namespace tut
LLUUID agent;
BOOL set = 1;
U32 bits = PERM_TRANSFER | PERM_MODIFY;
- ensure("setBaseBits():failed ", (TRUE == perm.setBaseBits(agent, set, bits)));
- ensure("setOwnerBits():failed ", (TRUE == perm.setOwnerBits(agent, set, bits)));
+ ensure("setBaseBits():failed ", perm.setBaseBits(agent, set, bits));
+ ensure("setOwnerBits():failed ", perm.setOwnerBits(agent, set, bits));
LLUUID agent1("9c8eca51-53d5-42a7-bb58-cef070395db8");
- ensure("setBaseBits():failed ", (FALSE == perm.setBaseBits(agent1, set, bits)));
- ensure("setOwnerBits():failed ", (FALSE == perm.setOwnerBits(agent1, set, bits)));
+ ensure("setBaseBits():failed ", ! perm.setBaseBits(agent1, set, bits));
+ ensure("setOwnerBits():failed ", ! perm.setOwnerBits(agent1, set, bits));
}
template<> template<>
@@ -284,14 +284,14 @@ namespace tut
LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");
BOOL set = 1;
U32 bits = 10;
- ensure("setGroupBits():failed ", (TRUE == perm.setGroupBits(agent,group, set, bits)));
- ensure("setEveryoneBits():failed ", (TRUE == perm.setEveryoneBits(agent,group, set, bits)));
- ensure("setNextOwnerBits():failed ", (TRUE == perm.setNextOwnerBits(agent,group, set, bits)));
-
- LLUUID agent1("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");
- ensure("setGroupBits():failed ", (FALSE == perm.setGroupBits(agent1,group, set, bits)));
- ensure("setEveryoneBits():failed ", (FALSE == perm.setEveryoneBits(agent1,group, set, bits)));
- ensure("setNextOwnerBits():failed ", (FALSE == perm.setNextOwnerBits(agent1,group, set, bits)));
+ ensure("setGroupBits():failed ", perm.setGroupBits(agent,group, set, bits));
+ ensure("setEveryoneBits():failed ", perm.setEveryoneBits(agent,group, set, bits));
+ ensure("setNextOwnerBits():failed ", perm.setNextOwnerBits(agent,group, set, bits));
+
+ LLUUID agent1("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");
+ ensure("setGroupBits():failed ", ! perm.setGroupBits(agent1,group, set, bits));
+ ensure("setEveryoneBits():failed ", ! perm.setEveryoneBits(agent1,group, set, bits));
+ ensure("setNextOwnerBits():failed ", ! perm.setNextOwnerBits(agent1,group, set, bits));
}
template<> template<>
@@ -301,14 +301,14 @@ namespace tut
LLUUID agent;
LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");
U32 bits = 10;
- ensure("allowOperationBy():failed ", (TRUE == perm.allowOperationBy(bits,agent,group)));
+ ensure("allowOperationBy():failed ", perm.allowOperationBy(bits,agent,group));
LLUUID agent1("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");
LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");
LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806");
LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d");
perm.init(creator,owner,lastOwner,group);
- ensure("allowOperationBy():failed ", (TRUE == perm.allowOperationBy(bits,agent1,group)));
+ ensure("allowOperationBy():failed ", perm.allowOperationBy(bits,agent1,group));
}
template<> template<>
@@ -321,15 +321,12 @@ namespace tut
LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");
perm.init(creator,owner,lastOwner,group);
LLUUID agent;
- ensure("1:allowModifyBy():failed ", (TRUE == perm.allowModifyBy(agent)));
- ensure("2:allowModifyBy():failed ", (TRUE == perm.allowModifyBy(agent,group)));
+ ensure("1:allowModifyBy():failed ", perm.allowModifyBy(agent));
+ ensure("2:allowModifyBy():failed ", perm.allowModifyBy(agent,group));
- U32 val1 = 0x7FFFFFFF;
- S32 sVal = 1 << 14;
- sVal = val1 & sVal;
LLUUID agent1("9c8eca51-53d5-42a7-bb58-cef070395db8");
- ensure("3:allowModifyBy():failed ", (sVal == perm.allowModifyBy(agent1)));
- ensure("4:allowModifyBy():failed ", (sVal == perm.allowModifyBy(agent1,group)));
+ ensure("3:allowModifyBy():failed ", perm.allowModifyBy(agent1));
+ ensure("4:allowModifyBy():failed ", perm.allowModifyBy(agent1,group));
}
template<> template<>
@@ -342,15 +339,12 @@ namespace tut
LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");
perm.init(creator,owner,lastOwner,group);
LLUUID agent;
- ensure("1:allowCopyBy():failed ", (TRUE == perm.allowModifyBy(agent)));
- ensure("2:allowCopyBy():failed ", (TRUE == perm.allowModifyBy(agent,group)));
+ ensure("1:allowCopyBy():failed ", perm.allowModifyBy(agent));
+ ensure("2:allowCopyBy():failed ", perm.allowModifyBy(agent,group));
- U32 val1 = 0x7FFFFFFF;
- S32 sVal = 1 << 15;
- sVal = val1 & sVal;
LLUUID agent1("9c8eca51-53d5-42a7-bb58-cef070395db8");
- ensure("3:allowCopyBy():failed ", (sVal == perm.allowCopyBy(agent1)));
- ensure("4:allowCopyBy():failed ", (sVal == perm.allowCopyBy(agent1,group)));
+ ensure("3:allowCopyBy():failed ", perm.allowCopyBy(agent1));
+ ensure("4:allowCopyBy():failed ", perm.allowCopyBy(agent1,group));
}
template<> template<>
@@ -363,15 +357,12 @@ namespace tut
LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");
perm.init(creator,owner,lastOwner,group);
LLUUID agent;
- ensure("1:allowMoveBy():failed ", (TRUE == perm.allowMoveBy(agent)));
- ensure("2:allowMoveBy():failed ", (TRUE == perm.allowMoveBy(agent,group)));
+ ensure("1:allowMoveBy():failed ", perm.allowMoveBy(agent));
+ ensure("2:allowMoveBy():failed ", perm.allowMoveBy(agent,group));
- U32 val1 = 0x7FFFFFFF;
- S32 sVal = 1 << 19;
- sVal = val1 & sVal;
LLUUID agent1("9c8eca51-53d5-42a7-bb58-cef070395db8");
- ensure("3:allowMoveBy():failed ", (sVal == perm.allowMoveBy(agent1)));
- ensure("4:allowMoveBy():failed ", (sVal == perm.allowMoveBy(agent1,group)));
+ ensure("3:allowMoveBy():failed ", perm.allowMoveBy(agent1));
+ ensure("4:allowMoveBy():failed ", perm.allowMoveBy(agent1,group));
}
template<> template<>
@@ -383,20 +374,17 @@ namespace tut
LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d");
LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");
LLUUID agent;
- ensure("1:allowMoveBy():failed ", (TRUE == perm.allowTransferTo(agent)));
+ ensure("1:allowMoveBy():failed ", perm.allowTransferTo(agent));
perm.init(creator,owner,lastOwner,group);
- U32 val1 = 0x7FFFFFFF;
- S32 sVal = 1 << 13;
- sVal = val1 & sVal;
- ensure("2:allowMoveBy():failed ", (sVal == perm.allowTransferTo(agent)));
+ ensure("2:allowMoveBy():failed ", perm.allowTransferTo(agent));
}
template<> template<>
void permission_object_t::test<18>()
{
LLPermissions perm,perm1;
- ensure("1:Operator==:failed ", perm == perm1);
+ ensure_equals("1:Operator==:failed ", perm, perm1);
LLUUID creator("abf0d56b-82e5-47a2-a8ad-74741bb2c29e");
LLUUID owner("68edcf47-ccd7-45b8-9f90-1649d7f12806");
@@ -404,7 +392,7 @@ namespace tut
LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");
perm.init(creator,owner,lastOwner,group);
perm = perm1;
- ensure("2:Operator==:failed ", perm == perm1);
+ ensure_equals("2:Operator==:failed ", perm, perm1);
}
template<> template<>
@@ -416,7 +404,7 @@ namespace tut
LLUUID lastOwner("5e47a0dc-97bf-44e0-8b40-de06718cee9d");
LLUUID group("9c8eca51-53d5-42a7-bb58-cef070395db8");
perm.init(creator,owner,lastOwner,group);
- ensure("2:Operator==:failed ", perm != perm1);
+ ensure_not_equals("2:Operator==:failed ", perm, perm1);
}
template<> template<>
@@ -453,7 +441,7 @@ namespace tut
}
perm1.importFile(fp);
fclose(fp);
- ensure("exportFile()/importFile():failed to export and import the data ", perm1 == perm);
+ ensure_equals("exportFile()/importFile():failed to export and import the data ", perm1, perm);
}
template<> template<>
@@ -479,7 +467,7 @@ namespace tut
std::istringstream istream(ostream.str());
perm1.importLegacyStream(istream);
- ensure("exportLegacyStream()/importLegacyStream():failed to export and import the data ", perm1 == perm);
+ ensure_equals("exportLegacyStream()/importLegacyStream():failed to export and import the data ", perm1, perm);
}
template<> template<>
@@ -502,7 +490,7 @@ namespace tut
stream1 << perm;
perm1.init(creator,owner,lastOwner,group);
stream2 << perm1;
- ensure("1:operator << failed",(stream1.str() == stream2.str()));
+ ensure_equals("1:operator << failed", stream1.str(), stream2.str());
}
template<> template<>
@@ -533,19 +521,19 @@ namespace tut
{
LLAggregatePermissions AggrPermission;
LLAggregatePermissions AggrPermission1;
- ensure("getU8() function failed", (AggrPermission.getU8() == 0));
- ensure("isEmpty() function failed", (AggrPermission.isEmpty() == TRUE));
+ ensure_equals("getU8() function failed", AggrPermission.getU8(), 0);
+ ensure("isEmpty() function failed", AggrPermission.isEmpty());
AggrPermission.getValue(PERM_TRANSFER);
ensure_equals("getValue() function failed", AggrPermission.getValue(PERM_TRANSFER), 0x00);
AggrPermission.aggregate(PERM_ITEM_UNRESTRICTED);
- ensure("aggregate() function failed", (AggrPermission.isEmpty() == FALSE));
+ ensure("aggregate() function failed", ! AggrPermission.isEmpty());
AggrPermission1.aggregate(AggrPermission);
- ensure("aggregate() function failed", (AggrPermission1.isEmpty() == FALSE));
+ ensure("aggregate() function failed", ! AggrPermission1.isEmpty());
std::ostringstream stream1;
stream1 << AggrPermission;
- ensure("operator<< failed", (stream1.str() == "{PI_COPY=All, PI_MODIFY=All, PI_TRANSFER=All}"));
+ ensure_equals("operator<< failed", stream1.str(), "{PI_COPY=All, PI_MODIFY=All, PI_TRANSFER=All}");
}
}
diff --git a/indra/test_apps/llplugintest/bookmarks.txt b/indra/test_apps/llplugintest/bookmarks.txt
index b8b83df386..2ff64f217f 100644
--- a/indra/test_apps/llplugintest/bookmarks.txt
+++ b/indra/test_apps/llplugintest/bookmarks.txt
@@ -18,20 +18,20 @@
(Flash) Scribd,http://www.scribd.com/doc/14427744/Second-Life-Quickstart-Guide
(Flash) MAME,http://yvern.com/fMAME/fMAME.html
(QT) Local sample,file:///C|/Program Files/QuickTime/Sample.mov
-(QT) Movie - Watchmen Trailer,http://movies.apple.com/movies/wb/watchmen/watchmen-tlr2_480p.mov
-(QT) Movie - Transformers - Revenge of the Fallen,http://movies.apple.com/movies/paramount/transformers2/transformersrevengeofthefallen-tlr1_h.320.mov
-(QT) Movie - Terminator Salvation,http://movies.apple.com/movies/wb/terminatorsalvation/terminatorsalvation-tlr3_h.320.mov
-(QT) Movie - Angels and Demons,http://movies.apple.com/movies/sony_pictures/angelsanddemons/angelsanddemons-video_h.320.mov
-(QT) Movie - Sin City Trailer,http://movies.apple.com/movies/miramax/sin_city/sin_city_480.mov
-(QT) Movie - The Incredibles Trailer,http://movies.apple.com/movies/disney/the_incredibles/the_incredibles-tlr_a480.mov
+(QT) Movie - Watchmen Trailer,http://trailers.apple.com/movies/wb/watchmen/watchmen-tlr2_480p.mov
+(QT) Movie - Transformers - Revenge of the Fallen,http://trailers.apple.com/movies/paramount/transformers2/transformersrevengeofthefallen-tlr1_h.320.mov
+(QT) Movie - Terminator Salvation,http://trailers.apple.com/movies/wb/terminatorsalvation/terminatorsalvation-tlr3_h.320.mov
+(QT) Movie - Angels and Demons,http://trailers.apple.com/movies/sony_pictures/angelsanddemons/angelsanddemons-video_h.320.mov
+(QT) Movie - Sin City Trailer,http://trailers.apple.com/movies/miramax/sin_city/sin_city_480.mov
+(QT) Movie - The Incredibles Trailer,http://trailers.apple.com/movies/disney/the_incredibles/the_incredibles-tlr_a480.mov
(QT) Movie - Streaming Apple Event,http://stream.qtv.apple.com/events/mar/0903lajkszg/m_090374535329zdwg_650_ref.mov
(QT) Movie - MPEG-4 from Amazon S3,http://s3.amazonaws.com/callum-linden/flashdemo/interactive_flash_demo.mp4
-(QT) Movie - Star Trek,http://movies.apple.com/movies/paramount/star_trek/startrek-tlr3_h.320.mov
-(QT) Movie - Ice Age 3,http://movies.apple.com/movies/fox/ice_age_iii/iceage3-tlrd_h.320.mov
-(QT) Movie - AstroBoy,http://movies.apple.com/movies/summit/astroboy/astroboy-tsr_h.320.mov
-(QT) Movie - Ante Up,http://movies.apple.com/movies/independent/anteup/anteup_h.320.mov
-(QT) Movie - Every Little Step,http://movies.apple.com/movies/sony/everylittlestep/everylittlestep-clip_h.320.mov
-(QT) Movie - The Informers,http://movies.apple.com/movies/independent/theinformers/theinformers_h.320.mov
+(QT) Movie - Star Trek,http://trailers.apple.com/movies/paramount/star_trek/startrek-tlr3_h.320.mov
+(QT) Movie - Ice Age 3,http://trailers.apple.com/movies/fox/ice_age_iii/iceage3-tlrd_h.320.mov
+(QT) Movie - AstroBoy,http://trailers.apple.com/movies/summit/astroboy/astroboy-tsr_h.320.mov
+(QT) Movie - Ante Up,http://trailers.apple.com/movies/independent/anteup/anteup_h.320.mov
+(QT) Movie - Every Little Step,http://trailers.apple.com/movies/sony/everylittlestep/everylittlestep-clip_h.320.mov
+(QT) Movie - The Informers,http://trailers.apple.com/movies/independent/theinformers/theinformers_h.320.mov
(QT) Animated GIF,http://upload.wikimedia.org/wikipedia/commons/4/44/Optical.greysquares.arp-animated.gif
(QT) Apple Text Descriptors,http://ubrowser.com/tmp/apple_text.txt
(EX) Example Plugin,example://blah
diff --git a/indra/test_apps/llplugintest/llmediaplugintest.cpp b/indra/test_apps/llplugintest/llmediaplugintest.cpp
index d183aac208..7a544debb2 100644
--- a/indra/test_apps/llplugintest/llmediaplugintest.cpp
+++ b/indra/test_apps/llplugintest/llmediaplugintest.cpp
@@ -66,11 +66,11 @@ static void gluiCallbackWrapper( int control_id );
static bool isTexture( GLuint texture )
{
bool result = false;
-
+
// glIsTexture will sometimes return false for real textures... do this instead.
if(texture != 0)
result = true;
-
+
return result;
}
@@ -95,24 +95,24 @@ mediaPanel::~mediaPanel()
glDeleteTextures( 1, &mPickTextureHandle );
mPickTextureHandle = 0;
}
-
+
if ( isTexture( mMediaTextureHandle ) )
{
std::cerr << "remMediaPanel: deleting media texture " << mMediaTextureHandle << std::endl;
glDeleteTextures( 1, &mMediaTextureHandle );
mMediaTextureHandle = 0;
}
-
+
if(mPickTexturePixels)
{
delete mPickTexturePixels;
}
-
+
if(mMediaSource)
{
delete mMediaSource;
}
-
+
}
////////////////////////////////////////////////////////////////////////////////
@@ -128,6 +128,7 @@ LLMediaPluginTest::LLMediaPluginTest( int app_window, int window_width, int wind
mCurMouseY( 0 ),
mFuzzyMedia( true ),
mSelectedPanel( 0 ),
+ mDistanceCameraToSelectedGeometry( 0.0f ),
mMediaBrowserControlEnableCookies( 0 ),
mMediaBrowserControlBackButton( 0 ),
mMediaBrowserControlForwardButton( 0 ),
@@ -151,7 +152,7 @@ LLMediaPluginTest::LLMediaPluginTest( int app_window, int window_width, int wind
//mBookmarks.push_back( std::pair< std::string, std::string >( "description", "url" ) );
// read bookmarks from file.
- // note: uses command in ./CmakeLists.txt which copies bookmmarks file from source directory
+ // note: uses command in ./CmakeLists.txt which copies bookmmarks file from source directory
// to app directory (WITHOUT build configuration dir) (this is cwd in Windows within MSVC)
// For example, test_apps\llplugintest and not test_apps\llplugintest\Release
// This may need to be changed for Mac/Linux builds.
@@ -193,7 +194,7 @@ LLMediaPluginTest::LLMediaPluginTest( int app_window, int window_width, int wind
// initialize linden lab APR module
ll_init_apr();
- // Set up llerror logging
+ // Set up llerror logging
{
LLError::initForApplication(".");
LLError::setDefaultLevel(LLError::LEVEL_INFO);
@@ -240,6 +241,9 @@ LLMediaPluginTest::~LLMediaPluginTest()
{
remMediaPanel( mMediaPanels[ i ] );
};
+
+ // Stop the plugin read thread if it's running.
+ LLPluginProcessParent::setUseReadThread(false);
}
////////////////////////////////////////////////////////////////////////////////
@@ -273,7 +277,7 @@ void LLMediaPluginTest::reshape( int width, int height )
void LLMediaPluginTest::bindTexture(GLuint texture, GLint row_length, GLint alignment)
{
glEnable( GL_TEXTURE_2D );
-
+
glBindTexture( GL_TEXTURE_2D, texture );
glPixelStorei( GL_UNPACK_ROW_LENGTH, row_length );
glPixelStorei( GL_UNPACK_ALIGNMENT, alignment );
@@ -285,27 +289,57 @@ bool LLMediaPluginTest::checkGLError(const char *name)
{
bool result = false;
GLenum error = glGetError();
-
+
if(error != GL_NO_ERROR)
{
// For some reason, glGenTextures is returning GL_INVALID_VALUE...
std::cout << name << " ERROR 0x" << std::hex << error << std::dec << std::endl;
result = true;
}
-
+
return result;
}
////////////////////////////////////////////////////////////////////////////////
//
-void LLMediaPluginTest::drawGeometry( int panel )
+GLfloat LLMediaPluginTest::distanceToCamera( GLfloat point_x, GLfloat point_y, GLfloat point_z )
+{
+ GLdouble camera_pos_x = 0.0f;
+ GLdouble camera_pos_y = 0.0f;
+ GLdouble camera_pos_z = 0.0f;
+
+ GLdouble modelMatrix[16];
+ GLdouble projMatrix[16];
+ GLint viewport[4];
+
+ glGetDoublev(GL_MODELVIEW_MATRIX, modelMatrix);
+ glGetDoublev(GL_PROJECTION_MATRIX, projMatrix);
+ glGetIntegerv(GL_VIEWPORT, viewport);
+
+ gluUnProject(
+ (viewport[2]-viewport[0])/2 , (viewport[3]-viewport[1])/2,
+ 0.0,
+ modelMatrix, projMatrix, viewport,
+ &camera_pos_x, &camera_pos_y, &camera_pos_z );
+
+ GLfloat distance =
+ sqrt( ( camera_pos_x - point_x ) * ( camera_pos_x - point_x ) +
+ ( camera_pos_y - point_y ) * ( camera_pos_y - point_y ) +
+ ( camera_pos_z - point_z ) * ( camera_pos_z - point_z ) );
+
+ return distance;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+void LLMediaPluginTest::drawGeometry( int panel, bool selected )
{
// texture coordinates for each panel
GLfloat non_opengl_texture_coords[ 8 ] = { 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 0.0f };
GLfloat opengl_texture_coords[ 8 ] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f };
-
+
GLfloat *texture_coords = mMediaPanels[ panel ]->mAppTextureCoordsOpenGL?opengl_texture_coords:non_opengl_texture_coords;
-
+
// base coordinates for each panel
GLfloat base_vertex_pos[ 8 ] = { 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f };
@@ -316,31 +350,35 @@ void LLMediaPluginTest::drawGeometry( int panel )
const int panel_x = ( panel / num_rows );
const int panel_y = ( panel % num_rows );
- const float spacing = 0.1f;
+ // default spacing is small - make it larger if checkbox set - for testing positional audio
+ float spacing = 0.1f;
+ if ( mLargePanelSpacing )
+ spacing = 2.0f;
+
const GLfloat offset_x = num_cols * ( 1.0 + spacing ) / 2;
const GLfloat offset_y = num_rows * ( 1.0 + spacing ) / 2;
-
+
// Adjust for media aspect ratios
- {
+ {
float aspect = 1.0f;
if(mMediaPanels[ panel ]->mMediaHeight != 0)
{
aspect = (float)mMediaPanels[ panel ]->mMediaWidth / (float)mMediaPanels[ panel ]->mMediaHeight;
}
-
+
if(aspect > 1.0f)
{
// media is wider than it is high -- adjust the top and bottom in
for( int corner = 0; corner < 4; ++corner )
{
float temp = base_vertex_pos[corner * 2 + 1];
-
+
if(temp < 0.5f)
temp += 0.5 - (0.5f / aspect);
else
temp -= 0.5 - (0.5f / aspect);
-
+
base_vertex_pos[corner * 2 + 1] = temp;
}
}
@@ -350,7 +388,7 @@ void LLMediaPluginTest::drawGeometry( int panel )
for( int corner = 0; corner < 4; ++corner )
{
float temp = base_vertex_pos[corner * 2];
-
+
if(temp < 0.5f)
temp += 0.5f - (0.5f * aspect);
else
@@ -371,6 +409,15 @@ void LLMediaPluginTest::drawGeometry( int panel )
glVertex3f( x, y, 0.0f );
};
glEnd();
+
+ // calculate distance to this panel if it's selected
+ if ( selected )
+ {
+ GLfloat point_x = base_vertex_pos[ 0 ] + panel_x * ( 1.0 + spacing ) - offset_x + spacing / 2.0f;
+ GLfloat point_y = base_vertex_pos[ 0 + 1 ] + panel_y * ( 1.0 + spacing ) - offset_y + spacing / 2.0f;
+ GLfloat point_z = 0.0f;
+ mDistanceCameraToSelectedGeometry = distanceToCamera( point_x, point_y, point_z );
+ };
}
//////////////////////////////////////////////////////////////////////////////
@@ -403,7 +450,7 @@ void LLMediaPluginTest::draw( int draw_type )
if ( draw_type == DrawTypePickTexture )
{
// only bother with pick if we have something to render
- // Actually, we need to pick even if we're not ready to render.
+ // Actually, we need to pick even if we're not ready to render.
// Otherwise you can't select and remove a panel which has gone bad.
//if ( mMediaPanels[ panel ]->mReadyToRender )
{
@@ -420,7 +467,7 @@ void LLMediaPluginTest::draw( int draw_type )
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
// draw geometry using pick texture
- drawGeometry( panel );
+ drawGeometry( panel, false );
glMatrixMode( GL_TEXTURE );
glPopMatrix();
@@ -431,13 +478,13 @@ void LLMediaPluginTest::draw( int draw_type )
{
bool texture_valid = false;
bool plugin_exited = false;
-
+
if(mMediaPanels[ panel ]->mMediaSource)
{
texture_valid = mMediaPanels[ panel ]->mMediaSource->textureValid();
plugin_exited = mMediaPanels[ panel ]->mMediaSource->isPluginExited();
}
-
+
// save texture matrix (changes for each panel)
glMatrixMode( GL_TEXTURE );
glPushMatrix();
@@ -465,14 +512,14 @@ void LLMediaPluginTest::draw( int draw_type )
mMediaPanels[ panel ]->mTextureScaleY,
1.0f );
};
-
+
float intensity = plugin_exited?0.25f:1.0f;
-
+
// highlight the selected panel
if ( mSelectedPanel && ( mMediaPanels[ panel ]->mId == mSelectedPanel->mId ) )
{
startPanelHighlight( intensity, intensity, 0.0f, 5.0f );
- drawGeometry( panel );
+ drawGeometry( panel, true );
endPanelHighlight();
}
else
@@ -481,21 +528,21 @@ void LLMediaPluginTest::draw( int draw_type )
if ( !mMediaPanels[ panel ]->mReadyToRender )
{
startPanelHighlight( intensity, 0.0f, 0.0f, 2.0f );
- drawGeometry( panel );
+ drawGeometry( panel, false );
endPanelHighlight();
}
else
- // just display a border around the media
+ // just display a border around the media
{
startPanelHighlight( 0.0f, intensity, 0.0f, 2.0f );
- drawGeometry( panel );
+ drawGeometry( panel, false );
endPanelHighlight();
};
-
+
if ( mMediaPanels[ panel ]->mReadyToRender && texture_valid )
{
// draw visual geometry
- drawGeometry( panel );
+ drawGeometry( panel, false );
}
// restore texture matrix (changes for each panel)
@@ -551,7 +598,7 @@ void LLMediaPluginTest::idle()
// GLUI requires this
if ( glutGetWindow() != mAppWindow )
glutSetWindow( mAppWindow );
-
+
// random creation/destruction of panels enabled?
const time_t panel_timeout_time = 5;
if ( mRandomPanelCount )
@@ -704,7 +751,7 @@ void LLMediaPluginTest::idle()
for( int panel_index = 0; panel_index < (int)mMediaPanels.size(); ++panel_index )
{
mediaPanel *panel = mMediaPanels[ panel_index ];
-
+
// call plugins idle function so it can potentially update itself
panel->mMediaSource->idle();
@@ -717,7 +764,7 @@ void LLMediaPluginTest::idle()
//std::cout << "texture invalid, skipping update..." << std::endl;
}
else
- if ( panel &&
+ if ( panel &&
( panel->mMediaWidth != panel->mMediaSource->getWidth() ||
panel->mMediaHeight != panel->mMediaSource->getHeight() ) )
{
@@ -733,7 +780,7 @@ void LLMediaPluginTest::idle()
int y_offset = dirty_rect.mBottom;
int width = dirty_rect.mRight - dirty_rect.mLeft;
int height = dirty_rect.mTop - dirty_rect.mBottom;
-
+
if((dirty_rect.mRight <= panel->mTextureWidth) && (dirty_rect.mTop <= panel->mTextureHeight))
{
// Offset the pixels pointer properly
@@ -752,23 +799,23 @@ void LLMediaPluginTest::idle()
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
};
-
+
checkGLError("glTexParameteri");
-
+
if(panel->mMediaSource->getTextureFormatSwapBytes())
{
glPixelStorei(GL_UNPACK_SWAP_BYTES, 1);
checkGLError("glPixelStorei");
}
-
+
// draw portion that changes into texture
- glTexSubImage2D( GL_TEXTURE_2D, 0,
- x_offset,
+ glTexSubImage2D( GL_TEXTURE_2D, 0,
+ x_offset,
y_offset,
- width,
+ width,
height,
- panel->mMediaSource->getTextureFormatPrimary(),
- panel->mMediaSource->getTextureFormatType(),
+ panel->mMediaSource->getTextureFormatPrimary(),
+ panel->mMediaSource->getTextureFormatType(),
pixels );
if(checkGLError("glTexSubImage2D"))
@@ -788,9 +835,9 @@ void LLMediaPluginTest::idle()
glPixelStorei(GL_UNPACK_SWAP_BYTES, 0);
checkGLError("glPixelStorei");
}
-
+
panel->mMediaSource->resetDirty();
-
+
panel->mReadyToRender = true;
}
else
@@ -811,8 +858,8 @@ void LLMediaPluginTest::idle()
////////////////////////////////////////////////////////////////////////////////
//
-void LLMediaPluginTest::windowPosToTexturePos( int window_x, int window_y,
- int& media_x, int& media_y,
+void LLMediaPluginTest::windowPosToTexturePos( int window_x, int window_y,
+ int& media_x, int& media_y,
int& id )
{
if ( ! mSelectedPanel )
@@ -828,7 +875,7 @@ void LLMediaPluginTest::windowPosToTexturePos( int window_x, int window_y,
// OpenGL app == coordinate system this way
// NOTE: unrelated to settings in plugin - this
// is just for this app
- mCurMouseY = mWindowHeight - window_y;
+ mCurMouseY = mWindowHeight - window_y;
// extract x (0..1023, y (0..1023) and id (0..15) from RGB components
unsigned long pixel_read_color_bits = ( mPixelReadColor[ 0 ] << 16 ) | ( mPixelReadColor[ 1 ] << 8 ) | mPixelReadColor[ 2 ];
@@ -880,14 +927,14 @@ void LLMediaPluginTest::selectPanel( mediaPanel* panel )
mSelectedPanel->mMediaSource->setVolume( 0.0f );
mSelectedPanel->mMediaSource->setPriority( LLPluginClassMedia::PRIORITY_LOW );
};
-
+
mSelectedPanel = panel;
if( mSelectedPanel && mSelectedPanel->mMediaSource )
{
mSelectedPanel->mMediaSource->setVolume( (float)mMediaTimeControlVolume / 100.0f );
mSelectedPanel->mMediaSource->setPriority( LLPluginClassMedia::PRIORITY_NORMAL );
-
+
if(!mSelectedPanel->mStartUrl.empty())
{
mUrlEdit->set_text(const_cast<char*>(mSelectedPanel->mStartUrl.c_str()) );
@@ -900,7 +947,7 @@ void LLMediaPluginTest::selectPanel( mediaPanel* panel )
mediaPanel* LLMediaPluginTest::findMediaPanel( LLPluginClassMedia* source )
{
mediaPanel *result = NULL;
-
+
for( int panel = 0; panel < (int)mMediaPanels.size(); ++panel )
{
if ( mMediaPanels[ panel ]->mMediaSource == source )
@@ -908,7 +955,7 @@ mediaPanel* LLMediaPluginTest::findMediaPanel( LLPluginClassMedia* source )
result = mMediaPanels[ panel ];
}
}
-
+
return result;
}
@@ -1003,6 +1050,11 @@ void LLMediaPluginTest::gluiCallback( int control_id )
}
}
else
+ if ( control_id == mIdUsePluginReadThread )
+ {
+ LLPluginProcessParent::setUseReadThread(mUsePluginReadThread);
+ }
+ else
if ( control_id == mIdControlCrashPlugin )
{
// send message to plugin and ask it to crash
@@ -1066,7 +1118,7 @@ void LLMediaPluginTest::gluiCallback( int control_id )
{
if ( mSelectedPanel )
{
- // get value from spinner
+ // get value from spinner
float seconds_to_seek = mMediaTimeControlSeekSeconds;
mSelectedPanel->mMediaSource->seek( seconds_to_seek );
mSelectedPanel->mMediaSource->start();
@@ -1169,8 +1221,8 @@ void LLMediaPluginTest::keyboard( int key )
exit( 0 );
};
- mSelectedPanel->mMediaSource->keyEvent( LLPluginClassMedia::KEY_EVENT_DOWN, key, 0 );
- mSelectedPanel->mMediaSource->keyEvent( LLPluginClassMedia::KEY_EVENT_UP, key, 0 );
+ mSelectedPanel->mMediaSource->keyEvent( LLPluginClassMedia::KEY_EVENT_DOWN, key, 0 , LLSD());
+ mSelectedPanel->mMediaSource->keyEvent( LLPluginClassMedia::KEY_EVENT_UP, key, 0, LLSD());
};
////////////////////////////////////////////////////////////////////////////////
@@ -1194,7 +1246,7 @@ void LLMediaPluginTest::mouseButton( int button, int state, int x, int y )
windowPosToTexturePos( x, y, media_x, media_y, id );
// only select a panel if we're on a panel
- // (HACK: strictly speaking this rules out clicking on
+ // (HACK: strictly speaking this rules out clicking on
// the origin of a panel but that's very unlikely)
if ( media_x > 0 && media_y > 0 )
{
@@ -1327,18 +1379,18 @@ void LLMediaPluginTest::makeChrome()
mGluiMediaTimeControlWindow->add_column( false );
mIdMediaTimeControlVolume = start_id++;
GLUI_Spinner* spinner = mGluiMediaTimeControlWindow->add_spinner( "Volume", 2, &mMediaTimeControlVolume, mIdMediaTimeControlVolume, gluiCallbackWrapper);
- spinner->set_float_limits( 0, 100 );
+ spinner->set_float_limits( 0, 100 );
mGluiMediaTimeControlWindow->add_column( true );
mIdMediaTimeControlSeekSeconds = start_id++;
spinner = mGluiMediaTimeControlWindow->add_spinner( "", 2, &mMediaTimeControlSeekSeconds, mIdMediaTimeControlSeekSeconds, gluiCallbackWrapper);
- spinner->set_float_limits( 0, 200 );
+ spinner->set_float_limits( 0, 200 );
spinner->set_w( 32 );
spinner->set_speed( 0.025f );
mGluiMediaTimeControlWindow->add_column( false );
mIdMediaTimeControlSeek = start_id++;
mGluiMediaTimeControlWindow->add_button( "SEEK", mIdMediaTimeControlSeek, gluiCallbackWrapper );
mGluiMediaTimeControlWindow->add_column( false );
-
+
// top window - media controls for "browser" media types (e.g. web browser)
mGluiMediaBrowserControlWindow = GLUI_Master.create_glui_subwindow( mAppWindow, GLUI_SUBWINDOW_TOP );
@@ -1385,6 +1437,19 @@ void LLMediaPluginTest::makeChrome()
mDisableTimeout = 0;
glui_window_misc_control->add_checkbox( "Disable plugin timeout", &mDisableTimeout, mIdDisableTimeout, gluiCallbackWrapper );
glui_window_misc_control->set_main_gfx_window( mAppWindow );
+ glui_window_misc_control->add_column( true );
+
+ mIdUsePluginReadThread = start_id++;
+ mUsePluginReadThread = 0;
+ glui_window_misc_control->add_checkbox( "Use plugin read thread", &mUsePluginReadThread, mIdUsePluginReadThread, gluiCallbackWrapper );
+ glui_window_misc_control->set_main_gfx_window( mAppWindow );
+ glui_window_misc_control->add_column( true );
+
+ mIdLargePanelSpacing = start_id++;
+ mLargePanelSpacing = 0;
+ glui_window_misc_control->add_checkbox( "Large Panel Spacing", &mLargePanelSpacing, mIdLargePanelSpacing, gluiCallbackWrapper );
+ glui_window_misc_control->set_main_gfx_window( mAppWindow );
+ glui_window_misc_control->add_column( true );
// bottom window - status
mBottomGLUIWindow = GLUI_Master.create_glui_subwindow( mAppWindow, GLUI_SUBWINDOW_BOTTOM );
@@ -1449,7 +1514,7 @@ void LLMediaPluginTest::makePickTexture( int id, GLuint* texture_handle, unsigne
//
std::string LLMediaPluginTest::mimeTypeFromUrl( std::string& url )
{
- // default to web
+ // default to web
std::string mime_type = "text/html";
// we may need a more advanced MIME type accessor later :-)
@@ -1479,7 +1544,7 @@ std::string LLMediaPluginTest::pluginNameFromMimeType( std::string& mime_type )
else
if ( mime_type == "text/html" )
plugin_name = "media_plugin_webkit.dylib";
-
+
#elif LL_WINDOWS
std::string plugin_name( "media_plugin_null.dll" );
@@ -1523,7 +1588,7 @@ void LLMediaPluginTest::addMediaPanel( std::string url )
// tell the plugin what size we asked for
media_source->setSize( media_width, media_height );
- // Use the launcher start and initialize the plugin
+ // Use the launcher start and initialize the plugin
#if LL_DARWIN || LL_LINUX
std::string launcher_name( "SLPlugin" );
#elif LL_WINDOWS
@@ -1542,8 +1607,8 @@ void LLMediaPluginTest::addMediaPanel( std::string url )
}
std::string user_data_path = std::string( cwd ) + "/";
#endif
-
- media_source->init( launcher_name, plugin_name, false, user_data_path );
+ media_source->setUserDataPath(user_data_path);
+ media_source->init( launcher_name, plugin_name, false );
media_source->setDisableTimeout(mDisableTimeout);
// make a new panel and save parameters
@@ -1580,7 +1645,7 @@ void LLMediaPluginTest::addMediaPanel( std::string url )
// id wasn't found so we can use it
if ( ! id_exists )
{
- panel->mId = nid;
+ panel->mId = nid;
break;
};
};
@@ -1592,7 +1657,7 @@ void LLMediaPluginTest::addMediaPanel( std::string url )
}
else
{
- // now we have the ID we can use it to make the
+ // now we have the ID we can use it to make the
// pick texture (id is baked into texture pixels)
makePickTexture( panel->mId, &panel->mPickTextureHandle, &panel->mPickTexturePixels );
@@ -1615,17 +1680,17 @@ void LLMediaPluginTest::addMediaPanel( std::string url )
void LLMediaPluginTest::updateMediaPanel( mediaPanel* panel )
{
// checkGLError("LLMediaPluginTest::updateMediaPanel");
-
- if ( ! panel )
+
+ if ( ! panel )
return;
-
+
if(!panel->mMediaSource || !panel->mMediaSource->textureValid())
{
panel->mReadyToRender = false;
return;
}
-
- // take a reference copy of the plugin values since they
+
+ // take a reference copy of the plugin values since they
// might change during this lifetime of this function
int plugin_media_width = panel->mMediaSource->getWidth();
int plugin_media_height = panel->mMediaSource->getHeight();
@@ -1633,18 +1698,18 @@ void LLMediaPluginTest::updateMediaPanel( mediaPanel* panel )
int plugin_texture_height = panel->mMediaSource->getBitsHeight();
// If the texture isn't created or the media or texture dimensions changed AND
- // the sizes are valid then we need to delete the old media texture (if necessary)
+ // the sizes are valid then we need to delete the old media texture (if necessary)
// then make a new one.
if ((panel->mMediaTextureHandle == 0 ||
panel->mMediaWidth != plugin_media_width ||
- panel->mMediaHeight != plugin_media_height ||
+ panel->mMediaHeight != plugin_media_height ||
panel->mTextureWidth != plugin_texture_width ||
panel->mTextureHeight != plugin_texture_height) &&
- ( plugin_media_width > 0 && plugin_media_height > 0 &&
+ ( plugin_media_width > 0 && plugin_media_height > 0 &&
plugin_texture_width > 0 && plugin_texture_height > 0 ) )
{
- std::cout << "Valid media size (" << plugin_media_width << " x " << plugin_media_height
- << ") and texture size (" << plugin_texture_width << " x " << plugin_texture_height
+ std::cout << "Valid media size (" << plugin_media_width << " x " << plugin_media_height
+ << ") and texture size (" << plugin_texture_width << " x " << plugin_texture_height
<< ") for panel with ID=" << panel->mId << " - making texture" << std::endl;
// delete old GL texture
@@ -1654,13 +1719,13 @@ void LLMediaPluginTest::updateMediaPanel( mediaPanel* panel )
glDeleteTextures( 1, &panel->mMediaTextureHandle );
panel->mMediaTextureHandle = 0;
}
-
+
std::cerr << "before: pick texture is " << panel->mPickTextureHandle << ", media texture is " << panel->mMediaTextureHandle << std::endl;
-
+
// make a GL texture based on the dimensions the plugin told us
GLuint new_texture = 0;
glGenTextures( 1, &new_texture );
-
+
checkGLError("glGenTextures");
std::cout << "glGenTextures returned " << new_texture << std::endl;
@@ -1679,7 +1744,7 @@ void LLMediaPluginTest::updateMediaPanel( mediaPanel* panel )
std::cerr << "after: pick texture is " << panel->mPickTextureHandle << ", media texture is " << panel->mMediaTextureHandle << std::endl;
};
-
+
// update our record of the media and texture dimensions
// NOTE: do this after we we check for sizes changes
panel->mMediaWidth = plugin_media_width;
@@ -1699,7 +1764,7 @@ void LLMediaPluginTest::updateMediaPanel( mediaPanel* panel )
panel->mAppTextureCoordsOpenGL = panel->mMediaSource->getTextureCoordsOpenGL();
// Check to see if we have enough to render this panel.
- // If we do, set a flag that the display functions use so
+ // If we do, set a flag that the display functions use so
// they only render a panel with media if it's ready.
if ( panel->mMediaWidth < 0 ||
panel->mMediaHeight < 0 ||
@@ -1716,26 +1781,26 @@ void LLMediaPluginTest::updateMediaPanel( mediaPanel* panel )
void LLMediaPluginTest::replaceMediaPanel( mediaPanel* panel, std::string url )
{
// no media panels so we can't change anything - have to add
- if ( mMediaPanels.size() == 0 )
+ if ( mMediaPanels.size() == 0 )
return;
// sanity check
- if ( ! panel )
+ if ( ! panel )
return;
-
+
int index;
for(index = 0; index < (int)mMediaPanels.size(); index++)
{
if(mMediaPanels[index] == panel)
break;
}
-
+
if(index >= (int)mMediaPanels.size())
{
// panel isn't in mMediaPanels
return;
}
-
+
std::cout << "Replacing media panel with index " << panel->mId << std::endl;
int panel_id = panel->mId;
@@ -1760,7 +1825,7 @@ void LLMediaPluginTest::replaceMediaPanel( mediaPanel* panel, std::string url )
// tell the plugin what size we asked for
media_source->setSize( media_width, media_height );
- // Use the launcher start and initialize the plugin
+ // Use the launcher start and initialize the plugin
#if LL_DARWIN || LL_LINUX
std::string launcher_name( "SLPlugin" );
#elif LL_WINDOWS
@@ -1780,7 +1845,8 @@ void LLMediaPluginTest::replaceMediaPanel( mediaPanel* panel, std::string url )
std::string user_data_path = std::string( cwd ) + "/";
#endif
- media_source->init( launcher_name, plugin_name, false, user_data_path );
+ media_source->setUserDataPath(user_data_path);
+ media_source->init( launcher_name, plugin_name, false );
media_source->setDisableTimeout(mDisableTimeout);
// make a new panel and save parameters
@@ -1799,12 +1865,12 @@ void LLMediaPluginTest::replaceMediaPanel( mediaPanel* panel, std::string url )
panel->mAppTextureCoordsOpenGL = false; // really need an 'undefined' state here too
panel->mReadyToRender = false;
- panel->mId = panel_id;
-
+ panel->mId = panel_id;
+
// Replace the entry in the panels array
mMediaPanels[index] = panel;
- // now we have the ID we can use it to make the
+ // now we have the ID we can use it to make the
// pick texture (id is baked into texture pixels)
makePickTexture( panel->mId, &panel->mPickTextureHandle, &panel->mPickTexturePixels );
@@ -1820,7 +1886,7 @@ void LLMediaPluginTest::replaceMediaPanel( mediaPanel* panel, std::string url )
//
void LLMediaPluginTest::getRandomMediaSize( int& width, int& height, std::string mime_type )
{
- // Make a new media source with a random size which we'll either
+ // Make a new media source with a random size which we'll either
// directly or the media plugin will tell us what it wants later.
// Use a random size so we can test support for weird media sizes.
// (Almost everything else will get filled in later once the
@@ -1829,8 +1895,8 @@ void LLMediaPluginTest::getRandomMediaSize( int& width, int& height, std::string
width = ( ( rand() % 170 ) + 30 ) * 4;
height = ( ( rand() % 170 ) + 30 ) * 4;
- // adjust this random size if it's a browser so we get
- // a more useful size for testing..
+ // adjust this random size if it's a browser so we get
+ // a more useful size for testing..
if ( mime_type == "text/html" || mime_type == "example/example" )
{
width = ( ( rand() % 100 ) + 100 ) * 4;
@@ -1843,11 +1909,11 @@ void LLMediaPluginTest::getRandomMediaSize( int& width, int& height, std::string
void LLMediaPluginTest::remMediaPanel( mediaPanel* panel )
{
// always leave one panel
- if ( mMediaPanels.size() == 1 )
+ if ( mMediaPanels.size() == 1 )
return;
// sanity check - don't think this can happen but see above for a case where it might...
- if ( ! panel )
+ if ( ! panel )
return;
std::cout << "Removing media panel with index " << panel->mId << " - total panels = " << mMediaPanels.size() - 1 << std::endl;
@@ -1855,7 +1921,7 @@ void LLMediaPluginTest::remMediaPanel( mediaPanel* panel )
if(mSelectedPanel == panel)
mSelectedPanel = NULL;
- delete panel;
+ delete panel;
// remove from storage list
for( int i = 0; i < (int)mMediaPanels.size(); ++i )
@@ -1867,7 +1933,7 @@ void LLMediaPluginTest::remMediaPanel( mediaPanel* panel )
};
};
- // select the first panel
+ // select the first panel
selectPanel( mMediaPanels[ 0 ] );
}
@@ -1887,26 +1953,28 @@ void LLMediaPluginTest::updateStatusBar()
static bool cached_supports_browser_media = true;
static bool cached_supports_time_media = false;
static int cached_movie_time = -1;
+ static GLfloat cached_distance = -1.0f;
static std::string cached_plugin_version = "";
- if (
+ if (
cached_id == mSelectedPanel->mId &&
cached_media_width == mSelectedPanel->mMediaWidth &&
cached_media_height == mSelectedPanel->mMediaHeight &&
cached_texture_width == mSelectedPanel->mTextureWidth &&
cached_texture_height == mSelectedPanel->mTextureHeight &&
- cached_supports_browser_media == mSelectedPanel->mMediaSource->pluginSupportsMediaBrowser() &&
+ cached_supports_browser_media == mSelectedPanel->mMediaSource->pluginSupportsMediaBrowser() &&
cached_supports_time_media == mSelectedPanel->mMediaSource->pluginSupportsMediaTime() &&
cached_plugin_version == mSelectedPanel->mMediaSource->getPluginVersion() &&
- cached_movie_time == (int)mSelectedPanel->mMediaSource->getCurrentTime()
+ cached_movie_time == (int)mSelectedPanel->mMediaSource->getCurrentTime() &&
+ cached_distance == mDistanceCameraToSelectedGeometry
)
{
- // nothing changed so don't spend time in this shitty function
+ // nothing changed so don't spend time here
return;
};
std::ostringstream stream( "" );
-
+
stream.str( "" );
stream.clear();
@@ -1927,7 +1995,15 @@ void LLMediaPluginTest::updateStatusBar()
stream << " x ";
stream << std::setw( 4 ) << std::setfill( '0' );
stream << mSelectedPanel->mTextureHeight;
+
+ stream << " | ";
+ stream << "Distance: ";
+ stream << std::setw( 6 );
+ stream << std::setprecision( 3 );
+ stream << std::setprecision( 3 );
+ stream << mDistanceCameraToSelectedGeometry;
stream << " | ";
+
if ( mSelectedPanel->mMediaSource->pluginSupportsMediaBrowser() )
stream << "BROWSER";
else
@@ -2005,7 +2081,7 @@ void LLMediaPluginTest::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent e
{
// Uncomment this to make things much, much quieter.
// return;
-
+
switch(event)
{
case MEDIA_EVENT_CONTENT_UPDATED:
@@ -2065,11 +2141,11 @@ void LLMediaPluginTest::handleMediaEvent(LLPluginClassMedia* self, EMediaEvent e
case MEDIA_EVENT_CLICK_LINK_HREF:
std::cerr << "Media event: MEDIA_EVENT_CLICK_LINK_HREF, uri is " << self->getClickURL() << std::endl;
break;
-
+
case MEDIA_EVENT_CLICK_LINK_NOFOLLOW:
std::cerr << "Media event: MEDIA_EVENT_CLICK_LINK_NOFOLLOW, uri is " << self->getClickURL() << std::endl;
break;
-
+
case MEDIA_EVENT_PLUGIN_FAILED:
std::cerr << "Media event: MEDIA_EVENT_PLUGIN_FAILED" << std::endl;
break;
@@ -2195,13 +2271,13 @@ int main( int argc, char* argv[] )
glutSetWindow( app_window_handle );
gApplication = new LLMediaPluginTest( app_window_handle, app_window_width, app_window_height );
-
+
// update at approximately 60hz
int update_ms = 1000 / 60;
-
+
GLUI_Master.set_glutTimerFunc( update_ms, glutIdle, update_ms);
glutMainLoop();
-
+
delete gApplication;
}
diff --git a/indra/test_apps/llplugintest/llmediaplugintest.h b/indra/test_apps/llplugintest/llmediaplugintest.h
index c2b2baba95..5d08e42148 100644
--- a/indra/test_apps/llplugintest/llmediaplugintest.h
+++ b/indra/test_apps/llplugintest/llmediaplugintest.h
@@ -89,7 +89,7 @@ class LLMediaPluginTest : public LLPluginClassMediaOwner
void bindTexture(GLuint texture, GLint row_length = 0, GLint alignment = 1);
bool checkGLError(const char *name = "OpenGL");
- void drawGeometry( int panel );
+ void drawGeometry( int panel, bool selected );
void startPanelHighlight( float red, float green, float blue, float line_width );
void endPanelHighlight();
enum { DrawTypePickTexture, DrawTypeMediaTexture };
@@ -113,6 +113,9 @@ class LLMediaPluginTest : public LLPluginClassMediaOwner
void dumpPanelInfo();
void updateStatusBar();
+ GLfloat distanceToCamera( GLfloat point_x, GLfloat point_y, GLfloat point_z );
+
+
// Inherited from LLPluginClassMediaOwner
/*virtual*/ void handleMediaEvent(LLPluginClassMedia* self, LLPluginClassMediaOwner::EMediaEvent);
@@ -142,6 +145,8 @@ class LLMediaPluginTest : public LLPluginClassMediaOwner
float mViewPos[ 3 ];
float mViewRotation[ 16 ];
+ float mDistanceCameraToSelectedGeometry;
+
int mIdControlAddPanel;
int mIdControlRemPanel;
@@ -159,6 +164,10 @@ class LLMediaPluginTest : public LLPluginClassMediaOwner
int mRandomBookmarks;
int mIdDisableTimeout;
int mDisableTimeout;
+ int mIdUsePluginReadThread;
+ int mUsePluginReadThread;
+ int mIdLargePanelSpacing;
+ int mLargePanelSpacing;
int mIdControlCrashPlugin;
int mIdControlHangPlugin;
int mIdControlExitApp;
diff --git a/indra/viewer_components/login/lllogin.cpp b/indra/viewer_components/login/lllogin.cpp
index b9f61ca7e1..e1922367bf 100644
--- a/indra/viewer_components/login/lllogin.cpp
+++ b/indra/viewer_components/login/lllogin.cpp
@@ -122,29 +122,35 @@ private:
LLSD mAuthResponse, mValidAuthResponse;
};
-void LLLogin::Impl::connect(const std::string& uri, const LLSD& credentials)
+void LLLogin::Impl::connect(const std::string& uri, const LLSD& login_params)
{
+ LL_DEBUGS("LLLogin") << " connect with uri '" << uri << "', login_params " << login_params << LL_ENDL;
+
// Launch a coroutine with our login_() method. Run the coroutine until
// its first wait; at that point, return here.
std::string coroname =
LLCoros::instance().launch("LLLogin::Impl::login_",
- boost::bind(&Impl::login_, this, _1, uri, credentials));
+ boost::bind(&Impl::login_, this, _1, uri, login_params));
+ LL_DEBUGS("LLLogin") << " connected with uri '" << uri << "', login_params " << login_params << LL_ENDL;
}
-void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credentials)
+void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD login_params)
{
- LLSD printable_credentials = credentials;
- if(printable_credentials.has("params")
- && printable_credentials["params"].has("passwd"))
+ try
{
- printable_credentials["params"]["passwd"] = "*******";
- }
+ LLSD printable_params = login_params;
+ //if(printable_params.has("params")
+ // && printable_params["params"].has("passwd"))
+ //{
+ // printable_params["params"]["passwd"] = "*******";
+ //}
LL_DEBUGS("LLLogin") << "Entering coroutine " << LLCoros::instance().getName(self)
- << " with uri '" << uri << "', credentials " << printable_credentials << LL_ENDL;
+ << " with uri '" << uri << "', parameters " << printable_params << LL_ENDL;
// Arriving in SRVRequest state
LLEventStream replyPump("SRVreply", true);
// Should be an array of one or more uri strings.
+
LLSD rewrittenURIs;
{
LLEventTimeout filter(replyPump);
@@ -155,9 +161,9 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential
// *NOTE:Mani - Completely arbitrary default timeout value for SRV request.
F32 seconds_to_timeout = 5.0f;
- if(credentials.has("cfg_srv_timeout"))
+ if(login_params.has("cfg_srv_timeout"))
{
- seconds_to_timeout = credentials["cfg_srv_timeout"].asReal();
+ seconds_to_timeout = login_params["cfg_srv_timeout"].asReal();
}
// If the SRV request times out (e.g. EXT-3934), simulate response: an
@@ -167,9 +173,9 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential
filter.eventAfter(seconds_to_timeout, fakeResponse);
std::string srv_pump_name = "LLAres";
- if(credentials.has("cfg_srv_pump"))
+ if(login_params.has("cfg_srv_pump"))
{
- srv_pump_name = credentials["cfg_srv_pump"].asString();
+ srv_pump_name = login_params["cfg_srv_pump"].asString();
}
// Make request
@@ -194,7 +200,7 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential
urend(rewrittenURIs.endArray());
urit != urend; ++urit)
{
- LLSD request(credentials);
+ LLSD request(login_params);
request["reply"] = loginReplyPump.getName();
request["uri"] = *urit;
std::string status;
@@ -291,8 +297,17 @@ void LLLogin::Impl::login_(LLCoros::self& self, std::string uri, LLSD credential
// to success, add a data/message and data/reason fields.
LLSD error_response;
error_response["reason"] = mAuthResponse["status"];
+ error_response["errorcode"] = mAuthResponse["errorcode"];
error_response["message"] = mAuthResponse["error"];
+ if(mAuthResponse.has("certificate"))
+ {
+ error_response["certificate"] = mAuthResponse["certificate"];
+ }
sendProgressEvent("offline", "fail.login", error_response);
+ }
+ catch (...) {
+ llerrs << "login exception caught" << llendl;
+ }
}
void LLLogin::Impl::disconnect()
diff --git a/indra/win_crash_logger/llcrashloggerwindows.cpp b/indra/win_crash_logger/llcrashloggerwindows.cpp
index c9e01c8418..2884231299 100644
--- a/indra/win_crash_logger/llcrashloggerwindows.cpp
+++ b/indra/win_crash_logger/llcrashloggerwindows.cpp
@@ -299,7 +299,6 @@ void LLCrashLoggerWindows::gatherPlatformSpecificFiles()
// At this point we're responsive enough the user could click the close button
SetCursor(gCursorArrow);
mDebugLog["DisplayDeviceInfo"] = gDXHardware.getDisplayInfo();
- mFileMap["CrashLog"] = gDirUtilp->getExpandedFilename(LL_PATH_LOGS,"SecondLifeException.log");
}
bool LLCrashLoggerWindows::mainLoop()
diff --git a/indra/win_updater/CMakeLists.txt b/indra/win_updater/CMakeLists.txt
index 82347adf20..210486c668 100644
--- a/indra/win_updater/CMakeLists.txt
+++ b/indra/win_updater/CMakeLists.txt
@@ -6,6 +6,13 @@ include(00-Common)
include(LLCommon)
include(Linking)
+# *HACK - override msvcrt implementation (intialized on 00-Common) to be
+# statically linked for the installer this relies on vc taking the last flag on
+# the command line
+set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
+set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /MT")
+set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT")
+
include_directories(
${LLCOMMON_INCLUDE_DIRS}
)
@@ -30,9 +37,9 @@ target_link_libraries(windows-updater
set_target_properties(windows-updater
PROPERTIES
- LINK_FLAGS "/NODEFAULTLIB:LIBCMT"
- LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;LIBCMTD;MSVCRT\""
+ LINK_FLAGS "/NODEFAULTLIB:MSVCRT"
+ LINK_FLAGS_DEBUG "/NODEFAULTLIB:\"LIBCMT;MSVCRT\""
)
# The windows-updater doesn't link against anything non-system, apparently
-#ll_deploy_sharedlibs_command(windows-updater) \ No newline at end of file
+#ll_deploy_sharedlibs_command(windows-updater)
diff --git a/install.xml b/install.xml
index 0c3c88ce72..f69d781c67 100644
--- a/install.xml
+++ b/install.xml
@@ -111,16 +111,16 @@
<key>darwin</key>
<map>
<key>md5sum</key>
- <string>d9ce3ace9235249b7edf6f564de83395</string>
+ <string>cdb2f5c4a5a1f9ecd75bc1dbdd4db8e9</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.4.0-darwin-20080731b.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.7.1-darwin-20100606.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
- <string>946c2e106f14f7a1e521d4a14e0e146f</string>
+ <string>91694429e391efeea1de974df26032a2</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.4.0-linux-20081202.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.7.1-linux-20100527.tar.bz2</uri>
</map>
<key>linux64</key>
<map>
@@ -132,9 +132,9 @@
<key>windows</key>
<map>
<key>md5sum</key>
- <string>f5cf8d121b26f2e7944f7e63cdbff04d</string>
+ <string>4b84738eec2e21b0c096d53b79ee2681</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.6.0-windows-20091105.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.7.1-windows-20100611a.tar.bz2</uri>
</map>
</map>
</map>
@@ -193,16 +193,16 @@
<key>darwin</key>
<map>
<key>md5sum</key>
- <string>84821102cb819257a66c8f38732647fc</string>
+ <string>71defd179827bf172b76d6020023e0e8</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-darwin-20100119.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-darwin-20100222a.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
- <string>ee8e1b4bbcf137a84d6a85a1c51386ff</string>
+ <string>d58ac1a8396ac983b67cc3e3541457e3</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-linux-20100119.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-linux-20100222a.tar.bz2</uri>
</map>
<key>linux64</key>
<map>
@@ -214,9 +214,9 @@
<key>windows</key>
<map>
<key>md5sum</key>
- <string>acbf7a4165a917a4e087879d1756b355</string>
+ <string>94fd43f534e2055858d524086384907d</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-windows-20100119.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.39.0-windows-20100219.tar.bz2</uri>
</map>
</map>
</map>
@@ -233,16 +233,16 @@
<key>darwin</key>
<map>
<key>md5sum</key>
- <string>1bece4ebdc5fc3818854bc3df14b511b</string>
+ <string>752e295ccb17f0dcb7c0167db3ad1e69</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.16.4a-darwin-20090304.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.20.1-darwin-20100606.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
- <string>0f366e421ae9c72d9659bd20a2a326d6</string>
+ <string>a20e73f2e7d6a032ff25a5161b1b7394</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.16.4a-linux-20090303a.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.20.1-linux-20100527.tar.bz2</uri>
</map>
<key>linux64</key>
<map>
@@ -254,9 +254,9 @@
<key>windows</key>
<map>
<key>md5sum</key>
- <string>53e5ab7affff7121a5af2f82b4d58b54</string>
+ <string>b28856d3d02ee680353ae440561a6579</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.19.6-windows-20091016.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.20.1-windows-20100611.tar.bz2</uri>
</map>
</map>
</map>
@@ -436,9 +436,9 @@
<key>linux</key>
<map>
<key>md5sum</key>
- <string>978ad7c67fe4a2419bfc841e2956ff9f</string>
+ <string>9de3f44be65645c7f6af236139596942</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.3.9-linux-20090521c.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.3.9-linux-2010-02-19a-nommap.tar.bz2</uri>
</map>
<key>linux64</key>
<map>
@@ -583,6 +583,39 @@
</map>
</map>
</map>
+ <key>google_breakpad</key>
+ <map>
+ <key>copyright</key>
+ <string>Copyright (c) 2006, Google Inc.</string>
+ <key>description</key>
+ <string>An open-source multi-platform crash reporting system </string>
+ <key>license</key>
+ <string>bsd</string>
+ <key>packages</key>
+ <map>
+ <key>darwin</key>
+ <map>
+ <key>md5sum</key>
+ <string>ced4010b59f1a579caa7fe3c18512499</string>
+ <key>url</key>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_breakpad-0.0.0-rev599-darwin-20100528a.tar.bz2</uri>
+ </map>
+ <key>linux</key>
+ <map>
+ <key>md5sum</key>
+ <string>29c3e7dad60bbf02c811786436d99523</string>
+ <key>url</key>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google_breakpad-0.0.0-rev599-linux-20100521b.tar.bz2</uri>
+ </map>
+ <key>windows</key>
+ <map>
+ <key>md5sum</key>
+ <string>0859d47242990125f17eaab30bece2ff</string>
+ <key>url</key>
+ <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/google_breakpad-0.0.0-rev599-windows-20100524.tar.bz2</uri>
+ </map>
+ </map>
+ </map>
<key>googlemock</key>
<map>
<key>copyright</key>
@@ -948,23 +981,23 @@ anguage Infrstructure (CLI) international standard</string>
<key>darwin</key>
<map>
<key>md5sum</key>
- <string>d97d843704514ae1b5f153fab2931920</string>
+ <string>becffca6bd8dcb239de284ea2a8b485b</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-4.6-darwin-20100120.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-4.6+cookies-darwin-20100617.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
- <string>c4c40fca14a8bd32096f8a27c75c526f</string>
+ <string>414d72dd59e3d83c96f0e1531360792e</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-linux-20100105c.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llqtwebkit-linux-20100618.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
- <string>18c1a4059bad1504a457e70c8c218033</string>
+ <string>df1bdd683128e060d60e435f65d8f7e8</string>
<key>url</key>
- <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-windows-qt4.6-20100120.tar.bz2</uri>
+ <uri>http://viewer-source-downloads.s3.amazonaws.com/install_pkgs/llqtwebkit-windows-qt4.6-20100617.tar.bz2</uri>
</map>
</map>
</map>
@@ -1112,9 +1145,9 @@ anguage Infrstructure (CLI) international standard</string>
<key>darwin</key>
<map>
<key>md5sum</key>
- <string>a7b49e0f3eedbd5de117a3524c414b3a</string>
+ <string>11d2be4f2b172430747b7d4a6739e3d8</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.7c-darwin-20080812.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.8l-darwin-20100428.tar.bz2</uri>
</map>
<key>linux</key>
<map>
@@ -1266,6 +1299,25 @@ anguage Infrstructure (CLI) international standard</string>
</map>
</map>
</map>
+ <key>pulseaudio</key>
+ <map>
+ <key>copyright</key>
+ <string>Copyright 2004-2006 Lennart Poettering, Copyright 2006 Pierre Ossman (ossman@cendio.se) for Cendio AB</string>
+ <key>description</key>
+ <string>pulseaudio: headers only</string>
+ <key>license</key>
+ <string>lgpl</string>
+ <key>packages</key>
+ <map>
+ <key>linux</key>
+ <map>
+ <key>md5sum</key>
+ <string>30cb00069fe2a545fbf7be1070386236</string>
+ <key>url</key>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/linux-pulse-headers-0.9.14.tar.bz2</uri>
+ </map>
+ </map>
+ </map>
<key>quicktime</key>
<map>
<key>copyright</key>
@@ -1367,23 +1419,23 @@ anguage Infrstructure (CLI) international standard</string>
<key>darwin</key>
<map>
<key>md5sum</key>
- <string>51f3fa1ab39563505df83b48ba432a3c</string>
+ <string>aa144917d0e33453d3c2cc2c05c6c47c</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.7852-darwin-20100115.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.8821-darwin-20100529.tar.bz2</uri>
</map>
<key>linux</key>
<map>
<key>md5sum</key>
- <string>ab9573d6aa2acdd79a553c144c9ecb09</string>
+ <string>98f7945755f3ee8e52f685a3eff4d7be</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.7852-linux-20100115.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.8821-linux-20100529.tar.bz2</uri>
</map>
<key>windows</key>
<map>
<key>md5sum</key>
- <string>88ab785eebdc4f53a7dfc4e0b95f67ec</string>
+ <string>e8fdd46cb026c2ec72c4489eb3bf39c1</string>
<key>url</key>
- <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.7852-windows-20100115.tar.bz2</uri>
+ <uri>http://s3.amazonaws.com/viewer-source-downloads/install_pkgs/vivox-3.1.0001.8821-windows-20100529.tar.bz2</uri>
</map>
</map>
</map>
diff --git a/scripts/messages/message_template.msg b/scripts/messages/message_template.msg
index c50ae4ad80..d4f791c202 100644
--- a/scripts/messages/message_template.msg
+++ b/scripts/messages/message_template.msg
@@ -1383,6 +1383,10 @@ version 2.0
{ AgentID LLUUID }
{ KickedFromEstateID U32 }
}
+ {
+ AgentInfo Single
+ { AgentEffectiveMaturity U32 }
+ }
}
// DataHomeLocationReply data->sim